commit bash-20040107 snapshot
authorChet Ramey <chet.ramey@case.edu>
Sat, 3 Dec 2011 17:52:47 +0000 (12:52 -0500)
committerChet Ramey <chet.ramey@case.edu>
Sat, 3 Dec 2011 17:52:47 +0000 (12:52 -0500)
522 files changed:
-i [new file with mode: 0644]
ABOUT-NLS [new file with mode: 0644]
CHANGES
CWRU/-i [new file with mode: 0644]
CWRU/CWRU.chlog [new file with mode: 0644]
CWRU/OS-BUGS/att-yacc-bug [new file with mode: 0644]
CWRU/OS-BUGS/bsd-rshd-bug [new file with mode: 0644]
CWRU/OS-BUGS/bsd-tty-driver [new file with mode: 0644]
CWRU/OS-BUGS/hpux-ulimit-bug [new file with mode: 0644]
CWRU/OS-BUGS/isc-posix-bug [new file with mode: 0644]
CWRU/OS-BUGS/next-rlogind-bug [new file with mode: 0644]
CWRU/OS-BUGS/sco-3.2.4-bug [new file with mode: 0644]
CWRU/OS-BUGS/sequent-fcntl-dup2-bug [new file with mode: 0644]
CWRU/OS-BUGS/sun-yp-bug [new file with mode: 0644]
CWRU/OS-BUGS/ultrix-bugs [new file with mode: 0644]
CWRU/POSIX.NOTES.old [new file with mode: 0644]
CWRU/changelog [changed from file to symlink]
CWRU/history-syslog.1 [new file with mode: 0644]
CWRU/misc/copyright [new file with mode: 0644]
CWRU/misc/getwd.bsd44.c [new file with mode: 0644]
CWRU/misc/iptrt.c [new file with mode: 0644]
CWRU/misc/nofd0.c [new file with mode: 0644]
CWRU/misc/pcat.c [new file with mode: 0644]
CWRU/misc/pgrp.c [new file with mode: 0644]
CWRU/misc/pid.c [new file with mode: 0644]
CWRU/misc/stderr.c [new file with mode: 0644]
CWRU/misc/test-strtod.c [new file with mode: 0644]
CWRU/new/execute_cmd.c.lastpipe-first [new file with mode: 0644]
CWRU/old-changelogs/CHANGES.051093 [new file with mode: 0644]
CWRU/old-changelogs/CHANGES.071193 [new file with mode: 0644]
CWRU/old-changelogs/CHANGES.090393 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v10 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v11 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v12 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v2 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v3 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v4 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v5 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v6 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v7 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v8 [new file with mode: 0644]
CWRU/old-changelogs/CWRU.chlog.v9 [new file with mode: 0644]
CWRU/old-conf/Makefile [new file with mode: 0644]
CWRU/old-conf/Makefile.builtins [new file with mode: 0644]
CWRU/old-conf/Makefile.documentation [new file with mode: 0644]
CWRU/old-conf/Makefile.lib.glob [new file with mode: 0644]
CWRU/old-conf/Makefile.lib.malloc [new file with mode: 0644]
CWRU/old-conf/Makefile.lib.readline [new file with mode: 0644]
CWRU/old-conf/Makefile.lib.termcap [new file with mode: 0644]
CWRU/old-conf/Makefile.lib.tilde [new file with mode: 0644]
CWRU/old-conf/config.h [new file with mode: 0644]
CWRU/old-conf/config.h.mini [new file with mode: 0644]
CWRU/old-conf/configure [new file with mode: 0755]
CWRU/old-conf/cpp-Makefile [new file with mode: 0644]
CWRU/old-conf/machines.h [new file with mode: 0644]
CWRU/old-conf/support/cat-s [new file with mode: 0644]
CWRU/old-conf/support/cppmagic [new file with mode: 0755]
CWRU/old-conf/support/getcppsyms.c [new file with mode: 0644]
CWRU/old-conf/support/inpath [new file with mode: 0755]
CWRU/old-conf/support/mkmachtype [new file with mode: 0755]
CWRU/old-conf/support/mksysdefs [new file with mode: 0755]
CWRU/old-conf/support/srcdir [new file with mode: 0755]
CWRU/old/KSH.README [new file with mode: 0644]
CWRU/old/RELEASE.113 [new file with mode: 0644]
CWRU/old/RSH.README [new file with mode: 0644]
CWRU/old/array.doc [new file with mode: 0644]
CWRU/old/fixlib [new file with mode: 0755]
CWRU/old/histctl.def [new file with mode: 0644]
CWRU/old/longsig.c [new file with mode: 0644]
CWRU/old/mklinks [new file with mode: 0755]
CWRU/old/mktarfile [new file with mode: 0755]
CWRU/old/mkversion.c [new file with mode: 0644]
CWRU/old/pagesize.c [new file with mode: 0644]
CWRU/old/pagesize.sh [new file with mode: 0755]
CWRU/old/parse.y.noctlnul [new file with mode: 0644]
CWRU/old/read.def.stdio [new file with mode: 0644]
CWRU/old/set.def.save [new file with mode: 0644]
CWRU/old/subst.c.noctlnul [new file with mode: 0644]
CWRU/posix-parser/Makefile [new file with mode: 0644]
CWRU/posix-parser/aux.c [new file with mode: 0644]
CWRU/posix-parser/command.h [new file with mode: 0644]
CWRU/posix-parser/copy.c [new file with mode: 0644]
CWRU/posix-parser/endian.h [new file with mode: 0644]
CWRU/posix-parser/main.c [new file with mode: 0644]
CWRU/posix-parser/make.c [new file with mode: 0644]
CWRU/posix-parser/parse.y [new file with mode: 0644]
CWRU/posix-parser/shell.h [new file with mode: 0644]
CWRU/save/unwind_prot.c.sighandling [new file with mode: 0644]
CWRU/save/unwind_prot.h.save [new file with mode: 0644]
MANIFEST
MANIFEST.doc [new file with mode: 0644]
Makefile.in
NOTES
aclocal.m4
array.c
arrayfunc.c
bashhist.c
bashintl.h
bashline.c
braces.c
builtins/-i [new file with mode: 0644]
builtins/ChangeLog [new file with mode: 0644]
builtins/Makefile.in
builtins/bind.def
builtins/break.def
builtins/builtin.def
builtins/caller.def
builtins/cd.def
builtins/common.c
builtins/common.h
builtins/complete.def
builtins/declare.def
builtins/enable.def
builtins/evalfile.c
builtins/exec.def
builtins/exit.def
builtins/fc.def
builtins/fg_bg.def
builtins/getopt.c
builtins/hash.def
builtins/help.def
builtins/history.def
builtins/jobs.def
builtins/kill.def
builtins/let.def
builtins/mkbuiltins.c
builtins/printf.def
builtins/psize-posix.c [new file with mode: 0644]
builtins/pushd.def
builtins/read.def
builtins/return.def
builtins/set.def
builtins/setattr.def
builtins/shift.def
builtins/shopt.def
builtins/source.def
builtins/suspend.def
builtins/type.def
builtins/ulimit.def
builtins/umask.def
builtins/xkill.def [new file with mode: 0644]
config.h.in
configure
configure.in
configure.mk [new file with mode: 0644]
copy_cmd.c
cross-build/cygwin32.cache.old [new file with mode: 0644]
doc/-i [new file with mode: 0644]
doc/FAQ-2.05a [new file with mode: 0644]
doc/FAQ.orig [new file with mode: 0644]
doc/FAQ.save [new file with mode: 0644]
doc/Makefile [new symlink]
doc/Makefile.in
doc/article.pdf [new file with mode: 0644]
doc/article.ps [new file with mode: 0644]
doc/article.pt.ps [new file with mode: 0644]
doc/article.txt [new file with mode: 0644]
doc/bash.0 [new file with mode: 0644]
doc/bash.1
doc/bash.1.orig [new file with mode: 0644]
doc/bash.html [new file with mode: 0644]
doc/bash.info [new file with mode: 0644]
doc/bash.pdf [new file with mode: 0644]
doc/bash.ps [new file with mode: 0644]
doc/bashbug.0 [new file with mode: 0644]
doc/bashbug.ps [new file with mode: 0644]
doc/bashman.html [new symlink]
doc/bashref.aux [new file with mode: 0644]
doc/bashref.bt [new file with mode: 0644]
doc/bashref.bts [new file with mode: 0644]
doc/bashref.cp [new file with mode: 0644]
doc/bashref.cps [new file with mode: 0644]
doc/bashref.dvi [new file with mode: 0644]
doc/bashref.fn [new file with mode: 0644]
doc/bashref.fns [new file with mode: 0644]
doc/bashref.html [new file with mode: 0644]
doc/bashref.info
doc/bashref.ky [new file with mode: 0644]
doc/bashref.log [new file with mode: 0644]
doc/bashref.pdf [new file with mode: 0644]
doc/bashref.pg [new file with mode: 0644]
doc/bashref.ps [new file with mode: 0644]
doc/bashref.rw [new file with mode: 0644]
doc/bashref.rws [new file with mode: 0644]
doc/bashref.texi
doc/bashref.texi.orig [new file with mode: 0644]
doc/bashref.toc [new file with mode: 0644]
doc/bashref.tp [new file with mode: 0644]
doc/bashref.vr [new file with mode: 0644]
doc/bashref.vrs [new file with mode: 0644]
doc/builtins.0 [new file with mode: 0644]
doc/builtins.ps [new file with mode: 0644]
doc/faq.headers.mail [new file with mode: 0644]
doc/faq.headers.news [new file with mode: 0644]
doc/faq.headers.news2 [new file with mode: 0644]
doc/faq.mail [new file with mode: 0644]
doc/faq.news [new file with mode: 0644]
doc/faq.news2 [new file with mode: 0644]
doc/faq.version [new file with mode: 0644]
doc/mkfaqvers [new file with mode: 0755]
doc/mkinstall [new file with mode: 0755]
doc/mkposix [new file with mode: 0755]
doc/mkrbash [new file with mode: 0755]
doc/newbash.texi [new file with mode: 0644]
doc/old-faq.html [new file with mode: 0644]
doc/oldbash.texi [new file with mode: 0644]
doc/rbash.0 [new file with mode: 0644]
doc/rbash.ps [new file with mode: 0644]
doc/rose94.pdf [new file with mode: 0644]
doc/rose94.ps [new file with mode: 0644]
doc/texinfo.tex [changed from file to symlink]
doc/texinfo.tex.20030205 [new file with mode: 0644]
doc/version.texi
error.c
eval.c
examples/bashdb/bashdb.vaughan [new file with mode: 0644]
examples/complete/complete-tests [new file with mode: 0644]
examples/functions/sqroot [new file with mode: 0644]
examples/loadables/TODO [new file with mode: 0644]
examples/loadables/bsdos.glue.c [new file with mode: 0644]
examples/loadables/finfo.c
examples/loadables/perl/Makefile [new symlink]
examples/loadables/pushd.def [new file with mode: 0644]
examples/loadables/pushd.inc [new file with mode: 0644]
examples/loadables/sprintf.c [new file with mode: 0644]
examples/loadables/xtitle.c [new file with mode: 0644]
examples/obashdb/bashdb.x [new file with mode: 0644]
examples/scripts/adventure.sh.save1 [new file with mode: 0755]
execute_cmd.c
expr.c
externs.h
general.c
general.h
include/gettext.h [new file with mode: 0644]
include/memalloc.h.save [new file with mode: 0644]
include/shmbutil.h
input.c
jobs.c
lib/doc-support/Makefile.in [new file with mode: 0644]
lib/doc-support/getopt.c [new file with mode: 0644]
lib/doc-support/getopt.h [new file with mode: 0644]
lib/doc-support/getopt1.c [new file with mode: 0644]
lib/doc-support/texindex.c [new file with mode: 0644]
lib/glob/ChangeLog [new file with mode: 0644]
lib/intl/ChangeLog [new file with mode: 0644]
lib/intl/Makefile.in [new file with mode: 0644]
lib/intl/VERSION [new file with mode: 0644]
lib/intl/bindtextdom.c [new file with mode: 0644]
lib/intl/config.charset [new file with mode: 0755]
lib/intl/dcgettext.c [new file with mode: 0644]
lib/intl/dcigettext.c [new file with mode: 0644]
lib/intl/dcngettext.c [new file with mode: 0644]
lib/intl/dgettext.c [new file with mode: 0644]
lib/intl/dngettext.c [new file with mode: 0644]
lib/intl/eval-plural.h [new file with mode: 0644]
lib/intl/explodename.c [new file with mode: 0644]
lib/intl/finddomain.c [new file with mode: 0644]
lib/intl/gettext.c [new file with mode: 0644]
lib/intl/gettextP.h [new file with mode: 0644]
lib/intl/gmo.h [new file with mode: 0644]
lib/intl/hash-string.h [new file with mode: 0644]
lib/intl/intl-compat.c [new file with mode: 0644]
lib/intl/l10nflist.c [new file with mode: 0644]
lib/intl/libgnuintl.h.in [new file with mode: 0644]
lib/intl/loadinfo.h [new file with mode: 0644]
lib/intl/loadmsgcat.c [new file with mode: 0644]
lib/intl/localcharset.c [new file with mode: 0644]
lib/intl/localcharset.h [new file with mode: 0644]
lib/intl/locale.alias [new file with mode: 0644]
lib/intl/localealias.c [new file with mode: 0644]
lib/intl/localename.c [new file with mode: 0644]
lib/intl/log.c [new file with mode: 0644]
lib/intl/ngettext.c [new file with mode: 0644]
lib/intl/os2compat.c [new file with mode: 0644]
lib/intl/os2compat.h [new file with mode: 0644]
lib/intl/osdep.c [new file with mode: 0644]
lib/intl/plural-exp.c [new file with mode: 0644]
lib/intl/plural-exp.h [new file with mode: 0644]
lib/intl/plural.c [new file with mode: 0644]
lib/intl/plural.y [new file with mode: 0644]
lib/intl/ref-add.sin [new file with mode: 0644]
lib/intl/ref-del.sin [new file with mode: 0644]
lib/intl/relocatable.c [new file with mode: 0644]
lib/intl/relocatable.h [new file with mode: 0644]
lib/intl/textdomain.c [new file with mode: 0644]
lib/malloc/Makefile.in
lib/malloc/OLD/gmalloc.c [new file with mode: 0644]
lib/malloc/OLD/ogmalloc.c [new file with mode: 0644]
lib/malloc/OLD/old-nmalloc.c [new file with mode: 0644]
lib/malloc/OLD/omalloc.c [new file with mode: 0644]
lib/malloc/getpagesize.h
lib/malloc/imalloc.h
lib/malloc/malloc.c
lib/malloc/malloc.c.bad [new file with mode: 0644]
lib/malloc/malloc.c.save [new file with mode: 0644]
lib/malloc/memtest.c [new file with mode: 0644]
lib/malloc/mstats.h
lib/malloc/shmalloc.h
lib/malloc/stats.c
lib/malloc/stub.c
lib/malloc/table.c
lib/malloc/table.h
lib/malloc/trace.c
lib/malloc/watch.c
lib/malloc/watch.h
lib/malloc/xmalloc.c
lib/posixheaders.old/ansi_stdlib.h [new file with mode: 0644]
lib/posixheaders.old/filecntl.h [new file with mode: 0644]
lib/posixheaders.old/memalloc.h [new file with mode: 0644]
lib/posixheaders.old/posixdir.h [new file with mode: 0644]
lib/posixheaders.old/posixjmp.h [new file with mode: 0644]
lib/posixheaders.old/posixstat.h [new file with mode: 0644]
lib/posixheaders.old/stdc.h [new file with mode: 0644]
lib/readline/-i [new file with mode: 0644]
lib/readline/Makefile.in
lib/readline/NEW/xxx-autocomplete [new file with mode: 0644]
lib/readline/ansi_stdlib.h [changed from file to symlink]
lib/readline/complete.c
lib/readline/display.c
lib/readline/doc/Makefile.in [new file with mode: 0644]
lib/readline/doc/Makefile.old [new file with mode: 0644]
lib/readline/doc/fdl.texi [changed from file to symlink]
lib/readline/doc/history.3 [new file with mode: 0644]
lib/readline/doc/history.aux [new file with mode: 0644]
lib/readline/doc/history.bt [new file with mode: 0644]
lib/readline/doc/history.cp [new file with mode: 0644]
lib/readline/doc/history.cps [new file with mode: 0644]
lib/readline/doc/history.dvi [new file with mode: 0644]
lib/readline/doc/history.fn [new file with mode: 0644]
lib/readline/doc/history.html [new file with mode: 0644]
lib/readline/doc/history.info [new file with mode: 0644]
lib/readline/doc/history.ky [new file with mode: 0644]
lib/readline/doc/history.log [new file with mode: 0644]
lib/readline/doc/history.pg [new file with mode: 0644]
lib/readline/doc/history.ps [new file with mode: 0644]
lib/readline/doc/history.toc [new file with mode: 0644]
lib/readline/doc/history.tp [new file with mode: 0644]
lib/readline/doc/history.vr [new file with mode: 0644]
lib/readline/doc/history.vrs [new file with mode: 0644]
lib/readline/doc/readline.3 [new file with mode: 0644]
lib/readline/doc/readline.dvi [new file with mode: 0644]
lib/readline/doc/readline.html [new file with mode: 0644]
lib/readline/doc/readline.info [new file with mode: 0644]
lib/readline/doc/readline.ps [new file with mode: 0644]
lib/readline/doc/rlman.aux [new file with mode: 0644]
lib/readline/doc/rlman.bt [new file with mode: 0644]
lib/readline/doc/rlman.cp [new file with mode: 0644]
lib/readline/doc/rlman.cps [new file with mode: 0644]
lib/readline/doc/rlman.fn [new file with mode: 0644]
lib/readline/doc/rlman.fns [new file with mode: 0644]
lib/readline/doc/rlman.ky [new file with mode: 0644]
lib/readline/doc/rlman.log [new file with mode: 0644]
lib/readline/doc/rlman.pg [new file with mode: 0644]
lib/readline/doc/rlman.toc [new file with mode: 0644]
lib/readline/doc/rlman.tp [new file with mode: 0644]
lib/readline/doc/rlman.vr [new file with mode: 0644]
lib/readline/doc/rltech.texi
lib/readline/doc/rluserman.aux [new file with mode: 0644]
lib/readline/doc/rluserman.bt [new file with mode: 0644]
lib/readline/doc/rluserman.cp [new file with mode: 0644]
lib/readline/doc/rluserman.cps [new file with mode: 0644]
lib/readline/doc/rluserman.dvi [new file with mode: 0644]
lib/readline/doc/rluserman.fn [new file with mode: 0644]
lib/readline/doc/rluserman.fns [new file with mode: 0644]
lib/readline/doc/rluserman.html [new file with mode: 0644]
lib/readline/doc/rluserman.info [new file with mode: 0644]
lib/readline/doc/rluserman.ky [new file with mode: 0644]
lib/readline/doc/rluserman.log [new file with mode: 0644]
lib/readline/doc/rluserman.pg [new file with mode: 0644]
lib/readline/doc/rluserman.ps [new file with mode: 0644]
lib/readline/doc/rluserman.toc [new file with mode: 0644]
lib/readline/doc/rluserman.tp [new file with mode: 0644]
lib/readline/doc/rluserman.vr [new file with mode: 0644]
lib/readline/doc/rluserman.vrs [new file with mode: 0644]
lib/readline/doc/texi2dvi [new symlink]
lib/readline/doc/texi2html [new symlink]
lib/readline/doc/texinfo.tex [new symlink]
lib/readline/doc/version.texi
lib/readline/histexpand.c
lib/readline/posixdir.h [changed from file to symlink]
lib/readline/posixjmp.h [changed from file to symlink]
lib/readline/posixstat.h [changed from file to symlink]
lib/readline/readline.h
lib/readline/savestring.c
lib/readline/shell.c
lib/readline/tilde.c [changed from file to symlink]
lib/readline/tilde.h [changed from file to symlink]
lib/readline/vi_mode.c
lib/readline/vi_mode.c.save [new file with mode: 0644]
lib/sh/Makefile.in
lib/sh/fmtulong.c
lib/sh/getenv.c
lib/sh/netopen.c
lib/sh/pathcanon.c
lib/sh/pathphys.c
lib/sh/shmatch.c
lib/sh/strtrans.c
lib/termcap/grot/termcap.src [new file with mode: 0644]
lib/tilde/ChangeLog [new file with mode: 0644]
locale.c
mailcheck.c
make_cmd.c
nojobs.c
parse.y
pcomplete.c
pcomplib.c
po/LINGUAS [new file with mode: 0644]
po/Makefile.in.in [new file with mode: 0644]
po/Makevars [new file with mode: 0644]
po/Makevars.template [new file with mode: 0644]
po/POTFILES.in [new file with mode: 0644]
po/README [new file with mode: 0644]
po/Rules-builtins [new file with mode: 0644]
po/Rules-quot [new file with mode: 0644]
po/bash.po.orig [new file with mode: 0644]
po/bash.pot [new file with mode: 0644]
po/boldquot.sed [new file with mode: 0644]
po/builtins.pot [new file with mode: 0644]
po/en@boldquot.gmo [new file with mode: 0644]
po/en@boldquot.header [new file with mode: 0644]
po/en@boldquot.po [new file with mode: 0644]
po/en@quot.gmo [new file with mode: 0644]
po/en@quot.header [new file with mode: 0644]
po/en@quot.po [new file with mode: 0644]
po/insert-header.sin [new file with mode: 0644]
po/quot.sed [new file with mode: 0644]
po/readline.po [new file with mode: 0644]
po/remove-potcdate.sin [new file with mode: 0644]
po/xx [new file with mode: 0644]
po/xx1 [new file with mode: 0644]
po/xx1a [new file with mode: 0644]
po/xx2 [new file with mode: 0644]
print_cmd.c
redir.c
shell.c
sig.c
subst.c
support/bash.icon.ps [new file with mode: 0644]
support/bash.install [new file with mode: 0644]
support/bash.xv [new file with mode: 0644]
support/config.rpath [new file with mode: 0755]
support/deblank.sh [new file with mode: 0644]
support/endian.c [new file with mode: 0644]
support/mail-shell [new file with mode: 0755]
support/memtest.c [new file with mode: 0644]
support/mk-takehome [new file with mode: 0755]
support/mkconffiles [changed mode: 0755->0644]
support/mkdep [new file with mode: 0755]
support/mkdist [new file with mode: 0755]
support/mkdocdist [new file with mode: 0755]
support/mkinstalldirs [new file with mode: 0755]
support/mknewvers.sh [new file with mode: 0644]
support/mksnap [new file with mode: 0755]
support/mkversion.sh [changed mode: 0755->0644]
support/rlvers.sh [changed mode: 0755->0644]
support/shobj-conf
support/texi2dvi-0.43 [new file with mode: 0755]
support/texi2dvi-0.46 [new file with mode: 0755]
support/texi2dvi-1.14 [new file with mode: 0755]
support/texi2html-1.64 [new file with mode: 0755]
test.c
tests/-i [new file with mode: 0644]
tests/RUN-ONE-TEST [new file with mode: 0755]
tests/RUN-TEST-SCRIPT [new file with mode: 0755]
tests/arith.right
tests/array.right
tests/array.tests
tests/cprint.right.save1 [new file with mode: 0644]
tests/cracauer-testsuite/DOC [new file with mode: 0644]
tests/cracauer-testsuite/Makefile [new file with mode: 0644]
tests/cracauer-testsuite/OBSERVATIONS [new file with mode: 0644]
tests/cracauer-testsuite/QUESTIONS [new file with mode: 0644]
tests/cracauer-testsuite/catcher.c [new file with mode: 0644]
tests/cracauer-testsuite/lib.csh [new file with mode: 0644]
tests/cracauer-testsuite/lib.sh [new file with mode: 0644]
tests/cracauer-testsuite/test01.csh [new file with mode: 0644]
tests/cracauer-testsuite/test01.sh [new file with mode: 0644]
tests/cracauer-testsuite/test02.csh [new file with mode: 0644]
tests/cracauer-testsuite/test02.sh [new file with mode: 0644]
tests/cracauer-testsuite/test03.sh [new file with mode: 0644]
tests/cracauer-testsuite/test04.sh [new file with mode: 0644]
tests/cracauer-testsuite/test05.sh [new file with mode: 0644]
tests/cracauer-testsuite/test06.sh [new file with mode: 0644]
tests/cracauer-testsuite/test07.csh [new file with mode: 0644]
tests/cracauer-testsuite/test07.sh [new file with mode: 0644]
tests/cracauer-testsuite/test08.sh [new file with mode: 0644]
tests/cracauer-testsuite/test09.sh [new file with mode: 0644]
tests/cracauer-testsuite/test10.sh [new file with mode: 0644]
tests/cracauer-testsuite/test11.sh [new file with mode: 0644]
tests/cracauer-testsuite/test12.sh [new file with mode: 0644]
tests/cracauer-testsuite/test13.sh [new file with mode: 0644]
tests/history.tests.save [new file with mode: 0644]
tests/jobs.right
tests/misc/input-line-2.sh [new file with mode: 0644]
tests/misc/minus-e [new file with mode: 0644]
tests/misc/minus-e.right [new file with mode: 0644]
tests/misc/read-nchars-int.tests [new file with mode: 0644]
tests/misc/regress/README [new file with mode: 0644]
tests/misc/regress/geoff.post [new file with mode: 0644]
tests/misc/regress/getdate.mk [new file with mode: 0644]
tests/misc/regress/getdate.y [new file with mode: 0644]
tests/misc/regress/log.orig [new file with mode: 0644]
tests/misc/regress/shx [new file with mode: 0644]
tests/misc/regress/shx.orig [new file with mode: 0644]
tests/misc/regress/shx1 [new file with mode: 0644]
tests/misc/regress/shx2 [new file with mode: 0644]
tests/misc/regress/shx3 [new file with mode: 0644]
tests/misc/regress/shx4 [new file with mode: 0644]
tests/misc/regress/shx5 [new file with mode: 0644]
tests/misc/regress/shx7 [new file with mode: 0644]
tests/misc/regress/shx8 [new file with mode: 0644]
tests/misc/run-input-test-2 [new file with mode: 0644]
tests/misc/run-minus-e [new file with mode: 0644]
tests/misc/test.patmatch [new file with mode: 0644]
tests/printf.right
tests/printf.tests
tests/run-gprof [new file with mode: 0644]
tests/time.tests [new file with mode: 0644]
trap.c
variables.c
version.c
xmalloc.c

diff --git a/-i b/-i
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644 (file)
index 0000000..47d5e39
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,625 @@
+Notes on the Free Translation Project
+*************************************
+
+   Free software is going international!  The Free Translation Project
+is a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+   If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site.  But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+   Installers will find here some useful hints.  These notes also
+explain how users should proceed for getting the programs to use the
+available translations.  They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+   When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used.  The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+Quick configuration advice
+==========================
+
+   If you want to exploit the full power of internationalization, you
+should configure it using
+
+     ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed.  So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias, message inheritance, automatic
+charset conversion or plural form handling) as the implementation here.
+It is also not possible to offer this additional functionality on top
+of a `catgets' implementation.  Future versions of GNU `gettext' will
+very likely convey even more functionality.  So it might be a good idea
+to change to GNU `gettext' as soon as possible.
+
+   So you need _not_ provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+   Some packages are "localizable" when properly installed; the
+programs they contain can be made to speak your own native language.
+Most such packages use GNU `gettext'.  Other packages have their own
+ways to internationalization, predating GNU `gettext'.
+
+   By default, this package will be installed to allow translation of
+messages.  It will automatically detect whether the system already
+provides the GNU `gettext' functions.  If not, the GNU `gettext' own
+library will be used.  This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is _not_ required.  Installers may use
+special options at configuration time for changing the default
+behaviour.  The commands:
+
+     ./configure --with-included-gettext
+     ./configure --disable-nls
+
+will respectively bypass any pre-existing `gettext' to use the
+internationalizing routines provided within this package, or else,
+_totally_ disable translation of messages.
+
+   When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this.  This might be not what is desirable.  You
+should use the more recent version of the GNU `gettext' library.  I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+     ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+   The configuration process will not test for the `catgets' function
+and therefore it will not be used.  The reason is that even an
+emulation of `gettext' on top of `catgets' could not provide all the
+extensions of the GNU `gettext' library.
+
+   Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language.  Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package.  However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+   As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination.  Here `LL' is an ISO 639 two-letter language code,
+and `CC' is an ISO 3166 two-letter country code.  For example, let's
+suppose that you speak German and live in Germany.  At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+   You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries.  For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil.  The
+country code serves to distinguish the dialects.
+
+   The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc.  On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'.  You can get the list of
+locales supported by your system for your country by running the command
+`locale -a | grep '^LL''.
+
+   Not all programs have translations for all languages.  By default, an
+English message is shown in place of a nonexistent translation.  If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'.  GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries.  For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+   In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect.  For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+Translating Teams
+=================
+
+   For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list.  The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
+area.
+
+   If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended.  For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+     subscribe
+
+   Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around.  If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+   The English team is special.  It works at improving and uniformizing
+the terminology in use.  Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+   Languages are not equally supported in all packages.  The following
+matrix shows the current state of internationalization, as of May 2003.
+The matrix shows, in regard of each package, for which languages PO
+files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+     Ready PO files       am az be bg ca cs da de el en en_GB eo es
+                        +-------------------------------------------+
+     a2ps               |       []          [] [] []                |
+     aegis              |                      ()                   |
+     anubis             |                                           |
+     ap-utils           |                                           |
+     bash               |                      []             [] [] |
+     batchelor          |                                           |
+     bfd                |                   []                   [] |
+     binutils           |                   []                   [] |
+     bison              |                   [] []                [] |
+     bluez-pin          |                []                   []    |
+     clisp              |                                           |
+     clisp              |                      []    []          [] |
+     coreutils          |             []    [] []                [] |
+     cpio               |                   [] []                [] |
+     darkstat           |                   ()                   [] |
+     diffutils          |             [] [] [] [] []          [] [] |
+     e2fsprogs          |                []    []                   |
+     enscript           |             []    [] []        []         |
+     error              |             []    [] []        []      [] |
+     fetchmail          |             [] () [] [] []             [] |
+     fileutils          |                   [] []                [] |
+     findutils          |             []    [] [] []          [] [] |
+     flex               |             []    [] []                [] |
+     gas                |                                        [] |
+     gawk               |             []    [] []                [] |
+     gcal               |             []                            |
+     gcc                |                   []                   [] |
+     gettext            |       []    []    [] []                [] |
+     gettext-runtime    |       []    []    [] []                [] |
+     gettext-tools      |                      []                [] |
+     gimp-print         |                [] [] []        []      [] |
+     gliv               |                                           |
+     glunarclock        |    []             [] []                   |
+     gnucash            |                      ()        []         |
+     gnucash-glossary   |                   [] ()                [] |
+     gnupg              |             [] ()    [] []          [] [] |
+     gpe-calendar       |                      []                   |
+     gpe-conf           |                      []                   |
+     gpe-contacts       |                      []                   |
+     gpe-edit           |                                           |
+     gpe-login          |                      []                   |
+     gpe-ownerinfo      |                      []                   |
+     gpe-sketchbook     |                      []                   |
+     gpe-timesheet      |                                           |
+     gpe-today          |                      []                   |
+     gpe-todo           |                      []                   |
+     gphoto2            |                [] [] []                [] |
+     gprof              |                   []                   [] |
+     gpsdrive           |                      ()    ()          () |
+     grep               |          [] []       [] []             [] |
+     gretl              |                                        [] |
+     hello              |             []    [] [] []          [] [] |
+     id-utils           |                   [] []                   |
+     indent             |             []       []             [] [] |
+     jpilot             |                [] [] []                [] |
+     jwhois             |                                        [] |
+     kbd                |                [] [] [] []             [] |
+     ld                 |                   []                   [] |
+     libc               |             [] [] [] [] []             [] |
+     libgpewidget       |                      []                   |
+     libiconv           |             []    [] []             [] [] |
+     lifelines          |                   [] ()                   |
+     lilypond           |                   []                      |
+     lingoteach         |                                           |
+     lingoteach_lessons |                      ()                () |
+     lynx               |             [] [] [] []                   |
+     m4                 |                [] [] [] []                |
+     mailutils          |             []                         [] |
+     make               |                   [] []                [] |
+     man-db             |             [] () [] []                () |
+     mysecretdiary      |                   [] []                [] |
+     nano               |             [] () [] []                [] |
+     nano_1_0           |             [] () [] []                [] |
+     opcodes            |                   []                   [] |
+     parted             |             [] [] [] []                [] |
+     ptx                |             []    [] []             [] [] |
+     python             |                                           |
+     radius             |                                           |
+     recode             |       []          [] [] []          [] [] |
+     screem             |                                           |
+     sed                |             []    [] []             [] [] |
+     sh-utils           |                   [] []                [] |
+     sharutils          |             [] [] [] [] []             [] |
+     sketch             |                   [] ()                [] |
+     soundtracker       |                   [] []                [] |
+     sp                 |                      []                   |
+     tar                |                [] [] []                [] |
+     texinfo            |                [] [] []             []    |
+     textutils          |             []    [] []                [] |
+     tin                |                      ()        ()         |
+     util-linux         |             [] [] [] []                [] |
+     vorbis-tools       |                [] []                   [] |
+     wastesedge         |                      ()                   |
+     wdiff              |             []    [] []                [] |
+     wget               |          [] [] [] [] [] []             [] |
+     xchat              |             []          []             [] |
+     xpad               |                                           |
+                        +-------------------------------------------+
+                          am az be bg ca cs da de el en en_GB eo es
+                           0  1  4  2 31 17 54 60 14  1   4   12 56
+     
+                          et fa fi fr ga gl he hr hu id it ja ko
+                        +----------------------------------------+
+     a2ps               | []    [] []                   ()    () |
+     aegis              |                                        |
+     anubis             |          []                            |
+     ap-utils           |          []                            |
+     bash               |          []             []             |
+     batchelor          |             []                         |
+     bfd                |          []                      []    |
+     binutils           |          []                      []    |
+     bison              | []       []                [] []       |
+     bluez-pin          |          [] []          [] []          |
+     clisp              |                                        |
+     clisp              |          []                            |
+     coreutils          | []       []                   [] []    |
+     cpio               |          []    []       []          [] |
+     darkstat           |          () []          [] []          |
+     diffutils          |       [] []    [] []    [] []    []    |
+     e2fsprogs          |                                        |
+     enscript           |          []          []                |
+     error              |       [] [] []          []             |
+     fetchmail          |                                  []    |
+     fileutils          | []       []             []    [] []    |
+     findutils          | []    [] [] [] []    [] [] [] [] [] [] |
+     flex               |          []                         [] |
+     gas                |          []                            |
+     gawk               |          []       []                   |
+     gcal               |          []                            |
+     gcc                |          []                            |
+     gettext            |          []                      [] [] |
+     gettext-runtime    |          []                []    [] [] |
+     gettext-tools      |                                  []    |
+     gimp-print         |          []                      []    |
+     gliv               |          ()                            |
+     glunarclock        |             [] []       []       []    |
+     gnucash            |                               []       |
+     gnucash-glossary   |                               []       |
+     gnupg              | []    [] []    []          [] [] []    |
+     gpe-calendar       |                            []          |
+     gpe-conf           |                                        |
+     gpe-contacts       |          []                            |
+     gpe-edit           |          []                []          |
+     gpe-login          |          []                            |
+     gpe-ownerinfo      |          []             [] []          |
+     gpe-sketchbook     |          []                            |
+     gpe-timesheet      |          [] []             []          |
+     gpe-today          |          [] []                         |
+     gpe-todo           |          []                []          |
+     gphoto2            |          []             []       []    |
+     gprof              |          []                []          |
+     gpsdrive           |          ()             []    () ()    |
+     grep               | []    [] [] [] [] [] [] [] [] [] []    |
+     gretl              |          []                            |
+     hello              | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+     id-utils           |          []             [] []          |
+     indent             | []    [] []    []       [] [] [] []    |
+     jpilot             |          []                      ()    |
+     jwhois             |          []             [] [] []       |
+     kbd                |          []                            |
+     ld                 |          []                            |
+     libc               |       [] []    []       []       [] [] |
+     libgpewidget       |          [] []             []          |
+     libiconv           |       [] [] [] []    [] [] [] []       |
+     lifelines          |          ()                            |
+     lilypond           |          []                            |
+     lingoteach         |          []                []          |
+     lingoteach_lessons |                                        |
+     lynx               | []                      []    [] []    |
+     m4                 |          []    []          []    []    |
+     mailutils          |                                        |
+     make               |          []    [] [] []          [] [] |
+     man-db             |          []                   () ()    |
+     mysecretdiary      |          []                []          |
+     nano               |          []    []          [] []       |
+     nano_1_0           |          []    []          [] []       |
+     opcodes            |          []                []          |
+     parted             |          []    []                []    |
+     ptx                | []    [] [] [] []       [] []          |
+     python             |                                        |
+     radius             |                                        |
+     recode             |          []    [] []    [] [] []       |
+     screem             |                                        |
+     sed                | []       [] [] []       [] [] [] []    |
+     sh-utils           | []    [] []             []    [] []    |
+     sharutils          | []       []    []       []       []    |
+     sketch             |          []                            |
+     soundtracker       |          []    []    []                |
+     sp                 |          []                      ()    |
+     tar                | []    [] []    []    [] [] [] [] []    |
+     texinfo            |          []       [] []          []    |
+     textutils          |          []    []       []       [] [] |
+     tin                | []       ()                            |
+     util-linux         | []    [] []             []    () []    |
+     vorbis-tools       |          []                            |
+     wastesedge         |          ()                            |
+     wdiff              | []       []    []       [] []          |
+     wget               | []    [] []    [] [] [] []       []    |
+     xchat              | []       []                      []    |
+     xpad               |                                        |
+                        +----------------------------------------+
+                          et fa fi fr ga gl he hr hu id it ja ko
+                          20  1 15 73 14 24  8 10 30 31 19 31  9
+     
+                          lg lt lv ms nb nl nn no pl pt pt_BR ro
+                        +----------------------------------------+
+     a2ps               |          []    []    () () ()  []   [] |
+     aegis              |                ()                      |
+     anubis             |          []                         [] |
+     ap-utils           |                         ()             |
+     bash               |                                []      |
+     batchelor          |                                        |
+     bfd                |                                        |
+     binutils           |                                        |
+     bison              |          []    []              []   [] |
+     bluez-pin          |                                     [] |
+     clisp              |                                        |
+     clisp              |                []                      |
+     coreutils          |                         []             |
+     cpio               |                []       []     []      |
+     darkstat           |          []    []              []   [] |
+     diffutils          |          []             []     []      |
+     e2fsprogs          |                                        |
+     enscript           |                []              []      |
+     error              |                []              []      |
+     fetchmail          |                         ()     ()      |
+     fileutils          |                         []             |
+     findutils          |                []       []     []   [] |
+     flex               |                                []      |
+     gas                |                                        |
+     gawk               |                                []      |
+     gcal               |                                        |
+     gcc                |                                        |
+     gettext            |                         []             |
+     gettext-runtime    |                         []             |
+     gettext-tools      |                                        |
+     gimp-print         |                []                      |
+     gliv               |                                []      |
+     glunarclock        |          []                            |
+     gnucash            |                                        |
+     gnucash-glossary   |                []          []          |
+     gnupg              |                                        |
+     gpe-calendar       |                            []       [] |
+     gpe-conf           |                            []       [] |
+     gpe-contacts       |                            []          |
+     gpe-edit           |                            []       [] |
+     gpe-login          |                            []       [] |
+     gpe-ownerinfo      |                            []       [] |
+     gpe-sketchbook     |                            []       [] |
+     gpe-timesheet      |                            []       [] |
+     gpe-today          |                            []       [] |
+     gpe-todo           |                            []       [] |
+     gphoto2            |                                        |
+     gprof              |                                []      |
+     gpsdrive           |                ()    ()        ()      |
+     grep               |                         [] []  []   [] |
+     gretl              |                                        |
+     hello              |       [] [] [] [] [] [] []     []   [] |
+     id-utils           |                []              []   [] |
+     indent             |                []              []   [] |
+     jpilot             |                ()    ()                |
+     jwhois             |                []              []   [] |
+     kbd                |                                        |
+     ld                 |                                        |
+     libc               |             []       [] []     []      |
+     libgpewidget       |                            []       [] |
+     libiconv           |                                []   [] |
+     lifelines          |                                        |
+     lilypond           |                []                      |
+     lingoteach         |                                        |
+     lingoteach_lessons |                                        |
+     lynx               |                []              []      |
+     m4                 |                []       []     []   [] |
+     mailutils          |                                        |
+     make               |                []              []      |
+     man-db             |                                []      |
+     mysecretdiary      |                                []      |
+     nano               |          []    []       []          [] |
+     nano_1_0           |          [] []    []    []             |
+     opcodes            |                []              []   [] |
+     parted             |                   []       []  []      |
+     ptx                |             [] []    [] [] []  []   [] |
+     python             |                                        |
+     radius             |                                        |
+     recode             |                         []     []   [] |
+     screem             |                                        |
+     sed                |                                []   [] |
+     sh-utils           |             []                         |
+     sharutils          |                []                      |
+     sketch             |                                []      |
+     soundtracker       |                                        |
+     sp                 |                                        |
+     tar                |          [] []       [] []     []   [] |
+     texinfo            |                                     [] |
+     textutils          |             []                         |
+     tin                |                                        |
+     util-linux         |                []              []      |
+     vorbis-tools       |                []                   [] |
+     wastesedge         |                                        |
+     wdiff              |          []             []     []   [] |
+     wget               |                []       []          [] |
+     xchat              |       []       []                      |
+     xpad               |                                     [] |
+                        +----------------------------------------+
+                          lg lt lv ms nb nl nn no pl pt pt_BR ro
+                           0  0  2 11  7 26  3  4 18 15  34   34
+     
+                          ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW
+                        +-------------------------------------------+
+     a2ps               | []    []    []    [] []                   | 16
+     aegis              | ()                                        |  0
+     anubis             |                   [] []                   |  5
+     ap-utils           |                      ()                   |  1
+     bash               | []                                        |  7
+     batchelor          |                                           |  1
+     bfd                |             []    []           []         |  7
+     binutils           |             []    []           []         |  7
+     bison              | []          []                            | 13
+     bluez-pin          |                                           |  7
+     clisp              |                                           |  0
+     clisp              |                                           |  5
+     coreutils          | []    []    []    []                 []   | 14
+     cpio               | []          []                 []         | 13
+     darkstat           |             []                 ()    ()   |  9
+     diffutils          | []          []    []                 []   | 21
+     e2fsprogs          |                   []                      |  3
+     enscript           | []          []    []                      | 11
+     error              |    []             []                 []   | 14
+     fetchmail          |                   []                      |  7
+     fileutils          | []    []    []    []           []    []   | 15
+     findutils          | [] [] []    []    []           []         | 27
+     flex               | []          []    []                      | 10
+     gas                |                   []                      |  3
+     gawk               |             []    []                      |  9
+     gcal               |             []    []                      |  4
+     gcc                |                   []                      |  4
+     gettext            | [] [] []    []    []                 []   | 15
+     gettext-runtime    | [] [] []    []    []                 []   | 16
+     gettext-tools      |    [] []                                  |  5
+     gimp-print         |    []       []                            | 10
+     gliv               |                                           |  1
+     glunarclock        | []          []             []             | 11
+     gnucash            |    []                                []   |  4
+     gnucash-glossary   |    []       []                       []   |  8
+     gnupg              |    []       []    []                 []   | 16
+     gpe-calendar       |                                      []   |  5
+     gpe-conf           |                                           |  3
+     gpe-contacts       |                                      []   |  4
+     gpe-edit           |                                      []   |  5
+     gpe-login          |                                      []   |  5
+     gpe-ownerinfo      |                                      []   |  7
+     gpe-sketchbook     |                                      []   |  5
+     gpe-timesheet      |                                      []   |  6
+     gpe-today          |                                      []   |  6
+     gpe-todo           |                                      []   |  6
+     gphoto2            |             []                 []         |  9
+     gprof              |             []    []                      |  7
+     gpsdrive           |    []       []                            |  3
+     grep               | []    []          [] []                   | 24
+     gretl              |                                           |  2
+     hello              | [] []       []    [] []                   | 33
+     id-utils           | []          []    []                      | 11
+     indent             | [] []       []    []                      | 19
+     jpilot             |             []    []    []     []    []   | 10
+     jwhois             | ()          ()    []                 []   | 10
+     kbd                |             []    []                      |  8
+     ld                 |             []    []                      |  5
+     libc               |    []       []    []           []         | 20
+     libgpewidget       |                                           |  6
+     libiconv           | [] [] []    []    [] []                   | 21
+     lifelines          |             []                            |  2
+     lilypond           |             []                            |  4
+     lingoteach         |                                           |  2
+     lingoteach_lessons |                                ()         |  0
+     lynx               | []          []    [] []                   | 14
+     m4                 | []          []                 []         | 15
+     mailutils          |                                           |  2
+     make               | []          []    []           []         | 15
+     man-db             |             []                            |  6
+     mysecretdiary      |             []    []                      |  8
+     nano               | []          []       []                   | 15
+     nano_1_0           | []          []       []                   | 15
+     opcodes            |             []    []                      |  9
+     parted             |             []    []                      | 13
+     ptx                | []          []    []                      | 22
+     python             |                                           |  0
+     radius             |                                           |  0
+     recode             | []    []    []    []                      | 19
+     screem             |             []                            |  1
+     sed                |    [] []    []    [] []                   | 20
+     sh-utils           | []    []          []                      | 13
+     sharutils          | []          []    []                 []   | 16
+     sketch             |             []                            |  5
+     soundtracker       |             []                            |  7
+     sp                 |                   []                      |  3
+     tar                |    [] []    []    []           []         | 24
+     texinfo            | []          []    []           []         | 13
+     textutils          | []    []    []    []                 []   | 15
+     tin                |                                           |  1
+     util-linux         |             []    []                      | 14
+     vorbis-tools       | []                                        |  7
+     wastesedge         |                                           |  0
+     wdiff              | [] []       []    []                      | 17
+     wget               | [] [] []    []    [] []              []   | 25
+     xchat              |    [] []    []                            | 11
+     xpad               |                                           |  1
+                        +-------------------------------------------+
+       50 teams           ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW
+       97 domains         32 19 16  0 56  0 48 10  1  1  12    23    913
+
+   Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect.  This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+   For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer.  There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+   If May 2003 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites.  The most up-to-date
+matrix with full percentage details can be found at
+`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+
+Using `gettext' in new packages
+===============================
+
+   If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package.  Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library.  This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+   Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations.  The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project.  Therefore the information given above
+applies also for every other Free Software Project.  Contact
+`translation@iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+
diff --git a/CHANGES b/CHANGES
index 40ec840..15e9cf6 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -146,7 +146,8 @@ ss. Fixed a bug that caused a `return' invoked in an exit trap when exit is
 tt. Fixed a bug that caused CTLESC and CTLNUL characters to not be escaped
     by the internal shell string quoting functions.
 
-uu. Fixed a bug that cause
+uu. Fixed a bug that caused quoted null characters in an expanded word list
+    to be inappropriately assigned to an array variable when using `read -a'.
 
 vv. Fixed a bug that caused redirections accompanying a null command to persist
     in the current shell.
diff --git a/CWRU/-i b/CWRU/-i
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/CWRU/CWRU.chlog b/CWRU/CWRU.chlog
new file mode 100644 (file)
index 0000000..0e71f5d
--- /dev/null
@@ -0,0 +1,8918 @@
+                                4/9/2001
+                                --------
+[bash-2.05 released]
+
+                                  4/10
+                                  ----
+redir.c
+       - check return value of fclose() in write_here_document() for error
+         returns; don't just rely on fwrite() failing
+
+support/bashbug.sh
+       - set TMPDIR to /tmp if it's null or unset
+       - use $TMPDIR in the TEMP tempfile name template
+       - fixed the call to `mktemp', if it exists, to make it more portable
+
+jobs.c
+       - if WCONTINUED is not defined, define it to 0 and add a define for
+         WIFCONTINUED(wstatus) which expands to 0
+       - add WCONTINUED to the flags passed to waitpid(2) in waitchld()
+       - don't increment children_exited if waitpid's status is WIFCONTINUED,
+         since we don't want to call a SIGCHLD trap handler in this case
+       - in waitchld(), we set child->running to 1 if WIFCONTINUED(status)
+         is non-zero
+       - make sure pretty_print_job doesn't check for the core dump bit if
+         the process has been continued; it's only valid if the job is dead
+       - in set_job_status_and_cleanup, set the job to JRUNNING if job_state
+         is non-zero and the job was previously marked as JSTOPPED
+
+configure.in
+       - add -DBROKEN_DIRENT_D_INO to interix LOCAL_CFLAGS
+
+lib/glob/glob.c
+       - if BROKEN_DIRENT_D_INO is defined, define REAL_DIR_ENTRY to 1
+
+jobs.c
+       - in kill_pid, we only need to block and unblock SIGCHLD if the
+         `group' argument is non-zero, since otherwise we just call `kill'
+         on the pid argument
+
+version.c
+       - update copyright date to 2001
+
+bashline.c
+       - prog_complete_return needs to take a `const char *' as its first
+         argument
+       - history_completion_generator needs to take a `const char *' as
+         its first argument, and `text' needs to be a `const char *'
+
+                                  4/11
+                                  ----
+redir.c
+       - fixed a weird typo in redir_special_open, case RF_DEVFD, added
+         call to all_digits before call to legal_number
+       - fixed do_redirection_internal to call legal_number instead of atol(3)
+         when translating r_duplicating_{in,out}put_word, so it handles
+         overflow better
+       - produce an error message in redirection_error for out-of-range
+         file descriptors
+       - change allocation strategy in redirection_error so we don't have to
+         malloc scratch memory if redirection_expand() fails
+
+jobs.h
+       - added defines for `running' member of a struct process
+
+general.c
+       - fix legal_number to return 0 when strtol(3) reports overflow or
+         underflow
+
+parse.y
+       - changed read_token_word to call legal_number instead of atoi(3)
+
+input.c
+       - return -1/EBADF from close_buffered_fd if fd is < 0
+
+command.h
+       - fixed bogus comment about IS_DESCRIPTOR in description of the
+         REDIRECTEE struct
+
+print_cmd.c
+       - change cprintf's 'd' modifier code to display negative numbers as
+         an out-of-range value.  We can do this only because the only use
+         of %d is to output file descriptor numbers in redirections
+
+support/mksignames.c
+       - need to include config.h to get a possible value for
+         UNUSABLE_RT_SIGNALS
+
+                                  4/16
+                                  ----
+lib/readline/doc/rluser.texinfo
+       - corrected a small error in one description of M-DEL
+
+                                  4/17
+                                  ----
+stringlib.c
+       - need to initialize `ind' before calls to RESIZE_MALLOCED_BUFFER
+         in strcreplace()
+
+support/bashversion.c
+       - new file, prints bash version information
+
+Makefile.in
+       - rules for building bashversion and linking it to version.o
+
+                                  4/24
+                                  ----
+conftypes.h
+       - new file with HOSTTYPE, OSTYPE, MACHTYPE, etc. defines from
+         variables.h
+
+variables.h, version.c
+       - include conftypes.h
+
+patchlevel.h
+       - new file, contains define for PATCHLEVEL.  Doing away with the old
+         scheme of having the information in configure.in
+
+version.c
+       - include patchlevel.h
+
+Makefile.in
+       - run bashversion -p to find patch level rather than have configure
+         substitute in a value
+       - pass -S ${top_srcdir} to support/mkversion.sh
+
+support/mkversion.sh
+       - don't put PATCHLEVEL define into version.h, but accept and ignore
+         a -p option
+       - take a new -S srcdir option
+       - find the patch level by parsing it out of patchlevel.h
+
+configure.in
+       - hard-code BASHVERS assignment instead of reading it from a file
+       - remove BASHPATCH; don't substitute it
+
+_distribution,_patchlevel
+       - removed
+
+                                  4/26
+                                  ----
+shell.c
+       - call init_noninteractive() in open_shell_script if forced_interactive
+         is non-zero (the shell was started with -i) and fd_is_tty is 0
+         (the script file is a real file, not something like /dev/stdin),
+         since it wasn't done earlier
+
+builtins/printf.def
+       - change for POSIX.2 compliance when conversion errors are encountered
+         when processing %d, %u, and floating point conversion operators
+         (print a warning message, return the value accumulated at the time
+         of the error -- which is always 0 -- and exit with a non-zero status)
+
+command.h
+       - added CMD_COMMAND_BUILTIN for use by the `command' builtin and the
+         code in execute_cmd.c
+
+builtins/command.def
+       - add CMD_COMMAND_BUILTIN to the created command's flags
+
+                                   5/1
+                                   ---
+configure.in
+       - add call to AC_C_CONST to test `const' compiler behavior
+       - add call to AC_C_INLINE to test `inline' compiler behavior
+       - add call to AC_C_STRINGIZE to test cpp #x stringizing operator
+
+config.h.in
+       - add `#undef const' for configure to substitute
+       - add `#undef inline' for configure to substitute
+       - add `#undef HAVE_STRINGIZE' for configure to substitute
+
+include/stdc.h
+       - remove code that defines or undefines `const' and `inline'
+       - change the __STRING macro to be defined depending on the value
+         of HAVE_STRINGIZE
+
+lib/malloc/malloc.c
+       - change the __STRING macro to be defined depending on the value
+         of HAVE_STRINGIZE
+
+lib/readline/{readline,rlprivate}.h
+       - moved rl_get_termcap to readline.h, making it a public function
+
+lib/readline/readline.h
+       - new #define, RL_READLINE_VERSION, hex-encoded library version
+         number, currently set to 0x0402
+       - new public int variable, rl_readline_version
+
+lib/readline/readline.c
+       - #define RL_READLINE_VERSION if it is not already defined (which it
+         should be in readline.h)
+       - initialize rl_readline_version to RL_READLINE_VERSION
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_get_termcap
+       - documented rl_readline_version
+
+jobs.c
+       - job_exit_status should return an int, not a WAIT (undetected
+         before because on most POSIX-like systems a WAIT is really an int)
+
+builtins/evalfile.c
+       - added FEVAL_REGFILE (file must be a regular file) to accepted
+          _evalfile flags
+       - fc_execute_file() adds FEVAL_REGFILE to _evalfile flags.  This
+         means that startup files and files read with `.' no longer need
+         to be regular files
+
+                                   5/2
+                                   ---
+
+lib/termcap/Makefile.in
+       - fix target for installed termcap library (normally unused)
+
+lib/tilde/Makefile.in
+       - fix install target to install in $(libdir) (normally unused)
+
+Makefile.in
+       - don't make $(man3dir) since there's nothing installed there
+
+Makefile.in,doc/Makefile.in
+       - change `man1ext' to `.1', `man3ext' to `.3'
+       - change appropriate install targets to use new values of man[13]ext
+       - use `test ...' instead of `[...]'
+       - add support for DESTDIR root installation prefix, for package
+         building (installdirs, install, install-strip, uninstall targets)
+
+builtins/common.c
+       - new function int get_exitstat(WORD_LIST *list) returns an eight-bit
+         exit status value for use in return, exit, logout builtins
+
+builtins/common.h
+       - extern declaration for get_exitstat()
+
+builtins/{exit,return}.def
+       - call get_exitstat where appropriate
+
+builtins/printf.def
+       - add support for "'" flag character as posix 1003.2-200x d6 says
+       - fix core dump when user-supplied field width or precision is 0
+       - fix to printstr() to handle zero-length precision with `%b' format
+         specifier (printf '%.0b-%.0s\n' foo bar)
+       - fix to printstr() to treat a negative field width as a positive
+         field width with left-justification
+       - fix to mklong to avoid static buffers, which can always be overrun
+         by someone sufficiently motivated
+
+bashline.c
+       - change var in add_host_name to type `size_t' for passing to xrealloc
+
+                                   5/3
+                                   ---
+execute_cmd.c
+       - change restore_signal_mask to accept a sigset_t *, since a sigset_t
+         may not fit into a pointer, change call
+
+unwind_prot.c
+       - use a union UWP in restore_variable when restoring a variable whose
+         size is the same as sizeof(int), the reverse of the method used to
+         store it in unwind_protect_int
+
+builtins/printf.def
+       - use a #define LENMODS containing the length modifiers instead of
+         testing against each possible modifier character, save any mod
+         character found
+       - add support for ISO C99 length specifiers `j', `t', and `z'
+       - if `L' modifier is supplied with a floating point conversion char,
+         pass a `long double' to printf if HAVE_LONG_DOUBLE is defined
+
+configure.in,config.h.in
+       - call AC_C_LONG_DOUBLE to check for `long double'; define
+         HAVE_LONG_DOUBLE if supported
+
+bashline.c
+       - fix an inadvertantly-unclosed comment in attempt_shell_completion
+       - make set_saved_history return a value
+       - make dynamic_complete_history return a useful value
+
+{make_cmd,execute_cmd,shell,subst,trap,variables,input,unwind_prot,test,
+pcomplete}.c
+       - removed some declared-but-unused variables
+
+builtins/{cd,enable,fc,set,setattr,type,umask,printf,complete}.def
+       - removed some declared-but-unused variables
+
+lib/sh/{zread,netopen}.c
+       - removed some declared-but-unused variables
+
+execute_cmd.c
+       - in execute_arith_command, use a long variable to hold the result
+         of evalexp(), since that's what it returns
+
+builtins/evalstring.c
+       - make cat_file return -1 on a read or write error
+
+lib/sh/stringlib.c
+       - make merge_stringlists() return the right value
+
+                                   5/7
+                                   ---
+pcomplete.c
+       - remove typo that caused empty declaration (;;)
+
+parse.y
+       - fix yyerror() to accept a single string argument; fix callers
+
+trap.c
+       - cast pointer to long instead of int when printing message with
+         internal_warning() in run_pending_traps()
+
+subst.c
+       - fix process_substitute to handle stdin being closed
+
+test.c
+       - change `while' to `if' in and() and or(), since the loop isn't
+         actually performed -- there's an unconditional `return' in the
+         loop body
+       - check for integer overflow of arguments to `-t'
+
+lib/sh/netopen.c
+       - change _getserv() to reject negative port/service numbers
+
+expr.c
+       - fix strlong() to not convert the base specification from long to
+         int before checking for overflow, since truncation on machines
+         where sizeof(int) != sizeof(long) may mask errors
+
+builtins/{jobs,kill,wait}.def
+       - use legal_number instead of atoi when converting strings to pid_t;
+         check for numeric overflow
+
+input.c
+       - fix for cygwin in b_fill_buffer -- off-by-one error when checking
+         buffer for \r\n termination
+
+general.h
+       - new #define INT_STRLEN_BOUND(t), computes max length of string
+         representing integer value of type T, possibly including a sign
+         character
+       - include <limits.h> if it's present
+
+{execute_cmd,findcmd,test}.c
+       - don't include <limits.h>, since general.h does it now
+
+{execute_cmd,lib/sh/itos,pcomplete,print_cmd,subst,variables}.c
+       - use INT_STRLEN_BOUND instead of static array sizes when converting
+         various strings to integer values
+
+shell.h
+       - struct fd_bitmap now uses an `int' size, since it's bounded by
+         the number of file descriptors, which must fit into an `int'
+
+execute_cmd.c
+       - FD_BITMAP_DEFAULT_SIZE is now 32, not 32L
+       - new_fd_bitmap takes an `int' size parameter, not a `long'
+
+execute_cmd.h
+       - change prototype for new_fd_bitmap()
+
+test.c
+       - fix test_stat to check for overflow when parsing the integer file
+         descriptor number; return ENOENT instead of EBADF for files that
+         are not open
+
+hashlib.c
+       - don't discard the upper 32 bits of the random value, if present
+
+lib/readline/shell.c
+       - use the same INT_STRLEN_BOUND mechanism to decide how much space to
+         allocated in sh_set_lines_and_columns
+
+                                   5/8
+                                   ---
+aclocal.m4
+       - add check for libtinfo (termcap-specific portion of ncurses-5.2) to
+         BASH_CHECK_LIB_TERMCAP
+       - new macro, RL_LIB_READLINE_VERSION, checks version of installed
+         readline library and (optionally) writes version #defines to
+         config.h.  Bash doesn't use the version defines
+
+configure.in
+       - call RL_LIB_READLINE_VERSION instead of support/rlvers.sh
+
+execute_cmd.c
+       - fix execute_shell_script and the WHITECHAR and STRINGCHAR macros
+         to check array bounds before indexing into the sample string
+
+unwind_prot.[ch]
+       - import new versions submitted by Paul Eggert <eggert@twinsun.com>
+         with a couple of changes for backwards compatibility, so the rest
+         of the source doesn't need to be changed yet
+
+jobs.c
+       - use unwind_protect_var on last_made_pid in run_sigchld_trap
+
+builtins/bind.def
+       - use unwind_protect_var on rl_outstream
+
+general.c
+       - rework print_rlimtype to use INT_STRLEN_BOUND and handle the
+         most negative number correctly
+
+expr.c
+       - `tokval' should have been a `long', since all arithmetic is done
+         as longs
+
+builtins/history.def
+       - consolidate tests for valid history position in one block to
+         avoid duplicate code and strings
+
+builtins/ulimit.def
+       - fix check for overflow when setting limit to work when int is 32
+         bits and RLIMTYPE is 64
+
+lib/sh/tmpfile.c
+       - don't truncate the result of time(3) to int; just use time_t,
+         since it's being assigned to an `unsigned long'
+
+mailcheck.c
+       - use legal_number instead of atoi in time_to_check_mail() to catch
+         more numeric errors; consolidate error checking in one block
+       - last_time_mail_checked should be a time_t
+
+                                   5/9
+                                   ---
+builtins/set.def
+       - recognize `set [-+]o nolog' if HISTORY is defined
+
+bashline.c
+       - new variable `dont_save_function_defs', set by `set -o nolog';
+         currently ignored
+
+command.h
+       - the `dest' member of a REDIRECTEE is now an `int'
+
+parse.y,redir.c
+       - changed uses of `redir.test' (where redir is a REDIRECTEE) since
+         it's now an int
+
+lib/readline/rlstdc.h
+       - don't mess around with `const', rely on configure to supply a
+         proper definition if the compiler doesn't support it
+
+lib/tilde/tilde.h
+       - include <config.h> if HAVE_CONFIG_H is defined
+       - don't mess around with `const', rely on configure
+
+builtins/shopt.def
+       - new read-only `shopt' option, login_shell, non-zero if shell is a
+         login shell (as decided by shell.c)
+       - new function set_login_shell(), sets shopt private value of
+         login_shell
+
+builtins/common.h
+       - new extern declaration for set_login_shell
+
+shell.c
+       - call set_login_shell after setting value of login_shell (in
+         main() and set_shell_name())
+
+parse.y
+       - added new `\A' prompt string escape sequence:  time in 24-hour
+         HH:MM format
+
+configure.in, config.h.in
+       - check for <grp.h>, define HAVE_GRP_H if found
+
+builtins/complete.def
+       - add new `-A group/-g' option to complete group names
+
+pcomplete.h
+       - new define for CA_GROUP, used with group name completion
+
+pcomplete.c
+       - add code to support CA_GROUP group name completion
+
+bashline.c
+       - new function, bash_groupname_completion_function(), supports
+         programmable completion of group names
+
+bashline.h
+       - extern declaration for bash_groupname_completion_function
+
+lib/readline/bind.c
+       - new inputrc variable, `match-hidden-files', controls completion
+         matching files beginning with a `.' (on Unix)
+
+lib/readline/complete.c
+       - new variable, _rl_match_hidden_files, mirrors `match-hidden-files'
+         inputrc variable
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_match_hidden_files
+
+builtins/hash.def
+       - new `-t' option to list hash values for each filename argument
+
+builtins/read.def
+       - alarm(3) takes an `unsigned int' argument, not int
+       - check for arithmetic overflow with -t and -n options
+
+input.c
+       - check for read error before doing \r\n translation on cygwin in
+         b_fill_buffer
+       - reset bp->b_used to 0 instead of leaving it at -1 on read error
+         in b_fill_buffer
+
+builtins/shopt.def
+       - new functions, shopt_setopt(name, mode) and
+         shopt_listopt(name, mode) to give the rest of the shell an easy
+         interface
+
+builtins/common.h
+       - extern declarations for shopt_setopt and shopt_listopt
+
+shell.c
+       - new invocation options -O and +O, to list or set/unset shopt
+         options like +o/-o sets and unsets `set -o' options
+
+doc/{bash.1,bashref.texi}
+       - document `set -o nolog'
+       - document `login_shell' shopt option
+       - document new `\A' prompt string escape sequence
+       - document new `-t' option to `hash'
+       - document new `[+-]O' invocation option
+
+doc/bashref.texi
+       - add text to `Invoking Bash' section defining a login shell; text
+         taken from man page
+
+doc/bash.1, lib/readline/doc/rluser.texinfo
+       - documented new complete/compgen `-A group/-g' option
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+       - documented new `match-hidden-files' inputrc variable
+
+                                  5/10
+                                  ----
+configure.in
+       - fix AC_CHECK_PROG(ar, ...)
+       - add AC_CHECK_TYPE for ssize_t
+
+config.h.in
+       - new #undef for ssize_t
+
+lib/sh/zread.c
+       - int -> ssize_t fixes to mirror modern declarations of read and write
+       - the `off' variable in zsyncfd should be an off_t since it computes
+         a file offset
+       - the local buffer `lbuf' is now char, since it's not nice to pass
+         unsigned char * to read(2), and the values from it are assigned to
+         a char anyway
+       - lind and lused are now size_t, since they index into a buffer
+       - set lused to 0 on read error
+
+lib/sh/zwrite.c
+       - change second argument to type `char *', since ISO C says you have
+         to pass a `char *' to `write'
+
+externs.h
+       - fix extern declarations of zread, zread1, zreadc, and zwrite
+       - prototype extern declaration of qsort_string_compare
+       - add extern declaration for history_delimiting_chars() from parse.y
+
+input.h
+       - b_used and b_inputp members ofr struct BSTREAM are now size_t
+
+builtins/evalstring.c
+       - the number of chars read with zread in cat_file should be assigned
+         to a variable of type ssize_t
+
+input.c
+       - the number of chars read with zread in b_fill_buffer should be
+         assigned to a variable of type ssize_t
+       - `localbuf' is now type char[], since POSIX says you shouldn't pass
+         unsigned char * to read(2)
+       - in getc_with_restart(), use a variable of type unsigned char to
+         get a value from the local buffer and return it
+       - in ungetc_with_restart, explicitly return the character arg passed
+         to avoid relying on localbuf being unsigned char
+
+subst.c
+       - the number of chars read with zread in read_comsub should be
+         assigned to a variable of type ssize_t
+
+mksyntax.c
+       - instead of casting to unsigned char * in addcstr, use a variable
+         of type unsigned char and let the compiler do the work
+
+parse.y
+       - instead of casting to unsigned char * in yy_readline_get, use a
+         variable of type unsigned char and let the compiler do the work
+       - ditto for yy_string_get and shell_getc (cast to unsigned char)
+
+subst.c
+       - instead of casting to unsigned char when assigning to ifscmap in
+         expand_word_internal, use a variable of type unsigned char and
+         let the compiler do the work
+
+lib/sh/strtrans.c
+       - instead of casting to unsigned char in ansic_quote, use a variable
+         of type unsigned char and let the compiler do the work
+
+builtins/evalstring.c
+       - remove extern declarations for zwrite and run_trap_cleanup; they're
+         in externs.h
+       - prototype cat_file forward declaration
+
+Makefile.in
+       - remove -I$(includedir) from INCLUDES and SUBDIR_INCLUDES
+
+aclocal.m4
+       - change RL_LIB_READLINE_VERSION to set RL_PREFIX, RL_LIBDIR,
+         and RL_INCLUDEDIR to what it used to test the installed readline
+         library version for use by the caller
+       - change RL_LIB_READLINE_VERSION to not compute ac_cv_rl_prefix if
+         the caller has already assigned it a value
+       - rename _rl_prefix -> ac_cv_rl_prefix, _rl_libdir -> ac_cv_rl_libdir,
+         _rl_includedir -> ac_cv_rl_includedir
+
+configure.in
+       - change testing of whether to use the value of
+         $opt_with_installed_readline to be != no, to allow the user to
+         specify a prefix where the installed readline library may be found
+       - if --with-installed-readline=PREFIX is supplied, set ac_cv_rl_prefix
+         to PREFIX before calling RL_LIB_READLINE_VERSION
+       - if --with-installed-readline[=PREFIX] is supplied, don't set
+         RL_LIBDIR and RL_INCLUDEDIR; let RL_LIB_READLINE_VERSION take care
+         of it, set RL_INCLUDE=-I${RL_INCLUDEDIR}
+       - if --with-installed-readline[=PREFIX] is supplied, and we're
+         linking with the history library, assign $RL_LIBDIR to HIST_LIBDIR
+         so we use the same version of the installed readline and history
+         libraries
+
+Makefile.in, builtins/Makefile.in
+       - have configure substitute RL_INCLUDEDIR, set RL_INCLUDEDIR variable
+
+doc/bashref.texi
+       - updated description of --with-installed-readline configure option 
+
+general.c
+       - moved QSFUNC typedef here from builtins/common.c
+
+{alias,bashline,variables,lib/sh/stringvec}.c
+       - cast fourth argument to qsort to (QSFUNC *)
+
+alias.c
+       - prototype forward declaration of qsort_alias_compare
+
+bashhist.c
+       - include <glob/glob.h> for extern declaration of glob_pattern_p
+       - remove extern declaration of history_delimiting_chars; it's now
+         in externs.h
+       - prototype forward declarations of histignore_item_func,
+         maybe_add_history, and bash_add_history
+
+bracecomp.c
+       - remove extern declaration for sh_backslash_quote; it's in externs.h
+
+braces.c
+       - remove extern declaration for extract_command_subst; it's in subst.h
+       - prototype forward declarations for expand_amble, array_concat, and
+         brace_gobbler
+
+error.c
+       - prototype extern declaration of give_terminal_to, fix bad call
+
+{execute_cmd,expr,findcmd,jobs,mailcheck,nojobs,pcomplete,print_cmd,redir,
+shell}.c
+       - prototype all static forward function declarations
+
+pcomplete.c
+       - changed some function parameters to `const char *' to avoid discarding
+         const qualifier
+
+make_cmd.c
+       - make_bare_word, make_word_flags, and make_word now take a
+         `const char *' string argument
+
+make_cmd.h
+       - changed extern declarations for make_bare_word and make_word
+
+print_cmd.c
+       - cprintf now takes a `const char *' as its first argument, like
+         xprintf and printf
+       - the conditional define for xprintf should have been HAVE_VPRINTF,
+         not HAVE_VFPRINTF
+
+shell.c
+       - in isnetconn(), the return value of sizeof() is size_t
+
+aclocal.m4
+       - add inclusion of stddef.h if STDC_HEADERS is defined to 1 in
+         BASH_CHECK_TYPE
+
+configure.in
+       - add a call to BASH_CHECK_TYPE for socklen_t (type of third argument
+         to getpeername(2))
+
+                                  5/11
+                                  ----
+lib/readline/bind.c
+       - make `useq' a char array to pass to rl_macro_bind in
+         rl_parse_and_bind
+
+lib/readline/{{bind,isearch}.c,rlprivate.h}
+       - _rl_isearch_terminators is now a char *, not unsigned char *
+
+{subst,variables,lib/sh/tmpfile}.c
+       - dollar_dollar_pid is now a `pid_t' instead of `int'
+
+variables.c
+       - sbrand() now takes an `unsigned long' to set the seed value
+       - changed last_random_value to type int, since it's always between
+         0 and 32767
+       - use strtoul to convert the value in assign_random instead of atoi
+       - take out casts in any arguments to sbrand()
+       - take out cast to int in call to inttostr in set_ppid()
+
+subst.c
+       - don't cast last_asynchronous_pid when passing to itos()
+
+{sig,subst}.c
+       - prototype all static forward function declarations
+
+                                  5/14
+                                  ----
+{test,trap,variables}.c
+       - prototype all static forward function declarations
+
+variables.c
+       - free_variable_hash_data() now takes a PTR_T, a `generic pointer'
+
+builtins/{alias,bind,break,cd,complete,declare,enable,exit,fc,fg_bg,help,
+history,jobs,pushd,read,set,trap,umask,
+       - prototype all static forward function declarations
+
+builtins/read.def
+       - reset_eol_delim now takes a `char *' arg, since that's what the
+         unwind_protect functions pass it, and it ignores its arguments
+         anyway
+
+lib/readline/{histsearch,input,kill,rltty,search,vi_mode}.c
+       - prototype all static forward function declarations
+
+lib/tilde/tilde.c
+       - prototype all static forward function declarations
+       - tilde_find_prefix, tilde_find_suffix, isolate_tilde_prefix, and
+         glue_prefix_and_suffix now take `const char *' arguments where
+         appropriate
+
+configure.in,config.h.in
+       - check for vsnprintf, define HAVE_VSNPRINTF if found
+
+lib/readline/display.c
+       - use vsnprintf() in rl_message if it's available; if we don't, at
+         least set the last character in msg_buf to 0 to avoid overrun --
+         we really can't do anything about overflow at this point.  if it's
+         available, this fixes buffer overflow problems in rl_message
+
+                                  5/15
+                                  ----
+lib/readline/histexpand.c
+       - in get_history_word_specifier, allow any character to terminate
+         a `:first-' modifier, not just `:' and null.  This is what csh
+         appears to do.  This allows things like `!:0- xyzzy' to replace the
+         last argument with xyzzy
+
+                                  5/18
+                                  ----
+configure.in, config.h.in
+       - check for <stdint.h>, define HAVE_STDINT_H if found
+       - check for intmax_t in <stdint.h>, define intmax_t as long if not
+         found
+
+                                  5/21
+                                  ----
+builtins/kill.def
+       - change to use strerror() for error message when kill(2) fails
+
+aclocal.m4
+       - new macro, BASH_C_LONG_LONG, check for `long long'
+
+configure.in, config.h.in
+       - call BASH_C_LONG_LONG, define HAVE_LONG_LONG if found
+
+lib/sh/snprintf.c
+       - new file, with implementations of snprintf, vsnprintf, asprintf,
+         and vasprintf, derived from inetutils version
+
+Makefile.in, lib/sh/Makefile.in
+       - add snprintf.c/snprintf.o
+
+configure.in, config.h.in
+       - add checks for snprintf, asprintf, vasprintf, with appropriate
+         cpp defines
+
+lib/readline/{rldefs,xmalloc}.h, lib/readline/xmalloc.c
+       - xmalloc and xrealloc now take `size_t' arguments, like their bash
+         counterparts
+
+externs.h,lib/sh/itos.c
+       - inttostr and itos now take `long' arguments
+       - inttostr takes a `size_t' argument for the buffer size
+
+{expr,lib/malloc/malloc,variables,general}.c
+       - fixed calls to itos() by removing casts, etc.
+
+subst.[ch]
+       - get_dollar_var_value now takes a long, not an int
+       - sub_append_number now takes a long, not an int
+
+subst.c
+       - in parameter_brace_expand_word, use a long and legal_number to
+         translate ${N}, to avoid overflow
+       - in parameter_brace_expand_length, use a long and legal_number to
+         translate ${#N}, to avoid overflow
+       - in do_array_element_assignment, array_expand_index,
+         array_value_internal, use arrayind_t instead of int
+       - let verify_substring_values take long * arguments for the return
+         value of evalexp()
+       - pass long * arguments to verify_substring_values in
+         parameter_brace_substring
+       - parameter_brace_expand_length now returns `long'
+       - parameter_brace_expand now uses a long variable for the return
+         value of parameter_brace_expand_length
+       - param_expand now uses a long variable for the return value from
+         evalexp
+       - array_length reference now returns an `arrayind_t', since it can
+         return the num_elements member of an array, which is of type
+         arrayind_t
+
+subst.h
+       - array_expand_index now returns an `arrayind_t'
+
+array.[ch]
+       - array_subrange now takes arrayind_t arguments, not `int'
+       - dup_array_subrange now uses arrayind_t local variable to do
+         array indexing
+       - use long to print array indices in print_element
+
+variables.c
+       - null_array_assign, assign_dirstack, bind_array_variable
+         now take arrayind_t arguments as array indices
+       - assign_array_var_from_word_list, assign_array_var_from_string,
+         unbind_array_element now use arrayind_t local variables for
+         array indexing
+
+variables.h
+       - change extern declaration of bind_array_variable
+
+builtins/common.[ch]
+       - get_numeric_arg now returns a `long', since it usually returns
+         the value of legal_number()
+
+builtins/{shift,break}.def
+       - use long variables for the return value of get_numeric_arg
+
+builtins/history.def
+       - convert string argument to int only if it's in range
+
+builtins/pushd.def
+       - set_dirstack_element and get_dirstack_element now take `long'
+         index arguments
+       - get_dirstack_index now takes a `long' index argument, since it's
+         passed the converted value from legal_number
+
+lib/sh/timeval.c
+       - in print_timeval, don't assume that the number of minutes fits into
+         an int, since it's just seconds/60.
+
+lib/sh/clock.c
+       - ditto for print_clock_t
+
+                                  5/22
+                                  ----
+shell.c
+       - since the -O option settings may possibly be overridden by the
+         normal shell initialization or posix initialization, save the
+         invocation options on an alist (with add_shopt_to_alist) and
+         process them after basic initialization (with run_shopt_alist)
+
+                                  5/23
+                                  ----
+trap.h
+       - new define, BASH_NSIG, all system signals plus special bash traps
+
+trap.c, builtins/trap.def
+       - use BASH_NSIG for array bounds and loops where appropriate
+
+trap.c
+       - change decode_signal to disallow numeric signal numbers above
+         NSIG -- this means you can only reference special traps like
+         DEBUG by name
+       - new SPECIAL_TRAP(s) macro to test whether s is one of the special
+         bash traps (currently DEBUG and EXIT)
+       - change reset_or_restore_signal_handlers so command substitution
+         doesn't inherit the debug trap (like ksh93), and child processes
+         don't have to rely on initialize_traps being run to get rid of
+         any debug trap
+
+support/mksignames.c
+       - add extra "ERR" signal name, value NSIG+1, allocate space for it
+         and write it out in signal_names[]
+
+trap.h
+       - new define: ERROR_TRAP == NSIG+1, change BASH_NSIG to NSIG+2
+       - extern declarations for set_error_trap, run_error_trap
+       - new define: TRAP_STRING(s), expands to trap_list[s] if signal S
+         is trapped and not ignored, NULL otherwise
+
+trap.c
+       - add ERROR_TRAP to SPECIAL_TRAPS define
+       - initialize ERROR_TRAP stuff in initialize_traps
+       - new function: set_error_trap(command), sets the ERR trap string
+       - new function: run_error_trap(command), runs the ERR trap string
+       - set trap string for ERROR_TRAP to NULL in free_trap_strings
+       - change reset_or_restore_signal_handlers so child processes don't
+         inherit the ERR trap
+       - add case to call run_error_trap in maybe_call_trap_handler
+
+execute_cmd.c
+       - in execute_command_internal, keep track of ERR trap and call it if
+         necessary
+       - use TRAP_STRING to get the value of debug and error traps
+       - in execute_function, arrange things so the ERR trap is not inherited
+         by shell functions, and is saved and restored like the DEBUG trap
+
+doc/{bash.1,bashref.texi}
+       - documented new ERR trap
+
+tests/{trap.{tests,right},trap2.sub,trap2a.sub}
+       - added ERR trap tests
+
+subst.c
+       - on machines without /dev/fd, change the named pipe fifo list to a
+         list of structs containing pathname and proc information
+       - change unlink_fifo_list to kill the proc in the fifo list with
+         signal 0 and not remove the fifo if the proc is still alive.  This
+         should fix the problem on those backward systems without /dev/fd
+         where fifos were removed when a job using process substitution was
+         suspended
+
+                                  5/24
+                                  ----
+examples/loadables/getconf.h
+       - new file, with basic defines needed to make getconf work minimally
+         on POSIX systems without the necessary definitions
+
+examples/loadables/getconf.c
+       - replacement functions for confstr, sysconf, pathconf for systems
+         that lack them, providing a minimal posix interface
+       - heavily augmented getconf, now supports all POSIX.1-200x,
+         POSIX.2-200x, Solaris 7, AIX 4.2 getconf variables
+
+                                  5/29
+                                  ----
+builtins/setattr.def
+       - make `readonly', `export', and `declare' print `invisible' variables
+         as just a command and variable name, without a value, when listing
+         all variables (as POSIX.2-200x d6 requires)
+
+                                  5/30
+                                  ----
+
+configure.in
+       - upgraded to autoconf-2.50 on main development machine, so require
+         autoconf-2.50 in preparation for using some if its new features
+       - call AC_C_PROTOTYPES
+       - remove call to AC_EXEEXT, which now does the wrong thing
+       - changed AC_INIT to new flavor
+       - added call to AC_CONFIG_SRCDIR
+       - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS
+       - AC_RETSIGTYPE -> AC_TYPE_SIGNAL
+
+configure.in, aclocal.m4, config.h.in
+       - removed call to BASH_LARGE_FILE_SUPPORT, use AC_SYS_LARGEFILE
+         standard support, with new macros _FILE_OFFSET_BITS and
+         _LARGE_FILES
+       - removed definition of BASH_LARGE_FILE_SUPPORT
+
+doc/bashref.texi
+       - document new `--enable-largefile' configure option
+
+lib/readline/readline.c
+       - change rl_set_prompt to call rl_expand_prompt unconditionally, so
+         local_prompt and local_prompt_prefix get set correctly
+
+                                   6/6
+                                   ---
+lib/readline/complete.c
+       - don't append `/' or ` ' to a match when completing a symlink that
+         resolves to a directory, unless the match doesn't add anything
+         to the word.  This means that a tab will complete the word up to
+         the full name, but not add anything, and a subsequent tab will add
+         a slash.  Change to append_to_match; callers changed
+
+hashlib.c
+       - new function, hash_table_nentries (table), returns the number of
+         items in TABLE
+
+hashlib.h
+       - extern declaration for hash_table_nentries
+
+configure.in
+       - configure without bash malloc on openbsd; they claim it needs
+         eight-bit alignment (which the bash malloc provides, but...)
+
+                                   7/2
+                                   ---
+stringlib.c
+       - only call RESIZE_MALLOCED_BUFFER from strsub() if the replacement
+         string length is > 0, avoid possible hangs if replacement is null
+
+subst.c
+       - don't include input.h; no longer needed
+
+configure.in
+       - remove calls to AC_SYS_RESTARTABLE_SYSCALLS and
+         BASH_SYS_RESTARTABLE_SYSCALLS; the results are no longer used
+
+config.h.in
+       - remove define for HAVE_RESTARTABLE_SYSCALLS
+
+aclocal.m4
+       - removed definition of BASH_SYS_RESTARTABLE_SYSCALLS; no longer used
+
+execute_cmd.c
+       - changed select command so `return' no longer terminates the select
+         command, so it can be used to return from an enclosing function.
+         This is as ksh (88 and 93) does it
+
+lib/readline/vi_mode.c
+       - fix trivial typo in declaration of vi_motion; `t' appears twice;
+         the second instance should be `T'
+
+                                   7/3
+                                   ---
+configure.in
+       - don't add -static to LDFLAGS on Solaris 2.x.  This means that the
+         auxiliary programs will be built as dynamic executables, but that
+         should do no harm
+
+                                   7/5
+                                   ---
+lib/glob/fnmatch.c
+       - fix the code that processes **(pattern) to short-circuit if the
+         pattern is ill-formed or lacks a trailing `)'  -- this fixes the
+         segfault on **(/*)
+
+Makefile.in, builtins/Makefile.in
+       - split CCFLAGS into CCFLAGS_FOR_BUILD and CFLAGS, to aid in
+         cross-compilation
+       - build programs that use $(CC_FOR_BUILD) using $(CCFLAGS_FOR_BUILD)
+
+configure.in, config.h.in
+       - check for getaddrinfo(3), define HAVE_GETADDRINFO if found
+
+lib/sh/netopen.c
+       - implemented a version of _netopen (_netopen6) that uses
+         getaddrinfo(3) if available, use if HAVE_GETADDRINFO is defined.
+         old _netopen is _netopen4; _netopen now calls either _netopen6
+         or _netopen4 as appropriate
+
+                                   7/9
+                                   ---
+builtins/exit.def
+       - don't source ~/.bash_logout if subshell_environment is non-zero
+
+execute_command.c
+       - in execute_until_or_while, handle the case where `breaking' is
+         set in the loop test (e.g., by the job control code when a job
+         is stopped with SIGTSTP), but the return value from the test is
+         something that would cause the loop to break.  Need to decrement
+         `breaking' in this case
+
+                                  7/10
+                                  ----
+execute_cmd.c
+       - in execute_in_subshell, make sure a command of type cm_subshell
+         inherits its `enclosing' command's CMD_IGNORE_RETURN flag
+
+variables.c
+       - in maybe_make_export_env, don't allow restricted shells to put
+         exported functions in the export environment
+
+                                  7/11
+                                  ----
+lib/glob/strmatch.h
+       - renamed old fnmatch.h
+       - changed guard #ifdef to _STRMATCH_H
+       - include system <fnmatch.h> if HAVE_LIBC_FNM_EXTMATCH is defined
+
+lib/glob/strmatch.c
+       - renamed old fnmatch.c
+       - include "strmatch.h"
+       - if HAVE_LIBC_FNM_EXTMATCH is defined, define a dummy version of
+         strmatch() that just calls fnmatch(3)
+
+lib/glob/glob.c
+       - include "strmatch.h"
+       - fnmatch -> strmatch
+
+Makefile.in, lib/glob/Makefile.in
+       - fnmatch -> strmatch
+
+{bashhist,execute_cmd,pathexp,pcomplete,shell,stringlib,subst,test}.c,
+pathexp.h,builtins/help.def
+       - include <glob/strmatch.h>
+       - fnmatch -> strmatch
+
+execute_cmd.c
+       - broke the code that parses the interpreter name from a #! line
+         out from execute_shell_script to a new function, getinterp()
+       - call getinterp from execute_shell_script
+       - use return value from getinterp in error message about bad
+         #! interpreter in shell_execve
+
+                                  7/12
+                                  ----
+lib/readline/isearch.c
+       - the last isearch string is now remembered in a new static variable,
+         last_isearch_string
+       - if ^R^R is typed, readline now searches for the remembered isearch
+         string, if one exists
+
+                                  7/24
+                                  ----
+pcomplete.h
+       - extern declaration for completions_to_stringlist()
+
+                                  7/25
+                                  ----
+builtins/complete.def
+       - make compgen handle -o default option
+       - make compgen return success only if sl->list_len is non-zero,
+         indicating that there are items on the list
+
+                                  7/31
+                                  ----
+execute_cmd.c
+       - in execute_connection, force stdin to /dev/null for asynchronous
+         commands if job control is not active, not just if the shell is
+         running a shell script (since you can run `set -m' in a script)
+
+lib/readline/rltty.c
+       - make sure _rl_tty_restore_signals resets `tty_sigs_disabled' on
+         successful restoration of the terminal modes
+       - make sure _rl_tty_disable_signals turns off IXON so that ^S and
+         ^Q can be read by rl_quoted_insert
+
+                                   8/1
+                                   ---
+aclocal.m4
+       - new check for FNM_EXTMATCH being defined in <fnmatch.h>, as Ullrich
+         Drepper intends to do for new versions of GNU libc
+
+config.h.in
+       - new definition for HAVE_LIBC_FNM_EXTMATCH
+
+configure.in
+       - check for fnmatch, but don't define anything in config.h
+       - call BASH_FUNC_FNMATCH_EXTMATCH to check for FNM_EXTMATCH
+
+                                   8/2
+                                   ---
+alias.h
+       - remove bogus extern declaration for xmalloc()
+       - include "stdc.h"
+       - add prototype declarations for all extern function declarations
+
+xmalloc.c,lib/readline/xmalloc.c
+       - fix xmalloc to return a PTR_T
+       - fix xrealloc to return a PTR_T and take a PTR_T as first argument
+
+include/ansi_stdlib.h
+       - extern declarations for malloc and realloc have them return PTR_T
+
+xmalloc.h
+       - new file, with extern declarations for functions in xmalloc.c
+
+general.h
+       - removed extern declarations for functions in xmalloc.c
+       - include xmalloc.h
+
+Makefile.in,builtins/Makefile.in
+       - update dependencies to include xmalloc.h
+
+parse.y,{alias,array,bashline,bracecomp,execute_cmd,findcmd,flags,general,
+hashcmd,locale,mailcheck,make_cmd,pathexp,pcomplete,print_cmd,stringlib,
+subst,unwind_prot,variables}.c
+builtins/{common,evalfile}.c
+builtins/{cd,command,enable,exec,printf,read,set}.def
+lib/sh/{makepath,netopen,pathphys,setlinebuf,shquote,snprintf,stringlist,
+strtrans,tmpfile}.c
+lib/readline/{util,terminal,shell,readline,macro,kill,isearch,input,
+histfile,histexpand,display,complete,bind}.c
+       - make sure all calls to xmalloc are cast to the right return value
+
+siglist.c
+       - include xmalloc.h
+
+parse.y,{alias,bashline,bracecomp,expr,make_cmd,nojobs,print_cmd,subst}.c
+builtins/{fc,printf,read}.def
+lib/sh/snprintf.c, lib/tilde/tilde.c
+lib/readline/{bind,display,histexpand,isearch,macro,util,vi_mode}.c
+       - make sure all calls to xrealloc are cast to the right return value
+
+lib/sh/{netopen,setlinebuf,shquote,snprintf}.c, lib/tilde/tilde.c
+       - include xmalloc.h, remove extern declaration of xmalloc
+
+lib/readline/xmalloc.h
+       - xmalloc and xrealloc should return PTR_T
+
+lib/readline/rldefs.h
+       - don't include an extern declaration for xmalloc
+
+                                   8/7
+                                   ---
+support/shobj-conf
+       - fixed up commented-out stanzas for HP's unbundled C compiler on
+         HP/UX
+
+support/bashbug.sh
+       - force the subject to be changed from the default
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+       - document that transpose-words swaps the last two words on the line
+         if point is at the end of the line
+
+                                   8/9
+                                   ---
+stringlib.c
+       - fix possible infinite recursion problem with null pattern in
+         strsub()
+
+hashlib.c
+       - new function copy_hash_table to copy a hash table using a caller-
+         supplied function to copy item data (defaults to savestring())
+
+hashlib.h
+       - new extern declaration for copy_hash_table
+
+builtins/declare.def
+       - changes so that declare [-a] var=value assigns `value' to element 0
+         of array variable `var' like ksh93
+       - change so that declare [-a] var[N]=value assigns `value' to element
+         N of array variable `var' like ksh93
+
+                                  8/13
+                                  ----
+arrayfunc.c
+       - new file, for miscellaneous array functions
+
+arrayfunc.h
+       - new file, extern declarations for functions in arrayfunc.c
+
+variables.c
+       - move convert_var_to_array, bind_array_variable,
+         assign_array_from_string, assign_array_var_from_word_list,
+         assign_array_var_from_string, quote_array_assignment_chars,
+         skipsubscript, unbind_array_element, print_array_assignment
+         to arrayfunc.c
+
+shell.h
+       - include arrayfunc.h after variables.h
+
+variables.h
+       - remove above extern function declarations moved to arrayfunc.h
+       - add extern declaration for var_lookup
+
+Makefile.in
+       - add arrayfunc.c, arrayfunc.h in appropriate places
+       - add arrayfunc.h to dependencies
+
+subst.c
+       - move valid_array_reference, array_expand_index, array_variable_part,
+         array_value_internal, array_value (now global), get_array_value,
+         do_array_element_assignment to arrayfunc.c
+
+subst.h
+       - extern declarations for functions above moved to arrayfunc.h
+
+arrayfunc.h
+       - extern declarations for above functions from subst.c
+
+subst.[ch]
+       - string_list_dollar_star and string_list_dollar_at are now global
+         functions
+       - quote_escapes is now a global function
+
+subst.c
+       - maybe_expand_string -> expand_string_if_necessary
+       - expand_string_to_string -> expand_string_to_string_internal
+       - new functions: expand_string_to_string and
+         expand_string_unsplit_to_string, which call
+         expand_string_to_string_internal with expand_string and
+         expand_string_unsplit as the FUNC arguments, respectively
+
+arrayfunc.c
+       - change array_expand_index to call expand_string_to_string instead
+         of maybe_expand_string
+
+                                  8/14
+                                  ----
+shell.c
+       - in execute_env_file, call expand_string_unsplit_to_string
+
+mailcheck.c
+       - in check_mail, call expand_string_to_string
+
+variables.c
+       - in assign_in_env, call expand_string_unsplit_to_string
+
+arrayfunc.c
+       - new function, array_variable_name, splits an array reference into
+         a name (which is returned as a new string) and subscript
+       - change array_variable_part to just call array_variable_name and
+         look up the string returned with find_variable
+       - new function, find_or_make_array_variable (name, flags) which will
+         look up an array variable and convert a string variable to an
+         array if necessary.  The FLAGS argument, if non-zero, says to
+         check the readonly and noassign attributes and fail if either is set
+
+builtins/read.def
+       - make `read -a aname' honor any readonly status of `aname'
+       - read -a now calls find_or_make_array_variable with FLAGS value 1
+
+arrayfunc.[ch], subst.c, builtins/{declare,read}.def
+       - do_array_element_assignment -> assign_array_element
+
+                                  8/20
+                                  ----
+parse.y
+       - changed `for' command grammar to allow missing word list after `IN'
+         token, like latest POSIX drafts require
+
+lib/sh/tmpfile.c
+       - in sh_mktmpname(), check for filenum == 0 and init to non-zero number
+         in this case.  it can happen on arithmetic overflow
+
+support/mkversion.sh
+       - added `[0-9].[0-9][0-9][a-z]' as an acceptable value for a
+         distribution to allow for intermediate versions, like 2.05a
+
+support/config.guess
+       - removed the addition of the output of `/usr/bin/objformat' when
+         creating the canonical name on FreeBSD machines, so the canonical
+         name is once again `freebsd4.2' instead of `freebsdelf4.2'
+
+                                  8/22
+                                  ----
+lib/readline/{rlstdc,history,keymaps,readline,rldefs,rlprivate,rlshell,
+rltypedefs,xmalloc}.h
+lib/readline/{bind,compat,complete,display,funmap,histexpand,histsearch,
+input,isearch,kill,nls,parens,readline,rltty,search,shell,signals,vi_mode
+       - changed __P to PARAMS
+
+lib/tilde/tilde.[ch]
+       - changed __P to PARAMS
+
+{Makefile,configure}.in
+       - changed the version number to 2.05a
+       - changed the release status to `alpha1'
+
+                                  8/23
+                                  ----
+support/shobj-conf
+       - support for building shared libraries on Darwin/MacOS X
+
+siglist.h
+       - extern declaration for strsignal() to compensate for lack of
+         a definition in some system include files
+
+jobs.c
+       - remove casts from strsignal() calls
+
+[bash-2.05a-alpha1 frozen]
+
+                                  8/27
+                                  ----
+[bash-2.05a-alpha1 released]
+
+                                  8/27
+                                  ----
+execute_cmd.c
+       - fix eval_arith_for_expr to handle the case where the expanded
+         word list is NULL, returning 0 in this case
+
+print_cmd.c
+       - in print_function_def, make sure that func_redirects is assigned
+         a value before being used
+
+                                  8/28
+                                  ----
+alias.c
+       - include <ctype.h> for definition of isalpha()
+
+bashhist.h
+       - add prototypes for extern function declarations
+
+flags.c
+       - include bashhist.h for extern function declarations
+
+mksyntax.c
+       - include <unistd.h> if HAVE_UNISTD_H is defined in config.h
+
+parse.y
+       - include test.h for extern function declarations
+
+externs.h
+       - change extern declaration for setlinebuf to sh_setlinebuf
+
+stringlib.c
+       - include <glob/glob.h> for extern function declarations
+
+variables.h
+       - add function prototypes for all of the sv_* functions
+
+builtins/common.h
+       - add extern declarations for set_shellopts() and parse_shellopts()
+         from builtins/set.def
+
+variables.c
+       - include "hashcmd.h" for extern declaration for flush_hashed_filenames
+       - include "pathexp.h" for extern declaration for setup_glob_ignore
+
+lib/malloc/malloc.c
+       - cast to `long' instead of `int' in memalign for 64-bit machines
+
+{pcomplete,trap}.c
+       - changed printf escape sequences used to print pointers to %p
+
+lib/readline/undo.c
+       - include "xmalloc.h" for extern function declaration
+
+input.h
+       - add function prototypes to extern declarations for getc_with_restart
+         and ungetc_with_restart
+
+variables.[ch]
+       - changed type of `function' member of `struct name_and_function' to
+         `sv_func_t', which is defined and prototyped in variables.h
+       - map_over now takes an `sh_var_map_func_t *'
+
+shell.h
+       - start of a set of function pointer typedefs like those in
+         lib/readline/rltypedefs.h
+
+hashlib.[ch]
+       - second paramter to flush_hash_table is now an `sh_free_func_t *'
+
+trap.c
+       - parameter to reset_or_restore_signal_handlers is now an
+         `sh_resetsig_func_t *'
+
+pcomplete.h, pcomplib.c
+       - function pointer argument to print_all_compspecs is now an
+         `sh_csprint_func_t *'
+       - function pointer `list_getter' element of an `ITEMLIST' is now
+         prototyped with __P((...)) instead of using `Function *'
+
+jobs.[ch]
+       - `j_cleanup' member of a JOB is now an `sh_vptrfunc_t *'
+
+alias.c
+       - map_over_aliases now takes an `sh_alias_map_func_t *'
+       - free_alias_data now takes a `PTR_T'
+
+pathexp.c
+       - function pointer argument to ignore_globbed_names is now an
+         `sh_ignore_func_t *' 
+
+bashline.c
+       - function pointer argument to _ignore_completion_names is now an
+         `sh_ignore_func_t *' 
+
+pathexp.h,{bashhist,bashline.c
+       - `item_func' member of a `struct ignorevar' is now an
+         `sh_iv_item_func_t *'
+
+builtins/evalfile.c
+       - `errfunc' is now an `sh_vmsg_func_t *'
+
+jobs.c
+       - map_over_job now takes an `sh_job_map_func_t *' as its first argument
+
+array.[ch]
+       - function pointer argument to array_walk is now an
+         `sh_ae_map_func_t *'
+
+general.c
+       - tilde_expansion_preexpansion_hook has type `tilde_hook_func_t *',
+         and so the assignment in tilde_initialize doesn't need a cast
+
+list.c
+       - map_over_words now takes an `sh_icpfunc_t *' as its second argument
+
+input.h
+       - the `getter' and `ungetter' function pointer members of a
+         BASH_INPUT are now of types `sh_cget_func_t *' and
+         `sh_cunget_func_t *' respectively
+       - init_yy_io now takes an `sh_cget_func_t *' as its first argument and
+         an `sh_cunget_func_t *' as its second
+
+parse.y
+       - init_yy_io now takes an `sh_cget_func_t *' as its first argument and
+         an `sh_cunget_func_t *' as its second
+       - initialize_bash_input casts bash_input.getter and bash_input.ungetter
+         appropriately
+
+builtins/mkbuiltins.c
+       - make the extern function definitions written to builtext.h have
+         prototypes with __P((...))
+       - include "stdc.h"
+       - change Function to mk_handler_func_t
+       - fixed comment_handler to take the right number of args
+       - prototyped all the handler functions with __P((...))
+
+builtins.h
+       - the `function' member of a struct builtin is now of type
+         `sh_builtin_func_t *'
+
+builtins/common.[ch]
+       - last_shell_builtin, this_shell_builtin are now of type
+         `sh_builtin_func_t *'
+       - find_shell_builtin, builtin_address, find_special_builtin now return
+         `sh_builtin_func_t *'
+
+builtins/exit.def, {execute_cmd,jobs,nojobs,variables}.c, parse.y
+       - changed all declarations of last_shell_builtin and this_shell_builtin
+
+execute_cmd.c
+       - execute_builtin, execute_builtin_or_function,
+         execute_subshell_builtin_or_function now take an
+         `sh_builtin_func_t *' instead of a `Function *' for argument
+       - changed appropriate variables from `Function *' to
+         `sh_builtin_func_t *'
+
+builtins/{bind,builtin,enable,read,setattr}.def
+       - replaced uses of `Function *' in variable declarations with
+         appropriate types (sh_builtin_func_t * or rl_command_func_t *)
+
+builtins/set.def
+       - set_func and get_func members of binary_o_options are now of types
+         `setopt_set_func_t *' and `setopt_get_func_t *', which are
+         prototyped
+
+builtins/shopt.def
+       - set_func member of shopt_vars is now of type `shopt_set_func_t *'
+
+bashline.c
+       - enable_hostname_completion now returns `int' (the old value of
+         perform_hostname_completion)
+
+[The only use of Function and VFunction now is for unwind-protects]
+
+                                   9/4
+                                   ---
+lib/sh/getcwd.c
+       - use const define from config.h rather than `CONST'
+       - use PTR_T define from xmalloc.h rather than `PTR'
+       - include xmalloc.h for PTR_T
+       - remove PATH_MAX define, rely on value from maxpath.h
+
+{general,mailcheck}.c, lib/sh/{pathcanon,pathphys}.c
+       - don't include maxpath.h directly; it's already included by shell.h
+
+lib/sh/mailstat.c
+       - new `mailstat()' implementation, to stat a mailbox file for
+         mail checking.  handles maildir-style mail directories with one
+         file per message and creates a dummy stat struct from them
+
+lib/sh/Makefile.in
+       - add mailstat.c and mailstat.o in the appropriate places
+
+lib/malloc/malloc.c
+       - augmented implementation with wrapper functions that pass in file
+         and line number information from cpp.  currently unused, but a
+         placeholder for future debugging and use tracking
+
+lib/malloc/shmalloc.h
+       - new file, extern declarations for allocation wrapper functions for
+         use by the shell (and others, I guess)
+
+xmalloc.[ch]
+       - wrapper functions for xmalloc, xfree, xrealloc (sh_ prefixed) that
+         pass cpp line number information through to the malloc functions,
+         if USING_BASH_MALLOC is defined
+
+                                   9/5
+                                   ---
+lib/malloc/gmalloc.c
+       - removed; no longer part of distribution
+
+lib/malloc/Makefile.in
+       - removed references to gmalloc.[co]
+
+configure.in, doc/bashref.texi
+       - removed references to `--with-glibc-malloc' configure option
+
+{configure,Makefile}.in
+       - changed the way bash malloc is configured into the Makefile, making
+         it more like how readline is configured.  If the bash malloc is
+         not configured in, nothing in lib/malloc will be built
+
+                                   9/6
+                                   ---
+lib/malloc/imalloc.h
+       - new file, some internal malloc definitions
+
+lib/malloc/mstats.h
+       - new file, definitions for malloc statistics structs and functions
+
+lib/malloc/trace.c
+       - new file, malloc tracing functions (currently just print messages
+         to stderr), code is #ifdef MALLOC_TRACE
+
+lib/malloc/stats.c
+       - new file, moved malloc stats code from malloc.c to here
+
+lib/malloc/malloc.c
+       - moved some definitions to imalloc.h
+       - moved stats code to stats.c
+       - malloc tracing calls added to internal_{malloc,realloc,free}, all
+         #ifdef MALLOC_TRACE
+
+lib/malloc/Makefile.in, Makefile.in
+       - added {imalloc,mstats}.h, {trace,stats}.c
+
+parse.y
+       - changed decode_prompt_string to save and restore $?
+         (last_command_exit_value) around calls to expand_prompt_string(),
+         so command substitutions in PS1, etc. don't change $?
+
+{array,subst}.c
+       - a couple more arrayind_t fixes from Paul Eggert
+
+configure.in
+       - remove redundant check for wait3(2)
+
+redir.h
+       - fixed a typo (stdin_redirs -> stdin_redirects)
+
+                                  9/10
+                                  ----
+execute_cmd.c
+       - remove check for \n and \r from WHITESPACE macro, since those
+         chars are not whitespace as returned by the whitespace(c) macro
+       - getinterp now takes a `char *' as first arg, not unsigned char *
+       - execute_shell_script now takes a `char *' as first arg, not
+         unsigned char *
+       - fix typo in forward declaration for `initialize_subshell'
+       
+general.[ch]
+       - check_binary_file now takes a (char *) argument, not unsigned char *
+       - pass unsigned char to isspace and isprint because of ISO C fuckup
+       - bash_tilde_expand now takes a `const char *' as its argument
+
+builtins/evalfile.c, shell.c
+       - buffer passed to check_binary_file is char, not unsigned char
+
+parse.y
+       - fix extern declaration for yyerror()
+       - yyerror now takes a `const char *' as first arg
+
+{error,jobs}.c
+       - fixes to printf-style functions to handle pids wider than an int
+
+lib/readline/{isearch,vi_mode}.c
+       - fix call to rl_message in rl_display_search (remove extra arg)
+
+variables.c
+       - fix missing argument to builtin_error in make_local_variable
+
+builtins/getopts.def
+       - since getopts takes no options, change while loop calling
+         internal_getopts to a simple `if' check
+
+builtins/printf.def
+       - since printf takes no options, change while loop calling
+         internal_getopts to a simple `if' check
+
+lib/readline/bind.c
+       - remove _SET_BELL macro, expand code inline
+
+lib/readline/input.c
+       - change _rl_input_available to use either select or FIONREAD,
+         but not both
+
+lib/readline/readline.c
+       - fix rl_digit_loop to remove unreachable code at end of loop
+
+{bashhist,bashline,expr,jobs,redir,shell}.c, builtins/fc.def, lib/sh/snprintf.c
+       - bracket unused functions with #ifdef INCLUDE_UNUSED/#endif
+       - remove some unused variables
+
+execute_cmd.c
+       - remove #ifdef'd code that allowed `return' to terminate a select
+         statement
+
+expr.c
+       - remove some extraneous tests from strlong()
+
+array.h
+       - arrayind_t is now a long, since shell arithmetic is performed as
+         longs
+       - remove second declaration of new_array_element
+
+builtins/printf.def
+       - in mklong, xrealloc cannot return NULL, so don't check for it
+       - remove some #if 0 code
+       - fix core dump triggered by a format specification with more than
+         one `*'
+       - remove `foundmod', since its value mirrors `modchar != 0'
+       - include "common.h" for builtin_{error,usage} declarations
+
+Makefile.in,builtins/Makefile.in
+       - updated some dependencies due to new include files
+
+pcomplete.c
+       - include "execute_cmd.h" for declaration of execute_shell_function
+
+arrayfunc.c
+       - include <stdio.h> for printf
+       - include "builtins/common.h" for builtin_error declaration
+
+builtins/evalstring.c
+       - include "../trap.h" for run_trap_cleanup declaration
+
+builtins/help.def
+       - include "common.h" instead of locally declaring builtin_error
+         and builtin_usage
+
+error.h
+       - add extern declaration for itrace()
+       - add prototype to extern declaration of get_name_for_error
+       - file_error now takes a `const char *' as first argument
+
+externs.h
+       - added prototype for sh_setlinebuf declaration, bracketed with
+         NEED_SH_SETLINEBUF_DECL so we don't need stdio.h everywhere
+       - add extern declaration for parse.y:return_EOF()
+
+shell.c
+       - add NEED_SH_SETLINEBUF_DECL before including shell.h
+
+lib/readline/callback.c
+       - include <stdlib.h> or "ansi_stdlib.h" for abort declaration
+
+quit.h
+       - remove declaration of throw_to_top_level
+
+subst.c
+       - remove unused extern declaration for getopts_reset
+
+lib/sh/netopen.c
+       - include <shell.h> for legal_number, etc.
+       - add prototype for inet_aton extern declaration
+
+lib/sh/clock.c
+       - include <stdc.h> for __P declaration
+       - add extern declaration for get_clk_tck
+
+support/mkversion.sh
+       - changed so that extern function declarations for functions in
+         version.c (moved from externs.h) are in the generated version.h
+
+shell.h
+       - include version.h
+
+version.c
+       - various `char *' version variables are now `const char *'
+
+general.h
+       - add prototype for same_file, bracketed with _POSIXSTAT_H
+         #ifdef, since that's what include/posixstat.h defines
+
+builtins/common.[ch]
+       - _evalfile, maybe_execute_file, source_file, and fc_execute_file
+         now take a `const char *' as their first argument
+
+eval.c
+       - removed extern declaration of yyparse; it's in externs.h
+
+parse.y
+       - added prototypes to static forward function declarations
+       - changed local `all_digits' variable in read_token_word () to
+         all_digit_token to avoid clash with all_digits() function in
+         general.c
+
+{bashhist,copy_cmd,make_cmd,hashlib,mailcheck}.c
+       - added prototypes for static function declarations
+
+shell.h
+       - add extern declarations for interactive, interactive_shell,
+         changed c files with extern declarations
+
+pcomplete.c
+       - changed it_init_aliases to avoid shadowing global variable
+         `aliases'
+
+bashline.c,pathexp.c,general.h
+       - sh_ignore_func_t is now a pointer to a function taking a
+         `const char *'; users changed
+
+configure.in
+       - test for <strings.h>
+
+config.h.in
+       - add #undef HAVE_STRINGS_H
+
+bashansi.h
+       - change like recommended in autoconf manual
+
+                                  9/11
+                                  ----
+[a date which will live in infamy.  prayers for the victims.]
+
+execute_cmd.c
+       - don't use an absolute index into abuf in mkfmt, use
+         sizeof(abuf) to compute last index
+
+builtins/common.c
+       - fix read_octal to do a better job of detecting overflow while
+         iterating through the string
+
+builtins/umask.def
+       - change octal-print mode to print 4 digits, like other shells
+       - cast umask to unsigned long to avoid problems on systems where
+         it's wider than an int (POSIX doesn't guarantee that mode_t is
+         no wider than an int, but real-world systems use int)
+
+builtins/printf.def
+       - mklong can never return NULL (it uses xrealloc), so the mainline
+         doesn't need to check for NULL returns
+       - new function, getldouble (long double *), to get long doubles
+       - mklong now takes a `char *' as its second argument, the modifier(s)
+         to use
+       - changed use of `modchar' to handle more than a single modifier
+         character
+       - changed to handle `long double' and `L' formats better, rather
+         than discarding long double information
+       - since printf now follows the POSIX.2 rules for conversion errors,
+         we can dispense with the status returns from the get* functions
+       - make the get* functions as similar in structure as possible,
+         removing type casts, etc.
+
+lib/sh/timeval.c,execute_cmd.c
+       - change some instances of `long' to `time_t', for systems where
+         a time_t is bigger than a long
+
+jobs.c
+       - include "posixtime.h" instead of <sys/time.h>
+
+config.h.in
+       - add defines for HAVE_DECL_CONFSTR, HAVE_DECL_STRTOLD,
+         HAVE_DECL_SBRK, HAVE_DECL_PRINTF
+       - remove defines for SBRK_DECLARED and PRINTF_DECLARED
+       - add _GNU_SOURCE define
+
+configure.in
+       - add AC_CHECK_DECLS for strtold, confstr, sbrk, printf
+       - remove call to BASH_FUNC_SBRK_DECLARED
+       - remove call to BASH_FUNC_PRINTF
+
+xmalloc.c, lib/malloc/malloc.c
+       - change check of SBRK_DECLARED to HAVE_SBRK_DECL
+
+print_cmd.c
+       - change PRINTF_DECLARED to HAVE_DECL_PRINTF
+
+builtins/evalstring.c, builtins/common.h
+       - parse_and_execute now takes a `const char *' as its second argument
+
+input.h,parse.y
+       - with_input_from_* functions now take a `const char *' as their
+         second argument
+       - init_yy_io now takes a `const char *' as its fourth argument
+
+parse.y,externs.h
+       - parse_string_to_word_list now takes a `const char *' as its second
+         argument
+
+tests/builtins.right
+       - change output to account for extra digit in umask output
+
+pcomplib.c
+       - free_progcomp now takes a PTR_T argument
+
+builtins/bashgetopt.h
+       - include <stdc.h>
+       - add prototypes to extern declarations
+
+builtins/shopt.def
+       - add prototypes to static function declarations
+
+builtins/{fc,umask,wait}.def, builtins/{bashgetopt,common}.c
+       - include <ctype.h> for isdigit macro (referenced by `digit(x)')
+
+lib/readline/complete.c
+       - added more static function declarations with prototypes
+
+                                  9/12
+                                  ----
+lib/sh/tmpfile.c
+       - use `^' instead of `*' in sh_mktmpname to make filenames a bit
+         more random
+
+include/stdc.h,lib/readline/rldstdc.h
+       - add __attribute__ definition 
+
+builtins/common.h
+       - add printf __attribute__ to declaration of builtin_error
+
+error.h
+       - add printf __attribute__ to declaration of programming_error,
+         report_error, parser_error, fatal_error, sys_error, internal_error,
+         internal_warning
+
+lib/readline/readline.h
+       - add printf __attribute__ to declaration of rl_message
+
+pcomplete.c
+       - add printf __attribute__ to declaration of debug_printf
+
+print_cmd.c
+       - add printf __attribute__ to declarations of cprintf, xprintf
+
+include/chartypes.h
+       - new file, includes <ctype.h> and defines macros that check for
+         safe (ascii) arguments before calling the regular ctype macros
+
+{alias,bashline,execute_cmd,expr,findcmd,general,locale,mksyntax,stringlib,subst,variables}.c
+parse.y
+builtins/{bashgetopt,common}.c
+builtins/{fc,printf,umask,wait}.def
+lib/glob/strmatch.c
+lib/sh/{oslib,pathcanon,pathphys,snprintf,strcasecmp,strindex,stringvec,strtod,strtol,strtrans}.c
+examples/loadables/{head,sleep}.c
+       - include "chartypes.h" or <chartypes.h> instead of <ctype.h>
+
+Makefile.in,{builtins,lib/{glob,sh}}/Makefile.in
+       - update dependencies to include chartypes.h
+
+lib/sh/inet_aton.c
+       - use `unsigned char' instead of `char' to pass to ctype.h functions
+
+lib/sh/netopen.c
+       - check for '0' <= host[0] <= '9' in _getaddr instead of using
+         isdigit
+
+subst.c,lib/sh/shquote.c
+       - change array subscripts into sh_syntaxtab from `char' to
+         `unsigned char'
+
+{alias,bashline,execute_cmd,expr,general,subst}.c, parse.y
+builtins/{fc,printf,umask,wait}.def builtins/{bashgetopt,common}.c
+lib/sh/{pathcanon,pathphys,snprintf,strcasecmp,strindex,strtod,strtol,strtrans}.c
+examples/loadables/{head,sleep}.c
+       - change to use some of the new macros in chartypes.h
+       - remove old local macro definitions now provided by chartypes.h
+
+general.h
+       - remove definition of isletter, ISOCTAL, digit, digit_value
+       - change legal_variable_starter and legal_variable_char to use
+         chartypes.h macros
+       - change ABSPATH to use chartypes.h macros
+
+lib/readline/util.c
+       - change to use Paul Eggert's FUNCTION_FOR_MACRO define to define
+         function replacements for macros in chardefs.h
+
+lib/readline/chardefs.h
+       - added some of the same macros as in chartypes.h
+       - change _rl_lowercase_p, _rl_uppercase_p, _rl_digit_p,
+         _rl_to_upper, _rl_to_lower to use new IS* macros
+       - added _rl_isident macro from vi_mode.c:isident
+
+lib/readline/{bind,complete,nls}.c
+       - change to use some of the new macros from chardefs.h
+
+lib/readline/vi_mode.c
+       - isident -> _rl_isident
+       - remove local defines of macros in chardefs.h
+
+lib/sh/strtol.c
+       - updated to new version, modified from glibc 2.2.4 and sh-utils-2.0.
+         This one can do strtoll and strtoull, if necessary
+
+                                  9/13
+                                  ----
+builtins/ulimit.def
+       - changed get_limit so it retrieves both hard and soft limits
+         instead of one or the other
+       - changed callers of get_limit
+       - changed getmaxvm to take soft limit, hard limit as arguments
+       - changed getmaxuprc to just take a single argument, the value
+       - changed calls to printone() to pass soft limit or hard limit
+         depending on `mode' instead of using old current_limit variable
+       - moved check for out-of-range limits in ulimit_internal into the
+         block that converts a string argument to a value of type rlim_t
+       - changed RESOURCE_LIMITS struct to break the description into a
+         description string and separate scale factor string
+       - changed print_all_limits to print a single error message if
+         get_limit fails, including limits[i].description now that the
+         scale factor has been removed from the description string
+       - removed DESCFMT define, since it's now used only in printone()
+       - changed printone to print the option character associated with a
+         particular limit if we're printing multiple limits
+       - changed calls to builtin_error to print the description associated
+         with a limit if setting or getting the limit fails
+       - added support for new POSIX 1003.1-200x rlim_t values:
+         RLIM_SAVED_CUR and RLIM_SAVED_MAX, which expand to the current
+         soft and hard limits, whatever they are
+       - changed printone to print `hard' or `soft' if the current limit is
+         RLIM_SAVED_MAX or RLIM_SAVED_CUR, respectively
+       - changed ulimit_internal to handle new `hard' and `soft' arguments
+       - changed help text do describe the special limit arguments `hard',
+         `soft', and `unlimited'
+
+doc/{bash.1,bashref.texi}
+       - documented new `hard' and `soft' limit arguments to `ulimit'
+
+hashlib.[ch]
+       - find_hash_item now takes a `const char *' is its first argument
+       - hash_string now takes a `const char *' is its first argument
+       - remove_hash_item now takes a `const char *' as its first argument
+
+pcomplib.c
+       - removed cast from first argument to find_hash_item in find_compspec
+
+general.[ch]
+       - absolute_program now takes a `const char *' as its argument
+       - absolute_pathname now takes a `const char *' as its argument
+
+lib/glob/glob.[ch]
+       - glob_pattern_p now takes a `const char *' as its argument
+
+bashline.c
+       - removed cast from first argument to absolute_program in
+         command_word_completion_function
+       - removed cast from first argument to glob_pattern_p in
+         attempt_shell_completion
+
+findcmd.[ch]
+       - find_absolute_program, find_user_command, find_path_file,
+         search_for_command, user_command_matches now take a
+         `const char *' as their first argument
+       - file_status, executable_file, is_directory, executable_or_directory
+         now take a `const char *' as their argument
+       - _find_user_command_internal, find_user_command_internal,
+         find_user_command_in_path 
+
+lib/sh/makepath.c, externs.h
+       - changed sh_makepath so it takes `const char *' for its first
+         two arguments
+
+hashcmd.[ch]
+       - find_hashed_filename now takes a `const char *' as its first arg
+       - remove_hashed_filename now takes a `const char *' as its first arg
+
+variables.[ch]
+       - new_shell_variable, var_lookup, shell_var_from_env_string,
+         find_name_in_env_array, bind_function, makunbound,
+         bind_name_in_env_array, bind_tempenv_variable, bind_variable
+         now take a `const char *' as their first arg
+       - find_function, make_new_variable, find_tempenv_variable,
+         find_variable_internal, find_variable, set_func_read_only,
+         set_func_auto_export, all_variables_matching_prefix, assign_in_env,
+         assignment, kill_local_variable, make_local_variable, unbind_variable
+         now take a `const char *' as their arg
+       - mk_env_string now takes `const char *' arguments
+
+arrayfunc.[ch]
+       - skipsubscript now takes a `const char *' as its argument
+
+                                  9/17
+                                  ----
+lib/readline/complete.c
+       - attempt to preserve case of what the user typed in
+         compute_lcd_of_matches if we're ignoring case in completion
+
+builtins/{let,pushd}.def,{execute_cmd,expr}.c
+       - change some 0L constants to 0 and let the compiler sort it out
+
+                                  9/18
+                                  ----
+lib/malloc/alloca.c
+       - alloca now takes a `size_t' argument
+
+include/memalloc.h
+       - if we're providing an extern function declaration for alloca,
+         use `void *' and prototype if __STDC__ is defined
+       - if HAVE_ALLOCA_H is defined, but C_ALLOCA is defined, don't
+         define HAVE_ALLOCA
+
+                                  9/19
+                                  ----
+subst.c
+       - do_assignment_internal, do_assignment, and do_assignment_no_expand
+         now take a `const char *' as their first argument
+
+general.h
+       - a `sh_assign_func_t' is now a function taking a `const char *' and
+         returning int
+
+hashcmd.c
+       - free_filename_data now takes a `PTR_T' argument to agree with the
+         typedef for `sh_free_func_t'
+
+lib/sh/snprintf.c
+       - use TYPE_MAXIMUM define like strtol.c instead of huge constants
+
+                                  9/20
+                                  ----
+lib/sh/snprintf.c
+       - don't bother to compile the bulk of the body unless HAVE_SNPRINTF
+         or HAVE_ASPRINTF is not defined
+
+                                  9/24
+                                  ----
+flags.c
+       - ignore `set -n' if the shell was started interactively
+
+lib/readline/readline.c
+       - initialize readline_echoing_p to 0; let the terminal-specific code
+         in rltty.c set it appropriately
+
+lib/malloc/malloc.c
+       - changed internal_memalign() slightly to avoid compiler warnings about
+         negating an unsigned variable (-alignment -> (~alignment + 1))
+
+                                  9/27
+                                  ----
+lib/readline/readline.c
+       - changed rl_newline to set _rl_history_saved_point appropriately
+         for the {previous,next}_history code
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_history_preserve_point
+
+lib/readline/bind.c
+       - new bindable variable, `history-preserve-point', sets value of
+         _rl_history_preserve_point
+
+                                  10/1
+                                  ----
+lib/malloc/table.c
+       - new file, with a map of allocated (and freed) memory for debugging
+         multiple frees, etc.  Indexed by hash on values returned by
+         malloc(); holds size, file and line number info for last alloc or
+         free and a couple of statistics pointers
+
+lib/malloc/malloc.c
+       - a few cleanups; added calls for registering allocations and frees
+         if MALLOC_REGISTER is defined
+       - replaced MALLOC_RETURN with explicit MALLOC_NOTRACE define
+       - reordered fields in `struct...minfo' in `union mhead' to restore
+         eight-byte alignment
+       - added explicit checks for underflow in free and realloc since
+         checking mh_magic2 is not sufficient to detect everything (it's
+         no longer the last field in the struct, and thus not the bytes
+         immediately preceding what's returned to the user)
+       - new function, xbotch, for printing file and line number info for
+         the failed assertion before calling botch() (programming_error())
+
+configure.in
+       - replaced call to BASH_C_LONG_LONG with call to
+         AC_CHECK_TYPES([long long])
+       - moved the C compiler tests before the tests for various
+         system types, so we can know whether we have `long long'
+         before testing for 64-bit types
+       - if we have `long long', check for sizeof(long long) and save value
+
+aclocal.m4
+       - changed BASH_TYPE_BITS64_T to check `long long' before `long', but
+         after `double'
+
+                                  10/2
+                                  ----
+lib/malloc/malloc.c
+       - made malloc and realloc both agree on the rounding for a request of
+         size N (round up to nearest multiple of 8 after adjusting for
+         malloc overhead); uses new ALLOCATED_BYTES macro
+       - realloc and free now use new IN_BUCKET macro for underflow checks
+
+execute_cmd.c
+       - fixed time_command() to use `time_t' instead of `long' to hold
+         time stamps
+
+lib/sh/clock.c
+       - clock_t_to_secs now takes a `time_t *' second argument
+       - fixed print_clock_t to call clock_t_to_secs with right arguments
+
+lib/sh/timeval.c
+       - fixed print_timeval to make `minutes' a `long' and make its
+         structure identical to print_clock_t
+
+redir.c
+       - changed redirection_error to check for EBADF and use the file
+         descriptor being redirected from in the error message if it
+         is >= 0
+
+Makefile.in
+       - changed release status to `beta1'
+
+lib/glob/collsyms.h
+       - added a few ASCII symbols to the posix_collsyms array
+
+                                  10/3
+                                  ----
+aclocal.m4
+       - fixed typo in BASH_TYPE_BITS64_T
+
+configure.in
+       - added check for unsigned chars with AC_C_CHAR_UNSIGNED
+
+config.h.in
+       - added PROTOTYPES and __CHAR_UNSIGNED__ #defines
+
+general.h
+       - if CHAR_MAX is not define by <limits.h>, provide a definition
+
+builtins/printf.def
+       - change tescape() to mask \0 and \x escape sequences with 0xFF
+       - change tescape() to process at most two hex digits after a `\x'
+
+lib/sh/strtrans.c
+       - change strtrans() to mask \0 and \x escape sequences with 0xFF
+       - change strtrans() to process at most two hex digits after a `\x'.
+         This affects `echo -e' and $'...' processing
+
+lib/readline/bind.c
+       - changed rl_translate_keyseq() to process at most two hex digits
+         after a `\x'
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+       - changed documentation for key binding escape sequences to specify
+         that at most two hex digits after \x are translated
+       - changed documentation for key binding to specify that the result
+         of \nnn or \xhh escapes is an eight-bit value, not just ASCII
+
+doc/{bash.1,bashref.texi}
+       - changed documentation of $'...' to specify that at most two hex
+         digits after \x are translated
+       - changed `echo' documentation to specify that at most two hex
+         digits after \x are translated
+       - changed documentation for `echo' and $'...' to specify that the
+         result of \nnn or \xhh escapes is an eight-bit value, not just ASCII
+
+                                  10/4
+                                  ----
+lib/malloc/malloc.c
+       - changed interface for xbotch to pass memory address and error code
+         as two additional arguments
+       - call mregister_describe_mem from xbotch to get the last allocation
+         or free before the botch
+
+configure.in
+       - call AC_CHECK_DECLS([strsignal])
+
+config.h.in
+       - add HAVE_DECL_STRSIGNAL
+
+siglist.h
+       - make declaration of strsignal() dependent on !HAVE_DECL_STRSIGNAL
+
+                                  10/5
+                                  ----
+support/texi2html
+       - upgraded to version 1.64
+
+                                  10/9
+                                  ----
+aclocal.m4
+       - added check for `long long' to BASH_TYPE_PTRDIFF_T
+
+configure.in
+       - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ
+
+aclocal.m4
+       - replaced body of BASH_STRUCT_TERMIOS_LDISC with call to
+         AC_CHECK_MEMBER(struct termios.c_line, ...)
+       - replaced body of BASH_STRUCT_TERMIO_LDISC with call to
+         AC_CHECK_MEMBER(struct termios.c_line, ...)
+
+[bash-2.05a-beta1 frozen]
+
+                                  10/10
+                                  -----
+lib/sh/snprintf.c
+       - fixed exponent() to not smash the trailing zeros in the fraction
+         when using %g or %G with an `alternate form'
+       - fixed exponent() to handle the optional precision with %g and %G
+         correctly (number of significant digits before the exponent)
+
+                                  10/11
+                                  -----
+expr.c
+       - fixed strlong() to correct the values of `@' and `_' when
+         translating base-64 constants (64#@ == 62 and 64#_ == 64), for
+         compatibility with ksh
+
+lib/sh/itos.c
+       - added a slightly more flexible fmtlong() function that takes a
+         base argument and flags (for future use)
+       - rewrote itos and inttostr in terms of fmtlong
+
+lib/sh/fmtulong.c
+       - new file, converts unsigned long to string.  hooks for `unsigned
+         long long' in the future.  unused as yet
+
+                                  10/15
+                                  -----
+lib/readline/rltty.c
+       - change the SET_SPECIAL macro to avoid possible (but highly
+         unlikely) negative array subscripts
+
+error.h
+       - add __attribute__ to extern declaration of itrace (even though the
+         function isn't defined in released versions of bash)
+
+bashansi.h
+       - include <strings.h> if HAVE_STRINGS_H is defined, to get any extra
+         function declarations provided therein
+
+copy_cmd.c
+       - fix typo in forward declaration for copy_arith_for_command
+
+lib/malloc/stats.c
+       - make the accumulators in _print_malloc_stats be `unsigned long'
+         instead of `int'
+
+externs.h, sig.h
+       - add `__noreturn__' gcc attribute to exit_shell and jump_to_top_level
+         declarations
+
+lib/sh/mailstat.c, support/bashversion.c
+       - include <bashansi.h> for some string function declarations
+
+lib/malloc/shmalloc.h
+       - added extern declarations of functions that do malloc debugging
+
+lib/readline/{isearch,readline,vi_mode}.c
+       - make sure we index into _rl_keymap with a non-negative index
+
+parse.y
+       - make sure we index into sh_syntaxtab with a non-negative index
+
+lib/readline/vi_mode.c
+       - bound the vi_mark_chars array with the number of characters between
+         'a' and 'z' rather than using a fixed amount
+       - don't use _rl_lowercase_p when deciding whether the char read by
+         rl_vi_set_mark is a valid mark; just use 'a' <= char <= 'z'
+
+lib/readline/chardefs.h
+       - conditionally include memory.h and strings.h as in general.h
+       - replace ISASCII with IN_CTYPE_DOMAIN like other GNU software
+       - add defines for ISPRINT(c), ISLOWER(c) and ISUPPER(c)
+       - fix defines for _rl_lowercase_p, _rl_uppercase_p, _rl_digit_p,
+         _rl_pure_alphabetic, ALPHABETIC, _rl_to_upper, _rl_to_lower,
+         and _rl_isident to work on systems with signed chars
+
+include/chartypes.h
+       - replace ISASCII with IN_CTYPE_DOMAIN like other GNU software
+
+lib/sh/{strcasecmp,strtod,strtol}.c
+       - don't pass possibly-negative characters to tolower() or toupper()
+
+lib/glob/strmatch.c
+       - don't bother testing for isupper in FOLD; rely on TOLOWER macro
+         from <chartypes.h> to do it
+       - don't use local definitions of isblank, et al.; rely on macros
+         from <chartypes.h>
+
+lib/readline/{display,readline}.c, mksyntax.c
+       - use new ISPRINT macro instead of isprint()
+
+builtins/{kill.def,mkbuiltins.c},{error,execute_cmd,jobs,nojobs,subst}.c
+       - don't assume that a pid_t fits into an int for printing and other
+         uses
+
+variables.[ch]
+       - the unused put_gnu_argv_flags_into_env now takes a `long' pid
+         argument
+
+configure.in, config.h.in
+       - call AC_STRUCT_ST_BLOCKS, define HAVE_STRUCT_STAT_ST_BLOCKS if found
+       - check for strtoull(), define HAVE_STRTOULL if found
+       - check for uintmax_t, define to `unsigned long' if not found
+
+lib/sh/mailstat.c
+       - don't use st_blocks member of struct stat unless
+         HAVE_STRUCT_STAT_ST_BLOCKS is defined; otherwise use the st_nlink
+         field to return the total number of messages in a maildir-style
+         mail directory
+
+general.h,{alias,expr,general,subst,variables}.c
+builtins/{printf,read}.def
+lib/readline/{bind,complete,nls}.c
+lib/sh/{pathcanon,pathphys,shquote,snprintf,strindex,strtod,strtol,strtrans}.c
+       - cast args to ctype macros to unsigned char for systems with signed
+         chars; other fixes for signed chars
+
+lib/sh/{fmtullong,strtoull.c}
+       - new files, more support for `long long'
+
+Makefile.in, lib/sh/Makefile.in
+       - make fmtullong.o and strtoull.o part of libsh
+
+lib/sh/itos.c
+       - remove local copy of fmtlong; use fmtulong instead
+       - new functions: uitos, uinttostr work on `unsigned long'
+
+lib/sh/snprintf.c
+       - fixes to make `unsigned long long' work (%llu)
+       - fixes to make unsigned formats not print the sign when given
+         an unsigned long that is greater than LONG_MAX
+
+externs.h
+       - extern declarations for fmtulong, fmtulloing, strtoull
+       - extern declarations for uitos, uinttostr
+
+                                  10/16
+                                  -----
+configure.in
+       - move header checks before function checks
+       - move c compiler tests before header checks
+       - check for <inttypes.h> with BASH_HEADER_INTTYPES
+       - change type checks for intmax_t, uintmax_t to not attempt to
+         include <stdint.h>
+       - check for strtoimax, strtoumax, strtoll, strtol, strtoull, strtoul
+         with BASH_CHECK_DECL (for declarations in header files) and
+         AC_REPLACE_FUNCS (for availability and LIBOBJS substitution)
+       - remove check for have_long_long around sizeof check for long long
+         (since autoconf will give it a size of 0 if the type isn't found)
+
+config.h.in
+       - add a define for HAVE_INTTYPES_H
+       - add a define for HAVE_UNSIGNED_LONG_LONG
+       - add defines for HAVE_STRTOIMAX, HAVE_STRTOUMAX, HAVE_STRTOLL
+
+aclocal.m4
+       - new func, BASH_HEADER_INTTYPES, which just calls AC_CHECK_HEADERS
+         on <inttypes.h>; separate so it can be AC_REQUIREd
+       - AC_REQUIRE([BASH_HEADER_INTTYPES]) in BASH_CHECK_TYPE
+       - include <inttypes.h> in BASH_CHECK_TYPE if HAVE_INTTYPES_H is
+         defined
+       - change AC_DEFINE to AC_DEFINE_UNQUOTED in BASH_CHECK_TYPE
+       - new `long long' checking macros:  BASH_TYPE_LONG_LONG and
+         BASH_TYPE_UNSIGNED_LONG_LONG
+       - new BASH_CHECK_DECL 
+
+lib/sh/{strto[iu]max,strtoll}.c, lib/sh/Makefile.in, Makefile.in
+       - new files
+
+externs.h
+       - extern declarations for strtoll, strtoimax, strtoumax
+
+lib/malloc/alloca.c
+       - include <bashtypes.h> for size_t
+
+builtins/printf.def
+       - new functions: getllong, getullong, getintmax, getuintmax; return
+         long long, unsigned long long, intmax_t, uintmax_t respectively
+       - builtin printf now handles `ll' and `j' length modifiers directly
+
+lib/sh/Makefile.in
+       - use LIBOBJS to decide whether or not the strto* functions are
+         needed
+
+                                  10/17
+                                  -----
+configure.in
+       - call AC_REPLACE_FUNCS(rename)
+       - move getcwd, strpbrk, strcasecmp, strerror, strtod
+         from AC_CHECK_FUNCS to AC_REPLACE_FUNCS
+       - only call BASH_FUNC_GETCWD if $ac_func_getcwd == "yes"
+       - call BASH_CHECK_SYS_SIGLIST
+       - if we don't have vprintf but have _doprnt, call AC_LIBOBJ(vprint)
+
+lib/sh/Makefile.in
+       - remove rename, getcwd, inet_aton, strpbrk, strcasecmp, strerror,
+         strtod, vprint from OBJECTS; picked up from LIBOBJS
+
+aclocal.m4
+       - change BASH_FUNC_GETCWD to call AC_LIBOBJ(getcwd) if the libc
+         getcwd(3) calls popen(3)
+       - change BASH_FUNC_INET_ATON to call AC_LIBOBJ(inet_aton) if it's
+         not found in libc or as a #define even with the special includes
+       - BASH_KERNEL_RLIMIT_CHECK -> BASH_CHECK_KERNEL_RLIMIT
+       - BASH_DEFAULT_MAILDIR -> BASH_SYS_DEFAULT_MAILDIR
+       - BASH_JOB_CONTROL_MISSING -> BASH_SYS_JOB_CONTROL_MISSING
+       - BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS
+       - BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE
+       - BASH_DUP2_CLOEXEC_CHECK -> BASH_FUNC_DUP2_CLOEXEC_CHECK
+       - BASH_PGRP_SYNC -> BASH_SYS_PGRP_SYNC
+       - BASH_RLIMIT_TYPE -> BASH_TYPE_RLIMIT
+       - BASH_FUNC_PRINTF -> BASH_DECL_PRINTF
+       - BASH_FUNC_SBRK_DECLARED -> BASH_DECL_SBRK
+       - BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T
+       - BASH_CHECK_SOCKLIB -> BASH_CHECK_LIB_SOCKET
+       - new macro, BASH_CHECK_SYS_SIGLIST, encapsulates all the checks for
+         sys_siglist, _sys_siglist, and strsignal(), sets SIGLIST_O to
+         siglist.o if appropriate
+
+Makefile.in
+       - use SIGLIST_O variable to decide whether or not we need siglist.o
+
+{execute_cmd,subst}.c
+       - change a couple of instances of ISDIGIT to DIGIT, where we really,
+         really only want ascii digits
+
+ansi_stdlib.h
+       - don't need a declaration for atol()
+
+                                  10/18
+                                  -----
+
+aclocal.m4
+       - new macro, BASH_FUNC_PRINTF_A_FORMAT, checks for printf support
+         for %a, %A conversion specifiers, defines HAVE_PRINTF_A_FORMAT
+         if successful
+
+configure.in
+       - call AC_CHECK_FUNCS for isascii
+       - call BASH_FUNC_PRINTF_A_FORMAT
+
+config.h.in
+       - add a define for HAVE_ISASCII
+       - add a define for HAVE_PRINTF_A_FORMAT
+
+lib/sh/snprintf.c
+       - for long double output, fall back to sprintf using ldfallback()
+         function for floating point formats
+       - support %a, %A using dfallback() or ldfallback() if
+         HAVE_PRINTF_A_FORMAT is defined
+       - fix bug in vasprintf that returned wrong value in its first
+         argument if the buffer holding the result string got reallocated
+       - fixed PUT_CHAR macro to increment the counter even if we've
+         exceeded the buffer size, for the return value from
+         vsnprintf/snprintf
+       - fix vsnprintf_internal to not use counter < length as a loop
+         condition, but always process the entire format string (for
+         the return value from vsnprintf/snprintf)
+
+builtins/printf.def
+       - support %a, %A if HAVE_PRINTF_A_FORMAT is defined
+
+include/typemax.h
+       - new file, with the TYPE_MAXIMUM stuff that's duplicated in several
+         files in lib/sh
+
+lib/sh/{fmtulong,strtol,snprintf}.c
+       - include <typemax.h> instead of having the definitions in each file
+
+lib/sh/Makefile.in
+       - updated dependencies for typemax.h
+
+                                  10/22
+                                  -----
+configure.in
+       - call AC_CHECK_FUNCS on ctype.h functions/macros that bash redefines
+         in chartypes.h
+
+config.h.in
+       - defines for HAVE_IS{ASCII,BLANK,GRAPH,PRINT,SPACE,XDIGIT}
+
+include/chartypes.h, lib/glob/strmatch.c, lib/readline/chardefs.h
+       - don't redefine some is* ctype macros/functions if HAVE_ISXXX is
+         defined (meaning that an appropriate function, but not a macro,
+         exists)
+
+lib/sh/strtrans.c
+       - new function, ansic_shouldquote, returns 1 if argument string
+         contains non-printing chars that should be quoted with $'...'
+
+externs.h
+       - new declaration for ansic_shouldquote()
+
+variables.c
+       - change print_var_value to ansi C quote the string if we're not in
+         posix mode and the variable's value contains non-printing chars,
+         to use the regular shell single quoting if the value contains
+         shell meta-characters, and to just output the string otherwise
+
+lib/sh/shquote.c
+       - add `break' to `case '~':' to avoid fallthrough and extra test
+
+doc/bashref.texi
+       - note that in POSIX mode, `set' displays variable values that
+         include nonprinting characters without quoting, unless they
+         contain shell metacharacters
+
+builtins/printf.def, lib/sh/snprintf.c
+       - handle `F' conversion specifier as equivalent to 'f'
+
+parse.y, {nojobs,variables}.c
+       - a couple of cleanups for when building a minimal configuration
+
+nojobs.c
+       - new function: stop_making_children(), just sets
+         already_making_children to 0 (like stop_pipeline)
+
+subst.c
+       - call stop_making_children from subst.c:command_substitute if
+         JOB_CONTROL is not defined.  This fixes the bug where the wrong
+         process is waited for (and its status returned) when using
+         command substitution in a null command in a shell function
+
+builtins/printf.def
+       - new variable `tw' used to keep track of the total number of
+         characters written by a single call to `printf' -- to be
+         used for the `%n' conversion, which will be added later.  It
+         gets reset each time we reuse the format string, which is what
+         ksh93 seems to do
+
+                                  10/23
+                                  -----
+variables.c
+       - new function, bind_var_to_int (char *var, long val)
+
+variables.h
+       - extern declaration for bind_var_to_int
+
+lib/sh/netopen.c
+       - use gai_strerror() for error messages when getaddrinfo() fails
+       - use PF_INET if DEBUG is defined, since IPv6 doesn't work for me
+
+Makefile.in
+       - pass DEBUG=${DEBUG} down to makes in some subdirectories
+
+{builtins,lib/{glob,sh}}/Makefile.in
+       - append ${DEBUG} to LOCAL_CFLAGS value, passed by top-level Makefile
+
+builtins/printf.def
+       - added support for %n format conversion char (number of chars printed
+         so far from current format string)
+
+                                  10/24
+                                  -----
+variables.c
+       - if posixly_correct is set, the default value of $MAILCHECK is 600
+       - use legal_number instead of atoi in adjust_shell_level
+       - treat non-numeric assignments to SECONDS as 0 in assign_seconds
+       - new function, init_funcname_var; sets FUNCNAME as a dynamic variable
+         if it's not set in the initial environment
+       - new function, init_groups_var; sets GROUPS as a dynamic array
+         variable if it's not set in the initial environment
+       - new function, init_dirstack_var; sets DIRSTACK as a dynamic array
+         variable if it's not set in the initial environment
+       - new function, init_seconds_var; sets SECONDS as a dynamic
+         variable using any valid integer value in the initial environment
+         as the initial value, as if an assignment had been performed
+       - call init_funcname_var, init_groups_var, init_dirstack_var,
+         init_seconds_var from initialize_dynamic_variables
+       - non-numeric values assigned to LINENO are treated as 0
+       - change initialize_shell_variables to not auto-export PATH or TERM
+       - change set_home_var to not auto-export HOME
+       - change set_shell_var to not auto-export SHELL
+       - broke the code that sets HOSTNAME, HOSTTYPE, MACHTYPE, OSTYPE
+         out into a separate function, set_machine_vars; none of those
+         variables are auto-exported
+       - bash no longer un-exports SSH_CLIENT or SSH2_CLIENT
+
+shell.c
+       - changed isnetconn() to check SSH_CLIENT and SSH2_CLIENT only if
+         SSH_SOURCE_BASHRC is defined in config-top.h
+
+config-top.h
+       - added a commented-out definition for SSH_SOURCE_BASHRC
+
+                                  10/25
+                                  -----
+
+Makefile.in
+       - changed RELSTATUS to `rc1' (release candidate 1)
+
+                                  10/29
+                                  -----
+locale.c
+       - fixed an `=' vs. `==' typo in set_locale_var when parsing
+         LC_NUMERIC
+
+doc/{bash.1,bashref.texi}
+       - document what bash does with $POSIXLY_CORRECT
+
+doc/builtins.1
+       - some updates
+
+builtins/psize.sh
+       - some mktemp(1) changes
+
+lib/readline/readline.c
+       - change rl_backward to check for rl_point < 0 and reset to 0 if so
+
+lib/readline/util.c
+       - don't compile in _rl_strpbrk if HAVE_STRPBRK is defined
+
+lib/readline/rlprivate.h
+       - remove extern declaration of _rl_strpbrk
+
+lib/readline/rldefs.h
+       - #define _rl_strpbrk as strpbrk if HAVE_STRPBRK is define, otherwise
+         add extern declaration of _rl_strpbrk from rlprivate.h
+
+{mailcheck,shell,variables}.c
+       - make sure to include posixtime.h to get any prototype for time(3)
+         in scope
+
+{array,eval,execute_cmd,mksyntax,subst}.c, parse.y
+builtins/common.c
+lib/sh/pathcanon.c
+       - a few changes as the result of `gcc -Wall' patches from solar
+         designer
+
+builtins/read.def, parse.y
+       - change some calls to free() to xfree()
+
+builtins/set.def
+       - make sure unset_builtin() resets unset_array to 0 each time through
+         the loop, because it's set (and used) depending on the current
+         argument
+
+shell.h
+       - new define, USE_VAR, to force the compiler to not put a particular
+         variable in a register -- helpful if registers are not restored
+         by setjmp/longjmp
+
+builtins/{evalfile.c,{read,wait}.def}, {eval,execute_cmd,shell,test}.c
+       - use USE_VAR for some variables
+
+subst.c
+       - fixed a case in expand_word_internal where a NULL pointer could
+         have been passed to free() (though free() should ignore it)
+       - fixed a case at the end of expand_word_internal where LIST could
+         have been used uninitialized (it makes gcc happy, though it
+         doesn't happen in practice)
+
+test.c
+       - give test_syntax_error(), beyond(), and integer_expected_error()
+         the `__noreturn__' attribute for gcc
+
+unwind_prot.c
+       - in clear_unwind_protect_list(), convert `flags' to `long' (via
+         assignment to a `long' variable) before casting to `char *', in
+         case pointers and longs are 64 bits and ints are 32 (makes no
+         difference on 32-bit machines)
+
+                                  10/30
+                                  -----
+print_cmd.c
+       - fixed cprintf to avoid gcc warning about assigning const pointer
+         to non-const (discarding type qualifier)
+
+{make_cmd,pcomplete,test}.c,parse.y
+       - some minor changes to shut up gcc warnings
+
+lib/sh/tmpfile.c
+       - fixed sh_mktmpfp to avoid file descriptor leaks in the case that
+         sh_mktmpfd succeeds but fdopen fails for some reason
+       - change sh_mktmpfd to use the same scheme for computing `filenum'
+         as sh_mktmpname
+       - change get_sys_tmpdir to prefer P_tmpdir if P_tmpdir is defined
+       - changed sh_mktmpname and sh_mktmpfd to avoid trying to assign to
+         `nameroot' if `nameroot == 0' (duh)
+       - add code to sh_mktmpfd to use mkstemp(3) if USE_MKSTEMP is defined
+       - add code to sh_mktmpname to use mktemp(3) if USE_MKTEMP is defined
+
+support/{fixlinks,mkclone}
+       - use mktemp if it's available for the symlink test
+       - use $TMPDIR instead of hardcoding /tmp; default to /tmp
+       - use a better filename for the symlink test instead of `z'
+
+support/bashbug.sh
+       - more changes inspired by a patch from solar designer
+
+lib/malloc/Makefile.in
+       - new target `alloca', which builds libmalloc.a with alloca.o only
+         (for systems without alloca that are configured --without-bash-malloc)
+
+configure.in
+       - if we don't have a working alloca and are not configured to build
+         the bash malloc library, make a malloc library containing only
+         alloca.o
+
+aclocal.m4
+       - slight change to RL_LIB_READLINE_VERSION to deal with minor version
+         numbers with a letter appended (like 4.2a)
+
+                                  10/31
+                                  -----
+doc/{bash.1,bashref.texi}
+       - slight change to note that only interactive shells resend a SIGHUP
+         to all jobs before exiting
+
+externs.h
+       - declare strto[ui]max only if NEED_STRTOIMAX_DECL is defined.  This
+         keeps picky compilers from choking because intmax_t is not defined
+         (MacOS X 10.1)
+
+builtins/printf.def
+       - #define NEED_STRTOIMAX_DECL before including shell.h
+
+                                  11/1
+                                  ----
+general.c
+       - check in bash_tilde_expand() for an unquoted tilde-prefix; don't
+         bother passing the string to tilde_expand unless the prefix is
+         unquoted
+
+shell.c
+       - fix a problem with $LINENO when executing commands supplied with
+         the -c invocation option when ONESHOT is defined
+
+[bash-2.05a-rc1 frozen]
+
+builtins/printf.def
+       - fix the %n conversion to require that the variable name supplied
+         be a valid shell identifier
+
+variables.c
+       - improve random number generator slightly by using the upper 16
+         bits of the running random number instead of the lower 16, which
+         are incrementally more random
+
+                                  11/2
+                                  ----
+configure.in
+       - if RL_INCLUDEDIR ends up being /usr/include, don't put
+         -I$(RL_INCLUDEDIR) into CFLAGS
+
+                                  11/5
+                                  ----
+doc/{bash.1,bashref.texi}
+       - correct description of POSIXLY_CORRECT to note that the shell enters
+         posix mode *before* the startup files are read if POSIXLY_CORRECT
+         is in the initial environment
+
+variables.c
+       - fix function prologues for init_dirstack_var and init_groups_var
+         to agree with caller (no arguments)
+
+jobs.c
+       - fix forward function declarations for pipe_read and pipe_close
+
+subst.c
+       - removed `inline' attribute from skip_double_quoted because it can
+         potentially be called recursively
+
+bashline.c
+       - quick fix to bashline.c:attempt_shell_completion programmable
+         completion code to just punt if the end of the command word found
+         by find_cmd_end is <= the start found by find_cmd_start (the bug
+         is probably in find_cmd_start -- fix later)
+
+pcomplete.c
+       - fix gen_matches_from_itemlist to return if the stringlist is null
+         after any cleaning or initialization, before trying to use it
+       - fix GEN_COMPS to only bother to try to append the STRINGLIST
+         returned by gen_matches_from_itemlist to `glist' if it's non-NULL
+
+lib/sh/stringlist.c
+       - make copy_stringlist return NULL if the STRINGLIST * passed as an
+         argument is NULL
+       - make append_stringlist call copy_stringlist only if M2 is non-NULL;
+         otherwise just return NULL if m1 is NULL
+       - make word_list_to_stringlist return 0 immediately if the passed
+         LIST argument is NULL
+       - make realloc_stringlist call alloc_stringlist if the passed
+         STRINGLIST argument (`sl') is 0, just like realloc calls malloc
+
+subst.c
+       - in skip_to_delim(), if we have an unclosed ${, and it's at the end
+         of the string (string[i] == '{', string[i+1] == '{' and
+         string[i+2] == 0, return si (i +2) immediately without bothering
+         to call extract_dollar_brace_string or extract_delimited_string
+       - in skip_to_delim(), if string[i] is 0 after a call to
+         extract_dollar_brace_string or extract_delimited_string (meaning we
+         have an unclosed ${ or other expansion, return i immediately without
+         doing a `continue' (which will increment i past the end of string)
+       - in split_at_delims, don't increment te by 1 if it's pointing to a
+         delimiter.  this has the effect of skipping the first delimiter
+         char in a possibly multi-character delimiter, and ignoring
+         single-char delimiters like `>'
+
+configure.in
+       - use AC_CHECK_MEMBERS([struct stat.st_blocks]) instead of a call to
+         AC_STRUCT_ST_BLOCKS to avoid configure changing LIBOBJS if the test
+         fails
+
+general.c
+       - introduce two new variables: bash_tilde_{prefixes,suffixes}, set
+         to the additional prefixes and suffixes bash wants to pass to the
+         tilde expansion code (reserved for post-bash-2.05a fix)
+
+aclocal.m4
+       - add missing `test' in BASH_CHECK_SYS_SIGLIST
+
+                                  11/7
+                                  ----
+lib/readline/vi_mode.c
+       - fix rl_vi_goto_mark to explicitly check that the desired mark is
+         between 'a' and 'z', since some locales have lowercase letters
+         outside that range, which could cause a negative subscript
+
+include/chartypes.h
+       - remove superfluous `#undef ISASCII'
+
+lib/sh/strto[iu]max.c
+       - changes from Paul Eggert to work around buggy compilers and catch
+         configuration errors at compile time
+
+aclocal.m4
+       - new macro, BASH_C_LONG_DOUBLE, identical to AC_C_LONG_DOUBLE but
+         with a fix for Irix 5.3 (not called, since I'm not sure it's the
+         right thing to do -- the C standard allows double and long double
+         to be the same size)
+
+lib/sh/snprintf.c
+       - only try to write the trailing NUL in vsnprintf_internal if
+         data->length is >= 0, since if it's not, we probably don't have
+         a buffer
+
+Makefile.in
+       - changed RELSTATUS to `release'
+
+                                  11/8
+                                  ----
+lib/sh/strtol.c
+       - make sure chars passed to toupper are cast to unsigned
+
+unwind_prot.c
+       - change clear_unwind_protect_list to not require a cast from `int'
+         to `char *'
+
+lib/readline/chardefs.h
+       - make _rl_digit_p succeed only for ascii digits, since that's what
+         most callers assume
+
+                                  11/13
+                                  -----
+doc/bashref.texi
+       - added `ERR' trap and [-+]O invocation option to section listing
+         differences from the Bourne shell
+
+                                  11/15
+                                  -----
+[bash-2.05a released]
+
+                                  11/19
+                                  -----
+include/stdc.h
+       - new define, INLINE, defined as `inline' for gcc and empty otherwise
+
+subst.c
+       - make skip_double_quoted, sub_append_string have INLINE attribute
+
+trap.c
+       - use BASH_NSIG as upper limit for signal names in signal_name()
+
+lib/readline/bind.c
+       - use RL_COMMENT_BEGIN_DEFAULT in output for rl-comment-begin value
+
+error.c
+       - fix sys_error to save value of errno around calls to fprintf
+
+doc/Makefile.in
+       - added rules to create PDF files from postscript and dvi input
+
+MANIFEST.doc
+       - added {article,bash,bashref,rose94}.pdf
+
+doc/bash.1
+       - rearranged some `.PD 0' and `.TP' directives so man2html will
+         handle them better (shouldn't affect groff output)
+
+support/man2html.c
+       - small fix to handle quoted string arguments to directives like
+         `.BR' without mangling the output
+
+                                  11/20
+                                  -----
+{arrayfunc,variables}.c
+       - changed calling sequence for dynamic array variable `assign'
+         functions to (SHELL_VAR *self, char *value, arrayind_t ind)
+       - changed calling sequence for dynamic variable assign functions
+         to the same as array variable assign_func.  Now this can be
+         prototyped
+
+variables.h
+       - the assign_func member of a `struct variable' is now of type
+         `sh_var_assign_func_t', which is prototyped
+       - the dynamic_value member of a `struct variable' is now of type
+         `sh_var_value_func_t', which is prototyped
+
+variables.c
+       - changed to use `sh_var_assign_func_t' and `sh_var_value_func_t'
+
+builtins/cd.def
+       - when in posix mode, if the new directory name formed by PWD and
+         the argument passed by the user cannot be canonicalized, and the
+         -P option has not been supplied, return failure immediately
+       - if canonicalization failed, but the fallback to the directory
+         name specified by the user succeeds, reset the current working
+         directory
+
+lib/readline/{input.c,rlprivate.h}
+       - renamed rl_unget_char to _rl_unget_char; made library global
+
+lib/readline/{{bind,readline}.c,{keymaps,rlprivate}.h}
+       - support for `key subsequences'; allows a key sequence and a function
+         mapped to a subsequence of that key sequence.  Primarily to allow
+         arrow keys to be bound in readline vi insert mode, while preserving
+         the ESC function to switch to command mode.
+
+lib/readline/{input.c,rlprivate.h}
+       - new function, _rl_input_queued(T), does a check with select or
+         FIONREAD with a timeout of `T' (which is generally 0)
+
+lib/readline/readline.c
+       - change _rl_dispatch_subseq to test for input in the queue if we
+         get ESC while in vi insertion mode if the keymap entry type for
+         ESC is ISKMAP.  If _rl_input_queued returns non-zero, we assume
+         that an arrow key sequence has been pressed and go ahead with the
+         subsequence.  If it returns zero, we assume that the user pressed
+         ESC to switch into command mode, and dispatch to that right away.
+         This avoids forcing the user to press another key before switching
+         into command mode
+
+                                  11/21
+                                  -----
+lib/readline/readline.c
+       - bind common arrow key sequences in vi insertion keymap
+
+lib/readline/terminal.c
+       - bind termcap definition's arrow keys in vi insertion keymap
+
+lib/readline/bind.c
+       - check for rl_vi_movement_mode in _rl_bind_if_unbound, so
+         binding the arrow keys can work
+
+lib/readline/readline.c
+       - since _rl_bind_if_unbound does the check of what's currently
+         bound to the key sequence, the check in bind_arrow_keys_internal
+         was redundant
+       - bind_arrow_keys_internal now takes a Keymap argument and handles
+         saving and restoring _rl_keymap; changed bind_arrow_keys
+         accordingly
+
+builtins/fc.def
+       - fix from Paul Eggert to substitute the nearest history number in
+         range if an out-of-range value is supplied.  POSIX requires this
+
+lib/sh/pathcanon.c
+       - fix from Corrina Vinschen for the special `cygdrive' prefix on
+         Cygwin
+
+bashhist.c
+       - split the history adding code into more pieces:
+           check_history_control (char *line) checks LINE against the value
+           of HISTCONTROL, returning 1 if LINE should be saved and 0 if not
+
+           check_add_history (char *line) calls check_history_control and
+           history_should_ignore (line) and saves the line with
+           bash_add_history if the checks indicate that it should be saved
+
+           maybe_add_history just calls check_add_history to set the value
+           of first_line_saved
+
+bashhist.h
+       - extern declaration for check_add_history()
+
+shell.c
+       - don't call load_history() from the interactive shell startup
+         code if history_lines_this_session is > 0, indicating that we've
+         already saved some lines in the history and that we probably
+         don't want to overwrite them
+
+builtins/history.def
+       - call check_add_history from push_history, so `history -s xx'
+         works even when in a compound command whose first line has not
+         been saved.  (Caveat:  in a compound command when the first
+         line has been saved, the line supplied to history -s will become
+         part of the compound command's history entry.  Of course, the
+         delete_history call could remove the compound command from the
+         history entirely)
+
+bashline.c
+       - use sh_makepath instead of xmalloc/sprintf in
+         command_word_completion_function
+
+lib/readline/complete.c
+       - get_y_or_n now takes an int FOR_PAGER argument; caller changed
+         If FOR_PAGER is non-zero, get_y_or_n returns appropriate values
+         for a more-like pager:  `newline' or `return' return 2; `q' or
+         `Q' return 0
+       - there is now a mini internal more-like pager for displaying a
+         list of completions that exceeds the screen height (new function
+         _rl_internal_pager, called from rl_display_match_list)
+
+                                  11/24
+                                  -----
+command.h
+       - new flag, W_TILDEEXP, says to do tilde expansion on an
+         assignment word
+
+execute_cmd.c
+       - fix_assignment_words now sets W_TILDEEXP for assignment word
+         arguments to `assignment builtins'
+
+general.c
+       - bash_tilde_expand now takes a second argument indicating whether
+         or not it's being invoked in an `assignment context'
+
+general.h
+       - change extern declaration for bash_tilde_expand
+
+{bashline,execute_cmd,findcmd,general,variables}.c
+builtins/evalfile.c
+lib/sh/makepath.c
+       - fix callers of bash_tilde_expand appropriately
+
+subst.c
+       - fix callers of bash_tilde_expansion appropriately
+       - add (currently commented-out) code that would tilde expand assignment
+         statement arguments to assignment builtins (W_TILDEEXP flag set)
+         even when the shell is in posix mode
+
+bashline.c
+       - fix attempt_shell_completion to turn off
+         rl_filename_completion_desired when doing command name completion,
+         so no slash gets appended to the name if there happens to be a
+         directory with the same name in the current directory
+
+                                  11/26
+                                  -----
+lib/readline/rltech.texinfo
+       - a couple of additions to the rl_stuff_char description
+
+parse.y
+       - turn off echo_input_at_read in parse_string_to_word_list, so `set -v'
+         doesn't give extra lines of output when doing compound array
+         assignment
+
+subst.c
+       - fix split_at_delims to handle skipping over a `\n' if it's a
+         delimiter (use spctabnl(c) instead of whitespace(c))
+
+                                  11/27
+                                  -----
+support/config.{guess,sub}
+       - updated (with bash changes) to latest version from gnu.org
+
+sig.h
+       - add prototype for set_signal_handler declaration
+
+builtins/setattr.def
+       - add prototype to extern declaration of declare_builtin
+
+builtins/times.def
+       - add no_options call, since times takes no options
+
+lib/sh/spell.c
+       - add prototypes to forward declarations for midist and spdist
+
+lib/sh/strtrans.c
+       - add explicit int return type to ansic_shouldquote declaration
+
+lib/readline/rldefs.h, lib/readline/{macro,readline,util,undo}.c
+       - move define for SWAP to rldefs.h, removed from various C files
+
+lib/readline/vi_mode.c
+       - removed define for exchange(), changed to use SWAP instead
+
+lib/readline/bind.c
+       - added some static forward function declarations
+       - find_boolean_var, find_string_var now take a `const char *' argument
+
+lib/readline/signals.c
+       - added static forward declaration for rl_maybe_set_sighandler
+
+lib/readline/readline.c
+       - add some common key bindings for the HOME and END keys in
+         bind_arrow_keys_internal
+
+lib/readline/terminal.c
+       - fetch the `@7' termcap string; it's sent by the END key
+       - attempt to bind the terminal's END key to rl_end_of_line in
+         bind_termcap_arrow_keys; I don't know why I was using `kH'
+         instead of `@7'
+
+doc/builtins.1
+       - remove `case', `for', `if', `until', `while' from NAME section;
+         those are not shell builtins
+
+                                  11/28
+                                  -----
+stringlib.c
+       - new function, find_token_in_alist, takes a token value and an
+         ALIST argument, and returns the string correspoinding to the
+         token if found in the alist
+
+externs.h
+       - new extern declaration for find_token_in_alist()
+
+subst.c
+       - string_list_internal is no longer static
+
+subst.h
+       - new extern declaration for string_list_internal()
+
+parse.y
+       - new alist array of other tokens returned by read_token which are
+         not reserved words in word_token_alist[]
+       - reworked error reporting:  new functions print_offending_line,
+         which prints the line containing the syntax error,
+         error_token_from_token, which takes the current token and tries to
+         figure out its textual representation, and error_token_from_text,
+         which does the old job of finding the bad token by analyzing the
+         text of shell_input_line at the current index
+       - report_syntax_error now tries to figure out the token that caused
+         the syntax error by first looking at current_token and falling
+         back to the old method of textual analysis if that fails
+       - report_syntax_error doesn't say the token resulting from the textual
+         analysis of the input line is an `unexpected token'; it just
+         says there is a `syntax error near xxx'
+       - changed conditional command error reporting to use the value
+         returned by error_token_from_token if it's not null instead of
+         just using the token value in the message, since current_token
+         ends up being set to -1, and the text of the message from
+         report_syntax_error might not be exactly right
+       - change parse_string_to_word_list to set current_token to the
+         offending token returned by read_token before calling yyerror()
+         to make the error reporting do the right thing
+
+aclocal.m4
+       - fixed typo in BASH_CHECK_LIB_TERMCAP
+
+configure.in
+       - add check for isinf(3); define HAVE_ISINF_IN_LIBC if found
+
+config.h.in
+       - add define for HAVE_ISINF_IN_LIBC
+
+lib/sh/snprintf.c
+       - check for Inf and NaN, using isinf and isnan if they're found in
+         libc
+       - use the current locale for thousands separator and decimal point
+       - recognize "'" flag; not implemented yet
+       - fix for snprintf/vsnprintf with length of 0 and string argument of
+         0 with non-zero length
+
+builtins/read.def
+       - TMOUT is now the default timeout for `read' (and select) if set,
+         like ksh93 when reading from the terminal
+       - edit_line (called by read -e) now just does readline's filename
+         completion by setting rl_attempted_completion_function to NULL,
+         since e.g., doing command completion for the first word on the
+         line wasn't really useful
+
+execute_cmd.c
+       - changed select_command to return failure status if select_query
+         returns NULL, indicating that read_builtin returned
+         EXECUTION_FAILURE
+
+doc/{bash.1,bashref.texi}
+       - documented new TMOUT behavior 
+       - slight change to the description of the test `-ef' option
+
+doc/bashref.texi
+       - added item to posix mode section describing failure behavior of
+         cd when invoked in logical mode and the pathname formed by
+         combining $PWD and the directory argument does not refer to an
+         existing directory
+
+                                  11/29
+                                  -----
+execute_cmd.c
+       - fix execute_function to call dispose_function_env after
+         merge_function_env if the shell is in posix mode (fixes debian
+         bash bug #117673)
+
+lib/readline/readline.c
+       - rl_forward -> rl_forward_char; rl_forward function for compatibility
+       - rl_backward -> rl_backward_char; rl_forward function for
+         compatibility
+       - new functions, rl_forward_byte, rl_backward_byte, for future use
+
+lib/readline/readline.h
+       - extern declarations for rl_forward_char, rl_backward_char,
+         rl_forward_byte, rl_backward_byte
+
+lib/readline/{emacs_keymap,funmap,vi_keymap,vi_mode
+       - rl_forward -> rl_forward_char
+       - rl_backward -> rl_backward_char
+
+lib/readline/funmap.c
+       - new bindable names, `backward-byte' and `forward-byte'
+
+aclocal.m4
+       - new function, BASH_CHECK_MULTIBYTE, encapsulates checks for
+         multibyte code
+
+config.h.in
+       - add necessary defines for multibyte include files and functions
+
+configure.in
+       - add call to BASH_CHECK_MULTIBYTE
+
+config-bot.h
+       - add code to define HANDLE_MULTIBYTE if prerequisites are met
+
+lib/sh/xstrchr.c
+       - new file, xstrchr() is strchr(3) that handles multibyte characters
+
+bashhist.c
+       - first_line_saved -> current_command_first_line_saved; variable is
+         now global
+
+bashhist.h
+       - extern declaration for current_command_first_line_saved
+
+                                  11/30
+                                  -----
+bashhist.c
+       - break the code that actually calls add_history out of
+         bash_add_history into a new function, really_add_history;
+         bash_add_history now calls really_add_history
+       - check_add_history takes a second `force' argument telling it
+         whether to call bash_add_history (force == 0) or really_add_history
+         (force != 0)
+
+builtins/history.def
+       - in push_history, call delete_last_history if the current command
+         has more than one line, the first line was saved, and
+         command-oriented history is active.  This takes care of deleting
+         the right history element if `history -s' is used within a
+         compound or multiline command
+       - in push_history, call check_add_history with second argument of 1
+         to skip check of current_command_line_count and add the arguments
+         to history -s as a single separate history entry
+
+                                  12/3
+                                  ----
+lib/readline/complete.c
+       - append a slash to completed names which are symlinks to directories
+         if the new variable _rl_complete_mark_symlink_dirs is non-zero
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_complete_mark_symlink_dirs
+
+lib/readline/bind.c
+       - new bindable variable, `mark-symlinked-directories', mirrors the
+         value of _rl_complete_mark_symlink_dirs
+
+doc/bash.1, lib/readline/doc/{readline.3,rluser.texinfo}
+       - documented new `mark-symlinked-directories' variable
+
+                                  12/4
+                                  ----
+variables.[ch]
+       - set_pipestatus_array now takes a second argument with the number
+         of processes in the array
+       - changed set_pipestatus_array to just modify the value in place if
+         the existing array has one element and the new array has one
+         element, and to modify existing values in place if new array has
+         more elements than existing array
+
+variables.c, jobs.c
+       - changed set_pipestatus_array callers
+
+jobs.c
+       - moved call to setjstatus() from set_job_status_and_cleanup to
+         wait_for, since set_job_status_and_cleanup is part of the SIGCHLD
+         signal handler call path, and race conditions accessing the
+         PIPESTATUS array will result for things like
+
+               while true; do date; done | cat > /dev/null
+
+                                  12/5
+                                  ----
+xmalloc.h
+       - don't redefine xmalloc, xrealloc, and xfree if DISABLE_MALLOC_WRAPPERS
+         is #defined
+
+config.h.in
+       - #undef for DISABLE_MALLOC_WRAPPERS
+
+configure.in
+       - define DISABLE_MALLOC_WRAPPERS if the --with-purify option is
+         supplied
+
+lib/malloc/trace.c
+       - new function, malloc_trace_bin(N), traces allocations and frees
+         to bucket N (uses the same type of bitmap as `busy')
+
+lib/malloc/table.c
+       - fix wraparound search problem in find_entry when searching for a
+         free entry when the table is full
+
+                                  12/6
+                                  ----
+lib/malloc/table.c
+       - keep an `overflow bucket' around to use when the table is full,
+         so find_entry always returns a valid pointer when FIND_ALLOC
+         is set
+       - new static variable to keep a count of the number of MT_ALLOC
+         entries in the mem_table
+
+lib/sh/{oslib,clktck}.c
+       - if HAVE_LIMITS_H is defined, include <limits.h>
+
+lib/sh/oslib.c
+       - new function, getmaxgroups() returns max number of simultaneous
+         groups
+       - new function, getmaxchild(), returns max number of simultaneous
+         user processes
+
+general.c
+       - removed forest of #defines for getmaxgroups()
+
+externs.h
+       - new extern declaration for getmaxgroups()
+       - new extern declaration for getmaxchild()
+       - new extern declaration for isnetconn()
+
+lib/sh/netconn.c,shell.c
+       - new file, isnetconn() from shell.c moved here
+
+Makefile.in, lib/sh/Makefile.in
+       - necessary changes for netconn.c
+
+builtins/ulimit.def
+       - changed getmaxuprc() to just call getmaxchild() and massage the
+         return value appropriately
+
+{jobs,nojobs}.c
+       - use the value returned by getmaxchild() in
+         mark_dead_jobs_as_notified instead of static CHILD_MAX
+
+jobs.c
+       - new function, compact_jobs_list, removes some number of jobs from
+         the jobs table and reallocates the table, copying the jobs that
+         are left from the old table to the new.  Compaction happens from
+         the beginning of the list and removes dead jobs, and we make sure
+         to keep the last CHILD_MAX jobs as POSIX.2 requires
+       - call compact_jobs_list from stop_pipeline if we're in a subshell,
+         there are no free jobs in the jobs table, and the jobs table is
+         at or above some maximum limit
+
+execute_cmd.c
+       - change eval_arith_for_expr to set this_command_name to `((' before
+         calling evalexp, since it might be changed by evaluating the
+         loop body between evalexp calls
+
+trap.c
+       - change reset_signal to turn off the SIG_TRAPPED flag for the
+         given signal, so shell builtins and functions running in command
+         substitutions don't run the signal handlers (traps are not supposed
+         to be inherited by command substitutions)
+
+parse.y
+       - changed parse_string_to_word_list to turn off alias expansion
+         while parsing the array assignment
+
+                                  12/9
+                                  ----
+alias.c
+       - fix add_alias so that redefining an alias's value also resets the
+         EXPANDNEXT flag
+
+                                  12/10
+                                  -----
+parse.y
+       - new function, token_is_assignment, called to check whether the text
+         before `=' makes up a valid assignment token before trying to parse
+         a compound assignment statement
+       - new function, parse_compound_assignment, to parse a compound
+         assignment statement instead of using parse_matched_pair; handles
+         comments and error reporting in the parser instead of waiting until
+         expansion time
+       - changed parse_compound_assignment and parse_string_to_word_list to
+         allow reserved words in compound array assignments
+
+lib/readline/doc/rltech.texinfo
+       - changed the documentation for rl_callback_read_char and
+         rl_callback_handler_remove to say what happens to the terminal
+         settings and what needs to be done to reset them
+
+                                  12/11
+                                  -----
+bashline.c
+       - add emacs_edit_and_execute_command, bound to C-xC-e, like vi-mode
+         `v' command
+       - add bindable command name `edit-and-execute-command', bound to
+         run emacs_edit_and_execute_command()
+
+lib/glob/strmatch.c
+       - add support for ksh93-like [:word:] character class (isalnum + `_')
+
+doc/{bash.1,bashref.texi}
+       - add note to section describing lists to clarify that a sequence of
+         one or more newlines may be used to delimit a command, equivalent
+         to a semicolon
+       - document new [:word:] pattern matching character class
+
+doc/bash.1, lib/readline/doc/rluser.texinfo
+       - document `edit-and-execute-command' and its default emacs-mode
+         binding
+
+include/chartypes.h
+       - add defines for TOCTRL and UNCTRL if they're not already defined
+
+lib/readline/chardefs.h
+       - #undef UNCTRL if it's defined to avoid cpp redefinition warnings
+
+lib/sh/strtrans.c
+       - add \cX (Control-X) escape for $'...' to ansicstr()
+       - change ansic_quote() to allocate at least four chars for each char
+         in the string argument, to account for \0xx octal values
+       - change ansic_quote() to no longer call sprintf for non-printable
+         characters; just translate the string to octal directly
+
+print_cmd.c
+       - change xtrace_print_word_list to call ansic_quote() if
+         ansic_shouldquote() indicates that there are nonprinting characters
+         in a word
+
+builtins/type.def
+       - changed deprecated long option parsing to just replace the word
+         in the list with the equivalent short option (-type -> -t) instead
+         of removing words from the list
+       - changed describe_command to take a single flags argument instead
+         of two int args; changed caller
+       - type now has two new options:  -f suppresses function lookup (like
+         command), and -P forces a PATH search for the name(s)
+
+builtins/common.h
+       - flags for describe_command are here
+       - changed extern declaration of describe_command
+
+builtins/command.def
+       - changed call to describe_command to use flags from common.h, and
+         the right number of arguments
+
+doc/{bash.1,bashref.texi}
+       - documented new -f and -P options to `type'
+
+                                  12/12
+                                  -----
+lib/readline/rldefs.h
+       - fixed prototype for _rl_strnicmp
+
+execute_cmd.c
+       - select_query now takes a new argument, an int flag saying whether
+         or not to print the menu the first time through the loop.  An
+         empty line in response to the prompt will always cause the menu
+         to be reprinted
+       - changed execute_select_command to cause select_query to reprint
+         the menu only if REPLY is set to NULL, if KSH_COMPATIBLE_SELECT
+         is defined
+
+config-top.h
+       - define KSH_COMPATIBLE_SELECT, with a comment about its meaning
+
+lib/readline/readline.c
+       - change rl_insert_comment to toggle if given an explicit numeric
+         argument:  if the first characters on the line don't specify a
+         comment, insert one; if they do, delete the comment text
+
+doc/bash.1, lib/readline/doc/{readline.3,rluser.texinfo}
+       - documented new behavior of insert-comment with a numeric argument
+
+                                  12/13
+                                  -----
+lib/malloc/watch.c
+       - new file, implements watchpoint functions
+
+lib/malloc/watch.h
+       - new file, define some `events' for watchpoints and extern function
+         and variable declarations for watchpoint code
+
+lib/malloc/imalloc.h
+       - #define MALLOC_WATCH if MALLOC_DEBUG is defined
+       - add __P define as in include/stdc.h if not already defined
+
+lib/malloc/malloc.c
+       - remove __P define, now in imalloc.h
+       - include watch.h if MALLOC_WATCH is defined
+       - added calls to _malloc_ckwatch in internal_malloc, internal_free,
+         and internal_realloc
+
+include/stdc.h
+       - augment __P define to allow prototypes if PROTOTYPES is defined
+
+lib/readline/rlstdc.h
+       - augment PARAMS define to allow prototypes if PROTOTYPES is defined
+
+lib/malloc/Makefile.in, Makefile.in
+       necessary changes to include watch.c in libmalloc
+
+lib/readline/readline.c
+       - fix rl_delete_text to make sure that the starting position is >= 0
+       - _rl_init_line_state (called by readline via readline_initialize)
+         now sets rl_mark to 0
+       - rl_get_{next,previous}_history set rl_mark to 0 if rl_point is at
+         the end of the line and rl_end otherwise in emacs mode
+
+lib/readline/kill.c
+       - rl_yank_nth_arg_internal and rl_paste_clipboard now set the mark
+         at point before calling rl_insert_text, like rl_yank
+       - rl_kill_full_line now resets rl_mark to 0
+       - rl_kill_line and rl_backward_kill_line now set rl_mark to the
+         point after the kill in emacs mode
+       - rl_kill_word and rl_backward_kill_word now set rl_mark to the
+         point after the kill in emacs mode
+       - rl_unix_word_rubout and rl_unix_line_discard now set rl_mark to
+         the point after the kill in emacs mode
+
+lib/readline/search.c
+       - noninc_search saves and restores the mark, since it can be changed
+         while reading the search string
+       - noninc_dosearch sets the mark at the end of the line, making the
+         region bound the `inserted' text since rl_point is set to 0
+       - rl_history_search_internal sets the mark at the end of the line,
+         for the same reason
+
+lib/readline/isearch.c
+       - rl_search_history now saves and restores the mark
+       - if no matching lines are found at all when doing an isearch, leave
+         point where it was instead of moving it to the end of the line
+
+                                  12/17
+                                  -----
+lib/readline/rlmbutil.h
+       - new file, place for multi-byte character defines and extern
+         declarations
+
+lib/readline/{bind.c,readline.c,rlprivate.h}
+       - new bindable variable, `byte-oriented', tracks value of
+         rl_byte_oriented variable
+
+lib/readline/mbutil.c
+       - new file, with multibyte char utility functions
+
+lib/readline/{complete,display,readline,util,vi_mode}.c
+       - new code for multibyte characters, derived from IBM patch
+
+                                  12/18
+                                  -----
+lib/sh/tmpfile.c
+       - include posixtime.h for time() extern declaration
+
+support/bashversion.c
+       - include <unistd.h> if it's available
+
+lib/readline/{histexpand,input,isearch,search}.c
+       - new code for multibyte characters, derived from IBM patch
+
+lib/readline/readline.h
+       - include rltypedefs.h
+
+                                  12/19
+                                  -----
+lib/readline/complete.c
+       - slight change to mark-directories code to avoid adding a slash if
+         point is at the end of the line (rl_line_buffer[rl_point] == '\0')
+         and the previous character was a slash
+       - change printable_part to not return empty pathnames, which could
+         happen when completing filenames and a filename with a trailing
+         slash was passed as the argument.  If the portion following the
+         trailing slash is NULL, ignore it and look for a previous slash.
+         If there's no previous slash, just return the filename argument
+       - new variable, rl_completion_mark_symlink_dirs, mirrors the value
+         of (user-settable with a variable) _rl_complete_mark_symlink_dirs
+         but may be modified by application-specific completion functions
+         when appropriate (set in rl_complete_internal and rl_menu_complete)
+
+lib/readline/readline.h
+       - extern declaration for rl_completion_mark_symlink_dirs
+
+pcomplete.c
+       - if one of the actions is CA_DIRECTORY, set
+         rl_completion_mark_symlink_dirs to indicate that we want the
+         trailing slash (might have to relax this)
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_completion_mark_symlink_dirs variable
+
+lib/readline/doc/rluser.texinfo, doc/bash.1
+       - documented the fact that `complete -d' and `complete -o dirnames'
+         force readline to append a slash to symlinks to directories
+
+builtins/enable.def
+       - changed enable_shell_builtin to disallow enabling disabled
+         builtins in a restricted shell
+
+doc/{bash.1,bashref.texi}
+       - documented new enable behavior in restricted shells
+
+doc/Makefile.in
+       - new rule to make an `RBASH' file documenting the restrictions
+         imposed by a restricted shell
+
+expr.c
+       - broke the code that evaluates variables and returns results out
+         of readtok() into a new function: expr_streval()
+       - expr_streval() now performs the standard unset variable error
+         behavior if `set -u' has been executed and it's asked to look
+         up an unset variable
+       - broke the code that frees up the expression context stack into
+         a new function: expr_unwind()
+
+variables.c
+       - fixed bind_int_variable so it handles array element assignment,
+         so expressions like `b[7]++' and `b[0] = 42' work right
+       - new function, get_variable_value, returns the string value of
+         the SHELL_VAR * passed as an argument
+       - get_string_value now calls get_variable_value with a non-null
+         result from find_variable
+
+                                  12/20
+                                  -----
+lib/readline/rlmbutil.h, mbutil.c
+       - combined _rl_find_next_mbchar and _rl_find_next_nonzero_mbchar into
+         a single function
+       - combined _rl_find_prev_mbchar and _rl_find_prev_nonzero_mbchar into
+         a single function
+
+lib/readline/{display,readline,vi_mode}.c
+       - changed callers of _rl_find_next_mbchar and
+         _rl_find_next_nonzero_mbchar
+
+lib/readline/{complete,display,histexpand,readline,vi_mode}.c
+       - changed callers of _rl_find_prev_mbchar and
+         _rl_find_prev_nonzero_mbchar
+
+                                  12/20
+                                  -----
+lib/sh/mktime.c
+       - new file, from glibc/gawk, compiled in if system doesn't have a
+         working mktime(3)
+
+lib/sh/strftime.c
+       - new file, from gawk, compiled in if system doesn't have a
+         working strftime(3)
+
+lib/sh/Makefile.in, Makefile.in
+       - changes for mktime.c, strftime.c
+
+configure.in
+       - call AC_FUNC_MKTIME, AC_STRUCT_TM, AC_STRUCT_TIMEZONE
+       - call AC_REPLACE_FUNC(strftime)
+
+config.h.in
+       - add defines for TM_IN_SYS_TIME, HAVE_TZSET, HAVE_TM_ZONE,
+         HAVE_STRUCT_TM_TM_ZONE, HAVE_STRFTIME
+
+externs.h
+       - provide an extern declaration for strftime if HAVE_STRFTIME is
+         not defined and NEED_STRFTIME_DECL is
+
+lib/tilde/tilde.h
+       - header files should not include <config.h>
+
+parse.y
+       - replace code in decode_prompt_string that chops up value returned
+         by ctime(3) with calls to strftime -- as a result, the expansion
+         of \@ has changed slightly (since it depends on the locale)
+       - added new \D{format} prompt string escape; `format' is passed to
+         strftime(3).  Empty format is the same as `%X' (locale-specific
+         representation of the current time)
+       - combined cases for '\\', '\a', '\e', and '\r' in same case branch
+         in decode_prompt_string
+
+doc/{bash.1,bashref.texi}
+       - documented new \D{format} prompt string expansion
+
+builtins/printf.def
+       - use ISO C PRIdMAX instead of INTMAX_CONV
+       - pass length of format modifiers to mklong instead of computing it
+         with strlen()
+
+lib/sh/{fmtulong,fmtullong}.c
+       - changes from Paul Eggert to make more general
+
+arrayfunc.c
+       - when converting a variable to an array, make sure to unset the
+         dynamic_value and assign_func members of the struct variable,
+         since they're not valid anymore
+
+                                  12/27
+                                  -----
+configure.in
+       - use AC_HELP_STRING in AC_ARG_WITH and AC_ARG_ENABLE 
+       - remove AC_ARG_ENABLE for largefile, since AC_SYS_LARGEFILE adds
+         one
+
+                                1/2/2002
+                                --------
+{alias,bashline,execute_cmd,general,shell,subst,variables,arrayfunc}.c,general.h
+       - changed some calls to strchr to calls to xstrchr for multibyte
+         characters
+
+include/shmbutil.h
+       - add extern declaration for xstrchr to avoid including externs.h
+         where it's not appropriate
+
+{braces,make_cmd,pathexp,subst,arrayfunc}.c, lib/sh/xstrchr.c
+       - include shmbutil.h
+
+{stringlib,subst}.c, {externs,subst}.h
+       - moved substring() from subst.c to stringlib.c, moved declaration
+         from subst.h to externs.h
+
+lib/sh/xmbsrtowcs.c
+       - new file, replacement function for mbsrtowcs
+
+lib/sh/Makefile.in
+       - add entries for xmbsrtowcs.c
+
+Makefile.in
+       - add dependencies on shmbutil.h to appropriate object files
+
+lib/glob/strmatch.c
+       - break character-class testing out into separate function:
+         is_cclass, in prep for multibyte changes
+
+{braces,make_cmd}.c
+       - changes for multibyte characters
+
+builtins/printf.def
+       - changes from Paul Eggert to just use intmax_t everywhere an
+         int/long/quad is needed and print with "%ld" if the number
+         fits in a long and %PRIdMAX otherwise
+       - remove getlong, getulong, getllong, getullong, since they're
+         no longer needed
+       - use a new type `floatmax_t' to print floating point numbers, the
+         widest-available floating point type (like `intmax_t'); new
+         function `getfloatmax' that calls strtold or strtod as appropriate
+       - remove getdouble, getldouble, since they're no longer needed
+
+lib/sh/fmtumax.c
+       - new file, string-to-[u]intmax_t conversion, just includes
+         fmtulong.c with the right defines
+
+Makefile.in, lib/sh/Makefile.in
+       - additions for fmtumax.c
+
+bashtypes.h
+       - include <inttypes.h> if it's available
+
+expr.c
+       - arithmetic is now in intmax_t instead of long
+
+externs.h
+       - extern declaration for fmtumax
+       - change extern declarations for evalexp, itos, inttostr,
+         uitos, uinttostr since they now return or use intmax_t instead
+         of long
+
+{execute_cmd,general,mailcheck,subst,variables}.c, parse.y
+{array,general,subst,test,variables}.h
+lib/sh/{itos,netopen}.c
+builtins/{bashgetopt,common}.c, builtins/common.h
+builtins/{break,fc,history,jobs,let,printf,pushd,read,shift,wait}.def
+       - changes for intmax_t shell arithmetic conversion
+
+doc/{bashref.texi,bash.1}
+       - documented long->intmax_t shell arithmetic conversion
+
+sig.c
+       - in initialize_terminating_signals, if we've already trapped a
+         terminating signal, don't reset the signal handler for it
+
+                                   1/3
+                                   ---
+{arrayfunc,pathexp}.c, parse.y
+       - changes for multibyte chars
+
+parse.y, lib/sh/strtrans.c
+       - moved ansiexpand from parse.y to lib/sh/strtrans.c
+
+parse.y, locale.c
+       - moved mk_msgstr and localeexpand from parse.y to locale.c
+
+parse.y
+       - new function, yy_input_name, returns name of input file from
+         bash_input.name
+       - broke the code that parses ((...)) constructs out of read_token
+         into a new function, parse_dparen()
+
+externs.h
+       - new extern declaration for ansiexpand(), mk_msgstr(), and
+         localeexpand()
+
+input.h
+       - new extern declaration for yy_input_name()
+
+{error,locale}.c
+       - use yy_input_name for error and other messages
+
+execute_cmd.c
+       - change shell_execve to make sure that the file is executable
+         before looking at the interpreter to find out why the execve()
+         failed (avoids misleading error message)
+
+lib/glob/glob.c
+       - move code that matches leading `.' and skips those filenames into
+         a separate function: skipname(), so there can be unibyte and
+         multibyte versions of that function
+
+                                   1/7
+                                   ---
+subst.c
+       - more changes for multibyte characters
+
+print_cmd.c
+       - change semicolon() so it doesn't output a `;' immediately after a
+         newline, since that results in a null command, which is a syntax
+         error
+
+variables.c
+       - fix indirection_level_string to turn off set -x while evaluating
+         PS4
+
+                                   1/8
+                                   ---
+builtins/set.def
+       - make -o options into one struct, instead of separate structs for
+         option names corresponding to flags and non-flag option names.
+         This has the side effect of sorting the option names in output
+
+lib/glob/glob.c
+       - new function, mbskipname(), multibyte char version of skipname()
+       - removed all #ifndef SHELL code, this will never be used outside
+         the shell
+
+include/posixdir.h
+       - move REAL_DIR_ENTRY define here from lib/glob/glob.c
+
+lib/glob/glob_loop.c
+       - new file, included in glob.c for unibyte and multibyte versions of
+         glob_pattern_p
+       - added some forward static function declarations with prototypes
+       - more changes for multibyte character handling
+
+lib/glob/Makefile.in
+       - make glob.c depend on glob_loop.c
+       - changes for xmbsrtowcs.[co]
+
+lib/glob/xmbsrtowcs.c
+       - moved here from lib/sh, since the matching functions use it, and
+         libglob.a is linked after libsh.a
+
+                                   1/9
+                                   ---
+lib/glob/smatch.c
+       - new file, with strmatch (now xstrmatch) and associated functions,
+         with changes for multibyte chars
+
+lib/glob/sm_loop.c
+       - new file, included by smatch.c, with `generic' versions of matching
+         functions that are compiled twice:  once each for single-byte and
+         multibyte characters
+
+lib/glob/strmatch.c
+       - strip out everything except strmatch(), which either calls fnmatch
+         (if HAVE_LIBC_FNM_EXTMATCH is defined) or xstrmatch
+
+lib/glob/collsyms.c
+       - changes for multibyte chars
+
+lib/glob/Makefile.in, Makefile.in
+       - changes for new source files
+
+                                  1/10
+                                  ----
+lib/readline/complete.c
+       - new function, rl_completion_mode (rl_command_func_t *func), returns
+         the appropriate value to pass to rl_complete_internal depending on
+         FUNC and the value of `show-all-if-ambiguous'.  This allows
+         application completion functions to present the same interface as
+         rl_complete
+
+lib/readline/readline.h
+       - new extern declaration for rl_completion_mode()
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_completion_mode
+
+lib/readline/readline.[ch]
+       - bumped the version number to 4.3, changing the relevant cpp defines
+
+configure.in
+       - require that an installed readline version be at least readline-4.3
+
+bashline.c
+       - converted bash-specific completion functions to use
+         rl_completion_mode instead of passing TAB unconditionally
+
+builtins/bashgetopt.c
+       - the `#' option specifier now means a required numeric argument,
+         not an optional one
+
+builtins/type.def
+       - when converting [-]-{path,type,all} to -[pta], don't bother
+         freeing and reallocating the option string; just change opt[1]
+         and null opt[2]
+
+lib/sh/snprintf.c
+       - support %ls/%S and %lc/%C for wide strings and characters,
+         respectively, if HANDLE_MULTIBYTE is defined
+
+mailcheck.c
+       - don't print a message about new mail if the file has not grown,
+         even if the access time is less than the modification time
+
+                                  1/14
+                                  ----
+lib/readline/readline.c
+       - new function, rl_replace_line, to replace the readline line buffer
+         with the text supplied as an argument
+       - new function, rl_replace_from_history, replaces readline line
+         buffer with text from history entry passed as argument (undocumented,
+         not in readline.h because it requires a definition of
+         HIST_ENTRY for the prototype)
+
+lib/readline/readlne.h
+       - new extern declaration for rl_replace_line
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_replace_line
+
+lib/readline/{isearch,readline,search}.c
+       - use rl_replace_line and rl_replace_from_history where appropriate
+
+lib/readline/readline.c
+       - broke the code that sets point after moving through the history
+         (_rl_history_preserve_point and _rl_history_saved_point) out
+         into a separate function, _rl_history_set_point()
+
+lib/readline/{complete.c,rlprivate.h}
+       - find_completion_word -> _rl_find_completion_word
+       - free_match_list -> _rl_free_match_list
+
+lib/readline/complete.c
+       - postprocess_matches and _rl_free_match_list now return immediately
+         if passed a null match list
+
+variables.c
+       - new function, find_local_variable, finds a local variable by name
+         at the current variable context
+       - in find_variable_internal, call find_local_variable before searching
+         any of the temporary environments if variable_context > 0 (meaning
+         we're in a shell function).  This lets a local variable
+         override a variable whose value was passed in the `function
+         environment'
+
+                                  1/15
+                                  ----
+variables.h, execute_cmd.c
+       - declare variables describing the temporary environments in
+         variables.h instead of in C files
+
+findcmd.c, builtins/setattr.def
+       - instead of calling find_tempenv_variable, use find_variable_internal
+         and check whether the returned SHELL_VAR * has the tempvar
+         attribute
+
+variables.c
+       - tentative change to lookup order in find_variable_internal so that
+         function local variables are found before variables in
+         function_env when executing a shell function
+       - change make_local_variable to handle making a local variable when
+         a variable with the same name already appears in one of the
+         temporary environments
+       - broke the body of make_var_array out into a new function:
+               static char **make_env_array_from_var_list (SHELL_VAR **vars)
+       - new function, make_var_array_internal, takes a hash table to look
+         in and a pointer to a mapping function and returns a char **
+         environment-style list
+       - make_var_array now just calls make_var_array_internal
+       - new mapping function, local_and_exported, returns all local variables
+         in the current variable context with the export attribute set
+       - new function, make_local_export_array, returns an environment-style
+         char ** array of exported local variables in current context
+       - change environment creation order in maybe_make_export_env to
+         add variables to the environment in opposite order that
+         find_variable_internal uses.  This means that local variables in
+         shell functions override variables with the same name in the
+         function_env
+       - change make_local_variable to set the initial value of the
+         variable it creates to NULL to make the `is set' and `is null'
+         tests that the expansion code does work right
+       - change make_local_variable to inherit the value of a variable with
+         the same name from the temporary enviroment
+
+                                  1/16
+                                  ----
+Makefile.in
+       - link bashversion with buildversion.o instead of version.o, for
+         cross-compiling.  version.o is for the target system;
+         buildversion.o is for the build system
+
+error.c
+       - add line numbers to internal_error() messages if the shell is
+         not interactive and running a shell script or a -c command
+       - report_error now prints non-zero line numbers for non-interactive
+         shells
+
+test.c
+       - test_syntax_error now calls builtin_error() instead of printing
+         its own messages
+
+builtins/common.c
+       - builtin_error now prints line numbers if a non-interactive shell
+         is running a shell script or a -c command
+
+print_cmd.c
+       - in cprintf, remove free_argp, since it's not used
+
+builtins/history.def
+       - make `history -n' increment the number of history lines in this
+         session by the number of lines read from the history file
+
+arrayfunc.c
+       - fix array_value_internal to expand the subscript even if the
+         variable is unset, so side effects produced by the arithmetic
+         evaluation will take place
+
+lib/readline/doc/{rluser,rltech}.texinfo
+       - some fixes for printing in @smallbook format from Brian
+         Youmans
+
+                                  1/17
+                                  ----
+jobs.h
+       - new PRUNNING, PSTOPPED, PDEADPROC defines for PROCESSes, analogous
+         to RUNNING, STOPPED, and DEADJOB defines for jobs
+
+jobs.c
+       - use PS_RUNNING, PS_DONE, PS_STOPPED values for `running' field
+         of a PROCESS
+       - find_pipeline and find_job now take an additional flags argument
+         that, if non-zero, means to find only running processes; changed
+         all callers
+       - changed calls to find_pipeline and find_job made from waitchld
+         to find only running processes
+       - find_pipeline takes a third argument: an int *.  If it looks in
+         the jobs list to find the pid, and the arg is non-null, it passes
+         the job index back to the caller.  Used to avoid calls to
+         find_pipeline immediately followed by find_job with the same PID
+
+nojobs.c
+       - a couple of changes to make sure that set_pid_status is never
+         called with a pid argument of 0 or -1
+
+trap.c
+       - change trap_handler to longjmp to wait_intr_buf (set by wait_builtin)
+         if a signal is received for which a trap has been set during
+         execution of the wait builtin (need to include builtins.h and
+         builtins/builtext.h and declare some extern variables for the
+         right things to check)
+       - new variable to keep track of which signal caused the longjmp to
+         wait_intr_buf, set by trap_handler (wait_signal_received)
+
+builtins/wait.def
+       - set the return value of wait when a longjmp(wait_intr_buf, 1) is
+         done to 128 + wait_signal_received
+
+{jobs,nojobs}.c
+       - set wait_signal_received to SIGINT in wait_sigint_handler before
+         the longjmp(wait_intr_buf, 1)
+
+                                  1/18
+                                  ----
+bashline.c
+       - turn off rl_filename_completion_desired when completing a command
+         name with a single match only if the first char of that match is
+         not a `/'
+       - if there are multiple identical matches for a command name in
+         attempt_shell_completion, turn off rl_filename_completion_desired
+         if the first char is not a `/' to avoid readline appending a
+         slash if there's a directory with the same name in the current
+         directory
+
+                                  1/22
+                                  ----
+lib/readline/complete.c
+       - new variable, _rl_page_completions, to control whether we want to
+         run the internal pager when listing completions (defaults to 1)
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_page_completions
+
+lib/readline/bind.c
+       - new bindable variable, `page-completions', controls value of
+         _rl_page_completions
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+       - documented `page-completions' variable
+
+Makefile.in
+       - use $(INSTALL_SCRIPT) instead of $(INSTALL_PROGRAM) to install
+         `bashbug'
+
+aclocal.m4
+       - fix small quoting problem in RL_LIB_READLINE_VERSION macro
+
+lib/readline/terminal.c
+       - fetch and save terminal's `vs' and `ve' cursor control attributes
+       - fetch and save terminal's `kI' attribute (string sent by Insert)
+       - new function, _rl_set_cursor, sets cursor to normal (insert mode)
+         or very visible (overwrite mode)
+
+lib/readline/readline.c
+       - new global variable, rl_insert_mode
+       - new function to toggle overwrite mode, rl_overwrite_mode
+       - each new line starts in insert mode
+       - switching to vi mode or emacs mode resets to insert mode
+       - reset cursor to normal before returning line
+       - _rl_replace_text now returns the number of characters inserted,
+         the return value from rl_insert_text
+       - new function, _rl_insert_or_replace_text (const char *string, int insert),
+         either inserts STRING or replaces the number of chars in STRING
+         with STRING starting at rl_point, depending on value of INSERT
+       - renamed rl_insert to _rl_insert_char, rl_insert just calls
+         _rl_insert_char with the same arguments when in insert mode
+       - new function, _rl_overwrite_char, handles self-insert in overwrite
+         mode.  Does multibyte chars by reading an entire multibyte character
+         before entering overwrite loop
+       - new function, _rl_overwrite_rubout, handles RUBOUT when in
+         overwrite mode, called from rl_rubout
+       - new function, _rl_rubout_char, old body of rl_rubout; rl_rubout
+         calls this when not in overwrite mode 
+
+lib/readline/readline.h
+       - extern declarations for rl_insert_mode and rl_overwrite_mode()
+
+lib/readline/rldefs.h
+       - define constants for values of rl_insert_mode
+
+lib/readline/rlprivate.h
+       - extern declarations for _rl_set_cursor and _rl_set_insert_mode
+       - change type of _rl_replace_text to return int
+       - extern declarations for _rl_insert_char, _rl_rubout_char
+
+lib/readline/funmap.c
+       - new bindable name `overwrite-mode', bound to rl_overwrite_mode
+
+lib/readline/rlconf.h
+       - define CURSOR_MODE if you want the cursor to show insert or
+         overwrite mode (only available if both `vs' and `ve' capabilities
+         are present)
+
+lib/readline/{complete,parens,readline,search,vi_mode}.c
+       - change calls to rl_insert to _rl_insert_char
+
+lib/readline/{readline,search}.c
+       - change calls to rl_rubout to _rl_rubout_char to avoid overwrite
+         mode problems
+
+lib/readline/vi_mode.c
+       - fix rl_vi_overstrike to just call _rl_overwrite_char, which
+         handles multibyte chars
+
+lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
+       - document new `overwrite-mode' command
+
+                                  1/23
+                                  ----
+lib/readline/readline.c
+       - return 0 immediately from rl_insert_text if the string to insert
+         is NULL or ""
+
+bashline.c
+       - if a numeric argument is given to one of the bash-specific glob
+         pattern completion functions (including TAB), append a `*' to
+         the word before generating matches
+       - in attempt_shell_completion, when doing glob completion, only
+         set the match list to NULL if rl_completion_type == TAB and
+         there is more than one completion.  This permits listing completions
+         with double tabs and displaying ambiguous completions
+       - new function, bash_glob_complete_word, appends a `*' to the word
+         to be completed and then globs it.  It uses a new filename
+         quoting function (bash_glob_quote_filename) to avoid quoting
+         globbing characters in the filename if there are no matches or
+         multiple matches
+
+lib/readline/complete.c
+       - set completion_changed_buffer to 0 in rl_complete_internal if
+         no matches were produced by the completion generator function
+       - new variable, rl_completion_suppress_append, suppresses appending
+         of rl_completion_append_character.  Settable by application
+         completion functions, always 0 when application completion
+         functions are called (set to 0 by rl_complete_internal and
+         rl_menu_complete)
+       - broke the code that assigns default values to readline completion
+         variables out of rl_complete_internal and rl_menu_complete into
+         a new function, set_completion_defaults (int what_to_do)
+
+lib/readline/readline.h
+       - extern declaration for rl_completion_suppress_append
+
+lib/readline/doc/rluser.texinfo, doc/bash.1
+       - documented behavior of glob-expand-word and glob-list-expansions
+         when supplied a numeric argument
+       - documented glob-complete-word
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_completion_suppress_append
+
+                                  1/24
+                                  ----
+lib/readline/text.c
+       - new file, text and character handling functions from readline.c
+
+lib/readline/misc.c
+       - new file, miscellanous bindable functions and their supporting
+         code from readline.c
+
+Makefile.in, lib/readline/Makefile.in
+       - changes for text.c, misc.c
+
+lib/readline/bind.c
+       - change ISKMAP case of rl_invoking_keyseqs_in_map to output
+         ESC as "\M-" instead of "\e" -- it's closer to the documentation
+       - change _rl_get_keyname to output ESC as \e instead of \C-[
+         (it's easier to understand)
+
+pcomplete.h
+       - new flag, COPT_NOSPACE
+
+builtins/complete.def
+       - new `-o nospace' option for complete and compgen (though it doesn't
+         really do anything for compgen, since that doesn't hand anything
+         off to readline)
+
+bashline.c
+       - if a programmable completion specifies COPT_NOSPACE, set
+         rl_completion_suppress_append = 1
+
+lib/readline/doc/rluser.texinfo
+       - documented new `-o nospace' option to complete and compgen
+
+doc/{bash.1,bashref.texi}
+       - documented $'\cX' escape sequence (forgot to before)
+
+                                  1/28
+                                  ----
+variables.c
+       - make_new_variable now takes the HASH_TABLE * as its second
+         argument; changed callers
+       - new function, bind_variable_in_table, takes the HASH_TABLE * as
+         its third paramter; bind_variable calls bind_variable_in_table
+         with shell_variables as third argument
+
+variables.h
+       - new struct var_context, variable context (per-scope -- global,
+         function local, etc.)
+
+variables.[ch],builtins/common.[ch]
+       - moved functions that push and pop a variable context from
+         builtins/common.c to variables.c; move extern function
+         declarations to variables.h
+       - new function, all_local_variables
+       - variable_in_context is now static, used only by all_local_variables
+
+variables.[ch],execute_cmd.c
+       - push_context now takes the function name as an argument for
+         future use
+       - push_context takes an indication of whether or not the function is
+         executing in a subshell and saves the positional parameters only
+         if not in a subshell
+       - new functions for managing a stack of variable contexts and
+         scopes:  new_var_context, dispose_var_context, push_var_context,
+         pop_var_context, push_scope, pop_scope
+
+builtins/declare.def
+       - call all_local_variables instead of map_over (...) in declare_internal
+       - don't call make_local_variable if we're looking at functions
+         ((flags_on & att_function) != 0), since it's wasted
+       - make sure VAR is set to NULL if check for variable_context fails
+         and we didn't just create or fetch a local variable in
+         declare_internal
+       - in non-function branch of declare_internal, only call find_variable
+         if VAR is NULL -- if it's not null, we just created or fetched a
+         local variable and don't need to do it again
+
+                                  1/29
+                                  ----
+variables.[ch]
+       - the temporary environments (temporary_env, builtin_env, function_env)
+         are now HASH_TABLEs instead of argv-style arrays of strings (this
+         is an intermediate step on the way to the new lcc-inspired symbol
+         table scope structure)
+       - new internal attribute for variables: att_propagate.  This means
+         to propagate the value out of the temporary environment up the
+         (for now implicit) chain of variable scopes when the containing
+         temporary environment is deleted
+
+variables.c
+       - assign_in_env now adds to the HASH_TABLE temporary_env instead
+         of making environment-style strings in an array of strings
+       - changed the way the temporary environments are merged into the
+         shell variable table to account for the new HASH_TABLE temp
+         environments
+       - changed the way the export environment is created due to the new
+         structure of the temporary environments
+       - new function, bind_variable_internal (name, value, table), binds
+         NAME to have VALUE in TABLE without searching the temporary
+         environments
+       - removed: shell_var_from_env_string, bind_name_in_env_array
+       - variable_in_context now checks the att_local attribute and makes
+         sure the variable is not invisible
+       - local_and_exported now makes sure the variable is not invisible
+
+execute_cmd.c
+       - we no longer need to copy the temporary environment to function_env
+         or builtin_env, we can simply use variable assignments
+
+{findcmd,subst,variables}.c, builtins/{declare,setattr}.def
+       - since variables from the temporary environments are no longer turned
+         into SHELL_VARs on the fly, don't dispose the SHELL_VAR returned
+         by find_variable or find_variable_internal
+       - need to savestring() the value returned by find_variable if it has
+         the tempvar attribute before calling bind_variable on it, because
+         bind_variable will search and bind into the temporary environments
+         and will free the old value before binding the new.  For temporary
+         environments, these two pointers will be the same, and
+         bind_tempenv_variable will end up using freed memory
+
+builtins/{declare,setattr}.def
+       - set the att_propagate attribute when exporting or making readonly
+         variables from the temp environment (i.e., `var=value declare -x var'
+         or `var=value export var' sets the propagate attribute on the entry
+         for `var' in the temporary environment HASH_TABLE)
+
+lib/readline/isearch.c
+       - ^W when reading isearch string yanks the current word out of the
+         current line into the search string, skipping the portion already
+         matched
+       - ^Y when reading isearch string yanks the rest of the current line
+         into the search string, skipping the portion already matched
+
+                                  1/30
+                                  ----
+{print_cmd,variables}.c
+       - moved indirection_level_string() from variables.c to print_cmd.c
+
+{externs,variables}.h
+       - moved extern declaration of indirection_level_string to externs.h
+
+{general,variables}.c
+       - moved assignment() from variables.c to general.c
+
+{general,variables}.h
+       - moved extern declaration of assignment() to general.h
+
+{externs,input}.h
+       - moved extern declaration of decode_prompt_string to externs.h
+
+print_cmd.c
+       - include flags.h, don't include stdc.h
+
+variables.c
+       - moved some functions around to group functions better
+       - changed new_shell_variable to explicitly initialize each member
+         of the created struct variable instead of calling bzero()
+       - make_new_variable now just calls new_shell_variable instead
+         of duplicating what it does
+       - removed some code in bind_function that duplicated what
+         new_variable does on the newly-created SHELL_VAR
+       - since there are no local function variables (functions are always
+         made at the global scope), kill_all_local_variables() doesn't
+         need to consider functions
+
+                                  1/31
+                                  ----
+variables.c
+       - sort the array of special variables
+       - short-circuit the search in stupidly_hack_special_variables if
+         the passed name can't be found in the rest of the array
+         (that is, if name[0] < special_vars[i].name[0])
+
+lib/readline/history.c
+       - unstifle_history() was returning values exactly opposite of
+         the documentation
+
+lib/readline/doc/{hsuser.texinfo,history.3}
+       - clarified the unstifle_history() documentation a little
+
+                                   2/4
+                                   ---
+variables.c
+       - in bind_variable, don't call bind_tempenv_variable after a
+         find_tempenv_variable succeeds -- just change the value inline.
+         There's no reason to look it up twice
+       - change makunbound to only call stupidly_hack_special_variables
+         if we're not unsetting a function
+
+variables.[ch]
+       - new function, unbind_function, like makunbound but doesn't mess
+         with previous contexts or calling stupidly_hack_special_variables
+
+builtins/set.def
+       - change unset_builtin to call either unbind_func or unbind_variable
+
+builtins/getopts.def
+       - call unbind_variable(name) instead of makunbound(name, shell_variables)
+
+                                   2/5
+                                   ---
+lib/glob/sm_loop.c
+       - use malloc instead of xmalloc in BRACKMATCH and handle failures
+
+error.c
+       - add extern declaration of executing_line_number with prototype,
+         since execute_cmd.h can't be included without including other
+         files
+
+lib/readline/parens.c
+       - include <unistd.h>
+
+lib/malloc/stats.c
+       - include <unistd.h>
+       - add extern declaration of malloc_free_blocks() with prototype
+
+pathexp.c
+       - added some forward declarations with prototypes for static functions
+
+lib/readline/rlprivate.h
+       - removed declarations of rl_untranslate_keyseq, rl_discard_argument,
+         rl_stop_output, rl_alphabetic since they appear in readline.h
+
+                                   2/6
+                                   ---
+{arrayfunc,execute_cmd,pcomplete,shell}.c
+       - change calls to makunbound(name, shell_variables) to
+         unbind_variable (name)
+
+                                   2/7
+                                   ---
+builtins/getopt.c
+       - don't defer incrementing of OPTIND when an invalid option is
+         encountered until the next call to sh_getopt() -- what if OPTIND
+         is reset before that next call?  This means that OPTIND is always
+         incremented to the next option to be handled when an option is
+         returned, whether it's valid or not.  This is what POSIX-2002
+         says to do.
+
+syntax.h
+       - new #define, CSUBSTOP
+
+mksyntax.c
+       - add "-=?+" with value CSUBSTOP to the syntax table.  These are the
+         valid expansion operators OP in ${param[:]OPword}
+
+subst.c
+       - use table lookup for CSUBSTOP in VALID_PARAM_EXPAND_CHAR
+       - new flags for the string extraction functions:  EX_NOALLOC.  This
+         indicates that the functions are being used only to skip over
+         strings and the result won't be used, so the substring shouldn't
+         be allocated, copied, and freed
+       - new flag for string_extract:  EX_VARNAME.  This serves the same
+         purpose as the old `varname' parameter.  parameter_brace_expand()
+         changed appropriately
+       - extract_delimited_string and extract_dollar_brace_string now take
+         an additional `flags' argument, which may include EX_NOALLOC
+       - changed callers of extract_delimited_string and
+         extract_dollar_brace_string appropriately
+       - string_extract now understands EX_NOALLOC; callers changed
+       - some smaller code cleanups
+       - converted char_is_quoted(), unclosed_pair(), and skip_to_delim()
+         to understand multibyte characters
+
+                                  2/11
+                                  ----
+variables.[ch]
+       - moved to a symbol organization inspired by lcc.  The basic structure
+         is no longer a HASH_TABLE, but a VAR_CONTEXT, which includes a hash
+         table as one of its members.  VAR_CONTEXTs are linked together to do
+         variable scoping.  One nice thing about this is that the entire
+         symbol table doesn't need to be searched at function scope exit to
+         remove local variables.  Fixes problems with only one instance of
+         builtin_env and function_env, even though it really is a stack
+       - shell_variables is now a VAR_CONTEXT *, with a global_variables
+         variable that points to the bottom of the stack for fast access
+       - function-scope local variables (assignments specified on the command
+         line before a function call) and function-local variables (declared
+         with the `local' builtin) have been unified in the same variable
+         context, replacing function_env
+       - assignment statements preceding the `.' and `eval' builtins are now
+         a separate variable scope VAR_CONTEXT, replacing builtin_env
+       - temporary_env (a HASH_TABLE) is now the only separate environment
+       - changes to export environment creation, variable binding, variable
+         lookup, local variable propagation all changed to work with the
+         new symbol table/scope structure
+       - a SHELL_VAR no longer has a `prev_context' member; it's not needed
+
+execute_cmd.c
+       - changes to push_context calls to include any temporary variables in
+         temporary_env; pop_context takes care of propagating any temporary
+         variables if necessary
+       - calls to push_scope if `eval' or `.' is called with a list of
+         preceding variable assignments, and pop_scope called at end of
+         builtin's execution.  pop_scope takes care of merging temporary
+         variables into the shell environment when appropriate
+
+builtins/{setattr,declare}.def
+       - changes to account for variable assignments preceding `local',
+         `export', `readonly', `declare', etc. to work with the new
+         variable scoping implementation
+
+shell.c
+       - since shell_variables is now a VAR_CONTEXT, call
+         delete_all_contexts() when the shell is reinitializing instead of
+         delete_all_variables()
+
+builtins/common.c
+       - new function, get_job_by_name(), used by execute_simple_command()
+         for the `auto_resume' stuff and get_job_spec()
+
+builtins/common.h
+       - new set of #defined constants for flags argument to
+         get_job_by_name()
+
+                                  2/12
+                                  ----
+command.h
+       - new redirection operator: r_reading_string for `here strings'
+
+parse.y
+       - new token, LESS_LESS_LESS, for new redirection `here string'
+         operator: [N]<<< word
+       - recognize LESS_LESS_LESS and create the appropriate redirection
+
+{dispose_cmd,copy_cmd,make_cmd,print_cmd}.c
+       - recognize r_reading_string and do the right thing (dispose_redirects,
+         copy_redirect, print_redirection, and make_redirection, respectively)
+
+redir.c
+       - here_document_to_fd now takes the redirection operator as its
+         second argument
+       - new function, write_here_string, expands a here string and writes it
+         to the here document file descriptor
+       - here_document_to_fd calls write_here_string for r_reading_string
+         operator
+       - handle r_reading_string in do_redirection_internal() and
+         stdin_redirection()
+
+                                  2/18
+                                  ----
+doc/{bash.1,bashref.texi}
+       - documented here strings
+
+{configure,Makefile}.in
+       - bumped version number up to bash-2.05b and the release status
+         to alpha1
+
+expr.c
+       - make expr_streval understand that variables with the `invisible'
+         attribute are really unset, and accessing such a variable when
+         `set -u' is set should be an error
+
+variables.h
+       - new accessor macros: var_isset(var) and var_isnull(var), test
+         whether var->value is NULL
+
+{eval,subst,variables}.c, builtins/{declare,setattr}.def
+       - be more consistent about using value_cell(var) instead of
+         directly referencing var->value
+       - use var_isset and var_isnull where appropriate
+
+builtins/help.def
+       - augmented a couple of help strings with pointers to `info' and
+         `man -k'
+
+                                  2/14
+                                  ----
+variables.h
+       - new macros to use when setting variable values directly instead of
+         through bind_variable and its siblings
+
+{arrayfunc,variables}.c
+       - use var_setarray and other lvalue macros instead of assigning to
+         var->value directly
+
+builtins/setattr.def
+       - change show_var_attributes to show function definitions separately
+         from function attributes.  This allows the output of `declare -f'
+         (with other flags), `export -f', and `readonly -f' to be reused as
+         shell input, instead of the old
+
+               declare -f[flags] func()
+               {
+                       foo
+               }
+
+         which has syntax errors.  When in posix mode, `export -fp' and
+         `readonly -fp' still don't print function definitions
+
+                                  2/16
+                                  ----
+parse.y
+       - comment out calls to discard_parser_constructs; no need to call
+         empty functions
+
+                                  2/18
+                                  ----
+lib/sh/memset.c
+       - replacement function for memset(3)
+
+lib/sh/Makefile.in, Makefile.in
+       - additions for memset.c
+
+configure.in,config.h.in
+       - check for memset, define HAVE_MEMSET if found, add memset.o to
+         LIBOBJS if not
+
+lib/malloc/malloc.c
+       - removed zmemset(), replaced with calls to memset(3)
+
+{subst,execute_cmd,lib/sh/netopen}.c
+       - replaced calls to bzero with calls to memset
+
+subst.c
+       - word_split() now takes a second argument: the value of $IFS, so
+         it doesn't have to look up IFS every time
+       - word_list_split() now calls getifs() and passes the result to
+         each call to word_split() as its second arg
+       - do a quick scan for CTLNUL in remove_quoted_nulls before allocating
+         new string, copying old string to it, copying over original string
+         and freeing new string
+
+eval.c
+       - don't bother calling dispose_used_env_vars if temporary_env is NULL
+
+execute_cmd.c
+       - fix fix_assignment_words to only look up the builtin corresponding
+         to the first word if one of the words in the list is marked as
+         W_ASSIGNMENT
+
+hashlib.c
+       - renamed hash_string to hash_bucket, which better reflects what it
+         does
+       - extracted the portion of hash_bucket that computes the hash out
+         into a new hash_string()
+       - made new body of hash_bucket into a macro HASH_BUCKET; function
+         just calls the macro
+       - calls to hash_bucket in this file now call HASH_BUCKET macro
+       - in add_hash_item, just add a new item at the front of the appropriate
+         bucket list instead of at the end
+
+hashcmd.h
+       - reduced FILENAME_HASH_BUCKETS to 53 from 107
+
+                                  2/19
+                                  ----
+hashlib.[ch]
+       - find_hash_item, remove_hash_item, add_hash_item all take a new
+         third `flags' argument
+       - add_hash_item doesn't call find_hash_item if HASH_NOSRCH passed in
+         flags arg
+       - find_hash_item will create a new hash table entry if HASH_CREATE is
+         passed in flags arg
+       - new function, hash_walk, takes a pointer to a function and a table
+         and calls the function for each item in the table.  If the function
+         returns < 0, the walk is terminated
+       - fixed flush_hash_table to set table->nentries to 0 after freeing
+         all entries
+       - BUCKET_CONTENTS now has a new `khash' member, what key hashes to;
+         set by HASH_BUCKET macro (which calls hash_string), assigned in
+         find_hash_item (HASH_CREATE) and add_hash_item
+       - find_hash_item and remove_hash_item check `khash' against the
+         hash of the string argument before calling strcmp
+
+{alias,hashlib,hashcmd,pcomplib,variables}.c
+       - changed all calls to {find,remove,add}_hash_item
+
+builtins/hash.def
+       - return immediately from print_hashed_commands if there are no
+         entries in the hash table (this eliminates need for `any_printed'
+         variable)
+       - change print_hashed_commands to use hash_walk
+
+alias.c
+       - short-circuit all_aliases and map_over_aliases if
+         HASH_ENTRIES(aliases) == 0
+       - simplify map_over_aliases by just allocating enough room in the
+         returned list for all entries in the aliases hash table, instead
+         of doing the check and xrealloc
+       - add_alias now calls add_hash_item with HASH_NOSRCH argument
+
+pcomplete.h
+       - sh_csprint_func_t is no more; use hash_wfunc instead
+
+pcomplib.c
+       - short-circuit print_all_compspecs if HASH_ENTRIES(prog_completes)
+         is 0
+       - print_all_compspecs now takes a `hash_wfunc *' argument
+       - print_all_compspecs now just calls hash_walk
+
+builtins/complete.def
+       - new function, print_compitem, takes a BUCKET_CONTENTS *, extracts
+         the right info, and calls print_one_completion
+
+variables.c
+       - short-circuit map_over_funcs if HASH_ENTRIES(shell_functions) == 0
+       - short-circuit flatten if the passed table has no entries
+       - bind_variable_internal takes a new fourth argument: `hflags',
+         to pass to hash table functions
+       - make_new_variable now passes HASH_NOSRCH flag to add_hash_item
+       - set_if_not now calls bind_variable_internal and passes
+         HASH_NOSRCH as flags argument
+       - bind_function now calls add_hash_item with HASH_NOSRCH argument
+       - fixed make_local_variable:  old_var == 0 && was_tmpvar can never
+         be true
+       - if we didn't find an old variable in make_local_variable, call
+         bind_variable_internal with HASH_NOSRCH argument
+       - fix push_temp_var to reset variable context to 0 if binding into
+         global_variables->table
+
+parse.y
+       - fix to parse_compound_assignment to avoid core dumps on empty
+         compound array assignments
+
+subst.c
+       - getifs() is now global so read_builtin can call it
+
+subst.h
+       - extern declaration for getifs()
+
+                                  2/20
+                                  ----
+hashlib.c
+       - changed hash_string to use a better hash function
+       - changed HASH_BUCKET to use masking rather than modulus to hash a
+         string to a bucket -- HASH TABLES MUST NOW BE SIZED BY POWERS
+         OF TWO
+
+hashlib.h
+       - DEFAULT_HASH_BUCKETS is now 64
+
+hashcmd.h
+       - FILENAME_HASH_BUCKETS is now 64
+
+pcomplib.c
+       - COMPLETE_HASH_BUCKETS is now 32
+
+variables.c
+       - TEMPENV_HASH_BUCKETS is now 4
+
+alias.c
+       - new define, ALIAS_HASH_BUCKETS, set to 16, used to size alias table
+
+hashlib.c
+       - removed initialize_hash_table; folded code into make_hash_table
+       - fixed copy_bucket_array to copy the `khash' member of an item
+       - renamed functions to be more systematic and easier for me:
+               make_hash_table -> hash_create
+               hash_table_nentries -> hash_size
+               copy_hash_table -> hash_copy
+               find_hash_item -> hash_search
+               remove_hash_item -> hash_remove
+               add_hash_item -> hash_insert
+               flush_hash_table -> hash_flush
+               dispose_hash_table -> hash_dispose
+               print_table_stats -> hash_pstats
+               get_hash_bucket -> hash_items
+       - changed hash_search to short-circuit if table->nentries == 0 and
+         HASH_CREATE has not been passed in the flags argument
+
+{alias,variables,hashcmd,pcomplib}.c
+       - renamed calls to all renamed functions from hashlib.c
+
+builtins/kill.def
+       - don't drop a leading `-' in a pid argument
+       - call kill_pid with an explicit third argument of 1 if the pid
+         argument to kill is < -1, rather than rely on the behavior of
+         kill(2)
+
+                                  2/21
+                                  ----
+subst.c
+       - quoted_strchr is no longer declared `inline'
+       - skip_double_quoted is no longer declared `inline'
+       - string_extract_double_quoted is no longer declared `inline'
+
+lib/readline/input.c
+       - rl_gather_tyi is now an `int' valued function; returns the number
+         of characters read (0 or 1) or -1 on error
+       - if rl_gather_tyi() returns -1 to rl_read_key(), set rl_done to 1
+         and return a newline; something is wrong with the input fd
+
+                                  2/25
+                                  ----
+variables.[ch]
+       - IFS is now a special variable
+       - new special var function, sv_ifs(), called when IFS is set or unset
+       - call setifs() when IFS is first set in initialize_shell_variables
+       - call setifs() from make_local_variable and assign_in_env if
+         appropriate
+       - if assign_in_env() is called with a var assignment like `VAR=',
+         make the value in the new SHELL_VAR created be "" like
+         do_assignment_internal does, since certain parts of the shell use
+         a NULL value as evidence that the variable is unset (though
+         attributes may have been assigned)
+       - if push_temp_var pushes something up to the global_variables table,
+         make sure that the context is set to 0
+       - new function dispose_temporary_env, called by both
+         dispose_used_env_vars and merge_temporary_env with different `free
+         func' function pointers; calls sv_ifs after disposing the temporary
+         environment
+       - push_exported_var now calls bind_variable_internal instead of
+         bind_variable
+       - pop_scope and pop_context now call sv_ifs
+
+subst.[ch]
+       - new global variables used to keep track of IFS state, to avoid
+         having to call find_variable("IFS") all the time:
+
+               ifs_var         the SHELL_VAR for IFS
+               ifs_value       ifs_var ? value_cell (ifs_var) : " \t\n"
+               ifs_cmap        bitmap of characters in ifs_value
+               ifs_firstc      first character in ifs_value
+
+       - new function setifs(), sets the aforementioned ifs variables each
+         time IFS is set or unset, and at nested scope exit
+       - instead of calling getifs() from inside subst.c, use ifs_value
+       - getifs() now just returns ifs_value
+       - use ifs_firstc in string_list_dollar_star()
+       - only call member() in issep() if separators is more than one char
+       - don't cache a bitmap every time expand_word_internal() is called;
+         use ifs_cmap instead
+       - new macro, isifs(c), checks whether C is in ifs_cmap
+
+builtins/read.def
+       - use issep() and isifs() macros instead of looking at $IFS directly
+
+syntax.h
+       - make sure macros that access sh_syntaxtab cast the argument to
+         `unsigned char' before array access
+       - new macros: issyntype(c, type) and notsyntype(c, type), check
+         sh_syntaxtab[c] for a particular flag value `type'
+
+                                  2/26
+                                  ----
+hashlib.h
+       - the `data' member of a `BUCKET_CONTENTS' is now a PTR_T
+
+{hashlib,alias,variables,hashcmd,pcomplib}.c
+       - removed some casts when assigning to and using `data' member of a
+         `BUCKET_CONTENTS'
+
+subst.c
+       - in split_at_delims, call make_word_list instead of allocating and
+         initializing a WORD_LIST * directly
+
+make_cmd.[ch]
+       - add_string_to_list is now just a macro that calls make_word_list
+       - make_simple_command now calls make_word_list instead of allocating
+         a WORD_LIST * directly
+
+                                  2/27
+                                  ----
+copy_cmd.c
+       - copy_word now calls make_bare_word to allocate the copy
+       - copy_word_list now calls make_word_list to allocate the copy
+
+shell.h
+       - include `ocache.h' for simple object caching
+       - call cmd_init() to initialize the WORD_DESC and WORD_LIST object
+         caches
+
+{make,dispose}_cmd.c
+       - allocate WORD_DESC * and WORD_LIST * vars from their respective
+         ocaches, and return them to the cache when disposing
+
+jobs.c
+       - renamed old `waiting_for_job' variable to `queue_sigchld', which
+         better reflects its intent:  sigchld_handler does not call waitchld
+         if `queue_sigchld' is non-zero, it simply increments the count of
+         waiting children
+       - cleanup_dead_jobs now just sets and clears queue_sigchld instead of
+         blocking and unblocking SIGCHLD; it calls waitchld at the end if
+         `sigchld' is non-zero, but that's not really necessary
+       - in setjstatus, only call xrealloc if `statsize' is less than the
+         number of processes passed -- no reason to do it if they're the
+         same
+
+                                  2/28
+                                  ----
+sig.[ch]
+       - reinitialize_signals is no more; initialize_signals takes an
+         argument saying whether or not we are reinitializing
+
+builtins/exec.def
+       - reinitialize_signals() -> initialize_signals(1)
+
+test.c
+       - fix filecomp() to work right when one file has a non-positive
+         timestamp and the other file does not exist
+
+doc/{bash.1,bashref.texi}
+       - document what happens for test's -nt and -ot operators when one
+         file operand exists and the other does not
+
+jobs.c
+       - if we haven't messed with SIGTTOU, just manipulate queue_sigchld
+         in notify_of_job_status instead of calling sigprocmask()
+       - list_one_job now calls pretty_print_job directly instead of going
+         through print_job
+       - pretty_print_job now must be called with SIGCHLD blocked or held
+         instead of blocking SIGCHLD itself
+       - changed start_job so that it doesn't call UNBLOCK_CHILD and then
+         immediately call BLOCK_CHILD again (explicitly or via last_pid()),
+         call find_last_pid instead of last_pid and then UNBLOCK_CHILD
+       - changed wait_for_job the same way
+       - find_last_pid now takes a second argument: block; uses BLOCK_CHILD
+         if `block' is 1, not otherwise.  Changed existing calls:
+               find_last_pid(j) -> find_last_pid(j, 0)
+               last_pid(j) -> find_last_pid(j, 1)
+         `last_pid()' is now gone
+       - rewrote wait_for_background_pids(); it was a little strange
+       
+copy_cmd.c
+       - copy_if_command: don't copy null false_case commands
+       - copy_simple_command: don't copy a null redirection list
+
+subst.c
+       - in get_word_from_string and list_string, just check for " \t\n"
+         directly rather than calling strcmp
+       - in get_word_from_string and strip_trailing_ifs_whitespace, use
+         isifs() instead of issep(), since they're never called with
+         separators != $IFS
+       - change issep() to call isifs if separators is longer than one
+         character, since it's never called with anything but "", " ",
+         or $IFS
+
+                                   3/1
+                                   ---
+sig.h
+       - enclose the BLOCK_SIGNAL macro in a do {...} while (0) loop, at it
+         should have been all along
+
+lib/readline/doc/rltech.texinfo
+       - document that readline defaults to stdin/stdout if rl_instream/
+         rl_outstream are NULL
+
+lib/readline/terminal.c
+       - if an application is using a custom redisplay function,
+         rl_resize_terminal just calls rl_forced_update_display to tell
+         (*rl_redisplay_func) to update the display, otherwise call
+         _rl_redisplay_after_sigwinch
+
+lib/readline/readline.c
+       - change readline_internal_setup() so the change to vi insertion mode
+         happens even if readline_echoing_p is 0
+       - don't print the prompt to rl_outstream in readline_internal_setup
+         if we're not echoing and the caller has defined a custom redisplay
+         function -- let the redisplay function deal with it
+
+configure.in
+       - new option: --enable-mem-scramble, controls memory scrambling on
+         free() (on by default; only affects use of bash malloc)
+
+config.h.in
+       - new option MEMSCRAMBLE, controlled by --enable-mem-scramble
+
+                                   3/5
+                                   ---
+parse.y
+       - added ksh-like behavior of [...] to read_token_word:  if a `[' is
+         seen in an assignment context and the previous characters in the
+         token form a valid identifier, parse the [...] with
+         parse_matched_pair to allow spaces (and newlines) in the subscript
+
+bashline.c
+       - new function bash_servicename_completion_function, for completing
+         service names from /etc/services
+
+bashline.h
+       - new extern declaration for bash_servicename_completion_function
+
+builtins/complete.def
+       - allow new `-s/-A service' option to complete and compgen builtins
+
+pcomplete.h
+       - new CA_SERVICE define, new ITEMLIST variable it_services
+
+pcomplete.c
+       - add callback to bash_servicename_completion_function to generate
+         list of matching service names for completion
+
+doc/bash.1,lib/readline/doc/rluser.texinfo
+       - documented new `-s/-A service' option to complete and compgen
+
+                                   3/6
+                                   ---
+builtins/read.def
+       - change hard-coded `0' to new variable `fd' (initially 0) in
+         preparation for adding `-u fd' option
+
+bashline.c
+       - bash_directory_completion_hook calls expand_prompt_string instead
+         of expand_string (it does the right thing).  This keeps expansion
+         errors from causing a longjmp, which shouldn't happen because of
+         completion
+       - command_subst_completion_function was augmented very slightly to
+         do filename completion on a non-command-word in a command
+         substitution
+       - command_subst_completion_function now skips over the lcd that
+         rl_completion_matches puts in matches[0] if there is more than
+         one possible completion
+
+                                   3/7
+                                   ---
+builtins/read.def
+       - only add the unwind_protect to free `rlbuf' if `edit' is non-zero,
+         since we won't be using readline otherwise
+
+lib/sh/zread.c
+       - renamed zread1 -> zreadintr
+
+redir.c
+       - small change to redirection_error() to make a slightly better
+         guess about the invalid file descriptor if the redirection op is
+         r_duplicating_input or r_duplicating_output
+
+include/stdc.h
+       - new macro, SH_VA_START, to encapsulate the difference between
+         stdarg va_start and varargs va_start
+
+{error,pcomplete,print_cmd}.c,builtins/common.c,lib/sh/snprintf.c
+       - use SH_VA_START
+
+                                   3/8
+                                   ---
+builtins/read.def
+       - support for the ksh-like `-u fd' option
+
+general.c
+       - new function sh_validfd(fd), returns 1 if fd is a valid open file
+         descriptor
+
+general.h
+       - extern decl for sh_validfd
+
+bashline.c
+       - don't call posix_readline_initialize() from initialize_readline();
+         sv_strict_posix() should already have taken care of it
+
+                                  3/11
+                                  ----
+{error,pcomplete,print_cmd}.c, builtins/common.c
+       - removed non-varargs versions of functions
+
+builtins/printf.def
+       - if the string argument to %q has non-printing characters, call
+         ansic_quote to quote it rather than sh_backslash_quote
+
+variables.h
+       - new attribute: att_trace (and corresponding trace_p() macro).
+         Functions with this attribute will inherit the DEBUG trap.
+         Currently ignored for variables
+
+builtins/declare.def
+       - new `-t' option to declare/typeset toggle the `att_trace' attribute
+
+builtins/setattr.def
+       - check for att_trace and output `-t' flag in show_var_attributes
+
+execute_cmd.c
+       - if a function is being traced (it has the `-t' attribute set),
+         don't turn off the DEBUG trap when it executes
+
+doc/{bash.1,bashref.texi}
+       - document the new `-t' option to declare/typeset
+
+                                  3/12
+                                  ----
+execute_cmd.c
+       - don't execute the debug trap in the `cm_simple:' case of
+         execute_command_internal; run it in execute_simple_command so we
+         get the line number information right when executing in a shell
+         function
+       - run a DEBUG trap before executing ((...)) arithmetic commands,
+         like ksh93
+       - run a DEBUG trap before executing [[...]] conditional commands,
+         like ksh93
+
+eval.c
+       - add a static forward declaration for alrm_catcher()
+
+general.c
+       - add static forward declarations for bash_special_tilde_expansions,
+         unquoted_tilde_word, initialize_group_array
+
+variables.h
+       - add extern declarations for sh_get_env_value, map_over_funcs,
+         local_exported_variables
+
+variables.c
+       - add static forward declarations for dispose_temporary_env,
+         make_func_export_array
+
+bashhist.c
+       - add static forward declaration for check_history_control
+
+configure.in
+       - add a call to AC_CHECK_DECLS for strcpy
+
+config.h.in
+       - add placeholder for HAVE_DECL_STRCPY define, set by configure
+
+general.h
+       - don't declare strcpy if HAVE_DECL_STRCPY is defined with a non-zero
+         value
+
+sig.h
+       - add prototype to typedef of SigHandler
+
+lib/readline/histlib.h
+       - removed extern declaration of strcpy()
+       - include string.h/strings.h directly in histlib.h instead of source
+         files
+
+lib/readline/{histexpand,histfile,history,histsearch}.c
+       - don't include string.h/strings.h now that histlib.h includes it
+
+lib/tilde/tilde.c
+       - removed extern declaration of strcpy(), rely on string.h/strings.h
+
+command.h
+       - four new redirection types: r_move_input, r_move_output,
+         r_move_input_word, r_move_output_word, for
+         [N]<&word- and [N]>&word- from ksh93
+
+print_cmd.c
+       - changes to print r_move_input[_word] and r_move_output[_word]
+
+copy_cmd.c
+       - changes to copy r_move_input[_word] and r_move_output[_word]
+
+dispose_cmd.c
+       - changes to dispose r_move_input_word and r_move_output_word
+
+make_cmd.c
+       - changes to make r_move_input[_word] and r_move_output[_word] from
+         r_duplicating_{input,output}_word, which is how the new redirs
+         are passed by the parser
+
+redir.c
+       - changes to make r_move_input[_word] and r_move_output[_word] do
+         the right thing when executed
+
+builtins/read.def
+       - print an error message and return failure immediately if zread/zreadc
+         return < 0
+
+doc/{bash.1,bashref.texi}
+       - documented new [n]<&word- and [n]>&word- redirections
+
+                                  3/13
+                                  ----
+lib/readline/isearch.c 
+       - enabled code to allow chars bound to rl_rubout to delete characters
+         from the incremental search string
+
+shell.c
+       - add `-l' invocation option to parse_shell_options; equivalent to
+         `--login'
+       - fixed set_login_shell to check first char of base pathname of argv0
+         for `-', like other shells
+       - move the check for make_login_shell after the call to
+         parse_shell_options because the `-l' option might set it
+
+doc/{bash.1,bashref.texi}
+       - documented new `-l' invocation option
+
+array.c
+       - new function, array_shift, shifts an array left by a specified
+         number of elements
+       - array_walk is now compiled in by default
+       - array_to_assignment_string now takes a second argument: int quoted.
+         If non-zero, the result is single-quoted before being returned
+       - quoted_array_assignment_string has been removed
+
+array.[ch]
+       - renamed most of the array functions so that all have an array_
+         prefix and are more systematically named
+       - array_slice now preserves the indicies from the original array
+       - change array_to_assign to use a static buffer for expanding the
+         array indices, instead of malloc/free
+
+{arrayfunc,subst,variables}.c, builtins/read.def
+       - changed calls to various array functions to use new names
+
+lib/sh/stringvec.c, externs.h
+       - renamed all of the functions to have a strvec_ prefix and to have
+         a more sensible name scheme
+       - strvec_search's arguments are now supplied in reverse order, so
+         the char **array is first, like the other functions
+       - new function, strvec_resize, xrealloc for strvecs
+
+{alias,array,bracecomp,braces,bashline,execute_cmd,findcmd,general,pathexp,
+pcomplete,variables}.c
+lib/sh/stringlist.c
+builtins/{bind,complete,exec,getopts,pushd,set}.def
+       - change calls to all functions from lib/sh/stringvec.c
+       - use strvec_resize where appropriate
+
+externs.h
+       - only declare dup2() if HAVE_DUP2 is undefined or DUP2_BROKEN is
+         defined
+
+lib/readline/{macro,readline,util}.c, lib/readline/rlprivate.h
+       - _rl_defining_kbd_macro is gone, use RL_ISSTATE(RL_STATE_MACRODEF)
+
+lib/readline/readline.h
+       - new struct readline_state, encapsulates most of readline's internal
+         state in case you need reentrancy or nested calls to readline()
+       - extern declarations for rl_save_state, rl_restore_state
+
+lib/readline/readline.c
+       - add (undocumented) int rl_save_state (struct readline_state *),
+         int rl_restore_state (struct readline_state *)
+
+                                  3/14
+                                  ----
+array.[ch]
+       - new function, array_rshift, shifts an array right by a specified
+         number of elements, optionally inserting a new element 0
+
+examples/bashdb/bashdb
+       - new single-file version of bash debugger, originally modified from
+         version in bash-2.04 by Gary Vaughan (the old debugger still
+         appears in examples/obashdb).  This version has a more gdb-like
+         command set
+
+examples/bashdb/bashdb.el
+       - new emacs bashdb debugger mode from Masatake YAMATO <jet@gyve.org>
+
+execute_cmd.c
+       - don't make $LINENO relative to function start unless the shell is
+         currently interactive -- this is what ksh93 does and what I
+         believe to be the intent of POSIX.2 (this required changing some
+         of the test checks because the output has changed)
+       - run the debug trap for each command in an arithmetic for expression,
+         like ksh93 does
+
+lib/readline/vi_mode.c
+       - redid rl_vi_subst (binding func for `s' and `S') in terms of
+         rl_vi_change_to:  `S' == `cc' and `s' == `c '.  This makes undo
+         work right
+
+                                  3/18
+                                  ----
+hashlib.c
+       - fixed hash_walk to return if the item function returns < 0, instead
+         of breaking out of the current hash chain
+
+array.c
+       - fixed array_walk to return if the item function returns < 0, like
+         hash_walk
+
+lib/sh/stringlist.c, externs.h
+       - new function: strlist_walk, takes a stringlist and a pointer to an
+         item func.  Like other _walk funcs, if item func returns < 0 the
+         walk is cancelled
+       - new function: strlist_flush, frees items in the contained list
+         with strvec_flush
+       - renamed functions to have a strlist_ prefix and be more systematic
+
+pcomplib.c,pcomplete.h
+       - removed redundant `progcomp_initialized' variable
+       - renamed functions to have `progcomp_' or `compspec_' prefixes
+         like the hash library
+
+{bashline,pcomplete}.c,builtins/complete.def
+       - fixed calls to stringlist functions to use new names
+       - fixed calls to functions in pcomplib.c to use new names
+
+pcomplete.c
+       - made the debugging code #ifdef DEBUG -- it should be mature enough
+
+builtins/hash.def,parse.y
+       - use REVERSE_LIST(x, t) instead of (t)reverse_list(x)
+
+list.c,{externs,general}.h
+       - renamed the list functions to have a list_ prefix, changed callers
+
+externs.h,{execute_cmd,stringlib,subst}.c,builtins/common.c,lib/sh/stringvec.c
+       - word_list_to_argv -> strvec_from_word_list
+       - argv_to_word_list -> strvec_to_word_list
+       - moved functions to lib/sh/stringvec.c
+
+lib/sh/stringvec.c
+       - changed name of second argument to strvec_from_word_list from `copy'
+         to `alloc' so the use of `copy' between strvec_from_word_list and
+         strvec_to_word_list isn't as confusing
+       - changed name and sense of second argument to
+         strvec_to_word_list from `copy' to `alloc' for the same reason --
+         now both functions agree on semantics of second argument
+
+lib/sh/stringlist.c
+       - ditto for strlist_from_word_list and strlist_to_word_list
+
+subst.c
+       - changed callers of strvec_to_word_list
+
+                                  3/19
+                                  ----
+builtins/hash.def
+       - added `-l' option to list table or individual targets in reusable
+         format
+       - added `-d' option to remove one or more names from the table of
+         hashed commands (provides `unhash' or `unalias -t' functionality)
+
+doc/{bash.1,bashref.texi}
+       - documented new `-l' and `-d' options to `hash'
+
+hashcmd.[ch]
+       - renamed functions to have a `phash_' prefix and follow new naming
+         convention
+       - phash_remove now returns an int:  1 if command not in hash table,
+         0 if filename removed OK
+
+{findcmd,variables}.c, builtins/{hash,type}.def
+       - changed callers to use new names from hashcmd.c
+
+builtins/common.[ch]
+       - new function, sh_notfound(s), prints standard `not found' message
+       - new function, sh_invalidid(s), prints standard `invalid identifier'
+         message
+       - new function, sh_restricted(s), prints standard `restricted' message
+         for restricted shells
+       - new function, sh_invalidnum(s), prints standard `invalid number'
+         message
+       - renamed bad_option to sh_invalidopt, changed to print
+         `invalid option' instead of `unknown option'
+       - new function, sh_invalidoptname, prints standard `invalid option
+         name' for long options
+       - new function, sh_badjob (s), prints standard `no such job' message
+       - new function, sh_invalidsig (s), prints standard `invalid signal
+         specification' message
+       - new function, sh_nojobs (s), prints standard `no job control' message
+       - new function, sh_needarg (s), prints standard `option requires an
+         argument' message
+       - new function, sh_neednumarg (s), prints standard `numeric
+         argument required' message
+       - new function, sh_badpid(s), prints standard `not a pid...' message
+       - new function, sh_erange (s, desc) prints standard `out of range'
+         message, optionally using `desc' to say what the argument is
+
+builtins/{alias,command,declare,exec,hash,type}.def
+       - call sh_notfound() instead of calling builtin_error directly
+
+builtins/{declare,getopts,read,set,setattr}.def
+       - call sh_invalidid() instead of calling builtin_error directly
+
+builtins/{cd,command,enable,exec,hash,source}.def
+       - call sh_restricted() instead of calling builtin_error directly
+
+builtins/{printf,read,ulimit}.def, builtins/common.c
+       - call sh_invalidnum instead of calling builtin_error directly
+
+builtins/{complete,declare,pushd,set}.def, builtins/bashgetopt.c
+       - call sh_invalidopt instead of bad_option or builtin_error directly
+
+builtins/{complete,set,shopt}.def
+       - call sh_invalidoptname instead of builtin_error directly
+
+builtins/{fg_bg,jobs,kill,wait}.def
+       - call sh_badjob instead of calling builtin_error directly
+
+builtins/common.c, builtins/{kill,signal}.def
+       - call sh_invalidsig instead of calling builtin_error directly
+
+builtins/{fg_bg,suspend,wait}.def
+       - call sh_nojobs instead of calling builtin_error directly
+
+builtins/{common,bashgetopt}.c, builtins/{hash,kill}.def
+       - call sh_neednumarg and sh_needarg where required
+
+builtins/{kill,wait}.def
+       - call sh_badpid where required
+
+builtins/{break,fc,history,pushd,shift,ulimit,umask}.def
+       - call sh_erange where appropriate
+
+builtins/printf.def
+       - new static function, printf_erange, prints standard out-of-range
+         warning message
+
+builtins/set.def
+       - changed so that calls to sh_invalidopt always include the leading
+         `+' or `-'
+
+builtins/shopt.def
+       - changed SHOPT_ERROR macro to shopt_error function
+
+builtins/bind.def
+       - regularized error messages to `bind: object: error string' like
+         other error messages
+
+builtins.h
+       - the `short_doc' member of a `struct builtin' is now of type
+         `const char *'
+       - the strings in `long_doc' array of a struct builtin are now const
+
+builtins/mkbuiltins.c
+       - changes for new `const' members of struct builtin
+
+                                  3/20
+                                  ----
+lib/readline/histfile.c
+       - use pointers instead of indexing into buffer when reading the
+         contents of the history file in read_history_range and
+         history_truncate_file
+
+                                  3/21
+                                  ----
+lib/readline/histfile.c
+       - new file, with code to mmap the history file for reading and
+         writing (depends on HAVE_MMAP, currently nothing checks for that)
+
+                                  3/25
+                                  ----
+error.[ch]
+       - new function, err_badarraysub(s), calls report_error with standard
+         `bad array subscript' message
+       - new function, err_unboundvar(s), calls report_error with standard
+         `unbound variable' message
+       - new function, err_readonly(s), calls report_error with standard
+         `readonly variable' message
+
+{arrayfunc,subst}.c
+       - call err_badarraysub where appropriate
+
+{expr,subst}.c
+       - call err_unboundvar where appropriate
+
+{arrayfunc,variables}.c
+       - call err_readonly where appropriate
+
+shell.c
+       - changed text of bad option error messages to be the same as that
+         printed for builtin errors
+
+builtins/common.c
+       - changed sh_invalidopt to print the invalid option before the rest
+         of the error message (required some tests to be modified)
+       - new function, sh_readonly, calls builtin_error with standard
+         `readonly variable' message
+
+variables.c,builtins/declare.def
+       - call sh_readonly where appropriate
+
+lib/sh/stringvec.c
+       - added strvec_remove (sv, s), removes S from SV and shuffles rest of
+         elements down 1
+
+lib/sh/stringlist.c
+       - added strlist_remove(sl, s), just calls strvec_remove on the
+         component list
+
+externs.h
+       - new extern declarations for strvec_remove and strlist_remove
+       - fixed extern declaration for strvec_search; the arguments were
+         reversed (unimportant, it's not compiled into the shell)
+
+subst.c
+       - change param_expand to call quote_escapes on values retrieved when
+         expanding the positional parameters
+       - change parameter_brace_expand_word to quote escapes on values
+         retrieved when expanding the positional parameters
+       - fix parameter_brace_substring to quote escape characters on unquoted
+         substrings extracted from variable values (needed to separate case
+         VT_VARIABLE from VT_ARRAYMEMBER for this, since, because
+         get_var_and_type calls array_value for VT_ARRAYMEMBER, we need to
+         skip over quoted characters in an already-appropriately-quoted
+         string to find the substring we want)
+       - fix parameter_brace_substring to quote escape characters in the
+         value returned by pos_params when expanding subsets of the
+         positional parameters and not within double quotes (in which case
+         pos_params() quotes the string for us)
+       - fix parameter_brace_substring to quote escape characters in the
+         value returned by array_subrange when expanding subsets of an
+         array and not within double quotes (in which case
+         array_subrange() quotes the string for us)
+       - new function, quoted_strlen(s), does strlen(s) while skipping over
+         characters quoted with CTLESC (#ifdef INCLUDE_UNUSED, since it's
+         not used yet)
+       - changed pos_params() so it always returns a list whose members are
+         quoted strings if (quoted&(Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) != 0
+
+arrayfunc.c
+       - fix array_value to consistently call quote_escapes, even when a
+         non-array variable is being subscripted with element 0, in which
+         case we return the variable value
+
+lib/sh/strtrans.c
+       - make the for_echo parameter to ansicstr a `flags' parameter that
+         has its old `for echo' meaning if flags&1 is non-zero (which is
+         consistent with the old code)
+       - Added code to the `flags' parameter to ansicstr so that if flags&2
+         is non-zero, CTLESC and CTLNUL are escaped with CTLESC in the
+         expanded string
+       - change ansiexpand() to call ansicstr with a `flags' parameter of 2
+
+                                  3/26
+                                  ----
+lib/readline/histfile.c
+       - when reading and writing the history file, use malloc instead of
+         xmalloc and handle failures gracefully, so the application doesn't
+         abort if the history file or history list is too big
+
+                                  3/27
+                                  ----
+arrayfunc.c
+       - changed array_value_internal to take an additional `int *'
+         parameter, in which is returned the type of array indexing
+         performed (array[@] vs. array or array[index])
+       - changed array_value and get_array_value to take a corresponding
+         extra parameter and pass it to array_value_internal
+       - changed array_value_internal to no longer return newly-allocated
+         memory or quote CTLESC and CTLNUL in the returned string if
+         `simple' array indexing (subscript not `@' or `*') is being
+         performed.  This makes it more like a variable lookup
+
+arrayfunc.h
+       - changed prototypes for array_value and get_array_value
+
+expr.c
+       - added new parameter to call to get_array_value in expr_streval
+       - don't need to free memory returned by get_array_value any more
+
+subst.c
+       - quote_escapes now works with multibyte characters
+       - dequote_string now works with multibyte characters
+       - dequote_escapes is now needed, so it's compiled in, and it
+         now works with multibyte characters
+       - remove_quoted_escapes now just calls dequote_escapes and copies the
+         result over the argument string
+       - remove_quoted_nulls now returns its char * argument, parallels
+         remove_quoted_escapes
+       - parameter_brace_expand_word now passes the new argument to
+         array_value and quotes CTLESC and CTLNUL in the result if it's a
+         `simple' array expansion by calling quote_escapes
+       - get_var_and_type now returns VT_ARRAYMEMBER for references like
+         ${array} where `array' is an array variable (just like ${array[0]}).
+         Documented (in comment) that a VT_VARIABLE return value means that
+         quote_escapes has been called at some point
+       - changed callers of get_var_and_type to no longer free value if
+         VT_ARRAYMEMBER is returned as type
+       - changed parameter_brace_substring and parameter_brace_patsub to
+         call dequote_escapes on the value from get_var_and_type if the
+         type is VT_VARIABLE, since the substring and pattern substitution
+         code doesn't understand CTLESC quoting
+       - parameter_brace_substring no longer needs to call quoted_substring
+         for the VT_ARRAYMEMBER case
+       - changed parameter_brace_patsub to call quote_escapes on the result
+         of pat_subst for the VT_VARIABLE and VT_ARRAYMEMBER cases, and to
+         quote the returned string in the VT_ARRAYVAR and VT_POSPARAMS cases
+         if the `MATCH_QUOTED' flag isn't set (if it is, the pattern
+         substitution functions perform any necessary quoting)
+       - quoted_substring is no longer used; it's now #ifdef INCLUDE_UNUSED
+
+lib/malloc/mstats.h
+       - new member in _malstats: u_bits32_t bytesreq, the total number of
+         bytes requested by the caller via calls to malloc() and realloc()
+
+lib/malloc/stats.c
+       - print bytesreq member in _print_malloc_stats
+       - don't print statistics for buckets for which nmal == 0 (no mallocs)
+
+lib/malloc/malloc.c
+       - modified internal_malloc, internal_realloc to keep running total of
+         number of bytes requested by calling application
+
+shell.c
+       - sh_exit is now compiled in; exit_shell calls sh_exit
+
+error.c
+       - changed fatal_error, report_error, parser_error to call sh_exit
+
+                                  3/28
+                                  ----
+subst.[ch]
+       - changed Q_NOQUOTE to Q_PATQUOTE; it makes the intent more clear
+
+subst.c
+       - moved code from parameter_brace_expand into a new function that
+         dispatches for pattern substitution: parameter_brace_remove_pattern
+       - changed structure of parameter_brace_remove_pattern to be like
+         parameter_brace_patsub and its ilk:  call get_var_and_type to
+         isolate the variable name, move the pattern isolation code out of
+         the various *_remove_pattern functions into
+         parameter_brace_remove_pattern and pass the results to the various
+         functions, use a switch on the return value from get_var_and_type
+         to decide which function to call, regularized the arguments to the
+         separate pattern removal functions
+       - parameter_brace_remove_pattern now properly quotes escape chars in
+         the returned value
+       - changed get_var_and_type to call dequote_escapes on the `value'
+         parameter for case VT_VARIABLE and return the result in *valp,
+         so the calling functions don't have to do it themselves; changed
+         callers appropriately
+       - fixed getpattern() where it broke posix compliance:  if you enclose
+         a pattern removal spec in double quotes, the outer double quotes
+         have no effect on the pattern (POSIX.1-200x 2.6.2).  This uncovered
+         a bug in the test suite (!)
+
+pathexp.c
+       - fixed a problem with quote_string_for_globbing where it would change
+         consecutive CTLESC chars all to \ instead of changing every other
+         quoted char
+
+                                  3/31
+                                  ----
+lib/malloc/{malloc,stats}.c
+       - moved declaration of _mstats to malloc.c so stats.o doesn't get
+         linked into the shell if the stats functions aren't called
+
+                                   4/2
+                                   ---
+lib/glob/smatch.c
+       - introduce `XCHAR' define, which is the type of arguments passed to
+         strcoll/strcmp/strlen and their wide-character equivalents, added
+         appropriate casts
+       - static arrays in single-byte version of rangecmp() are `char', not
+         `unsigned char', so compilers don't complain about calls to strcoll
+
+lib/glob/sm_loop.c
+       - casts for `XCHAR' and `XCHAR *' arguments to libc functions
+       - use prototype declaration for BRACKMATCH if `PROTOTYPES' is defined
+         to avoid problems with type promotion (unsigned char -> int)
+
+lib/glob/collsyms.h
+       - `name' member of struct _COLLSYM is now of type `XCHAR *', since
+         some compilers don't like `unsigned char *' initializers from
+         constant strings
+
+[bash-2.05b-alpha1 released]
+
+                                   4/3
+                                   ---
+builtins/{evalstring.c,common.h}
+       - new flag for parse_and_execute, SEVAL_NOFREE, means to not free
+         the argument string when finished
+
+lib/readline/text.c
+       - fixed a trivial typo in _rl_insert_char when reading multibyte
+         char sequences
+       - replace calls to ding() with rl_ding()
+
+include/chartypes.h
+       - remove SIGN_EXTEND_CHAR and TOASCII macros; they're unused
+
+make_cmd.c
+       - include dispose_cmd.h for extern function declarations
+
+lib/glob/glob.c
+       - include `shmbutil.h' and `xmalloc.h' for extern function declarations
+
+lib/glob/smatch.c
+       - include `xmalloc.h' for extern function declarations
+
+shell.c
+       - fix maybe_make_restricted to use its argument instead of global
+         `shell_name'
+
+version.c
+       - update copyright message to include this year
+
+lib/readline/display.c
+       - fixes from Jiro SEKIBA <jir@yamato.ibm.com> to fix autowrapping
+         when using multibyte characters
+
+lib/glob/sm_loop.c
+       - fixed a problem in BRACKMATCH where not enough memory was allocated
+         to hold a multibyte character when parsing POSIX.2 char class names
+
+support/config.{guess,sub}
+       - updated via patch from Paul Eggert with latest GNU additions
+
+variables.c
+       - var_lookup should use its `vcontext' argument instead of
+         unconditionally using `shell_variables'
+
+                                   4/4
+                                   ---
+builtins/bind.def,doc/{bash.1,bashref.texi}
+       - changed the usage summary and help text to make it clear that any
+         readline command that may appear in ~/.inputrc may be supplied as
+         one of the non-option arguments to `bind'
+
+builtins/mkbuiltins.c
+       - added support for `-H' option, which means to write long documentation
+         for each builtin to a separate file in the `helpfiles' directory
+
+builtins/Makefile.in
+       - new target `helpdoc', just creates long doc files in helpfiles
+         directory
+
+lib/sh/zcatfd.c
+       - new file, with zcatfd(int fd, int ofd, char *fn); dumps data from
+         FD to OFD
+
+Makefile.in,lib/sh/Makefile.in
+       - added zcatfd.c, zcatfd.o member of libsh.a
+
+builtins/evalstring.c
+       - changed cat_file to call zcatfd(fd, 1, fn)
+
+builtins/{shopt,colon}.def
+       - removed the $DOCNAME directive for `shopt', `true', and `false';
+         just use the names
+       - changed $DOCNAME for `:' to just be `colon' instead of
+         `colon_builtin'
+
+builtins/reserved.def
+       - added help entries for ((, [[, `for (('
+
+builtins/let.def
+       - add id++, id--, ++id, --id, ** to help text
+
+                                   4/8
+                                   ---
+builtins/bashgetopt.[ch]
+       - changed to allow options beginning with `+', enabled by a leading
+         `+' in the option string
+       - new variable, list_opttype, set to `-' or `+'
+
+builtins/{common.c,{builtin,eval,exit,fg_bg,let,printf,pushd,return,source,wait}.def
+       - changes to allow a `--' option for every builtin that accepts
+         operands but not options, as per posix.1-2001
+
+builtins/{declare,setattr}.def
+       - use internal_getopt for parsing options, now that it supports `+'
+
+builtins/set.def
+       - use internal_getopt for initial option parse, now that it supports
+         a leading `+'
+
+
+{configure,Makefile}.in, builtins/{Makefile.in,help.def,mkbuiltins.c}
+       - support for a new configure option, ``--enable-separate-helpfiles'',
+         moves the `long' help text to separate help files, installed by
+         default into ${datadir}/bash, one file per builtin.  Off by
+         default -- it saves 47K, but it's only 47K, and it's in the text
+         segment
+
+flags.c
+       - build internal_getopt() option string argument from flags array at
+         runtime in shell.c
+
+shell.c
+       - new variable to control writing malloc stats at exit:
+         malloc_trace_at_exit, 0 by default
+
+lib/malloc/malloc.c
+       - heavily updated:
+               o partial page allocated on first call to malloc to make
+                 subsequent sbrks page-aligned no longer wasted
+               o begin and end range guards are now the same value: the chunk
+                 requested
+               o coalescing code was changed to attempt to coalesce first two
+                 adjacent blocks on the free list; enabled by default
+               o blocks of size 32 are now candidates for larger block
+                 splitting, since 32 is the most popular size
+               o blocks of size 32 are now candidates for smaller block
+                 coalescing
+               o the IN_BUCKET check was changed to just make sure that the
+                 size isn't too big for the bucket, since the `busy block'
+                 checking code may increase the bucket by one or more,
+                 meaning that the old check would fail and cause a panic when
+                 a chunk allocated in such a way was freed
+               o bin sizes are now precomputed and looked up in an array
+                 rather than being computed at runtime
+               o moved the _mstats declaration here to avoid the stats code
+                 being linked in even when no stats functions were called
+                 (only matters if MALLOC_DEBUG is defined)
+               o malloc now keeps track of the address of the top of the heap
+                 and will return large chunks to the system with calls to
+                 sbrk with a negative argument when freeing the top chunk.
+                 Two thresholds:  LESSCORE_FRC means to unconditionally return
+                 memory to the system; LESSCORE_MIN means to return memory if
+                 there's at least one block already on the free list
+
+lib/malloc/mstats.h
+       - stats struct now keeps track of number of block coalesces by bin,
+         and the number of times memory was returned to the system by bin
+
+lib/malloc/stats.c
+       - trace_malloc_stats now takes a second argument: the name of the file
+         to write to.  The first `%p' in the template file name is replaced
+         by the pid
+
+                                   4/9
+                                   ---
+lib/malloc/imalloc.h
+       - added some macros derived from dlmalloc and glibc malloc to inline
+         memcpy and memset if the requested size is <= 32 bytes
+
+lib/malloc/malloc.c
+       - use MALLOC_MEMSET instead of memset in internal_{malloc,free}
+
+include/ocache.h
+       - use OC_MEMSET (variant of MALLOC_MEMSET) in ocache_free
+
+configure.in, config.h.in
+       - check for getservent(), define HAVE_GETSERVENT if found
+
+bashline.c
+       - punt immediately from bash_servicename_completion_function if
+         HAVE_GETSERVENT is not defined (cygwin seems to not define it)
+       - include "input.h" for extern save_token_state() and
+         restore_token_state() declarations
+       - change bash_execute_unix_command to call parse_and_execute with
+         SEVAL_NOHIST flag so the command doesn't get saved on the history
+         list
+       - change bash_execute_unix_command to save and restore the current
+         command line count and the token state (last_read_token, etc.).
+         Everything else is saved by either parse_and_execute directly or
+         the call it makes to push_stream().  The shell_input_line stuff
+         doesn't need to be saved and restored; it's not computed until
+         readline() returns
+
+                                  4/10
+                                  ----
+lib/glob/glob.[ch]
+       - glob_filename and glob_vector now take an additional `flags' arg
+       - define GX_MARKDIRS as possible flag value for glob_filename and
+         glob_vector
+
+lib/sh/snprintf.c
+       - fixed some bugs with handling of `g' and `G' formats
+       - make sure numtoa returns the fractional part correctly when passed 0
+       - implemented thousands grouping for `'' flag character
+
+lib/sh/rename.c
+       - a few changes to make it more bulletproof
+
+                                  4/11
+                                  ----
+lib/glob/glob.c
+       - added the couple of dozen lines of code to glob_dir_to_array to
+         finish implementing GX_MARKDIRS
+
+builtins/set.def
+       - changed unset builtin so that it no longer considers unsetting an
+         unset variable or function to be an error
+
+lib/readline/display.c
+       - fix to rl_redisplay for a problem which caused display to be messed
+         up when the last line of a multi-line prompt (possibly containing
+         invisible characters) was longer than the screen width
+
+                                  4/15
+                                  ----
+aclocal.m4
+       - use AC_DEFINE_UNQUOTED in BASH_SYS_DEFAULT_MAIL_DIR instead of
+         enumerating all of the possible values and using AC_DEFINE
+
+                                  4/16
+                                  ----
+Makefile.in, {builtins,support}/Makefile.in
+       - new variables, CFLAGS_FOR_BUILD and CPPFLAGS_FOR_BUILD, substituted
+         by `configure'
+       - changed CCFLAGS_FOR_BUILD to BASE_CCFLAGS, removing $(CPPFLAGS);
+         CCFLAGS and CCFLAGS_FOR_BUILD now include $(BASE_CCFLAGS) with
+         (possibly) different values for CPPFLAGS and CFLAGS 
+       - GCC_LINT_CFLAGS now includes $(BASE_CCFLAGS) and $(CPPFLAGS)
+         instead of CCFLAGS_FOR_BUILD
+       - new variable, LDFLAGS_FOR_BUILD, right now equivalent to LDFLAGS
+       - remove $(CPPFLAGS) from recipes for buildversion, mksignames, and
+         mksyntax
+
+configure.in
+       - compute and substitute CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and
+         LDFLAGS_FOR_BUILD
+       - changed qnx to use LOCAL_LDFLAGS and LOCAL_LIBS instead of putting
+         everything in LOCAL_LDFLAGS
+
+builtins/Makefile.in
+       - remove $(PROFILE_FLAGS) from recipe for building `mkbuiltins'
+       - use LDFLAGS_FOR_BUILD instead of LDFLAGS in recipe for building
+         `mkbuiltins'
+
+Makefile.in
+       - use $(CC_FOR_BUILD) and $(CCFLAGS_FOR_BUILD) to build auxiliary
+         test programs (printenv, recho, zecho)
+
+support/Makefile.in
+       - use CC_FOR_BUILD and CCFLAGS_FOR_BUILD in recipe for building
+         `man2html'
+
+lib/tilde/Makefile.in
+       - substitute PROFILE_FLAGS, use PROFILE_FLAGS in $(CCFLAGS)
+
+                                  4/25
+                                  ----
+Makefile.in, configure.in
+       - moved RELSTATUS to configure.in; configure substitutes it into
+         the generated Makefile
+
+lib/sh/snprintf.c
+       - fix wchars() to deal with systems where MB_CUR_MAX is not a
+         constant expression
+
+                                   5/2
+                                   ---
+lib/sh/shquote.c
+       - add `,' to list of chars that are backslash-quoted.  It doesn't
+         hurt normal usage and prevents filenames with commas from being
+         inappropriately split by brace expansion after using
+         complete-into-braces
+
+                                   5/6
+                                   ---
+lib/sh/xstrchr.c
+       - we only need the check of MB_CUR_MAX and the slow code for a
+         few encodings, and even then only for a subset of the charset
+
+arrayfunc.c
+       - some speedups for skipsubscript and multibyte chars from Bruno Haible
+
+locale.c
+       - changed set_lang to call setlocale(LC_ALL, ...) if LC_ALL doesn't
+         already have a value, but doesn't change any shell variables
+
+include/shmbutil.h
+       - major speedups from Bruno Haible, mostly concerned with reducing
+         the number of strlen(3) calls
+
+subst.c
+       - change callers of macros in shmbutil.h to add extra argument as
+         necessary
+       - skip_single_quoted and skip_double_quoted take another argument:
+         the length of the string; mostly useful when using multibyte chars
+       - many speedups from precomputing string lengths at function start
+       - fixed a small bug in de_backslash in the midst of rewriting for
+         better efficiency
+
+{braces,make_cmd,pathexp}.c
+       - change callers of macros in shmbutil.h to add extra argument as
+         necessary
+
+pathexp.c
+       - fix a one-too-far problem with multibyte chars in
+         unquoted_glob_pattern_p
+
+braces.c
+       - brace_gobbler takes a new argument, the length of the passed string
+       - expand_amble takes a new argument, the length of the passed string
+
+                                   5/7
+                                   ---
+subst.c
+       - modified remove_quoted_nulls to eliminate the memory allocation and
+         do the copy in place using the same strategy as de_backslash
+
+lib/readline/{rldefs.h,complete.c}
+       - new define RL_QF_OTHER_QUOTE, so _rl_find_completion_word can note
+         that it found a quoting character other than \'" that appears in
+         rl_completer_quote_characters
+
+                                   5/9
+                                   ---
+jobs.c
+       - save and restore old value of jobs_list_frozen when calling trap
+         handlers from set_job_status_and_cleanup to avoid seg faults when
+         running recursive trap handlers
+
+                                  5/10
+                                  ----
+builtins/common.h
+       - new #defines to use for value of changed_dollar_vars (provides
+         information about the caller who wants to blow away the old dollar
+         variables)
+
+builtins/common.c
+       - changed set_dollar_vars_changed to set changed_dollar_vars to one
+         of the ARGS_* values depending on the caller and environment
+
+builtins/source.def
+       - source restores the positional parameters unless the `set' builtin
+         was called to specify a new set while not executing a shell function
+
+                                  5/13
+                                  ----
+POSIX
+       - new file, was in CWRU/POSIX.NOTES
+
+doc/{Makefile.in,Makefile}
+       - changed `posix' rule to modify ../POSIX
+
+doc/mkposix
+       - write to `POSIX' by default
+
+lib/sh/strtrans.c
+       - when ansicstr is parsing a format string for `echo -e' (or the
+         equivalent xpg_echo option is enabled), obey the POSIX-2001/SUSv3
+         standard and accept 0-3 octal digits after a leading `0'
+
+doc/{bash.1,bashref.texi}
+       - updated `echo' description to note that up to three octal digits
+         are now accepted following `\0'
+
+                                  5/16
+                                  ----
+doc/Makefile.in
+       - remove the generated documentation on `make distclean' if the
+         build directory and source directory are not the same
+
+Makefile.in
+       - descend into `support' subdirectory on a `make clean' and
+         `make distclean'
+       - remove parser-built, y.tab[ch] on a `make distclean' if the build
+         directory and source directory are not the same
+
+support/Makefile.in
+       - support various `clean' targets and remove man2html.o and man2html
+
+{configure,Makefile}.in
+       - move values for DEBUG and MALLOC_DEBUG into configure.in; on by
+         default for development versions; off by default for releases
+         (off for profiling, too)
+
+                                  5/21
+                                  ----
+parse.y
+       - modified the grammar to allow a simple_list followed by yacc_EOF
+         to terminate a command.  This fixes problems with things like
+         a backslash-newline at the end of an `eval'd string
+       - change handle_eof_input_unit() to reset the token state before
+         calling prompt_again(), in case the prompt to be evaluated contains
+         a command substitution
+
+                                  5/23
+                                  ----
+lib/readline/vi_mode.c
+       - fix `r' command (rl_vi_change_char) when HANDLE_MULTIBYTE is defined
+         but MB_CUR_MAX == 1
+
+                                  5/24
+                                  ----
+lib/malloc/watch.c
+       - don't try to print `file' argument to _watch_warn if it's null
+
+lib/malloc/malloc.c
+       - changed guard checking code in internal_{malloc,free,realloc} to
+         access memory as (char *) and copy into a union instead of
+         casting and dereferencing a pointer to u_bits32_t, since that
+         results in unaligned accesses which will cause Sparcs to upchuck
+
+                                  5/30
+                                  ----
+[bash-2.05b-beta1 released]
+
+lib/readline/text.c
+       - fixed a problem with rl_transpose_chars on systems supporting
+         multibyte characters with a locale that doesn't have any multibyte
+         chars
+
+                                   6/4
+                                   ---
+expr.c
+       - fix a/=0 and a%=0 to throw evaluation errors rather than core dumps
+
+lib/readline/display.c
+       - fix core dump when line wrapping a multibyte character (line
+         accidentally dropped from the original patch)
+
+lib/readline/mbutil.c
+       - fix reversed return value from _rl_is_mbchar_matched; fixes problem
+         with backward-char-search
+
+                                  6/10
+                                  ----
+lib/sh/getenv.c
+       - fix getenv to not free value returned by find_tempenv_variable
+       - add setenv, putenv, unsetenv for completeness
+
+                                  6/12
+                                  ----
+shell.c
+       - change init_noninteractive to init expand_aliases to the value of
+         posixly_correct
+       - don't initialize expand_aliases to posixly_correct anywhere else.
+         This allows the -O expand_aliases invocation option to work correctly
+
+general.c
+       - fix move_to_high_fd to not try the dup2 unless the fd loop results
+         in an fd > 3; just return the passed file descriptor otherwise
+       - use HIGH_FD_MAX, defined in general.h, instead of hard-coded 256
+         as highest file descriptor to try
+
+subst.c
+       - in process_substitute, call move_to_high_fd with `maxfd' parameter
+         of -1 instead of 64, so move_to_high_fd will use its maximum
+
+                                  6/21
+                                  ----
+lib/malloc/malloc.c
+       - don't bother calling MALLOC_MEMSET if the requested size is 0
+
+builtins/setattr.def
+       - note in short doc that export and readonly can take assignment
+         statements as arguments
+
+error.c
+       - new function, error_prolog(), to capture common error message
+         prefix code (except for parser errors)
+
+                                  6/25
+                                  ----
+aclocal.m4
+       - add tests for standard-conforming declarations for putenv and
+         unsetenv in system header files
+
+{configure,config.h}.in
+       - call BASH_FUNC_STD_PUTENV and BASH_FUNC_STD_UNSETENV, define
+         HAVE_STD_GETENV and HAVE_STD_UNSETENV, respectively, if they
+         succeed
+
+lib/sh/getenv.c
+       - change putenv and unsetenv to take differing prototypes in
+         stdlib.h into account
+
+                                  6/27
+                                  ----
+[bash-2.05b-beta2 released]
+
+                                  6/28
+                                  ----
+builtins/common.c
+       - fix get_job_spec so that %N works when N is the size of the jobs
+         list (%8 means job 8, but the 7th member of the jobs array, so
+         it's OK if N == job_slots because the function returns N-1)
+
+                                   7/1
+                                   ---
+shell.c
+       - turn off line editing if $EMACS is set to `t'
+
+                                  7/10
+                                  ----
+builtins/set.def
+       - remove mention of `-i' from long help doc, since it has no effect
+
+                                  7/17
+                                  ----
+[bash-2.05b released]
+
+                                  7/18
+                                  ----
+
+lib/malloc/malloc.c
+       - make sure that the `free_return' label has a non-empty statement
+         to branch to
+
+                                  7/19
+                                  ----
+locale.c
+       -  only call setlocale() from set_lang() if HAVE_SETLOCALE is defined;
+          otherwise just return 0
+
+lib/readline/mbutil.c
+       - only try to memset `ps' in _rl_get_char_len if it's non-NULL.  Ditto
+         for _rl_adjust_point
+
+                                  7/23
+                                  ----
+execute_cmd.c
+       - fix for executing_line_number() when compiling without conditional
+         commands, dparen arithmetic or the arithmetic for command
+
+                                  
+                                  7/24
+                                  ----
+support/Makefile.in
+       - fix maintainer-clean, distclean, mostlyclean targets
+
+builtins/common.c
+       - fix bug in sh_nojobs where it doesn't pass the right number of args
+         to builtin_error
+
+bashline.c
+       - when using command completion and trying to avoid appending a slash
+         if there's a directory with the same name in the current directory,
+         use absolute_pathname() instead of just checking whether the first
+         char of the match is a slash to catch things like ./ and ../
+
+examples/complete/bashcc-1.0.1.tar.gz
+       - a package of completions for Clear Case, from Richard S. Smith
+         (http://www.rssnet.org/bashcc.html)
+
+input.c
+       - fix check_bash_input to call sync_buffered_stream if the passed fd
+         is 0 and the shell is currently reading input from fd 0 -- all it
+         should cost is maybe an additional read system call, and it fixes
+         the bug where an input redirection to a builtin inside a script
+         which is being read from stdin causes the already-read-and-buffered
+         part of the script to be thrown away, e.g.:
+
+               bash < x1
+
+         where x1 is
+
+               hostname
+               read Input < t.in
+               echo $Input
+               echo xxx
+
+execute_cmd.c
+       - in initialize_subshell(), call unset_bash_input (0) to not mess with
+         fd 0 if that's where bash thinks it's reading input from.  Fixes
+         bug reported by jg@cs.tu-berlin.de on 17 July 2002.  Should be a way
+         to check whether or not the current fd 0 at the time of the call has
+         not been redirected, like in the bug report.  Also might eventually
+         want to throw in a sync_buffered_stream if bash is reading input
+         from fd 0 in a non-interactive shell into a buffered stream, so the
+         stream is sync'd -- might be necessary for some uses
+
+                                  7/25
+                                  ----
+lib/readline/signals.c
+       - make sure rl_catch_sigwinch is declared even if SIGWINCH is not
+         defined, so the readline state saving and restoring functions in
+         readline.c are always the same size even if SIGWINCH is not defined,
+         and undefined references don't occur when SIGWINCH is not defined
+
+                                  7/30
+                                  ----
+bashline.c
+       - augment patch from 7/24 to not disable rl_filename_completion_desired
+         if the first char of the match is `~'
+
+lib/readline/bind.c
+       - when creating `shadow' keymaps `bound' to ANYOTHERKEY, don't bind
+         a key whose type is ISFUNC but whose function is the `fake'
+         rl_do_lowercase_version (fixes debian bash bug #154123)
+
+lib/readline/readline.c
+       - don't call _rl_vi_set_last from _rl_dispatch_subseq if
+         key == ANYOTHERKEY (when truncated to `sizeof(char)', it will be 0,
+         which strchr will find in `vi_textmod')
+
+                                  7/31
+                                  ----
+lib/readline/input.c
+       - fix rl_gather_tyi to only slurp up one line of available input, even
+         if more than one line is available (fixes debian bash bug #144585)
+
+                                   8/3
+                                   ---
+bashline.c
+       - better fix for command completion problem -- test for directory
+         explicitly with test_for_directory before turning off
+         rl_filename_completion_desired, since that's the case we're trying
+         to protect against
+
+                                   8/5
+                                   ---
+include/shmbutil.h
+       - fix ADVANCE_CHAR macro to advance the string pointer if mbrlen
+         returns 0, indicating that the null wide character (wide string
+         terminator) was found (debian bash bug #155436)
+
+lib/readline/mbutil.c
+       - fix _rl_adjust_point to increment the string pointer if mbrlen
+         returns 0
+
+support/shobj-conf
+       - fix for the `-install_name' value in SHLIB_XLDFLAGS assignment for
+         Darwin from the fink folks
+
+                                   8/6
+                                   ---
+builtins/exit.def
+       - broke code that runs ~/.bash_logout out into a separate function:
+         bash_logout()
+
+builtins/common.h
+       - extern declaration for bash_logout()
+
+eval.c
+       - call bash_logout() from alrm_catcher(), so timed-out login shells
+         run ~/.bash_logout before processing the exit trap
+
+lib/sh/strtrans.c
+       - implemented $'\x{hexdigits}' expansion from ksh93
+
+configure.in
+       - define RECYCLES_PIDS in LOCAL_CFLAGS for cygwin; don't bother to
+         link with -luser32
+
+examples/loadables/strftime.c
+       - new loadable builtin, interface to strftime(3)
+
+                                   8/7
+                                   ---
+parse.y
+       - parse_arith_cmd now takes a second argument, a flag saying whether
+         or not to add double quotes to a parsed arithmetic command; changed
+         callers
+       - changed parse_dparen so it tells parse_arith_cmd to not add the
+         double quotes and therefore doesn't need to remove them
+       - change parse_dparen to add W_NOGLOB|W_NOSPLIT|W_QUOTED flags to word
+         created when parsing (( ... )) arithmetic command, since the double
+         quotes are no longer added
+
+make_cmd.c
+       - in make_arith_for_expr, set the flags on the created word to
+         W_NOGLOB|W_NOSPLIT|W_QUOTED
+
+execute_cmd.c
+       - change execute_arith_command to expand the expression with
+         expand_words_no_vars, like the arithmetic for command code does
+       - fix execute_arith_command to handle the case where the expanded
+         expression results in a NULL word without crashing
+
+tests/{arith-for,cprint}.tests
+       - change expected output to account for no longer adding quotes to
+         ((...)) commands
+
+                                   8/8
+                                   ---
+print_cmd.c
+       - take out the space after printing the `((' and before printing the
+         `))' in print_arith_command, print_arith_for_command, and
+         xtrace_print_arith_cmd
+
+tests/{arith-for,cprint}.tests
+       - change expected output to account for no longer adding leading and
+         trailing spaces when printing ((...)) and arithmetic for commands
+
+                                  8/17
+                                  ----
+subst.c
+       - fix issep() define to handle case where separators[0] == '\0', in
+         which case it always returns false
+
+lib/readline/histexpand.c
+       - fix off-by-one error in history_expand_internal when using the `g'
+         modifier that causes it to skip every other match when matching a
+         single character (reported by gjyun90@resl.auto.inha.ac.kr)
+
+doc/{bash.1,bashref.texi}
+       - make sure that the name=word form of argument to declare/typeset,
+         export, and readonly is documented in the description
+
+                                  8/30
+                                  ----
+lib/readline/histexpand.c
+       - make history_expand_internal understand double quotes, because
+         single quotes are not special inside double quotes, according to
+         our shell-like quoting conventions.  We don't want unmatched
+         single quotes inside double-quoted strings inhibiting history
+         expansion
+       - make `a' modifier equivalent to `g' modifier for compatibility with
+         the BSD csh
+       - add a `G' modifier that performs a given substitution once per word
+         (tokenized as the shell would do it) like the BSD csh `g' modifier
+
+                                  8/31
+                                  ----
+braces.c
+       - when compiling for the shell, treat ${...} like \{...} instead of
+         trying to peek backward when we see a `{'.  This makes it easier
+         to handle things like \${, which should be brace expanded because
+         the $ is quoted
+
+                                   9/7
+                                   ---
+aclocal.m4
+       - redirect stdin from /dev/null in BASH_CHECK_DEV_FD before testing
+         the readability of /dev/fd/0, so we're dealing with a known quantity
+
+                                  9/11
+                                  ----
+[prayers for the victims of 9/11/01]
+
+shell.c
+       - fix maybe_make_restricted to handle a restricted login shell with a
+         base pathname of `-rbash' and skip over any leading `-'
+
+                                  9/13
+                                  ----
+builtins/evalstring.c
+       - in parse_and_execute, make sure we don't try to run unwind-protects
+         back to `pe_dispose' after a longjmp back to top_level if the
+         pe_dispose frame hasn't been initialized
+
+lib/readline/display.c
+       - fix problem with prompt overwriting previous output when the output
+         doesn't contain a newline in a multi-byte locale.  This also should
+         fix the problem of bash slowing down drastically on long lines when
+         using a multi-byte locale, because it no longer tries to rewrite the
+         entire line each time.  Patch from Jiro SEKIBA <jir@yamato.ibm.com>
+
+parse.y
+       - move the typedef for alias_t that is compiled in if ALIAS is not
+         defined up before the prototype for push_string, since that takes
+         an alias_t * parameter
+
+lib/readline/terminal.c
+       - bind the termcap description's left and right arrow keys to
+         rl_backward_char and rl_forward_char, respectively,  instead of
+         rl_forward and rl_backward (which are just there for backwards
+         compatibility)
+
+aclocal.m4
+       - when testing readability of /dev/stdin, redirect stdin from /dev/null
+         to make sure it's a readable file
+
+                                  9/17
+                                  ----
+config-bot.h
+       - don't test __STDC__ when deciding whether or not to use stdarg.h;
+         just use it if it's present
+
+tests/read2.sub
+       - redirect from /dev/tty when using `read -t' 
+
+                                  9/20
+                                  ----
+builtins/history.def
+       - when reading `new' entries from the history file with `history -n',
+         fix increment of history_lines_this_session by taking any change
+         in history_base into account
+
+lib/sh/pathphys.c
+       - changes to sh_physpath to deal with pathnames that end up being
+         longer than PATH_MAX without dumping core
+
+lib/readline/doc/{history.3,hsuser.texinfo},doc/ bash.1
+       - documented new `a' and `G' history modifiers
+
+                                  9/25
+                                  ----
+lib/readline/misc.c
+       - when traversing the history list with arrow keys in vi insertion
+         mode, put the cursor at the end of the line (like in emacs mode)
+
+mksyntax.c
+       - don't try to use \a and \v unless __STDC__ is defined; use the
+         ascii integer equivalents otherwise
+       - include "config.h" in the generated syntax.c file for a possible
+         definition of `const'
+
+doc/{bash.1,bashref.texi}
+       - document the meaning of a null directory in $PATH
+
+                                  9/26
+                                  ----
+parse.y
+       - fix set_line_mbstate to handle case where mbrlen() returns 0,
+         indicating the null wide character
+       - fix set_line_mbstate so we don't directly compare a char variable
+         to EOF, since char can (and is) unsigned on some machines
+
+bashline.c
+       - change bash_execute_unix_command to save a little bit more state:
+         last_shell_builtin, this_shell_builtin, last_command_exit_value
+
+                                  9/27
+                                  ----
+execute_cmd.c
+       - tentative change to execute_simple_command to avoid freeing freed
+         memory in the case where bash forks early but still ends up calling
+         execute_disk_command, without passing newly-allocated memory to
+         make_child.  This may fix the core dumps with the linux-from-scratch
+         folks
+
+                                  9/28
+                                  ----
+Makefile.in,{builtins,lib/sh}/Makefile.in      
+       - fix up dependencies, mostly on ${BUILD_DIR}/version.h, so that
+         parallel makes work with GNU and BSD makes
+
+shell.h
+       - new struct to save partial parsing state when doing things like
+         bash_execute_unix_command and other operations that execute
+         commands while a line is being entered and parsed
+
+parse.y
+       - new functions, save_parser_state() and restore_parser_state(), to
+         save and restore partial parsing state 
+
+bashline.c
+       - change bash_execute_unix_command to call {save,restore}_parser_state
+
+builtins/jobs.def
+       - change execute_list_with_replacements to eliminate a run_unwind_frame
+         in favor of calling the cleanup explicitly and discarding the frame
+
+execute_cmd.c
+       - change execute_for_command to avoid a run_unwind_frame in the case
+         where the loop variable is readonly or otherwise not assignable
+       - change execute_select_command and execute_simple_command to use
+         discard_unwind_frame by running the cleanup code explicitly, instead
+         of using run_unwind_frame
+       - make sure execute_select_command decreases loop_level even on error
+
+                                  9/30
+                                  ----
+doc/{bash.1,bashref.texi}
+       - fixed description of `unset' now that unsetting a previously-unset
+         variable is no longer an error
+
+                                  10/3
+                                  ----
+{configure,config.h}.in
+       - augment check for strtold with additional check to detect the
+         horribly broken hp/ux 11.x implementation that returns `long_double';
+         defines STRTOLD_BROKEN if so
+
+builtins/printf.def
+       - define floatmax_t as `double' if STRTOLD_BROKEN is defined
+
+                                  10/5
+                                  ----
+lib/readline/keymaps.c
+       - don't automatically bind uppercase keys to rl_do_lowercase_version
+         in rl_make_bare_keymap
+
+lib/readline/readline.c
+       - explicitly check for ANYOTHERKEY binding to rl_do_lowercase_version
+         and dispatch to lowercase of key when a prefix is not matched
+
+                                  10/12
+                                  -----
+bashline.c
+       - set COMP_WORDBREAKS in enable_hostname_completion to the value
+         of rl_completer_word_break_characters
+
+variables.c
+       - new special variable COMP_WORDBREAKS, controls the value of
+         rl_completer_word_break_characters
+
+variables.h
+       - new extern declaration for sv_comp_wordbreaks()
+
+subst.c
+       - change split_at_delims to behave more like shell word splitting if
+         the passed value for the delimiters is NULL, indicating that the
+         function is to use $IFS to split
+
+{execute_cmd,jobs,test,findcmd,input,make_cmd,redir,shell}.c
+builtins/mkbuiltins.c,builtins/{fc,history,source,umask}.def
+lib/sh/netconn.c
+lib/termcap/termcap.c
+lib/readline/histfile.c
+       - make sure all inclusions of <sys/file.h> are protected by
+         HAVE_SYS_FILE_H
+
+bashline.c
+       - don't turn off rl_filename_completion_desired in
+         attempt_shell_completion if the partial pathname contains a slash.
+         This still doesn't solve the problem of partial pathname completion
+         starting with a directory in the current directory without a
+         leading `./'.  There's no way to tell the difference between that
+         and a file found in $PATH (which may contain `.') at the point that
+         attempt_shell_completion acts
+
+                                  10/18
+                                  -----
+locale.c
+       - don't set lc_all to the default locale when LC_ALL is being unset
+       - new function, reset_locale_vars(), called to recompute the correct
+         locale variable values when LC_ALL is unset
+       - changed set_lang to not set LC_ALL, which it never should have been
+         doing in the first place, and to maintain a local variable `lang'
+         corresponding to $LANG
+       - change get_locale_var to use the precedence posix.2 specifies:
+         LC_ALL overrides individual variables; LANG, if set, is the default
+       - change set_locale_var to call get_locale_var to get the appropriate
+         value for the variable being set or unset
+       - call get_locale_var instead of using passed value in set_locale_var
+         to get the defaulting and precedence right
+
+lib/readline/nls.c
+       - new function, _rl_get_locale_var(), which does the same thing as
+         locale.c:get_locale_var(), with the right precedence and defaulting,
+         using sh_get_env_value to get the right bash variable values
+       - if HAVE_SETLOCALE is defined, _rl_init_eightbit first calls
+         _rl_get_locale_var to get the right value for LC_CTYPE, and uses
+         that in the call to setlocale.  If _rl_get_locale_var returns NULL,
+         call setlocale() to get the current international environment, and,
+         finally, if that returns null, call setlocale with a second argument
+         of "" to force the implementation's `native' environment
+
+pcomplete.c
+       - change gen_wordlist_completions to dequote the text before comparing
+         it against the expanded word list 
+       - changed gen_matches_from_itemlist to do the same thing
+
+bashline.c
+       - new global function, bash_dequote_word, calls bash_dequote_filename
+         on the text passed.  Used by the programmable completion code
+
+lib/readline/histfile.c
+       - make sure that whenever read_history_range returns a non-zero value
+         that it sets errno to some useful value
+
+                                  10/19
+                                  -----
+variables.c
+       - COMP_WORDBREAKS is now a dynamic variable, mirroring value of
+         rl_completer_word_break_characters.  Makes sure that the variable
+         always points to dynamic memory if it's not null or the readline
+         default
+
+bashline.c
+       - change enable_hostname_completion to manage a dynamic value of
+         rl_completer_word_break_characters, since assignments to
+         COMP_WORDBREAKS can change its value unpredictably
+
+lib/readline/{complete.c,readline.h}
+       - rl_completer_word_break_characters no longer has `const' attribute
+
+bashline.c
+       - clean up necessary places due to rl_completer_word_break_characters
+         no longer being `const'
+
+doc/{bash.1,bashref.texi}
+       - document new COMP_WORDBREAKS variable
+
+                                  10/21
+                                  -----
+print_cmd.c
+       - fix indirection_level_string to handle the case where the decoded
+         $PS4 is null without seg faulting
+
+                                  10/22
+                                  -----
+builtins/shift.def
+       - make sure that there is actually an argument when reporting a shift
+         count that exceeds the number of positional paramters and
+         shift_verbose is enabled
+
+lib/readline/rltty.c
+       - change SET_SPECIAL to call a new function, set_special_char, since
+         it contains a block.  It's called infrequently, so the performance
+         impact of making it a function should be negligible, and it helps
+         debugging
+
+                                  10/29
+                                  -----
+bashline.c
+       - make sure the editor in VI_EDIT_COMMAND and EMACS_EDIT_COMMAND is
+         quoted; it might contain spaces (e.g., `emacs -nw')
+
+aclocal.m4
+       - cache ac_cv_rl_version in RL_LIB_READLINE_VERSION macro
+
+configure.in
+       - change logic that sets RL_INCLUDEDIR so that it doesn't try to set
+         a bogus include path if the argument to --with-installed-readline
+         is `yes' -- helps with cross-compiling
+
+lib/readline/histexpand.c
+       - fix history_tokenize_word so that it handles <( and >( better
+
+                                  10/30
+                                  -----
+redir.c
+       - fix write_here_string so it handles the case where `herestr' expands
+         to NULL without seg faulting
+
+                                  10/31
+                                  -----
+mailcheck.c
+       - reverse logic flip from bash-2.05 that handled systems that don't
+         change the atime when the mailbox is accessed; make sure the file
+         is bigger before we report new mail.  This is the case in the vast
+         majority of cases.  Reported by jim@jtan.com
+
+                                  11/5
+                                  ----
+parse.y
+       - change action for `for x; { list; }' and corresponding `select'
+         production to use \"$@\" instead of just $@, as it is with all the
+         other actions
+
+                                  11/9
+                                  ----
+parse.y
+       - new flag for parse_matched_pair: P_DQUOTE, indicating that the
+         pair of characters being matched is between double quotes
+       - parse_matched_pair now passes P_DQUOTE down to recursive calls:
+         if the open char to be matched is a `"' or the passed-in flags
+         include P_DQUOTE, set the local `rflags' variable to P_DQUOTE and
+         pass `rflags' down to recursive calls
+       - if `rflags' includes P_DQUOTE, don't try to ansiexpand $'...' or
+         locale expand $"..."; consistent with other quoting constructs
+
+                                  11/11
+                                  -----
+doc/{bash.1,bashref.texi}
+       - explicitly note that variables referenced in arithmetic expressions
+         without using `$' evaluate to 0 if they are null or unset
+       - note that a null variable value evaluates to 0 when used in an
+         arithmetic context, like when a variable with the `-i' attribute is
+         assigned a null value
+       - document the ${!prefix@} expansion as equivalent to ${!prefix*}
+
+                                  11/12
+                                  -----
+doc/{bash.1,bashref.texi}
+       - note that the value of an arithmetic expression is as in C
+       - change the wording to note that `arithmetic evaluation' (not
+         arithmetic expansion, which has a different meaning) is performed
+         on the value assigned to a variable whose integer attribute is set
+
+                                  11/13
+                                  -----
+execute_cmd.c
+       - fix execute_disk_command so it calls exit() after printing the error
+         message in a restricted shell context if the shell has already forked
+         (nofork != 0 && there are no pipes)
+
+                                  11/19
+                                  -----
+builtins/type.def
+       - don't report on aliases unless expand_aliases is set and the parser
+         is performing alias expansion; changed tests/type.tests and
+         tests/type.right accordingly
+
+                                  11/25
+                                  -----
+general.c
+       - fix for full pathnames including drive letters on cygwin from
+         Corinna (convert to posix-style paths, which the rest of the
+         code handles much better)
+
+lib/readline/text.c
+       - fixes to overwrite mode from jimmy@is-vn.bg:
+               o in _rl_overwrite_char, do the overwrite mode self-insert
+                 as one group, even when overwriting more than 1 char
+               o in _rl_overwrite_char, do the insert before the delete so
+                 that an undo positions the cursor on the character restored,
+                 not to the right of it
+               o in _rl_overwrite_rubout, don't do rl_insert_char(' ') unless
+                 rl_point < rl_end.  Since overwrite-mode self-insert acts as
+                 in insert-mode when at eol, make rubout behave like
+                 insert-mode rubout
+
+                                  11/30
+                                  -----
+lib/readline/misc.c
+       - call rl_replace_line with `1' as second parameter if we're going to
+         immediately overwrite the undo list
+
+lib/readline/search.c
+       - in make_history_line_current, use _rl_replace_text to make the line
+         replacement an undoable operation.  Affects all non-incremental
+         search functions.
+
+parse.y
+       - make behavior introduced on 11/9 dependent on extended_quote
+         variable, controllable by extquote shopt option.  Default setting is
+         on for backwards compatibility
+
+builtins/shopt.def
+       - new `extquote' option to control extended_quote variable
+
+                                  12/3
+                                  ----
+jobs.c
+       - change message printed when attempting to put a background job in
+         the background with `bg' to include the job id and make the
+         statement declarative
+
+                                  12/10
+                                  -----
+bashhist.h
+       - define explicit flag values for history_control
+
+variables.c
+       - change sv_history_control to use new flag values
+       - change sv_history_control to parse $HISTCONTROL as a colon-separated
+         list of values for the history_control variable
+
+bashhist.c
+       - change check_history_control to use new flag values and restructure
+         to remove case statement
+       - new function hc_erasedups(line); removes all entries matching LINE
+         from the history list
+       - call hc_erasedups() from check_add_history after we've determined
+         that we're saving the line
+
+doc/{bash.1,bashref.texi}
+       - documented new options available for $HISTCONTROL and that it can
+         be a colon-separated list of history control options
+
+                                  12/11
+                                  -----
+subst.c
+       - fix pat_subst() to not increment `e' (pointer to the end of the
+         matched portion of the string) until after we're sure we're going
+         around the loop again; fixes problem with empty replacements for
+         a pattern that doesn't match (bug reported by Don Coleman
+         <don@coleman.org>)
+
+                                  12/17
+                                  -----
+lib/readline/display.c
+       - fixes to multibyte redisplay from jir@yamato.ibm.com (Jiro SEKIBA):
+               o speed up calculation of first difference between old and new
+                 lines in the common case
+               o don't try to see if we're in the middle of a multbyte char
+                 in update_line (we'll see how this one works out)
+
+                                  12/18
+                                  -----
+doc/bashref.texi
+       - make it clear that the `command-list' function definition may be
+         terminated by an ampersand before the closing brace
+
+                                  12/28
+                                  -----
+redir.c
+       - set `expanding_redir' flag when expanding words in a redirection
+
+subst.c
+       - new function, exp_jump_to_top_level(), to do any word expansion
+         cleanup before a call to jump_to_top_level from within that file;
+         sets expanding_redir back to 0 before jump_to_top_level
+
+variables.c
+       - in find_variable(), don't call find_variable_internal with a second
+         parameter of 1 if expanding_redir is non-zero
+       - in find_variable_internal(), don't search the temporary env if
+         subshell_environment includes SUBSHELL_FORK (indicating a simple
+         command) and expanding_redir is non-zero
+
+parse.y
+       - increment line_number when we read a \<newline> pair
+
+array.c
+       - added array_unshift_element and array_shift_element (which just call
+         array_shift and array_rshift, respectively), for bash debugger
+         support
+
+                                1/4/2003
+                                --------
+doc/{bash.1,bashref.texi}
+       - note in the section describing the execution environment passed to
+         children that subshells inherit shell functions marked for export
+       - note in the section describing shell functions the possibility
+         that exported functions may result in two entries in the environment
+         with the same name
+
+parse.y
+       - when pushing an alias expansion onto the pushed_string list, append
+         a space to the expanded definition to make the parser's lookahead
+         work without using the `mustpop' hack in shell_getc
+
+                                   1/8
+                                   ---
+shell.c
+       - change calls to exit() with EX_USAGE as a parameter to use
+         EX_BADUSAGE instead, since EX_USAGE is defined as 258 and is
+         technically out of range
+
+                                  1/14
+                                  ----
+aclocal.m4
+       - check for the termcap functions in libc first:  if we don't have
+         to link in another library, let's not do it
+       - change the test for mbstate_t to use AC_TRY_COMPILE instead of
+         AC_TRY_RUN
+
+doc/{bash.1,bashref.texi}
+       - document that bash turns line editing off if environment variable
+         EMACS is set to `t' when it starts up
+
+doc/bash.1
+       - minor change to give the ftp url for the latest version of bash in
+         the bug reports section
+
+lib/readline/histexpand.c
+       - in get_history_event, cast a couple of `const char *' variables to
+         `char *' in function call parameter lists to avoid compiler warnings
+
+                                  1/21
+                                  ----
+builtins/cd.def
+       - change `cd -' so it prints the current working directory after a
+          successful chdir even when the shell is not interactive
+
+                                  1/31
+                                  ----
+lib/readline/doc/rltech.texinfo
+       - clarified exactly what is meant by the term `application-specific
+         completion function', made its use consistent, and documented
+         what variables are changed before such a function is called
+
+lib/readline/input.c
+       - new function, _rl_pushed_input_available(), returns non-zero if
+         there are characters in the input queue managed by rl_get_char
+         and _rl_unget_char
+
+lib/readline/rlprivate.h
+       - new extern declaration for _rl_pushed_input_available
+
+lib/readline/callback.c
+       - change rl_callback_read_char to check _rl_pushed_input_available
+         and loop if there's something there, so characters don't languish
+         until more keyboard input is read
+
+execute_cmd.c
+       - new variable, last_command_exit_signal, non-zero if
+         last_command_exit_value result from wait_for was result of a signal
+
+nojobs.c
+       - keep track of whether or not a given pid was killed by a signal with
+         a new flag in the pid_list array
+       - new function int find_termsig_by_pid(pid_t pid) to get the
+         terminating signal, if any, for a particular pid
+       - new function int get_termsig(WAIT status) returns the terminating
+         signal corresponding to status
+       - set last_command_exit_signal in wait_for and the various wait_for_xx
+         functions
+
+jobs.c
+       - new functions, process_exit_signal and job_exit_signal, return the
+         signal that killed a given process or job, if a signal caused its
+         death
+       - set last_command_exit_signal in wait_for by calling job_exit_signal
+         or process_exit_signal appropriately
+
+subst.c
+       - don't resend SIGINT to ourselves unless last_command_exit_signal is
+         SIGINT and last_command_exit_value == 128 + SIGINT.  This fixes the
+         $(exit 130) bug reported by Paul Jarc
+
+expr.c
+       - new function, expr_bind_variable, calls bind_int_variable and
+         then stupidly_hack_special_variables.  This fixes the
+         `let OPTIND=1' bug
+
+bashline.c
+       - change history_and_alias_expand_line and shell_expand_line to call
+         history_expand_line_internal so calls to pre_process_line are
+         localized
+       - change history_expand_line_internal and cleanup_expansion_error to
+         temporarily turn off hist_verify before calling pre_process_line
+         to avoid the effects described by teirllm@dms.auburn.edu
+
+parse.y
+       - don't unconditionally turn off PST_ALEXPNEXT in push_string.  This
+         fixes the multiple alias expansion bug reported by Paul Jarc.
+
+lib/readline/vi_mode.c
+       - change rl_vi_subst to push `l' instead of ` ' -- it should be
+         equivalent, but this has been reported to fix a problem in multibyte
+         locales
+
+lib/readline/readline.h
+       - new state flag value RL_STATE_TTYCSAVED, indicates that save_tty_chars
+         has been called.  Since it's only used and visible internally, it's
+         undocumented
+
+lib/readline/rltty.h
+       - changed all of the members of _rl_tty_chars struct to `unsigned char'
+
+lib/readline/rltty.c
+       - set the RL_STATE_TTYCSAVED after save_tty_chars is called
+       - new function, rl_tty_unset_default_bindings(), resets bindings for
+         everything rl_tty_set_default_bindings() messes with back to
+         rl_insert, so rl_tty_set_default_bindings can be called again with
+         possible changes
+       - new function that does the bulk of the work for
+         rltty_set_default_bindings:  _rl_bind_tty_special_chars()
+       - change prepare_terminal_settings so that it can track changes to the
+         terminal special chars made by stty(1):  unset the bindings with
+         rl_tty_unset_default_bindings before calling save_tty_chars, and
+         _rl_tty_set_default_bindings after, with the new values from
+         get_tty_settings().  This implements a long-standing request, most
+         recently made by Tim Waugh of Red Hat.
+
+lib/readline/readline.h
+       - extern declaration for rl_tty_unset_default_bindings()
+
+lib/readline/readline.c
+       - new function, reset_default_bindings, calls
+         rl_tty_unset_default_bindings() to reset the terminal special chars
+         back to rl_insert and then read the new ones
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_tty_unset_default_bindings()
+
+                                   2/1
+                                   ---
+[prayers and condolences to the families of the space shuttle crew members]
+
+aclocal.m4
+       - add checks for mbrtowc and mbrlen in BASH_CHECK_MULTIBYTE
+       - new check, BASH_FUNC_CTYPE_NONASCII, checks whether or not the ctype
+         functions handle non-ascii characters correctly
+
+config.h.in
+       - add HAVE_MBRTOWC and HAVE_MBRLEN
+       - add NO_MULTIBYTE_SUPPORT for new configure argument
+       - add CTYPE_NON_ASCII
+
+config-bot.h, lib/readline/rlmbutil.h
+       - make sure that mbrtowc, mbrlen, and wcwidth are all present before
+         turning on HANDLE_MULTIBYTE
+       - turn off multibyte chars if NO_MULTIBYTE_SUPPORT is defined
+
+configure.in
+       - new argument --enable-multibyte (enabled by default), allows
+         multibyte support to be turned off even on systems that support it
+
+lib/readline/chardefs.h
+       - define NON_NEGATIVE as 1 if CTYPE_NON_ASCII is defined
+
+                                   2/3
+                                   ---
+config.h.in
+       - add HAVE_WCTOMB
+
+aclocal.m4
+       - check for wctomb in BASH_CHECK_MULTIBYTE
+
+                                   2/4
+                                   ---
+lib/readline/vi_mode.c
+       - in _rl_vi_change_mbchar_case, make sure the result from wctomb()
+         is NULL-terminated before trying to insert it with rl_insert_text()
+
+                                   2/5
+                                   ---
+lib/readline/display.c
+       - fix to update_line to avoid problems on systems with multibyte
+         characters when moving between history lines when the new line
+         has more glyphs but fewer bytes (twaugh@redhat.com)
+
+lib/readline/vi_mode.c
+       - use wcrtomb() instead of wctomb() in _rl_vi_change_mbchar_case
+
+pcomplete.c
+       - fix init_itemlist_from_varlist to handle the case where the
+         `varlist' is NULL
+
+doc/{bash.1,bashref.texi}
+       - clarified when a simple command may fail without the shell exiting
+         when -e is set
+
+                                  2/13
+                                  ----
+parse.y
+       - when bash is started with --nolineediting, ignore \[ and \] when
+         decoding the prompt string
+
+subst.c
+       - fix remove_quoted_nulls so that a string with a CTLESC appearing
+         after a CTLNUL (which was removed) does not leave characters in
+         the string inappropriately
+
+                                  2/14
+                                  ----
+builtins/common.h
+       - new flag value for parse_and_execute(): SEVAL_RESETLINE, which
+         allows the caller to specify whether or not the internal idea
+         of the line number should be reset to 1
+
+builtins/evalstring.c
+       - parse_and_execute() now tells push_string to reset the line
+         number only if the SEVAL_RESETLINE flag is set by the caller
+
+                                  2/15
+                                  ----
+builtins/evalfile.c
+       - pass SEVAL_RESETLINE from _evalfile() to parse_and_execute()
+
+subst.c
+       - if the shell is currently interactive, pass SEVAL_RESETLINE to
+         parse_and_execute() when doing command substitution
+
+jobs.c
+       - add SEVAL_RESETLINE to parse_and_execute while running SIGCHLD trap
+
+command.h
+       - add `line' members to case_com, for_com, select_com
+       - rearranged order of members in some of the command structs, so
+         `flags' and `line' are first
+       - added a `source_file' member to the function_def struct; keeps
+         track of where the function was defined
+
+doc/Makefile.in
+       - add some new suffix rules:  .dvi.ps
+
+doc/{bash.1,bashref.texi}
+       - added text to the description of the `trap' builtin tightening up
+         the language describing when the ERR trap will be run
+
+error.c
+       - if $BASH_SOURCE (internally-maintained) exists, use BASH_SOURCE[0]
+         in get_name_for_error if the shell is not interactive
+
+array.h
+       - new convenience defines: array_push and array_pop
+
+variables.c
+       - change get_funcname to return this_shell_function->name only if
+         arrays have not been compiled into the shell
+       - change init_funcname_var to initialize FUNCNAME as an array variable
+         if we have arrays
+       - new function: get_self(SHELL_VAR *self), a degenerate `dynamic_value'
+         function for dynamic variables
+       - new function: init_dynamic_array_var(), a generic dynamic array
+         variable initializer to handle the common case
+       - use init_dynamic_array_var() instead of explicit init_dirstack_var()
+       - use init_dynamic_array_var() instead of explicit init_groups_var()
+       - new dynamic array variables:  BASH_ARGC, BASH_ARGV, BASH_SOURCE,
+         BASH_LINENO, initialized with init_dynamic_array_var
+
+shell.c
+       - initialize BASH_LINENO, BASH_SOURCE, FUNCNAME in open_shell_script
+
+{execute_cmd,trap}.c
+       - take out trap_line_number, since parse_and_execute doesn't reset the
+         line number any more when running the trap commands
+
+make_cmd.c
+       - augment make_function_def to get source file name and call
+         bind_function_def to save the entire FUNCTION_DEF
+
+variables.c
+       - new hash table: shell_function_defs, keeps table of shell function
+         definitions including source file and line number info corresponding
+         to shell_functions table
+       - new functions: find_function_def and bind_function_def to manage
+         the shell_function_defs hash table
+       - new function: unbind_function_def to remove a function definition
+         from the shell_function_defs table (right now uncalled)
+
+variables.h
+       - extern declaration for bind_function_def, find_function_def
+       - new extern declaration for unbind_function_def
+
+execute_cmd.c
+       - in function prologue and epilogue, push and pop FUNCNAME,
+         BASH_SOURCE, and BASH_LINENO information
+
+dispose_cmd.c
+       - broke the code that disposes a FUNCTION_DEF out into two new
+         functions: dispose_function_def and dispose_function_def_contents
+
+dispose_cmd.h
+       - new extern declarations for dispose_function_def_contents and 
+         dispose_function_def
+
+copy_cmd.c
+       - move body of copy_function_def (other than allocating a new
+         FUNCTION_DEF) to copy_function_def_contents
+       - make sure to copy the new source_file member of a function_def in
+         copy_function_def_contents
+       - copy_function_def is no longer static, copy_function_def_contents
+         is not either
+
+command.h
+       - new extern declaration for copy_function_def_contents and
+         copy_function_def
+
+parse.y
+       - keep a stack of line numbers where case, select, and for commands
+         start, with a maximum nesting level of 128; increment when reading
+         word after `for', `select' or `case' in read_token_word; decrement
+         in grammar actions after parsing a complete for, arith_for, select,
+         or case command
+       - create for, case, arith_for, and select commands with an extra
+         line number (word_lineno[word_top]) argument
+
+make_cmd.c
+       - make_for_or_select, make_for_command, make_case_command, and
+         make_select_command all take an extra `line_number' argument
+
+make_cmd.h
+       - corresponding changes to extern declarations for those functions
+
+                                  2/16
+                                  ----
+{execute_cmd,shell,variables}.c
+       - follow each call to remember_args with a call to push_args or
+         pop_args to manage the BASH_ARGV and BASH_ARGC arrays.  Only set
+         when the shell is started to run shell script or runs a shell
+         function.  Doesn't handle `set' or `shift' yet, nor `source'.
+
+execute_cmd.c
+       - keep track of the level of subshells with a new variable, manipulated
+         in execute_in_subshell
+       - set currently_executing_command in execute_command_internal(),
+         even if we're running a trap
+       - better line number management when executing simple commands,
+         conditional commands, for commands in execute_command_internal()
+         and the various functions that implement the commands
+         (execute_cond_command, execute_for_command, execute_etc.)
+
+variables.c
+       - new dynamic variable BASH_SUBSHELL, with new get_subshell and
+         assign_subshell functions to manipulate it
+       - new functions push_args (WORD_LIST *list) and pop_args (void) to
+         manage the BASH_ARGC and BASH_ARGV dynamic array variables
+
+variables.h
+       - new extern declarations for push_args and pop_args
+
+builtins/evalfile.c
+       - in _evalfile, do appropriate things to the FUNCNAME, BASH_ARGV,
+         BASH_ARGC, BASH_SOURCE, and BASH_LINENO variables
+
+support/mksignames.c
+       - add another fake signal for `trap'; make NSIG+2 == `RETURN'
+
+trap.c
+       - _run_trap_internal now returns an int:  the exit value of the command
+         run as the result of the trap
+       - run_debug_trap now returns an int: the exit value of the command
+         run as the result of the trap
+       - RETURN is a new special trap
+       - new function: set_return_trap(char *command) interface for the rest
+         of the shell, like set_{debug,error}_trap
+       - new function: run_return_trap()
+       - command substitution and other child processes don't inherit the
+         return trap
+
+trap.h
+       - new extern declaration for set_return_trap() and run_return_trap
+       - new defines for RETURN_TRAP; increment BASH_NSIG
+       - change extern declaration for run_debug_trap() since it now returns
+         an int
+
+shell.c
+       - new invocation long option:  --debugger, turns on debugging and
+         sets internal `debugging_mode' variable
+
+execute_cmd.c
+       - new code to save return trap when executing a shell function, so
+         shell functions don't inherit it
+       - run debug trap before binding the variable and running the action
+         list in a `for' command
+       - run debug trap before binding the selection variable and running
+         the query in a `select' command
+       - run debug trap before running matcher in a `case' command
+
+builtins/set.def
+       - new `set -o functrace' (set -T), causes DEBUG trap to be inherited
+         by shell functions
+       - new `set -o errtrace' (set -E), causes ERR trap to be inherited
+         by shell functions
+
+flags.c
+       - new flags -E and -T, control error_trace_mode and
+         function_trace_mode respectively
+
+flags.h
+       - new extern declarations for error_trace_mode and function_trace_mode
+
+                                  2/17
+                                  ----
+doc/bashref.texi
+       - changed the `dircategory' as per Karl Berry's suggestion
+
+doc/texinfo.tex
+       - update to version of 2003/02/04 from texinfo.org
+
+support/texi2dvi
+       - update to version 1.14 from texinfo-4.5 distribution
+
+                                  2/20
+                                  ----
+support/config.{guess,sub}
+       - update to versions of 2002/11/30
+
+lib/readline/doc/manvers.texinfo
+       - renamed to version.texi to match other GNU software
+       - UPDATE-MONTH variable is now `UPDATED-MONTH'
+
+lib/readline/doc/{hist,rlman,rluserman}.texinfo
+       - include version.texi
+
+doc/version.texi
+       - new file, with standard stuff matching other GNU distributions
+
+{doc,lib/readline/doc}/Makefile.in
+       - include right stuff for `version.texi'
+
+lib/readline/doc/{rluserman,rlman,hist}.texinfo
+       - use @copying and @insertcopying and @ifnottex instead of @ifinfo
+       - add FDL as an appendix entitled `Copying This Manual'
+
+lib/readline/doc/{rltech,rluser,hstech,hsuser}.texi
+       - changed the suffix from `texinfo' to `texi'
+
+lib/readline/doc/{rlman,rluserman}.texinfo, doc/bashref.texi
+       - include rltech.texi,rluser.texi,hstech.texi, and hsuser.texi
+
+lib/readline/doc/Makefile.in,doc/Makefile.in
+       - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi
+
+lib/readline/doc/{rlman,rluserman}.texinfo
+       - changed the suffix from `texinfo' to `texi'
+
+lib/readline/doc/hist.texinfo
+       - renamed to history.texi
+
+                                  2/25
+                                  ----
+pathnames.h.in
+       - moved pathnames.h here so value of DEBUGGER_START_FILE can be
+         substituted by configure
+
+aclocal.m4
+       - added AM_PATH_LISPDIR for debugger
+
+configure.in
+       - added some variables: `bashvers', `relstatus' to use info in more
+         than one place
+       - call AM_PATH_LISPDIR
+       - new option:  --enable-debugger, sets DEBUGGER cpp option
+       - new option with AC_ARG_VAR:  DEBUGGER_START_FILE
+       - make `pathnames.h' a file generated by configure
+
+Makefile.in
+       - add rule to create pathnames.h
+
+builtins/declare.def
+       - added extra line number and source file name to `declare -F' output
+         if `--debugger' is used at startup
+
+builtins/evalfile.c
+       - call run_return_trap from source_file before returning the result
+         from _evalfile()
+
+execute_cmd.c
+       - call run_return_trap in execute_function before restoring the old
+         context
+
+builtins/source.def
+       - arrange to save and restore DEBUG traps when sourcing files if
+         function_trace_mode (set -o functrace) is not set
+
+print_cmd.c
+       - broke print_for_command, print_select_command, print_case_command
+         into two functions each:  one to print the `header' and one for
+         the body
+       - print_cond_command is no longer static
+       - print_arith_command now takes a WORD_LIST *, since it doesn't
+         actually do anything with the ARITH_COM it's passed except print
+         the enclosed WORD_LIST
+       - print_arith_command is no longer static
+
+externs.h
+       - extern declarations for print_{for,select,case}_command_head,
+         print_cond_command, print_arith_command
+
+{.,builtins,lib/sh}/Makefile.in
+       - corrected dependencies on pathnames.h, since it's now created in
+         the build directory
+
+                                   3/5
+                                   ---
+lib/glob/glob.c
+       - handle alloca() failing (it's supposed to return NULL)
+       - use malloc() (with its attendent bookkeeping) instead of alloca()
+         in glob_filename()
+
+subst.c
+       - check whether shell_glob_filename returns NULL in
+         glob_expand_word_list
+       - change parameter_brace_expand_rhs to handle cases like
+         ${a[2]:=value} by properly creating the array element instead of a
+         variable named `a[2]' (reported by <opengeometry@yahoo.ca>)
+
+variables.c
+       - change bind_int_variable to use valid_array_reference instead
+         of looking for `[' 
+
+lib/readline/vi_mode.c
+       - check for `a' in _rl_vi_done_inserting so the text inserted by an
+         `a' command can be reinserted with a `.'
+
+lib/readline/readline.c
+       - when entering vi insertion mode in readline_internal_setup(), make
+         sure that _rl_vi_last_key_before_insert is set to `i' so that undo
+         groups and redo work better (reported by <opengeometry@yahoo.ca>)
+
+lib/glob/sm_loop.c
+       - handle ?(...) in a pattern immediately following a `*', instead of
+         ignoring the `(' and treating the `?' as a single-char match, as
+         long as FNM_EXTFLAG is set (reported by <anderson110@poptop.llnl.gov>)
+
+aclocal.m4
+       - new test for presence of struct timezone, BASH_STRUCT_TIMEZONE
+
+config.h.in
+       - add HAVE_STRUCT_TIMEZONE
+
+configure.in
+       - call BASH_STRUCT_TIMEZONE
+
+execute_cmd.c
+       - don't try to use `struct timezone' in calls to gettimeofday unless
+         HAVE_STRUCT_TIMEZONE is defined; use (void *)NULL otherwise
+
+                                  3/20
+                                  ----
+execute_cmd.c
+       - new variable, the_printed_command_except_trap, saves the command
+         being executed before a trap is executed, for the debugger
+
+trap.c
+       - if in debugging mode, let command substitutions and other child
+         processes inherit the DEBUG and ERR traps if the `functrace'
+         (which is really a bad name, given this semantic) or `errtrace'
+         options, respectively, have been set
+
+shell.c
+       - local_pending_command renamed to command_execution_string; no longer
+         static
+
+variables.c
+       - new dynamic variable, BASH_COMMAND, set to the command string
+         currently executing, or the one that caused a trap to execute
+         (mapped to the_printed_command_except_trap)
+       - new variable, BASH_EXECUTION_STRING, set to the argument to the
+         -c invocation option, if the shell was started that way
+
+                                  3/22
+                                  ----
+execute_cmd.c
+       - changed execute_for_command, eval_arith_for_expr,
+         execute_select_command, execute_arith_command, execute_cond_command,
+         execute_simple_command to implement new DEBUG trap semantics
+         for the debugger: if the DEBUG trap commands return a non-zero
+         status and debugging_mode is non-zero, we skip the command to be
+         executed
+
+trap.c
+       - change run_debug_trap for the debugger: if we're in the debugger
+         and the DEBUG trap returns 2 while we're in a function or sourced
+         script, we force a `return'
+
+shell.c
+       - new function, start_debugger(), that sources the debugger start file
+         and turns the debugger on
+
+builtins/shopt.def
+       - new settable option, `extdebug', turns on debugging_mode, as if
+         --debugger had been supplied at invocation (but does not source
+         debugger startup file)
+
+trap.c
+       - make sure that run_exit_trap arranges for `returns' to come back
+         there, too, so a `return' executed by an `exit' invoked within a
+         shell function behaves correctly
+
+support/shobj-conf
+       - change darwin/MacOS X stanza based on advice from mac os x developers
+
+lib/sh/mailstat.c
+       - set the atime member of the synthesized stat struct to 0 if `cur/'
+         is empty, rather than leaving it undefined
+
+                                  3/24
+                                  ----
+builtins/caller.def
+       - new builtin to provide a call stack for the debugger
+
+builtins/evalfile.c
+       - added a second `flags' argument to source_file()
+       - new flag value for flags argument to _evalfile():  FEVAL_NOPUSHARGS.
+         If included in flags arg, it means to not manipulate the BASH_ARGV
+         and BASH_ARGC arrays
+
+builtins/common.h
+       - change prototype for source_file()
+
+builtins/source.def
+       - add flag value to call to source_file():  set to 1 if we replaced
+         the positional parameters
+       - add call to push_args if additional arguments supplied to the
+         source builtin
+       - add call to pop_args in maybe_pop_dollar_vars
+
+execute_cmd.c
+       - run the debug trap in execute_function so the debugger can stop
+         before the first command in a function body is executed
+       - modify subshell_level before executing a builtin or function in a
+         subshell
+       - print `for', `select', `case' command heads when set -x is enabled
+
+print_cmd.c
+       - `xtrace_print_word_list' now takes an additional flags argument,
+         which, if non-zero, says to print indirection_level_string()
+       - new functions to print for, select, and case command heads when
+         set -x is enabled
+       - add spaces after `((' and before `))' in xtrace_print_arith_command
+
+externs.h
+       - changed extern declaration for xtrace_print_word_list
+       - new declarations for xtrace_print_{for,case,select}_command_head()
+
+subst.c
+       - modify subshell_level when executing a command substitution
+
+                                  3/25
+                                  ----
+execute_cmd.c
+       - use `line_number' in executing_line_number instead of looking into
+         the current command if it's a simple command; rearrange code to
+         make this simpler to compile in and out
+       - need to save and restore value of currently_executing_command around
+         calls to debug trap and return trap in execute_function
+
+make_cmd.c
+       - make sure make_arith_for_command() disposes the WORD_LIST * it is
+         passed, since nothing else does and it's not used directly
+
+                                  3/28
+                                  ----
+Makefile.in    
+       - fixed dependencies for `error.o' on shell.h and version.h -- makes
+         parallel makes (gmake -j 4) work correctly
+
+doc/{bash.1,bashref.texi}
+       - documented all new features added to support the debugger
+
+                                   4/1
+                                   ---
+lib/sh/shquote.c
+       - make sure CTLESC and CTLNUL characters are escaped with CTLESC
+         by sh_double_quote, sh_backslash_quote and
+         sh_backslash_quote_for_double_quotes
+         Fixes vulnerability reported by svdb@stack.nl
+
+shell.h
+       - new `pipestatus' member of sh_parser_state_t, to save and restore
+         $PIPESTATUS
+
+parse.y
+       - changes to save_parser_state and restore_parser_state to save and
+         restore $PIPESTATUS
+
+builtins/read.def
+       - add a call to word_list_remove_quoted_nulls before assigning the
+         word list read from standard input to an array variable.  Fixes
+         bug reported by holzhey@ppprs1.phy.tu-dresden.de
+
+                                   4/3
+                                   ---
+execute_cmd.c
+       - in execute_null_command, if redirections are supplied, make sure
+         things like 3</etc/passwd are undone immediately, since they're
+         being done in the current shell
+       - functions now inherit the RETURN trap only if function tracing is
+         on for that function or globally
+
+lib/readline/misc.c
+       - in rl_replace_from_history, don't force rl_replace_line to clear
+         the undo_list, since it might point directly at an undo list
+         from a history entry (to which we have no handle)
+
+                                   4/4
+                                   ---
+trap.c
+       - initialize RETURN_TRAP stuff appropriately in initialize_traps()
+       - let command substitutions inherit the RETURN trap if we're in
+         the debugger and function tracing has been enabled
+
+redir.c
+       - do_redirections and do_redirection_internal now take a single
+         flags argument instead of multiple boolean flags
+
+redir.h
+       - new #defines for flags argument to do_redirection{s,_internal}
+
+execute_cmd.c
+       - change all calls to do_redirection to use new flag values
+
+parse.y
+       - new function, free_pushed_string_input(), an external interface to
+         clear the pushed_string list (alias expansion)
+       - new define SHOULD_PROMPT to say when it's OK to call prompt_again
+         (if the shell is currently interactive and is reading input from
+         the terminal or readline)
+       - make sure shell_getc and read_secondary_line only call prompt_again
+         if SHOULD_PROMPT evaluates to true
+       - prompt_again shouldn't do anything if the shell is currently in the
+         middle of expanding a multiline alias, since we won't be printing a
+         prompt anyway
+
+externs.h
+       - new extern declaration for free_pushed_string_input()
+
+execute_cmd.c
+       - command_substitute and process_substitute now call
+         free_pushed_string_input because they shouldn't deal with any
+         partial alias expansion the parent shell may have started
+
+                                   4/5
+                                   ---
+braces.c
+       - added {x..y} brace expansion, shorthand for {x,x+1,x+2,...,y}:
+         x, y can be integers or single characters; the sequence can be
+         ascending or descending; increment is always 1.  Beware that
+         something like {a..A} can lead to non-letters.
+
+                                   4/7
+                                   ---
+subst.c
+       - change extract_delimited_string and extract_dollar_brace_string to
+         return NULL on an expansion error when no_longjmp_on_fatal_error
+         is set, so the calling functions don't assume that the expansion
+         was successful (primarily the prompt expansion and completion code)
+
+doc/{bash.1,bashref.texi}
+       - documented new sequence generation feature of brace expansion
+
+                                   4/8
+                                   ---
+lib/sh/strstr.c
+       - replacement for strstr(3), in case the C library doesn't provide it
+
+configure.in
+       - check for strstr, add to LIBOBJS if not found
+
+array.c
+       - array_walk now takes a third void * argument; it's passed to `func'
+         as its second argument
+
+array.h
+       - change sh_ae_map_func_t prototype to add void * second argument
+
+                                  4/10
+                                  ----
+array.c
+       - new function: array_keys_to_word_list, returns a list of indices for
+         a given array
+
+array.h
+       - new extern declaration for array_keys_to_word_list
+
+arrayfunc.c
+3      - new function: char *array_keys(), returns a string with keys for a
+         given array, with the appropriate quoting
+
+arrayfunc.h
+       - new extern declaration for array_keys
+
+subst.c
+       - code to implement ksh93-like ${!array[@]} expansion (array[*] works,
+         too), which expands to all the keys (indices) of ARRAY
+
+doc/{bash.1,bashref.texi}
+       - documented new ${!array[@]} expansion
+
+                                  4/19
+                                  ----
+builtins/setattr.def
+       - remove any mention of the `-n' option from readonly builtin's short
+         and long documentation
+
+pcomplib.c
+       - fix progcomp_insert to increase the refcount on the `cs' argument
+         before calling hash_insert -- fixes the problem of multiple calls
+         to progcomp_insert with the same compspec
+
+doc/bash.1
+       - add mention of characters that inhibit history expansion when found
+         immediately following an unquoted `!'
+
+bashline.c
+       - convert the code conditionally compiled in by the NO_FORCE_FIGNORE
+         #define to something runtime-tunable with the `force_fignore'
+         variable (opposite sense).  force_fignore is 1 by default
+
+builtins/shopt.def
+       - new tunable `shopt' option: `force_fignore', controls force_fignore
+         variable and behavior of FIGNORE handling
+
+lib/readline/complete.c
+       - new variable, _rl_complete_show_unmodified, causes completer to list
+         possible completions if more than one completion and partial
+         completion cannot be done
+       - new value for what_to_do argument to rl_complete_internal, `@',
+         indicating that we want the show-unmodified behavior
+       - change rl_completion_type to return `@' when appropriate
+
+lib/readline/bind.c
+       - new bindable variable, show-all-if-unmodified, which controls value
+         of _rl_complete_show_unmodified
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_complete_show_unmodified
+
+lib/readline/doc/rluser.texi
+       - documented show-all-if-unmodified
+
+lib/readline/doc/rltech.texi
+       - documented new `@' value for second argument to rl_complete_internal
+       - documented new return value from rl_completion_type
+
+                                  4/22
+                                  ----
+lib/readline/signals.c
+       - in rl_set_signal, set sa_flags to SA_RESTART for SIGWINCH, if we
+         have POSIX signals -- this is what most applications expect, and
+         they're not prepared to deal with EINTR
+
+                                  4/25
+                                  ----
+bashline.c
+       - take out attempts to suppress readline filename completion when
+         attempting command completion and there is a directory with the
+         same name in the current directory.  #if 0'd for now; maybe make
+         it conditional later
+
+error.c
+       - new variable, gnu_error_format, causes non-interactive errors with
+         line numbers to be printed in the `gnu style' (filename:lineno:)
+         instead of the `shell style' (filename: line lineno:) by
+         error_prolog and parser_error
+
+version.h,support/mkversion
+       - don't put extern function declarations into created version.h any
+         more
+
+version.c,externs.h
+       - add extern declarations for show_shell_version() and
+         shell_version_string(), since they're no longer in version.h
+         (this backs out change from 9/10/2001)
+
+shell.h
+       - don't include version.h
+
+Makefile.in
+       - remove unneeded dependencies on version.h -- only version.o
+         needs it now
+
+builtins/shopt.def
+       - new option `gnu_errfmt', changes error messages with line numbers
+         to use the `standard' gnu format
+
+pcomplete.h
+       - new COPT_BASHDEFAULT and COPT_PLUSDIRS defines
+
+bashline.c
+       - if the COPT_BASHDEFAULT flag is set, try the rest of the bash
+         default completions if a compspec with that flag set generates
+         no matches
+       - broke bash completions out into separate function:
+         bash_default_completion(const char *text, int start, int end,
+         int qc, int in_command_position); change attempt_shell_completion
+         to call it
+
+bashline.h
+       - new extern declaration for bash_default_completion
+
+builtins/complete.def
+       - added code to compgen to call bash_default_completion if a compspec
+         with the COPT_BASHDEFAULT flag set generates no matches from the
+         programmable completion options
+
+doc/{bash.1,bashref.texi}
+       - document new `gnu_errfmt' shopt option
+
+doc/bash.1,lib/readline/doc/rluser.texi
+       - document new `-o bashdefault' option to complete and compgen
+
+                                  4/26
+                                  ----
+pcomplete.c
+       - if a compspec has the COPT_PLUSDIRS flag set, generate any
+         directory name completions and add them to the set of possible
+         completions as the last thing in gen_compspec_completions
+
+builtins/complete.def
+       - add new `-o plusdirs' option to complete and compgen; means to
+         do directory name completion in addition to other actions
+         specified by the compspec, and do it last
+
+                                  5/12
+                                  ----
+copy_cmd.c
+       - fix copy_{for,select,case}_command to copy the line member
+
+                                  5/13
+                                  ----
+lib/readline/rlmbutil.h,include/shmbutil.h
+       - new #define MB_INVALIDCH, evaluates to true if return value from
+         mbrtowc or mbrlen denotes an invalid multibyte character
+       - new #define MB_NULLWCH, evaluates to true if return value from
+         mbrtowc or mbrlen denotes a null multibyte character
+
+lib/readline/complete.c
+       - new function, fnwidth(), returns printed length of a filename,
+         correctly handling multibyte characters
+       - new function, fnprint(), displays a filename on rl_outstream
+         correctly handling multibyte characters
+       - use fnwidth() instead of simple strlen() for length calculations
+         in display_matches
+
+lib/readline/{display,mbutil}.c
+       - use MB_INVALIDCH and MB_NULLWCH as appropriate
+
+                                  5/21
+                                  ----
+configure.in
+       - turn off the builtin malloc on GNU/FreeBSD systems (GNU userland,
+         FreeBSD kernel)
+
+                                  5/24
+                                  ----
+pcomplete.c
+       - in programmable_completions, copy the compspec before using it to
+         generate the possible completions, allowing the completion for the
+         command to be changed by the compspec itself without causing a
+         core dump because the shell frees freed memory (reported by
+         marcus.harnish@gmx.net)
+
+parse.y
+       - in shell_getc, don't call notify_and_cleanup in an interactive shell
+         unless the shell is currently reading from the terminal and would
+         print a prompt.  This fixes programmable completions printing job
+         notifications (reported by r.d.green@lancaster.ac.uk)
+       - use SHOULD_PROMPT macro consistently
+
+shell.c
+       - use get_string_value instead of getenv when looking up $TERM and
+         $EMACS to see whether the shell is running under emacs
+       - check for `TERM=dumb' as well as `EMACS=t' to decide whether or
+         not to turn off command-line editing in emacs shell windows
+         (reported by jik@kamens.brookline.ma.us)
+
+                                  5/28
+                                  ----
+expr.c
+       - save and restore the `evalbuf' context, since evalexp can be
+         called recursively (e.g. a[b[c]])
+
+                                  5/29
+                                  ----
+builtins/common.c
+       - in display_signal_list, when displaying for `kill -l' in posix mode,
+         display signal names without the `SIG' prefix
+
+doc/bashref.texi
+       - documented changed to posix mode behavior of kill -l
+
+builtins/kill.def
+       - changed the error message printed when argument is not a pid or
+         job id
+
+doc/{bash.1,bashref.texi}
+       - fixed a slight inconsistency in the different sections describing
+         the `promptvars' option
+
+doc/Makefile.in
+       - new rule to create `bash.info' from `bashref.info' by running sed
+         to change the internal references.  This makes the installed
+         bash.info work right
+       - make the install target install bash.info after it's been modified
+         from bashref.info
+
+                                  5/30
+                                  ----
+builtins/cd.def
+       - after testing with ferror(), call clearerr if ferror() evaluates
+         to true
+
+execute_cmd.c
+       - call clearerr(stdout) after executing a builtin or function,
+         before restoring any redirections
+
+bashhist.c
+       - initialize history_comment_char in bash_history_initialize
+
+builtins/alias.def
+       - if posix mode is enabled, and the `-p' option is not supplied, don't
+         list aliases with a preceding `alias ', as POSIX.2 specifies
+
+doc/bashref.texi
+       - note new posix mode behavior of displaying alias names and values
+       - note new posix mode behavior of trap builtin not checking first
+         argument to be a possible signal specification
+       - note new posix mode behavior of `kill' not accepting signal names
+         with a leading `SIG'
+
+include/stdc.h,lib/readline/rlstdc.h
+       - don't check the __STRICT_ANSI__ define when deciding whether or not
+         to #undef __attribute__
+
+trap.[ch]
+       - decode_signal and signal_object_p take an additional flags arg to
+         satisfy POSIX.2 signal name translation requirements
+       - change decode_signal to honor the new DSIG_NOCASE (match case-
+         insensitively) and DSIG_SIGPREFIX (allow signal specifications
+         with the `SIG' prefix) flags
+
+builtins/{common.c,{trap,kill}.def}
+       - change calls to decode_signal to add the new argument with
+         appropriate values.  For kill, POSIX.2 says case-insensitive without
+         the `SIG' prefix.  For trap, POSIX.2 says applications may decode
+         case-insensitively and with the SIG prefix
+
+builtins/trap.def
+       - when in posix mode, don't check for the first argument being a
+         possible signal spec and revert the signal handling to the
+         original disposition
+
+                                   6/1
+                                   ---
+shell.h
+       - new MATCH_STARSUB define, to tell the callers of the various pattern
+         substitution and removal functions that call string_list to treat
+         "$*" and "${array[*]}" appropriately
+subst.c
+       - if get_var_and_type encounters an array variable subscripted by `*'
+         or `$*', return VT_STARSUB or'd into the variable type value
+       - callers of get_var_and_type check for VT_STARSUB in the returned type
+         this will fix problems with ${*...} not being separated with the
+         first character of $IFS when double-quoted
+       - in parameter_brace_patsub, set MATCH_STARSUB if VT_STARSUB is set by
+         get_var_and_type
+       - change pos_params_pat_subst to call string_list_dollar_star if
+         the match flags include MATCH_STARSUB
+       - change parameter_brace_substring to call array_subrange with an
+         additional argument indicating the character indexing the array
+
+array.c
+       - change array_patsub to join the modified array elements with the
+         first character of $IFS if MATCH_STARSUB is set in the match flags
+         passed in
+       - array_subrange now takes an additional argument indicating the
+         index type -- used to separate with first char of $IFS if the
+         index char is `*' and the expression is double-quoted
+
+array.h
+       - change prototype declaration of array_subrange to add additional arg
+
+                                   6/2
+                                   ---
+doc/FAQ
+       - merged in some updates about POSIX from Andrew Josey
+
+                                   6/3
+                                   ---
+bashjmp.h
+       - new value for jump_to_top_level:  ERREXIT
+
+{eval,shell,subst,trap}.c,builtins/evalstring.c
+       - ERREXIT is (for now) equivalent to EXITPROG as a value from
+         jump_to_top_level
+
+                                   6/9
+                                   ---
+doc/bash.1,lib/readline/doc/readline.3
+       - documented new `show-all-if-unmodified' readline variable
+
+                                  6/14
+                                  ----
+lib/readline/history.c
+       - new function, histdata_t free_history_entry (HIST_ENTRY *h),
+         frees H and its line, returning the application-specific data
+       - use free_history_entry where appropriate
+
+lib/readline/history.h
+       - extern declaration for free_history_entry()
+
+lib/readline/doc/{history.3,hstech.texi}
+       - document free_history_entry
+
+                                  6/16
+                                  ----
+lib/readline/readline.[ch]
+       - changed varions defines for readline/history library versions to 5.0
+
+subst.c
+       - pass information about whether or not an indirectly-expanded variable
+         contains ${array[@]}, ${array[*]}, $@, or $*
+       - new function, chk_atstar, performs checks for ${array[@]},
+         ${array[*]}, $@, or $* for the parameter_brace_expand* functions and
+         sets flags (passed as args) to the results
+       - call chk_atstar from parameter_brace_expand_indir and
+         parameter_brace_expand
+
+                                  6/28
+                                  ----
+doc/{bash.1,bashref.texi}
+       - clarified that (...) commands are executed in a subshell environment
+
+                                  6/30
+                                  ----
+lib/readline/bind.c
+       - fix a problem with parsing nested if statements in inputrc files
+         (fix from dimakar@yahoo.com)
+
+                                   7/3
+                                   ---
+{jobs,nojobs}.c
+       - fix places that use the return value from strsignal() to check
+         for NULL return values using a new function, j_strsignal()
+
+builtins/kill.def
+       - removed JOB_CONTROL restriction; kill is now available as a builtin
+         when the shell is built without job control
+
+                                  7/10
+                                  ----
+jobs.c
+       - some systems have WIFCONTINUED but not WCONTINUED; separate the
+         #defines
+
+                                  7/14
+                                  ----
+lib/readline/history.h
+       - new `timestamp' member of a HIST_ENTRY
+       - extern declarations for add_history_time and history_get_time
+
+lib/readline/doc/{history.3,hstech.texi}
+       - document add_history_time and history_get_time
+
+lib/readline/history.c
+       - implementations of history_get_time and add_history_time
+       - change add_history to initialize the timestamp information
+       - change free_history_entry to free the timestamp
+       - change replace_history_entry to duplicate the timestamp
+       - change history_total_bytes to add the memory taken by the time
+         stamps
+
+bashhist.c,builtins/history.def
+       - use free_history_entry where appropriate
+
+lib/readline/histfile.c
+       - changes to read_history_range to deal with new history file format
+         including timestamps
+       - changes to history_do_write to write out the timestamp information
+       - changes to history_truncate_file to understand the timestamp
+         information
+
+                                  7/22
+                                  ----
+doc/{bash.1,bashref.texi}
+       - fixed function declaration documentation to specify that any compound
+         command may be used as the function body, not just a group command
+
+                                  7/23
+                                  ----
+lib/readline/histfile.c
+       - don't allocate space for null timestamps in history_do_write, and
+         don't write out null timestamp entries
+
+parse.y
+       - fix CHECK_FOR_RESERVED_WORD to call time_command_acceptable() and
+         return TIME if the token is "time" and `time' is legal in that
+         context
+
+                                  7/29
+                                  ----
+lib/sh/fmtulong.c
+       - include <inttypes.h> for possible definitions of intmax_t, uintmax_t
+         (reported by ro@techfak.uni-bielefeld.de)
+
+                                  7/30
+                                  ----
+parse.y
+       - remove checking for `time' reserved word from special_case_tokens();
+         use regular mechanism in CHECK_FOR_RESERVED_WORD.  This allows `time'
+         to be aliased.  (Reported by Glenn Morris
+         <gmorris+gmane@ast.cam.ac.uk>)
+
+                                  7/31
+                                  ----
+lib/readline/history.h
+       - extern declaration for history_write_timestamps
+
+lib/readline/histfile.c
+       - don't write timestamps to the history file in history_do_write
+         unless history_write_timestamps is set to non-zero by the application
+         (set to 0 by default)
+
+lib/readline/doc/{hstech.texi,history.3}
+       - document history_write_timestamps
+
+variables.[ch]
+       - new special variable function, HISTTIMEFORMAT; special function
+         sets history_write_timestamps to 1 if HISTTIMEFORMAT is set
+
+                                   8/4
+                                   ---
+builtins/history.def
+       - added support for printing time stamps based on the value of the
+         HISTTIMEFORMAT variable when displaying history entries
+
+doc/{bash.1,bashref.texi}
+       - added description of new HISTTIMEFORMAT variable
+
+                                   8/5
+                                   ---
+config-top.h
+       - remove /usr/ucb from any default paths
+
+mailcheck.c
+       - make_default_mailpath now returns NULL if DEFAULT_MAIL_DIRECTORY
+         is not defined
+       - remember_mail_dates now returns if make_default_mailpath returns
+         NULL
+
+config-bot.h
+       - reorganized the sections; provide an explicit placeholder for
+         builders to #undef any feature defines they don't want that
+         configure creates for them, like the default mail path
+
+                                   8/9
+                                   ---
+config.h.in
+       - add HAVE_REGEX_H, HAVE_REGCOMP, HAVE_REGEXEC for detection of POSIX.2
+         regular expression functions
+       - add COND_REGEXP define to enable and disable the =~ operator for
+         matching extended regular expressions in [[...]] commands
+
+configure.in
+       - new option, --enable-cond-regexp, enables =~ and code to perform
+         regular expression matching in [[...]]
+
+config-bot.h
+       - undef COND_REGEXP if the OS doesn't provide posix regexp support
+
+doc/bashref.texi
+       - documnent new --enable-cond-regexp option to configure
+
+                                  8/18
+                                  ----
+support/shobj-conf
+       - support for shared objects on FreeBSD-gnu (from Robert Millan)
+
+                                  8/25
+                                  ----
+lib/sh/shmatch.c
+       - new file, shell interface to posix extended regular expression
+         matching
+
+externs.h
+       - new extern declarations for functions in shmatch.c
+
+execute_cmd.c
+       - incorporate code into execute_cond_node that does extended regular
+         expression matching for the =~ operator
+
+parse.y
+       - add `=~' to the list of binary operators accepted by the conditional
+         command parser
+
+doc/{bash.1,bashref.texi}
+       - documented =~ conditional binary operator and the BASH_REMATCH
+         variable
+
+                                  8/27
+                                  ----
+lib/readline/display.c
+       - take multibyte characters into account when looking for quoted
+         substrings on which to do completion (fix from jir@yamato.ibm.com)
+
+lib/readline/util.c
+       - fix typo in _rl_strpbrk
+
+lib/readline/rldefs.h
+       - use function version of _rl_strpbrk in multibyte locales, because
+         it understands to skip over special characters in multibyte
+         character sequences
+
+                                  8/28
+                                  ----
+jobs.c
+       - in wait_for, check for window size changes if a job that exits due
+         to a signal or is stopped was in the foreground, not just if it's
+         the current job
+
+                                  9/10
+                                  ----
+support/config.{guess,sub}
+       - add support to recognize FreeBSD running on the amd64
+
+subst.c
+       - if the new `fail_glob_expansion' variable is non-zero, globbing that
+         fails to match anything causes an expansion error
+
+builtins/shopt.def
+       - new `failglob' expansion:  if enabled, failed globs cause an error
+
+test/shopt.right
+       - take `failglob' into account
+
+doc/{bash.1,bashref.texi}
+       - documented new `failglob' option and its effects
+
+                                  9/12
+                                  ----
+findcmd.c
+       - fix file_status to treat the mode bits and uid right -- in particular,
+         don't assume the `other' bits always apply.  Bug reported by
+         <moseley@hank.org>; fix inspired by <carlo@alinoe.com>
+
+command.h
+       - new word flag: W_NOCOMSUB, meaning to not perform command
+         substitution on a word
+
+subst.c
+       - new flag for param_expand: PF_NOCOMSUB.  If non-zero, $(...)
+         command substitutions are not expanded, but returned unchanged
+       - change expand_word_internal to pass through `` command substitutions
+         unchanged if (word->flags & W_NOCOMSUB) != 0
+       - change expand_word_internal to pass PF_NOCOMSUB to param_expand
+         if (word->flags & W_NOCOMSUB) != 0
+
+builtins/shopt.def
+       - rename set_interactive_comments to set_shellopts_after_change, which
+         more accurately reflects its purpose
+
+syntax.h
+       - add a define for isblank() in case the system doesn't provide one
+
+jobs.c
+       - change raw_job_exit_status to understand `pipefail', using the new
+         `pipefail_opt' variable
+
+flags.[ch]
+       - declare pipefail_opt
+       - reset pipefail_opt to 0 in reset_shell_flags
+
+builtins/set.def
+       - add `set -o pipefail' and document it in help output
+
+doc/{bash.1,bashref.texi}
+       - document `set -o pipefail' and the effect of the pipefail option
+
+mksyntax.c,syntax.h
+       - sh_syntaxtab is no longer `const'
+       - new generated variable, sh_syntabsiz, set to number of entries in
+         sh_syntaxtab, written to generated syntax.c
+
+locale.c
+       - new function, locale_setblanks(), sets each member of the current
+         locale's <blank> class to have the CSHBRK flag in sh_syntaxtab
+
+                                  9/17
+                                  ----
+arrayfunc.c
+       - change convert_var_to_array to not set array[0] to a NULL value
+         (if the scalar variable had no value; e.g., after being created
+         with `local arrayvar')
+
+lib/readline/display.c
+       - save and restore the value of prompt_invis_chars_first_line in
+         rl_{save,restore}_prompt, and reinitialize it to 0 before printing
+         something in the message area
+
+lib/readline/bind.c
+       - new functions: rl_bind_keyseq_if_unbound_in_map(ks, func, kmap);
+         binds key sequence KS to function FUNC in keymap KMAP, and
+         rl_bind_keyseq_if_unbound (ks, func); binds key sequence KS to
+         function FUNC in the current keymap
+
+lib/readline/readline.h
+       - extern function declarations for rl_bind_keyseq_if_unbound_in_map and
+         rl_bind_keyseq_if_unbound
+
+lib/readline/{readline,terminal}.c
+       - _rl_bind_if_unbound -> rl_bind_keyseq_if_unbound
+
+lib/readline/{bind.c,rlprivate.h}
+       - remove _rl_bind_if_unbound
+
+                                  9/18
+                                  ----
+lib/readline/doc/rltech.texi
+       - document rl_bind_keyseq_if_unbound and
+         rl_bind_keyseq_if_unbound_in_map
+
+                                  9/19
+                                  ----
+lib/readline/bind.c
+       - new functions rl_bind_key_if_unbound_in_map and
+         rl_bind_key_if_unbound; analogous to (and implemented in terms of)
+         keyseq functions
+       - rl_bind_keyseq_in_map: a new function, equivalent to rl_set_key
+         (which remains for backwards compatibility); changed callers to
+         use it
+       - new function, rl_bind_keyseq, equivalent to rl_bind_keyseq_in_map
+         with a third argument of _rl_keymap
+
+lib/readline/readline.h
+       - extern declarations for rl_bind_key_if_unbound_in_map and
+         rl_bind_key_if_unbound
+       - extern declarations for rl_bind_keyseq_in_map and rl_bind_keyseq
+
+lib/readline/doc/rltech.texi
+       - document rl_bind_keyseq and rl_bind_keyseq_in_map
+
+configure.in
+       - require at least readline-5.0
+
+config-bot.h
+       - define SYS_SIGLIST_DECLARED if it's not defined, but
+         HAVE_DECL_SYS_SIGLIST is, to deal with differences between
+         autoconf versions
+
+bashline.c
+       - use rl_bind_key_if_unbound_in_map when binding bash keybindings in
+         initialize_readline(), so inputrc files can override them
+
+                                  9/22
+                                  ----
+lib/readline/histsearch.c
+       - do better bounds checking for history_offset and history_length in
+         history_search_internal
+
+builtins/history.def
+       - in delete_last_history(), make sure we don't leave the history
+         offset longer than the history length after calling delete_histent
+
+                                  9/23
+                                  ----
+jobs.c
+       - small change to notify_of_job_status so job status messages get
+         printed even if the shell was started to run `-c command'.  The
+         old behavior was intentional, but I cannot remember why, so we'll
+         try it the other way for a while (debian bash bug #211693)
+
+                                  9/24
+                                  ----
+jobs.c
+       - slightly modify change from 9/23 so that jobs started to run
+         command substitutions don't print job status messages
+
+                                  9/25
+                                  ----
+lib/readline/search.c
+       - when reading a non-incremental search string from the terminal,
+         use a separate undo list rather than chaining it to the undo list
+         from the rest of the line, since the whole undo list will get
+         freed when the search string is complete
+
+lib/readline/readline.h
+       - changed the defines guarding the stdarg prototype for rl_message to
+         match what's actually used in display.c, where it's defined
+
+                                  9/26
+                                  ----
+[bash-3.0-alpha released]
+
+                                  9/29
+                                  ----
+lib/sh/shmatch.c
+       - fix to build correctly when arrays are not compiled into the shell
+
+subst.c
+       - fix command substitution to run any exit trap defined in the
+         command substitution before returning; the exit trap is not inherited
+         from the calling shell
+
+lib/readline/shell.c
+       - change sh_set_lines_and_columns to free the memory allocated and
+         passed to setenv(), since setenv is specified by POSIX to allocate
+         new memory and copy its arguments
+
+jobs.c
+       - change logic in make_child so that every child process attempts to
+         set the terminal's process group to the pipeline's process group
+         when PGRP_PIPE is defined, just like when it's undefined.  This is
+         reported to fix some tricky synchronization problems on Red Hat
+         Enterprise Linux 3.  Fix from Ernie Petrides <petrides@redhat.com>.
+
+                                  9/30
+                                  ----
+builtins/printf.def
+       - tescape no longer needs a `trans_squote' argument, since it's the
+         same as the `sawc' argument.  The `sawc' argument now means to do
+         the %b argument processing if non-null
+       - fix processing of octal constants for %b arguments (\0 followed by
+         up to three octal digits) and other escape sequences (\ followed by
+         up to three octal digits)
+       - hex constants `\xHHH' are now allowed to contain any positive
+         number of digits; previously they were restricted to two [removed]
+       - allow two new escape sequences: \" and \?, for compatibility with
+         ksh93 and ANSI C
+
+doc/{bash.1,bashref.texi}
+       - documented processing that printf performs for arguments to %b
+         escape sequences
+
+lib/sh/strtrans.c
+       - add \" and \? to escape sequences recognized by `echo -e'
+
+                                  10/1
+                                  ----
+version.c
+       - use snprintf instead of sprintf if configure tells us we have it
+
+                                  10/3
+                                  ----
+subst.c
+       - in list_remove_pattern, take into account the fact that one of the
+         list elements may be NULL, and don't free the result of
+         remove_pattern() without checking
+       - in remove_pattern, return savestring(param) if *param == '\0',
+         since callers expect to free() non-null return values
+
+                                  10/4
+                                  ----
+subst.c
+       - change verify_substring_values to make it clearer that the first
+         offset deals with array indices and the second deals with numbers
+         of elements, when doing array subranges with ${a[@]:e1:e2}
+
+array.c
+       - change array_subrange to make it explicit that the second offset
+         argument is a count of the desired number of elements, not an
+         ending index.  This deals with sparse arrays correctly.
+
+                                  10/6
+                                  ----
+variables.c
+       - fix memory leak in assign_in_env
+
+                                  10/8
+                                  ----
+subst.c
+       - in parameter_brace_expand, check that the last characters are `]}'
+         before checking for ${!array[@]}
+
+execute_cmd.c,builtins/source.def
+       - push and pop the args (BASH_ARGV and BASH_ARGC) when executing a
+         shell function or sourcing a script only when in debugging mode
+
+                                  10/11
+                                  -----
+arrayfunc.c
+       - make sure array_variable_name returns values for the SUBP and LENP
+         arguments if they're non-null, since callers expect to use them
+         even if the array subscript is bad
+
+error.c
+       - call exit_shell instead of sh_exit from parser_error and
+         report_error so the right things happen (running exit trap, doing
+         the right interactive cleanup, etc.)
+
+lib/readline/complete.c
+       - new variable, rl_completion_quote_character, set to any quote char
+         readline thinks it finds before any application completion
+         function is called
+       - new variable, rl_completion_suppress_quote, settable by an
+         application-specific completion function.  If set to non-zero, the
+         completion code does not append a closing quote in append_to_match
+
+lib/readline/readline.h
+       - extern declarations for rl_completion_quote_character and
+         rl_completion_suppress_quote
+
+bashline.c
+       - set rl_completion_suppress_quote in command_subst_completion_function
+         because that would be inserted before any closing "`" or ")", which
+         is somewhat disconcerting
+
+lib/readline/doc/rltech.texi
+       - documented rl_completion_suppress_quote and
+         rl_completion_quote_character
+
+                                  10/13
+                                  -----
+bashhist.c
+       - use sv_histchars instead of setting history_comment_char directly in
+         bash_initialize_history so assignments to $histchars made in
+         ~/.bashrc are honored
+
+                                  10/21
+                                  -----
+trap.c
+       - make sure run_exit_trap sets `running_trap' appropriately
+       - new variable, trap_saved_exit_value, set to last_command_exit_value
+         before running any trap commands; available to the rest of the
+         shell; use trap_saved_exit_value to replace some function-local
+         variables
+
+builtins/exit.def
+       - if the shell is running the exit trap, and no argument is given
+         to `exit', use trap_saved_exit_value as the exit status instead
+         of the last command exit value (which could be the previous command
+         run in the exit trap), as required by POSIX.2
+
+                                  10/25
+                                  -----
+doc/{bash.1,bashref.texi}
+       - add `alias' to the list of documented `assignment statement' builtins
+
+                                  11/1
+                                  ----
+doc/bash.1
+       - remove the `.' from the sample $PATH value
+
+parse.y
+       - make sure parse_compound_assignment prompts with $PS2 if it reads
+         a newline while parsing the compound assignment statement. Bug
+         reported by Stephane Chazelas
+       - parse_string_to_word_list now takes a new second argument: `int flags'
+       - new parser state flag: PST_COMPASSIGN; indicates that the shell is
+         parsing a compound assignment statement
+       - parse_string_to_word_list turns on PST_COMPASSIGN if `flags' arg
+         has low bit set
+       - turn PST_COMPASSIGN on and off in parse_compound_assignment
+
+externs.h
+       - change prototype declaration for parse_string_to_word_list
+
+arrayfunc.c
+       - change call to parse_string_to_word_list to add new flags arg
+
+general.c
+       - assignment() takes a new `flags' second argument
+       - if `flags' is non-zero, accept `[' as a legal assignment statement
+         starter character (for parsing compound array assignments)
+
+general.h
+       - add new argument to prototype declaration for assignment()
+
+parse.y,{subst,variables}.c, builtins/{setattr,declare}.def
+       - change calls to assignment() (parse.y calls with flags == 1 when
+         parser_state inlcudes PST_COMPASSIGN)
+
+arrayfunc.c
+       - in assign_array_var_from_string(), don't treat an expanded word
+         of the form [ind]=value specially unless the W_ASSIGNMENT flag is
+         set.  This means that words that are the result of expansions but
+         happen to have the same format as compound assignment statement
+         words will not be treated as such.  For instance
+
+               v='[12]=foobar'
+               a=( $v )
+
+         will result in a[0]='[12]=foobar' instead of a[12]=foobar.  This
+         is closer to how `regular' assignment statements are treated and
+         compatible with ksh93.  Bug reported by Stephane Chazelas
+
+shell.c
+       - new --protected argument, disables command substitution when used
+         with --wordexp (like --wordexp, it remains undocumented)
+       - change run_wordexp to turn on the W_NOCOMSUB flag in each word
+         to be expanded if protected_mode is set
+
+                                  11/7
+                                  ----
+doc/{bash.1,bashref.texi}
+       - clarified the language concerning inherited signal dispositions and
+         when traps are run
+
+support/shobj-conf
+       - slight changes to the darwin (Mac OS X) stanza for MacOS X 10.3
+         (for the readline shared library builds, which shares this script)
+
+lib/readline/histexpand.c
+       - change to make `^' behave as equivalent to word one, as csh does,
+         and as the documentation states
+
+lib/readline/display.c
+       - in update_line, make sure to use col_lendiff in all calculations
+         where the cursor position is concerned (like when calculating
+         the value of _rl_last_c_pos).  Fixes bug reported by Andreas
+         Schwab
+
+                                  11/12
+                                  -----
+trap.c
+       - make _run_trap_internal catch `return' builtin longjmps and clean
+         up before longjmping on to where the return was intended to go
+         (fixes bug with not turning off SIG_INPROGRESS flag when `return'
+         executed in trap command)
+
+                                  11/18
+                                  -----
+builtins/cd.def
+       - in posix mode, set errno to ENOTDIR if canonicalization fails,
+         unless the canonicalization functions leave it set to ENOENT
+
+                                  11/25
+                                  -----
+make_cmd.c
+       - in make_simple_command, don't blindly dereference element.redirect
+
+parse.y
+       - the list_terminator production now has an `int' value so it can be
+         used in other grammar productions
+       - add a rule that makes `time' on a line by itself time a null
+         command (this is iffy)
+
+                                  11/28
+                                  -----
+subst.c
+       - change the pattern substitution code (${var//pat/rep}) to use the
+         same pattern expansion function (getpattern()) as the pattern
+         removal expansions.  This has the effect of no longer performing
+         quote removal on the pattern before trying to match it.  This
+         fixes an incompatibility with ksh93 reported on comp.unix.shell
+
+nojobs.c
+       - add replacement function for siginterrupt on the off chance that a
+         system has posix signals but lacks siginterrrupt
+
+lib/readline/display.c
+       - fix from Tim Waugh at Red Hat to speed up inserting characters into
+         long lines in a UTF-8 environment by optimizing the calculation of
+         the first difference between old and new lines by checking to see
+         whether the old line is a subset of the new
+
+                                  11/29
+                                  -----
+lib/malloc/stats.c
+       - break code that opens file (and interprets %p) into separate function
+         _imalloc_fopen(char *s, char *fn, char *def, char *defbuf, size_t defsiz)
+         for use by rest of library
+       - default stats file is now `stats.PID'
+
+lib/malloc/trace.c
+       - new function, malloc_set_tracefn (char *s, char *fn), sets tracing
+         to the file named by FN (with %p interpolated as the pid), using
+         some default if FN is NULL
+
+lib/malloc/shmalloc.h
+       - new extern declaration for malloc_set_tracefn
+
+                                  12/4
+                                  ----
+execute_cmd.c
+       - combined several common strings from do_piping() into one
+         dup_error() function
+
+builtins/common.[ch]
+       - new function, `sh_notbuiltin(s)' prints error message about s not
+         being a shell builtin
+
+builtins/{builtin,enable}.def
+       - call sh_notbuiltin instead of using literal string
+
+{arrayfunc,expr,error}.c
+       - use one string variable for `bad array subscript' error message; use
+         in calls to various error reporting functions
+
+Makefile.in
+       - add variables for localedir and the PACKAGE_* variables, auto-set
+         by configure
+
+configure.in
+       - un-cache values for gettext, textdomain, and bindtextdomain if they're
+         not in libc but in libintl so the right variables get set
+
+bashintl.h
+       - add necessary defines for marking strings to be translated using
+         gettext
+
+locale.c
+       - set textdomain and directory in set_default_locale
+       - don't call textdomain with the value of $TEXTDOMAIN, since we don't
+         want to override the default domain ("bash")
+       - don't call bindtextdomain unless default_domain already has a value
+       - when translating $"..." strings, use dgettext with the script's
+         default domain (value of $TEXTDOMAIN)
+
+                                  12/9
+                                  ----
+builtins/mkbuiltins.c
+       - include "bashintl.h" in the generated "builtins.c"
+
+support/{config.rpath,mkinstalldirs}
+       - new files to support gettext i18n
+
+ABOUT-NLS
+       - new readme file for gettext internationalization
+
+po/{Makefile.in.in,Rules-quot,boldquot.sed,en@boldquot.header,en@quot.header,insert-header.sin,quot.sed,remove-potcdate.sin}
+po/{POTFILES.in,bash.pot}
+       - new files for gettext
+
+lib/intl
+       - new directory, with libintl stuff from gettext
+
+aclocal.m4
+       - add m4 files from gettext distribution needed by libintl
+
+configure.in
+       - create po/Makefile.in and lib/intl/Makefile in AC_OUTPUT
+       - add call to AM_GNU_GETTEXT to initialize gettext stuff
+
+Makefile.in
+       - use mkinstalldirs instead of mkdirs in the `installdirs' target
+       - changes for intl/ and po/ subdirectories in build and install
+       - changes to have libintl linked in, as determined by configure
+       - changes to have libintl built, just in case it's used (though I'd
+         rather not)
+
+                                  12/10
+                                  -----
+config.h.in
+       - additional #defines required by the libintl library
+       - add ENABLE_NLS define for AM_GNU_GETTEXT
+       - take out defines for HAVE_{BINDTEXTDOMAIN,GETTEXT,TEXTDOMAIN}
+
+configure.in
+       - removed old tests for libintl and gettext/textdomain/bindtextdomain
+
+locale.c
+       - remove HAVE_GETTEXT code; we have gettext unconditionally now
+
+bashintl.h
+       - change to include "gettext.h" and remove the conditional code based
+         on whether or not gettext is present
+
+                                  12/16
+                                  -----
+lib/readline/vi_mode.c
+       - fix problem with rl_vi_eWord that caused it to skip over the last
+         character of a word if invoked while point was on the next-to-last
+         character
+
+                                  12/18
+                                  -----
+{arrayfunc,bashhist,bashline,error,eval,execute_cmd,expr,general,input,jobs}.c
+{mailcheck,make_cmd,nojobs,pcomplete,pcomplib,print_cmd,redir,shell,sig}.c
+{subst,test,trap,variables,version,xmalloc}.c
+parse.y
+builtins/{common,evalfile,getopt}.c
+builtins/{bind,break,caller,cd,complete,declare,enable,exec,exit,fc,fg_bg}.def
+builtins/{hash,help,history,jobs,kill,printf,pushd,read,return,set,setattr}.def
+builtins/{shift,shopt,source,suspend,type,ulimit,umask}.def
+lib/sh/{fmtulong,netopen}.c
+       - include "bashintl.h" for gettext defines
+
+Makefile.in
+       - add `-DBUILDTOOL' to CFLAGS for buildversion.o
+
+bashintl.h
+       - if `BUILDTOOL' is defined, define ENABLE_NLS to 0 so we don't have
+         to compile and link in the gettext stuff
+
+Makefile.in,lib/sh/Makefile.in,builtins/Makefile.in
+       - update dependencies on bashintl.h and include/gettext.h
+
+                                  12/19
+                                  -----
+{arrayfunc,bashhist,bashline,error,eval,execute_cmd,expr,general,input,jobs}.c
+{mailcheck,make_cmd,nojobs,pcomplete,pcomplib,print_cmd,redir,shell,sig}.c
+{subst,test,trap,variables,version,xmalloc}.c
+builtins/{common,evalfile,getopt}.c
+builtins/{bind,break,caller,cd,complete,declare,enable,exec,exit,fc,fg_bg}.def
+builtins/{hash,help,history,jobs,kill,let,printf,pushd,read,return,set}.def
+builtins/{setattr,shift,shopt,source,suspend,type,ulimit,umask}.def
+lib/sh/{fmtulong,netopen}.c
+lib/malloc/{malloc,stats,table,watch}.c
+       - mark up strings in source files for gettext processing
+
+lib/malloc/imalloc.h
+       - include "bashintl.h" if SHELL is defined, otherwise make _(x) an
+         identity define
+
+lib/malloc/Makefile.in
+       - add dependencies on ${topdir}/bashintl.h and ${BASHINCDIR}/gettext.h
+
+                                  12/21
+                                  -----
+bashline.c
+       - make sure we index into rl_line_buffer with indexes > 0 in
+         attempt_shell_completion
+
+                                  12/31
+                                  -----
+Makefile.in
+       - descend into `po' and run make recursively for the various clean
+         targets
+
+                                   1/4
+                                   ---
+include/shmbutil.h
+       - two new macros:  BACKUP_CHAR(str, strsize, i), which backs up one
+         multibyte character in STR starting at index I, and
+         BACKUP_CHAR_P(str, strsize, p), which backs up one multibyte
+         character in STR starting at P, which is a char *
+
+                                   1/6
+                                   ---
+pcomplete.c
+       - in pcomp_filename_completion_function, use the quote character
+         readline found (and assigned to rl_complete_quote_character) when
+         dequoting the filename by a completion call from readline (when
+         rl_dispatching != 0)
+
+bashline.c
+       - ditto for bash_directory_completion_matches
+
+                                   1/7
+                                   ---
+lib/readline/complete.c
+       - new variable,  rl_completion_found_quote, set to non-zero value if
+         readline finds what it thinks is quoting in the word to be completed
+
+lib/readline/readline.h
+       - extern declaration for rl_completion_found_quote
diff --git a/CWRU/OS-BUGS/att-yacc-bug b/CWRU/OS-BUGS/att-yacc-bug
new file mode 100644 (file)
index 0000000..4c1370b
--- /dev/null
@@ -0,0 +1,111 @@
+From chet@cwns1.INS.CWRU.Edu Sun Aug 26 17:46:14 1990
+Flags: 50
+Received: from cwns1.INS.CWRU.Edu by cwjcc.INS.CWRU.Edu with SMTP (5.61+ida+/CWRU-1.3-decnet)
+       id AA17813; Sun, 26 Aug 90 17:46:14 -0400 (from chet@cwns1.INS.CWRU.Edu for /usr/local/bin/m2mbox /usr/homes/chet/mbox)
+Received:  by cwns1.INS.CWRU.Edu (5.61+ida+/CWRU-1.3-client)
+       id AA00962; Sun, 26 Aug 90 17:46:31 -0400 (from chet for chet@cwjcc.INS.CWRU.Edu)
+Date: Sun, 26 Aug 90 17:01:56 -0400
+From: Chet Ramey <chet@cwns1.INS.CWRU.Edu>
+To: trent@jove.cs.pdx.edu
+Subject: Re: bash on triton
+Cc: chet@cwns1.INS.CWRU.Edu
+Reply-To: chet@po.CWRU.Edu
+In-Reply-To: Message from trent@jove.cs.pdx.edu of Fri, 24 Aug 90 16:07:19 PDT
+Message-Id: <9008262101.AA00902.SM@cwns1.INS.CWRU.Edu>
+Read-Receipt-To: chet@po.CWRU.Edu
+
+> Actually, it just that PSU gets the short end of the stick compared to
+> the other state universities because we don't have a division I
+> football team (no :-).
+
+Yeah, but didn't you guys produce Neil Lomax (lo these many years ago)?  What
+have the other schools given the NFL lately?
+
+> First thing I noticed is that this alias fails:
+>      alias  .root=/usr/local/.root
+> The error is:
+>      alias: .root: not a valid shell identifier
+
+This is correct according to Posix 1003.2a draft 5.  An alias must obey this
+pseudo-regexp:
+       [a-zA-Z_][a-zA-Z0-9_]*
+
+(That is, only letters, digits, and underscores, and it may not begin with an
+underscore).  This is in the latest version of the manual page, the one in
+the documentation directory.
+
+> Also it crashes when PROMPT_COMMAND is set, thus:
+>      bash$ PROMPT_COMMAND="A=`pwd`"
+>      bash$                           # just hit return
+>      bash: free: Called with already freed block argument
+
+I am sorting through this problem right now, and I've discovered a few things
+(none complimentary to Sun).
+
+First of all, this crash happens because Sun's programmers are lazy.  The Sun
+malloc allows you to free things multiple times, instead of doing the old
+
+       if (x)
+               free(x);
+       x = NULL;
+
+trick.  The Gnu malloc disallows that.
+
+The root of this set of problems is that the Sun yyparse() is not reentrant
+(`impure').  First of all, /usr/lib/yaccpar has changed a number of things
+to be dynamically allocated that were once static arrays (the state stack
+and the value stack are the two major ones).  Second, some things that used
+to be automatic variables to yyparse (like the state stack) are now
+globally static variables in /usr/lib/yaccpar.  This means no more
+indirectly recursive calls to yyparse().  This is pure bogusness, and
+breaks backwards compatibility in a major way. 
+
+The first indirect call to yyparse() occurs when PROMPT_COMMAND is run
+through parse_and_execute() (parse.y, around line 1200).  The next call to
+yyparse() in your example (hitting return) returns quickly, putting nothing
+onto the state stack.  Of course, YYACCEPT doesn't check whether anything
+was put into the stack; it just goes ahead and frees it anyway. 
+
+The next problem arises when PROMPT_COMMAND contains a backquoted command,
+which is run through parse_and_execute() again.  It doesn't matter that
+this parse_and_execute is in a subshell; the data structures being built by
+Sun's yacc come along for free when bash forks.  The state stack gets all
+screwed up and a segmentation fault is the inevitable result.  If Sun (and,
+I assume, AT&T, since the SCCS line at the top of /usr/lib/yaccpar
+indicates that it is derived from S5R3.1) wants to do this kind of shit,
+they should at least provide a convenience function to clear out the state
+stack. 
+
+Both of these problems are avoided by using bison.  I have put bison on
+triton (you'll have to redo it if you want it; it looks for the parser
+skeletons in /home/chet/lib), and a bash compiled with a bison-generated
+parser does not crash given the above setting of PROMPT_COMMAND.  That bash
+is in /home/chet/bin.  I don't know how to solve these problems in a
+simple way by using the Sun yacc.
+
+`Byacc' (Berkeley Yacc), the 4.4 BSD rewrite of Yacc by Bob Corbett (who
+wrote the original version of bison), should also be OK, though I haven't
+looked at it.
+
+> That brings up something else:  Triton is set up as a mail-less
+> machine (all mail is forwarded elsewhere).  Do you want your mail
+> forwarded to CWSU??  Right now the bug reports Bash generates are
+> vanishing.  (I don't touch sendmail, and, from what I'm told, I'm
+> better off that way :-)
+
+(It's CWRU, by the way.)
+
+Don't worry, I get them all.  Look at the end of shell.c (make_bug_report)
+where it opens a pipe to `/bin/rmail chet@ins.cwru.edu'.
+
+Let me know of any more problems you encounter.
+
+Chet
+
+
+--
+Chet Ramey                             ``Levi Stubbs' tears run down
+Network Services Group                   his face...''
+Case Western Reserve University        
+chet@ins.CWRU.Edu              
+
diff --git a/CWRU/OS-BUGS/bsd-rshd-bug b/CWRU/OS-BUGS/bsd-rshd-bug
new file mode 100644 (file)
index 0000000..54712d4
--- /dev/null
@@ -0,0 +1,46 @@
+From chet@odin.INS.CWRU.Edu Sat Apr 27 19:54:13 1991
+Flags: 50
+Received: from odin.INS.CWRU.Edu by usenet.INS.CWRU.Edu with SMTP (5.65b+ida+/CWRU-1.5-UUCPGW)
+       id AA05700; Sat, 27 Apr 91 19:54:13 -0400 (from chet@odin.INS.CWRU.Edu for /usr/local/bin/m2mbox /usr/homes/chet/mbox)
+Received:  by odin.INS.CWRU.Edu (5.65b+ida+/CWRU-1.4-ins)
+       id AA17732; Sat, 27 Apr 91 19:54:06 -0400 (from chet for chet@usenet.INS.CWRU.Edu)
+Date: Sat, 27 Apr 91 19:31:16 -0400
+From: Chet Ramey <chet@odin.INS.CWRU.Edu>
+To: bfox@ai.mit.edu
+Subject: Re: [pedz@aixwiz.austin.ibm.com: fd 9 left open bug]
+Cc: chet@odin.INS.CWRU.Edu, pedz@aixwiz.austin.ibm.com
+Reply-To: chet@po.CWRU.Edu
+In-Reply-To: Message from bfox@bears.ece.ucsb.edu of Wed, 24 Apr 91 12:49:33 PDT
+Message-Id: <9104272331.AA17706.SM@odin.INS.CWRU.Edu>
+Read-Receipt-To: chet@po.CWRU.Edu
+
+> Below is something I call Xemacs which goes across the net, sets up the
+> display variable and then kicks off emacs in such a way that rshd
+> terminates.  The trick is that the shell must die and all file
+> descriptors going back to rshd must be closed.  The same basic script
+> works with csh but I had to add in the "9>&-" part at the end to make
+> it work with bash.   This is because somehow, file descriptor 9 is left
+> open and I guess it must be a dup of stdin, stdout, or stderr.
+
+This is a bug alright, but it's a bug with rshd that's not fixed until
+4.3-reno.
+
+rshd sets up a pipe (int pv[2]; if you have the source to the tahoe rshd)
+to the process it executes and uses it to manage error and control output
+from over the net.  In the child process, it does a dup2(pv[1], 2), but
+never calls close(pv[1]).  Adding that code to the 4.3-tahoe rshd makes it
+(and the Xemacs script) work right.
+
+I don't know how to solve this cleanly in bash.  Doing a blanket close of
+all open file descriptors < 2, < 20 is a no-no, especially when we're not
+interactive.  csh `works' because it does the blanket close on startup, but
+csh can get away with doing that because it doesn't let you manipulate
+arbitrary file descriptors.
+
+Chet
+
+--
+Chet Ramey                       Internet: chet@po.CWRU.Edu
+Case Western Reserve University          NeXT Mail: chet@macbeth.INS.CWRU.Edu
+
+``Now,  somehow we've brought our sins back physically -- and they're pissed.''
diff --git a/CWRU/OS-BUGS/bsd-tty-driver b/CWRU/OS-BUGS/bsd-tty-driver
new file mode 100644 (file)
index 0000000..2083e7c
--- /dev/null
@@ -0,0 +1,38 @@
+From chet Thu Aug 13 10:42:35 1992
+Flags: 50
+Received:  by odin.INS.CWRU.Edu (5.65b+ida+/CWRU-1.5-ins)
+       id AA07004; Thu, 13 Aug 92 10:42:35 -0400 (from chet for /usr/homes/chet/bin/mailfilter.sh /usr/homes/chet/mbox)
+Date: Thu, 13 Aug 1992 10:34:47 -0400
+From: Chet Ramey <chet@odin.INS.CWRU.Edu>
+To: przemek@rrdstrad.nist.gov
+Subject: Re: output of background jobs in BASH
+Cc: bug-bash@prep.ai.mit.edu, chet
+Reply-To: chet@po.CWRU.Edu
+In-Reply-To: Message from przemek@rrdstrad.nist.gov of 12 Aug 92 18:15:53 GMT
+Message-Id: <9208131434.AA00639.SM@odin.INS.CWRU.Edu>
+Read-Receipt-To: chet@po.CWRU.Edu
+
+> I believe that this changed when I installed bash 1.12: when I put a job that
+> prints on stdout in background (^Z/bg or directly by &), the output comes out
+> staggered, as if the CR wasn't being added to the LF at the end of the lines.
+
+This is a result of bash using the BSD-style tty driver on Ultrix.  The BSD
+driver ties input and output carriage return translation together with the
+CRMOD bit.  (The CRMOD bit causes CR->LF translation on input and LF->CRLF
+translation on output.)  Unless the CRMOD bit is cleared, it is impossible
+to get a literal ^M in an input line.  Unfortunately, one of the effects of
+clearing it is the loss of output processing you've observed. 
+
+The Ultrix Posix-style tty driver can't be used because it has serious
+problems with losing typeahead when ICANON is switched on and off.  These
+characters seem to reappear later without warning, usually when a
+program that uses the BSD-style ioctls turns on CBREAK (e.g., `more').
+
+Chet
+
+--
+``The use of history as therapy means the corruption of history as history.''
+       -- Arthur Schlesinger
+
+Chet Ramey, Case Western Reserve University    Internet: chet@po.CWRU.Edu
+
diff --git a/CWRU/OS-BUGS/hpux-ulimit-bug b/CWRU/OS-BUGS/hpux-ulimit-bug
new file mode 100644 (file)
index 0000000..7c9a341
--- /dev/null
@@ -0,0 +1,3 @@
+The HP/UX manual page for ulimit(2) reports that ulimit(1, 0L) will return 
+the maximum file size in terms of 512-byte blocks.  It lies, at least on
+HP/UX 6.5; the number of bytes is returned.
diff --git a/CWRU/OS-BUGS/isc-posix-bug b/CWRU/OS-BUGS/isc-posix-bug
new file mode 100644 (file)
index 0000000..5acf416
--- /dev/null
@@ -0,0 +1,137 @@
+Article 7946 of comp.unix.sysv386:
+Newsgroups: comp.unix.sysv386
+Path: usenet.ins.cwru.edu!agate!stanford.edu!snorkelwacker.mit.edu!think.com!zaphod.mps.ohio-state.edu!rpi!batcomputer!cornell!rochester!lubkin
+From: lubkin@cs.rochester.edu (Saul Lubkin)
+Subject: Binary patch to os.o fixes POSIX panics using VP/ix with job controlled bash
+Message-ID: <1991Apr30.034006.24056@cs.rochester.edu>
+Organization: Computer Science Department University of Rochester
+Date: Tue, 30 Apr 1991 03:40:06 GMT
+
+
+Recently, Uwe Doering posted the following article:
+
+       Article 6891 of comp.unix.sysv386:
+       Path: nancy!uunet!math.fu-berlin.de!fub!geminix.in-berlin.de!gemini
+       From: gemini@geminix.in-berlin.de (Uwe Doering)
+       Newsgroups: comp.unix.sysv386
+       Subject: Re: NAMEI panic - trap "E", address and info follows (+ patch)
+       Message-ID: <KYXPX2E@geminix.in-berlin.de>
+       Date: 13 Apr 91 00:55:41 GMT
+       References: <1991Apr10.040146.645@ddsw1.MCS.COM>
+       Organization: Private UNIX Site
+       Lines: 92
+
+       karl@ddsw1.MCS.COM (Karl Denninger) writes:
+
+       >Is anyone else having problems with a "namei" panic in ISC 2.2 (with NFS,
+       >the NFS/lockd patches, and POSIX patches applied)?
+       >
+       >I have been getting these nearly daily.  Trap type "E", address is d007962f.
+       >That's right near the end of "namei"; here's the relavent line from a "nm"
+       >on the kernel:
+       >
+       >namei               |0xd007919c|extern|       *struct( )|0x0608|     |.text
+       >
+       >Needless to say, I am most displeased with the crashes!
+       >
+       >Near as I can determine, the hardware is fine.  
+       >
+       >All pointers or ideas appreciated...
+
+       I found this bug a few days ago and was about to send a bug report
+       to ISC. The problem is "simply" a NULL pointer reference in the
+       namei() function. The machine I found this on runs ISC 2.21 with
+       the security fix installed. I fixed this bug with a binary patch. It
+       is for the module /etc/conf/pack.d/kernel/os.o. I disassembled the
+       original and then the fixed version of os.o and ran a context diff
+       over the output. Depending on what version of the kernel config kit
+       you have the addresses might be off some bytes. You can apply this
+       patch with every binary file editor.
+
+       ***************
+       *** 35349,35364 ****
+                             [%al,%al]
+               cf71:  74 1e                  je     0x1e <cf91>
+                             [0xcf91]
+       !       cf73:  0f b7 07               movzwl (%edi),%eax
+                             [%edi,%eax]
+       !       cf76:  3d 11 00 00 00         cmpl   $0x11,%eax
+                             [$0x11,%eax]
+       !       cf7b:  74 14                  je     0x14 <cf91>
+                             [0xcf91]
+       !       cf7d:  c7 45 e8 00 00 00 00   movl   $0x0,0xe8(%ebp)
+       !                     [$0x0,-24+%ebp]
+       !       cf84:  eb 19                  jmp    0x19 <cf9f>
+       !                     [0xcf9f]
+               cf86:  90                     nop    
+                             []
+               cf87:  90                     nop    
+       --- 35349,35372 ----
+                             [%al,%al]
+               cf71:  74 1e                  je     0x1e <cf91>
+                             [0xcf91]
+       !       cf73:  85 ff                  testl  %edi,%edi
+       !                     [%edi,%edi]
+       !       cf75:  74 1a                  je     0x1a <cf91>
+       !                     [0xcf91]
+       !       cf77:  0f b7 07               movzwl (%edi),%eax
+                             [%edi,%eax]
+       !       cf7a:  3d 11 00 00 00         cmpl   $0x11,%eax
+                             [$0x11,%eax]
+       !       cf7f:  74 10                  je     0x10 <cf91>
+                             [0xcf91]
+       !       cf81:  eb 15                  jmp    0x15 <cf98>
+       !                     [0xcf98]
+       !       cf83:  90                     nop    
+       !                     []
+       !       cf84:  90                     nop    
+       !                     []
+       !       cf85:  90                     nop    
+       !                     []
+               cf86:  90                     nop    
+                             []
+               cf87:  90                     nop    
+
+       I'm not absolutely sure whether the action that is now taken in case of
+       a NULL pointer is the right one, but I haven't noticed any problems,
+       and most important, there are no more kernel panics! At least not from
+       that spot. :-) The action that is taken if the pointer in _not_ NULL
+       hasn't changed (this is not very obvious from the patch, but look
+       in the disassembler listing of your own kernel for more details).
+       I use this modified kernel for over a week now and it works for
+       me. Of course, as always, I can't give you any guaranty that this
+       patch does something useful on your machine. :-)
+
+       Hope this helps you.
+
+            Uwe
+
+       PS: ISC, if you see this posting, could you drop me a note on whether
+       you have put this on your to-do list? This would save me the time
+       needed to file an official bug report.
+       -- 
+       Uwe Doering  |  INET : gemini@geminix.in-berlin.de
+       Berlin       |----------------------------------------------------------------
+       Germany      |  UUCP : ...!unido!fub!geminix.in-berlin.de!gemini
+       =======================================================================
+
+
+Here is a copy of my recent note to Uwe:
+
+
+       I've applied the binary patch that you recently poosted to comp.unix.sysv386
+       for os.o.
+
+       It works beautifully.  Previously, I had compiled bash1.07CWRU, and it worked
+       well (using POSIX job control), job control and all -- but running VP/ix under
+       this bash caused a system panic.  This evidently is the (now infamous) "POSIX
+       namei bug".  After rebuilding the kernel with a patched os.o, the problem
+       simply disappeared.  VP/ix, like everything else, now works fine under
+       bash1.07CWRU.
+
+
+                               Yours sincerely,
+
+                               Saul Lubkin
+
+
diff --git a/CWRU/OS-BUGS/next-rlogind-bug b/CWRU/OS-BUGS/next-rlogind-bug
new file mode 100644 (file)
index 0000000..09d0c31
--- /dev/null
@@ -0,0 +1,63 @@
+From chet@odin.INS.CWRU.Edu Thu Mar  7 19:16:25 1991
+Flags: 50
+Received: from odin.INS.CWRU.Edu by usenet.INS.CWRU.Edu with SMTP (5.61+ida+/CWRU-1.4-UUCPGW)
+       id AA00967; Thu, 7 Mar 91 19:16:25 -0500 (from chet@odin.INS.CWRU.Edu for /usr/local/bin/m2mbox /usr/homes/chet/mbox)
+Received:  by odin.INS.CWRU.Edu (5.65+ida+/CWRU-1.4-ins)
+       id AA04437; Thu, 7 Mar 91 19:15:31 -0500 (from chet for chet@usenet.INS.CWRU.Edu)
+Date: Thu, 7 Mar 91 19:10:00 -0500
+From: Chet Ramey <chet@odin.INS.CWRU.Edu>
+To: jacob@blackbox.gore.com
+Subject: Re: Library function redefinition
+Cc: chet@odin.INS.CWRU.Edu, bfox@ai.mit.edu
+Reply-To: chet@po.CWRU.Edu
+In-Reply-To: Message from jacob@blackbox.gore.com of Sun, 3 Mar 91 19:18:54 MST
+Message-Id: <9103080010.AA04427.SM@odin.INS.CWRU.Edu>
+Read-Receipt-To: chet@po.CWRU.Edu
+
+> Now that you're working on bash for NeXT, let me ask you if you've run into
+> this bug under 2.0: bash, as a login shell, hangs on rlogin into the NeXT.
+> But it works fine on telnet.  On rlogin, I even get no output to stdout
+> from the 'tset' (or debugging 'echo's) in my startup files.
+
+It's getting stuck in initialize_jobs ().  There is a bug in the NeXT 
+/usr/etc/rlogind that causes bash to be started with the terminal still
+belonging to the rlogind process, and its process group set to 0 (so
+that getpgrp() returns 0 (!)).  It looks like there's a stray setpgrp(0, 0)
+in the rlogind code that NeXT is not handling like 4.3 BSD.
+
+(Another bug that I've found with NeXT 2.0 is that Terminal starts up the
+shell underneath it with argc == 0 and argv[0] = "-".  Not polite.
+`mount -vat nfs' seems to be broken too.  Any more good ones I should look
+for?)
+
+Here's a diff to jobs.c to work around it.  Your line numbers will certainly
+vary (for all I know, the code might, too).
+
+Chet
+
+*** jobs.c~    Tue Mar  5 17:41:00 1991
+--- jobs.c     Thu Mar  7 18:50:12 1991
+***************
+*** 1839,1842 ****
+--- 1839,1852 ----
+        }
+  
++ #if defined (NeXT)
++       /* This is to compensate for a bug in the NeXT 2.0 /usr/etc/rlogind. */
++       if (shell_pgrp == 0)
++      {
++        shell_pgrp = getpid ();
++        setpgid (0, shell_pgrp);
++        tcsetpgrp (shell_tty, shell_pgrp);
++      }
++ #endif /* NeXT */
++ 
+        while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1)
+       {
+
+--
+Chet Ramey                             ``Now, somehow we've brought our sins
+Network Services Group                   back physically -- and they're
+Case Western Reserve University                  pissed.''
+chet@ins.CWRU.Edu              My opinions are just those, and mine alone.
+
diff --git a/CWRU/OS-BUGS/sco-3.2.4-bug b/CWRU/OS-BUGS/sco-3.2.4-bug
new file mode 100644 (file)
index 0000000..7378d3c
--- /dev/null
@@ -0,0 +1,57 @@
+From gnulists@ai.mit.edu Mon Feb 22 20:41:24 1993
+Flags: 50
+Received: from po.CWRU.Edu by odin.INS.CWRU.Edu with SMTP (5.65b+ida+/CWRU-1.5.4-ins)
+       id AA17713; Mon, 22 Feb 93 20:41:24 -0500 (from gnulists@ai.mit.edu for /usr/homes/chet/bin/mailfilter.sh /usr/homes/chet/mbox)
+Return-Path: <gnulists@ai.mit.edu>
+Received: from life.ai.mit.edu by po.CWRU.Edu with SMTP (5.65b+ida+/CWRU-1.9)
+       id AA29616; Mon, 22 Feb 93 20:41:17 -0500 (from gnulists@ai.mit.edu for chet@odin.INS.CWRU.Edu)
+Received: from raisin-nut (raisin-nut.ai.mit.edu) by life.ai.mit.edu (4.1/AI-4.10) id AA01858; Mon, 22 Feb 93 20:40:47 EST
+Received: by raisin-nut (4.1/AI-4.10) id AA06708; Mon, 22 Feb 93 20:40:46 EST
+Resent-Date: Mon, 22 Feb 1993 13:29:57 -0500
+Resent-Message-Id: <9302230140.AA06708@raisin-nut>
+Received: from odin.INS.CWRU.Edu by life.ai.mit.edu (4.1/AI-4.10) id AA19283; Mon, 22 Feb 93 13:36:48 EST
+Received:  by odin.INS.CWRU.Edu (5.65b+ida+/CWRU-1.5.4-ins)
+       id AA27765; Mon, 22 Feb 93 13:36:44 -0500 (from chet for bug-bash@prep.ai.mit.edu)
+Date: Mon, 22 Feb 1993 13:29:57 -0500
+From: Chet Ramey <chet@odin.ins.cwru.edu>
+Sender: gnulists@ai.mit.edu
+To: pat@bcserv.wustl.edu
+Subject: Re: bash for SCO Unix 3.2.2/4
+Cc: bug-bash@prep.ai.mit.edu, chet@odin.ins.cwru.edu
+Reply-To: chet@po.cwru.edu
+In-Reply-To: Message from pat@bcserv.wustl.edu of 22 Feb 93 06:23:34 GMT (id <pat.730362214@bcserv>)
+Message-Id: <9302221829.AA27553.SM@odin.INS.CWRU.Edu>
+Read-Receipt-To: chet@po.CWRU.Edu
+Mime-Version: 1.0
+Content-Type: text/plain; charset=us-ascii
+Resent-From: bug-bash-request@prep.ai.mit.edu
+
+> I've had no luck making either bash-1.11 or bash-1.12 for 
+> SCO Unix v 3.2.2 or 3.2.4...
+> 
+> bash-1.12 says (specifically) that it's making for 3.2.2, but
+> still has problems.
+> 
+> It locks up after a few commnds...
+> 
+> I don't have GCC right now, so I did have to tell it that I don't
+> have 'alloca' by undefining it in machines.h - if that could be a problem.
+
+You can't run bash-1.12 on a 3.2.4 system if it's been compiled on a
+3.2.2 system.  Bash contains a fix for the broken sigsuspend in 3.2.2
+that breaks bash on 3.2.4, because 3.2.4 has the bug fixed.
+
+Bash 1.12 should build and run OK out of the box on 3.2.2.  For 3.2.4
+you need to locate the code at around line 1250 of jobs.c and change
+#if !defined (SCO) to #if 1 so that sigsuspend is used.  Then take out
+the SCO defines in flush_child().
+
+Chet
+
+--
+``The use of history as therapy means the corruption of history as history.''
+       -- Arthur Schlesinger
+
+Chet Ramey, Case Western Reserve University    Internet: chet@po.CWRU.Edu
+
+
diff --git a/CWRU/OS-BUGS/sequent-fcntl-dup2-bug b/CWRU/OS-BUGS/sequent-fcntl-dup2-bug
new file mode 100644 (file)
index 0000000..7676d49
--- /dev/null
@@ -0,0 +1,28 @@
+From chet@odin.INS.CWRU.Edu Fri May  3 17:22:41 1991
+Flags: 50
+Received: from odin.INS.CWRU.Edu by usenet.INS.CWRU.Edu with SMTP (5.65b+ida+/CWRU-1.5-UUCPGW)
+       id AA22515; Fri, 3 May 91 17:22:41 -0400 (from chet@odin.INS.CWRU.Edu for /usr/local/bin/m2mbox /usr/homes/chet/mbox)
+Received:  by odin.INS.CWRU.Edu (5.65b+ida+/CWRU-1.4-ins)
+       id AA07171; Fri, 3 May 91 17:22:21 -0400 (from chet for chet@usenet.INS.CWRU.Edu)
+Date: Fri, 3 May 91 17:18:03 -0400
+From: Chet Ramey <chet@odin.INS.CWRU.Edu>
+To: jp@lysator.liu.se
+Subject: fixed sequent bug
+Cc: chet@odin.INS.CWRU.Edu
+Reply-To: chet@po.CWRU.Edu
+Message-Id: <9105032118.AA07167.SM@odin.INS.CWRU.Edu>
+Read-Receipt-To: chet@po.CWRU.Edu
+
+
+I fixed it.  Sequent's fcntl and dup2 are both messed up.  They do not set
+the new descriptor to be open-on-exec.  For dup2 it's OK; that's the way
+4.2 BSD did it.  fcntl doing it is a bug, and a bad one.
+
+Chet
+
+--
+Chet Ramey                       Internet: chet@po.CWRU.Edu
+Case Western Reserve University          NeXT Mail: chet@macbeth.INS.CWRU.Edu
+
+``Now,  somehow we've brought our sins back physically -- and they're pissed.''
+
diff --git a/CWRU/OS-BUGS/sun-yp-bug b/CWRU/OS-BUGS/sun-yp-bug
new file mode 100644 (file)
index 0000000..5b84ec0
--- /dev/null
@@ -0,0 +1,52 @@
+From chet Mon Jul 27 14:54:45 1992
+Flags: 50
+Received:  by odin.INS.CWRU.Edu (5.65b+ida+/CWRU-1.5-ins)
+       id AA15494; Mon, 27 Jul 92 14:54:45 -0400 (from chet for /usr/homes/chet/bin/mailfilter.sh /usr/homes/chet/mbox)
+Date: Mon, 27 Jul 1992 14:29:55 -0400
+From: Chet Ramey <chet@odin.INS.CWRU.Edu>
+To: stud7b43@x400gate.bnr.ca
+Subject: Re: Bug in Bash 1.12.1
+Cc: bug-bash@ai.mit.edu, chet
+Reply-To: chet@po.CWRU.Edu
+In-Reply-To: Message from stud7b43@x400gate.bnr.ca of Mon, 27 Jul 1992 12:30:00 +0000
+Message-Id: <9207271829.AA14484.SM@odin.INS.CWRU.Edu>
+Read-Receipt-To: chet@po.CWRU.Edu
+
+> I seem to have found a bug in Bash.
+> 
+> How to cause the bug to appear:
+> 1) Start a long username-completion, e.g.
+>       cat ~user<TAB>
+>    Let it run for a while (don't know exactly how long...)
+>    Before it's finished, hit ^C (or whatever the break character
+>    is set to)
+> 2) As the next command, run a filename completion with a username in it, eg.
+>       cat ~username/.log<TAB>
+> 
+> Error message:  "free: Called with already freed block argument
+
+This is a bug in the Sun YP code that everyone seems to have picked up.
+
+Sun keeps static state in the YP library code -- 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 Gnu 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 probably stop it by adding
+an #undef USE_GNU_MALLOC to the appropriate machine description in machines.h.
+
+Chet
+
+--
+``The use of history as therapy means the corruption of history as history.''
+       -- Arthur Schlesinger
+
+Chet Ramey, Case Western Reserve University    Internet: chet@po.CWRU.Edu
+
diff --git a/CWRU/OS-BUGS/ultrix-bugs b/CWRU/OS-BUGS/ultrix-bugs
new file mode 100644 (file)
index 0000000..f9fb82c
--- /dev/null
@@ -0,0 +1,74 @@
+From chet@odin.INS.CWRU.Edu Fri Dec 21 10:56:27 1990
+Flags: 50
+Received: from odin.INS.CWRU.Edu by usenet.INS.CWRU.Edu with SMTP (5.61+ida+/CWRU-1.3-UUCPGW)
+       id AA27089; Fri, 21 Dec 90 10:56:27 -0500 (from chet@odin.INS.CWRU.Edu for /usr/local/bin/m2mbox.test /usr/homes/chet/mbox)
+Received:  by odin.INS.CWRU.Edu (5.61+ida+/CWRU-1.4-ins)
+       id AA17558; Fri, 21 Dec 90 10:56:18 -0500 (from chet for chet@usenet.INS.CWRU.Edu)
+Date: Fri, 21 Dec 90 10:36:58 -0500
+From: Chet Ramey <chet@odin.ins.cwru.edu>
+To: dbrooks@osf.org
+Subject: Re: bash and OSF/1
+Cc: chet@odin.INS.CWRU.Edu
+Reply-To: chet@po.CWRU.Edu
+In-Reply-To: Message from dbrooks@osf.org of Fri, 21 Dec 90 10:28:26 EST
+Message-Id: <9012211536.AA17531.SM@odin.ins.cwru.edu>
+Read-Receipt-To: chet@po.CWRU.Edu
+
+> Michael Meissner has been suddenly asked to do Real Work (TM) so it's
+> unlikely he'll get to do anything with OSF/1 until the new year.  We
+> talked about it, however, and there are a few issues.
+
+Not (gasp) Real Work!
+
+> The upshot of the above is: expect a block of #defines based on
+> __OSF1__, and expect it possibly not to work under all
+> implementations.
+
+Works for me.
+
+> I have two new bugs for you in 1.06.
+> 
+> - Typeahead is very weird.  Often, I will be in a state where a
+>   command is busy, and I type a new one.  The shell prompts and
+>   nothing happens; I have to type the line again.  Later, if I enter
+>   an interactive command (such as "mail") the missing keystrokes get
+>   delivered to it instead.  This is on a pmax, Ultrix 3.1, with some
+>   patches of my own and Michael's fignore patch (that may have caused
+>   it; I haven't investigated yet.  Just wanted to see if this rang a bell.)
+
+Typeahead under Ultrix is wierd.  This doesn't happen anywhere else.  Here's
+what it does for me:
+
+cwjcc$ sleep 4
+echo hi ; echo hi              <----- typeahead while sleeping
+cwjcc$                         <----- nothing comes out
+cwjcc$ more readline.c
+readline.c: No such file or directory
+cwjcc$ echo hi ; echo hi       <----- now it does...
+hi
+hi
+
+I'll look at it today.
+
+> - The sequence
+>      echo foo > /dev/tty
+>      cat bar
+>   produces:
+>      cat: write error: Bad file number
+
+This only happens under Ultrix, too.  It's another consequence of Dec's
+dup2 fuckup (I am *really*pissed*off* about it; it's caused me to waste a
+lot of time already).  File descriptor 1 is getting set to close-on-exec. 
+I haven't decided whether to hack around it in the code or to just make
+Ultrix use the dup2 emulation in general.c.
+
+Cheers,
+
+Chet
+
+--
+Chet Ramey                             ``I die, Horatio''
+Network Services Group, Case Western Reserve University
+chet@ins.CWRU.Edu
+                My opinions are just those, and mine alone.
+
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.
deleted file mode 100644 (file)
index 5488776b9c9cabdd6db0285100c63384cb2951f9..0000000000000000000000000000000000000000
+++ /dev/null
-                                4/9/2001
-                                --------
-[bash-2.05 released]
-
-                                  4/10
-                                  ----
-redir.c
-       - check return value of fclose() in write_here_document() for error
-         returns; don't just rely on fwrite() failing
-
-support/bashbug.sh
-       - set TMPDIR to /tmp if it's null or unset
-       - use $TMPDIR in the TEMP tempfile name template
-       - fixed the call to `mktemp', if it exists, to make it more portable
-
-jobs.c
-       - if WCONTINUED is not defined, define it to 0 and add a define for
-         WIFCONTINUED(wstatus) which expands to 0
-       - add WCONTINUED to the flags passed to waitpid(2) in waitchld()
-       - don't increment children_exited if waitpid's status is WIFCONTINUED,
-         since we don't want to call a SIGCHLD trap handler in this case
-       - in waitchld(), we set child->running to 1 if WIFCONTINUED(status)
-         is non-zero
-       - make sure pretty_print_job doesn't check for the core dump bit if
-         the process has been continued; it's only valid if the job is dead
-       - in set_job_status_and_cleanup, set the job to JRUNNING if job_state
-         is non-zero and the job was previously marked as JSTOPPED
-
-configure.in
-       - add -DBROKEN_DIRENT_D_INO to interix LOCAL_CFLAGS
-
-lib/glob/glob.c
-       - if BROKEN_DIRENT_D_INO is defined, define REAL_DIR_ENTRY to 1
-
-jobs.c
-       - in kill_pid, we only need to block and unblock SIGCHLD if the
-         `group' argument is non-zero, since otherwise we just call `kill'
-         on the pid argument
-
-version.c
-       - update copyright date to 2001
-
-bashline.c
-       - prog_complete_return needs to take a `const char *' as its first
-         argument
-       - history_completion_generator needs to take a `const char *' as
-         its first argument, and `text' needs to be a `const char *'
-
-                                  4/11
-                                  ----
-redir.c
-       - fixed a weird typo in redir_special_open, case RF_DEVFD, added
-         call to all_digits before call to legal_number
-       - fixed do_redirection_internal to call legal_number instead of atol(3)
-         when translating r_duplicating_{in,out}put_word, so it handles
-         overflow better
-       - produce an error message in redirection_error for out-of-range
-         file descriptors
-       - change allocation strategy in redirection_error so we don't have to
-         malloc scratch memory if redirection_expand() fails
-
-jobs.h
-       - added defines for `running' member of a struct process
-
-general.c
-       - fix legal_number to return 0 when strtol(3) reports overflow or
-         underflow
-
-parse.y
-       - changed read_token_word to call legal_number instead of atoi(3)
-
-input.c
-       - return -1/EBADF from close_buffered_fd if fd is < 0
-
-command.h
-       - fixed bogus comment about IS_DESCRIPTOR in description of the
-         REDIRECTEE struct
-
-print_cmd.c
-       - change cprintf's 'd' modifier code to display negative numbers as
-         an out-of-range value.  We can do this only because the only use
-         of %d is to output file descriptor numbers in redirections
-
-support/mksignames.c
-       - need to include config.h to get a possible value for
-         UNUSABLE_RT_SIGNALS
-
-                                  4/16
-                                  ----
-lib/readline/doc/rluser.texinfo
-       - corrected a small error in one description of M-DEL
-
-                                  4/17
-                                  ----
-stringlib.c
-       - need to initialize `ind' before calls to RESIZE_MALLOCED_BUFFER
-         in strcreplace()
-
-support/bashversion.c
-       - new file, prints bash version information
-
-Makefile.in
-       - rules for building bashversion and linking it to version.o
-
-                                  4/24
-                                  ----
-conftypes.h
-       - new file with HOSTTYPE, OSTYPE, MACHTYPE, etc. defines from
-         variables.h
-
-variables.h, version.c
-       - include conftypes.h
-
-patchlevel.h
-       - new file, contains define for PATCHLEVEL.  Doing away with the old
-         scheme of having the information in configure.in
-
-version.c
-       - include patchlevel.h
-
-Makefile.in
-       - run bashversion -p to find patch level rather than have configure
-         substitute in a value
-       - pass -S ${top_srcdir} to support/mkversion.sh
-
-support/mkversion.sh
-       - don't put PATCHLEVEL define into version.h, but accept and ignore
-         a -p option
-       - take a new -S srcdir option
-       - find the patch level by parsing it out of patchlevel.h
-
-configure.in
-       - hard-code BASHVERS assignment instead of reading it from a file
-       - remove BASHPATCH; don't substitute it
-
-_distribution,_patchlevel
-       - removed
-
-                                  4/26
-                                  ----
-shell.c
-       - call init_noninteractive() in open_shell_script if forced_interactive
-         is non-zero (the shell was started with -i) and fd_is_tty is 0
-         (the script file is a real file, not something like /dev/stdin),
-         since it wasn't done earlier
-
-builtins/printf.def
-       - change for POSIX.2 compliance when conversion errors are encountered
-         when processing %d, %u, and floating point conversion operators
-         (print a warning message, return the value accumulated at the time
-         of the error -- which is always 0 -- and exit with a non-zero status)
-
-command.h
-       - added CMD_COMMAND_BUILTIN for use by the `command' builtin and the
-         code in execute_cmd.c
-
-builtins/command.def
-       - add CMD_COMMAND_BUILTIN to the created command's flags
-
-                                   5/1
-                                   ---
-configure.in
-       - add call to AC_C_CONST to test `const' compiler behavior
-       - add call to AC_C_INLINE to test `inline' compiler behavior
-       - add call to AC_C_STRINGIZE to test cpp #x stringizing operator
-
-config.h.in
-       - add `#undef const' for configure to substitute
-       - add `#undef inline' for configure to substitute
-       - add `#undef HAVE_STRINGIZE' for configure to substitute
-
-include/stdc.h
-       - remove code that defines or undefines `const' and `inline'
-       - change the __STRING macro to be defined depending on the value
-         of HAVE_STRINGIZE
-
-lib/malloc/malloc.c
-       - change the __STRING macro to be defined depending on the value
-         of HAVE_STRINGIZE
-
-lib/readline/{readline,rlprivate}.h
-       - moved rl_get_termcap to readline.h, making it a public function
-
-lib/readline/readline.h
-       - new #define, RL_READLINE_VERSION, hex-encoded library version
-         number, currently set to 0x0402
-       - new public int variable, rl_readline_version
-
-lib/readline/readline.c
-       - #define RL_READLINE_VERSION if it is not already defined (which it
-         should be in readline.h)
-       - initialize rl_readline_version to RL_READLINE_VERSION
-
-lib/readline/doc/rltech.texinfo
-       - documented rl_get_termcap
-       - documented rl_readline_version
-
-jobs.c
-       - job_exit_status should return an int, not a WAIT (undetected
-         before because on most POSIX-like systems a WAIT is really an int)
-
-builtins/evalfile.c
-       - added FEVAL_REGFILE (file must be a regular file) to accepted
-          _evalfile flags
-       - fc_execute_file() adds FEVAL_REGFILE to _evalfile flags.  This
-         means that startup files and files read with `.' no longer need
-         to be regular files
-
-                                   5/2
-                                   ---
-
-lib/termcap/Makefile.in
-       - fix target for installed termcap library (normally unused)
-
-lib/tilde/Makefile.in
-       - fix install target to install in $(libdir) (normally unused)
-
-Makefile.in
-       - don't make $(man3dir) since there's nothing installed there
-
-Makefile.in,doc/Makefile.in
-       - change `man1ext' to `.1', `man3ext' to `.3'
-       - change appropriate install targets to use new values of man[13]ext
-       - use `test ...' instead of `[...]'
-       - add support for DESTDIR root installation prefix, for package
-         building (installdirs, install, install-strip, uninstall targets)
-
-builtins/common.c
-       - new function int get_exitstat(WORD_LIST *list) returns an eight-bit
-         exit status value for use in return, exit, logout builtins
-
-builtins/common.h
-       - extern declaration for get_exitstat()
-
-builtins/{exit,return}.def
-       - call get_exitstat where appropriate
-
-builtins/printf.def
-       - add support for "'" flag character as posix 1003.2-200x d6 says
-       - fix core dump when user-supplied field width or precision is 0
-       - fix to printstr() to handle zero-length precision with `%b' format
-         specifier (printf '%.0b-%.0s\n' foo bar)
-       - fix to printstr() to treat a negative field width as a positive
-         field width with left-justification
-       - fix to mklong to avoid static buffers, which can always be overrun
-         by someone sufficiently motivated
-
-bashline.c
-       - change var in add_host_name to type `size_t' for passing to xrealloc
-
-                                   5/3
-                                   ---
-execute_cmd.c
-       - change restore_signal_mask to accept a sigset_t *, since a sigset_t
-         may not fit into a pointer, change call
-
-unwind_prot.c
-       - use a union UWP in restore_variable when restoring a variable whose
-         size is the same as sizeof(int), the reverse of the method used to
-         store it in unwind_protect_int
-
-builtins/printf.def
-       - use a #define LENMODS containing the length modifiers instead of
-         testing against each possible modifier character, save any mod
-         character found
-       - add support for ISO C99 length specifiers `j', `t', and `z'
-       - if `L' modifier is supplied with a floating point conversion char,
-         pass a `long double' to printf if HAVE_LONG_DOUBLE is defined
-
-configure.in,config.h.in
-       - call AC_C_LONG_DOUBLE to check for `long double'; define
-         HAVE_LONG_DOUBLE if supported
-
-bashline.c
-       - fix an inadvertantly-unclosed comment in attempt_shell_completion
-       - make set_saved_history return a value
-       - make dynamic_complete_history return a useful value
-
-{make_cmd,execute_cmd,shell,subst,trap,variables,input,unwind_prot,test,
-pcomplete}.c
-       - removed some declared-but-unused variables
-
-builtins/{cd,enable,fc,set,setattr,type,umask,printf,complete}.def
-       - removed some declared-but-unused variables
-
-lib/sh/{zread,netopen}.c
-       - removed some declared-but-unused variables
-
-execute_cmd.c
-       - in execute_arith_command, use a long variable to hold the result
-         of evalexp(), since that's what it returns
-
-builtins/evalstring.c
-       - make cat_file return -1 on a read or write error
-
-lib/sh/stringlib.c
-       - make merge_stringlists() return the right value
-
-                                   5/7
-                                   ---
-pcomplete.c
-       - remove typo that caused empty declaration (;;)
-
-parse.y
-       - fix yyerror() to accept a single string argument; fix callers
-
-trap.c
-       - cast pointer to long instead of int when printing message with
-         internal_warning() in run_pending_traps()
-
-subst.c
-       - fix process_substitute to handle stdin being closed
-
-test.c
-       - change `while' to `if' in and() and or(), since the loop isn't
-         actually performed -- there's an unconditional `return' in the
-         loop body
-       - check for integer overflow of arguments to `-t'
-
-lib/sh/netopen.c
-       - change _getserv() to reject negative port/service numbers
-
-expr.c
-       - fix strlong() to not convert the base specification from long to
-         int before checking for overflow, since truncation on machines
-         where sizeof(int) != sizeof(long) may mask errors
-
-builtins/{jobs,kill,wait}.def
-       - use legal_number instead of atoi when converting strings to pid_t;
-         check for numeric overflow
-
-input.c
-       - fix for cygwin in b_fill_buffer -- off-by-one error when checking
-         buffer for \r\n termination
-
-general.h
-       - new #define INT_STRLEN_BOUND(t), computes max length of string
-         representing integer value of type T, possibly including a sign
-         character
-       - include <limits.h> if it's present
-
-{execute_cmd,findcmd,test}.c
-       - don't include <limits.h>, since general.h does it now
-
-{execute_cmd,lib/sh/itos,pcomplete,print_cmd,subst,variables}.c
-       - use INT_STRLEN_BOUND instead of static array sizes when converting
-         various strings to integer values
-
-shell.h
-       - struct fd_bitmap now uses an `int' size, since it's bounded by
-         the number of file descriptors, which must fit into an `int'
-
-execute_cmd.c
-       - FD_BITMAP_DEFAULT_SIZE is now 32, not 32L
-       - new_fd_bitmap takes an `int' size parameter, not a `long'
-
-execute_cmd.h
-       - change prototype for new_fd_bitmap()
-
-test.c
-       - fix test_stat to check for overflow when parsing the integer file
-         descriptor number; return ENOENT instead of EBADF for files that
-         are not open
-
-hashlib.c
-       - don't discard the upper 32 bits of the random value, if present
-
-lib/readline/shell.c
-       - use the same INT_STRLEN_BOUND mechanism to decide how much space to
-         allocated in sh_set_lines_and_columns
-
-                                   5/8
-                                   ---
-aclocal.m4
-       - add check for libtinfo (termcap-specific portion of ncurses-5.2) to
-         BASH_CHECK_LIB_TERMCAP
-       - new macro, RL_LIB_READLINE_VERSION, checks version of installed
-         readline library and (optionally) writes version #defines to
-         config.h.  Bash doesn't use the version defines
-
-configure.in
-       - call RL_LIB_READLINE_VERSION instead of support/rlvers.sh
-
-execute_cmd.c
-       - fix execute_shell_script and the WHITECHAR and STRINGCHAR macros
-         to check array bounds before indexing into the sample string
-
-unwind_prot.[ch]
-       - import new versions submitted by Paul Eggert <eggert@twinsun.com>
-         with a couple of changes for backwards compatibility, so the rest
-         of the source doesn't need to be changed yet
-
-jobs.c
-       - use unwind_protect_var on last_made_pid in run_sigchld_trap
-
-builtins/bind.def
-       - use unwind_protect_var on rl_outstream
-
-general.c
-       - rework print_rlimtype to use INT_STRLEN_BOUND and handle the
-         most negative number correctly
-
-expr.c
-       - `tokval' should have been a `long', since all arithmetic is done
-         as longs
-
-builtins/history.def
-       - consolidate tests for valid history position in one block to
-         avoid duplicate code and strings
-
-builtins/ulimit.def
-       - fix check for overflow when setting limit to work when int is 32
-         bits and RLIMTYPE is 64
-
-lib/sh/tmpfile.c
-       - don't truncate the result of time(3) to int; just use time_t,
-         since it's being assigned to an `unsigned long'
-
-mailcheck.c
-       - use legal_number instead of atoi in time_to_check_mail() to catch
-         more numeric errors; consolidate error checking in one block
-       - last_time_mail_checked should be a time_t
-
-                                   5/9
-                                   ---
-builtins/set.def
-       - recognize `set [-+]o nolog' if HISTORY is defined
-
-bashline.c
-       - new variable `dont_save_function_defs', set by `set -o nolog';
-         currently ignored
-
-command.h
-       - the `dest' member of a REDIRECTEE is now an `int'
-
-parse.y,redir.c
-       - changed uses of `redir.test' (where redir is a REDIRECTEE) since
-         it's now an int
-
-lib/readline/rlstdc.h
-       - don't mess around with `const', rely on configure to supply a
-         proper definition if the compiler doesn't support it
-
-lib/tilde/tilde.h
-       - include <config.h> if HAVE_CONFIG_H is defined
-       - don't mess around with `const', rely on configure
-
-builtins/shopt.def
-       - new read-only `shopt' option, login_shell, non-zero if shell is a
-         login shell (as decided by shell.c)
-       - new function set_login_shell(), sets shopt private value of
-         login_shell
-
-builtins/common.h
-       - new extern declaration for set_login_shell
-
-shell.c
-       - call set_login_shell after setting value of login_shell (in
-         main() and set_shell_name())
-
-parse.y
-       - added new `\A' prompt string escape sequence:  time in 24-hour
-         HH:MM format
-
-configure.in, config.h.in
-       - check for <grp.h>, define HAVE_GRP_H if found
-
-builtins/complete.def
-       - add new `-A group/-g' option to complete group names
-
-pcomplete.h
-       - new define for CA_GROUP, used with group name completion
-
-pcomplete.c
-       - add code to support CA_GROUP group name completion
-
-bashline.c
-       - new function, bash_groupname_completion_function(), supports
-         programmable completion of group names
-
-bashline.h
-       - extern declaration for bash_groupname_completion_function
-
-lib/readline/bind.c
-       - new inputrc variable, `match-hidden-files', controls completion
-         matching files beginning with a `.' (on Unix)
-
-lib/readline/complete.c
-       - new variable, _rl_match_hidden_files, mirrors `match-hidden-files'
-         inputrc variable
-
-lib/readline/rlprivate.h
-       - extern declaration for _rl_match_hidden_files
-
-builtins/hash.def
-       - new `-t' option to list hash values for each filename argument
-
-builtins/read.def
-       - alarm(3) takes an `unsigned int' argument, not int
-       - check for arithmetic overflow with -t and -n options
-
-input.c
-       - check for read error before doing \r\n translation on cygwin in
-         b_fill_buffer
-       - reset bp->b_used to 0 instead of leaving it at -1 on read error
-         in b_fill_buffer
-
-builtins/shopt.def
-       - new functions, shopt_setopt(name, mode) and
-         shopt_listopt(name, mode) to give the rest of the shell an easy
-         interface
-
-builtins/common.h
-       - extern declarations for shopt_setopt and shopt_listopt
-
-shell.c
-       - new invocation options -O and +O, to list or set/unset shopt
-         options like +o/-o sets and unsets `set -o' options
-
-doc/{bash.1,bashref.texi}
-       - document `set -o nolog'
-       - document `login_shell' shopt option
-       - document new `\A' prompt string escape sequence
-       - document new `-t' option to `hash'
-       - document new `[+-]O' invocation option
-
-doc/bashref.texi
-       - add text to `Invoking Bash' section defining a login shell; text
-         taken from man page
-
-doc/bash.1, lib/readline/doc/rluser.texinfo
-       - documented new complete/compgen `-A group/-g' option
-
-lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
-       - documented new `match-hidden-files' inputrc variable
-
-                                  5/10
-                                  ----
-configure.in
-       - fix AC_CHECK_PROG(ar, ...)
-       - add AC_CHECK_TYPE for ssize_t
-
-config.h.in
-       - new #undef for ssize_t
-
-lib/sh/zread.c
-       - int -> ssize_t fixes to mirror modern declarations of read and write
-       - the `off' variable in zsyncfd should be an off_t since it computes
-         a file offset
-       - the local buffer `lbuf' is now char, since it's not nice to pass
-         unsigned char * to read(2), and the values from it are assigned to
-         a char anyway
-       - lind and lused are now size_t, since they index into a buffer
-       - set lused to 0 on read error
-
-lib/sh/zwrite.c
-       - change second argument to type `char *', since ISO C says you have
-         to pass a `char *' to `write'
-
-externs.h
-       - fix extern declarations of zread, zread1, zreadc, and zwrite
-       - prototype extern declaration of qsort_string_compare
-       - add extern declaration for history_delimiting_chars() from parse.y
-
-input.h
-       - b_used and b_inputp members ofr struct BSTREAM are now size_t
-
-builtins/evalstring.c
-       - the number of chars read with zread in cat_file should be assigned
-         to a variable of type ssize_t
-
-input.c
-       - the number of chars read with zread in b_fill_buffer should be
-         assigned to a variable of type ssize_t
-       - `localbuf' is now type char[], since POSIX says you shouldn't pass
-         unsigned char * to read(2)
-       - in getc_with_restart(), use a variable of type unsigned char to
-         get a value from the local buffer and return it
-       - in ungetc_with_restart, explicitly return the character arg passed
-         to avoid relying on localbuf being unsigned char
-
-subst.c
-       - the number of chars read with zread in read_comsub should be
-         assigned to a variable of type ssize_t
-
-mksyntax.c
-       - instead of casting to unsigned char * in addcstr, use a variable
-         of type unsigned char and let the compiler do the work
-
-parse.y
-       - instead of casting to unsigned char * in yy_readline_get, use a
-         variable of type unsigned char and let the compiler do the work
-       - ditto for yy_string_get and shell_getc (cast to unsigned char)
-
-subst.c
-       - instead of casting to unsigned char when assigning to ifscmap in
-         expand_word_internal, use a variable of type unsigned char and
-         let the compiler do the work
-
-lib/sh/strtrans.c
-       - instead of casting to unsigned char in ansic_quote, use a variable
-         of type unsigned char and let the compiler do the work
-
-builtins/evalstring.c
-       - remove extern declarations for zwrite and run_trap_cleanup; they're
-         in externs.h
-       - prototype cat_file forward declaration
-
-Makefile.in
-       - remove -I$(includedir) from INCLUDES and SUBDIR_INCLUDES
-
-aclocal.m4
-       - change RL_LIB_READLINE_VERSION to set RL_PREFIX, RL_LIBDIR,
-         and RL_INCLUDEDIR to what it used to test the installed readline
-         library version for use by the caller
-       - change RL_LIB_READLINE_VERSION to not compute ac_cv_rl_prefix if
-         the caller has already assigned it a value
-       - rename _rl_prefix -> ac_cv_rl_prefix, _rl_libdir -> ac_cv_rl_libdir,
-         _rl_includedir -> ac_cv_rl_includedir
-
-configure.in
-       - change testing of whether to use the value of
-         $opt_with_installed_readline to be != no, to allow the user to
-         specify a prefix where the installed readline library may be found
-       - if --with-installed-readline=PREFIX is supplied, set ac_cv_rl_prefix
-         to PREFIX before calling RL_LIB_READLINE_VERSION
-       - if --with-installed-readline[=PREFIX] is supplied, don't set
-         RL_LIBDIR and RL_INCLUDEDIR; let RL_LIB_READLINE_VERSION take care
-         of it, set RL_INCLUDE=-I${RL_INCLUDEDIR}
-       - if --with-installed-readline[=PREFIX] is supplied, and we're
-         linking with the history library, assign $RL_LIBDIR to HIST_LIBDIR
-         so we use the same version of the installed readline and history
-         libraries
-
-Makefile.in, builtins/Makefile.in
-       - have configure substitute RL_INCLUDEDIR, set RL_INCLUDEDIR variable
-
-doc/bashref.texi
-       - updated description of --with-installed-readline configure option 
-
-general.c
-       - moved QSFUNC typedef here from builtins/common.c
-
-{alias,bashline,variables,lib/sh/stringvec}.c
-       - cast fourth argument to qsort to (QSFUNC *)
-
-alias.c
-       - prototype forward declaration of qsort_alias_compare
-
-bashhist.c
-       - include <glob/glob.h> for extern declaration of glob_pattern_p
-       - remove extern declaration of history_delimiting_chars; it's now
-         in externs.h
-       - prototype forward declarations of histignore_item_func,
-         maybe_add_history, and bash_add_history
-
-bracecomp.c
-       - remove extern declaration for sh_backslash_quote; it's in externs.h
-
-braces.c
-       - remove extern declaration for extract_command_subst; it's in subst.h
-       - prototype forward declarations for expand_amble, array_concat, and
-         brace_gobbler
-
-error.c
-       - prototype extern declaration of give_terminal_to, fix bad call
-
-{execute_cmd,expr,findcmd,jobs,mailcheck,nojobs,pcomplete,print_cmd,redir,
-shell}.c
-       - prototype all static forward function declarations
-
-pcomplete.c
-       - changed some function parameters to `const char *' to avoid discarding
-         const qualifier
-
-make_cmd.c
-       - make_bare_word, make_word_flags, and make_word now take a
-         `const char *' string argument
-
-make_cmd.h
-       - changed extern declarations for make_bare_word and make_word
-
-print_cmd.c
-       - cprintf now takes a `const char *' as its first argument, like
-         xprintf and printf
-       - the conditional define for xprintf should have been HAVE_VPRINTF,
-         not HAVE_VFPRINTF
-
-shell.c
-       - in isnetconn(), the return value of sizeof() is size_t
-
-aclocal.m4
-       - add inclusion of stddef.h if STDC_HEADERS is defined to 1 in
-         BASH_CHECK_TYPE
-
-configure.in
-       - add a call to BASH_CHECK_TYPE for socklen_t (type of third argument
-         to getpeername(2))
-
-                                  5/11
-                                  ----
-lib/readline/bind.c
-       - make `useq' a char array to pass to rl_macro_bind in
-         rl_parse_and_bind
-
-lib/readline/{{bind,isearch}.c,rlprivate.h}
-       - _rl_isearch_terminators is now a char *, not unsigned char *
-
-{subst,variables,lib/sh/tmpfile}.c
-       - dollar_dollar_pid is now a `pid_t' instead of `int'
-
-variables.c
-       - sbrand() now takes an `unsigned long' to set the seed value
-       - changed last_random_value to type int, since it's always between
-         0 and 32767
-       - use strtoul to convert the value in assign_random instead of atoi
-       - take out casts in any arguments to sbrand()
-       - take out cast to int in call to inttostr in set_ppid()
-
-subst.c
-       - don't cast last_asynchronous_pid when passing to itos()
-
-{sig,subst}.c
-       - prototype all static forward function declarations
-
-                                  5/14
-                                  ----
-{test,trap,variables}.c
-       - prototype all static forward function declarations
-
-variables.c
-       - free_variable_hash_data() now takes a PTR_T, a `generic pointer'
-
-builtins/{alias,bind,break,cd,complete,declare,enable,exit,fc,fg_bg,help,
-history,jobs,pushd,read,set,trap,umask,
-       - prototype all static forward function declarations
-
-builtins/read.def
-       - reset_eol_delim now takes a `char *' arg, since that's what the
-         unwind_protect functions pass it, and it ignores its arguments
-         anyway
-
-lib/readline/{histsearch,input,kill,rltty,search,vi_mode}.c
-       - prototype all static forward function declarations
-
-lib/tilde/tilde.c
-       - prototype all static forward function declarations
-       - tilde_find_prefix, tilde_find_suffix, isolate_tilde_prefix, and
-         glue_prefix_and_suffix now take `const char *' arguments where
-         appropriate
-
-configure.in,config.h.in
-       - check for vsnprintf, define HAVE_VSNPRINTF if found
-
-lib/readline/display.c
-       - use vsnprintf() in rl_message if it's available; if we don't, at
-         least set the last character in msg_buf to 0 to avoid overrun --
-         we really can't do anything about overflow at this point.  if it's
-         available, this fixes buffer overflow problems in rl_message
-
-                                  5/15
-                                  ----
-lib/readline/histexpand.c
-       - in get_history_word_specifier, allow any character to terminate
-         a `:first-' modifier, not just `:' and null.  This is what csh
-         appears to do.  This allows things like `!:0- xyzzy' to replace the
-         last argument with xyzzy
-
-                                  5/18
-                                  ----
-configure.in, config.h.in
-       - check for <stdint.h>, define HAVE_STDINT_H if found
-       - check for intmax_t in <stdint.h>, define intmax_t as long if not
-         found
-
-                                  5/21
-                                  ----
-builtins/kill.def
-       - change to use strerror() for error message when kill(2) fails
-
-aclocal.m4
-       - new macro, BASH_C_LONG_LONG, check for `long long'
-
-configure.in, config.h.in
-       - call BASH_C_LONG_LONG, define HAVE_LONG_LONG if found
-
-lib/sh/snprintf.c
-       - new file, with implementations of snprintf, vsnprintf, asprintf,
-         and vasprintf, derived from inetutils version
-
-Makefile.in, lib/sh/Makefile.in
-       - add snprintf.c/snprintf.o
-
-configure.in, config.h.in
-       - add checks for snprintf, asprintf, vasprintf, with appropriate
-         cpp defines
-
-lib/readline/{rldefs,xmalloc}.h, lib/readline/xmalloc.c
-       - xmalloc and xrealloc now take `size_t' arguments, like their bash
-         counterparts
-
-externs.h,lib/sh/itos.c
-       - inttostr and itos now take `long' arguments
-       - inttostr takes a `size_t' argument for the buffer size
-
-{expr,lib/malloc/malloc,variables,general}.c
-       - fixed calls to itos() by removing casts, etc.
-
-subst.[ch]
-       - get_dollar_var_value now takes a long, not an int
-       - sub_append_number now takes a long, not an int
-
-subst.c
-       - in parameter_brace_expand_word, use a long and legal_number to
-         translate ${N}, to avoid overflow
-       - in parameter_brace_expand_length, use a long and legal_number to
-         translate ${#N}, to avoid overflow
-       - in do_array_element_assignment, array_expand_index,
-         array_value_internal, use arrayind_t instead of int
-       - let verify_substring_values take long * arguments for the return
-         value of evalexp()
-       - pass long * arguments to verify_substring_values in
-         parameter_brace_substring
-       - parameter_brace_expand_length now returns `long'
-       - parameter_brace_expand now uses a long variable for the return
-         value of parameter_brace_expand_length
-       - param_expand now uses a long variable for the return value from
-         evalexp
-       - array_length reference now returns an `arrayind_t', since it can
-         return the num_elements member of an array, which is of type
-         arrayind_t
-
-subst.h
-       - array_expand_index now returns an `arrayind_t'
-
-array.[ch]
-       - array_subrange now takes arrayind_t arguments, not `int'
-       - dup_array_subrange now uses arrayind_t local variable to do
-         array indexing
-       - use long to print array indices in print_element
-
-variables.c
-       - null_array_assign, assign_dirstack, bind_array_variable
-         now take arrayind_t arguments as array indices
-       - assign_array_var_from_word_list, assign_array_var_from_string,
-         unbind_array_element now use arrayind_t local variables for
-         array indexing
-
-variables.h
-       - change extern declaration of bind_array_variable
-
-builtins/common.[ch]
-       - get_numeric_arg now returns a `long', since it usually returns
-         the value of legal_number()
-
-builtins/{shift,break}.def
-       - use long variables for the return value of get_numeric_arg
-
-builtins/history.def
-       - convert string argument to int only if it's in range
-
-builtins/pushd.def
-       - set_dirstack_element and get_dirstack_element now take `long'
-         index arguments
-       - get_dirstack_index now takes a `long' index argument, since it's
-         passed the converted value from legal_number
-
-lib/sh/timeval.c
-       - in print_timeval, don't assume that the number of minutes fits into
-         an int, since it's just seconds/60.
-
-lib/sh/clock.c
-       - ditto for print_clock_t
-
-                                  5/22
-                                  ----
-shell.c
-       - since the -O option settings may possibly be overridden by the
-         normal shell initialization or posix initialization, save the
-         invocation options on an alist (with add_shopt_to_alist) and
-         process them after basic initialization (with run_shopt_alist)
-
-                                  5/23
-                                  ----
-trap.h
-       - new define, BASH_NSIG, all system signals plus special bash traps
-
-trap.c, builtins/trap.def
-       - use BASH_NSIG for array bounds and loops where appropriate
-
-trap.c
-       - change decode_signal to disallow numeric signal numbers above
-         NSIG -- this means you can only reference special traps like
-         DEBUG by name
-       - new SPECIAL_TRAP(s) macro to test whether s is one of the special
-         bash traps (currently DEBUG and EXIT)
-       - change reset_or_restore_signal_handlers so command substitution
-         doesn't inherit the debug trap (like ksh93), and child processes
-         don't have to rely on initialize_traps being run to get rid of
-         any debug trap
-
-support/mksignames.c
-       - add extra "ERR" signal name, value NSIG+1, allocate space for it
-         and write it out in signal_names[]
-
-trap.h
-       - new define: ERROR_TRAP == NSIG+1, change BASH_NSIG to NSIG+2
-       - extern declarations for set_error_trap, run_error_trap
-       - new define: TRAP_STRING(s), expands to trap_list[s] if signal S
-         is trapped and not ignored, NULL otherwise
-
-trap.c
-       - add ERROR_TRAP to SPECIAL_TRAPS define
-       - initialize ERROR_TRAP stuff in initialize_traps
-       - new function: set_error_trap(command), sets the ERR trap string
-       - new function: run_error_trap(command), runs the ERR trap string
-       - set trap string for ERROR_TRAP to NULL in free_trap_strings
-       - change reset_or_restore_signal_handlers so child processes don't
-         inherit the ERR trap
-       - add case to call run_error_trap in maybe_call_trap_handler
-
-execute_cmd.c
-       - in execute_command_internal, keep track of ERR trap and call it if
-         necessary
-       - use TRAP_STRING to get the value of debug and error traps
-       - in execute_function, arrange things so the ERR trap is not inherited
-         by shell functions, and is saved and restored like the DEBUG trap
-
-doc/{bash.1,bashref.texi}
-       - documented new ERR trap
-
-tests/{trap.{tests,right},trap2.sub,trap2a.sub}
-       - added ERR trap tests
-
-subst.c
-       - on machines without /dev/fd, change the named pipe fifo list to a
-         list of structs containing pathname and proc information
-       - change unlink_fifo_list to kill the proc in the fifo list with
-         signal 0 and not remove the fifo if the proc is still alive.  This
-         should fix the problem on those backward systems without /dev/fd
-         where fifos were removed when a job using process substitution was
-         suspended
-
-                                  5/24
-                                  ----
-examples/loadables/getconf.h
-       - new file, with basic defines needed to make getconf work minimally
-         on POSIX systems without the necessary definitions
-
-examples/loadables/getconf.c
-       - replacement functions for confstr, sysconf, pathconf for systems
-         that lack them, providing a minimal posix interface
-       - heavily augmented getconf, now supports all POSIX.1-200x,
-         POSIX.2-200x, Solaris 7, AIX 4.2 getconf variables
-
-                                  5/29
-                                  ----
-builtins/setattr.def
-       - make `readonly', `export', and `declare' print `invisible' variables
-         as just a command and variable name, without a value, when listing
-         all variables (as POSIX.2-200x d6 requires)
-
-                                  5/30
-                                  ----
-
-configure.in
-       - upgraded to autoconf-2.50 on main development machine, so require
-         autoconf-2.50 in preparation for using some if its new features
-       - call AC_C_PROTOTYPES
-       - remove call to AC_EXEEXT, which now does the wrong thing
-       - changed AC_INIT to new flavor
-       - added call to AC_CONFIG_SRCDIR
-       - AC_CONFIG_HEADER -> AC_CONFIG_HEADERS
-       - AC_RETSIGTYPE -> AC_TYPE_SIGNAL
-
-configure.in, aclocal.m4, config.h.in
-       - removed call to BASH_LARGE_FILE_SUPPORT, use AC_SYS_LARGEFILE
-         standard support, with new macros _FILE_OFFSET_BITS and
-         _LARGE_FILES
-       - removed definition of BASH_LARGE_FILE_SUPPORT
-
-doc/bashref.texi
-       - document new `--enable-largefile' configure option
-
-lib/readline/readline.c
-       - change rl_set_prompt to call rl_expand_prompt unconditionally, so
-         local_prompt and local_prompt_prefix get set correctly
-
-                                   6/6
-                                   ---
-lib/readline/complete.c
-       - don't append `/' or ` ' to a match when completing a symlink that
-         resolves to a directory, unless the match doesn't add anything
-         to the word.  This means that a tab will complete the word up to
-         the full name, but not add anything, and a subsequent tab will add
-         a slash.  Change to append_to_match; callers changed
-
-hashlib.c
-       - new function, hash_table_nentries (table), returns the number of
-         items in TABLE
-
-hashlib.h
-       - extern declaration for hash_table_nentries
-
-configure.in
-       - configure without bash malloc on openbsd; they claim it needs
-         eight-bit alignment (which the bash malloc provides, but...)
-
-                                   7/2
-                                   ---
-stringlib.c
-       - only call RESIZE_MALLOCED_BUFFER from strsub() if the replacement
-         string length is > 0, avoid possible hangs if replacement is null
-
-subst.c
-       - don't include input.h; no longer needed
-
-configure.in
-       - remove calls to AC_SYS_RESTARTABLE_SYSCALLS and
-         BASH_SYS_RESTARTABLE_SYSCALLS; the results are no longer used
-
-config.h.in
-       - remove define for HAVE_RESTARTABLE_SYSCALLS
-
-aclocal.m4
-       - removed definition of BASH_SYS_RESTARTABLE_SYSCALLS; no longer used
-
-execute_cmd.c
-       - changed select command so `return' no longer terminates the select
-         command, so it can be used to return from an enclosing function.
-         This is as ksh (88 and 93) does it
-
-lib/readline/vi_mode.c
-       - fix trivial typo in declaration of vi_motion; `t' appears twice;
-         the second instance should be `T'
-
-                                   7/3
-                                   ---
-configure.in
-       - don't add -static to LDFLAGS on Solaris 2.x.  This means that the
-         auxiliary programs will be built as dynamic executables, but that
-         should do no harm
-
-                                   7/5
-                                   ---
-lib/glob/fnmatch.c
-       - fix the code that processes **(pattern) to short-circuit if the
-         pattern is ill-formed or lacks a trailing `)'  -- this fixes the
-         segfault on **(/*)
-
-Makefile.in, builtins/Makefile.in
-       - split CCFLAGS into CCFLAGS_FOR_BUILD and CFLAGS, to aid in
-         cross-compilation
-       - build programs that use $(CC_FOR_BUILD) using $(CCFLAGS_FOR_BUILD)
-
-configure.in, config.h.in
-       - check for getaddrinfo(3), define HAVE_GETADDRINFO if found
-
-lib/sh/netopen.c
-       - implemented a version of _netopen (_netopen6) that uses
-         getaddrinfo(3) if available, use if HAVE_GETADDRINFO is defined.
-         old _netopen is _netopen4; _netopen now calls either _netopen6
-         or _netopen4 as appropriate
-
-                                   7/9
-                                   ---
-builtins/exit.def
-       - don't source ~/.bash_logout if subshell_environment is non-zero
-
-execute_command.c
-       - in execute_until_or_while, handle the case where `breaking' is
-         set in the loop test (e.g., by the job control code when a job
-         is stopped with SIGTSTP), but the return value from the test is
-         something that would cause the loop to break.  Need to decrement
-         `breaking' in this case
-
-                                  7/10
-                                  ----
-execute_cmd.c
-       - in execute_in_subshell, make sure a command of type cm_subshell
-         inherits its `enclosing' command's CMD_IGNORE_RETURN flag
-
-variables.c
-       - in maybe_make_export_env, don't allow restricted shells to put
-         exported functions in the export environment
-
-                                  7/11
-                                  ----
-lib/glob/strmatch.h
-       - renamed old fnmatch.h
-       - changed guard #ifdef to _STRMATCH_H
-       - include system <fnmatch.h> if HAVE_LIBC_FNM_EXTMATCH is defined
-
-lib/glob/strmatch.c
-       - renamed old fnmatch.c
-       - include "strmatch.h"
-       - if HAVE_LIBC_FNM_EXTMATCH is defined, define a dummy version of
-         strmatch() that just calls fnmatch(3)
-
-lib/glob/glob.c
-       - include "strmatch.h"
-       - fnmatch -> strmatch
-
-Makefile.in, lib/glob/Makefile.in
-       - fnmatch -> strmatch
-
-{bashhist,execute_cmd,pathexp,pcomplete,shell,stringlib,subst,test}.c,
-pathexp.h,builtins/help.def
-       - include <glob/strmatch.h>
-       - fnmatch -> strmatch
-
-execute_cmd.c
-       - broke the code that parses the interpreter name from a #! line
-         out from execute_shell_script to a new function, getinterp()
-       - call getinterp from execute_shell_script
-       - use return value from getinterp in error message about bad
-         #! interpreter in shell_execve
-
-                                  7/12
-                                  ----
-lib/readline/isearch.c
-       - the last isearch string is now remembered in a new static variable,
-         last_isearch_string
-       - if ^R^R is typed, readline now searches for the remembered isearch
-         string, if one exists
-
-                                  7/24
-                                  ----
-pcomplete.h
-       - extern declaration for completions_to_stringlist()
-
-                                  7/25
-                                  ----
-builtins/complete.def
-       - make compgen handle -o default option
-       - make compgen return success only if sl->list_len is non-zero,
-         indicating that there are items on the list
-
-                                  7/31
-                                  ----
-execute_cmd.c
-       - in execute_connection, force stdin to /dev/null for asynchronous
-         commands if job control is not active, not just if the shell is
-         running a shell script (since you can run `set -m' in a script)
-
-lib/readline/rltty.c
-       - make sure _rl_tty_restore_signals resets `tty_sigs_disabled' on
-         successful restoration of the terminal modes
-       - make sure _rl_tty_disable_signals turns off IXON so that ^S and
-         ^Q can be read by rl_quoted_insert
-
-                                   8/1
-                                   ---
-aclocal.m4
-       - new check for FNM_EXTMATCH being defined in <fnmatch.h>, as Ullrich
-         Drepper intends to do for new versions of GNU libc
-
-config.h.in
-       - new definition for HAVE_LIBC_FNM_EXTMATCH
-
-configure.in
-       - check for fnmatch, but don't define anything in config.h
-       - call BASH_FUNC_FNMATCH_EXTMATCH to check for FNM_EXTMATCH
-
-                                   8/2
-                                   ---
-alias.h
-       - remove bogus extern declaration for xmalloc()
-       - include "stdc.h"
-       - add prototype declarations for all extern function declarations
-
-xmalloc.c,lib/readline/xmalloc.c
-       - fix xmalloc to return a PTR_T
-       - fix xrealloc to return a PTR_T and take a PTR_T as first argument
-
-include/ansi_stdlib.h
-       - extern declarations for malloc and realloc have them return PTR_T
-
-xmalloc.h
-       - new file, with extern declarations for functions in xmalloc.c
-
-general.h
-       - removed extern declarations for functions in xmalloc.c
-       - include xmalloc.h
-
-Makefile.in,builtins/Makefile.in
-       - update dependencies to include xmalloc.h
-
-parse.y,{alias,array,bashline,bracecomp,execute_cmd,findcmd,flags,general,
-hashcmd,locale,mailcheck,make_cmd,pathexp,pcomplete,print_cmd,stringlib,
-subst,unwind_prot,variables}.c
-builtins/{common,evalfile}.c
-builtins/{cd,command,enable,exec,printf,read,set}.def
-lib/sh/{makepath,netopen,pathphys,setlinebuf,shquote,snprintf,stringlist,
-strtrans,tmpfile}.c
-lib/readline/{util,terminal,shell,readline,macro,kill,isearch,input,
-histfile,histexpand,display,complete,bind}.c
-       - make sure all calls to xmalloc are cast to the right return value
-
-siglist.c
-       - include xmalloc.h
-
-parse.y,{alias,bashline,bracecomp,expr,make_cmd,nojobs,print_cmd,subst}.c
-builtins/{fc,printf,read}.def
-lib/sh/snprintf.c, lib/tilde/tilde.c
-lib/readline/{bind,display,histexpand,isearch,macro,util,vi_mode}.c
-       - make sure all calls to xrealloc are cast to the right return value
-
-lib/sh/{netopen,setlinebuf,shquote,snprintf}.c, lib/tilde/tilde.c
-       - include xmalloc.h, remove extern declaration of xmalloc
-
-lib/readline/xmalloc.h
-       - xmalloc and xrealloc should return PTR_T
-
-lib/readline/rldefs.h
-       - don't include an extern declaration for xmalloc
-
-                                   8/7
-                                   ---
-support/shobj-conf
-       - fixed up commented-out stanzas for HP's unbundled C compiler on
-         HP/UX
-
-support/bashbug.sh
-       - force the subject to be changed from the default
-
-lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
-       - document that transpose-words swaps the last two words on the line
-         if point is at the end of the line
-
-                                   8/9
-                                   ---
-stringlib.c
-       - fix possible infinite recursion problem with null pattern in
-         strsub()
-
-hashlib.c
-       - new function copy_hash_table to copy a hash table using a caller-
-         supplied function to copy item data (defaults to savestring())
-
-hashlib.h
-       - new extern declaration for copy_hash_table
-
-builtins/declare.def
-       - changes so that declare [-a] var=value assigns `value' to element 0
-         of array variable `var' like ksh93
-       - change so that declare [-a] var[N]=value assigns `value' to element
-         N of array variable `var' like ksh93
-
-                                  8/13
-                                  ----
-arrayfunc.c
-       - new file, for miscellaneous array functions
-
-arrayfunc.h
-       - new file, extern declarations for functions in arrayfunc.c
-
-variables.c
-       - move convert_var_to_array, bind_array_variable,
-         assign_array_from_string, assign_array_var_from_word_list,
-         assign_array_var_from_string, quote_array_assignment_chars,
-         skipsubscript, unbind_array_element, print_array_assignment
-         to arrayfunc.c
-
-shell.h
-       - include arrayfunc.h after variables.h
-
-variables.h
-       - remove above extern function declarations moved to arrayfunc.h
-       - add extern declaration for var_lookup
-
-Makefile.in
-       - add arrayfunc.c, arrayfunc.h in appropriate places
-       - add arrayfunc.h to dependencies
-
-subst.c
-       - move valid_array_reference, array_expand_index, array_variable_part,
-         array_value_internal, array_value (now global), get_array_value,
-         do_array_element_assignment to arrayfunc.c
-
-subst.h
-       - extern declarations for functions above moved to arrayfunc.h
-
-arrayfunc.h
-       - extern declarations for above functions from subst.c
-
-subst.[ch]
-       - string_list_dollar_star and string_list_dollar_at are now global
-         functions
-       - quote_escapes is now a global function
-
-subst.c
-       - maybe_expand_string -> expand_string_if_necessary
-       - expand_string_to_string -> expand_string_to_string_internal
-       - new functions: expand_string_to_string and
-         expand_string_unsplit_to_string, which call
-         expand_string_to_string_internal with expand_string and
-         expand_string_unsplit as the FUNC arguments, respectively
-
-arrayfunc.c
-       - change array_expand_index to call expand_string_to_string instead
-         of maybe_expand_string
-
-                                  8/14
-                                  ----
-shell.c
-       - in execute_env_file, call expand_string_unsplit_to_string
-
-mailcheck.c
-       - in check_mail, call expand_string_to_string
-
-variables.c
-       - in assign_in_env, call expand_string_unsplit_to_string
-
-arrayfunc.c
-       - new function, array_variable_name, splits an array reference into
-         a name (which is returned as a new string) and subscript
-       - change array_variable_part to just call array_variable_name and
-         look up the string returned with find_variable
-       - new function, find_or_make_array_variable (name, flags) which will
-         look up an array variable and convert a string variable to an
-         array if necessary.  The FLAGS argument, if non-zero, says to
-         check the readonly and noassign attributes and fail if either is set
-
-builtins/read.def
-       - make `read -a aname' honor any readonly status of `aname'
-       - read -a now calls find_or_make_array_variable with FLAGS value 1
-
-arrayfunc.[ch], subst.c, builtins/{declare,read}.def
-       - do_array_element_assignment -> assign_array_element
-
-                                  8/20
-                                  ----
-parse.y
-       - changed `for' command grammar to allow missing word list after `IN'
-         token, like latest POSIX drafts require
-
-lib/sh/tmpfile.c
-       - in sh_mktmpname(), check for filenum == 0 and init to non-zero number
-         in this case.  it can happen on arithmetic overflow
-
-support/mkversion.sh
-       - added `[0-9].[0-9][0-9][a-z]' as an acceptable value for a
-         distribution to allow for intermediate versions, like 2.05a
-
-support/config.guess
-       - removed the addition of the output of `/usr/bin/objformat' when
-         creating the canonical name on FreeBSD machines, so the canonical
-         name is once again `freebsd4.2' instead of `freebsdelf4.2'
-
-                                  8/22
-                                  ----
-lib/readline/{rlstdc,history,keymaps,readline,rldefs,rlprivate,rlshell,
-rltypedefs,xmalloc}.h
-lib/readline/{bind,compat,complete,display,funmap,histexpand,histsearch,
-input,isearch,kill,nls,parens,readline,rltty,search,shell,signals,vi_mode
-       - changed __P to PARAMS
-
-lib/tilde/tilde.[ch]
-       - changed __P to PARAMS
-
-{Makefile,configure}.in
-       - changed the version number to 2.05a
-       - changed the release status to `alpha1'
-
-                                  8/23
-                                  ----
-support/shobj-conf
-       - support for building shared libraries on Darwin/MacOS X
-
-siglist.h
-       - extern declaration for strsignal() to compensate for lack of
-         a definition in some system include files
-
-jobs.c
-       - remove casts from strsignal() calls
-
-[bash-2.05a-alpha1 frozen]
-
-                                  8/27
-                                  ----
-[bash-2.05a-alpha1 released]
-
-                                  8/27
-                                  ----
-execute_cmd.c
-       - fix eval_arith_for_expr to handle the case where the expanded
-         word list is NULL, returning 0 in this case
-
-print_cmd.c
-       - in print_function_def, make sure that func_redirects is assigned
-         a value before being used
-
-                                  8/28
-                                  ----
-alias.c
-       - include <ctype.h> for definition of isalpha()
-
-bashhist.h
-       - add prototypes for extern function declarations
-
-flags.c
-       - include bashhist.h for extern function declarations
-
-mksyntax.c
-       - include <unistd.h> if HAVE_UNISTD_H is defined in config.h
-
-parse.y
-       - include test.h for extern function declarations
-
-externs.h
-       - change extern declaration for setlinebuf to sh_setlinebuf
-
-stringlib.c
-       - include <glob/glob.h> for extern function declarations
-
-variables.h
-       - add function prototypes for all of the sv_* functions
-
-builtins/common.h
-       - add extern declarations for set_shellopts() and parse_shellopts()
-         from builtins/set.def
-
-variables.c
-       - include "hashcmd.h" for extern declaration for flush_hashed_filenames
-       - include "pathexp.h" for extern declaration for setup_glob_ignore
-
-lib/malloc/malloc.c
-       - cast to `long' instead of `int' in memalign for 64-bit machines
-
-{pcomplete,trap}.c
-       - changed printf escape sequences used to print pointers to %p
-
-lib/readline/undo.c
-       - include "xmalloc.h" for extern function declaration
-
-input.h
-       - add function prototypes to extern declarations for getc_with_restart
-         and ungetc_with_restart
-
-variables.[ch]
-       - changed type of `function' member of `struct name_and_function' to
-         `sv_func_t', which is defined and prototyped in variables.h
-       - map_over now takes an `sh_var_map_func_t *'
-
-shell.h
-       - start of a set of function pointer typedefs like those in
-         lib/readline/rltypedefs.h
-
-hashlib.[ch]
-       - second paramter to flush_hash_table is now an `sh_free_func_t *'
-
-trap.c
-       - parameter to reset_or_restore_signal_handlers is now an
-         `sh_resetsig_func_t *'
-
-pcomplete.h, pcomplib.c
-       - function pointer argument to print_all_compspecs is now an
-         `sh_csprint_func_t *'
-       - function pointer `list_getter' element of an `ITEMLIST' is now
-         prototyped with __P((...)) instead of using `Function *'
-
-jobs.[ch]
-       - `j_cleanup' member of a JOB is now an `sh_vptrfunc_t *'
-
-alias.c
-       - map_over_aliases now takes an `sh_alias_map_func_t *'
-       - free_alias_data now takes a `PTR_T'
-
-pathexp.c
-       - function pointer argument to ignore_globbed_names is now an
-         `sh_ignore_func_t *' 
-
-bashline.c
-       - function pointer argument to _ignore_completion_names is now an
-         `sh_ignore_func_t *' 
-
-pathexp.h,{bashhist,bashline.c
-       - `item_func' member of a `struct ignorevar' is now an
-         `sh_iv_item_func_t *'
-
-builtins/evalfile.c
-       - `errfunc' is now an `sh_vmsg_func_t *'
-
-jobs.c
-       - map_over_job now takes an `sh_job_map_func_t *' as its first argument
-
-array.[ch]
-       - function pointer argument to array_walk is now an
-         `sh_ae_map_func_t *'
-
-general.c
-       - tilde_expansion_preexpansion_hook has type `tilde_hook_func_t *',
-         and so the assignment in tilde_initialize doesn't need a cast
-
-list.c
-       - map_over_words now takes an `sh_icpfunc_t *' as its second argument
-
-input.h
-       - the `getter' and `ungetter' function pointer members of a
-         BASH_INPUT are now of types `sh_cget_func_t *' and
-         `sh_cunget_func_t *' respectively
-       - init_yy_io now takes an `sh_cget_func_t *' as its first argument and
-         an `sh_cunget_func_t *' as its second
-
-parse.y
-       - init_yy_io now takes an `sh_cget_func_t *' as its first argument and
-         an `sh_cunget_func_t *' as its second
-       - initialize_bash_input casts bash_input.getter and bash_input.ungetter
-         appropriately
-
-builtins/mkbuiltins.c
-       - make the extern function definitions written to builtext.h have
-         prototypes with __P((...))
-       - include "stdc.h"
-       - change Function to mk_handler_func_t
-       - fixed comment_handler to take the right number of args
-       - prototyped all the handler functions with __P((...))
-
-builtins.h
-       - the `function' member of a struct builtin is now of type
-         `sh_builtin_func_t *'
-
-builtins/common.[ch]
-       - last_shell_builtin, this_shell_builtin are now of type
-         `sh_builtin_func_t *'
-       - find_shell_builtin, builtin_address, find_special_builtin now return
-         `sh_builtin_func_t *'
-
-builtins/exit.def, {execute_cmd,jobs,nojobs,variables}.c, parse.y
-       - changed all declarations of last_shell_builtin and this_shell_builtin
-
-execute_cmd.c
-       - execute_builtin, execute_builtin_or_function,
-         execute_subshell_builtin_or_function now take an
-         `sh_builtin_func_t *' instead of a `Function *' for argument
-       - changed appropriate variables from `Function *' to
-         `sh_builtin_func_t *'
-
-builtins/{bind,builtin,enable,read,setattr}.def
-       - replaced uses of `Function *' in variable declarations with
-         appropriate types (sh_builtin_func_t * or rl_command_func_t *)
-
-builtins/set.def
-       - set_func and get_func members of binary_o_options are now of types
-         `setopt_set_func_t *' and `setopt_get_func_t *', which are
-         prototyped
-
-builtins/shopt.def
-       - set_func member of shopt_vars is now of type `shopt_set_func_t *'
-
-bashline.c
-       - enable_hostname_completion now returns `int' (the old value of
-         perform_hostname_completion)
-
-[The only use of Function and VFunction now is for unwind-protects]
-
-                                   9/4
-                                   ---
-lib/sh/getcwd.c
-       - use const define from config.h rather than `CONST'
-       - use PTR_T define from xmalloc.h rather than `PTR'
-       - include xmalloc.h for PTR_T
-       - remove PATH_MAX define, rely on value from maxpath.h
-
-{general,mailcheck}.c, lib/sh/{pathcanon,pathphys}.c
-       - don't include maxpath.h directly; it's already included by shell.h
-
-lib/sh/mailstat.c
-       - new `mailstat()' implementation, to stat a mailbox file for
-         mail checking.  handles maildir-style mail directories with one
-         file per message and creates a dummy stat struct from them
-
-lib/sh/Makefile.in
-       - add mailstat.c and mailstat.o in the appropriate places
-
-lib/malloc/malloc.c
-       - augmented implementation with wrapper functions that pass in file
-         and line number information from cpp.  currently unused, but a
-         placeholder for future debugging and use tracking
-
-lib/malloc/shmalloc.h
-       - new file, extern declarations for allocation wrapper functions for
-         use by the shell (and others, I guess)
-
-xmalloc.[ch]
-       - wrapper functions for xmalloc, xfree, xrealloc (sh_ prefixed) that
-         pass cpp line number information through to the malloc functions,
-         if USING_BASH_MALLOC is defined
-
-                                   9/5
-                                   ---
-lib/malloc/gmalloc.c
-       - removed; no longer part of distribution
-
-lib/malloc/Makefile.in
-       - removed references to gmalloc.[co]
-
-configure.in, doc/bashref.texi
-       - removed references to `--with-glibc-malloc' configure option
-
-{configure,Makefile}.in
-       - changed the way bash malloc is configured into the Makefile, making
-         it more like how readline is configured.  If the bash malloc is
-         not configured in, nothing in lib/malloc will be built
-
-                                   9/6
-                                   ---
-lib/malloc/imalloc.h
-       - new file, some internal malloc definitions
-
-lib/malloc/mstats.h
-       - new file, definitions for malloc statistics structs and functions
-
-lib/malloc/trace.c
-       - new file, malloc tracing functions (currently just print messages
-         to stderr), code is #ifdef MALLOC_TRACE
-
-lib/malloc/stats.c
-       - new file, moved malloc stats code from malloc.c to here
-
-lib/malloc/malloc.c
-       - moved some definitions to imalloc.h
-       - moved stats code to stats.c
-       - malloc tracing calls added to internal_{malloc,realloc,free}, all
-         #ifdef MALLOC_TRACE
-
-lib/malloc/Makefile.in, Makefile.in
-       - added {imalloc,mstats}.h, {trace,stats}.c
-
-parse.y
-       - changed decode_prompt_string to save and restore $?
-         (last_command_exit_value) around calls to expand_prompt_string(),
-         so command substitutions in PS1, etc. don't change $?
-
-{array,subst}.c
-       - a couple more arrayind_t fixes from Paul Eggert
-
-configure.in
-       - remove redundant check for wait3(2)
-
-redir.h
-       - fixed a typo (stdin_redirs -> stdin_redirects)
-
-                                  9/10
-                                  ----
-execute_cmd.c
-       - remove check for \n and \r from WHITESPACE macro, since those
-         chars are not whitespace as returned by the whitespace(c) macro
-       - getinterp now takes a `char *' as first arg, not unsigned char *
-       - execute_shell_script now takes a `char *' as first arg, not
-         unsigned char *
-       - fix typo in forward declaration for `initialize_subshell'
-       
-general.[ch]
-       - check_binary_file now takes a (char *) argument, not unsigned char *
-       - pass unsigned char to isspace and isprint because of ISO C fuckup
-       - bash_tilde_expand now takes a `const char *' as its argument
-
-builtins/evalfile.c, shell.c
-       - buffer passed to check_binary_file is char, not unsigned char
-
-parse.y
-       - fix extern declaration for yyerror()
-       - yyerror now takes a `const char *' as first arg
-
-{error,jobs}.c
-       - fixes to printf-style functions to handle pids wider than an int
-
-lib/readline/{isearch,vi_mode}.c
-       - fix call to rl_message in rl_display_search (remove extra arg)
-
-variables.c
-       - fix missing argument to builtin_error in make_local_variable
-
-builtins/getopts.def
-       - since getopts takes no options, change while loop calling
-         internal_getopts to a simple `if' check
-
-builtins/printf.def
-       - since printf takes no options, change while loop calling
-         internal_getopts to a simple `if' check
-
-lib/readline/bind.c
-       - remove _SET_BELL macro, expand code inline
-
-lib/readline/input.c
-       - change _rl_input_available to use either select or FIONREAD,
-         but not both
-
-lib/readline/readline.c
-       - fix rl_digit_loop to remove unreachable code at end of loop
-
-{bashhist,bashline,expr,jobs,redir,shell}.c, builtins/fc.def, lib/sh/snprintf.c
-       - bracket unused functions with #ifdef INCLUDE_UNUSED/#endif
-       - remove some unused variables
-
-execute_cmd.c
-       - remove #ifdef'd code that allowed `return' to terminate a select
-         statement
-
-expr.c
-       - remove some extraneous tests from strlong()
-
-array.h
-       - arrayind_t is now a long, since shell arithmetic is performed as
-         longs
-       - remove second declaration of new_array_element
-
-builtins/printf.def
-       - in mklong, xrealloc cannot return NULL, so don't check for it
-       - remove some #if 0 code
-       - fix core dump triggered by a format specification with more than
-         one `*'
-       - remove `foundmod', since its value mirrors `modchar != 0'
-       - include "common.h" for builtin_{error,usage} declarations
-
-Makefile.in,builtins/Makefile.in
-       - updated some dependencies due to new include files
-
-pcomplete.c
-       - include "execute_cmd.h" for declaration of execute_shell_function
-
-arrayfunc.c
-       - include <stdio.h> for printf
-       - include "builtins/common.h" for builtin_error declaration
-
-builtins/evalstring.c
-       - include "../trap.h" for run_trap_cleanup declaration
-
-builtins/help.def
-       - include "common.h" instead of locally declaring builtin_error
-         and builtin_usage
-
-error.h
-       - add extern declaration for itrace()
-       - add prototype to extern declaration of get_name_for_error
-       - file_error now takes a `const char *' as first argument
-
-externs.h
-       - added prototype for sh_setlinebuf declaration, bracketed with
-         NEED_SH_SETLINEBUF_DECL so we don't need stdio.h everywhere
-       - add extern declaration for parse.y:return_EOF()
-
-shell.c
-       - add NEED_SH_SETLINEBUF_DECL before including shell.h
-
-lib/readline/callback.c
-       - include <stdlib.h> or "ansi_stdlib.h" for abort declaration
-
-quit.h
-       - remove declaration of throw_to_top_level
-
-subst.c
-       - remove unused extern declaration for getopts_reset
-
-lib/sh/netopen.c
-       - include <shell.h> for legal_number, etc.
-       - add prototype for inet_aton extern declaration
-
-lib/sh/clock.c
-       - include <stdc.h> for __P declaration
-       - add extern declaration for get_clk_tck
-
-support/mkversion.sh
-       - changed so that extern function declarations for functions in
-         version.c (moved from externs.h) are in the generated version.h
-
-shell.h
-       - include version.h
-
-version.c
-       - various `char *' version variables are now `const char *'
-
-general.h
-       - add prototype for same_file, bracketed with _POSIXSTAT_H
-         #ifdef, since that's what include/posixstat.h defines
-
-builtins/common.[ch]
-       - _evalfile, maybe_execute_file, source_file, and fc_execute_file
-         now take a `const char *' as their first argument
-
-eval.c
-       - removed extern declaration of yyparse; it's in externs.h
-
-parse.y
-       - added prototypes to static forward function declarations
-       - changed local `all_digits' variable in read_token_word () to
-         all_digit_token to avoid clash with all_digits() function in
-         general.c
-
-{bashhist,copy_cmd,make_cmd,hashlib,mailcheck}.c
-       - added prototypes for static function declarations
-
-shell.h
-       - add extern declarations for interactive, interactive_shell,
-         changed c files with extern declarations
-
-pcomplete.c
-       - changed it_init_aliases to avoid shadowing global variable
-         `aliases'
-
-bashline.c,pathexp.c,general.h
-       - sh_ignore_func_t is now a pointer to a function taking a
-         `const char *'; users changed
-
-configure.in
-       - test for <strings.h>
-
-config.h.in
-       - add #undef HAVE_STRINGS_H
-
-bashansi.h
-       - change like recommended in autoconf manual
-
-                                  9/11
-                                  ----
-[a date which will live in infamy.  prayers for the victims.]
-
-execute_cmd.c
-       - don't use an absolute index into abuf in mkfmt, use
-         sizeof(abuf) to compute last index
-
-builtins/common.c
-       - fix read_octal to do a better job of detecting overflow while
-         iterating through the string
-
-builtins/umask.def
-       - change octal-print mode to print 4 digits, like other shells
-       - cast umask to unsigned long to avoid problems on systems where
-         it's wider than an int (POSIX doesn't guarantee that mode_t is
-         no wider than an int, but real-world systems use int)
-
-builtins/printf.def
-       - mklong can never return NULL (it uses xrealloc), so the mainline
-         doesn't need to check for NULL returns
-       - new function, getldouble (long double *), to get long doubles
-       - mklong now takes a `char *' as its second argument, the modifier(s)
-         to use
-       - changed use of `modchar' to handle more than a single modifier
-         character
-       - changed to handle `long double' and `L' formats better, rather
-         than discarding long double information
-       - since printf now follows the POSIX.2 rules for conversion errors,
-         we can dispense with the status returns from the get* functions
-       - make the get* functions as similar in structure as possible,
-         removing type casts, etc.
-
-lib/sh/timeval.c,execute_cmd.c
-       - change some instances of `long' to `time_t', for systems where
-         a time_t is bigger than a long
-
-jobs.c
-       - include "posixtime.h" instead of <sys/time.h>
-
-config.h.in
-       - add defines for HAVE_DECL_CONFSTR, HAVE_DECL_STRTOLD,
-         HAVE_DECL_SBRK, HAVE_DECL_PRINTF
-       - remove defines for SBRK_DECLARED and PRINTF_DECLARED
-       - add _GNU_SOURCE define
-
-configure.in
-       - add AC_CHECK_DECLS for strtold, confstr, sbrk, printf
-       - remove call to BASH_FUNC_SBRK_DECLARED
-       - remove call to BASH_FUNC_PRINTF
-
-xmalloc.c, lib/malloc/malloc.c
-       - change check of SBRK_DECLARED to HAVE_SBRK_DECL
-
-print_cmd.c
-       - change PRINTF_DECLARED to HAVE_DECL_PRINTF
-
-builtins/evalstring.c, builtins/common.h
-       - parse_and_execute now takes a `const char *' as its second argument
-
-input.h,parse.y
-       - with_input_from_* functions now take a `const char *' as their
-         second argument
-       - init_yy_io now takes a `const char *' as its fourth argument
-
-parse.y,externs.h
-       - parse_string_to_word_list now takes a `const char *' as its second
-         argument
-
-tests/builtins.right
-       - change output to account for extra digit in umask output
-
-pcomplib.c
-       - free_progcomp now takes a PTR_T argument
-
-builtins/bashgetopt.h
-       - include <stdc.h>
-       - add prototypes to extern declarations
-
-builtins/shopt.def
-       - add prototypes to static function declarations
-
-builtins/{fc,umask,wait}.def, builtins/{bashgetopt,common}.c
-       - include <ctype.h> for isdigit macro (referenced by `digit(x)')
-
-lib/readline/complete.c
-       - added more static function declarations with prototypes
-
-                                  9/12
-                                  ----
-lib/sh/tmpfile.c
-       - use `^' instead of `*' in sh_mktmpname to make filenames a bit
-         more random
-
-include/stdc.h,lib/readline/rldstdc.h
-       - add __attribute__ definition 
-
-builtins/common.h
-       - add printf __attribute__ to declaration of builtin_error
-
-error.h
-       - add printf __attribute__ to declaration of programming_error,
-         report_error, parser_error, fatal_error, sys_error, internal_error,
-         internal_warning
-
-lib/readline/readline.h
-       - add printf __attribute__ to declaration of rl_message
-
-pcomplete.c
-       - add printf __attribute__ to declaration of debug_printf
-
-print_cmd.c
-       - add printf __attribute__ to declarations of cprintf, xprintf
-
-include/chartypes.h
-       - new file, includes <ctype.h> and defines macros that check for
-         safe (ascii) arguments before calling the regular ctype macros
-
-{alias,bashline,execute_cmd,expr,findcmd,general,locale,mksyntax,stringlib,subst,variables}.c
-parse.y
-builtins/{bashgetopt,common}.c
-builtins/{fc,printf,umask,wait}.def
-lib/glob/strmatch.c
-lib/sh/{oslib,pathcanon,pathphys,snprintf,strcasecmp,strindex,stringvec,strtod,strtol,strtrans}.c
-examples/loadables/{head,sleep}.c
-       - include "chartypes.h" or <chartypes.h> instead of <ctype.h>
-
-Makefile.in,{builtins,lib/{glob,sh}}/Makefile.in
-       - update dependencies to include chartypes.h
-
-lib/sh/inet_aton.c
-       - use `unsigned char' instead of `char' to pass to ctype.h functions
-
-lib/sh/netopen.c
-       - check for '0' <= host[0] <= '9' in _getaddr instead of using
-         isdigit
-
-subst.c,lib/sh/shquote.c
-       - change array subscripts into sh_syntaxtab from `char' to
-         `unsigned char'
-
-{alias,bashline,execute_cmd,expr,general,subst}.c, parse.y
-builtins/{fc,printf,umask,wait}.def builtins/{bashgetopt,common}.c
-lib/sh/{pathcanon,pathphys,snprintf,strcasecmp,strindex,strtod,strtol,strtrans}.c
-examples/loadables/{head,sleep}.c
-       - change to use some of the new macros in chartypes.h
-       - remove old local macro definitions now provided by chartypes.h
-
-general.h
-       - remove definition of isletter, ISOCTAL, digit, digit_value
-       - change legal_variable_starter and legal_variable_char to use
-         chartypes.h macros
-       - change ABSPATH to use chartypes.h macros
-
-lib/readline/util.c
-       - change to use Paul Eggert's FUNCTION_FOR_MACRO define to define
-         function replacements for macros in chardefs.h
-
-lib/readline/chardefs.h
-       - added some of the same macros as in chartypes.h
-       - change _rl_lowercase_p, _rl_uppercase_p, _rl_digit_p,
-         _rl_to_upper, _rl_to_lower to use new IS* macros
-       - added _rl_isident macro from vi_mode.c:isident
-
-lib/readline/{bind,complete,nls}.c
-       - change to use some of the new macros from chardefs.h
-
-lib/readline/vi_mode.c
-       - isident -> _rl_isident
-       - remove local defines of macros in chardefs.h
-
-lib/sh/strtol.c
-       - updated to new version, modified from glibc 2.2.4 and sh-utils-2.0.
-         This one can do strtoll and strtoull, if necessary
-
-                                  9/13
-                                  ----
-builtins/ulimit.def
-       - changed get_limit so it retrieves both hard and soft limits
-         instead of one or the other
-       - changed callers of get_limit
-       - changed getmaxvm to take soft limit, hard limit as arguments
-       - changed getmaxuprc to just take a single argument, the value
-       - changed calls to printone() to pass soft limit or hard limit
-         depending on `mode' instead of using old current_limit variable
-       - moved check for out-of-range limits in ulimit_internal into the
-         block that converts a string argument to a value of type rlim_t
-       - changed RESOURCE_LIMITS struct to break the description into a
-         description string and separate scale factor string
-       - changed print_all_limits to print a single error message if
-         get_limit fails, including limits[i].description now that the
-         scale factor has been removed from the description string
-       - removed DESCFMT define, since it's now used only in printone()
-       - changed printone to print the option character associated with a
-         particular limit if we're printing multiple limits
-       - changed calls to builtin_error to print the description associated
-         with a limit if setting or getting the limit fails
-       - added support for new POSIX 1003.1-200x rlim_t values:
-         RLIM_SAVED_CUR and RLIM_SAVED_MAX, which expand to the current
-         soft and hard limits, whatever they are
-       - changed printone to print `hard' or `soft' if the current limit is
-         RLIM_SAVED_MAX or RLIM_SAVED_CUR, respectively
-       - changed ulimit_internal to handle new `hard' and `soft' arguments
-       - changed help text do describe the special limit arguments `hard',
-         `soft', and `unlimited'
-
-doc/{bash.1,bashref.texi}
-       - documented new `hard' and `soft' limit arguments to `ulimit'
-
-hashlib.[ch]
-       - find_hash_item now takes a `const char *' is its first argument
-       - hash_string now takes a `const char *' is its first argument
-       - remove_hash_item now takes a `const char *' as its first argument
-
-pcomplib.c
-       - removed cast from first argument to find_hash_item in find_compspec
-
-general.[ch]
-       - absolute_program now takes a `const char *' as its argument
-       - absolute_pathname now takes a `const char *' as its argument
-
-lib/glob/glob.[ch]
-       - glob_pattern_p now takes a `const char *' as its argument
-
-bashline.c
-       - removed cast from first argument to absolute_program in
-         command_word_completion_function
-       - removed cast from first argument to glob_pattern_p in
-         attempt_shell_completion
-
-findcmd.[ch]
-       - find_absolute_program, find_user_command, find_path_file,
-         search_for_command, user_command_matches now take a
-         `const char *' as their first argument
-       - file_status, executable_file, is_directory, executable_or_directory
-         now take a `const char *' as their argument
-       - _find_user_command_internal, find_user_command_internal,
-         find_user_command_in_path 
-
-lib/sh/makepath.c, externs.h
-       - changed sh_makepath so it takes `const char *' for its first
-         two arguments
-
-hashcmd.[ch]
-       - find_hashed_filename now takes a `const char *' as its first arg
-       - remove_hashed_filename now takes a `const char *' as its first arg
-
-variables.[ch]
-       - new_shell_variable, var_lookup, shell_var_from_env_string,
-         find_name_in_env_array, bind_function, makunbound,
-         bind_name_in_env_array, bind_tempenv_variable, bind_variable
-         now take a `const char *' as their first arg
-       - find_function, make_new_variable, find_tempenv_variable,
-         find_variable_internal, find_variable, set_func_read_only,
-         set_func_auto_export, all_variables_matching_prefix, assign_in_env,
-         assignment, kill_local_variable, make_local_variable, unbind_variable
-         now take a `const char *' as their arg
-       - mk_env_string now takes `const char *' arguments
-
-arrayfunc.[ch]
-       - skipsubscript now takes a `const char *' as its argument
-
-                                  9/17
-                                  ----
-lib/readline/complete.c
-       - attempt to preserve case of what the user typed in
-         compute_lcd_of_matches if we're ignoring case in completion
-
-builtins/{let,pushd}.def,{execute_cmd,expr}.c
-       - change some 0L constants to 0 and let the compiler sort it out
-
-                                  9/18
-                                  ----
-lib/malloc/alloca.c
-       - alloca now takes a `size_t' argument
-
-include/memalloc.h
-       - if we're providing an extern function declaration for alloca,
-         use `void *' and prototype if __STDC__ is defined
-       - if HAVE_ALLOCA_H is defined, but C_ALLOCA is defined, don't
-         define HAVE_ALLOCA
-
-                                  9/19
-                                  ----
-subst.c
-       - do_assignment_internal, do_assignment, and do_assignment_no_expand
-         now take a `const char *' as their first argument
-
-general.h
-       - a `sh_assign_func_t' is now a function taking a `const char *' and
-         returning int
-
-hashcmd.c
-       - free_filename_data now takes a `PTR_T' argument to agree with the
-         typedef for `sh_free_func_t'
-
-lib/sh/snprintf.c
-       - use TYPE_MAXIMUM define like strtol.c instead of huge constants
-
-                                  9/20
-                                  ----
-lib/sh/snprintf.c
-       - don't bother to compile the bulk of the body unless HAVE_SNPRINTF
-         or HAVE_ASPRINTF is not defined
-
-                                  9/24
-                                  ----
-flags.c
-       - ignore `set -n' if the shell was started interactively
-
-lib/readline/readline.c
-       - initialize readline_echoing_p to 0; let the terminal-specific code
-         in rltty.c set it appropriately
-
-lib/malloc/malloc.c
-       - changed internal_memalign() slightly to avoid compiler warnings about
-         negating an unsigned variable (-alignment -> (~alignment + 1))
-
-                                  9/27
-                                  ----
-lib/readline/readline.c
-       - changed rl_newline to set _rl_history_saved_point appropriately
-         for the {previous,next}_history code
-
-lib/readline/rlprivate.h
-       - extern declaration for _rl_history_preserve_point
-
-lib/readline/bind.c
-       - new bindable variable, `history-preserve-point', sets value of
-         _rl_history_preserve_point
-
-                                  10/1
-                                  ----
-lib/malloc/table.c
-       - new file, with a map of allocated (and freed) memory for debugging
-         multiple frees, etc.  Indexed by hash on values returned by
-         malloc(); holds size, file and line number info for last alloc or
-         free and a couple of statistics pointers
-
-lib/malloc/malloc.c
-       - a few cleanups; added calls for registering allocations and frees
-         if MALLOC_REGISTER is defined
-       - replaced MALLOC_RETURN with explicit MALLOC_NOTRACE define
-       - reordered fields in `struct...minfo' in `union mhead' to restore
-         eight-byte alignment
-       - added explicit checks for underflow in free and realloc since
-         checking mh_magic2 is not sufficient to detect everything (it's
-         no longer the last field in the struct, and thus not the bytes
-         immediately preceding what's returned to the user)
-       - new function, xbotch, for printing file and line number info for
-         the failed assertion before calling botch() (programming_error())
-
-configure.in
-       - replaced call to BASH_C_LONG_LONG with call to
-         AC_CHECK_TYPES([long long])
-       - moved the C compiler tests before the tests for various
-         system types, so we can know whether we have `long long'
-         before testing for 64-bit types
-       - if we have `long long', check for sizeof(long long) and save value
-
-aclocal.m4
-       - changed BASH_TYPE_BITS64_T to check `long long' before `long', but
-         after `double'
-
-                                  10/2
-                                  ----
-lib/malloc/malloc.c
-       - made malloc and realloc both agree on the rounding for a request of
-         size N (round up to nearest multiple of 8 after adjusting for
-         malloc overhead); uses new ALLOCATED_BYTES macro
-       - realloc and free now use new IN_BUCKET macro for underflow checks
-
-execute_cmd.c
-       - fixed time_command() to use `time_t' instead of `long' to hold
-         time stamps
-
-lib/sh/clock.c
-       - clock_t_to_secs now takes a `time_t *' second argument
-       - fixed print_clock_t to call clock_t_to_secs with right arguments
-
-lib/sh/timeval.c
-       - fixed print_timeval to make `minutes' a `long' and make its
-         structure identical to print_clock_t
-
-redir.c
-       - changed redirection_error to check for EBADF and use the file
-         descriptor being redirected from in the error message if it
-         is >= 0
-
-Makefile.in
-       - changed release status to `beta1'
-
-lib/glob/collsyms.h
-       - added a few ASCII symbols to the posix_collsyms array
-
-                                  10/3
-                                  ----
-aclocal.m4
-       - fixed typo in BASH_TYPE_BITS64_T
-
-configure.in
-       - added check for unsigned chars with AC_C_CHAR_UNSIGNED
-
-config.h.in
-       - added PROTOTYPES and __CHAR_UNSIGNED__ #defines
-
-general.h
-       - if CHAR_MAX is not define by <limits.h>, provide a definition
-
-builtins/printf.def
-       - change tescape() to mask \0 and \x escape sequences with 0xFF
-       - change tescape() to process at most two hex digits after a `\x'
-
-lib/sh/strtrans.c
-       - change strtrans() to mask \0 and \x escape sequences with 0xFF
-       - change strtrans() to process at most two hex digits after a `\x'.
-         This affects `echo -e' and $'...' processing
-
-lib/readline/bind.c
-       - changed rl_translate_keyseq() to process at most two hex digits
-         after a `\x'
-
-lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
-       - changed documentation for key binding escape sequences to specify
-         that at most two hex digits after \x are translated
-       - changed documentation for key binding to specify that the result
-         of \nnn or \xhh escapes is an eight-bit value, not just ASCII
-
-doc/{bash.1,bashref.texi}
-       - changed documentation of $'...' to specify that at most two hex
-         digits after \x are translated
-       - changed `echo' documentation to specify that at most two hex
-         digits after \x are translated
-       - changed documentation for `echo' and $'...' to specify that the
-         result of \nnn or \xhh escapes is an eight-bit value, not just ASCII
-
-                                  10/4
-                                  ----
-lib/malloc/malloc.c
-       - changed interface for xbotch to pass memory address and error code
-         as two additional arguments
-       - call mregister_describe_mem from xbotch to get the last allocation
-         or free before the botch
-
-configure.in
-       - call AC_CHECK_DECLS([strsignal])
-
-config.h.in
-       - add HAVE_DECL_STRSIGNAL
-
-siglist.h
-       - make declaration of strsignal() dependent on !HAVE_DECL_STRSIGNAL
-
-                                  10/5
-                                  ----
-support/texi2html
-       - upgraded to version 1.64
-
-                                  10/9
-                                  ----
-aclocal.m4
-       - added check for `long long' to BASH_TYPE_PTRDIFF_T
-
-configure.in
-       - replaced call to BASH_HAVE_TIOCGWINSZ with AC_HEADER_TIOCGWINSZ
-
-aclocal.m4
-       - replaced body of BASH_STRUCT_TERMIOS_LDISC with call to
-         AC_CHECK_MEMBER(struct termios.c_line, ...)
-       - replaced body of BASH_STRUCT_TERMIO_LDISC with call to
-         AC_CHECK_MEMBER(struct termios.c_line, ...)
-
-[bash-2.05a-beta1 frozen]
-
-                                  10/10
-                                  -----
-lib/sh/snprintf.c
-       - fixed exponent() to not smash the trailing zeros in the fraction
-         when using %g or %G with an `alternate form'
-       - fixed exponent() to handle the optional precision with %g and %G
-         correctly (number of significant digits before the exponent)
-
-                                  10/11
-                                  -----
-expr.c
-       - fixed strlong() to correct the values of `@' and `_' when
-         translating base-64 constants (64#@ == 62 and 64#_ == 64), for
-         compatibility with ksh
-
-lib/sh/itos.c
-       - added a slightly more flexible fmtlong() function that takes a
-         base argument and flags (for future use)
-       - rewrote itos and inttostr in terms of fmtlong
-
-lib/sh/fmtulong.c
-       - new file, converts unsigned long to string.  hooks for `unsigned
-         long long' in the future.  unused as yet
-
-                                  10/15
-                                  -----
-lib/readline/rltty.c
-       - change the SET_SPECIAL macro to avoid possible (but highly
-         unlikely) negative array subscripts
-
-error.h
-       - add __attribute__ to extern declaration of itrace (even though the
-         function isn't defined in released versions of bash)
-
-bashansi.h
-       - include <strings.h> if HAVE_STRINGS_H is defined, to get any extra
-         function declarations provided therein
-
-copy_cmd.c
-       - fix typo in forward declaration for copy_arith_for_command
-
-lib/malloc/stats.c
-       - make the accumulators in _print_malloc_stats be `unsigned long'
-         instead of `int'
-
-externs.h, sig.h
-       - add `__noreturn__' gcc attribute to exit_shell and jump_to_top_level
-         declarations
-
-lib/sh/mailstat.c, support/bashversion.c
-       - include <bashansi.h> for some string function declarations
-
-lib/malloc/shmalloc.h
-       - added extern declarations of functions that do malloc debugging
-
-lib/readline/{isearch,readline,vi_mode}.c
-       - make sure we index into _rl_keymap with a non-negative index
-
-parse.y
-       - make sure we index into sh_syntaxtab with a non-negative index
-
-lib/readline/vi_mode.c
-       - bound the vi_mark_chars array with the number of characters between
-         'a' and 'z' rather than using a fixed amount
-       - don't use _rl_lowercase_p when deciding whether the char read by
-         rl_vi_set_mark is a valid mark; just use 'a' <= char <= 'z'
-
-lib/readline/chardefs.h
-       - conditionally include memory.h and strings.h as in general.h
-       - replace ISASCII with IN_CTYPE_DOMAIN like other GNU software
-       - add defines for ISPRINT(c), ISLOWER(c) and ISUPPER(c)
-       - fix defines for _rl_lowercase_p, _rl_uppercase_p, _rl_digit_p,
-         _rl_pure_alphabetic, ALPHABETIC, _rl_to_upper, _rl_to_lower,
-         and _rl_isident to work on systems with signed chars
-
-include/chartypes.h
-       - replace ISASCII with IN_CTYPE_DOMAIN like other GNU software
-
-lib/sh/{strcasecmp,strtod,strtol}.c
-       - don't pass possibly-negative characters to tolower() or toupper()
-
-lib/glob/strmatch.c
-       - don't bother testing for isupper in FOLD; rely on TOLOWER macro
-         from <chartypes.h> to do it
-       - don't use local definitions of isblank, et al.; rely on macros
-         from <chartypes.h>
-
-lib/readline/{display,readline}.c, mksyntax.c
-       - use new ISPRINT macro instead of isprint()
-
-builtins/{kill.def,mkbuiltins.c},{error,execute_cmd,jobs,nojobs,subst}.c
-       - don't assume that a pid_t fits into an int for printing and other
-         uses
-
-variables.[ch]
-       - the unused put_gnu_argv_flags_into_env now takes a `long' pid
-         argument
-
-configure.in, config.h.in
-       - call AC_STRUCT_ST_BLOCKS, define HAVE_STRUCT_STAT_ST_BLOCKS if found
-       - check for strtoull(), define HAVE_STRTOULL if found
-       - check for uintmax_t, define to `unsigned long' if not found
-
-lib/sh/mailstat.c
-       - don't use st_blocks member of struct stat unless
-         HAVE_STRUCT_STAT_ST_BLOCKS is defined; otherwise use the st_nlink
-         field to return the total number of messages in a maildir-style
-         mail directory
-
-general.h,{alias,expr,general,subst,variables}.c
-builtins/{printf,read}.def
-lib/readline/{bind,complete,nls}.c
-lib/sh/{pathcanon,pathphys,shquote,snprintf,strindex,strtod,strtol,strtrans}.c
-       - cast args to ctype macros to unsigned char for systems with signed
-         chars; other fixes for signed chars
-
-lib/sh/{fmtullong,strtoull.c}
-       - new files, more support for `long long'
-
-Makefile.in, lib/sh/Makefile.in
-       - make fmtullong.o and strtoull.o part of libsh
-
-lib/sh/itos.c
-       - remove local copy of fmtlong; use fmtulong instead
-       - new functions: uitos, uinttostr work on `unsigned long'
-
-lib/sh/snprintf.c
-       - fixes to make `unsigned long long' work (%llu)
-       - fixes to make unsigned formats not print the sign when given
-         an unsigned long that is greater than LONG_MAX
-
-externs.h
-       - extern declarations for fmtulong, fmtulloing, strtoull
-       - extern declarations for uitos, uinttostr
-
-                                  10/16
-                                  -----
-configure.in
-       - move header checks before function checks
-       - move c compiler tests before header checks
-       - check for <inttypes.h> with BASH_HEADER_INTTYPES
-       - change type checks for intmax_t, uintmax_t to not attempt to
-         include <stdint.h>
-       - check for strtoimax, strtoumax, strtoll, strtol, strtoull, strtoul
-         with BASH_CHECK_DECL (for declarations in header files) and
-         AC_REPLACE_FUNCS (for availability and LIBOBJS substitution)
-       - remove check for have_long_long around sizeof check for long long
-         (since autoconf will give it a size of 0 if the type isn't found)
-
-config.h.in
-       - add a define for HAVE_INTTYPES_H
-       - add a define for HAVE_UNSIGNED_LONG_LONG
-       - add defines for HAVE_STRTOIMAX, HAVE_STRTOUMAX, HAVE_STRTOLL
-
-aclocal.m4
-       - new func, BASH_HEADER_INTTYPES, which just calls AC_CHECK_HEADERS
-         on <inttypes.h>; separate so it can be AC_REQUIREd
-       - AC_REQUIRE([BASH_HEADER_INTTYPES]) in BASH_CHECK_TYPE
-       - include <inttypes.h> in BASH_CHECK_TYPE if HAVE_INTTYPES_H is
-         defined
-       - change AC_DEFINE to AC_DEFINE_UNQUOTED in BASH_CHECK_TYPE
-       - new `long long' checking macros:  BASH_TYPE_LONG_LONG and
-         BASH_TYPE_UNSIGNED_LONG_LONG
-       - new BASH_CHECK_DECL 
-
-lib/sh/{strto[iu]max,strtoll}.c, lib/sh/Makefile.in, Makefile.in
-       - new files
-
-externs.h
-       - extern declarations for strtoll, strtoimax, strtoumax
-
-lib/malloc/alloca.c
-       - include <bashtypes.h> for size_t
-
-builtins/printf.def
-       - new functions: getllong, getullong, getintmax, getuintmax; return
-         long long, unsigned long long, intmax_t, uintmax_t respectively
-       - builtin printf now handles `ll' and `j' length modifiers directly
-
-lib/sh/Makefile.in
-       - use LIBOBJS to decide whether or not the strto* functions are
-         needed
-
-                                  10/17
-                                  -----
-configure.in
-       - call AC_REPLACE_FUNCS(rename)
-       - move getcwd, strpbrk, strcasecmp, strerror, strtod
-         from AC_CHECK_FUNCS to AC_REPLACE_FUNCS
-       - only call BASH_FUNC_GETCWD if $ac_func_getcwd == "yes"
-       - call BASH_CHECK_SYS_SIGLIST
-       - if we don't have vprintf but have _doprnt, call AC_LIBOBJ(vprint)
-
-lib/sh/Makefile.in
-       - remove rename, getcwd, inet_aton, strpbrk, strcasecmp, strerror,
-         strtod, vprint from OBJECTS; picked up from LIBOBJS
-
-aclocal.m4
-       - change BASH_FUNC_GETCWD to call AC_LIBOBJ(getcwd) if the libc
-         getcwd(3) calls popen(3)
-       - change BASH_FUNC_INET_ATON to call AC_LIBOBJ(inet_aton) if it's
-         not found in libc or as a #define even with the special includes
-       - BASH_KERNEL_RLIMIT_CHECK -> BASH_CHECK_KERNEL_RLIMIT
-       - BASH_DEFAULT_MAILDIR -> BASH_SYS_DEFAULT_MAILDIR
-       - BASH_JOB_CONTROL_MISSING -> BASH_SYS_JOB_CONTROL_MISSING
-       - BASH_REINSTALL_SIGHANDLERS -> BASH_SYS_REINSTALL_SIGHANDLERS
-       - BASH_SIGNAL_CHECK -> BASH_SYS_SIGNAL_VINTAGE
-       - BASH_DUP2_CLOEXEC_CHECK -> BASH_FUNC_DUP2_CLOEXEC_CHECK
-       - BASH_PGRP_SYNC -> BASH_SYS_PGRP_SYNC
-       - BASH_RLIMIT_TYPE -> BASH_TYPE_RLIMIT
-       - BASH_FUNC_PRINTF -> BASH_DECL_PRINTF
-       - BASH_FUNC_SBRK_DECLARED -> BASH_DECL_SBRK
-       - BASH_MISC_SPEED_T -> BASH_CHECK_SPEED_T
-       - BASH_CHECK_SOCKLIB -> BASH_CHECK_LIB_SOCKET
-       - new macro, BASH_CHECK_SYS_SIGLIST, encapsulates all the checks for
-         sys_siglist, _sys_siglist, and strsignal(), sets SIGLIST_O to
-         siglist.o if appropriate
-
-Makefile.in
-       - use SIGLIST_O variable to decide whether or not we need siglist.o
-
-{execute_cmd,subst}.c
-       - change a couple of instances of ISDIGIT to DIGIT, where we really,
-         really only want ascii digits
-
-ansi_stdlib.h
-       - don't need a declaration for atol()
-
-                                  10/18
-                                  -----
-
-aclocal.m4
-       - new macro, BASH_FUNC_PRINTF_A_FORMAT, checks for printf support
-         for %a, %A conversion specifiers, defines HAVE_PRINTF_A_FORMAT
-         if successful
-
-configure.in
-       - call AC_CHECK_FUNCS for isascii
-       - call BASH_FUNC_PRINTF_A_FORMAT
-
-config.h.in
-       - add a define for HAVE_ISASCII
-       - add a define for HAVE_PRINTF_A_FORMAT
-
-lib/sh/snprintf.c
-       - for long double output, fall back to sprintf using ldfallback()
-         function for floating point formats
-       - support %a, %A using dfallback() or ldfallback() if
-         HAVE_PRINTF_A_FORMAT is defined
-       - fix bug in vasprintf that returned wrong value in its first
-         argument if the buffer holding the result string got reallocated
-       - fixed PUT_CHAR macro to increment the counter even if we've
-         exceeded the buffer size, for the return value from
-         vsnprintf/snprintf
-       - fix vsnprintf_internal to not use counter < length as a loop
-         condition, but always process the entire format string (for
-         the return value from vsnprintf/snprintf)
-
-builtins/printf.def
-       - support %a, %A if HAVE_PRINTF_A_FORMAT is defined
-
-include/typemax.h
-       - new file, with the TYPE_MAXIMUM stuff that's duplicated in several
-         files in lib/sh
-
-lib/sh/{fmtulong,strtol,snprintf}.c
-       - include <typemax.h> instead of having the definitions in each file
-
-lib/sh/Makefile.in
-       - updated dependencies for typemax.h
-
-                                  10/22
-                                  -----
-configure.in
-       - call AC_CHECK_FUNCS on ctype.h functions/macros that bash redefines
-         in chartypes.h
-
-config.h.in
-       - defines for HAVE_IS{ASCII,BLANK,GRAPH,PRINT,SPACE,XDIGIT}
-
-include/chartypes.h, lib/glob/strmatch.c, lib/readline/chardefs.h
-       - don't redefine some is* ctype macros/functions if HAVE_ISXXX is
-         defined (meaning that an appropriate function, but not a macro,
-         exists)
-
-lib/sh/strtrans.c
-       - new function, ansic_shouldquote, returns 1 if argument string
-         contains non-printing chars that should be quoted with $'...'
-
-externs.h
-       - new declaration for ansic_shouldquote()
-
-variables.c
-       - change print_var_value to ansi C quote the string if we're not in
-         posix mode and the variable's value contains non-printing chars,
-         to use the regular shell single quoting if the value contains
-         shell meta-characters, and to just output the string otherwise
-
-lib/sh/shquote.c
-       - add `break' to `case '~':' to avoid fallthrough and extra test
-
-doc/bashref.texi
-       - note that in POSIX mode, `set' displays variable values that
-         include nonprinting characters without quoting, unless they
-         contain shell metacharacters
-
-builtins/printf.def, lib/sh/snprintf.c
-       - handle `F' conversion specifier as equivalent to 'f'
-
-parse.y, {nojobs,variables}.c
-       - a couple of cleanups for when building a minimal configuration
-
-nojobs.c
-       - new function: stop_making_children(), just sets
-         already_making_children to 0 (like stop_pipeline)
-
-subst.c
-       - call stop_making_children from subst.c:command_substitute if
-         JOB_CONTROL is not defined.  This fixes the bug where the wrong
-         process is waited for (and its status returned) when using
-         command substitution in a null command in a shell function
-
-builtins/printf.def
-       - new variable `tw' used to keep track of the total number of
-         characters written by a single call to `printf' -- to be
-         used for the `%n' conversion, which will be added later.  It
-         gets reset each time we reuse the format string, which is what
-         ksh93 seems to do
-
-                                  10/23
-                                  -----
-variables.c
-       - new function, bind_var_to_int (char *var, long val)
-
-variables.h
-       - extern declaration for bind_var_to_int
-
-lib/sh/netopen.c
-       - use gai_strerror() for error messages when getaddrinfo() fails
-       - use PF_INET if DEBUG is defined, since IPv6 doesn't work for me
-
-Makefile.in
-       - pass DEBUG=${DEBUG} down to makes in some subdirectories
-
-{builtins,lib/{glob,sh}}/Makefile.in
-       - append ${DEBUG} to LOCAL_CFLAGS value, passed by top-level Makefile
-
-builtins/printf.def
-       - added support for %n format conversion char (number of chars printed
-         so far from current format string)
-
-                                  10/24
-                                  -----
-variables.c
-       - if posixly_correct is set, the default value of $MAILCHECK is 600
-       - use legal_number instead of atoi in adjust_shell_level
-       - treat non-numeric assignments to SECONDS as 0 in assign_seconds
-       - new function, init_funcname_var; sets FUNCNAME as a dynamic variable
-         if it's not set in the initial environment
-       - new function, init_groups_var; sets GROUPS as a dynamic array
-         variable if it's not set in the initial environment
-       - new function, init_dirstack_var; sets DIRSTACK as a dynamic array
-         variable if it's not set in the initial environment
-       - new function, init_seconds_var; sets SECONDS as a dynamic
-         variable using any valid integer value in the initial environment
-         as the initial value, as if an assignment had been performed
-       - call init_funcname_var, init_groups_var, init_dirstack_var,
-         init_seconds_var from initialize_dynamic_variables
-       - non-numeric values assigned to LINENO are treated as 0
-       - change initialize_shell_variables to not auto-export PATH or TERM
-       - change set_home_var to not auto-export HOME
-       - change set_shell_var to not auto-export SHELL
-       - broke the code that sets HOSTNAME, HOSTTYPE, MACHTYPE, OSTYPE
-         out into a separate function, set_machine_vars; none of those
-         variables are auto-exported
-       - bash no longer un-exports SSH_CLIENT or SSH2_CLIENT
-
-shell.c
-       - changed isnetconn() to check SSH_CLIENT and SSH2_CLIENT only if
-         SSH_SOURCE_BASHRC is defined in config-top.h
-
-config-top.h
-       - added a commented-out definition for SSH_SOURCE_BASHRC
-
-                                  10/25
-                                  -----
-
-Makefile.in
-       - changed RELSTATUS to `rc1' (release candidate 1)
-
-                                  10/29
-                                  -----
-locale.c
-       - fixed an `=' vs. `==' typo in set_locale_var when parsing
-         LC_NUMERIC
-
-doc/{bash.1,bashref.texi}
-       - document what bash does with $POSIXLY_CORRECT
-
-doc/builtins.1
-       - some updates
-
-builtins/psize.sh
-       - some mktemp(1) changes
-
-lib/readline/readline.c
-       - change rl_backward to check for rl_point < 0 and reset to 0 if so
-
-lib/readline/util.c
-       - don't compile in _rl_strpbrk if HAVE_STRPBRK is defined
-
-lib/readline/rlprivate.h
-       - remove extern declaration of _rl_strpbrk
-
-lib/readline/rldefs.h
-       - #define _rl_strpbrk as strpbrk if HAVE_STRPBRK is define, otherwise
-         add extern declaration of _rl_strpbrk from rlprivate.h
-
-{mailcheck,shell,variables}.c
-       - make sure to include posixtime.h to get any prototype for time(3)
-         in scope
-
-{array,eval,execute_cmd,mksyntax,subst}.c, parse.y
-builtins/common.c
-lib/sh/pathcanon.c
-       - a few changes as the result of `gcc -Wall' patches from solar
-         designer
-
-builtins/read.def, parse.y
-       - change some calls to free() to xfree()
-
-builtins/set.def
-       - make sure unset_builtin() resets unset_array to 0 each time through
-         the loop, because it's set (and used) depending on the current
-         argument
-
-shell.h
-       - new define, USE_VAR, to force the compiler to not put a particular
-         variable in a register -- helpful if registers are not restored
-         by setjmp/longjmp
-
-builtins/{evalfile.c,{read,wait}.def}, {eval,execute_cmd,shell,test}.c
-       - use USE_VAR for some variables
-
-subst.c
-       - fixed a case in expand_word_internal where a NULL pointer could
-         have been passed to free() (though free() should ignore it)
-       - fixed a case at the end of expand_word_internal where LIST could
-         have been used uninitialized (it makes gcc happy, though it
-         doesn't happen in practice)
-
-test.c
-       - give test_syntax_error(), beyond(), and integer_expected_error()
-         the `__noreturn__' attribute for gcc
-
-unwind_prot.c
-       - in clear_unwind_protect_list(), convert `flags' to `long' (via
-         assignment to a `long' variable) before casting to `char *', in
-         case pointers and longs are 64 bits and ints are 32 (makes no
-         difference on 32-bit machines)
-
-                                  10/30
-                                  -----
-print_cmd.c
-       - fixed cprintf to avoid gcc warning about assigning const pointer
-         to non-const (discarding type qualifier)
-
-{make_cmd,pcomplete,test}.c,parse.y
-       - some minor changes to shut up gcc warnings
-
-lib/sh/tmpfile.c
-       - fixed sh_mktmpfp to avoid file descriptor leaks in the case that
-         sh_mktmpfd succeeds but fdopen fails for some reason
-       - change sh_mktmpfd to use the same scheme for computing `filenum'
-         as sh_mktmpname
-       - change get_sys_tmpdir to prefer P_tmpdir if P_tmpdir is defined
-       - changed sh_mktmpname and sh_mktmpfd to avoid trying to assign to
-         `nameroot' if `nameroot == 0' (duh)
-       - add code to sh_mktmpfd to use mkstemp(3) if USE_MKSTEMP is defined
-       - add code to sh_mktmpname to use mktemp(3) if USE_MKTEMP is defined
-
-support/{fixlinks,mkclone}
-       - use mktemp if it's available for the symlink test
-       - use $TMPDIR instead of hardcoding /tmp; default to /tmp
-       - use a better filename for the symlink test instead of `z'
-
-support/bashbug.sh
-       - more changes inspired by a patch from solar designer
-
-lib/malloc/Makefile.in
-       - new target `alloca', which builds libmalloc.a with alloca.o only
-         (for systems without alloca that are configured --without-bash-malloc)
-
-configure.in
-       - if we don't have a working alloca and are not configured to build
-         the bash malloc library, make a malloc library containing only
-         alloca.o
-
-aclocal.m4
-       - slight change to RL_LIB_READLINE_VERSION to deal with minor version
-         numbers with a letter appended (like 4.2a)
-
-                                  10/31
-                                  -----
-doc/{bash.1,bashref.texi}
-       - slight change to note that only interactive shells resend a SIGHUP
-         to all jobs before exiting
-
-externs.h
-       - declare strto[ui]max only if NEED_STRTOIMAX_DECL is defined.  This
-         keeps picky compilers from choking because intmax_t is not defined
-         (MacOS X 10.1)
-
-builtins/printf.def
-       - #define NEED_STRTOIMAX_DECL before including shell.h
-
-                                  11/1
-                                  ----
-general.c
-       - check in bash_tilde_expand() for an unquoted tilde-prefix; don't
-         bother passing the string to tilde_expand unless the prefix is
-         unquoted
-
-shell.c
-       - fix a problem with $LINENO when executing commands supplied with
-         the -c invocation option when ONESHOT is defined
-
-[bash-2.05a-rc1 frozen]
-
-builtins/printf.def
-       - fix the %n conversion to require that the variable name supplied
-         be a valid shell identifier
-
-variables.c
-       - improve random number generator slightly by using the upper 16
-         bits of the running random number instead of the lower 16, which
-         are incrementally more random
-
-                                  11/2
-                                  ----
-configure.in
-       - if RL_INCLUDEDIR ends up being /usr/include, don't put
-         -I$(RL_INCLUDEDIR) into CFLAGS
-
-                                  11/5
-                                  ----
-doc/{bash.1,bashref.texi}
-       - correct description of POSIXLY_CORRECT to note that the shell enters
-         posix mode *before* the startup files are read if POSIXLY_CORRECT
-         is in the initial environment
-
-variables.c
-       - fix function prologues for init_dirstack_var and init_groups_var
-         to agree with caller (no arguments)
-
-jobs.c
-       - fix forward function declarations for pipe_read and pipe_close
-
-subst.c
-       - removed `inline' attribute from skip_double_quoted because it can
-         potentially be called recursively
-
-bashline.c
-       - quick fix to bashline.c:attempt_shell_completion programmable
-         completion code to just punt if the end of the command word found
-         by find_cmd_end is <= the start found by find_cmd_start (the bug
-         is probably in find_cmd_start -- fix later)
-
-pcomplete.c
-       - fix gen_matches_from_itemlist to return if the stringlist is null
-         after any cleaning or initialization, before trying to use it
-       - fix GEN_COMPS to only bother to try to append the STRINGLIST
-         returned by gen_matches_from_itemlist to `glist' if it's non-NULL
-
-lib/sh/stringlist.c
-       - make copy_stringlist return NULL if the STRINGLIST * passed as an
-         argument is NULL
-       - make append_stringlist call copy_stringlist only if M2 is non-NULL;
-         otherwise just return NULL if m1 is NULL
-       - make word_list_to_stringlist return 0 immediately if the passed
-         LIST argument is NULL
-       - make realloc_stringlist call alloc_stringlist if the passed
-         STRINGLIST argument (`sl') is 0, just like realloc calls malloc
-
-subst.c
-       - in skip_to_delim(), if we have an unclosed ${, and it's at the end
-         of the string (string[i] == '{', string[i+1] == '{' and
-         string[i+2] == 0, return si (i +2) immediately without bothering
-         to call extract_dollar_brace_string or extract_delimited_string
-       - in skip_to_delim(), if string[i] is 0 after a call to
-         extract_dollar_brace_string or extract_delimited_string (meaning we
-         have an unclosed ${ or other expansion, return i immediately without
-         doing a `continue' (which will increment i past the end of string)
-       - in split_at_delims, don't increment te by 1 if it's pointing to a
-         delimiter.  this has the effect of skipping the first delimiter
-         char in a possibly multi-character delimiter, and ignoring
-         single-char delimiters like `>'
-
-configure.in
-       - use AC_CHECK_MEMBERS([struct stat.st_blocks]) instead of a call to
-         AC_STRUCT_ST_BLOCKS to avoid configure changing LIBOBJS if the test
-         fails
-
-general.c
-       - introduce two new variables: bash_tilde_{prefixes,suffixes}, set
-         to the additional prefixes and suffixes bash wants to pass to the
-         tilde expansion code (reserved for post-bash-2.05a fix)
-
-aclocal.m4
-       - add missing `test' in BASH_CHECK_SYS_SIGLIST
-
-                                  11/7
-                                  ----
-lib/readline/vi_mode.c
-       - fix rl_vi_goto_mark to explicitly check that the desired mark is
-         between 'a' and 'z', since some locales have lowercase letters
-         outside that range, which could cause a negative subscript
-
-include/chartypes.h
-       - remove superfluous `#undef ISASCII'
-
-lib/sh/strto[iu]max.c
-       - changes from Paul Eggert to work around buggy compilers and catch
-         configuration errors at compile time
-
-aclocal.m4
-       - new macro, BASH_C_LONG_DOUBLE, identical to AC_C_LONG_DOUBLE but
-         with a fix for Irix 5.3 (not called, since I'm not sure it's the
-         right thing to do -- the C standard allows double and long double
-         to be the same size)
-
-lib/sh/snprintf.c
-       - only try to write the trailing NUL in vsnprintf_internal if
-         data->length is >= 0, since if it's not, we probably don't have
-         a buffer
-
-Makefile.in
-       - changed RELSTATUS to `release'
-
-                                  11/8
-                                  ----
-lib/sh/strtol.c
-       - make sure chars passed to toupper are cast to unsigned
-
-unwind_prot.c
-       - change clear_unwind_protect_list to not require a cast from `int'
-         to `char *'
-
-lib/readline/chardefs.h
-       - make _rl_digit_p succeed only for ascii digits, since that's what
-         most callers assume
-
-                                  11/13
-                                  -----
-doc/bashref.texi
-       - added `ERR' trap and [-+]O invocation option to section listing
-         differences from the Bourne shell
-
-                                  11/15
-                                  -----
-[bash-2.05a released]
-
-                                  11/19
-                                  -----
-include/stdc.h
-       - new define, INLINE, defined as `inline' for gcc and empty otherwise
-
-subst.c
-       - make skip_double_quoted, sub_append_string have INLINE attribute
-
-trap.c
-       - use BASH_NSIG as upper limit for signal names in signal_name()
-
-lib/readline/bind.c
-       - use RL_COMMENT_BEGIN_DEFAULT in output for rl-comment-begin value
-
-error.c
-       - fix sys_error to save value of errno around calls to fprintf
-
-doc/Makefile.in
-       - added rules to create PDF files from postscript and dvi input
-
-MANIFEST.doc
-       - added {article,bash,bashref,rose94}.pdf
-
-doc/bash.1
-       - rearranged some `.PD 0' and `.TP' directives so man2html will
-         handle them better (shouldn't affect groff output)
-
-support/man2html.c
-       - small fix to handle quoted string arguments to directives like
-         `.BR' without mangling the output
-
-                                  11/20
-                                  -----
-{arrayfunc,variables}.c
-       - changed calling sequence for dynamic array variable `assign'
-         functions to (SHELL_VAR *self, char *value, arrayind_t ind)
-       - changed calling sequence for dynamic variable assign functions
-         to the same as array variable assign_func.  Now this can be
-         prototyped
-
-variables.h
-       - the assign_func member of a `struct variable' is now of type
-         `sh_var_assign_func_t', which is prototyped
-       - the dynamic_value member of a `struct variable' is now of type
-         `sh_var_value_func_t', which is prototyped
-
-variables.c
-       - changed to use `sh_var_assign_func_t' and `sh_var_value_func_t'
-
-builtins/cd.def
-       - when in posix mode, if the new directory name formed by PWD and
-         the argument passed by the user cannot be canonicalized, and the
-         -P option has not been supplied, return failure immediately
-       - if canonicalization failed, but the fallback to the directory
-         name specified by the user succeeds, reset the current working
-         directory
-
-lib/readline/{input.c,rlprivate.h}
-       - renamed rl_unget_char to _rl_unget_char; made library global
-
-lib/readline/{{bind,readline}.c,{keymaps,rlprivate}.h}
-       - support for `key subsequences'; allows a key sequence and a function
-         mapped to a subsequence of that key sequence.  Primarily to allow
-         arrow keys to be bound in readline vi insert mode, while preserving
-         the ESC function to switch to command mode.
-
-lib/readline/{input.c,rlprivate.h}
-       - new function, _rl_input_queued(T), does a check with select or
-         FIONREAD with a timeout of `T' (which is generally 0)
-
-lib/readline/readline.c
-       - change _rl_dispatch_subseq to test for input in the queue if we
-         get ESC while in vi insertion mode if the keymap entry type for
-         ESC is ISKMAP.  If _rl_input_queued returns non-zero, we assume
-         that an arrow key sequence has been pressed and go ahead with the
-         subsequence.  If it returns zero, we assume that the user pressed
-         ESC to switch into command mode, and dispatch to that right away.
-         This avoids forcing the user to press another key before switching
-         into command mode
-
-                                  11/21
-                                  -----
-lib/readline/readline.c
-       - bind common arrow key sequences in vi insertion keymap
-
-lib/readline/terminal.c
-       - bind termcap definition's arrow keys in vi insertion keymap
-
-lib/readline/bind.c
-       - check for rl_vi_movement_mode in _rl_bind_if_unbound, so
-         binding the arrow keys can work
-
-lib/readline/readline.c
-       - since _rl_bind_if_unbound does the check of what's currently
-         bound to the key sequence, the check in bind_arrow_keys_internal
-         was redundant
-       - bind_arrow_keys_internal now takes a Keymap argument and handles
-         saving and restoring _rl_keymap; changed bind_arrow_keys
-         accordingly
-
-builtins/fc.def
-       - fix from Paul Eggert to substitute the nearest history number in
-         range if an out-of-range value is supplied.  POSIX requires this
-
-lib/sh/pathcanon.c
-       - fix from Corrina Vinschen for the special `cygdrive' prefix on
-         Cygwin
-
-bashhist.c
-       - split the history adding code into more pieces:
-           check_history_control (char *line) checks LINE against the value
-           of HISTCONTROL, returning 1 if LINE should be saved and 0 if not
-
-           check_add_history (char *line) calls check_history_control and
-           history_should_ignore (line) and saves the line with
-           bash_add_history if the checks indicate that it should be saved
-
-           maybe_add_history just calls check_add_history to set the value
-           of first_line_saved
-
-bashhist.h
-       - extern declaration for check_add_history()
-
-shell.c
-       - don't call load_history() from the interactive shell startup
-         code if history_lines_this_session is > 0, indicating that we've
-         already saved some lines in the history and that we probably
-         don't want to overwrite them
-
-builtins/history.def
-       - call check_add_history from push_history, so `history -s xx'
-         works even when in a compound command whose first line has not
-         been saved.  (Caveat:  in a compound command when the first
-         line has been saved, the line supplied to history -s will become
-         part of the compound command's history entry.  Of course, the
-         delete_history call could remove the compound command from the
-         history entirely)
-
-bashline.c
-       - use sh_makepath instead of xmalloc/sprintf in
-         command_word_completion_function
-
-lib/readline/complete.c
-       - get_y_or_n now takes an int FOR_PAGER argument; caller changed
-         If FOR_PAGER is non-zero, get_y_or_n returns appropriate values
-         for a more-like pager:  `newline' or `return' return 2; `q' or
-         `Q' return 0
-       - there is now a mini internal more-like pager for displaying a
-         list of completions that exceeds the screen height (new function
-         _rl_internal_pager, called from rl_display_match_list)
-
-                                  11/24
-                                  -----
-command.h
-       - new flag, W_TILDEEXP, says to do tilde expansion on an
-         assignment word
-
-execute_cmd.c
-       - fix_assignment_words now sets W_TILDEEXP for assignment word
-         arguments to `assignment builtins'
-
-general.c
-       - bash_tilde_expand now takes a second argument indicating whether
-         or not it's being invoked in an `assignment context'
-
-general.h
-       - change extern declaration for bash_tilde_expand
-
-{bashline,execute_cmd,findcmd,general,variables}.c
-builtins/evalfile.c
-lib/sh/makepath.c
-       - fix callers of bash_tilde_expand appropriately
-
-subst.c
-       - fix callers of bash_tilde_expansion appropriately
-       - add (currently commented-out) code that would tilde expand assignment
-         statement arguments to assignment builtins (W_TILDEEXP flag set)
-         even when the shell is in posix mode
-
-bashline.c
-       - fix attempt_shell_completion to turn off
-         rl_filename_completion_desired when doing command name completion,
-         so no slash gets appended to the name if there happens to be a
-         directory with the same name in the current directory
-
-                                  11/26
-                                  -----
-lib/readline/rltech.texinfo
-       - a couple of additions to the rl_stuff_char description
-
-parse.y
-       - turn off echo_input_at_read in parse_string_to_word_list, so `set -v'
-         doesn't give extra lines of output when doing compound array
-         assignment
-
-subst.c
-       - fix split_at_delims to handle skipping over a `\n' if it's a
-         delimiter (use spctabnl(c) instead of whitespace(c))
-
-                                  11/27
-                                  -----
-support/config.{guess,sub}
-       - updated (with bash changes) to latest version from gnu.org
-
-sig.h
-       - add prototype for set_signal_handler declaration
-
-builtins/setattr.def
-       - add prototype to extern declaration of declare_builtin
-
-builtins/times.def
-       - add no_options call, since times takes no options
-
-lib/sh/spell.c
-       - add prototypes to forward declarations for midist and spdist
-
-lib/sh/strtrans.c
-       - add explicit int return type to ansic_shouldquote declaration
-
-lib/readline/rldefs.h, lib/readline/{macro,readline,util,undo}.c
-       - move define for SWAP to rldefs.h, removed from various C files
-
-lib/readline/vi_mode.c
-       - removed define for exchange(), changed to use SWAP instead
-
-lib/readline/bind.c
-       - added some static forward function declarations
-       - find_boolean_var, find_string_var now take a `const char *' argument
-
-lib/readline/signals.c
-       - added static forward declaration for rl_maybe_set_sighandler
-
-lib/readline/readline.c
-       - add some common key bindings for the HOME and END keys in
-         bind_arrow_keys_internal
-
-lib/readline/terminal.c
-       - fetch the `@7' termcap string; it's sent by the END key
-       - attempt to bind the terminal's END key to rl_end_of_line in
-         bind_termcap_arrow_keys; I don't know why I was using `kH'
-         instead of `@7'
-
-doc/builtins.1
-       - remove `case', `for', `if', `until', `while' from NAME section;
-         those are not shell builtins
-
-                                  11/28
-                                  -----
-stringlib.c
-       - new function, find_token_in_alist, takes a token value and an
-         ALIST argument, and returns the string correspoinding to the
-         token if found in the alist
-
-externs.h
-       - new extern declaration for find_token_in_alist()
-
-subst.c
-       - string_list_internal is no longer static
-
-subst.h
-       - new extern declaration for string_list_internal()
-
-parse.y
-       - new alist array of other tokens returned by read_token which are
-         not reserved words in word_token_alist[]
-       - reworked error reporting:  new functions print_offending_line,
-         which prints the line containing the syntax error,
-         error_token_from_token, which takes the current token and tries to
-         figure out its textual representation, and error_token_from_text,
-         which does the old job of finding the bad token by analyzing the
-         text of shell_input_line at the current index
-       - report_syntax_error now tries to figure out the token that caused
-         the syntax error by first looking at current_token and falling
-         back to the old method of textual analysis if that fails
-       - report_syntax_error doesn't say the token resulting from the textual
-         analysis of the input line is an `unexpected token'; it just
-         says there is a `syntax error near xxx'
-       - changed conditional command error reporting to use the value
-         returned by error_token_from_token if it's not null instead of
-         just using the token value in the message, since current_token
-         ends up being set to -1, and the text of the message from
-         report_syntax_error might not be exactly right
-       - change parse_string_to_word_list to set current_token to the
-         offending token returned by read_token before calling yyerror()
-         to make the error reporting do the right thing
-
-aclocal.m4
-       - fixed typo in BASH_CHECK_LIB_TERMCAP
-
-configure.in
-       - add check for isinf(3); define HAVE_ISINF_IN_LIBC if found
-
-config.h.in
-       - add define for HAVE_ISINF_IN_LIBC
-
-lib/sh/snprintf.c
-       - check for Inf and NaN, using isinf and isnan if they're found in
-         libc
-       - use the current locale for thousands separator and decimal point
-       - recognize "'" flag; not implemented yet
-       - fix for snprintf/vsnprintf with length of 0 and string argument of
-         0 with non-zero length
-
-builtins/read.def
-       - TMOUT is now the default timeout for `read' (and select) if set,
-         like ksh93 when reading from the terminal
-       - edit_line (called by read -e) now just does readline's filename
-         completion by setting rl_attempted_completion_function to NULL,
-         since e.g., doing command completion for the first word on the
-         line wasn't really useful
-
-execute_cmd.c
-       - changed select_command to return failure status if select_query
-         returns NULL, indicating that read_builtin returned
-         EXECUTION_FAILURE
-
-doc/{bash.1,bashref.texi}
-       - documented new TMOUT behavior 
-       - slight change to the description of the test `-ef' option
-
-doc/bashref.texi
-       - added item to posix mode section describing failure behavior of
-         cd when invoked in logical mode and the pathname formed by
-         combining $PWD and the directory argument does not refer to an
-         existing directory
-
-                                  11/29
-                                  -----
-execute_cmd.c
-       - fix execute_function to call dispose_function_env after
-         merge_function_env if the shell is in posix mode (fixes debian
-         bash bug #117673)
-
-lib/readline/readline.c
-       - rl_forward -> rl_forward_char; rl_forward function for compatibility
-       - rl_backward -> rl_backward_char; rl_forward function for
-         compatibility
-       - new functions, rl_forward_byte, rl_backward_byte, for future use
-
-lib/readline/readline.h
-       - extern declarations for rl_forward_char, rl_backward_char,
-         rl_forward_byte, rl_backward_byte
-
-lib/readline/{emacs_keymap,funmap,vi_keymap,vi_mode
-       - rl_forward -> rl_forward_char
-       - rl_backward -> rl_backward_char
-
-lib/readline/funmap.c
-       - new bindable names, `backward-byte' and `forward-byte'
-
-aclocal.m4
-       - new function, BASH_CHECK_MULTIBYTE, encapsulates checks for
-         multibyte code
-
-config.h.in
-       - add necessary defines for multibyte include files and functions
-
-configure.in
-       - add call to BASH_CHECK_MULTIBYTE
-
-config-bot.h
-       - add code to define HANDLE_MULTIBYTE if prerequisites are met
-
-lib/sh/xstrchr.c
-       - new file, xstrchr() is strchr(3) that handles multibyte characters
-
-bashhist.c
-       - first_line_saved -> current_command_first_line_saved; variable is
-         now global
-
-bashhist.h
-       - extern declaration for current_command_first_line_saved
-
-                                  11/30
-                                  -----
-bashhist.c
-       - break the code that actually calls add_history out of
-         bash_add_history into a new function, really_add_history;
-         bash_add_history now calls really_add_history
-       - check_add_history takes a second `force' argument telling it
-         whether to call bash_add_history (force == 0) or really_add_history
-         (force != 0)
-
-builtins/history.def
-       - in push_history, call delete_last_history if the current command
-         has more than one line, the first line was saved, and
-         command-oriented history is active.  This takes care of deleting
-         the right history element if `history -s' is used within a
-         compound or multiline command
-       - in push_history, call check_add_history with second argument of 1
-         to skip check of current_command_line_count and add the arguments
-         to history -s as a single separate history entry
-
-                                  12/3
-                                  ----
-lib/readline/complete.c
-       - append a slash to completed names which are symlinks to directories
-         if the new variable _rl_complete_mark_symlink_dirs is non-zero
-
-lib/readline/rlprivate.h
-       - extern declaration for _rl_complete_mark_symlink_dirs
-
-lib/readline/bind.c
-       - new bindable variable, `mark-symlinked-directories', mirrors the
-         value of _rl_complete_mark_symlink_dirs
-
-doc/bash.1, lib/readline/doc/{readline.3,rluser.texinfo}
-       - documented new `mark-symlinked-directories' variable
-
-                                  12/4
-                                  ----
-variables.[ch]
-       - set_pipestatus_array now takes a second argument with the number
-         of processes in the array
-       - changed set_pipestatus_array to just modify the value in place if
-         the existing array has one element and the new array has one
-         element, and to modify existing values in place if new array has
-         more elements than existing array
-
-variables.c, jobs.c
-       - changed set_pipestatus_array callers
-
-jobs.c
-       - moved call to setjstatus() from set_job_status_and_cleanup to
-         wait_for, since set_job_status_and_cleanup is part of the SIGCHLD
-         signal handler call path, and race conditions accessing the
-         PIPESTATUS array will result for things like
-
-               while true; do date; done | cat > /dev/null
-
-                                  12/5
-                                  ----
-xmalloc.h
-       - don't redefine xmalloc, xrealloc, and xfree if DISABLE_MALLOC_WRAPPERS
-         is #defined
-
-config.h.in
-       - #undef for DISABLE_MALLOC_WRAPPERS
-
-configure.in
-       - define DISABLE_MALLOC_WRAPPERS if the --with-purify option is
-         supplied
-
-lib/malloc/trace.c
-       - new function, malloc_trace_bin(N), traces allocations and frees
-         to bucket N (uses the same type of bitmap as `busy')
-
-lib/malloc/table.c
-       - fix wraparound search problem in find_entry when searching for a
-         free entry when the table is full
-
-                                  12/6
-                                  ----
-lib/malloc/table.c
-       - keep an `overflow bucket' around to use when the table is full,
-         so find_entry always returns a valid pointer when FIND_ALLOC
-         is set
-       - new static variable to keep a count of the number of MT_ALLOC
-         entries in the mem_table
-
-lib/sh/{oslib,clktck}.c
-       - if HAVE_LIMITS_H is defined, include <limits.h>
-
-lib/sh/oslib.c
-       - new function, getmaxgroups() returns max number of simultaneous
-         groups
-       - new function, getmaxchild(), returns max number of simultaneous
-         user processes
-
-general.c
-       - removed forest of #defines for getmaxgroups()
-
-externs.h
-       - new extern declaration for getmaxgroups()
-       - new extern declaration for getmaxchild()
-       - new extern declaration for isnetconn()
-
-lib/sh/netconn.c,shell.c
-       - new file, isnetconn() from shell.c moved here
-
-Makefile.in, lib/sh/Makefile.in
-       - necessary changes for netconn.c
-
-builtins/ulimit.def
-       - changed getmaxuprc() to just call getmaxchild() and massage the
-         return value appropriately
-
-{jobs,nojobs}.c
-       - use the value returned by getmaxchild() in
-         mark_dead_jobs_as_notified instead of static CHILD_MAX
-
-jobs.c
-       - new function, compact_jobs_list, removes some number of jobs from
-         the jobs table and reallocates the table, copying the jobs that
-         are left from the old table to the new.  Compaction happens from
-         the beginning of the list and removes dead jobs, and we make sure
-         to keep the last CHILD_MAX jobs as POSIX.2 requires
-       - call compact_jobs_list from stop_pipeline if we're in a subshell,
-         there are no free jobs in the jobs table, and the jobs table is
-         at or above some maximum limit
-
-execute_cmd.c
-       - change eval_arith_for_expr to set this_command_name to `((' before
-         calling evalexp, since it might be changed by evaluating the
-         loop body between evalexp calls
-
-trap.c
-       - change reset_signal to turn off the SIG_TRAPPED flag for the
-         given signal, so shell builtins and functions running in command
-         substitutions don't run the signal handlers (traps are not supposed
-         to be inherited by command substitutions)
-
-parse.y
-       - changed parse_string_to_word_list to turn off alias expansion
-         while parsing the array assignment
-
-                                  12/9
-                                  ----
-alias.c
-       - fix add_alias so that redefining an alias's value also resets the
-         EXPANDNEXT flag
-
-                                  12/10
-                                  -----
-parse.y
-       - new function, token_is_assignment, called to check whether the text
-         before `=' makes up a valid assignment token before trying to parse
-         a compound assignment statement
-       - new function, parse_compound_assignment, to parse a compound
-         assignment statement instead of using parse_matched_pair; handles
-         comments and error reporting in the parser instead of waiting until
-         expansion time
-       - changed parse_compound_assignment and parse_string_to_word_list to
-         allow reserved words in compound array assignments
-
-lib/readline/doc/rltech.texinfo
-       - changed the documentation for rl_callback_read_char and
-         rl_callback_handler_remove to say what happens to the terminal
-         settings and what needs to be done to reset them
-
-                                  12/11
-                                  -----
-bashline.c
-       - add emacs_edit_and_execute_command, bound to C-xC-e, like vi-mode
-         `v' command
-       - add bindable command name `edit-and-execute-command', bound to
-         run emacs_edit_and_execute_command()
-
-lib/glob/strmatch.c
-       - add support for ksh93-like [:word:] character class (isalnum + `_')
-
-doc/{bash.1,bashref.texi}
-       - add note to section describing lists to clarify that a sequence of
-         one or more newlines may be used to delimit a command, equivalent
-         to a semicolon
-       - document new [:word:] pattern matching character class
-
-doc/bash.1, lib/readline/doc/rluser.texinfo
-       - document `edit-and-execute-command' and its default emacs-mode
-         binding
-
-include/chartypes.h
-       - add defines for TOCTRL and UNCTRL if they're not already defined
-
-lib/readline/chardefs.h
-       - #undef UNCTRL if it's defined to avoid cpp redefinition warnings
-
-lib/sh/strtrans.c
-       - add \cX (Control-X) escape for $'...' to ansicstr()
-       - change ansic_quote() to allocate at least four chars for each char
-         in the string argument, to account for \0xx octal values
-       - change ansic_quote() to no longer call sprintf for non-printable
-         characters; just translate the string to octal directly
-
-print_cmd.c
-       - change xtrace_print_word_list to call ansic_quote() if
-         ansic_shouldquote() indicates that there are nonprinting characters
-         in a word
-
-builtins/type.def
-       - changed deprecated long option parsing to just replace the word
-         in the list with the equivalent short option (-type -> -t) instead
-         of removing words from the list
-       - changed describe_command to take a single flags argument instead
-         of two int args; changed caller
-       - type now has two new options:  -f suppresses function lookup (like
-         command), and -P forces a PATH search for the name(s)
-
-builtins/common.h
-       - flags for describe_command are here
-       - changed extern declaration of describe_command
-
-builtins/command.def
-       - changed call to describe_command to use flags from common.h, and
-         the right number of arguments
-
-doc/{bash.1,bashref.texi}
-       - documented new -f and -P options to `type'
-
-                                  12/12
-                                  -----
-lib/readline/rldefs.h
-       - fixed prototype for _rl_strnicmp
-
-execute_cmd.c
-       - select_query now takes a new argument, an int flag saying whether
-         or not to print the menu the first time through the loop.  An
-         empty line in response to the prompt will always cause the menu
-         to be reprinted
-       - changed execute_select_command to cause select_query to reprint
-         the menu only if REPLY is set to NULL, if KSH_COMPATIBLE_SELECT
-         is defined
-
-config-top.h
-       - define KSH_COMPATIBLE_SELECT, with a comment about its meaning
-
-lib/readline/readline.c
-       - change rl_insert_comment to toggle if given an explicit numeric
-         argument:  if the first characters on the line don't specify a
-         comment, insert one; if they do, delete the comment text
-
-doc/bash.1, lib/readline/doc/{readline.3,rluser.texinfo}
-       - documented new behavior of insert-comment with a numeric argument
-
-                                  12/13
-                                  -----
-lib/malloc/watch.c
-       - new file, implements watchpoint functions
-
-lib/malloc/watch.h
-       - new file, define some `events' for watchpoints and extern function
-         and variable declarations for watchpoint code
-
-lib/malloc/imalloc.h
-       - #define MALLOC_WATCH if MALLOC_DEBUG is defined
-       - add __P define as in include/stdc.h if not already defined
-
-lib/malloc/malloc.c
-       - remove __P define, now in imalloc.h
-       - include watch.h if MALLOC_WATCH is defined
-       - added calls to _malloc_ckwatch in internal_malloc, internal_free,
-         and internal_realloc
-
-include/stdc.h
-       - augment __P define to allow prototypes if PROTOTYPES is defined
-
-lib/readline/rlstdc.h
-       - augment PARAMS define to allow prototypes if PROTOTYPES is defined
-
-lib/malloc/Makefile.in, Makefile.in
-       necessary changes to include watch.c in libmalloc
-
-lib/readline/readline.c
-       - fix rl_delete_text to make sure that the starting position is >= 0
-       - _rl_init_line_state (called by readline via readline_initialize)
-         now sets rl_mark to 0
-       - rl_get_{next,previous}_history set rl_mark to 0 if rl_point is at
-         the end of the line and rl_end otherwise in emacs mode
-
-lib/readline/kill.c
-       - rl_yank_nth_arg_internal and rl_paste_clipboard now set the mark
-         at point before calling rl_insert_text, like rl_yank
-       - rl_kill_full_line now resets rl_mark to 0
-       - rl_kill_line and rl_backward_kill_line now set rl_mark to the
-         point after the kill in emacs mode
-       - rl_kill_word and rl_backward_kill_word now set rl_mark to the
-         point after the kill in emacs mode
-       - rl_unix_word_rubout and rl_unix_line_discard now set rl_mark to
-         the point after the kill in emacs mode
-
-lib/readline/search.c
-       - noninc_search saves and restores the mark, since it can be changed
-         while reading the search string
-       - noninc_dosearch sets the mark at the end of the line, making the
-         region bound the `inserted' text since rl_point is set to 0
-       - rl_history_search_internal sets the mark at the end of the line,
-         for the same reason
-
-lib/readline/isearch.c
-       - rl_search_history now saves and restores the mark
-       - if no matching lines are found at all when doing an isearch, leave
-         point where it was instead of moving it to the end of the line
-
-                                  12/17
-                                  -----
-lib/readline/rlmbutil.h
-       - new file, place for multi-byte character defines and extern
-         declarations
-
-lib/readline/{bind.c,readline.c,rlprivate.h}
-       - new bindable variable, `byte-oriented', tracks value of
-         rl_byte_oriented variable
-
-lib/readline/mbutil.c
-       - new file, with multibyte char utility functions
-
-lib/readline/{complete,display,readline,util,vi_mode}.c
-       - new code for multibyte characters, derived from IBM patch
-
-                                  12/18
-                                  -----
-lib/sh/tmpfile.c
-       - include posixtime.h for time() extern declaration
-
-support/bashversion.c
-       - include <unistd.h> if it's available
-
-lib/readline/{histexpand,input,isearch,search}.c
-       - new code for multibyte characters, derived from IBM patch
-
-lib/readline/readline.h
-       - include rltypedefs.h
-
-                                  12/19
-                                  -----
-lib/readline/complete.c
-       - slight change to mark-directories code to avoid adding a slash if
-         point is at the end of the line (rl_line_buffer[rl_point] == '\0')
-         and the previous character was a slash
-       - change printable_part to not return empty pathnames, which could
-         happen when completing filenames and a filename with a trailing
-         slash was passed as the argument.  If the portion following the
-         trailing slash is NULL, ignore it and look for a previous slash.
-         If there's no previous slash, just return the filename argument
-       - new variable, rl_completion_mark_symlink_dirs, mirrors the value
-         of (user-settable with a variable) _rl_complete_mark_symlink_dirs
-         but may be modified by application-specific completion functions
-         when appropriate (set in rl_complete_internal and rl_menu_complete)
-
-lib/readline/readline.h
-       - extern declaration for rl_completion_mark_symlink_dirs
-
-pcomplete.c
-       - if one of the actions is CA_DIRECTORY, set
-         rl_completion_mark_symlink_dirs to indicate that we want the
-         trailing slash (might have to relax this)
-
-lib/readline/doc/rltech.texinfo
-       - documented rl_completion_mark_symlink_dirs variable
-
-lib/readline/doc/rluser.texinfo, doc/bash.1
-       - documented the fact that `complete -d' and `complete -o dirnames'
-         force readline to append a slash to symlinks to directories
-
-builtins/enable.def
-       - changed enable_shell_builtin to disallow enabling disabled
-         builtins in a restricted shell
-
-doc/{bash.1,bashref.texi}
-       - documented new enable behavior in restricted shells
-
-doc/Makefile.in
-       - new rule to make an `RBASH' file documenting the restrictions
-         imposed by a restricted shell
-
-expr.c
-       - broke the code that evaluates variables and returns results out
-         of readtok() into a new function: expr_streval()
-       - expr_streval() now performs the standard unset variable error
-         behavior if `set -u' has been executed and it's asked to look
-         up an unset variable
-       - broke the code that frees up the expression context stack into
-         a new function: expr_unwind()
-
-variables.c
-       - fixed bind_int_variable so it handles array element assignment,
-         so expressions like `b[7]++' and `b[0] = 42' work right
-       - new function, get_variable_value, returns the string value of
-         the SHELL_VAR * passed as an argument
-       - get_string_value now calls get_variable_value with a non-null
-         result from find_variable
-
-                                  12/20
-                                  -----
-lib/readline/rlmbutil.h, mbutil.c
-       - combined _rl_find_next_mbchar and _rl_find_next_nonzero_mbchar into
-         a single function
-       - combined _rl_find_prev_mbchar and _rl_find_prev_nonzero_mbchar into
-         a single function
-
-lib/readline/{display,readline,vi_mode}.c
-       - changed callers of _rl_find_next_mbchar and
-         _rl_find_next_nonzero_mbchar
-
-lib/readline/{complete,display,histexpand,readline,vi_mode}.c
-       - changed callers of _rl_find_prev_mbchar and
-         _rl_find_prev_nonzero_mbchar
-
-                                  12/20
-                                  -----
-lib/sh/mktime.c
-       - new file, from glibc/gawk, compiled in if system doesn't have a
-         working mktime(3)
-
-lib/sh/strftime.c
-       - new file, from gawk, compiled in if system doesn't have a
-         working strftime(3)
-
-lib/sh/Makefile.in, Makefile.in
-       - changes for mktime.c, strftime.c
-
-configure.in
-       - call AC_FUNC_MKTIME, AC_STRUCT_TM, AC_STRUCT_TIMEZONE
-       - call AC_REPLACE_FUNC(strftime)
-
-config.h.in
-       - add defines for TM_IN_SYS_TIME, HAVE_TZSET, HAVE_TM_ZONE,
-         HAVE_STRUCT_TM_TM_ZONE, HAVE_STRFTIME
-
-externs.h
-       - provide an extern declaration for strftime if HAVE_STRFTIME is
-         not defined and NEED_STRFTIME_DECL is
-
-lib/tilde/tilde.h
-       - header files should not include <config.h>
-
-parse.y
-       - replace code in decode_prompt_string that chops up value returned
-         by ctime(3) with calls to strftime -- as a result, the expansion
-         of \@ has changed slightly (since it depends on the locale)
-       - added new \D{format} prompt string escape; `format' is passed to
-         strftime(3).  Empty format is the same as `%X' (locale-specific
-         representation of the current time)
-       - combined cases for '\\', '\a', '\e', and '\r' in same case branch
-         in decode_prompt_string
-
-doc/{bash.1,bashref.texi}
-       - documented new \D{format} prompt string expansion
-
-builtins/printf.def
-       - use ISO C PRIdMAX instead of INTMAX_CONV
-       - pass length of format modifiers to mklong instead of computing it
-         with strlen()
-
-lib/sh/{fmtulong,fmtullong}.c
-       - changes from Paul Eggert to make more general
-
-arrayfunc.c
-       - when converting a variable to an array, make sure to unset the
-         dynamic_value and assign_func members of the struct variable,
-         since they're not valid anymore
-
-                                  12/27
-                                  -----
-configure.in
-       - use AC_HELP_STRING in AC_ARG_WITH and AC_ARG_ENABLE 
-       - remove AC_ARG_ENABLE for largefile, since AC_SYS_LARGEFILE adds
-         one
-
-                                1/2/2002
-                                --------
-{alias,bashline,execute_cmd,general,shell,subst,variables,arrayfunc}.c,general.h
-       - changed some calls to strchr to calls to xstrchr for multibyte
-         characters
-
-include/shmbutil.h
-       - add extern declaration for xstrchr to avoid including externs.h
-         where it's not appropriate
-
-{braces,make_cmd,pathexp,subst,arrayfunc}.c, lib/sh/xstrchr.c
-       - include shmbutil.h
-
-{stringlib,subst}.c, {externs,subst}.h
-       - moved substring() from subst.c to stringlib.c, moved declaration
-         from subst.h to externs.h
-
-lib/sh/xmbsrtowcs.c
-       - new file, replacement function for mbsrtowcs
-
-lib/sh/Makefile.in
-       - add entries for xmbsrtowcs.c
-
-Makefile.in
-       - add dependencies on shmbutil.h to appropriate object files
-
-lib/glob/strmatch.c
-       - break character-class testing out into separate function:
-         is_cclass, in prep for multibyte changes
-
-{braces,make_cmd}.c
-       - changes for multibyte characters
-
-builtins/printf.def
-       - changes from Paul Eggert to just use intmax_t everywhere an
-         int/long/quad is needed and print with "%ld" if the number
-         fits in a long and %PRIdMAX otherwise
-       - remove getlong, getulong, getllong, getullong, since they're
-         no longer needed
-       - use a new type `floatmax_t' to print floating point numbers, the
-         widest-available floating point type (like `intmax_t'); new
-         function `getfloatmax' that calls strtold or strtod as appropriate
-       - remove getdouble, getldouble, since they're no longer needed
-
-lib/sh/fmtumax.c
-       - new file, string-to-[u]intmax_t conversion, just includes
-         fmtulong.c with the right defines
-
-Makefile.in, lib/sh/Makefile.in
-       - additions for fmtumax.c
-
-bashtypes.h
-       - include <inttypes.h> if it's available
-
-expr.c
-       - arithmetic is now in intmax_t instead of long
-
-externs.h
-       - extern declaration for fmtumax
-       - change extern declarations for evalexp, itos, inttostr,
-         uitos, uinttostr since they now return or use intmax_t instead
-         of long
-
-{execute_cmd,general,mailcheck,subst,variables}.c, parse.y
-{array,general,subst,test,variables}.h
-lib/sh/{itos,netopen}.c
-builtins/{bashgetopt,common}.c, builtins/common.h
-builtins/{break,fc,history,jobs,let,printf,pushd,read,shift,wait}.def
-       - changes for intmax_t shell arithmetic conversion
-
-doc/{bashref.texi,bash.1}
-       - documented long->intmax_t shell arithmetic conversion
-
-sig.c
-       - in initialize_terminating_signals, if we've already trapped a
-         terminating signal, don't reset the signal handler for it
-
-                                   1/3
-                                   ---
-{arrayfunc,pathexp}.c, parse.y
-       - changes for multibyte chars
-
-parse.y, lib/sh/strtrans.c
-       - moved ansiexpand from parse.y to lib/sh/strtrans.c
-
-parse.y, locale.c
-       - moved mk_msgstr and localeexpand from parse.y to locale.c
-
-parse.y
-       - new function, yy_input_name, returns name of input file from
-         bash_input.name
-       - broke the code that parses ((...)) constructs out of read_token
-         into a new function, parse_dparen()
-
-externs.h
-       - new extern declaration for ansiexpand(), mk_msgstr(), and
-         localeexpand()
-
-input.h
-       - new extern declaration for yy_input_name()
-
-{error,locale}.c
-       - use yy_input_name for error and other messages
-
-execute_cmd.c
-       - change shell_execve to make sure that the file is executable
-         before looking at the interpreter to find out why the execve()
-         failed (avoids misleading error message)
-
-lib/glob/glob.c
-       - move code that matches leading `.' and skips those filenames into
-         a separate function: skipname(), so there can be unibyte and
-         multibyte versions of that function
-
-                                   1/7
-                                   ---
-subst.c
-       - more changes for multibyte characters
-
-print_cmd.c
-       - change semicolon() so it doesn't output a `;' immediately after a
-         newline, since that results in a null command, which is a syntax
-         error
-
-variables.c
-       - fix indirection_level_string to turn off set -x while evaluating
-         PS4
-
-                                   1/8
-                                   ---
-builtins/set.def
-       - make -o options into one struct, instead of separate structs for
-         option names corresponding to flags and non-flag option names.
-         This has the side effect of sorting the option names in output
-
-lib/glob/glob.c
-       - new function, mbskipname(), multibyte char version of skipname()
-       - removed all #ifndef SHELL code, this will never be used outside
-         the shell
-
-include/posixdir.h
-       - move REAL_DIR_ENTRY define here from lib/glob/glob.c
-
-lib/glob/glob_loop.c
-       - new file, included in glob.c for unibyte and multibyte versions of
-         glob_pattern_p
-       - added some forward static function declarations with prototypes
-       - more changes for multibyte character handling
-
-lib/glob/Makefile.in
-       - make glob.c depend on glob_loop.c
-       - changes for xmbsrtowcs.[co]
-
-lib/glob/xmbsrtowcs.c
-       - moved here from lib/sh, since the matching functions use it, and
-         libglob.a is linked after libsh.a
-
-                                   1/9
-                                   ---
-lib/glob/smatch.c
-       - new file, with strmatch (now xstrmatch) and associated functions,
-         with changes for multibyte chars
-
-lib/glob/sm_loop.c
-       - new file, included by smatch.c, with `generic' versions of matching
-         functions that are compiled twice:  once each for single-byte and
-         multibyte characters
-
-lib/glob/strmatch.c
-       - strip out everything except strmatch(), which either calls fnmatch
-         (if HAVE_LIBC_FNM_EXTMATCH is defined) or xstrmatch
-
-lib/glob/collsyms.c
-       - changes for multibyte chars
-
-lib/glob/Makefile.in, Makefile.in
-       - changes for new source files
-
-                                  1/10
-                                  ----
-lib/readline/complete.c
-       - new function, rl_completion_mode (rl_command_func_t *func), returns
-         the appropriate value to pass to rl_complete_internal depending on
-         FUNC and the value of `show-all-if-ambiguous'.  This allows
-         application completion functions to present the same interface as
-         rl_complete
-
-lib/readline/readline.h
-       - new extern declaration for rl_completion_mode()
-
-lib/readline/doc/rltech.texinfo
-       - documented rl_completion_mode
-
-lib/readline/readline.[ch]
-       - bumped the version number to 4.3, changing the relevant cpp defines
-
-configure.in
-       - require that an installed readline version be at least readline-4.3
-
-bashline.c
-       - converted bash-specific completion functions to use
-         rl_completion_mode instead of passing TAB unconditionally
-
-builtins/bashgetopt.c
-       - the `#' option specifier now means a required numeric argument,
-         not an optional one
-
-builtins/type.def
-       - when converting [-]-{path,type,all} to -[pta], don't bother
-         freeing and reallocating the option string; just change opt[1]
-         and null opt[2]
-
-lib/sh/snprintf.c
-       - support %ls/%S and %lc/%C for wide strings and characters,
-         respectively, if HANDLE_MULTIBYTE is defined
-
-mailcheck.c
-       - don't print a message about new mail if the file has not grown,
-         even if the access time is less than the modification time
-
-                                  1/14
-                                  ----
-lib/readline/readline.c
-       - new function, rl_replace_line, to replace the readline line buffer
-         with the text supplied as an argument
-       - new function, rl_replace_from_history, replaces readline line
-         buffer with text from history entry passed as argument (undocumented,
-         not in readline.h because it requires a definition of
-         HIST_ENTRY for the prototype)
-
-lib/readline/readlne.h
-       - new extern declaration for rl_replace_line
-
-lib/readline/doc/rltech.texinfo
-       - documented rl_replace_line
-
-lib/readline/{isearch,readline,search}.c
-       - use rl_replace_line and rl_replace_from_history where appropriate
-
-lib/readline/readline.c
-       - broke the code that sets point after moving through the history
-         (_rl_history_preserve_point and _rl_history_saved_point) out
-         into a separate function, _rl_history_set_point()
-
-lib/readline/{complete.c,rlprivate.h}
-       - find_completion_word -> _rl_find_completion_word
-       - free_match_list -> _rl_free_match_list
-
-lib/readline/complete.c
-       - postprocess_matches and _rl_free_match_list now return immediately
-         if passed a null match list
-
-variables.c
-       - new function, find_local_variable, finds a local variable by name
-         at the current variable context
-       - in find_variable_internal, call find_local_variable before searching
-         any of the temporary environments if variable_context > 0 (meaning
-         we're in a shell function).  This lets a local variable
-         override a variable whose value was passed in the `function
-         environment'
-
-                                  1/15
-                                  ----
-variables.h, execute_cmd.c
-       - declare variables describing the temporary environments in
-         variables.h instead of in C files
-
-findcmd.c, builtins/setattr.def
-       - instead of calling find_tempenv_variable, use find_variable_internal
-         and check whether the returned SHELL_VAR * has the tempvar
-         attribute
-
-variables.c
-       - tentative change to lookup order in find_variable_internal so that
-         function local variables are found before variables in
-         function_env when executing a shell function
-       - change make_local_variable to handle making a local variable when
-         a variable with the same name already appears in one of the
-         temporary environments
-       - broke the body of make_var_array out into a new function:
-               static char **make_env_array_from_var_list (SHELL_VAR **vars)
-       - new function, make_var_array_internal, takes a hash table to look
-         in and a pointer to a mapping function and returns a char **
-         environment-style list
-       - make_var_array now just calls make_var_array_internal
-       - new mapping function, local_and_exported, returns all local variables
-         in the current variable context with the export attribute set
-       - new function, make_local_export_array, returns an environment-style
-         char ** array of exported local variables in current context
-       - change environment creation order in maybe_make_export_env to
-         add variables to the environment in opposite order that
-         find_variable_internal uses.  This means that local variables in
-         shell functions override variables with the same name in the
-         function_env
-       - change make_local_variable to set the initial value of the
-         variable it creates to NULL to make the `is set' and `is null'
-         tests that the expansion code does work right
-       - change make_local_variable to inherit the value of a variable with
-         the same name from the temporary enviroment
-
-                                  1/16
-                                  ----
-Makefile.in
-       - link bashversion with buildversion.o instead of version.o, for
-         cross-compiling.  version.o is for the target system;
-         buildversion.o is for the build system
-
-error.c
-       - add line numbers to internal_error() messages if the shell is
-         not interactive and running a shell script or a -c command
-       - report_error now prints non-zero line numbers for non-interactive
-         shells
-
-test.c
-       - test_syntax_error now calls builtin_error() instead of printing
-         its own messages
-
-builtins/common.c
-       - builtin_error now prints line numbers if a non-interactive shell
-         is running a shell script or a -c command
-
-print_cmd.c
-       - in cprintf, remove free_argp, since it's not used
-
-builtins/history.def
-       - make `history -n' increment the number of history lines in this
-         session by the number of lines read from the history file
-
-arrayfunc.c
-       - fix array_value_internal to expand the subscript even if the
-         variable is unset, so side effects produced by the arithmetic
-         evaluation will take place
-
-lib/readline/doc/{rluser,rltech}.texinfo
-       - some fixes for printing in @smallbook format from Brian
-         Youmans
-
-                                  1/17
-                                  ----
-jobs.h
-       - new PRUNNING, PSTOPPED, PDEADPROC defines for PROCESSes, analogous
-         to RUNNING, STOPPED, and DEADJOB defines for jobs
-
-jobs.c
-       - use PS_RUNNING, PS_DONE, PS_STOPPED values for `running' field
-         of a PROCESS
-       - find_pipeline and find_job now take an additional flags argument
-         that, if non-zero, means to find only running processes; changed
-         all callers
-       - changed calls to find_pipeline and find_job made from waitchld
-         to find only running processes
-       - find_pipeline takes a third argument: an int *.  If it looks in
-         the jobs list to find the pid, and the arg is non-null, it passes
-         the job index back to the caller.  Used to avoid calls to
-         find_pipeline immediately followed by find_job with the same PID
-
-nojobs.c
-       - a couple of changes to make sure that set_pid_status is never
-         called with a pid argument of 0 or -1
-
-trap.c
-       - change trap_handler to longjmp to wait_intr_buf (set by wait_builtin)
-         if a signal is received for which a trap has been set during
-         execution of the wait builtin (need to include builtins.h and
-         builtins/builtext.h and declare some extern variables for the
-         right things to check)
-       - new variable to keep track of which signal caused the longjmp to
-         wait_intr_buf, set by trap_handler (wait_signal_received)
-
-builtins/wait.def
-       - set the return value of wait when a longjmp(wait_intr_buf, 1) is
-         done to 128 + wait_signal_received
-
-{jobs,nojobs}.c
-       - set wait_signal_received to SIGINT in wait_sigint_handler before
-         the longjmp(wait_intr_buf, 1)
-
-                                  1/18
-                                  ----
-bashline.c
-       - turn off rl_filename_completion_desired when completing a command
-         name with a single match only if the first char of that match is
-         not a `/'
-       - if there are multiple identical matches for a command name in
-         attempt_shell_completion, turn off rl_filename_completion_desired
-         if the first char is not a `/' to avoid readline appending a
-         slash if there's a directory with the same name in the current
-         directory
-
-                                  1/22
-                                  ----
-lib/readline/complete.c
-       - new variable, _rl_page_completions, to control whether we want to
-         run the internal pager when listing completions (defaults to 1)
-
-lib/readline/rlprivate.h
-       - extern declaration for _rl_page_completions
-
-lib/readline/bind.c
-       - new bindable variable, `page-completions', controls value of
-         _rl_page_completions
-
-lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
-       - documented `page-completions' variable
-
-Makefile.in
-       - use $(INSTALL_SCRIPT) instead of $(INSTALL_PROGRAM) to install
-         `bashbug'
-
-aclocal.m4
-       - fix small quoting problem in RL_LIB_READLINE_VERSION macro
-
-lib/readline/terminal.c
-       - fetch and save terminal's `vs' and `ve' cursor control attributes
-       - fetch and save terminal's `kI' attribute (string sent by Insert)
-       - new function, _rl_set_cursor, sets cursor to normal (insert mode)
-         or very visible (overwrite mode)
-
-lib/readline/readline.c
-       - new global variable, rl_insert_mode
-       - new function to toggle overwrite mode, rl_overwrite_mode
-       - each new line starts in insert mode
-       - switching to vi mode or emacs mode resets to insert mode
-       - reset cursor to normal before returning line
-       - _rl_replace_text now returns the number of characters inserted,
-         the return value from rl_insert_text
-       - new function, _rl_insert_or_replace_text (const char *string, int insert),
-         either inserts STRING or replaces the number of chars in STRING
-         with STRING starting at rl_point, depending on value of INSERT
-       - renamed rl_insert to _rl_insert_char, rl_insert just calls
-         _rl_insert_char with the same arguments when in insert mode
-       - new function, _rl_overwrite_char, handles self-insert in overwrite
-         mode.  Does multibyte chars by reading an entire multibyte character
-         before entering overwrite loop
-       - new function, _rl_overwrite_rubout, handles RUBOUT when in
-         overwrite mode, called from rl_rubout
-       - new function, _rl_rubout_char, old body of rl_rubout; rl_rubout
-         calls this when not in overwrite mode 
-
-lib/readline/readline.h
-       - extern declarations for rl_insert_mode and rl_overwrite_mode()
-
-lib/readline/rldefs.h
-       - define constants for values of rl_insert_mode
-
-lib/readline/rlprivate.h
-       - extern declarations for _rl_set_cursor and _rl_set_insert_mode
-       - change type of _rl_replace_text to return int
-       - extern declarations for _rl_insert_char, _rl_rubout_char
-
-lib/readline/funmap.c
-       - new bindable name `overwrite-mode', bound to rl_overwrite_mode
-
-lib/readline/rlconf.h
-       - define CURSOR_MODE if you want the cursor to show insert or
-         overwrite mode (only available if both `vs' and `ve' capabilities
-         are present)
-
-lib/readline/{complete,parens,readline,search,vi_mode}.c
-       - change calls to rl_insert to _rl_insert_char
-
-lib/readline/{readline,search}.c
-       - change calls to rl_rubout to _rl_rubout_char to avoid overwrite
-         mode problems
-
-lib/readline/vi_mode.c
-       - fix rl_vi_overstrike to just call _rl_overwrite_char, which
-         handles multibyte chars
-
-lib/readline/doc/{rluser.texinfo,readline.3}, doc/bash.1
-       - document new `overwrite-mode' command
-
-                                  1/23
-                                  ----
-lib/readline/readline.c
-       - return 0 immediately from rl_insert_text if the string to insert
-         is NULL or ""
-
-bashline.c
-       - if a numeric argument is given to one of the bash-specific glob
-         pattern completion functions (including TAB), append a `*' to
-         the word before generating matches
-       - in attempt_shell_completion, when doing glob completion, only
-         set the match list to NULL if rl_completion_type == TAB and
-         there is more than one completion.  This permits listing completions
-         with double tabs and displaying ambiguous completions
-       - new function, bash_glob_complete_word, appends a `*' to the word
-         to be completed and then globs it.  It uses a new filename
-         quoting function (bash_glob_quote_filename) to avoid quoting
-         globbing characters in the filename if there are no matches or
-         multiple matches
-
-lib/readline/complete.c
-       - set completion_changed_buffer to 0 in rl_complete_internal if
-         no matches were produced by the completion generator function
-       - new variable, rl_completion_suppress_append, suppresses appending
-         of rl_completion_append_character.  Settable by application
-         completion functions, always 0 when application completion
-         functions are called (set to 0 by rl_complete_internal and
-         rl_menu_complete)
-       - broke the code that assigns default values to readline completion
-         variables out of rl_complete_internal and rl_menu_complete into
-         a new function, set_completion_defaults (int what_to_do)
-
-lib/readline/readline.h
-       - extern declaration for rl_completion_suppress_append
-
-lib/readline/doc/rluser.texinfo, doc/bash.1
-       - documented behavior of glob-expand-word and glob-list-expansions
-         when supplied a numeric argument
-       - documented glob-complete-word
-
-lib/readline/doc/rltech.texinfo
-       - documented rl_completion_suppress_append
-
-                                  1/24
-                                  ----
-lib/readline/text.c
-       - new file, text and character handling functions from readline.c
-
-lib/readline/misc.c
-       - new file, miscellanous bindable functions and their supporting
-         code from readline.c
-
-Makefile.in, lib/readline/Makefile.in
-       - changes for text.c, misc.c
-
-lib/readline/bind.c
-       - change ISKMAP case of rl_invoking_keyseqs_in_map to output
-         ESC as "\M-" instead of "\e" -- it's closer to the documentation
-       - change _rl_get_keyname to output ESC as \e instead of \C-[
-         (it's easier to understand)
-
-pcomplete.h
-       - new flag, COPT_NOSPACE
-
-builtins/complete.def
-       - new `-o nospace' option for complete and compgen (though it doesn't
-         really do anything for compgen, since that doesn't hand anything
-         off to readline)
-
-bashline.c
-       - if a programmable completion specifies COPT_NOSPACE, set
-         rl_completion_suppress_append = 1
-
-lib/readline/doc/rluser.texinfo
-       - documented new `-o nospace' option to complete and compgen
-
-doc/{bash.1,bashref.texi}
-       - documented $'\cX' escape sequence (forgot to before)
-
-                                  1/28
-                                  ----
-variables.c
-       - make_new_variable now takes the HASH_TABLE * as its second
-         argument; changed callers
-       - new function, bind_variable_in_table, takes the HASH_TABLE * as
-         its third paramter; bind_variable calls bind_variable_in_table
-         with shell_variables as third argument
-
-variables.h
-       - new struct var_context, variable context (per-scope -- global,
-         function local, etc.)
-
-variables.[ch],builtins/common.[ch]
-       - moved functions that push and pop a variable context from
-         builtins/common.c to variables.c; move extern function
-         declarations to variables.h
-       - new function, all_local_variables
-       - variable_in_context is now static, used only by all_local_variables
-
-variables.[ch],execute_cmd.c
-       - push_context now takes the function name as an argument for
-         future use
-       - push_context takes an indication of whether or not the function is
-         executing in a subshell and saves the positional parameters only
-         if not in a subshell
-       - new functions for managing a stack of variable contexts and
-         scopes:  new_var_context, dispose_var_context, push_var_context,
-         pop_var_context, push_scope, pop_scope
-
-builtins/declare.def
-       - call all_local_variables instead of map_over (...) in declare_internal
-       - don't call make_local_variable if we're looking at functions
-         ((flags_on & att_function) != 0), since it's wasted
-       - make sure VAR is set to NULL if check for variable_context fails
-         and we didn't just create or fetch a local variable in
-         declare_internal
-       - in non-function branch of declare_internal, only call find_variable
-         if VAR is NULL -- if it's not null, we just created or fetched a
-         local variable and don't need to do it again
-
-                                  1/29
-                                  ----
-variables.[ch]
-       - the temporary environments (temporary_env, builtin_env, function_env)
-         are now HASH_TABLEs instead of argv-style arrays of strings (this
-         is an intermediate step on the way to the new lcc-inspired symbol
-         table scope structure)
-       - new internal attribute for variables: att_propagate.  This means
-         to propagate the value out of the temporary environment up the
-         (for now implicit) chain of variable scopes when the containing
-         temporary environment is deleted
-
-variables.c
-       - assign_in_env now adds to the HASH_TABLE temporary_env instead
-         of making environment-style strings in an array of strings
-       - changed the way the temporary environments are merged into the
-         shell variable table to account for the new HASH_TABLE temp
-         environments
-       - changed the way the export environment is created due to the new
-         structure of the temporary environments
-       - new function, bind_variable_internal (name, value, table), binds
-         NAME to have VALUE in TABLE without searching the temporary
-         environments
-       - removed: shell_var_from_env_string, bind_name_in_env_array
-       - variable_in_context now checks the att_local attribute and makes
-         sure the variable is not invisible
-       - local_and_exported now makes sure the variable is not invisible
-
-execute_cmd.c
-       - we no longer need to copy the temporary environment to function_env
-         or builtin_env, we can simply use variable assignments
-
-{findcmd,subst,variables}.c, builtins/{declare,setattr}.def
-       - since variables from the temporary environments are no longer turned
-         into SHELL_VARs on the fly, don't dispose the SHELL_VAR returned
-         by find_variable or find_variable_internal
-       - need to savestring() the value returned by find_variable if it has
-         the tempvar attribute before calling bind_variable on it, because
-         bind_variable will search and bind into the temporary environments
-         and will free the old value before binding the new.  For temporary
-         environments, these two pointers will be the same, and
-         bind_tempenv_variable will end up using freed memory
-
-builtins/{declare,setattr}.def
-       - set the att_propagate attribute when exporting or making readonly
-         variables from the temp environment (i.e., `var=value declare -x var'
-         or `var=value export var' sets the propagate attribute on the entry
-         for `var' in the temporary environment HASH_TABLE)
-
-lib/readline/isearch.c
-       - ^W when reading isearch string yanks the current word out of the
-         current line into the search string, skipping the portion already
-         matched
-       - ^Y when reading isearch string yanks the rest of the current line
-         into the search string, skipping the portion already matched
-
-                                  1/30
-                                  ----
-{print_cmd,variables}.c
-       - moved indirection_level_string() from variables.c to print_cmd.c
-
-{externs,variables}.h
-       - moved extern declaration of indirection_level_string to externs.h
-
-{general,variables}.c
-       - moved assignment() from variables.c to general.c
-
-{general,variables}.h
-       - moved extern declaration of assignment() to general.h
-
-{externs,input}.h
-       - moved extern declaration of decode_prompt_string to externs.h
-
-print_cmd.c
-       - include flags.h, don't include stdc.h
-
-variables.c
-       - moved some functions around to group functions better
-       - changed new_shell_variable to explicitly initialize each member
-         of the created struct variable instead of calling bzero()
-       - make_new_variable now just calls new_shell_variable instead
-         of duplicating what it does
-       - removed some code in bind_function that duplicated what
-         new_variable does on the newly-created SHELL_VAR
-       - since there are no local function variables (functions are always
-         made at the global scope), kill_all_local_variables() doesn't
-         need to consider functions
-
-                                  1/31
-                                  ----
-variables.c
-       - sort the array of special variables
-       - short-circuit the search in stupidly_hack_special_variables if
-         the passed name can't be found in the rest of the array
-         (that is, if name[0] < special_vars[i].name[0])
-
-lib/readline/history.c
-       - unstifle_history() was returning values exactly opposite of
-         the documentation
-
-lib/readline/doc/{hsuser.texinfo,history.3}
-       - clarified the unstifle_history() documentation a little
-
-                                   2/4
-                                   ---
-variables.c
-       - in bind_variable, don't call bind_tempenv_variable after a
-         find_tempenv_variable succeeds -- just change the value inline.
-         There's no reason to look it up twice
-       - change makunbound to only call stupidly_hack_special_variables
-         if we're not unsetting a function
-
-variables.[ch]
-       - new function, unbind_function, like makunbound but doesn't mess
-         with previous contexts or calling stupidly_hack_special_variables
-
-builtins/set.def
-       - change unset_builtin to call either unbind_func or unbind_variable
-
-builtins/getopts.def
-       - call unbind_variable(name) instead of makunbound(name, shell_variables)
-
-                                   2/5
-                                   ---
-lib/glob/sm_loop.c
-       - use malloc instead of xmalloc in BRACKMATCH and handle failures
-
-error.c
-       - add extern declaration of executing_line_number with prototype,
-         since execute_cmd.h can't be included without including other
-         files
-
-lib/readline/parens.c
-       - include <unistd.h>
-
-lib/malloc/stats.c
-       - include <unistd.h>
-       - add extern declaration of malloc_free_blocks() with prototype
-
-pathexp.c
-       - added some forward declarations with prototypes for static functions
-
-lib/readline/rlprivate.h
-       - removed declarations of rl_untranslate_keyseq, rl_discard_argument,
-         rl_stop_output, rl_alphabetic since they appear in readline.h
-
-                                   2/6
-                                   ---
-{arrayfunc,execute_cmd,pcomplete,shell}.c
-       - change calls to makunbound(name, shell_variables) to
-         unbind_variable (name)
-
-                                   2/7
-                                   ---
-builtins/getopt.c
-       - don't defer incrementing of OPTIND when an invalid option is
-         encountered until the next call to sh_getopt() -- what if OPTIND
-         is reset before that next call?  This means that OPTIND is always
-         incremented to the next option to be handled when an option is
-         returned, whether it's valid or not.  This is what POSIX-2002
-         says to do.
-
-syntax.h
-       - new #define, CSUBSTOP
-
-mksyntax.c
-       - add "-=?+" with value CSUBSTOP to the syntax table.  These are the
-         valid expansion operators OP in ${param[:]OPword}
-
-subst.c
-       - use table lookup for CSUBSTOP in VALID_PARAM_EXPAND_CHAR
-       - new flags for the string extraction functions:  EX_NOALLOC.  This
-         indicates that the functions are being used only to skip over
-         strings and the result won't be used, so the substring shouldn't
-         be allocated, copied, and freed
-       - new flag for string_extract:  EX_VARNAME.  This serves the same
-         purpose as the old `varname' parameter.  parameter_brace_expand()
-         changed appropriately
-       - extract_delimited_string and extract_dollar_brace_string now take
-         an additional `flags' argument, which may include EX_NOALLOC
-       - changed callers of extract_delimited_string and
-         extract_dollar_brace_string appropriately
-       - string_extract now understands EX_NOALLOC; callers changed
-       - some smaller code cleanups
-       - converted char_is_quoted(), unclosed_pair(), and skip_to_delim()
-         to understand multibyte characters
-
-                                  2/11
-                                  ----
-variables.[ch]
-       - moved to a symbol organization inspired by lcc.  The basic structure
-         is no longer a HASH_TABLE, but a VAR_CONTEXT, which includes a hash
-         table as one of its members.  VAR_CONTEXTs are linked together to do
-         variable scoping.  One nice thing about this is that the entire
-         symbol table doesn't need to be searched at function scope exit to
-         remove local variables.  Fixes problems with only one instance of
-         builtin_env and function_env, even though it really is a stack
-       - shell_variables is now a VAR_CONTEXT *, with a global_variables
-         variable that points to the bottom of the stack for fast access
-       - function-scope local variables (assignments specified on the command
-         line before a function call) and function-local variables (declared
-         with the `local' builtin) have been unified in the same variable
-         context, replacing function_env
-       - assignment statements preceding the `.' and `eval' builtins are now
-         a separate variable scope VAR_CONTEXT, replacing builtin_env
-       - temporary_env (a HASH_TABLE) is now the only separate environment
-       - changes to export environment creation, variable binding, variable
-         lookup, local variable propagation all changed to work with the
-         new symbol table/scope structure
-       - a SHELL_VAR no longer has a `prev_context' member; it's not needed
-
-execute_cmd.c
-       - changes to push_context calls to include any temporary variables in
-         temporary_env; pop_context takes care of propagating any temporary
-         variables if necessary
-       - calls to push_scope if `eval' or `.' is called with a list of
-         preceding variable assignments, and pop_scope called at end of
-         builtin's execution.  pop_scope takes care of merging temporary
-         variables into the shell environment when appropriate
-
-builtins/{setattr,declare}.def
-       - changes to account for variable assignments preceding `local',
-         `export', `readonly', `declare', etc. to work with the new
-         variable scoping implementation
-
-shell.c
-       - since shell_variables is now a VAR_CONTEXT, call
-         delete_all_contexts() when the shell is reinitializing instead of
-         delete_all_variables()
-
-builtins/common.c
-       - new function, get_job_by_name(), used by execute_simple_command()
-         for the `auto_resume' stuff and get_job_spec()
-
-builtins/common.h
-       - new set of #defined constants for flags argument to
-         get_job_by_name()
-
-                                  2/12
-                                  ----
-command.h
-       - new redirection operator: r_reading_string for `here strings'
-
-parse.y
-       - new token, LESS_LESS_LESS, for new redirection `here string'
-         operator: [N]<<< word
-       - recognize LESS_LESS_LESS and create the appropriate redirection
-
-{dispose_cmd,copy_cmd,make_cmd,print_cmd}.c
-       - recognize r_reading_string and do the right thing (dispose_redirects,
-         copy_redirect, print_redirection, and make_redirection, respectively)
-
-redir.c
-       - here_document_to_fd now takes the redirection operator as its
-         second argument
-       - new function, write_here_string, expands a here string and writes it
-         to the here document file descriptor
-       - here_document_to_fd calls write_here_string for r_reading_string
-         operator
-       - handle r_reading_string in do_redirection_internal() and
-         stdin_redirection()
-
-                                  2/18
-                                  ----
-doc/{bash.1,bashref.texi}
-       - documented here strings
-
-{configure,Makefile}.in
-       - bumped version number up to bash-2.05b and the release status
-         to alpha1
-
-expr.c
-       - make expr_streval understand that variables with the `invisible'
-         attribute are really unset, and accessing such a variable when
-         `set -u' is set should be an error
-
-variables.h
-       - new accessor macros: var_isset(var) and var_isnull(var), test
-         whether var->value is NULL
-
-{eval,subst,variables}.c, builtins/{declare,setattr}.def
-       - be more consistent about using value_cell(var) instead of
-         directly referencing var->value
-       - use var_isset and var_isnull where appropriate
-
-builtins/help.def
-       - augmented a couple of help strings with pointers to `info' and
-         `man -k'
-
-                                  2/14
-                                  ----
-variables.h
-       - new macros to use when setting variable values directly instead of
-         through bind_variable and its siblings
-
-{arrayfunc,variables}.c
-       - use var_setarray and other lvalue macros instead of assigning to
-         var->value directly
-
-builtins/setattr.def
-       - change show_var_attributes to show function definitions separately
-         from function attributes.  This allows the output of `declare -f'
-         (with other flags), `export -f', and `readonly -f' to be reused as
-         shell input, instead of the old
-
-               declare -f[flags] func()
-               {
-                       foo
-               }
-
-         which has syntax errors.  When in posix mode, `export -fp' and
-         `readonly -fp' still don't print function definitions
-
-                                  2/16
-                                  ----
-parse.y
-       - comment out calls to discard_parser_constructs; no need to call
-         empty functions
-
-                                  2/18
-                                  ----
-lib/sh/memset.c
-       - replacement function for memset(3)
-
-lib/sh/Makefile.in, Makefile.in
-       - additions for memset.c
-
-configure.in,config.h.in
-       - check for memset, define HAVE_MEMSET if found, add memset.o to
-         LIBOBJS if not
-
-lib/malloc/malloc.c
-       - removed zmemset(), replaced with calls to memset(3)
-
-{subst,execute_cmd,lib/sh/netopen}.c
-       - replaced calls to bzero with calls to memset
-
-subst.c
-       - word_split() now takes a second argument: the value of $IFS, so
-         it doesn't have to look up IFS every time
-       - word_list_split() now calls getifs() and passes the result to
-         each call to word_split() as its second arg
-       - do a quick scan for CTLNUL in remove_quoted_nulls before allocating
-         new string, copying old string to it, copying over original string
-         and freeing new string
-
-eval.c
-       - don't bother calling dispose_used_env_vars if temporary_env is NULL
-
-execute_cmd.c
-       - fix fix_assignment_words to only look up the builtin corresponding
-         to the first word if one of the words in the list is marked as
-         W_ASSIGNMENT
-
-hashlib.c
-       - renamed hash_string to hash_bucket, which better reflects what it
-         does
-       - extracted the portion of hash_bucket that computes the hash out
-         into a new hash_string()
-       - made new body of hash_bucket into a macro HASH_BUCKET; function
-         just calls the macro
-       - calls to hash_bucket in this file now call HASH_BUCKET macro
-       - in add_hash_item, just add a new item at the front of the appropriate
-         bucket list instead of at the end
-
-hashcmd.h
-       - reduced FILENAME_HASH_BUCKETS to 53 from 107
-
-                                  2/19
-                                  ----
-hashlib.[ch]
-       - find_hash_item, remove_hash_item, add_hash_item all take a new
-         third `flags' argument
-       - add_hash_item doesn't call find_hash_item if HASH_NOSRCH passed in
-         flags arg
-       - find_hash_item will create a new hash table entry if HASH_CREATE is
-         passed in flags arg
-       - new function, hash_walk, takes a pointer to a function and a table
-         and calls the function for each item in the table.  If the function
-         returns < 0, the walk is terminated
-       - fixed flush_hash_table to set table->nentries to 0 after freeing
-         all entries
-       - BUCKET_CONTENTS now has a new `khash' member, what key hashes to;
-         set by HASH_BUCKET macro (which calls hash_string), assigned in
-         find_hash_item (HASH_CREATE) and add_hash_item
-       - find_hash_item and remove_hash_item check `khash' against the
-         hash of the string argument before calling strcmp
-
-{alias,hashlib,hashcmd,pcomplib,variables}.c
-       - changed all calls to {find,remove,add}_hash_item
-
-builtins/hash.def
-       - return immediately from print_hashed_commands if there are no
-         entries in the hash table (this eliminates need for `any_printed'
-         variable)
-       - change print_hashed_commands to use hash_walk
-
-alias.c
-       - short-circuit all_aliases and map_over_aliases if
-         HASH_ENTRIES(aliases) == 0
-       - simplify map_over_aliases by just allocating enough room in the
-         returned list for all entries in the aliases hash table, instead
-         of doing the check and xrealloc
-       - add_alias now calls add_hash_item with HASH_NOSRCH argument
-
-pcomplete.h
-       - sh_csprint_func_t is no more; use hash_wfunc instead
-
-pcomplib.c
-       - short-circuit print_all_compspecs if HASH_ENTRIES(prog_completes)
-         is 0
-       - print_all_compspecs now takes a `hash_wfunc *' argument
-       - print_all_compspecs now just calls hash_walk
-
-builtins/complete.def
-       - new function, print_compitem, takes a BUCKET_CONTENTS *, extracts
-         the right info, and calls print_one_completion
-
-variables.c
-       - short-circuit map_over_funcs if HASH_ENTRIES(shell_functions) == 0
-       - short-circuit flatten if the passed table has no entries
-       - bind_variable_internal takes a new fourth argument: `hflags',
-         to pass to hash table functions
-       - make_new_variable now passes HASH_NOSRCH flag to add_hash_item
-       - set_if_not now calls bind_variable_internal and passes
-         HASH_NOSRCH as flags argument
-       - bind_function now calls add_hash_item with HASH_NOSRCH argument
-       - fixed make_local_variable:  old_var == 0 && was_tmpvar can never
-         be true
-       - if we didn't find an old variable in make_local_variable, call
-         bind_variable_internal with HASH_NOSRCH argument
-       - fix push_temp_var to reset variable context to 0 if binding into
-         global_variables->table
-
-parse.y
-       - fix to parse_compound_assignment to avoid core dumps on empty
-         compound array assignments
-
-subst.c
-       - getifs() is now global so read_builtin can call it
-
-subst.h
-       - extern declaration for getifs()
-
-                                  2/20
-                                  ----
-hashlib.c
-       - changed hash_string to use a better hash function
-       - changed HASH_BUCKET to use masking rather than modulus to hash a
-         string to a bucket -- HASH TABLES MUST NOW BE SIZED BY POWERS
-         OF TWO
-
-hashlib.h
-       - DEFAULT_HASH_BUCKETS is now 64
-
-hashcmd.h
-       - FILENAME_HASH_BUCKETS is now 64
-
-pcomplib.c
-       - COMPLETE_HASH_BUCKETS is now 32
-
-variables.c
-       - TEMPENV_HASH_BUCKETS is now 4
-
-alias.c
-       - new define, ALIAS_HASH_BUCKETS, set to 16, used to size alias table
-
-hashlib.c
-       - removed initialize_hash_table; folded code into make_hash_table
-       - fixed copy_bucket_array to copy the `khash' member of an item
-       - renamed functions to be more systematic and easier for me:
-               make_hash_table -> hash_create
-               hash_table_nentries -> hash_size
-               copy_hash_table -> hash_copy
-               find_hash_item -> hash_search
-               remove_hash_item -> hash_remove
-               add_hash_item -> hash_insert
-               flush_hash_table -> hash_flush
-               dispose_hash_table -> hash_dispose
-               print_table_stats -> hash_pstats
-               get_hash_bucket -> hash_items
-       - changed hash_search to short-circuit if table->nentries == 0 and
-         HASH_CREATE has not been passed in the flags argument
-
-{alias,variables,hashcmd,pcomplib}.c
-       - renamed calls to all renamed functions from hashlib.c
-
-builtins/kill.def
-       - don't drop a leading `-' in a pid argument
-       - call kill_pid with an explicit third argument of 1 if the pid
-         argument to kill is < -1, rather than rely on the behavior of
-         kill(2)
-
-                                  2/21
-                                  ----
-subst.c
-       - quoted_strchr is no longer declared `inline'
-       - skip_double_quoted is no longer declared `inline'
-       - string_extract_double_quoted is no longer declared `inline'
-
-lib/readline/input.c
-       - rl_gather_tyi is now an `int' valued function; returns the number
-         of characters read (0 or 1) or -1 on error
-       - if rl_gather_tyi() returns -1 to rl_read_key(), set rl_done to 1
-         and return a newline; something is wrong with the input fd
-
-                                  2/25
-                                  ----
-variables.[ch]
-       - IFS is now a special variable
-       - new special var function, sv_ifs(), called when IFS is set or unset
-       - call setifs() when IFS is first set in initialize_shell_variables
-       - call setifs() from make_local_variable and assign_in_env if
-         appropriate
-       - if assign_in_env() is called with a var assignment like `VAR=',
-         make the value in the new SHELL_VAR created be "" like
-         do_assignment_internal does, since certain parts of the shell use
-         a NULL value as evidence that the variable is unset (though
-         attributes may have been assigned)
-       - if push_temp_var pushes something up to the global_variables table,
-         make sure that the context is set to 0
-       - new function dispose_temporary_env, called by both
-         dispose_used_env_vars and merge_temporary_env with different `free
-         func' function pointers; calls sv_ifs after disposing the temporary
-         environment
-       - push_exported_var now calls bind_variable_internal instead of
-         bind_variable
-       - pop_scope and pop_context now call sv_ifs
-
-subst.[ch]
-       - new global variables used to keep track of IFS state, to avoid
-         having to call find_variable("IFS") all the time:
-
-               ifs_var         the SHELL_VAR for IFS
-               ifs_value       ifs_var ? value_cell (ifs_var) : " \t\n"
-               ifs_cmap        bitmap of characters in ifs_value
-               ifs_firstc      first character in ifs_value
-
-       - new function setifs(), sets the aforementioned ifs variables each
-         time IFS is set or unset, and at nested scope exit
-       - instead of calling getifs() from inside subst.c, use ifs_value
-       - getifs() now just returns ifs_value
-       - use ifs_firstc in string_list_dollar_star()
-       - only call member() in issep() if separators is more than one char
-       - don't cache a bitmap every time expand_word_internal() is called;
-         use ifs_cmap instead
-       - new macro, isifs(c), checks whether C is in ifs_cmap
-
-builtins/read.def
-       - use issep() and isifs() macros instead of looking at $IFS directly
-
-syntax.h
-       - make sure macros that access sh_syntaxtab cast the argument to
-         `unsigned char' before array access
-       - new macros: issyntype(c, type) and notsyntype(c, type), check
-         sh_syntaxtab[c] for a particular flag value `type'
-
-                                  2/26
-                                  ----
-hashlib.h
-       - the `data' member of a `BUCKET_CONTENTS' is now a PTR_T
-
-{hashlib,alias,variables,hashcmd,pcomplib}.c
-       - removed some casts when assigning to and using `data' member of a
-         `BUCKET_CONTENTS'
-
-subst.c
-       - in split_at_delims, call make_word_list instead of allocating and
-         initializing a WORD_LIST * directly
-
-make_cmd.[ch]
-       - add_string_to_list is now just a macro that calls make_word_list
-       - make_simple_command now calls make_word_list instead of allocating
-         a WORD_LIST * directly
-
-                                  2/27
-                                  ----
-copy_cmd.c
-       - copy_word now calls make_bare_word to allocate the copy
-       - copy_word_list now calls make_word_list to allocate the copy
-
-shell.h
-       - include `ocache.h' for simple object caching
-       - call cmd_init() to initialize the WORD_DESC and WORD_LIST object
-         caches
-
-{make,dispose}_cmd.c
-       - allocate WORD_DESC * and WORD_LIST * vars from their respective
-         ocaches, and return them to the cache when disposing
-
-jobs.c
-       - renamed old `waiting_for_job' variable to `queue_sigchld', which
-         better reflects its intent:  sigchld_handler does not call waitchld
-         if `queue_sigchld' is non-zero, it simply increments the count of
-         waiting children
-       - cleanup_dead_jobs now just sets and clears queue_sigchld instead of
-         blocking and unblocking SIGCHLD; it calls waitchld at the end if
-         `sigchld' is non-zero, but that's not really necessary
-       - in setjstatus, only call xrealloc if `statsize' is less than the
-         number of processes passed -- no reason to do it if they're the
-         same
-
-                                  2/28
-                                  ----
-sig.[ch]
-       - reinitialize_signals is no more; initialize_signals takes an
-         argument saying whether or not we are reinitializing
-
-builtins/exec.def
-       - reinitialize_signals() -> initialize_signals(1)
-
-test.c
-       - fix filecomp() to work right when one file has a non-positive
-         timestamp and the other file does not exist
-
-doc/{bash.1,bashref.texi}
-       - document what happens for test's -nt and -ot operators when one
-         file operand exists and the other does not
-
-jobs.c
-       - if we haven't messed with SIGTTOU, just manipulate queue_sigchld
-         in notify_of_job_status instead of calling sigprocmask()
-       - list_one_job now calls pretty_print_job directly instead of going
-         through print_job
-       - pretty_print_job now must be called with SIGCHLD blocked or held
-         instead of blocking SIGCHLD itself
-       - changed start_job so that it doesn't call UNBLOCK_CHILD and then
-         immediately call BLOCK_CHILD again (explicitly or via last_pid()),
-         call find_last_pid instead of last_pid and then UNBLOCK_CHILD
-       - changed wait_for_job the same way
-       - find_last_pid now takes a second argument: block; uses BLOCK_CHILD
-         if `block' is 1, not otherwise.  Changed existing calls:
-               find_last_pid(j) -> find_last_pid(j, 0)
-               last_pid(j) -> find_last_pid(j, 1)
-         `last_pid()' is now gone
-       - rewrote wait_for_background_pids(); it was a little strange
-       
-copy_cmd.c
-       - copy_if_command: don't copy null false_case commands
-       - copy_simple_command: don't copy a null redirection list
-
-subst.c
-       - in get_word_from_string and list_string, just check for " \t\n"
-         directly rather than calling strcmp
-       - in get_word_from_string and strip_trailing_ifs_whitespace, use
-         isifs() instead of issep(), since they're never called with
-         separators != $IFS
-       - change issep() to call isifs if separators is longer than one
-         character, since it's never called with anything but "", " ",
-         or $IFS
-
-                                   3/1
-                                   ---
-sig.h
-       - enclose the BLOCK_SIGNAL macro in a do {...} while (0) loop, at it
-         should have been all along
-
-lib/readline/doc/rltech.texinfo
-       - document that readline defaults to stdin/stdout if rl_instream/
-         rl_outstream are NULL
-
-lib/readline/terminal.c
-       - if an application is using a custom redisplay function,
-         rl_resize_terminal just calls rl_forced_update_display to tell
-         (*rl_redisplay_func) to update the display, otherwise call
-         _rl_redisplay_after_sigwinch
-
-lib/readline/readline.c
-       - change readline_internal_setup() so the change to vi insertion mode
-         happens even if readline_echoing_p is 0
-       - don't print the prompt to rl_outstream in readline_internal_setup
-         if we're not echoing and the caller has defined a custom redisplay
-         function -- let the redisplay function deal with it
-
-configure.in
-       - new option: --enable-mem-scramble, controls memory scrambling on
-         free() (on by default; only affects use of bash malloc)
-
-config.h.in
-       - new option MEMSCRAMBLE, controlled by --enable-mem-scramble
-
-                                   3/5
-                                   ---
-parse.y
-       - added ksh-like behavior of [...] to read_token_word:  if a `[' is
-         seen in an assignment context and the previous characters in the
-         token form a valid identifier, parse the [...] with
-         parse_matched_pair to allow spaces (and newlines) in the subscript
-
-bashline.c
-       - new function bash_servicename_completion_function, for completing
-         service names from /etc/services
-
-bashline.h
-       - new extern declaration for bash_servicename_completion_function
-
-builtins/complete.def
-       - allow new `-s/-A service' option to complete and compgen builtins
-
-pcomplete.h
-       - new CA_SERVICE define, new ITEMLIST variable it_services
-
-pcomplete.c
-       - add callback to bash_servicename_completion_function to generate
-         list of matching service names for completion
-
-doc/bash.1,lib/readline/doc/rluser.texinfo
-       - documented new `-s/-A service' option to complete and compgen
-
-                                   3/6
-                                   ---
-builtins/read.def
-       - change hard-coded `0' to new variable `fd' (initially 0) in
-         preparation for adding `-u fd' option
-
-bashline.c
-       - bash_directory_completion_hook calls expand_prompt_string instead
-         of expand_string (it does the right thing).  This keeps expansion
-         errors from causing a longjmp, which shouldn't happen because of
-         completion
-       - command_subst_completion_function was augmented very slightly to
-         do filename completion on a non-command-word in a command
-         substitution
-       - command_subst_completion_function now skips over the lcd that
-         rl_completion_matches puts in matches[0] if there is more than
-         one possible completion
-
-                                   3/7
-                                   ---
-builtins/read.def
-       - only add the unwind_protect to free `rlbuf' if `edit' is non-zero,
-         since we won't be using readline otherwise
-
-lib/sh/zread.c
-       - renamed zread1 -> zreadintr
-
-redir.c
-       - small change to redirection_error() to make a slightly better
-         guess about the invalid file descriptor if the redirection op is
-         r_duplicating_input or r_duplicating_output
-
-include/stdc.h
-       - new macro, SH_VA_START, to encapsulate the difference between
-         stdarg va_start and varargs va_start
-
-{error,pcomplete,print_cmd}.c,builtins/common.c,lib/sh/snprintf.c
-       - use SH_VA_START
-
-                                   3/8
-                                   ---
-builtins/read.def
-       - support for the ksh-like `-u fd' option
-
-general.c
-       - new function sh_validfd(fd), returns 1 if fd is a valid open file
-         descriptor
-
-general.h
-       - extern decl for sh_validfd
-
-bashline.c
-       - don't call posix_readline_initialize() from initialize_readline();
-         sv_strict_posix() should already have taken care of it
-
-                                  3/11
-                                  ----
-{error,pcomplete,print_cmd}.c, builtins/common.c
-       - removed non-varargs versions of functions
-
-builtins/printf.def
-       - if the string argument to %q has non-printing characters, call
-         ansic_quote to quote it rather than sh_backslash_quote
-
-variables.h
-       - new attribute: att_trace (and corresponding trace_p() macro).
-         Functions with this attribute will inherit the DEBUG trap.
-         Currently ignored for variables
-
-builtins/declare.def
-       - new `-t' option to declare/typeset toggle the `att_trace' attribute
-
-builtins/setattr.def
-       - check for att_trace and output `-t' flag in show_var_attributes
-
-execute_cmd.c
-       - if a function is being traced (it has the `-t' attribute set),
-         don't turn off the DEBUG trap when it executes
-
-doc/{bash.1,bashref.texi}
-       - document the new `-t' option to declare/typeset
-
-                                  3/12
-                                  ----
-execute_cmd.c
-       - don't execute the debug trap in the `cm_simple:' case of
-         execute_command_internal; run it in execute_simple_command so we
-         get the line number information right when executing in a shell
-         function
-       - run a DEBUG trap before executing ((...)) arithmetic commands,
-         like ksh93
-       - run a DEBUG trap before executing [[...]] conditional commands,
-         like ksh93
-
-eval.c
-       - add a static forward declaration for alrm_catcher()
-
-general.c
-       - add static forward declarations for bash_special_tilde_expansions,
-         unquoted_tilde_word, initialize_group_array
-
-variables.h
-       - add extern declarations for sh_get_env_value, map_over_funcs,
-         local_exported_variables
-
-variables.c
-       - add static forward declarations for dispose_temporary_env,
-         make_func_export_array
-
-bashhist.c
-       - add static forward declaration for check_history_control
-
-configure.in
-       - add a call to AC_CHECK_DECLS for strcpy
-
-config.h.in
-       - add placeholder for HAVE_DECL_STRCPY define, set by configure
-
-general.h
-       - don't declare strcpy if HAVE_DECL_STRCPY is defined with a non-zero
-         value
-
-sig.h
-       - add prototype to typedef of SigHandler
-
-lib/readline/histlib.h
-       - removed extern declaration of strcpy()
-       - include string.h/strings.h directly in histlib.h instead of source
-         files
-
-lib/readline/{histexpand,histfile,history,histsearch}.c
-       - don't include string.h/strings.h now that histlib.h includes it
-
-lib/tilde/tilde.c
-       - removed extern declaration of strcpy(), rely on string.h/strings.h
-
-command.h
-       - four new redirection types: r_move_input, r_move_output,
-         r_move_input_word, r_move_output_word, for
-         [N]<&word- and [N]>&word- from ksh93
-
-print_cmd.c
-       - changes to print r_move_input[_word] and r_move_output[_word]
-
-copy_cmd.c
-       - changes to copy r_move_input[_word] and r_move_output[_word]
-
-dispose_cmd.c
-       - changes to dispose r_move_input_word and r_move_output_word
-
-make_cmd.c
-       - changes to make r_move_input[_word] and r_move_output[_word] from
-         r_duplicating_{input,output}_word, which is how the new redirs
-         are passed by the parser
-
-redir.c
-       - changes to make r_move_input[_word] and r_move_output[_word] do
-         the right thing when executed
-
-builtins/read.def
-       - print an error message and return failure immediately if zread/zreadc
-         return < 0
-
-doc/{bash.1,bashref.texi}
-       - documented new [n]<&word- and [n]>&word- redirections
-
-                                  3/13
-                                  ----
-lib/readline/isearch.c 
-       - enabled code to allow chars bound to rl_rubout to delete characters
-         from the incremental search string
-
-shell.c
-       - add `-l' invocation option to parse_shell_options; equivalent to
-         `--login'
-       - fixed set_login_shell to check first char of base pathname of argv0
-         for `-', like other shells
-       - move the check for make_login_shell after the call to
-         parse_shell_options because the `-l' option might set it
-
-doc/{bash.1,bashref.texi}
-       - documented new `-l' invocation option
-
-array.c
-       - new function, array_shift, shifts an array left by a specified
-         number of elements
-       - array_walk is now compiled in by default
-       - array_to_assignment_string now takes a second argument: int quoted.
-         If non-zero, the result is single-quoted before being returned
-       - quoted_array_assignment_string has been removed
-
-array.[ch]
-       - renamed most of the array functions so that all have an array_
-         prefix and are more systematically named
-       - array_slice now preserves the indicies from the original array
-       - change array_to_assign to use a static buffer for expanding the
-         array indices, instead of malloc/free
-
-{arrayfunc,subst,variables}.c, builtins/read.def
-       - changed calls to various array functions to use new names
-
-lib/sh/stringvec.c, externs.h
-       - renamed all of the functions to have a strvec_ prefix and to have
-         a more sensible name scheme
-       - strvec_search's arguments are now supplied in reverse order, so
-         the char **array is first, like the other functions
-       - new function, strvec_resize, xrealloc for strvecs
-
-{alias,array,bracecomp,braces,bashline,execute_cmd,findcmd,general,pathexp,
-pcomplete,variables}.c
-lib/sh/stringlist.c
-builtins/{bind,complete,exec,getopts,pushd,set}.def
-       - change calls to all functions from lib/sh/stringvec.c
-       - use strvec_resize where appropriate
-
-externs.h
-       - only declare dup2() if HAVE_DUP2 is undefined or DUP2_BROKEN is
-         defined
-
-lib/readline/{macro,readline,util}.c, lib/readline/rlprivate.h
-       - _rl_defining_kbd_macro is gone, use RL_ISSTATE(RL_STATE_MACRODEF)
-
-lib/readline/readline.h
-       - new struct readline_state, encapsulates most of readline's internal
-         state in case you need reentrancy or nested calls to readline()
-       - extern declarations for rl_save_state, rl_restore_state
-
-lib/readline/readline.c
-       - add (undocumented) int rl_save_state (struct readline_state *),
-         int rl_restore_state (struct readline_state *)
-
-                                  3/14
-                                  ----
-array.[ch]
-       - new function, array_rshift, shifts an array right by a specified
-         number of elements, optionally inserting a new element 0
-
-examples/bashdb/bashdb
-       - new single-file version of bash debugger, originally modified from
-         version in bash-2.04 by Gary Vaughan (the old debugger still
-         appears in examples/obashdb).  This version has a more gdb-like
-         command set
-
-examples/bashdb/bashdb.el
-       - new emacs bashdb debugger mode from Masatake YAMATO <jet@gyve.org>
-
-execute_cmd.c
-       - don't make $LINENO relative to function start unless the shell is
-         currently interactive -- this is what ksh93 does and what I
-         believe to be the intent of POSIX.2 (this required changing some
-         of the test checks because the output has changed)
-       - run the debug trap for each command in an arithmetic for expression,
-         like ksh93 does
-
-lib/readline/vi_mode.c
-       - redid rl_vi_subst (binding func for `s' and `S') in terms of
-         rl_vi_change_to:  `S' == `cc' and `s' == `c '.  This makes undo
-         work right
-
-                                  3/18
-                                  ----
-hashlib.c
-       - fixed hash_walk to return if the item function returns < 0, instead
-         of breaking out of the current hash chain
-
-array.c
-       - fixed array_walk to return if the item function returns < 0, like
-         hash_walk
-
-lib/sh/stringlist.c, externs.h
-       - new function: strlist_walk, takes a stringlist and a pointer to an
-         item func.  Like other _walk funcs, if item func returns < 0 the
-         walk is cancelled
-       - new function: strlist_flush, frees items in the contained list
-         with strvec_flush
-       - renamed functions to have a strlist_ prefix and be more systematic
-
-pcomplib.c,pcomplete.h
-       - removed redundant `progcomp_initialized' variable
-       - renamed functions to have `progcomp_' or `compspec_' prefixes
-         like the hash library
-
-{bashline,pcomplete}.c,builtins/complete.def
-       - fixed calls to stringlist functions to use new names
-       - fixed calls to functions in pcomplib.c to use new names
-
-pcomplete.c
-       - made the debugging code #ifdef DEBUG -- it should be mature enough
-
-builtins/hash.def,parse.y
-       - use REVERSE_LIST(x, t) instead of (t)reverse_list(x)
-
-list.c,{externs,general}.h
-       - renamed the list functions to have a list_ prefix, changed callers
-
-externs.h,{execute_cmd,stringlib,subst}.c,builtins/common.c,lib/sh/stringvec.c
-       - word_list_to_argv -> strvec_from_word_list
-       - argv_to_word_list -> strvec_to_word_list
-       - moved functions to lib/sh/stringvec.c
-
-lib/sh/stringvec.c
-       - changed name of second argument to strvec_from_word_list from `copy'
-         to `alloc' so the use of `copy' between strvec_from_word_list and
-         strvec_to_word_list isn't as confusing
-       - changed name and sense of second argument to
-         strvec_to_word_list from `copy' to `alloc' for the same reason --
-         now both functions agree on semantics of second argument
-
-lib/sh/stringlist.c
-       - ditto for strlist_from_word_list and strlist_to_word_list
-
-subst.c
-       - changed callers of strvec_to_word_list
-
-                                  3/19
-                                  ----
-builtins/hash.def
-       - added `-l' option to list table or individual targets in reusable
-         format
-       - added `-d' option to remove one or more names from the table of
-         hashed commands (provides `unhash' or `unalias -t' functionality)
-
-doc/{bash.1,bashref.texi}
-       - documented new `-l' and `-d' options to `hash'
-
-hashcmd.[ch]
-       - renamed functions to have a `phash_' prefix and follow new naming
-         convention
-       - phash_remove now returns an int:  1 if command not in hash table,
-         0 if filename removed OK
-
-{findcmd,variables}.c, builtins/{hash,type}.def
-       - changed callers to use new names from hashcmd.c
-
-builtins/common.[ch]
-       - new function, sh_notfound(s), prints standard `not found' message
-       - new function, sh_invalidid(s), prints standard `invalid identifier'
-         message
-       - new function, sh_restricted(s), prints standard `restricted' message
-         for restricted shells
-       - new function, sh_invalidnum(s), prints standard `invalid number'
-         message
-       - renamed bad_option to sh_invalidopt, changed to print
-         `invalid option' instead of `unknown option'
-       - new function, sh_invalidoptname, prints standard `invalid option
-         name' for long options
-       - new function, sh_badjob (s), prints standard `no such job' message
-       - new function, sh_invalidsig (s), prints standard `invalid signal
-         specification' message
-       - new function, sh_nojobs (s), prints standard `no job control' message
-       - new function, sh_needarg (s), prints standard `option requires an
-         argument' message
-       - new function, sh_neednumarg (s), prints standard `numeric
-         argument required' message
-       - new function, sh_badpid(s), prints standard `not a pid...' message
-       - new function, sh_erange (s, desc) prints standard `out of range'
-         message, optionally using `desc' to say what the argument is
-
-builtins/{alias,command,declare,exec,hash,type}.def
-       - call sh_notfound() instead of calling builtin_error directly
-
-builtins/{declare,getopts,read,set,setattr}.def
-       - call sh_invalidid() instead of calling builtin_error directly
-
-builtins/{cd,command,enable,exec,hash,source}.def
-       - call sh_restricted() instead of calling builtin_error directly
-
-builtins/{printf,read,ulimit}.def, builtins/common.c
-       - call sh_invalidnum instead of calling builtin_error directly
-
-builtins/{complete,declare,pushd,set}.def, builtins/bashgetopt.c
-       - call sh_invalidopt instead of bad_option or builtin_error directly
-
-builtins/{complete,set,shopt}.def
-       - call sh_invalidoptname instead of builtin_error directly
-
-builtins/{fg_bg,jobs,kill,wait}.def
-       - call sh_badjob instead of calling builtin_error directly
-
-builtins/common.c, builtins/{kill,signal}.def
-       - call sh_invalidsig instead of calling builtin_error directly
-
-builtins/{fg_bg,suspend,wait}.def
-       - call sh_nojobs instead of calling builtin_error directly
-
-builtins/{common,bashgetopt}.c, builtins/{hash,kill}.def
-       - call sh_neednumarg and sh_needarg where required
-
-builtins/{kill,wait}.def
-       - call sh_badpid where required
-
-builtins/{break,fc,history,pushd,shift,ulimit,umask}.def
-       - call sh_erange where appropriate
-
-builtins/printf.def
-       - new static function, printf_erange, prints standard out-of-range
-         warning message
-
-builtins/set.def
-       - changed so that calls to sh_invalidopt always include the leading
-         `+' or `-'
-
-builtins/shopt.def
-       - changed SHOPT_ERROR macro to shopt_error function
-
-builtins/bind.def
-       - regularized error messages to `bind: object: error string' like
-         other error messages
-
-builtins.h
-       - the `short_doc' member of a `struct builtin' is now of type
-         `const char *'
-       - the strings in `long_doc' array of a struct builtin are now const
-
-builtins/mkbuiltins.c
-       - changes for new `const' members of struct builtin
-
-                                  3/20
-                                  ----
-lib/readline/histfile.c
-       - use pointers instead of indexing into buffer when reading the
-         contents of the history file in read_history_range and
-         history_truncate_file
-
-                                  3/21
-                                  ----
-lib/readline/histfile.c
-       - new file, with code to mmap the history file for reading and
-         writing (depends on HAVE_MMAP, currently nothing checks for that)
-
-                                  3/25
-                                  ----
-error.[ch]
-       - new function, err_badarraysub(s), calls report_error with standard
-         `bad array subscript' message
-       - new function, err_unboundvar(s), calls report_error with standard
-         `unbound variable' message
-       - new function, err_readonly(s), calls report_error with standard
-         `readonly variable' message
-
-{arrayfunc,subst}.c
-       - call err_badarraysub where appropriate
-
-{expr,subst}.c
-       - call err_unboundvar where appropriate
-
-{arrayfunc,variables}.c
-       - call err_readonly where appropriate
-
-shell.c
-       - changed text of bad option error messages to be the same as that
-         printed for builtin errors
-
-builtins/common.c
-       - changed sh_invalidopt to print the invalid option before the rest
-         of the error message (required some tests to be modified)
-       - new function, sh_readonly, calls builtin_error with standard
-         `readonly variable' message
-
-variables.c,builtins/declare.def
-       - call sh_readonly where appropriate
-
-lib/sh/stringvec.c
-       - added strvec_remove (sv, s), removes S from SV and shuffles rest of
-         elements down 1
-
-lib/sh/stringlist.c
-       - added strlist_remove(sl, s), just calls strvec_remove on the
-         component list
-
-externs.h
-       - new extern declarations for strvec_remove and strlist_remove
-       - fixed extern declaration for strvec_search; the arguments were
-         reversed (unimportant, it's not compiled into the shell)
-
-subst.c
-       - change param_expand to call quote_escapes on values retrieved when
-         expanding the positional parameters
-       - change parameter_brace_expand_word to quote escapes on values
-         retrieved when expanding the positional parameters
-       - fix parameter_brace_substring to quote escape characters on unquoted
-         substrings extracted from variable values (needed to separate case
-         VT_VARIABLE from VT_ARRAYMEMBER for this, since, because
-         get_var_and_type calls array_value for VT_ARRAYMEMBER, we need to
-         skip over quoted characters in an already-appropriately-quoted
-         string to find the substring we want)
-       - fix parameter_brace_substring to quote escape characters in the
-         value returned by pos_params when expanding subsets of the
-         positional parameters and not within double quotes (in which case
-         pos_params() quotes the string for us)
-       - fix parameter_brace_substring to quote escape characters in the
-         value returned by array_subrange when expanding subsets of an
-         array and not within double quotes (in which case
-         array_subrange() quotes the string for us)
-       - new function, quoted_strlen(s), does strlen(s) while skipping over
-         characters quoted with CTLESC (#ifdef INCLUDE_UNUSED, since it's
-         not used yet)
-       - changed pos_params() so it always returns a list whose members are
-         quoted strings if (quoted&(Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) != 0
-
-arrayfunc.c
-       - fix array_value to consistently call quote_escapes, even when a
-         non-array variable is being subscripted with element 0, in which
-         case we return the variable value
-
-lib/sh/strtrans.c
-       - make the for_echo parameter to ansicstr a `flags' parameter that
-         has its old `for echo' meaning if flags&1 is non-zero (which is
-         consistent with the old code)
-       - Added code to the `flags' parameter to ansicstr so that if flags&2
-         is non-zero, CTLESC and CTLNUL are escaped with CTLESC in the
-         expanded string
-       - change ansiexpand() to call ansicstr with a `flags' parameter of 2
-
-                                  3/26
-                                  ----
-lib/readline/histfile.c
-       - when reading and writing the history file, use malloc instead of
-         xmalloc and handle failures gracefully, so the application doesn't
-         abort if the history file or history list is too big
-
-                                  3/27
-                                  ----
-arrayfunc.c
-       - changed array_value_internal to take an additional `int *'
-         parameter, in which is returned the type of array indexing
-         performed (array[@] vs. array or array[index])
-       - changed array_value and get_array_value to take a corresponding
-         extra parameter and pass it to array_value_internal
-       - changed array_value_internal to no longer return newly-allocated
-         memory or quote CTLESC and CTLNUL in the returned string if
-         `simple' array indexing (subscript not `@' or `*') is being
-         performed.  This makes it more like a variable lookup
-
-arrayfunc.h
-       - changed prototypes for array_value and get_array_value
-
-expr.c
-       - added new parameter to call to get_array_value in expr_streval
-       - don't need to free memory returned by get_array_value any more
-
-subst.c
-       - quote_escapes now works with multibyte characters
-       - dequote_string now works with multibyte characters
-       - dequote_escapes is now needed, so it's compiled in, and it
-         now works with multibyte characters
-       - remove_quoted_escapes now just calls dequote_escapes and copies the
-         result over the argument string
-       - remove_quoted_nulls now returns its char * argument, parallels
-         remove_quoted_escapes
-       - parameter_brace_expand_word now passes the new argument to
-         array_value and quotes CTLESC and CTLNUL in the result if it's a
-         `simple' array expansion by calling quote_escapes
-       - get_var_and_type now returns VT_ARRAYMEMBER for references like
-         ${array} where `array' is an array variable (just like ${array[0]}).
-         Documented (in comment) that a VT_VARIABLE return value means that
-         quote_escapes has been called at some point
-       - changed callers of get_var_and_type to no longer free value if
-         VT_ARRAYMEMBER is returned as type
-       - changed parameter_brace_substring and parameter_brace_patsub to
-         call dequote_escapes on the value from get_var_and_type if the
-         type is VT_VARIABLE, since the substring and pattern substitution
-         code doesn't understand CTLESC quoting
-       - parameter_brace_substring no longer needs to call quoted_substring
-         for the VT_ARRAYMEMBER case
-       - changed parameter_brace_patsub to call quote_escapes on the result
-         of pat_subst for the VT_VARIABLE and VT_ARRAYMEMBER cases, and to
-         quote the returned string in the VT_ARRAYVAR and VT_POSPARAMS cases
-         if the `MATCH_QUOTED' flag isn't set (if it is, the pattern
-         substitution functions perform any necessary quoting)
-       - quoted_substring is no longer used; it's now #ifdef INCLUDE_UNUSED
-
-lib/malloc/mstats.h
-       - new member in _malstats: u_bits32_t bytesreq, the total number of
-         bytes requested by the caller via calls to malloc() and realloc()
-
-lib/malloc/stats.c
-       - print bytesreq member in _print_malloc_stats
-       - don't print statistics for buckets for which nmal == 0 (no mallocs)
-
-lib/malloc/malloc.c
-       - modified internal_malloc, internal_realloc to keep running total of
-         number of bytes requested by calling application
-
-shell.c
-       - sh_exit is now compiled in; exit_shell calls sh_exit
-
-error.c
-       - changed fatal_error, report_error, parser_error to call sh_exit
-
-                                  3/28
-                                  ----
-subst.[ch]
-       - changed Q_NOQUOTE to Q_PATQUOTE; it makes the intent more clear
-
-subst.c
-       - moved code from parameter_brace_expand into a new function that
-         dispatches for pattern substitution: parameter_brace_remove_pattern
-       - changed structure of parameter_brace_remove_pattern to be like
-         parameter_brace_patsub and its ilk:  call get_var_and_type to
-         isolate the variable name, move the pattern isolation code out of
-         the various *_remove_pattern functions into
-         parameter_brace_remove_pattern and pass the results to the various
-         functions, use a switch on the return value from get_var_and_type
-         to decide which function to call, regularized the arguments to the
-         separate pattern removal functions
-       - parameter_brace_remove_pattern now properly quotes escape chars in
-         the returned value
-       - changed get_var_and_type to call dequote_escapes on the `value'
-         parameter for case VT_VARIABLE and return the result in *valp,
-         so the calling functions don't have to do it themselves; changed
-         callers appropriately
-       - fixed getpattern() where it broke posix compliance:  if you enclose
-         a pattern removal spec in double quotes, the outer double quotes
-         have no effect on the pattern (POSIX.1-200x 2.6.2).  This uncovered
-         a bug in the test suite (!)
-
-pathexp.c
-       - fixed a problem with quote_string_for_globbing where it would change
-         consecutive CTLESC chars all to \ instead of changing every other
-         quoted char
-
-                                  3/31
-                                  ----
-lib/malloc/{malloc,stats}.c
-       - moved declaration of _mstats to malloc.c so stats.o doesn't get
-         linked into the shell if the stats functions aren't called
-
-                                   4/2
-                                   ---
-lib/glob/smatch.c
-       - introduce `XCHAR' define, which is the type of arguments passed to
-         strcoll/strcmp/strlen and their wide-character equivalents, added
-         appropriate casts
-       - static arrays in single-byte version of rangecmp() are `char', not
-         `unsigned char', so compilers don't complain about calls to strcoll
-
-lib/glob/sm_loop.c
-       - casts for `XCHAR' and `XCHAR *' arguments to libc functions
-       - use prototype declaration for BRACKMATCH if `PROTOTYPES' is defined
-         to avoid problems with type promotion (unsigned char -> int)
-
-lib/glob/collsyms.h
-       - `name' member of struct _COLLSYM is now of type `XCHAR *', since
-         some compilers don't like `unsigned char *' initializers from
-         constant strings
-
-[bash-2.05b-alpha1 released]
-
-                                   4/3
-                                   ---
-builtins/{evalstring.c,common.h}
-       - new flag for parse_and_execute, SEVAL_NOFREE, means to not free
-         the argument string when finished
-
-lib/readline/text.c
-       - fixed a trivial typo in _rl_insert_char when reading multibyte
-         char sequences
-       - replace calls to ding() with rl_ding()
-
-include/chartypes.h
-       - remove SIGN_EXTEND_CHAR and TOASCII macros; they're unused
-
-make_cmd.c
-       - include dispose_cmd.h for extern function declarations
-
-lib/glob/glob.c
-       - include `shmbutil.h' and `xmalloc.h' for extern function declarations
-
-lib/glob/smatch.c
-       - include `xmalloc.h' for extern function declarations
-
-shell.c
-       - fix maybe_make_restricted to use its argument instead of global
-         `shell_name'
-
-version.c
-       - update copyright message to include this year
-
-lib/readline/display.c
-       - fixes from Jiro SEKIBA <jir@yamato.ibm.com> to fix autowrapping
-         when using multibyte characters
-
-lib/glob/sm_loop.c
-       - fixed a problem in BRACKMATCH where not enough memory was allocated
-         to hold a multibyte character when parsing POSIX.2 char class names
-
-support/config.{guess,sub}
-       - updated via patch from Paul Eggert with latest GNU additions
-
-variables.c
-       - var_lookup should use its `vcontext' argument instead of
-         unconditionally using `shell_variables'
-
-                                   4/4
-                                   ---
-builtins/bind.def,doc/{bash.1,bashref.texi}
-       - changed the usage summary and help text to make it clear that any
-         readline command that may appear in ~/.inputrc may be supplied as
-         one of the non-option arguments to `bind'
-
-builtins/mkbuiltins.c
-       - added support for `-H' option, which means to write long documentation
-         for each builtin to a separate file in the `helpfiles' directory
-
-builtins/Makefile.in
-       - new target `helpdoc', just creates long doc files in helpfiles
-         directory
-
-lib/sh/zcatfd.c
-       - new file, with zcatfd(int fd, int ofd, char *fn); dumps data from
-         FD to OFD
-
-Makefile.in,lib/sh/Makefile.in
-       - added zcatfd.c, zcatfd.o member of libsh.a
-
-builtins/evalstring.c
-       - changed cat_file to call zcatfd(fd, 1, fn)
-
-builtins/{shopt,colon}.def
-       - removed the $DOCNAME directive for `shopt', `true', and `false';
-         just use the names
-       - changed $DOCNAME for `:' to just be `colon' instead of
-         `colon_builtin'
-
-builtins/reserved.def
-       - added help entries for ((, [[, `for (('
-
-builtins/let.def
-       - add id++, id--, ++id, --id, ** to help text
-
-                                   4/8
-                                   ---
-builtins/bashgetopt.[ch]
-       - changed to allow options beginning with `+', enabled by a leading
-         `+' in the option string
-       - new variable, list_opttype, set to `-' or `+'
-
-builtins/{common.c,{builtin,eval,exit,fg_bg,let,printf,pushd,return,source,wait}.def
-       - changes to allow a `--' option for every builtin that accepts
-         operands but not options, as per posix.1-2001
-
-builtins/{declare,setattr}.def
-       - use internal_getopt for parsing options, now that it supports `+'
-
-builtins/set.def
-       - use internal_getopt for initial option parse, now that it supports
-         a leading `+'
-
-
-{configure,Makefile}.in, builtins/{Makefile.in,help.def,mkbuiltins.c}
-       - support for a new configure option, ``--enable-separate-helpfiles'',
-         moves the `long' help text to separate help files, installed by
-         default into ${datadir}/bash, one file per builtin.  Off by
-         default -- it saves 47K, but it's only 47K, and it's in the text
-         segment
-
-flags.c
-       - build internal_getopt() option string argument from flags array at
-         runtime in shell.c
-
-shell.c
-       - new variable to control writing malloc stats at exit:
-         malloc_trace_at_exit, 0 by default
-
-lib/malloc/malloc.c
-       - heavily updated:
-               o partial page allocated on first call to malloc to make
-                 subsequent sbrks page-aligned no longer wasted
-               o begin and end range guards are now the same value: the chunk
-                 requested
-               o coalescing code was changed to attempt to coalesce first two
-                 adjacent blocks on the free list; enabled by default
-               o blocks of size 32 are now candidates for larger block
-                 splitting, since 32 is the most popular size
-               o blocks of size 32 are now candidates for smaller block
-                 coalescing
-               o the IN_BUCKET check was changed to just make sure that the
-                 size isn't too big for the bucket, since the `busy block'
-                 checking code may increase the bucket by one or more,
-                 meaning that the old check would fail and cause a panic when
-                 a chunk allocated in such a way was freed
-               o bin sizes are now precomputed and looked up in an array
-                 rather than being computed at runtime
-               o moved the _mstats declaration here to avoid the stats code
-                 being linked in even when no stats functions were called
-                 (only matters if MALLOC_DEBUG is defined)
-               o malloc now keeps track of the address of the top of the heap
-                 and will return large chunks to the system with calls to
-                 sbrk with a negative argument when freeing the top chunk.
-                 Two thresholds:  LESSCORE_FRC means to unconditionally return
-                 memory to the system; LESSCORE_MIN means to return memory if
-                 there's at least one block already on the free list
-
-lib/malloc/mstats.h
-       - stats struct now keeps track of number of block coalesces by bin,
-         and the number of times memory was returned to the system by bin
-
-lib/malloc/stats.c
-       - trace_malloc_stats now takes a second argument: the name of the file
-         to write to.  The first `%p' in the template file name is replaced
-         by the pid
-
-                                   4/9
-                                   ---
-lib/malloc/imalloc.h
-       - added some macros derived from dlmalloc and glibc malloc to inline
-         memcpy and memset if the requested size is <= 32 bytes
-
-lib/malloc/malloc.c
-       - use MALLOC_MEMSET instead of memset in internal_{malloc,free}
-
-include/ocache.h
-       - use OC_MEMSET (variant of MALLOC_MEMSET) in ocache_free
-
-configure.in, config.h.in
-       - check for getservent(), define HAVE_GETSERVENT if found
-
-bashline.c
-       - punt immediately from bash_servicename_completion_function if
-         HAVE_GETSERVENT is not defined (cygwin seems to not define it)
-       - include "input.h" for extern save_token_state() and
-         restore_token_state() declarations
-       - change bash_execute_unix_command to call parse_and_execute with
-         SEVAL_NOHIST flag so the command doesn't get saved on the history
-         list
-       - change bash_execute_unix_command to save and restore the current
-         command line count and the token state (last_read_token, etc.).
-         Everything else is saved by either parse_and_execute directly or
-         the call it makes to push_stream().  The shell_input_line stuff
-         doesn't need to be saved and restored; it's not computed until
-         readline() returns
-
-                                  4/10
-                                  ----
-lib/glob/glob.[ch]
-       - glob_filename and glob_vector now take an additional `flags' arg
-       - define GX_MARKDIRS as possible flag value for glob_filename and
-         glob_vector
-
-lib/sh/snprintf.c
-       - fixed some bugs with handling of `g' and `G' formats
-       - make sure numtoa returns the fractional part correctly when passed 0
-       - implemented thousands grouping for `'' flag character
-
-lib/sh/rename.c
-       - a few changes to make it more bulletproof
-
-                                  4/11
-                                  ----
-lib/glob/glob.c
-       - added the couple of dozen lines of code to glob_dir_to_array to
-         finish implementing GX_MARKDIRS
-
-builtins/set.def
-       - changed unset builtin so that it no longer considers unsetting an
-         unset variable or function to be an error
-
-lib/readline/display.c
-       - fix to rl_redisplay for a problem which caused display to be messed
-         up when the last line of a multi-line prompt (possibly containing
-         invisible characters) was longer than the screen width
-
-                                  4/15
-                                  ----
-aclocal.m4
-       - use AC_DEFINE_UNQUOTED in BASH_SYS_DEFAULT_MAIL_DIR instead of
-         enumerating all of the possible values and using AC_DEFINE
-
-                                  4/16
-                                  ----
-Makefile.in, {builtins,support}/Makefile.in
-       - new variables, CFLAGS_FOR_BUILD and CPPFLAGS_FOR_BUILD, substituted
-         by `configure'
-       - changed CCFLAGS_FOR_BUILD to BASE_CCFLAGS, removing $(CPPFLAGS);
-         CCFLAGS and CCFLAGS_FOR_BUILD now include $(BASE_CCFLAGS) with
-         (possibly) different values for CPPFLAGS and CFLAGS 
-       - GCC_LINT_CFLAGS now includes $(BASE_CCFLAGS) and $(CPPFLAGS)
-         instead of CCFLAGS_FOR_BUILD
-       - new variable, LDFLAGS_FOR_BUILD, right now equivalent to LDFLAGS
-       - remove $(CPPFLAGS) from recipes for buildversion, mksignames, and
-         mksyntax
-
-configure.in
-       - compute and substitute CFLAGS_FOR_BUILD, CPPFLAGS_FOR_BUILD, and
-         LDFLAGS_FOR_BUILD
-       - changed qnx to use LOCAL_LDFLAGS and LOCAL_LIBS instead of putting
-         everything in LOCAL_LDFLAGS
-
-builtins/Makefile.in
-       - remove $(PROFILE_FLAGS) from recipe for building `mkbuiltins'
-       - use LDFLAGS_FOR_BUILD instead of LDFLAGS in recipe for building
-         `mkbuiltins'
-
-Makefile.in
-       - use $(CC_FOR_BUILD) and $(CCFLAGS_FOR_BUILD) to build auxiliary
-         test programs (printenv, recho, zecho)
-
-support/Makefile.in
-       - use CC_FOR_BUILD and CCFLAGS_FOR_BUILD in recipe for building
-         `man2html'
-
-lib/tilde/Makefile.in
-       - substitute PROFILE_FLAGS, use PROFILE_FLAGS in $(CCFLAGS)
-
-                                  4/25
-                                  ----
-Makefile.in, configure.in
-       - moved RELSTATUS to configure.in; configure substitutes it into
-         the generated Makefile
-
-lib/sh/snprintf.c
-       - fix wchars() to deal with systems where MB_CUR_MAX is not a
-         constant expression
-
-                                   5/2
-                                   ---
-lib/sh/shquote.c
-       - add `,' to list of chars that are backslash-quoted.  It doesn't
-         hurt normal usage and prevents filenames with commas from being
-         inappropriately split by brace expansion after using
-         complete-into-braces
-
-                                   5/6
-                                   ---
-lib/sh/xstrchr.c
-       - we only need the check of MB_CUR_MAX and the slow code for a
-         few encodings, and even then only for a subset of the charset
-
-arrayfunc.c
-       - some speedups for skipsubscript and multibyte chars from Bruno Haible
-
-locale.c
-       - changed set_lang to call setlocale(LC_ALL, ...) if LC_ALL doesn't
-         already have a value, but doesn't change any shell variables
-
-include/shmbutil.h
-       - major speedups from Bruno Haible, mostly concerned with reducing
-         the number of strlen(3) calls
-
-subst.c
-       - change callers of macros in shmbutil.h to add extra argument as
-         necessary
-       - skip_single_quoted and skip_double_quoted take another argument:
-         the length of the string; mostly useful when using multibyte chars
-       - many speedups from precomputing string lengths at function start
-       - fixed a small bug in de_backslash in the midst of rewriting for
-         better efficiency
-
-{braces,make_cmd,pathexp}.c
-       - change callers of macros in shmbutil.h to add extra argument as
-         necessary
-
-pathexp.c
-       - fix a one-too-far problem with multibyte chars in
-         unquoted_glob_pattern_p
-
-braces.c
-       - brace_gobbler takes a new argument, the length of the passed string
-       - expand_amble takes a new argument, the length of the passed string
-
-                                   5/7
-                                   ---
-subst.c
-       - modified remove_quoted_nulls to eliminate the memory allocation and
-         do the copy in place using the same strategy as de_backslash
-
-lib/readline/{rldefs.h,complete.c}
-       - new define RL_QF_OTHER_QUOTE, so _rl_find_completion_word can note
-         that it found a quoting character other than \'" that appears in
-         rl_completer_quote_characters
-
-                                   5/9
-                                   ---
-jobs.c
-       - save and restore old value of jobs_list_frozen when calling trap
-         handlers from set_job_status_and_cleanup to avoid seg faults when
-         running recursive trap handlers
-
-                                  5/10
-                                  ----
-builtins/common.h
-       - new #defines to use for value of changed_dollar_vars (provides
-         information about the caller who wants to blow away the old dollar
-         variables)
-
-builtins/common.c
-       - changed set_dollar_vars_changed to set changed_dollar_vars to one
-         of the ARGS_* values depending on the caller and environment
-
-builtins/source.def
-       - source restores the positional parameters unless the `set' builtin
-         was called to specify a new set while not executing a shell function
-
-                                  5/13
-                                  ----
-POSIX
-       - new file, was in CWRU/POSIX.NOTES
-
-doc/{Makefile.in,Makefile}
-       - changed `posix' rule to modify ../POSIX
-
-doc/mkposix
-       - write to `POSIX' by default
-
-lib/sh/strtrans.c
-       - when ansicstr is parsing a format string for `echo -e' (or the
-         equivalent xpg_echo option is enabled), obey the POSIX-2001/SUSv3
-         standard and accept 0-3 octal digits after a leading `0'
-
-doc/{bash.1,bashref.texi}
-       - updated `echo' description to note that up to three octal digits
-         are now accepted following `\0'
-
-                                  5/16
-                                  ----
-doc/Makefile.in
-       - remove the generated documentation on `make distclean' if the
-         build directory and source directory are not the same
-
-Makefile.in
-       - descend into `support' subdirectory on a `make clean' and
-         `make distclean'
-       - remove parser-built, y.tab[ch] on a `make distclean' if the build
-         directory and source directory are not the same
-
-support/Makefile.in
-       - support various `clean' targets and remove man2html.o and man2html
-
-{configure,Makefile}.in
-       - move values for DEBUG and MALLOC_DEBUG into configure.in; on by
-         default for development versions; off by default for releases
-         (off for profiling, too)
-
-                                  5/21
-                                  ----
-parse.y
-       - modified the grammar to allow a simple_list followed by yacc_EOF
-         to terminate a command.  This fixes problems with things like
-         a backslash-newline at the end of an `eval'd string
-       - change handle_eof_input_unit() to reset the token state before
-         calling prompt_again(), in case the prompt to be evaluated contains
-         a command substitution
-
-                                  5/23
-                                  ----
-lib/readline/vi_mode.c
-       - fix `r' command (rl_vi_change_char) when HANDLE_MULTIBYTE is defined
-         but MB_CUR_MAX == 1
-
-                                  5/24
-                                  ----
-lib/malloc/watch.c
-       - don't try to print `file' argument to _watch_warn if it's null
-
-lib/malloc/malloc.c
-       - changed guard checking code in internal_{malloc,free,realloc} to
-         access memory as (char *) and copy into a union instead of
-         casting and dereferencing a pointer to u_bits32_t, since that
-         results in unaligned accesses which will cause Sparcs to upchuck
-
-                                  5/30
-                                  ----
-[bash-2.05b-beta1 released]
-
-lib/readline/text.c
-       - fixed a problem with rl_transpose_chars on systems supporting
-         multibyte characters with a locale that doesn't have any multibyte
-         chars
-
-                                   6/4
-                                   ---
-expr.c
-       - fix a/=0 and a%=0 to throw evaluation errors rather than core dumps
-
-lib/readline/display.c
-       - fix core dump when line wrapping a multibyte character (line
-         accidentally dropped from the original patch)
-
-lib/readline/mbutil.c
-       - fix reversed return value from _rl_is_mbchar_matched; fixes problem
-         with backward-char-search
-
-                                  6/10
-                                  ----
-lib/sh/getenv.c
-       - fix getenv to not free value returned by find_tempenv_variable
-       - add setenv, putenv, unsetenv for completeness
-
-                                  6/12
-                                  ----
-shell.c
-       - change init_noninteractive to init expand_aliases to the value of
-         posixly_correct
-       - don't initialize expand_aliases to posixly_correct anywhere else.
-         This allows the -O expand_aliases invocation option to work correctly
-
-general.c
-       - fix move_to_high_fd to not try the dup2 unless the fd loop results
-         in an fd > 3; just return the passed file descriptor otherwise
-       - use HIGH_FD_MAX, defined in general.h, instead of hard-coded 256
-         as highest file descriptor to try
-
-subst.c
-       - in process_substitute, call move_to_high_fd with `maxfd' parameter
-         of -1 instead of 64, so move_to_high_fd will use its maximum
-
-                                  6/21
-                                  ----
-lib/malloc/malloc.c
-       - don't bother calling MALLOC_MEMSET if the requested size is 0
-
-builtins/setattr.def
-       - note in short doc that export and readonly can take assignment
-         statements as arguments
-
-error.c
-       - new function, error_prolog(), to capture common error message
-         prefix code (except for parser errors)
-
-                                  6/25
-                                  ----
-aclocal.m4
-       - add tests for standard-conforming declarations for putenv and
-         unsetenv in system header files
-
-{configure,config.h}.in
-       - call BASH_FUNC_STD_PUTENV and BASH_FUNC_STD_UNSETENV, define
-         HAVE_STD_GETENV and HAVE_STD_UNSETENV, respectively, if they
-         succeed
-
-lib/sh/getenv.c
-       - change putenv and unsetenv to take differing prototypes in
-         stdlib.h into account
-
-                                  6/27
-                                  ----
-[bash-2.05b-beta2 released]
-
-                                  6/28
-                                  ----
-builtins/common.c
-       - fix get_job_spec so that %N works when N is the size of the jobs
-         list (%8 means job 8, but the 7th member of the jobs array, so
-         it's OK if N == job_slots because the function returns N-1)
-
-                                   7/1
-                                   ---
-shell.c
-       - turn off line editing if $EMACS is set to `t'
-
-                                  7/10
-                                  ----
-builtins/set.def
-       - remove mention of `-i' from long help doc, since it has no effect
-
-                                  7/17
-                                  ----
-[bash-2.05b released]
-
-                                  7/18
-                                  ----
-
-lib/malloc/malloc.c
-       - make sure that the `free_return' label has a non-empty statement
-         to branch to
-
-                                  7/19
-                                  ----
-locale.c
-       -  only call setlocale() from set_lang() if HAVE_SETLOCALE is defined;
-          otherwise just return 0
-
-lib/readline/mbutil.c
-       - only try to memset `ps' in _rl_get_char_len if it's non-NULL.  Ditto
-         for _rl_adjust_point
-
-                                  7/23
-                                  ----
-execute_cmd.c
-       - fix for executing_line_number() when compiling without conditional
-         commands, dparen arithmetic or the arithmetic for command
-
-                                  
-                                  7/24
-                                  ----
-support/Makefile.in
-       - fix maintainer-clean, distclean, mostlyclean targets
-
-builtins/common.c
-       - fix bug in sh_nojobs where it doesn't pass the right number of args
-         to builtin_error
-
-bashline.c
-       - when using command completion and trying to avoid appending a slash
-         if there's a directory with the same name in the current directory,
-         use absolute_pathname() instead of just checking whether the first
-         char of the match is a slash to catch things like ./ and ../
-
-examples/complete/bashcc-1.0.1.tar.gz
-       - a package of completions for Clear Case, from Richard S. Smith
-         (http://www.rssnet.org/bashcc.html)
-
-input.c
-       - fix check_bash_input to call sync_buffered_stream if the passed fd
-         is 0 and the shell is currently reading input from fd 0 -- all it
-         should cost is maybe an additional read system call, and it fixes
-         the bug where an input redirection to a builtin inside a script
-         which is being read from stdin causes the already-read-and-buffered
-         part of the script to be thrown away, e.g.:
-
-               bash < x1
-
-         where x1 is
-
-               hostname
-               read Input < t.in
-               echo $Input
-               echo xxx
-
-execute_cmd.c
-       - in initialize_subshell(), call unset_bash_input (0) to not mess with
-         fd 0 if that's where bash thinks it's reading input from.  Fixes
-         bug reported by jg@cs.tu-berlin.de on 17 July 2002.  Should be a way
-         to check whether or not the current fd 0 at the time of the call has
-         not been redirected, like in the bug report.  Also might eventually
-         want to throw in a sync_buffered_stream if bash is reading input
-         from fd 0 in a non-interactive shell into a buffered stream, so the
-         stream is sync'd -- might be necessary for some uses
-
-                                  7/25
-                                  ----
-lib/readline/signals.c
-       - make sure rl_catch_sigwinch is declared even if SIGWINCH is not
-         defined, so the readline state saving and restoring functions in
-         readline.c are always the same size even if SIGWINCH is not defined,
-         and undefined references don't occur when SIGWINCH is not defined
-
-                                  7/30
-                                  ----
-bashline.c
-       - augment patch from 7/24 to not disable rl_filename_completion_desired
-         if the first char of the match is `~'
-
-lib/readline/bind.c
-       - when creating `shadow' keymaps `bound' to ANYOTHERKEY, don't bind
-         a key whose type is ISFUNC but whose function is the `fake'
-         rl_do_lowercase_version (fixes debian bash bug #154123)
-
-lib/readline/readline.c
-       - don't call _rl_vi_set_last from _rl_dispatch_subseq if
-         key == ANYOTHERKEY (when truncated to `sizeof(char)', it will be 0,
-         which strchr will find in `vi_textmod')
-
-                                  7/31
-                                  ----
-lib/readline/input.c
-       - fix rl_gather_tyi to only slurp up one line of available input, even
-         if more than one line is available (fixes debian bash bug #144585)
-
-                                   8/3
-                                   ---
-bashline.c
-       - better fix for command completion problem -- test for directory
-         explicitly with test_for_directory before turning off
-         rl_filename_completion_desired, since that's the case we're trying
-         to protect against
-
-                                   8/5
-                                   ---
-include/shmbutil.h
-       - fix ADVANCE_CHAR macro to advance the string pointer if mbrlen
-         returns 0, indicating that the null wide character (wide string
-         terminator) was found (debian bash bug #155436)
-
-lib/readline/mbutil.c
-       - fix _rl_adjust_point to increment the string pointer if mbrlen
-         returns 0
-
-support/shobj-conf
-       - fix for the `-install_name' value in SHLIB_XLDFLAGS assignment for
-         Darwin from the fink folks
-
-                                   8/6
-                                   ---
-builtins/exit.def
-       - broke code that runs ~/.bash_logout out into a separate function:
-         bash_logout()
-
-builtins/common.h
-       - extern declaration for bash_logout()
-
-eval.c
-       - call bash_logout() from alrm_catcher(), so timed-out login shells
-         run ~/.bash_logout before processing the exit trap
-
-lib/sh/strtrans.c
-       - implemented $'\x{hexdigits}' expansion from ksh93
-
-configure.in
-       - define RECYCLES_PIDS in LOCAL_CFLAGS for cygwin; don't bother to
-         link with -luser32
-
-examples/loadables/strftime.c
-       - new loadable builtin, interface to strftime(3)
-
-                                   8/7
-                                   ---
-parse.y
-       - parse_arith_cmd now takes a second argument, a flag saying whether
-         or not to add double quotes to a parsed arithmetic command; changed
-         callers
-       - changed parse_dparen so it tells parse_arith_cmd to not add the
-         double quotes and therefore doesn't need to remove them
-       - change parse_dparen to add W_NOGLOB|W_NOSPLIT|W_QUOTED flags to word
-         created when parsing (( ... )) arithmetic command, since the double
-         quotes are no longer added
-
-make_cmd.c
-       - in make_arith_for_expr, set the flags on the created word to
-         W_NOGLOB|W_NOSPLIT|W_QUOTED
-
-execute_cmd.c
-       - change execute_arith_command to expand the expression with
-         expand_words_no_vars, like the arithmetic for command code does
-       - fix execute_arith_command to handle the case where the expanded
-         expression results in a NULL word without crashing
-
-tests/{arith-for,cprint}.tests
-       - change expected output to account for no longer adding quotes to
-         ((...)) commands
-
-                                   8/8
-                                   ---
-print_cmd.c
-       - take out the space after printing the `((' and before printing the
-         `))' in print_arith_command, print_arith_for_command, and
-         xtrace_print_arith_cmd
-
-tests/{arith-for,cprint}.tests
-       - change expected output to account for no longer adding leading and
-         trailing spaces when printing ((...)) and arithmetic for commands
-
-                                  8/17
-                                  ----
-subst.c
-       - fix issep() define to handle case where separators[0] == '\0', in
-         which case it always returns false
-
-lib/readline/histexpand.c
-       - fix off-by-one error in history_expand_internal when using the `g'
-         modifier that causes it to skip every other match when matching a
-         single character (reported by gjyun90@resl.auto.inha.ac.kr)
-
-doc/{bash.1,bashref.texi}
-       - make sure that the name=word form of argument to declare/typeset,
-         export, and readonly is documented in the description
-
-                                  8/30
-                                  ----
-lib/readline/histexpand.c
-       - make history_expand_internal understand double quotes, because
-         single quotes are not special inside double quotes, according to
-         our shell-like quoting conventions.  We don't want unmatched
-         single quotes inside double-quoted strings inhibiting history
-         expansion
-       - make `a' modifier equivalent to `g' modifier for compatibility with
-         the BSD csh
-       - add a `G' modifier that performs a given substitution once per word
-         (tokenized as the shell would do it) like the BSD csh `g' modifier
-
-                                  8/31
-                                  ----
-braces.c
-       - when compiling for the shell, treat ${...} like \{...} instead of
-         trying to peek backward when we see a `{'.  This makes it easier
-         to handle things like \${, which should be brace expanded because
-         the $ is quoted
-
-                                   9/7
-                                   ---
-aclocal.m4
-       - redirect stdin from /dev/null in BASH_CHECK_DEV_FD before testing
-         the readability of /dev/fd/0, so we're dealing with a known quantity
-
-                                  9/11
-                                  ----
-[prayers for the victims of 9/11/01]
-
-shell.c
-       - fix maybe_make_restricted to handle a restricted login shell with a
-         base pathname of `-rbash' and skip over any leading `-'
-
-                                  9/13
-                                  ----
-builtins/evalstring.c
-       - in parse_and_execute, make sure we don't try to run unwind-protects
-         back to `pe_dispose' after a longjmp back to top_level if the
-         pe_dispose frame hasn't been initialized
-
-lib/readline/display.c
-       - fix problem with prompt overwriting previous output when the output
-         doesn't contain a newline in a multi-byte locale.  This also should
-         fix the problem of bash slowing down drastically on long lines when
-         using a multi-byte locale, because it no longer tries to rewrite the
-         entire line each time.  Patch from Jiro SEKIBA <jir@yamato.ibm.com>
-
-parse.y
-       - move the typedef for alias_t that is compiled in if ALIAS is not
-         defined up before the prototype for push_string, since that takes
-         an alias_t * parameter
-
-lib/readline/terminal.c
-       - bind the termcap description's left and right arrow keys to
-         rl_backward_char and rl_forward_char, respectively,  instead of
-         rl_forward and rl_backward (which are just there for backwards
-         compatibility)
-
-aclocal.m4
-       - when testing readability of /dev/stdin, redirect stdin from /dev/null
-         to make sure it's a readable file
-
-                                  9/17
-                                  ----
-config-bot.h
-       - don't test __STDC__ when deciding whether or not to use stdarg.h;
-         just use it if it's present
-
-tests/read2.sub
-       - redirect from /dev/tty when using `read -t' 
-
-                                  9/20
-                                  ----
-builtins/history.def
-       - when reading `new' entries from the history file with `history -n',
-         fix increment of history_lines_this_session by taking any change
-         in history_base into account
-
-lib/sh/pathphys.c
-       - changes to sh_physpath to deal with pathnames that end up being
-         longer than PATH_MAX without dumping core
-
-lib/readline/doc/{history.3,hsuser.texinfo},doc/ bash.1
-       - documented new `a' and `G' history modifiers
-
-                                  9/25
-                                  ----
-lib/readline/misc.c
-       - when traversing the history list with arrow keys in vi insertion
-         mode, put the cursor at the end of the line (like in emacs mode)
-
-mksyntax.c
-       - don't try to use \a and \v unless __STDC__ is defined; use the
-         ascii integer equivalents otherwise
-       - include "config.h" in the generated syntax.c file for a possible
-         definition of `const'
-
-doc/{bash.1,bashref.texi}
-       - document the meaning of a null directory in $PATH
-
-                                  9/26
-                                  ----
-parse.y
-       - fix set_line_mbstate to handle case where mbrlen() returns 0,
-         indicating the null wide character
-       - fix set_line_mbstate so we don't directly compare a char variable
-         to EOF, since char can (and is) unsigned on some machines
-
-bashline.c
-       - change bash_execute_unix_command to save a little bit more state:
-         last_shell_builtin, this_shell_builtin, last_command_exit_value
-
-                                  9/27
-                                  ----
-execute_cmd.c
-       - tentative change to execute_simple_command to avoid freeing freed
-         memory in the case where bash forks early but still ends up calling
-         execute_disk_command, without passing newly-allocated memory to
-         make_child.  This may fix the core dumps with the linux-from-scratch
-         folks
-
-                                  9/28
-                                  ----
-Makefile.in,{builtins,lib/sh}/Makefile.in      
-       - fix up dependencies, mostly on ${BUILD_DIR}/version.h, so that
-         parallel makes work with GNU and BSD makes
-
-shell.h
-       - new struct to save partial parsing state when doing things like
-         bash_execute_unix_command and other operations that execute
-         commands while a line is being entered and parsed
-
-parse.y
-       - new functions, save_parser_state() and restore_parser_state(), to
-         save and restore partial parsing state 
-
-bashline.c
-       - change bash_execute_unix_command to call {save,restore}_parser_state
-
-builtins/jobs.def
-       - change execute_list_with_replacements to eliminate a run_unwind_frame
-         in favor of calling the cleanup explicitly and discarding the frame
-
-execute_cmd.c
-       - change execute_for_command to avoid a run_unwind_frame in the case
-         where the loop variable is readonly or otherwise not assignable
-       - change execute_select_command and execute_simple_command to use
-         discard_unwind_frame by running the cleanup code explicitly, instead
-         of using run_unwind_frame
-       - make sure execute_select_command decreases loop_level even on error
-
-                                  9/30
-                                  ----
-doc/{bash.1,bashref.texi}
-       - fixed description of `unset' now that unsetting a previously-unset
-         variable is no longer an error
-
-                                  10/3
-                                  ----
-{configure,config.h}.in
-       - augment check for strtold with additional check to detect the
-         horribly broken hp/ux 11.x implementation that returns `long_double';
-         defines STRTOLD_BROKEN if so
-
-builtins/printf.def
-       - define floatmax_t as `double' if STRTOLD_BROKEN is defined
-
-                                  10/5
-                                  ----
-lib/readline/keymaps.c
-       - don't automatically bind uppercase keys to rl_do_lowercase_version
-         in rl_make_bare_keymap
-
-lib/readline/readline.c
-       - explicitly check for ANYOTHERKEY binding to rl_do_lowercase_version
-         and dispatch to lowercase of key when a prefix is not matched
-
-                                  10/12
-                                  -----
-bashline.c
-       - set COMP_WORDBREAKS in enable_hostname_completion to the value
-         of rl_completer_word_break_characters
-
-variables.c
-       - new special variable COMP_WORDBREAKS, controls the value of
-         rl_completer_word_break_characters
-
-variables.h
-       - new extern declaration for sv_comp_wordbreaks()
-
-subst.c
-       - change split_at_delims to behave more like shell word splitting if
-         the passed value for the delimiters is NULL, indicating that the
-         function is to use $IFS to split
-
-{execute_cmd,jobs,test,findcmd,input,make_cmd,redir,shell}.c
-builtins/mkbuiltins.c,builtins/{fc,history,source,umask}.def
-lib/sh/netconn.c
-lib/termcap/termcap.c
-lib/readline/histfile.c
-       - make sure all inclusions of <sys/file.h> are protected by
-         HAVE_SYS_FILE_H
-
-bashline.c
-       - don't turn off rl_filename_completion_desired in
-         attempt_shell_completion if the partial pathname contains a slash.
-         This still doesn't solve the problem of partial pathname completion
-         starting with a directory in the current directory without a
-         leading `./'.  There's no way to tell the difference between that
-         and a file found in $PATH (which may contain `.') at the point that
-         attempt_shell_completion acts
-
-                                  10/18
-                                  -----
-locale.c
-       - don't set lc_all to the default locale when LC_ALL is being unset
-       - new function, reset_locale_vars(), called to recompute the correct
-         locale variable values when LC_ALL is unset
-       - changed set_lang to not set LC_ALL, which it never should have been
-         doing in the first place, and to maintain a local variable `lang'
-         corresponding to $LANG
-       - change get_locale_var to use the precedence posix.2 specifies:
-         LC_ALL overrides individual variables; LANG, if set, is the default
-       - change set_locale_var to call get_locale_var to get the appropriate
-         value for the variable being set or unset
-       - call get_locale_var instead of using passed value in set_locale_var
-         to get the defaulting and precedence right
-
-lib/readline/nls.c
-       - new function, _rl_get_locale_var(), which does the same thing as
-         locale.c:get_locale_var(), with the right precedence and defaulting,
-         using sh_get_env_value to get the right bash variable values
-       - if HAVE_SETLOCALE is defined, _rl_init_eightbit first calls
-         _rl_get_locale_var to get the right value for LC_CTYPE, and uses
-         that in the call to setlocale.  If _rl_get_locale_var returns NULL,
-         call setlocale() to get the current international environment, and,
-         finally, if that returns null, call setlocale with a second argument
-         of "" to force the implementation's `native' environment
-
-pcomplete.c
-       - change gen_wordlist_completions to dequote the text before comparing
-         it against the expanded word list 
-       - changed gen_matches_from_itemlist to do the same thing
-
-bashline.c
-       - new global function, bash_dequote_word, calls bash_dequote_filename
-         on the text passed.  Used by the programmable completion code
-
-lib/readline/histfile.c
-       - make sure that whenever read_history_range returns a non-zero value
-         that it sets errno to some useful value
-
-                                  10/19
-                                  -----
-variables.c
-       - COMP_WORDBREAKS is now a dynamic variable, mirroring value of
-         rl_completer_word_break_characters.  Makes sure that the variable
-         always points to dynamic memory if it's not null or the readline
-         default
-
-bashline.c
-       - change enable_hostname_completion to manage a dynamic value of
-         rl_completer_word_break_characters, since assignments to
-         COMP_WORDBREAKS can change its value unpredictably
-
-lib/readline/{complete.c,readline.h}
-       - rl_completer_word_break_characters no longer has `const' attribute
-
-bashline.c
-       - clean up necessary places due to rl_completer_word_break_characters
-         no longer being `const'
-
-doc/{bash.1,bashref.texi}
-       - document new COMP_WORDBREAKS variable
-
-                                  10/21
-                                  -----
-print_cmd.c
-       - fix indirection_level_string to handle the case where the decoded
-         $PS4 is null without seg faulting
-
-                                  10/22
-                                  -----
-builtins/shift.def
-       - make sure that there is actually an argument when reporting a shift
-         count that exceeds the number of positional paramters and
-         shift_verbose is enabled
-
-lib/readline/rltty.c
-       - change SET_SPECIAL to call a new function, set_special_char, since
-         it contains a block.  It's called infrequently, so the performance
-         impact of making it a function should be negligible, and it helps
-         debugging
-
-                                  10/29
-                                  -----
-bashline.c
-       - make sure the editor in VI_EDIT_COMMAND and EMACS_EDIT_COMMAND is
-         quoted; it might contain spaces (e.g., `emacs -nw')
-
-aclocal.m4
-       - cache ac_cv_rl_version in RL_LIB_READLINE_VERSION macro
-
-configure.in
-       - change logic that sets RL_INCLUDEDIR so that it doesn't try to set
-         a bogus include path if the argument to --with-installed-readline
-         is `yes' -- helps with cross-compiling
-
-lib/readline/histexpand.c
-       - fix history_tokenize_word so that it handles <( and >( better
-
-                                  10/30
-                                  -----
-redir.c
-       - fix write_here_string so it handles the case where `herestr' expands
-         to NULL without seg faulting
-
-                                  10/31
-                                  -----
-mailcheck.c
-       - reverse logic flip from bash-2.05 that handled systems that don't
-         change the atime when the mailbox is accessed; make sure the file
-         is bigger before we report new mail.  This is the case in the vast
-         majority of cases.  Reported by jim@jtan.com
-
-                                  11/5
-                                  ----
-parse.y
-       - change action for `for x; { list; }' and corresponding `select'
-         production to use \"$@\" instead of just $@, as it is with all the
-         other actions
-
-                                  11/9
-                                  ----
-parse.y
-       - new flag for parse_matched_pair: P_DQUOTE, indicating that the
-         pair of characters being matched is between double quotes
-       - parse_matched_pair now passes P_DQUOTE down to recursive calls:
-         if the open char to be matched is a `"' or the passed-in flags
-         include P_DQUOTE, set the local `rflags' variable to P_DQUOTE and
-         pass `rflags' down to recursive calls
-       - if `rflags' includes P_DQUOTE, don't try to ansiexpand $'...' or
-         locale expand $"..."; consistent with other quoting constructs
-
-                                  11/11
-                                  -----
-doc/{bash.1,bashref.texi}
-       - explicitly note that variables referenced in arithmetic expressions
-         without using `$' evaluate to 0 if they are null or unset
-       - note that a null variable value evaluates to 0 when used in an
-         arithmetic context, like when a variable with the `-i' attribute is
-         assigned a null value
-       - document the ${!prefix@} expansion as equivalent to ${!prefix*}
-
-                                  11/12
-                                  -----
-doc/{bash.1,bashref.texi}
-       - note that the value of an arithmetic expression is as in C
-       - change the wording to note that `arithmetic evaluation' (not
-         arithmetic expansion, which has a different meaning) is performed
-         on the value assigned to a variable whose integer attribute is set
-
-                                  11/13
-                                  -----
-execute_cmd.c
-       - fix execute_disk_command so it calls exit() after printing the error
-         message in a restricted shell context if the shell has already forked
-         (nofork != 0 && there are no pipes)
-
-                                  11/19
-                                  -----
-builtins/type.def
-       - don't report on aliases unless expand_aliases is set and the parser
-         is performing alias expansion; changed tests/type.tests and
-         tests/type.right accordingly
-
-                                  11/25
-                                  -----
-general.c
-       - fix for full pathnames including drive letters on cygwin from
-         Corinna (convert to posix-style paths, which the rest of the
-         code handles much better)
-
-lib/readline/text.c
-       - fixes to overwrite mode from jimmy@is-vn.bg:
-               o in _rl_overwrite_char, do the overwrite mode self-insert
-                 as one group, even when overwriting more than 1 char
-               o in _rl_overwrite_char, do the insert before the delete so
-                 that an undo positions the cursor on the character restored,
-                 not to the right of it
-               o in _rl_overwrite_rubout, don't do rl_insert_char(' ') unless
-                 rl_point < rl_end.  Since overwrite-mode self-insert acts as
-                 in insert-mode when at eol, make rubout behave like
-                 insert-mode rubout
-
-                                  11/30
-                                  -----
-lib/readline/misc.c
-       - call rl_replace_line with `1' as second parameter if we're going to
-         immediately overwrite the undo list
-
-lib/readline/search.c
-       - in make_history_line_current, use _rl_replace_text to make the line
-         replacement an undoable operation.  Affects all non-incremental
-         search functions.
-
-parse.y
-       - make behavior introduced on 11/9 dependent on extended_quote
-         variable, controllable by extquote shopt option.  Default setting is
-         on for backwards compatibility
-
-builtins/shopt.def
-       - new `extquote' option to control extended_quote variable
-
-                                  12/3
-                                  ----
-jobs.c
-       - change message printed when attempting to put a background job in
-         the background with `bg' to include the job id and make the
-         statement declarative
-
-                                  12/10
-                                  -----
-bashhist.h
-       - define explicit flag values for history_control
-
-variables.c
-       - change sv_history_control to use new flag values
-       - change sv_history_control to parse $HISTCONTROL as a colon-separated
-         list of values for the history_control variable
-
-bashhist.c
-       - change check_history_control to use new flag values and restructure
-         to remove case statement
-       - new function hc_erasedups(line); removes all entries matching LINE
-         from the history list
-       - call hc_erasedups() from check_add_history after we've determined
-         that we're saving the line
-
-doc/{bash.1,bashref.texi}
-       - documented new options available for $HISTCONTROL and that it can
-         be a colon-separated list of history control options
-
-                                  12/11
-                                  -----
-subst.c
-       - fix pat_subst() to not increment `e' (pointer to the end of the
-         matched portion of the string) until after we're sure we're going
-         around the loop again; fixes problem with empty replacements for
-         a pattern that doesn't match (bug reported by Don Coleman
-         <don@coleman.org>)
-
-                                  12/17
-                                  -----
-lib/readline/display.c
-       - fixes to multibyte redisplay from jir@yamato.ibm.com (Jiro SEKIBA):
-               o speed up calculation of first difference between old and new
-                 lines in the common case
-               o don't try to see if we're in the middle of a multbyte char
-                 in update_line (we'll see how this one works out)
-
-                                  12/18
-                                  -----
-doc/bashref.texi
-       - make it clear that the `command-list' function definition may be
-         terminated by an ampersand before the closing brace
-
-                                  12/28
-                                  -----
-redir.c
-       - set `expanding_redir' flag when expanding words in a redirection
-
-subst.c
-       - new function, exp_jump_to_top_level(), to do any word expansion
-         cleanup before a call to jump_to_top_level from within that file;
-         sets expanding_redir back to 0 before jump_to_top_level
-
-variables.c
-       - in find_variable(), don't call find_variable_internal with a second
-         parameter of 1 if expanding_redir is non-zero
-       - in find_variable_internal(), don't search the temporary env if
-         subshell_environment includes SUBSHELL_FORK (indicating a simple
-         command) and expanding_redir is non-zero
-
-parse.y
-       - increment line_number when we read a \<newline> pair
-
-array.c
-       - added array_unshift_element and array_shift_element (which just call
-         array_shift and array_rshift, respectively), for bash debugger
-         support
-
-                                1/4/2003
-                                --------
-doc/{bash.1,bashref.texi}
-       - note in the section describing the execution environment passed to
-         children that subshells inherit shell functions marked for export
-       - note in the section describing shell functions the possibility
-         that exported functions may result in two entries in the environment
-         with the same name
-
-parse.y
-       - when pushing an alias expansion onto the pushed_string list, append
-         a space to the expanded definition to make the parser's lookahead
-         work without using the `mustpop' hack in shell_getc
-
-                                   1/8
-                                   ---
-shell.c
-       - change calls to exit() with EX_USAGE as a parameter to use
-         EX_BADUSAGE instead, since EX_USAGE is defined as 258 and is
-         technically out of range
-
-                                  1/14
-                                  ----
-aclocal.m4
-       - check for the termcap functions in libc first:  if we don't have
-         to link in another library, let's not do it
-       - change the test for mbstate_t to use AC_TRY_COMPILE instead of
-         AC_TRY_RUN
-
-doc/{bash.1,bashref.texi}
-       - document that bash turns line editing off if environment variable
-         EMACS is set to `t' when it starts up
-
-doc/bash.1
-       - minor change to give the ftp url for the latest version of bash in
-         the bug reports section
-
-lib/readline/histexpand.c
-       - in get_history_event, cast a couple of `const char *' variables to
-         `char *' in function call parameter lists to avoid compiler warnings
-
-                                  1/21
-                                  ----
-builtins/cd.def
-       - change `cd -' so it prints the current working directory after a
-          successful chdir even when the shell is not interactive
-
-                                  1/31
-                                  ----
-lib/readline/doc/rltech.texinfo
-       - clarified exactly what is meant by the term `application-specific
-         completion function', made its use consistent, and documented
-         what variables are changed before such a function is called
-
-lib/readline/input.c
-       - new function, _rl_pushed_input_available(), returns non-zero if
-         there are characters in the input queue managed by rl_get_char
-         and _rl_unget_char
-
-lib/readline/rlprivate.h
-       - new extern declaration for _rl_pushed_input_available
-
-lib/readline/callback.c
-       - change rl_callback_read_char to check _rl_pushed_input_available
-         and loop if there's something there, so characters don't languish
-         until more keyboard input is read
-
-execute_cmd.c
-       - new variable, last_command_exit_signal, non-zero if
-         last_command_exit_value result from wait_for was result of a signal
-
-nojobs.c
-       - keep track of whether or not a given pid was killed by a signal with
-         a new flag in the pid_list array
-       - new function int find_termsig_by_pid(pid_t pid) to get the
-         terminating signal, if any, for a particular pid
-       - new function int get_termsig(WAIT status) returns the terminating
-         signal corresponding to status
-       - set last_command_exit_signal in wait_for and the various wait_for_xx
-         functions
-
-jobs.c
-       - new functions, process_exit_signal and job_exit_signal, return the
-         signal that killed a given process or job, if a signal caused its
-         death
-       - set last_command_exit_signal in wait_for by calling job_exit_signal
-         or process_exit_signal appropriately
-
-subst.c
-       - don't resend SIGINT to ourselves unless last_command_exit_signal is
-         SIGINT and last_command_exit_value == 128 + SIGINT.  This fixes the
-         $(exit 130) bug reported by Paul Jarc
-
-expr.c
-       - new function, expr_bind_variable, calls bind_int_variable and
-         then stupidly_hack_special_variables.  This fixes the
-         `let OPTIND=1' bug
-
-bashline.c
-       - change history_and_alias_expand_line and shell_expand_line to call
-         history_expand_line_internal so calls to pre_process_line are
-         localized
-       - change history_expand_line_internal and cleanup_expansion_error to
-         temporarily turn off hist_verify before calling pre_process_line
-         to avoid the effects described by teirllm@dms.auburn.edu
-
-parse.y
-       - don't unconditionally turn off PST_ALEXPNEXT in push_string.  This
-         fixes the multiple alias expansion bug reported by Paul Jarc.
-
-lib/readline/vi_mode.c
-       - change rl_vi_subst to push `l' instead of ` ' -- it should be
-         equivalent, but this has been reported to fix a problem in multibyte
-         locales
-
-lib/readline/readline.h
-       - new state flag value RL_STATE_TTYCSAVED, indicates that save_tty_chars
-         has been called.  Since it's only used and visible internally, it's
-         undocumented
-
-lib/readline/rltty.h
-       - changed all of the members of _rl_tty_chars struct to `unsigned char'
-
-lib/readline/rltty.c
-       - set the RL_STATE_TTYCSAVED after save_tty_chars is called
-       - new function, rl_tty_unset_default_bindings(), resets bindings for
-         everything rl_tty_set_default_bindings() messes with back to
-         rl_insert, so rl_tty_set_default_bindings can be called again with
-         possible changes
-       - new function that does the bulk of the work for
-         rltty_set_default_bindings:  _rl_bind_tty_special_chars()
-       - change prepare_terminal_settings so that it can track changes to the
-         terminal special chars made by stty(1):  unset the bindings with
-         rl_tty_unset_default_bindings before calling save_tty_chars, and
-         _rl_tty_set_default_bindings after, with the new values from
-         get_tty_settings().  This implements a long-standing request, most
-         recently made by Tim Waugh of Red Hat.
-
-lib/readline/readline.h
-       - extern declaration for rl_tty_unset_default_bindings()
-
-lib/readline/readline.c
-       - new function, reset_default_bindings, calls
-         rl_tty_unset_default_bindings() to reset the terminal special chars
-         back to rl_insert and then read the new ones
-
-lib/readline/doc/rltech.texinfo
-       - documented rl_tty_unset_default_bindings()
-
-                                   2/1
-                                   ---
-[prayers and condolences to the families of the space shuttle crew members]
-
-aclocal.m4
-       - add checks for mbrtowc and mbrlen in BASH_CHECK_MULTIBYTE
-       - new check, BASH_FUNC_CTYPE_NONASCII, checks whether or not the ctype
-         functions handle non-ascii characters correctly
-
-config.h.in
-       - add HAVE_MBRTOWC and HAVE_MBRLEN
-       - add NO_MULTIBYTE_SUPPORT for new configure argument
-       - add CTYPE_NON_ASCII
-
-config-bot.h, lib/readline/rlmbutil.h
-       - make sure that mbrtowc, mbrlen, and wcwidth are all present before
-         turning on HANDLE_MULTIBYTE
-       - turn off multibyte chars if NO_MULTIBYTE_SUPPORT is defined
-
-configure.in
-       - new argument --enable-multibyte (enabled by default), allows
-         multibyte support to be turned off even on systems that support it
-
-lib/readline/chardefs.h
-       - define NON_NEGATIVE as 1 if CTYPE_NON_ASCII is defined
-
-                                   2/3
-                                   ---
-config.h.in
-       - add HAVE_WCTOMB
-
-aclocal.m4
-       - check for wctomb in BASH_CHECK_MULTIBYTE
-
-                                   2/4
-                                   ---
-lib/readline/vi_mode.c
-       - in _rl_vi_change_mbchar_case, make sure the result from wctomb()
-         is NULL-terminated before trying to insert it with rl_insert_text()
-
-                                   2/5
-                                   ---
-lib/readline/display.c
-       - fix to update_line to avoid problems on systems with multibyte
-         characters when moving between history lines when the new line
-         has more glyphs but fewer bytes (twaugh@redhat.com)
-
-lib/readline/vi_mode.c
-       - use wcrtomb() instead of wctomb() in _rl_vi_change_mbchar_case
-
-pcomplete.c
-       - fix init_itemlist_from_varlist to handle the case where the
-         `varlist' is NULL
-
-doc/{bash.1,bashref.texi}
-       - clarified when a simple command may fail without the shell exiting
-         when -e is set
-
-                                  2/13
-                                  ----
-parse.y
-       - when bash is started with --nolineediting, ignore \[ and \] when
-         decoding the prompt string
-
-subst.c
-       - fix remove_quoted_nulls so that a string with a CTLESC appearing
-         after a CTLNUL (which was removed) does not leave characters in
-         the string inappropriately
-
-                                  2/14
-                                  ----
-builtins/common.h
-       - new flag value for parse_and_execute(): SEVAL_RESETLINE, which
-         allows the caller to specify whether or not the internal idea
-         of the line number should be reset to 1
-
-builtins/evalstring.c
-       - parse_and_execute() now tells push_string to reset the line
-         number only if the SEVAL_RESETLINE flag is set by the caller
-
-                                  2/15
-                                  ----
-builtins/evalfile.c
-       - pass SEVAL_RESETLINE from _evalfile() to parse_and_execute()
-
-subst.c
-       - if the shell is currently interactive, pass SEVAL_RESETLINE to
-         parse_and_execute() when doing command substitution
-
-jobs.c
-       - add SEVAL_RESETLINE to parse_and_execute while running SIGCHLD trap
-
-command.h
-       - add `line' members to case_com, for_com, select_com
-       - rearranged order of members in some of the command structs, so
-         `flags' and `line' are first
-       - added a `source_file' member to the function_def struct; keeps
-         track of where the function was defined
-
-doc/Makefile.in
-       - add some new suffix rules:  .dvi.ps
-
-doc/{bash.1,bashref.texi}
-       - added text to the description of the `trap' builtin tightening up
-         the language describing when the ERR trap will be run
-
-error.c
-       - if $BASH_SOURCE (internally-maintained) exists, use BASH_SOURCE[0]
-         in get_name_for_error if the shell is not interactive
-
-array.h
-       - new convenience defines: array_push and array_pop
-
-variables.c
-       - change get_funcname to return this_shell_function->name only if
-         arrays have not been compiled into the shell
-       - change init_funcname_var to initialize FUNCNAME as an array variable
-         if we have arrays
-       - new function: get_self(SHELL_VAR *self), a degenerate `dynamic_value'
-         function for dynamic variables
-       - new function: init_dynamic_array_var(), a generic dynamic array
-         variable initializer to handle the common case
-       - use init_dynamic_array_var() instead of explicit init_dirstack_var()
-       - use init_dynamic_array_var() instead of explicit init_groups_var()
-       - new dynamic array variables:  BASH_ARGC, BASH_ARGV, BASH_SOURCE,
-         BASH_LINENO, initialized with init_dynamic_array_var
-
-shell.c
-       - initialize BASH_LINENO, BASH_SOURCE, FUNCNAME in open_shell_script
-
-{execute_cmd,trap}.c
-       - take out trap_line_number, since parse_and_execute doesn't reset the
-         line number any more when running the trap commands
-
-make_cmd.c
-       - augment make_function_def to get source file name and call
-         bind_function_def to save the entire FUNCTION_DEF
-
-variables.c
-       - new hash table: shell_function_defs, keeps table of shell function
-         definitions including source file and line number info corresponding
-         to shell_functions table
-       - new functions: find_function_def and bind_function_def to manage
-         the shell_function_defs hash table
-       - new function: unbind_function_def to remove a function definition
-         from the shell_function_defs table (right now uncalled)
-
-variables.h
-       - extern declaration for bind_function_def, find_function_def
-       - new extern declaration for unbind_function_def
-
-execute_cmd.c
-       - in function prologue and epilogue, push and pop FUNCNAME,
-         BASH_SOURCE, and BASH_LINENO information
-
-dispose_cmd.c
-       - broke the code that disposes a FUNCTION_DEF out into two new
-         functions: dispose_function_def and dispose_function_def_contents
-
-dispose_cmd.h
-       - new extern declarations for dispose_function_def_contents and 
-         dispose_function_def
-
-copy_cmd.c
-       - move body of copy_function_def (other than allocating a new
-         FUNCTION_DEF) to copy_function_def_contents
-       - make sure to copy the new source_file member of a function_def in
-         copy_function_def_contents
-       - copy_function_def is no longer static, copy_function_def_contents
-         is not either
-
-command.h
-       - new extern declaration for copy_function_def_contents and
-         copy_function_def
-
-parse.y
-       - keep a stack of line numbers where case, select, and for commands
-         start, with a maximum nesting level of 128; increment when reading
-         word after `for', `select' or `case' in read_token_word; decrement
-         in grammar actions after parsing a complete for, arith_for, select,
-         or case command
-       - create for, case, arith_for, and select commands with an extra
-         line number (word_lineno[word_top]) argument
-
-make_cmd.c
-       - make_for_or_select, make_for_command, make_case_command, and
-         make_select_command all take an extra `line_number' argument
-
-make_cmd.h
-       - corresponding changes to extern declarations for those functions
-
-                                  2/16
-                                  ----
-{execute_cmd,shell,variables}.c
-       - follow each call to remember_args with a call to push_args or
-         pop_args to manage the BASH_ARGV and BASH_ARGC arrays.  Only set
-         when the shell is started to run shell script or runs a shell
-         function.  Doesn't handle `set' or `shift' yet, nor `source'.
-
-execute_cmd.c
-       - keep track of the level of subshells with a new variable, manipulated
-         in execute_in_subshell
-       - set currently_executing_command in execute_command_internal(),
-         even if we're running a trap
-       - better line number management when executing simple commands,
-         conditional commands, for commands in execute_command_internal()
-         and the various functions that implement the commands
-         (execute_cond_command, execute_for_command, execute_etc.)
-
-variables.c
-       - new dynamic variable BASH_SUBSHELL, with new get_subshell and
-         assign_subshell functions to manipulate it
-       - new functions push_args (WORD_LIST *list) and pop_args (void) to
-         manage the BASH_ARGC and BASH_ARGV dynamic array variables
-
-variables.h
-       - new extern declarations for push_args and pop_args
-
-builtins/evalfile.c
-       - in _evalfile, do appropriate things to the FUNCNAME, BASH_ARGV,
-         BASH_ARGC, BASH_SOURCE, and BASH_LINENO variables
-
-support/mksignames.c
-       - add another fake signal for `trap'; make NSIG+2 == `RETURN'
-
-trap.c
-       - _run_trap_internal now returns an int:  the exit value of the command
-         run as the result of the trap
-       - run_debug_trap now returns an int: the exit value of the command
-         run as the result of the trap
-       - RETURN is a new special trap
-       - new function: set_return_trap(char *command) interface for the rest
-         of the shell, like set_{debug,error}_trap
-       - new function: run_return_trap()
-       - command substitution and other child processes don't inherit the
-         return trap
-
-trap.h
-       - new extern declaration for set_return_trap() and run_return_trap
-       - new defines for RETURN_TRAP; increment BASH_NSIG
-       - change extern declaration for run_debug_trap() since it now returns
-         an int
-
-shell.c
-       - new invocation long option:  --debugger, turns on debugging and
-         sets internal `debugging_mode' variable
-
-execute_cmd.c
-       - new code to save return trap when executing a shell function, so
-         shell functions don't inherit it
-       - run debug trap before binding the variable and running the action
-         list in a `for' command
-       - run debug trap before binding the selection variable and running
-         the query in a `select' command
-       - run debug trap before running matcher in a `case' command
-
-builtins/set.def
-       - new `set -o functrace' (set -T), causes DEBUG trap to be inherited
-         by shell functions
-       - new `set -o errtrace' (set -E), causes ERR trap to be inherited
-         by shell functions
-
-flags.c
-       - new flags -E and -T, control error_trace_mode and
-         function_trace_mode respectively
-
-flags.h
-       - new extern declarations for error_trace_mode and function_trace_mode
-
-                                  2/17
-                                  ----
-doc/bashref.texi
-       - changed the `dircategory' as per Karl Berry's suggestion
-
-doc/texinfo.tex
-       - update to version of 2003/02/04 from texinfo.org
-
-support/texi2dvi
-       - update to version 1.14 from texinfo-4.5 distribution
-
-                                  2/20
-                                  ----
-support/config.{guess,sub}
-       - update to versions of 2002/11/30
-
-lib/readline/doc/manvers.texinfo
-       - renamed to version.texi to match other GNU software
-       - UPDATE-MONTH variable is now `UPDATED-MONTH'
-
-lib/readline/doc/{hist,rlman,rluserman}.texinfo
-       - include version.texi
-
-doc/version.texi
-       - new file, with standard stuff matching other GNU distributions
-
-{doc,lib/readline/doc}/Makefile.in
-       - include right stuff for `version.texi'
-
-lib/readline/doc/{rluserman,rlman,hist}.texinfo
-       - use @copying and @insertcopying and @ifnottex instead of @ifinfo
-       - add FDL as an appendix entitled `Copying This Manual'
-
-lib/readline/doc/{rltech,rluser,hstech,hsuser}.texi
-       - changed the suffix from `texinfo' to `texi'
-
-lib/readline/doc/{rlman,rluserman}.texinfo, doc/bashref.texi
-       - include rltech.texi,rluser.texi,hstech.texi, and hsuser.texi
-
-lib/readline/doc/Makefile.in,doc/Makefile.in
-       - made appropriate changes for {{rl,hs}tech,{rl,hs}user}.texi
-
-lib/readline/doc/{rlman,rluserman}.texinfo
-       - changed the suffix from `texinfo' to `texi'
-
-lib/readline/doc/hist.texinfo
-       - renamed to history.texi
-
-                                  2/25
-                                  ----
-pathnames.h.in
-       - moved pathnames.h here so value of DEBUGGER_START_FILE can be
-         substituted by configure
-
-aclocal.m4
-       - added AM_PATH_LISPDIR for debugger
-
-configure.in
-       - added some variables: `bashvers', `relstatus' to use info in more
-         than one place
-       - call AM_PATH_LISPDIR
-       - new option:  --enable-debugger, sets DEBUGGER cpp option
-       - new option with AC_ARG_VAR:  DEBUGGER_START_FILE
-       - make `pathnames.h' a file generated by configure
-
-Makefile.in
-       - add rule to create pathnames.h
-
-builtins/declare.def
-       - added extra line number and source file name to `declare -F' output
-         if `--debugger' is used at startup
-
-builtins/evalfile.c
-       - call run_return_trap from source_file before returning the result
-         from _evalfile()
-
-execute_cmd.c
-       - call run_return_trap in execute_function before restoring the old
-         context
-
-builtins/source.def
-       - arrange to save and restore DEBUG traps when sourcing files if
-         function_trace_mode (set -o functrace) is not set
-
-print_cmd.c
-       - broke print_for_command, print_select_command, print_case_command
-         into two functions each:  one to print the `header' and one for
-         the body
-       - print_cond_command is no longer static
-       - print_arith_command now takes a WORD_LIST *, since it doesn't
-         actually do anything with the ARITH_COM it's passed except print
-         the enclosed WORD_LIST
-       - print_arith_command is no longer static
-
-externs.h
-       - extern declarations for print_{for,select,case}_command_head,
-         print_cond_command, print_arith_command
-
-{.,builtins,lib/sh}/Makefile.in
-       - corrected dependencies on pathnames.h, since it's now created in
-         the build directory
-
-                                   3/5
-                                   ---
-lib/glob/glob.c
-       - handle alloca() failing (it's supposed to return NULL)
-       - use malloc() (with its attendent bookkeeping) instead of alloca()
-         in glob_filename()
-
-subst.c
-       - check whether shell_glob_filename returns NULL in
-         glob_expand_word_list
-       - change parameter_brace_expand_rhs to handle cases like
-         ${a[2]:=value} by properly creating the array element instead of a
-         variable named `a[2]' (reported by <opengeometry@yahoo.ca>)
-
-variables.c
-       - change bind_int_variable to use valid_array_reference instead
-         of looking for `[' 
-
-lib/readline/vi_mode.c
-       - check for `a' in _rl_vi_done_inserting so the text inserted by an
-         `a' command can be reinserted with a `.'
-
-lib/readline/readline.c
-       - when entering vi insertion mode in readline_internal_setup(), make
-         sure that _rl_vi_last_key_before_insert is set to `i' so that undo
-         groups and redo work better (reported by <opengeometry@yahoo.ca>)
-
-lib/glob/sm_loop.c
-       - handle ?(...) in a pattern immediately following a `*', instead of
-         ignoring the `(' and treating the `?' as a single-char match, as
-         long as FNM_EXTFLAG is set (reported by <anderson110@poptop.llnl.gov>)
-
-aclocal.m4
-       - new test for presence of struct timezone, BASH_STRUCT_TIMEZONE
-
-config.h.in
-       - add HAVE_STRUCT_TIMEZONE
-
-configure.in
-       - call BASH_STRUCT_TIMEZONE
-
-execute_cmd.c
-       - don't try to use `struct timezone' in calls to gettimeofday unless
-         HAVE_STRUCT_TIMEZONE is defined; use (void *)NULL otherwise
-
-                                  3/20
-                                  ----
-execute_cmd.c
-       - new variable, the_printed_command_except_trap, saves the command
-         being executed before a trap is executed, for the debugger
-
-trap.c
-       - if in debugging mode, let command substitutions and other child
-         processes inherit the DEBUG and ERR traps if the `functrace'
-         (which is really a bad name, given this semantic) or `errtrace'
-         options, respectively, have been set
-
-shell.c
-       - local_pending_command renamed to command_execution_string; no longer
-         static
-
-variables.c
-       - new dynamic variable, BASH_COMMAND, set to the command string
-         currently executing, or the one that caused a trap to execute
-         (mapped to the_printed_command_except_trap)
-       - new variable, BASH_EXECUTION_STRING, set to the argument to the
-         -c invocation option, if the shell was started that way
-
-                                  3/22
-                                  ----
-execute_cmd.c
-       - changed execute_for_command, eval_arith_for_expr,
-         execute_select_command, execute_arith_command, execute_cond_command,
-         execute_simple_command to implement new DEBUG trap semantics
-         for the debugger: if the DEBUG trap commands return a non-zero
-         status and debugging_mode is non-zero, we skip the command to be
-         executed
-
-trap.c
-       - change run_debug_trap for the debugger: if we're in the debugger
-         and the DEBUG trap returns 2 while we're in a function or sourced
-         script, we force a `return'
-
-shell.c
-       - new function, start_debugger(), that sources the debugger start file
-         and turns the debugger on
-
-builtins/shopt.def
-       - new settable option, `extdebug', turns on debugging_mode, as if
-         --debugger had been supplied at invocation (but does not source
-         debugger startup file)
-
-trap.c
-       - make sure that run_exit_trap arranges for `returns' to come back
-         there, too, so a `return' executed by an `exit' invoked within a
-         shell function behaves correctly
-
-support/shobj-conf
-       - change darwin/MacOS X stanza based on advice from mac os x developers
-
-lib/sh/mailstat.c
-       - set the atime member of the synthesized stat struct to 0 if `cur/'
-         is empty, rather than leaving it undefined
-
-                                  3/24
-                                  ----
-builtins/caller.def
-       - new builtin to provide a call stack for the debugger
-
-builtins/evalfile.c
-       - added a second `flags' argument to source_file()
-       - new flag value for flags argument to _evalfile():  FEVAL_NOPUSHARGS.
-         If included in flags arg, it means to not manipulate the BASH_ARGV
-         and BASH_ARGC arrays
-
-builtins/common.h
-       - change prototype for source_file()
-
-builtins/source.def
-       - add flag value to call to source_file():  set to 1 if we replaced
-         the positional parameters
-       - add call to push_args if additional arguments supplied to the
-         source builtin
-       - add call to pop_args in maybe_pop_dollar_vars
-
-execute_cmd.c
-       - run the debug trap in execute_function so the debugger can stop
-         before the first command in a function body is executed
-       - modify subshell_level before executing a builtin or function in a
-         subshell
-       - print `for', `select', `case' command heads when set -x is enabled
-
-print_cmd.c
-       - `xtrace_print_word_list' now takes an additional flags argument,
-         which, if non-zero, says to print indirection_level_string()
-       - new functions to print for, select, and case command heads when
-         set -x is enabled
-       - add spaces after `((' and before `))' in xtrace_print_arith_command
-
-externs.h
-       - changed extern declaration for xtrace_print_word_list
-       - new declarations for xtrace_print_{for,case,select}_command_head()
-
-subst.c
-       - modify subshell_level when executing a command substitution
-
-                                  3/25
-                                  ----
-execute_cmd.c
-       - use `line_number' in executing_line_number instead of looking into
-         the current command if it's a simple command; rearrange code to
-         make this simpler to compile in and out
-       - need to save and restore value of currently_executing_command around
-         calls to debug trap and return trap in execute_function
-
-make_cmd.c
-       - make sure make_arith_for_command() disposes the WORD_LIST * it is
-         passed, since nothing else does and it's not used directly
-
-                                  3/28
-                                  ----
-Makefile.in    
-       - fixed dependencies for `error.o' on shell.h and version.h -- makes
-         parallel makes (gmake -j 4) work correctly
-
-doc/{bash.1,bashref.texi}
-       - documented all new features added to support the debugger
-
-                                   4/1
-                                   ---
-lib/sh/shquote.c
-       - make sure CTLESC and CTLNUL characters are escaped with CTLESC
-         by sh_double_quote, sh_backslash_quote and
-         sh_backslash_quote_for_double_quotes
-         Fixes vulnerability reported by svdb@stack.nl
-
-shell.h
-       - new `pipestatus' member of sh_parser_state_t, to save and restore
-         $PIPESTATUS
-
-parse.y
-       - changes to save_parser_state and restore_parser_state to save and
-         restore $PIPESTATUS
-
-builtins/read.def
-       - add a call to word_list_remove_quoted_nulls before assigning the
-         word list read from standard input to an array variable.  Fixes
-         bug reported by holzhey@ppprs1.phy.tu-dresden.de
-
-                                   4/3
-                                   ---
-execute_cmd.c
-       - in execute_null_command, if redirections are supplied, make sure
-         things like 3</etc/passwd are undone immediately, since they're
-         being done in the current shell
-       - functions now inherit the RETURN trap only if function tracing is
-         on for that function or globally
-
-lib/readline/misc.c
-       - in rl_replace_from_history, don't force rl_replace_line to clear
-         the undo_list, since it might point directly at an undo list
-         from a history entry (to which we have no handle)
-
-                                   4/4
-                                   ---
-trap.c
-       - initialize RETURN_TRAP stuff appropriately in initialize_traps()
-       - let command substitutions inherit the RETURN trap if we're in
-         the debugger and function tracing has been enabled
-
-redir.c
-       - do_redirections and do_redirection_internal now take a single
-         flags argument instead of multiple boolean flags
-
-redir.h
-       - new #defines for flags argument to do_redirection{s,_internal}
-
-execute_cmd.c
-       - change all calls to do_redirection to use new flag values
-
-parse.y
-       - new function, free_pushed_string_input(), an external interface to
-         clear the pushed_string list (alias expansion)
-       - new define SHOULD_PROMPT to say when it's OK to call prompt_again
-         (if the shell is currently interactive and is reading input from
-         the terminal or readline)
-       - make sure shell_getc and read_secondary_line only call prompt_again
-         if SHOULD_PROMPT evaluates to true
-       - prompt_again shouldn't do anything if the shell is currently in the
-         middle of expanding a multiline alias, since we won't be printing a
-         prompt anyway
-
-externs.h
-       - new extern declaration for free_pushed_string_input()
-
-execute_cmd.c
-       - command_substitute and process_substitute now call
-         free_pushed_string_input because they shouldn't deal with any
-         partial alias expansion the parent shell may have started
-
-                                   4/5
-                                   ---
-braces.c
-       - added {x..y} brace expansion, shorthand for {x,x+1,x+2,...,y}:
-         x, y can be integers or single characters; the sequence can be
-         ascending or descending; increment is always 1.  Beware that
-         something like {a..A} can lead to non-letters.
-
-                                   4/7
-                                   ---
-subst.c
-       - change extract_delimited_string and extract_dollar_brace_string to
-         return NULL on an expansion error when no_longjmp_on_fatal_error
-         is set, so the calling functions don't assume that the expansion
-         was successful (primarily the prompt expansion and completion code)
-
-doc/{bash.1,bashref.texi}
-       - documented new sequence generation feature of brace expansion
-
-                                   4/8
-                                   ---
-lib/sh/strstr.c
-       - replacement for strstr(3), in case the C library doesn't provide it
-
-configure.in
-       - check for strstr, add to LIBOBJS if not found
-
-array.c
-       - array_walk now takes a third void * argument; it's passed to `func'
-         as its second argument
-
-array.h
-       - change sh_ae_map_func_t prototype to add void * second argument
-
-                                  4/10
-                                  ----
-array.c
-       - new function: array_keys_to_word_list, returns a list of indices for
-         a given array
-
-array.h
-       - new extern declaration for array_keys_to_word_list
-
-arrayfunc.c
-3      - new function: char *array_keys(), returns a string with keys for a
-         given array, with the appropriate quoting
-
-arrayfunc.h
-       - new extern declaration for array_keys
-
-subst.c
-       - code to implement ksh93-like ${!array[@]} expansion (array[*] works,
-         too), which expands to all the keys (indices) of ARRAY
-
-doc/{bash.1,bashref.texi}
-       - documented new ${!array[@]} expansion
-
-                                  4/19
-                                  ----
-builtins/setattr.def
-       - remove any mention of the `-n' option from readonly builtin's short
-         and long documentation
-
-pcomplib.c
-       - fix progcomp_insert to increase the refcount on the `cs' argument
-         before calling hash_insert -- fixes the problem of multiple calls
-         to progcomp_insert with the same compspec
-
-doc/bash.1
-       - add mention of characters that inhibit history expansion when found
-         immediately following an unquoted `!'
-
-bashline.c
-       - convert the code conditionally compiled in by the NO_FORCE_FIGNORE
-         #define to something runtime-tunable with the `force_fignore'
-         variable (opposite sense).  force_fignore is 1 by default
-
-builtins/shopt.def
-       - new tunable `shopt' option: `force_fignore', controls force_fignore
-         variable and behavior of FIGNORE handling
-
-lib/readline/complete.c
-       - new variable, _rl_complete_show_unmodified, causes completer to list
-         possible completions if more than one completion and partial
-         completion cannot be done
-       - new value for what_to_do argument to rl_complete_internal, `@',
-         indicating that we want the show-unmodified behavior
-       - change rl_completion_type to return `@' when appropriate
-
-lib/readline/bind.c
-       - new bindable variable, show-all-if-unmodified, which controls value
-         of _rl_complete_show_unmodified
-
-lib/readline/rlprivate.h
-       - extern declaration for _rl_complete_show_unmodified
-
-lib/readline/doc/rluser.texi
-       - documented show-all-if-unmodified
-
-lib/readline/doc/rltech.texi
-       - documented new `@' value for second argument to rl_complete_internal
-       - documented new return value from rl_completion_type
-
-                                  4/22
-                                  ----
-lib/readline/signals.c
-       - in rl_set_signal, set sa_flags to SA_RESTART for SIGWINCH, if we
-         have POSIX signals -- this is what most applications expect, and
-         they're not prepared to deal with EINTR
-
-                                  4/25
-                                  ----
-bashline.c
-       - take out attempts to suppress readline filename completion when
-         attempting command completion and there is a directory with the
-         same name in the current directory.  #if 0'd for now; maybe make
-         it conditional later
-
-error.c
-       - new variable, gnu_error_format, causes non-interactive errors with
-         line numbers to be printed in the `gnu style' (filename:lineno:)
-         instead of the `shell style' (filename: line lineno:) by
-         error_prolog and parser_error
-
-version.h,support/mkversion
-       - don't put extern function declarations into created version.h any
-         more
-
-version.c,externs.h
-       - add extern declarations for show_shell_version() and
-         shell_version_string(), since they're no longer in version.h
-         (this backs out change from 9/10/2001)
-
-shell.h
-       - don't include version.h
-
-Makefile.in
-       - remove unneeded dependencies on version.h -- only version.o
-         needs it now
-
-builtins/shopt.def
-       - new option `gnu_errfmt', changes error messages with line numbers
-         to use the `standard' gnu format
-
-pcomplete.h
-       - new COPT_BASHDEFAULT and COPT_PLUSDIRS defines
-
-bashline.c
-       - if the COPT_BASHDEFAULT flag is set, try the rest of the bash
-         default completions if a compspec with that flag set generates
-         no matches
-       - broke bash completions out into separate function:
-         bash_default_completion(const char *text, int start, int end,
-         int qc, int in_command_position); change attempt_shell_completion
-         to call it
-
-bashline.h
-       - new extern declaration for bash_default_completion
-
-builtins/complete.def
-       - added code to compgen to call bash_default_completion if a compspec
-         with the COPT_BASHDEFAULT flag set generates no matches from the
-         programmable completion options
-
-doc/{bash.1,bashref.texi}
-       - document new `gnu_errfmt' shopt option
-
-doc/bash.1,lib/readline/doc/rluser.texi
-       - document new `-o bashdefault' option to complete and compgen
-
-                                  4/26
-                                  ----
-pcomplete.c
-       - if a compspec has the COPT_PLUSDIRS flag set, generate any
-         directory name completions and add them to the set of possible
-         completions as the last thing in gen_compspec_completions
-
-builtins/complete.def
-       - add new `-o plusdirs' option to complete and compgen; means to
-         do directory name completion in addition to other actions
-         specified by the compspec, and do it last
-
-                                  5/12
-                                  ----
-copy_cmd.c
-       - fix copy_{for,select,case}_command to copy the line member
-
-                                  5/13
-                                  ----
-lib/readline/rlmbutil.h,include/shmbutil.h
-       - new #define MB_INVALIDCH, evaluates to true if return value from
-         mbrtowc or mbrlen denotes an invalid multibyte character
-       - new #define MB_NULLWCH, evaluates to true if return value from
-         mbrtowc or mbrlen denotes a null multibyte character
-
-lib/readline/complete.c
-       - new function, fnwidth(), returns printed length of a filename,
-         correctly handling multibyte characters
-       - new function, fnprint(), displays a filename on rl_outstream
-         correctly handling multibyte characters
-       - use fnwidth() instead of simple strlen() for length calculations
-         in display_matches
-
-lib/readline/{display,mbutil}.c
-       - use MB_INVALIDCH and MB_NULLWCH as appropriate
-
-                                  5/21
-                                  ----
-configure.in
-       - turn off the builtin malloc on GNU/FreeBSD systems (GNU userland,
-         FreeBSD kernel)
-
-                                  5/24
-                                  ----
-pcomplete.c
-       - in programmable_completions, copy the compspec before using it to
-         generate the possible completions, allowing the completion for the
-         command to be changed by the compspec itself without causing a
-         core dump because the shell frees freed memory (reported by
-         marcus.harnish@gmx.net)
-
-parse.y
-       - in shell_getc, don't call notify_and_cleanup in an interactive shell
-         unless the shell is currently reading from the terminal and would
-         print a prompt.  This fixes programmable completions printing job
-         notifications (reported by r.d.green@lancaster.ac.uk)
-       - use SHOULD_PROMPT macro consistently
-
-shell.c
-       - use get_string_value instead of getenv when looking up $TERM and
-         $EMACS to see whether the shell is running under emacs
-       - check for `TERM=dumb' as well as `EMACS=t' to decide whether or
-         not to turn off command-line editing in emacs shell windows
-         (reported by jik@kamens.brookline.ma.us)
-
-                                  5/28
-                                  ----
-expr.c
-       - save and restore the `evalbuf' context, since evalexp can be
-         called recursively (e.g. a[b[c]])
-
-                                  5/29
-                                  ----
-builtins/common.c
-       - in display_signal_list, when displaying for `kill -l' in posix mode,
-         display signal names without the `SIG' prefix
-
-doc/bashref.texi
-       - documented changed to posix mode behavior of kill -l
-
-builtins/kill.def
-       - changed the error message printed when argument is not a pid or
-         job id
-
-doc/{bash.1,bashref.texi}
-       - fixed a slight inconsistency in the different sections describing
-         the `promptvars' option
-
-doc/Makefile.in
-       - new rule to create `bash.info' from `bashref.info' by running sed
-         to change the internal references.  This makes the installed
-         bash.info work right
-       - make the install target install bash.info after it's been modified
-         from bashref.info
-
-                                  5/30
-                                  ----
-builtins/cd.def
-       - after testing with ferror(), call clearerr if ferror() evaluates
-         to true
-
-execute_cmd.c
-       - call clearerr(stdout) after executing a builtin or function,
-         before restoring any redirections
-
-bashhist.c
-       - initialize history_comment_char in bash_history_initialize
-
-builtins/alias.def
-       - if posix mode is enabled, and the `-p' option is not supplied, don't
-         list aliases with a preceding `alias ', as POSIX.2 specifies
-
-doc/bashref.texi
-       - note new posix mode behavior of displaying alias names and values
-       - note new posix mode behavior of trap builtin not checking first
-         argument to be a possible signal specification
-       - note new posix mode behavior of `kill' not accepting signal names
-         with a leading `SIG'
-
-include/stdc.h,lib/readline/rlstdc.h
-       - don't check the __STRICT_ANSI__ define when deciding whether or not
-         to #undef __attribute__
-
-trap.[ch]
-       - decode_signal and signal_object_p take an additional flags arg to
-         satisfy POSIX.2 signal name translation requirements
-       - change decode_signal to honor the new DSIG_NOCASE (match case-
-         insensitively) and DSIG_SIGPREFIX (allow signal specifications
-         with the `SIG' prefix) flags
-
-builtins/{common.c,{trap,kill}.def}
-       - change calls to decode_signal to add the new argument with
-         appropriate values.  For kill, POSIX.2 says case-insensitive without
-         the `SIG' prefix.  For trap, POSIX.2 says applications may decode
-         case-insensitively and with the SIG prefix
-
-builtins/trap.def
-       - when in posix mode, don't check for the first argument being a
-         possible signal spec and revert the signal handling to the
-         original disposition
-
-                                   6/1
-                                   ---
-shell.h
-       - new MATCH_STARSUB define, to tell the callers of the various pattern
-         substitution and removal functions that call string_list to treat
-         "$*" and "${array[*]}" appropriately
-subst.c
-       - if get_var_and_type encounters an array variable subscripted by `*'
-         or `$*', return VT_STARSUB or'd into the variable type value
-       - callers of get_var_and_type check for VT_STARSUB in the returned type
-         this will fix problems with ${*...} not being separated with the
-         first character of $IFS when double-quoted
-       - in parameter_brace_patsub, set MATCH_STARSUB if VT_STARSUB is set by
-         get_var_and_type
-       - change pos_params_pat_subst to call string_list_dollar_star if
-         the match flags include MATCH_STARSUB
-       - change parameter_brace_substring to call array_subrange with an
-         additional argument indicating the character indexing the array
-
-array.c
-       - change array_patsub to join the modified array elements with the
-         first character of $IFS if MATCH_STARSUB is set in the match flags
-         passed in
-       - array_subrange now takes an additional argument indicating the
-         index type -- used to separate with first char of $IFS if the
-         index char is `*' and the expression is double-quoted
-
-array.h
-       - change prototype declaration of array_subrange to add additional arg
-
-                                   6/2
-                                   ---
-doc/FAQ
-       - merged in some updates about POSIX from Andrew Josey
-
-                                   6/3
-                                   ---
-bashjmp.h
-       - new value for jump_to_top_level:  ERREXIT
-
-{eval,shell,subst,trap}.c,builtins/evalstring.c
-       - ERREXIT is (for now) equivalent to EXITPROG as a value from
-         jump_to_top_level
-
-                                   6/9
-                                   ---
-doc/bash.1,lib/readline/doc/readline.3
-       - documented new `show-all-if-unmodified' readline variable
-
-                                  6/14
-                                  ----
-lib/readline/history.c
-       - new function, histdata_t free_history_entry (HIST_ENTRY *h),
-         frees H and its line, returning the application-specific data
-       - use free_history_entry where appropriate
-
-lib/readline/history.h
-       - extern declaration for free_history_entry()
-
-lib/readline/doc/{history.3,hstech.texi}
-       - document free_history_entry
-
-                                  6/16
-                                  ----
-lib/readline/readline.[ch]
-       - changed varions defines for readline/history library versions to 5.0
-
-subst.c
-       - pass information about whether or not an indirectly-expanded variable
-         contains ${array[@]}, ${array[*]}, $@, or $*
-       - new function, chk_atstar, performs checks for ${array[@]},
-         ${array[*]}, $@, or $* for the parameter_brace_expand* functions and
-         sets flags (passed as args) to the results
-       - call chk_atstar from parameter_brace_expand_indir and
-         parameter_brace_expand
-
-                                  6/28
-                                  ----
-doc/{bash.1,bashref.texi}
-       - clarified that (...) commands are executed in a subshell environment
-
-                                  6/30
-                                  ----
-lib/readline/bind.c
-       - fix a problem with parsing nested if statements in inputrc files
-         (fix from dimakar@yahoo.com)
-
-                                   7/3
-                                   ---
-{jobs,nojobs}.c
-       - fix places that use the return value from strsignal() to check
-         for NULL return values using a new function, j_strsignal()
-
-builtins/kill.def
-       - removed JOB_CONTROL restriction; kill is now available as a builtin
-         when the shell is built without job control
-
-                                  7/10
-                                  ----
-jobs.c
-       - some systems have WIFCONTINUED but not WCONTINUED; separate the
-         #defines
-
-                                  7/14
-                                  ----
-lib/readline/history.h
-       - new `timestamp' member of a HIST_ENTRY
-       - extern declarations for add_history_time and history_get_time
-
-lib/readline/doc/{history.3,hstech.texi}
-       - document add_history_time and history_get_time
-
-lib/readline/history.c
-       - implementations of history_get_time and add_history_time
-       - change add_history to initialize the timestamp information
-       - change free_history_entry to free the timestamp
-       - change replace_history_entry to duplicate the timestamp
-       - change history_total_bytes to add the memory taken by the time
-         stamps
-
-bashhist.c,builtins/history.def
-       - use free_history_entry where appropriate
-
-lib/readline/histfile.c
-       - changes to read_history_range to deal with new history file format
-         including timestamps
-       - changes to history_do_write to write out the timestamp information
-       - changes to history_truncate_file to understand the timestamp
-         information
-
-                                  7/22
-                                  ----
-doc/{bash.1,bashref.texi}
-       - fixed function declaration documentation to specify that any compound
-         command may be used as the function body, not just a group command
-
-                                  7/23
-                                  ----
-lib/readline/histfile.c
-       - don't allocate space for null timestamps in history_do_write, and
-         don't write out null timestamp entries
-
-parse.y
-       - fix CHECK_FOR_RESERVED_WORD to call time_command_acceptable() and
-         return TIME if the token is "time" and `time' is legal in that
-         context
-
-                                  7/29
-                                  ----
-lib/sh/fmtulong.c
-       - include <inttypes.h> for possible definitions of intmax_t, uintmax_t
-         (reported by ro@techfak.uni-bielefeld.de)
-
-                                  7/30
-                                  ----
-parse.y
-       - remove checking for `time' reserved word from special_case_tokens();
-         use regular mechanism in CHECK_FOR_RESERVED_WORD.  This allows `time'
-         to be aliased.  (Reported by Glenn Morris
-         <gmorris+gmane@ast.cam.ac.uk>)
-
-                                  7/31
-                                  ----
-lib/readline/history.h
-       - extern declaration for history_write_timestamps
-
-lib/readline/histfile.c
-       - don't write timestamps to the history file in history_do_write
-         unless history_write_timestamps is set to non-zero by the application
-         (set to 0 by default)
-
-lib/readline/doc/{hstech.texi,history.3}
-       - document history_write_timestamps
-
-variables.[ch]
-       - new special variable function, HISTTIMEFORMAT; special function
-         sets history_write_timestamps to 1 if HISTTIMEFORMAT is set
-
-                                   8/4
-                                   ---
-builtins/history.def
-       - added support for printing time stamps based on the value of the
-         HISTTIMEFORMAT variable when displaying history entries
-
-doc/{bash.1,bashref.texi}
-       - added description of new HISTTIMEFORMAT variable
-
-                                   8/5
-                                   ---
-config-top.h
-       - remove /usr/ucb from any default paths
-
-mailcheck.c
-       - make_default_mailpath now returns NULL if DEFAULT_MAIL_DIRECTORY
-         is not defined
-       - remember_mail_dates now returns if make_default_mailpath returns
-         NULL
-
-config-bot.h
-       - reorganized the sections; provide an explicit placeholder for
-         builders to #undef any feature defines they don't want that
-         configure creates for them, like the default mail path
-
-                                   8/9
-                                   ---
-config.h.in
-       - add HAVE_REGEX_H, HAVE_REGCOMP, HAVE_REGEXEC for detection of POSIX.2
-         regular expression functions
-       - add COND_REGEXP define to enable and disable the =~ operator for
-         matching extended regular expressions in [[...]] commands
-
-configure.in
-       - new option, --enable-cond-regexp, enables =~ and code to perform
-         regular expression matching in [[...]]
-
-config-bot.h
-       - undef COND_REGEXP if the OS doesn't provide posix regexp support
-
-doc/bashref.texi
-       - documnent new --enable-cond-regexp option to configure
-
-                                  8/18
-                                  ----
-support/shobj-conf
-       - support for shared objects on FreeBSD-gnu (from Robert Millan)
-
-                                  8/25
-                                  ----
-lib/sh/shmatch.c
-       - new file, shell interface to posix extended regular expression
-         matching
-
-externs.h
-       - new extern declarations for functions in shmatch.c
-
-execute_cmd.c
-       - incorporate code into execute_cond_node that does extended regular
-         expression matching for the =~ operator
-
-parse.y
-       - add `=~' to the list of binary operators accepted by the conditional
-         command parser
-
-doc/{bash.1,bashref.texi}
-       - documented =~ conditional binary operator and the BASH_REMATCH
-         variable
-
-                                  8/27
-                                  ----
-lib/readline/display.c
-       - take multibyte characters into account when looking for quoted
-         substrings on which to do completion (fix from jir@yamato.ibm.com)
-
-lib/readline/util.c
-       - fix typo in _rl_strpbrk
-
-lib/readline/rldefs.h
-       - use function version of _rl_strpbrk in multibyte locales, because
-         it understands to skip over special characters in multibyte
-         character sequences
-
-                                  8/28
-                                  ----
-jobs.c
-       - in wait_for, check for window size changes if a job that exits due
-         to a signal or is stopped was in the foreground, not just if it's
-         the current job
-
-                                  9/10
-                                  ----
-support/config.{guess,sub}
-       - add support to recognize FreeBSD running on the amd64
-
-subst.c
-       - if the new `fail_glob_expansion' variable is non-zero, globbing that
-         fails to match anything causes an expansion error
-
-builtins/shopt.def
-       - new `failglob' expansion:  if enabled, failed globs cause an error
-
-test/shopt.right
-       - take `failglob' into account
-
-doc/{bash.1,bashref.texi}
-       - documented new `failglob' option and its effects
-
-                                  9/12
-                                  ----
-findcmd.c
-       - fix file_status to treat the mode bits and uid right -- in particular,
-         don't assume the `other' bits always apply.  Bug reported by
-         <moseley@hank.org>; fix inspired by <carlo@alinoe.com>
-
-command.h
-       - new word flag: W_NOCOMSUB, meaning to not perform command
-         substitution on a word
-
-subst.c
-       - new flag for param_expand: PF_NOCOMSUB.  If non-zero, $(...)
-         command substitutions are not expanded, but returned unchanged
-       - change expand_word_internal to pass through `` command substitutions
-         unchanged if (word->flags & W_NOCOMSUB) != 0
-       - change expand_word_internal to pass PF_NOCOMSUB to param_expand
-         if (word->flags & W_NOCOMSUB) != 0
-
-builtins/shopt.def
-       - rename set_interactive_comments to set_shellopts_after_change, which
-         more accurately reflects its purpose
-
-syntax.h
-       - add a define for isblank() in case the system doesn't provide one
-
-jobs.c
-       - change raw_job_exit_status to understand `pipefail', using the new
-         `pipefail_opt' variable
-
-flags.[ch]
-       - declare pipefail_opt
-       - reset pipefail_opt to 0 in reset_shell_flags
-
-builtins/set.def
-       - add `set -o pipefail' and document it in help output
-
-doc/{bash.1,bashref.texi}
-       - document `set -o pipefail' and the effect of the pipefail option
-
-mksyntax.c,syntax.h
-       - sh_syntaxtab is no longer `const'
-       - new generated variable, sh_syntabsiz, set to number of entries in
-         sh_syntaxtab, written to generated syntax.c
-
-locale.c
-       - new function, locale_setblanks(), sets each member of the current
-         locale's <blank> class to have the CSHBRK flag in sh_syntaxtab
-
-                                  9/17
-                                  ----
-arrayfunc.c
-       - change convert_var_to_array to not set array[0] to a NULL value
-         (if the scalar variable had no value; e.g., after being created
-         with `local arrayvar')
-
-lib/readline/display.c
-       - save and restore the value of prompt_invis_chars_first_line in
-         rl_{save,restore}_prompt, and reinitialize it to 0 before printing
-         something in the message area
-
-lib/readline/bind.c
-       - new functions: rl_bind_keyseq_if_unbound_in_map(ks, func, kmap);
-         binds key sequence KS to function FUNC in keymap KMAP, and
-         rl_bind_keyseq_if_unbound (ks, func); binds key sequence KS to
-         function FUNC in the current keymap
-
-lib/readline/readline.h
-       - extern function declarations for rl_bind_keyseq_if_unbound_in_map and
-         rl_bind_keyseq_if_unbound
-
-lib/readline/{readline,terminal}.c
-       - _rl_bind_if_unbound -> rl_bind_keyseq_if_unbound
-
-lib/readline/{bind.c,rlprivate.h}
-       - remove _rl_bind_if_unbound
-
-                                  9/18
-                                  ----
-lib/readline/doc/rltech.texi
-       - document rl_bind_keyseq_if_unbound and
-         rl_bind_keyseq_if_unbound_in_map
-
-                                  9/19
-                                  ----
-lib/readline/bind.c
-       - new functions rl_bind_key_if_unbound_in_map and
-         rl_bind_key_if_unbound; analogous to (and implemented in terms of)
-         keyseq functions
-       - rl_bind_keyseq_in_map: a new function, equivalent to rl_set_key
-         (which remains for backwards compatibility); changed callers to
-         use it
-       - new function, rl_bind_keyseq, equivalent to rl_bind_keyseq_in_map
-         with a third argument of _rl_keymap
-
-lib/readline/readline.h
-       - extern declarations for rl_bind_key_if_unbound_in_map and
-         rl_bind_key_if_unbound
-       - extern declarations for rl_bind_keyseq_in_map and rl_bind_keyseq
-
-lib/readline/doc/rltech.texi
-       - document rl_bind_keyseq and rl_bind_keyseq_in_map
-
-configure.in
-       - require at least readline-5.0
-
-config-bot.h
-       - define SYS_SIGLIST_DECLARED if it's not defined, but
-         HAVE_DECL_SYS_SIGLIST is, to deal with differences between
-         autoconf versions
-
-bashline.c
-       - use rl_bind_key_if_unbound_in_map when binding bash keybindings in
-         initialize_readline(), so inputrc files can override them
-
-                                  9/22
-                                  ----
-lib/readline/histsearch.c
-       - do better bounds checking for history_offset and history_length in
-         history_search_internal
-
-builtins/history.def
-       - in delete_last_history(), make sure we don't leave the history
-         offset longer than the history length after calling delete_histent
-
-                                  9/23
-                                  ----
-jobs.c
-       - small change to notify_of_job_status so job status messages get
-         printed even if the shell was started to run `-c command'.  The
-         old behavior was intentional, but I cannot remember why, so we'll
-         try it the other way for a while (debian bash bug #211693)
-
-                                  9/24
-                                  ----
-jobs.c
-       - slightly modify change from 9/23 so that jobs started to run
-         command substitutions don't print job status messages
-
-                                  9/25
-                                  ----
-lib/readline/search.c
-       - when reading a non-incremental search string from the terminal,
-         use a separate undo list rather than chaining it to the undo list
-         from the rest of the line, since the whole undo list will get
-         freed when the search string is complete
-
-lib/readline/readline.h
-       - changed the defines guarding the stdarg prototype for rl_message to
-         match what's actually used in display.c, where it's defined
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..d2d81b30264de22e87ad5e1fd72c45243b6b109a
--- /dev/null
@@ -0,0 +1 @@
+CWRU.chlog
\ No newline at end of file
diff --git a/CWRU/history-syslog.1 b/CWRU/history-syslog.1
new file mode 100644 (file)
index 0000000..d5240d3
--- /dev/null
@@ -0,0 +1,47 @@
+#Date: Mon, 14 Dec 1998 23:10:43 -0800
+#From: John Kinsella <jlk@digex.net>
+#To: chet@po.cwru.edu
+#Subject: Re: bash patch
+
+diff -c bash-2.02.1-old/bashhist.c bash-2.02.1/bashhist.c
+*** bash-2.02.1-old/bashhist.c  Fri Feb 27 09:34:33 1998
+--- bash-2.02.1/bashhist.c      Mon Dec 14 22:39:23 1998
+***************
+*** 50,55 ****
+--- 50,65 ----
+  #  include "bashline.h"
+  #endif
+  
++ /* SYSLOG_HISTORY - define this if you want all commands entered into
++  * the shell to be echoed to syslog.
++  * (feature added by John Kinsella<jlk@digex.net>)
++  */
++ #define SYSLOG_HISTORY 1
++ 
++ #if defined (SYSLOG_HISTORY)
++ # include <syslog.h>
++ #endif
++ 
+  #if !defined (errno)
+  extern int errno;
+  #endif
+***************
+*** 566,571 ****
+--- 576,587 ----
+      {
+        hist_last_line_added = 1;
+        add_history (line);
++       /* next 3 lines added by John Kinsella<jlk@digex.net> 
++        * Sends history line to syslog.
++        */
++ #if defined( SYSLOG_HISTORY )
++       syslog( LOG_INFO, "%d - %s", current_user.euid, line );
++ #endif
+        history_lines_this_session++;
+      }
+    using_history ();
+#
+#-- 
+#John Kinsella                         UNIX ISA
+#jlk@digex.net                         DIGEX West Coast Facility
+#voice 408-873-4278                    pager 888-751-7595
diff --git a/CWRU/misc/copyright b/CWRU/misc/copyright
new file mode 100644 (file)
index 0000000..3780dec
--- /dev/null
@@ -0,0 +1,17 @@
+/* Copyright (C) 1999 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
diff --git a/CWRU/misc/getwd.bsd44.c b/CWRU/misc/getwd.bsd44.c
new file mode 100644 (file)
index 0000000..f5dd39b
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+ * Copyright (c) 1989, 1991 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)getcwd.c   5.11 (Berkeley) 2/24/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <errno.h>
+#if defined (HAVE_DIRENT_H)
+#include <dirent.h>
+#else
+#include <sys/dir.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef HAVE_DIRENT_H
+#  define dirent direct
+#endif
+
+#define        ISDOT(dp) \
+       (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \
+           dp->d_name[1] == '.' && dp->d_name[2] == '\0'))
+
+#ifndef dirfd
+#  define dirfd(d)     ((d)->dd_fd)
+#endif
+
+char *
+getcwd(pt, size)
+       char *pt;
+       size_t size;
+{
+       register struct dirent *dp;
+       register DIR *dir;
+       register dev_t dev;
+       register ino_t ino;
+       register int first;
+       register char *bpt, *bup;
+       struct stat s;
+       dev_t root_dev;
+       ino_t root_ino;
+       size_t ptsize, upsize;
+       int save_errno;
+       char *ept, *eup, *up;
+
+       /*
+        * If no buffer specified by the user, allocate one as necessary.
+        * If a buffer is specified, the size has to be non-zero.  The path
+        * is built from the end of the buffer backwards.
+        */
+       if (pt) {
+               ptsize = 0;
+               if (!size) {
+                       errno = EINVAL;
+                       return((char *)NULL);
+               }
+               ept = pt + size;
+       } else {
+               if (!(pt = (char *)malloc(ptsize = 1024 - 4)))
+                       return((char *)NULL);
+               ept = pt + ptsize;
+       }
+       bpt = ept - 1;
+       *bpt = '\0';
+
+       /*
+        * Allocate bytes (1024 - malloc space) for the string of "../"'s.
+        * Should always be enough (it's 340 levels).  If it's not, allocate
+        * as necessary.  Special * case the first stat, it's ".", not "..".
+        */
+       if (!(up = (char *)malloc(upsize = 1024 - 4)))
+               goto err;
+       eup = up + MAXPATHLEN;
+       bup = up;
+       up[0] = '.';
+       up[1] = '\0';
+
+       /* Save root values, so know when to stop. */
+       if (stat("/", &s))
+               goto err;
+       root_dev = s.st_dev;
+       root_ino = s.st_ino;
+
+       errno = 0;                      /* XXX readdir has no error return. */
+
+       for (first = 1;; first = 0) {
+               /* Stat the current level. */
+               if (lstat(up, &s))
+                       goto err;
+
+               /* Save current node values. */
+               ino = s.st_ino;
+               dev = s.st_dev;
+
+               /* Check for reaching root. */
+               if (root_dev == dev && root_ino == ino) {
+                       *--bpt = '/';
+                       /*
+                        * It's unclear that it's a requirement to copy the
+                        * path to the beginning of the buffer, but it's always
+                        * been that way and stuff would probably break.
+                        */
+                       (void)bcopy(bpt, pt, ept - bpt);
+                       free(up);
+                       return(pt);
+               }
+
+               /*
+                * Build pointer to the parent directory, allocating memory
+                * as necessary.  Max length is 3 for "../", the largest
+                * possible component name, plus a trailing NULL.
+                */
+               if (bup + 3  + MAXNAMLEN + 1 >= eup) {
+                       if (!(up = (char *)realloc(up, upsize *= 2)))
+                               goto err;
+                       eup = up + upsize;
+               }
+               *bup++ = '.';
+               *bup++ = '.';
+               *bup = '\0';
+
+               /* Open and stat parent directory. */
+               if (!(dir = opendir(up)) || fstat(dirfd(dir), &s))
+                       goto err;
+
+               /* Add trailing slash for next directory. */
+               *bup++ = '/';
+
+               /*
+                * If it's a mount point, have to stat each element because
+                * the inode number in the directory is for the entry in the
+                * parent directory, not the inode number of the mounted file.
+                */
+               save_errno = 0;
+               if (s.st_dev == dev) {
+                       for (;;) {
+                               if (!(dp = readdir(dir)))
+                                       goto notfound;
+                               if (dp->d_fileno == ino)
+                                       break;
+                       }
+               } else
+                       for (;;) {
+                               if (!(dp = readdir(dir)))
+                                       goto notfound;
+                               if (ISDOT(dp))
+                                       continue;
+                               bcopy(dp->d_name, bup, dp->d_namlen + 1);
+
+                               /* Save the first error for later. */
+                               if (lstat(up, &s)) {
+                                       if (!save_errno)
+                                               save_errno = errno;
+                                       errno = 0;
+                                       continue;
+                               }
+                               if (s.st_dev == dev && s.st_ino == ino)
+                                       break;
+                       }
+
+               /*
+                * Check for length of the current name, preceding slash,
+                * leading slash.
+                */
+               if (bpt - pt <= dp->d_namlen + (first ? 1 : 2)) {
+                       size_t len, off;
+
+                       if (!ptsize) {
+                               errno = ERANGE;
+                               goto err;
+                       }
+                       off = bpt - pt;
+                       len = ept - bpt;
+                       if (!(pt = (char *)realloc(pt, ptsize *= 2)))
+                               goto err;
+                       bpt = pt + off;
+                       ept = pt + ptsize;
+                       (void)bcopy(bpt, ept - len, len);
+                       bpt = ept - len;
+               }
+               if (!first)
+                       *--bpt = '/';
+               bpt -= dp->d_namlen;
+               bcopy(dp->d_name, bpt, dp->d_namlen);
+               (void)closedir(dir);
+
+               /* Truncate any file name. */
+               *bup = '\0';
+       }
+
+notfound:
+       /*
+        * If readdir set errno, use it, not any saved error; otherwise,
+        * didn't find the current directory in its parent directory, set
+        * errno to ENOENT.
+        */
+       if (!errno)
+               errno = save_errno ? save_errno : ENOENT;
+       /* FALLTHROUGH */
+err:
+       if (ptsize)
+               free(pt);
+       free(up);
+       return((char *)NULL);
+}
+
+char *
+getwd(buf)
+       char *buf;
+{
+       char *p;
+
+       if (p = getcwd(buf, MAXPATHLEN))
+               return(p);
+       (void)strcpy(buf, strerror(errno));
+       return((char *)NULL);
+}
diff --git a/CWRU/misc/iptrt.c b/CWRU/misc/iptrt.c
new file mode 100644 (file)
index 0000000..b9d1e2a
--- /dev/null
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+main()
+{
+       if (sizeof(char *) == sizeof(long))
+               printf("long\n");
+       else if (sizeof(char *) == sizeof(short))
+               printf("short\n");
+       else
+               printf("int\n");
+       exit(0);
+}
diff --git a/CWRU/misc/nofd0.c b/CWRU/misc/nofd0.c
new file mode 100644 (file)
index 0000000..88cae1a
--- /dev/null
@@ -0,0 +1,9 @@
+main(c, v, e)
+int    c;
+char   **v, **e;
+{
+       close(0);
+       execv(v[1], v+1);
+}
+
+       
diff --git a/CWRU/misc/pcat.c b/CWRU/misc/pcat.c
new file mode 100644 (file)
index 0000000..f520128
--- /dev/null
@@ -0,0 +1,239 @@
+/* $Header:cat.c 12.0$ */
+/* $ACIS:cat.c 12.0$ */
+/* $Source: /ibm/acis/usr/src/bin/RCS/cat.c,v $ */
+
+#ifndef lint
+static char *rcsid = "$Header:cat.c 12.0$";
+#endif
+
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)cat.c      5.2 (Berkeley) 12/6/85";
+#endif not lint
+
+/*
+ * Concatenate files.
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/* #define OPTSIZE BUFSIZ      /* define this only if not 4.2 BSD or beyond */
+
+int    bflg, eflg, nflg, sflg, tflg, uflg, vflg;
+int    spaced, col, lno, inline, ibsize, obsize;
+
+#include <signal.h>
+
+sigpipe()
+{
+       write(2, "pcat: caught SIGPIPE\n", 21);
+       exit(1);
+}
+
+main(argc, argv)
+char **argv;
+{
+       int fflg = 0;
+       register FILE *fi;
+       register c;
+       int dev, ino = -1;
+       struct stat statb;
+       int retval = 0;
+
+       signal(SIGPIPE, sigpipe);
+       lno = 1;
+       for( ; argc>1 && argv[1][0]=='-'; argc--,argv++) {
+               switch(argv[1][1]) {
+               case 0:
+                       break;
+               case 'u':
+                       setbuf(stdout, (char *)NULL);
+                       uflg++;
+                       continue;
+               case 'n':
+                       nflg++;
+                       continue;
+               case 'b':
+                       bflg++;
+                       nflg++;
+                       continue;
+               case 'v':
+                       vflg++;
+                       continue;
+               case 's':
+                       sflg++;
+                       continue;
+               case 'e':
+                       eflg++;
+                       vflg++;
+                       continue;
+               case 't':
+                       tflg++;
+                       vflg++;
+                       continue;
+               }
+               break;
+       }
+       if (fstat(fileno(stdout), &statb) == 0) {
+               statb.st_mode &= S_IFMT;
+               if (statb.st_mode!=S_IFCHR && statb.st_mode!=S_IFBLK) {
+                       dev = statb.st_dev;
+                       ino = statb.st_ino;
+               }
+#ifndef        OPTSIZE
+               obsize = statb.st_blksize;
+#endif
+       }
+       else
+               obsize = 0;
+       if (argc < 2) {
+               argc = 2;
+               fflg++;
+       }
+       while (--argc > 0) {
+               if (fflg || (*++argv)[0]=='-' && (*argv)[1]=='\0')
+                       fi = stdin;
+               else {
+                       if ((fi = fopen(*argv, "r")) == NULL) {
+                               perror(*argv);
+                               retval = 1;
+                               continue;
+                       }
+               }
+               if (fstat(fileno(fi), &statb) == 0) {
+                       if ((statb.st_mode & S_IFMT) == S_IFREG &&
+                           statb.st_dev==dev && statb.st_ino==ino) {
+                               fprintf(stderr, "cat: input %s is output\n",
+                                  fflg?"-": *argv);
+                               fclose(fi);
+                               retval = 1;
+                               continue;
+                       }
+#ifndef        OPTSIZE
+                       ibsize = statb.st_blksize;
+#endif
+               }
+               else
+                       ibsize = 0;
+               if (nflg||sflg||vflg)
+                       copyopt(fi);
+               else if (uflg) {
+                       while ((c = getc(fi)) != EOF)
+                               putchar(c);
+               } else
+                       retval |= fastcat(fileno(fi));  /* no flags specified */
+               if (fi!=stdin)
+                       fclose(fi);
+               else
+                       clearerr(fi);           /* reset sticky eof */
+               if (ferror(stdout)) {
+                       fprintf(stderr, "cat: output write error\n");
+                       retval = 1;
+                       break;
+               }
+       }
+       exit(retval);
+}
+
+copyopt(f)
+       register FILE *f;
+{
+       register int c;
+
+top:
+       c = getc(f);
+       if (c == EOF)
+               return;
+       if (c == '\n') {
+               if (inline == 0) {
+                       if (sflg && spaced)
+                               goto top;
+                       spaced = 1;
+               }
+               if (nflg && bflg==0 && inline == 0)
+                       printf("%6d\t", lno++);
+               if (eflg)
+                       putchar('$');
+               putchar('\n');
+               inline = 0;
+               goto top;
+       }
+       if (nflg && inline == 0)
+               printf("%6d\t", lno++);
+       inline = 1;
+       if (vflg) {
+               if (tflg==0 && c == '\t')
+                       putchar(c);
+               else {
+                       if (c > 0177) {
+                               printf("M-");
+                               c &= 0177;
+                       }
+                       if (c < ' ')
+                               printf("^%c", c+'@');
+                       else if (c == 0177)
+                               printf("^?");
+                       else
+                               putchar(c);
+               }
+       } else
+               putchar(c);
+       spaced = 0;
+       goto top;
+}
+
+fastcat(fd)
+register int fd;
+{
+       register int    buffsize, n, nwritten, offset;
+       register char   *buff;
+       struct stat     statbuff;
+       char            *malloc();
+
+#ifndef        OPTSIZE
+       if (obsize)
+               buffsize = obsize;      /* common case, use output blksize */
+       else if (ibsize)
+               buffsize = ibsize;
+       else
+               buffsize = BUFSIZ;
+#else
+       buffsize = OPTSIZE;
+#endif
+
+       if ((buff = malloc(buffsize)) == NULL) {
+               perror("cat: no memory");
+               return (1);
+       }
+
+       /*
+        * Note that on some systems (V7), very large writes to a pipe
+        * return less than the requested size of the write.
+        * In this case, multiple writes are required.
+        */
+       while ((n = read(fd, buff, buffsize)) > 0) {
+               offset = 0;
+               do {
+                       nwritten = write(fileno(stdout), &buff[offset], n);
+                       if (nwritten <= 0) {
+                               perror("cat: write error");
+                               exit(2);
+                       }
+                       offset += nwritten;
+               } while ((n -= nwritten) > 0);
+       }
+
+       free(buff);
+       if (n < 0) {
+               perror("cat: read error");
+               return (1);
+       }
+       return (0);
+}
diff --git a/CWRU/misc/pgrp.c b/CWRU/misc/pgrp.c
new file mode 100644 (file)
index 0000000..507da56
--- /dev/null
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <sys/types.h>
+
+int     pid;
+int     pg1;
+
+main()
+{
+       pid = getpid();
+       pg1 = getpgrp(0);
+
+       printf("pid = %d, pgrp = %d\n", pid, pg1);
+}
diff --git a/CWRU/misc/pid.c b/CWRU/misc/pid.c
new file mode 100644 (file)
index 0000000..458fde4
--- /dev/null
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+main()
+{
+       fprintf(stderr, "%d\n", getpid());
+       exit(0);
+}
diff --git a/CWRU/misc/stderr.c b/CWRU/misc/stderr.c
new file mode 100644 (file)
index 0000000..f1ec1dc
--- /dev/null
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+main()
+{
+       fprintf(stdout, "to stdout\n");
+       fprintf(stderr, "to stderr\n");
+       fprintf(stdout, "to stdout\n");
+       fprintf(stderr, "to stderr\n");
+       exit(0);
+}
+
+       
diff --git a/CWRU/misc/test-strtod.c b/CWRU/misc/test-strtod.c
new file mode 100644 (file)
index 0000000..e76f93a
--- /dev/null
@@ -0,0 +1,33 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+
+#ifndef errno
+extern int errno;
+#endif
+
+main(c, v)
+int    c;
+char   **v;
+{
+       double  dv, dv2;
+       char    *sv, *ep;
+       int     r;
+
+       sv = "4.2";
+       dv = 4.2;
+
+       errno = 0;
+       dv2 = strtod(sv, &ep);
+       if (*ep)
+               exit(1);
+       else if (errno == ERANGE)
+               exit(1);
+       if (dv != dv2)
+               exit(1);
+       exit(0);
+}
+
+       
+       
diff --git a/CWRU/new/execute_cmd.c.lastpipe-first b/CWRU/new/execute_cmd.c.lastpipe-first
new file mode 100644 (file)
index 0000000..6b7b533
--- /dev/null
@@ -0,0 +1,3176 @@
+/* execute_command.c -- Execute a COMMAND structure. */
+
+/* Copyright (C) 1987,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. */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include "posixstat.h"
+#include "filecntl.h"
+#include <signal.h>
+
+#if !defined (SIGABRT)
+#define SIGABRT SIGIOT
+#endif
+
+#include <sys/param.h>
+#include <errno.h>
+
+#include "shell.h"
+#include "y.tab.h"
+#include "flags.h"
+#include "hash.h"
+#include "jobs.h"
+
+#include "sysdefs.h"
+#include <glob/fnmatch.h>
+
+#if defined (BUFFERED_INPUT)
+#  include "input.h"
+#endif
+
+#define CMD_NO_WAIT    0x40    /* XXX move to command.h */
+#define CMD_LAST_PIPE  0x80    /* XXX ditto */
+
+#if !defined (errno)
+extern int errno;
+#endif
+
+extern int breaking, continuing, loop_level;
+extern int interactive, login_shell;
+
+#if defined (JOB_CONTROL)
+extern int job_control;
+extern int set_job_control ();
+#endif /* JOB_CONTROL */
+
+extern int getdtablesize ();
+extern int close ();
+extern char *strerror ();
+extern char *string_list ();
+
+#if defined (USG)
+extern pid_t last_made_pid;
+#endif
+
+struct stat SB;
+
+extern WORD_LIST *expand_words (), *expand_word ();
+extern WORD_LIST *expand_word_leave_quoted ();
+extern char *make_command_string ();
+
+extern Function *find_shell_builtin (), *builtin_address ();
+extern SigHandler *set_sigint_handler ();
+
+#if defined (PROCESS_SUBSTITUTION)
+void close_all_files ();
+#endif /* PROCESS_SUBSTITUTION */
+
+/* Static functions defined and used in this file. */
+static void close_pipes (), do_piping (), execute_disk_command ();
+static void execute_subshell_builtin_or_function ();
+static void cleanup_redirects (), cleanup_func_redirects (), bind_lastarg ();
+static void add_undo_close_redirect ();
+static int do_redirection_internal (), do_redirections ();
+static int expandable_redirection_filename (), execute_shell_script ();
+static int execute_builtin_or_function (), add_undo_redirect ();
+static char *find_user_command_internal (), *find_user_command_in_path ();
+
+/* The value returned by the last synchronous command. */
+int last_command_exit_value = 0;
+
+/* The list of redirections to preform which will undo the redirections
+   that I made in the shell. */
+REDIRECT *redirection_undo_list = (REDIRECT *)NULL;
+
+/* Have we just forked, and are we now running in a subshell environment? */
+int subshell_environment = 0;
+
+/* Use this as the function to call when adding unwind protects so we
+   don't need to know what free() returns. */
+void
+vfree (string)
+     char *string;
+{
+  free (string);
+}
+
+#define FD_BITMAP_DEFAULT_SIZE 32
+/* Functions to allocate and deallocate the structures used to pass
+   information from the shell to its children about file descriptors
+   to close. */
+struct fd_bitmap *
+new_fd_bitmap (size)
+     long size;
+{
+  struct fd_bitmap *ret;
+
+  ret = (struct fd_bitmap *)xmalloc (sizeof (struct fd_bitmap));
+
+  ret->size = size;
+
+  if (size)
+    {
+      ret->bitmap = (char *)xmalloc (size);
+      bzero (ret->bitmap, size);
+    }
+  else
+    ret->bitmap = (char *)NULL;
+  return (ret);
+}
+
+void
+dispose_fd_bitmap (fdbp)
+     struct fd_bitmap *fdbp;
+{
+  if (fdbp->bitmap)
+    free (fdbp->bitmap);
+
+  free (fdbp);
+}
+
+void
+close_fd_bitmap (fdbp)
+     struct fd_bitmap *fdbp;
+{
+  register int i;
+
+  if (fdbp)
+    {
+      for (i = 0; i < fdbp->size; i++)
+       if (fdbp->bitmap[i])
+         {
+           close (i);
+           fdbp->bitmap[i] = 0;
+         }
+    }
+}
+
+/* Execute the command passed in COMMAND.  COMMAND is exactly what
+   read_command () places into GLOBAL_COMMAND.  See "command.h" for the
+   details of the command structure.
+
+   EXECUTION_SUCCESS or EXECUTION_FAILURE are the only possible
+   return values.  Executing a command with nothing in it returns
+   EXECUTION_SUCCESS. */
+execute_command (command)
+     COMMAND *command;
+{
+  struct fd_bitmap *bitmap;
+  int result;
+
+  bitmap = new_fd_bitmap (FD_BITMAP_DEFAULT_SIZE);
+
+  /* Just do the command, but not asynchronously. */
+  result = execute_command_internal (command, 0, NO_PIPE, NO_PIPE, bitmap);
+
+  dispose_fd_bitmap (bitmap);
+
+#if defined (PROCESS_SUBSTITUTION)
+  unlink_fifo_list ();
+#endif /* PROCESS_SUBSTITUTION */
+
+  return (result);
+}
+
+/* Return 1 if TYPE is a shell control structure type. */
+int
+shell_control_structure (type)
+     enum command_type type;
+{
+  switch (type)
+    {
+    case cm_for:
+    case cm_case:
+    case cm_while:
+    case cm_until:
+    case cm_if:
+    case cm_group:
+      return (1);
+
+    default:
+      return (0);
+    }
+}
+
+/* A function to use to unwind_protect the redirection undo list
+   for loops. */
+static void
+cleanup_redirects (list)
+     REDIRECT *list;
+{
+  do_redirections (list, 1, 0, 0);
+  dispose_redirects (list);
+}
+
+/* Function to unwind_protect the redirections for functions and builtins. */
+static void
+cleanup_func_redirects (list)
+     REDIRECT *list;
+{
+  do_redirections (list, 1, 0, 0);
+}
+
+#if defined (JOB_CONTROL)
+/* A function to restore the signal mask to its proper value when the shell
+   is interrupted or errors occur while creating a pipeline. */
+static int
+restore_signal_mask (set)
+     sigset_t set;
+{
+  return (sigprocmask (SIG_SETMASK, &set, (sigset_t *)NULL));
+}
+#endif /* JOB_CONTROL */
+
+/* A debugging function that can be called from gdb, for instance. */
+open_files ()
+{
+  register int i;
+  int f, fd_table_size;
+
+  fd_table_size = getdtablesize ();
+
+  fprintf (stderr, "pid %d open files:", getpid ());
+  for (i = 3; i < fd_table_size; i++)
+    {
+      if ((f = fcntl (i, F_GETFD, 0)) != -1)
+       fprintf (stderr, " %d (%s)", i, f ? "close" : "open");
+    }
+  fprintf (stderr, "\n");
+}
+
+execute_command_internal (command, asynchronous, pipe_in, pipe_out, 
+                         fds_to_close)
+     COMMAND *command;
+     int asynchronous;
+     int pipe_in, pipe_out;
+     struct fd_bitmap *fds_to_close;
+{
+  int exec_result = EXECUTION_SUCCESS;
+  int invert, ignore_return;
+  REDIRECT *my_undo_list;
+
+  if (!command || breaking || continuing)
+    return (EXECUTION_SUCCESS);
+
+  run_pending_traps ();
+
+  invert = (command->flags & CMD_INVERT_RETURN) != 0;
+
+  /* If a command was being explicitly run in a subshell, or if it is
+     a shell control-structure, and it has a pipe, then we do the command
+     in a subshell. */
+
+  if ((command->flags & CMD_WANT_SUBSHELL) ||
+      (command->flags & CMD_FORCE_SUBSHELL)  ||
+      (shell_control_structure (command->type) &&
+       (pipe_out != NO_PIPE || pipe_in != NO_PIPE || asynchronous)))
+    {
+      pid_t paren_pid;
+
+      /* Fork a subshell, turn off the subshell bit, turn off job
+        control and call execute_command () on the command again. */
+      paren_pid = make_child (savestring (make_command_string (command)),
+                             asynchronous);
+      if (paren_pid == 0)
+       {
+         int user_subshell, return_code;
+
+#if defined (JOB_CONTROL)
+         set_sigchld_handler ();
+#endif /* JOB_CONTROL */
+
+         set_sigint_handler ();
+
+         user_subshell = (command->flags & CMD_WANT_SUBSHELL) != 0;
+         command->flags &= ~(CMD_FORCE_SUBSHELL | CMD_WANT_SUBSHELL);
+
+         /* If a command is asynchronous in a subshell (like ( foo ) & or
+            the special case of an asynchronous GROUP command where the
+            the subshell bit is turned on down in case cm_group: below), 
+            turn off `asynchronous', so that two subshells aren't spawned.
+
+            This seems semantically correct to me.  For example, 
+            ( foo ) & seems to say ``do the command `foo' in a subshell
+            environment, but don't wait for that subshell to finish'',
+            and "{ foo ; bar } &" seems to me to be like functions or
+            builtins in the background, which executed in a subshell
+            environment.  I just don't see the need to fork two subshells. */
+
+         /* Don't fork again, we are already in a subshell. */
+         asynchronous = 0;
+
+         /* Subshells are neither login nor interactive. */
+         login_shell = interactive = 0;
+
+         subshell_environment = 1;
+
+#if defined (JOB_CONTROL)
+         /* Delete all traces that there were any jobs running.  This is
+            only for subshells. */
+         without_job_control ();
+#endif /* JOB_CONTROL */
+         do_piping (pipe_in, pipe_out);
+
+         if (fds_to_close)
+           close_fd_bitmap (fds_to_close);
+
+         /* Do redirections, then dispose of them before recursive call. */
+         if (command->redirects)
+           {
+             if (do_redirections (command->redirects, 1, 0, 0) != 0)
+               exit (EXECUTION_FAILURE);
+
+             dispose_redirects (command->redirects);
+             command->redirects = (REDIRECT *)NULL;
+           }
+
+         return_code = execute_command_internal
+           (command, asynchronous, NO_PIPE, NO_PIPE, fds_to_close);
+
+         /* If we were explicitly placed in a subshell with (), we need
+            to do the `shell cleanup' things, such as running traps[0]. */
+         if (user_subshell)
+           run_exit_trap ();
+
+         exit (return_code);
+       }
+      else
+       {
+         close_pipes (pipe_in, pipe_out);
+
+         /* If we are part of a pipeline, and not the end of the pipeline,
+            then we should simply return and let the last command in the
+            pipe be waited for.  If we are not in a pipeline, or are the
+            last command in the pipeline, then we wait for the subshell 
+            and return its exit status as usual. */
+         if (pipe_out != NO_PIPE)
+           return (EXECUTION_SUCCESS);
+
+         if (command->flags & CMD_NO_WAIT)
+           return (EXECUTION_SUCCESS);
+
+         stop_pipeline (asynchronous, (COMMAND *)NULL);
+
+         if (!asynchronous)
+           {
+             last_command_exit_value = wait_for (paren_pid);
+
+             /* If we have to, invert the return value. */
+             if (invert)
+               {
+                 if (last_command_exit_value == EXECUTION_SUCCESS)
+                   return (EXECUTION_FAILURE);
+                 else
+                   return (EXECUTION_SUCCESS);
+               }
+             else
+               return (last_command_exit_value);
+           }
+         else
+           {
+             if (interactive)
+               describe_pid (paren_pid);
+
+             run_pending_traps ();
+
+             return (EXECUTION_SUCCESS);
+           }
+       }
+    }
+
+  /* Handle WHILE FOR CASE etc. with redirections.  (Also '&' input
+     redirection.)  */
+  if (do_redirections (command->redirects, 1, 1, 0) != 0)
+    return (EXECUTION_FAILURE);
+
+  my_undo_list = (REDIRECT *)copy_redirects (redirection_undo_list);
+
+  begin_unwind_frame ("loop_redirections");
+
+  if (my_undo_list)
+    add_unwind_protect ((Function *)cleanup_redirects, my_undo_list);
+
+  ignore_return = (command->flags & CMD_IGNORE_RETURN) != 0;
+
+  switch (command->type)
+    {
+    case cm_for:
+      if (ignore_return)
+       command->value.For->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_for_command (command->value.For);
+      break;
+
+    case cm_case:
+      if (ignore_return)
+       command->value.Case->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_case_command (command->value.Case);
+      break;
+
+    case cm_while:
+      if (ignore_return)
+       command->value.While->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_while_command (command->value.While);
+      break;
+
+    case cm_until:
+      if (ignore_return)
+       command->value.While->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_until_command (command->value.While);
+      break;
+
+    case cm_if:
+      if (ignore_return)
+       command->value.If->flags |= CMD_IGNORE_RETURN;
+      exec_result = execute_if_command (command->value.If);
+      break;
+
+    case cm_group:
+
+      /* This code can be executed from either of two paths: an explicit
+        '{}' command, or via a function call.  If we are executed via a
+        function call, we have already taken care of the function being
+        executed in the background (down there in execute_simple_command ()),
+        and this command should *not* be marked as asynchronous.  If we
+        are executing a regular '{}' group command, and asynchronous == 1,
+        we must want to execute the whole command in the background, so we
+        need a subshell, and we want the stuff executed in that subshell
+        (this group command) to be executed in the foreground of that
+        subshell (i.e. there will not be *another* subshell forked).
+
+        What we do is to force a subshell if asynchronous, and then call
+        execute_command_internal again with asynchronous still set to 1,
+        but with the original group command, so the printed command will
+        look right.
+
+        The code above that handles forking off subshells will note that
+        both subshell and async are on, and turn off async in the child
+        after forking the subshell (but leave async set in the parent, so
+        the normal call to describe_pid is made).  This turning off
+        async is *crucial*; if it is not done, this will fall into an
+        infinite loop of executions through this spot in subshell after
+        subshell until the process limit is exhausted. */
+
+      if (asynchronous)
+       {
+         command->flags |= CMD_FORCE_SUBSHELL;
+         exec_result =
+           execute_command_internal (command, 1, pipe_in, pipe_out,
+                                     fds_to_close);
+       }
+      else
+       {
+         if (ignore_return && command->value.Group->command)
+           command->value.Group->command->flags |= CMD_IGNORE_RETURN;
+         exec_result =
+           execute_command_internal (command->value.Group->command,
+                                     asynchronous, pipe_in, pipe_out,
+                                     fds_to_close);
+       }
+      break;
+
+    case cm_simple:
+      {
+       pid_t last_pid = last_made_pid;
+
+#if defined (JOB_CONTROL)
+       extern int already_making_children;
+#endif /* JOB_CONTROL */
+       if (ignore_return && command->value.Simple)
+         command->value.Simple->flags |= CMD_IGNORE_RETURN;
+       exec_result =
+         execute_simple_command (command->value.Simple, pipe_in, pipe_out,
+                                 asynchronous, fds_to_close);
+
+       /* The temporary environment should be used for only the simple
+          command immediately following its definition. */
+       dispose_used_env_vars ();
+
+#if (defined (Ultrix) && defined (mips)) || !defined (HAVE_ALLOCA)
+       /* Reclaim memory allocated with alloca () on machines which
+          may be using the alloca emulation code. */
+       (void) alloca (0);
+#endif /* (Ultrix && mips) || !HAVE_ALLOCA */
+
+       if (command->flags & CMD_NO_WAIT)
+         break;
+
+       /* If we forked to do the command, then we must wait_for ()
+          the child. */
+#if defined (JOB_CONTROL)
+       if (already_making_children && pipe_out == NO_PIPE)
+#else
+       if (pipe_out == NO_PIPE)
+#endif /* JOB_CONTROL */
+         {
+           if (last_pid != last_made_pid)
+             {
+               stop_pipeline (asynchronous, (COMMAND *)NULL);
+
+               if (asynchronous)
+                 {
+                   if (interactive)
+                     describe_pid (last_made_pid);
+                 }
+               else
+#if !defined (JOB_CONTROL)
+                 /* Do not wait for asynchronous processes started from
+                    startup files. */
+                 if (last_made_pid != last_asynchronous_pid)
+#endif
+                   /* When executing a shell function that executes other
+                      commands, this causes the last simple command in
+                      the function to be waited for twice. */
+                   exec_result = wait_for (last_made_pid);
+             }
+         }
+      }
+      if (!ignore_return && exit_immediately_on_error && !invert &&
+         (exec_result != EXECUTION_SUCCESS))
+       {
+         last_command_exit_value = exec_result;
+         run_pending_traps ();
+         longjmp (top_level, EXITPROG);
+       }
+
+      break;
+
+    case cm_connection:
+      switch (command->value.Connection->connector)
+       {
+         /* Do the first command asynchronously. */
+       case '&':
+         {
+           COMMAND *tc = command->value.Connection->first;
+           REDIRECT *rp = tc->redirects;
+
+           if (ignore_return && tc)
+             tc->flags |= CMD_IGNORE_RETURN;
+
+           /* If this shell was compiled without job control, or if job
+              control is not active (e.g., if the shell is not interactive),
+              the standard input for an asynchronous command is /dev/null. */
+#if defined (JOB_CONTROL)
+           if (!interactive || !job_control)
+#endif /* JOB_CONTROL */
+           {
+             REDIRECT *tr = 
+               make_redirection (0, r_inputa_direction,
+                                 make_word ("/dev/null"));
+             tr->next = tc->redirects;
+             tc->redirects = tr;
+           }
+
+           exec_result = execute_command_internal (tc, 1, pipe_in, pipe_out,
+                                                   fds_to_close);
+
+#if defined (JOB_CONTROL)
+           if (!interactive || !job_control)
+#endif /* JOB_CONTROL */
+           {
+             /* Remove the redirection we added above.  It matters,
+                especially for loops, which call execute_command ()
+                multiple times with the same command. */
+             REDIRECT *tr, *tl;
+
+             tr = tc->redirects;
+             do
+               {
+                 tl = tc->redirects;
+                 tc->redirects = tc->redirects->next;
+               }
+             while (tc->redirects && tc->redirects != rp);
+
+             tl->next = (REDIRECT *)NULL;
+             dispose_redirects (tr);
+           }
+
+           {
+             register COMMAND *second;
+
+             second = command->value.Connection->second;
+
+             if (second)
+               {
+                 if (ignore_return)
+                   second->flags |= CMD_IGNORE_RETURN;
+
+                 exec_result = execute_command_internal
+                   (second, asynchronous, pipe_in, pipe_out, fds_to_close);
+               }
+           }
+         }
+         break;
+
+       case ';':
+         /* Just call execute command on both of them. */
+         if (ignore_return)
+           {
+             if (command->value.Connection->first)
+               command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+             QUIT;
+             if (command->value.Connection->second)
+               command->value.Connection->second->flags |= CMD_IGNORE_RETURN;
+           }
+         execute_command (command->value.Connection->first);
+         QUIT;
+         exec_result =
+           execute_command_internal (command->value.Connection->second,
+                                     asynchronous, pipe_in, pipe_out,
+                                     fds_to_close);
+         break;
+
+       case '|':
+         {
+           int prev, fildes[2], new_bitmap_size, dummyfd;
+           COMMAND *cmd;
+           int outpipe;
+           struct fd_bitmap *fd_bitmap;
+
+#if defined (JOB_CONTROL)
+           COMMAND *lastcmd;
+           int lastpipe[2];
+           pid_t lastpipe_pid;
+
+           sigset_t set, oset;
+           BLOCK_CHILD (set, oset);
+#endif /* JOB_CONTROL */
+
+#if defined (JOB_CONTROL)
+           /* Fork the last command in the pipeline first, then the rest of
+              the commands, to avoid synchronization problems. */
+           /* Find the last pipeline element */
+           lastcmd = command;
+           while (lastcmd && lastcmd->type == cm_connection &&
+                  lastcmd->value.Connection &&
+                  lastcmd->value.Connection->connector == '|')
+             lastcmd = lastcmd->value.Connection->second;
+
+           if (pipe (lastpipe) < 0)
+             {
+               report_error ("pipe error: %s", strerror (errno));
+               terminate_current_pipeline ();
+               kill_current_pipeline ();
+               last_command_exit_value = EXECUTION_FAILURE;
+               throw_to_top_level ();
+             }
+
+           /* Now execute the rightmost command in the pipeline, but do
+              not wait for it. */
+           if (ignore_return && lastcmd)
+             lastcmd->flags |= CMD_IGNORE_RETURN;
+           lastcmd->flags |= (CMD_NO_WAIT | CMD_LAST_PIPE);
+           fds_to_close->bitmap[lastpipe[1]] = 1;
+           (void) execute_command_internal
+             (lastcmd, asynchronous, lastpipe[0], pipe_out, fds_to_close);
+           lastpipe_pid = last_made_pid;
+#endif /* JOB_CONTROL */
+
+           prev = pipe_in;
+           cmd = command;
+
+           while (cmd &&
+                  cmd->type == cm_connection &&
+                  cmd->value.Connection &&
+                  cmd->value.Connection->connector == '|')
+             {
+               /* Make a pipeline between the two commands. */
+               if (pipe (fildes) < 0)
+                 {
+                   report_error ("pipe error: %s", strerror (errno));
+#if defined (JOB_CONTROL)
+                   terminate_current_pipeline ();
+                   kill_current_pipeline ();
+#endif /* JOB_CONTROL */
+                   last_command_exit_value = EXECUTION_FAILURE;
+                   /* The unwind-protects installed below will take care
+                      of closing all of the open file descriptors. */
+                   throw_to_top_level ();
+                 }
+               else
+                 {
+                   /* Here is a problem: with the new file close-on-exec
+                      code, the read end of the pipe (fildes[0]) stays open
+                      in the first process, so that process will never get a
+                      SIGPIPE.  There is no way to signal the first process
+                      that it should close fildes[0] after forking, so it
+                      remains open.  No SIGPIPE is ever sent because there
+                      is still a file descriptor open for reading connected
+                      to the pipe.  We take care of that here.  This passes
+                      around a bitmap of file descriptors that must be
+                      closed after making a child process in
+                      execute_simple_command. */
+
+                   /* We need fd_bitmap to be at least as big as fildes[0].
+                      If fildes[0] is less than fds_to_close->size, then
+                      use fds_to_close->size. */
+
+                   if (fildes[0] < fds_to_close->size)
+                     new_bitmap_size = fds_to_close->size;
+                   else
+                     new_bitmap_size = fildes[0] + 8;
+
+                   fd_bitmap = new_fd_bitmap (new_bitmap_size);
+
+                   /* Now copy the old information into the new bitmap. */
+                   bcopy (fds_to_close->bitmap, fd_bitmap->bitmap,
+                          fds_to_close->size);
+
+                   /* And mark the pipe file descriptors to be closed. */
+                   fd_bitmap->bitmap[fildes[0]] = 1;
+
+                   /* In case there are pipe or out-of-processes errors, we
+                      want all these file descriptors to be closed when
+                      unwind-protects are run, and the storage used for the
+                      bitmaps freed up. */
+                   begin_unwind_frame ("pipe-file-descriptors");
+                   add_unwind_protect (dispose_fd_bitmap, fd_bitmap);
+                   add_unwind_protect (close_fd_bitmap, fd_bitmap);
+                   if (prev >= 0)
+                     add_unwind_protect (close, prev);
+                   dummyfd = fildes[1];
+                   add_unwind_protect (close, dummyfd);
+
+#if defined (JOB_CONTROL)
+                   add_unwind_protect (restore_signal_mask, oset);
+#endif /* JOB_CONTROL */
+
+                   if (ignore_return && cmd->value.Connection->first)
+                     cmd->value.Connection->first->flags |=
+                       CMD_IGNORE_RETURN;
+
+#if defined (JOB_CONTROL)
+                   if (cmd->value.Connection->second == lastcmd)
+                     {
+                       outpipe = lastpipe[1];
+                       close (fildes[1]);
+                     }
+                   else
+#endif /* JOB_CONTROL */
+                     outpipe = fildes[1];
+
+                   execute_command_internal
+                     (cmd->value.Connection->first, asynchronous, prev,
+                      outpipe, fd_bitmap);
+
+                   if (prev >= 0)
+                     close (prev);
+                   
+                   prev = fildes[0];
+                   close (outpipe);
+
+                   dispose_fd_bitmap (fd_bitmap);
+                   discard_unwind_frame ("pipe-file-descriptors");
+                 }
+               cmd = cmd->value.Connection->second;
+#if defined (JOB_CONTROL)
+               if (cmd == lastcmd)
+                 break;
+#endif
+             }
+
+#if !defined (JOB_CONTROL)
+           /* Now execute the rightmost command in the pipeline.  */
+           if (ignore_return && cmd)
+             cmd->flags |= CMD_IGNORE_RETURN;
+           exec_result =
+             execute_command_internal
+               (cmd, asynchronous, prev, pipe_out, fds_to_close);
+#endif /* !JOB_CONTROL */
+
+           if (prev >= 0)
+             close (prev);
+
+#if defined (JOB_CONTROL)
+           UNBLOCK_CHILD (oset);
+#endif
+
+#if defined (JOB_CONTROL)
+           /* Because we created the processes out of order, we have to
+              reorder the pipeline slightly. */
+           rotate_the_pipeline ();
+           stop_pipeline (asynchronous, (COMMAND *)NULL);
+           if (asynchronous && interactive)
+             describe_pid (lastpipe_pid);
+           exec_result = wait_for (lastpipe_pid);
+           if (!ignore_return && exit_immediately_on_error && !invert &&
+               (exec_result != EXECUTION_SUCCESS))
+             {
+               last_command_exit_value = exec_result;
+               run_pending_traps ();
+               longjmp (top_level, EXITPROG);
+             }
+#endif /* JOB_CONTROL */
+         }
+         break;
+
+       case AND_AND:
+         if (asynchronous)
+           {
+             /* If we have something like `a && b &', run the && stuff in a
+                subshell.  Force a subshell and just call
+                execute_command_internal again.  Leave asynchronous on
+                so that we get a report from the parent shell about the
+                background job. */
+             command->flags |= CMD_FORCE_SUBSHELL;
+             exec_result = execute_command_internal (command, 1, pipe_in,
+                             pipe_out, fds_to_close);
+             break;
+           }
+
+         /* Execute the first command.  If the result of that is successful,
+            then execute the second command, otherwise return. */
+
+         if (command->value.Connection->first)
+           command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+
+         exec_result = execute_command (command->value.Connection->first);
+         QUIT;
+         if (exec_result == EXECUTION_SUCCESS)
+           {
+             if (ignore_return && command->value.Connection->second)
+               command->value.Connection->second->flags |=
+                 CMD_IGNORE_RETURN;
+
+             exec_result =
+               execute_command (command->value.Connection->second);
+           }
+         break;
+
+       case OR_OR:
+         if (asynchronous)
+           {
+             /* If we have something like `a || b &', run the || stuff in a
+                subshell.  Force a subshell and just call
+                execute_command_internal again.  Leave asynchronous on
+                so that we get a report from the parent shell about the
+                background job. */
+             command->flags |= CMD_FORCE_SUBSHELL;
+             exec_result = execute_command_internal (command, 1, pipe_in,
+                             pipe_out, fds_to_close);
+             break;
+           }
+
+         /* Execute the first command.  If the result of that is successful,
+            then return, otherwise execute the second command. */
+
+         if (command->value.Connection->first)
+           command->value.Connection->first->flags |= CMD_IGNORE_RETURN;
+
+         exec_result = execute_command (command->value.Connection->first);
+         QUIT;
+         if (exec_result != EXECUTION_SUCCESS)
+           {
+             if (ignore_return && command->value.Connection->second)
+               command->value.Connection->second->flags |=
+                 CMD_IGNORE_RETURN;
+
+             exec_result =
+               execute_command (command->value.Connection->second);
+           }
+
+         break;
+
+       default:
+         programming_error ("Bad connector `%d'!",
+                            command->value.Connection->connector);
+         longjmp (top_level, DISCARD);
+         break;
+       }
+      break;
+
+    case cm_function_def:
+      exec_result = intern_function (command->value.Function_def->name,
+                                    command->value.Function_def->command);
+      break;
+
+    default:
+      programming_error
+       ("execute_command: Bad command type `%d'!", command->type);
+    }
+
+  if (my_undo_list)
+    {
+      do_redirections (my_undo_list, 1, 0, 0);
+      dispose_redirects (my_undo_list);
+    }
+
+  discard_unwind_frame ("loop_redirections");
+
+  /* Invert the return value if we have to */
+  if (invert)
+    {
+      if (exec_result == EXECUTION_SUCCESS)
+       exec_result = EXECUTION_FAILURE;
+      else
+       exec_result = EXECUTION_SUCCESS;
+    }
+
+  last_command_exit_value = exec_result;
+  run_pending_traps ();
+  return (last_command_exit_value);
+}
+
+/* Execute a FOR command.  The syntax is: FOR word_desc IN word_list;
+   DO command; DONE */
+execute_for_command (for_command)
+     FOR_COM *for_command;
+{
+  /* I just noticed that the Bourne shell leaves word_desc bound to the
+     last name in word_list after the FOR statement is done.  This seems
+     wrong to me; I thought that the variable binding should be lexically
+     scoped, i.e., only would last the duration of the FOR command.  This
+     behaviour can be gotten by turning on the lexical_scoping switch. */
+
+  register WORD_LIST *releaser, *list;
+  WORD_DESC *temp = for_command->name;
+  char *identifier;
+  SHELL_VAR *old_value = (SHELL_VAR *)NULL; /* Remember the old value of x. */
+  int retval = EXECUTION_SUCCESS;
+  extern int dispose_words ();
+  extern int dispose_variable ();
+
+  if (!check_identifier (temp))
+    return (EXECUTION_FAILURE);
+
+  loop_level++;
+  identifier = temp->word;
+
+  list = releaser = expand_words (for_command->map_list, 0);
+
+  begin_unwind_frame ("for");
+  add_unwind_protect (dispose_words, releaser);
+
+  if (lexical_scoping)
+    {
+      old_value = copy_variable (find_variable (identifier));
+      if (old_value)
+       add_unwind_protect (dispose_variable, old_value);
+    }
+
+  while (list)
+    {
+      QUIT;
+      bind_variable (identifier, list->word->word);
+      if (for_command->flags & CMD_IGNORE_RETURN)
+       for_command->action->flags |= CMD_IGNORE_RETURN;
+      execute_command (for_command->action);
+      retval = last_command_exit_value;
+      QUIT;
+
+      if (breaking)
+       {
+         breaking--; 
+         break;
+       }
+
+      if (continuing)
+       {
+         continuing--;
+         if (continuing)
+           break;
+       }
+
+      list = list->next;
+    }
+
+  loop_level--;
+
+  if (lexical_scoping)
+    {
+      if (!old_value)
+       makunbound (identifier, shell_variables);
+      else
+       {
+         SHELL_VAR *new_value;
+
+         new_value = bind_variable (identifier, value_cell(old_value));
+         new_value->attributes = old_value->attributes;
+       }
+    }
+
+  run_unwind_frame ("for");
+  return (retval);
+}
+
+/* Execute a CASE command.  The syntax is: CASE word_desc IN pattern_list ESAC.
+   The pattern_list is a linked list of pattern clauses; each clause contains
+   some patterns to compare word_desc against, and an associated command to
+   execute. */
+execute_case_command (case_command)
+     CASE_COM *case_command;
+{
+  extern int dispose_words ();
+  extern char *tilde_expand ();
+  register WORD_LIST *list;
+  WORD_LIST *wlist;
+  PATTERN_LIST *clauses;
+  char *word;
+  int retval;
+
+  /* Posix.2 Draft 11.2 says that the word is tilde expanded. */
+  if (member ('~', case_command->word->word))
+    {
+      word = tilde_expand (case_command->word->word);
+      free (case_command->word->word);
+      case_command->word->word = word;
+    }
+  wlist = expand_word (case_command->word, 0);
+  clauses = case_command->clauses;
+  word = (wlist) ? string_list (wlist) : savestring ("");
+  retval = EXECUTION_SUCCESS;
+
+  begin_unwind_frame ("case");
+  add_unwind_protect (dispose_words, wlist);
+  add_unwind_protect ((Function *)vfree, word);
+
+  while (clauses)
+    {
+      QUIT;
+      list = clauses->patterns;
+      while (list)
+       {
+         extern char *quote_string_for_globbing ();
+         char *t, *pattern;
+         WORD_LIST *es;
+         int match, freepat;
+
+         /* Posix.2 draft 11.3 says to do tilde expansion on each member
+            of the pattern list. */
+         if (member ('~', list->word->word))
+           {
+             t = tilde_expand (list->word->word);
+             free (list->word->word);
+             list->word->word = t;
+           }
+
+         es = expand_word_leave_quoted (list->word, 0);
+         if (es && es->word && es->word->word && *(es->word->word))
+           {
+             pattern = quote_string_for_globbing (es->word->word, 1);
+             freepat = 1;
+           }
+         else
+           {
+             pattern = "";
+             freepat = 0;
+           }
+
+         /* Since the pattern does not undergo quote removal according to
+            Posix.2 section 3.9.4.3, the fnmatch() call must be able to
+            recognize backslashes as escape characters. */
+         match = fnmatch (pattern, word, 0) != FNM_NOMATCH;
+         if (freepat)
+           free (pattern);
+         dispose_words (es);
+
+         if (match)
+           {
+             if (clauses->action && 
+                 (case_command->flags & CMD_IGNORE_RETURN))
+               clauses->action->flags |= CMD_IGNORE_RETURN;
+             execute_command (clauses->action);
+             retval = last_command_exit_value;
+             goto exit_command;
+           }
+
+         list = list->next;
+         QUIT;
+       }
+      clauses = clauses->next;
+    }
+ exit_command:
+  run_unwind_frame ("case");
+  return (retval);
+}
+
+#define CMD_WHILE 0
+#define CMD_UNTIL 1
+
+/* The WHILE command.  Syntax: WHILE test DO action; DONE.
+   Repeatedly execute action while executing test produces
+   EXECUTION_SUCCESS. */
+execute_while_command (while_command)
+     WHILE_COM *while_command;
+{
+  return (execute_while_or_until (while_command, CMD_WHILE));
+}
+
+/* UNTIL is just like WHILE except that the test result is negated. */
+execute_until_command (while_command)
+     WHILE_COM *while_command;
+{
+  return (execute_while_or_until (while_command, CMD_UNTIL));
+}
+
+/* The body for both while and until.  The only difference between the
+   two is that the test value is treated differently.  TYPE is
+   CMD_WHILE or CMD_UNTIL.  The return value for both commands should
+   be EXECUTION_SUCCESS if no commands in the body are executed, and
+   the status of the last command executed in the body otherwise. */
+execute_while_or_until (while_command, type)
+     WHILE_COM *while_command;
+     int type;
+{
+  extern int breaking;
+  extern int continuing;
+  int commands_executed = 0;
+  int return_value, body_status = EXECUTION_SUCCESS;
+
+  loop_level++;
+  while_command->test->flags |= CMD_IGNORE_RETURN;
+
+  while (1)
+    {
+      return_value = execute_command (while_command->test);
+
+      if (type == CMD_WHILE && return_value != EXECUTION_SUCCESS)
+       break;
+      if (type == CMD_UNTIL && return_value == EXECUTION_SUCCESS)
+       break;
+
+      QUIT;
+      commands_executed = 1;
+
+      if (while_command->flags & CMD_IGNORE_RETURN)
+       while_command->action->flags |= CMD_IGNORE_RETURN;
+      body_status = execute_command (while_command->action);
+
+      QUIT;
+
+      if (breaking)
+       {
+         breaking--;
+         break;
+       }
+
+      if (continuing)
+       {
+         continuing--;
+         if (continuing)
+           break;
+       }
+    }
+  loop_level--;
+
+  return (body_status);
+}
+
+/* IF test THEN command [ELSE command].
+   IF also allows ELIF in the place of ELSE IF, but
+   the parser makes *that* stupidity transparent. */
+execute_if_command (if_command)
+     IF_COM *if_command;
+{
+  int return_value;
+
+  if_command->test->flags |= CMD_IGNORE_RETURN;
+  return_value = execute_command (if_command->test);
+
+  if (return_value == EXECUTION_SUCCESS)
+    {
+      QUIT;
+      if (if_command->true_case && (if_command->flags & CMD_IGNORE_RETURN))
+         if_command->true_case->flags |= CMD_IGNORE_RETURN;
+      return (execute_command (if_command->true_case));
+    }
+  else
+    {
+      QUIT;
+
+      if (if_command->false_case &&
+         (if_command->flags & CMD_IGNORE_RETURN))
+       {
+         if_command->false_case->flags |= CMD_IGNORE_RETURN;
+       }
+
+      return (execute_command (if_command->false_case));
+    }
+}
+
+/* The name of the command that is currently being executed.
+   `test' needs this, for example. */
+char *this_command_name;
+
+static void
+bind_lastarg (arg)
+     char *arg;
+{
+  SHELL_VAR *var;
+
+  if (!arg)
+    arg = "";
+  var = bind_variable ("_", arg);
+  var->attributes &= ~att_exported;
+}
+
+/* For catching RETURN in a function. */
+int return_catch_flag = 0;
+int return_catch_value;
+jmp_buf return_catch;
+
+/* The meaty part of all the executions.  We have to start hacking the
+   real execution of commands here.  Fork a process, set things up,
+   execute the command. */
+execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
+     SIMPLE_COM *simple_command;
+     int pipe_in, pipe_out;
+     struct fd_bitmap *fds_to_close;
+{
+  extern int command_string_index, variable_context, line_number;
+  extern char *the_printed_command;
+  extern pid_t last_command_subst_pid;
+  WORD_LIST *expand_words (), *copy_word_list ();
+  WORD_LIST *words, *lastword;
+  char *command_line, *lastarg;
+  int first_word_quoted, result;
+  pid_t old_last_command_subst_pid;
+
+  result = EXECUTION_SUCCESS;
+
+  /* If we're in a function, update the pseudo-line-number information. */
+  if (variable_context)
+    line_number++;
+
+  /* Remember what this command line looks like at invocation. */
+  command_string_index = 0;
+  print_simple_command (simple_command);
+  command_line = (char *)alloca (1 + strlen (the_printed_command));
+  strcpy (command_line, the_printed_command);
+
+  first_word_quoted =
+    simple_command->words ? simple_command->words->word->quoted : 0;
+
+  old_last_command_subst_pid = last_command_subst_pid;
+
+  /* If we are re-running this as the result of executing the `command'
+     builtin, do not expand the command words a second time. */
+  if ((simple_command->flags & CMD_INHIBIT_EXPANSION) == 0)
+    words = expand_words (simple_command->words);
+  else
+    words = copy_word_list (simple_command->words);
+
+  lastarg = (char *)NULL;
+  begin_unwind_frame ("simple-command");
+
+  /* It is possible for WORDS not to have anything left in it.
+     Perhaps all the words consisted of `$foo', and there was
+     no variable `$foo'. */
+  if (words)
+    {
+      extern int dispose_words ();
+      extern Function *last_shell_builtin, *this_shell_builtin;
+      Function *builtin;
+      SHELL_VAR *func;
+
+      if (echo_command_at_execute)
+       {
+         extern char *indirection_level_string ();
+         char *line = string_list (words);
+
+         if (line && *line)
+           fprintf (stderr, "%s%s\n", indirection_level_string (), line);
+
+         if (line)
+           free (line);
+       }
+
+      if (simple_command->flags & CMD_NO_FUNCTIONS)
+       func = (SHELL_VAR *)NULL;
+      else
+       func = find_function (words->word->word);
+
+      add_unwind_protect (dispose_words, words);
+
+      QUIT;
+
+      /* Bind the last word in this command to "$_" after execution. */
+      for (lastword = words; lastword->next; lastword = lastword->next);
+      lastarg = lastword->word->word;
+
+#if defined (JOB_CONTROL)
+      /* Is this command a job control related thing? */
+      if (words->word->word[0] == '%')
+       {
+         int result;
+
+         if (async)
+           this_command_name = "bg";
+         else
+           this_command_name = "fg";
+
+         last_shell_builtin = this_shell_builtin;
+         this_shell_builtin = builtin_address (this_command_name);
+         result = (*this_shell_builtin) (words);
+         goto return_result;
+       }
+
+      /* One other possiblilty.  The user may want to resume an existing job.
+        If they do, find out whether this word is a candidate for a running
+        job. */
+      {
+       char *auto_resume_value;
+
+       if ((auto_resume_value = get_string_value ("auto_resume")) &&
+           !first_word_quoted &&
+           !words->next &&
+           words->word->word[0] &&
+           !simple_command->redirects &&
+           pipe_in == NO_PIPE &&
+           pipe_out == NO_PIPE &&
+           !async)
+         {
+           char *word = words->word->word;
+           register int i, wl = strlen (word), exact;
+
+           exact = strcmp (auto_resume_value, "exact") == 0;
+           for (i = job_slots - 1; i > -1; i--)
+             {
+               if (jobs[i])
+                 {
+                   register PROCESS *p = jobs[i]->pipe;
+                   do
+                     {
+                       if ((JOBSTATE (i) == JSTOPPED) &&
+                           (strncmp (p->command, word,
+                                     exact ? strlen (p->command) : wl) == 0))
+                         {
+                           int started_status;
+
+                           run_unwind_frame ("simple-command");
+                           last_shell_builtin = this_shell_builtin;
+                           this_shell_builtin = builtin_address ("fg");
+
+                           started_status = start_job (i, 1);
+
+                           if (started_status < 0)
+                             return (EXECUTION_FAILURE);
+                           else
+                             return (started_status);
+                         }
+                       p = p->next;
+                     }
+                   while (p != jobs[i]->pipe);
+                 }
+             }
+         }
+      }
+#endif /* JOB_CONTROL */
+
+      /* Remember the name of this command globally. */
+      this_command_name = words->word->word;
+
+      QUIT;
+
+      /* Not a running job.  Do normal command processing. */
+      maybe_make_export_env ();
+
+      /* This command could be a shell builtin or a user-defined function.
+        If so, and we have pipes, then fork a subshell in here.  Else, just
+        do the command. */
+
+      if (func)
+       builtin = (Function *)NULL;
+      else
+       builtin = find_shell_builtin (this_command_name);
+
+      last_shell_builtin = this_shell_builtin;
+      this_shell_builtin = builtin;
+
+      if (builtin || func)
+       {
+         put_command_name_into_env (this_command_name);
+         if ((pipe_in != NO_PIPE) || (pipe_out != NO_PIPE) || async)
+           {
+             if (make_child (savestring (command_line), async) == 0)
+               {
+                 execute_subshell_builtin_or_function
+                   (words, simple_command->redirects, builtin, func,
+                    pipe_in, pipe_out, async, fds_to_close,
+                    simple_command->flags);
+               }
+             else
+               {
+                 close_pipes (pipe_in, pipe_out);
+                 goto return_result;
+               }
+           }
+         else
+           {
+             result = execute_builtin_or_function
+               (words, builtin, func, simple_command->redirects, fds_to_close,
+                simple_command->flags);
+
+             goto return_result;
+           }
+       }
+
+      execute_disk_command (words, simple_command->redirects, command_line,
+                           pipe_in, pipe_out, async, fds_to_close);
+
+      goto return_result;
+    }
+  else if (pipe_in != NO_PIPE || pipe_out != NO_PIPE || async)
+    {
+      /* We have a null command, but we really want a subshell to take
+        care of it.  Just fork, do piping and redirections, and exit. */
+      if (make_child (savestring (""), async) == 0)
+       {
+         do_piping (pipe_in, pipe_out);
+
+         subshell_environment = 1;
+
+         if (do_redirections (simple_command->redirects, 1, 0, 0) == 0)
+           exit (EXECUTION_SUCCESS);
+         else
+           exit (EXECUTION_FAILURE);
+       }
+      else
+       {
+         close_pipes (pipe_in, pipe_out);
+         result = EXECUTION_SUCCESS;
+         goto return_result;
+       }
+    }
+  else
+    {
+      /* Even if there aren't any command names, pretend to do the
+        redirections that are specified.  The user expects the side
+        effects to take place.  If the redirections fail, then return
+        failure.  Otherwise, if a command substitution took place while
+        expanding the command or a redirection, return the value of that
+        substitution.  Otherwise, return EXECUTION_SUCCESS. */
+
+      if (do_redirections (simple_command->redirects, 0, 0, 0) != 0)
+       result = EXECUTION_FAILURE;
+      else if (old_last_command_subst_pid != last_command_subst_pid)
+       result = last_command_exit_value;
+      else
+       result = EXECUTION_SUCCESS;
+    }
+
+ return_result:
+  bind_lastarg (lastarg);
+  run_unwind_frame ("simple-command");
+  return (result);
+}
+
+/* Execute a shell builtin or function in a subshell environment.  This
+   routine does not return; it only calls exit().  If BUILTIN is non-null,
+   it points to a function to call to execute a shell builtin; otherwise
+   VAR points at the body of a function to execute.  WORDS is the arguments
+   to the command, REDIRECTS specifies redirections to perform before the
+   command is executed. */
+static void
+execute_subshell_builtin_or_function (words, redirects, builtin, var,
+                                     pipe_in, pipe_out, async, fds_to_close,
+                                     flags)
+     WORD_LIST *words;
+     REDIRECT *redirects;
+     Function *builtin;
+     SHELL_VAR *var;
+     int pipe_in, pipe_out, async;
+     struct fd_bitmap *fds_to_close;
+     int flags;
+{
+  extern char **temporary_env, **function_env, **copy_array ();
+  extern int login_shell, interactive;
+#if defined (JOB_CONTROL)
+  extern int jobs_builtin ();
+#endif /* JOB_CONTROL */
+
+  /* A subshell is neither a login shell nor interactive. */
+  login_shell = interactive = 0;
+
+  subshell_environment = 1;
+
+#if defined (JOB_CONTROL)
+  /* Eradicate all traces of job control after we fork the subshell, so
+     all jobs begun by this subshell are in the same process group as
+     the shell itself. */
+
+  /* Allow the output of `jobs' to be piped. */
+  if (builtin == jobs_builtin && !async &&
+      (pipe_out != NO_PIPE || pipe_in != NO_PIPE))
+    kill_current_pipeline ();
+  else
+    without_job_control ();
+
+  set_sigchld_handler ();
+#endif /* JOB_CONTROL */
+
+  set_sigint_handler ();
+
+  do_piping (pipe_in, pipe_out);
+
+  if (fds_to_close)
+    close_fd_bitmap (fds_to_close);
+
+  if (do_redirections (redirects, 1, 0, 0) != 0)
+    exit (EXECUTION_FAILURE);
+
+  if (builtin)
+    {
+      extern jmp_buf top_level;
+      int result;
+
+      /* Give builtins a place to jump back to on failure,
+        so we don't go back up to main(). */
+      result = setjmp (top_level);
+
+      if (result == EXITPROG)
+       exit (last_command_exit_value);
+      else if (result)
+       exit (EXECUTION_FAILURE);
+      else
+       exit ((*builtin) (words->next));
+    }
+  else
+    {
+      extern int variable_context, line_number;
+      extern void dispose_command (), dispose_function_env ();
+      COMMAND *fc, *tc;
+      int result, return_val;
+
+      tc = (COMMAND *)function_cell (var);
+      fc = (COMMAND *)NULL;
+
+      remember_args (words->next, 1);
+      line_number = 0;
+#if defined (JOB_CONTROL)
+      stop_pipeline (async, (COMMAND *)NULL);
+#endif
+
+      begin_unwind_frame ("subshell_function_calling");
+      unwind_protect_int (variable_context);
+      unwind_protect_int (return_catch_flag);
+      unwind_protect_jmp_buf (return_catch);
+      add_unwind_protect (dispose_command, fc);
+
+      /* The temporary environment for a function is supposed to apply to
+        all commands executed in the function.  If we have a temporary
+        environment, copy it to the special `function environment' and
+        get rid of the temporary environment. */
+      if (temporary_env)
+       {
+         function_env = copy_array (temporary_env);
+         add_unwind_protect (dispose_function_env, (char *)NULL);
+         dispose_used_env_vars ();
+       }
+      else
+       function_env = (char **)NULL;
+
+      /* We can do this because function bodies are always guaranteed to
+        be group commands, according to the grammar in parse.y.  If we
+        don't do this now, execute_command_internal will graciously fork
+        another subshell for us, and we'll lose contact with the rest of
+        the pipeline and fail to get any SIGPIPE that might be sent. */
+
+      if (tc->type == cm_group)
+       fc = (COMMAND *)copy_command (tc->value.Group->command);
+      else
+       fc = (COMMAND *)copy_command (tc);
+
+      if (fc && (flags & CMD_IGNORE_RETURN))
+       fc->flags |= CMD_IGNORE_RETURN;
+
+      /* result = execute_command (fc); doesn't work.
+        We need to explicitly specify the pipes in and out so that they
+        are closed in all the processes that rely on their being closed.
+        If they are not, it is possible to not get the SIGPIPE that we
+        need to kill all the processes sharing the pipe. */
+
+      variable_context++;
+      return_catch_flag++;
+      return_val = setjmp (return_catch);
+
+      if (return_val)
+       result = return_catch_value;
+      else
+       result =
+         execute_command_internal (fc, 0, NO_PIPE, NO_PIPE, fds_to_close);
+
+      run_unwind_frame ("subshell_function_calling");
+
+      exit (result);
+    }
+}
+
+/* Execute a builtin or function in the current shell context.  If BUILTIN
+   is non-null, it is the builtin command to execute, otherwise VAR points
+   to the body of a function.  WORDS are the command's arguments, REDIRECTS
+   are the redirections to perform.  FDS_TO_CLOSE is the usual bitmap of
+   file descriptors to close.
+
+   If BUILTIN is exec_builtin, the redirections specified in REDIRECTS are
+   not undone before this function returns. */
+static int
+execute_builtin_or_function (words, builtin, var, redirects,
+                            fds_to_close, flags)
+     WORD_LIST *words;
+     Function *builtin;
+     SHELL_VAR *var;
+     REDIRECT *redirects;
+     struct fd_bitmap *fds_to_close;
+     int flags;
+{
+  extern int exec_builtin (), eval_builtin ();
+  extern char **temporary_env, **function_env, **copy_array ();
+  int result = EXECUTION_FAILURE;
+  REDIRECT *saved_undo_list;
+
+  if (do_redirections (redirects, 1, 1, 0) != 0)
+    return (EXECUTION_FAILURE);
+
+  saved_undo_list = redirection_undo_list;
+
+  /* Calling the "exec" builtin changes redirections forever. */
+  if (builtin == exec_builtin)
+    {
+      dispose_redirects (saved_undo_list);
+      saved_undo_list = (REDIRECT *)NULL;
+    }
+  else
+    {
+      begin_unwind_frame ("saved redirects");
+      add_unwind_protect (cleanup_func_redirects, (char *)saved_undo_list);
+    }
+
+  redirection_undo_list = (REDIRECT *)NULL;
+
+  if (builtin)
+    {
+      int old_e_flag = exit_immediately_on_error;
+
+      /* The eval builtin calls parse_and_execute, which does not know about
+        the setting of flags, and always calls the execution functions with
+        flags that will exit the shell on an error if -e is set.  If the
+        eval builtin is being called, and we're supposed to ignore the exit
+        value of the command, we turn the -e flag off ourselves, then
+        restore it when the command completes. */
+      if ((builtin == eval_builtin) && (flags & CMD_IGNORE_RETURN))
+       {
+         begin_unwind_frame ("eval_builtin");
+         unwind_protect_int (exit_immediately_on_error);
+         exit_immediately_on_error = 0;
+       }
+
+      result = ((*builtin) (words->next));
+
+      if ((builtin == eval_builtin) && (flags & CMD_IGNORE_RETURN))
+       {
+         exit_immediately_on_error += old_e_flag;
+         discard_unwind_frame ("eval_builtin");
+       }
+    }
+  else
+    {
+      extern void dispose_command (), dispose_function_env ();
+      extern int pop_context ();
+      extern int line_number;
+      int return_val;
+      COMMAND *tc;
+
+      tc = (COMMAND *)copy_command (function_cell (var));
+      if (tc && (flags & CMD_IGNORE_RETURN))
+       tc->flags |= CMD_IGNORE_RETURN;
+
+      begin_unwind_frame ("function_calling");
+      push_context ();
+      add_unwind_protect (pop_context, (char *)NULL);
+      add_unwind_protect (dispose_command, (char *)tc);
+      unwind_protect_int (return_catch_flag);
+      unwind_protect_int (line_number);
+      unwind_protect_jmp_buf (return_catch);
+
+      /* The temporary environment for a function is supposed to apply to
+        all commands executed in the function.  If we have a temporary
+        environment, copy it to the special `function environment' and
+        get rid of the temporary environment. */
+      if (temporary_env)
+       {
+         function_env = copy_array (temporary_env);
+         add_unwind_protect (dispose_function_env, (char *)NULL);
+         dispose_used_env_vars ();
+       }
+      else
+       function_env = (char **)NULL;
+
+      /* Note the second argument of "1", meaning that we discard
+        the current value of "$*"!  This is apparently the right thing. */
+      remember_args (words->next, 1);
+
+      line_number = 0;
+      return_catch_flag++;
+      return_val =  setjmp (return_catch);
+
+      if (return_val)
+       result = return_catch_value;
+      else
+       result =
+         execute_command_internal (tc, 0, NO_PIPE, NO_PIPE, fds_to_close);
+
+      run_unwind_frame ("function_calling");
+    }
+
+  redirection_undo_list = saved_undo_list;
+  if (builtin != exec_builtin)
+    discard_unwind_frame ("saved redirects");
+  do_redirections (redirection_undo_list, 1, 0, 0);
+
+  return (result);
+}
+
+/* Execute a simple command that is hopefully defined in a disk file
+   somewhere.
+
+   1) fork ()
+   2) connect pipes
+   3) look up the command
+   4) do redirections
+   5) execve ()
+   6) If the execve failed, see if the file has executable mode set.
+   If so, and it isn't a directory, then execute its contents as
+   a shell script.
+
+   Note that the filename hashing stuff has to take place up here,
+   in the parent.  This is probably why the Bourne style shells
+   don't handle it, since that would require them to go through
+   this gnarly hair, for no good reason.  */
+static void
+execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
+                     async, fds_to_close)
+     WORD_LIST *words;
+     REDIRECT *redirects;
+     char *command_line;
+     int pipe_in, pipe_out, async;
+     struct fd_bitmap *fds_to_close;
+{
+  char **make_word_array (), *find_user_command (), *find_hashed_filename ();
+  char *hashed_file, *command, **args;
+
+#if defined (RESTRICTED_SHELL)
+  extern int restricted;
+
+  if (restricted && strchr (words->word->word, '/'))
+    {
+      report_error ("%s: restricted: cannot specify `/' in command names",
+                   words->word->word);
+      last_command_exit_value = EXECUTION_FAILURE;
+      return;
+    }
+#endif /* RESTRICTED_SHELL */
+
+  hashed_file = command = (char *)NULL;
+
+  /* Don't waste time trying to find hashed data for a pathname
+     that is already completely specified. */
+
+  if (!absolute_program (words->word->word))
+    hashed_file = find_hashed_filename (words->word->word);
+
+  /* XXX - this could be a big performance hit... */
+  /* If a command found in the hash table no longer exists, we need to
+     look for it in $PATH. */
+  if (hashed_file)
+    {
+      int st;
+
+      st = file_status (hashed_file);
+      if ((st & (FS_EXISTS | FS_EXECABLE)) != (FS_EXISTS | FS_EXECABLE))
+       {
+         remove_hashed_filename (words->word->word);
+         hashed_file = (char *) NULL;
+       }
+    }
+    
+  if (hashed_file)
+    command = savestring (hashed_file);
+  else
+    {
+      /* A command containing a slash is not looked up in PATH. */
+      if (absolute_program (words->word->word))
+       command = savestring (words->word->word);
+      else
+       {
+         command = find_user_command (words->word->word);
+
+         /* A command name containing a slash is not saved in the
+            hash table. */
+         if (command && !hashing_disabled)
+           {
+             extern int dot_found_in_search;
+
+             remember_filename
+               (words->word->word, command, dot_found_in_search);
+
+             /* Increase the number of hits to 1. */
+             find_hashed_filename (words->word->word);
+           }
+       }
+    }
+
+  if (command)
+    put_command_name_into_env (command);
+
+  /* We have to make the child before we check for the non-existance
+     of COMMAND, since we want the error messages to be redirected. */
+  if (make_child (savestring (command_line), async) == 0)
+    {
+      do_piping (pipe_in, pipe_out);
+
+      /* Execve expects the command name to be in args[0].  So we
+        leave it there, in the same format that the user used to
+        type it in. */
+      args = make_word_array (words);
+
+      if (async)
+       {
+         begin_unwind_frame ("async_redirections");
+         unwind_protect_int (interactive);
+         interactive = 0;
+       }
+
+      subshell_environment = 1;
+
+      if (do_redirections (redirects, 1, 0, 0) != 0)
+       {
+#if defined (PROCESS_SUBSTITUTION)
+         /* Try to remove named pipes that may have been created as the
+            result of redirections. */
+         unlink_fifo_list ();
+#endif /* PROCESS_SUBSTITUTION */
+         exit (EXECUTION_FAILURE);
+       }
+
+      if (async)
+       run_unwind_frame ("async_redirections");
+
+      if (!command)
+       {
+         report_error ("%s: command not found", args[0]);
+         exit (EXECUTION_FAILURE);
+       }
+
+      /* This functionality is now provided by close-on-exec of the
+        file descriptors manipulated by redirection and piping.
+        Some file descriptors still need to be closed in all children
+        because of the way bash does pipes; fds_to_close is a 
+        bitmap of all such file descriptors. */
+      if (fds_to_close)
+       close_fd_bitmap (fds_to_close);
+
+      exit (shell_execve (command, args, export_env));
+    }
+  else
+    {
+      /* Make sure that the pipes are closed in the parent. */
+      close_pipes (pipe_in, pipe_out);
+      if (command)
+       free (command);
+    }
+}
+
+/* If the operating system on which we're running does not handle
+   the #! executable format, then help out.  SAMPLE is the text read
+   from the file, SAMPLE_LEN characters.  COMMAND is the name of
+   the script; it and ARGS, the arguments given by the user, will
+   become arguments to the specified interpreter.  ENV is the environment
+   to pass to the interpreter.
+
+   The word immediately following the #! is the interpreter to execute.
+   A single argument to the interpreter is allowed. */
+static int
+execute_shell_script (sample, sample_len, command, args, env)
+     unsigned char *sample;
+     int sample_len;
+     char *command;
+     char **args, **env;
+{
+  extern char *shell_name;
+  register int i;
+  char *execname, *firstarg;
+  int start, size_increment, larry;
+
+  /* Find the name of the interpreter to exec. */
+  for (i = 2; whitespace (sample[i]) && i < sample_len; i++)
+    ;
+
+  for (start = i;
+       !whitespace (sample[i]) && sample[i] != '\n' && i < sample_len;
+       i++)
+    ;
+
+  execname = (char *)xmalloc (1 + (i - start));
+  strncpy (execname, sample + start, i - start);
+  execname[i - start] = '\0';
+  size_increment = 1;
+
+  /* Now the argument, if any. */
+  firstarg = (char *)NULL;
+  for (start = i;
+       whitespace (sample[i]) && sample[i] != '\n' && i < sample_len;
+       i++)
+    ;
+
+  /* If there is more text on the line, then it is an argument for the
+     interpreter. */
+  if (i < sample_len && sample[i] != '\n' && !whitespace (sample[i]))
+    {
+      for (start = i;
+          !whitespace (sample[i]) && sample[i] != '\n' && i < sample_len;
+          i++)
+       ;
+      firstarg = (char *)xmalloc (1 + (i - start));
+      strncpy (firstarg, sample + start, i - start);
+      firstarg[i - start] = '\0';
+
+      size_increment = 2;
+    }
+
+  larry = array_len (args) + size_increment;
+
+  args = (char **)xrealloc (args, (1 + larry) * sizeof (char *));
+
+  for (i = larry - 1; i; i--)
+    args[i] = args[i - size_increment];
+
+  args[0] = execname;
+  if (firstarg)
+    {
+      args[1] = firstarg;
+      args[2] = command;
+    }
+  else
+    args[1] = command;
+
+  args[larry] = (char *)NULL;
+
+  return (shell_execve (execname, args, env));
+}
+
+/* Call execve (), handling interpreting shell scripts, and handling
+   exec failures. */
+int
+shell_execve (command, args, env)
+     char *command;
+     char **args, **env;
+{
+#if defined (isc386) && defined (_POSIX_SOURCE)
+  __setostype (0);             /* Turn on USGr3 semantics. */
+  execve (command, args, env);
+  __setostype (1);             /* Turn the POSIX semantics back on. */
+#else
+  execve (command, args, env);
+#endif /* !(isc386 && _POSIX_SOURCE) */
+
+  /* If we get to this point, then start checking out the file.
+     Maybe it is something we can hack ourselves. */
+  {
+    struct stat finfo;
+
+    if (errno != ENOEXEC)
+      {
+       if ((stat (command, &finfo) == 0) &&
+           (S_ISDIR (finfo.st_mode)))
+         report_error ("%s: is a directory", args[0]);
+       else
+         file_error (command);
+
+       return (EXECUTION_FAILURE);
+      }
+    else
+      {
+       /* This file is executable.
+          If it begins with #!, then help out people with losing operating
+          systems.  Otherwise, check to see if it is a binary file by seeing
+          if the first line (or up to 30 characters) are in the ASCII set.
+          Execute the contents as shell commands. */
+       extern char *shell_name;
+       int larray = array_len (args) + 1;
+       int i, should_exec = 0;
+
+       {
+         int fd = open (command, O_RDONLY);
+         if (fd != -1)
+           {
+             unsigned char sample[80];
+             int sample_len = read (fd, &sample[0], 80);
+
+             close (fd);
+
+             if (sample_len == 0)
+               return (EXECUTION_SUCCESS);
+
+             /* Is this supposed to be an executable script? */
+             /* If so, the format of the line is "#! interpreter [argument]".
+                A single argument is allowed.  The BSD kernel restricts
+                the length of the entire line to 32 characters (32 bytes
+                being the size of the BSD exec header), but we allow 80
+                characters. */
+
+             if (sample_len > 0 && sample[0] == '#' && sample[1] == '!')
+               return (execute_shell_script (sample, sample_len, command,
+                                             args, env));
+#if defined (NOTDEF)
+#if defined (HAVE_CSH) && ( defined (Bsd) || defined (Ultrix) )
+             /* If this system has Csh, then keep the old
+                BSD semantics. */
+             else if (sample_len > 0 && sample[0] == '#')
+               {
+                 /* Scripts starting with a # are for Csh. */
+                 shell_name = savestring ("/bin/csh");
+                 should_exec = 1;
+               }
+#endif /* HAVE_CSH */
+#endif /* NOTDEF */
+             else if ((sample_len != -1) &&
+                       check_binary_file (sample, sample_len))
+               {
+                 report_error ("%s: cannot execute binary file", command);
+                 return (EX_BINARY_FILE);
+               }
+           }
+       }
+#if defined (JOB_CONTROL)
+       /* Forget about the way that job control was working. We are
+          in a subshell. */
+       without_job_control ();
+#endif /* JOB_CONTROL */
+#if defined (ALIAS)
+       /* Forget about any aliases that we knew of.  We are in a subshell. */
+       delete_all_aliases ();
+#endif /* ALIAS */
+
+#if defined (JOB_CONTROL)
+       set_sigchld_handler ();
+#endif /* JOB_CONTROL */
+        set_sigint_handler ();
+
+       /* Insert the name of this shell into the argument list. */
+       args = (char **)xrealloc (args, (1 + larray) * sizeof (char *));
+
+       for (i = larray - 1; i; i--)
+         args[i] = args[i - 1];
+
+       args[0] = shell_name;
+       args[1] = command;
+       args[larray] = (char *)NULL;
+
+       if (args[0][0] == '-')
+         args[0]++;
+
+       if (should_exec)
+         {
+           struct stat finfo;
+
+#if defined (isc386) && defined (_POSIX_SOURCE)
+           __setostype (0);    /* Turn on USGr3 semantics. */
+           execve (shell_name, args, env);
+           __setostype (1);    /* Turn the POSIX semantics back on. */
+#else
+           execve (shell_name, args, env);
+#endif /* isc386 && _POSIX_SOURCE */
+
+           /* Oh, no!  We couldn't even exec this! */
+           if ((stat (args[0], &finfo) == 0) && (S_ISDIR (finfo.st_mode)))
+             report_error ("%s: is a directory", args[0]);
+           else
+             file_error (args[0]);
+
+           return (EXECUTION_FAILURE);
+         }
+       else
+         {
+           extern jmp_buf subshell_top_level;
+           extern int subshell_argc;
+           extern char **subshell_argv;
+           extern char **subshell_envp;
+
+           subshell_argc = larray;
+           subshell_argv = args;
+           subshell_envp = env;
+           longjmp (subshell_top_level, 1);
+         }
+      }
+  }
+}
+
+#if defined (PROCESS_SUBSTITUTION)
+void
+close_all_files ()
+{
+  register int i, fd_table_size;
+
+  fd_table_size = getdtablesize ();
+
+  for (i = 3; i < fd_table_size; i++)
+    close (i);
+}
+#endif /* PROCESS_SUBSTITUTION */
+
+static void
+close_pipes (in, out)
+     int in, out;
+{
+  if (in >= 0) close (in);
+  if (out >= 0) close (out);
+}
+
+/* Redirect input and output to be from and to the specified pipes.
+   NO_PIPE and REDIRECT_BOTH are handled correctly. */
+static void
+do_piping (pipe_in, pipe_out)
+     int pipe_in, pipe_out;
+{
+  if (pipe_in != NO_PIPE)
+    {
+      dup2 (pipe_in, 0);
+      close (pipe_in);
+    }
+  if (pipe_out != NO_PIPE)
+    {
+      dup2 (pipe_out, 1);
+      close (pipe_out);
+
+      if (pipe_out == REDIRECT_BOTH)
+       dup2 (1, 2);
+    }
+}
+
+/* Defined in flags.c.  Non-zero means don't overwrite existing files. */
+extern int noclobber;
+
+#define AMBIGUOUS_REDIRECT  -1
+#define NOCLOBBER_REDIRECT  -2
+#define RESTRICTED_REDIRECT -3 /* Only can happen in restricted shells. */
+
+/* Perform the redirections on LIST.  If FOR_REAL, then actually make
+   input and output file descriptors, otherwise just do whatever is
+   neccessary for side effecting.  INTERNAL says to remember how to
+   undo the redirections later, if non-zero.  If SET_CLEXEC is non-zero,
+   file descriptors opened in do_redirection () have their close-on-exec
+   flag set. */
+static int
+do_redirections (list, for_real, internal, set_clexec)
+     REDIRECT *list;
+     int for_real, internal;
+{
+  register int error;
+  register REDIRECT *temp = list;
+
+  if (internal && redirection_undo_list)
+    {
+      dispose_redirects (redirection_undo_list);
+      redirection_undo_list = (REDIRECT *)NULL;
+    }
+
+  while (temp)
+    {
+      extern char *strerror ();
+
+      error = do_redirection_internal (temp, for_real, internal, set_clexec);
+
+      if (error)
+       {
+         char *redirection_expand (), *itos ();
+         char *filename;
+
+         if (expandable_redirection_filename (temp))
+           {
+             filename = redirection_expand (temp->redirectee.filename);
+             if (!filename)
+               filename = savestring ("");
+           }
+         else
+           filename = itos (temp->redirectee.dest);
+
+         switch (error)
+           {
+           case AMBIGUOUS_REDIRECT:
+             report_error ("%s: Ambiguous redirect", filename);
+             break;
+
+           case NOCLOBBER_REDIRECT:
+             report_error ("%s: Cannot clobber existing file", filename);
+             break;
+
+#if defined (RESTRICTED_SHELL)
+           case RESTRICTED_REDIRECT:
+             report_error ("%s: output redirection restricted", filename);
+             break;
+#endif /* RESTRICTED_SHELL */
+
+           default:
+             report_error ("%s: %s", filename, strerror (error));
+             break;
+           }
+
+         free (filename);
+         return (error);
+       }
+
+      temp = temp->next;
+    }
+  return (0);
+}
+
+/* Return non-zero if the redirection pointed to by REDIRECT has a
+   redirectee.filename that can be expanded. */
+static int
+expandable_redirection_filename (redirect)
+     REDIRECT *redirect;
+{
+  int result;
+
+  switch (redirect->instruction)
+    {
+    case r_output_direction:
+    case r_appending_to:
+    case r_input_direction:
+    case r_inputa_direction:
+    case r_err_and_out:
+    case r_input_output:
+    case r_output_force:
+    case r_duplicating_input_word:
+    case r_duplicating_output_word:
+      result = 1;
+      break;
+
+    default:
+      result = 0;
+    }
+  return (result);
+}
+\f
+/* Expand the word in WORD returning a string.  If WORD expands to
+   multiple words (or no words), then return NULL. */
+char *
+redirection_expand (word)
+     WORD_DESC *word;
+{
+  char *result;
+  WORD_LIST *make_word_list (), *expand_words_no_vars ();
+  WORD_LIST *tlist1, *tlist2;
+
+  tlist1 = make_word_list (copy_word (word), (WORD_LIST *)NULL);
+  tlist2 = expand_words_no_vars (tlist1);
+  dispose_words (tlist1);
+
+  if (!tlist2 || tlist2->next)
+    {
+      /* We expanded to no words, or to more than a single word.
+        Dispose of the word list and return NULL. */
+      if (tlist2)
+       dispose_words (tlist2);
+      return ((char *)NULL);
+    }
+  result = string_list (tlist2);
+  dispose_words (tlist2);
+
+  return (result);
+}
+
+/* Do the specific redirection requested.  Returns errno in case of error.
+   If FOR_REAL is zero, then just do whatever is neccessary to produce the
+   appropriate side effects.   REMEMBERING, if non-zero, says to remember
+   how to undo each redirection.  If SET_CLEXEC is non-zero, then
+   we set all file descriptors > 2 that we open to be close-on-exec.  */
+static int
+do_redirection_internal (redirect, for_real, remembering, set_clexec)
+     REDIRECT *redirect;
+     int for_real, remembering;
+{
+  WORD_DESC *redirectee = redirect->redirectee.filename;
+  int fd, redirector = redirect->redirector;
+  char *redirectee_word;
+  enum r_instruction ri = redirect->instruction;
+  REDIRECT *new_redirect;
+
+  if (ri == r_duplicating_input_word || ri == r_duplicating_output_word)
+    {
+      /* We have [N]>&WORD or [N]<&WORD.  Expand WORD, then translate
+        the redirection into a new one and continue. */
+      redirectee_word = redirection_expand (redirectee);
+
+      if (redirectee_word[0] == '-' && redirectee_word[1] == '\0')
+       {
+         new_redirect = make_redirection (redirector, r_close_this, 0);
+       }
+      else if (all_digits (redirectee_word))
+       {
+         if (ri == r_duplicating_input_word)
+           {
+             new_redirect = make_redirection
+               (redirector, r_duplicating_input, atoi (redirectee_word));
+           }
+         else
+           {
+             new_redirect = make_redirection
+               (redirector, r_duplicating_output, atoi (redirectee_word));
+           }
+       }
+      else if (ri == r_duplicating_output_word && redirector == 1)
+       {
+         new_redirect = make_redirection
+           (1, r_err_and_out, make_word (redirectee_word));
+       }
+      else
+       {
+         free (redirectee_word);
+         return (AMBIGUOUS_REDIRECT);
+       }
+
+      free (redirectee_word);
+
+      /* Set up the variables needed by the rest of the function from the
+        new redirection. */
+      if (new_redirect->instruction == r_err_and_out)
+       {
+         char *alloca_hack;
+
+         /* Copy the word without allocating any memory that must be
+            explicitly freed. */
+         redirectee = (WORD_DESC *)alloca (sizeof (WORD_DESC));
+         bcopy (new_redirect->redirectee.filename,
+                redirectee, sizeof (WORD_DESC));
+
+         alloca_hack = (char *)
+           alloca (1 + strlen (new_redirect->redirectee.filename->word));
+         redirectee->word = alloca_hack;
+         strcpy (redirectee->word, new_redirect->redirectee.filename->word);
+       }
+      else
+       /* It's guaranteed to be an integer, and shouldn't be freed. */
+       redirectee = new_redirect->redirectee.filename;
+
+      redirector = new_redirect->redirector;
+      ri = new_redirect->instruction;
+
+      /* Overwrite the flags element of the old redirect with the new value. */
+      redirect->flags = new_redirect->flags;
+      dispose_redirects (new_redirect);
+    }
+
+  switch (ri)
+    {
+    case r_output_direction:
+    case r_appending_to:
+    case r_input_direction:
+    case r_inputa_direction:
+    case r_err_and_out:                /* command &>filename */
+    case r_input_output:
+    case r_output_force:
+
+      if (!(redirectee_word = redirection_expand (redirectee)))
+       return (AMBIGUOUS_REDIRECT);
+
+#if defined (RESTRICTED_SHELL)
+      if (restricted && (ri == r_output_direction ||
+                        ri == r_input_output ||
+                        ri == r_err_and_out ||
+                        ri == r_appending_to ||
+                        ri == r_output_force))
+       {
+         free(redirectee_word);
+         return (RESTRICTED_REDIRECT);
+       }
+#endif /* RESTRICTED_SHELL */
+
+      /* If we are in noclobber mode, you are not allowed to overwrite
+        existing files.  Check first. */
+      if (noclobber && (ri == r_output_direction ||
+                     ri == r_input_output ||
+                     ri == r_err_and_out))
+      {
+       struct stat buf;
+       int stat_result;
+
+       stat_result = stat (redirectee_word, &buf);
+       if ((stat_result == 0) && (S_ISREG (buf.st_mode)))
+         {
+           free (redirectee_word);
+           return (NOCLOBBER_REDIRECT);
+         }
+       /* If the file was not there, make sure we use exclusive open so
+          that if it's created before we open it, our open will fail. */
+       if (stat_result != 0)
+         redirect->flags |= O_EXCL;
+       fd = open (redirectee_word, redirect->flags, 0666);
+       if (fd < 0 && errno == EEXIST)
+         {
+           free (redirectee_word);
+           return (NOCLOBBER_REDIRECT);
+         }
+      }
+    else
+      {
+       fd = open (redirectee_word, redirect->flags, 0666);
+#if defined (AFS_CREATE_BUG)
+       if (fd < 0 && errno == EACCES)
+         fd = open (redirectee_word, (redirect->flags & ~O_CREAT), 0666);
+#endif /* AFS_CREATE_BUG */
+      }
+
+    free (redirectee_word);
+
+    if (fd < 0 )
+      return (errno);
+
+      if (for_real)
+       {
+         if (remembering)
+           /* Only setup to undo it if the thing to undo is active. */
+           if ((fd != redirector) && (fcntl (redirector, F_GETFD, 0) != -1))
+             add_undo_redirect (redirector);
+           else
+             add_undo_close_redirect (redirector);
+
+         if ((fd != redirector) && (dup2 (fd, redirector) < 0))
+           return (errno);
+
+#if defined (BUFFERED_INPUT)
+         if (ri == r_input_direction || ri == r_inputa_direction ||
+             ri == r_input_output)
+           duplicate_buffered_stream (fd, redirector);
+#endif /* BUFFERED_INPUT */
+
+         /*
+          * If we're remembering, then this is the result of a while, for
+          * or until loop with a loop redirection, or a function/builtin
+          * executing in the parent shell with a redirection.  In the
+          * function/builtin case, we want to set all file descriptors > 2
+          * to be close-on-exec to duplicate the effect of the old
+          * for i = 3 to NOFILE close(i) loop.  In the case of the loops,
+          * both sh and ksh leave the file descriptors open across execs.
+          * The Posix standard mentions only the exec builtin.
+          */
+         if (set_clexec && (redirector > 2))
+           SET_CLOSE_ON_EXEC (redirector);
+       }
+
+      if (fd != redirector)
+       {
+#if defined (BUFFERED_INPUT)
+         if (ri == r_input_direction || ri == r_inputa_direction ||
+             ri == r_input_output)
+           close_buffered_fd (fd);
+         else
+#endif /* !BUFFERED_INPUT */
+           close (fd);         /* Don't close what we just opened! */
+       }
+
+      /* If we are hacking both stdout and stderr, do the stderr
+        redirection here. */
+      if (ri == r_err_and_out)
+       {
+         if (for_real)
+           {
+             if (remembering)
+               add_undo_redirect (2);
+             if (dup2 (1, 2) < 0)
+               return (errno);
+           }
+       }
+      break;
+
+    case r_reading_until:
+    case r_deblank_reading_until:
+      {
+       /* REDIRECTEE is a pointer to a WORD_DESC containing the text of
+          the new input.  Place it in a temporary file. */
+       int document_index = 0;
+       char *document = (char *)NULL;
+
+       /* Expand the text if the word that was specified had no quoting.
+          Note that the text that we expand is treated exactly as if it
+          were surrounded by double-quotes.  */
+
+       if (!redirectee)
+         document = savestring ("");
+       else
+         {
+           if (!redirectee->quoted)
+             {
+               WORD_LIST *temp_word_list =
+                 (WORD_LIST *)expand_string (redirectee->word,
+                                             Q_HERE_DOCUMENT);
+
+               document = string_list (temp_word_list);
+               if (!document)
+                 document = savestring ("");
+               dispose_words (temp_word_list);
+             }
+           else
+             {
+               document = redirectee->word;
+             }
+           document_index = strlen (document);
+
+           {
+             char filename[40];
+             pid_t pid = getpid ();
+
+             /* Make the filename for the temp file. */
+             sprintf (filename, "/tmp/t%d-sh", pid);
+
+             fd = open (filename, O_TRUNC | O_WRONLY | O_CREAT, 0666);
+             if (fd < 0)
+               {
+                 if (!redirectee->quoted)
+                   free (document);
+                 return (errno);
+               }
+
+             write (fd, document, document_index);
+             close (fd);
+
+             if (!redirectee->quoted)
+               free (document);
+
+             /* Make the document really temporary.  Also make it the
+                input. */
+             fd = open (filename, O_RDONLY, 0666);
+
+             if (unlink (filename) < 0 || fd < 0)
+               return (errno);
+
+             if (for_real)
+               {
+                 if (remembering)
+                   /* Only setup to undo it if the thing to undo is active. */
+                   if ((fd != redirector) &&
+                       (fcntl (redirector, F_GETFD, 0) != -1))
+                     add_undo_redirect (redirector);
+                   else
+                     add_undo_close_redirect (redirector);
+
+                 if (dup2 (fd, redirector) < 0)
+                   return (errno);
+
+#if defined (BUFFERED_INPUT)
+                 duplicate_buffered_stream (fd, redirector);
+#endif
+
+                 if (set_clexec && (redirector > 2))
+                   SET_CLOSE_ON_EXEC (redirector);
+               }
+
+#if defined (BUFFERED_INPUT)
+             close_buffered_fd (fd);
+#else
+             close (fd);
+#endif
+           }
+         }
+      }
+      break;
+
+    case r_duplicating_input:
+    case r_duplicating_output:
+      if (for_real && ((int)redirectee != redirector))
+       {
+         if (remembering)
+           /* Only setup to undo it if the thing to undo is active. */
+           if (fcntl (redirector, F_GETFD, 0) != -1)
+             add_undo_redirect (redirector);
+           else
+             add_undo_close_redirect (redirector);
+
+         /* This is correct.  2>&1 means dup2 (1, 2); */
+         if (dup2 ((int)redirectee, redirector) < 0)
+           return (errno);
+
+#if defined (BUFFERED_INPUT)
+         if (ri == r_duplicating_input)
+           duplicate_buffered_stream ((int)redirectee, redirector);
+#endif /* BUFFERED_INPUT */
+
+         /* First duplicate the close-on-exec state of redirectee.  dup2
+            leaves the flag unset on the new descriptor, which means it
+            stays open.  Only set the close-on-exec bit for file descriptors
+            greater than 2 in any case, since 0-2 should always be open
+            unless closed by something like `exec 2<&-'. */
+         /* if ((already_set || set_unconditionally) && (ok_to_set))
+               set_it () */
+         if (((fcntl ((int)redirectee, F_GETFD, 0) == 1) || set_clexec) &&
+              (redirector > 2))
+           SET_CLOSE_ON_EXEC (redirector);
+       }
+      break;
+
+    case r_close_this:
+      if (for_real)
+       {
+         if (remembering && (fcntl (redirector, F_GETFD, 0) != -1))
+           add_undo_redirect (redirector);
+
+#if defined (BUFFERED_INPUT)
+         close_buffered_fd (redirector);
+#else /* !BUFFERED_INPUT */
+         close (redirector);
+#endif /* !BUFFERED_INPUT */
+       }
+      break;
+    }
+  return (0);
+}
+
+#define SHELL_FD_BASE  10
+
+/* Remember the file descriptor associated with the slot FD,
+   on REDIRECTION_UNDO_LIST.  Note that the list will be reversed
+   before it is executed. */
+static int
+add_undo_redirect (fd)
+     int fd;
+{
+  int new_fd, clexec_flag;
+  REDIRECT *new_redirect, *closer;
+
+  new_fd = fcntl (fd, F_DUPFD, SHELL_FD_BASE);
+
+  if (new_fd < 0)
+    {
+      file_error ("redirection error");
+      return (-1);
+    }
+  else
+    {
+      clexec_flag = fcntl (fd, F_GETFD, 0);
+      closer = make_redirection (new_fd, r_close_this, 0);
+      new_redirect = make_redirection (fd, r_duplicating_input, new_fd);
+      new_redirect->next = closer;
+      closer->next = redirection_undo_list;
+      redirection_undo_list = new_redirect;
+      /*
+       * File descriptors used only for saving others should always be
+       * marked close-on-exec.  Unfortunately, we have to preserve the
+       * close-on-exec state of the file descriptor we are saving, since
+       * fcntl (F_DUPFD) sets the new file descriptor to remain open
+       * across execs.  If, however, the file descriptor whose state we
+       * are saving is <= 2, we can just set the close-on-exec flag,
+       * because file descriptors 0-2 should always be open-on-exec,
+       * and the restore above in do_redirection() will take care of it.
+       */
+      if (clexec_flag || fd < 3)
+       SET_CLOSE_ON_EXEC (new_fd);
+    }
+  return (0);
+}
+
+/* Set up to close FD when we are finished with the current command
+   and its redirections. */
+static void
+add_undo_close_redirect (fd)
+     int fd;
+{
+  REDIRECT *closer;
+
+  closer = make_redirection (fd, r_close_this, 0);
+  closer->next = redirection_undo_list;
+  redirection_undo_list = closer;
+}
+
+intern_function (name, function)
+     WORD_DESC *name;
+     COMMAND *function;
+{
+  SHELL_VAR *var;
+
+  if (!check_identifier (name))
+    return (EXECUTION_FAILURE);
+
+  var = find_function (name->word);
+  if (var && readonly_p (var))
+    {
+      report_error ("%s: readonly function", var->name);
+      return (EXECUTION_FAILURE);
+    }
+
+  bind_function (name->word, function);
+  return (EXECUTION_SUCCESS);
+}
+
+/* Make sure that identifier is a valid shell identifier, i.e.
+   does not contain a dollar sign, nor is quoted in any way.  Nor
+   does it consist of all digits. */
+check_identifier (word)
+     WORD_DESC *word;
+{
+  if (word->dollar_present || word->quoted || all_digits (word->word))
+    {
+      report_error ("`%s' is not a valid identifier", word->word);
+      return (0);
+    }
+  else
+    return (1);
+}
+
+#define u_mode_bits(x) (((x) & 0000700) >> 6)
+#define g_mode_bits(x) (((x) & 0000070) >> 3)
+#define o_mode_bits(x) (((x) & 0000007) >> 0)
+#define X_BIT(x) (x & 1)
+
+/* Return some flags based on information about this file.
+   The EXISTS bit is non-zero if the file is found.
+   The EXECABLE bit is non-zero the file is executble.
+   Zero is returned if the file is not found. */
+int
+file_status (name)
+     char *name;
+{
+  struct stat finfo;
+  static int user_id = -1;
+
+  /* Determine whether this file exists or not. */
+  if (stat (name, &finfo) < 0)
+    return (0);
+
+  /* If the file is a directory, then it is not "executable" in the
+     sense of the shell. */
+  if (S_ISDIR (finfo.st_mode))
+    return (FS_EXISTS);
+
+  /* Find out if the file is actually executable.  By definition, the
+     only other criteria is that the file has an execute bit set that
+     we can use. */
+  if (user_id == -1)
+    user_id = geteuid ();
+
+  /* Root only requires execute permission for any of owner, group or
+     others to be able to exec a file. */
+  if (user_id == 0)
+    {
+      int bits;
+
+      bits = (u_mode_bits (finfo.st_mode) |
+             g_mode_bits (finfo.st_mode) |
+             o_mode_bits (finfo.st_mode));
+
+      if (X_BIT (bits))
+       return (FS_EXISTS | FS_EXECABLE);
+    }
+
+  /* If we are the owner of the file, the owner execute bit applies. */
+  if (user_id == finfo.st_uid && X_BIT (u_mode_bits (finfo.st_mode)))
+    return (FS_EXISTS | FS_EXECABLE);
+
+  /* If we are in the owning group, the group permissions apply. */
+  if (group_member (finfo.st_gid) && X_BIT (g_mode_bits (finfo.st_mode)))
+    return (FS_EXISTS | FS_EXECABLE);
+
+  /* If `others' have execute permission to the file, then so do we,
+     since we are also `others'. */
+  if (X_BIT (o_mode_bits (finfo.st_mode)))
+    return (FS_EXISTS | FS_EXECABLE);
+  else
+    return (FS_EXISTS);
+}
+
+/* Return non-zero if FILE exists and is executable.
+   Note that this function is the definition of what an
+   executable file is; do not change this unless YOU know
+   what an executable file is. */
+int
+executable_file (file)
+     char *file;
+{
+  if (file_status (file) & FS_EXECABLE)
+    return (1);
+  else
+    return (0);
+}
+
+/* DOT_FOUND_IN_SEARCH becomes non-zero when find_user_command ()
+   encounters a `.' as the directory pathname while scanning the
+   list of possible pathnames; i.e., if `.' comes before the directory
+   containing the file of interest. */
+int dot_found_in_search = 0;
+
+/* Locate the executable file referenced by NAME, searching along
+   the contents of the shell PATH variable.  Return a new string
+   which is the full pathname to the file, or NULL if the file
+   couldn't be found.  If a file is found that isn't executable,
+   and that is the only match, then return that. */
+char *
+find_user_command (name)
+     char *name;
+{
+  return (find_user_command_internal (name, FS_EXEC_PREFERRED));
+}
+
+/* Locate the file referenced by NAME, searching along the contents
+   of the shell PATH variable.  Return a new string which is the full
+   pathname to the file, or NULL if the file couldn't be found.  This
+   returns the first file found. */
+char *
+find_path_file (name)
+     char *name;
+{
+  return (find_user_command_internal (name, FS_EXISTS));
+}
+
+static char *
+find_user_command_internal (name, flags)
+     char *name;
+     int flags;
+{
+  char *path_list = (char *)NULL;
+  SHELL_VAR *var;
+
+  /* Search for the value of PATH in both the temporary environment, and
+     in the regular list of variables. */
+  if (var = find_variable_internal ("PATH", 1))
+    path_list = value_cell (var);
+
+  if (!path_list)
+    return (savestring (name));
+
+  return (find_user_command_in_path (name, path_list, flags));
+}
+
+/* Return the next element from PATH_LIST, a colon separated list of
+   paths.  PATH_INDEX_POINTER is the address of an index into PATH_LIST;
+   the index is modified by this function.
+   Return the next element of PATH_LIST or NULL if there are no more. */
+static char *
+get_next_path_element (path_list, path_index_pointer)
+     char *path_list;
+     int *path_index_pointer;
+{
+  extern char *extract_colon_unit ();
+  char *path;
+
+  path = extract_colon_unit (path_list, path_index_pointer);
+
+  if (!path)
+    return (path);
+
+  if (!*path)
+    {
+      free (path);
+      path = savestring (".");
+    }
+
+  return (path);
+}
+
+char *
+user_command_matches (name, flags, state)
+     char *name;
+     int flags, state;
+{
+  register int i;
+  char *path_list;
+  int  path_index;
+  char *path_element;
+  char *match;
+  static char **match_list = NULL;
+  static int match_list_size = 0;
+  static int match_index = 0;
+
+  if (!state)
+    {
+      /* Create the list of matches. */
+      if (!match_list)
+       {
+         match_list =
+           (char **) xmalloc ((match_list_size = 5) * sizeof(char *));
+
+         for (i = 0; i < match_list_size; i++)
+           match_list[i] = 0;
+       }
+
+      /* Clear out the old match list. */
+      for (i = 0; i < match_list_size; i++)
+       match_list[i] = NULL;
+
+      /* We haven't found any files yet. */
+      match_index = 0;
+
+      path_list = get_string_value ("PATH");
+      path_index = 0;
+
+      while (path_list && path_list[path_index])
+       {
+         char *find_user_command_in_path ();
+
+         path_element = get_next_path_element (path_list, &path_index);
+
+         if (!path_element)
+           break;
+
+         match = find_user_command_in_path (name, path_element, flags);
+
+         free (path_element);
+
+         if (!match)
+           continue;
+
+         if (match_index + 1 == match_list_size)
+           match_list = (char **)xrealloc
+             (match_list, ((match_list_size += 10) + 1) * sizeof (char *));
+         match_list[match_index++] = match;
+         match_list[match_index] = (char *)NULL;
+       }
+
+      /* We haven't returned any strings yet. */
+      match_index = 0;
+    }
+
+  match = match_list[match_index];
+
+  if (match)
+    match_index++;
+
+  return (match);
+}
+
+/* Return 1 if PATH1 and PATH2 are the same file.  This is kind of
+   expensive.  If non-NULL STP1 and STP2 point to stat structures
+   corresponding to PATH1 and PATH2, respectively. */
+int
+same_file (path1, path2, stp1, stp2)
+     char *path1, *path2;
+     struct stat *stp1, *stp2;
+{
+  struct stat st1, st2;
+
+  if (stp1 == NULL)
+    {
+      if (stat (path1, &st1) != 0)
+       return (0);
+      stp1 = &st1;
+    }
+
+  if (stp2 == NULL)
+    {
+      if (stat (path2, &st2) != 0)
+       return (0);
+      stp2 = &st2;
+    }
+
+  return ((stp1->st_dev == stp2->st_dev) && (stp1->st_ino == stp2->st_ino));
+}
+
+/* This does the dirty work for find_path_file () and find_user_command ().
+   NAME is the name of the file to search for.
+   PATH_LIST is a colon separated list of directories to search.
+   FLAGS contains bit fields which control the files which are eligible.
+   Some values are:
+      FS_EXEC_ONLY:            The file must be an executable to be found.
+      FS_EXEC_PREFERRED:       If we can't find an executable, then the
+                               the first file matching NAME will do.
+      FS_EXISTS:               The first file found will do.
+*/
+static char *
+find_user_command_in_path (name, path_list, flags)
+     char *name;
+     char *path_list;
+     int flags;
+{
+  char *full_path, *path, *file_to_lose_on;
+  int status, path_index, name_len;
+  struct stat finfo;
+
+  name_len = strlen (name);
+
+  /* The file name which we would try to execute, except that it isn't
+     possible to execute it.  This is the first file that matches the
+     name that we are looking for while we are searching $PATH for a
+     suitable one to execute.  If we cannot find a suitable executable
+     file, then we use this one. */
+  file_to_lose_on = (char *)NULL;
+
+  /* We haven't started looking, so we certainly haven't seen
+     a `.' as the directory path yet. */
+  dot_found_in_search = 0;
+
+  if (absolute_program (name))
+    {
+      full_path = (char *)xmalloc (1 + name_len);
+      strcpy (full_path, name);
+
+      status = file_status (full_path);
+
+      if (!(status & FS_EXISTS))
+       return (0);
+
+      if ((flags & FS_EXEC_ONLY) && (status & FS_EXECABLE))
+       return (full_path);
+      else
+       {
+         free (full_path);
+         return ((char *)NULL);
+       }
+    }
+
+  /* Find out the location of the current working directory. */
+  stat (".", &finfo);
+
+  path_index = 0;
+  while (path_list && path_list[path_index])
+    {
+      /* Allow the user to interrupt out of a lengthy path search. */
+      QUIT;
+
+      path = get_next_path_element (path_list, &path_index);
+
+      if (!path)
+       break;
+
+      if (*path == '~')
+       {
+         char *tilde_expand ();
+         char *t = tilde_expand (path);
+         free (path);
+         path = t;
+       }
+
+      /* Remember the location of "." in the path, in all its forms
+        (as long as they begin with a `.', e.g. `./.') */
+      if ((*path == '.') &&
+         same_file (".", path, &finfo, (struct stat *)NULL))
+       dot_found_in_search = 1;
+
+      full_path = (char *)xmalloc (2 + strlen (path) + name_len);
+      sprintf (full_path, "%s/%s", path, name);
+      free (path);
+
+      status = file_status (full_path);
+
+      if (!(status & FS_EXISTS))
+       goto next_file;
+
+      /* The file exists.  If the caller simply wants the first file,
+        here it is. */
+      if (flags & FS_EXISTS)
+       return (full_path);
+
+       /* If the file is executable, then it satisfies the cases of
+         EXEC_ONLY and EXEC_PREFERRED.  Return this file unconditionally. */
+      if (status & FS_EXECABLE)
+       {
+         if (file_to_lose_on)
+           free (file_to_lose_on);
+
+         return (full_path);
+       }
+
+      /* The file is not executable, but it does exist.  If we prefer
+        an executable, then remember this one if it is the first one
+        we have found. */
+      if (flags & FS_EXEC_PREFERRED)
+       {
+         if (!file_to_lose_on)
+           file_to_lose_on = savestring (full_path);
+       }
+
+    next_file:
+      free (full_path);
+    }
+
+  /* We didn't find exactly what the user was looking for.  Return
+     the contents of FILE_TO_LOSE_ON which is NULL when the search
+     required an executable, or non-NULL if a file was found and the
+     search would accept a non-executable as a last resort. */
+  return (file_to_lose_on);
+}
+
+/* Given a string containing units of information separated by colons,
+   return the next one pointed to by INDX, or NULL if there are no more.
+   Advance INDX to the character after the colon. */
+char *
+extract_colon_unit (string, indx)
+     char *string;
+     int *indx;
+{
+  int i, start;
+
+  i = *indx;
+
+  if (!string || (i >= strlen (string)))
+    return ((char *)NULL);
+
+  /* Each call to this routine leaves the index pointing at a colon if
+     there is more to the path.  If I is > 0, then increment past the
+     `:'.  If I is 0, then the path has a leading colon.  Trailing colons
+     are handled OK by the `else' part of the if statement; an empty
+     string is returned in that case. */
+  if (i && string[i] == ':')
+    i++;
+
+  start = i;
+
+  while (string[i] && string[i] != ':') i++;
+
+  *indx = i;
+
+  if (i == start)
+    {
+      if (string[i])
+       (*indx)++;
+
+      /* Return "" in the case of a trailing `:'. */
+      return (savestring (""));
+    }
+  else
+    {
+      char *value;
+
+      value = (char *)xmalloc (1 + (i - start));
+      strncpy (value, &string[start], (i - start));
+      value [i - start] = '\0';
+
+      return (value);
+    }
+}
+
+/* Return non-zero if the characters from SAMPLE are not all valid
+   characters to be found in the first line of a shell script.  We
+   check up to the first newline, or SAMPLE_LEN, whichever comes first.
+   All of the characters must be printable or whitespace. */
+
+#if !defined (isspace)
+#define isspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\f')
+#endif
+
+#if !defined (isprint)
+#define isprint(c) (isletter(c) || digit(c) || ispunct(c))
+#endif
+
+int
+check_binary_file (sample, sample_len)
+     unsigned char *sample;
+     int sample_len;
+{
+  register int i;
+
+  for (i = 0; i < sample_len; i++)
+    {
+      if (sample[i] == '\n')
+       break;
+
+      if (!isspace (sample[i]) && !isprint (sample[i]))
+       return (1);
+    }
+  return (0);
+}
diff --git a/CWRU/old-changelogs/CHANGES.051093 b/CWRU/old-changelogs/CHANGES.051093
new file mode 100644 (file)
index 0000000..c7637b5
--- /dev/null
@@ -0,0 +1,115 @@
+This file details the changes between the previous release of CWRU bash
+(3/10/93) and this release.
+
+1. Bugs Fixed
+
+New version of endian.c that handles 64-bit machines better
+
+added code to make readline reset itself when $TERMINFO changes
+
+fixed memory leaks in:
+       builtins/exec.def
+       lib/readline/history.c
+       lib/readline/readline.c
+       parse.y
+       subst.c
+       variables.c
+       dispose_cmd.c
+       mailcheck.c
+       bashline.c
+       execute_cmd.c
+       shell.c
+
+make sure that bash_symbolic_link_hook calls get_working_directory with a
+non-empty string argument
+
+check the return value of getdtablesize() for bad values
+
+make the job control tty handlers print error message only if the shell is
+currently interactive
+
+process substitution no longer tries to close every file descriptor
+
+fixed up the source to contain more extern function declarations rather than
+casting the return values
+
+fixed up handling of embedded quoted strings by the parser so that $ is not
+a special character while parsing one
+
+added escape handling to the read builtin so backslashes can escape $IFS
+characters
+
+fixed the brace expansion code so that backslash can act as a delimiter and
+can escape `"' in a double-quoted string
+
+the `<>' redirection needs to open the file O_RDWR|O_CREAT for Posix.2
+compatibility
+
+fixed up the here document reading code so that it will remove backslash-
+quoted newlines if the document delimiter is not quoted
+
+fixed up the unwind_protect_var code so that the same strategy is used
+for both saving and restoring variables
+
+completion functions may now tell readline not to attempt filename completion
+by returning (char **) -1
+
+improved the error message printed by get_working_directory
+
+Compile for solaris if either USGr4 or __svr4__ is defined
+
+bash does not perform a getwd() on startup unless the inherited value of
+$PWD is wrong or $PWD was not in the environment
+
+fixed up the trap saving and restoring code so that savetrap=$(trap) works
+like Posix.2 says it should
+
+non-interactive shells are now much better about cleaning up dead processes
+and jobs on both job control and non job control systems
+
+fixed the code that saves and restores the dollar variables around a `.'
+script so that if the script changes the positional parameters, the old
+values are not restored
+
+fixed the tokenizer so that it will not return ASSIGNMENT_WORD while
+parsing a case statement pattern list
+
+redid the implementation of cprintf for systems without varargs
+
+fixed up the variable expansion code so that illegal variable names in ${ }
+expansion now generate errors rather than produce incorrect results
+
+fixed up some problems with default_buffered_input and the implicit redirection
+of fd 0 to /dev/null for asynchronous commands without job control
+
+new function internal_error for shell internal error messages
+
+changed the sigint signal handler in nojobs.c to do nothing when it's called,
+not even run a signal handler
+
+made the command substitution code more careful about file descriptors when
+errors occur
+
+2. New Features
+
+SIGWINCH causes bash to reset the values of $LINES and $COLUMNS for both
+readline and non-readline systems
+
+changed the code in readline that handled conditional parsing of `$if term='
+to test the terminal name given to $if against both the `long' and `short'
+(portion up to the first `-') forms of the terminal name
+
+the completion code now single-quotes a match that contains a shell word
+break character
+
+the readline code does not define USE_XON_XOFF.  This causes output to be
+swallowed when using bash over a relatively slow line (like a modem line). 
+
+there is now a bindable readline function to do only history expansion;
+bound to M-^ (M-! was already taken)
+
+ulimit now has a -u option to set and get the limit for the maximum number
+of user processes
+
+config.h.mini is a `minimal' configuration file that compiles out just about
+everything
diff --git a/CWRU/old-changelogs/CHANGES.071193 b/CWRU/old-changelogs/CHANGES.071193
new file mode 100644 (file)
index 0000000..6d24c8f
--- /dev/null
@@ -0,0 +1,63 @@
+This file details the changes between the previous release of CWRU bash
+(5/10/93) and this release.
+
+1. Bugs Fixed
+
+commas within backquotes inside matching braces are now treated as
+quoted (e.g., echo {`echo foo:bar | sed s/:/,/`})
+
+don't create the export env unless we are running a command with
+shell_execve (in execute_disk_command), and don't create it anew
+each time a child is forked
+
+make execute_disk_command look in the temp environment for an
+assignment to PATH, and disable hash lookup for the command if
+such an assignment is present 
+
+fixed here documents so that backslash-quoted newlines are treated as
+Posix.2 specifies
+
+removed a number of extraneous unwind-protects or moved them inside
+if statements
+
+only call rl_reset_terminal in sv_term if we're actually using readline
+
+only run traps on SIGCHLD if job_control != 0
+
+fixed readline so it won't try to pass memory allocated with alloca() to
+a separate function
+
+cleaned up the readline global function and variable namespace, and split
+some more code out from readline.c into separate files
+
+added header files that declare extern functions rather than having those
+extern declarations littered throughout the code
+
+readline now allows ^T to be undone
+
+fixed readline so that characters whose screen representation is > 1
+character (e.g., \354) are erased correctly
+
+the read builtin no longer attempts to split its input into words if
+$IFS is unset
+
+changed the terminating signals that bash catches so they're reset to
+their original handlers when a child is forked
+
+the Gnu malloc library code was upgraded to Gnu libc version 1.06
+
+the Gnu termcap library code was upgraded to Gnu termcap version 1.02
+
+the man page was updated to cover the bind -m option
+
+2. New Features
+
+Bash now notices if it's running setuid or setgid and disables $ENV
+processing and importing shell functions from the environment
+
+New flag: -p/-o privileged, set if the shell is running setuid or setgid.
+Turning this off causes the effective uid and gid to be set to the
+real uid and gid
+
+New machine descriptions for the Intel Paragon, Symmetric 375, NeXT 486,
+and HP running 4.4 BSD
diff --git a/CWRU/old-changelogs/CHANGES.090393 b/CWRU/old-changelogs/CHANGES.090393
new file mode 100644 (file)
index 0000000..f38e5f2
--- /dev/null
@@ -0,0 +1,140 @@
+This file details the changes between the previous release of CWRU bash
+(07/11/93) and this release.
+
+1. Bugs Fixed
+
+Readline's vi-mode once again has TAB bound to completion; entering `posix
+mode' changes it to self-insert
+
+Bash now binds its special emacs-mode functions directly into
+emacs_meta_keymap so that eight-bit character handling does not interfere
+
+Some source restructuring: more extern functions are defined in header files
+and not in C source files
+
+The handling of `line number' inside functions is now more correct and
+closer to reality
+
+Some functions of `general use' were moved to general.c (vfree,
+full_pathname)
+
+A bug that caused some redirections to be applied twice was fixed in
+execute_command_internal (dispose of redirection_undo_list after copying it;
+ditto for exec_redirection_undo_list)
+
+The exit status of a command that is not found is 126, as Posix.2 specifies
+
+More speed improvements -- bash now runs as fast as the SunOS sh on
+Haertel's `shell benchmark'
+
+Instead of returning pointers to -1, bash and the readline, history, and
+glob libraries now return pointers to special `error pointers', which the
+calling code checks for in place of -1
+
+Fixed a problem with canonicalize_pathname which made it get
+confused with xxx/./yyy if yyy was `.' or `..'
+
+Fixes to make bash recognize SVR4.2 and set USGr4_2 for SVR4.2 systems
+
+Fixes to the HP/UX machine descriptions to make alloca work on HPUX_9
+and to avoid `M_MACHINE redefined' warnings
+
+Fixes to the CRAY machine description
+
+Fixes to the mailpath code to make it Posix.2-compliant -- backslash
+may now quote `%' and `?' 
+
+The namespace was further cleaned up, and more functions and variables
+were made static
+
+On systems with S_IFSOCK or S_ISSOCK defined in sys/stat.h, bash checks
+whether fd 0 is a socket to decide whether or not it's being started by
+rshd and to run the startup files
+
+Bash now gives the signal mask it inherits to its children -- previously,
+login shells cleared the signal mask
+
+cpp-Makefile and subst.c both used the `USE_GLOB_LIBRARY' define, but
+with different meanings; subst.c now uses `USE_POSIX_GLOB_LIBRARY'
+
+Fixed pattern substitution so that ${a%%$b}, where b was unset, no longer
+causes a core dump
+
+Changed the `test_exit' define in test.c to no longer use `longjmp' as
+the rhs or a comma-ized expression; this causes core dumps on some
+optimizer/machine combinations
+
+A speed hack in variables.c: if no local variables are defined for a level
+of shell context, kill_all_local_variables does not need to search the
+whole variable hash table when popping a context
+
+Fixed the `bind' builtin so that -m now changes the keymap for all of the
+subsequent operations
+
+Changed some more builtins to use internal_getopt: bind, command, export,
+readonly, declare, typeset
+
+Fixed fc to use the Posix.2 format for listing commands in the
+history list
+
+Changed bg to set `!', as Posix.2 specifies
+
+Fixed ulimit.def to compile if RLIMIT_RSS is not defined,
+as some systems seem to have it
+
+Replaced lib/malloc/alloca.c with the version from emacs 19.  The old one
+lives in alloca.c.old
+
+malloc.c now uses the ANSI C features to `stringize' macro arguments if
+__STDC__ is defined
+
+Fixes to the GNU malloc library from glibc 1.06 and Mike Haertel
+
+Fixes to readline key binding and lookup for Cray systems, which don't
+like the casting that readline does
+
+Fixes to all readline library source files to clean up the code: make sure
+`int'-returning functions use `return x;' rather than `return;', declare all
+arguments, even the `int' ones, and make some functions void.  Cleaned up
+the code formatting a little, too.
+
+The readline completer now double-quotes filenames with special word-break
+characters, so that tilde expansion still works
+
+^C now breaks out of keyboard macros
+
+If being compiled as part of the shell, readline no longer attempts to
+handle SIGTTIN, SIGTTOU, or SIGTSTP
+
+tilde_expansion_failure_hook is now a CPFunction rather than a Function,
+since that's how it's used
+
+Readline vi-mode `change case' function now skips over characters which
+are neither upper nor lower case
+
+Readline vi-mode now allows replacement to be redoable with `.'
+
+2. New Features
+
+A `strict Posix.2' mode, enabled with the -posix startup option or
+setting the POSIXLY_CORRECT variable (see CWRU/POSIX.NOTES for a 
+description of the changed behavior)
+
+`ONESHOT' is now an option in config.h
+
+cpp-Makefile assumes that fixed header files are present if gcc is being
+used
+
+The redirections attached to a function declaration are now part of that
+function, applied when the function is executed, as specified by Posix.2.
+This caused a change to parse.y that resulted in 66 shift/reduce
+conflicts(!)
+
+All of the OP= functions that Posix.2 specifies are now implemented for
+both `let' and arithmetic substitution
+
+The `command' builtin has acquired the Posix.2 `-v' and `-V' options
+(this shares code with the `type' builtin)
+
+A new `bash_builtins' man page, like the `csh_builtins' page on some
+systems
diff --git a/CWRU/old-changelogs/CWRU.chlog.v10 b/CWRU/old-changelogs/CWRU.chlog.v10
new file mode 100644 (file)
index 0000000..9fe2a7a
--- /dev/null
@@ -0,0 +1,3177 @@
+
+[code made available via ftp -- first redistributable version]
+
+                                   9/3
+                                   ---
+lib/readline/history.c
+       - removed stray extern declaration of strrchr()
+       - made get_history_word_specifier a static function
+
+lib/readline/readline.c
+       - removed redundant declaration of rl_visible_stats
+
+execute_cmd.c
+       - make sure that the subshell forked to execute ( xxx yyy ) &
+         sets original_pgrp to -1 so that ( exec xxx yyy ) & does not
+         make the exec builtin restore the original process group
+
+                                   9/4
+                                   ---
+
+builtins/read.def
+       - free `t' *only if* it was assigned the value from
+         string_list_dollar_star when more words are read than variables
+         supplied
+
+variables.c
+       - moved some external function declarations to file scope
+
+test.c
+       - changed the unary_advance and advance macros to use the
+         do { ... } while (0) idiom rather than the comma operator
+
+                                   9/5
+                                   ---
+builtins/getopts.def
+       - if __GNU_LIBRARY__ is defined, change getopt_set_posix_option_order
+         to a macro, because getopt.c will not be compiled in
+
+                                   9/7
+                                   ---
+subst.c
+       - support $POSIX_PEDANTIC as a synonym for $POSIXLY_CORRRECT
+
+builtins/set.def
+       - added support for `set -o posix'
+       - changed list_long_opts to use a define (`MINUS_O_FORMAT') for
+         the format argument to printf
+
+bashline.c, execute_cmd.c, jobs.c, nojobs.c, print_cmd.c, subst.c, test.c,
+variables.c
+       - moved extern declarations from function scope to file scope, or
+         removed extern function declarations already appearing in bash
+         header files
+
+bashline.c
+       - include alias.h if ALIAS defined
+
+lib/readline/history.h
+       - added extern declaration for history_tokenize
+
+shell.c
+       - changed run_startup_files to use the global value of
+         posixly_correct instead of the posix_env argument, which was
+         eliminated
+
+lib/readline/readline.c
+       - changed alphabetic() so we're not casting the return value
+         from strchr() to an int
+
+                                   9/8
+                                   ---
+builtins/ulimit.def
+       - disable the getrlimit stuff if GETRLIMIT_MISSING is defined
+
+machines.h
+       - define GETRLIMIT_MISSING for the Sequent Symmetry
+       - change the M_OS define to `Dynix_ptx' for the Sequent Symmetry
+       - take HAVE_ALLOCA out of the Symmetry definition
+       - removed extra HAVE_ALLOCA define from linux machine description
+
+cpp-Makefile
+       - add $OSTYPE to HOSTTYPE_DECL, defining it as ${OS_NAME}
+
+variables.c
+       - make a variable $OSTYPE analogous to $HOSTTYPE, set from the
+         OSTYPE define from cpp-Makefile
+
+documentation/bash.1
+       - added description of $OSTYPE
+
+parse.y
+       - changed report_syntax_error so that syntax errors set $? to 2
+         like sh and ksh do
+
+lib/readline/funmap.c
+       - added bindings for the non-incremental `search again' functions
+         like those that vi uses
+
+expr.c, general.c, builtins/trap.def, builtins/common.c
+       - removed some extraneous extern function declarations
+
+                                   9/9
+                                   ---
+jobs.h
+       - added some more extern function declarations exported by jobs.c
+
+parse.y, bashline.c, shell.c, builtins/common.c
+       - removed some extraneous extern function declarations
+
+builtins/common.h
+       - fixed the extern declaration of parse_and_execute_cleanup
+
+lib/readline/readline.h
+       - added more extern function declarations for functions in bind.c
+         and complete.c
+       - include tilde.h instead of redeclaring the tilde variables and
+         functions
+
+parse.y
+       - made with_input_from_stream and with_input_from_stdin void
+         functions
+       - made the yy_*_get and yy_*_unget functions static
+
+shell.c
+       - made all the initialize functions static void
+
+trap.h
+       - added extern declarations for the rest of the functions defined
+         in trap.c
+
+trap.c
+       - made initialize_traps a void function, since it has no return
+         value
+
+externs.h
+       - new file, with function declarations not mentioned in other header
+         files.  Included by shell.h.
+
+cpp-Makefile, builtins/Makefile
+       - updated the dependencies to include new header files
+
+bashline.c, execute_cmd.c, jobs.c, general.c, mailcheck.c, make_cmd.c,
+nojobs.c, parse.y, print_cmd.c, shell.c, subst.c, test.c, trap.c,
+variables.c, builtins/common.c, builtins/bind.def, builtins/declare.def,
+builtins/exec.def, builtins/hash.def, builtins/let.def, builtins/source.def,
+builtins/trap.def, builtins/type.def, error.c
+       - removed extern function declarations already in externs.h
+
+lib/tilde/tilde.h, jobs.h
+       - protect against multiple inclusion with #ifdef __XXX_H__
+
+jobs.h
+       - added extern declaration of job_control
+
+general.c
+       - include <tilde/tilde.h> and remove all of the extern declarations
+         for the tilde variables
+
+lib/readline/history.h
+       - added extern declarations for variables exported by history.c
+
+execute_cmd.c
+       - don't bother trying to free the string passed to make_child in
+         the child if the command is not found
+
+bashhist.c, bashhist.h
+       - new files with bash interface to the history library.  Moved code
+         from parse.y, shell.c, subst.c to here.
+
+parse.y, bashline.c, shell.c, subst.c, variables.c
+       - include bashhist.h
+
+error.c, bashhist.c, bracecomp.c
+       - added copyright comment
+
+machines.h
+       - changed hpux_8 and hpux_9 entries to #undef USE_GNU_MALLOC
+         because they have the same YP bug as SunOS
+
+                                  9/10
+                                  ----
+print_cmd.c
+       - fixed the printing of functions declared within functions by
+         making print_function_def and named_function_string responsible
+         for printing the open and close braces and printing the `inside'
+         command rather than overloading print_group_command
+
+builtins/fc.def, builtins/history.def
+       - fixed up to use bashhist.h and removed extra declarations of
+         history stuff
+
+nojobs.c
+       - restore the top-level signal mask on Posix.1 systems after
+         forking in make_child
+       - make all children set the job control signals to SIG_DFL in
+         make_child
+
+                                  9/12
+                                  ----
+documentation/texi2roff-2.0.shar
+       - removed from the source tree
+
+                                  9/13
+                                  ----
+lib/doc-support
+       - new directory for building texindex
+
+lib/doc-support/texindex.c
+       - upgraded to version 1.45 from the texinfo-3.1 distribution
+
+documentation/Makefile
+       - fixed so that features.dvi would build correctly
+
+variables.c, subst.c, braces.c, flags.c, jobs.c, mailcheck.c, parse.y,
+builtins/cd.def, builtins/common.c, lib/readline/history.c,
+lib/readline/isearch.c, lib/readline/readline.c
+       - removed instances of `index' being used as a variable or
+         structure member
+
+cpp-Makefile
+       - pass HAVE_LIMITS_H through to the rest of the build in
+         SYSTEM_FLAGS and LIBRARY_CFLAGS
+
+maxpath.h
+       - removed inclusion of `sysdefs.h', since the only reason it was
+         included was to pick up HAVE_LIMITS_H
+
+                                  9/14
+                                  ----
+bashhist.h
+       - add extern declaration of history_expansion_inhibited, dependent
+         on BANG_HISTORY
+
+execute_cmd.c, builtins/common.c, subst.c, variables.c, parse.y, jobs.c,
+error.c, bashline.c
+       - moved all extern variable declarations to beginning of file,
+         giving them file scope
+
+execute_cmd.c
+       - changed the code so that /dev/null is used as fd 0 for async
+         jobs if the shell itself is not interactive (!interactive_shell)
+         rather than currently interactive (!interactive)
+
+builtins/break.def, builtins/cd.def, builtins/declare.def
+builtins/exit.def, builtins/fc.def, builtins/fg_bg.def builtins/hash.def,
+builtins/kill.def builtins/read.def, builtins/return.def,
+builtins/setattr.def builtins/source.def, builtins/type.def,
+builtins/wait.def
+       - moved all extern variable declarations to beginning of file,
+         giving them file scope
+
+                                  9/15
+                                  ----
+support/mksysdefs
+       - change the test to set SCOREL so that it handles SCO v4.2 and
+         above (everything above and including 4.0)
+
+machines.h
+       - changed M_OS define of `Solaris' to `SunOS5'; added -DSolaris to
+         SYSDEP_CFLAGS for Solaris 2 systems
+
+                                  9/16
+                                  ----
+print_cmd.c
+       - make sure cprintf() null-terminates the_printed_command correctly
+
+test.c
+       - changed the last two stray stat() calls to test_stat()
+       - made test_stat handle emulation of /dev/fd for systems that
+         don't have it: /dev/fd/x returns the result of fstat(x, finfo)
+
+documentation/bash.1
+       - added -b to the usage line for the `set' builtin
+       - added description of `set -o posix'
+       - added -u, -v to the usage line for the `ulimit' builtin
+       - added text describing key bindings in ~/.inputrc to the
+         READLINE section
+
+documentation/texinfo.tex
+       - upgraded to the latest version from the texinfo-3.1 distribution
+
+documentation/features.texi, lib/readline/doc/rluser.texinfo, 
+lib/readline/doc/hsuser.texinfo
+       - a major overhaul and expansion
+
+                                  9/17
+                                  ----
+bashline.c
+       - set rl_vi_comment_begin to "#" when in Posix.2 mode
+
+lib/readline/vi_mode.c
+       - set vi mode comment begin character string to "#" by default
+
+                                  9/18
+                                  ----
+lib/readline/bind.c
+       - added `set keymap' command to the init file variable setting code
+
+documentation/bash.1, documentation/features.texi
+       - added description of `set keymap' command
+
+lib/readline/doc/rluser.texinfo
+       - completed description of init file and keybinding syntax
+
+                                  9/20
+                                  ----
+variables.c
+       - if POSIXLY_CORRECT or POSIX_PEDANTIC are in the initial shell
+         environment, enter `Posix.2 mode'
+
+machines.h
+       - define SCO REQUIRED_LIBRARIES as `-lc_s -lc -lPW' to pick up
+         the functions in libc and libPW from libc (e.g. rename)
+
+
+                                  9/21
+                                  ----
+execute_cmd.c
+       - fixed X_BIT macro to protect its argument with parens in the
+         macro body
+
+maxpath.h
+       - include sys/param.h on Dynix machines if MAXPATHLEN is not
+         defined after including limits.h
+
+general.c
+       - moved the inclusion of <signal.h> on Posix.1 systems up with the
+         rest of the includes
+
+shell.c, lib/readline/complete.c, lib/tilde/tilde.c
+       - don't extern declare getpwuid on Dynix machines
+
+lib/readline/history.c
+       - make sure strlen() is cast to int whenever used in a comparison
+
+                                  9/23
+                                  ----
+lib/readline/readline.c
+       - changed rl_call_last_kbd_macro to disallow recursive macro
+         execution
+
+                                  9/26
+                                  ----
+bashline.c
+       - free rl_vi_comment_begin before assigning to it; make sure to
+         savestring() what we assign to it
+
+                                  9/28
+                                  ----
+lib/readline/search.c
+       - in noninc_search, make the ^W and ^U bindings closer to what
+         Posix.2 specifies.  (The ^W binding still uses unix_word_rubout,
+         which uses whitespace as the word boundary.  This is what
+         ksh-88 does, too.  Posix.2 says to use punctuation characters
+         as word boundaries also.)
+
+lib/readline/vi_mode.c
+       - fixed a bug in rl_vi_delete_to which caused c[wW] to delete one
+         extra character when there were multiple spaces between words.
+         Made the same change to rl_vi_change_to() and rl_vi_yank_to().
+
+lib/readline/complete.c
+       - fixed quoted substring completion so that `\' can quote the
+         quote character
+       - fixed the quoted string completion mechanism by doing the
+         following:
+               o quoted word break characters do not break words for the
+                 completer, so `"abcde"/xhy' no longer sends `/xhy' to
+                 the rest of the completion code
+               o quotes are stripped after the application-specific
+                 completion function is attempted if filename completion
+                 is about to be performed.  If needed, they are added
+                 back later.  This has the benefit of removing unneeded
+                 quotes.
+
+                                  9/29
+                                  ----
+siglist.h
+       - ICL DRS6000s need sys_siglist to be defined as _sys_siglist
+
+machines.h
+       - take the define of sys_siglist out of the DRS6000 entry
+       - added summary of available definitions for SYSDEP_CFLAGS
+       - added new SYSDEP_CFLAGS variable: HAVE_GETPW_DECLS to isc386, sgi,
+         Linux, Dynix descriptions
+       - changed isc386 description: added ISC_SYSDEPS to make the
+         SYSDEP_CFLAGS lines a little cleaner
+
+shell.c, lib/tilde/tilde.c, lib/readline/complete.c
+       - now uses HAVE_GETPW_DECLS define
+
+lib/tilde/tilde.c
+       - removed references to getpwent(), since it's not called
+       - add extern declaration for getpwnam()
+
+lib/readline/complete.c
+       - add a __STDC__ definition for getpwnam() for isc386 machines
+
+cpp-Makefile
+       - updated the dependencies: bashhist.h, bashansi.h, dependencies
+         on the library include files
+
+                                  9/30
+                                  ----
+mailcheck.c
+       - cleaned up the name space by making functions not used by other
+         files static
+       - took out redundant test in check_mail after the goto next_mail_file
+
+variables.c
+       - cleaned up the code a bit by removing unnecessary { ... } pairs
+         enclosing some code blocks
+       - check for $IGNOREEOF at startup, call sv_ignoreeof if imported
+
+parse.y
+       - new variable `ignoreeof', non-zero if we are ignoring EOF, used
+         in handle_eof_input_unit -- keeps us from looking up $IGNOREEOF
+         and $ignoreeof on every EOF character
+
+subst.c
+       - sv_ignoreeof now sets or clears `ignoreeof'
+
+flags.h
+       - changed flags_alist `name' member to be a char, since we only
+         ever use one character
+       - added FLAG_UNKNOWN to be returned by find_flag, since (int *)-1
+         is not portable, and (int *)0 is just as good a value
+
+flags.c
+       - changed find_flag, change_flag_char, change_flag, to take a
+         char as a parameter rather than a char * because we only use
+         one char and this is faster
+
+builtins/set.def
+       - changed calls to find_flag to pass a char instead of a char *
+
+shell.c, jobs.c, builtins/set.def
+       - changed instances of change_flag_char to change_flag, since the
+         two are now equivalent
+
+cpp-Makefile
+       - added BUILTIN_OBJS, made BUILTINS_LIB depend on them
+       - added dependencies for builtin objects on builtin .def files
+       - otherwise tightened up the dependencies
+
+                                  10/1
+                                  ----
+support/mksysdefs
+       - handle SGI Irix 5.x by making SYSDEF="Irix5"
+
+parse.y
+       - made init_yy_io a void function
+
+input.h
+       - moved extern function declarations for parse.y and input.c to
+         this file from externs.h
+
+shell.c
+       - include input.h unconditionally, now that it has extern function
+         declarations
+       - check for $POSIX_PEDANTIC at shell startup, set posixly_correct
+         if found
+
+make_cmd.c
+       - include input.h for the extern function declarations
+
+execute_cmd.h
+       - new file, with extern declarations from execute_cmd.c
+
+subst.c, builtins/type.def, variables.h, builtins/exec.def, builtins/hash.def,
+shell.c, buitlins/common.c, execute_cmd.c, mailcheck.c
+       - include execute_cmd.h
+
+cpp-Makefile, builtins/Makefile
+       - updated the dependencies as a result of the new and changed
+         include files
+
+execute_cmd.h, externs.h, input.h
+       - changed to use the __P(()) method of using prototypes for extern
+         functions
+
+nojobs.c
+       - include command.h
+
+                                  10/5
+                                  ----
+bashline.c
+       - make sure test_for_directory frees the filename if stat(2)
+         fails
+
+lib/readline/vi_mode.c
+       - fixed the `c' command when used with the following motion
+         commands: `^', `0', `%', `b', `B'.  The cursor was being
+         moved one position too far, resulting in too much erasure
+
+parse.y
+       - changed redirection_needing_here_document into a stack of
+         such redirections (redir_stack), indexed by need_here_doc,
+         to handle command lines with >1 redirection, e.g.
+               cat <<a; cat <<b
+       - new function gather_here_documents to run the redirection stack
+
+shell.c
+       - don't import redirection_needing_here_doc; call
+         gather_here_documents() instead
+
+input.h
+       - extern declaration for gather_here_documents()
+
+machines.h
+       - add OPENDIR_NOT_ROBUST to the SYSDEP_CFLAGS for SunOS 5
+
+                                  10/6
+                                  ----
+subst.c
+       - removed the unused `preserve_backslashes' and Q_KEEP_BACKSLASH
+         code in expand_word_internal
+       - fixed memory leak: free `istring' before longjmping out of a
+         bad substitution
+       - fixed memory leak: free `temp' at the bad_substitution label
+       - fixed memory leak: free `value' at the bad_substitution label
+       - removed all calls to longjmp from expand_word_internal: it now
+         returns a pointer to expand_word_error or expand_word_fatal,
+         and the caller is responsible for cleaning up locally allocated
+         resources and calling longjmp with the appropriate parameter.
+         BY CONVENTION: when one of those distinguished values is returned,
+         the `string' variable has already been freed, so the caller must
+         set it to null or otherwise not free it
+       - changed an fprintf (stderr, ...) to report_error in
+         parameter_brace_expand_error
+
+dispose_cmd.c
+       - check for word->word being non-null in dispose_word before trying
+         to free it
+
+                                  10/8
+                                  ----
+variables.c
+       - made new_shell_variable static
+       - made set_var_read_only, set_func_read_only, set_var_auto_export,
+         set_func_auto_export, sort_char_array, maybe_make_export_env,
+         put_command_name_into_env void functions
+
+variables.h
+       - added declarations for all the missing extern functions
+
+builtins/hash.def
+       - include posixstat.h for definition of struct stat to use in
+         function prototype declarations
+
+expr.c                                 
+       - renamed local function `assignment' to `expassign' to avoid
+         clashing with the global `assignment' defined in variables.c
+
+builtins/source.def
+       - include `execute_cmd.h' to pick up extern function declarations
+
+trap.h
+       - protected against multiple inclusion with __TRAP_H__ define
+       - added prototypes with __P
+
+                                  10/11
+                                  -----
+support/mksysdefs
+       - check in /usr/include/ansi and /usr/include/bsd for NeXT 3.x
+         machines
+
+lib/readline/vi_mode.c
+       - include rldefs.h
+
+                                  10/12
+                                  -----
+test.c
+       - changed the `-x' test to call access(2) when AFS is defined,
+         since `stat' doesn't work with AFS
+
+builtins/cd.def
+       - added code to dirs_builtin to implement dirs -n and dirs +n
+
+documentation/bash.1, documentation/features.texi
+       - updated description of `dirs' builtin
+
+                                  10/14
+                                  -----
+lib/readline/bind.c
+       - new function _rl_bind_if_unbound, which binds a key sequence to a
+         readline function if that key sequence is unbound
+
+lib/readline/readline.c
+       - use _rl_bind_if_unbound to try to bind the arrow keys in
+         init_terminal_io
+
+
+                                 10/15
+                                 ----- 
+
+lib/readline/display.c
+       - laid the groundwork for expanding special characters in
+         readline prompt strings: new function expand_prompt
+       - rl_redisplay now has static local prompt variables:
+               local_prompt: expanded prompt string after last newline
+               local_prompt_prefix: expanded prompt string before last newline
+               visible_length: number of visible chars in local_prompt 
+               prefix_length: number of visible chars in local_prompt_prefix
+         changed when rl_display_prompt changes
+
+                                  10/18
+                                  -----
+lib/readline/display.c
+       - new function: rl_expand_prompt, expands the prompt and sets the
+         local display variables to the right values for redisplay.
+       - changed rl_redisplay to use the values computed by rl_expand_prompt
+         if rl_display_prompt == rl_prompt and the old expansion code if
+         otherwise (for instance, if rl_display_prompt is set by rl_message)
+
+lib/readline/readline.c
+       - new function: rl_get_termcap to retrieve the value of any termcap
+         attribute that readline retrieves
+       - made readline_internal static, added appropriate declarations
+       - new global library variable: rl_visible_prompt_length
+       - added call to rl_expand_prompt in readline() before call to
+         rl_initialize
+
+lib/readline/search.c
+       - use rl_visible_prompt_length instead of strlen(rl_prompt) in
+         noninc_search ()
+
+                                  10/19
+                                  -----
+execute_cmd.c
+       - in execute_command_internal, mark an async job with a forced
+         subshell `( xxx ) &' as no longer an interactive shell, no
+         matter whether or not the original shell was interactive.  This
+         allows jobs to be reaped without notification and fixes a mem
+         `leak' (not really a leak, but the shell keeps increasing the
+         size of the jobs table)
+
+                                  10/21
+                                  -----
+machines.h
+       - updated the NEC EWS description with hints from Jim Blandy
+
+                                  10/23
+                                  -----
+
+lib/readline/display.c
+       - changed expand_prompt so that it understands `escape' characters
+         to mark the beginning and end of a sequence of non-visible
+         characters, and takes these into account when returning the
+         length of the prompt string
+
+lib/readline/readline.h
+       - new defines: RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE
+
+                                  10/24
+                                  -----
+
+parse.y
+       - removed check for $NO_PROMPT_VARS from decode_prompt_string()
+
+documentation/bash.1
+       - removed reference to $NO_PROMPT_VARS
+
+                                  10/25
+                                  -----
+machines.h
+       - add -lc_s to the AIX/PS2 REQUIRED_LIBRARIES definition
+
+lib/readline/readline.c
+       - removed the extra space that rl_yank_nth_arg adds before the
+         yanked string
+
+                                  10/26
+                                  -----
+trap.c
+       - set_sigint_handler now sets the SIGINT handler to sigint_sighandler
+         only if `interactive' is set, rather than interactive_shell.  This
+         fixes the `". x", then sigint' bug reported by Vasco Pedro.
+
+general.c
+       - removed `register' from variable declarations in function prologues
+       - some functions now take slightly different arguments:
+               delete_element takes a `char *' as the third argument
+               find_name_in_list takes a `char **' as the second argument
+
+general.h
+       - changed definition of REVERSE_LIST to cast the argument of the
+         call to reverse_list()
+       - added prototypes for all extern functions defined in general.c
+       - definition of BCOPY for use in general.c and elsewhere
+
+shell.c
+       - changed some calls to reverse_list to REVERSE_LIST
+
+shell.h, make_cmd.c, unwind_prot.c, input.c, builtins.h, error.c
+       - include command.h before general.h for declaration of WORD_LIST
+
+execute_cmd.c, expr.c, general.c, input.c, shell.c, unwind_prot.c, parse.y
+       - changed calls to bcopy to call xbcopy instead, and cast the
+         first two arguments to char *
+
+copy_cmd.c
+       - changed calls to bcopy to call BCOPY instead
+
+machines.h
+       - new machine definition for IBM AIX/ESA (OSF/1) from Sergio
+         Gelato
+
+support/mksysdefs
+       - If `uname -m' returns `ESA', the machine is an IBM ESA
+
+lib/posixheaders/memalloc.h
+       - new file, to unify the code to include <alloca.h> if necessary
+         and declare alloca()
+
+config.h, config.h.mini, lib/readline/rldefs.h, lib/readline/history.c,
+lib/readline/isearch.c, lib/readline/search.c, lib/tilde/tilde.c
+       - changed to include "memalloc.h"
+
+builtins/getopt.c
+       - don't include #pragma alloca line on IBM ESA systems
+       - include malloc.h rather than alloca.h for AIX/ESA
+
+support/getcppsyms.c
+       - new defines to support AIX/ESA
+
+cpp-Makefile, builtins/Makefile, lib/readline/Makefile
+       - updated dependency information to include memalloc.h
+
+lib/readline/vi_keymap.c
+       - `\' in vi insertion mode should be mapped to self-insert rather
+         than quoted-insert
+
+                                  10/27
+                                  -----
+nojobs.c
+       - added variable `already_making_children', made a function
+         start_pipeline called from make_child to set it, value cleared
+         in stop_pipeline.  This is how jobs.c treats it.
+
+execute_cmd.c
+       - in the `subshell' code in execute_command_internal, we need to
+         handle a possible `return' if in a function:
+               f()
+               {
+                       echo x | ( read b ; return 1 )
+                       return 0
+               }
+         and treat it like an `exit'
+       - already_making_children is no longer a job-control only variable
+       - made the code that decides whether or not to wait for a child
+         process in the simple_command case of execute_command_internal
+         be the same for job control and non-job control shells, since
+         already_making_children has been put into nojobs.c
+
+lib/readline/display.c
+       - changed the display code to handle invisible characters in the
+         prompt and still wrap lines at the correct column.  wrap_offset
+         is the variable used to keep track of the number of invisible
+         characters in the buffer
+       - changed rl_redisplay to use `screenchars' from readline.c so we
+         don't have to compute (screenwidth * screenheight) on each
+         redisplay
+
+lib/readline/readline.c
+       - new variable `screenchars', set to the total number of characters
+         on the screen we can use (screenwidth * screenheight)
+       - changed rl_refresh_line so that it computes the line that the
+         cursor is on correctly, taking invisible characters into account
+
+                                  10/28
+                                  -----
+general.h
+       - changed declaration of vfree to xfree
+
+general.c
+       - renamed vfree to xfree, since some systems already have a vfree()
+         in libc
+
+execute_cmd.c, jobs.c, builtins/read.def, builtins/common.c
+       - changed vfree to xfree
+
+shell.c
+       - for systems that don't define USG and define ENOTSOCK, try to
+         use getpeername() in issock() to find out whether or not an
+         fd is a socket
+
+documentation/bash.1, documentation/features.texi
+       - documented the new \[ and \] prompt string escape sequences
+
+documentation/bash.1, lib/readline/doc/rluser.texinfo
+       - documented the new `show-all-if-ambiguous' readline variable
+
+lib/readline/complete.c
+       - changed rl_complete to call rl_complete_internal with `!' if
+         the variable `_rl_complete_show_all' is non-zero
+       - changed rl_complete_internal to show all matches if there is
+         more than one and what_to_do is `!'
+
+lib/readline/bind.c
+       - new variable `show-all-if-ambiguous' to control the value of
+         _rl_complete_show_all
+       - changed a call to alloca() in rl_parse_and_bind to a
+         malloc/free pair (`seq' variable), since some systems do not
+         allow alloca'd memory to be passed to a function
+       - did the same alloca -> xmalloc/free in rl_generic_bind
+         (`keys' variable)
+
+                                  10/29
+                                  -----
+dispose_cmd.h, make_cmd.h, command.h
+       - added prototypes for the extern function declarations
+
+variables.c
+       - BSD/386 needs getenv to have a `const char *' argument
+
+make_cmd.c
+       - changed make_until_or_while to a static function
+
+command.h
+       - removed extern declarations for functions in make_cmd.c; those
+         are in make_cmd.h
+
+                                  11/1
+                                  ----
+input.c
+       - make sure that sync_buffered_stream returns a value
+
+test.c
+       - make sure that binary_operator returns a value
+
+                                  11/2
+                                  ----
+cpp-Makefile
+       - added a definition of GCC_LINT_FLAGS and GCC_LINT_CFLAGS to
+         generate lint-like warnings from gcc
+
+siglist.h
+       - cast references to sys_siglist[] in the `strsignal' macro
+         for the benefit of Linux
+
+jobs.c, nojobs.c
+       - changed all absolute references to sys_siglist to call the
+         strsignal macro instead
+
+lib/readline/{readline.c,display.c,signals.c}
+       - _rl_output_character_function is an int
+
+lib/readline/rltty.c
+       - outchar should return an int
+
+general.c
+       - use %ld to printf longs
+
+builtins/trap.def
+       - reordered code and eliminated some brace groups
+
+builtins/ulimit.def
+       - open_files() should return a long
+
+shell.h
+       - include <varargs.h> if HAVE_VARARGS_H is defined, not simply if
+         HAVE_VFPRINTF is defined
+
+parse.y, execute_cmd.c, subst.c, trap.c, jobs.c
+       - make sure that all function parameters are declared explicitly
+         and not defaulted to int
+
+builtins/fg_bg.def
+       - fixed a bug where last_asynchronous_pid could be set to a random
+         value if an unknown job or a non-job-control job was selected
+
+test.c
+       - added a missing `%s' to a call to test_syntax_error
+
+cpp-Makefile
+       - renamed `endian.h' to `bash-endian.h'; it seems that linux and
+         gnu libc use it in /usr/include.  What a pain in the ass.
+
+                                  11/4
+                                  ----
+machines.h
+       - add `#define HAVE_VARARGS_H' to the Linux machine description;
+         the auto-configuration process is unable to find it in the gcc
+         private include directories
+
+                                  11/5
+                                  ----
+cpp-Makefile
+       - COMPRESS_EXT should be `.gz'
+
+general.h
+       - have the BCOPY define for USG machines use `memmove' rather than
+         `memcpy', since that handles overlapping objects correctly
+
+lib/readline/display.c
+       - fixed the line updating code that checked whether a new line was
+         shorter or had fewer invisible characters that the visible line,
+         and called clear_to_eol with the right value and only in the
+         right cases
+
+machines.h
+       - added separate machine descriptions for NetBSD and FreeBSD
+
+builtins/command.def
+       - don't try to call confstr() on NetBSD
+
+                                  11/6
+                                  ----
+machines.h
+       - define HAVE_BCOPY for sgi
+       - define HAVE_GETHOSTNAME for Linux and HPUX machines later than
+         hpux 6.2
+
+general.h
+       - remove the `if defined (sgi) from the clause that defines BCOPY
+
+general.c
+       - use new HAVE_BCOPY and HAVE_GETHOSTNAME defines instead of the
+         OS-specific symbols used before
+
+                                  11/8
+                                  ----
+machines.h
+       - for i386 machines running aix/ps2, use USE_TERMCAP_EMULATION,
+         since the terminfo database is more up-to-date than termcap
+
+lib/readline/complete.c
+       - make sure that X_OK is defined for the VISIBLE_STATS code
+
+config.h, builtins/echo.def
+       - added a DEFAULT_ECHO_TO_USG option for the echo builtin
+
+lib/readline/rldefs.h
+       - Xenix 2.2 systems, while mostly USGr3, do not have `sighold'
+         and related functions
+
+lib/readline/isearch.c
+       - added a variable `prev_line_found' to keep the incremental
+         searches from finding the same line two or more times in a
+         row
+
+support/getcppsyms.c
+       - recognize `_M_XENIX' and `mc68k32' symbols from cpp
+
+tests/run-dollar-at-star-test
+       - use `../bash' to point at the bash executable rather than
+         `../../sun4/bash'
+
+general.h
+       - some systems have a `strerror' define, so we need to protect
+         the extern function declaration
+
+trap.h
+       - use SIG_DFL rather than NSIG as the test of whether or not to
+         include <signal.h>, since Posix.1 does not require NSIG
+
+                                  11/9
+                                  ----
+subst.c
+       - new function get_word_from_string to slice a field off the front
+         of a string and skip trailing separators according to $IFS
+
+builtins/read.def
+       - changed read_builtin to use get_word_from_string to `incrementally'
+         do word splitting on the line read so that if fewer variable names
+         are given than words read, the separators in the original line are
+         preserved.  This makes `read' Posix.2 compliant.
+
+                                  11/10
+                                  -----
+cpp-Makefile
+       - add a sentinel file `parser-built' for y.tab.c and y.tab.h to
+         depend on, since there's no rule for telling make how to build
+         y.tab.h
+
+shell.c
+       - removed the #ifdef AUX code that sets up a 4.2 compatible
+         environment in favor of using the -ZP option to cc to create
+         a Posix executable (AUX 3.0)
+
+jobs.c
+       - changed sigwinch_sighandler so that it saves the window size
+         struct with the new values in shell_tty_info.c_winsize on AIX PS/2
+         Since readline calls the old sigwinch handler, this code should
+         be called no matter when the signal is received
+
+support/mksysdefs
+       - add code to define AIX_13 on AIX PS/2 version 1.3 machines
+
+machines.h
+       - there are different SYSDEP_CFLAGS and REQUIRED_LIBRARIES for
+         AIX PS/2 1.2 and 1.3, so use the AIX_13 define to differentiate
+
+                                  11/11
+                                  -----
+execute_cmd.c
+       - speedups and fixes for here document processing in
+         do_redirection_internal: don't do string processing we can
+         avoid, use stdio to help with write buffering if we're
+         expanding the document, close some file descriptor leaks
+
+make_cmd.c
+       - speed up gathering here documents: avoid expensive calls to
+         strncmp when possible, avoid a stupid strcpy when stripping
+         leading tabs, use BCOPY instead of strcpy
+
+print_cmd.c
+       - made varargs and non-varargs versions of cprintf() as similar
+         as possible
+       - redid the_printed_command_resize() to be a little smarter about
+         allocating memory
+
+subst.c
+       - sped up string_list_internal by allocating all the necessary
+         space before copying rather than using xrealloc, using BCOPY
+         and an `end ptr' instead of strcat, trying not to call strlen
+         to get the separator length
+       - sped up sub_append_string by using BCOPY instead of strcat,
+         being smarter about memory allocation, and cutting down calls
+         to strcpy
+       - sped up expand_string_internal by not calling the
+         make_word/dispose_word pair, but by filling in a local
+         WORD_DESC, short-circuiting if the string is null or empty
+       - don't bother trying to split words in expand_string_leave_quoted
+         if expand_string_internal returns a null list
+       - ditto for dequoting in expand_string_unsplit
+
+lib/readline/vi_mode.c
+       - removed `w' and `W' from the list of characters that do not
+         require the point to be moved after a call to rl_vi_domove
+         in rl_vi_delete_to (`d') and rl_vi_yank_to (`y').  Only the
+         `c' command (rl_vi_change_to) requires this behavior
+
+                                  11/12
+                                  -----
+subst.c
+       - make sure all places which call expand_word_internal are
+         prepared to deal with error returns (expand_word_error
+         and expand_word_fatal) by adding a convenience function
+         call_expand_word_internal that performs the call and deals
+         with the possible error returns.  This keeps the shell
+         from dumping core on some errors
+
+lib/readline/vi_mode.c
+       - make sure <sys/types.h> is included before rldefs.h
+
+parse.y
+       - changed read_a_line to use and re-use a static line buffer
+
+make_cmd.c
+       - no longer need to free full_line, since read_a_line (called
+         from read_secondary_line), does not allocate a new one on
+         each call
+
+builtins/psize.c, alias.c
+       - need to include command.h before general.h
+
+                                  11/15
+                                  -----
+documentation/features.texi, lib/readline/doc/{hsuser,rluser}.texi
+       - fixed some spelling errors and typos
+
+endian.c
+       - include <sys/types.h> for size_t
+
+Makefile.inc
+       - new file, included in cpp-Makefile, providing biolerplate Gnu
+         make definitions
+
+cpp-Makefile
+       - include Makefile.inc
+       - added `distclean', `realclean' targets as per Gnu coding
+         standards
+
+                                  11/17
+                                  -----
+cpp-Makefile
+       - `make install' now installs the documentation in $(mandir) and
+         $(infodir)
+       - `make documentation' now passes $(MFLAGS) to the sub-make
+
+documentation/Makefile
+       - now has an `install' target
+
+config.h
+       - RESTRICTED_SHELL is no longer automatically defined
+
+support/mksysdefs
+       - Intel paragons (uname -m = paragon) need MAKE_ANSI set to true
+
+lib/readline/history.c
+       - create the history file with mode 0600, since it's supposed to
+         be private information
+
+builtins/fc.def
+       - make sure we put in the tab and `*' only if the line is actually
+         being listed to stdout rather than to a file for reexecution
+
+                                  11/17
+                                  -----
+machines.h
+       - fixed a typo in the hpux machine description
+       - added some SYSDEP_CFLAGS to the __BSD_4_4__ description
+
+README
+       - corrected mail address for bash-maintainers
+
+jobs.h
+       - don't declare fork (), getpid (), and getpgrp () on __BSD_4_4__
+
+                                  11/18
+                                  -----
+subst.c
+       - fix to string_list_internal to make it return a null string if
+         handed a null list
+
+parse.y
+       - fix to find_reserved_word: `word' is declared as the argument, but
+         `token' is what's used in the body
+
+lib/malloc/alloca.c
+       - Crays need to define _getb67() as CRAY_STACKSEG_END
+
+machines.h
+       - ISC machines should be using USE_TERMCAP_EMULATION
+
+                                  11/19
+                                  -----
+lib/readline/Makefile, lib/tilde/Makefile, lib/glob/Makefile, cpp-Makefile
+       - change instances of `make' in recipes to `$(MAKE) $(MFLAGS)'
+
+machines.h
+       - SunOS4 needs `OPENDIR_NOT_ROBUST'
+       - recognize a Motorola M88100 if m88k and USGr4 are defined, since
+         support/mksysdefs sets SYSDEF to USGr4 rather than M88100 for
+         the Motorola V.4
+       - changes to the ISC entry to handle ISC version 4 as well as
+         version 3 using cc and gcc to compile
+
+shell.c
+       - fixed a typo (__POSIX_VERSION -> _POSIX_VERSION)
+       - fixed a problem with reset_terminating_signals which caused the
+         wrong signal numbers to be checked for being trapped or
+         handled specially
+
+lib/readline/vi_keymap.c
+       - ^H in movement mode should by default be mapped to rl_backward
+       - delete (^?) should be unbound in the default movement mode keymap
+
+lib/readline/vi_mode.c
+       - rl_vi_last_arg should insert a space before inserting the last
+         argument, according to Posix.2
+
+getcwd.c
+       - correctly declare the second argument as a size_t if __STDC__
+         is defined
+
+                                  11/20
+                                  -----
+builtins/fc.def
+       - go back to the ad-hoc option parsing style, because the builtin
+         getopt does not handle things like `fc -l -10' correctly
+
+support/mksysdefs
+       - fixed a typo problem defining $UnicosMachine that left a comment
+         unclosed
+
+lib/malloc/alloca.c
+       - bug fix from Bill Jones for CRAY_STACKSEG_END define
+
+config.h, execute_cmd.c
+       - fix for CRAY and defining `word'
+
+machines.h
+       - Crays need to define OPENDIR_NOT_ROBUST
+
+bashtypes.h
+       - sys/types.h with handling for multiple inclusion and Cray
+         peculiarities
+
+execute_cmd.c, make_cmd.c, parse.y, subst.c
+       - include `bashtypes.h' rather than <sys/types.h>
+
+                                  11/22
+                                  -----
+machines.h
+       - add definitions of CRAY_STACKSEG_END for Cray XMP and YMP
+       - removed OLD_CRAY_DESCRIPTION stuff
+
+lib/readline/rldefs.h
+       - encapsulate CRAY peculiarities with casting pointers to ints
+         inside two defines: FUNCTION_TO_KEYMAP and KEYMAP_TO_FUNCTION
+
+lib/readline/bind.c, lib/readline/readline.c
+       - change code to use FUNCTION_TO_KEYMAP and KEYMAP_TO_FUNCTION
+
+maxpath.h
+       - include <sys/param.h> on the convex, but not on bsdi
+
+newversion.c
+       - overhauled and cleaned up
+       - added the `-patch' argument to set the patch level of the shell
+       - look in `.patchlevel' for the patch level and write it out as
+         PATCHLEVEL
+
+version.c
+       - new variable patch_level
+
+shell.c
+       - the version string is now `dist.patch(build)'
+       - new function shell_version_string returns a pointer to the
+         version string, show_shell_version changed to use it
+
+variables.c
+       - bind $BASH_VERSION to the value of shell_version_string ()
+
+                                  11/23
+                                  -----
+machines.h
+       - SCO machines now include -DPGRP_PIPE in the SYSDEP_CFLAGS define
+       - HPUX_9 needs an #undef HAVE_RESOURCE; it appears that they've
+         finally removed getrusage
+
+trap.c
+       - signal_name should return an error when passed NSIG
+
+parse.y
+       - add AND_AND and OR_OR to the list of tokens which are not followed
+         by a semicolon
+       - decrement current_command_line_count if pre_process_line returns
+         a null or empty string, otherwise the next input line may be
+         combined with the previous line inappropriately
+
+                                  11/24
+                                  -----
+machines.h
+       - the KSR/1 section should be delimited by `__ksr1__', added some
+         SYSDEP_CFLAGS to that description
+
+support/mksysdefs
+       - quote all the arguments to expr
+
+support/getcppsyms.c
+       - recognize and pass on `__ksr1__'
+
+lib/readline/bind.c
+       - new inputrc variable `output-meta', which means output meta
+         chars without converting them to M- sequences
+
+lib/readline/readline.c
+       - new variable `_rl_output_meta_chars' to hold value of
+         `output-meta', initially off
+       - slight efficiency improvement to rl_insert_text, rl_forward,
+         rl_backward
+       - changed the order of args to rl_kill_text in rl_unix_word_rubout
+         so that multiple words can be killed and yanked out in the
+         `right' order
+
+lib/readline/display.c
+       - changes to use the value of `_rl_output_meta_chars' to decide how
+         to output characters with the eighth bit set
+
+documentation/bash.1, lib/readline/doc/rluser.texinfo
+       - documented new readline `output-meta' variable
+
+lib/readline/complete.c
+       - make the replacement of typed text by a completion match be a
+         single undoable event
+
+builtins/type.def
+       - call user_command_matches specifying FS_EXEC_ONLY as the search
+         criteria.  This keeps test from finding directories
+
+bashhist.c
+       - changed maybe_save_shell_history so that if the history has
+         been stifled then the history file is replaced with the current
+         history list
+
+                                  11/29
+                                  -----
+builtins/exec.def
+       - if the shell is restricted, exec is not allowed
+
+cpp-Makefile
+       - more changes for GNU standards: VPATH, libdir, srcdir
+
+jobs.h
+       - remove machine-specific undefining of HAVE_WAIT_H
+
+machines.h
+       - cadmus systems need to #undef HAVE_WAIT_H
+       - hpux_usg and hpux_6 systems need to #undef HAVE_WAIT_H
+       - added a section for `Irix5' to the sgi section
+
+documentation/Makefile
+       - fixed up the install for bash_builtins.1 so that it sets the .so
+         path correctly
+
+shell.c
+       - renamed issock to isnetconn and made its inclusion unconditional
+       - added a check for S_ISCHR for SVR4 and SVR4.2 systems to isnetconn
+
+subst.c
+       - added code so that `history_control=ignoreboth' works
+
+documentation/bash.1, documentation/features.texi
+       - added a description of `ignoreboth' to the text describing
+         `history_control'
+
+                                  11/30
+                                  -----
+input.c
+       - don't print an error message in check_bash_input if the fnctl
+         to dup the file descriptor fails unless the file descriptor
+         is already active
+
+jobs.c, nojobs.c
+       - set bash_input.location.buffered_fd to -1 when setting
+         default_buffered_input to -1 in make_child.  This fixes
+         the `( echo hi 1>&3 ) 3>&1 >/dev/null' spurious error message
+
+shell.c, error.c
+       - removed the automated bug report code
+
+support/bashbug.c
+       - is no more
+
+Makefile
+       - added GNU boilerplate definitions
+
+support/bashbug.sh, support/mkbashbug
+       - new files for a BSD sendbug-like bug reporting shell script
+
+cpp-Makefile
+       - changes to use $(SUPPORT_SRC) instead of $(SDIR) under some
+         circumstances
+       - removed references to support/bashbug.c
+       - new target to make bashbug from $(SUPPORT_SRC)/bashbug.sh using
+         $(SUPPORT_SRC)/mkbashbug
+       - bashbug is now created by default
+       - don't build endian.aux or create bash-endian.h if HAVE_WAIT_H
+         is defined, because it will end up being unused anyway
+
+machines.h
+       - add OPENDIR_NOT_ROBUST to the isc386 description
+
+signames.c
+       - make the signal_names array 2 * NSIG long to hack around HP/UX
+         misfeature
+
+builtins/test.def
+       - fixed the help text for -t to note the the fd argument is not
+         optional
+
+                                  12/1
+                                  ----
+builtins/common.c
+       - changed parse_and_execute so that it no longer unconditionally
+         sets `interactive' to 0.  It is now the responsibility of callers
+         of parse_and_execute to set it how they want, and reset it if
+         necessary
+
+shell.c, subst.c, builtins/source.def
+       - changed the functions that call parse_and_execute to manage the
+         value of `interactive'
+
+shell.c
+       - changed maybe_execute_file so that it takes a second argument
+         saying whether or not to force the value of `interactive' to 0
+       - changed all calls to maybe_execute_file to add a second arg
+
+builtins/fc.def, builtins/exit.def
+       - changed all calls to maybe_execute_file to add the second arg
+         Now background jobs re-run with `fc -s' echo the job number
+
+externs.h
+       - changed the function prototype for maybe_execute_file
+
+                                  12/2
+                                  ----
+execute_cmd.c
+       - rewrote the auto-resume code in execute_simple_command for clarity
+       - added the `substring' value for auto_resume to cause a command that
+         matches a substring of a stopped job to restart that job
+
+documentation/bash.1, documentation/features.texi
+       - added a description of the possible values for `auto_resume' and
+         their effects on the shell's behavior
+
+machines.h
+       - added a generic desription for SVR4 running on the sparc from
+         Ian Stewartson
+
+Makefile
+       - added a command to the bash-Makefile target that will remove
+         bash-Makefile and (hopefully) stop the make if something happens
+         and bash-Makefile is created with zero length
+
+                                  12/3
+                                  ----
+machines.h
+       - add -DOPENDIR_NOT_ROBUST to the SYSDEP_CFLAGS for SCO
+       - if compiling with gcc on SCO, link with -lc_s and -lc in
+         REQUIRED_LIBRARIES
+
+                                  12/6
+                                  ----
+builtins/source.def
+       - new variable `sourcelevel' which is incremented each time `.'
+         is called and decremented before source_builtin returns
+
+variables.c
+       - find_variable should call find_variable with a second parameter
+         of 1 if `builtin_env' is non-null, so it will search it.  This
+         ensures that all builtins inside a script read with `.' with a
+         temporary environment will get the right values
+
+subst.c
+       - fix for get_word_from_string: white space should be removed from
+         the beginning of the string if $IFS is " \t\n"
+
+execute_cmd.c
+       - in `Posix.2 mode', redirections should not perform filename
+         expansion when the shell is not interactive
+
+                                  12/7
+                                  ----
+support/getcppsyms.c
+       - recognize `__i386__'
+
+lib/readline/bind.c
+       - only free and reassign `last_readline_init_file' if it has
+         changed (`filename' points to something different) in
+         rl_read_init_file
+
+builtins/ulimit.def
+       - add a `$DEPENDS_ON !MINIX' line so that this won't be built
+         under MINIX
+
+config.h
+       - Minix machines need JOB_CONTROL undefined
+
+cpp-Makefile
+       - don't define libraries with absolute pathnames; use -llibname
+         instead
+       - make sure MALLOC_LIBRARY is defined even if the Gnu malloc is
+         not being used for the benefit of `LD_HAS_NO_DASH_L'
+
+general.c
+       - use a `TIMEVAL_MISSING' define to decide whether or not to
+         try to print a struct timeval * rather than simply `USG'
+
+lib/readline/parens.c
+       - don't try to include <sys/time.h> unless FD_SET is defined
+
+lib/readline/vi_keymap.c
+       - fix incorrect cast of rl_abort in vi_movement_keymap
+
+signames.c
+       - make sure NSIG is defined
+
+siglist.c
+       - include `trap.h' to pick up definition of NSIG if it's undefined
+
+siglist.h
+       - minix uses _sys_siglist and does not need an external declaration
+         for it
+
+                                  12/8
+                                  ----
+lib/readline/readline.c
+       - add `ks' and `ke' to the termcap attributes that readline retrieves
+
+lib/readline/rltty.c
+       - new function `control_keypad' to enable and disable keypad keys.
+         Some systems need this before the arrow keys will work
+       - call control_keypad to enable and disable the keypad from the
+         terminal prep and deprep code
+
+                                  12/9
+                                  ----
+support/mksysdefs
+       - added code a la trn `Configure' to search a list of include
+         directories for each .h file of interest.  Done by defining a
+         variable containing the code fragement we want to execute and
+         calling `eval' on this string for each file
+
+lib/readline/bind.c
+       - slightly changed the filenames used by rl_read_init_file.  Now
+         the filename used is the first non-null file from this list:
+               1. the filename used for the previous call
+               2. the value of the shell variable `INPUTRC'
+               3. ~/.inputrc
+
+documentation/bash.1
+       - added descriptions of INPUTRC to the shell variables and
+         readline sections
+
+documentation/features.texi
+       - added a description of INPUTRC to the shell variables section
+
+lib/readline/doc/rluser.texi
+       - added description of the INPUTRC environment variable
+       - changed instances of ~/.inputrc to the more generic `init file'
+         or `inputrc file'
+
+lib/readline/complete.c
+       - added #defines for the possible values of `do_replace' rather
+         than relying on magic numbers
+       - if a completion that needs double quotes starts with a tilde,
+         rl_complete_internal now performs tilde expansion before
+         quoting the string, since the shell allows double quotes to
+         inhibit tilde expansion
+
+                                  12/10
+                                  -----
+lib/readline/readline.c
+       - new function to kill the whole line no matter what point is:
+         rl_kill_full_line ()
+
+lib/readline/readline.h
+       - extern declaration for rl_kill_full_line ()
+
+lib/readline/funmap.c
+       - rl_kill_full_line is available as `kill-entire-line'
+
+cpp-Makefile
+       - remove `.machine' when `make clean' run
+
+subst.c, subst.h
+       - made expand_string_leave_quoted static again
+
+                                  12/14
+                                  -----
+shell.c
+       - use HAVE_SOCKETS define to decide whether to include <sys/socket.h>
+         and call getsockname(); defined automatically for non-USG systems
+         if ENOTSOCK is defined
+
+                                  12/15
+                                  -----
+bashline.c, flags.c, flags.h, jobs.c, subst.c, builtins/common.c,
+builtins/cd.def
+       - changed `follow_symbolic_links' to `no_symbolic_links', with an
+         opposite meaning
+
+flags.c, flags.h
+       - new shell option, -P/-o physical set if no_symbolic_links is set
+       - changed a sequence of `if' statements into a switch statement in
+         change_flag
+
+documentation/bash.1, documentation/features.texi
+       - added documentation for the -P/-o physical option
+
+builtins/cd.def
+       - follow_symbolic_links is now declared in flags.c and declared
+         extern here
+
+builtins/set.def
+       - code to set and get the value of -P/-o physical
+       - fixed up the help text and short documentation string
+       - made `set -?' print a usage message
+
+subst.c
+       - made sv_nolinks set the new variable `no_symbolic_links'
+
+                                  12/17
+                                  -----
+machines.h
+       - add -DUSG to HPUX_CFLAGS
+       - hpux 9 does not need -lPW and can use the gnu malloc if gcc
+         is being used
+
+config.h
+       - remove the code that defines USG for HPUX, Xenix, and UNIXPC
+         in favor of putting it into the machines.h entry
+
+                                  12/19
+                                  -----
+flags.h
+       - added prototypes for the extern function declarations from flags.c
+
+*.h
+       - added copyrights to the include files which were missing them
+
+lib/readline/vi_mode.c
+       - rl_vi_yank_nth arg inserted the space in the wrong spot before
+         yanking the last argument
+       - removed the call to rl_vi_insertion_mode because of changes to
+         rl_yank_nth_arg
+
+lib/readline/readline.c
+       - changed rl_yank_nth_arg so that vi mode inserts a space in the
+         right spot
+       - fixed rl_yank_nth_arg so that yanking into an empty line does
+         not corrupt the buffer
+
+lib/readline/search.c
+       - fixed noninc_search so that ^H and RUBOUT call rl_rubout
+         explicitly
+
+bashline.c
+       - fix for operate_and_get_next to make ^O work on the most
+         recent line even if the history is unstifled.  From Seth
+         Robertson.  XXX - may not be right
+
+parse.y
+       - set interactive to 0 before calling parse_and_execute in
+         execute_prompt_command to stop infinite recursion through
+         this function
+
+shell.c
+       - moved the code that executes PROMPT_COMMAND to parse_command
+
+parse.y
+       - removed the code that executes PROMPT_COMMAND from read_token
+         to avoid confusing non-reentrant versions of yacc
+       - made execute_prompt_command global, not static
+
+input.h
+       - new declaration for execute_prompt_command 
+
+jobs.c
+       - made give_terminal_to return -1 if tcsetpgrp fails
+       - initialize_jobs now prints a message if job_control ends up being
+         set to 0
+
+support/mkmachtype
+       - shell script stolen from emacs 19 that attempts to output the
+         `GNU-style' machine type, e.g. sparc-sun-sunos4.1.2.  Named
+         `mkmachtype' because I envision people assigning its output to
+         a MACHTYPE variable
+
+
+                                  12/20
+                                  -----
+execute_cmd.c
+       - if a command is found in the temporary $PATH, don't add it to
+         the hash table
+
+error.c
+       - changed report_error so that the script name is echoed instead
+         of the shell name if the shell is not interactive
+
+                                  12/22
+                                  -----
+machines.h
+       - made the Sun description unconditionally #undef USE_GNU_MALLOC
+         because memory access bugs are legion in libc in SunOS 4.x and 5.x
+
+jobs.c
+       - disabled printing an error message when the tcgetattr in
+         get_tty_state() fails
+
+                                  12/27
+                                  -----
+cpp-Makefile, jobs.h
+       - renamed bash-endian.h to bash_endian.h
+
+machines.h
+       - NeXT machines need to #undef HAVE_DIRENT_H, since it requires
+         ANSI/POSIX defines that make the rest of the compilation fail
+       - SGI irix 5.x machines need -DNO_SBRK_DECL in SYSDEP_CFLAGS
+       - machine descriptions for OSF/1 running on i386 and MIPS machines
+         from Michael Meissner
+
+                                  12/28
+                                  -----
+expr.c
+       - fixed so that blank expressions evaluate to 0 rather than an
+         error ($[    ] or $((    )))
+
+lib/readline/readline.c
+       - new variable `_rl_bell_preference' replacing _rl_prefer_visible_bell
+       - changed ding() to use _rl_bell_preference
+
+lib/readline/rldefs.h
+       - definitions for NO_BELL, AUDIBLE_BELL, and VISIBLE_BELL
+
+lib/readline/bind.c
+       - changed rl_variable_bind to parse the `bell-style' variable and its
+         possible values (`none', `audible', or `visible'), keeping
+         `prefer-visible-bell' for backwards compatibility
+
+documentation/bash.1, lib/readline/doc/rluser.texinfo
+       - added descriptions of the `bell-style' and `expand-tilde'
+         readline variables
+
+general.c
+       - changed set_signal_handler for posix systems to attempt to
+         restart all interrupted system calls execept for SIGALRM
+
+trap.c
+       - changed restore_signal to use set_signal_handler() instead of
+         signal()
+       - added a new function set_signal_ignored to set the SIG_HARD_IGNORE
+         flag for a particular signal
+
+execute_cmd.c
+       - call set_signal_ignored for SIGINT and SIGQUIT in the child if
+         the command is asynchronous after calling restore_original_signals,
+         since restore_original_signals will undo work done by make_child
+         done in a new function setup_async_signals
+
+execute_cmd.h
+       - extern declaration for setup_async_signals
+
+subst.c
+       - call setup_async_signals when making the child for process
+         substitution
+
+jobs.c, nojobs.c
+       - removed code from make_child that sets SIGINT and SIGQUIT to
+         SIG_IGN, since setup_async_signals now does that
+
+shell.c
+       - let throw_to_top_level call longjmp with DISCARD if the shell
+         is an interactive shell, but not yet initialized
+
+                                  12/29
+                                  -----
+config.h
+       - define PROCESS_SUBSTITUTION if HAVE_DEV_FD is defined, even if
+         MKFIFO_MISSING is also defined
+
+execute_cmd.c
+       - close pipes created using /dev/fd for process substitution at
+         the same time as the pipes for conventional piping are closed
+
+subst.c
+       - when the /dev/fd list is initialized, clamp the total number of
+         file descriptors at 256, but make sure there is room enough to
+         store a bit for the fd passed to add_fifo_list
+
+                                  12/30
+                                  -----
+lib/readline/readline.c
+       - change a strncpy() in rl_delete_text to a for loop, since some
+         versions of strncpy can't handle overlapping arguments
+
+lib/readline/chardefs.h
+       - definition for digit_value(x)
+
+lib/readline/history.c
+       - changed calls to sscanf followed by an empty for loop that consumes
+         the digits to a for loop that computes the value as it goes along
+         in get_history_word_specifier()
+       - added `x*' and `x-' history word designators from csh
+       - added new `&' modifier to repeat previous substitution
+       - experimental implementation of `q' modifier to quote substituted
+         words by calling single_quote on the substituted string
+
+lib/readline/history.c, builtins/fc.def
+       - changed a loop using strncmp() to find one string in another for
+         substitution to test the current character against the first
+         character of the pattern before calling strncmp()
+
+documentation/bash.1, lib/readline/doc/hsuser.texinfo
+       - documented the new history word designators
+       - documented new `&' and `q' history modifiers
+
+                                   1/1
+                                   ---
+parse.y
+       - broke the code that parses `( ... )' subshells out into its
+         own grammar production
+
+lib/readline/history.c
+       - rearranged some code to get rid of gotos and make the intent
+         clearer
+       - fixed a bug in history_truncate_file that tried to write to
+         a file opened O_RDONLY
+       - changed a stat-open in history_truncate_file into an open-fstat
+         pair
+       - removed gotos in history_search_internal
+       - changed straight strncmp() calls trying to find history line
+         matches to check the first character before calling strncmp in
+         history_search_internal
+       - changed a call to stat after an open (!) to fstat on the
+         returned file descriptor
+       - cleaned up the code in get_history_event
+       - cleaned up some code in get_history_word_specifier
+       - cleaned up some code and removed extra function calls in
+         history_arg_extract
+       - changed history_arg_extract to malloc enough space for the
+         entire string at one time, instead of doing xrealloc in a
+         loop
+       - cleaned up the code in history_tokenize, removing gotos and
+         other spaghetti constructs
+       - replaced a call to sprintf with assignment statements and a call
+         to strcpy in history_expand
+
+cpp-Makefile
+       - changed the `INDEX' target to a `TAGS' target
+
+lib/readline/emacs_keymap.c
+       - added a default binding for ESC-ESC to rl_complete, like ksh emacs
+         mode editing
+
+                                   1/3
+                                   ---
+machines.h
+       - make sure ISC_POSIX is defined as nothing when using gcc on isc386
+
+parse.y
+       - made token_to_read, current_token, last_read_token,
+         token_before_that, EOF_reached, shell_input_line,
+         shell_input_line_*, token, token_buffer_size all static vars
+       - made prompt_again return immediately if the shell is not
+         currently interactive
+       - made yylex call prompt_again only if there is no token_to_read
+         and the shell is currently interactive
+
+jobs.c
+       - changed the NeXT || alliant define to use RLOGIN_PGRP_BUG
+       - use TERMIOS_LDISC define for systems with line discipline field
+         in struct termios
+
+shell.c
+       - use RLOGIN_PGRP_BUG instead of NeXT to fix machines that get
+         started without a controlling terminal
+
+machines.h
+       - added -DRLOGIN_PGRP_BUG to SYSDEP_CFLAGS for NeXT and alliant
+       - added -DTERMIOS_LDISC to SYSDEP_CFLAGS for Ultrix, Sun OS 4,
+         and aixpc
+
+support/mksysdefs
+       - look for sys/param.h, define HAVE_SYS_PARAM if found
+
+cpp-Makefile
+       - pass -DHAVE_SYS_PARAM via SYSTEM_FLAGS if it's found by mksysdefs
+
+maxpath.h
+       - include <sys/param.h> if HAVE_SYS_PARAM is defined
+
+lib/readline/history.c
+       - got rid of the get_which label in get_history_event
+       - got rid of the event_not_found label in history_expand
+       - new function hist_error, which takes care of printing history
+         expansion errors
+
+                                   1/4
+                                   ---
+lib/readline/history.c
+       - split the actual history expansion code out of history_expand into
+         history_expand_internal
+       - got rid of the do_add and add_char labels in history_expand
+       - history_expand now returns 2 if the `p' modifier was given and the
+         caller should just print the results
+       - new function `quote_breaks' to implement the `x' modifier
+
+bashhist.c
+       - if history expansion fails, make sure the error message is
+         printed in a standard way by calling internal_error
+       - print the results of history_expand and return NULL if
+         history_expand returns 2
+
+                                   1/5
+                                   ---
+lib/readline/history.c
+       - rearranged some code in the `s' and `&' cases of the switch in
+         history_expand_internal, added the GET_SUBST_PATTERN macro
+
+                                   1/6
+                                   ---
+tests/*
+       - cleaned up the directory, made a runnable regression test suite
+
+cpp-Makefile
+       - added a `tests' target that runs all of the tests with a newly-
+         built bash
+
+subst.c
+       - made process substitution work only when unquoted
+
+bashhist.c
+       - new function history_number to return the history number of a
+         command
+
+bashhist.h
+       - extern declaration for history_number
+
+parse.y
+       - changed the `!' and `\!' code in decode_prompt_string to use
+         history_number
+       - replaced calls to sprintf/savestring with calls to itos()
+
+variables.c
+       - new dynamic variable $HISTCMD is current history number (what
+         you get with \! in a prompt string)
+
+documentation/bash.1
+       - description of $HISTCMD
+
+                                   1/7
+                                   ---
+
+execute_cmd.c
+       - new variable stdin_redir, incremented for subshells if stdin has
+         been redirected, saved for children so we don't redirect /dev/null
+         to fd 0 if it has already been the subject of a redirection.  Makes
+         bash more sh-compatible, but I'm not sure it's the right thing.
+       - more changes to file_status for systems with AFS
+
+test.c
+       - changed calls to eaccess to EACCESS (not to be confused with the
+         EACCES error).  EACCESS is defined as access on AFS machines,
+         eaccess on all others
+
+siglist.h
+       - don't declare sys_siglist on NetBSD
+
+                                  1/11
+                                  ----
+lib/readline/history.c
+       - if `&' appears in the rhs of a history substitution, it is
+         replaced with the matched lhs.  A single backslash protects
+         the `&' from lhs interpolation
+       - fixed ADD_CHAR macro to properly terminate the target string
+       - changed GET_SUBST_PATTERN so that a single backslash can
+         quote the substitution delimiter
+       - changed GET_SUBST_PATTERN so that subst_lhs is not changed if
+         the lhs pattern is empty
+       - if the lhs is empty and there is no previous substitution, the
+         last string used in a !?string? search is used
+       - turned the GET_SUBST_PATTERN macro into a real function,
+         get_subst_pattern()
+       - changed get_subst_pattern() so that backslashes quoting the
+         search delimiter are removed
+       - fixed get_history_word_specifier so that x- returns x-$ without
+         the last word
+
+documentation/bash.1, lib/readline/doc/hsuser.texinfo
+       - changes for the new history substitution features
+
+                                  1/13
+                                  ----
+make_cmd.c
+       - new function fixup_async_list() which traverses a command list and
+         makes the last command asynchronous (`&').  This is to fix up a
+         problem with the yacc grammar productions
+
+parse.y
+       - call fixup_async_list if a list is followed by a bare `&' without
+         a second list
+
+builtins/fc.def
+       - fixed a bug in fc_gethnum that caused negative history
+         specifications (< 0) to be off by 1 when indexing against the
+         current history index
+
+lib/readline/funmap.c
+       - kill-entire-line -> kill-whole-line
+       - tilde-expand is now a bindable command that calls rl_tilde_expand
+       - added emacs-editing-mode as a bindable command
+       - added more bindable vi-mode readline commands: vi-redo,
+         vi-tilde-expand 
+
+lib/readline/emacs_keymap.c
+       - M-C-H is now bound to backward-kill-word
+
+lib/readline/vi_keymap.c
+       - `0' is now bound to beginning-of-line in vi-movement-mode
+
+documentation/bash.1, lib/readline/doc/rluser.texinfo
+       - added documentation for some of the new readline functions
+
+test.c
+       - added definitions for whitespace, digit, and digit_value when
+         compiling -DSTANDALONE
+
+                                  1/14
+                                  ----
+make_cmd.c, make_cmd.h, parse.y
+       - fixup_async_list -> connect_async_list
+
+parse.y
+       - have the productions for all async lists call connect_async_list,
+         even when followed by another async list
+       - don't save and restore the buffered stream in buffers[] in
+         push_stream and pop_stream if the default input fd is -1
+         (like command substitution sets it to, for instance)
+
+cpp-Makefile
+       - added $(PURIFY) the final cc line, make PURIFY=purify to build
+         a `purified' bash
+
+builtins/read.def
+       - fixed a memory leak -- `input_string' was not being freed
+
+variables.c
+       - fixed a memory leak in assign_in_env -- free value
+
+subst.c
+       - process substitution and command substitution now call make_child
+         with a null first argument -- no need to save a string for the
+         call; it's never used
+
+                                  1/17
+                                  ----
+lib/readline/{readline.h,complete.c}
+       - renamed rl_symbolic_link_hook to rl_directory_completion_hook,
+         which much more accurately reflects its purpose.  Left a define
+         of the old name there is readline.h
+
+bashline.c
+       - use rl_directory_completion_hook instead of rl_symbolic_link_hook
+       - bash_symbolic_link_hook -> bash_directory_completion_hook
+       - bash_directory_completion_hook is now an `int' returning function
+       - bash_directory_completion_hook now tries to to variable expansion
+         and command and arithmetic substitution if the directory name
+         contains `$' or ``'
+       - fixed a bug in bash_directory_completion_hook which made it
+         remove the trailing slash on a directory name
+       - bash_directory_completion returns 1 if variable expansion is
+         performed, 0 otherwise
+       - when doing bash filename-specific completion, don't do any kind
+         of directory name expansion
+       - removed ``' and `$' from the completer word break characters;
+         they're not word break chars
+
+lib/readline/complete.c
+       - changed semantics for rl_directory_completion_hook -- if a non-zero
+         value is returned, the return value is put into the expanded
+         filename, replacing the directory name that the user typed
+       - changed filename_completion_function to quote a replacement if
+         it contains `$' or ``' in addition to characters appearing in
+         rl_completer_word_break_characters (#ifdef SHELL)
+
+                                  1/18
+                                  ----
+shell.c
+       - take out different code for USG and BSD and mail checking.  The
+         shell always calls remember_mail_dates on startup.
+
+                                  1/19
+                                  ----
+execute_cmd.c
+       - changed executable_file into a simple return statement
+
+support/mksysdefs
+       - look for bison, define HAVE_BISON if found
+
+cpp-Makefile
+       - do not unconditionally define HAVE_BISON, let mksysdefs do
+         the work
+
+                                  1/20
+                                  ----
+machines.h
+       - added -DNO_SBRK_DECL to hpux_8, hpux_9, and Solaris descriptions
+
+lib/malloc/malloc.c
+       - removed the code that defines NO_SBRK_DECL for some machines
+
+cpp-Makefile
+       - removed the definitions of PPROMPT and SPROMPT and their inclusion
+         as defines in CFG_FLAGS
+       - added definitions for man3dir and man3ext and passed them to
+         make install in the documentation directory
+
+config.h
+       - PPROMPT and SPROMPT are now defined here
+
+builtins/mkbuiltins.c
+       - plugged up a number of memory leaks (~35K worth)
+
+documentation/Makefile
+       - made readline.3 and readline.ps standard targets
+       - make install now installs readline.3
+
+documentation/readline.3
+       - new manual page documenting the readline library
+
+general.c
+       - don't define TIMEVAL_MISSING on USG systems if HAVE_TIMEVAL is
+         defined
+
+                                  1/21
+                                  ----
+machines.h
+       - define HAVE_SOCKETS in HPUX_SYSDEP_CFLAGS for hpux_8 and hpux_9
+
+Makefile
+       - add a `tests' target that just runs `make -f bash-Makefile tests'
+
+general.c
+       - include config.h before any other include files so <unistd.h>
+         gets included if present
+
+                                  1/24
+                                  ----
+cpp-Makefile
+       - make `bashbug' by using sed with multiple -e options rather than
+         a separate `mkbashbug' program
+
+                                  1/25
+                                  ----
+machines.h
+       - sgi machines need HAVE_SOCKETS defined to make isnetconn() work
+
+lib/readline/isearch.c
+       - rewrote lots of rl_search_history to eliminate spaghetti and
+         increase speed
+
+lib/readline/history.c
+       - added defines for STREQ and STREQN to clean up the search code
+
+lib/readline/complete.c
+       - compare the first characters of the name and returned value from
+         getpwent when attempting username completion to avoid all those
+         calls to strncmp
+
+                                  1/26
+                                  ----
+lib/readline/readline.h
+       - move definition of VISIBLE_STATS here so all files can see it
+       - extern definitions of rl_history_search_forward() and
+         rl_history_search_backward ()
+
+lib/readline/search.c
+       - implementations of rl_history_search_forward() and
+         rl_history_search_backward (), which search through the history
+         list for lines beginning with the string of characters between
+         the beginning of the line and rl_point (history lines with a
+         common prefix)
+       - added definitions of STREQ and STREQN
+
+lib/readline/funmap.c
+       - added `history-search-forward' and `history-search-backward' as
+         bindable commands (names compatible with tcsh)
+
+lib/readline/complete.c
+       - make stat_char use lstat if S_ISLNK is defined to pick up symbolic
+         links
+       - split some common code out into auxiliary functions: printable_part
+         and print_filename
+       - expand filenames before calling stat_char if visible-stats is
+         active
+
+documentation/bash.1, documentation/readline.3, lib/readline/doc/rluser.texinfo
+       - documented new `history-search-forward' and `history-search-backward'
+         readline commands, by default unbound
+
+error.c
+       - changed get_name to get_name_for_error and made it externally
+         visible
+
+error.h
+       - extern declaration for get_name_for_error
+
+test.c
+       - call get_name_for_error in test_syntax_error if the shell is
+         not interactive
+
+                                  1/27
+                                  ----
+lib/readline/emacs_keymap.c
+       - add M-~ as a binding for rl_tilde_expand, it's more intuitive
+
+lib/readline/bind.c, lib/readline/readline.h
+       - exported rl_invoking_keyseqs_in_map as a public interface
+
+lib/readline/rldefs.h
+       - don't include memalloc.h if PRAGMA_ALLOCA is defined
+
+lib/readline/readline.c, lib/readline/isearch.c, lib/tilde/tilde.c,
+lib/readline/complete.c, lib/readline/search.c
+       - replaced all calls to alloca with xmalloc/free pairs or array
+         declarations
+
+lib/readline/history.c
+       - replaced some calls to alloca
+
+variables.c, subst.c, mailcheck.c, alias.c, parse.y, builtins/cd.def
+       - replaced all calls to alloca with xmalloc/free pairs or array
+         declarations
+
+builtins/source.def
+       - replaced call to alloca with xmalloc/free/unwind_protect
+       - replaced stat/open sequence with open/fstat
+
+                                  1/28
+                                  ----
+lib/readline/history.c
+       - print an error message for an unrecognized history modifier
+         instead of just ignoring it
+       - replaced remaining calls to alloca()
+
+execute_cmd.c
+       - added a #pragma alloca at the head of the file if AIX and
+         RISC6000 are defined and __GNUC__ is not
+
+                                  1/31
+                                  ----
+support/recho.c
+       - now a standard part of the distribution, needed for `make tests'
+
+cpp-Makefile
+       - make sure recho is built before the tests are run
+
+                                   2/1
+                                   ---
+builtins/command.def
+       - If subshell_environment is 1, we've already forked and are in
+         a subshell, so add CMD_NO_FORK to the flags of the command
+         to be executed and see if we can get away without forking
+
+                                   2/9
+                                   ---
+support/mksysdefs
+       - write the name of the maintainer to sysdefs.h surrounded by
+         double quotes
+
+cpp-Makefile
+       - removed the now-unnecessary double quotes around the MAINTAIN_DEFINE
+         variable value
+
+lib/readline/readline.h
+       - new variable rl_attempted_completion_over, set in the completion
+         attempt function to suppress the normal filename completion
+
+lib/readline/complete.c
+       - if rl_attempted_completion_over is set after the program-specific
+         completion function is called, don't do filename completion
+
+general.h
+       - new FREE and STRLEN convenience defines
+
+subst.c
+       - code cleanups, use of FREE and STRLEN
+
+                                  2/10
+                                  ----
+execute_cmd.c, parse.y, jobs.c, variables.c, test.c
+       - changed code to use FREE, STRLEN, other code cleanups
+       - removed, wherever possible, calls to strncmp and strcmp
+
+builtins/set.def
+       - changed the `unset' builtin to use internal_getopt
+
+builtins/set.def, builtins/test.def, builtins/fg_bg.def, builtins/type.def,
+builtins/enable.def, builtins/exec.def, builtins/declare.def,
+builtins/ulimit.def, builtins/cd.def, builtins/fc.def
+       - removed calls to strcmp, strncmp wherever possible, replacing
+         them with incline 
+
+builtins/common.h
+       - new define ISOPTION, to test whether a string s is setting
+         a specific option
+
+builtins/kill.def, builtins/read.def, builtins/trap.def, builtins/umask.def,
+builtins/enable.def, builtins/alias.def, builtins/hash.def
+       - changed to use ISOPTION
+
+builtins/read.def
+       - moved option processing before all of the code that sets up
+         the input stream
+
+                                  2/11
+                                  ----
+Makefile
+       - added `distclean' target to mirror one in cpp-Makefile
+
+                                  2/14
+                                  ----
+documentation/bash.1, documentation/features.texi
+       - noted that `=' was not a valid character for an alias name
+
+                                  2/17
+                                  ----
+builtins/common.c
+       - if parse_and_execute gets an interrupt during execution, make
+         sure that `interactive' is restored to the correct value (the
+         same value as `interactive_shell' before throwing control back
+         to the top level with throw_to_top_level so the shell does
+         not exit in throw_to_top_level
+
+builtins/reserved.def
+       - cleaned up the variables section, removing some and correcting
+         the descriptions
+
+                                  2/18
+                                  ----
+cpp-Makefile
+       - provide alternate defintions for build_builtins_in_dir depending
+         on whether __STDC__ is defined and > 0.  The `stdc' version uses
+         `##' to concatenate tokens
+
+machines.h
+       - new machine description for QNX 4.2 from pt@flard.ocunix.on.ca
+
+jobs.c, nojobs.c
+       - changed some calls to report_error to calls to internal_error
+
+test.c
+       - some systems may not define S_IFMT, so use an #ifdef to work around
+
+print_cmd.c
+       - combined the code for print_word_list and command_print_word_list
+         into an internal function that takes a pointer to a function to
+         use to print the words
+
+variables.c
+       - don't call savestring in bind_variable on the value if it's an
+         empty string
+
+nojobs.c
+       - changed wait_for to call waitpid with -1 for pid value on Posix
+         systems so all processes in a pipeline get reaped at the same
+         time (or at least most of them)
+
+                                  2/21
+                                  ----
+lib/readline/{complete.c,display.c,readline.c,rltty.c,signals.c}
+       - changed _GO32_ to __GO32__
+
+machines.h
+       - SunOS5 needs to add /usr/ccs/lib to the library search path
+         for the right termcap library
+
+                                  2/22
+                                  ----
+shell.c
+       - make sure that a subshell sets sourced_env to 0 after longjmp
+         so that $ENV is sourced by subshells forked to execute scripts
+         without a leading `#!' line
+
+bashhist.c, bashhist.h
+       - make maybe_add_history a global interface -- new function
+         to add a line to the history file depending on the value
+         of history_control
+
+builtins/fc.def
+       - call maybe_add_history in fc_addhist rather than add_history
+
+machines.h
+       - new entry for concurrent machines in att universe from
+         geoffl@vallista.ca.boeing.com (Geoffrey A. Lowney)
+
+                                  2/23
+                                  ----
+general.c, general.h
+       - new function string_to_long, which basically does the same
+         thing as atol(), which I don't believe is universal
+
+builtins/ulimit.def
+       - replaced a call to sscanf with calls to all_digits and
+         string_to_long
+       - non-root users can only raise a resource up to the hard limit,
+         even if they specify `unlimited', so shell_ulimit translates
+         RLIM_INFINITY into limit.rlim_max if euid != 0
+
+                                  2/25
+                                  ----
+shell.c
+       - make the default behavior of bash when invoked with -c command
+         to make the first argument after the command string $0 and the
+         rest $1...$N
+
+documentation/bash.1
+       - document the change in -c behavior
+
+                                   3/2
+                                   ---
+mailcheck.c
+       - made add_mail_file return the index in the list of mail files,
+         so an immediate call to find_mail_file need not be made and
+         we are guaranteed that the index returned is never -1
+       - added the check back in that changes the message to note that
+         *new* mail has arrived -- the test was not redundant after all
+       - fixed an off-by-one error in free_mail_files
+       - replaced an sprintf() in get_mailpaths with two calls to strcpy
+
+general.c
+       - changed getc_with_restart to do local buffering to reduce the
+         number of read(2) system calls
+
+subst.c
+       - changed do_assignment_internal to check for expansion and quoting
+         characters and only call expand_string when something needs
+         expansion, string_quote_removal when quotes appear, and savestring
+         for simple assignment statements
+
+                                   3/3
+                                   ---
+builtins/exit.def, documentation/bash.1
+       - removed `bye' as a synonym for `exit'
+
+shell.h
+       - new exit value: EX_USAGE
+
+builtins/{bind,command,declare,fc,getopts,histctl,history,inlib,jobs,read,
+setattr,trap,ulimit}.def
+       - changed to return EX_USAGE when a usage message is printed
+
+builtins/declare.def
+       - removed the `no_modifiers' code, changed argument name to local_var
+
+command.h, make_cmd.h
+       - declarations for the select command, inside #ifdef SELECT_COMMAND
+
+copy_cmd.c
+       - declarations for copying select commands
+
+dispose_cmd.c
+       - code to dispose of select command structures
+
+execute_cmd.c
+       - code to execute select commands
+
+make_cmd.c
+       - code to construct select command structures
+       - removed `coerce_to_word()'
+
+parse.y
+       - code to parse select commands in the grammar.  The SELECT token is
+         returned by read_token only if SELECT_COMMAND is defined
+
+print_cmd.c
+       - code to print select commands
+
+config.h, config.h.mini
+       - make SELECT_COMMAND the #define that controls whether or not the
+         `select' command is compiled in
+
+documentation.bash,1, documentation/features.texi
+       - documented the `select' command and $PS3
+
+                                   3/4
+                                   ---
+builtins/getopts.def
+       - removed a call to sprintf() in favor of expanding a number manually
+
+builtins/getopt.c
+       - make sure that we set nextchar to NULL when incrementing optind
+         so that it does not end up pointing to stale memory (freed, then
+         later reallocated)
+
+                                   3/7
+                                   ---
+builtins/common.c
+       - fixed parse_and_execute not to be overzealous in marking a command
+         as NO_FORK -- make sure there's nothing left in the string to be
+         executed before doing so
+
+machines.h
+       - change the string check for BSD/386 to __bsdi__
+       - add INT_GROUPS_ARRAY to BSDI, SunOS4, 386bsd, FreeBSD, and NetBSD
+         descriptions
+
+test.c
+       - change to use INT_GROUPS_ARRAY
+
+execute_cmd.c
+       - tightened up the execution loop in execute_for_command and
+         removed a couple of unneeded variables
+
+lib/posixheaders/memalloc.h
+       - make sure to check for sun being defined when checking for sparc;
+         there are ICL DRS6000 machines running SVR4.2 out there that do
+         not have the file
+
+                                   3/8
+                                   ---
+execute_cmd.c
+       - make sure close_fd_bitmap is called before do_redirections, lest
+         the bitmap override some of the redirections
+
+cpp-Makefile
+       - supply an explicit suffix list, so make understands the .def.o
+         suffix rule as such
+
+                                   3/9
+                                   ---
+jobs.h
+       - added extern declarations for rest of global functions in jobs.c
+       - added prototypes
+
+jobs.c
+       - made delete_job, terminate_current_pipeline, kill_current_pipeline,
+         describe_pid, notify_and_cleanup, reap_dead_jobs,
+         initialize_job_signals , without_job_control void functions
+
+                                  3/10
+                                  ----
+execute_cmd.c, execute_cmd.h
+       - moved check_identifier to general.c, general.h
+
+general.c
+       - check_identifier has acquired a second parameter; when set to 1
+         this causes the word to be checked by legal_identifier
+       - for and select commands call check_identifier with a second arg
+         of 1, function names are checked with legal_identifier when in
+         Posix.2 mode
+
+general.h
+       - add second argument to extern declaration of check_identifier
+
+CWRU/POSIX.NOTES
+       - added description of new function name behavior
+
+lib/readline/readline.h
+       - include sys/ioctl.h on FreeBSD and NetBSD
+
+lib/readline/rlconf.h
+       - new file, with readline configuration variables
+       - included in rldefs.h
+
+lib/readline/{readline.c,readline.h,complete.c,display.c}
+       - took configuration defines out and put them into rlconf.h
+
+lib/readline/Makefile
+       - updated dependencies to include rlconf.h
+
+                                  3/14
+                                  ----
+lib/readline/Makefile
+       - remove VI_MODE from the CFLAGS
+
+lib/readline/rlconf.h
+       - made VI_MODE a definable configuration option
+
+lib/readline/vi_mode.c
+       - include rlconf.h before testing whether or not VI_MODE is defined
+
+lib/readline./funmap.c
+       - include `rlconf.h' before `readline.h'
+
+lib/readline/keymaps.c
+       - include `rlconf.h' before `vi_keymap.c' and `keymaps.h'
+
+lib/readline/readline.c, lib/readline/vi_mode.c
+       - rl_vi_set_last -> _rl_vi_reset_last
+       - new function _rl_vi_set_last to set the vi-mode last command
+         information
+       - renamed vi_done_inserting to _rl_vi_done_inserting
+
+lib/readline/vi_mode.c
+       - _rl_vi_last_command, _rl_vi_last_repeat, _rl_vi_last_arg_sign,
+         and _rl_vi_doing_insert are now static
+
+                                  3/15
+                                  ----
+bashline.c
+       - unbind C-M-m in emacs_meta_keymap so people don't accidentally
+         switch into vi editing mode
+
+                                  3/21
+                                  ----
+builtins/cd.def
+       - `pwd' now follows the setting of nolinks/set -o physical; there
+         is an undocumented -P option to get the `real' working directory
+
+                                  3/28
+                                  ----
+make_cmd.c
+       - only follow the command chain to the end of a list in
+         connect_async_list if the list is not being executed in the
+         background as a unit with CMD_WANT_SUBSHELL
+
+support/mksysdefs
+       - removed the define of HAVE_CSH
+       - added an additional check for SVR4 on i[34]86 machines from
+         mkmachtype
+
+lib/readline/vi_mode.c
+       - fix up rl_vi_delete_to so that cw deletes the character under
+         the cursor no matter what, as per Posix.2
+       - any text modifying command that calls rl_vi_insertion_mode needs
+         to explicitly set the `last command' info for `.'
+       - rl_vi_movement_mode() no longer resets the `last command' info
+         so that things like `cw' can be redone with `.'
+
+                                  3/29
+                                  ----
+general.h
+       - a new define MEMMOVE_MISSING to specify to use memcpy in the
+         define for BCOPY
+       - the defines for BCOPY don't need a trailing `;'
+
+machines.h
+       - isc386 needs -DMEMMOVE_MISSING in SYSDEP_CFLAGS
+
+                                  3/30
+                                  ----
+bashline.c
+       - fix to set_saved_history to simplify the code by using 
+         rl_get_previous_history
+
+                                  3/31
+                                  ----
+error.c
+       - change the bug report message 
+
+support/mksysdefs
+       - removed `WHOAMI' junk for setting the `maintainer'
+
+cpp-Makefile
+       - hardcode the maintainer to `bug-bash@prep.ai.mit.edu'
+
+subst.c
+       - call rl_reset_terminal in sv_terminal if interactive_shell
+         is nonzero
+       - split the code that checks whether or not expand_string_unsplit
+         needs to be called from do_assignment_internal into a separate
+         function that takes a function pointer to call as an additional
+         parameter
+
+trap.c
+       - make sure that set_signal_ignored also sets original_signals[sig]
+         to SIG_IGN
+
+bashline.c
+       - `{' is not a word break character for the completion functions
+
+                                   4/2
+                                   ---
+[first beta distribution of bash-1.14.0]
+
+                                   4/5
+                                   ---
+builtins/cd.def
+       - fixed a problem with CDPATH processing (used `dirlen' instead of
+         `pathlen')
+
+subst.c
+       - make sure that get_word_from_string updates `stringp' even if
+         it's nothing but separators
+
+builtins/read.def
+       - after the call to get_word_from_string, set *e to 0 only if t
+         is not null and a word was actually returned
+
+machines.h
+       - remove the NO_SBRK_DECL declaration for sgi machines from all
+         but Irix 5.x machines
+       - sgi needs __STDC__ defined if __EXTENSIONS__ is defined
+
+lib/posixheaders/stdc.h
+       - moved the #if defined (__P) inside the check for __STDC__, so
+         the other things get defined even if __P is already defined
+       - don't redefine const, inline, etc. if `const' is already defined
+
+cpp-Makefile
+       - add dependencies on stdc.h
+       - pass -DHAVE_SYS_STREAM_H through to builds in subdirs
+
+support/mksysdefs
+       - redirect error messages from subshell attempting to find and invoke
+         bison
+       - look for <sys/stream.h>, define HAVE_SYS_STREAM_H if found
+
+lib/readline/rldefs.h
+       - include <sys/stream.h> only of HAVE_SYS_STREAM_H is defined
+
+externs.h, print_cmd.c
+       - made print_command and print_simple_command void functions
+
+builtins/common.c, builtins/common.h
+       - builtin_error now a void function
+       - dispose_saved_dollar_vars now a void function
+       - bad_option now a void function
+       - initialize_shell_builtins now a void function
+
+variables.c
+       - initialize_shell_variables now a void function
+       - adjust_shell_level now a void function
+       - delete_all_variables now a void function
+
+jobs.c
+       - inserted some returns into `int'-valued functions lacking them
+
+hash.c
+       - initialize_hash_table now static void
+
+externs.h
+       - added declarations for functions from mailcheck.c
+
+                                   4/6
+                                   ---
+lib/readline/readline.c
+       - added missing function arguments
+
+
+lib/readline/complete.c
+       - get_y_or_n now accepts space for `y' and rubout/del for `n' to
+         be more emacs-like
+
+lib/readline/history.c
+       - fixed an off-by-one error in history_expand_internal: checking
+         the wrong character for the history event or word specifier
+
+                                   4/7
+                                   ---
+lib/readline/complete.c
+       - make sure `max' is intialized to 0 when displaying the possible
+         completions, even if we've done `goto display_matches'
+
+lib/posixheaders/stdc.h
+       - if __STDC__ is defined but we're not using gcc (__GNUC__ not
+         defined), make `inline' expand to nothing
+
+lib/readline/isearch.c
+       - use STREQN to match the search string against the history line,
+         since we're not interested in exact matches, only matches of
+         the search string
+
+                                   4/8
+                                   ---
+machines.h
+       - description for a sparc running netbsd
+
+                                  4/11
+                                  ----
+lib/readline/vi_mode.c
+       - make sure we're starting an undo group when we implicitly
+         enter insertion mode after a command like c[motion], so
+         we can get to the characters that were inserted
+       - new variable: vi_continued_command, set to 1 if we enter
+         insert mode implicitly
+
+                                  4/12
+                                  ----
+machines.h
+       - generic entry for MIPS machines running SVR4, SVR4.2
+       - changed sony entry to handle M_MACHINE already being
+         defined
+
+lib/malloclib/malloc.c
+       - fixes for malloc stats, from kboyce@bnr.ca
+
+                                  4/13
+                                  ----
+machines.h
+       - changed the u370/USGr4 description: added -DNO_SBRK_DECL to
+         SYSDEP_CFLAGS
+
+lib/readline/readline.c
+       - add a call to rl_set_keymap_from_edit_mode after reading the
+         inputrc file in readline_initialize_everything to override
+         the effect of any `set keymap' assignments in the inputrc
+         file
+
+support/mksysdefs
+       - added a check for MIPS RISCos machines
+       - set the value of `dirlist' to /bsd43/usr/include if we're
+         building on a RISCos machine
+
+lib/readline/bind.c
+       - skip leading whitespace in lines read from the inputrc file
+         in rl_read_init_file
+       - call rl_set_keymap_from_edit mode after reading the inputrc
+         file in rl_re_read_init_file
+
+                                  4/14
+                                  ----
+documentation/Makefile
+       - change bash_builtins.1 to builtins.1 in the recipe for `install'
+       - remove the dependency on texindex from features.dvi
+
+builtins/kill.def
+       - remove explicit inclusion of <sys/types.h>
+
+machines.h
+       - Xenix requires -DMEMMOVE_MISSING
+       - Xenix 2.3 requires -DLD_HAS_NO_DASH_L
+       - added #undef HAVE_RESOURCE to xenix descriptions just to be sure
+
+cpp-Makefile
+       - make sure texindex is built before trying to build the documentation
+
+lib/doc-support/texindex.c
+       - fixes for portability and to fit into the bash configuration
+         scheme
+
+support/mksysdefs
+       - fixed the Xenix section to make sure that sysdefs.h defines `i386'
+         for machines.h -- apparently the default xenix cc does not
+         predefine it
+
+                                  4/16
+                                  ----
+shell.c
+       - regularized parsing of `-c' option so it can be bundled with other
+         options
+       - if bash is started with a `-o' without an argument, list the long
+         options with list_minus_o_opts
+
+builtins/set.def
+       - renamed `list_long_opts' to `list_minus_o_opts', made it global
+
+builtins/common.c
+       - builtin_error now calls get_name_for_error if this_command_name
+         is null or empty
+
+hash.c, hash.h
+       - made hash utility functions able to cope with being passed a
+         null hash table
+
+                                  4/18
+                                  ----
+lib/readline/history.c
+       - changes to history_expand, history_expand_internal to allow
+         modifiers to be used with `!#'
+       - changes to get_history_event so that only `?' or newline can
+         terminate a substring search string.  This is more csh-like.
+
+builtins/common.c
+       - get_working_directory now uses get_name_for_error when for_whom
+         is null and it needs to print an error message
+
+shell.c
+       - set no_rc and no_profile in shell_reinitialize to clarify our
+         intent about not running the .bashrc for shell scripts
+
+                                  4/19
+                                  ----
+lib/readline/vi_mode.c
+       - change rl_vi_possible_completions to fix an inadvertent infinite
+         loop in code that attempts to move to the end of the current word
+
+                                  4/21
+                                  ----
+lib/readline/vi_mode.c
+       - comment out rl_vi_possible_completions -- it's unused
+
+lib/readline/vi_keymap.c
+       - comment out vi_escape_keymap declaration -- it's unused
+
+parse.y, subst.c
+       - shells running in `posix mode' do not perform process substitution
+
+                                  4/22
+                                  ----
+support/getcppsyms
+       - don't process and define __GNUC__ at all
+       - only test for and possibly define __STDC__ if __GNUC__ is not
+         defined (not using gcc)
+
+                                  4/25
+                                  ----
+machines.h
+       - Make sure SunOS 4.x has INT_GROUPS_ARRAY defined
+
+                                  4/26
+                                  ----
+lib/readline/readline.c
+       - make sure screenwidth is not set to 0
+
+                                  4/27
+                                  ----
+Makefile
+       - changed the text printed by the `.notified' target to refer to
+         `bashbug'
+
+[1.14.1 announced and made available for anonymous FTP]
+
+                                  4/28
+                                  ----
+builtins/read.def
+       - unset the variables passed to `read' as arguments when EOF is
+         read from stdin (sh, Posix.2 compatibility)
+
+machines.h
+       - add HAVE_STRERROR to the solaris machine description
+
+print_cmd.c
+       - made declaration of printf depend on __GNUC__ being defined, since
+         only gcc seems to need it
+
+cpp-Makefile
+       - renamed DEBUG_FLAGS to CDEBUGFLAGS
+
+                                  4/29
+                                  ----
+builtins/getopt.c
+       - fix for core dump problems
+
+parse.y, make_cmd.c, make_cmd.h, execute_cmd.c
+       - changed make_redirection to take a `REDIRECTEE', which is a union,
+         as its second argument, to avoid int/long/pointer problems
+       - changed all calls to make_redirction to pass a correctuly-
+         initialized REDIRECTEE argument
+
+                                   5/1
+                                   ---
+general.h
+       - Linux needs a slightly different declaration for gethostname()
+
+nojobs.c
+       - fix to arguments to stop_pipeline
+
+                                   5/3
+                                   ---
+alias.c, bashline.c, variables.c
+       - added casts to eliminate compiler warnings
+
+general.h
+       - removed __P type information from functions taking a GENERIC_LIST *,
+         since that is never what is passed
+       - changed prototype to show that xrealloc takes a `void *'
+
+general.c
+       - xrealloc takes a `void *' as its first argument
+
+                                   5/4
+                                   ---
+support/mksysdefs
+       - changed test -r to test -f when looking for ranlib
+
+lib/readline/readline.c
+       - cleaned up some casts before xmalloc/xrealloc calls
+       - make sure the arrow keys are bound into the vi movement keymap in
+         init_terminal_io
+       - set the keymap explicitly in init_terminal_io before trying to
+         bind the arrow keys
+
+lib/readline/vi_keymap.c
+       - bind ESC in vi_movement_keymap to 0 rather than rl_abort, since
+         the rl_abort binding keeps _rl_bind_if_unbound from working
+
+shell.c
+       - look in $PATH for an input file given on the command line only
+         if that file is not an `absolute program' (contains no slashes)
+
+                                   5/5
+                                   ---
+machines.h
+       - changed HPUX_SYSDEP_CFLAGS to HPUX_CFLAGS
+
+general.h, general.c, copy_cmd.c, make_cmd.c, print_cmd.c, parse.y, subst.c
+       - BCOPY -> FASTCOPY because some machines define or undef BCOPY in
+         system header files
+
+longest_sig.c, support/pagesize.{c,sh}
+       - removed from distribution, moved to CWRU/misc
+
+lib/readline/parens.c, lib/readline/bind.c
+       - don't compile in all of the paren-matching code if PAREN_MATCHING
+         is not defined in rlconf.h
+
+                                   5/9
+                                   ---
+lib/readline/rldefs.h
+       - new #define WINSIZE_IN_IOCTL_H, set for machines that need
+         to include <sys/ioctl.h> to get TIOCGWINSZ and related definitions
+       - use `dirent' instead of `direct', define `dirent' as `direct' if
+         HAVE_DIRENT_H is not defined
+
+lib/readline/signals.c, lib/readline/readline.c
+       - changed to include <sys/ioctl.h> if WINSIZE_IN_IOCTL_H defined
+
+lib/readline/readline.c
+       - strip high bit in rl_getc if __GO32__ is defined
+
+lib/readline/complete.c
+       - use `struct dirent' rather than `struct direct' in
+         filename_completion_function
+
+lib/readline/bind.c
+       - make sure that "" is not passed to open as the name of the inputrc
+         file
+
+general.c
+       - hpux_9 needs #undef HAVE_GETDTABLESIZE, just like hpux_8, on hppa
+
+builtins/times.def
+       - Posix.1 systems need to default to using `struct tms' and the
+         output of `times'
+
+jobs.c
+       - don't redefine _POSIX_SOURCE on sun systems if already defined
+
+parse.y
+       - changed a couple of calls to reverse_list to use the REVERSE_LIST
+         macro instead
+
+newversion.c
+       - now adds the `build version' as part of `SCCSVERSION' in the same
+         format as the shell prints the version string
+
+                                  5/12
+                                  ----
+builtins/psize.sh
+       - if /tmp/pipesize is an empty file, default by defining PIPESIZE
+         to be 512.  An empty file indicates that `psize.aux' did not
+         succeed for some reason
+
+                                  5/13
+                                  ----
+machines.h
+       - dynix/ptx needs -DHAVE_SOCKETS added to SYSDEP_CFLAGS
+
+bashline.c
+       - changed some calls to strncmp to use STREQN
+
+                                  5/15
+                                  ----
+print_cmd.c
+       - if the delimiter to a here document is supposed to be quoted,
+         print it single-quoted
+       - make if statements and while/until statements print similarly,
+         with the then/do on the same line as the first word, separated
+         from the command list by a semicolon
+
+make_cmd.c
+       - reverse the order of patterns in the case statement pattern
+         list in make_pattern_list, so it's printed in the same way
+         it was defined
+
+Makefile
+       - make sure that references to cpp-Makefile and ansi-Makefile
+         are prefixed with $(srcdir) or use CPP_MAKEFILE or ANSI_MAKEFILE
+         respectively
+       - make sure that srcdir is passed from Makefile to bash-Makefile
+         when making `all'
+
+support/mkdirs
+       - new program, clone of `mkdir -p'
+
+cpp-Makefile
+       - before running a make in a subdirectory, call `mkdirs' to ensure
+         that that subdirectory exists
+
+                                  5/16
+                                  ----
+newversion.c
+       - added a `-dir' option to specify a directory prefix, like $(srcdir)
+
+                                  5/17
+                                  ----
+builtins/mkbuiltins.c
+       - if the .def filename begins with a slash, don't prepend the name
+         of the `error directory' when printing error messages or writing
+         line number information to a generated c source file
+
+config.h
+       - don't include memalloc.h if BUILDING_MAKEFILE is defined
+
+lib/malloc/Makefile
+       - skeleton Makefile to make this directory more like other
+         library directories
+
+Makefile, cpp-Makefile, builtins/Makefile, lib/*/Makefile
+       - changes to make bash buildable in a directory without the source
+         present by running `make srcdir=xxx'
+
+support/srcdir
+       - new program, used to print the full path of the source directory;
+         it echoes the output of `pwd' if $1 is `.'
+
+                                  5/18
+                                  ----
+cpp-Makefile
+       - CFLAGS -> CCFLAGS, CDEBUGFLAGS -> CFLAGS to obey the GNU standard
+         (which does not consider the possibility that other information
+         besides debugging could conceivably be passed to cc)
+
+general.h
+       - don't prototype gethostname() unless we're defining our own version
+         in general.c
+
+lib/readline/history.c
+       - fix hist_error to allocate and return a new string with the
+         error message; removed the `ret' argument
+
+                                  5/19
+                                  ----
+subst.c
+       - new function char_is_quoted(s, i) returns 1 if character at
+         position i in s is quoted
+
+bashline.c
+       - removed `\' from rl_completer_word_break_characters
+       - make sure that a command separator character is not quoted in
+         attempt_shell_completion by calling char_is_quoted before calling
+         command_word_completion_function
+       - fixed a problem with detection of command separator characters
+         in attempt_shell_completion
+
+lib/readline/complete.c
+       - set found_quote if a backslash is found in the string in
+         rl_complete_internal
+       - if compiled for the shell, call char_is_quoted to find out
+         whether a character in rl_line_buffer is quoted when deciding
+         where to break a word for the completer
+
+                                  5/23
+                                  ----
+machines.h
+       - made sure all definitions of M_OS were quoted
+
+lib/doc-support/Makefile
+       - more surgery to use ${topdir} and ${srcdir}
+
+documentation/bash.1
+       - clarify that redirections may precede only simple commands
+
+support/fixlinks
+       - new script to make multiple copies of files links or symlinks
+         to a single master copy
+
+support/SYMLINKS
+       - name -> target symlink map for support/fixlinks
+
+support/fixlib
+       - modification of fixdist to move lib to ../lib and clone the files
+         in there like using lndir
+
+filecntl.h
+       - moved to lib/posixheaders, replaced with symlink
+
+support/getcppsyms.c
+       - removed support for outputting -D__STDC__; it's rarely right
+
+cpp-Makefile
+       - build_builtins_in_dir(directory, makefile) --> build_builtins(target)
+         to get rid of the need to know how cpp does token concatenation
+
+nojobs.c
+       - changed the printing of the pid for asynchronous jobs to be the
+         same as sh (no brackets)
+       - took a useless loop out of wait_for_background_pids
+
+                                  5/24
+                                  ----
+
+cpp-Makefile
+       - major surgery to replace #define with make variable assignments --
+         now cpp is used only for inclusion and conditionals (and shorthand)
+
+machines.h
+       - new entry for Lynx 2.1
+
+builtins/declare.def
+       - make sure that the name in command name=value is a legal variable
+         name (affects typeset/declare, export, readonly)
+
+                                  5/26
+                                  ----
+machines.h
+       - make sure a 386/486 running Solaris2 is not misidentified as a
+         Sun 386i
+       - make sure a 486 running NeXT OS is identified as a `NeXT-i386'
+
+                                  5/27
+                                  ----
+builtins/enable.def
+       - fixed an off-by-one error in option parsing
+       - improved option parsing to be Posix compliant (`--'), bad options
+
+Makefile
+       - call /bin/sh to run support/mksysdefs and create sysdefs.h, since
+         it's a shell script
+       - ditto for $(CPPMAGIC)
+
+cpp-Makefile
+       - newversion.aux does not need to be linked against the math
+         library
+
+                                  5/30
+                                  ----
+machines.h
+       - set M_OS to `NeXTstep' for NeXT and i386 machines running NeXT OS
+
+[1.14.2 beta release made available for FTP]
+
+                                  5/31
+                                  ----
+siglist.h
+       - don't define `strsignal' on SunOS5; it has its own
+
+builtins/setattr.def
+       - change set_or_show_attributes to check for legal variable names
diff --git a/CWRU/old-changelogs/CWRU.chlog.v11 b/CWRU/old-changelogs/CWRU.chlog.v11
new file mode 100644 (file)
index 0000000..163247e
--- /dev/null
@@ -0,0 +1,8400 @@
+                                   6/2
+                                   ---
+lib/readline/readline.c
+       - fixed an off-by-one error in the kill ring reallocation code
+         in rl_kill_text
+
+Makefile
+       - replaced instances of /bin/sh with $(SHELL)
+
+Makefile, cpp-Makefile, documentation/Makefile
+       - added a working `uninstall' target
+
+[1.14.0 FCS release made available for FTP]
+
+                                   6/3
+                                   ---
+README
+       - added note about building with gcc, same as in Makefile
+
+documentation/Makefile
+       - some versions of make don't understand `$*' in a regular recipe;
+         replace with features.dvi in the recipe for features.ps
+
+                                   6/4
+                                   ---
+subst.c
+       - fix up the calls to string_extract_double_quoted and 
+         string_extract_single_quoted in char_is_quoted so the initial
+         value of the index is *after* the opening quote character
+       - make sure we only return 1 from char_is_quoted if the index
+         into the string after a call to string_extract_double_quoted or
+         string_extract_single_quoted is *greater than* `eindex'
+
+lib/readline/complete.c
+       - change the order and sense of the quoting tests in
+         rl_complete_internal so that the expensive char_is_quoted
+         is only called if `scan' actually is a word break character
+
+shell.c
+       - fixed a typo in the test for a restricted shell
+
+builtins/exec.def
+       - need to include flags.h
+
+                                   6/6
+                                   ---
+make_cmd.c
+       - make sure that we don't try to walk down a null command tree
+         in connect_async_list (tickled by `(command &) &')
+       - if a command has the CMD_WANT_SUBSHELL bit set in its flags,
+         don't even try to walk the command tree and move the `&';
+         just connect the command with a null command using `&'
+
+execute_cmd.c
+       - make sure we don't try to reference a command struct without
+         first checking it (case '&')
+
+                                   6/7
+                                   ---
+machines.h
+       - fix a typo in the NeXT/i386 description; change the NeXT description
+         to #define HAVE_RESOURCE if not already defined rather than putting
+         -DHAVE_RESOURCE into the SYSDEP_CFLAGS
+
+                                   6/9
+                                   ---
+Makefile
+       - make sure all of the rules that reinvoke `make' have the
+         `-f bash-Makefile' before the assignment statements; some
+         versions of make like it that way
+
+variables.c
+       - make sure that `interactive' is set to 0 before evaluating the
+         string containing an exported function obtained from the
+         environment, so that it does not try to execute PROMPT_COMMAND
+         (this may not be the best fix)
+
+                                  6/13
+                                  ----
+documentation/Makefile
+       - make sure all of the directories exist before trying to install
+         doc files into them
+
+lib/readline/history.c
+       - add a missing O_TRUNC to the open call for writing in
+         history_truncate_file
+
+trap.c
+       - run_interrupt_trap should only try to run the trap command if
+         the value is not IMPOSSIBLE_TRAP_HANDLER
+
+Makefile
+       - add `realclean'
+
+lib/readline/complete.c
+       - do the same kind of double-quoting a replacement string if the
+         user supplies the opening double quote as we would if we were
+         adding both quotes ourselves
+
+variables.c
+       - fixed the variable initialization so that history_control/HISTCONTROL
+         can be inherited from a parent shell
+
+INSTALL, README, cpp-Makefile, documentation/bash.1, documentation/readline.3
+       - ai.mit.edu -> prep.ai.mit.edu
+
+shell.c
+       - fixed a problem with setting no_line_editing to the result of the
+         check for running inside emacs, thereby losing any value
+         initialized by the `-nolineediting' flag
+
+cpp-Makefile
+       - `make distclean' will now remove the `installed-bash' link
+
+print_cmd.c
+       - fixed a problem with undefined variables when HAVE_VARARGS_H is
+         not defined
+
+                                  6/14
+                                  ----
+lib/readline/history.c
+       - fixed an error in the csh history expansion code so that the
+         `-y' word designator now expands to `0-y' rather than `1-y'
+
+lib/readline/isearch.c
+       - changed an absolute check for a character falling within the
+         ASCII 32-126 range (printable chars) with checks for CTRL_P
+         and META_CHAR and a check against the value RUBOUT
+       - changed a `break' to a `continue' so that the first non-matching
+         character in the search string does not cause the search to
+         end abruptly
+       - initialize prev_line_found to 0 at the top of rl_search_history
+         to avoid duplicate history lines being saved across searches
+
+lib/readline/rltty.c
+       - consolidated repeated code for setting special characters into
+         `SET_SPECIAL' defines
+
+lib/readline/readline.c
+       - include <sys/ioctl.h> if VSTATUS is defined
+       - add bindable command rl_tty_status (unbound by default)
+
+lib/readline/funmap.c
+       - assign bindable command name `tty-status' to rl_tty_status
+
+INSTALL
+       - add note about compiling with gcc, same text as README
+
+lib/readline/display.c
+       - many changes and tweaks to make redisplay work better when the
+         prompt has invisible characters.  These changes are non-optimal
+         in that the prompt is redrawn more than it needs to be, but
+         things are a hell of a lot better than they were
+
+                                  6/15
+                                  ----
+documentation/Makefile
+       - make a variable NROFF that people can set to `groff -Tascii' if
+         they don't have real nroff
+       - changed the suffix rules to use $<
+
+support/bashbug.sh
+       - if rmail doesn't exist or fails, save the bug report in
+         ~/dead.bashbug
+
+execute_cmd.c
+       - in setup_async_signals, only ignore SIGINT and SIGQUIT if job
+         control is not active.  If it is active and the job is restarted,
+         SIGINT remains ignored, and the now-foregrounded job is not
+         interruptible
+
+subst.c
+       - fixed up a problem with char_is_quoted that caused backslash-
+         escaped characters to cause incorrect results
+
+tests/run-dollars, tests/dollar-at.sh, tests/dollar-star.sh
+       - since the error messages produced by `cat' vary, changed `cat'
+         to `recho' and updated the correct answers file
+
+machines.h
+       - fixes to CRAY_STACKSEG_END definitions for different versions of
+         Unicos on the YMP (from Bill Jones)
+       - Motorola SVR4 machines have getcwd() and should not undef
+         HAVE_GETCWD
+       - on hpux 9.x, don't try to link with -lPW if compiling with gcc
+         (for alloca)
+
+parse.y
+       - an ugly fix for a compiler problem with structure assignment on
+         the cray
+
+                                  6/16
+                                  ----
+builtins/wait.def
+       - replaced a call to sscanf with a validity check using all_digits()
+         and a call to atoi, since a pid_t is not necessarily an int, and
+         the sscanf clobbered the stack frame on systems where it is shorter
+         than an int (e.g., SCO)
+
+lib/readline/display.c
+       - since META_CHAR and the other macros only work with unsigned
+         chars, make rl_character_len convert its argument to an unsigned
+         char before testing it
+
+documentation/Makefile
+       - use $(INSTALL_DATA) instead of $(CP) to install the man pages and
+         info files
+
+cpp-Makefile
+       - use INSTALL_PROGRAM and INSTALL_DATA to install binaries and
+         documentation; pass both values to installs in subdirectories
+
+                                  6/18
+                                  ----
+builtins/ulimit.def
+       - compensate for systems which define RLIMIT_OFILE instead of
+         RLIMIT_NOFILE, or don't provide such a compatibility define
+         themselves
+
+shell.c
+       - make maybe_execute_file check for directories and print an
+         appropriate error message, since it's doing an fstat anyway
+
+support/mksysdefs
+       - added support for a `-s srcdir' option so it can find
+         cpp-Makefile if ansi-Makefile is to be created
+
+Makefile
+       - call mksysdefs with -s $(srcdir)
+
+jobs.c
+       - add the magic #undef lines to avoid redefinition warnings on
+         SunOS 4 only
+
+                                  6/20
+                                  ----
+cpp-Makefile
+       - install `bashbug' with `make install'
+
+trap.c
+       - make sure that `interactive' is set to 0 when running trap
+         commands
+
+builtins/umask.c
+       - fixed typo in usage error message
+
+subst.c
+       - fix process_substitute to set subshell_environment
+
+jobs.c, nojobs.c
+       - only mess with the terminal settings for an interactive shell
+         that is not in a subshell environment
+
+                                  6/21
+                                  ----
+lib/readline/history.h
+       - add extern declaration of history_get
+
+builtins/fc.def
+       - make history replacement when using `r' or `fc -s' obey the
+         setting of HISTCONTROL
+
+general.c
+       - in canonicalize_pathname, preserve a double // at the start
+         of an absolute pathname, since that means something special
+         for the network directory system
+
+README, INSTALL
+       - updated information about submitting bug reports
+
+lib/readline/vi_mode.c, lib/readline/isearch.c
+       - make sure unistd.h is included before rldefs.h, if
+         HAVE_UNISTD_H is defined
+
+                                  6/24
+                                  ----
+lib/readline/complete.c
+       - add `#' to the list of characters which cause a completed filename
+         to be quoted
+
+execute_cmd.c
+       - be more careful about closing pipe file descriptors in do_piping;
+         don't want to have `dup2(i, i); close(i);' problem
+
+lib/readline/{keymaps,readline}.h
+       - include local copies of include files if READLINE_LIBRARY is
+         defined, otherwise include the `official, installed' versions
+         using #include <readline/xxx.h>
+
+lib/readline/*.c
+       - define READLINE_LIBRARY before including any files
+       - include only `local' copies of include files using #include "xxx.h"
+         rather than #include <readline/xxx.h>
+
+                                  6/26
+                                  ----
+execute_cmd.c
+       - check for clobbering the bash input stream before closing a file
+         descriptor due to an r_close_this redirection
+
+lib/readline/history.c
+       - made history_expand inhibit history expansion if the history
+         expansion char is set to 0
+
+lib/readline/chardefs.h
+       - moved savestring() definition to rldefs.h
+       - changed lowercase_p, uppercase_p, to_lower, to_upper defines to
+         use <ctype.h> macros rather than assume ASCII
+
+lib/readline/bind.c, general.c, general.h
+       - use strcasecmp, strncasecmp instead of str[n]icmp if
+         HAVE_STRCASECMP is defined
+
+cpp-Makefile
+       - pass -DHAVE_STRCASECMP to builds in the libraries, primarily
+         readline
+
+machines.h
+       - add HAVE_STRCASECMP to the entries for BSD/386, NetBSD, FreeBSD,
+         and 4.4 BSD
+
+builtins/hash.def
+       - add a fourth parameter to remember_filename, the initial value
+         of times_found (0 if we're just looking it up for `hash', 1
+         for the command execution code)
+
+execute_cmd.c
+       - call remember_filename with an initial value of 1 for times_found
+
+builtins/wait.def
+       - handle a null argument with an error message
+
+builtins/common.c
+       - parse_and_execute now takes a third parameter: the value for
+         `interactive' while it is executing commands
+
+bashline.c, jobs.c, parse.y, shell.c, subst.c, trap.c, variables.c
+       - set the new third argument to parse_and_execute appropriately
+
+builtins/eval.def, builtins/fc.def, builtins/source.def
+       - set the new third argument to parse_and_execute appropriately
+
+builtins/help.def
+       - changed a call to strnicmp to strncmp when trying to find what
+         to give help on; it seems more correct
+
+                                  6/27
+                                  ----
+machines.h
+       - cleaned up the SunOS section so it no longer relies on
+         HAVE_SHARED_LIBS being defined; it uses SunOS4 and SunOS5
+         instead
+
+support/mksysdefs
+       - define SYSDEF to be SunOS4 or SunOS5 depending on the output
+         of uname rather than looking for ld.so
+
+                                  6/29
+                                  ----
+machines.h
+       - minor change to the ardent titan machine description
+       - move the ardent and stardent descriptions before the
+         mips riscos description
+
+print_cmd.c
+       - ardent machines also need the extern declaration for printf
+
+make_cmd.c
+       - connect_async_list should do its work only if the lists to be
+         backgrounded are connected with `;'.  This makes `;' bind tighter
+         than `&', so only the last job in the list is backgrounded.  All
+         other lists should have the entire thing put in the background
+
+parse.y
+       - added a function `print_prompt' to take care of displaying the
+         prompt string if readline is not being used.  This fixes problems
+         with the prompt being displayed before the status of completed
+         jobs is printed
+
+                                  6/30
+                                  ----
+builtins/fg_bg.def
+       - `fg' and `bg' now print error messages if invoked when job control
+         is disabled
+
+lib/readline/rltty.c
+       - if not compiled into the shell, make get_tty_settings get and set
+         the window size.  This noop stops the process if it is started in
+         the background
+
+lib/readline/readline.c
+       - provide a function version of savestring, if not being compiled
+         into the shell, since the macro has been removed from the
+         `public' header files
+
+lib/readline/readline.h
+       - provide all extern function declarations without checking whether
+         VI_MODE or PAREN_MATCHING are defined.  It does not hurt to define
+         them if they are not used and not in the library, and other
+         applications using readline can't tell whether or not VI_MODE was
+         defined when the library was compiled anyway
+
+                                   7/1
+                                   ---
+machines.h
+       - add #undef HAVE_DIRENT_H to the ardent titan description
+
+                                   7/2
+                                   ---
+lib/readline/chardefs.h
+       - removed META_P define, renamed CTRL_P to CTRL_CHAR
+
+lib/readline/bind.c, lib/readline/isearch.c
+       - changed instances of CTRL_P to CTRL_CHAR
+
+lib/readline/search.c
+       - include <unistd.h> before rldefs.h, if HAVE_UNISTD_H is defined
+
+lib/readline/readline.c
+       - declare PC, UP, and BC as extern rather than `local' to the
+         readline library
+
+                                   7/5
+                                   ---
+bashline.c
+       - implement command word completion inside of command substitution
+         with a new function: `command_subst_completion_function'
+
+subst.c
+       - new function to help with command subst completion: unclosed_pair
+
+lib/readline/complete.c
+       - new variable rl_filename_quoting_desired, which can be set to 0
+         to inhibit the quoting of filenames after completion
+
+lib/readline/readline.h
+       - declare rl_filename_completion_desired and
+         rl_filename_quoting_desired
+
+builtins/bind.def
+       - don't save the old value of rl_outstream before initializing
+         readline -- it saves garbage values and screws up readline
+
+parse.y
+       - don't have private state telling whether or not readline has
+         been initialized -- use bash_readline_initialized like other
+         functions in bashline.c
+
+lib/readline/readline.c
+       - make the default 8-bit behavior be based on whether LC_CTYPE is
+         defined and its value (accept iso-8859-1 or iso_8859_1)
+
+                                   7/6
+                                   ---
+variables.c
+       - fix up the declaration of getenv() for convex machines
+
+                                   7/7
+                                   ---
+lib/readline/readline.c
+       - fixed up typos in the declaration of `savestring'
+
+lib/readline/history.c
+       - fixed an off-by-one error in the ADD_CHAR macro which caused one
+         extra character to be overwritten, causing the gnu malloc to abort
+         when that one character was at the end of an allocated block
+       - changed the ADD_STRING macro to avoid some unnecessary xreallocs
+
+lib/readline/display.c
+       - fixed a problem with move_cursor_relative -- function now returns
+         immediately if it has nothing to do
+       - fixed another problem with displaying prompts with invisible chars
+
+lib/readline/chardefs.h
+       - fixed the CTRL macro to be right (agree with the BSD kernel, for
+         example)
+
+cpp-Makefile
+       - fixed typo in the `install' recipe
+
+                                   7/8
+                                   ---
+support/srcdir
+       - fixed to handle srcdir when it begins with ./ or ../ to handle
+         $(srcdir) being a relative path better
+
+cpp-Makefile
+       - changed some include paths to $(BUILTIN_ABSSRC) when building in
+         `builtins' to handle $(srcdir) being a relative path
+       - change the `chmod' on bashbug to turn on read and execute for all
+       - added a couple of definitions to make it easier for a later
+         `configure' program
+
+support/mksysdefs
+       - added a -i option to specify an alternate set of directories to
+         search for include files
+
+lib/readline/bind.c
+       - in rl_read_init_file, when skipping whitespace at the start of
+         the line, decrement `i' so that we don't jump past the start
+         of the next line
+
+machines.h
+       - SCOv4 has a `robust' opendir that checks that you're actually
+         opening a directory
+
+                                  7/11
+                                  ----
+lib/readline/complete.c
+       - make sure a word break character is unquoted before using it to
+         separate out the current word for completing
+
+machines.h
+       - new machine description: NetBSD on motorola m68k machines like
+         the hp300
+       - undef HAVE_GETWD in the generic svr4 machine description, like
+         other svr4 descriptions
+
+lib/readline/rltty.c
+       - make sure to fflush (rl_outstream) after toggling the setting
+         of the keypad and meta key
+
+portbash/libc.sh
+       - add a test for OPENDIR_NOT_ROBUST
+
+support/getcppsyms.c
+       - output __svr4__ if we find __uxps__ (this makes the Fujitsu port of
+         SVR4 to the sparc build OK)
+
+                                  7/12
+                                  ----
+lib/readline/display.c
+       - more display-related fixes when the prompt has invisible chars;
+         this time for screen updates when moving between screen lines
+
+lib/readline/readline.c, lib/readline/display.c
+       - changes to make readline work with terminals that have auto-wrap
+         from Per Bothner (new function _rl_update_final, term_xn changes,
+         some efficiency speedups, new function space_to_eol)
+
+                                  7/13
+                                  ----
+lib/readline/display.c
+       - after moving up screen lines using term_up in _rl_move_vert, if
+         the new screen line is 0, _rl_last_c_pos needs to be adjusted
+         to take invisible characters into account.  This was the source
+         of many bugs
+
+                                  
+                                  7/14
+                                  ----
+documentation/Makefile
+       - change instances of `groff' to `${GROFF}', GROFF is set to
+         `groff' by default
+
+general.c, variables.c
+       - moved `qsort_string_compare' from variables.c to general.c
+
+general.h, variables.h
+       - moved declaration of `qsort_string_compare' from variables.h
+         to general.h
+
+alias.c, lib/readline/funmap.c
+       - moved qsort auxiliary functions after their use and added
+         forward declarations to avoid warnings from ANSI C compilers
+
+memalloc.h
+       - hpux_9 needs alloca declared as `extern void *' if __STDC__
+         is defined
+
+support/mksysdefs
+       - removed HAVE_SHARED_LIBS entirely
+       - make a call to /bin/uname -X for SCO machines to avoid running
+         a different uname from the $PATH
+
+machines.h
+       - new descriptions: Intel i860 running SVR4, Tahoe running 4.3 BSD
+       - changed descriptions: Mips/RiscOS, DG AViiON, unknown machine
+
+jobs.c
+       - changes to how the shell handles foreground jobs dying of SIGINT:
+               an interactive shell using job control will no longer
+               act as if it received a SIGINT if the foreground job
+               dies from a SIGINT
+
+               a non-interactive shell or shell without job control tries
+               to differentiate between SIGINTs it has seen (in
+               wait_sigint_handler) and a foreground job dying of a SIGINT
+               not sent from the keyboard, and runs the normal SIGINT code
+               only in the former case
+
+                                  7/15
+                                  ----
+support/mksysdefs
+       - check for ${UNAME}${RELEASE} expanding to `SunOS4*' or `SunOS5*'
+         to set SYSDEF to SunOS4 or SunOS5, respectively.  Apparently
+         this does not work for Solbourne
+
+                                  7/18
+                                  ----
+
+lib/readline/rltty.c
+       - if output is being flushed on termios systems, loop until the
+         FLUSHO bit is no longer set in the termios struct
+
+support/mksysdefs
+       - added a -A flag to force creation of ansi-Makefile
+
+machines.h
+       - new entry for Tandem machines running SVR3
+
+                                  7/19
+                                  ----
+lib/readline/rldefs.h
+       - include <termcap.h> if HAVE_TERMCAP_H is defined
+       - use <termio.h> stuff if HAVE_TERMIO_H is defined and _POSIX_VERSION
+         is not defined
+
+lib/readline/rldefs.h, lib/readline/history.c
+       - include "config.h" if HAVE_CONFIG_H is defined
+
+lib/readline/{rldefs.h,signals.c,readline.c}
+       - WINSIZE_IN_IOCTL_H -> GWINSZ_IN_SYS_IOCTL for compatibility with
+         other GNU programs
+
+lib/readline/doc/Makefile
+       - fixed up to create the readline and history manuals in dvi and
+         ps format
+
+lib/readline/Makefile
+       - changes inspired by the standalone readline-2.0 distribution
+
+                                  7/20
+                                  ----
+lib/readline/history.c
+       - new function, history_is_stifled (), returns history_stifled
+       - set history_state flags member in the history state functions
+
+lib/readline/history.h
+       - reorganized the function declarations, added missing declarations
+       - history_stifled is no longer exported by the library
+       - added a `flags' member to the HISTORY_STATE structure
+
+bashline.c
+       - use history_is_stifled () instead of history_stifled
+
+lib/readline/readline.c, lib/readline/vi_mode.c
+       - filled in correct argument declarations for functions called via
+         keymaps (count, key)
+
+lib/readline/complete.c
+       - efficiency improvement for compare_strings
+
+                                  7/21
+                                  ----
+examples/dirfuncs
+       - new directory functions from ksh book, contributed by
+         Ken Konecki (kenk@wfg.com)
+
+machines.h
+       - hpux_8 and hpux_9 should both #undef HAVE_ALLOCA unless gcc is
+         being used
+
+                                  7/22
+                                  ----
+bashline.c
+       - fixed up command_word_completion_function so that filenames with
+         leading tildes are completed correctly
+
+                                  7/26
+                                  ----
+builtins/read.def
+       - if -r not given, make sure CTLESC is removed from input string
+         when reading \<newline>
+
+lib/readline/readline.c
+       - new function bind_arrow_keys, which binds vt100/ansi arrow key
+         escape sequences after reading the termcap definition and the
+         inputrc file
+       - new function rl_yank_last_arg, which does what insert-last-arg
+         does in bash
+
+lib/readline/emacs_keymap.c
+       - remove default bindings to rl_arrow_keys for M-[ and M-O
+       - rl_yank_last_arg is now bound to `M-.' and `M-_' in
+         emacs_meta_keymap
+
+subst.c
+       - when performing process substitution on systems with /dev/fd,
+         make sure the child clears the slot in dev_fd_list it gets
+         from its parent so the file descriptor does not get closed
+         inappropriately if reallocated by, e.g., pipe(2)
+
+bashline.c
+       - removed insert_last_arg and the calls to bind in to `M-.' and `M-_'.
+         `insert-last-argument' is now bound to rl_yank_last_arg for
+         backwards compatibility
+
+lib/readline/funmap.c
+       - `yank-last-arg' is now a named command for rl_yank_last_arg
+
+
+documentation/bash.1, documentation/readline.3
+       - add description of yank-last-arg as one of the readline user
+         commands
+
+lib/readline/doc/rluser.texinfo
+       - added description of yank-last-arg
+
+builtins/getopts.def
+       - fixed a typo in the int-to-string code computing the value to set
+         OPTIND to: had '\0' instead of '0'
+       - made getopts handle the case where there are more than 9 dollar
+         variables (where rest_of_args is non-null) correctly
+
+                                  7/28
+                                  ----
+lib/readline/display.c
+       - fixes to the display code for single-line-display in the presence
+         of prompts containing invisible characters
+
+lib/readline/readline.c
+       - if we are using horizontal scrolling and we have term_xn, decrement
+         the screenwidth by 1, since we won't be doing any line wrapping
+
+                                  7/31
+                                  ----
+jobs.c
+       - new variable `freeze_jobs_list' to set when changes to the jobs
+         list or status of jobs in the list (other than calling something
+         like `jobs -n') are undesirable.  This is set when execuing traps
+         on SIGCHLD
+
+                                   8/1
+                                   ---
+subst.c
+       - check that `~' is unquoted before performing tilde expansion in
+         an assignment statement
+
+                                   8/3
+                                   ---
+bracecomp.c
+       - keep brace completion from dumping core if there is only one
+         match
+
+lib/readline/chardefs.h
+       - add a define for digit_p, which returns the value of isdigit()
+
+lib/readline/readline.c
+       - added function equivalents for uppercase_p, lowercase_p, to_upper,
+         to_lower, pure_alphabetic, digit_p, and digit_value
+       - replaced calls to numeric () with calls to digit_p, removed
+         definition of numeric ()
+
+lib/readline/history.c
+       - digit -> digit_p
+
+lib/readline/vi_mode.c
+       - replaced uses of the `isletter' define to use pure_alphabetic
+         from chartypes.h
+       - replaced uses of `numeric' with calls to digit_p
+       - added do...while(0) to `exchange' define
+
+                                   
+                                   8/4
+                                   ---
+execute_cmd.c
+       - make sure execute_function saves and restores the current loop
+         count with unwind_protect_int
+
+documentation/features.texi
+       - change the `Shell Command Line Options' section to `Invoking
+         Bash' to be closer to the GNU coding standards
+
+                                   8/5
+                                   ---
+builtins/read.def
+       - fixed up a memory leak and made behavior correct when no
+         variables given and backslash escaped at least one input char
+       - if we added CTLESC anywhere while reading the input string,
+         make sure we call dequote_string on each word of the input
+         before calling bind_variable with that string
+
+                                   8/6
+                                   ---
+lib/readline/readline.h
+       - removed definition of rl_show_star -- the variable no longer
+         exists
+
+lib/readline/readline.h, lib/readline/history.h
+       - reorganized to follow texinfo manual structure
+
+lib/readline/bind.c
+       - rl_function_dumper is now static
+       - rl_list_funmap names does not take any arguments
+
+builtins/bind.def
+       - rl_list_funmap names does not take any arguments
+
+lib/readline/readline.c, lib/readline/signals.c
+       - rl_init_argument ->_rl_init_argument
+
+lib/readline/rltty.c
+       - remove declaration and references to output_was_flushed
+
+support/getcppsyms.c
+       - if __uxps__ is defined, define __uxps__ and __svr4__
+
+                                   8/9
+                                   ---
+support/mkdist
+       - added a -r option to set the `root name' of the distribution
+         (e.g., `bash' or `readline')
+
+                                  8/10
+                                  ----
+input.c
+       - if check_bash_input sees that default_buffered_input is about
+         to be the target of a redirection, but the buffered input stream
+         is not the current input stream (e.g. as the result of an
+         `eval' while in a script, change default_buffered_input to a
+         new fd and use a new variable `bash_input_fd_changed' to note
+         the change
+
+parse.y
+       - if pop_stream sees that default_buffered_input has changed while
+         a buffered stream was on the save stack (because
+         bash_input_fd_changed is non-zero), then make the popped stream
+         and the corresponding buffer use the new fd
+
+test.c
+       - fixed an off-by-one error in test_stat when testing /dev/fd/n.
+
+cpp-Makefile
+       - add -I$(incdir) to CPPFLAGS
+       - add `incdir = $(prefix)/include' assignment
+
+                                  8/11
+                                  ----
+lib/readline/signals.c
+       - changed some calls to signal () to call rl_set_sighandler()
+       - call _rl_redisplay_after_sigwinch from the sigwinch handler
+         to do better redisplay of wrapped command lines and multi-line
+         prompts
+
+builtins/suspend.def
+       - changed some calls to signal () to call set_signal_handler()
+
+lib/readline/*.c
+       - include config.h before anything else if HAVE_CONFIG_H is defined
+
+lib/readline/readline.c
+       - renamed rl_set_mark to _rl_set_mark_at_pos
+       - call _rl_vi_initialize_line from rl_initialize if the current
+         editing mode is vi mode
+       - only output a term_cr in crlf if term_cr is non-null
+
+lib/readline/readline.h
+       - added declarations for rl_vi_set_mark and rl_vi_goto_mark
+
+lib/readline/readline.c, lib/readline/readline.h
+       - added a new bindable command to set the mark, rl_set_mark
+
+lib/readline/funmap.c
+       - new bindable function with name `set-mark', bound to rl_set_mark
+       - new bindable vi-mode functions with names `vi-set-mark' and
+         `vi-goto-mark'
+
+documentation/{bash.1,readline.3}, lib/readline/doc/rluser.texinfo
+       - added documentation for `set-mark' (unbound)
+
+lib/readline/vi_mode.c
+       - new vi-command mode commands to save marks (the vi `m' command)
+         and go to saved marks (the ``' command)
+       - new function _rl_vi_initialize_line called from rl_initialize
+         to set up the line state in vi mode.  Right now this just resets
+         all the marks
+
+lib/readline/vi_keymap.c
+       - new vi command-mode bindings to set the mark (`m') and to go to
+         a saved mark (``')
+
+documentation/readline.3
+       - added vi-set-mark and vi-goto-mark to list of key bindings for
+         vi command mode
+
+lib/readline/{readline.c,display.c}
+       - renamed term_xn to _rl_term_autowrap
+
+lib/readline/display.c
+       - new function _rl_redisplay_after_sigwinch to encapsulate the
+         necessary redisplay code after a SIGWINCH is received
+
+variables.c
+       - only call find_user_command on the shell name in shell_initialize
+         if shell_name is not an absolute program name
+       - call canonicalize_pathname on the full shell pathname after
+         calling make_absolute on it if the shell name starts with a `.'
+
+siglist.h
+       - FreeBSD does not need a definition of sys_siglist[]
+
+                                  8/12
+                                  ----
+lib/readline/rltty.c
+       - don't try to use FLUSHO unless FLUSHO is defined
+
+cpp-Makefile
+       - make sure to pass $(CC) to the make in the lib/malloc subdirectory
+
+lib/readline/readline.c
+       - don't declare PC, UP, and BC as extern; it causes too many problems
+
+                                  8/13
+                                  ----
+machines.h
+       - add -DNO_SBRK_DECL to SYSDEP_CFLAGS for SVR4.2 on i386
+
+support/mksysdefs
+       - new variable UNAME_S for the output of `uname -s'
+       - if uname -s does not output the same thing as uname, and uname -s
+         outputs UNIX_SV, then set UNAME to UNIX_SV.  Some versions of i386
+         SVR4.2 make `uname' equivalent to `uname -n'
+
+lib/readline/memalloc.h
+       - removed from the library; not needed since readline does not use
+         alloca
+
+lib/readline/{history.c,isearch.c,search.c,rldefs.h}, lib/tilde/tilde.c
+       - no longer include memalloc.h
+
+lib/readline/Makefile
+       - remove dependencies on memalloc.h
+
+lib/readline/signals.c
+       - overhauled signal handling based on ideas from Bruno Haible
+         (haible@ma2s2.mathematik.uni-karlsruhe.de) so that readline
+         saves and restores the signal mask and flags on Posix systems
+       - don't include fcntl.h, sys/file.h, errno.h, or stdlib.h
+       - ignore SIGALRM during rl_signal_handler like SIGINT until the
+         old handler is installed, on non-Posix or non-BSD systems
+       - new define SIGHANDLER_RETURN, dependent on the value of
+         VOID_SIGHANDLER
+       - use RETSIGTYPE instead of `sighandler' as the signal handler
+         return type; it's the name autoconf uses.  If not defined,
+         set up from VOID_SIGHANDLER
+
+lib/readline/rltty.c
+       - call control_meta_key and control_keypad from rl_deprep_terminal
+         before putting the terminal back into ICANON mode to avoid
+         messing up the tty driver
+
+                                  8/15
+                                  ----
+cpp-Makefile
+       - changes so that fewer -Idir arguments are passed to the make
+         in ./builtins
+
+                                  8/16
+                                  ----
+lib/readline/bind.c
+       - use KEYMAP_SIZE instead of 128 in rl_invoking_keyseqs_in_map
+
+lib/readline/complete.c
+       - qsort the array of matches omitting matches[0], which must stay
+         in place no matter what, even if strcmp doesn't compare unsigned
+         chars correctly
+       - some fixes to the loop that prints the list of completions
+
+lib/readline/keymaps.c
+       - run the loop up to 127 when creating a new keymap in rl_make_keymap
+
+input.h, general.h, lib/readline/keymaps.h, lib/readline/tilde.h
+       - use _FUNCTION_DEF instead of __FUNCTION_DEF
+
+lib/readline/parens.c
+       - include "config.h" if HAVE_CONFIG_H is defined
+       - include <sys/select.h> if HAVE_SYS_SELECT_H is defined
+       - use HAVE_SELECT instead of FD_SET as the `configuring define';
+         define HAVE_SELECT if it is not already defined but FD_SET is
+
+lib/readline/readline.c, lib/readline/rltty.c
+       - the __GO32__ include file is <pc.h>
+
+lib/tilde/tilde.c
+       - rewrote tilde_expand_word, eliminated static u_name array in
+         favor of using xmalloc
+
+lib/tilde/tilde.h
+       - use single leading underscore for file inclusion guard
+
+lib/readline/vi_mode.c
+       - use KEYMAP_SIZE rather than a literal 127 as the loop limit when
+         creating the overstrike keymap
+
+support/install.sh
+       - new file, from the make-3.71 distribution
+
+                                  8/17
+                                  ----
+lib/readline/complete.c, lib/readline/readline.h
+       - new variable, rl_basic_quote_characters, used to see
+         if a word break character was a quoting character, so we can
+         do appropriate quoting after the completion
+
+lib/readline/parens.c
+       - use rl_basic_quote_characters when trying to find a matching
+         open paren
+
+lib/readline/doc/rltech.texinfo
+       - description of rl_basic_quote_characters
+
+                                  8/18
+                                  ----
+newversion.c
+       - renamed to support/mkversion.c, which builds to mkversion
+
+cpp-Makefile
+       - changed to use support/mkversion
+       - removed instances of $< except in suffix rules -- some makes don't
+         handle those right
+
+lib/readline/rldefs.h
+       - make sure to #undef HAVE_DIRENT_H on NeXT machines
+
+                                  
+                                  8/19
+                                  ----
+lib/readline/readline.h
+       - removed some duplicate function declarations
+
+trap.h
+       - define DEBUG_TRAP as NSIG for the last slot in trap_list
+       - define EXIT_TRAP as 0
+       - declare trap_list as array of unknown size, since this is just a
+         header file
+
+trap.c
+       - extend trap_list and sigmodes to NSIG+1
+       - initialize DEBUG_TRAP to do nothing; changes to functions to handle
+         DEBUG_TRAP
+       - let decode_signal return OK if NSIG is given, even though this will
+         vary between systems, for DEBUG_TRAP
+       - make reset_signal_handlers and restore_original_signals loop from
+         1 to NSIG, not 0 to NSIG
+       - change GET_ORIGINAL_SIGNAL to try to get the original signal handler
+         only if `sig' is less than NSIG
+       - restore_default_signal just frees the trap string for both EXIT_TRAP
+         and DEBUG_TRAP
+       - run_debug_trap: new function to run traps on DEBUG
+       - free_trap_command: new function to free a trap string if it is
+         really a command and not one of the special trap values
+       - if a SIGINT trap resets the SIGINT trap string, free the old string
+       - new function: set_debug_trap(char *), which will reset the DEBUG
+         trap string, suitable for calling from an unwind-protect handler
+
+signames.c
+       - arrange things so that signal_names[NSIG] == "DEBUG"
+
+builtins/trap.def
+       - make sure traps on DEBUG are printed
+
+execute_cmd.c
+       - call run_debug_trap at the end of the `cm_simple' case in
+         execute_command_internal
+       - change execute_function so that traps on DEBUG do not propagate
+         into the function
+
+documentation/bash.1, documentation/features.texi
+       - documented the new DEBUG trap
+
+                                  8/20
+                                  ----
+shell.c, config.h
+       - made the name of the restricted shell configurable in config.h;
+         the option is RESTRICTED_SHELL_NAME
+
+shell.c
+       - if the shell is invoked as `sh', enter Posix.2 mode after running
+         /etc/profile and ~/.profile
+
+builtins/read.def
+       - added a -p option for a prompt string, which is displayed before
+         trying to read anything
+
+documentation/bash.1
+       - description of `read -p'
+       - description of new -r and -s options to `jobs' 
+
+documentation/features.texi
+       - description of new -r and -s options to `jobs' 
+
+jobs.c
+       - new functions: list_running_jobs, list_stopped_jobs
+       - list_jobs -> list_all_jobs
+       - new function `print_job' to do the work for all of the list*jobs
+         functions
+       - list_one_job type now void, calls print_job to do the work
+
+jobs.h
+       - new declarations for list_running_jobs, list_stopped_jobs
+       - list_one_job now void
+       - list_jobs -> list_all_jobs
+
+builtins/jobs.def
+       - new options: -r to print only running jobs, -s to print only
+         stopped jobs
+
+                                  8/22
+                                  ----
+lib/readline/readline.c
+       - don't try to expand a null prompt string
+
+subst.c
+       - remove special handling of hostname_completion_file and
+         history_control; HOSTFILE and HISTCONTROL are the acceptable
+         names
+       - new function sv_histignore; call if HISTIGNORE variable is
+         assigned to
+
+bashhist.c
+       - new functions and declarations for handling HISTIGNORE variable
+         and its specifications for command lines to ignore
+       - change maybe_add_history to call history_should_ignore if the
+         HISTCONTROL tests are passed
+
+documentation/bash.1, documentation/features.texi
+       - removed mention of history_control and hostname_completion_file
+       - added description of HISTIGNORE
+
+                                  8/23
+                                  ----
+array.c, array.h
+       - promoted to the shell mainline code; the `array' subdir is now
+         gone
+
+variables.h
+       - include `array.h' for the ARRAY typedef
+
+variables.c
+       - changes to assignment() to handle array assignments a[x]=b
+       - split off the creation of new variables into a new function:
+         make_new_variable
+       - split off the construction of variable values for assignments and
+         bindings into a new function: make_variable_value
+       - new function: bind_array_variable, to handle the addition of
+         new array variables and indices
+
+subst.c
+       - changes to do_assignment_internal to handle a[x]=b:
+               parse the subscript out of the name and call evalexp() on it
+               call bind_array_variable to do the value assignment
+       - change the printing of assignment statements when -x is in effect
+         to before the variable binding is attempted, so any error messages
+         look better
+       - new functions for referencing indexed arrays and to find the length
+         of arrays or array indices
+
+                                  8/24
+                                  ----
+expr.c
+       - fixed up error reporting to use get_name_for_error if not executing
+         a builtin
+
+subst.c
+       - everywhere evalexp() is called, use maybe_expand_string to expand
+         the expression (calls expand_string if necessary)
+
+subst.h
+       - extern declarations for array convenience functions exported to the
+         rest of the shell
+
+variables.c
+       - more new convenience array functions: make_new_array_variable and
+         convert_var_to_array
+
+builtins/declare.def
+       - additions to declare_internal to add a -a flag which makes array
+         variables, and the requisite semantics (declare +a does not work,
+         declare -a name=value does not work, etc.)
+       - code to support the ksh-like declare a[] syntax to make array
+         variables
+
+builtins/setattr.def
+       - made set_or_show_attributes understand array variables and `-a'
+
+builtins/set.def
+       - changes to make `unset name' work, where name is an array variable
+       - changes to make `unset name[xxx]' work
+
+                                  8/25
+                                  ----
+
+lib/readline/readline.c
+       - make sure meta characters are added to a keyboard macro as
+         ESC-char if we are converting meta chars to ascii
+       - change rl_unix_word_rubout to handle repeat counts
+       - move the check of LC_CTYPE from rl_initialize to
+         readline_initialize_everything, where it should have been
+         all along
+
+error.c
+       - make sure <sys/types.h> is included before <fcntl.h>
+
+machines.h
+       - new entry for Bull DPX2
+
+lib/tilde/tilde.c
+       - include <sys/types.h> before <pwd.h>
+
+variables.c
+       - PS1 and PS2 are no longer non-unsettable
+
+                                  8/26
+                                  ----
+variables.c
+       - PPID, UID, and EUID, since they are read-only, need not appear on
+         the `non-unsettable' list
+       - PATH and IFS now have the `nounset' attribute set rather than use
+         a separate `non-unsettable' list
+       - the non-unsettable list and non_unsettable() are gone
+
+variables.h
+       - new define `non_unsettable_p' to test nounset attribute
+
+builtins/set.def
+       - `unset' now uses non_unsettable_p to tell whether a variable can
+         be unset even if it's not readonly
+
+builtins/read.def
+       - read -a arrayname will read a list of values from stdin and assign
+         them to the array `arrayname', splitting on " \t\n" (honoring
+         backslash quoting if -r is not supplied)
+
+builtins/declare.def
+       - print values of arrays when `display -a' is invoked
+
+builtins/exit.def
+       - remove references to `bye'
+
+                                  8/28
+                                  ----
+lib/readline/rltty.c
+       - removed calls to control_keypad; they cause problems on some
+         machines and should not really be performed by an application
+
+cpp-Makefile
+       - support for optionally linking array.o into the shell
+
+lib/glob/glob.c
+       - when returning an error after glob_filename on the directory name
+         returns an error result, make sure to free `result'.  This fixes
+         a memory leak for names passed to glob_filename which contain
+         globbing characters before the first `/' but do not match any
+         existing files
+
+                                  8/29
+                                  ----
+execute_cmd.c
+       - the `for' and `select' commands should expand their word lists
+         using expand_words_no_vars
+
+command.h, execute_cmd.c, general.c, make_cmd.c, print_cmd.c, subst.c,parse.y
+       - changed the `dollar_present', `quoted', and `assignment' members
+         of WORD_DESC to a single flags word
+
+                                  8/30
+                                  ----
+variables.c
+       - make get_string_value return array[0] if called with a variable
+         that is an array
+
+                                  8/31
+                                  ----
+lib/readline/display.c
+       - don't take the value of _rl_term_autowrap into account when
+         computing which screen line the cursor should be on; it screws
+         up wrapping on terminals without the `xn' capability
+
+lib/readline/examples/rltest.c
+       - new file, test code moved here from readline.c
+
+documentation/features.texi, lib/readline/doc/hsuser.texinfo
+       - fixed up printing of some of the shell options and the history
+         commands and modifiers
+
+subst.c
+       - make sure $name, where `name' is an array variable, returns
+         ${name[0]}
+
+variables.c
+       - convert a variable to an array even if index 0 is being assigned to,
+         instead of leaving it a `normal' variable
+
+                                   9/1
+                                   ---
+
+builtins/setattr.def
+       - make sure that array variables printed by `declare' single-quote
+         the value after the `=' so the statement can be reused as input
+
+variables.c
+       - make sure array variables can be exported (name=(assignments)), and
+         that the export code works.  The code is commented out because of
+         the possible confusion between an array and a regular string that
+         looks like an array assignment string.
+
+                                   9/2
+                                   ---
+variables.c
+       - make sure there is an executable file with the same name as
+         `shell' name in the current directory before assigning it to
+         $BASH at startup.  If there is not, just make $BASH the login
+         shell name
+
+                                   9/3
+                                   ---
+parse.y
+       - removed a reduction from the `list0' production that could cause
+         statements which require semicolons to be allowed without error
+         (like before a `}' in a group command)
+
+lib/readline/display.c
+       - new functions: _rl_save_prompt and _rl_restore_prompt to save and
+         restore prompt invisible character info
+       - if the redisplay code encounters a line shorter than the old one
+          and containing invisible characters, make sure that the cursor is
+         at the end of the new text before calling clear_to_eol
+       - new variable last_invisible containing the index in the prompt
+         string of the last invisible character.  We only have to redraw
+         the prompt string of _rl_last_c_pos is < last_invisible
+       - new function _rl_make_prompt_for_search to take care of setting
+         up the prompt string for a non-incremental search when the prompt
+         contains invisible characters
+       - fix so that a prompt string with invisible characters is not
+         redrawn each time through update_line (don't tputs term_cr unless
+         the cursor is before the last invisible character in the prompt
+         and will be moving past the last invisible char of the prompt
+
+lib/readline/isearch.c
+       - call _rl_save_prompt and _rl_restore_prompt when changing the prompt
+         to do i-search
+
+                                   9/4
+                                   ---
+lib/readline/readline.c
+       - doing_an_undo -> _rl_doing_an_undo for use by the vi-mode code
+       - rewrote rl_do_undo to reformat and eliminate a clumsy goto
+       - new split the add-to-kill-ring code off into a separate function,
+         _rl_copy_to_kill_ring
+       - added a new bindable function rl_copy_region_as_kill
+       - added a new bindable function rl_kill_region
+       - moved _rl_char_search_internal to here from vi_mode.c
+       - new bindable function rl_char_search
+
+lib/readline/vi_mode.c
+       - made `.' work for the `cw' and `[Ss]' commands, which implicitly
+         put the editor into insertion mode after they run
+       - split rl_vi_char_search code that actually searches for a character
+         into a new function, _rl_char_search_internal
+
+lib/readline/emacs_keymap.c
+       - bind M-= to possible-completions for ksh compatibility
+       - bind M-* to insert-completions
+       - bind C-x C-x to exchange-point-and-mark
+       - bind C-] to character-search
+       - bind C-@ to set-mark
+
+lib/readline/funmap.c
+       - new bindable function names: exchange-point-and-mark, kill-region,
+         copy-region-as-kill, character-search
+
+lib/readline/readline.h
+       - declare rl_exchange_point_and_mark, rl_copy_region_to_kill,
+         rl_kill_region, and rl_char_search externally
+
+documentation/{bash.1,readline.3}, lib/readline/doc/rluser.texinfo
+       - document new exchange-point-and-mark bindable command
+       - documented M-* default emacs-mode binding to insert-completions
+       - documented new copy-region-as-kill and kill-region commands
+       - documented new character search emacs-mode command
+       - documented new binding for set-mark
+
+lib/readline/rldefs.h
+       - moved values for `dir' when searching for characters in the line
+         from vi_mode.c to here
+
+                                   9/6
+                                   ---
+general.c
+       - new function ansicstr, which decodes ANSI-C backslash-escaped
+         characters (with the addition of \e and \E to mean escape) and
+         returns a new string
+
+subst.c
+       - new expansion $'...' which translates ANSI-C backslash escapes
+         in `...' and expands to the result
+
+builtins/echo.def
+       - ifdefs for ANSI-C for \a and \v rather than just expanding to
+         literal ASCII values
+
+documentation/bash.1
+       - documented new $'...' expansion
+
+                                   9/7
+                                   ---
+builtins/enable.def
+       - fixed up the help text
+       - added a -s flag to restrict operation to Posix.2 `special' builtins
+       - removed -all option; -a is the way to do it now
+       - converted to use the builtin getopt
+
+builtins/common.c
+       - changed builtin_address_internal to return a pointer to a
+         struct builtin, which makes it much more useful.  Changed
+         find_shell_builtin and builtin_address accordingly
+       - new function find_special_builtin, which returns special builtins
+         ((flags & SPECIAL_BUILTIN) != 0)
+
+execute_cmd.c
+       - in Posix.2 mode, find special builtins before shell functions
+         when performing command lookup
+       - in find_user_command_internal, return NULL if there is no $PATH
+       - in Posix.2 mode, failure of a special builtin causes a non-
+         interactive shell to exit
+
+variables.c
+       - allow $PATH to be unset
+
+                                   9/8
+                                   ---
+input.h
+       - added a new `input type': st_stdin, for use when using readline,
+         since readline is not properly a string
+
+parse.y
+       - surgery on the grammar:
+               o added new `compound_list' production: a list that can end
+                 without a newline, `;' or `&' (used in subshell commands
+                 and case clause commands)
+               o removed shell_command_1, folded rules into command
+               o eliminated pattern_list_1; changed case_clause_sequence to
+                 directly incorporate the SEMI_SEMI token (a pattern_list_1
+                 was just a pattern_list with a trailing SEMI_SEMI)
+               o new `for_command' and `case_command' productions
+               o redirections -> redirection_list
+               o newlines -> newline_list
+               o redid the code that attaches redirections to the function
+                 command rather than the function definition and eliminated
+                 all of the shift/reduce conflicts
+       - changed with_input_from_stdin in the readline case to set
+         bash_input.type to st_stdin
+
+print_cmd.c
+       - a couple of changes to the way functions are printed
+
+shell.c
+       - only execute the PROMPT_COMMAND if input is not coming from a
+         string (bash_input.type != st_string).  This fixes the problem
+         of PROMPT_COMMAND being executed by `eval' commands in an
+         interactive shell
+
+                                  9/12
+                                  ----
+shell.c
+       - all interactive shells SIGHUP running jobs when exiting due to
+         a SIGHUP, not just login shells
+
+                                  9/13
+                                  ----
+config.h, config.h.mini
+       - changed the default primary prompt (PPROMPT) to "\s\$ "
+       - removed the INTERACTIVE_COMMENTS define
+
+flags.c
+       - interactive comments are now enabled by default, regardless of the
+         INTERACTIVE_COMMENTS define
+
+input.h
+       - a new enum: stream_type, used in the BASH_INPUT struct
+
+parse.y
+       - bash_input.type is now initialized to st_none
+
+bashhist.c
+       - command_oriented_history is now the default
+
+documentation/bash.1
+       - removed description of `nolinks' variable, updated set -P
+         description
+       - removed description of `notify' variable, updated set -b
+         description
+       - removed description of `noclobber' variable, updated set -C
+         description
+
+variables.c
+       - IFS may now be unset
+
+builtins/read.def
+       - now does the right thing if IFS is unset (acts as if it is
+         set to " \t\n")
+
+builtins/cd.def
+       - added a new parameter to change_to_directory () which says
+         whether or not to follow symlinks, instead of using the
+         global no_symbolic_links
+       - changed cd_builtin to accept a -P option to disable symlink
+         following temporarily
+
+builtins/ulimit.def
+       - instead of using a hardcoded `long' for the return type of the
+         rlimit functions, use RLIMTYPE, which defaults to long
+       - new defines string_to_rlimtype -> string_to_long and
+         print_rlimtype for systems which do not need `RLIMTYPE' defined
+         to something other than long
+
+general.c
+       - function replacements for string_to_rlimtype and print_rlimtype
+         for machines which have RLIMTYPE defined in the machine description
+
+general.h
+       - extern declarations for string_to_rlimtype and print_rlimtype
+
+shell.c
+       - don't source file named by $ENV at script startup if act_like_sh
+         is turned on
+
+machines.h
+       - new entry for amiga/netbsd
+       - change all the netbsd entries to add -DRLIMTYPE=quad_t to
+         SYSDEP_CFLAGS
+
+siglist.h
+       - define sys_siglist as _sys_siglist on the amiga only if USGr4 is
+         defined
+
+print_cmd.c
+       - change so that printf is not prototyped on LynxOS with gcc
+
+lib/readline/Makefile
+       - changed the `installdirs' target to not fail if the directories
+         do not need creating
+
+lib/readline/history.c
+       - fixed a bug in history_arg_extract which manifested itself when
+         !* was used after a command without arguments (e.g., pwd ; echo !*)
+
+                                  9/15
+                                  ----
+subst.c
+       - expand_word_internal should preserve the flags (other than
+         W_QUOTED) from the word passed as a parameter on the word it returns
+       - expand_words_internal renamed to expand_word_list_internal
+       - expand_word_list_internal does not perform word splitting or
+         globbing on words with the W_ASSIGNMENT bit set
+       - removed special treatment of `notify', `command_oriented_history',
+         `history_control', and `nolinks'
+       - rewrote some of the sv_* functions to remove or avoid calls to
+         sscanf, one of the most expensive C library functions
+
+variables.c
+       - don't look for $command_oriented_history at startup, since it now
+         defaults to `on'
+
+general.h, general.c
+       - new function posix_initialize to do whatever is necessary to enable
+         `Posix mode'
+
+shell.c, subst.c
+       - call posix_initialize
+
+general.c
+       - rewrote replacements for strchr, strrchr to make them faster
+
+builtins/enable.def
+       - new -f option and necessary support to load builtins from a shared
+         object file on systems supporting both dlopen() and dlsym().  New
+         builtins loaded this way can replace existing shell builtins or
+         add completely new functionality
+
+builtins.h
+       - mkbuiltins.c creates `static_shell_builtins', which is a fixed
+         array, `shell_builtins' points to this array initially
+       - extern declaration for current_builtin
+
+builtins/mkbuiltins.c
+       - change to creat static_shell_builtins[] and declare shell_builtins
+         as a pointer to it
+       - change to declare `current_builtin' in created builtins.c
+
+builtins/source.def
+       - print an error message and return failure if no filename argument
+         is supplied
+
+builtins/common.c
+       - current_builtin is set by find_shell_builtin, find_special_builtin,
+         and builtin_address_internal
+       - new function builtin_usage, which prints the contents of
+         current_builtin->short_doc
+
+builtins/{bind,declare,enable,fc,getopts,hash,history,jobs,kill,read,set,
+         setattr,trap,ulimit,umask}.def
+       - changed the builtins in these files to use builtin_usage() to
+         print usage messages
+
+cpp-Makefile
+       - support for the HAVE_DLOPEN and HAVE_DLSYM defines
+
+machines.h
+       - added -ldl and -Bdynamic to the SunOS4 entry
+
+documentation/{bash.1,features.texi}
+       - documented new enable -f option to dynamically load builtins
+
+                                  9/16
+                                  ----
+test.c
+       - added `==' as a synonym for `='
+
+                                  9/18
+                                  ----
+bashline.c
+       - include readline/rlconf.h so that VI_MODE is defined if
+         appropriate
+
+shell.c
+       - removed `-nobraceexpansion' option
+
+flags.c, flags.h
+       - added new -B flag; enabled if brace expansion is turned on
+
+subst.c
+       - use brace_expand instead of !no_brace_expand
+
+builtins/set.def
+       - change set -o braceexpand to be equivalent to set -B
+
+parse.y
+       - in with_input_from_stdin, do nothing if bash_input.type already
+         is st_stdin or if there is already a stream with type st_stdin
+         on the saved stream stack
+       - new function stream_on_stack to find out if there is a saved
+         stream of a specified type
+
+documentation/bash.1, documentation/features.texi
+       - doeumented new set -B option
+       - removed -nobraceexpansion shell startup option
+
+                                  9/19
+                                  ----
+builtins/reserved.def
+       - made `help select' work
+
+cpp-Makefile
+       - removed references to the nonexistant `load.def'
+       - removed conditionals based on GETOPTS_BUILTIN
+
+builtins/getopts.def
+       - no longer $DEPENDS_ON GETOPTS_BUILTIN
+
+config.h, config.h.mini, builtins/help.def
+       - made the `help' builtin dependent on the HELP_BUILTIN define
+       - removed GETOPTS_BUILTIN
+
+builtins/mkbuiltins.c
+       - made the `$DEPENDS_ON' clause work for reserved words and
+         shell control structures in reserved.def by writing out
+         dependencies to builtext.h even if there is no `function'
+       - made the long_doc for each builtin and reserved word get
+         written out to builtins.c with #ifdef HELP_BUILTIN surrounding
+         the doc strings -- this makes the minimal shell much smaller
+
+shell.c, documentation/bash.1
+       - removed `-quiet' long option
+
+parse.y
+       - make sure that word splitting is not performed on the prompt
+         string after expanding in prompt_string_decode by calling
+         expand_string_unsplit instead of expand_string
+
+lib/readline/bind.c
+       - new readline variable `mark-directories': if set, completed
+         directory names have a slash appended
+
+lib/readline/complete.c
+       - support for `mark-directories'
+
+documentation/{bash.1,readline.3}, lib/readline/doc/rluser.texinfo
+       - documented the new `mark-directories' variable
+
+builtins/bind.def
+       - new option `-r' to remove a binding for a specified key sequence
+       - make sure that a failure return from bind resets the keymap
+         correctly if a -m option was supplied
+
+documentation/{bash.1,features.texi}
+       - documented new bind -r option
+
+                                  9/20
+                                  ----
+builtins/jobs.def
+       - new `disown' builtin
+
+documentation/{bash.1,features.texi}
+       - documented new `disown' builtin
+
+cpp-Makefile
+       - removed support for `MAKE_SHELL' cpp variable
+       - renamed endian.aux to mkendian, look for endian.c in support dir
+       - link in array.o, alias.o, braces.o, bracecomp.o
+         unconditionally, rely on cpp defines in the files to exclude code
+       - pass -DHAVE_SYS_SIGLIST if sys_siglist is defined
+       - pass -DHAVE_GETCWD if HAVE_GETCWD is defined in machines.h
+       - pass -DHAVE_VFPRINTF_EMUALTION through from machines.h to
+         compilation
+
+array.c
+       - don't compile in body of file unless ARRAY_VARS is defined
+
+braces.c
+       - don't compile in body of file unless BRACE_EXPANSION is defined
+
+alias.c
+       - don't compile in body of file unless ALIAS is defined
+
+bracecomp.c
+       - don't compile in body of file unless BRACE_EXPANSION and READLINE
+         are defined
+
+bashline.c
+       - don't compile in body of file unless READLINE is defined
+
+bashhist.c
+       - don't compile in body of file unless HISTORY is defined
+
+siglist.c
+       - don't compile in body of file unless HAVE_SYS_SIGLIST is not
+         defined
+
+getcwd.c
+       - don't compile in body of file unless HAVE_GETCWD is not defined
+
+vprint.c
+       - don't compile in body of file unless USE_VFPRINTF_EMULATION
+         is defined
+
+support/mksysdefs
+       - for SCO machines, define SYSDEF as SCO or SCOv4
+
+lib/readline/readline.[ch]
+       - new function rl_push_macro_input (s), which makes s the current
+         macro input string
+
+endian.c
+       - renamed to support/endian.c
+
+                                  9/21
+                                  ----
+lib/readline/complete.c
+       - more file types for the VISIBLE_STATS code:
+               |       FIFOs
+               %       character special devices
+               #       block special devices
+
+lib/readline/isearch.c
+       - made RETURN an alternate search string terminator
+
+builtins/read.def
+       - removed use of stdio -- unbuffered stdio on a dup of fd 0 is
+         a big loss
+
+builtins/set.def
+       - new function: minus_o_option_value, returns 1, 0, or -1 given
+         a -o option name (-1 means a bad name)
+       - reorganized list_minus_o_options to be more efficient
+
+execute_cmd.c
+       - when expanding a here document, use maybe_expand_string rather
+         than a simple expand_string to try a speed things up a bit
+
+input.c
+       - don't compile in the body of the file unless BUFFERED_INPUT
+         is defined in config.h
+
+                                  9/22
+                                  ----
+jobs.h, siglist.h
+       - replaced instances of Solaris with SunOS5
+
+shell.c
+       - changed long option parsing code so that --arg is equivalent
+         to -arg, when `arg' is one of the recognized multichar options
+
+builtins/history.def
+       - rewrote to regularize the option parsing and use internal_getopt
+       - now allows only one of -awrn to be specified
+       - added a new -p option that adds each of its arguments to the
+         end of the history list, and deletes the `history -p' history
+         entry
+
+builtins/trap.def
+       - added new -p option to display specified trap values, or all
+         trap values if no other arguments supplied
+
+documentation/{bash.1,features.texi}
+       - documented new history -p option
+       - documented new trap -p option
+
+                                  9/25
+                                  ----
+lib/readline/display.c
+       - fixed up the calcluation of the correct cursor line number (a `+'
+         and `-' were transposed in the calculation of `nleft')
+
+                                  9/26
+                                  ----
+general.c
+       - moved isint() here from test.c, renamed to legal_number
+
+general.h
+       - extern declaration of legal_number
+
+test.c
+       - only compile isint() if SHELL is not defined, define it as
+         legal_number otherwise
+
+trap.c
+       - use legal_number in decode_signal instead of sscanf()
+
+builtins/common.c
+       - moved list_sigs to here from trap.def, renamed to
+         display_signal_list
+       - changed get_numeric_arg to use legal_number instead of doing
+         the parsing and calculation itself
+
+builtins/common.h
+       - extern declaration for display_signal_list
+
+builtins/{trap.def
+       - changed to use display_signal_list for trap -l
+
+builtins/kill.def
+       - changed to use display_signal_list for kill -l
+       - added new kill -n signum option
+
+documentation/bash.1
+       - added description of new kill -l signame functionality
+       - added description of new kill -n signum feature
+       - added description of new enable -d option
+
+builtins.h
+       - added a char *handle member to `struct builtin' for later use
+       - new flags value: BUILTIN_DELETED
+
+builtins/mkbuiltins.c
+       - added code to inintialize the `handle' member to null in the
+         static builtin array definition
+
+builtins/common.c
+       - don't `find' a builtin if the BUILTIN_DELETED flag is set in the
+         flags word of the struct builtins array
+
+builtins/enable.def
+       - new option -d to remove a builtin loaded with -f, depends on
+         HAVE_DLCLOSE
+
+cpp-Makefile
+       - pass -DHAVE_DLCLOSE through from machines.h to compilation
+
+machines.h
+       - change SunOS4 machine description to define HAVE_DLCLOSE
+
+                                  9/27
+                                  ----
+shell.c
+       - split shell exit code off into a separate function: exit_shell(status)
+
+builtins/exec.def
+       - rewrote for clarity and speed and to use the builtin getopt()
+       - added new -a, -c, and -l options
+       - now calls exit_shell if shell_execve fails and the shell is not
+         interactive
+
+documentation/bash.1
+       - documented the new options to `exec'
+
+                                  9/28
+                                  ----
+builtins/exec.def
+       - if the execve fails and the shell is not going to exit, reinitialize
+         traps and signals
+       - only call end_job_control if subshell_environment != 0
+       - exec should exit unconditionally if the execve fails and
+         subshell_environment != 0
+
+subst.c
+       - if valid_brace_expansion_word fails, make sure `temp' is set to
+         NULL before trying to free it after the `goto bad_substitution'
+
+cpp-Makefile
+       - add $(CPPFLAGS) to the compilation flags when making `mksignames'
+
+documentation/features.texi
+       - fixed a typo in the tilde expansion section
+
+                                  9/29
+                                  ----
+machines.h
+       - DEC OSF/1 has the dlopen/dlsym/dlclose set of library functions
+
+shell.c
+       - don't execute /etc/profile if -noprofile given
+
+builtins/pushd.def
+       - new file, pushd/popd/dirs split off from cd.def
+       - replaced calls to sscanf with calls to legal_number
+
+builtins/Makefile, cpp-Makefile
+       - changes for pushd.def
+
+config.h, config.h.mini
+       - ALLOW_RIGID_POSIX_COMPLIANCE is no longer used
+
+subst.c, variables.c
+       - GETOPTS_BUILTIN is no longer used
+
+variables.c
+       - if the first character of argv[0] is not a `/', search the path
+         and canonicalize the result to find out how to set $BASH
+
+                                  10/2
+                                  ----
+builtins/enable.def
+       - changed enable_shell_builtin to use builtin_address_internal to find
+         the builtin rather than searching the list itself
+       - list_some_builtins skips a builtin if flags & BUILTIN_DISABLED != 0
+       - rewrote dyn_load_builtin to take a list of names to load from a
+         single filename
+       - don't dlclose the shared object in dyn_unload_builtin unless its
+         reference count drops to 0
+
+builtins/test.def
+       - don't bother making new copies of everything in the argument list
+         when constructing the argc and argv for test_command; just make
+         sure not to free anything but ARGV
+
+                                  10/3
+                                  ----
+bashline.c
+       - remove C-e binding in vi movement mode which switches into emacs
+         mode
+
+general.c
+       - make xfree only try to call free on non-null strings
+
+                                  10/4
+                                  ----
+builtins/read.def
+       - new `-e' option that uses readline to read the line
+       - if one of the arguments is not a legal variable name, print an
+         error message and return failure
+
+builtins/reserved.def
+       - changed the `Variables' to `variables' so `help variables' works
+
+subst.c
+       - set startup_state to 2 in child of command substitution to try to
+         avoid some unneeded forks
+
+trap.c
+       - removed call to reset_terminating_signals in restore_original
+         signals; callers are now required to take care of that themselves,
+         if necessary
+
+execute_cmd.c, subst.c
+       - added necessary calls to reset_terminating_signals before calls
+         to restore_original_signals
+
+execute_cmd.c
+       - when executing a null command in a subshell, don't bother passing
+         a string to make_child; just pass NULL
+       - in execute_builtin_or_function, don't add so many unwind-protects
+         if `subshell' == 1
+       - in command_substitute, call cleanup_the_pipeline to discard the
+         old pipeline, so pipeline_pgrp does not get set to 0 in
+         start_pipeline, which is called by make_child via making_children
+
+jobs.c, nojobs.c
+       - new function, ignore_tty_job_signals, to set SIGTTIN, SIGTTOU, and
+         SIGTSTP to SIG_IGN
+       - new function, default_tty_job_signals, to set those signals
+         to SIG_DFL
+       - new function, cleanup_the_pipeline to free up the_pipeline and
+         set it to NULL
+
+                                  10/5
+                                  ----
+builtins/history.def
+       - the history -p option is now -s (to sort of parallel the ksh
+         print -s option)
+       - the -s option now combines all of its arguments into a single
+         string and appends the string to the history list
+       - new history -p option to history expand each argument and print
+         the result without modifying the history list
+
+documentation/bash.1, documentation/features.texi
+       - documented the new -e option to read
+       - documented the new history -s and -p options
+       - documented the new cd and pwd -L options
+
+builtins/cd.def
+       - changed cd and pwd to use internal_getopt
+       - added the -L option to cd and pwd to follow symlinks (like if
+         set +P were issued)
+
+builtins/pushd.def
+       - added text for dirs +N and dirs -N to the dirs builtin long doc
+       - added -v option to dirs to print dirstack one dir per line with
+         stack index prepended
+
+                                  10/6
+                                  ----
+execute_cmd.c
+       - split the command searching code into a new function:
+         search_for_command
+       - removed a bunch of dead code from shell_execve
+       - removed call to reset_terminating_signals when executing a function
+         or builtin in a subshell (either via (xxx) or xxx &)
+       - don't add unwind protects at all in execute_function if subshell == 1
+
+lib/readline/chardefs.h
+       - new macro ALPHABETIC(c), returns 1 if c is a letter or digit
+
+lib/readline/readline.c
+       - don't call abort() in rl_change_case(); it's impolite in a
+         library function
+       - new macro, SWAP, used to swap values of two integers
+       - changed alphabetic to use ALPHABETIC, made it slightly faster
+       - modified rl_change_case() so that word capitalization is the
+         same as GNU Emacs
+
+lib/readline/search.c
+       - in noninc_dosearch, don't reset the history positition to what
+         it was if we're currently in vi editing mode (as per Posix.2
+         `/' and `?' vi-mode editing commands)
+
+                                  10/7
+                                  ----
+builtins/common.c
+       - changed single_quote and double_quote to use char pointers
+         rather than string indexing
+       - new function backslash_quote(string), which quotes special
+         characters in STRING using backslashes
+
+                                  10/8
+                                  ----
+alias.h
+       - added an extern declaration for alias_expand_word
+
+parse.y
+       - broke the alias expansion code off into a function
+         alias_expand_token; its return value says whether to re-read
+         a token or go on
+       - changed the alias expansion code to handle aliases that expand
+         to nothing better
+       - broke the code that does special-case token recognition off into
+         a function: special_case_tokens
+       - used the new functions to make sure that the special-case tokens
+         can be the expansion of an alias
+       - made sure that if in `posix mode' that reserved words cannot be
+         aliased and that all reserved words can be the values of aliases
+         and be recognized after expansion
+
+                                  10/10
+                                  -----
+lib/readline/complete.c
+       - replaced #ifdef SHELL code with two new exported readline interfaces:
+         rl_filename_quoting_function and rl_filename_dequoting_function.
+         Both return a pointer to char.
+       - new extern variable rl_filename_quote_characters, containing a list
+         of characters that cause a word to be quoted by the completer if
+         they appear in a file name
+
+bashline.c
+       - new functions for rl_filename_quoting_function and
+         rl_filename_dequoting_function.
+       - initialize rl_filename_quoting_function and rl_filename_dequoting_function
+         in initialize_readline
+       - initialize rl_filename_quote_characters
+
+lib/readline/readline.h
+       - extern declarations for new public interfaces
+         rl_filename_quoting_function and rl_filename_dequoting_function
+       - added declarations for NO_MATCH, SINGLE_MATCH, and MULT_MATCH for
+         use by the filename quoting functions
+       - new extern declaration for rl_filename_quote_characters
+
+lib/readline/history.c
+       - made a version of single_quote be compiled in if SHELL is not
+         defined
+       - the `q' and `x' modifiers are now compiled in by default, not
+         just if SHELL is defined
+
+                                  10/11
+                                  -----
+subst.c
+       - string_quote_removal was being a little overzealous in stripping
+         things within embedded quoted strings when `quoted' was == 1.
+         Only remove one level of quotes each time through the function
+         This fixes the problem of quotes being stripped incorrectly in
+               var="The text \"hello\" should show up inside double quotes."
+
+lib/readline/history.c
+       - made the behavior of single quotes inhibiting history expansion
+         configurable with a variable: history_quotes_inhibit_expansion,
+         not just shell-specific
+       - added a new variable: history_search_delimiter_chars, which is a
+         list of characters that can also delimit a history search string
+
+lib/readline/history.h
+       - extern declaration of history_quotes_inhibit_expansion
+       - extern declaration of history_search_delimiter_chars
+
+bashhist.c
+       - set history_quotes_inhibit_expansion to 1 in bash_initialize_history
+       - initialize history_search_delimiter_chars to ";&()|<>"
+
+lib/readline/doc/{rltech,hstech}.texinfo
+       - documented new readline and history library interfaces
+
+parse.y
+       - split the part of read_token that reads a single word off into
+         a new function: read_token_word
+
+lib/readline/chardefs.h
+       - include <string.h> by default; only check HAVE_STRING_H if
+         HAVE_CONFIG_H is defined
+
+                                  10/12
+                                  -----
+parse.y
+       - moved the `RESET' code out of read_token into reset_parser
+       - rewrote some of decode_prompt_string to make it more efficient
+       - rewrote more of read_token_word to make it more efficient
+       - make shell_getc cast its result to `unsigned char' before
+         returning it.  This fixes the problem of \255 appearing in a
+         line
+
+machines.h
+       - new entry for m68k machines running Linux
+
+                                  10/13
+                                  -----
+builtins/exec.def
+       - use search_for_command rather than find_user_command to look up
+         the path to exec, so the hash table and temp environment are used
+
+variables.c
+       - don't rebuild the export environment after binding a shell
+         function unless that function is exported
+       - make sure that copy_variable copies arrays correctly, using
+         dup_array()
+       - in assign_in_env, only call tilde_expand if a `~' appears somewhere
+         in the value
+
+execute_cmd.c
+       - if we found $PATH in the temp environment in search_for_command,
+         call find_user_command_in_path instead of find_user_command, so
+         we don't try to search the temporary env again.  Call
+         find_user_command as normal if PATH is not in the temp environment
+
+subst.c
+       - char_is_quoted should not be compiled in if READLINE is not
+         defined
+
+lib/readline/complete.c
+       - add a new external interface: Function *rl_char_is_quoted_p,
+         which is called to find out whether a word break character is
+         quoted and should be skipped over when breaking words for
+         the completer
+
+lib/readline/readline.h
+       - extern declaration for rl_char_is_quoted_p
+
+bashline.c
+       - initialize rl_char_is_quoted_p to char_is_quoted
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_char_is_quoted_p
+
+lib/readline/readline.c
+       - extend the undo records so that a `start' or `end' value of -1
+         means rl_point and a value of -2 means rl_end.  This is a start
+         to better support for undoing vi-mode commands like `C'
+
+lib/readline/vi_mode.c
+       - don't save what's entered in insert mode after a `C' command
+         for later insertion when doing a `redo'
+
+                                  10/16
+                                  -----
+test.c
+       - rewrote unop() to use a switch statement instead of a call to
+         strchr
+       - remove #ifdef SHELL blocks by defining getuid, geteuid, getgid
+         and getegid as references to current_user.{uid,euid,gid,egid}
+         respectively
+       - change group_member to only fetch the group list once and to use
+         NGROUPS_MAX or NGROUPS to find the maximum number of groups
+
+documentation/bash.1
+       - fixed description of ${#@} expansion
+
+                                  10/17
+                                  -----
+support/bashbug.sh
+       - add a `From:' line to the mail message handed to rmail
+
+                                  10/18
+                                  -----
+test.c
+       - rewrote binary_operator for speed and clarity
+       - removed age_of, added arithcomp(), filecomp() to support new
+         binary_operator
+       - removed support for `-l string'
+
+documentation/bash.1
+       - removed mention of `-l string' from `test' description
+
+                                  10/19
+                                  -----
+cpp-Makefile
+       - pass PROGRAM as the double-quoted shell name to compilation of
+         shell.c and error.c
+
+                                  10/20
+                                  -----
+support/bashbug.sh
+       - don't try to use ${word:-expansion}; ultrix sh doesn't understand it
+
+hash.c
+       - new function: flush_hash_table (table, free_data) to delete the
+         contents of a given hash table.  *free_data is called to free
+         each item's data, if free() is inappropriate
+
+builtins/hash.def
+       - new functions free_hashed_filenames and free_filename_data to
+         flush the table of hashed filenames
+
+subst.c
+       - change sv_path to call flush_hashed_filenames directly
+
+variables.c
+       - only sort arrays of variables or functions for the environment or
+         `set' output if `posixly_correct' is set.  sh does it; ksh does
+         not, and there's no real requirement to do so
+       - rewrote delete_all_variables so it looks like flush_hash_table
+
+trap.c
+       - two new flag values for the `sigmodes' array: SIG_INPROGRESS,
+         which is set for sigmodes[sig] while a trap handler for sig
+         is executing, and SIG_CHANGED, which is set if a new trap
+         value is set when SIG_INPROGRESS is set.  This should obviate
+         the need to set the trap value to IMPOSSIBLE_TRAP_HANDLER while
+         the trap handler is executing
+
+alias.c
+       - rewrote delete_all_aliases so it looks like flush_hash_table
+
+                                  10/21
+                                  -----
+alias.c
+       - changed delete_all_aliases to call flush_hash_table directly
+         and use free_alias_data as the `free function' argument
+
+variables.c
+       - changed delete_all_variables to call flush_hash_table directly
+
+tests/run-test, tests/test-tests
+       - new scripts to run tests of the `test' builtin as part of the
+         regression test
+
+                                  10/24
+                                  -----
+bashline.c
+       - initialize_hostname_list needs to look for HOSTFILE first
+       - hostname list is no longer sorted
+       - replaced binary search in hostnames_matching with a simple
+         linear search
+       - made the code that reads hostnames skip over the first word on
+         a line only if its first character is a digit, assuming it's
+         an Internet address
+
+copy_cmd.c
+       - removed copy_select_command; overload copy_for_command, since the
+         select and for command structs are exactly the same
+
+make_cmd.c
+       - combined make_for_command and make_select_command into a new
+         function, make_for_or_select
+       - rewrote make_here_document to remove the unneeded `switch' statement
+
+builtins/common.c, builtins/hash.def
+       - moved remove_hashed_filename from common.c to hash.def
+
+builtins/common.c
+       - remove the \r from error message printed by get_working_directory
+       - change parse_and_execute to call dispose_fd_bitmap directly then
+         discard the `pe_dispose' unwind-protect frame rather than running
+         the frame
+
+builtins/set.def
+       - changed how set -o options are set and retrieved, using set and get
+         functions to avoid all that special-case inline code
+
+                                  10/26
+                                  -----
+test.c
+       - added unary operator `-o', which returns true of the shell option
+         name given as an argument is set
+
+lib/readline/readline.c
+       - added a definition of set_lines_and_columns to be called if the
+         library is not compiled -DSHELL
+
+shell.c
+       - added a --verbose startup long option
+       - renamed `--nolineediting' to `--noediting'
+
+                                  10/27
+                                  -----
+lib/readline/util.c
+       - new file, for readline utility functions
+
+lib/readline/readline.c
+       - moved a bunch of functions to util.c
+
+subst.c
+       - make sure set_sigint_handler is called only by the subshells doing
+         command and process substitution
+
+builtins/read.def
+       - make sure that rlbuf is initialized to null
+
+trap.c
+       - new flag for sigmodes[] members: SIG_IGNORED, set when signal is
+         ignored, even if it's special or untrappable
+       - new function: signal_is_ignored (sig), which returns 1 if SIG
+         has been ignored with trap ''
+
+builtins/trap.def
+       - changed to use the builtin getopt
+
+shell.c
+       - added a check to sigint_sighandler for whether or not SIGINT has
+         been ignored with trap '' in an interactive shell.  This fixes
+         the problem with `read' being interruptible in an interactive
+         shell even if SIGINT is being ignored
+
+                                  11/8
+                                  ----
+lib/readline/Makefile
+       - added definition of INSTALLED_HEADERS, just in case
+
+                                  11/11
+                                  -----
+variables.c
+       - change assign_in_env so that it doesn't use savestring ("") to
+         set `value' to a dummy value; don't call strcpy if there's
+         nothing to copy
+
+                                  11/15
+                                  -----
+general.h
+       - new defines, legal_variable_starter and legal_variable_char
+       - new define SIGRETURN(n) which encapsulates the VOID_SIGHANDLER
+         differences when returning from a signal handler
+
+general.c, variables.c, subst.c, expr.c
+       - use legal_variable_starter and legal_variable_char
+
+shell.c, nojobs.c, trap.c, jobs.c, builtins/suspend.def
+       - change to use SIGRETURN macro
+
+subst.c
+       - massive changes to clean up the code and remove unused code and
+         variables
+       - expanded the ${#param} code so that all of the shell special
+         variables may have their length taken
+
+tests/run-tilde
+       - new test for tilde expansion
+
+bashline.c
+       - fix a bug in command_subst_completion_matches: make sure that
+         `matches' is static
+
+parse.y
+       - don't print a prompt when not using readline if the current
+         input type is st_string
+
+machines.h
+       - add -DINT_GROUPS_ARRAY to SYSDEP_CFLAGS on ultrix
+       - fixes to the cray machine description from Bill Jones
+
+braces.c
+       - fixed a bug in brace_gobbler that prevented a backslash from
+         escaping an open brace
+
+                                  11/16
+                                  -----
+tests/braces-tests, tests/run-braces
+       - new regression tests for brace expansion
+
+builtins/pushd.def
+       - new -p option for `dirs' that prints dirstack on per line
+         without numbers
+
+                                  11/17
+                                  -----
+command.h
+       - move redirection error values here from execute_cmd.c
+       - new defines INPUT_REDIRECT and OUTPUT_REDIRECT
+
+shell.c
+       - make the default MAINTAINER `bash-maintainers@prep.ai.mit.edu'
+
+execute_cmd.c
+       - many changes to clean up the code and remove unused variables and
+         functions
+       - new functions: redirection_error, find_in_path_element,
+         find_absolute_program
+       - fixes to redirection error reporting, so things like exec 4<&y*
+         and exec 4<&$FOO are displayed correctly
+       - removed the `lexical_scoping' code
+
+flags.c, flags.h
+       - removed the lexical_scoping code and variable
+
+documentation/{bash.1,features.texi}
+       - removed the description of the `-l' option to `set'
+
+jobs.c
+       - don't try to open /dev/tty to get the controlling tty, use
+         fd 2 like other job control shells
+
+lib/readline/vi_mode.c
+       - when using `d%', make sure the matching character found by
+         the `%' is deleted by the `d'.  Ditto for `c%'.
+       - stub function for vi undo: rl_vi_undo.  Right now it just
+         calls rl_undo_command
+
+lib/readline/vi_keymap.c
+       - change to call rl_vi_undo instead of rl_undo_command
+
+lib/readline/readline.h
+       - extern declaration for rl_vi_undo
+
+                                  11/21
+                                  -----
+execute_cmd.c
+       - fix to print_select_list to avoid a possible divide-by-zero error
+         and subsequent core dump
+       - fix to execute_select_command to just return 0 if there is no
+         select list
+
+parse.y
+       - remove `in' from the list of tokens that cannot take trailing
+         semicolons
+
+builtins/read.def
+       - make sure that leading IFS whitespace is removed before calling
+         get_word_from_string the first time.  This matters when IFS is
+         not " \t\n" but non-null
+       - make sure the array code uses IFS to split the input string
+         before assigning it to the array
+
+                                  11/22
+                                  -----
+parse.y
+       - make sure that if \nnn expands to CTLESC or CTLNUL, the char
+         is protected by a CTLESC
+       - new variable `promptvars', which, if non-zero, causes all the
+         variable expansions to be performed in decode_prompt_string.
+         If zero, only quote removal is performed.
+
+builtins/source.def
+       - new variable: `source_uses_path', set to 1 by default.  If
+         non-zero, the `.' builtin uses $PATH to find the script to
+         source
+
+builtins/getopt.h
+       - cut out everything not needed by bash
+
+builtins/getopt.c
+       - cut out everything not needed by bash
+
+builtins/getopts.def
+       - removed the call to getopt_set_posix_option_order, which is no
+         longer necessary
+
+execute_cmd.c
+       - split the code that writes out here documents to files out into
+         a separate function
+
+                                  11/23
+                                  -----
+builtins/getopt.c, builtins/getopt.h, builtins/getopts.def, subst.c
+       - prefix all of the getopt variables and functions with `sh_'
+         (that is, optind becomes sh_optind and getopt becomes sh_getopt)
+         to avoid confusion with a system's getopt(3) implementation
+
+subst.c
+       - new functions: parameter_brace_substring and verify_substring_values
+         and changes to expand_word_internal to support the ksh-93
+         ${var:exp1:exp2} substring syntax
+
+documentation/bash.1
+       - documented the new ${var:exp1[:exp2]} syntax
+
+                                  11/25
+                                  -----
+builtins/setattr.def
+       - don't allow readonly -n at all
+
+array.c
+       - split array_to_string into two parts; a new function
+         array_to_string_internal does the real work
+       - new function array_subrange () to return a subset of the elements
+         in an array
+
+subst.c
+       - augmented the substring code to handle the positional parameters
+         and array variables
+       - made quote_list and dequote_list return their WORD_LIST *
+         arguments so they can be used like
+
+               z = string_list ((quoted ? quote_list (l) : l), xxx);
+
+       - augmented the ${xxx} expansion code to do indirect variable
+         references if the first character of the variable name is `!'
+
+tests/new-exp.tests
+       - added regression tests for substring expansion
+       - added regression tests for indirect variable references
+
+                                  11/28
+                                  -----
+builtins/set.def
+       - added set -o hashfunc and set -o onecmd, synonyms for set -h
+         and set -t, respectively
+
+builtins/shift.def
+       - changed shift so that the positional parameters are not changed
+         if the argument is > $# (this is ksh and Posix.2, unlike sh)
+
+documentation/bash.1
+       - documented true behavior of `shift'
+
+lib/readline/kill.c
+       - split the kill ring management code and the kill commands out
+         from readline.c into this file
+
+lib/readline/undo.c
+       - split the code that does undoing out of readline.c into this file
+
+shell.c
+       - force the shell to exit with status 127 if a longjmp back to
+         run_one_command occurs with bash -c
+       - force the last command exit status to 1 if a
+         longjmp (top_level, DISCARD) is performed
+
+builtins/read.def
+       - don't throw away partial lines after reading EOF
+
+subst.c
+       - command substitution should not inherit the -e flag
+
+builtins/source.def
+       - make sure to set the exit status correctly when in posix mode
+         and the filename argument to `.' does not exist
+
+                                  11/29
+                                  -----
+lib/readline/input.c
+       - split the input buffering and character input code out of
+         readline.c to here
+
+lib/readline/macro.c
+       - moved the keyboard macro management code to here from readline.c
+
+lib/readline/readline.c
+       - removed the STATIC_MALLOC code
+
+lib/readline/rltty.c
+       - return -1 in POSIX get_tty_settings if tcgetattr returns -1 and
+         errno != EINTR, even if output is being flushed
+
+                                  12/1
+                                  ----
+machines.h
+       - fixes to the hpux_8 and hpux_9 machine descriptions
+
+trap.c
+       - make run_exit_trap return the right exit status
+         (last_command_exit_value)
+       - run_exit_trap no longer preserves the value of last_command_exit_value
+         around the execution of the trap commands
+       - run_exit_trap now turns off SIG_TRAPPED and sets SIG_INPROGRESS
+         and will not try to run anything if SIG_INPROGRESS is set
+
+trap.h
+       - change definition for run_exit_trap
+
+shell.c
+       - call run_exit_trap only if trap[0] is set and not ignored
+
+builtins/exit.def
+       - make sure we only source the .bash_logout file once, even if it
+         contains a call to `exit'
+
+execute_cmd.c
+       - if we run an exit trap in a (...) user subshell, allow it to
+         override the exit status of the subshell
+
+lib/readline/readline.c
+       - made rl_delete_text bounds check its `to' argument, and limit
+         it at rl_end
+
+lib/readline/vi_mode.c
+       - make rl_vi_subst call `rl_delete_text' directly for the `s'
+         command
+
+support/mksysdefs
+       - define a new variable for the sysdefs.h file for ISC machines:
+         ISC_release, which can be ISC_2, ISC_3, or ISC_4
+
+machines.h
+       - don't `#undef' HAVE_GETCWD on ISC 4.x machines
+       - `#undef' HAVE_RESOURCE on ISC 4.x machines
+
+support/mkversion.c
+       - include "posixstat.h" rather than <sys/stat.h> for the benefit
+         of ISC machines
+
+                                  12/5
+                                  ----
+lib/readline/complete.c
+       - changed username_completion_function so that a null username
+         generates a list of all users as possible completions
+
+lib/readline/readline.h
+       - added definitions for STREQ, STREQN
+
+lib/readline/{search.c,isearch.c,kill.c}
+       - removed private definitions of STREQ, STREQN
+
+execute_cmd.c
+       - in find_user_command_internal, just return a copy of the pathname
+         passed as an argument if there is no PATH
+
+                                  12/6
+                                  ----
+siglist.h
+       - NetBSD 1.0 does not need a define for strsignal()
+
+                                  12/8
+                                  ----
+subst.c
+       - removed assignment_name, word_list_quote_removal, word_quote_removal,
+         and sub_append_number -- unused functions
+       - removed some unexecuted code from expand_word_internal
+
+                                  12/9
+                                  ----
+execute_cmd.c
+       - if PATH is set to the empty string, find executables in the
+         current directory
+
+shell.c, parse.y, trap.c
+       - before setting the SIGINT sighandler unconditionally to one of
+         sigint_sighandler or termination_unwind_protect, check that it
+         is not ignored.  Now trap '' 2 really sets the SIGINT signal
+         handler to SIG_IGN. [In 1.14.3]
+
+trap.c
+       - rewrote set_sigint_handler to use SIG_IGNORED rather than checking
+         against IGNORE_SIG
+       - changed ignore_signal, run_exit_trap, maybe_call_trap_handler, and
+         run_trap_internal to check SIG_IGNORED
+
+shell.c
+       - removed the check for signal_is_ignored(SIGINT) in sigint_sighandler
+
+                                  12/11
+                                  -----
+sig.c, sig.h
+       - new files, moved signal-related definitions and code here from
+         shell.c, general.h, general.c, jobs.c, jobs.h, externs.h
+
+unwind_prot.c, shell.h, nojobs.c
+       - include sig.h
+
+                                  12/12
+                                  -----
+jobs.c
+       - only break out of loops if SIGTSTP was used to stop a job in the
+         loop, the shell is currently interactive, and job control is on.
+         SIGSTOP does not break loops. [In 1.14.3]
+
+                                  12/13
+                                  -----
+expr.c
+       - bases < 2 or > 36 are now accepted without silently being reset
+         to 10
+
+braces.c
+       - make sure array_concat copies the array it returns if one of
+         the arguments is null [In 1.14.3]
+
+                                  12/14
+                                  -----
+subst.c
+       - split the ${...} expansion code out into a separate function,
+         static char *parameter_brace_expand()
+       - changes to array_value so that any variable can be referred to
+         as an array with an integer subscript.  The value will be
+         returned if a non-array variable is referred to as ${var[0]};
+         if the subscript is > 0 a null string is returned
+
+                                  12/15
+                                  -----
+machines.h
+       - fixes to freebsd description for FreeBSD 2 [In 1.14.3]
+
+support/bashbug.sh
+       - changed to use /usr/lib/sendmail if present or /usr/sbin/sendmail
+         if present, defaulting to rmail [In 1.14.3]
+
+bashhist.c
+       - HISTFILESIZE now controls how large the history file is after
+         it is written.  After saving the shell history, sv_histfilesize
+         will truncate it if necessary.  history -w can override this.
+
+documentation/bash.1
+       - documented change to treatment of HISTSIZE when saving history
+
+lib/malloc/malloc.c
+       - removed the calls to sigsetmask() in malloc().  This should
+         result in a speed improvement
+
+                                  12/19
+                                  -----
+builtins/enable.def
+       - don't allow -f or -d in a restricted shell
+
+builtins/alias.def
+       - rewrote alias and unalias to use the internal getopt
+       - added -p option to print the alias list to alias
+       - fixed up the documentation for `alias'
+
+documentation/{bash.1,features.texi}
+       - updated the documentation for `alias'
+       - updated the documentation for $_
+
+array.c,array.h
+       - new function `empty_array (ARRAY *a)' removes all of the
+         elements in a without destroying the array variable in
+         preparation for overwriting it.  Used by read -a.
+
+builtins/read.def
+       - call empty_array() before assigning list of values with read -a
+       - changed dispose_array to use empty_array to destroy the
+         array elements
+
+variables.c
+       - set $_ to argv[0] at variable initialization time
+
+                                  12/20
+                                  -----
+subst.c
+       - broke the pattern removal code into a few separate functions:
+         getpatspec to get the pattern specifier, getpattern to do the
+         necessary word expansions and return the pattern to be matched
+       - new function: parameter_list_remove_pattern(), which implements
+         the ${param[#%][[%#]]pattern} where param is `@' or `*'
+
+documentation/bash.1
+       - documented new pattern removal functionality for the positional
+         paramters
+
+general.c
+       - new function strsub (s, pat, rep, gflag) replaces PAT with REP
+         in S.  All occurrences are replaced if GFLAG != 0; the first is
+         replaced otherwise
+       - changed strindex() to avoid multiple calls to strnicmp by
+         checking first character of the string
+
+builtins/fc.def
+       - changed to use builtin_getopt with a check for fc numbers as
+         arguments
+       - some code rearranging for efficiency and clarity
+       - fc_dosubs now just calls strsub(); fc_replace is gone
+
+                                  12/21
+                                  -----
+subst.c
+       - new function, match_pattern, which matches a shell globbing
+         pattern anywhere in a string and returns the boundaries of the
+         match
+
+lib/readline/readline.h
+       - declarations for rl_insert_command and rl_backward_char_search
+
+lib/readline/readline.c
+       - new function rl_insert_comment, no longer vi-mode-specific
+       - new function rl_backward_char_search
+
+lib/readline/bind.c
+       - comment-begin now sets the comment char for emacs and vi modes
+       - variable holding the value is now _rl_comment_begin
+
+lib/readline/vi_mode.c
+       - move the `comment-begin' stuff to readline.c and bind.c
+
+lib/readline/funmap.c
+       - vi-comment is now insert-comment
+       - new bindable command character-search-backward
+
+lib/readline/vi_mode.c
+       - command mode `#' now invokes rl_insert_comment
+
+lib/readline/emacs_keymap.c
+       - M-# now bound to insert-comment
+       - M-space now bound to set-mark
+       - M-^] now bound to character-search-backward
+
+bashline.c
+       - posix_readline_initialize now calls rl_variable_bind to set the
+         value of comment-begin rather than directly modifying
+         _rl_comment_begin
+
+documentation/{bash.1,readline.3}, lib/readline/doc/rluser.texinfo
+       - added description of new bindable `insert-comment' command
+       - documented new M-space emacs mode binding
+       - documented new character-search-backward command and default
+         emacs mode binding to M-C-]
+
+shell.c
+       - only call posix_initialize if posixly_correct is set
+
+                                  12/22
+                                  -----
+cpp-Makefile
+       - make $(Program) depend on $(srcdir)/.distribution, for the
+         benefit of systems where `make' does not have VPATH support
+         [In 1.14.3]
+
+jobs.c
+       - if a foreground job is killed by SIGINT while job control is
+         active, print a newline to compensate for the kernel printing
+         ^C without one [in 1.14.3]
+
+bashline.c
+       - make sure bashline_reinitialize resets rl_completion_entry_function
+         to NULL, as the comment says it should [In 1.14.3]
+
+                                  12/23
+                                  -----
+test.c
+       - fix a problem that caused core dumps if a `)' was missing in a
+         parenthesized expression [In 1.14.3]
+
+jobs.c
+       - broke the code the manages the manipulation of the job table and
+         process status out of flush_child into a new function waitchld()
+       - flush_child now just calls waitchld() with a parameter that tells
+         it not to block
+       - wait_for calls waitchld() with the pid it's looking for and tells
+         it to block (don't call it with WNOHANG)
+       - cleaned up wait_for considerably -- turned the wait_loop: label
+         stuff into a do-while loop and removed the setting of job status
+         (that's now done only by waitchld).  wait_for now calls
+         waitchld continuously until the job it is interested in is
+         marked JDEAD.
+
+                                  12/28
+                                  -----
+subst.c
+       - fixed expand_word_internal so that any word that expands into
+         nothing and contains a double-quoted $@ is removed, like sh
+         and ksh
+       - new function: expand_string_for_rhs, which calls expand_word_internal
+         with a variable that lets it find out whether or not a $@ appeared
+         in the WORD in ${paramOPword} when expanding it, so that "$@"
+         and various other things are handled correctly on the rhs
+       - added params for parameter_brace_expand to tell expand_word_internal
+         if a quoted $@ was processed as part of the rhs (or even the lhs);
+         these new params are passed along to parameter_brace_expand_rhs
+       - pass the right value of quoted to parameter_brace_expand_rhs from
+         parameter_brace_expand.  expand_string_for_rhs doesn't need to know
+         whether the brace expression is quoted
+
+                                  12/31
+                                  -----
+support/printenv
+       - now an official part of the distribution, moved from CWRU/misc
+         [in 1.14.3]
+
+cpp-Makefile
+       - copy support/printenv into the `tests' directory when making tests
+         [in 1.14.3]
+       - change to understand GCC_STANDARD [in 1.14.3]
+
+support/bashbug.sh
+       - fixed a typo that caused it to not parse correctly [in 1.14.3]
+
+machines.h
+       - define GCC_STANDARD if the standard `cc' is gcc and you don't want
+         to use the compiler named `gcc' for some reason [in 1.14.3]
+
+                                   1/2
+                                   ---
+general.h
+       - added FS_DIRECTORY to the list of flags that file_status returns
+
+execute_cmd.c
+       - changed find_in_path_element to return null if the flags argument
+         specifies FS_EXEC_ONLY and the file is not executable
+       - return FS_DIRECTORY from file_status if the argument specifies a
+         directory
+       - new function, is_directory (char *), which returns non-zero if the
+         filename argument is a directory
+
+execute_cmd.h
+       - extern declaration for is_directory
+
+flags.c, flags.h
+       - hashing_disabled and locate_commands_in_functions were removed,
+         hashing_enabled added
+
+execute_cmd.c, builtins/common.c. builtins/hash.def
+       - use hashing_enabled instead of hashing_disabled, and reverse
+         the sense of tests of it
+
+documentation/bash.1, documentation/features.texi
+       - changed description of `set -h/set -o hashcmds', removed
+         set -d/set -o nohash
+
+bashline.c
+       - changed command_word_completion_function to return matches if names
+         are directories as well as if they are executable files
+
+support/mksysdefs
+       - look for `ranlib' in $PATH before searching the file system;
+         look in /usr/gnu/bin for it; default to `:' if not found
+
+general.c
+       - change ansicstr to accept a second argument telling it whether to
+         recognize \c and to pass back a non-zero value in it if \c is
+         seen
+
+general.h
+       - changed extern declaration of ansicstr
+
+subst.c
+       - call ansicstr with an extra argument
+
+                                   1/3
+                                   ---
+builtins/echo.def
+       - rewrote to use ansicstr() with the new argument
+
+                                   1/4
+                                   ---
+trap.c
+       - changed instances of signal() to set_signal_handler() [in 1.14.4]
+       - combined reset_signals and restore_signals into a single function,
+         since they were essentially identical
+
+subst.c
+       - if set -u is set, references to the positional parameters now
+         generate errors if that parameter is not set [in 1.14.4]
+
+lib/*/Makefile, builtins/Makefile
+       - since RANLIB can be just `ranlib', just try to run it without
+         checking that the file exists [in 1.14.4]
+
+builtins/set.def
+       - changed `hashcmds' to `hashall'
+
+documentation/{bash.1,features.texi}
+       - changed `hashcmds' to `hashall'
+
+                                   1/5
+                                   ---
+trap.c
+       - make the loop that restores signal handlers run from signal 0 to
+         make sure user subshells don't inherit traps on `exit' (to fix
+         for 1.14.3, change restore_original_signals so that the loop
+         starts from 0) [in 1.14.4]
+
+variables.c
+       - don't import exported function definitions at startup if the
+         shell is restricted
+
+builtins/source.def
+       - don't allow use of pathname arguments containing `/' in a
+         restricted shell
+
+execute_cmd.c
+       - when a shell is spawned to execute a shell script without a
+         #! line, turn off the -r flag if the shell is restricted
+
+shell.c
+       - added a new long option `--restricted'
+
+documentation/bash.1
+       - added a section on the restricted shell, and documented the
+         new `--restricted' long invocation option
+
+                                   1/7
+                                   ---
+shell.c
+       - when using bash -c command, make run_one_command return
+         last_command_exit_value if a throw_to_top_level with value
+         EXITPROG occurs [in 1.14.4]
+
+print_cmd.c
+       - make sure to initialize arg_index in the non-varargs implementation
+         of cprintf [in 1.14.4]
+
+jobs.c
+       - don't try to change the state of the SIGCHLD handler before
+         calling waitchld() from wait_for, since SIGCHLD is blocked
+         while this code is executing [in 1.14.4]
+
+                                  1/11
+                                  ----
+lib/readline/rltty.c
+       - call control_keypad iff the value of a new variable,
+         _rl_enable_keypad, is non-zero
+
+lib/readline/bind.c
+       - new readline variable `enable-keypad' to control whether readline
+         tries to manipulate the application keypad
+
+documentation/{bash.1,readline.3}, lib/readline/doc/rluser.texinfo
+       - documented new `enable-keypad' variable
+
+                                  1/12
+                                  ----
+lib/readline/search.c
+       - make sure to call rl_unix_word_rubout and rl_unix_line_discard
+         with the correct arguments [in 1.14.4]
+
+make_cmd.h
+       - make sure make_select_command is declared even if SELECT_COMMAND
+         is not defined
+
+parse.y
+       - make sure the \[ and \] escape sequences are not recognized if
+         READLINE is not defined [in 1.14.4]
+
+config.h
+       - make sure HISTORY is defined if READLINE is; code moved here
+         from bashhist.c [in 1.14.4]
+
+bashhist.c
+       - removed check for READLINE being defined without HISTORY; now
+         in config.h
+       - new function, bash_history_reinit
+
+flags.h, flags.c, builtins/set.def
+       - the -H/-o histexpand flag should be compiled into the shell
+         only if BANG_HISTORY is defined [in 1.14.4]
+
+subst.c
+       - don't include sv_histchars unless BANG_HISTORY is defined
+         [in 1.14.4]
+       - if QUOTED is true in parameter_brace_expand_rhs, pre-process the
+         word on the rhs of the parameter expansion by a call to
+         string_extract_double_quoted with the STRIPDQ parameter set to 1
+       - new arg for string_extract_double_quoted; causes it to strip
+         double quotes and alter its backslash handling behavior; designed
+         to be called from parameter_brace_expand_rhs
+       - changed all other instances of string_extract_double_quoted to
+         call it with STRIPDQ set to 0, to get old behavior
+
+shell.c
+       - call bash_history_reinit rather than manipulating history
+         variables directly
+
+variables.c
+       - don't auto-export $BASH [in 1.14.4]
+
+tests/rhs-exp.tests
+       - new test script to check for behavior fixed by changes to
+         string_extract_double_quoted and parameter_brace_expand_rhs
+
+parse.y
+       - `for' and `select' must now take non-empty lists between
+         `in' and `;'
+
+                                  1/16
+                                  ----
+subst.c
+       - fixed string_quote_removal to do double-quoted string processing
+         itself rather than call string_extract_double_quoted, which
+         assumes that a call to expand_word_internal or the equivalent
+         will follow immediately and leaves some backslashes in place,
+         inappropriately for quote removal
+
+                                  1/23
+                                  ----
+subst.c
+       - make sure to set `temp' to NULL after it's freed by sub_append_string
+         in expand_word_internal to keep it from pointing to newly-allocated
+         memory that will be subsequently freed, causing a `memory freed
+         twice' error [in 1.14.4]
+
+trap.c
+       - handle the EXIT_TRAP specially in reset_or_restore_signal_handlers,
+         since in both cases we simply want to free up the trap string and
+         mark the signal as not trapped
+
+shell.h
+       - added \n to the list of characters in slashify_in_double_quotes
+
+                                  1/26
+                                  ----
+subst.c
+       - make string_extract_single_quoted and string_extract_double_quoted
+         `inline'
+       - new function skip_single_quoted, used when we used to call
+         string_extract_single_quoted and just throw the returned string
+         away
+       - new function skip_double_quoted for the same purpose
+
+                                  1/28
+                                  ----
+subst.c
+       - fixed expand_word_internal so that if an assignment word
+         is expanded, no word splitting is performed [in 1.14.4]
+
+builtins/ulimit.def
+       - some systems lack RLIMIT_CPU; so `#ifdef' its use [in 1.14.4]
+       - some versions of cpp expand parameters like \n if `n' is an
+         argument to the macro; change `n' to `num' in the definition
+         of print_rlimtype to compensate [in 1.14.4]
+
+builtins/read.def
+       - make sure the read loop sets `saw_escape' to note that an
+         escape character was read if CTLESC or CTLNUL is read [in 1.14.4]
+
+shell.c, sig.c
+       - only test interactive_shell before calling maybe_save_shell_history
+         [in 1.14.4]
+shell.c
+       - include <locale.h> if HAVE_LOCALE_H is defined
+       - call setlocale(LC_ALL, "") at the beginning of main() if
+         either _POSIX_VERSION or HAVE_SETLOCALE is defined
+
+support/mksysdefs
+       - look for <locale.h>, define HAVE_LOCALE_H if found
+
+cpp-Makefile
+       - pass HAVE_LOCALE_H through from sysdefs.h to the build process
+
+bashhist.c
+       - remove test against interactive_shell in maybe_save_shell_history
+         [in 1.14.4]
+
+variables.c
+       - moved definition of DEFAULT_MAIL_PATH to config.h
+
+config.h, config.h.mini
+       - now has definition of DEFAULT_MAIL_PATH [in 1.14.4]
+       - changed default value of PATH to
+         `/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.'
+         [in 1.14.4]
+
+documentation/bash.1
+       - updated the example of the default path in the description of
+         the PATH variable
+
+lib/readline/readline.c
+       - set up a table of `legal' LC_CTYPE values and match the value of
+         $LC_CTYPE against it when deciding whether or not to default to
+         eight-bit input and output
+       - check for LC_ALL, LC_CTYPE, and LANG, in that order, for names to
+         check against the legal_lc_ctype_values table
+
+lib/readline/bind.c
+       - moved strindex, stricmp, and strnicmp to lib/readline/util.c, 
+         added _rl_ prefix to names
+       - some miscellaneous code cleanups and speedups
+
+lib/readline/rldefs.h
+       - define _POSIX_VDISABLE as _SVR4_VDISABLE if there is a define
+         for the latter and not the former [in 1.14.4]
+       - moved defining _rl_stricmp and _rl_strnicmp as strcasecmp and
+         strncasecmp, respectively, here from bind.c, since the functions
+         are now defined in util.c and used in two files
+
+builtins/common.c
+       - removed the \n case in double_quote, so a backslash is not added
+         before an existing newline.  The \<newline> pair is removed by
+         the parser before anything else in the shell gets hold of it
+         except within single quotes [in 1.14.4]
+
+                                  1/30
+                                  ----
+general.c
+       - make sure the string index in canonicalize_pathname never goes
+         < 0 (it can, in some cases, result in `start' being -1, and `i'
+         being set to that) [in 1.14.4]
+
+                                   2/1
+                                   ---
+execute_cmd.c
+       - fix a typo in a call to `access' in AFS-specific code [in 1.14.4]
+
+                                   2/3
+                                   ---
+builtins/shopt.def
+       - finally added new `shopt' builtin
+
+builtins/umask.def
+       - converted to use builtin_getopt
+
+bashhist.c
+       - support for storing literal newlines in the history list when
+         command_oriented_history is enabled, rather than using semicolons
+
+builtins/Makefile
+       - changed rule to make a .o file from a .def file to remove the
+         .c file if the compilation fails
+
+                                   2/6
+                                   ---
+bashhist.c
+       - added new variable `force_append_history' that will force the
+         history list to be appended to the history file at shell exit
+       - new function, maybe_append_history, to append any history lines
+         from the current session to the history file.  Used by history -a
+
+builtins/bind.def
+       - changed the `-d' option to -p
+
+builtins/set.def
+       - added `allenv' as a -o synonym for `set -k'.  Now all of the
+         single-letter shell options have -o equivalents
+
+builtins/shopt.def
+       - added -p option to display shell options, like other builtins
+       - added `interactive_comments' as a shell option, like set -o
+
+builtins/bind.def, builtins/history.def, builtins/enable.def
+       - changed use of multiple variables to hold option flag settings to
+         one variable with bits representing flag values
+
+documentation/bash.1, documentation/features.texi
+       - changed the description of the `bind' builtin for the new -p option
+       - changed the description of the `set' builtin for the new
+         `-o allenv' option
+       - updated the description of the `shopt' builtin
+
+builtins/history.def
+       - changed -a option to use maybe_append_history
+
+subst.c
+       - changed the substring/subarray code to make negative offsets
+         count backwards from the end of the string or array
+
+builtins/bashgetopt.c
+       - added option modifiers `;' (argument is optional) and `#'
+         (argument is optional, but if present must be numeric)
+
+builtins/hash.def
+       - converted to use builtin_getopt
+       - broke code out into a new function: add_hashed_command
+
+                                   2/7
+                                   ---
+builtins/getopt.c
+       - changed to save state to avoid relying on `nextchar' staying the
+         same across calls to sh_getopt [in 1.14.4]
+       - added a function to restore `nextchar' from this saved state
+         [in 1.14.4]
+       - removed some dead code
+
+builtins/getopts.def
+       - call function to restore sh_getopt state when parsing explicitly
+         supplied arguments rather than the positional parameters [in 1.14.4]
+
+lib/readline/vi_mode.c
+       - fixed an off-by-one error in _rl_vi_done_inserting that put the
+         \0 in vi_insert_buf at offset `len' instead of `len - 1'
+
+lib/readline/complete.c
+       - print_filename now filters out control characters and displays
+         them in printable format, rather than relying on the tty driver
+         to do the right thing [in 1.14.4]
+
+                                   2/8
+                                   ---
+lib/posixheaders/stdc.h
+       - test for each special keyword being defined individually, rather
+         than just testing on `const' [in 1.14.4]
+
+lib/readline/util.c
+       - new function _rl_abort_internal; rl_abort just calls this
+
+nojobs.c
+       - include error.h for extern function definitions [in 1.14.4]
+
+builtins/ulimit.def
+       - include <unistd.h> if HAVE_UNISTD_H is defined
+       - use HAVE_LIMITS_H to decide whether or not to include <limits.h>
+
+variables.c, subst.c, builtins/set.def
+       - removed special handling of `noclobber' variable
+
+builtins/set.def
+       - new function set_shellopts to set up the $SHELLOPTS variable
+         based on the values of the set -o options; `set' calls this
+         function whenever one of the options is changed
+       - new function parse_shellopts to take the value of SHELLOPTS and
+         turn on each option found therein
+       - new function initialize_shell_options to parse any inherited
+         value of $SHELLOPTS and set up $SHELLOPTS
+
+shell.c
+       - call initialize_shell_options at the end of shell_initialize()
+
+execute_cmd.c, general.c
+       - moved extract_colon_unit from execute_cmd.c to general.c
+
+execute_cmd.h, general.h
+       - moved extern declaration of extract_colon_unit from
+         execute_cmd.h to general.h
+
+documentation/{bash.1,features.texi}
+       - documented SHELLOPTS
+
+                                  2/18
+                                  ----
+builtins/{shopt,pushd,jobs,umask}.def
+       - removed the `longjobs', `longdirs', `pushd_home' and `symbolic_umask'
+         options
+
+lib/readline/{histexpand,histsearch,histfile}.c, lib/readline/histlib.h
+       - new files, split off from old history library history.c
+
+lib/readline/history.c, lib/readline/history.h
+       - new function clear_history() to clear the history list
+
+lib/readline/doc/hstech.texinfo
+       - documented clear_history ()
+
+builtins/pushd.def
+       - new function clear_directory_stack() to delete all elements of
+         the dir stack
+       - new -c option for `dirs' to clear directory stack
+       - new function get_dirstack_index for dirs -N and dirs +N to use
+       - new function get_dirstack_element(i, dir) for use by other parts of
+         the shell that want the functionality of dirs -N and dirs +N
+         (dir is 1 for dirs +N, -1 for dirs -N)
+       - new function set_dirstack_element(i, dir, val) for use by other
+         parts of the shell to change values in the dirstack (dir is -1
+         for dirs -N, +1 for dirs +N).  Used when assigning to $DIRSTACK.
+
+builtins/history.def
+       - new -c option to clear the history list
+
+documentation/bash.1, documentation/features.texi
+       - removed no-longer-valid shopt options
+       - documented new dirs -c option
+       - documented new history -c option
+       - documented new \T and \H prompt escape sequences
+       - documented new $DIRSTACK dynamic array variable
+       - documented the new expand-glob and list-glob readline commands
+
+variables.c
+       - set PS4 to its default value of `+ ', so that unsetting it will
+         disable the tracing characters [in 1.14.4]
+       - new framework for dynamic array variables -- each place an
+         array index is assigned to, a test is made.  if a dynamic
+         assignment function exists, it is called with args `self',
+         the index being assigned to, and the new value
+       - new variable `$DIRSTACK', a dynamic array variable that holds
+         the current contents of the directory stack.  You can even
+         change the stack by assigning to thie variable
+
+shell.c
+       - changed indirection_level_string to return the null string if
+         $PS4 is unset or null [in 1.14.4]
+
+parse.y
+       - new \H prompt escape for hostname up to first `.'; changed \h
+         to return full hostname (like \w/\W)
+       - new \T prompt escape for 12-hour time
+
+bashline.c
+       - new readline functions to expand glob patterns and insert or
+         list the expansions (special completion functions)
+
+
+                                  2/20
+                                  ----
+builtins/pushd.def
+       - new code for `pushd -n' and `popd -n' to inhibit cd when
+         adding or removing directories from the stack
+       - broke functionality off into separate functions for use by the
+         $DIRSTACK manipulation functions
+
+                                  2/21
+                                  ----
+lib/readline/kill.c
+       - new functions to copy words to the kill ring, backward or
+         forward
+
+lib/readline/readline.h
+       - extern declarations for rl_copy_{backward,forward}_word
+
+
+lib/readline/funmap.c
+       - new bindable readline commands: copy-backward-word and
+         copy-forward-word to copy portions of the line to the kill
+         ring without deleting them
+
+documentation/{bash.1,readline.3}, lib/readline/doc/hsuser.texinfo
+       - documented the new copy-backward-word and copy-forward-word
+         readline commands
+
+mailcheck.c, config.h
+       - the declaration of DEFAULT_MAIL_PATH is now only in config.h
+         and used by mailcheck.c and variables.c.  There is no need to
+         use DEFAULT_MAIL_PATH_LEN; `sizeof' does the job [in 1.14.4]
+
+                                  2/22
+                                  ----
+support/mksysdefs
+       - changes to fix `RELEASE' if it ends up being set to the empty string
+         [in 1.14.4]
+       - check for amdahl UTS [in 1.14.4]
+       - check for SGI Irix version 6.x [in 1.14.4]
+
+machines.h
+       - new entry for Amdahl UTS [in 1.14.4]
+       - changes to the SGI entry for Irix 6.x [in 1.14.4]
+
+                                  2/23
+                                  ----
+machines.h
+       - changes for BSD/OS 2.0 (M_OS now set to `BSD_OS') [in 1.14.4]
+
+support/mksysdefs
+       - change to recognize BSD/OS 2.0 and set SYSDEF to BSDI2 [in 1.14.4]
+
+siglist.h
+       - don't declare sys_siglist on BSD/OS 2.0 [in 1.14.4]
+
+                                  2/24
+                                  ----
+parse.y
+       - if reset_parser is called while the prompt command is being
+         executed because of a syntax error in $PROMPT_COMMAND, an
+         infinite loop results.  set token_to_read back to 0 at the
+         end of execute_prompt_command to stop the looping [in 1.14.4]
+
+                                  2/25
+                                  ----
+mailcheck.h
+       - new header file for mail-checking and related definitions
+       - declaration of DEFAULT_MAIL_PATH is now here
+
+mailcheck.c
+       - new function, make_default_mailpath, which constructs a default
+         $MAILPATH string from DEFAULT_MAIL_PATH [in 1.14.4]
+       - change remember_mail_dates to call make_default_mailpath
+         [in 1.14.4]
+
+externs.h
+       - moved function declarations for functions in mailcheck.c to
+         mailcheck.h
+
+variables.c
+       - change initialize_shell_variables to call make_default_mailpath
+         [in 1.14.4]
+       - removed some unneeded variables in initialize_shell_variables
+
+                                  2/26
+                                  ----
+lib/readline/callback.c
+       - new file with readline callback function interface
+
+lib/readline/rlconf.h
+       - new READLINE_CALLBACKS define for the readline callback code to
+         be compiled in and available
+
+lib/readline/readline.c
+       - broke readline_internal into three functions: readline_internal_setup,
+         readline_internal_charloop, and readline_internal_teardown
+       - changes for READLINE_CALLBACKS
+
+lib/readline/readline.h
+       - extern declarations for the readline callback code
+
+cpp-Makefile
+       - added lib/readline/callback.c to the list of readline files
+
+lib/readline/input.c
+       - added a layer of indirection to allow the user to specify the
+         function that reads a character from rl_instream.  The variable
+         name is rl_getc_function, set by default to rl_getc
+
+                                  2/27
+                                  ----
+lib/readline/display.c
+       - added a variable rl_redisplay_function to allow an application-
+         specified redisplay function, for those apps that want to control
+         redisplay
+
+lib/readline/readline.c
+       - extern declarations for rl_getc_function and rl_redisplay_function
+
+lib/readline/{readline,display,isearch,search,parens}.c
+       - changed to call through rl_redisplay_function rather than
+         rl_redisplay directly
+
+parse.y
+       - try to avoid some work in reset_readline_prompt and prompt_again
+         if the prompt is the empty or null string [in 1.14.4]
+
+lib/readline/readline.c
+       - call rl_expand_prompt unconditionally [in 1.14.4]
+
+lib/readline/display.c
+       - short-circuit out of rl_expand_prompt if the prompt string is null
+         after clearing out the saved local prompt values.  This allows
+         $PS2 to be set to "" [in 1.14.4]
+
+lib/readline/doc/rltech.texinfo
+       - documented the callback code and functions
+       - documented rl_getc_function and rl_redisplay_function
+
+lib/readline/{callback,readline,rltty,signals}.c
+       - added layer of indirction for terminal prep and deprep, with
+         rl_term_prep_function and rl_term_deprep_function.  These are
+         set by default to rl_prep_terminal and rl_deprep_terminal,
+         respectively
+
+lib/readline/readline.h
+       - make rl_term_prep_function and rl_term_deprep_function available
+         to callers
+
+                                   3/1
+                                   ---
+lib/readline/complete.c
+       - broke the (long, complicated) rl_complete_internal code into a
+         number of separate functions:
+
+               find_completion_word
+               gen_completion_matches
+               remove_duplicate_matches
+               display_matches
+               insert_text
+               insert_match
+               append_to_match
+               insert_all_matches
+
+       - made some efficiency improvments to filename_completion_function
+       - the completion ignore function is now called no matter what type
+         of completion is being performed (as it should have been all along)
+
+lib/readline/rldefs.h
+       - use #defines for the possible values ORed into `found_quote' by
+         the completion code
+
+                                   3/2
+                                   ---
+make_cmd.c, general.c
+       - moved make_word_array from make_cmd.c to general.c, renamed to
+         word_list_to_argv, extended it to optionally not malloc all of
+         the strings and to reserve space at the start of the array
+
+execute_cmd.c
+       - changed to use word_list_to_argv, not mallocing space for the
+         strings
+
+builtins/common.c, builtins/common.h
+       - new function make_builtin_argv, which uses word_list_to_argv
+         and reserves 1 slot at the beginning for the command name
+
+builtins/exec.def
+       - changed to use word_list_to_argv
+
+builtins/{getopts,test}.def
+       - changed to use make_builtin_argv
+
+subst.c
+       - new function match_pattern_char, to see if the first char of
+         a string has a chance to match a given pattern (test against
+         the first char of the pattern); used by match_pattern in the
+         MATCH_ANY case
+
+                                   3/3
+                                   ---
+jobs.c
+       - renamed flush_child to sigchld to capture the functionality better
+
+array.c
+       - new function array_pat_subst, to do pattern substitution on each
+         element in an array
+
+array.h
+       - extern declaration for array_pat_subst
+
+subst.c
+       - new function pat_subst to do pattern matching and substitution on
+         a string
+       - new function parameter_brace_pat_subst to implement
+         ${v/[/]pat[/sub]}; calls pat_subst for simple vars,
+         pos_params_pat_subst to do substitution on the positional params,
+         and array_pat_subst for things like ${v[@]/p/r}
+
+subst.h
+       - extern declaration for pat_subst so array.c can find it
+
+                                   3/6
+                                   ---
+parse.y
+       - <>filename now dups filename to file descriptor 0 for both input
+         and output even when not in posix.2 mode
+
+bashline.c
+       - add the globbing characters to the list of characters that need
+         to be quoted by filename completion
+
+jobs.h
+       - new convenience macros:
+               RUNNING, STOPPED, DEADJOB - to test a job's state
+               IS_FOREGROUND, IS_NOTIFIED, IS_JOBCONTROL - flags
+
+jobs.c, builtins/{kill,fg_bg}.def
+       - changed to use new jobs.h macros
+
+                                   3/7
+                                   ---
+array.c, array.h
+       - new function dup_array_subrange(a, s, e) to make a new array
+         out of the elements of array A between S and E, inclusive
+       - add `quoted' parameters to array_subrange and array_pat_subst
+         to preserve proper quoting of elements when expanding things
+         like "${av[@]/xx/yy}"
+       - new function array_quote to quote the members of an array like
+         the functions in subst.c
+
+subst.c
+       - pass the quoted flag to array_subrange and array_pat_subst
+       - quote_string is no longer static
+
+subst.h
+       - extern declaration for quote_string
+
+builtins/hash.def
+       - added a -p pathname option to specify a pathname for the command
+         name to be hashed.  With -p, no path search is performed.
+
+lib/readline/histexpand.c
+       - broke history_tokenize off into history_tokenize_internal and
+         added two arguments: a character index and a word index.  If
+         the char index is >= 0, the word index will be modified to point
+         into the returned array of strings to the word surrounding that
+         particular character index
+       - new function history_find_word(line, ind) to return the word 
+         containing the character at index IND in LINE
+       - new variable search_match, found by history_find_word, to hold the
+         word last matched by a !?string? search
+       - corrected a problem with the `%' modifier: it should insert the
+         word last matched, not the last search string
+
+                                   3/8
+                                   ---
+cpp-Makefile
+       - changed INSTALL_PROGRAM and INSTALL_DATA to use support/install.sh
+       - changed `install' target to not explicitly save the old version of
+         bash in `bash.old'; let install take care of it
+
+shell.c
+       - new static variable `running_under_emacs', set to 1 if the
+         variable `EMACS' is in the startup environment, and to 2 if
+         we're running under the `eterm' terminal emulator
+       - send an escape sequence to eterm if running_under_emacs is 2
+         after executing any $PROMPT_COMMAND to tell it the current
+         directory
+
+                                   3/9
+                                   ---
+builtins/ulimit.def
+       - made getting -u work for systems that have a MAXUPRC define.
+         it still cannot be set without RLIMIT_NPROC
+
+shell.c
+       - include trap.h for sig definitions
+
+builtins/common.h, subst.h, general.h, externs.h
+       - more extern function declarations
+
+bashhist.c
+       - new function, bash_history_disable(), to turn off history and
+         history expansion
+       - bash_history_disable now sets history_expansion_inhibited
+
+bashline.h
+       - new file with extern declarations from bashline.c
+
+parse.y, bashhist.c, builtins/bind.def, subst.c, sig.c
+       - include bashline.h
+
+                                  3/10
+                                  ----
+lib/glob/glob.h
+       - new file with extern declarations for local glob library
+
+shell.c
+       - include glob.h, mailcheck.h
+
+cpp-Makefile
+       - changes to dependencies due to mailcheck.h, bashline.h, glob.h
+
+                                  3/13
+                                  ----
+execute_cmd.c
+       - new function execute_connection to execute commands of type
+         cm_connection
+       - new function execute_pipeline, to execute pipelines
+
+lib/readline/rltty.c
+       - add a `tty' argument to the set_winsize function/macro, the
+         non-shell version needs it
+
+                                  3/14
+                                  ----
+parse.y
+       - added \a (bell) and \e (escape) prompt string escape sequences
+
+                                  3/16
+                                  ----
+lib/readline/display.c
+       - fixed bug in update_line that caused stray characters to be left on
+         lines after the first if characters are deleted so that the first
+         line becomes exactly as long as the screen width [in 1.14.4]
+
+lib/readline/doc-support
+       - brought in the GNU getopt because texindex needs it
+
+documentation/Makefile
+       - adopted the BSD convention of a suffix of `.0' for formatted
+         manual pages
+
+                                  3/17
+                                  ----
+support/inpath
+       - a script to find out if a particular command name appears in
+         a directory in $PATH [in 1.14.4]
+
+support/mksysdefs
+       - changed to use inpath to find `ranlib' [in 1.14.4]
+
+                                  3/18
+                                  ----
+bashline.c
+       - include bashline.h
+       - removed the DYNAMIC_HISTORY_COMPLETION define; that code is now
+         included unconditionally
+       - renamed ETCHOSTS to DEFAULT_HOSTS_FILE; moved definition to
+         bashline.h
+       - moved definition of BRACE_COMPLETION to config.h
+
+config.h
+       - conditional definition of BRACE_COMPLETION is now here
+
+pathnames.h
+       - new file with defines that are absolute pathnames
+
+shell.h
+       - include pathnames.h
+
+mailcheck.h
+       - def of DEFAULT_MAIL_PATH now moved to pathnames.h
+
+shell.c
+       - def of SYS_PROFILE moved to pathnames.h
+
+alias.h
+       - removed a bunch of extra definitions
+
+lib/readline/{vi_mode.c,bind.c}
+       - removed superfluous STATIC_MALLOC code
+
+variables.c
+       - removed SHADOWED_ENV code
+
+                                  3/20
+                                  ----
+machines.h
+       - don't define USG or USGr3 for linux machines [in 1.14.4]
+       - change REVERSED_SETVBUF_ARGS to SETVBUF_REVERSED for autoconf
+         compatibility
+
+shell.c
+       - change REVERSED_SETVBUF_ARGS to SETVBUF_REVERSED for autoconf
+         compatibility
+
+support/mksysdefs, maxpath.h
+       - change HAVE_SYS_PARAM to HAVE_SYS_PARAM_H for autoconf
+         compatibility
+
+support/mksysdefs, jobs.h
+       - use HAVE_SYS_WAIT_H
+
+machines.h, error.c
+       - change HAVE_VFPRINTF to HAVE_VPRINTF for autoconf compatibility
+
+test.c
+       - replace UID_T and GID_T with GETGROUPS_T, the size of the elements
+         of the array returned by getgroups
+
+general.c
+       - define HAVE_KILLPG if killpg() is present; compile in a replacement
+         killpg if not
+
+machines.h, jobs.c
+       - change BSD_GETPGRP to HAVE_BSD_PGRP
+
+sig.c
+       - don't call initialize_siglist if HAVE_SYS_SIGLIST is defined, no
+         longer use INITIALIZE_SIGLIST
+
+machines.h, lib/malloc/malloc.c
+       - change NO_SBRK_DECL to SBRK_DECLARED
+
+                                  3/22
+                                  ----
+machines.h
+       - BSD/OS 2.0 does not need INT_GROUPS_ARRAY in SYSDEP_CFLAGS
+
+lib/readline/rldefs.h
+       - don't check `Linux'; just include <termcap.h> if HAVE_TERMCAP_H
+         is defined
+
+builtins/command.def
+       - changed get_standard_path to use HAVE_CONFSTR 
+
+execute_cmd.c
+       - execute_simple_command no longer uses alloca
+       - don't check RISC6000 anymore when deciding whether to use
+         #pragma alloca
+
+execute_cmd.c, shell.c
+       - check for ultrix instead of Ultrix when calling alloca(0)
+
+jobs.h
+       - check HAVE_UNISTD_H to see whether to declare fork, getpid,
+         and getpgrp
+
+builtins/common.c
+       - include <signal.h> for NSIG
+
+sig.h
+       - don't define SIGABRT as SIGIOT unless SIGIOT is defined
+
+jobs.c
+       - check for ultrix instead of Ultrix
+
+                                  3/23
+                                  ----
+general.c, general.h
+       - new function check_dev_tty, which makes sure we can open
+         /dev/tty
+
+shell.c
+       - call check_dev_tty instead of having the code inline
+
+posixstat.h
+       - removed references to isc386
+
+general.h
+       - code to define one of TERMIOS_TTY_DRIVER, TERMIO_TTY_DRIVER,
+         or NEW_TTY_DRIVER
+
+jobs.c, nojobs.c
+       - use the general.h code to define the tty driver types
+
+                                  3/24
+                                  ----
+builtins/declare.def
+       - new -p option to display variables and their values and attributes
+         `declare -p xxx' displays attribs and value of var `xxx'
+
+builtins/setattr.def
+       - new function to display the attributes and value of a particular
+         variable; used by set_or_show_attributes
+       - new function to look up a variable by name and show that name's
+         attributes and value
+
+builtins/common.c
+       - declarations for new functions in setattr.def
+
+variables.c
+       - don't set a default value for MAILPATH in initialize_shell_variables;
+         let remember_mail_dates take care of it [in 1.14.4]
+
+mailcheck.c
+       - fixed an off-by-one bug in make_default_mailpath [in 1.14.4]
+
+                                  3/28
+                                  ----
+[changes for autoconf-generated config files]
+
+lib/malloc/malloc.c
+       - use HAVE_GETPAGESIZE, HAVE_BSD_SIGNALS, HAVE_POSIX_SIGNALS
+
+trap.c
+       - remove tests for USG and USGr4
+       - test on HAVE_POSIX_SIGNALS rather than _POSIX_VERSION
+       - use MUST_REINSTALL_SIGHANDLERS define to decide whether trap_handler
+         should call signal again
+
+getcwd.c
+       - redid the directory includes for autoconf compatibility
+       - use HAVE_LSTAT instead of testing for S_ISLNK
+       - use STRUCT_DIRENT_HAS_D_INO
+       - include memalloc.h for alloca define
+
+general.h
+       - cleaned up strchr, strrchr definitions
+       - removed tests against USG
+       - use HAVE_MEMMOVE instead of MEMMOVE_MISSING
+
+jobs.c
+       - use HAVE_WAIT3, MUST_REINSTALL_SIGHANDLERS, GETPGRP_VOID
+
+mailcheck.h
+       - removed definition of DEFAULT_MAIL_DIRECTORY; now set by
+         autoconf in config.h
+
+shell.c
+       - remove checks on USG, just check for HAVE_GETPW_DECLS
+       - use C_ALLOCA define
+       - redid the isnetconn() code using HAVE_SYS_SOCKET_H,
+         HAVE_GETPEERNAME, SVR4 and SVR4_2
+
+general.c
+       - use HAVE_KILLPG, HAVE_RESTARTABLE_SYSCALLS, HAVE_UNAME,
+         ULIMIT_MAXFDS, HAVE_TIMEVAL, HAVE_TIMES
+
+lib/readline/rldefs.h
+       - redid the tty driver definitions using HAVE_TERMIOS_H, etc.
+       - don't define anything having to do with signal type
+
+lib/glob/glob.c
+       - redid the DIRENT defines and includes
+       - redid other includes to remove dependencies on USG and system
+         type (e.g., NeXT)
+
+builtins/times.def
+       - changed to use HAVE_GETRUSAGE, HAVE_TIMEVAL, HAVE_TIMES, and
+         the autoconf way to include <sys/time.h> and <time.h>
+
+builtins/ulimit.def
+       - changed to use HAVE_GETRLIMIT
+       - removed test of USG being defined
+
+siglist.h
+       - changed to use SYS_SIGLIST_DECLARED, HAVE_UNDER_SYS_SIGLIST, and
+         HAVE_STRSIGNAL
+
+print_cmd.c
+       - use PRINTF_DECLARED
+
+builtins/command.def
+       - use HAVE_CONFSTR along with _CS_PATH to get the standard path
+
+execute_cmd.c
+       - only compile in execute_shell_script if HAVE_HASH_BANG_EXEC is not
+         defined
+
+nojobs.c
+       - use HAVE_SIGINTERRUPT, HAVE_KILLPG, HAVE_POSIX_SIGNALS,
+         MUST_REINSTALL_SIGHANDLERS, HAVE_WAITPID, *_TTY_DRIVER defines
+
+test.c
+       - set up a new `getmaxgroups' define, moving the code out of inline
+       - eliminate use of GETGROUPS_T
+
+variables.c
+       - use CAN_REDEFINE_GETENV
+
+sig.c, sig.h
+       - use HAVE_POSIX_SIGNALS, MUST_REINSTALL_SIGHANDLERS
+
+pathnames.h
+       - removed the default mail directory defines; now set by autoconf
+
+oslib.c
+       - new file, functions from general.c that are unix-version variable
+
+general.h
+       - slightly changed function declarations for use by oslib.c
+
+support/bashbug.sh
+       - changed @xxx@ to !xxx! for sed substitutions to avoid conflicts
+         with autoconf substitutions in the Makefile
+       - added MACHTYPE variable
+
+mailcheck.c
+       - changed DEFAULT_MAIL_PATH to DEFAULT_MAIL_DIRECTORY, since that
+         more clearly defines its function
+
+lib/readline/rltty.h
+       - new file, to include the correct tty driver #include file
+
+lib/readline/rltty.c
+       - include rltty.h
+
+lib/malloc/malloc.c
+       - make systems with Posix signals block all signals while malloc
+         is executing
+
+                                  3/29
+                                  ----
+input.c
+       - use off_t as the type of a seek offset, rather that int or long
+
+variables.c, oslib.c
+       - moved `getenv' from variables.c to oslib.c
+
+                                  3/31
+                                  ----
+sig.c, sig.h
+       - new function, jump_to_top_level, which just calls longjmp with
+         top_level as an argument -- here to isolate calls to longjmp
+
+subst.c
+       - replaced calls to longjmp with jump_to_top_level
+
+bashjmp.h
+       - new file with setjmp/longjmp defines and declarations
+
+shell.h, nojobs.c
+       - include bashjmp.h in place of setjmp.h
+
+shell.c, sig.c, execute_cmd.c, unwind_prot.h, expr.c,
+builtins/{return,source}.def
+       - change to use new defs in bashjmp.h
+
+subst.c
+       - make sure PAT and REP in pattern substitution are run through
+         expand_string_unsplit
+
+builtins/set.def
+       - don't try to blindly dereference the value returned by
+         find_flags in set_shellopts
+
+                                   4/2
+                                   ---
+aclocal.m4, config.h.in, config.h.top, config.h.bot, configure.in,
+support/install.sh, support/config.guess, support/config.sub
+       - new files for (now official) autoconf-based configuration
+
+Makefile.in, builtins/Makefile.in,
+lib/{doc-support,malloc,glob,termcap,tilde,readline}/Makefile.in
+       - new Makefiles for autoconf
+
+[additionally, all source files now include config.h]
+
+                                   4/3
+                                   ---
+array.c, array.h
+       - index_t --> arrayind_t, because some systems define index_t in
+         <sys/types.h>
+
+                                   4/4
+                                   ---
+aclocal.m4
+       - fix test for broken dup2
+
+lib/*/Makefile.in
+       - make all object files depend on $(BUILD_DIR)/config.h
+
+                                   4/5
+                                   ---
+array.c
+       - fixed problems in empty_array: need to reset max_index
+         and max_size, and remove the links in the element chain
+         after freeing them
+
+jobs.c
+       - new functions to save an array of status values for each
+         foreground job that exits (degenerate case is to have a
+         single-process job exit and have a 1-element array)
+       - new function to set a shell array variable `PIPESTATUS'
+         which holds the status values from each member of the
+         last-executed pipeline that spawned children
+
+documentation/bash.1
+       - documented $PIPESTATUS
+
+                                   4/6
+                                   ---
+configure.in
+       - added new --with-afs argument to #define AFS for execute_cmd.c
+
+                                  4/10
+                                  ----
+builtins/ulimit.def
+       - use sysconf(_SC_CHILD_MAX) to find the maximum number of child
+         proceeses per user if HAVE_SYSCONF and _SC_CHILD_MAX are both
+         defined and RLIMIT_NPROC is not
+
+                                  4/12
+                                  ----
+lib/readline/undo.c
+       - new variable, local to library, to keep track of the number of
+         `open' undo groups (UNDO_BEGIN without corresponding UNDO_END)
+       - new function _rl_fix_last_undo_of_type to modify start and end
+         bounds of last undo record of a specified type
+
+lib/readline/vi_mode.c
+       - _rl_vi_done_inserting now calls rl_end_undo_group if the count
+         of unclosed groups is > 0
+       - fixed rl_vi_change_to to save an undo record when redoing and
+         to fix the buffer corruption when doing `u' undo after a `.'
+         redo of `C'
+
+                                  4/13
+                                  ----
+unwind_prot.h
+       - changed to use a union { char *s; int i; } when unwind-protecting
+         integers to force correct alignment on machines where ints and
+         pointers differ in size
+
+lib/readline/readline.c
+       - new variable Keymap rl_executing_keymap, which is set to the
+         keymap the last function was invoked out of
+
+lib/readline/bind.c
+       - new variable Keymap rl_binding_keymap, which is set to the last
+         keymap a function and key sequence were bound in
+
+                                  4/17
+                                  ----
+general.c
+       - removed xmalloc, xrealloc, xfree to xmalloc.c
+
+lib/malloc/Makefile.in
+       - MALLOC and ALLOCA are both set by autoconf
+       - need to provide some empty stub file to make up the library
+         in case neither malloc.c and alloca.c are compiled into the
+         shell
+
+lib/malloc/gmalloc.c
+       - new file, GNU libc malloc code
+
+Makefile.in
+       - new source file, xmalloc.c, new object file, xmalloc.o
+
+general.h
+       - changed type of size argument to xmalloc, xrealloc to `size_t'
+
+configure.in
+       - changes for new argument `--with-glibc-malloc' that includes
+         gmalloc.o in libmalloc.a
+
+                                  4/18
+                                  ----
+xmalloc.c
+       - if malloc or realloc return null, report in the error message
+         how many bytes have been allocated
+
+lib/readline/display.c
+       - changed redisplay code to use an array of positions in the visible
+         and invisible lines at which to break lines instead of simply
+         calculating based on the screenwidth and number of invisible
+         characters.  In the future, this will allow newlines embedded in
+         the lines to display to be handled better
+
+[Bash-1.14.4 released to net]
+
+                                  4/19
+                                  ----
+lib/readline/signals.c
+       - changed last call to signal() to call rl_set_sighandler()
+
+                                  4/20
+                                  ----
+lib/readline/display.c
+       - changed some ascii-specific code to use CTRL_CHAR and UNCTRL
+       - finished up the changes that keep an array of line breaks
+
+shell.h
+       - moved #define constants for parameter pattern substitution here
+         from subst.c
+
+subst.c
+       - changed the pattern substitution functions to take a `flags'
+         parameter, which subsumes the match type, global replacement
+         flag, and quoted variables
+       - changed the pattern substitution functions to handle the `#'
+         and `%' match qualifiers, which anchor the match at the
+         beginning and end of the string, respectively
+
+shell.c
+       - moved the code that turns off privileged mode into a function
+         named `disable_priv_mode'
+       - if the shell is running setuid or setgid and `-p' is not
+         supplied, turn off privileged mode and reset the effective
+         uid/gid
+
+                                  4/21
+                                  ----
+subst.c
+       - added a `quoted' paramter to parameter_brace_remove_pattern;
+         Posix.2 says that the pattern is parsed differently if the
+         entire expression is double-quoted
+       - `getpattern' now takes a second argument, `quoted'
+       - fixed `getpattern' to correctly handles a pattern spec when
+         the whole expression is double-quoted.  Posix.2 says that
+         quote characters inside the pattern spec don't quote any
+         special pattern chars if the whole thing is double-quoted.
+         For example, the `*' in "${foo#'*'}" is not quoted, and the
+         single quotes must appear literally.
+
+Makefile.in
+       - add `documentation' as a dependency of `.made'
+
+                                  4/24
+                                  ----
+Makefile.in
+       - added `installdirs' target that makes bindir, infodir, mandir,
+         and man3dir [in 1.14.5 cpp-Makefile]
+
+                                  4/25
+                                  ----
+builtins/fc.def
+       - fixed problem with `fc -l' that occurred when fewer than 16 lines
+         were in the history list [in 1.14.5]
+
+                                   5/1
+                                   ---
+Makefile.in, {builtins,documentation}/Makefile.in, lib/*/Makefile.in
+       - fixed up the various `clean' targets to agree with Gnu coding
+         standards
+
+                                   5/2
+                                   ---
+lib/readline/complete.c
+       - made insert_all_matches correctly quote each of the filenames
+         inserted into the line, if necessary
+
+config.h.top
+       - surround definitions of DEFAULT_PATH_VALUE and STANDARD_UTILS_PATH
+         with #ifndef/#endif to allow them to be overridden from the command
+         line
+
+builtins/set.def
+       - changed set -o allenv to set -o keyword for ksh88 compatibility
+
+documentation/{bash.1,features.texi}
+       - changed set -o allenv to set -o keyword
+
+builtins/setattr.def
+       - added a `nodefs' attribute to set_or_show_attributes,
+         show_var_attributes, and show_name_attributes to inhibit printing
+         of definition as well as name
+
+builtins/declare.def
+       - changed calls to set_or_show_attributes, and show_var_attributes
+         accordingly
+
+                                   5/3
+                                   ---
+Makefile.in
+       - LIBPATH -> LIBSUBDIR
+
+                                   5/4
+                                   ---
+lib/readline/bind.c
+       - renamed readline variable meta-flag to be input-meta
+
+documentation/bash.1, lib/readline/doc/rluser.texinfo
+       - changed meta-flag to input-meta
+
+documentation/Makefile.in
+       - use groff -Tascii to convert .1 -> .0
+
+subst.c
+       - new function, strip_trailing_ifs_whitespace, does the obvious
+
+builtins/read.def
+       - call strip_trailing_ifs_whitespace before assigning last
+         variable to remainder of input string [in 1.14.5]
+
+                                   5/5
+                                   ---
+builtins/hashcom.h
+       - changed check_dot member of the PATH_DATA struct to flags, and
+         added a HASH_CHKDOT define to replace the check_dot semantics
+       - add HASH_RELPATH define for flags value
+
+builtins/hash.def, builtins/common.c
+       - instead of xxx->check_dot, use (xxx->flags & HASH_CHKDOT)
+
+builtins/hash.def
+       - if the full pathname to which a command is being hashed does
+         not begin with a `/', set the HASH_RELPATH flag for it
+
+builtins/common.c
+       - if a hashed filename as HASH_RELPATH set, check ./filename,
+         returning null if that filename is not executable
+
+execute_cmd.c, general.c, execute_cmd.h, general.h
+       - moved same_file and check_binary_file from execute_cmd.c to
+         general.c
+
+hashlib.c, Makefile.in
+       - renamed hash.c to hashlib.c
+
+hashlib.h, Makefile.in, builtins/Makefile.in, alias.h, variables.h,
+execute_cmd.c, hashlib.c, builtins/hashcom.h
+       - renamed hash.h to hashlib.h
+
+variables.c, alias.c
+       - removed inclusion of `hash.h'; header files already include
+         correct file
+
+Makefile.in
+       - new rule to remake all the Makefiles (`make Makefiles')
+       - more changes to adhere to GNU coding standards for the various
+         flavors of `clean' targets
+
+                                   5/8
+                                   ---
+documentation/Makefile.in
+       - use `texi2dvi' to make dvi files rather than tex and texindex
+         [in 1.14.5]
+       - don't install `bash_builtins.1' [in 1.14.5]
+
+Makefile.in
+       - removed instances of doc-support/texindex
+
+                                   5/9
+                                   ---
+make_cmd.c
+       - new function make_bare_word, to make a WORD_DESC from a string but
+         not to set any of its flags
+       - broke make_word into make_bare_word and make_word_flags
+       - fixed a bug in make_word_flags to make backslash-quoting a quoting
+         character work right to not set the W_QUOTED flags
+
+subst.c, array.c, execute_cmd.c
+       - call make_bare_word instead of make_word in situations where we
+         don't want the flags set inadvertently
+
+                                  5/11
+                                  ----
+subst.c
+       - removed special handling of $POSIX_PEDANTIC
+
+                                  5/12
+                                  ----
+shell.c
+       - broke the code that fetches the uids and gids into a new
+         function, uidget()
+
+subst.c
+       - EUID and UID are no longer handled specially, since they're
+         readonly
+       - removed sv_uids function
+       - merge sv_histfilesize into sv_histsize
+
+variables.c
+       - instead of calling sv_uids from initialize_shell_variables,
+         call uidset() instead
+       - sv_uids -> uidset with mods to make it faster and avoid an
+         extra call to free, malloc, and itos
+
+bashhist.c
+       - call sv_histsize instead of sv_histfilesize
+
+                                  5/13
+                                  ----
+pathexp.c
+       - moved setup_ignore_patterns here from bashline.c, so GLOBIGNORE
+         works even when readline is compiled out of the shell
+       - changed the ignore data structure to a `struct ignorevar',
+         defined in pathexp.h
+       - added functions to implement GLOBIGNORE
+
+bashline.c
+       - setup_ignore_patterns now in pathexp.c
+       - renamed _ignore_names to ignore_completion_names
+
+subst.c
+       - new function sv_globignore to be called when GLOBIGNORE changes
+         value
+
+documentation/{bash.1,features.texi}
+       - documented GLOBIGNORE
+
+                                  5/15
+                                  ----
+documentation/texinfo.tex
+       - upgraded to version 2.145 from autoconf-2.3 distribution
+
+                                  5/16
+                                  ----
+lib/readline/display.c
+       - delicate surgery on rl_redisplay, update_line, and _rl_update_final
+         to convert to using the line breaks array instead of assuming that
+         lines wrap because they're too long and using absolute buffer
+         positioning calculated from the screen width.  Now the `lithist'
+         shopt option works right
+
+lib/readline/complete.c
+       - make sure insert_match doesn't double an opening quote character
+         after make_quoted_replacement adds an opening quote [in 1.14.5]
+       - make sure append_match doesn't double a closing quote character
+         [in 1.14.5]
+
+quit.h
+       - new macros: SETINTERRUPT, CLRINTERRUPT, ADDINTERRUPT, DELINTERRUPT
+         to manipulate the value of interrupt_state
+
+trap.c, sig.c, jobs.c
+       - changes to use the new macros from quit.h
+
+jobs.c
+       - make an a job that exits due to SIGINT make the shell act as if
+         it received the interrupt itself, but only if SIGINT is not
+         trapped [in 1.14.5]
+
+                                  5/18
+                                  ----
+builtins/common.c
+       - fix up find_hashed_filename and the HASH_RELPATH code.  still need
+         to use `shopt -s checkhash' to check the hashed pathnames.  could
+         fix this up more to make that unnecessary in the HASH_RELPATH case
+
+subst.c
+       - new function get_array_value that does array subscripting for
+         things like aa[1], for use by other parts of the shell like the
+         expression evaluator
+
+expr.c
+       - changes to make things like $(( aa[1] + aa[2])) work without
+         using ${aa[1]}
+
+bashhist.c
+       - converted the HISTIGNORE code to use the `struct ignorevar'
+         framework, with a callback function histignore_item_func to
+         set the HIGN_EXPAND flag if needed
+
+pathexp.c
+       - made the `globignore' variable static
+       - redid the code that removes ignored names from the `names' array
+         in ignore_globbed_names to make it more efficient
+
+bashline.c
+       - made the `fignore' variable static
+
+                                  5/20
+                                  ----
+Makefile.in
+       - made the `distclean' target remove the Makefiles in subdirectories
+         created by autoconf
+
+                                  5/22
+                                  ----
+builtins/command.def
+       - don't allow `command -p' if the shell is restricted
+
+documentation/bash.1
+       - documented the restriction on command -p for rbash
+
+                                  5/23
+                                  ----
+aclocal.m4
+       - add a new macro BASH_CHECK_TYPE, based on AC_CHECK_TYPE, that
+         allows the caller to specify the header files to be included
+         in the test program and provides for a default value to be
+         defined if the type is found in the system files
+
+configure.in
+       - check for getrusage and gettimeofday functions/syscalls
+       - use BASH_CHECK_TYPE to check for clock_t in sys/types.h and
+         sys/times.h
+       - use BASH_CHECK_TYPE to check for sigset_t instead of a special
+         BASH_TYPE_SIGSET_T
+       - use BASH_CHECK_TYPE to check for quad_t instead of BASH_QUAD_T
+       - new argument --enable-command-timing to compile in the `time'
+         reserved word and command timing
+
+general.c
+       - print_time_in_hz takes a `clock_t', not a `time_t'
+
+execute_cmd.c
+       - support for timing pipelines with a new function time_command
+       - execute_command_internal calls time_command if it is passed a
+         command with the CMD_TIME_PIPELINE bit set in command->flags
+       - new functions difftimeval and addtimeval to do arithmetic on
+         timeval structs with overflow
+
+parse.y
+       - new production: pipeline_command, used by list1 and simple_list1
+       - pipeline_command includes rules to handle `!' and time
+       - code to recognize `time' as a reserved word
+
+print_cmd.c
+       - new code to print `time ' before a command if the CMD_TIME_PIPELINE
+         flag bit is turned on
+
+builtins/test.def
+       - added description of string1 < string2 and string1 > string2 to
+         the long doc
+
+test.c
+       - added `<' and `>' string binary operators
+
+documentation/bash.1
+       - documented the `time' reserved word and command timing
+       - documented the new test `<' and `>' binary operators
+
+documentation/features.texi
+       - documented the `time' reserved word and command timing
+       - added more to the section detailing the differences between bash
+         and sh
+       - added descriptions of LINENO and ENV to the Ksh variables section
+       - added description of echo to bash builtins section
+       - added PPID, BASH, SHLVL to the Bash variables section
+
+subst.c
+       - added a `quoted' parameter to extract_dollar_brace_string; changed
+         all calls to it
+
+                                  5/24
+                                  ----
+builtins/let.def
+       - wrote code for an `exp' builtin that treats all of its arguments
+         as an expression, concatenates them like `eval', and runs the
+         expression evaluator
+
+expr.c
+       - added code to do the Posix.2 conditional operator: expr?expr:expr
+       - added a `noeval' flag to suppress evaluation.  currently it only
+         suppresses assignment
+       - added code to the && and || functions so that evaluation is
+         suppressed in the part of the statement that is not supposed to
+         be executed (a && b: set noeval if a is false; a || b; set
+         noeval if a is true)
+
+                                  5/25
+                                  ----
+documentation/{bash.1,features.texi}
+       - documented new `expr?expr:expr' conditional expression syntax
+         now arithmetic evaluation is Posix.2-conformant
+
+lib/readline/readline.c
+       - added several more locale names to the list of legal $LANG
+         values
+
+subst.c
+       - fixed a bug in parameter_brace_patsub: when replacing a string 
+         with nothing, rep was set to "", and the code attempted to
+         free "", which the GNU malloc upchucked on
+
+bashhist.c
+       - just add a line to the history if command_oriented_history is
+         set to 1 and the current line in the command is > 1; don't
+         even bother checking history_ignore
+
+parse.y
+       - new variable `two_tokens_ago' to remember the token read before
+         `token_before_that'
+       - fix to history_delimiting_chars to make sure that no semicolon
+         is added after `()' (assume its a function definition), but that
+         a semicolon is added after other `)' (assume its a parenthesized
+         command)
+
+                                  5/31
+                                  ----
+tests/run-all
+       - put `.' first in $PATH and don't export ENV
+       - set THIS_SH to ../bash if it's unset
+
+lib/readline/complete.c
+       - only try to find a word break character in rl_complete_internal
+         if we hit the end of the input string and found_quote == 0
+         (the opening quote could have been the last character in the
+         string)
+
+                                   6/2
+                                   ---
+subst.c
+       - changed make_quoted_char to return CTLNUL\0 if passed a \0
+         (this is what quote_string does, too) [in 1.14.5]
+       - changed list_string to use make_quoted_char when adding a quoted
+         null argument due to a null field when ifs != ' \t\n'
+       - added an `expandpat' argument to getpattern, which tells it to
+         call string_extract_double_quoted if the pattern expression is
+         double-quoted, and changed all calls to initially pass `1' as
+         its value
+
+jobs.c
+       - changed start_job so that an attempt to start a job marked as
+         JDEAD elicits an error message [in 1.14.5]
+
+Makefile.in
+       - fixed `distclean' target so that it removes Makefiles in subdirs
+         *after* descending into them to do submakes (!)
+       - fixed `realclean' target to remove everything that distclean does
+
+                                   6/5
+                                   ---
+builtins/declare.def
+       - fixed a typo that made `declare +r var' turn off read-only status
+         for a variable [in 1.14.5]
+       - added -p option to short doc and long doc
+       - added code to allow `declare -f -options name' to set and unset
+         attributes for the named functions.  Only when no other options
+         are supplied will the named and value of the function be displayed
+         [in 1.14.5]
+
+variables.h
+       - new SETVARATTR macro to set or unset attributes for a specific
+         SHELL_VAR *
+
+builtins/setattr.def
+       - use SETVARATTR
+
+                                   6/7
+                                   ---
+execute_cmd.c
+       - moved the retrieval of $PS3 inside the loop in execute_select_command
+         so that PS3 can be modified in the select command's body
+         [in 1.14.5]
+
+execute_cmd.c
+       - changed execute_builtin and execute_function to not set
+         builtin_env and function_env, respectively, to NULL if there is
+         no temporary env.  This makes the temp env persist across calls
+         to functions from other functions [in 1.14.5]
+
+configure.in
+       - Linux needs LOCAL_LDFLAGS set to -rdynamic
+
+                                   6/8
+                                   ---
+general.c
+       - canonicalize_pathname should not attempt to interpret backslash
+         quoting `/', since Unix doesn't really allow it [in 1.14.5]
+
+bashline.c
+       - added `\', `!', and `)' to the list of characters which
+         cause filenames to be quoted
+       - changed bash_quote_filename to use any of the three shell
+         quoting styles based on the value of a variable,
+         completion_quoting_style
+       - if *qcp is not 0 when passed to bash_quote_filename, adjust the
+         type of completion we're doing based on its value (i.e.,
+         *qcp == '"' forces double quoting, *qcp == '\'' forces single)
+       - bash_quote_filename now leaves the quotes intact in the filename
+         it returns.  The readline completion code takes care of avoiding
+         doubled open quotes
+       - if a filename containing a `!' is passed to bash_quote_filename
+         without an opening quote character, and we are performing history
+         expansion, use single quoting as the quoting style
+
+bashhist.c
+       - changed bash_history_disable to not call bash_history_reinit(0),
+         but do what it needs to directly
+       - new function bash_history_enable
+       - make history_expansion_inhibited exist only if BANG_HISTORY
+         is defined
+
+bashhist.h
+       - extern declaration for bash_history_enable
+
+lib/readline/complete.c
+       - make make_quoted_replacement set should_quote to 1 if the quote
+         character is `'' as well as if it's `"'
+
+test.c
+       - added the csh-like `=~' and `!~' pattern-matching binary operators
+         which match the string on the lhs against the shell pattern on
+         the rhs.  PATTERN_MATCHING must be defined for this to work; it is
+         undefined and undocumented by default
+
+jobs.c
+       - broke the code that gets the new window size and sets $LINES and
+         $COLUMNS out of sigwinch_sighandler into a new function,
+         get_window_size, which sigwinch_sighandler calls
+
+                                  6/12
+                                  ----
+parse.y
+       - new function, pop_expansion, to remove the top string on the
+         expanded token stack
+       - renamed save_expansion to push_expansion
+
+lib/readline/complete.c
+       - fixed a bug in find_completion_word that tested found_quote
+         instead of quote_char when trying to decide if we have an unclosed
+         quoted string [in 1.14.6]
+
+                                  6/26
+                                  ----
+subst.c
+       - fixed expand_word_internal to remove all traces of $*, even if
+         it's quoted, if there are no positional parameters and there are
+         other characters in the expansion
+
+bashline.c
+       - don't attempt hostname completion if multiple consecutive `@'
+         characters appear
+
+                                  6/27
+                                  ----
+shell.c
+       - initialize top_level early, and exit if a longjmp sends us there
+         before we reinitialize
+
+subst.c
+       - more fixes to expansion of quoted $* when no positional parameters
+       - broke the code that assigns a value to an array element (and parses
+         the array element reference) into a new function,
+         do_array_element_assignment
+
+builtins/read.def
+       - new function, bind_read_variable, to allow binding simple variables
+         and array elements to strings read (uses do_array_element_assignment)
+       - changed occurrences of bind_variable to bind_read_variable where
+         it matters
+
+variables.c
+       - tentative change to bind_variable to make x=y the same as x[0]=y
+         if x is already an array variable.  This works for `read' as well.
+         This is what ksh does.
+
+                                  6/28
+                                  ----
+alias.h
+       - added a `flags' member to the ASSOC struct and renamed it to
+         `alias_t'
+
+alias.c, bashline.c, builtins/alias.def, builtins/type.def
+       - changed ASSOC to alias_t
+
+alias.c
+       - changed add_alias to set the AL_EXPANDNEXT flag when the alias is
+         inserted into the hash table
+
+parse.y
+       - added a third parameter to push_string: a pointer to the alias_t
+         that is being expanded
+       - push_string marks the alias it's passed as being expanded
+         (AL_BEINGEXPANDED)
+       - pop_string marks the alias being popped as no longer being
+         expanded
+       - changed shell_getc to defer popping an alias expansion until
+         the parser has had a chance to catch up, since the parser reads
+         ahead and would cause the expansion to be popped before it
+         fully parsed the expanded string
+       - changed alias_expand_word to check the AL_BEINGEXPANDED flag
+         instead of the expanded_token_stack when checking whether an
+         alias is already being expanded
+
+oslib.c
+       - make the definition of bzero be surrounded by #ifdef HAVE_BZERO
+         rather than lumping it in with bcopy
+
+configure.in
+       - add a test for bzero
+
+config.h.in
+       - add a template for HAVE_BZERO
+
+                                   7/3
+                                   ---
+builtins/set.def
+       - added new meaning for `set +o' without options, as per the latest
+         draft of Posix.2.  It means to list -o options as a series of set
+         commands to recreate the current settings
+
+documentation/bash.1
+       - augmented description of the `set' builtin
+
+                                   7/6
+                                   ---
+jobs.c
+       - make sure that temp_handler is not set to SIG_DFL before calling
+         it from waitchld
+
+builtins/cd.def
+       - rewrote cd_builtin to make the code flow clearer
+       - broke full directory name construction out into a separate
+         function: mkpath
+       - cd_builtin now tests that a directory constructed from a $CDPATH
+         entry is actually a directory before trying to chdir to it
+       - added an error message if $HOME is not set
+       - added a descriptive error message if `cd -' used and OLDPWD unset
+       - changed the error messages to use builtin_error, not file_error
+       - moved the code at the bind_and_exit label into a function,
+         bindpwd (no_symlinks)
+       - Posix.2 says that when using $CDPATH, the resultant value of PWD
+         should have no symlinks
+
+                                   7/7
+                                   ---
+input.c
+       - if fd_to_buffered_stream fails in some way and returns a NULL
+         buffered stream, with_input_from_buffered_stream uses a function
+         that does nothing but return EOF as the `getter'.  This keeps
+         the shell from crashing if invoked with fd 0 closed
+
+subst.c
+       - made the `quoted' parameter to expand_word_internal into a flags
+         word with flag values defined in shell.h.  Each place where
+         `quoted' is tested for a non-zero value was changed to test
+         (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) != 0 instead
+
+mailcheck.c, shell.c, parse.y
+       - change calls to the expand_string* functions to pass an explicit
+         Q_DOUBLE_QUOTES where appropriate
+
+                                   7/9
+                                   ---
+subst.c
+       - getpattern now passes Q_NOQUOTE to expand_word_internal, indicating
+         that quotes in the pattern spec are not to be treated specially
+
+                                  7/12
+                                  ----
+jobs.c
+       - fixed up the MUST_UNBLOCK_CHILD code in wait_for so that it now
+         unblocks all signals and sets the signal handler for SIGCHLD to
+         SIG_DFL.  pre-v4 SCO machines seem to require this [in 1.14.5]
+
+[Bash-1.14.5 released to net 7/16]
+
+                                  7/17
+                                  ----
+documentation/features.texi
+       - changed the Bourne Shell builtins section to have the same format
+         as the bash builtins section, with usage synopses
+       - added a section on the restricted shell
+
+                                  7/18
+                                  ----
+documentation/features.texi
+       - changed the name of this document to the Bash Reference Manual
+       - added sections on POSIX mode and restricted shell
+
+lib/readline/doc/hsuser.texinfo
+       - added the text from the bash manual page about the bash history
+         facilities if BashFeatures is set
+
+                                  7/19
+                                  ----
+documentation/features.texi
+       - added more stuff to the bash basics section
+
+lib/readline/doc/rluser.texinfo
+       - added a sample inputrc file
+
+                                  7/20
+                                  ----
+documentation/features.texi
+       - added section on shell expansions to bash basics section
+
+builtins/Makefile.in, lib/glob/Makefile.in, lib/malloc/Makefile.in,
+lib/readline/Makefile.in, lib/termcap/Makefile.in, lib/tilde/Makefile.in
+       - ar is now called with flags `cr' when building libraries
+
+                                  7/21
+                                  ----
+lib/readline/complete.c
+       - fixed a bug in find_completion_word that resulted in the found_quote
+         flag and the delimiter character not being passed back to the
+         caller (tested (*fp) instead of (fp) before assigning found_quote;
+         similarly for dp).  With this fix, the filename dequoting function
+         is properly called
+
+                                  7/25
+                                  ----
+general.c
+       - renamed bash_tilde_expand to bash_tilde_expansion_failure_hook
+       - new function, bash_tilde_expand, that just sets interrupt_immediately
+         and calls tilde_expand, returning what tilde_expand returns
+
+subst.c, general.c, shell.c, execute_cmd.c, variables.c, bashline.c,
+builtins/cd.def
+       - changed calls to tilde_expand to calls to bash_tilde_expand instead
+
+                                  7/27
+                                  ----
+builtins/set.def
+       - added a -o history option to enable and disable command history
+         saving.  This uses bash_history_enable() and bash_history_disable()
+         It's keyed off of remember_on_history.  With this, shell scripts 
+         can use the command history
+
+bashhist.c
+       - bash_history_enable now calls sv_history_control and sv_histignore
+
+builtins/fc.def
+       - if history_list() returns a null pointer, immediately return
+         [in 1.14.6]
+
+documentation/{bash.1,features.texi}, lib/readline/doc/hsuser.texinfo
+       - added a description of the `set -o history' option and changed
+         text to refer to it rather than strictly interactive shells
+
+                                   8/1
+                                   ---
+variables.c
+       - new builtin variable $HOSTNAME, initialized to current_host_name
+         as set in shell.c
+
+documentation/bash.1, documentation/features.texi
+       - documented $HOSTNAME
+
+                                   8/3
+                                   ---
+support/texi2html
+       - new program, a texinfo-html converter
+
+documentation/Makefile.in
+       - added directives to produce features.html from features.texi
+
+MANIFEST.doc
+       - added features.html and features_toc.html to the doc distribution
+
+                                  8/10
+                                  ----
+lib/readline/bind.c
+       - new functions rl_variable_dumper and rl_dump_variables to print
+         readline variables and their values to rl_outstream
+       - new functions rl_get_keymap_name and rl_get_keymap_name_from_edit_mode
+         to get the name of the current keymap for the variable dumper
+
+lib/readline/readline.h
+       - extern declarations for rl_variable_dumper, rl_dump_variables, and
+         rl_get_keymap_name
+
+builtins/bind.def
+       - added -V flag to print variable names and bindings
+       - added -P flag to print variable names and bindings in the syntax
+         of the inputrc file
+
+lib/readline/funmap.c
+       - added new bindable `dump-variables' readline command
+
+documentation/{bash.{1,html},readline.3,features.html},
+lib/readline/doc/rluser.texinfo
+       - documented new `dump-variables' readline command
+
+documentation/{bash.{1,html},features.{texi,html}
+       - documented new bind -P and -V options
+
+documentation/bashbug.1
+       - new manual page
+
+documentation/Makefile.in
+       - changes to build and install bashbug.1
+
+                                  8/15
+                                  ----
+print_cmd.c
+       - new function `xprintf' that just calls vfprintf(stdout, ...)
+         to avoid having to declare printf
+
+parse.y
+       - slight change in how read_token_word computes `all_digits'
+
+                                  8/21
+                                  ----
+
+subst.c
+       - new function dequote_escapes to remove CTLESC escaping
+         CTLESC and CTLNUL in a string, returning a new string
+
+                                  8/25
+                                  ----
+shell.c
+       - execute the file SYS_BASHRC for interactive shells if SYS_BASHRC
+         is defined, before executing ~/.bashrc
+
+config.h.top
+       - add a dummy commented definition for SYS_BASHRC, defaulting to
+         /etc/bash.bashrc
+
+lib/readline/input.c
+       - added code to call select() in rl_gather_tyi() and return
+         immediately if it indicates that there is nothing to read on
+         the readline input fd (#ifdef HAVE_SELECT)
+
+lib/posixheaders/posixdir.h
+       - new file to localize the <dirent.h>/<sys/dir.h> and dirent/direct
+         mess
+
+posixdir.h, lib/readline/posixdir.h
+       - symlinks to lib/posixheaders/posixdir.h
+
+lib/readline/rldefs.h
+       - removed the posix dir includes and defines
+
+lib/readline/complete.c, getcwd.c
+       - include posixdir.h rather than having the code inline
+
+builtins/cd.def
+       - new code to do spelling correction on the directory name
+         modified from patch sent by Neil Russell (caret@c-side.com)
+
+                                  8/29
+                                  ----
+builtins/shopt.def
+       - new option `cdspell' to toggle cd directory name spelling
+         correction
+
+documentation/{bash.{1,html},features.texi}
+       - documented new shopt `cdspell' option
+
+                                   9/5
+                                   ---
+subst.c
+       - $'' should expand to the same thing as '' (a quoted null string)
+
+shell.h
+       - changed CTLNUL to '\177'; some scripts use ^B for things like IFS
+         [in 1.14.6]
+
+                                   9/7
+                                   ---
+support/config.guess
+       - added code to identify a PPC running Solaris 2
+
+doc
+       - new directory replacing documentation
+
+Makefile.in, MANIFEST, MANIFEST.doc, configure.in
+       - replaced `documentation' with `doc'
+
+                                   9/8
+                                   ---
+lib/readline/display.c
+       - fixed the code in _rl_update_final that decides whether or not the
+         cursor is at character position 0 on an otherwise-empty line and
+         adjusts _rl_vis_botlin accordingly
+
+                                  9/13
+                                  ----
+general.c
+       - fixed canonicalize_pathname to make sure that intermediate
+         results correspond to directories before blindly chopping
+         off the last component when we see a `..'.  This fixes the
+         `cd ../.../..' being equivalent to `cd ..' problem
+
+subst.c
+       - fixed make_named_pipe so that mkfifo is called with mode 0600
+         for security reasons [in 1.14.6]
+       - changed the /dev/fd version of add_fifo_list to zero out new
+         entries to the fifo_list when it resizes it larger [in 1.14.6]
+       - changed make_dev_fd_filename to use DEV_FD_PREFIX
+
+aclocal.m4
+       - changed BASH_HAVE_DEV_FD to check for /proc/self/fd and define
+         DEV_FD_PREFIX to either "/dev/fd/" or "/proc/self/fd/" as
+         appropriate
+
+                                  9/14
+                                  ----
+lib/readline/display.c
+       - when displaying the first line of a multiline prompt, make sure
+         that the final \n is followed by a \r (outputting one if necessary)
+         so that we know we are starting at column 0
+
+variables.h
+       - new attribute: att_local
+
+variables.c
+       - changed make_local_variable to set the att_local attribute
+       - changed makunbound to just make variables marked as `local' in
+         the current context invisible.  This makes the local variable
+         persist throughout the function even if it is unset, so a
+         subsequent assignment preserves the `local' attribute
+       - changed kill_all_local_variables to unset the att_local attribute
+         before calling makunbound
+
+                                  9/18
+                                  ----
+lib/readline/complete.c
+       - make sure the cursor is on the last line of a possibly-multiple-
+         line command line before listing the completions in
+         display_matches
+
+                                  9/19
+                                  ----
+braces.c
+       - fixed the non-SHELL case in brace_gobbler so the loop exits when
+         it should
+
+lib/readline/bind.c, lib/readline/readline.h
+       - added functions to dump key sequences bound to macros and their
+         values
+
+builtins/bind.def
+       - added -S and -s options to dump the readline macros and their values
+       - changed the options so that -p and -P dump functions, -v and -V
+         dump variables, and -s and -S dump macros (s for string)
+
+doc/{bash.{1,html},readline.3,features.texi}, lib/readline/doc/rluser.texinfo
+       - added documentation for the new `bind' options
+       - added documentation for the new readline functions to dump macros
+         and the key sequences that output them
+
+                                  9/22
+                                  ----
+print_cmd.c
+       - new function xtrace_print_word_list (WORD_LIST *) to print the
+         words of a simple command when set -x is on.  This prints ''
+         when it encounters an empty string
+
+externs.h
+       - new extern declaration for xtrace_print_word_list
+
+execute_cmd.c
+       - call xtrace_print_word_list in execute_simple_command
+
+                                  9/25
+                                  ----
+builtins/getopts.def
+       - make sure that the loop counter stops at 10 when stepping through
+         the dollar_vars array to count the number of positional parameters
+         [in 1.14.6]
+
+                                  9/30
+                                  ----
+lib/readline/histsearch.c
+       - fixed history_search_internal to bail immediately if it gets a
+         null or empty search string.  This fixes the !? core dumps.
+         [in 1.14.6]
+
+                                  10/3
+                                  ----
+lib/readline/histexpand.c
+       - if there is a null string given with a !? search specifier, use
+         a previous search string if one exists, else fail immediately
+
+trap.c
+       - made run_exit_trap preserve $? around the call to execute the
+         trap string, unless the trap string contains an `exit'
+         command, in which case it can set the shell's exit status
+         [in 1.14.6]
+
+         In other words:
+
+               touch /tmp/z
+               trap 'rm /tmp/z ; exit 5' 0
+               exit 1
+
+         exits with status 5; while
+
+               touch /tmp/z
+               trap 'rm /tmp/z' 0
+               exit 1
+
+         exits with status 1
+
+subst.c, parse.y
+       - moved the $'...' code from subst.c to parse.y, more like ksh
+         does it
+
+doc/bash.1, doc/bash.html, doc/features.texi
+       - moved the description of $'...' from the expansion section to
+         the quoting section
+
+                                  10/4
+                                  ----
+command.h
+       - added a `line' member to the function struct for the source line
+         the function definition starts on
+
+make_cmd.c
+       - initialize the `line' member in Function_def to 0
+       - make_function_def takes a third parameter telling which line the
+         function definition started on and a fourth telling which line
+         the function body started on
+
+make_cmd.h
+       - changed prototype for make_function_def
+
+parse.y
+       - new variable `function_dstart', set by read_token and read_token_word
+         to keep track of where a function definition begins
+       - new variable `function_bstart' to keep track of where function
+         body begins
+       - pass function_dstart and function_bstart to make_function_def
+       - new function strtrans to do the $"..." locale-specific translation
+         of `...'
+       - call strtrans() to translate $"string".  The translated string is
+         double-quoted
+
+doc/bash.{1,html}
+       - updated the description of LINENO now that line numbers within
+         functions are correct
+
+configure.in
+       - look for the `gettext' library function
+
+config.h.in
+       - define HAVE_GETTEXT if gettext(3) exists in a findable library
+
+                                  10/5
+                                  ----
+builtins/common.c
+       - changed backslash_quote so that `#' is only quoted at the start
+         of a word
+       - new function contains_shell_metas returns 1 if the argument
+         string contains one or more shell meta-characters that require
+         quoting
+
+builtins/common.h
+       - extern declaration for contains_shell_metas
+
+print_cmd.c
+       - changed xtrace_print_word_list to print words containing
+         shell metacharacters within single quotes
+
+lib/termcap
+       - upgraded to GNU termcap version 1.3
+
+                                  10/9
+                                  ----
+lib/readline/readline.c
+       - call setlocale(LC_CTYPE, ...) after finding a legal value for
+         one of LC_ALL, LC_CTYPE, or LANG
+
+                                  10/11
+                                  -----
+lib/readline/search.c
+       - make rl_history_search_internal just do previous-history or
+         next-history as appropriate when given a null search string
+         (rl_point == 0)
+
+                                  10/24
+                                  -----
+subst.c
+       - fixed an off-by-one error in char_is_quoted that skipped a
+         characters after calling skip_single_quoted or skip_double_quoted
+         [in 1.14.6]
+       - fixed an off-by-one error in string_extract_verbatim so it
+         leaves *sindex at the separator character if the separator
+         character is "'" [in 1.14.6]
+
+                                  10/27
+                                  -----
+parse.y
+       - in CHECK_FOR_RESERVED_WORD, make sure that reading a `}'
+         decrements open_brace_awaiting_satisfaction if it is non-zero
+         [in 1.14.6]
+
+shell.c
+       - don't run the shell startup files if the shell is running
+         setuid
+       - don't source $ENV if the shell is running setuid
+
+variables.c
+       - new parameter to initialize_shell_variables: no_functions.  If
+         non-zero, don't import functions from the environment
+
+variables.h
+       - change to function prototype for initialize_shell_variables
+
+lib/readline/complete.c
+       - fix for the code that decides whether or not a char is quoted for
+         applications that don't supply a value for rl_char_is_quoted_p
+       - fixed insert_match to not remove a user-supplied opening quote
+         character if make_quoted_replacement does not return a string
+         beginning with that quote character
+
+                                  11/2
+                                  ----
+general.c
+       - new function ungetc_with_restart that handles the local buffering
+         [in 1.14.6]
+
+parse.y
+       - changed yy_stream_unget to call ungetc_with_restart if the OS
+         does not have restartable syscalls [in 1.14.6]
+
+                                  11/3
+                                  ----
+bashline.c
+       - rewrote _ignore_completion_names to actually free and remove
+         names from the array if more than one names in the array
+         passed is acceptable, instead of just bailing [in 1.14.6]
+
+                                  11/7
+                                  ----
+bashline.c
+       - if no matches are acceptable to _ignore_completion_names,
+         free the entries in NAMES, set NAMES[0] == 0, and let the
+         caller clean up [in 1.14.6]
+       - fixed a problem with backslash-quoted characters in
+         bash_dequote_filename that caused the character after the
+         backslash to be interpreted
+       - bash_dequote_filename now takes a quote_char parameter that,
+         if non-zero, gives the quote character (`'' or `"') that
+         delimits the filename.  Used to initialize the quoting state
+
+lib/readline/complete.c
+       - if the completion ignore function returns with MATCHES == 0
+         or MATCHES[0] == 0, ring the bell and quit the completion
+         attempt [in 1.14.6]
+       - pass quote_char to gen_completion_matches so it can pass it
+         along to the app-specific filename dequoting function
+       - have gen_completion_matches pass quote_char to whatever function
+         is pointed to by rl_filename_dequoting_function
+
+pathexp.c
+       - rewrote ignore_globbed_names to be more like _ignore_completion_names
+
+lib/readline/doc/rltech.texinfo
+       - updated documentation for rl_filename_dequoting_function
+
+                                  11/10
+                                  -----
+subst.c
+       - fixed remove_quoted_nulls so that it is now a full function that
+         removes unquoted CTLNUL chars from the string it is passed
+         [in 1.14.6]
+       - fixed expand_word_internal to avoid generating some unneeded
+         quoted nulls (if the string is partially quoted, note that we
+         have seen a quoted null and add one if the rest of the string
+         doesn't expand to anything)
+
+                                  11/13
+                                  -----
+variables.c
+       - bind HOSTTYPE, OSTYPE, and HOSTNAME unconditionally
+
+pathexp.c
+       - new function quote_globbing_chars, adds `\' before globbing
+         chars in its string argument, returns new string
+
+pathexp.h
+       - extern declaration for quote_globbing_chars
+
+bashhist.c
+       - if the previous line contains globbing chars, run it through
+         quote_globbing_chars before trying to match.  This affects
+         only HISTIGNORE patterns containing `&'
+
+                                  11/14
+                                  -----
+bashhist.c
+       - if the history line to be added contains globbing chars, quote
+         them with backslashes by calling quote_globbing_chars in
+         history_should_ignore before comparing them against the
+         patterns in HISTIGNORE
+
+bashline.c
+       - make sure that we erase the current readline line after running
+         fc on it and executing the resultant commands in
+         vi_edit_and_execute_command, so the original readline line
+         doesn't get returned [in 1.14.6]
+
+jobs.h
+       - added a new job listing format: JLIST_NONINTERACTIVE -- like
+         JLIST_LONG, but does not print the job number
+
+jobs.c
+       - added code to pretty_print_job to handle JLIST_NONINTERACTIVE
+       - call notify_and_cleanup() from wait_for even if the shell is
+         running a script (interactive_shell == 0)
+       - changed notify_and_cleanup to call notify_of_job_status if
+         interactive or interactive_shell == 0, so scripts report
+         about jobs they run
+       - changed notify_of_job_status to call pretty_print_job with a
+         JLIST_NONINTERACTIVE format if interactive_shell is 0 and a
+         job is marked JDEAD, after printing the script name and line
+         number.  This message is printed only if the job dies due to
+         a fatal signal
+
+support/mkversion.c
+       - added support for a `-status status' argument to set the
+         `release status' of the shell (alpha, beta, or release).  It
+         defines `RELSTATUS' in version.h and changes the definition
+         of SCCSVERSION, if present
+
+Makefile.in
+       - set a RELSTATUS variable that is included when printing the build
+         message and passed to mkversion with the -status option
+       - make RELSTATUS one of the variables sed sets when it creates
+         bashbug from support/bashbug.sh
+
+version.c
+       - added a `release_status' variable that's set to RELSTATUS if
+         it's defined
+
+support/bashbug.sh
+       - added the `RELSTATUS' variable to the report with heading
+         `Release Status'
+       - set the bug address to chet@po.cwru.edu if the release status
+         is `alpha' or `beta'
+
+                                  11/15
+                                  -----
+
+shell.c, execute_cmd.c
+       - new variable expand_aliases to control alias expansion.  For now,
+         this is set to the same value as interactive_shell when that is
+         set
+
+parse.y
+       - perform alias expansion if expand_aliases is non-zero rather than
+         checking the value of interactive_shell
+
+                                  11/16
+                                  -----
+builtins/shopt.def
+       - new option `expand_aliases' to control the value of expand_aliases
+
+doc/bash.1, doc/bash.html
+       - updated the description of `shopt' with the `expand_aliases' option
+
+                                  11/28
+                                  -----
+bashline.c
+       - if there is only one completion in _ignore_completion_names, see
+         if it is acceptable and return right away [in 1.14.6]
+
+configure.in
+       - change to define WAITPID_BROKEN on SCO 3.2v5
+
+                                  12/6
+                                  ----
+parse.y
+       - call prompt_again in read_token_word if a newline is read in an
+         interactive shell and bash_input.type is either st_stdin or
+         st_stream
+       - remove superfluous call to reset_readline_prompt in yy_readline_get
+
+                                  12/7
+                                  ----
+parse.y
+       - combine delimiters, delimiter_depth, and delimiter_space into a
+         single structure of type `struct dstack'
+       - replace all references to delimiter* with dstack.delimiter*
+       - include parser.h for struct dstack
+       - new define pop_delimiter(), analogous to push_delimiter
+       - current_delimiter, push_delimiter, and pop_delimiter defines now
+         include the delimiter stack struct as the first parameter
+
+parser.h
+       - now includes definition of struct dstack
+
+bashline.c
+       - include parser.h for struct dstack
+       - refer to dstack.delimiter_depth instead of delimiter_depth
+
+                                  12/12
+                                  -----
+execute_cmd.c
+       - before doing a longjmp(subshell_top_level,...) when executing a
+         shell script without a leading #!, set history_lines_this_session
+         to 0 to forget about the history and not save it on an exec
+         (we don't free the memory with clear_history(), though -- that
+         would slow bash down)
+
+                                  12/14
+                                  -----
+jobs.c, nojobs.c
+       - cause the sigwinch handling code to be compiled into the shell
+         even if READLINE is defined
+       - new functions: set_sigwinch_handler and unset_sigwith_handler
+         to enable and disable catching of SIGWINCH and adjusting $LINES
+         and $COLUMNS
+       - changed initialize_job_signals to install a signal handler for
+         SIGWINCH with set_sigwinch_handler
+
+jobs.h
+       - extern declarations for set_sigwinch_handler and
+         unset_sigwinch_handler
+
+                                  12/20
+                                  -----
+doc/bash.{1,html}, doc/readline.3, lib/readline/doc/rluser.texinfo
+       - documented the readline `visible-stats' variable
+
+                                  12/21
+                                  -----
+trap.c
+       - new global variable `running_trap' incremented and decremented
+         around running a trap command in _run_trap_internal
+
+execute_cmd.c
+       - new variable currently_executing_command, set to the COMMAND *
+         currently being processed by execute_command_internal, unless a
+         trap command is being run (running_trap != 0)
+       - new function executing_line_number, which returns the line number
+         of the currently executing command (which may not be the same as
+         line_number)
+       - don't run the debug trap if it was not set before the current
+         simple command was executed, since we don't want to run it after
+         the trap command that sets the DEBUG trap
+
+variables.c
+       - new function assign_lineno, to assign a value to line_number
+         when LINENO is set
+       - changed get_lineno to call executing_line_number() rather than
+         returning line_number
+
+parse.y
+       - new argument for push_stream telling it whether or not to reset
+         line_number to 0
+
+builtins/common.c
+       - change to parse_and_execute to call push_stream with an argument
+
+                                  12/29
+                                  -----
+subst.c
+       - set subshell_environment in command_substitute and process_substitute
+         for the child process
+
+                                   1/2
+                                   ---
+trap.c
+       - made decode_signal recognize signal names case insensitively
+
+shell.c
+       - make the shell exit on a longjmp (DISCARD, ...) if
+         subshell_environment is non-zero
+
+                                  1/16
+                                  ----
+lib/readline/histexpand.c
+       - let the `!' in ${!xxx} pass through without error
+
+shell.c
+       - new --help long option
+       - new function show_shell_usage() for use by --help
+
+                                  1/19
+                                  ----
+parse.y
+       - changes to shell_getc to make sure that lines consisting of only a
+         newline get added to the history correctly when they are part of
+         a quoted string
+
+                                  1/24
+                                  ----
+aclocal.m4, configure.in
+       - added a check for -lsocket (and -lnsl) to fix solaris problems
+         with isnetconn()
+
+shell.c
+       - rearranged the code in isnetconn to check for a socket using
+         getpeername() first, before any SVR4 or SVR4.2-specific checks
+       - added checks for ttys (isatty) and FIFOs (S_ISFIFO) to the
+         SVR4/SVR4.2 case of isnetconn()
+
+general.h
+       - new macro RESIZE_MALLOCED_BUFFER to check and see whether there
+         is enough room in a string to add a given number of characters
+         and to resize it if there is not
+
+                                  1/25
+                                  ----
+parse.y, general.c, subst.c, bashhist.c, alias.c, array.c, variables.c
+       - use RESIZE_MALLOCED_BUFFER where appropriate
+
+                                  1/26
+                                  ----
+support/config.{guess,sub}
+       - merged in latest changes from GNU master copies
+
+                                  1/30
+                                  ----
+
+jobs.c
+       - make sure to freeze the jobs list when calling a trap handler
+         for SIGINT
+       - added code to waitchld() so that a SIGINT trap handler is called
+         if the shell is running a shell script and a SIGINT is received
+         while waiting for a foreground job, even if that job does not
+         die from the SIGINT
+
+jobs.c, nojobs.c
+       - make get_tty_state reset $LINES and $COLUMNS after each process
+         exits if the variable `check_window_size' is non-zero
+
+builtins/shopt.def
+       - new variable `checkwinsize', which controls the value of
+         check_window_size
+
+doc/{bash.{1,html},features.texi}
+       - updated description of `shopt' to include `checkwinsize'
+
+execute_cmd.c, lib/readline,complete.c
+       - some changes from the GNU WIN32 project for the bash port to
+         Windows NT and Windows 95
+
+bashwait.h
+       - new file, with `union wait' defines from jobs.h
+
+jobs.h
+       - include `bashwait.h' if <sys/wait.h> is not present and
+         _POSIX_VERSION is not defined
+       - removed define of pid_t for non-Posix systems; now provided by
+         autoconf in config.h
+
+                                  1/31
+                                  ----
+parse.y
+       - new temporary delimiter stack, used when decoding prompt strings.
+         This is needed so command substitutions in the prompt strings
+         (especially PS2) don't screw up the parser's quoting state
+
+lib/readline/complete.c
+       - new variable for readline library users:
+         rl_completion_append_character.  The value of this variable is
+         the character appended to a completion when it occurs at the
+         end of a line.  Setting it to '\0' causes nothing to be
+         appended.
+
+lib/readline/readline.h
+       - declaration for rl_completion_append_character
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_completion_append_character as int variable available
+         to library users
+
+subst.c
+       - new code for maintaining a string array saying which words in the
+         output of expand_word_list_internal are the result of globbing
+
+variables.c
+       - new function put_gnu_argv_flags_into_env (pid, flags_string)
+         to put Roland's GNU getopt helper variable into the export_env
+
+execute_cmd.c
+       - in execute_disk_command, after forking the child, put the GNU
+         getopt helper environment variable into the child's export_env
+
+unwind_prot.c
+       - changed unwind_protect_var and restore_variable to do the
+         bcopy of the variable's value if it's shorter than the size of
+         an int, as well as if it's longer.  This keeps stray data
+         from being copied if a short is being unwind-protected
+
+unwind_prot.h
+       - new define, unwind_protect_short, to protect variables smaller
+         than an int
+
+jobs.c
+       - in the code that handles SIGCHLD traps, call unwind_protect_short
+         if that is the size of a pid_t (for last_made_pid)
+
+                                   2/5
+                                   ---
+Makefile.in
+       - only try make distclean in HIST_LIBDIR if Makefile exists -- could
+         have already been removed if HIST_LIBDIR is the same as RL_LIBDIR
+
+general.c
+       - make canonicalize_pathname be more careful about what it checks
+         for being a directory name when processing a full pathname
+
+Makefile.in, configure.in, doc/Makefile.in
+       - small changes to get bash to build better in a directory not the
+         source directory
+
+                                  2/12
+                                  ----
+Makefile.in
+       - added `install-strip' target
+
+                                  2/14
+                                  ----
+doc/bash.{1,html}, doc/features.texi
+       - documented the `--verbose' startup option
+
+lib/readline/complete.c
+       - fix to gen_completion_matches to fix a memory leak
+       - fix to rl_complete_internal to fix a memory leak
+
+                                  2/15
+                                  ----
+bashwait.h
+       - changed to use WORDS_BIGENDIAN instead of LITTLE_ENDIAN or
+         BIG_ENDIAN
+
+configure.in, config.h.in
+       - call AC_C_BIGENDIAN, define WORDS_BIGENDIAN
+
+Makefile.in
+       - remove all references to mkendian.c, mkendian, and bash_endian.h
+       - added a `symlinks' target that just runs support/fixlinks
+
+MANIFEST
+       - mkendian.c is no longer in the distribution
+
+                                  2/16
+                                  ----
+execute_cmd.c
+       - include <sys/times.h> if HAVE_SYS_TIMES_H and HAVE_TIMES are
+         defined
+
+bashline.c
+       - fix to bash_directory_completion_hook to compensate for
+         canonicalize_pathname returning NULL
+
+variables.c
+       - fix to initialize_shell_variables to compensate for
+         canonicalize_pathname returning NULL
+
+                                  2/22
+                                  ----
+tests/test-tests, tests/test.right
+       - changes to avoid writing in the source directory -- all temp files
+         are created in /tmp
+
+[First alpha release at Thu Feb 22 15:59:51 EST 1996]
+
+                                  2/23
+                                  ----
+lib/readline/rldefs.h
+       - work around SVR4.2 bug including <sys/ptem.h> and <termios.h>
+
+lib/readline/chardefs.h
+       - fix to CTRL_CHAR macro for chars > 128 on systems with signed
+         characters
+
+builtins/ulimit.def
+       - protect more of the RLIMIT_* defines with checks
+       - new macro RETINVALID() to set errno and return the correct
+         value for an invalid request
+
+doc/Makefile.in
+       - add a definition for INSTALL, set by autoconf
+
+                                  2/26
+                                  ----
+support/bashbug.sh
+       - if USER is unset, assign it the value of $LOGNAME or `whoami`
+
+Makefile.in,{lib/*,doc,builtins}/Makefile.in
+       - use `test' instead of `[' to conform to GNU coding standards
+       - `incdir' -> `includedir' as per latest GNU coding standards
+
+lib/readline/Makefile.in, lib/glob/Makefile.in
+       - use $(srcdir)/ instead of $(srcdir) in the CSOURCES variable
+
+general.h
+       - new define, FS_NODIRS, to not find directory names when searching
+         $PATH
+
+execute_cmd.c
+       - fix to find_in_path_element so it does not return directories
+       - executable_file() no longer returns directories as executable
+
+                                  2/27
+                                  ----
+jobs.h
+       - new flag value: J_NOHUP
+
+jobs.c
+       - new function: nohup_job(job).  Sets J_NOHUP flag for specified
+         job
+       - change hangup_all_jobs so that jobs marked J_NOHUP are not
+         sent SIGHUP.  If stopped, the job still gets SIGCONT.
+       - changed calls to report_error to call internal_error, which will
+         not exit the shell
+       - changed FIND_CHILD define to call internal_error, restore the
+         SIGINT handler, set termination_state to 127 and return, rather
+         than aborting the shell
+
+builtins/jobs.def
+       - new option for disown: `-h'.  Marks the specified jobs J_NOHUP.
+
+doc/{bash.{1,html},features.texi}
+       - added description of `disown -h'
+
+jobs.c, nojobs.c
+       - include some files needed for struct winsize by SCO
+
+lib/readline/input.c
+       - added some #ifdefs to avoid including <sys/time.h> on systems
+         with select but without <sys/select.h>
+
+configure.in
+       - check for <stdarg.h>, define HAVE_STDARG_H in config.h if found
+
+config.h.bot
+       - define USE_VARARGS and either PREFER_STDARG or PREFER_VARARGS
+         if one of <stdarg.h> or <varargs.h> is present
+
+aclocal.m4
+       - moved default mail directory check here from configure.in, macro
+         name is BASH_DEFAULT_MAIL_DIR
+       - rewrote BASH_CHECK_DEV_FD to cache the value
+       - minor fixes from Bruno Haible
+
+shell.c
+       - no longer includes <varargs.h>
+
+builtins/Makefile.in
+       - add -I$(topdir)/builtins to list of includes
+
+execute_cmd.c, lib/glob/glob.c
+       - include memalloc.h for correct alloca definitions
+
+error.[ch], print_cmd.c, builtins/common.[ch]
+       - changes to include new ANSI-C stdargs code if PREFER_STDARG is
+         defined
+
+                                  2/28
+                                  ----
+aclocal.m4
+       - more minor fixes from Andreas Schwab
+
+doc/Makefile.in
+       - change TEXINPUTS makefile variables to TEXINPUTDIR to avoid
+         conflict with shell variable of the same name
+
+builtins/pushd.def
+       - fix to avoid a bad call to free after a call to
+         polite_directory_format does not change its argument string
+
+lib/readline/bind.c
+       - fixes to _rl_macro_dumper_internal so that it prints whatever
+         prefix it's passed, if any
+
+                                  2/29
+                                  ----
+Makefile.in
+       - slight change to the rule for `stamp-h': it should be created by
+         running `config.status', not explicitly by the makefile rule
+
+builtins/Makefile.in
+       - replace `..' in the dependencies with `$(topdir)'
+       - replace `.' in the dependencies with `$(srcdir)'
+
+                                   3/1
+                                   ---
+Makefile.in
+       - add a rule to build builtins/builtext.h for the benefit of
+         deficient makes like the SunOS one
+
+variables.c
+       - fix to assign_in_env so that values in the environment are
+         properly null-terminated
+
+builtins/Makefile.in
+       - added dependencies for object files made from .c files in this
+         directory: common.o, getopt.o, bashgetopt.o.  SunOS /bin/make
+         doesn't seem to be able to handle anything else
+
+support/mkclone
+       - new script to replace clone-bash that works from MANIFEST to link
+         only those files contained in a distribution
+
+support/mkversion.c
+       - change so that it doesn't try to get `.build' from the source
+         directory when that's different from the build directory
+
+                                   3/4
+                                   ---
+bashjmp.h
+       - #undef setjmp and longjmp before redefining them as sigsetjmp and
+         siglongjmp, respectively
+
+bashhist.c
+       - fixed an uninitialized variable problem in expand_histignore_pattern
+
+builtins/set.def
+       - used `on_or_off' where `value' was needed in minus_o_option_commands
+
+builtins/common.h
+       - added extern declaration for set_var_attribute
+
+print_cmd.c
+       - include `bashansi.h' instead of just string.h or strings.h
+
+builtins/*.def, builtins/common.c
+       - include `../bashansi.h' where appropriate
+
+parse.y
+       - fixed a parenthesization problem in alias_expand_token
+
+general.h
+       - added extern declaration for `ungetc_with_restart'
+
+lib/readline/readline.c
+       - renamed LibraryVersion to rl_library_version, made it extern,
+         assigned `2.1' to it
+
+lib/readline/readline.h
+       - extern declaration for `rl_library_version'
+
+lib/readline/doc/rltech.texinfo
+       - added description of `rl_library_version'
+
+lib/glob/glob.c
+       - changed call to sprintf in glob_dir_to_array to a couple of
+         calls to strcpy, since we keep the length of the first string
+         we copy
+
+                                   3/7
+                                   ---
+aclocal.m4
+       - added new macro `BASH_FUNC_LSTAT' to check for lstat on Linux,
+         which defines it as an inline function in <sys/stat.h>
+
+configure.in
+       - call BASH_FUNC_LSTAT if $ac_cv_func_lstat has value `no'
+
+                                   3/8
+                                   ---
+parse.y
+       - changed the occurrences of `list' in the if command productions
+         to use `compound_list' instead
+
+                                  3/11
+                                  ----
+parse.y
+       - changed the occurrences of `list' in the while and until command
+         productions to use `compound_list'
+
+lib/readline/complete.c
+       - fix to filename_completion_function -- off-by-one error when
+         expand-tilde is enabled and a filename to be completed begins
+         with `~/'
+
+                                  3/12
+                                  ----
+builtins/cd.def
+       - made the POSIX.2 behavior of PWD not containing symlinks after
+         using $CDPATH part of `posix mode', not default shell behavior
+
+lib/readline/display.c
+       - fix to update_line to handle update problems when using
+         horizontal scroll mode.  This is a dumb update solution -- it
+         should use a better one
+
+                                  3/14
+                                  ----
+examples/functions/csh-compat
+       - replaced the defintion for `alias' with a better one posted to
+         usenet by Mohit Aron <aron@cs.rice.edu>
+
+                                  3/15
+                                  ----
+jobs.c
+       - fix to wait_for_background_pids to keep `wait' from hanging
+
+                                  3/19
+                                  ----
+lib/readline/input.c
+       - new function `_rl_input_available()' returns > 0 if there is
+         input available on the readline input file descriptor.  Only
+         works if select(2) or FIONREAD are available
+
+lib/readline/isearch.c
+       - slight change to the isearch termination behavior -- ESC still
+         terminates the search, but if there is pending input or if input
+         arrives within 0.1 seconds (on systems with select(2)) it is
+         used as a prefix character with rl_execute_next
+
+shell.c
+       - the GNU coding standards say to write the output generated by
+         the --help command line option to stdout, not stderr
+       - show_shell_version now takes an `extended' option that displays
+         copyright information if non-zero
+       - show_shell_version now prints the value of `MACHTYPE' by default
+       - the `--version' option now causes the shell to exit successfully
+         after printing the extended version information
+
+externs.h
+       - changed prototype for show_shell_version
+
+shell.c, bashline.c, builtins/help.def
+       - changed calls to show_shell_version to add appropriate argument
+
+Makefile.in
+       - pass a `MACHTYPE' define to the compiler
+
+                                  3/22
+                                  ----
+general.c
+       - changed print_timeval() and print_time_in_hz() to output three
+         fractional digits after the decimal point
+
+examples/loadables/sleep.c
+       - changed to an implementation that will sleep fractional portions
+         of seconds if select() is available
+
+                                  3/25
+                                  ----
+builtins/shopt.def
+       - fixes to shopt -o from Andreas Schwab.  Use FLAG_ON/FLAG_OFF
+         instead of SETOPT/UNSETOPT
+
+                                  3/26
+                                  ----
+Makefile.in, builtins/Makefile.in
+       - use `@includedir@' instead of `@incdir' for autoconf 2.9
+
+Makefile.in
+       - the `info', `dvi', and `ps' targets do not depend on `texindex'
+       - add a `dist' target that just prints a message describing how
+         distributions are constructed
+
+support/mkdirs
+       - replace uses of [...] with `test'
+
+                                  3/28
+                                  ----
+parse.y
+       - fix for a problem with \@ prompt expansion from Tim Mooney
+
+jobs.c
+       - broke the code that prints a pipeline out into a separate
+         function: print_pipeline().  This gets called by
+         pretty_print_job and can be used for debugging
+       - two new functions to save and restore the_pipeline around calls
+         to make_child that you don't want to disturb the current pipeline,
+         for example in process substitution
+
+subst.c
+       - changed process_substitute to call save_pipeline and
+         restore_pipeline in the appropriate places
+
+                                  3/29
+                                  ----
+general.c
+       - ansicstr now takes an additional parameter, the length of the
+         string to be translated.  It's the second paramter.
+
+builtins/echo.def
+       - changed call to ansicstr to pass strlen(list->word->word)
+
+parse.y
+       - redid the $'...' expansion so it works like it's supposed to:
+         the quoted strings may appear anywhere in a token, and multiple
+         ansi-c quoted strings may appear in a token
+       - redid the $"..." expansion so it works like it's supposed to
+
+tests/nquote.{tests,right}, tests/run-nquote
+       - tests for the $'...' and $"..." quoting stuff -- simple-minded
+
+subst.c
+       - on systems without /dev/fd, open the named pipe for a `reading
+         in child' process substitution (>(...)) with O_NONBLOCK
+
+lib/posixheaders/filecntl.h
+       - add code to make sure the O_NONBLOCK is defined to O_NDELAY if
+         it is present and O_NONBLOCK is not defined by <fcntl.h>
+
+general.c
+       - don't bother handling both O_NONBLOCK and O_NDELAY in
+         unset_nodelay_mode, since filecntl.h defines O_NONBLOCK as
+         O_NDELAY for non-Posix systems
+
+                                   4/1
+                                   ---
+lib/readline/funmap.c
+       - made `vi-fetch-history' a bindable command name
+
+doc/readline.3
+       - many cleanups, updated the list of default bindings 
+
+                                   4/4
+                                   ---
+doc/bash.1, doc/readline.3
+       - fixed up use of \-; now it is not used unless the text is being
+         printed in bold or italic
+
+configure.in, config.h.in
+       - add a configuration option, --enable-usg-echo-default, to turn
+         on DEFAULT_ECHO_TO_USG and make `echo' expand backslash-escaped
+         characters by default
+
+                                   4/8
+                                   ---
+parse.y
+       - another small change to localeexpand to handle backslash-escaped
+         double quotes in the double-quoted string
+
+                                   4/9
+                                   ---
+shell.c
+       - add the value of MACHTYPE to the text output by `--help'
+
+                                  4/11
+                                  ----
+parse.y
+       - more changes to the $"..." and $'...' code to move it into
+         read_token
+       - don't try to check token[token_index - 1] unless token_index
+         is greater than 0
+
+                                  4/12
+                                  ----
+trap.c
+       - new function run_trap_cleanup to clean up after _run_trap_internal
+         in the event that parse_and_execute does not return normally
+         (e.g., if a `return' is executed in the trap command)
+       - set running_trap to the number of the signal whose trap is being
+         run plus one in _run_trap_internal
+
+trap.h
+       - extern declaration for run_trap_cleanup
+
+jobs.c
+       - new function `unfreeze_jobs_list' to set freeze_jobs_list back to 0.
+         called from parse_and_execute_cleanup so a `return' while running
+         an interrupt trap does not leave the jobs list frozen
+
+jobs.h
+       - new extern declaration for unfreeze_jobs_list
+
+builtins/common.c
+       - if running_trap is non-zero in parse_and_execute_cleanup, indicating
+         that parse_and_execute was running a trap command when it got a
+         `return', call run_trap_cleanup (running_trap - 1)
+       - parse_and_execute_cleanup now calls unfreeze_jobs_list
+
+                                  4/16
+                                  ----
+Makefile.in
+       - don't try to make `doc' as a dependency of `install'
+
+doc/Makefile.in
+       - make `info' a dependency of `install' to make sure the info
+         document is present and up to date before installing it
+       - make the `install' target install the documents with a $(srcdir)/
+         prefix in case we're building in another directory
+
+lib/glob/glob.c
+       - fixed an off-by-one error in glob_dir_to_array
+
+shell.c
+       - removed an extra increment of arg_index when setting up the
+         arguments for -c command
+
+                                  4/17
+                                  ----
+pathexp.c
+       - made quote_globbing_chars backslash-quote backslashes as well as
+         `?*[]'; changed it to be a little faster
+
+bashhist.c
+       - call quote_globbing_chars to quote backslashes in the previous
+         history line even if no other globbing chars are present.  This
+         is done only if we're matching against a HISTIGNORE pattern of `&'
+       - don't bother quoting globbing characters in the current history
+         line in history_should_ignore -- fnmatch ignores special chars in
+         its `string' argument
+
+[bash-2.0-alpha2 frozen]
+
+                                  4/18
+                                  ----
+command.h
+       - new flag value for a word: W_NOSPLIT.  A word with this bit set
+         in its flags will not have word splitting performed
+
+parse.y
+       - turn on the W_NOSPLIT flags for assignment statements appearing
+         where an assignment statement is acceptable (words that would
+         return ASSIGNMENT_WORD rather than WORD).  This means that, for
+         the time being, assignment statement arguments to builtins like
+         `declare' or `alias' will be split unless they are quoted
+
+subst.c
+       - don't split a word in expand_word_internal if the W_NOSPLIT flag
+         is set, rather than checking W_ASSIGNMENT; do the same thing in
+         expand_word_list_internal
+
+builtins.h
+       - a new flag, ASSIGNMENT_BUILTIN, indicating that this builtin takes
+         assignment statements as arguments
+       - rearranged the values of the builtin flags, so the BUILTIN_* flags
+         come first, then the *_BUILTIN flags
+
+builtins/makebuiltins.c
+       - added code for an array of `assignment builtins' -- builtins that
+         take assignment statements as arguments -- and to add the
+         ASSIGNMENT_BUILTIN flag for those builtins
+
+execute_cmd.c
+       - added a hack function `fix_assignment_words', which checks the
+         first word of a builtin command to see if it is a builtin that
+         has the ASSIGNMENT_BUILTIN flag set, and adds W_NOSPLIT to the
+         flags for all words with the W_ASSIGNMENT bit set.  This means
+         that word splitting is not done for any of the assignment
+         statements in commands like `declare z=$a'
+
+                                  4/19
+                                  ----
+execute_cmd.c
+       - fixed a memory-freed-twice error in find_in_path_element
+
+lib/readline/rltty.c
+       - include <sys/ioctl.h> if GWINSZ_IN_SYS_IOCTL is defined and
+         SHELL is not defined
+
+lib/readline/input.c
+       - changed a stray HAVE_FIONREAD to FIONREAD
+       - include <sys/ioctl.h> if FIONREAD_IN_SYS_IOCTL is defined
+
+aclocal.m4
+       - new macro, BASH_HAVE_FIONREAD, to check for a #define of
+         FIONREAD in <sys/ioctl.h> or one of the files it includes;
+         defines FIONREAD_IN_SYS_IOCTL if present
+
+config.h.in
+       - new line for FIONREAD_IN_SYS_IOCTL
+
+configure.in
+       - call BASH_HAVE_FIONREAD
+
+                                  4/22
+                                  ----
+builtins/cd.def
+       - fixed a memory-freed-twice error in mkpath()
+
+jobs.c
+       - don't print a job termination message for a non-interactive shell
+         with startup_state == 2 (those shells are started to run commands
+         when bash is invoked with `-c command')
+
+                                  4/23
+                                  ----
+general.h
+       - definition for a `generic pointer' type PTR_T -- `void *' on ANSI
+         C systems, `char *' otherwise
+
+jobs.h
+       - new members of job struct: `j_cleanup', a function to call when the
+         job is marked JDEAD, and `cleanarg', argument to pass to j_cleanup
+
+jobs.c
+       - initialize j_cleanup and cleanarg to NULL in stop_pipeline
+       - call j_cleanup from waitchld() when a job is marked JDEAD
+
+test.c
+       - fixed binop() so it recognizes `<' and `>' as binary operators
+       - fixed a bug in binary_operator so `<' works correctly
+
+tests/test-tests
+       - fixed the tests so they no longer rely on the modes of files in
+         the file system to test -u, -g, -r, -x, -w, and so on, except
+         for a few `standard' files like /dev/tty and /dev/null
+       - added tests for string < string and string > string
+
+xmalloc.c
+       - include <unistd.h> if HAVE_UNISTD_H is defined for a prototype
+         for sbrk
+       - add an extern declaration for sbrk if SBRK_DECLARED is not defined
+       - use PTR_T to cast the return value of sbrk() when finding out where
+         the break is and how many bytes of memory have been allocated
+
+lib/malloc/malloc.c
+       - added code to write 0xcf into memory as it's freed, to uncover
+         callers that try to refer to freed memory, and writes 0xdf into
+         newly-allocated memory, to uncover callers that assume something
+         about new allocations (e.g., that newmem[0] == 0)
+
+lib/malloc/gmalloc.c
+       - latest version from GNU sources
+
+                                  4/25
+                                  ----
+doc/bash.1
+       - changed the description of `unset' to include a description of
+         the `-v' option
+
+parse.y
+       - fixed a problem with conversion to 12-hour time in
+         decode_prompt_string that made 12:00pm show up as 00:00pm
+
+                                  4/26
+                                  ----
+builtins/common.c, subst.c
+       - a couple of fixes from Andreas Schwab
+
+configure.in
+       - set up the minimal configuration after checking for
+         --enable-minimal-config with AC_ARG_ENABLE, before checking any
+         of the other options, instead of after checking all options.
+         This makes `--enable-minimal-config --enable-prompt-string-decoding'
+         work as documented
+       - changed AC_PREREQ to require autoconf version 2.8 or higher
+       - added some code to disable gnu malloc by default on the systems
+         listed in NOTES
+       - set MALLOC_SRC to have the $(ALLOC_LIBSRC)/ prefix to avoid having
+         a directory in the dependencies when making without the gnu
+         malloc
+
+lib/malloc/Makefile.in
+       - make gmalloc.o depend on $(BUILD_DIR)/config.h
+
+                                  4/30
+                                  ----
+COMPAT
+       - new file listing user-visible incompatibilites between bash-1.14
+         and bash-2.0
+
+parse.y
+       - new prompt expansions, \v (version) and \V (version + patchlevel)
+
+config.h.top
+       - the default value of PS1 is now '\s-\v\$ '
+
+doc/{bash.{1,html},features.texi}
+       - added descriptions of \v and \V prompt expansions
+       - changed default value of PS1
+
+Makefile.in
+       - added dependencies on config.h.top for files that use definitions
+         included there
+
+builtins/exec.def
+       - removed reference to `no_exit_on_failed_exec' from the help text
+
+                                   5/3
+                                   ---
+builtins/cd.def
+       - fixed a typo in fix from 4/22
+
+                                   5/7
+                                   ---
+builtins/common.c
+       - new function `no_options (WORD_LIST *)' to be called by builtins
+         that do not take options to check for options and -?.  It returns
+         0 on success, non-zero if an unwanted option is supplied
+
+builtins/common.h
+       - extern declaration for no_options
+
+builtins/return.def
+       - corrected the error message to include returning from a sourced
+         script
+
+builtins/{getopts,eval,wait,source,fg_bg,help}.def
+       - changed the following builtins to either call no_options or test
+         explicitly for options and return EX_USAGE if any are found:
+
+               getopts eval wait source . fg bg help
+
+builtins/help.def
+       - error messages are now printed using builtin_error
+
+                                   5/8
+                                   ---
+builtins/jobs.def
+       - fixed an unitialized variable problem
+
+tests/more-exp.tests
+       - added additional tests for IFS problem uncovered by `iffe'
+
+                                   5/9
+                                   ---
+lib/malloc/Makefile.in
+       - use $(ALLOCA_SOURCE) instead of $< in rule that builds alloca.o.
+         Some makes don't expand the $< in non-suffix rules
+
+lib/readline/rldefs.h
+       - fix workaround for SVR4.2 bug
+
+shell.c
+       - even though SVR4.2 has getpeername(), isnetconn() should not use it
+
+maxpath.h
+       - rework to make sure PATH_MAX and NAME_MAX are defined, and remove
+         the BUILDING_MAKEFILE code
+
+general.c, parse.y, oslib.c, jobs.c, builtins/common.c, builtins/cd.def
+       - change uses of MAXPATHLEN to PATH_MAX
+
+examples/loadables/{{log,base,dir}name,tty,pathchk,tee}.c
+       - new loadable builtins:
+
+               logname basename dirname tty pathchk tee
+
+configuure.in, config.h.in
+       - look for tzset(3), define HAVE_TZSET if found
+
+subst.c
+       - new special variable function, sv_tz, which calls tzset when
+         TZ is changed, if tzset(3) exists and the shell is compiled
+         to do prompt string decoding
+
+subst.h
+       - extern declaration for sv_tz
+
+                                  5/10
+                                  ----
+builtins/echo.def
+       - only call printf if the string to print is non-null
+       - add an fflush(stdout) after the printf call to work around a
+         bug in SunOS 5.5
+
+                                  5/16
+                                  ----
+shell.c
+       - moved some variable declarations out of this file to more
+         logical places
+
+support/config.guess
+       - small fixes from rfg@monkeys.com
+
+version.c
+       - moved functions for getting, setting, and displaying shell version
+         information here from shell.c
+
+general.c
+       - moved set_lines_and_columns to variables.c
+       - moved getc_with_restart and ungetc_with_restart to input.c
+       - new function argv_to_word_list(), converts an array of strings
+         into a WORD_LIST
+       - renamed find_name_in_list to find_name_in_array to match rest
+         of functions that operate on arrays of strings
+
+configure.in, Makefile.in, jobs.c, nojobs.c
+       - changes so that jobs.c no longer includes nojobs.c, and the correct
+         object file (jobs.o or nojobs.o) is selected by configure
+         and substituted into the Makefile
+
+list.c
+       - new file, list manipulation functions from general.c
+
+externs.h, general.h
+       - moved extern declarations for functions defined in oslib.c and
+         list.c to externs.h from general.h
+
+                                  5/17
+                                  ----
+locale.c
+       - new file, with locale code from parse.y and shell.c
+
+shell.c
+       - don't turn off job control if act_like_sh is set
+       - if an unknown option is supplied at startup or if -c is
+         supplied without an argument, exit with EX_USAGE
+       - call posix_initialize after parsing all the options, to
+         catch `bash -o posix'
+       - new functions: init_interactive(), init_noninteractive()
+       - exit with EX_NOTFOUND if a script argument is not found
+       - exit with EX_NOINPUT if a script file cannot be opened for
+         some reason
+
+shell.h
+       - new define for EX_NOINPUT exit status (126)
+
+                                  5/18
+                                  ----
+lib/readline/bind.c
+       - fixed _rl_get_keyname() so that it properly handles C-\ and outputs
+         it as \C-\\ and C-" as \C-\".  This fixes the improper binding
+         commands written by `bind -p' that caused weird things to happen
+         when people used the output of `bind -p' as a start for their
+         own inputrc files
+       - new function _rl_init_file_error to print error messages encountered
+         while parsing the inputrc file
+       - print out an error message if parsing an inputrc line and no closing
+         double quote is found for a key binding
+
+lib/readline/complete.c
+       - in rl_complete_internal, if the completion function results in
+         multiple matches, but none match up to even the first character, 
+         use what the user typed in (which is presumably a glob pattern
+         that expanded into multiple files) as matches[0].  This makes
+         things like show-all-if-ambiguous work right, too
+
+oslib.c
+       - if we are providing our own version of getenv(), provide a function
+         _getenv() as well, which just calls getenv()
+
+builtins/ulimit.def
+       - #define _KERNEL before including <sys/resource.h> if HPUX is
+         defined.  This makes the full set of limits available on hpux
+         version 8 and above
+
+bashline.c
+       - new function, enable_hostname_completion, sets up readline to
+         perform or not perform hostname completion.  Hostname completion
+         is on by default.
+       - don't attempt hostname completion in attempt_shell_completion()
+         unless perform_hostname_completion is set
+
+builtins/shopt.def
+       - add a `set_func' member to the shopt options structure, to provide
+         a hook for those variables that require a little more than just
+         toggling a variable on or off
+       - new shopt variable `hostcomplete', turns hostname completion on and
+         off
+
+doc/{bash.{1,html},features.texi}
+       - added description of new shopt `hostcomplete' variable
+
+                                  5/21
+                                  ----
+sig.c
+       - don't try to save the shell history in termination_unwind_protect
+         if we're dying due to SIGABRT
+
+bashhist.c
+       - new functions: last_history_entry (static), last_history_line
+
+bashhist.h
+       - extern declarations for new functions in bashhist.c
+
+error.c
+       - have programming_error() report the last command in the history
+         before aborting
+
+builtins/fc.def
+       - if the editor returns a non-zero exit status when using `fc -e',
+         return immediately without trying to execute the commands, as
+         per Posix.2, 5.12.2
+       - when using `fc -s', echo the command to be executed to stderr,
+         not stdout
+
+lib/readline/terminal.c
+       - new file, with all code related to termcap/terminfo
+
+lib/readline/{readline,rltty,display,util}.c
+       - moved functions dealing with termcap to terminal.c
+
+lib/readline/readline.c
+       - readline_initialize_everything now calls _rl_enable_meta_key()
+         to turn on the meta key, based on the value of _rl_enable_meta
+         (on by default)
+
+lib/readline/rltty.c
+       - do not enable and disable the meta key each time readline is
+         called; do it once at initialization
+
+                                  5/23
+                                  ----
+bashhist.c
+       - when `hist_verify' is set, call re_edit with the expanded line,
+         not the original one, and do not print the results of the
+         expansion before re-editing
+
+                                  5/24
+                                  ----
+support/config.guess
+       - recognize linux/sparc
+
+configure.in
+       - don't use GNU malloc on linux/sparc
+
+variables.c
+       - initialize a new $MACHTYPE variable to the value of MACHTYPE as
+         set by autoconf
+
+doc/{bash.{1,html},features.texi}
+       - documented $MACHTYPE
+
+                                  5/30
+                                  ----
+builtins/ulimit.def
+       - allow the max vm size to be set via setrlimit() if RLIMIT_VMEM
+         is defined
+
+                                  5/31
+                                  ----
+shell.h
+       - changed EX_USAGE to 258, EX_BADUSAGE is now 2
+       - added a number of execution failure statuses, so that builtins
+         can indicate various failures.  All are greater than 256, so
+         they cannot be returned by other utilities
+
+execute_cmd.c
+       - new function, builtin_status(), to translate the new return
+         status codes to something the shell can export
+       - changed execute_simple_command to call builtin_status after
+         execute_builtin_or_function to translate error codes if a
+         builtin is invoked.  If a function or regular builtin is
+         invoked, all return values greater than EX_SHERRBASE get
+         translated to EXECUTION_FAILURE, with the exception that
+         EX_USAGE gets translated to EX_BADUSAGE.  If a special
+         builtin failed with a status > EX_SHERRBASE, special_builtin_failed
+         is set to cause the shell to exit in POSIX mode
+       - changed execute_builtin_or_function to return EX_REDIRFAIL if
+         redirections fail
+       - changed execute_subshell_builtin_or_function to translate
+         EX_USAGE to EX_BADUSAGE if a builtin is executed
+       - set this_command_name to NULL in execute_for_command before binding
+         each member of the word list to the loop variable, to avoid
+         garbled error messages if the variable has the integer attribute
+
+builtins/{set,unset}.def
+       - return EX_USAGE instead of EXECUTION_FAILURE if a bad option is
+         supplied
+
+builtins/source.def
+       - return EX_USAGE instead of EXECUTION_FAILURE if the required
+         filename argument is missing
+
+builtins/setattr.def
+       - return EX_BADASSIGN if any assignment statements given as arguments
+         to readonly, export, etc. return failures (assignment to
+         non-identifier, assignment to readonly variable)
+
+builtins/declare.def
+       - don't allow `declare var=value' to assign value to a readonly
+         variable
+
+lib/readline/rldefs.h
+       - include <stdarg.h> if we're going to be using stdarg instead of
+         varargs
+
+lib/readline/display.c
+       - added `stdarg' version of rl_message
+
+lib/readline/readline.h
+       - changed extern declaration for rl_message to be in ANSI-C format
+         if __STDC__ is defined and we're using stdarg
+
+variables.c
+       - make sure this_command_name is set to null before calling
+         make_variable_value in assign_array_var_from_string so any
+         error messages are not garbled
+
+                                   6/2
+                                   ---
+builtins/common.c
+       - don't execute the command in parse_and_execute if -n has been
+         enabled and the shell is not interactive
+       - include flags.h for read_but_dont_execute
+
+[bash-2.0-alpha3 released]
+
+                                   6/5
+                                   ---
+subst.c
+       - array_length_reference and parameter_brace_expand_length now
+         return -1 on errors
+       - parameter_brace_expand now returns &expand_param_error if
+         paramter_brace_expand_length returns something < 0
+
+variables.c
+       - assign_in_env now checks for assignments to readonly shell
+         variables and disallows them
+
+                                   6/6
+                                   ---
+xmalloc.c
+       - only do pointer arithmetic on pointers cast to (char *), since
+         it's not required that compilers support arithmetic on void *
+
+shell.c
+       - make sure <sys/socket.h> is included with the same conditions
+         used to call getpeername(2) in isnetconn()
+
+parse.y
+       - added a new function, paren_match, to parse the contents of $(...)
+         constructs.  This function correctly handles embedded quoted
+         strings, embedded command substitutions, embedded command
+         substitutions with embedded quoted strings, etc.  The implementation
+         is much closer to that described in POSIX.2, section 3.6.3.
+       - changed read_token_word to call paren_match where appropriate
+
+subst.c
+       - rewrote extract_delimited_string so that it correctly understands
+         quoted strings inside command substitutions, a la paren_match
+         in parse.y.  Corrected the description of the function's output
+         in the code.  extract_delimited_string is now very recursive, and
+         does not try to do everything in one pass without recursion
+
+                                   6/7
+                                   ---
+test.c
+       - fixed three_arguments() to test the second argument for a valid
+         binary operator before checking whether or not the first argument
+         is `!'.  This is what POSIX.2 says to do.
+
+lib/malloc/malloc.c
+       - don't compile in the memory scrambling code (#define MEMSCRAMBLE)
+         if NO_MEMSCRAMBLE is defined.
+
+configure.in
+       - define NO_MEMSCRAMBLE in LOCAL_CFLAGS for SCO 3.2v[45]
+
+                                   6/9
+                                   ---
+parse.y
+       - renamed paren_match to parse_matched_pair
+       - call parse_matched_pair to parse <(...) and >(...) constructs,
+         since those should be treated the same as $(...) for the purposes
+         of matching parens and skipping embedded quoted strings
+
+                                  6/13
+                                  ----
+parse.y
+       - augmented parse_matched_pair
+               o fixed up backslash quoting and CTLESC handling after
+                 backslashes
+               o match pairs of ${...} and $[...] inside double-quoted
+                 strings or `` strings
+               o keep track of line number quoted string starts on for
+                 better error messages
+               o push and pop delimiters when parsing quoted strings
+                 inside $(...), ${...}, and $[...] for use by the
+                 history code
+               o set EOF_Reached to 1 if we get an EOF before finding the
+                 match closer
+       - rewrote read_token_word from scratch to use parse_matched_pair:
+               o shell quote characters use parse_matched_pair to find
+                 the matching quote
+               o fixed up backslash parsing code
+               o compound array assignments use parse_matched_pair
+               o corrected all_digits and dollar_present computations, so,
+                 for instance, 2''>/dev/null is no longer accepted as
+                 identical to 2>/dev/null
+               o converted ${...} parsing to use parse_matched_pair
+               o removed printing of error messages about unmatched quotes;
+                 now handled by parse_matched_pair
+               o converted $'...' and $"..." to use parse_matched_pair
+               o removed all of the delimited_xxx and dollar_xxx variables
+                 and embedded_quoted_string
+       - modified report_syntax_error to regularize error messages:
+               o non-interactive shells and interactive shells running
+                 scripts with `.' now always report line numbers
+               o unexpected EOF is always reported when EOF_Reached is true
+               o non-interactive shells no longer duplicate the script name
+                 in error messages (e.g., `./z3: ./z3: line 3: syntax error')
+
+bashline.c
+       - make sure `newnames' is freed in _ignore_completion_names
+
+lib/readline/complete.c
+       - don't insert the first match on TAB completion in
+         rl_complete_internal() if matches[0] is the empty string --
+         that will overwrite whatever the user has typed, if dequoting
+         what the user typed results in the empty string
+
+execute_cmd.c
+       - include <limits.h> if HAVE_LIMITS_H is defined for ARG_MAX
+       - only put the special environment variable for GNU getopt into
+         the environment if ARG_MAX exceeds 10240
+
+subst.c
+       - rewrote extract_dollar_brace_string so that it fully obeys
+         the POSIX.2 rules for finding the closing `}' and uses
+         skip_{single,double}_quoted rather than trying to do it with
+         inline delimiters
+       - removed the INC_NEST and DEC_NEST defines
+
+                                  6/14
+                                  ----
+jobs.c
+       - don't print status messages for background jobs that complete
+         successfully when running shell scripts
+
+builtins/shopt.def
+       - when using shopt -o as a synonym for set -o, make sure $SHELLOPTS
+         is updated
+       - make sure to update $SHELLOPTS when using shopt to set or unset
+         interactive comments
+
+execute_cmd.c
+       - fixed find_in_path_element to not return non-executable files
+         when FS_EXEC_PREFERRED is one of the flags, after saving such
+         a file as file_to_lose_on (fix from william@nscs.fast.net)
+
+                                  6/17
+                                  ----
+lib/readline/complete.c
+       - after printing possible completions, all lines of a multi-line
+         prompt are redisplayed using rl_forced_update_display()
+
+subst.c
+       - in expand_word_internal, only do tilde expansion on words where
+         (flags & (W_ASSIGNMENT|W_QUOTED)) == W_ASSIGNMENT (unquoted
+         assignment statements) and contain unquoted `=~' or `:~', and
+         only if posixly_correct is off.  POSIX.2 says that only the
+         assignments preceding the command name should be tilde-expanded.
+
+                                  6/18
+                                  ----
+support/config.guess
+       - recognize the new Pyramid DC-OSx as `mips-pyramid-sysv4'
+
+configure.in
+       - set LOCAL_CFLAGS to -Xa for mips-pyramid-sysv4 as per
+         Peter Chubb
+
+subst.c
+       - variable assignment errors when there is not a command name
+         after the assignments now causes a non-interactive shell to 
+         exit in POSIX.2 mode
+
+execute_cmd.c
+       - if the iteration variable in a for statement is a read-only
+         variable, a variable assignment error occurs.  This causes
+         non-interactive shells to exit in posix mode, and a failure
+         status to be returned for other non-interactive shells and
+         interactive shells
+       - if the selection variable in a select statement is a read-only
+         variable, a variable assignment error occurs, with the same
+         consequences as a for statement variable assignment error
+
+doc/bashref.*
+       - renamed features.* to bashref.*, since that more accurately
+         reflects the current contents
+
+                                  6/19
+                                  ----
+test.c
+       - changed three_arguments() to do one-argument tests on $1 and
+         $3 and return the appropriate values if -a or -o is given as
+         the second argument
+       - changed three_arguments() to perform a one-argument test on
+         $2 if $1 == '(' and $3 == ')' and return that result
+       - make sure test_stat translates /dev/fd/xx to DEV_FD_PREFIX/xx
+         so /dev/fd/0 always means the same thing, even on linux,
+         which uses /proc/self/fd
+
+aclocal.m4
+       - added a check for libncurses in BASH_CHECK_LIB_TERMCAP
+
+configure.in
+       - added an initial message saying we're configuring for bash-2.0
+
+lib/glob/fnmatch.c
+       - made a small change to fnmatch() to fix a bug matching patterns
+         with multiple consecutive `*'s
+
+                                  6/20
+                                  ----
+parse.y
+       - inhibit history expansion when calling pre_process_line() from
+         shell_getc() if the current delimiter is a single quote, even
+         if we're on a different line than the opening quote
+       - make sure read_a_line prints a prompt if we're interactive and
+         not using readline, and make sure we call clearerr() if we
+         get EOF when interactive and not using readline
+
+bashhist.c
+       - new function history_expansion_p(char *) returns 1 if the string
+         passed contains the history expansion or history substitution
+         characters
+       - pre_process_line() now calls history_expansion_p and calls
+         the history expansion code only if that returns 1
+
+                                  6/26
+                                  ----
+lib/readline/isearch.c
+       - swap the behavior of ^J and ^M when i-searching.  ^J now terminates
+         the search without accepting the line.  ^M terminates the search
+         and accepts the line, executing the command
+
+examples/loadables/sprintf.c
+       - new `sprintf' builtin: sprintf var format [args...]
+
+lib/readline/readline.c
+       - added a line in _rl_dispatch that sets _rl_suppress_redisplay if
+         the function is rl_insert and there is input available
+
+                                  6/27
+                                  ----
+builtins/getopts.def
+       - new function, getopts_bind_variable(), used when assigning a value
+         to the user-supplied variable passed to getopts().  It makes sure
+         that that variable name is legal and prints an error message if it
+         is not
+
+builtins/getopt.c
+       - don't increment sh_optind until after we've checked whether or not
+         the current option character appears in the list of options passed
+         to getopts by the user
+
+                                  6/28
+                                  ----
+variables.c
+       - added a new parameter to print_var_value: QUOTE.  If it's non-zero
+         and the variable's value contains shell metacharacters, quote the
+         value so it can be read back in
+
+variables.h
+       - changed extern declaration for print_var_value
+
+siglist.h
+       - if SYS_SIGLIST_DECLARED is not defined, but HAVE_UNDER_SYS_SIGLIST
+         is, only declare sys_siglist as extern char *sys_siglist[] if
+         sys_siglist is not `#define'd
+
+parse.y
+       - make sure a reserved word is acceptable before returning `}' as
+         a token from special_case_tokens, even if the token read so far
+         is "}"
+       - make reset_parser set allow_open_brace to 0
+
+                                   7/1
+                                   ---
+test.c
+       - fixed binop to not try to read s[3] if s[2] == '\0'.  There are
+         no one-character binary operators that begin with `-'
+
+variables.c
+       - fixed kill_all_local_variables to do nothing if variable_context
+         is >= local_variable_stack_size (indicating that we do have some
+         local variables, but not at this level of function nesting, and
+         we are beyond the end of the array allocated the last time we
+         had local variables)
+
+                                   7/2
+                                   ---
+execute_cmd.c
+       - non-interactive shells in posix mode should exit if the variable
+         in a for command is not a valid identifier.  This should really
+         be caught by the parser
+       - non-interactive shells in posix mode should exit if a function
+         name is not a valid identifier.  This should also be caught by
+         the parser
+
+                                   7/3
+                                   ---
+jobs.c
+       - non-interactive shells should ignore stopped children, so
+         waitchld() should set waitpid_flags to WUNTRACED only if the
+         shell is interactive and it's not a subshell environment
+
+lib/readline/signals.c
+       - if not being compiled as part of the shell, readline should
+         catch SIGTERM and clean up
+
+shell.c
+       - change to isnetconn: on Solaris 2.5, getpeername() can return
+         EINVAL rather than ENOTSOCK if the fd passed as the first
+         argument is not a socket
+
+                                   7/5
+                                   ---
+lib/readline/complete.c
+       - new variable, available to library users, to inhibit completion
+         and cause the completion character to be inserted into the
+         line with self-insert: rl_inhibit_completion.  Set to 0 by default.
+
+lib/readline/readline.h
+       - extern declaration for rl_inhibit_completion
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_inhibit_completion
+
+lib/readline/bind.c
+       - new readline user variable: disable-completion.  This provides
+         users a way to toggle the value of rl_inhibit_completion
+
+doc/{bash.{1,html},readline.3}, lib/readline/doc/rluser.texinfo
+       - documented disable-completion variable
+
+lib/readline/doc/Makefile
+       - added `html' target to create html from rlman.texinfo and
+         hist.texinfo
+
+                                   7/8
+                                   ---
+builtins/cd.def
+       - only try cd spelling correction if the shell is currently
+         interactive, regardless of value of `cdspell' option
+
+lib/posixheaders/alloca.h
+       - AIX 4.2 needs `#pragma alloca' if gcc is not being used
+
+                                   7/9
+                                   ---
+builtins/getopts.def
+       - return EXECUTION_FAILURE from getopts if it's trying to assign
+         to a read-only variable
+       - reset sh_badopt to zero in getopts_reset()
+
+builtins/getopt.c
+       - new variable, sh_badopt, set to 1 if we find an illegal option
+       - do the increment of sh_optind if sh_badopt is non-zero and we're
+         at the end of the option string at the beginning of sh_getopt().
+         The increment is deferred until the next call so $OPTIND is
+         correct
+
+builtins/getopt.h
+       - extern declaration of sh_badopt
+
+                                  7/10
+                                  ----
+Makefile.in
+       - don't pass ALLOCA_SOURCE or ALLOCA_OBJECT to the make in lib/malloc
+       - don't make libmalloc.a depend on ALLOCA_DEP -- it causes some
+         compilers to build alloca.o in the top directory, and if ALLOCA
+         is not defined, makes the malloc library depend on a directory
+
+aclocal.m4
+       - some small changes to make the output look better
+
+memalloc.h
+       - made some small changes suggested by the autoconf documentation
+
+                                  7/11
+                                  ----
+parse.y
+       - swapped meanings of \h and \H in prompt_string_decode for
+         bash-1.14.6 compatibility
+
+doc/{bash.{1,html},bashref.texi}
+       - updated prompt string decoding section with swap of \h and \H
+
+general.c
+       - print_timeval and print_time_in_hz now accept a FILE * as the
+         first argument, so `times' can print to stdout while `time'
+         prints to stderr
+
+execute_cmd.c
+       - changed time_command to print the timing statistics to stderr
+
+builtins/times.def
+       - added the FILE * argument to the calls to print_timeval and
+         print_time_in_hz
+
+support/texi2html
+       - upgraded to version 1.50
+
+error.c
+       - include bashhist.h if HISTORY is defined for declarations of
+         last_history_line() and remember_on_history
+
+lib/glob/glob.c
+       - add a `#pragma alloca' as the first thing in the file if we're
+         not using gcc and _AIX is defined
+
+lib/posixheaders/memalloc.h
+       - remove the `#pragma alloca' stuff; it is done in the C source
+         files now, to avoid problems with other AIX header file
+         declarations
+
+                                  7/12
+                                  ----
+lib/readline/rltty.c
+       - some changes to work around AIX 4.2 bugs (sometimes OPOST is unset
+         in termios, sometimes FLUSHO is inexplicably set in termios, etc.)
+
+                                  7/15
+                                  ----
+lib/readline/rltty.c
+       - make SETATTR use TCSADRAIN on POSIX machines.  This setting is
+         supposed to be used for changes that affect output
+
+[bash-2.0-alpha4 released]
+
+                                  7/16
+                                  ----
+trap.c
+       - changed reset_or_restore_signal_handlers to honor traps before
+         special signals, so that `trap "" 2' works right and causes
+         children to ignore SIGINT
+
+locale.c
+       - added lc_all variable to track the value of LC_ALL
+       - added new functions: set_default_locale_vars, set_locale_var,
+         set_lang, get_locale_var, removed get_current_messages_locale
+
+subst.h
+       - added extern declaration for sv_locale
+
+subst.c
+       - LC_ALL, LC_CTYPE, LC_MESSAGES, and LANG are now special variables;
+         sv_locale() is called when they are assigned a value
+
+shell.c
+       - call set_default_locale_vars after initializing the shell variables
+         in main(), so LC_CTYPE and LC_MESSAGES (if present) have values
+       - shell.c does not need to include <locale.h>
+
+general.c
+       - changed print_timeval and print_time_in_hz to format their output
+         as Posix.2 specifies for `time -p' if the new POSIX_TIME argument
+         is non-zero
+
+parse.y
+       - new grammar production: timespec, to handle `time' and `time -p'
+       - change to special_case_tokens so that -p after `time' returns
+         TIMEOPT
+
+execute_cmd.c
+       - set posix_time in time_command if the command's flags include
+         CMD_TIME_POSIX
+       - call print_timeval and print_time_in_hz with posix_time as
+         the new third argument
+       - use a space to separate the word (`real') and the time if we're
+         in posix mode.  This is what POSIX.2 defines for `time -p'
+
+builtins/times.def
+       - call print_timeval and print_time_in_hz with 0 as the new third
+         argument
+
+command.h
+       - new flag: CMD_TIME_POSIX, used to handle `time -p'
+
+doc/{bash.{1,html},bashref.texi}
+       - documented `time -p'
+
+                                  7/17
+                                  ----
+support/mkversion.c
+       - include `config.h' before any other include files
+
+parse.y
+       - initialize was_dollar to 0 in parse_matched_pair
+
+configure.in
+       - removed duplicate check for <sys/file.h> from call to
+         AC_HAVE_HEADERS
+
+sig.c
+       - include siglist.h so we can find out if it defines HAVE_SYS_SIGLIST
+
+siglist.h
+       - define HAVE_SYS_SIGLIST if we end up defining sys_siglist as
+         _sys_siglist (Solaris 2.[45])
+
+siglist.c
+       - include "siglist.h" before testing whether or not HAVE_SYS_SIGLIST
+         is defined; it may be defined in there (Solaris 2.[45])
+
+                                  7/19
+                                  ----
+examples/misc/alias-conv.sh
+       - updated, now uses code from examples/functions/csh-compat to do
+         the alias conversion, uses `command' builtin in functions it
+         creates, does some substitution of csh special variables to
+         bash equivalents
+
+examples/misc/cshtobash
+       - a more ambitious script that attempts to convert csh aliases,
+         environment variables, and local variables to bash equivalents
+
+                                  7/22
+                                  ----
+bashline.c
+       - added `:' to the set of completion word break characters so that
+         individual directories in $PATH assignments can be completed
+
+aclocal.m4
+       - added a new macro, BASH_CC_WORKS, that aborts configuration if
+         ${CC} can't compile a simple program successfully
+
+configure.in
+       - call BASH_CC_WORKS before doing anything else
+
+                                  7/23
+                                  ----
+execute_cmd.c
+       - fixed select_query to print the prompt ($PS3) to stderr
+
+support/bashbug.sh
+       - workaround for bug in SunOS 5.x /bin/sh that causes it to
+         not ignore interrupts while waiting for a foreground process
+         to exit
+
+                                  7/24
+                                  ----
+general.c
+       - added new functions to decompose `timeval's and `clock_t's into
+         seconds and thousandths of seconds:  timeval_to_secs and
+         clock_t_to_secs
+       - changed print_timeval and print_time_in_hz to call timeval_to_secs
+         and clock_t_to_secs, respectively
+       - removed no-longer-used third argument for print_timeval and
+         print_time_in_hz -- `time' output is now done in execute_cmd.c
+
+general.h
+       - new extern declarations for timeval_to_secs and clock_t_to_secs
+
+builtins/times.def
+       - changed calls to print_timeval and print_time_in_hz, removing the
+         no-longer-used third argument
+
+execute_cmd.c
+       - changed the way time_command prints its output:  it now interprets
+         a format string, replacing several escape sequences prefixed with
+         a `%' with the real, user, and system times.  There are options in
+         the format string to ask for the `long' format that `times' uses
+         as well as to specify the number of places after the decimal point,
+         and whether to output fractional seconds at all
+       - time_command now uses the value of the `TIMEFORMAT' variable, if
+         present, to format the timing output.  This is flexible enough to
+         encompass the bash default, posix `time -p', BSD, and SV time
+         formats
+
+                                  7/25
+                                  ----
+Makefile.in
+       - `make clean' should delete the files listed in $(CREATED_SUPPORT);
+         `make mostlyclean' should not
+
+doc/{bash.{1,html},bashref.texi}
+       - fixed an error in the description of the effect that setting and
+         unsetting GLOBIGNORE has on the setting of the `dotglob' option
+
+doc/bashref.texi
+       - updated the section listing the major differences between bash
+         and the SVR4.2 shell
+
+lib/readline/readline.c
+       - removed the setting of _rl_suppress_redisplay, since it doesn't
+         really do anything yet
+
+oslib.c
+       - new function get_clk_tck (void), returns the value of _SC_CLK_TCK
+         if sysconf(3) is available, otherwise returns the value of
+         CLOCKS_PER_SEC (default 60)
+
+general.c
+       - moved CLOCKS_PER_SEC defines to oslib.c
+       - changed clock_t_to_secs to call get_clk_tck once to get the
+         right value to use
+
+externs.h
+       - extern declaration for get_clk_tck
+
+execute_cmd.c
+       - changed print_formatted_time so that a `%' at the end of the string
+         is output literally
+       - changed print_formatted_time to output a newline after the
+         translated format string, so it does not need to be included in
+         the format
+       - changed BASH_TIMEFORMAT (the default time format) to have a leading
+         newline to match ksh93
+
+configure.in
+       - use `shlicc2' on BSD/OS machines
+
+                                  7/26
+                                  ----
+doc/bash.html
+       - major overhaul, cleaned up text, corrected some minor HTML errors
+
+variables.c
+       - call sv_optind and sv_opterr to initialize the getopts stuff in
+         initialize_shell_variables
+
+                                  7/29
+                                  ----
+shell.c
+       - don't let maybe_execute_file try to read files that are not
+         `regular files'
+
+                                  7/30
+                                  ----
+parse.y
+       - cast `string' in yy_string_get() to unsigned char * to avoid
+         sign extension bugs.  For example, bash -c $'ls\377who'
+
+
+builtins/reserved.def
+       - add help text for the `time' reserved word
+       - deleted description of `HISTCONTROL'
+       - added descriptions for HISTIGNORE, PWD, HOSTNAME, GLOBIGNORE,
+         MACHTYPE
+
+                                  7/31
+                                  ----
+builtins/common.c
+       - parse_and_execute saves and restores the line number around
+         calls, and resets it to 0 when pushing the string onto the
+         input stack
+
+parse.y
+       - added code that parses `` within a double-quoted string as a
+         single word
+
+                                   8/6
+                                   ---
+configure.in, config.h.in
+       - look for `textdomain' as well as `gettext' for internationalization
+
+locale.c
+       - when LC_MESSAGES is set, call textdomain as well as setlocale
+       - new variable `default_domain', used to track the value of
+         $TEXTDOMAIN
+
+subst.c        
+       - call sv_locale when TEXTDOMAIN changes
+
+                                   8/7
+                                   ---
+error.c
+       - new function, sys_error(), which prints a formatted string followed
+         by a colon and strerror(errno) to stderr
+
+error.h
+       - extern declaration for sys_error
+
+jobs.c, nojobs.c, input.c, execute_cmd.c, subst.c
+       - changes to use sys_error()
+
+[many files]
+       - changes to many of the literal strings in the code for consistency
+         and easier potential translation
+
+                                   8/8
+                                   ---
+parse.y
+       - new function debug_parser(int) to toggle the value of yydebug
+         if YYDEBUG != 0
+
+                                   8/9
+                                   ---
+oslib.c
+       - don't use CLOCKS_PER_SEC, just try to get CLK_TCK (60 by default)
+
+bashline.c
+       - set saved_history_line_to_use to -1 when it's not going to be used
+         rather than 0.  A value of 0 can be confused with the first
+         history line
+
+builtins/evalstring.c
+       - moved parse_and_execute and auxiliary functions here from
+         builtins/common.c
+
+builtins/evalfile.c
+       - moved maybe_execute_file here from shell.c
+
+Makefile.in, builtins/Makefile.in
+       - changes necessitated by the new files
+
+                                  8/12
+                                  ----
+builtins/common.c
+       - fixed an off-by-one bug in single_quote that could make bash
+         run off the end of a string if it consisted entirely of single
+         quotes
+
+                                  8/13
+                                  ----
+shell.c
+       - moved code from main() to a new function: open_shell_script
+       - don't try to fclose(default_input) if BUFFERED_INPUT is defined
+       - moved argument binding code out of two places in main() and
+         open_shell_script() to a new function: bind_args().  This takes
+         an additional argument telling whether to bind starting at $0
+         or $1
+       - moved the code that calls the with_input_from_* functions into
+         a new function: set_bash_input
+       - moved the normal shell command-line option parsing code out of
+         main() into a new function: parse_shell_options
+       - moved the long option parsing code out of main() into a new
+         function: parse_long_options()
+
+general.c
+       - new function: move_to_high_fd(fd), which tries to move FD to a
+         file descriptor close to the allowed maximum, returning the new
+         fd and closing the old one (or returning the old one if something
+         goes wrong)
+
+general.h
+       - new extern declaration for move_to_high_fd
+
+variables.c
+       - moved indirection_level_string() here from shell.c
+
+jobs.c
+       - change initialize_jobs to use move_to_high_fd() instead of the
+         inline code to do the same thing
+
+                                  8/14
+                                  ----
+lib/readline/readline.c
+       - add `en_US.ISO8859-1' to the list of legal LANG values that turns
+         on readline's 8-bit mode
+
+                                  8/15
+                                  ----
+builtins/evalfile.c
+       - combined source_file and maybe_execute_file into a new function
+         _evalfile(fname, flags), where the flags select the appropriate
+         behavior
+
+eval.c
+       - moved the functions that perform the read-eval loop here from
+         shell.c
+
+execute_cmd.c
+       - changed CPU calculation for printing timing statistics using
+         ideas and code from Deven Corzine (deven@ties.org)
+
+eval.c, builtins/evalstring.c
+       - make sure we dispose of global_command if set -n is on and the
+         shell is not interactive
+
+                                  8/16
+                                  ----
+variables.c
+       - make a new array variable, BASH_VERSINFO, with version information:
+
+               BASH_VERSINFO[0] = release      (2)
+               BASH_VERSINFO[1] = version      (00)
+               BASH_VERSINFO[2] = patch level  (0)
+               BASH_VERSINFO[3] = build version (1058)
+               BASH_VERSINFO[4] = release status (beta1)
+               BASH_VERSINFO[5] = $MACHTYPE    (sparc-sun-sunos4.1.4)
+
+doc/{bash.{1,html},bashref.texi}
+       - Documented BASH_VERSINFO
+
+configure.in, config.h.in
+       - look for bindtextdomain(), set HAVE_BINDTEXTDOMAIN if found
+
+subst.c
+       - call sv_locale if TEXTDOMAINDIR is set or changes
+
+locale.c
+       - handle TEXTDOMAINDIR in set_locale_var; call bindtextdomain if
+         it is present
+
+tests/array.tests
+       - added calls to egrep to filter out BASH_VERSINFO and PIPESTATUS,
+         which can vary from system to system
+
+                                  8/19
+                                  ----
+shell.c
+       - moved line_buffer_stream from here to oslib.c, made it into a
+         replacement for setlinebuf() if that is not available
+
+externs.h
+       - extern declaration for setlinebuf()
+
+lib/readline/input.c
+       - in rl_gather_tyi, punt if chars_avail < 0 after checking input fd
+
+                                  8/20
+                                  ----
+builtins/suspend.def
+       - send SIGSTOP instead of SIGTSTP
+
+                                  8/21
+                                  ----
+builtins/colon.def
+       - added true and false as builtins (undocumented)
+
+CWRU/POSIX.NOTES, doc/bashref.texi
+       - note that process substitution is not available in posix mode
+
+bashintl.h
+       - new header file for internationalization, included by locale.c
+
+                                  8/22
+                                  ----
+subst.c
+       - in command_substitute, set istring to NULL before trying to
+         make the pipe, so if that fails, the code at error_exit:
+         doesn't try to free it
+
+execute_cmd.c
+       - when executing a shell script without a leading `#!' internally,
+         and the shell is not interactive, close the fd to the script
+         we're reading.  If this is called by the exec builtin, the shell
+         will not have forked, and the fd will not have been closed, even
+         though it's marked close-on-exec
+       - if subshell_argv is non-null, free its members (except 0) and
+         subshell_argv in shell_execve before reassigning it
+       - dispose of currently_executing_command before jumping back to
+         subshell_top_level
+
+builtins/hash.def
+       - use a sentinel variable so we only initialize the hash table
+         once in initialize_filename_hashing
+
+shell.c
+       - don't flush the filename hash table in shell_reinitialize
+       - free dollar_vars[0] in set_shell_name before assigning it
+       - don't fetch the current hostname more than once
+       - don't fetch the current user information more than once unless
+         the uid changes
+
+parse.y
+       - initialize_bash_input should free bash_input.name if it is
+         non-null before zeroing it
+
+                                  8/23
+                                  ----
+aclocal.m4
+       - changed BASH_CHECK_SOCKLIB:  if -lsocket is present, check for
+         and cache the existence of -lnsl.  Define LIBS appropriately
+         based on the values of the cache variables rather than relying
+         on the autoconf tests to do it
+
+                                  8/26
+                                  ----
+parse.y
+       - fix up yy_readline_get and yy_stream_get to fix the sign
+         extension problem
+
+shell.c
+       - move the setjmp(top_level) that catches early SIGINTs to the
+         first statement in main()
+
+Makefile.in
+       - added a `strip' target to strip the binary
+
+[bash-2.0-beta1 frozen]
+
+                                  8/27
+                                  ----
+parse.y
+       - replaced several static state variables with a single flags word:
+         parser_state
+
+                                  8/28
+                                  ----
+parse.y
+       - in read_token_word, combined the ${...} case with the other
+         expansion cases -- the code was identical
+       - added code to handle ksh-style ((...)) -- equivalent to
+         `let "..."'.  In fact, the above construct is translated internally
+         into `let "..."', so error messages output by the evaluator
+         will contain `let'
+
+expr.c
+       - changed evalerror to call internal_error so the name of the
+         shell script is prefixed to the message, if necessary
+
+Makefile.in
+       - changed RELSTATUS to `beta2'
+
+tests/{arith,new-exp}.{tests,right}
+       - changed the expected error message because of the change in format
+         of the arithmetic evaluation error messages in expr.c
+
+builtins/pushd.def
+       - changed pushd_builtin so `pushd -' is equivalent to `pushd $OLDPWD'
+
+externs.h
+       - changed the extern declaration for setlinebuf() to avoid having
+         to include stdio.h before externs.h everywhere
+
+                                  8/29
+                                  ----
+error.c
+       - new function, parser_error, for use by parts of the parser that
+         don't want to call report_syntax_error
+
+error.h
+       - extern declaration for parser_error
+
+parse.y
+       - changed some parts of the parser to use parser_error
+       - made the ((...)) code #ifdef'd on DPAREN_ARITHMETIC
+
+shell.c
+       - added a line to the --help output saying to use `bashbug' to
+         report bugs
+
+configure.in
+       - added new option: --enable-dparen-arithmetic; it controls
+         the DPAREN_ARITHMETIC define in config.h
+       - changed $host_os check for SCO to only enable -DWAITPID_BROKEN
+         for sco3.2v5; all other SCO versions enable -DMUST_UNBLOCK_CHILD
+
+config.h.in
+       - added line for DPAREN_ARITHMETIC, modified by configure
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new ((...)) command and new configuration option
+
+execute_cmd.c
+       - shell_execve should not try to close default_buffered_input unless
+         it is >= 0.  Other code that closes it and deallocates the buffer
+         should set default_buffered_input to -1
+
+                                  8/30
+                                  ----
+configure.in
+       - more changes to LOCAL_CFLAGS for sco machines
+
+error.c
+       - changed parser_error to handle all cases of the shell being
+         interactive, not interactive, reading from a script, and reading
+         from some other file
+
+parse.y
+       - changed report_syntax_error to call parser_error for consistent
+         messages
+
+dispose_cmd.c
+       - change dispose_command to use programming_error instead of
+         report_error
+
+execute_cmd.c, input.c, general.c
+       - changed calls to report_error to internal_error, since we don't
+         want to possibly exit in any of those cases
+
+                                   9/3
+                                   ---
+input.c
+       - changed the `localbuf' type to `unsigned char'
+
+parse.y
+       - changed yy_stream_get to use feof to test for end of file when
+         not using getc_with_restart
+
+                                   9/6
+                                   ---
+config.h.top
+       - added a commented-out define for SYS_BASH_LOGOUT, which is a
+         system-wide .bash_logout file, run when a login shell exits
+       - added /sbin to STANDARD_UTILS_PATH
+
+builtins/exit.def
+       - added support for SYS_BASH_LOGOUT
+
+                                  9/10
+                                  ----
+lib/readline/{{chardefs,histlib}.h,{bind,histexpand,readline,util,vi_mode}.c}
+       - changed to_upper to _rl_to_upper and to_lower to _rl_to_lower
+       - changed digit_value to _rl_digit_value
+       - changed digit_p to _rl_digit_p
+       - changed uppercase_p and lowercase_p to _rl_uppercase_p and
+         _rl_lowercase_p respectively
+       - changed pure_alphabetic to _rl_pure_alphabetic
+
+support/zecho.c
+       - new file, implements a bare-bones echo (no -n, no \-escapes),
+         to be used by tests
+
+tests/rhs-exp.tests
+       - changed calls to echo to use recho to avoid errors when bash is
+         configured with --enable-usg-echo-default
+
+tests/more-exp.tests
+       - changed some calls to echo to use zecho to avoid errors when bash
+         is configured with --enable-usg-echo-default
+
+                                  9/11
+                                  ----
+lib/readline/histexpand.c
+       - fixed a possible off-by-one error in history_expand_internal when
+         deciding whether or not to reallocate `result'
+
+expr.c
+       - fixed expcond() so that an assignment may be supplied as the
+         token after the `?'
+       - illegal bases now cause an evaluation error
+       - multiple base specifications now cause an evaluation error
+
+tests/arith.tests
+       - added more tests for conditional operator and associativity
+
+tests/{run-heredoc,heredoc.{tests,right}}
+       - new set of tests for here-documents
+
+builtins/common.c
+       - print out the name returned by get_name_for_error in
+         builtin_error()
+
+subst.c
+       - set this_command_name to NULL before processing command-line
+         assignment statements so arithmetic evaluation errors don't
+         print garbage
+       - according to POSIX.2, echo ${foo?$x} should print the expanded
+         value of $x, even when it doesn't expand into anything
+
+                                  9/12
+                                  ----
+shell.c
+       - changed the execution of startup files so that $ENV is never
+         run by a non-interactive shell and an interactive shell begun
+         as `sh' reads and executes $ENV, as posix specifies
+
+doc/{bash.{1,html},bashref.texi}
+       - updated description of startup file behavior
+
+doc/Makefile.in
+       - make sure references to bashref.texi are preceded by $(srcdir)/
+         so we can build the documentation in another directory just by
+         typing `make'; e.g. after giving configure the --srcdir option
+
+subst.c
+       - change to array_remove_pattern to avoid evaluating the `param'
+         part of the ${param#word} spec twice when doing things like
+         echo ${A[x=(i+=1)]#${A[y=(i+=2)]}}
+
+                                  9/13
+                                  ----
+builtins/bashgetopt.c
+       - fixed a problem with `;' option specifier (optional argument)
+
+support/config.{sub,guess}
+       - added cases to recognize CRAY C90 and T90
+
+builtins/ulimit.def
+       - rewritten almost from scratch to use internal_getopt and to not
+         mask the return value from getrlimit/setrlimit, and to make it
+         easier to maintain
+       - added `-l' option for systems with RLIMIT_MEMLOCK (4.4 BSD)
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new `-l' option to `ulimit'
+
+                                  9/24
+                                  ----
+parse.y
+       - added `in' to the list of tokens that should not be followed by
+         a semicolon when combining history lines
+       - removed the special-case code in history_delimiting_chars that
+         tried to be smart about `()'
+
+                                  9/25
+                                  ----
+print_cmd.c
+       - fixes to print_group_command from Andreas Schwab
+       - rewrote indent() to use a single malloced string for the spaces
+         to print, rather than calling cprintf multiple times
+
+shell.c
+       - make sure to set the strings in current_user to NULL after freeing
+         their contents in uidget().
+
+parse.y
+       - make sure decode_prompt_string quotes the values inserted by the
+         \w and \W escape sequences using backslashes if the string will be
+         expanded later because promptvars is set
+
+support/mkdirs
+       - removed leading `^' from regular expressions to be matched by
+         `expr' on the advice of meyering@appaloosa.asic.sc.ti.com
+
+                                  9/26
+                                  ----
+parse.y
+       - added a few more possible flag values for parser_state
+       - changed history_delimiting_chars to not add a semicolon after a
+         right paren if we're parsing a case statement
+
+                                  9/27
+                                  ----
+builtins/ulimit.def
+       - a few minor cleanups
+
+                                  10/1
+                                  ----
+builtins/trap.def
+       - make sure first_arg is non-empty before calling signal_object_p()
+
+[bash-2.0-beta2 frozen]
+
+                                  10/2
+                                  ----
+bashintl.h
+       - if we have setlocale(), but don't have a definition for LC_ALL,
+         undefine HAVE_SETLOCALE
+
+configure.in
+       - set LOCAL_LDFLAGS on AIX 4.2 to allow dynamic loading of builtins
+
+builtins/enable.def
+       - use correct flags for AIX 4.2 in dlopen call if _AIX is defined
+
+examples/loadables/Makefile
+       - add sample commands for AIX 4.2
+
+                                  10/3
+                                  ----
+variables.c
+       - new functions: merge_temporary_env(), merge_builtin_env(), to
+         take temporary_env and builtin_env, respectively, and create
+         shell variables from them
+
+variables.h
+       - new extern declarations for merge_temporary_env() and
+         merge_builtin_env()
+
+execute_cmd.c
+       - if variable assignments preceds a posix special builtin, and the
+         shell is in posix mode, those assignments should persist in the
+         shell environment after the builtin completes
+
+doc/bashref.texi
+       - modified description of what's changed by posix mode to include
+         the persistance of assignment statements preceding special builtins
+
+doc/mkposix
+       - new script to create CWRU/POSIX.NOTES directly from the `Bash
+         POSIX Mode' node of bashref.texi, like INSTALL is created
+
+                                  10/4
+                                  ----
+lib/{malloc,glob,readline}/Makefile.in, builtins/Makefile.in
+       - don't have autoconf substitute LOCAL_CFLAGS into the CFLAGS
+         assignment so people on SCO 3.2v[45] can still build with
+         NO_MEMSCRAMBLE even when they run `make CFLAGS=...'
+
+test.c
+       - renamed eaccess() to test_eaccess() to avoid conflict with SCO
+
+config.h.bot
+       - #undef HAVE_GETCWD if GETCWD_BROKEN is defined, so we use the
+         replacement in getcwd.c
+
+general.c
+       - fixed a small memory leak in full_pathname that occurs if
+         getcwd() returns NULL
+
+oslib.c
+       - new constant string variable: bash_getcwd_errstr, to use when
+         getcwd() returns NULL
+
+{general,jobs}.c, parse.y, builtins/{cd.def,common.c}
+       - change calls to getwd() to use getcwd() instead
+
+general.c, builtins/common.c, builtins/cd.def
+       - changed error behavior when getcwd() returns NULL to use
+         bash_getcwd_errstr, sys_error(), and strerror(errno) where
+         appropriate
+
+sig.c
+       - change a couple of calls to signal to set_signal_handler
+
+aclocal.m4
+       - added definitions of _popen and _pclose to the BASH_FUNC_GETCWD
+         macro
+
+configure.in
+       - added -DPATH_MAX=1024 to LOCAL_CFLAGS for sco3.2v[45] on the
+         advice of <grog@lemis.de>
+       - removed check for getwd(3)
+
+externs.h
+       - removed extern declaration for getwd(), added extern declaration
+         for getcwd() if HAVE_GETCWD is not defined
+
+oslib.c
+       - removed definition of getwd(); it is no longer used
+
+lib/readline/rltty.c
+       - changed SETATTR macro for SCO POSIX systems to call tcsetattr
+         with TCSANOW, on advice of <wbader@nacs.fast.net>
+
+                                  10/7
+                                  ----
+support/mkdirs
+       - slight change to work around a bug in the HP-UX `expr'
+
+                                  10/8
+                                  ----
+lib/readline/vi_mode.c
+       - changes so that the text inserted with an `i' command is available
+         to be reinserted with `.'
+
+examples/functions/autoload.v2
+       - new implementation: uses arrays, keeps a list of autoloaded
+         functions, allows autoloaded functions to be removed, allows
+         autoloaded functions to be listed
+
+execute_cmd.c
+       - when freeing the members of subshell_argv in shell_execve(), free
+         only the members up to subshell_argc
+
+                                  10/9
+                                  ----
+configure.in
+       - replaced calls to AC_HAVE_FUNCS with AC_CHECK_FUNCS
+       - replaced calls to AC_FUNC_CHECK with AC_CHECK_FUNC
+       - replaced calls to AC_HAVE_HEADERS with AC_CHECK_HEADERS
+       - added additional code to check for libintl.{a,so} for the
+         internationalization functions if bindtextdomain is not found
+         in libc
+       - define HAVE_WAIT3 if AC_FUNC_CHECK(wait3,...) succeeds, rather
+         than HAVE_FUNC_WAIT3, which is not used in the source
+       - added a call to AC_FUNC_STRCOLL to check for the presence of a
+         working strcoll(3)
+
+config.h.in
+       - removed HAVE_FUNC_WAIT3
+       - added HAVE_STRCOLL
+
+variables.c, stringlib.c
+       - move sort_char_array from variables.c to stringlib.c
+
+variables.h, externs.h
+       - move extern declaration of sort_char_array from variables.h to
+         externs.h
+
+variables.c
+       - don't sort the exported environment, even when we're not in
+         posix mode
+
+stringlib.c
+       - changed qsort_string_compare to use strcoll(3) if it is available
+         (HAVE_STRCOLL is defined).  This means that the results of glob
+         expansions are now sorted in the per-locale collation order
+
+locale.c
+       - track the value of $LC_COLLATE and call setlocale(LC_COLLATE,...)
+         when it changes.  Also, set its default value
+
+subst.c
+       - LC_COLLATE is now a special variable; call sv_locale when it is
+         assigned to or unset
+
+lib/readline/util.c
+       - move compare_strings here from complete.c; renamed it
+         _rl_qsort_string_compare; made it use strcoll(3) if it's
+         available; made it global so other library files can use it
+
+lib/readline/complete.c
+       - use _rl_qsort_string_compare instead of static compare_strings.
+         This means that completions are now sorted in a locale-specific
+         collation order
+
+lib/readline/funmap.c
+       - removed static declaration of qsort_string_compare; qsort now
+         uses _rl_qsort_string_compare instead
+
+oslib.c
+       - rewrote stricmp, strnicmp; renamed them strcasecmp and
+         strncasecmp, since they're only compiled in if HAVE_STRCASECMP
+         is not defined
+
+externs.h
+       - removed extern declarations of strnicmp, stricmp, replacing them
+         with declarations of strcasecmp and strncasecmp if HAVE_STRCASECMP
+         is not defined; removed #defines of stricmp and strnicmp to
+         strcasecmp and strncasecmp
+
+trap.c
+       - changed calls to stricmp to direct calls to strcasecmp
+
+Makefile.in
+       - bumped RELSTATUS to `beta3'
+
+doc/bash.{1,html}
+       - added mention of LC_COLLATE
+
+doc/bashref.texi
+       - removed item about sorting environment from the section on posix
+         mode
+
+                                  10/16
+                                  -----
+subst.c
+       - fixed array_length_reference to return 0 for an unbound variable
+         and 1 for a variable that is not an array
+
+examples/scripts.v2/cdhist.bash
+       - package with functions to replace cd and maintain a cd directory
+         stack
+
+examples/scripts.v2/pmtop
+       - a `poor man's top' for SunOS 4.x and BSD
+
+examples/scripts.v2/bashrand
+       - a script to return a random number within a specified range, with
+         an optional seed
+
+examples/scripts/zprintf
+       - printf(1) replacement that uses gawk to do the output
+
+doc/{bash.{1,html},bashref.texi}, lib/readline/doc/hsuser.texinfo
+       - several small corrections
+
+                                  10/17
+                                  -----
+variables.c
+       - changed the calls to list_string_with_quotes and then
+         expand_words_no_vars in assign_array_var_from_string to a single
+         call to expand_string.  This behaves more rationally, and closer
+         to ksh93
+
+subst.c
+       - commented out list_string_with_quotes -- it is no longer used
+
+lib/readline/terminal.c
+       - new function, _rl_set_screen_size(int rows, int cols), to set
+         readline's idea of the screen size
+
+jobs.c, nojobs.c
+       - make sure that window size changes are propagated back down to
+         the readline code, by calling _rl_set_screen_size with the
+         new sizes.  This happens when bash gets a SIGWINCH or if
+         `checkwinsize' is set with `shopt'
+
+                                  10/18
+                                  -----
+support/config.guess
+       - added code to recognize the various NetBSD ports
+
+lib/readline/signals.c
+       - don't install a handler for SIGALRM if the containing application
+         has installed a handler with SA_RESTART as part of the flags.
+         This is in effect, obviously, only for systems with POSIX signals.
+
+subst.c
+       - make parameter_brace_expand_length expand variables in a double-
+         quoted environment so it takes spaces in the variable value into
+         account
+
+                                  10/21
+                                  -----
+command.h
+       - flags for possible values of subshell_environment telling what
+         caused the subshell
+
+builtins/command.def
+       - the `command' builtin should not be setting CMD_NO_FORK at all;
+         it doesn't know enough about the execution context to do so
+
+execute_cmd.c, subst.c
+       - set subshell_environment to one of the values in command.h rather
+         than to `1', so we know what kind of subshell it is (just for
+         informational purposes; nothing actually uses this yet)
+
+
+                                  10/22
+                                  -----
+execute_cmd.c
+       - just return EXECUTION_SUCCESS immediately in execute_command_internal
+         if read_but_dont_execute is set
+
+                                  10/23
+                                  -----
+general.c
+       - fixed check_dev_tty to return immediately if ttyname() returns NULL
+
+builtins/suspend.def
+       - SIGSTOP cannot be caught, so there's no reason to try to do so
+
+examples/loadables/{finfo,pathchk,print}.c
+       - minor fixes
+
+pathexp.c
+       - fix to off-by-one error in setup_ignore_patterns
+
+jobs.c
+       - try to set the tty pgrp to our pgrp if we change our pgrp to our
+         pid and become a process group leader.  If it doesn't work,
+         reset our pgrp to what it was originally and disable job control
+
+aclocal.m4
+       - new test, BASH_STRUCT_TERMIO_LDISC, to test for a c_line member
+         of struct termio
+
+config.h.in
+       - add a new preprocessor variable, TERMIO_LDISC, undefined by default
+
+configure.in
+       - call BASH_STRUCT_TERMIO_LDISC after BASH_STRUCT_TERMIOS_LDISC
+
+                                  10/25
+                                  -----
+lib/readline/terminal.c
+       - increased the size of the termcap buffers to 4096
+
+                                  10/29
+                                  -----
+parse.y
+       - include memalloc.h for uses of alloca that the code in the
+         generated bison parser does not catch (e.g., HP-UX 10.10)
+
+aclocal.m4
+       - new test, BASH_KERNEL_RLIMIT_CHECK, to check whether a given
+         HP-UX machine needs _KERNEL defined for the RLIMIT_* defines in
+         <sys/resource.h> (9.05, 10.01 yes, 10.10,10.20 no)
+
+configure.in
+       - call BASH_KERNEL_RLIMIT_CHECK if $host_os begins with `hpux'
+
+config.h.in
+       - new #undef for RLIMIT_NEEDS_KERNEL
+
+builtins/ulimit.def
+       - only define _KERNEL before including <sys/resource.h> if HPUX
+         and RLIMIT_NEEDS_KERNEL are both defined
+
+[bash-2.0-beta3 frozen]
+
+                                  11/1
+                                  ----
+locale.c
+       - if setting LC_ALL to a null value (as is done when `unset LC_ALL'
+         is run), call setlocale() to set LC_ALL back to default_locale
+
+lib/readline/readline.c
+       - moved i18n code from here to nls.c
+
+lib/readline/Makefile.in, Makefile.in
+       - new readline library member, nls.c
+
+lib/readline/nls.c
+       - new file, with internationalization code from readline.c (such as
+         it is)
+       - updated legal_lang_values to just contain a list of codesets
+       - added code modified from a diff sent by Ulrich Drepper
+         <drepper@cygnus.com> to parse a locale specification and isolate
+         and normalize the codeset part, for checking against the values
+         in legal_lang_values
+
+                                  11/4
+                                  ----
+builtins/setattr.def, locale.c, aclocal.m4, oslib.c
+       - minor cleanups
+
+                                  11/5
+                                  ----
+lib/readline/complete.c, test.c, trap.c
+       - more minor cleanups
+
+                                  11/6
+                                  ----
+parse.y
+       - added a `flags' parameter to parse_matched_pair, currently unused
+
+                                  11/7
+                                  ----
+configure.in, config.h.in
+       - add a check for time_t, defaulting to `long' if it's not
+         defined in <sys/types.h>
+
+builtins/fc.def
+       - use `time_t *' instead of `long *' in call to time()
+
+                                  11/8
+                                  ----
+configure.in
+       - removed check for getpwent in libsun.a; it's not necessary for
+         recent versions of irix (irix[56].?)
+
+                                  11/11
+                                  -----
+test.c
+       - used `&&' where `||' was needed when testing if HAVE_LSTAT and
+         S_IFLNK are both defined
+
+[bash-2.0-beta3 net release version frozen]
+
+                                  11/12
+                                  -----
+builtins/getopt.c
+       - when sh_getopt detects that a required argument is not present,
+         set sh_optarg to "" so that getopts does the right thing
+
+                                  11/15
+                                  -----
+builtins/ulimit.c
+       - made the default (without -H or -S) report the soft limit and set
+         both soft and hard limits (like sh and ksh)
+
+expr.c
+       - changed the maximum base in base#num constants to 64, implemented
+         just like ksh93
+
+doc/{bash.{1,html},bashref.texi}
+       - updated description of ulimit builtin to new behavior when
+         neither -H nor -S is supplied
+       - updated arithmetic evaluation section with new maximum base and
+         explanation of how numbers between 10 and 63 are represented
+
+lib/readline/vi_mode.c
+       - in rl_vi_done_inserting, don't try to save the text entered while
+         in insert mode unless rl_undo_list is non-null (indicating that
+         there was actually some text to be saved)
+
+                                  11/19
+                                  -----
+lib/readline/tcap.h
+       - new file, for termcap library definitions.  Uses <termcap.h> if
+         it is available
+
+lib/readline/rldefs.h
+       - remove inclusion of termcap.h; now included in tcap.h
+
+lib/readline/{terminal,display,readline}.c
+       - include tcap.h
+
+lib/readline/Makefile.in
+       - update dependencies to include tcap.h
+
+                                  11/21
+                                  -----
+lib/readline/complete.c
+       - broke the code that computes the lcd of the list of completion
+         matches out into a separate function, compute_lcd_of_matches()
+
+lib/readline/complete.c
+       - call compute_lcd_of_matches after calling the application-specific
+         completion ignore function, since it may have eliminated some
+         names from the match list
+
+builtins/cd.def
+       - replaced instances of MAXNAMLEN in the spelling correction code
+         with PATH_MAX
+
+lib/readline/terminal.c
+       - new termcap capabilities: kh (sent by Home key) and kH (sent by
+         End key) automatically bound to beginning-of-line and end-of-line
+         respectively in emacs_standard and vi_movement maps
+
+mailcheck.c
+       - fix to remember_mail_dates so any message following the
+         filename is saved correctly
+
+                                  11/22
+                                  -----
+lib/readline/bind.c
+       - fixed extern declaration of _rl_parsing_coditionalized_out
+         to match declaration in readline.c
+
+                                  11/25
+                                  -----
+doc/{bash.{1,html},bashref.texi}
+       - fixed a gross documentation error in the description of
+         ${parameter:offset:length} (offset and length were transposed)
+       - slight changes to the description of output redirection
+
+subst.c
+       - new function, quoted_substring, to return substrings of variables
+         when the expression is within double quotes and the value has
+         CTLESC characters embedded within it.  Called by
+         parameter_brace_substring
+       - get_var_and_type should return VT_POSPARMS if `*' is passed as
+         the variable name
+       - added a new first parameter for pos_params -- the variable name
+       - changed pos_params to obey the rules for "$*" wrt using the
+         first character of IFS as the separator in the result
+       - if an unquoted $* or $@ is expanded, call quote_escapes on the
+         result to protect any special characters from inadvertently
+         causing quoting
+
+                                  12/3
+                                  ----
+builtins/ulimit.def
+       - corrected a misspelling of `unlimited'
+       - added support for linux RLIMIT_AS resource limit for -v option
+         and changed the block multiplier to 1024 if we have RLIMIT_VMEM
+         or RLIMIT_AS
+
+                                  12/5
+                                  ----
+lib/readline/readline.c
+       - fix rl_insert to handle a count of exactly 1024
+
+shell.c
+       - new function: unbind_args(), which removes all the positional
+         parameters.  Just calls remember_args(NULL, 1)
+
+execute_cmd.c
+       - call unbind_args when executing a subshell, after setting up
+         subshell_argX
+
+bashintl.h
+       - include <libintl.h> if HAVE_LIBINTL_H defined
+
+config.h.in
+       - add HAVE_LIBINTL_H define
+
+configure.in
+       - add call to AC_CHECK_HEADERS for libintl.h
+
+doc/Makefile.in
+       - added infodir and various mandir defines for completeness
+
+Makefile.in
+       - changed some of the *dir defines to use the autoconf values
+         (e.g., bindir = @bindir@)
+       - changed manroot to mandir, removed old mandir and manext variables
+       - added `manpfx' variable; should be either `man' or `cat'
+
+                                  12/6
+                                  ----
+lib/readline/readline.c
+       - fixed rl_digit_loop so it once again displays the argument count
+         as it's being entered (added calls to _rl_save_prompt and
+         _rl_restore_prompt)
+
+                                  12/7
+                                  ----
+support/config.guess
+       - recognize netbsd/vax
+       - recognize openbsd on all supported platforms
+       - recognize tenon's machten running on powerpc and macintosh
+
+                                  12/9
+                                  ----
+support/config.guess
+       - added all sorts of systems from config.guess distributed with
+         autoconf-2.12
+
+                                  12/10
+                                  -----
+subst.c
+       - new function quoted_strchr(); does the same thing as strchr but
+         honors shell backslash and CTLESC quoting conventions
+       - parameter_brace_patsub now calls quoted_strchr
+
+                                  12/11
+                                  -----
+shell.c
+       - if the shell is named `-su', run the normal login shell startup
+         files, even if the shell is not interactive.  This handles the
+         case of `su - username -c command' compatibly
+
+lib/readline/readline.c
+       - minor change to rl_digit_loop so that M-- and M--1 are equivalent,
+         as the prompt for digit arguments has always implied
+
+lib/malloc/malloc.c
+       - added definitions of calloc() and cfree(), compiled in unless
+         NO_CALLOC is defined to cpp
+
+
+                                  12/16
+                                  -----
+parse.y
+       - protect uses of history_expansion_inhibited with #ifdef
+         BANG_HISTORY
+
+[bash-2.0-release candidate frozen]
+
+builtins/common.c
+       - changed backslash_quote to quote a tilde if it's the first
+         character in the string
+
+                                  12/17
+                                  -----
+aclocal.m4
+       - changed BASH_CC_WORKS to provide a cross-compiling default for
+         better error messages
+
+configure.in
+       - generated configure using autoconf-2.12
+       - changed the default value of CFLAGS to `-g -O2'
+
+                                  12/18
+                                  -----
+aclocal.m4
+       - look for /var/spool/mail before /usr/spool/mail when checking
+         for the default mail directory
+
+jobs.c, builtins/shopt.def
+       - fixed a couple of `macro replacement within a string literal'
+         problems
+
+Makefile.in
+       - removed `realclean' target
+
+shell.c
+       - changed the first line ouput by bash --version to conform to
+         the latest GNU coding standards (replace space between version
+         and machtype with a hyphen)
+
+                                  12/19
+                                  -----
+execute_cmd.c
+       - when looking at the debug trap in execute_function and
+         execute_command_internal, make sure it's trapped and not
+         ignored before trying to save the value of the trap string
+
+                                  12/20
+                                  -----
+trap.c
+       - changed set_signal and ignore_signal to handle EXIT_TRAP and
+         DEBUG_TRAP specially, so we don't try to fetch signal handlers
+         or do other unnecessary things
+
+                                  12/22
+                                  -----
+builtins/ulimit.def
+       - if the current euid is not 0, and we're trying to set the hard
+         limit of a resource to RLIM_INFINITY, set it to the current hard
+         limit to avoid error messages
+
+builtins/read.def
+       - fix for bug that caused core dump if line read had leading white
+         space and IFS was set to ''
+
+[bash-2.0-release frozen]
+
diff --git a/CWRU/old-changelogs/CWRU.chlog.v12 b/CWRU/old-changelogs/CWRU.chlog.v12
new file mode 100644 (file)
index 0000000..dc687d4
--- /dev/null
@@ -0,0 +1,10049 @@
+                               12/23/1996
+                               ----------
+[bash-2.0 released]
+
+                                  12/27
+                                  -----
+configure.in
+       - don't automatically use GNU malloc on FreeBSD, the builtin one
+         is supposed to be better (but doesn't have the debugging hooks)
+
+builtins/exec.def
+       - check that full_pathname(command) doesn't return NULL because of
+         inaccessible parent directories
+
+support/config.sub
+       - recognize OpenBSD
+
+execute_cmd.c
+       - broke the code that opens a file for output redirection when in
+         noclobber mode out into a separate function: noclobber_open().
+         This tries to avoid race conditions and file replacement between
+         stat(2) and open(2)
+
+subst.c
+       - make sure pat_subst does not run off the end of its return
+         string when copying the unmatched portion of the input string
+
+                                  12/30
+                                  -----
+doc/Makefile.in
+       - don't install readline.3 by default
+
+lib/tilde/tilde.c
+       - removed an unnecessary check for string[i] being non-null in
+         tilde_find_suffix
+
+                                  12/31
+                                  -----
+support/config.{sub,guess}
+       - merged in changes from config.sub in autoconf-2.12 distribution
+
+lib/readline/readline.c
+       - in rl_newline, only call _rl_vi_done_inserting and _rl_vi_reset_last
+         if readline is currently in vi mode
+
+lib/readline/display.c
+       - corrected a misuse of inv_lbreaks where vis_lbreaks was wanted in
+         the code that decides whether the cursor is at the beginning of
+         an otherwise-empty line
+
+                                1/2/1997
+                                --------
+support/bashbug.sh
+       - fixed a typo, thanks to eggert@twinsun.com
+
+aclocal.m4
+       - new test, BASH_STRUCT_DIRENT_D_FILENO, testing for d_fileno member
+         of struct dirent
+
+configure.in
+       - call BASH_STRUCT_DIRENT_D_FILENO
+
+config.h.in
+       - new #define for STRUCT_DIRENT_HAS_D_FILENO
+
+lib/posixheaders/posixdir.h
+       - only define d_fileno as d_ino if STRUCT_DIRENT_HAS_D_INO is defined
+         and STRUCT_DIRENT_HAS_D_FILENO is not defined.  This fixed the
+         problem of compiling getcwd.c on SunOS4.1.4 with cc
+
+                                   1/3
+                                   ---
+lib/readline/complete.c
+       - fix a memory-used-after-freed bug reported by Andreas Schwab
+
+configure.in
+       - call BASH_CHECK_SOCKLIB only if getpeername is not found in libc
+         (ac_cv_func_getpeername = no)
+
+                                  1/13
+                                  ----
+
+builtins/getopt.h
+       - change #define guard to _SH_GETOPT_H to avoid similar guards in
+         /usr/include/getopt.h (Dec OSF/1 4.x, for example)
+
+variables.h
+       - fix assign_array_from_string so that it rejects attempts to assign
+         to readonly variables
+
+subst.c
+       - fix verify_substring_values to handle offsets that are past the
+         end or before the beginning (in the case of a negative offset)
+         of the expanded variable value
+
+                                  1/14
+                                  ----
+bashline.c
+       - fix a problem where any completion after a `cmd` command
+         substitution would inappropriately attempt command completion,
+         even if the previous command substitution was correctly closed
+
+builtins/evalstring.c
+       - unwind_protect remember_on_history even if the shell is not
+         interactive, since history can now be used in scripts, and
+         `source' will turn off interactive_shell before calling
+         parse_and_execute
+
+jobs.c
+       - new function get_job_by_pid(pid, block) to translate a pid to
+         a job number.  The block argument says whether or not to block
+         SIGCHLD
+
+jobs.h
+       - new extern declaration for get_job_by_pid
+
+builtins/jobs.def
+       - call get_job_by_pid if an argument appears to be a pid rather
+         than a jobspec
+
+configure.in
+       - configure --without-gnu-malloc automatically on MachTen 4.x
+
+builtins/cd.def
+       - change to mindist() so that a best guess of `.' returns 3,
+         which means not reasonable
+
+lib/posixheaders/memalloc.h
+       - changed hpux_9 to __hpux, since the new config stuff doesn't
+         define hpux_9
+
+subst.c
+       - fix parameter_brace_patsub to handle null patterns (doesn't
+         do anything)
+
+oslib.c
+       - slight change to bzero replacement
+
+support/bashbug.sh
+       - changed TEMP to be /tmp/bbug.$$ as a sop to systems with 14-char
+         file names
+
+doc/bashref.texi
+       - add note to POSIX Mode section that the output of `set' when
+         invoked without arguments is sorted when in POSIX mode
+
+                                  1/15
+                                  ----
+support/recho.c
+       - a couple of changes prompted by a `gcc -Wall'
+
+subst.c
+       - changed ASSIGN_RETURN macro to use the do...while(0) idiom to
+         avoid problems with its multiple statements
+
+builtins/setattr.def
+       - a bad identifier given to readonly or export without an assignment
+         statement (e.g. `readonly a[5]') is an error, but not an assignment
+         error (i.e., return EXECUTION_FAILURE rather than EX_BADASSIGN)
+
+tests/{{array,new-exp}.,tilde-}tests
+       - added `set +o posix' at the beginning to disable POSIX mode, which
+         causes some of the tests to fail.  Some systems (e.g. LINUX-FT),
+         set POSIXLY_CORRECT by default
+
+tests/test-tests
+       - added a warning if $UID is 0 to the effect that the test suite
+         should not be run as root
+       - worked around the `noread' and `nowrite' tests failing when run
+         as root
+
+test.c
+       - began removing the remains of the STANDALONE code, since test is
+         included in GNU shellutils
+
+                                  1/16
+                                  ----
+lib/readline/{readline,display}.c
+       - a couple of slight changes to build on Win95 using djgpp (reported
+         by x-aes@telelogic.se)
+
+Makefile.in
+       - changed TERMCAP_LIBDIR to TERM_LIBDIR, so building the termcap
+         library (if necessary) should work now
+
+bashline.c
+       - new function: quote_word_break_characters(), to backslash-quote 
+         characters in a filename that the readline completion code would
+         treat as word breaks
+       - change bash_quote_filename to call quote_word_break_characters if
+         the completion quoting style says to use backslashes
+       - add `:' to rl_filename_quote_characters, since it's part of
+         filename_word_break_characters
+
+lib/posixheaders/posixjmp.h
+       - new file, with half of bashjmp.h
+       - posixjmp.h and lib/readline/posixjmp.h are symlinks to this file
+
+bashjmp.h
+       - include "posixjmp.h" for possible redefinitions of setjmp/longjmp
+         and procenv_t
+
+                                  1/17
+                                  ----
+shell.c
+       - bad options now cause the standard shell usage message (a subset
+         of what `bash --help' prints) to be displayed on stderr
+
+trap.c
+       - don't free the trap command for a DEBUG trap in
+         restore_default_signal if SIG_INPROGRESS is set -- there's already
+         a pointer saved to the old value in _run_trap_internal.  This
+         makes bashdb run better, too
+
+examples/bashdb/bashdb.{pre,fns}
+       - a couple of minor fixes; it actually has a chance of working now
+
+                                  1/21
+                                  ----
+config.h.in
+       - add a define for <dlfcn.h>, HAVE_DLFCN_H
+
+configure.in
+       - look for <dlfcn.h>, define HAVE_DLFCN_H if found
+
+builtins/enable.def
+       - include <dlfcn.h> only if HAVE_DLFCN_H is defined
+
+lib/readline/display.c
+       - renamed clear_to_eol to _rl_clear_to_eol and made it global, so
+         other library files (readline.c) can use it
+       - new function _rl_clear_screen, to clear the screen with the right
+         termcap escape sequence
+
+lib/readline/readline.c
+       - call _rl_clear_to_eol and _rl_clear_screen instead of using tputs
+       - extern declarations for _rl_clear_to_eol and _rl_clear_screen
+
+                                  1/22
+                                  ----
+mailcheck.c
+       - fixed a problem in make_default_mailpath() where a slash was not
+         added between the default mail directory and the username
+
+                                  1/23
+                                  ----
+stringlib.c
+       - added a fourth parameter to ansicstr: the length of the returned
+         string
+
+externs.h
+       - changed declaration of ansicstr
+
+parse.y
+       - changed call to ansicstr -- saves a call to strlen
+
+builtins/echo.def
+       - changed call to ansicstr
+       - if do_v9 is non-zero, use putchar to output the string instead
+         of printf, since there may be embedded NULL characters
+
+doc/{bash.1,bashref.texi}, builtins/trap.def
+       - modified the `trap' documentation to make it clearer that trap
+         takes multiple signal specs as arguments
+
+jobs.c, nojobs.c, jobs.h
+       - renamed initialize_jobs to initialize_job_control, added an
+         argument (force)
+
+jobs.c
+       - set shell_tty to fileno(stderr) in initialize_job_control if
+         the shell is not interactive.  This fixes the problem of bad
+         tty pgrps when monitor mode is turned on in a non-interactive
+         shell
+
+sig.c
+       - made initialize_terminating_signals do only that; moved the rest
+         of the code that used to be there into a new function:
+         initialize_shell_signals, which calls initialize_terminating_signals
+         if the shell is interactive
+       - initialize_terminating_signals is now extern
+       - made reset_terminating_signals return immediately if
+         termsigs_intitialized is zero, meaning that
+         initialize_terminating_signals has not been called
+
+sig.h
+       - new extern declaration for initialize_terminating_signals
+
+trap.c
+       - call initialize_terminating_signals from set_signal if sig is
+         EXIT_TRAP and the shell is not interactive.  Since the terminating
+         signals do not need to be initialized until a trap on exit is
+         set, not doing that at startup should result in a speed increase
+         for scripts
+
+execute_cmd.c
+       - save and restore command->flags in time_command, so you can use
+         `time command' in a loop
+
+                                  1/24
+                                  ----
+lib/readline/display.c
+       - fix redisplay code to wrap correctly if the prompt is longer than
+         the screen width (reported by bos@Eng.Sun.COM)
+
+lib/readline/undo.c
+       - don't include <setjmp.h>, it's not needed
+
+lib/readline/{util,readline}.c
+       - include "posixjmp.h" instead of <setjmp.h>
+       - readline_top_level is now a `procenv_t' instead of a `jmp_buf'
+         (now readline uses the correct posix semantics for preserving
+         the signal mask and other things across longjmp)
+
+parse.y
+       - fixes to push_string/pop_string to make them more general -- they
+         now can be used generally, instead of having to be associated
+         with an alias being expanded
+       - fixes to the parser so that it parses (( ls abc; ls def); ls ghi)
+         as a nested subshell command for backwards compatibility.  Broke
+         the double-paren expression parsing off into a new function:
+         parse_arith_cmd, called from read_token when a `((' is seen.  If
+         it looks like an arithmetic command, return `let' and set things
+         up so that the expression is returned as a double-quoted string
+         by the next call to read_token.  If it's a nested subshell, push
+         the text we parsed onto the list of strings for later consumption
+         and return `('
+
+lib/glob/glob.c
+       - fix glob_vector so it doesn't short-circuit checking a filename if
+         it starts with a `.' and the pattern starts with `\.' (if
+         noglob_dot_filenames is set).  This makes `".junk2"*' match
+         `.junk2.txt' correctly
+
+                                  1/27
+                                  ----
+support/bashbug.sh
+       - ask for confirmation before sending the bug report
+
+builtins/fc.def
+       - when editing and re-executing a multiline command, make sure
+         current_command_line_count is initialized and then incremented
+         for each line read from the file so that the lines added to
+         the history list by fc_replhist and fc_addhist obey the `lithist'
+         and `cmdhist' shopt options.  Reported by tibbitts@pb.seflin.org
+
+                                  1/28
+                                  ----
+lib/readline/readline.h
+       - added a couple of extern declarations for variables described in
+         the documentation but heretofore undeclared
+
+builtins/ulimit.def
+       - try to catch some classes of integer overflows before calling
+         set_limit
+
+                                  1/29
+                                  ----
+parse.y
+       - push and pop a `(' delimiter while parsing a $(...) construct, so
+         the history code doesn't try to inappropriately add a `;' when
+         a newline appears in the `...'
+
+aclocal.m4
+       - new macro, BASH_STRUCT_WINSIZE, which looks for `struct winsize'
+         in <sys/ioctl.h> (or one of the files it includes)
+
+configure.in
+       - call BASH_STRUCT_WINSIZE
+       - slightly reorganized the calls to bash-specific macros
+
+config.h.in
+       - add an `#undef STRUCT_WINSIZE_IN_SYS_IOCTL'
+
+jobs.c, nojobs.c
+       - only look in sys/ptem.h for struct winsize if
+         STRUCT_WINSIZE_IN_SYS_IOCTL is not defined to cpp
+
+                                  1/30
+                                  ----
+.{distribution,patchlevel}
+       - renamed to _{distribution,patchlevel}
+
+configure.in
+       - create a variable BASHVERS, from the contents of _distribution,
+         and a variable BASHPATCH, from the contents of _patchlevel,
+         (using m4 magic so we don't have to distribute .distribution
+         and .patchlevel) and substitute them into Makefile.in
+
+Makefile.in
+       - use Version and PatchLevel variables instead of the contents of
+         .distribution and .patchlevel, respectively.  These are set by
+         configure
+       - removed `.machine' from targets and dependencies
+
+support/mkversion.sh
+       - new shell script to handle updating version.h, replaces mkversion.c
+         (which is now overkill)
+
+support/mkdist
+       - don't bother with writing .distribution and .patchlevel files,
+         since they're no longer distributed
+
+support/mknewvers.sh
+       - simple bash script to make new version files.  It can increment
+         the major or minor version numbers or patchlevel, or take a
+         completely new version number (e.g., 2.01) as an argument
+
+doc/Makefile.in
+       - added support for the `install-info' command to update the info
+         directory file after installing bash.info
+
+                                  1/31
+                                  ----
+builtins/help.def
+       - fix core dump with `help --'
+
+susbt.c
+       - make call_expand_word_internal obey the convention that if
+         expand_word_internal returns &expand_word_{fatal,error}, then
+         w->word has already been freed
+       - return &expand_word_fatal from expand_word_internal if the shell
+         is not interactive and `set -u' has been executed
+
+test.c, general.c
+       - moved group_member from test.c to general.c
+
+externs.h, general.h
+       - moved extern declaration of group_member from externs.h to general.h
+
+general.c
+       - broke the code that initializes the group array out into a new
+         function, initialize_group_array()
+       - initialize_group_array() now initializes an array even if the OS
+         does not have getgroups().  If it does not, an array with one
+         element (the real gid) is created
+       - call sysconf(_SC_NGROUPS_MAX) if sysconf is available and
+         _SC_NGROUPS_MAX is defined
+       - new function, char **get_group_list(int *), to return an array
+         of strings made from the groups list
+
+variables.c
+       - new dynamic array variable: GROUPS, expands to the group set as
+         obtained with getgroups() (or whatever initialize_group_array()
+         makes)
+
+doc/{bash.{1,html},bashref.texi}
+       - added description of GROUPS variable
+
+test/test-tests
+       - before modifying the setgid bit on /tmp/setgid, try to change its
+         group to ${GROUPS[0]} 
+
+                                   2/3
+                                   ---
+aclocal.m4
+       - new autconf macro, BASH_MISC_SPEED_T, to see if speed_t is defined
+         in <sys/types.h>
+
+configure.in
+       - call BASH_MISC_SPEED_T
+
+config.h.in
+       - add `#undef SPEED_T_IN_SYS_TYPES'
+
+lib/readline/tcap.h
+       - include `rltty.h' if HAVE_TERMCAP_H and __linux__ are defined, but
+         SPEED_T_IN_SYS_STYPES is not, before including <termcap.h>
+
+support/mksignames.c, siglist.c
+       - add support for 4.4 BSD SIGLOST
+
+support/config.guess
+       - add support for recognizing QNX based on `uname' output
+
+Makefile.in
+       - make sure recho and zecho are compiled with the same set of CC
+         options as the rest of the sources
+
+lib/readline/bind.c
+       - change calls to rl_generic_bind to cast the third argument to
+         (char *) where necessary
+
+command.h
+       - two new flags: CMD_AMPERSAND (currently unused), and CMD_STDIN_REDIR,
+         which means that this command should have its standard input
+         redirected from /dev/null if there are not any explicit redirections
+         to stdin
+
+execute_cmd.c
+       - a redirection of type r_inputa_direction is no longer added at the
+         beginning of the redirection chain for an async command;
+         CMD_STDIN_REDIR is set in the flags instead
+       - new function: stdin_redirects: returns the number of redirections to
+         stdin in a chain of redirections
+       - new functions: async_redirect_stdin() to open /dev/null and make it
+         file descriptor 0
+       - changes to make CMD_STDIN_REDIR propagate to all of the necessary
+         functions (like execute_simple_command)
+       - execute_disk command now takes the flags from simple_command rather
+         than just the CMD_NO_FORK flag as its last argument
+       - various places after make_child is executed (in the child) check for
+         CMD_STDIN_REDIRECT (and no stdin redirections or piping) and call
+         async_redirect_stdin
+       - stdin_redir is now global
+
+eval.c
+       - set stdin_redir to 0 just before calling execute_command so it
+         gets reset to a known value and doesn't persist across commands
+
+                                   2/4
+                                   ---
+builtins/ulimit.def
+       - add a stub function for ulimit(2) on systems without HAVE_RESOURCE
+         or HAVE_ULIMIT that just sets errno to EINVAL and returns -1 --
+         QNX is one such system
+
+bashhist.c
+       - pre_process_line needs to protect all occurrences of hist_verify
+         with #ifdef READLINE
+
+builtins/shopt.def
+       - hist_verify needs to be protected with #ifdef READLINE, not
+         #ifdef HISTORY
+
+                                   2/5
+                                   ---
+support/config.{guess,sub}, configure.in
+       - chages to better support the Harris Night Hawk
+
+[many files]
+       - changes for things pointed out by gcc -Wall
+
+lib/glob/Makefile.in
+       - make sure -DSHELL is included in CCFLAGS so that globbing is
+         interruptible
+
+lib/malloc/malloc.c
+       - extern declaration for botch: if botch is #defined, it should be
+         the name of a void function
+
+configure.in,Makefile.in,builtins/Makefile.in,
+lib/{glob,malloc,readline,tilde}/Makefile.in
+       - add a LOCAL_DEFS variable, substituted from configure into the
+         various Makefiles.  It's set to -DSHELL, so that define gets
+         passed to all sub-makes without doing anything special
+
+lib/readline/readline.c
+       - change to rl_digit_loop to make it compatible with GNU emacs:
+         if a key bound to `universal-argument' is read after reading
+         some digits, it terminates the argument but is otherwise
+         ignored.  This is how people can insert repeated digits
+
+doc/{bash.{1,html},readline.3}, lib/readline/doc/rluser.texinfo
+       - changed description of `universal-argument' to describe how
+         to terminate a numeric argument
+
+                                   2/6
+                                   ---
+jobs.c
+       - changed kill_pid to diddle the job and process data structures
+         if we're sending SIGCONT to a stopped job with `kill' so that
+         the shell knows the job is running again.  ksh93 does this
+
+                                   2/7
+                                   ---
+unwind_prot.c
+       - changed bcopy to FASTCOPY
+
+builtins/enable.def
+       - changed pointer arithmetic in delete_builtin to just subtract
+         the head of the builtins list (shell_builtins) from a pointer
+         to the builtin to be deleted (b) to find its index in the list
+         on ANSI C systems
+
+                                  2/10
+                                  ----
+lib/readline/bind.c
+       - when using old-style keynames to bind to a new-style macro,
+         pass an array of type (unsigned char *) to rl_macro_bind
+
+builtins/getopt.c
+       - change sh_getopt to return EOF if nextchar is empty or NULL
+         and sh_optind is greater than argc.  This can happen if a
+         script mixes calls to `getopts' with calls to `shift'
+
+                                  2/11
+                                  ----
+print_cmd.c
+       - fixed make_command_string_internal so that commands with the
+         CMD_TIME_POSIX flag set print `time -p' instead of `time'
+       - changed print_redirection_list so the here documents are
+         printed after all the other redirections, and followed by a
+         newline (rather than a possible semicolon)
+       - added a new variable, was_heredoc, to avoid adding a semicolon
+         at the beginning of an empty line after printing the heredoc
+         ending delimiter
+
+execute_cmd.c
+       - don't put the gnu_argv_flags into the environment any more; it's
+         proven to be a bad idea
+
+configure.in
+       - set LOCAL_CFLAGS to `-DSunOS5' on Solaris 5.5[.x]
+
+builtins/echo.def
+       - only call fflush() after printing each word on SunOS 5.5, since
+         that's the system with the bug that prompted its inclusion in
+         the first place
+
+support/mksignames.c
+       - added support for more system-specific signals from AIX 4.2,
+         changed initialization order so that system-specific signals
+         are done first, before the common signals
+
+                                  2/12
+                                  ----
+execute_cmd.c
+       - broke the code that creates a file containing the text of a
+         here document out into a separate function: here_doc_to_fd
+       - create the temp file used for a here document with mode 600
+       - open the temp file used for a here document with O_EXCL
+
+shell.h
+       - changed the uid members of struct user_info to be of type uid_t
+         and the gid members to be of type gid_t
+
+parse.y
+       - changed the type of the `type' argument to init_yy_io() to be
+         `enum stream_type', since that's what's always passed
+
+input.h
+       - changed the function prototype for init_yy_io so the third arg is
+         type `enum stream_type'
+
+externs.h
+       - added a prototype for getcwd, if HAVE_GETCWD is not defined
+
+builtins/umask.def
+       - changed all variables that are used as arguments to or save the
+         return value from umask(2) to be of type mode_t
+       - changed print_symbolic_umask to take an argument of type mode_t
+
+                                  2/13
+                                  ----
+jobs.c
+       - if old_sigint_handler is set to SIG_DFL, as it will be in a script
+         without a trap on SIGINT installed, call termination_unwind_protect()
+         directly from waitchld()
+
+                                  2/14
+                                  ----
+configure.in
+       - added a section before the call to BASH_CHECK_LIB_TERMCAP to
+         set a variable prefer_curses on some systems (AIX, for one)
+
+aclocal.m4
+       - in BASH_CHECK_LIB_TERMCAP, don't return -ltermcap if $prefer_curses
+         is non-empty
+
+lib/readline/Makefile.in
+       - redid the dependencies
+
+                                  2/17
+                                  ----
+hashlib.c, getcwd.c
+       - include `bashansi.h' instead of stdlib.h and string.h
+
+error.c, siglist.c, xmalloc.c, builtins/{common,evalfile,mkbuiltins,psize}.c,
+builtins/{exec,exit,fg_bg,hash,history}.def
+       - include `bashtypes.h' instead of directly including <sys/types.h> 
+
+builtins/fc.def
+       - include ../bashtypes.h and ../posixstat.h instead of bashtypes.h
+         and posixstat.h
+
+builtins/mkbuiltins.c
+       - include ../posixstat.h instead of <sys/stat.h>
+
+general.h
+       - include `bashtypes.h' if RLIMTYPE is defined, so we can fetch
+         a definition of quad_t (or whatever) from <sys/types.h> before
+         using it in a function prototype
+
+Makefile.in, builtins/Makefile.in
+       - updated dependencies
+
+                                  2/18
+                                  ----
+builtins/set.def
+       - new function, set_posix_mode, called when `set [-+]o posix'
+         or `shopt -[su] -o posix' is executed.  It sets or unsets
+         $POSIXLY_CORRECT and calls sv_strict_posix
+
+subst.c
+       - in sv_strict_posix, call posix_readline_initialize only if
+         the shell is interactive (interactive_shell != 0)
+
+shell.c
+       - if we are acting like `sh', call posix_readline_initialize
+         if the shell is interactive
+       - moved the code that does posix.2 mode initialization after
+         interactive_shell is set, and call posix_readline_initialize
+         if interactive_shell is non-zero
+
+bashwait.h
+       - renamed to unionwait.h, since that is what it defines
+
+posixwait.h
+       - moved the POSIX 1003.1 job control defines here from jobs.h
+
+jobs.h
+       - include `posixwait.h'
+
+                                  2/19
+                                  ----
+braces.c
+       - if SHELL is defined, pass the contents of new-style command
+         substitution through without expanding brace constructs between
+         the parens -- let the subshell do it
+
+subst.c
+       - when brace-expanding words, preserve the flags (word->flags) if
+         brace expansion does not change the word.  This fixes the problem
+         of things like
+
+                local -a avar=( ${PATH//: } );
+
+bashline.c
+       - have shell_expand_line pass a copy of rl_line_buffer to expand_string
+         in case there are substitution errors and the string gets freed
+
+                                  2/20
+                                  ----
+expr.c
+       - make sure that expland and explor set `lasttok' to LAND and LOR,
+         respectively, if they parse `&&' or `||'.  This makes the
+         precedence code work right
+
+subst.c
+       - changes so that non-interactive shells exit immediately when a
+         parameter that is unset is referenced after `set -u' has been
+         executed causes the shell to exit immediately
+
+                                  2/21
+                                  ----
+flags.c
+       - if `set -r' is executed, call maybe_make_restricted so that $PATH
+         and $SHELL are made read-only
+
+execute_cmd.c
+       - if `set -e' has been executed, and we're inverting a pipeline's
+         return status with `!', set CMD_IGNORE_RETURN so a failing
+         command does not inadvertently cause the shell to exit before
+         the exit status can be inverted.  This is probably only a problem
+         with the `eval' builtin.
+
+                                  2/24
+                                  ----
+builtins/hash.def
+       - add a missing argument of 0 to add_hashed_command
+
+builtins/kill.def
+       - job identifiers can be used in non-interactive shells as long as
+         job control has been turned on with `set -m'
+
+jobs.c
+       - we want to be notified of stopped jobs if job_control is non-zero,
+         even if the shell is not interactive
+
+execute_cmd.c
+       - make sure shell_execve returns EX_NOTFOUND if execve fails and
+         errno is set to ENOENT
+       - makes sure execute_builtin saves the temporary environment to
+         builtin_env for the `eval' builtin, since it can destroy the
+         temporary environment when it calls parse_and_execute
+
+bashhist.c
+       - new variable: hist_last_line_added, set to 1 if the last command
+         line was added to the history successfully as a separate entry.
+         Used by `history' and `fc'
+
+                                  2/25
+                                  ----
+trap.c
+       - save line number before executing trap command, because
+         parse_and_execute resets it to 1 and the trap command might
+         want it
+
+execute_cmd.c
+       - change to executing_line_number to return trap_line_number if
+         the shell is currently running a trap
+
+                                  2/26
+                                  ----
+execute_cmd.c
+       - change to time_command so that a `real' value of 0 does not
+         cause a divide-by-zero error when computing cpu percentage
+
+lib/readline/signals.c
+       - if MUST_REINSTALL_SIGHANDLERS is defined, reinstall the SIGWINCH
+         handler in rl_handle_sigwinch
+
+builtins/set.def
+       - `unset' now rejects attempts to unset names that are not valid
+         shell identifiers as errors
+       - add a description of `-o history' option to help text
+
+subst.c
+       - in parameter_brace_patsub, we want backslash removal done on
+         the replacement if (mflags & MATCH_QUOTED), since the code
+         in expand_word_internal will not do it.  We need to call
+         expand_string_unsplit directly, since maybe_expand_string does
+         not do the right thing
+
+                                  2/28
+                                  ----
+execute_cmd.c
+       - if execute_for_command finds that the iteration variable is readonly,
+         decrement loop_level before returning
+
+builtins/break.def
+       - if the break count is <= 0, display an error message and break out
+         of all loops
+
+builtins/command.def
+       - if PATH is unset, and we're using command -p, we don't want PATH
+         to be set to the empty string when `command' completes
+
+builtins/common.c
+       - POSIX.2 says `kill -l signum' prints the signal name without the
+         leading `SIG' prefix, so check for this_shell_builtin == kill_builtin
+         in display_signal_list
+
+builtins/getopts.def
+       - when invoked without any arguments, `getopts' now prints a usage
+         message
+
+                                   3/3
+                                   ---
+builtins/common.c
+       - add a second argument to get_numeric_arg: if non-zero, the shell
+         exits on a bad argument; if not, the shell jumps to top_level
+         with a DISCARD argument, which aborts the current command
+
+builtins/{break,exit,history,return,shift}.def
+       - change calls to get_numeric_argument
+
+lib/readline/funmap.c
+       - add `dump-macros' to list of bindable names
+
+lib/readline/readline.h
+       - added extern declaration for rl_prompt (it was apparently missing)
+
+lib/readline/readline.c
+       - new internal function, _rl_init_line_state, which sets rl_point
+         and rl_end to 0, sets the_line to point to _rl_line_buffer, and
+         clears the line
+
+lib/readline/callback.c
+       - if a user's callback function does not clear the line, clear it
+         for him by calling _rl_init_line_state
+
+                                   3/4
+                                   ---
+alias.c
+       - made the readline support functions #ifdef READLINE, so they're
+         not compiled into the shell unless readline is
+
+lib/readline/bind.c
+       - new function _rl_untranslate_macro_value, to expand meta-prefixes
+         and other special characters in a macro value for printing by
+         _rl_macro_dumper_internal
+       - call _rl_untranslate_macro_value in _rl_macro_dumper_internal to
+         get a printable version of the macro value
+
+lib/readline/readline.c
+       - new variable, rl_dispatching, set to 1 when we call a function
+         from _rl_dispatch
+
+lib/readline/readline.h
+       - extern declaration for rl_dispatching
+
+lib/readline/complete.c
+       - make sure S_ISCHR and S_ISBLK are defined before using them
+
+lib/readline/terminal.c
+       - add a new #define NEED_EXTERN_PC.  Define this if the termcap
+         or curses libraries need `extern' before declarations of PC,
+         BC, and UP
+
+lib/readline/{readline,terminal,histfile}.c
+       - changes to compile on OS/2 with OS/2 `EMX' port of gcc, originally
+         sent by ilya@math.ohio-state.edu
+
+builtins/set.def
+       - fixed a bug in set_shellopts that caused the shell to crash if
+         there were no shell options set
+
+                                   3/5
+                                   ---
+configure.in,Makefile.in
+       - choose run-all or run-minimal as the test script based on whether
+         the --enable-minimal-config option was given to configure
+
+builtins/setattr.def
+       - fixed `export -p' and `readonly -p' so that they output `export'
+         or `readonly' when in POSIX mode, as POSIX.2 specifies
+
+                                   3/6
+                                   ---
+builtins/setattr.def
+       - make `readonly -a var=(...)' work just like `declare -ar var=(...)',
+         since the two logically mean the same
+       - `readonly -f' and `export -f' don't print the function definition
+         for each readonly or exported function, respectively, when in
+         POSIX mode
+
+jobs.c, nojobs.c
+       - don't report status for processes killed by SIGPIPE if
+         DONT_REPORT_SIGPIPE is defined
+
+config.h.top
+       - added a commented-out define for DONT_REPORT_SIGPIPE
+
+execute_cmd.c
+       - `time' can now be used to time background pipelines, and reports
+         the timing statistics when the pipeline completes
+
+[bash-2.01-alpha1 frozen]
+
+                                  3/12
+                                  ----
+subst.c
+       - move the parent end of the pipe file descriptor used for process
+         substitution to a high, unused file descriptor to avoid clashes
+         with redirections performed explicitly by a script
+
+configure.in
+       - added a `--with-curses' argument so curses can be forcibly chosen
+         over libtermcap (some Unix versions ship lousy termcap databases)
+
+support/mkconffiles
+       - new script to create _distribution and _patchlevel from values
+         contained in `configure'
+
+doc/bashref.texi
+       - updated installation instructions
+
+                                  3/13
+                                  ----
+general.c
+       - if `getgroups' returns 0, make sure we add the primary group id
+         as GROUPS[0].
+       - if we have getgroups, and the primary gid is not in the array
+         getgroups returns, add it as group_array[0] and shuffle everything
+         up one element.  This ensures that current_user.gid == group_array[0]
+         all the time
+
+tests/builtins.tests
+       - changes to avoid stray variables in environment when the shell
+         version of printenv is used with bash as /bin/sh, running the
+         `exec -c' tests.
+
+                                  3/14
+                                  ----
+builtins/cd.def
+       - spelling correction is no longer enabled by default
+
+support/bashbug.sh
+       - if the shell's release status is alpha or beta, offer the option
+         of sending the bug report to the bash-testers mailing list as
+         well as to chet
+
+                                  3/17
+                                  ----
+configure.in
+       - configure --without-gnu-malloc by default on *-sgi-irix6* because
+         their code needs 8-byte alignment
+
+support/bashbug.sh
+       - ``' needs to be quoted with a backslash in double-quoted strings
+
+aclocal.m4
+       - slight changes to the strcoll test, since AIX 4.2 returns -1, 0, or
+         1 from strcmp(3) but a numeric collation order difference from
+         strcoll(3)
+
+                                  3/18
+                                  ----
+command.h
+       - new redirection error code:  HEREDOC_REDIRECT
+
+execute_cmd.c
+       - return HEREDOC_REDIRECT from do_redirection_internal when
+         here_document_to_fd cannot create the temp file for a here document
+       - changed redirection_error to print a meaningful message when
+         here document temp file creation fails (HEREDOC_REDIRECT)
+
+                                  3/19
+                                  ----
+subst.c
+       - changes to match_pattern_char: return 1 if the first char of the
+         pattern is `?' only if the string is non-null; just return 1 if
+         the first char of the pattern is `[' and the string is non-empty
+         rather than try to re-implement the brace matching code from fnmatch
+
+lib/glob/fnmatch.c
+       - some changes from glibc-2.0.1 posix/fnmatch.c
+
+                                  3/21
+                                  ----
+variables.c
+       - only do the initialization of `ignoreeof' if the shell is
+         interactive
+       - reset values of $SHLVL > 1000 to 1 in adjust_shell_level, and
+         don't call itos, since we don't need its generality
+       - new function, initialize_shell_level, just calls adjust_shell_level
+         with argument of 1.  If $SHLVL is unset, adjust_shell_level will
+         deal with it correctly
+       - change initialize_shell_variables to not malloc a copy of each
+         environment variable, just keep two pointers into the env string:
+         one for the name, one for the value
+       - broke the code that computes the value of $BASH out into a separate
+         function: get_bash_name
+       - get_bash_name special-cases shell_name with a `./' prefix when
+         initializing $BASH
+       - new function: set_home_var, sets $HOME to current_user.home_dir if
+         it's not already set, calling get_current_user_info if
+         current_user.home_dir is NULL
+       - new function: set_shell_var, sets $SHELL to current_user.shell if
+         it's not already set, calling get_current_user_info if
+         current_user.shell is NULL
+       - changed places that reference information in current_user to check
+         for NULL values of the member they're interested in and call
+         get_current_user_info if necessary
+
+shell.c
+       - moved the code that sets up the information in current_user that
+         comes from the password file into a new function,
+         get_current_user_info
+       - shell_initialize calls get_current_user_info only if the shell is
+         interactive
+
+externs.h
+       - new extern declaration for get_current_user_info(), so variables.c
+         can use it
+
+                                  3/24
+                                  ----
+lib/tilde/tilde.c
+       - if SHELL is defined, user the current_user struct info to find
+         the user's home directory rather than calling getpwuid
+
+                                  3/25
+                                  ----
+nojobs.c
+       - don't try to open /dev/tty when getting or setting the tty state
+         and window size; use shell_tty instead
+       - initialize shell_tty to standard error in initialize_job_control
+       - only fetch the tty state initially if the shell is interactive
+
+general.c
+       - open /dev/tty with the O_NONBLOCK flag
+
+variables.c
+       - changed all_vars so that it sorts its output all the time, not
+         just when in POSIX mode.  This means that the output of `set'
+         and `export' will be sorted
+
+builtins/set.def
+       - in initialize_shell_options, only call parse_shellopts if we
+         inherited $SHELLOPTS from the environment
+       - make sure we call parse_shellopts from initialize_shell_options
+         with a copy of the value of SHELLOPTS, in case one of the functions
+         called while setting one of the variables modifies $SHELLOPTS
+
+lib/readline/readline.c
+       - make sure that digit arguments don't change the state of
+         rl_last_func
+
+support/printenv.c
+       - new file, printenv(1) clone, used to avoid environment variables
+         that might be set automatically when using printenv.sh
+
+lib/tilde/tilde.c
+       - if SHELL is defined, don't call getenv to get the value of $HOME,
+         call get_string_value () directly
+
+                                  3/26
+                                  ----
+lib/readline/histexpand.c
+       - abstracted the `#ifdef SHELL' stuff that checked for special cases
+         that should not be history expanded ([!...], ${!...}) into a call
+         to a function that is the value of the
+         new history_inhibit_expansion_function variable
+
+lib/readline/history.h
+       - extern declaration for history_inhibit_expansion_function
+
+bashhist.c
+       - new function, bash_history_inhibit_expansion, which checks for
+         the special cases in which history expansion should be inhibited
+       - changes to the various history initialization functions to
+         set history_inhibit_expansion_function
+
+lib/readline/doc/hstech.texinfo
+       - documented history_inhibit_expansion_function
+
+lib/readline/shell.c
+       - new file, containing versions of the functions that are provided
+         by bash when readline is linked as part of bash
+       - new function: get_env_value().  If SHELL is defined, this calls
+         get_string_value().  If SHELL is not defined, this calls getenv()
+
+lib/readline/histexpand.c
+       - moved single_quote() to shell.c
+
+lib/readline/util.c
+       - moved savestring() to shell.c
+
+lib/readline/terminal.c
+       - moved set_lines_and_columns() to shell.c
+
+lib/readline/Makefile.in, Makefile.in
+       - added shell.c and shell.o to the appropriate variables that contain
+         the files comprising the readline and history libraries
+
+lib/readline/signals.c
+       - introduced two new cpp defines:  HANDLE_JOB_SIGNALS and
+         HANDLE_SIGTERM.  When HANDLE_JOB_SIGNALS is defined, SIGTSTP,
+         SIGTTIN, and SIGTTOU are caught and handled.  When HANDLE_SIGTERM
+         is defined, SIGTERM is caught and handled.  These are both
+         defined automatically if SHELL is not defined
+
+lib/readline/{bind,histfile,nls,readline,terminal}.c
+       - call get_env_value instead of getenv().  This should remove the
+         dependency on being able to redefine getenv() in oslib.c
+
+shell.c
+       - added a missing argument of -1 to the call to list_minus_o_opts.
+         Now `bash -o' lists all options, not just random ones depending
+         on what's on the stack
+
+                                  3/28
+                                  ----
+builtins/ulimit.def
+       - change RLIM_INFINITY to the hard limit only if the hard limit is
+         greater than the current (soft) limit
+
+hashlib.c
+       - return immediately from flush_hash_table if the hash table passed
+         is NULL
+
+                                   4/1
+                                   ---
+shell.c
+       - remove call to initialize_filename_hashing -- initialize the hash
+         table the first time a hashed command has to be remembered
+
+hashcmd.c
+       - new file, with functions to perform filename hashing and lookup
+         taken from builtins/hash.def and builtins/common.c
+       - change to remember_filename -- call initialize_filename_hashing
+         if hashing_initialized is 0
+
+hashcmd.h
+       - new file, mostly from builtins/hashcom.h, with extern function
+         declarations added
+
+execute_cmd.c, builtins/{hash,type}.def
+       - include hashcmd.h for hash function and type definitions
+
+builtins/{common.{c,h},hash.def}
+       - moved hashing functions and declarations to hashcmd.c/hashcmd.h
+
+Makefile.in, builtins/Makefile.in
+       - changed source and object file definitions and dependencies because
+         of addition of hashcmd.h and hashcmd.c
+
+builtins/hash.def
+       - return immediately from print_hashed_commands if hashed_commands
+         is empty, indicating that the hash table has not been initialized
+
+                                   4/2
+                                   ---
+lib/readline/bind.c
+       - fixed translation of ESC in rl_untranslate_keyseq and
+         rl_untranslate_macro_value
+
+lib/readline/{readline,kill}.c
+       - added an argument to _rl_fix_point telling it whether or not to
+         fix up the mark also; changed calls to _rl_fix_point to add the
+         appropriate argument
+
+Makefile.in
+       - changed the substitution delimiter in the `sed' commands that
+         create bashbug from `:' to `%' to avoid conflicts with options
+         containing `:'
+
+                                   4/3
+                                   ---
+print_cmd.c
+       - made the initial value and the default growth value for the
+         printed command somewhat smaller -- we don't really need to
+         allocate 4096 bytes for the printed command
+       - added stdarg support to xprintf if PREFER_STDARG is defined
+
+stringlib.c
+       - changed strip_trailing to take the index of the last character
+         as the second argument, saving a (useless) call to strlen, since
+         the caller already knows where the end of the string is
+
+subst.c
+       - change call to strip_trailing in command_substitute to add the
+         new second argument
+
+externs.h
+       - changed extern declaration for strip_trailing
+
+                                   4/4
+                                   ---
+Makefile.in, configure.in, lib/malloc/Makefile.in
+       - changed the strategy for picking which `malloc' to include by
+         having configure define a `malloc target' and the Makefile in
+         lib/malloc implementing rules for that target
+
+                                   4/5
+                                   ---
+Makefile.in
+       - slightly changed the rules for remaking `parser-built':  it is
+         now a copy of y.tab.h, updated only when the contents of y.tab.h
+         change
+       - everything that used to depend on y.tab.h now depends on
+         parser-built
+
+                                   4/6
+                                   ---
+execute_cmd.c, print_cmd.c
+       - use #include <y.tab.h> so we pick up y.tab.h from the build
+         directory instead of the source directory if it happens to be
+         recreated in the build directory
+
+                                   4/7
+                                   ---
+bashline.c
+       - fixed another problem with `pwd`/[TAB] thinking that the `/
+         started an unclosed command substitution, generating errors
+
+                                   4/8
+                                   ---
+general.c
+       - renamed bash_tilde_expansion_failure_hook to be
+         bash_special_tilde_expansions, since that more accurately reflects
+         its function
+       - changed tilde_initialize so that there is no failure hook -- the
+         special expansions are handled first with the preexpansion hook
+
+lib/tilde/tilde.c
+       - new variable: tilde_expansion_preexpansion_hook -- if non-null, it
+         points to a function that is called before standard tilde expansion
+         is attempted
+
+lib/tilde/tilde.h
+       - extern declaration for tilde_expansion_preexpansion_hook
+
+doc/{bash.{1,html},bashref.texi}
+       - added optional open paren to description of `case' command syntax
+
+                                   4/9
+                                   ---
+variables.c
+       - on qnx, set and export a variable `NODE' which contains the QNX
+         `node id'
+
+general.c
+       - QNX system can now handle pathnames with a leading `//'
+
+configure.in
+       - added `-Dqnx' to LOCAL_CFLAGS on QNX machines
+
+lib/malloc/getpagesize.h
+       - some systems need sysconf(_SC_PAGE_SIZE) to obtain the page size;
+         added code to check for it
+
+                                  4/10
+                                  ----
+print_cmd.c
+       - include the prototype for cprintf only if PREFER_STDARG is defined,
+         otherwise just have a K&R-style forward function declaration
+
+hashlib.h
+       - reduced the default number of buckets in a hash table to 53
+
+lib/tilde/tilde.c
+       - prime the result string in tilde_expand by allocating a new string
+         that's as long as the input string (+16 if a tilde appears in
+         the string to be expanded).  This should reduce the number of
+         reallocs
+
+subst.c
+       - broke the code that reads the output of a command substitution
+         through the pipe to the subshell out into a separate function:
+         read_comsub().  This does not use stdio, but rather reads
+         directly from the pipe into a local 128-character buffer
+
+                                  4/11
+                                  ----
+execute_cmd.c
+       - some systems need both <sys/time.h> and <time.h>, so include both
+         if it's possible, otherwise include <sys/time.h> (if present)
+
+lib/readline/rl{tty,defs}.h
+       - moved includes of <sys/stream.h>, <sys/ptem.h>, etc. to rltty.h
+
+lib/readline/terminal.c
+       - include rltty.h after rldefs.h
+
+variables.c
+       - changes to make environment creation faster and use less memory
+         (fewer malloc/free calls, too):
+
+               o two new variables: export_env_index (how many environment
+                 strings are in export_env) and export_env_size (the
+                 number of slots for strings allocated in export_env)
+               o added new function add_to_export_env, since adding the
+                 exported shell variables and shell functions does not
+                 need to search the export_env for a definition to supersede
+                 (we just cleared it out!)
+               o renamed add_or_supersede to add_or_supersede_exported_var,
+                 since it always works on export_env, and changed the second
+                 argument to a flag saying whether or not to allocate a new
+                 copy of the string placed into the environment
+               o changed calls to add_or_supersede to the new
+                 add_or_supersede_exported_var with the appropriate flags
+               o don't free and reallocate export_env in maybe_make_export_env,
+                 just free the strings and start anew
+               o prime the size of export_env from the total number of shell
+                 variables and shell functions -- this will always be enough
+                 for the exported shell functions and variables, and big
+                 enough most of the time for the entire environment
+
+builtins/cd.def
+       - efficiency hack in bindpwd():  if PWD is exported, we will have to
+         rebuild the entire exported environment after every time we change
+         directories.  What we do is see if array_needs_making changes value
+         from 0 to 1 after bind_variable ("PWD", dirname) is called, and
+         that PWD is exported.  If that happens, we just replace the value
+         of PWD in the exported environment with a call to
+         add_or_supersede_exported_var
+
+bashline.c, parse.y
+       - check calls to pre_process_line to make a fresh copy of the line
+         if pre_process_line returns what it was passed, in preparation
+         for future changes
+
+bashhist.c
+       - pre_process_line now returns its argument if it did not make
+         any changes to it
+
+alias.c
+       - free the bucket entry holding the alias to be removed in
+         remove_alias, as well as the data
+
+                                  4/14
+                                  ----
+unwind_prot.c
+       - if an unwind-protect frame is being discarded, and its cleanup
+         function is `restore_variable', the `arg' member points to a
+         SAVED_VAR that must be freed.  This change is made in
+         remove_unwind_protect_internal and unwind_frame_discard_internal
+
+parse.y
+       - need to free memory allocated by parse_arith_cmd if it is an
+         arithmetic command, after using it to make a new word
+
+subst.c
+       - fixed some memory leaks caused by not freeing the argument to
+         make_bare_word, which duplicates its string argument
+       - need to dispose list generated by list_rest_of_args in
+         paramter_list_remove_pattern
+       - make sure the return value from getpattern() is freed
+       - make sure array_value_internal always returns newly-allocated
+         memory
+       - get_var_and_type returns a new type: VT_ARRAYMEMBER if the
+         string passed is of the form var[index]
+       - make sure parameter_brace_substring frees the memory allocated
+         by get_var_and_type if verify_substring_values returns 0
+
+hashlib.c, hashlib.h
+       - new function, dispose_hash_table (table), which frees the
+         table's bucket array and the table itself
+
+alias.c
+       - call dispose_hash_table from delete_all_aliases instead of just
+         freeing the table
+
+pathexp.c
+       - make sure to free `newnames' (but *not* its contents) before
+         returning from ignore_globbed_names
+
+builtins/exec.def
+       - make sure the argv created to pass to shell_execve is freed if
+         the execve fails and we're not exiting on failed execs
+
+expr.c
+       - broke evalexp into two functions: evalexp, which sets up the
+         jmp_buf that errors jump to, and subexpr, which does the
+         evaluation and pushing and popping of contexts
+       - readtok now calls subexpr to evaluate subexpressions in
+         parentheses
+       - evalexp now takes an additional paramter, a pointer to an int.
+         If the expression contains errors, the location to which this
+         points gets 0, otherwise it gets 1 to show that the value
+         returned may be used.  This plugs up memory leaks that were
+         the result of evalexp() longjmping back to top_level
+       - fixed a memory leak: expr_stack[0] was not being freed
+
+externs.h
+       - changed extern declaration for evalexp
+
+variables.c, subst.c, builtins/let.def
+       - changed calls to evalexp appropriately.  They either cause a
+         longjmp (top_level, DISCARD) (which is what the old stuff in
+         expr.c did) or are handled by returning an appropriate error
+         value (e.g., &expand_word_error in subst.c)
+
+                                  4/16
+                                  ----
+shell.c
+       - make sure to free dollar_vars[0] before assigning it the first
+         argument following `-c command'
+
+variables.c
+       - if unsetting a local variable with a previous context, make sure      
+         to free the hash table element used to store the local variable
+
+lib/readline/terminal.c
+       - rearrange the includes so <sys/ioctl.h> is included before rltty.h,
+         as it is in rltty.c
+
+                                  4/17
+                                  ----
+flags.c
+       - new function: reset_shell_flags, which resets all of the flags
+         back to their initial values
+
+flags.h
+       - extern declaration for reset_shell_flags
+
+builtins/set.def
+       - new function: reset_shell_options, which resets all of the -o
+         options that are not also shell flags back to their initial values
+
+builtins/shopt.def
+       - new function: reset_shopt_options, which resets all of the shopt
+         options that are not also shell flags or -o options back to their
+         initial values
+
+builtins/common.h
+       - extern declarations for reset_shell_options and reset_shopt_options
+
+execute_cmd.c
+       - broke the code that reinitializes things when an executable script
+         without a leading `#!' is found out into a new function:
+         initialize_subshell
+       - initialize_subshell now calls the reset_* functions that reset the
+         shell flags and options
+
+general.c, general.h
+       - move_to_high_fd now takes a third argument: the highest fd at which
+         to start looking.  If that's less than 20, the maximum number of
+         open files as returned by getdtablesize() is used (which is what
+         it did before this)
+
+jobs.c, shell.c, subst.c
+       - changed calls to move_to_high_fd appropriately
+
+[bash-2.01-beta1 frozen]
+
+                                  4/18
+                                  ----
+general.c
+       - itos now uses a local char buffer to do its conversion, but still
+         returns newly-allocated memory
+
+                                  4/21
+                                  ----
+variables.c
+       - be a little more careful when checking for backwards-compatibility
+         with exported function definitions
+
+                                  4/22
+                                  ----
+builtins/ulimit.def
+       - translate RLIM_INFINITY to limit.rlim_max if the current limit is
+         less than or equal to the hard limit, not just strictly less than
+         (the change of 3/28 was too drastic)
+
+                                  4/23
+                                  ----
+oslib.c
+       - fixed definition of to_lower on machines without strcasecmp
+
+trap.c
+       - don't free the trap command in change_signal if the SIG_INPROGRESS
+         is set in the signal's flags -- it will cause memory to be freed
+         twice if a trap command resets the signal handler more than once,
+         and _run_trap_internal keeps a pointer to the trap command so it
+         can free it, so there will be no leaks
+
+                                  4/24
+                                  ----
+aclocal.m4,configure.in
+       - removed BASH_CC_WORKS, since AC_PROG_CC now has the functionality
+
+shell.c, externs.h
+       - get_current_user_info is now a void function
+
+bashline.c
+       - alias_expand_line_internal was removed
+       - new function, alias_expand_line, performs alias expansion on
+         rl_line_buffer and either replaces rl_line_buffer or signals
+         an error
+       - new bindable commands: alias-expand-line and
+         history-and-alias-expand-line, available if ALIAS is defined
+
+                                  4/25
+                                  ----
+Makefile.in, lib/malloc/malloc.c
+       - changed the define that turns on malloc range checking from
+         `rcheck' to `RCHECK'
+
+lib/readline/isearch.c
+       - fixed a couple of places where rl_search_history would try to
+         free a NULL pointer
+
+                                  4/29
+                                  ----
+unwind_prot.c
+       - fixed a problem with saving a variable that is a null pointer
+         in unwind_protect_var.  It happens only on machines where the
+         size of a pointer is not the size of an int.  The old FASTCOPY
+         code would copy the eight bytes at memory location zero, which
+         did not necessarily make a null pointer
+
+                                  4/30
+                                  ----
+shell.c
+       - run_startup_files should turn off job control, since the startup
+         files should be run without job control enabled -- this makes
+         SIGINT interrupt startup file execution again
+       - if we get a SIGINT or other longjmp to top_level while executing
+         the startup files, re-enable job control for interactive shells
+         before setting locally_skip_execution
+
+                                   5/2
+                                   ---
+lib/readline/nls.c
+       - if we have setlocale(3), don't bother with checking the
+         environment variables for valid values; just use setlocale()
+         to set the locale categories from the environment variables
+         directly and go into eight-bit mode if the current locale is
+         not C or POSIX
+
+                                   5/5
+                                   ---
+sig.c
+       - make sure that the handler for SIGPROF is not changed if it has
+         been set to something other than SIG_IGN or SIG_DFL -- this makes
+         profiling work after the terminating signals have been initialized
+
+bashline.c
+       - if a filename containing `!' is completed, and the user has started
+         the string with a `"', change the completion style to backslash-      
+         quoting, since there's no way to use `!' with double quotes (this
+         requires more changes to readline to really work right)
+
+                                   5/6
+                                   ---
+lib/readline/complete.c
+       - changes to make_quoted_replacement, insert_all_matches, and
+         insert_match and their callers to allow the application-specific
+         filename quoting function to change the quote character (e.g., for
+         bash to change a filename containing a `!' and started with a
+         double quote by the user into a filename with the `!' quoted by
+         a backslas and no double quote)
+
+                                   5/8
+                                   ---
+jobs.c
+       - new function: nohup_all_jobs(), calls nohup_job for each entry in
+         the jobs list
+       - delete_all_jobs is now global
+
+jobs.h
+       - new extern declarations for delete_all_jobs() and nohup_all_jobs()
+
+builtins/jobs.def
+       - `disown' without any jobspec arguments means the current job.  Fix
+         a core dump printing the error message when there is no current job
+
+                                  5/12
+                                  ----
+subst.c
+       - process an expansion like $((foo); bar) as a command substitution,
+         not as an arithmetic expansion.  An arithmetic expansion must have
+         a closing `))'
+
+                                  5/14
+                                  ----
+builtins/evalstring.c
+       - the third argument to parse_and_execute() is now a flags word.
+         The caller can control the value of `interactive' and whether
+         or not history is disabled while parse_and_execute() runs
+
+builtins/common.h
+       - new #defines for the flag values for parse_and_execute()
+
+{bashline,jobs,shell,subst,trap,variables}.c, parse.y, builtins/evalfile.c,
+builtins/{eval,fc}.def
+       - changed calls to parse_and_execute appropriately
+
+builtins/evalfile.c
+       - if _evalfile() is passed FEVAL_HISTORY as part of the flags arg,
+         don't pass SEVAL_NOHIST to parse_and_execute
+       - new function: fc_execute_file, which sets FEVAL_HISTORY in the
+         flags argument to _evalfile()
+
+bashline.c
+       - call bash_add_history instead of add_history from
+         vi_edit_and_execute_command so the bash state variables get
+         updated properly.  This keeps the `v' command from operating
+         on an empty command when the history list is stifled
+
+bashhist.c
+       - bash_add_history is now global
+
+bashhist.h
+       - extern declaration for bash_add_history
+
+builtins/fc.def
+       - call fc_execute_file instead of maybe_execute_file in the
+         edit-and-re-execute case (fc -e ...)
+       - don't manually insert the commands from the file created by `fc -e'
+         into the history list, just set remember_on_history and let
+         fc_execute_file take care of telling parse_and_execute to do the
+         right thing.  This makes compound commands and the `cmdhist'
+         and `lithist' settings work better.  This supersedes the fix of
+         1/27.  This was reported again by rchen@fractal.eng.yale.edu.
+
+parse.y
+       - the body of a `for' command (the commands between do...done or
+         {...}) should be a `compound_list' instead of a `list'.  Problem
+         reported by cpg@research.bell-labs.com
+
+                                  5/19
+                                  ----
+lib/readline/complete.c
+       - in filename_completion_function, if we find that the directory
+         pointer (return value from opendir(3)), is not null when state
+         is 0 (indicating that this is the first time the completion
+         function has been called for the current completion), call
+         closedir on it, assuming that it was left open by a previous
+         (interrupted) completion
+
+[bash-2.01-beta2 frozen]
+
+                                  5/27
+                                  ----
+Makefile.in
+       - make sure that `make distclean' (and other clean targets) remove
+         the `printenv' executable
+
+tests/execscript, tests/redir.tests
+       - make sure to set LANG=C and LC_ALL=C so the messages show up in
+         English
+
+tests/run-func
+       - add a warning about exported functions in the environment
+
+                                  5/29
+                                  ----
+builtins/hash.def
+       - if one of the arguments passed to `hash' is an absolute pathname,
+         just continue the loop, don't do list=list->next first.  This
+         fixes the `hash a/b' -> core dump bug
+
+                                  5/30
+                                  ----
+general.c
+       - change canonicalize_pathname to leave a leading `/' alone, as
+         POSIX requires
+
+                                   6/2
+                                   ---
+support/xenix-link.sh
+       - shell script for linking bash under Xenix
+
+                                   6/3
+                                   ---
+bashline.c
+       - fixed a memory leak in command_word_completion_function, courtesy
+         of a.pfaller@pop.gun.de
+
+hashcmd.c
+       - fixed find_hashed_filename to always return a newly-allocated
+         string
+
+execute_cmd.c
+       - since find_hashed_filename returns newly-allocated memory, don't
+         call savestring() on it, and free it if the data is stale (in
+         search_for_command()).  Another memory leak fixed courtesy of
+         a.pfaller@pop.gun.de
+
+builtins/type.def
+       - free the value returned by find_hashed_filename
+
+[bash-2.01-release frozen]
+
+                                   6/6
+                                   ---
+configure.in
+       - force shlicc2 and libc malloc for BSD/OS 3.0
+
+                                   6/9
+                                   ---
+doc/Makefile.in
+       - don't create ${man3dir}, since we're not installing the readline
+         manual page
+
+lib/readline/readline.h
+       - rl_dispatching should be declared `extern'
+         [in bash-2.01.1]
+
+                                  6/10
+                                  ----
+lib/malloc/Makefile.in
+       - make sure ${ALLOCA_SOURCE} is preceded by ${srcdir} so that things
+         work when building in a directory other than the source directory
+         [in bash-2.01.1]
+
+                                  6/30
+                                  ----
+lib/readline/examples/rltest.c
+       - don't free the value returned by history_list()
+
+lib/readline/histfile.c
+       - open the history file for writing with mode 0600 for better
+         security
+         [in bash-2.01.1]
+
+execute_cmd.c
+       - select_query now uses legal_number to decide whether the user's
+         selection is a valid number, and just executes the loop again if
+         invalid input is entered
+         [in bash-2.01.1]
+
+                                   7/1
+                                   ---
+builtins/evalstring.c
+       - fix to parse_and_execute so `bash -c 'time [-p] zzz'' works right
+         [in bash-2.01.1]
+
+execute_cmd.c
+       - fix to execute_command_internal so that `bash -c time [-p] (zzz)''
+         works right
+         [in bash-2.01.1]
+       - print_formatted_time should pass a long as the fourth parameter
+         to mkfmt 
+         [in bash-2.01.1]
+
+externs.h, shell.c
+       - `exit_shell' is now a void function
+
+hashlib.c
+       - print_table_stats is now a void function
+
+mailcheck.c
+       - made add_mail_file check for the filename in the mail file list
+         using the expanded filename, since that is what it puts into
+         the list
+         [in bash-2.01.1]
+
+variables.c
+       - for the time being, PWD will be auto-exported, since some systems
+         seem to expect it
+
+doc/bashref.texi, lib/readline/doc/{hist,rlman}.texinfo
+       - added necessary `dircategory' and `direntry' commands to make
+         `install-info' work correctly
+
+Makefile.in
+       - move $(LDFLAGS) after $(BUILTINS_LDFLAGS) and $(LIBRARY_LDFLAGS) on
+         the line that links bash
+
+doc/texinfo.tex
+       - upgraded to version 2.185 from the texinfo-3.9 distribution
+
+lib/tilde/tilde.c
+       - fixed a bug in tilde_expand so that enough space is allocated for
+         the string and terminating null byte if a `~' does not appear.
+         This was masked before by the bash malloc()
+         [in bash-2.01.1]
+
+                                   7/3
+                                   ---
+aclocal.m4
+       - new test, BASH_TYPE_INT32_T, to check which builtin C type is
+         32 bits wide
+       - new test, BASH_TYPE_PTRDIFF_T, to check which builtin C type is
+         appropriate for pointer arithmetic
+
+configure.in
+       - check sizes of int and long, and for the existence of an int32_t
+         basic system type.  Call BASH_TYPE_INT32_T if int32_t is not
+         defined anywhere in the system header files
+       - check size of (char *), and for the existence of a ptrdiff_t
+         basic system type.  Call BASH_TYPE_PTRDIFF_T if ptrdiff_t is not
+         defined anywhere in the system header files
+       - added a check for <stddef.h>
+
+config.h.in
+       - add lines for SIZEOF_INT, SIZEOF_LONG, SIZEOF_CHAR_P, int32_t,
+         u_int32_t, and ptrdiff_t
+       - added line for HAVE_STDDEF_H
+
+lib/malloc/malloc.c
+       - new version, with many changes and much better memory usage; old
+         (bash-2.01) version is lib/malloc/omalloc.c
+
+lib/malloc/gmalloc.c
+       - new version, with a number of changes and range checking included
+         by default; old (bash-2.01) version is lib/malloc/ogmalloc.c
+
+execute_cmd.c
+       - applied patch from 5/27 to make execute_simple_command fork early
+         if it's part of a pipeline.  This keeps assignment statements or
+         other commands that don't require a builtin, function, or disk
+         command to be executed from modifying the shell's environment
+
+tests/exec?.sub
+       - renamed from tests/execscript.sub? because those filenames are
+         too long for System V 14-char filename systems
+
+tests/source?.sub
+       - renamed from tests/source.sub? because those filenames are bad
+         for DOS/Windows
+
+tests/getopts?.sub
+       - renamed from tests/getopts.sub? because those filenames are bad
+         for DOS/Windows
+
+tests/histexp.{tests,right}
+       - renamed from histexpand.{tests,right} because those filenames are
+         too long for System V 14-char filename systems
+
+tests/trap1.sub
+       - renamed from trap.sub1 because that filename was bad for DOS/Windows
+
+tests/ifs-[123].right
+       - renamed from ifs.[123].right because those filenames were bad for
+         DOS/Windows
+
+tests/ifs-[123].test
+       - renamed from ifs-test-[123].sh because those filenames were bad
+         for DOS/Windows
+
+examples/startup-files/Bashrc.bfox
+       - renamed from examples/startup-files/Bashrc because that filename
+         conflicts with examples/startup-files/bashrc on case-insensitive
+         file systems
+
+tests/exec.right
+       - renamed from execscript.right because that filename is too long
+         for System V 14-char filename systems
+
+tests/run-set-e
+       - renamed from run-set-e-test
+
+tests/misc/perftest
+       - renamed from tests/misc/haertel.perftest because that filename is
+         too long for System V 14-char filename systems
+
+lib/glob/fnmatch.c
+       - new version with full POSIX.2 BRE matching (character classes,
+         collating symbols, equivalence classes), full support for
+         strcoll(3), and case-insensitive pattern matching
+
+lib/glob/fnmatch.h
+       - new version, with necessary symbols for the new fnmatch.c
+
+tests/posixpat.{tests,right}, tests/run-posixpat
+       - test suite for the POSIX.2 BRE pattern matching code
+
+variables.c
+       - make sure that array assignment using the compound syntax empties
+         the array before doing the assignment
+         [in bash-2.01.1]
+
+trap.c
+       - new function, trap_to_sighandler(sig), which returns the correct
+         trap handler for SIG depending on the information in sigmodes[sig]
+         [in bash-2.01.1]
+
+sig.h
+       - extern declarations for trap_handler and trap_to_sighandler
+         [in bash-2.01.1]
+
+jobs.c
+       - if we get an interrupt while waiting for a command to complete,
+         and there was a trap set on SIGINT that resets the handler to
+         SIG_DFL, the value that waitchld uses for old_trap_handler will
+         be wrong (it will be trap_handler, but trap_handler no longer
+         knows anything about SIGINT).  If old_signal_handler is trap_handler,
+         but signal_is_trapped(SIGINT) returns 0, we need to call
+         trap_to_sighandler to decide what to do
+         [in bash-2.01.1]
+
+                                   7/7
+                                   ---
+locale.c
+       - fix to set_locale_var to handle an assignment to LC_ALL (e.g., as
+         the result of `unset LANG') when default_locale is null
+         [in bash-2.01.1]
+
+                                   7/8
+                                   ---
+builtins/umask.def, doc/{bash.{1,html},bashref.texi}
+       - added `-p' option for umask to print output in a reusable form
+
+                                   7/9
+                                   ---
+doc/{bash.{1,html},bashref.texi}
+       - removed descriptions of `-type', `-path', and `-all' options to
+         the `type' builtin in preparation for removing them in the next
+         release
+
+builtins/type.def
+       - removed mention of `-type', `-path', and `-all' options from the
+         long help description
+
+error.c, error.h
+       - new function: internal_warning, for warning messages
+
+variables.c
+       - changed a call to internal_error to use internal_warning
+       - modified change of 7/3 so that arrays are not emptied until
+         just before the shell is about to assign the new values, so
+         the old value can be used to generate the rhs of the assignment,
+         if necessary.  This is how `normal' shell variables work
+         [in bash-2.01.1]
+
+jobs.c, jobs.h
+       - delete_job now takes a second int argument and prints a warning
+         message when deleting a stopped job if the second argument is
+         non-zero
+
+jobs.c, builtins/jobs.def
+       - changed all calls to delete_job to provide a proper second arg
+
+lib/readline/bind.c
+       - broke rl_read_init_file into an `upper' and `lower' half in
+         preparation for adding file inclusion capability to inputrc
+         parsing
+       - handle_parser_directive now displays an error message if an
+         unknown directive is encountered
+       - parser_endif now prints an error message if an $endif without
+         a matching $if is found
+       - added `$include' parser directive to read bindings and commands
+         from another file at that point
+
+lib/readline/doc/rluser.texinfo, doc/{bash.{1,html},readline.3}
+       - documented new readline `$include' parser directive
+
+shell.c, parse.y
+       - added a new invocation option, --dump-po-strings, and code to
+         make it dump translatable strings ($"...") in GNU gettext
+         `po' format
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new `--dump-po-strings' invocation option
+
+lib/readline/{{kill,funmap}.c,readline.h}
+       - added `rl_paste_from_clipboard()', bound to `paste-from-clipboard'
+         for CYGWIN32 users
+
+lib/readline/kill.c
+       - incorporated bfox's patches for `iterative' yank-last-arg handling.
+         This means that one can keep pressing M-. and move backwards in
+         the history, yanking the last argument of successive history lines
+
+lib/readline/rlwinsize.h
+       - new file, encapsulates various locations of the definition for
+         `struct winsize'
+
+aclocal.m4
+       - augmented BASH_STRUCT_WINSIZE to look in termios.h as well as
+         sys/ioctl.h for definition of `struct winsize'
+
+lib/readline/rltty.h
+       - include "rlwinsize.h" after including tty-driver-specific header
+         file
+
+                                  7/10
+                                  ----
+support/config.guess
+       - add better support for SunOS on M68K (old Sun3 machines)
+
+parse.y
+       - check for compound array assignment in read_token_word only if
+         there are characters before the `=' (which would make it a legal
+         assignment statement).  This fixes the problem with defining a
+         function named `=' with `=() { echo foo; }'
+         [in bash-2.01.1]
+
+jobs.c, jobs.h
+       - nohup_all_jobs and delete_all_jobs now take a parameter which
+         says whether or not to restrict their operation to only running
+         jobs
+
+jobs.c
+       - changed all calls to delete_all_jobs
+
+builtins/jobs.def
+       - added `-a' (all jobs) and `-r' (running jobs only) options to
+         `disown'
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new `-a' and `-r' options to `disown'
+
+findcmd.c, findcmd.h
+       - new files with command searching code from execute_cmd.c and
+         function declarations from execute_cmd.h
+
+Makefile.in, builtins/Makefile.in
+       - updated dependencies to account for new findcmd.[ch]
+       - updated dependencies to account for new redir.[ch]
+
+redir.c, redir.h
+       - new files with code that sets up lists and performs redirections
+         from execute_cmd.c and execute_cmd.h
+
+execute_cmd.c
+       - include new findcmd.h, redir.h
+
+                                  7/11
+                                  ----
+Makefile.in, configure.in
+       - PROFILE_FLAGS is now substituted into the Makefile by configure
+
+                                  7/14
+                                  ----
+print_cmd.c
+       - make sure single_quote is called from xtrace_print_word_list
+         to correctly quote each word of trace output, especially those
+         with embedded quotes
+         [in bash-2.01.1]
+
+aclocal.m4
+       - extended BASH_CHECK_GETPW_FUNCS so that it checks that getpwuid
+         and getpwnam can also be declared, as well as getpwent
+         [in bash-2.01.1]
+       - in BASH_FUNC_PRINTF, cast printf to type `_bashfunc' before trying
+         to assign it to `pf' to avoid any prototype problems in the
+         declaration
+         [in bash-2.01.1]
+
+trap.c
+       - include <unistd.h> before any of the bash-specific header files,
+         but after config.h
+         [in bash-2.01.1]
+
+test.c
+       - include <errno.h> and declare `extern int errno' before including
+         any of the bash-specific include files, but after <unistd.h>
+         [in bash-2.01.1]
+
+builtins/Makefile.in
+       - PROFILE_FLAGS is now substituted into the Makefile by configure
+
+configure.in
+       - new options, --enable-profiling and --enable-static-link, to turn
+         on profiling with gprof and link bash statically (if using gcc)
+         for use as a root shell.  The former implies the latter.  If
+         we're linking statically, dynamic loading of new builtins is not
+         available
+
+doc/bashref.texi
+       - documented new --enable-profiling and --enable-static-link
+         options in installation section; regenerated INSTALL
+
+lib/glob/glob.[ch]
+       - new global variable, glob_ignore_case, turns on case-insensitive
+         filename matching in fnmatch() using the FNM_CASEFOLD flag
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new shopt `nocaseglob' option
+
+                                  7/15
+                                  ----
+bashline.c
+       - when glob_complete_word is called with state == 0, make sure we
+         set rl_filename_completion_desired so that proper quoting of
+         the resultant filenames is performed
+         [in bash-2.01.1]
+
+                                  7/16
+                                  ----
+externs.h, oslib.c
+       - strcasecmp and strncasecmp replacements should have `const char *'
+         as the first two arguments, to match OS definitions
+         [in bash-2.01.1]
+
+                                  7/17
+                                  ----
+(many files)
+       - changes for minix-2.0, mostly just adding #ifndef _MINIX around
+         include files that minix doesn't provide, like <sys/param.h> and
+         <sys/file.h>
+
+lib/readline/terminal.c
+       - removed `outchar' function; use _rl_output_character_function in
+         its place
+
+support/config.guess
+       - changes to recognize HP_ARCH of `hppa2.0'
+
+test.c
+       - new `-N' option: `test -N file' returns true if FILE exists and
+         has been modified since it was last accessed
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new `test -N' option
+
+                                  7/22
+                                  ----
+aclocal.m4
+       - prefer /var/spool/mail to /usr/spool/mail in BASH_DEFAULT_MAIL_DIR
+         [in bash-2.01.1]
+
+lib/readline/{complete,bind}.c
+       - new readline variable, print-completions-horizontally, which causes
+         matches to be printed across the screen (like `ls -x') rather than
+         up-and-down (like `ls')
+       - new readline variable, completion-ignore-case, which causes filename
+         completion and matching to be performed case-insensitively
+
+doc/{bash.{1,html},readline.3}, lib/readline/doc/rluser.texinfo
+       - documented new print-completions-horizontally variable
+       - documented new completion-ignore-case variable
+
+_distribution, Makefile.in
+       - bumped the version number up to 2.02-alpha1
+
+bracecomp.c
+       - fixes so that the braces are not quoted by the filename quoting
+         function when complete-into-braces is executed with M-{.  The
+         brace completion functions do filename quoting themselves
+         [in bash-2.01.1]
+
+pathexp.c
+       - changed quote_string_for_globbing so that it takes a flags word
+         as its second argument
+
+pathexp.h
+       - defines for flags passed to quote_string_for_globbing
+
+subst.c,execute_cmd.c
+       - changed calls to quote_string_for_globbing to pass the correct
+         flag arguments
+
+expr.c
+       - added a `**' binary operator to do exponentiation (2**16 == 65536).
+         precedence is lower than arithmetic operators, higher than unary
+         operators (2**16-1 == 65535)
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new `**' arithmetic binary operator
+
+                                  7/24
+                                  ----
+shell.c
+       - added new (currently undocumented) `--wordexp' option to do the
+         job required by POSIX.2 wordexp().  If -n is supplied along with
+         --wordexp, command substitution is disallowed and the shell
+         exits with a status of 125 if one is attempted.  If there is an
+         expansion error, the shell exits with a status of 127.  If there
+         is a shell parsing error, the shell exits with a status of 126.
+         Otherwise, the exit status is 0.  The current output is
+
+               number of words\n
+               number of bytes\n
+               expanded words, one per line, separated by newlines
+
+         This will have to be changed when an interface to glibc is coded
+
+                                  7/28
+                                  ----
+hashcmd.h
+       - reduced the default size of the filename hash table from 631
+         to 107
+
+sig.c
+       - don't call initialize_siglist if HAVE_UNDER_SYS_SIGLIST is defined
+         [in bash-2.01.1]
+
+siglist.c
+       - don't compile this file if HAVE_UNDER_SYS_SIGLIST is defined
+         [in bash-2.01.1]
+
+variables.c
+       - fix to make $RANDOM work better in subshells
+         [in bash-2.01.1]
+
+aclocal.m4
+       - new macro, BASH_DECL_UNDER_SYS_SIGLIST, looks for _sys_siglist in
+         <signal.h> and <unistd.h>, defines UNDER_SYS_SIGLIST_DECLARED if
+         found
+         [in bash-2.01.1]
+       - change BASH_UNDER_SYS_SIGLIST to require BASH_DECL_UNDER_SYS_SIGLIST,
+         like BASH_SYS_SIGLIST requires AC_DECL_SYS_SIGLIST
+         [in bash-2.01.1]
+
+config.h.in
+       - add a line for UNDER_SYS_SIGLIST_DECLARED
+         [in bash-2.01.1]
+
+configure.in
+       - make sure that SVR4_2 is defined for machines that have $host_os
+         sysv4.2* (e.g., sysv4.2MP) as well as $host == sysv4.2
+         [in bash-2.01.1]
+
+                                  7/29
+                                  ----
+command.h
+       - new command type, ARITH_COM, used to create and execute a ((...))
+         command without translating it into let "..."
+
+parse.y
+       - changes to the grammar and lexer so that ((...)) is parsed as a
+         command of type ARITH_CMD.  An ARITH_CMD is a WORD_LIST, for
+         future expansion, even though only the first word is used
+
+make_cmd.c, make_cmd.h
+       - definition and declaration of a function to build an arithmetic
+         command
+
+dispose_cmd.c
+       - added code to dispose of arithmetic commands
+
+print_cmd.c
+       - added code to print arithmetic commands, both `regularly' and
+         when they're being traced with `set -x'
+
+externs.h
+       - extern declaration for xtrace_print_arith_cmd
+
+copy_cmd.c
+       - added code to copy arithmetic commands
+
+execute_cmd.c
+       - added code to directly execute arithmetic commands -- they are
+         a shell_control_structure, so just about everything like
+         redirections and piping is taken care of by the boilerplate code.
+         All that's needed is to expand the expression (which is within
+         double quotes -- added by parse.y:parse_arith_cmd()), print it
+         if tracing is enabled, call the expression evaluator, and return
+         an appropriate result
+
+                                  7/30
+                                  ----
+input.c
+       - new function, set_buffered_stream(fd, bp), sets the buffered stream
+         associated with FD to BP and returns the old buffered stream
+
+input.h
+       - extern declaration for set_buffered_stream
+
+parse.y
+       - call set_buffered_stream rather than manipulating the BUFFERS array
+         directly
+
+shell.c
+       - unset_bash_input now takes an argument, CHECK_ZERO.  This tells it
+         whether to check whether default_buffered_input is >= 0 or just > 0
+
+externs.h
+       - changed extern declaration for unset_bash_input
+
+execute_cmd.c, jobs.c, nojobs.c
+       - changed calls to unset_bash_input to add appropriate argument
+
+input.h
+       - #undef B_* before defining them as flag values for b_flags.  Some
+         systems, like SVR4, have a B_ERROR define in a file included by
+         jobs.c and nojobs.c, and it causes a warning
+
+                                  7/31
+                                  ----
+fnmatch.c
+       - rewrote most of fnmatch(), so that it now implements ksh-88 style
+         pattern matching (`[@+*?!](patlist)') if the FNM_EXTMATCH flag
+         is set
+
+fnmatch.h
+       - added a define for FNM_EXTMATCH
+
+                                   8/4
+                                   ---
+lib/readline/display.c
+       - fixed _rl_redisplay_after_sigwinch () so that it really redisplays
+         only the portion after the final newline of a multi-line prompt
+         [in bash-2.01.1]
+
+bashline.c
+       - attempt_shell_completion no longer returns matches if a glob pattern
+         matches more than one filename -- it caused too many problems
+         [in bash-2.01.1]
+
+                                   8/5
+                                   ---
+lib/glob/glob.c
+       - updated glob_pattern_p so that the extended matching operators
+         are recognized
+
+pathexp.c
+       - udpated unquoted_glob_pattern_p so that the extended matching
+         operators are recognized
+       - udpated quote_globbing_chars so that the extended matching
+         operators are recognized and quoted appropriately
+
+subst.c
+       - updated match_pattern_char so that the extended matching operators
+         are recognized
+
+parse.y
+       - updated read_token_word so that it parses an extended matching
+         pattern as a single word
+
+jobs.c
+       - if a job is suspended with SIGTSTP, and the user has set
+         checkwinsize with `shopt', update the window size
+         [in bash-2.01.1]
+
+pathexp.c, pathexp.h
+       - new global variable, extended_glob, controls whether the extended
+         pattern matching features are enabled
+
+pathexp.h
+       - new define, FNMATCH_EXTFLAG, to be OR'd with other values for
+         flags argument to fnmatch to enable the extended pattern matching
+         features if extended_glob is set
+
+{pathexp,execute_cmd,bashhist,subst,test}.c, builtins/help.def
+       - changed calls to fnmatch to add FNMATCH_EXTFLAG to the flags arg if
+         extended_glob is non-zero
+
+lib/glob/glob.c
+       - changed flags arg passed to fnmatch to include FNM_EXTMATCH if
+         extended_glob is non-zero (#ifdef SHELL)
+
+                                   8/6
+                                   ---
+builtins/shopt.def
+       - added a new `extglob' shell option, controls the value of
+         extended_glob
+
+                                   8/7
+                                   ---
+doc/{bash.{1,html},bashref.texi}
+       - documented new extended pattern matching operators and the `extglob'
+         shell option
+
+tests/{extglob.{tests,right},run-extglob}
+       - test suite for the new extended globbing features
+
+                                   8/8
+                                   ---
+parse.y, pathexp.h, lib/glob/fnmatch.c
+       - made the extended globbing code #ifdef EXTENDED_GLOB
+
+config.h.in
+       - added a line for EXTENDED_GLOB, controlled by configure
+
+configure.in
+       - new option, --enable-extended-glob, controls defining of
+         EXTENDED_GLOB (on by default)
+
+doc/bashref.texi
+       - documented new `configure' `--enable-extended-glob' option
+
+                                  8/11
+                                  ----
+builtins/printf.def
+       - new `printf' builtin, implemented according to POSIX.2 spec
+         for printf(1)
+
+Makefile.in,builtins/Makefile.in
+       - added necessary stuff for new printf builtin
+
+                                  8/12
+                                  ----
+lib/readline/isearch.c
+       - change to make ^G interrupt the incremental search correctly
+         [in bash-2.01.1]
+
+configure.in, config.h.in
+       - configure now checks for the availability of strtoul(3)
+
+builtins/printf.def
+       - use strtoul for the `%o', `%u', `%x', and `%X' formats if it
+         is available
+
+                                  8/13
+                                  ----
+tests/{printf.{right,tests},run-printf}
+       - extensive test suite for the new `printf' builtin
+
+builtins/Makefile.in
+       - change so that `builtext.h' is not recreated every time the source
+         file for a builtin is changed if the contents are the same.  This
+         keeps many files from being recompiled
+
+                                  8/14
+                                  ----
+subst.c
+       - changed verify_substring_values so that it returns -1 for substring
+         range errors, 0 for expression errors, and 1 for success
+         [in bash-2.01.1]
+       - changed parameter_brace_substring to return an error if
+         verify_substring_values returns 0, and a null string if it returns
+         -1.  This matches the ksh93 behavior
+         [in bash-2.01.1]
+
+trap.c
+       - changed decode_signal so that it makes sure the first three
+         characters of a signal name are `SIG' before allowing the `SIG'
+         prefix to be omitted.  This is so a signal spec of `T' does not
+         match `EXIT', for instance
+         [in bash-2.01.1]
+
+builtins/trap.def
+       - make sure that showtrap() displays traps for signals with unknown
+         names using the signal number
+         [in bash-2.01.1]
+shell.c
+       - make sure that `bash -r' doesn't turn on the restricted mode until
+         after the startup files are executed
+         [in bash-2.01.1]
+
+doc/{bash.{1,html},bashref.texi}
+       - documented printf builtin
+
+                                  8/15
+                                  ----
+general.c
+       - added \xNNN escape to ansicstr -- NNN are up to three hex digits.
+         This affects $'...', `echo -e', and printf
+
+builtins/printf.def
+       - added \xNNN escape to bexpand -- NNN are up to three hex digits.
+         This affects printf's `%b' conversion specifier
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new \xNNN escape sequence for echo, $'...', and printf
+
+builtins/setattr.def
+       - make sure that a variable found in the temp environment does not
+         cause a null string to be assigned by bind_variable (e.g.,
+               foo="" export foo
+         )
+         [in bash-2.01.1]
+
+                                  8/18
+                                  ----
+subst.c
+       - fixed a bug that sometimes caused bad memory (pointer into an
+         allocated block) to be passed to free when doing arithmetic
+         substitution.  Bug report from stevet@myofb.org
+         [in bash-2.01.1]
+
+                                  8/19
+                                  ----
+subst.c
+       - considerable changes:  moved the code that expands a single
+         $... parameter expansion into a separate function: param_expand()
+         This function returns a string, which may contain characters
+         quoted with CTLESC or CTLNUL without doing word splitting
+       - changed expand_word_internal to not remove the expansion of "$*"
+         if the number of positional parameters is > 0
+       - changed the '"' case of expand_word_internal to remove quoted
+         nulls from the resultant word if the expansion was not "$@", and
+         the word is not a quoted null string ([] == CTLNUL, [1] == '\0')
+
+subst.c, variables.c
+       - moved the code that handles special variables from subst.c to
+         variables.c
+
+                                  8/20
+                                  ----
+subst.c
+       - rearranged the source a bit to group functions with similar
+         operation together
+       - fixed parameter_brace_expand so that it no longer allows
+         indirect expansion of `special' variables
+       - fixed parameter_brace_expand so taking the length of some of
+         the shell's special parameters works again
+       - moved all of the code that computes the length of a shell
+         parameter (the ${#xxx} expansion) into parameter_brace_expand_length.
+         Previously, the code that handled the lengths of the shell's
+         special parameters was in parameter_brace_expand_word
+       - valid indirect expansions are now only variable names or positional
+         parameters
+
+                                  8/21
+                                  ----
+subst.c
+       - fixed param_expand to raise an expansion error if $! is being
+         expanded and no asynchronous processes have been created
+       - an expression error in a $((...)) arithmetic expansion now causes
+         a non-interactive shell running in POSIX mode to exit
+       - relaxed change of 8/20 to allow indirect references to $#, $@, $*
+
+builtins/bashref.texi
+       - documented new posix-mode exit on invalid expressions in $((...))
+
+lib/readline/complete.c
+       - don't call rl_strpbrk unless rl_filename_quote_characters is not
+         NULL -- strpbrk requires non-NULL arguments
+         [in bash-2.01.1]
+
+                                  8/22
+                                  ----
+bashline.c
+       - don't make `history-expand-line' a bindable command unless
+         BANG_HISTORY is defined, and don't compile the code for that
+         command in unless BANG_HISTORY is defined
+       - make history_expand_line(), tcsh_magic_space(), alias_expand_line(),
+         and history_and_alias_expand_line() int-returning functions that
+         return 0 for success and non-zero on error.  This allows
+         tcsh_magic_space() to just call history_expand_line() and insert
+         a space if that returns successfully
+       - `magic-space' is now a bindable readline command
+
+doc/bash.{1,html}, lib/readline/doc/rluser.texinfo
+       - documented new `magic-space' bindable readline command
+
+                                  8/25
+                                  ----
+parse.y
+       - fixed decode_prompt_string so that values of $PWD longer than
+         PATH_MAX don't cause buffer overruns (char t_string[PATH_MAX])
+         [in bash-2.01.1]
+
+general.c
+       - fixed polite_directory_format so that values of $HOME longer
+         than PATH_MAX don't cause buffer overruns (char tdir[PATH_MAX])
+         [in bash-2.01.1]
+
+subst.c
+       - fix to expansion of $* so that the positional parameters are
+         separated by the first character of $IFS, even when the expansion
+         is not within double quotes, so the correct split is still
+         performed even when IFS does not contain a space.  Works for
+         ${*}, too
+       - fix to expansion of $@ so that the positional parameters are
+         separated by the first character of $IFS, even when the expansion
+         is not within double quotes, so the correct split is still
+         performed even when IFS does not contain a space.  Works for
+         ${@}, too
+       - new function, string_list_dollar_at(), which is to $@ as
+         string_list_dollar_star is to $*
+       - fixed expansion of $@ so that splitting is still done even if
+         IFS is unset or NULL, as POSIX.2 specifies (section 3.5.2)
+       - fixed expansion of $* so that it expands to multiple words if there
+         is more than one positional parameter, just like $@, even if
+         IFS is unset or NULL
+       - new function list_quote_escapes, quotes (with CTLESC) all
+         CTLESC and CTLNUL characters in each member of the list
+
+tests/dollar-{at,star}.sh
+       - combined into dollar-at-star, changed run-dollars accordingly
+
+                                  8/26
+                                  ----
+Makefile.in
+       - make the `tests' target use $(SHELL) instead of hardcoding `sh'
+
+                                  8/29
+                                  ----
+subst.c
+       - expand_word_list_internal now takes a flags word as the second
+         argument, telling which expansions to perform on the WORD_LIST
+       - broke expand_word_list_internal into several functions: one
+         each to do brace expansion, glob expansion, and the `normal'
+         shell expansions
+       - new extern function: expand_words_shellexp() to perform the
+         `normal' shell expansions on a WORD_LIST
+
+subst.h
+       - extern declaration for expand_words_shellexp
+
+bashline.c
+       - fixed a problem with attempt_shell_completion where it attempted
+         to refer to rl_line_buffer[-1] (completion at the start of the
+         line, which means that ti == -1, which means that the test for
+         rl_line_buffer[ti] at line 715 was an array bounds error
+         [in bash-2.01.1]
+
+eval.c
+       - new function, parse_string_to_word_list(), which takes a string
+         and runs it through the parser, returning the resultant word
+         list
+
+externs.h
+       - new extern declaration for parse_string_to_word_list()
+
+variables.c
+       - change assign_array_var_from_string to first split the string
+         between the parens on whitespace, then expand the resultant
+         list of words with all the shell expansions before doing the
+         assignment
+
+                                   9/4
+                                   ---
+redir.c, redir.h
+       - redirection_error is no longer a static function
+
+builtins/evalstring.c
+       - changes to handle $( < filename ) (equivalent to $(cat filename))
+         as in ksh
+
+lib/readline/bind.c
+       - added two new functions: rl_unbind_function_in_map(func, map),
+         which unbinds all keys that execute FUNC in MAP; and
+         rl_unbind_command_in_map(command, map), which unbinds all keys
+         bound to COMMAND in MAP
+
+lib/readline/readline.h
+       - extern declarations for rl_unbind_{function,command}_in_map
+
+lib/readline/doc/rltech.texi
+       - documented rl_unbind_{function,command}_in_map
+
+builtins/bind.def
+       - added a new option, -u FUNCNAME, which unbinds all key sequences
+         bound to FUNCNAME in the specified (or current) keymap
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new $( < filename ) command substitution
+       - documented new bind -u FUNCNAME option
+
+                                   9/5
+                                   ---
+shell.c
+       - send SIGHUP to all jobs when an interactive login shell exits if
+         the variable `hup_on_exit' is non-zero
+       - modified run_startup_files so that if `NON_INTERACTIVE_LOGIN_SHELLS'
+         is #define'd (perhaps in config.h.top, though there is nothing there
+         for it), all login shells (interactive and non-interactive) run
+         /etc/profile and one of the per-user login shell startup files
+
+builtins/shopt.def
+       - new shopt option `huponexit' to control the value of hup_on_exit
+
+doc/{bash.{1,html},bashref.texi}
+       - documented new `huponexit' shell option
+
+                                   9/8
+                                   ---
+builtins/common.c
+       - changed contains_shell_metas to return 1 if a tilde appears at the
+         start of a string or after a `=' or `:'
+       - changed backslash_quote to quote a tilde if it appears at the start
+         of a string or after a `=' or `:'
+
+lib/readline/complete.c
+       - moved rl_tilde_expand to util.c; it doesn't really have anything
+         to do with completion
+       - moved insert_text to readline.c, renamed it _rl_replace_text (since
+         that's really what it does), changed callers
+       - moved code that postprocesses the list of completion matches into
+         a new function: postprocess_matches
+       - new implementation of tcsh-like menu completion in a single new
+         function: rl_menu_complete
+
+lib/readline/{funmap.c,readline.h}
+       - necessary declarations for binding rl_menu_complete to the
+         new `menu-complete' command
+
+doc/{bash.{1,html},readline.3}, lib/readline/doc/rluser.texinfo
+       - documented new `menu-complete' bindable readline command
+
+                                   9/9
+                                   ---
+jobs.c
+       - delete_job should print a warning only if subshell_environment
+         is 0, so we don't print bogus warnings when shell scripts without
+         a leading #! are executed
+
+                                  9/10
+                                  ----
+builtins/read.def
+       - fixed the code so that the `read' is automatically restarted when
+         it returns -1 with errno == EINTR.  SIGINT is handled by the
+         interrupt handler, since interrupt_immediately is set to 1, so
+         this handles things like SIGCHLD
+         [in bash-2.01.1]
+
+                                  9/11
+                                  ----
+test.c
+       - reorganized the code slightly to make it easier to add the ksh-like
+         [[...]] compound command
+
+test.h
+       - new file, with extern declarations for functions available in test.c
+
+externs.h
+       - moved declaration of test_command to test.h
+
+builtins/test.def
+       - include `test.h'
+
+                                  9/16
+                                  ----
+{command,make_cmd,dispose_cmd,externs,subst}.h
+parse.y, subst.c
+{make,dispose,copy,print,execute}_cmd.c
+       - changes to add the new ksh-93 compatible [[...]] conditional command
+
+configure.in
+       - new enable option, --enable-cond-command, to compile in the [[...]]
+         command code
+
+config.h.in
+       - new #define, COND_COMMAND, to compile in the [[...]] command code
+
+tests/{run-cond,cond.{tests,right}}
+       - test suite for the new [[...]] command
+
+{builtins,lib/{readline,glob,tilde}}/Makefile.in
+       - explicit dependencies for .o files on .c files for losing makes
+         like Solaris
+
+doc/{bash.{1,html},bashref.texi}
+       - documented the new `[[' compound command
+       - documented the test/[ builtin behavior based on the number of
+         arguments in the description of the builtin
+       - made a new section for conditional expressions that just lists
+         the available primaries -- the connectives and other operators
+         are listed in the description of the [[ command and the test/[
+         builtin
+
+                                  9/18
+                                  ----
+builtins/set.def
+       - minus_o_option_commands is now a global function so the shopt
+         code can use it
+       - minus_o_option_commands now takes an argument telling it which
+         options to print, just like list_minus_o_options
+       - new function, print_minus_o_option, which prints the value of
+         a `set -o' option either in the traditional format or in the
+         format used by `set +o'
+       - changed list_minus_o_opts and minus_o_option_commands to call
+         print_minus_o_option
+
+builtins/shopt.def
+       - `shopt -p' now causes output to be printed in a format reusable
+         as input (the format is a series of shopt commands, like the
+         output of `set +o')
+       - fixed a bug that made `shopt -so' and `shopt -uo' not work
+       - fixed list_shopt_o_options so that `shopt -op' acts like `set +o'
+       - fixed list_shopt_o_options to that `shopt -op optname' prints the
+         value of optname in a reusable format
+       - fixed list_some_o_options so that `shopt -ops' and `shopt -opu'
+         work and display output in a reusable format
+
+                                  9/19
+                                  ----
+doc/{bash.{1,html},bashref.texi}
+       - documented new `shopt -p' behavior
+
+shell.c
+       - made `bash +o' display the same output as `set +o' and then
+         start an interactive shell (previously `bash -o' and `bash +o'
+         displayed the same thing)
+
+builtins/common.h
+       - added prototypes to the extern function declarations
+
+                                  9/22
+                                  ----
+builtins/evalstring.c
+       - fixed the DISCARD case of the jump_to_top_level so that it
+         doesn't try to call dispose_command(command) after the
+         `pe_dispose' unwind frame gets run, since that disposes the
+         command
+
+                                  9/23
+                                  ----
+test.[ch]
+       - test_eaccess is now a global function so that globbing code can
+         use it
+
+lib/glob/glob.c
+       - rewrote glob_vector to be slightly more efficient and to not
+         read the directory if the filename pattern does not contain
+         any globbing chars.  This satisfies the POSIX requirement that
+         read permission is not required for a directory when the
+         pathname component does not contain a pattern character (bug
+         reported by jsm28@cam.ac.uk)
+
+subst.c
+       - fixed parameter_brace_expand so that ${array[@]} and ${array[*]}
+         behave correctly when IFS is unset or set to something that does
+         not contain a space (they should result in separate words, just
+         like $@ and $*)
+
+tests/{run-array2,array-at-star,array2.right}
+       - tests for the expansions of ${array[@]} and ${array[*]}, derived
+         from the tests in dollar-at-star
+
+                                  9/24
+                                  ----
+jobs.c
+       - fixed cleanup_dead_jobs so that it doesn't remove the job
+         containing last_asynchronous_pid from the job table.  This
+         fixes the POSIX.2 `wait' requirement problem
+
+                                  9/25
+                                  ----
+parse.y
+       - added `\r' escape sequence to the prompt expansion code
+
+lib/readline/chardefs.h
+       - added defines for ISOCTAL, OCTVALUE, isxdigit (if not defined),
+         and HEXVALUE
+
+lib/readline/bind.c
+       - added `normal' echo/printf-like backslash escapes to the
+         key sequence translation code, with the addition that \d
+         expands to RUBOUT.  This means that key sequence definitions
+         (before the `:') and macro values may contain these special
+         backslash-escape sequences
+       - now that we can translate octal escape sequences in key bindings,
+         change _rl_get_keyname so that it turns characters with values
+         128-159 inclusive into octal escape sequences (\200-\237), since
+         those characters are not ASCII or ISO Latin 1
+
+doc/{bash.{1,html},readline.3}, lib/readline/doc/rluser.texinfo
+       - documented new backslash escapes for readline key sequence and
+         macro translation
+
+builtins/pushd.def
+       - new function, get_dirstack_from_string(char *string), returns an
+         element from the directory stack or null, treating the argument
+         exactly as `dirs string' would, with the exception that if
+         the first character of `string' is not `+' or `-', a `+' is
+         assumed
+
+builtins/common.h
+       - new extern declaration for get_dirstack_from_string
+
+general.c
+       - added code to bash_special_tilde_expansions to get the expansion
+         using get_dirstack_from_string() if the first character of the
+         tilde-prefix is a digit or the first character is a `+' or `-'
+         and the second is a digit
+
+tests/dstack.{tests,right}
+       - renamed from dirstack.{tests,right}
+
+tests/dtack2.{tests,right}
+       - new tests for the directory stack tilde expansion code
+
+tests/run-dirstack
+       - now runs both dstack and dstack2
+
+                                  10/3
+                                  ----
+trap.c
+       - reordered header file inclusion for irix 4
+
+execute_cmd.c
+       - fixed select_query so that a reply that is not a number is treated
+         the same as a numeric reply that is out of range
+
+lib/readline/util.c
+       - added a backwards-compatibility definition of _rl_savestring()
+
+builtins/set.def
+       - initialize_shell_options now takes an argument saying whether or
+         not we should parse $SHELLOPTS from the environment.  The shell
+         does not parse the value if it's restricted, running setuid, or
+         running in `privileged mode'
+
+shell.c
+       - change call to initialize_shell_options to add the correct argument
+
+builtins/common.h
+       - changed extern declaration for initialize_shell_options
+
+doc/{bash.{1,html},bashref.texi}
+       - added note that the shell ignores $SHELLOPTS in the environment at
+         startup if running in privileged mode
+       - added note that the restricted shell does not parse $SHELLOPTS from
+         the environment at startup
+
+                                  10/6
+                                  ----
+aclocal.m4
+       - change BASH_RLIMIT_TYPE so that it looks for rlim_t in
+         <sys/resource.h> as well as <sys/types.h>, for Solaris 2.6
+       - new macro, BASH_LARGE_FILE_SUPPORT, to enable special compilation
+         options for large files on Solaris 2.6 (from eggert@twinsun.com)
+
+mailcheck.c
+       - the `file_size' member of the FILEINFO struct should be of
+         type `off_t'
+       - the `size' variable in file_has_grown should be of type `off_t'
+       - the RESET_MAIL_FILE macro should initialize file_size to 0, not 0L
+
+builtins/Makefile.in
+       - LDFLAGS and LOCAL_LDFLAGS are now set by configure
+       - `mkbuiltins' is now created from `mkbuiltins.o' instead of directly
+         from the source to the executable
+
+builtins/evalfile.c
+       - fixed _evalfile so that it handles large files correctly on
+         systems where the st_size member of `struct stat' will not fit
+         into an `int'
+
+builtins/mkbuiltins.c
+       - don't assume that st_size fits into an int
+
+input.[ch]
+       - the `b_size' member of a struct BSTREAM is now of type `size_t'
+       - changed third argument to make_buffered_stream to size_t; changed
+         caller
+       - changed `size' variable in fd_to_buffered_stream to type `size_t'
+
+general.h
+       - include <sys/resource.h> if HAVE_SYS_RESOURCE_H and RLIMTYPE are
+         both defined, for possible necessary definition of RLIMTYPE
+         (e.g., on Solaris 2.6)
+
+{execute_cmd,jobs}.c, builtins/times.def
+       - don't include <sys/resource.h> explicitly if RLIMTYPE is defined,
+         since general.h will include it in that case
+
+lib/readline/bind.c
+       - new function, char *_rl_read_file(filename, sizep), which reads
+         FILENAME into a malloced buffer, returning the buffer and the
+         size of the buffer in *SIZEP
+
+lib/readline/histfile.c
+       - changed read_history_range and history_truncate_file to handle
+         large files
+
+hashcmd.c
+       - find_hashed_filename should not add `./' to the front of a pathname
+         that already begins with `./'
+
+                                  10/8
+                                  ----
+support/config.sub
+       - recognize `hppa2.0' as a valid machine architecture
+
+aclocal.m4
+       - changed BASH_CHECK_LIB_TERMCAP so that `gnutermcap' is not chosen
+         if `$prefer_curses' is set to something
+
+bashhist.c
+       - don't use HISTCONTROL or HISTIGNORE to remove lines from the
+         second and subsequent lines of a multi-line command
+         (current_command_line_count > 1).  Old code did this only when
+         command-oriented-history was enabled
+
+doc/{bash.{1,html},bashref.texi}
+       - changed descriptions of HISTCONTROL and HISTIGNORE to state that
+         these variables are not applied to the second and subsequent
+         lines of a multi-line command
+
+builtins/hash.def, {copy,dispose}_cmd.c
+       - include "bashtypes.h" -- cray machines need it because of their
+         oddball definition of `word'
+
+configure.in
+       - changed check of ${host_cpu} to check for `*cray*' and `*Cray*'
+         when deciding whether to include the GNU malloc, since it
+         seems that ${host_cpu} gets set to `CrayYMP'
+
+                                  10/9
+                                  ----
+configure.in
+       - look for strtod and strtol in libc
+       - make lib/sh directory in build directory if not there
+       - create lib/sh/Makefile
+
+config.h.in
+       - added HAVE_STRTOD and HAVE_STRTOL
+
+Makefile.in
+       - changes for lib/sh/libsh.a (shell library)
+
+builtins/printf.def
+       - took out the `#ifdef STRTOUL' code, since strtoul is in libsh.a,
+         and will be resolved from there if it's not in libc
+
+variables.c
+       - call strtol() instead of string_to_long()
+
+general.c, general.h
+       - removed string_to_long
+       - changed legal_number to use strtol so it correctly sets errno
+         to ERANGE on overflow
+       - moved bash_getcwd_errstr here from lib/sh/oslib.c
+
+externs.h
+       - moved extern declarations for functions defined in libsh to a
+         separate section of the file, added extern declarations for
+         other functions in libsh
+
+builtins/ulimit.def
+       - changed macro definition for string_to_rlimtype to call strtol
+         directly instead of string_to_long
+
+lib/sh/clktck.c
+       - moved get_clock_tck to its own file, since it's compiled in
+         unconditionally
+
+                                  10/10
+                                  -----
+lib/sh/getenv.c
+       - moved getenv() and __getenv() here from lib/sh/oslib.c
+
+lib/sh/{setlinebuf,strerror,strcasecmp}.c
+       - moved {setlinebuf,strerror,strcasecmp}() from oslib.c to
+         individual files
+
+lib/sh/Makefile.in, Makefile.in
+       - changes for new files in lib/sh
+
+aclocal.m4
+       - new macro BASH_SYS_RESTARTABLE_SYSCALLS, which does what
+         AC_SYS_RESTARTABLE_SYSCALLS does, but using posix sigaction()
+
+configure.in
+       - call BASH_SYS_RESTARTABLE_SYSCALLS if ac_cv_sys_restartable_syscalls
+         is `no'
+
+                                  10/13
+                                  -----
+builtins/jobs.def
+       - catch out-of-range jobs better in disown_builtin
+
+configure.in
+       - don't build with GNU malloc on cygwin32
+
+trap.c
+       - change signal_name to handle the case where signal_names[sig] is
+         NULL, which can happen on cygwin32
+
+execute_cmd.c
+       - changes to do_piping to make pipes text mode (O_TEXT) on cygwin32
+
+cross-build
+       - new directory with cache files and other stuff for cross-compiling
+         bash (currently only for building for cygwin32 on a Unix machine)
+
+cross-build/cygwin32.cache
+       - new file containing configuration variable assignments for
+         cygwin32 that would otherwise require a default case for AC_TRY_RUN
+
+configure.in
+       - source ${srcdir}/cross-build/cygwin32.cache on CYGWIN32 systems
+         if we're cross-compiling on a unix machine
+       - set $CC_FOR_BUILD for cygwin32 cross-compiling environment
+
+Makefile.in
+       - CC_FOR_BUILD is now a variable set by configure
+
+builtins/mkbuiltins.c
+       - only check for read(2) returning <= 0 in extract_info() (error
+         and exit on < 0, warning and return on == 0)
+
+builtins/evalfile.c
+       - only check for read(2) returning <= 0 in _evalfile() (error and
+         and failure return on < 0, success on == 0 while short-circuting
+         rest of operation)
+
+                                  10/14
+                                  -----
+
+vprint.c
+       - moved to lib/sh/vprint.c
+
+lib/sh/Makefile.in
+       - added entries for vprint.[co] in the appropriate places
+
+cross-build/win32sig.h
+       - a version of signames.h for cross-compiling for the CYGWIN32
+         environment on a Unix machine (from noer@cygnus.com)
+
+aclocal.m4
+       - made all cases of AC_TRY_RUN and AC_TRY_COMPILE have reasonable
+         default cases for cross-compiling, and tell the user what they are
+
+Makefile.in
+       - removed vprint.c from shell sources and vprint.o from shell
+         objects
+       - added a level of indirection for signames.h -- the variable
+         SIGNAMES_H is set by configure to either `lsignames.h' or
+         a file for a cross-compilation environment (currently only
+         the cygwin32 stuff is supported).  Then that file is copied
+         to `signames.h'.  `lsignames.h' is created by `mksignames' as
+         was previously used to create signames.h directly
+
+configure.in
+       - set SIGNAMES_H to either `$(srcdir)/cross-build/win32sig.h' or
+         `lsignames.h' as appropriate, substitute into Makefile
+
+                                  10/15
+                                  -----
+builtins/Makefile.in
+       - CC_FOR_BUILD is now set by configure and used to build mkbuiltins
+         and psize.aux
+
+variables.h
+       - new variable attribute `att_tempvar', set if the SHELL_VAR * was
+         constructed on the fly from the temporary environment
+
+variables.c
+       - find_name_in_env_array now sets the `att_tempvar' attribute on
+         the SHELL_VAR it creates
+
+findcmd.c
+       - search_for_command now disposes the SHELL_VAR created by searching
+         the temporary environment for $PATH, if it is found there
+       - _find_user_command_internal also disposes of the SHELL_VAR if it
+         has the `att_tempvar' attribute set
+
+builtins/setattr.c
+       - show_name_attributes looks in the temporary environemnt, so it needs
+         to dispose the SHELL_VAR if it has the att_tempvar attribute set
+
+subst.c
+       - parameter_brace_expand_word now disposes of the SHELL_VAR returned
+         by find_variable if it has the att_tempvar attribute set
+       - ditto for param_expand and word_split
+
+builtins/kill.def
+       - disallow null pid arguments instead of treating them as 0
+       - display a usage message and return failure if no pid or job
+         arguments are supplied
+
+                                  10/16
+                                  -----
+builtins/declare.def
+       - make `var=value declare -x var' behave the same as
+         `var=value export var' and `var=value declare -r var' behave the
+         same as `var=value readonly var', now that we have the `tempvar'
+         attribute
+
+                                  10/22
+                                  -----
+jobs.c
+       - non-interactive shells shouldn't report jobs killed by a SIGINT,
+         even if the standard output is to a terminal
+       - pretty_print_job should add a CR at the end of its output if the
+         shell is interactive and asynchronous notification is being
+         performed.  This fixes the problem with extra CRs in the output
+         of $(jobs)
+
+general.c
+       - changed canonicalize_pathname to change `//' into `/', but leave
+         other pathnames starting with two consecutive slashes alone
+
+                                  10/27
+                                  -----
+
+lib/readline/histexpand.c
+       - fixed history_expand so that the appearance of the history
+         comment character at the beginning of a word inhibits history
+         expansion for the rest of the line
+
+                                  10/29
+                                  -----
+jobs.c,variables.c
+       - moved set_pipestatus_array to variables.c
+
+variables.c
+       - new function, set_pipestatus_from_exit(int), which sets the
+         PIPESTATUS variable from a command's exit status
+
+variables.h
+       - extern declarations for set_pipestatus_from_exit and
+         set_pipestatus_array
+
+execute_cmd.c
+       - fixed execute_simple_command to call set_pipestatus_from_exit
+         if a foreground builtin or function, or a foreground null
+         command is executed
+
+                                  10/31
+                                  -----
+shell.c
+       - fixed run_startup_files to detect being run by sshd, and treat
+         that case as equivalent to being run by rshd
+
+                                  11/3
+                                  ----
+builtins/set.def
+       - make sure `set -a' doesn't cause SHELLOPTS to be exported when
+         a change is made to one of the shell options
+
+                                  11/4
+                                  ----
+pathexp.c
+       - fix to shell_glob_filename in the code that uses a POSIX glob
+         library
+
+                                  11/5
+                                  ----
+jobs.c
+       - fix cleanup_dead_jobs to hang onto the job corresponding to
+         last_asynchronous_pid only if the shell is not interactive
+         (this still has the problem that until a new async process
+         is started, the job will stay in the jobs table)
+
+configure.in,aclocal.m4
+       - added a new macro, BASH_TYPE_U_INT32_T, to check for u_int32_t
+         separately from int32_t, since there are systems (HP-UX 10.20)
+         that have a define for the latter but not the former
+
+                                  11/6
+                                  ----
+jobs.c
+       - cleanup_dead_jobs no longer checks whether the job it is deleting
+         corresponds to last_asynchronous_pid
+       - notify_of_job_status and mark_dead_jobs_as_notified now will not
+         mark the job corresponding to last_asynchronous_pid as notified
+         if the shell is not interactive
+       - wait_for_single_pid, if told to wait for last_asynchronous_pid,
+         or the job of which it is a member, will take care of marking
+         the job as notified after calling wait_for and collecting the
+         status.  This means that two successive `wait' calls for $! will
+         succeed the first time and fail the second, as POSIX.2 specifies
+         (take this code out if it causes problems)
+
+                                  11/7
+                                  ----
+jobs.c
+       - wait_for_job, if told to wait for the job corresponding to the
+         last async pid, will mark the job as notified after waiting for
+         it and collecting the status
+
+general.h
+       - fixed MEMBER macro to avoid reading past end of S (it used to
+         test s[1] before s[0], which is an error if s == "")
+
+subst.c
+       - expand_word_internal should free ISTRING before returning if
+         param_expand returns an error
+       - parameter_brace_expand_word should free the memory it allocates
+         and passes to param_expand
+
+execute_cmd.c
+       - execute_arith_command should call dispose_words on the list
+         returned by expand_words
+
+parse.y
+       - after calling parse_arith_command, read_token needs to free the
+         string value that parse_arith_command fills in, since make_word
+         makes a copy of the string it's passed
+
+                                  11/10
+                                  -----
+subst.c
+       - cond_expand_word needs to free the value returned by string_list
+         after it is run through quote_string_for_globbing
+
+parse.y
+       - make sure cond_term frees yylval.word if it is just a `!' and
+         it's parsed as a term negation operator
+
+variables.c
+       - assign_array_var_from_string needs to free the word list returned
+         by parse_string_to_word_list after calling expand_words_shellexp
+         on it
+
+execute_cmd.c
+       - changed execute_simple_command to avoid saving the_printed_command
+         into command_line until just before it's needed.  This should save
+         time and prevent memory leaks on errors, but it must be watched
+         closely to make sure that the_printed_command doesn't change out
+         from under execute_simple_command before we copy it
+
+                                  11/12
+                                  -----
+builtins/alias.def
+       - alias and unalias should print error messages when passed an
+         argument that is not an alias for printing or deletion,
+         respectively, even if the shell is not interactive
+
+builtins/exit.def
+       - `logout' will no longer exit a non-login non-interactive shell
+
+                                  11/17
+                                  -----
+lib/readline/nls.c
+       - add `koi8-r' as a legal LANG value
+
+builtins/alias.def
+       - if `alias' or `alias -p' is executed when no aliases are defined,
+         the return status should be 0, according to POSIX.2
+
+                                  11/18
+                                  -----
+subst.c
+       - changed a couple of calls to make_word_list (make_word(z), ...)
+         to add_string_to_list (z, ...)
+
+execute_cmd.c
+       - execute_cond_command now sets this_command_name to `[['
+
+                                  11/21
+                                  -----
+variables.c
+       - all_visible_{function,variable}s and the functions they call
+         should be compiled in only if READLINE is defined
+
+                                  11/24
+                                  -----
+aclocal.m4
+       - remove some leading whitespace before preprocessor statements in
+         BASH_KERNEL_RLIMIT_CHECK
+
+general.[ch]
+       - fix declarations for group_member so the extern declaration in
+         general.h agrees with the definition in general.c (fix from
+         Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>)
+
+builtins/cd.def
+       - print the new working directory if the shell is interactive
+         and `cd -' succeeds
+       - don't print the new working directory if it's found in $CDPATH
+         if the shell is not interactive
+
+                                  11/25
+                                  -----
+builtins/cd.def
+       - fixes to bindpwd so that it copes with get_working_directory
+         returning NULL (bug from schwab@issan.informatik.uni-dortmund.de)
+
+                                  12/2
+                                  ----
+support/config.guess
+       - add support for new OS name for SINIX SVR4 systems
+
+                                  12/3
+                                  ----
+
+builtins/set.def
+       - `unset' should check that a function it's trying to unset is a
+         legal identifier only when in POSIX mode
+
+redir.c
+       - changed here_document_to_fd to try and make sure the filename
+         used for the here document is `more unique', since the old
+         version would fail if two here documents were created in less
+         than a second
+
+                                  12/4
+                                  ----
+builtins/cd.def
+       - POSIX.2 says that if CDPATH is used to find the new directory,
+         and it's not relative to the current directory, the new directory
+         name should be displayed on stdout even if the shell is not
+         interactive
+
+                                  12/5
+                                  ----
+parse.y
+       - changes so that `time' is recognized as a reserved word only at
+         the beginning of a pipeline (the last read token is one of 0,
+         `;', `\n', `&&', `||', or `&'):
+
+               o add clause to special_case_tokens that does the check
+                 and returns TIME if the conditions are met
+               o take check for `TIME' out of CHECK_FOR_RESERVED_WORD, but
+                 leave it in the word_token_alist so that `type' still
+                 reports it as a `keyword'
+               o new function, time_command_acceptable(), encapsulates the
+                 necessary conditions for `time' to be returned as a 
+                 reserved word
+
+[bash-2.02-alpha1 frozen]
+
+                                1/6/1998
+                                --------
+lib/glob/fnmatch.c
+       - fix define for isgraph so that it does not return success for space
+       - fix strcompare() so that the call to strcoll is surrounded by
+         #ifdef HAVE_STRCOLL
+
+                                   1/7
+                                   ---
+lib/glob/fnmatch.c
+       - the `test' argument to brackmatch() should be of type `unsigned char'
+
+                                  1/11
+                                  ----
+execute_cmd.c
+       - make sure execute_arith_command sets this_command_name to `(('
+
+                                  1/29
+                                  ----
+parse.y
+       - make sure the code for pushing and popping strings is compiled in
+         if either ALIAS or DPAREN_ARITHMETIC is defined, because the ((
+         code uses push_string in the case of a nested subshell
+       - fix cond_skip_newlines so it resets the prompt to $PS2 while
+         parsing an unfinished conditional command
+
+dispose_cmd.c, copy_cmd.c, builtins/hash.def
+       - fixes to not use `word' as a variable name or the name of a
+         function parameter to get around stuff in the Cray Unix include
+         files
+
+builtins/printf.def
+       - return failure immediately if an illegal format character is
+         encountered
+
+redir.c
+       - make the code that creates here-documents behave better if the
+         file it's trying to create already exists for some reason
+
+lib/readline/complete.c
+       - changed print_filename to return the number of characters it
+         outputs; changed callers to use that value.  This makes columns
+         line up when printing completion listings with filenames
+         containing control characters
+
+doc/bash.{1,html}
+       - fixed a typo in the quote removal section
+
+                                  1/30
+                                  ----
+parse.y
+       - free_string_list() needs to check that t->expander is not NULL
+         before trying to dereference it
+       - reset_parser() doesn't need to set pushed_string_list to NULL
+         after calling free_string_list(), since free_string_list does it
+
+configure.in,cross-build/cygwin32.cache
+       - fixes from Geoff Noer for better cygwin32 cross-compilation
+
+tests/printf.{tests,right}
+       - removed test for integer overflow, since error messages differ
+         across systems
+
+pathexp.c
+       - fixed a problem with unquoted_glob_pattern_p that made things
+         like `x+*' not expand correctly
+
+lib/glob/glob.c
+       - fixed a problem with glob_pattern_p that made things like `x+*'
+         not expand correctly
+
+builtins/cd.def
+       - if `cd -P' is executed, or `set -o physical' has been executed,
+         the value of $PWD after a successful cd will not contain any
+         symlinks, regardless of whether or not the shell is in posix mode
+
+                                   2/3
+                                   ---
+lib/readline/shell.c
+       - include <string.h> or <strings.h> as appropriate
+
+                                   2/4
+                                   ---
+builtins/common.c
+       - take out the code in backslash_quote() that looks for tildes to
+         quote, for the time being
+       - if getcwd() fails, get_working_directory now prints the error
+         message corresponding to errno in addition to the rest of the
+         information -- TENTATIVE CHANGE
+
+lib/sh/getcwd.c
+       - fix from Paul Smith to make getcwd() behave better in the presence
+         of lstat(2) failures
+
+stringlib.c
+       - when copying the replacement string into the output string being
+         constructed, strsub() needs to make sure enough space for the
+         replacement string is allocated, not the length of the pattern
+         (use REPLEN, not PATLEN)
+
+mailcheck.c
+       - make sure make_default_mailpath() has a valid current_user struct
+         before trying to construct the default mailpath
+
+                                   2/5
+                                   ---
+execute_cmd.c
+       - execute_builtin needs to call run_unwind_frame if the builtin is
+         `source' or `eval' and we're not in a subshell rather than just
+         calling dispose_builtin_env, because not all invocations copy 
+         the temporary_env to builtin_env, and nested calls to `.' require
+         that the temporary env given to the first persist until that first
+         call to `.' finishes
+
+parse.y
+       - fix to history_delimiting_chars so that function definitions like
+
+               function xyz
+               {
+                       echo a
+               }
+
+         are saved to the history correctly when command_oriented_history
+         is enabled, but literal_history is not
+
+bashhist.c
+       - when calling internal_error from pre_process_line, use "%s" as
+         the format with history_value as the argument to avoid the
+         problem with the failed history event containing printf escape
+         sequences
+
+                                  2/13
+                                  ----
+shell.c
+       - if shell_initialized is non-zero, don't line-buffer stderr and
+         stdout in shell_initialize on SunOS5 -- see if this fixes the
+         crashing problems for scripts without a leading `#! /bin/sh'
+
+                                  2/17
+                                  ----
+bashline.c
+       - added diffs to _ignore_completion_names from Andreas Schwab to
+         complete names that would otherwise be ignored with FIGNORE if
+         they are the only possible completions.  Define NO_FORCE_FIGNORE
+         if you want this; it is not defined by default
+
+                                  2/19
+                                  ----
+support/bashbug.sh
+       - changed the bug-bash address to bug-bash@gnu.org
+
+examples/loadables/Makefile.in
+       - converted from `Makefile' with some boilerplate configure variables
+         to find the source and build directories -- still requires some
+         hand-editing to get the right CFLAGS and LDFLAGS for shared object
+         creation
+
+Makefile.in
+       - create examples/loadables/Makefile with `make makefiles'
+
+configure.in
+       - create examples/loadables directory so `make makefiles' can write a
+         makefile there
+
+general.c
+       - make sure initialize_groups_array always sets things up so that
+         ${GROUPS[0]} is the user's primary group (current_user.gid)
+
+                                  2/20
+                                  ----
+lib/readline/parens.c
+       - change the time delay when showing matching parens from 1.5 sec to
+         0.5 sec
+
+                                  2/23
+                                  ----
+shell.c
+       - isnetconn() should call getpeername(fd,...) instead of using 0
+         (though fileno(stdin) should always be 0)
+
+support/config.guess
+       - updates from master FSF copy
+
+                                  2/24
+                                  ----
+support/man2html.c
+       - modified version of man2html to convert bash.1 into bash.html
+
+support/Makefile.in
+       - simple Makefile to create man2html
+
+configure.in
+       - make sure support/Makefile is created
+
+Makefile.in
+       - make sure support/Makefile is created and cleaned
+
+doc/Makefile.in
+       - changes to suffix rules to say how to make .html from .1 
+       - `bash.html' is now a makefile target, created by man2html from
+         bash.1 rather than being hand-modified
+
+lib/sh/itos.c, general.c
+       - new file, itos() from general.c.  This is here because the
+         implementation of strerror in lib/sh/strerror.c uses itos()
+
+Makefile.in, lib/sh/Makefile.in
+       - changes to add itos.c in libsh.a
+
+externs.h, general.h
+       - moved extern declaration of itos() from general.h to externs.h
+
+aclocal.m4
+       - changes to BASH_LARGE_FILE_SUPPORT for the LFS64_* variables in
+         Solaris 2.6
+
+Makefile.in
+       - make sure configure sets CPPFLAGS in this file
+
+                                  2/27
+                                  ----
+
+builtins/command.def
+       - make sure get_standard_path returns the value of
+         STANDARD_UTILS_PATH if _CS_PATH is defined, but confstr(3)
+         returns 0, indicating that _CS_PATH does not have a defined
+         value
+
+bashhist.c
+       - fixed bash_history_inhibit_expansion() so that extended globbing
+         expressions like *.!(c) are not history expanded if extended_glob
+         is non-zero (shopt -s extglob has been executed)
+
+                                   3/2
+                                   ---
+Makefile.in
+       - changed release status to `beta1'
+
+[bash-2.02-beta1 frozen]
+
+                                  3/17
+                                  ----
+lib/readline/vi_mode.c
+       - make sure _rl_vi_save_insert() gets a non-null UNDO_LIST pointer
+         before trying to do anything with it
+
+jobs.c
+       - add a call to internal_warning from wait_for_job if the job is
+         stopped
+       - changed notify_of_job_status to not report pipelines exiting due to
+         SIGPIPE in non-interactive shells if the shell is compiled with
+         -DDONT_REPORT_SIGPIPE
+
+builtins/psize.sh
+       - some fixes to try to avoid /tmp file races and surreptitious
+         substitutions
+
+version.c
+       - changed the extended version info to show 1998 as the copyright year
+
+parse.y
+       - fixes from Andreas Schwab <schwab@LS5.informatik.uni-dortmund.de>
+         for compilation errors when the shell is configured --disable-alias
+         but with dparen arithmetic enabled
+
+eval.c
+       - fixes from Andreas Schwab <schwab@LS5.informatik.uni-dortmund.de> to
+         make sure the input stream is popped correctly when performing an
+         array assignment in the command argument to `bash -c', e.g.,
+         `bash -c 'A=()''
+
+builtins/kill.def
+       - make `kill' with no arguments print a usage message and return a
+         failure status
+
+alias.c
+       - fix so that rd_token doesn't dump core when trying to do alias
+         expansion on a line containing an unclosed single quote (fix from
+         Vasco Pedro <vp@di.fct.unl.pt>)
+
+builtins/cd.def
+       - fix so that using a non-empty directory from CDPATH to construct
+         the name of the directory to change to results in an absolute
+         pathname of the new current working directory being displayed,
+         as POSIX.2 specifies
+
+support/bashbug.sh
+       - a couple of small fixes to minimize /tmp file races -- the script
+         is still raceable, the window is just smaller
+
+                                  3/24
+                                  ----
+variables.c
+       - make sure assign_in_env passes a malloc'd string to
+         expand_string_unsplit, because some of the error code assumes that
+         it is malloc'd and frees it (bug reported by Marko.Makela@HUT.FI)
+
+                                  3/25
+                                  ----
+doc/bashref.texi
+       - changed the email addresses to use the @email texinfo tag
+
+trap.c
+       - call reset_parser from the exit trap code before calling
+         parse_and_execute, so reserved words are parsed correctly
+
+subst.c
+       - make sure parameter_brace_patsub expands the pattern string as if
+         the expression were not in double quotes, even if the entire
+         expansion is enclosed in double quotes, so that quote removal
+         on embedded double quotes is performed correctly (bug report from
+         schwab@issan.informatik.uni-dortmund.de)
+
+                                  3/27
+                                  ----
+support/config.guess
+       - changes to allow Power PCs running Apple's Rhapsody to configure
+
+                                  3/31
+                                  ----
+
+Makefile.in
+       - changed release status to `beta2'
+
+[bash-2.02-beta2 frozen]
+
+                                   4/6
+                                   ---
+subst.c
+       - make sure command_substitute does not try to set the terminal's
+         process group to a background job
+
+[bash-2.02 frozen]
+
+                                  4/18
+                                  ----
+[bash-2.02 released]
+
+                                  4/20
+                                  ----
+bashline.c
+       - make sure that rl_defun is not called for
+         history-and-alias-expand-line unless both ALIAS and BANG_HISTORY
+         are defined
+         [in bash-2.02.1]
+
+                                  4/22
+                                  ----
+make_cmd.c
+       - make sure that make_here_document allocates enough space for the
+         first line of the here document, by using the line length +2
+         (instead of 1000, which is what the old code did, and breaks if
+         the first line of the here document is enough longer than 1000
+         characters to cause other memory to be scribbled on)
+         [in bash-2.02.1]
+
+builtins/cd.def
+       - when in posix mode, a value of "" for CDPATH should be treated the
+         same as the current directory, not result in an error
+         [in bash-2.02.1]
+
+lib/malloc/malloc.c
+       - change the mh_align member of `union mhead' to be of type double
+         rather than a pointer, so that malloc will return (hopefully)
+         8-byte aligned memory
+         [in bash-2.02.1]
+
+                                  4/23
+                                  ----
+aclocal.m4
+       - add a new macro to check whether or not off_t is 64 bits 
+
+                                  4/24
+                                  ----
+configure.in
+       - fixed a typo so the bash malloc is not compiled in on mips-sgi-irix6
+
+lib/readline/display.c
+       - fix for readline redisplay if the prompt string is longer than the
+         screen width and includes invisible characters
+         [in bash-2.02.1]
+
+jobs.c
+       - make_child should not set the terminal's process group to
+         pipeline_pgrp if pipeline_pgrp == shell_pgrp (indicating that we
+         are forking a child for a command substitution)
+         [in bash-2.02.1]
+
+subst.c
+       - in execute_simple_command, in the child forked if there is a pipe
+         or the command is asynchronous, set subshell_environment to
+         SUBSHELL_ASYNC only if the command is asynchronous, SUBSHELL_FORK
+         if there is a pipe in or out
+         [in bash-2.02.1]
+
+                                  4/27
+                                  ----
+support/texi2dvi
+       - upgraded to version 0.8 (from 0.5)
+
+support/texi2html
+       - upgraded to version 1.52 (from 1.51)
+
+support/config.sub
+       - config.sub now recognizes all the permutations of the system name
+         that config.guess produces for alphas
+         [in bash-2.02.1]
+
+aclocal.m4
+       - changed BASH_TYPE_INT32_T, BASH_TYPE_U_INT32_T, and
+         BASH_TYPE_PTRDIFF_T to avoid compiling a program; instead use
+         the values determined by the AC_CHECK_SIZEOF tests to determine
+         the default values to supply to AC_CHECK_TYPE
+
+configure.in
+       - don't call AC_CHECK_TYPE({int32_t,u_int32_t,ptrdiff_t}) from
+         configure.in; use the updated BASH_TYPE macros instead
+
+builtins/exec.def
+       - if shell_execve fails, set ARGS to null because the realloc() call
+         by shell_execve may have caused it to be reallocated and freed --
+         we don't want to free the memory twice
+
+lib/glob/fnmatch.c
+       - fixes from ache@nagual.pp.ru to make fnmatch work for eight-bit
+         characters when `isupper' and `islower' are used -- they were
+         restricted to ASCII characters before, probably to work around
+         some ancient, broken C libraries in which is{low,upp}er are valid
+         only for ASCII characters and return bogus values otherwise
+         [in bash-2.02.1]
+
+                                  4/29
+                                  ----
+builtins/cd.def
+       - fixed a problem with the shell displaying the old working directory
+         instead of the new one after changing to a directory found via
+         $CDPATH when in physical mode (set -o physical)
+         [in bash-2.02.1]
+
+make_cmd.c
+       - make make_cond_command initialize the line number from the cond_node
+         that's passed as an argument (not that it's used right now)
+
+copy_cmd.c
+       - make sure that copy_cond_command copies the type of the cond command,
+         since execute_cond_command uses that to decide what kind of test
+         to perform
+         [in bash-2.02.1]
+
+builtins/printf.def
+       - make sure the for loop that processes the format string actually
+         consumes arguments; otherwise process it only once to avoid
+         infinite loops (e.g., `printf " " abc def ghi')
+         [in bash-2.02.1]
+       - if the format string is empty after preprocessing by ansicstr,
+         return immediately
+         [in bash-2.02.1]
+
+tests/run-printf
+       - use `diff -a' so the presence of a non-printing character in the
+         output doesn't confuse diff into thinking the files are binary
+         (test whether or not `diff' supports `-a' first)
+
+Makefile.in
+       - keep $(LOCAL_LIBS) from being specified twice
+
+                                  4/30
+                                  ----
+support/shobj-conf
+       - a script to generate variables to do shared object configuration
+         for the loadable builtin stuff
+
+configure.in
+       - added a section for shared object configuration using an `eval'
+         of the output of shobj-conf and substituting the generated values
+         with AC_SUBST
+
+examples/loadables/Makefile.in
+       - the system-specific shared object configuration variables are now
+         substituted by configure
+
+                                   5/4
+                                   ---
+builtins/ulimit.def
+       - some changes for HPUX 9.x's peculiar handling of RLIMIT_FILESIZE
+       - changed the limit retrieval functions to return an error code
+         and the value in a reference argument to avoid use of RLIM_INVALID
+
+general.c
+       - new function, get_group_array(), which returns an array of
+         gids
+
+examples/loadables/{id,printenv,sync,uname,whoami,push}.c
+       - new loadable builtins
+
+variables.c
+       - moved code that initializes $PPID into a new function, set_ppid()
+
+variables.h
+       - extern declaration for set_ppid()
+
+                                   5/6
+                                   ---
+subst.c
+       - make sure that the `"' (double-quoted string) case of
+         expand_word_internal calls string_list_dollar_at if we've expanded
+         a double-quoted $@ so correct splitting on $IFS is done when
+         the expansion is complete.  We can't simply call string_list
+         because that forces a space separator, and $IFS may not contain
+         a space
+         [in bash-2.02.1]
+
+                                   5/7
+                                   ---
+builtins/umask.def
+       - broke the code that parses a symbolic mode out of symbolic_umask
+         into a separate function that takes a symbolic mode and an initial
+         set of bits to modify
+
+examples/loadables/mkdir.c
+       - new loadable builtin
+
+                                  5/11
+                                  ----
+builtins/printf.def
+       - use the format string length provided by ansicstr() to process the
+         format string, rather than testing for nullness, to handle NUL
+         bytes in the expanded format string
+
+builtins/pushd.def
+       - changes so it can be built as both a regular builtin and a loadable
+         builtin from the same source
+
+examples/loadables/Makefile.in
+       - changes to build pushd.c from ${topdir}/builtins/pushd.def and then
+         compile it with the correct flags to make it a loadable builtin,
+         even if PUSHD_AND_POPD is not defined in config.h
+
+                                  5/12
+                                  ----
+lib/readline/complete.c
+       - use rl_completer_quote_characters instead of #ifdef SHELL/#endif
+         code in make_quoted_replacement.  This means complete.c no longer
+         has any #ifdef SHELL code
+
+                                  5/13
+                                  ----
+builtins/Makefile.in
+       - `make clean' should remove mkbuiltins.o
+
+Makefile.in
+       - all of the various `clean' targets need to descend into lib/sh
+         and run the appropriate target there
+
+builtins/type.def
+       - changed to use the builtin getopt.  The old long options are
+         handled by prescanning the argument list looking for the long
+         options, processing them, and taking them out of the list before
+         passing it to internal_getopt()
+
+lib/readline/signals.c
+       - removed #ifdef SHELL code -- job control signals and SIGTERM are
+         always set in rl_set_signals, but are set to SIG_IGN if the old
+         handler was SIG_IGN (as bash sets it)
+       - new function rl_maybe_set_sighandler, which sets the signal
+         disposition back to SIG_IGN if the old handler was SIG_IGN
+       - removed #ifdef HANDLE_JOB_SIGNALS and #ifdef HANDLE_SIGTERM code
+
+lib/readline/rltty.c
+       - removed #ifdef SHELL code -- set_winsize is always called
+         to force the application to stop if it's not in the foreground
+         before getting the tty attributes
+
+                                  5/14
+                                  ----
+lib/readline/signals.c
+       - readline now catches SIGQUIT and cleans up the tty before resending
+         it to its container application (unless the calling application has
+         set the disposition of SIGQUIT to be SIG_IGN)
+       - rl_handle_sigwinch is now called rl_sigwinch_handler
+       - rl_sigwinch_handler now calls rl_resize_terminal to fetch the
+         screen size after a SIGWINCH
+       - the sighandler_cxt struct for non-posix systems now includes
+         sa_flags and sa_mask variables, for future use
+       - new variable, rl_catch_signals, indicating that readline should
+         install its own signal handlers for SIGINT, SIGTERM, SIGQUIT,
+         SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU
+       - new variable, rl_catch_sigwinch, indicating that readline should
+         install its own SIGWINCH handler, which will chain to a calling
+         application's SIGWINCH handler
+       - new function, rl_free_line_state(), to free up variable state
+         associated with the current line after receiving a signal
+       - new function, rl_cleanup_after_signal(), to clean up the display
+         and terminal state after receiving a signal
+       - new function, rl_reset_after_signal(), to reinitialize the
+         terminal state after a signal handler returns and readline
+         continues
+       - rl_set_signals and rl_clear_signals now look at the values of
+         rl_catch_signals and rl_catch_sigwinch
+
+lib/readline/terminal.c
+       - new function rl_resize_terminal (), to reset readline's idea of
+         the screen size after a SIGWINCH
+
+lib/readline/readline.h
+       - extern declarations for rl_resize_terminal(), rl_free_line_state(),
+         rl_cleanup_after_signal(), rl_reset_after_signal()
+       - extern declarations for rl_catch_signals and rl_catch_sigwinch
+
+variables.c
+       - new functions, get_env_value(char *) and get_home_dir(void) to
+         satisfy references from the tilde and readline libraries when
+         they are compiled as part of bash
+
+lib/tilde/tilde.c
+       - rely on extern declarations of get_env_value and get_home_dir;
+         there is no more #ifdef SHELL code
+
+lib/readline/shell.c
+       - implementation of get_home_dir that uses getpwuid() to satisfy
+         references from tilde.c when not compiled as part of bash
+       - removed savestring()
+       - removed #ifdef SHELL/#endif pair -- all of these functions will be
+         resolved from bash when readline is linked into bash
+
+lib/readline/savestring.c
+       - new file, with function definition for savestring() for backwards
+         compatibility
+
+Makefile.in, _distribution
+       - bumped things up to bash-2.03-alpha
+
+                                  5/15
+                                  ----
+lib/readline/rlconf.h
+       - removed #ifdef SHELL/#endif pair, so the callback stuff will be
+         compiled into libreadline, but never linked into bash (since it's
+         not referenced)
+
+configure.in
+       - added new `--with-installed-readline' option to allow readline to
+         be linked with an already-installed version -- this will probably
+         not work with versions of readline prior to 2.3 (libreadline.so.4)
+         [THIS IS STILL UNDOCUMENTED]
+
+Makefile.in
+       - changed necessary variables to allow the `--with-installed-readline'
+         option to work; shared and static libraries are supported
+
+                                  5/18
+                                  ----
+lib/readline/display.c
+       - _rl_save_prompt is now rl_save_prompt; _rl_restore_prompt is now
+         rl_restore_prompt
+
+lib/readline/readline.h
+       - extern declarations for rl_save_prompt and rl_restore_prompt
+
+lib/readline/{search,isearch,readline,display}.c
+       - converted calls to _rl_{save,restore}_prompt () to use new public
+         versions
+
+lib/readline/doc/rltech.texinfo
+       - documented new public functions rl_{save,restore}_prompt
+
+                                  5/19
+                                  ----
+lib/readline/readline.c
+       - new hook function variable, rl_pre_input_hook.  If non-zero, it's
+         called from readline_internal_setup just before it returns and
+         readline starts reading input
+
+lib/readline/readline.h
+       - extern declaration for rl_pre_input_hook
+
+lib/readline/doc/rltech.texinfo
+       - documented new variable rl_pre_input_hook
+
+                                  5/20
+                                  ----
+lib/readline/complete.c
+       - new hook function variable, rl_completion_display_matches_hook.
+         If non-null, this function is called when readline would normally
+         display the list of completion matches
+
+lib/readline/readline.h
+       - extern declaration for rl_completion_display_matches_hook
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_completion_display_matches_hook
+
+lib/readline/readline.c
+       - if RL_LIBRARY_VERSION is not defined, define it to 4.0 to match
+         the version number of the shared libraries
+
+lib/readline/doc/{hist,rlman}.texinfo
+       - changed the version and edition to 4.0 to match the library version
+
+support/config.guess
+       - added case clause for matching UnixWare 7 from SCO (SVR5) -- further
+         work may be needed 
+         [These fixes were in a usenet posting from hops@sco.com]
+
+support/config.sub
+       - added case clauses to recognize various aliases for SCO Open Server
+         and Open Desktop
+         [in bash-2.02.1]
+       - broke the code that canonicalizes unixware into unixware2 and
+         unixware7 clauses (multiple places)
+         [in bash-2.02.1]
+       - added clause to recognize `sysv5' for SVR5
+         [These fixes were in a usenet posting from hops@sco.com]
+         [in bash-2.02.1]
+
+configure.in
+       - add `-b elf' to LOCAL_CFLAGS for sco3.2v5* to allow dynamic linking
+         (and loadable builtins)
+       - add AC_DEFINE(SVR5) on SVR5 (unixware 7)
+
+config.h.in
+       - add #undef SVR5, set by configure
+
+                                  5/21
+                                  ----
+shell.c
+       - line-buffer stdout and stderr in shell_initialize only if
+         shell_initialized is 0 on all systems, not just SunOS 5
+         [in bash-2.02.1]
+
+support/rlvers.sh
+       - script to print out the version number of any installed
+         readline library
+
+configure.in
+       - only allow --with-installed-readline if the version of the
+         installed readline library is 4.0 or greater
+
+                                  5/22
+                                  ----
+lib/readline/complete.c
+       - broke the code that actually displays a list of completion
+         matches on the output stream into a separate public function,
+         rl_display_match_list, so it can be called from the hook
+         function rl_completion_display_matches_hook.
+
+lib/readline/readline.h
+       - new extern declaration for rl_display_match_list
+
+lib/readline/rltech.texinfo
+       - documented rl_display_match_list
+
+configure.in,Makefile.in
+       - --enable-static-link now creates a STATIC_LD variable in Makefile
+         rather than adding to LDFLAGS directly.  LDFLAGS now includes
+         $(STATIC_LD)
+
+                                   6/2
+                                   ---
+builtins/cd.def
+       - OLDPWD is now auto-exported
+       - broke the code out of bindpwd() that updated the value of PWD in
+         the export environment in-place and made it general, so it can
+         be used for OLDPWD, too (this should be made *more* general, and
+         moved to variables.c)
+
+                                   6/3
+                                   ---
+variables.c
+       - moved builtins/cd.def:export_pwd_var to here, renamed it to
+         update_export_env_inplace
+       - converted put_command_name_into_env to just call
+         update_export_env_inplace
+       - made dummy variable for OLDPWD, marked as invisible and exported,
+         in initialize_shell_variables
+
+variables.h
+       - extern declaration for update_export_env_inplace
+
+builtins/cd.def
+       - changed calls to export_pwd_var to update_export_env_inplace
+
+lib/readline/bind.c
+       - added missing return in rl_unbind_function_in_map
+       - changed _rl_read_file to check whether or not `read' returns
+         < 0 rather than < file_size
+       - _rl_read_init_file needs to free `openname' after calling
+         _rl_read_file, since it's not used again
+
+lib/readline/callback.c
+       - bogus extern declaration for `readline_internal_startup', should
+         be readline_internal_setup
+
+lib/readline/histfile.c
+       - read_history_range now checks whether read(2) returns < 0 rather
+         than checking the return value against the file size
+
+lib/readline/parens.c
+       - whoops -- timer.tv_usec is *micro* seconds, not milliseconds
+
+lib/readline/readline.c
+       - initialize `eof' to 1 in readline_internal_charloop
+
+                                   6/5
+                                   ---
+configure.in
+       - if we're configuring with an installed version of readline, set and
+         have configure substitute RL_INCLUDE to `-I$(includedir)', so the
+         build process uses the installed readline include files as well as
+         the libraries
+
+Makefile.in, builtins/Makefile.in
+       - add @RL_INCLUDE@ in the appropriate places, substituted by configure
+
+lib/readline/{history,readline}.h
+       - add `extern "C"' wrapper if `__cplusplus' is defined
+
+lib/glob/fnmatch.h
+       - include stdc.h
+       - add prototypes to extern declaration for fnmatch()
+
+lib/readline/rlstdc.h
+       - link to ../posixheaders/stdc.h (in readline lib with different name
+         for benefit of standalone readline library installation)
+
+lib/readline/{history,keymaps}.h
+       - include rlstdc.h
+       - add prototypes to all of the extern function declarations
+
+lib/readline/history.h
+       - the `data' member of a HIST_ENTRY is now a histdata_t, which is
+         either a void * (ansi c) or a char * (k&r c)
+
+lib/readline/readline.c
+       - changed calls to replace_history_entry to pass a histdata_t as the
+         third parameter
+
+                                   6/8
+                                   ---
+copy_cmd.c
+       - make sure that copy_cond_command doesn't blindly try to copy
+         com->op, since that will be null for AND and OR nodes, at least
+         [in bash-2.02.1]
+
+lib/readline/vi_mode.c
+       - added missing second argument to rl_vi_[fbe][Ww]ord(), since
+         they're used as pseudo-bindable commands (they appear in the
+         default funmap) as well as utility functions
+
+lib/readline/readline.h
+       - include rlstdc.h
+       - added prototypes for functions from vi_mode.c, util.c, terminal.c,
+         search.c, util.c, undo.c, readline.c, parens.c, macro.c, kill.c,
+         keymaps.c, isearch.c, input.c, funmap.c, display.c, complete.c,
+         callback.c, 
+       - added extern declarations for functions from rltty.c
+
+lib/readline/{readline,util}.c
+       - rl_refresh_line now takes the standard two arguments for bindable
+         commands; changed callers
+
+lib/readline/*.c
+       - small cleanups for incorrect arguments, etc. uncovered by use of
+         function prototypes
+
+bashline.c
+       - small cleanups for incorrect arguments, etc. uncovered by use of
+         function prototypes
+
+                                  6/11
+                                  ----
+jobs.c
+       - cast result of strsignal() to (char *) for the benefit of broken
+         Cray UNICOS machines
+         [in bash-2.02.1]
+
+configure.in,aclocal.m4
+       - new test, BASH_TYPE_BITS64_T, used to find out what basic type is
+         64 bits long; defaults to `double'
+       - call AC_CHECK_SIZEOF(double)
+
+config.h.in
+       - #define for bits64_t, undef by default
+
+                                  6/24
+                                  ----
+aclocal.m4
+       - changed BASH_TYPE_BITS64_T so that it checks the size of a char *
+         first, before trying sizeof(double)
+
+lib/readline/doc/rluser.texinfo,doc/{bash.1,readline.3}
+       - changed default binding for tilde-expand to M-&, since bash
+         overrides M-~ to force username completion
+
+bashline.c
+       - fixed an off-by-one error in hostnames_matching that exhibited
+         itself when an exact multiple of 16 hostnames matched (fix
+         from <davidg@nikhef.nl>)
+         [in bash-2.02.1]
+
+                                  6/30
+                                  ----
+lib/readline/readline.c
+       - the maximum numeric argument is now 1000000
+
+bashline.c
+       - fixed a bug in bash_directory_completion_hook that caused memory
+         to be freed twice if a directory name containing an unset
+         variable was completed and `set -u' had been set
+
+configure.in
+       - on LynxOS, add a -DRECYCLES_PIDS to LOCAL_CFLAGS
+
+execute_cmd.c
+       - make sure that the changes to make the shell fork early when
+         run in the background do not cause commands such as `%1 &'
+         to fork
+         [in bash-2.02.1]
+       - if RECYCLES_PIDS is defined, execute_command_internal sets
+         last_made_pid to NO_PID after waiting for a foreground process,
+         if the return status is 0 (fix from plai@Lynx.COM (Paul Lai))
+
+lib/readline/kill.c
+       - fixes from Andreas Schwab to rl_yank_last_arg that make it
+         behave better
+
+lib/readline/input.c
+       - fixes from Donald Beaudry <donb@sgi.com> to make the input buffering
+         and rl_stuff_char work right when the input buffer is nearly full
+         (probably not a problem with keyboard input, but maybe a problem
+         with programmers attempting to use rl_stuff_char to preload the
+         input buffer)
+
+                                  7/14
+                                  ----
+parse.y
+       - fix to decode_prompt_string so that the \$ expansion quotes the `$'
+         so it won't be processed by subsequent parameter expansion
+       - change read_token_word so a $$ appearing in a token is recognized
+         and parsed immediately, so a single or double quote after the
+         second `$' doesn't cause ANSI-C expansion or locale translation
+         (bug report from haertel@ichips.intel.com)
+
+                                  7/16
+                                  ----
+lib/readline/display.c
+       - fixed a bug that caused core dumps in xrealloc if the prompt was
+         longer than 1024 characters
+
+                                  7/21
+                                  ----
+builtins/mkbuiltins.c
+       - if the number of characters read from the .def file is less than
+         the file size reported by `stat', and the read completed without
+         errors, reset the file size to avoid writing garbage at the end
+         of the generated .c file (needed on WIN32 systems, doesn't hurt
+         on Unix)
+
+                                  7/22
+                                  ----
+CWRU/empty-for-wordlist
+       - patch from Brian Fox for parse.y to allow bash to accept an empty
+         `wordlist' after the `in' keyword in a for statement
+
+                                  7/23
+                                  ----
+doc/bash.1
+       - corrected the synopsis of the `for' and `select' statements to
+         indicate that the semicolon (or newline) after the optional
+         `in words' is required
+
+[bash-2.02.1 released]
+
+                                  7/28
+                                  ----
+lib/readline/display.c
+       - make sure visible_length is initialized to 0 in rl_expand_prompt.
+         Fix from Gerhard Niklasch <nikl@mathematik.tu-muenchen.de>.
+
+lib/glob/glob.c
+       - make sure that quotes are removed from the filename being globbed
+         in glob_vector() before calling the GLOB_TESTNAME macro if there
+         are no globbing characters in the pattern
+
+doc/Makefile.in
+       - make sure that builtins.1 is looked for in $(srcdir) when running
+         `make install' (it's still commented out, though)
+
+                                  7/30
+                                  ----
+config.h.bot
+       - if PROMPT_STRING_DECODE is not defined, define PPROMPT (the primary
+         prompt string) as "$ "
+
+variables.c
+       - if PROMPT_STRING_DECODE is not defined, and current_user.euid == 0,
+         PS1 defaults to "# ", otherwise it defaults to `primary_prompt'
+
+doc/bashbug.1
+       - fixed email address prep.ai.mit.edu -> gnu.org
+
+                                   8/3
+                                   ---
+support/shobj-conf
+       - add `solaris2' as a possible OS name, treated the same as sunos5
+
+                                   8/4
+                                   ---
+shell.c
+       - changed maybe_make_restricted() so that $ENV and $BASH_ENV are
+         read-only variables in a restricted shell
+
+doc/{bash.1,bashref.texi}
+       - added ENV and BASH_ENV to the list of readonly variables in
+         restricted mode
+
+parse.y
+       - added `do', `then', `else', `{', and `(' to the list of keywords
+         that may precede the `time' reserved word
+
+general.c
+       - added sanity checks to timeval_to_secs and clock_t_to_secs so
+         that if the fractional part is >= 1000, 1 is added to the
+         seconds and 1000 is subtracted from the fractional seconds
+
+                                   8/6
+                                   ---
+Makefile.in
+       - use $(CC_FOR_BUILD) to build mksignames
+
+configure.in
+       - changes to allow cross-building for BeOS as well as cygwin32
+
+cross-build/{beos-sig.h,x86-beos.cache}
+       - new files for cross-compiling for BeOS
+
+                                   8/7
+                                   ---
+Makefile.in
+       - changed rule for version.h to use && instead of if-then-else-fi to
+         make sure the recipe fails if mkversion.sh fails
+
+configure.in
+       - beos does not use the GNU malloc
+
+lib/sh/itos.c
+       - broke itos into inttostr(i, buf, len) and itos(i), which calls
+         inttostr and returns a newly-allocated string with the result
+
+support/mksignames.c
+       - define `SIGKILLTHR' if system include files define it
+
+externs.h
+       - extern declaration for inttostr(int, char *, int)
+
+                                  8/13
+                                  ----
+lib/sh/strtol.c
+       - include stdc.h before bashansi.h
+
+execute_cmd.c
+       - make sure that execute_cond_node treats `=' the same as `=='
+
+                                  8/25
+                                  ----
+variables.c, print_cmd.c
+       - changed some calls to itos to use inttostr instead
+
+cross-build/x86-beos.cache, {execute_cmd,general,shell,trap}.c
+       - some changes for BeOS (from fnf@ninemoons.com)
+
+lib/posixheaders/memalloc.h
+       - changes to handle case where we're using both gcc and the C
+         version of alloca(), or if we have alloca.h and we're using
+         the C version of alloca() (from fnf@ninemoons.com)
+
+lib/sh/oslib.c
+       - if bcopy or bzero are #defines, #undef them before defining
+         replacement functions
+
+support/config.guess
+       - recognize AmigaOS (from fnf@ninemoons.com)
+       - recognize BeOS running on various machines
+         (from fnf@ninemoons.com)
+
+support/config.sub
+       - change basic_machine definition for amiga; added amigaos
+         (from fnf@ninemoons.com)
+       - changed definitions for MIPS machines running Linux (from
+         fnf@ninemoons.com)
+       - recognize `beos' as a valid operating system
+         (from fnf@ninemoons.com)
+       - changed OS for *-cbm to `amigaos' rather than `amigados'
+         (from fnf@ninemoons.com)
+
+examples/functions/autoload.v3
+       - a new version, from Mark Kennedy <mtk@ny.ubs.com>
+
+lib/readline/readline.c
+       - new function, rl_delete_or_show_completions, like tcsh editing
+         function delete-char-or-list
+
+lib/readline/readline.h
+       - new extern declaration for rl_delete_or_show_completions
+
+lib/readline/funmap.c
+       - new bindable name `delete-char-or-list', like tcsh
+
+lib/readline/doc/rluser.texinfo, doc/{bash.1,readline.3}
+       - documented new delete-char-or-list command
+
+general.c
+       - fix full_pathname to keep it from generating things like
+         //foo when the current directory is /
+
+                                  8/27
+                                  ----
+builtins/fc.def
+       - fixed the help text for the -e option
+
+                                  8/28
+                                  ----
+support/shobj-conf
+       - added a clause for AIX 4.2 systems running gcc -- just the
+         standard gcc stuff for shared objects, but it has to come
+         before the other AIX 4.2 clause
+
+                                  8/31
+                                  ----
+shell.c
+       - some changes so that `set -e' is turned off while executing
+         the startup files
+
+                                   9/3
+                                   ---
+flags.c
+       - new variable, `restricted_shell', non-zero if the shell was
+         started in restricted mode
+
+flags.h
+       - extern declaration for restricted_shell
+
+shell.c
+       - new function, shell_is_restricted, returns 1 if the shell is
+         supposed to be restricted based on the basename of $0 or the
+         -r option
+       - set restricted_shell to the value returned by shell_is_restricted
+         before executing the startup files
+
+externs.h
+       - extern declaration for shell_is_restricted
+
+builtins/shopt.def
+       - new shopt variable, restricted_shell, indicates whether the shell
+         was restricted at startup -- useful in startup files
+
+doc/{bash.1,bashref.texi}
+       - documented new restricted_shell shopt option
+
+                                  9/15
+                                  ----
+lib/sh/rename.c
+       - new file, replacement for rename(2) if the OS doesn't provide it
+
+configure.in,config.h.in,Makefile.in,lib/sh/Makefile.in
+       - machinery for including rename.o in libsh.a
+
+nojobs.c
+       - make sure that set_tty_state returns a value
+
+builtins/mkbuiltins.c
+       - use a call to rename(2) instead of a link/unlink pair
+
+lib/glob/glob.c
+       - don't #define bcopy if bcopy is already defined
+
+lib/readline/histfile.c
+       - add a call to ftruncate for BeOS, which ignores the O_TRUNC flag
+         to open
+
+lib/readline/input.c
+       - make rl_getc loop if read returns -1/EINTR on BeOS
+
+configure.in
+       - set ARFLAGS and substitute it into the Makefiles
+
+{,builtins,lib/{glob,malloc,readline,sh,termcap,tilde}}/Makefile.in
+       - ARFLAGS is now substituted by configure
+       - use ARFLAGS in rules that create libraries using $(AR)
+
+builtins/printf.def
+       - fixed bug that caused a core dump when a modifier was supplied
+         in the format string without a conversion character (e.g. `%h')
+
+                                  9/17
+                                  ----
+lib/glob/glob.c
+       - if filenames starting with a dot don't have to be matched
+         explicitly (e.g., after a `shopt -s dotglob'), don't match
+         `.' or `..' in any case
+
+eval.c
+       - make sure that array assignments don't show up in the history list
+         (fix from Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>)
+
+lib/readline/complete.c
+       - fix to rl_menu_complete so it inserts a single completion properly
+         when a word matches only one filename
+
+                                  9/24
+                                  ----
+execute_cmd.c
+       - difftimeval should zero out the tv_usec field if the tv_sec field
+         is < 0
+       - addtimeval should check for tv_usec being == 1000000 and add one
+         to tv_sec if it is
+
+                                  9/25
+                                  ----
+subst.c
+       - fix to expand_word_internal to prevent non-whitespace IFS characters
+         from causing word splitting if they are not the results of an
+         expansion (not exactly right yet, but I think it's the result of a
+         problem with the ${...} end-brace-matching code in the parser)
+
+                                  9/28
+                                  ----
+parse.y
+       - new flag for parse_matched_pair -- P_FIRSTCLOSE -- which makes it not
+         count and match additional construct open characters
+       - change calls to parse_matched_pair when matching braces in
+         ${...} constructs (both unquoted and within double quotes) to
+         specify the P_FIRSTCLOSE flag to match POSIX.2 requirements
+
+subst.c
+       - changed fix from 9/25, now that the parser problem is fixed
+
+                                  9/30
+                                  ----
+variables.c
+       - change expansion of list of words between (...) in array assignments
+         to include pathname generation in assign_array_var_from_string
+
+doc/{bash.1,bashref.texi}
+       - clarified behavior of the shell at startup if running setuid, with
+         and without the -p option supplied
+
+                                  10/7
+                                  ----
+bashhist.c
+       - change default open(2) mode to 0600 instead of 0666 for `privacy
+         concerns'
+
+                                  10/13
+                                  -----
+lib/readline/display.c
+       - fixed a problem with displaying tabs after newlines, from
+         <qrczak@knm.org.pl>
+       - in update_line, if we are printing over existing material,
+         only call space_to_eol or _rl_clear_to_eol if lendiff is non-zero
+       - when moving the cursor in _rl_move_cursor_relative, only call
+         _rl_backspace if the current cursor position is strictly greater
+         than the desired cursor position
+
+                                  10/14
+                                  -----
+locale.c
+       - LC_ALL is no longer set automatically when LANG is assigned a value
+
+config.h.{top,bot}
+       - renamed to config-{top,bot}.h, respectively
+
+config.h.in
+       - include config-top.h and config-bot.h
+
+Makefile.in
+       - things now depend on config-top.h and config-bot.h
+
+subst.c
+       - minor changes to extract_dollar_brace_string and char_is_quoted to
+         allow things like "${PIP[TAB] to perform correct variable completion
+
+                                  10/15
+                                  -----
+builtins/Makefile.in
+       - add $(PROFILE_FLAGS) to the make recipe that creates `mkbuiltins',
+         so configuring with --enable-profiling works right
+
+                                  10/20
+                                  -----
+doc/bashref.texi
+       - documented the new --with-installed-readline option
+
+[bash-2.03-alpha1 frozen]
+
+                                  10/21
+                                  -----
+builtins/reserved.def
+       - fixed help text for { ... } to make it clear that a semicolon is
+         required before the closing brace
+
+                                  10/22
+                                  -----
+trap.c
+       - in decode_signal, don't bother calling strcasecmp if
+         signal_names[sig] is null or empty
+
+                                  11/2
+                                  ----
+configure.in
+       - make sure RL_LIBDIR and HIST_LIBDIR are assigned values even if
+         readline or history is configured out of the shell, so the -L
+         options have arguments in the link command
+
+test.c
+       - make test_syntax_error cause test to return a status > 1, to
+         conform to POSIX.2 4.62.8
+
+doc/readline.3
+       - make sure the SYNOPSIS section indicates that programmers should
+         include <stdio.h> before <readline.h>
+
+                                  11/9
+                                  ----
+Makefile.in
+       - install with explicit mode of 0755
+
+                                  11/10
+                                  -----
+builtins/test.def
+       - make sure that a missing `]' makes `[' exit with status 2, to
+         conform to POSIX.2 4.62.8
+
+command.h
+       - new word flag: W_NOGLOB, meaning to not perform globbing
+
+execute_cmd.c
+       - fix_assignment_statements now turns on the W_NOGLOB flag for
+         arguments to `assignment builtins' that have W_ASSIGNMENT set
+
+subst.c
+       - expand_word_internal needs to preserve the W_NOGLOB flag from
+         the word being expanded to the word being returned
+       - glob_expand_word_list does not call shell_glob_filename for a
+         word with W_NOGLOB set
+
+builtins/shopt.def
+       - print_shopt is now void
+
+configure.in
+       - machines running Rhapsody don't use the bash malloc
+       - pass host_vendor to the Makefiles with AC_SUBST
+
+support/config.guess
+       - Rhapsody is really rhapsody, not nextstep
+
+support/config.sub
+       - add rhapsody to the list of supported configurations
+
+Makefile.in
+       - pass CONF_HOSTTYPE, CONF_OSTYPE, and CONF_MACHTYPE as -D options
+         in SYSTEM_FLAGS, to indicate that they came from the configuration
+         process
+       - set VENDOR variable from host_vendor configuration variable
+       - pass CONF_VENDOR as part of SYSTEM_FLAGS
+
+variables.c
+       - define HOSTTYPE, OSTYPE, and MACHTYPE as CONF_HOSTTYPE, CONF_OSTYPE,
+         and CONF_MACHTYPE, respectively
+
+                                  11/11
+                                  -----
+doc/{bashref.texi,bash.1}
+       - updated description of `read' to clarify the -r option and its
+         effect on backslash escaping
+
+                                  11/13
+                                  -----
+examples/loadables/{ln,unlink}.c
+       - new loadable builtins
+
+                                  11/23
+                                  -----
+lib/glob/fnmatch.c
+       - some fixes to handle extended glob patterns immediately following
+         a `*'
+
+tests/extglob.tests
+       - updated with cases from bug report fixed today
+
+support/shobj-conf
+       - udpated stanza for aix 4.2 with gcc, based on information from
+         jik@cisco.com
+
+configure.in
+       - changes to add the correct linker options to allow dynamic linking
+         when using gcc on AIX 4.2, instead of insisting on the AIX C
+         compiler
+
+examples/misc/aliasconv.{bash,sh}
+       - changes to handle aliases with embedded single quotes
+
+                                  11/25
+                                  -----
+lib/readline/complete.c
+       - postprocess_matches should call compute_lcd_of_matches with an
+         argument of `t' instead of `text'
+       - postprocess_matches should never call ding(); leave that for the
+         callers
+       - postprocess_matches no longer needs `text' as the first argument
+       - rl_complete_internal needs to call ding() if postprocess_matches
+         returns 0, since postprocess_matches no longer does it
+       - rl_complete_internal can now free `text' immediately after calling
+         gen_completion_matches, since it's no longer used
+
+                                  11/30
+                                  -----
+print_cmd.c
+       - make sure redirections following compound commands have a space
+         separating them from the command
+
+                                  12/1
+                                  ----
+general.c
+       - changed canonicalize_pathname so that if the result path begins
+         with `//', it will be changed to `/' if and only if the original
+         path did not begin with `//' (there has to be a non-slash after
+         the leading `///' in the original path)
+
+                                  12/2
+                                  ----
+builtins/evalstring.c
+       - augment the test for turning on CMD_NO_FORK to make sure that
+         parse_and_execute_level == 1.  That takes care of things like
+
+               bash -c 'for f in 1 2 3; do eval "/bin/echo \"$f\"" ; done'
+
+         only printing one line of output
+
+                                  12/8
+                                  ----
+config-top.h
+       - add commented-out #define for NON_INTERACTIVE_LOGIN_SHELLS so
+         that users may, if they choose, make things like
+
+               #! /bin/bash --login
+
+         work in shell scripts
+
+                                  12/10
+                                  -----
+jobs.c
+       - changes to the way jobs are reaped when the shell is not
+         interactive:
+
+               o notify_of_job_status no longer marks dead jobs as
+                 notified if they did not exit due to a signal;
+               o changed mark_background_jobs_as_notified to take an
+                 argument `force':  if zero, we only mark enough
+                 dead jobs as notified to keep CHILD_MAX jobs in the
+                 jobs list, as POSIX.2 specifies.  If non-zero, mark
+                 all dead jobs as notified;
+               o wait_for_background_pids marks all dead jobs as
+                 notified when it has finished waiting for everything,
+                 since the only thing that calls it is the `wait' builtin;
+               o wait_for_single_pid marks a job as notified after it
+                 has completed, since the only things that call it are
+                 wait_for_background_pids and the `wait' builtin
+               o wait_for_job marks the job as notified after the last
+                 pid completes
+
+execute_cmd.c
+       - change execute_subshell_builtin_or_function to check
+         subshell_environment and pipe_out to decide whether or not to fork
+         if builtin == jobs_builtin, since the early-forking code added in
+         bash-2.02 means that the piping has probably already been done
+
+                                  12/15
+                                  -----
+parse.y
+       - changes to make avar=((...)) a syntax error instead of ignoring
+         the nested parens and treating it as an array assignment
+
+shell.c
+       - changed run_startup_files so that any shell, whether or not it is
+         interactive, will run the login shell startup files when given the
+         --login option.  This happens only when not in posix mode.
+
+builtins/enable.def
+       - changes to handle Tenon's MachTen, whose dlclose() does not return
+         a value
+
+lib/glob/fnmatch.c
+       - changed gmatch so that when it calls extmatch, it removes FNM_PERIOD
+         from the flags if it's not matching at the start of the string.
+         This fixes the problem of `@' and `+' extended-glob subpatterns
+         containing bracket expressions treating `.' specially when matching
+         a portion of the string starting with `.'
+
+config-top.h
+       - removed define for NON_INTERACTIVE_LOGIN_SHELLS, since it's no longer
+         necessary
+
+                                  12/17
+                                  -----
+lib/readline/complete.c
+       - change rl_complete_internal and rl_menu_complete to check
+         rl_filename_completion_desired to decide whether or not we're
+         completing filenames instead of checking whether the attempted
+         completion function is filename_completion_function.
+         filename_completion_function sets rl_filename_completion_desired,
+         so this shouldn't break anything -- just allow postprocessing of
+         matches for user-supplied filename completion functions that don't
+         call filename_completion_function
+
+lib/readline/display.c
+       - new function, _rl_erase_entire_line, which erases the entire line,
+         no matter where the cursor is, and puts the cursor at the beginning
+         of the (newly-empty) line
+
+lib/readline/readline.c
+       - new application-level variable, rl_erase_empty_line, which, if
+         non-zero, tells readline to erase the contents of the current line,
+         prompt and all, if the only character typed to an otherwise-blank
+         line is bound to rl_newline.  Requested by the Cygnus GDB folks.
+       - change to rl_newline to suppress the call to _rl_update_final if
+         rl_erase_empty_line is non-zero, and rl_point == rl_end == 0, since
+         _rl_update_final calls crlf()
+       - change to readline_internal_charloop to call _rl_erase_entire_line
+         if newline was the only thing typed on an otherwise-empty line
+
+lib/readline/readline.h
+       - extern declaration for rl_erase_empty_line
+
+lib/readline/doc/rltech.texinfo
+       - documented new rl_erase_empty_line variable
+
+                                  12/18
+                                  -----
+Makefile.in
+       - changed RELSTATUS to `beta1'
+
+[bash-2.03-beta1 frozen]
+
+                                  12/21
+                                  -----
+doc/{bash.1,bashref.texi}
+       - added description of `test -h'; equivalent to `test -L'
+
+                                  12/22
+                                  -----
+support/shobj-conf
+       - SHOBJ_LDFLAGS should be those options to ld which are common
+         between building dynamically loadable shared objects and shared
+         libraries
+       - added two new variables: SHOBJ_XLDFLAGS, which are ld options
+         specific to building dynamically loaded shared objects, and
+         SHLIB_LIBS, which are other libraries against which shared libraries
+         should be linked.  These are for the benefit of AIX 4.2; other
+         stanzas do not need to be changed.
+
+configure.in
+       - add call to AC_SUBST for SHOBJ_XLDFLAGS
+
+examples/loadables/Makefile.in
+       - SHOBJ_XLDFLAGS is now substituted by configure
+       - $(SHOBJ_LDFLAGS) -> $(SHOBJ_LDFLAGS) $(SHOBJ_XLDFLAGS) in all
+         recipes that build loadable builtins
+
+                                  12/29
+                                  -----
+support/config.{guess,sub}
+       - changes for NEC SX4 machines running SUPER-UX (?).  Info from
+         Nicholas Clark <nick@flirble.org>
+
+lib/readline/bind.c
+       - new bindable variable, `isearch-terminators', which is the list of
+         characters that will terminate an incremental search without
+         subsequently executing the character as a command
+
+lib/readline/isearch.c
+       - changes to incorporate the new isearch-terminators bindable variable;
+         uses new private readline variable _rl_isearch_terminators
+         (suggested by Brian Fox)
+
+doc/{bash.1,readline.3}, lib/readline/doc/rluser.texinfo
+       - documented new `isearch-terminators' settable variable
+
+lib/readline/complete.c
+       - new convenience function, free_match_list, called from
+         rl_complete_internal
+
+                                  12/30
+                                  -----
+aclocal.m4
+       - changed the calls to AC_MSG_ERROR in the cross-compiling sections
+         to AC_MSG_WARN, since AC_MSG_ERROR can cause configure to abort
+
+examples/functions/which
+       - new function, emulation of `which' as it appears in FreeBSD
+
+                                  12/31
+                                  -----
+lib/readline/readline.c
+       - new bindable function: rl_rubout_or_delete.  Does rl_rubout if
+         rl_point is at the end of the line, or rl_delete if not.  This
+         is intended to mimic the Motif/Netscape/GNOME behavior of the
+         DEL character, and can be bound to delete to get that behavior
+
+lib/readline/readline.h
+       - new extern declaration for rl_rubout_or_delete
+
+lib/readline/funmap.c
+       - bound the name `forward-backward-delete-char' to
+         rl_rubout_or_delete (currently not bound to any keys)
+
+lib/readline/doc/manvers.texinfo
+       - new file with readline manual version information, to mantain
+         consistent numbering between readline and history manuals
+
+lib/readline/doc/{rlman,hist}.texinfo
+       - @include manvers.texinfo for version information
+       - moved the @dircategory and and @direntry directives inside
+         the @ifinfo block
+       - changed copyrights to 1988-1999
+
+doc/Makefile.in, lib/readline/doc/Makefile.in
+       - texi2html is now called with -menu (to handle the texinfo menus)
+         and -monolithic (to include the table of contents in the generated
+         HTML file instead of putting it in a separate file
+       - changed recipes to remove references to TOC html files
+
+lib/glob/fnmatch.c
+       - include <string.h> or <strings.h> as appropriate for strchr()
+         declaration
+
+                                1/4/1999
+                                --------
+print_cmd.c
+       - don't print bare words when printing conditional expressions in
+         print_cond_node, use cprintf("%s", cond->op->word)
+
+subst.c
+       - in separate_out_assignments, if VARLIST is non-null on function
+         entry, free it up to clean up after a previous error longjmp
+
+                                   1/5
+                                   ---
+configure.in
+       - make sure the case clause that disables the bash malloc on alpha
+         machines catches things like `alphaev56' as well as `alpha'
+
+                                  1/12
+                                  ----
+lib/readline/histlib.h
+       - new error message code: NO_PREV_SUBST
+
+lib/readline/histexpand.c
+       - handle NO_PREV_SUBST with appropriate error message in hist_error
+       - in history_expand_internal, if the `s' or `&' case results in a
+         null or empty LHS, return NO_PREV_SUBST
+
+error.c
+       - new interface: command_error(func, code, e, flags); intended to
+         collect command-related errors in one place
+       - new interface: command_errstr(code); returns a string describing
+         command error CODE
+
+error.h
+       - extern declarations for command_error and command_errstr
+
+command.h
+       - possible values for CODE in calls to command_error and command_errstr
+
+{shell,print_cmd,make_cmd,execute_cmd,dispose_cmd,eval}.c ,builtins/evalstring.c
+       - changed some calls to programming_error to use command_error
+
+                                  1/13
+                                  ----
+configure.in
+       - if --enable-profiling is specified on a solaris2 machine, don't
+         turn on enable-static-link, since it's very hard to build a
+         static binary on solaris2 and gprof does not (apparently) require it
+
+builtins/getopts.def
+       - add calls to sh_getopt_restore_state so the state is restored each
+         time getopts is called.  This protects us against the behavior of
+         some mallocs, which causes `nextchar' to be set to garbage in
+         getopt.c when a function is called between calls to getopts
+
+                                  1/14
+                                  ----
+lib/readline/complete.c
+       - if postprocess_matches returns 0 in rl_complete_internal, reset
+         completion_changed_buffer to 0 before returning, since nothing
+         has been changed
+
+                                  1/20
+                                  ----
+subst.c
+       - fixed pat_subst so that null patterns with a `#' specifier prefix
+         the string to be substituted on with the replacement, and null
+         patterns with a `%' specifier append the replacement to the string
+         to be substituted on
+
+doc/{bash.1,bashref.texi}
+       - corrected a small error in the description of parameter pattern
+         substitution
+
+support/mksignames.c
+       - SIGINFO means something else on sequent systems
+
+                                  1/26
+                                  ----
+execute_cmd.c
+       - fix to execute_simple_command to keep a child process from getting
+         a bad value of last_asynchronous_pid when the shell forks early
+
+                                   2/1
+                                   ---
+Makefile.in
+       - changed RELSTATUS to `beta2'
+
+                                   2/2
+                                   ---
+[bash-2.03-beta2 released]
+
+                                   2/3
+                                   ---
+tests/{cprint.{tests,right},run-cprint}
+       - new test to exercise the command printing and copying code --
+         hopefully this will avoid things like the `conditional commands
+         in functions make the shell abort' problem
+
+                                   2/4
+                                   ---
+version.c
+       - if MACHTYPE is not defined, use CONF_MACHTYPE if it's defined
+
+                                   2/5
+                                   ---
+builtins/read.def
+       - if READLINE is defined, we need an extra pair of braces around
+         the `while' loop that reads from fd 0 if the -e option is
+         supplied, otherwise the code erroneously tests the value of
+         `retval', which is not set when using readline
+
+                                  2/15
+                                  ----
+builtins/fc.def
+       - make sure that fc closes `stream' before calling fc_execute_file
+
+                                  2/17
+                                  ----
+builtins/fc.def
+       - don't bother opening and closing the file of commands before
+         calling fc_execute_file, since parse_and_execute will write the
+         commands to the history file for us
+
+Makefile.in
+       - changed release status to `release'
+
+                                  2/18
+                                  ----
+parse.y
+       - change to special_case_tokens so that `time' is not recognized
+         as a reserved word while the parser is parsing a case statement
+         pattern list (if `time' is the first pattern, the last read
+         token will be newline, which time_command_acceptable says is OK
+         to start a pipeline)
+
+pathexp.c
+       - some changes to the POSIX_GLOB_LIBRARY code (often unused)
+
+shell.c
+       - a couple of changes for Interix (nee OPENNT)
+       - added code that handles systems without a third argument to main();
+         initializing `env' from `environ', conditionalized on a cpp define
+         NO_MAIN_ENV_ARG
+
+configure.in, config.h.in
+       - check for the presence of sbrk(2); define HAVE_SBRK if found
+
+xmalloc.c
+       - don't do the space allocated computation when malloc or realloc
+         fails if HAVE_SBRK is not defined
+
+configure.in
+       - new configure variable, MAKE_SHELL, defaults to /bin/sh
+
+Makefile.in,{builtins,doc,support,lib/{glob,malloc,readline,sh,termcap,tilde},examples/loadables}/Makefile.in
+       - set SHELL from @MAKE_SHELL@
+
+lib/posixheaders/posixjmp.h
+       - Don't override defines for setjmp and longjmp in <setjmp.h> on
+         Internix (nee OPENNT)
+
+lib/readline/complete.c
+       - Interix (OPENNT) doesn't do username completion
+
+configure.in
+       - on Interix/OPENNT ($host_os == interix* or opennt*), add
+         -DNO_MAIN_ENV_ARG to LOCAL_CFLAGS
+       - on Interix/OPENNT, set MAKE_SHELL to $OPENNT_ROOT/bin/sh rather
+         than a straight /bin/sh
+
+cross-build/opennt.cache
+       - a `configure' cache file for Interix/OPENNT; not necessarily
+         for cross-compiling, but this is where the other system cache
+         files are
+
+[bash-2.03 released]
+
+                                  2/19
+                                  ----
+configure.in
+       - changed OPENNT_ROOT to INTERIX_ROOT for building on Interix
+
+support/config.guess
+       - added two stanzas for Interix running on alpha and intel hardware
+
+                                  2/22
+                                  ----
+config-bot.h
+       - if PROMPT_STRING_DECODE is not defined, #undef PPROMPT before
+         redefining it, to avoid warning messages
+
+execute_cmd.c
+       - set jobs_hack in execute_subshell_builtin_or_function only if
+         JOB_CONTROL is defined
+
+                                  2/24
+                                  ----
+trap.c
+       - fixed an obscure bug caused by a race condition in run_pending_traps.
+         Read the comments in the source code for a full description of the
+         problem and solution
+
+                                   3/1
+                                   ---
+aclocal.m4
+       - new test, BASH_STRUCT_TIMEVAL, which tries to compile a code
+         fragment that includes <sys/time.h> and <time.h> as appropriate
+         and defines HAVE_TIMEVAL if the compile succeeds
+
+configure.in
+       - call BASH_STRUCT_TIMEVAL rather than running a pair of
+         AC_HEADER_EGREPs on sys/time.h and time.h
+
+lib/readline/histfile.c
+       - include "posixstat.h" rather than <sys/stat.h>
+       - in history_truncate_file, only try to truncate if the history file
+         is a regular file
+
+                                   3/2
+                                   ---
+aclocal.m4
+       - changed BASH_STRUCT_TIMEVAL back to using a pair of
+         AC_EGREP_HEADERs instead of compiling a program fragment
+
+lib/readline/readline.c
+       - readline_internal_charloop should cast the first argument to
+         _rl_dispatch to `unsigned char' to avoid problems with negative
+         array indices on systems where signed chars are the default
+
+lib/readline/kill.c
+       - instead of doing a sequence of next_history() calls in
+         rl_yank_nth_arg_internal, save and restore the history
+         position explicitly after finding the correct entry.  This
+         attempts to ensure that rl_yank_nth_arg leaves the history
+         pointer set to the same position as when it was called.
+         Fix from Vasco Pedro <vp@di.fct.unl.pt>
+
+                                   3/5
+                                   ---
+redir.c
+       - broke code that opens file for redirection in do_redirection_internal
+         into a separate function: redir_open(path, flags, mode, ri)
+
+general.h
+       - changed STREQN so that it evaluates to 1 (strings are equivalent)
+         if N == 0, to match the behavior of strncmp
+
+lib/sh/zwrite.c
+       - new file, zwrite() from builtins/evalstring.c
+
+builtins/evalstring.c
+       - removed private definition of zwrite
+
+builtins/common.c
+       - double_quote needs to protect newlines with backslashes as well
+       - new function, un_double_quote, to remove backslashes proctecting
+         characters that are special in double quotes
+
+builtins/common.h
+       - new extern declaration for un_double_quote
+
+parse.y
+       - changed read_token_word to requote the expanded value of $'...'
+         using single_quote
+       - added a new flag to parse_matched_pair: P_ALLOWESC.  It allows
+         backslashes to quote embedded single quotes, and is used by
+         the $'...' translation code for better ksh93-compatibility
+       - changed localeexpand to call mk_msgstr on the string passed
+         before displaying it if all we're doing is displaying translatable
+         strings in `po' format.  mk_msgstr quotes backslashes and double
+         quotes in the string passed with backslashes, and encloses the
+         result in double quotes.  If only -D is supplied, the string is
+         not changed at all -- this is what ksh93 does
+
+lib/readline/rlconf.h
+       - removed PAREN_MATCHING #define, paren matching is always compiled
+         into readline
+
+lib/readline/parens.c
+       - removed code that was active if PAREN_MATCHING was not defined
+       - added _rl_enable_paren_matching, which is called when the readline
+         variable `blink-matching-paren' is assigned a value and changes
+         the appropriate key bindings in emacs_standard_keymap
+
+lib/readline/bind.c
+       - no more PAREN_MATCHING defines, `blink-matching-paren' is always
+         available
+       - if `blink-matching-paren' is assigned a value, call
+         _rl_enable_paren_matching (rl_blink_matching_paren)
+
+lib/readline/emacs_keymap.c
+       - removed PAREN_MATCHING defines; the default key bindings for
+         ), ], and } are self-insert
+
+                                   3/7
+                                   ---
+stringlib.c
+       - added an extra argument to ansicstr so that `echo -e' will not
+         convert \' to '
+
+externs.h
+       - changed extern declaration for ansicstr
+
+parse.y, builtins/{echo,printf}.def
+       - changed calls to ansicstr() appropriately
+
+eval.c
+       - in parse_string_to_word_list, if an unexpected token is encountered
+         that causes the string to not parse to a simple command, or to
+         completely consume the string, display an error message and jump
+         back to the top level after restoring the parsing environment,
+         returning an error status from the attempted assignment
+
+                                   3/8
+                                   ---
+lib/glob/fnmatch.c
+       - fixed patscan and extmatch to handle embedded [...](...) patterns
+         better
+
+tests/{extglob2.{tests,right},run-extglob2}
+       - an additional set of ksh extended globbing tests, cribbed from zsh
+
+                                  3/10
+                                  ----
+general.c
+       - changed unset_nodelay_mode slightly to make sure it handles both
+         O_NDELAY and O_NONBLOCK if they have different values; it now
+         returns a value of 0 on success (or no action); -1 on failure
+
+general.h
+       - changed extern declaration for unset_nodelay_mode
+
+
+lib/readline/shell.c
+       - new function: unset_nodelay_mode; identical to definition in
+         general.c
+
+lib/readline/input.c
+       - changed rl_getc to call unset_nodelay_mode if the read fails with
+         errno == EWOULDBLOCK || errno == EAGAIN
+
+                                  3/11
+                                  ----
+lib/termcap/termcap.c
+       - minor changes from termutils-2.0
+       - minor change to MS-DOS version of valid_filename_p so MS-DOS-specific
+         code from tgetent() can be removed (from Michel@smr.nl)
+
+lib/readline/bind.c
+       - in _rl_read_file, null-terminate the buffer at the number of
+         characters actually read, not what stat() says the file size is
+       - use ~/_inputrc as a last-ditch inputrc filename on MS-DOS
+
+lib/readline/complete.c
+       - change printable_part to handle MS-DOS `drive-letter:' pathname
+         prefixes
+       - removed __GO32__ code, since it's for DJGPP 1.x, which is not
+         supported any more, and they don't work for DJGPP 2.x
+       - added code to support MS-DOS drive letter prefixes and //X/...
+         to filename_completion_function
+       - _rl_completion_case_fold defaults to 1 on MS-DOS
+
+lib/readline/{display,input,readline,rltty,signals,terminal}.c
+       - removed __GO32__ code
+
+lib/readline/histfile.c
+       - make read_history_range and history_truncate_file work with the
+         actual number of characters read from the file, not the file size
+         as reported by stat()
+
+lib/readline/readline.c
+       - change bind_arrow_keys_internal to bind MS-DOS arrow keys to the
+         appropriate functions if __MSDOS__ is defined
+
+lib/readline/rltty.c
+       - make sure set_winsize is always defined, with a null body if
+         TIOCGWINSZ is not defined
+
+lib/readline/shell.c
+       - include <stdio.h>, since this file uses sprintf
+
+support/shobj-conf
+       - MS-DOS does not support shared objects
+
+lib/tilde/tilde.c
+       - change tilde_find_suffix and isolate_tilde_prefix to understand
+         backslash as a pathname separator on MS-DOS
+
+                                  3/12
+                                  ----
+lib/readline/{bind,readline,terminal}.c
+       - no longer need to include <signal.h>
+
+lib/readline/terminal.c
+       - don't need to include <setjmp.h>
+
+builtins/history.def
+       - broke the code than handles deleting a particular history entry
+         from the history list out into a separate function: delete_histent
+       - added `-d offset' option to delete the history entry at position
+         OFFSET, as displayed when the history is listed
+
+jobs.c, nojobs.c
+       - new function, count_all_jobs(), returns the number of active jobs
+         in the jobs list
+
+jobs.h
+       - extern declaration for count_all_jobs()
+
+configure.in
+       - check for C library function ttyname()
+
+config.h.in
+       - define HAVE_TTYNAME if configure finds ttyname(3)
+
+parse.y
+       - two new escape sequences for decode_prompt_string:
+
+               \j      number of active jobs in jobs list
+               \l      basename of shell's tty device name
+
+doc/{bash.1,bashref.texi}, lib/readline/doc/hsuser.texi
+       - documented new `history -d' option
+       - documented new \j and \l prompt string expansion sequences
+
+lib/readline/bind.c
+       - new static state variable, currently_reading_init_file, set to
+         1 while _rl_read_init_file is operating on a file
+       - changed _rl_init_file_error to include the name and line number
+         from the init file only if currently_reading_init_file is non-zero
+         (this is needed since applications like bash can call
+         rl_parse_and_bind, and error messages from those calls would be
+         misleading if they referred to the last inputrc file read
+
+bashline.c
+       - support for a `extended command keymap', which will allow
+         readline key sequences to be bound to unix commands using an
+         auxiliary keymap and a special function that knows how to execute
+         commands from it
+       - bind_keyseq_to_unix_command supports `bind -x'
+       - bash_execute_unix_command is the readline callback that looks in
+         an auxiliary keymap to find the shell command to execute for a
+         particular key sequence
+       - new variable, no_empty_command_completion, which suppresses $PATH
+         searching for command completion when TAB is typed on an empty
+         line
+
+bashline.h
+       - extern declaration for new function bind_keyseq_to_unix_command
+
+builtins/bind.def
+       - added `-x' option to bind a key sequence to a shell command
+
+builtins/help.def
+       - added `-s' option to just print a builtin's short_doc
+
+builtins/shopt.def
+       - added new shell option, no_empty_cmd_completion', mirroring value
+         of no_empty_command_completion
+
+doc/{bash.1,bashref.texi}
+       - documented new `bind -x' option
+       - documented new shopt `no_empty_cmd_completion' option
+       - documented new `help -s' option
+
+Makefile.in
+       - changed RELSTATUS to `devel'
+
+_distribution
+       - changed to `2.04'
+
+                                  3/15
+                                  ----
+support/shobj-conf
+       - add `-h $@' to linking options on Solaris 2 with gcc
+
+expr.c
+       - changes to add {pre,post}-{inc,dec}rement operators (++id, --id,
+         id++, id--).  These are somewhat more liberal than ksh93, and
+         may require more strict syntax checking down the line
+
+tests/arith.{tests,right}
+       - additional tests for {pre,post}-{inc,dec}rement operators
+
+                                  3/16
+                                  ----
+command.h
+       - structures and types for ksh-93-style arithmetic `for' command
+
+configure.in
+       - new `--enable-arith-for-command' option to compile arithmetic for
+         command code into the shell
+
+config.h.in
+       - new define, ARITH_FOR_COMMAND, turned on by configure
+
+parse.y
+       - changed read_token_word to parse a set of arithmetic for expressions
+         between (( and )) as long as the last token read before the `(('
+         was FOR
+       - added grammar rules to build arithmetic for commands
+
+make_cmd.c
+       - functions to parse (( ... )) into the three sub-expressions needed
+         for the arithmetic for command and create the command structures
+         (done this way instead of in the grammar rules to avoid forcing
+         users to quote special characters between the (( and )) )
+
+make_cmd.h
+       - extern declaration for make_arith_for_command
+
+copy_cmd.c
+       - code to copy arithmetic for commands
+
+dispose_cmd.c
+       - code to dispose of arithmetic for commands
+
+print_cmd.c
+       - code to print arithmetic for commands
+
+execute_cmd.c
+       - code to execute arithmetic for commands and note that they are
+         shell control structures for the piping code
+
+doc/{bash.1,bashref.texi}
+        - documented new arithmetic for command
+
+doc/bashref.texi
+       - documented new configure --enable-arith-for-command option
+
+                                  3/17
+                                  ----
+builtins/read.def
+       - added `-t timeout' option and code to support it
+
+                                  3/18
+                                  ----
+examples/loadables/Makefile.in
+       - various clean targets need to descend into perl
+
+examples/loadables/perl/Makefile.in
+       - added mostlyclean and maintainer-clean targets
+
+include
+       - new directory, with files from lib/posixheaders
+
+lib/posixheaders
+       - removed
+
+{posixwait,unionwait,maxpath}.h
+       - moved from top src directory to include subdir
+
+Makefile.in,builtins/Makefile.in,lib/{glob,malloc,sh,tilde}/Makefile.in
+       - updated dependencies and file lists for new include directory
+       - added BASHINCDIR variable, added -I${BASHINCDIR} to cc's include path
+
+MANIFEST,support/SYMLINKS
+       - updated for new include directory
+
+lib/readline/{ansi_stdlib,posixdir,posixjmp,posixstat,rlstdc}.h
+       - changed symlinks to point to ../../include rather than
+         ../posixheaders
+
+builtins/common.h
+       - changed `#include "../stdc.h"' to `#include "stdc.h"'
+
+builtins/{cd,exec,fc,history,pushd,source,type,umask,printf}.def
+builtins/{mkbuiltins,common,evalfile,evalstring,getopt}.c
+       - changed include specifications:
+               ../posixstat.h -> posixstat.h
+               ../filecntl.h -> filecntl.h
+               ../maxpath.h -> maxpath.h
+               ../memalloc.h -> memalloc.h
+
+include/shtty.h
+       - new file, contents of bashtty.h and code from jobs.c that includes
+         the appropriate terminal file
+
+lib/sh/shtty.c
+       - new file with some tty manipulation utility functions
+
+bashtty.h
+       - removed
+
+jobs.c, nojobs.c
+       - include shtty.h instead of bashty.h and other code that includes
+         the correct system-dependent tty include file
+
+lib/sh/Makefile.in
+       - added shtty.o as part of libsh.a
+
+MANIFEST
+       - added include/shtty.h and lib/sh/shtty.c, removed bashtty.h
+
+                                  3/19
+                                  ----
+lib/readline/display.c
+       - some more __MSDOS__ code to make readline work better with DJGPP:
+               output \r instead of tputs(term_cr, ...)
+
+lib/readline/terminal.c
+       - some changes for __DJGPP__ (one is of dubious value -- doesn't
+         DJGPP have a termcap library?)
+
+                                  3/23
+                                  ----
+configure.in
+       - make sure that the $CC argument to shobj-conf is quoted
+
+support/shobj-conf
+       - changes to SGI SHOBJ_LDFLAGS from David Kaelbling <drk@sgi.com>
+
+                                  3/24
+                                  ----
+lib/sh/zread.c
+       - interface to read(2) that restarts automatically if errno == EINTR
+
+externs.h
+       - new declarations for functions in lib/sh/{zread,zwrite}.c
+
+lib/sh/Makefile.in, Makefile.in
+       - add zread.c, zread.o to appropriate file lists
+
+{subst,input}.c, builtins/{evalstring.c,read.def}
+       - converted some loops around read() to call zread() instead
+
+lib/readline/rltty.h
+       - new struct _rl_tty_chars to save tty special characters
+
+lib/readline/rltty.c
+       - new function save_tty_chars to save tty special characters
+         (currently they're only saved -- nothing looks at them yet)
+       - two new internal library functions, _rl_disable_tty_signals ()
+         and _rl_restore_tty_signals (), intended to disable tty driver
+         signal processing for readline's literal-next code, so users
+         can do stuff like ^V^C and have ^C end up in the readline
+         buffer even if ^C is the terminal's interrupt character
+
+lib/readline/readline.c
+       - changed rl_quoted_insert to disable and restore tty signal
+         handling around the call to rl_read_key (), so users can put
+         tty special chars into the readline buffer
+
+                                  3/25
+                                  ----
+expr.c
+       - added `,' operator (expr1 , expr2) -- both expr1 and expr2 are
+         evaluated and the return value is the value of expr2.  Precedence
+         is higher than assignment (which makes it highest)
+       - make `lasttp' (pointer to last token) part of the expression
+         context that is saved and restored by {push,pop}_context.  This
+         is used only in error reporting
+
+doc/{bash.1,bashref.texi}
+       - documented new `,' arithmetic operator
+       - cleaned up some of the language concerning variables referenced
+         by name within an arithmetic expression
+
+lib/readline/readline.c
+       - new application-settable variable, rl_num_chars_to_read, which, if
+         set to a non-zero value, causes readline to return after reading
+         that many characters (or at least that many characters, if
+         rl_startup_hook is used to prime the input buffer) rather than
+         when reading a character bound to accept-line
+
+lib/readline/readline.h
+       - extern declaration for rl_num_chars_to_read
+
+builtins/read.def
+       - added new `-n nchars' option to read NCHARS from stdin rather than
+         a complete line.  Works both with and without using readline
+
+doc/{bash.1,builtins.texi}
+       - documented new `read -n nchars' option
+
+                                  3/26
+                                  ----
+execute_cmd.c
+       - make sure all uses of PIDs are of type pid_t
+
+redir.c
+       - broke stdin_redirects into two functions: stdin_redirection, which
+         checks a single redirection specification, and a new stdin_redirects,
+         which does what it did before but calls stdin_redirection for each
+         redirection in the chain
+
+                                  3/29
+                                  ----
+aclocal.m4
+       - new test, BASH_CHECK_DEV_STDIN, checks for /dev/stdin.  If it's
+         present HAVE_DEV_STDIN is defined and it's assumed that /dev/stdout
+         and /dev/stderr are present as well
+
+configure.in
+       - call BASH_CHECK_DEV_STDIN
+
+config.h.in
+       - add HAVE_DEV_STDIN, initially undefined
+
+test.c
+       - add /dev/std{in,out,err} to the special filenames that are handled
+         by test_stat() if HAVE_DEV_STDIN is not defined
+
+doc/{bash.1,bashref.texi}
+       - documented conditional expressions' handling of /dev/std{in,out,err}
+
+stringlib.c
+       - new function, find_string_in_alist, to find (or match as an extended
+         glob pattern) a string in a STRING_INT_ALIST and return the
+         associated token value
+
+externs.h
+       - extern declaration for find_string_in_alist
+
+redir.c
+       - new STRING_INT_ALIST list of filenames the redirection code handles
+         specially (_redir_special_filenames)
+       - new function, redir_special_open () to handle filenames found in
+         _redir_special_filenames (framework for /dev/tcp and /dev/udp, but
+         those are not implemented get)
+
+doc/{bash.1,bashref.texi}
+       - documented special filename handling in redirections
+
+                                  3/30
+                                  ----
+builtins/read.def
+       - added `-d delim' option, like ksh93, to read until delim rather
+         than newline
+
+doc/{bash.1,bashref.texi}
+       - documented new read `-d delim' option
+
+configure.in
+       - look for gethostbyname(3), inet_aton(3)
+       - look for <netdb.h> and <netinet/in.h>
+       - call BASH_FUNC_GETHOSTBYNAME if gethostbyname(3) is not in libc
+       - check for u_int and u_long types, default to `unsigned int' and
+         `unsigned long' respectively
+       - new enable option `--enable-net-redirections' to compile in the
+         /dev/tcp and /dev/udp redirection code
+
+aclocal.m4
+       - new macro, BASH_FUNC_GETHOSTBYNAME, looks for gethostbyname(3) in
+         the socket libraries if it's not found in libc
+
+config.h.in
+       - new defines: HAVE_GETHOSTBYNAME, HAVE_INET_ATON, HAVE_NETDB_H,
+         HAVE_NETINET_IN_H, NETWORK_REDIRECTIONS
+       - new defines: u_int, u_long
+
+lib/sh/inet_aton.c
+       - new file, from GNU libc, slightly modified to remove inet_addr()
+
+lib/sh/netopen.c
+       - new file, functions to create tcp/udp network connections.  Exports
+         a single function: netopen(pathname)
+
+externs.h
+       - extern declaration for netopen()
+
+lib/sh/Makefile.in, Makefile.in, MANIFEST
+       - added appropriate references to inet_aton.c and netopen.c
+
+config-bot.h
+       - if HAVE_SYS_SOCKET_H, HAVE_GETPEERNAME, and HAVE_NETINET_IN_H are
+         all defined, define HAVE_NETWORK
+
+redir.c
+       - call netopen for pathnames of the form /dev/(tcp|udp)/host/port
+         if HAVE_NETWORK is defined; print a warning message otherwise
+       - /dev/tcp and /dev/udp code is only compiled in if
+         NETWORK_REDIRECTIONS is defined
+
+                                  3/31
+                                  ----
+lib/sh/zread.c
+       - new function, zsyncfd(fd) which syncs the kernel's seek pointer on
+         FD with the last character returned by zreadc()
+
+externs.h
+       - extern declaration for zsyncfd
+
+builtins/read.def
+       - use zreadc if the input is not unbuffered (this cuts the number
+         of read(2) calls *way* down)
+       - if input is not unbuffered, call zsyncfd before returning to make
+         sure zreadc's buffering doesn't consume too much input
+
+                                   4/1
+                                   ---
+Makefile.in
+       - install bashbug with mode 555
+
+                                   4/2
+                                   ---
+shell.c
+       - make want_pending_command and read_from_stdin global rather than
+         local variables
+
+flags.c
+       - change which_set_flags to insert `c' and `s' if the `-c' and `-s'
+         invocation options, respectively, were supplied at shell startup
+
+bashline.c
+       - change bash_directory_completion_hook to change the logic for
+         deciding whether or not to parameter expand the directory name --
+         now we expand only if there's a `$' (still has problems if the
+         user quoted the `$') or a `` pair.  Fixes bug reported by
+         chuckjr@sinclair.net.  To fix the `$' problem, could possibly
+         check what the user typed with rl_line_buffer and start, end
+         parameters to gen_completion_matches
+       - changed attempt_shell_completion to slightly adjust the logic for
+         deciding whether or not a word is in a command position:  if the
+         word being completed has a single opening single or double quote
+         before the command separator, treat it as a candidate for (quoted)
+         command word completion
+       - now that we understand partially-quoted strings as completion
+         candidates, we can do command completion on certain unclosed
+         uses of $(...
+
+subst.c
+       - change extract_delimited_string to not return an error for an
+         unclosed construct if DOING_COMPLETION is non-zero
+
+                                   4/5
+                                   ---
+expr.c
+       - fixed `ss=09 ; let ss=10' bug by introducing one-token lookahead
+         after a string token is parsed.  If the next token is `=', we
+         don't evaluate the variable's value as an expression, since it's
+         not going to be used
+
+variables.h
+       - added new member to struct variable: exportstr -- for the future
+         caching of strings to be placed into the environment
+       - extern declaration for bind_variable_value
+
+variables.c
+       - make sure that the `exportstr' member of a struct variable is
+         initialized correctly, and put code in to free it where appropriate
+         (if non-null)
+       - new function, bind_variable_value(VAR, VALUE); make shell variable
+         VAR have value VALUE
+       - make sure var->exportstr is invalidated when a variable or function
+         is assigned a value
+
+builtins/declare.def
+       - call bind_variable_value instead of duplicating some of bind_variable
+         inline
+
+                                   4/6
+                                   ---
+variables.h
+       - new macros, VSETATTR and VUNSETATTR to set and clear variable
+         attributes
+
+builtins{read,set,setattr,declare}.def,{execute_cmd,expr,shell,subst,variables}.c
+       - change to use VSETATTR and VUNSETATTR
+
+                                   4/7
+                                   ---
+doc/Makefile.in
+       - if htmldir is set by configure, install the html files into that
+         directory with `make install' and remove them with `make uninstall'
+
+Makefile.in,doc/Makefile.in
+       - htmldir is set by configure and passed from the Makefile to the
+         install in the doc subdirectory
+
+configure.in
+       - substitute `htmldir' into Makefiles
+
+support/config.guess
+       - some small changes for Apple's Rhapsody
+
+lib/termcap/Makefile.in
+       - make the `distclean' and `maintainer-clean' targets remove Makefile
+
+lib/termcap/ltcap.h
+       - new private library include file, for Rhapsody __private_extern__
+         define
+
+lib/termcap/{termcap,tparam}.c
+       - include "ltcap.h"
+       - if HAVE_CONFIG_H is defined, include <stdlib.h> if HAVE_STDLIB_H is
+         defined, otherwise declare getenv, malloc, realloc as extern
+       - add __private_extern__ qualifier for extern data that Rhapsody
+         requires
+
+shell.c
+       - don't run the startup files in the rshd case if shell_level is >= 2
+         This should catch the case of
+               rsh machine bash -c 'echo a'
+         running the .bashrc twice, once for the shell started by rshd and
+         one for the shell running -c command
+
+                                   4/8
+                                   ---
+variables.c
+       - in initialize_shell_variables, unset the export attribute from
+         SSH_CLIENT if it exists and we got it from the initial environment
+
+shell.c
+       - don't bother unsetting export attribute from SSH_CLIENT, since we
+         now do it in initialize_shell_variables
+
+lib/readline/display.c
+       - don't check prompt_this_line[-2] in rl_redisplay if prompt_this_line
+         isn't at least 2 characters after the start of rl_display_prompt
+
+lib/readline/histfile.c
+       - change the name of the default history file to _history on MS-DOS
+
+lib/readline/histlib.h
+       - add an extern declaration for history_offset
+
+lib/readline/hist{expand,search}.c
+       - remove extern declaration for history_offset; now in histlib.h
+
+lib/readline/xmalloc.h
+       - new file, extern declarations for xmalloc, xrealloc, xfree
+
+lib/readline/rlprivate.h
+       - new file, with extern declarations for `readline private' global
+         variables and functions
+
+lib/readline/rlshell.h
+       - new file, with extern function declarations for stuff in shell.c
+
+lib/readline/Makefile.in
+       - add dependencies on xmalloc.h, rlshell.h
+       - add xmalloc.h, rlprivate.h to list of header files
+
+MANIFEST
+       - add lib/readline/xmalloc.h, lib/readline/rlprivate.h,
+         lib/readline/rlshell.h
+
+Makefile.in
+       - add $(RL_LIBSRC)/xmalloc, $(RL_LIBSRC)/rlprivate.h,
+         $(RL_LIBSRC)/rlshell.h to READLINE_SOURCE variable
+
+lib/readline/{bind,complete,display,funmap,histexpand,histfile,history,input,
+isearch,keymaps,kill,macro,readline,search,shell,util,vi_mode}.c
+       - include "xmalloc.h" rather than extern declarations for xmalloc,
+         xrealloc, xfree
+
+lib/readline/terminal.c
+       - new function, used in two places, _emx_get_screensize for EMX
+
+lib/readline/readline.c
+       - EMX apparently no longer needs _emx_build_environ
+
+lib/readline/signals.c
+       - support for __EMX__ in rl_signal_handler
+       - don't set the old handler passed to rl_set_sighandler to
+         rl_signal_handler, because that would cause infinite recursion if
+         that signal were generated
+
+lib/readline/xmalloc.c
+       - no longer the same as lib/malloc/xmalloc.c, which is no longer
+         used by anyone
+       - changes to include xmalloc.h, define READLINE_LIBRARY, change
+         some of the argument types
+
+lib/tilde/tilde.c
+       - add prototypes for extern function declarations if __STDC__
+         defined
+
+lib/readline/{terminal,bind,readline,nls,histexpand}.c
+       - include "rlshell.h" for function prototypes
+
+                                   4/9
+                                   ---
+lib/readline/{bind,callback,complete,display,input,isearch,kill,macro,nls,
+parens,readline,rltty,search,signals,terminal,util,vi_mode}.c
+       - include "rlprivate.h"
+       - remove extern declarations already in rlprivate.h
+
+xmalloc.c
+       - xfree should take a PTR_T as its argument
+
+general.h
+       - change prototype for xfree to use void * instead of char *
+
+lib/malloc/malloc.c
+       - define PTR_T like it is defined in general.h
+       - malloc() returns a PTR_T
+       - free() takes a PTR_T as its argument
+       - realloc() returns a PTR_T and takes a PTR_T as its first argument
+       - memalign returns a PTR_T
+       - valloc returns a PTR_T
+       - calloc returns a PTR_T
+       - cfree() takes a PTR_T
+
+variables.c
+       - new function: char **all_variables_matching_prefix (char *prefix)
+
+variables.h
+       - extern declaration for all_variables_matching_prefix
+
+bashline.c
+       - converted variable_completion_function to use
+         all_variables_matching_prefix
+
+stringlib.c
+       - new function, char **alloc_array(n), allocates an argv-style
+         array of strings with room for N members
+
+externs.h
+       - extern declaration for alloc_array
+
+                                  4/13
+                                  ----
+lib/readline/keymaps.c
+       - include "readline.h"
+       - remove extern function declarations
+
+include/stdc.h
+       - break the definition of __P out from a strict __STDC__ block,
+         since __GNUC__ and __cplusplus also indicate that prototypes
+         are available
+
+lib/readline/readline.h
+       - adjust conditional declaration of rl_message, since __cplusplus
+         indicates that prototypes are available
+
+lib/readline/rlstdc.h
+       - private copy, modified, no longer symlinked to ../../include/stdc.h
+       - __P is defined if __GNUC__ or __cplusplus is defined
+       - removed defines for __STRING, const, inline, signed, volatile, since
+         readline does not use them
+
+lib/readline/{search,readline}.c
+       - extern declaration for _rl_free_history_entry with prototypes,
+         since it's not in rlprivate.h
+
+lib/readline/history.h
+       - added some missing `extern's in function declarations
+
+lib/readline/undo.c
+       - include "rlprivate.h"
+
+lib/readline/shell.c
+       - include "rlshell.h"
+
+lib/readline/Makefile.in
+       - update dependencies for undo.c, shell.c
+
+lib/tilde/tilde.h
+       - add #define for __P if not already defined
+       - use prototypes in extern function declarations with __P()
+
+lib/readline/doc/rluserman.texinfo
+       - new file, derived from rlman.texinfo
+
+{bashline,findcmd,general,pathexp}.c, builtins/getopts.def
+       - call alloc_array(N) instead of (char **)xmalloc (N * sizeof (char *))
+
+subst.c
+       - added code to implement ksh-93 ${!prefix*} expansion
+
+doc/{bash.1,bashref.texi}
+       - documented new ${!prefix*} expansion
+
+                                  4/15
+                                  ----
+execute_cmd.c
+       - new variable, this_shell_function, points to SHELL_VAR of currently
+         executing shell function
+
+variables.c
+       - new dynamic variable, FUNCNAME -- invisible when not executing shell
+         function
+
+doc/{bash.1,bashref.texi}
+       - documented new FUNCNAME variable
+
+                                  4/16
+                                  ----
+support/rlvers.sh
+       - add -T option to specify correct termcap library
+
+configure.in
+       - Irix 4.x still needs to link with -lsun if it contains a replacement
+         getpwent function that works with NIS
+       - if we're configuring with an already-installed readline library,
+         call BASH_CHECK_LIB_TERMCAP and pass the resulting $TERMCAP_LIB to
+         support/rlvers.sh
+
+lib/readline/readline.c
+       - in rl_forward, if rl_point ends up being < 0, set it to 0
+
+lib/readline/exammples/excallback.c
+       - new callback example code, from `Jeff Solomon <jsolomon@stanford.edu>'
+
+lib/sh/getcwd.c
+       - define NULL as 0 if not defined by one of the standard include files
+       - cast result of malloc and realloc to (char *) where appropriate
+
+variables.c
+       - new functions for use by dynamic variables: null_assign and
+         null_array_assign.  Used as assign_func for a particular variable,
+         they cause assignments to that variable to be silently ignored
+       - FUNCNAME and GROUPS are no longer readonly
+       - FUNCNAME changed to use null_assign
+       - GROUPS changed to use null_array_assign.  This means that the
+         variable can be unset if desired (like for Oracle startup scripts),
+         but cannot be assigned to
+
+doc/{bash.1,bashref.texi}
+       - added text about assignments being silently discarded to descriptions
+         of FUNCNAME and GROUPS
+       - removed text saying that GROUPS is readonly
+       - added standard text about GROUPS being unset and losing its special
+         properties, even if reset
+
+command.h
+       - new command type, cm_subshell, actually causes the shell to fork
+         and then executes the command in the SUBSHELL_COM struct
+
+parse.y
+       - ( ... ) now creates a command of type cm_subshell, with the same
+         flag CMD_WANT_SUBSHELL as previous
+
+make_cmd.c
+       - new function make_subshell_command
+
+make_cmd.h
+       - extern declaration for make_subshell_command
+
+dispose_cmd.c
+       - code to destroy a SUBSHELL_COM
+
+copy_cmd.c
+       - code to duplicate a SUBSHELL_COM
+
+print_cmd.c
+       - code to print a SUBSHELL_COM
+
+execute_cmd.c
+       - broke the code that handles executing commands in subshells out of
+         execute_command_internal into a new function, execute_in_subshell,
+         with the same arguments
+       - executing a command of type cm_subshell is just a slightly special
+         case, handled in execute_in_subshell
+
+                                  4/18
+                                  ----
+execute_cmd.c
+       - changed code in execute_command_internal that executes subshell
+         commands to check for command->type == cm_subshell in addition to
+         checking that commmand->flags & CMD_WANT_SUBSHELL is non-zero
+       - changed execute_in_subshell to set the CMD_NO_FORK flag on the
+         command to be executed by a command of type cm_subshell
+         (command->value.Subshell->command), if that command is a simple
+         command (type == cm_simple) or a nested subshell (type == cm_subshell)
+         and is not being timed
+       - changed execute_command_internal to just call and return the value
+         returned by execute_in_subshell if it gets a command of type
+         cm_subshell with flags including CMD_NO_FORK
+
+lib/malloc/malloc.c
+       - morecore() should always return through morecore_done, not with a
+         simple `return'
+
+                                  4/20
+                                  ----
+variables.c
+       - new function, quote_array_assignment_chars, backslash quotes all
+         `[' and `]' before an `=' in a word that's part of the body of a
+         compound array assignment.  Needed because we run the list through
+         the globbing code now.  Don't bother if `=' does not appear in
+         the string or if the first char is not `['
+       - call quote_array_assignment_chars from assign_array_var_from_string
+         now
+
+eval.c
+       - moved parse_string_to_word_list to parse.y
+
+parse.y
+       - moved parse_string_to_word_list here.  Much simpler -- no longer
+         tries to parse a command, but just reads tokens using read_token().
+         Any token but a WORD or ASSIGNMENT_WORD causes a syntax error.
+         Don't have to mess around with saving global_command or calling
+         parse_command, but do need to save and restore the history stuff,
+         so the array assignment doesn't get saved on the history list
+
+                                  4/21
+                                  ----
+nojobs.c
+       - changed to use functions in lib/sh/shtty.c (tt{get,set}attr) for
+         the terminal attributes
+       - added a `flags' field to struct proc_status, flags are PROC_RUNNING
+         and PROC_NOTIFIED (status has been returned to `wait')
+       - functions check flags & PROC_RUNNING to check whether or not a
+         particular process is still alive; PROC_RUNNING is reset by
+         set_pid_status
+       - new function, mark_dead_jobs_as_notified, same function as the one
+         in jobs.c
+       - cleanup_dead_jobs reaps jobs only if they're dead and not marked
+         as notified
+       - wait_for_background pids marks all pids as notified and reaps them
+         before it returns, since it's called by the `wait' builtin
+       - wait_for_single_pid marks the pid being waited for as notified so
+         its slot can be reclaimed -- it's only called by the `wait' builtin
+       - new function, process_exit_status, to turn what wait(2) takes into
+         an exit status
+
+                                  4/22
+                                  ----
+nojobs.c
+       - add_pid takes a new second argument, async_p, which is non-zero if
+         the process is in the background
+       - new flag, PROC_ASYNC, set by add_pid
+       - set_pid_status now sets the PROC_NOTIFIED flag if PROC_ASYNC is unset,
+         so foreground jobs get cleaned up right away
+       - changed mark_dead_jobs_as_notified to take a `force' argument; if
+         non-zero, it marks only enough dead jobs to make the number of
+         un-notified dead jobs < CHILD_MAX
+       - new function, reap_dead_jobs, same as in jobs.c
+
+execute_cmd.c
+       - don't need separate cases for REAP any more
+
+                                  4/23
+                                  ----
+builtins/printf.def
+       - new function, tescape, which processes a single backslash
+         escape sequence and returns the number of characters consumed by
+         the argument string (code taken from bexpand)
+       - changed bexpand to call tescape rather than do backslash-escape
+         sequence conversion itself
+       - changed occurrences of `illegal' in error messages to `invalid'
+       - printf no longer calls ansicstr to translate backslash-escape
+         sequences; the mainline printf code now calls tescape whenever it
+         hits a backslash
+
+                                  4/26
+                                  ----
+subst.c
+       - new variable, garglist, set to list of words to be expanded after
+         leading assignment statements are removed
+       - command_substitute now calls maybe_make_exported_env before making
+         the child process if there are no variable assignments preceding
+         the command currently being expanded, or if the command currently
+         being expanded consists only of variable assignments
+
+execute_cmd.c
+       - the `early fork' code in execute_simple_command now calls
+         maybe_make_export_env before forking because execute_disk_command
+         would do that in the vast majority of cases, and this will obviate
+         the need to do it for subsequent commands if the environment does
+         not change
+
+                                  4/27
+                                  ----
+variables.h
+       - more macros to manipulate the exportstr member of a SHELL_VAR
+       - changed initialize_shell_variables to cache the value from the
+         environment as the initial exportstr for all imported variables
+       - changed make_var_array to use exportstr if it exists, instead
+         of computing the value
+       - changed make_var_array to cache exportstr for exported functions,
+         so they don't have to be deparsed every time the export env is
+         remade
+
+                                  4/28
+                                  ----
+lib/readline/{histlib,rldefs}.h
+       - changed STREQN macro to evaluate to 1 if the third argument is 0
+
+lib/readline/search.c
+       - changed rl_history_search_{for,back}ward so they leave point at
+         the end of the line when the string to search for is empty, like
+         previous-history and next-history
+       - broke common code out of rl_history_search_{for,back}ward into
+         a new function, rl_history_search_reinit
+       - rewrote rl_history_search_internal to be more like the
+         non-incremental search functions, use noninc_search_from_pos,
+         and leave the last history line found in the current line buffer
+         if the search fails
+       - new function, make_history_line_current, takes care of making
+         the current line buffer a copy of the history entry passed as an
+         argument; used by rl_history_search_internal and noninc_dosearch
+
+subst.c
+       - make ${!prefix@} be the same as ${!prefix*} for (undocumented)
+         ksh93 compatibility
+
+                                  4/30
+                                  ----
+lib/readline/doc/rltech.texinfo
+       - added note about including <readline/readline.h>, and that <stdio.h>
+         should be included before readline.h
+
+lib/readline/doc/hstech.texinfo
+       - added note about including <readline/history.h>
+
+lib/readline/doc/manvers.texinfo
+       - updated version to 4.1
+
+lib/readline/{bind,complete,display,isearch,nls,parens,readline,signals,tilde,
+histexpand}.c
+       - added prototypes with __P((...)) for forward static function
+         declarations
+
+lib/readline/display.c
+       - broke the code that initializes VISIBLE_LINE and INVISIBLE_LINE out
+         of rl_redisplay into a new function, init_line_structures, which
+         takes an argument giving the minimum number of characters that the
+         line must hold 
+       - new function for use by applications that want to display the
+         initial prompt themselves rather than having the first call to
+         readline do it:  rl_on_new_line_with_prompt (modified from code in
+         the CLISP distribution)
+
+lib/readline/readline.c
+       - new external variable, rl_already_prompted, to let readline know
+         that the prompt string has already been displayed on the screen
+         before the first call to readline
+       - test rl_already_prompted before displaying the prompt in
+         readline_internal_setup
+       - if rl_already_prompted is non-zero, readline_internal_setup calls
+         rl_on_new_line_with_prompt instead of rl_on_new_line
+
+lib/readline/readline.h
+       - extern declaration for rl_on_new_line_with_prompt
+       - extern declaration for rl_already_prompted
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_on_new_line_with_prompt and rl_already_prompted
+
+builtins/read.def
+       - new -s option (silent mode).  Input from a terminal is not echoed
+
+doc/{bash.1,bashref.texi}
+       - documented new `-s' option to read builtin
+
+                                   5/3
+                                   ---
+lib/readline/vi_mode.c
+       - replaced references to rl_getc with (*rl_getc_function)
+
+[bash-2.04-devel frozen]
+
+                                   5/5
+                                   ---
+subst.c
+       - make sure that verify_substring_values always passes malloc'd
+         memory to maybe_expand_string as the string to be expanded,
+         since it gets freed on errors
+
+support/shobj-conf
+       - don't need -R option for shared libraries on Solaris
+       - new stanza for OSF/1 machines with gcc
+
+lib/readline/readline.c
+       - new variable, rl_gnu_readline_p, always 1.  Available to allow
+         readline users to test whether or not they're linking against
+         the true readline, rather than some bogus replacement (from CLISP)
+
+lib/readline/readline.h
+       - extern declaration for rl_gnu_readline_p
+
+hashlib.h, hashcmd.h
+       - added prototypes to extern function declarations
+
+pcomplete.h
+       - new file, declarations for the programmable completion stuff
+
+pcomplib.c
+       - new file, library functions for programmable completion
+
+                                   5/6
+                                   ---
+builtins/complete.def
+       - new file, interface to programmable completion management
+
+configure.in
+       - new enable argument --enable-progcomp, defines
+         PROGRAMMABLE_COMPLETION
+
+config.h.in
+       - #define for PROGRAMMABLE_COMPLETION
+
+config-bot.h
+       - if PROGRAMMABLE_COMPLETION is defined and READLINE is not,
+         #undef PROGRAMMABLE_COMPLETION
+
+pcomplete.c
+       - new file, placeholder for programmable completion generators and
+         associated functions
+
+Makefile.in, builtins/Makefile.in
+       - changes to add pcomplete.c, builtins/complete.def
+
+                                   5/7
+                                   ---
+subst.c
+       - new function, #ifdef READLINE, skip_to_delim (s, i, delims).
+         Starting at s[i], return the index of the first character in s
+         that is contained in delims.  Understands shell quoting.
+       - added two arguments to list_string_with_quotes: an index to
+         watch for, and a pointer to int to return the index into the
+         created word list of the word containing the sentinel.  Now
+         compiled in all the time.  The returned index starts at 1.
+
+subst.h
+       - extern declarations for char_is_quoted, unclosed_pair, and
+         skip_to_delim
+       - changed extern declaration for list_string_with_quotes, moved
+         it out of the #ifdef ARRAY_VARS section
+
+bashline.c
+       - removed extern declarations for char_is_quoted and unclosed_pair
+
+variables.c
+       - new function, SHELL_VAR **all_exported_variables()
+       = new function, SHELL_VAR **all_array_variables(), #ifdef ARRAY_VARS
+
+variables.h
+       - extern declaration for all_exported_variables, all_array_variables
+
+lib/sh/strpbrk.c
+       - replacement if we don't have strpbrk(3)
+
+configure.in, config.h.in
+       - check for strpbrk(3), define HAVE_STRPBRK if found
+
+builtins/shopt.def
+       - new function, char **get_shopt_options (), returns an array of
+         shopt option names
+
+builtins/set.def
+       - new function, char **get_minus_o_opts (), returns an array of
+         `set -o' option names
+
+builtins/common.h
+       - extern declarations for get_shopt_options, get_minus_o_opts
+
+                                  5/10
+                                  ----
+pathexp.c
+       - make the POSIX_GLOB_LIBRARY code implement the GLOBIGNORE stuff
+
+                                  5/11
+                                  ----
+array.c
+       - new convenience function, char **array_to_argv (ARRAY *),
+         converts an array to a list of string values
+
+array.h
+       - extern declaration for array_to_argv
+
+execute_cmd.c
+       - new convenience function, int execute_shell_function (SHELL_VAR *,
+         WORD_LIST *)
+
+execute_cmd.h
+       - extern declaration for execute_shell_function
+
+builtins/evalstring.c
+       - make parse_and_execute unwind_protect current_prompt_string
+         if the shell is interactive
+
+                                  5/12
+                                  ----
+variables.c
+       - moved bind_int_variable from expr.c to here; it now returns a
+         SHELL_VAR *, like the other variable binding functions
+
+variables.h
+       - extern declaration for bind_int_variable
+
+                                  5/14
+                                  ----
+bashline.c, parse.y, general.c, make_cmd.c, subst.c, braces.c, execute_cmd.c
+       - replaced some common code sequences with calls to substring()
+
+lib/readline/doc/rltech.texinfo
+       - fixed small typo in description of rl_completion_entry_function
+
+                                  5/18
+                                  ----
+stringlib.c
+       - new function, strcreplace(char *string, int c, char *text, int do_glob)
+         replaces all occurrences of C in STRING with TEXT.  Backslash may
+         be used to quote C.  If DO_GLOB is non-zero, the replacement TEXT
+         is quoted to protect globbing characters.
+
+externs.h
+       - extern declaration for strcreplace
+
+bashhist.c
+       - use strcreplace in expand_histignore_pattern
+
+pcomplete.c
+       - finished initial implementation of programmable completion
+
+alias.c
+       - code to set the aliases itemlist to dirty when an alias is added
+         or removed, if PROGRAMMABLE_COMPLETION is defined
+
+variables.c
+       - code to set the functions itemlist to dirty when a shell function
+         is added or removed, if PROGRAMMABLE_COMPLETION is defined
+
+builtins/enable.def
+       - code to set the builtins itemlist to dirty when a shell builtin
+         is added or removed, if PROGRAMMABLE_COMPLETION is defined
+       - code to set the enabled and disabled itemlists to dirty when a
+         builtin is enabled or disabled, if PROGRAMMABLE_COMPLETION is
+         defined
+
+builtins/shopt.def
+       - new shell option, `progcomp', on if programmable_completion_enabled
+         (from pcomplete.c) is non-zero
+
+doc/{bash.1,bashref.texi}
+       - note that `${' is not eligible for brace expansion to avoid
+         conflicts with parameter expansion
+
+                                  5/19
+                                  ----
+builtins/complete.def
+       - added a new `compgen' builtin for use by completion functions
+
+                                  5/21
+                                  ----
+bashline.c
+       - new function, void clear_hostname_list(void), to delete all the
+         entries in the hostname completion list
+
+bashline.h
+       - extern declaration for clear_hostname_list
+
+variables.c
+       - changed sv_hostfile to clear the hostname list if $HOSTFILE is
+         unset
+
+doc/{bash.1,bashref.texi}
+       - documented new behavior of HOSTFILE when it's unset
+       - added some awkwardly-worded text to make it clear that an
+         interactive shell cannot be started with non-option arguments
+         or with the -c option
+
+shell.c
+       - restored NON_INTERACTIVE_LOGIN_SHELLS test, so that if it is
+         defined, shells with argv[0][0] == '-' and not in posix mode
+         run the startup files even if non-interactive
+
+config-top.h
+       - added commented-out #define for NON_INTERACTIVE_LOGIN_SHELLS
+
+                                  5/24
+                                  ----
+subst.c
+       - make sure the characters in IFS are cast to unsigned before being
+         indexed in ifscmap (expand_word_internal)
+
+                                  5/25
+                                  ----
+parse.y
+       - change grammar rule for arithmetic for expressions to handle a
+         list_terminator after the `))' instead of requiring a newline_list
+
+subst.c
+       - fix so that variable indirection can reference the shell's special
+         variables (like $0...$9, $$, $#, etc.)
+
+pcomplete.c
+       - changed gen_wordlist_matches to use split_at_delims to split the
+         string at $IFS first, then expand each individual word
+
+                                  5/27
+                                  ----
+lib/readline/histfile.c
+       - change things so that O_BINARY mode is used when reading and writing
+         the history file on cygwin32 as well as OS/2 (__EMX__)
+
+parse.y
+       - add calls to push_delimiter and pop_delimiter around the call
+         to parse_matched_pair when parsing $'...' and $"..." so the
+         history entry is added correctly
+
+                                  5/28
+                                  ----
+doc/{bash.1,bashref.texi}, lib/readline/doc/rluser.texinfo
+       - documented new programmable completion facilities
+
+doc/bashref.texi
+       - documented new configure `--enable-progcomp' option
+
+                                   6/1
+                                   ---
+variables.c
+       - if make_local_variable is being asked to make a local shadow
+         variable of a read-only variable, print an error message and
+         return NULL
+       - if make_local_variable returns NULL to make_local_array_variable,
+         just return it
+
+builtins/declare.def
+       - if we're making local variables, and make_local_array_variable or
+         make_local_variable returns NULL, just flag an error and go on
+
+                                   6/2
+                                   ---
+Makefile.in
+       - changed release status to `alpha1'
+
+[bash-2.04-alpha1 frozen]
+
+                                  6/18
+                                  ----
+bashline.c
+       - fixed find_cmd_start so that it doesn't spin-loop on commands with
+         a command separator like `;' or `&'.  Problem was not incrementing
+         `os' past the delimiter found
+
+                                  6/21
+                                  ----
+variables.c
+       - cosmetic change: introduced two macros to encapsulate initialization
+         of dynamic variables
+
+                                  6/23
+                                  ----
+pcomplib.c
+       - new function: num_progcomps(void), returns the number of entries in
+         the programmable completions hash table
+
+pcomplete.h
+       - extern declaration for num_progcomps
+
+bashline.c
+       - make sure some programmable completions have been defined before
+         diving into the programmable completion code
+
+shell.c
+       - in open_shell_script, move the fd opened to the script to a high
+         one with move_to_high_fd in all cases -- the buffered input code
+         still has problems if fd == 0 and later on fd 0 is closed or
+         redirected (cf. input.c:check_bash_input())
+
+builtins/printf.def
+       - getlong() now calls strtol directly with a third argument of 0 so
+         it can handle 0x (hex) and 0 (octal) prefixes, which legal_number
+         does not -- this has implications for arguments to %d that begin
+         with `0'
+
+lib/sh/getenv.c
+       - make sure that the variable found in the temporary environment has
+         a non-null value before calling savestring() on it
+
+subst.c
+       - make sure split_at_delims returns 0 in *nwp and *cwp if handed a
+         null or empty string
+
+pcomplete.c
+       - make sure build_arg_list handles lwords == 0, as it will be if an
+         empty command line is handed to the programmable completion code
+         (like compgen -C xyz)
+
+execute_cmd.c
+       - make sure execute_shell_function passes a non-null bitmap of fds to
+         close to execute_function, allocating and deallocating it locally
+
+sig.c
+       - don't mess with SIGPROF in initialize_terminating_signals
+
+jobs.c, nojobs.c
+       - if the user has requested it with checkwinsize, check for a new
+         window size after a job exits due to a signal as well as being
+         stopped
+
+lib/readline/kill.c
+       - changed rl_kill_region to set the point to the beginning of the
+         region after the kill is performed
+
+                                  6/24
+                                  ----
+configure.in
+       - make sure ranges ([1-9]*) are protected with [...] for m4 quoting
+
+variables.c
+       - make sure that bind_variable_value honors `set -a' and that it
+         marks the environment for recreation if necessary
+
+                                  6/25
+                                  ----
+lib/readline/complete.c
+       - if we're completing at the end of the line, find_completion_word
+         shouldn't test whether the character is a special word break
+         char and (possibly) advance rl_point past the end of the buffer
+
+parse.y
+       - change mk_msgstr to write embedded newlines as `\n"<NL>"', as the
+         PO file format apparently requires
+
+                                  6/28
+                                  ----
+lib/readline/display.c
+       - code to manage the growth of the inv_lbreaks and vis_lbreaks arrays
+         beyond 256, since there are pathalogical command lines that can
+         have more than 256 line breaks for redisplay
+
+                                  6/30
+                                  ----
+stringlib.c
+       - include pathexp.h for extern declaration of quote_globbing_chars
+
+variables.h
+       - change CACHE_EXPORTSTR to savestring() the value and not set the
+         att_importstr flag
+
+                                   7/6
+                                   ---
+support/bashbug.sh
+       - bashbug now accepts --help and --version options
+
+bashline.c
+       - change bash_quote_filename to use single quotes if the user
+         does not specify an opening quote character and the filename being
+         completed contains newlines
+
+                                   7/8
+                                   ---
+configure.in, aclocal.m4, config.h.in
+       - BASH_TYPE_INT32_T --> BASH_TYPE_BITS32_T; int32_t --> bits32_t
+       - BASH_TYPE_U_INT32_T --> BASH_TYPE_U_BITS32_T; u_int32_t --> u_bits32_t
+
+lib/malloc/{malloc,gmalloc}.c, lib/sh/inet_aton.c
+       - int32_t --> bits32_t; u_int32_t --> u_bits32_t
+
+aclocal.m4
+       - new tests: BASH_TYPE_BITS16_T, BASH_TYPE_U_BITS16_T
+
+configure.in
+       - add check for sizeof short, sizeof char
+       - call BASH_TYPE_BITS16_T, BASH_TYPE_U_BITS16_T
+
+config.h.in
+       - new #defines for bits16_t, u_bits16_t
+
+lib/malloc/malloc.c
+       - use u_bits16_t for type of mi_magic2
+
+
+                                  7/16
+                                  ----
+lib/readline/display.c
+       - new private library function, _rl_strip_prompt, to remove instances
+         of RL_PROMPT_{START,END}_IGNORE from the passed prompt string
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_strip_prompt
+
+lib/readline/readline.c
+       - call _rl_strip_prompt before outputting the prompt if we're not
+         doing any echoing of input chars (readline_echoing_p == 0)
+
+Makefile.in
+       - tentative change to rule for parser-built: use $< instead of
+         `y.tab.h' in recipe
+
+                                  7/19
+                                  ----
+support/config.{guess,sub}
+       - add code to handle all versions of Mac OS (e.g., Mac OS X)
+
+                                  7/26
+                                  ----
+lib/readline/bind.c
+       - on cygwin32, treat \r\n as a line terminator when reading the
+         inputrc file
+
+                                  7/29
+                                  ----
+lib/sh/netopen.c
+       - fixed problem in _getaddr with copying the address returned from
+         gethostbyname to the `struct in_addr *' argument -- hostnames
+         now work in /dev/(tcp|udp)/host/port
+
+                                   8/2
+                                   ---
+configure.in
+       - on Apple Rhapsody systems, set LOCAL_CFLAGS to -DRHAPSODY
+
+variables.h
+       - changes from Apple for building fat binaries on Rhapsody,
+         setting HOSTYPE, OSTYPE, VENDOR, and MACHTYPE
+
+lib/readline/terminal.c
+       - some work on the `dumb terminal' setup code in _rl_init_terminal_io
+         to make sure it's complete for use by the redisplay code and some
+         stuff in {readline,complete}.c
+
+lib/readline/display.c
+       - new function, _rl_current_display_line, returns the number of
+         lines down from the first `screen line' of the current readline
+         line the cursor is
+
+lib/readline/readline.c
+       - make rl_refresh_line call _rl_current_display_line
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_current_display_line
+
+                                   8/3
+                                   ---
+doc/bashref.texi
+       - reorganized slightly:
+               o a new shell builtins chapter
+               o a new shell variables chapter
+               o a new special builtins section
+               o bourne shell features chapter removed
+               o alias builtins moved to the bash builtins section
+               o bourne shell differences moved to appendix
+               o order of readline and history chapters swapped
+               o indices are now unnumbered appendices
+               o some text cleaned up and some explanatory text added
+
+lib/readline/terminal.c
+       - if a calling application is using a custom redisplay function,
+         don't call tgetent to get the terminal attributes, since those
+         are used only by the redisplay code.  Still get the window
+         size, though
+
+lib/glob/fnmatch.c
+       - range comparisons in bracket expressions no longer use strcoll(3),
+         since in some locales (de, for example), [A-Z] matches all
+         characters
+
+parse.y, print_cmd.c
+       - some changes to make sure the shell compiles when
+         DPAREN_ARITHMETIC is not defined but ARITH_FOR_COMMAND is
+
+                                   8/5
+                                   ---
+redir.c
+       - in the here document code in do_redirection_internal, check
+         that the file descriptor returned by here_document_to_fd is not
+         the same as a file descriptor specified as the redirector
+         before closing it
+
+                                   8/6
+                                   ---
+parse.y
+       - make sure the pipline rule for `timespec BANG pipeline' sets the
+         CMD_INVERT_RETURN flag for the pipeline command
+
+builtins/wait.def
+       - use setjmp with a special jump buffer to take longjmps in the
+         case that a SIGINT is received while waiting for jobs or processes
+         it makes wait return with a status > 128, as POSIX.2 specifies
+
+{jobs,nojobs}.c
+       - changed wait_sigint_handler to longjmp to wait_intr_buf if it's
+         executing the wait builtin and SIGINT is trapped.  It calls
+         trap_handler to make sure a pending trap for SIGINT is set also,
+         so the trap is taken when the wait builtin returns
+
+                                   8/9
+                                   ---
+jobs.c
+       - save and restore the value of errno in sigchld_handler
+
+trap.c
+       - save and restore the value of errno in trap_handler
+
+                                  8/10
+                                  ----
+Makefile.in
+       - changed release status to beta1
+
+                                  8/13
+                                  ----
+include/posixtime.h
+       - new file to encapsulate the <time.h> and <sys/time.h> mess
+
+Makefile.in
+       - add posixtime.h to list of include files in BASHINCFILES
+       - update dependencies for general.o, execute_cmd.o
+
+general.c, execute_cmd.c, builtins/times.def
+       - include posixtime.h instead of <time.h>, <sys/time.h>
+
+general.c
+       - protect inclusion of <sys/times.h> with HAVE_SYS_TIMES_H check
+
+builtins/Makefile.in
+       - update dependencies for times.o
+
+                                  8/16
+                                  ----
+lib/sh/timeval.c
+       - moved functions dealing with struct timevals here from general.c
+         and execute_cmd.c
+
+lib/sh/clock.c
+       - moved functions dealing with clock_ts here from general.c
+         (print_time_in_hz renamed to print_clock_t)
+
+externs.h
+       - moved extern declarations for timeval_to_secs and print_timeval
+         here from general.h
+       - moved extern declarations for clock_t_to_secs and print_clock_t
+         here from general.h
+
+builtins/times.def
+       - calls to print_time_in_hz changed to print_clock_t
+
+Makefile.in
+       - added references for lib/sh/timeval.c and lib/sh/clock.c
+
+lib/sh/Makefile.in
+       - clock.o and timeval.o are now included in libsh.a
+
+                                  8/23
+                                  ----
+execute_cmd.c
+       - make sure last_command_exit_value is updated before running a
+         DEBUG trap in the cm_simple case of execute_command_internal
+
+lib/readline/display.c
+       - new function, static void redraw_prompt (char *), used to
+         redraw the last line of a multiline prompt that possibly
+         contains terminal escape sequences
+       - call redraw_prompt from _rl_redisplay_after_sigwinch
+
+                                  8/24
+                                  ----
+lib/readline/bind.c
+       - new struct with names of string-valued readline variables and
+         handler functions to call when the variable is set
+       - changed rl_variable_bind to use functions to find boolean vars
+         and string vars in their respective lists
+       - new function, bool_to_int, to translate a boolean value that may
+         appear as an argument to `set <boolean-var-name>' to 1 or 0
+       - new function, hack_special_boolean_var, called if the element in
+         the boolean_vars struct has the V_SPECIAL flag set, to provide
+         any necessary other action when a boolean variable is set
+       - new functions to be called when each string variable is set;
+         called by rl_variable_bind
+
+execute_cmd.c
+       - do_piping no longer sets pipes to O_TEXT mode if __CYGWIN32__
+         is defined
+
+                                  8/25
+                                  ----
+subst.c
+       - parameter_brace_patsub now mallocs a local copy of `patsub', because
+         if it starts with a `/' we increment it, and functions down the call
+         chain will free that on an error (and if we pass the incremented
+         value, will try to free unallocated memory)
+       - pos_params now short-circuits and returns a null string immediately
+         if start == end, meaning we want 0 positional parameters
+
+                                  8/26
+                                  ----
+subst.c
+       - fixed pat_subst to correctly handle a null replacement string with
+         a null pattern string prefixed with `%' or `#'
+
+                                   9/3
+                                   ---
+variables.c
+       - don't import shell functions from the environment if the shell was
+         started with -n
+
+                                   9/8
+                                   ---
+subst.c
+       - if a command substitution is being performed inside a shell function,
+         catch `return' in command_substitute so that a return inside the
+         command substitution doesn't jump back to execute_function (or one
+         of its brethren) and go on with the command
+
+parse.y
+       - in history_delimiting_chars, if the first line is `for var' and
+         command_oriented_history is active, we don't want a semicolon if
+         the next token to be read is `in', but we do want one otherwise.
+         All we can do is check shell_input_line and see if the next chars
+         are `in' -- if so, we return " "
+
+                                  9/16
+                                  ----
+builtins/hash.def
+       - don't allow `hash -p /pathname/with/slashes name' if the shell
+         is restricted
+
+doc/{bash.1,bashref.texi}
+       - updated description of restricted shell mode
+
+lib/readline/display.c
+       - fixed a bug in _rl_update_final which used the inv_lbreaks array
+         to index into visible_line
+
+jobs.c
+       - waitchld() need not go through the pain of setting up an environment
+         to execute traps on SIGCHLD if children_exited == 0
+       - waitchld returns -1 if waitpid() returns -1 with errno == ECHILD,
+         indicating that there are no unwaited-for child processes, and it
+         has not yet reaped any dead children
+       - wait_for, wait_for_single_pid return -1 if waitchld() returns -1
+       - new function, mark_all_jobs_as_dead
+       - wait_for_background_pids calls mark_all_jobs_as_dead if
+         wait_for_single_pid returns -1 with errno == ECHILD, since there are
+         no unwaited-for child processes
+
+subst.c
+       - tentative change: subshells started for command substitution no
+         longer unconditionally disable job control
+
+                                  9/17
+                                  ----
+parse.y
+       - new function: save_token_state().  Saves the value of last_read_token
+         and the two previous tokens in an allocated array and returns the
+         array
+       - new function: restore_token_state(ts).  TS is an array returned by
+         save_token_state.  last_read_token and the two previous tokens are
+         set from the values in TS
+
+trap.c
+       - run_pending_traps calls save_token_state and restore_token_state
+         around the call to parse_and_execute, which will call the parser
+         and possibly leave it in a state where reserved words will not be
+         recognized (_run_trap_internal, too)
+
+                                  9/20
+                                  ----
+support/bashbug.sh
+       - if sendmail is used as $RMAIL, pass `-i -t' as arguments so changes
+         made by the user to the recipient headers in the message are
+         honored
+
+                                  9/21
+                                  ----
+bashhist.c
+       - if histverify has been set, make sure a `:p' modifier to a history
+         expansion prints the result
+
+builtins/echo.def
+       - new extern variable, xpg_echo, set to 1 if DEFAULT_ECHO_TO_USG is
+         defined and 0 otherwise
+       - echo_builtin now sets the initial value of do_v9 from xpg_echo
+
+builtins/shopt.def
+       - new shopt option, `xpg_echo', turns backslash escape expansion by
+         `echo' on and off at runtime
+
+builtins/{bash.1,bashref.texi}
+       - documented new `xpg_echo' shell option
+
+tests/{builtins.tests,builtins2.sub,shopt.tests}
+       - changes for new `xpg_echo' shell option
+
+configure.in
+       - changes for FreeBSD-3.x ELF to add `-rdynamic' to LOCAL_LDFLAGS.
+         This allows dynamic loading of builtins
+
+support/shobj-conf
+       - changes to handle FreeBSD-3.x elf or a.out object file formats
+
+                                  9/23
+                                  ----
+[bash-2.04-beta1 released]
+
+                                  9/24
+                                  ----
+jobs.c
+       - wait_for returns -1 only if the shell is currently executing the
+         `wait' builtin, since that's the only thing that cares
+
+execute_cmd.c
+       - moved cases of close_fd_bitmap to before calls to do_piping to
+         handle some pathological cases
+
+                                  9/29
+                                  ----
+execute_cmd.c
+       - save the command line in execute_simple_command before making the
+         export environment, since maybe_make_export_env clobbers
+         the_printed_command if there are exported functions
+
+                                  9/30
+                                  ----
+configure.in,config.h.in
+       - check explicitly for setvbuf; define HAVE_SETVBUF if found
+
+configure.in
+       - change opt_gnu_malloc to opt_bash_malloc, since the bash malloc
+         is not really the gnu malloc anymore
+       - new argument, --with-bash-malloc, identical to --with-gnu-malloc
+       - AC_DEFINE(USING_BASH_MALLOC) if opt_bash_malloc is enabled
+
+config.h.in
+       - new #define for USING_BASH_MALLOC
+
+doc/bashref.texi
+       - updated installation section to add --with-bash-malloc and
+         change description of --with-gnu-malloc
+
+lib/sh/setlinebuf.c
+       - change name of function to sh_setlinebuf, just returns 0 if
+         HAVE_SETVBUF and HAVE_SETLINEBUF are undefined
+       - prefer setvbuf to setlinebuf if we have both
+       - if we're using setvbuf, use a local buffer for stdin and stdout
+         local buffer is BUFSIZ unless we're using the bash malloc
+         (USING_BASH_MALLOC is defined), in which case it's 1008 (which
+         the bash malloc rounds up to 1024)
+
+                                  10/4
+                                  ----
+input.c
+       - if USING_BASH_MALLOC is defined, set the max buffer size to 8176,
+         which the bash malloc rounds up to 8192
+
+                                  10/5
+                                  ----
+pcomplete.c
+       - new function, pcomp_filename_completion_function, a wrapper for
+         filename_completion_function that dequotes the filename first
+
+bashline.c
+       - changed bash_directory_completion_matches to dequote the filename
+         before passing it (indirectly) to filename_completion_function
+
+execute_cmd.c
+       - change execute_command to defer calling unlink_fifo_list until any
+         shell function has finished executing (variable_context == 0)
+
+configure.in
+       - added AC_CYGWIN, AC_MINGW32, AC_EXEEXT
+
+                                  10/8
+                                  ----
+subst.c
+       - expand_word_internal(): changes some things to avoid small (2 or 3
+         byte) calls to xmalloc -- added a label and some gotos (BEWARE)
+       - changed make_dev_fd_filename so it doesn't call sprintf anymore
+
+                                  10/27
+                                  -----
+execute_cmd.c
+       - make execute_select_command handle the effects of the `continue'
+         builtin correctly
+
+                                  11/5
+                                  ----
+Makefile.in
+       - RELSTATUS changed to `beta2'
+
+                                  11/8
+                                  ----
+[bash-2.04-beta2 released]
+
+                                  11/9
+                                  ----
+shell.c
+       - make run_startup_files check for ssh2 as well as ssh1
+
+                                  11/19
+                                  -----
+parse.y
+       - make sure parsing conditional commands isn't confused by unexpected
+         tokens (like `[[)]]')
+
+builtins/common.c
+       - fix get_job_spec to return NO_JOB for numeric job specs that are
+         beyond the size of the jobs table
+
+builtins/type.def
+       - change describe_command to report `not found' if a path search
+         returns the same string as the command name and the command name
+         does not match an executable file.  This has implications for
+         `type' and `command -[vV]'.
+       - if a command is not found in $PATH, but an executable file with the
+         name supplied exists in the current directory, make the command
+         into a full pathname for the `command' builtin.  This has
+         implications for `type' and `command -[vV]'
+
+subst.c
+       - new function, expand_prompt_string, expands prompt string and
+         returns the string passed if an error occurs
+
+subst.h
+       - extern declaration for expand_prompt_string
+
+parse.y
+       - decode_prompt_string calls expand_prompt_string instead of
+         expand_string_unsplit
+
+                                  11/22
+                                  -----
+builtins/echo.def
+       - return EXECUTION_FAILURE if ferror(stdout) is true
+
+                                  11/23
+                                  -----
+locale.c
+       - if LC_ALL is unset, call setlocale(LC_ALL, lc_all), because lc_all
+         holds the default locale
+
+                                  11/29
+                                  -----
+lib/readline/shell.c
+       - define NULL as 0 if it's not defined
+       - change single_quote to allocate 4 characters in new string for
+         each character in the old one (like builtins/common.c:single_quote)
+
+locale.c
+       - when a locale variable (LC_*) is unset, pass "" to setlocale()
+         to get the default locale set, since value is NULL
+
+lib/sh/makepath.c
+       - new function, sh_makepath(char *path, char *dir, int flags)
+
+Makefile.in
+       - changed version to beta3
+
+builtins/type.def
+       - changed describe_command to use sh_makepath()
+
+builtins/cd.def
+       - removed private declaration of mkpath(), changed to use sh_makepath
+
+general.c
+       - changed make_absolute to use sh_makepath
+       - changed full_pathname to use sh_makepath
+
+findcmd.c
+       - removed private definition of make_full_pathname, changed to use
+         sh_makepath
+
+doc/{bashref.texi,bash.1}
+       - added text to description of `getopts' to make it clear that getopts
+         may be used to parse option characters other than letters, and
+         that `:' and `?' may not be used as option characters
+
+eval.c
+       - when processing a jump_to_top_level(EXITPROG), make sure the shell
+         doesn't think it's still in a function by setting variable_context
+         to 0
+
+doc/rbash.1
+       - a skeletal man page for rbash, adapted from debian
+
+support/bashbug.sh
+       - try to find a default editor if EDITOR is unset, rather than blindly
+         using `emacs'
+
+                                  11/30
+                                  -----
+support/config.{guess,sub}
+       - many changes from the latest `automake' distribution, from the
+         Debian folks
+
+                                  12/2
+                                  ----
+lib/readline/keymaps.h, lib/tilde/tilde.h
+       - added support for C++ compilation (`extern "C" {...}')
+
+                                  12/3
+                                  ----
+subst.c
+       - in process_substitute, make sure the child resets the O_NONBLOCK
+         flag on the file descriptor opened for read to a named pipe
+
+jobs.c
+       - new function, raw_job_exit_status, returns exit status of last job
+         in pipeline
+       - change job_exit_status to call raw_job_exit_status and pass the
+         result to process_exit_status
+       - in notify_of_job_status, get termination status from call to
+         raw_job_exit_status, rather than the first job in the pipeline
+         (fixes debian bug #15165)
+
+bashhist.c
+       - changed bash_history to not add shell comment lines to the history
+         file (fixes debian bug #21901).  Uses new function shell_comment(L)
+         which returns 1 if L is a shell comment line.  Doesn't handle
+         comments embedded in lines yet
+
+redir.c
+       - when running in POSIX.2 mode, bash no longer performs word splitting
+         on the expanded value of the word supplied as the filename argument
+         to a redirection operator (fixes debian bug #30460)
+
+doc/bashref.texi
+       - added new redirection stuff to POSIX Mode section (from previous fix)
+
+                                  12/6
+                                  ----
+hashlib.h
+       - removed extra semicolon at end of HASH_ENTRIES define
+
+redir.c
+       - replaced toggling of disallow_filename_globbing flag with setting
+         flags in redirection word to include W_NOGLOB if the shell is in
+         POSIX mode and not interactive when expanding the filename argument
+         to a redirection
+
+                                  12/7
+                                  ----
+builtins/common.c
+       - new function, backslash_quote_for_double_quotes(char *), quotes
+         characters special when in double quotes in the string passed as
+         an argument.
+         #ifdef PROMPT_STRING_DECODE; called by decode_prompt_string
+
+builtins/common.h
+       - extern declaration for backslash_quote_for_double_quotes
+
+parse.y
+       - call backslash_quote_for_double_quotes instead of backslash_quote
+         in decode_prompt_string
+
+                                  12/9
+                                  ----
+parse.y
+       - before expanding the \u prompt string escape sequence, make sure
+         current_user.user_name is non-null and call get_current_user_info
+         if it is
+
+                                  12/10
+                                  -----
+support/mkversion.sh
+       - changes to avoid relying on floating point output format, which
+         can be locale-specific
+
+                                  12/14
+                                  -----
+print_cmd.c
+       - changes to named_function_string (for normal function printing)
+         and print_function_def (for printing function definitions embedded
+         in other commands) to print redirections that should be attached
+         to the function as a whole after the closing brace
+
+tests/func1.sub
+       - tests for printing functions with attached redirections, called by
+         func.tests
+
+                                  12/16
+                                  -----
+lib/readline/complete.c
+       - if we're completing files in the root directory and executing the
+         visible-stats code, don't pass an empty pathname to
+         rl_directory_completion_hook, because, for bash, that will be
+         expanded to the current directory.  Just pass `/' instead.
+
+lib/tilde/tilde.c
+       - fix to tilde_expand_word for Cygwin to avoid creating pathnames
+         beginning with `//' if $HOME == `/'
+
+variables.c
+       - don't bother with the exportstr validation on cygwin systems,
+         or even using exportstr at all, since that system has weird
+         environment variables
+
+                                  12/17
+                                  -----
+configure.in
+       - new option, --enable-xpg-echo-default, new name for
+         --enable-usg-echo-default (which is still present for backwards
+         compatibility)
+
+configure.in, config.h.in, builtins/echo.def
+       - DEFAULT_ECHO_TO_USG -> DEFAULT_ECHO_TO_XPG
+
+                                  12/29
+                                  -----
+aclocal.m4
+       - changed a couple of tests to avoid creating files with known
+         names in /tmp
+
+support/rlvers.sh
+       - changed to create files in /tmp/rlvers
+
+support/mksignames.c
+       - now understands the POSIX.1b real-time signal names on systems
+         that support them
+
+                                  12/30
+                                  -----
+[bash-2.04-beta3 released]
+
+                                  12/31
+                                  -----
+redir.c
+       - try some more things to avoid race file replacements in
+         here_document_to_fd
+
+parse.y
+       - two new functions:
+               get_current_prompt_level: returns 2 if current prompt is $PS2,
+                                         1 otherwise
+               set_current_prompt_level: sets current prompt to $PS2 if arg
+                                         is 2, $PS1 otherwise
+
+copy_cmd.c
+       - make sure to copy the `line' member in copy_arith_for_command
+
+pcomplete.c
+       - free up `lwords' and `line' after evaluating any command or shell
+         function in gen_compspec_completions
+       - after filtering any matches specified by cs->filterpat in
+         gen_compspec_completions, free ret->list (the members have
+         already been copied or freed by filter_stringlist)
+
+bashline.c
+       - free what find_cmd_name returns after calling the programmable
+         completion code
+
+                                1/4/2000
+                                --------
+subst.c 
+       - make call_expand_word_internal set w->word to NULL if either
+         expand_word_error or expand_word_fatal is returned 
+
+                                   1/7
+                                   ---
+parse.y
+       - two new functions: set_current_prompt_level(int) and
+         get_current_prompt_level() to set and get the `level' of
+         current_prompt_string (1 if $PS1, 2 if $PS2)
+
+externs.h
+       - extern declarations for {get,set}_current_prompt_level
+
+builtins/evalstring.c
+       - add an unwind_protect to save and restore the current prompt
+         string pointers using {get,set}_current_prompt_level
+
+                                   1/9
+                                   ---
+Makefile.in
+       - changed release status to `beta4'
+
+                                  1/18
+                                  ----
+[bash-2.04-beta4 released]
+
+                                  1/19
+                                  ----
+configure.in
+       - moved checks for non-unix variants to beginning of tests
+
+Makefile.in, {builtins,support}/Makefile.in
+       - added some $(EXEEXT) suffixes to generated programs for non-Unix
+         systems
+
+                                  1/20
+                                  ----
+parse.y
+       - make get_current_prompt_level return 1 if current_prompt_string is
+         NULL (as it would be while sourcing startup files)
+
+support/rlvers.sh
+       - rmdir $TDIR in the exit trap
+       - move the exit trap after we successfully create $TDIR
+
+                                  1/21
+                                  ----
+subst.c
+       - several changes to split_at_delims to make non-whitespace
+         delimiters create separate fields containing those delimiters,
+         like the shell parser does with meta characters.  This allows
+         redirection operators, for example, to be treated as separate
+         words by the programmable completion code
+
+examples/complete/complete-examples
+       - added new function: _redir_op, which return true if the word
+         passed as an argument contains a redirection operator (just
+         bare-bones for now)
+       - changed set completion function to use _redir_op as an example
+
+parse.y
+       - make parse_string_to_word_list save and restore the value of
+         shell_input_line_terminator, since an assignment like
+         COMPREPLY=() inside a shell function called by the programmable
+         completion code can change shell_input_line_terminator out from
+         underneath shell_getc().  shell_getc will set the input line
+         terminator to EOF when it gets EOF from the getter function, and
+         the string getter function returns EOF at EOS.  parse_and_execute
+         tests for EOS directly and never gets EOF from shell_getc, so it
+         does not have this problem.
+
+                                  1/24
+                                  ----
+lib/readline/funmap.c
+       - #define QSFUNC like in complete.c
+       - cast _rl_qsort_string_compare to a QSFUNC * in the call to qsort
+
+lib/readline/terminal.c
+       - correct a typo in usage of the __EMX__ preprocessor define
+       - fix a reversed usage of `#if defined (__DJGPP__)' in 
+         _rl_control_keypad
+       - remove extern declarations for _rl_in_stream and _rl_out_stream
+
+lib/readline/rlprivate.h
+       - add extern declaration for _rl_in_stream, since there's already
+         one for _rl_out_stream
+
+builtins/ulimit.def
+       - if bash is using ulimit(2), make sure that getfilesize() returns
+         the value multiplied by 512 to convert it from a number of blocks
+         to a number of bytes
+
+                                  1/25
+                                  ----
+execute_cmd.c
+       - make sure execute_command_internal sets last_command_exit_value
+         correctly when inverting the return value of a (...) subshell
+         command
+
+tests/{run-invert,invert.{tests,right}}
+       - new tests for return value inversion
+
+configure.in
+       - compile without bash malloc on m68k-motorola-sysv due to a file
+         descriptor leak in closedir(3) -- the motorola implementation
+         requires that freed memory be readable so it can free the dirent
+         and then look back at it to find the file descriptor
+
+expr.c
+       - fix negative exponents in v**e to return an eval error
+
+                                   2/1
+                                   ---
+Makefile.in
+       - changed status to beta5
+
+jobs.c
+       - fixed a problem with checking the wrong process when checking to
+         see whether or not we need to reset the tty state.  The old code
+         checked the first process in a pipeline; the new code checks all
+         processes in the pipeline to see whether any of them exited due
+         to a signal or was stopped.  If none were signalled or stopped,
+         the code uses the exit status of the last process in the job's
+         pipeline
+
+                                   2/4
+                                   ---
+[bash-2.04-beta5 released]
+
+eval.c
+       - call set_current_prompt_level instead of setting prompt_string_pointer
+         directly
+
+                                  2/10
+                                  ----
+[bash-2.04-beta5 re-released to net]
+
+                                  2/11
+                                  ----
+sig.c
+       - make sure SIGCHLD is defined in initialize_shell_signals before
+         trying to use it in sigdelset() (DJGPP fix)
+
+                                  2/14
+                                  ----
+lib/sh/shtty.c
+       - include <unistd.h> before <shtty.h>
+       - separate tests for ONLCR, ONOCR, ONLRET to cope with systems like
+         DJGPP that don't implement the full POSIX termios option set
+
+builtins/psize.sh
+       - set TMPDIR only if it's not already set
+
+lib/glob/glob.c
+       - if a system doesn't define _POSIX_SOURCE but has a `struct dirent'
+         without a d_ino member, define REAL_DIR_ENTRY to 1 so all entries
+         are read
+
+configure.in
+       - check for <arpa/inet.h> header file
+
+config.h.in
+       - add HAVE_ARPA_INET_H define
+
+lib/sh/inet_aton.c
+       - don't compile unless HAVE_NETWORK, HAVE_NETINET_IN_H, and
+         HAVE_ARPA_INET_H are all defined in config.h or config-bot.h
+
+                                  2/16
+                                  ----
+subst.c
+       - if we have a construct like "${@:-}", we need to note that we're
+         not using whatever is in $@ (we're using the rhs), so the special
+         double-quoting $@ rules do not apply
+
+                                  2/21
+                                  ----
+lib/readline/signals.c
+       - declare SigHandler before using it on non-POSIX systems
+
+lib/sh/{zread,zwrite}.c
+       - include <sys/types.h> unconditionally
+
+configure.in
+       - m68k-motorola-sysv should be m68k-sysv in the section that sets
+         opt_bash_malloc to no for certain systems
+
+builtins/complete.def
+       - fixed a typo (stoppped) when printing out completion actions
+
+                                  2/22
+                                  ----
+lib/sh/netopen.c
+       - include <arpa/inet.h> if it's present
+
+aclocal.m4
+       - new macro, BASH_FUNC_INET_ATON, checks for inet_aton(3) including
+         <netinet/in.h> and <arpa/inet.h>, which some systems require to
+         resolve the function
+
+configure.in
+       - if autoconf can't fund inet_aton on its own, try BASH_FUNC_INET_ATON
+
+pcomplete.c
+       - fixed a memory leak in gen_wordlist_completions
+       - changed gen_wordlist_completions to do prefix-matching against the
+         word being completed
+
+doc/bash.1, lib/readline/doc/rluser.texinfo
+       - documented the change in behavior of the -W option to complete and
+         compgen
+
+builtins/umask.def
+       - if parse_symbolic_mode() returns -1, symbolic_umask needs to return
+         -1 as well, otherwise the umask will be changed inappropriately
+
+input.c
+       - always compile in getc_with_restart and ungetc_with_restart
+
+parse.y
+       - yy_stream_get and yy_stream_unget now call getc_with_restart and
+         ungetc_with_restart, respectively, to avoid problems with some
+         systems not restarting the read(2) when signals that bash handles
+         are received during the read (since bash installs its signal
+         handlers without the SA_RESTART flag)
+
+lib/readline/complete.c
+       - don't default rl_completion_case_fold to 1 if __DJGPP__ is defined
+
+                                  2/25
+                                  ----
+subst.c
+       - renamed `varlist' to `subst_assign_varlist' and made it global
+
+jobs.c
+       - when running a SIGCHLD trap, need to unwind-protect
+         subst_assign_varlist and set it to NULL before running the trap
+         command (fix from ericw@bestnet.org and doogie@debian.org)
+
+                                  2/28
+                                  ----
+lib/readline/doc/rltech.texinfo
+       - document rl_funmap_names()
+
+                                  2/29
+                                  ----
+subst.c
+       - change split_at_delims to set the current word more appropriately
+         when the cursor is between two words.  Should probably change this
+         again to set the current word like this only when the cursor is at
+         whitespace or another delim just before the word start
+
+                                   3/1
+                                   ---
+lib/sh/shtty.c
+       - more checks for flag bits being defined before using them
+
+                                   3/7
+                                   ---
+variables.h
+       - fix typo in COPY_EXPORTSTR definition 
+
+                                  3/14
+                                  ----
+subst.c
+       - changed split_at_delims so that if the cursor is at whitespace
+         between words, and we're interested in the current word (cwp != NULL),
+         make a new empty word and set the cwp to that word
+
+locale.c
+       - support for setting LC_NUMERIC locale category based on value of
+         LC_NUMERIC shell variable
+
+variables.c
+       - LC_NUMERIC is now treated specially
+
+doc/{bash.1,bashref.texi}
+       - LC_NUMERIC updates
+
+                                  3/15
+                                  ----
+pcomplete.c
+       - fix to avoid freeing memory twice
+
+                                  3/17
+                                  ----
+[bash-2.04 released]
+
+                                  3/20
+                                  ----
+doc/bash.1
+       - minor typo fix to description of `xpg_echo' option in `echo'
+         description
+
+                                  3/23
+                                  ----
+parse.y
+       - minor fix to parse_string_to_word_list to allow newlines in
+         compound array assignments
+
+                                  3/27
+                                  ----
+lib/readline/rltty.c
+       - fixed a missing-semicolon syntax error in the old 4.3 BSD tty code
+
+support/mksignames.c
+       - if SIGRTMAX is >= 2*NSIG, just #undef SIGRTMIN and SIGRTMAX.  This
+         is an issue on AIX 4.3 (only, so far) -- checked by configure, which
+         #defines UNUSABLE_RT_SIGNALS if this is the case
+
+aclocal.m4
+       - new macro, BASH_CHECK_RTSIGS, checks whether or not real-time
+         signals are defined with large values and defines UNUSABLE_RT_SIGNALS
+         if they are
+
+config.h.in
+       - place marker for UNDEF_RT_SIGNALS (initially undefined)
+
+configure.in
+       - call BASH_CHECK_RTSIGS in the `bash miscellaneous' section
+
+                                  3/29
+                                  ----
+
+subst.c
+       - fixed a problem in match_pattern_char, where `string' was checked
+         for a paren following a [?+!@], rather than `pat'
+       - the code that checks whether or not to exit after a failed
+         ${word?msg} substitution needs to check interactive_shell rather
+         than interactive to avoid exiting if such a construct appears in
+         a sourced file
+
+                                  3/31
+                                  ----
+
+bashline.c
+       - add `{' to the list of characters that need to be quoted by the
+         completion code when appearing in a filename
+
+                                   4/1
+                                   ---
+lib/glob/fnmatch.c
+       - fixed an error in brackmatch() while skipping the rest of a bracket
+         expression after a character matched.  When `c' was a backslash and
+         *p was a backslash, as in a pattern like [/\\], the old code didn't
+         take both backslashes into account and ended up skipping the `]'
+         after erroneously concluding that it was quoted.  Report and fix
+         from akim@epita.fr
+
+                                   4/3
+                                   ---
+lib/readline/rltty.c
+       - slight change to the BSD tty interface code, so that if the first
+         ioctl fails, get_tty_settings returns -1 immediately
+       - better checking of ioctl return values in BSD tty version of
+         get_tty_settings
+
+                                   4/5
+                                   ---
+doc/{bash.1,bashref.texi}
+       - documented use of LINES and COLUMNS variables
+
+                                  4/12
+                                  ----
+lib/readline/rltty.c
+       - change the SETATTR define for the termio tty driver to use
+         TCSETAW (the analog of the termios TCSADRAIN)
+
+lib/glob/fnmatch.c
+       - fix for posix-style bracket expressions ([:xxx:], [=x=]) broken
+         by fix of 4/1 for quotes in bracket expressions
+
+                                  4/26
+                                  ----
+subst.c
+       - fix to list_string and get_word_from_string to make a non-whitespace
+         IFS character preceded by IFS whitespace part of the current field
+         delimiter, not a separate delimiter that would result in a separate
+         null field when splitting.  cf POSIX.2, 3.6.5, (3)(b).  Bug reported
+         by amc@cs.berkeley.edu
+       - changed the behavior of the (currently undocumented) ${!prefix@}
+         expansion to be analogous to the expansion of $@ in other contexts
+         when double-quoted.  ksh93 seems to do this.  Bug reported by
+         Ken Pizzini <ken@halcyon.com>
+       - changed read_comsub to ignore NUL bytes in the command substitution
+         output, printing a warning message for now
+
+parse.y
+       - changed shell_getc to ignore NUL bytes in the input, printing a
+         warning message for now
+       - changed read_a_line to print a warning when a NUL byte is encountered,
+         like shell_getc does
+
+                                  5/18
+                                  ----
+subst.c
+       - make sure split_at_delims uses d2 only if it's non-null
+       - make split_at_delims skip leading newlines in the string to split,
+         if newline is a delimiter
+
+jobs.c
+       - prevent hanging processes by marking a child process as not running
+         (even if the shell thinks it is) when waitpid() returns -1/ECHILD --
+         this indicates that waitpid never returned a reasonable status
+         for that child though, which may be a symptom of another problem
+
+builtins/cd.def
+       - make `pwd' print an error message if the write fails when displaying
+         the current directory
+
+lib/readline/histexpand.c
+       - return NULL from history_find_word if history_tokenize_internal
+         returns (char **)NULL rather than attempting to dereference a
+         possibly-NULL pointer
+       - change history_tokenize_internal to set *indp to -1 before any
+         processing if indp is non-null
+
+                                  5/19
+                                  ----
+builtins/trap.def
+       - when in POSIX.2 mode and printing trap dispositions, print the
+         signal name without the leading `SIG', as POSIX.2 requires
+
+                                  5/23
+                                  ----
+lib/readline/readline.c
+       - readline_initialize_everything now assigns $TERM to rl_terminal_name
+         if the application has left it unset, and calls _rl_init_terminal_io
+         with the resultant value
+
+lib/readline/doc/rltech.texinfo
+       - updated the description of rl_terminal_name to note initialization
+
+parse.y
+       - change parse_string_to_word_list to save and restore the value of
+         current_command_line_count before calling back into the parser --
+         it will screw up history if the string extends over one line.  Bug
+         reported by Jan.Djarv@mbox200.swipnet.se
+
+                                   6/7
+                                   ---
+unwind_prot.h
+       - change unwind_protect_string to pass the address of the variable to
+         unwind_protect_var on machines where ints and char *s are not the
+         same size
+
+unwind_prot.c
+       - make sure we save the value of a variable in unwind_protect_var on
+         machines where sizeof(char *) != sizeof(int), not the contents the
+         value points to.  Fix from Andreas Schwab <schwab@suse.de>
+
+                                   6/8
+                                   ---
+configure.in
+       - auto-configure MacOS X without bash malloc (like Rhapsody)
+
+                                  6/12
+                                  ----
+configure.in
+       - replace `cygwin32' with `cygwin'
+
+builtins/evalfile.c
+       - in _evalfile, change all instances of \r to \n in the file to be
+          sourced and evaluated if __CYGWIN__ is defined
+
+input.c
+       - change \r to \n in the buffer argument to make_buffered_stream and
+          after calling zread() from b_fill_buffer if __CYGWIN__ is defined
+
+                                  6/29
+                                  ----
+lib/sh/Makefile.in
+       - add rest of dependency rules for makepath.o
+
+                                   7/3
+                                   ---
+jobs.c
+       - changed `int' to `WAIT' in a couple of places for non-POSIX
+         environments
+
+                                   7/5
+                                   ---
+locale.c
+       - try to avoid an unnecessary memory allocation in localetrans() in
+         the case that a translation for the string exists
+
+lib/readline/doc/rluserman.texinfo
+       - change the `direntry' information to make it use rluserman instead
+         of readline
+
+                                   7/6
+                                   ---
+execute_cmd.c
+       - changes to execute_in_subshell so it honors a `!' prefixing a command
+         inside a user subshell (...)
+
+support/config.{guess,sub}
+       - add cases for Apple Darwin (Mac OS X)
+
+configure.in
+       - Apple Darwin (MacOS X) uses its own malloc
+
+lib/readline/readline.h
+       - removed bogus extern declaration of savestring
+
+                                   7/7
+                                   ---
+builtins/common.c
+       - in get_working_directory, don't count on getcwd returning anything
+         useful in the buffer passed as the first argument on failure; just
+         use bash_getcwd_errstr in the error message
+
+examples/loadables/cut.c
+       - loadable version of cut(1), from the FreeBSD source tree
+
+                                  7/18
+                                  ----
+lib/readline/vi_mode.c
+       - changed two instances of (*rl_getc_function) (rl_instream) to calls
+         to rl_read_key(), which works better when using the readline
+         callback interface
+
+builtins/evalfile.c
+       - added FEVAL_CHECKBINARY flag for _evalfile; controls whether a check
+         for a binary file is performed
+       - FEVAL_CHECKBINARY is not set by source_file or maybe_execute_file,
+         which means that the startup file execution and the `.' builtin will
+         not check for binary files
+       - FEVAL_CHECKBINARY is not set by fc_execute_file, so that files
+         composed of history commands run by the `fc' builtin will not check
+         for binary files
+
+                                  7/21
+                                  ----
+shell.c
+       - added `--init-file' as a synonym for `--rcfile'
+
+                                  7/26
+                                  ----
+support/shobj-conf
+       - added commented-out stanzas for hpux 10 and hpux 11 when the HP
+         unbundled ANSI C compiler is being used
+
+                                  7/27
+                                  ----
+shell.c
+       - don't call end_job_control() from exit_shell if subshell_environment
+         is non-zero, even if the shell is interactive
+
+                                   8/1
+                                   ---
+bashhist.c
+       - change maybe_add_history to remember if we saved the first line of
+         a command and don't save the second and subsequent lines of a
+         multi-line command if we didn't save the first line
+
+configure.in, config.h.in
+       - add autoconf check for getservbyname()
+
+lib/sh/netopen.c
+       - add support for named services in /dev/(tcp|udp)/host/service
+         translation
+       - make sure _netopen sets errno to something other than 0 if something
+         goes wrong, so the redirection functions behave
+
+                                   8/3
+                                   ---
+parse.y
+       - changes to shell_getc so that history saving of blank lines in
+         multi-line commands does a better job of syntactic correctness
+
+bashline.c
+       - bind ^O to operate-and-get-next in emacs_standard_keymap explicitly,
+         rather than letting rl_add_defun do it in whatever keymap is current
+
+                                   8/4
+                                   ---
+builtins/ulimit.def
+       - removed some of the special handling of RLIM_INFINITY -- the old
+         code would let people use RLIM_INFINITY as a shorthand for setting
+         the soft limit to the hard limit.  Now, the code just passes
+         RLIM_INFINITY through if the hard limit is being set, so any kernel
+         errors will get through
+
+                                  8/10
+                                  ----
+parse.y
+       - change the grammar rule for group_command so that it's composed of
+         a compound_list instead of a list, which requires a terminator
+         This means that you can now do (legal) things like
+
+               { { echo a b c ; } }
+
+         since the second close brace will be recognized as such because a
+         reserved word is legal in that context
+
+                                  8/23
+                                  ----
+subst.c
+       - fix parameter_brace_substring to free all memory allocated by
+         get_var_and_type in the VT_ARRAYMEMBER case (returned parameter
+         `val')
+
+                                  8/30
+                                  ----
+variables.c
+       - now that we have dynamic array variables, remove the check for
+         array_p in bind_variable and let array variables with assignment
+         functions call the assignment function
+
+subst.c
+       - change cond_expand_word to perform tilde expansion (like it should
+         have done all along)
+
+lib/readline/complete.c
+       - don't allow backslash to quote anything inside a single-quoted
+         string in find_completion_word
+
+doc/{bash.1,bashref.texi}
+       - note that `set -a' will cause functions to be exported
+
+lib/readline/parens.c
+       - changed the blink timeout so it's settable by the application.  A
+         new function, int rl_set_paren_blink_timeout (int u), (still
+         undocumented) will set the timeout to U usec
+
+variables.c
+       - at startup of an interactive login shell, if the current directory
+         is $HOME, and $HOME and $PWD are not the same, set the current
+         directory (and $PWD) to $HOME
+       - break code that initializes $PWD and $OLDPWD into set_pwd function
+
+variables.h
+       - new extern declaration for set_pwd()
+
+                                   9/6
+                                   ---
+lib/readline/{readline,callback}.c
+       - allocate memory for rl_prompt instead of simply using what's passed
+         as the `prompt' argument to readline() or
+         rl_callback_handler_install().  This will allow constant strings to
+         be passed to readline(), since the prompt processing code wants to
+         write to rl_prompt
+
+lib/sh/pathcanon.c
+       - new file, does pathname canonicalization
+
+externs.h
+       - extern declarations for stuff in lib/sh/pathcanon.c
+
+general.c
+       - canonicalize_pathname now simply calls sh_canonpath()
+
+                                   9/7
+                                   ---
+pcomplete.h
+       - new member in a `struct compspec': options
+       - define some flag values for options field
+
+pcomplib.c
+       - make sure options field is allocated and copied by compspec utility
+         functions
+
+builtins/complete.def
+       - add struct for completion options.  These control the `meta-behavior'
+         of the compspec.  Initially, there are three:
+
+               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
+
+       - add `-o option' to complete and compgen, setting new options field
+         in a compspec
+       - add code to display any -o options when a compspect is printed
+         with the `-p' option to complete
+
+pcomplete.c
+       - programmable_completions now passes back to the caller in the last
+         argument any options associated with the active compspec (from the
+         options field)
+       - change gen_compspec_completions to re-call gen_action_completions
+         with a CA_DIRECTORY action if the rest of the compspec actions
+         generate no matches and the COPT_DIRNAMES option is present
+
+bashline.c
+       - if a programmable completion was specified to return filenames with
+         the `-o filenames' option, set rl_filename_completion_desired to 1
+         so readline does its special filename-specific things
+       - if a compspec was defined to fall back to the readline default with
+         the `-o default' option, suppress setting the
+         rl_attempted_completion_over variable in attempt_shell_completion
+         so readline will go on and do filename completion
+
+include/ansi_stdlib.h
+       - add extern declarations for atof and strtod
+
+builtins/printf.def
+       - change getdouble() to use strtod (since we provide a version in
+         libsh if the C library doesn't have one), and change the calling
+         convention to match the other getXXX functions (take value pointer
+         as argument, return success or failure).  This makes printf handle
+         invalid floating point numbers better
+
+doc/bash.1, lib/readline/doc/rluser.texinfo
+       - documented new `-o' option to complete and compgen; described the
+         arguments and their effects
+
+lib/readline/{macro,util}.c
+       - renamed _rl_executing_macro to rl_executing_macro; made it public
+
+lib/readline/readline.h
+       - new extern declaration for rl_executing_macro
+
+lib/readline/rltech.texinfo
+       - documented rl_executing_macro
+
+                                   8/8
+                                   ---
+lib/readline/readline.c
+       - new state variable, rl_readline_state
+
+lib/readline/readline.h
+       - extern declaration for rl_readline_state
+       - define some flag bits for rl_readline_state and macros to test and
+         set them
+
+lib/readline/{readline,complete,isearch,macro,rltty,search,signals,undo,vi_mode}.c
+       - added calls to the macros that set and unset various readline states
+
+lib/readline/readline.c
+       - new private function, _rl_free_saved_history_line, to free up the
+         history entry saved in saved_line_for_history
+
+lib/readline/search.c
+       - free any saved history entry in rl_history_search_reinit(), because
+         rl_get_previous_history makes a call to maybe_save_line without
+         freeing up the saved line when it returns (so rl_get_next_history
+         can use it)
+       - fix up noninc_search_from_pos to deal with invalid history indices
+         better
+
+                                  9/12
+                                  ----
+support/shobj-conf
+       - HPUX 11.0 needs the `-fpic' flag passed to the linker as well as
+         the compiler
+
+execute_cmd.c
+       - on MS-DOS systems, let the #! checking stuff in execute_shell_script
+         treat \r as EOL (identical to \n)
+
+input.c
+       - on DJGPP systems, allow buffered_getchar to ignore \r.  Change
+         suggested by snowball3@bigfoot.com
+
+                                  9/13
+                                  ----
+lib/sh/tmpfile.c
+       - new file, with functions for creating and (hopefully safely) opening
+         temporary files for the shell
+
+externs.h
+       - extern declarations for functions in tmpfile.c
+
+variables.c
+       - new function, get_random_number, returns random values from the
+         shell's (lame) RNG to the rest of the shell
+
+variables.h
+       - new extern declaration for get_random_number()
+
+subst.c
+       - changed make_named_pipe to call sh_mktmpname instead of mktemp
+
+redir.c
+       - changed here_document_to_fd to call sh_mktmpfd instead of using
+         inline code
+
+builtins/fc.def
+       - changed fc_builtin to call sh_mktmpfp instead of using inline code
+
+builtins/common.h
+       - new extern declaration for fc_execute_file()
+
+bashline.c
+       - if RL_ISSTATE(RL_STATE_INITIALIZED) is 0 in initialize_readline,
+         call rl_initialize to bind the defaults before setting up our
+         custom shell functions and key bindings
+
+lib/readline/doc/{rluser,hsuser}.texinfo
+       - some markup changes proposed by dima@chg.ru
+
+lib/readline/rlstdc.h, lib/tilde/tilde.h
+       - to get ready for some `const' changes to the source, define const
+         as either `__const' (gcc -traditional) or nothing if __STDC__ and
+         __cplusplus are not defined
+
+lib/readline/readline.c
+       - upped the default readline version to `4.2-alpha'
+
+lib/readline/readline.[ch]
+       - readline now takes a `const char *' as an argument
+
+lib/readline/history.h
+       - read_history(), read_history_range(), write_history(),
+         append_history(), history_truncate_file() now take `const char *'
+         filename arguments
+
+lib/readline/histfile.c
+       - history_filename(), read_history(), read_history_range(),
+         write_history(), append_history(), history_truncate_file(),
+         history_do_write() now take `const char *' filename arguments
+
+lib/readline/readline.h
+       - rl_read_init_file() now takes a `const char *' filename argument
+
+lib/readline/bind.c
+       - current_readline_init_file is now a `const char *'
+       - _rl_read_init_file(), rl_read_init_file() now take `const char *'
+         filename arguments
+
+lib/tilde/tilde.c
+       - tilde_expand(), tilde_expand_word() now take a `const char *'
+         as their first argument
+
+lib/readline/chardefs.h
+       - fixed CTRL_CHAR macro to be right on systems where chars are unsigned
+         by default
+
+                                  9/14
+                                  ----
+lib/readline/doc/{rl,hs}tech.texinfo
+       - documented new `const char *' function arguments where appropriate
+
+lib/readline/vi_mode.c
+       - clamp the numeric argument in vi mode at 999999, just like in emacs
+         mode
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_readline_state and its possible bit values
+
+builtins/source.def
+       - in maybe_pop_dollar_vars, don't overwrite a shell function's
+         argument list even if the sourced script changes the positional
+         parameters
+
+lib/readline/{util.c,rlprivate.h}
+       - made _rl_strindex() and _rl_savestring() take `const char *'
+         arguments
+
+                                  9/15
+                                  ----
+subst.c
+       - renamed `doing_completion' to `no_longjmp_on_fatal_error', a more
+         accurate description of its current behavior
+
+pcomplete.[ch], externs.h, lib/sh/stringlist.c
+       - moved the stringlist code from pcomplete.c to lib/sh/stringlist.c
+       - moved the type declaration and extern function declarations from
+         pcomplete.h to externs.h
+
+stringlib.c, externs.h, lib/sh/stringvec.c
+       - moved the char array code from stringlib.c to lib/sh/stringvec.c
+
+                                  9/18
+                                  ----
+subst.c
+       - new static variable, expand_no_split_dollar_star, to ensure that
+         $* isn't `split and rejoined' when expanded via a call to
+         expand_string_unsplit or expand_word_no_split
+
+                                  9/19
+                                  ----
+subst.[ch], execute_cmd.c
+       - renamed expand_word_no_split to expand_word_unsplit
+
+copy_cmd.c
+       - in copy_word, just assign w->flags to new_word->flags rather than
+         bcopying the entire structure
+
+configure.in, config.h.in
+       - add autoconf check for pathconf(3)
+
+lib/sh/tmpfile.c
+       - test for systems with short filenames using pathconf and
+         _PC_NAME_MAX, so generated temp file names don't exceed that length
+         (only do this if the file name length is less than 32, since the
+         current code doesn't generate filenames longer than about 17 chars)
+
+                                  9/20
+                                  ----
+command.h
+       - added `W_NOSPLIT2' word flag to prepare for supporting weird $@
+         expansion on the rhs of assignment statements (inspecting the ksh93
+         behavior, it seems like nothing except $@ is split, and $@ is split
+         on $IFS and rejoined as a single string)
+
+                                  9/21
+                                  ----
+subst.c
+       - since verify_substring_values looks for arithmetic expressions
+         bounded by `:', do some ad-hoc parsing of the substring passed as
+         the argument to avoid cutting the expression off at the wrong `:'
+         (since the inclusion of conditional expressions, expressions may
+         contain a `:').  Do some paren balancing, too.
+
+                                  9/22
+                                  ----
+command.h
+       - new #define, CLOBBERING_REDIRECT, evaluates to true for any redirect
+         that will clobber a file and should be subject to `noclobber'
+
+redir.c
+       - changed redir_open to use CLOBBERING_REDIRECT instead of
+         OUTPUT_REDIRECT.  This means that <> no longer tests the value of
+         noclobber, as POSIX.2 specifies
+
+parse.y
+       - made a change to cond_term so that expressions like [[ (x) ]] are
+         parsed correctly
+
+                                  9/25
+                                  ----
+parse.y
+       - small change to grammar for arith_for_command and special_case_tokens
+         to allow `do...done' or {...} after ((...)) without an intervening
+         list_terminator (for ksh93 compatibility)
+
+builtins/printf.def
+       - `printf' now treats \E and \e the same when performing backslash
+         escape expansion for the %b format character for compatibility with
+         $'...' quoting (for ksh93 compatibility)
+
+                                  9/26
+                                  ----
+builtins/source.def
+       - new variable, source_searches_cwd, initially 1.  If non-zero, `.'
+         searches $PWD for the filename argument if it's not found in $PATH
+
+general.c
+       - changed posix_initialize to turn off source_searches_cwd if posix
+         mode is being enabled; turn it on if posix mode is being disabled
+       - changed things so interactive_comments is not turned off if posix
+         mode is disabled, since that's rarely what is desired
+
+variables.c
+       - changed uidset() to set UID and EUID only if they are not already
+         set when the shell starts up
+       - changed things to HOSTNAME is set only if it's not set when the
+         shell starts up
+
+execute_cmd.c
+       - changed execute_builtin_or_function so that if a command like
+         `command exec 4<file' is executed, the effect is as if the `command'
+         had been omitted, as POSIX.2 requires
+
+subst.c
+       - changed array_length_reference to support ${foo[X]} when foo is not
+         an array variable and X is 0, @, or * (everything else returns 0)
+         for ksh compatibility
+       - changed array_value_internal to support ${foo[@]} and ${foo[*]}
+         when foo is not an array variable (as ksh does)
+
+                                  9/27
+                                  ----
+general.h
+       - added defines for ABSPATH (absolute pathname), RELPATH (relative
+         pathname, and ROOTEDPATH (pathname rooted at /), with different
+         definitions for Unix and Cygwin
+       - added defines for DIRSEP (the directory separator in pathnames,
+         and ISDIRSEP (whether a particular character is the directory
+         separator)
+       - added PATHSEP define: takes a character and decides whether it
+         delimits a filename component of a pathname
+       - changed isletter(c) #define to just call isalpha(c)
+
+lib/sh/pathcanon.c
+       - changed to use new pathname #defines from general.h above
+
+general.c
+       - changed make_absolute, absolute_pathname to understand
+         Cygwin's idea of an absolute pathname: [[:upper:][:lower:]]:/
+       - rewrote absolute_pathname to use PATHSEP and ABSPATH
+       - changed full_pathname to use ABSPATH
+
+variables.c
+       - changed get_bash_name to use ABSPATH and RELPATH, and to handle the
+         case when $PWD is unset when it is called
+
+subst.c
+       - if compiling on cygwin, translate \r\n to \n when reading the output
+         of a command substitution in read_comsub()
+
+                                  9/28
+                                  ----
+input.c, shell.c, builtins/read.def, lib/tilde/tilde.c
+       - changed __CYGWIN32__ to __CYGWIN__
+
+lib/readline/{bind,funmap,kill}.c, lib/readline/readline.h
+       - changed __CYGWIN32__ to __CYGWIN__
+
+input.c
+       - a couple of minor changes to clean up the code
+
+parse.y
+       - changed shell_getc and shell_ungetc to implement one character of
+         lookahead/lookbehind when pushing a character back at the start
+         of an input line (the old code would have discarded it because
+         shell_input_line_index was 0)
+
+lib/readline{histsearch.c,history.h}
+       - history_search_internal, history_search, history_search_prefix,
+         history_search_pos now take const char * string arguments
+
+lib/readline/{histexpand.c,history.h}
+       - get_history_event, history_arg_extract, history_tokenize_internal,
+         history_tokenize now take const char * string arguments
+
+lib/readline/{history.c,history.h}
+       - add_history, replace_history_entry now take const char * string
+         arguments
+
+lib/readline/{bind.c,readline.h}
+       - rl_add_defun, rl_unbind_command_in_map, rl_set_key, rl_macro_bind,
+         rl_generic_bind, rl_translate_keyseq, rl_named_function,
+         rl_function_of_keyseq, rl_variable_bind, rl_get_keymap_by_name
+         now take const char * string arguments where appropriate
+       - rl_function_dumper, rl_list_funmap_names needed changes to deal
+         with rl_funmap_names returning const char **
+       - rl_readline_name is now a const char * variable
+
+lib/readline/keymaps.h
+       - duplicate definition of rl_get_keymap_by_name needs const changes
+
+lib/readline/{bind.c,rlprivate.h}
+       - _rl_bind_if_unbound takes a const char * string argument
+
+lib/readline/{funmap.c,readline.h}
+       - rl_add_funmap_entry now takes a const char * string argument
+       - rl_funmap_names now returns a const char **
+       - a FUNMAP now has a const char *name member
+
+lib/readline/{terminal.c,readline.h,rlprivate.h}
+       - _rl_init_terminal_io, rl_get_termcap, rl_reset_terminal,
+         _rl_output_some_chars now take const char * string arguments
+
+lib/readline/{readline.[ch],rlprivate.h}
+       - rl_library_version and rl_terminal_name are now const char *
+         variables
+       - rl_insert_text, _rl_replace_text now take const char * string
+         arguments
+
+lib/readline/{callback.c,readline.h}
+       - rl_callback_handler_install takes a const char * string argument
+
+lib/readline/doc/{rltech,hstech}.texinfo
+       - changed documentation for newly-consted functions and variables
+
+lib/readline/{complete.c,readline.h}
+       - rl_strpbrk now takes const char * string arguments
+       - username_completion_function and filename_completion_function
+         now take const char * string arguments
+       - rl_basic_word_break_characters, rl_basic_quote_characters,
+         rl_completer_word_break_characters, rl_completer_quote_characters,
+         rl_filename_quote_characters, rl_special_prefixes are all
+         const char * variables
+
+lib/readline/{display.c,rlprivate.h}
+       - _rl_move_cursor_relative takes a const char * string argument
+
+redir.c
+       - change from tbisp@uswest.net to fix a problem with cygwin and
+         here_document_to_fd, since cygwin doesn't allow a file to be
+         unlinked if there is a descriptor open on it
+
+display.c
+       - fixed a slight bug in the logic deciding whether or not to redraw
+         a prompt containing invisible characters in update_line.  Fixes
+         bug reported by bdluevel@heitec.net
+
+                                  9/29
+                                  ----
+shell.c
+       - fixed a problem with a too-aggressive setting of restricted shell
+         mode based on shell_name.  Old code set `restricted' even after a
+         longjmp due to shell_execve trying to execute an executable script
+         without a leading `#!', though that case should result in an
+         unrestricted shell
+
+                                  10/2
+                                  ----
+copy_cmd.c
+       - make sure copy_function_def copies the `flags' and `line' members
+         of the function_def
+
+parse.y
+       - make the function_def production take a new function_body parse
+         unit, which is currently just a group_command (in prep for future
+         changes)
+
+builtins/printf.def
+       - changed getint, getlong, getulong, getdouble to print warnings on
+         range errors and return the clamped values that strtol/strtod
+         return, as POSIX.2 specifies
+
+                                  10/3
+                                  ----
+parse.y
+       - made a function_def a `command' instead of a `shell_command'
+         This makes the grammar more closely resemble that supplied in
+         the POSIX.2 standard
+       - made a `function_body' be like the function_body production in
+         the POSIX.2 standard.  This relaxes the restriction that the
+         body be composed of a group_command, but introduces a YACC
+         shift/reduce conflict
+
+print_cmd.c
+       - changes to named_function_string (for normal function printing)
+         and print_function_def (for printing function definitions embedded
+         in other commands) to print redirections that should be attached
+         to the function as a whole after the closing brace, because of
+         the changes to the parser
+
+tests/func2.sub
+       - tests for new function declarations whose bodies are not group
+         commands -- the command printing code still prints them with the
+         braces
+
+                                  10/4
+                                  ----
+lib/sh/pathphys.c
+       - new function, sh_physpath, resolves symlinks in pathname passed
+         as argument
+
+builtins/cd.def
+       - changed pwd_builtin to use sh_physpath if -P supplied or in
+         physical mode
+       - changed bindpwd to use sh_physpath if the no_symlinks argument is
+         non-zero
+       - changed change_to_directory to use sh_physpath and set
+         the_current_working_directory appropriately if the `nolinks'
+         argument is non-zero
+
+                                  10/5
+                                  ----
+variables.c, bashline.c, builtins/cd.def
+       - replaced calls to canonicalize_pathname with sh_canonpath
+
+builtins/cd.def
+       - rewrote change_to_directory to make it much shorter and simpler
+
+command.h
+       - added SUBSHELL_PIPE as possible flag value for subshell_environment
+
+execute_cmd.c
+       - execute_simple_command sets SUBSHELL_PIPE in subshell_environment
+         if the command has a pipe in or out
+
+subst.c
+       - don't reset pipeline_pgrp to shell_pgrp in command_substitute if
+         we're already in a pipline
+         ((subshell_environment & SUBSHELL_PIPE) != 0)
+
+                                  10/6
+                                  ----
+subst.c 
+       - change command_substitute to call setmode(fd, O_TEXT) on the pipe
+         file descriptor if __CYGWIN__ is defined; remove the other code
+         that converts CR/LF to LF on cygwin
+
+                                  10/9
+                                  ----
+stringlib.c
+       - change strcreplace() to make sure that RESIZE_MALLOCED_BUFFER is
+         called everywhere characters are added
+
+                                  10/11
+                                  -----
+lib/sh/spell.c
+       - new file, with the spelling correction code from builtins/cd.def
+
+builtins/cd.def
+       - a little surgery on cd_builtin, to make the structure clearer
+
+                                  10/12
+                                  -----
+builtins/read.def
+       - include fcntl.h and io.h on __CYGWIN__
+       - set mode of fd 0 to O_TEXT if __CYGWIN__ and O_TEXT are both
+         defined
+
+shell.c
+       - in open_shell_script, set mode of fd opened to the shell script
+         to O_TEXT if __CYGWIN__ and O_TEXT are both defined
+
+builtins/evalfile.c
+       - changed the __CYGWIN__ code to call setmode(fd, O_TEXT) instead
+         of translating \r to \n after the read() returns
+
+                                  10/13
+                                  -----
+lib/sh/strtrans.c, stringlib.c
+       - moved ansicstr() from stringlib.c to new file lib/sh/strtrans.c
+       - new function ansic_quote, to quote a string with $'...'
+
+lib/sh/strindex.c, stringlib.c
+       - moved strindex() from stringlib.c to new file lib/sh/strindex.c
+
+lib/sh/Makefile.in
+       - compile `shquote.c' in as part of the shell library
+       - compile `strtrans.c' in as part of the shell library
+       - compile `strindex.c' in as part of the shell library
+
+Makefile.in
+       - link with libsh before any of the readline libraries
+
+builtins/common.c
+       - removed the functions also appearing in lib/sh/shquote.c
+
+externs.h, builtins/common.h
+       - moved extern declarations for functions in lib/sh/shquote.c to
+         externs.h from builtins/common.h
+
+variables.c
+       - print_var_value (used in the output of `set') now calls
+         ansic_quote to quote the value, so any non-printable characters
+         are displayed
+
+                                  10/14
+                                  -----
+syntax.h
+       - new file, with definitions from shell.h having to do with shell
+         syntax, metacharacters, and quoting
+
+parse.y
+       - moved defines for shell metachars and other char class declarations
+         to syntax.h
+
+shell.h
+       - now includes syntax.h
+
+Makefile.in,builtins/Makefile.in,lib/sh/Makefile.in
+       - added syntax.h to appropriate dependency lists
+
+                                  10/16
+                                  -----
+mksyntax.c
+       - new program, to build a syntax table for the shell at compile time
+
+Makefile.in
+       - new generated file, syntax.c, generated by mksyntax
+
+general.h
+       - `digit(x)' is now just defined as `isdigit(x)'
+
+syntax.h
+       - now that we have sh_syntaxtab[], change the appropriate defines
+         to use it
+
+parse.y, subst.c
+       - change checks of member(c, slashify_in_quotes) to test
+         sh_syntaxtab[c] & CBSDQUOTE
+
+builtins/set.def
+       - corrected the help text for `unset', since PATH and IFS may be
+         unset
+
+subst.c
+       - changed explicit tests for shell special parameters using member()
+         or strchr() to test (sh_syntaxtab[c] & CSPECVAR) instead
+       - changed some boilerplate calls to member() that test for validity
+         of various characters in the expansion process to macros for
+         efficiency
+
+lib/sh/shquote.c
+       - changed some of the functions to use checks against sh_syntaxtab[]
+         flag values
+
+                                  10/19
+                                  -----
+findcmd.c
+       - find_user_command_in_path no longer finds directories if the caller
+         specified FS_NODIRS in the flags argument.  This fixes the bug of
+         hashing directory names, at the loss of some information about
+         attempting to execute directories
+
+builtins/hash.def
+       - hash -p dirname name no longer puts directories into the hash table
+
+                                  10/26
+                                  -----
+builtins/read.def
+       - make sure that the last unwind-protect added is the one that calls
+         xfree(input_string), so that this is the top element on the
+         unwind-protect stack
+       - if xrealloc() is called to increase the size of input_string, make
+         sure to remove the top element from the unwind-protect stack (the
+         old xfree) and add a new one, in case realloc() freed the original
+         input_string and allocated new space.  This fixes the bug of bash
+         crashing because it's trying to free already-freed memory if the
+         `read' is interrupted (reported by klausf@Pool.Informatik.RWTH-Aachen.DE)
+
+                                  10/27
+                                  -----
+subst.c
+       - fixed a problem in expand_word_list_internal so that
+         last_command_exit_value is set to 1 if a variable assignment fails
+         and a jump_to_top_level (DISCARD) is taken.  This fixes the problem
+         of assignment statements to read-only variables appearing to succeed
+         (though it always worked right in non-interactive posix-mode shells)
+
+                                  10/30
+                                  -----
+lib/readline/readline.h
+       - rl_completion_entry_function is now of type CPFunction *, since
+         that's the actual type that's used, and casting function pointers
+         of different types (which happened all the time as a result), is
+         problematic on some architectures
+
+lib/readline/complete.c
+       - changed entry function argument to gen_completion_matches to be of
+         type CPFunction *, since that's how it's used
+       - changed variables that are completion entry function pointers to be
+         of type CPFunction *, removed problematic typecasts
+
+lib/readline/doc/rltech.texinfo
+       - documented type change for rl_completion_entry_func
+
+lib/readline/rltypedefs.h
+       - new file, with all the readline function typedefs
+
+lib/readline/rltypedefs.h
+       - new typedef, rl_command_func_t, which is a function returning
+         an int
+       - a KEYMAP_ENTRY now contains a pointer to an rl_command_func_t
+       - new typedef, rl_compentry_func_t, which is a function returning
+         a char *
+       - new typdef, rl_completion_func_t, which is a function returning
+         a char **
+       - new typedef, rl_quote_func_t, which is a function returning a
+         char *
+       - new typedef, rl_dequote_func_t, which is a function returning a
+         char *
+       - new typedef, rl_compignore_func_t, which is a function returning a
+         char *
+       - new typedef, rl_compdisp_func_t, which is a void function taking
+         a char **, int, int argument list
+       - new typedef, rl_hook_func_t, which is a function taking no args
+         and returning an int (used for input and other hooks)
+       - new typedef, rl_modterm_func_t, which is a void function tkaing
+         an int, used to modify terminal (rl_prep_term_function)
+       - new typedef, rl_getc_func_t, which is an int-returning function
+         that takes a FILE *
+       - new typedef, rl_linebuf_func_t, which takes a string and an int
+         index and returns an int
+       - new generic typedefs, rl_intfunc_t and rl_voidfunc_t, which are
+         functions which take and return int and void, respectively 
+       - new generic typedef, rl_vintfunc_t, which takes an int and returns
+         void
+       - new generic typedefs, rl_icpfunc_t and rl_vcpfunc_t, which take a
+         char * and return int and void, respectively
+       - new generic typedefs, rl_icppfunc_t and rl_vcppfunc_t, which take
+         a char ** and return int and void, respectively
+
+lib/readline/rlprivate.h
+       - rl_last_func is now of type rl_command_func_t *
+
+lib/readline/readline.c
+       - declare rl_last_func as rl_command_func_t *
+
+lib/readline/{bind,readline,vi_keymap,emacs_keymap,funmap,keymaps,isearch}.c
+lib/readline/readline.h
+       - change appropriate cases of (Function *) to (rl_command_func_t *)
+
+lib/readline/{readline.h,bind.c}
+       - rl_named_function and rl_function_of_keyseq now return a
+         (rl_command_func_t *)
+
+lib/readline/bind.c
+       - changed type of functions in parser function table from Function *
+         to _rl_parser_func_t *
+
+lib/readline/funmap.c
+       - removed `vi-bracktype' from vi function map -- it's not a
+         bindable function
+
+lib/readline/{readline.h,complete.c}
+       - changed appropriate uses of CPFunction * to rl_compentry_func_t *
+         or rl_quote_func_t *
+
+lib/readline/{rltty.c,readline.h}
+       - rl_prep_term_function is now of type rl_vintfunc_t *
+       - rl_deprep_term_function is now of type rl_voidfunc_t *
+
+lib/readline/{keymaps,history.h}
+       - include rltypedefs.h or <readline/rltypedefs.h> as appropriate
+
+lib/readline/{display.c,readline.h}
+       - rl_redisplay_func is now of type rl_voidfunc_t *
+
+lib/readline/{callbacks.c,readline.h}
+       - the `linefunc' argument to rl_callback_handler_install and the
+         rl_linefunc variable are now of type rl_vcpfunc_t *
+
+lib/readline/{complete.c,readline.h}
+       - rl_completion_display_matches_hook is now of type
+         rl_compdisplay_func_t *
+       - rl_directory_completion_hook is now of type rl_icppfunc_t *
+
+lib/readline/{history.h,histexpand.c}
+       - history_inhibit_expansion_function is now of type
+         rl_linebuf_func_t *
+
+lib/readline/histexpand.c
+       - new private type, _hist_search_func_t, used to indirect through
+         the various history search functions
+
+lib/tilde/tilde.h
+       - new typedef, tilde_hook_func_t, which takes a char * and returns
+         a char *
+
+lib/tilde/tilde.[ch]
+       - tilde_expansion_preexpansion_hook and tilde_expansion_failure_hook
+         are now of type tilde_hook_func_t *
+
+[THERE ARE NO LONGER ANY REFERENCES TO Function *, CPFunction *, or
+CPPFunction * IN THE READLINE SOURCE, WHICH INCLUDES THE TILDE LIBRARY]
+
+{bashline,bracecomp}.c, bashline.h
+       - changes for changed type of rl_completion_entry_func and other
+         changed types (rl_compentry_func_t, rl_completion_func_t,
+         const changes for prototypes, etc.)
+
+pathexp.[ch]
+       - shell_glob_filename now takes a `const char *' argument
+       - quote_string_for_globbing now takes a `const char *' argument
+
+                                  10/31
+                                  -----
+lib/sh/zwrite.c
+       - fix zwrite() to update the buffer pointer in the case of a
+         partial write, in addition to decreasing the count of bytes to
+         be written
+
+support/config.{guess,sub}
+       - added entries for MIPS-based Compaq machines running NonStopUX
+
+                                  11/1
+                                  ----
+lib/readline/undo.c
+       - renamed free_undo_list to be rl_free_undo_list, made a dummy
+         replacement function free_undo_list that just calls
+         rl_free_undo_list
+
+lib/readline/readline.h
+       - extern declaration for rl_free_undo_list
+
+lib/readline/{readline,signals}.c
+       - changed calls to free_undo_list to rl_free_undo_list
+
+lib/readline/doc/rltech.texinfo
+       - changed all function types and arguments for new typedefs
+
+                                  11/2
+                                  ----
+lib/readline/{rlprivate.h,terminal.c,display.c}
+       - term_clreol, term_clrpag, term_cr, term_backspace, term_goto,
+         term_pc, term_im, term_ei, term_ic, term_ip, term_IC, term_dc,
+         term_DC, term_forward_char, term_up, term_mm, term_mo, term_ku,
+         term_kd, term_kr, term_kl, term_ks, term_ke, term_kh, term_kH,
+         terminal_can_insert variables all now have a _rl_ prefix
+
+lib/readline/{rlprivate.h,terminal.c,display.c, readline.c}
+       - screenheight, screenwidth, screenchars now have an _rl_ prefix
+
+lib/readline/{terminal,complete,isearch,kill,macro,readline,search,undo,util,vi_mode}.c
+       - changed calls to ding to calls to rl_ding
+
+lib/readine/{isearch,readline,search}.c
+       - saved_line_for_history now has an _rl_ prefix
+
+lib/readline/readline.[ch]
+       - renamed maybe_{replace,save,unsave} line to have an rl_ prefix
+
+lib/readline/{readline,search,isearch}.c
+       - changed calls to maybe_{replace,save,unsave} line to call the
+         rl_-prefixed equivalents
+
+lib/readline/{rlprivate.h,readline.c,util.c}
+       - renamed alphabetic to rl_alphabetic; changed calls
+
+lib/readline/{bind.c,funmap.c,rlprivate.h}
+       - possible_control_prefixes -> _rl_possible_control_prefixes
+       - possible_meta_prefixes -> _rl_possible_meta_prefixes
+
+lib/readline/compat.c
+       - new file for entry points for backwards compatibility functions
+       - moved free_undo_list here from undo.c
+       - maybe_{replace,save,unsave}_line function that call their rl_
+         counterparts
+       - moved ding() here; it just calls rl_ding()
+       - moved alphabetic here; it just calls _rl_alphabetic()
+
+lib/readline/Makefile.in
+       - make sure compat.o is built and linked appropriately
+
+bashline.c,pcomplete.c
+       - changed calls to ding() to call rl_ding()
+
+support/shobj-conf
+       - changed linux stanza SHLIB_XLDFLAGS to make the `soname' in a
+         shared library have only the major version number, rather than
+         major and minor numbers
+       - made analogous changes for bsd/os-4
+       - changed freebsd 3.x stanza to match `freebsdelf[3-9]*' for
+         FreeBSD elf systems and `freebsdaout[3-9]*' for FreeBSD
+         a.out systems (are there any?)
+
+lib/readline/doc/{rluser,hsuser}.texinfo
+       - changed uses of @samp to @option where appropriate
+
+doc/bashref.texi
+       - changed uses of @samp to @option where appropriate
+
+                                  11/3
+                                  ----
+lib/readline/{readline.h,complete.c,compat.c}
+       - completion_matches, username_completion_function,
+         filename_completion_function all have an rl_ prefix
+
+{bashline,bracecomp,pcomplete}.c
+       - changed calls to completion_matches, username_completion_function,
+         and filename_completion_function
+
+lib/sh/shquote.c
+       - single_quote, double_quote, un_double_quote, backslash_quote,
+         backslash_quote_for_double_quotes, contains_shell_metas all now
+         have an sh_ prefix
+
+externs.h
+       - changed extern declarations for functions from shquote.c
+
+{array,bashline,pcomplete,print_cmd,variables}.c, parse.y
+builtins/{alias,complete,trap,type}.def
+       - changed callers of single_quote
+
+{array,bashline}.c, builtins/setattr.def
+       - changed callers of double_quote
+
+{bashline,bracecomp}.c, parse.y, builtins/printf.def
+       - changed callers of backslash_quote
+
+parse.y
+       - changed callers of backslash_quote_for_double_quotes
+
+{print_cmd,variables}.c
+       - changed callers of contains_shell_metas
+
+lib/readline/{rlshell.h,shell.c,histexpand.c}
+       - single_quote -> sh_single_quote
+
+lib/readline/{rlshell.h,shell.c,input.c}
+general.[ch],shell.c,subst.c
+        - unset_nodelay_mode -> sh_unset_nodelay_mode
+
+lib/readline/{rlshell.h,shell.c}, lib/tilde/tilde.c, variables.c
+       - get_home_dir -> sh_get_home_dir
+
+lib/readline/rlshell.h,lib/readline/bind,histfile,nls,readline,shell,terminal}.c, lib/tilde/tilde.c, variables.c
+       - get_env_value -> sh_get_env_value
+
+lib/readline/rlshell.h,lib/readline/{shell,terminal}.c
+variables.h,{jobs,nojobs,variables}.c
+       - set_lines_and_columns -> sh_set_lines_and_columns
+
+                                  11/6
+                                  ----
+configure.in
+       - bash can only link with an already-installed readline library whose
+         version is 4.2 or greater
+
+variables.h
+       - new variable attribiute, noassign, with its accompanying test macro,
+         noassign_p.  Completely internal, not user-settable
+
+execute_cmd.c
+       - treat noassign variables like readonly variables, except an attempt
+         to assign to them does not cause a non-interactive shell in POSIX
+         mode to abort
+
+{subst,variables}.c,builtins/declare.def
+       - attempts to assign to `noassign' variables return an error status,
+         but no error messages -- almost identical to readonly variables
+
+variables.c
+       - GROUPS and FUNCNAME are `noassign' variables, meaning assignment to
+         them is disallowed, but that they may be unset (in which case they
+         lose their special properties)
+
+doc/{bash.1,bashref.texi}
+       - documented that assignments to GROUPS and FUNCNAME are disallowed
+         and return an error status
+
+                                  11/8
+                                  ----
+lib/readline/{funmap.c,bind.c,rlprivate.h}
+       - _rl_possible_{control,meta}_prefixes are now arrays of `const char *'
+         and are defined in bind.c, since that's where they're used
+
+lib/readline/rltty.c
+       - changed prepare_terminal_settings to take an `oldtio' argument
+         instead of `otio', which shadows the global declaration
+
+lib/readline/bind.c
+       - the `name' member of a parser_directive element is now a
+         `const char *'
+       - the `name' member of a boolean_varlist element is now a
+         `const char *'
+       - the `name' member of a string_varlist element is now a
+         `const char *'
+       - the `name' member of an assoc_list element is now a
+         `const char *'
+       - the `name' member of an keymap_names element is now a
+         `const char *'
+
+lib/readline/display.c
+       - changed scope-local char * variable `temp' to `vtemp' because
+         there's already a function local variable named `temp' of a
+         different type (int) in rl_redisplay
+
+lib/readline/util.c
+       - pathname_alphabetic_chars is now `const char *'
+
+lib/readline/terminal.c
+       - the `tc_var' member of a _tc_string element is now a
+         `const char *'
+
+lib/readline/histexpand.c
+       - changed history_expand_internal to remove the duplicate local
+         declaration of `t' in the `s'/`&' case
+
+lib/readline/histfile.c
+       - in history_filename, `home' is now a `const char *'
+
+lib/tilde/tilde.c
+       - default_prefixes and default_suffixes are now arrays of
+         `const char *'
+
+lib/readline/vi_mode.c
+       - vi_motion and vi_texmod are now `const char *'
+
+lib/readline/complete.c
+       - simplified the conditional declaration of getpwent()
+
+variables.[ch]
+       - get_string_value now takes a `const char *' argument
+
+                                  11/10
+                                  -----
+display.c
+       - changes to expand_prompt and rl_redisplay to keep track of the number
+         of invisible characters on the first line of the prompt, in case it
+         takes up more than one physical line, and not all invisible chars are
+         on the first line
+       - the code that determines the index into the line at which to wrap the
+         first line if the visible prompt length exceeds the screen width was
+         changed to use the number of invisible chars in the first physical
+         prompt line rather than the total number of invisible characters
+       - changed redraw_prompt to save and restore prompt_invis_chars_first_line
+
+subst.c
+       - changed expand_string_internal to savestring() the string argument
+         to avoid possible doubly-freed memory on substitution errors
+       - fixed expand_word_list_internal so that commands with assignment
+         statements preceding words that expand to nothing return a failure
+         status if one of the assignments fails; for example
+
+               readonly TVAR
+               TVAR=7 $ECHO $ABCDE
+       - made sure that all cases of jump_to_top_level set
+         last_command_exit_value to something non-zero before jumping, since
+         they are by definition errors
+
+builtins/evalstring.c
+       - changed parse_and_execute to set last_result to EXECUTION_FAILURE
+         along with last_command_exit_value in the `DISPOSE' case of a
+         jump_to_top_level, since we can return this value in most
+         (interactive) circumstances
+
+                                  11/14
+                                  -----
+general.c
+       - fix legal_number so that it skips any trailing whitespace in its
+         string argument after strtol returns, since strtol does not
+
+lib/readline/{complete.c,readline.h}
+       - new function pointer, rl_directory_rewrite_hook, identical in effect
+         to rl_directory_completion_hook except that it does not modify what
+         is displayed when the possible completions are listed or inserted
+
+bashline.c
+       - changed tcsh_magic_space to try and insert a space closer to where
+         the point was originally, rather than always inserting it at the
+         end of the line
+
+                                  11/16
+                                  -----
+jobs.c
+       - fixed a bug that happened on cygwin systems that caused the jobs
+         table to fill up if a file sourced from an interactive shell ran
+         lots of jobs -- notify_and_cleanup() never called notify_of_job_status
+
+subst.c
+       - fixed pat_match to avoid infinite recursion on zero-length matches
+         from match_pattern
+
+                               11/17/2000
+                               ----------
+[bash-2.05-alpha1 released]
+
+                                  11/18
+                                  -----
+support/shobj-conf
+       - added GNU Hurd support, identical to linux
+
+variables.c
+       - cygwin systems don't use the exportstr stuff at all, so call
+         INVALIDATE_EXPORTSTR before testing var->exportstr, since just
+         blindly using the value_cell will break exported functions that
+         already have an exportstr set
+       - when recomputing the exported value because valid_exportstr fails,
+         make sure to call named_function_string if the variable is a shell
+         function
+
+                                  11/20
+                                  -----
+variables.c
+       - removed call to valid_exportstr; the exportstr code has been
+         adequately debugged
+
+lib/glob/fnmatch.c
+       - reverted to the POSIX.2 behavior of using the current locale and
+         strcoll() to evaluate range expressions in bracket expressions
+
+doc/{bash.1,bashref.texi}
+       - added note to Pattern Matching section emphasizing that the current
+         locale plays a part in evaluating range expressions within [...]
+
+aclocal.m4
+       - added an #include <unistd.h> to the test for posix sigaction
+         restarting interrupted system calls
+
+support/config.guess
+       - changes from Tim Mooney to support `letter version' releases of
+         Tru 64 Unix on the Alpha (e.g., 5.1a)
+
+                                  11/21
+                                  -----
+lib/sh/pathphys.c
+       - make sure MAXSYMLINKS is defined
+
+aclocal.m4
+       - changed BASH_CHECK_PWFUNCS to just use AC_EGREP_CPP on a file
+         that includes pwd.h and other header files, checking for getpwuid.
+         It #defines HAVE_GETPW_DECLS if the egrep succeeds
+
+lib/readline/complete.c
+       - provide extern declaration of getpwent if _POSIX_SOURCE is defined,
+         since most systems don't declare it in <pwd.h> unless _POSIX_SOURCE
+         is undefined
+
+                                  11/22
+                                  -----
+input.c
+       - fixed a small typo in the cygwin-specific code
+
+doc/{bashref.texi,bash.1}
+       - added some more explanatory text about the effect of the current
+         locale's collating order on range expressions within bracket
+         expressions
+
+doc/bashref.texi, lib/readline/doc/{rltech,rluser,hstech}.texinfo
+       - changed to use @env instead of @code for the names of environment
+         and shell variables in text (not in tables yet)
+
+                                  11/27
+                                  -----
+configure.in
+       - configure without the bash malloc on Interix
+
+lib/readline/doc/rltech.texinfo
+       - changed completion_matches() to rl_completion_matches()
+       - changed filename_completion_function() to
+         rl_filename_completion_function()
+       - changed username_completion_function() to
+         rl_username_completion_function()
+
+lib/readline/rlprivate.h
+       - changed declaration of _rl_alphabetic to rl_alphabetic, since that's
+         what's used in the C files
+
+support/bashbug.sh
+       - Debian has /usr/bin/editor as a link to the system default editor;
+         make that one of the alternatives if $EDITOR is not set
+       - if the OS provides mktemp(1) or tempfile(1), use those to create
+         the temp file for the bug report
+
+lib/readline/{readline.[ch], callback.c}
+       - new function, rl_set_prompt, called with prompt string as argument,
+         sets and, if necessary, expands rl_prompt
+
+lib/readline/{complete.c,compat.c,readline.h}
+       - rl_completion_matches now takes a `const char *' as its first
+         argument
+       - compute_lcd_of_matches now takes a `const char *' as its third
+         argument
+
+lib/readline/rltypedefs.h
+       - a rl_completion_func_t now takes a `const char *' as its first
+         argument
+
+lib/readline/Makefile.in
+       - added dependencies on rltypedefs.h
+
+bashline.c
+       - attempt_shell_completion now takes a `const char *' as its first
+         argument
+       - removed bogus cast when assigning to rl_attempted_completion_function
+         and rl_completion_entry_function
+       - bash_directory_completion_matches takes a `const char *' argument
+
+pcomplete.c
+       - gen_matches_from_itemlist, pcomp_filename_completion_function,
+         gen_action_completions, gen_globpat_matches, gen_wordlist_matches,
+         gen_compspec_completions now take `const char *' arguments as
+         appropriate
+       - programmable_completions now takes `const char *' first and 
+         second arguments
+
+pcomplib.c
+       - find_compspec now takes a `const char *' argument
+
+                                  11/29
+                                  -----
+shell.c
+       - in open_shell_script, if we have /dev/fd, don't perform the check
+         for a binary file if isatty(fd) (where fd is opened on the script
+         name) returns non-zero
+       - in open_shell_script, don't call init_noninteractive again, since it
+         can undo changes made by the startup files ($BASH_ENV)
+
+input.c
+       - in fd_to_buffered_stream, make sure buffer size (and hence size
+         arg passed to read(2)) is greater than zero.  This makes
+         bash /dev/stdin work right.
+       - return -1 from sync_buffered_stream immediately if buffers is NULL
+         (can happen when running `bash -i /dev/stdin' and executing a
+         command that requires a fork)
+
+                                  11/30
+                                  -----
+jobs.c
+       - renamed cont_signal_handler to sigcont_sighandler for consistency
+       - renamed stop_signal_handler to sigstop_sighandler for consistency
+       - if there is no jobs list or no outstanding jobs, return immediately
+         from notify_of_job_status, before fussing with the signal state
+       - change map_over_jobs to not fuss with the signal state unless there
+         are jobs
+
+lib/malloc/malloc.c
+       - encapsulated the code to block and unblock signals during morecore()
+         execution into two functions:  block_signals and unblock_signals
+       - only block signals in morecore() if interrupt_immediately is non-zero
+         or SIGINT or SIGCHLD is trapped
+
+                                  12/1
+                                  ----
+lib/readline/readline.c
+       - fix to rl_forward to make sure that lend doesn't get set < 0, since
+         that will result in rl_point being < 0
+
+                                  12/5
+                                  ----
+parse.y
+       - fix to parse_matched_pair to allow backslash to escape a ' inside a
+         $'...' construct inside another grouping construct like ${...}
+       - translate $'...' and $"..." in parse_matched_pair, because nothing
+         else will do it if such a construct appears inside a grouping
+         construct
+
+                                  12/6
+                                  ----
+configure.in
+       - make sure all bracket tests for pattern matching in case statements
+         are appropriately quoted, so autoconf doesn't swallow the brackets
+       - add -rdynamic to LOCAL_LDFLAGS for freebsd-4.x
+
+examples/loadables/realpath.c
+       - new loadable builtin, canonicalizes pathnames and expands symlinks
+
+builtins/ulimit.def
+       - added undocumented -w option for setting RLIMIT_SWAP, if it's defined
+
+                                  12/7
+                                  ----
+bashline.c
+       - reordered code in initialize_readline so all of the rl_add_defun
+         calls are made before the call to rl_initialize, and all of the
+         rl_{bind,unbind}_key_in_map calls are made after initializing
+         readline.  This allows the bash-specific function names to be used
+         in ~/.inputrc
+
+                                  12/12
+                                  -----
+lib/readline/callback.c
+       - in rl_callback_read_char, loop after returning from
+         readline_internal_char and test rl_pending_input in case some
+         function (like the incremental search functions and digit argument
+         functions) pushed input back with rl_execute_next
+
+lib/readline/readline.h
+       - new rl_state flag:  RL_STATE_INPUTPENDING, indicating that
+         rl_execute_next has pushed input back for rl_get_key to read
+
+lib/readline/input.c
+       - new function to clear rl_pending_input: rl_clear_pending_input()
+
+lib/readline/{input,readline,signals}.c
+       - when rl_pending_input is set, set state RL_STATE_INPUTPENDING;
+         unset that state when rl_read_key returns the pending input
+       - call rl_clear_pending_input at appropriate points
+
+                                  12/15
+                                  -----
+lib/readline/histfile.c
+       - don't leak file descriptors while attempting to truncate a non-regular
+         file
+
+input.c
+       - make sure check_bash_input sets the close-on-exec flag for the file
+         descriptor used to save the bash input fd
+
+parse.y
+       - if default_buffered_input gets changed while it's on the saved
+         stream stack, make sure it gets set to close-on-exec when it's
+         restored by pop_stream()
+
+                                  12/18
+                                  -----
+builtins/ulimit.def
+       - change set_limit to account for Cygwin's setdtablesize() being
+         declared as a void function
+
+support/config.{guess,sub}
+       - change cygwin32 to cygwin
+
+                                  12/20
+                                  -----
+nojobs.c
+       - make wait_sigint_handler handle the case of interrupt_immediately
+         being non-zero when it's called, and jump out appropriately
+
+jobs.c
+       - new function to run sigchld traps: run_sigchld_trap(); called from
+         waitchld
+       - broke the code that computes the printable job status messages for
+         pretty_print_job out into a separate function
+       - rearranged some code eliminating a useless `else' branch in wait_for
+       - shell_tty_info is now a TTYSTRUCT, using defines from shtty.h
+       - broke the code that sets a job's status after waitpid says its state
+         has changed and cleans up after a received SIGINT out into a separate
+         function: set_job_status_and_cleanup
+       - last_stopped_job() -> job_last_stopped() to avoid collision with a
+         variable name
+       - last_running_job() -> job_last_running() for consistency
+
+                                  12/21
+                                  -----
+variables.c
+       - new function, print_func_list (SHELL_VAR **list); prints shell
+         functions from list in a form that may be re-used as input to
+         redefine the functions
+
+variables.h
+       - new extern declaration for print_func_list
+
+builtins/set.def
+       - set without options now calls print_func_list to have functions
+         printed in a way that can be reused as input (this affects
+         `declare' and `declare -p' also)
+
+                                  12/27
+                                  -----
+general.h
+       - add an ISOCTAL define
+
+builtins/common.h
+       - use ISOCTAL in read_octal function
+
+parse.y
+       - in decode_prompt_string, don't just skip STRING forward by 3 if an
+         octal sequence is translated; handle sequences of fewer than three
+         characters by checking each character
+
+                                  12/28
+                                  -----
+doc/{bash.1,bashref.texi}
+       - make sure `vi-move' is a documented keymap argument to bind's
+         `-m' option
+
+                                  12/29
+                                  -----
+variables.c
+       - change print_assignment so that functions are printed in a way that
+         may be reused as input (without the `=')
+
+                                1/2/2001
+                                --------
+test.c
+       - fix test_command to print an error message if `[' is supplied a
+         single argument that is not `]'
+
+support/shobj-conf
+       - change test of $SHOBJ_CC from `gcc*' to `*gcc*' to handle full
+         pathnames
+
+                                  1/11
+                                  ----
+execute_cmd.c
+       - in initialize_subshell, zero out builtin_env, since those aren't
+         supposed to be exported
+
+variables.c
+       - new function: shell_var_from_env_string, creates a SHELL_VAR from
+         a `name=value' style environment string and returns it
+       - new function: bind_name_in_env_array(name, value, array), makes
+         NAME have VALUE in ARRAY, a temporary environment
+       - new function: bind_tempenv_variable (name, value), makes NAME have
+         VALUE in one of the temporary environments -- temporary_env,
+         builtin_env, or function_env
+       - changed bind_variable to call bind_tempenv_variable if one of the
+         temporary environments is non-null before modifying the
+         shell_variables table.  This fixes a problem with sourced scripts
+         modifying variables in a temporary environment, but not seeing the
+         updated values
+
+                                  1/12
+                                  ----
+variables.c
+       - changed things so OSTYPE, HOSTTYPE, and MACHTYPE are set only if
+         they don't have a value at shell startup
+
+                                  1/17
+                                  ----
+builtins/fc.def
+       - create temp file with MT_USETMPDIR
+
+variables.c
+       - allow function local readonly variables to overwrite (or shadow)
+         other (calling) function readonly variables, but not global
+         readonly ones
+
+builtins/wait.def
+       - replace unwind_protect of interrupt_immediately, since that's a
+         variable that you cannot unwind-protect (the unwind-protect code
+         uses it)
+
+                                  1/22
+                                  ----
+Makefile.in
+       - changed RELSTATUS to `beta1'
+
+lib/readline/terminal.c
+       - added rl_set_screen_size function, wrapper around
+         _rl_set_screen_size so bash doesn't call _rl_ functions
+
+lib/readline/{rlprivate,readline}.h
+       - moved rl_explicit_arg to readline.h
+       - moved rl_numeric_arg to readline.h
+       - moved rl_editing_mode to readline.h
+       - moved rl_last_func to readline.h
+       - added rl_set_screen_size to readline.h
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_explicit_arg, rl_editing_mode, rl_numeric_arg,
+         rl_last_func
+       - documented rl_set_screen_size
+
+{jobs,nojobs}.c
+       - _rl_set_screen_size -> rl_set_screen_size
+
+{bashline,pcomplete}.c, builtins/set.def
+       - removed extern declarations of variables defined in readline.h
+
+                                  1/23
+                                  ----
+support/rlvers.sh
+       - use $TMPDIR if it's defined
+       - use $RL_INCDIR (set by -I option, /usr/local/include by default)
+         as the directory containing the installed readline header files
+       - cd to the temp directory before attempting compilation
+
+configure.in
+       - pass `-I ${includedir}' to rlvers.sh
+
+                                  1/29
+                                  ----
+subst.c
+       - fixed parameter_brace_expand to only throw away the state of
+         quoted dollar-at if we're going to be using the rhs of the
+         brace expansion, since whatever parameter_brace_expand_rhs sets
+         should be what goes (corrects bad fix of 2/16/2000)
+       - fixed param_expand to only free temp after calling
+         parameter_brace_expand if it's a quoted null and we *did not*
+         have a quoted $@, since in that case we want to keep it and
+         do the $@ special handling (fixes real problem from 2/16/2000)
+
+                                  1/30
+                                  ----
+variables.c
+       - remove export attribute from SSH2_CLIENT, like SSH_CLIENT
+
+                                   2/1
+                                   ---
+unwind_prot.c
+       - added new function, clear_unwind_protect_list, to zero out the
+         unwind_protect list, optionally freeing the elements
+
+unwind_prot.h
+       - new extern declaration for clear_unwind_protect_list
+
+execute_cmd.c
+       - call clear_unwind_protect_list in initialize_subshell.  This fixes
+         the problem of core dumps when calling a shell script without a
+         leading `#!' from a shell function or other context with an
+         unwind-protect list
+       - set variable_context and return_catch_flag to 0 in
+         initialize_subshell, since a new subshell is no longer in a shell
+         function
+
+                                   2/2
+                                   ---
+doc/readline.3
+       - updated the text; clarified several points
+       - changed the usage synopsis to include <readline/readline.h> and
+         <readline/history.h>
+
+lib/readline/doc/hstech.texinfo
+       - made sure all function prototypes are valid ANSI C (mostly
+         changing () to (void))
+
+lib/readline/doc/rluser.texinfo
+       - a few clarifications
+
+lib/readline/doc/rltech.texinfo
+       - a few clarifications
+       - added two new subsections for character input and terminal
+         management
+       - changed all function prototypes to be valid ANSI C (mostly
+         replacing () with (void))
+       - documented some variables in readline.h but previously not in
+         the reference manual (rl_num_chars_to_read, rl_dispatching,
+         rl_gnu_readline_p, rl_completion_type)
+       - documented some functions in readline.h but previously not in
+         the reference manual (rl_clear_pending_input, rl_prep_terminal,
+         rl_deprep_terminal, rl_tty_set_default_bindings, rl_alphabetic,
+         rl_crlf)
+
+lib/readline/readline.h
+       - added extern declaration for rl_clear_pending_input()
+       - added extern declaration for rl_alphabetic
+       - changed rltty_set_default_bindings to rl_tty_set_default_bindings
+       - changed crlf() -> rl_crlf()
+
+lib/readline/rltty.c
+       - new function, rl_tty_set_default_bindings, just calls
+         rltty_set_default_bindings (needed `rl_' prefix)
+
+lib/readline/readline.c
+       - readline_default_bindings now calls rl_tty_set_default_bindings
+
+lib/readline/terminal.c
+       - renamed crlf() to rl_crlf(); crlf() is still defined for backwards
+         compatibility 
+
+bashline.c, lib/readline/{complete,display}.c
+       - changed all calls to crlf() to rl_crlf()
+
+test.c
+       - fix filecomp() so that `test file1 -nt file2' doesn't fail if file1
+         exists but file2 does not
+
+                                   2/5
+                                   ---
+lib/readline/{terminal,compat}.c
+       - move crlf() backwards-compatibility definition to compat.c
+
+execute_cmd.c
+       - if we're running a command `( command ) &' from a non-interactive
+         shell, don't unconditionally disable expand_aliases.  Only do it
+         when running such a command from an interactive shell, since then
+         we're changing to a non-interactive shell
+
+                                   2/6
+                                   ---
+[bash-2.05-beta1 released]
+
+lib/readline/compat.c
+       - add extern declaration for rl_crlf()
+
+lib/readline/undo.c
+       - initialize start and end in rl_do_undo to avoid bogus gcc compiler
+         warning with -Wall
+
+lib/readline/rlprivate.h
+       - fix typo in extern declaration of _rl_current_display_line()
+       - add extern declaration of _rl_free_saved_history_line()
+
+lib/readline/terminal.c
+       - return immediately from _rl_set_screen_size if one of the args is 0
+       - new function, rl_get_screen_size (int *rows, int *cols) to return
+         readline's idea of the screen dimensions
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_get_screen_size
+
+                                   2/7
+                                   ---
+pathexp.c
+       - a couple of fixes for the POSIX_GLOB_LIBRARY version of the globbing
+         code
+
+expr.c
+       - fixed omission of ^= from the special assignment operators
+
+shell.c
+       - change logic for setting `posixly_correct' at shell startup:  if
+         $POSIXLY_CORRECT or $POSIX_PEDANTIC is found in the environment,
+         set it to 1, otherwise retain the previous value (which is
+         initialized to 0)
+
+                                  2/10
+                                  ----
+builtins/evalstring.c
+       - since subshell_environment is now a flags word, test for the
+         SUBSHELL_COMSUB bit being set when decided whether or not to
+         evaluate $(<file), not just for subshell_environment ==
+         SUBSHELL_COMSUB
+
+                                  2/12
+                                  ----
+lib/readline/doc/rltech.texinfo
+       - fixed a couple of problems with the documentation for
+         rl_prep_terminal and rl_deprep_terminal 
+       - added description of rl_set_prompt
+
+support/config.sub
+       - added support for Linux running on the IBM S390
+
+                                  2/13
+                                  ----
+input.c
+       - new function, fd_is_bash_input (fd), encapsulates the test for
+         whether or not FD is the file descriptor from which bash is reading
+         its input
+       - change check_bash_input to call fd_is_bash_input
+       - new function, save_bash_input (fd, new_fd), handles saving the
+         buffered stream associated with file descriptor FD to one
+         associated with NEW_FD.  If NEW_FD == -1, this function allocates a
+         file descriptor itself with fcntl
+       - new function, set_bash_input_fd(fd), sets the fd bash is using to
+         read input to FD
+       - changed duplicate_buffered_stream to note that the buffer it's
+         duplicating to was the bash input buffer (B_WASBASHINPUT)
+
+input.h
+       - extern declarations for fd_is_bash_input and save_bash_input
+       - new flag for b->flag: B_WASBASHINPUT
+
+redir.c
+       - in add_undo_redirect, if FD is 0, make the undo redirect be of type
+         r_duplicating_input instead of r_duplicating_output, since that fd
+         requires special handling in the presence of buffered streams (fixes
+         problem with scripts reading input through a pipe restoring bash
+         input buffered stream correctly after a `read' with an input
+         redirection
+
+                                  2/14
+                                  ----
+lib/readline{complete,util}.c
+       - moved rl_strpbrk to util.c with rest of string utility functions,
+         renamed to _rl_strpbrk
+
+lib/readline/rlprivate.h
+       - extern declaration for _rl_strpbrk
+
+lib/readline/input.c
+       - make the timeout in rl_gather_tyi() be a variable
+         (_keyboard_input_timeout) rather than a constant
+       - new function, rl_set_keyboard_input_timeout (int u) to set
+         _keyboard_input_timeout.  The argument is in microseconds; returns
+         the old value of _keyboard_input_timeout
+       - _rl_input_available uses _keyboard_input_timeout also
+
+lib/readline/readline.h
+       - extern declaration for rl_set_keyboard_input_timeout
+
+lib/readline/doc/rltech.texinfo
+       - documented rl_variable_bind(), rl_macro_bind(), rl_macro_dumper(),
+         rl_variable_dumper(), rl_push_macro_input(), rl_show_char()
+
+                                  2/20
+                                  ----
+findcmd.c
+       - new function, executable_or_directory(name), returns 1 if NAME is
+         an executable file or a directory
+
+findcmd.h
+       - extern declaration for executable_or_directory()
+
+bashline.c
+       - call executable_or_directory() from command_word_completion_function,
+         which requires a single stat(2), instead of executable_file() and
+         is_directory(), each of which requires a stat(2)
+
+                                  2/21
+                                  ----
+execute_cmd.c
+       - changed execute_builtin to handle `return' with a preceding variable
+         assignment list specially when in POSIX mode.  POSIX says that the
+         variable assignments should persist after the builtin returns, since
+         `return' is a special builtin.  Since `return' does a longjmp and
+         doesn't go through the normal cleanup path, we need to do special
+         things
+
+variables.c
+       - new function, merge_function_env(), merges the function_env into
+         the shell_variables table
+
+variables.h
+       - extern declaration for merge_function_env()
+
+execute_cmd.c
+       - changed execute_function to merge any variable assignments preceding
+         the function call into shell_variables if the shell is running in
+         POSIX mode
+
+subst.c
+       - changed parameter_brace_expand_error to do tilde expansion on the
+         rhs of the expansion, if it's not null
+       - changed command_substitute so that the subshell begun to execute
+         the command substitution inherits the setting of the `-e' option
+         when in POSIX mode
+
+builtins/break.def
+       - changed check_loop_level to not print a complaining message when
+         the shell is running in POSIX mode, even if BREAK_COMPLAINS is
+         defined.  This affects `break' and `continue'
+       - changed `break' and `continue' to return success even if the shell
+         is not executing a loop, as POSIX specifies
+
+builtins/set.def
+       - changed reset_shell_options() to not clear posixly_correct, so
+         subshells spawned to execute shell scripts without a leading `#!'
+         inherit posix mode from their parent shell
+
+variables.c
+       - changed make_new_variable to create the shell_variables hash table
+         if it hasn't been done yet.  This is needed because bind_variable
+         may be called before initialize_shell_variables (e.g., when
+         `bash -o posix' calls bind_variable("POSIXLY_CORRECT", "y") from
+         parse_shell_options -> set_minus_o_option -> set_posix_mode
+         This makes `bash --posix' and `bash -o posix' equivalent, as they
+         should always have been
+       - changed maybe_make_export_env to merge the contents of `builtin_env'
+         into export_env after function_env and before temporary_env.  This
+         fixes the problems with variable assignments preceding `eval' or
+         `source' not making it into the environment passed to executed disk
+         commands (var=20 eval printenv var)
+
+doc/bashref.texi
+       - noted that variable assignments preceding shell function calls
+         persist in the shell environment after the function returns when
+         the shell is running in POSIX mode
+       - noted that when the shell is running in POSIX mode, subshells
+         spawned to execute command substitutions inherit the value of
+         the `-e' option from the parent shell
+
+                                  2/26
+                                  ----
+doc/bashref.texi
+       - augmented description of bash non-posix behavior in posix mode
+         with information from running the vsc-lite test suite
+
+                                  2/28
+                                  ----
+general.c
+       - since POSIX.2 says that aliases should be expanded even in
+         non-interactive shells, enable alias expansion in
+         posix_initialize() when posix mode is enabled, and set it to the
+         value of interactive_shell if posix mode is disabled
+
+shell.c
+       - before running the startup scripts, set expand_aliases to
+         posixly_correct, since we don't want alias expansion in startup
+         files unless we've been given the --posix invocation option
+
+doc/bashref.texi
+       - added item in BASH Posix Mode section noting that alias expansion
+         is always enabled when in posix mode
+
+Makefile.in
+       - changed release level to `beta2'
+
+                                   3/1
+                                   ---
+jobs.c
+       - expanded retcode_name_buffer to 64
+       - changed printable_job_status to conform to posix.2 for text of
+         stopped job status: `Stopped(SIGTSTP)' or `Stopped(SIGSTOP)'
+
+doc/bashref.texi
+       - Noted above change in posix mode section
+
+                                   3/5
+                                   ---
+lib/readline/bind.c
+       - changed rl_get_keymap_by_name to work case-insensitively
+
+                                   3/6
+                                   ---
+doc/readline.{0,3,ps}
+       - removed from distribution; moved to readline distribution
+
+lib/readline/doc/history.3
+       - man page for history library; neither built nor installed
+         (part of the standalone readline distribution)
+
+lib/readline/histfile.c
+       - changed history_truncate_file to return 0 on success, errno
+         on failure
+       - changed history_do_write to return errno on a write error.  This
+         affects write_history and append_history
+
+lib/readline/history.c
+       - max_input_history is now history_max_entries; the old variable is
+         maintained for backwards compatibility
+
+lib/readline/histexpand.c
+       - the list of delimiters that separate words for history_tokenize
+         is now a variable: history_word_delimiters; default value is as
+         before
+       - changed history_expand to return 0 immediately if its second
+         argument is NULL
+
+bashline.c
+       - changed to use history_max_entries
+
+lib/readline/history.h
+       - extern declaration for history_max_entries
+       - extern declaration for history_word_delimiters
+
+                                   3/8
+                                   ---
+test.c
+       - changed unary_operator() to return FALSE for non-numeric arguments
+         to `-t'
+
+                                   3/9
+                                   ---
+[bash-2.05-beta2 released]
+
+                                  3/12
+                                  ----
+lib/readline/doc/rltech.texinfo
+       - documented rl_set_paren_blink_timeout()
+       - moved the example function to its own info node
+
+lib/readline/{hstech.texinfo,history.3}
+       - `$' is not in the default value of history_word_delimiters
+
+                                  3/13
+                                  ----
+bashline.c
+       - in maybe_add_history, if the tests for HISTCONTROL succeed, but
+         the HISTIGNORE check fails, set first_line_saved to 0
+
+                                  3/15
+                                  ----
+
+lib/glob/fnmatch.c
+       - fixed a bug in patscan that caused `[' to be treated as special
+         even inside a nested bracket expression.  It's supposed to lose
+         it's special handling inside []
+       - fixed a bug in patscan that caused `]' to end an embedded bracket
+         expression even if it was the first character after the `[' (or
+         a leading `!' or `^')
+
+                                  3/22
+                                  ----
+execute_cmd.c
+       - made a small change to shell_execve to report a more user-friendly
+         error if execve(2) fails because of a `#! interpreter' error with
+         `interpreter'
+       - in shell_execve, if HAVE_HASH_BANG_EXEC is not defined, make sure
+         the file length is > 2 characters before attempting to execute an
+         interpreter
+
+                                  3/26
+                                  ----
+jobs.c, nojobs.c
+       - give_terminal_to now takes a second argument, FORCE.  If that
+         second argument is non-zero, give the terminal away no matter
+         what job_control is set to
+
+jobs.h
+       - changed extern declaration of give_terminal_to
+
+{jobs,sig,subst}.c,parse.y
+       - changed all calls to give_terminal_to to add a second argument
+         of 0
+
+jobs.c
+       - changed second argument of call to give_terminal_to in
+         end_job_control to 1, to force this even if job_control is 0.
+         This fixes the problem of `exec other-job-control-shell' in a
+         startup file hanging, since run_startup_files sets job_control to 0
+
+subst.c
+       - fixed test of subshell_environment in command_substitute to test the
+         bit SUBSHELL_ASYNC rather than test equality, since it's now a
+         bitmask
+
+                                  3/27
+                                  ----
+shell.c
+       - changed posix initialization calls to set POSIXLY_CORRECT=y and
+         then call sv_strict_posix, so $SHELLOPTS includes `posix' and
+         POSIXLY_CORRECT is set, for both the posix command line options
+         and when act_like_sh is non-zero
+
+redir.c
+       - the `>& filename' redirection now works in posix mode, redirecting
+         stdout and stderr, since POSIX.2 leaves it unspecified
+
+doc/bashref.texi
+       - removed item about `>& filename' from Bash POSIX Mode section
+
+parse.y
+       - fixed a problem in decode_prompt_string with `\W' not printing
+         anything if PWD == "//"
+
+lib/readline/input.c
+       - in rl_read_key, after calling (*rl_event_hook), check for rl_done
+         being set, and return '\n' if it is
+
+Makefile.in
+       - changed RELSTATUS to `release'
+
+                                  3/28
+                                  ----
+support/bashbug.sh
+       - replace use of $(...) with `...` for the benefit of old versions
+         of sh
+
+builtins/set.def
+       - changed print_all_shell_variables to not print shell function names
+         and definitions when in posix mode
+
+doc/bashref.texi
+       - noted change in `set' behavior in posix mode section
+
+                                   4/2
+                                   ---
+lib/readline/readline.c
+       - changed default value of RL_LIBRARY_VERSION to `4.2'
+
+                                   4/5
+                                   ---
+[bash-2.05-release frozen]
+
+                                   4/6
+                                   ---
+bashline.c
+       - fix to vi_edit_and_execute_command to keep it from adding an
+         empty line to the history and not resetting current_command_line_count,
+         which resulted in each command re-run with `v' having a `;' appended
+
diff --git a/CWRU/old-changelogs/CWRU.chlog.v2 b/CWRU/old-changelogs/CWRU.chlog.v2
new file mode 100644 (file)
index 0000000..a494dd3
--- /dev/null
@@ -0,0 +1,584 @@
+
+This documents the changes between the first `public' release of CWRU bash
+and this, its second release.  It summarizes, without going into detail,
+the changes that have been made. 
+
+NEW FEATURES
+
+       o `getopts' builtin, as specified by Posix.2
+
+       o new configuration variable HAVE_UNISTD_H, used to include
+         <unistd.h> and test for Posix features
+
+       o `ulimit' has new -p and -n options to report the pipe buffer size
+         and number of available file descriptors, respectively
+
+       o allow SIGCHLD to be trapped and useful behavior to result if it is
+
+       o Posix termios and signal code for readline and the shell itself
+
+       o can optionally use the GNU termcap library
+
+       o new output for `times' builtin that looks like ksh:
+
+               shell-user shell-sys
+               child-user child-sys
+
+       o `ulimit' limits now apply to both shell and its children
+
+       o new machines.h entries
+
+       o no longer does the costly `close file descriptors 3-NOFILE'
+         each time it exec's a program -- now uses the close-on-exec
+         flag for the files it fiddles with
+
+NOTABLE BUG FIXES
+
+       o jobs.c only sets and gets the tty state in an interactive shell
+
+       o bash does better process group checking on Posix systems, eliminating
+         some error messages
+
+       o fix for `infinite login' bug on System V machines when executing a
+         script from a .bash_profile
+
+       o the `trap' command now behaves as 1003.2 specifies, as of draft 9
+
+       o restore original terminal process group upon exit, so as to not
+         confuse a parent Bourne shell
+
+       o `bash file', where `file' is a binary file, now reports an error
+
+       o shells started with `-s' now execute the .bashrc file
+
+
+CHANGES (by date and files affected)
+                                9/20 - 9/30
+                                -----------
+
+builtins.c, builtins.c.posix
+       - added getopts help text
+       - removed extra "let" from `let' error message
+       - added correct extern definition for list_rest_of_args() to shift
+         builtin
+
+jobs.c, jobs.c.posix
+       - removed bogus call to set_process_resource_limits() from
+         make_child() as a consequence of redoing `ulimit'
+       - initialize shell_tty to -1
+       - only get or set the tty state after a command completes if the shell
+         is interactive
+       - use shell_tty in get_tty_state() and set_tty_state() instead of
+         reopening /dev/tty every time
+
+jobs.c.posix
+       - do better pgrp checking in initialize_jobs() to avoid error message
+         about not being able to setpgid(2) on startup
+       - changed tcsetattr() error messages slightly
+
+expr.c
+       - avoid advancing beyond the end of the expression when reporting an
+         error
+       - NULL expressions now return 0 ($[], for example)
+
+mailcheck.c
+       - #ifdef redundant definition of NOW, which is also defined in
+         general.h
+
+variables.c
+       - initialize $OPTIND and $OPTERR to 1 for getopts
+       - add correct extern definition for itos()
+
+subst.c
+       - if $IFS is unset, it defaults to " \t\n"
+       - add special variable hack functions for $OPTIND, $OPTERR
+
+builtins.h
+       - add definition for getopts_builtin()
+
+getopts.c
+       - new file, source for `getopts' builtin command
+
+ulimit.c
+       - remove the `struct ResourceLimit' stuff; limits now apply to both
+         the shell and its children
+       - took out set_process_resource_limits(), let ulimit(2) or
+         setrlimit(2) do the work
+       - changed error messages to use builtin_error() instead of
+         report_error()
+       - changed the block factor for RLIMIT_CPU from 1000 (milliseconds)
+         to 1 (seconds)
+
+
+                                   10/1
+                                   ----
+
+builtins.c, builtins.c.posix
+       - changed `test' help text for -ef option
+       - made `trap -' reset all signals to their original values
+
+machines.h
+       - added a new configuration variable, HAVE_UNISTD_H, which should
+         be defined if /usr/include/unistd.h exists
+
+cpp-Makefile
+       - make HAVE_UNISTD_H show though from machines.h to the bash code
+       - add an explicit build line for ulimit.o so `psize.sh' is run
+         each time ulimit.o is remade.  This is kind of flaky.
+config.h
+       - include <unistd.h> if HAVE_UNISTD_H is defined, use it to test
+         for various Posix features (job control, signals, termios)
+
+jobs.c, jobs.c.posix
+       - restore original signals to child process in make_child()
+       - keep count of number of children that exit or stop in flush_child(),
+         and call a trap handler for SIGCHLD that many times.  This allows
+         SIGCHLD to be trapped without disaster occurring.
+
+shell.c
+       - If we're on a Posix system, initialize signals the Posix way
+       - clear signal mask in initialize_signals() if on Posix system
+       - set login_shell and make_login_shell to 0 upon entry to main(),
+         solving the System V infinite login bug
+
+trap.c
+       - preserve value of $? when running traps
+       - don't allow a signal ignored upon entry to the shell to be trapped
+         or reset to the default
+       - do not allow trapping SIGCHLD to change the signal handler, but
+         save the commands to be executed.  Run these commands from the
+         SIGCHLD signal handler for each child that exits or stops
+       - don't allow SIGCHLD signal handler to be overridden or have SIGCHLD
+         ignored
+       - new function added to restore all trapped signals to their original
+         values
+
+ulimit.c
+       - add new -p option to report pipe buffer size.  This is flaky on 
+         all non-Posix systems (those that do not define PIPE_BUF).
+
+readline/readline.c
+       - add Posix termios and signal code
+
+                                   10/2
+                                   ----
+
+jobs.c, jobs.c.posix
+       - only fetch terminal state in initialize_jobs() if the shell is
+         interactive
+
+                                   10/3
+                                   ----
+
+machines.h
+       - new entry for Stardent
+       - new variable USE_TERMCAP_EMULATION, for those systems that have the
+         termcap(3) functions in the curses library, but have not linked 
+         /usr/lib/libtermcap.a to libcurses.a
+
+cpp-Makefile
+       - use USE_TERMCAP_EMULATION to set TERMCAP and TERMLIB
+
+siglist.c, alias.h, general.c
+       - declare the return values of xmalloc() and malloc() for the benefit
+         of machines which cannot cope with simply casting the return value
+
+shell.c, execute_cmd.c
+       - change the re-execution of main() when executing a shell script to
+         use setjmp/longjmp
+
+builtins.c
+       - add code to change the shell level in exec_builtin(), decrementing
+         it before trying the execve(2) and incrementing it again if that
+         fails
+
+variables.c
+       - new function adjust_shell_level() to change shell level by a
+         specified increment
+       - initialize `noclobber' in shell_initialize(), if we have inherited
+         the `noclobber' variable from a parent shell
+
+ulimit.c
+       - add new option -n, which reports the max number of available file
+         descriptors as reported by getdtablesize().  On SunOS 4.1, this
+         can be set, too, with setrlimit(RLIM_NOFILE, ...).
+
+                                   10/4
+                                   ----
+
+readline/readline.c
+       - Ultrix turns off system call restart when executing in `Posix mode'
+         (when sigaction(3) is used to set signal handling), so make it use
+         the System V version of shell_getc()
+
+jobs.c.posix
+       - fix a bug in start_job() where `oset' was not initialized in the first
+         call to sigprocmask(), yet was used in subsequent calls
+       - remove the `shadow' instance of shell_tty_info in the code that sets
+         the line discipline in initialize_jobs()
+
+shell.c
+       - if job control is being used, restore the tty pgrp to its original
+         value so as to not screw the parent
+
+builtins.c, builtins.c.posix
+       - make the output of `times' look more like ksh
+
+                                   10/5
+                                   ----
+
+jobs.c.posix
+       - HP/UX no longer needs the signal handler for SIGCHLD reset via a
+         call to signal() in flush_child() -- this breaks job control
+
+machines.h
+       - add HAVE_VPRINTF to HP/UX entry
+
+siglist.c
+       - include <stdio.h>, sprintf(3) requires it on some systems
+
+                                   10/8
+                                   ----
+
+execute_cmd.c
+       - make $LINENO in a function count the number of simple commands
+         executed
+
+                                   10/9
+                                   ----
+
+termcap, cpp-Makefile
+       - new GNU termcap library, cribbed from Emacs.  #define
+         USE_GNU_TERMCAP in machines.h entry to use it.  Small changes
+         required to cpp-Makefile to make it work.  This works on
+         4.3 BSD, at least.
+
+machines.h
+       - add new entry for AIX/370
+
+general.c
+       - sysv_getc() is also needed for Ultrix machines running in Posix
+         mode, so change the #ifdef accordingly (Ultrix passes the
+         SV_INTERRUPT flag to sigvec(2) in sigaction(3)).
+
+subst.c
+       - use sysv_getc() for Ultrix machines running in Posix mode for
+         command subsitution pipe reading
+
+                                   10/10
+                                   -----
+
+shell.c, execute_cmd.c
+       - if the `file' portion of `bash file' is a binary file, report an
+         error and do not attempt to execute it
+
+jobs.c, jobs.c.posix
+       - the code that does the guts of `kill' now sends the SIGCONT to a
+         stopped job after it sends the specified signal, not before
+
+                                   10/11
+                                   -----
+
+parse.y
+       - set +H also turned off putting commands into the history list
+
+shell.c
+       - make shells started with -s read .bashrc
+
+       
+                                   10/14
+                                   -----
+
+expr.c
+       - changed calls to `report_error' to call `builtin_error'.  I don't
+         know if this is exactly right, but it seems to me that an error
+         in an expression shouldn't kill the shell if -e is set.
+
+fc.c
+       - changed `report_error' to `builtin_error'
+
+                                   10/16
+                                   -----
+
+readline/vi_mode.c
+       - repeat count to rl_vi_subst() was incorrectly being ignored
+       - don't call rl_vi_change_case() on an empty line; two calls in
+         a row can cause a seg fault
+
+
+                                   10/17
+                                   -----
+
+execute_cmd.c
+       - give builtins run in pipes a useful setting of top_level to
+         longjmp(2) to on errors
+
+
+builtins.c, builtins.c.posix
+       - replace some occurrences of longjmp (top_level, ...) with simple
+         calls to return (EXECUTION_FAILURE)
+
+                                   10/18
+                                   -----
+
+readline/readline.c
+       - Make O_NDELAY be the same as O_NONBLOCK on Posix systems
+       - Don't use IXANY if it's not defined (some strict Posix systems do
+         not define it)
+       - Posix systems need NOFLSH for c_lflag to avoid flushing the input
+         buffer after a SIGINT, SIGQUIT, or SIGSUSP.  This is still wrong,
+         though.
+
+execute_cmd.c, test.c, general.h
+       - use the Posix S_IS* macros to test file formats instead of explicitly
+         masking with S_IFMT and testing the result.  Macros are provided
+         for those systems that do not have them (like 4.3 BSD).
+
+parse.y
+       - fix expansion of \W in the prompt string so that it works when
+         you're in the root directory
+
+machines.h
+       - add machine description for concurrent in UCB universe
+
+Makefile
+       - make sure $(MFLAGS) is passed to the recursive make of bash-Makefile
+
+                                   10/22
+                                   -----
+
+jobs.c.posix
+       - make sure the NOFLSH bit is turned on in the termios c_lflag word
+         so that typeahead doesn't get flushed on receipt of signals. THIS
+         HAS BEEN TAKEN OUT.
+
+                                   10/23
+                                   -----
+
+execute_cmd.c
+       - change extract_colon_unit() to increment the path index past a
+         colon when it is called, before it tries to get the next component
+         from the path.  Without doing this, `.' was always found as the
+         second component in the path, whether it was actually there or not.
+
+trap.c, shell.c
+       - made SIGINT trap handling act the same as that of ksh and the BSD
+         sh.  As a side effect (really the reason for doing this in the
+         first place), `read' is now interruptible.
+Makefile
+       - made the CPPFLAGS definition useful by passing it to cpp when
+         making bash-Makefile from cpp-Makefile
+       - made the `echo' line when creating bash-Makefile really echo by
+         quoting the redirection to bash-Makefile
+
+general.c
+       - make fcntl.h be included only if NO_DUP2 is defined
+
+                                   10/24
+                                   -----
+cpp-Makefile
+       - make libreadline.a depend on the objects, not the sources.  Without
+         this, you could delete on of the .o files to try to force a library
+         rebuild and have it not happen.
+
+                                   10/25
+                                   -----
+
+shell.c
+       - make a flag of `-' signal the end of option arguments, like the
+         4.3 BSD sh, and in accordance with the Posix command line syntax
+         standard
+
+shell.c, builtins.c, builtins.c.posix
+       - shuffle some code around so -o option can be given on the command
+         line -- there's no reason why it shouldn't be allowed.
+
+variables.c, variables.h, execute_cmd.c, builtins.c, builtins.c.posix, shell.c,
+subst.c, bashline.c, hash.h, variables.h
+       - change the implementation of shell function and variable storage to
+         a hash table instead of a singly-linked list
+
+make_cmd.c, shell.c
+       - bug reports only get mailed out if MAIL_BUG_REPORTS is defined
+
+                                   10/29
+                                   -----
+
+bashline.c
+       - some random cleanups from bfox
+       - make sure alias expansion is attempted in shell_expand_line () only
+         if ALIAS is defined
+
+hash.c
+       - add default case to make_hash_table to force the number of buckets
+         in the table to be the default if 0 is passed as the number of
+         buckets
+
+variables.c
+       - make initialize_shell_variables () call make_hash_table () with an
+         argument of 0 again (see previous entry).
+
+
+variables.c, builtins.c, builtins.c.posix
+       - cleanups because map_over(), all_vars(), all_shell_variables(), and
+         all_shell_functions () can possibly return NULL lists, and such
+         lists should not be sorted or freed
+
+trap.c
+       - make sure we declare `extern int last_command_exit_value' in
+         run_interrupt_trap ().
+
+variables.c
+       - Don't override a HOSTTYPE variables that comes in from the
+         environment
+
+                                   10/30
+                                   -----
+
+variables.c
+       - Fix a bug in variables.c: make_var_array () where it called
+         array_len on a NULL list
+
+builtins.c, builtins.c.posix
+       - Add a description of `-m' to the help for the `set' builtin
+         command
+
+                                   11/1
+                                   ----
+
+general.c
+       - added a definition of bzero() for USG machines, because
+         there is a reference to it in the new variable hashing code
+
+                                   11/2
+                                   ----
+
+shell.c
+       - set forced_interactive to 0 in shell_reinitialize(), otherwise
+         shell scripts get marked as interactive
+
+                                   11/6
+                                   ----
+
+execute_cmd.c
+       - eliminated the costly loop from 3 to NOFILE closing all file
+         descriptors each time we exec a command by setting all file
+         descriptors > 2 opened as the result of a redirection and internal
+         to the shell to be close-on-exec, as well as all file descriptors
+         opened to save others in add_undo_redirect().  `internal to the
+         shell' means that the redirections were attached to shell builtin.
+         Other `internal' redirections include while, for, and until
+         loops, and shell functions.  I got scared after reading that
+         s5r4 provides 2048 fd's per process -- 2045 (mostly useless)
+         close() calls on *each executed program*?  No way, no how.
+
+         This caused the other fixes for this file to be discovered.
+
+         Unfortunately (there always seems to be a catch), 4.3 BSD up to
+         4.3-tahoe leaves a file descriptor open in setpwent() if you're
+         using dbm password files.  4.3+NFS does this if you're not using
+         YP.  Arghhhhhhh...  I haven't decided yet what to do about this;
+         probably just set fd 3 to close-on-exec when the shell is
+         initialized.
+
+execute_cmd.c
+       - removed the call to `add_undo_redirect()' when a file is being
+         closed with the redirection operators [n]<&- and [n]>&-.  The
+         effect was to make those operators useless.  Sad to say, I was
+         probably the dummy who put it in there...
+
+execute_cmd.c
+       - when calling fcntl(redirector, F_GETFD, 0) in do_redirection() to
+         find out if a file descriptor is active, do it only if redirector
+         is not the same as `fd', which you've just opened.  This has
+         spectacularly bad consequences if you do something like
+
+               exec 3</dev/tty 4>/tmp/foo 5</dev/null
+
+         I'm probably to blame for this, too...
+
+execute_cmd.c
+       - when saving a file descriptor in add_undo_redirect, make sure we
+         save the state of the close-on-exec flag, and restore it when
+         dup2'ing the saved fd back to the orignal.
+
+execute_cmd.c
+       - when performing a redirection that causes us to open a file, make
+         sure we at least add an undo record to close the file, even if
+         the file descriptor is not already active
+
+execute_cmd.c
+       - when duplicating a file descriptor as the result of a redirection
+         instruction, make sure to manually duplicate the state of the
+         close-on-exec flag
+
+                                   11/13
+                                   -----
+
+execute_cmd.c
+       - finally tracked down and stamped out the persistant bug that caused
+         the shell to hang when doing a command like "history | more" when
+         there was more than a pipeful of text to send to `more' and you quit
+         out of `more'after the first screenful.  An extra read end of the
+         pipe was being left open in the shell started to run `history', the
+         consequence being that that shell at the beginning of the pipeline
+         would never get the SIGPIPE that would cause it to exit.  The fix
+         is kind of strange: pass around a file descriptor to close whenever
+         a child process is created in either execute_command_internal or
+         execute_simple_command.  We just pass the file descriptor that we
+         want closed to the instance of execute_command_internal that runs
+         the first half of the pipeline, and it gets closed just like we
+         want.
+
+         In the future, this can (and probably should) be made into a bitmap
+         of file descriptors to close.  It wouldn't have to be big, 16 should
+         be enough given the ability to do close-on-exec.
+
+builtins.c, builtins.c.posix
+       - changed the one call to execute_command_internal to add the extra
+         parameter needed by the above fix.
+
+unwind_prot.c
+       - make without_interrupts() block SIGINT on capable systems (Posix
+         and systems with BSD sigs) instead of ignoring it, which causes
+         interrupts to be dropped.  Blocking is what you want, anyway.
+
+execute_cmd.c
+       - add an unwind_protect for the redirections for a function or
+         builtin.  To see why this is needed, define a function shcat:
+
+               shcat()
+               {
+                       while read line
+                       do
+                               echo "$line"
+                       done
+               }
+
+         Now execute "shcat < INSTALL" and try to interrupt it.  Bash will
+         keep reading the lines from INSTALL and trying to execute them
+         until EOF, at which point the shell exits.
+
+                                   11/14
+                                   -----
+
+execute_cmd.c
+       - a subshell spawned to execute a function or a builtin with a pipe
+         or an asynchronous function or builtin should have login_shell and
+         interactive set to 0.  That way, if someone is stupid enough to
+         pipe to `exit' from a login shell, the subshell won't try to exec
+         .bash_logout.
+
+                                   11/16
+                                   -----
+builtins.c, builtins.c.posix
+       - exit status of `type' was wrong for executable files, hashed and
+         unhashed
+
+bashline.c
+       - Made bash_complete_filename_internal take just about everything
+         as a possible filename character.  It still can't do completion
+         of a filename containing blanks if you type one of the blanks,
+         though -- it needs the blanks-as-word-separators logic to work
+         at all.
diff --git a/CWRU/old-changelogs/CWRU.chlog.v3 b/CWRU/old-changelogs/CWRU.chlog.v3
new file mode 100644 (file)
index 0000000..932586d
--- /dev/null
@@ -0,0 +1,1119 @@
+This documents the changes between the second `public' release of CWRU bash
+and this, its third release.  It summarizes, without going into detail, the
+changes that have been made. 
+
+NEW FEATURES
+
+       o Some performance work was done.  Scripts are now somewhat faster.
+         Bash will never be a speed demon -- it allocates, frees, and
+         copies way too many times.
+
+       o Added a new readline variable `prefer-visual-bell'.  If this is
+         set, and the `vb' termcap capability exists, visual rather than
+         audible bells will be used.
+
+       o `bash file' will now search the $PATH for `file' if it is not
+         found in the current directory.
+
+       o new machines.h variables: HAVE_MULTIPLE_GROUPS, HAVE_RESOURCE
+
+       o new machines.h entries: AIX/PS2, System V.4 on 386, AIX/370, Ardent
+         Titan, DG AViiON, Harris Nighthawk, SGI Iris
+
+       o all filenames are now fewer than 14 characters
+
+       o The FIGNORE variable was implemented
+
+NOTABLE BUG FIXES
+
+       o When expanding commands, word splitting is no longer performed on
+         all words, but only the output of command, arithmetic, and variable
+         and parameter substitution
+
+       o The close-on-exec code now also passes around a bitmap of file
+         descriptors to close in child processes.  This is necessary
+         because of the way bash does pipes.  Details on request.
+
+       o Fixed readline to do correct cursor motion when using Sun's
+         shelltool or cmdtool.
+
+       o Fixed command substitution so that old-style substitution (``)
+         passes the characters between the backquotes through verbatim.
+
+       o Fixed reading here documents to obey newline quoting
+
+                                   11/19
+                                   -----
+nojobs.c
+       - removed bogus call to set_process_resource_limits
+
+test.c
+       - changed references to SYSV to USG
+
+readline/readline.c
+       - added support for visible bells, turned on by the startup file
+         variable "prefer-visible-bell"
+       - changed rl_signal_handler() so that sigsetmask() is not called
+         on vanilla SYSV machines
+       - made include declarations correct for USG machines that define
+         TIOCGWINSZ in sys/ioctl.h
+
+variables.c
+       - s5r3 invokes getenv() before main() in some cases.  Make sure
+         that the variable hash table is created there if it does not
+         exist.  (BSD systems using gprof also do this, by the way.)
+
+                                   11/20
+                                   -----
+readline/readline.c
+       - Make sure HACK_TERMCAP_MOTION is not defined.  It's faster to
+         print a character than an escape sequence for a non-destructive
+         space, and it screws up on OpenWindows shelltool and cmdtool.
+
+subst.c
+       - Finally fixed the word splitting bug.  Bash now splits only the
+         results of command, parameter, and arithmetic expansion that do
+         not appear in double quotes.  As currently implemented, the change
+         has expand_word_internal return a flag indicating whether or not
+         it expanded something.  If not, the word is not split.  This is
+         only noticed by expand_words_1; all other functions that call
+         expand_word_internal ignore the result -- they are either supposed
+         to or not supposed to do word splitting and they take care of it
+         themselves.  This latter bit may have to be changed later.
+
+readline/emacs_keymap.c
+       - Make M-TAB insert a tab.  The binding had been inadvertently
+         omitted.
+
+builtins.c, builtins.c.posix
+       - make read_builtin() call string_list_dollar_star when more words
+         are read than variables specified, because Posix specifies that in
+         this case, the intervening separators are preserved in the
+         remaining words (``the leftover words and their intervening
+         separators are assigned to the last var'').  This allows the
+         following to work correctly:
+
+               while read line
+               do
+                       echo "$line"
+               done < /etc/passwd
+
+subst.c
+       - remove from list_string the requirement that the word be quoted to
+         make sequences of characters in $IFS expand to separate arguments.
+         I can't remember why it was there.
+
+builtins.c, builtins.c.posix
+       - both ksh and the s5r3 sh remove the trailing newline from a line
+         input to `read', so now bash does, too.
+
+                                   11/21
+                                   -----
+execute_cmd.c
+       - Finally do things the *right* way, and pass around a bitmap of
+         file descriptors to close when forking.  The way bash does
+         pipes forces this.
+
+builtins.c, builtins.c.posix
+       - change the call to execute_command_internal in parse_and_execute
+         to call it with an empty bitmap of file descriptors to close.
+
+shell.c
+       - make the fd that we open to read a script argument be close-on-exec
+
+shell.c, variables.c, readline/readline.c
+       - add endpwent() everywhere getpwnam or getpwuid is called -- they
+         leave an open file descriptor on systems with YP code derived
+         from Sun's 3.x release.
+
+
+                                   11/25
+                                   -----
+builtins.c, builtins.c.posix
+       - use the same logic for locating a program when in the exec builtin as
+         when finding a program normally -- pathnames with slashes in them
+         anywhere are not looked up via $PATH.
+
+shell.c
+       - when invoked as `bash file', use $PATH to look up `file', using the
+         same logic as the `.' builtin.  (Said logic is possibly faulty --
+         files with slashes in their names are still looked up in the path.
+         This is different from ksh86, at least.)  Do this only if `file'
+         is not found in the current directory.
+       - when invoked as an interactive login shell, close all file
+         descriptors < 20 first thing.  There is a fairly common bug in the
+         Sun NFS code that leaves an open file descriptor when you use one
+         of the getpw* C library functions. 
+
+                                   11/28
+                                   -----
+shell.c
+       - make sure history_expansion is set to 0 if interactive is set to 0.
+         This fix makes rn's mbox.saver run correctly, rather than report
+         the famous `Event not found' error.
+
+                                   11/29
+                                   -----
+variables.c
+       - make sure the hash table is created in getenv if necessary on all
+         systems; gprof requires it.
+
+builtins.c, builtins.c.posix
+       - make read return 1 only on EOF
+
+shell.c
+       - make `bash file' look through $PATH only if ./file does not exist.
+         (bug fix for previous improvement)
+
+readline/readline.c
+       - need to turn off CRMOD when using the BSD tty driver so that extra
+         carriage returns are not generated
+
+subst.c, parse.y
+       - changes so that characters between backquotes in double quotes are
+         passed through verbatim, so this will work: echo "ab `echo "hi"` cd"
+         echoes ab hi cd.  The fixes are to string_extract_double_quoted and
+         read_token.
+
+subst.c
+       - small change in command substitution error message printed when
+         pipe(2) fails -- `backquote' --> `command'
+
+                                   12/1
+                                   ----
+parse.y, shell.c, builtins.c, builtins.c.posix, make_cmd.c
+       - changed the way parsing of here documents works in the presence
+         of continued lines (unquoted backslash-newline pair or via quoting).
+         Now the shell reads up to an unquoted newline before trying to
+         read the contents of the here-document (that's the way sh works).
+         The changes are spread out over multiple files.
+
+         The cases that this fixes are these:
+
+               cat << EOF | sed -n \
+                       -e 'blah blah...' \
+                       -e 'more more...'
+               input
+               to
+               cat
+               for
+               sed
+               EOF
+
+               cat << EOF | echo 'a b c
+               d e f
+               g h i'
+               EOF
+
+         Previously, the yacc-generated bash parser would resolve the
+         `<< EOF' redirection and immediately try to create the here
+         document, and the rest of the command would become part of
+         the here document.
+
+         Changes by file:
+               parse.y:
+                       added two new variables, need_here_doc, and
+                       redirection_needing_here_doc.  The yacc actions
+                       associated with the here-document productions
+                       were modified to set these variables appropriately.
+                       Changed read_token to read the text of any pending
+                       here-documents just before it returns an unquoted
+                       newline to the parser.
+               make_cmd.c:
+                       moved the code that reads the text of the
+                       here-document out of make_redirection into a new
+                       function named make_here_document.  The cases in
+                       make_redirection don't do anything now; they just
+                       set the EOF marker and return
+               shell.c:
+                       added a wrapper function around yyparse called
+                       parse_command that initializes the above variables,
+                       calls parse_command, then makes the here-document
+                       if necessary by calling make_here_document (usually
+                       it doesn't need to; read_token has already done it).
+               builtins.c.posix:
+               builtins.c:
+                       changed the call to yyparse to a call to parse_command
+                       (in parse_and_execute)
+
+subst.c
+       - for some reason which I have not yet fully divined, a shell whose
+         standard output (file descriptor 1) is closed cannot perform
+         backquote substitution if the child closes both sides of the pipe
+         after dup2(fildes[1], 1).  The obvious fix is to not close 
+         fildes[0] in the child, but it's not intuitive.  I got the example
+         from the Dec Ultrix 4.0 release notes:
+
+               exec >&-
+               echo `echo hi` >&2
+
+         The 4.3 BSD sh has the same problem.  I'm stumped.
+
+         (LATER NOTE:  I'm not stumped anymore.)
+
+                                   12/2
+                                   ----
+shell.c
+       - shells started to execute scripts (`bash file') should set
+         remember_on_history and history_expansion to 0.
+       - redid maybe_execute_file to eliminate a possibly unnecessary
+         call to stat.  Just open the file immediately and call fstat
+         to get the size.  Return if the open fails.
+
+execute_cmd.c
+       - redid same_file to eliminate some calls to stat().  Added two
+         new parameters, which, if non-null, are pointers to status
+         information about the pathnames passed.  This required changes
+         to find_user_command_in_path.
+       - eliminated some calls to strlen in find_user_command_in_path
+
+builtins.c, builtins.c.posix
+       - changed calls to same_file to pass the two extra parameters
+
+parse.y
+       - only call pre_process_line in shell_getc if the shell is
+         interactive, because history expansion and remembering lines
+         on the history are not done for script shells
+       - make the shell echo comment lines (lines whose first character
+         is `#') by moving the after_pre_process label to just before 
+         that code
+       - eliminated several calls to xrealloc in shell_getc when the
+         shell is non-interactive by correcting confusing uses of
+         shell_input_line_size -- after pre_process_line is called, it
+         must be set to strlen(shell_input_line) because we don't know
+         what the `true' allocated size of that block is, but not if
+         pre_process_line is never called.  This became apparent
+         as a result of the previous two changes.
+
+readline/history.c
+       - make history_do_write abort on write errors instead of ignoring
+         them.
+
+                                   12/3
+                                   ----
+general.c
+       - defined bcopy in terms of memcpy for USG systems
+       - changed the USG getwd to return the result of getcwd
+
+                                   12/4
+                                   ----
+readline/vi_keymap.c, readline/funmap.c
+       - changed #ifdef FILE to #ifdef BUFSIZ as the test for a
+         previous inclusion of stdio.h
+
+general.c
+       - changed USG getwd emulation to return an error message in the
+         buffer if the getcwd fails
+
+subst.c
+       - fixed extern declaration of copy_word
+
+variables.c
+       - set_var_auto_export does a complete new lookup of the variable
+         it's setting.  Most of the time in initialize_shell_variables
+         it's called immediately after bind_variable or set_if_not on
+         the same variable.  Made set_if_not return a SHELL_VAR * like
+         bind_variable, then replaced the calls to set_var_auto_export
+         with calls to a new function set_auto_export that is passed a
+         SHELL_VAR * and skips the lookup.
+
+execute_cmd.c
+       - don't call print_simple_command in execute_simple_command if the
+         shell is not interactive, since the only place that's ever used
+         is pretty_print_job, which is never called if the shell is not
+         interactive.  This might need to be changed.
+
+                                   12/5
+                                   ----
+parse.y
+       - made read_token call atoi(3) instead of using sscanf("%d") when
+         reading numbers
+
+variables.c
+       - changed a call to sprintf in put_command_name_into_env into two
+         assignment statements and a call to strcpy
+
+variables.c
+       - changed a call to sprintf in make_var_array into two calls to
+         strcpy and an assignment statement
+
+execute_cmd.c
+       - only call geteuid() once in executable_file and cache the result
+
+general.h
+       - added definitions for STREQ and STREQN, which are replacements for
+         strcmp(a, b) == 0 and strncmp(a, b, n) == 0 that check the first
+         character to possibly save a function call.  From C News.
+
+variables.c
+       - changed add_or_supercede to use STREQN 
+
+parse.y
+       - changed most instances of strcmp() in read_token to use STREQ.
+         Rearranged some code to reduce the number of times this is called.
+         The idea is to rewrite code like
+
+               if ((this token is xx) && (certain conditions hold))
+
+         to be
+
+               if ((certain conditions hold) && (this token is xx))
+
+         to take advantage of left-to-right evaluation done by many (most?)
+         C compilers.
+
+subst.c
+       - changed instance of strcmp() in stupidly_hack_special_variables
+         to STREQ
+
+alias.c
+       - changed instance of strcmp() in find_alias to STREQ
+
+hash.c
+       - changed instance of strcmp() in find_hash_item to STREQ
+
+execute_cmd.c
+       - changed instance of strcmp() in find_shell_builtin to STREQ
+
+unwind_prot.c
+       - changed instance of strcmp() in unwind_frame_discard_internal
+         to STREQ
+
+                                   12/6
+                                   ----
+readline/readline.c
+       - In rl_complete_internal, when listing all completion possibilities,
+         if the length of the longest item to be listed is greater than the
+         screen width, a divide-by-0 exception can result.  Fix is to always
+         make sure `limit' is at least 1.
+
+                                   12/7
+                                   ----
+readline/readline.c
+       - Add a new #define, HAVE_BSD_SIGNALS.  This is for hybrid systems
+         like HP-UX (pre-Posix) that have both termio and the BSD reliable
+         signal mechanism (sigmask, sigblock, sigsetmask, etc.).  This
+         allows better use of `critical sections' when changing the terminal
+         parameters.
+
+readline/history.c
+       - Need to #include <fcntl.h> for System V.4
+
+makeargs.sh
+       - If we are on System V.4, define USGr4 and make it show through to
+         the rest of the build process
+
+machines.h
+       - changed the i386 entry to add support for recognizing System V.4
+         machines
+
+                                   12/8
+                                   ----
+shell.c
+       - made the TMOUT code be executed only for interactive shells
+       - .bashrc should not be run if the standard input and standard
+         output are not ttys
+
+machines.h
+       - reorganized the `i386' section so that all defines for a single
+         machine/OS combination are now grouped
+
+                                   12/9
+                                   ----
+shell.c
+       - make the -s flag force interactive use only if all the other
+         conditions for interactive use are met
+       - since the same conditions are used to mark the shell as
+         interactive and to decide whether or not to execute the .bashrc,
+         only execute the .bashrc if we are interactive, and use the
+         value of `interactive' in the test
+       - only test if `file' in `bash file' is a binary file if the file
+         descriptor obtained by opening it is not a tty.  An argument of
+         /dev/fd/xx is always a tty, and we can't read on it and seek
+         back to the beginning.
+
+variables.c
+       - replaced the random number generator functions with the simple
+         linear congruential generator from the ANSI C standard
+
+                                   12/10
+                                   -----
+machines.h
+       - added new defines: HAVE_MULTIPLE_GROUPS for systems that allow
+         multiple simultaneous group membership and support getgroups(2),
+         and HAVE_RESOURCE for systems that define struct rusage and
+         have getrlimit(2) and setrlimit(2)
+
+execute_cmd.c
+       - changed executable_file and group_member to obey the new
+         HAVE_MULTIPLE_GROUPS define
+
+ulimit.c
+       - allow the full range of options for systems that define
+         HAVE_RESOURCE
+
+builtins.c, builtins.c.posix
+       - make systems that have HAVE_RESOURCE defined use the getrusage
+         code in times_builtin
+
+                                   12/11
+                                   -----
+cpp-Makefile
+       - make ulimit.o dependent on `psize' so that psize can use 
+         the same #ifdefs and #defines as the rest of the code
+
+psize.c
+       - added definition of memset for those machines that don't have
+         it
+
+psize.sh
+       - removed the compilation of psize.c
+
+shell.c
+       - save and restore the SIGALRM catcher around the TMOUT code in
+         read_command, in case it's trapped
+
+trap.c, execute_cmd.c, shell.c
+       - redid the way traps were done slightly.  Now, instead of calling
+         parse_and_execute out of a signal handler (!), the signal handler
+         just sets a flag that the rest of the code checks at appropriate
+         times.  This means traps are kind of like interrupts, but serviced
+         far fewer times.  It also means a bit of a loss of immediacy.
+
+                                   12/12
+                                   -----
+
+shell.c
+       - fixed a bug in read_command that caused the handler for SIGALRM
+         to be reset to garbage each time through.
+
+variables.c
+       - change makunbound to call stupidly_hack_special_variables so
+         that things like `noclobber' and such can be reset properly
+         on function exit or when a `special' variable is unset.
+
+                                   12/14
+                                   -----
+parse.y
+       - made `<>' without a number specifying the file descriptor open
+         the named file for both standard input and standard output.
+
+cpp-Makefile, jobs.h, endian.c, endian.h, endian.sh
+       - made jobs.h include a file `endian.h' if NO_WAIT_H is defined.
+         This file defines either BIG_ENDIAN or LITTLE_ENDIAN, and is
+         automatically generated by `endian' and `endian.sh'.
+
+execute_cmd.c
+       - aa && bb & was being executed incorrectly -- the subshell was
+         not being forced for the `aa && bb' portion.  Same for aa || bb &.
+         Of course, if the sh `grammar' was regular `aa && bb &' would
+         be treated the same way as `aa ; bb &'.
+
+cpp-Makefile, psize.sh, ulimit.c
+       - changed the `psize' stuff so that ulimit.c includes a file
+         `pipesize.h', which contains a #define for PIPESIZE.
+         pipesize.h depends on psize, which is still made via the standard
+         `make' rules.  It's exactly like the `endian' stuff.
+
+parse.y
+       - pre_process_line can return NULL, so we have to take that into
+         account in shell_getc
+
+glob.c
+       - fixed glob_pattern_p to only return TRUE for a pattern containing
+         a `[' if there is at least one `]' to match it.  It produces wrong
+         results if allow_null_glob_expansion is set, and is inefficient
+         otherwise (wasted calls to glob_filename).
+
+         For instance, if some twisted soul sets allow_null_glob_expansion,
+         the following would produce an error without this fix:
+
+               if [ a = a ] ; then echo hi ; fi
+
+                                   12/16
+                                   -----
+execute_cmd.c, parse.y, shell.h
+       - the `subshell bit' in the command struct is being used for two
+         purposes: to signal that the user requested that this command be
+         done in a subshell via `()' and to force some portions of a
+         command to be executed in a subshell, like `{ xx } &'.  We need
+         to differentiate between the two so that the command printed when
+         reporting job status is correct and so the code is clearer.
+
+         Define two `states' for that value, if non-zero: WANT_SUBSHELL is
+         used when the user requests a subshell, and FORCE_SUBSHELL is used
+         internally by the command execution code.
+
+parse.y
+       - clean up some casts, and make sure function arguments are coerced
+         to the correct type
+
+subst.c
+       - comment out some unnecessary `break' statements in case statement
+         clauses that immediately follow `goto' statements.  It makes the
+         compilation output cleaner on a compiler that complains about such
+         things, like the IBM/4.3 compiler (High-C).
+
+make_cmd.c
+       - move all the error reporting code to the end of the file, so that
+         picky compilers that like to report about mismatches in the number
+         of arguments won't complain about the varargs code.
+       - it's not allows to pass a va_list from one function to another, so
+         expand the body of fatal_error to be the same as report_error in
+         the varargs case
+
+                                   12/17
+                                   -----
+readline/readline.c
+       - Use TCXONC in rl_restart_output, if it's defined.
+
+make_cmd.c, builtins.c, builtins.c.posix, shell.c
+       - Make all the non-varargs versions of the various error reporting
+         functions take 5 arguments
+
+                                   12/18
+                                   -----
+builtins.c, builtins.c.posix
+       - made the builtins that accept option arguments report errors when
+         they get a bad option, and make these error messages consistent.
+         The builtins affected are: export, hash, history, read, readonly,
+         dirs, jobs, declare, typeset, local, and type.
+
+shell.c
+       - make the function that displays the version number of the shell
+         indicate that it's the CWRU version.
+
+readline/readline.c
+       - On machines without BSD signals, do a signal(SIGINT, SIG_IGN) in
+         rl_signal_handler if an interrupt is received.  This will take
+         the place of blocking it while in the handler.
+
+jobs.c, jobs.c.posix
+       - change the setting of the job control signals SIGTSTP, SIGTTOU,
+         and SIGTTIN to SIG_DFL in make_child when job control is not
+         active
+
+                                   12/19
+                                   -----
+builtins.c, builtins.c.posix
+       - corrected some spelling errors and other mistakes in the help
+         documentation
+
+readline/readline.c
+       - Made the inclusion of sys/ptem.h dependent on the definition of
+         USGr4
+
+                                   12/20
+                                   -----
+machines.h
+       - Added -DUSGr4 to SYSDEP_CFLAGS in the System V.4 machines.h entry
+         for the i386 so it will get passed to readline.
+       - new entry for Ardent Titan
+
+                                   12/22
+                                   -----
+general.c
+       - added two new functions to print time values in a standard way:
+         print_timeval, which prints the contents of a struct timeval,
+         and print_time_in_hz, which prints a time_t scaled by the value
+         of HZ (which is system-dependent).
+
+builtins.c, builtins.c.posix
+       - made times_builtin call the new functions for printing time
+
+                                   12/30
+                                   -----
+general.h
+       - made the definition of `sighandler' as `void' or `int' depend
+         on the definition of VOID_SIGHANDLER; provide the definition
+         for those systems already using that code
+
+machines.h
+       - new entry for AIX/PS2 1.2
+
+                                   12/31
+                                   -----
+mailcheck.c
+       - When reporting that a mail file has been read, take into account
+         changes in the file size as well, and only report the change if
+         the file has gotten larger.  This help for systems like USG that
+         don't change the access time of /usr/mail/$USER to be the same
+         as the modification time after the mail in the file is manipulated.
+
+                                    1/2
+                                    ---
+builtins.c, builtins.c.posix
+       - the `command' builtin should not reparse its arguments; it screws
+         up quoting (consider "command echo 'foo &'"), so instead of making
+         a string and calling parse_and_execute, make a new simple command
+         struct, put the arguments to `command' in it as its words, and
+         call execute_command recursively.
+       - added a correct extern declaration for copy_word_list () in
+         remember_args
+
+make_cmd.c
+       - new function: make_bare_simple_command() to support the changes to
+         the command builtin
+
+                                    1/3
+                                    ---
+builtins.c.posix, jobs.c.posix, jobs.h.posix
+       - renamed these to be `.px' to help out systems with short file names
+
+CWRU.changelog, CWRU.changelog.v2
+       - renamed these to CWRU.chlog and CWRU.chlog.v2 for the same reason
+
+longest_signal_desc.c
+       - renamed to longest_sig.c
+
+enable-posix
+       - changed to recognize and use the `.px' suffix
+
+termcap/termcap.texinfo
+       - renamed to termcap.tex
+
+makeargs.sh
+       - change instance of `uuname' to `uuname -l' for compatibility with
+         more systems
+       - look for uuname in /bin as well as /usr/bin
+
+cpp-Makefile
+       - always define HAVE_ALLOCA if HAVE_GCC is defined
+
+bashline.c
+       - declare functions referred to in several places at the start of
+         the file
+
+jobs.c, jobs.c.px
+       - signal handlers should take one argument to be portable
+
+jobs.c.px
+       - hack around SCO Unix broken sigsuspend() and the fact that it
+         can't do job control on /dev/tty
+
+variables.c
+       - add declaration for sbrand before it is used
+
+machines.h
+       - define USGr3 for generic System V.3 entry; it is used in
+         readline/readline.c to conditionally include sys/ptem.h for the
+         `struct winsize' definition.  I'm about to say screw it and
+         define one myself.
+
+readline/readline.c
+       - include sys/ptem.h for both system V.3 and V.4 (USGr3 and USGr4)
+
+                                    1/4
+                                    ---
+shell.h
+       - some USG systems have a definition for MAXPATHLEN, so only define
+         it if there is no existing definition
+
+bashline.c
+       - changed operate_and_get_next to realize when it is at the end of
+         the stifled history list and to adjust the history pointer to the
+         `next' line appropriately
+
+readline/history.c
+       - made three variables needed by the above change to bashline.c
+         public: history_stifled, max_input_history, and history_length
+
+parse.y
+       - reset last_read_token and current_token in handle_eof_input_unit
+         so that an alias expansion on the next command entered will be
+         handled correctly.  If these are not reset, last_read_token ends
+         up being `yacc_EOF', which is not something that that will cause
+         command_token_position to return TRUE.
+
+                                    1/7
+                                    ---
+execute_cmd.c
+       - changed the test for matching jobs when testing for auto-resume
+         to make `exact' work as documented
+
+builtins.c, builtins.c.px
+       - Change exit_builtin so an interactive shell prints a message
+         when it exits: `logout' if it is a login shell, `exit' otherwise
+
+general.c
+       - include <sys/time.h> and compile in print_timeval if HAVE_RESOURCE
+         is defined
+
+readline/readline.c, readline/readline.h, bashline.c
+       - added a new readline function to call on filename completion, after
+         the match list has been generated:
+         rl_filename_completion_ignore_function().
+         It gets to munge the list of matches to its satisfaction.  It is
+         used to implement FIGNORE, a colon-separated list of filename
+         suffixes to ignore when doing filename completion
+
+jobs.c, jobs.c.px
+       - rewrote pretty_print_job to fix this bug:
+
+               thor$ { sleep 2 ; exit 1 ;} | sleep 10 &
+               [1] 11854
+               thor$ j
+               [1]+  Running                 { sleep 2; exit 1 } | sleep 10 &
+               thor$ j
+               [1]+  Exit 1                  { sleep 2; exit 1 } | sleep 10 &
+               thor$
+               [1]+  Exit 1                  { sleep 2; exit 1 } | sleep 10
+               thor$ echo $?
+               0
+
+         (since it's the exit status of the last job in the pipeline that
+         bash cares about, make it the one whose status is displayed.)  Also,
+         print "Running" if any processes in the job are still running,
+         instead of the status of the process group leader.  The code was
+         rearranged a bit as well.
+
+                                    1/8
+                                    ---
+fc.c
+       - changed fc_replhist to call history_get with a parameter offset by
+         history_base, like it should have been in the first place
+
+execute_cmd.c
+       - call dispose_used_env_vars () after any call to
+         execute_simple_command, because the temporary environment should be
+         in force only for the simple command immediately following it.
+         This fixes the
+               a=c printenv a | printenv a
+         bug, which should print nothing, but used to print `c'.
+       - added form feed ('\f') to the list of acceptable control characters
+         in check_binary_file
+
+                                    1/9
+                                    ---
+make_cmd.c
+       - fix to make_simple_command to make <> work.  We need to follow the
+         chain of redirections passed as element.redirect to the end, since
+         there might be more than a single redirection there.
+
+                                   1/14
+                                   ----
+machines.h
+        - redid the DEC, Mips, and Sony entries to get rid of the individual
+          MIPSEL and MIPSEB entries.  The goal is to isolate everything into
+          manufacturer-specific blocks.
+
+                                   1/18
+                                   ----
+builtins.c, builtins.c.px
+       - added call to QUIT to history_builtin, to allow the display of
+         history entries to be interruptible
+
+variables.c
+       - made find_variable return the dynamic value for a variable only
+         if this variable is in the current context.  This is to avoid
+         an `extra' value of RANDOM, for instance, being `wasted' in the
+         call to find_variable in make_local_variable
+
+execute_cmd.c, builtins.c, builtins.c.px, shell.h
+       - changed the bitmap holding the file descriptors to be closed in
+         the child to be a structure holding a bitmap and a size, rather
+         than use a char * bitmap with a fixed size, which will inevitably
+         be too small.  You'd probably run out of processes before you
+         ran out of file descriptors, though.  Pipe errors now call
+         throw_to_top_level () rather than return an error, because it's
+         no use continuing with the current pipeline.  Not doing so can
+         cause a call to wait_for () for the remainder of the pipeline,
+         which is just going to sit there in a stopped state with no user
+         feedback.
+
+                                   1/20
+                                   ----
+subst.c
+       - increased the amount of memory allocated when adding a number to
+         the string currently being expanded from 10 to 16.  10 characters
+         will not hold the result of 32767 * 32767, for instance.  16
+         should be plenty, but 32 would be better.
+
+                                   1/21
+                                   ----
+bashline.c
+       - added a new emacs-mode readline command to display the shell version
+         (kind of like Korn's C-V, but it displays on a separate line).  It's
+         on C-X C-V.
+
+                                   1/22
+                                   ----
+shell.c
+       - make termination_unwind_protect save the history only for an
+         interactive shell
+       - consolidated the loading and saving of the history file into
+         two functions: load_history () and save_history ()
+       - changed the history writing behavior so that interactive shells
+         will always try to append the history from the current session
+         to this history file instead of rewriting it every time.
+
+                                   1/23
+                                   ----
+general.h
+       - Posix systems have void signal handlers
+
+ulimit.c, ulimit.c.new, jobs.c.px, jobs.c, general.c
+       - moved the getdtablesize() emulation for non-BSD systems to
+         general.c, removing the private copies held by jobs.c.px, jobs.c,
+         ulimit.c, and ulimit.c.new
+
+execute_cmd.c, general.c
+       - replaced all references to NOFILE with references to
+         getdtablesize ()
+
+machines.h
+       - new entries for DG AViiON and Harris Nighthawk
+
+general.h
+       - split the replacement Posix stat definitions into their own
+         header file, `posixstat.h'
+
+test.c
+       - removed the Posix S_IS* macro definitions and added an include of
+         posixstat.h to pick them up
+
+general.c
+       - added an inclusion of posixstat.h for the replacement Posix stat
+         definitions
+
+posixstat.h
+       - this file should be included only after <sys/stat.h>
+       - some Posix-wannabe systems do not define the S_IS* macros, and
+         do not define the S_IF macros in favor of _S_IF* macros.
+
+shell.c
+       - make all signals in the terminating_signals array be conditionally
+         compiled it -- no signals are assumed to be present
+
+glob.c
+       - some Posix systems do not have a member d_ino in struct dirent.
+         Its use is now compiled out if _POSIX_SOURCE is defined.  I don't
+         think the check is necessary anyway; isn't readdir guaranteed to
+         return only active directory entries?
+
+cpp-Makefile
+       - added various entries for posixstat.h
+
+subst.c
+       - changed the code by add_number in expand_word_internal to call
+         itos() when translating an int to a string
+
+misc.c
+       - enlarged MAX_INT_LEN to 32
+
+                                   1/25
+                                   ----
+shell.c
+       - made bash, when invoked with the -c command option, save the rest
+         of the arguments as the positional parameters
+
+                                   1/29
+                                   ----
+
+misc.c
+       - made itos() handle negative numbers correctly
+
+posixstat.h
+       - include <sys/stat.h>, now can be included as a replacement for
+         stat.h
+
+builtins.c, builtins.c.px, execute_cmd.c, mailcheck.c, shell.c, test.c
+       - changed to include posixstat.h instead of <sys/stat.h>
+
+                                   1/30
+                                   ----
+
+lots of changes to nearly every file as the result of a merge with Brian's
+version of this code
+
+                                   1/31
+                                   ----
+
+parse.y
+       - correctly cast NULL pointer arguments passed to the command
+         construction functions in make_cmd.c
+
+test.c
+       - change uses of access(2) to call a new function eaccess(), which
+         performs a stat(2) call and checks the permission bits itself.
+         This means that root no longer finds that /etc/passwd is an
+         executable file.
+
+                                    2/3
+                                    ---
+test.c
+        - make eaccess() use group_member() from execute_cmd.c to test group
+          membership against all groups a user is in.  Do this if the system
+         supports multiple groups.
+
+                                    2/5
+                                    ---
+shell.c
+       - bash always executes .bashrc unless it's a login shell or acting
+         like sh.  Brian wants it this way.
+
+parse.y
+       - build a stack of tokens that have been alias expanded during a 
+         single call to read_token(), and use it to stop alias loops
+
+                                    2/6
+                                    ---
+make_cmd.c
+       - if redirection_expand returns NULL, it means that the word being
+         expanded expanded into multiple words.  In this case, abort the
+         here-document processing.  Specifically:
+
+               cat << $(date)
+
+         no longer dumps core calling strlen with a null argument.
+
+                                    2/8
+                                    ---
+readline/vi_mode.c
+       - some changes to rl_vi_eWord to make completion on `*' work
+         right
+
+builtins.c, builtins.c.px
+       - made history_builtin add a newline at the end of the history
+         expansions done when the -s option is specified
+
+                                    2/9
+                                    ---
+
+variables.c
+       - backed out of 1/18 change to find_variable().  It has the effect
+        of making this function always return the same value:
+
+              rand()
+              {
+                      echo $RANDOM
+              }
+
+                                  2/10
+                                  ----
+parse.y
+       - save the value of eof_encountered around execution of
+         PROMPT_COMMAND, otherwise ignoreeof will not work
+
+documentation/bash.1
+       - Add descriptions of the keybindings to go from emacs editing mode
+         to vi and vice versa
+
+                                  2/11
+                                  ----
+shell.c
+       - added tests for running shell scripts and for stdin being a tty
+         to the test for reading and executing .bashrc.  This means that
+         bash -c command still runs .bashrc (that's next :-).
+
+parse.y
+       - added test for interactive to disable alias expansion for
+         non-interactive shells
+
+builtins.c, builtins.c.px
+       - history -s is now gone
+
+                                   2/12
+                                   ----
+shell.c
+       - implemented a better (hopefully the final) test for executing
+         ~/.bashrc at shell startup
+
+general.c
+       - made dup2() emulation better, based on ideas from Usenet
+
+fc.c
+       - made fc_gethnum treat 0 the same as a negative number (an offset
+         from the current command number) so that fc -l -30 0 works
+         correctly
+       - make sure history_base is ignored in all calculations, but use it
+         when reporting the command number with the -l flag
+       - make `last' default to the current command when the -l flag is
+         given so that fc -l -20 works as it does in ksh
+
+                                   2/20
+                                   ----
+
+Many changes from a merge with bfox's version 1.07
+
+                                     2/25
+                                     ----
+
+jobs.c.px, jobs.h.px, builtins.c.px
+       - These files are no more, having been merged with jobs.c, jobs.h
+         and builtins.c
+
+jobs.c, jobs.h, builtins.c, shell.c, make_cmd.c, subst.c, execute_cmd.c,
+nojobs.c
+       - Adopted pid_t and WAIT_T as `native' types
+       - Propagated pid_t definition around to all necessary files
+
+readline/readline.c
+       - Some systems need the USG code without being USG (like HPUX and
+         AIX, for instance)
+
+                                     2/27
+                                     ----
+
+fc.c
+       - fixed up a few remaining bugs
+       - added code that lets options be grouped behind a single `-'
+       - added fencepost code that prevents overflow errors
+
+Another merge with Brian's almost-1.07
+
+                                    3/1
+                                    ---
+
+A final merge with Brian's 1.07
+
+                                     3/2
+                                     ---
+
+execute_cmd.c
+       - fixed a problem with asynchronous commands started from `.'
+         scripts (run with parse_and_execute) being waited for
+         inappropriately on systems without job control.  For example,
+         `. foo' where foo contains
+
+               . bar
+               echo bar done
+
+         and bar contains
+
+               sleep 300 &
+               sleep 300 &
+
+         would not echo `bar done' until 5 minutes had passed and both
+         `sleep' processes had exited.  Badness.
+
+nojobs.c
+       - fixed up so that bash can be built without job control on BSD
+         systems -- God forbid.
+
+                                    3/7
+                                    ---
+
+jobs.c
+       - Added code to initialize_jobs () to handle the broken NeXT 2.0
+         rlogind, which starts bash so that the terminal still belongs
+         to the rlogind process and getpgrp () returns 0 (?).  Looks like
+         a setpgrp(0, 0) is being done somewhere, and NeXT is not handling
+         it like 4.3 BSD does.
+
+                                   3/11
+                                   ----
+shell.c
+       - $0 is now initialized to `bash' for interactive shells when there
+         is no argv[0]
+
+                                   3/12
+                                   ----
+
+jobs.c
+       - Make set_new_line_discipline return 0 when on a termio system
+         without NTTYDISC defined (like HP/UX 6.x)
+
+                                   3/13
+                                   ----
+                     BASELINE FOR NETWORK WIDE RELEASE
diff --git a/CWRU/old-changelogs/CWRU.chlog.v4 b/CWRU/old-changelogs/CWRU.chlog.v4
new file mode 100644 (file)
index 0000000..dade714
--- /dev/null
@@ -0,0 +1,234 @@
+This file documents changes to CWRU bash following its first network-wide
+release.
+
+                                   3/15
+                                   ----
+Makefile
+       - change the declaration of $CPP_ARGS so that CPP_CC can have
+         embedded blanks, by adding quotes
+
+bashline.c
+       - some cosmetic changes to the FIGNORE support functions
+
+glob.c
+       - don't define USGr3 if it's already defined
+
+variables.c
+       - a declaration for the argument to put_command_name_into_env was
+         missing
+
+builtins.c
+       - only print the command name in builtin_error if this_command_name
+         is non-null
+
+expr.c
+       - catch something % 0 as an error
+
+subst.c
+       - make sure this_command_name is set to NULL before calling evalexp,
+         because evalexp uses builtin_error
+
+                                   3/18
+                                   ----
+
+variables.c
+       - changed getenv() to search the inherited environment if the hash
+         table of shell variables does not exist or has not been created
+
+                                   3/19
+                                   ----
+
+subst.c
+       - when doing command substitution, strip only the trailing newlines.
+         This is in accordance with Posix.2.
+
+general.c
+       - strip_trailing () has aquired a new flag telling whether to strip
+         all white space or just trailing newlines.
+
+variables.c
+       - since some places in the code rely on bind_variable returning a
+         valid value, the dynamic variable assignment functions have been
+         changed to take a pointer to themselves as the first parameter:
+
+               return ((*(entry->assign_func)) (entry, value));
+
+         and then return that value after doing whatever they need to
+
+                                     3/30
+                                     ----
+
+bashline.c
+       - disabled builtin commands should not be returned to the readline
+         completion functions as legal command alternatives
+
+flags.c
+       - do not redefine NULL; check only after including all needed
+         .h files
+
+nojobs.c
+       - fix unconditional reference to status.w_*
+       - fix typo after call to WIFCORED in wait_for
+
+readline/readline.c
+       - make sure all calls to BSD signal mechanism are protected by test
+         for HAVE_BSD_SIGNALS define
+       - make sure declaration of struct ltchars variable is protected by
+         test for definition of TIOCGLTC
+       - change #include file from sys/errno.h to errno.h
+       - added a new function rl_stop_output (), the non-emacs version of
+         ^S, to go with rl_restart_output.  Haven't done anything with it
+         yet.
+       - added Posix support in the form of tcflow() calls to 
+         rl_restart_output and rl_stop_output
+
+readline/readline.h
+       - change the declaration of rl_filename_completion_ignore_function
+         to extern.  It was coming up as multiply defined on some systems
+
+siglist.c
+       - change #include file from sys/signal.h to signal.h
+       - some systems define _NSIG but not NSIG.  Define NSIG in terms of
+         _NSIG on those systems
+
+ulimit.c
+       - change #include file from sys/errno.h to errno.h
+
+subst.c
+       - string_extract_double_quoted() needs to ignore "" inside `` pair,
+         but this code should be executed only if the ` is not backslash-
+         escaped.
+       - changed sv_uids() to give UID, EUID the integer attribute
+         automatically
+
+machines.h
+       - check for the DG AViiON defining either __DGUX__ or DGUX, make
+         sure DGUX is defined in any case
+
+trap.c
+       - change run_pending_traps to loop from 1 to NSIG instead of 0 to
+         NSIG
+
+execute_cmd.c
+       - For a command run explicitly in a subshell via (), run_exit_trap ()
+         needs to be called after that command has executed for /bin/sh
+         compatibility
+
+variables.c
+       - make $PPID have the integer attribute when it is intialized
+
+                                    4/2
+                                    ---
+
+subst.c
+       - make string_extract_double_quoted handle backslash-escaped
+         ` correctly when parsing a `` pair
+
+                                    4/3
+                                    ---
+
+jobs.c
+       - make sure job_control is set to 1 before the first time
+         give_terminal_to is called, so that it does its job and the
+         process groups are correct.
+
+subst.c
+       - make string_extract_double_quoted() not turn \\ into \ inside
+         quoted strings.  The translations will be taken care of later.
+
+nojobs.c
+       - make sure we get the tty state in initialize_jobs(), and don't
+         try to set it in set_tty_state until we know we have saved
+         valid settings.
+
+                                     4/6
+                                     ---
+
+shell.c, execute_cmd.c, shell.h
+       - shell now exits with status 127 when asked to execute a binary        
+         file as a shell script
+
+builtins.c
+       - `local' is once again an error outside a function
+       - `trap' now formats output differently when given no arguments;
+         the new format is suitable for feeding back to the shell as
+         input to `trap'
+       - cleaned up a contradiction in the help text for the `export'
+         builtin
+       - `export' and `readonly' now accept a -p flag for Posix.2 compliance
+         that acts the same as if no flags had been specified, and take a
+         `--' option to disable further option processing
+       - `unset' takes a `--' argument to disable further option
+         processing
+       - when given the -f flag, unset will now try to unset a variable
+         if no function is found for the name supplied
+       - `kill' now takes a -s signal argument as equivalent to -signal
+       - `kill' takes a `--' argument to disable further option processing,
+         since a negative number may be used to denote a process group
+       - `kill -l' now takes arguments and lists the names for individual
+         signals by number.  If the number given as argument is > 128, it
+         is assumed to be an exit status, and 128 is subtracted before
+         further processing
+
+builtins.c, variables.c
+       - `set +' is no more; print_vars_no_values() is no longer needed
+
+flags.c, builtins.c
+       - `set -C' is now an alias for noclobber
+
+trap.c
+       - SIGNULL is no longer a valid name for signal 0
+
+getopts.c, subst.c
+       - resetopts () --> getopts_reset ()
+       - rewrote getopt() per Brian's request
+
+builtins.c
+       - `return' is now valid when executing a file with the `.' builtin
+         and causes the execution to be aborted
+
+execute_cmd.c
+       - file descriptors > 2 manipulated via `exec' are no longer set to
+         close-on-exec
+
+                                    4/8
+                                    ---
+
+cpp-Makefile
+       - fixed the bad definition of RANLIB if RANLIB_LOCATION was defined
+       - pass the correct definition of ranlib through to the make of
+         readline
+
+readline/readline.c
+       - make sure some defaults for screen size are defined in the case
+         of a dumb terminal
+
+builtins.c
+       - `return' now works for aborting files executed with the `.'
+         builtin
+
+parse.y
+       - a `"' before a closing ) in a $( ) construct within double
+         quotes is no longer an error
+
+subst.c
+       - string_extract_double_quoted now passes everything between $(
+         and ) through verbatim, without scanning it for double quotes.
+         This way, `echo "$(echo "*")"' will echo `*' like it should.
+
+documentation/bash.1
+       - updated to reflect the changes from Posix.2 draft 11.
+
+                                   4/10
+                                   ----
+
+execute_cmd.c, builtins.c
+       - changed some instances of absolute_pathname to absolute_program
+         (like doing PATH, CDPATH searching, the `type' builtin,  and
+         filename hashing)
+
+readline/readline.c
+       - made rl_deprep_terminal do a little sanity checking on the
+         values in otio that it is restoring
+
+       Minor update of tar files available for FTP from CWRU
diff --git a/CWRU/old-changelogs/CWRU.chlog.v5 b/CWRU/old-changelogs/CWRU.chlog.v5
new file mode 100644 (file)
index 0000000..55b994c
--- /dev/null
@@ -0,0 +1,1492 @@
+
+                                  4/11
+                                  ----
+
+machines.h, general.c, cpp-Makefile
+       - wrapped the definition of strerror() inside a new machines.h
+         variable, HAVE_STRERROR
+
+machines.h
+       - new machine definition for the Encore series 91
+       - removed definitions of NO_WAIT_H; let makeargs.sh decide for us
+
+builtins.c
+       - the test used in cd_builtin () to decide whether or not to use
+         CDPATH was incorrect.  It now uses CDPATH unless the directory
+         name begins with a slash.
+
+cpp-Makefile, machines.h
+       - added SYSDEP_LDFLAGS for flags to ld, analogous to SYSDEP_CFLAGS
+
+                                  4/13
+                                  ----
+
+machines.h
+       - more changes to Encore entries from pierson@encore.com
+       - added -Wf,-XNl3072 to SYSDEP_CFLAGS for all machines that use the
+         MIPS chip and compilers.  This increases the maximum size of a
+         string constant, which some of the help strings in builtins.c
+         were exceeding
+
+jobs.c
+       - include trap.h only if JOB_CONTROL is defined, since nojobs.c
+         does not use its facilities
+
+                                    4/14
+                                    ----
+
+getopts.c
+       - changed error handling so that it obeys the Posix.2 draft 11 spec
+         (which is like ksh-88)
+
+                                  4/16
+                                  ----
+
+execute_cmd.c
+       - only run the exit trap in a subshell when command_subshell ==
+         USER_SUBSHELL, which means the user forced a subshell with ( )
+
+cpp-Makefile
+       - updated the dependency information
+
+quit.h
+       - changed the definition of throw_to_top_level to `extern' -- it
+         sometimes matters
+
+readline/vi_mode.c
+       - fix to make the vi-mode `b' command work when you type it twice
+         in a row
+
+                                  4/17
+                                  ----
+
+readline/vi_mode.c
+       - more fixes for vi `b' and `B' commands
+       - fixes for vi `w' and `W' commands
+       - fixed `_' command to yank the correct arg from the previous history
+         line
+
+readline/{vi_{mode,keymap}.c,readline.h}
+       - added a new function, rl_vi_fetch_history(), to implement the `G'
+         command.  It's not totally right, but it's better than having none
+         at all.
+
+                                  4/18
+                                  ----
+
+builtins.c
+       - only call the with_input_from_* functions in set_minus_o_option
+         if the shell is interactive when doing set -o emacs or set -o vi
+         (this prevents core dumps when doing a "set -o emacs" from a
+         startup file, because none of that stuff is initialized when the
+         startup files are run)
+
+bashline.c
+       - make sure all of the bindings are done to explicit keymaps, so
+         as to not randomly change the keymap the user has chosen with
+         a set -o in a .bashrc file.  The original ones all assumed the
+         current keymap was the emacs keymap, and this will screw up a
+         vi keymap seriously.
+
+readline.c
+       - .inputrc file parsing now recognizes the `$if mode=emacs' or
+         `$if mode=vi' construct in parser_if()
+
+trap.c
+       - make sure the jmp_buf stored in top_level is valid during the
+         execution of run_exit_trap, or we may jump off into never-never
+         land.
+
+         For example, consider a script that runs until it reads eof, and
+         has an exit trap set that contains a call to `exit'.
+         parse_and_execute will be called after reader_loop (and hence the
+         valid definition of top_level) is already off the stack and
+         invalid, and the longjmp in exit_builtin will seg fault.
+
+machines.h
+       - for MIPS machines in the BSD universe (-systype bsd), make sure
+         HAVE_UNISTD_H is undefined -- the compiler doesn't let us get to
+         it, even if it is there (wierd)
+
+config.h
+       - made the HELP_TEXT define that enables the inclusion of the huge
+         documentation strings for builtins a configurable parameter defined
+         here.  It's undefined by default, which means the long text is
+         not compiled in.
+
+general.c
+       - rewrote strip_trailing() to make it handle all cases where the
+         entire string should be stripped (e.g. "\n\n\n\n" when newlines
+         only are to be stripped)
+
+subst.c
+       - quoted results of command substitutions should have trailing
+         newlines stripped, not just the last newline as it was doing
+
+builtins.c
+       - aliases are no longer required to be legal identifiers, as
+         defined by Posix.2.  This originally came from 1003.2a,
+         draft 5, but I think it's on its way out
+
+                                  4/19
+                                  ----
+
+shell.c
+       - fixed a typo in the code that decides whether or not to source
+         ~/.bashrc, so now it sources it when we expect it to (no more
+         sourcing .bashrc for `echo ls | bash').  It was a misplaced
+         paren.
+
+parse.y, subst.c
+       - when parsing and evaluating $() and $[] constructs, bash needs
+         to take into account instances of `(' and `[' respectively
+         inside the delimiting characters and adjust the number of closing
+         parens or brackets that need to be read before the construct is
+         complete.  This is so things like $( (pwd) ) or $((pwd)) will
+         work as expected.
+
+                                    4/21
+                                    ----
+parse.y
+       - consolidated two grammar rules for `function f { echo foo; }'
+         into one -- there was no real difference between the two
+
+variables.c
+       - deleted inclusion of version.h.  It was not used.
+
+cpp-Makefile
+       - removed dependence of variables.o on version.h.  This caused
+         variables.c to be unnecessarily recompiled each time
+         version.h changed.
+
+trap.h
+       - changed the definition of IGNORE_SIG to be SIG_IGN, because
+         defining it as 0 made it the same as SIG_DFL, and hence
+         DEFAULT_SIG
+
+jobs.c, nojobs.c
+       - changed the restoration of signals altered by traps to be
+         after SIGINT, SIGQUIT, and SIGTERM are restored to their
+         default state so that ignored signals remain ignored in
+         children
+
+jobs.c
+       - SIGINT and SIGQUIT should be ignored by default for asynchronous
+         children
+       - changed all calls to signal (s, SIG_DFL) in make_child for SIGINT,
+         SIGQUIT, and SIGTERM to call restore_default_signal() instead
+         (which should really be called restore_original_signal()), because
+         what you really want is for children to have the values for these
+         signals that the shell started with.
+
+trap.c
+       - make sure signals set to be ignored in the shell are set to SIG_IGN
+         in the child by calling ignore_signal in restore_original_signals()
+       - make the loop that records the original values of the signals for
+         the shell in initialize_traps() run from 1 to NSIG-1
+
+                                  4/22
+                                  ----
+
+shell.c
+       - make sure the `i' flag is turned on (so that it appears in $-)
+         before the startup scripts are run
+
+                                  4/23
+                                  ----
+
+general.c
+       - changed pathname_backup to not back up past the start of the
+         path it is passed looking for a `/'.  It causes core dumps on
+         a lot of systems.
+
+config.h
+       - Ultrix does dup2() wrong, so make it use the dup2() emulation
+         implemented with fcntl() by making sure NO_DUP2 is defined
+
+jobs.c
+       - fixed a posix race condition by making the first process in a
+         pipeline wait for all of the processes to be created and have
+         their process group set correctly before returning from
+         make_child().  The synchronization is done around a shared pipe.
+       - added a function close_pgrp_pipe() that other files can call to
+         have the pgrp pipe closed for them
+
+subst.c
+       - added call to close_pgrp_pipe from the parent half of the command
+         substitution code, since this code will not call start_pipeline
+         or stop_pipeline.  Otherwise the child waits forever trying to
+         read the pipe.
+
+readline/vi_mode.c
+       - more changes to the vi mode code, this time to rl_vi_eWord for the
+         `E' command
+
+                                  4/24
+                                  ----
+
+execute_cmd.c
+       - only restart an auto-resume job if the job is marked as JSTOPPED.
+         This fixes the `for i in 1 2 3; do who; done | sort' only running
+         `who' once bug.
+
+parse.y
+       - removed extern declarations of index(), rindex(); they should be
+         taken care of in general.h
+
+machines.h
+       - some changes to the mips and sgi entries
+
+readline/readline.c
+       - change rl_redisplay so DEL is echoed as C-?
+
+                                  4/25
+                                  ----
+
+makeargs.sh
+       - a new implementation from Brian
+
+jobs.h
+       - changed the sense of the test for the presence of sys/wait.h to
+         test HAVE_WAIT_H rather than NO_WAIT_H.  HAVE_WAIT_H is set by
+         makeargs.sh
+
+jobs.c
+       - don't bother calling tcsetpgrp() in give_terminal_to() if the
+         process group already owns the terminal
+
+test.c
+       - change eaccess() so that root requires execute permission for
+         anyone in order to be able to execute a file
+
+execute_cmd.c
+       - change executable_file() so that root can execute a file if any
+         of the u, g, o x-bits are turned on
+
+documentation/features.texinfo
+       - fixed a typo on line 352 ({ -> })
+
+documentation/bash.1
+       - some cosmetic changes to the manual page
+
+                                  4/26
+                                  ----
+
+parse.y
+       - made read_a_line handle a null character being returned from
+         yy_getc () in a reasonable fashion instead of falling out of
+         a loop and returning garbage to its caller
+
+                                  4/27
+                                  ----
+
+shell.c
+       - make the file descriptor from which we are reading the text of
+         a script be set to close-on-exec
+
+execute_cmd.c
+       - now that Ultrix uses the dup2() emulation in general.c, the code
+         that sets file descriptors to open-on-exec on Ultrix systems
+         can be disabled
+       - fixed up the test for root in executable_file()
+
+test.c
+       - fixed up the test for root in eaccess() so that root can read or
+         write any file, but only execute executable files
+
+                                    4/28
+                                    ----
+braces.c
+       - if the text between braces does not contain a comma, just return
+         the text with braces intact.  This is for greater /bin/sh
+         compatibility
+
+                                  4/29
+                                  ----
+
+bashline.c
+       - some changes from a merge with bfox bash-1.07
+
+execute_cmd.c
+       - added an extern declaration for make_command_string()
+
+general.c
+       - made itos() use unsigned arithmetic so that $[ 32768*65536] works
+         right
+
+                                  4/30
+                                  ----
+
+readline/readline.c
+       - fixed typo for sys5 termio version of rl_prep_terminal() that
+         called ioctl with the wrong number of parameters
+       - made readline handle SIGALRM and clean up after itself when
+         it hits
+
+ulimit.c, ulimit.c.new
+       - fixed up return value for -f on HP/UX -- the man page for
+         ulimit(2) lies about its return value
+
+makeargs.sh
+       - need to initialize SYSDEF and SHLIB so we don't pick up any
+         values from the environment
+
+readline/history.c
+       - fixed typo in `mode' argument in call to open(): 066 -> 0666
+
+builtins.c
+       - mark HP/UX as not having resources even though it has
+         /usr/include/sys/resource.h
+
+cpp-Makefile, Makefile, makeargs.sh, config.h
+       - changes from bfox bash-1.07
+
+machines.h, builtins.c, general.c
+       - changes for bfox port to cadmus
+
+posixstat.h
+       - added definitions for Posix file modes for those systems that do
+         not have them
+
+                                   5/1
+                                   ---
+
+subst.c
+       - added a function remove_quoted_nulls to do quote removal when we're
+         not doing word splitting.  It's called from expand_string_unsplit
+
+fc.c
+       - removed the code that handled EOF from fc_readline
+       - fixed possible memory leaks in fc_builtin (line returned from
+         fc_readline()) and fc_readline()
+       - fixed calls to builtin_error so they no longer include a literal
+         "fc" in the error string
+
+execute_cmd.c
+       - fixed execute_simple_command so that commands called from the
+         command builtin do not have arguments re-expanded by another
+         call to expand_words()
+
+readline/readline.c
+       - disable the ONLCR bit in the termio and termios version of
+         rl_prep_terminal so that pesky extra ^M is no longer sent
+
+readline/vi_mode.c
+       - fixed a typo that caused a test to be reversed in rl_vi_bword()
+
+                                   5/2
+                                   ---
+
+shell.c
+       - preserve leading `-' in argv[0] (and $0) when bash is invoked
+         this way.  Ensure that we do not infinitely recurse executing
+         .bash_profile if there is a shell script that bash executes or
+         a command substitution by incrementing shell_name past a leading
+         `-' when main() is invoked a second time.  Initialize $0 to
+         "bash" if it is null or equal to "-".
+
+builtins.c
+       - added symbolic mode printing and arguments (like chmod) to umask.
+         Now, "umask 002" and "umask a=rx,ug+w" are equivalent
+       - removed change to unset from Posix.2 draft 11; it is required to
+         use -f if trying to unset a function and it unsets a variable
+         otherwise
+
+bashline.c
+       - make sure display_shell_version leaves the cursor at column 0
+         before calling rl_on_new_line()
+
+                                   5/3
+                                   ---
+
+jobs.c
+       - defined a `unifying' way to get the process group of an arbitrary
+         process: getpgid(p).  Constructed a bunch of #defines to get it
+         defined correctly in terms of getpgrp().  Used in initialize_jobs
+
+execute_cmd.c
+       - converted a call to statmode & S_IFDIR (which was wrong in the
+         first place, should have been (statmode & S_IFMT) == S_IFDIR)
+         into a call to S_ISDIR (statmode) in executable_file
+       - for systems with broken (4.2 BSD-style) dup2() calls, which do
+         not set the new descriptor to be open across execs, define
+         DUP2_BROKEN and do the explicit setting ourselves.  Ordinarily,
+         setting NO_DUP2 and using the fcntl emulation is sufficient, but
+         on some systems (Sequent Dynix), fcntl(fd, F_DUPFD, fd2) is
+         broken this way, too.
+
+expr.c, fc.c
+       - make sure NULL is defined as 0, redefining it if necessary
+
+                                    5/3
+                                    ---
+
+execute_cmd.c
+       - in execute_case_command(), make sure we call expand_word on the
+         case statement pattern with quoting set to Q_KEEP_BACKSLASH, so
+         backslashes are not treated specially depending on the character
+         that follows them.  Here's the comment from the relevant section
+         of the code:
+
+         /* expand_word calls expand_word_internal, then performs word
+            splitting and dequotes the result.  This causes parameter
+            expansion, command substitution, arithmetic expansion, and
+            quote removal to occur.  What we *really* want is only
+            parameter expansion and " and ' removal.  Calling expand_word
+            with Q_KEEP_BACKSLASH is the way to do part of this.  The
+            command substitution part is still done, but that's OK. */
+
+subst.c
+       - break the command substitution code off into its own function,
+         command_substitute()
+
+shell.h, subst.c, execute_cmd.c
+       - enumerated the possible values for the `quoted' argument to the
+         expansion functions: Q_DOUBLE_QUOTES, which means expand as if
+         the string were in double quotes, Q_HERE_DOCUMENT, which means
+         expand the string according to the rules for expanding here-
+         documents, and Q_KEEP_BACKSLASH, which means to not treat back-
+         slashes specially at all.
+
+readline/vi_keymap.c
+       - bound `*', `=', and `\' in the vi movement keymap to rl_vi_complete
+
+readline/vi_mode.c
+       - If the command is cw or cW, we don't want whitespace after the
+         end of the word eaten, so change the w or W to e or E,
+         respectively
+       - made rl_vi_complete handle all three kinds of vi_mode completion
+       - changed rl_vi_char_search to check boundary conditions and avoid
+         going off the end or start of the current line searching for a 
+         character
+       - changed rl_vi_domove to implement the `yy' command
+
+                                   5/6
+                                   ---
+subst.c
+       - check the return value from expand_string_internal in
+         expand_string_unsplit; make sure we don't try to dereference a
+         null value
+
+machines.h
+       - new entry for NCR tower 32 running System V.3
+       - changes to IBM AIX entries
+
+               Changes from a merge with bfox 1.07 sources
+
+                                   5/7
+                                   ---
+
+cpp-Makefile
+       - take out some explicit `touch' commands that are taken care of
+         by the dependencies
+       - added the files created in the build process (endian, psize,
+         sysdefs) to the `make clean' target
+
+nojobs.c
+       - don't print a message if a command was terminated by SIGINT
+       - removed the call to QUIT from wait_for; the builtin `wait'
+         command does not go through this function
+       - added siginterrupt calls so we can run this on a 4.2+ BSD
+         system without job control and interrupt `wait'
+
+Makefile
+       - make the command to run to remove runs of blank lines from the
+         cpp output configurable (`cat -s' means nothing on System V;
+         there are some alternatives: ssp on HP/UX, for example)
+
+                                   5/8
+                                   ---
+test.c
+       - added a `posixtest()' function that implements a proposal to the
+         Posix.2 shell working group by David Korn.  Broke the code that
+         handles unary and binary operators out into individual functions.
+         Added functions that will check whether a string is a valid test
+         unary or binary operator.
+       - changed eaccess so that the test for root and X_OK works for
+         both files and directories
+       - added a new unary operator, -a, which is true if its argument
+         simply exists in the file system
+
+shell.c
+       - changed the test for whether or not we are running under an emacs
+         shell buffer to test if TERM = "emacs", rather than for the
+         presence of the environment variable EMACS
+
+general.c
+       - added a function unset_nodelay_mode that will unset either flavor
+         of no-delay mode (O_NONBLOCK or O_NDELAY) for a given file
+         descriptor.  This is called from shell.c$main() for the standard
+         input.
+
+glob.c
+       - added code to check that a directory is really a directory before
+         calling opendir on it.  Some systems do not check, and core dump
+         in readdir() (e.g. MIPS)
+
+expr.c
+       - allow underscores in the names that the token reader recognizes
+         as variables
+       - set a maximum recursion level of 1024 calls to pushexp()
+
+builtins.c
+       - parse_and_execute has to setjmp (top_level) (saving the old value,
+         of course) so that bad substitutions and the like that call
+         (longjmp (top_level, DISCARD)) don't jump to the `real' top level,
+         which leaves input still coming from the string passed to
+         parse_and_execute, and sometimes core dumps
+
+shell.c
+       - made an option -- signal the end of the options list, as Posix
+         specifies
+
+getopt.c
+       - a slightly modified version of the GNU getopt().  The changes
+         are:
+               o the addition of a variable optopt, which holds the option
+                 character last processed
+               o The value of optarg is now specified in the case of
+                 return values: if an illegal option is given, optarg
+                 is NULL; if a required option argument is missing,
+                 optarg[0] == 0
+               o a function to programmatically set the option order that
+                 getopt will handle to the Posix option order:
+                 set_posix_option_order
+               o changed the error messages printed to be those that
+                 Posix.2 specifies
+
+getopts.c
+       - deleted private version of getopt()
+       - changes to work with the modified GNU getopt as described above
+
+                                   5/9
+                                   ---
+builtins.c
+       - added -v option to `unset'; changed it to comply with Hal
+         Jesperson's latest Posix.2 draft
+
+machines.h
+       - picked up a machine description for a 386 box running ISC 2.2 from
+         bfox
+       - add -DDUP2_BROKEN to the entries for Sequents running Dynix because
+         Dynix does not set the new file descriptor created with dup2() or
+         fcntl(fd, F_DUPFD, ...) to be open across execs
+
+make_cmd.c
+       - Make sure all the arguments to make_command are cast to the correct
+         values
+
+general.h, jobs.c, execute_cmd.c
+       - moved the definition of FD_CLOEXEC to general.h, which should be
+         included *after* <fcntl.h>
+
+shell.c
+       - timeouts should happen only when the shell is interactive, so just
+         move all the code in read_command that deals with it inside an
+         if (interactive) statement.
+       - changed message printed by show_shell_version to be that same as
+         that put into the $BASH_VERSION variable
+
+readline/readline.c
+       - don't destroy the value of the tty flags when trying to read with
+         O_NDELAY turned off in rl_gather_tyi()
+
+Makefile, squish.awk
+       - For systems that do not have a -s option to cat that compresses
+         runs of blank lines to a single blank line, there is an awk script
+         supplied that will do it
+
+parse.y
+       - made yy_stream_unget and yy_readline_unget return values, not
+         garbage
+
+                                  5/10
+                                  ----
+variables.c
+       - don't deallocate the old value in bind_variable until any needed
+         arithmetic evaluation has been done.  If we're performing an
+         assignment statment like `even=even+2' where even has the integer
+         attribute, we'll need the old value to evaluate the RHS
+
+shell.c
+       - make throw_to_top_level call bashline_reinitialize so all the
+         function pointers are restored to their correct values on an
+         interrupt (problem observed on a Sun running SunOS 4.1)
+
+                                    5/11
+                                    ----
+jobs.c
+       - replaced literal `bash:' in error messages with the name of the
+         shell, as given in shell_name
+
+                                  5/13
+                                  ----
+nojobs.c
+       - make sure the pid passed to wait_for is valid before calling
+         wait() by doing a kill(pid, 0)
+
+test.c
+       - test -e should return true if a file exists in the file system,
+         according to Posix.2.  Make it equivalent to -a, document it in
+         the man page and help text, and make -a undocumented
+       - all variables global to test.c should be declared as static
+         (e.g. test_exit_status, test_exit_buf)
+       - make test -f behave as Posix.2 mandates (file exists and is a
+         regular file) instead of trying to please both BSD and System V
+
+makeargs.sh
+       - if the file /etc/xlc.cfg exists and contains the string _IBMR2,
+         assume we're on an RS/6000 and define RISC6000
+
+builtins.c
+       - Print traps in trap_builtin only if trap_list[i] is neither of
+         DEFAULT_SIG or IGNORE_SIG
+
+jobs.c
+       - run trap on SIGCHLD only if it is neither of DEFAULT_SIG or
+         IGNORE_SIG
+
+trap.c
+       - make it an error if trap_handler catches a signal for which the
+         trap_list holds IGNORE_SIG or DEFAULT_SIG
+
+                                  5/14
+                                  ----
+
+execute_cmd.c
+       - make redirection_expand return (char *)NULL in the case where the
+         word expands to nothing
+
+jobs.c
+       - added two functions: terminate_stopped_jobs, which walks the job
+         list and sends SIGTERM and SIGCONT to each stopped job, and
+         hangup_all_jobs, which walks the job list and sends SIGHUP and,
+         if necessary, SIGCONT to all jobs
+
+shell.c
+       - added call to terminate_stopped_jobs() after reader_loop exits,
+         before the shell is about to exit
+       - added call to hangup_all_jobs if the shell receives a SIGHUP that
+         causes it to exit
+
+test.c
+       - removed remaining vestiges of the special-casing of the -f operator
+         between System V and BSD
+
+                                    5/18
+                                    ----
+
+builtins.c
+       - traps should be printed if trap_list[i] == IGNORE_SIG
+       - fixed a typo in fg_bg() that would cause a seg fault when
+         decode_job_spec returned DUP_JOB
+
+trap.c
+       - don't run a trap on EXIT if set to IGNORE_SIG
+
+shell.c
+       - the initialization of traps must be done before we initialize
+         signals, because the shell needs to know that values of signals
+         that it inherited from its parent
+
+execute_cmd.c
+       - broke all the stuff bash does after execve into a new function,
+         bash_execve, called exactly like execve.  If it returns, it
+         returns EXECUTION_FAILURE, so the execute_simple_command code can
+         just do exit (bash_execve (command, argv, envp))
+
+builtins.c
+       - made the exec builtin call bash_execve so executable shell scripts
+         can be the target of exec
+
+                                    5/19
+                                    ----
+subst.c
+       - added new functions that will perform quote removal only on
+         strings, WORD_DESCs, and WORD_LISTs.
+
+make_cmd.c
+       - quote removal is the only expansion that should be performed on
+         the delimiter of a here document, so call the new quote removal
+         functions in subst.c instead of redirection_expand()
+
+subst.c, shell.h
+       - changed expand_word_internal to do the right thing when given
+         a `quoted' argument of Q_KEEP_BACKSLASH; it means to preserve
+         backslashes unconditionally.
+
+         This causes a flag to be set inside expand_word_internal that it
+         passes to recursive invocations (like when expanding "string").
+         The values for the `quoted' argument have been changed to be
+         distinct bit values so that they can be masked and OR'd together.
+
+execute_cmd.c
+         execute_cmd.c now calls expand_word with an argument of 
+         Q_KEEP_BACKSLASH, so that only parameter expansions and "" and ''
+         removal are performed
+
+                                    5/22
+                                    ----
+
+                     Another big merge with bfox source
+
+builtins.c
+       - restore the original values of signals before calling bash_execve
+         in exec_builtin
+
+                                  5/23
+                                  ----
+test.c
+       - Brian's change to `unop' broke it -- the function now has an
+         integer passed to it, not a string of the form -x
+       - ! with 4 arguments should not fall through to the default case;
+         a `break' statement was missing
+
+config.h, machines.h, cpp-Makefile
+       - change NO_DUP2 to !HAVE_DUP2
+
+general.c
+       - change NO_DUP2 to !HAVE_DUP2
+       - add a call to SET_OPEN_ON_EXEC for the new file descriptor in our
+         dup2() emulation using fcntl
+
+execute_cmd.c
+       - removed the calls to SET_OPEN_ON_EXEC that were enabled by defining
+         DUP2_BROKEN; now undef HAVE_DUP2 and use the dup2 emulation in
+         general.c for those machines
+
+                                  5/24
+                                  ----
+subst.c
+       - Even if no expansion is performed in expand_word_internal, and
+         therefore no word splitting is done, the quoted null characters
+         still need to be removed from the WORD_LIST.  Add a new function
+         word_list_remove_quoted_nulls to do the removal for each element
+         of the list, and call it from expand_words_1
+
+bashline.c
+       - call tilde_expand on the returned $PATH components in
+         command_word_completion_function
+
+More fixes and changes from a merge with bfox's source
+
+                                    5/25
+                                    ----
+execute_cmd.c
+       - changed some `pid' declarations to be pid_t instead of int
+
+variables.c
+       - dollar_dollar_pid is still an int, so cast the return value
+         of getpid() when assigning to it
+
+                                  5/28
+                                  ----
+subst.c
+       - more quoted null character fixes -- {de,}quote_string needs to
+         handle quoted null strings, and list_string has to do the
+         right thing with them
+
+builtins.c, execute_cmd.c
+       - bash_execve -> shell_execve
+
+makeargs.sh
+       - typo fix: elc.cfg -> xlc.cfg
+
+cat-s
+       - change the length($0) == 0 to NF == 0 so that lines with only white
+         space are deleted as well as blank lines
+
+subst.c
+       - quote_string and dequote_string now return char * and allocate a
+         new string for the return value
+
+expr.c
+       - have evalexp() save and restore the old value of evalbuf around
+         possible recursive calls
+
+cpp-Makefile
+       - the failure of a `touch' command is no longer a fatal error
+
+readline/readline.c
+       - only try to use ONLCR if it is defined
+
+machines.h
+       - fixes to the AT&T 3B2 and IBM AIX (RT, 370) descriptions
+
+readline/vi_mode.c
+       - now `p' is allowed at the end of a line
+       - yank-to (yw, ye) yanked one-too-few characters -- fix in
+         rl_vi_yank_to
+       - `r' command should not advance the cursor to the right
+       - `cw' now works like ce (and cW like cE) in that the white space
+         after the deleted word is not deleted
+       - cw now deletes the last character on the line, when point is the
+         last character on the line when it is executed
+
+                                  5/29
+                                  ----
+subst.c
+       - fixed a seg fault when trying to do parameter substitution assignment
+         (${a=b}) with a null string:  ${UnDeFiNeD=`false`}
+
+machines.h
+       - new entry for Sequent Symmetry running Dynix/ptx (System V.3.2)
+
+builtins.c
+       - parse_and_execute needs to handle longjmp(top_level, EXITPROG)
+         (FORCE_EOF, too) by restoring the old value of top_level and
+         doing another longjmp.  This is needed so that an exit inside a
+         `.' script will actually exit the shell
+       - make `typeset -f foo' print the definition of the function foo,
+         if one exists.
+
+jobs.h
+       - defined NO_PID as -1, a value that cannot possibly be a pid
+
+jobs.c
+       - all pid and pgrp variables are initialized to (pid_t) NO_PID
+
+subst.c
+       - reorganized the ${} code into several functions
+       - make the brace-counting code that gathers the RHS of a ${}
+         parameter substitution use extract_delimited_string
+       - if no asynchronous commands have been executed, $! should echo
+         nothing
+       - make ${#} work like $#
+       - make ${#-foo} a bad substitution
+       - test for len_alt_opener == 0 in extract_delimited_string before
+         comparing the string with alt_opener
+       - ${special_var?} should echo the standard message ``parameter
+         null or not set''
+       - plugged some memory leaks -- memory was not freed before longjmp
+         calls after bad substitutions
+
+                                  5/30
+                                  ----
+
+subst.c
+       - more radical reorganization
+
+cpp-Makefile
+       - redid the dependencies so that it's no longer required to `touch'
+         a .h file if another .h file changes
+
+glob.c
+       - statbuf -> finfo
+
+readline/tilde.c
+       - new file that handles the tilde expansion for the shell and readline
+
+readline/readline.c
+       - tilde_expand removed from this file; now in tilde.c
+
+general.c
+       - new function tilde_initialize to initialize the tilde expansion
+         code
+       - bash_tilde_expand is now in general.c, since it should work even
+         if readline is turned off for some reason
+
+shell.c
+       - tilde_initialize called as part of shell initialization
+
+                                  5/31
+                                  ----
+
+parse.y
+       - aliases consisting entirely of digits are now allowed; simply
+         commented out the !all_digits test
+
+documentation/bash.1
+       - the PROMPTING section should make clear the difference between
+         \w and \W
+
+machines.h
+       - small fix to isc386 entry -- we still have alloca if we're using
+         gcc
+       - add -D_DGUX_SOURCE to the SYSDEP_CFLAGS for the DG/UX entries
+       - add -DNLS to the RS6000 SYSDEP_CFLAGS
+
+cppmagic.sh
+       - improved the test for gcc-cpp by also looking for the word
+         `recognized' in the error message
+
+readline/readline.c
+       - don't declare getpwuid() and getpwnam() if we're on an ISC 386
+         machine
+
+machines.h, posixstat.h, execute_cmd.c
+       - changes from Saul Lubkin for Posix bash on ISC 2.2
+
+                                   6/1
+                                   ---
+
+jobs.c
+       - make the behavior of jobs started when job control is not active
+         be the following:
+
+               if the shell is interactive, set SIGTSTP, SIGTTIN, and
+               SIGTTOU to SIG_IGN.  This way, typing ^Z to a running
+               process will not do anything
+
+               if the shell is  non-interactive, set SIGTSTP, SIGTTIN,
+               and SIGTTOU to SIG_DFL, so jobs started from scripts
+               will stop when the script shell gets a SIGTSTP
+
+         It might work to simply not change the values of the signals if
+         job_control == 0, since this is how they *should* be, but that
+         seems too chancy.
+
+execute_cmd.c
+       - make && and || constructs unstoppable, because there's no other
+         way to prevent the second process from executing immediately
+         if the first one is stopped (this is what ksh appears to do).
+         Make sure that we add an unwind_protect call to restore the
+         value of job_control if the command is interrupted.
+
+                                   6/3
+                                   ---
+
+subst.c
+       - tilde expansion should be performed if there is an unquoted tilde
+         anywhere in the word, so we can check for `=~' and `:~'
+
+                                   6/4
+                                   ---
+
+subst.c
+       - tilde expansion should be performed in do_assignment_internal
+         only if the `expand' argument is 1 and we do the other expansions
+       - pass the word to tilde_expand in expand_words_internal even if
+         its quoted bit (tlist->word->quoted) is set
+
+jobs.c
+       - make set_job_control return the old value of job_control, so you
+         can say `old_job_control = set_job_control (0);'
+
+unwind_prot.c
+       - added a structure to save the value of an integer variable.  Two
+         new functions use it: unwind_protect_var (&var) allocates this
+         structure, fills it in, then calls add_unwind_protect specifying
+         restore_variable as the function to execute.  restore_variable takes
+         this structure as an argument, restores the specified variable,
+         and frees the structure it gets
+
+builtins.c, execute_cmd.c
+       - changes to use unwind_protect_var to restore variables
+
+                                   6/5
+                                   ---
+
+readline/readline.c
+       - readline now enables 8-bit input by default for termio, termios
+         systems (c_iflag &= ~ISTRIP)
+
+shell.c, builtins.c
+       - special_source_interrupt was renamed to parse_and_execute_level
+
+builtins.c
+       - parse_and_execute now uses unwind-protects to clean up after itself,
+         allowing these to be run from another place in the code if necessary
+       - special_buf is no longer used as a cleanup mechanism
+       - new function parse_and_execute_cleanup that can be called from
+         anywhere that encapsulates all the necessary unwind protects for
+         parse_and_execute
+       - period_builtin now calls parse_and_execute_cleanup to have
+         parse_and_execute clean up if the `return' builtin is executed
+         while in the middle of a `.' command and not inside a function
+
+trap.c
+       - run_interrupt_trap now prevents recursive calls to itself by
+         making trap_list[SIGINT] null while it is executing
+
+shell.c
+       - reorganized throw_to_top_level: run_interrupt_trap is now called
+         as the first thing, and throw_to_top_level calls
+         parse_and_execute_cleanup to make parse_and_execute clean up
+         after itself
+
+subst.c
+       - fixed a bug caused by string_rest_of_args returning NULL, which
+         caused parameter_brace_expand_length to get a seg fault because
+         it didn't check the return value when expanding ${#*} with no
+         dollar variables
+
+machines.h
+       - fixed up the HP/UX entry.  HP/UX 7.0 and above (the Posix versions)
+         define __hpux to cpp, giving us a way to automatically tell the
+         difference between Posix and non-Posix implementations (whether or
+         not to link with -lBSD)
+
+trap.c
+       - save the value of last_command_exit_value while running the exit
+         trap.  This way any exit trap will not change the value of
+         `exit 5', for instance
+
+subst.c
+       - added a function unquoted_member (c, s), which behaves like
+         member but tests whether or not c occurs in an unquoted portion
+         of the string
+       - made the test for calling tilde expansion be
+               ((first character is a tilde) ||
+                (tilde appears && word not quoted) ||
+                (tilde appears && tilde is unquoted))
+         this uses unquoted_member (c, s)
+
+shell.c
+       - Xenix has the middle two arguments to setvbuf different from
+         every other implementation in the world.  Add #ifdef'd code
+
+machines.h
+       - the Xenix 386 definition has to have M_OS and SYSDEP_CFLAGS
+         undefined because they might have already been set if i386
+         is defined
+
+cpp-Makefile
+       - make the gcc line for making malloc.o include a -o $@, since we
+         know gcc can handle it
+
+builtins.c
+       - preserve the value of last_command_exit_value around the
+         execution of ~/.bash_logout
+
+                                   6/6
+                                   ---
+subst.c
+       - generalized unquoted_member to unquoted_substring, and changed
+         the tilde expansion tests to call unquoted_substring with the
+         full tilde prefixes as the substrings (:~, =~)
+
+builtins.c
+       - `read' now accepts a `--' argument to signal the end of the
+         options
+
+                                   6/7
+                                   ---
+documentation/bash.1
+       - added description of the `silent' error reporting mechanism of
+         getopts that is enabled when the first character of the option
+         string is a `:'
+       - added description of the new features of tilde expansion (:~
+         and =~)
+
+subst.c
+       - fixed sv_optind to call getopts_reset with the value of $OPTIND
+         rather than resetting it to 1
+
+getopt.c
+       - commented out the code executed when optind is reset to 0 that
+         decides on the option order.  We always want REQUIRE_ORDER
+
+getopts.c
+       - only call set_posix_option_order once
+
+builtins.c
+       - `type' gets a -- option to signal the end of the option arguments
+       - `typeset/declare' gets a -- option to signal the end of the
+         option arguments
+       - `hash' gets a -- option to signal the end of the option arguments,
+         and gets rewritten to boot
+       - redid `umask' option processing code to be more regular -- fixed
+         the bug where `umask --' would print nothing
+       - added Posix.2 `-p' option to `command' builtin, also added a
+         `--' argument with the standard meaning
+       - `trap' gets a -- option to signal the end of the option arguments,
+         and gets rewritten to structure it like other builtins
+       - set_or_show_attributes was changed so that you can't just make a
+         read-only variable read-write by saying `readonly -n var'
+
+                                    6/8
+                                    ---
+variables.c
+       - if bash is executing a function (variable_context > 0), then look
+         in the temporary environment for a variable's value first
+
+machines.h
+       - new entry for Honeywell Bull X20 from lele@idea.sublink.org
+       - for hp/ux versions < 7.0, we still need to link with -lPW to
+         get alloca
+
+                                   6/11
+                                   ----
+subst.c
+       - include <sys/types.h>
+
+machines.h
+       - change the `catch-all' entries for things like MIPS to use
+         #if defined (mips) && !defined (M_MACHINE)
+
+builtins.c
+       - took out the readonly -n change.  Enable it for strict sh
+         compatibility
+
+unwind_prot.c
+       - extended the saved variable code to full generality by adding a
+         size field to the struct.  Variables bigger than a char * will
+         be copied into a block of memory allocated to hold their value
+         and restored from there
+
+builtins.c, trap.c, execute_cmd.c
+       - changes to unwind_protect_var calls to add value, size arguments
+
+shell.c, jobs.c
+       - only catch SIGINT with sigint_sighandler if the shell is
+         interactive; otherwise let termination_unwind_protect get it
+
+shell.c
+       - startup files may now be aborted by using the `return' builtin
+       - set SIGTERM to SIG_IGN if the shell is interactive, not just if
+         it's a login shell.  Without this, `kill 0' will kill an
+         interactive shell
+
+                                   6/12
+                                   ----
+jobs.c
+       - replace instances of M_UNIX with the more descriptive SCO
+
+machines.h
+       - gather all 386 machines into one block, stop #undef'ing i386
+
+builtins.c
+       - make exec_builtin not completely expand the command name and
+         stick it in argv[0] if the `-' flag is supplied -- instead,
+         tack a `-' on the front of whatever the user typed
+
+                                   6/13
+                                   ----
+jobs.c
+       - don't change SIGQUIT's signal handler at all in
+         initialize_job_signals
+
+execute_cmd.c
+       - change execute_case_command to do string_list on the result of
+         expand_word (word) instead of just taking the first word and
+         assuming no splitting was done
+       - in execute_simple_command, make sure the call to bind_lastarg
+         is done before the dispose_words, because lastarg just points
+         at the last word, which is invalid after the dispose_words
+
+machines.h, jobs.c
+       - new machine-specific variables: BSD_GETPGRP, TERMIOS_MISSING
+
+glob.c
+       - make an incomplete character class (e.g. [X-]) behave as if
+         no class were specified instead of giving an error
+
+filecntl.h
+       - new include file that encapsulates fcntl.h and the declarations
+         for close-on-exec stuff
+
+execute_cmd.c, builtins.c, shell.c
+       - new arg for execute*command* functions that tells whether or not
+         to obey the -e flag and exit when a simple command exits with a
+         non-zero exit status
+       - fixed exit status of while to be success if no commands are
+         executed
+       - fixed exit status of until to be success if no commands are
+         executed
+
+                                     6/15
+                                     ----
+execute_cmd.c
+       - since while and until commands are so similar, combined the bodies
+         into execute_while_or_until (), which takes a type argument to
+         decide which one it is.  execute_{while,until}_command just call
+         this function
+       - added unwind protect calls to execute_for_command to free up the
+         list (for word in list)
+       - eliminated a possible call to find_function in execute_simple_command
+       - added unwind protect calls to execute_simple_command
+       - plugged a couple of memory leaks in execute_simple_command:
+               o freeing the expanded command words when executing a function
+                 or builtin with a pipe in or out
+               o the name of the command (`command') when executing from a
+                 disk file
+
+subst.c
+       - implemented the Posix.2-style $(( )) arithmetic substitution.  I
+         think we'll let this remain mercifully undocumented
+
+variables.c
+       - removed support for old Posix.2-style exported functions, since
+         Posix.2 no longer specifies exported functions
+
+                                     6/17
+                                     ----
+nojobs.c
+       - make wait_for_single_pid () check the validity of its pid
+         argument before calling wait(2), returning 127 if the pid is
+         invalid
+
+jobs.c
+       - if wait_for_single_pid () is called with an argument that does
+         not match a child of the shell, return 127 as Posix.2 specifies
+
+
+builtins.c
+       - made `set' treat `set -' and `set +xv' as equivalent, like the
+         Posix.2 spec mandates (though it does mark the construct as
+         obsolescent)
+       - made the strings output by `export' and `readonly' when showing
+         variable definitions match those specified by Posix.2
+       - if STRICT_POSIX_COMPATIBILITY is #defined when compiling the
+         shell, the shell will exit in the event that it cannot find the
+         file specified as the first argument to `.'
+
+variables.c
+       - turned set_auto_export(var) into a two-statement macro, saving a
+         number of function calls
+
+                                     6/19
+                                     ----
+execute_cmd.c
+       - split the different parts of execute_simple_command into different
+         functions: execute_builtin_or_function, execute_disk_command, and
+         execute_subshell_builtin_or_function to make the whole mess
+         easier to understand
+
+                                     6/21
+                                     ----
+builtins.c
+       - make sure that `type' does not report directories as executable.
+         Call executable_file to make sure.
+       - have the `set' builtin check the validity of its flags arguments
+         before actually doing anything with them.  This prevents things
+         like `set -help' from exiting the shell
+
+flags.h
+       - added declarations for the functions exported by flags.c
+       - added #if defined (_FLAGS_H) protection against multiple inclusion
+
+shell.c
+       - don't do the .bashrc if we're a login shell, even if we're not
+         doing the .profile
+
+general.c
+       - uts -> ut, since UTS compilers define uts for the C preprocessor
+
+makeargs.sh
+       - better treatment of machines that do not have the `hostname'
+         command
+
+                                   6/22
+                                   ----
+readline/readline.c
+       - on termio and termios systems, turn off NL -> CR and CR -> NL
+         input translation so bash will see the two characters distinctly
+
+                                     6/23
+                                     ----
+ulimit.c
+       - cleaned up the shell_ulimit code so there was not so much code
+         duplication (cut 70K from binary!)
+       - added -H, -S to use hard, soft BSD resource limits
+       - ulimit now allows multiple options: -d -t -c or -dtc
+       - ulimit can print multiple options in the same format it uses for
+         -a
+       - USG systems can use -p, -n, -a -- there is no longer a ulimit.c.new
+       - -n uses RLIMIT_NOFILE for getting as well as setting, and so can
+         use hard and soft limits
+       - `ulimit limit' now behaves like `ulimit -f limit'
+
+                                     6/25
+                                     ----
+execute_cmd.c
+       - since do_redirection () is the only place where we have the value
+         of the expanded redirection word, report open () failures there
+
+       - broke the #! emulation code out into a separate function and made
+         it handle the single argument that you can give interpreters
+
+builtins.c
+       - make `command -p' use the Posix.2 configuration variable _CS_PATH
+         (with confstr()) or the #define CS_PATH to find the path that will
+         pick up all the standard utilities before falling back to using
+         COMMAND_MINUS_P_PATH
+
+                                   6/26
+                                   ----
+builtins.c
+       - make sure we include `-o' in the list of legal flags when checking
+         for illegal ones in the set builtin
+
+                                   6/29
+                                   ----
+fc.c
+       - parse and execute the entire edited file of commands when doing
+         `fc -e' so that compound commands work
+
+readline/readline.c
+       - allow leading whitespace in lines passed to rl_parse_and_bind()
+
+machines.h
+       - MIPS machines cannot handle the inclusion of /usr/include/sys/wait.h,
+         so #undef HAVE_WAIT_H
+
+cpp-Makefile
+       - pass only a subset of the CFLAGS down to the make in readline,
+         because some make programs and cc's get overloaded
+
+                                     6/30
+                                     ----
+ulimit.c
+       - rewrote to do the 6/23 changes right
+       - added -- to mean end of options
+
+execute_cmd.c
+       - made a number of functions static
+       - changed do_redirection to do_redirection_internal
+
+cpp-Makefile, config.h, builtins.h, builtins.c, subst.c
+       - made the inclusion of the getopts code dependent on the definition
+         of GETOPTS_BUILTIN
+
+vprint.c
+       - new name for misc.c, since all that it contains now are definitions
+         for v[fs]printf()
+
+builtins.c
+       - made help for history_builtin include -s only if HISTORY_DASH_S
+         is defined, to match the code
+       - made the help for the ulimit builtin match the code, depending on
+         HAVE_RESOURCE being defined
+       - make the help builtin interruptible by adding calls to QUIT in
+         the loop
+       - `cd -' now prints the name of the directory it's changing to
+       - change the help text for the wait builtin to show that job specs
+         are allowed only on systems which support job control
+       - changed an fprintf(stdout, ...) to printf(...) in history_builtin
+
+jobs.c
+       - make kill_pid kill the correct pid when walking through all the
+         pids in a job
+
+test.c
+       - don't call strlen when we just want to know whether or not a string
+         is null; it suffices to test the first character
+
+bashline.c
+       - fixed a typo in the comment text for the FIGNORE code
+
+documentation/bash.1
+       - some typo fixes
+
+documentation/features.texi
+       - fixed some typos
+
+glob/glob.c
+       - if we're not globbing dot filenames, and the first character of the
+         pathname is a `.', make sure the pattern matches it exactly before
+         we call glob_match in glob_vector()
+
+                                    7/1
+                                    ---
+fc.c
+       - use maybe_execute_file instead of calling parse_and_execute
+         when re-executing the file of commands
+
+builtins.c
+       - removed the help text #define; the savings is too small to bother
+
+ulimit.c
+       - set `verbose_print' after a group of specific options is given,
+         so `ulimit -pdt -m' prints everything verbosely
+
+                                     7/3
+                                     ---
+getopts.c
+       - made it include the Gnu `getopt.h' instead of declaring its
+         variables as extern
+
+getopt.c
+       - added a function getopt_set_posix_option_order() to set the
+         default option ordering to that required by Posix.2
+       - added a variable default_ordering to hold the default style
+         of option ordering that getopt() handles.  Usually it is
+         PERMUTE, but it can be set to REQUIRE_ORDER
+
+cpp-Makefile
+       - made all of the getopts files depend on GETOPTS_BUILTIN being
+         defined; changed some variable names for the getopts files
+
+builtins.c
+       - made exit_builtin and logout_builtin return the value of
+         exit_and_logout() instead of expecting exit_and_logout not to
+         return
+       - the `type' builtin now prints `keyword' instead of `reserved word'
+         when given the `-type' option
+
+jobs.c
+       - removed the final default #else clause for set_new_tty_driver();
+         if none of NEW_TTY_DRIVER, TERMIO_TTY_DRIVER, or TERMIOS_TTY_DRIVER
+         is defined, the compilation is hopeless anyway
+
+                                     7/4
+                                     ---
+jobs.c
+       - added support for another format for pretty_print_job: print the
+         information only of the job is marked as not having been notified,
+         then set the job as having been notified so there will not be
+         multiple lines of information about the same job.  flush_child ()
+         resets this flag to 0 when a job's status changes
+       - made a number of private functions static
+
+builtins.c
+       - added a Posix.2a-like `-n' flag to the jobs builtin to print only
+         those jobs that have changed status since they were last printed
+
+documentation/bash.1
+       - added description of -n option to `jobs' builtin section
+
+                                    7/5
+                                    ---
+shell.c
+       - test help file name for nullness and emptyness (hf && *hf) before
+         trying to read the history from it.  Make the same changes when
+         saving the history.
+
+shell.c, jobs.c, quit.h
+       - changed the type of throw_to_top_level from type `sighandler' to
+         void
+
+execute_cmd.c, builtins.c
+       - make sure all int-valued functions return some value
+
+readline/readline.c
+       - if S_ISDIR is defined, then use it, otherwise use S_IFDIR
+         (Posix vs. traditional Unix)
+
+                                     7/6
+                                     ---
+builtins.c
+       - made the exit status of the kill builtin agree with the Posix.2
+         specification
+
+documentation/bash.1
+       - added specifications of the return values of most of the builtins
+         likely to be used in scripts
+
+                                    7/8
+                                    ---
+execute_cmd.c
+       - set this_shell_builtin and last_shell_builtin each time we
+         execute a simple command.  This means that this_shell_builtin
+         being non-null will indicate we are running a builtin
+
+variables.c
+       - if we're executing a builtin, look in the temp environment first
+         for a variable before looking in the variable hash table
+
+                                   7/11
+                                   ----
+test.c
+       - fixed precedence bug by making bash adhere to traditional sh
+         grammar for -a and -o
+
+readline/readline.c
+       - fixed a bug that would cause core dumps when trying to use ^P
+         to get to a line longer than rl_line_buffer_len, then trying
+         to insert something.
+
+
+
+[Radical reorganization of the shell sources, inclusion of builtins/*]
diff --git a/CWRU/old-changelogs/CWRU.chlog.v6 b/CWRU/old-changelogs/CWRU.chlog.v6
new file mode 100644 (file)
index 0000000..3fb0fb1
--- /dev/null
@@ -0,0 +1,1010 @@
+[Beginning of work with version 1.10]
+
+                                    7/14
+                                    ----
+documentation/bash.1
+       - added description of the `bind' builtin
+       - fixed typo in description of the `command' builtin
+
+builtins/bind.def
+       - fixed up the error message printed when rl_read_init_file fails
+
+builtins/alias.def
+       - print_alias should be a static function
+
+builtins/history.def
+       - added support for `--'
+
+builtins/break.def
+       - added the glue for the `continue' builtin, which had been left out
+
+builtins/common.c
+       - changed find_shell_builtin to use a binary search.  This eliminates
+         40 calls to `strcmp' each time `test' is called, for instance
+       - added a function initialize_shell_builtins () that sorts the array
+         of shell builtins so the binary search will work
+
+shell.c
+       - added call to initialize_shell_variables in shell_initialize()
+
+builtins/mkbuiltins.c
+       - added a footer to the text written to builtins.c that initializes
+         the variable num_shell_builtins to the number of shell builtins in
+         the shell_builtins array
+
+builtins.h
+       - added an extern declaration of num_shell_builtins
+
+builtins/enable.def, builtins/help.def
+       - changed to use num_shell_builtins
+
+cpp-Makefile
+       - make the copy of builtins/builtext.h happen only if builtext.h
+         has changed, using `cmp'.  This keeps bashline.c from being
+         recompiled every time something in the builtins directory
+         changes
+
+                                  7/15
+                                  ----
+builtins/history.def
+       - fixed up the help text to reflect reality
+
+documentation/bash.1
+       - more changes to the `alias' builtin text
+
+                                  7/16
+                                  ----
+builtins/Makefile
+       - added a .SUFFIXES line to define .def as a suffix; old versions of
+         make require it
+
+getcppsyms.c
+       - corrected spelling error: MTPSEL -> MIPSEL
+       - added more defines: mc68020, m68k, bsd4_2, bsd4_3, ibmrt, ns32000,
+         hp9000s800, hp9000s500, hp9000s300, hp9000s200
+
+readline/readline.c
+       - fixed a typo on rl_prep_terminal for BSD tty driver systems that
+         caused ^J and ^M to both be mapped to ^M on input.  The net
+         effect was that it was impossible to get a literal ^M into a line,
+         like into an `ed' here document
+
+                                  7/17
+                                  ----
+
+cpp-Makefile
+       - make sure CPPFLAGS is passed to sub-makes
+
+machines.h
+       - Pyramid's don't have alloca(), so #undef HAVE_ALLOCA in the
+         machines.h entry
+
+builtins/history.def
+       - cleaned up the option parsing a little bit; corrected support
+         for the `--' option
+
+                                  7/18
+                                  ----
+variables.c
+       - don't inherit IFS from the environment anymore
+
+machines.h
+       - fix the definition of SYSDEP_CFLAGS for ultrix machines
+
+cpp-Makefile
+       - make builtins/libbuiltins.a depend on pipesize.h, because ulimit.def
+         includes it
+       - shell.o needs to depend on endian.h
+
+getcppsyms.c
+       - more HP symbols for the 9000 series
+
+subst.c
+       - if command_substitute is passed a null or empty string, then just
+         return ((char *)NULL) immediately, without forking a child
+
+parse.y, subst.c, shell.c, execute_cmd.c
+       - added ksh-like process substitution using FIFOs (named pipes)
+
+                                  7/19
+                                  ----
+
+config.h
+       - made PROCESS_SUBSTITUTION a configurable option
+
+cpp-Makefile
+       - made y.tab.c depend on files included by shell.h
+
+                                    7/20
+                                    ----
+subst.c
+       - make sure we call close_pgrp_pipe from the process substitution
+         code in the parent
+
+                                  7/24
+                                  ----
+subst.c
+       - no longer unconditionally tilde-expand `:~' in words (but still
+         do it in assignments)
+
+test.c
+       - trim trailing blanks from integer expressions so isint() does not
+         choke on them
+
+                                  7/25
+                                  ----
+makeargs.sh
+       - remove the -D from the SYSDEF definition of USGr4
+
+builtins/history.def
+       - include "../filecntl.h" instead of sys/file.h
+
+make_cmd.c
+       - add declaration of reverse_list ()
+
+subst.c
+       - add cast to return value from strlen() in sub_append_string ();
+         ANSI C makes the return value a size_t, which can be unsigned
+
+builtins/suspend.def
+       - add argument to suspend_continue(), since it's a signal handler
+
+readline/readline.c
+       - make rl_handle_sigwinch have only one argument: int sig
+       - make rl_signal_handler have only one argument: int sig
+       - add extern char *getenv() declaration at top level
+       - add extern char *index(), *rindex() declarations at top level, if
+         these are not already #defines
+       - add cast to d_namlen area of struct dirent, because it's an
+         unsigned short
+
+test.c
+       - change isint to:
+               take a string as first argument
+               accept a NULL second argument, meaning toss the value
+               work correctly with leading - and +
+               compute the value on the fly, rather than calling atol
+       - change age_of to:
+               take a string as first argument
+               accept a NULL second argument
+       - int_expt_err -> integer_expected_error
+       - changed all calls to stat to call a new function test_stat, which
+         immediately returns an error when given a null pathname.  This is
+         what Posix.1 says
+       - changed eaccess, age_of to disallow null pathnames as well
+
+builtins/ulimit.def
+       - System V.4 does not define RLIMIT_RSS, so disable the `m' option
+
+builtins/mkbuiltins.c
+       - need to include "../filecntl.h"
+
+builtins/source.def
+       - need to include "../filecntl.h"
+
+builtins/times.def
+       - System V.4 does not define a struct rusage, so use times(2) instead
+         of getrusage(2)
+
+                                    7/26
+                                    ----
+readline/readline.c
+       - output a \r in crlf() only if we're running under the BSD tty
+         driver (NEW_TTY_DRIVER) -- the Posix (termios) and System V
+         (termio) drivers do not disable output nl->crnl mapping
+       - if read returns 0 in rl_getc, return EOF to the caller
+
+cpp-Makefile
+       - make sure we pass -DHAVE_UNISTD_H down to the make in readline
+         so that the proper tty driver is used (BSD, termio, or termios)
+
+                                    7/27
+                                    ----
+config.h, parse.y
+       - made csh-style `!' history expansion and prompt string decoding
+         configurable, based on the definition of CSH_HISTORY_EXPANSION
+         and PROMPT_STRING_DECODE, respectively.  Both can be enabled
+         and disabled in config.h
+
+readline/readline.c
+       - reformatted maybe_unsave_line and maybe_replace_line
+       - if we use ^R to find a history line longer than rl_line_buffer_len,
+         we can't simply do a strcpy(the_line, line_found).  We have to use
+         xrealloc to increase the length of rl_line_buffer in
+         rl_search_history
+       - do the same xrealloc trick in maybe_unsave_line, rl_get_next_history
+
+execute_cmd.c
+       - changed the way pipes are created.  Now, SIGCHLD is blocked before
+         anything is done, and pipelines are created in a tight while loop
+
+parse.y
+       - changed pipelines to be right associative rather than left.  This
+         way, the process tree is right-heavy rather than left -- there will
+         never be a command with a pipeline in cmd->value.Connection->first
+
+jobs.c
+       - removed all references to the pgrp_pipe process group synchronization
+         hack, including the functions pipe_read, pipe_close, and
+         close_pgrp_pipe
+
+subst.c
+       - removed calls to close_pgrp_pipe for command and process
+         substitution
+
+execute_cmd.c
+       - obey_minus_e_flag -> check_exit_on_error
+
+                                  7/30
+                                  ----
+builtins/command.def
+       - HP/UX 7.x defines _CS_PATH, but does not have the getconf() function
+         to support it.  Need a special #define to work around.
+
+                                  7/31
+                                  ----
+
+shell.h, parse.y, make_cmd.c, copy_cmd.c, print_cmd.c, execute_cmd.c
+       - consolidated the command->subshell and command->invert_pipeline
+         members into a single command->flags
+
+execute_cmd.c, shell.c, builtins/common.c, builtins/command.def
+       - removed the check_exit_on_error parameter to the execute_*
+         functions; the functionality is now one of the flag bits attached
+         to each command.
+
+shell.h, make_cmd.c
+       - each command type now has a `flags' member associated with it,
+         initialized to 0 in make_XXX_command
+
+                                    8/3
+                                    ---
+jobs.c
+       - wrap the system dependencies for waiting for children inside a
+         WAIT_FOR_CHILD macro, whose syntax matches the Posix waitpid()
+         function
+
+readline/readline.c
+       - make sure all definitions for XON/XOFF are wrapped inside the
+         USE_XON_XOFF cpp define
+
+subst.c
+       - make string_list and string_list_dollar_star use a common base
+         function: string_list_internal (list, separator)
+
+                                   8/5
+                                   ---
+builtins/mkbuiltins.c
+       - build the new builtins.c as a temp file, then rename it when
+         it's done
+
+shell.c
+       - when on an Apollo, turn off line editing if executing in a pad
+
+                                   8/6
+                                   ---
+inlib.def
+       - new builtin for use on Apollo machines
+
+lib/readline/vi_mode.c
+       - fixed `blind strcpy into the_line' bug in rl_vi_dosearch
+       - made ~ vi change case command take a numeric argument, like ksh-88
+       - made vi character search commands (t, T, f, F, ;) take arguments
+       - made vi `_' directive unconditionally append a space before
+         inserting the last arg
+       - make rl_vi_replace only create vi_replace_keymap once
+
+                                   8/7
+                                   ---
+lib/readline/{Makefile, readline.c, vi_mode.c}
+       - finally made vi_mode.c standalone and not included by readline.c
+         so I don't have to wait so long for recompiles each time I change
+         something in either file
+
+lib/readline/vi_mode.c
+       - made rl_vi_change_char (vi `r' command) accept an argument count
+       - if user has bound ^H to erase, make ^H erase when in overstrike
+         mode (vi `R' command)
+       - `cl' deletes one too many characters, so don't advance rl_mark an
+         extra character in rl_vi_change_to if the command is `l'
+       - readline thinks that the first word on a line is the 0th, while vi
+         thinks the first word on a line is the 1st.  Compensate.  This is
+         for the vi `_' command
+       - `dl' deletes one too many characters, make fix to rl_vi_delete_to
+         analogous to that made to rl_vi_change_to to not move mark forward
+       - fixed handling of numeric args in rl_vi_domove so that the correct
+         numeric arg was displayed, the digit read was used to initialize
+         rl_numeric_arg, and the non-digit key stuffed back by rl_digit_loop1
+         was re-read, executed, and passed back as the value of the
+         movement command (makes d5l work right, for instance)
+       - made rl_vi_fetch_history treat a numeric argument correctly -- an
+         argument of n means we want the command that `history' would have
+         labeled as the nth command in its output
+       - extended the vi search commands `/' and `?' to accept a string
+         starting with `^' and find only matches that are prefixes of
+         history lines.  Used a new function vi_history_search_pos that
+         acts like history_search_pos but understands `^'
+       - use rl_line_buffer instead of the_line so the_line can be static
+         and private to readline.c
+
+lib/readline/history.c
+       - fixed the calculation of how much of the history line to test when
+         searching forward in the history list for a string.  Previously,
+         the absolute value of the difference in length was not used.
+       - generalized history_search into history_search_internal, which
+         takes a third parameter that tells whether or not the string must
+         match at the beginning of a history line.  A new function
+         history_search_prefix uses it, and get_history_event now uses it.
+         history_search (string, dir) now simply calls
+         history_search_internal (string, dir, 0)
+
+lib/readline/readline.c
+       - fixed rl_yank_nth_arg to always move point forward and append a
+         space if in vi mode
+
+bashline.c
+       - added a function to implement the vi movement mode `v' command,
+         which runs `fc -e ${VISUAL:-${EDITOR:-vi}}' on either the 
+         command being entered or a command from the history corresponding
+         to the numeric argument given to the command.  This is commented
+         out, because currently there's no way for the shell to know
+         whether or not vi-mode has been compiled into readline
+
+                                    8/8
+                                    ---
+shell.h, execute_cmd.c, parse.y, print_cmd.c
+       - CMD_INVERT_PIPELINE -> CMD_INVERT_RETURN
+         CMD_IGNORE_EXIT_VALUE -> CMD_IGNORE_RETURN
+
+execute_cmd.c
+       - changes from bfox
+       - need to initialize lastarg to NULL at start of
+         execute_simple_command.  For a command that's just an assignment
+         statement, `words' is nil and lastarg never gets set, binding
+         garbage and possibly stepping on memory
+       - lastarg now can be a variable local to execute_simple_command,
+         and it works better that way (e.g. it gets set to garbage when
+         executing a `.' command)
+
+builtins/exec.def
+       - after testing for `-' as argument, make sure there are more
+         arguments before doing anything else.  Return if no more args
+
+                                   8/9
+                                   ---
+builtins/trap.def
+       - make sure the shell always ignores SIGQUIT, especially after a
+         call to trap that restores the default value of the signal handler.
+         The same thing needs to happen for SIGTERM if interactive, and
+         SIGTTIN, SIGTTOU, and SIGTSTP if job control is active
+
+parse.y
+       - call run_pending_traps () immediately after calling readline
+
+                                    8/10
+                                    ----
+jobs.c
+       - only declare sys_siglist once, at top of file, rather than have
+         three or four separate extern declarations
+
+                                  8/13
+                                  ----
+subst.c
+       - rewrote string_extract_double_quoted as a state machine to fix a
+         quoting bug and implement the Posix.2 draft 11 quoting rules
+
+lib/readline/vi_mode.c
+       - don't go back into insertion mode after performing completion in
+         command mode
+
+                                  8/15
+                                  ----
+subst.c
+       - rewrote list_string to implement the Posix.2 draft 11 field
+         splitting rules
+
+                                  8/16
+                                  ----
+builtins/alias.def
+       - make sure single_quote() adds terminating alias
+
+parse.y
+       - make sure we turn off expand_next_token when returning tokens that
+         are not words, like `>'
+
+lib/readline/readline.c
+       - make the termio and termios versions of rl_prep_terminal and
+         rl_deprep_terminal use the static flag terminal_prepped to tell
+         whether or not they should do anything
+
+test.c
+       - removed unused definition of test_io_error
+
+                                  8/18
+                                  ----
+lib/readline/readline.c
+       - fixed the BSD/v7 terminal driver versions of rl_prep_terminal and
+         rl_deprep_terminal to mimic the structure of the sys5/Posix versions
+         with respect to terminal_prepped
+       - fixed a possible call to malloc(0) when allocating space for
+         macro_keys in rl_macro_bind
+       - made rl_variable_bind ring the bell if asked to set the editing mode
+         to vi when vi mode has not been compiled into libreadline
+
+test.c
+       - fixed term() so that -l string is recognized correctly as the LHS
+         of a binary operator
+       - made enough changes so that test.c compiles standalone on the RT
+         running 4.3 and can be installed as /bin/test
+
+                                   8/20
+                                   ----
+parse.y
+       - fixed turning off alias expansion so aliases are still expanded
+         after || and &&, for instance
+
+execute_cmd.c
+       - should only add an unwind-protect to restore the signal mask if
+         job control is in effect
+
+builtins/suspend.def
+       - should only be compiled in if job control is in effect
+
+builtins/alias.def
+       - make sure we free the string allocated and returned by single_quote()
+         in print_alias()
+
+builtins/reserved.def
+       - fix help text for `for' loop to indicate that the semicolon is
+         required only if the `in words' portion is present
+
+                                     8/21
+                                     ----
+documentation/bash.1
+       - fixed the description of tilde expansion to indicate that it is
+         performed on the RHS of assignment statements, and that =~ and
+         :~ are expanded in such cases
+
+machines.h
+       - updated Ultrix MIPS machines entry to undefine HAVE_ALLOCA_H.
+         Ultrix 4.2 on Decstations has /usr/include/alloca.h, which defines
+         alloca as __builtin_alloca, but this version of alloca is severely
+         limited and unusable
+
+jobs.c, subst.c
+       - some Posix systems (e.g. SGI) can't even handle a call to setpgid
+         when the only other member of the process group is a zombie.
+         Restored the old pgrp_pipe synchronization code, #ifdef'd on
+         PGRP_PIPE
+
+machines.h
+       - added -DPGRP_PIPE to the SGI SYSDEP_CFLAGS
+
+trap.c
+       - need to re-install signal handler on USG machines without BSD
+         signals (in trap_handler).  There's still the USG signal race
+         condition, though
+       - if interrupt_immediately is set, run a trap handler directly
+         from trap_handler, instead of just setting the flag
+
+                                   8/26
+                                   ----
+subst.c
+       - changed parameter_brace_expand_rhs to perform tilde expansion on
+         the value it's expanding
+
+parse.y
+       - declared shell_pgrp as extern pid_t, need to include jobs.h on
+         job control systems to make sure it's defined
+
+jobs.c
+       - make a job that is suspended show the signal that caused the
+         suspension in the exit status (128 + WSTOPSIG(s))
+
+jobs.c, execute_cmd.c, builtins/fg_bg.def
+       - make start_job return -1 on error, 0 when starting a background
+         job, and the return value from wait_for when starting a fore-
+         ground job
+
+lib/readline/vi_mode.c
+       - there was an off-by-one error in rl_vi_domove.  We are not at
+         the end of the line if rl_point <= rl_end - 1, not just <.
+         This messed up things like `dw' to the end of the line
+
+                                   8/28
+                                   ----
+subst.c
+       - forgot to malloc space for tresult before trying to use it in
+         word_list_quote_removal
+
+                                   8/29
+                                   ----
+lib/readline/Makefile
+       - make sure that ../glob/tilde_expand.o is linked into the readline
+         library
+       - make sure that xmalloc.o is linked into the readline library
+
+lib/readline/xmalloc.c
+       - new file, linked into readline library for those applications that
+         do not define their own versions
+
+nojobs.c
+       - removed redundant call to signal(SIGQUIT, SIG_IGN)
+       - rearranged code in make_child so signals get the right values
+         in children of the shell
+
+jobs.c
+       - don't call restore_default_signal -- let restore_original_signals
+         do the work, because signals ignored in the shell with trap '' sig
+         are supposed to be ignored in children
+
+trap.c
+       - make sure restore_original_signals restores the values of SIGINT,
+         SIGQUIT, and SIGTERM, unless there has been a trap command called
+         on them
+
+                                    9/4
+                                    ---
+builtins/exec.def
+       - make sure that all signals are restored to their original values
+         before execing the new program
+
+bashline.c
+       - make shell_expand_line output an extra \r after pre_process_line
+         runs
+
+                                     9/5
+                                     ---
+lib/readline/readline.[ch]
+       - new function rl_tilde_expand, which attempts to perform
+         tilde expansion on the word under the cursor
+       - readline now recognizes a new variable, `expand-tilde', which
+         controls whether the tilde expansion functions are called
+         when bash does completion (default is off).  The internal
+         form of this variable is rl_complete_with_tilde_expansion
+
+lib/readline/vi_mode.c
+       - new function rl_vi_tilde_expand, which performs tilde expansion
+         on the word under the cursor when in movement mode, then enters
+         vi insertion mode.
+
+lib/readline/{vi,emacs}_keymap.c
+       - bind rl_tilde_expand to M-& in emacs mode, and rl_vi_tilde_expand
+         to & in vi command (movement) mode
+
+                                    9/6
+                                    ---
+subst.c
+       - fix string_extract_double_quoted to malloc the correct amount of
+         space for the returned string
+
+execute_cmd.c
+       - add an undo redirection to do_redirection_internal for the `close
+         descriptor' case
+
+                                     9/7
+                                     ---
+lib/readline/vi_mode.c
+       - the first character of the string inserted into the command line
+         when the vi mode `#' command is executed is now controlled by the
+         internal variable `rl_vi_comment_character'
+
+lib/readline/readline.c
+       - the readline user-settable variable `vi-comment-character' now
+         controls the value of rl_vi_comment_character
+
+                                   9/10
+                                   ----
+test.c
+       - fixed problems in binary_operator() caused by -l.  Made sure that
+         bash always dereferences a valid member of argv.  Check that the
+         (new) operator is a valid binary operator after a leading -l arg
+         is processed.
+
+lib/readline/vi_mode.c
+       - changed rl_vi_comment_character to rl_vi_comment_begin, which is
+         a character string
+
+lib/realine/readline.c
+       - changed the name of the variable controlling the vi comment
+         string to comment-begin
+
+                                   9/11
+                                   ----
+subst.c
+       - changed ${#@} and ${#*} to return the number of arguments, for
+         sh and ksh compatibility, since the latest Posix.2 draft has
+         left it unspecified
+
+shell.c
+       - added a workaround for a bug in the NeXT 2.1 rlogind, which causes
+         the shell to start with no control terminal -- just open(2) the
+         result of ttyname(3), which causes it to become a controlling
+         terminal
+
+                                   9/13
+                                   ----
+parse.y
+       - added the reserved words that can precede a list of commands to
+         the list of command word predecessors in command_token_position
+
+builtins/kill.def
+       - added support for negative process specifications to kill
+         process groups
+
+                                   9/17
+                                   ----
+builtins/read.def
+       - turn off att_invisible when binding a variable to the results of
+         read
+
+subst.c
+       - don't expand invisible variables in the $VAR expansion code
+
+                                     9/18
+                                     ----
+lib/readline/readline.c
+       - changed the use of _POSIX_VERSION to use HAVE_POSIX_SIGNALS and
+         TERMIOS_TTY_DRIVER
+
+                                   9/24
+                                   ----
+shell.h, execute_cmd.c, builtins/command.def
+       - replaced two global variables, inhibit_command_word_expansion
+         and ignore_function_references, and replaced them with flags
+         in the simple command structure
+
+jobs.c
+       - make sure current_job and previous_job are reset to NO_JOB in
+         delete_all_jobs()
+       - stop_pipeline allocates an extra slot in the jobs array
+
+                                   9/27
+                                   ----
+builtins/wait.def
+       - make the wait builtin use interrupt_immediately to get immediate
+         trap execution while waiting for commands
+
+subst.c
+       - when IFS is set to the null string (IFS=""), "$*" should
+         concatenate the positional parameters into a single word
+
+builtins/break.def
+       - if the argument to `break' or `continue' is not >= 1, Posix.2
+         says the builtin should return EXECUTION_FAILURE
+
+shell.h
+       - Posix.2 has specified that the shell should exit with status
+         126 when asked to execute a file that is not executable.  This
+         changes the definition of EX_BINARY_FILE
+
+builtins/trap.def
+       - the format of the command string printed out when trap has
+         no arguments has changed to "trap -- %s %s" in the latest
+         version of Posix.2
+
+                                   9/30
+                                   ----
+builtins/alias.def
+       - make sure single_quote allocates space for the opening and closing
+         quotes by allocating 3 + (2 * strlen(s)) bytes
+
+nojobs.c
+       - Under certain circumstances, when set_tty_state is called
+         without a successful get_tty_state, the file descriptor
+         opened on /dev/tty could be left unclosed
+
+                                   10/2
+                                   ----
+execute_cmd.c
+       - with redirections of type r_close_this, we don't need to check
+         if redirectee != redirector, since redirectee is not being used
+         there
+
+parse.y
+       - in yy_readline_get, we should only worry about shell_pgrp and
+         job_control if JOB_CONTROL is defined
+
+builtins/enable.def
+       - make enable_shell_command skip over entries with null values
+         for `function'
+
+subst.c
+       - fixed a typo: S_ISFIFO -> S_IFIFO
+
+                                   10/3
+                                   ----
+builtins/ulimit.def
+       - some machines have a setdtablesize() system call, the `set'
+         analog of getdtablesize().  If HAVE_SETDTABLESIZE is defined,
+         call it when ulimit -n newlim is used.
+
+machines.h
+       - Sequent symmetry machines have setdtablesize(), add a
+         -DHAVE_SETDTABLESIZE to SYSDEP_CFLAGS
+
+parse.y
+       - made reserved_word_acceptable() static
+       - rearranged tests for reserved words so that in_case_pattern_list
+         test is performed first
+       - turned command_token_position into a #define, since it was almost
+         identical to reserved_word_acceptable
+
+                                   10/4
+                                   ----
+shell.c
+       - for Ultrix Decstations or machines using Gwyn's alloca() emulation,
+         call alloca(0) in reader_loop after executing each command to try
+         and reclaim outstanding storage
+
+                                   10/7
+                                   ----
+bashline.c
+       - fixed a bug that caused the internal index into the shell builtins
+         array to be incremented by one too many before returning matches
+         for command completion
+
+jobs.c
+       - if PGRP_PIPE is not defined, have each child process give the
+         terminal to the pipeline process group
+
+                                   10/8
+                                   ----
+support/mksysdefs
+       - make Xenix machines call /bin/uname instead of the one found in
+         $PATH
+
+subst.c
+       - added a declaration for unquoted_substring at the top of the
+         file
+
+maxpath.h
+       - include <limits.h> rather than <sys/limits.h>, since that is the
+         Posix-specified include file
+
+bashline.c
+       - make ` be a command separator for purposes of command completion
+         Now `ch[TAB] will attempt command completion
+
+lib/readline/readline.c
+       - don't compile in the termios code if TERMIOS_MISSING is defined
+
+machines.h
+       - since Ultrix typeahead is broken using the termios code, define
+         TERMIOS_MISSING in SYSDEP_CFLAGS
+
+                                   10/9
+                                   ----
+
+general.c
+       - add a pathname canonicalization routine canonicalize_pathname to
+         remove sequences of > 1 slash, remove . and ./, munge the
+         passed pathname to handle .. and ../, and remove trailing /
+         characters
+
+builtins/cd.def
+       - call canonicalize_pathname after making the pathname absolute
+         with make_absolute
+
+                                   10/10
+                                   -----
+builtins/source.def
+       - check that the file being sourced is not a binary file
+
+builtins/ulimit.def
+       - added a new flag -v that reports the current and maximum limits
+         on the amount of virtual memory allocated to a process.  This is
+         implemented using RLIMIT_VMEM on those machines that have it
+         (svr4) and as the sum of RLIMIT_DATA and RLIMIT_STACK on other
+         machines with the BSD resource limits
+
+                                   10/11
+                                   -----
+general.c, parse.y
+       - unified #defines surrounding sysv_getc () declaration and use
+
+shell.c
+       - have first setjmp before startup files are executed test the
+         return code from setjmp to decide whether or not to exit the
+         shell or to skip the startup files
+
+                                    10/13
+                                    -----
+expr.c
+       - need to initialize tokval and tokstr each time evalexp() is
+         executed
+
+execute_cmd.c
+       - make sure that functions executed in the background set up a
+         valid place to return to (using return_catch) so that trying
+         to execute `return' doesn't result in a longjmp botch
+
+                                   10/14
+                                   -----
+lib/readline/vi_mode.c
+       - make rl_vi_ccmment insert a space after inserting `:' as the
+         comment character
+
+builtins/getopt.c
+       - make string.h be included #if defined (USG) || defined (hpux)
+
+                                   10/15
+                                   -----
+bashline.c
+       - fix bug that causes bash to get a seg fault on attempting
+         completion after FIGNORE=
+
+test.c
+       - test -foobar was the same as test -f.  Make sure an operator is
+         only two characters long
+
+                                   10/16
+                                   -----
+shell.c
+       - interactive shells should call get_tty_state after reading the
+         startup files, so that any stty commands therein are not lost
+
+support/mksysdefs
+       - for a machine to be an `isc386', it must have both
+         /etc/conf/kconfig.d and /usr/include/sys/limits.h
+
+                                   10/17
+                                   -----
+subst.c
+       - re-implemented ${#xx} in parameter_brace_expand_length to
+         call expand_string on $xx and take the length of the result.
+         If no result (e.g. if xx is undefined variable), return 0
+
+execute_cmd.c
+       - remove the attempt to put commands on both sides of && and ||
+         in a non-job-control environment
+
+                                  10/18
+                                  -----
+lib/readline/history.c
+       - If we are compiling for the shell, allow quotes to inhibit
+         history expansion
+
+test.c
+       - A new version from djm@eng.umd.edu
+
+subst.c
+       - If we don't get all of the name when we go to expand ${#xx},
+         where `name' is the stuff inside the braces, it's a bad
+         expansion error
+       - the ${xx} code advanced `sindex' one too many, so the character
+         immediately following the close brace was skipped
+
+                                  10/21
+                                  -----
+type.def
+       - the state variable used in calls to user_command_matches when
+         looking up disk files was not being reset to 0 for each item
+         looked up
+
+nojobs.c
+       - reversed the sense of the first test for _POSIX_VERSION
+         vs. USG to determine what time of terminal handling code to
+         use
+
+                                  10/22
+                                  -----
+lib/glob/fnmatch.[ch]
+       - Roland McGrath's implementation of the Posix.2 pattern matching
+         function fnmatch()
+
+subst.c
+       - removed emulation of fnmatch, declaration of FNM_NOMATCH
+       - include <fnmatch.h>
+
+execute_cmd.c
+       - removed declaration of FNM_NOMATCH, now includes <fnmatch.h>
+       - case pattern expansion now calls fnmatch(pat, str, FNM_NOESCAPE)
+         to disable backslash escaping.  Still not sure this is the
+         right thing.
+
+cpp-Makefile
+       - changes so that ./lib/glob (actually $(GLIBSRC)) is in the include
+         file search path
+       - make sure fnmatch.c gets put into lib/glob/libglob.a
+
+machines.h
+       - isc386 needs -DPGRP_PIPE added to SYSDEP_CFLAGS
+
+make_cmd.c
+       - <<- means kill leading TAB characters, not all whitespace
+
+                                  10/24
+                                  -----
+builtins/type.def
+       - make sure we note that we found something if a file is found in
+         the hash table, so a successful exit status is returned
+
+                                  10/25
+                                  -----
+machines.h
+       - for Convex machines, also check for __convex__ and __convexc__
+         being defined by cpp
+
+                                   10/27
+                                   -----
+lib/glob/glob.c
+       - Posix systems should always use the `dirent' style of reading
+         directories, for portability
+
+lib/readline/readline.c
+       - restructured the maze of defines and include files for the
+         directory reading code to default to Posix-style if
+         _POSIX_VERSION is defined, regardless of whether the system is
+         BSD or System V
+       - in readline_internal, lastc should be initialized to -1, because
+         0 can be a valid input character (some people use ^@ (NUL) as
+         the eof character, for instance, because it's easy to type)
+       - readline should bind eof_char for the termios and termio ttyio
+         systems
+       - make sure _POSIX_VDISABLE is defined for termio and termios
+         systems
+       - readline should check against _POSIX_VDISABLE rather than -1 to
+         decide whether a special character is disabled
+       - if VLNEXT is defined, termios systems should bind c_cc[VLNEXT] to
+         rl_quoted_insert
+       - if VWERASE is defined, termios systems should bind c_cc[VWERASE]
+         to rl_unix_word_rubout
+       - readline should always call readline_default_bindings each time,
+         so changes made by `stty' are obeyed.  Move the call from
+         readline_initialize_everything to readline_initialize so any new
+         settings are recognized each time readline is called.  This is
+         for erase, kill, literal-next, and word erase characters
+
+lib/readline/funmap.c
+       - added a funmap entry for rl_call_last_kbd_macro in default_funmap
+         (as "call-last-kbd-macro")
+
+execute_cmd.c
+       - when executing a ()-subshell command with redirections,
+         execute_command_internal performs the redirections associated with
+         the entire subshell command itself, but then forgets to dispose of
+         and clear command->redirects before calling itself recursively
+
+subst.c
+       - ${#-} and ${#?} are not illegal, and should expand to the lengths
+         of $- and $?, respectively
+
+                                  10/28
+                                  -----
+variables.c
+       - fix from bfox: change bind_variable to call var_lookup rather
+         than find_variable, because find_variable will look in the
+         temporary environment under some circumstances
+
+subst.c
+       - ${#:} should be (and is now) an error
+
+                                  10/29
+                                  -----
+lib/readline/readline.c
+       - readline_default_bindings is again called from
+         readline_initialize_everything, so it is only called once
+
+                                  10/30
+                                  -----
+test.c
+       - make sure uid_t and gid_t are defined on non-Posix USG systems
+         (this may be overkill)
+
+machines.h
+       - Ardent has a non-functional vfprintf??
+
+lib/malloc/gmalloc.c
+       - new Gnu malloc, written by Mike Haertel, snagged from gdb 4.2
+       - define the code that tries to intuit getpagesize
+
+builtins/ulimit.def
+       - make sure all calls to getmaxvm are protected by HAVE_RESOURCE
+
+builtins/times.def
+       - protect the getrusage calls with #if defined (HAVE_RESOURCE) &&
+         defined (RUSAGE_SELF) rather than some system specific
+         identifiers
+
+[end of work with version 1.10]
diff --git a/CWRU/old-changelogs/CWRU.chlog.v7 b/CWRU/old-changelogs/CWRU.chlog.v7
new file mode 100644 (file)
index 0000000..be260f0
--- /dev/null
@@ -0,0 +1,671 @@
+[Beginning of work with version 1.11]
+
+                                   10/31
+                                   -----
+Makefile
+       - changed instances of $(AWK) to $(GAWK) -- political correctness from
+         bfox
+
+builtins.h, builtins/help.def, builtins/mkbuiltins.c
+       - changed representation of long_doc from a single string to an
+         array of strings
+
+execute_cmd.c
+       - only call __setostype() if on isc386 and _POSIX_SOURCE is
+         defined
+
+general.c
+       - only define functions for index and rindex if index and rindex
+         are not already cpp defines
+
+jobs.c
+       - #undef some things that clash between <sys/ioctl.h> and <termios.h>
+         on Posix suns
+
+machines.h
+       - make isc386 machines links with the shared C library explicitly
+         (-lc_s)
+       - new entry for a MagicStation (?) from bfox
+
+variables.c
+       - use a cpp define _CONST_HACK to determine whether the parameter to
+         getenv() is a char const * (yes for _STDC_, no otherwise)
+
+builtins/type.def
+       - make found_file local to the block that searches for executable
+         disk files
+
+                                  11/4
+                                  ----
+execute_cmd.c
+       - make execute_function_or_builtin use unwind protects to protect
+         the `return catch' variables
+
+support/getcppsyms.c
+       - added definitions for M_UNIX, M_XENIX, and _AIX
+
+                                  11/5
+                                  ----
+bashline.c
+       - fix a call to savestring in command_word_completion_function with
+         a post-incremented int parameter, since savestring is a macro that
+         evaluates its argument twice (builtin completion)
+
+lib/glob/fnmatch.c
+       - add `^' as a character that negates a character class ([])
+
+                                  11/6
+                                  ----
+subst.c
+       - add a new variable last_command_subst_pid to keep track of the
+         pid of the last child created for command substitution.  Used
+         to determine whether or not command substitution has taken
+         place.
+
+execute_cmd.c
+       - made the exit status of a command that has only assignments and
+         redirections obey the Posix spec
+
+unwind_prot.c, trap.c
+       - make sure all sigset_t variables are initialized with sigemptyset
+         before use
+
+lib/glob/fnmatch.c
+       - fixed a couple of bugs with [] classes in fnmatch: not checking
+         whether or not we've hit the ']' and not incrementing the string
+         argument in the right place
+
+                                  11/7
+                                  ----
+braces.c
+       - Make backquotes inhibit brace expansion -- defer it until the
+         subshell runs
+       - Ditto for $( )
+
+subst.c
+       - since braces.c now calls unquoted_member and unquoted_substring,
+         they can no longer be static functions
+
+config.h
+       - two new configuration options: ALLOW_RIGID_POSIX_COMPLIANCE and
+         DISABLED_BUILTINS
+
+shell.c, jobs.c
+       - define and use top_level_signal_mask, restored on longjmps to
+         top_level by throw_to_top_level
+
+builtins/builtin.def
+       - use builtin_address to find the function (if so configured) so
+         that `builtin foo' still works after `enable -n foo'
+
+builtins/common.c
+       - have both find_shell_builtin, which never finds disabled builtins,
+         and builtin_address, which does
+
+                                  11/8
+                                  ----
+general.c
+       - the getdtablesize emulation should ensure that _SC_OPEN_MAX is
+         defined on Posix systems before trying to use it in a call to
+         sysconf()
+
+
+                                   11/10
+                                   -----
+lib/glob/fnmatch.c
+       - fixes from Roland McGrath for some of the more egregious bugs
+       - naturally, Roland missed a few
+
+lib/readline/readline.c
+       - add missing calls to sigemptyset(), since Posix specifies that
+         all sigset_t variables be initialized before use using it
+       - only turn off ISTRIP and INPCK in the termio(s) code if the
+         character size is 8 bits ((otio.c_cflag & CSIZE) == CS8)
+       - Sequents running Dynix/ptx should include <sys/pte.h> rather
+         that <sys/ptem.h>
+
+builtins/type.def
+       - change a call to printf to builtin_error when printing a
+         diagnostic that something is not found
+
+builtins/times.def
+       - changed file inclusion code to include <sys/time.h> and
+         <sys/resource.h> if HAVE_RESOURCE is defined, then to include
+         <sys/times.h> if !HAVE_RESOURCE and RUSAGE_SELF is not defined.
+         This catches systems with deficient <sys/resource.h> files
+
+                                   11/11
+                                   -----
+lib/readline/readline.c
+       - Don't try to dereference funmap in rl_named_function() if it's
+         null (as it is before rl_initialize_funmap is called)
+
+                                  11/12
+                                  -----
+lib/readline/readline.c
+       - backed out of change of 11/11 to rl_named_function
+
+bashline.c
+       - add a state variable bash_readline_initialized to keep track of
+         whether or not readline has been initialized with a call to
+         initialize_readline()
+
+builtins/bind.def
+       - if readline has not been initialized the first time this is
+         called, call initialize_readline
+
+                                  11/13
+                                  -----
+execute_cmd.c
+       - execute_subshell_builtin_or_function would only let the output
+         of `jobs' be piped if pipe_in and pipe_out were both != NO_PIPE
+         (?).  Obviously a typo.
+
+builtins/command.def
+       - add an unwind_protect to dispose of the new command created
+         by the call to make_bare_simple_command
+
+builtins/jobs.def
+       - add the `jobs -x command args' form from the System V.4 sh
+         All job specs in `args' are replaced with the appropriate
+         job's process group id and `command' is executed
+
+builtins/getopt.c
+       - if getopt() finds that optind > argc when it is called, it
+         sets optind = argc and returns EOF
+
+builtins/times.def
+       - backed out of 11/10 change.  Some systems, most notably
+         HP/UX have all the correct includes and defines and simply
+         do not implement getrusage().  At all.
+
+subst.c
+       - if sv_optind finds that OPTIND has been unset or set to an
+         empty string, call getopts_reset (0).  The Gnu getopt
+         resets its internal state when optind == 0.
+       - call getopts_reset(0) if OPTIND=1, because that's what the
+         Posix spec says to use to reset
+
+                                  11/14
+                                  -----
+builtins/alias.def
+       - fixed a typo in the SHORT_DOC for the unalias builtin
+
+builtins/shift.def
+       - allowed the shift count to be 0
+
+                                  11/15
+                                  -----
+lib/readline/readline.c
+       - turn on 8 bit characters if NO_EIGHT_BIT_CHARACTERS is not
+         defined and the Posix termios code path is being taken
+
+[The following two entries describe what's needed for an initial
+implementation of the vi mode `.' command]
+
+lib/readline/vi_mode.c
+       - new variables:
+               vi_last_command: last command that modified text in
+                                the buffer
+               vi_last_repeat: the repeat count to vi_last_command
+               vi_last_arg_sign: arg sign for vi_last_repeat
+               vi_last_motion: the last motion qualifier for the
+                               text modification commands that use one
+               vi_redoing: state variable, if 1 we're re-doing a
+                           command
+               vi_textmod: list of commands that modify text
+                           (initially "_*\\AaIiCcDdPpYyRrSsXx~")
+
+       - new functions:
+               rl_vi_redo: an initial implementation of the vi mode
+                           `.' command
+               rl_vi_set_last: initialize the state of the new variables
+                               described above
+               rl_vi_textmod_command: return true if command passed is
+                                      a text modification command
+       - changed rl_vi_domove to save the movement command information in
+         vi_last_motion
+       - changed rl_vi_movement_mode to call rl_vi_set_last to initialize
+         the `last command' state
+
+lib/readline/readline.c
+       - changed rl_dispatch to save vi_last_command, vi_last_repeat,
+         and vi_last_arg_sign
+       - changed rl_newline to call vi_set_last
+
+lib/readline/readline.h
+       - new function rl_vi_redo
+
+lib/readline/vi_keymap.c
+       - bind rl_vi_redo to `.'
+
+                                  11/20
+                                  -----
+posixstat.h
+       - make isc386 defines for S_IFDIR and S_IFMT be used if they
+         do not already appear, no matter whether or not gcc is being
+         used for the compile
+
+machines.h
+       - new entry for Omron Luna 88k running Mach 2.5 (nice machines)
+
+lib/readline/vi_mode.c
+       - fixed a bug with rl_vi_domove and the last word on the line.
+         If rl_point ended up > rl_end, it was being set to rl_end - 1
+         rather than to rl_end.
+
+cpp-Makefile
+       - quote the values of RANLIB and AR passed to makes in
+         subdirectories
+
+shell.c
+       - instead of making all Xenix systems swap the second and third
+         arguments to setvbuf, make that behavior dependent on the
+         definition of REVERSED_SETVBUF_ARGS
+
+                                  11/21
+                                  -----
+lib/readline/readline.c
+       - fixed an error in rl_forward that caused vi-mode to walk off
+         the end of the line after executing `l' in command mode on an
+         empty line
+
+                                  11/22
+                                  -----
+support/getcppsyms.c
+       - added the `luna88k' define
+
+                                   11/24
+                                   -----
+execute_cmd.c
+       - all calls to dup2 in do_redirection_internal should be checked
+         for errors and the redirection should fail if the dup2 fails
+
+shell.h, parse.y, execute_cmd.c, print_cmd.c, make_cmd.c
+       - replaced the single redirection operator `r_duplicating' with
+         r_duplicating_input and r_duplicating_output to avoid the
+         read 1<&7 getting printed as read 1>&7 problem:
+               foo()
+               {
+                       exec 9</dev/tty
+                       read 1<&9
+                       exec 9<&-
+               }
+         is printed wrong when `type foo' is executed
+
+shell.h
+       - added two new redirection_operators, r_duplicating_input_word and
+         r_duplicating_output_word to implement true sh semantics for
+         [n]<&word and [n]>&word
+parse.y
+       - eliminated the old yacc production for >& word, meaning put stdout
+         and stderr into `word'
+       - added productions for [n]<&word and [n]>&word that use the new
+         redirection operators
+execute_cmd.c
+       - the first thing done in do_redirection_internal is now a check for
+         r_duplicating_input_word and r_duplicating_output_word.  If the
+         redirection is one of those two, `word' is expanded and a new
+         redirection is made
+print_cmd.c
+       - new code to print the [n]<&word and [n]>&word redirections
+         (r_duplicating_input_word and r_duplicating_output_word)
+make_cmd.c
+       - new code for make_redirection to handle r_duplicating_input_word
+         and r_duplicating_output_word
+
+documentation/bash.1
+       - added documentation for the -x option to `jobs' + minor cleanups
+         and corrections
+
+                                  11/25
+                                  -----
+cpp-Makefile
+       - added GCC_EXTRAS for gcc-specific compiler flags
+
+execute_cmd.c
+       - removed some unused functions (close_all_files) and variables
+         (file_exists_p)
+
+parse.y
+       - added new command-oriented-style history: all lines of a multiple
+         line command will be added to the same history line
+       - new variable current_command_line_count to keep track of the
+         number of lines in the current command.  If > 1, a line is appended
+         to the current history line to implement command-oriented history
+       - new function bash_add_history
+
+shell.c
+       - added code to reset current_command_line_count to 0 before calling
+         parse_command and yyparse
+
+subst.c
+       - the command-oriented history is controlled by the setting of the
+         variable command_oriented_history
+
+builtins/reserved.def
+       - a new help topic: `variables', giving help on some common shell
+         variables
+
+                                  11/26
+                                  -----
+lib/glob/glob.c
+       - if the filename portion of the pathname to be matched is null
+         (e.g. a*/), do not call glob_vector to attempt to match each
+         file in the expanded directories against the null string.
+
+                                  11/27
+                                  -----
+lib/glob/glob.c
+       - force globbing of directory names even if the metacharacters
+         contained therein are protected by backslashes.  The globbing
+         strips the quotes correctly
+
+shell.c
+       - make sure current_command_line_count is declared everywhere
+         it's used
+
+parse.y
+       - remove declaration of history_lines_this_session from
+         pre_process_line
+       - add extern declaration of history_lines_this_session to
+         bash_add_history
+
+                                  12/2
+                                  ----
+trap.h
+       - removed inclusion of <sys/types.h> because most files include it
+         themselves, and this is dangerous on systems that do not protect
+         against multiple inclusion of header files
+
+trap.c
+       - include <sys/types.h> before "trap.h" since it was the only file
+         in the distribution not to do so
+
+shell.c
+       - Install the SIGINT sighandler the Posix way on machines with
+         _POSIX_VERSION defined
+
+                                  12/3
+                                  ----
+dispose_cmd.c
+       - make sure dispose_redirects properly handles r_duplicating_input_word
+         and r_duplicating_output_word by freeing the `filename'
+
+execute_cmd.c
+       - fix do_redirection_internal to copy new_redirect->redirectee.filename
+         using alloca() so no memory has to be freed at function exit
+
+                                  12/4
+                                  ----
+parse.y
+       - expand \n in PS1 or PS2 into \r\n only if line editing is enabled
+
+shell.c
+       - define top_level_mask if _POSIX_VERSION defined
+
+newversion.c
+       - made it write a definition of SCCSVERSION to version.h -- an SCCS
+         string so the `what' command will be useful
+
+version.c
+       - new variable `sccsversion' set to SCCSVERSION
+
+                                  12/5
+                                  ----
+builtins/fc.def
+       - make fc_gethist check that the history list is non-null before
+         trying to access its members
+
+                                  12/6
+                                  ----
+lib/readline/readline.c
+       - changed the ISTRIP code (again) to force bash to disable ISTRIP
+         only if the tty driver guarantees eight bits (cflag & CSIZE == CS8)
+
+                                  12/9
+                                  ----
+lib/readline/readline.c
+       - tgetent returns 0 if it can't find the terminal name in /etc/termcap,
+         so we failed if it returns <= 0, not < 0.
+
+                                  12/11
+                                  -----
+machines.h
+       - Sony machines running NEWS-OS 4.0 (V.4) should have strerror(),
+         so define HAVE_STRERROR
+       - Pyramids running BSD do not all have the vprintf family of functions,
+         so remove the definition of HAVE_VPRINTF
+
+                                  12/12
+                                  -----
+parse.y
+       - make sure that shell_getc always checks that shell_input_line is
+         valid before trying to reference shell_input_line[0]
+
+                                  12/13
+                                  -----
+mailcheck.c
+       - Since `dollar_underscore' saves the value of $_ in a local variable,
+         it's possible that bind_variable can free and reallocate the cell
+         for $_, leaving dollar_underscore pointing at freed storage.  The
+         fix is to copy it into freshly-allocated memory.
+       - ensure that when saving and restoring dollar_underscore that we do
+         not try to call strlen on a null string
+
+                                   12/15
+                                   -----
+general.c, execute_cmd.c
+       - moved the utility function `all_digits' from execute_cmd.c to
+         general.c
+
+builtins/kill.def
+       - remove use of sscanf, used calls to all_digits and atoi instead
+
+machines.h
+       - if not using gcc, need to make SYSDEP_LDFLAGS = -Xp for Posix
+         on isc386
+
+                                  12/16
+                                  -----
+machines.h
+       - isc386 has multiple groups
+
+execute_cmd.c
+       - add a QUIT to the while loop in find_user_command_in_path that
+         searches the path, so users can interrupt a lengthy path search
+
+                                  12/17
+                                  -----
+builtins/alias.def
+       - added the Posix-specified -a option to unalias, made unalias obey
+         the getopt argument syntax guidelines
+
+builtins/jobs.def
+       - made `jobs' handle the -- option to signal the end of arguments
+
+flags.c
+       - Posix.2a has specified that the -b flag stand for asynchronous
+         notification, so move the definition of asynchronous_notification
+         here and add a new entry to the `flags' struct if JOB_CONTROL is
+         defined
+
+flags.h
+       - add an extern declaration of asynchronous_notification
+
+jobs.c
+       - change the definition of asynchronous_notification to extern, since
+         it's now declared in flags.c
+
+builtins/set.def
+       - change documentation strings to add -b option, note that
+         set -o notify is now the same as set -b
+       - change the code to make set -o notify the same as set -b
+         (list_long_opts(), take the special case out of set_minus_o_option)
+
+                                  12/19
+                                  -----
+lib/readline/readline.c
+       - added support for $LINES, $COLUMNS.  The variables are read after
+         the ioctl(TIOCGWINSZ) and before calls to tgetent
+
+builtins/fc.def
+       - made the fc output format correspond to that specified by Posix.2a 
+         ("%d\t%s\n")
+
+                                  12/20
+                                  -----
+execute_cmd.c
+       - user_command_matches did not properly handle a null $PATH element,
+         which should be the same as ".".  Changed the code to mirror
+         find_user_command_in_path ()
+
+
+                                   12/23
+                                   -----
+execute_cmd.c
+       - added a new function get_next_path_element, which calls
+         extract_colon_unit and interprets the result, translating
+         "" to "."
+
+builtins/cd.def
+       - added description of -l option to dirs short_doc
+       - fixed the bug that caused `dirs' to always print an extra
+         trailing space
+
+documentation/bash.1
+       - added description of -l option to dirs
+
+parse.y
+       - added optional leading ( for case clause, as per Posix.2
+
+                                  12/30
+                                  -----
+lib/readline/vi_mode.c
+       - removed unused variable `added_blank'
+
+bashline.c
+       - added dynamic completion from bfox
+
+execute_cmd.c
+       - redirections must be performed in a child before execution of
+         the command is attempted or aborted (because it's not found
+         by a hash table or $PATH search), according to Posix.2
+
+getcwd.c
+       - new file, from the Gnu C library, for systems that don't do
+         this right -- they use popen("/bin/pwd", "r") instead
+
+                                  12/31
+                                  -----
+builtins/type.def
+       - the type builtin would not report a name as not found if any name
+         had previously been found because the flag variable used to report
+         this (found_something) was not reset each time through the loop.
+         Added a variable `found_any' to be global and reset found_something
+         to 0 each time through the loop
+
+                                    1/4
+                                    ---
+builtins/jobs.def
+       - make sure that the call to add_unwind_protect in
+         execute_list_with_replacements is made after the new command
+         struct is completely initialized
+
+support/mksysdefs
+       - look for /dev/fd, define HAVE_DEV_FD if present
+
+cpp-Makefile
+       - pass HAVE_DEV_FD through to make in SYSTEM_FLAGS
+
+shell.c, execute_cmd.c
+       - call unlink_fifo_list only if HAVE_DEV_FD is not defined and
+         PROCESS_SUBSTITUTION is defined
+
+subst.c
+       - new function make_dev_fd_filename to return /dev/fd/xx, where
+         xx corresponds to the parent end of the pipe
+       - all the named pipe utility functions should be #if !defined
+         (HAVE_DEV_FD)
+       - change process_subsitute to do the following on systems with /dev/fd:
+               1.  Make a pipe in the parent
+               2.  if (open_for_read_in_child)
+                       parent_pipe_fd = fildes[1]
+                       child_pipe_fd = fildes[0]
+                   else
+                       parent_pipe_fd = fildes[0]
+                       child_pipe_fd = fildes[1]
+               3.  pathname = make_dev_fd_filename (parent_pipe_fd);
+               4.  fork
+               5.  In parent, close child_pipe_fd and return pathname
+               6.  In child, turn off job control, dup child_pipe_fd to
+                   either fd 0 or 1 depending on OPEN_FOR_READ_IN_CHILD,
+                   close parent_pipe_fd, parse and execute the string,
+                   and exit
+
+shell.c
+       - added call to unlink_fifo_list in reader_loop so that all fifos
+         get closed, even after builtin commands are executed
+
+                                   1/6
+                                   ---
+machines.h, make_cmd.c, print_cmd.c, shell.c, cpp-Makefile
+       - HAVE_VPRINTF --> HAVE_VFPRINTF
+
+cpp-Makefile, machines.h, test.c
+       - HAVE_MULTIPLE_GROUPS --> HAVE_GETGROUPS
+
+cpp-Makefile, machines.h
+       - HAVE_SIGLIST --> HAVE_SYS_SIGLIST
+
+parse.y
+       - add if_command production
+
+builtins/echo.def
+       - validate all arguments before using them so that -nanything != -n
+       - document the -E option and its use
+
+builtins/umask.def
+       - allow other arguments to be used with -S
+
+subst.c
+       - make sure to close all files in the child created to run a
+         process substutition to avoid holding write file descriptors
+         to pipes that will cause the shell to hang
+
+                                   1/7
+                                   ---
+cpp-Makefile
+       - fixed a typo: SEARCHLIB -> SEARCH_LIB
+
+machines.h
+       - new description for Amiga 3000 running System V.4
+
+shell.c
+       - default secondary prompt is now "> "
+
+builtins/bashgetopt.c
+       - more internal cleanups and bug fixes
+
+support/mksysdefs
+       - detect the amiga by the presence of /usr/amiga
+
+                                   1/9
+                                   ---
+general.c
+       - canonicalize_pathname should remove ./ only if it's at the
+         beginning of the pathname, or immediately preceded by a `/'
+
+                                  1/10
+                                  ----
+documentation/bash.1
+       - clean up the documentation for test -t, since according to
+         Posix, it always requires an argument
+
+general.c
+       - don't build index and rindex for DG machines
+
+
+machines.h
+       - description for System V.4 on IBM 370 architecture
+       - fixed up DG/UX machine description
diff --git a/CWRU/old-changelogs/CWRU.chlog.v8 b/CWRU/old-changelogs/CWRU.chlog.v8
new file mode 100644 (file)
index 0000000..2aa1437
--- /dev/null
@@ -0,0 +1,251 @@
+[ Work begins after network release of version 1.11 ]
+
+                                    1/11
+                                    ----
+nojobs.c
+       - Posix systems now reap zombie children and retry a fork() once if
+         it fails
+       - Posix systems should use waitpid() rather than wait() wherever
+         possible
+       - Posix systems do not need to validate a pid before calling waitpid()
+         in wait_for_single_pid(); waitpid takes a pid argument
+
+                                  1/13
+                                  ----
+execute_cmd.c
+       - get_next_path_element can return NULL, so the code that calls it
+         must take that possibility into account
+
+jobs.c
+       - there was an extra parameter in the select() call
+
+builtins/type.def
+       - successful_finds needed to be initialized to 0
+
+machines.h
+       - fixed a typo (_D -> -D) in the DG/UX machine description
+
+                                  1/14
+                                  ----
+execute_cmd.c
+       - fixed extract_colon_unit to return "" in the case of a trailing
+         colon in the path
+
+INSTALL
+       - note that on SCO Xenix 386 one must use cc -E rather than /lib/cpp
+         to process cpp-Makefile
+
+cpp-Makefile
+       - fixed the problem of a single quote in a makefile comment
+
+machines.h
+       - Xenix 386 machines need -DUSG in SYSDEP_CFLAGS
+
+lib/readline/readline.c
+       - changed the includes around so that the Xenix 386 support is
+         in the same section as the USGr3 code, and the Xenix 286
+         support is in the same section as the plain USG code
+
+shell.c
+       - split the `int code = setjmp (top_level)' statement in
+         reader_loop into two statements -- some compilers don't like
+         it
+
+parse.y
+       - changed the overloaded `yy_input_dev' to a `union STREAM',
+         where a `union STREAM' is
+
+               typedef union STREAM {
+                       FILE    *s_file;
+                       char    *s_string;
+               } STREAM;
+
+         and changed the parameter to init_yy_io and all the functions
+         that call it to use a STREAM argument instead of casting back
+         and forth between a (char *) and a (FILE *)
+
+builtins/times.def
+       - If hpux or USGr4, #undef HAVE_RESOURCE, rather than try to fit
+         all the special cases onto a single line deciding whether or
+         not to include <sys/resource.h>
+
+                                  1/15
+                                  ----
+bashline.c
+       - changed the bindable name for the ksh-style ^O function from
+         operate_and_get_next to operate-and-get-next
+
+execute_cmd.c
+       - some systems (e.g SGI) allow the result of alloca to be assigned
+         only to a `simple' variable, so I introduced a dummy one instead
+         of assigning to redirectee->word directly
+
+shell.c
+       - fixed a typo: PENDANTIC -> PEDANTIC
+
+machines.h
+       - took -DREVERESED_SETVBUF_ARGS out of the entries for Xenix 386
+
+cpp-Makefile
+       - added double quotes around the RHS of the assignment to
+         SYSTEM_NAME to avoid further cpp processing if the system name
+         happens to be a cpp define
+
+bashline.c
+       - added `search-forward', `search-backward' functions that perform
+         non-incremental history searches using the vi-mode code
+
+                                  1/16
+                                  ----
+builtins/ulimit.def
+       - fixed a typo in a comment
+       - added parens around the object in an #if defined preprocessor
+         statement
+
+machines.h
+       - the Xenix 386 machine descriptions need to #undef HAVE_GETWD
+
+builtins/read.def
+       - Fixed read to treat backslash as an escape character unless
+         -r is given, as per Posix.2
+
+lib/readline/readline.c
+       - Fixed up the maze of dire[cn]t includes and defines so that
+         they're correct for Xenix (finally)
+
+lib/glob/glob.c
+       - ditto.  Now the defines/includes are correct for Xenix 386
+
+execute_cmd.c
+       - a loop of the form
+                       while : ; do echo -n 1; done
+         can run a machine using Gwyn's alloca() emulation out of memory
+         because alloca() keeps getting called at the same stack level
+         and never frees anything up.  Added a call to alloca(0) after
+         the call to execute_simple_command in execute_command_internal
+       - added Karl Kleinpaste's workaround for the AFS file creation
+         bug, dependent on AFS_CREAT_BUG
+
+parse.y
+       - \s in a prompt string needs to decode to the shell basename, as
+         per the documentation, rather than the full shell name
+
+                                  1/17
+                                  ----
+nojobs.c
+       - fixed a typo in one of the WAITPID calls, thanks to Bruce Evans
+
+[At this point, all of these fixes were sent along to bfox]
+
+support/getcppsyms.c
+       - now recognizes cpp symbol __hppa for use on HP precision
+         architecture machines
+
+machines.h
+       - M_MACHINE is now `hppa' for HP Precision Architecture machines, so
+         to make sure hpux is defined, it's now in SYSDEP_CFLAGS
+       - Make sure that the RS6000/AIXv3 description defines M_OS as AIX,
+         not "AIX".  The quotes are added in cpp-Makefile
+
+                                  1/27
+                                  ----
+parser.h
+       - new file, contains structures necessary to parse commands
+
+input.h
+       - new file, contains definitions and structures used to read input
+
+bashline.c
+       - removed the definitions for search-backward, search-forward
+
+cpp-Makefile
+       - removed the definition of DESTDIR; now passed down from Makefile
+
+error.c, error.h
+       - new files to isolate the error-handling functions
+
+command.h
+       - new file including structures used internally to represent
+         commands
+
+parse.y
+       - include input.h, parser.h
+       - changed all the code that deals with input streams to fit the
+         new framework defined in input.h
+
+make_cmd.c
+       - moved the error reporting code to error.c
+       - added cpp code to ensure that alloca is defined correctly
+
+shell.h
+       - removed the code that was moved to input.h, parser.h, command.h
+
+builtins/common.c
+       - moved a call to setjmp out of an if statement
+       - changed the input code to work with the new input framework
+
+builtins/getopt.c
+       -include config.h if compiling for the shell
+
+lib/readline/readline.c
+       - change representation of characters > 127 to octal
+         rather than M-c
+       - changed representation of characters < ' ' to ^X rather
+         than C-x
+       - fixed a memory leak in parser_if () by freeing `tname'
+
+machines.h
+       - removed MIPS_CFLAGS from the ultrix Decstation entry, since the
+         limit no longer needs increasing
+
+variables.c
+       - move the initialization of PWD before the environment is read, so
+         an exported version of PWD takes precedence
+
+readline.c, funmap.c, emacs_keymap.c
+       - removed support for rl_arrow_keys -- it should now be done by the
+         inputrc file
+
+documentation/bash.1
+       - only non-job-control shells start background jobs ignoring SIGINT
+         and SIGQUIT
+
+builtins/umask.def
+       - don't print the octal representation of the umask if the symbolic
+         representation has already been displayed
+       - a bad option to umask should return EXECUTION_FAILURE, not -1
+
+shell.c
+       - new function, init_signal_handler (sig), to initialize the SIG
+         signal hander, call it in main loop
+
+nojobs.c
+       - call init_signal_handler (SIGINT, sigint_sighandler) so the correct
+         thing happens on Posix systems
+
+general.c
+       - updated the comment above the fallback implemenation of killpg()
+
+machines.h
+       - machine entry for the Unix PC
+       - new variable HAVE_DIRENT
+
+                                  1/28
+                                  ----
+machines.h
+       - SCO needs to #undef HAVE_GETCWD so that the getcwd() function
+         supplied with bash is used
+
+subst.c
+       - USG machines should include <string.h>, others <strings.h>
+       - sub_append_number should use itos() rather than xmalloc and
+         sprintf
+
+builtins/ulimit.def
+       - changed the resource limit struct to one that has no explicit
+         size to account for systems with differing numbers of resource
+         limits
+
+lib/readline/readline.c
+       - there was an off-by-one error in the code that counts the number
+         of items to list when doing completion listing
diff --git a/CWRU/old-changelogs/CWRU.chlog.v9 b/CWRU/old-changelogs/CWRU.chlog.v9
new file mode 100644 (file)
index 0000000..d1474fb
--- /dev/null
@@ -0,0 +1,5062 @@
+[work begins on post-netwide-1.12 release.]
+
+                                  1/30
+                                  ----
+machines.h, general.c, nojobs.c
+       - changes for AIX/RT 2.2.1
+
+lib/readline/vi_mode.c
+       - fixed a bug with vi mode, `cw' and whitespace that removed the
+         last character of the previous word
+
+lib/readline/readline.c
+       - readline did not correctly save the value of last_readline_init_file
+         across things like `bind'.  Now it does the following:
+
+               last_readline_init_file initialized to NULL
+               readline_initialize_everything calls rl_read_init_file with
+               an explicit argument of ~/.inputrc
+               rl_read_init_file sets last_readline_init_file to
+               savestring(filename) so it saves a fresh copy
+
+getcwd.c
+       - new version from Roland McGrath, with changes for the bash build
+         environment
+
+execute_cmd.c, variables.c
+       - bash was not looking for $PATH in the temp environment when
+         looking up a command.  Now, find_variable looks in the temp
+         environment if subshell_environment is set.  This will be
+         set when bash is looking a command up in the path (it's set in
+         find_user_command_internal while looking up the path string to
+         pass to find_user_command_in_path)
+
+                                  1/31
+                                  ----
+make_cmd.c
+       - removed useless call to alloca, replaced with a static array
+         definition
+
+                                   2/3
+                                   ---
+machines.h
+       - Cray machine description
+
+                                   2/4
+                                   ---
+builtins/getopt.[ch]
+       - upgraded to a more recent version from the Gnu C library
+
+jobs.c
+       - added a call to init_signal_handler to replace equivalent in-line
+         code in initialize_jobs
+
+trap.c
+       - new function: maybe_call_trap_handler (sig) calls a trap function
+         for signal SIG if one exists
+
+jobs.c
+       - bash now (effectively) ignores SIGINT while waiting for a job run
+         from a script.  We don't want to die if a SIGINT is received while
+         running another process, only if that job dies due to SIGINT.  This
+         lets interactive processes run from scripts that want to catch
+         SIGINT and handle it do so without disturbing the shell that's
+         interpreting the script.  All other versions of sh behave this way.
+
+         The implementation is fairly straightforward.  In wait_for, the
+         parent shell sets the SIGINT handler to wait_sigint_handler, which
+         allows the wait builtin to be interrupted and sloughs off everything
+         else.  flush_child controls the behavior when a `foreground' process
+         dies due to SIGINT: it calls a trap handler if one exists;
+         otherwise it calls either sigint_sighandler (interactive) or
+         termination_unwind_protect (non-interactive).  It then resets the
+         SIGINT signal handler to what it was before wait_for changed it.
+         wait_for does reset the sighandler before returning if flush_child
+         does not, so the SIGINT does not stay ignored.
+
+         There is a race condition between the time that make_child creates
+         a child and sets it to run and the time the parent calls wait_for.
+         This is handled by having old_sigint_handler, which holds the
+         value of the `real' SIGINT signal handler, be NULL except when the
+         shell is in wait_for, and only operate on the SIGINT handler state
+         if this variable is non-null.
+
+         Should the stuff be unwind-protected?  I don't think so; u-p gets
+         run on interrupts, and we're controlling the interrupt handler.
+
+                                   2/5
+                                   ---
+trap.c
+       - new function signal_is_trapped (sig) returns 1 if a trap handler
+         has been established for SIG
+
+shell.c
+       - have throw_to_top_level call longjmp(top_level, DISCARD) if the
+         shell is non-interactive and a SIGINT occurred and was trapped
+
+cpp-Makefile, machines.h
+       - instead of running `basename ...` to discover the name of the
+         alloca object file, use a new variable $ALLOCA_OBJECT.  It's set
+         to alloca.o if we're using the C emulation, and to ALLOCA_OBJ,
+         which must be defined in the machines.h entry, for an
+         architecture defining ALLOCA_ASM
+
+cpp-Makefile
+       - BSD make of 4.3-tahoe and later already defines MACHINE and does
+         not allow it to be overridden, so replace it with Machine.
+
+endian.c
+       - added changes from Cray to configure endianness correctly on
+         machines with 8-byte longs
+
+parse.y
+       - added '&' to no_semi_successors in bash_add_history so bash will
+         not add a semicolon after it appears
+
+                                   2/6
+                                   ---
+subst.c
+       - since string_extract_verbatim was overloaded, added a new function
+         string_extract_single_quoted to call when extracting strings in
+         ''
+
+lib/readline/history.c
+       - changed call to string_extract_verbatim to a call to
+         string_extract_single_quoted
+
+lib/readline/vi_mode.c
+       - rl_vi_subst was not calling rl_end_undo_group properly (i.e. at all)
+
+execute_cmd.c
+       - On systems without job control, async commands (`&') have an
+         extra redirection added before calling execute_command_internal
+         that redirects /dev/null to standard input.  This redirection
+         must be removed right after execute_command_internal returns,
+         because the loop functions call execute_command_internal multiple
+         times with the same command struct.  If we keep tacking redirections
+         onto the front of it, eventually we'll run out of file descriptors
+         on a big enough loop.
+
+jobs.c
+       - some functions were not correctly blocking SIGCHLD while running:
+         delete_all_jobs, map_over_jobs, start_job when it calls
+         reset_current
+
+                                   2/7
+                                   ---
+print_cmd.c
+       - an extra space was being printed at the end of a redirection list.
+         This caused exporting of functions with embedded here-documents to
+         fail, since the end marker would not be matched
+
+                                    2/8
+                                    ---
+nojobs.c
+       - change reap_zombie_children to keep calling waitpid while it returns
+         something > 0 (a valid pid)
+       - add a call to reap_zombie_children if we get a valid pid after
+         waiting in wait_for
+
+variables.c
+       - include pwd.h after sys/types.h.  It matters on some systems.
+
+shell.c
+       - added a function to encapsulate the differences between systems
+         in setting a file pointer to line-buffered: line_buffer_file
+
+                                   2/9
+                                   ---
+shell.c
+       - unbuffer stdin when it's not a tty and bash is reading a script
+         from stdin
+
+                                  2/10
+                                  ----
+
+machines.h, cpp-Makefile
+       - a new machine description variable HAVE_DIRENT, passed down to
+         makes in libraries
+
+support/mksysdefs
+       - check for the existance of /usr/include/dirent.h, define
+         HAVE_DIRENT_H if there
+
+                                  2/11
+                                  ----
+machines.h
+       - add #define USE_TERMCAP_EMULATION to HP-UX machine description
+       - added #define HAVE_DIRENT to a number of entries
+
+jobs.h
+       - added missing definitions for WSTOPSIG, WTERMSIG, WEXITSTATUS
+         for Posix systems that do not have them and do not have the
+         `union wait' defined
+
+builtins/suspend.def, unwind_prot.c, longest_sig.c
+       - include <sys/types.h> before <signal.h> -- some systems require
+         it
+
+support/mksysdefs
+       - For HP machines running HPUX, SYSDEF is set to one of hpux8, hpux7,
+         hpux6, or hpux, corresponding to different releases of HP-UX.
+       - if `uname -m' returns something starting with XD88, the machine is
+         a Tektronix XD88
+
+                                  2/12
+                                  ----
+variables.c
+       - stop core dumping on startup if SHLVL is not set
+
+lib/glob/glob.c
+       - make sure we always recurse and glob the entire filename so the
+         quoting characters added in shell_glob_filename get removed
+         correctly
+
+jobs.c
+       - new function end_job_control to terminate stopped jobs and
+         give the terminal back to the original pgrp
+       - new function restart_job_control to re-initialize the job
+         control state
+
+builtins/exec.def
+       - call end_job_control before we try to execve the command so
+         we're back in the original process group for the new process
+         and restart_job_control if the shell_execve fails and we're
+         not exiting
+
+shell.c
+       - change the code that resets the pgrp just before exiting to
+         call end_job_control instead
+
+lib/readline/chardefs.h
+       - new define, MACRO_CHAR
+
+lib/readline/readline.c
+       - changed rl_generic bind to correctly handle binding keys > 128
+         by using the appropriate meta keymap (map[ESC].function as a
+         keymap)
+       - changed rl_dispatch, rl_show_char, and rl_bind_key to use
+         UNMETA instead of substracting 128 and to use META_CHAR to
+         check for a character's `meta-ness'
+
+                                  2/13
+                                  ----
+lib/readline/readline.c, lib/glob/glob.c
+       - define HAVE_DIRENT if it's not defined but HAVE_DIRENT_H is
+
+lib/readline/history.c
+       - instead of calling write(2) twice for each history line, build
+         a big buffer of all the history data to write, fill it, and
+         call write(2) once
+
+subst.c
+       - wrapped up the eight-bit changes by making the single-quoted
+         strings and double-quoted strings code in expand_word_internal
+         simply discard a word if it's "" or '' and that's not the
+         entire word.  This preserves sh semantics.
+
+parse.y
+       - If process substitution is compiled into the shell, there was
+         a mistake by which <[ and >[ were treated the same as $[
+
+lib/glob/glob.c, lib/readline/readline.c
+       - Reorganized the twisty maze of defines for HAVE_DIRENT
+
+                                  2/14
+                                  ----
+posixstat.h
+       - removed lines consisting of only a single #.  Some ANSI cpps
+         don't like lines like that
+
+execute_cmd.c
+       - added a call to QUIT between commands in cmd1 ; cmd2 sequence
+
+test.c
+       - removed redundant declaration of expr() in test_command()
+
+                                    2/16
+                                    ----
+builtins/Makefile
+       - added dependencies on the header files in the main shell directory
+
+jobs.c, jobs.h, builtins/fg_bg.def, builtins/kill.def
+       - replaced the notified, foreground, and job_control members of the
+         job structure with a flags field and bits J_NOTIFIED, J_FOREGROUND,
+         and J_JOBCONTROL
+
+subst.c
+       - fixed a typo (result[0] == '\0') in EIGHT_BIT version of
+         dequote_string
+
+cpp-Makefile
+       - added dependencies for the builtin object files
+
+execute_cmd.c
+       - complete fix from 2/14 -- add QUIT calls to &&, ||, and `;' when
+         executing a command and ignoring the return value
+
+jobs.c
+       - if a job is suspended while running in a loop, break out of the
+         loop
+
+nojobs.c
+       - made the same wait_sigint_handler and wait_for changes as those
+         made to jobs.c
+
+shell.c
+       - moved the code that adds 128 to last_command_exit_value before
+         any SIGINT trap handler is run
+
+subst.c
+       - if a word is enclosed completely in "" or '', set the quoted
+         flag when the word is returned from expand_word_internal. This
+         keeps the globbing routines from being called
+
+                                  2/17
+                                  ----
+shell.c
+       - use shell_name instead of (++argv[0]) when testing for a
+         restricted shell
+
+                                  2/18
+                                  ----
+general.c
+       - redid the defines for index and rindex to define and use
+         HAVE_INDEX and HAVE_RINDEX, respectively
+
+machines.h
+       - added HAVE_DIRENT to the AIXRT machine description
+
+jobs.c
+       - define and use INVALID_SIGNAL_HANDLER as something old_sigint_handler
+         cannot be set to
+
+                                  2/19
+                                  ----
+
+config.h
+       - made restricted shell mode configurable, #define RESTRICTED_SHELL
+
+shell.c, flags.c, execute_cmd.c, builtins/cd.def
+       - add code to implement ksh/sh restricted shell mode
+
+shell.c
+       - new function maybe_make_restricted (name) which turns the shell
+         into a restricted shell if name == `rbash'
+
+lib/readline/readline.c
+       - fixed rl_key_sequence_length problem when meta-ized characters are
+         read (one too short).  This left extra characters in macros when
+         end-kbd-macro was bound to a meta-ized character
+
+builtins/common.c
+       - added set_working_directory (name) as analog of
+         get_working_directory
+
+variables.h
+       - added `imported' variable attribute
+
+                                  2/20
+                                  ----
+Makefile
+       - DESTDIR -> bindir
+       - aix-Makefile -> ansi-Makefile because an ANSI C compiler like that
+         in SunOS5 (hah!) need not accept /**/# as a directive
+
+bashline.c
+       - added code from bfox to do completion into brace expansions
+       - use BUILTIN_ENABLED flag
+
+builtins.h
+       - added a flags field to struct builtin to replace the `enabled'
+         structure member
+
+cpp-Makefile
+       - set SHELL=MAKE_SHELL if MAKE_SHELL is defined
+       - added support for the LD_HAS_NO_DASH_L definition from machines.h
+       - PROGRAM -> Program
+       - support for the new LD_HAS_NO_DASH_L machine defintion variable
+
+execute_cmd.c
+       - removed the subshell_environment variable
+       - find_user_command_internal now calls find_variable_internal
+
+general.c
+       - moved init_signal_handler here, changed name to set_signal_handler
+
+general.h
+       - added definition for set_signal_handler for non-Posix systems
+
+jobs.c
+       - now print `Done' when a background job exits with status 0
+
+machines.h
+       - combined all of the Sun machine descriptions into one
+       - new descriptions for SunOS5, Alliant, Motorola Delta 68k
+       - completely redid the HPUX description, making M_MACHINE much more
+         specific rather than just `hpux'
+
+nojobs.c
+       - change all instances of signal() to set_signal_handler()
+
+shell.c
+       - removed definition of init_signal_handler
+       - changed more instances of signal to set_signal_handler
+
+subst.c
+       - monster reformat
+
+variables.c
+       - added a function find_variable_internal that can be explictly told
+         to search the temporary environment, changed find_variable to call
+         it
+       - changed all variables and functions from the initial shell
+         environment to have the `imported' attribute
+       - made set_func_auto_export return the pointer to the function struct
+
+builtins/Makefile
+       - ar clq --> ar cq
+
+builtins/cd.def
+       - `pushd_silent' is gone
+
+builtins/common.c
+       - there is no more `enabled' member of a builtin struct;
+         test with BUILTIN_ENABLED instead
+
+builtins/enable.def, builtins/help.def
+       - use BUILTIN_ENABLED bitmask
+
+builtins/mkbuiltins.c
+       - initialize all builtins to be BUILTIN_ENABLED | STATIC_BUILTIN
+
+lib/glob/Makefile
+       - ar clq -> ar cq
+
+lib/glob/glob.c
+       - added another shell interruption point
+       - reorganized the twisty maze of dirent defines to use HAVE_DIRENT_H
+
+lib/readline/readline.c, lib/readline/funmap.c
+       - put rl_arrow_keys back in
+
+lib/readline/Makefile
+       - ar clq -> ar cq
+
+lib/readline/readline.c
+       - reorganized the twisty maze of dirent defines to use HAVE_DIRENT_H
+       - made the search string for i-searches dynamically allocated and
+         expandable rather than using alloca
+       - turned on USE_XON_XOFF again
+       - RL_DEFAULT_INPUT_FILE -> DEFAULT_INPUTRC
+
+support/cppmagic
+       - added `legal' to the list of unknown flags
+
+support/getcppsyms
+       - now recognizes _M88KBCS_TARGET
+
+support/mksysdefs
+       - code to distinguish SunOS5 from SunOS4
+       - aix-Makefile -> ansi-Makefile
+
+lib/readline/vi_mode.c
+       - after completing with `*' or `\', Posix.2a says to go into
+         insertion mode
+       - for c[wW], don't move back any farther than we started to
+         emulate c[eE] -- Posix.2 says the cursor position should not
+         change
+
+variables.c
+       - if we get PWD from the environment, and it's the same directory
+         as `.' (calling same_file) set the_current_working_directory
+         to that value
+
+builtins.h
+       - added a #define for SPECIAL_BUILTIN
+
+mksysdefs
+       - Xenix systems now have one of XENIX_22, XENIX_23, or XENIX_32
+         defined based on the OS release level
+       - test for /dev/fd being a directory and /dev/fd/0 being readable
+         to decide whether or not we have the /dev/fd way of naming open
+         files
+
+                                  2/24
+                                  ----
+builtins/common.c
+       - set_working_directory is now a void
+
+general.c
+       - new implementation of canonicalize_pathname from bfox
+         (+ bug fixes, of course)
+
+bashline.c
+       - make bash_symbolic_link_hook call canonicalize_pathname
+
+variables.c
+       - set_func_auto_export no longer returns a SHELL_VAR *
+
+lib/readline/readine.c
+       - added code to determine whether or not the terminal has a
+         meta key and to use it while editing if one is available
+
+subst.c
+       - minor bug fix to remove_quoted_escapes (logic bomb :-)
+
+                                  2/25
+                                  ----
+machines.h
+       - cleaned up the hpux section.  Cannot define M_OS as HPUX_X,
+         because HPUX_X is already defined as expanding to nothing;
+         this results in a blank M_OS
+
+       - attempted to rationalize Xenix support.  Depending on the
+         XENIX_nn define provided by support/mksysdefs, configure in
+         -DREVERSED_SETVBUF_ARGS, -xenix, -lx, -ldir, and HAVE_DIRENT
+
+               Xenix 2.2: -DREVERSED_SETVBUF_ARGS
+                          cc -lx
+
+               Xenix 2.3: HAVE_DIRENT
+                          cc -ldir
+
+               Xenix 3.2: HAVE_DIRENT
+                          cc -xenix -ldir
+
+                                  2/26
+                                  ----
+builtins/source.def
+       - POSIX_PENDANTIC -> POSIX_PEDANTIC
+
+                                  2/27
+                                  ----
+support/getcppsyms.c
+       - consolidated HP definitions to be of the form
+
+               #if defined (__hp9000s300) || defined (hp9000s300)
+                 printf (" -Dhp9000s300")
+               #endif /* __hp9000s300 || hp9000s300 */
+
+machines.h
+       - changed the way the hp9000s300 tests for hp9000s200 being defined
+
+support/mksysdefs
+       - changed the XENIX_nn defines a little bit
+
+input.c
+       - new input buffering package -- like stdio but allows syncing with
+         the underlying file descriptor when creating child processes, and
+         provides a fd-stream mapping.
+
+input.h, shell.c, jobs.c
+       - changes for the input buffering package, using default_buffered_input
+         in place of default_input
+
+general.c
+       - fix canonicalize_pathname to keep from running off the end of the
+         result string (check result[i] before assigning start = i++)
+
+jobs.c
+       - change some calls to signal to call set_signal_handler instead
+
+                                    2/29
+                                    ----
+shell.c
+       - only initialize default_buffered_input to the input file
+         descriptor if the shell is not interactive
+
+builtins/getopt.c
+       - cast the arguments properly in calls to my_bcopy
+
+execute_cmd.c
+       - added code to do_redirection_internal to change buffered streams
+         if one of the file descriptors corresponding to a buffered input
+         stream is modified.  This lets the shell do proper buffering if
+         the file descriptor from which the shell is reading input is
+         modified by a redirection (e.g., exec 0</etc/passwd)
+
+input.c, shell.c, parse.y, jobs.c, nojobs.c
+       - changed default_buffered_input to an integer file descriptor that
+         is mapped to a buffered stream via the `buffers' array
+
+input.c
+       - the `buffers' array is now lazily dynamically allocated
+       - added functions to duplicate buffered streams so that things like
+         exec 0<&4 will work right
+       - added functions to access the buffered stream functionality given
+         a file descriptor argument, indexed through the `buffers' array.
+       - unbuffered streams now have bp->b_size == 1, so that no special-
+         case code is needed when reads are done.
+
+input.h
+       - the member of the BASH_INPUT union in effect if it describes a
+         buffered stream is now a file descriptor
+
+jobs.c
+       - SCO 3.2.4 has fixed the sigsuspend() bug, so don't execute the
+         hack workaround if SCOv4 is defined
+
+                                    3/1
+                                    ---
+builtins/common.c
+       - made shell_builtin_compare perform some tests itself before
+         calling strcmp to cut down the number of strcmp calls
+       - did the same thing for builtin_address_internal
+
+parse.y
+       - removed calls to strcmp from read_token, just test if token[0] == }
+         and !token[1]
+       - only call clearerr if bash_input.type == st_stream in shell_getc
+       - removed a call to strcpy from shell_getc that only added a newline;
+         changed it to two assignment statements
+       - used token_index instead of a call to strlen at the end of
+         read_token where the word is being constructed and returned
+
+unwind_prot.c
+       - changed a strcmp to a STREQ in unwind_frame_run_internal
+
+variables.c
+       - removed some dead code that had been #if'd out
+       - added a variable to avoid a call to strlen in
+         initialize_shell_variables
+       - change a call to strncmp to a STREQN in initialize_shell_variables
+       - changed strcmp to STREQ in non_unsettable
+
+                                   3/2
+                                   ---
+jobs.c
+       - rearranged the code that calls flush_child (0) for SCO so it is
+         easier to do something like SCO && !SCOv4
+       - changed flush_child so that the loop is performed in a blocking
+         fashion only if SCO && !SCOv4
+
+                                   3/3
+                                   ---
+signames.c
+       - new standalone program to create a signames.h file that contains
+         the initialization code for the signal_names array
+
+trap.h
+       - removed the signal_names array initialization code
+       - include "signames.h"
+
+cpp-Makefile
+       - make sure signames.aux builds signames.h correctly
+
+input.c
+       - changed fd_is_seekable and bufstream_getc into macros
+
+mksysdefs
+       - changes to define SCOv4 if uname returns the right info
+
+machines.h
+       - changes to define BROKEN_SIGSUSPEND and NO_DEV_TTY_JOB_CONTROL
+         for various SCO systems
+
+jobs.c
+       - check for BROKEN_SIGSUSPEND and NO_DEV_TTY_JOB_CONTROL instead
+         of using SCO
+
+                                   3/4
+                                   ---
+general.c
+       - make set_signal_handler return the old signal handler again
+
+shell.c
+       - set SIGINT handler to sigint_sighandler for non-interactive shells
+       - remove SIGQUIT from list of terminating signals
+
+                                   3/5
+                                   ---
+builtins/trap.def
+       - added special SIGINT handling for the case of reverting a signal
+         handler to the default
+
+shell.c
+       - added SIGINT back to the list of terminating signals for
+         non-interactive shells
+
+variables.c
+       - initialize mail variables in initialize_shell_variables only if
+         interactive_shell is true
+       - only check for command_oriented_history if interactive shell
+       - only initialize the history variables if history expansion is
+         being performed (remember_on_history == 1)
+       - only make PS1 and PS2 non-unsettable if the shell is interactive
+
+                                   3/6
+                                   ---
+variables.c
+       - set up a new temporary environment, FUNCTION_ENV, which is the
+         temporary environment provided to a function
+       - make find_tempenv_variable search both temporary_env and
+         function_env, searching function_env if variable_context > 0
+       - change maybe_make_export_env to add variables from function_env
+         to the environment
+       - new function dispose_function_env to deallocate the temporary
+         function environment and cause a new export_env to be made
+       - added code to qsort_string_compare to compare the first
+         characters of the strings passed before calling strcmp
+
+general.c
+       - new function copy_array (char **array) returns a newly-allocated
+         copy of ARRAY
+
+execute_cmd.c
+       - added code to execute_builtin_or_function that initializes the
+         temporary function environment and takes care of disposing of
+         it on normal or abnormal exit
+       - dispose of temporary environment after we initialize the function
+         environment
+       - added same code to execute_subshell_builtin_or_function
+       - since the trap code now restores the SIGCHLD handler to the
+         original, any time make_child is called and the shell needs to
+         run in the child process, set_sigchld_handler should be called
+         to reinstall the proper SIGCHLD handler
+
+jobs.c
+       - new function set_sigchld_handler to reinstall flush_child as the
+         SIGCHLD signal handler
+
+                                   3/9
+                                   ---
+bashline.c
+       - swapped code around to avoid calling savestring (this_fignore)
+         when this_fignore is null
+
+                                  3/10
+                                  ----
+jobs.c
+       - make sure the code in flush_child that calls the SIGCHLD trap
+         handler saves last_made_pid and the_pipeline using unwind-protects
+
+lib/readline/readline.c
+       - make sure the code that uses VLNEXT is protected by #ifdef
+         TERMIOS_TTY_DRIVER
+
+shell.c
+       - add a `beenhere' flag to avoid executing $ENV more than once
+
+parse.y
+       - added a new token ASSIGNMENT_WORD
+       - made read_token return ASSIGNMENT_WORD if in a simple command
+         position, token contains `=', the `=' is not the first character,
+         and the characters before `=' are a legal identifier (as Posix.2
+         specifies)
+       - a simple_command_element can now also be an ASSIGNMENT_WORD
+       - alias expansion is attempted if the last token was an
+         ASSIGNMENT_WORD, as Posix.2a specifies
+
+                                  3/11
+                                  ----
+execute_cmd.c
+       - moved the code that checks command words for `/' down into
+         execute_disk_command, and made it check only the first command
+         word, like sh and ksh
+        - vfree() is no longer static, so other code that needs to add 
+          unwind-protects that use free can use it
+
+trap.c
+       - added a function set_sigchld_trap (command) to set the SIGCHLD
+         trap handler to `command', because unwind-protects cannot take
+         two arguments
+
+jobs.c
+       - changed the code in flush_child to set up and use and unwind-protect
+         frame to protect the things it needs to while running the SIGCHLD
+         trap commands
+
+                                  3/12
+                                  ----
+nojobs.c
+       - added the BUFFERED_INPUT code to make_child
+
+subst.c
+       - folded the test and increment of the string pointer into
+         string_extract_double_quoted and string_extract_single_quoted
+       - made string_extract_verbatim and string_extract static
+
+lib/readline/history.c
+       - changed code that calls string_extract_single_quoted to not
+         increment the string pointer after the call
+
+variables.c
+       - added code to qsort_var_comp to compare the first character of
+         the variable names before calling strcmp
+
+                                  3/13
+                                  ----
+parse.y
+       - include string.h or strings.h
+
+lib/readline/readline.c, lib/glob/glob.c
+       - removed the code that defined HAVE_DIRENT_H if _POSIX_VERSION
+         was defined -- it breaks on apollos, and is a bad idea
+         anyway
+
+input.c
+       - make sure close_buffered_fd closes the fd, whether or not it
+         was a buffered stream
+
+                                  3/16
+                                  ----
+machines.h
+       - added a #define LD_HAS_NO_DASH_L to the Sequent Dynix entries
+
+trap.c
+       - made trap_list[SIGINT] == IMPOSSIBLE_TRAP_HANDLER while running
+         the interrupt trap, so we can tell if the trap handler sets
+         another trap and not restore the original handler if so
+
+                                  3/17
+                                  ----
+trap.c
+       - a new function set_sigint_handler, which subshells doing `shellsy'
+         things like command substitution and ( cmd ) call to make sure
+         they handle interrupts right
+
+execute_cmd.c, subst.c
+       - added calls to set_sigint_handler in the appropriate spots
+
+                                  3/18
+                                  ----
+hash.c
+       - replaced the old hash function with the one from Gnu cpp, which has
+         a much better distribution
+
+jobs.c
+       - make end_job_control call setpgid to reset the pgrp to the original
+         only if original_pgrp >= 0
+
+builtins/exec.c
+       - remove the calls to restore_default_signal; restore_original_signals
+         now does all the necessary work
+
+                                  3/19
+                                  ----
+jobs.c, nojobs.c
+       - make sure that make_child resets default_buffered_input to -1
+         after closing it with close_buffered_fd
+
+                                  3/23
+                                  ----
+lib/glob/tilde.c
+       - had an extern declaration for malloc rather than xmalloc
+
+general.h
+       - added #define for REVERSE_LIST, a macro which calls reverse_list
+         on a list only if the pointer is valid and there is more than one
+         element
+
+parse.y
+       - removed calls to legal_assignment in read_token; assignment()
+         already does those checks
+
+general.c
+       - reformatted reverse_list
+
+copy_cmd.c
+       - changed calls to reverse_list in copy_word_list and copy_redirects
+         to calls to REVERSE_LIST
+
+subst.c
+       - changed a call to reverse_list in expand_word_internal to one to
+         REVERSE_LIST
+
+                                  3/24
+                                  ----
+builtins/common.c
+       - replaced a call to sscanf with code to skip leading whitespace and
+         calls to all_digits and atoi
+
+mailcheck.c
+       - did the same for a call to sscanf in time_to_check_mail
+
+                                  3/26
+                                  ----
+variables.c
+       - made find_variable_internal call find_tempenv_variable only if
+         temporary_env or function_env exists
+[gprof.int.4]
+
+alias.c, alias.h
+       - rewrote the alias code so that it now uses a hash table instead
+         of looking things up in a linear list
+
+subst.c
+       - removed the inclusion of alias.h
+
+parse.y
+       - added inclusion of alias.h
+
+cpp-Makefile
+       - removed alias.h from subst.o's dependencies
+       - added alias.h to y.tab.o's dependencies
+
+bashline.c, builtins/alias.def
+       - rewrote code that knew about the internal alias data structure
+         to use an array of alias structures to search, match, and print
+
+                                  3/27
+                                  ----
+test.c
+       - group_member() needs to check against gid and egid regardless
+         of whether or not the system has getgroups(2); Posix.1 does not
+         require that the primary group id show up in the group list,
+         and some systems do not put it there
+
+                                  3/30
+                                  ----
+parse.y
+       - add `|' to the list of tokens that should not have a semicolon
+         following them when adding a line to the history when command-
+         oriented history is active
+
+lib/readline/readline.c
+       - fixed up the control character display by making the code print
+         c ^ 0x40
+
+support/cppmagic
+       - add support for recognizing the s5r4 c pre-processor,
+         /usr/ccs/lib/cpp
+
+lib/readline/vi_mode.c
+       - made rl_vi_delete_to pay attention to whether or not we're redoing,
+         and to use the last motion key if we are
+       - made rl_vi_char_search use the last char searched for if we're
+         redoing
+
+                                  3/31
+                                  ----
+parse.y
+       - removed the check for non-interactive-ness when doing shell
+         comments
+
+                                   4/1
+                                   ---
+lib/readline/readline.c
+       - completion with tilde expansion needs to have any `/' present at
+         the end of the user's directory name re-inserted manually, because
+         pathname canonicalization strips any trailing `/', before tacking
+         on the expanded filename
+
+subst.c
+       - fixed a bug in dequote_string that caused reading beyond the end
+         of the string if the last character in the string was an (unquoted)
+         CTLESC
+       - made list_string obey the setting of `quoted' and not do the
+         initial strip of whitespace from the beginning and end of the
+         word if it was set
+       - expand_word_internal calls list_string with quoting == 1 if splitting
+         a word after expanding "$@"
+
+error.c
+       - new function itrace for interactive traces
+
+subst.c
+       - command_substitute should give the terminal back to pipeline_pgrp
+         only if the shell is interactive
+
+execute_cmd.c
+       - execute_disk_command should turn off interactive while performing
+         redirections for an asynchronous command.  The problem was a race
+         condition with command_subst.  A command like
+               date > `hostname` &
+
+         would leave the subshell begun to run date and the primary shell
+         fighting over the terminal.  After the subshell did the command
+         substitution, it wanted to give the terminal back to pipeline_pgrp,
+         which was its own pid.  Since it was in the background, though,
+         that was wrong, and ended up taking the terminal away from the
+         primary (interactive) shell, which thought it had the thing.
+
+lib/readline/readline.c
+       - if SYSTEM_CALL_RESTART is not defined, declare c as an integer
+
+                                   4/3
+                                   ---
+bashline.c
+       - put code into command_word_completion_func to skip all but pathname
+         completion checks if the hint given is an absolute pathname
+       - fix strncmp of basename against hint text (??); this always failed
+         unless there was no pathname given
+
+                                   4/7
+                                   ---
+bashline.c
+       - fixed the cases where the simple `last character is a command
+         separator' test fails for distinguishing between program name
+         completion and filename completion: the tokens >&, >|, and <&.
+       - corrected fix of 4/3 to handle command word completion with and
+         without leading paths
+
+                                   4/8
+                                   ---
+lib/readline/readline.c
+       - break the declaration and initialization of a variable with a call
+         to setjmp into a declaration and separate assignment statement (for
+         Cray)
+
+                                  4/10
+                                  ----
+subst.c
+       - A word that uses both "" and '' to do quoting will not be marked
+         as fully quoted by expand_word_internal.  Wrote a
+         fully_quoted_word () predicate function to solve that.
+       - Quoted patterns with globbing characters are sent to the
+         globbing functions because glob_pattern_p doesn't understand
+         shell quoting.  Wrote a new function unquoted_glob_pattern_p,
+         to fix that.
+
+                                  4/13
+                                  ----
+shell.c
+       - make sure default_input is valid and being used for an interactive
+         shell started without line editing
+
+                                  4/15
+                                  ----
+builtins/common.c
+       - redid part of the new get_numeric_argument code to avoid a call to
+         atoi and just do everything ourselves
+
+variables.c
+       - only call set_if_not on PS1 and PS2 in initialize_shell_variables
+         if the shell is not interactive
+       - check the variable returned by looking up PWD to make sure it's
+         non-null before trying to use it in initialize_shell_variables
+
+jobs.c
+       - add a descriptive tag to the call to get_working_directory in
+         job_working_directory
+
+                                  4/17
+                                  ----
+test.c
+       - fixed a typo in group_member: gid -> pgid in assignment statement
+       - in the normal Sun compilation environment, getgroups returns an
+         array of ints, not gid_ts.  getgid and getegid also return ints.
+         stat structures contain a gid_t, though.
+
+         Need to reorder the includes so that stat.h is included first, then
+         uid_t and gid_t are redefined to int, then the rest of the files
+         are included.
+
+         Also need to cast the values from a stat structure to gid_t and
+         uid_t before comparing them to the results of getgid and getuid
+         when implementing -O and -G
+
+                                    4/21
+                                    ----
+lib/readline/readline.c
+       - added code to rl_getc to handle EWOULDBLOCK/EAGAIN and turning off
+         no-delay mode
+
+                                  4/22
+                                  ----
+
+builtins/cd.def
+       - made change_to_directory canonicalize the pathname before attempting
+         to chdir(2) if follow_symbolic_links is set
+
+                                  4/23
+                                  ----
+builtins/type.def
+       - made type handle absolute program names by just echoing the name
+
+builtins/alias.def
+       - made single_quote correctly handle single quotes in aliases
+
+                                  4/28
+                                  ----
+trap.c
+       - made ignore_sig and restore_default_signal check that the value
+         of the original signal handler (in original_signals) was valid
+         before trying to use it.  Bug noticed with `trap "" 1 2 3' as
+         first line in script.
+
+                                  4/29
+                                  ----
+lib/readline/readline.c
+       - made rl_signal_handler only unblock the signal it just received
+         on BSD and Posix systems
+
+                                   5/5
+                                   ---
+builtins/type.def
+       - don't look up the function with find_function until we actually
+         need the info
+
+execute_cmd.c
+       - in do_redirection_internal, don't do unnecessary work.  For instance,
+         >&1 ends up duplicating fd 1 as itself (then adding a close for it,
+         which is a bug)
+
+                                   5/8
+                                   ---
+general.h
+       - don't attempt to declare index and rindex if `index' is defined
+         (with #define)
+
+lib/readline/vi_mode.c
+       - fixed the `c' command so that cl and c<space> are equivalent --
+         formerly the c<space> changed two characters instead of one.
+         The same fix was made to rl_vi_change_to, rl_vi_delete_to, and
+         rl_vi_yank_to
+
+parse.y
+       - bash_add_history did not correctly handle lines that ended with
+         an escaped newline.  It would insert semicolons in the locations
+         where the line breaks occurred.
+
+                                    5/12
+                                    ----
+documentation/bash.1
+       - removed references to pushd_silent
+       - added setion on process substitution
+
+subst.c
+       - fixed a bug in expand_word_internal that caused $xxx"" to expand
+         to nothing when `xxx' was unset.  The code now explicitly turns
+         a partially quoted string that expands to nothing (istring[0] == 0)
+         into a QUOTED_NULL (istring[0] = CTLNUL) before returning the
+         word list.
+
+                                  5/15
+                                  ----
+documentation/bash.1
+       - added a missing .PD in the builtins section after the line
+         summarizing `:'
+       - added text describing the effect of additional arguments to the
+         `.' command
+
+subst.c, general.c, jobs.c, nojobs.c, error.c, getcwd.c
+       - only declare errno as `extern int' if it's not #defined
+
+builtins/{bind,exec,fc,kill,source}.def, lib/readline/{readline,history}.c
+       - ditto with errno
+
+lib/glob/fnmatch.c
+       - ditto with errno
+
+                                    5/17
+                                    ----
+execute_cmd.c
+       - shells compiled with job control active should perform the implicit
+         `</dev/null' redirection for asynchronous commands when it is not
+         active
+
+builtins/mkbuiltins.c
+       - added a `-nodocument' option to inhibit the output of the `xxx_doc'
+         array that is a builtin's long documentation.  Saves between 26
+         and 27K in the bash executable on the RT, 32K on the Sun-4
+
+                                  5/22
+                                  ----
+print_cmd.c
+       - added code to make group commands print better
+
+builtins/common.c
+       - new function remove_hashed_filename to remove a filename from the
+         table of hashed commands
+
+execute_cmd.c
+       - make sure the filename found in the hash table actually exists and
+         is executable.  If not, remove it from the hash table and look it
+         up in $PATH.
+
+general.c
+       - make sure to #include <signal.h> before defining set_signal_handler
+         (on Posix systems)
+
+builtins/command.def
+       - change HPUX_7 to hpux_7
+
+                                  5/27
+                                  ----
+builtins/times.def
+       - added USGr3 to the list of systems that should have HAVE_RESOURCE
+         undefined even though <sys/resource.h> exists
+
+                                  5/28
+                                  ----
+machines.h
+       - added a description for 386/486 boxes running BSDI BSD/386
+
+support/mksysdefs
+       - looks for <limits.h> and writes a define to sysdefs.h if it's
+         found
+
+maxpath.h
+       - rewritten -- now includes limits.h if HAVE_LIMITS_H is defined,
+         then tries to define MAXPATHLEN as PATH_MAX
+
+                                  5/29
+                                  ----
+lib/readline/history.c
+       - added definition for rl_string_extract_single_quoted so the
+         code inhibiting history expansion inside quotes does not depend
+         on the shell
+       - change to use rl_string_extract_single_quoted
+       - removed code that would have inhibited history expansion in
+         double-quoted strings
+
+subst.c
+       - make string_extract_{single,double}_quoted static again
+
+                                   6/1
+                                   ---
+trap.c
+       - systems with _POSIX_VERSION defined need not reset the signal handler
+         inside trap_handler
+       - set_signal should use set_signal_handler() to install the signal
+         handler rather than signal()
+       - initialize_traps needs to use set_signal_handler for SIGINT and
+         SIGQUIT rather than signal()
+       - restore_default_signal needs to use set_signal_handler
+
+parse.y
+       - the readline interface code needs to use set_signal_handler to
+         install the SIGINT handler
+
+lib/readline/readline.c
+       - new function rl_set_sighandler, which is the readline analogue of
+         the bash set_signal_handler
+       - rl_set_signals and rl_clear_signals need to use rl_set_sighandler
+         for SIGINT and SIGALRM
+
+                                   6/2
+                                   ---
+signames.c
+       - fixed a typo (signame_names -> signal_names)
+
+                                   6/3
+                                   ---
+subst.c, general.c
+       - AIX machines need to use sysv_getc rather than getc when reading
+         from the command substitution pipe -- read(2) is not restarted
+         automatically when interrupted by a signal and returns EINTR
+
+                                   6/5
+                                   ---
+documentation/bash.1
+       - removed documentation of M-C-j command in emacs editing mode
+       - added description of M-{ (complete-into-braces)
+       - added description of M-! and C-x ! command completion
+       - added description of M-TAB dynamic history completion
+
+lib/readline/search.c
+       - new file containing code to perform non-incremental history
+         searches.  Functions to call are rl_noninc_forward_search
+         and rl_noninc_backward_search
+
+lib/readline/emacs_keymap.c
+       - bound M-^R to non-incremental-search-backward, M-^S to
+         non-incremental-search-forward
+
+lib/readline/readline.h
+       - extern defintions for rl_noninc_{forward,backward}_search
+
+lib/readline/funmap.c
+       - added names `non-incremental-forward-search-history' and
+         `non-incremental-reverse-search-history'
+
+lib/readline/vi_mode.c
+       - rl_vi_yank_arg should put readline into insertion mode when
+         it is done
+
+lib/readline/vi_keymap.c
+       - ^I should just insert when in vi insertion mode, rather than
+         attempt completion
+
+                                    6/6
+                                    ---
+
+lib/readline/funmap.c
+       - removed the `vi-dosearch' bindable string, since rl_vi_dosearch
+         is really a private function for vi_mode.c.  It does not fit
+         the calling conventions of the bindable readline functions
+         (and I've since removed it)
+
+lib/readline/readline.h
+       - removed the extern definition for rl_vi_dosearch
+
+lib/readline/search.c
+       - added new functions rl_noninc_forward_search_again and
+         rl_noninc_backward_search_again to search for the last saved
+         search string from the current `noninc' history position
+
+lib/readline/vi_mode.c
+       - removed the vi history search code and changed rl_vi_search
+         and rl_vi_search_again to call the non-incremental search code
+         from search.c
+
+                                   6/8
+                                   ---
+
+[changes from bfox version dated 5/10]
+
+bashline.c
+       - changed the conditional clause that decides whether a token is
+         in a command position for command name completion to be a little
+         simpler
+
+bracecomp.c
+       - new version from bfox
+
+config.h
+       - moved BUFFERED_INPUT define here
+
+flags.c
+       - new flag for interactive comments
+       - reformatted find_flag
+
+flags.h
+       - added interactive_comments and an extern declaration of restricted
+
+machines.h
+       - new cray definition from bfox
+
+maxpath.h
+       - don't include limits.h if BUILDING_MAKEFILE is defined
+
+shell.c
+       - moved the check for restricted to immediately after the sourcing
+         or .profile
+
+test.c
+       - now includes shell.h in the initial block of includes
+
+trap.c
+       - new function get_original_signal to take care of the bookkeeping
+         of correctly setting up original_signals[sig]
+
+trap.h
+       - signal_decode -> decode_signal
+
+builtins/exec.def
+       - adjusted the help text to make it clear that only non-interactive
+         shells check the no_exit_on_failed_exec variable and exit if the
+         execve fails
+
+builtins/set.def
+       - added description and code to implement set -o interactive_comments
+
+lib/glob/glob.c
+       - if PAT is empty when glob_vector is called, skip the loop and
+         return one empty filename.  This is how to make echo */ echo
+         only directory names
+
+lib/readline/parens.c
+       - new file from bfox implementing parenthesis matching for readline
+
+lib/readline/emacs_keymap.c
+       - if PAREN_MATCHING is defined, perform `show-matching' on `)', `}',
+         and `]'
+
+lib/readline/history.c
+       - add `$' to the list of separating characters in history_tokenize
+         so that two-character `$' tokens ($$, $!, $() are parsed correctly
+
+lib/readline/readline.c
+       - Make an argument of 1 to rl_rubout and rl_delete work the same
+         as if any other argument had been given by saving the text on
+         the kill ring
+       - in rl_getc, check that the value returned from read == sizeof
+         unsigned char
+
+lib/readline/readline.h
+       - added declaration of rl_event_hook, which is the address of a
+         function to call periodically while readline is awaiting
+         character input
+
+support/cppmagic
+       - new implementation from bfox, now returns a full cpp specification,
+         complete with system dependent flags
+
+support/mksysdefs
+       - added a variable MAKE_ANSI which, if set to true, causes the
+         ansi Makefile to be generated
+       - added code to recognize various types of cray/unicos machines
+
+[end of fixes from bfox]
+
+getcwd.c
+       - integrated changes that allow getcwd to handle paths longer
+         than PATH_MAX by shifting to using a dynamically-allocated
+         buffer
+
+builtins/set.def
+       - make the check for emacs or vi check to make sure the shell is
+         interactive
+
+                                  6/10
+                                  ----
+builtins/common.c
+       - the dollar_arg_stack was never being reallocated in push_dollar_vars
+         because of a stray `if (!dollar_arg_stack)' before the realloc call
+
+                                    6/12
+                                    ----
+cpp-Makefile
+       - added some missing $(RM) $@ in explicit targets for objects (the
+         ones that don't go through the default rules) as well as the
+         targets for the auxiliary programs
+
+subst.c
+       - redid the way bash handles assignment statements on command lines
+         to fix two bugs:
+
+               1) variable assignments are not supposed to affect expansion
+                  performed on the same line, if a command is to be run
+               2) if the words left after removing the variable and environment
+                  assignments don't expand to a command word, the assignments
+                  should affect the shell's environment
+
+         new function: separate_out_assignments
+               removes variable assignments that precede other words and puts
+               them on VARLIST
+               removes environment assignments in the rest of the words, if
+               set -k is in effect, and puts them on ENVLIST
+
+         just before expand_words_internal returns, it checks varlist and
+         envlist (if it is doing expansion) and performs the assignments, if
+         any.  If it's returning a null list, these assignments affect the
+         shell's environment
+
+                                    6/13
+                                    ----
+subst.c
+       - eliminated ENVLIST; VARLIST can serve for both variable and
+         environment assignments
+
+       - sped up expand_words_internal's section for brace expansion by
+         eliminating unnecessary copies -- original word is used unless brace
+         expansion occurred, in which case the original word is linked to
+         a list of words to dispose when brace expansion is completed
+
+       - sped up the word expansions section of expand_words_internal by
+         (possibly) eliminating a call to reverse_list on the results of
+         word expansion and splitting on $IFS, because the most common
+         case will expand to only a single word
+       - `expanded' needs to be freed only if expansion and word splitting
+         took place, no moving the call to dispose_words up after the call
+         to word_list_split means that the common case no longer needs to
+         copy the list
+
+       - sped up globbing by eliminating copying as was done for brace
+         expansion -- keeping a list of `disposable' words and using the
+         original list contents if expansion failed or was not performed
+       - in the case that we're not globbing a word because it has no
+         unquoted globbing characters, eliminated the copy and creation of
+         a brand new list
+       - added a define GLOB_FAILED that handles the cases of using and
+         not using the GNU libc Posix.2 globbing library
+       - moved the code that dequotes the original word so it's executed
+         only if the glob fails
+       - wrapped the code that performs globbing inside an if (new_list)
+         clause
+       - call REVERSE_LIST only if we're actually doing globbing; otherwise
+         dequote the list and go on to performing assignments
+
+                                  6/15
+                                  ----
+lib/glob/glob.c
+       - if the directory portion of a pathname to be globbed contains
+         quoted globbing characters, the quotes (backslashes) need to be
+         removed before the code tries to open and read that directory
+
+                                  6/17
+                                  ----
+execute_cmd.c
+       - index -> indx in extract_colon_unit
+
+nojobs.c
+       - make wait_for_single_pid return the status of the pid it's waited
+         for, instead of throwing it away
+       - added a simple pid-status array to avoid multiple calls to
+         wait_for and calling wait on dead processes.  make_child adds
+         pids to this array, and the status of a pid is updated when
+         it's returned from wait(2) or waitpid(2)
+       - removed the checks for whether or not the pid is valid (using
+         kill(2)) in favor of using the information in the pid_list
+
+parse.y
+       - call cleanup_dead_jobs on non-job-control systems to clean up the
+         pid_list
+
+                                  6/18
+                                  ----
+subst.c
+       - include config.h before trying to include string.h or strings.h
+         so USG is properly defined
+
+                                    6/19
+                                    ----
+support/mksysdefs
+       - look for /usr/include/string.h and define HAVE_STRING_H if
+         found.  This is the file mandated by ANSI C.
+
+cpp-Makefile
+       - look for the HAVE_STRING_H definition from sysdefs.h and define
+         it as part of SYSTEM_FLAGS if found
+       - added the HAVE_STRING_H to LIBRARY_CFLAGS, so readline can
+         decide what to include
+
+general.c, parse.y, subst.c
+       - use the HAVE_STRING_H define in deciding which flavor of the
+         include file to use
+
+builtins/common.c
+       - include strings.h or string.h, depending on the definition of
+         HAVE_STRING_H
+       - added extern declaration of rindex and index at file scope
+       - removed extern declaration of rindex in find_hashed_filename
+
+lib/readline/rldefs.h
+       - removed the messy #ifdef clauses and such from readline.c and
+         moved them to this new file
+       - added a section on string functions (string.h vs. strings.h,
+         whether or not index and rindex need to be defined)
+
+lib/readline/readline.c
+       - removed the messy #ifdef clauses that attempt to parameterize
+         things and define constants on a system-specific basis
+       - removed the definition of the unused variable xoff_state
+
+flags.c
+       - corrected a typo in the comment describing jobs_m_flag
+
+jobs.c
+       - new function, current_working_directory (), which returns the
+         cwd without calling malloc to allocate memory, even indirectly.
+         This can safely be called from a signal handler, like when
+         flush_child calls notify_of_job_status if async notification is on
+       - changed call to job_working_directory in pretty_print_job to call
+         current_working_directory
+       - moved assignment to DIR in notify_of_job_status after the calls
+         to sigprocmask to block SIGCHLD and SIGTTOU
+       - in notify_of_job_status, DIR is now assigned via a call to
+         current_working_directory and hence does not need to be freed
+       - notify_of_job_status now initializes DIR to NULL and calls
+         current_working_directory only if it needs to
+       - changed a call to reverse_list in stop_pipeline to REVERSE_LIST,
+         because most pipelines will be only one process long
+
+builtins/jobs.def
+       - make an illegal jobspec cause a failure instead of returning 0 all
+         the time
+
+builtins/times.def
+       - times now ignores any arguments for sh and ksh compatibility
+
+                                    6/20
+                                    ----
+execute_cmd.c
+       - fixed execute_until_or_while to actually return the status of the
+         last command executed in the body rather than
+         last_command_exit_value, which is the status of the test (which
+         has just failed)
+
+                                    6/23
+                                    ----
+execute_cmd.c
+       - fixed execute_subshell_builtin_or_function to exit with 
+         last_command_exit_value if a builtin longjmps to top_level
+         with value EXITPROG, rather than with EXITPROG (3)
+
+                                  6/25
+                                  ----
+cpp-Makefile
+       - added rldefs.h to READLINE_SOURCE
+
+builtins/type.def
+       - `type' now returns 0 if no arguments are given
+
+jobs.c
+       - make wait_sigint_handler obey interrupt_immediately as well
+         as whether the wait builtin is the current command (XXX - in
+         the future remove the check for wait_builtin entirely and
+         just use interrupt_immediately, because this_shell_builtin
+         could be changed by the code that runs from a SIGCHLD trap)
+       - make the code that runs commands from SIGCHLD traps set
+         interrupt_immediately to 1 each time through the loop
+
+                                  6/26
+                                  ----
+builtins/common.c
+       - declare extern void vfree and use it in the add unwind protect
+         call, to avoid having to declare what type free returns
+
+execute_cmd.c, builtins/common.c
+       - removed all references to builtin_pipe_in_hack, which is no
+         longer used
+
+parse.y
+       - removed all references to current_token_being_expanded and
+         pending_token_being_expanded, since their function is subsumed
+         by expanded_token_stack.  Also no need to save this on the
+         pushed string stack, so that element is removed from the
+         struct.
+         (current_token_being_expanded == expanded_token_stack->saved_token)
+
+builtin/jobs.def
+       - removed immediate return if job_control == 0.  This makes it work
+         in command substitution subshells
+
+                                    6/29
+                                    ----
+expr.c
+       - added unary `+'
+       - added bitwise not (`~') at same precedence as logical not (`!')
+       - added left and right shifts (<<, >>) between +,- and the comparisons
+       - added bitwise and, or, xor (&, |, ^)
+       - added logical and, or (&&, ||)
+       - changed exp1 to allow multiple consecutive ! and ~ (in the same way
+         that exp0 allows multiple consecutive leading - and +
+
+lib/readline/history.c
+       - close memory leak -- in history_do_write, free the output filename
+         before returning
+       - close same memory leak in read_history_range
+
+builtins/enable.def
+       - make `enable' with no arguments print only the enabled builtins, and
+         `enable -n' with no other arguments print only the disabled builtins
+
+builtins/setattr.def
+       - make readonly and export return failure when given -f with an
+         argument that is not a function name
+       - added -n to the documentation for readonly
+
+execute_cmd.c
+       - cleaned up the code that checks for #! and binary files some: made
+         sure the file descriptor was always closed, made sure sample_len
+         was > 0 before checking the first two characters, collapsed two
+         if statements into one
+
+jobs.c
+       - changed call to job_working_directory in start_job to call to
+         current_working_directory
+       - changed input_tty to a macro
+       - changed the call to QUIT in wait_for after the wait_loop
+         label to depend on whether job_control is enabled; the test
+         against the terminal process group is superfluous now that
+         we use wait_sigint_handler
+
+builtins/fg_bg.def
+       - Posix.2a specifies that fg and bg should return failure if
+         run when job control is disabled
+
+                                   7/2
+                                   ---
+variables.c
+       - when an existing variable is given a new value by bind_variable,
+         turn off the invisible attribute
+
+shell.c
+       - dup default_buffered_input using fcntl(fd, F_DUPFD, 10) to put
+         it above the shell's user-manipulatable range
+
+execute_cmd.c
+       - in add_undo_redirect, make the redirection added a
+         r_duplicating_input so buffered streams get duplicated as
+         necessary.  It makes no difference for the non-buffered-stream
+         code
+
+                                   7/3
+                                   ---
+subst.c
+       - command_substitute needs to set interactive = 0 and leave
+         interactive_shell reflecting the interactive state of the
+         parent shell
+
+signames.c
+       - prevent SIGGRANT and SIGRETRACT from overriding other already-defined
+         signal names, since, on the RT at least, they override SIGUSR2
+         and SIGEMT, respectively, which are much more common
+
+jobs.c
+       - in notify_of_job_status, if job control is not enabled, do not
+         print the status messages.  Mark dead jobs as notified so they
+         get cleaned up properly
+
+braces.c
+       - when checking for `,' if a closing brace was not found, make
+         sure the , is unquoted
+       - make sure we found an unquoted , before attempting to perform
+         the expansion -- since brace_gobbler purports to understand
+         quoting with \, the rest of the code should support it
+       - disabled the code that caused a failure longjmp if a matching
+         closing brace was not found -- the pattern should be left
+         unchanged, as with any other failed expansion
+
+trap.c
+       - new function maybe_set_sigchld_trap, which sets the trap on
+         SIGCHLD if and only if the signal is not currently trapped
+
+jobs.c
+       - call maybe_set_sigchld_trap after running SIGCHLD trap commands
+         on the death of a child to restore the trap handler, so if the
+         trap handler calls `trap xxx CHLD' it will not be overwritten
+
+lib/glob/fnmatch.c
+       - fnmatch must treat [ without a matching ] as a `regular' character
+         to be matched against the string so that the Posix.2 rules for
+         case command matching are not broken
+
+shell.c
+       - change the call to fcntl that sets default_buffered_input to one
+         to dup2(fd, getdtablesize() - 1) to hopefully get the highest
+         file descriptor
+
+                                   7/6
+                                   ---
+parse.y
+       - if read_token reads a character that matches the current delimiter
+         character, it should make sure the character is `"' before
+         checking delimited_paren_level and blindly accepting it.  There
+         are other values for `delimiter' besides `"'.
+
+shell.c
+       - turn on no_line_editing for non-interactive shells
+
+builtins/set.def
+       - removed test against interactive_shell when deciding whether or
+         not emacs or vi is `on' [backed out of fix from 6/8]
+
+                                   7/8
+                                   ---
+lib/readline/history.c
+       - changed get_history_event so that shell metacharacters (;&()|<>)
+         can terminate an event spec
+
+subst.c
+       - the TERM and TERMCAP variables need special handling only if
+         READLINE is defined
+       - ditto for history_completion_file
+
+machines.h
+       - new description for HPs running OSF/1
+
+                                   7/9
+                                   ---
+lib/readline/readline.c
+       - new variable `eight-bit-input'.  If this is on, readline disables
+         ISTRIP for the Posix or sysv tty drivers
+
+execute_cmd.c, variables.c
+       - new variable `subshell_environment' set in children right after
+         forking and reset in shell_reinitialize.  It means to look in
+         the temporary environment first when looking up variables and
+         functions
+
+                                  7/13
+                                  ----
+config.h, parse.y
+       - changed CSH_HISTORY_EXPANSION to BANG_HISTORY_EXPANSION
+
+shell.c
+       - made all the history-related code #ifdef HISTORY
+       - made maybe_save_shell_history be called only if the shell is
+         interactive and we're remembering history lines
+
+parse.y, flags.c, flags.h, subst.c, variables.c
+       - made all the history-related code #ifdef HISTORY
+       - assignment_acceptable and command_token_position no longer are
+         dependent on ALIAS being defined, since they are used to return
+         ASSIGNMENT_WORD tokens
+
+builtins/bind.def
+       - removed inclusion of readline/history.h
+
+builtins/exec.def, builtins/common.c
+       - made all the history-related code #ifdef HISTORY
+
+builtins/fc.def, builtins/history.def
+       - added a $DEPENDS_ON HISTORY line
+
+builtins/mkbuitins.c
+       - line_error should not try to print error_directory without checking
+         to see whether it is NULL
+
+builtins/Makefile
+       - add $(DIRECTDEFINE) to the command line that builds builtins.c
+
+lib/glob/tilde.c
+       - use getpwuid(getuid()) to look up the home directory of the user
+         executing the shell for tilde expansion ~/foo if $HOME unset
+
+cpp-Makefile, subst.c, config.h
+       - Fixes to make brace expansion a configuration option, on by default
+
+                                  7/14
+                                  ----
+builtins/set.def
+       - fixed unset so an attempt to unset a readonly variable or function
+         is an error (as Posix.2 specifies)
+
+general.h
+       - removed extern declarations of index, rindex
+       - added extern declarations for strchr, strrchr
+       - changed `member' to use strchr
+
+subst.c, general.c, bashline.c, execute_cmd.c, parse.y, test.c
+       - changed calls to index to calls to strchr, calls to rindex to calls
+         to strrchr
+
+builtins/echo.def, builtins/fc.def, builtins/common.c
+       - changed calls to index to calls to strchr, calls to rindex to calls
+         to strrchr
+
+lib/glob/glob.c
+       - changed calls to index to calls to strchr, calls to rindex to calls
+         to strrchr
+
+lib/readline/history.c, lib/readline/readline.c, lib/readline/vi_mode.c
+       - changed calls to index to calls to strchr, calls to rindex to calls
+         to strrchr
+
+lib/readline/vi_mode.c
+       - changed calls to strchr to inline checks, since we're only checking
+         for two characters
+
+                                  7/15
+                                  ----
+variables.c
+       - If PPID is imported, turn off export status
+
+                                  7/17
+                                  ----
+general.h
+       - for USG and Posix systems, define NO_READ_RESTART_ON_SIGNAL
+
+
+general.c
+       - sysv_getc --> getc_with_restart
+       - compile in getc_with_restart if NO_READ_RESTART_ON_SIGNAL is
+         defined
+
+subst.c
+       - call getc_with_restart in command_substitute if on a system
+         with NO_READ_RESTART_ON_SIGNAL defined
+
+parse.y
+       - call getc_with_restart in yy_stream_get if NO_READ_RESTART_ON_SIGNAL
+         is defined
+
+input.c
+       - change b_fill_buffer to restart reads on EINTR
+
+general.h
+       - wrap the declarations of strchr and strrchr inside an #ifdef strchr
+         because some ANSI C compilers (e.g., RS/6000) make them defines in
+         /usr/include/string.h
+
+                                  7/20
+                                  ----
+lib/readline/readline.c
+       - wrap the declarations of strchr and strrchr inside an #ifdef strchr
+         because some ANSI C compilers (e.g., RS/6000) make them defines in
+         /usr/include/string.h
+
+                                  7/21
+                                  ----
+lib/readline/parens.c
+       - wrap all parameters and variables associated with the select call
+         into #ifdef FD_SET
+
+execute_cmd.c
+       - added tilde expansion to the pattern list members of case statement
+         clauses, as specified by Posix.2 d11.3
+
+lib/readline/readline.c
+       - when comparing members of the c_cc array directly against
+         _POSIX_VDISABLE, cast both sides to unsigned char
+
+support/getcppsyms.c
+       - recognized __svr4__
+
+machines.h
+       - for Sun machines, if __svr4__ is defined and USGr4 is not, define
+         USGr4
+
+shell.c
+       - some machines need sys/types.h included before stdio.h (mostly for
+         size_t)
+
+lib/malloc/malloc.c
+       - add SunOS5 to the list of systems that do no redefine valloc (?)
+
+                                  7/22
+                                  ----
+make_cmd.c
+       - save and restore the value of line_number around reading a
+         here-document
+
+lib/glob/glob.c
+       - change to use HAVE_STRING_H to decide which version of the
+         header files to include
+
+                                    7/25
+                                    ----
+execute_cmd.c
+       - fixed execute_command_internal so that failure to perform
+         redirections attached to a shell compound command like if
+         or while causes the command to return failure right away
+       - eliminated use of redir_result in execute_builtin_or_function
+       - changed execute_while_or_until so that body_status is
+         initialized to EXECUTION_SUCCESS, and then directly returned
+         without a check for commands_executed, so that the Posix.2
+         behavior of returning success when no body commands are
+         executed is preserved
+
+                                  7/27
+                                  ----
+jobs.c
+       - make sure that trap_list[SIGCHLD] is not set to IGNORE_SIG
+         before trying to run commands when a SIGCHLD is caught
+
+test.c
+       - define and use UID_T and GID_t, which are equivalent to uid_t
+         and gid_t on all systems but SunOS 4.1.?, because SunOS makes
+         `int' the return value of all the uid and gid functions (except
+         stat!)
+
+                                  7/28
+                                  ----
+shell.c
+       - call end_job_control in termination_unwind_protect
+
+variables.c
+       - if PWD is imported from the environment and it is wrong (i.e.,
+         not the same as the current directory), rebind it to the current
+         directory (as obtained by get_working_directory)
+
+                                  7/29
+                                  ----
+lib/readline/history.c
+       - do not history expand ! when immediately preceded by [, assuming
+         it's the globbing pattern negation character
+
+execute_cmd.c
+       - plug some memory leaks -- redirectee_word needs to be freed
+         before returning from do_redirection_internal
+       - changed the noclobber code to open the file with O_EXCL after
+         verifying that it's not there with stat to shorted possible
+         race conditions (this doesn't help over NFS)
+
+                                  7/30
+                                  ----
+lib/readline/history.c
+       - treat a negative arg to stifle_history as 0
+
+lib/readline/readline.c
+       - #undef PC before declaring it as a variable because some systems
+         (Solaris2) define it in system header files
+       - changed type of insert_some_chars, update_line, and delete_chars
+         to void
+       - added a check when doing filename completion in
+         filname_completion_function to see if the first characters of the
+         filename and directory entry match before calling strncmp
+         (inline expansion of STREQN)
+
+                                  7/31
+                                  ----
+lib/readline/vi_keymap.c
+       - Make arrow keys work for history in vi command mode by binding
+         `o' and `[' in vi_escape keymap to rl_arrow_keys
+
+                                   8/6
+                                   ---
+subst.c
+       - broke the code that quotes strings for the globbing functions
+         into a separate function: quote_string_for_globbing (), so
+         there are not two copies of it
+       
+execute_cmd.c
+       - rewrote execute_case_command so that quote_string_for_globbing
+         is called for the patterns in a pattern list and reordered some
+         other code for clarity
+       - execute_case_command now turns quoted null strings into empty
+         strings because quote_string_for_globbing does not do it
+
+                                   8/7
+                                   ---
+lib/readline/readline.c
+       - added generic code to init_terminal_io to fetch the termcap
+         codes for the arrow keys (ku, kd, kl, kr) and bind the right
+         functions to them
+
+lib/readline/vi_keymap.c, lib/readline/emacs_keymap.c
+       - removed bindings to `rl_arrow_keys' from all keymaps
+
+                                  8/13
+                                  ----
+subst.c
+       - command_substitute: only close fildes[1] if it's > 2
+
+                                  8/26
+                                  ----
+lib/readline/readline.c
+       - rewrote get_y_or_n to get rid of label and goto
+       - added code to the completion listing function that makes it
+         skip padding the line out with blanks after writing what will
+         be the last filename on the line
+
+machines.h
+       - added -DHAVE_SETDTABLESIZE to SYSDEP_CFLAGS for Sequents
+         running Dynix/ptx
+
+                                  8/28
+                                  ----
+machines.h
+       - added a machine description for the BBN Butterfly from
+         Kaveh Ghazi
+
+variables.c
+       - HPOSF1 machines cannot redefine getenv()
+
+support/getcppsyms.c
+       - recognize __hp_osf
+
+parse.y
+       - allow reserved word recognition after done, fi, and esac
+         Posix.2 section 3.4 seems to allow this
+
+lib/readline/readline.c
+       - include <sys/ioctl.h> on OSF/1 machines for TIOCGWINSZ
+
+subst.c
+       - in command_substitute, when checking to see that we're not
+         overflowing `istring', allow for the insertion of two characters
+         in the check to account for possible quoting
+
+                                   9/3
+                                   ---
+builtins/bashgetopt.c
+       - force reset_internal_getopt to set loptend to NULL
+       - force internal_getopt to set loptend to NULL when the list it
+         gets is NULL, and when it detects that it's been called with
+         a different word list
+
+                                   9/8
+                                   ---
+variables.c
+       - make adjust_shell_level clamp the value of $SHLVL at 1
+
+[Fixes from bfox 1.13]
+
+bashline.c
+       - remove `%' from list of readline special prefixes
+
+config.h
+       - BANG_HISTORY_EXPANSION -> BANG_HISTORY
+
+cpp-Makefile
+       - add HAVE_STRCHR
+       - changes to macros that build libraries
+       - reorganized library declarations and support
+
+execute_cmd.c
+       - indx -> p_index in extract_colon_unit
+
+general.c
+       - provide definitions of strchr, strrchr for systems that do not
+         have them
+
+machines.h
+       - define `Solaris' for Suns running Solaris 2.x
+       - turn all the definitions of M_OS into strings
+
+parse.y
+       - replace delimiter and old_delimiter with a stack of delimiters
+         encountered while parsing the current token
+
+subst.c
+       - removed all traces of EIGHT_BIT
+
+variables.c
+       - new function dispose_temporary_vars, for both dispose_used_env_vars
+         and dispose_function_env
+
+lib/readline/readline.c
+       - `eight-bit-input' -> `meta-flag'
+
+lib/tilde
+       - new directory for the tilde expansion library code
+
+[end of bfox changes]
+
+cpp-Makefile
+       - pass $(RM) down to makes in libraries
+
+                                  9/10
+                                  ----
+parse.y
+       - remove the bfox change that set CMD_FORCE_SUBSHELL for async
+         commands
+
+                                  9/14
+                                  ----
+builtins/bind.def
+       - surround the code with #ifdef READLINE
+
+builtins/fg_bg.def
+       - surround the body of the code with #ifdef JOB_CONTROL
+
+builtins/getopts.def
+       - surround the body of the code with #ifdef GETOPTS_BUILTIN
+
+builtins/alias.def
+       - surround the body of the code with #ifdef ALIAS
+
+                                  9/15
+                                  ----
+lib/readline/emacs_keymap.c
+       - bind rl_noninc_reverse_search to M-P and rl_noninc_forward_search
+         to M-N, respectively
+
+lib/readline/readline.c
+       - made name_key_alist struct static
+       - added new functions to manipulate keymaps:
+               rl_get_keymap_by_name()
+               rl_get_keymap()
+               rl_set_keymap()
+
+lib/readline/keymaps.h
+       - added declarations for the new keymap functions
+
+builtins/bind.def
+       - added -m map option to allow bind commands to specify the keymap
+         to be used when binding key sequences to readline commands
+
+                                  9/16
+                                  ----
+builtins/alias.def
+       - in single_quote, allocate a new string three times as big as the
+         old to handle the possible quoting characters
+
+bashline.c
+       - set last_fignore to null after freeing it in setup_ignore_patterns
+
+                                  9/17
+                                  ----
+parse.y
+       - added code to handle the functionality of `ignoreboth' as a
+         value for history_control (ignore both lines beginning with
+         spaces and duplicates of the last history entry)
+       - don't use history_control for the second and subsequent lines
+         of a multi-line command when command_oriented_history is in
+         effect
+
+                                  9/18
+                                  ----
+bashline.c
+       - fix attempt_shell_completion to call command_word_completion_function
+         even if the supplied text begins with `/'
+       - fix command_word_completion_function to make sure that absolute
+         program names passed are executable before returning them as
+         possible matches
+
+                                  9/20
+                                  ----
+parse.y
+       - If we read a blank line (shell_input_line[0] == 0) and we have
+         reached EOF (shell_input_line_terminator == EOF) then don't echo
+         the line, even if -v has been turned on
+
+                                  9/23
+                                  ----
+lib/malloc/malloc.c
+       - changed to use USG rather than SYSV
+       - changed BSD42 to BSD4_2 like emacs malloc.c
+       - removed conditional compilation code dealing with VMS
+       - include getpagesize.h only if BSD4_2 is not defined
+       - changed conditionally compiled code dealing with BSD, since
+         BSD is not defined by bash and malloc.c does not include
+         sys/param.h, which defines BSD on 4.x BSD systems
+
+lib/malloc/getpagesize.h
+       - new implementation, inspired by gdb 4.6
+               uses _SC_PAGESIZE, if present
+               defaults to 4096
+
+lib/readline/vi_keymap.c
+       - when in insert mode, Posix.2a says that \ is quoted-insert
+       - remove the binding to vi_escape_keymap; Posix.2a says that
+         ESC in movement mode does nothing (vi description)
+
+                                  9/24
+                                  ----
+shell.c
+       - shell should send SIGHUP to all it's jobs when it receives
+         SIGHUP only if it is an interactive login shell
+
+execute_cmd.c
+       - systems running the Andrew File System don't use the Unix file
+         mode bits to decide whether or not a file is executable (they're
+         unused, since AFS as ACLs), so executable_file needs to call
+         access (file, X_OK) if running on AFS
+
+                                  9/25
+                                  ----
+jobs.c
+       - make sure a non-interactive shell initializes original_pgrp to
+         NO_PID, so it does not attempt to give the terminal back to that
+         pgrp when it exits or calls the `exec' builtin
+
+                                  10/3
+                                  ----
+machines.h
+       - add -DHAVE_RESOURCE to the NeXT machine description as SYSDEP_CFLAGS
+       - add -DHAVE_GETDTABLSIZE and -DHAVE_SETDTABLESIZE to Dynix/ptx
+         description
+
+shell.c
+       - make a non-interactive script shell call dup2 on the fd it has
+         open to the script file to move the descriptor to one that hopefully
+         user programs will not attempt to use
+
+general.c
+       - make the definition of getdtablesize() depend on HAVE_GETDTABLESIZE
+         not being defined.  Auto-define that for non-USG systems (or HPUX).
+         This allows a SYSDEP_CFLAGS entry to override it
+
+builtins/ulimit.def
+       - new function canraise(cmd, curlim, newlim) to call on systems
+         without HAVE_RESOURCE to decide whether or not the limit can be
+         raised.  Maybe we should remove the test altogether and let the
+         system call fail instead
+
+                                  10/8
+                                  ----
+execute_cmd.c
+       - If a command is not found, make the exit status 127 like Posix.2
+         says
+
+                                  10/14
+                                  -----
+print_cmd.c
+       - changed cprintf(s) to cnprintf(args_length, s) and made cnprintf
+         malloc the buffer it uses for vsprintf to avoid overrun of the
+         5000-character temp buffer used previously.  args_length is the
+         expected total length of all the arguments
+
+                                  10/15
+                                  -----
+jobs.c
+       - set last_command_exit_value before calling a trap handler for
+         SIGINT: new function process_exit_status(), changes to use it
+
+                                  10/18
+                                  -----
+print_cmd.c
+       - removed `cnprintf' changes
+       - re-implemented cprintf as a miniature vsprintf interpreting %s,
+         %d, and %c and using a dynamically-allocated buffer
+
+support/mksysdefs
+       - look for /usr/include/varargs.h and define HAVE_VARARGS_H if
+         found
+
+cpp-Makefile
+       - pass HAVE_VARARGS_H down to the makes in the various libraries
+
+                                  10/26
+                                  -----
+lib/glob/glob.c
+       - free `result' before using temp_results to return the value
+         of glob_dir_to_array -- plugs a small memory leak
+
+                                  11/2
+                                  ----
+[Fixes from bfox version dated 10/18]
+
+bashline.c
+       - separated definitions of BRACE_COMPLETION and the extern declaration
+         of the brace completion functions
+
+config.h
+       - make PROCESS_SUBSTITUTION depend on the value of MKFIFO_MISSING
+
+cpp-Makefile
+       - add posixstat.h, tilde.[ch], xmalloc.c to the readline library
+         sources (also the corresponding object files)
+       - make the definition of HAVE_TILDE_SOURCE depend on the definition
+         of HAVE_READLINE_SOURCE
+
+lib/posixheaders
+       - new directory, for posix support functions and header files
+       - various cleanups to the library support rules
+
+execute_cmd.c
+       - make the practice of checking hashed filenames for executability
+         dependent on $POSIXLY_CORRECT
+
+general.c
+       - The `hppa' running hpux-8 does not have `getdtablesize'
+
+general.h
+       - make the extern declaration of strchr and strrchr go away if
+         __STDC__ is defined
+jobs.h
+       - test for and define all of the W* macros individually
+
+machines.h
+       - completely new alliant description from bfox
+       - add -DMKFIFO_MISSING to NeXT SYSDEP_CFLAGS
+       - add description for Siemens MX500 running `sinix'
+
+builtins/common.c
+       - move code that depends on BANG_HISTORY being defined inside #ifdef
+         HISTORY blocks, since you can't have BANG_HISTORY without HISTORY
+
+builtins/echo.def
+       - make -E work all the time, not just on sys5 systems
+
+builtins/enable.def
+       - add -all option (with synonym of -a)
+       - change `DISABLED' to 2 and make argument to list_some_builtins a
+         bitmask
+
+builtins/kill.def
+       - it is an error if `signum' == NSIG
+
+documentation/bash.1
+       - added -E flag to `echo'
+       - added description of -all to enable
+
+lib/readline/tilde.c, lib/readline/xmalloc.c
+       - links to these files for standalone readline lib
+
+lib/readline/{funmap.c,history.c,keymaps.c,readline.c}
+       - make xmalloc and xrealloc static again and dependent on the
+         definition of STATIC_MALLOC
+
+lib/readline/readline.c
+       - include <sys/file.h> only if NO_SYS_FILE is not defined
+       - add support for a `stat' char after filenames when listing completion
+         alternatives if VISIBLE_STATS is defined
+       - add support for _GO32_ definition (PC)
+       - add LibraryVersion internal variable
+       - initialize rl_instream and rl_outstream to NULL, because all of a
+         sudden stdin and stdout may no longer be constants
+       - make readline_default_bindings `static void'
+       - add support for quoting a portion of the input line to make it
+         immune from completion
+
+support/getcppsyms.c
+       - recognize `alliant'
+
+support/mksysdefs
+       - presence of /bin/fxc.info indicates that the machine is an alliant
+
+support/{FAQ,PORTING,mklinks,fixdist}
+       - new files
+
+[end of changes from bfox]
+
+machines.h
+       - added support for HP-UX 9.0 (hpux_9)
+
+                                  11/12
+                                  -----
+machines.h
+       - added -lsocket to the REQUIRED_LIBRARIES define for ICL RS6000
+       - removed the `#undef HAVE_WAIT_H' from the isc386 description
+
+lib/readline/rltty.c
+       - split off almost all tty-related code from readline.c to this file
+
+                                  11/13
+                                  -----
+lib/readline/rltty.c
+       - changed the way the bsd tty code works to use a `struct bsdtty'
+         that encapsulates all of the bsd tty state into a single structure
+         that can be passed around by reference
+       - changed the bsd tty setup and teardown code to be more like the
+         ce version of things
+lib/readline/rldefs.h
+       - added code to define HAVE_USG_SIGHOLD for svr3 machines.  The
+         prepping and deprepping code uses them to block SIGINT while
+         getting and setting the tty attributes
+
+                                  11/14
+                                  -----
+lib/readline/rltty.c
+       - encapsulated the system-specific code for setting up the terminal
+         into a function: `prepare_terminal_settings'.  This means that the
+         code for rl_prep_terminal and rl_deprep_terminal is basically
+         identical between tty driver versions
+       - changed the BSD version of rltty_set_default_bindings to use a
+         struct bsdtty and get_tty_settings
+       - rl_prep_terminal and rl_deprep terminal are now non tty-driver
+         specific -- there is only one version of each function.  The
+         tty-driver specific code is now in {set,get}_tty_settings and
+         prepare_terminal_settings
+
+                                  11/24
+                                  -----
+
+general.c
+       - make the function definitions for bcopy and bzero depend on a
+         HAVE_BCOPY define
+
+machines.h
+       - define HAVE_BCOPY for RS/6000s, RTs running AIX, and Linux
+       - new description for Linux
+
+shell.c, variables.c
+       - don't declare getpwuid for Linux systems
+
+support/getcppsyms.c
+       - recognize `linux' and `__linux__'
+
+builtins/psize.c
+       - don't redefine memset() for USG machines
+
+general.c
+       - add extern declaration of getdtablesize() to dup2() replacement
+       - don't compile in bcopy and bzero on Linux machines
+
+test.c
+       - don't declare getgid, getegid, or geteuid on Linux
+
+lib/readline/rldefs.h
+       - don't try to include <sys/stream.h> on Linux machines
+
+lib/readline/readline.c
+       - only call rl_parse_and_bind on non-empty lines when reading
+         ~/.inputrc
+       - allow backslash to quote characters in the key sequence to be
+         bound, which allows you to bind C-x \ for example
+       - allow delimiter characters in the body of a macro, quoted with
+         a backslash
+       - changed rl_function_dumper so that it outputs backslash-quoted
+         " and \ when called by bind -d
+
+lib/readline/funmap.c
+       - fixed a typo in the entry for `vi-replace'
+
+subst.c
+       - make sure the $(( xxx )) case sets this_command_name to NULL so
+         there are no confusing garbled error messages
+       - fix a memory leak in $[ xxx ] code (free temp)
+       - make $(( xxx )) case do the same variable expansion that the
+         $[ xxx ] case does
+
+                                  11/25
+                                  -----
+parse.y
+       - removed CMD_FORCE_SUBSHELL assignments
+
+command.h
+       - add a new flag for commands: CMD_NO_FORK
+
+shell.c
+       - added a function run_one_command for -c shells that just sets up
+         the top_level stuff for longjmp and calls parse_and_exec.  This
+         is controlled by the definition of ONESHOT
+
+execute_cmd.c
+       - execute_disk_command takes an extra argument: nofork.  If non-zero,
+         this tells it to not fork for a command without pipes in or out
+       - set NO_FORK for a simple command run in a subshell with
+         want_subshell ( `( xxx )' )
+
+builtins/common.c
+       - if the from_file argument to parse_and_execute is "-c", then
+         assume this is a one-shot -c command and set NO_FORK for simple
+         commands.  This is controlled by the definition of ONESHOT
+
+                                  12/1
+                                  ----
+support/getcppsyms.c
+       - add defines for bsdi and __386BSD__
+
+machines.h
+       - add a section for 386bsd
+
+                                  12/2
+                                  ----
+input.c
+       - added a new function check_bash_input (fd) which checks whether
+         or not file descriptor fd is the buffered fd which bash is using
+         to read a script, and, if so, swaps the buffered fd to a new
+         file descriptor and reinits bash_input
+       - input buffering now solves these problems:
+               parent-child synchronization
+               using the script fd in a user redirection
+               auto-restart of interrupted reads on all systems
+               speed
+
+execute_cmd.c
+       - call check_bash_input from do_redirection_internal before a call
+         to dup2 and a call to duplicate_buffered_fd
+
+                                  12/3
+                                  ----
+builtins/getopt.c
+       - only redefine `const' if it is not already #defined
+
+lib/readline/rltty.c
+       - make sure HANDLE_SIGNALS is defined here as it is in readline.c
+
+                                  12/7
+                                  ----
+lib/malloc/malloc.c
+       - change the conditional around get_lim_data to be HAVE_RESOURCE
+         (ulimit if not defined, getrlimit if it is)
+       - removed the 4.1BSD version of get_lim_data
+       - conditionalize the inclusion of sys/resource.h on the definition
+         of HAVE_RESOURCE
+
+                                  12/11
+                                  -----
+lib/readline/readline.c
+       - changed the name of strpbrk to rl_strpbrk to avoid any conflicts
+         with OS include files and libraries
+
+                                  12/15
+                                  -----
+
+bashline.c
+       - changed initialize_readline to type void
+
+execute_cmd.c
+       - execute_for_command called expand_words with an extra argument
+
+jobs.c
+       - changed stop_pipeline to use xrealloc instead of realloc
+
+lib/readline/readline.c
+       - changed rl_complete_internal to call xmalloc instead of malloc
+
+variables.c
+       - dispose_used_env_vars, non_unsettable declared void
+
+builtins/common.c
+       - include <sys/stat.h> because we cast things to struct stat *
+
+builtins/exit.def
+       - change exit_or_logout to be declared static
+
+builtins/psize.c
+       - removed call to memset and therefore the need to #ifdef it's
+         definition
+
+builtins/bind.def, builtins/ulimit.def
+       - add extern declaration for strerror()
+
+builtins/exec.def
+       - add extern declaration for strerror()
+       - add extern declaration for full_pathname() and remove casts to
+         char *
+       - add extern declaration for make_word_array() and remove casts to
+         char **
+
+builtins/fc.def, copy_cmd.c, shell.c, parse.y
+       - add extern declaration for reverse_list()
+
+builtins/read.def
+       - change free to vfree so systems don't complain about the extern
+         declaration (type clashes, etc.)
+
+lib/tilde/tilde.c
+       - include string.h or strings.h as appropriate to get the correct
+         declaration of strcpy before the savestring macro uses it
+
+parse.y
+       - add extern declaration for sub_append_string and remove casts to
+         char *
+       - add extern declaration for add_string_to_list and remove casts to
+         WORD_LIST *
+
+                                  12/16
+                                  -----
+lib/malloc/malloc.c
+       - move the check for RLIMIT_DATA after the inclusion of
+         <sys/resource.h> (duh!)
+
+bashline.c
+       - added extern declaration for get_working_directory
+
+jobs.c
+       - added extern declaration for polite_directory_format
+
+execute_cmd.c
+       - added extern declaration for copy_redirects
+
+subst.c
+       - added extern declaration for reverse_list
+
+machines.h
+       - new entry for KSR1 running KSROS (OSF/1)
+
+support/getcppsyms.c
+       - recognize `ksr1'
+
+general.h
+       - make sure that strcpy is declared before the definition of
+         savestring
+
+alias.c, bashline.c, bracecomp.c, braces.c, copy_cmd.c, execute_cmd.c,
+expr.c, general.c, hash.c, jobs.c, mailcheck.c, make_cmd.c, print_cmd.c,
+trap.c, variables.c, parse.y
+        - make sure that string.h or strings.h is included before general.h
+          (which is included by shell.h)
+        
+builtins/mkbuiltins.c
+        - add extern declaration of strcpy if __STDC__ and strcpy not defined
+        - include <string.h> or <strings.h> as needed
+
+builtins/cd.def, builtins/shift.def, builtins/source.def, builtins/test.def,
+builtins/command.def, builtins/declare.def, builtins/fc.def,
+builtins/getopts.def, builtins/hash.def
+       - include <string.h> or <strings.h> before definition of savestring
+
+lib/tilde/tilde.c, lib/readline/chardefs.h
+       - include <string.h> or <strings.h> before definition of savestring
+
+lib/readline/readline.c
+       - made glean_key_from_name cast NAME to unsigned char * before
+         dereferencing it to better handle 8-bit character sets
+
+                                  12/17
+                                  -----
+subst.c
+       - made command_substitute set up top_level with setjmp so that shells
+         running command substitution won't longjmp all the way back to
+         main() if they're interrupted and call throw_to_top_level
+
+                                  12/18
+                                  -----
+lib/readline/readline.c
+       - split the code that handles setting the screen size off into a new
+         function: set_screen_size
+       - changed init_terminal_io to call set_screen_size
+       - changed rl_handle_sigwinch to call set_screen_size instead of
+         totally reinitializing the world on each SIGWINCH
+       - added a new function cr() that simply puts the cursor at physical
+         column 0
+       - changed rl_handle_sigwinch to call cr() and
+         rl_forced_update_display() after resetting its idea of the screen
+         size
+
+                                  12/20
+                                  -----
+lib/readline/history.c
+       - changed the way history_expand treats `\' to make it a general
+         quoting character like the shell treats it so that allows single
+         quotes to be quoted
+
+                                  12/23
+                                  -----
+machines.h
+       - changed M_OS define in BSDI description to BSD386, since cpp
+         doesn't like BSD/386
+
+                                  12/28
+                                  -----
+execute_cmd.c
+       - changed execute_case_command so that expand_word_no_split is called
+         on the `word', as Posix.2 specifies
+
+                                   1/5
+                                   ---
+machines.h
+       - new machine description for Dec Alpha running Dec OSF/1
+
+support/getcppsyms.c
+       - recognize alpha, __alpha, osf, and __osf__
+
+                                   1/7
+                                   ---
+lib/readline/readline.c
+       - removed definition of HANDLE_SIGNALS
+       - changed rl_signal_handler so that systems with HAVE_POSIX_SIGNALS
+         defined will not set the SIGINT handler to SIG_IGN
+       - include <sys/ioctl.h> for _386BSD and BSD386 for TIOCGWINSZ
+
+lib/readline/rldefs.h
+       - added definition of HANDLE_SIGNALS
+
+lib/readline/rltty.c
+       - added GETATTR and SETATTR macros for termios/termio systems for
+         use by get_tty_settings and set_tty_settings
+
+                                   1/9
+                                   ---
+shell.c
+       - new variable: startup_state.  Set to 0 for scripts, 1 for
+         interactive shells, and 2 for -c command shells.  Superset of
+         the functionality provided by the `interactive_shell' variable
+
+builtins/common.c
+       - changed parse_and_execute to use startup_state to detect that
+         it's being called as a result of -c command, rather than the
+         ad-hoc method previously employed
+
+                                  1/11
+                                  ----
+support/getcppsyms.c
+       - recognize `m88k'
+
+machines.h
+       - new description for Motorola M88K Delta running SVR4
+
+support/mksysdefs
+       - moved the defaulting of `SYSDEF' to `cadmus' until just before
+         the definition is written out
+
+shell.c
+       - changed ambiguous assignment to `login_shell' by introducing a
+         dummy variable (~line 400: login_shell = -++login_shell)
+
+lib/malloc/malloc.c
+       - moved the code that decides whether or not to define USG or
+         BSD4_2 inside checks for USG and USGr4, since USGr4 passes
+         the tests for the various signals
+
+alias.c
+       - changed a call to index() to strchr()
+
+                                  1/12
+                                  ----
+lib/readline/readline.c
+       - moved inclusion of posixstat.h before inclusion of rldefs.h
+         (rldefs.h requires that stat.h be included before it)
+       - don't test whether or not a file is a symlink or a socket
+         in stat_char unless S_ISLNK and S_ISSOCK are defined,
+         respectively
+
+                                  1/13
+                                  ----
+machines.h
+       - added -I/usr/ucbinclude to SYSDEP_CFLAGS and a #define 
+         USE_GNU_TERMCAP for the ICL DRS6000 description
+
+support/bashbug.c
+       - added definition for gethostname() for systems that do not have
+         it (USG except for SGI and HP)
+
+                                  1/14
+                                  ----
+test.c
+       - made the #define of uid_t also dependent on HAVE_UID_T being
+         undefined.  That way, hosts which have trouble can add a
+         -DHAVE_UID_T to SYSDEP_CFLAGS in the machines.h entry
+       - made the extern declaration of getgid() be conditionalized out
+         on Sony non-Posix machines
+
+machines.h
+       - added -DHAVE_UID_T to SYSDEP_CFLAGS in the Sony/BSD entry
+
+                                  1/15
+                                  ----
+parse.y
+       - made type of `report_syntax_error' be static void
+       - made type of `handle_eof_input_unit' be static void
+       - added an error message when EOF is reached unexpectedly
+         (if EOF_Reached is 1 when report_syntax_error is called)
+       - added `extern void make_here_document ();'
+
+make_cmd.c
+       - made type of make_here_document be void
+
+execute_cmd.c
+       - added declarations of set_clexec to function prologues for
+         do_redirection and do_redirection_internal
+
+variables.c
+       - added `extern long atol()' to assign_seconds ()
+
+jobs.c
+       - changed type of `making_children ()' to void
+       - removed unused label `wait_exit' in wait_for()
+       - changed `sigset_t set' to `sigset_t suspend_set' inside the
+         BROKEN_SIGSUSPEND definition because `set' shadows the
+         definition used in BLOCK_CHILD and UNBLOCK_CHILD
+
+mailcheck.c
+       - changed type of add_mail_file to void
+
+alias.c
+       - changed type of delete_all_aliases to void
+       - changed block-local declaration of `tl' to `tlen', because
+         `tl' shadows a function-scope variable
+
+input.c
+       - made duplicate_buffered_stream return new fd (like dup2) when
+         it finishes
+       - made free_buffered_stream() a void-valued function
+
+bashline.c
+       - cleaned up the precedence of the expression that checks whether
+         or not the ignore patterns have changed in setup_ignore_patterns
+
+lib/readline/readline.c
+       - made rl_gather_tyi a void-valued function
+       - made rl_dispatch a void-valued function
+       - made rl_redisplay a void-valued function
+       - made free_history_entry a void-valued function
+       - removed unused label `some_matches' from rl_complete_internal
+
+lib/readline/vi_mode.c
+       - removed check of return value from rl_dispatch in rl_vi_redo,
+         since rl_dispatch never returned one anyway
+
+lib/readline/history.c
+       - removed unused label `search_won' in get_history_event
+       - removed unused label `read_which' in get_history_event
+       - removed unused label `bad_word_spec' in history_expand
+       - removed unused label `error_exit' in history_expand
+       - changed block-local declaration of `len' to `slen' in
+         history_expand because len shadows a function-local variable
+       - changed block-local declaration of `l' to `ll' in
+         history_expand because len shadows a function-local variable
+       - removed unused label `get_first' in get_history_word_specifier
+
+                                  1/18
+                                  ----
+parse.y
+       - fixed up the support for `unexpected EOF' errors by making
+         read_token set `EOF_Reached' to 1 before returning yacc_EOF
+         when it reads EOF while looking for the start of a token
+       - added better messages for unexpected eof to report_syntax_error
+       - added better messages for unexpected tokens to report_syntax_error
+       - made handle_eof_input_unit reset EOF_Reached to 0 if the
+         shell is interactive
+       - made report_syntax_error reset EOF_Reached to 0 if the
+         shell is interactive
+       - changed the non-interactive error messages to add `line' before
+         printing the line number rather than simply use filename:digit:
+
+                                  1/19
+                                  ----
+builtins/type.def
+       - changed code so that simple `type' (-all not specified) takes
+         the same path as a regular command search (find_user_command()
+         rather than user_command_matches())
+
+                                  1/20
+                                  ----
+shell.c
+       - new variable `passwd_shell' set from the pw_shell field in the
+         password file
+       - new variable `passwd_dir' set from the pw_dir field in the
+         password file
+
+variables.c
+       - used passwd_shell and passwd_dir to eliminate the calls to the
+         getpw* functions
+       - if $SHELL is unset at shell startup, it is set to the value of
+         passwd_shell
+
+                                  1/21
+                                  ----
+support/mksysdefs
+       - look for sys/ptem.h, define HAVE_SYS_PTEM_H if found
+       - look for sys/pte.h, define HAVE_SYS_PTE_H if found
+
+cpp-Makefile
+       - pass HAVE_SYS_PTEM_H and HAVE_SYS_PTE_H to the readline make
+
+lib/readline/rldefs.h
+       - include sys/ptem.h and sys/pte.h depending on the above two
+         definitions
+
+lib/readline/readline.c
+       - include <sys/ioctl.h> if on an AIX system to get TIOCGWINSZ and
+         struct winsize
+
+machines.h
+       - added #undef HAVE_ALLOCA to hpux_6 description.  alloca seems
+         to have problems when passing alloca'd memory to other functions
+         (esp. in the globbing code, passing directory_name)
+
+                                  1/22
+                                  ----
+machines.h
+       - make the cadmus definition active only of M_MACHINE is not defined
+         when the code gets there
+
+                                   2/1
+                                   ---
+builtins/set.def
+       - changed the reference to $9 in the help string
+       - added `-' to the help string listing the options
+
+documentation/bash.1
+       - changed the reference to $9 in the set builtin description
+       - added `-' to the set builtin synopsis listing the options
+
+                                   2/2
+                                   ---
+machines.h
+       - added REQUIRED_LIBARIES = -lPW -lc_s to SCO unix description
+         when not using gcc
+
+variables.c
+       - new variable builtin_env; builtin analogue of function_env
+       - new function dispose_builtin_env to free up all strings in
+         builtin_env
+       - find_tempenv_variable now looks in builtin_env after the
+         temporary environment
+
+execute_cmd.c
+       - execute_builtin_or_function and execute_subshell_builtin_or_function
+         now set up builtin_env for the `source' builtin so that things like
+         this work:
+               foo contains:
+                       echo XXX=$XXX
+                       echo XXX=$XXX
+               and you run
+                       XXX=aaa . foo
+               which should output
+                       XXX=aaa
+                       XXX=aaa
+         (bug report by mfg@castle.ed.ac.uk)
+
+                                   2/3
+                                   ---
+execute_cmd.c
+       - when a command is forced into a subshell with ( ), turn off its
+         INVERT_RETURN bit in the flags so the exit status of the subshell
+         is not inverted.  In execute_command_internal
+
+                                   2/5
+                                   ---
+[work to make readline configurably 8-bit clean]
+
+lib/readline/readline.c
+       - added variable convert_meta_chars_to_ascii, which controls
+         whether meta characters are converted into ESC-prefixed
+         key sequences.  Set to 1 by default
+       - added a readline variable `convert-meta', settable in a
+         .inputrc, that controls the value of convert_meta_chars_to_ascii
+
+lib/readline/keymaps.h
+       - changed the hard-coded keymap size of 128 to a #define
+         of KEYMAP_SIZE, which is initially 128
+
+lib/readline/keymaps.c
+       - changed all instances of 128 to KEYMAP_SIZE
+       - changed rl_make_keymap to initialize positions 128-256 to
+         rl_insert if KEYMAP_SIZE > 128
+
+lib/readline/chardefs.h
+       - properly define _CHARDEFS_ to protect against multiple inclusion
+
+documentation/bash.1
+       - documented new `convert-meta' readline variable
+
+                                   2/7
+                                   ---
+lib/readline/keymaps.h
+       - increased KEYMAP_SIZE to 256
+
+lib/readline/emacs_keymap.c
+       - added entries to make the keymaps 256 entries.  The entries in
+         emacs_standard_keymap are the ISO Latin-1 characters
+
+lib/readline/vi_keymap.c
+       - added entries to make the keymaps 256 entries.  The entries in
+         vi_insertion_keymap are the ISO Latin-1 characters
+
+                                   2/8
+                                   ---
+lib/readline/readline.c
+       - make sure that rl_display checks that there is room for 8 more
+         characters when deciding whether or not to realloc the line,
+         since we might have to insert a tab
+       - rl_display_search should not use MESSAGE as a printf format
+         string, since it might contain %
+       - reversed arguments in calls to rl_kill_text in
+         rl_unix_word_rubout so that killed text is prepended to the
+         undo data rather than appended
+
+                                   2/9
+                                   ---
+builtins/alias.def
+       - moved single_quote() to builtins/common.c and made it global
+
+builtins/trap.def
+       - made sure that the output of `trap' is suitable for re-input
+         to the shell as a trap definition by using proper single-quoting
+         of the command
+
+lib/readline/readline.c
+       - new readline variable `completion-query-items' to control the
+         value of rl_completion_query_items (initially and by default
+         100)
+       - new function rl_insert_completions which performs a call to
+         rl_complete_internal ('*')
+
+lib/readline/readline.h
+       - added extern declaration for rl_insert_completions ()
+
+lib/readline/funmap.c
+       - added bindable command name `insert-completions' that maps to a
+         call to rl_insert_completions ()
+
+documentation/bash.1
+       - added documentation for new `completion-query-items' readline
+         variable
+       - added documentation for new `insert-completions' readline
+         command
+
+                                  2/10
+                                  ----
+subst.c
+       - made ${xxx} behave correctly when the -u option was on and xxx
+         was not set
+       - made $xxx with -u enabled and xxx unset set $? to 1
+
+lib/malloc/malloc.c
+       - made free() a void function, like ANSI and Posix say to
+
+support/mksydefs
+       - look for /usr/include/stdlib.h and define HAVE_STDLIB_H if found
+
+cpp-Makefile
+       - pass HAVE_STDLIB_H to all makes
+
+ansi_stdlib.h
+       - new file containing the extern function declarations that ANSI
+         puts into <stdlib.h> that bash uses; really a link to
+         lib/posixheaders/ansi_stdlib.h
+
+lib/posixheaders/ansi_stdlib.h
+       - real copy of ansi_stdlib.h
+
+alias.c, bashline.c, variables.c, shell.c, error.c, hash.c, signames.c,
+expr.c, general.c, input.c, builtins/mkbuiltins.c, builtins/fc.def,
+lib/glob/glob.c, lib/tilde/tilde.c, lib/malloc/xmalloc.c
+       - include <stdlib.h> if HAVE_STDLIB_H is defined, include
+         ansi_stdlib.h if not
+
+general.h, alias.h
+       - removed extern declarations for malloc and realloc
+
+lib/readline/{readline,history,funmap,keymaps,vi_mode}.c
+       - include <stdlib.h> or ansi_stdlib.h
+       - remove extern char *getenv() declarations
+
+cpp-Makefile
+       - added dependencies on ansi_stdlib.h
+
+support/fixdist
+       - changes to make things work with ansi_stdlib.h (basically just
+         dupliating the lines for posixstat.h)
+
+alias.h, braces.c, expr.c, general.h, hash.h, vprint.c,
+builtins/fc.def, builtins/getopts.def, lib/glob/glob.c,
+lib/tilde/tilde.c
+       - define NULL as ((void *)0) if NULL undefined and compiling in an
+         ANSI C environment (__STDC__)
+
+                                  2/11
+                                  ----
+lib/readline/readline.c
+       - moved declaration of convert_meta_chars_to_ascii into the `forward'
+         declarations section, before its first use
+
+                                  2/13
+                                  ----
+expr.c
+       - if x is a char *, don't compare *x to NULL, use '\0' instead
+
+                                  2/15
+                                  ----
+lib/readline/readline.c
+       - add a call to rl_initialize_funmap at the beginning of
+         rl_named_function to make sure all of the function names will
+         be found
+
+                                  2/16
+                                  ----
+parse.y
+       - handle double-quoted ${...} words like the Posix.2 spec says --
+         count braces and skip command substitutions and quoted strings
+         to find the end of the pattern: new variables delimited_brace_level
+         and dollar_brace_level
+       - add new variable embedded_quoted_string so that the parser can
+         skip embedded quoted strings while parsing $() and ${}
+         constructs
+
+subst.c
+       - new function: extract_dollar_brace_string () which implements
+         the Posix.2 rules about ${...} extraction: counting braces while
+         skipping quoted strings and command substitutions.  Called from
+         extract_string_double_quoted and expand_word_internal
+       - changed the way pattern removal was done: the pattern is now
+         run through tilde expansion, parameter expansion, command
+         substitution, and arithmetic substitution, then quoted in a
+         way acceptable to fnmatch with quote_string_for_globbing
+       - add code so that expansions like ${HOME:`xxxx`} are errors, as
+         they should be, and put the full expansion string in the error
+         message
+
+                                  2/17
+                                  ----
+
+subst.c
+       - changed expand_word_internal to call parameter_brace_expand_rhs
+         with the `quoted' parameter set to 0 except when the separator
+         between PARAM and WORD is `+'.  This makes things like
+
+               echo "${undef-"foo bar"}"
+         echo `foo bar' without the quotes.  I'm still not sure this is
+         right, but it is compatible with other versions of sh
+
+                                  2/18
+                                  ----
+parse.y
+       - add code to reserved_word_acceptable so that bash will parse a
+         reserved word after a `}'
+
+getcwd.c
+       - make it compilable on machines without dirent.h and struct direct
+         or unistd.h (like the NeXT) using the proper conditional inclusion
+         with HAVE_DIRENT_H and HAVE_UNISTD_H
+
+general.c
+       - moved the getwd() replacement out from inside #ifdef USG and just
+         protected it with #ifdef HAVE_GETWD
+
+machines.h
+       - added #undef HAVE_GETWD and #undef HAVE_GETCWD to the NeXT
+         machine description
+
+subst.c
+       - added `forward' declarations for tilde_expand and
+         expand_string_unsplit and removed the function-local extern
+         declarations
+
+                                  2/19
+                                  ----
+getcwd.c
+       - changed to do conditional inclusion of limits.h, stdlib.h, string.h
+
+                                  2/22
+                                  ----
+builtins/cd.def
+       - if the chdir to the canonicalized form of the pathname in
+         change_to_directory fails, try what the user passed.  If that
+         succeeds, reinitialize the_current_working_directory to what
+         getwd() returns, and return success.  Fix for pathological
+         cases like
+
+               mkdir x
+               cd x
+               ( cd .. ; mv x y )
+               cd .
+
+                                  2/24
+                                  ----
+command.h
+       - added extern declarations for make_word_array, make_command,
+         make_bare_simple_command, and make_here_document
+       - added extern declarations for functions in copy_command.c:
+         copy_command, copy_word, copy_word_list, copy_redirect,
+         copy_redirects
+
+copy_cmd.c
+       - made all functions not used outside this file static
+
+execute_cmd.c
+       - removed extern declaration of make_word_array
+
+                                  2/25
+                                  ----
+shell.c
+       - made non-interactive shell look for $BASH_ENV startup file rather
+         than $ENV (conflict with Posix.2)
+
+command.h
+       - broke the `union redirectee' out of the struct redirect, made
+         the union it's own typedef (REDIRECTEE), then added
+         REDIRECTEE redirectee to the struct redirect
+       - made the `dest' member of a REDIRECTEE a long.  It matters on
+         some machines (sizeof(long) == sizeof(pointer) != sizeof(int)
+         and works on those machines with all those sizes being 32 bits
+         (this should really be a typedef rather than a long)
+
+execute_cmd.c, parse.y
+       - changed all calls to make_redirection to pass a WORD_DESC * or
+         a long as the third argument to make_redirection
+[this should conclude the changes needed for the alpha]
+
+                                   3/2
+                                   ---
+subst.c, variables.c
+       - moved some function-scope extern function declarations to file
+         scope
+
+subst.c
+       - changed paramter_brace_expand_pattern to call expand_string_internal
+         on the removal pattern, since we do not want word splitting
+
+jobs.c
+       - call get_tty_state or set_tty_state in wait_for() depending on
+         a job's exit status when interactive_shell is set, rather
+         than testing interactive.  This makes stty commands in scripts
+         executed with `.' `stick'
+
+nojobs.c
+       - make sure we only call {set,get}_tty_state when interactive_shell
+         is set
+
+                                   3/3
+                                   ---
+unwind_prot.c
+       - make sure there is actually something on unwind_protect_list
+         before calling without_interrupts to run something on it or
+         delete something from it
+
+jobs.c
+       - make sure job_slots is not empty in cleanup_dead_jobs and
+         delete_all_jobs before actually doing something
+
+                                   3/4
+                                   ---
+machines.h
+       - add #undef HAVE_GETWD to Xenix286 machine description
+
+lib/readline/history.c
+       - fixed an off-by-one error in the history expansion code: if
+         the length of the result string after adding the current piece
+         is (allocated_len - 1), the strcpy will write over the first
+         marker placed there by the malloc debugging code.
+       - changed the history realloc code to work in 256-character chunks
+         rather than 255-character ones
+
+                                   3/8
+                                   ---
+execute_cmd.c
+       - new variable exec_redirection_undo_list that holds redirections
+         that must be undone even when `exec' throws away
+         redirection_undo_list.  These are copies of open files for
+         constructs like 7<&1.  Set in add_undo_redirect and used in
+         execute_builtin_or_function.  Disposed of otherwise.
+
+                                   3/9
+                                   ---
+execute_cmd.c
+       - fixed a memory leak in execute_builtin_or_function by adding an
+         unwind_protect to dispose of saved_undo_list
+       - anywhere do_redirections is called with INTERNAL==1 (which means
+         we make redirection_undo_list), arrange to clean up 
+         exec_redirection_undo_list
+
+print_cmd.c
+       - massive namespace cleanups -- made almost all functions static
+       - new function `colon' to be called in place of `cprintf(";")'
+         to ensure that we don't print a `;' right after a `&' from 
+         compound command printing functions (if, while, until, for)
+
+[put code out for FTP on 3/10]
+
+                                  3/11
+                                  ----
+documentation/bash.1
+       - removed the description of >&word as a way to redirect both
+         standard output and standard error
+
+endian.c
+       - moved new-endian.c to this.  This handles 64-bit machines
+         directly
+
+lib/readline/readline.c
+       - rl_copy -> rl_copy_text to avoid clashes with Sun's libraries
+       - moved the completion code to a new file
+
+lib/readline/complete.c
+       - new file with the completion code from readline
+
+lib/readline/Makefile, cpp-Makefile
+       - added complete.c and complete.o to the necessary make variables
+
+subst.c
+       - added an entry to special_vars to make a change to $TERMINFO
+         cause readline to reset itself (sv_terminal())
+
+                                  3/12
+                                  ----
+builtins/exec.def
+       - free `command' if the exec fails
+
+machines.h
+       - change sgi machine description to define HAVE_GETWD
+
+lib/readline/history.c
+       - fixed a memory leak in read_history_range -- need to free
+         `buffer' before returning
+       - if read(2) returns <= 0 in history_truncate_file, then
+         immediately exit
+       - start checking at buffer[chars_read - 1] for newlines
+
+lib/readline/readline.c
+       - fixed a memory leak in rl_read_init_file -- `buffer' must
+         be freed before we return
+       - rearranged code in update_line so that we check for ols and
+         nls being in bounds before trying to compare their values
+
+parse.y
+       - fixed memory leak in read_token -- don't need to save `token'
+         into a fresh variable before calling push_string because
+         push_string does its own savestring in save_expansion
+
+subst.c
+       - fixed memory leak in expand_words_internal -- the word_list
+         allocated by the `@' case when expanding $@ needs to
+         be freed after turning it into a string with string_list
+       - fixed memory leak in expand_word_internal -- the string
+         returned by extract_dollar_brace_string needs to be freed
+       - fixed memory leak in expand_word_internal -- the string
+         returned by substring() in the `default:' case needs to be
+         freed
+
+variables.c
+       - fixed a free-memory reference in makunbound -- have to save the
+         value of `name' before calling dispose_variable, because it
+         might directly reference old_var->name.  If so, then
+         stupidly_hack_special_variables will refer to freed memory
+
+dispose_cmd.c
+       - fixed a memory leak in dispose_command: if a group_command is
+         being disposed, need to free command->value.Group after
+         calling dispose_command (command->value.Group->command);
+       - fixed a memory leak in dispose_command: if a case command is
+         being disposed, need to free command->value.Case after
+         freeing everything else
+
+mailcheck.c
+       - fixed memory leak in remember_mail_dates -- need to
+         free the value returned by get_mailpaths()
+       - fixed memory leak in remember_mail_dates -- need to
+         free the value returned by extract_colon_unit()
+
+                                  3/13
+                                  ----
+bashline.c
+       - fixed memory leak in bash_symbolic_link_hook -- 
+         get_working_directory always returns newly-allocated memory
+         that must be freed
+       - fixed memory leak in bash_symbolic_link_hook -- 
+         if `*dirname' is going to be replaced, the current contents
+         have to be freed (if non-null)
+       - make bash_symbolic_link_hook call get_working_directory with
+         a non-empty string for the value of `for_whom'
+
+execute_cmd.c
+       - make sure that execute_command cleans up after itself by
+         disposing the fd_bitmap it allocates
+
+shell.c
+       - fixed memory leak in reader_loop -- if throw_to_top_level is
+         called with DISCARD, the current command needs to be disposed
+
+lib/readline/complete.c
+       - when we return NULL to indicate the end of a set of completion
+         matches, free dirname, filename, and users_dirname -- there's
+         no reason to let them persist between calls, consuming memory
+
+                                  3/16
+                                  ----
+shell.c
+       - when moving the `script' fd to the highest available fd, check
+         for getdtablesize returning -1 and default to 20 in that case
+
+jobs.c
+       - if getdtablesize returns something < 0, default to 20 
+       - check that getdtablesize() leaves `nds' set to something valid
+         before trying to dup2 shell_tty to it
+
+machines.h
+       - changed M_OS in KSR/1 description to OSF1
+
+maxpath.h
+       - include sys/param.h if __ksr1__ defined
+
+parse.y
+       - changed declaration of the_time from long to time_t
+
+lib/readline/readline.c
+       - changed extern declarations for rl_basic_word_break_characters
+         and rl_completer_word_break_characters to file scope rather
+         than block scope
+       - changed declaration of chars_avail (param to FIONREAD ioctl) to
+         int, which it should have been all along
+
+                                  3/17
+                                  ----
+jobs.c
+       - clamp nfds in initialize_jobs at 256
+
+shell.c
+       - clamp the value returned by getdtablesize() to 256
+
+                                  3/19
+                                  ----
+execute_cmd.c
+       - make find_user_command_in_path return a pathname if it exists
+         and the caller wants FS_EXISTS files.  This affects the `.'
+         builtin and files as script arguments to the shell (shell.c)
+       - clamp the highest-numbered file descriptior at 256 in
+         close_all_files().
+
+jobs.c
+       - make get_tty_info print error message on tcgetattr failure only
+         if interactive != 0 (that is, we're really interactive now)
+
+lib/readline/rltty.c
+       - changed SETATTR macro to call tcsetattr with TCSANOW flag, since
+         this call is being used to affect an input file descriptor.
+         Ditto for the sys5 tty driver code and TCSETA (was TCSADRAIN and
+         TCSETAW, respectively)
+       - added a flag for ksr1 machines `ksrflow' which is the state of
+         suspended output for this process.  If 1, this process has called
+         tcflow (tty, TCOOFF) to suspend output and tcflow(tty, TCOON)
+         may be called safely
+       - temporarily (?) disabled the code that simulates at ^Q at the end
+         of set_tty_settings.  Let's see if it makes any difference
+
+                                  3/22
+                                  ----
+execute_cmd.c
+       - new global variable (yucch) `current_fds_to_close' that is set to
+         the fd_bitmap passed to execute_simple_command while expand_words
+         is being executed so that this information is available to the
+         process substitution code
+       - set current_fds_to_close to NULL at start of execute_command
+
+subst.c
+       - change call to close_all_files in process_substitute to call
+         close_fd_bitmap (current_fds_to_close)
+       - fixed memory leak in parameter_brace_expand_length() -- need to
+         free the memory used to expand the PS1 in something like ${#PS1}
+       - fixed memory leak in expand_word_internal ${3:+posix} did not
+         free the memory used to expand the $3
+
+documentation/bash.1
+       - && and || have equal precedence; fixed up man page to reflect
+         this
+
+                                  3/23
+                                  ----
+[fixes from bfox version of 1.13 dated 3/21/93 from eos.ucsb.edu]
+
+config.h
+       - #undef alloca before redefining it as __builtin_alloca
+
+cpp-Makefile
+       - compile newversion.c with $(CFLAGS) instead of $(DEBUG_FLAGS)
+
+general.h
+       - new #define: maybe_free(x)
+
+jobs.c
+       - alliant has same problem as NeXT wrt /usr/etc/rlogind and /dev/tty
+       - make delete_all_jobs be static void
+
+builtins/cd.def
+       - use maybe_free define
+
+builtins/common.c
+       - HAVE_VPRINTF --> HAVE_VFPRINTF
+
+builtins/test.def
+       - document -h as a synonym for -L
+
+lib/readline/history.c, lib/readline/rldefs.h
+       - #undef alloca before redefining it as __builtin_alloca
+
+lib/readline/history.c
+       - new functions history_get_state and history_set_state
+
+lib/readline/tilde.c
+       - put in #pragma alloca if on AIX machine
+
+support/getcppsyms.c
+       - recognize __GNUC__ and __STDC__ and pass them along as output
+
+                                  3/24
+                                  ----
+
+subst.c
+       - removed fully_quoted_word(), since it was unused
+
+execute_cmd.c
+       - added extern declarations for functions in dispose_cmd.c
+       - removed extern declaration of atol()
+
+parse.y
+       - added extern declaration for dispose_words()
+
+documentation/bash.1
+       - re-added the description of >&filename as a way to redirect
+         both stdout and stderr to filename
+
+machines.h
+       - slight changes to the alpha description
+
+shell.c
+       - moved all the extern function declarations to have file scope
+
+print_cmd.c
+       - colon --> semicolon
+
+parse.y
+       - in read_token, if we're parsing an embedded quoted string, don't
+         bother with special processing of `$' and characters following
+
+                                  3/25
+                                  ----
+print_cmd.c
+       - added a new function the_printed_command_resize to expand the
+         printed command buffer in cprintf()
+
+builtins/bind.def
+       - removed the unwind-protect code, because unwind_protect_pointer
+         is not guaranteed to work on a FILE *
+
+lib/readline/readline.c
+       - assign in_stream and out_stream immediately, because they may
+         be used before readline_internal is called
+
+                                  3/26
+                                  ----
+cpp-Makefile
+       - allow for use of different compress programs with the use of
+         $(COMPRESS) and $(COMPRESS_EXT)
+
+                                  3/29
+                                  ----
+
+general.c
+       - new function set_lines_and_columns to set $LINES and $COLUMNS in
+         response to a SIGWINCH
+
+lib/readline/readline.c
+       - call set_lines_and_columns() in set_screen_size() to set the
+         right environment variables on a SIGWINCH (code needed to be
+         rearranged a bit to make this happen)
+
+jobs.c
+       - add a SIGWINCH handler to set $LINES and $COLUMNS if readline is
+         not being compiled into the shell and TIOCGWINSZ and SIGWINCH
+         are defined
+
+subst.c
+       - made dequote_string extern so `read' can use it
+
+builtins/read.def
+       - added CTLESC characters to represent escapes instead of doing
+         backslash processing internally
+
+braces.c
+       - fixed the brace expansion code so that backslash can correctly
+         act as an escape character, and escape `"' in a double-quoted
+         string
+
+                                  3/31
+                                  ----
+make_cmd.c
+       - the `<>' redirection needs to open the file O_RDWR|O_CREAT
+         for Posix.2 compatibility
+
+                                   4/1
+                                   ---
+parse.y
+       - the function read_a_line was changed to take a flag telling it
+         whether or not to remove quoted newlines
+       - read_secondary_line was changed to call read_a_line with an arg
+         of 1, telling it to strip \<newline> pairs
+
+         These two changes fix two bugs with here documents:
+               1.  delimiter check occurs after \<newline> stripping
+               2.  leading tab deletion occurs after \<newline> stripping
+
+lib/readline/rldefs.h
+       - include <termcap.h> if on Linux
+
+lib/readline/readline.c
+       - don't declare PC, BC, and UP if on Linux (??)
+       - change the conditional parsing code that handles the `$if term='
+         construct to test the name given in the if command against both
+         the `long' and `short' forms of rl_terminal_name.  For instance,
+         if `rl_terminal_name' were `sun-cmd', it would be tested with
+         stricmp against both `sun' and `sun-cmd'
+
+machines.h
+       - add HAVE_VFPRINTF to the Linux description
+
+unwind_prot.h
+       - change the unwind_protect_int macro to cast the second argument to
+         unwind_protect_var to a (char *), which is what unwind_protect_var
+         expects
+
+unwind_prot.c
+       - change unwind_protect_var to allocate memory and do a bcopy if the
+         size of the variable passed to save is not sizeof(int).  That's
+         what restore_variable expects
+
+lib/readline/complete.c
+       - fixed rl_complete_internal so that it pays attention to the value
+         of rl_completer_quote_characters and quotes a match if the match
+         contains a word break character
+
+bashline.c
+       - set rl_completer_quote_characters to ' and "
+
+                                   4/5
+                                   ---
+lib/readline/complete.c
+       - changed rl_complete_internal so that an `attempted completion
+         function' may tell readline not to perform filename completion
+         if it fails by returning (char **) -1
+
+bashline.c
+       - attempt_shell_completion should return (char **) -1 if doing
+         command word completion and no matches are found.  This will
+         tell readline not to perform filename completion
+
+                                   4/6
+                                   ---
+builtins/common.c
+       - fixed the error message printer by get_working_directory:
+         `for_whom', shell_name, or `bash: ' is printed first; the
+         first non-empty one being printed.  Explanatory text is
+         added to the error message
+
+                                   4/7
+                                   ---
+machines.h
+       - in the Sun section, define Solaris of either `USGr4' or __svr4__
+         is defined
+       - Solaris 2 systems have sys_siglist, so don't #undef HAVE_SYS_SIGLIST
+
+jobs.c
+       - don't declare sys_siglist if on Solaris 2
+
+                                   4/8
+                                   ---
+lib/readline/rldefs.h
+       - do not define USE_XON_XOFF.  This causes output to be swallowed
+         when using bash over a relatively slow line (like a modem line).
+         This means that ^S and ^Q don't work on termio/termios systems;
+         use ^V to quote characters instead
+
+variables.c
+       - don't perform a get_working_directory on startup unless we did
+         not inherit $PWD or the inherited value of $PWD is wrong
+
+trap.c
+       - new functions: free_trap_strings and reset_original_signals.
+         Together they do the same thing as restore_original_signals()
+
+jobs.c, nojobs.c
+       - removed call to restore_original_signals from make_child.  Now
+         callers have to handle this themselves
+
+execute_cmd.c
+       - added a call to restore_original_signals after make_child in the
+         child process everywhere make_child is called
+
+subst.c
+       - added call to restore_original_signals after make_child in
+         process_substitute
+       - added call to reset_signal_handlers after make_child in
+         command_substitute for the child process
+
+         [THERE IS A PROBLEM WITH A TRAP on `0' -- it is inherited in the
+          child process started to run the command substitution]
+
+[These are fixes to make savetraps="$(trap)" work as Posix.2 specifies]
+
+                                  4/11
+                                  ----
+bashline.c
+       - supply a value for rl_completer_word_break_characters; `$' is
+         not a shell word break character
+
+                                  4/13
+                                  ----
+lib/readline/complete.c
+       - only look at adding quote characters to completion matches if
+         we're doing filename completion
+
+bashline.c
+       - don't supply a value for rl_completer_word_break_characters
+
+                                  4/14
+                                  ----
+documentation/bash.1
+       - clarify what the readline function shell-expand-line does
+
+jobs.c
+       - clean up dead jobs in wait_for even in non-interactive shells
+         rather than waiting for the next call to the parser
+
+                                  4/15
+                                  ----
+bashline.c
+       - reorganized the shell_expand_line code; broke it up into several
+         discrete functions
+       - added new functions: history_and_alias_expand_line,
+         history_expand_line
+       - added a new emacs-mode command, M-!, bound to history-expand-line
+
+                                  4/18
+                                  ----
+unwind_prot.c
+       - more fixes to the save-variable and restore-variable code,
+         mostly to make things work better on machines like the alpha
+         where sizeof(int) != sizeof(char *):
+
+               save and restore now use identical logic and nearly
+               identical code to decide whether or not to use malloc and
+               bcopy or assignment
+
+builtins/common.c
+       - new functions to manage the state of the dollar variables:
+
+               dollar_vars_changed - return 1 if the dollar variables have
+                                     been changed
+               set_dollar_vars_changed - set the state of dollar variable
+                                         modification to `changed'
+               set_dollar_vars_unchanged - set the state of dollar variable
+                                         modification to `unchanged'
+
+builtins/source.def
+       - new function: maybe_pop_dollar_vars.  This is called so that the
+         `.' command will restore the dollar variables only if the script
+         run with . has not changed them.  If the script changed $@, the
+         new values should stay in place
+       - changes to source_builtin to set the state of the dollar
+         variables to `unchanged' before executing the script, and calling
+         maybe_pop_dollar_vars() to decide whether or not to restore the
+         dollar variables and to do so if warranted
+
+machines.h
+       - new description for NEC EWS4800, from m-hirano@sra.co.jp via
+         hikichi@sra.co.jp
+
+                                  4/19
+                                  ----
+support/mksysdefs
+       - check for both /hp-ux and /bin/uname before deciding a machine
+         should be checked for an HP/UX revision level
+
+                                  4/22
+                                  ----
+input.h, general.h, lib/readline/readline.h, lib/tilde/tilde.h
+       - added typedefs for CPFunction (pointer to function returning
+         pointer to char) and CPPFunction (pointer to function returning
+         pointer to pointer to char)
+
+execute_cmd.c
+       - replaced all instances of (int)redirectee in do_redirection_internal
+         with a variable redir_fd, which is set to redirectee.dest
+
+print_cmd.c
+       - replaced all instances of (int)redirectee in print_redirection
+         with a variable redir_fd, which is set to redirectee.dest
+
+maxpath.h
+       - #include <sys/param.h> on OSF/1 systems
+
+subst.c
+       - added extern declaration for list_append
+       - changed sv_allow_null_glob_expansion to compare the return value
+         from find_variable to NULL to set the value of
+         allow_null_glob_expansion
+
+parse.y
+       - fix the assignment_acceptable macro so we cannot return
+         ASSIGNMENT_WORD while in the middle of a case statement pattern
+         list (in_case_pattern_list != 0)
+
+general.c
+       - Linux has gethostname() and does not need the emulation
+
+jobs.c
+       - Linux has a declaration for sys_siglist that conflicts with the
+         extern declaration; use the one from the standard include file
+       - the sigprocmask emulation did not handle NULL arguments in
+         oldset and newset; check them before using
+
+                                  4/23
+                                  ----
+lib/readline/complete.c
+       - use single_quote() to quote a completion replacement with
+         embedded occurrences of characters from rl_completer_quote_characters
+
+                                  4/26
+                                  ----
+print_cmd.c
+       - redid cprintf() for systems without varargs to be what bfox has
+         (using char * where bfox has void *)
+
+parse.y
+       - make read_secondary_line take an argument telling it whether or
+         not to have read_a_line remove quoted newlines
+
+make_cmd.c
+       - pass an argument to read_secondary_line saying whether or not to
+         remove quoted newlines, set to 1 if the delimiter of a here
+         document is unquoted
+
+                                  4/28
+                                  ----
+builtins/ulimit.def
+       - added -u option to set and get the max number of processes
+         available to a user; available on systems which define
+         RLIMIT_NPROC
+       - added better handling of getrlimit failures to ulimit_builtin
+
+cpp-Makefile
+       - made $(HOSTTYPE_DECL) appear on the cc command line before the
+         $(CPPFLAGS) when making variables.o
+
+                                  4/29
+                                  ----
+lib/readline/complete.c
+       - added an extern declaration for getpwent() for isc386 machines
+         where __STDC__ is not defined and _POSIX_SOURCE is
+
+                                  4/30
+                                  ----
+general.c
+       - new function legal_identifier, which returns 1 if a string
+         passed is a legal shell identifier and 0 otherwise.  Used
+         to decide what is and is not a legal variable name for the
+         expansion functions
+
+subst.c
+       - make expand_word_internal check that a ${ } expression
+         that starts with a digit is composed of all digits before
+         deciding that a variable starting with a digit is special
+         (setting var_is_special to 1)
+       - new function valid_brace_expansion_word (name, var_is_special)
+         returns 1 if name is a legal lhs of a brace expansion
+         expression
+       - make expand_word_internal check an identifier for validity
+         before passing it off to parameter_brace_expand_word by calling
+         valid_brace_expansion_word ()
+       - new function valid_length_expression (name) returns 1 if NAME is
+         something that can be passed to parameter_brace_expand_length();
+         called from expand_word_internal before calling
+         parameter_brace_expand_length()
+
+
+       These fix the following:
+               ${#<digit><alpha>} was treated as x=$<digit><alpha>, ${#x}
+               ${<digit><alpha>} was treated as ${<digit>}<alpha>
+               ${<illegal-id>} was not flagged as an error
+               ${#<illegal-id>} was not flagged as an error
+
+                                   5/2
+                                   ---
+input.c
+       - make check_bash_input change the value of default_buffered_fd
+         if it moves the input fd to a new fd as the result of a 
+         redirection
+
+execute_cmd.c
+       - don't make do_piping try the dup2 and close if pipe_out ==
+         REDIRECT_BOTH (-2) -- it's useless work
+       - add error checking to do_piping to see if the dup2 calls fail
+         and why
+
+error.c
+       - new function internal_error for shell internal error messages
+
+jobs.c
+       - changed some fprintf(stderr, ...) calls to internal_error()
+         calls
+
+                                   5/3
+                                   ---
+execute_cmd.c
+       - do not change the buffered stream associated with a file descriptor
+         when processing an r_inputa_direction redirection in
+         do_redirection_internal
+
+jobs.c, nojobs.c
+       - don't sync the buffered stream associated with default_buffered_input
+         in make_child if the shell is reading input from fd 0 and running an
+         asynchronous command
+
+                                   5/4
+                                   ---
+
+execute_cmd.c
+       - if the shell is not interactive, clean up the dead jobs each time
+         we call execute_command ()
+
+jobs.c
+       - new function, mark_dead_jobs_as_notified
+       - if the shell is not interactive, mark all dead jobs as notified in
+         notify_and_cleanup so that cleanup_dead_jobs frees up the slot in
+         the jobs array
+
+nojobs.c
+       - make cleanup_dead_jobs call reap_zombie_children on Posix systems,
+         so the shell doesn't keep growing in size as more jobs accumulate
+         before a call to wait_for()
+
+                                   5/6
+                                   ---
+jobs.c
+       - take the code that resets the signal handler out of flush_child;
+         it should be done in wait_for
+       - new function reap_dead_jobs to be run by non-interactive shells
+         that marks all dead jobs as notified and cleans up the job list
+       - removed the code from notify_and_cleanup that marks dead jobs as
+         notified if the shell is not interactive
+
+execute_cmd.c
+       - took the code that cleaned up dead jobs out of execute_command
+         There is a problem when this is run as the result of a trap on
+         SIGINT and the trap command is called directly from flush_child --
+         a job slot can disappear out from underneath flush_child and
+         wait_for and cause the shell to abort
+       - added a new define REAP that causes a non-interactive shell to
+         clean out the job table by calling reap_dead_jobs or
+         cleanup_dead_jobs
+       - added calls to reap to execute_for_command and
+         execute_until_or_while
+
+nojobs.c
+       - changed wait_sigint_handler to not do anything when it is called,
+         not even run a signal handler
+       - changed wait_for to call the old sigint handler if a foreground
+         process exits due to a SIGINT
+
+         [these make nojobs.c behave like jobs.c when waiting for a job in
+         a non-interactive shell]
+
+config.h.mini
+       - new `minimal' configuration file
+
+                                   5/7
+                                   ---
+subst.c
+       - make sure that command_substitute closes the pipe file descriptors
+         if there is a goto error_exit
+
+                                  5/10
+                                  ----
+nojobs.c
+       - add a SIGWINCH handler to set $LINES and $COLUMNS if readline is
+         not being compiled into the shell and TIOCGWINSZ and SIGWINCH
+         are defined
+
+[code put out for FTP on slc2.ins.cwru.edu]
+
+                                  5/11
+                                  ----
+
+braces.c
+       - commas within backquotes inside matching braces are now treated as
+         quoted (e.g., echo {`echo foo:bar | sed s/:/,/`})
+
+lib/readline/search.c
+       - added extern declarations for xmalloc, xrealloc
+
+                                  5/12
+                                  ----
+lib/malloc/malloc.c
+       - added a #define wrapper around the sbrk() declaration so that it's
+         not declared as char * if hpux_8 or VOID_STAR_SBRK are defined
+
+subst.c
+       - changed sense of #ifdef so that unless KSH_INCOMPATIBLE is defined
+         ${#@} and ${#*} are equivalent to $#
+
+                                  5/13
+                                  ----
+execute_cmd.c
+       - don't create the export env unless we are running a command with
+         shell_execve (in execute_disk_command)
+
+jobs.c, nojobs.c
+       - don't create the export env in make_child (why were we doing this
+         in the first place?)
+
+hash.c
+       - removed declaration of initialize_hashed_filenames, which is unused
+
+subst.c
+       - make list_rest_of_args, list_string, and the brace expansion code
+         in expand_words_internal use the REVERSE_LIST macro rather than a
+         call to reverse_list()
+
+make_cmd.c, copy_cmd.c
+       - change uses of reverse_list to REVERSE_LIST
+
+                                  5/17
+                                  ----
+execute_cmd.c
+       - make execute_disk_command look in the temp environment for an
+         assignment to PATH, and disable hash lookup for the command if
+         such an assignment is present
+
+                                  5/18
+                                  ----
+parse.y
+       - changed read_a_line so that a backslash can quote a \<newline>
+         pair and prevent its removal when remove_quoted_newline is 1
+
+                                  5/19
+                                  ----
+siglist.h
+       - new file, to encapsulate the declarations of sys_siglist and
+         provide a `strsignal' macro
+
+jobs.h, siglist.c, longest_sig.c
+       - include siglist.h
+
+jobs.c, nojobs.c
+       - removed declaration of sys_siglist
+
+                                  5/20
+                                  ----
+execute_cmd.c
+       - don't set up the loop_redirections unwind-protect unless there
+         are actually some redirections
+       - combined the AND_AND and OR_OR cases of execute_command_internal
+         to remove some duplicated code
+       - folded two tests together in the simple command case of
+         execute_command_internal to remove a layer of indentation and
+         braces
+       - don't set up the unwind_protect in execute_simple_command unless
+         the command actually expands to something
+       - broke the code that executes functions and builtins out into new
+         functions (execute_function and execute_builtin) and changed
+         execute_builtin_or_function and execute_subshell_builtin_or_function
+         to call them
+       - replaced the async_redirections unwind-protect in
+         execute_disk_command, since there's no reason to do it if we're
+         already in a subshell and simply going to exit if the redirections
+         fail
+       - set up the unwind-protect on saved_undo_list in 
+         execute_builtin_or_function only if there are redirections saved
+         in saved_undo_list
+       - only call do_redirections in execute_disk_command if there are
+         redirections to perform -- no need for the side effects since
+         we're in a subshell
+
+                                  5/21
+                                  ----
+parse.y
+       - make read_a_line, shell_getc, decode_prompt_string, prompt_again,
+         bash_add_history, reset_readline_prompt, read_token, discard_until,
+         shell_ungetc static functions
+       - eliminated the after_preprocess label in shell_getc
+       - broke the prompt command execution code out into a separate
+         function: execute_prompt_command
+
+subst.c
+       - combined some common code in extract_string_double_quoted for the
+         $( ) and ${ } cases
+       - changed the allocation scheme in string_list_internal to hopefully
+         reduce the number of allocations
+       - added a new define SET_INT_VAR and changed all of the sv_*
+         functions that set a variable depending on whether or not a
+         variable exists to use it
+
+variables.c
+       - declare argument to getenv as `const char *' on Linux
+
+machines.h
+       - Linux has the fixed include files if gcc is being used to compile
+         the shell
+
+                                  5/23
+                                  ----
+subst.c
+       - only call rl_reset_terminal in sv_term if no_line_editing is 0
+         (which means we're actually using readline)
+
+                                  5/25
+                                  ----
+execute_cmd.c
+       - changed execute_for_command to explicitly call the functions that
+         were to be called by the unwind-protect code (e.g., dispose_words),
+         and changed the run_unwind_frame call to a call to
+         dispose_unwind_frame.  This is to avoid using the kernel to block
+         interrupts as much as possible
+       - did the same for execute_case_command and execute_builtin
+
+jobs.c
+       - only run traps on SIGCHLD if job_control != 0
+
+                                   6/3
+                                   ---
+unwind_prot.c
+       - have without_interrupts call QUIT only if interrupt_immediately
+         is set to 1
+
+                                   6/7
+                                   ---
+machines.h, jobs.h, lib/readline/chardefs.h, maxpath.h
+       - changes for Solaris 2 with gcc from Greg Onufer
+
+lib/malloc/malloc.c
+       - define NO_SBRK_DECL if hpux_8 or Solaris
+       - declare sbrk as extern char * unless NO_SBRK_DECL is defined.
+         VOID_STAR_SBRK has been removed
+
+lib/readline/readline.c
+       - changed a call to alloca to a call to xmalloc to avoid problems
+         on the DEC alpha (can't pass memory allocated with alloca to
+         another function)
+       - moved key binding and startup file code to bind.c
+
+lib/readline/rldefs.h
+       - created common definitions for emacs_mode and vi_mode
+
+lib/readline/bind.c
+       - new file containing the key binding and startup file code.
+
+                                   6/8
+                                   ---
+lib/readline/readline.c
+       - changed rl_message to use varargs, if HAVE_VARARGS_H is defined
+
+lib/readline/rldefs.h
+       - include <varargs.h> if HAVE_VARARGS_H is defined
+
+lib/readline/{readline.c,bind.c,rltty.c,vi_mode.c,search.c}
+       - cleaned up the namespace by prefixing all pseudo-global readline
+         variables (variables private to the library but used in multiple
+         files) with _rl_
+
+                                  6/10
+                                  ----
+[changes from bfox]
+
+bashansi.h
+       - new file, including both string.h and ansi_stdlib.h
+
+dispose_cmd.h, make_cmd.h, subst.h
+       - new files containing extern function declarations
+
+endian.c
+       - for machines with sizeof(long)==8, shift by 31, then 1 to fake
+         out gcc 2.4, which complains when you shift by 32
+
+general.h
+       - added an include of string.h or strings.h
+       - changed the declarations of the savestring() and member() macros
+
+shell.c
+       - changed the structure of the long_args struct to be more portable
+
+subst.c
+       - made dequote_string and dequote_list static
+
+[end of changes from bfox]
+
+general.h
+       - added extern declarations for all of the non-int functions
+         defined in general.c
+
+<most files>
+       - removed extern declarations that appear in one of the bash header
+         files
+
+                                  6/15
+                                  ----
+lib/readline/readline.c
+       - incorporated a patch to rl_transpose_chars from Tom Tromey
+         which allows C-t to be undone
+       - fixed rl_rubout so the fast screen fixup when deleting the
+         last character on the line handles characters that are more
+         than one screen position wide by erasing the right number of
+         physical characters
+
+                                  6/16
+                                  ----
+siglist.h
+       - don't declare sys_siglist on 4.4 BSD
+
+builtins/mkbuiltins.c, lib/readline/history.c
+       - include <unistd.h> if HAVE_UNISTD_H is defined
+
+                                  6/19
+                                  ----
+machines.h
+       - new description for the Intel Paragon running OSF/1
+
+support/getcppsyms.c
+       - new variables for the paragon (__i860__, __PARAGON__, etc.)
+
+documentation/bash.1
+       - make it clear the the -noprofile switch disables the sourcing
+         of ~/.bash_login and ~/.profile as well as /etc/profile and
+         ~/.bash_profile
+
+                                  6/23
+                                  ----
+shell.c
+       - instead of calling maybe_execute_file on "/etc/profile",
+         use a #define for SYS_PROFILE, which is initially defined
+         to be "/etc/profile" by default
+
+lib/readline/isearch.c
+       - new file, with the isearch code
+
+lib/readline/display.c
+       - new file, with the incremental redisplay code
+
+lib/readline/readline.c
+       - removed the isearch, display code
+
+                                  6/24
+                                  ----
+lib/readline/readline.c
+       - removed the signal-handling code
+
+lib/readline/signals.c
+       - new file with the signal-handling  code
+
+                                   7/1
+                                  ----
+test.c
+       - changed the `advance' macro to get around some picky compilers
+
+machines.h
+       - machine description for hp9000 running 4.4 BSD
+
+support/getcppsyms.c
+       - recognize __BSD_4_4__ for 4.4 BSD machines
+
+builtins/souirce.def
+       - cast the st_size stat struct member to int because it's
+         64 bits on 4.4 BSD
+
+lib/readline/signals.c
+       - include <sys/ioctl.h> if compiling on a 4.4 BSD machine
+
+                                   7/2
+                                   ---
+builtins/read.def
+       - if $IFS is unset it defaults to "" when splitting the line
+         read into words (so no splitting is performed)
+
+                                   7/5
+                                   ---
+shell.c
+       - remove SIGKILL from terminating_signals[] -- it can't be caught
+         or ignored
+       - make terminating_signals[] static
+       - make terminating_signals[] an array of structs that hold the signal
+         number and the original handler
+       - change initialize_terminating_signals to use the new struct termsig
+         and to set the original handlers for all the terminating_signals
+       - new function reset_terminating_signals to restore original handlers
+         for all terminating signals in terminating_signals[]
+
+trap.c
+       - new function signal_is_special, returns 1 if a signal is one of
+         the signals the shell treats specially
+       - call reset_terminating_signals from restore_original_signals
+
+getcwd.c
+       - changed call to `stat' to call `lstat' to keep symlinks that
+         point to non-existant files from causing getcwd to fail
+       - if S_ISLNK is not defined after inclusing `posixstat.h', use
+         a cpp #define lstat stat
+
+machines.h
+       - new entry for Symmetric 375 running 4.2 BSD
+
+support/getcppsyms.c
+       - recognize and pass along `scs' for the Symmetric 375
+
+lib/readline/bind.c
+       - new function: rl_set_keymap_from_edit_mode, which sets the
+         keymap appropriately depending on the editing mode as if we
+         were about to edit a command line
+
+                                   7/6
+                                   ---
+lib/termcap
+       - new code from the GNU termcap library distribution 1.02
+
+endian.c
+       - include bashansi.h
+
+shell.c
+       - fall back to sourcing $ENV if $BASH_ENV is not found
+
+variables.c
+       - make add_or_supercede search `array' only if it is non-null
+
+                                   7/7
+                                   ---
+subst.c
+       - made do_assignment_internal an int function that returns 1 if
+         the assignment was made correctly and 0 if it was not
+       - do_assignment and do_assignment_no_expand now return the value
+         from do_assignment_internal
+
+variables.c
+       - made assign_in_env return 1 if everything appeared to go
+         successfully (which it always does)
+
+cpp-Makefile
+       - add variables.c as an explicit dependency for variables.o; there
+         appears to be a bug in Gnu make
+
+braces.c
+       - removed static version of copy_array since there's already one
+         in general.c, declared extern in general.h
+
+lib/malloclib
+       - updated to sources from Gnu libc 1.06
+
+                                   7/9
+                                   ---
+shell.h
+       - new struct: user_info, containing uid, gid and passwd file info
+         about the current user
+
+shell.c
+       - new variable current_user of type struct user_info
+       - eliminated passwd_shell, passwd_dir, and current_user_name
+
+subst.c
+       - rewrote sv_uids to use the info in current_user.uid and .euid
+         and to use itos rather than sprintf
+
+variables.c, mailcheck.c, test.c, execute_cmd.c, parse.y
+       - changed to use current_user.user_name rather than current_user_name
+         and to use current_user.shell and current_user.home_dir instead of
+         passwd_shell and passwd_dir, respectively
+
+flags.c, flags.h
+       - new flag, `-p' for `privileged', a la ksh.  This is set automatically
+         if uid != euid || gid != egid
+       - if +p, set the real and effective uids and gids to the real uid and
+         gid
+
+flags.c
+       - include shell.h for the current_user struct and don't explicitly
+         include header files included by shell.h
+
+builtins/set.def
+       - code to handle -p and -o privileged
+
+documentation/bash.1
+       - added documentation for set -p/set -o privileged
+       - added documentation for bind -m keymap
+       - added documentation to readline section for non-inc search bindings
+
+builtins/bind.def
+       - documented the -m keymap option
+
+                                  7/10
+                                  ----
+machines.h
+       - new description for NeXTstep running on intel 486
+
+lib/tilde/tilde.c
+       - fixed up definition of savestring macro
+
+bashline.c
+       - changed attempt_shell_completion so that when completing command
+         words and no matches are found, it tells readline to perform
+         filename completion but sets the completion ignore function
+         to one that will ignore all filenames matched, leaving only
+         directories in the list of matches
+       - generalized the ignore processing, breaking the body of the
+         existing ignore function into a generic function that takes as an
+         argument a pointer to a function used to test each filename in the
+         match list for `acceptability'
+       - added a new ignore function to support the `ignore filenames'
+         behavior described above
+
+                                  7/12
+                                  ----
+
+machines.h
+       - add #undef HAVE_GETCWD to Motorola M88100 description
+[put code out for FTP on slc2.ins.cwru.edu]
+
+                                  7/13
+                                  ----
+builtins/type.def
+       - broke the code that does the work of the type builtin out into a
+         separate function and added a couple of other display options,
+         for eventual use by command -v and -V
+
+builtins/bashgetopt.c
+       - added a new function `report_bad_option'
+
+builtins/jobs.def, bultins/histctl.def
+       - changed to use report_bad_option
+
+builtins/command.def
+       - added the Posix.2 -v and -V options
+
+                                  7/14
+                                  ----
+execute_cmd.c
+       - make sure that execute_command_internal sets redirection_undo_list
+         and exec_redirection_undo_list to NULL after making local copies
+         so things don't get undone twice.  This can happen as the result
+         of an `fc' redoing a command with redirections:
+                       wc subst.c > xxx &
+                       r
+         [bug report from Ian Watson]
+
+builtins/setattr.def
+       - converted to use internal_getopt, so export and readonly both use
+         it
+
+builtins/bashgetopt.c
+       - changed the default error messages a little bit
+
+shell.h
+       - new exit values:  EX_NOEXEC, for when a command name is not
+         executable (126), and EX_NOTFOUND, for when a command is not
+         found (127)
+
+execute_cmd.c
+       - change to use EX_NOEXEC and EX_NOTFOUND
+
+parse.y
+       - broke function definitions off into their own production,
+         function_def
+
+                                  7/15
+                                  ----
+builtins/kill.def
+       - added code so that signals are listed by kill -l in the manner
+         specified by Posix.2 if the POSIXLY_CORRECT variable exists in
+         the environment
+       - Posix.2 UPE says kill can take % job control arguments even if
+         job control is disabled, so let interactive shells use them
+
+parse.y
+       - decode_prompt_string now performs the Posix.2 ! expansion for
+         $PS1 and $PS2, if POSIXLY_CORRECT is turned on
+
+builtins/exec.def
+       - changed exit status to be in line with Posix.2 specification
+         (127 for not found, 126 for not executable)
+
+builtins/wait.def
+       - unknown jobs should cause wait to return 127
+
+shell.c
+       - change the behavior of sh -c so that if POSIXLY_CORRECT is in the
+         environment, the first argument after -c command is assigned to
+         $0, and the rest of the arguments, if any, are bound to $1 ... $n
+         Posix.2 4.56.3 specifies this behavior
+       - move the code that does -c command out of the !local_skip_execution
+         block.  I can't see why it was there in the first place
+       - made some of the private variables static to clean up the name
+         space
+       - moved the code that runs the startup files into a separate
+         function: run_startup_files.  This is called with an argument
+         telling it whether or not to use the Posix.2 startup file sequence
+         ($ENV).  This argument is 1 if POSIXLY_CORRECT is found in the
+         environment at startup
+
+builtins/fg_bg.def
+       - bg needs to set last_asynchronous_pid when restarting a job in
+         the background, as per Posix.2, 5.4.2
+
+jobs.c
+       - make sure the status of exited jobs is printed as Done(n) where
+         `n' is the exit status, if POSIXLY_CORRECT is specified
+
+                                  7/16
+                                  ----
+general.c
+       - fixed a problem with canonicalize_pathname which made it get
+         confused with xxx/./yyy if yyy was `.' or `..'
+
+parse.y
+       - broke the code in read_token that checked for reserved words
+         into a macro: CHECK_FOR_RESERVED_WORD
+       - if posixly_correct is 1, read_token does not allow reserved words
+         to be aliased (checks for reserved words before doing alias
+         expansion).  See Posix.2 3.3.1
+       - changed the function_def production to make redirections
+         specified with a function definition bind to the function
+         rather than to the definition.  This introduced 66 (!)
+         bison shift/reduce conflicts.  From Posix.2 3.9.5
+       - if `posixly_correct' is set, <>word will open word for read/write
+         on fd 0, rather than fd 0 and fd 1 as normal
+
+builtins/source.def
+       - removed the ALLOW_RIGID_POSIX_COMPLIANCE define; the check for
+         POSIXLY_CORRECT will always be performed
+
+shell.c
+       - new long option: -posix, sets posixly_correct to 1
+       - posixly_correct set to 1 in main if POSIXLY_CORRECT found in
+         shell environment
+
+subst.c
+       - new function sv_strict_posix, sets value of posixly_correct
+         depending on $POSIXLY_CORRECT
+       - if posixly_correct is set, don't do tilde expansion on 
+         =~ in words that are not shell assignment statements
+
+execute_cmd.c, jobs.c
+       - removed calls to getenv("POSIXLY_CORRECT") with checks of
+         posixly_correct
+       - if posixly_correct is set, don't translate >&x into >x 2>&1
+
+expr.c
+       - implemented the OP= Posix.2 arithmetic assignment operators
+         (see Posix.2 table 2.15, section 2.9.2.1, and section 3.6.4)
+
+documentation/bash.1
+       - added documentation of new arithmetic evaluation assignment
+         operators
+       - documented the new -posix long option
+
+                                  7/17
+                                  ----
+builtins/setattr.def
+       - made set_or_show_attributes correctly quote the values of shell
+         variables it prints so the output of `export' or `readonly' can
+         be used as input to the shell
+
+builtins/fc.def
+       - made fc write its output as Posix.2 5.12.6.1 specifies: when not
+         numbering, the command should still be output with a leading tab
+
+variables.c
+       - if `posixly_correct' is true, bash uses ~/.sh_history as the
+         default value of $HISTFILE
+
+shell.c, subst.c
+       - if posixly_correct is true, turn on interactive comments, since
+         that's what Posix.2 says to do
+
+                                  7/20
+                                  ----
+lib/malloclib/{malloc.c,free.c,malloc.h}
+       - bug fix from Mike Haertel
+
+builtins/mkbuiltins.c
+       - added code so that the Posix.2 `special' builtins have
+         SPECIAL_BUILTIN added to the flags in their entry in the
+         builtins array defined in builtins.c
+
+shell.c
+       - declare `restricted' as `extern int', since it's already
+         declared in flags.c
+
+lib/readline/bind.c
+       - only try to set the keymap to vi_insertion_keymap in
+         rl_set_keymap_from_edit_mode if VI_MODE is #defined
+
+lib/malloc/malloc.c
+       - define NO_SBRK_DECL for hpux_9
+
+machines.h
+       - hpux_9 needs to link with libPW.a to pick up alloca(), which
+         has reportedly been fixed
+
+lib/tilde/Makefile
+       - add a definition for RM to the makefile
+
+                                  7/21
+                                  ----
+documentation/Makefile
+       - added info, dvi targets
+       - changed `squeaky-clean' to `distclean'
+       - use $(MAKEINFO) in recipes rather than `makeinfo'
+
+bashline.c
+       - fixed memory leak in cleanup_expansion_error
+       - fixed up some extern declarations of pre_process_line
+
+cpp-Makefile
+       - define HAVE_FIXED_INCLUDES by default if we're using gcc
+
+                                  7/27
+                                  ----
+machines.h
+       - add -ldgc to the DG/UX description if we're not building an
+         `M88KBCS_TARGET'
+
+                                  7/28
+                                  ----
+shell.c
+       - always initialize top_level_mask from what the shell inherits,
+         even for login shells
+
+lib/tilde/tilde.c
+       - declare the getpw functions only for USG systems
+
+                                  7/30
+                                  ----
+lib/readline/readline.c
+       - new function: _rl_kill_kbd_macro () to cancel any keyboard
+         macros being defined on a SIGINT
+
+lib/readline/signals.c
+       - call _rl_kill_kbd_macro on a SIGINT
+
+bashline.c
+       - don't bind anything with a META via rl_add_defun; change those to
+         add the definition unbound, then explicitly bind it into
+         emacs_meta_keymap
+
+                                   8/3
+                                   ---
+bashline.c
+       - save and restore the value of rl_startup_hook when using it in
+         special editing functions
+
+                                   8/4
+                                   ---
+general.c
+       - new global variable: global_error_list, returned instead of -1
+         from functions returning lists
+       - changed delete_element to return &global_error_list instead of
+         (char **)-1
+
+braces.c, general.c, expr.c
+       - removed the conditional definition of NULL; it should be defined
+         in general.h
+
+lib/glob/glob.c
+       - new global variable: glob_error_return, returned instead of
+         (char **)-1 to signal a glob error
+       - changed functions to return &glob_error_return instead of
+         (char **)-1
+
+subst.c
+       - fix the GLOB_FAILED macro to test against &glob_error_return
+         rather than (char **)-1
+
+builtins/ulimit.def
+       - cleaned up the casts like (long) -1; changed to -1L, which is
+         equivalent and more correct
+
+lib/readline/complete.c
+       - use the address of a new local variable `dead_slot' to mark
+         dead slots in the list of completion matches rather than
+         (char *)-1, which doesn't work everywhere
+
+lib/readline/history.c
+       - have get_history_word_specifier return the address of a static
+         variable `error_pointer' in case of error, rather than (char *)-1
+
+lib/readline/signals.c
+       - if SHELL is defined, don't mess with SIGTSTP, SIGTTIN, or SIGTTOU
+
+lib/readline/vi_mode.c
+       - make rl_vi_change_case skip over characters that are neither
+         upper nor lower case
+
+                                   8/5
+                                   ---
+lib/readline/funmap.c
+       - made qsort_string_compare compare the first characters of the
+         two strings before calling strcmp()
+
+builtins/bind.def
+       - rewrote to use internal_getopt
+       - map specifications made with -m now affect all other options
+         and binding specifications
+       - no processing is done until all the options have been processed
+       - the -q option is now limited to a single argument, as the
+         documentation has always stated
+
+lib/readline/vi_mode.c
+       - fixed the `r' command so that the replacement is saved, and it
+         is redoable
+
+command.h
+       - add `line' members to the simple_command and command structs to
+         keep track of the line number the command appears on for $LINENO
+
+make_cmd.c
+       - save line number when making a `bare' simple command to the value
+         of line_number
+       - save the first line of a function definition in make_function_def
+
+copy_cmd.c
+       - make sure that the line number information is copied with a command
+
+execute_cmd.c
+       - use the line number attached to the start of a function definition
+         and the line number of commands to update line_number while a
+         function is executing
+
+                                   8/6
+                                   ---
+config.h, config.h.mini, cpp-Makefile
+       - made ONESHOT a configuration option rather than a cpp define in
+         cpp-Makefile
+
+builtins/fc.def, builtins/getopts.def
+       - removed the code that defines NULL if undefined -- these files
+         include general.h, which already does that
+
+lib/posixheaders/stdc.h
+       - new file containing macros so that functions can be defined with
+         prototypes using the __P macro and compile on both ANSI C and
+         `traditional' C compilers
+
+lib/malloc/malloc.c
+       - changed the ASSERT macro to use a new __STRING define when calling
+         botch(), so that ANSI C systems see the correct error string
+         rather than `p' (unfortunately, the MAGICx constants are expanded
+         in the string passed to botch())
+
+                                   8/7
+                                   ---
+bashline.c, execute_cmd.c, variables.c, parse.y, make_cmd.c, jobs.c
+       - removed extern declarations of functions already declared as extern
+         in bash header files
+
+execute_cmd.c
+       - include lib/tilde/tilde.h
+       - include builtins/common.h
+       - include builtins/builtext.h for the extern declarations for the
+         shell builtins
+       - moved vfree() to general.c
+
+builtins/common.c
+       - made dotted_filename static
+       - made builtin_address_internal static
+
+builtins/common.h
+       - new file with extern declarations for all functions defined in
+         common.c
+
+variables.h
+       - added extern declaration of qsort_string_compare, assign_in_env
+
+mailcheck.c
+       - removed full_pathname (), since it is a function of general use
+
+general.c
+       - moved full_pathname () here from mailcheck.c
+       - moved vfree() here from execute_cmd.c
+
+general.h
+       - added extern declaration for full_pathname
+
+subst.h
+       - added extern declaration for dequote_string
+
+jobs.h
+       - added external declarations for wait_for_background_pids and
+         wait_for_single_pid
+
+parse.y
+       - new function: find_reserved_word
+
+builtins/{alias,builtin,cd,exec,exit,hash,read,setattr,shift,trap,wait}.def
+       - removed extern declarations, replaced with inclusion of common.h
+
+builtins/type.def
+       - include common.h, remove extraneous extern declarations
+       - call find_reserved_word instead of searching word_token_alist
+
+builtins/bashgetopt.h
+       - new file, extern declarations for stuff defined in bashgetopt.c
+
+builtins/{bind,command,fc,histctl,jobs,setattr}.def
+       - include bashgetopt, removed internal getopt extern declarations
+
+cpp-Makefile, builtins/Makefile
+       - add dependencies on bashgetopt.h to builtins
+       - add dependencies on common.h to builtins
+
+nojobs.c
+       - wait_for_background_pids should be void
+
+                                   8/9
+                                   ---
+builtins/common.c
+       - new function, double_quote(), to double-quote strings
+
+documentation/bash.1
+       - added text specifying return value of `command -[vV]'
+       - added description of the -E option to echo
+       - added text specifying that `enable' accepts -a in place of -all
+
+                                  8/10
+                                  ----
+shell.c
+       - since non-Posix systems with job control use top_level_mask,
+         it needs to be initialized correctly by
+         initialize_terminating_signals
+
+mailcheck.c
+       - fixed mailpath-parsing code to correctly handle backslash-quoted
+         `?' and `%' in the $MAILPATH entries by adding a function
+         parse_mailpath_spec to return a pointer to the first unquoted
+         `?' or `%' and having remember_mail_dates and check_mail call it
+
+documentation/bash_builtins.1
+       - new man page for bash builtins, from jaws@pangaea.dme.nt.gov.au
+         (implemented by using number registers as flags and sourcing
+         bash.1)
+
+                                  8/16
+                                  ----
+bashline.c
+       - have maybe_make_readline_line use rl_delete_text rather than
+         rl_kill_text because the text need not be saved on the kill
+         ring
+
+                                  8/17
+                                  ----
+jobs.h
+       - don't include extern declarations for fork(), getpid(), or
+         getpgrp() if __SVR4_2__ is defined (Unixware, SVR4.2).
+         __SVR4_2__ used as in siglist.h
+
+test.c
+       - don't include extern declarations for getegid(), getgid(),
+         or geteuid() if __SVR4_2__ is defined (Unixware, SVR4.2)
+
+                                  8/18
+                                  ----
+execute_cmd.c
+       - don't check that the current directory in the path is `.' if
+         we've already found `.' in the path in find_user_command_internal
+       - new function make_full_pathname, to glue `path' and `name'
+         together in find_user_command_internal rather than using sprintf,
+         which is very slow
+
+                                  8/19
+                                  ----
+
+support/mksysdefs
+       - packaged all of the uname calls into one block at the top of the
+         script; uname sets up some script variables:
+
+               UNAME
+               UNAME_R
+               UNAME_M
+               RELEASE
+               LEVEL
+       - make sure machines running SVR4.2 have __SVR4_2__ defined
+
+machines.h
+       - for i386 machines running SVR4.2, make sure that __SVR4_2__ is
+         added to SYSDEP_CFLAGS
+
+test.c
+       - changed the test_exit define to use the do { ... } while(0) idiom
+       - made GID_T and UID_T be int for BSD/386, since that's what
+         getgroups() returns
+       - cast both sides of a test to UID_T or GID_T to make sure we're
+         on the same page when testing
+
+lib/readline/bind.c, lib/readline/readline.c
+       - fixes to deal with the Cray's pointers of different sizes --
+         pointers to functions are a different size than pointers to
+         structs
+
+                                  8/20
+                                  ----
+machines.h, test.c, jobs.h, siglist.h, support/mksysdefs
+       - changed __SVR4_2__ to USGr4_2
+
+support/getcppsyms.c
+       - added support for recognizing __SVR4_2__ and USGr4_2
+
+                                  8/23
+                                  ----
+
+variables.c
+       - added a static variable that keeps track of whether or not
+         function local variables have been created with the `local'
+         or `typeset' builtins and short-circuits the call to
+         kill_all_local_variables if none have been created
+
+lib/readline/vi_mode.c
+       - extern declaration for rl_vi_check and rl_digit_loop1
+       - declare `count' argument to rl_vi_delete
+       - made rl_vi_set_last a void function
+
+lib/readline/bind.c
+       - declare `count' argument to strnicmp
+
+lib/readline/readline.c
+       - made rl_add_undo, free_undo_list void functions
+
+lib/readline/readline.c, lib/readline/bind.c, lib/readline/search.c,
+lib/readline/vi_mode.c
+       - changed return; to return 0; and added explicit returns to many
+         `int' returning functions that didn't return a value
+
+                                  8/24
+                                  ----
+builtins/ulimit.def
+       - check for RLIMIT_RSS being defined before trying to use it
+
+machines.h
+       - fixes to cray machine description from Bill Jones
+
+builtins/common.c
+       - make all of the dollar_arg_stack stuff static
+
+lib/malloc/alloca.c
+       - new version, from emacs 19
+
+                                  8/26
+                                  ----
+lib/readline/complete.c
+       - use double quotes to quote replacement text with word breaks
+         rather than single quotes, which inhibit tilde expansion
+
+lib/readline/vi_keymap.c
+       - changed TAB to default to completion for the VI insert keymap
+
+bashline.c
+       - new function: posix_readline_initialize to make any changes
+         to the readline keymaps when switching into and out of Posix.2
+         mode
+       - call posix_readline_initialize from initialize_readline
+
+subst.c
+       - call posix_readline_initialize from sv_strict_posix
+
+                                  8/27
+                                  ----
+subst.c
+       - changed USE_GLOB_LIBRARY to USE_POSIX_GLOB_LIBRARY to make the
+         intent clear
+
+shell.c
+       - new function, issock(fd) returns 1 if FD is a socket according
+         to fstat(2) -- note that this only works if S_ISSOCK is defined
+         in posixstat.h
+       - run_startup_files calls issock to see whether or not to run
+         the .bashrc
+
+input.c
+       - include general.h for declarations of xmalloc, xrealloc
+
+lib/tilde/tilde.c, lib/tilde/tilde.h
+       - tilde_expansion_failure_hook is now a pointer to a CPFunction,
+         since that's how it's used
+
+lib/readline/history.c
+       - include <string.h> or <strings.h> as appropriate
+
+                                  8/29
+                                  ----
+machines.h
+       - avoid `M_MACHINE redefined' messages in the hpux description
+
+                                  8/30
+                                  ----
+jobs.h
+       - added #defines for sigfillset, sigdelset, and sigismember to fill
+         out the Posix.1 signal functions
+
+general.h
+       - add an extern declaration for getwd()
+
+general.c
+       - NeXT machines already have a vfree() with a declaration in stdlib.h,
+         so don't define our vfree() on those systems
+
+cpp-Makefile
+       - NeXT machines don't have a link to `gcc', so make sure that
+         HAVE_GCC is not defined on those machines, even if __GNUC__ is
+
+lib/readline/readline.h, lib/readline/complete.c
+       - rl_attempted_completion_function is now declared as a pointer to
+         a CPPFunction, since that's how it is used
+
+bashline.c, bracecomp.c
+       - fixed assignments to rl_attempted_completion_function, since it's
+         now a pointer to a CPPFunction
+
+lib/readline/keymaps.h
+       - fleshed out declarations of function types inside __FUNCTION_DEF
+         macro to match other files
+
+lib/readline/readline.h
+       - removed typedefs for function pointer types, since they are now
+         declared in keymaps.h
+
+                                  8/31
+                                  ----
+
+lib/readline/complete.c
+       - if there is more than one match, don't quote the replacement
+         text unless the matching prefix has a word break character.  The
+         old code quoted the replacement if any of the possible replacements
+         had a word break character
+
+builtins/alias.def
+       - fixed memory leak -- free the array returned by all_aliases when
+         alias is called without arguments
+
+builtins/read.def
+       - fixed memory leak -- need to free return value from
+         string_list_dollar_star
+
+builtins/fc.def
+       - fixed memory leak -- need to free return value from fc_readline
+
+builtins/hash.def
+       - fixed memory leak -- need to free return value from
+         find_user_command
+
+builtins/alias.def
+       - fixed memory leak -- remove_alias needs to free the key in the
+         hash table entry it deletes
+
+execute_cmd.c
+       - fixed memory leak in find_user_command_in_path: if we're not
+         returning full_path, we need to free it
+
+lib/readline/bind.def
+       - fixed memory leak -- need to free the returned arrays from
+         recursive calls to invoking_keyseqs_in_map
+
+                                   9/1
+                                   ---
+builtins/bind.def
+       - return failure immediately if no_line_editing is set
+
+builtins/shift.def
+       - fixed memory leak -- make sure all of the word list element from
+         rest_of_args is freed when shifting it into dollar_vars[9]
+
+builtins/hash.def
+       - fixed memory leak -- only need to save the key for a particular
+         hash item once in remember_filename
+
+expr.c
+       - fixed memory leak -- free `tokstr' after performing the assignment
+         statement and before assigning to it with savestring
+
+execute_cmd.c
+       - fixed memory leak -- need to free the copy of the command line
+         passed to make_child in execute_disk_command if the command is
+         not found
+
+lib/readline/display.c
+       - fixed call to tgoto in delete_chars -- caused the delete to fail
+         when using term_DC on some systems
+
+[code made available via ftp -- first redistributable version]
diff --git a/CWRU/old-conf/Makefile b/CWRU/old-conf/Makefile
new file mode 100644 (file)
index 0000000..5331319
--- /dev/null
@@ -0,0 +1,116 @@
+# Hey Emacs, this Makefile is in -*- makefile -*- mode!
+#
+# Makefile for Bash.
+# If your cpp doesn't like -P, just get rid of it (the -P, not cpp).
+# If you wish to use Gcc, then type `make CC=gcc CPPNAME='$(CC) -E''.
+# If you wish to use GNU's Make, then change `MAKE'.
+# If you don't like the destination, then change `bindir'.
+# The file that you most likely want to look at is cpp-Makefile.
+#
+# If you haven't read README, now might be a good time.
+
+# Include some boilerplate Gnu makefile definitions.
+prefix = /usr/local
+exec_prefix = $(prefix)
+bindir = $(exec_prefix)/bin
+srcdir = .
+VPATH = $(srcdir)
+
+# MAKE    = make
+RM      = rm -f
+SHELL   = /bin/sh
+GAWK     = awk
+# GAWK     = gawk
+
+# Force CPPNAME to be the name of your C preprocesor if Bash can't
+# find it.  For instance, `CPPNAME=/usr/libexec/cpp' on 4.4 BSD.
+# If all else fails, set CPPNAME=$(CC) -E
+CPPNAME =
+CPP     = `/bin/sh $(CPPMAGIC) $(GETCPPSYMS) "$(CPPNAME)"` -P
+
+CPP_MAKEFILE = $(srcdir)/cpp-Makefile
+ANSI_MAKEFILE = ansi-Makefile
+
+# CPPFLAGS = $(SYSTEM) $(CPP_DEFINES)
+CPPFLAGS = $(CPP_DEFINES) -I. -I$(srcdir)
+CPP_ARGS = -DCPP_CC="$(CC)"
+
+SUPPORTDIR     = ./support/
+SUPPORTSRC     = $(srcdir)/support/
+
+MKSYSDEFS      = $(SUPPORTSRC)mksysdefs
+CPPMAGIC       = $(SUPPORTSRC)cppmagic
+CAT_S          = $(SUPPORTSRC)cat-s
+GETCPPSYMS     = $(SUPPORTDIR)getcppsyms
+GETCPPSYMS_SRC = $(SUPPORTSRC)getcppsyms.c
+
+# Here is a command which compresses runs of multiple blank lines to a
+# single blank line.  "cat -s" works for BSD systems, but not for USG
+# systems.  You can use an awk script if you like.  If you have too
+# much trouble with this, just forget it.  It is for making
+# bash-Makefile pretty and readable; something that isn't strictly
+# necessary.
+# SQUASH_BLANKS = cat -s
+#
+SQUASH_BLANKS = $(GAWK) -f $(CAT_S)
+
+all:   .notified bash-Makefile
+       $(MAKE) -f bash-Makefile $(MFLAGS) $(MAKEARGS) srcdir=$(srcdir) \
+               prefix=$(prefix)
+
+bash-Makefile: $(CPP_MAKEFILE) Makefile machines.h sysdefs.h config.h
+       @-if [ -f ansi-Makefile ]; then \
+           echo "cp ansi-Makefile tmp-Makefile.c"; \
+           cp ansi-Makefile tmp-Makefile.c; else \
+           echo "cp $(CPP_MAKEFILE) tmp-Makefile.c"; \
+           cp $(CPP_MAKEFILE) tmp-Makefile.c; \
+         fi
+       $(RM) $(GETCPPSYMS)
+       $(SHELL) $(SUPPORTSRC)mkdirs support
+       $(CC) -o $(GETCPPSYMS) $(GETCPPSYMS_SRC)
+       rm -f bash-Makefile
+       @$(SHELL) -c 'echo $(CPP) $(CPPFLAGS) $(CPP_ARGS) tmp-Makefile.c \| $(SQUASH_BLANKS) \> bash-Makefile'
+       @$(SHELL) -c '$(CPP) $(CPPFLAGS) $(CPP_ARGS) tmp-Makefile.c | $(SQUASH_BLANKS) >bash-Makefile'
+       rm -f tmp-Makefile.c
+       @test -s bash-Makefile || { rm -f bash-Makefile ; exit 1; }
+
+sysdefs.h: $(MKSYSDEFS)
+       $(SHELL) $(MKSYSDEFS) -s $(srcdir)
+
+# This is also performed by support/mksysdefs, but there's no way to change
+# it if cpp-Makefile is changed without changing anything else, since there
+# are no dependencies.  This lets you run `make ansi-Makefile'.
+ansi-Makefile: $(CPP_MAKEFILE)
+       grep -v '/\*\*/' $(CPP_MAKEFILE) > $@
+
+# Subsequent lines contain targets that are correctly handled by an
+# existing bash-Makefile.
+
+install uninstall newversion architecture: bash-Makefile
+       $(MAKE) -f bash-Makefile $(MFLAGS) $(MAKEARGS) bindir=$(bindir) \
+               prefix=$(prefix) $@
+
+tests DEFINES tags documentation: bash-Makefile directory-frob
+       $(MAKE) -f bash-Makefile $(MFLAGS) $(MAKEARGS) bindir=$(bindir) $@
+
+clean distclean realclean: bash-Makefile directory-frob
+       rm -f .notified
+       $(MAKE) -f bash-Makefile $(MFLAGS) $(MAKEARGS) bindir=$(bindir) $@
+
+directory-frob:
+
+.NOEXPORT:
+
+.notified:
+       @echo ""
+       @echo "   You are about to make this version of GNU Bash for"
+       @echo "   this architecture for the first time.  If you haven't"
+       @echo "   yet read the README file, you may want to do so.  If"
+       @echo "   you wish to report a bug in Bash, or in the installation"
+       @echo "   procedure, please run the bashbug script and include:"
+       @echo ""
+       @echo " * a description of the bug,"
+       @echo " * a recipe for recreating the bug reliably,"
+       @echo " * a fix for the bug if you have one!"
+       @echo ""
+       @touch .notified
diff --git a/CWRU/old-conf/Makefile.builtins b/CWRU/old-conf/Makefile.builtins
new file mode 100644 (file)
index 0000000..1d486e9
--- /dev/null
@@ -0,0 +1,268 @@
+# This Makefile for building libbuiltins.a is in -*- text -*- for Emacs.
+#
+MKBUILTINS = mkbuiltins
+RANLIB = ranlib
+CFLAGS = -g -I.. -I.
+SHELL = /bin/sh
+# CC = cc
+AR = ar
+RM = rm -f
+CP = cp
+
+srcdir = .
+VPATH = .:$(srcdir)
+
+.SUFFIXES:
+.SUFFIXES: .def .c .o
+# How to make a .o file from a .def file.
+.def.o:
+       $(RM) $@
+       ./$(MKBUILTINS) $(DIRECTDEFINE) $<
+       $(CC) -c $(CFLAGS) $(CPPFLAGS) $*.c || ( $(RM) $*.c ; exit 1 )
+       $(RM) $*.c
+
+# How to make a .c file from a .def file.
+.def.c:
+       $(RM) $@
+       ./$(MKBUILTINS) $(DIRECTDEFINE) $<
+
+# Here is a rule for making .o files from .c files that does not
+# force the type of the machine (like -M_MACHINE) into the flags.
+.c.o:
+       $(RM) $@
+       $(CC) -c $(CFLAGS) $(CPPFLAGS) $<
+
+DEFS =  $(srcdir)/alias.def $(srcdir)/bind.def $(srcdir)/break.def \
+       $(srcdir)/builtin.def $(srcdir)/cd.def $(srcdir)/colon.def \
+       $(srcdir)/command.def $(srcdir)/declare.def $(srcdir)/echo.def \
+       $(srcdir)/enable.def $(srcdir)/eval.def $(srcdir)/getopts.def \
+       $(srcdir)/exec.def $(srcdir)/exit.def $(srcdir)/fc.def \
+       $(srcdir)/fg_bg.def $(srcdir)/hash.def $(srcdir)/help.def \
+       $(srcdir)/history.def $(srcdir)/jobs.def $(srcdir)/kill.def \
+       $(srcdir)/let.def $(srcdir)/read.def $(srcdir)/return.def \
+       $(srcdir)/set.def $(srcdir)/setattr.def $(srcdir)/shift.def \
+       $(srcdir)/source.def $(srcdir)/suspend.def $(srcdir)/test.def \
+       $(srcdir)/times.def $(srcdir)/trap.def $(srcdir)/type.def \
+       $(srcdir)/ulimit.def $(srcdir)/umask.def $(srcdir)/wait.def \
+       $(srcdir)/reserved.def $(srcdir)/pushd.def $(srcdir)/shopt.def
+
+STATIC_SOURCE = common.c getopt.c bashgetopt.c getopt.h 
+
+OFILES = builtins.o \
+       alias.o bind.o break.o builtin.o cd.o colon.o command.o \
+       common.o declare.o echo.o enable.o eval.o exec.o exit.o \
+       fc.o fg_bg.o hash.o help.o history.o jobs.o kill.o let.o \
+       pushd.o read.o return.o set.o setattr.o shift.o source.o \
+       suspend.o test.o times.o trap.o type.o ulimit.o umask.o \
+       wait.o getopts.o shopt.o getopt.o bashgetopt.o 
+
+THINGS_TO_TAR = $(DEFS) $(STATIC_SOURCE) Makefile ChangeLog
+
+CREATED_FILES = builtext.h builtins.c psize.aux pipesize.h
+
+all: $(MKBUILTINS) libbuiltins.a
+
+libbuiltins.a: $(MKBUILTINS) $(OFILES)
+       $(RM) $@
+       $(AR) cq $@ $(OFILES)
+       -$(RANLIB) $@
+
+builtext.h builtins.c: $(MKBUILTINS) $(DEFS)
+       $(RM) builtext.h builtins.c
+       ./$(MKBUILTINS) -externfile builtext.h -structfile builtins.c \
+       -noproduction $(DIRECTDEFINE) $(DEFS)
+
+mkbuiltins: $(srcdir)/mkbuiltins.c ../config.h
+       $(CC) $(CFLAGS) -o $(MKBUILTINS) $(srcdir)/mkbuiltins.c
+
+ulimit.o: ulimit.def pipesize.h
+
+pipesize.h:    psize.aux
+       $(SHELL) $(srcdir)/psize.sh > pipesize.h
+
+psize.aux:     psize.c
+       $(CC) $(CFLAGS) -o $@ $(srcdir)/psize.c
+
+documentation: builtins.texi
+
+$(OFILES):     $(MKBUILTINS) ../config.h
+
+builtins.texi: $(MKBUILTINS)
+       ./$(MKBUILTINS) -documentonly $(DEFS)
+
+clean:
+       $(RM) $(OFILES) $(CREATED_FILES) $(MKBUILTINS) libbuiltins.a
+
+alias.o: alias.def
+bind.o: bind.def
+break.o: break.def
+builtin.o: builtin.def
+cd.o: cd.def
+colon.o: colon.def
+command.o: command.def
+declare.o: declare.def
+echo.o: echo.def
+enable.o: enable.def
+eval.o: eval.def
+exec.o: exec.def
+exit.o: exit.def
+fc.o: fc.def
+fg_bg.o: fg_bg.def
+hash.o: hash.def
+help.o: help.def
+history.o: history.def
+jobs.o: jobs.def
+kill.o: kill.def
+let.o: let.def
+pushd.o: pushd.def
+read.o: read.def
+return.o: return.def
+set.o: set.def
+setattr.o: setattr.def
+shift.o: shift.def
+source.o: source.def
+suspend.o: suspend.def
+test.o: test.def
+times.o: times.def
+trap.o: trap.def
+type.o: type.def
+umask.o: umask.def
+wait.o: wait.def
+getopts.o: getopts.def
+reserved.o: reserved.def
+
+common.o: ../shell.h ../command.h ../config.h ../memalloc.h ../general.h
+common.o: ../variables.h ../input.h hashcom.h ../bashhist.h
+common.o: ../quit.h  ../unwind_prot.h ../maxpath.h ../jobs.h ../builtins.h
+common.o: ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+common.o: ../execute_cmd.h ../error.h
+alias.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+alias.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+alias.o: ../shell.h ../unwind_prot.h ../variables.h common.h ../maxpath.h
+bind.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+bind.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+bind.o: ../maxpath.h ../bashline.h
+bind.o: ../shell.h ../unwind_prot.h ../variables.h bashgetopt.h
+break.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+break.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+break.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+builtin.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+builtin.o: ../quit.h common.h ../maxpath.h
+builtin.o: ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+builtin.o: ../shell.h ../unwind_prot.h ../variables.h 
+cd.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+cd.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+cd.o: ../shell.h ../unwind_prot.h ../variables.h common.h ../maxpath.h
+command.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+command.o: ../quit.h bashgetopt.h ../maxpath.h
+command.o: ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+command.o: ../shell.h ../unwind_prot.h ../variables.h 
+declare.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+declare.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+declare.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+echo.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+echo.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+echo.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+enable.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+enable.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+enable.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+eval.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+eval.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+eval.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+exec.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+exec.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+exec.o: ../shell.h ../unwind_prot.h ../variables.h common.h ../execute_cmd.h
+exec.o: ../maxpath.h ../flags.h
+exit.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+exit.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+exit.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+fc.o: ../builtins.h ../command.h bashgetopt.h ../bashhist.h
+fc.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+fc.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+fc.o: ../flags.h ../unwind_prot.h ../variables.h ../shell.h ../maxpath.h
+fg_bg.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+fg_bg.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+fg_bg.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+getopts.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+getopts.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+getopts.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+hash.o: ../builtins.h ../command.h ../quit.h ../execute_cmd.h
+hash.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+hash.o: ../shell.h ../unwind_prot.h ../variables.h common.h ../maxpath.h
+help.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+help.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+help.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+history.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+history.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+history.o: ../filecntl.h ../shell.h ../unwind_prot.h ../variables.h
+history.o: ../bashhist.h ../maxpath.h
+inlib.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+inlib.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+inlib.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+jobs.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+jobs.o: ../quit.h bashgetopt.h ../maxpath.h
+jobs.o: ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+jobs.o: ../shell.h ../unwind_prot.h ../variables.h 
+kill.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+kill.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+kill.o: ../shell.h ../trap.h ../unwind_prot.h ../variables.h ../maxpath.h
+let.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+let.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+let.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+pushd.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+pushd.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+pushd.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h common.h
+read.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+read.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+read.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+return.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+return.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+return.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+set.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+set.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+set.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+setattr.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+setattr.o: ../quit.h common.h bashgetopt.h ../maxpath.h
+setattr.o: ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+setattr.o: ../shell.h ../unwind_prot.h ../variables.h 
+shift.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+shift.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+shift.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+source.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+source.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+source.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+suspend.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+suspend.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+suspend.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+test.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+test.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+test.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+times.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+times.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+times.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+trap.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+trap.o: ../quit.h common.h ../maxpath.h
+trap.o: ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+trap.o: ../shell.h ../unwind_prot.h ../variables.h ../execute_cmd.h
+type.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+type.o: ../quit.h common.h ../maxpath.h
+type.o: ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+type.o: ../shell.h ../unwind_prot.h ../variables.h 
+ulimit.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+ulimit.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+ulimit.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+umask.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+umask.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+umask.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+wait.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+wait.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+wait.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+shopt.o: ../command.h ../config.h ../memalloc.h ../error.h ../general.h
+shopt.o: ../quit.h ../dispose_cmd.h ../make_cmd.h ../subst.h ../externs.h
+shopt.o: ../shell.h ../unwind_prot.h ../variables.h ../maxpath.h
+shopt.o: common.h bashgetopt.h
+bashgetopt.o: ../bashansi.h ../ansi_stdlib.h
+mkbuiltins.o: ../bashansi.h ../ansi_stdlib.h
+fc.o: ../bashansi.h ../ansi_stdlib.h
+
+#bind.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h
diff --git a/CWRU/old-conf/Makefile.documentation b/CWRU/old-conf/Makefile.documentation
new file mode 100644 (file)
index 0000000..3096a51
--- /dev/null
@@ -0,0 +1,119 @@
+# This Makefile is for the Bash/documentation directory -*- text -*-.
+#
+CP         = cp
+RM         = rm -f
+
+INSTALL_DATA = install -c -m 644
+
+DOC_SUPPORT = ../lib/doc-support/
+TEXINDEX    = $(DOC_SUPPORT)texindex
+TEXINDSRC   = $(DOC_SUPPORT)texindex.c
+TEX        = tex
+QUIETPS            = #set this to -q to shut up dvips
+DVIPS      = dvips -D 300 $(QUIETPS) -o $@     # tricky
+TEXINPUTS   = ./../lib/readline/doc
+MAKEINFO    = makeinfo
+
+# Change to groff -Tascii if you don't have nroff
+NROFF      = nroff
+
+# This should be a program that converts troff to postscript
+GROFF      = groff
+
+HSUSER      = ./../lib/readline/doc/hsuser.texinfo
+RLUSER      = ./../lib/readline/doc/rluser.texinfo
+
+.SUFFIXES:     .0 .1 .3 .ms .ps .txt .dvi
+
+.1.ps:
+       $(RM) $@
+       -${GROFF} -man $< > $@
+
+.1.0:
+       $(RM) $@
+       -${NROFF} -man $< > $@
+
+.ms.ps:
+       $(RM) $@
+       -${GROFF} -ms $< > $@
+
+.ms.txt:
+       $(RM) $@
+       -${NROFF} -ms $< > $@
+
+.3.ps:
+       $(RM) $@
+       -${GROFF} -man $< > $@
+
+.3.0:
+       $(RM) $@
+       -${NROFF} -man $< > $@
+
+all: ps info dvi text
+
+ps: bash.ps builtins.ps readline.ps article.ps
+dvi: features.dvi features.ps 
+info: features.info
+text: bash.0 builtins.0 readline.0
+
+features.dvi: features.texi $(HSUSER) $(RLUSER)
+       TEXINPUTS=.:$(TEXINPUTS):$$TEXINPUTS $(TEX) features.texi
+       $(TEXINDEX) features.??
+       TEXINPUTS=.:$(TEXINPUTS):$$TEXINPUTS $(TEX) features.texi
+
+features.ps: features.dvi
+       $(RM) $@
+       $(DVIPS) features.dvi
+
+features.info: features.texi $(HSUSER) $(RLUSER)
+       $(MAKEINFO) --no-split -I$(TEXINPUTS) features.texi
+
+bash.dvi: $(TEXINDEX) bash.texinfo $(HSUSER) $(RLUSER)
+       TEXINPUTS=.:$(TEXINPUTS):$$TEXINPUTS $(TEX) bash.texinfo
+       $(TEXINDEX) bash.??
+       TEXINPUTS=.:$(TEXINPUTS):$$TEXINPUTS $(TEX) bash.texinfo
+
+bashman.ps: bash.dvi
+       rm -f $@
+       $(DVIPS) bash.dvi
+
+bash.txt: bash.1
+bash.ps: bash.1
+builtins.ps: builtins.1 bash.1
+builtins.txt: builtins.1 bash.1
+readline.txt: readline.3
+readline.ps: readline.3
+article.ps: article.ms
+
+$(TEXINDEX): $(TEXINDSRC)
+       (cd $(DOC_SUPPORT); $(MAKE) $(MFLAGS) texindex)
+
+hsuser.texinfo: ../lib/readline/doc/hsuser.texinfo
+       ln -s ../lib/readline/doc/hsuser.texinfo .
+
+rluser.texinfo: ../lib/readline/doc/rluser.texinfo
+       ln -s ../lib/readline/doc/rluser.texinfo .
+
+clean:
+       rm -f *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps *.pgs \
+       *.fns *.kys *.tps *.vrs *.o core texindex rluser.texinfo hsuser.texinfo
+
+distclean:
+       rm -f *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps *.pgs \
+       *.dvi *.info *.info-* *.fns *.kys *.tps *.vrs *.o core texindex \
+       rluser.texinfo hsuser.texinfo
+
+realclean:     clean
+
+install: all
+       -[ -d $(mandir) ] || mkdir $(mandir)
+       $(INSTALL_DATA) bash.1 $(mandir)
+       sed 's:so bash.1:so man1/bash.1:' < builtins.1 > $(mandir)/bash_builtins.1
+       -[ -d $(man3dir) ] || mkdir $(man3dir)
+       $(INSTALL_DATA) readline.3 $(man3dir)
+       -[ -d $(infodir) ] || mkdir $(infodir)
+       $(INSTALL_DATA) features.info $(infodir)/bash.info
+
+uninstall:
+       $(RM) $(mandir)/bash.1 $(mandir)/bash_builtins.1
+       $(RM) $(man3dir)/readline.3 $(infodir)/bash.info
diff --git a/CWRU/old-conf/Makefile.lib.glob b/CWRU/old-conf/Makefile.lib.glob
new file mode 100644 (file)
index 0000000..467a510
--- /dev/null
@@ -0,0 +1,92 @@
+## -*- text -*- ####################################################
+#                                                                 #
+# Makefile for the GNU Glob Library.                              #
+#                                                                 #
+####################################################################
+
+# This Makefile is hand made from a template file, found in
+# ../template.  Each library must provide several Makefile
+# targets: `all', `clean', `documentation', `install', and
+# `what-tar'.  The `what-tar' target reports the names of the
+# files that need to be included in a tarfile to build the full
+# code and documentation for this library.
+
+# Please note that the values for INCLUDES, CC, AR, RM, CP,
+# RANLIB, and selfdir are passed in from ../Makefile, and do
+# not need to be defined here.
+srcdir = .
+VPATH = .:$(srcdir)
+
+# Here is a rule for making .o files from .c files that doesn't force
+# the type of the machine (like -sun3) into the flags.
+.c.o:
+       $(CC) -c $(CFLAGS) $(INCLUDES) $(LOCAL_DEFINES) $(CPPFLAGS) $<
+
+# LOCAL_DEFINES are flags that are specific to this library.
+# Define -DUSG if you are using a System V operating system.
+LOCAL_DEFINES = $(LOCAL_INCLUDES) #-DUSG
+
+# For libraries which include headers from other libraries.
+LOCAL_INCLUDES = -I..
+
+# The name of the library target.
+LIBRARY_NAME = libglob.a
+
+# The C code source files for this library.
+CSOURCES = $(srcdir)glob.c $(srcdir)fnmatch.c
+
+# The header files for this library.
+HSOURCES = $(srcdir)fnmatch.h
+
+OBJECTS = glob.o fnmatch.o
+
+# The texinfo files which document this library.
+DOCSOURCE = doc/glob.texi
+DOCOBJECT = doc/glob.dvi
+DOCSUPPORT = doc/Makefile
+DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT)
+
+SUPPORT = Makefile ChangeLog $(DOCSUPPORT)
+
+SOURCES  = $(CSOURCES) $(HSOURCES) $(DOCSOURCE)
+
+THINGS_TO_TAR = $(SOURCES) $(SUPPORT)
+
+######################################################################
+
+all: $(LIBRARY_NAME)
+
+$(LIBRARY_NAME): $(OBJECTS)
+       $(RM) -f $@
+       $(AR) cq $@ $(OBJECTS)
+       -[ -n "$(RANLIB)" ] && $(RANLIB) $@
+
+what-tar:
+       @for file in $(THINGS_TO_TAR); do \
+         echo $(selfdir)$$file; \
+       done
+
+documentation: force
+       -(cd doc; $(MAKE) $(MFLAGS))
+force:
+
+# The rule for 'includes' is written funny so that the if statement
+# always returns TRUE unless there really was an error installing the
+# include files.
+install:
+       -$(MV) $(bindir)/$(LIBRARY_NAME) $(bindir)/$(LIBRARY_NAME)-old
+       $(CP) $(LIBRARY_NAME) $(bindir)/$(LIBRARY_NAME)
+       -[ -n "$(RANLIB)" ] && $(RANLIB) -t $(bindir)/$(LIBRARY_NAME)
+
+clean:
+       rm -f $(OBJECTS) $(LIBRARY_NAME)
+       -(cd doc; $(MAKE) $(MFLAGS) clean)
+
+
+######################################################################
+#                                                                   #
+#  Dependencies for the object files which make up this library.     #
+#                                                                   #
+######################################################################
+
+fnmatch.o: fnmatch.c fnmatch.h
diff --git a/CWRU/old-conf/Makefile.lib.malloc b/CWRU/old-conf/Makefile.lib.malloc
new file mode 100644 (file)
index 0000000..c6a7b0e
--- /dev/null
@@ -0,0 +1,33 @@
+# Skeleton Makefile for the GNU malloc code
+#
+# Maybe this should really create a library instead of just compiling
+# source files
+
+srcdir = .
+VPATH = .:$(srcdir)
+
+.c.o:
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
+
+.s.o:
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
+
+MALLOC_SOURCE = malloc.c
+
+ALLOCA_SOURCE = alloca.c
+ALLOCA_OBJECT = alloca.o
+
+libmalloc.a:   malloc.o $(ALLOCA)
+       rm -f $@
+       ar cq $@ malloc.o $(ALLOCA)
+       -[ -n "$(RANLIB)" ] && $(RANLIB) $@
+
+malloc.o: malloc.c getpagesize.h
+
+$(ALLOCA_OBJECT): $(ALLOCA_SOURCE)
+
+alloca.o:      $(ALLOCA_SOURCE)
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
+       @- if [ "$(ALLOCA_OBJECT)" != alloca.o ]; then \
+               mv $(ALLOCA_OBJECT) alloca.o >/dev/null 2>&1 ; \
+       fi
diff --git a/CWRU/old-conf/Makefile.lib.readline b/CWRU/old-conf/Makefile.lib.readline
new file mode 100644 (file)
index 0000000..7a12a1f
--- /dev/null
@@ -0,0 +1,154 @@
+## -*- text -*- ####################################################
+#                                                                 #
+# Makefile for the GNU Readline and History Libraries.            #
+#                                                                 #
+####################################################################
+
+srcdir = .
+VPATH = .:$(srcdir)
+
+INSTALL = install -c
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_DATA = ${INSTALL} -m 644
+
+RANLIB = ranlib
+AR = ar
+RM = rm
+CP = cp
+MV = mv
+
+# See the file STANDALONE for the -D defines that readline understands
+DEFS =
+# For libraries which include headers from other libraries.
+LOCAL_INCLUDES = -I. -I..
+
+CPPFLAGS = $(DEFS) $(LOCAL_INCLUDES)
+
+# Here is a rule for making .o files from .c files that doesn't force
+# the type of the machine (like -sun3) into the flags.
+.c.o:
+       $(CC) -c $(CPPFLAGS) $(CFLAGS) $<
+
+# The name of the main library target.
+LIBRARY_NAME = libreadline.a
+
+# The C code source files for this library.
+CSOURCES = $(srcdir)readline.c $(srcdir)funmap.c $(srcdir)keymaps.c \
+          $(srcdir)vi_mode.c $(srcdir)parens.c $(srcdir)rltty.c \
+          $(srcdir)complete.c $(srcdir)bind.c $(srcdir)isearch.c \
+          $(srcdir)display.c $(srcdir)signals.c $(srcdir)emacs_keymap.c \
+          $(srcdir)vi_keymap.c $(srcdir)util.c $(srcdir)kill.c \
+          $(srcdir)undo.c $(srcdir)macro.c $(srcdir)input.c \
+          $(srcdir)callback.c $(srcdir)xmalloc.c \
+          $(srcdir)history.c $(srcdir)histsearch.c $(srcdir)histexpand.c \
+          $(srcdir)histfile.c \
+          $(srcdir)tilde.c \
+
+# The header files for this library.
+HSOURCES = readline.h rldefs.h chardefs.h keymaps.h history.h histlib.h \
+          posixstat.h tilde.h rlconf.h
+
+HISTOBJ = history.o histexpand.o histfile.o histsearch.o
+TILDEOBJ= tilde.o
+OBJECTS = readline.o vi_mode.o funmap.o keymaps.o parens.o search.o \
+         rltty.o complete.o bind.o isearch.o display.o signals.o \
+         util.o kill.o undo.o macro.o input.o callback.o xmalloc.o \
+         $(HISTOBJ) $(TILDEOBJ)
+
+# The texinfo files which document this library.
+DOCSOURCE = doc/rlman.texinfo doc/rltech.texinfo doc/rluser.texinfo
+DOCOBJECT = doc/readline.dvi
+DOCSUPPORT = doc/Makefile
+DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT)
+
+SUPPORT = Makefile ChangeLog $(DOCSUPPORT) examples/[-a-z.]*
+
+SOURCES  = $(CSOURCES) $(HSOURCES) $(DOCSOURCE)
+
+THINGS_TO_TAR = $(SOURCES) $(SUPPORT)
+
+INSTALLED_HEADERS = readline.h chardefs.h keymaps.h history.h tilde.h
+
+##########################################################################
+
+all: libreadline.a libhistory.a
+
+libreadline.a: $(OBJECTS)
+       $(RM) -f $@
+       $(AR) cq $@ $(OBJECTS)
+       -[ -n "$(RANLIB)" ] && $(RANLIB) $@
+
+libhistory.a: $(HISTOBJ) xmalloc.o
+       $(RM) -f $@
+       $(AR) cq $@ $(HISTOBJ) xmalloc.o
+       -[ -n "$(RANLIB)" ] && $(RANLIB) $@
+
+documentation: force
+       [ ! -d doc ] && mkdir doc
+       (if [ -d doc ]; then cd doc; $(MAKE) $(MFLAGS); fi)
+
+force:
+
+# The rule for 'includes' is written funny so that the if statement
+# always returns TRUE unless there really was an error installing the
+# include files.
+install: installdirs libreadline.a
+       for file in $(INSTALLED_HEADERS) ; do \
+               $(INSTALL_DATA) $(srcdir)/$$file $(incdir)/readline ; \
+       done
+       ${INSTALL_DATA} readline.h keymaps.h chardefs.h history.h \
+               $(incdir)/readline
+       -${MV} $(libdir)/libreadline.a $(libdir)/libreadline.old
+       ${INSTALL_DATA} libreadline.a $(bindir)/libreadline.a
+       -[ -n "$(RANLIB)" ] && $(RANLIB) -t $(bindir)/libreadline.a
+
+installdirs:
+       -[ ! -d $(incdir)/readline ] && { \
+         mkdir $(incdir)/readline && chmod 755 $(incdir)/readline; }
+       -[ ! -d $(libdir) ] && mkdir $(libdir)
+
+uninstall:
+       cd $(incdir)/readline && ${RM} -f ${INSTALLED_HEADERS}
+       cd $(libdir) && ${RM} -f libreadline.a libreadline.old
+
+clean:
+       rm -f $(OBJECTS) *.a
+       (if [ -d doc ]; then cd doc; $(MAKE) $(MFLAGS) $@; fi)
+
+tags:  force
+       etags $(CSOURCES) $(HSOURCES)
+
+TAGS:  force
+       ctags -x $(CSOURCES) $(HSOURCES) > $@
+
+readline: readline.h rldefs.h chardefs.h
+readline: $(OBJECTS)
+       $(CC) $(CFLAGS) $(CPPFLAGS) $(READLINE_DEFINES) \
+         $(LOCAL_INCLUDES) -DTEST -o readline readline.c vi_mode.o funmap.o \
+         keymaps.o -ltermcap
+
+realclean distclean mostlyclean: clean
+
+# Dependencies
+readline.o: readline.c readline.h rldefs.h rlconf.h chardefs.h
+readline.o: keymaps.h history.h
+vi_mode.o: rldefs.h rlconf.h readline.h history.h
+funmap.o: funmap.c readline.h rlconf.h
+keymaps.o: keymaps.c emacs_keymap.c vi_keymap.c keymaps.h chardefs.h rlconf.h
+history.o: history.h histlib.h
+histexpand.o: history.h histlib.h
+histsearch.o: history.h histlib.h
+histfile.o: history.h histlib.h
+isearch.o: readline.h history.h
+search.o: readline.h history.h
+display.o: readline.h history.h rldefs.h rlconf.h
+complete.o: readline.h rldefs.h rlconf.h
+rltty.o: rldefs.h rlconf.h readline.h
+bind.o: rldefs.h rlconf.h readline.h history.h
+signals.o: rldefs.h rlconf.h readline.h history.h
+parens.o: readline.h
+kill.o: rldefs.h rlconf.h readline.h history.h
+macro.o: rldefs.h rlconf.h readline.h history.h
+undo.o: rldefs.h rlconf.h readline.h history.h
+input.o: rldefs.h rlconf.h readline.h history.h
+callback.o: rlconf.h rldefs.h readline.h
diff --git a/CWRU/old-conf/Makefile.lib.termcap b/CWRU/old-conf/Makefile.lib.termcap
new file mode 100644 (file)
index 0000000..bbdf99f
--- /dev/null
@@ -0,0 +1,64 @@
+## -*- text -*- ####################################################
+#                                                                 #
+# Makefile for termcap replacement libbrary.                      #
+#                                                                 #
+####################################################################
+
+# Here is a rule for making .o files from .c files that doesn't force
+# the type of the machine (like -sun3) into the flags.
+.c.o:
+       $(CC) -c $(CFLAGS) $(LOCAL_INCLUDES) $(CPPFLAGS) $*.c
+
+# Destination installation directory.  The libraries are copied to DESTDIR
+# when you do a `make install'.
+DESTDIR = /usr/local/lib
+
+DEBUG_FLAGS = -g
+#OPTIMIZE_FLAGS = -O
+LDFLAGS = $(DEBUG_FLAGS) 
+CFLAGS = $(DEBUG_FLAGS) $(OPTIMIZE_FLAGS)
+
+SHELL = /bin/sh
+
+# A good alternative is gcc -traditional.
+#CC = gcc -traditional
+CC = cc
+RANLIB = /usr/bin/ranlib
+AR = ar
+RM = rm
+CP = cp
+
+CSOURCES = termcap.c tparam.c
+
+SOURCES  = $(CSOURCES)
+
+OBJECTS = termcap.o tparam.o
+
+DOCUMENTATION = termcap.texinfo
+
+THINGS_TO_TAR = $(SOURCES) $(DOCUMENTATION)
+
+##########################################################################
+
+all: libtermcap.a
+
+libtermcap.a:  $(OBJECTS)
+               $(RM) -f $@
+               $(AR) clq $@ $(OBJECTS)
+               -[ -n "$(RANLIB)" ] && $(RANLIB) $@
+
+termcap.tar:   $(THINGS_TO_TAR)
+               tar -cf $@ $(THINGS_TO_TAR)
+
+termcap.tar.Z: termcap.tar
+               compress -f termcap.tar
+
+install:       $(DESTDIR)/libtermcap.a
+
+clean:
+               rm -f *.o *.a *.log *.cp *.tp *.vr *.fn *.aux *.pg *.toc
+
+$(DESTDIR)/libtermcap.a: libtermcap.a
+               -mv $(DESTDIR)/libtermcap.a $(DESTDIR)/libtermcap.old
+               cp libtermcap.a $@
+               -[ -n "$(RANLIB)" ] && $(RANLIB) -t $@
diff --git a/CWRU/old-conf/Makefile.lib.tilde b/CWRU/old-conf/Makefile.lib.tilde
new file mode 100644 (file)
index 0000000..b3f4c26
--- /dev/null
@@ -0,0 +1,94 @@
+## -*- text -*- ####################################################
+#                                                                 #
+# Makefile for the GNU Tilde Library.                             #
+#                                                                 #
+####################################################################
+
+# This Makefile is hand made from a template file, found in
+# ../template.  Each library must provide several Makefile
+# targets: `all', `clean', `documentation', `install', and
+# `what-tar'.  The `what-tar' target reports the names of the
+# files that need to be included in a tarfile to build the full
+# code and documentation for this library.
+
+# Please note that the values for INCLUDES, CC, AR, RM, CP,
+# RANLIB, and selfdir are passed in from ../Makefile, and do
+# not need to be defined here.
+RM = rm
+
+srcdir = .
+VPATH = .:$(srcdir)
+
+# Here is a rule for making .o files from .c files that doesn't force
+# the type of the machine (like -sun3) into the flags.
+.c.o:
+       $(CC) -c $(CFLAGS) $(INCLUDES) $(LOCAL_DEFINES) $(CPPFLAGS) $<
+
+# LOCAL_DEFINES are flags that are specific to this library.
+# Define -DUSG if you are using a System V operating system.
+LOCAL_DEFINES = $(LOCAL_INCLUDES) #-DUSG
+
+# For libraries which include headers from other libraries.
+LOCAL_INCLUDES = -I..
+
+# The name of the library target.
+LIBRARY_NAME = libtilde.a
+
+# The C code source files for this library.
+CSOURCES = $(srcdir)/tilde.c
+
+# The header files for this library.
+HSOURCES = $(srcdir)/tilde.h
+
+OBJECTS = tilde.o
+
+# The texinfo files which document this library.
+DOCSOURCE = doc/tilde.texi
+DOCOBJECT = doc/tilde.dvi
+DOCSUPPORT = doc/Makefile
+DOCUMENTATION = $(DOCSOURCE) $(DOCOBJECT) $(DOCSUPPORT)
+
+SUPPORT = Makefile ChangeLog $(DOCSUPPORT)
+
+SOURCES  = $(CSOURCES) $(HSOURCES) $(DOCSOURCE)
+
+THINGS_TO_TAR = $(SOURCES) $(SUPPORT)
+
+######################################################################
+
+all: $(LIBRARY_NAME)
+
+$(LIBRARY_NAME): $(OBJECTS)
+       $(RM) -f $@
+       $(AR) cq $@ $(OBJECTS)
+       -[ -n "$(RANLIB)" ] && $(RANLIB) $@
+
+what-tar:
+       @for file in $(THINGS_TO_TAR); do \
+         echo $(selfdir)$$file; \
+       done
+
+documentation: force
+       -(cd doc; $(MAKE) $(MFLAGS))
+force:
+
+# The rule for 'includes' is written funny so that the if statement
+# always returns TRUE unless there really was an error installing the
+# include files.
+install:
+       -$(MV) $(bindir)/$(LIBRARY_NAME) $(bindir)/$(LIBRARY_NAME)-old
+       $(CP) $(LIBRARY_NAME) $(bindir)/$(LIBRARY_NAME)
+       -[ -n "$(RANLIB)" ] && $(RANLIB) -t $(bindir)/$(LIBRARY_NAME)
+
+clean:
+       $(RM) -f $(OBJECTS) $(LIBRARY_NAME)
+       -(cd doc; $(MAKE) $(MFLAGS) clean)
+
+
+######################################################################
+#                                                                   #
+#  Dependencies for the object files which make up this library.     #
+#                                                                   #
+######################################################################
+
+tilde.o: tilde.h tilde.c
diff --git a/CWRU/old-conf/config.h b/CWRU/old-conf/config.h
new file mode 100644 (file)
index 0000000..b805d0d
--- /dev/null
@@ -0,0 +1,178 @@
+/* config.h -- Configuration file for bash. */
+
+/* Copyright (C) 1987,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. */
+
+#if !defined (_CONFIG_H_)
+#define _CONFIG_H_
+
+#if !defined (BUILDING_MAKEFILE)
+#include "memalloc.h"
+#endif
+
+#if defined (HAVE_UNISTD_H) && !defined (BUILDING_MAKEFILE)
+#  ifdef CRAY
+#    define word __word
+#  endif
+#include <unistd.h>
+#  ifdef CRAY
+#    undef word
+#  endif
+#endif
+
+/* Define JOB_CONTROL if your operating system supports
+   BSD-like job control. */
+#define JOB_CONTROL
+
+/* Note that vanilla System V machines don't support BSD job control,
+   although some do support Posix job control. */
+#if defined (USG) || defined (MINIX) || defined (Minix)
+#  if !defined (_POSIX_JOB_CONTROL)
+#    undef JOB_CONTROL
+#  endif /* !_POSIX_JOB_CONTROL */
+#endif /* USG || Minix || MINIX */
+
+/* Define ALIAS if you want the alias features. */
+#define ALIAS
+
+/* Define PUSHD_AND_POPD if you want those commands to be compiled in.
+   (Also the `dirs' commands.) */
+#define PUSHD_AND_POPD
+
+/* Define BRACE_EXPANSION if you want curly brace expansion a la Csh:
+   foo{a,b} -> fooa foob.  Even if this is compiled in (the default) you
+   can turn it off at shell startup with `-nobraceexpansion', or during
+   shell execution with `set +o braceexpand'. */
+#define BRACE_EXPANSION
+
+/* Define READLINE to get the nifty/glitzy editing features.
+   This is on by default.  You can turn it off interactively
+   with the -nolineediting flag. */
+#define READLINE
+
+/* Define BANG_HISTORY if you want to have Csh style "!" history expansion.
+   This is unrelated to READLINE. */
+#define BANG_HISTORY
+
+/* Define HISTORY if you want to have access to previously typed commands.
+
+   If both HISTORY and READLINE are defined, you can get at the commands
+   with line editing commands, and you can directly manipulate the history
+   from the command line.
+
+   If only HISTORY is defined, the `fc' and `history' builtins are
+   available. */
+#define HISTORY
+
+#if defined (BANG_HISTORY) && !defined (HISTORY)
+   /* BANG_HISTORY requires HISTORY. */
+#  define HISTORY
+#endif /* BANG_HISTORY && !HISTORY */
+
+#if defined (READLINE) && !defined (HISTORY)
+#  define HISTORY
+#endif
+
+/* Define this if you want completion that puts all alternatives into
+   a brace expansion shell expression. */
+#if defined (BRACE_EXPANSION) && defined (READLINE)
+#  define BRACE_COMPLETION
+#endif /* BRACE_EXPANSION */
+
+/* The default value of the PATH variable. */
+#define DEFAULT_PATH_VALUE \
+  "/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:."
+
+/* The value for PATH when invoking `command -p'.  This is only used when
+   the Posix.2 confstr () function, or CS_PATH define are not present. */
+#define STANDARD_UTILS_PATH \
+  "/bin:/usr/bin:/usr/ucb:/usr/sbin:/etc:/usr/etc"
+
+/* Define V9_ECHO if you want to give the echo builtin backslash-escape
+   interpretation using the -e option, in the style of the Bell Labs 9th
+   Edition version of echo. */
+#define V9_ECHO
+
+/* Define DEFAULT_ECHO_TO_USG if you want the echo builtin to interpret
+   the backslash-escape characters by default, like the System V echo.
+   This requires that V9_ECHO be defined. */
+/* #define DEFAULT_ECHO_TO_USG */
+#if !defined (V9_ECHO)
+#  undef DEFAULT_ECHO_TO_USG
+#endif
+
+/* Define CONTINUE_AFTER_KILL_ERROR if you want the kill command to
+   continue processing arguments after one of them fails. */
+#define CONTINUE_AFTER_KILL_ERROR
+
+/* Define BREAK_COMPLAINS if you want the non-standard, but useful
+   error messages about `break' and `continue' out of context. */
+#define BREAK_COMPLAINS
+
+/* Define HELP_BUILTIN if you want the `help' shell builtin and the long
+   documentation strings compiled into the shell. */
+#define HELP_BUILTIN
+
+/* Define RESTRICTED_SHELL if you want the generated shell to have the
+   ability to be a restricted one.  The shell thus generated can become
+   restricted by being run with the name "rbash", or by setting the -r
+   flag. */
+#define RESTRICTED_SHELL
+
+/* If the shell is called by this name, it will become restricted. */
+#if defined (RESTRICTED_SHELL)
+#define RESTRICTED_SHELL_NAME "rbash"
+#endif
+
+/* Define DISABLED_BUILTINS if you want "builtin foo" to always run the
+   shell builtin "foo", even if it has been disabled with "enable -n foo". */
+/* #define DISABLED_BUILTINS */
+
+/* Define PROCESS_SUBSTITUTION if you want the K*rn shell-like process
+   substitution features "<(file)". */
+/* Right now, you cannot do this on machines without fully operational
+   FIFO support.  This currently include NeXT and Alliant. */
+#if !defined (MKFIFO_MISSING) || defined (HAVE_DEV_FD)
+#  define PROCESS_SUBSTITUTION
+#endif /* !MKFIFO_MISSING */
+
+/* Define PROMPT_STRING_DECODE if you want the backslash-escaped special
+   characters in PS1 and PS2 expanded.  Variable expansion will still be
+   performed. */
+#define PROMPT_STRING_DECODE
+
+/* Define BUFFERED_INPUT if you want the shell to do its own input
+   buffering. */
+#define BUFFERED_INPUT
+
+/* Define ONESHOT if you want sh -c 'command' to avoid forking to execute
+   `command' whenever possible. */
+#define ONESHOT
+
+/* Default primary and secondary prompt strings. */
+#define PPROMPT "\\s\\$ "
+#define SPROMPT "> "
+
+/* Define SELECT_COMMAND if you want the Korn-shell style `select' command:
+       select word in word_list; do command_list; done */
+#define SELECT_COMMAND
+
+/* Define ARRAY_VARS if you want ksh-style one-dimensional array variables. */
+#define ARRAY_VARS
+
+#endif /* !_CONFIG_H_ */
diff --git a/CWRU/old-conf/config.h.mini b/CWRU/old-conf/config.h.mini
new file mode 100644 (file)
index 0000000..3c967ac
--- /dev/null
@@ -0,0 +1,191 @@
+/* config.h -- Configuration file for bash. */
+
+/* This is a `minimal' configuration file.  It will create a shell without:
+       job control
+       aliases
+       pushd and popd
+       readline
+       history
+       restricted shell mode
+       `disabled' builtins (builtin xxx finds xxx even after enable -n xxx)
+       process substitution
+       prompt string decoding (though variable expansion is still done)
+       the `select' command
+       the `help' builtin
+*/
+       
+/* Copyright (C) 1987,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. */
+
+#if !defined (_CONFIG_H_)
+#define _CONFIG_H_
+
+#include "memalloc.h"
+
+#if defined (HPUX) || defined (UNIXPC) || defined (Xenix)
+#  if !defined (USG)
+#    define USG
+#  endif
+#endif
+
+#if defined (HAVE_UNISTD_H) && !defined (BUILDING_MAKEFILE)
+#include <unistd.h>
+#endif
+
+/* Define JOB_CONTROL if your operating system supports
+   BSD-like job control. */
+/* #define JOB_CONTROL */
+
+/* Note that vanilla System V machines don't support BSD job control,
+   although some do support Posix job control. */
+#if defined (USG) && !defined (_POSIX_JOB_CONTROL)
+#  undef JOB_CONTROL
+#endif /* USG && !_POSIX_JOB_CONTROL */
+
+/* Define ALIAS if you want the alias features. */
+/* #define ALIAS */
+
+/* Define PUSHD_AND_POPD if you want those commands to be compiled in.
+   (Also the `dirs' commands.) */
+/* #define PUSHD_AND_POPD */
+
+/* Define BRACE_EXPANSION if you want curly brace expansion a la Csh:
+   foo{a,b} -> fooa foob.  Even if this is compiled in (the default) you
+   can turn it off at shell startup with `-nobraceexpansion', or during
+   shell execution with `set +o braceexpand'. */
+/* #define BRACE_EXPANSION */
+
+/* Define READLINE to get the nifty/glitzy editing features.
+   This is on by default.  You can turn it off interactively
+   with the -nolineediting flag. */
+/* #define READLINE */
+
+/* Define BANG_HISTORY if you want to have Csh style "!" history expansion.
+   This is unrelated to READLINE. */
+/* #define BANG_HISTORY */
+
+/* Define HISTORY if you want to have access to previously typed commands.
+
+   If both HISTORY and READLINE are defined, you can get at the commands
+   with line editing commands, and you can directly manipulate the history
+   from the command line.
+
+   If only HISTORY is defined, the `fc' and `history' builtins are
+   available. */
+/* #define HISTORY */
+
+#if defined (BANG_HISTORY) && !defined (HISTORY)
+   /* BANG_HISTORY requires HISTORY. */
+#  define HISTORY
+#endif /* BANG_HISTORY && !HISTORY */
+
+#if defined (READLINE) && !defined (HISTORY)
+#  define HISTORY
+#endif
+
+/* Define this if you want completion that puts all alternatives into
+   a brace expansion shell expression. */
+#if defined (BRACE_EXPANSION) && defined (READLINE)
+#  define BRACE_COMPLETION
+#endif /* BRACE_EXPANSION */
+
+/* The default value of the PATH variable. */
+#define DEFAULT_PATH_VALUE \
+  "/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:."
+
+/* The value for PATH when invoking `command -p'.  This is only used when
+   the Posix.2 confstr () function, or CS_PATH define are not present. */
+#define STANDARD_UTILS_PATH \
+  "/bin:/usr/bin:/usr/ucb:/usr/sbin:/etc:/usr/etc"
+
+/* The default directory in which to look for mail files when
+   checking mail.  The trailing slash is required. */
+#if defined (USG)
+#  define DEFAULT_MAIL_PATH "/usr/mail/"
+#else
+#  define DEFAULT_MAIL_PATH "/usr/spool/mail/"
+#endif
+
+/* Define V9_ECHO if you want to give the echo builtin backslash-escape
+   interpretation using the -e option, in the style of the Bell Labs 9th
+   Edition version of echo. */
+#define V9_ECHO
+
+/* Define DEFAULT_ECHO_TO_USG if you want the echo builtin to interpret
+   the backslash-escape characters by default, like the System V echo.
+   This requires that V9_ECHO be defined. */
+/* #define DEFAULT_ECHO_TO_USG */
+#if !defined (V9_ECHO)
+#  undef DEFAULT_ECHO_TO_USG
+#endif
+
+/* Define CONTINUE_AFTER_KILL_ERROR if you want the kill command to
+   continue processing arguments after one of them fails. */
+#define CONTINUE_AFTER_KILL_ERROR
+
+/* Define BREAK_COMPLAINS if you want the non-standard, but useful
+   error messages about `break' and `continue' out of context. */
+#define BREAK_COMPLAINS
+
+/* Define HELP_BUILTIN if you want the `help' shell builtin and the long
+   documentation strings compiled into the shell. */   
+/* #define HELP_BUILTIN */
+
+/* Define RESTRICTED_SHELL if you want the generated shell to have the
+   ability to be a restricted one.  The shell thus generated can become
+   restricted by being run with the name "rbash", or by setting the -r
+   flag. */
+/* #define RESTRICTED_SHELL */
+
+/* Define DISABLED_BUILTINS if you want "builtin foo" to always run the
+   shell builtin "foo", even if it has been disabled with "enable -n foo". */
+/* #define DISABLED_BUILTINS */
+
+/* Define PROCESS_SUBSTITUTION if you want the K*rn shell-like process
+   substitution features "<(file)". */
+/* Right now, you cannot do this on machines without fully operational
+   FIFO support.  This currently include NeXT and Alliant. */
+#if !defined (MKFIFO_MISSING)
+#  define PROCESS_SUBSTITUTION
+#endif /* !MKFIFO_MISSING */
+
+/* Define PROMPT_STRING_DECODE if you want the backslash-escaped special
+   characters in PS1 and PS2 expanded.  Variable expansion will still be
+   performed. */
+/* #define PROMPT_STRING_DECODE */
+
+/* Define BUFFERED_INPUT if you want the shell to do its own input
+   buffering. */
+#define BUFFERED_INPUT
+
+/* Define ONESHOT if you want sh -c 'command' to avoid forking to execute
+   `command' whenever possible. */
+#define ONESHOT
+
+/* Default primary and secondary prompt strings. */
+#define PPROMPT "\\s\\$ "
+#define SPROMPT "> "
+
+/* Define SELECT_COMMAND if you want the Korn-shell style `select' command:
+       select word in word_list; do command_list; done */
+/* #define SELECT_COMMAND */
+
+/* Define ARRAY if you want ksh-style one-dimensional arrays. */
+/* #define ARRAY_VARS */
+
+#endif /* !_CONFIG_H_ */
diff --git a/CWRU/old-conf/configure b/CWRU/old-conf/configure
new file mode 100755 (executable)
index 0000000..53e10b6
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# This shell script does nothing since Bash doesn't require
+# configuration to be forced on it; it auto-configures.  You can
+# change the location of the source directory with +srcdir.
+#
+echo "Bash is configured to auto configure."
+exit 0
diff --git a/CWRU/old-conf/cpp-Makefile b/CWRU/old-conf/cpp-Makefile
new file mode 100644 (file)
index 0000000..3e8887a
--- /dev/null
@@ -0,0 +1,1379 @@
+/* This -*- C -*- file (cpp-Makefile) is run through the C preprocessor
+   to produce bash-Makefile which is machine specific.
+
+   If you have Gcc and/or Bison, you might wish to mention that right
+   below here.
+
+   Since this is to become a Makefile, blank lines which appear outside
+   of comments may not contain a TAB character.
+
+   Copyright (C) 1987,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. */
+
+/**/# This Makefile is automagically made from cpp-Makefile.  You should
+/**/# not be editing this file; edit cpp-Makefile, machines.h, or
+/**/# support/mksysdefs instead.  Then, assuming the edits were required
+/**/# to compile Bash on your system, mail the changes you had to make to
+/**/# bash-maintainers@prep.ai.mit.edu.  We will do our best to incorporate
+/**/# them into the next release.
+
+/**/# Make sure the first target in the makefile is the right one
+all: .made
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Which compiler are you using?               */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Define HAVE_GCC if you have the GNU C compiler. */
+/* #define HAVE_GCC */
+
+#if defined (__GNUC__) && !defined (HAVE_GCC) && !defined (GCC_STANDARD)
+#  define HAVE_GCC
+#endif
+
+/* Undefine HAVE_FIXED_INCLUDES if you are not using GCC with the fixed
+   header files. */
+#if defined (HAVE_GCC) && !defined (HAVE_FIXED_INCLUDES)
+#  define HAVE_FIXED_INCLUDES
+#endif /* HAVE_GCC && !HAVE_FIXED_INCLUDES */
+
+/* Include some boilerplate Gnu makefile definitions. */
+prefix = /usr/local
+
+/**/#prefix = @prefix@
+
+exec_prefix = $(prefix)
+bindir = $(exec_prefix)/bin
+libdir = $(exec_prefix)/lib
+
+manroot = $(prefix)/man
+
+man1ext = 1
+man1dir = $(manroot)/man$(man1ext)
+man3ext = 3
+man3dir = $(manroot)/man$(man3ext)
+mandir = $(man1dir)
+manext = $(man1ext)
+
+infodir = $(prefix)/info
+
+srcdir = .
+/**/#srcdir = @srcdir@
+
+VPATH = .:$(srcdir)
+
+incdir = $(prefix)/include
+/**/#incdir = @incdir@
+
+/* If you have purify, and want to use it, uncomment this definition or
+   run the make as `make -f bash-Makefile bash PURIFY=purify'. */
+PURIFY = # purify
+
+/* This includes the appropriate description for the machine that you are
+   using (we hope).  If the compilation doesn't work correctly, then you
+   will have to edit the file `machines.h' to include a description for the
+   machine that your Cpp uniquely identifies this as.  For example, Sun 4's
+   are recognized by the Cpp identifier `sparc', Vax is recognized with `vax',
+   etc.  The order of these files is very important.  Config.h must come last,
+   since it is capable of undef'ing various things. */
+#define BUILDING_MAKEFILE   /* Tell config.h to avoid #including anything. */
+#include "sysdefs.h"
+#include "machines.h"
+#include "config.h"
+
+/**/# Here is a rule for making .o files from .c files that does not
+/**/# force the type of the machine (like -M_MACHINE) into the flags.
+.c.o:
+       $(RM) $@
+       $(CC) $(CCFLAGS) $(CPPFLAGS) -c $<
+
+YACC = YACC_PROG
+
+#if defined (HAVE_GCC)
+#  if defined (GCC_FLAGS)
+GCC_EXTRAS = GCC_FLAGS
+#  endif /* GCC_FLAGS */
+#  if !defined (HAVE_FIXED_INCLUDES)
+/* This is guaranteed to work, even if you have the fixed includes!
+   (Unless, of course, you have the fixed include files installed in
+   /usr/include.  Then it will break.) */
+CC = gcc -traditional -I/usr/include $(GCC_EXTRAS)
+#  else /* HAVE_FIXED_INCLUDES */
+CC = gcc $(GCC_EXTRAS)
+#  endif /* HAVE_FIXED_INCLUDES */
+#else /* !HAVE_GCC */
+CC = CPP_CC
+#endif /* !HAVE_GCC */
+
+SHELL=/bin/sh
+CP = cp
+RM = rm -f
+AR = ar
+#if defined (RANLIB_LOCATION)
+RANLIB = RANLIB_LOCATION
+#else
+RANLIB = ranlib
+#endif /* RANLIB_LOCATION */
+
+INSTALL_PROGRAM = $(SUPPORT_SRC)install.sh -c -s
+INSTALL_DATA = $(SUPPORT_SRC)install -c -m 644
+
+COMPRESS = gzip
+COMPRESS_EXT = .gz
+
+Machine = M_MACHINE
+OS = M_OS
+
+/**/# PROFILE_FLAGS is either -pg, to generate profiling info for use
+/**/# with gprof, or nothing (the default).
+PROFILE_FLAGS=
+
+/* These are defined in machines.h or sysdefs.h */
+#if defined (SYSDEP_CFLAGS)
+/**/# This system has some peculiar flags that must be passed to the
+/**/# the C compiler (or to cpp).
+SYSDEP = SYSDEP_CFLAGS
+#endif /* SYSDEP_CFLAGS */
+
+#if defined (SYSDEP_LDFLAGS)
+/**/# This system has some peculiar flags that must be passed to the
+/**/# link editor (ld).
+SYSDEP_LD = SYSDEP_LDFLAGS
+#endif /* SYSDEP_LDFLAGS */
+
+#if defined (HAVE_SETLINEBUF)
+/**/# This system has the setlinebuf () call.
+LINEBUF = -DHAVE_SETLINEBUF
+#endif
+
+#if defined (HAVE_VFPRINTF)
+/**/# This system has the vprintf () and vfprintf () calls.
+VPRINTF = -DHAVE_VFPRINTF
+#endif /* HAVE_VFPRINTF */
+
+#if defined (USE_VFPRINTF_EMULATION)
+VPRINTF = -DHAVE_VFPRINTF -DUSE_VFPRINTF_EMULATION
+#endif /* USE_VFPRINTF_EMULATION */
+
+#if defined (VOID_SIGHANDLER)
+/**/# The signal () call provided by the system returns a pointer to
+/**/# a function returning void.  The signal handlers themselves are
+/**/# thus void functions.
+SIGHANDLER = -DVOID_SIGHANDLER
+#endif
+
+#if defined (HAVE_STRERROR)
+/**/# This system has the strerror () function.
+STRERROR = -DHAVE_STRERROR
+#endif
+
+#if defined (HAVE_GETGROUPS)
+/**/# This system has multiple groups.
+GROUPS = -DHAVE_GETGROUPS
+#endif
+
+#if defined (HAVE_GETWD)
+/**/# This system has the getwd () call.
+GETWD = -DHAVE_GETWD
+#endif
+
+#if defined (HAVE_GETCWD)
+/**/# This system has the getcwd () call.
+GETCWD = -DHAVE_GETCWD
+#endif
+
+#if defined (HAVE_DUP2)
+/**/# This system has a working version of dup2 ().
+DUP2 = -DHAVE_DUP2
+#endif /* HAVE_DUP2 */
+
+#if defined (HAVE_DIRENT)
+/**/# This system uses struct dirent for reading directories with readdir.
+DIRENT = -DHAVE_DIRENT
+#endif /* HAVE_DIRENT */
+
+#if defined (HAVE_STRCHR)
+/**/# This system has strchr () and strrchr () string functions.
+STRCHR = -DHAVE_STRCHR
+#endif /* HAVE_STRCHR */
+
+#if defined (HAVE_STRCASECMP)
+STRCASE = -DHAVE_STRCASECMP
+#endif /* HAVE_STRCASECMP */
+
+#if defined (HAVE_SYS_SIGLIST)
+SIGLIST = -DHAVE_SYS_SIGLIST
+#endif /* HAVE_SYS_SIGLIST */
+
+#if defined (HAVE_DLOPEN)
+DLOPEN = -DHAVE_DLOPEN
+#endif
+
+#if defined (HAVE_DLSYM)
+DLSYM = -DHAVE_DLSYM
+#endif
+
+#if defined (HAVE_DLCLOSE)
+DLCLOSE = -DHAVE_DLCLOSE
+#endif
+
+#if defined (HAVE_ALLOCA)
+ALLOCA_DEFINE = -DHAVE_ALLOCA
+#else
+ALLOCA_DEFINE =
+#endif /* HAVE_ALLOCA */
+
+#if defined (HAVE_SYS_STREAM_H)
+/**/# This system has <sys/stream.h>
+STREAM = -DHAVE_SYS_STREAM_H
+#endif /* HAVE_SYS_STREAM_H */
+
+#if defined (HAVE_SYS_PTEM_H)
+/**/# This system has <sys/ptem.h>
+PTEM = -DHAVE_SYS_PTEM_H
+#endif /* HAVE_SYS_PTEM_H */
+
+#if defined (HAVE_SYS_PTE_H)
+/**/# This system has <sys/pte.h>
+PTE = -DHAVE_SYS_PTE_H
+#endif /* HAVE_SYS_PTE_H */
+
+/**/# This system has <unistd.h>.
+#if defined (HAVE_UNISTD_H)
+UNISTD = -DHAVE_UNISTD_H
+#endif
+
+/**/# This system has <stdlib.h>
+#if defined (HAVE_STDLIB_H)
+STDLIB = -DHAVE_STDLIB_H
+#endif
+
+/**/# This system has <limits.h>
+#if defined (HAVE_LIMITS_H)
+LIMITSH = -DHAVE_LIMITS_H
+#endif
+
+/**/# This system has <locale.h>
+#if defined (HAVE_LOCALE_H)
+LOCALE = -DHAVE_LOCALE_H
+#endif
+
+#if defined (HAVE_ALLOCA_H)
+ALLOCA_H_DEFINE = -DHAVE_ALLOCA_H
+#else
+ALLOCA_H_DEFINE =
+#endif /* HAVE_ALLOCA_H */
+
+#if defined (HAVE_RESOURCE)
+/**/# This system has <sys/resource.h>
+RESOURCE = -DHAVE_RESOURCE
+#endif
+
+#if defined (HAVE_SYS_PARAM)
+/**/# This system has <sys/param.h>
+PARAM = -DHAVE_SYS_PARAM
+#endif
+
+#if defined (HAVE_WAIT_H)
+/**/# This system has <sys/wait.h>
+WAITH = -DHAVE_WAIT_H
+#endif
+
+#if defined (HAVE_DIRENT_H)
+/**/# This system has /usr/include/dirent.h
+DIRENTH = -DHAVE_DIRENT_H
+#endif /* HAVE_DIRENT_H */
+
+#if defined (HAVE_STRING_H)
+/**/# This system has /usr/include/string.h
+STRINGH = -DHAVE_STRING_H
+#endif /* HAVE_STRING_H */
+
+#if defined (HAVE_VARARGS_H)
+/**/# This system has /usr/include/varargs.h
+VARARGSH = -DHAVE_VARARGS_H
+#endif /* HAVE_VARARGS_H */
+
+#if defined (HAVE_DEV_FD)
+/**/# This system has the /dev/fd directory for naming open files.
+DEVFD = -DHAVE_DEV_FD
+#endif /* HAVE_DEV_FD */
+
+/**/# The GNU coding standards don't recognize the possibility that
+/**/# other information besides optimization and debugging might be
+/**/# passed to cc.  A different name should have been used.
+CFLAGS = -O -g
+
+SYSTEM_FLAGS = $(LINEBUF) $(VPRINTF) $(UNISTD) $(STDLIB) $(LIMITSH) $(LOCALE) \
+       $(GROUPS) $(RESOURCE) $(PARAM) $(SIGHANDLER) $(SYSDEP) $(WAITH) \
+       $(GETWD) $(GETCWD) $(DUP2) $(STRERROR) $(DIRENT) $(DIRENTH) $(STRINGH) \
+       $(VARARGSH) $(STRCHR) $(STRCASE) $(DEVFD) $(DLOPEN) $(DLSYM) \
+       $(DLCLOSE) $(SIGLIST) -D$(Machine) -D$(OS) -DPROGRAM='"$(Program)"' \
+       -DHOSTTYPE='$(Machine)' -DOSTYPE='$(OS)'
+
+/* Compilation flags to use in the shell directory and to pass to builds
+   in subdirectories (readline, termcap) to ensure that alloca is treated
+   in a consistent fashion. */
+ALLOCA_CFLAGS = $(ALLOCA_DEFINE) $(ALLOCA_H_DEFINE)
+
+LDFLAGS        = $(NOSHARE) $(SYSDEP_LD) $(EXTRA_LD_PATH) $(PROFILE_FLAGS) $(CFLAGS)
+CCFLAGS        = $(PROFILE_FLAGS) $(SYSTEM_FLAGS) -DSHELL $(ALLOCA_CFLAGS) \
+         $(MALLOC_CFLAGS) $(CFLAGS)
+CPPFLAGS= -I. -I$(srcdir) -I$(LIBSRC) -I$(incdir)
+GCC_LINT_FLAGS = -ansi -Wall -Wshadow -Wpointer-arith -Wcast-qual \
+                -Wwrite-strings -Werror -Wstrict-prototypes \
+                -Wmissing-prototypes
+GCC_LINT_CFLAGS = $(CCFLAGS) $(GCC_LINT_FLAGS)
+
+/* It is conceivable that you wish to edit some things beyond this point,
+   but I guess that it is highly unlikely, and may give you a headache. */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                 How to Build the support libraries.             */
+/*                                                                 */
+/* **************************************************************** */
+
+/**/# The location of sources for the support libraries.
+LIBPATH = ./lib/
+LIBSRC = $(srcdir)/$(LIBPATH)
+
+/**/# Preface building with the full path of the current library source.
+LIBINC_DECL  = topdir=`sh $(srcdir)/support/srcdir $(srcdir)`; export topdir
+LIBINC_USAGE = "-I$${topdir} -I$${topdir}/$(LIBPATH) -I$(LIBSRC)"
+
+/* Defines used when building libraries. */
+#define LIBMAKE_FLAGS CFLAGS='$(LIBRARY_CFLAGS) '$(LIBINC_USAGE) \
+       CPPFLAGS='$(CPPFLAGS)' LDFLAGS='$(LDFLAGS)' \
+       RANLIB='$(RANLIB)' AR='$(AR)' CC='$(CC)' RM='$(RM)' \
+
+/**/# Flags used when building libraries.
+LIBRARY_CFLAGS  = $(PROFILE_FLAGS) $(CFLAGS) $(SIGHANDLER) $(ALLOCA_CFLAGS) \
+                 $(SYSDEP) $(DIRENT) $(DIRENTH) $(STRINGH) $(VARARGSH) \
+                 $(PTEM) $(PTE) $(STREAM) $(STRERROR) $(RESOURCE) \
+                 $(STRCHR) -D$(Machine) -D$(OS) $(UNISTD) $(LIMITSH) \
+                 $(STRCASE) $(STDLIB) -DSHELL
+
+/* Macro used to build a library. */
+#define build_lib_in_dir(directory, target, srcdef, makefile) \
+       @echo "Building in " directory "..."; \
+       sh $(SUPPORT_SRC)mkdirs directory ; \
+       ($(LIBINC_DECL); cd directory; \
+        if [ ! -f Makefile ]; then cp makefile Makefile; fi; \
+        $(MAKE) target $(MFLAGS) LIBMAKE_FLAGS srcdef)
+
+BUILTIN_CFLAGS = $(CCFLAGS)
+BUILTIN_LIBFLAGS = "-I. -I$${topdir} -I$${topdir}/$(LIBPATH) -I$(incdir)"
+
+/* The builtins are somewhat special in that more information is needed
+   to compile them correctly. */
+#define build_builtins(target) \
+       @sh $(SUPPORT_SRC)mkdirs $(DEFDIR) ; \
+       ($(LIBINC_DECL); cd $(DEFDIR); \
+        if [ ! -f Makefile ]; then \
+               cp $(BUILTIN_ABSSRC)/Makefile Makefile; \
+        fi; \
+        $(MAKE) $(MFLAGS) target \
+        srcdir=$(BUILTIN_ABSSRC) CPPFLAGS='' \
+        CFLAGS='$(CCFLAGS) -I$(BUILTIN_ABSSRC) '$(BUILTIN_LIBFLAGS) \
+        LDFLAGS='$(LDFLAGS)' RANLIB='$(RANLIB)' AR='$(AR)' CC='$(CC)' \
+        RM='$(RM)' RL_LIBSRC='$(RL_ABSSRC)' \
+        DIRECTDEFINE='-D '$(BUILTIN_SRCDIR))
+
+/**/# The name of this program.
+Program = bash
+
+/* **************************************************************** */
+/*                                                                  */
+/*                 Support for desired libraries.                   */
+/*    This includes Termcap, Glob, Tilde, History, and Readline.    */
+/*                                                                  */
+/* **************************************************************** */
+
+/* Does this machine's linker need a space after -L? */
+#if defined (HAVE_GCC)
+#  undef SEARCH_LIB_NEEDS_SPACE
+#endif /* HAVE_GCC */
+
+#if defined (SEARCH_LIB_NEEDS_SPACE)
+/**/# The native compiler for this machines requires a space after '-L'.
+SEARCH_LIB = -L $(UNSET_VARIABLE_CREATES_SPACE)
+#else
+/**/# The compiler being used to build Bash can handle -L/library/path.
+SEARCH_LIB = -L
+#endif /* !SEARCH_LIB_NEEDS_SPACE */
+
+#if defined (EXTRA_LIB_SEARCH_PATH)
+/**/# Additional instructions to the linker telling it how to find libraries.
+LOCAL_LD_PATH = EXTRA_LIB_SEARCH_PATH
+EXTRA_LD_PATH = $(SEARCH_LIB)$(LOCAL_LD_PATH)
+#endif /* EXTRA_LIB_SEARCH_PATH */
+
+/* Right now we assume that you have the full source code to Bash.  If
+   you simply have the library and header files installed, then
+   undefine HAVE_READLINE_SOURCE. */
+#define HAVE_READLINE_SOURCE
+
+#if defined (HAVE_READLINE_SOURCE)
+
+RL_LIBSRC = $(LIBSRC)readline/
+RL_LIBDOC = $(RL_LIBSRC)doc/
+RL_LIBDIR = $(LIBPATH)readline/
+RL_ABSSRC = $${topdir}/$(RL_LIBDIR)
+
+READLINE_LIBRARY = $(RL_LIBDIR)libreadline.a
+
+/**/# The source, object and documentation of the GNU Readline library.
+READLINE_SOURCE        = $(RL_LIBSRC)rldefs.h $(RL_LIBSRC)rlconf.h \
+                 $(RL_LIBSRC)readline.h \
+                 $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)keymaps.h \
+                 $(RL_LIBSRC)history.h $(RL_LIBSRC)histlib.h \
+                 $(RL_LIBSRC)posixstat.h $(RL_LIBSRC)tilde.h \
+                 $(RL_LIBSRC)funmap.c $(RL_LIBSRC)emacs_keymap.c \
+                 $(RL_LIBSRC)search.c $(RL_LIBSRC)vi_keymap.c \
+                 $(RL_LIBSRC)keymaps.c $(RL_LIBSRC)parens.c \
+                 $(RL_LIBSRC)vi_mode.c $(RL_LIBSRC)callback.c \
+                 $(RL_LIBSRC)readline.c $(RL_LIBSRC)tilde.c \
+                 $(RL_LIBSRC)rltty.c $(RL_LIBSRC)complete.c \
+                 $(RL_LIBSRC)bind.c $(RL_LIBSRC)isearch.c \
+                 $(RL_LIBSRC)display.c $(RL_LIBSRC)signals.c \
+                 $(RL_LIBSRC)util.c $(RL_LIBSRC)kill.c \
+                 $(RL_LIBSRC)undo.c $(RL_LIBSRC)macro.c \
+                 $(RL_LIBSRC)input.c $(RL_LIBSRC)xmalloc.c \
+                 $(RL_LIBSRC)histexpand.c $(RL_LIBSRC)history.c \
+                 $(RL_LIBSRC)histsearch.c $(RL_LIBSRC)histfile.c
+       
+READLINE_OBJ   = $(RL_LIBDIR)readline.o $(RL_LIBDIR)funmap.o \
+                 $(RL_LIBDIR)parens.o $(RL_LIBDIR)search.o \
+                 $(RL_LIBDIR)keymaps.o $(RL_LIBDIR)xmalloc.o \
+                 $(RL_LIBDIR)rltty.o $(RL_LIBDIR)complete.o \
+                 $(RL_LIBDIR)bind.o $(RL_LIBDIR)isearch.o \
+                 $(RL_LIBDIR)display.o $(RL_LIBDIR)signals.o \
+                 $(RL_LIBDIR)tilde.o $(RL_LIBDIR)util.o \
+                 $(RL_LIBDIR)kill.o $(RL_LIBDIR)undo.o \
+                 $(RL_LIBDIR)macro.o $(RL_LIBDIR)input.o \
+                 $(RL_LIBDIR)callback.o \
+                 $(RL_LIBDIR)history.o $(RL_LIBDIR)histexpand.o \
+                 $(RL_LIBDIR)histsearch.o $(RL_LIBDIR)histfile.o
+
+READLINE_DOC   = $(RL_LIBDOC)rlman.texinfo $(RL_LIBDOC)rluser.texinfo \
+                 $(RL_LIBDOC)rltech.texinfo
+
+READLINE_DOC_SUPPORT  = $(RL_LIBDOC)Makefile $(RL_LIBDOC)readline.dvi \
+                 $(RL_LIBDOC)readline.info
+
+/**/# This has to be written funny to avoid looking like a C comment starter.
+READLINE_EXAMPLES = $(RL_LIBSRC)examples/[a-zA-Z]*.[ch] \
+                   $(RL_LIBSRC)examples/Makefile $(RL_LIBSRC)examples/Inputrc
+
+/**/# Support files for GNU Readline.
+READLINE_SUPPORT = $(RL_LIBSRC)Makefile $(RL_LIBSRC)ChangeLog \
+                  $(RL_LIBSRC)COPYING $(READLINE_EXAMPLES) \
+                  $(READLINE_DOC_SUPPORT)
+
+#else /* !HAVE_READLINE_SOURCE */
+
+#  if defined (READLINE)
+READLINE_LIBRARY = -lreadline
+#  endif /* READLINE */
+RL_LIBDIR = $(srcdir)/$(LIBSRC)readline/
+
+#endif /* !HAVE_READLINE_SOURCE */
+
+#if defined (READLINE)
+/**/# You wish to compile with the line editing features installed.
+READLINE_LIB = -lreadline
+
+/**/# You only need termcap (or curses) if you are linking with GNU Readline.
+#  if defined (USE_TERMCAP_EMULATION)
+TERMCAP_LIB = -lcurses
+#  else  /* !USE_TERMCAP_EMULATION */
+TERMCAP_LIB = -ltermcap
+#  endif /* !USE_TERMCAP_EMULATION */
+
+/**/# Directory list for -L so that the link editor (ld) can find -lreadline.
+#  if !defined (LD_HAS_NO_DASH_L)
+#    if defined (HAVE_READLINE_SOURCE)
+READLINE_LDFLAGS = $(SEARCH_LIB)$(RL_LIBDIR) $(TERMCAP_LDFLAGS)
+#    else
+READLINE_LDFLAGS = $(TERMCAP_LDFLAGS) $(SEARCH_LIB)$(libdir) \
+                  $(SEARCH_LIB)/usr/local/lib
+#    endif /* HAVE_READLINE_SOURCE */
+#  endif /* LD_HAS_NO_DASH_L */
+#endif /* READLINE */
+
+/* Right now we assume that you have the full source code to Bash,
+   including the source code to the history library.  If you only have
+   the library and header files installed, then you can undefine
+   HAVE_HISTORY_SOURCE. */
+#define HAVE_HISTORY_SOURCE
+
+#  if defined (HISTORY) && !defined (READLINE)
+/**/# You are compiling with history features but without line editing.
+HISTORY_LIB = -lhistory
+#  endif /* HISTORY && !READLINE */
+
+#if defined (HAVE_HISTORY_SOURCE)
+
+HIST_LIBSRC = $(LIBSRC)readline/
+HIST_LIBDOC = $(HIST_LIBSRC)doc/
+HIST_LIBDIR = $(LIBPATH)readline/
+HIST_ABSSRC = $${topdir}/$(HIST_LIBDIR)/
+
+/* If you are building with readline, then you do not explicitly need the
+   history library. */
+#  if defined (READLINE)
+HISTORY_LIBRARY = 
+#  else
+HISTORY_LIBRARY = $(HIST_LIBDIR)libhistory.a
+#  endif /* !READLINE */
+
+/**/# The source, object and documentation of the history library.
+HISTORY_SOURCE = $(HIST_LIBSRC)history.c $(HIST_LIBSRC)histexpand.c \
+                 $(HIST_LIBSRC)histsearch.c $(HIST_LIBSRC)histfile.c \
+                 $(HIST_LIBSRC)history.h $(HIST_LIBSRC)histlib.h
+HISTORY_OBJ    = $(HIST_LIBDIR)history.o $(HIST_LIBDIR)histexpand.o \
+                 $(HIST_LIBDIR)histsearch.o $(HIST_LIBDIR)histfile.o
+HISTORY_DOC    = $(HIST_LIBDOC)hist.texinfo $(HIST_LIBDOC)hsuser.texinfo \
+                 $(HIST_LIBDOC)hstech.texinfo
+
+/**/# Directory list for -L so that the link editor (ld) can find -lhistory.
+#  if defined (HISTORY) && !defined (READLINE)
+#    if !defined (LD_HAS_NO_DASH_L)
+HISTORY_LDFLAGS = $(SEARCH_LIB)$(HIST_LIBDIR)
+#    endif /* LD_HAS_NO_DASH_L */
+#  endif /* HISTORY && !READLINE */
+#else /* !HAVE_HISTORY_SOURCE */
+#  if defined (HISTORY) && !defined (READLINE)
+HISTORY_LIBRARY = -lhistory
+HISTORY_LDFLAGS = $(SEARCH_LIB)$(libdir) $(SEARCH_LIB)/usr/local/lib
+#  endif /* HISTORY && !READLINE */
+#endif /* !HAVE_HISTORY_SOURCE */
+
+#if defined (USE_GNU_TERMCAP)
+#  define HAVE_TERMCAP_SOURCE
+TERM_LIBSRC = $(LIBSRC)termcap/
+TERM_LIBDIR = $(LIBPATH)termcap/
+TERM_ABSSRC = $${topdir}/$(TERM_LIBDIR)
+
+/**/# The source, object and documentation for the GNU Termcap library.
+TERMCAP_LIBRARY = $(TERM_LIBDIR)libtermcap.a
+
+TERMCAP_SOURCE = $(TERM_LIBSRC)termcap.c $(TERM_LIBSRC)tparam.c
+TERMCAP_OBJ    = $(TERM_LIBDIR)termcap.o $(TERM_LIBDIR)tparam.o
+TERMCAP_DOC    = $(TERM_LIBSRC)termcap.texinfo
+TERMCAP_SUPPORT = $(TERM_LIBSRC)Makefile $(TERM_LIBSRC)ChangeLog
+
+#  if !defined (LD_HAS_NO_DASH_L)
+TERMCAP_LDFLAGS = $(SEARCH_LIB)$(TERM_LIBDIR)
+#  endif /* !LD_HAS_NO_DASH_L */
+#else /* !USE_GNU_TERMCAP */
+
+/* Guessed at symbol for LIBRARIES, below. */
+#  if defined (USE_TERMCAP_EMULATION)
+TERMCAP_LIBRARY = -lcurses
+#  else /* !USE_TERMCAP_EMULATION */
+TERMCAP_LIBRARY = -ltermcap
+#  endif /* !USE_TERMCAP_EMULATION */
+#endif /* !USE_GNU_TERMCAP */
+
+/* The glob library is always used. */
+#define USE_GLOB_LIBRARY
+
+#if defined (USE_GLOB_LIBRARY)
+GLOB_LIBSRC = $(LIBSRC)glob/
+GLOB_LIBDIR = $(LIBPATH)glob/
+GLOB_ABSSRC = $${topdir}/$(GLOB_LIBDIR)
+
+GLOB_LIBRARY = $(GLOB_LIBDIR)libglob.a
+
+GLOB_SOURCE = $(GLOB_LIBSRC)glob.c $(GLOB_LIBSRC)fnmatch.c \
+             $(GLOB_LIBSRC)glob.h $(GLOB_LIBSRC)fnmatch.h
+GLOB_OBJ    = $(GLOB_LIBDIR)glob.o $(GLOB_LIBDIR)fnmatch.o
+GLOB_DOC    = $(GLOB_LIBSRC)doc/glob.texi $(GLOB_LIBSRC)doc/Makefile
+GLOB_SUPPORT= $(GLOB_LIBSRC)Makefile $(GLOB_LIBSRC)ChangeLog
+
+#  if !defined (LD_HAS_NO_DASH_L)
+GLOB_LDFLAGS = $(SEARCH_LIB)$(GLOB_LIBDIR)
+#  endif /* !LD_HAS_NO_DASH_L */
+GLOB_LIB     = -lglob
+#endif /* USE_GLOB_LIBRARY */
+
+/* The source code for the tilde expansion library. */
+#if defined (HAVE_READLINE_SOURCE)
+#  define HAVE_TILDE_SOURCE
+#endif /* HAVE_READLINE_SOURCE */
+
+#if defined (HAVE_TILDE_SOURCE)
+/**/# The source, object and documentation for the GNU Tilde library.
+TILDE_LIBSRC = $(LIBSRC)tilde/
+TILDE_LIBDIR = $(LIBPATH)tilde/
+TILDE_ABSSRC = $${topdir}/$(TILDE_LIBDIR)
+
+TILDE_LIBRARY = $(TILDE_LIBDIR)libtilde.a
+
+TILDE_SOURCE   = $(TILDE_LIBSRC)tilde.c $(TILDE_LIBSRC)tilde.h
+TILDE_OBJ      = $(TILDE_LIBDIR)tilde.o
+TILDE_DOC      = $(TILDE_LIBSRC)doc/tilde.texi $(TILDE_LIBSRC)doc/Makefile
+TILDE_SUPPORT  = $(TILDE_LIBSRC)Makefile $(TILDE_LIBSRC)ChangeLog
+
+TILDE_LIB = -ltilde
+
+#  if !defined (LD_HAS_NO_DASH_L)
+TILDE_LDFLAGS = $(SEARCH_LIB)$(TILDE_LIBDIR)
+#  endif /* !LD_HAS_NO_DASH_L */
+
+#else /* !HAVE_TILDE_SOURCE */
+/**/# Guessed at location of the tilde 
+TILDE_LIBRARY = $(libdir)/libtilde.a
+#endif /* !HAVE_TILDE_SOURCE */
+
+/**/# The directory which contains the source for malloc.  The name must
+/**/# end in a slash, as in "./lib/malloc/".
+ALLOC_LIBSRC = $(LIBSRC)malloc/
+ALLOC_LIBDIR = $(LIBPATH)malloc/
+ALLOC_ABSSRC = $${topdir}/$(ALLOC_LIBDIR)
+
+/**/# Our malloc.
+#if defined (USE_GNU_MALLOC)
+
+MALLOC_OBJ = $(ALLOC_LIBDIR)malloc.o
+MALLOC_SRC = $(ALLOC_LIBSRC)malloc.c
+MALLOC_FLAGS = -Drcheck -Dbotch=programming_error
+
+MALLOC_LIBRARY = $(ALLOC_LIBDIR)libmalloc.a
+
+#  if !defined (LD_HAS_NO_DASH_L)
+MALLOC_LDFLAGS = $(SEARCH_LIB)$(ALLOC_LIBDIR)
+#  endif /* !LD_HAS_NO_DASH_L */
+MALLOC_LIB     = -lmalloc
+
+MALLOC_DEP = $(MALLOC_LIBRARY)
+#endif /* USE_GNU_MALLOC */
+
+/* If this user doesn't have alloca (), then we must try to supply them
+   with a working one. */
+#if !defined (HAVE_ALLOCA)
+ALLOCA = alloca.o
+#  if defined (ALLOCA_ASM)
+ALLOCA_SOURCE = ALLOCA_ASM
+ALLOCA_OBJECT = ALLOCA_OBJ
+#  else
+ALLOCA_SOURCE = alloca.c
+ALLOCA_OBJECT = alloca.o
+#  endif /* ALLOCA_ASM */
+ALLOCA_DEP = $(ALLOC_LIBSRC)$(ALLOCA_SOURCE)
+#endif /* !HAVE_ALLOCA */
+
+/* Protect the `i386' used in the definition of ALLOC_FILES. */
+#if defined (i386)
+#  undef i386
+#  define i386_defined
+#endif /* i386 */
+
+ALLOC_HEADERS = $(ALLOC_LIBSRC)getpagesize.h
+ALLOC_FILES = $(ALLOC_LIBSRC)malloc.c $(ALLOC_LIBSRC)alloca.c \
+             $(ALLOC_LIBSRC)i386-alloca.s $(ALLOC_LIBSRC)x386-alloca.s \
+             $(ALLOC_LIBSRC)xmalloc.c
+
+/* Perhaps restore the `i386' define. */
+#if defined (i386_defined)
+#  define i386
+#  undef i386_defined
+#endif /* i386_defined */
+
+#if defined (USE_GNU_MALLOC)
+$(ALLOC_LIBDIR)libmalloc.a: $(MALLOC_SRC) $(ALLOCA_DEP)
+               @sh $(SUPPORT_SRC)mkdirs $(ALLOC_LIBDIR)
+               @$(RM) $@
+               @($(LIBINC_DECL); cd $(ALLOC_LIBDIR) ; \
+                if [ ! -f Makefile ]; then cp $(ALLOC_ABSSRC)Makefile Makefile ; fi; \
+                $(MAKE) $(MFLAGS) CC=$(CC) \
+                CFLAGS='$(LIBRARY_CFLAGS) $(MALLOC_FLAGS)' \
+                CPPFLAGS='$(CPPFLAGS)' MALLOC_SOURCE=$(MALLOC_SRC) \
+                ALLOCA=$(ALLOCA) RANLIB=$(RANLIB) \
+                ALLOCA_SOURCE=$(ALLOCA_SOURCE) \
+                ALLOCA_OBJECT=$(ALLOCA_OBJECT) \
+                srcdir=$(ALLOC_ABSSRC) libmalloc.a )
+#endif /* USE_GNU_MALLOC */
+
+BASHPOSIX_LIB     = $(LIBSRC)posixheaders/
+BASHPOSIX_SUPPORT = $(BASHPOSIX_LIB)posixstat.h $(BASHPOSIX_LIB)ansi_stdlib.h \
+                   $(BASHPOSIX_LIB)memalloc.h $(BASHPOSIX_LIB)stdc.h
+
+/**/# Declare all of the sources for the libraries that we have.
+LIBRARY_SOURCE  = $(READLINE_SOURCE) $(HISTORY_SOURCE) $(TERMCAP_SOURCE) \
+                 $(GLOB_SOURCE) $(TILDE_SOURCE) $(MALLOC_SOURCE)
+LIBRARY_DOC    = $(READLINE_DOC) $(HISTORY_DOC) $(TERMCAP_DOC) $(GLOB_DOC) \
+                 $(TILDE_DOC) $(MALLOC_DOC)
+LIBRARY_SUPPORT = $(READLINE_SUPPORT) $(HISTORY_SUPPORT) $(TERMCAP_SUPPORT) \
+                 $(GLOB_SUPPORT) $(TILDE_SUPPORT) $(MALLOC_SUPPORT)
+LIBRARY_TAR     = $(LIBRARY_SOURCE) $(LIBRARY_DOC) $(LIBRARY_SUPPORT)
+
+/**/# The order is important.  Most dependent first.
+#if defined (LD_HAS_NO_DASH_L)
+/**/# This linker does not know how to grok the -l flag, or perhaps how
+/**/# to grok the -L flag, or both.
+LIBRARIES = $(READLINE_LIBRARY) $(HISTORY_LIBRARY) $(TERMCAP_LIBRARY) \
+           $(GLOB_LIBRARY) $(TILDE_LIBRARY) $(MALLOC_LIBRARY) $(LOCAL_LIBS)
+#else /* !LD_HAS_NO_DASH_L */
+LIBRARIES = $(READLINE_LIB) $(HISTORY_LIB) $(TERMCAP_LIB) $(GLOB_LIB) \
+           $(TILDE_LIB) $(MALLOC_LIB) $(LOCAL_LIBS)
+#endif /* !LD_HAS_NO_DASH_L */
+
+#if defined (READLINE)
+#  if defined (HAVE_TERMCAP_SOURCE)
+TERMCAP_DEP = $(TERMCAP_LIBRARY)
+#  endif /* HAVE_TERMCAP_SOURCE */
+#  if defined (HAVE_READLINE_SOURCE)
+READLINE_DEP = $(READLINE_LIBRARY)
+#  endif /* HAVE_READLINE_SOURCE */
+#endif /* READLINE */
+
+#if defined (HISTORY) && defined (HAVE_HISTORY_SOURCE) && !defined (READLINE)
+HISTORY_DEP = $(HISTORY_LIBRARY)
+#endif
+
+#if defined (USE_GLOB_LIBRARY)
+GLOB_DEP = $(GLOB_LIBRARY)
+#else
+GLOBC = glob.c fnmatch.c
+GLOBO = glob.o fnmatch.o
+#endif /* USE_GLOB_LIBRARY */
+
+#if defined (HAVE_TILDE_SOURCE)
+TILDE_DEP = $(TILDE_LIBRARY)
+#endif
+
+/**/# Source files for libraries that Bash depends on.
+LIBDEP = $(READLINE_DEP) $(TERMCAP_DEP) $(GLOB_DEP) $(HISTORY_DEP) \
+        $(TILDE_DEP) $(MALLOC_DEP)
+
+/**/# Rules for cleaning the readline and termcap sources.
+#if defined (HAVE_READLINE_SOURCE)
+CLEAN_READLINE = (cd $(RL_LIBDIR); $(MAKE) $(MFLAGS) clean)
+#else
+CLEAN_READLINE = :
+#endif /* !HAVE_READLINE_SOURCE */
+
+#if defined (HAVE_HISTORY_SOURCE)
+#  if !defined (READLINE)
+CLEAN_HISTORY = (cd $(HIST_LIBDIR); $(MAKE) $(MFLAGS) clean)
+#  else
+CLEAN_HISTORY = :
+#  endif /* READLINE */
+#endif /* !HAVE_HISTORY_SOURCE */
+
+#if defined (HAVE_TERMCAP_SOURCE)
+CLEAN_TERMCAP = (cd $(TERM_LIBDIR); $(MAKE) $(MFLAGS) clean)
+#else
+CLEAN_TERMCAP = :
+#endif /* !HAVE_TERMCAP_SOURCE */
+
+#if defined (USE_GLOB_LIBRARY)
+CLEAN_GLOB = (cd $(GLOB_LIBDIR); $(MAKE) $(MFLAGS) clean)
+#else
+CLEAN_GLOB = :
+#endif /* !USE_GLOB_LIBRARY */
+
+#if defined (HAVE_TILDE_SOURCE)
+CLEAN_TILDE = (cd $(TILDE_LIBDIR); $(MAKE) $(MFLAGS) clean)
+#else
+CLEAN_TILDE = :
+#endif /* !HAVE_TILDE_SOURCE */
+
+CLEAN_MALLOC = (cd $(MALLOC_LIBDIR); $(MAKE) $(MFLAGS) clean)
+
+LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(TILDE_LDFLAGS) \
+                 $(GLOB_LDFLAGS) $(MALLOC_LDFLAGS)
+
+#if defined (REQUIRED_LIBRARIES)
+/**/# Locally required libraries.
+LOCAL_LIBS = REQUIRED_LIBRARIES
+#endif /* REQUIRED_LIBRARIES */
+
+BUILTINS_LIB = builtins/libbuiltins.a
+
+/**/# The main source code for the Bourne Again SHell.
+CSOURCES = shell.c parse.y general.c make_cmd.c print_cmd.c y.tab.c \
+          dispose_cmd.c execute_cmd.c variables.c $(GLOBC) version.c \
+          expr.c copy_cmd.c flags.c subst.c hash.c mailcheck.c \
+          test.c trap.c jobs.c nojobs.c $(ALLOC_FILES) braces.c \
+          vprint.c input.c bashhist.c array.c sig.c \
+          unwind_prot.c siglist.c getcwd.c $(RL_SUPPORT_SRC) error.c
+
+HSOURCES = shell.h flags.h trap.h hash.h jobs.h builtins.h alias.c y.tab.h \
+          general.h variables.h config.h $(ALLOC_HEADERS) alias.h maxpath.h \
+          quit.h machines.h posixstat.h filecntl.h unwind_prot.h parser.h \
+          command.h input.h error.h bashansi.h dispose_cmd.h make_cmd.h \
+          subst.h externs.h siglist.h bashhist.h bashline.h bashtypes.h \
+          array.h sig.h mailcheck.h
+
+SOURCES         = $(CSOURCES) $(HSOURCES) $(BUILTIN_DEFS)
+
+/**/# Matching object files.
+OBJECTS         = shell.o y.tab.o general.o make_cmd.o print_cmd.o $(GLOBO) \
+          dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o \
+          expr.o flags.o jobs.o subst.o hash.o mailcheck.o test.o \
+          trap.o input.o unwind_prot.o sig.o version.o \
+          alias.o array.o braces.o bracecomp.o bashhist.o bashline.o \
+          getcwd.o siglist.o vprint.o \
+          $(BUILTINS_LIB)
+
+/**/# Where the source code of the shell builtins resides.
+BUILTIN_SRCDIR=$(srcdir)/builtins/
+DEFSRC=$(BUILTIN_SRCDIR)
+/**/# The trailing slash was left off this definition on purpose
+BUILTIN_ABSSRC=$${topdir}/builtins
+DEFDIR = builtins/
+BUILTIN_DEFS = $(DEFSRC)alias.def $(DEFSRC)bind.def $(DEFSRC)break.def \
+              $(DEFSRC)builtin.def $(DEFSRC)cd.def $(DEFSRC)colon.def \
+              $(DEFSRC)command.def $(DEFSRC)declare.def \
+              $(DEFSRC)echo.def $(DEFSRC)enable.def $(DEFSRC)eval.def \
+              $(DEFSRC)exec.def $(DEFSRC)exit.def $(DEFSRC)fc.def \
+              $(DEFSRC)fg_bg.def $(DEFSRC)hash.def $(DEFSRC)help.def \
+              $(DEFSRC)history.def $(DEFSRC)jobs.def $(DEFSRC)kill.def \
+              $(DEFSRC)let.def $(DEFSRC)read.def $(DEFSRC)return.def \
+              $(DEFSRC)set.def $(DEFSRC)setattr.def $(DEFSRC)shift.def \
+              $(DEFSRC)source.def $(DEFSRC)suspend.def $(DEFSRC)test.def \
+              $(DEFSRC)times.def $(DEFSRC)trap.def $(DEFSRC)type.def \
+              $(DEFSRC)ulimit.def $(DEFSRC)umask.def $(DEFSRC)wait.def \
+              $(DEFSRC)getopts.def $(DEFSRC)reserved.def $(DEFSRC)pushd.def \
+              $(DEFSRC)shopt.def
+BUILTIN_C_SRC  = $(DEFSRC)mkbuiltins.c $(DEFSRC)common.c \
+                 $(DEFSRC)hashcom.h $(DEFSRC)/bashgetopt.c $(GETOPT_SOURCE)
+BUILTIN_C_OBJ  = $(DEFDIR)common.o $(DEFDIR)bashgetopt.o
+BUILTIN_OBJS = $(DEFDIR)alias.o $(DEFDIR)bind.o $(DEFDIR)break.o \
+              $(DEFDIR)builtin.o $(DEFDIR)cd.o $(DEFDIR)colon.o \
+              $(DEFDIR)command.o $(DEFDIR)declare.o \
+              $(DEFDIR)echo.o $(DEFDIR)enable.o $(DEFDIR)eval.o \
+              $(DEFDIR)exec.o $(DEFDIR)exit.o $(DEFDIR)fc.o \
+              $(DEFDIR)fg_bg.o $(DEFDIR)hash.o $(DEFDIR)help.o \
+              $(DEFDIR)history.o $(DEFDIR)jobs.o $(DEFDIR)kill.o \
+              $(DEFDIR)let.o $(DEFDIR)pushd.o $(DEFDIR)read.o \
+              $(DEFDIR)return.o $(DEFDIR)shopt.o \
+              $(DEFDIR)set.o $(DEFDIR)setattr.o $(DEFDIR)shift.o \
+              $(DEFDIR)source.o $(DEFDIR)suspend.o $(DEFDIR)test.o \
+              $(DEFDIR)times.o $(DEFDIR)trap.o $(DEFDIR)type.o \
+              $(DEFDIR)ulimit.o $(DEFDIR)umask.o $(DEFDIR)wait.o \
+              $(DEFDIR)getopts.o $(BUILTIN_C_OBJ)
+GETOPT_SOURCE   = $(DEFSRC)getopt.c $(DEFSRC)getopt.h
+PSIZE_SOURCE   = $(DEFSRC)psize.sh $(DEFSRC)psize.c
+BUILTIN_SUPPORT = $(DEFSRC)Makefile $(PSIZE_SOURCE) $(BUILTIN_C_SRC)
+
+/**/# Documentation for the shell.
+DOCDIR = $(srcdir)/documentation/
+
+ENDIAN_SUPPORT = $(SUPPORT_SRC)endian.c
+#if !defined (HAVE_WAIT_H)
+ENDIAN_HEADER = bash_endian.h
+#endif
+
+SIGNAMES_SUPPORT = $(SUPPORT_SRC)mksignames.c
+
+SUPPORT_SRC = $(srcdir)/support/
+SDIR = ./support/
+EXAMPLES = ./examples/
+TEST_SUITE = ./test-suite/
+
+CREATED_SUPPORT = bash_endian.h signames.h sysdefs.h \
+                 $(SDIR)getcppsyms recho tests/recho
+
+/**/# Keep GNU Make from exporting the entire environment for small machines.
+.NOEXPORT:
+
+.made: $(Program) bashbug
+       cp .machine .made
+
+$(Program):  .build $(OBJECTS) $(LIBDEP) $(srcdir)/.distribution
+       $(RM) $@
+       $(PURIFY) $(CC) $(LDFLAGS) $(LIBRARY_LDFLAGS) -o $(Program) $(OBJECTS) $(LIBRARIES)
+       ls -l $(Program)
+       size $(Program)
+
+.build:        $(SOURCES) cpp-Makefile mkversion
+       if ./mkversion -dir $(srcdir) -build; then mv -f newversion.h version.h; fi
+       @echo
+       @echo "   ***************************************************"
+       @echo "   *                                                 *"
+       @echo "   * Making Bash-`cat $(srcdir)/.distribution`.`cat $(srcdir)/.patchlevel` for a $(Machine) running $(OS)"
+       @echo "   *                                                 *"
+       @echo "   ***************************************************"
+       @echo
+       @echo "$(Program) last made for a $(Machine) running $(OS)" >.machine
+
+bashbug: $(SUPPORT_SRC)bashbug.sh cpp-Makefile mkversion
+       @sed -e "s:@MACHINE@:$(Machine):" -e "s:@OS@:$(OS):" \
+            -e "s:@CFLAGS@:$(CCFLAGS):" -e "s:@CC@:$(CC):" \
+            -e "s:@RELEASE@:`cat $(srcdir)/.distribution`:" \
+            -e "s:@PATCHLEVEL@:`cat $(srcdir)/.patchlevel`:" \
+            $(SUPPORT_SRC)bashbug.sh > $@
+       @chmod a+rx bashbug
+
+version.h:     mkversion
+       if ./mkversion -dir $(srcdir) -build; then mv -f newversion.h version.h; fi
+
+y.tab.c: parser-built
+y.tab.h: parser-built
+parser-built:  parse.y parser.h command.h stdc.h input.h
+       $(RM) $@
+       -if test -f y.tab.h; then mv -f y.tab.h old-y.tab.h; fi
+       $(YACC) -d $(srcdir)/parse.y
+       -if cmp -s old-y.tab.h y.tab.h; then mv old-y.tab.h y.tab.h; fi
+       touch $@
+
+#if defined (READLINE) && defined (HAVE_READLINE_SOURCE)
+$(READLINE_LIBRARY): $(READLINE_SOURCE)
+       build_lib_in_dir ($(RL_LIBDIR), libreadline.a, srcdir=$(RL_ABSSRC), $(RL_ABSSRC)Makefile)
+#endif /* READLINE && HAVE_READLINE_SOURCE */
+
+#if defined (HISTORY) && defined (HAVE_HISTORY_SOURCE) && !defined (READLINE)
+$(HISTORY_LIBRARY): $(HISTORY_SOURCE)
+       build_lib_in_dir ($(HIST_LIBDIR), libhistory.a, srcdir=$(HIST_ABSSRC), $(HIST_ABSSRC)Makefile)
+#endif /* HISTORY && HAVE_HISTORY_SOURCE && !READLINE */
+
+#if defined (HAVE_TERMCAP_SOURCE)
+$(TERMCAP_LIBRARY): $(TERMCAP_SOURCE)
+       build_lib_in_dir ($(TERM_LIBDIR), libtermcap.a, srcdir=$(TERM_ABSSRC), $(TERM_ABSSRC)Makefile)
+#endif /* HAVE_TERMCAP_SOURCE */
+
+#if defined (USE_GLOB_LIBRARY)
+$(GLOB_LIBRARY): $(GLOB_SOURCE)
+       build_lib_in_dir ($(GLOB_LIBDIR), libglob.a, srcdir=$(GLOB_ABSSRC), $(GLOB_ABSSRC)Makefile)
+#endif /* USE_GLOB_LIBRARY */
+
+#if defined (HAVE_TILDE_SOURCE)
+$(TILDE_LIBRARY): $(TILDE_SOURCE)
+       build_lib_in_dir ($(TILDE_LIBDIR), libtilde.a, srcdir=$(TILDE_ABSSRC), $(TILDE_ABSSRC)Makefile)
+#endif /* HAVE_TILDE_SOURCE */
+
+mkendian:      $(SUPPORT_SRC)endian.c
+       $(CC) $(CCFLAGS) $(CPPFLAGS) -o $@ $(SUPPORT_SRC)endian.c
+
+bash_endian.h:     mkendian
+       $(RM) $@
+       ./mkendian $@
+
+mksignames:    $(SUPPORT_SRC)mksignames.c
+               $(CC) $(CCFLAGS) $(CPPFLAGS) -o $@ $(SUPPORT_SRC)mksignames.c
+
+signames.h:   mksignames
+       $(RM) $@
+       ./mksignames $@
+
+builtins/libbuiltins.a: $(BUILTIN_OBJS) config.h memalloc.h
+       build_builtins (libbuiltins.a)
+
+builtins/common.o:     $(BUILTIN_SRCDIR)common.c
+       build_builtins (common.o)
+builtins/bashgetopt.o: $(BUILTIN_SRCDIR)bashgetopt.c
+       build_builtins (bashgetopt.o)
+
+builtins/builtext.h: builtins/libbuiltins.a
+
+/* Dependencies for the main bash source. */
+copy_cmd.o: shell.h sig.h command.h stdc.h hash.h
+copy_cmd.o: general.h variables.h config.h memalloc.h quit.h
+copy_cmd.o: dispose_cmd.h make_cmd.h subst.h externs.h
+dispose_cmd.o: shell.h sig.h command.h stdc.h
+dispose_cmd.o: general.h variables.h config.h memalloc.h quit.h
+dispose_cmd.o: dispose_cmd.h make_cmd.h subst.h externs.h
+error.o: error.h
+execute_cmd.o: shell.h sig.h command.h stdc.h y.tab.h posixstat.h flags.h jobs.h
+execute_cmd.o: general.h variables.h config.h memalloc.h quit.h hash.h
+execute_cmd.o: unwind_prot.h siglist.h builtins/builtext.h 
+execute_cmd.o: dispose_cmd.h make_cmd.h subst.h externs.h bashtypes.h
+expr.o: shell.h sig.h command.h stdc.h hash.h
+expr.o: general.h variables.h config.h memalloc.h quit.h
+expr.o: dispose_cmd.h make_cmd.h subst.h externs.h
+flags.o: flags.h stdc.h config.h memalloc.h general.h quit.h
+general.o: shell.h sig.h command.h stdc.h maxpath.h
+general.o: general.h variables.h config.h memalloc.h quit.h machines.h
+general.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+hash.o: shell.h sig.h command.h stdc.h hash.h
+hash.o: general.h variables.h config.h memalloc.h quit.h
+hash.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+jobs.o: shell.h sig.h command.h stdc.h hash.h trap.h jobs.h siglist.h
+jobs.o: general.h variables.h config.h memalloc.h quit.h
+jobs.o: dispose_cmd.h make_cmd.h subst.h externs.h builtins/builtext.h
+mailcheck.o: posixstat.h maxpath.h variables.h
+mailcheck.o: hash.h quit.h mailcheck.h
+make_cmd.o: shell.h sig.h command.h stdc.h flags.h input.h bashtypes.h
+make_cmd.o: general.h variables.h config.h memalloc.h quit.h
+make_cmd.o: dispose_cmd.h make_cmd.h subst.h externs.h
+y.tab.o: shell.h sig.h command.h stdc.h flags.h maxpath.h alias.h
+y.tab.o: general.h variables.h config.h memalloc.h quit.h mailcheck.h
+y.tab.o: dispose_cmd.h make_cmd.h subst.h externs.h bashtypes.h bashline.h
+print_cmd.o: shell.h sig.h command.h stdc.h y.tab.h
+print_cmd.o: general.h variables.h config.h memalloc.h quit.h
+print_cmd.o: dispose_cmd.h make_cmd.h subst.h externs.h
+shell.o: shell.h sig.h command.h stdc.h flags.h machines.h stdc.h parser.h
+shell.o: general.h variables.h config.h memalloc.h quit.h
+shell.o: dispose_cmd.h make_cmd.h subst.h externs.h mailcheck.h
+shell.o: posixstat.h filecntl.h jobs.h input.h $(ENDIAN_HEADER)
+subst.o: shell.h sig.h command.h stdc.h flags.h jobs.h siglist.h bashtypes.h
+subst.o: general.h variables.h config.h memalloc.h quit.h
+subst.o: dispose_cmd.h make_cmd.h subst.h externs.h execute_cmd.h
+subst.o: builtins/getopt.h $(GLOB_LIBSRC)glob.h bashline.h
+test.o: posixstat.h
+trap.o: trap.h shell.h sig.h command.h stdc.h hash.h unwind_prot.h signames.h
+trap.o: general.h variables.h config.h memalloc.h quit.h
+trap.o: dispose_cmd.h make_cmd.h subst.h externs.h
+unwind_prot.o: config.h memalloc.h general.h unwind_prot.h sig.h
+variables.o: shell.h sig.h command.h stdc.h hash.h flags.h mailcheck.h
+variables.o: config.h memalloc.h general.h variables.h quit.h
+variables.o: execute_cmd.h dispose_cmd.h make_cmd.h subst.h externs.h
+sig.o: shell.h sig.h command.h stdc.h hash.h flags.h
+sig.o: config.h memalloc.h general.h variables.h quit.h
+sig.o: bashtypes.h jobs.h bashline.h
+version.o: version.h .build
+
+alias.o: ansi_stdlib.h
+bashline.o: ansi_stdlib.h
+variables.o: ansi_stdlib.h
+shell.o: ansi_stdlib.h
+error.o: ansi_stdlib.h
+hash.o: ansi_stdlib.h
+signames.o: ansi_stdlib.h
+expr.o: ansi_stdlib.h
+general.o: ansi_stdlib.h
+input.o: ansi_stdlib.h
+
+#if !defined (JOB_CONTROL)
+jobs.o: nojobs.c
+#endif /* !JOB_CONTROL */
+
+array.o: general.h shell.h sig.h variables.h quit.h config.h memalloc.h
+array.o: command.h error.h maxpath.h unwind_prot.h dispose_cmd.h
+array.o: make_cmd.h subst.h externs.h
+array.o: array.h stdc.h builtins/common.h
+
+braces.o: general.h shell.h sig.h variables.h quit.h config.h memalloc.h
+braces.o: dispose_cmd.h make_cmd.h subst.h externs.h
+braces.o: maxpath.h unwind_prot.h command.h stdc.h
+
+bracecomp.o: bracecomp.c
+bracecomp.o: shell.h sig.h command.h hash.h builtins.h general.h variables.h
+bracecomp.o: quit.h alias.h config.h
+bracecomp.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+#if defined (HAVE_READLINE_SOURCE)
+bracecomp.o: $(RL_LIBSRC)readline.h
+#endif /* HAVE_READLINE_SOURCE */
+
+bashline.o: shell.h sig.h command.h stdc.h hash.h builtins.h execute_cmd.h
+bashline.o: general.h variables.h config.h memalloc.h quit.h alias.h
+bashline.o: dispose_cmd.h make_cmd.h subst.h externs.h config.h bashline.h
+bashline.o: $(GLOB_LIBSRC)glob.h
+
+bashhist.o: config.h bashansi.h posixstat.h filecntl.h
+bashhist.o: shell.h sig.h command.h stdc.h hash.h builtins.h execute_cmd.h
+bashhist.o: general.h variables.h memalloc.h quit.h alias.h
+bashhist.o: dispose_cmd.h make_cmd.h subst.h externs.h flags.h
+
+/* Dependencies which rely on the user using the source to READLINE. */
+#if defined (READLINE) && defined (HAVE_READLINE_SOURCE)
+bashline.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h
+y.tab.o: $(RL_LIBSRC)keymaps.h $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h
+#endif /* READLINE && HAVE_READLINE_SOURCE */
+
+#if defined (HISTORY) && defined (HAVE_HISTORY_SOURCE)
+subst.o: $(HIST_LIBSRC)history.h
+bashline.o: $(HIST_LIBSRC)history.h
+bashhist.o: $(HIST_LIBSRC)history.h
+y.tab.o: $(HIST_LIBSRC)history.h
+#endif /* HISTORY && HAVE_HISTORY_SOURCE */
+
+#if defined (USE_GLOB_LIBRARY)
+subst.o: $(GLOB_LIBSRC)fnmatch.h
+execute_cmd.o: $(GLOB_LIBSRC)fnmatch.h
+bashhist.o: $(GLOB_LIBSRC)fnmatch.h
+#endif /* USE_GLOB_LIBRARY */
+
+#if defined (HAVE_TILDE_SOURCE)
+execute_cmd.o: $(TILDE_LIBSRC)tilde.h
+general.o: $(TILDE_LIBSRC)tilde.h
+mailcheck.o: $(TILDE_LIBSRC)tilde.h
+shell.o: $(TILDE_LIBSRC)tilde.h
+subst.o: $(TILDE_LIBSRC)tilde.h
+variables.o: $(TILDE_LIBSRC)tilde.h
+#endif /* HAVE_TILDE_SOURCE */
+
+/* Dependencies for the shell builtins. */
+builtins/common.o: shell.h sig.h command.h config.h memalloc.h general.h error.h
+builtins/common.o: variables.h input.h $(DEFDIR)hashcom.h siglist.h
+builtins/common.o: quit.h unwind_prot.h maxpath.h jobs.h builtins.h
+builtins/common.o: dispose_cmd.h make_cmd.h subst.h externs.h bashhist.h
+builtins/common.o: execute_cmd.h stdc.h
+builtins/alias.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/alias.o: quit.h builtins/common.h
+builtins/alias.o: shell.h sig.h command.h stdc.h unwind_prot.h variables.h 
+builtins/alias.o: dispose_cmd.h make_cmd.h subst.h externs.h
+builtins/bind.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/bind.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/bind.o: shell.h sig.h unwind_prot.h variables.h quit.h
+builtins/bind.o: $(DEFDIR)bashgetopt.h
+builtins/break.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/break.o: shell.h sig.h unwind_prot.h variables.h quit.h
+builtins/break.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/builtin.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/builtin.o: quit.h $(DEFDIR)common.h
+builtins/builtin.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/builtin.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/cd.o: command.h config.h memalloc.h error.h general.h maxpath.h quit.h 
+builtins/cd.o: shell.h sig.h unwind_prot.h variables.h $(DEFDIR)common.h
+builtins/cd.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/command.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/command.o: quit.h $(DEFDIR)bashgetopt.h
+builtins/command.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/command.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/declare.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/declare.o: shell.h sig.h unwind_prot.h variables.h quit.h
+builtins/declare.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/echo.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/echo.o: shell.h sig.h unwind_prot.h variables.h quit.h
+builtins/echo.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/enable.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/enable.o: shell.h sig.h unwind_prot.h variables.h quit.h
+builtins/enable.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/eval.o: command.h config.h memalloc.h error.h general.h maxpath.h quit.h 
+builtins/eval.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/eval.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/exec.o: command.h config.h memalloc.h error.h general.h maxpath.h quit.h 
+builtins/exec.o: shell.h sig.h unwind_prot.h variables.h $(DEFDIR)common.h stdc.h
+builtins/exec.o: dispose_cmd.h make_cmd.h subst.h externs.h execute_cmd.h
+builtins/exec.o: flags.h
+builtins/exit.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/exit.o: shell.h sig.h unwind_prot.h variables.h quit.h
+builtins/exit.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/fc.o: builtins.h command.h stdc.h 
+builtins/fc.o: command.h config.h memalloc.h error.h general.h maxpath.h quit.h 
+builtins/fc.o: flags.h unwind_prot.h variables.h shell.h sig.h 
+builtins/fc.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/fc.o: $(DEFDIR)bashgetopt.h bashhist.h
+builtins/fg_bg.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/fg_bg.o: shell.h sig.h unwind_prot.h variables.h quit.h
+builtins/fg_bg.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/getopts.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/getopts.o: shell.h sig.h unwind_prot.h variables.h quit.h 
+builtins/getopts.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/hash.o: builtins.h command.h execute_cmd.h stdc.h
+builtins/hash.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/hash.o: shell.h sig.h unwind_prot.h variables.h $(DEFDIR)common.h quit.h 
+builtins/help.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/help.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/help.o: shell.h sig.h unwind_prot.h variables.h quit.h
+builtins/help.o: $(GLOB_LIBSRC)glob.h
+builtins/history.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/history.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/history.o: filecntl.h shell.h sig.h unwind_prot.h variables.h 
+builtins/history.o: bashhist.h
+builtins/inlib.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/inlib.o: shell.h sig.h unwind_prot.h variables.h quit.h 
+builtins/inlib.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/jobs.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/jobs.o: quit.h $(DEFDIR)bashgetopt.h
+builtins/jobs.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/jobs.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/kill.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/kill.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/kill.o: shell.h sig.h trap.h unwind_prot.h variables.h 
+builtins/let.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/let.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/let.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/pushd.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/pushd.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/pushd.o: shell.h sig.h unwind_prot.h variables.h $(DEFDIR)common.h
+builtins/read.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/read.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/read.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/return.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/return.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/return.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/set.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/set.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h
+builtins/set.o: shell.h sig.h unwind_prot.h variables.h flags.h stdc.h
+builtins/setattr.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/setattr.o: quit.h $(DEFDIR)common.h $(DEFDIR)bashgetopt.h
+builtins/setattr.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/setattr.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/shift.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/shift.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/shift.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/shift.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/source.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/source.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/source.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/suspend.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/suspend.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/suspend.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/test.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/test.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/test.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/times.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/times.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/times.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/trap.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/trap.o: quit.h $(DEFDIR)common.h
+builtins/trap.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/trap.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/type.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/type.o: quit.h $(DEFDIR)common.h
+builtins/type.o: shell.h sig.h unwind_prot.h variables.h execute_cmd.h
+builtins/type.o: dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/ulimit.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/ulimit.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/ulimit.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/umask.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/umask.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/umask.o: shell.h sig.h unwind_prot.h variables.h 
+builtins/wait.o: command.h config.h memalloc.h error.h general.h maxpath.h
+builtins/wait.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h stdc.h
+builtins/wait.o: shell.h sig.h unwind_prot.h variables.h
+builtins/shopt.o: command.h config.h memalloc.h error.h general.h
+builtins/shopt.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h
+builtins/shopt.o: shell.h unwind_prot.h variables.h maxpath.h
+builtins/shopt.o: builtins/common.h builtins/bashgetopt.h
+
+builtins/bashgetopt.o: bashansi.h ansi_stdlib.h
+builtins/mkbuiltins.o: bashansi.h ansi_stdlib.h
+builtins/fc.o: bashansi.h ansi_stdlib.h
+
+#if defined (READLINE) && defined (HAVE_READLINE_SOURCE)
+builtins/bind.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h
+#endif /* READLINE && HAVE_READLINE_SOURCE */
+
+#if defined (HISTORY) && defined (HAVE_HISTORY_SOURCE)
+builtins/bind.o: $(HIST_LIBSRC)history.h
+builtins/fc.o: $(HIST_LIBSRC)history.h
+builtins/history.o: $(HIST_LIBSRC)history.h
+#endif /* HISTORY && HAVE_HISTORY_SOURCE */
+
+#if defined (HAVE_TILDE_SOURCE)
+builtins/common.o: $(TILDE_LIBSRC)tilde.h
+builtins/cd.o: $(TILDE_LIBSRC)tilde.h 
+#endif /* HAVE_TILDE_SOURCE */
+
+builtins/alias.o: builtins/alias.def
+builtins/bind.o: builtins/bind.def
+builtins/break.o: builtins/break.def
+builtins/builtin.o: builtins/builtin.def
+builtins/cd.o: builtins/cd.def
+builtins/colon.o: builtins/colon.def
+builtins/command.o: builtins/command.def
+builtins/declare.o: builtins/declare.def
+builtins/echo.o: builtins/echo.def
+builtins/enable.o: builtins/enable.def
+builtins/eval.o: builtins/eval.def
+builtins/exec.o: builtins/exec.def
+builtins/exit.o: builtins/exit.def
+builtins/fc.o: builtins/fc.def
+builtins/fg_bg.o: builtins/fg_bg.def
+builtins/getopts.o: builtins/getopts.def
+builtins/hash.o: builtins/hash.def
+builtins/help.o: builtins/help.def
+builtins/history.o: builtins/history.def
+builtins/inlib.o: builtins/inlib.def
+builtins/jobs.o: builtins/jobs.def
+builtins/kill.o: builtins/kill.def
+builtins/let.o: builtins/let.def
+builtins/pushd.o: builtins/pushd.def
+builtins/read.o: builtins/read.def
+builtins/reserved.o: builtins/reserved.def
+builtins/return.o: builtins/return.def
+builtins/set.o: builtins/set.def
+builtins/setattr.o: builtins/setattr.def
+builtins/shift.o: builtins/shift.def
+builtins/shopt.o: builtins/shopt.def
+builtins/source.o: builtins/source.def
+builtins/suspend.o: builtins/suspend.def
+builtins/test.o: builtins/test.def
+builtins/times.o: builtins/times.def
+builtins/trap.o: builtins/trap.def
+builtins/type.o: builtins/type.def
+builtins/ulimit.o: builtins/ulimit.def
+builtins/umask.o: builtins/umask.def
+builtins/wait.o: builtins/wait.def
+
+install:       .made
+               $(INSTALL_PROGRAM) $(Program) $(bindir)/$(Program)
+               $(INSTALL_PROGRAM) bashbug $(bindir)/bashbug
+               $(RM) installed-$(Program)
+               -ln -s $(bindir)/$(Program) installed-$(Program)
+               ( cd $(DOCDIR) ; $(MAKE) $(MFLAGS) mandir=$(mandir) \
+                       man3dir=$(man3dir) infodir=$(infodir) \
+                       INSTALL_PROGRAM="${INSTALL_PROGRAM}" \
+                       INSTALL_DATA="${INSTALL_DATA}" $@ )
+
+uninstall:     .made
+               $(RM) $(bindir)/$(Program) installed-$(Program) $(bindir)/bashbug
+               ( cd $(DOCDIR) ; $(MAKE) $(MFLAGS) mandir=$(mandir) man3dir=$(man3dir) infodir=$(infodir) $@ )
+               
+.distribution:
+               ./mkversion -dir $(srcdir) -dist `$(Program) -c 'echo $$BASH_VERSION'`
+
+mkversion:     $(SUPPORT_SRC)mkversion.c
+               $(CC) $(CCFLAGS) $(CPPFLAGS) -I$(srcdir) -I.. -o $@ $(SUPPORT_SRC)mkversion.c
+
+newversion:    mkversion
+               $(RM) .build
+               ./mkversion -dir $(srcdir) -dist
+               mv -f newversion.h version.h
+               $(MAKE) -f $(srcdir)/Makefile $(MFLAGS) srcdir=$(srcdir)
+
+texindex:      force
+               build_lib_in_dir($(LIBPATH)doc-support, texindex, $${topdir}/lib/doc-support, $${topdir}/lib/doc-support/Makefile)
+
+documentation:  force texindex
+               (cd $(DOCDIR); $(MAKE) $(MFLAGS) CFLAGS='$(CCFLAGS)')
+
+force:
+
+tags:          $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE)
+               etags $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE)
+
+TAGS:          $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE)
+               ctags -x $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE) > $@
+
+clean:
+               $(RM) $(OBJECTS) $(Program) bashbug ansi-Makefile *.aux
+               $(RM) .build .made .machine version.h
+               $(RM) $(CREATED_SUPPORT) bash-Makefile tags TAGS
+               (cd $(DOCDIR); $(MAKE) $(MFLAGS) clean)
+               (cd builtins; $(MAKE) $(MFLAGS) clean)
+               $(CLEAN_READLINE) ;
+               $(CLEAN_HISTORY) ;
+               $(CLEAN_TERMCAP) ;
+               $(CLEAN_GLOB) ;
+               $(CLEAN_TILDE) ;
+               $(CLEAN_MALLOC) ;
+
+distclean:     clean
+               $(RM) installed-bash
+
+realclean:     clean
+               $(RM) y.tab.c y.tab.h parser-built installed-bash
+
+recho:         $(SUPPORT_SRC)recho.c
+       @$(CC) -o $@ $(SUPPORT_SRC)recho.c
+
+tests:         force $(Program) recho
+       -[ -d tests ] || mkdir tests
+       @cp recho $(SUPPORT_SRC)printenv tests
+       ( cd tests ; sh run-all )
diff --git a/CWRU/old-conf/machines.h b/CWRU/old-conf/machines.h
new file mode 100644 (file)
index 0000000..3a66338
--- /dev/null
@@ -0,0 +1,2314 @@
+/* machines.h --
+   Included file in the makefile that gets run through Cpp.  This file
+   tells which machines have what features based on the unique machine
+   identifier present in Cpp. */
+
+/* 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. */
+
+/* **************************************************************** */
+/*                                                                  */
+/*                Global Assumptions (true for most systems).       */
+/*                                                                  */
+/* **************************************************************** */
+
+/* We make some global assumptions here.  This can be #undef'ed in
+   various machine specific entries. */
+
+/* If this file is being processed with Gcc, then the user has Gcc. */
+#if defined (__GNUC__) && !defined (NeXT) && !defined (__FreeBSD__)
+#  if !defined (HAVE_GCC)
+#    define HAVE_GCC
+#  endif /* HAVE_GCC */
+#endif /* __GNUC__ && !NeXT && !__FreeBSD__ **/
+
+/* Assume that all machines have the getwd () system call.  We unset it
+   for USG systems. */
+#define HAVE_GETWD
+
+/* Assume that all systems have a working getcwd () call.  We unset it for
+   ISC systems. */
+#define HAVE_GETCWD
+
+/* Most (but not all) systems have a good, working version of dup2 ().
+   For systems that don't have the call (HP/UX), and for systems
+   that don't set the open-on-exec flag for the dup'ed file descriptors,
+   (Sequents running Dynix, Ultrix), #undef HAVE_DUP2 in the machine
+   description. */
+#define HAVE_DUP2
+
+/* Every machine that has Gcc has alloca as a builtin in Gcc.  If you are
+   compiling Bash without Gcc, then you must have alloca in a library,
+   in your C compiler, or be able to assemble or compile the alloca source
+   that we ship with Bash. */
+#define HAVE_ALLOCA
+
+/* We like most machines to use the GNU Malloc routines supplied in the
+   source code because they provide high quality error checking.  On
+   some machines, our malloc () cannot be used (because of library
+   conflicts, for example), and for those, you should specifically
+   #undef USE_GNU_MALLOC in the machine description. */
+#define USE_GNU_MALLOC
+
+/* This causes the Gnu malloc library (from glibc) to be used. */
+/* #define USE_GNU_MALLOC_LIBRARY */
+
+/* Assume that every operating system supplies strchr () and strrchr ()
+   in a standard library until proven otherwise. */
+#define HAVE_STRCHR
+
+/* Hardware-dependent CFLAGS. */
+#define MACHINE_CFLAGS
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Sun Microsystems Machines                   */
+/*                                                                 */
+/* **************************************************************** */
+
+/* NetBSD running on a sparc. */
+#if defined (sparc) && defined (__NetBSD__)
+#  define M_MACHINE "sun4"
+#  define M_OS "NetBSD"
+#  define SYSDEP_CFLAGS -DOPENDIR_NOT_ROBUST -DINT_GROUPS_ARRAY \
+                       -DRLIMTYPE=quad_t
+#  define SYSDEP_LDFLAGS -static
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#  define HAVE_VPRINTF
+#  define HAVE_STRERROR
+#  define VOID_SIGHANDLER
+#  define HAVE_DIRENT
+#  define HAVE_STRCASECMP
+#endif /* sparc && __NetBSD__ */
+
+#if defined (sun) && !defined (M_MACHINE)
+/* We aren't currently using GNU Malloc on Suns because of a bug in Sun's
+   YP which bites us when Sun free ()'s an already free ()'ed address.
+   When Sun fixes their YP, we can start using our winning malloc again. */
+/* #undef USE_GNU_MALLOC */
+
+/* Most Sun systems have signal handler functions that are void. */
+#  define VOID_SIGHANDLER
+
+/* Most Sun systems have the following. */
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define HAVE_GETGROUPS
+
+/* Check for SunOS4 or greater. */
+#  if defined (SunOS5)
+#    define M_OS "SunOS5"
+#    define SYSDEP_CFLAGS -DUSGr4 -DUSG -DSolaris -DOPENDIR_NOT_ROBUST \
+                         -DSBRK_DECLARED -DINT_GROUPS_ARRAY
+#    define EXTRA_LIB_SEARCH_PATH /usr/ccs/lib
+#    if !defined (HAVE_GCC)
+#      define REQUIRED_LIBRARIES -ldl
+#      define SYSDEP_LDFLAGS -Bdynamic
+#    endif /* !HAVE_GCC */
+#    define HAVE_STRERROR
+#    undef HAVE_GETWD
+#    undef HAVE_SETLINEBUF
+#  endif /* SunOS5 */
+
+#  if defined (SunOS4)
+#    define M_OS "SunOS4"
+#    define SYSDEP_CFLAGS -DHAVE_BSD_PGRP -DOPENDIR_NOT_ROBUST -DTERMIOS_LDISC \
+                         -DINT_GROUPS_ARRAY
+#    define HAVE_DIRENT
+#    define HAVE_DLOPEN
+#    define HAVE_DLSYM
+#    define HAVE_DLCLOSE
+#    define REQUIRED_LIBRARIES -ldl
+#    if !defined (HAVE_GCC)
+#      define SYSDEP_LDFLAGS -Bdynamic
+#    endif
+#  endif /* SunOS4 */
+
+#  if !defined (SunOS4) && !defined (SunOS5)
+#    define M_OS "SunOS3"
+#    if !defined (sparc) && !defined (__sparc__)
+#      undef VOID_SIGHANDLER
+#    endif /* !sparc */
+#  endif /* !SunOS4 && !SunOS5 */
+
+#  if defined (mc68010)
+#    define sun2
+#    define M_MACHINE "sun2"
+#  endif
+#  if defined (mc68020)
+#    define sun3
+#    define M_MACHINE "sun3"
+#  endif
+#  if defined (sparc) || defined (__sparc__)
+#    define sun4
+#    define M_MACHINE "sparc"
+#  endif
+#  if defined (i386)
+#    define done386
+#    if !defined (SunOS5)
+#      define Sun386i
+#      define M_MACHINE "Sun386i"
+#    else
+#      define M_MACHINE "i386"
+#    endif
+#  endif /* i386 */
+
+#endif /* sun && !M_MACHINE */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     DEC Machines (vax, decstations)             */
+/*                                                                 */
+/* **************************************************************** */
+
+/* ************************ */
+/*                          */
+/*     Alpha with OSF/1     */
+/*                          */
+/* ************************ */
+#if defined (__alpha) || defined (alpha)
+#  define M_MACHINE "alpha"
+#  define M_OS "OSF1"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define HAVE_STRERROR
+#  define HAVE_GETGROUPS
+#  define VOID_SIGHANDLER
+#  define HAVE_DLOPEN
+#  define HAVE_DLSYM
+#  define HAVE_DLCLOSE
+#  define USE_TERMCAP_EMULATION
+#  if !defined (__GNUC__)
+#    define SYSDEP_CFLAGS -DNLS -D_BSD
+#  endif /* !__GNUC__ */
+#  undef HAVE_ALLOCA
+#  undef USE_GNU_MALLOC
+#endif /* __alpha || alpha */
+
+/* ************************ */
+/*                         */
+/*         Ultrix          */
+/*                         */
+/* ************************ */
+#if defined (ultrix)
+#  if defined (MIPSEL)
+#    undef HAVE_ALLOCA_H
+#    define M_MACHINE "MIPSEL"
+#  else /* !MIPSEL */
+#    define M_MACHINE "vax"
+#  endif /* !MIPSEL */
+#  define SYSDEP_CFLAGS -DHAVE_BSD_PGRP -DTERMIOS_MISSING -DTERMIOS_LDISC \
+                       -DINT_GROUPS_ARRAY
+#  define M_OS "Ultrix"
+#  define HAVE_DIRENT
+#  define VOID_SIGHANDLER
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define HAVE_GETGROUPS
+#  undef HAVE_DUP2
+#endif /* ultrix */
+
+/* ************************ */
+/*                         */
+/*     VAX 4.3 BSD         */
+/*                         */
+/* ************************ */
+#if defined (vax) && !defined (ultrix)
+#  define M_MACHINE "vax"
+#  define M_OS "Bsd"
+#  define HAVE_SETLINEBUF
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_GETGROUPS
+#  define USE_VFPRINTF_EMULATION
+#endif /* vax && !ultrix */
+
+/* ************************ */
+/*                         */
+/*     Tahoe 4.3 BSD       */
+/*                         */
+/* ************************ */
+#if defined (tahoe)
+#  define M_MACHINE "tahoe"
+#  define M_OS "Bsd"
+#  define HAVE_SETLINEBUF
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_GETGROUPS
+#  define HAVE_VPRINTF
+#endif /* tahoe */
+
+/* **************************************************************** */
+/*                                                                 */
+/*             Machines with MIPSco processors                     */
+/*                                                                 */
+/* **************************************************************** */
+
+/* **************************************** */
+/*                                         */
+/*             SGI Iris/IRIX               */
+/*                                         */
+/* **************************************** */
+#if defined (sgi)
+#  if defined (Irix3)
+#    define M_OS "Irix3"
+#    if !defined (HAVE_GCC)
+#      undef MACHINE_CFLAGS
+#      define MACHINE_CFLAGS -real_frameptr -Wf,-XNl3072
+#    endif
+#    undef HAVE_ALLOCA
+#  endif /* Irix3 */
+#  if defined (Irix4)
+#    define M_OS "Irix4"
+#    if !defined (HAVE_GCC)
+#      undef MACHINE_CFLAGS
+#      define MACHINE_CFLAGS -Wf,-XNl3072
+#    endif
+#  endif /* Irix4 */
+#  if defined (Irix5)
+#    define M_OS "Irix5"
+#    if !defined (HAVE_GCC)
+#      undef MACHINE_CFLAGS
+#      define MACHINE_CFLAGS -Wf,-XNl3072
+#    endif
+#  endif /* Irix5 */
+#  if defined (Irix6)
+#    define M_OS "Irix6"
+#    if !defined (HAVE_GCC)
+#      undef MACHINE_CFLAGS
+#      define MACHINE_CFLAGS -mips2
+#    endif /* !HAVE_GCC */
+#  endif /* Irix6 */
+#  define M_MACHINE "sgi"
+#  define HAVE_GETGROUPS
+#  define VOID_SIGHANDLER
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  if !defined (Irix6)
+#    define REQUIRED_LIBRARIES -lsun
+#  endif /* !Irix6 */
+   /* SGI cc uses ansi c features *without* defining __STDC__ */
+#  if defined (__EXTENSIONS__) && !defined (__STDC__)
+#    define ANSIC -D__STDC__
+#  else
+#    define ANSIC
+#  endif /* !__EXTENSIONS__ || __STDC__ */
+#  if defined (Irix5) || defined (Irix6)
+#    define SGI_CFLAGS -DUSG -DPGRP_PIPE -DHAVE_BCOPY -DHAVE_GETPW_DECLS \
+                      -DHAVE_SOCKETS -DSBRK_DECLARED
+#  else
+#    define SGI_CFLAGS -DUSG -DPGRP_PIPE -DHAVE_BCOPY -DHAVE_GETPW_DECLS \
+                      -DHAVE_SOCKETS
+#  endif /* !Irix5 */
+#  define SYSDEP_CFLAGS SGI_CFLAGS MACHINE_CFLAGS ANSIC
+#endif  /* sgi */
+
+/* ************************ */
+/*                         */
+/*       NEC EWS 4800      */
+/*                         */
+/* ************************ */
+#if defined (nec_ews)
+#  if defined (SYSTYPE_SYSV) || defined (USGr4)
+#    define M_MACHINE "ews4800"
+#    define M_OS "USG"
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+#    define HAVE_STRERROR
+#    define HAVE_DUP2
+#    undef HAVE_GETWD
+#    undef HAVE_RESOURCE /* ? */
+     /* Alloca requires either Gcc or cc with -lucb. */
+#    if !defined (HAVE_GCC)
+#      define EXTRA_LIB_SEARCH_PATH /usr/ucblib
+#      define REQUIRED_LIBRARIES -lc -lucb
+#    endif /* !HAVE_GCC */
+#    if defined (MIPSEB)
+#      if !defined (HAVE_GCC)
+#        undef MACHINE_CFLAGS
+#        define MACHINE_CFLAGS -Wf,-XNl3072
+#      endif
+#      define SYSDEP_CFLAGS MACHINE_CFLAGS -DUSGr4 -DUSGr3 -D_POSIX_JOB_CONTROL
+#    else /* !MIPSEB */
+#      define SYSDEP_CFLAGS -DUSGr4
+#    endif /* MIPSEB */
+#  else /* !SYSTYPE_SYSV && !USGr4 */
+#    define M_OS "Bsd"
+#  endif /* !SYSTYPE_SYSV && !USGr4 */
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#endif /* nec_ews */
+
+/* ************************ */
+/*                         */
+/*  Generic MIPS SVR4, 4.2  */
+/*                         */
+/* ************************ */
+#if defined (MIPSEB) && defined (USGr4)
+#  define M_MACHINE "MIPSEB"
+#  define M_OS "USG"
+#  if defined (sony) && !defined (HAVE_GCC)
+#    undef MACHINE_CFLAGS
+#    define MACHINE_CFLAGS -Wf,-XNl3072
+#  endif
+/* XXX - os/svr4.h -- for the future -- XXX */
+#  undef HAVE_GETWD
+#  define HAVE_DIRENT
+#  define HAVE_STRERROR
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+/* alloca */
+#  if !defined (HAVE_GCC)
+#    define EXTRA_LIB_SEARCH_PATH /usr/ucblib
+#    define REQUIRED_LIBRARIES -lc -lucb
+#  endif /* !HAVE_GCC */
+#  if defined (USGr4_2)
+#    define SYSDEP_CFLAGS MACHINE_CFLAGS -DUSGr4 -DUSGr4_2
+#  else
+#    define SYSDEP_CFLAGS MACHINE_CFLAGS -DUSGr4
+#  endif /* !USGr4_2 */
+#endif
+
+/* ************************ */
+/*                         */
+/*         Sony            */
+/*                         */
+/* ************************ */
+#if defined (sony) && !defined (M_MACHINE)
+#  if defined (MIPSEB)
+#    define M_MACHINE "MIPSEB"
+#  else /* !MIPSEB */
+#    define M_MACHINE "sony"
+#  endif /* !MIPSEB */
+
+#  if defined (SYSTYPE_SYSV) || defined (USGr4)
+#    define M_OS "USG"
+#    undef HAVE_GETWD
+#    define HAVE_DIRENT
+#    define HAVE_STRERROR
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+     /* Alloca requires either Gcc or cc with -lucb. */
+#    if !defined (HAVE_GCC)
+#      define EXTRA_LIB_SEARCH_PATH /usr/ucblib
+#      define REQUIRED_LIBRARIES -lc -lucb
+#    endif /* !HAVE_GCC */
+#    if defined (MIPSEB)
+#      if !defined (HAVE_GCC)
+#        undef MACHINE_CFLAGS
+#        define MACHINE_CFLAGS -Wf,-XNl3072
+#      endif
+#      define SYSDEP_CFLAGS MACHINE_CFLAGS -DUSGr4
+#    else /* !MIPSEB */
+#      define SYSDEP_CFLAGS -DUSGr4
+#    endif /* !MIPSEB */
+#  else /* !SYSTYPE_SYSV && !USGr4 */
+#    define M_OS "Bsd"
+#    define SYSDEP_CFLAGS -DHAVE_UID_T
+#  endif /* !SYSTYPE_SYSV && !USGr4 */
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#endif /* sony */
+
+/* ******************************* */
+/*                                */
+/*  Ardent Titan OS v2.2 and later */
+/*                                */
+/* ******************************* */
+#if defined (ardent)
+#  define M_MACHINE "Ardent Titan"
+#  define M_OS "Bsd"
+#  if defined (titan)
+#    undef HAVE_GETGROUPS
+#  else
+#    define HAVE_GETGROUPS
+#  endif /* !titan */
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define SYSDEP_CFLAGS -43 -w
+#  define SYSDEP_LDFLAGS -43
+#  undef HAVE_ALLOCA
+#  undef USE_GNU_MALLOC
+#  undef HAVE_VPRINTF
+#  undef HAVE_DIRENT_H
+#endif /* ardent */
+
+/* ************************ */
+/*                         */
+/*       Stardent          */
+/*                         */
+/* ************************ */
+#if defined (stardent) && !defined (M_MACHINE)
+#  define M_MACHINE "Stardent"
+#  define M_OS "USG"
+#  define HAVE_SYS_SIGLIST
+#  define USE_TERMCAP_EMULATION
+#  define VOID_SIGHANDLER
+#  undef HAVE_GETWD
+#  undef HAVE_ALLOCA
+#endif /* stardent */
+
+/* ******************************** */
+/*                                 */
+/*        MIPS RISC/os             */
+/*                                 */
+/* ******************************** */
+
+/* Notes on compiling with "make":
+
+   * Place /bsd43/bin in your PATH before /bin.
+   * Use `$(CC) -E' instead of `/lib/cpp' in Makefile.
+*/
+#if defined (mips) && (!defined (M_MACHINE) || defined (RiscOS))
+
+#  if defined (MIPSEB)
+#    define M_MACHINE "MIPSEB"
+#  else /* !MIPSEB */
+#    if defined (MIPSEL)
+#      define M_MACHINE "MIPSEL"
+#    else /* !MIPSEL */
+#      define M_MACHINE "mips"
+#    endif /* !MIPSEL */
+#  endif /* !MIPSEB */
+
+#  define M_OS "Bsd"
+
+   /* Special things for machines from MIPS Co. */
+#  define MIPS_CFLAGS -DOPENDIR_NOT_ROBUST -DPGRP_PIPE
+
+#  if !defined (HAVE_GCC)
+#    undef MACHINE_CFLAGS
+#    define MACHINE_CFLAGS -Wf,-XNl3072 -systype bsd43
+#  endif /* !HAVE_GCC */
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define HAVE_GETGROUPS
+#  undef HAVE_UNISTD_H
+#  if !defined (HAVE_RESOURCE)
+#    define HAVE_RESOURCE
+#  endif /* !HAVE_RESOURCE */
+#  if defined (bsd4_4)
+#    define VOID_SIGHANDLER
+#    define HAVE_UNISTD_H      /* ??? atsuo@harl.hitachi.co.jp */
+#    define SYSDEP_CFLAGS MACHINE_CFLAGS MIPS_CFLAGS -D__BSD_4_4__
+#  else
+     /* /usr/include/sys/wait.h appears not to work correctly, so why use it? */
+#    undef HAVE_WAIT_H
+#    define SYSDEP_CFLAGS MACHINE_CFLAGS MIPS_CFLAGS
+#  endif
+#endif /* mips */
+
+/* ************************ */
+/*                         */
+/*       Pyramid           */
+/*                         */
+/* ************************ */
+#if defined (pyr)
+#  define M_MACHINE "Pyramid"
+#  define M_OS "Bsd"
+#  if !defined (HAVE_GCC)
+#    undef HAVE_ALLOCA
+#  endif /* HAVE_GCC */
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#endif /* pyr */
+
+/* ************************ */
+/*                         */
+/*         IBMRT           */
+/*                         */
+/* ************************ */
+#if defined (ibm032)
+#  define M_MACHINE "IBMRT"
+#  define M_OS "Bsd"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define USE_VFPRINTF_EMULATION
+   /* Alloca requires either gcc or hc or pcc with -ma in SYSDEP_CFLAGS. */
+#  if !defined (HAVE_GCC)
+#    define SYSDEP_CFLAGS -ma -U__STDC__
+#  endif /* !HAVE_GCC */
+#  define HAVE_GETGROUPS
+/* #define USE_GNU_TERMCAP */
+#endif /* ibm032 */
+
+/* **************************************************************** */
+/*                                                                 */
+/*       All Intel 386 Processor Machines are Defined Here!        */
+/*                                                                 */
+/* **************************************************************** */
+
+#if defined (i386)
+
+/* Sequent Symmetry running Dynix/ptx 2.x */
+#  if !defined (done386) && defined (_SEQUENT_)
+#    define done386
+#    define M_MACHINE "Symmetry"
+#    define M_OS "Dynix"
+#    define DYNIX_CFLAGS -DHAVE_GETDTABLESIZE -DHAVE_SETDTABLESIZE \
+                        -DHAVE_GETPW_DECLS -DHAVE_SOCKETS
+#    define SYSDEP_CFLAGS -DUSG -DUSGr3 DYNIX_CFLAGS
+#    define HAVE_DIRENT
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+/* Might need to add -lsocket -linet -lnsl to the list of libraries. */
+#    define REQUIRED_LIBRARIES -lPW -lseq
+#    undef HAVE_GETWD
+#    undef HAVE_RESOURCE
+#    undef HAVE_ALLOCA
+#  endif /* _SEQUENT_ */
+
+/* Sequent Symmetry running Dynix (4.2 BSD) */
+#  if !defined (done386) && defined (sequent)
+#    define done386
+#    define M_MACHINE "Symmetry"
+#    define M_OS "Bsd"
+#    define SYSDEP_CFLAGS -DCPCC -DHAVE_SETDTABLESIZE
+#    define HAVE_SETLINEBUF
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_GETGROUPS
+#    define LD_HAS_NO_DASH_L
+#    undef HAVE_DUP2
+#  endif /* Sequent 386 */
+
+/* NeXT 3.x on i386 */
+#  if !defined (done386) && defined (NeXT)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "NeXTstep"
+#    define HAVE_VPRINTF
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_GETGROUPS
+#    define HAVE_STRERROR
+#    define VOID_SIGHANDLER
+#    if !defined (HAVE_RESOURCE)
+#      define HAVE_RESOURCE
+#    endif
+#    define HAVE_STRCASECMP
+#    define GCC_STANDARD
+#    undef HAVE_GETWD
+#    undef HAVE_GETCWD
+#    undef USE_GNU_MALLOC
+#    undef HAVE_DIRENT_H
+#    define SYSDEP_CFLAGS -DNeXT -DMKFIFO_MISSING -DRLOGIN_PGRP_BUG
+#  endif
+
+/* Generic 386 clone running Mach (4.3 BSD-compatible). */
+#  if !defined (done386) && defined (MACH)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "Bsd"
+#    define HAVE_SETLINEBUF
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_GETGROUPS
+#  endif /* i386 && MACH */
+
+/* AIX PS/2 1.[23] for the [34]86. */
+#  if !defined (done386) && defined (aixpc)
+#    define done386
+#    define M_MACHINE "aixpc"
+#    define M_OS "AIX"
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+#    if defined (AIX_13)       /* AIX PS/2 1.3 */
+#      define SYSDEP_CFLAGS -DTERMIOS_LDISC
+#      define REQUIRED_LIBRARIES -lc_s
+#    else
+#      define SYSDEP_CFLAGS -D_BSD -DTERMIOS_LDISC
+#      define REQUIRED_LIBRARIES -lbsd -lc_s
+#    endif /* !AIX_13 */
+#    define HAVE_GETGROUPS
+#    if !defined (HAVE_GCC)
+#      undef HAVE_ALLOCA
+#      undef HAVE_ALLOCA_H
+#    endif /* !HAVE_GCC */
+#    define USE_TERMCAP_EMULATION
+#  endif /* AIXPC i386 */
+
+/* System V Release 4 on the 386 */
+#  if !defined (done386) && defined (USGr4)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "USG"
+#    define HAVE_DIRENT
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+     /* Alloca requires either Gcc or cc with -lucb. */
+#    if !defined (HAVE_GCC)
+#      define EXTRA_LIB_SEARCH_PATH /usr/ucblib
+#      define REQUIRED_LIBRARIES -lc -lucb
+#    endif /* !HAVE_GCC */
+#    define HAVE_GETGROUPS
+#    if defined (USGr4_2)
+#      define SYSDEP_CFLAGS -DUSGr4 -DUSGr4_2 -DSBRK_DECLARED
+#    else
+#      define SYSDEP_CFLAGS -DUSGr4
+#    endif /* ! USGr4_2 */
+#    undef HAVE_GETWD
+#  endif /* System V Release 4 on i386 */
+
+/* 386 box running Interactive Unix 2.2 or greater. */
+#  if !defined (done386) && defined (isc386)
+#    define done386
+#    define M_MACHINE "isc386"
+#    define M_OS "USG"
+#    define HAVE_DIRENT
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+#    define HAVE_GETGROUPS
+#    define USE_TERMCAP_EMULATION
+#    if defined (HAVE_GCC)
+#      define SYSDEP_LDFLAGS -posix
+#      define ISC_POSIX
+#    else
+#      define REQUIRED_LIBRARIES -lPW
+#      define SYSDEP_LDFLAGS -Xp
+#      define ISC_POSIX -Xp
+#    endif
+#    define ISC_SYSDEPS -DUSGr3 -DPGRP_PIPE -DHAVE_GETPW_DECLS -D_POSIX_SOURCE -DOPENDIR_NOT_ROBUST -DMEMMOVE_MISSING
+#    if defined (__STDC__)
+#      if defined (HAVE_GCC)
+#        define ISC_EXTRA -DO_NDELAY=O_NONBLOCK
+#      else
+#        define ISC_EXTRA -Dmode_t="unsigned short" -DO_NDELAY=O_NONBLOCK
+#      endif /* HAVE_GCC */
+#    else
+#      define ISC_EXTRA
+#    endif /* __STDC__ */
+#    define SYSDEP_CFLAGS ISC_SYSDEPS ISC_POSIX ISC_EXTRA
+#    undef HAVE_GETWD
+#    if !defined (ISC_4)
+#      undef HAVE_GETCWD
+#    else /* ISC_4 */
+#      undef HAVE_RESOURCE
+#    endif /* ISC_4 */
+#  endif /* isc386 */
+
+/* Xenix386 machine (with help from Ronald Khoo <ronald@robobar.co.uk>). */
+#  if !defined (done386) && defined (Xenix386)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "Xenix"
+#    define XENIX_CFLAGS -DUSG -DUSGr3 -DMEMMOVE_MISSING
+
+#    if defined (XENIX_22)
+#      define XENIX_EXTRA -DSETVBUF_REVERSED
+#      define REQUIRED_LIBRARIES -lx
+#    else /* !XENIX_22 */
+#      define HAVE_DIRENT
+#      if defined (XENIX_23)
+#        define XENIX_EXTRA -DLD_HAS_NO_DASH_L
+#        define REQUIRED_LIBRARIES -ldir
+#      else /* !XENIX_23 */
+#        define XENIX_EXTRA -xenix
+#        define SYSDEP_LDFLAGS -xenix
+#        define REQUIRED_LIBRARIES -ldir -l2.3
+#      endif /* !XENIX_23 */
+#    endif /* !XENIX_22 */
+
+#    define SYSDEP_CFLAGS XENIX_CFLAGS XENIX_EXTRA
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+#    define ALLOCA_ASM x386-alloca.s
+#    define ALLOCA_OBJ x386-alloca.o
+#    undef HAVE_ALLOCA
+#    undef HAVE_GETWD
+#    undef HAVE_RESOURCE
+#  endif /* Xenix386 */
+
+/* SCO UNIX 3.2 chip@count.tct.com (Chip Salzenberg) */
+#  if !defined (done386) && defined (M_UNIX)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "SCO"
+#    define SCO_CFLAGS -DUSG -DUSGr3 -DNO_DEV_TTY_JOB_CONTROL -DPGRP_PIPE
+#    if defined (SCOv4)
+#      define SYSDEP_CFLAGS SCO_CFLAGS -DWAITPID_BROKEN
+#    else /* !SCOv4 */
+#      define SYSDEP_CFLAGS SCO_CFLAGS -DMUST_UNBLOCK_CHLD -DOPENDIR_NOT_ROBUST
+#    endif /* !SCOv4 */
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+#    define HAVE_GETGROUPS
+#    undef HAVE_GETWD
+#    undef HAVE_RESOURCE
+/* advice from wbader@cess.lehigh.edu and Eduard.Vopicka@vse.cz */
+#    if !defined (HAVE_GCC)
+#      define REQUIRED_LIBRARIES -lc_s -lc -lPW
+#    else
+#      define REQUIRED_LIBRARIES -lc_s -lc
+#    endif /* !HAVE_GCC */
+#  endif /* SCO Unix on 386 boxes. */
+
+#  if !defined (done386) && defined (__OSF1__)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "OSF1"
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_SETLINEBUF
+#    define HAVE_VPRINTF
+#    define HAVE_STRERROR
+#    define HAVE_GETGROUPS
+#    define VOID_SIGHANDLER
+#    define HAVE_BCOPY
+#    define USE_TERMCAP_EMULATION
+#    define SYSDEP_CFLAGS -D_BSD
+#    define REQUIRED_LIBRARIES -lbsd
+#  endif /* OSF/1 */
+
+/* BSDI BSD/OS running on a 386 or 486. */
+#  if !defined (done386) && defined (__bsdi__)
+#    define done386
+#    define M_MACHINE "i386"
+#    if defined (BSDI2)
+#      define M_OS "BSD_OS"
+#      define SYSDEP_CFLAGS -DOPENDIR_NOT_ROBUST -DRLIMTYPE=quad_t
+#    else
+#      define M_OS "BSD386"
+#      define SYSDEP_CFLAGS -DOPENDIR_NOT_ROBUST -DINT_GROUPS_ARRAY
+#    endif
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_SETLINEBUF
+#    define HAVE_GETGROUPS
+#    define HAVE_VPRINTF
+#    define HAVE_STRERROR
+#    define VOID_SIGHANDLER
+#    define HAVE_DIRENT
+#    define HAVE_STRCASECMP
+#  endif /* !done386 && bsdi */
+
+/* NetBSD running on a 386 or 486. */
+#  if !defined (done386) && defined (__NetBSD__)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "NetBSD"
+#    define SYSDEP_CFLAGS -DOPENDIR_NOT_ROBUST -DINT_GROUPS_ARRAY \
+                         -DRLIMTYPE=quad_t
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_SETLINEBUF
+#    define HAVE_GETGROUPS
+#    define HAVE_VPRINTF
+#    define HAVE_STRERROR
+#    define VOID_SIGHANDLER
+#    define HAVE_DIRENT
+#    define HAVE_STRCASECMP
+#  endif /* !done386 && __NetBSD__ */
+
+/* FreeBSD running on a 386 or 486. */
+#  if !defined (done386) && defined (__FreeBSD__)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "FreeBSD"
+#    if __FreeBSD__ > 1
+#      define SYSDEP_CFLAGS -D__BSD_4_4__ -DRLIMTYPE=quad_t
+#    else
+#      define SYSDEP_CFLAGS -DOPENDIR_NOT_ROBUST -DINT_GROUPS_ARRAY
+#    endif
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_SETLINEBUF
+#    define HAVE_GETGROUPS
+#    define HAVE_VPRINTF
+#    define HAVE_STRERROR
+#    define VOID_SIGHANDLER
+#    define HAVE_DIRENT
+#    define HAVE_STRCASECMP
+#    define GCC_STANDARD
+#  endif /* !done386 && __FreeBSD__ */
+
+/* Jolitz 386BSD running on a 386 or 486. */
+#  if !defined (done386) && defined (__386BSD__)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "_386BSD"
+#    define SYSDEP_CFLAGS -DOPENDIR_NOT_ROBUST -DINT_GROUPS_ARRAY
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_SETLINEBUF
+#    define HAVE_GETGROUPS
+#    define HAVE_VPRINTF
+#    define HAVE_STRERROR
+#    define VOID_SIGHANDLER
+#    define HAVE_DIRENT
+#    define HAVE_STRCASECMP
+#  endif /* !done386 && __386BSD__ */
+
+#  if !defined (done386) && (defined (__linux__) || defined (linux))
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "Linux"
+#    define SYSDEP_CFLAGS -DHAVE_GETDTABLESIZE -DHAVE_BCOPY \
+                         -DHAVE_GETPW_DECLS -DHAVE_GETHOSTNAME
+#    define REQUIRED_LIBRARIES
+#    define HAVE_GETGROUPS
+#    define HAVE_STRERROR
+#    define VOID_SIGHANDLER
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_VPRINTF
+#    define HAVE_VARARGS_H
+#    define SEARCH_LIB_NEEDS_SPACE
+#    if defined (__GNUC__)
+#      define HAVE_FIXED_INCLUDES
+#    endif /* __GNUC__ */
+#    undef USE_GNU_MALLOC
+#    undef HAVE_SETLINEBUF
+#    undef HAVE_GETWD
+#  endif  /* !done386 && __linux__ */
+
+/* QNX 4.2 with GCC pt@flard.ocunix.on.ca (Paul Trunley) */
+#  if !defined (done386) && defined (qnx)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "QNX"
+#    define SYSDEP_CFLAGS -D_POSIX_SOURCE -O2 -DUSG
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+#    define HAVE_GCC
+#    define HAVE_FIXED_INCLUDES
+#    define HAVE_STRERROR
+#    define HAVE_GETGROUPS
+#    undef USE_GNU_MALLOC
+#  endif /* QNX 4.2 with GCC */
+
+/* Lynx 2.1.0 (Mike Brennen <mbrennen@maverick.intecom.com>) */
+#  if !defined (done386) && (defined (__Lynx__) || defined (Lynx))
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "Lynx"
+#    define SYSDEP_CFLAGS -DHAVE_GETDTABLESIZE -DHAVE_BCOPY
+#    define REQUIRED_LIBRARIES -lc_p
+#    define HAVE_GETGROUPS
+#    define VOID_SIGHANDLER
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_VPRINTF
+#    define HAVE_VARARGS_H
+#    if defined (__GNUC__)
+#      define HAVE_FIXED_INCLUDES
+#    endif /* __GNUC__ */
+/* Actually, Lynx does have unistd.h, but it defines _POSIX_VERSION,
+   and doesn't supply a fully compatible job control package.  We just
+   pretend that it doesn't have it. */
+#  undef HAVE_UNISTD_H
+/* Lynx's wait structure reverses w_Stopval and w_Stopsig - don't use it */
+#  undef HAVE_WAIT_H
+#  undef HAVE_DIRENT_H
+#  endif  /* !done386 && __Lynx__ */
+
+/* Assume a generic 386 running Sys V Release 3. */
+#  if !defined (done386)
+#    define done386
+#    define M_MACHINE "i386"
+#    define M_OS "USG"
+#    define SYSDEP_CFLAGS -DUSGr3
+#    define HAVE_VPRINTF
+#    define VOID_SIGHANDLER
+     /* Alloca requires either Gcc or cc with libPW.a */
+#    if !defined (HAVE_GCC)
+#      define REQUIRED_LIBRARIES -lPW
+#    endif /* !HAVE_GCC */
+#    undef HAVE_GETWD
+#  endif /* Generic i386 Box running Sys V release 3. */
+#endif /* All i386 Machines with an `i386' define in cpp. */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                      Alliant FX/800                             */
+/*                                                                 */
+/* **************************************************************** */
+/* Original descs flushed.  FX/2800 machine desc 1.13 bfox@ai.mit.edu.
+   Do NOT use -O with the stock compilers.  If you must optimize, use
+   -uniproc with fxc, and avoid using scc. */
+#if defined (alliant)
+#  define M_MACHINE "alliant"
+#  define M_OS "Concentrix"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#  define HAVE_VPRINTF
+#  define HAVE_RESOURCE
+#  define VOID_SIGHANDLER
+#  define HAVE_STRERROR
+#  define USE_GNU_MALLOC
+#  define LD_HAS_NO_DASH_L
+#  define SYSDEP_CFLAGS -DTERMIOS_MISSING -DMKFIFO_MISSING \
+       -DHAVE_BSD_PGRP -DRLOGIN_PGRP_BUG -w
+   /* Actually, Alliant does have unistd.h, but it defines _POSIX_VERSION,
+      and doesn't supply a fully compatible job control package.  We just
+      pretend that it doesn't have it. */
+#  undef HAVE_UNISTD_H
+#  undef HAVE_ALLOCA
+#endif /* alliant */
+
+/* **************************************************************** */
+/*                                                                  */
+/*            Motorola Delta series running System V R3V6/7         */
+/*                                                                  */
+/* **************************************************************** */
+/* Contributed by Robert L. McMillin (rlm@ms_aspen.hac.com).  */
+
+#if defined (m68k) && defined (sysV68)
+#  define M_MACHINE "Delta"
+#  define M_OS "USG"
+#  define SYSDEP_CFLAGS -DUSGr3
+#  define VOID_SIGHANDLER
+#  define HAVE_VPRINTF
+#  define REQUIRED_LIBRARIES -lm881
+#  undef HAVE_GETWD
+#  undef HAVE_RESOURCE
+#  undef HAVE_DUP2
+#  undef HAVE_ALLOCA
+#endif /* Delta series */
+
+/* **************************************************************** */
+/*                                                                  */
+/*            Motorola m68k system running Linux                    */
+/*                                                                  */
+/* **************************************************************** */
+
+#if defined (mc68020) && (defined (__linux__) || defined (linux))
+#    define M_MACHINE "m68k"
+#    define M_OS "Linux"
+#    define SYSDEP_CFLAGS -DUSG -DUSGr3 -DHAVE_GETDTABLESIZE -DHAVE_BCOPY \
+                        -DHAVE_GETPW_DECLS -DHAVE_GETHOSTNAME
+#    define REQUIRED_LIBRARIES
+#    define HAVE_GETGROUPS
+#    define HAVE_STRERROR
+#    define VOID_SIGHANDLER
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_VPRINTF
+#    define HAVE_VARARGS_H
+#    define SEARCH_LIB_NEEDS_SPACE
+#    if defined (__GNUC__)
+#      define HAVE_FIXED_INCLUDES
+#    endif /* __GNUC__ */
+#    undef USE_GNU_MALLOC
+#    undef HAVE_SETLINEBUF
+#    undef HAVE_GETWD
+#  endif  /* m68k && __linux__ */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                   Gould 9000 - UTX/32 R2.1A                     */
+/*                                                                 */
+/* **************************************************************** */
+#if defined (gould)            /* Maybe should be GOULD_PN ? */
+#  define M_MACHINE "gould"
+#  define M_OS "Bsd"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#endif /* gould */
+
+/* ************************ */
+/*                         */
+/*         NeXT            */
+/*                         */
+/* ************************ */
+#if defined (NeXT) && !defined (M_MACHINE)
+#  define M_MACHINE "NeXT"
+#  define M_OS "NeXTstep"
+#  define HAVE_VPRINTF
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  define VOID_SIGHANDLER
+#  if !defined (HAVE_RESOURCE)
+#    define HAVE_RESOURCE
+#  endif
+#  define HAVE_STRCASECMP
+#  define GCC_STANDARD
+#  undef HAVE_GETWD
+#  undef HAVE_GETCWD
+#  undef HAVE_DIRENT_H
+#  define SYSDEP_CFLAGS -DMKFIFO_MISSING -DRLOGIN_PGRP_BUG
+#  undef USE_GNU_MALLOC
+#endif /* NeXT */
+
+/* ********************** */
+/*                        */
+/*       m68k NetBSD      */
+/*                        */
+/* ********************** */
+#if defined (m68k) && defined (__NetBSD__)
+#  include <machine/param.h>
+#  define M_MACHINE MACHINE
+#  define M_OS "NetBSD"
+/* os/netbsd.h */
+#  define SYSDEP_CFLAGS -DOPENDIR_NOT_ROBUST -DINT_GROUPS_ARRAY \
+                       -DRLIMTYPE=quad_t
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#  define HAVE_VPRINTF
+#  define HAVE_STRERROR
+#  define VOID_SIGHANDLER
+#  define HAVE_DIRENT
+#  define HAVE_STRCASECMP
+#endif /* m68k && __NetBSD__ */
+
+/* ************************ */
+/*                         */
+/*     hp9000 4.4 BSD      */
+/*                         */
+/* ************************ */
+#if defined (hp9000) && defined (__BSD_4_4__)
+#  define M_MACHINE "hp9000"
+#  define M_OS "BSD_4_4"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_STRCASECMP
+#  define SYSDEP_CFLAGS -DHAVE_GETDTABLESIZE -DHAVE_BCOPY -DHAVE_RESOURCE
+#  undef HAVE_ALLOCA
+#endif /* hp9000 && __BSD_4_4__ */
+
+/* ************************ */
+/*                         */
+/*     hp9000 4.3 BSD      */
+/*                         */
+/* ************************ */
+#if defined (hp9000) && !defined (hpux) && !defined (M_MACHINE)
+#  define M_MACHINE "hp9000"
+#  define M_OS "Bsd"
+#  undef HAVE_ALLOCA
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#  define USE_VFPRINTF_EMULATION
+#endif /* hp9000 && !hpux */
+
+/* ************************ */
+/*                          */
+/*          hpux            */
+/*                          */
+/* ************************ */
+#if defined (hpux)
+
+/* HPUX comes in several different flavors, from pre-release 6.2 (basically
+   straight USG), to Posix compliant 9.0. */
+
+   /* HP machines come in several processor types.
+      They are distinguished here. */
+#  if defined (hp9000s200) && !defined (hp9000s300)
+#    define M_MACHINE "hp9000s200"
+#  endif /* hp9000s200 */
+#  if defined (hp9000s300) && !defined (M_MACHINE)
+#    define M_MACHINE "hp9000s300"
+#  endif /* hp9000s300 */
+#  if defined (hp9000s500) && !defined (M_MACHINE)
+#    define M_MACHINE "hp9000s500"
+#  endif /* hp9000s500 */
+#  if defined (hp9000s700) && !defined (M_MACHINE)
+#    define M_MACHINE "hp9000s700"
+#  endif /* hp9000s700 */
+#  if defined (hp9000s800) && !defined (M_MACHINE)
+#    define M_MACHINE "hp9000s800"
+#  endif /* hp9000s800 */
+#  if defined (hppa) && !defined (M_MACHINE)
+#    define M_MACHINE "hppa"
+#  endif /* hppa */
+
+/* Define the OS as the particular type that we are using. */
+/* This is for HP-UX systems earlier than HP-UX 6.2 -- no job control. */
+#  if defined (HPUX_USG)
+#    define M_OS "USG"
+#    define HPUX_CFLAGS -Dhpux
+#    define REQUIRED_LIBRARIES -lPW -lBSD
+#    undef HAVE_WAIT_H
+#    define HPUX_EXTRA
+#  else /* !HPUX_USG */
+
+/* All of the other operating systems need HPUX to be defined. */
+#    define HPUX_EXTRA -DHPUX -Dhpux -DHAVE_GETHOSTNAME -DUSG
+
+     /* HPUX 6.2 .. 6.5 require -lBSD for getwd (), and -lPW for alloca (). */
+#    if defined (HPUX_6)
+#      define M_OS "hpux_6"
+#      define REQUIRED_LIBRARIES -lPW -lBSD
+#      undef HAVE_ALLOCA
+#      undef HAVE_WAIT_H
+#    endif /* HPUX_6 */
+
+     /* On HP-UX 7.x, we do not link with -lBSD, so we don't have getwd (). */
+#    if defined (HPUX_7)
+#      define M_OS "hpux_7"
+#      define REQUIRED_LIBRARIES -lPW
+#      define HPUX_CFLAGS -DHAVE_SOCKETS
+#      undef HAVE_GETWD
+#      undef USE_GNU_MALLOC
+#    endif /* HPUX_7 */
+
+     /* HP-UX 8.x systems do not have a working alloca () on all platforms.
+       This can cause us problems, especially when globbing.  HP has the
+       same YP bug as Sun, so we #undef USE_GNU_MALLOC. */
+#    if defined (HPUX_8)
+#      define M_OS "hpux_8"
+#      if !defined (__GNUC__)
+#        undef HAVE_ALLOCA
+#       define HPUX_ANSI +O3 -Aa -D_HPUX_SOURCE
+#      else
+#       define HPUX_ANSI
+#      endif
+#      undef HAVE_GETWD
+#      undef USE_GNU_MALLOC
+#      define HPUX_CFLAGS -DSBRK_DECLARED -DHAVE_SOCKETS HPUX_ANSI
+#    endif /* HPUX_8 */
+
+     /* HP-UX 9.0 reportedly fixes the alloca problems present in the 8.0
+        release.  If so, -lPW is required to include it. */
+#    if defined (HPUX_9)
+#      define M_OS "hpux_9"
+#      if !defined (__GNUC__)
+#        undef HAVE_ALLOCA
+#       define HPUX_ANSI +O3 -Ae
+#      else
+#       define HPUX_ANSI
+#      endif
+#      undef HAVE_GETWD
+#      undef USE_GNU_MALLOC
+#      undef HAVE_RESOURCE
+#      define HPUX_CFLAGS -DSBRK_DECLARED -DHAVE_SOCKETS -DHAVE_GETHOSTNAME HPUX_ANSI
+#    endif /* HPUX_9 */
+
+#  endif /* !HPUX_USG */
+
+   /* All of the HPUX systems that we have tested have the following. */
+#  define HAVE_DIRENT
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  define USE_TERMCAP_EMULATION
+#  define SEARCH_LIB_NEEDS_SPACE
+
+#  if defined (HPUX_CFLAGS)
+#    define SYSDEP_CFLAGS HPUX_CFLAGS HPUX_EXTRA
+#  else /* !HPUX_CFLAGS */
+#    define SYSDEP_CFLAGS HPUX_EXTRA
+#  endif /* !HPUX_CFLAGS */
+
+#endif /* hpux */
+
+/* ************************ */
+/*                          */
+/*        MIPS OSF/1        */
+/*                          */
+/* ************************ */
+#  if defined (MIPSEL) && defined (__OSF1__)
+#    define M_MACHINE "mips"
+#    define M_OS "OSF1"
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_SETLINEBUF
+#    define HAVE_VPRINTF
+#    define HAVE_STRERROR
+#    define HAVE_GETGROUPS
+#    define VOID_SIGHANDLER
+#    define HAVE_BCOPY
+#    define USE_TERMCAP_EMULATION
+#    define SYSDEP_CFLAGS -D_BSD
+#    define REQUIRED_LIBRARIES -lbsd
+#  endif /* MIPSEL && __OSF1__ */
+
+/* ************************ */
+/*                          */
+/*        HP OSF/1          */
+/*                          */
+/* ************************ */
+#if defined (__hp_osf)
+#  define M_MACHINE "HPOSF1"
+#  define M_OS "OSF1"
+#  define SYSDEP_CFLAGS -q no_sl_enable
+#  define SYSDEP_LDFLAGS -q lang_level:classic
+#  define REQUIRED_LIBRARIES -lPW
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  undef HAVE_ALLOCA
+#endif /* __hp_osf */
+
+/* ************************ */
+/*                          */
+/*        KSR1 OSF/1        */
+/*                          */
+/* ************************ */
+#if defined (__ksr1__)
+#  define M_MACHINE "KSR1"
+#  define M_OS "OSF1"
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  define SYSDEP_CFLAGS -DHAVE_GETDTABLESIZE -DHAVE_BCOPY -DHAVE_UID_T
+#  undef HAVE_ALLOCA
+#  undef USE_GNU_MALLOC
+#endif /* ksr1 */
+
+/* ************************ */
+/*                          */
+/*   Intel Paragon - OSF/1  */
+/*                          */
+/* ************************ */
+#if defined (__i860) && defined (__PARAGON__)
+#  define M_MACHINE "Paragon"
+#  define M_OS "OSF1"
+#  define HAVE_GETGROUPS
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_STRERROR
+#  define HAVE_SYS_SIGLIST
+#endif /* __i860 && __PARAGON__ */
+
+/* ************************ */
+/*                          */
+/* IBM AIX/ESA (OSF/1)      */
+/*                          */
+/* ************************ */
+#if defined(AIXESA) || (defined(__ibmesa) && defined(_AIX))
+#  define M_MACHINE "IBMESA"
+#  define M_OS "OSF1"
+#  define HAVE_GETGROUPS
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_STRERROR
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_ALLOCA_H                /* hack for AIX/ESA, which has malloc.h */
+#  undef USE_GNU_MALLOC
+#endif /* AIXESA || (__ibmesa && _AIX) */
+
+/* ************************ */
+/*                          */
+/*   Intel i860  -- SVR4    */
+/*                          */
+/* ************************ */
+#if defined (__i860) && defined (USGr4) && !defined (M_MACHINE)
+#  define M_MACHINE "i860"
+#  define M_OS "USG"
+#  define HAVE_DIRENT
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_GETGROUPS
+#  if !defined (HAVE_GCC) && !defined (HAVE_ALLOCA_H)
+#    undef HAVE_ALLOCA
+#  endif /* !HAVE_GCC && !HAVE_ALLOCA_H */
+#  if defined (USGr4_2)
+#    define SYSDEP_CFLAGS -DUSGr4 -DUSGr4_2
+#  else
+#    define SYSDEP_CFLAGS -DUSGr4
+#  endif /* ! USGr4_2 */
+#  undef HAVE_GETWD
+#endif /* __i860 && USGr4 */
+
+/* ************************ */
+/*                         */
+/*         Xenix286        */
+/*                         */
+/* ************************ */
+#if defined (Xenix286)
+#  define M_MACHINE "i286"
+#  define M_OS "Xenix"
+
+#  define XENIX_CFLAGS -DUSG -DUSGr3 -DMEMMOVE_MISSING
+
+#  if defined (XENIX_22)
+#    define XENIX_EXTRA -DSETVBUF_REVERSED
+#    define REQUIRED_LIBRARIES -lx
+#  else /* !XENIX_22 */
+#    define HAVE_DIRENT
+#    if defined (XENIX_23)
+#      define XENIX_EXTRA -DLD_HAS_NO_DASH_L
+#      define REQUIRED_LIBRARIES -ldir
+#    else /* !XENIX_23 */
+#      define XENIX_EXTRA -xenix
+#      define SYSDEP_LDFLAGS -xenix
+#      define REQUIRED_LIBRARIES -ldir -l2.3
+#    endif /* !XENIX_23 */
+#  endif /* !XENIX_22 */
+
+#  define SYSDEP_CFLAGS XENIX_CFLAGS XENIX_EXTRA
+#  undef HAVE_ALLOCA
+#  undef HAVE_GETWD
+#  undef HAVE_RESOURCE
+#endif /* Xenix286 */
+
+/* ************************ */
+/*                         */
+/*         convex          */
+/*                         */
+/* ************************ */
+#if defined (convex)
+#  define M_MACHINE "convex"
+#  define M_OS "Bsd"
+#  undef HAVE_ALLOCA
+#  define HAVE_SETLINEBUF
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_GETGROUPS
+#endif /* convex */
+
+/* ************************ */
+/*                          */
+/*          AIX/RT          */
+/*                          */
+/* ************************ */
+#if defined (aix) && !defined (aixpc)
+#  define M_MACHINE "AIXRT"
+#  define M_OS "USG"
+#  define HAVE_DIRENT
+#  define HAVE_VPRINTF
+#  define HAVE_SYS_SIGLIST
+#  define VOID_SIGHANDLER
+#  define HAVE_GETGROUPS
+#  define USE_TERMCAP_EMULATION
+#  if !defined (HAVE_GCC)
+#    undef MACHINE_CFLAGS
+#    define MACHINE_CFLAGS -a
+#  endif /* !HAVE_GCC */
+#  define SYSDEP_CFLAGS MACHINE_CFLAGS -DNLS -DUSGr3 -DHAVE_BCOPY
+#  undef USE_GNU_MALLOC
+#  undef HAVE_ALLOCA
+#  undef HAVE_RESOURCE
+#endif /* aix && !aixpc */
+
+/* **************************************** */
+/*                                         */
+/*             IBM RISC 6000               */
+/*                                         */
+/* **************************************** */
+#if defined (RISC6000) || defined (_IBMR2)
+#  define M_MACHINE "RISC6000"
+#  define M_OS "AIX"
+#  define HAVE_DIRENT
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define USE_TERMCAP_EMULATION
+#  define HAVE_GETGROUPS
+#  define SYSDEP_CFLAGS -DNLS -DUSGr3 -DHAVE_BCOPY
+#  undef HAVE_ALLOCA
+#  undef HAVE_GETWD
+#  undef USE_GNU_MALLOC
+#endif /* RISC6000 */
+
+/* **************************************** */
+/*                                         */
+/*     u370 IBM AIX/370                    */
+/*                                         */
+/* **************************************** */
+#if defined (u370)
+#  if defined (_AIX370)
+#    define M_MACHINE "AIX370"
+#    define M_OS "Bsd"
+#    define REQUIRED_LIBRARIES -lbsd
+#    define HAVE_SETLINEBUF
+#    define HAVE_VPRINTF
+#    define SYSDEP_CFLAGS -D_BSD
+#    define HAVE_GETGROUPS
+#    define USE_TERMCAP_EMULATION
+#    undef USE_GNU_MALLOC
+#  endif /* _AIX370 */
+#  if defined (USGr4) /* System V Release 4 on 370 series architecture. */
+#    define M_MACHINE "uxp"
+#    define M_OS "USG"
+#    define HAVE_DIRENT
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_VPRINTF
+#    define USE_GNU_MALLOC
+#    define VOID_SIGHANDLER
+#    if !defined (HAVE_GCC)
+#      undef HAVE_ALLOCA
+#      define EXTRA_LIB_SEARCH_PATH /usr/ucblib
+#      define REQUIRED_LIBRARIES -lc -lucb
+#    endif /* !HAVE_GCC */
+#    define HAVE_GETGROUPS
+#    define HAVE_RESOURCE
+#    define SYSDEP_CFLAGS -DUSGr4 -DSBRK_DECLARED
+#    endif /* USGr4 */
+#endif /* u370 */
+
+/* ************************ */
+/*                         */
+/*         ATT 3B          */
+/*                         */
+/* ************************ */
+#if defined (att3b) || defined (u3b2)
+#  if defined (att3b)
+#    define M_MACHINE "att3b"
+#    define HAVE_SYS_SIGLIST
+#  else /* !att3b */
+#    define M_MACHINE "u3b2"
+#  endif /* !att3b */
+#  define M_OS "USG"
+#  undef HAVE_GETWD
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+   /* For an AT&T Unix before V.3 take out the -DUSGr3 and the HAVE_DIRENT. */
+#  define SYSDEP_CFLAGS -DUSGr3
+#  define HAVE_DIRENT
+   /* Alloca requires either Gcc or cc with libPW.a. */
+#  if !defined (HAVE_GCC)
+#    define REQUIRED_LIBRARIES -lPW
+#  endif /* !HAVE_GCC */
+#endif /* att3b */
+
+/* ************************ */
+/*                         */
+/*         ATT 386         */
+/*                         */
+/* ************************ */
+#if defined (att386)
+#  define M_MACHINE "att386"
+#  define M_OS "USG"
+#  undef HAVE_GETWD
+   /* Alloca requires either Gcc or cc with libPW.a. */
+#  if !defined (HAVE_GCC)
+#    define REQUIRED_LIBRARIES -lPW
+#  endif /* HAVE_GCC */
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+   /* For an AT&T Unix before V.3 take out the -DUSGr3 and the HAVE_DIRENT. */
+#  define SYSDEP_CFLAGS -DUSGr3
+#  define HAVE_DIRENT
+#endif /* att386 */
+
+/* ************************ */
+/*                         */
+/*      ATT UNIX PC        */
+/*                         */
+/* ************************ */
+#if defined (unixpc)
+#  define M_MACHINE "unixpc"
+#  define M_OS "USG"
+#  define HAVE_VPRINTF
+#  define HAVE_DIRENT
+#  if defined (HAVE_GCC)
+#    define REQUIRED_LIBRARIES -ldirent -shlib
+#  else /* !HAVE_GCC */
+#    define REQUIRED_LIBRARIES -ldirent
+#  endif /* !HAVE_GCC */
+#  undef HAVE_GETWD
+#  undef HAVE_DUP2
+#  undef VOID_SIGHANDLER
+#  undef HAVE_WAIT_H
+#endif /* unixpc */
+
+/* ************************ */
+/*                         */
+/*         Encore          */
+/*                         */
+/* ************************ */
+#if defined (MULTIMAX)
+#  if defined (n16)
+#    define M_MACHINE "Multimax32k"
+#  else
+#    define M_MACHINE "Multimax"
+#  endif /* n16 */
+#  if defined (UMAXV)
+#    define M_OS "USG"
+#    define REQUIRED_LIBRARIES -lPW
+#    define SYSDEP_CFLAGS -DUSGr3
+#    define HAVE_DIRENT
+#    define HAVE_VPRINTF
+#    define USE_TERMCAP_EMULATION
+#    define VOID_SIGHANDLER
+#  else
+#    if defined (CMU)
+#      define M_OS "Mach"
+#    else
+#      define M_OS "Bsd"
+#    endif /* CMU */
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_STRERROR
+#    define HAVE_SETLINEBUF
+#  endif /* UMAXV */
+#  define HAVE_GETGROUPS
+#endif  /* MULTIMAX */
+
+/* ******************************************** */
+/*                                             */
+/*   Encore Series 91 (88K BCS w Job Control)  */
+/*                                             */
+/* ******************************************** */
+#if defined (__m88k) && defined (__UMAXV__)
+#  define M_MACHINE "Gemini"
+#  define M_OS "USG"
+#  define REQUIRED_LIBRARIES -lPW
+#  define USE_TERMCAP_EMULATION
+#  define HAVE_DIRENT
+#  define HAVE_GETGROUPS
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define SYSDEP_CFLAGS -q ext=pcc -D_POSIX_JOB_CONTROL -D_POSIX_VERSION \
+                       -Dmalloc=_malloc -Dfree=_free -Drealloc=_realloc
+#endif  /* m88k && __UMAXV__ */
+
+/* ******************************************** */
+/*                                             */
+/*    System V Release 4 on the ICL DRS6000     */
+/*                                             */
+/* ******************************************** */
+#if defined (drs6000)
+#  define M_MACHINE "drs6000"
+#  define M_OS "USG"
+#  define SYSDEP_CFLAGS -Xa -DUSGr4
+#  define SEARCH_LIB_NEEDS_SPACE
+#  define HAVE_DIRENT
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_VPRINTF
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  define VOID_SIGHANDLER
+#  define USE_GNU_TERMCAP
+#  if !defined (__GNUC__)
+#    undef HAVE_ALLOCA
+#  endif
+#  undef HAVE_ALLOCA_H
+#  undef USE_GNU_MALLOC
+#endif /* drs6000 */
+
+/* ******************************************** */
+/*                                             */
+/*   System V Release 4 on the Sparc (generic)  */
+/*                                             */
+/* ******************************************** */
+#if defined (sparc) && defined (__svr4__) && !defined (M_MACHINE)
+#  define M_MACHINE "sparc"
+#  define M_OS "SVR4"
+#  define SYSDEP_CFLAGS -DUSG -DUSGr4 -DHAVE_UID_T
+#  define HAVE_DIRENT
+#  define HAVE_VPRINTF
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  define VOID_SIGHANDLER
+#  define USE_GNU_TERMCAP
+#  if !defined (__GNUC__)
+#    undef HAVE_ALLOCA
+#  endif
+#  undef HAVE_BCOPY
+#  undef HAVE_GETWD
+#  undef USE_GNU_MALLOC
+#endif /* sparc && __svr4__ */
+
+/* ******************* */
+/*                    */
+/*   Commodore Amiga   */
+/*                    */
+/* ******************* */
+#if defined (amiga) && defined (__NetBSD__)
+#  define M_MACHINE "amiga"
+#  define M_OS "NetBSD"
+#  define SYSDEP_CFLAGS -DOPENDIR_NOT_ROBUST -DINT_GROUPS_ARRAY \
+                       -DRLIMTYPE=quad_t
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#  define HAVE_VPRINTF
+#  define HAVE_STRERROR
+#  define VOID_SIGHANDLER
+#  define HAVE_DIRENT
+#  define HAVE_STRCASECMP
+#endif /* amiga && __NetBSD__ */
+
+#if defined (amiga) && !defined (M_MACHINE)
+#  define M_MACHINE "amiga"
+#  define M_OS "USG"
+#  define SYSDEP_CFLAGS -DUSGr4
+#  if !defined (HAVE_GCC)
+#    define EXTRA_LIB_SEARCH_PATH /usr/ucblib
+#    define REQUIRED_LIBRARIES -lc -lucb
+#  endif /* !HAVE_GCC */
+#  define HAVE_DIRENT
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  undef HAVE_GETWD
+#  undef USE_GNU_MALLOC
+#endif /* System V Release 4 on amiga */
+
+/* ************************ */
+/*                         */
+/*         clipper         */
+/*                         */
+/* ************************ */
+/* This is for the Orion 1/05 (A BSD 4.2 box based on a Clipper processor) */
+#if defined (clipper) && !defined (M_MACHINE)
+#  define M_MACHINE "clipper"
+#  define M_OS "Bsd"
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#endif  /* clipper */
+
+/* ******************************** */
+/*                                 */
+/*    Integrated Solutions 68020?   */
+/*                                 */
+/* ******************************** */
+#if defined (is68k)
+#  define M_MACHINE "is68k"
+#  define M_OS "Bsd"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#  define USE_VFPRINTF_EMULATION
+#  undef HAVE_ALLOCA
+#endif /* is68k */
+
+/* ******************************** */
+/*                                 */
+/*        Omron Luna/Mach 2.5      */
+/*                                 */
+/* ******************************** */
+#if defined (luna88k)
+#  define M_MACHINE "Luna88k"
+#  define M_OS "Bsd"
+#  define HAVE_SYS_SIGLIST
+#  define USE_GNU_MALLOC
+#  define HAVE_SETLINEBUF
+#  define HAVE_VPRINTF
+#  define HAVE_GETGROUPS
+#  define HAVE_VPRINTF
+#endif /* luna88k */
+
+/* ************************ */
+/*                         */
+/*   BBN Butterfly GP1000   */
+/*   Mach 1000 v2.5        */
+/*                         */
+/* ************************ */
+#if defined (butterfly) && defined (BFLY1)
+#define M_MACHINE "BBN Butterfly"
+#define M_OS "Mach 1000"
+#define HAVE_SETLINEBUF
+#define HAVE_SYS_SIGLIST
+#define HAVE_GETGROUPS
+#define HAVE_VPRINTF
+#  ifdef BUILDING_MAKEFILE
+MAKE = make
+#  endif /* BUILDING_MAKEFILE */
+#endif /* butterfly */
+
+/* **************************************** */
+/*                                         */
+/*         Apollo/SR10.2/BSD4.3            */
+/*                                         */
+/* **************************************** */
+/* This is for the Apollo DN3500 running SR10.2 BSD4.3 */
+#if defined (apollo)
+#  define M_MACHINE "apollo"
+#  define M_OS "Bsd"
+#  define SYSDEP_CFLAGS -D_POSIX_VERSION -D_INCLUDE_BSD_SOURCE \
+                       -D_INCLUDE_POSIX_SOURCE -DTERMIOS_MISSING \
+                       -DHAVE_BSD_PGRP -Dpid_t=int
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#endif /* apollo */
+
+/* ************************ */
+/*                         */
+/*     DG AViiON           */
+/*                         */
+/* ************************ */
+/* This is for the DG AViiON box (runs DG/UX with both AT&T & BSD features.) */
+/* DG/UX comes standard with Gcc. */
+#if defined (__DGUX__) || defined (DGUX)
+#  define M_OS "DGUX"
+#  if !defined (_M88KBCS_TARGET)
+#    define M_MACHINE "AViiON"
+#    define REQUIRED_LIBRARIES -ldgc
+#  else /* _M88KBCS_TARGET */
+#    define M_MACHINE "m88kBCS_AV"
+#    undef MACHINE_CFLAGS
+#    define MACHINE_CFLAGS -D_M88K_SOURCE
+#    undef HAVE_RESOURCE
+#  endif /* _M88KBCS_TARGET */
+#  define SYSDEP_CFLAGS MACHINE_CFLAGS -D_DGUX_SOURCE -DPGRP_PIPE -DUSG
+#  define HAVE_GCC
+#  define HAVE_FIXED_INCLUDES
+#  define HAVE_STRERROR
+#  define HAVE_GETGROUPS
+#  define VOID_SIGHANDLER
+#  undef HAVE_GETWD
+#  undef USE_GNU_MALLOC
+
+/* If you want to build bash for M88K BCS compliance on a DG/UX 5.4
+   or above system, do the following:
+     - If you have built in this directory before run "make clean" to
+       endure the Bash directory is clean.
+     - Run "eval `sde-target m88kbcs`" to set the software development
+       environment to build BCS objects.
+     - Run "make".
+     - Do "eval `sde-target default`" to reset the SDE. */
+#endif /* __DGUX__ */
+
+/* ************************ */
+/*                         */
+/*    Harris Night Hawk            */
+/*                         */
+/* ************************ */
+/* This is for the Harris Night Hawk family. */
+#if defined (_CX_UX)
+#  if defined (_M88K)
+#    define M_MACHINE "nh4000"
+#  else /* !_M88K */
+#    if defined (hcx)
+#      define M_MACHINE "nh2000"
+#    else /* !hcx */
+#      if defined (gcx)
+#        define M_MACHINE "nh3000"
+#      endif /* gcx */
+#    endif /* !hcx */
+#  endif /* !_M88K */
+#  define M_OS "USG"
+#  define SYSDEP_CFLAGS -g -Xa -v -Dgetwd=bash_getwd -D_POSIX_SOURCE \
+                       -D_POSIX_JOB_CONTROL
+#  define USE_TERMCAP_EMULATION
+#  define HAVE_VPRINTF
+#  define HAVE_GETGROUPS
+#  define VOID_SIGHANDLER
+#  undef USE_GNU_MALLOC
+#  undef HAVE_GETWD
+#endif /* _CX_UX */
+
+/* **************************************** */
+/*                                         */
+/*             Tektronix                   */
+/*                                         */
+/* **************************************** */
+/* These are unproven as yet. */
+#if defined (Tek4132)
+#  define M_MACHINE "Tek4132"
+#  define M_OS "Bsd"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#endif /* Tek4132 */
+
+#if defined (Tek4300)
+#  define M_MACHINE "Tek4300"
+#  define M_OS "Bsd"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#endif /* Tek4300 */
+
+/* ************************ */
+/*                          */
+/*     Tektronix XD88       */
+/*                          */
+/* ************************ */
+#if defined (m88k) && defined (XD88)
+#  define M_MACHINE "XD88"
+#  define M_OS "USG"
+#  define HAVE_DIRENT
+#  define HAVE_VPRINTF
+#  define HAVE_GETCWD
+#  define VOID_SIGHANDLER
+#  define HAVE_GETGROUPS
+#  undef HAVE_GETWD
+#  undef HAVE_ALLOCA
+#endif /* m88k && XD88 */
+
+/* ************************ */
+/*                          */
+/*     Motorola M88100      */
+/*                          */
+/* ************************ */
+#if defined (m88k) && (defined (M88100) || defined (USGr4))
+#  define M_MACHINE "M88100"
+#  define M_OS "USG"
+#  if defined (USGr4)
+#    define SYSDEP_CFLAGS -DUSGr4 -D_POSIX_JOB_CONTROL
+#  else
+#    define SYSDEP_CFLAGS -D_POSIX_JOB_CONTROL
+#  endif
+#  define HAVE_DIRENT
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define HAVE_GETGROUPS
+#  undef HAVE_GETWD
+#  if !defined (USGr4)
+#    undef HAVE_GETCWD
+#  endif
+#  undef HAVE_ALLOCA
+#endif /* m88k && M88100 */
+
+/* ************************ */
+/*                         */
+/*     Sequent Balances     */
+/*       (Dynix 3.x)       */
+/* ************************ */
+#if defined (sequent) && !defined (M_MACHINE)
+#  define M_MACHINE "Sequent"
+#  define M_OS "Bsd"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_SETLINEBUF
+#  define HAVE_GETGROUPS
+#  define LD_HAS_NO_DASH_L
+#  undef HAVE_DUP2
+#endif /* sequent */
+
+/* ****************************************** */
+/*                                           */
+/*    NCR Tower 32, System V Release 3       */
+/*                                           */
+/* ****************************************** */
+#if defined (tower32)
+#  define M_MACHINE "tower32"
+#  define M_OS "USG"
+#  if !defined (HAVE_GCC)
+#    define REQUIRED_LIBRARIES -lPW
+     /* Disable stack/frame-pointer optimization, incompatible with alloca */
+#    undef MACHINE_CFLAGS
+#    define MACHINE_CFLAGS -W2,-aat
+#  endif /* !HAVE_GCC */
+#  define SYSDEP_CFLAGS -DUSGr3 MACHINE_CFLAGS
+#  define HAVE_VPRINTF
+#  define USE_TERMCAP_EMULATION
+#  define VOID_SIGHANDLER
+#  undef HAVE_GETWD
+#endif /* tower32 */
+
+/* ************************ */
+/*                         */
+/*     Concurrent          */
+/*                         */
+/* ************************ */
+#if defined (concurrent)
+#  define M_MACHINE "Concurrent"
+#  if defined (USE_BSD_UNIVERSE)
+     /* Use the BSD universe (`universe ucb') */
+#    define M_OS "Bsd"
+#    define HAVE_SYS_SIGLIST
+#    define HAVE_SETLINEBUF
+#    define HAVE_GETGROUPS
+#  else /* !USE_BSD_UNIVERSE */
+   /* Concurrent 7000 with RTU 6.1A using the ATT universe (`universe att') */
+#    define M_OS "USG"
+#    define SYSDEP_CFLAGS -DHAVE_BCOPY -DHAVE_UID_T -DHAVE_GETDTABLESIZE -Dmc7000
+#    define REQUIRED_LIBRARIES -ljobs
+#    define HAVE_VPRINTF
+#    define HAVE_GETGROUPS
+#    define HAVE_DUP2
+#    define HAVE_DIRENT
+#    define HAVE_SYS_SIGLIST
+#  endif /* !USE_BSD_UNIVERSE */
+#endif /* concurrent */
+
+/* **************************************************************** */
+/*                                                                  */
+/*             Honeywell Bull X20 (lele@idea.sublink.org)          */
+/*                                                                  */
+/* **************************************************************** */
+#if defined (hbullx20)
+#  define M_MACHINE "Honeywell"
+#  define M_OS "USG"
+#  define SYSDEP_CFLAGS -DUSG
+   /* Bull x20 needs -lposix for struct dirent. */
+#  define REQUIRED_LIBRARIES -lPW -lposix
+#  define HAVE_DIRENT
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define USE_TERMCAP_EMULATION
+#  undef HAVE_GETWD
+#endif  /* hbullx20 */
+
+/* **************************************************************** */
+/*                                                                  */
+/*             Bull DPX2 (F.Pierresteguy@frcl.bull.fr)              */
+/*                                                                  */
+/* **************************************************************** */
+#if defined (DPX2)
+#  define M_MACHINE "DPX2"
+#  define M_OS "USG"
+#  define SYSDEP_CFLAGS -DUSG -DUSGr3 -DHAVE_BCOPY -DHAVE_UID_T -D_POSIX_JOB_CONTROL
+/* #  define REQUIRED_LIBRARIES -lPW -lposix */
+#  define HAVE_DIRENT
+#  define VOID_SIGHANDLER
+#  define HAVE_POSIX_SIGNALS
+#  define HAVE_VPRINTF
+#  define HAVE_SETVBUF
+#  define HAVE_STRERROR
+#  define HAVE_GETGROUPS
+#  define HAVE_GETDTABLESIZE
+#  define USE_TERMCAP_EMULATION
+#endif  /* DPX2 */
+
+/* ************************ */
+/*                         */
+/*         CRAY            */
+/*                         */
+/* ************************ */
+#if defined (cray)
+#  include <sys/param.h>
+#  if defined (Cray1) || defined (Cray2)
+#    define M_MACHINE "Cray"
+#    define CRAY_STACK
+#  endif
+#  if defined (CrayXMP) && !defined (M_MACHINE)
+#    define M_MACHINE "CrayXMP"
+#    define CRAY_STACK -DCRAY_STACKSEG_END=getb67
+#  endif
+#  if defined (CrayYMP) && !defined (M_MACHINE)
+#    define M_MACHINE "CrayYMP"
+#    if RELEASE_LEVEL >= 7000
+#      define CRAY_STACK -DCRAY_STACKSEG_END=_getb67
+#    else
+#      define CRAY_STACK -DCRAY_STACKSEG_END=getb67
+#    endif /* RELEASE_LEVEL < 7000 */
+#  endif
+#  if !defined (M_MACHINE)
+#    define M_MACHINE "Cray"
+#    define CRAY_STACK
+#  endif
+#  define M_OS "Unicos"
+#  define SYSDEP_CFLAGS -DUSG -DPGRP_PIPE -DOPENDIR_NOT_ROBUST \
+                       -DHAVE_BCOPY CRAY_STACK
+#  define HAVE_VPRINTF
+#  define HAVE_MULTIPLE_GROUPS
+#  define VOID_SIGHANDLER
+#  define USE_TERMCAP_EMULATION
+#  undef HAVE_ALLOCA
+#  undef HAVE_RESOURCE
+#  undef USE_GNU_MALLOC
+#endif /* cray */
+
+/* ************************ */
+/*                         */
+/*     MagicStation        */
+/*                         */
+/* ************************ */
+#if defined (MagicStation)
+#  define M_MACHINE "MagicStation"
+#  define M_OS "USG"
+#  define SYSDEP_CFLAGS -DUSGr4
+#  define HAVE_DIRENT
+#  define HAVE_GETGROUPS
+#  define HAVE_STRERROR
+#  define VOID_SIGHANDLER
+#  undef HAVE_ALLOCA
+#  undef HAVE_GETWD
+#endif /* MagicStation */
+
+/* ************************ */
+/*                         */
+/*        Plexus           */
+/*                         */
+/* ************************ */
+#if defined (plexus)
+#  define M_MACHINE "plexus"
+#  define M_OS "USG"
+#  define REQUIRED_LIBRARIES -lndir
+#  define USE_TERMCAP_EMULATION
+#  undef HAVE_DUP2
+#  undef HAVE_GETWD
+#  define HAVE_VPRINTF
+#  undef HAVE_ALLOCA           /* -lPW doesn't work w/bash-cc? */
+#endif /* plexus */
+
+/* ************************ */
+/*                         */   
+/*     Siemens MX500        */
+/*      (SINIX 5.2x)       */
+/* ************************ */
+#if defined (sinix)
+#define M_MACHINE "Siemens MX500"
+#define M_OS "SINIX V5.2x"
+#define USG
+#define HAVE_GETCWD
+#define VOID_SIGHANDLER
+#define HAVE_STRERROR
+#define HAVE_GETGROUPS
+#define HAVE_VPRINTF
+#define HAVE_POSIX_SIGNALS
+#define HAVE_RESOURCE
+#define USE_GNU_MALLOC
+#define SYSDEP_CFLAGS -DUSGr3 -DUSG
+#define REQUIRED_LIBRARIES syscalls.o
+#undef HAVE_ALLOCA
+#undef HAVE_GETWD
+#endif /* sinix */
+
+/* ************************ */
+/*                         */
+/*  Symmetric 375 (4.2 BSD) */
+/*                         */
+/* ************************ */
+#if defined (scs) && !defined (M_MACHINE)
+#  define M_MACHINE "Symmetric_375"
+#  define M_OS "Bsd"
+#  define HAVE_SYS_SIGLIST
+#  define HAVE_GETGROUPS
+#  define HAVE_SETLINEBUF
+#  define USE_VFPRINTF_EMULATION
+#  define USE_GNU_MALLOC
+#  undef HAVE_STRCHR
+#endif /* scs */
+
+/* ************************ */
+/*                         */
+/*    Tandem running SVR3   */
+/*                         */
+/* ************************ */
+#if defined (tandem) && !defined (M_MACHINE)
+#  define M_MACHINE "tandem"
+#  define M_OS "USG"
+#  define SYSDEP_CFLAGS -DUSGr3
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+   /* Alloca requires either Gcc or cc with libPW.a */
+#  if !defined (HAVE_GCC)
+#    define REQUIRED_LIBRARIES -lPW
+#  endif /* !HAVE_GCC */
+#  undef HAVE_GETWD
+#endif /* Tandem running SVR3 */
+
+/* ****************** */
+/*                    */
+/*     Amdahl UTS     */
+/*                    */
+/* ****************** */
+
+#if defined (UTS)
+#  define M_MACHINE "uts"
+#  define M_OS "systemV"
+#  define SYSDEP_CFLAGS -DUSG -DMEMMOVE_MISSING
+#  define REQUIRED_LIBRARIES
+#  undef HAVE_SYS_SIGLIST
+#  undef HAVE_GETWD
+#  undef HAVE_ALLOCA
+#  define HAVE_VPRINTF
+#  define HAVE_DIRENT
+#  undef HAVE_RESOURCE
+#endif  /* UTS */
+
+/* ************************ */
+/*                         */
+/*    PCS Cadmus System            */
+/*                         */
+/* ************************ */
+#if defined (cadmus) && !defined (M_MACHINE)
+#  define M_MACHINE "cadmus"
+#  define M_OS "BrainDeath"
+#  define SYSDEP_CFLAGS -DUSG
+#  define HAVE_DIRENT
+#  define HAVE_VPRINTF
+#  define VOID_SIGHANDLER
+#  define USE_TERMCAP_EMULATION
+#  undef HAVE_GETWD
+#  undef HAVE_ALLOCA
+#  undef HAVE_WAIT_H
+#endif /* cadmus */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Generic Entry                               */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Use this entry for your machine if it isn't represented here.  It
+   is loosely based on a Vax running 4.3 BSD. */
+
+#if !defined (M_MACHINE)
+#  define UNKNOWN_MACHINE
+#endif
+
+#if defined (UNKNOWN_MACHINE)
+#  define M_MACHINE "UNKNOWN_MACHINE"
+#  define M_OS "UNKNOWN_OS"
+
+/* Required libraries for building on this system. */
+#  define REQUIRED_LIBRARIES
+
+/* Define HAVE_SYS_SIGLIST if your system has sys_siglist[]. */
+#  define HAVE_SYS_SIGLIST
+
+/* Undef HAVE_GETWD if your C library does not provide a working version
+   of getwd(). */
+/* #  undef HAVE_GETWD */
+
+/* Undef HAVE_GETCWD if your C library does not provide a working version
+   of getcwd(). */
+/* #  undef HAVE_GETCWD */
+
+/* Undef HAVE_ALLOCA if you are not using Gcc, and neither your library
+   nor compiler has a version of alloca ().  In that case, we will use
+   our version of alloca () in alloca.c */
+/* #  undef HAVE_ALLOCA */
+
+/* Undef USE_GNU_MALLOC if there appear to be library conflicts, or if you
+   especially desire to use your OS's version of malloc () and friends.  We
+   reccommend against this because GNU Malloc has debugging code built in. */
+/* #  undef USE_GNU_MALLOC */
+
+/* Define USE_GNU_TERMCAP if you want to use the GNU termcap library
+   instead of your system termcap library. */
+/* #  define USE_GNU_TERMCAP */
+
+/* Define HAVE_SETLINEBUF if your machine has the setlinebuf ()
+   stream library call.  Otherwise, setvbuf () will be used.  If
+   neither of them work, you can edit in your own buffer control
+   based upon your machines capabilities. */
+#  define HAVE_SETLINEBUF
+
+/* Define HAVE_VPRINTF if your machines has the vfprintf () library
+   call.  Otherwise, printf will be used.  */
+#  define HAVE_VPRINTF
+
+/* Define USE_VFPRINTF_EMULATION if you want to use the BSD-compatible
+   vfprintf() emulation in vprint.c. */
+/* #  define USE_VFPRINTF_EMULATION */
+
+/* Define HAVE_GETGROUPS if your OS allows you to be in multiple
+   groups simultaneously by supporting the `getgroups' system call. */
+#  define HAVE_GETGROUPS
+
+/* Define SYSDEP_CFLAGS to be the flags to cc that make your compiler
+   work.  For example, `-ma' on the RT makes alloca () work. */
+/* This is a summary of the semi-machine-independent definitions that
+   can go into SYSDEP_CFLAGS:
+
+       AFS     -       The Andrew File System is being used
+       AFS_CREATE_BUG - AFS has a bug with file creation if O_CREAT is
+                        specified
+       BROKEN_SIGSUSPEND - sigsuspend(2) does not work to wake up processes
+                           on SIGCHLD
+       HAVE_BSD_PGRP - getpgrp(2) takes a pid argument, a la 4.3 BSD
+       HAVE_BCOPY -    bcopy(3) exists and works as in BSD
+       HAVE_GETDTABLESIZE - getdtablesize(2) exists and works correctly
+       HAVE_GETHOSTNAME - gethostname(2) or gethostname(3) is present and
+                          works as in BSD
+       HAVE_GETPW_DECLS - USG machines with the getpw* functions defined in
+                          <pwd.h> that cannot handle redefinitions in the
+                          bash source
+       HAVE_RESOURCE - <sys/resource.h> and [gs]rlimit exist and work
+       HAVE_SETDTABLESIZE - setdtablesize(2) exists and works correctly
+       HAVE_SOCKETS - this system has BSD sockets added to a System V base
+       HAVE_UID_T -    Definitions for uid_t and gid_t are in <sys/types.h>
+       INT_GROUPS_ARRAY - the second argument to getgroups(3) is an array
+                          of integers
+       MEMMOVE_MISSING - the system does not have memmove(3)
+       MKFIFO_MISSING - named pipes do not work or mkfifo(3) is missing
+       NO_DEV_TTY_JOB_CONTROL - system can't do job control on /dev/tty
+       SBRK_DECLARED - don't declare sbrk as extern char *sbrk() in
+                      lib/malloc/malloc.c
+       OPENDIR_NOT_ROBUST - opendir(3) allows you to open non-directory files
+       PGRP_PIPE -     Requires parent-child synchronization via pipes to
+                       make job control work right
+       SETVBUF_REVERSED - brain-damaged implementation of setvbuf that
+                               has args 2 and 3 reversed from the SVID and
+                               ANSI standard
+       RLOGIN_PGRP_BUG - processes started by rlogind have a process group
+                         of 0
+       TERMIOS_LDISC - system has a c_line line discipline member in struct
+                       termios
+       TERMIOS_MISSING - the termios(3) functions are not present or don't
+                         work, even though _POSIX_VERSION is defined
+       USG     -       The machine is running some sort of System V Unix
+       USGr3   -       The machine is running SVR3.x
+       USGr4   -       The machine is running SVR4
+       USGr4_2 -       The machine is running SVR4.2
+
+       Some other machine-dependent options:
+       CPCC    -       Dynix
+       NLS     -       Alpha, AIX
+       _BSD    -       Alpha
+       _DGUX_SOURCE -  DG/UX
+       _INCLUDE_BSD_SOURCE - Apollo
+       _INCLUDE_POSIX_SOURCE - Apollo
+
+       Posix.1 options that are normally set in <unistd.h>:
+       _POSIX_VERSION -        Encore, Apollo
+       _POSIX_SOURCE - ISC, QNX, Harris
+       _POSIX_JOB_CONTROL - NEC EWS, Encore, Harris, Motorola, Bull
+*/
+#  define SYSDEP_CFLAGS
+
+/* Define HAVE_STRERROR if your system supplies a definition for strerror ()
+   in the C library, or a macro in a header file. */
+/* #  define HAVE_STRERROR */
+
+/* Define HAVE_STRCASECMP if your system supplies definitions for the
+   casel-insensitive string comparison functions strcasecmp and strncasemp
+   in the C library or one of the system header files. */
+/* #  define HAVE_STRCASECMP */
+
+/* Define HAVE_DIRENT if you have the dirent library and a definition of
+   struct dirent.  If not, the BSD directory reading library and struct
+   direct are assumed. */
+/* #  define HAVE_DIRENT */
+
+/* If your system does not supply /usr/lib/libtermcap.a, but includes
+   the termcap routines as a part of the curses library, then define
+   this.  This is the case on some System V machines. */
+/* #  define USE_TERMCAP_EMULATION */
+
+/* Define VOID_SIGHANDLER if your system's signal () returns a pointer to
+   a function returning void. */
+/* #  define VOID_SIGHANDLER */
+
+/* Define EXTRA_LIB_SEARCH_PATH if your required libraries (or standard)
+   ones for that matter) are not normally in the ld search path.  For
+   example, some machines require /usr/ucblib in the ld search path so
+   that they can use -lucb. */
+/* #  define EXTRA_LIB_SEARCH_PATH /usr/ucblib */
+
+/* Define SEARCH_LIB_NEEDS_SPACE if your native ld requires a space after
+   the -L argument, which gives the name of an alternate directory to search
+   for libraries specified with -llib.  For example, the HPUX ld requires
+   this:
+       -L lib/readline -lreadline
+   instead of:
+       -Llib/readline -lreadline
+ */
+/* #  define SEARCH_LIB_NEEDS_SPACE */
+
+/* Define LD_HAS_NO_DASH_L if your ld can't grok the -L flag in any way, or
+   if it cannot grok the -l<lib> flag, or both. */
+/* #  define LD_HAS_NO_DASH_L */
+
+/* Define GCC_STANDARD if the standard `cc' is gcc and you don't want
+   to use the compiler named `gcc' for some reason. */
+/* #  define GCC_STANDARD */
+   
+#  if defined (LD_HAS_NO_DASH_L)
+#   undef SEARCH_LIB_NEEDS_SPACE
+#  endif /* LD_HAS_NO_DASH_L */
+
+#endif  /* UNKNOWN_MACHINE */
diff --git a/CWRU/old-conf/support/cat-s b/CWRU/old-conf/support/cat-s
new file mode 100644 (file)
index 0000000..87ba163
--- /dev/null
@@ -0,0 +1,16 @@
+# This awk script is called from within Makefile to strip multiple blank
+# lines from stdin.
+BEGIN { newlines = 0 }
+{
+  if (NF == 0)
+    newlines = 1;
+  else
+    {
+      if (newlines)
+       {
+         printf "\n";
+         newlines = 0;
+       }
+      print $0;
+    }
+}
diff --git a/CWRU/old-conf/support/cppmagic b/CWRU/old-conf/support/cppmagic
new file mode 100755 (executable)
index 0000000..b0a951c
--- /dev/null
@@ -0,0 +1,51 @@
+#!/bin/sh
+# Return a full cpp specification, complete with system dependent flags.
+#
+# Syntax: cppmagic [ program-to-generate-flags [ guessed-cpp ]]
+#
+# If only one arg is present it is the name of a program to invoke
+# which should generate -Dfoo defines.
+#
+# If two args are present the second arg is the name of the C
+# preprocessor to use.
+#
+# Invoked with no args, provides a C preprocessor name and
+# -traditional flag if that is appropriate.
+#
+#  ../Makefile calls this file thusly: "cppmagic getcppsyms".
+#
+#  Typical output:
+#
+#    /lib/cpp -Dunix -Dm68k
+#
+
+Cpp=
+
+if [ "$2" ]; then
+   Cpp=$2
+else
+   for cpp in /lib/cpp /usr/lib/cpp /usr/ccs/lib/cpp; do
+      if [ -f $cpp ]; then
+        Cpp=$cpp
+      fi
+   done
+   if [ "$Cpp" = "" ]; then
+      Cpp=cpp
+   fi
+fi
+
+TRADITIONAL=
+FLAGS=
+
+# First flag might be `-traditional' if this is Gnu Cpp.
+unknown_flag=`$Cpp -traditional /dev/null 2>&1 |
+               egrep 'known|recognized|valid|bad|legal'`
+if [ "$unknown_flag" = "" ]; then
+  TRADITIONAL=-traditional
+fi
+
+if [ "$1" ]; then
+   FLAGS=`$1`
+fi
+
+echo $Cpp $TRADITIONAL $FLAGS
diff --git a/CWRU/old-conf/support/getcppsyms.c b/CWRU/old-conf/support/getcppsyms.c
new file mode 100644 (file)
index 0000000..e4cb044
--- /dev/null
@@ -0,0 +1,427 @@
+/* getcppsyms.c - Find unique compiler symbols. */
+
+/* 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. */
+
+/* Some cpp's do not define any symbols, but instead let /bin/cc do it
+   for them.  For such machines, running this file may prove useful.  It
+   outputs the list of symbols which /bin/cc or /lib/cpp define and which
+   we had the foresight to guess at. */
+
+#include <stdio.h>
+
+int
+main ()
+{
+#if defined (__BSD_4_4__)
+  printf ("-D__BSD_4_4__");
+#endif /* __BSD_4_4__ */
+#if defined (CMU)
+  printf (" -DCMU");
+#endif /* CMU */
+#if defined (_COFF)
+  printf (" -D_COFF");
+#endif /* _COFF */
+#if defined (DGUX)
+  printf (" -DDGUX");
+#endif /* DGUX */
+#if defined (GOULD_PN)
+  printf (" -DGOULD_PN");
+#endif /* GOULD_PN */
+#if defined (MACH)
+  printf (" -DMACH");
+#endif /* MACH */
+#if defined (MIPSEB)
+  printf (" -DMIPSEB");
+#endif /* MIPSEB */
+#if defined (MIPSEL)
+  printf (" -DMIPSEL");
+#endif /* MIPSEL */
+#if defined (MULTIMAX)
+  printf (" -DMULTIMAX");
+#endif /* MULTIMAX */
+#if defined (M_UNIX)
+  printf (" -DM_UNIX");
+#endif /* M_UNIX */
+#if defined (M_XENIX)
+  printf (" -DM_XENIX");
+#endif /* M_XENIX */
+#if defined (_M_XENIX)
+  printf (" -D_M_XENIX");
+#endif /* _M_XENIX */
+#if defined (NeXT)
+  printf (" -DNeXT");
+#endif /* NeXT */
+#if defined (__PARAGON__)
+  printf (" -D__PARAGON__");
+#endif /* __PARAGON__ */
+#if defined (_PGC_)
+  printf (" -D_PGC_");
+#endif /* _PGC_ */
+#if defined (__PGC__)
+  printf (" -D__PGC__");
+#endif /* __PGC__ */
+#if defined (RES)
+  printf (" -DRES");
+#endif /* RES */
+#if defined (RISC6000)
+  printf (" -DRISC6000");
+#endif /* RISC6000 */
+#if defined (RT)
+  printf (" -DRT");
+#endif /* RT */
+#if defined (SYSTYPE_BSD)
+  printf (" -DSYSTYPE_BSD");
+#endif /* SYSTYPE_BSD */
+#if defined (SYSTYPE_SYSV)
+  printf (" -DSYSTYPE_SYSV");
+#endif /* SYSTYPE_SYSV */
+#if defined (Sun386i)
+  printf (" -DSun386i");
+#endif /* Sun386i */
+#if defined (Tek4132)
+  printf (" -DTek4132");
+#endif /* Tek4132 */
+#if defined (Tek4300)
+  printf (" -DTek4300");
+#endif /* Tek4300 */
+#if defined (UMAXV)
+  printf (" -DUMAXV");
+#endif /* UMAXV */
+#if defined (USGr4)
+  printf (" -DUSGr4");
+#endif /* USGr4 */
+#if defined (USGr4_2)
+  printf (" -DUSGr4_2");
+#endif /* USGr4_2 */
+#if defined (__SVR4_2__)
+  printf (" -D__SVR4_2__");
+#endif /* __SVR4_2__ */
+#if defined (Xenix286)
+  printf (" -DXenix286");
+#endif /* Xenix286 */
+#if defined (_AIX)
+  printf (" -D_AIX");
+#endif /* _AIX */
+#if defined (_AIX370)
+  printf (" -D_AIX370");
+#endif /* _AIX370 */
+#if defined (_IBMESA)
+  printf (" -D_IBMESA");
+#endif /* _IBMESA */
+#if defined (__ibmesa)
+  printf (" -D__ibmesa");
+#endif /* __ibmesa */
+#if defined (_U370)
+  printf (" -D_U370");
+#endif /* _U370 */
+#if defined (_NLS)
+  printf (" -D_NLS");
+#endif /* _NLS */
+#if defined (_CX_UX)
+  printf (" -D_CX_UX");
+#endif /* _CX_UX */
+#if defined (_IBMR2)
+  printf (" -D_IBMR2");
+#endif /* _IBMR2 */
+#if defined (_M88K)
+  printf (" -D_M88K");
+#endif /* _M88K */
+#if defined (_M88KBCS_TARGET)
+  printf (" -D_M88KBCS_TARGET");
+#endif /* _M88KBCS_TARGET */
+#if defined (__DGUX__)
+  printf (" -D__DGUX__");
+#endif /* __DGUX__ */
+#if defined (__UMAXV__)
+  printf (" -D__UMAXV__");
+#endif /* __UMAXV__ */
+#if defined (__m88k)
+  printf (" -D__m88k");
+#endif /* __m88k */
+#if defined (__uxpm__)
+  printf (" -DUSGr4 -Du370 -D__uxpm__");
+#endif /* __uxpm__ */
+#if defined (__uxps__)
+  printf (" -D__svr4__ -D__uxps__");
+#endif /* __uxps__ */
+#if defined (alliant)
+  printf (" -Dalliant");
+#endif /* alliant */
+#if defined (alpha)
+  printf (" -Dalpha");
+#endif /* alpha */
+#if defined (__alpha)
+  printf (" -D__alpha");
+#endif /* __alpha */
+#if defined (aix)
+  printf (" -Daix");
+#endif /* aix */
+#if defined (aixpc)
+  printf (" -Daixpc");
+#endif /* aixpc */
+#if defined (apollo)
+  printf (" -Dapollo");
+#endif /* apollo */
+#if defined (ardent)
+  printf (" -Dardent");
+#endif /* ardent */
+#if defined (att386)
+  printf (" -Datt386");
+#endif /* att386 */
+#if defined (att3b)
+  printf (" -Datt3b");
+#endif /* att3b */
+#if defined (bsd4_2)
+  printf (" -Dbsd4_2");
+#endif /* bsd4_2 */
+#if defined (bsd4_3)
+  printf (" -Dbsd4_3");
+#endif /* bsd4_3 */
+#if defined (__bsdi__)
+  printf (" -D__bsdi__");
+#endif /* __bsdi__ */
+#if defined (bsdi)
+  printf (" -Dbsdi");
+#endif /* bsdi */
+#if defined (__386BSD__)
+  printf (" -D__386BSD__");
+#endif /* __386BSD__ */
+#if defined (cadmus)
+  printf (" -Dcadmus");
+#endif /* cadmus */
+#if defined (clipper)
+  printf (" -Dclipper");
+#endif /* clipper */
+#if defined (concurrent)
+  printf (" -Dconcurrent");
+#endif /* concurrent */
+#if defined (convex) || defined (__convex__) || defined (__convexc__)
+#  if !defined (__GNUC__)
+  printf (" -pcc");
+#  endif /* !__GNUC__ */
+  printf (" -Dconvex");
+#endif /* convex */
+#if defined (dmert)
+  printf (" -Ddmert");
+#endif /* dmert */
+#if defined (gcos)
+  printf (" -Dgcos");
+#endif /* gcos */
+#if defined (gcx)
+  printf (" -Dgcx");
+#endif /* gcx */
+#if defined (gould)
+  printf (" -Dgould");
+#endif /* gould */
+#if defined (hbullx20)
+  printf (" -Dhbullx20");
+#endif /* hbullx20 */
+#if defined (hcx)
+  printf (" -Dhcx");
+#endif /* hcx */
+#if defined (host_mips)
+  printf (" -Dhost_mips");
+#endif /* host_mips */
+#if defined (hp9000) || defined (__hp9000)
+  printf (" -Dhp9000");
+#endif /* hp9000 || __hp9000 */
+#if defined (hp9000s200) || defined (__hp9000s200)
+  printf (" -Dhp9000s200");
+#endif /* hp9000s200 || __hp9000s200 */
+#if defined (hp9000s300) || defined (__hp9000s300)
+  printf (" -Dhp9000s300");
+#endif /* hp9000s300 || __hp9000s300 */
+#if defined (hp9000s500) || defined (__hp9000s500)
+  printf (" -Dhp9000s500");
+#endif /* hp9000s500 || __hp9000s500 */
+#if defined (hp9000s700) || defined (__hp9000s700)
+  printf (" -Dhp9000s700");
+#endif /* hp9000s700 || __hp9000s700 */
+#if defined (hp9000s800) || defined (__hp9000s800)
+  printf (" -Dhp9000s800");
+#endif /* hp9000s800 || __hp9000s800 */
+#if defined (hppa) || defined (__hppa)
+  printf (" -Dhppa");
+#endif /* hppa || __hppa */
+#if defined (hpux) || defined (__hpux)
+  printf (" -Dhpux");
+#endif /* hpux */
+#if defined (__hp_osf)
+  printf (" -D__hp_osf");
+#endif /* __hp_osf */
+#if defined (i386)
+  printf (" -Di386");
+#endif /* i386 */
+#if defined (__i386__)
+  printf (" -D__i386__");
+#endif
+#if defined (__i860)
+  printf(" -D__i860");
+#endif /* __i860 */
+#if defined (__i860__)
+  printf(" -D__i860__");
+#endif /* __i860__ */
+#if defined (ibm)
+  printf (" -Dibm");
+#endif /* ibm */
+#if defined (ibm032)
+  printf (" -Dibm032");
+#endif /* ibm032 */
+#if defined (ibmrt)
+  printf (" -Dibmrt");
+#endif /* ibmrt */
+#if defined (interdata)
+  printf (" -Dinterdata");
+#endif /* interdata */
+#if defined (is68k)
+  printf (" -Dis68k");
+#endif /* is68k */
+#if defined (ksr1)
+  printf (" -Dksr1");
+#endif /* ksr1 */
+#if defined (__ksr1__)
+  printf (" -D__ksr1__");
+#endif /* __ksr1__ */
+#if defined (linux)
+  printf (" -Dlinux");
+#endif /* linux */
+#if defined (__linux__)
+  printf (" -D__linux__");
+#endif /* __linux__ */
+#if defined (luna88k)
+  printf (" -Dluna88k");
+#endif /* luna88k */
+#if defined (m68k)
+  printf (" -Dm68k");
+#endif /* m68k */
+#if defined (m88k)
+  printf (" -Dm88k");
+#endif /* m88k */
+#if defined (mc68010)
+  printf (" -Dmc68010");
+#endif /* mc68010 */
+#if defined (mc68020)
+  printf (" -Dmc68020");
+#endif /* mc68020 */
+#if defined (mc68030)
+  printf (" -Dmc68030");
+#endif /* mc68030 */
+#if defined (mc68040)
+  printf (" -Dmc68040");
+#endif /* mc68040 */
+#if defined (mc68k32)
+  printf (" -Dmc68k32");
+#endif /* mc68k32 */
+#if defined (mips)
+  printf (" -Dmips");
+#endif /* mips */
+#if defined (n16)
+  printf (" -Dn16");
+#endif /* n16 */
+#if defined (ns32000)
+  printf (" -Dns32000");
+#endif /* ns32000 */
+#if defined (os)
+  printf (" -Dos");
+#endif /* os */
+#if defined (osf)
+  printf (" -Dosf");
+#endif /* osf */
+#if defined (__osf__)
+  printf (" -D__osf__");
+#endif /* __osf__ */
+#if defined (__OSF1__)
+  printf(" -D__OSF1__");
+#endif /* __OSF1__ */
+#if defined (pdp11)
+  printf (" -Dpdp11");
+#endif /* pdp11 */
+#if defined (plexus)
+  printf (" -Dplexus")
+#endif /* plexus */
+#if defined (pyr)
+  printf (" -Dpyr");
+#endif /* pyr */
+#if defined (scs)
+  printf (" -Dscs");
+#endif /* scs */
+#if defined (sequent)
+  printf (" -Dsequent");
+#endif /* sequent */
+#if defined (sgi)
+  printf (" -Dsgi");
+#endif /* sgi */
+#if defined (sony)
+  printf (" -Dsony");
+#endif /* sony */
+#if defined (sparc)
+  printf (" -Dsparc");
+#endif /* sparc */
+#if defined (stardent)
+  printf (" -Dstardent");
+#endif /* stardent */
+#if defined (sun)
+  printf (" -Dsun");
+#endif /* sun */
+#if defined (sun2)
+  printf (" -Dsun2");
+#endif /* sun2 */
+#if defined (sun3)
+  printf (" -Dsun3");
+#endif /* sun3 */
+#if defined (sun4)
+  printf (" -Dsun4");
+#endif /* sun4 */
+#if defined (__svr4__)
+  printf (" -D__svr4__");
+#endif /* __svr4__ */
+#if defined (tower32)
+  printf (" -Dtower32");
+#endif /* tower32 */
+#if defined (tss)
+  printf (" -Dtss");
+#endif /* tss */
+#if defined (u370)
+  printf (" -Du370");
+#endif /* u370 */
+#if defined (u3b)
+  printf (" -Du3b");
+#endif /* u3b */
+#if defined (u3b2)
+  printf (" -Du3b2");
+#endif /* u3b2 */
+#if defined (u3b20d)
+  printf (" -Du3b20d");
+#endif /* u3b20d */
+#if defined (u3b5)
+  printf (" -Du3b5");
+#endif /* u3b5 */
+#if defined (ultrix)
+  printf (" -Dultrix");
+#endif /* ultrix */
+#if defined (unix)
+  printf (" -Dunix");
+#endif /* unix */
+#if defined (vax)
+  printf (" -Dvax");
+#endif /* vax */
+
+  printf ("\n");
+  exit (0);
+}
diff --git a/CWRU/old-conf/support/inpath b/CWRU/old-conf/support/inpath
new file mode 100755 (executable)
index 0000000..95f28bc
--- /dev/null
@@ -0,0 +1,19 @@
+#! /bin/sh
+#
+# Search $PATH for a file the same name as $1; return TRUE if found.
+#
+
+command=$1
+[ -n "$command" ] || exit 1
+
+set `echo $PATH | sed 's/^:/.:/
+                       s/::/:.:/g
+                       s/:$/:./
+                       s/:/ /g'`
+       
+while [ $# -ne 0 ] ; do
+       [ -f $1/$command ] && exit 0    # test -x not universal
+       shift
+done
+
+exit 1
diff --git a/CWRU/old-conf/support/mkmachtype b/CWRU/old-conf/support/mkmachtype
new file mode 100755 (executable)
index 0000000..b2bc5ca
--- /dev/null
@@ -0,0 +1,282 @@
+#!/bin/sh
+# This script attempts to guess a canonical system name.
+#   Copyright (C) 1992, 1993 Free Software Foundation, Inc.
+#
+# This file 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:1.*:*)
+       # 1.2 uses "1.2" for uname -r.
+       echo alpha-dec-osf${UNAME_RELEASE}
+        exit 0 ;;
+    alpha:OSF1:V1.*:*)
+       # 1.3 uses "V1.3" for uname -r.
+       echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    sun4*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       echo sparc-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:5*:RISCos)
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+       echo m88k-dg-dgux${UNAME_RELEASE}
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    *:IRIX:*:*)
+       echo mips-sgi-irix${UNAME_RELEASE}
+       exit 0 ;;
+    i[34]86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    *:AIX:2:3)
+       echo rs6000-ibm-aix3.2
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/31?:HP-UX:*:*)
+       echo m68000-hp-hpux
+       exit 0 ;;
+    9000/[34]??:HP-UX:*:*)
+       echo m68k-hp-hpux
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/7??:HP-UX:*:* | 9000/8?7:HP-UX:*:* )
+       echo hppa1.1-hp-hpux
+       exit 0 ;;
+    9000/8??:HP-UX:*:*)
+       echo hppa1.0-hp-hpux
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       sed 's/^        //' << EOF >dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+       rm -f dummy.c dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?7:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    C1*:ConvexOS:*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:*)
+       echo c2-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:UNICOS:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:UNICOS:*:*)
+       echo ymp-cray-unicos
+        exit 0 ;;
+    CRAY-2:UNICOS:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+       echo m68k-hp-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    i[34]86:NetBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    amiga:NetBSD:*:*)
+       echo m68k-cbm-netbsd{$UNAME_RELEASE}
+       exit 0 ;;
+    i[34]86:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux
+       exit 0 ;;
+    i[34]86:UNIX_SV:4.*:*)
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+       else
+               echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    i[34]86:*:3.2:*)
+       if /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-unknown-sysv3.2
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M680[234]0:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:*)
+       uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4 && exit 0 ;;
+    m680[234]0:LynxOS:2.2*:*)
+       echo m68k-lynx-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    i[34]86:LynxOS:2.2*:*)
+       echo i386-lynx-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.2*:*)
+       echo sparc-lynx-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+main()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+#else
+  printf("m68k-sony-newsos\n"); exit(0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined(hp300) && !defined(hpux)
+  printf("m68k-hp-bsd\n"); exit(0);
+#endif
+
+#if defined(NeXT)
+  printf("m68k-next-bsd\n"); exit(0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf("ns32k-encore-sysv\n"); exit(0);
+#else
+#if defined (CMU)
+  printf("ns32k-encore-mach\n"); exit(0);
+#else
+  printf("ns32k-encore-bsd\n"); exit(0);
+#endif
+#endif
+#endif
+
+#if defined(__386BSD__) || (defined(__bsdi__) && defined(__i386__))
+  printf("i386-unknown-bsd\n"); exit(0);
+#endif
+
+#if defined(sequent)
+#if defined(i386)
+  printf("i386-sequent-dynix\n"); exit(0);
+#endif
+#if defined (ns32000)
+  printf("ns32k-sequent-dynix\n"); exit(0);
+#endif
+#endif
+
+#if defined(_SEQUENT_)
+  printf("i386-sequent-ptx\n"); exit(0);
+#endif
+
+  exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/CWRU/old-conf/support/mksysdefs b/CWRU/old-conf/support/mksysdefs
new file mode 100755 (executable)
index 0000000..05040d1
--- /dev/null
@@ -0,0 +1,489 @@
+#!/bin/sh
+#
+# This file creates a file called "sysdefs.h" which contains CPP defines
+# helping to describe the operating system features.  We just take guesses
+# by looking at random files.
+
+# Removes any inherited definitions.
+SYSDEF=
+MAKE_ANSI=
+
+while [ $# -gt 0 ]; do
+       case "$1" in
+       -s)     shift; srcdir=$1; shift ;;
+       -i)     shift; incdir="$1"; shift ;;
+       -A)     shift; MAKE_ANSI=true ;;
+       *)      break ;;
+       esac
+done
+
+sysdefs=${1-./sysdefs.h}
+: ${srcdir=.}
+
+rm -f $sysdefs
+
+echo "/* sysdefs.h -- #defines for your system created by $0."    >>$sysdefs
+echo "   Do NOT EDIT this file, since any changes will disappear." >>$sysdefs
+echo "   Instead, edit $0, or config.h, or machines.h. */"        >>$sysdefs
+echo ""                                                                   >>$sysdefs
+echo "#if !defined (_SYSDEFS_H_)"                                 >>$sysdefs
+echo "#  define _SYSDEFS_H_"                                      >>$sysdefs
+
+# was if [ -f /usr/bin/uname ] || [ -f /bin/uname ]
+if ( uname >/dev/null 2>&1 ) 2>/dev/null
+then
+       UNAME=`uname`                   # SunOS
+       UNAME_R=`uname -r 2>/dev/null`  # 4.1.2
+       UNAME_M=`uname -m 2>/dev/null`  # sun4m
+       UNAME_V=`uname -v 2>/dev/null`  # 13
+       UNAME_S=`uname -s 2>/dev/null`  # SunOS
+       RELEASE=`expr "$UNAME_R" : '[^0-9]*\([0-9]*\)'` # 4
+       case "$RELEASE" in
+       "")     RELEASE=0 ;;
+       *)      RELEASE=`expr "$RELEASE" + 0` ;;
+       esac
+       LEVEL=`expr "$UNAME_R" : '[^0-9]*[0-9]*.\([0-9]*\)'`    # 1
+       SUBLEVEL=`expr "$UNAME_R" : '[^0-9]*[0-9]*.[0-9]*.\([0-9]*\)'` # 2
+fi
+
+# check for versions of SunOS and BSD/OS
+case "${UNAME}${RELEASE}" in
+SunOS4*) SYSDEF=SunOS4 ;;
+SunOS5*) SYSDEF=SunOS5 ;;
+BSD/OS2*) SYSDEF=BSDI2 ;;
+esac
+
+# Test for NeXT
+if [ -d /NextLibrary ]; then
+       MAKE_ANSI=true
+fi
+
+# Intel Paragon
+case "$UNAME_M" in
+paragon) MAKE_ANSI=true ;;
+esac
+
+# Test for shared libraries (this is pretty sVr4ish).
+if [ -f /usr/ccs/lib/libc.so ]; then
+       SYSDEF=USGr4
+fi
+
+# Some versions of i386 SVR4.2 make `uname' equivalent to `uname -n', which
+# is contrary to all other versions of uname
+if [ -n "$UNAME" ] && [ "$UNAME_S" != "$UNAME" ] && [ "$UNAME_S" = UNIX_SV ]; then
+       UNAME=UNIX_SV
+fi
+
+# another check for SVR4 on 386 or 486 machines
+case "${UNAME_M}:${UNAME}:${UNAME_R}" in
+i[34]86:UNIX_SV:4.*)   SYSDEF=USGr4 ;;
+esac
+
+# A check for Mips RISCos
+case "$UNAME_V" in
+UMIPS|RISCos) SYSDEF=RISCos_${RELEASE}_${LEVEL} ;;
+esac
+
+# A check for Amdahl UTS
+case "$UNAME" in
+uts) SYSDEF=UTS ;;
+esac
+
+# Look for an error message when trying to exec bison.  If we find
+# what we're looking for, then we don't have it.  If we get something
+# else (like an error message about no grammar file), then we have
+# it.
+YACC=yacc
+if ( cd /tmp ; bison /dev/null 2>&1 >/dev/null | grep 'no input grammar' >/dev/null 2>&1 ) 2>/dev/null; then
+       YACC="bison -y"
+elif ( cd /tmp ; byacc /dev/null 2>&1 >/dev/null | grep 'unexpected ' >/dev/null 2>&1) 2>/dev/null; then
+       YACC=byacc
+fi
+
+# Try to locate ranlib.  I think this is a bad idea.
+if sh ${srcdir}/support/inpath ranlib; then
+       RANLIB_LOCATION=ranlib
+elif [ -f /usr/bin/ranlib ]; then
+       RANLIB_LOCATION=/usr/bin/ranlib;
+elif [ -f /bin/ranlib ]; then
+       RANLIB_LOCATION=/bin/ranlib;
+elif [ -f /usr/local/bin/ranlib ]; then
+       RANLIB_LOCATION=/usr/local/bin/ranlib;
+elif [ -f /usr/gnu/bin/ranlib ]; then
+       RANLIB_LOCATION=/usr/gnu/bin/ranlib
+elif [ -f /usr/local/gnubin/ranlib ]; then
+       RANLIB_LOCATION=/usr/local/gnubin/ranlib;
+else
+       RANLIB_LOCATION=:       # XXX
+fi
+
+if [ -n "${RANLIB_LOCATION}" ]; then
+  echo ""                                              >>$sysdefs
+  echo "#if !defined (RANLIB_LOCATION)"                >>$sysdefs
+  echo "#  define RANLIB_LOCATION ${RANLIB_LOCATION}"  >>$sysdefs
+  echo "#endif /* RANLIB_LOCATION */"                  >>$sysdefs
+fi
+
+#
+# Is this a Xenix system?
+#
+if [ -f /xenix ]; then
+  SYSDEF="Xenix"
+  case "`/bin/uname -p`" in
+    *286) SYSDEF="Xenix286" ;;
+    *386) SYSDEF="Xenix386" ;;
+  esac
+
+  # make sure that `i386' is defined for machines.h
+  if [ "$SYSDEF" = "Xenix386" ]; then
+    echo ""                            >>$sysdefs
+    echo "#if !defined (i386)"         >>$sysdefs
+    echo "#  define i386"              >>$sysdefs
+    echo "#endif /* !i386 */"          >>$sysdefs      
+  fi
+
+  # Pass the release number of the OS through to the machine descriptions
+  # in machines.h.
+  if [ -f /etc/perms/soft ]; then
+    rel=`grep rel= /etc/perms/soft`
+    case "$rel" in
+      *2.2.*) XREL=XENIX_22 ;;
+      *2.3.*) XREL=XENIX_23 ;;
+      *3.2.*) XREL=XENIX_32 ;;
+      *) XREL= ;;
+    esac
+
+    if [ "$XREL" ]; then
+      echo ""                          >>$sysdefs
+      echo "#if !defined ($XREL)"      >>$sysdefs
+      echo "#  define $XREL"           >>$sysdefs
+      echo "#endif /* !$XREL */"       >>$sysdefs
+    fi
+  fi
+fi
+
+#
+# Is this some kind of Sys Vish system?
+#
+if [ -f /unix ]; then
+  if [ -d /generic ]; then   # This is an AIX system.
+    SYSDEF="aixpc"
+    MAKE_ANSI=true
+  elif [ -d /etc/conf/kconfig.d ] && [ -f /usr/include/sys/limits.h ]; then
+    SYSDEF="isc386"                    # This is a 386 running ISC?
+    ISCREL="ISC_$RELEASE"
+    echo "#if !defined ($ISCREL)"      >>$sysdefs
+    echo "#  define $ISCREL"           >>$sysdefs
+    echo "#endif /* $ISCREL */"                >>$sysdefs
+  elif [ -f /etc/xlc.cfg ]; then
+    if fgrep _IBMR2 /etc/xlc.cfg >/dev/null 2>&1; then
+      SYSDEF=RISC6000
+      MAKE_ANSI=true
+    fi
+  elif [ -f /bin/4d -a -f /bin/uname ]; then
+    case "$UNAME_R" in
+      3.*) SYSDEF="Irix3" ;;
+      4.*) SYSDEF="Irix4" ;;
+      5.*) SYSDEF="Irix5" ;;
+      6.*) SYSDEF="Irix6" ;;
+      *)   SYSDEF="Irix3" ;;
+    esac
+  elif [ -d /usr/amiga ]; then
+    SYSDEF="amiga"             # An Amiga running V.4.
+  elif [ -f /bin/fxc.info ]; then
+    SYSDEF="alliant"
+  fi
+fi
+
+# Is this a Unicos system?
+if [ -f /unicos ]; then
+   MAKE_ANSI=true
+   UnicosMachine=
+
+   # Test for the variaous flavors of Cray machines.
+   if [ -x /bin/cray1 ] && /bin/cray1 2>/dev/null; then
+      UnicosMachine=Cray1
+   fi
+
+   if [ -x /bin/cray2 ] && /bin/cray2 2>/dev/null; then
+      UnicosMachine=Cray2
+   fi
+
+   if [ -x /bin/crayxmp ] && /bin/crayxmp 2>/dev/null; then
+      UnicosMachine=CrayXMP
+   fi
+   if [ -x /bin/crayymp ] && /bin/crayymp 2>/dev/null; then
+      UnicosMachine=CrayYMP
+   fi
+
+   if [ "$UnicosMachine" ]; then
+      echo "#if !defined ($UnicosMachine)"     >>$sysdefs
+      echo "#  define $UnicosMachine"          >>$sysdefs
+      echo "#endif /* !$UnicosMachine */"      >>$sysdefs
+   fi
+fi
+
+# Is this (and what kind of) a HPUX system?
+if [ -f /hp-ux ]; then
+  SYSDEF=HPUX_${RELEASE}
+  if [ "$RELEASE" = 6 -a "$LEVEL" -lt 2 ]; then
+    SYSDEF=HPUX_USG
+  fi
+fi
+
+if [ "$SYSDEF" = "" ]; then
+       case "$UNAME_M" in
+       ESA) SYSDEF=AIXESA ;;    
+       XD88*) SYSDEF=XD88 ;;
+       M88100) SYSDEF=M88100 ;;        # Motorola Delta 88K
+       esac
+fi
+
+# What release of SCO Unix is this?
+if [ "$SYSDEF" = "" -a -f /bin/uname ]; then
+  case `/bin/uname -X 2>/dev/null | grep '^Release' 2>/dev/null` in
+    *3.2v4.*) SYSDEF=SCOv4 ;;
+          *) SYSDEF=SCO ;;
+  esac
+fi
+
+#
+# Default to cadmus for unknown SysVish systems
+#
+if [ -f /unix ] && [ "$SYSDEF" = "" ]; then
+  SYSDEF="cadmus"
+fi
+
+if [ "$SYSDEF" != "" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined ($SYSDEF)"                        >>$sysdefs
+  echo "#  define $SYSDEF"                     >>$sysdefs
+  echo "#endif /* $SYSDEF */"                  >>$sysdefs
+fi
+
+# Now look for certain include files in a list of directories
+# Poor substitute for autoconf
+
+# Add any other directories where include files are found to this list or
+# create another case
+if [ -n "$incdir" ]; then
+       dirlist="$incdir"
+else
+       case "$SYSDEF" in
+       RISCos*) dirlist="/bsd43/usr/include";;
+       *) dirlist="/usr/include /usr/include/bsd /usr/include/ansi" ;;
+       esac
+fi
+
+# Code fragment to be executed to find a particular include file.  Make sure
+# to set `file' to the pathname of the file you want, relative to /usr/include,
+# before calling `eval $findf'.
+findf="
+found='';
+for d in \$dirlist;
+do
+       if test -f \$d/\$file;
+       then
+               found=yes;
+               break;
+       fi;
+done
+"
+
+file=sys/stream.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_SYS_STREAM_H)"      >>$sysdefs
+  echo "#  define HAVE_SYS_STREAM_H"           >>$sysdefs
+  echo "#endif /* HAVE_SYS_STREAM_H */"                >>$sysdefs
+fi
+
+file=sys/ptem.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_SYS_PTEM_H)"                >>$sysdefs
+  echo "#  define HAVE_SYS_PTEM_H"             >>$sysdefs
+  echo "#endif /* HAVE_SYS_PTEM_H */"          >>$sysdefs
+fi
+
+file=sys/pte.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_SYS_PTE_H)"         >>$sysdefs
+  echo "#  define HAVE_SYS_PTE_H"              >>$sysdefs
+  echo "#endif /* HAVE_SYS_PTE_H */"           >>$sysdefs
+fi
+
+file=sys/wait.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_SYS_WAIT_H)"                >>$sysdefs
+  echo "#  define HAVE_SYS_WAIT_H"             >>$sysdefs
+  echo "#endif /* HAVE_SYS_WAIT_H */"          >>$sysdefs
+fi
+
+file=sys/resource.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_RESOURCE)"          >>$sysdefs
+  echo "#  define HAVE_RESOURCE"               >>$sysdefs
+  echo "#endif /* HAVE_RESOURCE */"            >>$sysdefs
+fi
+
+file=sys/param.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_SYS_PARAM_H)"       >>$sysdefs
+  echo "#  define HAVE_SYS_PARAM_H"            >>$sysdefs
+  echo "#endif /* HAVE_SYS_PARAM_H */"         >>$sysdefs
+fi
+
+file=unistd.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_UNISTD_H)"          >>$sysdefs
+  echo "#  define HAVE_UNISTD_H"               >>$sysdefs
+  echo "#endif /* HAVE_UNISTD_H */"            >>$sysdefs
+fi
+
+file=stdlib.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_STDLIB_H)"          >>$sysdefs
+  echo "#  define HAVE_STDLIB_H"               >>$sysdefs
+  echo "#endif /* HAVE_STDLIB_H */"            >>$sysdefs
+fi
+
+file=limits.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_LIMITS_H)"          >>$sysdefs
+  echo "#  define HAVE_LIMITS_H"               >>$sysdefs
+  echo "#endif /* HAVE_LIMITS_H */"            >>$sysdefs
+fi
+
+file=locale.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_LOCALE_H)"          >>$sysdefs
+  echo "#  define HAVE_LOCALE_H"               >>$sysdefs
+  echo "#endif /* HAVE_LOCALE_H */"            >>$sysdefs
+fi
+
+file=alloca.h
+eval $findf
+if [ -f /usr/include/alloca.h ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_ALLOCA_H)"          >>$sysdefs
+  echo "#  define HAVE_ALLOCA_H"               >>$sysdefs
+  echo "#endif /* HAVE_ALLOCA_H */"            >>$sysdefs
+fi
+
+file=dirent.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_DIRENT_H)"          >>$sysdefs
+  echo "#  define HAVE_DIRENT_H"               >>$sysdefs
+  echo "#endif /* HAVE_DIRENT_H */"            >>$sysdefs
+fi
+
+file=string.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_STRING_H)"          >>$sysdefs
+  echo "#  define HAVE_STRING_H"               >>$sysdefs
+  echo "#endif /* HAVE_STRING_H */"            >>$sysdefs
+fi
+
+file=varargs.h
+eval $findf
+if [ -n "$found" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_VARARGS_H)"         >>$sysdefs
+  echo "#  define HAVE_VARARGS_H"              >>$sysdefs
+  echo "#endif /* HAVE_VARARGS_H */"           >>$sysdefs
+fi
+
+# Does the system have a /dev/fd directory?
+if [ -d /dev/fd ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (HAVE_DEV_FD)"            >>$sysdefs
+  echo "#  define HAVE_DEV_FD"                 >>$sysdefs
+  echo "#endif /* HAVE_DEV_FD */"              >>$sysdefs
+fi
+
+# Is this SVR4.2?  It's subtly different from USGr4
+if [ "$UNAME" = "UNIX_SV" ] && [ "$UNAME_R" = "4.2" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (USGr4_2)"                >>$sysdefs
+  echo "#  define USGr4_2"             >>$sysdefs
+  echo "#endif /* USGr4_2 */"          >>$sysdefs
+fi
+
+# Is this AIX PS/2 1.3?  Yuck.
+if [ "$UNAME" = "AIX" ] && [ "$UNAME_V" = "1" ] && [ "$RELEASE" = "3" ]; then
+  case "$UNAME_M" in
+  i386|i486)
+       echo ""                                 >>$sysdefs
+       echo "#if !defined (AIX_13)"            >>$sysdefs
+       echo "#  define AIX_13"                 >>$sysdefs
+       echo "#endif /* AIX_13 */"              >>$sysdefs
+       ;;
+  esac
+fi
+
+if [ -n "$YACC" ]; then
+  echo ""                                      >>$sysdefs
+  echo "#if !defined (YACC_PROG)"              >>$sysdefs
+  echo "#  define YACC_PROG $YACC"             >>$sysdefs
+  echo "#endif /* YACC_PROG */"                        >>$sysdefs
+fi
+
+# Functions to test for a la autoconf
+#      getwd
+#      getcwd
+#      strchr
+#      strcasecmp
+#      getgroups
+#      setlinebuf
+#      strerror
+#      vfprintf
+#      bcopy
+#      getdtablesize
+#      setdtablesize
+#      alloca
+#      gethostname
+#      memmove (missing)
+#      mkfifo (missing)
+#
+# Other things to test
+#      opendir robustness
+#      dup2 working
+#      void sighandler
+#      sys_siglist[]
+#      uid_t, gid_t
+#      have_getpw_decls
+#      reversed setvbuf args
+#      int getgroups
+
+# If this system's cpp might not like `/**/#' in cpp-Makefile, make an
+# alternate ansi-style cpp-Makefile.
+if [ -n "$MAKE_ANSI" ]; then
+   grep -v '/\*\*/' ${srcdir}/cpp-Makefile >ansi-Makefile
+fi
+
+# These should be the last 2 lines in this file!
+echo ""                                                >>$sysdefs
+echo "#endif /* _SYSDEFS_H_ */"                        >>$sysdefs
diff --git a/CWRU/old-conf/support/srcdir b/CWRU/old-conf/support/srcdir
new file mode 100755 (executable)
index 0000000..9d8ccd7
--- /dev/null
@@ -0,0 +1,13 @@
+#! /bin/sh
+#
+# srcdir - print out the absolute pathname of the top of the bash source
+#         tree.  Used for getting the right value to makes in subdirectories
+#
+
+case "$1" in
+'.'|./)        pwd ;;
+./*|..*)       echo `pwd`/"$1" ;;
+*)     echo "$1" ;;
+esac
+
+exit 0
diff --git a/CWRU/old/KSH.README b/CWRU/old/KSH.README
new file mode 100644 (file)
index 0000000..8d19d88
--- /dev/null
@@ -0,0 +1,136 @@
+
+This is a description of the changes made to bash for increased ksh
+compatibility.
+
+1.  $SECONDS
+
+       "Each time this parameter is referenced, the number of seconds
+        since shell invocation is returned.  If this parameter is assigned
+        a value, then the value returned will be the value that was 
+        assigned plus the number of seconds since the assignment."
+
+       Files changed:  variables.c
+                       variables.h
+                       subst.c
+                       general.c
+                       shell.c
+                       general.h
+
+2.  $TMOUT
+
+       "If set to a value greater than 0, the shell will terminate if a
+        command is not entered within the prescribed number of seconds
+        after issuing the PS1 prompt."
+
+       Files changed:  shell.c  (the implementation is not perfect)
+
+3.  $RANDOM
+
+       "Each time this parameter is referenced, a random integer is 
+        generated.  The sequence of random numbers can be initialized
+        by assigning a numeric value to RANDOM."
+
+       Files changed:  subst.c
+                       variables.c
+
+4.  $REPLY
+
+       "This parameter is set by the `read' special command when no 
+        arguments are supplied."
+
+       Files changed:  builtins.c
+
+5.  integer variables
+
+       `declare -i' (also export) makes a variable an integer (turns on
+       the integer attribute).  When assignment is made to a variable with
+       the -i attribute, arithmetic expression evaluation is done on the
+       value before it is assigned to the variable.
+
+       Files changed:  variables.h
+                       variables.c
+                       builtins.c
+
+6.  Arithmetic expression evaluation.
+
+       Here is the comment at the beginning of the new file `expr.c':
+
+
+       ksh-style expression evaluation.
+
+       All arithmetic is done as long integers with no checking for overflow
+       (though division by 0 is caught and flagged as an error).
+
+       The following operators are handled, grouped into a set of levels in
+       order of decreasing precedence.
+
+       "-"                     [level 0 (unary negation)]
+       "!"                     [level 1]
+       "*", "/", "%"           [level 2]
+       "+", "-"                [level 3]
+       "<=", ">=", "<", ">"    [level 4]
+       "==", "!="              [level 5]
+       "="                     [level 6 (assignment)]
+
+       (Note that most of these operators have special meaning to bash, and an
+       entire expression should be quoted, e.g. "a=$a+1" or "a=a+1" to ensure
+       that it is passed intact to the evaluator).
+
+       Sub-expressions within parentheses have a precedence level greater than
+       all of the above levels and are evaluated first.  Within a single prece-
+       dence group, evaluation is left-to-right, except for the arithmetic
+       assignment operator (`='), which is evaluated right-to-left (as in C).
+
+       The expression evaluator returns the value of the expression (assignment
+       statements have as a value what is returned by the RHS).  The `let'
+       builtin, on the other hand, returns 0 if the last expression evaluates to
+       a non-zero, and 1 otherwise.
+
+       Implementation is a recursive-descent parser.
+
+       Files added:    expr.c
+
+7. `let' builtin
+
+       Parameters may be assigned numeric values via the `let' builtin.
+       Each of its arguments is an expression to be evaluated.  `let'
+       returns 0 if the value of the last expression is non-zero, and
+       1 otherwise.
+
+       Note that the "((...))" form of this command has not yet been
+       implemented; it requires changes to the parsing functions.
+
+       Files changed:  builtins.c
+
+8.  $_
+
+       $_ is set to the last argument of the previous command line, after
+       expansion.  It is still used as before when checking for mail.
+       Two new keybindings have been added to insert this into the current
+       command line (M-_ and M-.).
+
+       Files changed:  mailcheck.c
+                       execute_cmd.c
+                       bashline.c
+
+9.  `cd -'
+
+       Equivalent to 'cd $OLDPWD'
+
+       Files changed:  builtins.c
+
+10.  "ulimit -a"
+
+       "List all of the current resource limits (BSD only)."
+
+       Files changed:  builtins.c
+
+11.  ${#@} and ${#*}
+
+       These expand to the number of positional parameters.
+
+       Files changed: subst.c
+
+Chet Ramey
+Information Network Services, Case Western Reserve University
+chet@ins.CWRU.Edu
diff --git a/CWRU/old/RELEASE.113 b/CWRU/old/RELEASE.113
new file mode 100644 (file)
index 0000000..f38e5f2
--- /dev/null
@@ -0,0 +1,140 @@
+This file details the changes between the previous release of CWRU bash
+(07/11/93) and this release.
+
+1. Bugs Fixed
+
+Readline's vi-mode once again has TAB bound to completion; entering `posix
+mode' changes it to self-insert
+
+Bash now binds its special emacs-mode functions directly into
+emacs_meta_keymap so that eight-bit character handling does not interfere
+
+Some source restructuring: more extern functions are defined in header files
+and not in C source files
+
+The handling of `line number' inside functions is now more correct and
+closer to reality
+
+Some functions of `general use' were moved to general.c (vfree,
+full_pathname)
+
+A bug that caused some redirections to be applied twice was fixed in
+execute_command_internal (dispose of redirection_undo_list after copying it;
+ditto for exec_redirection_undo_list)
+
+The exit status of a command that is not found is 126, as Posix.2 specifies
+
+More speed improvements -- bash now runs as fast as the SunOS sh on
+Haertel's `shell benchmark'
+
+Instead of returning pointers to -1, bash and the readline, history, and
+glob libraries now return pointers to special `error pointers', which the
+calling code checks for in place of -1
+
+Fixed a problem with canonicalize_pathname which made it get
+confused with xxx/./yyy if yyy was `.' or `..'
+
+Fixes to make bash recognize SVR4.2 and set USGr4_2 for SVR4.2 systems
+
+Fixes to the HP/UX machine descriptions to make alloca work on HPUX_9
+and to avoid `M_MACHINE redefined' warnings
+
+Fixes to the CRAY machine description
+
+Fixes to the mailpath code to make it Posix.2-compliant -- backslash
+may now quote `%' and `?' 
+
+The namespace was further cleaned up, and more functions and variables
+were made static
+
+On systems with S_IFSOCK or S_ISSOCK defined in sys/stat.h, bash checks
+whether fd 0 is a socket to decide whether or not it's being started by
+rshd and to run the startup files
+
+Bash now gives the signal mask it inherits to its children -- previously,
+login shells cleared the signal mask
+
+cpp-Makefile and subst.c both used the `USE_GLOB_LIBRARY' define, but
+with different meanings; subst.c now uses `USE_POSIX_GLOB_LIBRARY'
+
+Fixed pattern substitution so that ${a%%$b}, where b was unset, no longer
+causes a core dump
+
+Changed the `test_exit' define in test.c to no longer use `longjmp' as
+the rhs or a comma-ized expression; this causes core dumps on some
+optimizer/machine combinations
+
+A speed hack in variables.c: if no local variables are defined for a level
+of shell context, kill_all_local_variables does not need to search the
+whole variable hash table when popping a context
+
+Fixed the `bind' builtin so that -m now changes the keymap for all of the
+subsequent operations
+
+Changed some more builtins to use internal_getopt: bind, command, export,
+readonly, declare, typeset
+
+Fixed fc to use the Posix.2 format for listing commands in the
+history list
+
+Changed bg to set `!', as Posix.2 specifies
+
+Fixed ulimit.def to compile if RLIMIT_RSS is not defined,
+as some systems seem to have it
+
+Replaced lib/malloc/alloca.c with the version from emacs 19.  The old one
+lives in alloca.c.old
+
+malloc.c now uses the ANSI C features to `stringize' macro arguments if
+__STDC__ is defined
+
+Fixes to the GNU malloc library from glibc 1.06 and Mike Haertel
+
+Fixes to readline key binding and lookup for Cray systems, which don't
+like the casting that readline does
+
+Fixes to all readline library source files to clean up the code: make sure
+`int'-returning functions use `return x;' rather than `return;', declare all
+arguments, even the `int' ones, and make some functions void.  Cleaned up
+the code formatting a little, too.
+
+The readline completer now double-quotes filenames with special word-break
+characters, so that tilde expansion still works
+
+^C now breaks out of keyboard macros
+
+If being compiled as part of the shell, readline no longer attempts to
+handle SIGTTIN, SIGTTOU, or SIGTSTP
+
+tilde_expansion_failure_hook is now a CPFunction rather than a Function,
+since that's how it's used
+
+Readline vi-mode `change case' function now skips over characters which
+are neither upper nor lower case
+
+Readline vi-mode now allows replacement to be redoable with `.'
+
+2. New Features
+
+A `strict Posix.2' mode, enabled with the -posix startup option or
+setting the POSIXLY_CORRECT variable (see CWRU/POSIX.NOTES for a 
+description of the changed behavior)
+
+`ONESHOT' is now an option in config.h
+
+cpp-Makefile assumes that fixed header files are present if gcc is being
+used
+
+The redirections attached to a function declaration are now part of that
+function, applied when the function is executed, as specified by Posix.2.
+This caused a change to parse.y that resulted in 66 shift/reduce
+conflicts(!)
+
+All of the OP= functions that Posix.2 specifies are now implemented for
+both `let' and arithmetic substitution
+
+The `command' builtin has acquired the Posix.2 `-v' and `-V' options
+(this shares code with the `type' builtin)
+
+A new `bash_builtins' man page, like the `csh_builtins' page on some
+systems
diff --git a/CWRU/old/RSH.README b/CWRU/old/RSH.README
new file mode 100644 (file)
index 0000000..6a3498b
--- /dev/null
@@ -0,0 +1,54 @@
+
+This is a description of the changes made to bash to provide a `restricted'
+shell, `rbash', organized by changes to various source files.
+
+1.  shell.c
+
+       Moved the declaration of restricted to flags.c; it is now declared
+       extern here.  Changed the detection of a restricted shell; now, any
+       instance of the shell for which *(basename(argv[0])) == 'r' (where
+       basename returns either everything after the last '/' in its 
+       argument or its argument is restricted.  Also, if SHELL is set on
+       entry to the shell, and it's basename is "rbash", the shell is
+       restricted.
+
+       This paragraph applies only to CWRU, or to those who have compiled
+       the shell with "CWRU" defined.  When a shell is determined to be
+       restricted, and it is a login shell, the file "/etc/rprofile" (and
+       only that file) is executed.  There is no execution of ~/.profile
+       or ~/.bash_profile.  The .bashrc file is executed, but after the
+       restrictions have been turned on (users may customize their instances
+       of the shell in this file while not compromising any kind of security
+       arrangements set up by the administrator).
+
+2.  builtins.c
+
+       cd_builtin was modified to return failure if bash is operating in
+       `restricted mode', so changing directories is not allowed.
+
+3.  variables.c
+
+       initialize_shell_variables () was modified to make PATH and SHELL
+       read-only when restricted == 1.  These variables may not be unset
+       in a restricted shell.
+
+4.  flags.c
+
+       The variable `restricted' is now declared here.  A new flag `-r',
+       to turn on restricted mode, has been added.  `change_flag' has 
+       been modified to disallow `set +r' if restricted == 1.
+
+5.  execute_cmd.c
+
+       execute_simple_command () was modified to disallow commands and
+       file names that contain a slash.
+
+       Code was added to do_redirections () and do_redirection() to
+       disallow output file redirection specifications if restricted is
+       1.
+
+Chet Ramey
+Information Network Services, Case Western Reserve University
+chet@ins.CWRU.Edu
+
+(I took almost all of this stuff out again after putting it in.)
diff --git a/CWRU/old/array.doc b/CWRU/old/array.doc
new file mode 100644 (file)
index 0000000..1bd14b5
--- /dev/null
@@ -0,0 +1,53 @@
+This describes how bash users create, destroy, assign, and reference array
+variables.  Array variables are variables whose values are arrays of strings,
+and whose elements may be referenced individually.
+
+CREATING
+       - any variable may be declared as an array using `typeset -a'
+       - an ordinary variable may be converted to an array using
+         `typeset -a'; the value becomes array[0]
+
+       - there is a question of notation used to simultaneously declare
+         an array variable and populate it with values sequentially,
+         like ksh does with `set -A'.  `set -A' is a horrible choice;
+         it should be discarded immediately.
+
+               - we can use `typeset -a array [values...]'
+
+DESTROYING
+       - `unset name' will destroy the array `name'
+       - how to treat `typeset +a array'?
+               - I think we should keep the variable, convert it from an
+                 array to an `ordinary' variable, and make the value at
+                 the smallest index of the array the value of the new
+                 variable
+
+ASSIGNING
+       - array[index]=value will serve to assign values to individual
+         elements of the array
+       - the subscript can be an arbitrary arithmetic expression; it
+         will be run through the expression evaluator
+       - this can create arrays, too
+               - this is analogous to defining a variable by simply
+                 assigning to it
+
+REFERENCING
+       - $array will expand to all elements of the array, just like $*
+         expands to all the positional parameters
+       - "$array" is like "$@"
+       - ${array[index]} is used to reference array element `index', where
+         `index' can be an arbitrary arithmetic expression
+               - two special values for `index': * and @ expand to all
+                 elements of the array, just like $* and $@.  Quoting
+                 behavior is the same, too
+       - using a subscript is an error if a variable has not been declared
+         as an array (is this wise?)
+       - ${#variable}, if `variable' is an array, expands to the number of
+         elements in the array
+               - ${#variable[n]} expands to the length of variable[n].  n
+                 may be an arbitrary arithmetic expression
+               - ${#variable[*]} and ${#variable[@]} expand to the number of
+                 elements in the array
+
+OPEN QUESTIONS
+       - should we allow them to be exported?  Ksh does not, but rc does
diff --git a/CWRU/old/fixlib b/CWRU/old/fixlib
new file mode 100755 (executable)
index 0000000..7d74c08
--- /dev/null
@@ -0,0 +1,87 @@
+
+# This script is for bash-maintainers only!  It takes a freshly unpacked Bash,
+# and reorganizes it so that there is exactly one version of any given
+# source file.
+#
+
+if [ "$0" != "./fixdist" ]; then
+   echo "You must run 'fixdist' from the 'support' directory!"
+   exit 1
+fi
+
+cd ../lib
+must_exist="posixheaders/posixstat.h posixheaders/ansi_stdlib.h"
+must_exist="$must_exist tilde/tilde.c tilde/tilde.h"
+must_exist="$must_exist malloc/xmalloc.c"
+
+for filename in $must_exist; do
+   if [ ! -f $filename ]; then
+      echo "The file lib/$filename doesn't exist, but it must!"
+      exit 1
+   fi
+done
+
+echo -n "Relinking neccessary files in lib/readline..."
+cd readline
+for filename in tilde.c tilde.h; do
+   rm $filename
+   ln -s ../tilde/$filename .
+done
+
+rm posixstat.h && ln -s ../posixheaders/posixstat.h .
+rm ansi_stdlib.h && ln -s ../posixheaders/ansi_stdlib.h .
+rm xmalloc.c && ln -s ../malloc/xmalloc.c .
+echo "done."
+
+echo -n "Linking files in . ..."
+cd ../..
+rm posixstat.h && ln -s lib/posixheaders/posixstat.h .
+rm ansi_stdlib.h && ln -s lib/posixheaders/ansi_stdlib.h .
+echo "done."
+
+echo "Should I move the \"lib\" directory to \"../lib\" if I wouldn't"
+echo -n "clobber anything by doing so (y/n)? "
+read reply
+if [ "$reply" != 'y' ]; then
+   echo "You said no, so in that case I'm all done."
+   exit 0
+fi
+
+# Try as hard as we can to move the lib directory to ../lib.
+#
+if [ -d ../lib ]; then
+   echo "The directory $(cd ../lib; pwd) already exists.  It looks like:"
+   echo $(cd ../lib; ls -ldg .; ls -lF)
+   echo "I can:"
+   echo "  1) Move the directory to another name,"
+   echo "  2) Delete matching directories from within it,"
+   echo "  3) Copy files into existing directories, or"
+   echo "  4) Quit now, while you are ahead."
+   echo ""
+   echo -n "Which will it be? "
+   read reply
+   case "$reply" in
+     1)
+       echo "I would be moving the directory to lib-old now"
+       ;;
+     2)
+       echo "I would be deleting the matching directories now"
+       ;;
+     3)
+       echo "I would just go ahead and copy the directories now"
+       ;;
+     4)
+       echo "Probably a good move.  Look at the script support/mklinks."
+       ;;
+   esac
+else
+   echo -n "Moving lib to ../lib, and relinking lib in this directory..."
+   mv lib ../lib
+   mkdir lib
+   cd lib
+   ../support/mklinks ../../lib
+   echo "done."
+fi
+
+echo "That concludes this fixing of the distribution."
+exit 0
diff --git a/CWRU/old/histctl.def b/CWRU/old/histctl.def
new file mode 100644 (file)
index 0000000..f319a71
--- /dev/null
@@ -0,0 +1,110 @@
+This file is histctl.def, from which is created histctl.c.
+It implements the builtin "histctl" in Bash.
+
+Copyright (C) 1987, 1989, 1991, 1992 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 histctl.c
+
+$BUILTIN histctl
+$FUNCTION histctl_builtin
+$DEPENDS_ON HISTORY
+$SHORT_DOC histctl [-cC] [-iI space|dups|both|none]
+Control how lines are saved into the command history.  An option
+of -c enables command-oriented history, in which all lines of a
+compound command are saved as a single history entry.  The -i
+option permits certain lines to be discarded without being stored
+in the history: SPACE means to ignore lines beginning with a space;
+DUPS means to ignore lines the same as the last command entered
+into the history; BOTH enables SPACE and DUPS; and NONE means to
+store all lines.
+$END
+
+#include "../shell.h"
+
+#if defined (HISTORY)
+#include "bashgetopt.h"
+#include "../bashhist.h"
+
+#define HIGNORE_NONE   0x0
+#define HIGNORE_SPACE  0x01
+#define HIGNORE_DUPS   0x02
+#define HIGNORE_BOTH   (HIGNORE_SPACE | HIGNORE_DUPS)
+
+int
+histctl_builtin (list)
+     WORD_LIST *list;
+{
+  int opt;
+  char *spec;
+
+  reset_internal_getopt ();
+  while ((opt = internal_getopt (list, "CcI:i:")) != -1)
+    {
+      switch (opt)
+       {
+       case 'c':
+         command_oriented_history++;
+         break;
+       case 'C':
+         command_oriented_history = 0;
+         break;
+       case 'i':
+         spec = list_optarg;
+         if (strcmp (spec, "none") == 0)
+           history_control = HIGNORE_NONE;
+         else if (strcmp (spec, "space") == 0)
+           history_control |= HIGNORE_SPACE;
+         else if (strcmp (spec, "dups") == 0)
+           history_control |= HIGNORE_DUPS;
+         else if (strcmp (spec, "both") == 0)
+           history_control |= HIGNORE_BOTH;
+         else
+           {
+             builtin_error ("invalid argument to -i: %s", spec);
+             builtin_error ("usage: histctl [-cC] [-iI space|dups|both|none]");
+             return (EX_USAGE);
+           }
+         break;
+       case 'I':
+         spec = list_optarg;
+         if (strcmp (spec, "none") == 0)
+           history_control = HIGNORE_NONE;
+         else if (strcmp (spec, "space") == 0)
+           history_control &= ~HIGNORE_SPACE;
+         else if (strcmp (spec, "dups") == 0)
+           history_control &= ~HIGNORE_DUPS;
+         else if (strcmp (spec, "both") == 0)
+           history_control &= ~HIGNORE_BOTH;
+         else
+           {
+             builtin_error ("invalid argument to -I: %s", spec);
+             builtin_error ("usage: histctl [-cC] [-iI space|dups|both|none]");
+             return (EX_USAGE);
+           }
+         break;
+       default:
+         report_bad_option ();
+         builtin_error ("usage: histctl [-cC] [-iI space|dups|both|none]");
+         return (EX_USAGE);
+       }
+    }
+
+  return (EXECUTION_SUCCESS);
+}
+#endif /* HISTORY */
diff --git a/CWRU/old/longsig.c b/CWRU/old/longsig.c
new file mode 100644 (file)
index 0000000..56ec91c
--- /dev/null
@@ -0,0 +1,50 @@
+/* The answer to this question is 24. */
+#include <stdio.h>
+#include <sys/types.h>
+#include <signal.h>
+#include "siglist.h"
+
+/* Copyright (C) 1987,1989 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. */
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int longest, length = 0;
+  int i;
+
+  for (i = 0; i < NSIG; i++)
+    {
+      printf ("%2d) %s\n", i, sys_siglist[i]);
+      if (strlen (sys_siglist[i]) > length)
+       {
+         longest = i;
+         length = strlen (sys_siglist[i]);
+       }
+    }
+
+  printf ("The longest name is %d:\"%s\", which is %d chars in length.\n",
+         longest, sys_siglist[longest], length);
+}
+\f
+/*
+ * Local variables:
+ * compile-command: "cc -o longest_sig longest_sig.c"
+ * end:
+ */
diff --git a/CWRU/old/mklinks b/CWRU/old/mklinks
new file mode 100755 (executable)
index 0000000..612aa99
--- /dev/null
@@ -0,0 +1,41 @@
+
+# Yet another script which requires an already built Bash.
+#
+# This makes links in the current directory to the directory specified as
+# the first argument.
+#
+
+topdir=$1
+
+if [ ! "$topdir" ]; then
+  echo "No directory specified.  Read the script $0."
+  exit 1
+fi
+
+function clone_files ()
+{
+  local dir=$1;
+  local files;
+
+  files=$(cd $dir; echo *);
+
+  if [ ! "$files" ]; then
+    return 0;
+  fi
+
+  for filename in $files; do
+    if [ -d $dir/$filename ]; then
+      # If the file to clone is this directory, then skip it.
+      if [ $(cd $dir/$filename; pwd) = $(pwd) ]; then
+       continue;
+      fi
+      mkdir $filename;
+      (cd $filename; clone_files ../$dir/$filename)
+    else
+      ln -s $dir/$filename .;
+    fi
+  done
+  rm -f \#* *~ .*~ *.bak .*.bak  *.tmp .*.tmp *.o core a.out;
+}
+
+clone_files $topdir
diff --git a/CWRU/old/mktarfile b/CWRU/old/mktarfile
new file mode 100755 (executable)
index 0000000..88097f5
--- /dev/null
@@ -0,0 +1,74 @@
+#!/bin/sh
+# How to make a distribution tarfile.
+#
+# $1 is the name of the program.
+# $2 is the version number.
+# Remaining args are files to tar.
+# Optional argument of "~+notar" means don't create the actual tar file,
+# just create the symlinked directory.
+
+tar_inhibited=""
+if [ "$1" = "+notar" ]; then
+  tar_inhibited=yes
+  shift
+fi
+
+PROGRAM=$1
+VERSION=$2
+
+if [ "$PROGRAM" = "" -o "$VERSION" = "" ]; then
+  echo "Usage: mktarfile [+notar] <progname> <version> <file ...>"
+  echo "Using the \`+notar' option causes a clone directory to be made."
+  exit 2;
+fi
+
+shift; shift
+
+TARFILE=$PROGRAM.tar
+TARDIR=$PROGRAM-$VERSION
+
+# Delete the tarfile if we are to create it.
+if [ ! "tar_inhibited" ]; then
+  rm -rf $TARFILE
+fi
+
+# Delete the destination directory if it already exists.
+rm -rf $TARDIR
+
+# Make the destination directory.
+echo "Making directory $TARDIR..."
+mkdir $TARDIR
+
+topdir=`pwd`
+where_I_am=$TARDIR
+
+trap "cd $topdir" 3
+
+for i in $*; do
+  filename=$i
+  while [ "$filename" ]; do
+    remainder=`echo $filename | sed 's@[-_a-zA-Z~0-9.]*/@@'`
+    dir=`echo $filename | sed "s@$remainder\\\$@@" | sed "s@/@@"`
+    if [ "$dir" ]; then
+       if [ ! -d $where_I_am/$dir ]; then
+         echo "Making directory $where_I_am/$dir..."
+         mkdir $where_I_am/$dir
+       fi
+       cd $where_I_am/$dir; where_I_am=`pwd`
+       filename=$remainder
+    else
+       break
+    fi
+  done
+  cd $topdir; where_I_am=$TARDIR
+  ln -s $topdir/$i $TARDIR/$i
+done
+
+if [ ! "$tar_inhibited" ]; then
+  echo "tar -chf $TARFILE $TARDIR"
+  tar -chf $TARFILE $TARDIR
+  echo "rm -rf $TARDIR"
+  rm -rf $TARDIR
+fi
+
+exit 0
diff --git a/CWRU/old/mkversion.c b/CWRU/old/mkversion.c
new file mode 100644 (file)
index 0000000..8164a8f
--- /dev/null
@@ -0,0 +1,305 @@
+/* Simple program to make new version numbers for the shell.
+   Big deal, but it was getting out of hand to do everything
+   in the makefile. */
+
+/* Copyright (C) 1989 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. */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include "posixstat.h"
+#include <stdio.h>
+#include "bashansi.h"
+
+char *progname;
+char *dir;
+char *status;
+
+FILE *must_open ();
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  FILE *file;
+  float distver = 0.0;
+  int buildver = 0, patchlevel = 0;
+  int dist = 0, build = 0, patch = 0;
+  int dist_inc = 0, build_inc = 0, patch_inc = 0;
+  int dot_dist_needs_making = 0;
+  int arg_index = 1;
+  struct stat sb;
+
+  progname = argv[0];
+
+  status = dir = (char *)0;
+  while (arg_index < argc && argv[arg_index][0] == '-')
+    {
+      if (strcmp (argv[arg_index], "-dist") == 0)
+        {
+         dist++;
+         dist_inc++;
+        }
+      else if (strcmp (argv[arg_index], "-build") == 0)
+        {
+         build++;
+         build_inc++;
+        }
+      else if (strcmp (argv[arg_index], "-patch") == 0)
+        {
+          patch++;
+         patch_inc++;
+        }
+      else if (strcmp (argv[arg_index], "-dir") == 0)
+       {
+         dir = argv[++arg_index];
+         if (dir == 0)
+           {
+             fprintf (stderr, "%s: `-dir' requires an argument\n", progname);
+             exit (1);
+           }
+         if (stat (dir, &sb) < 0)
+           {
+             fprintf (stderr, "%s: cannot stat %s\n", progname, dir);
+             exit (1);
+           }
+         if ((sb.st_mode & S_IFMT) != S_IFDIR)
+           {
+             fprintf (stderr, "%s: not a directory\n", progname);
+             exit (1);
+           }
+       }
+      else if (strcmp (argv[arg_index], "-status") == 0)
+        {
+          status = argv[++arg_index];
+         if (status == 0)
+           {
+             fprintf (stderr, "%s: `-status' requires an argument\n", progname);
+             exit (1);
+           }
+        }
+      else
+       {
+         fprintf (stderr, "%s: unknown option: %s\n", progname, argv[arg_index]);
+         fprintf (stderr, "usage: %s [-dist|-patch|-build] [-dir directory]\n", progname);
+         exit (1);
+       }
+      arg_index++;
+    }
+
+  if (get_float_from_file (".distribution", &distver, 1) == 0)
+    dot_dist_needs_making++;
+
+  if (get_int_from_file (".patchlevel", &patchlevel, 1) == 0)
+    {
+      patchlevel = 0;
+      patch_inc = 0;
+    }
+
+  if (get_int_from_file (".build", &buildver, 0) == 0)
+    buildver = 0;
+
+  /* Setting distribution version. */
+  if (dist && arg_index < argc)
+    if (sscanf (argv[arg_index], "%f", &distver) != 1)
+      {
+       fprintf (stderr, "%s: Bad input `%s'.  Expected float value for -dist.\n",
+                progname, argv[arg_index]);
+       exit (1);
+      }
+    else
+      {
+       arg_index++;
+       dist_inc = 0;
+      }
+
+  /* Setting patchlevel via argument. */
+  if (patch && arg_index < argc)
+    if (sscanf (argv[arg_index], "%d", &patchlevel) != 1)
+      {
+       fprintf (stderr, "%s: Bad input `%s'.  Expected int value for -patch.\n",
+                progname, argv[arg_index]);
+       exit (1);
+      }
+    else
+      {
+       arg_index++;
+       patch_inc = 0;
+      }
+    
+  if (build && arg_index < argc)
+    if (sscanf (argv[arg_index], "%d", &buildver) != 1)
+      {
+       fprintf (stderr, "%s: Bad input `%s'.  Expected int value for -build.\n",
+                progname, argv[arg_index]);
+       exit (1);
+      }
+    else
+      {
+       arg_index++;
+       build_inc = 0;
+      }
+
+  if (dot_dist_needs_making && !distver)
+    {
+      fprintf (stderr, "%s: There is no `.distribution' file to infer from.\n", progname);
+      exit (1);
+    }
+
+  if (dist_inc)
+    distver = distver + 0.01;
+
+  if (patch_inc)
+    patchlevel++;
+
+  if (build_inc)
+    buildver++;
+
+  file = must_open ("newversion.h", "w");
+
+  /* Output the leading comment. */
+  fprintf (file, 
+"/* Version control for the shell.  This file gets changed when you say\n\
+   `make newversion' to the Makefile.  It is created by mkversion. */\n");
+
+  fprintf (file, "\n/* The distribution version number of this shell. */\n");
+  fprintf (file, "#define DISTVERSION \"%.2f\"\n", distver);
+
+  fprintf (file, "\n/* The patch level of this version of the shell. */\n");
+  fprintf (file, "#define PATCHLEVEL %d\n", patchlevel);
+
+  fprintf (file, "\n/* The last built version of this shell. */\n");
+  fprintf (file, "#define BUILDVERSION %d\n", buildver);
+
+  if (status)
+    {
+      fprintf (file, "\n/* The release status of this shell. */\n");
+      fprintf (file, "#define RELSTATUS \"%s\"\n", status);
+    }
+
+  fprintf (file, "\n/* A version string for use by sccs and the what command. */\n\n");
+  if (status)
+    fprintf (file, "#define SCCSVERSION \"@(#)Bash version %.2f.%d(%d) %s GNU\"\n\n",
+      distver, patchlevel, buildver, status);
+  else
+    fprintf (file, "#define SCCSVERSION \"@(#)Bash version %.2f.%d(%d) GNU\"\n\n",
+      distver, patchlevel, buildver);
+
+  fclose (file);
+
+  file = must_open (".build", "w");
+  fprintf (file, "%d\n", buildver);
+  fclose (file);
+
+  /* Making a new distribution. */
+  if (dist)
+    {
+      file = must_open (".distribution", "w");
+      fprintf (file, "%.2f\n", distver);
+      fclose (file);
+    }
+
+  /* Releasing a new patch level. */
+  if (patch)
+    {
+      file = must_open (".patchlevel", "w");
+      fprintf (file, "%d\n", patchlevel);
+      fclose (file);
+    }
+
+  exit (0);
+}
+
+char *
+makename (fn, from_srcdir)
+     char *fn;
+{
+  char *ret;
+  int dlen;
+
+  dlen = (from_srcdir && dir) ? strlen (dir) + 1 : 0;
+  ret = (char *)malloc (dlen + strlen (fn) + 1);
+  if (ret == 0)
+    {
+      fprintf (stderr, "%s: malloc failed\n", progname);
+      exit (1);
+    }
+  if (from_srcdir && dir)
+    sprintf (ret, "%s/%s", dir, fn);
+  else
+    (void)strcpy (ret, fn);
+
+  return ret;
+}
+
+get_float_from_file (filename, var, from_srcdir)
+     char *filename;
+     float *var;
+     int from_srcdir;
+{
+  FILE *stream;
+  int result;
+  char *name;
+
+  name = makename (filename, from_srcdir);
+  stream = fopen (name, "r");
+  free (name);
+  if (stream == (FILE *)NULL)
+    return (0);
+  result = fscanf (stream, "%f\n", var);
+  fclose (stream);
+  return (result == 1);
+}
+
+get_int_from_file (filename, var, from_srcdir)
+     char *filename;
+     int *var, from_srcdir;
+{
+  FILE *stream;
+  int result;
+  char *name;
+
+  name = makename (filename, from_srcdir);
+  stream = fopen (name, "r");
+  free (name);
+  if (stream == (FILE *)NULL)
+    return (0);
+  result = fscanf (stream, "%d\n", var);
+  fclose (stream);
+  return (result == 1);
+}
+
+FILE *
+must_open (name, mode)
+     char *name, *mode;
+{
+  FILE *temp = fopen (name, mode);
+
+  if (!temp)
+    {
+      fprintf (stderr, "%s: Cannot open `%s' for mode `%s'.\n",
+              progname, name, mode);
+      fprintf
+       (stderr,
+        "Perhaps you don't have %s permission to the file or directory.\n",
+        (strcmp (mode, "w") == 0) ? "write" : "read");
+      exit (3);
+    }
+  return (temp);
+}
diff --git a/CWRU/old/pagesize.c b/CWRU/old/pagesize.c
new file mode 100644 (file)
index 0000000..ee2baa3
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * getpagesize - print the system pagesize
+ *
+ * Chet Ramey
+ * chet@ins.cwru.edu
+ */
+
+#include <stdio.h>
+
+/*
+ * I know these systems have getpagesize(2)
+ */
+
+#if defined (Bsd) || defined (Ultrix) || defined (sun)
+#  define HAVE_GETPAGESIZE
+#endif
+
+#if !defined (HAVE_GETPAGESIZE)
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#  if defined (_SC_PAGESIZE)
+#    define getpagesize() sysconf(_SC_PAGESIZE)
+#  endif /* _SC_PAGESIZE */
+#endif
+
+#if !defined (getpagesize)
+#  include <sys/param.h>
+#  if defined (PAGESIZE)
+#     define getpagesize() PAGESIZE
+#  else /* !PAGESIZE */
+#    if defined (EXEC_PAGESIZE)
+#      define getpagesize() EXEC_PAGESIZE
+#    else /* !EXEC_PAGESIZE */
+#      if defined (NBPG)
+#        if !defined (CLSIZE)
+#          define CLSIZE 1
+#        endif /* !CLSIZE */
+#        define getpagesize() (NBPG * CLSIZE)
+#      else /* !NBPG */
+#        if defined (NBPC)
+#          define getpagesize() NBPC
+#        endif /* NBPC */
+#      endif /* !NBPG */
+#    endif /* !EXEC_PAGESIZE */
+#  endif /* !PAGESIZE */
+#endif /* !getpagesize */
+
+#if !defined (getpagesize)
+#  define getpagesize() 4096  /* Just punt and use reasonable value */
+#endif
+
+#endif /* no EXEC_PAGESIZE */
+
+#endif /* not HAVE_GETPAGESIZE */
+
+main()
+{
+#if defined (HAVE_GETPAGESIZE) || defined (getpagesize)
+  printf ("%ld\n", getpagesize ());
+#else
+  puts ("1024");
+#endif
+}
diff --git a/CWRU/old/pagesize.sh b/CWRU/old/pagesize.sh
new file mode 100755 (executable)
index 0000000..08a2935
--- /dev/null
@@ -0,0 +1,20 @@
+#! /bin/sh
+#
+# pagesize.sh -- determine this system's page size, and write a define to
+#               lib/malloc/pagesize.h for the Gnu malloc's valloc().
+
+echo "/*"
+echo " * pagesize.h"
+echo " *"
+echo " * This file is automatically generated by pagesize.sh"
+echo " * Do not edit!"
+echo " */"
+echo ""
+
+if [ -x /bin/pagesize ]; then
+       echo "#define getpagesize() `/bin/pagesize`"
+else
+       echo "#define getpagesize() `./support/pagesize.aux`"
+fi
+
+exit 0
diff --git a/CWRU/old/parse.y.noctlnul b/CWRU/old/parse.y.noctlnul
new file mode 100644 (file)
index 0000000..1e8921a
--- /dev/null
@@ -0,0 +1,3163 @@
+/* Yacc grammar for bash. */
+
+/* Copyright (C) 1989 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 LICENSE.  If not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+%{
+#include "config.h"
+
+#include "bashtypes.h"
+#include "bashansi.h"
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <signal.h>
+
+#include "shell.h"
+#include "trap.h"
+#include "flags.h"
+#include "input.h"
+#include "mailcheck.h"
+#include "builtins/common.h"
+#include "builtins/builtext.h"
+
+#if defined (READLINE)
+#  include "bashline.h"
+#  include <readline/readline.h>
+#endif /* READLINE */
+
+#if defined (HISTORY)
+#  include "bashhist.h"
+#  include <readline/history.h>
+#endif /* HISTORY */
+
+#if defined (JOB_CONTROL)
+#  include "jobs.h"
+#endif /* JOB_CONTROL */
+
+#if defined (ALIAS)
+#  include "alias.h"
+#endif /* ALIAS */
+
+#if defined (PROMPT_STRING_DECODE)
+#include <sys/param.h>
+#include <time.h>
+#include "maxpath.h"
+#endif /* PROMPT_STRING_DECODE */
+
+#define RE_READ_TOKEN  -99
+#define NO_EXPANSION   -100
+
+#define YYDEBUG 1
+extern int eof_encountered;
+extern int no_line_editing, running_under_emacs;
+extern int current_command_number;
+extern int interactive, interactive_shell, login_shell;
+extern int posixly_correct;
+extern int last_command_exit_value;
+extern int interrupt_immediately;
+extern char *shell_name, *current_host_name;
+extern Function *last_shell_builtin, *this_shell_builtin;
+#if defined (BUFFERED_INPUT)
+extern int bash_input_fd_changed;
+#endif
+
+/* **************************************************************** */
+/*                                                                 */
+/*                 "Forward" declarations                          */
+/*                                                                 */
+/* **************************************************************** */
+
+static int reserved_word_acceptable ();
+static int read_token ();
+static int yylex ();
+static int read_token_word ();
+static void discard_parser_constructs ();
+
+static void report_syntax_error ();
+static void handle_eof_input_unit ();
+static void prompt_again ();
+static void reset_readline_prompt ();
+static void print_prompt ();
+
+/* PROMPT_STRING_POINTER points to one of these, never to an actual string. */
+char *ps1_prompt, *ps2_prompt;
+
+/* Handle on the current prompt string.  Indirectly points through
+   ps1_ or ps2_prompt. */
+char **prompt_string_pointer = (char **)NULL;
+char *current_prompt_string;
+
+/* If non-zero, the decoded prompt string undergoes parameter and
+   variable substitution, command substitution, arithmetic substitution,
+   string expansion, process substitution, and quote removal in
+   decode_prompt_string. */
+int promptvars = 1;
+
+/* The decoded prompt string.  Used if READLINE is not defined or if
+   editing is turned off.  Analogous to current_readline_prompt. */
+static char *current_decoded_prompt;
+
+/* The number of lines read from input while creating the current command. */
+int current_command_line_count;
+
+/* Variables to manage the task of reading here documents, because we need to
+   defer the reading until after a complete command has been collected. */
+static REDIRECT *redir_stack[10];
+int need_here_doc;
+
+/* Where shell input comes from.  History expansion is performed on each
+   line when the shell is interactive. */
+static char *shell_input_line = (char *)NULL;
+static int shell_input_line_index = 0;
+static int shell_input_line_size = 0;  /* Amount allocated for shell_input_line. */
+static int shell_input_line_len = 0;   /* strlen (shell_input_line) */
+
+/* Either zero or EOF. */
+static int shell_input_line_terminator = 0;
+
+static REDIRECTEE redir;
+%}
+
+%union {
+  WORD_DESC *word;             /* the word that we read. */
+  int number;                  /* the number that we read. */
+  WORD_LIST *word_list;
+  COMMAND *command;
+  REDIRECT *redirect;
+  ELEMENT element;
+  PATTERN_LIST *pattern;
+}
+
+/* Reserved words.  Members of the first group are only recognized
+   in the case that they are preceded by a list_terminator.  Members
+   of the second group are recognized only under special circumstances. */
+%token IF THEN ELSE ELIF FI CASE ESAC FOR SELECT WHILE UNTIL DO DONE FUNCTION
+%token IN BANG TIME
+
+/* More general tokens. yylex () knows how to make these. */
+%token <word> WORD ASSIGNMENT_WORD
+%token <number> NUMBER
+%token AND_AND OR_OR GREATER_GREATER LESS_LESS LESS_AND
+%token GREATER_AND SEMI_SEMI LESS_LESS_MINUS AND_GREATER LESS_GREATER
+%token GREATER_BAR
+
+/* The types that the various syntactical units return. */
+
+%type <command> inputunit command pipeline pipeline_command
+%type <command> list list0 list1 compound_list simple_list simple_list1
+%type <command> simple_command shell_command
+%type <command> for_command select_command case_command group_command
+%type <command> function_def if_command elif_clause subshell
+%type <redirect> redirection redirection_list
+%type <element> simple_command_element
+%type <word_list> word_list pattern 
+%type <pattern> pattern_list case_clause_sequence case_clause
+
+%start inputunit
+
+%left '&' ';' '\n' yacc_EOF
+%left AND_AND OR_OR
+%right '|'
+%%
+
+inputunit:     simple_list '\n'
+                       {
+                         /* Case of regular command.  Discard the error
+                            safety net,and return the command just parsed. */
+                         global_command = $1;
+                         eof_encountered = 0;
+                         discard_parser_constructs (0);
+                         YYACCEPT;
+                       }
+       |       '\n'
+                       {
+                         /* Case of regular command, but not a very
+                            interesting one.  Return a NULL command. */
+                         global_command = (COMMAND *)NULL;
+                         YYACCEPT;
+                       }
+       |
+               error '\n'
+                       {
+                         /* Error during parsing.  Return NULL command. */
+                         global_command = (COMMAND *)NULL;
+                         eof_encountered = 0;
+                         discard_parser_constructs (1);
+                         if (interactive)
+                           {
+                             YYACCEPT;
+                           }
+                         else
+                           {
+                             YYABORT;
+                           }
+                       }
+       |       yacc_EOF
+                       {
+                         /* Case of EOF seen by itself.  Do ignoreeof or 
+                            not. */
+                         global_command = (COMMAND *)NULL;
+                         handle_eof_input_unit ();
+                         YYACCEPT;
+                       }
+       ;
+
+word_list:     WORD
+                       { $$ = make_word_list ($1, (WORD_LIST *)NULL); }
+       |       word_list WORD
+                       { $$ = make_word_list ($2, $1); }
+       ;
+
+redirection:   '>' WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (1, r_output_direction, redir);
+                       }
+       |       '<' WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (0, r_input_direction, redir);
+                       }
+       |       NUMBER '>' WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection ($1, r_output_direction, redir);
+                       }
+       |       NUMBER '<' WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection ($1, r_input_direction, redir);
+                       }
+       |       GREATER_GREATER WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (1, r_appending_to, redir);
+                       }
+       |       NUMBER GREATER_GREATER WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection ($1, r_appending_to, redir);
+                       }
+       |       LESS_LESS WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (0, r_reading_until, redir);
+                         redir_stack[need_here_doc++] = $$;
+                       }
+       |       NUMBER LESS_LESS WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection ($1, r_reading_until, redir);
+                         redir_stack[need_here_doc++] = $$;
+                       }
+       |       LESS_AND NUMBER
+                       {
+                         redir.dest = $2;
+                         $$ = make_redirection (0, r_duplicating_input, redir);
+                       }
+       |       NUMBER LESS_AND NUMBER
+                       {
+                         redir.dest = $3;
+                         $$ = make_redirection ($1, r_duplicating_input, redir);
+                       }
+       |       GREATER_AND NUMBER
+                       {
+                         redir.dest = $2;
+                         $$ = make_redirection (1, r_duplicating_output, redir);
+                       }
+       |       NUMBER GREATER_AND NUMBER
+                       {
+                         redir.dest = $3;
+                         $$ = make_redirection ($1, r_duplicating_output, redir);
+                       }
+       |       LESS_AND WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (0, r_duplicating_input_word, redir);
+                       }
+       |       NUMBER LESS_AND WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection ($1, r_duplicating_input_word, redir);
+                       }
+       |       GREATER_AND WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (1, r_duplicating_output_word, redir);
+                       }
+       |       NUMBER GREATER_AND WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection ($1, r_duplicating_output_word, redir);
+                       }
+       |       LESS_LESS_MINUS WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection
+                           (0, r_deblank_reading_until, redir);
+                         redir_stack[need_here_doc++] = $$;
+                       }
+       |       NUMBER LESS_LESS_MINUS WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection
+                           ($1, r_deblank_reading_until, redir);
+                         redir_stack[need_here_doc++] = $$;
+                       }
+       |       GREATER_AND '-'
+                       {
+                         redir.dest = 0L;
+                         $$ = make_redirection (1, r_close_this, redir);
+                       }
+       |       NUMBER GREATER_AND '-'
+                       {
+                         redir.dest = 0L;
+                         $$ = make_redirection ($1, r_close_this, redir);
+                       }
+       |       LESS_AND '-'
+                       {
+                         redir.dest = 0L;
+                         $$ = make_redirection (0, r_close_this, redir);
+                       }
+       |       NUMBER LESS_AND '-'
+                       {
+                         redir.dest = 0L;
+                         $$ = make_redirection ($1, r_close_this, redir);
+                       }
+       |       AND_GREATER WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (1, r_err_and_out, redir);
+                       }
+       |       NUMBER LESS_GREATER WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection ($1, r_input_output, redir);
+                       }
+       |       LESS_GREATER WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (0, r_input_output, redir);
+                       }                         
+       |       GREATER_BAR WORD
+                       {
+                         redir.filename = $2;
+                         $$ = make_redirection (1, r_output_force, redir);
+                       }
+       |       NUMBER GREATER_BAR WORD
+                       {
+                         redir.filename = $3;
+                         $$ = make_redirection ($1, r_output_force, redir);
+                       }
+       ;
+
+simple_command_element: WORD
+                       { $$.word = $1; $$.redirect = 0; }
+       |       ASSIGNMENT_WORD
+                       { $$.word = $1; $$.redirect = 0; }
+       |       redirection
+                       { $$.redirect = $1; $$.word = 0; }
+       ;
+
+redirection_list: redirection
+                       {
+                         $$ = $1;
+                       }
+       |       redirection_list redirection
+                       { 
+                         register REDIRECT *t;
+
+                         for (t = $1; t->next; t = t->next)
+                           ;
+                         t->next = $2; 
+                         $$ = $1;
+                       }
+       ;
+
+simple_command:        simple_command_element
+                       { $$ = make_simple_command ($1, (COMMAND *)NULL); }
+       |       simple_command simple_command_element
+                       { $$ = make_simple_command ($2, $1); }
+       ;
+
+command:       simple_command
+                       { $$ = clean_simple_command ($1); }
+       |       shell_command
+                       { $$ = $1; }
+       |       shell_command redirection_list
+                       {
+                         COMMAND *tc;
+
+                         tc = $1;
+                         /* According to Posix.2 3.9.5, redirections
+                            specified after the body of a function should
+                            be attached to the function and performed when
+                            the function is executed, not as part of the
+                            function definition command. */
+                         if (tc->type == cm_function_def)
+                           {
+                             tc = tc->value.Function_def->command;
+                             if (tc->type == cm_group)
+                               tc = tc->value.Group->command;
+                           }
+                         if (tc->redirects)
+                           {
+                             register REDIRECT *t;
+                             for (t = tc->redirects; t->next; t = t->next)
+                               ;
+                             t->next = $2;
+                           }
+                         else
+                           tc->redirects = $2;
+                         $$ = $1;
+                       }
+       ;
+
+shell_command: for_command
+                       { $$ = $1; }
+       |       case_command
+                       { $$ = $1; }
+       |       WHILE list DO list DONE
+                       { $$ = make_while_command ($2, $4); }
+       |       UNTIL list DO list DONE
+                       { $$ = make_until_command ($2, $4); }
+       |       select_command
+                       { $$ = $1; }
+       |       if_command
+                       { $$ = $1; }
+       |       subshell
+                       { $$ = $1; }
+       |       group_command
+                       { $$ = $1; }
+       |       function_def
+                       { $$ = $1; }
+       ;
+
+for_command:   FOR WORD newline_list DO list DONE
+                       { $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5); }
+       |       FOR WORD newline_list '{' list '}'
+                       { $$ = make_for_command ($2, add_string_to_list ("$@", (WORD_LIST *)NULL), $5); }
+       |       FOR WORD ';' newline_list DO list DONE
+                       { $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6); }
+       |       FOR WORD ';' newline_list '{' list '}'
+                       { $$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6); }
+       |       FOR WORD newline_list IN word_list list_terminator newline_list DO list DONE
+                       { $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9); }
+       |       FOR WORD newline_list IN word_list list_terminator newline_list '{' list '}'
+                       { $$ = make_for_command ($2, REVERSE_LIST ($5, WORD_LIST *), $9); }
+       ;
+
+select_command:        SELECT WORD newline_list DO list DONE
+                       {
+                         $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5);
+                       }
+       |       SELECT WORD newline_list '{' list '}'
+                       {
+                         $$ = make_select_command ($2, add_string_to_list ("$@", (WORD_LIST *)NULL), $5);
+                       }
+       |       SELECT WORD ';' newline_list DO list DONE
+                       {
+                         $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6);
+                       }
+       |       SELECT WORD ';' newline_list '{' list '}'
+                       {
+                         $$ = make_select_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $6);
+                       }
+       |       SELECT WORD newline_list IN word_list list_terminator newline_list DO list DONE
+                       {
+                         $$ = make_select_command ($2, (WORD_LIST *)reverse_list ($5), $9);
+                       }
+       |       SELECT WORD newline_list IN word_list list_terminator newline_list '{' list '}'
+                       {
+                         $$ = make_select_command ($2, (WORD_LIST *)reverse_list ($5), $9);
+                       }
+       ;
+
+case_command:  CASE WORD newline_list IN newline_list ESAC
+                       { $$ = make_case_command ($2, (PATTERN_LIST *)NULL); }
+       |       CASE WORD newline_list IN case_clause_sequence newline_list ESAC
+                       { $$ = make_case_command ($2, $5); }
+       |       CASE WORD newline_list IN case_clause ESAC
+                       { $$ = make_case_command ($2, $5); }
+       ;
+
+function_def:  WORD '(' ')' newline_list group_command
+                       { $$ = make_function_def ($1, $5); }
+
+       |       FUNCTION WORD '(' ')' newline_list group_command
+                       { $$ = make_function_def ($2, $6); }
+
+       |       FUNCTION WORD newline_list group_command
+                       { $$ = make_function_def ($2, $4); }
+       ;
+
+subshell:      '(' compound_list ')'
+                       { $2->flags |= CMD_WANT_SUBSHELL; $$ = $2; }
+       ;
+       
+if_command:    IF list THEN list FI
+                       { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
+       |       IF list THEN list ELSE list FI
+                       { $$ = make_if_command ($2, $4, $6); }
+       |       IF list THEN list elif_clause FI
+                       { $$ = make_if_command ($2, $4, $5); }
+       ;
+
+
+group_command: '{' list '}'
+                       { $$ = make_group_command ($2); }
+       ;
+
+elif_clause:   ELIF list THEN list
+                       { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
+       |       ELIF list THEN list ELSE list
+                       { $$ = make_if_command ($2, $4, $6); }
+       |       ELIF list THEN list elif_clause
+                       { $$ = make_if_command ($2, $4, $5); }
+       ;
+
+case_clause:   pattern_list
+       |       case_clause_sequence pattern_list
+                       { $2->next = $1; $$ = $2; }
+       ;
+
+pattern_list:  newline_list pattern ')' compound_list
+                       { $$ = make_pattern_list ($2, $4); }
+       |       newline_list pattern ')' newline_list
+                       { $$ = make_pattern_list ($2, (COMMAND *)NULL); }
+       |       newline_list '(' pattern ')' compound_list
+                       { $$ = make_pattern_list ($3, $5); }
+       |       newline_list '(' pattern ')' newline_list
+                       { $$ = make_pattern_list ($3, (COMMAND *)NULL); }
+       ;
+
+case_clause_sequence:  pattern_list SEMI_SEMI
+       |       case_clause_sequence pattern_list SEMI_SEMI
+                       { $2->next = $1; $$ = $2; }
+       ;
+
+pattern:       WORD
+                       { $$ = make_word_list ($1, (WORD_LIST *)NULL); }
+       |       pattern '|' WORD
+                       { $$ = make_word_list ($3, $1); }
+       ;
+
+/* A list allows leading or trailing newlines and
+   newlines as operators (equivalent to semicolons).
+   It must end with a newline or semicolon.
+   Lists are used within commands such as if, for, while.  */
+
+list:          newline_list list0
+                       {
+                         $$ = $2;
+                         if (need_here_doc)
+                           gather_here_documents ();
+                        }
+       ;
+
+compound_list: list
+       |       newline_list list1
+                       {
+                         $$ = $2;
+                       }
+       ;
+
+list0:         list1 '\n' newline_list
+       |       list1 '&' newline_list
+                       {
+                         if ($1->type == cm_connection)
+                           $$ = connect_async_list ($1, (COMMAND *)NULL, '&');
+                         else
+                           $$ = command_connect ($1, (COMMAND *)NULL, '&');
+                       }
+       |       list1 ';' newline_list
+
+       ;
+
+list1:         list1 AND_AND newline_list list1
+                       { $$ = command_connect ($1, $4, AND_AND); }
+       |       list1 OR_OR newline_list list1
+                       { $$ = command_connect ($1, $4, OR_OR); }
+       |       list1 '&' newline_list list1
+                       {
+                         if ($1->type == cm_connection)
+                           $$ = connect_async_list ($1, $4, '&');
+                         else
+                           $$ = command_connect ($1, $4, '&');
+                       }
+       |       list1 ';' newline_list list1
+                       { $$ = command_connect ($1, $4, ';'); }
+       |       list1 '\n' newline_list list1
+                       { $$ = command_connect ($1, $4, ';'); }
+       |       pipeline_command
+                       { $$ = $1; }
+       ;
+
+list_terminator:'\n'
+       |       ';'
+       |       yacc_EOF
+       ;
+
+newline_list:
+       |       newline_list '\n'
+       ;
+
+/* A simple_list is a list that contains no significant newlines
+   and no leading or trailing newlines.  Newlines are allowed
+   only following operators, where they are not significant.
+
+   This is what an inputunit consists of.  */
+
+simple_list:   simple_list1
+                       {
+                         $$ = $1;
+                         if (need_here_doc)
+                           gather_here_documents ();
+                       }
+       |       simple_list1 '&'
+                       {
+                         if ($1->type == cm_connection)
+                           $$ = connect_async_list ($1, (COMMAND *)NULL, '&');
+                         else
+                           $$ = command_connect ($1, (COMMAND *)NULL, '&');
+                         if (need_here_doc)
+                           gather_here_documents ();
+                       }
+       |       simple_list1 ';'
+                       {
+                         $$ = $1;
+                         if (need_here_doc)
+                           gather_here_documents ();
+                       }
+       ;
+
+simple_list1:  simple_list1 AND_AND newline_list simple_list1
+                       { $$ = command_connect ($1, $4, AND_AND); }
+       |       simple_list1 OR_OR newline_list simple_list1
+                       { $$ = command_connect ($1, $4, OR_OR); }
+       |       simple_list1 '&' simple_list1
+                       {
+                         if ($1->type == cm_connection)
+                           $$ = connect_async_list ($1, $3, '&');
+                         else
+                           $$ = command_connect ($1, $3, '&');
+                       }
+       |       simple_list1 ';' simple_list1
+                       { $$ = command_connect ($1, $3, ';'); }
+
+       |       pipeline_command
+                       { $$ = $1; }
+       ;
+
+pipeline_command: pipeline
+                       { $$ = $1; }
+       |       BANG pipeline
+                       {
+                         $2->flags |= CMD_INVERT_RETURN;
+                         $$ = $2;
+                       }
+       |       TIME pipeline
+                       {
+                         $2->flags |= CMD_TIME_PIPELINE;
+                         $$ = $2;
+                       }
+       |       TIME BANG pipeline
+                       {
+                         $3->flags |= CMD_TIME_PIPELINE|CMD_INVERT_RETURN;
+                         $$ = $3;
+                       }
+       |       BANG TIME pipeline
+                       {
+                         $3->flags |= CMD_TIME_PIPELINE|CMD_INVERT_RETURN;
+                         $$ = $3;
+                       }
+       ;
+
+pipeline:
+               pipeline '|' newline_list pipeline
+                       { $$ = command_connect ($1, $4, '|'); }
+       |       command
+                       { $$ = $1; }
+       ;
+%%
+
+/* Initial size to allocate for tokens, and the
+   amount to grow them by. */
+#define TOKEN_DEFAULT_GROW_SIZE 512
+
+/* Shell meta-characters that, when unquoted, separate words. */
+#define shellmeta(c)   (strchr ("()<>;&|", (c)) != 0)
+#define shellbreak(c)  (strchr ("()<>;&| \t\n", (c)) != 0)
+#define shellquote(c)  ((c) == '"' || (c) == '`' || (c) == '\'')
+
+/* The token currently being read. */
+static int current_token = 0;
+
+/* The last read token, or NULL.  read_token () uses this for context
+   checking. */
+static int last_read_token = 0;
+
+/* The token read prior to last_read_token. */
+static int token_before_that = 0;
+
+/* The token read prior to token_before_that. */
+static int two_tokens_ago;
+
+/* If non-zero, it is the token that we want read_token to return
+   regardless of what text is (or isn't) present to be read.  This
+   is reset by read_token.  If token_to_read == WORD or
+   ASSIGNMENT_WORD, yylval.word should be set to word_desc_to_read. */
+static int token_to_read;
+static WORD_DESC *word_desc_to_read;
+
+/* Global var is non-zero when end of file has been reached. */
+int EOF_Reached = 0;
+
+/* yy_getc () returns the next available character from input or EOF.
+   yy_ungetc (c) makes `c' the next character to read.
+   init_yy_io (get, unget, type, location) makes the function GET the
+   installed function for getting the next character, makes UNGET the
+   installed function for un-getting a character, sets the type of stream
+   (either string or file) from TYPE, and makes LOCATION point to where
+   the input is coming from. */
+
+/* Unconditionally returns end-of-file. */
+int
+return_EOF ()
+{
+  return (EOF);
+}
+
+/* Variable containing the current get and unget functions.
+   See ./input.h for a clearer description. */
+BASH_INPUT bash_input;
+
+/* Set all of the fields in BASH_INPUT to NULL. */
+void
+initialize_bash_input ()
+{
+  bash_input.type = st_none;
+  bash_input.name = (char *)NULL;
+  bash_input.location.file = (FILE *)NULL;
+  bash_input.location.string = (char *)NULL;
+  bash_input.getter = (Function *)NULL;
+  bash_input.ungetter = (Function *)NULL;
+}
+
+/* Set the contents of the current bash input stream from
+   GET, UNGET, TYPE, NAME, and LOCATION. */
+void
+init_yy_io (get, unget, type, name, location)
+     Function *get, *unget;
+     int type;
+     char *name;
+     INPUT_STREAM location;
+{
+  bash_input.type = type;
+  FREE (bash_input.name);
+
+  if (name)
+    bash_input.name = savestring (name);
+  else
+    bash_input.name = (char *)NULL;
+
+  /* XXX */
+#if defined (CRAY)
+  memcpy((char *)&bash_input.location.string, (char *)&location.string, sizeof(location));
+#else
+  bash_input.location = location;
+#endif
+  bash_input.getter = get;
+  bash_input.ungetter = unget;
+}
+
+/* Call this to get the next character of input. */
+int
+yy_getc ()
+{
+  return (*(bash_input.getter)) ();
+}
+
+/* Call this to unget C.  That is, to make C the next character
+   to be read. */
+int
+yy_ungetc (c)
+     int c;
+{
+  return (*(bash_input.ungetter)) (c);
+}
+
+#if defined (BUFFERED_INPUT)
+int
+input_file_descriptor ()
+{
+  switch (bash_input.type)
+    {
+    case st_stream:
+      return (fileno (bash_input.location.file));
+    case st_bstream:
+      return (bash_input.location.buffered_fd);
+    case st_stdin:
+    default:
+      return (fileno (stdin));
+    }
+}
+#endif /* BUFFERED_INPUT */
+
+/* **************************************************************** */
+/*                                                                 */
+/*               Let input be read from readline ().               */
+/*                                                                 */
+/* **************************************************************** */
+
+#if defined (READLINE)
+char *current_readline_prompt = (char *)NULL;
+char *current_readline_line = (char *)NULL;
+int current_readline_line_index = 0;
+
+static int
+yy_readline_get ()
+{
+  SigHandler *old_sigint;
+  int line_len, c;
+
+  if (!current_readline_line)
+    {
+      if (!bash_readline_initialized)
+       initialize_readline ();
+
+#if defined (JOB_CONTROL)
+      if (job_control)
+       give_terminal_to (shell_pgrp);
+#endif /* JOB_CONTROL */
+
+      if (signal_is_ignored (SIGINT) == 0)
+       {
+         old_sigint = (SigHandler *)set_signal_handler (SIGINT, sigint_sighandler);
+         interrupt_immediately++;
+       }
+
+      current_readline_line = readline (current_readline_prompt ?
+                                         current_readline_prompt : "");
+
+      if (signal_is_ignored (SIGINT) == 0)
+       {
+         interrupt_immediately--;
+         set_signal_handler (SIGINT, old_sigint);
+       }
+
+      /* Reset the prompt to the decoded value of prompt_string_pointer. */
+      reset_readline_prompt ();
+
+      if (!current_readline_line)
+       return (EOF);
+
+      current_readline_line_index = 0;
+      line_len = strlen (current_readline_line);
+
+      current_readline_line = xrealloc (current_readline_line, 2 + line_len);
+      current_readline_line[line_len++] = '\n';
+      current_readline_line[line_len] = '\0';
+    }
+
+  if (!current_readline_line[current_readline_line_index])
+    {
+      free (current_readline_line);
+      current_readline_line = (char *)NULL;
+      return (yy_readline_get ());
+    }
+  else
+    {
+      c = current_readline_line[current_readline_line_index++];
+      return (c);
+    }
+}
+
+static int
+yy_readline_unget (c)
+     int c;
+{
+  if (current_readline_line_index && current_readline_line)
+    current_readline_line[--current_readline_line_index] = c;
+  return (c);
+}
+
+void  
+with_input_from_stdin ()
+{
+  INPUT_STREAM location;
+
+  if (bash_input.type != st_stdin && stream_on_stack (st_stdin) == 0)
+    {
+      location.string = current_readline_line;
+      init_yy_io (yy_readline_get, yy_readline_unget,
+                 st_stdin, "readline stdin", location);
+    }
+}
+
+#else  /* !READLINE */
+
+void
+with_input_from_stdin ()
+{
+  with_input_from_stream (stdin, "stdin");
+}
+#endif /* !READLINE */
+
+/* **************************************************************** */
+/*                                                                 */
+/*   Let input come from STRING.  STRING is zero terminated.       */
+/*                                                                 */
+/* **************************************************************** */
+
+static int
+yy_string_get ()
+{
+  register char *string;
+  register int c;
+
+  string = bash_input.location.string;
+  c = EOF;
+
+  /* If the string doesn't exist, or is empty, EOF found. */
+  if (string && *string)
+    {
+      c = *string++;
+      bash_input.location.string = string;
+    }
+  return (c);
+}
+
+static int
+yy_string_unget (c)
+     int c;
+{
+  *(--bash_input.location.string) = c;
+  return (c);
+}
+
+void
+with_input_from_string (string, name)
+     char *string, *name;
+{
+  INPUT_STREAM location;
+
+  location.string = string;
+  init_yy_io (yy_string_get, yy_string_unget, st_string, name, location);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                  Let input come from STREAM.                    */
+/*                                                                 */
+/* **************************************************************** */
+
+static int
+yy_stream_get ()
+{
+  int result = EOF;
+
+  if (bash_input.location.file)
+#if !defined (HAVE_RESTARTABLE_SYSCALLS)
+    result = getc_with_restart (bash_input.location.file);
+#else /* HAVE_RESTARTABLE_SYSCALLS */
+    result = getc (bash_input.location.file);
+#endif /* HAVE_RESTARTABLE_SYSCALLS */
+  return (result);
+}
+
+static int
+yy_stream_unget (c)
+     int c;
+{
+  return (ungetc (c, bash_input.location.file));
+}
+
+void
+with_input_from_stream (stream, name)
+     FILE *stream;
+     char *name;
+{
+  INPUT_STREAM location;
+
+  location.file = stream;
+  init_yy_io (yy_stream_get, yy_stream_unget, st_stream, name, location);
+}
+
+typedef struct stream_saver {
+  struct stream_saver *next;
+  BASH_INPUT bash_input;
+  int line;
+#if defined (BUFFERED_INPUT)
+  BUFFERED_STREAM *bstream;
+#endif /* BUFFERED_INPUT */
+} STREAM_SAVER;
+
+/* The globally known line number. */
+int line_number = 0;
+
+STREAM_SAVER *stream_list = (STREAM_SAVER *)NULL;
+
+void
+push_stream ()
+{
+  STREAM_SAVER *saver = (STREAM_SAVER *)xmalloc (sizeof (STREAM_SAVER));
+
+  xbcopy ((char *)&bash_input, (char *)&(saver->bash_input), sizeof (BASH_INPUT));
+
+#if defined (BUFFERED_INPUT)
+  saver->bstream = (BUFFERED_STREAM *)NULL;
+  /* If we have a buffered stream, clear out buffers[fd]. */
+  if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0)
+    {
+      saver->bstream = buffers[bash_input.location.buffered_fd];
+      buffers[bash_input.location.buffered_fd] = (BUFFERED_STREAM *)NULL;
+    }
+#endif /* BUFFERED_INPUT */
+
+  saver->line = line_number;
+  bash_input.name = (char *)NULL;
+  saver->next = stream_list;
+  stream_list = saver;
+  EOF_Reached = line_number = 0;
+}
+
+void
+pop_stream ()
+{
+  if (!stream_list)
+    EOF_Reached = 1;
+  else
+    {
+      STREAM_SAVER *saver = stream_list;
+
+      EOF_Reached = 0;
+      stream_list = stream_list->next;
+
+      init_yy_io (saver->bash_input.getter,
+                 saver->bash_input.ungetter,
+                 saver->bash_input.type,
+                 saver->bash_input.name,
+                 saver->bash_input.location);
+
+#if defined (BUFFERED_INPUT)
+      /* If we have a buffered stream, restore buffers[fd]. */
+      /* If the input file descriptor was changed while this was on the
+        save stack, update the buffered fd to the new file descriptor and
+        re-establish the buffer <-> bash_input fd correspondence. */
+      if (bash_input.type == st_bstream && bash_input.location.buffered_fd >= 0)
+        {
+          if (bash_input_fd_changed)
+           {
+             bash_input_fd_changed = 0;
+             if (default_buffered_input >= 0)
+               {
+                 bash_input.location.buffered_fd = default_buffered_input;
+                 saver->bstream->b_fd = default_buffered_input;
+               }
+           }
+         buffers[bash_input.location.buffered_fd] = saver->bstream;
+        }
+#endif /* BUFFERED_INPUT */
+
+      line_number = saver->line;
+
+      FREE (saver->bash_input.name);
+      free (saver);
+    }
+}
+
+/* Return 1 if a stream of type TYPE is saved on the stack. */
+int
+stream_on_stack (type)
+     enum stream_type type;
+{
+  register STREAM_SAVER *s;
+
+  for (s = stream_list; s; s = s->next)
+    if (s->bash_input.type == type)
+      return 1;
+  return 0;
+}
+
+/*
+ * This is used to inhibit alias expansion and reserved word recognition
+ * inside case statement pattern lists.  A `case statement pattern list' is:
+ *
+ *     everything between the `in' in a `case word in' and the next ')'
+ *     or `esac'
+ *     everything between a `;;' and the next `)' or `esac'
+ */
+static int in_case_pattern_list = 0;
+
+#if defined (ALIAS)
+
+#define END_OF_ALIAS 0
+
+/*
+ * Pseudo-global variables used in implementing token-wise alias expansion.
+ */
+
+static int expand_next_token;
+
+/*
+ * Pushing and popping strings.  This works together with shell_getc to 
+ * implement alias expansion on a per-token basis.
+ */
+
+typedef struct string_saver {
+  struct string_saver *next;
+  int expand_alias;  /* Value to set expand_alias to when string is popped. */
+  char *saved_line;
+  alias_t *expander;   /* alias that caused this line to be pushed. */
+  int saved_line_size, saved_line_index, saved_line_terminator;
+} STRING_SAVER;
+
+STRING_SAVER *pushed_string_list = (STRING_SAVER *)NULL;
+
+#if 0
+static void push_expansion ();
+static void pop_expansion ();
+static int token_is_being_expanded ();
+#endif
+
+/*
+ * Push the current shell_input_line onto a stack of such lines and make S
+ * the current input.  Used when expanding aliases.  EXPAND is used to set
+ * the value of expand_next_token when the string is popped, so that the
+ * word after the alias in the original line is handled correctly when the
+ * alias expands to multiple words.  TOKEN is the token that was expanded
+ * into S; it is saved and used to prevent infinite recursive expansion.
+ */
+static void
+push_string (s, expand, ap)
+     char *s;
+     int expand;
+     alias_t *ap;
+{
+  STRING_SAVER *temp = (STRING_SAVER *) xmalloc (sizeof (STRING_SAVER));
+
+  temp->expand_alias = expand;
+  temp->saved_line = shell_input_line;
+  temp->saved_line_size = shell_input_line_size;
+  temp->saved_line_index = shell_input_line_index;
+  temp->saved_line_terminator = shell_input_line_terminator;
+  temp->expander = ap;
+  temp->next = pushed_string_list;
+  pushed_string_list = temp;
+
+  ap->flags |= AL_BEINGEXPANDED;
+#if 0
+  push_expansion (ap->name);
+#endif
+
+  shell_input_line = s;
+  shell_input_line_size = strlen (s);
+  shell_input_line_index = 0;
+  shell_input_line_terminator = '\0';
+  expand_next_token = 0;
+}
+
+/*
+ * Make the top of the pushed_string stack be the current shell input.
+ * Only called when there is something on the stack.  Called from shell_getc
+ * when it thinks it has consumed the string generated by an alias expansion
+ * and needs to return to the original input line.
+ */
+static void
+pop_string ()
+{
+  STRING_SAVER *t;
+
+  FREE (shell_input_line);
+  shell_input_line = pushed_string_list->saved_line;
+  shell_input_line_index = pushed_string_list->saved_line_index;
+  shell_input_line_size = pushed_string_list->saved_line_size;
+  shell_input_line_terminator = pushed_string_list->saved_line_terminator;
+  expand_next_token = pushed_string_list->expand_alias;
+
+  t = pushed_string_list;
+  pushed_string_list = pushed_string_list->next;
+
+  t->expander->flags &= ~AL_BEINGEXPANDED;
+
+  free((char *)t);
+}
+
+static void
+free_string_list ()
+{
+  register STRING_SAVER *t, *t1;
+
+  for (t = pushed_string_list; t; )
+    {
+      t1 = t->next;
+      FREE (t->saved_line);
+      t->expander->flags &= ~AL_BEINGEXPANDED;
+      free ((char *)t);
+      t = t1;
+    }
+  pushed_string_list = (STRING_SAVER *)NULL;
+}
+
+#if 0
+/* XXX - NO LONGER USED - XXX */
+/* This is a stack to save the values of all tokens for which alias
+   expansion has been performed during the current call to read_token ().
+   It is used to prevent alias expansion loops:
+
+      alias foo=bar
+      alias bar=baz
+      alias baz=foo
+
+   Ideally this would be taken care of by push and pop string, but because
+   of when strings are popped the stack will not contain the correct
+   strings to test against.  (The popping is done in shell_getc, so that when
+   the current string is exhausted, shell_getc can simply pop that string off
+   the stack, restore the previous string, and continue with the character
+   following the token whose expansion was originally pushed on the stack.)
+
+   What we really want is a record of all tokens that have been expanded for
+   aliases during the `current' call to read_token().  This does that, at the
+   cost of being somewhat special-purpose (OK, OK vile and unclean). */
+
+typedef struct _exp_saver {
+      struct _exp_saver *next;
+      char *saved_token;
+} EXPANSION_SAVER;
+
+EXPANSION_SAVER *expanded_token_stack = (EXPANSION_SAVER *)NULL;
+
+static void
+push_expansion (s)
+     char *s;
+{
+  EXPANSION_SAVER *t;
+
+  t = (EXPANSION_SAVER *)xmalloc (sizeof (EXPANSION_SAVER));
+  t->saved_token = savestring (s);
+  t->next = expanded_token_stack;
+  expanded_token_stack = t;
+}
+
+/* Return 1 if TOKEN has already been expanded in the current `stack' of
+   expansions.  If it has been expanded already, it will appear as the value
+   of saved_token for some entry in the stack of expansions created for the
+   current token being expanded. */
+static int
+token_has_been_expanded (token)
+     char *token;
+{
+  register EXPANSION_SAVER *t;
+
+  for (t = expanded_token_stack; t; t = t->next)
+    {
+      if (STREQ (token, t->saved_token))
+       return (1);
+    }
+
+  return (0);
+}
+
+static void
+free_expansion_stack ()
+{
+  register EXPANSION_SAVER *t, *t1;
+
+  for (t = expanded_token_stack; t; )
+    {
+      t1 = t->next;
+      free (t->saved_token);
+      free (t);
+      t = t1;
+    }
+  expanded_token_stack = (EXPANSION_SAVER *)NULL;
+}
+
+static void
+pop_expansion ()
+{
+  EXPANSION_SAVER *t;
+
+  if (expanded_token_stack == NULL)
+    return;
+
+  t = expanded_token_stack;
+  expanded_token_stack = t->next;
+
+  free (t->saved_token);
+  free (t);
+}
+#endif /* 0 */
+#endif /* ALIAS */
+
+/* Return a line of text, taken from wherever yylex () reads input.
+   If there is no more input, then we return NULL.  If REMOVE_QUOTED_NEWLINE
+   is non-zero, we remove unquoted \<newline> pairs.  This is used by
+   read_secondary_line to read here documents. */
+static char *
+read_a_line (remove_quoted_newline)
+     int remove_quoted_newline;
+{
+  static char *line_buffer = (char *)NULL;
+  static int buffer_size = 0;
+  int indx = 0, c, peekc, pass_next;
+
+  pass_next = 0;
+  while (1)
+    {
+      c = yy_getc ();
+
+      /* Allow immediate exit if interrupted during input. */
+      QUIT;
+
+      if (c == 0)
+       continue;
+
+      /* If there is no more input, then we return NULL. */
+      if (c == EOF)
+       {
+         if (indx == 0)
+           return ((char *)NULL);
+         c = '\n';
+       }
+
+      /* `+2' in case the final character in the buffer is a newline. */
+      if (indx + 2 > buffer_size)
+       line_buffer = xrealloc (line_buffer, buffer_size += 128);
+
+      /* IF REMOVE_QUOTED_NEWLINES is non-zero, we are reading a
+        here document with an unquoted delimiter.  In this case,
+        the line will be expanded as if it were in double quotes.
+        We allow a backslash to escape the next character, but we
+        need to treat the backslash specially only if a backslash
+        quoting a backslash-newline pair appears in the line. */
+      if (pass_next)
+        {
+         line_buffer[indx++] = c;
+         pass_next = 0;
+        }
+      else if (c == '\\' && remove_quoted_newline)
+       {
+         peekc = yy_getc ();
+         if (peekc == '\n')
+           continue;   /* Make the unquoted \<newline> pair disappear. */
+         else
+           {
+             yy_ungetc (peekc);
+             pass_next = 1;
+             line_buffer[indx++] = c;          /* Preserve the backslash. */
+           }
+       }
+      else
+       line_buffer[indx++] = c;
+
+      if (c == '\n')
+       {
+         line_buffer[indx] = '\0';
+         return (line_buffer);
+       }
+    }
+}
+
+/* Return a line as in read_a_line (), but insure that the prompt is
+   the secondary prompt.  This is used to read the lines of a here
+   document.  REMOVE_QUOTED_NEWLINE is non-zero if we should remove
+   newlines quoted with backslashes while reading the line.  It is
+   non-zero unless the delimiter of the here document was quoted. */
+char *
+read_secondary_line (remove_quoted_newline)
+     int remove_quoted_newline;
+{
+  prompt_string_pointer = &ps2_prompt;
+  prompt_again ();
+  return (read_a_line (remove_quoted_newline));
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                             YYLEX ()                            */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Reserved words.  These are only recognized as the first word of a
+   command. */
+STRING_INT_ALIST word_token_alist[] = {
+  { "if", IF },
+  { "then", THEN },
+  { "else", ELSE },
+  { "elif", ELIF },
+  { "fi", FI },
+  { "case", CASE },
+  { "esac", ESAC },
+  { "for", FOR },
+#if defined (SELECT_COMMAND)
+  { "select", SELECT },
+#endif
+  { "while", WHILE },
+  { "until", UNTIL },
+  { "do", DO },
+  { "done", DONE },
+  { "in", IN },
+  { "function", FUNCTION },
+#if defined (COMMAND_TIMING)
+  { "time", TIME },
+#endif
+  { "{", '{' },
+  { "}", '}' },
+  { "!", BANG },
+  { (char *)NULL, 0}
+};
+
+/* Return the next shell input character.  This always reads characters
+   from shell_input_line; when that line is exhausted, it is time to
+   read the next line.  This is called by read_token when the shell is
+   processing normal command input. */
+
+static int
+shell_getc (remove_quoted_newline)
+     int remove_quoted_newline;
+{
+  register int i;
+  int c;
+  static int mustpop = 0;
+
+  QUIT;
+
+#if defined (ALIAS)
+  /* If shell_input_line[shell_input_line_index] == 0, but there is
+     something on the pushed list of strings, then we don't want to go
+     off and get another line.  We let the code down below handle it. */
+
+  if (!shell_input_line || ((!shell_input_line[shell_input_line_index]) &&
+                           (pushed_string_list == (STRING_SAVER *)NULL)))
+#else /* !ALIAS */
+  if (!shell_input_line || !shell_input_line[shell_input_line_index])
+#endif /* !ALIAS */
+    {
+      line_number++;
+
+    restart_read:
+
+      /* Allow immediate exit if interrupted during input. */
+      QUIT;
+
+      i = 0;
+      shell_input_line_terminator = 0;
+
+#if defined (JOB_CONTROL)
+      /* This can cause a problem when reading a command as the result
+        of a trap, when the trap is called from flush_child.  This call
+        had better not cause jobs to disappear from the job table in
+        that case, or we will have big trouble. */
+      notify_and_cleanup ();
+#else /* !JOB_CONTROL */
+      cleanup_dead_jobs ();
+#endif /* !JOB_CONTROL */
+
+#if defined (READLINE)
+      if (interactive && bash_input.type != st_string && no_line_editing)
+#else
+      if (interactive && bash_input.type != st_string)
+#endif
+       print_prompt ();
+
+      if (bash_input.type == st_stream)
+       clearerr (stdin);
+
+      while (c = yy_getc ())
+       {
+         /* Allow immediate exit if interrupted during input. */
+         QUIT;
+
+         if (i + 2 > shell_input_line_size)
+           {
+             shell_input_line_size += 256;
+             shell_input_line = xrealloc (shell_input_line, shell_input_line_size);
+           }
+
+         if (c == EOF)
+           {
+             if (bash_input.type == st_stream)
+               clearerr (stdin);
+
+             if (i == 0)
+               shell_input_line_terminator = EOF;
+
+             shell_input_line[i] = '\0';
+             break;
+           }
+
+         shell_input_line[i++] = c;
+
+         if (c == '\n')
+           {
+             shell_input_line[--i] = '\0';
+             current_command_line_count++;
+             break;
+           }
+       }
+      shell_input_line_index = 0;
+      shell_input_line_len = i;                /* == strlen (shell_input_line) */
+
+#if defined (HISTORY)
+#if 0
+      if (interactive && shell_input_line && shell_input_line[0])
+#else
+      if (remember_on_history && shell_input_line && shell_input_line[0])
+#endif
+       {
+         char *expansions;
+
+         expansions = pre_process_line (shell_input_line, 1, 1);
+
+         free (shell_input_line);
+         shell_input_line = expansions;
+         shell_input_line_len = shell_input_line ?
+                                strlen (shell_input_line) :
+                                0;
+         if (!shell_input_line_len)
+           current_command_line_count--;
+
+         /* We have to force the xrealloc below because we don't know the
+            true allocated size of shell_input_line anymore. */
+         shell_input_line_size = shell_input_line_len;
+       }
+#endif /* HISTORY */
+
+      if (shell_input_line)
+       {
+         /* Lines that signify the end of the shell's input should not be
+            echoed. */
+         if (echo_input_at_read && (shell_input_line[0] ||
+                                    shell_input_line_terminator != EOF))
+           fprintf (stderr, "%s\n", shell_input_line);
+       }
+      else
+       {
+         shell_input_line_size = 0;
+         prompt_string_pointer = &current_prompt_string;
+         prompt_again ();
+         goto restart_read;
+       }
+
+      /* Add the newline to the end of this string, iff the string does
+        not already end in an EOF character.  */
+      if (shell_input_line_terminator != EOF)
+       {
+         if (shell_input_line_len + 3 > shell_input_line_size)
+           shell_input_line = xrealloc (shell_input_line,
+                                       1 + (shell_input_line_size += 2));
+
+         shell_input_line[shell_input_line_len] = '\n';
+         shell_input_line[shell_input_line_len + 1] = '\0';
+       }
+    }
+  
+  c = shell_input_line[shell_input_line_index];
+
+  if (c)
+    shell_input_line_index++;
+
+  if (c == '\\' && remove_quoted_newline &&
+      shell_input_line[shell_input_line_index] == '\n')
+    {
+       prompt_again ();
+       line_number++;
+       goto restart_read;
+    }
+
+#if defined (ALIAS)
+  /* If C is NULL, we have reached the end of the current input string.  If
+     pushed_string_list is non-empty, it's time to pop to the previous string
+     because we have fully consumed the result of the last alias expansion.
+     Do it transparently; just return the next character of the string popped
+     to. */
+  if (!c && (pushed_string_list != (STRING_SAVER *)NULL))
+    {
+      if (mustpop)
+        {
+          pop_string ();
+          c = shell_input_line[shell_input_line_index];
+         if (c)
+           shell_input_line_index++;
+         mustpop--;
+        }
+      else
+        {
+          mustpop++;
+          c = ' ';
+        }
+    }
+#endif /* ALIAS */
+
+  if (!c && shell_input_line_terminator == EOF)
+    return ((shell_input_line_index != 0) ? '\n' : EOF);
+
+  return ((unsigned char)c);
+}
+
+/* Put C back into the input for the shell. */
+static void
+shell_ungetc (c)
+     int c;
+{
+  if (shell_input_line && shell_input_line_index)
+    shell_input_line[--shell_input_line_index] = c;
+}
+
+static void
+shell_ungetchar ()
+{
+  if (shell_input_line && shell_input_line_index)
+    shell_input_line_index--;
+}
+
+/* Discard input until CHARACTER is seen, then push that character back
+   onto the input stream. */
+static void
+discard_until (character)
+     int character;
+{
+  int c;
+
+  while ((c = shell_getc (0)) != EOF && c != character)
+    ;
+
+  if (c != EOF)
+    shell_ungetc (c);
+}
+
+void
+execute_prompt_command (command)
+     char *command;
+{
+  Function *temp_last, *temp_this;
+  char *last_lastarg;
+  int temp_exit_value, temp_eof_encountered;
+
+  temp_last = last_shell_builtin;
+  temp_this = this_shell_builtin;
+  temp_exit_value = last_command_exit_value;
+  temp_eof_encountered = eof_encountered;
+  last_lastarg = get_string_value ("_");
+  if (last_lastarg)
+    last_lastarg = savestring (last_lastarg);
+
+  parse_and_execute (savestring (command), "PROMPT_COMMAND", 0);
+
+  last_shell_builtin = temp_last;
+  this_shell_builtin = temp_this;
+  last_command_exit_value = temp_exit_value;
+  eof_encountered = temp_eof_encountered;
+
+  bind_variable ("_", last_lastarg);
+  FREE (last_lastarg);
+
+  if (token_to_read == '\n')   /* reset_parser was called */
+    token_to_read = 0;
+}
+
+/* Place to remember the token.  We try to keep the buffer
+   at a reasonable size, but it can grow. */
+static char *token = (char *)NULL;
+
+/* Current size of the token buffer. */
+static int token_buffer_size = 0;
+
+/* Command to read_token () explaining what we want it to do. */
+#define READ 0
+#define RESET 1
+#define prompt_is_ps1 \
+      (!prompt_string_pointer || prompt_string_pointer == &ps1_prompt)
+
+/* Function for yyparse to call.  yylex keeps track of
+   the last two tokens read, and calls read_token.  */
+static int
+yylex ()
+{
+  if (interactive && (current_token == 0 || current_token == '\n'))
+    {
+      /* Before we print a prompt, we might have to check mailboxes.
+        We do this only if it is time to do so. Notice that only here
+        is the mail alarm reset; nothing takes place in check_mail ()
+        except the checking of mail.  Please don't change this. */
+      if (prompt_is_ps1 && time_to_check_mail ())
+       {
+         check_mail ();
+         reset_mail_timer ();
+       }
+
+      /* Avoid printing a prompt if we're not going to read anything, e.g.
+        after resetting the parser with read_token (RESET). */
+      if (token_to_read == 0 && interactive)
+       prompt_again ();
+    }
+
+  two_tokens_ago = token_before_that;
+  token_before_that = last_read_token;
+  last_read_token = current_token;
+  current_token = read_token (READ);
+  return (current_token);
+}
+
+/* When non-zero, we have read the required tokens
+   which allow ESAC to be the next one read. */
+static int allow_esac_as_next = 0;
+
+/* When non-zero, accept single '{' as a token itself. */
+static int allow_open_brace = 0;
+
+/* DELIMITERS is a stack of the nested delimiters that we have
+   encountered so far. */
+static char *delimiters = (char *)NULL;
+
+/* Offset into the stack of delimiters. */
+int delimiter_depth = 0;
+
+/* How many slots are allocated to DELIMITERS. */
+static int delimiter_space = 0;
+  
+void
+gather_here_documents ()
+{
+  int r = 0;
+  while (need_here_doc)
+    {
+      make_here_document (redir_stack[r++]);
+      need_here_doc--;
+    }
+}
+
+/* Macro for accessing the top delimiter on the stack.  Returns the
+   delimiter or zero if none. */
+#define current_delimiter() \
+  (delimiter_depth ? delimiters[delimiter_depth - 1] : 0)
+
+#define push_delimiter(character) \
+  do \
+    { \
+      if (delimiter_depth + 2 > delimiter_space) \
+       delimiters = xrealloc \
+         (delimiters, (delimiter_space += 10) * sizeof (char)); \
+      delimiters[delimiter_depth] = character; \
+      delimiter_depth++; \
+    } \
+  while (0)
+
+/* When non-zero, an open-brace used to create a group is awaiting a close
+   brace partner. */
+static int open_brace_awaiting_satisfaction = 0;
+
+#define command_token_position(token) \
+  (((token) == ASSIGNMENT_WORD) || \
+   ((token) != SEMI_SEMI && reserved_word_acceptable(token)))
+
+#define assignment_acceptable(token) command_token_position(token) && \
+                                       (in_case_pattern_list == 0)
+
+/* Check to see if TOKEN is a reserved word and return the token
+   value if it is. */
+#define CHECK_FOR_RESERVED_WORD(tok) \
+  do { \
+    if (!dollar_present && !quoted && \
+       reserved_word_acceptable (last_read_token)) \
+      { \
+       int i; \
+       for (i = 0; word_token_alist[i].word != (char *)NULL; i++) \
+         if (STREQ (tok, word_token_alist[i].word)) \
+           { \
+             if (in_case_pattern_list && (word_token_alist[i].token != ESAC)) \
+               break; \
+             if (word_token_alist[i].token == ESAC) \
+               in_case_pattern_list = 0; \
+             if (word_token_alist[i].token == '{') \
+               open_brace_awaiting_satisfaction++; \
+             return (word_token_alist[i].token); \
+           } \
+      } \
+  } while (0)
+
+#if defined (ALIAS)
+
+    /* OK, we have a token.  Let's try to alias expand it, if (and only if)
+       it's eligible.
+
+       It is eligible for expansion if the shell is in interactive mode, and
+       the token is unquoted and the last token read was a command
+       separator (or expand_next_token is set), and we are currently
+       processing an alias (pushed_string_list is non-empty) and this
+       token is not the same as the current or any previously
+       processed alias.
+
+       Special cases that disqualify:
+        In a pattern list in a case statement (in_case_pattern_list). */
+static int
+alias_expand_token (token)
+     char *token;
+{
+  char *expanded;
+  int c, expand_next;
+  alias_t *ap;
+
+  if (expand_next_token || command_token_position (last_read_token) && !in_case_pattern_list)
+    {
+      ap = find_alias (token);
+
+#if 0
+      /* Currently expanding this token. */
+      if ((expanded_token_stack && token_has_been_expanded (token)))
+       return (NO_EXPANSION);
+#else
+      if (ap && (ap->flags & AL_BEINGEXPANDED))
+       return (NO_EXPANSION);
+#endif
+
+      expanded = ap ? savestring (ap->value) : (char *)NULL;
+      if (expanded)
+       {
+         push_string (expanded, ap->flags & AL_EXPANDNEXT, ap);
+         return (RE_READ_TOKEN);
+       }
+      else
+       /* This is an eligible token that does not have an expansion. */
+       return (NO_EXPANSION);
+    }
+  return (NO_EXPANSION);
+}
+#endif /* ALIAS */
+
+/* Handle special cases of token recognition:
+       IN is recognized if the last token was WORD and the token
+       before that was FOR or CASE or SELECT.
+
+       DO is recognized if the last token was WORD and the token
+       before that was FOR or SELECT.
+
+       ESAC is recognized if the last token caused `allow_esac_as_next'
+       to be set
+
+       `{' is recognized if the last token as WORD and the token
+       before that was FUNCTION.
+
+       `}' is recognized if there is an unclosed `{' prsent.
+*/
+
+static int
+special_case_tokens (token)
+     char *token;
+{
+  if ((last_read_token == WORD) &&
+#if defined (SELECT_COMMAND)
+      ((token_before_that == FOR) || (token_before_that == CASE) || (token_before_that == SELECT)) &&
+#else
+      ((token_before_that == FOR) || (token_before_that == CASE)) &&
+#endif
+      (token[0] == 'i' && token[1] == 'n' && !token[2]))
+    {
+      if (token_before_that == CASE)
+       {
+         in_case_pattern_list = 1;
+         allow_esac_as_next++;
+       }
+      return (IN);
+    }
+
+  if (last_read_token == WORD &&
+#if defined (SELECT_COMMAND)
+      (token_before_that == FOR || token_before_that == SELECT) &&
+#else
+      (token_before_that == FOR) &&
+#endif
+      (token[0] == 'd' && token[1] == 'o' && !token[2]))
+    return (DO);
+
+  /* Ditto for ESAC in the CASE case. 
+     Specifically, this handles "case word in esac", which is a legal
+     construct, certainly because someone will pass an empty arg to the
+     case construct, and we don't want it to barf.  Of course, we should
+     insist that the case construct has at least one pattern in it, but
+     the designers disagree. */
+  if (allow_esac_as_next)
+    {
+      allow_esac_as_next--;
+      if (STREQ (token, "esac"))
+       {
+         in_case_pattern_list = 0;
+         return (ESAC);
+       }
+    }
+
+  if (allow_open_brace)
+    {
+      allow_open_brace = 0;
+      if (token[0] == '{' && !token[1])
+       {
+         open_brace_awaiting_satisfaction++;
+         return ('{');
+       }
+    }
+
+  if (open_brace_awaiting_satisfaction && token[0] == '}' && !token[1])
+    {
+      open_brace_awaiting_satisfaction--;
+      return ('}');
+    }
+
+  return (-1);
+}
+
+/* Called from shell.c when Control-C is typed at top level.  Or
+   by the error rule at top level. */
+void
+reset_parser ()
+{
+  delimiter_depth = 0; /* No delimiters found so far. */
+  open_brace_awaiting_satisfaction = 0;
+  in_case_pattern_list = 0;
+
+#if defined (ALIAS)
+  if (pushed_string_list)
+    {
+      free_string_list ();
+      pushed_string_list = (STRING_SAVER *)NULL;
+    }
+
+#if 0
+  if (expanded_token_stack)
+    {
+      free_expansion_stack ();
+      expanded_token_stack = (EXPANSION_SAVER *)NULL;
+    }
+#endif
+
+  expand_next_token = 0;
+#endif /* ALIAS */
+
+  if (shell_input_line)
+    {
+      free (shell_input_line);
+      shell_input_line = (char *)NULL;
+      shell_input_line_size = shell_input_line_index = 0;
+    }
+
+  last_read_token = '\n';
+  token_to_read = '\n';
+}
+
+/* Read the next token.  Command can be READ (normal operation) or 
+   RESET (to normalize state). */
+static int
+read_token (command)
+     int command;
+{
+  int character;               /* Current character. */
+  int peek_char;               /* Temporary look-ahead character. */
+  int result;                  /* The thing to return. */
+
+  if (command == RESET)
+    {
+      reset_parser ();
+      return ('\n');
+    }
+
+  if (token_to_read)
+    {
+      result = token_to_read;
+      if (token_to_read == WORD || token_to_read == ASSIGNMENT_WORD)
+       yylval.word = word_desc_to_read;
+      token_to_read = 0;
+      return (result);
+    }
+
+#if defined (ALIAS)
+  /* If we hit read_token () and there are no saved strings on the
+     pushed_string_list, then we are no longer currently expanding a
+     token.  This can't be done in pop_stream, because pop_stream
+     may pop the stream before the current token has finished being
+     completely expanded (consider what happens when we alias foo to foo,
+     and then try to expand it). */
+#if 0
+  if (!pushed_string_list && expanded_token_stack)
+    {
+      free_expansion_stack ();
+      expanded_token_stack = (EXPANSION_SAVER *)NULL;
+    }
+#endif
+
+  /* This is a place to jump back to once we have successfully expanded a
+     token with an alias and pushed the string with push_string () */
+ re_read_token:
+#endif /* ALIAS */
+
+  /* Read a single word from input.  Start by skipping blanks. */
+  while ((character = shell_getc (1)) != EOF && whitespace (character))
+    ;
+
+  if (character == EOF)
+    {
+      EOF_Reached = 1;
+      return (yacc_EOF);
+    }
+
+  if (character == '#' && (!interactive || interactive_comments))
+    {
+      /* A comment.  Discard until EOL or EOF, and then return a newline. */
+      discard_until ('\n');
+      shell_getc (0);
+      character = '\n';        /* this will take the next if statement and return. */
+    }
+
+  if (character == '\n')
+    {
+      /* If we're about to return an unquoted newline, we can go and collect
+        the text of any pending here document. */
+      if (need_here_doc)
+       gather_here_documents ();
+
+#if defined (ALIAS)
+      expand_next_token = 0;
+#endif /* ALIAS */
+
+      return (character);
+    }
+
+  /* Shell meta-characters. */
+  if (shellmeta (character))
+    {
+#if defined (ALIAS)
+      /* Turn off alias tokenization iff this character sequence would
+        not leave us ready to read a command. */
+      if (character == '<' || character == '>')
+       expand_next_token = 0;
+#endif /* ALIAS */
+
+      peek_char = shell_getc (1);
+      if (character == peek_char)
+       {
+         switch (character)
+           {
+           case '<':
+             /* If '<' then we could be at "<<" or at "<<-".  We have to
+                look ahead one more character. */
+             peek_char = shell_getc (1);
+             if (peek_char == '-')
+               return (LESS_LESS_MINUS);
+             else
+               {
+                 shell_ungetc (peek_char);
+                 return (LESS_LESS);
+               }
+
+           case '>':
+             return (GREATER_GREATER);
+
+           case ';':
+             in_case_pattern_list = 1;
+#if defined (ALIAS)
+             expand_next_token = 0;
+#endif /* ALIAS */
+             return (SEMI_SEMI);
+
+           case '&':
+             return (AND_AND);
+
+           case '|':
+             return (OR_OR);
+           }
+       }
+      else if (character == '<' && peek_char == '&')
+       return (LESS_AND);
+      else if (character == '>' && peek_char == '&')
+       return (GREATER_AND);
+      else if (character == '<' && peek_char == '>')
+       return (LESS_GREATER);
+      else if (character == '>' && peek_char == '|')
+       return (GREATER_BAR);
+      else if (peek_char == '>' && character == '&')
+       return (AND_GREATER);
+
+      shell_ungetc (peek_char);
+
+      /* If we look like we are reading the start of a function
+        definition, then let the reader know about it so that
+        we will do the right thing with `{'. */
+      if (character == ')' && last_read_token == '(' && token_before_that == WORD)
+       {
+         allow_open_brace = 1;
+#if defined (ALIAS)
+         expand_next_token = 0;
+#endif /* ALIAS */
+       }
+
+      if (in_case_pattern_list && character == ')')
+       in_case_pattern_list = 0;
+
+#if defined (PROCESS_SUBSTITUTION)
+      /* Check for the constructs which introduce process substitution.
+        Shells running in `posix mode' don't do process substitution. */
+      if (posixly_correct ||
+         ((character != '>' && character != '<') || peek_char != '('))
+#endif /* PROCESS_SUBSTITUTION */
+       return (character);
+    }
+
+  /* Hack <&- (close stdin) case. */
+  if (character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
+    return (character);
+     
+  /* Okay, if we got this far, we have to read a word.  Read one,
+     and then check it against the known ones. */
+  result = read_token_word (character);
+#if defined (ALIAS)
+  if (result == RE_READ_TOKEN)
+    goto re_read_token;
+#endif
+  return result;
+}
+
+static int
+read_token_word (character)
+     int character;
+{
+  /* The value for YYLVAL when a WORD is read. */
+  WORD_DESC *the_word;
+
+  /* Index into the token that we are building. */
+  int token_index;
+
+  /* ALL_DIGITS becomes zero when we see a non-digit. */
+  int all_digits;
+
+  /* DOLLAR_PRESENT becomes non-zero if we see a `$'. */
+  int dollar_present;
+
+  /* QUOTED becomes non-zero if we see one of ("), ('), (`), or (\). */
+  int quoted;
+
+  /* Non-zero means to ignore the value of the next character, and just
+     to add it no matter what. */
+ int pass_next_character;
+
+  /* Non-zero means parsing a dollar-paren construct.  It is the count of
+     un-quoted close parens we need to see. */
+  int dollar_paren_level;
+
+  /* Another level variable.  This one is for dollar_parens inside of
+     double-quotes. */
+  int delimited_paren_level;
+
+  /* Non-zero means parsing a dollar-bracket construct ($[...]).  It is
+     the count of un-quoted `]' characters we need to see. */
+  int dollar_bracket_level;
+
+  /* Non-zero means parsing a `${' construct.  It is the count of
+     un-quoted `}' we need to see. */
+  int dollar_brace_level;
+
+  /* A level variable for parsing '${ ... }' constructs inside of double
+     quotes. */
+  int delimited_brace_level;
+
+  /* A boolean variable denoting whether or not we are currently parsing
+     a double-quoted string embedded in a $( ) or ${ } construct. */
+  int embedded_quoted_string;
+
+  /* The current delimiting character. */
+  int cd;
+  int result, peek_char;
+
+  if (token_buffer_size < TOKEN_DEFAULT_GROW_SIZE)
+    {
+      FREE (token);
+      token = xmalloc (token_buffer_size = TOKEN_DEFAULT_GROW_SIZE);
+    }
+
+  token_index = 0;
+  all_digits = digit (character);
+  dollar_present = quoted = 0;
+  embedded_quoted_string = pass_next_character = 0;
+  dollar_paren_level = delimited_paren_level = 0;
+  dollar_brace_level = delimited_brace_level = dollar_bracket_level = 0;
+
+  for (;;)
+    {
+      if (character == EOF)
+       goto got_token;
+
+      if (pass_next_character)
+       {
+         pass_next_character = 0;
+         goto got_character;
+       }
+
+      cd = current_delimiter ();
+
+      if (cd && character == '\\' && cd != '\'')
+       {
+         peek_char = shell_getc (0);
+         if (peek_char != '\\')
+           shell_ungetc (peek_char);
+         else
+           {
+             token[token_index++] = character;
+             goto got_character;
+           }
+       }
+
+      /* Handle backslashes.  Quote lots of things when not inside of
+        double-quotes, quote some things inside of double-quotes. */
+          
+      if (character == '\\' && (delimiter_depth == 0 || cd != '\''))
+       {
+         peek_char = shell_getc (0);
+
+         /* Backslash-newline is ignored in all cases excepting
+            when quoted with single quotes. */
+         if (peek_char == '\n')
+           {
+             character = '\n';
+             goto next_character;
+           }
+         else
+           {
+             shell_ungetc (peek_char);
+
+             /* If the next character is to be quoted, do it now. */
+             if (cd == 0 || cd == '`' ||
+                 (cd == '"' && member (peek_char, slashify_in_quotes)))
+               {
+                 pass_next_character++;
+                 quoted = 1;
+                 goto got_character;
+               }
+           }
+       }
+
+      /* This is a hack, in its present form.  If a backquote substitution
+        appears within double quotes, everything within the backquotes
+        should be read as part of a single word.  Jesus.  Now I see why
+        Korn introduced the $() form. */
+      if (delimiter_depth && (cd == '"') && (character == '`'))
+       {
+         push_delimiter (character);
+         goto got_character;
+       }
+
+      /* cd = current_delimiter (); */         /* XXX - may not need */
+      if (delimiter_depth)
+       {
+         if (character == cd)
+           {
+             /* If we see a double quote while parsing a double-quoted
+                $( ) or ${ }, and we have not seen ) or }, respectively,
+                 note that we are in the middle of reading an embedded
+                 quoted string. */
+             if ((delimited_paren_level || delimited_brace_level) &&
+                 (character == '"'))
+               {
+                 embedded_quoted_string = 1 - embedded_quoted_string;
+                 goto got_character;
+               }
+               
+             delimiter_depth--;
+             goto got_character;
+           }
+       }
+
+      /* If the delimiter character is not single quote, parse some of
+        the shell expansions that must be read as a single word. */
+      if (cd != '\'')
+       {
+#if defined (PROCESS_SUBSTITUTION)
+         if (character == '$' || character == '<' || character == '>')
+#else
+         if (character == '$')
+#endif /* !PROCESS_SUBSTITUTION */
+           {
+             /* If we're in the middle of parsing a $( ) or ${ }
+                construct with an embedded quoted string, don't
+                bother looking at this character any further. */
+             if (embedded_quoted_string)
+               goto got_character;
+
+             peek_char = shell_getc (1);
+             shell_ungetc (peek_char);
+             if (peek_char == '(')
+               {
+                 if (!delimiter_depth)
+                   dollar_paren_level++;
+                 else
+                   delimited_paren_level++;
+
+                 pass_next_character++;
+                 goto got_character;
+               }
+             else if (peek_char == '[' && character == '$')
+               {
+                 if (!delimiter_depth)
+                   dollar_bracket_level++;
+
+                 pass_next_character++;
+                 goto got_character;
+               }
+             /* This handles ${...} constructs. */
+             else if (peek_char == '{' && character == '$')
+               {
+                 if (!delimiter_depth)
+                   dollar_brace_level++;
+                 else
+                   delimited_brace_level++;
+
+                 pass_next_character++;
+                 goto got_character;
+               }
+           }
+
+#if defined (ARRAY_VARS)
+         if (character == '=')
+           {
+             if (embedded_quoted_string)
+               goto got_character;
+
+             peek_char = shell_getc (1);
+             shell_ungetc (peek_char);
+             if (peek_char == '(')
+               {
+                 if (!delimiter_depth)
+                   dollar_paren_level++;
+                 else
+                   delimited_paren_level++;
+
+                 pass_next_character++;
+                 goto got_character;
+               }
+           }
+#endif
+
+/* Generally, delim_xxx counts occurrences of xxx inside double quotes, while
+   dollar_xxx counts unquoted occurrences.  These macros take care of
+   incrementing and decrementing both appropriately. */
+#define INC_DELIM(delim, dol) \
+  do \
+    { \
+      if (delimiter_depth && delim) \
+       delim++; \
+      if (!delimiter_depth && dol) \
+       dol++; \
+    } \
+  while (0)
+
+#define DEC_DELIM(delim, dol) \
+  do \
+    { \
+      if (delimiter_depth && delim) \
+       delim--; \
+      if (!delimiter_depth && dol) \
+       { \
+         dol--; \
+         goto got_character; \
+       } \
+    } \
+  while (0)
+
+         /* If we are parsing a $() or $[] construct, we need to balance
+            parens and brackets inside the construct.  This whole function
+            could use a rewrite. */
+         if (character == '(' && !embedded_quoted_string)
+           INC_DELIM (delimited_paren_level, dollar_paren_level);
+
+         /* This code needs to take into account whether we are inside a
+            case statement pattern list, and whether this paren is supposed
+            to terminate it (hey, it could happen).  It's not as simple
+            as just using in_case_pattern_list, because we're not parsing
+            anything while we're reading a $( ) construct. */
+         else if (character == ')' && !embedded_quoted_string)
+           DEC_DELIM (delimited_paren_level, dollar_paren_level);
+
+         else if (character == '[' && !delimiter_depth && dollar_bracket_level)
+           dollar_bracket_level++;
+
+         else if (character == ']' && !delimiter_depth && dollar_bracket_level)
+           {
+             dollar_bracket_level--;
+             goto got_character;
+           }
+
+         else if (character == '{' && embedded_quoted_string == 0)
+           INC_DELIM (delimited_brace_level, dollar_brace_level);
+
+         else if (character == '}' && embedded_quoted_string == 0)
+           DEC_DELIM (delimited_brace_level, dollar_brace_level);
+       }
+
+      /* When not parsing a multi-character word construct, shell meta-
+        characters break words. */
+      if (!dollar_paren_level && !dollar_bracket_level &&
+         !dollar_brace_level && !delimiter_depth &&
+         shellbreak (character))
+       {
+         shell_ungetc (character);
+         goto got_token;
+       }
+
+      /* If we see a delimiter, remember it. */
+      if (!delimiter_depth && shellquote (character))
+       {
+         push_delimiter (character);
+         quoted = 1;
+         goto got_character;
+       }
+
+#if 0
+      all_digits = all_digits ? digit (character) : 0;
+#else
+      all_digits &= digit (character);
+#endif
+      dollar_present |= character == '$';
+
+    got_character:
+
+      if (character == CTLESC /* || character == CTLNUL */)
+       token[token_index++] = CTLESC;
+
+      token[token_index++] = character;
+
+      if (token_index == (token_buffer_size - 1))
+       {
+         token_buffer_size += TOKEN_DEFAULT_GROW_SIZE;
+         token = xrealloc (token, token_buffer_size);
+       }
+    next_character:
+      if (character == '\n' && interactive && bash_input.type == st_stream)
+       prompt_again ();
+
+      /* We want to remove quoted newlines (that is, a \<newline> pair)
+        unless we are within single quotes or pass_next_character is
+        set (the shell equivalent of literal-next). */
+      cd = current_delimiter ();
+      character = shell_getc (cd != '\'' && !pass_next_character);
+    }  /* end for (;;) */
+
+got_token:
+
+  token[token_index] = '\0';
+
+  /* EOF while reading a multi-char word construct generates an error. */      
+  if ((delimiter_depth || dollar_paren_level || dollar_bracket_level) &&
+      character == EOF)
+    {
+      char reporter = '\0';
+
+      if (delimiter_depth == 0)
+       {
+         if (dollar_paren_level)
+           reporter = ')';
+         else if (dollar_bracket_level)
+           reporter = ']';
+       }
+
+      if (reporter == 0)
+       reporter = current_delimiter ();
+
+      report_error ("unexpected EOF while looking for `%c'", reporter);
+      return (-1);
+    }
+
+  /* Check to see what thing we should return.  If the last_read_token
+     is a `<', or a `&', or the character which ended this token is
+     a '>' or '<', then, and ONLY then, is this input token a NUMBER.
+     Otherwise, it is just a word, and should be returned as such. */
+  if (all_digits && (character == '<' || character == '>' ||
+                   last_read_token == LESS_AND ||
+                   last_read_token == GREATER_AND))
+      {
+       yylval.number = atoi (token);
+       return (NUMBER);
+      }
+
+  /* Check for special case tokens. */
+  result = special_case_tokens (token);
+  if (result >= 0)
+    return result;
+
+#if defined (ALIAS)
+  /* Posix.2 does not allow reserved words to be aliased, so check for all
+     of them, including special cases, before expanding the current token
+     as an alias. */
+  if (posixly_correct)
+    CHECK_FOR_RESERVED_WORD (token);
+
+  /* Aliases are expanded in interactive shells only, and quoting inhibits
+     alias expansion. */
+  if (interactive_shell && quoted == 0)
+    {
+      result = alias_expand_token (token);
+      if (result == RE_READ_TOKEN)
+       return (RE_READ_TOKEN);
+      else if (result == NO_EXPANSION)
+       expand_next_token = 0;
+    }
+
+  /* If not in Posix.2 mode, check for reserved words after alias
+     expansion. */
+  if (!posixly_correct)
+#endif
+    CHECK_FOR_RESERVED_WORD (token);
+
+  the_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
+  the_word->word = xmalloc (1 + token_index);
+  the_word->flags = 0;
+  strcpy (the_word->word, token);
+  if (dollar_present)
+    the_word->flags |= W_HASDOLLAR;
+  if (quoted)
+    the_word->flags |= W_QUOTED;
+  if (assignment (token))
+    the_word->flags |= W_ASSIGNMENT;
+
+  yylval.word = the_word;
+
+  /* A word is an assignment if it appears at the beginning of a
+     simple command, or after another assignment word.  This is
+     context-dependent, so it cannot be handled in the grammar. */
+  result = (assignment_acceptable (last_read_token) &&
+           (the_word->flags & W_ASSIGNMENT)) ? ASSIGNMENT_WORD : WORD;
+
+  if (last_read_token == FUNCTION)
+    allow_open_brace = 1;
+
+  return (result);
+}
+
+/* Return 1 if TOKEN is a token that after being read would allow
+   a reserved word to be seen, else 0. */
+static int
+reserved_word_acceptable (token)
+     int token;
+{
+  if (token == '\n' || token == ';' || token == '(' || token == ')' ||
+      token == '|' || token == '&' || token == '{' ||
+      token == '}' ||                  /* XXX */
+      token == AND_AND ||
+      token == BANG ||
+      token == TIME ||
+      token == DO ||
+      token == ELIF ||
+      token == ELSE ||
+      token == FI ||
+      token == IF ||
+      token == OR_OR ||
+      token == SEMI_SEMI ||
+      token == THEN ||
+      token == UNTIL ||
+      token == WHILE ||
+      token == DONE ||         /* XXX these two are experimental */
+      token == ESAC ||
+      token == 0)
+    return (1);
+  else
+    return (0);
+}
+
+/* Return the index of TOKEN in the alist of reserved words, or -1 if
+   TOKEN is not a shell reserved word. */
+int
+find_reserved_word (token)
+     char *token;
+{
+  int i;
+  for (i = 0; word_token_alist[i].word; i++)
+    if (STREQ (token, word_token_alist[i].word))
+      return i;
+  return -1;
+}
+
+#if defined (READLINE)
+/* Called after each time readline is called.  This insures that whatever
+   the new prompt string is gets propagated to readline's local prompt
+   variable. */
+static void
+reset_readline_prompt ()
+{
+  char *temp_prompt;
+
+  if (prompt_string_pointer)
+    {
+      temp_prompt = (*prompt_string_pointer)
+                       ? decode_prompt_string (*prompt_string_pointer)
+                       : (char *)NULL;
+
+      if (temp_prompt == 0)
+        {
+          temp_prompt = xmalloc (1);
+          temp_prompt[0] = '\0';
+        }
+
+      FREE (current_readline_prompt);
+      current_readline_prompt = temp_prompt;
+    }
+}
+#endif /* READLINE */
+
+#if defined (HISTORY)
+/* A list of tokens which can be followed by newlines, but not by
+   semi-colons.  When concatenating multiple lines of history, the
+   newline separator for such tokens is replaced with a space. */
+static int no_semi_successors[] = {
+  '\n', '{', '(', ')', ';', '&', '|',
+  CASE, DO, ELSE, IF, SEMI_SEMI, THEN, UNTIL, WHILE, AND_AND, OR_OR,
+  0
+};
+
+/* If we are not within a delimited expression, try to be smart
+   about which separators can be semi-colons and which must be
+   newlines.  Returns the string that should be added into the
+   history entry. */
+char *
+history_delimiting_chars ()
+{
+  if (delimiter_depth == 0)
+    {
+      register int i;
+
+      /* First, handle some special cases. */
+      /*(*/
+      /* If we just read `()', assume it's a function definition, and don't
+        add a semicolon.  If the token before the `)' was not `(', assume
+        it's a parenthesized command and add the semicolon. */
+      /*)(*/
+      if (token_before_that == ')')
+       return ((two_tokens_ago == '(') ? " " : "; "); /*)*/
+
+      for (i = 0; no_semi_successors[i]; i++)
+       {
+         if (token_before_that == no_semi_successors[i])
+           return (" ");
+       }
+      return ("; ");
+    }
+  else
+    return ("\n");
+}
+#endif /* HISTORY */
+
+/* Issue a prompt, or prepare to issue a prompt when the next character
+   is read. */
+static void
+prompt_again ()
+{
+  char *temp_prompt;
+
+  if (!interactive)    /* XXX */
+    return;
+
+  ps1_prompt = get_string_value ("PS1");
+  ps2_prompt = get_string_value ("PS2");
+
+  if (!prompt_string_pointer)
+    prompt_string_pointer = &ps1_prompt;
+
+  temp_prompt = *prompt_string_pointer
+                       ? decode_prompt_string (*prompt_string_pointer)
+                       : (char *)NULL;
+
+  if (temp_prompt == 0)
+    {
+      temp_prompt = xmalloc (1);
+      temp_prompt[0] = '\0';
+    }
+
+  current_prompt_string = *prompt_string_pointer;
+  prompt_string_pointer = &ps2_prompt;
+
+#if defined (READLINE)
+  if (!no_line_editing)
+    {
+      FREE (current_readline_prompt);
+      current_readline_prompt = temp_prompt;
+    }
+  else
+#endif /* READLINE */
+    {
+      FREE (current_decoded_prompt);
+      current_decoded_prompt = temp_prompt;
+    }
+}
+
+static void
+print_prompt ()
+{
+  fprintf (stderr, "%s", current_decoded_prompt);
+  fflush (stderr);
+}
+
+/* Return a string which will be printed as a prompt.  The string
+   may contain special characters which are decoded as follows:
+   
+       \a      bell (ascii 07)
+       \e      escape (ascii 033)
+       \d      the date in Day Mon Date format
+       \h      the hostname
+       \H      the hostname up to the first `.'
+       \n      CRLF
+       \s      the name of the shell
+       \t      the time in 24-hour hh:mm:ss format
+       \T      the time in 12-hour hh:mm:ss format
+       \@      the time in 12-hour am/pm format
+       \w      the current working directory
+       \W      the last element of $PWD
+       \u      your username
+       \#      the command number of this command
+       \!      the history number of this command
+       \$      a $ or a # if you are root
+       \nnn    character code nnn in octal
+       \\      a backslash
+       \[      begin a sequence of non-printing chars
+       \]      end a sequence of non-printing chars
+*/
+#define PROMPT_GROWTH 50
+char *
+decode_prompt_string (string)
+     char *string;
+{
+  WORD_LIST *list;
+  char *result, *t;
+#if defined (PROMPT_STRING_DECODE)
+  int result_size, result_index;
+  int c, n;
+  char *temp, octal_string[4];
+  time_t the_time;
+
+  result = xmalloc (result_size = PROMPT_GROWTH);
+  result[result_index = 0] = 0;
+  temp = (char *)NULL;
+
+  while (c = *string++)
+    {
+      if (posixly_correct && c == '!')
+       {
+         if (*string == '!')
+           {
+             temp = savestring ("!");
+             goto add_string;
+           }
+         else
+           {
+#if !defined (HISTORY)
+               temp = savestring ("1");
+#else /* HISTORY */
+               temp = itos (history_number ());
+#endif /* HISTORY */
+               string--;       /* add_string increments string again. */
+               goto add_string;
+           }
+       } 
+      if (c == '\\')
+       {
+         c = *string;
+
+         switch (c)
+           {
+           case '0':
+           case '1':
+           case '2':
+           case '3':
+           case '4':
+           case '5':
+           case '6':
+           case '7':
+             strncpy (octal_string, string, 3);
+             octal_string[3] = '\0';
+
+             n = read_octal (octal_string);
+             temp = xmalloc (3);
+
+             if (n == CTLESC || n == CTLNUL)
+               {
+                 string += 3;
+                 temp[0] = CTLESC;
+                 temp[1] = n;
+                 temp[2] = '\0';
+               }
+             else if (n == -1)
+               {
+                 temp[0] = '\\';
+                 temp[1] = '\0';
+               }
+             else
+               {
+                 string += 3;
+                 temp[0] = n;
+                 temp[1] = '\0';
+               }
+
+             c = 0;
+             goto add_string;
+         
+           case 't':
+           case 'd':
+           case 'T':
+           case '@':
+             /* Make the current time/date into a string. */
+             the_time = time (0);
+             temp = ctime (&the_time);
+
+             temp = (c != 'd') ? savestring (temp + 11) : savestring (temp);
+             temp[(c != 'd') ? 8 : 10] = '\0';
+
+             /* quick and dirty conversion to 12-hour time */
+             if (c == 'T' || c == '@')
+               {
+                 if (c == '@')
+                   {
+                     temp[5] = 'a';    /* am/pm format */
+                     temp[6] = 'm';
+                     temp[7] = '\0';
+                   }
+                 c = temp[2];
+                 temp[2] = '\0';
+                 n = atoi (temp);
+                 temp[2] = c;
+                 n -= 12;
+                 if (n > 0)
+                   {
+                     temp[0] = (n / 10) + '0';
+                     temp[1] = (n % 10) + '0';
+                     if (temp[5] == 'a') temp[5] = 'p';
+                   }
+               }
+             goto add_string;
+
+           case 'n':
+             temp = xmalloc (3);
+             temp[0] = no_line_editing ? '\n' : '\r';
+             temp[1] = no_line_editing ? '\0' : '\n';
+             temp[2] = '\0';
+             goto add_string;
+
+           case 's':
+             temp = base_pathname (shell_name);
+             temp = savestring (temp);
+             goto add_string;
+       
+           case 'w':
+           case 'W':
+             {
+               /* Use the value of PWD because it is much more efficient. */
+               char t_string[MAXPATHLEN];
+
+               temp = get_string_value ("PWD");
+
+               if (temp == 0)
+                 getwd (t_string);
+               else
+                 strcpy (t_string, temp);
+
+               if (c == 'W')
+                 {
+                   t = strrchr (t_string, '/');
+                   if (t && t != t_string)
+                     strcpy (t_string, t + 1);
+                   temp = savestring (t_string);
+                 }
+               else
+                 temp = savestring (polite_directory_format (t_string));
+               goto add_string;
+             }
+      
+           case 'u':
+             temp = savestring (current_user.user_name);
+             goto add_string;
+
+           case 'h':
+           case 'H':
+             temp = savestring (current_host_name);
+             if (c == 'H' && (t = (char *)strchr (temp, '.')))
+               *t = '\0';
+             goto add_string;
+
+           case '#':
+             temp = itos (current_command_number);
+             goto add_string;
+
+           case '!':
+#if !defined (HISTORY)
+             temp = savestring ("1");
+#else /* HISTORY */
+             temp = itos (history_number ());
+#endif /* HISTORY */
+             goto add_string;
+
+           case '$':
+             temp = xmalloc (2);
+             temp[0] = current_user.euid == 0 ? '#' : '$';
+             temp[1] = '\0';
+             goto add_string;
+
+#if defined (READLINE)
+           case '[':
+           case ']':
+             temp = xmalloc (3);
+             temp[0] = '\001';
+             temp[1] = (c == '[') ? RL_PROMPT_START_IGNORE : RL_PROMPT_END_IGNORE;
+             temp[2] = '\0';
+             goto add_string;
+#endif /* READLINE */
+
+           case '\\':
+             temp = xmalloc (2);
+             temp[0] = c;
+             temp[1] = '\0';
+             goto add_string;
+
+           case 'a':
+           case 'e':
+             temp = xmalloc (2);
+             temp[0] = (c == 'a') ? '\07' : '\033';
+             temp[1] = '\0';
+             goto add_string;
+
+           default:
+             temp = xmalloc (3);
+             temp[0] = '\\';
+             temp[1] = c;
+             temp[2] = '\0';
+
+           add_string:
+             if (c)
+               string++;
+             result =
+               sub_append_string (temp, result, &result_index, &result_size);
+             temp = (char *)NULL; /* Freed in sub_append_string (). */
+             result[result_index] = '\0';
+             break;
+           }
+       }
+      else
+       {
+         if (result_index > result_size - 3)
+           {
+             while (result_index > result_size - 3)
+               result_size += PROMPT_GROWTH;
+             result = xrealloc (result, result_size);
+           }
+
+         result[result_index++] = c;
+         result[result_index] = '\0';
+       }
+    }
+#else /* !PROMPT_STRING_DECODE */
+  result = savestring (string);
+#endif /* !PROMPT_STRING_DECODE */
+
+  /* Perform variable and parameter expansion and command substitution on
+     the prompt string. */
+  if (promptvars)
+    {
+      list = expand_string_unsplit (result, Q_DOUBLE_QUOTES);
+      free (result);
+      result = string_list (list);
+      dispose_words (list);
+    }
+  else
+    {
+      t = dequote_string (result);
+      free (result);
+      result = t;
+    }
+
+  return (result);
+}
+
+/* Report a syntax error, and restart the parser.  Call here for fatal
+   errors. */
+int
+yyerror ()
+{
+  report_syntax_error ((char *)NULL);
+  reset_parser ();
+  return (0);
+}
+
+/* Report a syntax error with line numbers, etc.
+   Call here for recoverable errors.  If you have a message to print,
+   then place it in MESSAGE, otherwise pass NULL and this will figure
+   out an appropriate message for you. */
+static void
+report_syntax_error (message)
+     char *message;
+{
+  char *name, *msg, *t;
+  int token_end, i;
+
+  if (message)
+    {
+      if (!interactive)
+       {
+         name = bash_input.name ? bash_input.name : "stdin";
+         report_error ("%s: line %d: `%s'", name, line_number, message);
+       }
+      else
+       {
+         if (EOF_Reached)
+           EOF_Reached = 0;
+         report_error ("%s", message);
+       }
+
+      last_command_exit_value = EX_USAGE;
+      return;
+    }
+
+  if (shell_input_line && *shell_input_line)
+    {
+      t = shell_input_line;
+      i = shell_input_line_index;
+      token_end = 0;
+
+      if (i && t[i] == '\0')
+       i--;
+
+      while (i && (whitespace (t[i]) || t[i] == '\n'))
+       i--;
+
+      if (i)
+       token_end = i + 1;
+
+      while (i && (member (t[i], " \n\t;|&") == 0))
+       i--;
+
+      while (i != token_end && (whitespace (t[i]) || t[i] == '\n'))
+       i++;
+
+      if (token_end)
+       {
+         msg = xmalloc (1 + (token_end - i));
+         strncpy (msg, t + i, token_end - i);
+         msg[token_end - i] = '\0';
+
+         report_error ("syntax error near unexpected token `%s'", msg);
+         free (msg);
+       }
+      else if ((i == 0) && (token_end == 0))   /* a 1-character token */
+       {
+         report_error ("syntax error near unexpected token `%c'", t[i]);
+       }
+
+      if (!interactive)
+       {
+         msg = savestring (shell_input_line);
+         token_end = strlen (msg);
+         name = bash_input.name ? bash_input.name : "stdin";
+
+         while (token_end && msg[token_end - 1] == '\n')
+           msg[--token_end] = '\0';
+
+         report_error ("%s: line %d: `%s'", name, line_number, msg);
+         free (msg);
+       }
+    }
+  else
+    {
+      msg = EOF_Reached ? "syntax error: unexpected end of file" : "syntax error";
+      if (!interactive)
+        {
+         name = bash_input.name ? bash_input.name : "stdin";
+         report_error ("%s: line %d: %s", name, line_number, msg);
+        }
+      else
+       {
+         /* This file uses EOF_Reached only for error reporting
+            when the shell is interactive.  Other mechanisms are 
+            used to decide whether or not to exit. */
+         EOF_Reached = 0;
+         report_error (msg);
+       }
+    }
+  last_command_exit_value = EX_USAGE;
+}
+
+/* ??? Needed function. ??? We have to be able to discard the constructs
+   created during parsing.  In the case of error, we want to return
+   allocated objects to the memory pool.  In the case of no error, we want
+   to throw away the information about where the allocated objects live.
+   (dispose_command () will actually free the command. */
+static void
+discard_parser_constructs (error_p)
+     int error_p;
+{
+}
+   
+/* Do that silly `type "bye" to exit' stuff.  You know, "ignoreeof". */
+
+/* A flag denoting whether or not ignoreeof is set. */
+int ignoreeof = 0;
+
+/* The number of times that we have encountered an EOF character without
+   another character intervening.  When this gets above the limit, the
+   shell terminates. */
+int eof_encountered = 0;
+
+/* The limit for eof_encountered. */
+int eof_encountered_limit = 10;
+
+/* If we have EOF as the only input unit, this user wants to leave
+   the shell.  If the shell is not interactive, then just leave.
+   Otherwise, if ignoreeof is set, and we haven't done this the
+   required number of times in a row, print a message. */
+static void
+handle_eof_input_unit ()
+{
+  if (interactive)
+    {
+      /* shell.c may use this to decide whether or not to write out the
+        history, among other things.  We use it only for error reporting
+        in this file. */
+      if (EOF_Reached)
+       EOF_Reached = 0;
+
+      /* If the user wants to "ignore" eof, then let her do so, kind of. */
+      if (ignoreeof)
+       {
+         if (eof_encountered < eof_encountered_limit)
+           {
+             fprintf (stderr, "Use \"%s\" to leave the shell.\n",
+                      login_shell ? "logout" : "exit");
+             eof_encountered++;
+             /* Reset the prompt string to be $PS1. */
+             prompt_string_pointer = (char **)NULL;
+             prompt_again ();
+             last_read_token = current_token = '\n';
+             return;
+           } 
+       }
+
+      /* In this case EOF should exit the shell.  Do it now. */
+      reset_parser ();
+      exit_builtin ((WORD_LIST *)NULL);
+    }
+  else
+    {
+      /* We don't write history files, etc., for non-interactive shells. */
+      EOF_Reached = 1;
+    }
+}
diff --git a/CWRU/old/read.def.stdio b/CWRU/old/read.def.stdio
new file mode 100644 (file)
index 0000000..6811384
--- /dev/null
@@ -0,0 +1,293 @@
+This file is read.def, from which is created read.c.
+It implements the builtin "read" 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 read.c
+
+$BUILTIN read
+$FUNCTION read_builtin
+$SHORT_DOC read [-r] [-p prompt] [-a array] [name ...]
+One line is read from the standard input, and the first word is
+assigned to the first NAME, the second word to the second NAME, etc.
+with leftover words assigned to the last NAME.  Only the characters
+found in $IFS are recognized as word delimiters.  The return code is
+zero, unless end-of-file is encountered.  If the -r option is given,
+this signifies `raw' input, and backslash processing is disabled.  If
+the `-p' option is supplied, the string supplied as an argument is
+output without a trailing newline before attempting to read.  If -a
+is supplied, the words read are assigned to sequential indices of ARRAY,
+starting at zero.
+$END
+
+#include <stdio.h>
+#include "../shell.h"
+#include "common.h"
+#include "bashgetopt.h"
+
+static int stream_close ();
+
+extern int interrupt_immediately;
+
+/* Read the value of the shell variables whose names follow.
+   The reading is done from the current input stream, whatever
+   that may be.  Successive words of the input line are assigned
+   to the variables mentioned in LIST.  The last variable in LIST
+   gets the remainder of the words on the line.  If no variables
+   are mentioned in LIST, then the default variable is $REPLY. */
+read_builtin (list)
+     WORD_LIST *list;
+{
+  register char *varname;
+  int size, c, i, fildes, raw_mode, pass_next, saw_escape, opt, retval;
+  char *input_string, *orig_input_string, *ifs_chars, *prompt, *arrayname;
+  FILE *input_stream;
+  SHELL_VAR *ifs;
+#if defined (ARRAY_VARS)
+  SHELL_VAR *v;
+  WORD_LIST *alist;
+#endif
+
+  i = 0;               /* Index into the string that we are reading. */
+  raw_mode = 0;                /* Not reading raw input be default. */
+  arrayname = prompt = (char *)NULL;
+
+  reset_internal_getopt ();
+  while ((opt = internal_getopt (list, "rp:a:")) != -1)
+    {
+      switch (opt)
+        {
+        case 'r':
+         raw_mode = 1;
+         break;
+       case 'p':
+         prompt = list_optarg;
+         break;
+#if defined (ARRAY_VARS)
+       case 'a':
+         arrayname = list_optarg;
+         break;
+#endif
+       default:
+         builtin_usage ();
+         return (EX_USAGE);
+       }
+    }
+  list = loptend;
+
+  /* We need unbuffered input from stdin.  So we make a new stream with
+     the same file descriptor as stdin, then unbuffer it. */
+  fildes = dup (fileno (stdin));
+
+  if (fildes == -1)
+    return (EXECUTION_FAILURE);
+
+  input_stream = fdopen (fildes, "r");
+
+  if (!input_stream)
+    {
+      close (fildes);
+      return (EXECUTION_FAILURE);
+    }
+
+  ifs = find_variable ("IFS");
+  if (ifs == 0)
+    ifs_chars = " \t\n";
+  else
+    ifs_chars = value_cell (ifs);
+
+  input_string = xmalloc (size = 128);
+
+  setbuf (input_stream, (char *)NULL);
+
+  begin_unwind_frame ("read_builtin");
+  add_unwind_protect (xfree, input_string);
+  add_unwind_protect (stream_close, input_stream);
+  interrupt_immediately++;
+
+  if (prompt && isatty (0))
+    {
+      fprintf (stderr, "%s", prompt);
+      fflush (stderr);
+    }
+
+  pass_next = 0;       /* Non-zero signifies last char was backslash. */
+  saw_escape = 0;      /* Non-zero signifies that we saw an escape char */
+
+  while ((c = getc (input_stream)) != EOF)
+    {
+      if (i + 2 >= size)
+       input_string = xrealloc (input_string, size += 128);
+
+      /* If the next character is to be accepted verbatim, a backslash
+        newline pair still disappears from the input. */
+      if (pass_next)
+       {
+         if (c == '\n')
+           i--;                /* back up over the CTLESC */
+         else
+           input_string[i++] = c;
+         pass_next = 0;
+         continue;
+       }
+
+      if (c == '\\' && !raw_mode)
+       {
+         pass_next++;
+         saw_escape++;
+         input_string[i++] = CTLESC;
+         continue;
+       }
+
+      if (c == '\n')
+       break;
+
+      if (c == CTLESC || c == CTLNUL)
+       input_string[i++] = CTLESC;
+
+      input_string[i++] = c;
+    }
+  input_string[i] = '\0';
+
+  interrupt_immediately--;
+  discard_unwind_frame ("read_builtin");
+
+  fclose (input_stream);
+
+  if (c == EOF)
+    {
+      retval = EXECUTION_FAILURE;
+      input_string[0] = '\0';
+    }
+  else
+    retval = EXECUTION_SUCCESS;
+
+#if defined (ARRAY_VARS)
+  /* If -a was given, take the string read, break it into a list of words,
+     an assign them to `arrayname' in turn. */
+  if (arrayname)
+    {
+      v = find_variable (arrayname);
+      if (v == 0)
+        v = make_new_array_variable (arrayname);
+      else if (array_p (v) == 0)
+        v = convert_var_to_array (v);
+
+      alist = list_string (input_string, " \t\n", 0);
+      if (alist)
+       {
+         assign_word_list (array_cell (v), alist);
+         dispose_words (alist);
+       }
+      free (input_string);
+      return (retval);
+    }
+#endif /* ARRAY_VARS */ 
+
+  if (!list)
+    {
+      SHELL_VAR *var;
+      char *t;
+
+      if (saw_escape)
+       {
+         t = dequote_string (input_string);
+         var = bind_variable ("REPLY", t);
+         free (t);
+       }
+      else
+       var = bind_variable ("REPLY", input_string);
+      var->attributes &= ~att_invisible;
+      free (input_string);
+    }
+  else
+    {
+      SHELL_VAR *var;
+      char *t;
+      /* This code implements the Posix.2 spec for splitting the words
+        read and assigning them to variables.  If $IFS is unset, we
+        use the default value of " \t\n". */
+      if (!ifs_chars)
+       ifs_chars = "";
+
+      orig_input_string = input_string;
+      while (list->next)
+       {
+         char *e, *t1;
+
+         varname = list->word->word;
+
+         /* If there are more variables than words read from the input,
+            the remaining variables are set to the empty string. */
+         if (*input_string)
+           {
+             /* This call updates INPUT_STRING. */
+             t = get_word_from_string (&input_string, ifs_chars, &e);
+             if (t)
+               *e = '\0';
+             /* Don't bother to remove the CTLESC unless we added one
+                somewhere while reading the string. */
+             if (t && saw_escape)
+               {
+                 t1 = dequote_string (t);
+                 var = bind_variable (varname, t1);
+                 free (t1);
+               }
+             else
+               var = bind_variable (varname, t);
+           }
+         else
+           {
+             t = (char *)0;
+             var = bind_variable (varname, "");
+           }
+
+         stupidly_hack_special_variables (varname);
+         var->attributes &= ~att_invisible;
+
+         if (t)
+           free (t);
+
+         list = list->next;
+       }
+
+      if (saw_escape)
+       {
+         t = dequote_string (input_string);
+         var = bind_variable (list->word->word, t);
+         free (t);
+       }
+      else
+       var = bind_variable (list->word->word, input_string);
+      stupidly_hack_special_variables (list->word->word);
+      var->attributes &= ~att_invisible;
+      free (orig_input_string);
+    }
+
+  return (retval);
+}
+
+/* This way I don't have to know whether fclose () is a
+   function or a macro. */
+static int
+stream_close (file)
+     FILE *file;
+{
+  return (fclose (file));
+}
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/old/subst.c.noctlnul b/CWRU/old/subst.c.noctlnul
new file mode 100644 (file)
index 0000000..b6621c0
--- /dev/null
@@ -0,0 +1,5659 @@
+/* subst.c -- The part of the shell that does parameter, command, and
+   globbing substitutions. */
+
+/* Copyright (C) 1987,1989 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. */
+
+#include "config.h"
+
+#include "bashtypes.h"
+#include <stdio.h>
+#include <pwd.h>
+#include <signal.h>
+#include <errno.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#include "bashansi.h"
+#include "posixstat.h"
+
+#include "shell.h"
+#include "flags.h"
+#include "jobs.h"
+#include "execute_cmd.h"
+#include "filecntl.h"
+#include "trap.h"
+#include "pathexp.h"
+
+#include "builtins/getopt.h"
+#include "builtins/common.h"
+
+#if defined (READLINE)
+#  include "bashline.h"
+#  include <readline/readline.h>
+#else
+#  include <tilde/tilde.h>
+#endif
+
+#if defined (HISTORY)
+#  include "bashhist.h"
+#  include <readline/history.h>
+#endif
+
+#include <glob/fnmatch.h>
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+/* The size that strings change by. */
+#define DEFAULT_ARRAY_SIZE 128
+
+/* How to quote character C. */
+static char *make_quoted_char ();
+
+/* Process ID of the last command executed within command substitution. */
+pid_t last_command_subst_pid = NO_PID;
+
+/* Extern functions and variables from different files. */
+extern int last_command_exit_value, interactive, interactive_shell;
+extern int subshell_environment, startup_state;
+extern int dollar_dollar_pid;
+extern int posixly_correct;
+extern int eof_encountered, eof_encountered_limit, ignoreeof;
+extern char *this_command_name;
+extern struct fd_bitmap *current_fds_to_close;
+#if defined (READLINE)
+extern int no_line_editing;
+extern int hostname_list_initialized;
+#endif
+
+/* Non-zero means to allow unmatched globbed filenames to expand to
+   a null file. */
+int allow_null_glob_expansion;
+
+static WORD_LIST expand_word_error, expand_word_fatal;
+static char expand_param_error, expand_param_fatal;
+
+static WORD_LIST *expand_string_internal ();
+static WORD_LIST *expand_word_internal (), *expand_word_list_internal ();
+static WORD_LIST *expand_string_leave_quoted ();
+static WORD_LIST *expand_string_for_rhs ();
+static WORD_LIST *word_list_split ();
+static WORD_LIST *quote_list (), *dequote_list ();
+static int unquoted_substring (), unquoted_member ();
+static int do_assignment_internal ();
+static char *string_extract_verbatim (), *string_extract ();
+static char *string_extract_double_quoted (), *string_extract_single_quoted ();
+static int skip_single_quoted (), skip_double_quoted ();
+static char *extract_delimited_string ();
+static char *extract_dollar_brace_string ();
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Utility Functions                           */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Cons a new string from STRING starting at START and ending at END,
+   not including END. */
+char *
+substring (string, start, end)
+     char *string;
+     int start, end;
+{
+  register int len;
+  register char *result;
+
+  len = end - start;
+  result = xmalloc (len + 1);
+  strncpy (result, string + start, len);
+  result[len] = '\0';
+  return (result);
+}
+
+/* Conventions:
+
+     A string with s[0] == CTLNUL && s[1] == 0 is a quoted null string.
+     The parser passes CTLNUL as CTLESC CTLNUL. */
+
+/* The parser passes us CTLESC as CTLESC CTLESC and CTLNUL as CTLESC CTLNUL.
+   This is necessary to make unquoted CTLESC and CTLNUL characters in the
+   data stream pass through properly.
+   Here we remove doubled CTLESC characters inside quoted strings before
+   quoting the entire string, so we do not double the number of CTLESC
+   characters. */
+static char *
+remove_quoted_escapes (string)
+     char *string;
+{
+  register char *s;
+  int docopy;
+  char *t, *t1;
+
+  if (string == NULL)
+    return (string);
+
+  t1 = t = xmalloc (strlen (string) + 1);
+  for (docopy = 0, s = string; *s; s++, t1++)
+    {
+#if 0
+      if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL))
+#else
+      if (*s == CTLESC && s[1] == CTLESC)
+#endif
+       {
+         s++;
+         docopy = 1;
+       }
+      *t1 = *s;
+    }
+  *t1 = '\0';
+  if (docopy)
+    strcpy (string, t);
+  free (t);
+  return (string);
+}
+
+/* Quote escape characters in string s, but no other characters.  This is
+   used to protect CTLESC and CTLNUL in variable values from the rest of
+   the word expansion process after the variable is expanded. */
+static char *
+quote_escapes (string)
+     char *string;
+{
+  register char *s, *t;
+  char *result;
+
+  result = xmalloc ((strlen (string) * 2) + 1);
+  for (s = string, t = result; *s; )
+    {
+      if (*s == CTLESC /* || *s == CTLNUL */)
+       *t++ = CTLESC;
+      *t++ = *s++;
+    }
+  *t = '\0';
+  return (result);
+}
+
+static char *
+dequote_escapes (string)
+     char *string;
+{
+  register char *s, *t;
+  char *result;
+
+  result = xmalloc (strlen (string) + 1);
+  for (s = string, t = result; *s; )
+    {
+#if 0
+      if (*s == CTLESC && (s[1] == CTLESC || s[1] == CTLNUL))
+#else
+      if (*s == CTLESC && s[1] == CTLESC)
+#endif
+       {
+         s++;
+         if (*s == '\0')
+           break;
+       }
+      *t++ = *s++;
+    }
+  *t = '\0';
+  return result;
+}
+
+/* Extract a substring from STRING, starting at SINDEX and ending with
+   one of the characters in CHARLIST.  Don't make the ending character
+   part of the string.  Leave SINDEX pointing at the ending character.
+   Understand about backslashes in the string.  If VARNAME is non-zero,
+   and array variables have been compiled into the shell, everything
+   between a `[' and a corresponding `]' is skipped over. */
+static char *
+string_extract (string, sindex, charlist, varname)
+     char *string, *charlist;
+     int *sindex, varname;
+{
+  register int c, i;
+  char *temp;
+
+  for (i = *sindex; c = string[i]; i++)
+    {
+      if (c == '\\')
+       if (string[i + 1])
+         i++;
+       else
+         break;
+#if defined (ARRAY_VARS)
+      else if (varname && c == '[')
+       {
+         int ni;
+         /* If this is an array subscript, skip over it and continue. */
+         ni = skipsubscript (string, i);
+         if (string[ni] == ']')
+           i = ni;
+       }
+#endif
+      else if (MEMBER (c, charlist))
+         break;
+    }
+  c = i - *sindex;
+  temp = xmalloc (1 + c);
+  strncpy (temp, string + *sindex, c);
+  temp[c] = '\0';
+  *sindex = i;
+  return (temp);
+}
+
+/* Extract the contents of STRING as if it is enclosed in double quotes.
+   SINDEX, when passed in, is the offset of the character immediately
+   following the opening double quote; on exit, SINDEX is left pointing after
+   the closing double quote.  If STRIPDQ is non-zero, unquoted double
+   quotes are stripped and the string is terminated by a null byte.
+   Backslashes between the embedded double quotes are processed.  If STRIPDQ
+   is zero, an unquoted `"' terminates the string. */
+static inline char *
+string_extract_double_quoted (string, sindex, stripdq)
+     char *string;
+     int *sindex, stripdq;
+{
+  int c, j, i, t;
+  char *temp, *ret;            /* The new string we return. */
+  int pass_next, backquote, si;        /* State variables for the machine. */
+  int dquote;
+
+  pass_next = backquote = dquote = 0;
+  temp = xmalloc (1 + strlen (string) - *sindex);
+
+  for (j = 0, i = *sindex; c = string[i]; i++)
+    {
+      /* Process a character that was quoted by a backslash. */
+      if (pass_next)
+       {
+         /* Posix.2 sez:
+
+            ``The backslash shall retain its special meaning as an escape
+            character only when followed by one of the characters:
+               $       `       "       \       <newline>''.
+
+            If STRIPDQ is zero, we handle the double quotes here and let
+            expand_word_internal handle the rest.  If STRIPDQ is non-zero,
+            we have already been through one round of backslash stripping,
+            and want to strip these backslashes only if DQUOTE is non-zero,
+            indicating that we are inside an embedded double-quoted string. */
+
+            /* If we are in an embedded quoted string, then don't strip
+               backslashes before characters for which the backslash
+               retains its special meaning, but remove backslashes in
+               front of other characters.  If we are not in an
+               embedded quoted string, don't strip backslashes at all.
+               This mess is necessary because the string was already
+               surrounded by double quotes (and sh has some really weird
+               quoting rules).
+               The returned string will be run through expansion as if
+               it were double-quoted. */
+         if ((stripdq == 0 && c != '"') ||
+             (stripdq && ((dquote && strchr (slashify_in_quotes, c)) || dquote == 0)))
+           temp[j++] = '\\';
+         temp[j++] = c;
+         pass_next = 0;
+         continue;
+       }
+
+      /* A backslash protects the next character.  The code just above
+        handles preserving the backslash in front of any character but
+        a double quote. */
+      if (c == '\\')
+       {
+         pass_next++;
+         continue;
+       }
+
+      /* Inside backquotes, ``the portion of the quoted string from the
+        initial backquote and the characters up to the next backquote
+        that is not preceded by a backslash, having escape characters
+        removed, defines that command''. */
+      if (backquote)
+       {
+         if (c == '`')
+           backquote = 0;
+         temp[j++] = c;
+         continue;
+       }
+
+      if (c == '`')
+       {
+         temp[j++] = c;
+         backquote++;
+         continue;
+       }
+
+      /* Pass everything between `$(' and the matching `)' or a quoted
+        ${ ... } pair through according to the Posix.2 specification. */
+      if (c == '$' && ((string[i + 1] == '(') || (string[i + 1] == '{')))
+       {
+         si = i + 2;
+         if (string[i + 1] == '(')
+           ret = extract_delimited_string (string, &si, "$(", "(", ")");
+         else
+           ret = extract_dollar_brace_string (string, &si, 1);
+
+         temp[j++] = '$';
+         temp[j++] = string[i + 1];
+
+         for (t = 0; ret[t]; t++, j++)
+           temp[j] = ret[t];
+         temp[j++] = string[si];
+
+         i = si;
+         free (ret);
+         continue;
+       }
+
+      /* Add any character but a double quote to the quoted string we're
+         accumulating. */
+      if (c != '"')
+       {
+         temp[j++] = c;
+         continue;
+       }
+
+      /* c == '"' */   
+      if (stripdq)
+       {
+         dquote ^= 1;
+         continue;
+       }
+
+      break;
+    }
+  temp[j] = '\0';
+
+  /* Point to after the closing quote. */
+  if (c)
+    i++;
+  *sindex = i;
+
+  return (temp);
+}
+
+/* This should really be another option to string_extract_double_quoted. */
+static inline int
+skip_double_quoted (string, sind)
+     char *string;
+     int sind;
+{
+  int c, j, i;
+  char *ret;
+  int pass_next, backquote, si;
+
+  pass_next = backquote = 0;
+
+  for (j = 0, i = sind; c = string[i]; i++)
+    {
+      if (pass_next)
+       {
+         pass_next = 0;
+         continue;
+       }
+      else if (c == '\\')
+       {
+         pass_next++;
+         continue;
+       }
+      else if (backquote)
+       {
+         if (c == '`')
+           backquote = 0;
+         continue;
+       }
+      else if (c == '`')
+       {
+         backquote++;
+         continue;
+       }
+      else if (c == '$' && ((string[i + 1] == '(') || (string[i + 1] == '{')))
+       {
+         si = i + 2;
+         if (string[i + 1] == '(')
+           ret = extract_delimited_string (string, &si, "$(", "(", ")");
+         else
+           ret = extract_dollar_brace_string (string, &si, 0);
+         i = si;
+         free (ret);
+         continue;
+       }
+      else if (c != '"')
+       continue;
+      else
+       break;
+    }
+
+  if (c)
+    i++;
+
+  return (i);
+}
+
+/* Extract the contents of STRING as if it is enclosed in single quotes.
+   SINDEX, when passed in, is the offset of the character immediately
+   following the opening single quote; on exit, SINDEX is left pointing after
+   the closing single quote. */
+static inline char *
+string_extract_single_quoted (string, sindex)
+     char *string;
+     int *sindex;
+{
+  register int i, j;
+  char *temp;
+
+  for (i = *sindex; string[i] && string[i] != '\''; i++)
+    ;
+
+  j = i - *sindex;
+  temp = xmalloc (1 + j);
+  strncpy (temp, string + *sindex, j);
+  temp[j] = '\0';
+
+  if (string[i])
+    i++;
+  *sindex = i;
+
+  return (temp);
+}
+
+static inline int
+skip_single_quoted (string, sind)
+     char *string;
+     int sind;
+{
+  register int i;
+
+  for (i = sind; string[i] && string[i] != '\''; i++)
+    ;
+  if (string[i])
+    i++;
+  return i;
+}
+
+/* Just like string_extract, but doesn't hack backslashes or any of
+   that other stuff.  Obeys quoting.  Used to do splitting on $IFS. */
+static char *
+string_extract_verbatim (string, sindex, charlist)
+     char *string, *charlist;
+     int *sindex;
+{
+  register int i = *sindex;
+  int c;
+  char *temp;
+
+  if (charlist[0] == '\'' && charlist[1] == '\0')
+    return (string_extract_single_quoted (string, sindex));
+
+  for (i = *sindex; c = string[i]; i++)
+    {
+      if (c == CTLESC)
+       {
+         i++;
+         continue;
+       }
+
+      if (MEMBER (c, charlist))
+       break;
+    }
+
+  c = i - *sindex;
+  temp = xmalloc (1 + c);
+  strncpy (temp, string + *sindex, c);
+  temp[c] = '\0';
+  *sindex = i;
+
+  return (temp);
+}
+
+/* Extract the $( construct in STRING, and return a new string.
+   Start extracting at (SINDEX) as if we had just seen "$(".
+   Make (SINDEX) get the position just after the matching ")". */
+char *
+extract_command_subst (string, sindex)
+     char *string;
+     int *sindex;
+{
+  return (extract_delimited_string (string, sindex, "$(", "(", ")"));
+}
+
+/* Extract the $[ construct in STRING, and return a new string.
+   Start extracting at (SINDEX) as if we had just seen "$[".
+   Make (SINDEX) get the position just after the matching "]". */
+char *
+extract_arithmetic_subst (string, sindex)
+     char *string;
+     int *sindex;
+{
+  return (extract_delimited_string (string, sindex, "$[", "[", "]"));
+}
+
+#if defined (PROCESS_SUBSTITUTION)
+/* Extract the <( or >( construct in STRING, and return a new string.
+   Start extracting at (SINDEX) as if we had just seen "<(".
+   Make (SINDEX) get the position just after the matching ")". */
+char *
+extract_process_subst (string, starter, sindex)
+     char *string;
+     char *starter;
+     int *sindex;
+{
+  return (extract_delimited_string (string, sindex, starter, "(", ")"));
+}
+#endif /* PROCESS_SUBSTITUTION */
+
+#if defined (ARRAY_VARS)
+char *
+extract_array_assignment_list (string, sindex)
+     char *string;
+     int *sindex;
+{
+  return (extract_delimited_string (string, sindex, "(", "(", ")"));
+}
+#endif
+
+/* Extract and create a new string from the contents of STRING, a
+   character string delimited with OPENER and CLOSER.  SINDEX is
+   the address of an int describing the current offset in STRING;
+   it should point to just after the first OPENER found.  On exit,
+   SINDEX gets the position just after the matching CLOSER.  If
+   OPENER is more than a single character, ALT_OPENER, if non-null,
+   contains a character string that can also match CLOSER and thus
+   needs to be skipped. */
+
+#define INC_NEST \
+  do \
+    { \
+      if (delimiter == 0) \
+       nesting_level++; \
+      else \
+       delimited_nesting_level++; \
+    } \
+  while (0)
+
+/* Cannot use the do...while(0) idiom because of the `break' in the
+   macro body. */
+#define DEC_NEST \
+      if (delimiter && delimited_nesting_level) \
+       delimited_nesting_level--; \
+      if (delimiter == 0) \
+       { \
+         nesting_level--; \
+         if (nesting_level == 0) \
+           break; \
+       }
+
+static char *
+extract_delimited_string (string, sindex, opener, alt_opener, closer)
+     char *string;
+     int *sindex;
+     char *opener, *alt_opener, *closer;
+{
+  register int i, c, l;
+  int pass_character, nesting_level;
+  int delimiter, delimited_nesting_level;
+  int len_closer, len_opener, len_alt_opener;
+  char *result;
+
+  len_opener = STRLEN (opener);
+  len_alt_opener = STRLEN (alt_opener);
+  len_closer = STRLEN (closer);
+
+  pass_character = delimiter = delimited_nesting_level = 0;
+
+  nesting_level = 1;
+
+  for (i = *sindex; c = string[i]; i++)
+    {
+      if (pass_character)
+       {
+         pass_character = 0;
+         continue;
+       }
+
+      if (c == CTLESC)
+       {
+         pass_character++;
+         continue;
+       }
+
+      if (c == '\\' && delimiter == '"' &&
+             (member (string[i + 1], slashify_in_quotes)))
+       {
+         pass_character++;
+         continue;
+       }
+
+      if (!delimiter || delimiter == '"')
+       {
+         if (STREQN (string + i, opener, len_opener))
+           {
+             INC_NEST;
+             i += len_opener - 1;
+             continue;
+           }
+
+         if (len_alt_opener && STREQN (string + i, alt_opener, len_alt_opener))
+           {
+             INC_NEST;
+             i += len_alt_opener - 1;
+             continue;
+           }
+
+         if (STREQN (string + i, closer, len_closer))
+           {
+             i += len_closer - 1;
+             DEC_NEST;
+           }
+       }
+
+      if (delimiter)
+       {
+         if (c == delimiter || delimiter == '\\')
+           delimiter = 0;
+         continue;
+       }
+      else if (c == '"' || c == '\'' || c == '\\')
+       delimiter = c;
+    }
+
+  l = i - *sindex;
+  result = xmalloc (1 + l);
+  strncpy (result, string + *sindex, l);
+  result[l] = '\0';
+  *sindex = i;
+
+  if (c == 0 && (delimiter || nesting_level))
+    {
+      report_error ("bad substitution: no `%s' in %s", closer, string);
+      free (result);
+      jump_to_top_level (DISCARD);
+    }
+  return (result);
+}
+
+/* Extract a parameter expansion expression within ${ and } from STRING.
+   Obey the Posix.2 rules for finding the ending `}': count braces while
+   skipping over enclosed quoted strings and command substitutions.
+   SINDEX is the address of an int describing the current offset in STRING;
+   it should point to just after the first `{' found.  On exit, SINDEX
+   gets the position just after the matching `}'.  QUOTED is non-zero if
+   this occurs inside double quotes. */
+/* XXX -- this is very similar to extract_delimited_string -- XXX */
+static char *
+extract_dollar_brace_string (string, sindex, quoted)
+     char *string;
+     int *sindex, quoted;
+{
+  register int i, c, l;
+  int pass_character, nesting_level, si;
+  int delimiter, delimited_nesting_level;
+  char *result, *t;
+
+  pass_character = delimiter = delimited_nesting_level = 0;
+
+  nesting_level = 1;
+
+  for (i = *sindex; c = string[i]; i++)
+    {
+      if (pass_character)
+       {
+         pass_character = 0;
+         continue;
+       }
+
+      if (c == CTLESC)
+       {
+         pass_character++;
+         continue;
+       }
+
+      /* Backslashes quote the next character. */
+      if (c == '\\')
+       {
+         if ((delimiter == '"') &&
+             (member (string[i + 1], slashify_in_quotes)))
+           {
+             pass_character++;
+             continue;
+           }
+       }
+
+      if (!delimiter || delimiter == '"')
+       {
+         if (string[i] == '$' && string[i+1] == '{')
+           {
+             INC_NEST;
+             i++;
+             continue;
+           }
+
+         /* Pass the contents of old-style command substitutions through
+            verbatim. */
+         if (string[i] == '`')
+           {
+             si = i + 1;
+             t = string_extract (string, &si, "`", 0);
+             i = si;
+             free (t);
+             continue;
+           }
+
+         /* Pass the contents of new-style command substitutions through
+            verbatim. */
+         if (string[i] == '$' && string[i+1] == '(')
+           {
+             si = i + 2;
+             t = extract_delimited_string (string, &si, "$(", "(", ")");
+             i = si;
+             free (t);
+             continue;
+           }
+
+         if (string[i] == '{')
+           {
+             INC_NEST;
+             continue;
+           }
+
+         if (string[i] == '}')
+           {
+             DEC_NEST;
+           }
+       }
+
+      if (delimiter)
+       {
+         if (c == delimiter || delimiter == '\\')
+           delimiter = 0;
+         continue;
+       }
+      else if (c == '"' || c == '\'' || c == '\\')
+       delimiter = c;
+    }
+
+  l = i - *sindex;
+  result = xmalloc (1 + l);
+  strncpy (result, string + *sindex, l);
+  result[l] = '\0';
+  *sindex = i;
+
+  if (c == 0 && (delimiter || nesting_level))
+    {
+      report_error ("bad substitution: no ending `}' in %s", string);
+      free (result);
+      jump_to_top_level (DISCARD);
+    }
+  return (result);
+}
+
+/* Remove backslashes which are quoting backquotes from STRING.  Modifies
+   STRING, and returns a pointer to it. */
+char *
+de_backslash (string)
+     char *string;
+{
+  register int i, l;
+
+  for (i = 0, l = strlen (string); i < l; i++)
+    if (string[i] == '\\' && (string[i + 1] == '`' || string[i + 1] == '\\' ||
+                             string[i + 1] == '$'))
+      strcpy (string + i, string + i + 1);     /* XXX - should be memmove */
+  return (string);
+}
+
+#if 0
+/* Replace instances of \! in a string with !. */
+void
+unquote_bang (string)
+     char *string;
+{
+  register int i, j;
+  register char *temp;
+
+  temp = xmalloc (1 + strlen (string));
+
+  for (i = 0, j = 0; (temp[j] = string[i]); i++, j++)
+    {
+      if (string[i] == '\\' && string[i + 1] == '!')
+       {
+         temp[j] = '!';
+         i++;
+       }
+    }
+  strcpy (string, temp);
+  free (temp);
+}
+#endif
+
+#if defined (READLINE)
+/* Return 1 if the portion of STRING ending at EINDEX is quoted (there is
+   an unclosed quoted string), or if the character at EINDEX is quoted
+   by a backslash. */
+int
+char_is_quoted (string, eindex)
+     char *string;
+     int eindex;
+{
+  int i, pass_next, quoted;
+
+  for (i = pass_next = quoted = 0; i <= eindex; i++)
+    {
+      if (pass_next)
+       {
+         pass_next = 0;
+         if (i >= eindex)      /* XXX was if (i >= eindex - 1) */
+           return 1;
+         continue;
+       }
+      else if (string[i] == '\'' || string[i] == '"')
+       {
+         i = (string[i] == '\'') ? skip_single_quoted (string, ++i)
+                                 : skip_double_quoted (string, ++i);
+         if (i > eindex)
+           return 1;
+       }
+      else if (string[i] == '\\')
+       {
+         pass_next = 1;
+         continue;
+       }
+    }
+  return (0);
+}
+
+int
+unclosed_pair (string, eindex, openstr)
+     char *string;
+     int eindex;
+     char *openstr;
+{
+  int i, pass_next, openc, olen;
+
+  olen = strlen (openstr);
+  for (i = pass_next = openc = 0; i <= eindex; i++)
+    {
+      if (pass_next)
+       {
+         pass_next = 0;
+         if (i >= eindex)      /* XXX was if (i >= eindex - 1) */
+           return 0;
+         continue;
+       }
+      else if (STREQN (string + i, openstr, olen))
+       {
+         openc = 1 - openc;
+         i += olen - 1;
+       }
+      else if (string[i] == '\'' || string[i] == '"')
+       {
+         i = (string[i] == '\'') ? skip_single_quoted (string, i)
+                                 : skip_double_quoted (string, i);
+         if (i > eindex)
+           return 0;
+       }
+      else if (string[i] == '\\')
+       {
+         pass_next = 1;
+         continue;
+       }
+    }
+  return (openc);
+}
+#endif /* READLINE */
+
+#if 0
+/* UNUSED */
+/* Extract the name of the variable to bind to from the assignment string. */
+char *
+assignment_name (string)
+     char *string;
+{
+  int offset;
+  char *temp;
+
+  offset = assignment (string);
+  if (offset == 0)
+    return (char *)NULL;
+  temp = xmalloc (offset + 1);
+  strncpy (temp, string, offset);
+  temp[offset] = '\0';
+  return (temp);
+}
+#endif
+
+/* Return a single string of all the words in LIST.  SEP is the separator
+   to put between individual elements of LIST in the output string. */
+static char *
+string_list_internal (list, sep)
+     WORD_LIST *list;
+     char *sep;
+{
+  register WORD_LIST *t;
+  char *result, *r;
+  int word_len, sep_len, result_size;
+
+  if (list == 0)
+    return ((char *)NULL);
+
+  /* This is nearly always called with either sep[0] == 0 or sep[1] == 0. */
+  sep_len = STRLEN (sep);
+  result_size = 0;
+
+  for (t = list; t; t = t->next)
+    {
+      if (t != list)
+       result_size += sep_len;
+      result_size += strlen (t->word->word);
+    }
+
+  r = result = xmalloc (result_size + 1);
+
+  for (t = list; t; t = t->next)
+    {
+      if (t != list && sep_len)
+       {
+         if (sep_len > 1)
+           {
+             FASTCOPY (sep, r, sep_len);
+             r += sep_len;
+           }
+         else
+           *r++ = sep[0];
+       }
+
+      word_len = strlen (t->word->word);
+      FASTCOPY (t->word->word, r, word_len);
+      r += word_len;
+    }
+
+  *r = '\0';    
+  return (result);
+}
+
+/* Return a single string of all the words present in LIST, separating
+   each word with a space. */
+char *
+string_list (list)
+     WORD_LIST *list;
+{
+  return (string_list_internal (list, " "));
+}
+
+/* Return a single string of all the words present in LIST, obeying the
+   quoting rules for "$*", to wit: (P1003.2, draft 11, 3.5.2) "If the
+   expansion [of $*] appears within a double quoted string, it expands
+   to a single field with the value of each parameter separated by the
+   first character of the IFS variable, or by a <space> if IFS is unset." */
+char *
+string_list_dollar_star (list)
+     WORD_LIST *list;
+{
+  char *ifs, sep[2];
+
+  ifs = get_string_value ("IFS");
+  if (ifs == 0)
+    sep[0] = ' ';
+  else if (*ifs == '\0')
+    sep[0] = '\0';
+  else
+    sep[0] = *ifs;
+
+  sep[1] = '\0';
+
+  return (string_list_internal (list, sep));
+}
+
+/* Return the list of words present in STRING.  Separate the string into
+   words at any of the characters found in SEPARATORS.  If QUOTED is
+   non-zero then word in the list will have its quoted flag set, otherwise
+   the quoted flag is left as make_word () deemed fit.
+
+   This obeys the P1003.2 word splitting semantics.  If `separators' is
+   exactly <space><tab><newline>, then the splitting algorithm is that of
+   the Bourne shell, which treats any sequence of characters from `separators'
+   as a delimiter.  If IFS is unset, which results in `separators' being set
+   to "", no splitting occurs.  If separators has some other value, the
+   following rules are applied (`IFS white space' means zero or more
+   occurrences of <space>, <tab>, or <newline>, as long as those characters
+   are in `separators'):
+
+       1) IFS white space is ignored at the start and the end of the
+          string.
+       2) Each occurrence of a character in `separators' that is not
+          IFS white space, along with any adjacent occurrences of
+          IFS white space delimits a field.
+       3) Any nonzero-length sequence of IFS white space delimits a field.
+   */
+
+/* BEWARE!  list_string strips null arguments.  Don't call it twice and
+   expect to have "" preserved! */
+
+/* Perform quoted null character removal on STRING.  We don't allow any
+   quoted null characters in the middle or at the ends of strings because
+   of how expand_word_internal works.  remove_quoted_nulls () simply
+   turns STRING into an empty string iff it only consists of a quoted null. */
+#define remove_quoted_nulls(string) \
+  do { if (QUOTED_NULL (string)) string[0] ='\0'; } while (0)
+
+/* Perform quoted null character removal on each element of LIST.
+   This modifies LIST. */
+void
+word_list_remove_quoted_nulls (list)
+     WORD_LIST *list;
+{
+  register WORD_LIST *t;
+
+  for (t = list; t; t = t->next)
+    remove_quoted_nulls (t->word->word);
+}
+
+/* This performs word splitting and quoted null character removal on
+   STRING. */
+#define issep(c)       (member ((c), separators))
+
+WORD_LIST *
+list_string (string, separators, quoted)
+     register char *string, *separators;
+     int quoted;
+{
+  WORD_LIST *result;
+  WORD_DESC *t;
+  char *current_word, *s;
+  int sindex, sh_style_split;
+
+  if (!string || !*string)
+    return ((WORD_LIST *)NULL);
+
+  sh_style_split =
+    separators && *separators && (STREQ (separators, " \t\n"));
+
+  /* Remove sequences of whitespace at the beginning of STRING, as
+     long as those characters appear in IFS.  Do not do this if
+     STRING is quoted or if there are no separator characters. */
+  if (!quoted || !separators || !*separators)
+    {
+      for (s = string; *s && spctabnl (*s) && issep (*s); s++);
+
+      if (!*s)
+       return ((WORD_LIST *)NULL);
+
+      string = s;
+    }
+
+  /* OK, now STRING points to a word that does not begin with white space.
+     The splitting algorithm is:
+       extract a word, stopping at a separator
+       skip sequences of spc, tab, or nl as long as they are separators
+     This obeys the field splitting rules in Posix.2. */
+  for (result = (WORD_LIST *)NULL, sindex = 0; string[sindex]; )
+    {
+      current_word = string_extract_verbatim (string, &sindex, separators);
+      if (current_word == 0)
+       break;
+
+      /* If we have a quoted empty string, add a quoted null argument.  We
+        want to preserve the quoted null character iff this is a quoted
+        empty string; otherwise the quoted null characters are removed
+        below. */
+#if 0
+      if (QUOTED_NULL (current_word))
+       {
+         t = make_bare_word ("");
+         t->flags |= W_QUOTED;
+         free (t->word);
+         t->word = make_quoted_char ('\0');
+         result = make_word_list (t, result);
+       }
+      else if (current_word[0] != '\0')
+#else
+      if (current_word[0] != '\0')
+#endif
+       {
+         /* If we have something, then add it regardless.  However,
+            perform quoted null character removal on the current word. */
+#if 0
+         remove_quoted_nulls (current_word);
+#endif
+         result = make_word_list (make_word (current_word), result);
+         if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
+           result->word->flags |= W_QUOTED;
+       }
+
+      /* If we're not doing sequences of separators in the traditional
+        Bourne shell style, then add a quoted null argument. */
+      else if (!sh_style_split && !spctabnl (string[sindex]))
+       {
+         t = make_bare_word ("");
+         t->flags |= W_QUOTED;
+         free (t->word);
+         t->word = make_quoted_char ('\0');
+         result = make_word_list (t, result);
+       }
+
+      free (current_word);
+
+      /* Move past the current separator character. */
+      if (string[sindex])
+       sindex++;
+
+      /* Now skip sequences of space, tab, or newline characters if they are
+        in the list of separators. */
+      while (string[sindex] && spctabnl (string[sindex]) && issep (string[sindex]))
+       sindex++;
+    }
+  return (REVERSE_LIST (result, WORD_LIST *));
+}
+
+/* Parse a single word from STRING, using SEPARATORS to separate fields.
+   ENDPTR is set to the first character after the word.  This is used by
+   the `read' builtin.
+   XXX - this function is very similar to list_string; they should be
+        combined - XXX */
+char *
+get_word_from_string (stringp, separators, endptr)
+     char **stringp, *separators, **endptr;
+{
+  register char *s;
+  char *current_word;
+  int sindex, sh_style_split;
+
+  if (!stringp || !*stringp || !**stringp)
+    return ((char *)NULL);
+    
+  s = *stringp;
+
+  sh_style_split =
+    separators && *separators && (STREQ (separators, " \t\n"));
+
+  /* Remove sequences of whitespace at the beginning of STRING, as
+     long as those characters appear in IFS. */
+  if (sh_style_split || !separators || !*separators)
+    {
+      for (; *s && spctabnl (*s) && issep (*s); s++);
+
+      /* If the string is nothing but whitespace, update it and return. */
+      if (!*s)
+       {
+         *stringp = s;
+         if (endptr)
+           *endptr = s;
+         return ((char *)NULL);
+       }
+    }
+
+  /* OK, S points to a word that does not begin with white space.
+     Now extract a word, stopping at a separator, save a pointer to
+     the first character after the word, then skip sequences of spc,
+     tab, or nl as long as they are separators.
+     
+     This obeys the field splitting rules in Posix.2. */
+  sindex = 0;
+  current_word = string_extract_verbatim (s, &sindex, separators);
+
+  /* Set ENDPTR to the first character after the end of the word. */
+  if (endptr)
+    *endptr = s + sindex;
+
+  /* Move past the current separator character. */
+  if (s[sindex])
+    sindex++;
+
+  /* Now skip sequences of space, tab, or newline characters if they are
+     in the list of separators. */
+  while (s[sindex] && spctabnl (s[sindex]) && issep (s[sindex]))
+    sindex++;
+
+  /* Update STRING to point to the next field. */
+  *stringp = s + sindex;
+  return (current_word);
+}
+
+/* Remove IFS white space at the end of STRING.  Start at the end
+   of the string and walk backwards until the beginning of the string
+   or we find a character that's not IFS white space and not CTLESC.
+   Only let CTLESC escape a white space character if SAW_ESCAPE is
+   non-zero.  */
+char *
+strip_trailing_ifs_whitespace (string, separators, saw_escape)
+     char *string, *separators;
+     int saw_escape;
+{
+  char *s;
+  
+  s = string + STRLEN (string) - 1;
+  while (s > string && ((spctabnl (*s) && issep (*s)) ||
+                       (saw_escape && *s == CTLESC && spctabnl (s[1]))))
+    s--;
+  *++s = '\0';
+  return string;
+}
+
+#if defined (ARRAY_VARS)
+WORD_LIST *
+list_string_with_quotes (string)
+     char *string;
+{
+  WORD_LIST *list;
+  char *token, *s;
+  int c, i, tokstart, len;
+
+  for (s = string; s && *s && spctabnl (*s); s++)
+    ;
+  if (s == 0 || *s == 0)
+    return ((WORD_LIST *)NULL);
+
+  tokstart = i = 0;
+  list = (WORD_LIST *)NULL;
+  while (1)
+    {
+      c = s[i];
+      if (c == '\\')
+       {
+         i++;
+         if (s[i])
+           i++;
+       } 
+      else if (c == '\'')
+        i = skip_single_quoted (s, ++i);
+      else if (c == '"')
+       i = skip_double_quoted (s, ++i);
+      else if (c == 0 || spctabnl (c))
+       {
+         /* We have found the end of a token.  Make a word out of it and
+            add it to the word list. */
+         len = i - tokstart;
+         token = xmalloc (len + 1);
+         strncpy (token, s + tokstart, len);
+         token[len] = '\0';
+         list = make_word_list (make_word (token), list);
+         free (token);
+         while (spctabnl (s[i]))
+           i++;
+         if (s[i])
+           tokstart = i;
+         else
+           break;
+       }
+      else
+       i++;    /* normal character */
+    }
+  return (REVERSE_LIST (list, WORD_LIST *));
+}
+#endif /* ARRAY_VARS */
+
+#if defined (PROCESS_SUBSTITUTION)
+#define EXP_CHAR(s) (s == '$' || s == '`' || s == '<' || s == '>' || s == CTLESC)
+#else
+#define EXP_CHAR(s) (s == '$' || s == '`' || s == CTLESC)
+#endif
+
+/* If there are any characters in STRING that require full expansion,
+   then call FUNC to expand STRING; otherwise just perform quote
+   removal if necessary.  This returns a new string. */
+static char *
+maybe_expand_string (string, quoted, func)
+     char *string;
+     int quoted;
+     WORD_LIST *(*func)();
+{
+  WORD_LIST *list;
+  int i, saw_quote;
+  char *ret;
+     
+  for (i = saw_quote = 0; string[i]; i++)
+    {
+      if (EXP_CHAR (string[i]))
+       break;
+      else if (string[i] == '\'' || string[i] == '\\' || string[i] == '"')
+       saw_quote = 1;
+    }
+
+  if (string[i])
+    {    
+      list = (*func) (string, quoted);
+      if (list)
+       {
+         ret = string_list (list);
+         dispose_words (list);
+       }
+      else
+       ret = (char *)NULL;
+    }
+  else if (saw_quote && ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) == 0))
+    ret = string_quote_removal (string, quoted);
+  else
+    ret = savestring (string);
+  return ret;
+}
+
+#if defined (ARRAY_VARS)
+SHELL_VAR *
+do_array_element_assignment (name, value)
+     char *name, *value;
+{
+  char *t;
+  int ind, ni;
+  SHELL_VAR *entry;
+
+  t = strchr (name, '[');
+  if (t == 0)
+    return ((SHELL_VAR *)NULL);
+  ind = t - name;
+  ni = skipsubscript (name, ind);
+  if ((ALL_ELEMENT_SUB (t[1]) && t[2] == ']') || (ni <= ind + 1))
+    {
+      report_error ("%s: bad array subscript", name);
+      return ((SHELL_VAR *)NULL);
+    }
+  *t++ = '\0';
+  ind = array_expand_index (t, ni - ind);
+  if (ind < 0)
+    {
+      t[-1] = '[';             /* restore original name */
+      report_error ("%s: bad array subscript", name);
+      return ((SHELL_VAR *)NULL);
+    }
+  entry = bind_array_variable (name, ind, value);
+  t[-1] = '[';         /* restore original name */
+  return (entry);
+}
+#endif /* ARRAY_VARS */
+
+/* Given STRING, an assignment string, get the value of the right side
+   of the `=', and bind it to the left side.  If EXPAND is true, then
+   perform parameter expansion, command substitution, and arithmetic
+   expansion on the right-hand side.  Perform tilde expansion in any
+   case.  Do not perform word splitting on the result of expansion. */
+static int
+do_assignment_internal (string, expand)
+     char *string;
+     int expand;
+{
+  int offset;
+  char *name, *value;
+  SHELL_VAR *entry;
+#if defined (ARRAY_VARS)
+  char *t;
+  int ni, assign_list = 0;
+#endif
+
+  offset = assignment (string);
+  name = savestring (string);
+  value = (char *)NULL;
+
+  if (name[offset] == '=')
+    {
+      char *temp;
+
+      name[offset] = 0;
+      temp = name + offset + 1;
+
+#if defined (ARRAY_VARS)
+      if (expand && temp[0] == '(' && strchr (temp, ')'))
+       {
+         assign_list = ni = 1;
+         value = extract_delimited_string (temp, &ni, "(", "(", ")");
+       }
+      else
+#endif
+      if (expand && temp[0])
+       {
+         temp = (strchr (temp, '~') && unquoted_member ('~', temp))
+                  ? bash_tilde_expand (temp)
+                  : savestring (temp);
+
+         value = maybe_expand_string (temp, 0, expand_string_unsplit);
+         free (temp);
+       }
+      else
+       value = savestring (temp);
+    }
+
+  if (value == 0)
+    value = savestring ("");
+
+  if (echo_command_at_execute)
+#if defined (ARRAY_VARS)
+    if (assign_list)
+      fprintf (stderr, "%s%s=(%s)\n", indirection_level_string (), name, value);
+    else
+#endif
+    fprintf (stderr, "%s%s=%s\n", indirection_level_string (), name, value);
+
+#define ASSIGN_RETURN(r)       FREE (value); free (name); return (r);
+
+#if defined (ARRAY_VARS)
+  if (t = strchr (name, '['))
+    {
+      if (assign_list)
+       {
+         report_error ("%s: cannot assign list to array member", name);
+         ASSIGN_RETURN (0);
+       }
+      entry = do_array_element_assignment (name, value);
+      if (entry == 0)
+        ASSIGN_RETURN (0);
+    }
+  else if (assign_list)
+    entry = assign_array_from_string (name, value);
+  else
+#endif /* ARRAY_VARS */
+  entry = bind_variable (name, value);
+
+  stupidly_hack_special_variables (name);
+
+  if (entry)
+    entry->attributes &= ~att_invisible;
+
+  /* Return 1 if the assignment seems to have been performed correctly. */
+  ASSIGN_RETURN (entry ? ((entry->attributes & att_readonly) == 0) : 0);
+}
+
+/* Perform the assignment statement in STRING, and expand the
+   right side by doing command and parameter expansion. */
+int
+do_assignment (string)
+     char *string;
+{
+  return do_assignment_internal (string, 1);
+}
+
+/* Given STRING, an assignment string, get the value of the right side
+   of the `=', and bind it to the left side.  Do not do command and
+   parameter substitution on the right hand side. */
+int
+do_assignment_no_expand (string)
+     char *string;
+{
+  return do_assignment_internal (string, 0);
+}
+
+/* Most of the substitutions must be done in parallel.  In order
+   to avoid using tons of unclear goto's, I have some functions
+   for manipulating malloc'ed strings.  They all take INDX, a
+   pointer to an integer which is the offset into the string
+   where manipulation is taking place.  They also take SIZE, a
+   pointer to an integer which is the current length of the
+   character array for this string. */
+
+/* Append SOURCE to TARGET at INDEX.  SIZE is the current amount
+   of space allocated to TARGET.  SOURCE can be NULL, in which
+   case nothing happens.  Gets rid of SOURCE by freeing it.
+   Returns TARGET in case the location has changed. */
+inline char *
+sub_append_string (source, target, indx, size)
+     char *source, *target;
+     int *indx, *size;
+{
+  if (source)
+    {
+      int srclen, n;
+
+      srclen = strlen (source);
+      if (srclen >= (int)(*size - *indx))
+       {
+         n = srclen + *indx;
+         n = (n + DEFAULT_ARRAY_SIZE) - (n % DEFAULT_ARRAY_SIZE);
+         target = xrealloc (target, (*size = n));
+       }
+
+      FASTCOPY (source, target + *indx, srclen);
+      *indx += srclen;
+      target[*indx] = '\0';
+
+      free (source);
+    }
+  return (target);
+}
+
+#if 0
+/* UNUSED */
+/* Append the textual representation of NUMBER to TARGET.
+   INDX and SIZE are as in SUB_APPEND_STRING. */
+char *
+sub_append_number (number, target, indx, size)
+     int number, *indx, *size;
+     char *target;
+{
+  char *temp;
+
+  temp = itos (number);
+  return (sub_append_string (temp, target, indx, size));
+}
+#endif
+
+/* Return the word list that corresponds to `$*'. */
+WORD_LIST *
+list_rest_of_args ()
+{
+  register WORD_LIST *list, *args;
+  int i;
+
+  /* Break out of the loop as soon as one of the dollar variables is null. */
+  for (i = 1, list = (WORD_LIST *)NULL; i < 10 && dollar_vars[i]; i++)
+    list = make_word_list (make_bare_word (dollar_vars[i]), list);
+
+  for (args = rest_of_args; args; args = args->next)
+    list = make_word_list (make_bare_word (args->word->word), list);
+
+  return (REVERSE_LIST (list, WORD_LIST *));
+}
+
+int
+number_of_args ()
+{
+  register WORD_LIST *list;
+  int n;
+
+  for (n = 0; n < 9 && dollar_vars[n+1]; n++)
+    ;
+  for (list = rest_of_args; list; list = list->next)
+    n++;
+  return n;
+}
+
+/* Make a single large string out of the dollar digit variables,
+   and the rest_of_args.  If DOLLAR_STAR is 1, then obey the special
+   case of "$*" with respect to IFS. */
+char *
+string_rest_of_args (dollar_star)
+     int dollar_star;
+{
+  register WORD_LIST *list;
+  char *string;
+
+  list = list_rest_of_args ();
+  string = dollar_star ? string_list_dollar_star (list) : string_list (list);
+  dispose_words (list);
+  return (string);
+}
+
+/***************************************************
+ *                                                *
+ *        Functions to Expand a String            *
+ *                                                *
+ ***************************************************/
+/* Call expand_word_internal to expand W and handle error returns.
+   A convenience function for functions that don't want to handle
+   any errors or free any memory before aborting. */
+static WORD_LIST *
+call_expand_word_internal (w, q, c, e)
+     WORD_DESC *w;
+     int q, *c, *e;
+{
+  WORD_LIST *result;
+
+  result = expand_word_internal (w, q, c, e);
+  if (result == &expand_word_error)
+    jump_to_top_level (DISCARD);
+  else if (result == &expand_word_fatal)
+    jump_to_top_level (FORCE_EOF);
+  else
+    return (result);
+}
+
+/* Perform parameter expansion, command substitution, and arithmetic
+   expansion on STRING, as if it were a word.  Leave the result quoted. */
+static WORD_LIST *
+expand_string_internal (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_DESC td;
+  WORD_LIST *tresult;
+
+  if (string == 0 || *string == 0)
+    return ((WORD_LIST *)NULL);
+
+  bzero (&td, sizeof (td));
+  td.word = string;
+  tresult = call_expand_word_internal (&td, quoted, (int *)NULL, (int *)NULL);
+  return (tresult);
+}
+
+/* Expand STRING by performing parameter expansion, command substitution,
+   and arithmetic expansion.  Dequote the resulting WORD_LIST before
+   returning it, but do not perform word splitting.  The call to
+   remove_quoted_nulls () is in here because word splitting normally
+   takes care of quote removal. */
+WORD_LIST *
+expand_string_unsplit (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_LIST *value;
+
+  if (!string || !*string)
+    return ((WORD_LIST *)NULL);
+
+  value = expand_string_internal (string, quoted);
+  if (value)
+    {
+#if 0
+      if (value->word)
+       remove_quoted_nulls (value->word->word);
+#endif
+      dequote_list (value);
+    }
+  return (value);
+}
+
+/* Expand STRING just as if you were expanding a word, but do not dequote
+   the resultant WORD_LIST.  This is called only from within this file,
+   and is used to correctly preserve quoted characters when expanding
+   things like ${1+"$@"}.  This does parameter expansion, command
+   subsitution, arithmetic expansion, and word splitting. */
+static WORD_LIST *
+expand_string_leave_quoted (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_LIST *tlist;
+  WORD_LIST *tresult;
+
+  if (string == 0 || *string == '\0')
+    return ((WORD_LIST *)NULL);
+
+  tlist = expand_string_internal (string, quoted);
+
+  if (tlist)
+    {
+      tresult = word_list_split (tlist);
+      dispose_words (tlist);
+      return (tresult);
+    }
+  return ((WORD_LIST *)NULL);
+}
+
+/* This does not perform word splitting or dequote the WORD_LIST
+   it returns. */
+static WORD_LIST *
+expand_string_for_rhs (string, quoted, dollar_at_p, has_dollar_at)
+     char *string;
+     int quoted, *dollar_at_p, *has_dollar_at;
+{
+  WORD_DESC td;
+  WORD_LIST *tresult;
+
+  if (string == 0 || *string == '\0')
+    return (WORD_LIST *)NULL;
+
+  bzero (&td, sizeof (td));
+  td.word = string;
+  tresult = call_expand_word_internal (&td, quoted, dollar_at_p, has_dollar_at);
+  return (tresult);
+}
+    
+/* Expand STRING just as if you were expanding a word.  This also returns
+   a list of words.  Note that filename globbing is *NOT* done for word
+   or string expansion, just when the shell is expanding a command.  This
+   does parameter expansion, command substitution, arithmetic expansion,
+   and word splitting.  Dequote the resultant WORD_LIST before returning. */
+WORD_LIST *
+expand_string (string, quoted)
+     char *string;
+     int quoted;
+{
+  WORD_LIST *result;
+
+  if (!string || !*string)
+    return ((WORD_LIST *)NULL);
+
+  result = expand_string_leave_quoted (string, quoted);
+  return (result ? dequote_list (result) : result);
+}
+
+/***************************************************
+ *                                                *
+ *     Functions to handle quoting chars          *
+ *                                                *
+ ***************************************************/
+
+static WORD_LIST *
+dequote_list (list)
+     WORD_LIST *list;
+{
+  register char *s;
+  register WORD_LIST *tlist;
+
+  for (tlist = list; tlist; tlist = tlist->next)
+    {
+      s = dequote_string (tlist->word->word);
+      free (tlist->word->word);
+      tlist->word->word = s;
+    }
+  return list;
+}
+
+static char *
+make_quoted_char (c)
+     int c;
+{
+  char *temp;
+
+  temp = xmalloc (3);
+  if (c == 0)
+    {
+#if 0
+      temp[0] = CTLNUL;
+      temp[1] = '\0';
+#else
+      temp[0] = '\0';
+#endif
+    }
+  else
+    {
+      temp[0] = CTLESC;
+      temp[1] = c;
+      temp[2] = '\0';
+    }
+  return (temp);
+}
+
+/* Quote STRING.  Return a new string. */
+char *
+quote_string (string)
+     char *string;
+{
+  register char *t;
+  char *result;
+
+  if (*string == 0)
+    {
+      result = xmalloc (2);
+#if 0
+      result[0] = CTLNUL;
+      result[1] = '\0';
+#else
+      result[0] = '\0';
+#endif
+    }
+  else
+    {
+      result = xmalloc ((strlen (string) * 2) + 1);
+
+      for (t = result; *string; )
+       {
+         *t++ = CTLESC;
+         *t++ = *string++;
+       }
+      *t = '\0';
+    }
+  return (result);
+}
+
+/* De-quoted quoted characters in STRING. */
+char *
+dequote_string (string)
+     char *string;
+{
+  register char *t;
+  char *result;
+
+  result = xmalloc (strlen (string) + 1);
+
+#if 0
+  if (QUOTED_NULL (string))
+    {
+      result[0] = '\0';
+      return (result);
+    }
+#endif
+
+  /* If no character in the string can be quoted, don't bother examining
+     each character.  Just return a copy of the string passed to us. */
+  if (strchr (string, CTLESC) == NULL)         /* XXX */
+    {                                          /* XXX */
+      strcpy (result, string);                 /* XXX */
+      return (result);                         /* XXX */
+    }
+
+  for (t = result; *string; string++, t++)
+    {
+      if (*string == CTLESC)
+       {
+         string++;
+
+         if (!*string)
+           break;
+       }
+
+      *t = *string;
+    }
+
+  *t = '\0';
+  return (result);
+}
+
+/* Quote the entire WORD_LIST list. */
+static WORD_LIST *
+quote_list (list)
+     WORD_LIST *list;
+{
+  register WORD_LIST *w;
+  char *t;
+
+  for (w = list; w; w = w->next)
+    {
+      t = w->word->word;
+      w->word->word = quote_string (t);
+      free (t);
+      w->word->flags |= W_QUOTED;
+    }
+  return list;
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                 Functions for Removing Patterns                 */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Remove the portion of PARAM matched by PATTERN according to OP, where OP
+   can have one of 4 values:
+       RP_LONG_LEFT    remove longest matching portion at start of PARAM
+       RP_SHORT_LEFT   remove shortest matching portion at start of PARAM
+       RP_LONG_RIGHT   remove longest matching portion at end of PARAM
+       RP_SHORT_RIGHT  remove shortest matching portion at end of PARAM
+*/
+
+#define RP_LONG_LEFT   1
+#define RP_SHORT_LEFT  2
+#define RP_LONG_RIGHT  3
+#define RP_SHORT_RIGHT 4
+
+static char *
+remove_pattern (param, pattern, op)
+     char *param, *pattern;
+     int op;
+{
+  register int len;
+  register char *end;
+  register char *p, *ret, c;
+
+  if (param == NULL || *param == '\0')
+    return (param);
+  if (pattern == NULL || *pattern == '\0')     /* minor optimization */
+    return (savestring (param));
+
+  len = STRLEN (param);
+  end = param + len;
+
+  switch (op)
+    {
+      case RP_LONG_LEFT:       /* remove longest match at start */
+       for (p = end; p >= param; p--)
+         {
+           c = *p; *p = '\0';
+           if (fnmatch (pattern, param, 0) != FNM_NOMATCH)
+             {
+               *p = c;
+               return (savestring (p));
+             }
+           *p = c;
+         }
+       break;
+
+      case RP_SHORT_LEFT:      /* remove shortest match at start */
+       for (p = param; p <= end; p++)
+         {
+           c = *p; *p = '\0';
+           if (fnmatch (pattern, param, 0) != FNM_NOMATCH)
+             {
+               *p = c;
+               return (savestring (p));
+             }
+           *p = c;
+         }
+       break;
+
+      case RP_LONG_RIGHT:      /* remove longest match at end */
+       for (p = param; p <= end; p++)
+         {
+           if (fnmatch (pattern, p, 0) != FNM_NOMATCH)
+             {
+               c = *p; *p = '\0';
+               ret = savestring (param);
+               *p = c;
+               return (ret);
+             }
+         }
+       break;
+
+      case RP_SHORT_RIGHT:     /* remove shortest match at end */
+       for (p = end; p >= param; p--)
+         {
+           if (fnmatch (pattern, p, 0) != FNM_NOMATCH)
+             {
+               c = *p; *p = '\0';
+               ret = savestring (param);
+               *p = c;
+               return (ret);
+             }
+         }
+       break;
+    }
+  return (savestring (param)); /* no match, return original string */
+}
+
+/* Return 1 of the first character of STRING could match the first
+   character of pattern PAT.  Used to avoid n2 calls to fnmatch(). */
+static int
+match_pattern_char (pat, string)
+     char *pat, *string;
+{
+  register char *np;
+  int neg;
+  char c, c1;
+
+  if (*string == 0)
+    return (0);
+
+  switch (c = *pat++)
+    {
+    default:
+      return (*string == c);
+    case '\\':
+      return (*string == *pat);
+    case '?':
+    case '*':
+      return (1);
+    case '[':
+      for (np = pat; *np != ']'; np++);
+      if (*np == 0)
+        return (*string == '[');
+      if (neg = (*pat == '!' || *pat == '^'))
+       pat++;
+      for ( ; (c1 = *pat++) != ']'; )
+       {
+         if (c1 == '\\')
+           c1 = *pat++;
+         if (c1 == 0)
+           return (0);
+         if (*pat != '-' || pat[1] == '\0' || pat[1] == ']')
+           return (neg ? *string != c1 : *string == c1);
+         if (c1 <= *string && *string <= pat[1])
+           return (1);
+         pat += 2;
+       }
+    }
+}
+
+/* Match PAT anywhere in STRING and return the match boundaries.
+   This returns 1 in case of a successful match, 0 otherwise.  SP
+   and EP are pointers into the string where the match begins and
+   ends, respectively.  MTYPE controls what kind of match is attempted.
+   MATCH_BEG and MATCH_END anchor the match at the beginning and end
+   of the string, respectively.  The longest match is returned. */
+static int
+match_pattern (string, pat, mtype, sp, ep)
+     char *string, *pat;
+     int mtype;
+     char **sp, **ep;
+{
+  int c;
+  register char *p, *p1;
+  char *end;
+
+  if (string == 0 || *string == 0 || pat == 0 || *pat == 0)
+    return (0);
+
+  end = string + STRLEN (string);
+
+  switch (mtype)
+    {
+    case MATCH_ANY:
+      for (p = string; p <= end; p++)
+       {
+         if (match_pattern_char (pat, p))
+           {
+             for (p1 = end; p1 >= p; p1--)
+               {
+                 c = *p1; *p1 = '\0';
+                 if (fnmatch (pat, p, 0) == 0)
+                   {
+                     *p1 = c;
+                     *sp = p;
+                     *ep = p1;
+                     return 1;
+                   }
+                 *p1 = c;
+               }
+           }
+       }
+      return (0);
+
+    case MATCH_BEG:
+      if (match_pattern_char (pat, string) == 0)
+        return (0);
+      for (p = end; p >= string; p--)
+       {
+         c = *p; *p = '\0';
+         if (fnmatch (pat, string, 0) == 0)
+           {
+             *p = c;
+             *sp = string;
+             *ep = p;
+             return 1;
+           }
+         *p = c;
+       }
+      return (0);
+
+    case MATCH_END:
+      for (p = string; p <= end; p++)
+       if (fnmatch (pat, p, 0) == 0)
+         {
+           *sp = p;
+           *ep = end;
+           return 1;
+         }
+      return (0);
+    }
+
+  return (0);
+}
+
+/*******************************************
+ *                                        *
+ *     Functions to expand WORD_DESCs     *
+ *                                        *
+ *******************************************/
+
+/* Expand WORD, performing word splitting on the result.  This does
+   parameter expansion, command substitution, arithmetic expansion,
+   word splitting, and quote removal. */
+
+WORD_LIST *
+expand_word (word, quoted)
+     WORD_DESC *word;
+     int quoted;
+{
+  WORD_LIST *result, *tresult;
+
+  tresult = call_expand_word_internal (word, quoted, (int *)NULL, (int *)NULL);
+  result = word_list_split (tresult);
+  dispose_words (tresult);
+  return (result ? dequote_list (result) : result);
+}
+
+/* Expand WORD, but do not perform word splitting on the result.  This
+   does parameter expansion, command substitution, arithmetic expansion,
+   and quote removal. */
+WORD_LIST *
+expand_word_no_split (word, quoted)
+     WORD_DESC *word;
+     int quoted;
+{
+  WORD_LIST *result;
+
+  result = call_expand_word_internal (word, quoted, (int *)NULL, (int *)NULL);
+  return (result ? dequote_list (result) : result);
+}
+
+/* Perform shell expansions on WORD, but do not perform word splitting or
+   quote removal on the result. */
+WORD_LIST *
+expand_word_leave_quoted (word, quoted)
+     WORD_DESC *word;
+     int quoted;
+{
+  return (call_expand_word_internal (word, quoted, (int *)NULL, (int *)NULL));
+}
+
+/* Return the value of a positional parameter.  This handles values > 10. */
+char *
+get_dollar_var_value (ind)
+     int ind;
+{
+  char *temp;
+  WORD_LIST *p;
+
+  if (ind < 10)
+    temp = dollar_vars[ind] ? savestring (dollar_vars[ind]) : (char *)NULL;
+  else /* We want something like ${11} */
+    {
+      ind -= 10;
+      for (p = rest_of_args; p && ind--; p = p->next)
+        ;
+      temp = p ? savestring (p->word->word) : (char *)NULL;
+    }
+  return (temp);
+}
+
+#if defined (PROCESS_SUBSTITUTION)
+
+/* **************************************************************** */
+/*                                                               */
+/*                 Hacking Process Substitution                    */
+/*                                                               */
+/* **************************************************************** */
+
+#if !defined (HAVE_DEV_FD)
+/* Named pipes must be removed explicitly with `unlink'.  This keeps a list
+   of FIFOs the shell has open.  unlink_fifo_list will walk the list and
+   unlink all of them. add_fifo_list adds the name of an open FIFO to the
+   list.  NFIFO is a count of the number of FIFOs in the list. */
+#define FIFO_INCR 20
+extern char *mktemp ();
+
+static char **fifo_list = (char **)NULL;
+static int nfifo = 0;
+static int fifo_list_size = 0;
+
+static void
+add_fifo_list (pathname)
+     char *pathname;
+{
+  if (nfifo >= fifo_list_size - 1)
+    {
+      fifo_list_size += FIFO_INCR;
+      fifo_list = (char **)xrealloc (fifo_list,
+                                    fifo_list_size * sizeof (char *));
+    }
+
+  fifo_list[nfifo++] = savestring (pathname);
+}
+
+void
+unlink_fifo_list ()
+{
+  if (nfifo == 0)
+    return;
+
+  while (nfifo--)
+    {
+      unlink (fifo_list[nfifo]);
+      free (fifo_list[nfifo]);
+      fifo_list[nfifo] = (char *)NULL;
+    }
+  nfifo = 0;
+}
+
+static char *
+make_named_pipe ()
+{
+  char *tname;
+
+  tname = mktemp (savestring ("/tmp/sh-np-XXXXXX"));
+  if (mkfifo (tname, 0666) < 0)
+    {
+      free (tname);
+      return ((char *)NULL);
+    }
+
+  add_fifo_list (tname);
+  return (tname);
+}
+
+#else /* HAVE_DEV_FD */
+
+/* DEV_FD_LIST is a bitmap of file descriptors attached to pipes the shell
+   has open to children.  NFDS is a count of the number of bits currently
+   set in DEV_FD_LIST.  TOTFDS is a count of the highest possible number
+   of open files. */
+static char *dev_fd_list = (char *)NULL;
+static int nfds = 0;
+static int totfds;     /* The highest possible number of open files. */
+
+static void
+add_fifo_list (fd)
+     int fd;
+{
+  if (!dev_fd_list || fd >= totfds)
+    {
+      int zero;
+
+      totfds = getdtablesize ();
+      if (totfds < 0 || totfds > 256)
+       totfds = 256;
+      if (fd > totfds)
+       totfds = fd + 2;
+
+      zero = dev_fd_list == (char *) NULL;
+      dev_fd_list = xrealloc (dev_fd_list, totfds);
+      if (zero)
+       bzero (dev_fd_list, totfds);
+      /* XXX - should zero out new portion of list here - XXX */
+    }
+
+  dev_fd_list[fd] = 1;
+  nfds++;
+}
+
+void
+unlink_fifo_list ()
+{
+  register int i;
+
+  if (nfds == 0)
+    return;
+
+  for (i = 0; nfds && i < totfds; i++)
+    if (dev_fd_list[i])
+      {
+       close (i);
+       dev_fd_list[i] = 0;
+       nfds--;
+      }
+
+  nfds = 0;
+}
+
+#if defined (NOTDEF)
+print_dev_fd_list ()
+{
+  register int i;
+
+  fprintf (stderr, "pid %d: dev_fd_list:", getpid ());
+  fflush (stderr);
+
+  for (i = 0; i < totfds; i++)
+    {
+      if (dev_fd_list[i])
+       fprintf (stderr, " %d", i);
+    }
+  fprintf (stderr, "\n");
+}
+#endif /* NOTDEF */
+
+static char *
+make_dev_fd_filename (fd)
+     int fd;
+{
+  char *ret;
+
+  ret = xmalloc (16);
+  sprintf (ret, "/dev/fd/%d", fd);
+  add_fifo_list (fd);
+  return (ret);
+}
+
+#endif /* HAVE_DEV_FD */
+
+/* Return a filename that will open a connection to the process defined by
+   executing STRING.  HAVE_DEV_FD, if defined, means open a pipe and return
+   a filename in /dev/fd corresponding to a descriptor that is one of the
+   ends of the pipe.  If not defined, we use named pipes on systems that have
+   them.  Systems without /dev/fd and named pipes are out of luck.
+
+   OPEN_FOR_READ_IN_CHILD, if 1, means open the named pipe for reading or
+   use the read end of the pipe and dup that file descriptor to fd 0 in
+   the child.  If OPEN_FOR_READ_IN_CHILD is 0, we open the named pipe for
+   writing or use the write end of the pipe in the child, and dup that
+   file descriptor to fd 1 in the child.  The parent does the opposite. */
+
+static char *
+process_substitute (string, open_for_read_in_child)
+     char *string;
+     int open_for_read_in_child;
+{
+  char *pathname;
+  int fd, result;
+  pid_t old_pid, pid;
+#if defined (HAVE_DEV_FD)
+  int parent_pipe_fd, child_pipe_fd;
+  int fildes[2];
+#endif /* HAVE_DEV_FD */
+#if defined (JOB_CONTROL)
+  pid_t old_pipeline_pgrp;
+#endif  
+
+  if (!string || !*string)
+    return ((char *)NULL);
+
+#if !defined (HAVE_DEV_FD)
+  pathname = make_named_pipe ();
+#else /* HAVE_DEV_FD */
+  if (pipe (fildes) < 0)
+    {
+      internal_error ("can't make pipes for process substitution: %s",
+       strerror (errno));
+      return ((char *)NULL);
+    }
+  /* If OPEN_FOR_READ_IN_CHILD == 1, we want to use the write end of
+     the pipe in the parent, otherwise the read end. */
+  parent_pipe_fd = fildes[open_for_read_in_child];
+  child_pipe_fd = fildes[1 - open_for_read_in_child];
+  pathname = make_dev_fd_filename (parent_pipe_fd);
+#endif /* HAVE_DEV_FD */
+
+  if (!pathname)
+    {
+      internal_error ("cannot make pipe for process subsitution: %s",
+       strerror (errno));
+      return ((char *)NULL);
+    }
+
+  old_pid = last_made_pid;
+
+#if defined (JOB_CONTROL)
+  old_pipeline_pgrp = pipeline_pgrp;
+  pipeline_pgrp = shell_pgrp;
+  cleanup_the_pipeline ();
+#endif /* JOB_CONTROL */
+
+  pid = make_child ((char *)NULL, 1);
+  if (pid == 0)
+    {
+      reset_terminating_signals ();    /* XXX */
+      /* Cancel traps, in trap.c. */
+      restore_original_signals ();
+      setup_async_signals ();
+      subshell_environment++;
+    }
+
+#if defined (JOB_CONTROL)
+  set_sigchld_handler ();
+  stop_making_children ();
+  pipeline_pgrp = old_pipeline_pgrp;
+#endif /* JOB_CONTROL */
+
+  if (pid < 0)
+    {
+      internal_error ("cannot make a child for process substitution: %s",
+       strerror (errno));
+      free (pathname);
+#if defined (HAVE_DEV_FD)
+      close (parent_pipe_fd);
+      close (child_pipe_fd);
+#endif /* HAVE_DEV_FD */
+      return ((char *)NULL);
+    }
+
+  if (pid > 0)
+    {
+      last_made_pid = old_pid;
+
+#if defined (JOB_CONTROL) && defined (PGRP_PIPE)
+      close_pgrp_pipe ();
+#endif /* JOB_CONTROL && PGRP_PIPE */
+
+#if defined (HAVE_DEV_FD)
+      close (child_pipe_fd);
+#endif /* HAVE_DEV_FD */
+
+      return (pathname);
+    }
+
+  set_sigint_handler ();
+
+#if defined (JOB_CONTROL)
+  set_job_control (0);
+#endif /* JOB_CONTROL */
+
+#if !defined (HAVE_DEV_FD)
+  /* Open the named pipe in the child. */
+  fd = open (pathname, open_for_read_in_child ? O_RDONLY : O_WRONLY);
+  if (fd < 0)
+    {
+      internal_error ("cannot open named pipe %s for %s: %s", pathname,
+       open_for_read_in_child ? "reading" : "writing", strerror (errno));
+      exit (127);
+    }
+#else /* HAVE_DEV_FD */
+  fd = child_pipe_fd;
+#endif /* HAVE_DEV_FD */
+
+  if (dup2 (fd, open_for_read_in_child ? 0 : 1) < 0)
+    {
+      internal_error ("cannot duplicate named pipe %s as fd %d: %s",
+       pathname, open_for_read_in_child ? 0 : 1, strerror (errno));
+      exit (127);
+    }
+
+  close (fd);
+
+  /* Need to close any files that this process has open to pipes inherited
+     from its parent. */
+  if (current_fds_to_close)
+    {
+      close_fd_bitmap (current_fds_to_close);
+      current_fds_to_close = (struct fd_bitmap *)NULL;
+    }
+
+#if defined (HAVE_DEV_FD)
+  /* Make sure we close the parent's end of the pipe and clear the slot
+     in the fd list so it is not closed later, if reallocated by, for
+     instance, pipe(2). */
+  close (parent_pipe_fd);
+  dev_fd_list[parent_pipe_fd] = 0;
+#endif /* HAVE_DEV_FD */
+
+  result = parse_and_execute (string, "process substitution", 0);
+
+#if !defined (HAVE_DEV_FD)
+  /* Make sure we close the named pipe in the child before we exit. */
+  close (open_for_read_in_child ? 0 : 1);
+#endif /* !HAVE_DEV_FD */
+
+  exit (result);
+  /*NOTREACHED*/
+}
+#endif /* PROCESS_SUBSTITUTION */
+
+/* Perform command substitution on STRING.  This returns a string,
+   possibly quoted. */
+static char *
+command_substitute (string, quoted)
+     char *string;
+     int quoted;
+{
+  pid_t pid, old_pid, old_pipeline_pgrp;
+  char *istring;
+  int istring_index, istring_size, c, result, fildes[2];
+  FILE *istream;
+
+  istring_index = istring_size = 0;
+
+  /* Don't fork () if there is no need to.  In the case of no command to
+     run, just return NULL. */
+  if (!string || !*string || (string[0] == '\n' && !string[1]))
+    return ((char *)NULL);
+
+  /* Pipe the output of executing STRING into the current shell. */
+  if (pipe (fildes) < 0)
+    {
+      internal_error ("Can't make pipes for command substitution!");
+      goto error_exit;
+    }
+
+  old_pid = last_made_pid;
+#if defined (JOB_CONTROL)
+  old_pipeline_pgrp = pipeline_pgrp;
+  pipeline_pgrp = shell_pgrp;
+  cleanup_the_pipeline ();
+#endif
+
+  istring= (char *)NULL;
+  pid = make_child ((char *)NULL, 0);
+  if (pid == 0)
+    /* Reset the signal handlers in the child, but don't free the
+       trap strings. */
+    reset_signal_handlers ();
+
+#if defined (JOB_CONTROL)
+  set_sigchld_handler ();
+  stop_making_children ();
+  pipeline_pgrp = old_pipeline_pgrp;
+#endif /* JOB_CONTROL */
+
+  if (pid < 0)
+    {
+      internal_error ("Can't make a child for command substitution: %s",
+       strerror (errno));
+    error_exit:
+
+      FREE (istring);
+      close (fildes[0]);
+      close (fildes[1]);
+      return ((char *)NULL);
+    }
+
+  if (pid == 0)
+    {
+      set_sigint_handler ();   /* XXX */
+#if defined (JOB_CONTROL)
+      set_job_control (0);
+#endif
+      if (dup2 (fildes[1], 1) < 0)
+       {
+         internal_error
+           ("command_substitute: cannot duplicate pipe as fd 1: %s",
+            strerror (errno));
+         exit (EXECUTION_FAILURE);
+       }
+
+      /* If standard output is closed in the parent shell
+        (such as after `exec >&-'), file descriptor 1 will be
+        the lowest available file descriptor, and end up in
+        fildes[0].  This can happen for stdin and stderr as well,
+        but stdout is more important -- it will cause no output
+        to be generated from this command. */
+      if ((fildes[1] != fileno (stdin)) &&
+         (fildes[1] != fileno (stdout)) &&
+         (fildes[1] != fileno (stderr)))
+       close (fildes[1]);
+
+      if ((fildes[0] != fileno (stdin)) &&
+         (fildes[0] != fileno (stdout)) &&
+         (fildes[0] != fileno (stderr)))
+       close (fildes[0]);
+
+      /* The currently executing shell is not interactive. */
+      interactive = 0;
+
+      /* Command substitution does not inherit the -e flag. */
+      exit_immediately_on_error = 0;
+
+      remove_quoted_escapes (string);
+
+      startup_state = 2;       /* see if we can avoid a fork */
+      /* Give command substitution a place to jump back to on failure,
+        so we don't go back up to main (). */
+      result = setjmp (top_level);
+
+      if (result == EXITPROG)
+       exit (last_command_exit_value);
+      else if (result)
+       exit (EXECUTION_FAILURE);
+      else
+       exit (parse_and_execute (string, "command substitution", -1));
+    }
+  else
+    {
+      istream = fdopen (fildes[0], "r");
+
+#if defined (JOB_CONTROL) && defined (PGRP_PIPE)
+      close_pgrp_pipe ();
+#endif /* JOB_CONTROL && PGRP_PIPE */
+
+      close (fildes[1]);
+
+      if (!istream)
+       {
+         internal_error ("Can't reopen pipe to command substitution (fd %d): %s",
+                       fildes[0], strerror (errno));
+         goto error_exit;
+       }
+
+      /* Read the output of the command through the pipe. */
+      while (1)
+       {
+#if !defined (HAVE_RESTARTABLE_SYSCALLS)
+         c = getc_with_restart (istream);
+#else
+         c = getc (istream);
+#endif /* HAVE_RESTARTABLE_SYSCALLS */
+
+         if (c == EOF)
+           break;
+
+         /* Add the character to ISTRING. */
+         if (istring_index + 2 >= istring_size)
+           {
+             while (istring_index + 2 >= istring_size)
+               istring_size += DEFAULT_ARRAY_SIZE;
+             istring = xrealloc (istring, istring_size);
+           }
+
+         if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || c == CTLESC /* || c == CTLNUL */)
+           istring[istring_index++] = CTLESC;
+
+         istring[istring_index++] = c;
+       }
+
+      if (istring)
+       istring[istring_index] = '\0';
+
+      fclose (istream);
+      close (fildes[0]);
+
+      last_command_exit_value = wait_for (pid);
+      last_command_subst_pid = pid;
+      last_made_pid = old_pid;
+
+#if defined (JOB_CONTROL)
+      /* If last_command_exit_value > 128, then the substituted command
+        was terminated by a signal.  If that signal was SIGINT, then send
+        SIGINT to ourselves.  This will break out of loops, for instance. */
+      if (last_command_exit_value == (128 + SIGINT))
+       kill (getpid (), SIGINT);
+
+      /* wait_for gives the terminal back to shell_pgrp.  If some other
+        process group should have it, give it away to that group here. */
+      if (interactive && pipeline_pgrp != (pid_t)0)
+       give_terminal_to (pipeline_pgrp);
+#endif /* JOB_CONTROL */
+
+      /* If we read no output, just return now and save ourselves some
+        trouble. */
+      if (istring_index == 0)
+       goto error_exit;
+
+      /* Strip trailing newlines from the output of the command. */
+      if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+       {
+         while (istring_index > 0)
+           {
+             if (istring[istring_index - 1] == '\n')
+               {
+                 --istring_index;
+
+                 /* If the newline was quoted, remove the quoting char. */
+                 if (istring[istring_index - 1] == CTLESC)
+                   --istring_index;
+               }
+             else
+               break;
+           }
+         istring[istring_index] = '\0';
+       }
+      else
+       strip_trailing (istring, 1);
+
+      return (istring);
+    }
+}
+
+/********************************************************
+ *                                                     *
+ *     Utility functions for parameter expansion       *
+ *                                                     *
+ ********************************************************/
+
+static int
+getpatspec (c, value)
+     int c;
+     char *value;
+{
+  if (c == '#')
+    return ((*value == '#') ? RP_LONG_LEFT : RP_SHORT_LEFT);
+  else /* c == '%' */
+    return ((*value == '%') ? RP_LONG_RIGHT : RP_SHORT_RIGHT);
+}
+
+/* Posix.2 says that the WORD should be run through tilde expansion,
+   parameter expansion, command substitution and arithmetic expansion.
+   This leaves the result quoted, so quote_string_for_globbing () has
+   to be called to fix it up for fnmatch ().  If QUOTED is non-zero,
+   it means that the entire expression was enclosed in double quotes.
+   This means that quoting characters in the pattern do not make any
+   special pattern characters quoted.  For example, the `*' in the
+   following retains its special meaning: "${foo#'*'}". */
+static char *
+getpattern (value, quoted, expandpat)
+     char *value;
+     int quoted, expandpat;
+{
+  char *pat, *tword;
+  WORD_LIST *l;
+  int i;
+
+  tword = strchr (value, '~') ? bash_tilde_expand (value) : savestring (value);
+
+  /* expand_string_internal () leaves WORD quoted and does not perform
+     word splitting. */
+  if (expandpat && (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && *tword)
+    {
+      i = 0;
+      pat = string_extract_double_quoted (tword, &i, 1);
+      free (tword);
+      tword = pat;
+    }
+
+  /* There is a problem here:  how to handle single or double quotes in the
+     pattern string when the whole expression is between double quotes? */
+#if 0
+  l = *tword ? expand_string_for_rhs (tword, quoted, (int *)NULL, (int *)NULL)
+#else
+  l = *tword ? expand_string_for_rhs (tword,
+                                     (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? Q_NOQUOTE : quoted,
+                                     (int *)NULL, (int *)NULL)
+#endif
+            : (WORD_LIST *)0;
+  free (tword);
+  pat = string_list (l);
+  dispose_words (l);
+  if (pat)
+    {
+      tword = quote_string_for_globbing (pat, 1);
+      free (pat);
+      pat = tword;
+    }
+  return (pat);
+}
+
+/* Handle removing a pattern from a string as a result of ${name%[%]value}
+   or ${name#[#]value}. */
+static char *
+parameter_brace_remove_pattern (value, temp, c, quoted)
+     char *value, *temp;
+     int c, quoted;
+{
+  int patspec;
+  char *pattern, *tword;
+
+  patspec = getpatspec (c, value);
+  if (patspec == RP_LONG_LEFT || patspec == RP_LONG_RIGHT)
+    value++;
+
+  pattern = getpattern (value, quoted, 1);
+
+  tword = remove_pattern (temp, pattern, patspec);
+
+  FREE (pattern);
+  return (tword);
+}
+
+static char *
+list_remove_pattern (list, pattern, patspec, type, quoted)
+     WORD_LIST *list;
+     char *pattern;
+     int patspec, type, quoted;
+{
+  WORD_LIST *new, *l;
+  WORD_DESC *w;
+  char *tword;
+
+  for (new = (WORD_LIST *)NULL, l = list; l; l = l->next)
+    {
+      tword = remove_pattern (l->word->word, pattern, patspec);
+      w = make_bare_word (tword);
+      new = make_word_list (w, new);
+    }
+
+  l = REVERSE_LIST (new, WORD_LIST *);
+  if (type == '*')
+    tword = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? string_list_dollar_star (l) : string_list (l);
+  else
+    tword = string_list ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? quote_list (l) : l);
+
+  dispose_words (l);
+  return (tword);
+}
+
+static char *
+parameter_list_remove_pattern (value, type, c, quoted)
+     char *value;
+     int type, c, quoted;
+{
+  int patspec;
+  char *pattern;
+
+  patspec = getpatspec (c, value);
+  if (patspec == RP_LONG_LEFT || patspec == RP_LONG_RIGHT)
+    value++;
+
+  pattern = getpattern (value, quoted, 1);
+
+  return (list_remove_pattern (list_rest_of_args (), pattern, patspec, type, quoted));
+}
+
+#if defined (ARRAY_VARS)
+static char *
+array_remove_pattern (value, aspec, c, quoted)
+     char *value, *aspec;
+     int c, quoted;
+{
+  SHELL_VAR *var;
+  int len, ind, patspec;
+  char *ret, *t, *pattern;
+  WORD_LIST *l;
+
+  var = array_variable_part (aspec, &t, &len);
+  if (var == 0)
+    return ((char *)NULL);
+
+  patspec = getpatspec (c, value);
+  if (patspec == RP_LONG_LEFT || patspec == RP_LONG_RIGHT)
+    value++;
+
+  pattern = getpattern (value, quoted, 1);
+
+  if (ALL_ELEMENT_SUB (t[0]) && t[1] == ']')
+    {
+      if (array_p (var) == 0)
+        {
+          report_error ("%s: bad array subscript", aspec);
+          return ((char *)NULL);
+        }
+      l = array_to_word_list (array_cell (var));
+      if (l == 0)
+        return ((char *)NULL);
+      ret = list_remove_pattern (l, pattern, patspec, t[0], quoted);
+      dispose_words (l);
+    }
+  else
+    {
+      ind = array_expand_index (t, len);
+      if (ind < 0)
+       {
+         report_error ("%s: bad array subscript", aspec);
+         return ((char *)NULL);
+       }
+      if (array_p (var) == 0 && ind != 0)
+       return ((char *)NULL);
+
+      t = array_p (var) ? array_reference (array_cell (var), ind) : value_cell (var);
+      ret = remove_pattern (t, pattern, patspec);
+      if (ret)
+       quote_escapes (ret);
+    }
+  return ret;
+}
+
+int
+valid_array_reference (name)
+     char *name;
+{
+  char *t;
+  int r, len;
+
+  t = strchr (name, '[');
+  if (t)
+    {
+      *t = '\0';
+      r = legal_identifier (name);
+      *t = '[';
+      if (r == 0)
+       return 0;
+      /* Check for a properly-terminated non-blank subscript. */
+      len = skipsubscript (t, 0);
+      if (t[len] != ']' || len == 1)
+       return 0;
+      for (r = 1; r < len; r++)
+       if (whitespace (t[r]) == 0)
+         return 1;
+      return 0;
+    }
+  return 0;
+}
+
+/* Expand the array index beginning at S and extending LEN characters. */
+int
+array_expand_index (s, len)
+     char *s;
+     int len;
+{
+  char *exp, *t;
+  int val;
+
+  exp = xmalloc (len);
+  strncpy (exp, s, len - 1);
+  exp[len - 1] = '\0';
+  t = maybe_expand_string (exp, 0, expand_string);
+  this_command_name = (char *)NULL;
+  val = evalexp (t);
+  free (t);
+  free (exp);
+  return val;
+}
+
+/* Return the variable specified by S without any subscript.  If non-null,
+   return the index of the start of the subscript in *SUBP.  If non-null,
+   the length of the subscript is returned in *LENP. */
+SHELL_VAR *
+array_variable_part (s, subp, lenp)
+     char *s, **subp;
+     int *lenp;
+{
+  char *t;
+  int ind, ni;
+  SHELL_VAR *var;
+
+  t = strchr (s, '[');
+  ind = t - s;
+  ni = skipsubscript (s, ind);
+  if (ni <= ind + 1 || s[ni] != ']')
+    {
+      report_error ("%s: bad array subscript", s);
+      return ((SHELL_VAR *)NULL);
+    }
+
+  *t = '\0';
+  var = find_variable (s);
+  *t++ = '[';
+
+  if (subp)
+    *subp = t;
+  if (lenp)
+    *lenp = ni - ind;
+  return var;
+}
+
+static char *
+array_value_internal (s, quoted, allow_all)
+     char *s;
+     int quoted, allow_all;
+{
+  int len, ind;
+  char *retval, *t;
+  WORD_LIST *l;
+  SHELL_VAR *var;
+
+  var = array_variable_part (s, &t, &len);
+
+  if (var == 0)
+    return (char *)NULL;
+
+  if (ALL_ELEMENT_SUB (t[0]) && t[1] == ']')
+    {
+      if (array_p (var) == 0 || allow_all == 0)
+        {
+          report_error ("%s: bad array subscript", s);
+          return ((char *)NULL);
+        }
+      l = array_to_word_list (array_cell (var));
+      if (l == (WORD_LIST *)NULL)
+       return ((char *) NULL);
+
+      if (t[0] == '*')         /* ${name[*]} */
+       retval = (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? string_list_dollar_star (l) : string_list (l);
+      else                     /* ${name[@]} */
+       retval = string_list ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? quote_list (l) : l);
+
+      dispose_words (l);
+    }
+  else
+    {
+      ind = array_expand_index (t, len);
+      if (ind < 0)
+       {
+         report_error ("%s: bad array subscript", var->name);
+         return ((char *)NULL);
+       }
+      if (array_p (var) == 0)
+        return (ind == 0 ? value_cell (var) : (char *)NULL);
+      retval = array_reference (array_cell (var), ind);
+      if (retval)
+       retval = quote_escapes (retval);
+    }
+
+  return retval;
+}
+
+static char *
+array_value (s, quoted)
+     char *s;
+     int quoted;
+{
+  return (array_value_internal (s, quoted, 1));
+}
+
+/* Return the value of the array indexing expression S as a single string.
+   If ALLOW_ALL is 0, do not allow `@' and `*' subscripts.  This is used
+   by other parts of the shell such as the arithmetic expression evaluator
+   in expr.c. */
+char *
+get_array_value (s, allow_all)
+     char *s;
+     int allow_all;
+{
+  return (array_value_internal (s, 0, allow_all));
+}
+
+static int
+array_length_reference (s)
+     char *s;
+{
+  int ind, len;
+  char *t;
+  ARRAY *array;
+  SHELL_VAR *var;
+
+  var = array_variable_part (s, &t, &len);
+
+  if (var == 0 || array_p (var) == 0)
+    return (0);
+
+  array = array_cell (var);
+
+  if (ALL_ELEMENT_SUB (t[0]) && t[1] == ']')
+    return (array_num_elements (array));
+
+  ind = array_expand_index (t, len);
+  if (ind < 0)
+    {
+      report_error ("%s: bad array subscript", t);
+      return (0);
+    }
+  t = array_reference (array, ind);
+  len = STRLEN (t);
+
+  return (len);
+}
+#endif /* ARRAY_VARS */
+
+static int
+valid_brace_expansion_word (name, var_is_special)
+     char *name;
+     int var_is_special;
+{
+  if (digit (*name) && all_digits (name))
+    return 1;
+  else if (var_is_special)
+    return 1;
+#if defined (ARRAY_VARS)
+  else if (valid_array_reference (name))
+    return 1;
+#endif /* ARRAY_VARS */
+  else if (legal_identifier (name))
+    return 1;
+  else
+    return 0;
+}
+
+/* Parameter expand NAME, and return a new string which is the expansion,
+   or NULL if there was no expansion.
+   VAR_IS_SPECIAL is non-zero if NAME is one of the special variables in
+   the shell, e.g., "@", "$", "*", etc.  QUOTED, if non-zero, means that
+   NAME was found inside of a double-quoted expression. */
+static char *
+parameter_brace_expand_word (name, var_is_special, quoted)
+     char *name;
+     int var_is_special, quoted;
+{
+  char *temp, *tt;
+  int arg_index;
+  SHELL_VAR *var;
+  WORD_LIST *l;
+
+  /* Handle multiple digit arguments, as in ${11}. */
+  if (digit (*name))
+    {
+      arg_index = atoi (name);
+      temp = get_dollar_var_value (arg_index);
+    }
+  else if (var_is_special)      /* ${@} */
+    {
+      tt = xmalloc (2 + strlen (name));
+      tt[0] = '$';
+      strcpy (tt + 1, name);
+      l = expand_string_leave_quoted (tt, quoted);
+      free (tt);
+      temp = string_list (l);
+      dispose_words (l);
+    }
+#if defined (ARRAY_VARS)
+  else if (valid_array_reference (name))
+    {
+      temp = array_value (name, quoted);
+    }
+#endif
+  else if (var = find_variable (name))
+    {
+      if (var && invisible_p (var) == 0)
+        {
+#if defined (ARRAY_VARS)
+         temp = array_p (var) ? array_reference (array_cell (var), 0) : value_cell (var);
+#else
+         temp = value_cell (var);
+#endif
+
+         if (temp)
+           temp = quote_escapes (temp);
+        }
+      else
+       temp = (char *)NULL;
+    }
+  else
+    temp = (char *)NULL;
+
+  return (temp);
+}
+
+/* Expand an indirect reference to a variable: ${!NAME} expands to the
+   value of the variable whose name is the value of NAME. */
+static char *
+parameter_brace_expand_indir (name, var_is_special, quoted)
+     char *name;
+     int var_is_special, quoted;
+{
+  char *temp, *t;
+
+  t = parameter_brace_expand_word (name, var_is_special, quoted);
+  if (t == 0)
+    return (t);
+  temp = parameter_brace_expand_word (t, t[0] == '@' && t[1] == '\0', quoted);
+  free (t);
+  return temp;
+}
+
+/* Expand the right side of a parameter expansion of the form ${NAMEcVALUE},
+   depending on the value of C, the separating character.  C can be one of
+   "-", "+", or "=".  QUOTED is true if the entire brace expression occurs
+   between double quotes. */
+static char *
+parameter_brace_expand_rhs (name, value, c, quoted, qdollaratp, hasdollarat)
+     char *name, *value;
+     int c, quoted, *qdollaratp, *hasdollarat;
+{
+  WORD_LIST *l;
+  char *t, *t1, *temp;
+  int hasdol;
+
+  temp = (*value == '~' || (strchr (value, '~') && unquoted_substring ("=~", value)))
+        ? bash_tilde_expand (value)
+       : savestring (value);
+
+  /* If the entire expression is between double quotes, we want to treat
+     the value as a double-quoted string, with the exception that we strip
+     embedded unescaped double quotes. */
+  if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && *temp)
+    {
+      hasdol = 0;
+      t = string_extract_double_quoted (temp, &hasdol, 1);
+      free (temp);
+      temp = t;
+    }
+    
+  hasdol = 0;
+  /* XXX was 0 not quoted */
+  l = *temp ? expand_string_for_rhs (temp, quoted, &hasdol, (int *)NULL)
+           : (WORD_LIST *)0;
+  if (hasdollarat)
+    *hasdollarat = hasdol || (l && l->next);
+  free (temp);
+  if (l)
+    {
+      /* The expansion of TEMP returned something.  We need to treat things
+         slightly differently if HASDOL is non-zero. */
+      temp = string_list (l);
+      /* If l->next is not null, we know that TEMP contained "$@", since that
+        is the only expansion that creates more than one word. */
+      if ((hasdol && quoted) || l->next)
+       *qdollaratp = 1;
+      dispose_words (l);
+    }
+  else if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && hasdol)
+    {
+      /* The brace expansion occurred between double quotes and there was 
+        a $@ in TEMP.  It does not matter if the $@ is quoted, as long as
+        it does not expand to anything.  In this case, we want to return
+        a quoted empty string. */
+      temp = xmalloc (2);
+#if 0
+      temp[0] = CTLNUL;
+      temp[1] = '\0';
+#else
+      temp[0] = '\0';
+#endif
+    }
+  else
+    temp = (char *)NULL;
+
+  if (c == '-' || c == '+')
+    return (temp);
+
+  /* c == '=' */
+  t = temp ? savestring (temp) : savestring ("");
+  t1 = dequote_string (t);
+  free (t);
+  bind_variable (name, t1);
+  free (t1);
+  return (temp);
+}
+
+/* Deal with the right hand side of a ${name:?value} expansion in the case
+   that NAME is null or not set.  If VALUE is non-null it is expanded and
+   used as the error message to print, otherwise a standard message is
+   printed. */
+static void
+parameter_brace_expand_error (name, value)
+     char *name, *value;
+{
+  WORD_LIST *l;
+  char *temp;
+
+  if (value && *value)
+    {
+      l = expand_string (value, 0);
+      temp =  string_list (l);
+      report_error ("%s: %s", name, temp ? temp : value);
+      FREE (temp);
+      dispose_words (l);
+    }
+  else
+    report_error ("%s: parameter null or not set", name);
+
+  /* Free the data we have allocated during this expansion, since we
+     are about to longjmp out. */
+  free (name);
+  FREE (value);
+}
+
+/* Return 1 if NAME is something for which parameter_brace_expand_length is
+   OK to do. */
+static int
+valid_length_expression (name)
+     char *name;
+{
+  return (!name[1] ||                                          /* ${#} */
+         ((name[1] == '@' || name[1] == '*') && !name[2]) ||   /* ${#@}, ${#*} */
+         (digit (name[1]) && all_digits (name + 1)) ||         /* ${#11} */
+#if defined (ARRAY_VARS)
+         valid_array_reference (name + 1) ||                   /* ${#a[7]} */
+#endif
+         legal_identifier (name + 1));                         /* ${#PS1} */
+}
+
+/* Handle the parameter brace expansion that requires us to return the
+   length of a parameter. */
+static int
+parameter_brace_expand_length (name)
+     char *name;
+{
+  char *t, *newname;
+  int number;
+  WORD_LIST *list;
+#if defined (ARRAY_VARS)
+  SHELL_VAR *var;
+#endif
+
+  if (name[1] == '\0')                 /* ${#} */
+    number = number_of_args ();
+#if defined (ARRAY_VARS)
+  else if (valid_array_reference (name + 1))
+    number = array_length_reference (name + 1);
+#endif /* ARRAY_VARS */
+  else if (name[1] != '*' && name[1] != '@')
+    {
+      number = 0;
+
+      if (digit (name[1]))             /* ${#1} */
+       {
+         t = get_dollar_var_value (atoi (name + 1));
+         number = STRLEN (t);
+         FREE (t);
+       }
+#if defined (ARRAY_VARS)
+      else if ((var = find_variable (name + 1)) && array_p (var))
+       {
+         t = array_reference (array_cell (var), 0);
+         number = STRLEN (t);
+       }
+#endif
+      else                             /* ${#PS1} */
+       {
+         newname = savestring (name);
+         newname[0] = '$';
+         list = expand_string (newname, 0);
+         t = list ? string_list (list) : (char *)NULL;
+         free (newname);
+         if (list)
+           dispose_words (list);
+
+         number = STRLEN (t);
+         FREE (t);
+       }
+    }
+  else                                 /* ${#@} and ${#*} */
+    number = number_of_args ();
+
+  return (number);
+}
+
+/* Verify and limit the start and end of the desired substring.  If
+   VTYPE == 0, a regular shell variable is being used; if it is 1,
+   then the positional paramters are being used; if it is 2, then
+   VALUE is really a pointer to an array variable that should be used. */
+static int
+verify_substring_values (value, substr, vtype, e1p, e2p)
+     char *value, *substr;
+     int vtype, *e1p, *e2p;
+{
+  char *t, *temp1; 
+  int len;
+#if defined (ARRAY_VARS)
+ ARRAY *a;
+#endif  
+
+  t = strchr (substr, ':');
+  if (t)
+    *t = '\0';
+  temp1 = maybe_expand_string (substr, 1, expand_string);
+  *e1p = evalexp (temp1);
+  free (temp1);
+
+  switch (vtype)
+    {
+    case 0:
+      len = strlen (value);
+      break;
+    case 1:
+      len = number_of_args () + 1;
+      break;
+#if defined (ARRAY_VARS)
+    case 2:
+      a = (ARRAY *)value;
+      len = array_num_elements (a) + 1;
+      break;
+#endif
+    }
+
+  if (*e1p < 0)                /* negative offsets count from end */
+    *e1p += len;
+
+  if (t)
+    {
+      t++;
+      temp1 = maybe_expand_string (t, 1, expand_string);
+      t[-1] = ':';
+      *e2p = evalexp (temp1);
+      free (temp1);
+      if (*e2p < 0)
+        {
+          internal_error ("%s: substring expression < 0", t);
+         return (0);
+        }
+      *e2p += *e1p;            /* want E2 chars starting at E1 */
+      if (*e2p > len)
+        *e2p = len;
+    }
+  else
+    *e2p = len;
+
+  return (1);
+}
+
+/* Return a string containing the positional parameters from START to
+   END, inclusive. */
+static char *
+pos_params (start, end, quoted)
+     int start, end, quoted;
+{
+  WORD_LIST *save, *params, *h, *t;
+  char *ret;
+  int i;
+
+  save = params = list_rest_of_args ();
+  if (save == 0)
+    return ((char *)NULL);
+
+  for (i = 1; params && i < start; i++)
+    params = params->next;
+  if (params == 0)
+    return ((char *)NULL);
+  for (h = t = params; params && i < end; i++)
+    {
+      t = params;
+      params = params->next;
+    }
+
+  t->next = (WORD_LIST *)NULL;
+  ret = string_list ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) ? quote_list (h) : h);
+  t->next = params;
+
+  dispose_words (save);
+  return (ret);
+}
+
+#define VT_VARIABLE    0
+#define VT_POSPARMS    1
+#define VT_ARRAYVAR    2
+
+/* Return the type of variable specified by VARNAME (simple variable,
+   positional param, or array variable.  Also return the value specified
+   by VARNAME (value of a variable or a reference to an array element). */
+static int
+get_var_and_type (varname, value, varp, valp)
+     char *varname, *value;
+     SHELL_VAR **varp;
+     char **valp;
+{
+  int vtype;
+  char *temp;
+#if defined (ARRAY_VARS)
+  SHELL_VAR *v;
+#endif
+  
+  vtype = varname[0] == '@' && varname[1] == '\0';     /* VT_POSPARMS */
+  *varp = (SHELL_VAR *)NULL;
+
+#if defined (ARRAY_VARS)
+  if (valid_array_reference (varname))
+    {
+      v = array_variable_part (varname, &temp, (int *)0);
+      if (v && array_p (v))
+       {
+         if (temp[0] == '@' && temp[1] == ']')
+           {
+             vtype = VT_ARRAYVAR;
+             *valp = (char *)array_cell (v);
+           }
+         else
+           {
+             vtype = VT_VARIABLE;
+             *valp = array_value (varname, 1);
+           }
+         *varp = v;
+       }
+      else
+       return -1;
+    }
+  else if ((v = find_variable (varname)) && array_p (v))
+    {
+      vtype = VT_VARIABLE;
+      *varp = v;
+      *valp = array_reference (array_cell (v), 0);
+    }
+  else
+#endif
+  *valp = value;
+
+  return vtype;
+}
+
+/* Process a variable substring expansion: ${name:e1[:e2]}.  If VARNAME
+   is `@', use the positional parameters; otherwise, use the value of
+   VARNAME.  If VARNAME is an array variable, use the array elements. */
+
+static char *
+parameter_brace_substring (varname, value, substr, quoted)
+     char *varname, *value, *substr;
+     int quoted;
+{
+  int e1, e2, vtype;
+  char *temp, *val;
+  SHELL_VAR *v;
+
+  if (value == 0)
+    return ((char *)NULL);
+
+  this_command_name = varname;
+
+  vtype = get_var_and_type (varname, value, &v, &val);
+  if (vtype == -1)
+    return ((char *)NULL);
+
+  if (verify_substring_values (val, substr, vtype, &e1, &e2) == 0)
+    return (&expand_param_error);
+
+  switch (vtype)
+    {
+    case VT_VARIABLE:
+      temp = substring (value, e1, e2);
+      break;
+    case VT_POSPARMS:
+      temp = pos_params (e1, e2, quoted);
+      break;
+#if defined (ARRAY_VARS)
+    case VT_ARRAYVAR:
+      temp = array_subrange (array_cell (v), e1, e2, quoted);
+      break;
+#endif
+    }
+
+  return temp;
+}
+
+char *
+pat_subst (string, pat, rep, mflags)
+     char *string, *pat, *rep;
+     int mflags;
+{
+  char *ret, *s, *e, *str;
+  int rsize, rptr, l, replen, mtype;
+
+  ret = xmalloc (rsize = 64);
+  ret[0] = '\0';
+
+  mtype = mflags & MATCH_TYPEMASK;
+
+  for (replen = STRLEN (rep), rptr = 0, str = string;;)
+    {
+      if (match_pattern (str, pat, mtype, &s, &e) == 0)
+       break;
+      l = s - str;
+      if ((rptr + l + replen) >= rsize)
+       {
+         while ((rptr + l + replen) >= rsize)
+           rsize += 64;
+         ret = xrealloc (ret, rsize);
+       }
+      /* OK, now copy the leading unmatched portion of the string (from
+        str to s) to ret starting at rptr (the current offset).  Then copy
+         the replacement string at ret + rptr + (s - str).  Increment
+         rptr (if necessary) and str and go on. */
+      if (l)
+       {
+         strncpy (ret + rptr, str, l);
+         rptr += l;
+       }
+      if (replen)
+       {
+         strncpy (ret + rptr, rep, replen);
+         rptr += replen;
+       }
+      str = e;         /* e == end of match */
+      if (((mflags & MATCH_GLOBREP) == 0) || mtype != MATCH_ANY)
+        break;
+    }
+
+  /* Now copy the unmatched portion of the input string */
+  if (*str)
+    strcpy (ret + rptr, str);
+  else
+    ret[rptr] = '\0';
+
+  return ret;
+}
+
+/* Do pattern match and replacement on the positional parameters. */
+static char *
+pos_params_pat_subst (string, pat, rep, mflags)
+     char *string, *pat, *rep;
+     int mflags;
+{
+  WORD_LIST *save, *params;
+  WORD_DESC *w;
+  char *ret;
+
+  save = params = list_rest_of_args ();
+  if (save == 0)
+    return ((char *)NULL);
+
+  for ( ; params; params = params->next)
+    {
+      ret = pat_subst (params->word->word, pat, rep, mflags);
+      w = make_bare_word (ret);
+      dispose_word (params->word);
+      params->word = w;
+      FREE (ret);
+    }
+
+  ret = string_list ((mflags & MATCH_QUOTED) ? quote_list (save) : save);
+  dispose_words (save);
+
+  return (ret);
+}
+
+static char *
+parameter_brace_patsub (varname, value, patsub, quoted)
+     char *varname, *value, *patsub;
+     int quoted;
+{
+  int vtype, mflags;
+  char *val, *temp, *pat, *rep, *p;
+  SHELL_VAR *v;
+
+  if (value == 0)
+    return ((char *)NULL);
+
+  this_command_name = varname;
+
+  vtype = get_var_and_type (varname, value, &v, &val);
+  if (vtype == -1)
+    return ((char *)NULL);
+
+  mflags = 0;
+  if (*patsub == '/')
+    {
+      mflags |= MATCH_GLOBREP;
+      patsub++;
+    }
+
+  if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+    mflags |= MATCH_QUOTED;
+
+  if (rep = strchr (patsub, '/'))
+    *rep++ = '\0';
+  else
+    rep = (char *)NULL;
+
+  if (rep && *rep == '\0')
+    rep = (char *)NULL;
+
+  /* Expand PAT and REP for command, variable and parameter, arithmetic,
+     and process substitution.  Also perform quote removal.  Do not
+     perform word splitting or filename generation. */
+  pat = maybe_expand_string (patsub, quoted, expand_string_unsplit);
+  if (rep)
+    rep = maybe_expand_string (rep, quoted, expand_string_unsplit);
+
+  p = pat;
+  if (pat[0] == '#')
+    {
+      mflags |= MATCH_BEG;
+      p++;
+    }
+  else if (pat[0] == '%')
+    {
+      mflags |= MATCH_END;
+      p++;
+    }
+  else
+    mflags |= MATCH_ANY;
+
+  /* OK, we now want to substitute REP for PAT in VAL.  If GLOBAL is 1,
+     the substitution is done everywhere, otherwise only the first
+     occurrence of PAT is replaced. */
+  switch (vtype)
+    {
+    case VT_VARIABLE:
+      temp = pat_subst (val, p, rep, mflags);
+      break;
+    case VT_POSPARMS:
+      temp = pos_params_pat_subst (val, p, rep, mflags);
+      break;
+#if defined (ARRAY_VARS)
+    case VT_ARRAYVAR:
+      temp = array_pat_subst (array_cell (v), p, rep, mflags);
+      break;
+#endif
+    }
+
+  FREE (pat);
+  FREE (rep);
+
+  return temp;
+}
+
+/* ${[#][!]name[[:]#[#]%[%]-=?+[word][:e1[:e2]]]} */
+static char *
+parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_dollar_at)
+     char *string;
+     int *indexp, quoted, *quoted_dollar_atp, *contains_dollar_at;
+{
+  int check_nullness, var_is_set, var_is_null, var_is_special;
+  int want_substring, want_indir, want_patsub;
+  char *name, *value, *temp, *temp1;
+  int t_index, sindex, c, number;
+
+  sindex = *indexp;
+  t_index = ++sindex;
+  name = string_extract (string, &t_index, "#%:-=?+/}", 1);
+  value = (char *)NULL;
+  var_is_set = var_is_null = var_is_special = check_nullness = 0;
+  want_substring = want_indir = want_patsub = 0;
+
+  /* If the name really consists of a special variable, then
+     make sure that we have the entire name.  Handle indirect
+     references to special variables here, too. */
+  if ((sindex == t_index ||
+      ((sindex == t_index - 1) && string[sindex] == '!')) &&
+       (string[t_index] == '-' ||
+        string[t_index] == '?' ||
+        string[t_index] == '#'))
+    {
+      t_index++;
+      free (name);
+      temp1 = string_extract (string, &t_index, "#%:-=?+/}", 0);
+      name = xmalloc (3 + (strlen (temp1)));
+      *name = string[sindex];
+      if (string[sindex] == '!')
+       {
+         /* indirect ref. of special variable */
+         name[1] = string[sindex + 1];
+         strcpy (name + 2, temp1);
+       }
+      else
+       strcpy (name + 1, temp1);
+      free (temp1);
+    }
+  sindex = t_index;
+
+  /* Find out what character ended the variable name.  Then
+     do the appropriate thing. */
+  if (c = string[sindex])
+    sindex++;
+
+  /* If c is followed by one of the valid parameter expansion
+     characters, move past it as normal.  If not, assume that
+     a substring specification is being given, and do not move
+     past it. */
+  if (c == ':' && member (string[sindex], "-=?+"))
+    {
+      check_nullness++;
+      if (c = string[sindex])
+       sindex++;
+    }
+  else if (c == ':')
+    want_substring = 1;
+  else if (c == '/')
+    want_patsub = 1;
+
+  want_indir = *name == '!';
+
+  /* Determine the value of this variable. */
+
+  /* Check for special variables, directly and indirectly
+     referenced. */
+  if ((digit (*name) && all_digits (name)) ||
+      (name[1] == '\0' && member (*name, "#-?$!@*")) ||
+      (want_indir && name[2] == '\0' && member (name[1], "#-?$!@*")))
+    var_is_special++;
+
+  /* Check for special expansion things. */
+  if (*name == '#')    /* length of a parameter */
+    {
+      /* Take the lengths of some of the shell's special
+         parameters. */
+      if (string[sindex] == '}' && name[1] == '\0' &&
+         check_nullness == 0 && member (c, "-?$!#"))
+       {
+         free (name);
+         switch (c)
+           {
+           case '-':
+             temp1 = which_set_flags ();
+             break;
+           case '?':
+             temp1 = itos (last_command_exit_value);
+             break;
+           case '$':
+             temp1 = itos (dollar_dollar_pid);
+             break;
+           case '!':
+             if (last_asynchronous_pid == NO_PID)
+               temp1 = (char *)NULL;
+             else
+               temp1 = itos ((int)last_asynchronous_pid);
+             break;
+           case '#':
+             temp1 = itos (number_of_args ());
+             break;
+           }
+         number = STRLEN (temp1);
+         FREE (temp1);
+         *indexp = ++sindex;   /* { string[sindex] == '}' */
+         return (itos (number));
+       }
+
+      /* Don't allow things like ${#:-foo} to go by; they are
+         errors.  If we are not pointing at the character just
+         after the closing brace, then we haven't gotten all of
+         the name.  Since it begins with a special character,
+         this is a bad substitution.  Explicitly check for ${#:},
+         which the rules do not catch.  Also check NAME for
+         validity before trying to go on. */
+      if (string[sindex - 1] != '}' ||
+         member (c, "?-=+") ||
+         (name[1] == '\0' && c == '}' && check_nullness) ||
+         (valid_length_expression (name) == 0))
+       {
+         temp = (char *)NULL;
+         goto bad_substitution;
+       }
+
+      number = parameter_brace_expand_length (name);
+      free (name);
+
+      *indexp = sindex;
+      return (itos (number));
+    }
+
+  /* ${@} is identical to $@. */
+  if (name[0] == '@' && name[1] == '\0')
+    {
+      if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+       *quoted_dollar_atp = 1;
+
+      if (contains_dollar_at)
+       *contains_dollar_at = 1;
+    }
+
+  /* Make sure that NAME is valid before trying to go on. */
+  if (valid_brace_expansion_word (want_indir ? name + 1 : name,
+                                       var_is_special) == 0)
+    {
+      temp = (char *)NULL;
+      goto bad_substitution;
+    }
+
+  if (want_indir)
+    temp = parameter_brace_expand_indir (name + 1, var_is_special, quoted);
+  else
+    temp = parameter_brace_expand_word (name, var_is_special, quoted);
+
+#if defined (ARRAY_VARS)
+  if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && valid_array_reference (name))
+    {
+      temp1 = strchr (name, '[');
+      if (temp1 && temp1[1] == '@' && temp1[2] == ']')
+        {
+         if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && quoted_dollar_atp)
+           *quoted_dollar_atp = 1;
+         if (contains_dollar_at)
+           *contains_dollar_at = 1;
+       }
+    }
+#endif
+
+  var_is_set = temp != (char *)0;
+  var_is_null = check_nullness && (var_is_set == 0 || *temp == 0);
+
+  /* Get the rest of the stuff inside the braces. */
+  if (c && c != '}')
+    {
+      /* Extract the contents of the ${ ... } expansion
+         according to the Posix.2 rules. */
+      value = extract_dollar_brace_string (string, &sindex, quoted);
+      /*{*/
+      if (string[sindex] == '}')
+        sindex++;
+      else
+       goto bad_substitution;
+    }
+  else
+    value = (char *)NULL;
+
+  *indexp = sindex;
+  
+  /* If this is a substring spec, process it and add the result. */
+  if (want_substring)
+    {
+      temp1 = parameter_brace_substring (name, temp, value, quoted);
+      FREE (name);
+      FREE (value);
+      FREE (temp);
+      return (temp1);
+    }
+  else if (want_patsub)
+    {
+      temp1 = parameter_brace_patsub (name, temp, value, quoted);
+      FREE (name);
+      FREE (value);
+      FREE (temp);
+      return (temp1);
+    }          
+                   
+  /* Do the right thing based on which character ended the variable name. */
+  switch (c)
+    {
+    default:
+    case '\0':
+    bad_substitution:
+      report_error ("%s: bad substitution", string ? string : "??");
+      FREE (value);
+      FREE (temp);
+      free (name);
+      return &expand_param_error;
+
+    /*{*/
+    case '}':
+      if (var_is_set == 0 && unbound_vars_is_error)
+        {
+         report_error ("%s: unbound variable", name);
+         FREE (value);
+         FREE (temp);
+         free (name);
+         last_command_exit_value = 1;
+         return &expand_param_error;
+       }
+      break;
+
+    case '#':  /* ${param#[#]pattern} */
+    case '%':  /* ${param%[%]pattern} */
+      if (value == 0 || *value == '\0' || temp == 0 || *temp == '\0')
+        {
+          FREE (value);
+         break;
+        }
+      if ((name[0] == '@' || name[0] == '*') && name[1] == '\0')
+       temp1 = parameter_list_remove_pattern (value, name[0], c, quoted);
+#if defined (ARRAY_VARS)
+      else if (valid_array_reference (name))
+       temp1 = array_remove_pattern (value, name, c, quoted);
+#endif
+      else
+       temp1 = parameter_brace_remove_pattern (value, temp, c, quoted);
+      free (temp);
+      free (value);
+      temp = temp1;
+      break;
+
+    case '-':
+    case '=':
+    case '?':
+    case '+':
+      if (var_is_set && var_is_null == 0)
+        {
+         /* We don't want the value of the named variable for
+            anything, just the value of the right hand side. */
+         if (c == '+')
+           {
+             FREE (temp);
+             if (value)
+               {
+                 temp = parameter_brace_expand_rhs (name, value, c,
+                                                    quoted,
+                                                    quoted_dollar_atp,
+                                                    contains_dollar_at);
+                 if (temp && *temp == '\0' && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+                   quoted |= Q_QUOTEDNULL;
+                 free (value);
+               }
+             else
+               temp = (char *)NULL;
+           }
+         else
+           {
+             FREE (value);
+           }
+         /* Otherwise do nothing; just use the value in TEMP. */
+       }
+      else     /* VAR not set or VAR is NULL. */
+        {
+         FREE (temp);
+         temp = (char *)NULL;
+         if (c == '=' && var_is_special)
+           {
+             report_error ("$%s: cannot assign in this way", name);
+             free (name);
+             free (value);
+             return &expand_param_error;
+           }
+         else if (c == '?')
+           {
+             parameter_brace_expand_error (name, value);
+             return (interactive ? &expand_param_error : &expand_param_fatal);
+           }
+         else if (c != '+')
+           {
+             temp = parameter_brace_expand_rhs (name, value, c, quoted,
+                                              quoted_dollar_atp,
+                                              contains_dollar_at);
+             if (temp && *temp == '\0' && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+               quoted |= Q_QUOTEDNULL;
+           }
+         free (value);
+       }
+      break;
+    }
+  free (name);
+  return (temp);
+}
+
+/* Make a word list which is the parameter and variable expansion,
+   command substitution, arithmetic substitution, and quote removed
+   expansion of WORD.  Return a pointer to a WORD_LIST which is the
+   result of the expansion.  If WORD contains a null word, the word
+   list returned is also null.
+
+   QUOTED contains flag values defined in shell.h.
+
+   CONTAINS_DOLLAR_AT and EXPANDED_SOMETHING are return values; when non-null
+   they point to an integer value which receives information about expansion.
+   CONTAINS_DOLLAR_AT gets non-zero if WORD contained "$@", else zero.
+   EXPANDED_SOMETHING get non-zero if WORD contained any parameter expansions,
+   else zero.
+
+   This only does word splitting in the case of $@ expansion.  In that
+   case, we split on ' '. */
+
+/* Values for the local variable quoted_state. */
+#define UNQUOTED        0
+#define PARTIALLY_QUOTED 1
+#define WHOLLY_QUOTED    2
+
+static WORD_LIST *
+expand_word_internal (word, quoted, contains_dollar_at, expanded_something)
+     WORD_DESC *word;
+     int quoted;
+     int *contains_dollar_at;
+     int *expanded_something;
+{
+  WORD_LIST *list;
+  WORD_DESC *tword;
+  SHELL_VAR *var;
+
+  /* The intermediate string that we build while expanding. */
+  char *istring;
+
+  /* The current size of the above object. */
+  int istring_size;
+
+  /* Index into ISTRING. */
+  int istring_index;
+
+  /* Temporary string storage. */
+  char *temp, *temp1;
+
+  /* The text of WORD. */
+  register char *string;
+
+  /* The index into STRING. */
+  int sindex;
+
+  /* This gets 1 if we see a $@ while quoted. */
+  int quoted_dollar_at;
+
+  /* One of UNQUOTED, PARTIALLY_QUOTED, or WHOLLY_QUOTED, depending on
+     whether WORD contains no quoting characters, a partially quoted
+     string (e.g., "xx"ab), or is fully quoted (e.g., "xxab"). */
+  int quoted_state;
+
+  register int c;              /* Current character. */
+  int number;                  /* Temporary number value. */
+  int t_index;                 /* For calls to string_extract_xxx. */
+
+  istring = xmalloc (istring_size = DEFAULT_ARRAY_SIZE);
+  istring[istring_index = 0] = '\0';
+
+  quoted_dollar_at = 0;
+  quoted_state = UNQUOTED;
+
+  string = word->word;
+  if (string == 0)
+    goto finished_with_string;
+
+  if (contains_dollar_at)
+    *contains_dollar_at = 0;
+
+  /* Begin the expansion. */
+
+  for (sindex = 0; ;)
+    {
+      c = string[sindex];
+
+      /* Case on toplevel character. */
+      switch (c)
+       {
+       case '\0':
+         goto finished_with_string;
+
+       case CTLESC:
+         temp = xmalloc (3);
+         temp[0] = CTLESC;
+         temp[1] = c = string[++sindex];
+         temp[2] = '\0';
+
+         if (string[sindex])
+           sindex++;
+
+         goto add_string;
+
+#if defined (PROCESS_SUBSTITUTION)
+         /* Process substitution. */
+       case '<':
+       case '>':
+         {
+           if (string[++sindex] != '(' || (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || posixly_correct)
+             {
+               sindex--;
+               goto add_character;
+             }
+           else
+             t_index = sindex + 1; /* skip past both '<' and '(' */
+
+           temp1 = extract_process_subst (string, (c == '<') ? "<(" : ">(", &t_index);
+           sindex = t_index;
+
+           /* If the process substitution specification is `<()', we want to
+              open the pipe for writing in the child and produce output; if
+              it is `>()', we want to open the pipe for reading in the child
+              and consume input. */
+           temp = temp1 ? process_substitute (temp1, (c == '>')) : (char *)0;
+
+           FREE (temp1);
+
+           goto dollar_add_string;
+         }
+#endif /* PROCESS_SUBSTITUTION */
+
+       /* See about breaking this into a separate function:
+           char *
+           param_expand (string, sindex, quoted, expanded_something,
+                         contains_dollar_at, quoted_dollar_at)
+           char *string;
+           int *sindex, quoted, *expanded_something, *contains_dollar_at;
+           int *quoted_dollar_at;
+       */
+       case '$':
+
+         if (expanded_something)
+           *expanded_something = 1;
+
+         c = string[++sindex];
+
+         /* Do simple cases first. Switch on what follows '$'. */
+         switch (c)
+           {
+             /* $0 .. $9? */
+           case '0':
+           case '1':
+           case '2':
+           case '3':
+           case '4':
+           case '5':
+           case '6':
+           case '7':
+           case '8':
+           case '9':
+             temp1 = dollar_vars[digit_value (c)];
+             if (unbound_vars_is_error && temp1 == (char *)NULL)
+               {
+                 report_error ("$%c: unbound variable", c);
+                 free (string);
+                 free (istring);
+                 last_command_exit_value = 1;
+                 return (&expand_word_error);
+               }
+             temp = temp1 ? savestring (temp1) : (char *)NULL;
+             goto dollar_add_string;
+
+             /* $$ -- pid of the invoking shell. */
+           case '$':
+             number = dollar_dollar_pid;
+
+           add_number:
+             temp = itos (number);
+           dollar_add_string:
+             if (string[sindex]) sindex++;
+
+             /* Add TEMP to ISTRING. */
+           add_string:
+             if (temp)
+               {
+                 istring = sub_append_string
+                   (temp, istring, &istring_index, &istring_size);
+                 temp = (char *)0;
+               }
+             
+             break;
+
+             /* $# -- number of positional parameters. */
+           case '#':
+             number = number_of_args ();
+             goto add_number;
+
+             /* $? -- return value of the last synchronous command. */
+           case '?':
+             number = last_command_exit_value;
+             goto add_number;
+
+             /* $- -- flags supplied to the shell on invocation or
+                by `set'. */
+           case '-':
+             temp = which_set_flags ();
+             goto dollar_add_string;
+
+             /* $! -- Pid of the last asynchronous command. */
+           case '!':
+             number = (int)last_asynchronous_pid;
+
+             /* If no asynchronous pids have been created, expand
+                to nothing. */
+             if (number == (int)NO_PID)
+               {
+                 if (string[sindex])
+                   sindex++;
+                 if (expanded_something)
+                   *expanded_something = 0;
+                 break;
+               }
+             goto add_number;
+
+             /* The only difference between this and $@ is when the
+                arg is quoted. */
+           case '*':           /* `$*' */
+             temp = string_rest_of_args (quoted);
+
+             /* If there are no command-line arguments, this should just
+                disappear if there are other characters in the expansion,
+                even if it's quoted. */
+             if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && temp && *temp == '\0')
+               {
+                 free (temp);
+                 temp = (char *)NULL;
+               }
+             /* In the case of a quoted string, quote the entire arg-list.
+                "$1 $2 $3". */          
+             if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && temp)
+               {
+                 temp1 = temp;
+                 temp = quote_string (temp);
+                 free (temp1);
+               }
+             goto dollar_add_string;
+
+             /* When we have "$@" what we want is "$1" "$2" "$3" ... This
+                means that we have to turn quoting off after we split into
+                the individually quoted arguments so that the final split
+                on the first character of $IFS is still done.  */
+           case '@':           /* `$@' */
+             list = list_rest_of_args ();
+
+             /* We want to flag the fact that we saw this.  We can't turn
+                off quoting entirely, because other characters in the
+                string might need it (consider "\"$@\""), but we need some
+                way to signal that the final split on the first character
+                of $IFS should be done, even though QUOTED is 1. */
+             if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+               quoted_dollar_at = 1;
+             if (contains_dollar_at)
+               *contains_dollar_at = 1;
+             temp = string_list (((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && list) ? quote_list (list) : list);
+             dispose_words (list);
+             goto dollar_add_string;
+
+           /* $'...' ANSI-C expand text between quotes and add the result. */
+           case '\'':
+             t_index = sindex + 1;
+             temp1 = string_extract_single_quoted (string, &t_index);
+             sindex = t_index;
+             temp = ansicstr (temp1, (int *)NULL);
+             free (temp1);
+             if (temp)
+               {
+                 temp1 = temp;
+                 temp = quote_string (temp1);
+                 free (temp1);
+                 if (*temp == '\0' && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+                   quoted |= Q_QUOTEDNULL;
+               }
+             else
+               {
+                 temp = xmalloc (2);
+#if 0
+                 temp[0] = CTLNUL;
+                 temp[1] = '\0';
+#else
+                 temp[0] = '\0';
+#endif
+                 quoted |= Q_QUOTEDNULL;
+               }
+             goto add_string;
+
+           case '{':   /*}*/
+             temp = parameter_brace_expand (string, &sindex, quoted,
+                                            &quoted_dollar_at,
+                                            contains_dollar_at);
+             if (temp == &expand_param_error || temp == &expand_param_fatal)
+               {
+                 free (string);
+                 free (istring);
+                 return (temp == &expand_param_error) ? &expand_word_error
+                                                      : &expand_word_fatal;
+               }
+             if (temp && *temp == '\0' && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
+               quoted |= Q_QUOTEDNULL;
+             goto add_string;
+             /* break; */
+
+             /* Do command or arithmetic substitution. */
+           case '(':   /*)*/
+             /* We have to extract the contents of this paren substitution. */
+             t_index = sindex + 1;
+             temp = extract_command_subst (string, &t_index);
+             sindex = t_index;
+
+             /* For Posix.2-style `$(( ))' arithmetic substitution,
+                extract the expression and pass it to the evaluator. */
+             if (temp && *temp == '(')
+               {
+                 temp1 = temp + 1;
+                 t_index = strlen (temp1) - 1;
+
+                 if (temp1[t_index] != ')')
+                   {
+                     report_error ("%s: bad arithmetic substitution", temp);
+                     free (temp);
+                     free (string);
+                     free (istring);
+                     return &expand_word_error;
+                   }
+
+                 /* Cut off ending `)' */
+                 temp1[t_index] = '\0';
+
+                 /* Expand variables found inside the expression. */
+                 temp1 = maybe_expand_string (temp1, 1, expand_string);
+
+                 /* No error messages. */
+                 this_command_name = (char *)NULL;
+                 number = evalexp (temp1);
+                 free (temp);
+                 free (temp1);
+
+                 goto add_number;
+               }
+
+             temp1 = command_substitute (temp, quoted);
+             FREE (temp);
+             temp = temp1;
+             goto dollar_add_string;
+
+             /* Do straight arithmetic substitution. */
+           case '[':
+             /* We have to extract the contents of this
+                arithmetic substitution. */
+             t_index = sindex + 1;
+             temp = extract_arithmetic_subst (string, &t_index);
+             sindex = t_index;
+
+              /* Do initial variable expansion. */
+             temp1 = maybe_expand_string (temp, 1, expand_string);
+
+             /* No error messages. */
+             this_command_name = (char *)NULL;
+             number = evalexp (temp1);
+             free (temp1);
+             free (temp);
+
+             goto add_number;
+
+           default:
+             /* Find the variable in VARIABLE_LIST. */
+             temp = (char *)NULL;
+
+             for (t_index = sindex;
+                  (c = string[sindex]) && legal_variable_char (c);
+                  sindex++);
+             temp1 = substring (string, t_index, sindex);
+
+             /* If this isn't a variable name, then just output the `$'. */
+             if (temp1 == 0 || *temp1 == '\0')
+               {
+                 FREE (temp1);
+                 temp = xmalloc (2);
+                 temp[0] = '$';
+                 temp[1] = '\0';
+                 if (expanded_something)
+                   *expanded_something = 0;
+                 goto add_string;
+               }
+
+             /* If the variable exists, return its value cell. */
+             var = find_variable (temp1);
+
+             if (var && invisible_p (var) == 0 && value_cell (var))
+               {
+#if defined (ARRAY_VARS)
+                 if (array_p (var))
+                   {
+                     temp = array_reference (array_cell (var), 0);
+                     if (temp)
+                       temp = quote_escapes (temp);
+                   }
+                 else
+#endif
+                 temp = quote_escapes (value_cell (var));
+                 free (temp1);
+                 goto add_string;
+               }
+
+             temp = (char *)NULL;
+
+             if (unbound_vars_is_error)
+               report_error ("%s: unbound variable", temp1);
+             else
+               {
+                 free (temp1);
+                 goto add_string;
+               }
+
+             free (temp1);
+             free (string);
+             last_command_exit_value = 1;
+             free (istring);
+             return &expand_word_error;
+           }
+         break;                /* End case '$': */
+
+       case '`':               /* Backquoted command substitution. */
+         {
+           sindex++;
+
+           if (expanded_something)
+             *expanded_something = 1;
+
+           temp = string_extract (string, &sindex, "`", 0);
+           de_backslash (temp);
+           temp1 = command_substitute (temp, quoted);
+           FREE (temp);
+           temp = temp1;
+           goto dollar_add_string;
+         }
+
+       case '\\':
+         if (string[sindex + 1] == '\n')
+           {
+             sindex += 2;
+             continue;
+           }
+
+         c = string[++sindex];
+
+         if (quoted & Q_HERE_DOCUMENT)
+           temp1 = slashify_in_here_document;
+         else if (quoted & Q_DOUBLE_QUOTES)
+           temp1 = slashify_in_quotes;
+         else
+           temp1 = "";
+
+         if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) && member (c, temp1) == 0)
+           {
+             temp = xmalloc (3);
+             temp[0] = '\\'; temp[1] = c; temp[2] = '\0';
+           }
+         else
+           /* This character is quoted, so add it in quoted mode. */
+           temp = make_quoted_char (c);
+
+         if (c)
+           sindex++;
+         else
+           quoted |= Q_QUOTEDNULL;
+         goto add_string;
+
+       case '"':
+         if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT|Q_NOQUOTE))
+           goto add_character;
+
+         t_index = ++sindex;
+         temp = string_extract_double_quoted (string, &sindex, 0);
+
+         /* If the quotes surrounded the entire string, then the
+            whole word was quoted. */
+         quoted_state = (t_index == 1 && string[sindex] == '\0')
+                           ? WHOLLY_QUOTED
+                           : PARTIALLY_QUOTED;
+
+         if (temp && *temp)
+           {
+             int dollar_at_flag;
+
+             tword = make_word (temp);         /* XXX */
+             free (temp);
+             temp = (char *)NULL;
+
+             list = expand_word_internal (tword, Q_DOUBLE_QUOTES, &dollar_at_flag, (int *)NULL);
+
+             if (list == &expand_word_error || list == &expand_word_fatal)
+               {
+                 free (istring);
+                 free (string);
+                 /* expand_word_internal has already freed temp_word->word
+                    for us because of the way it prints error messages. */
+                 tword->word = (char *)NULL;
+                 dispose_word (tword);
+                 return list;
+               }
+
+             dispose_word (tword);
+
+             /* "$@" (a double-quoted dollar-at) expands into nothing,
+                not even a NULL word, when there are no positional
+                parameters. */
+             if (list == 0 && dollar_at_flag)
+               {
+                 quoted_dollar_at++;
+                 break;
+               }
+
+             /* If we get "$@", we know we have expanded something, so we
+                need to remember it for the final split on $IFS.  This is
+                a special case; it's the only case where a quoted string
+                can expand into more than one word.  It's going to come back
+                from the above call to expand_word_internal as a list with
+                a single word, in which all characters are quoted and
+                separated by blanks.  What we want to do is to turn it back
+                into a list for the next piece of code. */
+             if (list)
+               dequote_list (list);
+
+             if (dollar_at_flag)
+               {
+                 quoted_dollar_at++;
+                 if (expanded_something)
+                   *expanded_something = 1;
+               }
+           }
+         else
+           {
+             /* What we have is "".  This is a minor optimization. */
+             free (temp);
+             list = (WORD_LIST *)NULL;
+             quoted |= Q_QUOTEDNULL;
+           }
+
+         /* The code above *might* return a list (consider the case of "$@",
+            where it returns "$1", "$2", etc.).  We can't throw away the
+            rest of the list, and we have to make sure each word gets added
+            as quoted.  We test on tresult->next:  if it is non-NULL, we
+            quote the whole list, save it to a string with string_list, and
+            add that string. We don't need to quote the results of this
+            (and it would be wrong, since that would quote the separators
+            as well), so we go directly to add_string. */
+         if (list)
+           {
+             if (list->next)
+               {
+                 temp = string_list (quote_list (list));
+                 dispose_words (list);
+                 goto add_string;
+               }
+             else
+               {
+                 temp = savestring (list->word->word);
+                 dispose_words (list);
+               }
+           }
+         else
+           temp = (char *)NULL;
+
+         /* We do not want to add quoted nulls to strings that are only
+            partially quoted; we can throw them away. */
+         if (!temp && (quoted_state == PARTIALLY_QUOTED))
+           continue;
+
+       add_quoted_string:
+
+         if (temp)
+           {
+             temp1 = temp;
+             temp = quote_string (temp);
+             if (*temp1 == '\0')
+               quoted |= Q_QUOTEDNULL;
+             free (temp1);
+           }
+         else
+           {
+             /* Add NULL arg. */
+             temp = xmalloc (2);
+#if 0
+             temp[0] = CTLNUL;
+             temp[1] = '\0';
+#else
+             temp[0] = '\0';
+#endif
+             quoted |= Q_QUOTEDNULL;
+           }
+         goto add_string;
+         /* break; */
+
+       case '\'':
+         if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT|Q_NOQUOTE))
+           goto add_character;
+
+         t_index = ++sindex;
+         temp = string_extract_single_quoted (string, &sindex);
+
+         /* If the entire STRING was surrounded by single quotes,
+            then the string is wholly quoted. */
+         quoted_state = (t_index == 1 && string[sindex] == '\0')
+                           ? WHOLLY_QUOTED
+                           : PARTIALLY_QUOTED;
+
+         /* If all we had was '', it is a null expansion. */
+         if (*temp == '\0')
+           {
+             free (temp);
+             temp = (char *)NULL;
+             quoted |= Q_QUOTEDNULL;
+           }
+         else
+           remove_quoted_escapes (temp);
+
+         /* We do not want to add quoted nulls to strings that are only
+            partially quoted; such nulls are discarded. */
+         if (temp == 0 && (quoted_state == PARTIALLY_QUOTED))
+           continue;
+
+         goto add_quoted_string;
+         /* break; */
+
+       default:
+         /* This is the fix for " $@ " */
+         if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+           {
+             temp = make_quoted_char (c);
+             if (c == 0)
+               quoted |= Q_QUOTEDNULL;
+             goto dollar_add_string;
+           }
+
+       add_character:
+         if (istring_index + 1 >= istring_size)
+           {
+             while (istring_index + 1 >= istring_size)
+               istring_size += DEFAULT_ARRAY_SIZE;
+             istring = xrealloc (istring, istring_size);
+           }
+         istring[istring_index++] = c;
+         istring[istring_index] = '\0';
+
+         /* Next character. */
+         sindex++;
+       }
+    }
+
+finished_with_string:
+  /* OK, we're ready to return.  If we have a quoted string, and
+     quoted_dollar_at is not set, we do no splitting at all; otherwise
+     we split on ' '.  The routines that call this will handle what to
+     do if nothing has been expanded. */
+
+  /* Partially and wholly quoted strings which expand to the empty
+     string are retained as an empty arguments.  Unquoted strings
+     which expand to the empty string are discarded.  The single
+     exception is the case of expanding "$@" when there are no
+     positional parameters.  In that case, we discard the expansion. */
+
+  /* Because of how the code that handles "" and '' in partially
+     quoted strings works, we need to make ISTRING into a QUOTED_NULL
+     if we saw quoting characters, but the expansion was empty.
+     "" and '' are tossed away before we get to this point when
+     processing partially quoted strings.  This makes "" and $xxx""
+     equivalent when xxx is unset. */
+
+  /* If we expand to nothing and there were no single or double quotes
+     in the word, we throw it away.  Otherwise, we return a NULL word.
+     The single exception is for $@ surrounded by double quotes when
+     there are no positional parameters.  In that case, we also throw
+     the word away. */
+
+  if (*istring == '\0')
+    {
+      if (quoted_state == PARTIALLY_QUOTED && quoted_dollar_at == 0)
+       {
+#if 0
+         istring[0] = CTLNUL;
+         istring[1] = '\0';
+#else
+         istring[0] = '\0';
+#endif
+         tword = make_bare_word (istring);
+         list = make_word_list (tword, (WORD_LIST *)NULL);
+         if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_QUOTEDNULL))
+           tword->flags |= W_QUOTED;
+       }
+      /* According to sh, ksh, and Posix.2, if a word expands into nothing
+        and a double-quoted "$@" appears anywhere in it, then the entire
+        word is removed. */
+      else  if (quoted_state == UNQUOTED || quoted_dollar_at)
+       list = (WORD_LIST *)NULL;
+      else
+       {
+         tword = make_bare_word (istring);
+         list = make_word_list (tword, (WORD_LIST *)NULL);
+         if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES|Q_QUOTEDNULL))
+           tword->flags |= W_QUOTED;
+       }
+    }
+  else if (word->flags & W_ASSIGNMENT)
+    {
+      tword = make_bare_word (istring);
+      list = make_word_list (tword, (WORD_LIST *)NULL);
+      tword->flags |= W_ASSIGNMENT;    /* XXX */
+      if (quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES))
+        tword->flags |= W_QUOTED;
+    }
+  else
+    {
+      char *ifs_chars;
+
+      if (quoted_dollar_at)
+       {
+         var = find_variable ("IFS");
+         ifs_chars = var ? value_cell (var) : " \t\n";
+       }
+      else
+       ifs_chars = (char *)NULL;
+
+      /* According to Posix.2, "$@" expands to a single word if
+        IFS="" and the positional parameters are not empty. */
+      if (quoted_dollar_at && ifs_chars && *ifs_chars)
+       {
+         list = list_string (istring, " ", 1);
+       }
+      else
+       {
+         tword = make_bare_word (istring);
+         list = make_word_list (tword, (WORD_LIST *)NULL);
+         if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) || (quoted_state == WHOLLY_QUOTED))
+           tword->flags |= W_QUOTED;
+         if (word->flags & W_ASSIGNMENT)
+           tword->flags |= W_ASSIGNMENT;
+       }
+    }
+
+  free (istring);
+  return (list);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                Functions for Quote Removal                      */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Perform quote removal on STRING.  If QUOTED > 0, assume we are obeying the
+   backslash quoting rules for within double quotes. */
+char *
+string_quote_removal (string, quoted)
+     char *string;
+     int quoted;
+{
+  char *r, *result_string, *temp;
+  int sindex, tindex, c, dquote;
+
+  /* The result can be no longer than the original string. */
+  r = result_string = xmalloc (strlen (string) + 1);
+
+  for (dquote = sindex = 0; c = string[sindex];)
+    {
+      switch (c)
+       {
+       case '\\':
+         c = string[++sindex];
+         if (((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote) && member (c, slashify_in_quotes) == 0)
+           *r++ = '\\';
+         /* FALLTHROUGH */
+
+       default:
+         *r++ = c;
+         sindex++;
+         break;
+
+       case '\'':
+         if ((quoted & (Q_HERE_DOCUMENT|Q_DOUBLE_QUOTES)) || dquote)
+           {
+             *r++ = c;
+             sindex++;
+             break;
+           }
+         tindex = sindex + 1;
+         temp = string_extract_single_quoted (string, &tindex);
+         if (temp)
+           {
+             strcpy (r, temp);
+             r += strlen (r);
+             free (temp);
+           }
+         sindex = tindex;
+         break;
+
+       case '"':
+         dquote = 1 - dquote;
+         sindex++;
+         break;
+       }
+    }
+    *r = '\0';
+    return (result_string);
+}
+
+#if 0
+/* UNUSED */
+/* Perform quote removal on word WORD.  This allocates and returns a new
+   WORD_DESC *. */
+WORD_DESC *
+word_quote_removal (word, quoted)
+     WORD_DESC *word;
+     int quoted;
+{
+  WORD_DESC *w;
+  char *t;
+
+  t = string_quote_removal (word->word, quoted);
+  w = make_bare_word (t);
+  return (w);
+}
+
+/* Perform quote removal on all words in LIST.  If QUOTED is non-zero,
+   the members of the list are treated as if they are surrounded by
+   double quotes.  Return a new list, or NULL if LIST is NULL. */
+WORD_LIST *
+word_list_quote_removal (list, quoted)
+     WORD_LIST *list;
+     int quoted;
+{
+  WORD_LIST *result, *t, *tresult;
+
+  for (t = list, result = (WORD_LIST *)NULL; t; t = t->next)
+    {
+      tresult = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
+      tresult->word = word_quote_removal (t->word, quoted);
+      tresult->next = (WORD_LIST *)NULL;
+      result = (WORD_LIST *) list_append (result, tresult);
+    }
+  return (result);
+}
+#endif
+
+/* Return 1 if CHARACTER appears in an unquoted portion of
+   STRING.  Return 0 otherwise. */
+static int
+unquoted_member (character, string)
+     int character;
+     char *string;
+{
+  int sindex, c;
+
+  for (sindex = 0; c = string[sindex]; )
+    {
+      if (c == character)
+       return (1);
+
+      switch (c)
+       {
+       default:
+         sindex++;
+         break;
+
+       case '\\':
+         sindex++;
+         if (string[sindex])
+           sindex++;
+         break;
+
+       case '\'':
+         sindex = skip_single_quoted (string, ++sindex);
+         break;
+
+       case '"':
+         sindex = skip_double_quoted (string, ++sindex);
+         break;
+       }
+    }
+  return (0);
+}
+
+/* Return 1 if SUBSTR appears in an unquoted portion of STRING. */
+static int
+unquoted_substring (substr, string)
+     char *substr, *string;
+{
+  int sindex, c, sublen;
+
+  if (substr == 0 || *substr == '\0')
+    return (0);
+
+  sublen = strlen (substr);
+  for (sindex = 0; c = string[sindex]; )
+    {
+      if (STREQN (string + sindex, substr, sublen))
+       return (1);
+
+      switch (c)
+       {
+       case '\\':
+         sindex++;
+
+         if (string[sindex])
+           sindex++;
+         break;
+
+       case '\'':
+         sindex = skip_single_quoted (string, ++sindex);
+         break;
+
+       case '"':
+         sindex = skip_double_quoted (string, ++sindex);
+         break;
+
+       default:
+         sindex++;
+         break;
+       }
+    }
+  return (0);
+}
+
+/*******************************************
+ *                                        *
+ *    Functions to perform word splitting  *
+ *                                        *
+ *******************************************/
+
+/* This splits a single word into a WORD LIST on $IFS, but only if the word
+   is not quoted.  list_string () performs quote removal for us, even if we
+   don't do any splitting. */
+WORD_LIST *
+word_split (w)
+     WORD_DESC *w;
+{
+  WORD_LIST *result;
+  SHELL_VAR *ifs;
+  char *ifs_chars;
+  WORD_DESC *tw;
+
+  if (w)
+    {
+      ifs = find_variable ("IFS");
+      /* If IFS is unset, it defaults to " \t\n". */
+      ifs_chars = ifs ? value_cell (ifs) : " \t\n";
+
+      if ((w->flags & W_QUOTED) || !ifs_chars)
+       ifs_chars = "";
+
+      result = list_string (w->word, ifs_chars, w->flags & W_QUOTED);
+      /* If the word expands to nothing, but is quoted, make a null word. */
+      if (result == 0 && (w->flags & W_QUOTED))
+        {
+          tw = make_bare_word ("");
+          tw->flags |= W_QUOTED;
+          result = make_word_list (tw, (WORD_LIST *)NULL);
+        }
+    }
+  else
+    result = (WORD_LIST *)NULL;
+
+  return (result);
+}
+
+/* Perform word splitting on LIST and return the RESULT.  It is possible
+   to return (WORD_LIST *)NULL. */
+static WORD_LIST *
+word_list_split (list)
+     WORD_LIST *list;
+{
+  WORD_LIST *result, *t, *tresult;
+
+  for (t = list, result = (WORD_LIST *)NULL; t; t = t->next)
+    {
+      tresult = word_split (t->word);
+      result = (WORD_LIST *) list_append (result, tresult);
+    }
+  return (result);
+}
+
+/**************************************************
+ *                                               *
+ *     Functions to expand an entire WORD_LIST   *
+ *                                               *
+ **************************************************/
+
+static WORD_LIST *varlist = (WORD_LIST *)NULL;
+
+/* Separate out any initial variable assignments from TLIST.  If set -k has
+   been executed, remove all assignment statements from TLIST.  Initial
+   variable assignments and other environment assignments are placed
+   on VARLIST. */
+static WORD_LIST *
+separate_out_assignments (tlist)
+     WORD_LIST *tlist;
+{
+  register WORD_LIST *vp, *lp;
+
+  if (!tlist)
+    return ((WORD_LIST *)NULL);
+
+  varlist = (WORD_LIST *)NULL;
+  vp = lp = tlist;
+
+  /* Separate out variable assignments at the start of the command.
+     Loop invariant: vp->next == lp
+     Loop postcondition:
+       lp = list of words left after assignment statements skipped
+       tlist = original list of words
+  */
+  while (lp && (lp->word->flags & W_ASSIGNMENT))
+    {
+      vp = lp;
+      lp = lp->next;
+    }
+
+  /* If lp != tlist, we have some initial assignment statements. */
+  /* We make VARLIST point to the list of assignment words and
+     TLIST point to the remaining words.  */
+  if (lp != tlist)
+    {
+      varlist = tlist;
+      /* ASSERT(vp->next == lp); */
+      vp->next = (WORD_LIST *)NULL;    /* terminate variable list */
+      tlist = lp;                      /* remainder of word list */
+    }
+
+  /* vp == end of variable list */
+  /* tlist == remainder of original word list without variable assignments */
+  if (!tlist)
+    /* All the words in tlist were assignment statements */
+    return ((WORD_LIST *)NULL);
+
+  /* ASSERT(tlist != NULL); */
+  /* ASSERT((tlist->word->flags & W_ASSIGNMENT) == 0); */
+
+  /* If the -k option is in effect, we need to go through the remaining
+     words, separate out the assignment words, and place them on VARLIST. */
+  if (place_keywords_in_env)
+    {
+      WORD_LIST *tp;   /* tp == running pointer into tlist */
+
+      tp = tlist;
+      lp = tlist->next;
+
+      /* Loop Invariant: tp->next == lp */
+      /* Loop postcondition: tlist == word list without assignment statements */
+      while (lp)
+       {
+         if (lp->word->flags & W_ASSIGNMENT)
+           {
+             /* Found an assignment statement, add this word to end of
+                varlist (vp). */
+             if (!varlist)
+               varlist = vp = lp;
+             else
+               {
+                 vp->next = lp;
+                 vp = lp;
+               }
+
+             /* Remove the word pointed to by LP from TLIST. */
+             tp->next = lp->next;
+             /* ASSERT(vp == lp); */
+             lp->next = (WORD_LIST *)NULL;
+             lp = tp->next;
+           }
+         else
+           {
+             tp = lp;
+             lp = lp->next;
+           }
+       }
+    }
+  return (tlist);
+}
+
+/* Take the list of words in LIST and do the various substitutions.  Return
+   a new list of words which is the expanded list, and without things like
+   variable assignments. */
+
+WORD_LIST *
+expand_words (list)
+     WORD_LIST *list;
+{
+  return (expand_word_list_internal (list, 1));
+}
+
+/* Same as expand_words (), but doesn't hack variable or environment
+   variables. */
+WORD_LIST *
+expand_words_no_vars (list)
+     WORD_LIST *list;
+{
+  return (expand_word_list_internal (list, 0));
+}
+
+/* The workhorse for expand_words () and expand_words_no_vars ().
+   First arg is LIST, a WORD_LIST of words.
+   Second arg DO_VARS is non-zero if you want to do environment and
+   variable assignments, else zero.
+
+   This does all of the substitutions: brace expansion, tilde expansion,
+   parameter expansion, command substitution, arithmetic expansion,
+   process substitution, word splitting, and pathname expansion.  Words
+   with the W_QUOTED or W_ASSIGNMENT bits set, or for which no expansion
+   is done, do not undergo word splitting.  Words with the W_ASSIGNMENT
+   bit set do not undergo pathname expansion. */
+static WORD_LIST *
+expand_word_list_internal (list, do_vars)
+     WORD_LIST *list;
+     int do_vars;
+{
+  WORD_LIST *tlist, *new_list, *next, *temp_list, *orig_list, *disposables;
+  char *temp_string;
+
+  if (list == 0)
+    return ((WORD_LIST *)NULL);
+
+  tlist = copy_word_list (list);
+
+  if (do_vars)
+    {
+      tlist = separate_out_assignments (tlist);
+      if (tlist == 0)
+       {
+         if (varlist)
+           {
+             /* All the words were variable assignments, so they are placed
+                into the shell's environment. */
+             for (new_list = varlist; new_list; new_list = new_list->next)
+               do_assignment (new_list->word->word);
+             dispose_words (varlist);
+             varlist = (WORD_LIST *)NULL;
+           }
+         return ((WORD_LIST *)NULL);
+       }
+    }
+
+  /* Begin expanding the words that remain.  The expansions take place on
+     things that aren't really variable assignments. */
+
+#if defined (BRACE_EXPANSION)
+  /* Do brace expansion on this word if there are any brace characters
+     in the string. */
+  if (brace_expansion && tlist)
+    {
+      register char **expansions;
+      WORD_LIST *braces;
+      int eindex;
+
+      for (braces = disposables = (WORD_LIST *)NULL; tlist; tlist = next)
+       {
+         next = tlist->next;
+
+         /* Only do brace expansion if the word has a brace character.  If
+            not, just add the word list element to BRACES and continue.  In
+            the common case, at least when running shell scripts, this will
+            degenerate to a bunch of calls to `strchr', and then what is
+            basically a reversal of TLIST into BRACES, which is corrected
+            by a call to reverse_list () on BRACES when the end of TLIST
+            is reached. */
+         if (strchr (tlist->word->word, '{'))
+           {
+             expansions = brace_expand (tlist->word->word);
+
+             for (eindex = 0; temp_string = expansions[eindex]; eindex++)
+               {
+                 braces = make_word_list (make_word (temp_string), braces);
+                 free (expansions[eindex]);
+               }
+             free (expansions);
+
+             /* Add TLIST to the list of words to be freed after brace
+                expansion has been performed. */
+             tlist->next = disposables;
+             disposables = tlist;
+           }
+         else
+           {
+             tlist->next = braces;
+             braces = tlist;
+           }
+       }
+
+      dispose_words (disposables);
+      tlist = REVERSE_LIST (braces, WORD_LIST *);
+    }
+#endif /* BRACE_EXPANSION */
+
+  /* We do tilde expansion all the time.  This is what 1003.2 says. */
+  for (orig_list = tlist, new_list = (WORD_LIST *)NULL; tlist; tlist = next)
+    {
+      WORD_LIST *expanded;
+      int expanded_something, has_dollar_at;
+
+      temp_string = tlist->word->word;
+
+      next = tlist->next;
+
+      /* Posix.2 section 3.6.1 says that tildes following `=' in words
+        which are not assignment statements are not expanded.  We do
+        this only if POSIXLY_CORRECT is enabled. */
+      if (temp_string[0] == '~' ||
+         (posixly_correct == 0 && strchr (temp_string, '~') &&
+          unquoted_substring ("=~", temp_string)))
+       {
+         tlist->word->word = bash_tilde_expand (temp_string);
+         free (temp_string);
+       }
+
+      expanded_something = 0;
+      expanded = expand_word_internal
+       (tlist->word, 0, &has_dollar_at, &expanded_something);
+
+      if (expanded == &expand_word_error || expanded == &expand_word_fatal)
+       {
+         /* By convention, each time this error is returned,
+            tlist->word->word has already been freed. */
+         tlist->word->word = (char *)NULL;
+         
+         /* Dispose our copy of the original list. */
+         dispose_words (orig_list);
+         /* Dispose the  new list we're building. */
+         dispose_words (new_list);
+
+         if (expanded == &expand_word_error)
+           jump_to_top_level (DISCARD);
+         else
+           jump_to_top_level (FORCE_EOF);
+       }
+
+      /* Don't split assignment words, even when they do not precede a
+        command name. */
+      if (expanded_something && (tlist->word->flags & W_ASSIGNMENT) == 0)
+       {
+         temp_list = word_list_split (expanded);
+         dispose_words (expanded);
+       }
+      else
+       {
+         /* If no parameter expansion, command substitution, process
+            substitution, or arithmetic substitution took place, then
+            do not do word splitting.  We still have to remove quoted
+            null characters from the result. */
+#if 0
+         word_list_remove_quoted_nulls (expanded);
+#endif
+         temp_list = expanded;
+       }
+
+      /* In the most common cases, t will be a list containing only one
+        element, so the call to reverse_list would be wasted. */
+      expanded = REVERSE_LIST (temp_list, WORD_LIST *);
+      new_list = (WORD_LIST *)list_append (expanded, new_list);
+    }
+
+  new_list = REVERSE_LIST (new_list, WORD_LIST *);
+
+  dispose_words (orig_list);
+
+  /* Okay, we're almost done.  Now let's just do some filename
+     globbing. */
+  if (new_list)
+    {
+      char **glob_array;
+      register int glob_index;
+      WORD_LIST *glob_list;
+      WORD_DESC *tword;
+
+      orig_list = disposables = (WORD_LIST *)NULL;
+      tlist = new_list;
+
+      /* orig_list == output list, despite the name. */
+      if (!disallow_filename_globbing)
+       {
+         glob_array = (char **)NULL;
+         while (tlist)
+           {
+             /* For each word, either globbing is attempted or the word is
+                added to orig_list.  If globbing succeeds, the results are
+                added to orig_list and the word (tlist) is added to the list
+                of disposable words.  If globbing fails and failed glob
+                expansions are left unchanged (the shell default), the
+                original word is added to orig_list.  If globbing fails and
+                failed glob expansions are removed, the original word is
+                added to the list of disposable words.  orig_list ends up
+                in reverse order and requires a call to reverse_list to
+                be set right.  After all words are examined, the disposable
+                words are freed. */
+             next = tlist->next;
+
+             /* If the word isn't quoted and there is an unquoted pattern
+                matching character in the word, then glob it. */
+             if ((tlist->word->flags & (W_QUOTED|W_ASSIGNMENT)) == 0 &&
+                 unquoted_glob_pattern_p (tlist->word->word))
+               {
+                 glob_array = shell_glob_filename (tlist->word->word);
+
+                 /* Handle error cases.
+                    I don't think we should report errors like "No such file
+                    or directory".  However, I would like to report errors
+                    like "Read failed". */
+
+                 if (GLOB_FAILED (glob_array))
+                   {
+                     glob_array = (char **) xmalloc (sizeof (char *));
+                     glob_array[0] = (char *)NULL;
+                   }
+
+                 /* Dequote the current word in case we have to use it. */
+                 if (glob_array[0] == NULL)
+                   {
+                     temp_string = dequote_string (tlist->word->word);
+                     free (tlist->word->word);
+                     tlist->word->word = temp_string;
+                   }
+
+                 /* Make the array into a word list. */
+                 glob_list = (WORD_LIST *)NULL;
+                 for (glob_index = 0; glob_array[glob_index]; glob_index++)
+                   {
+                     tword = make_bare_word (glob_array[glob_index]);
+                     glob_list = make_word_list (tword, glob_list);
+                   }
+
+                 if (glob_list)
+                   {
+                     orig_list = (WORD_LIST *)list_append (glob_list, orig_list);
+                     tlist->next = disposables;
+                     disposables = tlist;
+                   }
+                 else if (allow_null_glob_expansion == 0)
+                   {
+                     /* Failed glob expressions are left unchanged. */
+                     tlist->next = orig_list;
+                     orig_list = tlist;
+                   }
+                 else
+                   {
+                     /* Failed glob expressions are removed. */
+                     tlist->next = disposables;
+                     disposables = tlist;
+                   }
+               }
+             else
+               {
+                 /* Dequote the string. */
+                 temp_string = dequote_string (tlist->word->word);
+                 free (tlist->word->word);
+                 tlist->word->word = temp_string;
+                 tlist->next = orig_list;
+                 orig_list = tlist;
+               }
+
+             free_array (glob_array);
+             glob_array = (char **)NULL;
+
+             tlist = next;
+           }
+
+         if (disposables)
+           dispose_words (disposables);
+
+         new_list = REVERSE_LIST (orig_list, WORD_LIST *);
+       }
+      else
+       {
+         /* Dequote the words, because we're not performing globbing. */
+         for (temp_list = new_list; temp_list; temp_list = temp_list->next)
+           {
+             temp_string = dequote_string (temp_list->word->word);
+             free (temp_list->word->word);
+             temp_list->word->word = temp_string;
+           }
+       }
+    }
+
+  if (do_vars)
+    {
+      Function *assign_func;
+
+      /* If the remainder of the words expand to nothing, Posix.2 requires
+        that the variable and environment assignments affect the shell's
+        environment. */
+      assign_func = new_list ? assign_in_env : do_assignment;
+
+      for (temp_list = varlist; temp_list; temp_list = temp_list->next)
+       (*assign_func) (temp_list->word->word);
+
+      dispose_words (varlist);
+      varlist = (WORD_LIST *)NULL;
+    }
+
+  return (new_list);
+}
+
+/*************************************************
+ *                                              *
+ *     Functions to manage special variables    *
+ *                                              *
+ *************************************************/
+
+/* An alist of name.function for each special variable.  Most of the
+   functions don't do much, and in fact, this would be faster with a
+   switch statement, but by the end of this file, I am sick of switch
+   statements. */
+
+#define SET_INT_VAR(name, intvar)  intvar = find_variable (name) != 0
+
+struct name_and_function {
+  char *name;
+  VFunction *function;
+} special_vars[] = {
+  { "PATH", sv_path },
+  { "MAIL", sv_mail },
+  { "MAILPATH", sv_mail },
+  { "MAILCHECK", sv_mail },
+
+  { "POSIXLY_CORRECT", sv_strict_posix },
+  { "GLOBIGNORE", sv_globignore },
+
+  /* Variables which only do something special when READLINE is defined. */
+#if defined (READLINE)
+  { "TERM", sv_terminal },
+  { "TERMCAP", sv_terminal },
+  { "TERMINFO", sv_terminal },
+  { "HOSTFILE", sv_hostfile },
+#endif /* READLINE */
+
+  /* Variables which only do something special when HISTORY is defined. */
+#if defined (HISTORY)
+  { "HISTIGNORE", sv_histignore },
+  { "HISTSIZE", sv_histsize },
+  { "HISTFILESIZE", sv_histsize },
+  { "HISTCONTROL", sv_history_control },
+#  if defined (BANG_HISTORY)
+  { "histchars", sv_histchars },
+#  endif /* BANG_HISTORY */
+#endif /* HISTORY */
+
+  { "IGNOREEOF", sv_ignoreeof },
+  { "ignoreeof", sv_ignoreeof },
+
+  { "OPTIND", sv_optind },
+  { "OPTERR", sv_opterr },
+
+  { (char *)0, (VFunction *)0 }
+};
+
+/* The variable in NAME has just had its state changed.  Check to see if it
+   is one of the special ones where something special happens. */
+void
+stupidly_hack_special_variables (name)
+     char *name;
+{
+  int i;
+
+  for (i = 0; special_vars[i].name; i++)
+    {
+      if (STREQ (special_vars[i].name, name))
+       {
+         (*(special_vars[i].function)) (name);
+         return;
+       }
+    }
+}
+
+/* What to do just after the PATH variable has changed. */
+void
+sv_path (name)
+     char *name;
+{
+  /* hash -r */
+  flush_hashed_filenames ();
+}
+
+/* What to do just after one of the MAILxxxx variables has changed.  NAME
+   is the name of the variable.  This is called with NAME set to one of
+   MAIL, MAILCHECK, or MAILPATH.  */
+void
+sv_mail (name)
+     char *name;
+{
+  /* If the time interval for checking the files has changed, then
+     reset the mail timer.  Otherwise, one of the pathname vars
+     to the users mailbox has changed, so rebuild the array of
+     filenames. */
+  if (name[4] == 'C')  /* if (strcmp (name, "MAILCHECK") == 0) */
+    reset_mail_timer ();
+  else
+    {
+      free_mail_files ();
+      remember_mail_dates ();
+    }
+}
+
+/* What to do when GLOBIGNORE changes. */
+void
+sv_globignore (name)
+     char *name;
+{
+  setup_glob_ignore (name);
+}
+
+#if defined (READLINE)
+/* What to do just after one of the TERMxxx variables has changed.
+   If we are an interactive shell, then try to reset the terminal
+   information in readline. */
+void
+sv_terminal (name)
+     char *name;
+{
+  if (interactive_shell && no_line_editing == 0)
+    rl_reset_terminal (get_string_value ("TERM"));
+}
+
+void
+sv_hostfile (name)
+     char *name;
+{
+  hostname_list_initialized = 0;
+}
+#endif /* READLINE */
+
+#if defined (HISTORY)
+/* What to do after the HISTSIZE or HISTFILESIZE variables change.
+   If there is a value for this HISTSIZE (and it is numeric), then stifle
+   the history.  Otherwise, if there is NO value for this variable,
+   unstifle the history.  If name is HISTFILESIZE, and its value is
+   numeric, truncate the history file to hold no more than that many
+   lines. */   
+void
+sv_histsize (name)
+     char *name;
+{
+  char *temp;
+  long num;
+
+  temp = get_string_value (name);
+
+  if (temp && *temp)
+    {
+      if (legal_number (temp, &num))
+        {
+         if (name[4] == 'S')
+           {
+             stifle_history (num);
+             num = where_history ();
+             if (history_lines_this_session > num)
+               history_lines_this_session = num;
+           }
+         else
+           {
+             history_truncate_file (get_string_value ("HISTFILE"), (int)num);
+             if (num <= history_lines_in_file)
+               history_lines_in_file = num;
+           }
+       }
+    }
+  else if (name[4] == 'S')
+    unstifle_history ();
+}
+
+/* What to do after the HISTIGNORE variable changes. */
+void
+sv_histignore (name)
+     char *name;
+{
+  setup_history_ignore (name);
+}
+
+/* What to do after the HISTCONTROL variable changes. */
+void
+sv_history_control (name)
+     char *name;
+{
+  char *temp;
+
+  history_control = 0;
+  temp = get_string_value (name);
+
+  if (temp && *temp && STREQN (temp, "ignore", 6))
+    {
+      if (temp[6] == 's')      /* ignorespace */
+       history_control = 1;
+      else if (temp[6] == 'd') /* ignoredups */
+       history_control = 2;
+      else if (temp[6] == 'b') /* ignoreboth */
+       history_control = 3;
+    }
+}
+
+#if defined (BANG_HISTORY)
+/* Setting/unsetting of the history expansion character. */
+void
+sv_histchars (name)
+     char *name;
+{
+  char *temp;
+
+  temp = get_string_value (name);
+  if (temp)
+    {
+      history_expansion_char = *temp;
+      if (temp[0] && temp[1])
+       {
+         history_subst_char = temp[1];
+         if (temp[2])
+             history_comment_char = temp[2];
+       }
+    }
+  else
+    {
+      history_expansion_char = '!';
+      history_subst_char = '^';
+      history_comment_char = '#';
+    }
+}
+#endif /* BANG_HISTORY */
+#endif /* HISTORY */
+
+/* If the variable exists, then the value of it can be the number
+   of times we actually ignore the EOF.  The default is small,
+   (smaller than csh, anyway). */
+void
+sv_ignoreeof (name)
+     char *name;
+{
+  SHELL_VAR *tmp_var;
+  char *temp;
+
+  eof_encountered = 0;
+
+  tmp_var = find_variable (name);
+  ignoreeof = tmp_var != 0;
+  temp = tmp_var ? value_cell (tmp_var) : (char *)NULL;
+  if (temp)
+    eof_encountered_limit = (*temp && all_digits (temp)) ? atoi (temp) : 10;
+}
+
+void
+sv_optind (name)
+     char *name;
+{
+  char *tt;
+  int s;
+
+  tt = get_string_value ("OPTIND");
+  if (tt && *tt)
+    {
+      s = atoi (tt);
+
+      /* According to POSIX, setting OPTIND=1 resets the internal state
+        of getopt (). */
+      if (s < 0 || s == 1)
+       s = 0;
+    }
+  else
+    s = 0;
+  getopts_reset (s);
+}
+
+void
+sv_opterr (name)
+     char *name;
+{
+  char *tt;
+
+  tt = get_string_value ("OPTERR");
+  sh_opterr = (tt && *tt) ? atoi (tt) : 1;
+}
+
+void
+sv_strict_posix (name)
+     char *name;
+{
+  SET_INT_VAR (name, posixly_correct);
+  posix_initialize (posixly_correct);
+#if defined (READLINE)
+  posix_readline_initialize (posixly_correct);
+#endif /* READLINE */
+}
diff --git a/CWRU/posix-parser/Makefile b/CWRU/posix-parser/Makefile
new file mode 100644 (file)
index 0000000..74f45ae
--- /dev/null
@@ -0,0 +1,14 @@
+SRCS=  main.c parse.y make.c copy.c aux.c 
+OBJS=  main.o parse.o make.o copy.o aux.o
+
+PROG=  parse
+
+AUX=   ../../../sun4/error.o
+
+CFLAGS=        -g -I. -I../.. -I. -DTEST -Dalloca=__builtin_alloca
+LDFLAGS= -g
+
+$(PROG):       $(OBJS)
+       $(CC) $(LDFLAGS) -o $@ $(OBJS) $(AUX) $(LIBS)
+
+parse.o: parse.y
diff --git a/CWRU/posix-parser/aux.c b/CWRU/posix-parser/aux.c
new file mode 100644 (file)
index 0000000..bd8c8c9
--- /dev/null
@@ -0,0 +1,231 @@
+#include <stdio.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include "filecntl.h"
+
+#include "shell.h"
+#include <strings.h>
+char *
+xmalloc (size)
+     int size;
+{
+  register char *temp = (char *)malloc (size);
+
+  if (!temp)
+    fatal_error ("Out of virtual memory!");
+
+  return (temp);
+}
+
+char *
+xrealloc (pointer, size)
+     register char *pointer;
+     int size;
+{
+  char *temp;
+
+  if (!pointer)
+    temp = (char *)xmalloc (size);
+  else
+    temp = (char *)realloc (pointer, size);
+
+  if (!temp)
+    fatal_error ("Out of virtual memory!");
+
+  return (temp);
+}
+/* Reverse the chain of structures in LIST.  Output the new head
+   of the chain.  You should always assign the output value of this
+   function to something, or you will lose the chain. */
+GENERIC_LIST *
+reverse_list (list)
+     register GENERIC_LIST *list;
+{
+  register GENERIC_LIST *next, *prev = (GENERIC_LIST *)NULL;
+
+  while (list) {
+    next = list->next;
+    list->next = prev;
+    prev = list;
+    list = next;
+  }
+  return (prev);
+}
+
+/* Return the number of elements in LIST, a generic list. */
+int
+list_length (list)
+     register GENERIC_LIST *list;
+{
+  register int i;
+
+  for (i = 0; list; list = list->next, i++);
+  return (i);
+}
+
+/* Delete the element of LIST which satisfies the predicate function COMPARER.
+   Returns the element that was deleted, so you can dispose of it, or -1 if
+   the element wasn't found.  COMPARER is called with the list element and
+   then ARG.  Note that LIST contains the address of a variable which points
+   to the list.  You might call this function like this:
+
+   SHELL_VAR *elt = delete_element (&variable_list, check_var_has_name, "foo");
+   dispose_variable (elt);
+*/
+GENERIC_LIST *
+delete_element (list, comparer, arg)
+     GENERIC_LIST **list;
+     Function *comparer;
+{
+  register GENERIC_LIST *prev = (GENERIC_LIST *)NULL;
+  register GENERIC_LIST *temp = *list;
+
+  while (temp) {
+    if ((*comparer) (temp, arg)) {
+      if (prev) prev->next = temp->next;
+      else *list = temp->next;
+      return (temp);
+    }
+    prev = temp;
+    temp = temp->next;
+  }
+  return ((GENERIC_LIST *)-1);
+}
+
+/* Find NAME in ARRAY.  Return the index of NAME, or -1 if not present.
+   ARRAY shoudl be NULL terminated. */
+int
+find_name_in_list (name, array)
+     char *name, *array[];
+{
+  int i;
+
+  for (i=0; array[i]; i++)
+    if (strcmp (name, array[i]) == 0)
+      return (i);
+
+  return (-1);
+}
+
+/* Return the length of ARRAY, a NULL terminated array of char *. */
+int
+array_len (array)
+     register char **array;
+{
+  register int i;
+  for (i=0; array[i]; i++);
+  return (i);
+}
+
+/* Free the contents of ARRAY, a NULL terminated array of char *. */
+void
+free_array (array)
+     register char **array;
+{
+  register int i = 0;
+
+  if (!array) return;
+
+  while (array[i])
+    free (array[i++]);
+  free (array);
+}
+
+/* Allocate and return a new copy of ARRAY and its contents. */
+char **
+copy_array (array)
+  register char **array;
+{
+  register int i;
+  int len;
+  char **new_array;
+
+  len = array_len (array);
+  new_array = (char **)xmalloc ((len + 1) * sizeof (char *));
+  for (i = 0; array[i]; i++)
+    new_array[i] = savestring (array[i]);  
+  new_array[i] = (char *)NULL;
+  return (new_array);
+}
+
+/* Append LIST2 to LIST1.  Return the header of the list. */
+GENERIC_LIST *
+list_append (head, tail)
+     GENERIC_LIST *head, *tail;
+{
+  register GENERIC_LIST *t_head = head;
+
+  if (!t_head)
+    return (tail);
+
+  while (t_head->next) t_head = t_head->next;
+  t_head->next = tail;
+  return (head);
+}
+
+#include <stdio.h>
+
+#ifndef NULL
+#define NULL 0x0
+#endif
+
+#if defined (ibm032)
+/*
+ * Most vanilla 4.3 (not 4.3-tahoe) sites lack vfprintf.
+ * Here is the one from 4.3-tahoe (it is freely redistributable).
+ *
+ * Beware!  Don't trust the value returned by either of these functions; it
+ * seems that pre-4.3-tahoe implementations of _doprnt () return the first
+ * argument, i.e. a char *.  Besides, _doprnt () is incorrectly documented
+ * in the 4.3 BSD manuals, anyway (it's wrong in SunOS 3.5 also, but they
+ * have the v*printf functions (incorrectly documented (vprintf), but they
+ * are present)).
+ */
+#include <varargs.h>
+
+int
+vfprintf (iop, fmt, ap)
+     FILE *iop;
+     char *fmt;
+     va_list ap;
+{
+  int len;
+  char localbuf[BUFSIZ];
+
+  if (iop->_flag & _IONBF)
+    {
+      iop->_flag &= ~_IONBF;
+      iop->_ptr = iop->_base = localbuf;
+      len = _doprnt (fmt, ap, iop);
+      (void) fflush (iop);
+      iop->_flag |= _IONBF;
+      iop->_base = NULL;
+      iop->_bufsiz = 0;
+      iop->_cnt = 0;
+    }
+  else
+    len = _doprnt (fmt, ap, iop);
+  return (ferror (iop) ? EOF : len);
+}
+
+/*
+ * Ditto for vsprintf
+ */
+int
+vsprintf (str, fmt, ap)
+     char *str, *fmt;
+     va_list ap;
+{
+  FILE f;
+  int len;
+
+  f._flag = _IOWRT+_IOSTRG;
+  f._ptr = str;
+  f._cnt = 32767;
+  len = _doprnt (fmt, ap, &f);
+  *f._ptr = 0;
+  return (len);
+}
+
+#endif /* ibm032 */
diff --git a/CWRU/posix-parser/command.h b/CWRU/posix-parser/command.h
new file mode 100644 (file)
index 0000000..a7586a7
--- /dev/null
@@ -0,0 +1,179 @@
+/* command.h -- The structures used internally to represent commands, and
+   the extern declarations of the functions used to create them. */
+
+#if !defined (_COMMAND_H)
+#define _COMMAND_H
+
+/* Instructions describing what kind of thing to do for a redirection. */
+enum r_instruction {
+  r_output_direction, r_input_direction, r_inputa_direction,
+  r_appending_to, r_reading_until, r_duplicating_input,
+  r_duplicating_output, r_deblank_reading_until, r_close_this,
+  r_err_and_out, r_input_output, r_output_force,
+  r_duplicating_input_word, r_duplicating_output_word
+};
+
+/* Command Types: */
+enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple,
+                   cm_connection, cm_function_def, cm_until, cm_group };
+
+/* A structure which represents a word. */
+typedef struct word_desc {
+  char *word;          /* Zero terminated string. */
+  int dollar_present;  /* Non-zero means dollar sign present. */
+  int quoted;          /* Non-zero means single, double, or back quote
+                          or backslash is present. */
+  int assignment;      /* Non-zero means that this word contains an
+                          assignment. */
+} WORD_DESC;
+
+/* A linked list of words. */
+typedef struct word_list {
+  struct word_list *next;
+  WORD_DESC *word;
+} WORD_LIST;
+
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     Shell Command Structs                       */
+/*                                                                 */
+/* **************************************************************** */
+
+/* What a redirection descriptor looks like.  If FLAGS is IS_DESCRIPTOR,
+   then we use REDIRECTEE.DEST, else we use the file specified. */
+typedef struct redirect {
+  struct redirect *next;       /* Next element, or NULL. */
+  int redirector;              /* Descriptor to be redirected. */
+  int flags;                   /* Flag value for `open'. */
+  enum r_instruction  instruction; /* What to do with the information. */
+  union {
+    int dest;                  /* Place to redirect REDIRECTOR to, or ... */
+    WORD_DESC *filename;       /* filename to redirect to. */
+  } redirectee;
+  char *here_doc_eof;          /* The word that appeared in <<foo. */
+} REDIRECT;
+
+/* An element used in parsing.  A single word or a single redirection.
+   This is an ephemeral construct. */
+typedef struct element {
+  WORD_DESC *word;
+  REDIRECT *redirect;
+  struct element *next;
+} ELEMENT;
+
+/* Possible values for command->flags. */
+#define CMD_WANT_SUBSHELL  0x01        /* User wants a subshell: ( command ) */
+#define CMD_FORCE_SUBSHELL 0x02        /* Shell needs to force a subshell. */
+#define CMD_INVERT_RETURN  0x04        /* Invert the exit value. */
+#define CMD_IGNORE_RETURN  0x08        /* Ignore the exit value.  For set -e. */
+#define CMD_NO_FUNCTIONS   0x10 /* Ignore functions during command lookup. */
+#define CMD_INHIBIT_EXPANSION 0x20 /* Do not expand the command words. */
+
+/* What a command looks like. */
+typedef struct command {
+  enum command_type type;      /* FOR CASE WHILE IF CONNECTION or SIMPLE. */
+  int flags;                   /* Flags controlling execution environment. */
+  REDIRECT *redirects;         /* Special redirects for FOR CASE, etc. */
+  union {
+    struct for_com *For;
+    struct case_com *Case;
+    struct while_com *While;
+    struct if_com *If;
+    struct connection *Connection;
+    struct simple_com *Simple;
+    struct function_def *Function_def;
+    struct group_com *Group;
+  } value;
+} COMMAND;
+
+/* Structure used to represent the CONNECTION type. */
+typedef struct connection {
+  int ignore;                  /* Unused; simplifies make_command (). */
+  COMMAND *first;              /* Pointer to the first command. */
+  COMMAND *second;             /* Pointer to the second command. */
+  int connector;               /* What separates this command from others. */
+} CONNECTION;
+
+/* Structures used to represent the CASE command. */
+
+/* Pattern/action structure for CASE_COM. */
+typedef struct pattern_list {
+  struct pattern_list *next;   /* Clause to try in case this one failed. */
+  WORD_LIST *patterns;         /* Linked list of patterns to test. */
+  COMMAND *action;             /* Thing to execute if a pattern matches. */
+} PATTERN_LIST;
+
+/* The CASE command. */
+typedef struct case_com {
+  int flags;                   /* See description of CMD flags. */
+  WORD_DESC *word;             /* The thing to test. */
+  PATTERN_LIST *clauses;       /* The clauses to test against, or NULL. */
+} CASE_COM;
+
+/* FOR command. */
+typedef struct for_com {
+  int flags;           /* See description of CMD flags. */
+  WORD_DESC *name;     /* The variable name to get mapped over. */
+  WORD_LIST *map_list; /* The things to map over.  This is never NULL. */
+  COMMAND *action;     /* The action to execute.
+                          During execution, NAME is bound to successive
+                          members of MAP_LIST. */
+} FOR_COM;
+
+/* IF command. */
+typedef struct if_com {
+  int flags;                   /* See description of CMD flags. */
+  COMMAND *test;               /* Thing to test. */
+  COMMAND *true_case;          /* What to do if the test returned non-zero. */
+  COMMAND *false_case;         /* What to do if the test returned zero. */
+} IF_COM;
+
+/* WHILE command. */
+typedef struct while_com {
+  int flags;                   /* See description of CMD flags. */
+  COMMAND *test;               /* Thing to test. */
+  COMMAND *action;             /* Thing to do while test is non-zero. */
+} WHILE_COM;
+
+/* The "simple" command.  Just a collection of words and redirects. */
+typedef struct simple_com {
+  int flags;                   /* See description of CMD flags. */
+  WORD_LIST *words;            /* The program name, the arguments,
+                                  variable assignments, etc. */
+  REDIRECT *redirects;         /* Redirections to perform. */
+} SIMPLE_COM;
+
+/* The "function_def" command.  This isn't really a command, but it is
+   represented as such for now.  If the function def appears within 
+   `(' `)' the parser tries to set the SUBSHELL bit of the command.  That
+   means that FUNCTION_DEF has to be run through the executor.  Maybe this
+   command should be defined in a subshell.  Who knows or cares. */
+typedef struct function_def {
+  int ignore;                  /* See description of CMD flags. */
+  WORD_DESC *name;             /* The name of the function. */
+  COMMAND *command;            /* The parsed execution tree. */
+} FUNCTION_DEF;
+
+/* A command that is `grouped' allows pipes to take effect over
+   the entire command structure. */
+typedef struct group_com {
+  int ignore;                  /* See description of CMD flags. */
+  COMMAND *command;
+} GROUP_COM;
+
+/* Forward declarations of functions called by the grammer. */
+extern REDIRECT *make_redirection ();
+extern WORD_LIST *make_word_list ();
+extern WORD_DESC *make_word ();
+
+extern COMMAND
+  *make_for_command (), *make_case_command (), *make_if_command (),
+  *make_while_command (), *command_connect (), *make_simple_command (),
+  *make_function_def (), *clean_simple_command (), *make_until_command (),
+  *make_group_command ();
+
+extern PATTERN_LIST *make_pattern_list ();
+extern COMMAND *global_command, *copy_command ();
+
+#endif /* _COMMAND_H */
diff --git a/CWRU/posix-parser/copy.c b/CWRU/posix-parser/copy.c
new file mode 100644 (file)
index 0000000..19d49be
--- /dev/null
@@ -0,0 +1,279 @@
+/* copy_command.c -- copy a COMMAND structure.  This is needed
+   primarily for making function definitions, but I'm not sure
+   that anyone else will need it.  */
+
+/* Copyright (C) 1987,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. */
+
+#include <stdio.h>
+#include "shell.h"
+
+/* Forward declaration. */
+extern COMMAND *copy_command ();
+
+WORD_DESC *
+copy_word (word)
+     WORD_DESC *word;
+{
+  WORD_DESC *new_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
+  bcopy (word, new_word, sizeof (WORD_DESC));
+  new_word->word = savestring (word->word);
+  return (new_word);
+}
+
+/* Copy the chain of words in LIST.  Return a pointer to 
+   the new chain. */
+WORD_LIST *
+copy_word_list (list)
+     WORD_LIST *list;
+{
+  WORD_LIST *new_list = NULL;
+
+  while (list)
+    {
+      WORD_LIST *temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
+      temp->next = new_list;
+      new_list = temp;
+      new_list->word = copy_word (list->word);
+      list = list->next;
+    }
+  return ((WORD_LIST *)reverse_list (new_list));
+}
+
+PATTERN_LIST *
+copy_case_clause (clause)
+     PATTERN_LIST *clause;
+{
+  PATTERN_LIST *new_clause = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST));
+  new_clause->patterns = copy_word_list (clause->patterns);
+  new_clause->action = copy_command (clause->action);
+  return (new_clause);
+}
+
+PATTERN_LIST *
+copy_case_clauses (clauses)
+     PATTERN_LIST *clauses;
+{
+  PATTERN_LIST *new_list = (PATTERN_LIST *)NULL;
+
+  while (clauses)
+    {
+      PATTERN_LIST *new_clause = copy_case_clause (clauses);
+      new_clause->next = new_list;
+      new_list = new_clause;
+      clauses = clauses->next;
+    }
+  return ((PATTERN_LIST *)reverse_list (new_list));
+}
+
+/* Copy a single redirect. */
+REDIRECT *
+copy_redirect (redirect)
+     REDIRECT *redirect;
+{
+  REDIRECT *new_redirect = (REDIRECT *)xmalloc (sizeof (REDIRECT));
+  bcopy (redirect, new_redirect, (sizeof (REDIRECT)));
+  switch (redirect->instruction)
+    {
+    case r_reading_until:
+    case r_deblank_reading_until:
+      new_redirect->here_doc_eof = savestring (redirect->here_doc_eof);
+      /* There is NO BREAK HERE ON PURPOSE!!!! */
+    case r_appending_to:
+    case r_output_direction:
+    case r_input_direction:
+    case r_inputa_direction:
+    case r_err_and_out:
+    case r_input_output:
+    case r_output_force:
+    case r_duplicating_input_word:
+    case r_duplicating_output_word:
+      new_redirect->redirectee.filename =
+       copy_word (redirect->redirectee.filename);
+      break;
+    }
+  return (new_redirect);
+}
+  
+REDIRECT *
+copy_redirects (list)
+     REDIRECT *list;
+{
+  REDIRECT *new_list = NULL;
+
+  while (list)
+    {
+      REDIRECT *temp = copy_redirect (list);
+      temp->next = new_list;
+      new_list = temp;
+      list = list->next;
+    }
+  return ((REDIRECT *)reverse_list (new_list));
+}
+  
+FOR_COM *
+copy_for_command (com)
+     FOR_COM *com;
+{
+  FOR_COM *new_for = (FOR_COM *)xmalloc (sizeof (FOR_COM));
+  new_for->flags = com->flags;
+  new_for->name = copy_word (com->name);
+  new_for->map_list = copy_word_list (com->map_list);
+  new_for->action = copy_command (com->action);
+  return (new_for);
+}
+
+GROUP_COM *
+copy_group_command (com)
+     GROUP_COM *com;
+{
+  GROUP_COM *new_group = (GROUP_COM *)xmalloc (sizeof (GROUP_COM));
+
+  new_group->command = copy_command (com->command);
+  return (new_group);
+}
+
+CASE_COM *
+copy_case_command (com)
+     CASE_COM *com;
+{
+  CASE_COM *new_case = (CASE_COM *)xmalloc (sizeof (CASE_COM));
+
+  new_case->flags = com->flags;
+  new_case->word = copy_word (com->word);
+  new_case->clauses = copy_case_clauses (com->clauses);
+  return (new_case);
+}
+
+WHILE_COM *
+copy_while_command (com)
+     WHILE_COM *com;
+{
+  WHILE_COM *new_while = (WHILE_COM *)xmalloc (sizeof (WHILE_COM));
+
+  new_while->flags = com->flags;
+  new_while->test = copy_command (com->test);
+  new_while->action = copy_command (com->action);
+  return (new_while);
+}
+
+IF_COM *
+copy_if_command (com)
+     IF_COM *com;
+{
+  IF_COM *new_if = (IF_COM *)xmalloc (sizeof (IF_COM));
+
+  new_if->flags = com->flags;
+  new_if->test = copy_command (com->test);
+  new_if->true_case = copy_command (com->true_case);
+  new_if->false_case = copy_command (com->false_case);
+  return (new_if);
+}
+
+SIMPLE_COM *
+copy_simple_command (com)
+     SIMPLE_COM *com;
+{
+  SIMPLE_COM *new_simple = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
+
+  new_simple->flags = com->flags;
+  new_simple->words = copy_word_list (com->words);
+  new_simple->redirects = copy_redirects (com->redirects);
+  return (new_simple);
+}
+  
+FUNCTION_DEF *
+copy_function_def (com)
+     FUNCTION_DEF *com;
+{
+  FUNCTION_DEF *new_def = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF));
+
+  new_def->name = copy_word (com->name);
+  new_def->command = copy_command (com->command);
+  return (new_def);
+}
+
+/* Copy the command structure in COMMAND.  Return a pointer to the
+   copy.  Don't you forget to dispose_command () on this pointer
+   later! */
+COMMAND *
+copy_command (command)
+     COMMAND *command;
+{
+  COMMAND *new_command = (COMMAND *)NULL;
+
+  if (command)
+    {
+      new_command = (COMMAND *)xmalloc (sizeof (COMMAND));
+      bcopy (command, new_command, sizeof (COMMAND));
+      new_command->flags = command->flags;
+
+      if (command->redirects)
+       new_command->redirects = copy_redirects (command->redirects);
+
+      switch (command->type)
+       {
+       case cm_for:
+         new_command->value.For = copy_for_command (command->value.For);
+         break;
+
+       case cm_group:
+         new_command->value.Group = copy_group_command (command->value.Group);
+         break;
+
+       case cm_case:
+         new_command->value.Case = copy_case_command (command->value.Case);
+         break;
+      
+       case cm_until:
+       case cm_while:
+         new_command->value.While = copy_while_command (command->value.While);
+         break;
+      
+       case cm_if:
+         new_command->value.If = copy_if_command (command->value.If);
+         break;
+      
+       case cm_simple:
+         new_command->value.Simple = copy_simple_command (command->value.Simple);
+         break;
+      
+       case cm_connection:
+         {
+           CONNECTION *new_connection;
+
+           new_connection = (CONNECTION *)xmalloc (sizeof (CONNECTION));
+           new_connection->connector = command->value.Connection->connector;
+           new_connection->first =
+             copy_command (command->value.Connection->first);
+           new_connection->second =
+             copy_command (command->value.Connection->second);
+           new_command->value.Connection = new_connection;
+           break;
+         }
+      
+         /* Pathological case.  I'm not even sure that you can have a
+            function definition as part of a function definition. */
+       case cm_function_def:
+         new_command->value.Function_def =
+           copy_function_def (command->value.Function_def);
+         break;
+       }
+    }
+  return (new_command);
+}
diff --git a/CWRU/posix-parser/endian.h b/CWRU/posix-parser/endian.h
new file mode 100644 (file)
index 0000000..ebbf6d6
--- /dev/null
@@ -0,0 +1,9 @@
+/* endian.h - Define BIG or LITTLE endian. */
+
+/* This file was automatically created by `endian.aux'.  You shouldn't
+   edit this file, because your changes will be overwritten.  Instead,
+   edit the source code file `endian.c'. */
+
+#if !defined (BIG_ENDIAN)
+#  define BIG_ENDIAN
+#endif /* BIG_ENDIAN */
diff --git a/CWRU/posix-parser/main.c b/CWRU/posix-parser/main.c
new file mode 100644 (file)
index 0000000..2175391
--- /dev/null
@@ -0,0 +1,97 @@
+#include <stdio.h>
+#include "shell.h"
+
+COMMAND *global_command;
+int last_command_exit_value;
+int interrupt_state;
+int interactive = 1;
+int eof_encountered = 0;
+int exit_immediately_on_error = 1;
+
+char *the_current_maintainer = "chet";
+
+char *shell_name = "posix";
+
+void
+throw_to_top_level()
+{
+}
+
+char *
+base_pathname(s)
+char   *s;
+{
+       return s;
+}
+
+char *
+strerror(s)
+int    s;
+{
+       return ("error");
+}
+
+parse_command ()
+{
+  extern int need_here_doc, current_command_line_count;
+  extern REDIRECT *redirection_needing_here_doc;
+  int r;
+
+  need_here_doc = 0;
+  redirection_needing_here_doc = (REDIRECT *)NULL;
+
+  current_command_line_count = 0;
+  r = yyparse ();
+
+  if (need_here_doc)
+    make_here_document (redirection_needing_here_doc);
+  need_here_doc = 0;
+
+  return (r);
+}
+
+main(argc, argv)
+int    argc;
+char   **argv;
+{
+       with_input_from_stdin();
+
+       if (parse_command () == 0) {
+               printf ("legal command in the Posix shell\n");
+               exit (0);
+       } else {
+               printf ("illegal\n");
+               exit (1);
+       }
+}
+
+char *
+string_quote_removal (s)
+{
+       return (savestring (s));
+}
+
+assignment (string)
+     char *string;
+{
+  register int c, index = 0;
+
+  c = string[index];
+
+  if (!isletter (c) && c != '_')
+    return (0);
+
+  while (c = string[index])
+    {
+      /* The following is safe.  Note that '=' at the start of a word
+         is not an assignment statement. */
+      if (c == '=')
+        return (index);
+
+      if (!isletter (c) && !digit (c) && c != '_')
+        return (0);
+
+      index++;
+    }
+  return (0);
+}
diff --git a/CWRU/posix-parser/make.c b/CWRU/posix-parser/make.c
new file mode 100644 (file)
index 0000000..cc49b18
--- /dev/null
@@ -0,0 +1,596 @@
+/* make_cmd.c --
+   Functions for making instances of the various parser constructs. */
+
+/* Copyright (C) 1989 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. */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include "config.h"
+#include "general.h"
+#include "error.h"
+#include "command.h"
+#include "flags.h"
+#include "filecntl.h"
+
+#if defined (JOB_CONTROL)
+#include "jobs.h"
+#endif
+
+extern GENERIC_LIST *reverse_list ();
+
+WORD_DESC *
+make_word (string)
+     char *string;
+{
+  WORD_DESC *temp;
+
+  temp = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
+  temp->word = savestring (string);
+  temp->quoted = temp->dollar_present = temp->assignment = 0;
+
+  while (*string)
+    {
+      if (*string == '$') temp->dollar_present = 1;
+
+      if (member (*string, "'`\\\""))
+       {
+         temp->quoted = 1;
+         if (*string == '\\')
+           string++;
+       }
+
+      if (*string)
+       (string++);
+    }
+  return (temp);
+}
+
+WORD_DESC *
+make_word_from_token (token)
+     int token;
+{
+  char tokenizer[2];
+
+  tokenizer[0] = token;
+  tokenizer[1] = '\0';
+
+  return (make_word (tokenizer));
+}
+
+WORD_LIST *
+make_word_list (word, link)
+     WORD_DESC *word;
+     WORD_LIST *link;
+{
+  WORD_LIST *temp;
+
+  temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
+  temp->word = word;
+  temp->next = link;
+  return (temp);
+}
+
+WORD_LIST *
+add_string_to_list (string, list)
+     char *string;
+     WORD_LIST *list;
+{
+  WORD_LIST *temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
+  temp->word = make_word (string);
+  temp->next = list;
+  return (temp);
+}
+
+WORD_DESC *
+coerce_to_word (number)
+     int number;
+{
+  char string[24];
+
+  sprintf (string, "%d", number);
+  return (make_word (string));
+}
+
+COMMAND *
+make_command (type, pointer)
+     enum command_type type;
+     SIMPLE_COM *pointer;
+{
+  COMMAND *temp;
+
+  temp = (COMMAND *)xmalloc (sizeof (COMMAND));
+  temp->type = type;
+  temp->value.Simple = pointer;
+  temp->value.Simple->flags = 0;
+  temp->flags = 0;
+  temp->redirects = (REDIRECT *)NULL;
+  return (temp);
+}
+
+COMMAND *
+command_connect (com1, com2, connector)
+     COMMAND *com1, *com2;
+     int connector;
+{
+  CONNECTION *temp;
+
+  temp = (CONNECTION *)xmalloc (sizeof (CONNECTION));
+  temp->connector = connector;
+  temp->first = com1;
+  temp->second = com2;
+  return (make_command (cm_connection, (SIMPLE_COM *)temp));
+}
+
+COMMAND *
+make_for_command (name, map_list, action)
+     WORD_DESC *name;
+     WORD_LIST *map_list;
+     COMMAND *action;
+{
+  FOR_COM *temp = (FOR_COM *)xmalloc (sizeof (FOR_COM));
+
+  temp->flags = 0;
+  temp->name = name;
+  temp->map_list = map_list;
+  temp->action = action;
+  return (make_command (cm_for, (SIMPLE_COM *)temp));
+}
+
+COMMAND *
+make_group_command (command)
+     COMMAND *command;
+{
+  GROUP_COM *temp = (GROUP_COM *)xmalloc (sizeof (GROUP_COM));
+
+  temp->command = command;
+  return (make_command (cm_group, (SIMPLE_COM *)temp));
+}
+
+COMMAND *
+make_case_command (word, clauses)
+     WORD_DESC *word;
+     PATTERN_LIST *clauses;
+{
+  CASE_COM *temp;
+
+  temp = (CASE_COM *)xmalloc (sizeof (CASE_COM));
+  temp->flags = 0;
+  temp->word = word;
+  temp->clauses = (PATTERN_LIST *)reverse_list (clauses);
+  return (make_command (cm_case, (SIMPLE_COM *)temp));
+}
+
+PATTERN_LIST *
+make_pattern_list (patterns, action)
+     WORD_LIST *patterns;
+     COMMAND *action;
+{
+  PATTERN_LIST *temp;
+
+  temp = (PATTERN_LIST *)xmalloc (sizeof (PATTERN_LIST));
+  temp->patterns = patterns;
+  temp->action = action;
+  temp->next = NULL;
+  return (temp);
+}
+
+COMMAND *
+make_if_command (test, true_case, false_case)
+     COMMAND *test, *true_case, *false_case;
+{
+  IF_COM *temp;
+
+  temp = (IF_COM *)xmalloc (sizeof (IF_COM));
+  temp->flags = 0;
+  temp->test = test;
+  temp->true_case = true_case;
+  temp->false_case = false_case;
+  return (make_command (cm_if, (SIMPLE_COM *)temp));
+}
+
+COMMAND *
+make_until_or_while (test, action, which)
+     COMMAND *test, *action;
+     enum command_type which;
+{
+  WHILE_COM *temp;
+
+  temp = (WHILE_COM *)xmalloc (sizeof (WHILE_COM));
+  temp->flags = 0;
+  temp->test = test;
+  temp->action = action;
+  return (make_command (which, (SIMPLE_COM *)temp));
+}
+
+COMMAND *
+make_while_command (test, action)
+     COMMAND *test, *action;
+{
+  return (make_until_or_while (test, action, cm_while));
+}
+
+COMMAND *
+make_until_command (test, action)
+     COMMAND *test, *action;
+{
+  return (make_until_or_while (test, action, cm_until));
+}
+
+COMMAND *
+make_bare_simple_command ()
+{
+  COMMAND *command;
+  SIMPLE_COM *temp = (SIMPLE_COM *)xmalloc (sizeof (SIMPLE_COM));
+
+  temp->flags = 0;
+  temp->words = (WORD_LIST *)NULL;
+  temp->redirects = (REDIRECT *)NULL;
+  command = (COMMAND *)xmalloc (sizeof (COMMAND));
+  command->type = cm_simple;
+  command->redirects = (REDIRECT *)NULL;
+  command->flags = 0;
+  command->value.Simple = temp;
+  return (command);
+}
+
+COMMAND *
+new_make_simple_command (word, prefix, suffix)
+     WORD_DESC *word;
+     ELEMENT *prefix;
+     ELEMENT *suffix;
+{
+  /* Make a list of words and redirects from WORD, PREFIX, and SUFFIX. */
+  WORD_LIST *w = (WORD_LIST *)NULL;
+  REDIRECT *r = (REDIRECT *)NULL;
+  COMMAND *ret;
+  SIMPLE_COM *sc;
+  register ELEMENT *te;
+
+  ret = make_bare_simple_command ();
+  sc = ret->value.Simple;
+
+  te = prefix;
+  while (te)
+    {
+      ELEMENT *t2;
+      if (te->redirect)
+        {
+          te->redirect->next  = r;
+          r->next = te->redirect;
+        }
+      else if (te->word)
+        {
+          WORD_LIST *twl = make_word_list (te->word, (WORD_LIST *)NULL);
+          twl->next = w;
+          w = twl;
+        }
+      t2 = te;
+      te = te->next;
+      free (t2);
+    }
+
+  if (word)
+    {
+      WORD_LIST *twl = make_word_list (word, (WORD_LIST *)NULL);
+      twl->next = w;
+      w = twl;
+    }
+
+  te = suffix;
+  while (te)
+    {
+      ELEMENT *t2;
+      if (te->redirect)
+        {
+          te->redirect->next  = r;
+          r->next = te->redirect;
+        }
+      else if (te->word)
+        {
+          WORD_LIST *twl = make_word_list (te->word, (WORD_LIST *)NULL);
+          twl->next = w;
+          w = twl;
+        }
+      t2 = te;
+      te = te->next;
+      free (t2);
+    }
+
+  sc->words = (WORD_LIST *)reverse_list (w);
+  sc->redirects = (REDIRECT *)reverse_list (r);
+  sc->flags = 0;
+
+  return (ret);
+}
+
+/* Return a command which is the connection of the word or redirection
+   in ELEMENT, and the command * or NULL in COMMAND. */
+COMMAND *
+make_simple_command (element, command)
+     ELEMENT element;
+     COMMAND *command;
+{
+  /* If we are starting from scratch, then make the initial command
+     structure.  Also note that we have to fill in all the slots, since
+     malloc doesn't return zeroed space. */
+  if (!command)
+    command = make_bare_simple_command ();
+  if (element.word)
+    {
+      WORD_LIST *tw = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
+      tw->word = element.word;
+      tw->next = command->value.Simple->words;
+      command->value.Simple->words = tw;
+    }
+  else
+    {
+      REDIRECT *r = element.redirect;
+      /* Due to the way <> is implemented, there may be more than a single
+        redirection in element.redirect.  We just follow the chain as far
+        as it goes, and hook onto the end. */
+      while (r->next)
+       r = r->next;
+      r->next = command->value.Simple->redirects;
+      command->value.Simple->redirects = element.redirect;
+    }
+  return (command);
+}
+
+#define POSIX_HERE_DOCUMENTS
+make_here_document (temp)
+     REDIRECT *temp;
+{
+  int kill_leading = 0;
+
+  switch (temp->instruction)
+    {
+      /* Because we are Bourne compatible, we read the input for this
+        << or <<- redirection now, from wherever input is coming from.
+        We store the input read into a WORD_DESC.  Replace the text of
+        the redirectee.word with the new input text.  If <<- is on,
+        then remove leading TABS from each line. */
+
+      case r_deblank_reading_until:    /* <<-foo */
+       kill_leading++;
+       /* ... */
+      case r_reading_until:            /* <<foo */
+       {
+         extern char *redirection_expand ();
+         extern char *string_quote_removal ();
+         char *redirectee_word;
+         int len;
+
+         char *document = (char *)NULL;
+         int document_index = 0, document_size = 0;
+
+#if !defined (POSIX_HERE_DOCUMENTS)
+         /* Because of Bourne shell semantics, we turn off globbing, but
+            only for this style of redirection.  I feel a little ill.  */
+         {
+           extern int disallow_filename_globbing;
+           int old_value = disallow_filename_globbing;
+           disallow_filename_globbing = 1;
+
+           redirectee_word = redirection_expand (temp->redirectee.filename);
+
+           disallow_filename_globbing = old_value;
+         }
+#else /* POSIX_HERE_DOCUMENTS */
+         /* Quote removal is the only expansion performed on the delimiter
+            for here documents, making it an extremely special case.  I
+            still feel ill. */
+         redirectee_word =
+           string_quote_removal (temp->redirectee.filename->word, 0);
+#endif /* POSIX_HERE_DOCUMENTS */
+
+         /* redirection_expand will return NULL if the expansion results in
+            multiple words or no words.  Check for that here, and just abort
+            this here document if it does. */
+         if (redirectee_word)
+           len = strlen (redirectee_word);
+         else
+           {
+             temp->here_doc_eof = savestring ("");
+             goto document_done;
+           }
+
+         free (temp->redirectee.filename->word);
+         temp->here_doc_eof = redirectee_word;
+
+         /* Read lines from wherever lines are coming from.
+            For each line read, if kill_leading, then kill the
+            leading tab characters.
+            If the line matches redirectee_word exactly, then we have
+            manufactured the document.  Otherwise, add the line to the
+            list of lines in the document. */
+         {
+           extern char *read_secondary_line ();
+           char *line;
+           int l;
+
+           while (line = read_secondary_line ())
+             {
+               if (!line)
+                 goto document_done;
+
+               if (kill_leading)
+                 {
+                   register int i;
+
+                   /* Hack:  To be compatible with some Bourne shells, we 
+                      check the word before stripping the whitespace.  This
+                      is a hack, though. */
+                   if ((strncmp (line, redirectee_word, len) == 0) &&
+                       line[len] == '\n')
+                     goto document_done;
+
+                   for (i = 0; line[i] == '\t'; i++)
+                     ;
+
+                   if (i)
+                     strcpy (&line[0], &line[i]);
+                 }
+
+               if ((strncmp (line, redirectee_word, len) == 0) &&
+                   line[len] == '\n')
+                 goto document_done;
+
+               l = strlen (line);
+               if (l + document_index >= document_size)
+                 {
+                   document = (char *)
+                     xrealloc (document, (document_size += (10 * l)));
+                 }
+
+               if (l != 0)
+                 {
+                   strcpy (&document[document_index], line);
+                   free (line);
+                   document_index += l;
+                 }
+             }
+  document_done:
+           if (!document)
+             document = savestring ("");
+           temp->redirectee.filename->word = document;
+         }
+       }
+    }
+}
+   
+/* Generate a REDIRECT from SOURCE, DEST, and INSTRUCTION. 
+   INSTRUCTION is the instruction type, SOURCE is an INT,
+   and DEST is an INT or a WORD_DESC *. */
+REDIRECT *
+make_redirection (source, instruction, dest)
+     enum r_instruction instruction;
+{
+  REDIRECT *temp = (REDIRECT *)xmalloc (sizeof (REDIRECT));
+
+  /* First do the common cases. */
+  temp->redirector = source;
+  temp->redirectee.dest = dest;
+  temp->instruction = instruction;
+  temp->next = (REDIRECT *)NULL;
+
+  switch (instruction)
+    {
+
+    case r_output_direction:   /* >foo */
+    case r_output_force:       /* >| foo */
+      temp->flags = O_TRUNC | O_WRONLY | O_CREAT;
+      break;
+
+    case r_input_direction:    /* <foo */
+    case r_inputa_direction:   /* foo & makes this. */
+      temp->flags = O_RDONLY;
+      break;
+
+    case r_appending_to:       /* >>foo */
+      temp->flags = O_APPEND | O_WRONLY | O_CREAT;
+      break;
+
+    case r_deblank_reading_until: /* <<-foo */
+    case r_reading_until:      /* << foo */
+      break;
+
+    case r_duplicating_input:          /* 1<&2 */
+    case r_duplicating_output:         /* 1>&2 */
+    case r_close_this:                 /* <&- */
+    case r_duplicating_input_word:     /* 1<&$foo */
+    case r_duplicating_output_word:    /* 1>&$foo */
+      break;
+    
+    case r_err_and_out:                /* command &>filename */
+      temp->flags = O_TRUNC | O_WRONLY | O_CREAT;
+      break;
+
+    case r_input_output:
+      temp->flags = O_RDWR;
+      break;
+
+    default:
+      programming_error ("Redirection instruction from yyparse () '%d' is\n\
+out of range in make_redirection ().", instruction);
+      abort ();
+      break;
+    }
+  return (temp);
+}
+
+COMMAND *
+make_function_def (name, command)
+     WORD_DESC *name;
+     COMMAND *command;
+{
+  FUNCTION_DEF *temp;
+
+  temp = (FUNCTION_DEF *)xmalloc (sizeof (FUNCTION_DEF));
+  temp->command = command;
+  temp->name = name;
+  return (make_command (cm_function_def, (SIMPLE_COM *)temp));
+}
+
+/* Reverse the word list and redirection list in the simple command
+   has just been parsed.  It seems simpler to do this here the one
+   time then by any other method that I can think of. */
+COMMAND *
+clean_simple_command (command)
+     COMMAND *command;
+{
+  extern GENERIC_LIST *reverse_list ();
+
+  if (command->type != cm_simple)
+    {
+      programming_error
+       ("clean_simple_command () got a command with type %d.", command->type);
+    }
+  else
+    {
+      command->value.Simple->words =
+       (WORD_LIST *)reverse_list (command->value.Simple->words);
+      command->value.Simple->redirects = 
+       (REDIRECT *)reverse_list (command->value.Simple->redirects);
+    }
+
+  return (command);
+}
+
+/* Cons up a new array of words.  The words are taken from LIST,
+   which is a WORD_LIST *.  Absolutely everything is malloc'ed,
+   so you should free everything in this array when you are done.
+   The array is NULL terminated. */
+char **
+make_word_array (list)
+     WORD_LIST *list;
+{
+  int count = list_length (list);
+  char **array = (char **)xmalloc ((1 + count) * sizeof (char *));
+
+  for (count = 0; list; count++)
+    {
+      array[count] = (char *)xmalloc (1 + strlen (list->word->word));
+      strcpy (array[count], list->word->word);
+      list = list->next;
+    }
+  array[count] = (char *)NULL;
+  return (array);
+}
diff --git a/CWRU/posix-parser/parse.y b/CWRU/posix-parser/parse.y
new file mode 100644 (file)
index 0000000..df7faba
--- /dev/null
@@ -0,0 +1,1932 @@
+/* Yacc grammar for bash. */
+
+/* Copyright (C) 1989 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 LICENSE.  If not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+%{
+#include <stdio.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <varargs.h>
+#include "shell.h"
+#include "flags.h"
+
+#define YYDEBUG 1
+extern int eof_encountered;
+extern int no_line_editing;
+extern int interactive, interactive_shell;
+
+extern COMMAND *new_make_simple_command ();
+
+extern char *index ();
+/* **************************************************************** */
+/*                                                                 */
+/*                 "Forward" declarations                          */
+/*                                                                 */
+/* **************************************************************** */
+
+/* This is kind of sickening.  In order to let these variables be seen by
+   all the functions that need them, I am forced to place their declarations
+   far away from the place where they should logically be found. */
+
+static int reserved_word_acceptable ();
+
+/* PROMPT_STRING_POINTER points to one of these, never to an actual string. */
+char *ps1_prompt, *ps2_prompt;
+
+/* Handle on the current prompt string.  Indirectly points through
+   ps1_ or ps2_prompt. */
+char **prompt_string_pointer = (char **)NULL;
+char *current_prompt_string;
+
+/* The number of lines read from input while creating the current command. */
+int current_command_line_count = 0;
+
+/* Variables to manage the task of reading here documents, because we need to
+   defer the reading until after a complete command has been collected. */
+REDIRECT *redirection_needing_here_doc = (REDIRECT *)NULL;
+int need_here_doc = 0;
+%}
+
+%union {
+  WORD_DESC *word;             /* the word that we read. */
+  int number;                  /* the number that we read. */
+  WORD_LIST *word_list;
+  COMMAND *command;
+  REDIRECT *redirect;
+  ELEMENT *element;
+  PATTERN_LIST *pattern;
+  int separator_token;
+}
+
+/* Reserved words.  Members of the first group are only recognized
+   in the case that they are preceded by a list_terminator.  Members
+   of the second group are recognized only under special circumstances. */
+%token IF THEN ELSE ELIF FI CASE ESAC FOR WHILE UNTIL DO DONE FUNCTION
+%token IN BANG
+
+/* More general tokens. yylex () knows how to make these. */
+%token <word> WORD ASSIGNMENT_WORD NAME
+%token <number> NUMBER
+%token AND_AND OR_OR GREATER_GREATER LESS_LESS LESS_AND
+%token GREATER_AND SEMI_SEMI LESS_LESS_MINUS AND_GREATER LESS_GREATER
+%token GREATER_BAR NEWLINE
+
+/* The types that the various syntactical units return. */
+
+%type <command> complete_command
+%type <command> list and_or pipeline pipe_sequence tcommand compound_command
+%type <command> simple_command subshell compound_list term
+%type <command> function_definition brace_group
+%type <command> for_clause case_clause while_clause if_clause until_clause
+%type <command> do_group else_part
+%type <redirect> redirect_list redirect
+%type <word_list> wordlist pattern 
+%type <separator_token> separator separator_op linebreak newline_list
+%type <separator_token> sequential_sep
+%type <pattern> case_list case_item
+%type <element> cmd_prefix cmd_suffix
+%type <word> cmd_name cmd_word
+
+%start inputunit
+
+%left yacc_EOF
+%%
+
+inputunit:     complete_command NEWLINE
+                       {
+                         TRACE("reduced complete_command NEWLINE to inputunit");
+                         global_command = $1;
+                         YYACCEPT;
+                       }
+       |       NEWLINE
+                       {
+                         TRACE("reduced NEWLINE to inputunit");
+                         global_command = (COMMAND *)NULL;
+                         YYACCEPT;
+                       }
+       ;
+
+complete_command
+       :       list separator
+                       {
+                         TRACE("reduced 'list separator' to complete_command");
+                         /* Case of regular command.  Discard the error
+                            safety net,and return the command just parsed. */
+                         $$ = $1;
+                       }
+       |       list
+                       {
+                         TRACE("reduced list to complete_command");
+                         /* Case of regular command.  Discard the error
+                            safety net,and return the command just parsed. */
+                         $$ = $1;
+                       }
+       |       error
+                       {
+                         /* Error during parsing.  Return NULL command. */
+                         global_command = (COMMAND *)NULL;
+                         eof_encountered = 0;
+                         discard_parser_constructs (1);
+                         if (interactive)
+                           {
+                             YYACCEPT;
+                           }
+                         else
+                           {
+                             YYABORT;
+                           }
+                       }
+       |       yacc_EOF
+                       {
+                         /* Case of EOF seen by itself.  Do ignoreeof or 
+                            not. */
+                         global_command = (COMMAND *)NULL;
+                         handle_eof_input_unit ();
+                         YYACCEPT;
+                       }
+       ;
+
+list   :       list separator_op and_or
+                       {
+                         $$ = command_connect ($1, $3, $2);
+                         if (need_here_doc)
+                           make_here_document (redirection_needing_here_doc);
+                         need_here_doc = 0;
+                        }
+       |       and_or
+                       {
+                         $$ = $1;
+                         if (need_here_doc)
+                           make_here_document (redirection_needing_here_doc);
+                         need_here_doc = 0;
+                         TRACE("reduced and_or to list");
+                        }
+       ;
+
+and_or :       pipeline
+                       {
+                         TRACE("reduced pipeline to and_or");
+                         $$ = $1;
+                       }
+       |       and_or AND_AND linebreak pipeline
+                       { $$ = command_connect ($1, $4, AND_AND); }
+       |       and_or OR_OR linebreak pipeline
+                       { $$ = command_connect ($1, $4, OR_OR); }
+       ;
+
+pipeline:      pipe_sequence
+                       {
+                         TRACE("reduced pipe_sequence to pipeline");
+                         $$ = $1;
+                       }
+       |       BANG pipe_sequence
+                       {
+                         $2->flags |= CMD_INVERT_RETURN;
+                         $$ = $2;
+                       }
+       ;
+
+pipe_sequence: tcommand
+                       { 
+                         TRACE("reduced tcommand to pipe_sequence");
+                         $$ = $1;
+                       }
+       |       pipe_sequence '|' linebreak tcommand
+                       { $$ = command_connect ($1, $4, '|'); }
+       ;
+
+tcommand:      simple_command
+                       { 
+                         TRACE("reduced simple_command to tcommand");
+                         $$ = clean_simple_command ($1);
+                       }
+       |       compound_command
+                       { $$ = $1; }
+       |       compound_command redirect_list
+                       {
+                         $1->redirects = $2;
+                         $$ = $1;
+                       }
+       |       function_definition
+                       { $$ = $1; }
+       ;
+
+compound_command
+       :       brace_group
+                       { $$ = $1; }
+       |       subshell
+                       { $$ = $1; }
+       |       for_clause
+                       {
+                         TRACE("reduced FOR_CLAUSE to COMPOUND_COMMAND");
+                         $$ = $1;
+                       }
+       |       case_clause
+                       { $$ = $1; }
+       |       if_clause
+                       {
+                         TRACE("reduced IF_CLAUSE to COMPOUND_COMMAND");
+                         $$ = $1;
+                       }
+       |       while_clause
+                       {
+                         TRACE("reduced WHILE_CLAUSE to COMPOUND_COMMAND");
+                         $$ = $1;
+                       }
+       |       until_clause
+                       { $$ = $1; }
+       ;
+
+subshell:      '(' list ')'
+                       { $2->flags |= CMD_WANT_SUBSHELL; $$ = $2; }
+       ;
+
+
+compound_list
+       :       term
+                       { $$ = $1; }
+       |       newline_list term
+                       { $$ = $2; }
+       |       term separator
+                       { $$ = command_connect ($1, 0, $2); }
+       |       newline_list term separator
+                       { $$ = command_connect ($2, 0, $3); }
+       ;
+
+term   :       term separator and_or
+                       { $$ = command_connect ($1, $3, $2); }
+       |       and_or
+                       { $$ = $1; }
+       ;
+
+for_clause
+       :       FOR WORD do_group
+                       { $$ = make_for_command ($2, (WORD_LIST *)add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $3); }
+       |       FOR WORD newline_list IN wordlist sequential_sep do_group
+                       { $$ = make_for_command ($2, (WORD_LIST *)reverse_list ($5), $7); }
+       |       FOR WORD IN wordlist sequential_sep do_group
+                       {
+                         TRACE("reduced FOR_CLAUSE");
+                         $$ = make_for_command ($2, (WORD_LIST *)reverse_list ($4), $6);
+                       }
+       ;
+
+wordlist:      wordlist WORD
+                       { $$ = make_word_list ($2, $1); }
+       |       WORD
+                       { $$ = make_word_list ($1, (WORD_LIST *)NULL); }
+       ;
+
+case_clause
+       :       CASE WORD IN linebreak case_list ESAC
+                       { $$ = make_case_command ($2, $5); }
+       |       CASE WORD IN linebreak ESAC
+                       { $$ = make_case_command ($2, (PATTERN_LIST *)NULL); }
+       ;
+
+case_list
+       :       case_list case_item
+                       { $2->next = $1; $$ = $2; }
+       |       case_item
+                       { $$ = $1; }
+       ;
+
+case_item
+       :       pattern ')' linebreak SEMI_SEMI linebreak
+                       { $$ = make_pattern_list ($1, (COMMAND *)NULL); }
+       |       pattern ')' compound_list SEMI_SEMI linebreak
+                       { $$ = make_pattern_list ($1, $3); }
+       |       '(' pattern ')' compound_list SEMI_SEMI linebreak
+                       { $$ = make_pattern_list ($2, $4); }
+       |       '(' pattern ')' linebreak SEMI_SEMI linebreak
+                       { $$ = make_pattern_list ($2, (COMMAND *)NULL); }
+       ;
+
+pattern:       WORD
+                       { $$ = make_word_list ($1, (WORD_LIST *)NULL); }
+       |       pattern '|' WORD
+                       { $$ = make_word_list ($3, $1); }
+       ;
+
+if_clause:     IF compound_list THEN compound_list else_part FI
+                       { $$ = make_if_command ($2, $4, $5); }
+       |       IF compound_list THEN compound_list FI
+                       { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
+       ;
+
+else_part:     ELIF compound_list THEN else_part
+                       { $$ = make_if_command ($2, $4, (COMMAND *)NULL); }
+       |       ELSE compound_list
+                       { $$ = $2; }
+       ;
+
+while_clause:  WHILE compound_list do_group
+                       {
+                         TRACE("reduced WHILE_CLAUSE");
+                         $$ = make_while_command ($2, $3);
+                       }
+       ;
+
+until_clause:  UNTIL compound_list do_group
+                       { $$ = make_until_command ($2, $3); }
+       ;
+
+function_definition
+       :       WORD '(' ')' linebreak brace_group
+                       { $$ = make_function_def ($1, $5); }
+       ;
+
+brace_group:   '{' compound_list '}'
+                       { $$ = make_group_command ($2); }
+       ;
+
+
+do_group:      DO compound_list DONE
+                       {
+                         TRACE("reduced DO_GROUP");
+                         $$ = $2;
+                       }
+       ;
+
+cmd_prefix:    ASSIGNMENT_WORD
+                       {
+                         struct element *temp_element;
+                         temp_element = (ELEMENT *)xmalloc (sizeof (ELEMENT));
+                         temp_element->word = $1;
+                         temp_element->redirect = (REDIRECT *)NULL;
+                         temp_element->next = (struct element *)NULL;
+                         TRACE("reduced cmd_prefix to ASSIGNMENT_WORD");
+                         $$ = temp_element;
+                       }
+       |       cmd_prefix ASSIGNMENT_WORD
+                       {
+                         struct element *temp_element;
+                         temp_element = (ELEMENT *)xmalloc (sizeof (ELEMENT));
+                         temp_element->word = $2;
+                         temp_element->redirect = (REDIRECT *)NULL;
+                         temp_element->next = (struct element *)NULL;
+                         $1->next = temp_element;
+                         TRACE("reduced cmd_prefix to cmd_prefix ASSIGNMENT_WORD");
+                         $$ = $1;
+                       }
+       |       redirect
+                       {
+                         struct element *temp_element;
+                         temp_element = (ELEMENT *)xmalloc (sizeof (ELEMENT));
+                         temp_element->word = (WORD_DESC *)NULL;
+                         temp_element->redirect = $1;
+                         temp_element->next = (struct element *)NULL;
+                         TRACE("reduced cmd_prefix to redirect");
+                         $$ = temp_element;
+                       }
+       |       cmd_prefix redirect                     
+                       {
+                         struct element *temp_element;
+                         temp_element = (ELEMENT *)xmalloc (sizeof (ELEMENT));
+                         temp_element->word = (WORD_DESC *)NULL;
+                         temp_element->redirect = $2;
+                         temp_element->next = (struct element *)NULL;
+                         $1->next = temp_element;
+                         TRACE("reduced cmd_prefix to cmd_prefix redirect");
+                         $$ = $1;
+                       }
+       ;
+
+cmd_name:      WORD
+                       {
+                         TRACE ("reduced WORD to cmd_name");
+                         $$ = $1;
+                       }
+       ;
+       
+cmd_word:      WORD
+                       {
+                         TRACE ("reduced WORD to cmd_word");
+                         $$ = $1;
+                       }
+       ;
+
+cmd_suffix:    WORD
+                       {
+                         struct element *temp_element;
+                         temp_element = (ELEMENT *)xmalloc (sizeof (ELEMENT));
+                         temp_element->word = $1;
+                         temp_element->redirect = (REDIRECT *)NULL;
+                         temp_element->next = (struct element *)NULL;
+                         TRACE("reduced cmd_suffix to WORD");
+                         $$ = temp_element;
+                       }
+       |       cmd_suffix WORD
+                       {
+                         struct element *temp_element;
+                         temp_element = (ELEMENT *)xmalloc (sizeof (ELEMENT));
+                         temp_element->word = $2;
+                         temp_element->redirect = (REDIRECT *)NULL;
+                         temp_element->next = (struct element *)NULL;
+                         TRACE("reduced cmd_suffix to cmd_suffix WORD");
+                         $1->next = temp_element;
+                         $$ = $1;
+                       }
+       |       redirect
+                       {
+                         struct element *temp_element;
+                         temp_element = (ELEMENT *)xmalloc (sizeof (ELEMENT));
+                         temp_element->word = (WORD_DESC *)NULL;
+                         temp_element->redirect = $1;
+                         temp_element->next = (struct element *)NULL;
+                         TRACE("reduced cmd_sufffix to redirect");
+                         $$ = temp_element;
+                       }
+       |       cmd_suffix redirect                     
+                       {
+                         struct element *temp_element;
+                         temp_element = (ELEMENT *)xmalloc (sizeof (ELEMENT));
+                         temp_element->word = (WORD_DESC *)NULL;
+                         temp_element->redirect = $2;
+                         temp_element->next = (struct element *)NULL;
+                         $1->next = temp_element;
+                         TRACE("reduced cmd_suffix to cmd_suffix redirect");
+                         $$ = $1;
+                       }
+       ;
+
+simple_command:        cmd_prefix cmd_word cmd_suffix
+                       { $$ = new_make_simple_command ($2, $1, $3); }
+       |       cmd_prefix cmd_word
+                       { $$ = new_make_simple_command ($2, $1, (ELEMENT *)NULL); }
+       |       cmd_prefix
+                       { $$ = new_make_simple_command ((WORD_DESC *)NULL, $1, (ELEMENT *)NULL); }
+       |       cmd_name cmd_suffix
+                       { $$ = new_make_simple_command ($1, (ELEMENT *)NULL, $2); }
+       |       cmd_name
+                       {
+                         TRACE("reduced cmd_name to simple_command");
+                         $$ = new_make_simple_command ($1, (ELEMENT *)NULL, (ELEMENT *)NULL);
+                       }
+       ;
+
+redirect_list: redirect
+                       {
+                         $$ = $1;
+                       }
+       |       redirect_list redirect
+                       { 
+                         register REDIRECT *t = $1;
+
+                         while (t->next)
+                           t = t->next;
+                         t->next = $2; 
+                         $$ = $1;
+                       }
+       ;
+
+redirect:      '>' WORD
+                       { $$ = make_redirection ( 1, r_output_direction, $2); }
+       |       '<' WORD
+                       { $$ = make_redirection ( 0, r_input_direction, $2); }
+       |       NUMBER '>' WORD
+                       { $$ = make_redirection ($1, r_output_direction, $3); }
+       |       NUMBER '<' WORD
+                       { $$ = make_redirection ($1, r_input_direction, $3); }
+       |       GREATER_GREATER WORD
+                       { $$ = make_redirection ( 1, r_appending_to, $2); }
+       |       NUMBER GREATER_GREATER WORD
+                       { $$ = make_redirection ($1, r_appending_to, $3); }
+
+       |       LESS_AND NUMBER
+                       { $$ = make_redirection ( 0, r_duplicating_input, $2); }
+       |       NUMBER LESS_AND NUMBER
+                       { $$ = make_redirection ($1, r_duplicating_input, $3); }
+       |       GREATER_AND NUMBER
+                       { $$ = make_redirection ( 1, r_duplicating_output, $2); }
+       |       NUMBER GREATER_AND NUMBER
+                       { $$ = make_redirection ($1, r_duplicating_output, $3); }
+       |       LESS_AND WORD
+                       { $$ = make_redirection ( 0, r_duplicating_input_word, $2); }
+       |       NUMBER LESS_AND WORD
+                       { $$ = make_redirection ($1, r_duplicating_input_word, $3); }
+       |       GREATER_AND WORD
+                       { $$ = make_redirection ( 1, r_duplicating_output_word, $2); }
+       |       NUMBER GREATER_AND WORD
+                       { $$ = make_redirection ($1, r_duplicating_output_word, $3); }
+       |       GREATER_AND '-'
+                       { $$ = make_redirection ( 1, r_close_this, 0); }
+       |       NUMBER GREATER_AND '-'
+                       { $$ = make_redirection ($1, r_close_this, 0); }
+       |       LESS_AND '-'
+                       { $$ = make_redirection ( 0, r_close_this, 0); }
+       |       NUMBER LESS_AND '-'
+                       { $$ = make_redirection ($1, r_close_this, 0); }
+       |       AND_GREATER WORD
+                       { $$ = make_redirection ( 1, r_err_and_out, $2); }
+       |       NUMBER LESS_GREATER WORD
+                       { $$ = make_redirection ( $1, r_input_output, $3); }
+       |       LESS_GREATER WORD
+                       {
+                         REDIRECT *t1, *t2;
+                         extern WORD_DESC *copy_word ();
+
+                         t1 = make_redirection ( 0, r_input_direction, $2);
+                         t2 = make_redirection ( 1, r_output_direction, copy_word ($2));
+                         t1->next = t2;
+                         $$ = t1;
+                       }                         
+       |       GREATER_BAR WORD
+                       { $$ = make_redirection ( 1, r_output_force, $2); }
+       |       NUMBER GREATER_BAR WORD
+                       { $$ = make_redirection ( $1, r_output_force, $3); }
+       |       LESS_LESS WORD
+                       {
+                         $$ = make_redirection ( 0, r_reading_until, $2);
+                         redirection_needing_here_doc = $$;
+                         need_here_doc = 1;
+                       }
+       |       NUMBER LESS_LESS WORD
+                       {
+                         $$ = make_redirection ($1, r_reading_until, $3);
+                         redirection_needing_here_doc = $$;
+                         need_here_doc = 1;
+                       }
+       |       LESS_LESS_MINUS WORD
+                       {
+                         $$ = make_redirection ( 0, r_deblank_reading_until, $2);
+                         redirection_needing_here_doc = $$;
+                         need_here_doc = 1;
+                       }
+       |       NUMBER LESS_LESS_MINUS WORD
+                       {
+                         $$ = make_redirection ($1, r_deblank_reading_until, $3);
+                         redirection_needing_here_doc = $$;
+                         need_here_doc = 1;
+                       }
+       ;
+
+newline_list:  NEWLINE
+                       {
+                         TRACE("reduced NEWLINE to newline_list");
+                         $$  = NEWLINE; /* XXX -- broken */
+                       }
+       |       newline_list NEWLINE
+                       {
+                         TRACE("reduced newline_list newline to newline_list");
+                         $$ = NEWLINE; /* XXX -- broken */
+                       }
+       ;
+
+linebreak:     newline_list
+                       {
+                         TRACE("reduced newline_list to linebreak");
+                         $$ = NEWLINE; /* XXX -- broken */
+                       }
+       |
+                       {
+                         TRACE("reduced empty to linebreak");
+                         $$ = NEWLINE; /* XXX -- broken */
+                       }
+       ;
+
+separator_op:  '&'
+                       {
+                         TRACE("reducing '&' to separator_op");
+                         $$ = '&'; /* XXX -- broken */
+                       }
+       |       ';'
+                       {
+                         TRACE("reducing ';' to separator_op");
+                         $$ = ';'; /* XXX -- broken */
+                       }
+       ;
+
+separator:     separator_op linebreak
+                       {
+                         TRACE("reduced separator_op linebreak to separator");
+                         $$ = $1; /* XXX -- broken */
+                       }
+       |       newline_list
+                       {
+                         TRACE("reduced newline_list to separator");
+                         $$ = ';'; /* XXX -- broken */
+                       }
+       ;
+
+sequential_sep:        ';' linebreak
+                       {
+                         TRACE("reduced ';' linebreak to sequential_sep");
+                         $$ = ';'; /* XXX -- broken */
+                       }
+       |       newline_list
+                       {
+                         TRACE("reduced newline_list to sequential_sep: ';'");
+                         $$ = ';'; /* XXX -- broken */
+                       }
+       ;
+
+%%
+
+/* Initial size to allocate for tokens, and the
+   amount to grow them by. */
+#define TOKEN_DEFAULT_GROW_SIZE 512
+
+/* The token currently being read. */
+int current_token = 0;
+
+/* The last read token, or NULL.  read_token () uses this for context
+   checking. */
+int last_read_token = 0;
+
+/* The token read prior to last_read_token. */
+int token_before_that = 0;
+
+/* Global var is non-zero when end of file has been reached. */
+int EOF_Reached = 0;
+
+/* yy_getc () returns the next available character from input or EOF.
+   yy_ungetc (c) makes `c' the next character to read.
+   init_yy_io (get, unget), makes the function `get' the installed function
+   for getting the next character, and makes `unget' the installed function
+   for un-getting a character. */
+return_EOF ()                  /* does nothing good. */
+{
+  return (EOF);
+}
+
+/* Variables containing the current get and unget functions. */
+
+/* Some stream `types'. */
+#define st_stream 0
+#define st_string 1
+
+Function *get_yy_char = return_EOF;
+Function *unget_yy_char = return_EOF;
+int yy_input_type = st_stream;
+FILE *yy_input_dev = (FILE *)NULL;
+
+/* The current stream name.  In the case of a file, this is a filename. */
+char *stream_name = (char *)NULL;
+
+/* Function to set get_yy_char and unget_yy_char. */
+init_yy_io (get_function, unget_function, type, location)
+     Function *get_function, *unget_function;
+     int type;
+     FILE *location;
+{
+  get_yy_char = get_function;
+  unget_yy_char = unget_function;
+  yy_input_type = type;
+  yy_input_dev = location;
+}
+
+/* Call this to get the next character of input. */
+yy_getc ()
+{
+  return (*get_yy_char) ();
+}
+
+/* Call this to unget C.  That is, to make C the next character
+   to be read. */
+yy_ungetc (c)
+{
+  return (*unget_yy_char) (c);
+}
+
+with_input_from_stdin ()
+{
+  with_input_from_stream (stdin, "stdin");
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*   Let input come from STRING.  STRING is zero terminated.       */
+/*                                                                 */
+/* **************************************************************** */
+
+int
+yy_string_get ()
+{
+  /* If the string doesn't exist, or is empty, EOF found. */
+  if (!(char *)yy_input_dev || !*(char *)yy_input_dev)
+    return (EOF);
+  else
+    {
+      register char *temp = (char *)yy_input_dev;
+      int c = *temp++;
+      yy_input_dev = (FILE *)temp;
+      return (c);
+    }
+}
+
+int
+yy_string_unget (c)
+     int c;
+{
+  register char *temp = (char *)yy_input_dev;
+  *(--temp) = c;
+  yy_input_dev = (FILE *)temp;
+  return (c);
+}
+
+with_input_from_string (string, name)
+     char *string;
+     char *name;
+{
+  init_yy_io (yy_string_get, yy_string_unget, st_string, (FILE *)string);
+  stream_name = savestring (name);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                  Let input come from STREAM.                    */
+/*                                                                 */
+/* **************************************************************** */
+
+int
+yy_stream_get ()
+{
+  if (yy_input_dev)
+    return (getc (yy_input_dev));
+  else
+    return (EOF);
+}
+
+int
+yy_stream_unget (c)
+     int c;
+{
+  return (ungetc (c, yy_input_dev));
+}
+
+with_input_from_stream (stream, name)
+     FILE *stream;
+     char *name;
+{
+  init_yy_io (yy_stream_get, yy_stream_unget, st_stream, stream);
+  stream_name = savestring (name);
+}
+
+typedef struct stream_saver {
+  struct stream_saver *next;
+  Function *getter, *putter;
+  int type, line;
+  char *location, *name;
+} STREAM_SAVER;
+
+/* The globally known line number. */
+int line_number = 0;
+
+STREAM_SAVER *stream_list = (STREAM_SAVER *)NULL;
+
+push_stream ()
+{
+  STREAM_SAVER *temp = (STREAM_SAVER *)xmalloc (sizeof (STREAM_SAVER));
+  temp->type = yy_input_type;
+  temp->location = (char *)yy_input_dev;
+  temp->getter = get_yy_char;
+  temp->putter = unget_yy_char;
+  temp->line = line_number;
+  temp->name = stream_name; stream_name = (char *)NULL;
+  temp->next = stream_list;
+  stream_list = temp;
+  EOF_Reached = line_number = 0;
+}
+
+pop_stream ()
+{
+  if (!stream_list)
+    {
+      EOF_Reached = 1;
+    }
+  else
+    {
+      STREAM_SAVER *temp = stream_list;
+    
+      EOF_Reached = 0;
+      stream_list = stream_list->next;
+
+      if (stream_name)
+       free (stream_name);
+      stream_name = temp->name;
+
+      init_yy_io (temp->getter, temp->putter, temp->type, (FILE *)temp->location);
+      line_number = temp->line;
+      free (temp);
+    }
+}
+static int in_case_pattern_list = 0;
+
+\f
+/* Return a line of text, taken from wherever yylex () reads input.
+   If there is no more input, then we return NULL. */
+char *
+read_a_line ()
+{
+  char *line_buffer = (char *)NULL;
+  int indx = 0, buffer_size = 0;
+  int c;
+
+  while (1)
+    {
+      c = yy_getc ();
+
+      if (c == 0)
+       continue;
+
+      /* If there is no more input, then we return NULL. */
+      if (c == EOF)
+       {
+         c = '\n';
+         if (!line_buffer)
+           return ((char *)NULL);
+       }
+
+      /* `+2' in case the final (200'th) character in the buffer is a newline;
+        otherwise the code below that NULL-terminates it will write over the
+        201st slot and kill the range checking in free(). */
+      if (indx + 2 > buffer_size)
+       if (!buffer_size)
+         line_buffer = (char *)xmalloc (buffer_size = 200);
+       else
+         line_buffer = (char *)xrealloc (line_buffer, buffer_size += 200);
+
+      line_buffer[indx++] = c;
+      if (c == '\n')
+       {
+         line_buffer[indx] = '\0';
+         return (line_buffer);
+       }
+    }
+}
+
+/* Return a line as in read_a_line (), but insure that the prompt is
+   the secondary prompt. */
+char *
+read_secondary_line ()
+{
+  prompt_string_pointer = &ps2_prompt;
+  prompt_again ();
+  return (read_a_line ());
+}
+
+\f
+/* **************************************************************** */
+/*                                                                 */
+/*                             YYLEX ()                            */
+/*                                                                 */
+/* **************************************************************** */
+
+/* Reserved words.  These are only recognized as the first word of a
+   command.  TOKEN_WORD_ALIST. */
+STRING_INT_ALIST word_token_alist[] = {
+  {"if", IF},
+  {"then", THEN},
+  {"else", ELSE},
+  {"elif", ELIF},
+  {"fi", FI},
+  {"case", CASE},
+  {"esac", ESAC},
+  {"for", FOR},
+  {"while", WHILE},
+  {"until", UNTIL},
+  {"do", DO},
+  {"done", DONE},
+  {"in", IN},
+  {"function", FUNCTION},
+  {"{", '{'},
+  {"}", '}'},
+  {"!", BANG},
+  {(char *)NULL, 0}
+};
+
+/* Where shell input comes from.  History expansion is performed on each
+   line when the shell is interactive. */
+char *shell_input_line = (char *)NULL;
+int shell_input_line_index = 0;
+int shell_input_line_size = 0; /* Amount allocated for shell_input_line. */
+int shell_input_line_len = 0;  /* strlen (shell_input_line) */
+
+/* Either zero, or EOF. */
+int shell_input_line_terminator = 0;
+
+/* Return the next shell input character.  This always reads characters
+   from shell_input_line; when that line is exhausted, it is time to
+   read the next line. */
+int
+shell_getc (remove_quoted_newline)
+     int remove_quoted_newline;
+{
+  int c;
+
+  QUIT;
+
+  if (!shell_input_line || !shell_input_line[shell_input_line_index])
+    {
+      register int i, l;
+      char *pre_process_line (), *expansions;
+
+      restart_read_next_line:
+
+      line_number++;
+
+    restart_read:
+
+      i = 0;
+      shell_input_line_terminator = 0;
+
+      clearerr (stdin);
+      while (c = yy_getc ())
+       {
+         if (i + 2 > shell_input_line_size)
+           shell_input_line = (char *)
+             xrealloc (shell_input_line, shell_input_line_size += 256);
+
+         if (c == EOF)
+           {
+             clearerr (stdin);
+
+             if (!i)
+               shell_input_line_terminator = EOF;
+
+             shell_input_line[i] = '\0';
+             break;
+           }
+
+         shell_input_line[i++] = c;
+
+         if (c == '\n')
+           {
+             shell_input_line[--i] = '\0';
+             current_command_line_count++;
+             break;
+           }
+       }
+      shell_input_line_index = 0;
+      shell_input_line_len = i;                /* == strlen (shell_input_line) */
+
+      if (!shell_input_line || !shell_input_line[0])
+       goto after_pre_process;
+
+      if (interactive)
+       {
+         expansions = pre_process_line (shell_input_line, 1, 1);
+
+         free (shell_input_line);
+         shell_input_line = expansions;
+         shell_input_line_len = shell_input_line ?
+                                strlen (shell_input_line) :
+                                0;
+         /* We have to force the xrealloc below because we don't know the
+            true allocated size of shell_input_line anymore. */
+         shell_input_line_size = shell_input_line_len;
+       }
+
+  after_pre_process:
+#if 0
+      if (shell_input_line)
+       {
+         fprintf (stderr, "%s\n", shell_input_line);
+       }
+      else
+       {
+         shell_input_line_size = 0;
+         prompt_string_pointer = &current_prompt_string;
+         prompt_again ();
+         goto restart_read;
+       }
+#endif
+
+      /* Add the newline to the end of this string, iff the string does
+        not already end in an EOF character.  */
+      if (shell_input_line_terminator != EOF)
+       {
+         l = shell_input_line_len;     /* was a call to strlen */
+
+         if (l + 3 > shell_input_line_size)
+           shell_input_line = (char *)xrealloc (shell_input_line,
+                                       1 + (shell_input_line_size += 2));
+
+         strcpy (shell_input_line + l, "\n");
+       }
+    }
+  
+  c = shell_input_line[shell_input_line_index];
+
+  if (c)
+    shell_input_line_index++;
+
+  if (c == '\\' && remove_quoted_newline &&
+      shell_input_line[shell_input_line_index] == '\n')
+    {
+       prompt_again ();
+       goto restart_read_next_line;
+    }
+
+  if (!c && shell_input_line_terminator == EOF)
+    {
+      if (shell_input_line_index != 0)
+       return (NEWLINE);
+      else
+       return (EOF);
+    }
+
+  return (c);
+}
+
+/* Put C back into the input for the shell. */
+shell_ungetc (c)
+     int c;
+{
+  if (shell_input_line && shell_input_line_index)
+    shell_input_line[--shell_input_line_index] = c;
+}
+
+/* Discard input until CHARACTER is seen. */
+discard_until (character)
+     int character;
+{
+  int c;
+  while ((c = shell_getc (0)) != EOF && c != character)
+    ;
+  if (c != EOF )
+    shell_ungetc (c);
+}
+
+#if defined (HISTORY_REEDITING)
+/* Tell readline () that we have some text for it to edit. */
+re_edit (text)
+     char *text;
+{
+#if defined (READLINE)
+  if (strcmp (stream_name, "readline stdin") == 0)
+    bash_re_edit (text);
+#endif /* READLINE */
+}
+#endif /* HISTORY_REEDITING */
+
+/* Non-zero means do no history expansion on this line, regardless
+   of what history_expansion says. */
+int history_expansion_inhibited = 0;
+
+/* Do pre-processing on LINE.  If PRINT_CHANGES is non-zero, then
+   print the results of expanding the line if there were any changes.
+   If there is an error, return NULL, otherwise the expanded line is
+   returned.  If ADDIT is non-zero the line is added to the history
+   list after history expansion.  ADDIT is just a suggestion;
+   REMEMBER_ON_HISTORY can veto, and does.
+   Right now this does history expansion. */
+char *
+pre_process_line (line, print_changes, addit)
+     char *line;
+     int print_changes, addit;
+{
+  char *return_value;
+  return_value = savestring (line);
+
+  return (return_value);
+}
+
+\f
+/* Place to remember the token.  We try to keep the buffer
+   at a reasonable size, but it can grow. */
+char *token = (char *)NULL;
+
+/* Current size of the token buffer. */
+int token_buffer_size = 0;
+
+/* Command to read_token () explaining what we want it to do. */
+#define READ 0
+#define RESET 1
+#define prompt_is_ps1 \
+      (!prompt_string_pointer || prompt_string_pointer == &ps1_prompt)
+
+/* Function for yyparse to call.  yylex keeps track of
+   the last two tokens read, and calls read_token.  */
+
+yylex ()
+{
+  if (interactive && (!current_token || current_token == NEWLINE))
+    {
+      prompt_again ();
+    }
+
+  token_before_that = last_read_token;
+  last_read_token = current_token;
+  current_token = read_token (READ);
+  return (current_token);
+}
+
+/* Called from shell.c when Control-C is typed at top level.  Or
+   by the error rule at top level. */
+reset_parser ()
+{
+  read_token (RESET);
+}
+  
+/* When non-zero, we have read the required tokens
+   which allow ESAC to be the next one read. */
+static int allow_esac_as_next = 0;
+
+/* When non-zero, accept single '{' as a token itself. */
+static int allow_open_brace = 0;
+
+/* DELIMITER is the value of the delimiter that is currently
+   enclosing, or zero for none. */
+static int delimiter = 0;
+static int old_delimiter = 0;
+
+/* When non-zero, an open-brace used to create a group is awaiting a close
+   brace partner. */
+static int open_brace_awaiting_satisfaction = 0;
+
+/* If non-zero, it is the token that we want read_token to return regardless
+   of what text is (or isn't) present to be read.  read_token resets this. */
+int token_to_read = 0;
+
+/* Read the next token.  Command can be READ (normal operation) or 
+   RESET (to normalize state). */
+read_token (command)
+     int command;
+{
+  extern int interactive_shell;        /* Whether the current shell is interactive. */
+  int character;               /* Current character. */
+  int peek_char;               /* Temporary look-ahead character. */
+  int result;                  /* The thing to return. */
+  WORD_DESC *the_word;         /* The value for YYLVAL when a WORD is read. */
+
+  if (token_buffer_size < TOKEN_DEFAULT_GROW_SIZE)
+    {
+      if (token)
+       free (token);
+      token = (char *)xmalloc (token_buffer_size = TOKEN_DEFAULT_GROW_SIZE);
+    }
+
+  if (command == RESET)
+    {
+      delimiter = old_delimiter = 0;
+      open_brace_awaiting_satisfaction = 0;
+      in_case_pattern_list = 0;
+
+      if (shell_input_line)
+       {
+         free (shell_input_line);
+         shell_input_line = (char *)NULL;
+         shell_input_line_size = shell_input_line_index = 0;
+       }
+      last_read_token = NEWLINE;
+      token_to_read = NEWLINE;
+      return (NEWLINE);
+    }
+
+  if (token_to_read)
+    {
+      int rt = token_to_read;
+      token_to_read = 0;
+      return (rt);
+    }
+
+  /* Read a single word from input.  Start by skipping blanks. */
+  while ((character = shell_getc (1)) != EOF && whitespace (character));
+
+  if (character == EOF)
+    return (yacc_EOF);
+
+  if (character == '#' && !interactive)
+    {
+      /* A comment.  Discard until EOL or EOF, and then return a newline. */
+      discard_until ('\n');
+      shell_getc (0);
+
+      /* If we're about to return an unquoted newline, we can go and collect
+        the text of any pending here document. */
+      if (need_here_doc)
+       make_here_document (redirection_needing_here_doc);
+      need_here_doc = 0;
+
+      return (NEWLINE);
+    }
+
+  if (character == '\n')
+    {
+      /* If we're about to return an unquoted newline, we can go and collect
+        the text of any pending here document. */
+      if (need_here_doc)
+       make_here_document (redirection_needing_here_doc);
+      need_here_doc = 0;
+
+      TRACE ("read_token: returning NEWLINE");
+      return (NEWLINE);
+    }
+
+  if (member (character, "()<>;&|"))
+    {
+      /* Please note that the shell does not allow whitespace to
+        appear in between tokens which are character pairs, such as
+        "<<" or ">>".  I believe this is the correct behaviour. */
+      if (character == (peek_char = shell_getc (1)))
+       {
+         switch (character)
+           {
+             /* If '<' then we could be at "<<" or at "<<-".  We have to
+                look ahead one more character. */
+           case '<':
+             peek_char = shell_getc (1);
+             if (peek_char == '-')
+               return (LESS_LESS_MINUS);
+             else
+               {
+                 shell_ungetc (peek_char);
+                 return (LESS_LESS);
+               }
+
+           case '>':
+             return (GREATER_GREATER);
+
+           case ';':
+             in_case_pattern_list = 1;
+             return (SEMI_SEMI);
+
+           case '&':
+             return (AND_AND);
+
+           case '|':
+             return (OR_OR);
+           }
+       }
+      else
+       {
+         if (peek_char == '&')
+           {
+             switch (character)
+               {
+               case '<': return (LESS_AND);
+               case '>': return (GREATER_AND);
+               }
+           }
+         if (character == '<' && peek_char == '>')
+           return (LESS_GREATER);
+         if (character == '>' && peek_char == '|')
+           return (GREATER_BAR);
+         if (peek_char == '>' && character == '&')
+           return (AND_GREATER);
+       }
+      shell_ungetc (peek_char);
+
+      /* If we look like we are reading the start of a function
+        definition, then let the reader know about it so that
+        we will do the right thing with `{'. */
+      if (character == ')' &&
+         last_read_token == '(' && token_before_that == WORD)
+       {
+         allow_open_brace = 1;
+       }
+
+      if (in_case_pattern_list && (character == ')'))
+       in_case_pattern_list = 0;
+#if defined (PROCESS_SUBSTITUTION)
+      /* If we are performing process substitution, let <( and >( by
+        and make a word. */
+      if (!((character == '>' || character == '<') && peek_char == '('))
+#endif /* PROCESS_SUBSTITUTION */
+
+      TRACE("read_token: returning '%c'", character);
+      return (character);
+    }
+
+  /* Hack <&- (close stdin) case. */
+  if (character == '-')
+    {
+      switch (last_read_token)
+       {
+       case LESS_AND:
+       case GREATER_AND:
+         return (character);
+       }
+    }
+  
+  /* Okay, if we got this far, we have to read a word.  Read one,
+     and then check it against the known ones. */
+  {
+    /* Index into the token that we are building. */
+    int token_index = 0;
+
+    /* ALL_DIGITS becomes zero when we see a non-digit. */
+    int all_digits = digit (character);
+
+    /* DOLLAR_PRESENT becomes non-zero if we see a `$'. */
+    int dollar_present = 0;
+
+    /* QUOTED becomes non-zero if we see one of ("), ('), (`), or (\). */
+    int quoted = 0;
+
+    /* Non-zero means to ignore the value of the next character, and just
+       to add it no matter what. */
+    int pass_next_character = 0;
+
+    /* Non-zero means parsing a dollar-paren construct.  It is the count of
+       un-quoted closes we need to see. */
+    int dollar_paren_level = 0;
+
+    /* Non-zero means parsing a dollar-bracket construct ($[...]).  It is
+       the count of un-quoted `]' characters we need to see. */
+    int dollar_bracket_level = 0;
+
+    /* Another level variable.  This one is for dollar_parens inside of
+       double-quotes. */
+    int delimited_paren_level = 0;
+
+    for (;;)
+      {
+       if (character == EOF)
+         goto got_token;
+
+       if (pass_next_character)
+         {
+           pass_next_character = 0;
+           goto got_character;
+         }
+
+      if (delimiter && character == '\\' && delimiter != '\'')
+       {
+         peek_char = shell_getc (0);
+         if (peek_char != '\\')
+           shell_ungetc (peek_char);
+         else
+           {
+             token[token_index++] = character;
+             goto got_character;
+           }
+       }
+
+       /* Handle backslashes.  Quote lots of things when not inside of
+          double-quotes, quote some things inside of double-quotes. */
+          
+       if (character == '\\' && delimiter != '\'')
+         {
+           peek_char = shell_getc (0);
+
+           /* Backslash-newline is ignored in all cases excepting
+              when quoted with single quotes. */
+           if (peek_char == '\n')
+             {
+               character = '\n';
+               goto next_character;
+             }
+           else
+             {
+               shell_ungetc (peek_char);
+
+               /* If the next character is to be quoted, do it now. */
+               if (!delimiter || delimiter == '`' ||
+                   ((delimiter == '"' ) &&
+                    (member (peek_char, slashify_in_quotes))))
+                 {
+                   pass_next_character++;
+                   quoted = 1;
+                   goto got_character;
+                 }
+             }
+         }
+
+       /* This is a hack, in its present form.  If a backquote substitution
+          appears within double quotes, everything within the backquotes
+          should be read as part of a single word.  Jesus.  Now I see why
+          Korn introduced the $() form. */
+       if (delimiter && delimiter == '"' && character == '`')
+         {
+           old_delimiter = delimiter;
+           delimiter = character;
+           goto got_character;
+         }
+
+       if (delimiter)
+         {
+           if (character == delimiter)
+             {
+               if (delimited_paren_level)
+                 {
+#if defined (NOTDEF)
+                   report_error ("Expected ')' before %c", character);
+                   return (NEWLINE);
+#else
+                   goto got_character;
+#endif /* NOTDEF */
+                 }
+
+               delimiter = 0;
+
+               if (old_delimiter == '"' && character == '`')
+                 {
+                   delimiter = old_delimiter;
+                   old_delimiter = 0;
+                 }
+
+               goto got_character;
+             }
+         }
+
+       if (!delimiter || delimiter == '`' || delimiter == '"')
+         {
+#if defined (PROCESS_SUBSTITUTION)
+           if (character == '$' || character == '<' || character == '>')
+#else
+           if (character == '$')
+#endif /* PROCESS_SUBSTITUTION */
+             {
+               peek_char = shell_getc (1);
+               shell_ungetc (peek_char);
+               if (peek_char == '(')
+                 {
+                   if (!delimiter)
+                     dollar_paren_level++;
+                   else
+                     delimited_paren_level++;
+
+                   pass_next_character++;
+                   goto got_character;
+                 }
+               else if (peek_char == '[')
+                 {
+                   if (!delimiter)
+                     dollar_bracket_level++;
+
+                   pass_next_character++;
+                   goto got_character;
+                 }
+             }
+
+           /* If we are parsing a $() or $[] construct, we need to balance
+              parens and brackets inside the construct.  This whole function
+              could use a rewrite. */
+           if (character == '(')
+             {
+               if (delimiter && delimited_paren_level)
+                 delimited_paren_level++;
+
+               if (!delimiter && dollar_paren_level)
+                 dollar_paren_level++;
+             }
+
+           if (character == '[')
+             {
+               if (!delimiter && dollar_bracket_level)
+                 dollar_bracket_level++;
+             }
+
+           /* This code needs to take into account whether we are inside a
+              case statement pattern list, and whether this paren is supposed
+              to terminate it (hey, it could happen).  It's not as simple
+              as just using in_case_pattern_list, because we're not parsing
+              anything while we're reading a $( ) construct.  Maybe we
+              should move that whole mess into the yacc parser. */
+           if (character == ')')
+             {
+               if (delimiter && delimited_paren_level)
+                 delimited_paren_level--;
+
+               if (!delimiter && dollar_paren_level)
+                 {
+                   dollar_paren_level--;
+                   goto got_character;
+                 }
+             }
+
+           if (character == ']')
+             {
+               if (!delimiter && dollar_bracket_level)
+                 {
+                   dollar_bracket_level--;
+                   goto got_character;
+                 }
+             }
+         }
+
+       if (!dollar_paren_level && !dollar_bracket_level && !delimiter &&
+           member (character, " \t\n;&()|<>"))
+         {
+           shell_ungetc (character);
+           goto got_token;
+         }
+    
+       if (!delimiter)
+         {
+           if (character == '"' || character == '`' || character == '\'')
+             {
+               quoted = 1;
+               delimiter = character;
+               goto got_character;
+             }
+         }
+
+       if (all_digits) all_digits = digit (character);
+       if (character == '$') dollar_present = 1;
+
+      got_character:
+
+       token[token_index++] = character;
+
+       if (token_index == (token_buffer_size - 1))
+         token = (char *)xrealloc (token, (token_buffer_size
+                                           += TOKEN_DEFAULT_GROW_SIZE));
+       {
+         char *decode_prompt_string ();
+
+       next_character:
+         if (character == '\n' && interactive && yy_input_type != st_string)
+           prompt_again ();
+       }
+       /* We want to remove quoted newlines (that is, a \<newline> pair)
+          unless we are within single quotes or pass_next_character is
+          set (the shell equivalent of literal-next). */
+       character = shell_getc ((delimiter != '\'') && (!pass_next_character));
+      }
+
+  got_token:
+
+    token[token_index] = '\0';
+       
+    if ((delimiter || dollar_paren_level || dollar_bracket_level) &&
+       character == EOF)
+      {
+       if (dollar_paren_level && !delimiter)
+         delimiter = ')';
+       else if (dollar_bracket_level && !delimiter)
+         delimiter = ']';
+
+       report_error ("Unexpected EOF.  Looking for `%c'.", delimiter);
+       return (-1);
+      }
+
+    if (all_digits)
+      {
+       /* Check to see what thing we should return.  If the last_read_token
+          is a `<', or a `&', or the character which ended this token is
+          a '>' or '<', then, and ONLY then, is this input token a NUMBER.
+          Otherwise, it is just a word, and should be returned as such. */
+
+       if ((character == '<' || character == '>') ||
+           (last_read_token == LESS_AND ||
+            last_read_token == GREATER_AND))
+         {
+           yylval.number = atoi (token); /* was sscanf (token, "%d", &(yylval.number)); */
+           return (NUMBER);
+         }
+      }
+
+    /* Handle special case.  IN is recognized if the last token
+       was WORD and the token before that was FOR or CASE. */
+    if ((last_read_token == WORD) &&
+       ((token_before_that == FOR) || (token_before_that == CASE)) &&
+       (STREQ (token, "in")))
+      {
+       if (token_before_that == CASE)
+         {
+           in_case_pattern_list = 1;
+           allow_esac_as_next++;
+         }
+       TRACE("returning %s as IN", token);
+       return (IN);
+      }
+
+    /* Ditto for DO in the FOR case. */
+    if ((last_read_token == WORD) && (token_before_that == FOR) &&
+       (STREQ (token, "do")))
+      return (DO);
+
+    /* Ditto for ESAC in the CASE case. 
+       Specifically, this handles "case word in esac", which is a legal
+       construct, certainly because someone will pass an empty arg to the
+       case construct, and we don't want it to barf.  Of course, we should
+       insist that the case construct has at least one pattern in it, but
+       the designers disagree. */
+    if (allow_esac_as_next)
+      {
+       allow_esac_as_next--;
+       if (STREQ (token, "esac"))
+         {
+           in_case_pattern_list = 0;
+           return (ESAC);
+         }
+      }
+
+    /* Ditto for `{' in the FUNCTION case. */
+    if (allow_open_brace)
+      {
+       allow_open_brace = 0;
+       if (STREQ (token, "{"))
+         {
+           open_brace_awaiting_satisfaction++;
+           return ('{');
+         }
+      }
+
+    /* Check to see if it is a reserved word.  */
+    if (!dollar_present && !quoted &&
+       reserved_word_acceptable (last_read_token))
+      {
+       int i;
+       for (i = 0; word_token_alist[i].word != (char *)NULL; i++)
+         if (STREQ (token, word_token_alist[i].word))
+           {
+             if (in_case_pattern_list && (word_token_alist[i].token != ESAC))
+               break;
+
+             if (word_token_alist[i].token == ESAC)
+               in_case_pattern_list = 0;
+
+             if (word_token_alist[i].token == '{')
+               open_brace_awaiting_satisfaction++;
+
+             TRACE("returning %s as %d", token, word_token_alist[i].token);
+             return (word_token_alist[i].token);
+           }
+      }
+
+    /* What if we are attempting to satisfy an open-brace grouper? */
+    if (open_brace_awaiting_satisfaction && strcmp (token, "}") == 0)
+      {
+       open_brace_awaiting_satisfaction--;
+       return ('}');
+      }
+
+    the_word = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
+    the_word->word = (char *)xmalloc (1 + strlen (token));
+    strcpy (the_word->word, token);
+    the_word->dollar_present = dollar_present;
+    the_word->quoted = quoted;
+    the_word->assignment = assignment (token);
+
+    yylval.word = the_word;
+
+    result = WORD;
+
+    if ((last_read_token == ASSIGNMENT_WORD || command_word_acceptable (last_read_token)) &&
+        the_word->assignment &&
+        token[0] != '=' &&
+        legal_assignment (token))
+      result = ASSIGNMENT_WORD;
+
+    TRACE("read_token: returning %s as %s", token,
+               (result == WORD) ? "WORD" :
+                                  result == NAME ? "NAME" : "ASSIGNMENT_WORD");
+    if (last_read_token == FUNCTION)
+      allow_open_brace = 1;
+  }
+  return (result);
+}
+
+legal_assignment (s)
+char *s;
+{
+  extern char *index ();
+  char *t = index (s, '=');
+  int result;
+
+  *t = '\0';
+  result = legal_identifier (s);
+  *t = '=';
+  return (result);
+}
+
+/* Return 1 if this token is a legal shell `identifier'; that is, it consists
+   solely of letters, digits, and underscores, and does not begin with a
+   digit. */
+legal_identifier (name)
+     char *name;
+{
+  register char *s;
+
+  if (!name || !*name)
+    return (0);
+
+  if (digit (*name))
+    return (0);
+
+  for (s = name; s && *s; s++)
+    {
+      if (!isletter (*s) && !digit (*s) && (*s != '_'))
+        return (0);
+    }
+  return (1);
+}
+
+/* Return 1 if TOKEN is a token that after being read would allow
+   a reserved word to be seen, else 0. */
+static int
+reserved_word_acceptable (token)
+     int token;
+{
+  if (member (token, "\n;()|&{") ||
+      token == AND_AND ||
+      token == BANG ||
+      token == DO ||
+      token == ELIF ||
+      token == ELSE ||
+      token == IF ||
+      token == FI ||
+      token == ESAC ||
+      token == OR_OR ||
+      token == SEMI_SEMI ||
+      token == THEN ||
+      token == UNTIL ||
+      token == WHILE ||
+      token == 0)
+    return (1);
+  else
+    return (0);
+}
+
+/* Return 1 if TOKEN is a token that after being read would allow
+   a reserved word to be seen, else 0. */
+static int
+command_word_acceptable (token)
+     int token;
+{
+  if (member (token, "\n;()|&{") ||
+      token == AND_AND ||
+      token == BANG ||
+      token == DO ||
+      token == ELIF ||
+      token == ELSE ||
+      token == IF ||
+      token == OR_OR ||
+      token == THEN ||
+      token == UNTIL ||
+      token == WHILE ||
+      token == 0)
+    return (1);
+  else
+    return (0);
+}
+
+reset_readline_prompt ()
+{
+}
+
+/* Add a line to the history list.
+   The variable COMMAND_ORIENTED_HISTORY controls the style of history
+   remembering;  when non-zero, and LINE is not the first line of a
+   complete parser construct, append LINE to the last history line instead
+   of adding it as a new line. */
+bash_add_history (line)
+     char *line;
+{
+}
+\f
+/* Issue a prompt, or prepare to issue a prompt when the next character
+   is read. */
+prompt_again ()
+{
+  char *temp_prompt, *decode_prompt_string ();
+
+  ps1_prompt = "posix$ ";
+  ps2_prompt = "> ";
+
+  if (!prompt_string_pointer)
+    prompt_string_pointer = &ps1_prompt;
+
+  current_prompt_string = *prompt_string_pointer;
+  prompt_string_pointer = &ps2_prompt;
+
+  fprintf (stderr, "%s", current_prompt_string);
+  fflush (stderr);
+}
+
+char *
+decode_prompt_string (string)
+     char *string;
+{
+  char *result;
+  result = savestring (string);
+
+  return (result);
+}
+
+/* Report a syntax error, and restart the parser.  Call here for fatal
+   errors. */
+yyerror ()
+{
+  report_syntax_error ((char *)NULL);
+  reset_parser ();
+}
+
+/* Report a syntax error with line numbers, etc.
+   Call here for recoverable errors.  If you have a message to print,
+   then place it in MESSAGE, otherwise pass NULL and this will figure
+   out an appropriate message for you. */
+report_syntax_error (message)
+     char *message;
+{
+  if (message)
+    {
+      if (!interactive)
+       {
+         char *name = stream_name ? stream_name : "stdin";
+         report_error ("%s:%d: `%s'", name, line_number, message);
+       }
+      else
+       report_error ("%s", message);
+
+      return;
+    }
+
+  if (shell_input_line && *shell_input_line)
+    {
+      char *error_token, *t = shell_input_line;
+      register int i = shell_input_line_index;
+      int token_end = 0;
+
+      if (!t[i] && i)
+       i--;
+
+      while (i && (t[i] == ' ' || t[i] == '\t' || t[i] == '\n'))
+       i--;
+
+      if (i)
+       token_end = i + 1;
+
+      while (i && !member (t[i], " \n\t;|&"))
+       i--;
+
+      while (i != token_end && member (t[i], " \n\t"))
+       i++;
+
+      if (token_end)
+       {
+         error_token = (char *)alloca (1 + (token_end - i));
+         strncpy (error_token, t + i, token_end - i);
+         error_token[token_end - i] = '\0';
+
+         report_error ("syntax error near `%s'", error_token);
+       }
+      else if ((i == 0) && (token_end == 0))   /* a 1-character token */
+       {
+         error_token = (char *) alloca (2);
+         strncpy(error_token, t + i, 1);
+         error_token[1] = '\0';
+
+         report_error ("syntax error near `%s'", error_token);
+       }
+
+      if (!interactive)
+       {
+         char *temp = savestring (shell_input_line);
+         char *name = stream_name ? stream_name : "stdin";
+         int l = strlen (temp);
+
+         while (l && temp[l - 1] == '\n')
+           temp[--l] = '\0';
+
+         report_error ("%s:%d: `%s'", name, line_number, temp);
+         free (temp);
+       }
+    }
+  else
+    report_error ("Syntax error");
+}
+
+/* ??? Needed function. ??? We have to be able to discard the constructs
+   created during parsing.  In the case of error, we want to return
+   allocated objects to the memory pool.  In the case of no error, we want
+   to throw away the information about where the allocated objects live.
+   (dispose_command () will actually free the command. */
+discard_parser_constructs (error_p)
+     int error_p;
+{
+/*   if (error_p) {
+     fprintf (stderr, "*");
+  } */
+}
+   
+handle_eof_input_unit ()
+{
+  EOF_Reached = 1;
+}
+
+TRACE(va_alist)
+va_dcl
+{
+  va_list args;
+  char *format;
+  
+  va_start (args);
+  fprintf(stderr, "TRACE: ");
+  format = va_arg (args, char *);
+  vfprintf (stderr, format, args);
+  fprintf (stderr, "\n");
+        
+  va_end (args);
+}
diff --git a/CWRU/posix-parser/shell.h b/CWRU/posix-parser/shell.h
new file mode 100644 (file)
index 0000000..9fb1442
--- /dev/null
@@ -0,0 +1,71 @@
+/* shell.h -- The data structures used by the shell */
+
+#include "config.h"
+#include "general.h"
+#include "error.h"
+#include "variables.h"
+#include "quit.h"
+#include "maxpath.h"
+#include "unwind_prot.h"
+#include "command.h"
+
+extern int EOF_Reached;
+
+#define NO_PIPE -1
+#define REDIRECT_BOTH -2
+#define IS_DESCRIPTOR -1
+
+#define NO_VARIABLE -1
+
+/* A bunch of stuff for flow of control using setjmp () and longjmp (). */
+#include <setjmp.h>
+extern jmp_buf top_level, catch;
+
+#define NOT_JUMPED 0           /* Not returning from a longjmp. */
+#define FORCE_EOF 1            /* We want to stop parsing. */
+#define DISCARD 2              /* Discard current command. */
+#define EXITPROG 3             /* Unconditionally exit the program now. */
+
+/* Values that can be returned by execute_command (). */
+#define EXECUTION_FAILURE 1
+#define EXECUTION_SUCCESS 0
+
+/* Special exit status used when the shell is asked to execute a
+   binary file as a shell script. */
+#define EX_BINARY_FILE 126
+
+/* The list of characters that are quoted in double-quotes with a
+   backslash.  Other characters following a backslash cause nothing
+   special to happen. */
+#define slashify_in_quotes "\\`$\""
+#define slashify_in_here_document "\\`$"
+
+/* Constants which specify how to handle backslashes and quoting in
+   expand_word_internal ().  Q_DOUBLE_QUOTES means to use the function
+   slashify_in_quotes () to decide whether the backslash should be
+   retained.  Q_HERE_DOCUMENT means slashify_in_here_document () to
+   decide whether to retain the backslash.  Q_KEEP_BACKSLASH means
+   to unconditionally retain the backslash. */
+#define Q_DOUBLE_QUOTES  0x1
+#define Q_HERE_DOCUMENT  0x2
+#define Q_KEEP_BACKSLASH 0x4
+
+extern char **shell_environment;
+extern WORD_LIST *rest_of_args;
+
+/* Generalized global variables. */
+extern int executing, login_shell;
+
+/* Structure to pass around that holds a bitmap of file descriptors
+   to close, and the size of that structure.  Used in execute_cmd.c. */
+struct fd_bitmap {
+  long size;
+  char *bitmap;
+};
+
+#define FD_BITMAP_SIZE 32
+
+#if defined (EIGHT_BIT)
+#  define CTLESC '\001'
+#  define CTLNUL '\002'
+#endif /* EIGHT_BIT */
diff --git a/CWRU/save/unwind_prot.c.sighandling b/CWRU/save/unwind_prot.c.sighandling
new file mode 100644 (file)
index 0000000..a334767
--- /dev/null
@@ -0,0 +1,294 @@
+/* I can't stand it anymore!  Please can't we just write the
+   whole Unix system in lisp or something? */
+
+/* Copyright (C) 1987,1989 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. */
+
+/* **************************************************************** */
+/*                                                                 */
+/*                   Unwind Protection Scheme for Bash             */
+/*                                                                 */
+/* **************************************************************** */
+#include <sys/types.h>
+#include <signal.h>
+#include "config.h"
+#include "general.h"
+#include "unwind_prot.h"
+
+/* If CLEANUP is null, then ARG contains a tag to throw back to. */
+typedef struct _uwp {
+  struct _uwp *next;
+  Function *cleanup;
+  char *arg;
+} UNWIND_ELT;
+
+static void
+  unwind_frame_discard_internal (), unwind_frame_run_internal (),
+  add_unwind_protect_internal (), remove_unwind_protect_internal (),
+  run_unwind_protects_internal ();
+
+static UNWIND_ELT *unwind_protect_list = (UNWIND_ELT *)NULL;
+
+/* Run a function without interrupts. */
+void
+without_interrupts (function, arg1, arg2)
+     VFunction *function;
+     char *arg1, *arg2;
+{
+#if defined (_POSIX_VERSION)
+  static int sets_done = 0;
+  static sigset_t set;
+  sigset_t oset;
+
+  /* SET needs to be initialized only once. */
+  if (sets_done == 0)
+    {
+      sigemptyset (&set);
+      sigaddset (&set, SIGINT);
+      sets_done = 1;
+    }
+  sigemptyset (&oset);
+
+  sigprocmask (SIG_BLOCK, &set, &oset);
+#else
+#  if defined (USG)
+  SigHandler *old_int;
+
+  old_int = (SigHandler *)signal (SIGINT, SIG_IGN);
+#  else
+  int oldmask = sigblock (SIGINT);
+#  endif
+#endif
+
+  (*function)(arg1, arg2);
+
+#if defined (_POSIX_VERSION)
+  sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
+#else
+#  if defined (USG)
+  signal (SIGINT, old_int);
+#  else
+  sigsetmask (oldmask);
+#  endif
+#endif
+}
+
+/* Start the beginning of a region. */
+void
+begin_unwind_frame (tag)
+     char *tag;
+{
+  add_unwind_protect ((Function *)NULL, tag);
+}
+
+/* Discard the unwind protects back to TAG. */
+void
+discard_unwind_frame (tag)
+     char *tag;
+{
+  if (unwind_protect_list)
+    without_interrupts (unwind_frame_discard_internal, tag, (char *)NULL);
+}
+
+/* Run the unwind protects back to TAG. */
+void
+run_unwind_frame (tag)
+     char *tag;
+{
+  if (unwind_protect_list)
+    without_interrupts (unwind_frame_run_internal, tag, (char *)NULL);
+}
+
+/* Add the function CLEANUP with ARG to the list of unwindable things. */
+void
+add_unwind_protect (cleanup, arg)
+     Function *cleanup;
+     char *arg;
+{
+  without_interrupts (add_unwind_protect_internal, (char *)cleanup, arg);
+}
+
+/* Remove the top unwind protect from the list. */
+void
+remove_unwind_protect ()
+{
+  if (unwind_protect_list)
+    without_interrupts
+      (remove_unwind_protect_internal, (char *)NULL, (char *)NULL);
+}
+
+/* Run the list of cleanup functions in unwind_protect_list. */
+void
+run_unwind_protects ()
+{
+  if (unwind_protect_list)
+    without_interrupts
+      (run_unwind_protects_internal, (char *)NULL, (char *)NULL);
+}
+
+/* **************************************************************** */
+/*                                                                 */
+/*                        The Actual Functions                             */
+/*                                                                 */
+/* **************************************************************** */
+
+static void
+add_unwind_protect_internal (cleanup, arg)
+     Function *cleanup;
+     char *arg;
+{
+  UNWIND_ELT *elt;
+
+  elt = (UNWIND_ELT *)xmalloc (sizeof (UNWIND_ELT));
+  elt->cleanup = cleanup;
+  elt->arg = arg;
+  elt->next = unwind_protect_list;
+  unwind_protect_list = elt;
+}
+
+static void
+remove_unwind_protect_internal ()
+{
+  UNWIND_ELT *elt = unwind_protect_list;
+
+  if (elt)
+    {
+      unwind_protect_list = unwind_protect_list->next;
+      free (elt);
+    }
+}
+
+static void
+run_unwind_protects_internal ()
+{
+  UNWIND_ELT *t, *elt = unwind_protect_list;
+
+  while (elt)
+   {
+      /* This function can be run at strange times, like when unwinding
+       the entire world of unwind protects.  Thus, we may come across
+        an element which is simply a label for a catch frame.  Don't call
+        the non-existant function. */
+      if (elt->cleanup)
+       (*(elt->cleanup)) (elt->arg);
+
+      t = elt;
+      elt = elt->next;
+      free (t);
+    }
+  unwind_protect_list = elt;
+}
+
+static void
+unwind_frame_discard_internal (tag)
+     char *tag;
+{
+  UNWIND_ELT *elt;
+
+  while (elt = unwind_protect_list)
+    {
+      unwind_protect_list = unwind_protect_list->next;
+      if (!elt->cleanup && (STREQ (elt->arg, tag)))
+       {
+         free (elt);
+         break;
+       }
+      else
+       free (elt);
+    }
+}
+
+static void
+unwind_frame_run_internal (tag)
+     char *tag;
+{
+  UNWIND_ELT *elt;
+
+  while (elt = unwind_protect_list)
+    {
+      unwind_protect_list = elt->next;
+
+      /* If tag, then compare. */
+      if (!elt->cleanup)
+       {
+         if (STREQ (elt->arg, tag))
+           {
+             free (elt);
+             break;
+           }
+         free (elt);
+         continue;
+       }
+      else
+       {
+         (*(elt->cleanup)) (elt->arg);
+         free (elt);
+       }
+    }
+}
+
+/* Structure describing a saved variable and the value to restore it to. */
+typedef struct {
+  int *variable;
+  char *desired_setting;
+  int size;
+} SAVED_VAR;
+
+/* Restore the value of a variable, based on the contents of SV.  If
+   sv->size is greater than sizeof (int), sv->desired_setting points to
+   a block of memory SIZE bytes long holding the value, rather than the
+   value itself.  This block of memory is copied back into the variable. */
+static void
+restore_variable (sv)
+     SAVED_VAR *sv;
+{
+  if (sv->size > sizeof (int))
+    {
+      bcopy ((char *)sv->desired_setting, (char *)sv->variable, sv->size);
+      free (sv->desired_setting);
+    }
+  else
+    *(sv->variable) = (int)sv->desired_setting;
+
+  free (sv);
+}
+
+/* Save the value of a variable so it will be restored when unwind-protects
+   are run.  VAR is a pointer to the variable.  VALUE is the value to be
+   saved.  SIZE is the size in bytes of VALUE.  If SIZE is bigger than what
+   can be saved in an int, memory will be allocated and the value saved
+   into that using bcopy (). */
+void
+unwind_protect_var (var, value, size)
+     int *var;
+     char *value;
+     int size;
+{
+  SAVED_VAR *s = (SAVED_VAR *)xmalloc (sizeof (SAVED_VAR));
+
+  s->variable = var;
+  if (size > sizeof (int))
+    {
+      s->desired_setting = (char *)xmalloc (size);
+      bcopy (value, (char *)s->desired_setting, size);
+    }
+  else
+    s->desired_setting = value;
+  s->size = size;
+  add_unwind_protect ((Function *)restore_variable, (char *)s);
+}
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 447877e..6dff94f 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -26,6 +26,7 @@ include               d
 lib            d
 lib/glob       d
 lib/glob/doc   d
+lib/intl       d
 lib/malloc     d
 lib/readline   d
 lib/readline/doc d
@@ -35,9 +36,11 @@ lib/termcap  d
 lib/termcap/grot d
 lib/tilde      d
 lib/tilde/doc  d
+po             d
 support                d
 tests          d
 tests/misc     d
+ABOUT-NLS      f
 CHANGES                f
 COMPAT         f
 COPYING                f
@@ -208,6 +211,7 @@ cross-build/opennt.cache    f
 include/ansi_stdlib.h  f
 include/chartypes.h    f
 include/filecntl.h     f
+include/gettext.h      f
 include/maxpath.h      f
 include/memalloc.h     f
 include/ocache.h       f
@@ -235,6 +239,47 @@ lib/glob/collsyms.h        f
 lib/glob/doc/Makefile  f
 lib/glob/doc/glob.texi f
 lib/glob/ndir.h                f
+lib/intl/ChangeLog     f
+lib/intl/Makefile.in   f
+lib/intl/VERSION       f
+lib/intl/bindtextdom.c f
+lib/intl/config.charset        f
+lib/intl/dcgettext.c   f
+lib/intl/dcigettext.c  f
+lib/intl/dcngettext.c  f
+lib/intl/dgettext.c    f
+lib/intl/dngettext.c   f
+lib/intl/eval-plural.h f
+lib/intl/explodename.c f
+lib/intl/finddomain.c  f
+lib/intl/gettext.c     f
+lib/intl/gettextP.h    f
+lib/intl/gmo.h         f
+lib/intl/hash-string.h f
+lib/intl/intl-compat.c f
+lib/intl/l10nflist.c   f
+lib/intl/libgnuintl.h.in       f
+lib/intl/loadinfo.h    f
+lib/intl/loadmsgcat.c  f
+lib/intl/localcharset.c        f
+lib/intl/localcharset.h        f
+lib/intl/locale.alias  f
+lib/intl/localealias.c f
+lib/intl/localename.c  f
+lib/intl/log.c         f
+lib/intl/ngettext.c    f
+lib/intl/os2compat.c   f
+lib/intl/os2compat.h   f
+lib/intl/osdep.c       f
+lib/intl/plural-exp.c  f
+lib/intl/plural-exp.h  f
+lib/intl/plural.c      f
+lib/intl/plural.y      f
+lib/intl/ref-add.sin   f
+lib/intl/ref-del.sin   f
+lib/intl/relocatable.c f
+lib/intl/relocatable.h f
+lib/intl/textdomain.c  f
 lib/malloc/Makefile.in f
 lib/malloc/getpagesize.h       f
 lib/malloc/imalloc.h   f
@@ -410,6 +455,24 @@ lib/tilde/doc/Makefile     f
 lib/tilde/tilde.c      f
 lib/tilde/tilde.h      f
 lib/tilde/shell.c      f
+po/LINGUAS             f
+po/Makefile.in.in      f
+po/Makevars            f
+po/POTFILES.in         f
+po/Rules-builtins      f
+po/Rules-quot          f
+po/bash.pot            f
+po/boldquot.sed                f
+po/builtins.pot                f
+po/en@quot.header      f
+po/en@boldquot.header  f
+po/en@quot.po          f
+po/en@boldquot.po      f
+po/en@quot.gmo         f
+po/en@boldquot.gmo     f
+po/insert-header.sin   f
+po/quot.sed            f
+po/remove-potcdate.sin f
 CWRU/misc/open-files.c f
 CWRU/misc/sigs.c       f
 CWRU/misc/sigstat.c    f
@@ -441,6 +504,7 @@ doc/fdl.txt f
 support/Makefile.in    f
 support/bashversion.c  f
 support/config.guess   f
+support/config.rpath   f       755
 support/config.sub     f
 support/printenv.sh    f       755
 support/printenv.c     f
@@ -449,6 +513,7 @@ support/missing             f       755
 support/mkclone                f       755
 support/mkconffiles    f       755
 support/mkdirs         f       755
+support/mkinstalldirs  f       755
 support/mkversion.sh   f       755
 support/mksignames.c   f
 support/bashbug.sh     f
diff --git a/MANIFEST.doc b/MANIFEST.doc
new file mode 100644 (file)
index 0000000..736ad5b
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# Master Manifest file for documentation-only distribution
+#
+doc    d
+MANIFEST.doc   f
+doc/article.ps f
+doc/rose94.ps  f
+doc/bash.ps            f
+doc/bashbug.ps f
+doc/builtins.ps        f
+doc/rbash.ps   f
+doc/bashref.ps f
+doc/bashref.dvi        f
+doc/bash.0             f
+doc/bashbug.0          f
+doc/builtins.0 f
+doc/rbash.0    f
+doc/article.txt        f
+doc/bash.html          f
+doc/bashref.html       f
+doc/article.pdf        f
+doc/bash.pdf   f
+doc/bashref.pdf        f
+doc/rose94.pdf f
index dd0ee93..4c94336 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile for bash-2.05b, version 2.145
+# Makefile for bash-3.0, version 2.152
 #
 # Copyright (C) 1996-2002 Free Software Foundation, Inc.
 
 # Make sure the first target in the makefile is the right one
 all: .made
 
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
 # Include some boilerplate Gnu makefile definitions.
 prefix = @prefix@
 
@@ -28,6 +36,7 @@ libdir = @libdir@
 infodir = @infodir@
 includedir = @includedir@
 datadir = @datadir@
+localedir = $(datadir)/locale
 
 mandir = @mandir@
 manpfx = man
@@ -44,6 +53,7 @@ DESTDIR =
 
 topdir = @top_srcdir@
 BUILD_DIR = @BUILD_DIR@
+top_builddir = @BUILD_DIR@
 srcdir = @srcdir@
 VPATH = .:@srcdir@
 
@@ -113,12 +123,14 @@ LOCAL_CFLAGS = @LOCAL_CFLAGS@ ${DEBUG}
 DEFS = @DEFS@
 LOCAL_DEFS = @LOCAL_DEFS@
 
+LOCALE_DEFS = -DLOCALEDIR='"$(localedir)"' -DPACKAGE='"$(PACKAGE)"'
+
 LOCAL_LIBS = @LOCAL_LIBS@
 LIBS = $(BUILTINS_LIB) $(LIBRARIES) @LIBS@
 STATIC_LD = @STATIC_LD@
 LOCAL_LDFLAGS = @LOCAL_LDFLAGS@
 
-SYSTEM_FLAGS = -DPROGRAM='"$(Program)"' -DCONF_HOSTTYPE='"$(Machine)"' -DCONF_OSTYPE='"$(OS)"' -DCONF_MACHTYPE='"$(MACHTYPE)"' -DCONF_VENDOR='"$(VENDOR)"'
+SYSTEM_FLAGS = -DPROGRAM='"$(Program)"' -DCONF_HOSTTYPE='"$(Machine)"' -DCONF_OSTYPE='"$(OS)"' -DCONF_MACHTYPE='"$(MACHTYPE)"' -DCONF_VENDOR='"$(VENDOR)"' $(LOCALE_DEFS)
 
 BASE_CCFLAGS = $(PROFILE_FLAGS) $(SYSTEM_FLAGS) $(LOCAL_DEFS) \
          $(DEFS) $(LOCAL_CFLAGS) $(INCLUDES)
@@ -130,7 +142,7 @@ CCFLAGS_FOR_BUILD = $(BASE_CCFLAGS) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD)
 LDFLAGS = @LDFLAGS@ $(STATIC_LD) $(LOCAL_LDFLAGS) $(PROFILE_FLAGS) $(CFLAGS)
 LDFLAGS_FOR_BUILD = $(LDFLAGS)
 
-INCLUDES = -I. @RL_INCLUDE@ -I$(srcdir) -I$(BASHINCDIR) -I$(LIBSRC)
+INCLUDES = -I. @RL_INCLUDE@ -I$(srcdir) -I$(BASHINCDIR) -I$(LIBSRC) $(INTL_INC)
 
 GCC_LINT_FLAGS = -Wall -Wshadow -Wpointer-arith -Wcast-qual \
                 -Wcast-align -Wstrict-prototypes -Wconversion \
@@ -149,6 +161,9 @@ LIBSRC = $(srcdir)/$(LIBSUBDIR)
 
 SUBDIR_INCLUDES = -I. @RL_INCLUDE@ -I$(topdir) -I$(topdir)/$(LIBSUBDIR)
 
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+
 # the bash library
 # the library is a mix of functions that the C library does not provide on
 # some platforms and general shell utility functions
@@ -300,6 +315,22 @@ TILDE_DEP = $(TILDE_LIBRARY)
 TILDE_SOURCE   = $(TILDE_LIBSRC)/tilde.c $(TILDE_LIBSRC)/tilde.h
 TILDE_OBJ      = $(TILDE_LIBDIR)/tilde.o
 
+# libintl
+INTL_LIBSRC = $(LIBSRC)/intl
+INTL_LIBDIR = $(dot)/$(LIBSUBDIR)/intl
+INTL_ABSSRC = ${topdir}/$(INTL_LIB)
+
+INTL_LIB     = @LIBINTL@
+INTL_LIBRARY = $(INTL_LIBDIR)/libintl.a
+INTL_DEP = @INTL_DEP@
+INTL_INC = @INTL_INC@
+
+# tests
+LIBINTL = @LIBINTL@
+LTLIBINTL = @LTLIBINTL@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+
 # Our malloc.
 MALLOC_TARGET = @MALLOC_TARGET@
 
@@ -341,9 +372,9 @@ BASHINCFILES =       $(BASHINCDIR)/posixstat.h $(BASHINCDIR)/ansi_stdlib.h \
                 $(BASHINCDIR)/ocache.h
 
 LIBRARIES = $(SHLIB_LIB) $(READLINE_LIB) $(HISTORY_LIB) $(TERMCAP_LIB) $(GLOB_LIB) \
-           $(TILDE_LIB) $(MALLOC_LIB) $(LOCAL_LIBS)
+           $(TILDE_LIB) $(MALLOC_LIB) $(INTL_LIB) $(LOCAL_LIBS)
 
-LIBDEP = $(SHLIB_DEP) $(READLINE_DEP) $(HISTORY_DEP) $(TERMCAP_DEP) $(GLOB_DEP) \
+LIBDEP = $(SHLIB_DEP) $(INTL_DEP) $(READLINE_DEP) $(HISTORY_DEP) $(TERMCAP_DEP) $(GLOB_DEP) \
         $(TILDE_DEP) $(MALLOC_DEP)
 
 LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(GLOB_LDFLAGS) \
@@ -443,6 +474,10 @@ BUILTINS_DEP = $(BUILTINS_LIBRARY)
 DOCSRC = $(srcdir)/doc
 DOCDIR = $(dot)/doc
 
+# Translations and other i18n support files
+PO_SRC = $(srcdir)/po/
+PO_DIR = $(dot)/po/
+
 SIGNAMES_SUPPORT = $(SUPPORT_SRC)mksignames.c
 
 SUPPORT_SRC = $(srcdir)/support/
@@ -455,12 +490,13 @@ CREATED_SUPPORT = signames.h recho$(EXEEXT) zecho$(EXEEXT) printenv$(EXEEXT) \
                  mksyntax${EXEEXT} syntax.c $(VERSPROG) $(VERSOBJ) \
                  buildversion.o
 CREATED_CONFIGURE = config.h config.cache config.status config.log \
-                   stamp-h
+                   stamp-h po/POTFILES
 CREATED_MAKEFILES = Makefile builtins/Makefile doc/Makefile \
                    lib/readline/Makefile lib/glob/Makefile \
                    lib/sh/Makefile lib/tilde/Makefile lib/malloc/Makefile \
                    lib/termcap/Makefile examples/loadables/Makefile \
-                   examples/loadables/perl/Makefile support/Makefile
+                   examples/loadables/perl/Makefile support/Makefile \
+                   lib/intl/Makefile po/Makefile po/Makefile.in
 
 # Keep GNU Make from exporting the entire environment for small machines.
 .NOEXPORT:
@@ -507,7 +543,7 @@ bashversion$(EXEEXT):       patchlevel.h conftypes.h version.h buildversion.o $(SUPPOR
        $(CC_FOR_BUILD) $(CCFLAGS_FOR_BUILD) -o $@ $(SUPPORT_SRC)bashversion.c buildversion.o
 
 buildversion.o: version.h conftypes.h patchlevel.h $(srcdir)/version.c
-       $(CC_FOR_BUILD) $(CCFLAGS_FOR_BUILD) -c -o $@ $(srcdir)/version.c
+       $(CC_FOR_BUILD) $(CCFLAGS_FOR_BUILD) -DBUILDTOOL -c -o $@ $(srcdir)/version.c
 
 # old rules
 GRAM_H = parser-built
@@ -559,6 +595,11 @@ $(SHLIB_LIBRARY): config.h ${SHLIB_SOURCE}
        @(cd ${SH_LIBDIR} && \
                $(MAKE) $(MFLAGS) DEBUG=${DEBUG} ${SHLIB_LIBNAME}) || exit 1
 
+${INTL_LIBRARY}: config.h ${INTL_LIBDIR}/Makefile
+       @echo making $@ in ${INTL_LIBDIR}
+       @(cd ${INTL_LIBDIR} && \
+               $(MAKE) $(MFLAGS) libintl.a) || exit 1
+
 mksignames$(EXEEXT):   $(SUPPORT_SRC)mksignames.c
        $(CC_FOR_BUILD) $(CCFLAGS_FOR_BUILD) -o $@ $(SUPPORT_SRC)mksignames.c
 
@@ -645,9 +686,10 @@ TAGS:      $(SOURCES) $(BUILTIN_C_SRC) $(LIBRARY_SOURCE)
 # Targets that actually do things not part of the build
 
 installdirs:
-       @${SHELL} $(SUPPORT_SRC)mkdirs $(DESTDIR)$(bindir)
-       @${SHELL} $(SUPPORT_SRC)mkdirs $(DESTDIR)$(man1dir)
-       @${SHELL} $(SUPPORT_SRC)mkdirs $(DESTDIR)$(infodir)
+       @${SHELL} $(SUPPORT_SRC)mkinstalldirs $(DESTDIR)$(bindir)
+       @${SHELL} $(SUPPORT_SRC)mkinstalldirs $(DESTDIR)$(man1dir)
+       @${SHELL} $(SUPPORT_SRC)mkinstalldirs $(DESTDIR)$(infodir)
+       -( cd $(PO_DIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
 
 install:       .made installdirs
        $(INSTALL_PROGRAM) $(INSTALLMODE) $(Program) $(DESTDIR)$(bindir)/$(Program)
@@ -657,6 +699,7 @@ install:    .made installdirs
                man3dir=$(man3dir) man3ext=$(man3ext) \
                infodir=$(infodir) htmldir=$(htmldir) DESTDIR=$(DESTDIR) $@ )
        -( cd $(DEFDIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
+       -( cd $(PO_DIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
 
 install-strip:
        $(MAKE) $(MFLAGS) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
@@ -669,9 +712,13 @@ uninstall: .made
                man1dir=$(man1dir) man1ext=$(man1ext) \
                man3dir=$(man3dir) man3ext=$(man3ext) \
                infodir=$(infodir) htmldir=$(htmldir) DESTDIR=$(DESTDIR) $@ )
+       -( cd $(PO_DIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
 
 .PHONY: basic-clean clean realclean maintainer-clean distclean mostlyclean maybe-clean
 
+LIB_SUBDIRS = ${RL_LIBDIR}  ${HIST_LIBDIR} ${TERM_LIBDIR} ${GLOB_LIBDIR} \
+               ${INTL_LIBDIR} ${TILDE_LIBDIR} ${ALLOC_LIBDIR} ${SH_LIBDIR}
+
 basic-clean:
        $(RM) $(OBJECTS) $(Program) bashbug
        $(RM) .build .made version.h pathnames.h
@@ -680,38 +727,29 @@ clean:    basic-clean
        ( cd $(DOCDIR) && $(MAKE) $(MFLAGS) $@ )
        ( cd builtins && $(MAKE) $(MFLAGS) $@ )
        -( cd $(SDIR) && $(MAKE) $(MFLAGS) $@ )
-       -(cd $(RL_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(HIST_LIBDIR) && test -f Makefile && $(MAKE) $(MFLAGS) $@)
-       -(cd $(TERM_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
+       -for libdir in ${LIB_SUBDIRS}; do \
+               (cd $$libdir && test -f Makefile && $(MAKE) $(MFLAGS) $@) ;\
+       done
+       -( cd $(PO_DIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
        $(RM) $(CREATED_SUPPORT)
 
 mostlyclean: basic-clean
        ( cd $(DOCDIR) && $(MAKE) $(MFLAGS) $@ )
        ( cd builtins && $(MAKE) $(MFLAGS) $@ )
        -( cd $(SDIR) && $(MAKE) $(MFLAGS) $@ )
-       -(cd $(RL_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(HIST_LIBDIR) && test -f Makefile && $(MAKE) $(MFLAGS) $@)
-       -(cd $(TERM_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
+       -for libdir in ${LIB_SUBDIRS}; do \
+               (cd $$libdir && test -f Makefile && $(MAKE) $(MFLAGS) $@) ;\
+       done
+       -( cd $(PO_DIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
 
 distclean:     basic-clean maybe-clean
        ( cd $(DOCDIR) && $(MAKE) $(MFLAGS) $@ )
        ( cd builtins && $(MAKE) $(MFLAGS) $@ )
        -( cd $(SDIR) && $(MAKE) $(MFLAGS) $@ )
-       -(cd $(RL_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(HIST_LIBDIR) && test -f Makefile && $(MAKE) $(MFLAGS) $@)
-       -(cd $(TERM_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
+       -for libdir in ${LIB_SUBDIRS}; do \
+               (cd $$libdir && test -f Makefile && $(MAKE) $(MFLAGS) $@) ;\
+       done
+       -( cd $(PO_DIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
        $(RM) $(CREATED_CONFIGURE) tags TAGS 
        $(RM) $(CREATED_SUPPORT) Makefile $(CREATED_MAKEFILES)
 
@@ -722,13 +760,10 @@ maintainer-clean: basic-clean
        ( cd $(DOCDIR) && $(MAKE) $(MFLAGS) $@ )
        ( cd builtins && $(MAKE) $(MFLAGS) $@ )
        ( cd $(SDIR) && $(MAKE) $(MFLAGS) $@ )
-       -(cd $(RL_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(HIST_LIBDIR) && test -f Makefile && $(MAKE) $(MFLAGS) $@)
-       -(cd $(TERM_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(GLOB_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(TILDE_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(ALLOC_LIBDIR) && $(MAKE) $(MFLAGS) $@)
-       -(cd $(SH_LIBDIR) && $(MAKE) $(MFLAGS) $@)
+       -for libdir in ${LIB_SUBDIRS}; do \
+               (cd $$libdir && test -f Makefile && $(MAKE) $(MFLAGS) $@) ;\
+       done
+       -( cd $(PO_DIR) ; $(MAKE) $(MFLAGS) DESTDIR=$(DESTDIR) $@ )
        $(RM) $(CREATED_CONFIGURE) $(CREATED_MAKEFILES)
        $(RM) $(CREATED_SUPPORT) Makefile
 
@@ -758,9 +793,9 @@ symlinks:
 dist:  force
        @echo Bash distributions are created using $(srcdir)/support/mkdist.
        @echo Here is a sample of the necessary commands:
-       @echo $(Program) $(srcdir)/support/mkdist -m $(srcdir)/MANIFEST -s $(srcdir) -r ${Program} $(Version)-${RELSTATUS}
-       @echo tar cf $(Program)-$(Version)-${RELSTATUS}.tar ${Program}-$(Version)-${RELSTATUS}
-       @echo gzip $(Program)-$(Version)-${RELSTATUS}.tar
+       @echo $(Program) $(srcdir)/support/mkdist -m $(srcdir)/MANIFEST -s $(srcdir) -r ${PACKAGE} $(PACKAGE_VERSION)
+       @echo tar cf $(PACKAGE)-${PACKAGE_VERSION}.tar ${PACKAGE}-$(PACKAGE_VERSION)
+       @echo gzip $(PACKAGE)-$(PACKAGE_VERSION).tar
 
 depend:        depends
 
@@ -1069,6 +1104,36 @@ shell.o: $(TILDE_LIBSRC)/tilde.h
 subst.o: $(TILDE_LIBSRC)/tilde.h
 variables.o: $(TILDE_LIBSRC)/tilde.h
 
+# libintl dependencies
+arrayfunc.o: bashintl.h $(BASHINCDIR)/gettext.h
+bashhist.o: bashintl.h $(BASHINCDIR)/gettext.h
+bashline.o: bashintl.h $(BASHINCDIR)/gettext.h
+braces.o: bashintl.h $(BASHINCDIR)/gettext.h
+error.o: bashintl.h $(BASHINCDIR)/gettext.h
+eval.o: bashintl.h $(BASHINCDIR)/gettext.h
+execute_cmd.o: bashintl.h $(BASHINCDIR)/gettext.h
+expr.o: bashintl.h $(BASHINCDIR)/gettext.h
+general.o: bashintl.h $(BASHINCDIR)/gettext.h
+input.o: bashintl.h $(BASHINCDIR)/gettext.h
+jobs.o: bashintl.h $(BASHINCDIR)/gettext.h
+mailcheck.o: bashintl.h $(BASHINCDIR)/gettext.h
+make_cmd.o: bashintl.h $(BASHINCDIR)/gettext.h
+nojobs.o: bashintl.h $(BASHINCDIR)/gettext.h
+parse.y: bashintl.h $(BASHINCDIR)/gettext.h
+pcomplete.o: bashintl.h $(BASHINCDIR)/gettext.h
+pcomplib.o: bashintl.h $(BASHINCDIR)/gettext.h
+print_cmd.o: bashintl.h $(BASHINCDIR)/gettext.h
+redir.o: bashintl.h $(BASHINCDIR)/gettext.h
+shell.o: bashintl.h $(BASHINCDIR)/gettext.h
+sig.o: bashintl.h $(BASHINCDIR)/gettext.h
+siglist.o: bashintl.h $(BASHINCDIR)/gettext.h
+subst.o: bashintl.h $(BASHINCDIR)/gettext.h
+test.o: bashintl.h $(BASHINCDIR)/gettext.h
+trap.o: bashintl.h $(BASHINCDIR)/gettext.h
+variables.o: bashintl.h $(BASHINCDIR)/gettext.h
+version.o: bashintl.h $(BASHINCDIR)/gettext.h
+xmalloc.o: bashintl.h $(BASHINCDIR)/gettext.h
+
 # XXX - dependencies checked through here
 
 # builtin c sources
@@ -1271,6 +1336,43 @@ builtins/complete.o: builtins.h
 builtins/complete.o: pcomplete.h
 builtins/complete.o: ${DEFSRC}/common.h ${DEFSRC}/bashgetopt.h
 
+# libintl dependencies
+builtins/bind.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/break.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/caller.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/cd.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/common.c: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/complete.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/declare.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/enable.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/evalfile.c: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/exec.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/exit.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/fc.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/fg_bg.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/getopt.c: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/hash.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/help.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/history.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/inlib.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/jobs.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/kill.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/let.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/mkbuiltins.c: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/printf.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/pushd.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/read.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/return.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/set.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/setattr.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/shift.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/shopt.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/source.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/suspend.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/type.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/ulimit.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+builtins/umask.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+
 # builtin library dependencies
 builtins/bind.o: $(RL_LIBSRC)/chardefs.h $(RL_LIBSRC)/readline.h
 builtins/bind.o: $(RL_LIBSRC)/keymaps.h $(RL_LIBSRC)/rlstdc.h
diff --git a/NOTES b/NOTES
index 31068d0..d6e3d81 100644 (file)
--- a/NOTES
+++ b/NOTES
@@ -324,3 +324,6 @@ Platform-Specific Configuration and Operation Notes
 
 15.  Configure with `CC=xlc' if you don't have gcc on AIX 4.2 and later
      versions.  `xlc' running in `cc' mode has trouble compiling error.c.
+
+16.  Configure --disable-multibyte on NetBSD versions (1.4 through at least
+     1.6.1) that include wctype.h but do not define wctype_t.
index 11bcbe3..12b3b80 100644 (file)
@@ -1886,3 +1886,2033 @@ AC_DEFUN([AM_PATH_LISPDIR],
  ])
  AC_SUBST(lispdir)
 ])
+
+dnl
+dnl tests added for gettext
+dnl
+# codeset.m4 serial AM1 (gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+  AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+    [AC_TRY_LINK([#include <langinfo.h>],
+      [char* cs = nl_langinfo(CODESET);],
+      am_cv_langinfo_codeset=yes,
+      am_cv_langinfo_codeset=no)
+    ])
+  if test $am_cv_langinfo_codeset = yes; then
+    AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+      [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+  fi
+])
+# gettext.m4 serial 20 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl    default (if it is not specified or empty) is 'no-libtool'.
+dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl    depending on --{enable,disable}-{shared,static} and on the presence of
+dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl    $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl    implementations (in libc or libintl) without the ngettext() function
+dnl    will be ignored.  If NEEDSYMBOL is specified and is
+dnl    'need-formatstring-macros', then GNU gettext implementations that don't
+dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries.  If empty,
+dnl    the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl    and used.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl    Catalog format: none
+dnl    Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+  dnl Argument checking.
+  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+  define(gt_included_intl, ifelse([$1], [external], [no], [yes]))
+  define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], []))
+
+  AC_REQUIRE([AM_PO_SUBDIRS])dnl
+  ifelse(gt_included_intl, yes, [
+    AC_REQUIRE([AM_INTL_SUBDIR])dnl
+  ])
+
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Sometimes libintl requires libiconv, so first search for libiconv.
+  dnl Ideally we would do this search only after the
+  dnl      if test "$USE_NLS" = "yes"; then
+  dnl        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+  dnl the configure script would need to contain the same shell code
+  dnl again, outside any 'if'. There are two solutions:
+  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+  dnl documented, we avoid it.
+  ifelse(gt_included_intl, yes, , [
+    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+  ])
+
+  dnl Set USE_NLS.
+  AM_NLS
+
+  ifelse(gt_included_intl, yes, [
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+  ])
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+  dnl If we use NLS figure out what method
+  if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+    ifelse(gt_included_intl, yes, [
+      AC_MSG_CHECKING([whether included gettext is requested])
+      AC_ARG_WITH(included-gettext,
+        [  --with-included-gettext use the GNU gettext library included here],
+        nls_cv_force_use_gnu_gettext=$withval,
+        nls_cv_force_use_gnu_gettext=no)
+      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+    ])
+        dnl User does not insist on using GNU NLS library.  Figure out what
+        dnl to use.  If GNU gettext is available we use this.  Else we have
+        dnl to fall back to GNU NLS library.
+
+        dnl Add a version number to the cache macros.
+        define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1)))
+        define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc])
+        define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl])
+
+        AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+         [AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;],
+            [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings],
+            gt_cv_func_gnugettext_libc=yes,
+            gt_cv_func_gnugettext_libc=no)])
+
+        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+          dnl Sometimes libintl requires libiconv, so first search for libiconv.
+          ifelse(gt_included_intl, yes, , [
+            AM_ICONV_LINK
+          ])
+          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+          dnl even if libiconv doesn't exist.
+          AC_LIB_LINKFLAGS_BODY([intl])
+          AC_CACHE_CHECK([for GNU gettext in libintl],
+            gt_cv_func_gnugettext_libintl,
+           [gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+            dnl Now see whether libintl exists and does not depend on libiconv.
+            AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+              [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+              gt_cv_func_gnugettext_libintl=yes,
+              gt_cv_func_gnugettext_libintl=no)
+            dnl Now see whether libintl exists and depends on libiconv.
+            if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+                [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+               [LIBINTL="$LIBINTL $LIBICONV"
+                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                gt_cv_func_gnugettext_libintl=yes
+               ])
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"])
+        fi
+
+        dnl If an already present or preinstalled GNU gettext() is found,
+        dnl use it.  But if this macro is used in GNU gettext, and GNU
+        dnl gettext is already preinstalled in libintl, we update this
+        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
+        if test "$gt_cv_func_gnugettext_libc" = "yes" \
+           || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+          dnl Reset the values set by searching for libintl.
+          LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+    ifelse(gt_included_intl, yes, [
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+          dnl GNU gettext is not found in the C library.
+          dnl Fall back on included GNU gettext library.
+          nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions used to generate GNU NLS library.
+        BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV"
+        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions to use GNU gettext tools.
+        CATOBJEXT=.gmo
+      fi
+    ])
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+      AC_DEFINE(ENABLE_NLS, 1,
+        [Define to 1 if translation of program messages to the user's native language
+   is requested.])
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to use NLS])
+  AC_MSG_RESULT([$USE_NLS])
+  if test "$USE_NLS" = "yes"; then
+    AC_MSG_CHECKING([where the gettext function comes from])
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    AC_MSG_RESULT([$gt_source])
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+        AC_MSG_CHECKING([how to link with libintl])
+        AC_MSG_RESULT([$LIBINTL])
+        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+      fi
+
+      dnl For backward compatibility. Some packages may be using this.
+      AC_DEFINE(HAVE_GETTEXT, 1,
+       [Define if the GNU gettext() function is already present or preinstalled.])
+      AC_DEFINE(HAVE_DCGETTEXT, 1,
+       [Define if the GNU dcgettext() function is already present or preinstalled.])
+    fi
+
+    dnl We need to process the po/ directory.
+    POSUB=po
+  fi
+
+  ifelse(gt_included_intl, yes, [
+    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+    dnl to 'yes' because some of the testsuite requires it.
+    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST(BUILD_INCLUDED_LIBINTL)
+    AC_SUBST(USE_INCLUDED_LIBINTL)
+    AC_SUBST(CATOBJEXT)
+
+    dnl For backward compatibility. Some configure.ins may be using this.
+    nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    DATADIRNAME=share
+    AC_SUBST(DATADIRNAME)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INSTOBJEXT=.mo
+    AC_SUBST(INSTOBJEXT)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    GENCAT=gencat
+    AC_SUBST(GENCAT)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    if test "$USE_INCLUDED_LIBINTL" = yes; then
+      INTLOBJS="\$(GETTOBJS)"
+    fi
+    AC_SUBST(INTLOBJS)
+
+    dnl Enable libtool support if the surrounding package wishes it.
+    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+  ])
+
+  dnl For backward compatibility. Some Makefiles may be using this.
+  INTLLIBS="$LIBINTL"
+  AC_SUBST(INTLLIBS)
+
+  dnl Make all documented variables known to autoconf.
+  AC_SUBST(LIBINTL)
+  AC_SUBST(LTLIBINTL)
+  AC_SUBST(POSUB)
+])
+
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl            USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+  AC_REQUIRE([AC_PROG_RANLIB])dnl
+  AC_REQUIRE([AC_ISC_POSIX])dnl
+  AC_REQUIRE([AC_HEADER_STDC])dnl
+  AC_REQUIRE([AC_C_CONST])dnl
+  AC_REQUIRE([AC_C_INLINE])dnl
+  AC_REQUIRE([AC_TYPE_OFF_T])dnl
+  AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+  AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+  AC_REQUIRE([AC_FUNC_MMAP])dnl
+  AC_REQUIRE([jm_GLIBC21])dnl
+  AC_REQUIRE([gt_INTDIV0])dnl
+  AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl
+  AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl
+  AC_REQUIRE([gt_INTTYPES_PRI])dnl
+
+  AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+  AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
+geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \
+strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next \
+__fsetlocking])
+
+  AM_ICONV
+  AM_LANGINFO_CODESET
+  if test $ac_cv_header_locale_h = yes; then
+    AM_LC_MESSAGES
+  fi
+
+  dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+  dnl because plural.y uses bison specific features. It requires at least
+  dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+  dnl compile.
+  dnl bison is only needed for the maintainer (who touches plural.y). But in
+  dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+  dnl the rule in general Makefile. Now, some people carelessly touch the
+  dnl files or have a broken "make" program, hence the plural.c rule will
+  dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+  dnl present or too old.
+  AC_CHECK_PROGS([INTLBISON], [bison])
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+    dnl Found it, now check the version.
+    AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    AC_MSG_RESULT([$ac_prog_version])
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
+# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([jm_GLIBC21],
+  [
+    AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+      ac_cv_gnu_library_2_1,
+      [AC_EGREP_CPP([Lucky GNU user],
+       [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+       ],
+       ac_cv_gnu_library_2_1=yes,
+       ac_cv_gnu_library_2_1=no)
+      ]
+    )
+    AC_SUBST(GLIBC21)
+    GLIBC21="$ac_cv_gnu_library_2_1"
+  ]
+)
+# iconv.m4 serial AM4 (gettext-0.11.3)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+      [iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);],
+      am_cv_func_iconv=yes)
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+        [iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);],
+        am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes)
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST(LIBICONV)
+  AC_SUBST(LTLIBICONV)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+  AM_ICONV_LINK
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL(am_cv_proto_iconv, [
+      AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([$]{ac_t:-
+         }[$]am_cv_proto_iconv)
+    AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+      [Define as const if the declaration of iconv() needs const.])
+  fi
+])
+# intdiv0.m4 serial 1 (gettext-0.11.3)
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+  AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+    gt_cv_int_divbyzero_sigfpe,
+    [
+      AC_TRY_RUN([
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+#ifdef __cplusplus
+sigfpe_handler (int sig)
+#else
+sigfpe_handler (sig) int sig;
+#endif
+{
+  /* Exit with code 0 if SIGFPE, with code 1 if any other signal.  */
+  exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+  signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP.  */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+  signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL.  */
+#if defined (__sparc__) && defined (__linux__)
+  signal (SIGILL, sigfpe_handler);
+#endif
+
+  z = x / y;
+  nan = y / y;
+  exit (1);
+}
+], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no,
+        [
+          # Guess based on the CPU.
+          case "$host_cpu" in
+            alpha* | i[34567]86 | m68k | s390*)
+              gt_cv_int_divbyzero_sigfpe="guessing yes";;
+            *)
+              gt_cv_int_divbyzero_sigfpe="guessing no";;
+          esac
+        ])
+    ])
+  case "$gt_cv_int_divbyzero_sigfpe" in
+    *yes) value=1;;
+    *) value=0;;
+  esac
+  AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value,
+    [Define if integer division by zero raises signal SIGFPE.])
+])
+# inttypes.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with
+# <sys/types.h>.
+
+AC_DEFUN([gt_HEADER_INTTYPES_H],
+[
+  AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h,
+  [
+    AC_TRY_COMPILE(
+      [#include <sys/types.h>
+#include <inttypes.h>],
+      [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no)
+  ])
+  if test $gt_cv_header_inttypes_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1,
+      [Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.])
+  fi
+])
+# inttypes_h.m4 serial 5 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_INTTYPES_H],
+[
+  AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h,
+  [AC_TRY_COMPILE(
+    [#include <sys/types.h>
+#include <inttypes.h>],
+    [uintmax_t i = (uintmax_t) -1;],
+    jm_ac_cv_header_inttypes_h=yes,
+    jm_ac_cv_header_inttypes_h=no)])
+  if test $jm_ac_cv_header_inttypes_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
+      [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
+# inttypes-pri.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values.  This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+  AC_REQUIRE([gt_HEADER_INTTYPES_H])
+  if test $gt_cv_header_inttypes_h = yes; then
+    AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+      gt_cv_inttypes_pri_broken,
+      [
+        AC_TRY_COMPILE([#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes)
+      ])
+  fi
+  if test "$gt_cv_inttypes_pri_broken" = yes; then
+    AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1,
+      [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+  fi
+])
+# isc-posix.m4 serial 2 (gettext-0.11.2)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# This file is not needed with autoconf-2.53 and newer.  Remove it in 2005.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it.  Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+#   configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+#   configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+  [
+    dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+    AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+  ]
+)
+# lcmessage.m4 serial 3 (gettext-0.11.3)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([AM_LC_MESSAGES],
+[
+  AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+    [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+  if test $am_cv_val_LC_MESSAGES = yes; then
+    AC_DEFINE(HAVE_LC_MESSAGES, 1,
+      [Define if your <locale.h> file defines LC_MESSAGES.])
+  fi
+])
+# lib-ld.m4 serial 2 (gettext-0.12)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  acl_cv_prog_gnu_ld=yes
+else
+  acl_cv_prog_gnu_ld=no
+fi])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by GCC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]* | [A-Za-z]:[\\/]*)]
+      [re_direlt='/[^/][^/]*/\.\./']
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+       test "$with_gnu_ld" != no && break
+      else
+       test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
+# lib-link.m4 serial 4 (gettext-0.12)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    LIBS="$LIBS $LIB[]NAME"
+    AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE(rpath,
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib$1-prefix],
+[  --with-lib$1-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
+  --without-lib$1-prefix     don't search for lib$1 in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
+# lib-prefix.m4 serial 2 (gettext-0.12)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/lib"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/lib"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
+# nls.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_DEFUN([AM_NLS],
+[
+  AC_MSG_CHECKING([whether NLS is requested])
+  dnl Default is enabled NLS
+  AC_ARG_ENABLE(nls,
+    [  --disable-nls           do not use Native Language Support],
+    USE_NLS=$enableval, USE_NLS=yes)
+  AC_MSG_RESULT($USE_NLS)
+  AC_SUBST(USE_NLS)
+])
+
+AC_DEFUN([AM_MKINSTALLDIRS],
+[
+  dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+  dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+  dnl Try to locate it.
+  MKINSTALLDIRS=
+  if test -n "$ac_aux_dir"; then
+    case "$ac_aux_dir" in
+      /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
+      *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
+    esac
+  fi
+  if test -z "$MKINSTALLDIRS"; then
+    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+  fi
+  AC_SUBST(MKINSTALLDIRS)
+])
+# po.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+  AC_REQUIRE([AM_NLS])dnl
+
+  dnl Perform the following tests also if --disable-nls has been given,
+  dnl because they are needed for "make dist" to work.
+
+  dnl Search for GNU msgfmt in the PATH.
+  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+  dnl The second test excludes FreeBSD msgfmt.
+  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+    [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+  dnl Search for GNU xgettext 0.12 or newer in the PATH.
+  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+  dnl The second test excludes FreeBSD xgettext.
+  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+    [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  dnl Remove leftover from FreeBSD xgettext call.
+  rm -f messages.po
+
+  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+    [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :)
+
+  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+  dnl Test whether we really found GNU msgfmt.
+  if test "$GMSGFMT" != ":"; then
+    dnl If it is no GNU msgfmt we define it as : so that the
+    dnl Makefiles still can work.
+    if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+      AC_MSG_RESULT(
+        [found $GMSGFMT program is not GNU msgfmt; ignore it])
+      GMSGFMT=":"
+    fi
+  fi
+
+  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+  dnl Test whether we really found GNU xgettext.
+  if test "$XGETTEXT" != ":"; then
+    dnl If it is no GNU xgettext we define it as : so that the
+    dnl Makefiles still can work.
+    if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+       (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      AC_MSG_RESULT(
+        [found xgettext program is not GNU xgettext; ignore it])
+      XGETTEXT=":"
+    fi
+    dnl Remove leftover from FreeBSD xgettext call.
+    rm -f messages.po
+  fi
+
+  AC_OUTPUT_COMMANDS([
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[  ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assigment from automake.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          GMOFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done],
+   [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
+    # from automake.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+   ])
+])
+# progtest.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+  [[\\/]]* | ?:[[\\/]]*)
+    ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in ifelse([$5], , $PATH, [$5]); do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if [$3]; then
+            ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+    ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$]$1)
+else
+  AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+# stdint_h.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_STDINT_H],
+[
+  AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h,
+  [AC_TRY_COMPILE(
+    [#include <sys/types.h>
+#include <stdint.h>],
+    [uintmax_t i = (uintmax_t) -1;],
+    jm_ac_cv_header_stdint_h=yes,
+    jm_ac_cv_header_stdint_h=no)])
+  if test $jm_ac_cv_header_stdint_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
+      [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
+# uintmax_t.m4 serial 7 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+AC_PREREQ(2.13)
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([jm_AC_TYPE_UINTMAX_T],
+[
+  AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+  if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then
+    AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG])
+    test $ac_cv_type_unsigned_long_long = yes \
+      && ac_type='unsigned long long' \
+      || ac_type='unsigned long'
+    AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
+      [Define to unsigned long or unsigned long long
+       if <stdint.h> and <inttypes.h> don't define.])
+  else
+    AC_DEFINE(HAVE_UINTMAX_T, 1,
+      [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
+# ulonglong.m4 serial 2 (fileutils-4.0.32, gettext-0.10.40)
+dnl Copyright (C) 1999-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG],
+[
+  AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long,
+  [AC_TRY_LINK([unsigned long long ull = 1; int i = 63;],
+    [unsigned long long ullmax = (unsigned long long) -1;
+     return ull << i | ull >> i | ullmax / ull | ullmax % ull;],
+    ac_cv_type_unsigned_long_long=yes,
+    ac_cv_type_unsigned_long_long=no)])
+  if test $ac_cv_type_unsigned_long_long = yes; then
+    AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
+      [Define if you have the unsigned long long type.])
+  fi
+])
diff --git a/array.c b/array.c
index c105a71..9d6358b 100644 (file)
--- a/array.c
+++ b/array.c
@@ -298,10 +298,15 @@ ARRAY     *array;
        return array;
 }
 
+/*
+ * Return a string whose elements are the members of array A beginning at
+ * index START and spanning NELEM members.  Null elements are counted.
+ * Since arrays are sparse, unset array elements are not counted.
+ */
 char *
-array_subrange (a, start, end, starsub, quoted)
+array_subrange (a, start, nelem, starsub, quoted)
 ARRAY  *a;
-arrayind_t     start, end;
+arrayind_t     start, nelem;
 int    starsub, quoted;
 {
        ARRAY_ELEMENT   *h, *p;
@@ -309,14 +314,24 @@ int       starsub, quoted;
        char            *ifs, sep[2];
 
        p = array_head (a);
-       if (p == 0 || array_empty (a) || start > array_num_elements (a))
+       if (p == 0 || array_empty (a) || start > array_max_index(a))
                return ((char *)NULL);
 
-       for (i = 0, p = element_forw(p); p != a->head && i < start; i++, p = element_forw(p))
+       /*
+        * Find element with index START.  If START corresponds to an unset
+        * element (arrays can be sparse), use the first element whose index
+        * is >= START.  If START is < 0, we count START indices back from
+        * the end of A (not elements, even with sparse arrays -- START is an
+        * index).
+        */
+       for (p = element_forw(p); p != array_head(a) && start > element_index(p); p = element_forw(p))
                ;
+
        if (p == a->head)
                return ((char *)NULL);
-       for (h = p; p != a->head && i < end; i++, p = element_forw(p))
+
+       /* Starting at P, take NELEM elements, inclusive. */
+       for (i = 0, h = p; p != a->head && i < nelem; i++, p = element_forw(p))
                ;
 
        if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) {
index 3ac6fd5..a00f17f 100644 (file)
@@ -1,6 +1,6 @@
 /* arrayfunc.c -- High-level array functions used by other parts of the shell. */
 
-/* Copyright (C) 2001-2002 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -27,6 +27,8 @@
 #endif
 #include <stdio.h>
 
+#include "bashintl.h"
+
 #include "shell.h"
 
 #include "shmbutil.h"
@@ -39,6 +41,9 @@ extern int last_command_exit_value;
 static void quote_array_assignment_chars __P((WORD_LIST *));
 static char *array_value_internal __P((char *, int, int, int *));
 
+/* Standard error message to use when encountering an invalid array subscript */
+char *bash_badsub_errmsg = N_("bad array subscript");
+
 /* **************************************************************** */
 /*                                                                 */
 /*  Functions to manipulate array variables and perform assignments */
@@ -246,7 +251,7 @@ assign_array_var_from_string (var, value)
      shell expansions including pathname generation and word splitting. */
   /* First we split the string on whitespace, using the shell parser
      (ksh93 seems to do this). */
-  list = parse_string_to_word_list (val, "array assign");
+  list = parse_string_to_word_list (val, 1, "array assign");
 
   /* If we're using [subscript]=value, we need to quote each [ and ] to
      prevent unwanted filename expansion. */
@@ -274,7 +279,7 @@ assign_array_var_from_string (var, value)
       w = list->word->word;
 
       /* We have a word of the form [ind]=value */
-      if (w[0] == '[')
+      if ((list->word->flags & W_ASSIGNMENT) && w[0] == '[')
        {
          len = skipsubscript (w, 0);
 
@@ -298,7 +303,7 @@ assign_array_var_from_string (var, value)
 
          if (ALL_ELEMENT_SUB (w[1]) && len == 2)
            {
-             report_error ("%s: cannot assign to non-numeric index", w);
+             report_error (_("%s: cannot assign to non-numeric index"), w);
              continue;
            }
 
@@ -442,7 +447,7 @@ unbind_array_element (var, sub)
   len = skipsubscript (sub, 0);
   if (sub[len] != ']' || len == 0)
     {
-      builtin_error ("%s[%s: bad array subscript", var->name, sub);
+      builtin_error ("%s[%s: %s", var->name, sub, _(bash_badsub_errmsg));
       return -1;
     }
   sub[len] = '\0';
@@ -455,7 +460,7 @@ unbind_array_element (var, sub)
   ind = array_expand_index (sub, len+1);
   if (ind < 0)
     {
-      builtin_error ("[%s]: bad array subscript", sub);
+      builtin_error ("[%s]: %s", sub, _(bash_badsub_errmsg));
       return -1;
     }
   ae = array_remove (array_cell (var), ind);
@@ -558,12 +563,22 @@ array_variable_name (s, subp, lenp)
 
   t = xstrchr (s, '[');
   if (t == 0)
-    return ((char *)NULL);
+    {
+      if (subp)
+       *subp = t;
+      if (lenp)
+       *lenp = 0;
+      return ((char *)NULL);
+    }
   ind = t - s;
   ni = skipsubscript (s, ind);
   if (ni <= ind + 1 || s[ni] != ']')
     {
       err_badarraysub (s);
+      if (subp)
+       *subp = t;
+      if (lenp)
+       *lenp = 0;
       return ((char *)NULL);
     }
 
index 3421613..e53af0b 100644 (file)
@@ -36,6 +36,8 @@
 #include "posixstat.h"
 #include "filecntl.h"
 
+#include "bashintl.h"
+
 #include "shell.h"
 #include "flags.h"
 #include "input.h"
@@ -214,7 +216,7 @@ bash_initialize_history ()
   history_quotes_inhibit_expansion = 1;
   history_search_delimiter_chars = ";&()|<>";
   history_inhibit_expansion_function = bash_history_inhibit_expansion;
-  history_comment_char = '#';
+  sv_histchars ("histchars");
 }
 
 void
@@ -316,7 +318,7 @@ maybe_append_history (filename)
          fd = open (filename, O_WRONLY|O_CREAT, 0600);
          if (fd < 0)
            {
-             builtin_error ("%s: cannot create: %s", filename, strerror (errno));
+             builtin_error (_("%s: cannot create: %s"), filename, strerror (errno));
              return (EXECUTION_FAILURE);
            }
          close (fd);
index f9e6cdb..12068e4 100644 (file)
@@ -1,6 +1,6 @@
 /* bashintl.h -- Internationalization stuff
 
-   Copyright (C) 1996 Free Software Foundation, Inc.
+   Copyright (C) 1996-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
 #if !defined (_BASHINTL_H_)
 #define _BASHINTL_H_
 
-/* Include this *after* config.h */
-#if defined (HAVE_LIBINTL_H)
-#  include <libintl.h>
+#if defined (BUILDTOOL)
+#  undef ENABLE_NLS
+#  define ENABLE_NLS 0
 #endif
 
+/* Include this *after* config.h */
+#include "gettext.h"
+
 #if defined (HAVE_LOCALE_H)
 #  include <locale.h>
 #endif
 
+#define _(msgid)       gettext(msgid)
+#define N_(msgid)      msgid
+#define D_(d, msgid)   dgettext(d, msgid)
+
 #if defined (HAVE_SETLOCALE) && !defined (LC_ALL)
 #  undef HAVE_SETLOCALE
 #endif
 #  define setlocale(cat, loc)
 #endif
 
-#if !defined (HAVE_TEXTDOMAIN)
-#  define textdomain(dom)
-#endif
-
-#if !defined (HAVE_BINDTEXTDOMAIN)
-#  define bindtextdomain(dom, dir)
-#endif
-
 #endif /* !_BASHINTL_H_ */
index f60215f..23b8f48 100644 (file)
@@ -40,6 +40,8 @@
 #include <stdio.h>
 #include "chartypes.h"
 #include "bashansi.h"
+#include "bashintl.h"
+
 #include "shell.h"
 #include "input.h"
 #include "builtins.h"
@@ -983,7 +985,7 @@ attempt_shell_completion (text, start, end)
 #if 1
   /* If this is an open quote, maybe we're trying to complete a quoted
      command name. */
-  if (rl_line_buffer[ti] == '"' || rl_line_buffer[ti] == '\'')
+  if (ti >= 0 && (rl_line_buffer[ti] == '"' || rl_line_buffer[ti] == '\''))
     {
       qc = rl_line_buffer[ti];
       saveti = ti--;
@@ -1447,6 +1449,9 @@ command_subst_completion_function (text, state)
        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)
@@ -2783,7 +2788,7 @@ bash_execute_unix_command (count, key)
       else
        {
          rl_crlf ();
-         internal_error ("bash_execute_unix_command: cannot find keymap for command");
+         internal_error (_("bash_execute_unix_command: cannot find keymap for command"));
          rl_forced_update_display ();
          return 1;
        }
@@ -2832,7 +2837,7 @@ isolate_sequence (string, ind, need_dquote, startp)
   /* 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);
+      builtin_error (_("%s: first non-whitespace character is not `\"'"), string);
       return -1;
     }
 
@@ -2861,7 +2866,7 @@ isolate_sequence (string, ind, need_dquote, startp)
 
   if (delim && string[i] != delim)
     {
-      builtin_error ("%s: no closing `%c'", string, delim);
+      builtin_error (_("no closing `%c' in %s"), delim, string);
       return -1;
     }
 
@@ -2895,7 +2900,7 @@ bind_keyseq_to_unix_command (line)
     ;
   if (line[i] != ':')
     {
-      builtin_error ("%s: missing colon separator", line);
+      builtin_error (_("%s: missing colon separator"), line);
       return -1;
     }
 
@@ -2927,7 +2932,11 @@ bash_directory_completion_matches (text)
   char *dfn;
   int qc;
 
+#if 0
   qc = (text[0] == '"' || text[0] == '\'') ? text[0] : 0;
+#else
+  qc = rl_dispatching ? rl_completion_quote_character : 0;  
+#endif
   dfn = bash_dequote_filename ((char *)text, qc);
   m1 = rl_completion_matches (dfn, rl_filename_completion_function);
   free (dfn);
index d42149c..0fb9b9d 100644 (file)
--- a/braces.c
+++ b/braces.c
@@ -124,9 +124,9 @@ brace_expand (text)
            }
 
          if (text[j] == brace_arg_separator)
-           {
+           {   /* { */
              strvec_dispose (result);
-             report_error ("missing `}'");
+             report_error ("no closing `%c' in %s", '}', text);
              throw_to_top_level ();
            }
          ADVANCE_CHAR (text, tlen, j);
diff --git a/builtins/-i b/builtins/-i
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/builtins/ChangeLog b/builtins/ChangeLog
new file mode 100644 (file)
index 0000000..e69de29
index ce650e7..676dbb6 100644 (file)
@@ -1,6 +1,6 @@
 # This Makefile for building libbuiltins.a is in -*- text -*- for Emacs.
 #
-# Copyright (C) 1996 Free Software Foundation, Inc.     
+# Copyright (C) 1996-2003 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
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
 
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
 #
 SHELL = @MAKE_SHELL@
 RANLIB = @RANLIB@
@@ -35,6 +41,7 @@ VPATH = .:@srcdir@
 topdir = @top_srcdir@
 includedir = @includedir@
 datadir = @datadir@
+localedir = $(datadir)/locale
 
 # Support an alternate destination root directory for package building
 DESTDIR =
@@ -218,6 +225,12 @@ $(OFILES): $(MKBUILTINS) ../config.h
 ../version.h: ../config.h ../Makefile Makefile
        -( cd ${BUILD_DIR} && ${MAKE} ${MFLAGS} version.h )
 
+# maintainer special - for now
+po:    builtins.c
+       xgettext -L C -o $(topdir)/po/builtins.pot --keyword='N_' builtins.c 2>/dev/null
+
+# dependencies
+
 alias.o: alias.def
 bind.o: bind.def
 break.o: break.def
@@ -562,3 +575,40 @@ complete.o: ${topdir}/pcomplete.h
 complete.o: ${srcdir}/common.h ${srcdir}/bashgetopt.h
 
 #bind.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h
+
+# libintl dependencies
+bind.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+break.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+caller.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+cd.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+common.c: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+complete.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+declare.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+enable.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+evalfile.c: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+exec.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+exit.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+fc.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+fg_bg.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+getopt.c: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+hash.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+help.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+history.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+inlib.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+jobs.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+kill.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+let.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+mkbuiltins.c: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+printf.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+pushd.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+read.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+return.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+set.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+setattr.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+shift.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+shopt.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+source.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+suspend.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+type.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+ulimit.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
+umask.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
index ddf5619..4711031 100644 (file)
@@ -1,7 +1,7 @@
 This file is bind.def, from which is created bind.c.
 It implements the builtin "bind" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -72,6 +72,8 @@ extern int errno;
 #include <readline/readline.h>
 #include <readline/history.h>
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "../bashline.h"
 #include "bashgetopt.h"
@@ -189,7 +191,7 @@ bind_builtin (list)
       kmap = rl_get_keymap_by_name (map_name);
       if (!kmap)
        {
-         builtin_error ("`%s': invalid keymap name", map_name);
+         builtin_error (_("`%s': invalid keymap name"), map_name);
          BIND_RETURN (EXECUTION_FAILURE);
        }
     }
@@ -228,7 +230,7 @@ bind_builtin (list)
     {
       if (rl_read_init_file (initfile) != 0)
        {
-         builtin_error ("%s: cannot read: %s", initfile, strerror (errno));
+         builtin_error (_("%s: cannot read: %s"), initfile, strerror (errno));
          BIND_RETURN (EXECUTION_FAILURE);
        }
     }
@@ -243,7 +245,7 @@ bind_builtin (list)
     {
       if (rl_set_key (remove_seq, (rl_command_func_t *)NULL, rl_get_keymap ()) != 0)
        {
-         builtin_error ("`%s': cannot unbind", remove_seq);
+         builtin_error (_("`%s': cannot unbind"), remove_seq);
          BIND_RETURN (EXECUTION_FAILURE);
        }
     }
@@ -278,7 +280,7 @@ query_bindings (name)
   function = rl_named_function (name);
   if (function == 0)
     {
-      builtin_error ("`%s': unknown function name", name);
+      builtin_error (_("`%s': unknown function name"), name);
       return EXECUTION_FAILURE;
     }
 
@@ -286,11 +288,11 @@ query_bindings (name)
 
   if (!keyseqs)
     {
-      printf ("%s is not bound to any keys.\n", name);
+      printf (_("%s is not bound to any keys.\n"), name);
       return EXECUTION_FAILURE;
     }
 
-  printf ("%s can be invoked via ", name);
+  printf (_("%s can be invoked via "), name);
   for (j = 0; j < 5 && keyseqs[j]; j++)
     printf ("\"%s\"%s", keyseqs[j], keyseqs[j + 1] ? ", " : ".\n");
   if (keyseqs[j])
index 1025414..e61d502 100644 (file)
@@ -1,7 +1,7 @@
 This file is break.def, from which is created break.c.
 It implements the builtins "break" and "continue" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -36,6 +36,8 @@ $END
 #  include <unistd.h>
 #endif
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "common.h"
 
@@ -123,7 +125,7 @@ check_loop_level ()
 {
 #if defined (BREAK_COMPLAINS)
   if (loop_level == 0 && posixly_correct == 0)
-    builtin_error ("only meaningful in a `for', `while', or `until' loop");
+    builtin_error (_("only meaningful in a `for', `while', or `until' loop"));
 #endif /* BREAK_COMPLAINS */
 
   return (loop_level);
index 8571f37..dfa58bc 100644 (file)
@@ -68,7 +68,7 @@ builtin_builtin (list)
 
   if (!function)
     {
-      builtin_error ("%s: not a shell builtin", command);
+      sh_notbuiltin (command);
       return (EXECUTION_FAILURE);
     }
   else
index 868b2ee..d372c58 100644 (file)
@@ -1,7 +1,7 @@
 This file is caller.def, from which is created caller.c.  It implements the
 builtin "caller" in Bash.
 
-Copyright (C) 2002 Rocky Bernstein for Free Software Foundation, Inc.
+Copyright (C) 2002-2003 Rocky Bernstein for Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -50,6 +50,8 @@ $END
 
 #include <errno.h>
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "common.h"
 #include "builtext.h"
@@ -120,17 +122,16 @@ caller_builtin (list)
 #endif
 }
 
-
 #ifdef LOADABLE_BUILTIN
 static char *caller_doc[] = {
-  "Returns the context of the current subroutine call.",
-  "",
-  "Without EXPR, returns returns \"$line $filename\".  With EXPR,",
-  "returns \"$line $subroutine $filename\"; this extra information",
-  "can be used used to provide a stack trace.",
-  "",
-  "The value of EXPR indicates how many call frames to go back before the",
-  "current one; the top frame is frame 0.",
+  N_("Returns the context of the current subroutine call."),
+  N_(""),
+  N_("Without EXPR, returns returns \"$line $filename\".  With EXPR,"),
+  N_("returns \"$line $subroutine $filename\"; this extra information"),
+  N_("can be used used to provide a stack trace."),
+  N_(""),
+  N_("The value of EXPR indicates how many call frames to go back before the"),
+  N_("current one; the top frame is frame 0."),
   (char *)NULL
 };
 
index c13a78a..68449e9 100644 (file)
@@ -1,7 +1,7 @@
 This file is cd.def, from which is created cd.c.  It implements the
 builtins "cd" and "pwd" in Bash.
 
-Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -39,6 +39,7 @@ $PRODUCES cd.c
 #include <stdio.h>
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include <errno.h>
 #include <tilde/tilde.h>
@@ -184,7 +185,7 @@ cd_builtin (list)
 
       if (dirname == 0)
        {
-         builtin_error ("HOME not set");
+         builtin_error (_("HOME not set"));
          return (EXECUTION_FAILURE);
        }
       lflag = 0;
@@ -196,7 +197,7 @@ cd_builtin (list)
 
       if (dirname == 0)
        {
-         builtin_error ("OLDPWD not set");
+         builtin_error (_("OLDPWD not set"));
          return (EXECUTION_FAILURE);
        }
 #if 0
@@ -346,7 +347,7 @@ pwd_builtin (list)
       fflush (stdout);
       if (ferror (stdout))
        {
-         builtin_error ("write error: %s", strerror (errno));
+         builtin_error (_("write error: %s"), strerror (errno));
          clearerr (stdout);
          return (EXECUTION_FAILURE);
        }
@@ -404,7 +405,8 @@ change_to_directory (newdir, nolinks)
      resolved path doesn't exist), fail immediately. */
   if (posixly_correct && nolinks == 0 && canon_failed)
     {
-      errno = ENOENT;
+      if (errno != ENOENT)
+       errno = ENOTDIR;
       return (0);
     }
 
index e780be5..0e0787b 100644 (file)
@@ -40,6 +40,7 @@
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "maxpath.h"
@@ -129,7 +130,7 @@ no_args (list)
 {
   if (list)
     {
-      builtin_error ("too many arguments");
+      builtin_error (_("too many arguments"));
       jump_to_top_level (DISCARD);
     }
 }
@@ -153,21 +154,21 @@ void
 sh_needarg (s)
      char *s;
 {
-  builtin_error ("%s: option requires an argument", s);
+  builtin_error (_("%s: option requires an argument"), s);
 }
 
 void
 sh_neednumarg (s)
      char *s;
 {
-  builtin_error ("%s: numeric argument required", s);
+  builtin_error (_("%s: numeric argument required"), s);
 }
 
 void
 sh_notfound (s)
      char *s;
 {
-  builtin_error ("%s: not found", s);
+  builtin_error (_("%s: not found"), s);
 }
 
 /* Function called when one of the builtin commands detects an invalid
@@ -176,49 +177,49 @@ void
 sh_invalidopt (s)
      char *s;
 {
-  builtin_error ("%s: invalid option", s);
+  builtin_error (_("%s: invalid option"), s);
 }
 
 void
 sh_invalidoptname (s)
      char *s;
 {
-  builtin_error ("%s: invalid option name", s);
+  builtin_error (_("%s: invalid option name"), s);
 }
 
 void
 sh_invalidid (s)
      char *s;
 {
-  builtin_error ("`%s': not a valid identifier", s);
+  builtin_error (_("`%s': not a valid identifier"), s);
 }
 
 void
 sh_invalidnum (s)
      char *s;
 {
-  builtin_error ("%s: invalid number", s);
+  builtin_error (_("%s: invalid number"), s);
 }
 
 void
 sh_invalidsig (s)
      char *s;
 {
-  builtin_error ("%s: invalid signal specification", s);
+  builtin_error (_("%s: invalid signal specification"), s);
 }
 
 void
 sh_badpid (s)
      char *s;
 {
-  builtin_error ("`%s': not a pid or valid job spec", s);
+  builtin_error (_("`%s': not a pid or valid job spec"), s);
 }
 
 void
 sh_readonly (s)
      const char *s;
 {
-  builtin_error ("%s: readonly variable", s);
+  builtin_error (_("%s: readonly variable"), s);
 }
 
 void
@@ -226,9 +227,9 @@ sh_erange (s, desc)
      char *s, *desc;
 {
   if (s)
-    builtin_error ("%s: %s out of range", s, desc ? desc : "argument");
+    builtin_error (_("%s: %s out of range"), s, desc ? desc : _("argument"));
   else
-    builtin_error ("%s out of range", desc ? desc : "argument");
+    builtin_error (_("%s out of range"), desc ? desc : _("argument"));
 }
 
 #if defined (JOB_CONTROL)
@@ -236,7 +237,7 @@ void
 sh_badjob (s)
      char *s;
 {
-  builtin_error ("%s: no such job", s);
+  builtin_error (_("%s: no such job"), s);
 }
 
 void
@@ -244,9 +245,9 @@ sh_nojobs (s)
      char *s;
 {
   if (s)
-    builtin_error ("%s: no job control", s);
+    builtin_error (_("%s: no job control"), s);
   else
-    builtin_error ("no job control");
+    builtin_error (_("no job control"));
 }
 #endif
 
@@ -256,12 +257,19 @@ sh_restricted (s)
      char *s;
 {
   if (s)
-    builtin_error ("%s: restricted", s);
+    builtin_error (_("%s: restricted"), s);
   else
-    builtin_error ("restricted");
+    builtin_error (_("restricted"));
 }
 #endif
 
+void
+sh_notbuiltin (s)
+     char *s;
+{
+  builtin_error (_("%s: not a shell builtin"), s);
+}
+
 /* **************************************************************** */
 /*                                                                 */
 /*          Shell positional parameter manipulation                */
@@ -470,9 +478,9 @@ get_working_directory (for_whom)
       directory = getcwd (the_current_working_directory, PATH_MAX);
       if (directory == 0)
        {
-         fprintf (stderr, "%s: could not get current directory: %s: %s\n",
+         fprintf (stderr, _("%s: could not get current directory: %s: %s\n"),
                   (for_whom && *for_whom) ? for_whom : get_name_for_error (),
-                  bash_getcwd_errstr, strerror (errno));
+                  _(bash_getcwd_errstr), strerror (errno));
 
          free (the_current_working_directory);
          the_current_working_directory = (char *)NULL;
@@ -537,9 +545,9 @@ get_job_by_name (name, flags)
          else if (job != NO_JOB)
            {
              if (this_shell_builtin)
-               builtin_error ("%s: ambiguous job spec", name);
+               builtin_error (_("%s: ambiguous job spec"), name);
              else
-               report_error ("%s: ambiguous job spec", name);
+               report_error (_("%s: ambiguous job spec"), name);
              return (DUP_JOB);
            }
          else
index c843863..309bb6d 100644 (file)
@@ -75,6 +75,7 @@ extern void sh_badjob __P((char *));
 extern void sh_readonly __P((const char *));
 extern void sh_nojobs __P((char *));
 extern void sh_restricted __P((char *));
+extern void sh_notbuiltin __P((char *));
 
 extern char **make_builtin_argv __P((WORD_LIST *, int *));
 extern void remember_args __P((WORD_LIST *, int));
index 06f0c95..a859b88 100644 (file)
@@ -1,7 +1,7 @@
 This file is complete.def, from which is created complete.c.
 It implements the builtins "complete" and "compgen" in Bash.
 
-Copyright (C) 1999-2002 Free Software Foundation, Inc.
+Copyright (C) 1999-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -43,6 +43,7 @@ $END
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../builtins.h"
@@ -247,7 +248,7 @@ build_actions (list, pp, rp, actp, optp)
          ind = find_compact (list_optarg);
          if (ind < 0)
            {
-             builtin_error ("%s: invalid action name", list_optarg);
+             builtin_error (_("%s: invalid action name"), list_optarg);
              return (EX_USAGE);
            }
          acts |= compacts[ind].actflag;
@@ -377,7 +378,7 @@ remove_cmd_completions (list)
     {
       if (progcomp_remove (l->word->word) == 0)
        {
-         builtin_error ("%s: no completion specification", l->word->word);
+         builtin_error (_("%s: no completion specification"), l->word->word);
          ret = EXECUTION_FAILURE;
        }
     }
@@ -520,7 +521,7 @@ print_cmd_completions (list)
        print_one_completion (l->word->word, cs);
       else
        {
-         builtin_error ("%s: no completion specification", l->word->word);
+         builtin_error (_("%s: no completion specification"), l->word->word);
          ret = EXECUTION_FAILURE;
        }
     }
@@ -567,9 +568,9 @@ compgen_builtin (list)
   word = (list && list->word) ? list->word->word : "";
 
   if (Farg)
-    internal_warning ("compgen: -F option may not work as you expect");
+    builtin_error (_("warning: -F option may not work as you expect"));
   if (Carg)
-    internal_warning ("compgen: -C option may not work as you expect");
+    builtin_error (_("warning: -C option may not work as you expect"));
 
   /* If we get here, we need to build a compspec and evaluate it. */
   cs = compspec_create ();
index 0b15149..fe112dd 100644 (file)
@@ -68,6 +68,7 @@ $END
 #include <stdio.h>
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "common.h"
@@ -101,7 +102,7 @@ local_builtin (list)
     return (declare_internal (list, 1));
   else
     {
-      builtin_error ("can only be used in a function");
+      builtin_error (_("can only be used in a function"));
       return (EXECUTION_FAILURE);
     }
 }
@@ -227,7 +228,7 @@ declare_internal (list, local_var)
 #endif
 
       name = savestring (list->word->word);
-      offset = assignment (name);
+      offset = assignment (name, 0);
 
       if (offset)      /* declare [-afFirx] name=value */
        {
@@ -291,7 +292,7 @@ declare_internal (list, local_var)
        {
          if (offset)   /* declare -f [-rix] foo=bar */
            {
-             builtin_error ("cannot use `-f' to make functions");
+             builtin_error (_("cannot use `-f' to make functions"));
              free (name);
              return (EXECUTION_FAILURE);
            }
@@ -303,7 +304,7 @@ declare_internal (list, local_var)
                {
                  if (readonly_p (var) && (flags_off & att_readonly))
                    {
-                     builtin_error ("%s: readonly function", name);
+                     builtin_error (_("%s: readonly function"), name);
                      any_failed++;
                      NEXT_VARIABLE ();
                    }
@@ -385,7 +386,7 @@ declare_internal (list, local_var)
          /* Cannot use declare +a name to remove an array variable. */
          if ((flags_off & att_array) && array_p (var))
            {
-             builtin_error ("%s: cannot destroy array variables in this way", name);
+             builtin_error (_("%s: cannot destroy array variables in this way"), name);
              any_failed++;
              NEXT_VARIABLE ();
            }
index 7496d42..823c38f 100644 (file)
@@ -1,7 +1,7 @@
 This file is enable.def, from which is created enable.c.
 It implements the builtin "enable" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -50,6 +50,8 @@ $END
 
 #include <stdio.h>
 #include "../bashansi.h"
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "../builtins.h"
 #include "../flags.h"
@@ -123,7 +125,7 @@ enable_builtin (list)
          filename = list_optarg;
          break;
 #else
-         builtin_error ("dynamic loading not available");
+         builtin_error (_("dynamic loading not available"));
          return (EX_USAGE);
 #endif
 #if defined (HAVE_DLCLOSE)
@@ -131,7 +133,7 @@ enable_builtin (list)
          flags |= DFLAG;
          break;
 #else
-         builtin_error ("dynamic loading not available");
+         builtin_error (_("dynamic loading not available"));
          return (EX_USAGE);
 #endif /* HAVE_DLCLOSE */
        default:
@@ -197,7 +199,7 @@ enable_builtin (list)
 
          if (opt == EXECUTION_FAILURE)
            {
-             builtin_error ("%s: not a shell builtin", list->word->word);
+             sh_notbuiltin (list->word->word);
              result = EXECUTION_FAILURE;
            }
          list = list->next;
@@ -298,7 +300,7 @@ dyn_load_builtin (list, flags, filename)
 
   if (handle == 0)
     {
-      builtin_error ("cannot open shared object %s: %s", filename, dlerror ());
+      builtin_error (_("cannot open shared object %s: %s"), filename, dlerror ());
       return (EXECUTION_FAILURE);
     }
 
@@ -321,8 +323,8 @@ dyn_load_builtin (list, flags, filename)
       b = (struct builtin *)dlsym (handle, struct_name);
       if (b == 0)
        {
-         builtin_error ("cannot find %s in shared object %s: %s", struct_name,
-                         filename, dlerror ());
+         builtin_error (_("cannot find %s in shared object %s: %s"),
+                         struct_name, filename, dlerror ());
          free (struct_name);
          continue;
        }
@@ -440,12 +442,12 @@ dyn_unload_builtin (name)
   b = builtin_address_internal (name, 1);
   if (b == 0)
     {
-      builtin_error ("%s: not a shell builtin", name);
+      sh_notbuiltin (name);
       return (EXECUTION_FAILURE);
     }
   if (b->flags & STATIC_BUILTIN)
     {
-      builtin_error ("%s: not dynamically loaded", name);
+      builtin_error (_("%s: not dynamically loaded"), name);
       return (EXECUTION_FAILURE);
     }
 
@@ -460,7 +462,7 @@ dyn_unload_builtin (name)
      using it drops to zero. */
   if (ref == 1 && local_dlclose (handle) != 0)
     {
-      builtin_error ("%s: cannot delete: %s", name, dlerror ());
+      builtin_error (_("%s: cannot delete: %s"), name, dlerror ());
       return (EXECUTION_FAILURE);
     }
 
index 850acbd..c17e547 100644 (file)
@@ -31,6 +31,7 @@
 #include <errno.h>
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../jobs.h"
@@ -124,12 +125,12 @@ file_error_and_exit:
 
   if (S_ISDIR (finfo.st_mode))
     {
-      (*errfunc) ("%s: is a directory", filename);
+      (*errfunc) (_("%s: is a directory"), filename);
       return ((flags & FEVAL_BUILTIN) ? EXECUTION_FAILURE : -1);
     }
   else if ((flags & FEVAL_REGFILE) && S_ISREG (finfo.st_mode) == 0)
     {
-      (*errfunc) ("%s: not a regular file", filename);
+      (*errfunc) (_("%s: not a regular file"), filename);
       return ((flags & FEVAL_BUILTIN) ? EXECUTION_FAILURE : -1);
     }
 
@@ -137,7 +138,7 @@ file_error_and_exit:
   /* Check for overflow with large files. */
   if (file_size != finfo.st_size || file_size + 1 < file_size)
     {
-      (*errfunc) ("%s: file is too large", filename);
+      (*errfunc) (_("%s: file is too large"), filename);
       return ((flags & FEVAL_BUILTIN) ? EXECUTION_FAILURE : -1);
     }      
 
index 73a42f6..acfdae1 100644 (file)
@@ -1,7 +1,7 @@
 This file is exec.def, from which is created exec.c.
 It implements the builtin "exec" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -46,6 +46,7 @@ $END
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../execute_cmd.h"
@@ -201,7 +202,7 @@ exec_builtin (list)
 
   if (executable_file (command) == 0)
     {
-      builtin_error ("%s: cannot execute: %s", command, strerror (errno));
+      builtin_error (_("%s: cannot execute: %s"), command, strerror (errno));
       exit_value = EX_NOEXEC;  /* As per Posix.2, 3.14.6 */
     }
   else
index 735fecc..9384ade 100644 (file)
@@ -1,7 +1,7 @@
 This file is exit.def, from which is created exit.c.
 It implements the builtins "exit", and "logout" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -37,6 +37,8 @@ $END
 #  include <unistd.h>
 #endif
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "../jobs.h"
 
@@ -44,6 +46,7 @@ $END
 #include "builtext.h"  /* for jobs_builtin */
 
 extern int last_command_exit_value;
+extern int running_trap, trap_saved_exit_value;
 extern int subshell_environment;
 extern sh_builtin_func_t *this_shell_builtin;
 extern sh_builtin_func_t *last_shell_builtin;
@@ -77,7 +80,7 @@ logout_builtin (list)
 {
   if (login_shell == 0 /* && interactive */)
     {
-      builtin_error ("not login shell: use `exit'");
+      builtin_error (_("not login shell: use `exit'"));
       return (EXECUTION_FAILURE);
     }
   else
@@ -105,7 +108,7 @@ exit_or_logout (list)
       for (i = 0; i < job_slots; i++)
        if (jobs[i] && STOPPED (i))
          {
-           fprintf (stderr, "There are stopped jobs.\n");
+           fprintf (stderr, _("There are stopped jobs.\n"));
 
            /* This is NOT superfluous because EOF can get here without
               going through the command parser.  Set both last and this
@@ -120,7 +123,11 @@ exit_or_logout (list)
   /* Get return value if present.  This means that you can type
      `logout 5' to a shell, and it returns 5. */
 
-  exit_value = get_exitstat (list);
+  /* If we're running the exit trap (running_trap == 1, since running_trap
+     gets set to SIG+1), and we don't have a argument given to `exit'
+     (list == 0), use the exit status we saved before running the trap
+     commands (trap_saved_exit_value). */
+  exit_value = (running_trap == 1 && list == 0) ? trap_saved_exit_value : get_exitstat (list);
 
   bash_logout ();
 
index 0e6ab99..93c7ae3 100644 (file)
@@ -1,7 +1,7 @@
 This file is fc.def, from which is created fc.c.
 It implements the builtin "fc" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -25,7 +25,6 @@ $BUILTIN fc
 $FUNCTION fc_builtin
 $DEPENDS_ON HISTORY
 $SHORT_DOC fc [-e ename] [-nlr] [first] [last] or fc -s [pat=rep] [cmd]
-
 fc is used to list or edit and re-execute commands from the history list.
 FIRST and LAST can be numbers specifying the range, or FIRST can be a
 string, which means the most recent command beginning with that
@@ -66,6 +65,7 @@ $END
 #include <chartypes.h>
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 #include <errno.h>
 
 #include "../shell.h"
@@ -249,7 +249,7 @@ fc_builtin (list)
 
       if (command == NULL)
        {
-         builtin_error ("no command found");
+         builtin_error (_("no command found"));
          if (rlist)
            FREE_RLIST ();
 
@@ -314,7 +314,7 @@ fc_builtin (list)
   /* We print error messages for line specifications out of range. */
   if ((histbeg < 0) || (histend < 0))
     {
-      sh_erange ((char *)NULL, "history specification");
+      sh_erange ((char *)NULL, _("history specification"));
       return (EXECUTION_FAILURE);
     }
 
@@ -335,7 +335,7 @@ fc_builtin (list)
       stream = sh_mktmpfp ("bash-fc", MT_USERANDOM|MT_USETMPDIR, &fn);
       if (stream == 0)
        {
-         builtin_error ("cannot open temp file %s", fn ? fn : "");
+         builtin_error (_("%s: cannot open temp file: %s"), fn ? fn : "", strerror (errno));
          FREE (fn);
          return (EXECUTION_FAILURE);
        }
index c16d894..ea13bef 100644 (file)
@@ -1,7 +1,7 @@
 This file is fg_bg.def, from which is created fg_bg.c.
 It implements the builtins "bg" and "fg" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -39,6 +39,8 @@ $END
 #  include <unistd.h>
 #endif
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "../jobs.h"
 #include "common.h"
@@ -128,7 +130,7 @@ fg_bg (list, foreground)
   /* Or if jobs[job]->pgrp == shell_pgrp. */
   if (IS_JOBCONTROL (job) == 0)
     {
-      builtin_error ("job %%%d started without job control", job + 1);
+      builtin_error (_("job %d started without job control"), job + 1);
       goto failure;
     }
 
index 60c6188..b223a76 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <stdio.h>
 #include "memalloc.h"
+#include "../bashintl.h"
 #include "../shell.h"
 #include "getopt.h"
 
@@ -105,8 +106,8 @@ int sh_badopt = 0;
    ARGV-element, is returned in `sh_optarg'. */
 
 /* 1003.2 specifies the format of this message.  */
-#define BADOPT(x)  fprintf (stderr, "%s: illegal option -- %c\n", argv[0], x)
-#define NEEDARG(x) fprintf (stderr, "%s: option requires an argument -- %c\n", argv[0], x)
+#define BADOPT(x)  fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], x)
+#define NEEDARG(x) fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], x)
 
 int
 sh_getopt (argc, argv, optstring)
index 6e0e347..d311ac9 100644 (file)
@@ -1,7 +1,7 @@
 This file is hash.def, from which is created hash.c.
 It implements the builtin "hash" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -49,6 +49,7 @@ $END
 #include <errno.h>
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../builtins.h"
@@ -79,7 +80,7 @@ hash_builtin (list)
 
   if (hashing_enabled == 0)
     {
-      builtin_error ("hashing disabled");
+      builtin_error (_("hashing disabled"));
       return (EXECUTION_FAILURE);
     }
 
@@ -124,7 +125,7 @@ hash_builtin (list)
   if (list == 0 && expunge_hash_table == 0)
     {
       if (print_hashed_commands (list_portably) == 0)
-       printf ("%s: hash table empty\n", this_command_name);
+       printf (_("%s: hash table empty\n"), this_command_name);
 
       return (EXECUTION_SUCCESS);
     }
index 234307b..1935b64 100644 (file)
@@ -1,7 +1,7 @@
 This file is help.def, from which is created help.c.
 It implements the builtin "help" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -48,6 +48,8 @@ $END
 
 #include <filecntl.h>
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "../builtins.h"
 #include "../pathexp.h"
@@ -102,7 +104,10 @@ help_builtin (list)
 
   if (glob_pattern_p (list->word->word))
     {
-      printf ("Shell commands matching keyword%s `", list->next ? "s" : "");
+      if (list->next)
+       printf (_("Shell commands matching keywords `"));
+      else
+       printf (_("Shell commands matching keyword `"));
       print_word_list (list, ", ");
       printf ("'\n\n");
     }
@@ -130,7 +135,7 @@ help_builtin (list)
 
   if (match_found == 0)
     {
-      builtin_error ("no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'.", pattern, pattern, pattern);
+      builtin_error (_("no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."), pattern, pattern, pattern);
       return (EXECUTION_FAILURE);
     }
 
@@ -156,7 +161,7 @@ show_longdoc (i)
       fd = open (doc[0], O_RDONLY);
       if (fd == -1)
        {
-         builtin_error ("%s: cannot open: %s", doc[0], strerror (errno));
+         builtin_error (_("%s: cannot open: %s"), doc[0], strerror (errno));
          return;
        }
       zcatfd (fd, 1, doc[0]);
@@ -164,7 +169,7 @@ show_longdoc (i)
     }
   else
     for (j = 0; doc[j]; j++)
-      printf ("    %s\n", doc[j]);
+      printf ("    %s\n", _(doc[j]));
 }
 
 static void
@@ -174,13 +179,13 @@ show_builtin_command_help ()
   char blurb[36];
 
   printf (
-"These shell commands are defined internally.  Type `help' to see this list.\n\
+_("These shell commands are defined internally.  Type `help' to see this list.\n\
 Type `help name' to find out more about the function `name'.\n\
 Use `info bash' to find out more about the shell in general.\n\
 Use `man -k' or `info' to find out more about commands not in this list.\n\
 \n\
 A star (*) next to a name means that the command is disabled.\n\
-\n");
+\n"));
 
   for (i = 0; i < num_shell_builtins; i++)
     {
index 5c1a829..52b1113 100644 (file)
@@ -1,7 +1,7 @@
 This file is history.def, from which is created history.c.
 It implements the builtin "history" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -64,6 +64,7 @@ $END
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../bashhist.h"
@@ -144,7 +145,7 @@ history_builtin (list)
   opt = flags & (AFLAG|RFLAG|WFLAG|NFLAG);
   if (opt && opt != AFLAG && opt != RFLAG && opt != WFLAG && opt != NFLAG)
     {
-      builtin_error ("cannot use more than one of -anrw");
+      builtin_error (_("cannot use more than one of -anrw"));
       return (EXECUTION_FAILURE);
     }
 
@@ -176,7 +177,7 @@ history_builtin (list)
          || (delete_offset < history_base)
          || (delete_offset > (history_base + history_length)))
        {
-         sh_erange (delete_arg, "history position");
+         sh_erange (delete_arg, _("history position"));
          return (EXECUTION_FAILURE);
        }
       opt = delete_offset;
@@ -386,7 +387,7 @@ expand_and_print_history (list)
       r = history_expand (list->word->word, &s);
       if (r < 0)
        {
-         builtin_error ("%s: history expansion failed", list->word->word);
+         builtin_error (_("%s: history expansion failed"), list->word->word);
          result = EXECUTION_FAILURE;
        }
       else
index 51b7c26..a1f75ae 100644 (file)
@@ -1,7 +1,7 @@
 This file is jobs.def, from which is created jobs.c.
 It implements the builtins "jobs" and "disown" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -46,6 +46,7 @@ $END
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../jobs.h"
@@ -98,7 +99,7 @@ jobs_builtin (list)
        case 'x':
          if (form != JLIST_STANDARD)
            {
-             builtin_error ("no other options allowed with `-x'");
+             builtin_error (_("no other options allowed with `-x'"));
              return (EXECUTION_FAILURE);
            }
          execute++;
index 1207491..fcd5f46 100644 (file)
@@ -45,6 +45,7 @@ $END
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../trap.h"
@@ -183,7 +184,7 @@ kill_builtin (list)
 #if defined (JOB_CONTROL)
       else if (*list->word->word && *list->word->word != '%')
        {
-         builtin_error ("%s: arguments must be process or job IDs", list->word->word);
+         builtin_error (_("%s: arguments must be process or job IDs"), list->word->word);
          CONTINUE_OR_FAIL;
        }
       else if (*word && (interactive || job_control))
@@ -244,6 +245,6 @@ kill_error (pid, e)
 
   x = strerror (e);
   if (x == 0)
-    x = "Unknown error";
+    x = _("Unknown error");
   builtin_error ("(%ld) - %s", (long)pid, x);
 }
index 85131b0..ab43a45 100644 (file)
@@ -72,6 +72,8 @@ $END
 #  include <unistd.h>
 #endif
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "common.h"
 
@@ -89,7 +91,7 @@ let_builtin (list)
 
   if (list == 0)
     {
-      builtin_error ("expression expected");
+      builtin_error (_("expression expected"));
       return (EXECUTION_FAILURE);
     }
 
@@ -114,7 +116,7 @@ exp_builtin (list)
 
   if (list == 0)
     {
-      builtin_error ("expression expected");
+      builtin_error (_("expression expected"));
       return (EXECUTION_FAILURE);
     }
 
index f8d82f1..278755b 100644 (file)
@@ -1129,6 +1129,9 @@ write_file_headers (structfile, externfile)
 
       fprintf (structfile, "#include \"%s\"\n",
               extern_filename ? extern_filename : "builtext.h");
+
+      fprintf (structfile, "#include \"bashintl.h\"\n");
+
       fprintf (structfile, "\nstruct builtin static_shell_builtins[] = {\n");
     }
 
@@ -1369,8 +1372,9 @@ write_documentation (stream, documentation, indentation, flags)
          continue;
        }
 
+      /* prefix with N_( for gettext */
       if (string_array)
-       fprintf (stream, "  \"");
+       fprintf (stream, "  N_(\"");
 
       if (indentation)
        for (j = 0; j < indentation; j++)
@@ -1392,7 +1396,8 @@ write_documentation (stream, documentation, indentation, flags)
                }
            }
 
-         fprintf (stream, "\",\n");
+         /* closing right paren for gettext */
+         fprintf (stream, "\"),\n");
        }
       else if (texinfo)
        {
index 705f5b6..9b377a9 100644 (file)
@@ -1,7 +1,7 @@
 This file is printf.def, from which is created printf.c.
 It implements the builtin "printf" in Bash.
 
-Copyright (C) 1997-2002 Free Software Foundation, Inc.
+Copyright (C) 1997-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -55,6 +55,7 @@ $END
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "stdc.h"
@@ -105,7 +106,7 @@ extern int errno;
 
 static void printf_erange __P((char *));
 static void printstr __P((char *, char *, int, int, int));
-static int tescape __P((char *, int, char *, int *));
+static int tescape __P((char *, char *, int *));
 static char *bexpand __P((char *, int, int *, int *));
 static char *mklong __P((char *, char *, size_t));
 static int getchr __P((void));
@@ -182,13 +183,12 @@ printf_builtin (list)
          precision = fieldwidth = 0;
          have_fieldwidth = have_precision = 0;
 
-
          if (*fmt == '\\')
            {
              fmt++;
-             /* A NULL fourth argument to tescape means to not do special
-                processing for \c. */
-             fmt += tescape (fmt, 1, &nextch, (int *)NULL);
+             /* A NULL third argument to tescape means to bypass the
+                special processing for arguments to %b. */
+             fmt += tescape (fmt, &nextch, (int *)NULL);
              putchar (nextch);
              fmt--;    /* for loop will increment it for us again */
              continue;
@@ -246,7 +246,7 @@ printf_builtin (list)
            
          if (*fmt == 0)
            {
-             builtin_error ("`%s': missing format character", start);
+             builtin_error (_("`%s': missing format character"), start);
              PRETURN (EXECUTION_FAILURE);
            }
 
@@ -405,7 +405,7 @@ printf_builtin (list)
            /* We don't output unrecognized format characters; we print an
               error message and return a failure exit status. */
            default:
-             builtin_error ("`%c': invalid format character", convch);
+             builtin_error (_("`%c': invalid format character"), convch);
              PRETURN (EXECUTION_FAILURE);
            }
 
@@ -531,6 +531,7 @@ printstr (fmt, string, len, fieldwidth, precision)
   
 /* Convert STRING by expanding the escape sequences specified by the
    POSIX standard for printf's `%b' format string.  If SAWC is non-null,
+   perform the processing appropriate for %b arguments.  In particular,
    recognize `\c' and use that as a string terminator.  If we see \c, set
    *SAWC to 1 before returning.  LEN is the length of STRING. */
 
@@ -540,11 +541,10 @@ printstr (fmt, string, len, fieldwidth, precision)
    value.  *SAWC is set to 1 if the escape sequence was \c, since that means
    to short-circuit the rest of the processing.  If SAWC is null, we don't
    do the \c short-circuiting, and \c is treated as an unrecognized escape
-   sequence.  */
+   sequence; we also bypass the other processing specific to %b arguments.  */
 static int
-tescape (estart, trans_squote, cp, sawc)
+tescape (estart, cp, sawc)
      char *estart;
-     int trans_squote;
      char *cp;
      int *sawc;
 {
@@ -576,14 +576,13 @@ tescape (estart, trans_squote, cp, sawc)
 
       case 'v': *cp = '\v'; break;
 
-      /* %b octal constants are `\0' followed by one, two, or three
-        octal digits... */
-      case '0':
-      /* but, as an extension, the other echo-like octal escape
-        sequences are supported as well. */
-      case '1': case '2': case '3': case '4':
-      case '5': case '6': case '7':
-       for (temp = 2+(c=='0'), evalue = c - '0'; ISOCTAL (*p) && temp--; p++)
+      /* The octal escape sequences are `\0' followed by up to three octal
+        digits (if SAWC), or `\' followed by up to three octal digits (if
+        !SAWC).  As an extension, we allow the latter form even if SAWC. */
+      case '0': case '1': case '2': case '3':
+      case '4': case '5': case '6': case '7':
+       evalue = OCTVALUE (c);
+       for (temp = 2 + (!evalue && !!sawc); ISOCTAL (*p) && temp--; p++)
          evalue = (evalue * 8) + OCTVALUE (*p);
        *cp = evalue & 0xFF;
        break;
@@ -591,11 +590,15 @@ tescape (estart, trans_squote, cp, sawc)
       /* And, as another extension, we allow \xNNN, where each N is a
         hex digit. */
       case 'x':
+#if 0
+       for (evalue = 0; ISXDIGIT ((unsigned char)*p); p++)
+#else
        for (temp = 2, evalue = 0; ISXDIGIT ((unsigned char)*p) && temp--; p++)
+#endif
          evalue = (evalue * 16) + HEXVALUE (*p);
-       if (temp == 2)
+       if (p == estart + 1)
          {
-           builtin_error ("missing hex digit for \\x");
+           builtin_error (_("missing hex digit for \\x"));
            *cp = '\\';
            return 0;
          }
@@ -606,8 +609,11 @@ tescape (estart, trans_squote, cp, sawc)
        *cp = c;
        break;
 
-      case '\'':       /* TRANS_SQUOTE != 0 means \' -> ' */
-       if (trans_squote)
+      /* SAWC == 0 means that \', \", and \? are recognized as escape
+        sequences, though the only processing performed is backslash
+        removal. */
+      case '\'': case '"': case '?':
+       if (!sawc)
          *cp = c;
        else
          {
@@ -657,7 +663,7 @@ bexpand (string, len, sawc, lenp)
          continue;
        }
       temp = 0;
-      s += tescape (s, 0, &c, &temp);
+      s += tescape (s, &c, &temp);
       if (temp)
        {
          if (sawc)
diff --git a/builtins/psize-posix.c b/builtins/psize-posix.c
new file mode 100644 (file)
index 0000000..dffc9c3
--- /dev/null
@@ -0,0 +1,15 @@
+#include <stdio.h>
+#include <unistd.h>
+
+main(c, v)
+int    c;
+char   **v;
+{
+       char    *p;
+       long    l;
+
+       p = v[1] ? v[1] : "/";
+       l = pathconf (p, _PC_PIPE_BUF);
+       printf ("%ld\n", l);
+       exit(0);
+}
index 2bb72ff..83b69c4 100644 (file)
@@ -1,7 +1,7 @@
 This file is pushd.def, from which is created pushd.c.  It implements the
 builtins "pushd", "popd", and "dirs" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -107,6 +107,7 @@ $END
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include <errno.h>
 
@@ -164,7 +165,7 @@ pushd_builtin (list)
     {
       if (directory_list_offset == 0)
        {
-         builtin_error ("no other directory");
+         builtin_error (_("no other directory"));
          return (EXECUTION_FAILURE);
        }
 
@@ -431,7 +432,7 @@ dirs_builtin (list)
     {
       temp = get_working_directory ("dirs");
       if (temp == 0)
-       temp = savestring ("<no current directory>");
+       temp = savestring (_("<no current directory>"));
       if (vflag & 2)
        printf ("%2d  %s", 0, DIRSTACK_FORMAT (temp));
       else
@@ -648,66 +649,66 @@ get_directory_stack ()
 
 #ifdef LOADABLE_BUILTIN
 static char *dirs_doc[] = {
-  "Display the list of currently remembered directories.  Directories",
-  "find their way onto the list with the `pushd' command; you can get",
-  "back up through the list with the `popd' command.",
-  "",
-  "The -l flag specifies that `dirs' should not print shorthand versions",
-  "of directories which are relative to your home directory.  This means",
-  "that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag",
-  "causes `dirs' to print the directory stack with one entry per line,",
-  "prepending the directory name with its position in the stack.  The -p",
-  "flag does the same thing, but the stack position is not prepended.",
-  "The -c flag clears the directory stack by deleting all of the elements.",
-  "",
-  "+N   displays the Nth entry counting from the left of the list shown by",
-  "     dirs when invoked without options, starting with zero.",
-  "",
-  "-N   displays the Nth entry counting from the right of the list shown by",
-  "     dirs when invoked without options, starting with zero.",
+  N_("Display the list of currently remembered directories.  Directories"),
+  N_("find their way onto the list with the `pushd' command; you can get"),
+  N_("back up through the list with the `popd' command."),
+  N_(""),
+  N_("The -l flag specifies that `dirs' should not print shorthand versions"),
+  N_("of directories which are relative to your home directory.  This means"),
+  N_("that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag"),
+  N_("causes `dirs' to print the directory stack with one entry per line,"),
+  N_("prepending the directory name with its position in the stack.  The -p"),
+  N_("flag does the same thing, but the stack position is not prepended."),
+  N_("The -c flag clears the directory stack by deleting all of the elements."),
+  N_(""),
+  N_("+N   displays the Nth entry counting from the left of the list shown by"),
+  N_("     dirs when invoked without options, starting with zero."),
+  N_(""),
+  N_("-N   displays the Nth entry counting from the right of the list shown by"),
+  N_("     dirs when invoked without options, starting with zero."),
   (char *)NULL
 };
 
 static char *pushd_doc[] = {
-  "Adds a directory to the top of the directory stack, or rotates",
-  "the stack, making the new top of the stack the current working",
-  "directory.  With no arguments, exchanges the top two directories.",
-  "",
-  "+N   Rotates the stack so that the Nth directory (counting",
-  "     from the left of the list shown by `dirs', starting with",
-  "     zero) is at the top.",
-  "",
-  "-N   Rotates the stack so that the Nth directory (counting",
-  "     from the right of the list shown by `dirs', starting with",
-  "     zero) is at the top.",
-  "",
-  "-n   suppress the normal change of directory when adding directories",
-  "     to the stack, so only the stack is manipulated.",
-  "",
-  "dir  adds DIR to the directory stack at the top, making it the",
-  "     new current working directory.",
-  "",
-  "You can see the directory stack with the `dirs' command.",
+  N_("Adds a directory to the top of the directory stack, or rotates"),
+  N_("the stack, making the new top of the stack the current working"),
+  N_("directory.  With no arguments, exchanges the top two directories."),
+  N_(""),
+  N_("+N   Rotates the stack so that the Nth directory (counting"),
+  N_("     from the left of the list shown by `dirs', starting with"),
+  N_("     zero) is at the top."),
+  N_(""),
+  N_("-N   Rotates the stack so that the Nth directory (counting"),
+  N_("     from the right of the list shown by `dirs', starting with"),
+  N_("     zero) is at the top."),
+  N_(""),
+  N_("-n   suppress the normal change of directory when adding directories"),
+  N_("     to the stack, so only the stack is manipulated."),
+  N_(""),
+  N_("dir  adds DIR to the directory stack at the top, making it the"),
+  N_("     new current working directory."),
+  N_(""),
+  N_("You can see the directory stack with the `dirs' command."),
   (char *)NULL
 };
 
 static char *popd_doc[] = {
-  "Removes entries from the directory stack.  With no arguments,",
-  "removes the top directory from the stack, and cd's to the new",
-  "top directory.",
-  "",
-  "+N   removes the Nth entry counting from the left of the list",
-  "     shown by `dirs', starting with zero.  For example: `popd +0'",
-  "     removes the first directory, `popd +1' the second.",
-  "",
-  "-N   removes the Nth entry counting from the right of the list",
-  "     shown by `dirs', starting with zero.  For example: `popd -0'",
-  "     removes the last directory, `popd -1' the next to last.",
-  "",
-  "-n   suppress the normal change of directory when removing directories",
-  "     from the stack, so only the stack is manipulated.",
-  "",
-  "You can see the directory stack with the `dirs' command.",
+  N_("Removes entries from the directory stack.  With no arguments,"),
+  N_("removes the top directory from the stack, and cd's to the new"),
+  N_("top directory."),
+  N_(""),
+  N_("+N   removes the Nth entry counting from the left of the list"),
+  N_("     shown by `dirs', starting with zero.  For example: `popd +0'"),
+  N_("     removes the first directory, `popd +1' the second."),
+  N_(""),
+  N_("-N   removes the Nth entry counting from the right of the list"),
+  N_("     shown by `dirs', starting with zero.  For example: `popd -0'"),
+  N_("     removes the last directory, `popd -1' the next to last."),
+  N_(""),
+  N_("-n   suppress the normal change of directory when removing directories"),
+  N_("     from the stack, so only the stack is manipulated."),
+  N_(""),
+  N_("You can see the directory stack with the `dirs' command."),
   (char *)NULL
 };
 
index 7f6a83c..ccbea84 100644 (file)
@@ -1,7 +1,7 @@
 This file is read.def, from which is created read.c.
 It implements the builtin "read" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -66,6 +66,8 @@ $END
 #  include <io.h>
 #endif
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "common.h"
 #include "bashgetopt.h"
@@ -202,7 +204,7 @@ read_builtin (list)
          code = legal_number (list_optarg, &intval);
          if (code == 0 || intval < 0 || intval != (unsigned int)intval)
            {
-             builtin_error ("%s: invalid timeout specification", list_optarg);
+             builtin_error (_("%s: invalid timeout specification"), list_optarg);
              return (EXECUTION_FAILURE);
            }
          else
@@ -225,14 +227,14 @@ read_builtin (list)
          code = legal_number (list_optarg, &intval);
          if (code == 0 || intval < 0 || intval != (int)intval)
            {
-             builtin_error ("%s: invalid file descriptor specification", list_optarg);
+             builtin_error (_("%s: invalid file descriptor specification"), list_optarg);
              return (EXECUTION_FAILURE);
            }
          else
            fd = intval;
          if (sh_validfd (fd) == 0)
            {
-             builtin_error ("%d: invalid file descriptor: %s", fd, strerror (errno));
+             builtin_error (_("%d: invalid file descriptor: %s"), fd, strerror (errno));
              return (EXECUTION_FAILURE);
            }
          break;
@@ -458,7 +460,7 @@ read_builtin (list)
 #if 1
   if (retval < 0)
     {
-      builtin_error ("read error: %d: %s", fd, strerror (errno));
+      builtin_error (_("read error: %d: %s"), fd, strerror (errno));
       return (EXECUTION_FAILURE);
     }
 #endif
index 84a90a3..23389c0 100644 (file)
@@ -1,7 +1,7 @@
 This file is return.def, from which is created return.c.
 It implements the builtin "return" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -38,6 +38,8 @@ $END
 #  include <unistd.h>
 #endif
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "common.h"
 
@@ -58,7 +60,7 @@ return_builtin (list)
     longjmp (return_catch, 1);
   else
     {
-      builtin_error ("can only `return' from a function or sourced script");
+      builtin_error (_("can only `return' from a function or sourced script"));
       return (EXECUTION_FAILURE);
     }
 }
index 4f900dd..02cc16a 100644 (file)
@@ -33,6 +33,7 @@ $PRODUCES set.c
 #include <stdio.h>
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../flags.h"
@@ -739,7 +740,7 @@ unset_builtin (list)
 
   if (unset_function && unset_variable)
     {
-      builtin_error ("cannot simultaneously unset a function and a variable");
+      builtin_error (_("cannot simultaneously unset a function and a variable"));
       return (EXECUTION_FAILURE);
     }
 
@@ -776,14 +777,14 @@ unset_builtin (list)
 
       if (var && !unset_function && non_unsettable_p (var))
        {
-         builtin_error ("%s: cannot unset", name);
+         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",
+         builtin_error (_("%s: cannot unset: readonly %s"),
                         name, unset_function ? "function" : "variable");
          NEXT_VARIABLE ();
        }
@@ -794,7 +795,7 @@ unset_builtin (list)
        {
          if (array_p (var) == 0)
            {
-             builtin_error ("%s: not an array variable", name);
+             builtin_error (_("%s: not an array variable"), name);
              NEXT_VARIABLE ();
            }
          else
index 0ef5041..d211dbc 100644 (file)
@@ -1,7 +1,7 @@
 This file is setattr.def, from which is created setattr.c.
 It implements the builtins "export" and "readonly", in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -32,6 +32,7 @@ $PRODUCES setattr.c
 
 #include <stdio.h>
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "common.h"
@@ -161,7 +162,7 @@ set_or_show_attributes (list, attribute, nodefs)
              var = find_function (name);
              if (var == 0)
                {
-                 builtin_error ("%s: not a function", name);
+                 builtin_error (_("%s: not a function"), name);
                  any_failed++;
                }
              else
@@ -172,7 +173,7 @@ set_or_show_attributes (list, attribute, nodefs)
            }
 
          /* xxx [-np] name[=value] */
-         assign = assignment (name);
+         assign = assignment (name, 0);
 
          if (assign)
            name[assign] = '\0';
index 236f10f..9744b81 100644 (file)
@@ -1,7 +1,7 @@
 This file is shift.def, from which is created shift.c.
 It implements the builtin "shift" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -31,6 +31,7 @@ $PRODUCES shift.c
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "common.h"
@@ -62,13 +63,13 @@ shift_builtin (list)
     return (EXECUTION_SUCCESS);
   else if (times < 0)
     {
-      sh_erange (list->word->word, "shift count");
+      sh_erange (list->word->word, _("shift count"));
       return (EXECUTION_FAILURE);
     }
   else if (times > number_of_args ())
     {
       if (print_shift_error)
-       sh_erange (list ? list->word->word : NULL, "shift count");
+       sh_erange (list ? list->word->word : NULL, _("shift count"));
       return (EXECUTION_FAILURE);
     }
 
index 88ecbb2..ad432e0 100644 (file)
@@ -1,7 +1,7 @@
 This file is shopt.def, from which is created shopt.c.
 It implements the Bash `shopt' builtin.
 
-Copyright (C) 1994-2002 Free Software Foundation, Inc.
+Copyright (C) 1994-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -45,6 +45,8 @@ $END
 
 #include <stdio.h>
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "../flags.h"
 #include "common.h"
@@ -221,7 +223,7 @@ shopt_builtin (list)
 
   if ((flags & (SFLAG|UFLAG)) == (SFLAG|UFLAG))
     {
-      builtin_error ("cannot set and unset shell options simultaneously");
+      builtin_error (_("cannot set and unset shell options simultaneously"));
       return (EXECUTION_FAILURE);
     }
 
@@ -286,7 +288,7 @@ static void
 shopt_error (s)
      char *s;
 {
-  builtin_error ("%s: invalid shell option name", s);
+  builtin_error (_("%s: invalid shell option name"), s);
 }
 
 static int
index 422e293..f9f812f 100644 (file)
@@ -1,7 +1,7 @@
 This file is source.def, from which is created source.c.
 It implements the builtins "." and  "source" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -55,6 +55,7 @@ $END
 #endif
 
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../flags.h"
@@ -91,7 +92,8 @@ maybe_pop_dollar_vars ()
     dispose_saved_dollar_vars ();
   else
     pop_dollar_vars ();
-  pop_args (); /* restore BASH_ARGC and BASH_ARGV */
+  if (debugging_mode)
+    pop_args ();       /* restore BASH_ARGC and BASH_ARGV */
   set_dollar_vars_unchanged ();
 }
 
@@ -112,7 +114,7 @@ source_builtin (list)
 
   if (list == 0)
     {
-      builtin_error ("filename argument required");
+      builtin_error (_("filename argument required"));
       builtin_usage ();
       return (EX_USAGE);
     }
@@ -132,7 +134,7 @@ source_builtin (list)
     {
       if (source_searches_cwd == 0)
        {
-         builtin_error ("%s: file not found", list->word->word);
+         builtin_error (_("%s: file not found"), list->word->word);
          return (EXECUTION_FAILURE);
        }
       else
@@ -147,7 +149,8 @@ source_builtin (list)
       push_dollar_vars ();
       add_unwind_protect ((Function *)maybe_pop_dollar_vars, (char *)NULL);
       remember_args (list->next, 1);
-      push_args (list->next);  /* Update BASH_ARGV and BASH_ARGC */
+      if (debugging_mode)
+       push_args (list->next); /* Update BASH_ARGV and BASH_ARGC */
     }
   set_dollar_vars_unchanged ();
 
index 6a77210..d616d77 100644 (file)
@@ -1,7 +1,7 @@
 This file is suspend.def, from which is created suspend.c.
 It implements the builtin "suspend" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -42,6 +42,7 @@ $END
 
 #include "../bashtypes.h"
 #include <signal.h>
+#include "../bashintl.h"
 #include "../shell.h"
 #include "../jobs.h"
 #include "common.h"
@@ -89,7 +90,7 @@ suspend_builtin (list)
 
   if (job_control == 0)
     {
-      sh_nojobs ("cannot suspend");
+      sh_nojobs (_("cannot suspend"));
       return (EXECUTION_FAILURE);
     }
 
@@ -99,7 +100,7 @@ suspend_builtin (list)
 
       if (login_shell)
        {
-         builtin_error ("cannot suspend a login shell");
+         builtin_error (_("cannot suspend a login shell"));
          return (EXECUTION_FAILURE);
        }
     }
index 8e5028a..7abcedf 100644 (file)
@@ -58,6 +58,7 @@ $END
 
 #include <stdio.h>
 #include "../bashansi.h"
+#include "../bashintl.h"
 
 #include "../shell.h"
 #include "../findcmd.h"
@@ -227,7 +228,7 @@ describe_command (command, dflags)
       if (dflags & CDESC_TYPE)
        puts ("alias");
       else if (dflags & CDESC_SHORTDESC)
-       printf ("%s is aliased to `%s'\n", command, alias->value);
+       printf (_("%s is aliased to `%s'\n"), command, alias->value);
       else if (dflags & CDESC_REUSABLE)
        {
          x = sh_single_quote (alias->value);
@@ -248,7 +249,7 @@ describe_command (command, dflags)
       if (dflags & CDESC_TYPE)
        puts ("keyword");
       else if (dflags & CDESC_SHORTDESC)
-       printf ("%s is a shell keyword\n", command);
+       printf (_("%s is a shell keyword\n"), command);
       else if (dflags & CDESC_REUSABLE)
        printf ("%s\n", command);
 
@@ -268,7 +269,7 @@ describe_command (command, dflags)
 #define PRETTY_PRINT_FUNC 1
          char *result;
 
-         printf ("%s is a function\n", command);
+         printf (_("%s is a function\n"), command);
 
          /* We're blowing away THE_PRINTED_COMMAND here... */
 
@@ -293,7 +294,7 @@ describe_command (command, dflags)
       if (dflags & CDESC_TYPE)
        puts ("builtin");
       else if (dflags & CDESC_SHORTDESC)
-       printf ("%s is a shell builtin\n", command);
+       printf (_("%s is a shell builtin\n"), command);
       else if (dflags & CDESC_REUSABLE)
        printf ("%s\n", command);
 
@@ -314,7 +315,7 @@ describe_command (command, dflags)
          if (dflags & CDESC_TYPE)
            puts ("file");
          else if (dflags & CDESC_SHORTDESC)
-           printf ("%s is %s\n", command, command);
+           printf (_("%s is %s\n"), command, command);
          else if (dflags & (CDESC_REUSABLE|CDESC_PATH_ONLY))
            printf ("%s\n", command);
 
@@ -334,7 +335,7 @@ describe_command (command, dflags)
          if (dflags & CDESC_TYPE)
            puts ("file");
          else if (dflags & CDESC_SHORTDESC)
-           printf ("%s is hashed (%s)\n", command, full_path);
+           printf (_("%s is hashed (%s)\n"), command, full_path);
          else if (dflags & (CDESC_REUSABLE|CDESC_PATH_ONLY))
            printf ("%s\n", full_path);
 
index 3e147b4..932a6ea 100644 (file)
@@ -1,7 +1,7 @@
 This file is ulimit.def, from which is created ulimit.c.
 It implements the builtin "ulimit" in Bash.
 
-Copyright (C) 1987-2002 Free Software Foundation, Inc.
+Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -70,6 +70,8 @@ $END
 #include <stdio.h>
 #include <errno.h>
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "common.h"
 #include "bashgetopt.h"
@@ -327,7 +329,7 @@ ulimit_builtin (list)
         {
           if (STREQ (list->word->word, "unlimited") == 0)
             {
-              builtin_error ("%s: invalid limit argument", list->word->word);
+              builtin_error (_("%s: invalid limit argument"), list->word->word);
               return (EXECUTION_FAILURE);
             }
           return (set_all_limits (mode == 0 ? LIMIT_SOFT|LIMIT_HARD : mode, RLIM_INFINITY));
@@ -353,7 +355,7 @@ ulimit_builtin (list)
       limind = _findlim (cmdlist[c].cmd);
       if (limind == -1)
        {
-         builtin_error ("`%c': bad command", cmdlist[c].cmd);
+         builtin_error (_("`%c': bad command"), cmdlist[c].cmd);
          return (EX_USAGE);
        }
     }
@@ -382,7 +384,7 @@ ulimit_internal (cmd, cmdarg, mode, multiple)
   opt = get_limit (limind, &soft_limit, &hard_limit);
   if (opt < 0)
     {
-      builtin_error ("%s: cannot get limit: %s", limits[limind].description,
+      builtin_error (_("%s: cannot get limit: %s"), limits[limind].description,
                                                 strerror (errno));
       return (EXECUTION_FAILURE);
     }
@@ -420,7 +422,7 @@ ulimit_internal (cmd, cmdarg, mode, multiple)
 
   if (set_limit (limind, real_limit, mode) < 0)
     {
-      builtin_error ("%s: cannot modify limit: %s", limits[limind].description,
+      builtin_error (_("%s: cannot modify limit: %s"), limits[limind].description,
                                                    strerror (errno));
       return (EXECUTION_FAILURE);
     }
index f169331..e0f02ee 100644 (file)
@@ -48,6 +48,8 @@ $END
 #include <stdio.h>
 #include <chartypes.h>
 
+#include "../bashintl.h"
+
 #include "../shell.h"
 #include "posixstat.h"
 #include "common.h"
@@ -107,7 +109,7 @@ umask_builtin (list)
             is lousy. */
          if (umask_value == -1)
            {
-             sh_erange (list->word->word, "octal number");
+             sh_erange (list->word->word, _("octal number"));
              return (EXECUTION_FAILURE);
            }
        }
@@ -221,7 +223,7 @@ parse_symbolic_mode (mode, initial_bits)
        case '=':
          break;
        default:
-         builtin_error ("`%c': invalid symbolic mode operator", op);
+         builtin_error (_("`%c': invalid symbolic mode operator"), op);
          return (-1);
        }
 
@@ -274,7 +276,7 @@ parse_symbolic_mode (mode, initial_bits)
        }
       else
        {
-         builtin_error ("`%c': invalid symbolic mode character", *s);
+         builtin_error (_("`%c': invalid symbolic mode character"), *s);
          return (-1);
        }
     }
diff --git a/builtins/xkill.def b/builtins/xkill.def
new file mode 100644 (file)
index 0000000..de1a3ed
--- /dev/null
@@ -0,0 +1,249 @@
+This file is kill.def, from which is created kill.c.
+It implements the builtin "kill" in Bash.
+
+Copyright (C) 1987-2003 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+$PRODUCES kill.c
+
+$BUILTIN kill
+$FUNCTION kill_builtin
+$SHORT_DOC kill [-s sigspec | -n signum | -sigspec] [pid | job]... or kill -l [sigspec]
+$_ "Send the processes named by PID (or JOB) the signal SIGSPEC.  If"
+$_ "SIGSPEC is not present, then SIGTERM is assumed.  An argument of `-l'"
+$_ "lists the signal names; if arguments follow `-l' they are assumed to"
+$_ "be signal numbers for which names should be listed.  Kill is a shell"
+$_ "builtin for two reasons: it allows job IDs to be used instead of"
+$_ "process IDs, and, if you have reached the limit on processes that"
+$_ "you can create, you don't have to start a process to kill another one."
+$END
+
+#include <config.h>
+
+#include <stdio.h>
+#include <errno.h>
+#if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
+#  include <unistd.h>
+#endif
+
+#include "../bashansi.h"
+
+#include "../shell.h"
+#include "../trap.h"
+#include "../jobs.h"
+#include "common.h"
+
+/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+extern int posixly_correct;
+
+static void kill_error __P((pid_t, int));
+
+#if !defined (CONTINUE_AFTER_KILL_ERROR)
+#  define CONTINUE_OR_FAIL return (EXECUTION_FAILURE)
+#else
+#  define CONTINUE_OR_FAIL goto continue_killing
+#endif /* CONTINUE_AFTER_KILL_ERROR */
+
+/* Here is the kill builtin.  We only have it so that people can type
+   kill -KILL %1?  No, if you fill up the process table this way you
+   can still kill some. */
+int
+kill_builtin (list)
+     WORD_LIST *list;
+{
+  int sig, any_succeeded, listing, saw_signal, dflags;
+  char *sigspec, *word;
+  pid_t pid;
+  intmax_t pid_value;
+
+  if (list == 0)
+    {
+      builtin_usage ();
+      return (EXECUTION_FAILURE);
+    }
+
+  any_succeeded = listing = saw_signal = 0;
+  sig = SIGTERM;
+  sigspec = "TERM";
+
+  dflags = DSIG_NOCASE | ((posixly_correct == 0) ? DSIG_SIGPREFIX : 0);
+  /* Process options. */
+  while (list)
+    {
+      word = list->word->word;
+
+      if (ISOPTION (word, 'l'))
+       {
+         listing++;
+         list = list->next;
+       }
+      else if (ISOPTION (word, 's') || ISOPTION (word, 'n'))
+       {
+         list = list->next;
+         if (list)
+           {
+             sigspec = list->word->word;
+             if (sigspec[0] == '0' && sigspec[1] == '\0')
+               sig = 0;
+             else
+               sig = decode_signal (sigspec, dflags);
+             list = list->next;
+           }
+         else
+           {
+             sh_needarg (word);
+             return (EXECUTION_FAILURE);
+           }
+       }
+      else if (ISOPTION (word, '-'))
+       {
+         list = list->next;
+         break;
+       }
+      else if (ISOPTION (word, '?'))
+       {
+         builtin_usage ();
+         return (EXECUTION_SUCCESS);
+       }
+      /* If this is a signal specification then process it.  We only process
+        the first one seen; other arguments may signify process groups (e.g,
+        -num == process group num). */
+      else if ((*word == '-') && !saw_signal)
+       {
+         sigspec = word + 1;
+         sig = decode_signal (sigspec, dflags);
+         saw_signal++;
+         list = list->next;
+       }
+      else
+       break;
+    }
+
+  if (listing)
+    return (display_signal_list (list, 0));
+
+  /* OK, we are killing processes. */
+  if (sig == NO_SIG)
+    {
+      sh_invalidsig (sigspec);
+      return (EXECUTION_FAILURE);
+    }
+
+  if (list == 0)
+    {
+      builtin_usage ();
+      return (EXECUTION_FAILURE);
+    }
+
+  while (list)
+    {
+      word = list->word->word;
+
+      if (*word == '-')
+       word++;
+
+      /* Use the entire argument in case of minus sign presence. */
+      if (*word && legal_number (list->word->word, &pid_value) && (pid_value == (pid_t)pid_value))
+       {
+         pid = (pid_t) pid_value;
+
+         if ((pid < -1 ? kill_pid (-pid, sig, 1) : kill_pid (pid, sig, 0)) < 0)
+           {
+             if (errno == EINVAL)
+               sh_invalidsig (sigspec);
+             else
+               kill_error (pid, errno);
+             CONTINUE_OR_FAIL;
+           }
+         else
+           any_succeeded++;
+       }
+#if defined (JOB_CONTROL)
+      else if (*list->word->word && *list->word->word != '%')
+       {
+         builtin_error ("%s: arguments must be process or job IDs", list->word->word);
+         CONTINUE_OR_FAIL;
+       }
+      else if (*word && (interactive || job_control))
+       /* Posix.2 says you can kill without job control active (4.32.4) */
+       {                       /* Must be a job spec.  Check it out. */
+         int job;
+         sigset_t set, oset;
+
+         BLOCK_CHILD (set, oset);
+         job = get_job_spec (list);
+
+         if (job < 0 || job >= job_slots || !jobs[job])
+           {
+             if (job != DUP_JOB)
+               sh_badjob (list->word->word);
+             UNBLOCK_CHILD (oset);
+             CONTINUE_OR_FAIL;
+           }
+
+         /* Job spec used.  Kill the process group. If the job was started
+            without job control, then its pgrp == shell_pgrp, so we have
+            to be careful.  We take the pid of the first job in the pipeline
+            in that case. */
+         pid = IS_JOBCONTROL (job) ? jobs[job]->pgrp : jobs[job]->pipe->pid;
+
+         UNBLOCK_CHILD (oset);
+
+         if (kill_pid (pid, sig, 1) < 0)
+           {
+             if (errno == EINVAL)
+               sh_invalidsig (sigspec);
+             else
+               kill_error (pid, errno);
+             CONTINUE_OR_FAIL;
+           }
+         else
+           any_succeeded++;
+       }
+#endif /* !JOB_CONTROL */
+      else
+       {
+         sh_badpid (list->word->word);
+         CONTINUE_OR_FAIL;
+       }
+    continue_killing:
+      list = list->next;
+    }
+
+  return (any_succeeded ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
+}
+
+static void
+kill_error (pid, e)
+     pid_t pid;
+     int e;
+{
+  char *x;
+
+  x = strerror (e);
+  if (x == 0)
+    x = "Unknown error";
+  builtin_error ("(%ld) - %s", (long)pid, x);
+}
index 52541df..ad894ec 100644 (file)
 /* Define AFS if you are using Transarc's AFS. */
 #undef AFS
 
+#undef ENABLE_NLS
+
 /* End of configuration settings controllable by autoconf. */
 /* Other settable options appear in config-top.h. */
 
 /* Define if you have the bcopy function.  */
 #undef HAVE_BCOPY
 
-/* Define if you have the bindtextdomain function.  */
-#undef HAVE_BINDTEXTDOMAIN
-
 /* Define if you have the bzero function.  */
 #undef HAVE_BZERO
 
 /* Define if you have the getservent function.  */
 #undef HAVE_GETSERVENT
 
-/* Define if you have the gettext function. */
-#undef HAVE_GETTEXT
-
 /* Define if you have the gettimeofday function.  */
 #undef HAVE_GETTIMEOFDAY
 
 /* Define if you have the tcgetpgrp function.  */
 #undef HAVE_TCGETPGRP
 
-/* Define if you have the textdomain function.  */
-#undef HAVE_TEXTDOMAIN
-
 /* Define if you have the times function.  */
 #undef HAVE_TIMES
 
 /* Define if you have the <sys/socket.h> header file.  */
 #undef HAVE_SYS_SOCKET_H
 
+/* Define if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
 /* Define if you have the <sys/stream.h> header file.  */
 #undef HAVE_SYS_STREAM_H
 
 /* Define if you have <sys/times.h> */
 #undef HAVE_SYS_TIMES_H
 
+/* Define if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
 /* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
 #undef HAVE_SYS_WAIT_H
 
 
 #undef GETCWD_BROKEN
 
+/* Additional defines for configuring lib/intl, maintained by autoscan/autoheader */
+
+/* Define if you have the <argz.h> header file. */
+#undef HAVE_ARGZ_H
+
+/* Define if you have the <errno.h> header file. */
+#undef HAVE_ERRNO_H
+
+/* Define if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define if you have the <stdio_ext.h> header file. */
+#undef HAVE_STDIO_EXT_H
+
+/* Define if you have the `dcgettext' function. */
+#undef HAVE_DCGETTEXT
+
+/* Define if your system has a working `malloc' function. */
+#define HAVE_MALLOC
+
+/* Define if you have the `mempcpy' function. */
+#undef HAVE_MEMPCPY
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define if you have the `munmap' function. */
+#undef HAVE_MUNMAP
+
+/* Define if you have the `nl_langinfo' function. */
+#undef HAVE_NL_LANGINFO
+
+/* Define if you have the `stpcpy' function. */
+#undef HAVE_STPCPY
+
+/* Define if you have the `strcspn' function. */
+#undef HAVE_STRCSPN
+
+/* Define if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define if you have the `__argz_count' function. */
+#undef HAVE___ARGZ_COUNT
+
+/* Define if you have the `__argz_next' function. */
+#undef HAVE___ARGZ_NEXT
+
+/* Define if you have the `__argz_stringify' function. */
+#undef HAVE___ARGZ_STRINGIFY
+
+/* End additions for lib/intl */
+
 #include "config-bot.h"
 
 #endif /* _CONFIG_H_ */
index f07ba55..6d746e9 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,5 +1,5 @@
 #! /bin/sh
-# From configure.in for Bash 3.0, version 3.154, from autoconf version 2.52.
+# From configure.in for Bash 3.0, version 3.159, from autoconf version 2.52.
 # Guess values for system-dependent variables and create Makefiles.
 # Generated by Autoconf 2.52 for bash 3.0-alpha.
 #
@@ -723,6 +723,8 @@ Optional Features:
   --enable-profiling      allow profiling with gprof
   --enable-static-link    link bash statically, for use as a root shell
   --disable-largefile     omit support for large files
+  --disable-nls           do not use Native Language Support
+  --disable-rpath         do not hardcode runtime library paths
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -738,6 +740,12 @@ Optional Packages:
                           already installed
   --with-purecov          configure to postprocess with pure coverage
   --with-purify           configure to postprocess with purify
+  --with-gnu-ld           assume the C compiler uses GNU ld default=no
+  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
+  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
+  --with-included-gettext use the GNU gettext library included here
+  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
+  --without-libintl-prefix     don't search for libintl in includedir and libdir
 
 Some influential environment variables:
   DEBUGGER_START_FILE
@@ -936,7 +944,7 @@ if test -z "$CONFIG_SITE"; then
 fi
 for ac_site_file in $CONFIG_SITE; do
   if test -r "$ac_site_file"; then
-    { echo "$as_me:939: loading site script $ac_site_file" >&5
+    { echo "$as_me:947: loading site script $ac_site_file" >&5
 echo "$as_me: loading site script $ac_site_file" >&6;}
     cat "$ac_site_file" >&5
     . "$ac_site_file"
@@ -947,7 +955,7 @@ if test -r "$cache_file"; then
   # Some versions of bash will fail to source /dev/null (special
   # files actually), so we avoid doing that.
   if test -f "$cache_file"; then
-    { echo "$as_me:950: loading cache $cache_file" >&5
+    { echo "$as_me:958: loading cache $cache_file" >&5
 echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
       [\\/]* | ?:[\\/]* ) . $cache_file;;
@@ -955,7 +963,7 @@ echo "$as_me: loading cache $cache_file" >&6;}
     esac
   fi
 else
-  { echo "$as_me:958: creating cache $cache_file" >&5
+  { echo "$as_me:966: creating cache $cache_file" >&5
 echo "$as_me: creating cache $cache_file" >&6;}
   >$cache_file
 fi
@@ -971,21 +979,21 @@ for ac_var in `(set) 2>&1 |
   eval ac_new_val="\$ac_env_${ac_var}_value"
   case $ac_old_set,$ac_new_set in
     set,)
-      { echo "$as_me:974: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+      { echo "$as_me:982: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,set)
-      { echo "$as_me:978: error: \`$ac_var' was not set in the previous run" >&5
+      { echo "$as_me:986: error: \`$ac_var' was not set in the previous run" >&5
 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,);;
     *)
       if test "x$ac_old_val" != "x$ac_new_val"; then
-        { echo "$as_me:984: error: \`$ac_var' has changed since the previous run:" >&5
+        { echo "$as_me:992: error: \`$ac_var' has changed since the previous run:" >&5
 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-        { echo "$as_me:986:   former value:  $ac_old_val" >&5
+        { echo "$as_me:994:   former value:  $ac_old_val" >&5
 echo "$as_me:   former value:  $ac_old_val" >&2;}
-        { echo "$as_me:988:   current value: $ac_new_val" >&5
+        { echo "$as_me:996:   current value: $ac_new_val" >&5
 echo "$as_me:   current value: $ac_new_val" >&2;}
         ac_cache_corrupted=:
       fi;;
@@ -1004,9 +1012,9 @@ echo "$as_me:   current value: $ac_new_val" >&2;}
   fi
 done
 if $ac_cache_corrupted; then
-  { echo "$as_me:1007: error: changes in the environment can compromise the build" >&5
+  { echo "$as_me:1015: error: changes in the environment can compromise the build" >&5
 echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  { { echo "$as_me:1009: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+  { { echo "$as_me:1017: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
    { (exit 1); exit 1; }; }
 fi
@@ -1026,10 +1034,10 @@ esac
 echo "#! $SHELL" >conftest.sh
 echo  "exit 0"   >>conftest.sh
 chmod +x conftest.sh
-if { (echo "$as_me:1029: PATH=\".;.\"; conftest.sh") >&5
+if { (echo "$as_me:1037: PATH=\".;.\"; conftest.sh") >&5
   (PATH=".;."; conftest.sh) 2>&5
   ac_status=$?
-  echo "$as_me:1032: \$? = $ac_status" >&5
+  echo "$as_me:1040: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   ac_path_separator=';'
 else
@@ -1055,7 +1063,7 @@ for ac_dir in ./support $srcdir/./support; do
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:1058: error: cannot find install-sh or install.sh in ./support $srcdir/./support" >&5
+  { { echo "$as_me:1066: error: cannot find install-sh or install.sh in ./support $srcdir/./support" >&5
 echo "$as_me: error: cannot find install-sh or install.sh in ./support $srcdir/./support" >&2;}
    { (exit 1); exit 1; }; }
 fi
@@ -1075,11 +1083,11 @@ esac
 
 # Make sure we can run config.sub.
 $ac_config_sub sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:1078: error: cannot run $ac_config_sub" >&5
+  { { echo "$as_me:1086: error: cannot run $ac_config_sub" >&5
 echo "$as_me: error: cannot run $ac_config_sub" >&2;}
    { (exit 1); exit 1; }; }
 
-echo "$as_me:1082: checking build system type" >&5
+echo "$as_me:1090: checking build system type" >&5
 echo $ECHO_N "checking build system type... $ECHO_C" >&6
 if test "${ac_cv_build+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1088,23 +1096,23 @@ else
 test -z "$ac_cv_build_alias" &&
   ac_cv_build_alias=`$ac_config_guess`
 test -z "$ac_cv_build_alias" &&
-  { { echo "$as_me:1091: error: cannot guess build type; you must specify one" >&5
+  { { echo "$as_me:1099: error: cannot guess build type; you must specify one" >&5
 echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
    { (exit 1); exit 1; }; }
 ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
-  { { echo "$as_me:1095: error: $ac_config_sub $ac_cv_build_alias failed." >&5
+  { { echo "$as_me:1103: error: $ac_config_sub $ac_cv_build_alias failed." >&5
 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;}
    { (exit 1); exit 1; }; }
 
 fi
-echo "$as_me:1100: result: $ac_cv_build" >&5
+echo "$as_me:1108: result: $ac_cv_build" >&5
 echo "${ECHO_T}$ac_cv_build" >&6
 build=$ac_cv_build
 build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
 build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
 build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 
-echo "$as_me:1107: checking host system type" >&5
+echo "$as_me:1115: checking host system type" >&5
 echo $ECHO_N "checking host system type... $ECHO_C" >&6
 if test "${ac_cv_host+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1113,12 +1121,12 @@ else
 test -z "$ac_cv_host_alias" &&
   ac_cv_host_alias=$ac_cv_build_alias
 ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
-  { { echo "$as_me:1116: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+  { { echo "$as_me:1124: error: $ac_config_sub $ac_cv_host_alias failed" >&5
 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
    { (exit 1); exit 1; }; }
 
 fi
-echo "$as_me:1121: result: $ac_cv_host" >&5
+echo "$as_me:1129: result: $ac_cv_host" >&5
 echo "${ECHO_T}$ac_cv_host" >&6
 host=$ac_cv_host
 host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
@@ -1170,9 +1178,9 @@ esac
 if test "${with_lispdir+set}" = set; then
   withval="$with_lispdir"
    lispdir="$withval"
-    echo "$as_me:1173: checking where .elc files should go" >&5
+    echo "$as_me:1181: checking where .elc files should go" >&5
 echo $ECHO_N "checking where .elc files should go... $ECHO_C" >&6
-    echo "$as_me:1175: result: $lispdir" >&5
+    echo "$as_me:1183: result: $lispdir" >&5
 echo "${ECHO_T}$lispdir" >&6
 else
 
@@ -1183,7 +1191,7 @@ else
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-echo "$as_me:1186: checking for $ac_word" >&5
+echo "$as_me:1194: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_EMACS+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1198,7 +1206,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_EMACS="$ac_prog"
-echo "$as_me:1201: found $ac_dir/$ac_word" >&5
+echo "$as_me:1209: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -1206,10 +1214,10 @@ fi
 fi
 EMACS=$ac_cv_prog_EMACS
 if test -n "$EMACS"; then
-  echo "$as_me:1209: result: $EMACS" >&5
+  echo "$as_me:1217: result: $EMACS" >&5
 echo "${ECHO_T}$EMACS" >&6
 else
-  echo "$as_me:1212: result: no" >&5
+  echo "$as_me:1220: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -1219,7 +1227,7 @@ test -n "$EMACS" || EMACS="no"
 
   if test $EMACS != "no"; then
     if test x${lispdir+set} != xset; then
-      echo "$as_me:1222: checking where .elc files should go" >&5
+      echo "$as_me:1230: checking where .elc files should go" >&5
 echo $ECHO_N "checking where .elc files should go... $ECHO_C" >&6
 if test "${am_cv_lispdir+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1230,7 +1238,7 @@ else
        fi
 
 fi
-echo "$as_me:1233: result: $am_cv_lispdir" >&5
+echo "$as_me:1241: result: $am_cv_lispdir" >&5
 echo "${ECHO_T}$am_cv_lispdir" >&6
       lispdir="$am_cv_lispdir"
     fi
@@ -1693,7 +1701,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:1696: checking for $ac_word" >&5
+echo "$as_me:1704: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1708,7 +1716,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_CC="${ac_tool_prefix}gcc"
-echo "$as_me:1711: found $ac_dir/$ac_word" >&5
+echo "$as_me:1719: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -1716,10 +1724,10 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:1719: result: $CC" >&5
+  echo "$as_me:1727: result: $CC" >&5
 echo "${ECHO_T}$CC" >&6
 else
-  echo "$as_me:1722: result: no" >&5
+  echo "$as_me:1730: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -1728,7 +1736,7 @@ if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-echo "$as_me:1731: checking for $ac_word" >&5
+echo "$as_me:1739: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1743,7 +1751,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_ac_ct_CC="gcc"
-echo "$as_me:1746: found $ac_dir/$ac_word" >&5
+echo "$as_me:1754: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -1751,10 +1759,10 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:1754: result: $ac_ct_CC" >&5
+  echo "$as_me:1762: result: $ac_ct_CC" >&5
 echo "${ECHO_T}$ac_ct_CC" >&6
 else
-  echo "$as_me:1757: result: no" >&5
+  echo "$as_me:1765: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -1767,7 +1775,7 @@ if test -z "$CC"; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:1770: checking for $ac_word" >&5
+echo "$as_me:1778: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1782,7 +1790,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_CC="${ac_tool_prefix}cc"
-echo "$as_me:1785: found $ac_dir/$ac_word" >&5
+echo "$as_me:1793: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -1790,10 +1798,10 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:1793: result: $CC" >&5
+  echo "$as_me:1801: result: $CC" >&5
 echo "${ECHO_T}$CC" >&6
 else
-  echo "$as_me:1796: result: no" >&5
+  echo "$as_me:1804: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -1802,7 +1810,7 @@ if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
-echo "$as_me:1805: checking for $ac_word" >&5
+echo "$as_me:1813: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1817,7 +1825,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_ac_ct_CC="cc"
-echo "$as_me:1820: found $ac_dir/$ac_word" >&5
+echo "$as_me:1828: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -1825,10 +1833,10 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:1828: result: $ac_ct_CC" >&5
+  echo "$as_me:1836: result: $ac_ct_CC" >&5
 echo "${ECHO_T}$ac_ct_CC" >&6
 else
-  echo "$as_me:1831: result: no" >&5
+  echo "$as_me:1839: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -1841,7 +1849,7 @@ fi
 if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
-echo "$as_me:1844: checking for $ac_word" >&5
+echo "$as_me:1852: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1861,7 +1869,7 @@ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
   continue
 fi
 ac_cv_prog_CC="cc"
-echo "$as_me:1864: found $ac_dir/$ac_word" >&5
+echo "$as_me:1872: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -1883,10 +1891,10 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:1886: result: $CC" >&5
+  echo "$as_me:1894: result: $CC" >&5
 echo "${ECHO_T}$CC" >&6
 else
-  echo "$as_me:1889: result: no" >&5
+  echo "$as_me:1897: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -1897,7 +1905,7 @@ if test -z "$CC"; then
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:1900: checking for $ac_word" >&5
+echo "$as_me:1908: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1912,7 +1920,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-echo "$as_me:1915: found $ac_dir/$ac_word" >&5
+echo "$as_me:1923: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -1920,10 +1928,10 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  echo "$as_me:1923: result: $CC" >&5
+  echo "$as_me:1931: result: $CC" >&5
 echo "${ECHO_T}$CC" >&6
 else
-  echo "$as_me:1926: result: no" >&5
+  echo "$as_me:1934: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -1936,7 +1944,7 @@ if test -z "$CC"; then
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-echo "$as_me:1939: checking for $ac_word" >&5
+echo "$as_me:1947: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -1951,7 +1959,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_ac_ct_CC="$ac_prog"
-echo "$as_me:1954: found $ac_dir/$ac_word" >&5
+echo "$as_me:1962: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -1959,10 +1967,10 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  echo "$as_me:1962: result: $ac_ct_CC" >&5
+  echo "$as_me:1970: result: $ac_ct_CC" >&5
 echo "${ECHO_T}$ac_ct_CC" >&6
 else
-  echo "$as_me:1965: result: no" >&5
+  echo "$as_me:1973: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -1974,32 +1982,32 @@ fi
 
 fi
 
-test -z "$CC" && { { echo "$as_me:1977: error: no acceptable cc found in \$PATH" >&5
+test -z "$CC" && { { echo "$as_me:1985: error: no acceptable cc found in \$PATH" >&5
 echo "$as_me: error: no acceptable cc found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:1982:" \
+echo "$as_me:1990:" \
      "checking for C compiler version" >&5
 ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:1985: \"$ac_compiler --version </dev/null >&5\"") >&5
+{ (eval echo "$as_me:1993: \"$ac_compiler --version </dev/null >&5\"") >&5
   (eval $ac_compiler --version </dev/null >&5) 2>&5
   ac_status=$?
-  echo "$as_me:1988: \$? = $ac_status" >&5
+  echo "$as_me:1996: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:1990: \"$ac_compiler -v </dev/null >&5\"") >&5
+{ (eval echo "$as_me:1998: \"$ac_compiler -v </dev/null >&5\"") >&5
   (eval $ac_compiler -v </dev/null >&5) 2>&5
   ac_status=$?
-  echo "$as_me:1993: \$? = $ac_status" >&5
+  echo "$as_me:2001: \$? = $ac_status" >&5
   (exit $ac_status); }
-{ (eval echo "$as_me:1995: \"$ac_compiler -V </dev/null >&5\"") >&5
+{ (eval echo "$as_me:2003: \"$ac_compiler -V </dev/null >&5\"") >&5
   (eval $ac_compiler -V </dev/null >&5) 2>&5
   ac_status=$?
-  echo "$as_me:1998: \$? = $ac_status" >&5
+  echo "$as_me:2006: \$? = $ac_status" >&5
   (exit $ac_status); }
 
 cat >conftest.$ac_ext <<_ACEOF
-#line 2002 "configure"
+#line 2010 "configure"
 #include "confdefs.h"
 
 int
@@ -2015,13 +2023,13 @@ ac_clean_files="$ac_clean_files a.out a.exe"
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-echo "$as_me:2018: checking for C compiler default output" >&5
+echo "$as_me:2026: checking for C compiler default output" >&5
 echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:2021: \"$ac_link_default\"") >&5
+if { (eval echo "$as_me:2029: \"$ac_link_default\"") >&5
   (eval $ac_link_default) 2>&5
   ac_status=$?
-  echo "$as_me:2024: \$? = $ac_status" >&5
+  echo "$as_me:2032: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   # Find the output, starting from the most likely.  This scheme is
 # not robust to junk in `.', hence go to wildcards (a.*) only as a last
@@ -2044,34 +2052,34 @@ done
 else
   echo "$as_me: failed program was:" >&5
 cat conftest.$ac_ext >&5
-{ { echo "$as_me:2047: error: C compiler cannot create executables" >&5
+{ { echo "$as_me:2055: error: C compiler cannot create executables" >&5
 echo "$as_me: error: C compiler cannot create executables" >&2;}
    { (exit 77); exit 77; }; }
 fi
 
 ac_exeext=$ac_cv_exeext
-echo "$as_me:2053: result: $ac_file" >&5
+echo "$as_me:2061: result: $ac_file" >&5
 echo "${ECHO_T}$ac_file" >&6
 
 # Check the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:2058: checking whether the C compiler works" >&5
+echo "$as_me:2066: checking whether the C compiler works" >&5
 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
 # If not cross compiling, check that we can run a simple program.
 if test "$cross_compiling" != yes; then
   if { ac_try='./$ac_file'
-  { (eval echo "$as_me:2064: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2072: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2067: \$? = $ac_status" >&5
+  echo "$as_me:2075: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
     cross_compiling=no
   else
     if test "$cross_compiling" = maybe; then
        cross_compiling=yes
     else
-       { { echo "$as_me:2074: error: cannot run C compiled programs.
+       { { echo "$as_me:2082: error: cannot run C compiled programs.
 If you meant to cross compile, use \`--host'." >&5
 echo "$as_me: error: cannot run C compiled programs.
 If you meant to cross compile, use \`--host'." >&2;}
@@ -2079,24 +2087,24 @@ If you meant to cross compile, use \`--host'." >&2;}
     fi
   fi
 fi
-echo "$as_me:2082: result: yes" >&5
+echo "$as_me:2090: result: yes" >&5
 echo "${ECHO_T}yes" >&6
 
 rm -f a.out a.exe conftest$ac_cv_exeext
 ac_clean_files=$ac_clean_files_save
 # Check the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-echo "$as_me:2089: checking whether we are cross compiling" >&5
+echo "$as_me:2097: checking whether we are cross compiling" >&5
 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:2091: result: $cross_compiling" >&5
+echo "$as_me:2099: result: $cross_compiling" >&5
 echo "${ECHO_T}$cross_compiling" >&6
 
-echo "$as_me:2094: checking for executable suffix" >&5
+echo "$as_me:2102: checking for executable suffix" >&5
 echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6
-if { (eval echo "$as_me:2096: \"$ac_link\"") >&5
+if { (eval echo "$as_me:2104: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:2099: \$? = $ac_status" >&5
+  echo "$as_me:2107: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   # If both `conftest.exe' and `conftest' are `present' (well, observable)
 # catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
@@ -2112,25 +2120,25 @@ for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
   esac
 done
 else
-  { { echo "$as_me:2115: error: cannot compute EXEEXT: cannot compile and link" >&5
+  { { echo "$as_me:2123: error: cannot compute EXEEXT: cannot compile and link" >&5
 echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;}
    { (exit 1); exit 1; }; }
 fi
 
 rm -f conftest$ac_cv_exeext
-echo "$as_me:2121: result: $ac_cv_exeext" >&5
+echo "$as_me:2129: result: $ac_cv_exeext" >&5
 echo "${ECHO_T}$ac_cv_exeext" >&6
 
 rm -f conftest.$ac_ext
 EXEEXT=$ac_cv_exeext
 ac_exeext=$EXEEXT
-echo "$as_me:2127: checking for object suffix" >&5
+echo "$as_me:2135: checking for object suffix" >&5
 echo $ECHO_N "checking for object suffix... $ECHO_C" >&6
 if test "${ac_cv_objext+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 2133 "configure"
+#line 2141 "configure"
 #include "confdefs.h"
 
 int
@@ -2142,10 +2150,10 @@ main ()
 }
 _ACEOF
 rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:2145: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2153: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2148: \$? = $ac_status" >&5
+  echo "$as_me:2156: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
   case $ac_file in
@@ -2157,24 +2165,24 @@ done
 else
   echo "$as_me: failed program was:" >&5
 cat conftest.$ac_ext >&5
-{ { echo "$as_me:2160: error: cannot compute OBJEXT: cannot compile" >&5
+{ { echo "$as_me:2168: error: cannot compute OBJEXT: cannot compile" >&5
 echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;}
    { (exit 1); exit 1; }; }
 fi
 
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-echo "$as_me:2167: result: $ac_cv_objext" >&5
+echo "$as_me:2175: result: $ac_cv_objext" >&5
 echo "${ECHO_T}$ac_cv_objext" >&6
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-echo "$as_me:2171: checking whether we are using the GNU C compiler" >&5
+echo "$as_me:2179: checking whether we are using the GNU C compiler" >&5
 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 2177 "configure"
+#line 2185 "configure"
 #include "confdefs.h"
 
 int
@@ -2189,16 +2197,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2192: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2200: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2195: \$? = $ac_status" >&5
+  echo "$as_me:2203: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2198: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2206: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2201: \$? = $ac_status" >&5
+  echo "$as_me:2209: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_compiler_gnu=yes
 else
@@ -2210,19 +2218,19 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-echo "$as_me:2213: result: $ac_cv_c_compiler_gnu" >&5
+echo "$as_me:2221: result: $ac_cv_c_compiler_gnu" >&5
 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
 GCC=`test $ac_compiler_gnu = yes && echo yes`
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
 CFLAGS="-g"
-echo "$as_me:2219: checking whether $CC accepts -g" >&5
+echo "$as_me:2227: checking whether $CC accepts -g" >&5
 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
 if test "${ac_cv_prog_cc_g+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 2225 "configure"
+#line 2233 "configure"
 #include "confdefs.h"
 
 int
@@ -2234,16 +2242,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2237: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2245: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2240: \$? = $ac_status" >&5
+  echo "$as_me:2248: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2243: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2251: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2246: \$? = $ac_status" >&5
+  echo "$as_me:2254: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_prog_cc_g=yes
 else
@@ -2253,7 +2261,7 @@ ac_cv_prog_cc_g=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:2256: result: $ac_cv_prog_cc_g" >&5
+echo "$as_me:2264: result: $ac_cv_prog_cc_g" >&5
 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
@@ -2280,16 +2288,16 @@ cat >conftest.$ac_ext <<_ACEOF
 #endif
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2283: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2291: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2286: \$? = $ac_status" >&5
+  echo "$as_me:2294: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2289: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2297: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2292: \$? = $ac_status" >&5
+  echo "$as_me:2300: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   for ac_declaration in \
    ''\
@@ -2301,7 +2309,7 @@ if { (eval echo "$as_me:2283: \"$ac_compile\"") >&5
    'void exit (int);'
 do
   cat >conftest.$ac_ext <<_ACEOF
-#line 2304 "configure"
+#line 2312 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 $ac_declaration
@@ -2314,16 +2322,16 @@ exit (42);
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2317: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2325: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2320: \$? = $ac_status" >&5
+  echo "$as_me:2328: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2323: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2331: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2326: \$? = $ac_status" >&5
+  echo "$as_me:2334: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   :
 else
@@ -2333,7 +2341,7 @@ continue
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
-#line 2336 "configure"
+#line 2344 "configure"
 #include "confdefs.h"
 $ac_declaration
 int
@@ -2345,16 +2353,16 @@ exit (42);
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2348: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2356: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2351: \$? = $ac_status" >&5
+  echo "$as_me:2359: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2354: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2362: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2357: \$? = $ac_status" >&5
+  echo "$as_me:2365: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   break
 else
@@ -2381,28 +2389,57 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-echo "$as_me:2384: checking for POSIXized ISC" >&5
-echo $ECHO_N "checking for POSIXized ISC... $ECHO_C" >&6
-if test -d /etc/conf/kconfig.d &&
-   grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
-then
-  echo "$as_me:2389: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-  ISC=yes # If later tests want to check for ISC.
-
-cat >>confdefs.h <<\EOF
-#define _POSIX_SOURCE 1
-EOF
+        echo "$as_me:2392: checking for strerror in -lcposix" >&5
+echo $ECHO_N "checking for strerror in -lcposix... $ECHO_C" >&6
+if test "${ac_cv_lib_cposix_strerror+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcposix  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 2400 "configure"
+#include "confdefs.h"
 
-  if test "$GCC" = yes; then
-    CC="$CC -posix"
-  else
-    CC="$CC -Xp"
-  fi
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char strerror ();
+int
+main ()
+{
+strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2419: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:2422: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:2425: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:2428: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_cposix_strerror=yes
 else
-  echo "$as_me:2403: result: no" >&5
-echo "${ECHO_T}no" >&6
-  ISC=
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_cposix_strerror=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:2439: result: $ac_cv_lib_cposix_strerror" >&5
+echo "${ECHO_T}$ac_cv_lib_cposix_strerror" >&6
+if test $ac_cv_lib_cposix_strerror = yes; then
+  LIBS="$LIBS -lcposix"
 fi
 
 ac_ext=c
@@ -2410,7 +2447,7 @@ ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:2413: checking how to run the C preprocessor" >&5
+echo "$as_me:2450: checking how to run the C preprocessor" >&5
 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
@@ -2431,18 +2468,18 @@ do
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
   cat >conftest.$ac_ext <<_ACEOF
-#line 2434 "configure"
+#line 2471 "configure"
 #include "confdefs.h"
 #include <assert.h>
                      Syntax error
 _ACEOF
-if { (eval echo "$as_me:2439: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:2476: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:2445: \$? = $ac_status" >&5
+  echo "$as_me:2482: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -2465,17 +2502,17 @@ rm -f conftest.err conftest.$ac_ext
   # OK, works on sane cases.  Now check whether non-existent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
-#line 2468 "configure"
+#line 2505 "configure"
 #include "confdefs.h"
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:2472: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:2509: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:2478: \$? = $ac_status" >&5
+  echo "$as_me:2515: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -2512,7 +2549,7 @@ fi
 else
   ac_cv_prog_CPP=$CPP
 fi
-echo "$as_me:2515: result: $CPP" >&5
+echo "$as_me:2552: result: $CPP" >&5
 echo "${ECHO_T}$CPP" >&6
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
@@ -2522,18 +2559,18 @@ do
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
   cat >conftest.$ac_ext <<_ACEOF
-#line 2525 "configure"
+#line 2562 "configure"
 #include "confdefs.h"
 #include <assert.h>
                      Syntax error
 _ACEOF
-if { (eval echo "$as_me:2530: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:2567: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:2536: \$? = $ac_status" >&5
+  echo "$as_me:2573: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -2556,17 +2593,17 @@ rm -f conftest.err conftest.$ac_ext
   # OK, works on sane cases.  Now check whether non-existent headers
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
-#line 2559 "configure"
+#line 2596 "configure"
 #include "confdefs.h"
 #include <ac_nonexistent.h>
 _ACEOF
-if { (eval echo "$as_me:2563: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:2600: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:2569: \$? = $ac_status" >&5
+  echo "$as_me:2606: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -2594,7 +2631,7 @@ rm -f conftest.err conftest.$ac_ext
 if $ac_preproc_ok; then
   :
 else
-  { { echo "$as_me:2597: error: C preprocessor \"$CPP\" fails sanity check" >&5
+  { { echo "$as_me:2634: error: C preprocessor \"$CPP\" fails sanity check" >&5
 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
    { (exit 1); exit 1; }; }
 fi
@@ -2605,23 +2642,23 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-echo "$as_me:2608: checking for minix/config.h" >&5
+echo "$as_me:2645: checking for minix/config.h" >&5
 echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
 if test "${ac_cv_header_minix_config_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 2614 "configure"
+#line 2651 "configure"
 #include "confdefs.h"
 #include <minix/config.h>
 _ACEOF
-if { (eval echo "$as_me:2618: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:2655: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:2624: \$? = $ac_status" >&5
+  echo "$as_me:2661: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -2640,7 +2677,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:2643: result: $ac_cv_header_minix_config_h" >&5
+echo "$as_me:2680: result: $ac_cv_header_minix_config_h" >&5
 echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
 if test $ac_cv_header_minix_config_h = yes; then
   MINIX=yes
@@ -2681,7 +2718,7 @@ if test "${enable_largefile+set}" = set; then
 fi;
 if test "$enable_largefile" != no; then
 
-  echo "$as_me:2684: checking for special C compiler options needed for large files" >&5
+  echo "$as_me:2721: checking for special C compiler options needed for large files" >&5
 echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
 if test "${ac_cv_sys_largefile_CC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -2693,7 +2730,7 @@ else
         # IRIX 6.2 and later do not support large files by default,
         # so use the C compiler's -n32 option if that helps.
          cat >conftest.$ac_ext <<_ACEOF
-#line 2696 "configure"
+#line 2733 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
  /* Check that off_t can represent 2**63 - 1 correctly.
@@ -2713,16 +2750,16 @@ main ()
 }
 _ACEOF
         rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2716: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2753: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2719: \$? = $ac_status" >&5
+  echo "$as_me:2756: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2722: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2759: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2725: \$? = $ac_status" >&5
+  echo "$as_me:2762: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   break
 else
@@ -2732,16 +2769,16 @@ fi
 rm -f conftest.$ac_objext
         CC="$CC -n32"
         rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2735: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2772: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2738: \$? = $ac_status" >&5
+  echo "$as_me:2775: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2741: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2778: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2744: \$? = $ac_status" >&5
+  echo "$as_me:2781: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sys_largefile_CC=' -n32'; break
 else
@@ -2755,13 +2792,13 @@ rm -f conftest.$ac_objext
        rm -f conftest.$ac_ext
     fi
 fi
-echo "$as_me:2758: result: $ac_cv_sys_largefile_CC" >&5
+echo "$as_me:2795: result: $ac_cv_sys_largefile_CC" >&5
 echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
   if test "$ac_cv_sys_largefile_CC" != no; then
     CC=$CC$ac_cv_sys_largefile_CC
   fi
 
-  echo "$as_me:2764: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+  echo "$as_me:2801: checking for _FILE_OFFSET_BITS value needed for large files" >&5
 echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6
 if test "${ac_cv_sys_file_offset_bits+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -2769,7 +2806,7 @@ else
   while :; do
   ac_cv_sys_file_offset_bits=no
   cat >conftest.$ac_ext <<_ACEOF
-#line 2772 "configure"
+#line 2809 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
  /* Check that off_t can represent 2**63 - 1 correctly.
@@ -2789,16 +2826,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2792: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2829: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2795: \$? = $ac_status" >&5
+  echo "$as_me:2832: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2798: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2835: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2801: \$? = $ac_status" >&5
+  echo "$as_me:2838: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   break
 else
@@ -2807,7 +2844,7 @@ cat conftest.$ac_ext >&5
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
-#line 2810 "configure"
+#line 2847 "configure"
 #include "confdefs.h"
 #define _FILE_OFFSET_BITS 64
 #include <sys/types.h>
@@ -2828,16 +2865,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2831: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2868: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2834: \$? = $ac_status" >&5
+  echo "$as_me:2871: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2837: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2874: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2840: \$? = $ac_status" >&5
+  echo "$as_me:2877: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sys_file_offset_bits=64; break
 else
@@ -2848,7 +2885,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
   break
 done
 fi
-echo "$as_me:2851: result: $ac_cv_sys_file_offset_bits" >&5
+echo "$as_me:2888: result: $ac_cv_sys_file_offset_bits" >&5
 echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
 if test "$ac_cv_sys_file_offset_bits" != no; then
 
@@ -2858,7 +2895,7 @@ EOF
 
 fi
 rm -f conftest*
-  echo "$as_me:2861: checking for _LARGE_FILES value needed for large files" >&5
+  echo "$as_me:2898: checking for _LARGE_FILES value needed for large files" >&5
 echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
 if test "${ac_cv_sys_large_files+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -2866,7 +2903,7 @@ else
   while :; do
   ac_cv_sys_large_files=no
   cat >conftest.$ac_ext <<_ACEOF
-#line 2869 "configure"
+#line 2906 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
  /* Check that off_t can represent 2**63 - 1 correctly.
@@ -2886,16 +2923,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2889: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2926: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2892: \$? = $ac_status" >&5
+  echo "$as_me:2929: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2895: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2932: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2898: \$? = $ac_status" >&5
+  echo "$as_me:2935: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   break
 else
@@ -2904,7 +2941,7 @@ cat conftest.$ac_ext >&5
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
-#line 2907 "configure"
+#line 2944 "configure"
 #include "confdefs.h"
 #define _LARGE_FILES 1
 #include <sys/types.h>
@@ -2925,16 +2962,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:2928: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:2965: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:2931: \$? = $ac_status" >&5
+  echo "$as_me:2968: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:2934: \"$ac_try\"") >&5
+  { (eval echo "$as_me:2971: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:2937: \$? = $ac_status" >&5
+  echo "$as_me:2974: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sys_large_files=1; break
 else
@@ -2945,7 +2982,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
   break
 done
 fi
-echo "$as_me:2948: result: $ac_cv_sys_large_files" >&5
+echo "$as_me:2985: result: $ac_cv_sys_large_files" >&5
 echo "${ECHO_T}$ac_cv_sys_large_files" >&6
 if test "$ac_cv_sys_large_files" != no; then
 
@@ -3015,14 +3052,14 @@ test -z "$CPPFLAGS_FOR_BUILD" && CPPFLAGS_FOR_BUILD="$CPPFLAGS"
 test -z "$CFLAGS_FOR_BUILD" && CFLAGS_FOR_BUILD="-g"
 
 if test $ac_cv_c_compiler_gnu = yes; then
-    echo "$as_me:3018: checking whether $CC needs -traditional" >&5
+    echo "$as_me:3055: checking whether $CC needs -traditional" >&5
 echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
 if test "${ac_cv_prog_gcc_traditional+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
     ac_pattern="Autoconf.*'x'"
   cat >conftest.$ac_ext <<_ACEOF
-#line 3025 "configure"
+#line 3062 "configure"
 #include "confdefs.h"
 #include <sgtty.h>
 Autoconf TIOCGETP
@@ -3037,7 +3074,7 @@ rm -f conftest*
 
   if test $ac_cv_prog_gcc_traditional = no; then
     cat >conftest.$ac_ext <<_ACEOF
-#line 3040 "configure"
+#line 3077 "configure"
 #include "confdefs.h"
 #include <termio.h>
 Autoconf TCGETA
@@ -3050,7 +3087,7 @@ rm -f conftest*
 
   fi
 fi
-echo "$as_me:3053: result: $ac_cv_prog_gcc_traditional" >&5
+echo "$as_me:3090: result: $ac_cv_prog_gcc_traditional" >&5
 echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
   if test $ac_cv_prog_gcc_traditional = yes; then
     CC="$CC -traditional"
@@ -3066,20 +3103,20 @@ then
 if test "X$bash_cv_termcap_lib" = "X"; then
 _bash_needmsg=yes
 else
-echo "$as_me:3069: checking which library has the termcap functions" >&5
+echo "$as_me:3106: checking which library has the termcap functions" >&5
 echo $ECHO_N "checking which library has the termcap functions... $ECHO_C" >&6
 _bash_needmsg=
 fi
 if test "${bash_cv_termcap_lib+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  echo "$as_me:3076: checking for tgetent" >&5
+  echo "$as_me:3113: checking for tgetent" >&5
 echo $ECHO_N "checking for tgetent... $ECHO_C" >&6
 if test "${ac_cv_func_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 3082 "configure"
+#line 3119 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char tgetent (); below.  */
@@ -3110,16 +3147,16 @@ f = tgetent;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:3113: \"$ac_link\"") >&5
+if { (eval echo "$as_me:3150: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:3116: \$? = $ac_status" >&5
+  echo "$as_me:3153: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:3119: \"$ac_try\"") >&5
+  { (eval echo "$as_me:3156: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:3122: \$? = $ac_status" >&5
+  echo "$as_me:3159: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_tgetent=yes
 else
@@ -3129,12 +3166,12 @@ ac_cv_func_tgetent=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:3132: result: $ac_cv_func_tgetent" >&5
+echo "$as_me:3169: result: $ac_cv_func_tgetent" >&5
 echo "${ECHO_T}$ac_cv_func_tgetent" >&6
 if test $ac_cv_func_tgetent = yes; then
   bash_cv_termcap_lib=libc
 else
-  echo "$as_me:3137: checking for tgetent in -ltermcap" >&5
+  echo "$as_me:3174: checking for tgetent in -ltermcap" >&5
 echo $ECHO_N "checking for tgetent in -ltermcap... $ECHO_C" >&6
 if test "${ac_cv_lib_termcap_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3142,7 +3179,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ltermcap  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 3145 "configure"
+#line 3182 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -3161,16 +3198,16 @@ tgetent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:3164: \"$ac_link\"") >&5
+if { (eval echo "$as_me:3201: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:3167: \$? = $ac_status" >&5
+  echo "$as_me:3204: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:3170: \"$ac_try\"") >&5
+  { (eval echo "$as_me:3207: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:3173: \$? = $ac_status" >&5
+  echo "$as_me:3210: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_termcap_tgetent=yes
 else
@@ -3181,12 +3218,12 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:3184: result: $ac_cv_lib_termcap_tgetent" >&5
+echo "$as_me:3221: result: $ac_cv_lib_termcap_tgetent" >&5
 echo "${ECHO_T}$ac_cv_lib_termcap_tgetent" >&6
 if test $ac_cv_lib_termcap_tgetent = yes; then
   bash_cv_termcap_lib=libtermcap
 else
-  echo "$as_me:3189: checking for tgetent in -ltinfo" >&5
+  echo "$as_me:3226: checking for tgetent in -ltinfo" >&5
 echo $ECHO_N "checking for tgetent in -ltinfo... $ECHO_C" >&6
 if test "${ac_cv_lib_tinfo_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3194,7 +3231,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ltinfo  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 3197 "configure"
+#line 3234 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -3213,16 +3250,16 @@ tgetent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:3216: \"$ac_link\"") >&5
+if { (eval echo "$as_me:3253: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:3219: \$? = $ac_status" >&5
+  echo "$as_me:3256: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:3222: \"$ac_try\"") >&5
+  { (eval echo "$as_me:3259: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:3225: \$? = $ac_status" >&5
+  echo "$as_me:3262: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_tinfo_tgetent=yes
 else
@@ -3233,12 +3270,12 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:3236: result: $ac_cv_lib_tinfo_tgetent" >&5
+echo "$as_me:3273: result: $ac_cv_lib_tinfo_tgetent" >&5
 echo "${ECHO_T}$ac_cv_lib_tinfo_tgetent" >&6
 if test $ac_cv_lib_tinfo_tgetent = yes; then
   bash_cv_termcap_lib=libtinfo
 else
-  echo "$as_me:3241: checking for tgetent in -lcurses" >&5
+  echo "$as_me:3278: checking for tgetent in -lcurses" >&5
 echo $ECHO_N "checking for tgetent in -lcurses... $ECHO_C" >&6
 if test "${ac_cv_lib_curses_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3246,7 +3283,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lcurses  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 3249 "configure"
+#line 3286 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -3265,16 +3302,16 @@ tgetent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:3268: \"$ac_link\"") >&5
+if { (eval echo "$as_me:3305: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:3271: \$? = $ac_status" >&5
+  echo "$as_me:3308: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:3274: \"$ac_try\"") >&5
+  { (eval echo "$as_me:3311: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:3277: \$? = $ac_status" >&5
+  echo "$as_me:3314: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_curses_tgetent=yes
 else
@@ -3285,12 +3322,12 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:3288: result: $ac_cv_lib_curses_tgetent" >&5
+echo "$as_me:3325: result: $ac_cv_lib_curses_tgetent" >&5
 echo "${ECHO_T}$ac_cv_lib_curses_tgetent" >&6
 if test $ac_cv_lib_curses_tgetent = yes; then
   bash_cv_termcap_lib=libcurses
 else
-  echo "$as_me:3293: checking for tgetent in -lncurses" >&5
+  echo "$as_me:3330: checking for tgetent in -lncurses" >&5
 echo $ECHO_N "checking for tgetent in -lncurses... $ECHO_C" >&6
 if test "${ac_cv_lib_ncurses_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3298,7 +3335,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lncurses  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 3301 "configure"
+#line 3338 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -3317,16 +3354,16 @@ tgetent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:3320: \"$ac_link\"") >&5
+if { (eval echo "$as_me:3357: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:3323: \$? = $ac_status" >&5
+  echo "$as_me:3360: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:3326: \"$ac_try\"") >&5
+  { (eval echo "$as_me:3363: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:3329: \$? = $ac_status" >&5
+  echo "$as_me:3366: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_ncurses_tgetent=yes
 else
@@ -3337,7 +3374,7 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:3340: result: $ac_cv_lib_ncurses_tgetent" >&5
+echo "$as_me:3377: result: $ac_cv_lib_ncurses_tgetent" >&5
 echo "${ECHO_T}$ac_cv_lib_ncurses_tgetent" >&6
 if test $ac_cv_lib_ncurses_tgetent = yes; then
   bash_cv_termcap_lib=libncurses
@@ -3356,10 +3393,10 @@ fi
 fi
 
 if test "X$_bash_needmsg" = "Xyes"; then
-echo "$as_me:3359: checking which library has the termcap functions" >&5
+echo "$as_me:3396: checking which library has the termcap functions" >&5
 echo $ECHO_N "checking which library has the termcap functions... $ECHO_C" >&6
 fi
-echo "$as_me:3362: result: using $bash_cv_termcap_lib" >&5
+echo "$as_me:3399: result: using $bash_cv_termcap_lib" >&5
 echo "${ECHO_T}using $bash_cv_termcap_lib" >&6
 if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
 LDFLAGS="$LDFLAGS -L./lib/termcap"
@@ -3382,7 +3419,7 @@ TERMCAP_LIB=-lcurses
 TERMCAP_DEP=
 fi
 
-echo "$as_me:3385: checking version of installed readline library" >&5
+echo "$as_me:3422: checking version of installed readline library" >&5
 echo $ECHO_N "checking version of installed readline library... $ECHO_C" >&6
 
 # What a pain in the ass this is.
@@ -3414,7 +3451,7 @@ else
   ac_cv_rl_version='4.2'
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 3417 "configure"
+#line 3454 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -3432,15 +3469,15 @@ main()
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:3435: \"$ac_link\"") >&5
+if { (eval echo "$as_me:3472: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:3438: \$? = $ac_status" >&5
+  echo "$as_me:3475: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:3440: \"$ac_try\"") >&5
+  { (eval echo "$as_me:3477: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:3443: \$? = $ac_status" >&5
+  echo "$as_me:3480: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_rl_version=`cat conftest.rlv`
 else
@@ -3487,14 +3524,14 @@ RL_VERSION="0x${_RL_MAJOR}${_RL_MINOR}"
 # Readline versions greater than 4.2 have these defines in readline.h
 
 if test $ac_cv_rl_version = '0.0' ; then
-       { echo "$as_me:3490: WARNING: Could not test version of installed readline library." >&5
+       { echo "$as_me:3527: WARNING: Could not test version of installed readline library." >&5
 echo "$as_me: WARNING: Could not test version of installed readline library." >&2;}
 elif test $RL_MAJOR -gt 4 || { test $RL_MAJOR = 4 && test $RL_MINOR -gt 2 ; } ; then
        # set these for use by the caller
        RL_PREFIX=$ac_cv_rl_prefix
        RL_LIBDIR=$ac_cv_rl_libdir
        RL_INCLUDEDIR=$ac_cv_rl_includedir
-       echo "$as_me:3497: result: $ac_cv_rl_version" >&5
+       echo "$as_me:3534: result: $ac_cv_rl_version" >&5
 echo "${ECHO_T}$ac_cv_rl_version" >&6
 else
 
@@ -3515,7 +3552,7 @@ RL_PREFIX=$ac_cv_rl_prefix
 RL_LIBDIR=$ac_cv_rl_libdir
 RL_INCLUDEDIR=$ac_cv_rl_includedir
 
-echo "$as_me:3518: result: $ac_cv_rl_version" >&5
+echo "$as_me:3555: result: $ac_cv_rl_version" >&5
 echo "${ECHO_T}$ac_cv_rl_version" >&6
 
 fi
@@ -3523,9 +3560,9 @@ fi
        case "$ac_cv_rl_version" in
        5*|6*|7*|8*|9*) ;;
        *)      opt_with_installed_readline=no
-               { echo "$as_me:3526: WARNING: installed readline library is too old to be linked with bash" >&5
+               { echo "$as_me:3563: WARNING: installed readline library is too old to be linked with bash" >&5
 echo "$as_me: WARNING: installed readline library is too old to be linked with bash" >&2;}
-               { echo "$as_me:3528: WARNING: using private bash version" >&5
+               { echo "$as_me:3565: WARNING: using private bash version" >&5
 echo "$as_me: WARNING: using private bash version" >&2;}
                ;;
        esac
@@ -3601,7 +3638,7 @@ fi
 # AFS /usr/afsws/bin/install, which mishandles nonexistent args
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:3604: checking for a BSD compatible install" >&5
+echo "$as_me:3641: checking for a BSD compatible install" >&5
 echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
@@ -3650,7 +3687,7 @@ fi
     INSTALL=$ac_install_sh
   fi
 fi
-echo "$as_me:3653: result: $INSTALL" >&5
+echo "$as_me:3690: result: $INSTALL" >&5
 echo "${ECHO_T}$INSTALL" >&6
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
@@ -3663,7 +3700,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
-echo "$as_me:3666: checking for $ac_word" >&5
+echo "$as_me:3703: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_AR+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3678,7 +3715,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_AR=""
-echo "$as_me:3681: found $ac_dir/$ac_word" >&5
+echo "$as_me:3718: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -3687,10 +3724,10 @@ fi
 fi
 AR=$ac_cv_prog_AR
 if test -n "$AR"; then
-  echo "$as_me:3690: result: $AR" >&5
+  echo "$as_me:3727: result: $AR" >&5
 echo "${ECHO_T}$AR" >&6
 else
-  echo "$as_me:3693: result: no" >&5
+  echo "$as_me:3730: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -3698,7 +3735,7 @@ test -n "$ARFLAGS" || ARFLAGS="cr"
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-echo "$as_me:3701: checking for $ac_word" >&5
+echo "$as_me:3738: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3713,7 +3750,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-echo "$as_me:3716: found $ac_dir/$ac_word" >&5
+echo "$as_me:3753: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -3721,10 +3758,10 @@ fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  echo "$as_me:3724: result: $RANLIB" >&5
+  echo "$as_me:3761: result: $RANLIB" >&5
 echo "${ECHO_T}$RANLIB" >&6
 else
-  echo "$as_me:3727: result: no" >&5
+  echo "$as_me:3764: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -3733,7 +3770,7 @@ if test -z "$ac_cv_prog_RANLIB"; then
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-echo "$as_me:3736: checking for $ac_word" >&5
+echo "$as_me:3773: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3748,7 +3785,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_ac_ct_RANLIB="ranlib"
-echo "$as_me:3751: found $ac_dir/$ac_word" >&5
+echo "$as_me:3788: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -3757,10 +3794,10 @@ fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  echo "$as_me:3760: result: $ac_ct_RANLIB" >&5
+  echo "$as_me:3797: result: $ac_ct_RANLIB" >&5
 echo "${ECHO_T}$ac_ct_RANLIB" >&6
 else
-  echo "$as_me:3763: result: no" >&5
+  echo "$as_me:3800: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -3773,7 +3810,7 @@ for ac_prog in 'bison -y' byacc
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-echo "$as_me:3776: checking for $ac_word" >&5
+echo "$as_me:3813: checking for $ac_word" >&5
 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
 if test "${ac_cv_prog_YACC+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3788,7 +3825,7 @@ for ac_dir in $ac_dummy; do
   test -z "$ac_dir" && ac_dir=.
   $as_executable_p "$ac_dir/$ac_word" || continue
 ac_cv_prog_YACC="$ac_prog"
-echo "$as_me:3791: found $ac_dir/$ac_word" >&5
+echo "$as_me:3828: found $ac_dir/$ac_word" >&5
 break
 done
 
@@ -3796,10 +3833,10 @@ fi
 fi
 YACC=$ac_cv_prog_YACC
 if test -n "$YACC"; then
-  echo "$as_me:3799: result: $YACC" >&5
+  echo "$as_me:3836: result: $YACC" >&5
 echo "${ECHO_T}$YACC" >&6
 else
-  echo "$as_me:3802: result: no" >&5
+  echo "$as_me:3839: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
@@ -3807,7 +3844,7 @@ fi
 done
 test -n "$YACC" || YACC="yacc"
 
-echo "$as_me:3810: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "$as_me:3847: checking whether ${MAKE-make} sets \${MAKE}" >&5
 echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
 if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
@@ -3827,11 +3864,11 @@ fi
 rm -f conftest.make
 fi
 if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
-  echo "$as_me:3830: result: yes" >&5
+  echo "$as_me:3867: result: yes" >&5
 echo "${ECHO_T}yes" >&6
   SET_MAKE=
 else
-  echo "$as_me:3834: result: no" >&5
+  echo "$as_me:3871: result: no" >&5
 echo "${ECHO_T}no" >&6
   SET_MAKE="MAKE=${MAKE-make}"
 fi
@@ -3845,7 +3882,7 @@ cat >>confdefs.h <<\EOF
 #define _GNU_SOURCE 1
 EOF
 
-echo "$as_me:3848: checking for $CC option to accept ANSI C" >&5
+echo "$as_me:3885: checking for $CC option to accept ANSI C" >&5
 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
 if test "${ac_cv_prog_cc_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -3853,7 +3890,7 @@ else
   ac_cv_prog_cc_stdc=no
 ac_save_CC=$CC
 cat >conftest.$ac_ext <<_ACEOF
-#line 3856 "configure"
+#line 3893 "configure"
 #include "confdefs.h"
 #include <stdarg.h>
 #include <stdio.h>
@@ -3902,16 +3939,16 @@ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIO
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
-if { (eval echo "$as_me:3905: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:3942: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:3908: \$? = $ac_status" >&5
+  echo "$as_me:3945: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:3911: \"$ac_try\"") >&5
+  { (eval echo "$as_me:3948: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:3914: \$? = $ac_status" >&5
+  echo "$as_me:3951: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_prog_cc_stdc=$ac_arg
 break
@@ -3928,21 +3965,21 @@ fi
 
 case "x$ac_cv_prog_cc_stdc" in
   x|xno)
-    echo "$as_me:3931: result: none needed" >&5
+    echo "$as_me:3968: result: none needed" >&5
 echo "${ECHO_T}none needed" >&6 ;;
   *)
-    echo "$as_me:3934: result: $ac_cv_prog_cc_stdc" >&5
+    echo "$as_me:3971: result: $ac_cv_prog_cc_stdc" >&5
 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
     CC="$CC $ac_cv_prog_cc_stdc" ;;
 esac
 
-echo "$as_me:3939: checking for an ANSI C-conforming const" >&5
+echo "$as_me:3976: checking for an ANSI C-conforming const" >&5
 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
 if test "${ac_cv_c_const+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 3945 "configure"
+#line 3982 "configure"
 #include "confdefs.h"
 
 int
@@ -4000,16 +4037,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4003: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4040: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:4006: \$? = $ac_status" >&5
+  echo "$as_me:4043: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:4009: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4046: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4012: \$? = $ac_status" >&5
+  echo "$as_me:4049: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_c_const=yes
 else
@@ -4019,7 +4056,7 @@ ac_cv_c_const=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:4022: result: $ac_cv_c_const" >&5
+echo "$as_me:4059: result: $ac_cv_c_const" >&5
 echo "${ECHO_T}$ac_cv_c_const" >&6
 if test $ac_cv_c_const = no; then
 
@@ -4029,7 +4066,7 @@ EOF
 
 fi
 
-echo "$as_me:4032: checking for inline" >&5
+echo "$as_me:4069: checking for inline" >&5
 echo $ECHO_N "checking for inline... $ECHO_C" >&6
 if test "${ac_cv_c_inline+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4037,7 +4074,7 @@ else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat >conftest.$ac_ext <<_ACEOF
-#line 4040 "configure"
+#line 4077 "configure"
 #include "confdefs.h"
 #ifndef __cplusplus
 static $ac_kw int static_foo () {return 0; }
@@ -4046,16 +4083,16 @@ $ac_kw int foo () {return 0; }
 
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4049: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4086: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:4052: \$? = $ac_status" >&5
+  echo "$as_me:4089: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:4055: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4092: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4058: \$? = $ac_status" >&5
+  echo "$as_me:4095: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_c_inline=$ac_kw; break
 else
@@ -4066,7 +4103,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 done
 
 fi
-echo "$as_me:4069: result: $ac_cv_c_inline" >&5
+echo "$as_me:4106: result: $ac_cv_c_inline" >&5
 echo "${ECHO_T}$ac_cv_c_inline" >&6
 case $ac_cv_c_inline in
   inline | yes) ;;
@@ -4081,7 +4118,7 @@ EOF
  ;;
 esac
 
-echo "$as_me:4084: checking whether byte ordering is bigendian" >&5
+echo "$as_me:4121: checking whether byte ordering is bigendian" >&5
 echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
 if test "${ac_cv_c_bigendian+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4089,7 +4126,7 @@ else
   ac_cv_c_bigendian=unknown
 # See if sys/param.h defines the BYTE_ORDER macro.
 cat >conftest.$ac_ext <<_ACEOF
-#line 4092 "configure"
+#line 4129 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -4106,20 +4143,20 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4109: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4146: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:4112: \$? = $ac_status" >&5
+  echo "$as_me:4149: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:4115: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4152: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4118: \$? = $ac_status" >&5
+  echo "$as_me:4155: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   # It does; now see whether it defined to BIG_ENDIAN or not.
 cat >conftest.$ac_ext <<_ACEOF
-#line 4122 "configure"
+#line 4159 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -4136,16 +4173,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4139: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4176: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:4142: \$? = $ac_status" >&5
+  echo "$as_me:4179: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:4145: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4182: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4148: \$? = $ac_status" >&5
+  echo "$as_me:4185: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_c_bigendian=yes
 else
@@ -4161,12 +4198,12 @@ fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 if test $ac_cv_c_bigendian = unknown; then
 if test "$cross_compiling" = yes; then
-  { { echo "$as_me:4164: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:4201: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4169 "configure"
+#line 4206 "configure"
 #include "confdefs.h"
 int
 main ()
@@ -4182,15 +4219,15 @@ main ()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:4185: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4222: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:4188: \$? = $ac_status" >&5
+  echo "$as_me:4225: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:4190: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4227: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4193: \$? = $ac_status" >&5
+  echo "$as_me:4230: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_c_bigendian=no
 else
@@ -4203,7 +4240,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 fi
-echo "$as_me:4206: result: $ac_cv_c_bigendian" >&5
+echo "$as_me:4243: result: $ac_cv_c_bigendian" >&5
 echo "${ECHO_T}$ac_cv_c_bigendian" >&6
 if test $ac_cv_c_bigendian = yes; then
 
@@ -4213,13 +4250,13 @@ EOF
 
 fi
 
-echo "$as_me:4216: checking for preprocessor stringizing operator" >&5
+echo "$as_me:4253: checking for preprocessor stringizing operator" >&5
 echo $ECHO_N "checking for preprocessor stringizing operator... $ECHO_C" >&6
 if test "${ac_cv_c_stringize+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4222 "configure"
+#line 4259 "configure"
 #include "confdefs.h"
 #define x(y) #y
 
@@ -4234,7 +4271,7 @@ fi
 rm -f conftest*
 
 fi
-echo "$as_me:4237: result: $ac_cv_c_stringize" >&5
+echo "$as_me:4274: result: $ac_cv_c_stringize" >&5
 echo "${ECHO_T}$ac_cv_c_stringize" >&6
 if test $ac_cv_c_stringize = yes; then
 
@@ -4244,7 +4281,7 @@ EOF
 
 fi
 
-echo "$as_me:4247: checking for long double" >&5
+echo "$as_me:4284: checking for long double" >&5
 echo $ECHO_N "checking for long double... $ECHO_C" >&6
 if test "${ac_cv_c_long_double+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4253,12 +4290,12 @@ else
   ac_cv_c_long_double=yes
 else
 if test "$cross_compiling" = yes; then
-  { { echo "$as_me:4256: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:4293: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4261 "configure"
+#line 4298 "configure"
 #include "confdefs.h"
 int
 main ()
@@ -4271,15 +4308,15 @@ main ()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:4274: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4311: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:4277: \$? = $ac_status" >&5
+  echo "$as_me:4314: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:4279: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4316: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4282: \$? = $ac_status" >&5
+  echo "$as_me:4319: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_c_long_double=yes
 else
@@ -4292,7 +4329,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 fi
-echo "$as_me:4295: result: $ac_cv_c_long_double" >&5
+echo "$as_me:4332: result: $ac_cv_c_long_double" >&5
 echo "${ECHO_T}$ac_cv_c_long_double" >&6
 if test $ac_cv_c_long_double = yes; then
 
@@ -4302,10 +4339,10 @@ EOF
 
 fi
 
-echo "$as_me:4305: checking for function prototypes" >&5
+echo "$as_me:4342: checking for function prototypes" >&5
 echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6
 if test "$ac_cv_prog_cc_stdc" != no; then
-  echo "$as_me:4308: result: yes" >&5
+  echo "$as_me:4345: result: yes" >&5
 echo "${ECHO_T}yes" >&6
 
 cat >>confdefs.h <<\EOF
@@ -4313,17 +4350,17 @@ cat >>confdefs.h <<\EOF
 EOF
 
 else
-  echo "$as_me:4316: result: no" >&5
+  echo "$as_me:4353: result: no" >&5
 echo "${ECHO_T}no" >&6
 fi
 
-echo "$as_me:4320: checking for ANSI C header files" >&5
+echo "$as_me:4357: checking for ANSI C header files" >&5
 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
 if test "${ac_cv_header_stdc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4326 "configure"
+#line 4363 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -4331,13 +4368,13 @@ else
 #include <float.h>
 
 _ACEOF
-if { (eval echo "$as_me:4334: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:4371: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:4340: \$? = $ac_status" >&5
+  echo "$as_me:4377: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4359,7 +4396,7 @@ rm -f conftest.err conftest.$ac_ext
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
-#line 4362 "configure"
+#line 4399 "configure"
 #include "confdefs.h"
 #include <string.h>
 
@@ -4377,7 +4414,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
-#line 4380 "configure"
+#line 4417 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 
@@ -4398,7 +4435,7 @@ if test $ac_cv_header_stdc = yes; then
   :
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4401 "configure"
+#line 4438 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #if ((' ' & 0x0FF) == 0x020)
@@ -4424,15 +4461,15 @@ main ()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:4427: \"$ac_link\"") >&5
+if { (eval echo "$as_me:4464: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:4430: \$? = $ac_status" >&5
+  echo "$as_me:4467: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:4432: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4469: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4435: \$? = $ac_status" >&5
+  echo "$as_me:4472: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   :
 else
@@ -4445,7 +4482,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 fi
-echo "$as_me:4448: result: $ac_cv_header_stdc" >&5
+echo "$as_me:4485: result: $ac_cv_header_stdc" >&5
 echo "${ECHO_T}$ac_cv_header_stdc" >&6
 if test $ac_cv_header_stdc = yes; then
 
@@ -4461,28 +4498,28 @@ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
                   inttypes.h stdint.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4464: checking for $ac_header" >&5
+echo "$as_me:4501: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4470 "configure"
+#line 4507 "configure"
 #include "confdefs.h"
 $ac_includes_default
 #include <$ac_header>
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4476: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4513: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:4479: \$? = $ac_status" >&5
+  echo "$as_me:4516: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:4482: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4519: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4485: \$? = $ac_status" >&5
+  echo "$as_me:4522: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_Header=yes"
 else
@@ -4492,7 +4529,7 @@ eval "$as_ac_Header=no"
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:4495: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:4532: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -4502,13 +4539,13 @@ EOF
 fi
 done
 
-echo "$as_me:4505: checking whether char is unsigned" >&5
+echo "$as_me:4542: checking whether char is unsigned" >&5
 echo $ECHO_N "checking whether char is unsigned... $ECHO_C" >&6
 if test "${ac_cv_c_char_unsigned+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4511 "configure"
+#line 4548 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -4520,44 +4557,3081 @@ int _array_ [1 - 2 * !(((char) -1) < 0)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4523: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:4560: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4563: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:4566: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4569: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_char_unsigned=no
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_c_char_unsigned=yes
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:4579: result: $ac_cv_c_char_unsigned" >&5
+echo "${ECHO_T}$ac_cv_c_char_unsigned" >&6
+if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
+  cat >>confdefs.h <<\EOF
+#define __CHAR_UNSIGNED__ 1
+EOF
+
+fi
+
+        MKINSTALLDIRS=
+  if test -n "$ac_aux_dir"; then
+    case "$ac_aux_dir" in
+      /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
+      *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
+    esac
+  fi
+  if test -z "$MKINSTALLDIRS"; then
+    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+  fi
+
+  echo "$as_me:4599: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
+    # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval="$enable_nls"
+  USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi;
+  echo "$as_me:4608: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo "$as_me:4641: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MSGFMT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$MSGFMT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+    ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+  echo "$as_me:4672: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6
+else
+  echo "$as_me:4675: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo "$as_me:4681: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_GMSGFMT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $GMSGFMT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  if $as_executable_p "$ac_dir/$ac_word"; then
+   ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+   echo "$as_me:4698: found $ac_dir/$ac_word" >&5
+   break
+fi
+done
+
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+
+if test -n "$GMSGFMT"; then
+  echo "$as_me:4710: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6
+else
+  echo "$as_me:4713: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo "$as_me:4747: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_XGETTEXT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$XGETTEXT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+    ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  echo "$as_me:4778: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6
+else
+  echo "$as_me:4781: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    rm -f messages.po
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+echo "$as_me:4817: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MSGMERGE+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$MSGMERGE" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then
+            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+    ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  echo "$as_me:4847: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6
+else
+  echo "$as_me:4850: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+      if test "$GMSGFMT" != ":"; then
+            if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+      echo "$as_me:4860: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
+echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6
+      GMSGFMT=":"
+    fi
+  fi
+
+      if test "$XGETTEXT" != ":"; then
+            if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+       (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      echo "$as_me:4871: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
+      XGETTEXT=":"
+    fi
+        rm -f messages.po
+  fi
+
+  ac_config_commands="$ac_config_commands default-1"
+
+echo "$as_me:4880: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6
+if test "${ac_cv_type_off_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 4886 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main ()
+{
+if ((off_t *) 0)
+  return 0;
+if (sizeof (off_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4901: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:4904: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:4907: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4910: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_off_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_off_t=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:4920: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6
+if test $ac_cv_type_off_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<EOF
+#define off_t long
+EOF
+
+fi
+
+echo "$as_me:4932: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 4938 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+  return 0;
+if (sizeof (size_t))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4953: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:4526: \$? = $ac_status" >&5
+  echo "$as_me:4956: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:4529: \"$ac_try\"") >&5
+  { (eval echo "$as_me:4959: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:4962: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_size_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_size_t=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:4972: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<EOF
+#define size_t unsigned
+EOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+echo "$as_me:4986: checking for working alloca.h" >&5
+echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
+if test "${ac_cv_working_alloca_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 4992 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:5004: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5007: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:5010: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5013: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_working_alloca_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_working_alloca_h=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:5023: result: $ac_cv_working_alloca_h" >&5
+echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
+if test $ac_cv_working_alloca_h = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo "$as_me:5033: checking for alloca" >&5
+echo $ECHO_N "checking for alloca... $ECHO_C" >&6
+if test "${ac_cv_func_alloca_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5039 "configure"
+#include "confdefs.h"
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+int
+main ()
+{
+char *p = (char *) alloca (1);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:5071: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5074: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:5077: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5080: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_alloca_works=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_alloca_works=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:5090: result: $ac_cv_func_alloca_works" >&5
+echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
+
+if test $ac_cv_func_alloca_works = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+else
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble.  Some versions do not even contain alloca or
+# contain a buggy version.  If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA=alloca.$ac_objext
+
+cat >>confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+echo "$as_me:5111: checking whether \`alloca.c' needs Cray hooks" >&5
+echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
+if test "${ac_cv_os_cray+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5117 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "webecray" >/dev/null 2>&1; then
+  ac_cv_os_cray=yes
+else
+  ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:5135: result: $ac_cv_os_cray" >&5
+echo "${ECHO_T}$ac_cv_os_cray" >&6
+if test $ac_cv_os_cray = yes; then
+  for ac_func in _getb67 GETB67 getb67; do
+    as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:5140: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5146 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:5177: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5180: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:5183: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5186: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:5196: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+
+cat >>confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+    break
+fi
+
+  done
+fi
+
+echo "$as_me:5210: checking stack direction for C alloca" >&5
+echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
+if test "${ac_cv_c_stack_direction+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_c_stack_direction=0
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5219 "configure"
+#include "confdefs.h"
+int
+find_stack_direction ()
+{
+  static char *addr = 0;
+  auto char dummy;
+  if (addr == 0)
+    {
+      addr = &dummy;
+      return find_stack_direction ();
+    }
+  else
+    return (&dummy > addr) ? 1 : -1;
+}
+
+int
+main ()
+{
+  exit (find_stack_direction () < 0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:5242: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5245: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:5247: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5250: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_stack_direction=1
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_c_stack_direction=-1
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:5262: result: $ac_cv_c_stack_direction" >&5
+echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
+
+cat >>confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+for ac_header in stdlib.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:5274: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5280 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:5284: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:5290: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+echo "$as_me:5309: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in getpagesize
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:5322: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5328 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:5359: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5362: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:5365: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5368: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:5378: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:5388: checking for working mmap" >&5
+echo $ECHO_N "checking for working mmap... $ECHO_C" >&6
+if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_mmap_fixed_mapped=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5397 "configure"
+#include "confdefs.h"
+$ac_includes_default
+/* Thanks to Mike Haertel and Jim Avera for this test.
+   Here is a matrix of mmap possibilities:
+       mmap private not fixed
+       mmap private fixed at somewhere currently unmapped
+       mmap private fixed at somewhere already mapped
+       mmap shared not fixed
+       mmap shared fixed at somewhere currently unmapped
+       mmap shared fixed at somewhere already mapped
+   For private mappings, we should verify that changes cannot be read()
+   back from the file, nor mmap's back from the file at a different
+   address.  (There have been systems where private was not correctly
+   implemented like the infamous i386 svr4.0, and systems where the
+   VM page cache was not coherent with the file system buffer cache
+   like early versions of FreeBSD and possibly contemporary NetBSD.)
+   For shared mappings, we should conversely verify that changes get
+   propogated back to all the places they're supposed to be.
+
+   Grep wants private fixed already mapped.
+   The main things grep needs to know about mmap are:
+   * does it exist and is it safe to write into the mmap'd area
+   * how to use it (BSD variants)  */
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if !STDC_HEADERS && !HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h.  */
+#if !HAVE_GETPAGESIZE
+/* Assume that all systems that can run configure have sys/param.h.  */
+# if !HAVE_SYS_PARAM_H
+#  define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+#  define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+#  if HAVE_SYS_PARAM_H
+#   include <sys/param.h>
+#   ifdef EXEC_PAGESIZE
+#    define getpagesize() EXEC_PAGESIZE
+#   else /* no EXEC_PAGESIZE */
+#    ifdef NBPG
+#     define getpagesize() NBPG * CLSIZE
+#     ifndef CLSIZE
+#      define CLSIZE 1
+#     endif /* no CLSIZE */
+#    else /* no NBPG */
+#     ifdef NBPC
+#      define getpagesize() NBPC
+#     else /* no NBPC */
+#      ifdef PAGESIZE
+#       define getpagesize() PAGESIZE
+#      endif /* PAGESIZE */
+#     endif /* no NBPC */
+#    endif /* no NBPG */
+#   endif /* no EXEC_PAGESIZE */
+#  else /* no HAVE_SYS_PARAM_H */
+#   define getpagesize() 8192  /* punt totally */
+#  endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main ()
+{
+  char *data, *data2, *data3;
+  int i, pagesize;
+  int fd;
+
+  pagesize = getpagesize ();
+
+  /* First, make a file with some known garbage in it. */
+  data = (char *) malloc (pagesize);
+  if (!data)
+    exit (1);
+  for (i = 0; i < pagesize; ++i)
+    *(data + i) = rand ();
+  umask (0);
+  fd = creat ("conftest.mmap", 0600);
+  if (fd < 0)
+    exit (1);
+  if (write (fd, data, pagesize) != pagesize)
+    exit (1);
+  close (fd);
+
+  /* Next, try to mmap the file at a fixed address which already has
+     something else allocated at it.  If we can, also make sure that
+     we see the same garbage.  */
+  fd = open ("conftest.mmap", O_RDWR);
+  if (fd < 0)
+    exit (1);
+  data2 = (char *) malloc (2 * pagesize);
+  if (!data2)
+    exit (1);
+  data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+  if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+                     MAP_PRIVATE | MAP_FIXED, fd, 0L))
+    exit (1);
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data2 + i))
+      exit (1);
+
+  /* Finally, make sure that changes to the mapped area do not
+     percolate back to the file as seen by read().  (This is a bug on
+     some variants of i386 svr4.0.)  */
+  for (i = 0; i < pagesize; ++i)
+    *(data2 + i) = *(data2 + i) + 1;
+  data3 = (char *) malloc (pagesize);
+  if (!data3)
+    exit (1);
+  if (read (fd, data3, pagesize) != pagesize)
+    exit (1);
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data3 + i))
+      exit (1);
+  close (fd);
+  exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:5524: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5527: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:5529: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5532: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_mmap_fixed_mapped=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:5544: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+rm -f conftest.mmap
+
+    echo "$as_me:5555: checking whether we are using the GNU C Library 2.1 or newer" >&5
+echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6
+if test "${ac_cv_gnu_library_2_1+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5561 "configure"
+#include "confdefs.h"
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "Lucky GNU user" >/dev/null 2>&1; then
+  ac_cv_gnu_library_2_1=yes
+else
+  ac_cv_gnu_library_2_1=no
+fi
+rm -f conftest*
+
+fi
+echo "$as_me:5581: result: $ac_cv_gnu_library_2_1" >&5
+echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6
+
+    GLIBC21="$ac_cv_gnu_library_2_1"
+
+  echo "$as_me:5586: checking whether integer division by zero raises SIGFPE" >&5
+echo $ECHO_N "checking whether integer division by zero raises SIGFPE... $ECHO_C" >&6
+if test "${gt_cv_int_divbyzero_sigfpe+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+      if test "$cross_compiling" = yes; then
+
+          # Guess based on the CPU.
+          case "$host_cpu" in
+            alpha* | i3456786 | m68k | s390*)
+              gt_cv_int_divbyzero_sigfpe="guessing yes";;
+            *)
+              gt_cv_int_divbyzero_sigfpe="guessing no";;
+          esac
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5604 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+#ifdef __cplusplus
+sigfpe_handler (int sig)
+#else
+sigfpe_handler (sig) int sig;
+#endif
+{
+  /* Exit with code 0 if SIGFPE, with code 1 if any other signal.  */
+  exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+  signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP.  */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+  signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL.  */
+#if defined (__sparc__) && defined (__linux__)
+  signal (SIGILL, sigfpe_handler);
+#endif
+
+  z = x / y;
+  nan = y / y;
+  exit (1);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:5645: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5648: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:5650: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5653: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_int_divbyzero_sigfpe=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+gt_cv_int_divbyzero_sigfpe=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+fi
+echo "$as_me:5666: result: $gt_cv_int_divbyzero_sigfpe" >&5
+echo "${ECHO_T}$gt_cv_int_divbyzero_sigfpe" >&6
+  case "$gt_cv_int_divbyzero_sigfpe" in
+    *yes) value=1;;
+    *) value=0;;
+  esac
+
+cat >>confdefs.h <<EOF
+#define INTDIV0_RAISES_SIGFPE $value
+EOF
+
+  echo "$as_me:5677: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6
+if test "${jm_ac_cv_header_inttypes_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5683 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <inttypes.h>
+int
+main ()
+{
+uintmax_t i = (uintmax_t) -1;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:5696: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5699: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:5702: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5705: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  jm_ac_cv_header_inttypes_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+jm_ac_cv_header_inttypes_h=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:5715: result: $jm_ac_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$jm_ac_cv_header_inttypes_h" >&6
+  if test $jm_ac_cv_header_inttypes_h = yes; then
+
+cat >>confdefs.h <<EOF
+#define HAVE_INTTYPES_H_WITH_UINTMAX 1
+EOF
+
+  fi
+
+  echo "$as_me:5725: checking for stdint.h" >&5
+echo $ECHO_N "checking for stdint.h... $ECHO_C" >&6
+if test "${jm_ac_cv_header_stdint_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5731 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <stdint.h>
+int
+main ()
+{
+uintmax_t i = (uintmax_t) -1;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:5744: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5747: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:5750: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5753: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  jm_ac_cv_header_stdint_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+jm_ac_cv_header_stdint_h=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:5763: result: $jm_ac_cv_header_stdint_h" >&5
+echo "${ECHO_T}$jm_ac_cv_header_stdint_h" >&6
+  if test $jm_ac_cv_header_stdint_h = yes; then
+
+cat >>confdefs.h <<EOF
+#define HAVE_STDINT_H_WITH_UINTMAX 1
+EOF
+
+  fi
+
+  echo "$as_me:5773: checking for unsigned long long" >&5
+echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 5779 "configure"
+#include "confdefs.h"
+unsigned long long ull = 1; int i = 63;
+int
+main ()
+{
+unsigned long long ullmax = (unsigned long long) -1;
+     return ull << i | ull >> i | ullmax / ull | ullmax % ull;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:5792: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:5795: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:5798: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5801: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_long_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_unsigned_long_long=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:5811: result: $ac_cv_type_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6
+  if test $ac_cv_type_unsigned_long_long = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_UNSIGNED_LONG_LONG 1
+EOF
+
+  fi
+
+  if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then
+
+    test $ac_cv_type_unsigned_long_long = yes \
+      && ac_type='unsigned long long' \
+      || ac_type='unsigned long'
+
+cat >>confdefs.h <<EOF
+#define uintmax_t $ac_type
+EOF
+
+  else
+
+cat >>confdefs.h <<\EOF
+#define HAVE_UINTMAX_T 1
+EOF
+
+  fi
+
+  echo "$as_me:5839: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6
+if test "${gt_cv_header_inttypes_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    cat >conftest.$ac_ext <<_ACEOF
+#line 5846 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <inttypes.h>
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:5859: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5862: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:5865: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5868: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_header_inttypes_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+gt_cv_header_inttypes_h=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:5879: result: $gt_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$gt_cv_header_inttypes_h" >&6
+  if test $gt_cv_header_inttypes_h = yes; then
+
+cat >>confdefs.h <<EOF
+#define HAVE_INTTYPES_H 1
+EOF
+
+  fi
+
+  if test $gt_cv_header_inttypes_h = yes; then
+    echo "$as_me:5890: checking whether the inttypes.h PRIxNN macros are broken" >&5
+echo $ECHO_N "checking whether the inttypes.h PRIxNN macros are broken... $ECHO_C" >&6
+if test "${gt_cv_inttypes_pri_broken+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+        cat >conftest.$ac_ext <<_ACEOF
+#line 5897 "configure"
+#include "confdefs.h"
+#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:5913: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:5916: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:5919: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:5922: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_inttypes_pri_broken=no
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+gt_cv_inttypes_pri_broken=yes
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:5933: result: $gt_cv_inttypes_pri_broken" >&5
+echo "${ECHO_T}$gt_cv_inttypes_pri_broken" >&6
+  fi
+  if test "$gt_cv_inttypes_pri_broken" = yes; then
+
+cat >>confdefs.h <<EOF
+#define PRI_MACROS_BROKEN 1
+EOF
+
+  fi
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval="$with_gnu_ld"
+  test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi;
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  echo "$as_me:5982: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  echo "$as_me:6012: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+  echo "$as_me:6015: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${acl_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+       test "$with_gnu_ld" != no && break
+      else
+       test "$with_gnu_ld" != yes && break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  echo "$as_me:6045: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+  echo "$as_me:6048: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:6051: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+echo "$as_me:6054: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${acl_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+  acl_cv_prog_gnu_ld=yes
+else
+  acl_cv_prog_gnu_ld=no
+fi
+fi
+echo "$as_me:6066: result: $acl_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+                                                echo "$as_me:6070: checking for shared library run path origin" >&5
+echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6
+if test "${acl_cv_rpath+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+
+fi
+echo "$as_me:6083: result: $acl_cv_rpath" >&5
+echo "${ECHO_T}$acl_cv_rpath" >&6
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+    # Check whether --enable-rpath or --disable-rpath was given.
+if test "${enable_rpath+set}" = set; then
+  enableval="$enable_rpath"
+  :
+else
+  enable_rpath=yes
+fi;
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then
+  withval="$with_libiconv_prefix"
+
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+
+fi;
+      LIBICONV=
+  LTLIBICONV=
+  INCICONV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='iconv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$hardcode_direct" = yes; then
+                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+              else
+                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+    done
+  fi
+
+for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:6479: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 6485 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:6489: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:6495: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+echo "$as_me:6514: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
+geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \
+strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next \
+__fsetlocking
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:6530: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 6536 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char $ac_func ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:6567: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6570: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:6573: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6576: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:6586: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+  echo "$as_me:6620: checking for iconv" >&5
+echo $ECHO_N "checking for iconv... $ECHO_C" >&6
+if test "${am_cv_func_iconv+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat >conftest.$ac_ext <<_ACEOF
+#line 6629 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:6644: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6647: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:6650: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6653: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_func_iconv=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat >conftest.$ac_ext <<_ACEOF
+#line 6665 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:6680: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6683: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:6686: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6689: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+      LIBS="$am_save_LIBS"
+    fi
+
+fi
+echo "$as_me:6702: result: $am_cv_func_iconv" >&5
+echo "${ECHO_T}$am_cv_func_iconv" >&6
+  if test "$am_cv_func_iconv" = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_ICONV 1
+EOF
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    echo "$as_me:6712: checking how to link with libiconv" >&5
+echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6
+    echo "$as_me:6714: result: $LIBICONV" >&5
+echo "${ECHO_T}$LIBICONV" >&6
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+
+  if test "$am_cv_func_iconv" = yes; then
+    echo "$as_me:6723: checking for iconv declaration" >&5
+echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6
+    if test "${am_cv_proto_iconv+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+      cat >conftest.$ac_ext <<_ACEOF
+#line 6730 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:6754: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:6757: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:6760: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6763: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_proto_iconv_arg1=""
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+am_cv_proto_iconv_arg1="const"
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    echo "$as_me:6776: result: ${ac_t:-
+         }$am_cv_proto_iconv" >&5
+echo "${ECHO_T}${ac_t:-
+         }$am_cv_proto_iconv" >&6
+
+cat >>confdefs.h <<EOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+EOF
+
+  fi
+
+  echo "$as_me:6787: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
+if test "${am_cv_langinfo_codeset+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 6793 "configure"
+#include "confdefs.h"
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(CODESET);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:6805: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6808: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:6811: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6814: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_langinfo_codeset=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+am_cv_langinfo_codeset=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+
+fi
+echo "$as_me:6825: result: $am_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6
+  if test $am_cv_langinfo_codeset = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LANGINFO_CODESET 1
+EOF
+
+  fi
+
+  if test $ac_cv_header_locale_h = yes; then
+
+  echo "$as_me:6837: checking for LC_MESSAGES" >&5
+echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6
+if test "${am_cv_val_LC_MESSAGES+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 6843 "configure"
+#include "confdefs.h"
+#include <locale.h>
+int
+main ()
+{
+return LC_MESSAGES
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:6855: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:6858: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:6861: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:6864: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_val_LC_MESSAGES=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+am_cv_val_LC_MESSAGES=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:6874: result: $am_cv_val_LC_MESSAGES" >&5
+echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6
+  if test $am_cv_val_LC_MESSAGES = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_LC_MESSAGES 1
+EOF
+
+  fi
+
+  fi
+
+                      for ac_prog in bison
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:6890: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_INTLBISON+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$INTLBISON"; then
+  ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test.
+else
+  ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+  IFS=$ac_save_IFS
+  test -z "$ac_dir" && ac_dir=.
+  $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_INTLBISON="$ac_prog"
+echo "$as_me:6905: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+INTLBISON=$ac_cv_prog_INTLBISON
+if test -n "$INTLBISON"; then
+  echo "$as_me:6913: result: $INTLBISON" >&5
+echo "${ECHO_T}$INTLBISON" >&6
+else
+  echo "$as_me:6916: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$INTLBISON" && break
+done
+
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+        echo "$as_me:6926: checking version of bison" >&5
+echo $ECHO_N "checking version of bison... $ECHO_C" >&6
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    echo "$as_me:6935: result: $ac_prog_version" >&5
+echo "${ECHO_T}$ac_prog_version" >&6
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+
+  echo "$as_me:6942: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6
+    # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval="$enable_nls"
+  USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi;
+  echo "$as_me:6951: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6
+
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+    if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+
+      echo "$as_me:6964: checking whether included gettext is requested" >&5
+echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6
+
+# Check whether --with-included-gettext or --without-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+  withval="$with_included_gettext"
+  nls_cv_force_use_gnu_gettext=$withval
+else
+  nls_cv_force_use_gnu_gettext=no
+fi;
+      echo "$as_me:6974: result: $nls_cv_force_use_gnu_gettext" >&5
+echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+
+        echo "$as_me:6980: checking for GNU gettext in libc" >&5
+echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6
+if test "${gt_cv_func_gnugettext2_libc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 6986 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_domain_bindings
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:7001: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7004: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:7007: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7010: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_func_gnugettext2_libc=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+gt_cv_func_gnugettext2_libc=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:7020: result: $gt_cv_func_gnugettext2_libc" >&5
+echo "${ECHO_T}$gt_cv_func_gnugettext2_libc" >&6
+
+        if test "$gt_cv_func_gnugettext2_libc" != "yes"; then
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+# Check whether --with-libintl-prefix or --without-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then
+  withval="$with_libintl_prefix"
+
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+
+fi;
+      LIBINTL=
+  LTLIBINTL=
+  INCINTL=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='intl '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$hardcode_direct" = yes; then
+                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+              else
+                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+    done
+  fi
+
+          echo "$as_me:7400: checking for GNU gettext in libintl" >&5
+echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6
+if test "${gt_cv_func_gnugettext2_libintl+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+                        cat >conftest.$ac_ext <<_ACEOF
+#line 7410 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_expand_alias (0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:7429: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7432: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:7435: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:7438: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_func_gnugettext2_libintl=yes
+else
+  echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+gt_cv_func_gnugettext2_libintl=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+                        if test "$gt_cv_func_gnugettext2_libintl" != yes && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              cat >conftest.$ac_ext <<_ACEOF
+#line 7450 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_expand_alias (0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:7469: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:7472: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:7475: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4532: \$? = $ac_status" >&5
+  echo "$as_me:7478: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_c_char_unsigned=no
+  LIBINTL="$LIBINTL $LIBICONV"
+                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                gt_cv_func_gnugettext2_libintl=yes
+
 else
   echo "$as_me: failed program was:" >&5
 cat conftest.$ac_ext >&5
-ac_cv_c_char_unsigned=yes
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:4542: result: $ac_cv_c_char_unsigned" >&5
-echo "${ECHO_T}$ac_cv_c_char_unsigned" >&6
-if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
-  cat >>confdefs.h <<\EOF
-#define __CHAR_UNSIGNED__ 1
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"
+fi
+echo "$as_me:7493: result: $gt_cv_func_gnugettext2_libintl" >&5
+echo "${ECHO_T}$gt_cv_func_gnugettext2_libintl" >&6
+        fi
+
+                                        if test "$gt_cv_func_gnugettext2_libc" = "yes" \
+           || { test "$gt_cv_func_gnugettext2_libintl" = "yes" \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+                    LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+                              nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+                BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="lib/intl/libintl.a $LIBICONV"
+        LTLIBINTL="lib/intl/libintl.a $LTLIBICONV"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+                CATOBJEXT=.gmo
+      fi
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+
+cat >>confdefs.h <<\EOF
+#define ENABLE_NLS 1
 EOF
 
-fi
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  echo "$as_me:7538: checking whether to use NLS" >&5
+echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6
+  echo "$as_me:7540: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6
+  if test "$USE_NLS" = "yes"; then
+    echo "$as_me:7543: checking where the gettext function comes from" >&5
+echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&6
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext2_libintl" = "yes"; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    echo "$as_me:7554: result: $gt_source" >&5
+echo "${ECHO_T}$gt_source" >&6
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext2_libintl" = "yes"; then
+        echo "$as_me:7562: checking how to link with libintl" >&5
+echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6
+        echo "$as_me:7564: result: $LIBINTL" >&5
+echo "${ECHO_T}$LIBINTL" >&6
+
+  for element in $INCINTL; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+      fi
+
+cat >>confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+cat >>confdefs.h <<\EOF
+#define HAVE_DCGETTEXT 1
+EOF
+
+    fi
+
+        POSUB=po
+  fi
+
+            if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+        nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+        DATADIRNAME=share
+
+        INSTOBJEXT=.mo
+
+        GENCAT=gencat
+
+        if test "$USE_INCLUDED_LIBINTL" = yes; then
+      INTLOBJS="\$(GETTOBJS)"
+    fi
+
+        INTL_LIBTOOL_SUFFIX_PREFIX=
+
+    INTLLIBS="$LIBINTL"
 
 ac_header_dirent=no
 for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
   as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
-echo "$as_me:4554: checking for $ac_hdr that defines DIR" >&5
+echo "$as_me:7628: checking for $ac_hdr that defines DIR" >&5
 echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4560 "configure"
+#line 7634 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_hdr>
@@ -4572,16 +7646,16 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4575: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:7649: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:4578: \$? = $ac_status" >&5
+  echo "$as_me:7652: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:4581: \"$ac_try\"") >&5
+  { (eval echo "$as_me:7655: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4584: \$? = $ac_status" >&5
+  echo "$as_me:7658: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_Header=yes"
 else
@@ -4591,7 +7665,7 @@ eval "$as_ac_Header=no"
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:4594: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:7668: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -4604,7 +7678,7 @@ fi
 done
 # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
 if test $ac_header_dirent = dirent.h; then
-  echo "$as_me:4607: checking for opendir in -ldir" >&5
+  echo "$as_me:7681: checking for opendir in -ldir" >&5
 echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6
 if test "${ac_cv_lib_dir_opendir+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4612,7 +7686,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ldir  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 4615 "configure"
+#line 7689 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -4631,16 +7705,16 @@ opendir ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4634: \"$ac_link\"") >&5
+if { (eval echo "$as_me:7708: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:4637: \$? = $ac_status" >&5
+  echo "$as_me:7711: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:4640: \"$ac_try\"") >&5
+  { (eval echo "$as_me:7714: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4643: \$? = $ac_status" >&5
+  echo "$as_me:7717: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_dir_opendir=yes
 else
@@ -4651,14 +7725,14 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:4654: result: $ac_cv_lib_dir_opendir" >&5
+echo "$as_me:7728: result: $ac_cv_lib_dir_opendir" >&5
 echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6
 if test $ac_cv_lib_dir_opendir = yes; then
   LIBS="$LIBS -ldir"
 fi
 
 else
-  echo "$as_me:4661: checking for opendir in -lx" >&5
+  echo "$as_me:7735: checking for opendir in -lx" >&5
 echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6
 if test "${ac_cv_lib_x_opendir+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -4666,7 +7740,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lx  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 4669 "configure"
+#line 7743 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -4685,16 +7759,16 @@ opendir ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4688: \"$ac_link\"") >&5
+if { (eval echo "$as_me:7762: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:4691: \$? = $ac_status" >&5
+  echo "$as_me:7765: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:4694: \"$ac_try\"") >&5
+  { (eval echo "$as_me:7768: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4697: \$? = $ac_status" >&5
+  echo "$as_me:7771: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_x_opendir=yes
 else
@@ -4705,7 +7779,7 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:4708: result: $ac_cv_lib_x_opendir" >&5
+echo "$as_me:7782: result: $ac_cv_lib_x_opendir" >&5
 echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6
 if test $ac_cv_lib_x_opendir = yes; then
   LIBS="$LIBS -lx"
@@ -4713,13 +7787,13 @@ fi
 
 fi
 
-echo "$as_me:4716: checking whether time.h and sys/time.h may both be included" >&5
+echo "$as_me:7790: checking whether time.h and sys/time.h may both be included" >&5
 echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
 if test "${ac_cv_header_time+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4722 "configure"
+#line 7796 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -4735,16 +7809,16 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:4738: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:7812: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:4741: \$? = $ac_status" >&5
+  echo "$as_me:7815: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:4744: \"$ac_try\"") >&5
+  { (eval echo "$as_me:7818: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4747: \$? = $ac_status" >&5
+  echo "$as_me:7821: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_header_time=yes
 else
@@ -4754,7 +7828,7 @@ ac_cv_header_time=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:4757: result: $ac_cv_header_time" >&5
+echo "$as_me:7831: result: $ac_cv_header_time" >&5
 echo "${ECHO_T}$ac_cv_header_time" >&6
 if test $ac_cv_header_time = yes; then
 
@@ -4767,23 +7841,23 @@ fi
 for ac_header in inttypes.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4770: checking for $ac_header" >&5
+echo "$as_me:7844: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4776 "configure"
+#line 7850 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:4780: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:7854: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:4786: \$? = $ac_status" >&5
+  echo "$as_me:7860: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4802,7 +7876,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:4805: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:7879: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -4817,23 +7891,23 @@ for ac_header in unistd.h stdlib.h stdarg.h varargs.h limits.h string.h \
                 stddef.h stdint.h netdb.h grp.h strings.h regex.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4820: checking for $ac_header" >&5
+echo "$as_me:7894: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4826 "configure"
+#line 7900 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:4830: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:7904: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:4836: \$? = $ac_status" >&5
+  echo "$as_me:7910: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4852,7 +7926,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:4855: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:7929: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -4863,27 +7937,27 @@ fi
 done
 
 for ac_header in sys/ptem.h sys/pte.h sys/stream.h sys/select.h sys/file.h \
-                sys/resource.h sys/param.h sys/socket.h \
-                sys/time.h sys/times.h sys/wait.h
+                sys/resource.h sys/param.h sys/socket.h sys/stat.h \
+                sys/time.h sys/times.h sys/types.h sys/wait.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4870: checking for $ac_header" >&5
+echo "$as_me:7944: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4876 "configure"
+#line 7950 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:4880: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:7954: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:4886: \$? = $ac_status" >&5
+  echo "$as_me:7960: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4902,7 +7976,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:4905: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:7979: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -4915,23 +7989,23 @@ done
 for ac_header in netinet/in.h arpa/inet.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:4918: checking for $ac_header" >&5
+echo "$as_me:7992: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4924 "configure"
+#line 7998 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:4928: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:8002: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:4934: \$? = $ac_status" >&5
+  echo "$as_me:8008: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -4950,7 +8024,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:4953: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:8027: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -4962,13 +8036,13 @@ done
 
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
-echo "$as_me:4965: checking for working alloca.h" >&5
+echo "$as_me:8039: checking for working alloca.h" >&5
 echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6
 if test "${ac_cv_working_alloca_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 4971 "configure"
+#line 8045 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int
@@ -4980,16 +8054,16 @@ char *p = (char *) alloca (2 * sizeof (int));
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:4983: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8057: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:4986: \$? = $ac_status" >&5
+  echo "$as_me:8060: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:4989: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8063: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:4992: \$? = $ac_status" >&5
+  echo "$as_me:8066: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_working_alloca_h=yes
 else
@@ -4999,7 +8073,7 @@ ac_cv_working_alloca_h=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:5002: result: $ac_cv_working_alloca_h" >&5
+echo "$as_me:8076: result: $ac_cv_working_alloca_h" >&5
 echo "${ECHO_T}$ac_cv_working_alloca_h" >&6
 if test $ac_cv_working_alloca_h = yes; then
 
@@ -5009,13 +8083,13 @@ EOF
 
 fi
 
-echo "$as_me:5012: checking for alloca" >&5
+echo "$as_me:8086: checking for alloca" >&5
 echo $ECHO_N "checking for alloca... $ECHO_C" >&6
 if test "${ac_cv_func_alloca_works+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5018 "configure"
+#line 8092 "configure"
 #include "confdefs.h"
 #ifdef __GNUC__
 # define alloca __builtin_alloca
@@ -5047,16 +8121,16 @@ char *p = (char *) alloca (1);
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5050: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8124: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5053: \$? = $ac_status" >&5
+  echo "$as_me:8127: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:5056: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8130: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5059: \$? = $ac_status" >&5
+  echo "$as_me:8133: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_alloca_works=yes
 else
@@ -5066,7 +8140,7 @@ ac_cv_func_alloca_works=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:5069: result: $ac_cv_func_alloca_works" >&5
+echo "$as_me:8143: result: $ac_cv_func_alloca_works" >&5
 echo "${ECHO_T}$ac_cv_func_alloca_works" >&6
 
 if test $ac_cv_func_alloca_works = yes; then
@@ -5087,13 +8161,13 @@ cat >>confdefs.h <<\EOF
 #define C_ALLOCA 1
 EOF
 
-echo "$as_me:5090: checking whether \`alloca.c' needs Cray hooks" >&5
+echo "$as_me:8164: checking whether \`alloca.c' needs Cray hooks" >&5
 echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6
 if test "${ac_cv_os_cray+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5096 "configure"
+#line 8170 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -5111,18 +8185,18 @@ fi
 rm -f conftest*
 
 fi
-echo "$as_me:5114: result: $ac_cv_os_cray" >&5
+echo "$as_me:8188: result: $ac_cv_os_cray" >&5
 echo "${ECHO_T}$ac_cv_os_cray" >&6
 if test $ac_cv_os_cray = yes; then
   for ac_func in _getb67 GETB67 getb67; do
     as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:5119: checking for $ac_func" >&5
+echo "$as_me:8193: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5125 "configure"
+#line 8199 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -5153,16 +8227,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5156: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8230: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5159: \$? = $ac_status" >&5
+  echo "$as_me:8233: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:5162: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8236: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5165: \$? = $ac_status" >&5
+  echo "$as_me:8239: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -5172,7 +8246,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:5175: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:8249: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
 
@@ -5186,7 +8260,7 @@ fi
   done
 fi
 
-echo "$as_me:5189: checking stack direction for C alloca" >&5
+echo "$as_me:8263: checking stack direction for C alloca" >&5
 echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6
 if test "${ac_cv_c_stack_direction+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5195,7 +8269,7 @@ else
   ac_cv_c_stack_direction=0
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5198 "configure"
+#line 8272 "configure"
 #include "confdefs.h"
 int
 find_stack_direction ()
@@ -5218,15 +8292,15 @@ main ()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:5221: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8295: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5224: \$? = $ac_status" >&5
+  echo "$as_me:8298: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:5226: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8300: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5229: \$? = $ac_status" >&5
+  echo "$as_me:8303: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_c_stack_direction=1
 else
@@ -5238,7 +8312,7 @@ fi
 rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
-echo "$as_me:5241: result: $ac_cv_c_stack_direction" >&5
+echo "$as_me:8315: result: $ac_cv_c_stack_direction" >&5
 echo "${ECHO_T}$ac_cv_c_stack_direction" >&6
 
 cat >>confdefs.h <<EOF
@@ -5247,14 +8321,14 @@ EOF
 
 fi
 
-echo "$as_me:5250: checking whether getpgrp takes no argument" >&5
+echo "$as_me:8324: checking whether getpgrp takes no argument" >&5
 echo $ECHO_N "checking whether getpgrp takes no argument... $ECHO_C" >&6
 if test "${ac_cv_func_getpgrp_void+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   # Use it with a single arg.
 cat >conftest.$ac_ext <<_ACEOF
-#line 5257 "configure"
+#line 8331 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -5266,16 +8340,16 @@ getpgrp (0);
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5269: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:8343: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:5272: \$? = $ac_status" >&5
+  echo "$as_me:8346: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:5275: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8349: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5278: \$? = $ac_status" >&5
+  echo "$as_me:8352: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_func_getpgrp_1=yes
 else
@@ -5286,7 +8360,7 @@ fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 # Use it with no arg.
 cat >conftest.$ac_ext <<_ACEOF
-#line 5289 "configure"
+#line 8363 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -5298,16 +8372,16 @@ getpgrp ();
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5301: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:8375: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:5304: \$? = $ac_status" >&5
+  echo "$as_me:8378: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:5307: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8381: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5310: \$? = $ac_status" >&5
+  echo "$as_me:8384: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_func_getpgrp_0=yes
 else
@@ -5321,12 +8395,12 @@ case $ac_func_getpgrp_0:$ac_func_getpgrp_1 in
   yes:no) ac_cv_func_getpgrp_void=yes;;
   no:yes) ac_cv_func_getpgrp_void=false;;
   *) if test "$cross_compiling" = yes; then
-  { { echo "$as_me:5324: error: cannot check getpgrp if cross compiling" >&5
+  { { echo "$as_me:8398: error: cannot check getpgrp if cross compiling" >&5
 echo "$as_me: error: cannot check getpgrp if cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5329 "configure"
+#line 8403 "configure"
 #include "confdefs.h"
 $ac_includes_default
 
@@ -5380,15 +8454,15 @@ main ()
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:5383: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8457: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5386: \$? = $ac_status" >&5
+  echo "$as_me:8460: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:5388: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8462: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5391: \$? = $ac_status" >&5
+  echo "$as_me:8465: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_getpgrp_void=yes
 else
@@ -5402,7 +8476,7 @@ fi;;
 esac # $ac_func_getpgrp_0:$ac_func_getpgrp_1
 
 fi
-echo "$as_me:5405: result: $ac_cv_func_getpgrp_void" >&5
+echo "$as_me:8479: result: $ac_cv_func_getpgrp_void" >&5
 echo "${ECHO_T}$ac_cv_func_getpgrp_void" >&6
 if test $ac_cv_func_getpgrp_void = yes; then
 
@@ -5412,18 +8486,18 @@ EOF
 
 fi
 
-echo "$as_me:5415: checking whether setvbuf arguments are reversed" >&5
+echo "$as_me:8489: checking whether setvbuf arguments are reversed" >&5
 echo $ECHO_N "checking whether setvbuf arguments are reversed... $ECHO_C" >&6
 if test "${ac_cv_func_setvbuf_reversed+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { { echo "$as_me:5421: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:8495: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5426 "configure"
+#line 8500 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 /* If setvbuf has the reversed format, exit 0. */
@@ -5440,15 +8514,15 @@ main ()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:5443: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8517: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5446: \$? = $ac_status" >&5
+  echo "$as_me:8520: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:5448: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8522: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5451: \$? = $ac_status" >&5
+  echo "$as_me:8525: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_setvbuf_reversed=yes
 else
@@ -5461,7 +8535,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 rm -f core core.* *.core
 fi
-echo "$as_me:5464: result: $ac_cv_func_setvbuf_reversed" >&5
+echo "$as_me:8538: result: $ac_cv_func_setvbuf_reversed" >&5
 echo "${ECHO_T}$ac_cv_func_setvbuf_reversed" >&6
 if test $ac_cv_func_setvbuf_reversed = yes; then
 
@@ -5474,13 +8548,13 @@ fi
 for ac_func in vprintf
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:5477: checking for $ac_func" >&5
+echo "$as_me:8551: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5483 "configure"
+#line 8557 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -5511,16 +8585,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5514: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8588: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5517: \$? = $ac_status" >&5
+  echo "$as_me:8591: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:5520: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8594: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5523: \$? = $ac_status" >&5
+  echo "$as_me:8597: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -5530,20 +8604,20 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:5533: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:8607: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
 EOF
 
-echo "$as_me:5540: checking for _doprnt" >&5
+echo "$as_me:8614: checking for _doprnt" >&5
 echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6
 if test "${ac_cv_func__doprnt+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5546 "configure"
+#line 8620 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char _doprnt (); below.  */
@@ -5574,16 +8648,16 @@ f = _doprnt;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5577: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8651: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5580: \$? = $ac_status" >&5
+  echo "$as_me:8654: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:5583: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8657: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5586: \$? = $ac_status" >&5
+  echo "$as_me:8660: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func__doprnt=yes
 else
@@ -5593,7 +8667,7 @@ ac_cv_func__doprnt=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:5596: result: $ac_cv_func__doprnt" >&5
+echo "$as_me:8670: result: $ac_cv_func__doprnt" >&5
 echo "${ECHO_T}$ac_cv_func__doprnt" >&6
 if test $ac_cv_func__doprnt = yes; then
 
@@ -5606,7 +8680,7 @@ fi
 fi
 done
 
-echo "$as_me:5609: checking for working strcoll" >&5
+echo "$as_me:8683: checking for working strcoll" >&5
 echo $ECHO_N "checking for working strcoll... $ECHO_C" >&6
 if test "${ac_cv_func_strcoll_works+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5615,7 +8689,7 @@ else
   ac_cv_func_strcoll_works=no
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5618 "configure"
+#line 8692 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -5629,15 +8703,15 @@ exit (strcoll ("abc", "def") >= 0 ||
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:5632: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8706: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5635: \$? = $ac_status" >&5
+  echo "$as_me:8709: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:5637: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8711: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5640: \$? = $ac_status" >&5
+  echo "$as_me:8714: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_strcoll_works=yes
 else
@@ -5649,7 +8723,7 @@ fi
 rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
-echo "$as_me:5652: result: $ac_cv_func_strcoll_works" >&5
+echo "$as_me:8726: result: $ac_cv_func_strcoll_works" >&5
 echo "${ECHO_T}$ac_cv_func_strcoll_works" >&6
 if test $ac_cv_func_strcoll_works = yes; then
 
@@ -5670,10 +8744,10 @@ if test "$ac_cv_func_alloca_works" = "no" && test "$opt_bash_malloc" = "no"; the
 fi
 
 if test "$ac_cv_func_vprintf" = no; then
-    echo "$as_me:5673: checking for declaration of vprintf in stdio.h" >&5
+    echo "$as_me:8747: checking for declaration of vprintf in stdio.h" >&5
 echo $ECHO_N "checking for declaration of vprintf in stdio.h... $ECHO_C" >&6
     cat >conftest.$ac_ext <<_ACEOF
-#line 5676 "configure"
+#line 8750 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 
@@ -5684,7 +8758,7 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
 fi
 rm -f conftest*
 
-    echo "$as_me:5687: result: $ac_cv_func_vprintf" >&5
+    echo "$as_me:8761: result: $ac_cv_func_vprintf" >&5
 echo "${ECHO_T}$ac_cv_func_vprintf" >&6
     if test $ac_cv_func_vprintf = yes; then
        cat >>confdefs.h <<\EOF
@@ -5698,13 +8772,13 @@ if test "$ac_cv_func_vprintf" = no && test "$ac_cv_func__doprnt" = "yes"; then
   LIBOBJS="$LIBOBJS vprint.$ac_objext"
 fi
 
-echo "$as_me:5701: checking return type of signal handlers" >&5
+echo "$as_me:8775: checking return type of signal handlers" >&5
 echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6
 if test "${ac_cv_type_signal+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5707 "configure"
+#line 8781 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -5726,16 +8800,16 @@ int i;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:5729: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:8803: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:5732: \$? = $ac_status" >&5
+  echo "$as_me:8806: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:5735: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8809: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5738: \$? = $ac_status" >&5
+  echo "$as_me:8812: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_signal=void
 else
@@ -5745,20 +8819,20 @@ ac_cv_type_signal=int
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:5748: result: $ac_cv_type_signal" >&5
+echo "$as_me:8822: result: $ac_cv_type_signal" >&5
 echo "${ECHO_T}$ac_cv_type_signal" >&6
 
 cat >>confdefs.h <<EOF
 #define RETSIGTYPE $ac_cv_type_signal
 EOF
 
-echo "$as_me:5755: checking for __setostype" >&5
+echo "$as_me:8829: checking for __setostype" >&5
 echo $ECHO_N "checking for __setostype... $ECHO_C" >&6
 if test "${ac_cv_func___setostype+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5761 "configure"
+#line 8835 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char __setostype (); below.  */
@@ -5789,16 +8863,16 @@ f = __setostype;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5792: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8866: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5795: \$? = $ac_status" >&5
+  echo "$as_me:8869: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:5798: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8872: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5801: \$? = $ac_status" >&5
+  echo "$as_me:8875: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func___setostype=yes
 else
@@ -5808,7 +8882,7 @@ ac_cv_func___setostype=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:5811: result: $ac_cv_func___setostype" >&5
+echo "$as_me:8885: result: $ac_cv_func___setostype" >&5
 echo "${ECHO_T}$ac_cv_func___setostype" >&6
 if test $ac_cv_func___setostype = yes; then
   cat >>confdefs.h <<\EOF
@@ -5817,13 +8891,13 @@ EOF
 
 fi
 
-echo "$as_me:5820: checking for wait3" >&5
+echo "$as_me:8894: checking for wait3" >&5
 echo $ECHO_N "checking for wait3... $ECHO_C" >&6
 if test "${ac_cv_func_wait3+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5826 "configure"
+#line 8900 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char wait3 (); below.  */
@@ -5854,16 +8928,16 @@ f = wait3;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5857: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8931: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5860: \$? = $ac_status" >&5
+  echo "$as_me:8934: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:5863: \"$ac_try\"") >&5
+  { (eval echo "$as_me:8937: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5866: \$? = $ac_status" >&5
+  echo "$as_me:8940: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_wait3=yes
 else
@@ -5873,7 +8947,7 @@ ac_cv_func_wait3=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:5876: result: $ac_cv_func_wait3" >&5
+echo "$as_me:8950: result: $ac_cv_func_wait3" >&5
 echo "${ECHO_T}$ac_cv_func_wait3" >&6
 if test $ac_cv_func_wait3 = yes; then
   cat >>confdefs.h <<\EOF
@@ -5882,13 +8956,13 @@ EOF
 
 fi
 
-echo "$as_me:5885: checking for isinf" >&5
+echo "$as_me:8959: checking for isinf" >&5
 echo $ECHO_N "checking for isinf... $ECHO_C" >&6
 if test "${ac_cv_func_isinf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5891 "configure"
+#line 8965 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char isinf (); below.  */
@@ -5919,16 +8993,16 @@ f = isinf;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5922: \"$ac_link\"") >&5
+if { (eval echo "$as_me:8996: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5925: \$? = $ac_status" >&5
+  echo "$as_me:8999: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:5928: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9002: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5931: \$? = $ac_status" >&5
+  echo "$as_me:9005: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_isinf=yes
 else
@@ -5938,7 +9012,7 @@ ac_cv_func_isinf=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:5941: result: $ac_cv_func_isinf" >&5
+echo "$as_me:9015: result: $ac_cv_func_isinf" >&5
 echo "${ECHO_T}$ac_cv_func_isinf" >&6
 if test $ac_cv_func_isinf = yes; then
   cat >>confdefs.h <<\EOF
@@ -5947,13 +9021,13 @@ EOF
 
 fi
 
-echo "$as_me:5950: checking for mkfifo" >&5
+echo "$as_me:9024: checking for mkfifo" >&5
 echo $ECHO_N "checking for mkfifo... $ECHO_C" >&6
 if test "${ac_cv_func_mkfifo+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 5956 "configure"
+#line 9030 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char mkfifo (); below.  */
@@ -5984,16 +9058,16 @@ f = mkfifo;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:5987: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9061: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:5990: \$? = $ac_status" >&5
+  echo "$as_me:9064: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:5993: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9067: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:5996: \$? = $ac_status" >&5
+  echo "$as_me:9070: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_mkfifo=yes
 else
@@ -6003,7 +9077,7 @@ ac_cv_func_mkfifo=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6006: result: $ac_cv_func_mkfifo" >&5
+echo "$as_me:9080: result: $ac_cv_func_mkfifo" >&5
 echo "${ECHO_T}$ac_cv_func_mkfifo" >&6
 if test $ac_cv_func_mkfifo = yes; then
   cat >>confdefs.h <<\EOF
@@ -6023,13 +9097,13 @@ for ac_func in dup2 select getdtablesize getgroups gethostname \
                readlink
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:6026: checking for $ac_func" >&5
+echo "$as_me:9100: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6032 "configure"
+#line 9106 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -6060,16 +9134,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6063: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9137: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6066: \$? = $ac_status" >&5
+  echo "$as_me:9140: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6069: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9143: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6072: \$? = $ac_status" >&5
+  echo "$as_me:9146: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -6079,7 +9153,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6082: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:9156: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -6092,13 +9166,13 @@ done
 for ac_func in rename
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:6095: checking for $ac_func" >&5
+echo "$as_me:9169: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6101 "configure"
+#line 9175 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -6129,16 +9203,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6132: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9206: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6135: \$? = $ac_status" >&5
+  echo "$as_me:9209: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6138: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9212: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6141: \$? = $ac_status" >&5
+  echo "$as_me:9215: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -6148,7 +9222,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6151: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:9225: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -6167,13 +9241,13 @@ for ac_func in bcopy bzero confstr sysconf pathconf setenv putenv unsetenv \
                vsnprintf snprintf vasprintf asprintf fnmatch regcomp regexec
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:6170: checking for $ac_func" >&5
+echo "$as_me:9244: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6176 "configure"
+#line 9250 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -6204,16 +9278,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6207: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9281: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6210: \$? = $ac_status" >&5
+  echo "$as_me:9284: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6213: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9287: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6216: \$? = $ac_status" >&5
+  echo "$as_me:9290: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -6223,7 +9297,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6226: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:9300: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -6236,13 +9310,13 @@ done
 for ac_func in isascii isblank isgraph isprint isspace isxdigit
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:6239: checking for $ac_func" >&5
+echo "$as_me:9313: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6245 "configure"
+#line 9319 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -6273,16 +9347,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6276: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9350: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6279: \$? = $ac_status" >&5
+  echo "$as_me:9353: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6282: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9356: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6285: \$? = $ac_status" >&5
+  echo "$as_me:9359: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -6292,7 +9366,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6295: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:9369: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -6305,13 +9379,13 @@ done
 for ac_func in getcwd strcasecmp strerror strftime strpbrk memset strstr
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:6308: checking for $ac_func" >&5
+echo "$as_me:9382: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6314 "configure"
+#line 9388 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -6342,16 +9416,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6345: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9419: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6348: \$? = $ac_status" >&5
+  echo "$as_me:9422: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6351: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9425: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6354: \$? = $ac_status" >&5
+  echo "$as_me:9428: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -6361,7 +9435,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6364: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:9438: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -6376,13 +9450,13 @@ done
 for ac_func in strtod strtol strtoul strtoll strtoull strtoimax strtoumax
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:6379: checking for $ac_func" >&5
+echo "$as_me:9453: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6385 "configure"
+#line 9459 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -6413,16 +9487,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6416: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9490: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6419: \$? = $ac_status" >&5
+  echo "$as_me:9493: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6422: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9496: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6425: \$? = $ac_status" >&5
+  echo "$as_me:9499: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -6432,7 +9506,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6435: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:9509: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -6444,13 +9518,13 @@ else
 fi
 done
 
-echo "$as_me:6447: checking whether confstr is declared" >&5
+echo "$as_me:9521: checking whether confstr is declared" >&5
 echo $ECHO_N "checking whether confstr is declared... $ECHO_C" >&6
 if test "${ac_cv_have_decl_confstr+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6453 "configure"
+#line 9527 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -6465,16 +9539,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6468: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9542: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:6471: \$? = $ac_status" >&5
+  echo "$as_me:9545: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:6474: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9548: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6477: \$? = $ac_status" >&5
+  echo "$as_me:9551: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_have_decl_confstr=yes
 else
@@ -6484,7 +9558,7 @@ ac_cv_have_decl_confstr=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:6487: result: $ac_cv_have_decl_confstr" >&5
+echo "$as_me:9561: result: $ac_cv_have_decl_confstr" >&5
 echo "${ECHO_T}$ac_cv_have_decl_confstr" >&6
 if test $ac_cv_have_decl_confstr = yes; then
 
@@ -6499,13 +9573,13 @@ EOF
 
 fi
 
-echo "$as_me:6502: checking whether printf is declared" >&5
+echo "$as_me:9576: checking whether printf is declared" >&5
 echo $ECHO_N "checking whether printf is declared... $ECHO_C" >&6
 if test "${ac_cv_have_decl_printf+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6508 "configure"
+#line 9582 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -6520,16 +9594,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6523: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9597: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:6526: \$? = $ac_status" >&5
+  echo "$as_me:9600: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:6529: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9603: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6532: \$? = $ac_status" >&5
+  echo "$as_me:9606: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_have_decl_printf=yes
 else
@@ -6539,7 +9613,7 @@ ac_cv_have_decl_printf=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:6542: result: $ac_cv_have_decl_printf" >&5
+echo "$as_me:9616: result: $ac_cv_have_decl_printf" >&5
 echo "${ECHO_T}$ac_cv_have_decl_printf" >&6
 if test $ac_cv_have_decl_printf = yes; then
 
@@ -6554,13 +9628,13 @@ EOF
 
 fi
 
-echo "$as_me:6557: checking whether sbrk is declared" >&5
+echo "$as_me:9631: checking whether sbrk is declared" >&5
 echo $ECHO_N "checking whether sbrk is declared... $ECHO_C" >&6
 if test "${ac_cv_have_decl_sbrk+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6563 "configure"
+#line 9637 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -6575,16 +9649,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6578: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9652: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:6581: \$? = $ac_status" >&5
+  echo "$as_me:9655: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:6584: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9658: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6587: \$? = $ac_status" >&5
+  echo "$as_me:9661: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_have_decl_sbrk=yes
 else
@@ -6594,7 +9668,7 @@ ac_cv_have_decl_sbrk=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:6597: result: $ac_cv_have_decl_sbrk" >&5
+echo "$as_me:9671: result: $ac_cv_have_decl_sbrk" >&5
 echo "${ECHO_T}$ac_cv_have_decl_sbrk" >&6
 if test $ac_cv_have_decl_sbrk = yes; then
 
@@ -6609,13 +9683,13 @@ EOF
 
 fi
 
-echo "$as_me:6612: checking whether strcpy is declared" >&5
+echo "$as_me:9686: checking whether strcpy is declared" >&5
 echo $ECHO_N "checking whether strcpy is declared... $ECHO_C" >&6
 if test "${ac_cv_have_decl_strcpy+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6618 "configure"
+#line 9692 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -6630,16 +9704,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6633: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9707: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:6636: \$? = $ac_status" >&5
+  echo "$as_me:9710: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:6639: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9713: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6642: \$? = $ac_status" >&5
+  echo "$as_me:9716: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_have_decl_strcpy=yes
 else
@@ -6649,7 +9723,7 @@ ac_cv_have_decl_strcpy=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:6652: result: $ac_cv_have_decl_strcpy" >&5
+echo "$as_me:9726: result: $ac_cv_have_decl_strcpy" >&5
 echo "${ECHO_T}$ac_cv_have_decl_strcpy" >&6
 if test $ac_cv_have_decl_strcpy = yes; then
 
@@ -6664,13 +9738,13 @@ EOF
 
 fi
 
-echo "$as_me:6667: checking whether strsignal is declared" >&5
+echo "$as_me:9741: checking whether strsignal is declared" >&5
 echo $ECHO_N "checking whether strsignal is declared... $ECHO_C" >&6
 if test "${ac_cv_have_decl_strsignal+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6673 "configure"
+#line 9747 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -6685,16 +9759,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6688: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9762: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:6691: \$? = $ac_status" >&5
+  echo "$as_me:9765: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:6694: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9768: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6697: \$? = $ac_status" >&5
+  echo "$as_me:9771: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_have_decl_strsignal=yes
 else
@@ -6704,7 +9778,7 @@ ac_cv_have_decl_strsignal=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:6707: result: $ac_cv_have_decl_strsignal" >&5
+echo "$as_me:9781: result: $ac_cv_have_decl_strsignal" >&5
 echo "${ECHO_T}$ac_cv_have_decl_strsignal" >&6
 if test $ac_cv_have_decl_strsignal = yes; then
 
@@ -6719,13 +9793,13 @@ EOF
 
 fi
 
-echo "$as_me:6722: checking whether strtold is declared" >&5
+echo "$as_me:9796: checking whether strtold is declared" >&5
 echo $ECHO_N "checking whether strtold is declared... $ECHO_C" >&6
 if test "${ac_cv_have_decl_strtold+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6728 "configure"
+#line 9802 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -6740,16 +9814,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6743: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9817: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:6746: \$? = $ac_status" >&5
+  echo "$as_me:9820: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:6749: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9823: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6752: \$? = $ac_status" >&5
+  echo "$as_me:9826: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_have_decl_strtold=yes
 else
@@ -6759,7 +9833,7 @@ ac_cv_have_decl_strtold=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:6762: result: $ac_cv_have_decl_strtold" >&5
+echo "$as_me:9836: result: $ac_cv_have_decl_strtold" >&5
 echo "${ECHO_T}$ac_cv_have_decl_strtold" >&6
 if test $ac_cv_have_decl_strtold = yes; then
 
@@ -6767,13 +9841,13 @@ cat >>confdefs.h <<EOF
 #define HAVE_DECL_STRTOLD 1
 EOF
 
-    echo "$as_me:6770: checking for broken strtold" >&5
+    echo "$as_me:9844: checking for broken strtold" >&5
 echo $ECHO_N "checking for broken strtold... $ECHO_C" >&6
     if test "${bash_cv_strtold_broken+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6776 "configure"
+#line 9850 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 int
@@ -6785,16 +9859,16 @@ int main() { long double r; char *foo, bar; r = strtold(foo, &bar);}
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:6788: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:9862: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:6791: \$? = $ac_status" >&5
+  echo "$as_me:9865: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:6794: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9868: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6797: \$? = $ac_status" >&5
+  echo "$as_me:9871: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_strtold_broken=no
 else
@@ -6806,7 +9880,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 
 fi
 
-    echo "$as_me:6809: result: $bash_cv_strtold_broken" >&5
+    echo "$as_me:9883: result: $bash_cv_strtold_broken" >&5
 echo "${ECHO_T}$bash_cv_strtold_broken" >&6
     if test "$bash_cv_strtold_broken" = "yes" ; then
        cat >>confdefs.h <<\EOF
@@ -6822,13 +9896,13 @@ EOF
 
 fi
 
-echo "$as_me:6825: checking for declaration of strtoimax" >&5
+echo "$as_me:9899: checking for declaration of strtoimax" >&5
 echo $ECHO_N "checking for declaration of strtoimax... $ECHO_C" >&6
 if test "${bash_cv_decl_strtoimax+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6831 "configure"
+#line 9905 "configure"
 #include "confdefs.h"
 
 #if STDC_HEADERS
@@ -6847,16 +9921,16 @@ return !strtoimax;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6850: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9924: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6853: \$? = $ac_status" >&5
+  echo "$as_me:9927: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6856: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9930: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6859: \$? = $ac_status" >&5
+  echo "$as_me:9933: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_decl_strtoimax=yes
 else
@@ -6866,7 +9940,7 @@ bash_cv_decl_strtoimax=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6869: result: $bash_cv_decl_strtoimax" >&5
+echo "$as_me:9943: result: $bash_cv_decl_strtoimax" >&5
 echo "${ECHO_T}$bash_cv_decl_strtoimax" >&6
 bash_tr_func=HAVE_DECL_`echo strtoimax | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
 if test $bash_cv_decl_strtoimax = yes; then
@@ -6881,13 +9955,13 @@ EOF
 
 fi
 
-echo "$as_me:6884: checking for declaration of strtol" >&5
+echo "$as_me:9958: checking for declaration of strtol" >&5
 echo $ECHO_N "checking for declaration of strtol... $ECHO_C" >&6
 if test "${bash_cv_decl_strtol+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6890 "configure"
+#line 9964 "configure"
 #include "confdefs.h"
 
 #if STDC_HEADERS
@@ -6906,16 +9980,16 @@ return !strtol;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6909: \"$ac_link\"") >&5
+if { (eval echo "$as_me:9983: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6912: \$? = $ac_status" >&5
+  echo "$as_me:9986: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6915: \"$ac_try\"") >&5
+  { (eval echo "$as_me:9989: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6918: \$? = $ac_status" >&5
+  echo "$as_me:9992: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_decl_strtol=yes
 else
@@ -6925,7 +9999,7 @@ bash_cv_decl_strtol=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6928: result: $bash_cv_decl_strtol" >&5
+echo "$as_me:10002: result: $bash_cv_decl_strtol" >&5
 echo "${ECHO_T}$bash_cv_decl_strtol" >&6
 bash_tr_func=HAVE_DECL_`echo strtol | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
 if test $bash_cv_decl_strtol = yes; then
@@ -6940,13 +10014,13 @@ EOF
 
 fi
 
-echo "$as_me:6943: checking for declaration of strtoll" >&5
+echo "$as_me:10017: checking for declaration of strtoll" >&5
 echo $ECHO_N "checking for declaration of strtoll... $ECHO_C" >&6
 if test "${bash_cv_decl_strtoll+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 6949 "configure"
+#line 10023 "configure"
 #include "confdefs.h"
 
 #if STDC_HEADERS
@@ -6965,16 +10039,16 @@ return !strtoll;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:6968: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10042: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:6971: \$? = $ac_status" >&5
+  echo "$as_me:10045: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:6974: \"$ac_try\"") >&5
+  { (eval echo "$as_me:10048: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:6977: \$? = $ac_status" >&5
+  echo "$as_me:10051: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_decl_strtoll=yes
 else
@@ -6984,7 +10058,7 @@ bash_cv_decl_strtoll=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:6987: result: $bash_cv_decl_strtoll" >&5
+echo "$as_me:10061: result: $bash_cv_decl_strtoll" >&5
 echo "${ECHO_T}$bash_cv_decl_strtoll" >&6
 bash_tr_func=HAVE_DECL_`echo strtoll | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
 if test $bash_cv_decl_strtoll = yes; then
@@ -6999,13 +10073,13 @@ EOF
 
 fi
 
-echo "$as_me:7002: checking for declaration of strtoul" >&5
+echo "$as_me:10076: checking for declaration of strtoul" >&5
 echo $ECHO_N "checking for declaration of strtoul... $ECHO_C" >&6
 if test "${bash_cv_decl_strtoul+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7008 "configure"
+#line 10082 "configure"
 #include "confdefs.h"
 
 #if STDC_HEADERS
@@ -7024,16 +10098,16 @@ return !strtoul;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7027: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10101: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7030: \$? = $ac_status" >&5
+  echo "$as_me:10104: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7033: \"$ac_try\"") >&5
+  { (eval echo "$as_me:10107: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7036: \$? = $ac_status" >&5
+  echo "$as_me:10110: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_decl_strtoul=yes
 else
@@ -7043,7 +10117,7 @@ bash_cv_decl_strtoul=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:7046: result: $bash_cv_decl_strtoul" >&5
+echo "$as_me:10120: result: $bash_cv_decl_strtoul" >&5
 echo "${ECHO_T}$bash_cv_decl_strtoul" >&6
 bash_tr_func=HAVE_DECL_`echo strtoul | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
 if test $bash_cv_decl_strtoul = yes; then
@@ -7058,13 +10132,13 @@ EOF
 
 fi
 
-echo "$as_me:7061: checking for declaration of strtoull" >&5
+echo "$as_me:10135: checking for declaration of strtoull" >&5
 echo $ECHO_N "checking for declaration of strtoull... $ECHO_C" >&6
 if test "${bash_cv_decl_strtoull+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7067 "configure"
+#line 10141 "configure"
 #include "confdefs.h"
 
 #if STDC_HEADERS
@@ -7083,16 +10157,16 @@ return !strtoull;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7086: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10160: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7089: \$? = $ac_status" >&5
+  echo "$as_me:10163: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7092: \"$ac_try\"") >&5
+  { (eval echo "$as_me:10166: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7095: \$? = $ac_status" >&5
+  echo "$as_me:10169: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_decl_strtoull=yes
 else
@@ -7102,7 +10176,7 @@ bash_cv_decl_strtoull=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:7105: result: $bash_cv_decl_strtoull" >&5
+echo "$as_me:10179: result: $bash_cv_decl_strtoull" >&5
 echo "${ECHO_T}$bash_cv_decl_strtoull" >&6
 bash_tr_func=HAVE_DECL_`echo strtoull | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
 if test $bash_cv_decl_strtoull = yes; then
@@ -7117,13 +10191,13 @@ EOF
 
 fi
 
-echo "$as_me:7120: checking for declaration of strtoumax" >&5
+echo "$as_me:10194: checking for declaration of strtoumax" >&5
 echo $ECHO_N "checking for declaration of strtoumax... $ECHO_C" >&6
 if test "${bash_cv_decl_strtoumax+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7126 "configure"
+#line 10200 "configure"
 #include "confdefs.h"
 
 #if STDC_HEADERS
@@ -7142,16 +10216,16 @@ return !strtoumax;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7145: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10219: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7148: \$? = $ac_status" >&5
+  echo "$as_me:10222: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7151: \"$ac_try\"") >&5
+  { (eval echo "$as_me:10225: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7154: \$? = $ac_status" >&5
+  echo "$as_me:10228: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_decl_strtoumax=yes
 else
@@ -7161,7 +10235,7 @@ bash_cv_decl_strtoumax=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:7164: result: $bash_cv_decl_strtoumax" >&5
+echo "$as_me:10238: result: $bash_cv_decl_strtoumax" >&5
 echo "${ECHO_T}$bash_cv_decl_strtoumax" >&6
 bash_tr_func=HAVE_DECL_`echo strtoumax | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
 if test $bash_cv_decl_strtoumax = yes; then
 for ac_header in sys/time.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:7182: checking for $ac_header" >&5
+echo "$as_me:10256: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7188 "configure"
+#line 10262 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:7192: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:10266: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:7198: \$? = $ac_status" >&5
+  echo "$as_me:10272: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7214,7 +10288,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:7217: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:10291: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -7227,13 +10301,13 @@ done
 for ac_func in alarm
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:7230: checking for $ac_func" >&5
+echo "$as_me:10304: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7236 "configure"
+#line 10310 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -7264,16 +10338,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7267: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10341: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7270: \$? = $ac_status" >&5
+  echo "$as_me:10344: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7273: \"$ac_try\"") >&5
+  { (eval echo "$as_me:10347: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7276: \$? = $ac_status" >&5
+  echo "$as_me:10350: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -7283,7 +10357,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:7286: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:10360: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -7293,7 +10367,7 @@ EOF
 fi
 done
 
-echo "$as_me:7296: checking for working mktime" >&5
+echo "$as_me:10370: checking for working mktime" >&5
 echo $ECHO_N "checking for working mktime... $ECHO_C" >&6
 if test "${ac_cv_func_working_mktime+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -7302,7 +10376,7 @@ else
   ac_cv_func_working_mktime=no
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7305 "configure"
+#line 10379 "configure"
 #include "confdefs.h"
 /* Test program from Paul Eggert and Tony Leneis.  */
 #if TIME_WITH_SYS_TIME
@@ -7451,15 +10525,15 @@ main ()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:7454: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10528: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7457: \$? = $ac_status" >&5
+  echo "$as_me:10531: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:7459: \"$ac_try\"") >&5
+  { (eval echo "$as_me:10533: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7462: \$? = $ac_status" >&5
+  echo "$as_me:10536: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_working_mktime=yes
 else
 rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
-echo "$as_me:7474: result: $ac_cv_func_working_mktime" >&5
+echo "$as_me:10548: result: $ac_cv_func_working_mktime" >&5
 echo "${ECHO_T}$ac_cv_func_working_mktime" >&6
 if test $ac_cv_func_working_mktime = no; then
   LIBOBJS="$LIBOBJS mktime.$ac_objext"
 fi
 
-for ac_header in libintl.h
+for ac_header in argz.h errno.h fcntl.h malloc.h stdio_ext.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:10557: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 10563 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:10567: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:10573: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+echo "$as_me:10592: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_header in stdlib.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:10605: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 10611 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:10615: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  egrep -v '^ *\+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:10621: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+echo "$as_me:10640: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:10650: checking for working malloc" >&5
+echo $ECHO_N "checking for working malloc... $ECHO_C" >&6
+if test "${ac_cv_func_malloc_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_malloc_works=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 10659 "configure"
+#include "confdefs.h"
+#if STDC_HEADERS || HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+char *malloc ();
+#endif
+
+int
+main ()
+{
+exit (malloc (0) ? 0 : 1);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:10676: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:10679: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:10681: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:10684: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_malloc_works=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_malloc_works=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:10696: result: $ac_cv_func_malloc_works" >&5
+echo "${ECHO_T}$ac_cv_func_malloc_works" >&6
+if test $ac_cv_func_malloc_works = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_MALLOC 1
+EOF
+
+fi
+
+for ac_header in stdlib.h unistd.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:7483: checking for $ac_header" >&5
+echo "$as_me:10709: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7489 "configure"
+#line 10715 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:7493: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:10719: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:7499: \$? = $ac_status" >&5
+  echo "$as_me:10725: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7515,7 +10741,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:7518: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:10744: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -7525,16 +10751,16 @@ EOF
 fi
 done
 
-for ac_func in gettext textdomain bindtextdomain
+for ac_func in getpagesize
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:7531: checking for $ac_func" >&5
+echo "$as_me:10757: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7537 "configure"
+#line 10763 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -7565,16 +10791,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7568: \"$ac_link\"") >&5
+if { (eval echo "$as_me:10794: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7571: \$? = $ac_status" >&5
+  echo "$as_me:10797: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7574: \"$ac_try\"") >&5
+  { (eval echo "$as_me:10800: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7577: \$? = $ac_status" >&5
+  echo "$as_me:10803: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -7584,7 +10810,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:7587: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:10813: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -7594,78 +10820,184 @@ EOF
 fi
 done
 
-if test "$ac_cv_func_bindtextdomain" = "no"; then
-
-echo "$as_me:7599: checking for bindtextdomain in -lintl" >&5
-echo $ECHO_N "checking for bindtextdomain in -lintl... $ECHO_C" >&6
-if test "${ac_cv_lib_intl_bindtextdomain+set}" = set; then
+echo "$as_me:10823: checking for working mmap" >&5
+echo $ECHO_N "checking for working mmap... $ECHO_C" >&6
+if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lintl  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line 7607 "configure"
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_mmap_fixed_mapped=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line 10832 "configure"
 #include "confdefs.h"
+$ac_includes_default
+/* Thanks to Mike Haertel and Jim Avera for this test.
+   Here is a matrix of mmap possibilities:
+       mmap private not fixed
+       mmap private fixed at somewhere currently unmapped
+       mmap private fixed at somewhere already mapped
+       mmap shared not fixed
+       mmap shared fixed at somewhere currently unmapped
+       mmap shared fixed at somewhere already mapped
+   For private mappings, we should verify that changes cannot be read()
+   back from the file, nor mmap's back from the file at a different
+   address.  (There have been systems where private was not correctly
+   implemented like the infamous i386 svr4.0, and systems where the
+   VM page cache was not coherent with the file system buffer cache
+   like early versions of FreeBSD and possibly contemporary NetBSD.)
+   For shared mappings, we should conversely verify that changes get
+   propogated back to all the places they're supposed to be.
+
+   Grep wants private fixed already mapped.
+   The main things grep needs to know about mmap are:
+   * does it exist and is it safe to write into the mmap'd area
+   * how to use it (BSD variants)  */
 
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if !STDC_HEADERS && !HAVE_STDLIB_H
+char *malloc ();
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char bindtextdomain ();
+
+/* This mess was copied from the GNU getpagesize.h.  */
+#if !HAVE_GETPAGESIZE
+/* Assume that all systems that can run configure have sys/param.h.  */
+# if !HAVE_SYS_PARAM_H
+#  define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+#  define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+#  if HAVE_SYS_PARAM_H
+#   include <sys/param.h>
+#   ifdef EXEC_PAGESIZE
+#    define getpagesize() EXEC_PAGESIZE
+#   else /* no EXEC_PAGESIZE */
+#    ifdef NBPG
+#     define getpagesize() NBPG * CLSIZE
+#     ifndef CLSIZE
+#      define CLSIZE 1
+#     endif /* no CLSIZE */
+#    else /* no NBPG */
+#     ifdef NBPC
+#      define getpagesize() NBPC
+#     else /* no NBPC */
+#      ifdef PAGESIZE
+#       define getpagesize() PAGESIZE
+#      endif /* PAGESIZE */
+#     endif /* no NBPC */
+#    endif /* no NBPG */
+#   endif /* no EXEC_PAGESIZE */
+#  else /* no HAVE_SYS_PARAM_H */
+#   define getpagesize() 8192  /* punt totally */
+#  endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
 int
 main ()
 {
-bindtextdomain ();
-  ;
-  return 0;
+  char *data, *data2, *data3;
+  int i, pagesize;
+  int fd;
+
+  pagesize = getpagesize ();
+
+  /* First, make a file with some known garbage in it. */
+  data = (char *) malloc (pagesize);
+  if (!data)
+    exit (1);
+  for (i = 0; i < pagesize; ++i)
+    *(data + i) = rand ();
+  umask (0);
+  fd = creat ("conftest.mmap", 0600);
+  if (fd < 0)
+    exit (1);
+  if (write (fd, data, pagesize) != pagesize)
+    exit (1);
+  close (fd);
+
+  /* Next, try to mmap the file at a fixed address which already has
+     something else allocated at it.  If we can, also make sure that
+     we see the same garbage.  */
+  fd = open ("conftest.mmap", O_RDWR);
+  if (fd < 0)
+    exit (1);
+  data2 = (char *) malloc (2 * pagesize);
+  if (!data2)
+    exit (1);
+  data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+  if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+                     MAP_PRIVATE | MAP_FIXED, fd, 0L))
+    exit (1);
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data2 + i))
+      exit (1);
+
+  /* Finally, make sure that changes to the mapped area do not
+     percolate back to the file as seen by read().  (This is a bug on
+     some variants of i386 svr4.0.)  */
+  for (i = 0; i < pagesize; ++i)
+    *(data2 + i) = *(data2 + i) + 1;
+  data3 = (char *) malloc (pagesize);
+  if (!data3)
+    exit (1);
+  if (read (fd, data3, pagesize) != pagesize)
+    exit (1);
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data3 + i))
+      exit (1);
+  close (fd);
+  exit (0);
 }
 _ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7626: \"$ac_link\"") >&5
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:10959: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7629: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-         { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7632: \"$ac_try\"") >&5
+  echo "$as_me:10962: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:10964: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7635: \$? = $ac_status" >&5
+  echo "$as_me:10967: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_lib_intl_bindtextdomain=yes
+  ac_cv_func_mmap_fixed_mapped=yes
 else
-  echo "$as_me: failed program was:" >&5
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
 cat conftest.$ac_ext >&5
-ac_cv_lib_intl_bindtextdomain=no
+ac_cv_func_mmap_fixed_mapped=no
 fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:7646: result: $ac_cv_lib_intl_bindtextdomain" >&5
-echo "${ECHO_T}$ac_cv_lib_intl_bindtextdomain" >&6
-if test $ac_cv_lib_intl_bindtextdomain = yes; then
-  cat >>confdefs.h <<EOF
-#define HAVE_LIBINTL 1
-EOF
+fi
+echo "$as_me:10979: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
 
-  LIBS="-lintl $LIBS"
+cat >>confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
 
 fi
+rm -f conftest.mmap
 
-    if test "$ac_cv_lib_intl" = "yes"; then
-
-for ac_func in gettext textdomain bindtextdomain
+for ac_func in __argz_count __argz_next __argz_stringify dcgettext mempcpy \
+               munmap stpcpy strcspn strdup
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:7662: checking for $ac_func" >&5
+echo "$as_me:10994: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7668 "configure"
+#line 11000 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -7696,16 +11028,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7699: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11031: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7702: \$? = $ac_status" >&5
+  echo "$as_me:11034: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7705: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11037: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7708: \$? = $ac_status" >&5
+  echo "$as_me:11040: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -7715,7 +11047,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:7718: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:11050: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -7725,29 +11057,32 @@ EOF
 fi
 done
 
-    fi
+INTL_DEP= INTL_INC=
+if test "x$USE_INCLUDED_LIBINTL" = "xyes"; then
+       INTL_DEP='${INTL_LIBDIR}/libintl.a'
+       INTL_INC='-I${INTL_LIBSRC}'
 fi
 
 for ac_header in wctype.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:7734: checking for $ac_header" >&5
+echo "$as_me:11069: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7740 "configure"
+#line 11075 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:7744: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:11079: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:7750: \$? = $ac_status" >&5
+  echo "$as_me:11085: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7766,7 +11101,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:7769: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:11104: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -7779,23 +11114,23 @@ done
 for ac_header in wchar.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:7782: checking for $ac_header" >&5
+echo "$as_me:11117: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7788 "configure"
+#line 11123 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:7792: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:11127: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:7798: \$? = $ac_status" >&5
+  echo "$as_me:11133: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7814,7 +11149,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:7817: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:11152: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -7827,23 +11162,23 @@ done
 for ac_header in langinfo.h
 do
 as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:7830: checking for $ac_header" >&5
+echo "$as_me:11165: checking for $ac_header" >&5
 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
 if eval "test \"\${$as_ac_Header+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7836 "configure"
+#line 11171 "configure"
 #include "confdefs.h"
 #include <$ac_header>
 _ACEOF
-if { (eval echo "$as_me:7840: \"$ac_cpp conftest.$ac_ext\"") >&5
+if { (eval echo "$as_me:11175: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
   egrep -v '^ *\+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:7846: \$? = $ac_status" >&5
+  echo "$as_me:11181: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null; then
   if test -s conftest.err; then
     ac_cpp_err=$ac_c_preproc_warn_flag
@@ -7862,7 +11197,7 @@ else
 fi
 rm -f conftest.err conftest.$ac_ext
 fi
-echo "$as_me:7865: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "$as_me:11200: result: `eval echo '${'$as_ac_Header'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
 if test `eval echo '${'$as_ac_Header'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -7872,13 +11207,13 @@ EOF
 fi
 done
 
-echo "$as_me:7875: checking for mbsrtowcs" >&5
+echo "$as_me:11210: checking for mbsrtowcs" >&5
 echo $ECHO_N "checking for mbsrtowcs... $ECHO_C" >&6
 if test "${ac_cv_func_mbsrtowcs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7881 "configure"
+#line 11216 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char mbsrtowcs (); below.  */
@@ -7909,16 +11244,16 @@ f = mbsrtowcs;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7912: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11247: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7915: \$? = $ac_status" >&5
+  echo "$as_me:11250: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7918: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11253: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7921: \$? = $ac_status" >&5
+  echo "$as_me:11256: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_mbsrtowcs=yes
 else
@@ -7928,7 +11263,7 @@ ac_cv_func_mbsrtowcs=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:7931: result: $ac_cv_func_mbsrtowcs" >&5
+echo "$as_me:11266: result: $ac_cv_func_mbsrtowcs" >&5
 echo "${ECHO_T}$ac_cv_func_mbsrtowcs" >&6
 if test $ac_cv_func_mbsrtowcs = yes; then
   cat >>confdefs.h <<\EOF
@@ -7937,13 +11272,13 @@ EOF
 
 fi
 
-echo "$as_me:7940: checking for mbrtowc" >&5
+echo "$as_me:11275: checking for mbrtowc" >&5
 echo $ECHO_N "checking for mbrtowc... $ECHO_C" >&6
 if test "${ac_cv_func_mbrtowc+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 7946 "configure"
+#line 11281 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char mbrtowc (); below.  */
@@ -7974,16 +11309,16 @@ f = mbrtowc;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:7977: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11312: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:7980: \$? = $ac_status" >&5
+  echo "$as_me:11315: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:7983: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11318: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:7986: \$? = $ac_status" >&5
+  echo "$as_me:11321: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_mbrtowc=yes
 else
@@ -7993,7 +11328,7 @@ ac_cv_func_mbrtowc=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:7996: result: $ac_cv_func_mbrtowc" >&5
+echo "$as_me:11331: result: $ac_cv_func_mbrtowc" >&5
 echo "${ECHO_T}$ac_cv_func_mbrtowc" >&6
 if test $ac_cv_func_mbrtowc = yes; then
   cat >>confdefs.h <<\EOF
@@ -8002,13 +11337,13 @@ EOF
 
 fi
 
-echo "$as_me:8005: checking for mbrlen" >&5
+echo "$as_me:11340: checking for mbrlen" >&5
 echo $ECHO_N "checking for mbrlen... $ECHO_C" >&6
 if test "${ac_cv_func_mbrlen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8011 "configure"
+#line 11346 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char mbrlen (); below.  */
@@ -8039,16 +11374,16 @@ f = mbrlen;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8042: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11377: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8045: \$? = $ac_status" >&5
+  echo "$as_me:11380: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8048: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11383: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8051: \$? = $ac_status" >&5
+  echo "$as_me:11386: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_mbrlen=yes
 else
@@ -8058,7 +11393,7 @@ ac_cv_func_mbrlen=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:8061: result: $ac_cv_func_mbrlen" >&5
+echo "$as_me:11396: result: $ac_cv_func_mbrlen" >&5
 echo "${ECHO_T}$ac_cv_func_mbrlen" >&6
 if test $ac_cv_func_mbrlen = yes; then
   cat >>confdefs.h <<\EOF
@@ -8067,13 +11402,13 @@ EOF
 
 fi
 
-echo "$as_me:8070: checking for wctomb" >&5
+echo "$as_me:11405: checking for wctomb" >&5
 echo $ECHO_N "checking for wctomb... $ECHO_C" >&6
 if test "${ac_cv_func_wctomb+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8076 "configure"
+#line 11411 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char wctomb (); below.  */
@@ -8104,16 +11439,16 @@ f = wctomb;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8107: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11442: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8110: \$? = $ac_status" >&5
+  echo "$as_me:11445: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8113: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11448: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8116: \$? = $ac_status" >&5
+  echo "$as_me:11451: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_wctomb=yes
 else
@@ -8123,7 +11458,7 @@ ac_cv_func_wctomb=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:8126: result: $ac_cv_func_wctomb" >&5
+echo "$as_me:11461: result: $ac_cv_func_wctomb" >&5
 echo "${ECHO_T}$ac_cv_func_wctomb" >&6
 if test $ac_cv_func_wctomb = yes; then
   cat >>confdefs.h <<\EOF
@@ -8132,13 +11467,13 @@ EOF
 
 fi
 
-echo "$as_me:8135: checking for wcwidth" >&5
+echo "$as_me:11470: checking for wcwidth" >&5
 echo $ECHO_N "checking for wcwidth... $ECHO_C" >&6
 if test "${ac_cv_func_wcwidth+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8141 "configure"
+#line 11476 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char wcwidth (); below.  */
@@ -8169,16 +11504,16 @@ f = wcwidth;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8172: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11507: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8175: \$? = $ac_status" >&5
+  echo "$as_me:11510: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8178: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11513: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8181: \$? = $ac_status" >&5
+  echo "$as_me:11516: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_wcwidth=yes
 else
@@ -8188,7 +11523,7 @@ ac_cv_func_wcwidth=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:8191: result: $ac_cv_func_wcwidth" >&5
+echo "$as_me:11526: result: $ac_cv_func_wcwidth" >&5
 echo "${ECHO_T}$ac_cv_func_wcwidth" >&6
 if test $ac_cv_func_wcwidth = yes; then
   cat >>confdefs.h <<\EOF
@@ -8197,13 +11532,13 @@ EOF
 
 fi
 
-echo "$as_me:8200: checking for mbstate_t" >&5
+echo "$as_me:11535: checking for mbstate_t" >&5
 echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6
 if test "${bash_cv_have_mbstate_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8206 "configure"
+#line 11541 "configure"
 #include "confdefs.h"
 
 #include <wchar.h>
@@ -8220,16 +11555,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:8223: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:11558: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:8226: \$? = $ac_status" >&5
+  echo "$as_me:11561: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:8229: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11564: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8232: \$? = $ac_status" >&5
+  echo "$as_me:11567: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_have_mbstate_t=yes
 else
@@ -8239,7 +11574,7 @@ bash_cv_have_mbstate_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:8242: result: $bash_cv_have_mbstate_t" >&5
+echo "$as_me:11577: result: $bash_cv_have_mbstate_t" >&5
 echo "${ECHO_T}$bash_cv_have_mbstate_t" >&6
 if test $bash_cv_have_mbstate_t = yes; then
        cat >>confdefs.h <<\EOF
@@ -8248,13 +11583,13 @@ EOF
 
 fi
 
-echo "$as_me:8251: checking for nl_langinfo and CODESET" >&5
+echo "$as_me:11586: checking for nl_langinfo and CODESET" >&5
 echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6
 if test "${bash_cv_langinfo_codeset+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8257 "configure"
+#line 11592 "configure"
 #include "confdefs.h"
 #include <langinfo.h>
 int
@@ -8266,16 +11601,16 @@ char* cs = nl_langinfo(CODESET);
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8269: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11604: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8272: \$? = $ac_status" >&5
+  echo "$as_me:11607: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8275: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11610: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8278: \$? = $ac_status" >&5
+  echo "$as_me:11613: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_langinfo_codeset=yes
 else
@@ -8285,7 +11620,7 @@ bash_cv_langinfo_codeset=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:8288: result: $bash_cv_langinfo_codeset" >&5
+echo "$as_me:11623: result: $bash_cv_langinfo_codeset" >&5
 echo "${ECHO_T}$bash_cv_langinfo_codeset" >&6
 if test $bash_cv_langinfo_codeset = yes; then
   cat >>confdefs.h <<\EOF
@@ -8296,7 +11631,7 @@ fi
 
 if test "$opt_static_link" != yes; then
 
-echo "$as_me:8299: checking for dlopen in -ldl" >&5
+echo "$as_me:11634: checking for dlopen in -ldl" >&5
 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
 if test "${ac_cv_lib_dl_dlopen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8304,7 +11639,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ldl  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 8307 "configure"
+#line 11642 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -8323,16 +11658,16 @@ dlopen ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8326: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11661: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8329: \$? = $ac_status" >&5
+  echo "$as_me:11664: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8332: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11667: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8335: \$? = $ac_status" >&5
+  echo "$as_me:11670: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_dl_dlopen=yes
 else
@@ -8343,7 +11678,7 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:8346: result: $ac_cv_lib_dl_dlopen" >&5
+echo "$as_me:11681: result: $ac_cv_lib_dl_dlopen" >&5
 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
 if test $ac_cv_lib_dl_dlopen = yes; then
   cat >>confdefs.h <<EOF
 for ac_func in dlopen dlclose dlsym
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:8360: checking for $ac_func" >&5
+echo "$as_me:11695: checking for $ac_func" >&5
 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
 if eval "test \"\${$as_ac_var+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8366 "configure"
+#line 11701 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func (); below.  */
@@ -8394,16 +11729,16 @@ f = $ac_func;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8397: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11732: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8400: \$? = $ac_status" >&5
+  echo "$as_me:11735: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8403: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11738: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8406: \$? = $ac_status" >&5
+  echo "$as_me:11741: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   eval "$as_ac_var=yes"
 else
@@ -8413,7 +11748,7 @@ eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:8416: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "$as_me:11751: result: `eval echo '${'$as_ac_var'}'`" >&5
 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<EOF
@@ -8425,13 +11760,13 @@ done
 
 fi
 
-echo "$as_me:8428: checking for sys_siglist declaration in signal.h or unistd.h" >&5
+echo "$as_me:11763: checking for sys_siglist declaration in signal.h or unistd.h" >&5
 echo $ECHO_N "checking for sys_siglist declaration in signal.h or unistd.h... $ECHO_C" >&6
 if test "${ac_cv_decl_sys_siglist+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8434 "configure"
+#line 11769 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -8449,16 +11784,16 @@ char *msg = *(sys_siglist + 1);
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:8452: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:11787: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:8455: \$? = $ac_status" >&5
+  echo "$as_me:11790: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:8458: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11793: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8461: \$? = $ac_status" >&5
+  echo "$as_me:11796: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_decl_sys_siglist=yes
 else
@@ -8468,7 +11803,7 @@ ac_cv_decl_sys_siglist=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:8471: result: $ac_cv_decl_sys_siglist" >&5
+echo "$as_me:11806: result: $ac_cv_decl_sys_siglist" >&5
 echo "${ECHO_T}$ac_cv_decl_sys_siglist" >&6
 if test $ac_cv_decl_sys_siglist = yes; then
 
 
 if test "$ac_cv_func_inet_aton" != 'yes'; then
 
-echo "$as_me:8483: checking for inet_aton" >&5
+echo "$as_me:11818: checking for inet_aton" >&5
 echo $ECHO_N "checking for inet_aton... $ECHO_C" >&6
 if test "${bash_cv_func_inet_aton+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8489 "configure"
+#line 11824 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -8502,16 +11837,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8505: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11840: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8508: \$? = $ac_status" >&5
+  echo "$as_me:11843: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8511: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11846: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8514: \$? = $ac_status" >&5
+  echo "$as_me:11849: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_func_inet_aton=yes
 else
@@ -8521,7 +11856,7 @@ bash_cv_func_inet_aton=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:8524: result: $bash_cv_func_inet_aton" >&5
+echo "$as_me:11859: result: $bash_cv_func_inet_aton" >&5
 echo "${ECHO_T}$bash_cv_func_inet_aton" >&6
 if test $bash_cv_func_inet_aton = yes; then
   cat >>confdefs.h <<\EOF
@@ -8536,7 +11871,7 @@ fi
 
 case "$host_os" in
 irix4*)
-echo "$as_me:8539: checking for getpwent in -lsun" >&5
+echo "$as_me:11874: checking for getpwent in -lsun" >&5
 echo $ECHO_N "checking for getpwent in -lsun... $ECHO_C" >&6
 if test "${ac_cv_lib_sun_getpwent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8544,7 +11879,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lsun  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 8547 "configure"
+#line 11882 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -8563,16 +11898,16 @@ getpwent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8566: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11901: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8569: \$? = $ac_status" >&5
+  echo "$as_me:11904: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8572: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11907: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8575: \$? = $ac_status" >&5
+  echo "$as_me:11910: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_sun_getpwent=yes
 else
@@ -8583,7 +11918,7 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:8586: result: $ac_cv_lib_sun_getpwent" >&5
+echo "$as_me:11921: result: $ac_cv_lib_sun_getpwent" >&5
 echo "${ECHO_T}$ac_cv_lib_sun_getpwent" >&6
 if test $ac_cv_lib_sun_getpwent = yes; then
   cat >>confdefs.h <<EOF
@@ -8601,14 +11936,14 @@ if test "$ac_cv_func_getpeername" = no; then
 if test "X$bash_cv_have_socklib" = "X"; then
 _bash_needmsg=
 else
-echo "$as_me:8604: checking for socket library" >&5
+echo "$as_me:11939: checking for socket library" >&5
 echo $ECHO_N "checking for socket library... $ECHO_C" >&6
 _bash_needmsg=yes
 fi
 if test "${bash_cv_have_socklib+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  echo "$as_me:8611: checking for getpeername in -lsocket" >&5
+  echo "$as_me:11946: checking for getpeername in -lsocket" >&5
 echo $ECHO_N "checking for getpeername in -lsocket... $ECHO_C" >&6
 if test "${ac_cv_lib_socket_getpeername+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8616,7 +11951,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lsocket -lnsl $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 8619 "configure"
+#line 11954 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -8635,16 +11970,16 @@ getpeername ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8638: \"$ac_link\"") >&5
+if { (eval echo "$as_me:11973: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8641: \$? = $ac_status" >&5
+  echo "$as_me:11976: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8644: \"$ac_try\"") >&5
+  { (eval echo "$as_me:11979: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8647: \$? = $ac_status" >&5
+  echo "$as_me:11982: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_socket_getpeername=yes
 else
@@ -8655,7 +11990,7 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:8658: result: $ac_cv_lib_socket_getpeername" >&5
+echo "$as_me:11993: result: $ac_cv_lib_socket_getpeername" >&5
 echo "${ECHO_T}$ac_cv_lib_socket_getpeername" >&6
 if test $ac_cv_lib_socket_getpeername = yes; then
   bash_cv_have_socklib=yes
@@ -8666,7 +12001,7 @@ fi
 fi
 
 if test "X$_bash_needmsg" = Xyes; then
-  echo "$as_me:8669: result: $bash_cv_have_socklib" >&5
+  echo "$as_me:12004: result: $bash_cv_have_socklib" >&5
 echo "${ECHO_T}$bash_cv_have_socklib" >&6
   _bash_needmsg=
 fi
@@ -8675,14 +12010,14 @@ if test $bash_cv_have_socklib = yes; then
   if test "X$bash_cv_have_libnsl" = "X"; then
     _bash_needmsg=
   else
-    echo "$as_me:8678: checking for libnsl" >&5
+    echo "$as_me:12013: checking for libnsl" >&5
 echo $ECHO_N "checking for libnsl... $ECHO_C" >&6
     _bash_needmsg=yes
   fi
   if test "${bash_cv_have_libnsl+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  echo "$as_me:8685: checking for t_open in -lnsl" >&5
+  echo "$as_me:12020: checking for t_open in -lnsl" >&5
 echo $ECHO_N "checking for t_open in -lnsl... $ECHO_C" >&6
 if test "${ac_cv_lib_nsl_t_open+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8690,7 +12025,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lnsl  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 8693 "configure"
+#line 12028 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -8709,16 +12044,16 @@ t_open ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8712: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12047: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8715: \$? = $ac_status" >&5
+  echo "$as_me:12050: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8718: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12053: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8721: \$? = $ac_status" >&5
+  echo "$as_me:12056: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_nsl_t_open=yes
 else
@@ -8729,7 +12064,7 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:8732: result: $ac_cv_lib_nsl_t_open" >&5
+echo "$as_me:12067: result: $ac_cv_lib_nsl_t_open" >&5
 echo "${ECHO_T}$ac_cv_lib_nsl_t_open" >&6
 if test $ac_cv_lib_nsl_t_open = yes; then
   bash_cv_have_libnsl=yes
@@ -8740,7 +12075,7 @@ fi
 fi
 
   if test "X$_bash_needmsg" = Xyes; then
-    echo "$as_me:8743: result: $bash_cv_have_libnsl" >&5
+    echo "$as_me:12078: result: $bash_cv_have_libnsl" >&5
 echo "${ECHO_T}$bash_cv_have_libnsl" >&6
     _bash_needmsg=
   fi
@@ -8764,7 +12099,7 @@ if test "$ac_cv_func_gethostbyname" = no; then
        if test "X$bash_cv_have_gethostbyname" = "X"; then
 _bash_needmsg=yes
 else
-echo "$as_me:8767: checking for gethostbyname in socket library" >&5
+echo "$as_me:12102: checking for gethostbyname in socket library" >&5
 echo $ECHO_N "checking for gethostbyname in socket library... $ECHO_C" >&6
 _bash_needmsg=
 fi
@@ -8772,7 +12107,7 @@ if test "${bash_cv_have_gethostbyname+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8775 "configure"
+#line 12110 "configure"
 #include "confdefs.h"
 #include <netdb.h>
 int
@@ -8786,16 +12121,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:8789: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12124: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8792: \$? = $ac_status" >&5
+  echo "$as_me:12127: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:8795: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12130: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8798: \$? = $ac_status" >&5
+  echo "$as_me:12133: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_have_gethostbyname=yes
 else
@@ -8808,10 +12143,10 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
 
 if test "X$_bash_needmsg" = Xyes; then
-    echo "$as_me:8811: checking for gethostbyname in socket library" >&5
+    echo "$as_me:12146: checking for gethostbyname in socket library" >&5
 echo $ECHO_N "checking for gethostbyname in socket library... $ECHO_C" >&6
 fi
-echo "$as_me:8814: result: $bash_cv_have_gethostbyname" >&5
+echo "$as_me:12149: result: $bash_cv_have_gethostbyname" >&5
 echo "${ECHO_T}$bash_cv_have_gethostbyname" >&6
 if test "$bash_cv_have_gethostbyname" = yes; then
 cat >>confdefs.h <<\EOF
 
 fi
 
-echo "$as_me:8825: checking for uid_t in sys/types.h" >&5
+echo "$as_me:12160: checking for uid_t in sys/types.h" >&5
 echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6
 if test "${ac_cv_type_uid_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8831 "configure"
+#line 12166 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 
@@ -8842,7 +12177,7 @@ fi
 rm -f conftest*
 
 fi
-echo "$as_me:8845: result: $ac_cv_type_uid_t" >&5
+echo "$as_me:12180: result: $ac_cv_type_uid_t" >&5
 echo "${ECHO_T}$ac_cv_type_uid_t" >&6
 if test $ac_cv_type_uid_t = no; then
 
@@ -8856,7 +12191,7 @@ EOF
 
 fi
 
-echo "$as_me:8859: checking type of array argument to getgroups" >&5
+echo "$as_me:12194: checking type of array argument to getgroups" >&5
 echo $ECHO_N "checking type of array argument to getgroups... $ECHO_C" >&6
 if test "${ac_cv_type_getgroups+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -8865,7 +12200,7 @@ else
   ac_cv_type_getgroups=cross
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8868 "configure"
+#line 12203 "configure"
 #include "confdefs.h"
 /* Thanks to Mike Rendell for this test.  */
 #include <sys/types.h>
@@ -8891,15 +12226,15 @@ main ()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:8894: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12229: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:8897: \$? = $ac_status" >&5
+  echo "$as_me:12232: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:8899: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12234: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8902: \$? = $ac_status" >&5
+  echo "$as_me:12237: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_getgroups=gid_t
 else
@@ -8912,7 +12247,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 if test $ac_cv_type_getgroups = cross; then
         cat >conftest.$ac_ext <<_ACEOF
-#line 8915 "configure"
+#line 12250 "configure"
 #include "confdefs.h"
 #include <unistd.h>
 
@@ -8927,20 +12262,20 @@ rm -f conftest*
 
 fi
 fi
-echo "$as_me:8930: result: $ac_cv_type_getgroups" >&5
+echo "$as_me:12265: result: $ac_cv_type_getgroups" >&5
 echo "${ECHO_T}$ac_cv_type_getgroups" >&6
 
 cat >>confdefs.h <<EOF
 #define GETGROUPS_T $ac_cv_type_getgroups
 EOF
 
-echo "$as_me:8937: checking for off_t" >&5
+echo "$as_me:12272: checking for off_t" >&5
 echo $ECHO_N "checking for off_t... $ECHO_C" >&6
 if test "${ac_cv_type_off_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8943 "configure"
+#line 12278 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -8955,16 +12290,16 @@ if (sizeof (off_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:8958: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12293: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:8961: \$? = $ac_status" >&5
+  echo "$as_me:12296: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:8964: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12299: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:8967: \$? = $ac_status" >&5
+  echo "$as_me:12302: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_off_t=yes
 else
@@ -8974,7 +12309,7 @@ ac_cv_type_off_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:8977: result: $ac_cv_type_off_t" >&5
+echo "$as_me:12312: result: $ac_cv_type_off_t" >&5
 echo "${ECHO_T}$ac_cv_type_off_t" >&6
 if test $ac_cv_type_off_t = yes; then
   :
@@ -8986,13 +12321,13 @@ EOF
 
 fi
 
-echo "$as_me:8989: checking for mode_t" >&5
+echo "$as_me:12324: checking for mode_t" >&5
 echo $ECHO_N "checking for mode_t... $ECHO_C" >&6
 if test "${ac_cv_type_mode_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 8995 "configure"
+#line 12330 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9007,16 +12342,16 @@ if (sizeof (mode_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9010: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12345: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9013: \$? = $ac_status" >&5
+  echo "$as_me:12348: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9016: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12351: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9019: \$? = $ac_status" >&5
+  echo "$as_me:12354: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_mode_t=yes
 else
@@ -9026,7 +12361,7 @@ ac_cv_type_mode_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9029: result: $ac_cv_type_mode_t" >&5
+echo "$as_me:12364: result: $ac_cv_type_mode_t" >&5
 echo "${ECHO_T}$ac_cv_type_mode_t" >&6
 if test $ac_cv_type_mode_t = yes; then
   :
@@ -9038,13 +12373,13 @@ EOF
 
 fi
 
-echo "$as_me:9041: checking for uid_t in sys/types.h" >&5
+echo "$as_me:12376: checking for uid_t in sys/types.h" >&5
 echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6
 if test "${ac_cv_type_uid_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9047 "configure"
+#line 12382 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 
@@ -9058,7 +12393,7 @@ fi
 rm -f conftest*
 
 fi
-echo "$as_me:9061: result: $ac_cv_type_uid_t" >&5
+echo "$as_me:12396: result: $ac_cv_type_uid_t" >&5
 echo "${ECHO_T}$ac_cv_type_uid_t" >&6
 if test $ac_cv_type_uid_t = no; then
 
@@ -9072,13 +12407,13 @@ EOF
 
 fi
 
-echo "$as_me:9075: checking for pid_t" >&5
+echo "$as_me:12410: checking for pid_t" >&5
 echo $ECHO_N "checking for pid_t... $ECHO_C" >&6
 if test "${ac_cv_type_pid_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9081 "configure"
+#line 12416 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9093,16 +12428,16 @@ if (sizeof (pid_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9096: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12431: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9099: \$? = $ac_status" >&5
+  echo "$as_me:12434: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9102: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12437: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9105: \$? = $ac_status" >&5
+  echo "$as_me:12440: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_pid_t=yes
 else
@@ -9112,7 +12447,7 @@ ac_cv_type_pid_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9115: result: $ac_cv_type_pid_t" >&5
+echo "$as_me:12450: result: $ac_cv_type_pid_t" >&5
 echo "${ECHO_T}$ac_cv_type_pid_t" >&6
 if test $ac_cv_type_pid_t = yes; then
   :
@@ -9124,13 +12459,13 @@ EOF
 
 fi
 
-echo "$as_me:9127: checking for size_t" >&5
+echo "$as_me:12462: checking for size_t" >&5
 echo $ECHO_N "checking for size_t... $ECHO_C" >&6
 if test "${ac_cv_type_size_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9133 "configure"
+#line 12468 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9145,16 +12480,16 @@ if (sizeof (size_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9148: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12483: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9151: \$? = $ac_status" >&5
+  echo "$as_me:12486: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9154: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12489: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9157: \$? = $ac_status" >&5
+  echo "$as_me:12492: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_size_t=yes
 else
@@ -9164,7 +12499,7 @@ ac_cv_type_size_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9167: result: $ac_cv_type_size_t" >&5
+echo "$as_me:12502: result: $ac_cv_type_size_t" >&5
 echo "${ECHO_T}$ac_cv_type_size_t" >&6
 if test $ac_cv_type_size_t = yes; then
   :
@@ -9176,13 +12511,13 @@ EOF
 
 fi
 
-echo "$as_me:9179: checking for ssize_t" >&5
+echo "$as_me:12514: checking for ssize_t" >&5
 echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6
 if test "${ac_cv_type_ssize_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9185 "configure"
+#line 12520 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9197,16 +12532,16 @@ if (sizeof (ssize_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9200: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12535: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9203: \$? = $ac_status" >&5
+  echo "$as_me:12538: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9206: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12541: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9209: \$? = $ac_status" >&5
+  echo "$as_me:12544: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_ssize_t=yes
 else
@@ -9216,7 +12551,7 @@ ac_cv_type_ssize_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9219: result: $ac_cv_type_ssize_t" >&5
+echo "$as_me:12554: result: $ac_cv_type_ssize_t" >&5
 echo "${ECHO_T}$ac_cv_type_ssize_t" >&6
 if test $ac_cv_type_ssize_t = yes; then
   :
@@ -9228,13 +12563,13 @@ EOF
 
 fi
 
-echo "$as_me:9231: checking for time_t" >&5
+echo "$as_me:12566: checking for time_t" >&5
 echo $ECHO_N "checking for time_t... $ECHO_C" >&6
 if test "${ac_cv_type_time_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9237 "configure"
+#line 12572 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9249,16 +12584,16 @@ if (sizeof (time_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9252: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12587: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9255: \$? = $ac_status" >&5
+  echo "$as_me:12590: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9258: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12593: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9261: \$? = $ac_status" >&5
+  echo "$as_me:12596: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_time_t=yes
 else
@@ -9268,7 +12603,7 @@ ac_cv_type_time_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9271: result: $ac_cv_type_time_t" >&5
+echo "$as_me:12606: result: $ac_cv_type_time_t" >&5
 echo "${ECHO_T}$ac_cv_type_time_t" >&6
 if test $ac_cv_type_time_t = yes; then
   :
@@ -9280,13 +12615,13 @@ EOF
 
 fi
 
-echo "$as_me:9283: checking for long long" >&5
+echo "$as_me:12618: checking for long long" >&5
 echo $ECHO_N "checking for long long... $ECHO_C" >&6
 if test "${bash_cv_type_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9289 "configure"
+#line 12624 "configure"
 #include "confdefs.h"
 
 long long ll = 1; int i = 63;
@@ -9302,16 +12637,16 @@ return ll << i | ll >> i | llm / ll | llm % ll;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:9305: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12640: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:9308: \$? = $ac_status" >&5
+  echo "$as_me:12643: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:9311: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12646: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9314: \$? = $ac_status" >&5
+  echo "$as_me:12649: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_type_long_long='long long'
 else
@@ -9321,7 +12656,7 @@ bash_cv_type_long_long='long'
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:9324: result: $bash_cv_type_long_long" >&5
+echo "$as_me:12659: result: $bash_cv_type_long_long" >&5
 echo "${ECHO_T}$bash_cv_type_long_long" >&6
 if test "$bash_cv_type_long_long" = 'long long'; then
   cat >>confdefs.h <<\EOF
@@ -9330,13 +12665,13 @@ EOF
 
 fi
 
-echo "$as_me:9333: checking for unsigned long long" >&5
+echo "$as_me:12668: checking for unsigned long long" >&5
 echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
 if test "${bash_cv_type_unsigned_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9339 "configure"
+#line 12674 "configure"
 #include "confdefs.h"
 
 unsigned long long ull = 1; int i = 63;
@@ -9352,16 +12687,16 @@ return ull << i | ull >> i | ullmax / ull | ullmax % ull;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:9355: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12690: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:9358: \$? = $ac_status" >&5
+  echo "$as_me:12693: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:9361: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12696: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9364: \$? = $ac_status" >&5
+  echo "$as_me:12699: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_type_unsigned_long_long='unsigned long long'
 else
@@ -9371,7 +12706,7 @@ bash_cv_type_unsigned_long_long='unsigned long'
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:9374: result: $bash_cv_type_unsigned_long_long" >&5
+echo "$as_me:12709: result: $bash_cv_type_unsigned_long_long" >&5
 echo "${ECHO_T}$bash_cv_type_unsigned_long_long" >&6
 if test "$bash_cv_type_unsigned_long_long" = 'unsigned long long'; then
   cat >>confdefs.h <<\EOF
@@ -9380,13 +12715,13 @@ EOF
 
 fi
 
-echo "$as_me:9383: checking return type of signal handlers" >&5
+echo "$as_me:12718: checking return type of signal handlers" >&5
 echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6
 if test "${ac_cv_type_signal+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9389 "configure"
+#line 12724 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -9408,16 +12743,16 @@ int i;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9411: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12746: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9414: \$? = $ac_status" >&5
+  echo "$as_me:12749: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9417: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12752: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9420: \$? = $ac_status" >&5
+  echo "$as_me:12755: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_signal=void
 else
@@ -9427,20 +12762,20 @@ ac_cv_type_signal=int
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9430: result: $ac_cv_type_signal" >&5
+echo "$as_me:12765: result: $ac_cv_type_signal" >&5
 echo "${ECHO_T}$ac_cv_type_signal" >&6
 
 cat >>confdefs.h <<EOF
 #define RETSIGTYPE $ac_cv_type_signal
 EOF
 
-echo "$as_me:9437: checking for char" >&5
+echo "$as_me:12772: checking for char" >&5
 echo $ECHO_N "checking for char... $ECHO_C" >&6
 if test "${ac_cv_type_char+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9443 "configure"
+#line 12778 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9455,16 +12790,16 @@ if (sizeof (char))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9458: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12793: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9461: \$? = $ac_status" >&5
+  echo "$as_me:12796: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9464: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12799: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9467: \$? = $ac_status" >&5
+  echo "$as_me:12802: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_char=yes
 else
@@ -9474,10 +12809,10 @@ ac_cv_type_char=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9477: result: $ac_cv_type_char" >&5
+echo "$as_me:12812: result: $ac_cv_type_char" >&5
 echo "${ECHO_T}$ac_cv_type_char" >&6
 
-echo "$as_me:9480: checking size of char" >&5
+echo "$as_me:12815: checking size of char" >&5
 echo $ECHO_N "checking size of char... $ECHO_C" >&6
 if test "${ac_cv_sizeof_char+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9486,7 +12821,7 @@ else
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line 9489 "configure"
+#line 12824 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9498,21 +12833,21 @@ int _array_ [1 - 2 * !((sizeof (char)) >= 0)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9501: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12836: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9504: \$? = $ac_status" >&5
+  echo "$as_me:12839: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9507: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12842: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9510: \$? = $ac_status" >&5
+  echo "$as_me:12845: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 9515 "configure"
+#line 12850 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9524,16 +12859,16 @@ int _array_ [1 - 2 * !((sizeof (char)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9527: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12862: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9530: \$? = $ac_status" >&5
+  echo "$as_me:12865: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9533: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12868: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9536: \$? = $ac_status" >&5
+  echo "$as_me:12871: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid; break
 else
@@ -9549,7 +12884,7 @@ cat conftest.$ac_ext >&5
 ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 9552 "configure"
+#line 12887 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9561,16 +12896,16 @@ int _array_ [1 - 2 * !((sizeof (char)) >= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9564: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12899: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9567: \$? = $ac_status" >&5
+  echo "$as_me:12902: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9570: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12905: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9573: \$? = $ac_status" >&5
+  echo "$as_me:12908: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=$ac_mid; break
 else
@@ -9586,7 +12921,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line 9589 "configure"
+#line 12924 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9598,16 +12933,16 @@ int _array_ [1 - 2 * !((sizeof (char)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9601: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:12936: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9604: \$? = $ac_status" >&5
+  echo "$as_me:12939: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9607: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12942: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9610: \$? = $ac_status" >&5
+  echo "$as_me:12945: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid
 else
@@ -9620,12 +12955,12 @@ done
 ac_cv_sizeof_char=$ac_lo
 else
   if test "$cross_compiling" = yes; then
-  { { echo "$as_me:9623: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:12958: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9628 "configure"
+#line 12963 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9641,15 +12976,15 @@ fclose (f);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:9644: \"$ac_link\"") >&5
+if { (eval echo "$as_me:12979: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:9647: \$? = $ac_status" >&5
+  echo "$as_me:12982: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:9649: \"$ac_try\"") >&5
+  { (eval echo "$as_me:12984: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9652: \$? = $ac_status" >&5
+  echo "$as_me:12987: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sizeof_char=`cat conftest.val`
 else
@@ -9665,19 +13000,19 @@ else
   ac_cv_sizeof_char=0
 fi
 fi
-echo "$as_me:9668: result: $ac_cv_sizeof_char" >&5
+echo "$as_me:13003: result: $ac_cv_sizeof_char" >&5
 echo "${ECHO_T}$ac_cv_sizeof_char" >&6
 cat >>confdefs.h <<EOF
 #define SIZEOF_CHAR $ac_cv_sizeof_char
 EOF
 
-echo "$as_me:9674: checking for short" >&5
+echo "$as_me:13009: checking for short" >&5
 echo $ECHO_N "checking for short... $ECHO_C" >&6
 if test "${ac_cv_type_short+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9680 "configure"
+#line 13015 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9692,16 +13027,16 @@ if (sizeof (short))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9695: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13030: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9698: \$? = $ac_status" >&5
+  echo "$as_me:13033: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9701: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13036: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9704: \$? = $ac_status" >&5
+  echo "$as_me:13039: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_short=yes
 else
@@ -9711,10 +13046,10 @@ ac_cv_type_short=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9714: result: $ac_cv_type_short" >&5
+echo "$as_me:13049: result: $ac_cv_type_short" >&5
 echo "${ECHO_T}$ac_cv_type_short" >&6
 
-echo "$as_me:9717: checking size of short" >&5
+echo "$as_me:13052: checking size of short" >&5
 echo $ECHO_N "checking size of short... $ECHO_C" >&6
 if test "${ac_cv_sizeof_short+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9723,7 +13058,7 @@ else
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line 9726 "configure"
+#line 13061 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9735,21 +13070,21 @@ int _array_ [1 - 2 * !((sizeof (short)) >= 0)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9738: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13073: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9741: \$? = $ac_status" >&5
+  echo "$as_me:13076: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9744: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13079: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9747: \$? = $ac_status" >&5
+  echo "$as_me:13082: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 9752 "configure"
+#line 13087 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9761,16 +13096,16 @@ int _array_ [1 - 2 * !((sizeof (short)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9764: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13099: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9767: \$? = $ac_status" >&5
+  echo "$as_me:13102: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9770: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13105: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9773: \$? = $ac_status" >&5
+  echo "$as_me:13108: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid; break
 else
@@ -9786,7 +13121,7 @@ cat conftest.$ac_ext >&5
 ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 9789 "configure"
+#line 13124 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9798,16 +13133,16 @@ int _array_ [1 - 2 * !((sizeof (short)) >= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9801: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13136: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9804: \$? = $ac_status" >&5
+  echo "$as_me:13139: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9807: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13142: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9810: \$? = $ac_status" >&5
+  echo "$as_me:13145: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=$ac_mid; break
 else
@@ -9823,7 +13158,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line 9826 "configure"
+#line 13161 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9835,16 +13170,16 @@ int _array_ [1 - 2 * !((sizeof (short)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9838: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13173: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9841: \$? = $ac_status" >&5
+  echo "$as_me:13176: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9844: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13179: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9847: \$? = $ac_status" >&5
+  echo "$as_me:13182: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid
 else
@@ -9857,12 +13192,12 @@ done
 ac_cv_sizeof_short=$ac_lo
 else
   if test "$cross_compiling" = yes; then
-  { { echo "$as_me:9860: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:13195: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9865 "configure"
+#line 13200 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9878,15 +13213,15 @@ fclose (f);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:9881: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13216: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:9884: \$? = $ac_status" >&5
+  echo "$as_me:13219: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:9886: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13221: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9889: \$? = $ac_status" >&5
+  echo "$as_me:13224: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sizeof_short=`cat conftest.val`
 else
@@ -9902,19 +13237,19 @@ else
   ac_cv_sizeof_short=0
 fi
 fi
-echo "$as_me:9905: result: $ac_cv_sizeof_short" >&5
+echo "$as_me:13240: result: $ac_cv_sizeof_short" >&5
 echo "${ECHO_T}$ac_cv_sizeof_short" >&6
 cat >>confdefs.h <<EOF
 #define SIZEOF_SHORT $ac_cv_sizeof_short
 EOF
 
-echo "$as_me:9911: checking for int" >&5
+echo "$as_me:13246: checking for int" >&5
 echo $ECHO_N "checking for int... $ECHO_C" >&6
 if test "${ac_cv_type_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 9917 "configure"
+#line 13252 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9929,16 +13264,16 @@ if (sizeof (int))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9932: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13267: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9935: \$? = $ac_status" >&5
+  echo "$as_me:13270: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9938: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13273: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9941: \$? = $ac_status" >&5
+  echo "$as_me:13276: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_int=yes
 else
@@ -9948,10 +13283,10 @@ ac_cv_type_int=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:9951: result: $ac_cv_type_int" >&5
+echo "$as_me:13286: result: $ac_cv_type_int" >&5
 echo "${ECHO_T}$ac_cv_type_int" >&6
 
-echo "$as_me:9954: checking size of int" >&5
+echo "$as_me:13289: checking size of int" >&5
 echo $ECHO_N "checking size of int... $ECHO_C" >&6
 if test "${ac_cv_sizeof_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -9960,7 +13295,7 @@ else
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line 9963 "configure"
+#line 13298 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9972,21 +13307,21 @@ int _array_ [1 - 2 * !((sizeof (int)) >= 0)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:9975: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13310: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:9978: \$? = $ac_status" >&5
+  echo "$as_me:13313: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:9981: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13316: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:9984: \$? = $ac_status" >&5
+  echo "$as_me:13319: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 9989 "configure"
+#line 13324 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -9998,16 +13333,16 @@ int _array_ [1 - 2 * !((sizeof (int)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10001: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13336: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10004: \$? = $ac_status" >&5
+  echo "$as_me:13339: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10007: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13342: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10010: \$? = $ac_status" >&5
+  echo "$as_me:13345: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid; break
 else
@@ -10023,7 +13358,7 @@ cat conftest.$ac_ext >&5
 ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10026 "configure"
+#line 13361 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10035,16 +13370,16 @@ int _array_ [1 - 2 * !((sizeof (int)) >= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10038: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13373: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10041: \$? = $ac_status" >&5
+  echo "$as_me:13376: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10044: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13379: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10047: \$? = $ac_status" >&5
+  echo "$as_me:13382: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=$ac_mid; break
 else
@@ -10060,7 +13395,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line 10063 "configure"
+#line 13398 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10072,16 +13407,16 @@ int _array_ [1 - 2 * !((sizeof (int)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10075: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13410: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10078: \$? = $ac_status" >&5
+  echo "$as_me:13413: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10081: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13416: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10084: \$? = $ac_status" >&5
+  echo "$as_me:13419: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid
 else
@@ -10094,12 +13429,12 @@ done
 ac_cv_sizeof_int=$ac_lo
 else
   if test "$cross_compiling" = yes; then
-  { { echo "$as_me:10097: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:13432: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 10102 "configure"
+#line 13437 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10115,15 +13450,15 @@ fclose (f);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:10118: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13453: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:10121: \$? = $ac_status" >&5
+  echo "$as_me:13456: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:10123: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13458: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10126: \$? = $ac_status" >&5
+  echo "$as_me:13461: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sizeof_int=`cat conftest.val`
 else
@@ -10139,19 +13474,19 @@ else
   ac_cv_sizeof_int=0
 fi
 fi
-echo "$as_me:10142: result: $ac_cv_sizeof_int" >&5
+echo "$as_me:13477: result: $ac_cv_sizeof_int" >&5
 echo "${ECHO_T}$ac_cv_sizeof_int" >&6
 cat >>confdefs.h <<EOF
 #define SIZEOF_INT $ac_cv_sizeof_int
 EOF
 
-echo "$as_me:10148: checking for long" >&5
+echo "$as_me:13483: checking for long" >&5
 echo $ECHO_N "checking for long... $ECHO_C" >&6
 if test "${ac_cv_type_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 10154 "configure"
+#line 13489 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10166,16 +13501,16 @@ if (sizeof (long))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10169: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13504: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10172: \$? = $ac_status" >&5
+  echo "$as_me:13507: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10175: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13510: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10178: \$? = $ac_status" >&5
+  echo "$as_me:13513: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_long=yes
 else
@@ -10185,10 +13520,10 @@ ac_cv_type_long=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:10188: result: $ac_cv_type_long" >&5
+echo "$as_me:13523: result: $ac_cv_type_long" >&5
 echo "${ECHO_T}$ac_cv_type_long" >&6
 
-echo "$as_me:10191: checking size of long" >&5
+echo "$as_me:13526: checking size of long" >&5
 echo $ECHO_N "checking size of long... $ECHO_C" >&6
 if test "${ac_cv_sizeof_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10197,7 +13532,7 @@ else
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line 10200 "configure"
+#line 13535 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10209,21 +13544,21 @@ int _array_ [1 - 2 * !((sizeof (long)) >= 0)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10212: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13547: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10215: \$? = $ac_status" >&5
+  echo "$as_me:13550: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10218: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13553: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10221: \$? = $ac_status" >&5
+  echo "$as_me:13556: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10226 "configure"
+#line 13561 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10235,16 +13570,16 @@ int _array_ [1 - 2 * !((sizeof (long)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10238: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13573: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10241: \$? = $ac_status" >&5
+  echo "$as_me:13576: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10244: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13579: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10247: \$? = $ac_status" >&5
+  echo "$as_me:13582: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid; break
 else
@@ -10260,7 +13595,7 @@ cat conftest.$ac_ext >&5
 ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10263 "configure"
+#line 13598 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10272,16 +13607,16 @@ int _array_ [1 - 2 * !((sizeof (long)) >= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10275: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13610: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10278: \$? = $ac_status" >&5
+  echo "$as_me:13613: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10281: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13616: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10284: \$? = $ac_status" >&5
+  echo "$as_me:13619: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=$ac_mid; break
 else
@@ -10297,7 +13632,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line 10300 "configure"
+#line 13635 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10309,16 +13644,16 @@ int _array_ [1 - 2 * !((sizeof (long)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10312: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13647: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10315: \$? = $ac_status" >&5
+  echo "$as_me:13650: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10318: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13653: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10321: \$? = $ac_status" >&5
+  echo "$as_me:13656: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid
 else
@@ -10331,12 +13666,12 @@ done
 ac_cv_sizeof_long=$ac_lo
 else
   if test "$cross_compiling" = yes; then
-  { { echo "$as_me:10334: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:13669: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 10339 "configure"
+#line 13674 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10352,15 +13687,15 @@ fclose (f);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:10355: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13690: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:10358: \$? = $ac_status" >&5
+  echo "$as_me:13693: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:10360: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13695: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10363: \$? = $ac_status" >&5
+  echo "$as_me:13698: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sizeof_long=`cat conftest.val`
 else
@@ -10376,19 +13711,19 @@ else
   ac_cv_sizeof_long=0
 fi
 fi
-echo "$as_me:10379: result: $ac_cv_sizeof_long" >&5
+echo "$as_me:13714: result: $ac_cv_sizeof_long" >&5
 echo "${ECHO_T}$ac_cv_sizeof_long" >&6
 cat >>confdefs.h <<EOF
 #define SIZEOF_LONG $ac_cv_sizeof_long
 EOF
 
-echo "$as_me:10385: checking for char *" >&5
+echo "$as_me:13720: checking for char *" >&5
 echo $ECHO_N "checking for char *... $ECHO_C" >&6
 if test "${ac_cv_type_char_p+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 10391 "configure"
+#line 13726 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10403,16 +13738,16 @@ if (sizeof (char *))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10406: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13741: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10409: \$? = $ac_status" >&5
+  echo "$as_me:13744: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10412: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13747: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10415: \$? = $ac_status" >&5
+  echo "$as_me:13750: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_char_p=yes
 else
@@ -10422,10 +13757,10 @@ ac_cv_type_char_p=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:10425: result: $ac_cv_type_char_p" >&5
+echo "$as_me:13760: result: $ac_cv_type_char_p" >&5
 echo "${ECHO_T}$ac_cv_type_char_p" >&6
 
-echo "$as_me:10428: checking size of char *" >&5
+echo "$as_me:13763: checking size of char *" >&5
 echo $ECHO_N "checking size of char *... $ECHO_C" >&6
 if test "${ac_cv_sizeof_char_p+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10434,7 +13769,7 @@ else
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line 10437 "configure"
+#line 13772 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10446,21 +13781,21 @@ int _array_ [1 - 2 * !((sizeof (char *)) >= 0)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10449: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13784: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10452: \$? = $ac_status" >&5
+  echo "$as_me:13787: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10455: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13790: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10458: \$? = $ac_status" >&5
+  echo "$as_me:13793: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10463 "configure"
+#line 13798 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10472,16 +13807,16 @@ int _array_ [1 - 2 * !((sizeof (char *)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10475: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13810: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10478: \$? = $ac_status" >&5
+  echo "$as_me:13813: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10481: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13816: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10484: \$? = $ac_status" >&5
+  echo "$as_me:13819: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid; break
 else
@@ -10497,7 +13832,7 @@ cat conftest.$ac_ext >&5
 ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10500 "configure"
+#line 13835 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10509,16 +13844,16 @@ int _array_ [1 - 2 * !((sizeof (char *)) >= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10512: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13847: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10515: \$? = $ac_status" >&5
+  echo "$as_me:13850: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10518: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13853: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10521: \$? = $ac_status" >&5
+  echo "$as_me:13856: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=$ac_mid; break
 else
@@ -10534,7 +13869,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line 10537 "configure"
+#line 13872 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10546,16 +13881,16 @@ int _array_ [1 - 2 * !((sizeof (char *)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10549: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13884: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10552: \$? = $ac_status" >&5
+  echo "$as_me:13887: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10555: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13890: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10558: \$? = $ac_status" >&5
+  echo "$as_me:13893: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid
 else
@@ -10568,12 +13903,12 @@ done
 ac_cv_sizeof_char_p=$ac_lo
 else
   if test "$cross_compiling" = yes; then
-  { { echo "$as_me:10571: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:13906: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 10576 "configure"
+#line 13911 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10589,15 +13924,15 @@ fclose (f);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:10592: \"$ac_link\"") >&5
+if { (eval echo "$as_me:13927: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:10595: \$? = $ac_status" >&5
+  echo "$as_me:13930: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:10597: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13932: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10600: \$? = $ac_status" >&5
+  echo "$as_me:13935: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sizeof_char_p=`cat conftest.val`
 else
@@ -10613,19 +13948,19 @@ else
   ac_cv_sizeof_char_p=0
 fi
 fi
-echo "$as_me:10616: result: $ac_cv_sizeof_char_p" >&5
+echo "$as_me:13951: result: $ac_cv_sizeof_char_p" >&5
 echo "${ECHO_T}$ac_cv_sizeof_char_p" >&6
 cat >>confdefs.h <<EOF
 #define SIZEOF_CHAR_P $ac_cv_sizeof_char_p
 EOF
 
-echo "$as_me:10622: checking for double" >&5
+echo "$as_me:13957: checking for double" >&5
 echo $ECHO_N "checking for double... $ECHO_C" >&6
 if test "${ac_cv_type_double+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 10628 "configure"
+#line 13963 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10640,16 +13975,16 @@ if (sizeof (double))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10643: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:13978: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10646: \$? = $ac_status" >&5
+  echo "$as_me:13981: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10649: \"$ac_try\"") >&5
+  { (eval echo "$as_me:13984: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10652: \$? = $ac_status" >&5
+  echo "$as_me:13987: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_double=yes
 else
@@ -10659,10 +13994,10 @@ ac_cv_type_double=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:10662: result: $ac_cv_type_double" >&5
+echo "$as_me:13997: result: $ac_cv_type_double" >&5
 echo "${ECHO_T}$ac_cv_type_double" >&6
 
-echo "$as_me:10665: checking size of double" >&5
+echo "$as_me:14000: checking size of double" >&5
 echo $ECHO_N "checking size of double... $ECHO_C" >&6
 if test "${ac_cv_sizeof_double+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10671,7 +14006,7 @@ else
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line 10674 "configure"
+#line 14009 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10683,21 +14018,21 @@ int _array_ [1 - 2 * !((sizeof (double)) >= 0)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10686: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14021: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10689: \$? = $ac_status" >&5
+  echo "$as_me:14024: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10692: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14027: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10695: \$? = $ac_status" >&5
+  echo "$as_me:14030: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10700 "configure"
+#line 14035 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10709,16 +14044,16 @@ int _array_ [1 - 2 * !((sizeof (double)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10712: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14047: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10715: \$? = $ac_status" >&5
+  echo "$as_me:14050: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10718: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14053: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10721: \$? = $ac_status" >&5
+  echo "$as_me:14056: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid; break
 else
@@ -10734,7 +14069,7 @@ cat conftest.$ac_ext >&5
 ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10737 "configure"
+#line 14072 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10746,16 +14081,16 @@ int _array_ [1 - 2 * !((sizeof (double)) >= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10749: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14084: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10752: \$? = $ac_status" >&5
+  echo "$as_me:14087: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10755: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14090: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10758: \$? = $ac_status" >&5
+  echo "$as_me:14093: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=$ac_mid; break
 else
@@ -10771,7 +14106,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line 10774 "configure"
+#line 14109 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10783,16 +14118,16 @@ int _array_ [1 - 2 * !((sizeof (double)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10786: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14121: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10789: \$? = $ac_status" >&5
+  echo "$as_me:14124: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10792: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14127: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10795: \$? = $ac_status" >&5
+  echo "$as_me:14130: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid
 else
@@ -10805,12 +14140,12 @@ done
 ac_cv_sizeof_double=$ac_lo
 else
   if test "$cross_compiling" = yes; then
-  { { echo "$as_me:10808: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:14143: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 10813 "configure"
+#line 14148 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10826,15 +14161,15 @@ fclose (f);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:10829: \"$ac_link\"") >&5
+if { (eval echo "$as_me:14164: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:10832: \$? = $ac_status" >&5
+  echo "$as_me:14167: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:10834: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14169: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10837: \$? = $ac_status" >&5
+  echo "$as_me:14172: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sizeof_double=`cat conftest.val`
 else
@@ -10850,19 +14185,19 @@ else
   ac_cv_sizeof_double=0
 fi
 fi
-echo "$as_me:10853: result: $ac_cv_sizeof_double" >&5
+echo "$as_me:14188: result: $ac_cv_sizeof_double" >&5
 echo "${ECHO_T}$ac_cv_sizeof_double" >&6
 cat >>confdefs.h <<EOF
 #define SIZEOF_DOUBLE $ac_cv_sizeof_double
 EOF
 
-echo "$as_me:10859: checking for long long" >&5
+echo "$as_me:14194: checking for long long" >&5
 echo $ECHO_N "checking for long long... $ECHO_C" >&6
 if test "${ac_cv_type_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 10865 "configure"
+#line 14200 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10877,16 +14212,16 @@ if (sizeof (long long))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10880: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14215: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10883: \$? = $ac_status" >&5
+  echo "$as_me:14218: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10886: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14221: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10889: \$? = $ac_status" >&5
+  echo "$as_me:14224: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_long_long=yes
 else
@@ -10896,10 +14231,10 @@ ac_cv_type_long_long=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:10899: result: $ac_cv_type_long_long" >&5
+echo "$as_me:14234: result: $ac_cv_type_long_long" >&5
 echo "${ECHO_T}$ac_cv_type_long_long" >&6
 
-echo "$as_me:10902: checking size of long long" >&5
+echo "$as_me:14237: checking size of long long" >&5
 echo $ECHO_N "checking size of long long... $ECHO_C" >&6
 if test "${ac_cv_sizeof_long_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -10908,7 +14243,7 @@ else
   if test "$cross_compiling" = yes; then
   # Depending upon the size, compute the lo and hi bounds.
 cat >conftest.$ac_ext <<_ACEOF
-#line 10911 "configure"
+#line 14246 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10920,21 +14255,21 @@ int _array_ [1 - 2 * !((sizeof (long long)) >= 0)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10923: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14258: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10926: \$? = $ac_status" >&5
+  echo "$as_me:14261: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10929: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14264: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10932: \$? = $ac_status" >&5
+  echo "$as_me:14267: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=0 ac_mid=0
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10937 "configure"
+#line 14272 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10946,16 +14281,16 @@ int _array_ [1 - 2 * !((sizeof (long long)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10949: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14284: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10952: \$? = $ac_status" >&5
+  echo "$as_me:14287: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10955: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14290: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10958: \$? = $ac_status" >&5
+  echo "$as_me:14293: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid; break
 else
@@ -10971,7 +14306,7 @@ cat conftest.$ac_ext >&5
 ac_hi=-1 ac_mid=-1
   while :; do
     cat >conftest.$ac_ext <<_ACEOF
-#line 10974 "configure"
+#line 14309 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -10983,16 +14318,16 @@ int _array_ [1 - 2 * !((sizeof (long long)) >= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:10986: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14321: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:10989: \$? = $ac_status" >&5
+  echo "$as_me:14324: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:10992: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14327: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:10995: \$? = $ac_status" >&5
+  echo "$as_me:14330: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_lo=$ac_mid; break
 else
@@ -11008,7 +14343,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 while test "x$ac_lo" != "x$ac_hi"; do
   ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
   cat >conftest.$ac_ext <<_ACEOF
-#line 11011 "configure"
+#line 14346 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11020,16 +14355,16 @@ int _array_ [1 - 2 * !((sizeof (long long)) <= $ac_mid)]
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11023: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14358: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11026: \$? = $ac_status" >&5
+  echo "$as_me:14361: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11029: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14364: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11032: \$? = $ac_status" >&5
+  echo "$as_me:14367: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_hi=$ac_mid
 else
@@ -11042,12 +14377,12 @@ done
 ac_cv_sizeof_long_long=$ac_lo
 else
   if test "$cross_compiling" = yes; then
-  { { echo "$as_me:11045: error: cannot run test program while cross compiling" >&5
+  { { echo "$as_me:14380: error: cannot run test program while cross compiling" >&5
 echo "$as_me: error: cannot run test program while cross compiling" >&2;}
    { (exit 1); exit 1; }; }
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11050 "configure"
+#line 14385 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11063,15 +14398,15 @@ fclose (f);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:11066: \"$ac_link\"") >&5
+if { (eval echo "$as_me:14401: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:11069: \$? = $ac_status" >&5
+  echo "$as_me:14404: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:11071: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14406: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11074: \$? = $ac_status" >&5
+  echo "$as_me:14409: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sizeof_long_long=`cat conftest.val`
 else
@@ -11087,19 +14422,19 @@ else
   ac_cv_sizeof_long_long=0
 fi
 fi
-echo "$as_me:11090: result: $ac_cv_sizeof_long_long" >&5
+echo "$as_me:14425: result: $ac_cv_sizeof_long_long" >&5
 echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6
 cat >>confdefs.h <<EOF
 #define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
 EOF
 
-echo "$as_me:11096: checking for u_int" >&5
+echo "$as_me:14431: checking for u_int" >&5
 echo $ECHO_N "checking for u_int... $ECHO_C" >&6
 if test "${ac_cv_type_u_int+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11102 "configure"
+#line 14437 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11114,16 +14449,16 @@ if (sizeof (u_int))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11117: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14452: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11120: \$? = $ac_status" >&5
+  echo "$as_me:14455: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11123: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14458: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11126: \$? = $ac_status" >&5
+  echo "$as_me:14461: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_u_int=yes
 else
@@ -11133,7 +14468,7 @@ ac_cv_type_u_int=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11136: result: $ac_cv_type_u_int" >&5
+echo "$as_me:14471: result: $ac_cv_type_u_int" >&5
 echo "${ECHO_T}$ac_cv_type_u_int" >&6
 if test $ac_cv_type_u_int = yes; then
   :
@@ -11145,13 +14480,13 @@ EOF
 
 fi
 
-echo "$as_me:11148: checking for u_long" >&5
+echo "$as_me:14483: checking for u_long" >&5
 echo $ECHO_N "checking for u_long... $ECHO_C" >&6
 if test "${ac_cv_type_u_long+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11154 "configure"
+#line 14489 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11166,16 +14501,16 @@ if (sizeof (u_long))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11169: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14504: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11172: \$? = $ac_status" >&5
+  echo "$as_me:14507: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11175: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14510: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11178: \$? = $ac_status" >&5
+  echo "$as_me:14513: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_u_long=yes
 else
@@ -11185,7 +14520,7 @@ ac_cv_type_u_long=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11188: result: $ac_cv_type_u_long" >&5
+echo "$as_me:14523: result: $ac_cv_type_u_long" >&5
 echo "${ECHO_T}$ac_cv_type_u_long" >&6
 if test $ac_cv_type_u_long = yes; then
   :
@@ -11198,13 +14533,13 @@ EOF
 fi
 
 if test "$ac_cv_sizeof_short" = 2; then
-  echo "$as_me:11201: checking for bits16_t" >&5
+  echo "$as_me:14536: checking for bits16_t" >&5
 echo $ECHO_N "checking for bits16_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits16_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11207 "configure"
+#line 14542 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11219,16 +14554,16 @@ if (sizeof (bits16_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11222: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14557: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11225: \$? = $ac_status" >&5
+  echo "$as_me:14560: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11228: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14563: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11231: \$? = $ac_status" >&5
+  echo "$as_me:14566: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits16_t=yes
 else
@@ -11238,7 +14573,7 @@ ac_cv_type_bits16_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11241: result: $ac_cv_type_bits16_t" >&5
+echo "$as_me:14576: result: $ac_cv_type_bits16_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits16_t" >&6
 if test $ac_cv_type_bits16_t = yes; then
   :
@@ -11251,13 +14586,13 @@ EOF
 fi
 
 elif test "$ac_cv_sizeof_char" = 2; then
-  echo "$as_me:11254: checking for bits16_t" >&5
+  echo "$as_me:14589: checking for bits16_t" >&5
 echo $ECHO_N "checking for bits16_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits16_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11260 "configure"
+#line 14595 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11272,16 +14607,16 @@ if (sizeof (bits16_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11275: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14610: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11278: \$? = $ac_status" >&5
+  echo "$as_me:14613: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11281: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14616: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11284: \$? = $ac_status" >&5
+  echo "$as_me:14619: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits16_t=yes
 else
@@ -11291,7 +14626,7 @@ ac_cv_type_bits16_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11294: result: $ac_cv_type_bits16_t" >&5
+echo "$as_me:14629: result: $ac_cv_type_bits16_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits16_t" >&6
 if test $ac_cv_type_bits16_t = yes; then
   :
@@ -11304,13 +14639,13 @@ EOF
 fi
 
 else
-  echo "$as_me:11307: checking for bits16_t" >&5
+  echo "$as_me:14642: checking for bits16_t" >&5
 echo $ECHO_N "checking for bits16_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits16_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11313 "configure"
+#line 14648 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11325,16 +14660,16 @@ if (sizeof (bits16_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11328: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14663: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11331: \$? = $ac_status" >&5
+  echo "$as_me:14666: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11334: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14669: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11337: \$? = $ac_status" >&5
+  echo "$as_me:14672: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits16_t=yes
 else
@@ -11344,7 +14679,7 @@ ac_cv_type_bits16_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11347: result: $ac_cv_type_bits16_t" >&5
+echo "$as_me:14682: result: $ac_cv_type_bits16_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits16_t" >&6
 if test $ac_cv_type_bits16_t = yes; then
   :
 fi
 
 if test "$ac_cv_sizeof_short" = 2; then
-  echo "$as_me:11362: checking for u_bits16_t" >&5
+  echo "$as_me:14697: checking for u_bits16_t" >&5
 echo $ECHO_N "checking for u_bits16_t... $ECHO_C" >&6
 if test "${ac_cv_type_u_bits16_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11368 "configure"
+#line 14703 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11380,16 +14715,16 @@ if (sizeof (u_bits16_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11383: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14718: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11386: \$? = $ac_status" >&5
+  echo "$as_me:14721: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11389: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14724: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11392: \$? = $ac_status" >&5
+  echo "$as_me:14727: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_u_bits16_t=yes
 else
@@ -11399,7 +14734,7 @@ ac_cv_type_u_bits16_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11402: result: $ac_cv_type_u_bits16_t" >&5
+echo "$as_me:14737: result: $ac_cv_type_u_bits16_t" >&5
 echo "${ECHO_T}$ac_cv_type_u_bits16_t" >&6
 if test $ac_cv_type_u_bits16_t = yes; then
   :
@@ -11412,13 +14747,13 @@ EOF
 fi
 
 elif test "$ac_cv_sizeof_char" = 2; then
-  echo "$as_me:11415: checking for u_bits16_t" >&5
+  echo "$as_me:14750: checking for u_bits16_t" >&5
 echo $ECHO_N "checking for u_bits16_t... $ECHO_C" >&6
 if test "${ac_cv_type_u_bits16_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11421 "configure"
+#line 14756 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11433,16 +14768,16 @@ if (sizeof (u_bits16_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11436: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14771: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11439: \$? = $ac_status" >&5
+  echo "$as_me:14774: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11442: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14777: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11445: \$? = $ac_status" >&5
+  echo "$as_me:14780: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_u_bits16_t=yes
 else
@@ -11452,7 +14787,7 @@ ac_cv_type_u_bits16_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11455: result: $ac_cv_type_u_bits16_t" >&5
+echo "$as_me:14790: result: $ac_cv_type_u_bits16_t" >&5
 echo "${ECHO_T}$ac_cv_type_u_bits16_t" >&6
 if test $ac_cv_type_u_bits16_t = yes; then
   :
@@ -11465,13 +14800,13 @@ EOF
 fi
 
 else
-  echo "$as_me:11468: checking for u_bits16_t" >&5
+  echo "$as_me:14803: checking for u_bits16_t" >&5
 echo $ECHO_N "checking for u_bits16_t... $ECHO_C" >&6
 if test "${ac_cv_type_u_bits16_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11474 "configure"
+#line 14809 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11486,16 +14821,16 @@ if (sizeof (u_bits16_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11489: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14824: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11492: \$? = $ac_status" >&5
+  echo "$as_me:14827: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11495: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14830: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11498: \$? = $ac_status" >&5
+  echo "$as_me:14833: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_u_bits16_t=yes
 else
@@ -11505,7 +14840,7 @@ ac_cv_type_u_bits16_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11508: result: $ac_cv_type_u_bits16_t" >&5
+echo "$as_me:14843: result: $ac_cv_type_u_bits16_t" >&5
 echo "${ECHO_T}$ac_cv_type_u_bits16_t" >&6
 if test $ac_cv_type_u_bits16_t = yes; then
   :
 fi
 
 if test "$ac_cv_sizeof_int" = 4; then
-  echo "$as_me:11523: checking for bits32_t" >&5
+  echo "$as_me:14858: checking for bits32_t" >&5
 echo $ECHO_N "checking for bits32_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11529 "configure"
+#line 14864 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11541,16 +14876,16 @@ if (sizeof (bits32_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11544: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14879: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11547: \$? = $ac_status" >&5
+  echo "$as_me:14882: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11550: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14885: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11553: \$? = $ac_status" >&5
+  echo "$as_me:14888: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits32_t=yes
 else
@@ -11560,7 +14895,7 @@ ac_cv_type_bits32_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11563: result: $ac_cv_type_bits32_t" >&5
+echo "$as_me:14898: result: $ac_cv_type_bits32_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits32_t" >&6
 if test $ac_cv_type_bits32_t = yes; then
   :
@@ -11573,13 +14908,13 @@ EOF
 fi
 
 elif test "$ac_cv_sizeof_long" = 4; then
-  echo "$as_me:11576: checking for bits32_t" >&5
+  echo "$as_me:14911: checking for bits32_t" >&5
 echo $ECHO_N "checking for bits32_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11582 "configure"
+#line 14917 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11594,16 +14929,16 @@ if (sizeof (bits32_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11597: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14932: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11600: \$? = $ac_status" >&5
+  echo "$as_me:14935: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11603: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14938: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11606: \$? = $ac_status" >&5
+  echo "$as_me:14941: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits32_t=yes
 else
@@ -11613,7 +14948,7 @@ ac_cv_type_bits32_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11616: result: $ac_cv_type_bits32_t" >&5
+echo "$as_me:14951: result: $ac_cv_type_bits32_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits32_t" >&6
 if test $ac_cv_type_bits32_t = yes; then
   :
@@ -11626,13 +14961,13 @@ EOF
 fi
 
 else
-  echo "$as_me:11629: checking for bits32_t" >&5
+  echo "$as_me:14964: checking for bits32_t" >&5
 echo $ECHO_N "checking for bits32_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11635 "configure"
+#line 14970 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11647,16 +14982,16 @@ if (sizeof (bits32_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11650: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:14985: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11653: \$? = $ac_status" >&5
+  echo "$as_me:14988: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11656: \"$ac_try\"") >&5
+  { (eval echo "$as_me:14991: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11659: \$? = $ac_status" >&5
+  echo "$as_me:14994: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits32_t=yes
 else
@@ -11666,7 +15001,7 @@ ac_cv_type_bits32_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11669: result: $ac_cv_type_bits32_t" >&5
+echo "$as_me:15004: result: $ac_cv_type_bits32_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits32_t" >&6
 if test $ac_cv_type_bits32_t = yes; then
   :
 fi
 
 if test "$ac_cv_sizeof_int" = 4; then
-  echo "$as_me:11684: checking for u_bits32_t" >&5
+  echo "$as_me:15019: checking for u_bits32_t" >&5
 echo $ECHO_N "checking for u_bits32_t... $ECHO_C" >&6
 if test "${ac_cv_type_u_bits32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11690 "configure"
+#line 15025 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11702,16 +15037,16 @@ if (sizeof (u_bits32_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11705: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15040: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11708: \$? = $ac_status" >&5
+  echo "$as_me:15043: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11711: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15046: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11714: \$? = $ac_status" >&5
+  echo "$as_me:15049: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_u_bits32_t=yes
 else
@@ -11721,7 +15056,7 @@ ac_cv_type_u_bits32_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11724: result: $ac_cv_type_u_bits32_t" >&5
+echo "$as_me:15059: result: $ac_cv_type_u_bits32_t" >&5
 echo "${ECHO_T}$ac_cv_type_u_bits32_t" >&6
 if test $ac_cv_type_u_bits32_t = yes; then
   :
@@ -11734,13 +15069,13 @@ EOF
 fi
 
 elif test "$ac_cv_sizeof_long" = 4; then
-  echo "$as_me:11737: checking for u_bits32_t" >&5
+  echo "$as_me:15072: checking for u_bits32_t" >&5
 echo $ECHO_N "checking for u_bits32_t... $ECHO_C" >&6
 if test "${ac_cv_type_u_bits32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11743 "configure"
+#line 15078 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11755,16 +15090,16 @@ if (sizeof (u_bits32_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11758: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15093: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11761: \$? = $ac_status" >&5
+  echo "$as_me:15096: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11764: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15099: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11767: \$? = $ac_status" >&5
+  echo "$as_me:15102: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_u_bits32_t=yes
 else
@@ -11774,7 +15109,7 @@ ac_cv_type_u_bits32_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11777: result: $ac_cv_type_u_bits32_t" >&5
+echo "$as_me:15112: result: $ac_cv_type_u_bits32_t" >&5
 echo "${ECHO_T}$ac_cv_type_u_bits32_t" >&6
 if test $ac_cv_type_u_bits32_t = yes; then
   :
@@ -11787,13 +15122,13 @@ EOF
 fi
 
 else
-  echo "$as_me:11790: checking for u_bits32_t" >&5
+  echo "$as_me:15125: checking for u_bits32_t" >&5
 echo $ECHO_N "checking for u_bits32_t... $ECHO_C" >&6
 if test "${ac_cv_type_u_bits32_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11796 "configure"
+#line 15131 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11808,16 +15143,16 @@ if (sizeof (u_bits32_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11811: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15146: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11814: \$? = $ac_status" >&5
+  echo "$as_me:15149: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11817: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15152: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11820: \$? = $ac_status" >&5
+  echo "$as_me:15155: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_u_bits32_t=yes
 else
@@ -11827,7 +15162,7 @@ ac_cv_type_u_bits32_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11830: result: $ac_cv_type_u_bits32_t" >&5
+echo "$as_me:15165: result: $ac_cv_type_u_bits32_t" >&5
 echo "${ECHO_T}$ac_cv_type_u_bits32_t" >&6
 if test $ac_cv_type_u_bits32_t = yes; then
   :
 fi
 
 if test "$ac_cv_sizeof_char_p" = 8; then
-  echo "$as_me:11845: checking for bits64_t" >&5
+  echo "$as_me:15180: checking for bits64_t" >&5
 echo $ECHO_N "checking for bits64_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11851 "configure"
+#line 15186 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11863,16 +15198,16 @@ if (sizeof (bits64_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11866: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15201: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11869: \$? = $ac_status" >&5
+  echo "$as_me:15204: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11872: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15207: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11875: \$? = $ac_status" >&5
+  echo "$as_me:15210: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits64_t=yes
 else
@@ -11882,7 +15217,7 @@ ac_cv_type_bits64_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11885: result: $ac_cv_type_bits64_t" >&5
+echo "$as_me:15220: result: $ac_cv_type_bits64_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits64_t" >&6
 if test $ac_cv_type_bits64_t = yes; then
   :
@@ -11895,13 +15230,13 @@ EOF
 fi
 
 elif test "$ac_cv_sizeof_double" = 8; then
-  echo "$as_me:11898: checking for bits64_t" >&5
+  echo "$as_me:15233: checking for bits64_t" >&5
 echo $ECHO_N "checking for bits64_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11904 "configure"
+#line 15239 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11916,16 +15251,16 @@ if (sizeof (bits64_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11919: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15254: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11922: \$? = $ac_status" >&5
+  echo "$as_me:15257: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11925: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15260: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11928: \$? = $ac_status" >&5
+  echo "$as_me:15263: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits64_t=yes
 else
@@ -11935,7 +15270,7 @@ ac_cv_type_bits64_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11938: result: $ac_cv_type_bits64_t" >&5
+echo "$as_me:15273: result: $ac_cv_type_bits64_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits64_t" >&6
 if test $ac_cv_type_bits64_t = yes; then
   :
@@ -11948,13 +15283,13 @@ EOF
 fi
 
 elif test -n "$ac_cv_type_long_long" && test "$ac_cv_sizeof_long_long" = 8; then
-  echo "$as_me:11951: checking for bits64_t" >&5
+  echo "$as_me:15286: checking for bits64_t" >&5
 echo $ECHO_N "checking for bits64_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 11957 "configure"
+#line 15292 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -11969,16 +15304,16 @@ if (sizeof (bits64_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:11972: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15307: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:11975: \$? = $ac_status" >&5
+  echo "$as_me:15310: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:11978: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15313: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:11981: \$? = $ac_status" >&5
+  echo "$as_me:15316: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits64_t=yes
 else
@@ -11988,7 +15323,7 @@ ac_cv_type_bits64_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:11991: result: $ac_cv_type_bits64_t" >&5
+echo "$as_me:15326: result: $ac_cv_type_bits64_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits64_t" >&6
 if test $ac_cv_type_bits64_t = yes; then
   :
@@ -12001,13 +15336,13 @@ EOF
 fi
 
 elif test "$ac_cv_sizeof_long" = 8; then
-  echo "$as_me:12004: checking for bits64_t" >&5
+  echo "$as_me:15339: checking for bits64_t" >&5
 echo $ECHO_N "checking for bits64_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12010 "configure"
+#line 15345 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -12022,16 +15357,16 @@ if (sizeof (bits64_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12025: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15360: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:12028: \$? = $ac_status" >&5
+  echo "$as_me:15363: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:12031: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15366: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12034: \$? = $ac_status" >&5
+  echo "$as_me:15369: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits64_t=yes
 else
@@ -12041,7 +15376,7 @@ ac_cv_type_bits64_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:12044: result: $ac_cv_type_bits64_t" >&5
+echo "$as_me:15379: result: $ac_cv_type_bits64_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits64_t" >&6
 if test $ac_cv_type_bits64_t = yes; then
   :
@@ -12054,13 +15389,13 @@ EOF
 fi
 
 else
-  echo "$as_me:12057: checking for bits64_t" >&5
+  echo "$as_me:15392: checking for bits64_t" >&5
 echo $ECHO_N "checking for bits64_t... $ECHO_C" >&6
 if test "${ac_cv_type_bits64_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12063 "configure"
+#line 15398 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -12075,16 +15410,16 @@ if (sizeof (bits64_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12078: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15413: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:12081: \$? = $ac_status" >&5
+  echo "$as_me:15416: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:12084: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15419: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12087: \$? = $ac_status" >&5
+  echo "$as_me:15422: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_bits64_t=yes
 else
@@ -12094,7 +15429,7 @@ ac_cv_type_bits64_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:12097: result: $ac_cv_type_bits64_t" >&5
+echo "$as_me:15432: result: $ac_cv_type_bits64_t" >&5
 echo "${ECHO_T}$ac_cv_type_bits64_t" >&6
 if test $ac_cv_type_bits64_t = yes; then
   :
 fi
 
 if test "$ac_cv_sizeof_int" = "$ac_cv_sizeof_char_p"; then
-  echo "$as_me:12112: checking for ptrdiff_t" >&5
+  echo "$as_me:15447: checking for ptrdiff_t" >&5
 echo $ECHO_N "checking for ptrdiff_t... $ECHO_C" >&6
 if test "${ac_cv_type_ptrdiff_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12118 "configure"
+#line 15453 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -12130,16 +15465,16 @@ if (sizeof (ptrdiff_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12133: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15468: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:12136: \$? = $ac_status" >&5
+  echo "$as_me:15471: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:12139: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15474: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12142: \$? = $ac_status" >&5
+  echo "$as_me:15477: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_ptrdiff_t=yes
 else
@@ -12149,7 +15484,7 @@ ac_cv_type_ptrdiff_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:12152: result: $ac_cv_type_ptrdiff_t" >&5
+echo "$as_me:15487: result: $ac_cv_type_ptrdiff_t" >&5
 echo "${ECHO_T}$ac_cv_type_ptrdiff_t" >&6
 if test $ac_cv_type_ptrdiff_t = yes; then
   :
@@ -12162,13 +15497,13 @@ EOF
 fi
 
 elif test "$ac_cv_sizeof_long" = "$ac_cv_sizeof_char_p"; then
-  echo "$as_me:12165: checking for ptrdiff_t" >&5
+  echo "$as_me:15500: checking for ptrdiff_t" >&5
 echo $ECHO_N "checking for ptrdiff_t... $ECHO_C" >&6
 if test "${ac_cv_type_ptrdiff_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12171 "configure"
+#line 15506 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -12183,16 +15518,16 @@ if (sizeof (ptrdiff_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12186: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15521: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:12189: \$? = $ac_status" >&5
+  echo "$as_me:15524: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:12192: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15527: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12195: \$? = $ac_status" >&5
+  echo "$as_me:15530: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_ptrdiff_t=yes
 else
@@ -12202,7 +15537,7 @@ ac_cv_type_ptrdiff_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:12205: result: $ac_cv_type_ptrdiff_t" >&5
+echo "$as_me:15540: result: $ac_cv_type_ptrdiff_t" >&5
 echo "${ECHO_T}$ac_cv_type_ptrdiff_t" >&6
 if test $ac_cv_type_ptrdiff_t = yes; then
   :
@@ -12215,13 +15550,13 @@ EOF
 fi
 
 elif test "$ac_cv_type_long_long" = yes && test "$ac_cv_sizeof_long_long" = "$ac_cv_sizeof_char_p"; then
-  echo "$as_me:12218: checking for ptrdiff_t" >&5
+  echo "$as_me:15553: checking for ptrdiff_t" >&5
 echo $ECHO_N "checking for ptrdiff_t... $ECHO_C" >&6
 if test "${ac_cv_type_ptrdiff_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12224 "configure"
+#line 15559 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -12236,16 +15571,16 @@ if (sizeof (ptrdiff_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12239: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15574: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:12242: \$? = $ac_status" >&5
+  echo "$as_me:15577: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:12245: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15580: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12248: \$? = $ac_status" >&5
+  echo "$as_me:15583: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_ptrdiff_t=yes
 else
@@ -12255,7 +15590,7 @@ ac_cv_type_ptrdiff_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:12258: result: $ac_cv_type_ptrdiff_t" >&5
+echo "$as_me:15593: result: $ac_cv_type_ptrdiff_t" >&5
 echo "${ECHO_T}$ac_cv_type_ptrdiff_t" >&6
 if test $ac_cv_type_ptrdiff_t = yes; then
   :
@@ -12268,13 +15603,13 @@ EOF
 fi
 
 else
-  echo "$as_me:12271: checking for ptrdiff_t" >&5
+  echo "$as_me:15606: checking for ptrdiff_t" >&5
 echo $ECHO_N "checking for ptrdiff_t... $ECHO_C" >&6
 if test "${ac_cv_type_ptrdiff_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12277 "configure"
+#line 15612 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -12289,16 +15624,16 @@ if (sizeof (ptrdiff_t))
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12292: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:15627: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:12295: \$? = $ac_status" >&5
+  echo "$as_me:15630: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:12298: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15633: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12301: \$? = $ac_status" >&5
+  echo "$as_me:15636: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_type_ptrdiff_t=yes
 else
@@ -12308,7 +15643,7 @@ ac_cv_type_ptrdiff_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:12311: result: $ac_cv_type_ptrdiff_t" >&5
+echo "$as_me:15646: result: $ac_cv_type_ptrdiff_t" >&5
 echo "${ECHO_T}$ac_cv_type_ptrdiff_t" >&6
 if test $ac_cv_type_ptrdiff_t = yes; then
   :
 
 fi
 
-echo "$as_me:12325: checking whether stat file-mode macros are broken" >&5
+echo "$as_me:15660: checking whether stat file-mode macros are broken" >&5
 echo $ECHO_N "checking whether stat file-mode macros are broken... $ECHO_C" >&6
 if test "${ac_cv_header_stat_broken+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12331 "configure"
+#line 15666 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -12367,7 +15702,7 @@ fi
 rm -f conftest*
 
 fi
-echo "$as_me:12370: result: $ac_cv_header_stat_broken" >&5
+echo "$as_me:15705: result: $ac_cv_header_stat_broken" >&5
 echo "${ECHO_T}$ac_cv_header_stat_broken" >&6
 if test $ac_cv_header_stat_broken = yes; then
 
@@ -12377,7 +15712,7 @@ EOF
 
 fi
 
-echo "$as_me:12380: checking whether #! works in shell scripts" >&5
+echo "$as_me:15715: checking whether #! works in shell scripts" >&5
 echo $ECHO_N "checking whether #! works in shell scripts... $ECHO_C" >&6
 if test "${ac_cv_sys_interpreter+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -12394,7 +15729,7 @@ else
 fi
 rm -f conftest
 fi
-echo "$as_me:12397: result: $ac_cv_sys_interpreter" >&5
+echo "$as_me:15732: result: $ac_cv_sys_interpreter" >&5
 echo "${ECHO_T}$ac_cv_sys_interpreter" >&6
 interpval=$ac_cv_sys_interpreter
 
@@ -12406,13 +15741,13 @@ EOF
 fi
 
 if test "$ac_cv_func_lstat" = "no"; then
-echo "$as_me:12409: checking for lstat" >&5
+echo "$as_me:15744: checking for lstat" >&5
 echo $ECHO_N "checking for lstat... $ECHO_C" >&6
 if test "${bash_cv_func_lstat+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12415 "configure"
+#line 15750 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -12427,16 +15762,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12430: \"$ac_link\"") >&5
+if { (eval echo "$as_me:15765: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12433: \$? = $ac_status" >&5
+  echo "$as_me:15768: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:12436: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15771: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12439: \$? = $ac_status" >&5
+  echo "$as_me:15774: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_func_lstat=yes
 else
@@ -12446,7 +15781,7 @@ bash_cv_func_lstat=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:12449: result: $bash_cv_func_lstat" >&5
+echo "$as_me:15784: result: $bash_cv_func_lstat" >&5
 echo "${ECHO_T}$bash_cv_func_lstat" >&6
 if test $bash_cv_func_lstat = yes; then
   cat >>confdefs.h <<\EOF
 
 fi
 
-echo "$as_me:12460: checking whether the ctype macros accept non-ascii characters" >&5
+echo "$as_me:15795: checking whether the ctype macros accept non-ascii characters" >&5
 echo $ECHO_N "checking whether the ctype macros accept non-ascii characters... $ECHO_C" >&6
 if test "${bash_cv_func_ctype_nonascii+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:12466: WARNING: cannot check ctype macros if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:15801: WARNING: cannot check ctype macros if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check ctype macros if cross compiling -- defaulting to no" >&2;}
     bash_cv_func_ctype_nonascii=no
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12472 "configure"
+#line 15807 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_LOCALE_H
@@ -12504,15 +15839,15 @@ char  *v[];
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:12507: \"$ac_link\"") >&5
+if { (eval echo "$as_me:15842: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12510: \$? = $ac_status" >&5
+  echo "$as_me:15845: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:12512: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15847: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12515: \$? = $ac_status" >&5
+  echo "$as_me:15850: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_func_ctype_nonascii=yes
 else
@@ -12525,7 +15860,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:12528: result: $bash_cv_func_ctype_nonascii" >&5
+echo "$as_me:15863: result: $bash_cv_func_ctype_nonascii" >&5
 echo "${ECHO_T}$bash_cv_func_ctype_nonascii" >&6
 if test $bash_cv_func_ctype_nonascii = yes; then
 cat >>confdefs.h <<\EOF
@@ -12534,18 +15869,18 @@ EOF
 
 fi
 
-echo "$as_me:12537: checking if dup2 fails to clear the close-on-exec flag" >&5
+echo "$as_me:15872: checking if dup2 fails to clear the close-on-exec flag" >&5
 echo $ECHO_N "checking if dup2 fails to clear the close-on-exec flag... $ECHO_C" >&6
 if test "${bash_cv_dup2_broken+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:12543: WARNING: cannot check dup2 if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:15878: WARNING: cannot check dup2 if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check dup2 if cross compiling -- defaulting to no" >&2;}
      bash_cv_dup2_broken=no
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12548 "configure"
+#line 15883 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -12566,15 +15901,15 @@ main()
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:12569: \"$ac_link\"") >&5
+if { (eval echo "$as_me:15904: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12572: \$? = $ac_status" >&5
+  echo "$as_me:15907: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:12574: \"$ac_try\"") >&5
+  { (eval echo "$as_me:15909: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12577: \$? = $ac_status" >&5
+  echo "$as_me:15912: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_dup2_broken=yes
 else
@@ -12588,7 +15923,7 @@ fi
 
 fi
 
-echo "$as_me:12591: result: $bash_cv_dup2_broken" >&5
+echo "$as_me:15926: result: $bash_cv_dup2_broken" >&5
 echo "${ECHO_T}$bash_cv_dup2_broken" >&6
 if test $bash_cv_dup2_broken = yes; then
 cat >>confdefs.h <<\EOF
@@ -12597,18 +15932,18 @@ EOF
 
 fi
 
-echo "$as_me:12600: checking whether pgrps need synchronization" >&5
+echo "$as_me:15935: checking whether pgrps need synchronization" >&5
 echo $ECHO_N "checking whether pgrps need synchronization... $ECHO_C" >&6
 if test "${bash_cv_pgrp_pipe+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:12606: WARNING: cannot check pgrp synchronization if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:15941: WARNING: cannot check pgrp synchronization if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check pgrp synchronization if cross compiling -- defaulting to no" >&2;}
     bash_cv_pgrp_pipe=no
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12611 "configure"
+#line 15946 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_UNISTD_H
@@ -12661,15 +15996,15 @@ main()
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:12664: \"$ac_link\"") >&5
+if { (eval echo "$as_me:15999: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12667: \$? = $ac_status" >&5
+  echo "$as_me:16002: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:12669: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16004: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12672: \$? = $ac_status" >&5
+  echo "$as_me:16007: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_pgrp_pipe=no
 else
@@ -12683,7 +16018,7 @@ fi
 
 fi
 
-echo "$as_me:12686: result: $bash_cv_pgrp_pipe" >&5
+echo "$as_me:16021: result: $bash_cv_pgrp_pipe" >&5
 echo "${ECHO_T}$bash_cv_pgrp_pipe" >&6
 if test $bash_cv_pgrp_pipe = yes; then
 cat >>confdefs.h <<\EOF
@@ -12692,14 +16027,14 @@ EOF
 
 fi
 
-echo "$as_me:12695: checking for type of signal functions" >&5
+echo "$as_me:16030: checking for type of signal functions" >&5
 echo $ECHO_N "checking for type of signal functions... $ECHO_C" >&6
 if test "${bash_cv_signal_vintage+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 
   cat >conftest.$ac_ext <<_ACEOF
-#line 12702 "configure"
+#line 16037 "configure"
 #include "confdefs.h"
 #include <signal.h>
 int
@@ -12717,16 +16052,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12720: \"$ac_link\"") >&5
+if { (eval echo "$as_me:16055: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12723: \$? = $ac_status" >&5
+  echo "$as_me:16058: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:12726: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16061: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12729: \$? = $ac_status" >&5
+  echo "$as_me:16064: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_signal_vintage=posix
 else
@@ -12734,7 +16069,7 @@ else
 cat conftest.$ac_ext >&5
 
     cat >conftest.$ac_ext <<_ACEOF
-#line 12737 "configure"
+#line 16072 "configure"
 #include "confdefs.h"
 #include <signal.h>
 int
@@ -12749,16 +16084,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12752: \"$ac_link\"") >&5
+if { (eval echo "$as_me:16087: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12755: \$? = $ac_status" >&5
+  echo "$as_me:16090: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:12758: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16093: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12761: \$? = $ac_status" >&5
+  echo "$as_me:16096: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_signal_vintage=4.2bsd
 else
@@ -12766,7 +16101,7 @@ else
 cat conftest.$ac_ext >&5
 
       cat >conftest.$ac_ext <<_ACEOF
-#line 12769 "configure"
+#line 16104 "configure"
 #include "confdefs.h"
 
        #include <signal.h>
@@ -12784,16 +16119,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12787: \"$ac_link\"") >&5
+if { (eval echo "$as_me:16122: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12790: \$? = $ac_status" >&5
+  echo "$as_me:16125: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:12793: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16128: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12796: \$? = $ac_status" >&5
+  echo "$as_me:16131: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_signal_vintage=svr3
 else
@@ -12812,7 +16147,7 @@ rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 
 fi
 
-echo "$as_me:12815: result: $bash_cv_signal_vintage" >&5
+echo "$as_me:16150: result: $bash_cv_signal_vintage" >&5
 echo "${ECHO_T}$bash_cv_signal_vintage" >&6
 if test "$bash_cv_signal_vintage" = posix; then
 cat >>confdefs.h <<\EOF
@@ -12831,13 +16166,13 @@ EOF
 
 fi
 
-echo "$as_me:12834: checking for sys_errlist and sys_nerr" >&5
+echo "$as_me:16169: checking for sys_errlist and sys_nerr" >&5
 echo $ECHO_N "checking for sys_errlist and sys_nerr... $ECHO_C" >&6
 if test "${bash_cv_sys_errlist+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12840 "configure"
+#line 16175 "configure"
 #include "confdefs.h"
 #include <errno.h>
 int
@@ -12851,16 +16186,16 @@ extern char *sys_errlist[];
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:12854: \"$ac_link\"") >&5
+if { (eval echo "$as_me:16189: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12857: \$? = $ac_status" >&5
+  echo "$as_me:16192: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:12860: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16195: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12863: \$? = $ac_status" >&5
+  echo "$as_me:16198: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_sys_errlist=yes
 else
@@ -12870,7 +16205,7 @@ bash_cv_sys_errlist=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:12873: result: $bash_cv_sys_errlist" >&5
+echo "$as_me:16208: result: $bash_cv_sys_errlist" >&5
 echo "${ECHO_T}$bash_cv_sys_errlist" >&6
 if test $bash_cv_sys_errlist = yes; then
 cat >>confdefs.h <<\EOF
@@ -12879,18 +16214,18 @@ EOF
 
 fi
 
-echo "$as_me:12882: checking for sys_siglist in system C library" >&5
+echo "$as_me:16217: checking for sys_siglist in system C library" >&5
 echo $ECHO_N "checking for sys_siglist in system C library... $ECHO_C" >&6
 if test "${bash_cv_sys_siglist+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:12888: WARNING: cannot check for sys_siglist if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:16223: WARNING: cannot check for sys_siglist if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check for sys_siglist if cross compiling -- defaulting to no" >&2;}
         bash_cv_sys_siglist=no
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12893 "configure"
+#line 16228 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -12908,15 +16243,15 @@ exit(msg == 0);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:12911: \"$ac_link\"") >&5
+if { (eval echo "$as_me:16246: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:12914: \$? = $ac_status" >&5
+  echo "$as_me:16249: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:12916: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16251: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12919: \$? = $ac_status" >&5
+  echo "$as_me:16254: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_sys_siglist=yes
 else
@@ -12929,7 +16264,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:12932: result: $bash_cv_sys_siglist" >&5
+echo "$as_me:16267: result: $bash_cv_sys_siglist" >&5
 echo "${ECHO_T}$bash_cv_sys_siglist" >&6
 if test $bash_cv_sys_siglist = yes; then
 cat >>confdefs.h <<\EOF
@@ -12938,13 +16273,13 @@ EOF
 
 fi
 
-echo "$as_me:12941: checking for _sys_siglist in signal.h or unistd.h" >&5
+echo "$as_me:16276: checking for _sys_siglist in signal.h or unistd.h" >&5
 echo $ECHO_N "checking for _sys_siglist in signal.h or unistd.h... $ECHO_C" >&6
 if test "${bash_cv_decl_under_sys_siglist+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 12947 "configure"
+#line 16282 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -12961,16 +16296,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:12964: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:16299: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:12967: \$? = $ac_status" >&5
+  echo "$as_me:16302: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:12970: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16305: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:12973: \$? = $ac_status" >&5
+  echo "$as_me:16308: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_decl_under_sys_siglist=yes
 else
@@ -12980,7 +16315,7 @@ bash_cv_decl_under_sys_siglist=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:12983: result: $bash_cv_decl_under_sys_siglist" >&5
+echo "$as_me:16318: result: $bash_cv_decl_under_sys_siglist" >&5
 echo "${ECHO_T}$bash_cv_decl_under_sys_siglist" >&6
 if test $bash_cv_decl_under_sys_siglist = yes; then
 cat >>confdefs.h <<\EOF
@@ -12989,18 +16324,18 @@ EOF
 
 fi
 
-echo "$as_me:12992: checking for _sys_siglist in system C library" >&5
+echo "$as_me:16327: checking for _sys_siglist in system C library" >&5
 echo $ECHO_N "checking for _sys_siglist in system C library... $ECHO_C" >&6
 if test "${bash_cv_under_sys_siglist+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:12998: WARNING: cannot check for _sys_siglist if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:16333: WARNING: cannot check for _sys_siglist if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check for _sys_siglist if cross compiling -- defaulting to no" >&2;}
         bash_cv_under_sys_siglist=no
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13003 "configure"
+#line 16338 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -13018,15 +16353,15 @@ exit(msg == 0);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:13021: \"$ac_link\"") >&5
+if { (eval echo "$as_me:16356: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:13024: \$? = $ac_status" >&5
+  echo "$as_me:16359: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:13026: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16361: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13029: \$? = $ac_status" >&5
+  echo "$as_me:16364: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_under_sys_siglist=yes
 else
@@ -13039,7 +16374,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:13042: result: $bash_cv_under_sys_siglist" >&5
+echo "$as_me:16377: result: $bash_cv_under_sys_siglist" >&5
 echo "${ECHO_T}$bash_cv_under_sys_siglist" >&6
 if test $bash_cv_under_sys_siglist = yes; then
 cat >>confdefs.h <<\EOF
@@ -13048,13 +16383,13 @@ EOF
 
 fi
 
-echo "$as_me:13051: checking whether signal handlers are of type void" >&5
+echo "$as_me:16386: checking whether signal handlers are of type void" >&5
 echo $ECHO_N "checking whether signal handlers are of type void... $ECHO_C" >&6
 if test "${bash_cv_void_sighandler+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13057 "configure"
+#line 16392 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -13074,16 +16409,16 @@ int i;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13077: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:16412: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13080: \$? = $ac_status" >&5
+  echo "$as_me:16415: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13083: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16418: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13086: \$? = $ac_status" >&5
+  echo "$as_me:16421: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_void_sighandler=yes
 else
@@ -13093,7 +16428,7 @@ bash_cv_void_sighandler=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:13096: result: $bash_cv_void_sighandler" >&5
+echo "$as_me:16431: result: $bash_cv_void_sighandler" >&5
 echo "${ECHO_T}$bash_cv_void_sighandler" >&6
 if test $bash_cv_void_sighandler = yes; then
 cat >>confdefs.h <<\EOF
@@ -13102,13 +16437,13 @@ EOF
 
 fi
 
-echo "$as_me:13105: checking for clock_t" >&5
+echo "$as_me:16440: checking for clock_t" >&5
 echo $ECHO_N "checking for clock_t... $ECHO_C" >&6
 if test "${bash_cv_type_clock_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13111 "configure"
+#line 16446 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -13131,7 +16466,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:13134: result: $bash_cv_type_clock_t" >&5
+echo "$as_me:16469: result: $bash_cv_type_clock_t" >&5
 echo "${ECHO_T}$bash_cv_type_clock_t" >&6
 
 if test $bash_cv_type_clock_t = no; then
@@ -13141,13 +16476,13 @@ EOF
 
 fi
 
-echo "$as_me:13144: checking for sigset_t" >&5
+echo "$as_me:16479: checking for sigset_t" >&5
 echo $ECHO_N "checking for sigset_t... $ECHO_C" >&6
 if test "${bash_cv_type_sigset_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13150 "configure"
+#line 16485 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -13170,7 +16505,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:13173: result: $bash_cv_type_sigset_t" >&5
+echo "$as_me:16508: result: $bash_cv_type_sigset_t" >&5
 echo "${ECHO_T}$bash_cv_type_sigset_t" >&6
 
 if test $bash_cv_type_sigset_t = no; then
@@ -13180,13 +16515,13 @@ EOF
 
 fi
 
-echo "$as_me:13183: checking for quad_t" >&5
+echo "$as_me:16518: checking for quad_t" >&5
 echo $ECHO_N "checking for quad_t... $ECHO_C" >&6
 if test "${bash_cv_type_quad_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13189 "configure"
+#line 16524 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -13208,7 +16543,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:13211: result: $bash_cv_type_quad_t" >&5
+echo "$as_me:16546: result: $bash_cv_type_quad_t" >&5
 echo "${ECHO_T}$bash_cv_type_quad_t" >&6
 if test $bash_cv_type_quad_t = yes; then
        cat >>confdefs.h <<\EOF
@@ -13223,13 +16558,13 @@ EOF
 
 fi
 
-echo "$as_me:13226: checking for intmax_t" >&5
+echo "$as_me:16561: checking for intmax_t" >&5
 echo $ECHO_N "checking for intmax_t... $ECHO_C" >&6
 if test "${bash_cv_type_intmax_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13232 "configure"
+#line 16567 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -13251,7 +16586,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:13254: result: $bash_cv_type_intmax_t" >&5
+echo "$as_me:16589: result: $bash_cv_type_intmax_t" >&5
 echo "${ECHO_T}$bash_cv_type_intmax_t" >&6
 
 if test $bash_cv_type_intmax_t = no; then
@@ -13261,13 +16596,13 @@ EOF
 
 fi
 
-echo "$as_me:13264: checking for uintmax_t" >&5
+echo "$as_me:16599: checking for uintmax_t" >&5
 echo $ECHO_N "checking for uintmax_t... $ECHO_C" >&6
 if test "${bash_cv_type_uintmax_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13270 "configure"
+#line 16605 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -13289,7 +16624,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:13292: result: $bash_cv_type_uintmax_t" >&5
+echo "$as_me:16627: result: $bash_cv_type_uintmax_t" >&5
 echo "${ECHO_T}$bash_cv_type_uintmax_t" >&6
 
 if test $bash_cv_type_uintmax_t = no; then
 
 if test "$ac_cv_header_sys_socket_h" = "yes"; then
 
-echo "$as_me:13304: checking for socklen_t" >&5
+echo "$as_me:16639: checking for socklen_t" >&5
 echo $ECHO_N "checking for socklen_t... $ECHO_C" >&6
 if test "${bash_cv_type_socklen_t+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13310 "configure"
+#line 16645 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -13330,7 +16665,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:13333: result: $bash_cv_type_socklen_t" >&5
+echo "$as_me:16668: result: $bash_cv_type_socklen_t" >&5
 echo "${ECHO_T}$bash_cv_type_socklen_t" >&6
 if test $bash_cv_type_socklen_t = yes; then
        cat >>confdefs.h <<\EOF
@@ -13346,13 +16681,13 @@ EOF
 fi
 
 fi
-echo "$as_me:13349: checking for size and type of struct rlimit fields" >&5
+echo "$as_me:16684: checking for size and type of struct rlimit fields" >&5
 echo $ECHO_N "checking for size and type of struct rlimit fields... $ECHO_C" >&6
 if test "${bash_cv_type_rlimit+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13355 "configure"
+#line 16690 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/resource.h>
@@ -13365,16 +16700,16 @@ rlim_t xxx;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13368: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:16703: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13371: \$? = $ac_status" >&5
+  echo "$as_me:16706: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13374: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16709: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13377: \$? = $ac_status" >&5
+  echo "$as_me:16712: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_type_rlimit=rlim_t
 else
@@ -13382,12 +16717,12 @@ else
 cat conftest.$ac_ext >&5
 
 if test "$cross_compiling" = yes; then
-  { echo "$as_me:13385: WARNING: cannot check quad_t if cross compiling -- defaulting to long" >&5
+  { echo "$as_me:16720: WARNING: cannot check quad_t if cross compiling -- defaulting to long" >&5
 echo "$as_me: WARNING: cannot check quad_t if cross compiling -- defaulting to long" >&2;}
          bash_cv_type_rlimit=long
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13390 "configure"
+#line 16725 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -13404,15 +16739,15 @@ main()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:13407: \"$ac_link\"") >&5
+if { (eval echo "$as_me:16742: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:13410: \$? = $ac_status" >&5
+  echo "$as_me:16745: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:13412: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16747: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13415: \$? = $ac_status" >&5
+  echo "$as_me:16750: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_type_rlimit=quad_t
 else
@@ -13428,7 +16763,7 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 
 fi
 
-echo "$as_me:13431: result: $bash_cv_type_rlimit" >&5
+echo "$as_me:16766: result: $bash_cv_type_rlimit" >&5
 echo "${ECHO_T}$bash_cv_type_rlimit" >&6
 if test $bash_cv_type_rlimit = quad_t; then
 cat >>confdefs.h <<\EOF
@@ -13442,13 +16777,13 @@ EOF
 
 fi
 
-echo "$as_me:13445: checking for struct termios.c_line" >&5
+echo "$as_me:16780: checking for struct termios.c_line" >&5
 echo $ECHO_N "checking for struct termios.c_line... $ECHO_C" >&6
 if test "${ac_cv_member_struct_termios_c_line+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13451 "configure"
+#line 16786 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -13465,16 +16800,16 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13468: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:16803: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13471: \$? = $ac_status" >&5
+  echo "$as_me:16806: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13474: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16809: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13477: \$? = $ac_status" >&5
+  echo "$as_me:16812: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_member_struct_termios_c_line=yes
 else
@@ -13484,7 +16819,7 @@ ac_cv_member_struct_termios_c_line=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:13487: result: $ac_cv_member_struct_termios_c_line" >&5
+echo "$as_me:16822: result: $ac_cv_member_struct_termios_c_line" >&5
 echo "${ECHO_T}$ac_cv_member_struct_termios_c_line" >&6
 if test $ac_cv_member_struct_termios_c_line = yes; then
   cat >>confdefs.h <<\EOF
@@ -13493,13 +16828,13 @@ EOF
 
 fi
 
-echo "$as_me:13496: checking for struct termio.c_line" >&5
+echo "$as_me:16831: checking for struct termio.c_line" >&5
 echo $ECHO_N "checking for struct termio.c_line... $ECHO_C" >&6
 if test "${ac_cv_member_struct_termio_c_line+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13502 "configure"
+#line 16837 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -13516,16 +16851,16 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13519: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:16854: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13522: \$? = $ac_status" >&5
+  echo "$as_me:16857: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13525: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16860: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13528: \$? = $ac_status" >&5
+  echo "$as_me:16863: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_member_struct_termio_c_line=yes
 else
@@ -13535,7 +16870,7 @@ ac_cv_member_struct_termio_c_line=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:13538: result: $ac_cv_member_struct_termio_c_line" >&5
+echo "$as_me:16873: result: $ac_cv_member_struct_termio_c_line" >&5
 echo "${ECHO_T}$ac_cv_member_struct_termio_c_line" >&6
 if test $ac_cv_member_struct_termio_c_line = yes; then
   cat >>confdefs.h <<\EOF
@@ -13544,13 +16879,13 @@ EOF
 
 fi
 
-echo "$as_me:13547: checking if struct dirent has a d_ino member" >&5
+echo "$as_me:16882: checking if struct dirent has a d_ino member" >&5
 echo $ECHO_N "checking if struct dirent has a d_ino member... $ECHO_C" >&6
 if test "${bash_cv_dirent_has_dino+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13553 "configure"
+#line 16888 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -13584,16 +16919,16 @@ struct dirent d; int z; z = d.d_ino;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13587: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:16922: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13590: \$? = $ac_status" >&5
+  echo "$as_me:16925: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13593: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16928: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13596: \$? = $ac_status" >&5
+  echo "$as_me:16931: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_dirent_has_dino=yes
 else
@@ -13604,7 +16939,7 @@ fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
 
-echo "$as_me:13607: result: $bash_cv_dirent_has_dino" >&5
+echo "$as_me:16942: result: $bash_cv_dirent_has_dino" >&5
 echo "${ECHO_T}$bash_cv_dirent_has_dino" >&6
 if test $bash_cv_dirent_has_dino = yes; then
 cat >>confdefs.h <<\EOF
@@ -13613,13 +16948,13 @@ EOF
 
 fi
 
-echo "$as_me:13616: checking if struct dirent has a d_fileno member" >&5
+echo "$as_me:16951: checking if struct dirent has a d_fileno member" >&5
 echo $ECHO_N "checking if struct dirent has a d_fileno member... $ECHO_C" >&6
 if test "${bash_cv_dirent_has_d_fileno+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13622 "configure"
+#line 16957 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -13653,16 +16988,16 @@ struct dirent d; int z; z = d.d_fileno;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13656: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:16991: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13659: \$? = $ac_status" >&5
+  echo "$as_me:16994: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13662: \"$ac_try\"") >&5
+  { (eval echo "$as_me:16997: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13665: \$? = $ac_status" >&5
+  echo "$as_me:17000: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_dirent_has_d_fileno=yes
 else
@@ -13673,7 +17008,7 @@ fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
 
-echo "$as_me:13676: result: $bash_cv_dirent_has_d_fileno" >&5
+echo "$as_me:17011: result: $bash_cv_dirent_has_d_fileno" >&5
 echo "${ECHO_T}$bash_cv_dirent_has_d_fileno" >&6
 if test $bash_cv_dirent_has_d_fileno = yes; then
 cat >>confdefs.h <<\EOF
@@ -13682,13 +17017,13 @@ EOF
 
 fi
 
-echo "$as_me:13685: checking for struct winsize in sys/ioctl.h and termios.h" >&5
+echo "$as_me:17020: checking for struct winsize in sys/ioctl.h and termios.h" >&5
 echo $ECHO_N "checking for struct winsize in sys/ioctl.h and termios.h... $ECHO_C" >&6
 if test "${bash_cv_struct_winsize_header+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13691 "configure"
+#line 17026 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/ioctl.h>
@@ -13701,23 +17036,23 @@ struct winsize x;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13704: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:17039: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13707: \$? = $ac_status" >&5
+  echo "$as_me:17042: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13710: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17045: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13713: \$? = $ac_status" >&5
+  echo "$as_me:17048: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_struct_winsize_header=ioctl_h
 else
   echo "$as_me: failed program was:" >&5
 cat conftest.$ac_ext >&5
 cat >conftest.$ac_ext <<_ACEOF
-#line 13720 "configure"
+#line 17055 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <termios.h>
@@ -13730,16 +17065,16 @@ struct winsize x;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13733: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:17068: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13736: \$? = $ac_status" >&5
+  echo "$as_me:17071: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13739: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17074: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13742: \$? = $ac_status" >&5
+  echo "$as_me:17077: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_struct_winsize_header=termios_h
 else
@@ -13754,32 +17089,32 @@ rm -f conftest.$ac_objext conftest.$ac_ext
 fi
 
 if test $bash_cv_struct_winsize_header = ioctl_h; then
-  echo "$as_me:13757: result: sys/ioctl.h" >&5
+  echo "$as_me:17092: result: sys/ioctl.h" >&5
 echo "${ECHO_T}sys/ioctl.h" >&6
   cat >>confdefs.h <<\EOF
 #define STRUCT_WINSIZE_IN_SYS_IOCTL 1
 EOF
 
 elif test $bash_cv_struct_winsize_header = termios_h; then
-  echo "$as_me:13764: result: termios.h" >&5
+  echo "$as_me:17099: result: termios.h" >&5
 echo "${ECHO_T}termios.h" >&6
   cat >>confdefs.h <<\EOF
 #define STRUCT_WINSIZE_IN_TERMIOS 1
 EOF
 
 else
-  echo "$as_me:13771: result: not found" >&5
+  echo "$as_me:17106: result: not found" >&5
 echo "${ECHO_T}not found" >&6
 fi
 
-echo "$as_me:13775: checking for struct timeval in sys/time.h and time.h" >&5
+echo "$as_me:17110: checking for struct timeval in sys/time.h and time.h" >&5
 echo $ECHO_N "checking for struct timeval in sys/time.h and time.h... $ECHO_C" >&6
 if test "${bash_cv_struct_timeval+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 
 cat >conftest.$ac_ext <<_ACEOF
-#line 13782 "configure"
+#line 17117 "configure"
 #include "confdefs.h"
 #include <sys/time.h>
 
@@ -13789,7 +17124,7 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
   bash_cv_struct_timeval=yes
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13792 "configure"
+#line 17127 "configure"
 #include "confdefs.h"
 #include <time.h>
 
@@ -13807,7 +17142,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:13810: result: $bash_cv_struct_timeval" >&5
+echo "$as_me:17145: result: $bash_cv_struct_timeval" >&5
 echo "${ECHO_T}$bash_cv_struct_timeval" >&6
 if test $bash_cv_struct_timeval = yes; then
   cat >>confdefs.h <<\EOF
@@ -13816,13 +17151,13 @@ EOF
 
 fi
 
-echo "$as_me:13819: checking for struct stat.st_blocks" >&5
+echo "$as_me:17154: checking for struct stat.st_blocks" >&5
 echo $ECHO_N "checking for struct stat.st_blocks... $ECHO_C" >&6
 if test "${ac_cv_member_struct_stat_st_blocks+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13825 "configure"
+#line 17160 "configure"
 #include "confdefs.h"
 $ac_includes_default
 int
@@ -13836,16 +17171,16 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13839: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:17174: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13842: \$? = $ac_status" >&5
+  echo "$as_me:17177: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13845: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17180: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13848: \$? = $ac_status" >&5
+  echo "$as_me:17183: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_member_struct_stat_st_blocks=yes
 else
@@ -13855,7 +17190,7 @@ ac_cv_member_struct_stat_st_blocks=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:13858: result: $ac_cv_member_struct_stat_st_blocks" >&5
+echo "$as_me:17193: result: $ac_cv_member_struct_stat_st_blocks" >&5
 echo "${ECHO_T}$ac_cv_member_struct_stat_st_blocks" >&6
 if test $ac_cv_member_struct_stat_st_blocks = yes; then
 
@@ -13865,13 +17200,13 @@ EOF
 
 fi
 
-echo "$as_me:13868: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "$as_me:17203: checking whether struct tm is in sys/time.h or time.h" >&5
 echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6
 if test "${ac_cv_struct_tm+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13874 "configure"
+#line 17209 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <time.h>
@@ -13885,16 +17220,16 @@ struct tm *tp; tp->tm_sec;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13888: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:17223: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13891: \$? = $ac_status" >&5
+  echo "$as_me:17226: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13894: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17229: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13897: \$? = $ac_status" >&5
+  echo "$as_me:17232: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_struct_tm=time.h
 else
@@ -13904,7 +17239,7 @@ ac_cv_struct_tm=sys/time.h
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:13907: result: $ac_cv_struct_tm" >&5
+echo "$as_me:17242: result: $ac_cv_struct_tm" >&5
 echo "${ECHO_T}$ac_cv_struct_tm" >&6
 if test $ac_cv_struct_tm = sys/time.h; then
 
@@ -13914,13 +17249,13 @@ EOF
 
 fi
 
-echo "$as_me:13917: checking for struct tm.tm_zone" >&5
+echo "$as_me:17252: checking for struct tm.tm_zone" >&5
 echo $ECHO_N "checking for struct tm.tm_zone... $ECHO_C" >&6
 if test "${ac_cv_member_struct_tm_tm_zone+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13923 "configure"
+#line 17258 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_cv_struct_tm>
@@ -13936,16 +17271,16 @@ return 0;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:13939: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:17274: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:13942: \$? = $ac_status" >&5
+  echo "$as_me:17277: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:13945: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17280: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:13948: \$? = $ac_status" >&5
+  echo "$as_me:17283: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_member_struct_tm_tm_zone=yes
 else
@@ -13955,7 +17290,7 @@ ac_cv_member_struct_tm_tm_zone=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
-echo "$as_me:13958: result: $ac_cv_member_struct_tm_tm_zone" >&5
+echo "$as_me:17293: result: $ac_cv_member_struct_tm_tm_zone" >&5
 echo "${ECHO_T}$ac_cv_member_struct_tm_tm_zone" >&6
 if test $ac_cv_member_struct_tm_tm_zone = yes; then
 
@@ -13972,13 +17307,13 @@ cat >>confdefs.h <<\EOF
 EOF
 
 else
-  echo "$as_me:13975: checking for tzname" >&5
+  echo "$as_me:17310: checking for tzname" >&5
 echo $ECHO_N "checking for tzname... $ECHO_C" >&6
 if test "${ac_cv_var_tzname+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 13981 "configure"
+#line 17316 "configure"
 #include "confdefs.h"
 #include <time.h>
 #ifndef tzname /* For SGI.  */
@@ -13994,16 +17329,16 @@ atoi(*tzname);
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:13997: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17332: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14000: \$? = $ac_status" >&5
+  echo "$as_me:17335: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:14003: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17338: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14006: \$? = $ac_status" >&5
+  echo "$as_me:17341: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_var_tzname=yes
 else
@@ -14013,7 +17348,7 @@ ac_cv_var_tzname=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:14016: result: $ac_cv_var_tzname" >&5
+echo "$as_me:17351: result: $ac_cv_var_tzname" >&5
 echo "${ECHO_T}$ac_cv_var_tzname" >&6
   if test $ac_cv_var_tzname = yes; then
 
@@ -14024,14 +17359,14 @@ EOF
   fi
 fi
 
-echo "$as_me:14027: checking for struct timezone in sys/time.h and time.h" >&5
+echo "$as_me:17362: checking for struct timezone in sys/time.h and time.h" >&5
 echo $ECHO_N "checking for struct timezone in sys/time.h and time.h... $ECHO_C" >&6
 if test "${bash_cv_struct_timezone+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
 
 cat >conftest.$ac_ext <<_ACEOF
-#line 14034 "configure"
+#line 17369 "configure"
 #include "confdefs.h"
 #include <sys/time.h>
 
@@ -14041,7 +17376,7 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
   bash_cv_struct_timezone=yes
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14044 "configure"
+#line 17379 "configure"
 #include "confdefs.h"
 #include <time.h>
 
@@ -14059,7 +17394,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:14062: result: $bash_cv_struct_timezone" >&5
+echo "$as_me:17397: result: $bash_cv_struct_timezone" >&5
 echo "${ECHO_T}$bash_cv_struct_timezone" >&6
 if test $bash_cv_struct_timezone = yes; then
   cat >>confdefs.h <<\EOF
@@ -14068,13 +17403,13 @@ EOF
 
 fi
 
-echo "$as_me:14071: checking for the existence of strsignal" >&5
+echo "$as_me:17406: checking for the existence of strsignal" >&5
 echo $ECHO_N "checking for the existence of strsignal... $ECHO_C" >&6
 if test "${bash_cv_have_strsignal+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14077 "configure"
+#line 17412 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -14087,16 +17422,16 @@ char *s = (char *)strsignal(2);
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:14090: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17425: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14093: \$? = $ac_status" >&5
+  echo "$as_me:17428: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:14096: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17431: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14099: \$? = $ac_status" >&5
+  echo "$as_me:17434: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_have_strsignal=yes
 else
@@ -14107,7 +17442,7 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
 
-echo "$as_me:14110: result: $bash_cv_have_strsignal" >&5
+echo "$as_me:17445: result: $bash_cv_have_strsignal" >&5
 echo "${ECHO_T}$bash_cv_have_strsignal" >&6
 if test $bash_cv_have_strsignal = yes; then
 cat >>confdefs.h <<\EOF
@@ -14116,19 +17451,19 @@ EOF
 
 fi
 
-echo "$as_me:14119: checking if opendir() opens non-directories" >&5
+echo "$as_me:17454: checking if opendir() opens non-directories" >&5
 echo $ECHO_N "checking if opendir() opens non-directories... $ECHO_C" >&6
 if test "${bash_cv_opendir_not_robust+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14125: WARNING: cannot check opendir if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:17460: WARNING: cannot check opendir if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check opendir if cross compiling -- defaulting to no" >&2;}
      bash_cv_opendir_not_robust=no
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14131 "configure"
+#line 17466 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -14171,15 +17506,15 @@ exit (dir == 0);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14174: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17509: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14177: \$? = $ac_status" >&5
+  echo "$as_me:17512: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14179: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17514: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14182: \$? = $ac_status" >&5
+  echo "$as_me:17517: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_opendir_not_robust=yes
 else
@@ -14192,7 +17527,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14195: result: $bash_cv_opendir_not_robust" >&5
+echo "$as_me:17530: result: $bash_cv_opendir_not_robust" >&5
 echo "${ECHO_T}$bash_cv_opendir_not_robust" >&6
 if test $bash_cv_opendir_not_robust = yes; then
 cat >>confdefs.h <<\EOF
@@ -14201,19 +17536,19 @@ EOF
 
 fi
 
-echo "$as_me:14204: checking whether ulimit can substitute for getdtablesize" >&5
+echo "$as_me:17539: checking whether ulimit can substitute for getdtablesize" >&5
 echo $ECHO_N "checking whether ulimit can substitute for getdtablesize... $ECHO_C" >&6
 if test "${bash_cv_ulimit_maxfds+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14210: WARNING: cannot check ulimit if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:17545: WARNING: cannot check ulimit if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check ulimit if cross compiling -- defaulting to no" >&2;}
     bash_cv_ulimit_maxfds=no
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14216 "configure"
+#line 17551 "configure"
 #include "confdefs.h"
 
 main()
@@ -14224,15 +17559,15 @@ exit (maxfds == -1L);
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14227: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17562: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14230: \$? = $ac_status" >&5
+  echo "$as_me:17565: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14232: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17567: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14235: \$? = $ac_status" >&5
+  echo "$as_me:17570: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_ulimit_maxfds=yes
 else
@@ -14245,7 +17580,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14248: result: $bash_cv_ulimit_maxfds" >&5
+echo "$as_me:17583: result: $bash_cv_ulimit_maxfds" >&5
 echo "${ECHO_T}$bash_cv_ulimit_maxfds" >&6
 if test $bash_cv_ulimit_maxfds = yes; then
 cat >>confdefs.h <<\EOF
@@ -14254,19 +17589,19 @@ EOF
 
 fi
 
-echo "$as_me:14257: checking to see if getenv can be redefined" >&5
+echo "$as_me:17592: checking to see if getenv can be redefined" >&5
 echo $ECHO_N "checking to see if getenv can be redefined... $ECHO_C" >&6
 if test "${bash_cv_getenv_redef+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14263: WARNING: cannot check getenv redefinition if cross compiling -- defaulting to yes" >&5
+  { echo "$as_me:17598: WARNING: cannot check getenv redefinition if cross compiling -- defaulting to yes" >&5
 echo "$as_me: WARNING: cannot check getenv redefinition if cross compiling -- defaulting to yes" >&2;}
     bash_cv_getenv_redef=yes
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14269 "configure"
+#line 17604 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_UNISTD_H
@@ -14302,15 +17637,15 @@ exit(s == 0); /* force optimizer to leave getenv in */
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14305: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17640: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14308: \$? = $ac_status" >&5
+  echo "$as_me:17643: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14310: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17645: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14313: \$? = $ac_status" >&5
+  echo "$as_me:17648: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_getenv_redef=yes
 else
@@ -14323,7 +17658,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14326: result: $bash_cv_getenv_redef" >&5
+echo "$as_me:17661: result: $bash_cv_getenv_redef" >&5
 echo "${ECHO_T}$bash_cv_getenv_redef" >&6
 if test $bash_cv_getenv_redef = yes; then
 cat >>confdefs.h <<\EOF
@@ -14333,19 +17668,19 @@ EOF
 fi
 
 if test "$ac_cv_func_getcwd" = "yes"; then
-echo "$as_me:14336: checking if getcwd() calls popen()" >&5
+echo "$as_me:17671: checking if getcwd() calls popen()" >&5
 echo $ECHO_N "checking if getcwd() calls popen()... $ECHO_C" >&6
 if test "${bash_cv_getcwd_calls_popen+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14342: WARNING: cannot check whether getcwd calls popen if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:17677: WARNING: cannot check whether getcwd calls popen if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check whether getcwd calls popen if cross compiling -- defaulting to no" >&2;}
     bash_cv_getcwd_calls_popen=no
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14348 "configure"
+#line 17683 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -14401,15 +17736,15 @@ main()
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14404: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17739: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14407: \$? = $ac_status" >&5
+  echo "$as_me:17742: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14409: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17744: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14412: \$? = $ac_status" >&5
+  echo "$as_me:17747: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_getcwd_calls_popen=no
 else
@@ -14422,7 +17757,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14425: result: $bash_cv_getcwd_calls_popen" >&5
+echo "$as_me:17760: result: $bash_cv_getcwd_calls_popen" >&5
 echo "${ECHO_T}$bash_cv_getcwd_calls_popen" >&6
 if test $bash_cv_getcwd_calls_popen = yes; then
 cat >>confdefs.h <<\EOF
 
 fi
 
-echo "$as_me:14437: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5
+echo "$as_me:17772: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5
 echo $ECHO_N "checking for presence of POSIX-style sigsetjmp/siglongjmp... $ECHO_C" >&6
 if test "${bash_cv_func_sigsetjmp+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14443: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing" >&5
+  { echo "$as_me:17778: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing" >&5
 echo "$as_me: WARNING: cannot check for sigsetjmp/siglongjmp if cross-compiling -- defaulting to missing" >&2;}
      bash_cv_func_sigsetjmp=missing
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14449 "configure"
+#line 17784 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_UNISTD_H
@@ -14488,15 +17823,15 @@ exit(1);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14491: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17826: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14494: \$? = $ac_status" >&5
+  echo "$as_me:17829: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14496: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17831: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14499: \$? = $ac_status" >&5
+  echo "$as_me:17834: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_func_sigsetjmp=present
 else
@@ -14509,7 +17844,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14512: result: $bash_cv_func_sigsetjmp" >&5
+echo "$as_me:17847: result: $bash_cv_func_sigsetjmp" >&5
 echo "${ECHO_T}$bash_cv_func_sigsetjmp" >&6
 if test $bash_cv_func_sigsetjmp = present; then
 cat >>confdefs.h <<\EOF
@@ -14518,19 +17853,19 @@ EOF
 
 fi
 
-echo "$as_me:14521: checking whether or not strcoll and strcmp differ" >&5
+echo "$as_me:17856: checking whether or not strcoll and strcmp differ" >&5
 echo $ECHO_N "checking whether or not strcoll and strcmp differ... $ECHO_C" >&6
 if test "${bash_cv_func_strcoll_broken+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14527: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:17862: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check strcoll if cross compiling -- defaulting to no" >&2;}
     bash_cv_func_strcoll_broken=no
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14533 "configure"
+#line 17868 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -14570,15 +17905,15 @@ char    *v[];
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14573: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17908: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14576: \$? = $ac_status" >&5
+  echo "$as_me:17911: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14578: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17913: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14581: \$? = $ac_status" >&5
+  echo "$as_me:17916: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_func_strcoll_broken=yes
 else
@@ -14591,7 +17926,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14594: result: $bash_cv_func_strcoll_broken" >&5
+echo "$as_me:17929: result: $bash_cv_func_strcoll_broken" >&5
 echo "${ECHO_T}$bash_cv_func_strcoll_broken" >&6
 if test $bash_cv_func_strcoll_broken = yes; then
 cat >>confdefs.h <<\EOF
 
 if test "$ac_cv_func_putenv" = "yes"; then
 
-echo "$as_me:14605: checking for standard-conformant putenv declaration" >&5
+echo "$as_me:17940: checking for standard-conformant putenv declaration" >&5
 echo $ECHO_N "checking for standard-conformant putenv declaration... $ECHO_C" >&6
 if test "${bash_cv_std_putenv+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14611 "configure"
+#line 17946 "configure"
 #include "confdefs.h"
 
 #if STDC_HEADERS
@@ -14635,16 +17970,16 @@ return (putenv == 0);
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:14638: \"$ac_link\"") >&5
+if { (eval echo "$as_me:17973: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14641: \$? = $ac_status" >&5
+  echo "$as_me:17976: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:14644: \"$ac_try\"") >&5
+  { (eval echo "$as_me:17979: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14647: \$? = $ac_status" >&5
+  echo "$as_me:17982: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_std_putenv=yes
 else
@@ -14655,7 +17990,7 @@ bash_cv_std_putenv=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:14658: result: $bash_cv_std_putenv" >&5
+echo "$as_me:17993: result: $bash_cv_std_putenv" >&5
 echo "${ECHO_T}$bash_cv_std_putenv" >&6
 if test $bash_cv_std_putenv = yes; then
 cat >>confdefs.h <<\EOF
@@ -14672,13 +18007,13 @@ EOF
 fi
 if test "$ac_cv_func_unsetenv" = "yes"; then
 
-echo "$as_me:14675: checking for standard-conformant unsetenv declaration" >&5
+echo "$as_me:18010: checking for standard-conformant unsetenv declaration" >&5
 echo $ECHO_N "checking for standard-conformant unsetenv declaration... $ECHO_C" >&6
 if test "${bash_cv_std_unsetenv+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14681 "configure"
+#line 18016 "configure"
 #include "confdefs.h"
 
 #if STDC_HEADERS
@@ -14705,16 +18040,16 @@ return (unsetenv == 0);
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:14708: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18043: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14711: \$? = $ac_status" >&5
+  echo "$as_me:18046: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:14714: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18049: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14717: \$? = $ac_status" >&5
+  echo "$as_me:18052: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_std_unsetenv=yes
 else
@@ -14725,7 +18060,7 @@ bash_cv_std_unsetenv=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:14728: result: $bash_cv_std_unsetenv" >&5
+echo "$as_me:18063: result: $bash_cv_std_unsetenv" >&5
 echo "${ECHO_T}$bash_cv_std_unsetenv" >&6
 if test $bash_cv_std_unsetenv = yes; then
 cat >>confdefs.h <<\EOF
@@ -14741,19 +18076,19 @@ EOF
 
 fi
 
-echo "$as_me:14744: checking for printf floating point output in hex notation" >&5
+echo "$as_me:18079: checking for printf floating point output in hex notation" >&5
 echo $ECHO_N "checking for printf floating point output in hex notation... $ECHO_C" >&6
 if test "${bash_cv_printf_a_format+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14750: WARNING: cannot check printf if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:18085: WARNING: cannot check printf if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check printf if cross compiling -- defaulting to no" >&2;}
     bash_cv_printf_a_format=no
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14756 "configure"
+#line 18091 "configure"
 #include "confdefs.h"
 
 #include <stdio.h>
@@ -14771,15 +18106,15 @@ main()
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14774: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18109: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14777: \$? = $ac_status" >&5
+  echo "$as_me:18112: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14779: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18114: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14782: \$? = $ac_status" >&5
+  echo "$as_me:18117: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_printf_a_format=yes
 else
@@ -14792,7 +18127,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14795: result: $bash_cv_printf_a_format" >&5
+echo "$as_me:18130: result: $bash_cv_printf_a_format" >&5
 echo "${ECHO_T}$bash_cv_printf_a_format" >&6
 if test $bash_cv_printf_a_format = yes; then
 cat >>confdefs.h <<\EOF
@@ -14801,19 +18136,19 @@ EOF
 
 fi
 
-echo "$as_me:14804: checking if signal handlers must be reinstalled when invoked" >&5
+echo "$as_me:18139: checking if signal handlers must be reinstalled when invoked" >&5
 echo $ECHO_N "checking if signal handlers must be reinstalled when invoked... $ECHO_C" >&6
 if test "${bash_cv_must_reinstall_sighandlers+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14810: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&5
+  { echo "$as_me:18145: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&5
 echo "$as_me: WARNING: cannot check signal handling if cross compiling -- defaulting to no" >&2;}
     bash_cv_must_reinstall_sighandlers=no
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14816 "configure"
+#line 18151 "configure"
 #include "confdefs.h"
 
 #include <signal.h>
@@ -14861,15 +18196,15 @@ main()
 
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14864: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18199: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14867: \$? = $ac_status" >&5
+  echo "$as_me:18202: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14869: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18204: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14872: \$? = $ac_status" >&5
+  echo "$as_me:18207: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_must_reinstall_sighandlers=no
 else
@@ -14882,7 +18217,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14885: result: $bash_cv_must_reinstall_sighandlers" >&5
+echo "$as_me:18220: result: $bash_cv_must_reinstall_sighandlers" >&5
 echo "${ECHO_T}$bash_cv_must_reinstall_sighandlers" >&6
 if test $bash_cv_must_reinstall_sighandlers = yes; then
 cat >>confdefs.h <<\EOF
@@ -14891,19 +18226,19 @@ EOF
 
 fi
 
-echo "$as_me:14894: checking for presence of necessary job control definitions" >&5
+echo "$as_me:18229: checking for presence of necessary job control definitions" >&5
 echo $ECHO_N "checking for presence of necessary job control definitions... $ECHO_C" >&6
 if test "${bash_cv_job_control_missing+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14900: WARNING: cannot check job control if cross-compiling -- defaulting to missing" >&5
+  { echo "$as_me:18235: WARNING: cannot check job control if cross-compiling -- defaulting to missing" >&5
 echo "$as_me: WARNING: cannot check job control if cross-compiling -- defaulting to missing" >&2;}
      bash_cv_job_control_missing=missing
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14906 "configure"
+#line 18241 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -14951,15 +18286,15 @@ exit(0);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:14954: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18289: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:14957: \$? = $ac_status" >&5
+  echo "$as_me:18292: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:14959: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18294: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:14962: \$? = $ac_status" >&5
+  echo "$as_me:18297: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_job_control_missing=present
 else
@@ -14972,7 +18307,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:14975: result: $bash_cv_job_control_missing" >&5
+echo "$as_me:18310: result: $bash_cv_job_control_missing" >&5
 echo "${ECHO_T}$bash_cv_job_control_missing" >&6
 if test $bash_cv_job_control_missing = missing; then
 cat >>confdefs.h <<\EOF
@@ -14981,19 +18316,19 @@ EOF
 
 fi
 
-echo "$as_me:14984: checking for presence of named pipes" >&5
+echo "$as_me:18319: checking for presence of named pipes" >&5
 echo $ECHO_N "checking for presence of named pipes... $ECHO_C" >&6
 if test "${bash_cv_sys_named_pipes+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:14990: WARNING: cannot check for named pipes if cross-compiling -- defaulting to missing" >&5
+  { echo "$as_me:18325: WARNING: cannot check for named pipes if cross-compiling -- defaulting to missing" >&5
 echo "$as_me: WARNING: cannot check for named pipes if cross-compiling -- defaulting to missing" >&2;}
      bash_cv_sys_named_pipes=missing
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 14996 "configure"
+#line 18331 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -15035,15 +18370,15 @@ exit(0);
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:15038: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18373: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:15041: \$? = $ac_status" >&5
+  echo "$as_me:18376: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:15043: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18378: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15046: \$? = $ac_status" >&5
+  echo "$as_me:18381: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_sys_named_pipes=present
 else
@@ -15056,7 +18391,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:15059: result: $bash_cv_sys_named_pipes" >&5
+echo "$as_me:18394: result: $bash_cv_sys_named_pipes" >&5
 echo "${ECHO_T}$bash_cv_sys_named_pipes" >&6
 if test $bash_cv_sys_named_pipes = missing; then
 cat >>confdefs.h <<\EOF
@@ -15065,13 +18400,13 @@ EOF
 
 fi
 
-echo "$as_me:15068: checking POSIX termios" >&5
+echo "$as_me:18403: checking POSIX termios" >&5
 echo $ECHO_N "checking POSIX termios... $ECHO_C" >&6
 if test "${ac_cv_sys_posix_termios+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15074 "configure"
+#line 18409 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <unistd.h>
@@ -15086,16 +18421,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:15089: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18424: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:15092: \$? = $ac_status" >&5
+  echo "$as_me:18427: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:15095: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18430: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15098: \$? = $ac_status" >&5
+  echo "$as_me:18433: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_sys_posix_termios=yes
 else
@@ -15105,17 +18440,17 @@ ac_cv_sys_posix_termios=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:15108: result: $ac_cv_sys_posix_termios" >&5
+echo "$as_me:18443: result: $ac_cv_sys_posix_termios" >&5
 echo "${ECHO_T}$ac_cv_sys_posix_termios" >&6
 
 if test $ac_cv_sys_posix_termios = yes; then
-  echo "$as_me:15112: checking whether termios.h defines TIOCGWINSZ" >&5
+  echo "$as_me:18447: checking whether termios.h defines TIOCGWINSZ" >&5
 echo $ECHO_N "checking whether termios.h defines TIOCGWINSZ... $ECHO_C" >&6
 if test "${ac_cv_sys_tiocgwinsz_in_termios_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15118 "configure"
+#line 18453 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <termios.h>
 rm -f conftest*
 
 fi
-echo "$as_me:15136: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5
+echo "$as_me:18471: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5
 echo "${ECHO_T}$ac_cv_sys_tiocgwinsz_in_termios_h" >&6
 
 fi
 if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then
-  echo "$as_me:15141: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5
+  echo "$as_me:18476: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5
 echo $ECHO_N "checking whether sys/ioctl.h defines TIOCGWINSZ... $ECHO_C" >&6
 if test "${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15147 "configure"
+#line 18482 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/ioctl.h>
@@ -15162,7 +18497,7 @@ fi
 rm -f conftest*
 
 fi
-echo "$as_me:15165: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5
+echo "$as_me:18500: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5
 echo "${ECHO_T}$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6
 
   if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then
@@ -15174,13 +18509,13 @@ EOF
   fi
 fi
 
-echo "$as_me:15177: checking for TIOCSTAT in sys/ioctl.h" >&5
+echo "$as_me:18512: checking for TIOCSTAT in sys/ioctl.h" >&5
 echo $ECHO_N "checking for TIOCSTAT in sys/ioctl.h... $ECHO_C" >&6
 if test "${bash_cv_tiocstat_in_ioctl+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15183 "configure"
+#line 18518 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/ioctl.h>
@@ -15193,16 +18528,16 @@ int x = TIOCSTAT;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:15196: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:18531: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:15199: \$? = $ac_status" >&5
+  echo "$as_me:18534: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:15202: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18537: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15205: \$? = $ac_status" >&5
+  echo "$as_me:18540: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_tiocstat_in_ioctl=yes
 else
@@ -15213,7 +18548,7 @@ fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
 
-echo "$as_me:15216: result: $bash_cv_tiocstat_in_ioctl" >&5
+echo "$as_me:18551: result: $bash_cv_tiocstat_in_ioctl" >&5
 echo "${ECHO_T}$bash_cv_tiocstat_in_ioctl" >&6
 if test $bash_cv_tiocstat_in_ioctl = yes; then
 cat >>confdefs.h <<\EOF
@@ -15222,13 +18557,13 @@ EOF
 
 fi
 
-echo "$as_me:15225: checking for FIONREAD in sys/ioctl.h" >&5
+echo "$as_me:18560: checking for FIONREAD in sys/ioctl.h" >&5
 echo $ECHO_N "checking for FIONREAD in sys/ioctl.h... $ECHO_C" >&6
 if test "${bash_cv_fionread_in_ioctl+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15231 "configure"
+#line 18566 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/ioctl.h>
@@ -15241,16 +18576,16 @@ int x = FIONREAD;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:15244: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:18579: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:15247: \$? = $ac_status" >&5
+  echo "$as_me:18582: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:15250: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18585: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15253: \$? = $ac_status" >&5
+  echo "$as_me:18588: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_fionread_in_ioctl=yes
 else
@@ -15261,7 +18596,7 @@ fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
 
-echo "$as_me:15264: result: $bash_cv_fionread_in_ioctl" >&5
+echo "$as_me:18599: result: $bash_cv_fionread_in_ioctl" >&5
 echo "${ECHO_T}$bash_cv_fionread_in_ioctl" >&6
 if test $bash_cv_fionread_in_ioctl = yes; then
 cat >>confdefs.h <<\EOF
@@ -15270,13 +18605,13 @@ EOF
 
 fi
 
-echo "$as_me:15273: checking for speed_t in sys/types.h" >&5
+echo "$as_me:18608: checking for speed_t in sys/types.h" >&5
 echo $ECHO_N "checking for speed_t in sys/types.h... $ECHO_C" >&6
 if test "${bash_cv_speed_t_in_sys_types+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15279 "configure"
+#line 18614 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 int
@@ -15288,16 +18623,16 @@ speed_t x;
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:15291: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:18626: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:15294: \$? = $ac_status" >&5
+  echo "$as_me:18629: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:15297: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18632: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15300: \$? = $ac_status" >&5
+  echo "$as_me:18635: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_speed_t_in_sys_types=yes
 else
@@ -15308,7 +18643,7 @@ fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
 
-echo "$as_me:15311: result: $bash_cv_speed_t_in_sys_types" >&5
+echo "$as_me:18646: result: $bash_cv_speed_t_in_sys_types" >&5
 echo "${ECHO_T}$bash_cv_speed_t_in_sys_types" >&6
 if test $bash_cv_speed_t_in_sys_types = yes; then
 cat >>confdefs.h <<\EOF
@@ -15317,13 +18652,13 @@ EOF
 
 fi
 
-echo "$as_me:15320: checking whether getpw functions are declared in pwd.h" >&5
+echo "$as_me:18655: checking whether getpw functions are declared in pwd.h" >&5
 echo $ECHO_N "checking whether getpw functions are declared in pwd.h... $ECHO_C" >&6
 if test "${bash_cv_getpw_declared+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15326 "configure"
+#line 18661 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -15343,7 +18678,7 @@ rm -f conftest*
 
 fi
 
-echo "$as_me:15346: result: $bash_cv_getpw_declared" >&5
+echo "$as_me:18681: result: $bash_cv_getpw_declared" >&5
 echo "${ECHO_T}$bash_cv_getpw_declared" >&6
 if test $bash_cv_getpw_declared = yes; then
 cat >>confdefs.h <<\EOF
@@ -15352,19 +18687,19 @@ EOF
 
 fi
 
-echo "$as_me:15355: checking for unusable real-time signals due to large values" >&5
+echo "$as_me:18690: checking for unusable real-time signals due to large values" >&5
 echo $ECHO_N "checking for unusable real-time signals due to large values... $ECHO_C" >&6
 if test "${bash_cv_unusable_rtsigs+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  { echo "$as_me:15361: WARNING: cannot check real-time signals if cross compiling -- defaulting to yes" >&5
+  { echo "$as_me:18696: WARNING: cannot check real-time signals if cross compiling -- defaulting to yes" >&5
 echo "$as_me: WARNING: cannot check real-time signals if cross compiling -- defaulting to yes" >&2;}
      bash_cv_unusable_rtsigs=yes
 
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15367 "configure"
+#line 18702 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -15387,15 +18722,15 @@ main ()
 }
 _ACEOF
 rm -f conftest$ac_exeext
-if { (eval echo "$as_me:15390: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18725: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:15393: \$? = $ac_status" >&5
+  echo "$as_me:18728: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (eval echo "$as_me:15395: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18730: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15398: \$? = $ac_status" >&5
+  echo "$as_me:18733: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_unusable_rtsigs=yes
 else
@@ -15408,7 +18743,7 @@ rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 
-echo "$as_me:15411: result: $bash_cv_unusable_rtsigs" >&5
+echo "$as_me:18746: result: $bash_cv_unusable_rtsigs" >&5
 echo "${ECHO_T}$bash_cv_unusable_rtsigs" >&6
 if test $bash_cv_unusable_rtsigs = yes; then
 cat >>confdefs.h <<\EOF
@@ -15424,13 +18759,13 @@ else
 fi
 
 case "$host_os" in
-hpux*) echo "$as_me:15427: checking whether $host_os needs _KERNEL for RLIMIT defines" >&5
+hpux*) echo "$as_me:18762: checking whether $host_os needs _KERNEL for RLIMIT defines" >&5
 echo $ECHO_N "checking whether $host_os needs _KERNEL for RLIMIT defines... $ECHO_C" >&6
 if test "${bash_cv_kernel_rlimit+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15433 "configure"
+#line 18768 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -15448,23 +18783,23 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:15451: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:18786: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:15454: \$? = $ac_status" >&5
+  echo "$as_me:18789: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:15457: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18792: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15460: \$? = $ac_status" >&5
+  echo "$as_me:18795: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_kernel_rlimit=no
 else
   echo "$as_me: failed program was:" >&5
 cat conftest.$ac_ext >&5
 cat >conftest.$ac_ext <<_ACEOF
-#line 15467 "configure"
+#line 18802 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -15484,16 +18819,16 @@ main ()
 }
 _ACEOF
 rm -f conftest.$ac_objext
-if { (eval echo "$as_me:15487: \"$ac_compile\"") >&5
+if { (eval echo "$as_me:18822: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:15490: \$? = $ac_status" >&5
+  echo "$as_me:18825: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:15493: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18828: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15496: \$? = $ac_status" >&5
+  echo "$as_me:18831: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   bash_cv_kernel_rlimit=yes
 else
@@ -15507,7 +18842,7 @@ fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 fi
 
-echo "$as_me:15510: result: $bash_cv_kernel_rlimit" >&5
+echo "$as_me:18845: result: $bash_cv_kernel_rlimit" >&5
 echo "${ECHO_T}$bash_cv_kernel_rlimit" >&6
 if test $bash_cv_kernel_rlimit = yes; then
 cat >>confdefs.h <<\EOF
@@ -15526,20 +18861,20 @@ esac
 if test "X$bash_cv_termcap_lib" = "X"; then
 _bash_needmsg=yes
 else
-echo "$as_me:15529: checking which library has the termcap functions" >&5
+echo "$as_me:18864: checking which library has the termcap functions" >&5
 echo $ECHO_N "checking which library has the termcap functions... $ECHO_C" >&6
 _bash_needmsg=
 fi
 if test "${bash_cv_termcap_lib+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  echo "$as_me:15536: checking for tgetent" >&5
+  echo "$as_me:18871: checking for tgetent" >&5
 echo $ECHO_N "checking for tgetent... $ECHO_C" >&6
 if test "${ac_cv_func_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
-#line 15542 "configure"
+#line 18877 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char tgetent (); below.  */
@@ -15570,16 +18905,16 @@ f = tgetent;
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:15573: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18908: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:15576: \$? = $ac_status" >&5
+  echo "$as_me:18911: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:15579: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18914: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15582: \$? = $ac_status" >&5
+  echo "$as_me:18917: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_func_tgetent=yes
 else
@@ -15589,12 +18924,12 @@ ac_cv_func_tgetent=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 fi
-echo "$as_me:15592: result: $ac_cv_func_tgetent" >&5
+echo "$as_me:18927: result: $ac_cv_func_tgetent" >&5
 echo "${ECHO_T}$ac_cv_func_tgetent" >&6
 if test $ac_cv_func_tgetent = yes; then
   bash_cv_termcap_lib=libc
 else
-  echo "$as_me:15597: checking for tgetent in -ltermcap" >&5
+  echo "$as_me:18932: checking for tgetent in -ltermcap" >&5
 echo $ECHO_N "checking for tgetent in -ltermcap... $ECHO_C" >&6
 if test "${ac_cv_lib_termcap_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15602,7 +18937,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ltermcap  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 15605 "configure"
+#line 18940 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -15621,16 +18956,16 @@ tgetent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:15624: \"$ac_link\"") >&5
+if { (eval echo "$as_me:18959: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:15627: \$? = $ac_status" >&5
+  echo "$as_me:18962: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:15630: \"$ac_try\"") >&5
+  { (eval echo "$as_me:18965: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15633: \$? = $ac_status" >&5
+  echo "$as_me:18968: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_termcap_tgetent=yes
 else
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:15644: result: $ac_cv_lib_termcap_tgetent" >&5
+echo "$as_me:18979: result: $ac_cv_lib_termcap_tgetent" >&5
 echo "${ECHO_T}$ac_cv_lib_termcap_tgetent" >&6
 if test $ac_cv_lib_termcap_tgetent = yes; then
   bash_cv_termcap_lib=libtermcap
 else
-  echo "$as_me:15649: checking for tgetent in -ltinfo" >&5
+  echo "$as_me:18984: checking for tgetent in -ltinfo" >&5
 echo $ECHO_N "checking for tgetent in -ltinfo... $ECHO_C" >&6
 if test "${ac_cv_lib_tinfo_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15654,7 +18989,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ltinfo  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 15657 "configure"
+#line 18992 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -15673,16 +19008,16 @@ tgetent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:15676: \"$ac_link\"") >&5
+if { (eval echo "$as_me:19011: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:15679: \$? = $ac_status" >&5
+  echo "$as_me:19014: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:15682: \"$ac_try\"") >&5
+  { (eval echo "$as_me:19017: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15685: \$? = $ac_status" >&5
+  echo "$as_me:19020: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_tinfo_tgetent=yes
 else
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:15696: result: $ac_cv_lib_tinfo_tgetent" >&5
+echo "$as_me:19031: result: $ac_cv_lib_tinfo_tgetent" >&5
 echo "${ECHO_T}$ac_cv_lib_tinfo_tgetent" >&6
 if test $ac_cv_lib_tinfo_tgetent = yes; then
   bash_cv_termcap_lib=libtinfo
 else
-  echo "$as_me:15701: checking for tgetent in -lcurses" >&5
+  echo "$as_me:19036: checking for tgetent in -lcurses" >&5
 echo $ECHO_N "checking for tgetent in -lcurses... $ECHO_C" >&6
 if test "${ac_cv_lib_curses_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15706,7 +19041,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lcurses  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 15709 "configure"
+#line 19044 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -15725,16 +19060,16 @@ tgetent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:15728: \"$ac_link\"") >&5
+if { (eval echo "$as_me:19063: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:15731: \$? = $ac_status" >&5
+  echo "$as_me:19066: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:15734: \"$ac_try\"") >&5
+  { (eval echo "$as_me:19069: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15737: \$? = $ac_status" >&5
+  echo "$as_me:19072: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_curses_tgetent=yes
 else
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:15748: result: $ac_cv_lib_curses_tgetent" >&5
+echo "$as_me:19083: result: $ac_cv_lib_curses_tgetent" >&5
 echo "${ECHO_T}$ac_cv_lib_curses_tgetent" >&6
 if test $ac_cv_lib_curses_tgetent = yes; then
   bash_cv_termcap_lib=libcurses
 else
-  echo "$as_me:15753: checking for tgetent in -lncurses" >&5
+  echo "$as_me:19088: checking for tgetent in -lncurses" >&5
 echo $ECHO_N "checking for tgetent in -lncurses... $ECHO_C" >&6
 if test "${ac_cv_lib_ncurses_tgetent+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15758,7 +19093,7 @@ else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lncurses  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
-#line 15761 "configure"
+#line 19096 "configure"
 #include "confdefs.h"
 
 /* Override any gcc2 internal prototype to avoid an error.  */
@@ -15777,16 +19112,16 @@ tgetent ();
 }
 _ACEOF
 rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:15780: \"$ac_link\"") >&5
+if { (eval echo "$as_me:19115: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:15783: \$? = $ac_status" >&5
+  echo "$as_me:19118: \$? = $ac_status" >&5
   (exit $ac_status); } &&
          { ac_try='test -s conftest$ac_exeext'
-  { (eval echo "$as_me:15786: \"$ac_try\"") >&5
+  { (eval echo "$as_me:19121: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
-  echo "$as_me:15789: \$? = $ac_status" >&5
+  echo "$as_me:19124: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_lib_ncurses_tgetent=yes
 else
@@ -15797,7 +19132,7 @@ fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-echo "$as_me:15800: result: $ac_cv_lib_ncurses_tgetent" >&5
+echo "$as_me:19135: result: $ac_cv_lib_ncurses_tgetent" >&5
 echo "${ECHO_T}$ac_cv_lib_ncurses_tgetent" >&6
 if test $ac_cv_lib_ncurses_tgetent = yes; then
   bash_cv_termcap_lib=libncurses
 fi
 
 if test "X$_bash_needmsg" = "Xyes"; then
-echo "$as_me:15819: checking which library has the termcap functions" >&5
+echo "$as_me:19154: checking which library has the termcap functions" >&5
 echo $ECHO_N "checking which library has the termcap functions... $ECHO_C" >&6
 fi
-echo "$as_me:15822: result: using $bash_cv_termcap_lib" >&5
+echo "$as_me:19157: result: using $bash_cv_termcap_lib" >&5
 echo "${ECHO_T}using $bash_cv_termcap_lib" >&6
 if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then
 LDFLAGS="$LDFLAGS -L./lib/termcap"
@@ -15844,7 +19179,7 @@ fi
 
 fi
 
-echo "$as_me:15847: checking whether /dev/fd is available" >&5
+echo "$as_me:19182: checking whether /dev/fd is available" >&5
 echo $ECHO_N "checking whether /dev/fd is available... $ECHO_C" >&6
 if test "${bash_cv_dev_fd+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15859,7 +19194,7 @@ else
 
 fi
 
-echo "$as_me:15862: result: $bash_cv_dev_fd" >&5
+echo "$as_me:19197: result: $bash_cv_dev_fd" >&5
 echo "${ECHO_T}$bash_cv_dev_fd" >&6
 if test $bash_cv_dev_fd = "standard"; then
   cat >>confdefs.h <<\EOF
@@ -15881,7 +19216,7 @@ EOF
 
 fi
 
-echo "$as_me:15884: checking whether /dev/stdin stdout stderr are available" >&5
+echo "$as_me:19219: checking whether /dev/stdin stdout stderr are available" >&5
 echo $ECHO_N "checking whether /dev/stdin stdout stderr are available... $ECHO_C" >&6
 if test "${bash_cv_dev_stdin+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15896,7 +19231,7 @@ else
 
 fi
 
-echo "$as_me:15899: result: $bash_cv_dev_stdin" >&5
+echo "$as_me:19234: result: $bash_cv_dev_stdin" >&5
 echo "${ECHO_T}$bash_cv_dev_stdin" >&6
 if test $bash_cv_dev_stdin = "present"; then
   cat >>confdefs.h <<\EOF
@@ -15905,7 +19240,7 @@ EOF
 
 fi
 
-echo "$as_me:15908: checking for default mail directory" >&5
+echo "$as_me:19243: checking for default mail directory" >&5
 echo $ECHO_N "checking for default mail directory... $ECHO_C" >&6
 if test "${bash_cv_mail_dir+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -15924,7 +19259,7 @@ else
 
 fi
 
-echo "$as_me:15927: result: $bash_cv_mail_dir" >&5
+echo "$as_me:19262: result: $bash_cv_mail_dir" >&5
 echo "${ECHO_T}$bash_cv_mail_dir" >&6
 cat >>confdefs.h <<EOF
 #define DEFAULT_MAIL_DIRECTORY "$bash_cv_mail_dir"
@@ -16015,11 +19350,11 @@ esac
 #
 if test "$ac_cv_func_dlopen" = "yes" && test -f ${srcdir}/support/shobj-conf
 then
-       echo "$as_me:16018: checking shared object configuration for loadable builtins" >&5
+       echo "$as_me:19353: checking shared object configuration for loadable builtins" >&5
 echo $ECHO_N "checking shared object configuration for loadable builtins... $ECHO_C" >&6
        eval `${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C "${CC}" -c "${host_cpu}" -o "${host_os}" -v "${host_vendor}"`
 
-       echo "$as_me:16022: result: $SHOBJ_STATUS" >&5
+       echo "$as_me:19357: result: $SHOBJ_STATUS" >&5
 echo "${ECHO_T}$SHOBJ_STATUS" >&6
 fi
 
@@ -16043,7 +19378,7 @@ BUILD_DIR=`pwd`
 #AC_SUBST(ALLOCA_SOURCE)
 #AC_SUBST(ALLOCA_OBJECT)
 
-ac_config_files="$ac_config_files Makefile builtins/Makefile lib/readline/Makefile lib/glob/Makefile lib/malloc/Makefile lib/sh/Makefile lib/termcap/Makefile lib/tilde/Makefile doc/Makefile support/Makefile examples/loadables/Makefile examples/loadables/perl/Makefile pathnames.h"
+ac_config_files="$ac_config_files Makefile builtins/Makefile lib/readline/Makefile lib/glob/Makefile lib/intl/Makefile lib/malloc/Makefile lib/sh/Makefile lib/termcap/Makefile lib/tilde/Makefile doc/Makefile support/Makefile po/Makefile.in examples/loadables/Makefile examples/loadables/perl/Makefile pathnames.h"
 ac_config_commands="$ac_config_commands default"
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -16124,7 +19459,7 @@ DEFS=-DHAVE_CONFIG_H
 : ${CONFIG_STATUS=./config.status}
 ac_clean_files_save=$ac_clean_files
 ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:16127: creating $CONFIG_STATUS" >&5
+{ echo "$as_me:19462: creating $CONFIG_STATUS" >&5
 echo "$as_me: creating $CONFIG_STATUS" >&6;}
 cat >$CONFIG_STATUS <<_ACEOF
 #! $SHELL
@@ -16300,7 +19635,7 @@ cat >>$CONFIG_STATUS <<\EOF
     echo "$ac_cs_version"; exit 0 ;;
   --he | --h)
     # Conflict between --help and --header
-    { { echo "$as_me:16303: error: ambiguous option: $1
+    { { echo "$as_me:19638: error: ambiguous option: $1
 Try \`$0 --help' for more information." >&5
 echo "$as_me: error: ambiguous option: $1
 Try \`$0 --help' for more information." >&2;}
@@ -16319,7 +19654,7 @@ Try \`$0 --help' for more information." >&2;}
     ac_need_defaults=false;;
 
   # This is an error.
-  -*) { { echo "$as_me:16322: error: unrecognized option: $1
+  -*) { { echo "$as_me:19657: error: unrecognized option: $1
 Try \`$0 --help' for more information." >&5
 echo "$as_me: error: unrecognized option: $1
 Try \`$0 --help' for more information." >&2;}
@@ -16349,6 +19684,20 @@ on `(hostname || uname -n) 2>/dev/null | sed 1q`
 _ACEOF
 EOF
 
+cat >>$CONFIG_STATUS <<EOF
+#
+# INIT-COMMANDS section.
+#
+
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
+    # from automake.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+
+EOF
+
 cat >>$CONFIG_STATUS <<\EOF
 for ac_config_target in $ac_config_targets
 do
   "builtins/Makefile" ) CONFIG_FILES="$CONFIG_FILES builtins/Makefile" ;;
   "lib/readline/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/readline/Makefile" ;;
   "lib/glob/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/glob/Makefile" ;;
+  "lib/intl/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/intl/Makefile" ;;
   "lib/malloc/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/malloc/Makefile" ;;
   "lib/sh/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/sh/Makefile" ;;
   "lib/termcap/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/termcap/Makefile" ;;
   "lib/tilde/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/tilde/Makefile" ;;
   "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
   "support/Makefile" ) CONFIG_FILES="$CONFIG_FILES support/Makefile" ;;
+  "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
   "examples/loadables/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/loadables/Makefile" ;;
   "examples/loadables/perl/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/loadables/perl/Makefile" ;;
   "pathnames.h" ) CONFIG_FILES="$CONFIG_FILES pathnames.h" ;;
+  "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
   "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
   "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-  *) { { echo "$as_me:16372: error: invalid argument: $ac_config_target" >&5
+  *) { { echo "$as_me:19724: error: invalid argument: $ac_config_target" >&5
 echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
    { (exit 1); exit 1; }; };;
   esac
@@ -16508,8 +19860,32 @@ s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
 s,@YACC@,$YACC,;t t
 s,@SET_MAKE@,$SET_MAKE,;t t
 s,@MAKE_SHELL@,$MAKE_SHELL,;t t
+s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t
+s,@USE_NLS@,$USE_NLS,;t t
+s,@MSGFMT@,$MSGFMT,;t t
+s,@GMSGFMT@,$GMSGFMT,;t t
+s,@XGETTEXT@,$XGETTEXT,;t t
+s,@MSGMERGE@,$MSGMERGE,;t t
 s,@ALLOCA@,$ALLOCA,;t t
+s,@GLIBC21@,$GLIBC21,;t t
+s,@LIBICONV@,$LIBICONV,;t t
+s,@LTLIBICONV@,$LTLIBICONV,;t t
+s,@INTLBISON@,$INTLBISON,;t t
+s,@BUILD_INCLUDED_LIBINTL@,$BUILD_INCLUDED_LIBINTL,;t t
+s,@USE_INCLUDED_LIBINTL@,$USE_INCLUDED_LIBINTL,;t t
+s,@CATOBJEXT@,$CATOBJEXT,;t t
+s,@DATADIRNAME@,$DATADIRNAME,;t t
+s,@INSTOBJEXT@,$INSTOBJEXT,;t t
+s,@GENCAT@,$GENCAT,;t t
+s,@INTLOBJS@,$INTLOBJS,;t t
+s,@INTL_LIBTOOL_SUFFIX_PREFIX@,$INTL_LIBTOOL_SUFFIX_PREFIX,;t t
+s,@INTLLIBS@,$INTLLIBS,;t t
+s,@LIBINTL@,$LIBINTL,;t t
+s,@LTLIBINTL@,$LTLIBINTL,;t t
+s,@POSUB@,$POSUB,;t t
 s,@LIBOBJS@,$LIBOBJS,;t t
+s,@INTL_DEP@,$INTL_DEP,;t t
+s,@INTL_INC@,$INTL_INC,;t t
 s,@SIGLIST_O@,$SIGLIST_O,;t t
 s,@TERMCAP_LIB@,$TERMCAP_LIB,;t t
 s,@TERMCAP_DEP@,$TERMCAP_DEP,;t t
@@ -16647,7 +20023,7 @@ done; }
   esac
 
   if test x"$ac_file" != x-; then
-    { echo "$as_me:16650: creating $ac_file" >&5
+    { echo "$as_me:20026: creating $ac_file" >&5
 echo "$as_me: creating $ac_file" >&6;}
     rm -f "$ac_file"
   fi
@@ -16665,7 +20041,7 @@ echo "$as_me: creating $ac_file" >&6;}
       -) echo $tmp/stdin ;;
       [\\/$]*)
          # Absolute (can't be DOS-style, as IFS=:)
-         test -f "$f" || { { echo "$as_me:16668: error: cannot find input file: $f" >&5
+         test -f "$f" || { { echo "$as_me:20044: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
          echo $f;;
@@ -16678,7 +20054,7 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
            echo $srcdir/$f
          else
            # /dev/null tree
-           { { echo "$as_me:16681: error: cannot find input file: $f" >&5
+           { { echo "$as_me:20057: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
          fi;;
@@ -16739,7 +20115,7 @@ for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
   * )   ac_file_in=$ac_file.in ;;
   esac
 
-  test x"$ac_file" != x- && { echo "$as_me:16742: creating $ac_file" >&5
+  test x"$ac_file" != x- && { echo "$as_me:20118: creating $ac_file" >&5
 echo "$as_me: creating $ac_file" >&6;}
 
   # First look for the input files in the build tree, otherwise in the
@@ -16750,7 +20126,7 @@ echo "$as_me: creating $ac_file" >&6;}
       -) echo $tmp/stdin ;;
       [\\/$]*)
          # Absolute (can't be DOS-style, as IFS=:)
-         test -f "$f" || { { echo "$as_me:16753: error: cannot find input file: $f" >&5
+         test -f "$f" || { { echo "$as_me:20129: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
          echo $f;;
@@ -16763,7 +20139,7 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
            echo $srcdir/$f
          else
            # /dev/null tree
-           { { echo "$as_me:16766: error: cannot find input file: $f" >&5
+           { { echo "$as_me:20142: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
          fi;;
@@ -16880,7 +20256,7 @@ cat >>$CONFIG_STATUS <<\EOF
   rm -f $tmp/in
   if test x"$ac_file" != x-; then
     if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
-      { echo "$as_me:16883: $ac_file is unchanged" >&5
+      { echo "$as_me:20259: $ac_file is unchanged" >&5
 echo "$as_me: $ac_file is unchanged" >&6;}
     else
       ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
@@ -16931,6 +20307,107 @@ for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
   ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
 
   case $ac_dest in
+    default-1 )
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[  ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assigment from automake.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          GMOFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done ;;
     default )
 # Makefile uses this timestamp file to record whether config.h is up to date.
 echo timestamp > stamp-h
index f5f4c22..1b20853 100644 (file)
@@ -1,5 +1,5 @@
 dnl
-dnl Configure script for bash-2.05
+dnl Configure script for bash-3.0
 dnl
 dnl report bugs to chet@po.cwru.edu
 dnl
@@ -22,7 +22,7 @@ dnl Process this file with autoconf to produce a configure script.
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 # 02111-1307, USA.
 
-AC_REVISION([for Bash 3.0, version 3.154, from autoconf version] AC_ACVERSION)dnl
+AC_REVISION([for Bash 3.0, version 3.159, from autoconf version] AC_ACVERSION)dnl
 
 define(bashvers, 3.0)
 define(relstatus, alpha)
@@ -555,6 +555,9 @@ AC_C_LONG_DOUBLE
 AC_C_PROTOTYPES
 AC_C_CHAR_UNSIGNED
 
+dnl initialize GNU gettext
+AM_GNU_GETTEXT([no-libtool], [need-ngettext], [lib/intl])
+
 dnl header files
 AC_HEADER_DIRENT
 AC_HEADER_TIME
@@ -565,8 +568,8 @@ AC_CHECK_HEADERS(unistd.h stdlib.h stdarg.h varargs.h limits.h string.h \
                 memory.h locale.h termcap.h termio.h termios.h dlfcn.h \
                 stddef.h stdint.h netdb.h grp.h strings.h regex.h)
 AC_CHECK_HEADERS(sys/ptem.h sys/pte.h sys/stream.h sys/select.h sys/file.h \
-                sys/resource.h sys/param.h sys/socket.h \
-                sys/time.h sys/times.h sys/wait.h)
+                sys/resource.h sys/param.h sys/socket.h sys/stat.h \
+                sys/time.h sys/times.h sys/types.h sys/wait.h)
 AC_CHECK_HEADERS(netinet/in.h arpa/inet.h)
 
 dnl special checks for libc functions
@@ -664,18 +667,29 @@ BASH_CHECK_DECL(strtoumax)
 
 AC_FUNC_MKTIME
 
-dnl checks for locale functions
-AC_CHECK_HEADERS(libintl.h)
-AC_CHECK_FUNCS(gettext textdomain bindtextdomain)
+dnl
+dnl Checks for lib/intl and related code (uses some of the output from
+dnl AM_GNU_GETTEXT)
+dnl
 
-dnl check for GNU libintl if gettext/textdomain/bindtextdomain
-dnl are not found in libc
-if test "$ac_cv_func_bindtextdomain" = "no"; then
-    AC_CHECK_LIB(intl,bindtextdomain)
-    if test "$ac_cv_lib_intl" = "yes"; then
-       AC_CHECK_FUNCS(gettext textdomain bindtextdomain)
-    fi
+AC_CHECK_HEADERS([argz.h errno.h fcntl.h malloc.h stdio_ext.h])
+
+AC_FUNC_MALLOC
+AC_FUNC_MMAP
+AC_CHECK_FUNCS([__argz_count __argz_next __argz_stringify dcgettext mempcpy \
+               munmap stpcpy strcspn strdup])
+
+INTL_DEP= INTL_INC=
+if test "x$USE_INCLUDED_LIBINTL" = "xyes"; then
+       INTL_DEP='${INTL_LIBDIR}/libintl.a'
+       INTL_INC='-I${INTL_LIBSRC}'
 fi
+AC_SUBST(INTL_DEP)
+AC_SUBST(INTL_INC)
+
+dnl
+dnl End of checks needed by files in lib/intl
+dnl
 
 BASH_CHECK_MULTIBYTE
 
@@ -1003,8 +1017,9 @@ AC_SUBST(LOCAL_DEFS)
 #AC_SUBST(ALLOCA_OBJECT)
 
 AC_OUTPUT([Makefile builtins/Makefile lib/readline/Makefile lib/glob/Makefile \
+         lib/intl/Makefile \
          lib/malloc/Makefile lib/sh/Makefile lib/termcap/Makefile \
-         lib/tilde/Makefile doc/Makefile support/Makefile \
+         lib/tilde/Makefile doc/Makefile support/Makefile po/Makefile.in \
          examples/loadables/Makefile examples/loadables/perl/Makefile \
          pathnames.h],
 [
diff --git a/configure.mk b/configure.mk
new file mode 100644 (file)
index 0000000..4a60b59
--- /dev/null
@@ -0,0 +1,3 @@
+# Make sure the first target in the makefile is the right one
+configure:     configure.in aclocal.m4 config.h.in
+       autoconf
index 37ceb2c..d36436c 100644 (file)
@@ -308,7 +308,7 @@ copy_function_def_contents (old, new_def)
      FUNCTION_DEF *old, *new_def;
 {
   new_def->name = copy_word (old->name);
-  new_def->command = copy_command (old->command);
+  new_def->command = old->command ? copy_command (old->command) : old->command;
   new_def->flags = old->flags;
   new_def->line = old->line;
   new_def->source_file = old->source_file ? savestring (old->source_file) : old->source_file;
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/-i b/doc/-i
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/FAQ-2.05a b/doc/FAQ-2.05a
new file mode 100644 (file)
index 0000000..3d96577
--- /dev/null
@@ -0,0 +1,1676 @@
+This is the Bash FAQ, version 3.19, for Bash version 2.05a.
+
+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.05a?
+B2) Are there any user-visible incompatibilities between bash-2.05a 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 `//'?
+
+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 does bash-2.05a 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.05a, first made available on Thursday, 15
+November, 2001.
+
+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.05a:
+
+ftp://ftp.gnu.org/pub/gnu/bash/bash-2.05a.tar.gz
+ftp://ftp.cwru.edu/pub/bash/bash-2.05a.tar.gz
+
+Formatted versions of the documentation are available with the URLs:
+
+ftp://ftp.gnu.org/pub/gnu/bash/bash-doc-2.05a.tar.gz
+ftp://ftp.cwru.edu/pub/bash/bash-doc-2.05a.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.05a 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 ] && 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/
+
+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 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 CWRU/POSIX.NOTES in the bash
+distribution.  They are also listed in a section in the Bash
+Reference Manual.
+
+Section B:  The latest version
+
+B1) What's new in version 2.05a?
+
+The raison d'etre for bash-2.05a is to make an intermediate release
+containing principally bug fixes (some very good work was done and
+contributed after bash-2.05 was released) available before I start to
+work on the major new features to be available in the next release
+(bash-2.06 or bash-3.0 or whatever I tag it).  As such, there are
+only a few relatively minor new features.
+
+Bash-2.05a contains the following new features (see the manual page for
+complete descriptions and the CHANGES and NEWS files in the bash-2.05a
+distribution):
+
+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
+
+A short feature history dating from bash-2.0:
+
+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.05a and
+    bash-1.14.7?
+
+There are a few incompatibilities between version 1.14.7 and version 2.05a.
+They are detailed in the file COMPAT in the bash-2.05a distribution.  That
+file is not meant to be all-encompassing; send mail to bash-maintainers@gnu.org
+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
+       `!' 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: <>, &>, >|
+       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 -p/-t.
+                 export -n/-f/-p/name=value, pwd -L/-P,
+                 read -e/-p/-a/-t/-n/-d/-s,
+                 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, 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
+       `!' reserved word
+       arithmetic for command: for ((expr1 ; expr2; expr3 )); do list; done
+       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)
+       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
+
+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/-u/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.05a:
+       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
+       TMOUT is default timeout for `read' and `select'
+       <&N- and >&N- redirections (combination dup and close)
+       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
+
+New things in ksh-93 present in bash-2.05a:
+        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 fc=hist
+$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.05 and later versions have reverted to the bash-2.03 behavior of
+honoring 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'.
+
+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 does bash-2.05a 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.
+
+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.05a)
+associative arrays
+changes to the DEBUG trap to be compatible with ksh93 (which runs the
+trap before each simple command, instead of after each one like previous
+versions)
+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'
+an option to use external files for the long `help' text
+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-2001 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.
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.
diff --git a/doc/FAQ.save b/doc/FAQ.save
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.
diff --git a/doc/Makefile b/doc/Makefile
new file mode 120000 (symlink)
index 0000000..cdc927f
--- /dev/null
@@ -0,0 +1 @@
+/usr/local/build/chet/bash/bash-current/doc/Makefile
\ No newline at end of file
index 2d6667e..23a6a8d 100644 (file)
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
 
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
 #
 SHELL = @MAKE_SHELL@
 RM         = rm -f
diff --git a/doc/article.pdf b/doc/article.pdf
new file mode 100644 (file)
index 0000000..d2aaf9e
Binary files /dev/null and b/doc/article.pdf differ
diff --git a/doc/article.ps b/doc/article.ps
new file mode 100644 (file)
index 0000000..3aadf2f
--- /dev/null
@@ -0,0 +1,1418 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.16.1
+%%CreationDate: Mon Nov 19 13:06:55 2001
+%%DocumentNeededResources: font Times-Bold
+%%+ font Times-Italic
+%%+ font Times-Roman
+%%+ font Courier
+%%DocumentSuppliedResources: procset grops 1.16 1
+%%Pages: 11
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.16 1
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/FL{
+currentgray exch setgray fill setgray
+}bind def
+/BL/fill load def
+/LW/setlinewidth load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Courier
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Courier@0 ENC0/Courier RE/Times-Roman@0 ENC0/Times-Roman RE
+/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 12/Times-Bold@0 SF(Bash \255 The GNU shell*)227.904 123 Q/F1 10
+/Times-Italic@0 SF(Chet Rame)263.85 147 Q(y)-.3 E(Case W)221.72 159 Q
+(estern Reserve Univer)-.92 E(sity)-.1 E -.15(ch)250.425 171 S
+(et@po.cwru.edu).15 E/F2 10/Times-Bold@0 SF 2.5(1. Intr)72 207 R
+(oduction)-.18 E(Bash)97 222.6 Q/F3 10/Times-Roman@0 SF .904
+(is the shell, or command language interpreter)3.404 F 3.404(,t)-.4 G
+.904(hat will appear in the GNU operating system.)-3.404 F 1.075
+(The name is an acron)72 234.6 R 1.075(ym for the \231Bourne-Ag)-.15 F
+1.075(ain SHell\232, a pun on Ste)-.05 F 1.375 -.15(ve B)-.25 H 1.075
+(ourne, the author of the direct).15 F .206(ancestor of the current)72
+246.6 R/F4 8/Times-Roman@0 SF(UNIX)2.706 E F3 2.706<ae73>C(hell)-2.706 E
+F1(/bin/sh)2.706 E F3 2.706(,w)C .205(hich appeared in the Se)-2.706 F
+-.15(ve)-.25 G .205(nth Edition Bell Labs Research v).15 F(er)-.15 E(-)
+-.2 E(sion of)72 258.6 Q/F5 9/Times-Roman@0 SF(UNIX)2.5 E F3(.)A .387
+(Bash is an)97 274.2 R F2(sh)2.887 E F3 .387
+(\255compatible shell that incorporates useful features from the K)B
+.388(orn shell \()-.35 F F2(ksh)A F3 2.888(\)a)C .388(nd the C)-2.888 F
+.023(shell \()72 286.2 R F2(csh)A F3 .023
+(\), described later in this article.)B .022
+(It is ultimately intended to be a conformant implementation of the)
+5.022 F 3.568(IEEE POSIX Shell and Utilities speci\214cation \(IEEE W)72
+298.2 R 3.568(orking Group 1003.2\).)-.8 F 3.569(It of)8.569 F 3.569
+(fers functional)-.25 F(impro)72 310.2 Q -.15(ve)-.15 G(ments o).15 E
+-.15(ve)-.15 G 2.5(rs).15 G 2.5(hf)-2.5 G(or both interacti)-2.5 E .3
+-.15(ve a)-.25 H(nd programming use.).15 E .697
+(While the GNU operating system will most lik)97 325.8 R .697
+(ely include a v)-.1 F .697(ersion of the Berk)-.15 F(ele)-.1 E 3.197
+(ys)-.15 G .696(hell csh, Bash)-3.197 F .015(will be the def)72 337.8 R
+.015(ault shell.)-.1 F(Lik)5.015 E 2.515(eo)-.1 G .015(ther GNU softw)
+-2.515 F .016(are, Bash is quite portable.)-.1 F .016
+(It currently runs on nearly e)5.016 F -.15(ve)-.25 G(ry).15 E -.15(ve)
+72 349.8 S .523(rsion of).15 F F4(UNIX)3.023 E F3 .523(and a fe)3.023 F
+3.023(wo)-.25 G .523
+(ther operating systems \255 an independently-supported port e)-3.023 F
+.523(xists for OS/2, and)-.15 F .706
+(there are rumors of ports to DOS and W)72 361.8 R(indo)-.4 E .706
+(ws NT)-.25 F 5.706(.P)-.74 G .706(orts to)-5.706 F F5(UNIX)3.206 E F3
+(-lik)A 3.206(es)-.1 G .706(ystems such as QNX and Minix)-3.206 F
+(are part of the distrib)72 373.8 Q(ution.)-.2 E .405
+(The original author of Bash w)97 389.4 R .405(as Brian F)-.1 F .405
+(ox, an emplo)-.15 F .405(yee of the Free Softw)-.1 F .405(are F)-.1 F
+2.905(oundation. The)-.15 F(cur)2.905 E(-)-.2 E(rent de)72 401.4 Q -.15
+(ve)-.25 G(loper and maintainer is Chet Rame).15 E 1.3 -.65(y, a v)-.15
+H(olunteer who w).45 E(orks at Case W)-.1 E(estern Reserv)-.8 E 2.5(eU)
+-.15 G(ni)-2.5 E -.15(ve)-.25 G(rsity).15 E(.)-.65 E F2 2.5(2. What')72
+425.4 R 2.5(sP)-.37 G(OSIX, anyway?)-2.5 E F1(POSIX)97 441 Q F3 .343
+(is a name originally coined by Richard Stallman for a f)2.843 F .343
+(amily of open system standards based)-.1 F(on)72 453 Q F5(UNIX)3.24 E
+F3 5.74(.T)C .74(here are a number of aspects of)-5.74 F F5(UNIX)3.24 E
+F3 .74(under consideration for standardization, from the basic)3.24 F
+.192(system services at the system call and C library le)72 465 R -.15
+(ve)-.25 G 2.692(lt).15 G 2.692(oa)-2.692 G .192
+(pplications and tools to system administration and)-2.692 F 2.5
+(management. Each)72 477 R(area of standardization is assigned to a w)
+2.5 E(orking group in the 1003 series.)-.1 E 2.814
+(The POSIX Shell and Utilities standard has been de)97 492.6 R -.15(ve)
+-.25 G 2.814(loped by IEEE W).15 F 2.813(orking Group 1003.2)-.8 F .254
+(\(POSIX.2\).\210 It concentrates on the command interpreter interf)72
+504.6 R .253(ace and utility programs commonly e)-.1 F -.15(xe)-.15 G
+(cuted).15 E 1.112(from the command line or by other programs.)72 516.6
+R 1.112(An initial v)6.112 F 1.113
+(ersion of the standard has been appro)-.15 F -.15(ve)-.15 G 3.613(da)
+.15 G(nd)-3.613 E .365(published by the IEEE, and w)72 528.6 R .365
+(ork is currently underw)-.1 F .365(ay to update it.)-.1 F .365
+(There are four primary areas of w)5.365 F(ork)-.1 E
+(in the 1003.2 standard:)72 540.6 Q 21.5<8341>72 556.2 S .835
+(spects of the shell')-21.5 F 3.335(ss)-.55 G .835
+(yntax and command language.)-3.335 F 3.335(An)5.835 G .835
+(umber of special b)-3.335 F .835(uiltins such as)-.2 F F2(cd)3.335 E F3
+(and)3.335 E F2(exec)97 568.2 Q F3 .545(are being speci\214ed as part o\
+f the shell, since their functionality usually cannot be implemented)
+3.046 F(by a separate e)97 580.2 Q -.15(xe)-.15 G(cutable;).15 E 21.5
+<8341>72 595.8 S .926
+(set of utilities to be called by shell scripts and applications.)
+-18.074 F .927(Examples are programs lik)5.927 F(e)-.1 E F1 .927
+(sed, tr)3.427 F(,)-1.11 E F3(and)97 607.8 Q F1(awk.)2.797 E F3 .297
+(Utilities commonly implemented as shell b)5.297 F .296
+(uiltins are described in this section, such as)-.2 F F2(test)2.796 E F3
+(and)97 619.8 Q F2(kill)3.422 E F3 5.922(.A)C 3.422(ne)-5.922 G .922
+(xpansion of this section')-3.572 F 3.423(ss)-.55 G .923
+(cope, termed the User Portability Extension, or UPE, has)-3.423 F
+(standardized interacti)97 631.8 Q .3 -.15(ve p)-.25 H(rograms such as)
+.15 E F1(vi)2.5 E F3(and)2.5 E F1(mailx;)2.5 E F3 21.5<8341>72 647.4 S
+.288(group of functional interf)-18.712 F .287(aces to services pro)-.1
+F .287(vided by the shell, such as the traditional)-.15 F/F6 10
+/Courier@0 SF(system\(\))2.787 E F3 3.289(Cl)97 659.4 S .789
+(ibrary function.)-3.289 F .789(There are functions to perform shell w)
+5.789 F .789(ord e)-.1 F .79(xpansions, perform \214lename e)-.15 F
+(xpan-)-.15 E .324(sion \()97 671.4 R F1(globbing)A F3 .324
+(\), obtain v)B .323(alues of POSIX.2 system con\214guration v)-.25 F
+.323(ariables, retrie)-.25 F .623 -.15(ve v)-.25 H .323(alues of en)-.1
+F(viron-)-.4 E(ment v)97 683.4 Q(ariables \()-.25 E F6(getenv\(\))A F3
+(\), and other services;).833 E .32 LW 144 691.4 72 691.4 DL F4
+(*An earlier v)72 703.2 Q
+(ersion of this article appeared in The Linux Journal.)-.12 E(\210IEEE,)
+72 715 Q/F7 8/Times-Italic@0 SF 1.231(IEEE Standar)3.231 F 3.231(df)
+-.296 G 1.231(or Information T)-3.231 F(ec)-.736 E(hnolo)-.12 E 1.231
+(gy -- P)-.08 F 1.231(ortable Oper)-.64 F 1.232
+(ating System Interface \(POSIX\) P)-.12 F 1.232(art 2:)-.64 F
+(Shell and Utilities)72 725 Q F4 2(,1)C(992.)-2 E EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-2-)282.17 48 Q 21.5<8341>72 84 S
+(suite of \231de)-19 E -.15(ve)-.25 G(lopment\232 utilities such as).15
+E/F1 10/Times-Italic@0 SF(c89)2.5 E F0(\(the POSIX.2 v)2.5 E(ersion of)
+-.15 E F1(cc)2.5 E F0(\), and)A F1(yacc.)2.5 E F0 .483
+(Bash is concerned with the aspects of the shell')97 99.6 R 2.983(sb)
+-.55 G(eha)-2.983 E .484(vior de\214ned by POSIX.2.)-.2 F .484
+(The shell command)5.484 F 1.439
+(language has of course been standardized, including the basic \215o)72
+111.6 R 3.938(wc)-.25 G 1.438(ontrol and program e)-3.938 F -.15(xe)-.15
+G 1.438(cution con-).15 F 1.284
+(structs, I/O redirection and pipelining, ar)72 123.6 R 1.284
+(gument handling, v)-.18 F 1.284(ariable e)-.25 F 1.284
+(xpansion, and quoting.)-.15 F(The)6.285 E F1(special)3.785 E F0 -.2(bu)
+72 135.6 S .676
+(iltins, which must be implemented as part of the shell to pro).2 F .676
+(vide the desired functionality)-.15 F 3.176(,a)-.65 G .676
+(re speci\214ed)-3.176 F .7(as being part of the shell; e)72 147.6 R .7
+(xamples of these are)-.15 F/F2 10/Times-Bold@0 SF -2.3 -.15(ev a)3.201
+H(l).15 E F0(and)3.201 E F2(export)3.201 E F0 5.701(.O)C .701
+(ther utilities appear in the sections of)-5.701 F .256(POSIX.2 not de)
+72 159.6 R -.2(vo)-.25 G .256(ted to the shell which are commonly \(and\
+ in some cases must be\) implemented as b).2 F(uiltin)-.2 E .213
+(commands, such as)72 171.6 R F2 -.18(re)2.713 G(ad).18 E F0(and)2.713 E
+F2(test)2.713 E F0 5.213(.P)C .213
+(OSIX.2 also speci\214es aspects of the shell')-5.213 F 2.713(si)-.55 G
+(nteracti)-2.713 E .513 -.15(ve b)-.25 H(eha).15 E .214(vior as part)-.2
+F .598(of the UPE, including job control and command line editing.)72
+183.6 R .598(Interestingly enough, only)5.598 F F1(vi)3.098 E F0 .598
+(-style line edit-)B(ing commands ha)72 195.6 Q .3 -.15(ve b)-.2 H
+(een standardized;).15 E F1(emacs)2.5 E F0
+(editing commands were left out due to objections.)2.5 E 1.128
+(While POSIX.2 includes much of what the shell has traditionally pro)97
+211.2 R 1.129(vided, some important things)-.15 F(ha)72 223.2 Q .344
+-.15(ve b)-.2 H .044(een omitted as being \231be).15 F .044
+(yond its scope.)-.15 F 5.043<9a54>-.7 G .043
+(here is, for instance, no mention of a dif)-5.043 F .043
+(ference between a)-.25 F F1(lo)72 235.2 Q(gin)-.1 E F0 1.445
+(shell and an)3.945 F 3.945(yo)-.15 G 1.445(ther interacti)-3.945 F
+1.745 -.15(ve s)-.25 H 1.446
+(hell \(since POSIX.2 does not specify a login program\).).15 F 1.446
+(No \214x)6.446 F(ed)-.15 E(startup \214les are de\214ned, either \255 \
+the standard does not mention)72 247.2 Q F1(.pr)2.5 E(o\214le)-.45 E F0
+(.)A F2 2.5(3. Basic)72 271.2 R(Bash featur)2.5 E(es)-.18 E F0 1.448
+(Since the Bourne shell pro)97 286.8 R 1.448
+(vides Bash with most of its philosophical underpinnings, Bash inherits)
+-.15 F .64(most of its features and functionality from sh.)72 298.8 R
+.641(Bash implements all of the traditional sh \215o)5.641 F 3.141(wc)
+-.25 G .641(ontrol con-)-3.141 F .8(structs \()72 310.8 R F1(for)A F0(,)
+A F1(if)3.3 E F0(,)A F1(while)3.3 E F0 3.3(,e)C 3.3(tc.\). All)-3.3 F
+.799(of the Bourne shell b)3.3 F .799
+(uiltins, including those not speci\214ed in the POSIX.2)-.2 F .536
+(standard, appear in Bash.)72 322.8 R(Shell)5.536 E F1(functions)3.036 E
+F0 3.036(,i)C .536(ntroduced in the SVR2 v)-3.036 F .537
+(ersion of the Bourne shell, are similar)-.15 F .779
+(to shell scripts, b)72 334.8 R .779
+(ut are de\214ned using a special syntax and are e)-.2 F -.15(xe)-.15 G
+.779(cuted in the same process as the calling).15 F 2.841(shell. Bash)72
+346.8 R .341(has shell functions which beha)2.841 F .641 -.15(ve i)-.2 H
+2.841(naf).15 G .341(ashion upw)-2.941 F .342
+(ard-compatible with sh functions.)-.1 F .342(There are)5.342 F 1.447
+(certain shell v)72 358.8 R 1.446
+(ariables that Bash interprets in the same w)-.25 F 1.446
+(ay as sh, such as)-.1 F F2(PS1)3.946 E F0(,)A F2(IFS)3.946 E F0 3.946
+(,a)C(nd)-3.946 E F2 -.74(PA)3.946 G(TH)-.21 E F0 6.446(.B)C(ash)-6.446
+E 1.423(implements essentially the same grammar)72 370.8 R 3.924(,p)-.4
+G 1.424(arameter and v)-3.924 F 1.424(ariable e)-.25 F 1.424
+(xpansion semantics, redirection, and)-.15 F 1.06
+(quoting as the Bourne shell.)72 382.8 R 1.06(Where dif)6.06 F 1.06
+(ferences appear between the POSIX.2 standard and traditional sh)-.25 F
+(beha)72 394.8 Q(vior)-.2 E 2.5(,B)-.4 G(ash follo)-2.5 E(ws POSIX.)-.25
+E 1.608(The K)97 410.4 R 1.608(orn Shell \()-.35 F F2(ksh)A F0 4.108
+(\)i)C 4.108(sad)-4.108 G 1.608
+(escendent of the Bourne shell written at A)-4.108 F 1.609
+(T&T Bell Laboratories by)-1.11 F(Da)72 422.4 Q 1.059(vid K)-.2 F 3.559
+(orn\207. It)-.35 F(pro)3.559 E 1.059
+(vides a number of useful features that POSIX and Bash ha)-.15 F 1.359
+-.15(ve a)-.2 H 3.558(dopted. Man).15 F 3.558(yo)-.15 G 3.558(ft)-3.558
+G(he)-3.558 E(interacti)72 434.4 Q 1.312 -.15(ve f)-.25 H 1.012
+(acilities in POSIX.2 ha).05 F 1.312 -.15(ve t)-.2 H 1.012
+(heir roots in the ksh: for e).15 F 1.013
+(xample, the POSIX and ksh job control)-.15 F -.1(fa)72 446.4 S .513
+(cilities are nearly identical. Bash includes features from the K).1 F
+.513(orn Shell for both interacti)-.35 F .813 -.15(ve u)-.25 H .513
+(se and shell).15 F 3.905(programming. F)72 458.4 R 1.405
+(or programming, Bash pro)-.15 F 1.405(vides v)-.15 F 1.405
+(ariables such as)-.25 F F2(RANDOM)3.905 E F0(and)3.905 E F2(REPL)3.905
+E(Y)-.92 E F0 3.905(,t)C(he)-3.905 E F2(typeset)3.905 E F0 -.2(bu)72
+470.4 S .398(iltin, the ability to remo).2 F .698 -.15(ve s)-.15 H .398
+(ubstrings from v).15 F .398
+(ariables based on patterns, and shell arithmetic.)-.25 F F2(RANDOM)
+5.397 E F0 -.15(ex)72 482.4 S .489
+(pands to a random number each time it is referenced; assigning a v).15
+F .49(alue to)-.25 F F2(RANDOM)2.99 E F0 .49(seeds the random)2.99 F
+.055(number generator)72 494.4 R(.)-.55 E F2(REPL)5.055 E(Y)-.92 E F0
+.054(is the def)2.554 F .054(ault v)-.1 F .054(ariable used by the)-.25
+F F2 -.18(re)2.554 G(ad).18 E F0 -.2(bu)2.554 G .054(iltin when no v).2
+F .054(ariable names are sup-)-.25 F .742(plied as ar)72 506.4 R 3.243
+(guments. The)-.18 F F2(typeset)3.243 E F0 -.2(bu)3.243 G .743
+(iltin is used to de\214ne v).2 F .743(ariables and gi)-.25 F 1.043 -.15
+(ve t)-.25 H .743(hem attrib).15 F .743(utes such as)-.2 F F2 -.18(re)
+3.243 G(ad-).18 E(only)72 518.4 Q F0 5.512(.B)C .512
+(ash arithmetic allo)-5.512 F .512(ws the e)-.25 F -.25(va)-.25 G .511
+(luation of an e).25 F .511
+(xpression and the substitution of the result.)-.15 F .511(Shell v)5.511
+F(ari-)-.25 E .222
+(ables may be used as operands, and the result of an e)72 530.4 R .222
+(xpression may be assigned to a v)-.15 F 2.722(ariable. Nearly)-.25 F
+.222(all of)2.722 F(the operators from the C language are a)72 542.4 Q
+-.25(va)-.2 G(ilable, with the same precedence rules:).25 E/F3 10
+/Courier@0 SF 6($e)97 560.4 S(cho $\(\(3 + 5 * 32\)\))-6 E(163)97 572.4
+Q F0 -.15(Fo)72 594 S 3.24(ri).15 G(nteracti)-3.24 E 1.04 -.15(ve u)-.25
+H .74(se, Bash implements ksh-style aliases and b).15 F .74
+(uiltins such as)-.2 F F2(fc)3.24 E F0 .74(\(discussed belo)3.24 F .74
+(w\) and)-.25 F F2(jobs)3.24 E F0(.)A .291(Bash aliases allo)72 606 R
+2.791(was)-.25 G .291(tring to be substituted for a command name.)-2.791
+F(The)5.291 E 2.791(yc)-.15 G .291(an be used to create a mnemonic)
+-2.791 F .568(for a)72 618 R/F4 9/Times-Roman@0 SF(UNIX)3.068 E F0 .568
+(command name \()3.068 F F3 .568(alias del=rm)B F0 .568(\), to e)B .567
+(xpand a single w)-.15 F .567(ord to a comple)-.1 F 3.067(xc)-.15 G .567
+(ommand \()-3.067 F F3(alias)A .255
+(news='xterm -g 80x45 -title trn -e trn -e -S1 -N &')72 630 R F0 .255
+(\), or to ensure that a command)B(is in)72 642 Q -.2(vo)-.4 G -.1(ke).2
+G 2.5(dw).1 G(ith a basic set of options \()-2.5 E F3
+(alias ls="/bin/ls -F")A F0(\).)A .293(The C shell \()97 657.6 R F2(csh)
+A F0 .293(\)\207, originally written by Bill Jo)B 2.792(yw)-.1 G .292
+(hile at Berk)-2.792 F(ele)-.1 E 1.592 -.65(y, i)-.15 H 2.792(sw).65 G
+.292(idely used and quite popular)-2.792 F 1.499(for its interacti)72
+669.6 R 1.799 -.15(ve f)-.25 H 3.999(acilities. Bash).05 F 1.499
+(includes a csh-compatible history e)3.999 F 1.5
+(xpansion mechanism \(\231! history\232\),)-.15 F .019(brace e)72 681.6
+R .018(xpansion, access to a stack of directories via the)-.15 F F2
+(pushd)2.518 E F0(,)A F2(popd)2.518 E F0 2.518(,a)C(nd)-2.518 E F2(dirs)
+2.518 E F0 -.2(bu)2.518 G .018(iltins, and tilde e).2 F(xpansion,)-.15 E
+1.293(to generate users' home directories.)72 693.6 R -.35(Ti)6.294 G
+1.294(lde e).35 F 1.294(xpansion has also been adopted by both the K)
+-.15 F 1.294(orn Shell and)-.35 F .32 LW 144 708.2 72 708.2 DL/F5 8
+/Times-Roman@0 SF(\207Morris Bolsk)72 720 Q 2(ya)-.12 G(nd Da)-2 E
+(vid K)-.16 E(orn,)-.28 E/F6 8/Times-Italic@0 SF(The K)2 E
+(ornShell Command and Pr)-.32 E -.08(og)-.36 G -.12(ra).08 G
+(mming Langua).12 E -.08(ge)-.08 G F5 2(,P).08 G(rentice Hall, 1989.)-2
+E EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-3-)282.17 48 Q(POSIX.2.)72 84 Q .148
+(There were certain areas in which POSIX.2 felt standardization w)97
+99.6 R .149(as necessary)-.1 F 2.649(,b)-.65 G .149(ut no e)-2.849 F
+.149(xisting imple-)-.15 F 1.598(mentation pro)72 111.6 R 1.598
+(vided the proper beha)-.15 F(vior)-.2 E 6.598(.T)-.55 G 1.598(he w)
+-6.598 F 1.597(orking group in)-.1 F -.15(ve)-.4 G 1.597
+(nted and standardized functionality in).15 F .674
+(these areas, which Bash implements.)72 123.6 R(The)5.674 E/F1 10
+/Times-Bold@0 SF(command)3.174 E F0 -.2(bu)3.174 G .674(iltin w).2 F
+.674(as in)-.1 F -.15(ve)-.4 G .674
+(nted so that shell functions could be).15 F .996(written to replace b)
+72 135.6 R .996(uiltins; it mak)-.2 F .996(es the capabilities of the b)
+-.1 F .995(uiltin a)-.2 F -.25(va)-.2 G .995(ilable to the function.).25
+F .995(The reserv)5.995 F(ed)-.15 E -.1(wo)72 147.6 S 1.731
+(rd \231!\232 w).1 F 1.731(as added to ne)-.1 F -.05(ga)-.15 G 1.731
+(te the return v).05 F 1.731(alue of a command or pipeline; it w)-.25 F
+1.732(as nearly impossible to)-.1 F -.15(ex)72 159.6 S .286
+(press \231if not x\232 cleanly using the sh language.).15 F .286
+(There e)5.286 F .286(xist multiple incompatible implementations of the)
+-.15 F F1(test)72 171.6 Q F0 -.2(bu)3.163 G .663
+(iltin, which tests \214les for type and other attrib).2 F .664
+(utes and performs arithmetic and string comparisons.)-.2 F .5
+(POSIX considered none of these correct, so the standard beha)72 183.6 R
+.5(vior w)-.2 F .5(as speci\214ed in terms of the number of)-.1 F(ar)72
+195.6 Q .412(guments to the command.)-.18 F .412(POSIX.2 dictates e)
+5.412 F .412(xactly what will happen when four or fe)-.15 F .412(wer ar)
+-.25 F .412(guments are)-.18 F(gi)72 207.6 Q -.15(ve)-.25 G 5.01(nt).15
+G(o)-5.01 E F1(test)5.01 E F0 5.01(,a)C 2.51(nd lea)-5.01 F -.15(ve)-.2
+G 5.01(st).15 G 2.51(he beha)-5.01 F 2.51(vior unde\214ned when more ar)
+-.2 F 2.51(guments are supplied.)-.18 F 2.51(Bash uses the)7.51 F
+(POSIX.2 algorithm, which w)72 219.6 Q(as concei)-.1 E -.15(ve)-.25 G
+2.5(db).15 G 2.5(yD)-2.5 G -.2(av)-2.5 G(id K).2 E(orn.)-.35 E F1 2.5
+(3.1. F)72 243.6 R(eatur)-.25 E(es not in the Bour)-.18 E(ne Shell)-.15
+E F0 .718(There are a number of minor dif)97 259.2 R .719
+(ferences between Bash and the v)-.25 F .719
+(ersion of sh present on most other)-.15 F -.15(ve)72 271.2 S .874
+(rsions of).15 F/F2 9/Times-Roman@0 SF(UNIX)3.374 E F0 5.873(.T)C .873
+(he majority of these are due to the POSIX standard, b)-5.873 F .873
+(ut some are the result of Bash)-.2 F .386
+(adopting features from other shells.)72 283.2 R -.15(Fo)5.386 G 2.886
+(ri).15 G .386(nstance, Bash includes the ne)-2.886 F 2.886<7799>-.25 G
+.386(!\232 reserv)-2.886 F .386(ed w)-.15 F .386(ord, the)-.1 F F1
+(command)2.886 E F0 -.2(bu)72 295.2 S .116(iltin, the ability of the).2
+F F1 -.18(re)2.616 G(ad).18 E F0 -.2(bu)2.615 G .115
+(iltin to correctly return a line ending with a backslash, symbolic ar)
+.2 F(guments)-.18 E .798(to the)72 307.2 R F1(umask)3.298 E F0 -.2(bu)
+3.298 G .798(iltin, v).2 F .798(ariable substring remo)-.25 F -.25(va)
+-.15 G .798(l, a w).25 F .799(ay to get the length of a v)-.1 F .799
+(ariable, and the ne)-.25 F 3.299(wa)-.25 G(lgo-)-3.299 E(rithm for the)
+72 319.2 Q F1(test)2.5 E F0 -.2(bu)2.5 G
+(iltin from the POSIX.2 standard, none of which appear in sh.).2 E 1.225
+(Bash also implements the \231$\(...\)\232 command substitution syntax,\
+ which supersedes the sh `...` con-)97 334.8 R 2.851(struct. The)72
+346.8 R .351(\231$\(...\)\232 construct e)2.851 F .351(xpands to the ou\
+tput of the command contained within the parentheses, with)-.15 F .664
+(trailing ne)72 358.8 R .664(wlines remo)-.25 F -.15(ve)-.15 G 3.164
+(d. The).15 F .664(sh syntax is accepted for backw)3.164 F .664
+(ards compatibility)-.1 F 3.164(,b)-.65 G .664
+(ut the \231$\(...\)\232 form is)-3.364 F(preferred because its quoting\
+ rules are much simpler and it is easier to nest.)72 370.8 Q .772
+(The Bourne shell does not pro)97 386.4 R .772
+(vide such features as brace e)-.15 F .772
+(xpansion, the ability to de\214ne a v)-.15 F(ariable)-.25 E .283
+(and a function with the same name, local v)72 398.4 R .282
+(ariables in shell functions, the ability to enable and disable indi-)
+-.25 F .547(vidual b)72 410.4 R .547
+(uiltins or write a function to replace a b)-.2 F .547
+(uiltin, or a means to e)-.2 F .547
+(xport a shell function to a child pro-)-.15 F(cess.)72 422.4 Q .32
+(Bash has closed a long-standing shell security hole by not using the)97
+438 R F1($IFS)2.82 E F0 -.25(va)2.82 G .32(riable to split each w).25 F
+(ord)-.1 E 1.254(read by the shell, b)72 450 R 1.254
+(ut splitting only the results of e)-.2 F 1.255
+(xpansion \(ksh and the 4.4 BSD sh ha)-.15 F 1.555 -.15(ve \214)-.2 H
+-.15(xe).15 G 3.755(dt).15 G 1.255(his as)-3.755 F 2.907(well\). Useful)
+72 462 R(beha)2.907 E .407(vior such as a means to abort e)-.2 F -.15
+(xe)-.15 G .407(cution of a script read with the \231.).15 F 2.906<9a63>
+-.7 G .406(ommand using the)-2.906 F F1 -.18(re)72 474 S(tur).18 E(n)
+-.15 E F0 -.2(bu)2.742 G .242(iltin or automatically e).2 F .242
+(xporting v)-.15 F .243(ariables in the shell')-.25 F 2.743(se)-.55 G
+-.4(nv)-2.743 G .243(ironment to children is also not present).4 F .969
+(in the Bourne shell.)72 486 R .968(Bash pro)5.968 F .968
+(vides a much more po)-.15 F .968(werful en)-.25 F .968
+(vironment for both interacti)-.4 F 1.268 -.15(ve u)-.25 H .968
+(se and pro-).15 F(gramming.)72 498 Q F1 2.5(4. Bash-speci\214c)72 522 R
+-.25(Fe)2.5 G(atur).25 E(es)-.18 E F0 .491(This section details a fe)97
+537.6 R 2.991(wo)-.25 G 2.991(ft)-2.991 G .491(he features which mak)
+-2.991 F 2.991(eB)-.1 G .491(ash unique.)-2.991 F .492(Most of them pro)
+5.491 F .492(vide impro)-.15 F -.15(ve)-.15 G(d).15 E(interacti)72 549.6
+Q 1.182 -.15(ve u)-.25 H .882(se, b).15 F .882(ut a fe)-.2 F 3.382(wp)
+-.25 G .882(rogramming impro)-3.382 F -.15(ve)-.15 G .882
+(ments are present as well.).15 F .882(Full descriptions of these fea-)
+5.882 F(tures can be found in the Bash documentation.)72 561.6 Q F1 2.5
+(4.1. Startup)72 585.6 R(Files)2.5 E F0 .161(Bash e)97 601.2 R -.15(xe)
+-.15 G .161(cutes startup \214les dif).15 F .161
+(ferently than other shells.)-.25 F .162(The Bash beha)5.161 F .162
+(vior is a compromise between)-.2 F .29
+(the csh principle of startup \214les with \214x)72 613.2 R .29
+(ed names e)-.15 F -.15(xe)-.15 G .29
+(cuted for each shell and the sh \231minimalist\232 beha).15 F(vior)-.2
+E(.)-.55 E 2.955(An interacti)72 625.2 R 3.255 -.15(ve i)-.25 H 2.955
+(nstance of Bash started as a login shell reads and e).15 F -.15(xe)-.15
+G(cutes).15 E/F3 10/Times-Italic@0 SF(~/.bash_pr)5.456 E(o\214le)-.45 E
+F0 2.956(\(the \214le)5.456 F .954(.bash_pro\214le in the user')72 637.2
+R 3.454(sh)-.55 G .953(ome directory\), if it e)-3.454 F 3.453
+(xists. An)-.15 F(interacti)3.453 E 1.253 -.15(ve n)-.25 H .953
+(on-login shell reads and e).15 F -.15(xe)-.15 G(cutes).15 E F3
+(~/.bashr)72 649.2 Q(c)-.37 E F0 5.641(.A)C(non-interacti)-2.5 E .942
+-.15(ve s)-.25 H .642(hell \(one be).15 F .642(gun to e)-.15 F -.15(xe)
+-.15 G .642(cute a shell script, for e).15 F .642
+(xample\) reads no \214x)-.15 F .642(ed startup)-.15 F .342(\214le, b)72
+661.2 R .342(ut uses the v)-.2 F .342(alue of the v)-.25 F(ariable)-.25
+E F1($ENV)2.842 E F0 2.841(,i)C 2.841(fs)-2.841 G .341
+(et, as the name of a startup \214le.)-2.841 F .341
+(The ksh practice of read-)5.341 F(ing)72 673.2 Q F1($ENV)3.114 E F0
+.614(for e)3.114 F -.15(ve)-.25 G .614(ry shell, with the accompan).15 F
+.615(ying dif)-.15 F .615(\214culty of de\214ning the proper v)-.25 F
+.615(ariables and functions)-.25 F .721(for interacti)72 685.2 R 1.021
+-.15(ve a)-.25 H .721(nd non-interacti).15 F 1.021 -.15(ve s)-.25 H .721
+(hells or ha).15 F .721(ving the \214le read only for interacti)-.2 F
+1.02 -.15(ve s)-.25 H .72(hells, w).15 F .72(as considered)-.1 F .158
+(too comple)72 697.2 R 2.658(x. Ease)-.15 F .158(of use w)2.658 F .158
+(on out here.)-.1 F(Interestingly)5.158 E 2.658(,t)-.65 G .158(he ne)
+-2.658 F .159(xt release of ksh will change to reading)-.15 F F1($ENV)
+2.659 E .32 LW 144 705.2 72 705.2 DL/F4 8/Times-Roman@0 SF .559
+(\207Bill Jo)72 717 R 1.599 -.52(y, A)-.08 H 2.559(nI).52 G .559
+(ntroduction to the C Shell,)-2.559 F/F5 8/Times-Italic@0 SF .558
+(UNIX User')2.558 F 2.558(sS)-.32 G .558(upplementary Documents)-2.558 F
+F4 2.558(,U)C(ni)-2.558 E -.12(ve)-.2 G .558(rsity of California at).12
+F(Berk)72 727 Q(ele)-.08 E 1.04 -.52(y, 1)-.12 H(986.).52 E EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-4-)282.17 48 Q(only for interacti)72 84 Q .3
+-.15(ve s)-.25 H(hells.).15 E/F1 10/Times-Bold@0 SF 2.5(4.2. New)72 108
+R(Builtin Commands)2.5 E F0 1.02(There are a fe)97 123.6 R 3.52(wb)-.25
+G 1.02(uiltins which are ne)-3.72 F 3.52(wo)-.25 G 3.52(rh)-3.52 G -2.25
+-.2(av e)-3.52 H 1.02(been e)3.72 F 1.02(xtended in Bash.)-.15 F(The)
+6.02 E F1(enable)3.52 E F0 -.2(bu)3.52 G 1.02(iltin allo).2 F(ws)-.25 E
+-.2(bu)72 135.6 S .824(iltin commands to be turned on and of).2 F 3.324
+(fa)-.25 G(rbitrarily)-3.324 E 5.824(.T)-.65 G 3.324(ou)-6.624 G .824
+(se the v)-3.324 F .824(ersion of)-.15 F/F2 10/Times-Italic@0 SF(ec)
+3.324 E(ho)-.15 E F0 .825(found in a user')3.324 F 3.325(ss)-.55 G
+(earch)-3.325 E .625(path rather than the Bash b)72 147.6 R(uiltin,)-.2
+E/F3 10/Courier@0 SF .625(enable -n echo)3.125 F F0(suf)3.125 E 3.125
+(\214ces. The)-.25 F F1(help)3.124 E F0 -.2(bu)3.124 G .624(iltin pro).2
+F .624(vides quick synopses)-.15 F .703(of the shell f)72 159.6 R .704
+(acilities without requiring access to a manual page.)-.1 F F1(Builtin)
+5.704 E F0 .704(is similar to)3.204 F F1(command)3.204 E F0 .704
+(in that it)3.204 F .342(bypasses shell functions and directly e)72
+171.6 R -.15(xe)-.15 G .342(cutes b).15 F .342(uiltin commands.)-.2 F
+.342(Access to a csh-style stack of directories)5.342 F .072(is pro)72
+183.6 R .073(vided via the)-.15 F F1(pushd)2.573 E F0(,)A F1(popd)2.573
+E F0 2.573(,a)C(nd)-2.573 E F1(dirs)2.573 E F0 -.2(bu)2.573 G(iltins.).2
+E F1(Pushd)5.073 E F0(and)2.573 E F1(popd)2.573 E F0 .073
+(insert and remo)2.573 F .373 -.15(ve d)-.15 H .073(irectories from the)
+.15 F 2.858(stack, respecti)72 195.6 R -.15(ve)-.25 G(ly).15 E 5.358(,a)
+-.65 G(nd)-5.358 E F1(dirs)5.358 E F0 2.858(lists the stack contents.)
+5.358 F 2.858(On systems that allo)7.858 F 5.358<778c>-.25 G 2.857
+(ne-grained control of)-5.358 F 1.339(resources, the)72 207.6 R F1
+(ulimit)3.839 E F0 -.2(bu)3.839 G 1.339
+(iltin can be used to tune these settings.).2 F F1(Ulimit)6.34 E F0
+(allo)3.84 E 1.34(ws a user to control, among)-.25 F 1.086
+(other things, whether core dumps are to be generated, ho)72 219.6 R
+3.586(wm)-.25 G 1.086(uch memory the shell or a child process is)-3.586
+F(allo)72 231.6 Q .496(wed to allocate, and ho)-.25 F 2.996(wl)-.25 G
+(ar)-2.996 E .496(ge a \214le created by a child process can gro)-.18 F
+4.296 -.65(w. T)-.25 H(he).65 E F1(suspend)2.996 E F0 .497(command will)
+2.997 F .744(stop the shell process when job control is acti)72 243.6 R
+-.15(ve)-.25 G 3.243(;m).15 G .743(ost other shells do not allo)-3.243 F
+3.243(wt)-.25 G(hemselv)-3.243 E .743(es to be stopped)-.15 F(lik)72
+255.6 Q 2.717(et)-.1 G(hat.)-2.717 E F1 -.74(Ty)5.217 G(pe,).74 E F0
+.217(the Bash answer to)2.717 F F1(which)2.717 E F0(and)2.717 E F1
+(whence,)2.717 E F0(sho)2.717 E .218(ws what will happen when a w)-.25 F
+.218(ord is typed as a)-.1 F(command:)72 267.6 Q F3 6($t)97 285.6 S
+(ype export)-6 E(export is a shell builtin)97 297.6 Q 6($t)97 309.6 S
+(ype -t export)-6 E(builtin)97 321.6 Q 6($t)97 333.6 S(ype bash)-6 E
+(bash is /bin/bash)97 345.6 Q 6($t)97 357.6 S(ype cd)-6 E
+(cd is a function)97 369.6 Q(cd \(\))97 381.6 Q({)97 393.6 Q
+(builtin cd ${1+"$@"} && xtitle $HOST: $PWD)121 405.6 Q(})97 417.6 Q F0
+-1.11(Va)72 439.2 S .682(rious modes tell what a command w)1.11 F .681
+(ord is \(reserv)-.1 F .681(ed w)-.15 F .681(ord, alias, function, b)-.1
+F .681(uiltin, or \214le\) or which v)-.2 F(er)-.15 E(-)-.2 E 1.15
+(sion of a command will be e)72 451.2 R -.15(xe)-.15 G 1.15
+(cuted based on a user').15 F 3.65(ss)-.55 G 1.15(earch path.)-3.65 F
+1.15(Some of this functionality has been)6.15 F
+(adopted by POSIX.2 and folded into the)72 463.2 Q F1(command)2.5 E F0
+(utility)2.5 E(.)-.65 E F1 2.5(4.3. Editing)72 487.2 R(and Completion)
+2.5 E F0 .682(One area in which Bash shines is command line editing.)97
+502.8 R .682(Bash uses the)5.682 F F2 -.37(re)3.182 G(adline).37 E F0
+.681(library to read and)3.181 F .942(edit lines when interacti)72 514.8
+R -.15(ve)-.25 G 5.942(.R).15 G .942(eadline is a po)-5.942 F .942
+(werful and \215e)-.25 F .942(xible input f)-.15 F .943
+(acility that a user can con\214gure to)-.1 F(indi)72 526.8 Q .732
+(vidual tastes.)-.25 F .732(It allo)5.732 F .732(ws lines to be edited \
+using either emacs or vi commands, where those commands)-.25 F .2
+(are appropriate.)72 538.8 R .2
+(The full capability of emacs is not present \255 there is no w)5.2 F .2
+(ay to e)-.1 F -.15(xe)-.15 G .2(cute a named command).15 F 1.15
+(with M-x, for instance \255 b)72 550.8 R 1.15(ut the e)-.2 F 1.149
+(xisting commands are more than adequate.)-.15 F 1.149
+(The vi mode is compliant)6.149 F
+(with the command line editing standardized by POSIX.2.)72 562.8 Q 1.69
+(Readline is fully customizable.)97 578.4 R 1.691
+(In addition to the basic commands and k)6.69 F 1.991 -.15(ey b)-.1 H
+1.691(indings, the library).15 F(allo)72 590.4 Q .028
+(ws users to de\214ne additional k)-.25 F .327 -.15(ey b)-.1 H .027
+(indings using a startup \214le.).15 F(The)5.027 E F2(inputr)2.527 E(c)
+-.37 E F0 .027(\214le, which def)2.527 F .027(aults to the \214le)-.1 F
+F2(~/.inputr)72 602.4 Q(c)-.37 E F0 3.002(,i)C 3.002(sr)-3.002 G .503(e\
+ad each time readline initializes, permitting users to maintain a consi\
+stent interf)-3.002 F .503(ace across a)-.1 F .893(set of programs.)72
+614.4 R .893(Readline includes an e)5.893 F .893(xtensible interf)-.15 F
+.892(ace, so each program using the library can add its)-.1 F -.25(ow)72
+626.4 S 3.56(nb).25 G 1.06(indable commands and program-speci\214c k)
+-3.56 F 1.361 -.15(ey b)-.1 H 3.561(indings. Bash).15 F 1.061
+(uses this f)3.561 F 1.061(acility to add bindings that)-.1 F
+(perform history e)72 638.4 Q(xpansion or shell w)-.15 E(ord e)-.1 E
+(xpansions on the current input line.)-.15 E .707
+(Readline interprets a number of v)97 654 R .706
+(ariables which further tune its beha)-.25 F(vior)-.2 E 5.706(.V)-.55 G
+.706(ariables e)-6.816 F .706(xist to control)-.15 F .157
+(whether or not eight-bit characters are directly read as input or con)
+72 666 R -.15(ve)-.4 G .158(rted to meta-pre\214x).15 F .158(ed k)-.15 F
+.458 -.15(ey s)-.1 H .158(equences \(a).15 F(meta-pre\214x)72 678 Q .082
+(ed k)-.15 F .382 -.15(ey s)-.1 H .081(equence consists of the characte\
+r with the eighth bit zeroed, preceded by the).15 F F2(meta-pr)2.581 E
+(e\214x)-.37 E F0(character)72 690 Q 3.233(,u)-.4 G .733
+(sually escape, which selects an alternate k)-3.233 F -.15(ey)-.1 G .734
+(map\), to decide whether to output characters with).15 F .624
+(the eighth bit set directly or as a meta-pre\214x)72 702 R .624(ed k)
+-.15 F .924 -.15(ey s)-.1 H .623
+(equence, whether or not to wrap to a ne).15 F 3.123(ws)-.25 G .623
+(creen line)-3.123 F 1.196
+(when a line being edited is longer than the screen width, the k)72 714
+R -.15(ey)-.1 G 1.196(map to which subsequent k).15 F 1.496 -.15(ey b)
+-.1 H(indings).15 E .531(should apply)72 726 R 3.031(,o)-.65 G 3.031(re)
+-3.031 G -.15(ve)-3.281 G 3.031(nw).15 G .531
+(hat happens when readline w)-3.031 F .531(ants to ring the terminal')
+-.1 F 3.03(sb)-.55 G 3.03(ell. All)-3.03 F .53(of these v)3.03 F
+(ariables)-.25 E EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-5-)282.17 48 Q
+(can be set in the inputrc \214le.)72 84 Q .284
+(The startup \214le understands a set of C preprocessor)97 99.6 R(-lik)
+-.2 E 2.785(ec)-.1 G .285(onditional constructs which allo)-2.785 F
+2.785(wv)-.25 G(ariables)-3.035 E .12(or k)72 111.6 R .42 -.15(ey b)-.1
+H .119(indings to be assigned based on the application using readline, \
+the terminal currently being used, or).15 F .338(the editing mode.)72
+123.6 R .338(Users can add program-speci\214c bindings to mak)5.338 F
+2.838(et)-.1 G .338(heir li)-2.838 F -.15(ve)-.25 G 2.838(se).15 G 2.838
+(asier: I)-2.838 F(ha)2.838 E .639 -.15(ve b)-.2 H .339(indings that).15
+F(let me edit the v)72 135.6 Q(alue of)-.25 E/F1 10/Times-Bold@0 SF($P)
+2.5 E -.95(AT)-.74 G(H).95 E F0(and double-quote the current or pre)2.5
+E(vious w)-.25 E(ord:)-.1 E/F2 10/Courier@0 SF 6(#M)97 153.6 S
+(acros that are convenient for shell interaction)-6 E($if Bash)97 165.6
+Q 6(#e)97 177.6 S(dit the path)-6 E
+("\\C-xp": "PATH=${PATH}\\e\\C-e\\C-a\\ef\\C-f")97 189.6 Q 6(#p)97 201.6
+S(repare to type a quoted word -- insert open and close double)-6 E 6
+(#q)97 213.6 S(uotes and move to just after the open quote)-6 E
+("\\C-x\\"": "\\"\\"\\C-b")97 225.6 Q 6(#Q)97 237.6 S
+(uote the current or previous word)-6 E("\\C-xq": "\\eb\\"\\ef\\"")97
+249.6 Q($endif)97 261.6 Q F0 .322(There is a readline command to re-rea\
+d the \214le, so users can edit the \214le, change some bindings, and b\
+e)72 283.2 R(gin)-.15 E(to use them almost immediately)72 295.2 Q(.)-.65
+E .851(Bash implements the)97 310.8 R F1(bind)3.351 E F0 -.2(bu)3.351 G
+.851(iltin for more dyamic control of readline than the startup \214le \
+permits.).2 F F1(Bind)72 322.8 Q F0 .25(is used in se)2.75 F -.15(ve)
+-.25 G .25(ral w).15 F 2.75(ays. In)-.1 F/F3 10/Times-Italic@0 SF(list)
+2.75 E F0 .25(mode, it can display the current k)2.75 F .55 -.15(ey b)
+-.1 H .25(indings, list all the readline edit-).15 F .149(ing directi)72
+334.8 R -.15(ve)-.25 G 2.649(sa).15 G -.25(va)-2.849 G .149
+(ilable for binding, list which k).25 F -.15(ey)-.1 G 2.649(si).15 G
+-1.9 -.4(nv o)-2.649 H .349 -.1(ke a g).4 H -2.15 -.25(iv e).1 H 2.65
+(nd).25 G(irecti)-2.65 E -.15(ve)-.25 G 2.65(,o).15 G 2.65(ro)-2.65 G
+.15(utput the current set of k)-2.65 F -.15(ey)-.1 G .042(bindings in a\
+ format that can be incorporated directly into an inputrc \214le.)72
+346.8 R(In)5.041 E F3(batc)2.541 E(h)-.15 E F0 .041
+(mode, it reads a series of)2.541 F -.1(ke)72 358.8 S 2.858(yb)-.05 G
+.359(indings directly from a \214le and passes them to readline.)-2.858
+F .359(In its most common usage,)5.359 F F1(bind)2.859 E F0(tak)2.859 E
+.359(es a sin-)-.1 F 1.117(gle string and passes it directly to readlin\
+e, which interprets the line as if it had just been read from the)72
+370.8 R(inputrc \214le.)72 382.8 Q(Both k)5 E .3 -.15(ey b)-.1 H
+(indings and v).15 E(ariable assignments may appear in the string gi)
+-.25 E -.15(ve)-.25 G 2.5(nt).15 G(o)-2.5 E F1(bind)2.5 E F0(.)A .53
+(The readline library also pro)97 398.4 R .53(vides an interf)-.15 F .53
+(ace for)-.1 F F3(wor)3.03 E 3.03(dc)-.37 G(ompletion)-3.03 E F0 5.53
+(.W)C .53(hen the)-5.53 F F3(completion)3.03 E F0(character)3.03 E 1.261
+(\(usually T)72 410.4 R 1.261(AB\) is typed, readline looks at the w)
+-.93 F 1.26(ord currently being entered and computes the set of \214le-)
+-.1 F .523(names of which the current w)72 422.4 R .523(ord is a v)-.1 F
+.523(alid pre\214x.)-.25 F .524
+(If there is only one possible completion, the rest of the)5.523 F .358
+(characters are inserted directly)72 434.4 R 2.858(,o)-.65 G .358(therw\
+ise the common pre\214x of the set of \214lenames is added to the curre\
+nt)-2.858 F -.1(wo)72 446.4 S 3.199(rd. A).1 F .699(second T)3.199 F
+.699(AB character entered immediately after a non-unique completion cau\
+ses readline to list)-.93 F 1.814
+(the possible completions; there is an option to ha)72 458.4 R 2.113
+-.15(ve t)-.2 H 1.813(he list displayed immediately).15 F 6.813(.R)-.65
+G 1.813(eadline pro)-6.813 F(vides)-.15 E .482
+(hooks so that applications can pro)72 470.4 R .482
+(vide speci\214c types of completion before the def)-.15 F .483
+(ault \214lename completion)-.1 F .132(is attempted.)72 482.4 R .132
+(This is quite \215e)5.132 F .132
+(xible, though it is not completely user)-.15 F 2.632
+(-programmable. Bash,)-.2 F .132(for e)2.632 F .132(xample, can)-.15 F
+.37(complete \214lenames, command names \(including aliases, b)72 494.4
+R .37(uiltins, shell reserv)-.2 F .37(ed w)-.15 F .37
+(ords, shell functions, and)-.1 F -.15(exe)72 506.4 S .424
+(cutables found in the \214le system\), shell v).15 F .424
+(ariables, usernames, and hostnames.)-.25 F .423
+(It uses a set of heuristics)5.424 F(that, while not perfect, is genera\
+lly quite good at determining what type of completion to attempt.)72
+518.4 Q F1 2.5(4.4. History)72 542.4 R F0 .144
+(Access to the list of commands pre)97 558 R .144(viously entered \(the)
+-.25 F F3 .144(command history)2.644 F F0 2.644(\)i)C 2.644(sp)-2.644 G
+(ro)-2.644 E .144(vided jointly by Bash)-.15 F .078
+(and the readline library)72 570 R 5.077(.B)-.65 G .077(ash pro)-5.077 F
+.077(vides v)-.15 F .077(ariables \()-.25 F F1($HISTFILE)A F0(,)A F1
+($HISTSIZE)2.577 E F0 2.577(,a)C(nd)-2.577 E F1($HISTCONTR)2.577 E(OL)
+-.3 E F0 2.577(\)a)C(nd)-2.577 E(the)72 582 Q F1(history)2.89 E F0(and)
+2.89 E F1(fc)2.89 E F0 -.2(bu)2.89 G .39
+(iltins to manipulate the history list.).2 F .391(The v)5.391 F .391
+(alue of)-.25 F F1($HISTFILE)2.891 E F0 .391(specifes the \214le where)
+2.891 F .49(Bash writes the command history on e)72 594 R .489
+(xit and reads it on startup.)-.15 F F1($HISTSIZE)5.489 E F0 .489
+(is used to limit the number)2.989 F .642(of commands sa)72 606 R -.15
+(ve)-.2 G 3.142(di).15 G 3.142(nt)-3.142 G .642(he history)-3.142 F(.)
+-.65 E F1($HISTCONTR)5.642 E(OL)-.3 E F0(pro)3.142 E .642
+(vides a crude form of control o)-.15 F -.15(ve)-.15 G 3.142(rw).15 G
+.642(hich com-)-3.142 F .025(mands are sa)72 618 R -.15(ve)-.2 G 2.525
+(do).15 G 2.525(nt)-2.525 G .025(he history list: a v)-2.525 F .025
+(alue of)-.25 F F3(ignor)2.525 E(espace)-.37 E F0 .025(means to not sa)
+2.525 F .324 -.15(ve c)-.2 H .024(ommands which be).15 F .024
+(gin with a)-.15 F .927(space; a v)72 630 R .927(alue of)-.25 F F3
+(ignor)3.427 E(edups)-.37 E F0 .927(means to not sa)3.427 F 1.228 -.15
+(ve c)-.2 H .928(ommands identical to the last command sa).15 F -.15(ve)
+-.2 G(d.).15 E F1($HIST)5.928 E(-)-.92 E(CONTR)72 642 Q(OL)-.3 E F0 -.1
+(wa)3.778 G 3.778(sn).1 G(amed)-3.778 E F1($history_contr)3.778 E(ol)
+-.18 E F0 1.278(in earlier v)3.778 F 1.278
+(ersions of Bash; the old name is still accepted for)-.15 F(backw)72 654
+Q .575(ards compatibility)-.1 F 5.575(.T)-.65 G(he)-5.575 E F1(history)
+3.075 E F0 .575
+(command can read or write \214les containing the history list and dis-)
+3.075 F .167(play the current list contents.)72 666 R(The)5.167 E F1(fc)
+2.667 E F0 -.2(bu)2.667 G .167(iltin, adopted from POSIX.2 and the K).2
+F .167(orn Shell, allo)-.35 F .167(ws display and)-.25 F(re-e)72 678 Q
+-.15(xe)-.15 G .58
+(cution, with optional editing, of commands from the history list.).15 F
+.58(The readline library of)5.58 F .58(fers a set of)-.25 F 1.255(comma\
+nds to search the history list for a portion of the current input line \
+or a string typed by the user)72 690 R(.)-.55 E(Finally)72 702 Q 2.535
+(,t)-.65 G(he)-2.535 E F3(history)2.535 E F0(library)2.535 E 2.535(,g)
+-.65 G .036(enerally incorporated directly into the readline library)
+-2.535 F 2.536(,i)-.65 G .036(mplements a f)-2.536 F .036(acility for)
+-.1 F 1.023(history recall, e)72 714 R 1.022(xpansion, and re-e)-.15 F
+-.15(xe)-.15 G 1.022(cution of pre).15 F 1.022(vious commands v)-.25 F
+1.022(ery similar to csh \(\231bang history\232, so)-.15 F
+(called because the e)72 726 Q
+(xclamation point introduces a history substitution\):)-.15 E EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-6-)282.17 48 Q/F1 10/Courier@0 SF 6($e)97 84 S
+(cho a b c d e)-6 E 6(abcde)97 96 S 6($!)97 108 S 6(!fghi)-6 G
+(echo a b c d e f g h i)97 120 Q 6(abcdefghi)97 132 S 6($!)97 144 S(-2)
+-6 E(echo a b c d e)97 156 Q 6(abcde)97 168 S 6($e)97 180 S(cho !-2:1-4)
+-6 E(echo a b c d)97 192 Q 6(abcd)97 204 S F0 1.456
+(The command history is only sa)72 225.6 R -.15(ve)-.2 G 3.957(dw).15 G
+1.457(hen the shell is interacti)-3.957 F -.15(ve)-.25 G 3.957(,s).15 G
+3.957(oi)-3.957 G 3.957(ti)-3.957 G 3.957(sn)-3.957 G 1.457(ot a)-3.957
+F -.25(va)-.2 G 1.457(ilable for use by shell).25 F(scripts.)72 237.6 Q
+/F2 10/Times-Bold@0 SF 2.5(4.5. New)72 261.6 R(Shell V)2.5 E(ariables)
+-.92 E F0 .59(There are a number of con)97 277.2 R -.15(ve)-.4 G .589
+(nience v).15 F .589(ariables that Bash interprets to mak)-.25 F 3.089
+(el)-.1 G .589(ife easier)-3.089 F 5.589(.T)-.55 G .589(hese include)
+-5.589 F F2(FIGNORE)72 289.2 Q F0 3.973(,w)C 1.473
+(hich is a set of \214lename suf)-3.973 F<8c78>-.25 E 1.474
+(es identifying \214les to e)-.15 F 1.474
+(xclude when completing \214lenames;)-.15 F F2(HOSTTYPE)72 301.2 Q F0
+2.932(,w)C .432
+(hich is automatically set to a string describing the type of hardw)
+-2.932 F .431(are on which Bash is cur)-.1 F(-)-.2 E .335(rently e)72
+313.2 R -.15(xe)-.15 G(cuting;).15 E F2(command_oriented_history)2.835 E
+F0 2.835(,w)C .335(hich directs Bash to sa)-2.835 F .635 -.15(ve a)-.2 H
+.336(ll lines of a multiple-line com-).15 F 1.071(mand such as a)72
+325.2 R/F3 10/Times-Italic@0 SF(while)3.571 E F0(or)3.571 E F3(for)3.571
+E F0 1.071(loop in a single history entry)3.571 F 3.57(,a)-.65 G(llo)
+-3.57 E 1.07(wing easy re-editing; and)-.25 F F2(IGNOREEOF)3.57 E F0(,)A
+.747(whose v)72 337.2 R .747(alue indicates the number of consecuti)-.25
+F 1.047 -.15(ve E)-.25 H .747(OF characters that an interacti).15 F
+1.048 -.15(ve s)-.25 H .748(hell will read before).15 F -.15(ex)72 349.2
+S 1.432(iting \255 an easy w).15 F 1.432(ay to k)-.1 F 1.432
+(eep yourself from being logged out accidentally)-.1 F 6.432(.T)-.65 G
+(he)-6.432 E F2(auto_r)3.932 E(esume)-.18 E F0 -.25(va)3.932 G(riable)
+.25 E .571(alters the w)72 361.2 R .571
+(ay the shell treats simple command names: if job control is acti)-.1 F
+-.15(ve)-.25 G 3.071(,a).15 G .571(nd this v)-3.071 F .571
+(ariable is set, sin-)-.25 F(gle-w)72 373.2 Q .239(ord simple commands \
+without redirections cause the shell to \214rst look for and restart a \
+suspended job)-.1 F(with that name before starting a ne)72 385.2 Q 2.5
+(wp)-.25 G(rocess.)-2.5 E F2 2.5(4.6. Brace)72 409.2 R(Expansion)2.5 E
+F0 .653(Since sh of)97 424.8 R .653(fers no con)-.25 F -.15(ve)-.4 G
+.653(nient w).15 F .653
+(ay to generate arbitrary strings that share a common pre\214x or suf)
+-.1 F<8c78>-.25 E 2.124(\(\214lename e)72 436.8 R 2.124
+(xpansion requires that the \214lenames e)-.15 F 2.123
+(xist\), Bash implements)-.15 F F3(br)4.623 E 2.123(ace e)-.15 F
+(xpansion)-.2 E F0 4.623(,ac)C(apability)-4.623 E(pick)72 448.8 Q .773
+(ed up from csh.)-.1 F .774(Brace e)5.773 F .774
+(xpansion is similar to \214lename e)-.15 F .774(xpansion, b)-.15 F .774
+(ut the strings generated need not)-.2 F 1.211(correspond to e)72 460.8
+R 1.211(xisting \214les.)-.15 F 3.711(Ab)6.211 G 1.211(race e)-3.711 F
+1.211(xpression consists of an optional)-.15 F F3(pr)3.71 E(eamble)-.37
+E F0 3.71(,f)C(ollo)-3.71 E 1.21(wed by a pair of)-.25 F 2.938
+(braces enclosing a series of comma-separated strings, and an optional)
+72 472.8 R F3(postamble)5.438 E F0 7.938(.T)C 2.938(he preamble is)
+-7.938 F(prepended to each string within the braces, and the postamble \
+is then appended to each resulting string:)72 484.8 Q F1 6($e)97 502.8 S
+(cho a{d,c,b}e)-6 E(ade ace abe)97 514.8 Q F0 .306(As this e)72 536.4 R
+.306(xample demonstrates, the results of brace e)-.15 F .305
+(xpansion are not sorted, as the)-.15 F 2.805(ya)-.15 G .305
+(re by \214lename e)-2.805 F(xpan-)-.15 E(sion.)72 548.4 Q F2 2.5
+(4.7. Pr)72 572.4 R(ocess Substitution)-.18 E F0 .457
+(On systems that can support it, Bash pro)97 588 R .457(vides a f)-.15 F
+.457(acility kno)-.1 F .458(wn as)-.25 F F3(pr)2.958 E .458
+(ocess substitution)-.45 F F0 5.458(.P)C .458(rocess sub-)-5.458 F .347
+(stitution is similar to command substitution in that its speci\214cati\
+on includes a command to e)72 600 R -.15(xe)-.15 G .346(cute, b).15 F
+.346(ut the)-.2 F .181(shell does not collect the command')72 612 R
+2.681(so)-.55 G .181(utput and insert it into the command line.)-2.681 F
+(Rather)5.181 E 2.681(,B)-.4 G .182(ash opens a pipe)-2.681 F 1.861
+(to the command, which is run in the background.)72 624 R 1.861
+(The shell uses named pipes \(FIFOs\) or the)6.861 F F3(/de)4.361 E
+(v/fd)-.15 E F0 .961(method of naming open \214les to e)72 636 R .962(x\
+pand the process substitution to a \214lename which connects to the pip\
+e)-.15 F .104(when opened.)72 648 R .103
+(This \214lename becomes the result of the e)5.104 F 2.603
+(xpansion. Process)-.15 F .103(substitution can be used to com-)2.603 F
+(pare the outputs of tw)72 660 Q 2.5(od)-.1 G(if)-2.5 E(ferent v)-.25 E
+(ersions of an application as part of a re)-.15 E(gression test:)-.15 E
+F1 6($c)97 678 S(mp <\(old_prog\) <\(new_prog\))-6 E EP
+%%Page: 7 7
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-7-)282.17 48 Q/F1 10/Times-Bold@0 SF 2.5
+(4.8. Pr)72 84 R(ompt Customization)-.18 E F0 2.229
+(One of the more popular interacti)97 99.6 R 2.529 -.15(ve f)-.25 H
+2.229(eatures that Bash pro).15 F 2.23
+(vides is the ability to customize the)-.15 F 3.234(prompt. Both)72
+111.6 R F1($PS1)3.234 E F0(and)3.234 E F1($PS2,)3.234 E F0 .734
+(the primary and secondary prompts, are e)3.234 F .733
+(xpanded before being displayed.)-.15 F -.15(Pa)72 123.6 S .804
+(rameter and v).15 F .804(ariable e)-.25 F .805
+(xpansion is performed when the prompt string is e)-.15 F .805
+(xpanded, so an)-.15 F 3.305(ys)-.15 G .805(hell v)-3.305 F(ariable)-.25
+E .729(can be put into the prompt \(e.g.,)72 135.6 R F1($SHL)3.228 E(VL)
+-.92 E F0 3.228(,w)C .728(hich indicates ho)-3.228 F 3.228(wd)-.25 G
+.728(eeply the current shell is nested\).)-3.228 F(Bash)5.728 E 1.895(s\
+pecially interprets characters in the prompt string preceded by a backs\
+lash.)72 147.6 R 1.895(Some of these backslash)6.895 F .874
+(escapes are replaced with the current time, the date, the current w)72
+159.6 R .874(orking directory)-.1 F 3.373(,t)-.65 G .873
+(he username, and the)-3.373 F .78
+(command number or history number of the command being entered.)72 171.6
+R .781(There is e)5.781 F -.15(ve)-.25 G 3.281(nab).15 G .781
+(ackslash escape to)-3.281 F .007
+(cause the shell to change its prompt when running as root after an)72
+183.6 R/F2 10/Times-Italic@0 SF(su)2.507 E F0 5.007(.B)C .007
+(efore printing each primary prompt,)-5.007 F .305(Bash e)72 195.6 R
+.305(xpands the v)-.15 F(ariable)-.25 E F1($PR)2.805 E(OMPT_COMMAND)-.3
+E F0 .305(and, if it has a v)2.805 F .306(alue, e)-.25 F -.15(xe)-.15 G
+.306(cutes the e).15 F .306(xpanded v)-.15 F .306(alue as)-.25 F 3.735
+(ac)72 207.6 S 1.235(ommand, allo)-3.735 F 1.234
+(wing additional prompt customization.)-.25 F -.15(Fo)6.234 G 3.734(re)
+.15 G 1.234(xample, this assignment causes the current)-3.884 F(user)72
+219.6 Q 2.917(,t)-.4 G .417
+(he current host, the time, the last component of the current w)-2.917 F
+.417(orking directory)-.1 F 2.917(,t)-.65 G .418(he le)-2.917 F -.15(ve)
+-.25 G 2.918(lo).15 G 2.918(fs)-2.918 G .418(hell nest-)-2.918 F(ing, a\
+nd the history number of the current command to be embedded into the pr\
+imary prompt:)72 231.6 Q/F3 10/Courier@0 SF 6($P)97 249.6 S
+(S1='\\u@\\h [\\t] \\W\($SHLVL:\\!\)\\$ ')-6 E
+(chet@odin [21:03:44] documentation\(2:636\)$ cd ..)97 261.6 Q
+(chet@odin [21:03:54] src\(2:637\)$)97 273.6 Q F0 .146(The string being\
+ assigned is surrounded by single quotes so that if it is e)72 295.2 R
+.146(xported, the v)-.15 F .146(alue of)-.25 F F1($SHL)2.646 E(VL)-.92 E
+F0(will)2.646 E(be updated by a child shell:)72 307.2 Q F3
+(chet@odin [21:17:35] src\(2:638\)$ export PS1)97 325.2 Q
+(chet@odin [21:17:40] src\(2:639\)$ bash)97 337.2 Q
+(chet@odin [21:17:46] src\(3:696\)$)97 349.2 Q F0
+(The \\$ escape is displayed as \231)72 370.8 Q F1($)A F0 2.5<9a77>C
+(hen running as a normal user)-2.5 E 2.5(,b)-.4 G(ut as \231)-2.7 E F1
+(#)A F0 2.5<9a77>C(hen running as root.)-2.5 E F1 2.5(4.9. File)72 394.8
+R(System V)2.5 E(iews)-.37 E F0 .029(Since Berk)97 410.4 R(ele)-.1 E
+2.529(yi)-.15 G .029
+(ntroduced symbolic links in 4.2 BSD, one of their most anno)-2.529 F
+.03(ying properties has been)-.1 F .764(the \231w)72 422.4 R .764
+(arping\232 to a completely dif)-.1 F .764
+(ferent area of the \214le system when using)-.25 F F1(cd)3.263 E F0
+3.263(,a)C .763(nd the resultant non-intu-)-3.263 F(iti)72 434.4 Q .704
+-.15(ve b)-.25 H(eha).15 E .405(vior of \231)-.2 F F1 .405(cd ..)B F0
+2.905(\232. The)B/F4 9/Times-Roman@0 SF(UNIX)2.905 E F0 -.1(ke)2.905 G
+.405(rnel treats symbolic links).1 F F2(physically)2.905 E F0 5.405(.W)C
+.405(hen the k)-5.405 F .405(ernel is translating)-.1 F 3.223(ap)72
+446.4 S .723(athname in which one component is a symbolic link, it repl\
+aces all or part of the pathname while pro-)-3.223 F .668
+(cessing the link.)72 458.4 R .668
+(If the contents of the symbolic link be)5.668 F .669
+(gin with a slash, the k)-.15 F .669(ernel replaces the pathname)-.1 F
+.219(entirely; if not, the link contents replace the current component.)
+72 470.4 R .219(In either case, the symbolic link is visible.)5.219 F
+.058(If the link v)72 482.4 R .058(alue is an absolute pathname, the us\
+er \214nds himself in a completely dif)-.25 F .059
+(ferent part of the \214le sys-)-.25 F(tem.)72 494.4 Q .704(Bash pro)97
+510 R .704(vides a)-.15 F F2(lo)3.203 E(gical)-.1 E F0(vie)3.203 E 3.203
+(wo)-.25 G 3.203(ft)-3.203 G .703(he \214le system.)-3.203 F .703
+(In this def)5.703 F .703(ault mode, command and \214lename com-)-.1 F
+.522(pletion and b)72 522 R .522(uiltin commands such as)-.2 F F1(cd)
+3.022 E F0(and)3.022 E F1(pushd)3.022 E F0 .522
+(which change the current w)3.022 F .522(orking directory transpar)-.1 F
+(-)-.2 E .127(ently follo)72 534 R 2.627(ws)-.25 G .127
+(ymbolic links as if the)-2.627 F 2.627(yw)-.15 G .127(ere directories.)
+-2.627 F(The)5.126 E F1($PWD)2.626 E F0 -.25(va)2.626 G .126
+(riable, which holds the shell').25 F 2.626(si)-.55 G .126(dea of)-2.626
+F .366(the current w)72 546 R .366(orking directory)-.1 F 2.866(,d)-.65
+G .367
+(epends on the path used to reach the directory rather than its ph)
+-2.866 F .367(ysical loca-)-.05 F
+(tion in the local \214le system hierarch)72 558 Q 3.8 -.65(y. F)-.05 H
+(or e).5 E(xample:)-.15 E F3 6($c)97 576 S 6(d/)-6 G(usr/local/bin)-6 E
+6($e)97 588 S(cho $PWD)-6 E(/usr/local/bin)97 600 Q 6($p)97 612 S(wd)-6
+E(/usr/local/bin)97 624 Q 6($/)97 636 S(bin/pwd)-6 E
+(/net/share/sun4/local/bin)97 648 Q 6($c)97 660 S 6(d.)-6 G(.)-6 E 6($p)
+97 672 S(wd)-6 E(/usr/local)97 684 Q 6($/)97 696 S(bin/pwd)-6 E
+(/net/share/sun4/local)97 708 Q 6($c)97 720 S 6(d.)-6 G(.)-6 E EP
+%%Page: 8 8
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-8-)282.17 48 Q/F1 10/Courier@0 SF 6($p)97 84 S
+(wd)-6 E(/usr)97 96 Q 6($/)97 108 S(bin/pwd)-6 E(/usr)97 120 Q F0 .3(On\
+e problem with this, of course, arises when programs that do not unders\
+tand the shell')72 141.6 R 2.8(sl)-.55 G .3(ogical notion of)-2.8 F .217
+(the \214le system interpret \231..)72 153.6 R 2.718<9a64>-.7 G(if)
+-2.718 E(ferently)-.25 E 5.218(.T)-.65 G .218
+(his generally happens when Bash completes \214lenames containing)-5.218
+F(\231..)72 165.6 Q 3.384<9a61>-.7 G .884
+(ccording to a logical hierarch)-3.384 F 3.384(yw)-.05 G .884
+(hich does not correspond to their ph)-3.384 F .883(ysical location.)
+-.05 F -.15(Fo)5.883 G 3.383(ru).15 G .883(sers who)-3.383 F
+(\214nd this troublesome, a corresponding)72 177.6 Q/F2 10
+/Times-Italic@0 SF(physical)2.5 E F0(vie)2.5 E 2.5(wo)-.25 G 2.5(ft)-2.5
+G(he \214le system is a)-2.5 E -.25(va)-.2 G(ilable:).25 E F1 6($c)97
+195.6 S 6(d/)-6 G(usr/local/bin)-6 E 6($p)97 207.6 S(wd)-6 E
+(/usr/local/bin)97 219.6 Q 6($s)97 231.6 S(et -o physical)-6 E 6($p)97
+243.6 S(wd)-6 E(/net/share/sun4/local/bin)97 255.6 Q/F3 10/Times-Bold@0
+SF 2.5(4.10. Inter)72 285.6 R(nationalization)-.15 E F0 .145
+(One of the most signi\214cant impro)97 301.2 R -.15(ve)-.15 G .145
+(ments in v).15 F .145(ersion 1.13 of Bash w)-.15 F .145
+(as the change to \231eight-bit clean-)-.1 F 2.933(liness\232. Pre)72
+313.2 R .433(vious v)-.25 F .432
+(ersions used the eighth bit of characters to mark whether or not the)
+-.15 F 2.932(yw)-.15 G .432(ere quoted when)-2.932 F 1.495(performing w)
+72 325.2 R 1.495(ord e)-.1 F 3.995(xpansions. While)-.15 F 1.495
+(this did not af)3.995 F 1.496
+(fect the majority of users, most of whom used only)-.25 F(se)72 337.2 Q
+-.15(ve)-.25 G 1.236(n-bit ASCII characters, some found it con\214ning.)
+.15 F(Be)6.236 E 1.236(ginning with v)-.15 F 1.236
+(ersion 1.13, Bash implemented a)-.15 F(dif)72 349.2 Q .02(ferent quoti\
+ng mechanism that did not alter the eighth bit of characters.)-.25 F
+.021(This allo)5.021 F .021(wed Bash to manipulate)-.25 F .427
+(\214les with \231odd\232 characters in their names, b)72 361.2 R .427
+(ut did nothing to help users enter those names, so v)-.2 F .426
+(ersion 1.13)-.15 F 1.458
+(introduced changes to readline that made it eight-bit clean as well.)72
+373.2 R 1.458(Options e)6.458 F 1.458(xist that force readline to)-.15 F
+.744(attach no special signi\214cance to characters with the eighth bit\
+ set \(the def)72 385.2 R .744(ault beha)-.1 F .744(vior is to con)-.2 F
+-.15(ve)-.4 G .744(rt these).15 F .641(characters to meta-pre\214x)72
+397.2 R .641(ed k)-.15 F .941 -.15(ey s)-.1 H .642
+(equences\) and to output these characters without con).15 F -.15(ve)-.4
+G .642(rsion to meta-pre-).15 F<8c78>72 409.2 Q .008(ed sequences.)-.15
+F .007(These changes, along with the e)5.007 F .007(xpansion of k)-.15 F
+-.15(ey)-.1 G .007(maps to a full eight bits, enable readline to).15 F
+-.1(wo)72 421.2 S(rk with most of the ISO-8859 f).1 E
+(amily of character sets, used by man)-.1 E 2.5(yE)-.15 G
+(uropean countries.)-2.5 E F3 2.5(4.11. POSIX)72 445.2 R(Mode)2.5 E F0
+.584(Although Bash is intended to be POSIX.2 conformant, there are area\
+s in which the def)97 460.8 R .584(ault beha)-.1 F(vior)-.2 E .463
+(is not compatible with the standard.)72 472.8 R -.15(Fo)5.463 G 2.962
+(ru).15 G .462(sers who wish to operate in a strict POSIX.2 en)-2.962 F
+.462(vironment, Bash)-.4 F .505(implements a)72 484.8 R F2 .505
+(POSIX mode)3.005 F F0 5.505(.W)C .505(hen this mode is acti)-5.505 F
+-.15(ve)-.25 G 3.005(,B).15 G .505(ash modi\214es its def)-3.005 F .505
+(ault operation where it dif)-.1 F(fers)-.25 E .267
+(from POSIX.2 to match the standard.)72 496.8 R .266
+(POSIX mode is entered when Bash is started with the)5.267 F F3(-posix)
+2.766 E F0(option.)2.766 E .149(This feature is also a)72 508.8 R -.25
+(va)-.2 G .149(ilable as an option to the).25 F F3(set)2.649 E F0 -.2
+(bu)2.649 G(iltin,).2 E F3 .149(set -o posix)2.649 F F0 5.149(.F)C .149
+(or compatibility with other GNU)-5.299 F(softw)72 520.8 Q 4.02(are tha\
+t attempts to be POSIX.2 compliant, Bash also enters POSIX mode if the \
+v)-.1 F(ariable)-.25 E F3($POSIXL)72 532.8 Q(Y_CORRECT)-.92 E F0 5.824
+(is set when Bash is started or assigned a v)8.324 F 5.825
+(alue during e)-.25 F -.15(xe)-.15 G(cution.).15 E F3($POSIX_PED)72
+544.8 Q(ANTIC)-.35 E F0 .27
+(is accepted as well, to be compatible with some older GNU utilities.)
+2.77 F .27(When Bash is)5.27 F .506(started in POSIX mode, for e)72
+556.8 R .506(xample, it sources the \214le named by the v)-.15 F .507
+(alue of)-.25 F F3($ENV)3.007 E F0 .507(rather than the \231nor)3.007 F
+(-)-.2 E(mal\232 startup \214les, and does not allo)72 568.8 Q 2.5(wr)
+-.25 G(eserv)-2.5 E(ed w)-.15 E(ords to be aliased.)-.1 E F3 2.5(5. New)
+72 592.8 R -.25(Fe)2.5 G(atur).25 E(es and Futur)-.18 E 2.5(eP)-.18 G
+(lans)-2.5 E F0 1.632(There are se)97 608.4 R -.15(ve)-.25 G 1.632
+(ral features introduced in the current v).15 F 1.631(ersion of Bash, v)
+-.15 F 1.631(ersion 1.14, and a number)-.15 F .241
+(under consideration for future releases.)72 620.4 R .242
+(This section will brie\215y detail the ne)5.242 F 2.742(wf)-.25 G .242
+(eatures in v)-2.742 F .242(ersion 1.14 and)-.15 F(describe se)72 632.4
+Q -.15(ve)-.25 G(ral features that may appear in later v).15 E(ersions.)
+-.15 E F3 2.5(5.1. New)72 656.4 R -.25(Fe)2.5 G(atur).25 E
+(es in Bash-1.14)-.18 E F0 .884(The ne)97 672 R 3.384(wf)-.25 G .884
+(eatures a)-3.384 F -.25(va)-.2 G .884(ilable in Bash-1.14 answer se).25
+F -.15(ve)-.25 G .883(ral of the most common requests for enhance-).15 F
+2.931(ments. Most)72 684 R(notably)2.931 E 2.931(,t)-.65 G .432(here is\
+ a mechanism for including non-visible character sequences in prompts, \
+such)-2.931 F .136
+(as those which cause a terminal to print characters in dif)72 696 R
+.135(ferent colors or in standout mode.)-.25 F .135(There w)5.135 F .135
+(as noth-)-.1 F .558(ing pre)72 708 R -.15(ve)-.25 G .558
+(nting the use of these sequences in earlier v).15 F .559(ersions, b)
+-.15 F .559(ut the readline redisplay algorithm assumed)-.2 F
+(each character occupied ph)72 720 Q(ysical screen space and w)-.05 E
+(ould wrap lines prematurely)-.1 E(.)-.65 E EP
+%%Page: 9 9
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-9-)282.17 48 Q .13(Readline has a fe)97 84 R
+2.63(wn)-.25 G .63 -.25(ew va)-2.63 H .13(riables, se).25 F -.15(ve)-.25
+G .13(ral ne).15 F 2.63(wb)-.25 G .13
+(indable commands, and some additional emacs mode)-2.63 F(def)72 96 Q
+.918(ault k)-.1 F 1.218 -.15(ey b)-.1 H 3.418(indings. A).15 F(ne)3.418
+E 3.418(wh)-.25 G .919(istory search mode has been implemented: in this\
+ mode, readline searches)-3.418 F .336(the history for lines be)72 108 R
+.336(ginning with the characters between the be)-.15 F .336
+(ginning of the current line and the cursor)-.15 F(.)-.55 E .555(The e)
+72 120 R .556(xisting readline incremental search commands no longer ma\
+tch identical lines more than once.)-.15 F(File-)5.556 E 1.979
+(name completion no)72 132 R 4.479(we)-.25 G 1.979(xpands v)-4.629 F
+1.979(ariables in directory names.)-.25 F 1.978(The history e)6.978 F
+1.978(xpansion f)-.15 F 1.978(acilities are no)-.1 F(w)-.25 E 1.449
+(nearly completely csh-compatible: missing modi\214ers ha)72 144 R 1.749
+-.15(ve b)-.2 H 1.449(een added and history substitution has been).15 F
+-.15(ex)72 156 S(tended.).15 E(Se)97 171.6 Q -.15(ve)-.25 G .474
+(ral of the features described earlier).15 F 2.973(,s)-.4 G .473(uch as)
+-2.973 F/F1 10/Times-Bold@0 SF .473(set -o posix)2.973 F F0(and)2.973 E
+F1($POSIX_PED)2.973 E(ANTIC)-.35 E F0 2.973(,a)C .473(re ne)-2.973 F
+2.973(wi)-.25 G(n)-2.973 E -.15(ve)72 183.6 S .106(rsion 1.14.).15 F
+.106(There is a ne)5.106 F 2.606(ws)-.25 G .106(hell v)-2.606 F
+(ariable,)-.25 E F1(OSTYPE)2.606 E F0 2.606(,t)C 2.606(ow)-2.606 G .106
+(hich Bash assigns a v)-2.606 F .106(alue that identi\214es the v)-.25 F
+(er)-.15 E(-)-.2 E 1.38(sion of)72 195.6 R/F2 9/Times-Roman@0 SF(UNIX)
+3.88 E F0(it')3.88 E 3.879(sr)-.55 G 1.379(unning on \(great for puttin\
+g architecture-speci\214c binary directories into the)-3.879 F F1($P)
+3.879 E -.95(AT)-.74 G(H).95 E F0(\).)A -1 -.8(Tw o)72 207.6 T -.25(va)
+6.215 G 2.915(riables ha).25 F 3.215 -.15(ve b)-.2 H 2.915(een renamed:)
+.15 F F1($HISTCONTR)5.416 E(OL)-.3 E F0(replaces)5.416 E F1
+($history_contr)5.416 E(ol)-.18 E F0 5.416(,a)C(nd)-5.416 E F1
+($HOSTFILE)5.416 E F0(replaces)72 219.6 Q F1
+($hostname_completion_\214le)2.521 E F0 5.021(.I)C 2.521(nb)-5.021 G
+.021(oth cases, the old names are accepted for backw)-2.521 F .02
+(ards compatibil-)-.1 F(ity)72 231.6 Q 5.788(.T)-.65 G .788(he ksh)
+-5.788 F/F3 10/Times-Italic@0 SF(select)3.288 E F0 .788
+(construct, which allo)3.288 F .788
+(ws the generation of simple menus, has been implemented.)-.25 F(Ne)
+5.788 E(w)-.25 E 1.496(capabilities ha)72 243.6 R 1.796 -.15(ve b)-.2 H
+1.496(een added to e).15 F 1.495(xisting v)-.15 F(ariables:)-.25 E F1
+($auto_r)3.995 E(esume)-.18 E F0 1.495(can no)3.995 F 3.995(wt)-.25 G
+(ak)-3.995 E 3.995(ev)-.1 G 1.495(alues of)-4.245 F F3 -.2(ex)3.995 G
+(act).2 E F0(or)3.995 E F3(sub-)3.995 E(string)72 255.6 Q F0 4.843(,a)C
+(nd)-4.843 E F1($HISTCONTR)4.843 E(OL)-.3 E F0 2.343(understands the v)
+4.843 F(alue)-.25 E F3(ignor)4.844 E(eboth)-.37 E F0 4.844(,w)C 2.344
+(hich combines the tw)-4.844 F 4.844(op)-.1 G(re)-4.844 E(viously)-.25 E
+1.556(acceptable v)72 267.6 R 4.056(alues. The)-.25 F F1(dirs)4.056 E F0
+-.2(bu)4.056 G 1.556(iltin has acquired options to print out speci\214c\
+ members of the directory).2 F 3.062(stack. The)72 279.6 R F1($nolinks)
+3.062 E F0 -.25(va)3.062 G .562(riable, which forces a ph).25 F .562
+(ysical vie)-.05 F 3.062(wo)-.25 G 3.062(ft)-3.062 G .563
+(he \214le system, has been superseded by the)-3.062 F F1<ad50>72 291.6
+Q F0 .494(option to the)2.994 F F1(set)2.994 E F0 -.2(bu)2.994 G .494
+(iltin \(equi).2 F -.25(va)-.25 G .494(lent to).25 F F1 .494(set -o ph)
+2.994 F(ysical)-.15 E F0 .493(\); the v)B .493
+(ariable is retained for backw)-.25 F .493(ards compati-)-.1 F(bility)72
+303.6 Q 5.196(.T)-.65 G .196(he v)-5.196 F .196
+(ersion string contained in)-.15 F F1($B)2.696 E(ASH_VERSION)-.3 E F0
+(no)2.696 E 2.696(wi)-.25 G .196(ncludes an indication of the patch le)
+-2.696 F -.15(ve)-.25 G 2.696(la).15 G(s)-2.696 E .85(well as the \231b)
+72 315.6 R .85(uild v)-.2 F 3.35(ersion\232. Some)-.15 F .85
+(little-used features ha)3.35 F 1.15 -.15(ve b)-.2 H .85(een remo).15 F
+-.15(ve)-.15 G 3.35(d: the).15 F F1(by)3.35 E(e)-.1 E F0(synon)3.35 E
+.85(ym for)-.15 F F1(exit)3.35 E F0(and)3.35 E(the)72 327.6 Q F1($NO_PR)
+3.498 E(OMPT_V)-.3 E(ARS)-1.35 E F0 -.25(va)3.498 G .998
+(riable are gone.).25 F .998(There is no)5.998 F 3.498(wa)-.25 G 3.498
+(no)-3.498 G -2.19 -.18(rg a)-3.498 H .998
+(nized test suite that can be run as a).18 F(re)72 339.6 Q
+(gression test when b)-.15 E(uilding a ne)-.2 E 2.5(wv)-.25 G
+(ersion of Bash.)-2.65 E 1.696(The documentation has been thoroughly o)
+97 355.2 R -.15(ve)-.15 G 1.696(rhauled: there is a ne).15 F 4.196(wm)
+-.25 G 1.695(anual page on the readline)-4.196 F .467(library and the)72
+367.2 R F3(info)2.967 E F0 .467
+(\214le has been updated to re\215ect the current v)2.967 F 2.968
+(ersion. As)-.15 F(al)2.968 E -.1(wa)-.1 G .468(ys, as man).1 F 2.968
+(yb)-.15 G .468(ugs as possi-)-3.168 F(ble ha)72 379.2 Q .3 -.15(ve b)
+-.2 H(een \214x).15 E(ed, although some surely remain.)-.15 E F1 2.5
+(5.2. Other)72 403.2 R -.25(Fe)2.5 G(atur).25 E(es)-.18 E F0 1.68
+(There are a fe)97 418.8 R 4.18(wf)-.25 G 1.68
+(eatures that I hope to include in later Bash releases.)-4.18 F 1.68
+(Some are based on w)6.68 F(ork)-.1 E(already done in other shells.)72
+430.8 Q .958(In addition to simple v)97 446.4 R .959(ariables, a future\
+ release of Bash will include one-dimensional arrays, using)-.25 F .206
+(the ksh implementation of arrays as a model.)72 458.4 R .205
+(Additions to the ksh syntax, such as)5.205 F F3(varname)2.705 E F0 .205
+(=\( ... \) to assign)B 2.587(al)72 470.4 S .087(ist of w)-2.587 F .088
+(ords directly to an array and a mechanism to allo)-.1 F 2.588(wt)-.25 G
+(he)-2.588 E F1 -.18(re)2.588 G(ad).18 E F0 -.2(bu)2.588 G .088
+(iltin to read a list of v).2 F .088(alues directly)-.25 F .092
+(into an array)72 482.4 R 2.592(,w)-.65 G .092(ould be desirable.)-2.692
+F(Gi)5.092 E -.15(ve)-.25 G 2.592(nt).15 G .092(hose e)-2.592 F .092
+(xtensions, the ksh)-.15 F F1 .092(set \255A)2.592 F F0 .091
+(syntax may not be w)2.591 F .091(orth support-)-.1 F(ing \(the)72 494.4
+Q F1<ad41>2.5 E F0(option assigns a list of v)2.5 E(alues to an array)
+-.25 E 2.5(,b)-.65 G(ut is a rather peculiar special case\).)-2.7 E .76
+(Some shells include a means of)97 510 R F3(pr)3.26 E -.1(og)-.45 G -.15
+(ra).1 G(mmable).15 E F0 -.1(wo)3.26 G .76
+(rd completion, where the user speci\214es on a per).1 F(-)-.2 E .163
+(command basis ho)72 522 R 2.663(wt)-.25 G .163(he ar)-2.663 F .163(gum\
+ents of the command are to be treated when completion is attempted: as \
+\214le-)-.18 F .194(names, hostnames, e)72 534 R -.15(xe)-.15 G .194
+(cutable \214les, and so on.).15 F .195
+(The other aspects of the current Bash implementation could)5.195 F .482
+(remain as-is; the e)72 546 R .482(xisting heuristics w)-.15 F .481
+(ould still be v)-.1 F 2.981(alid. Only)-.25 F .481
+(when completing the ar)2.981 F .481(guments to a simple)-.18 F
+(command w)72 558 Q(ould the programmable completion be in ef)-.1 E
+(fect.)-.25 E .479(It w)97 573.6 R .479(ould also be nice to gi)-.1 F
+.779 -.15(ve t)-.25 H .479(he user \214ner).15 F .479
+(-grained control o)-.2 F -.15(ve)-.15 G 2.98(rw).15 G .48
+(hich commands are sa)-2.98 F -.15(ve)-.2 G 2.98(do).15 G .48(nto the)
+-2.98 F 1.786(history list.)72 585.6 R 1.786(One proposal is for a v)
+6.786 F 1.786(ariable, tentati)-.25 F -.15(ve)-.25 G 1.786(ly named).15
+F F1(HISTIGNORE)4.286 E F0 4.285(,w)C 1.785(hich w)-4.285 F 1.785
+(ould contain a)-.1 F .496(colon-separated list of commands.)72 597.6 R
+.496(Lines be)5.496 F .496
+(ginning with these commands, after the restrictions of)-.15 F F1($HIST)
+2.997 E(-)-.92 E(CONTR)72 609.6 Q(OL)-.3 E F0(ha)2.65 E .45 -.15(ve b)
+-.2 H .15(een applied, w).15 F .15
+(ould not be placed onto the history list.)-.1 F .15
+(The shell pattern-matching capa-)5.15 F(bilities could also be a)72
+621.6 Q -.25(va)-.2 G(ilable when specifying the contents of).25 E F1
+($HISTIGNORE)2.5 E F0(.)A .729(One thing that ne)97 637.2 R .729
+(wer shells such as)-.25 F F1(wksh)3.229 E F0 .729(\(also kno)3.229 F
+.729(wn as)-.25 F F1(dtksh)3.23 E F0 3.23(\)p)C(ro)-3.23 E .73
+(vide is a command to dynami-)-.15 F 1.189
+(cally load code implementing additional b)72 649.2 R 1.189
+(uiltin commands into a running shell.)-.2 F 1.188(This ne)6.188 F 3.688
+(wb)-.25 G 1.188(uiltin w)-3.888 F(ould)-.1 E(tak)72 661.2 Q 2.875(ea)
+-.1 G 2.875(no)-2.875 G .375
+(bject \214le or shared library implementing the \231body\232 of the b)
+-2.875 F .375(uiltin \()-.2 F F3(xxx_b)A(uiltin\(\))-.2 E F0 .375
+(for those f)2.875 F(amiliar)-.1 E .052
+(with Bash internals\) and a structure containing the name of the ne)72
+673.2 R 2.552(wc)-.25 G .051(ommand, the function to call when the)
+-2.552 F(ne)72 685.2 Q 3.458(wb)-.25 G .958(uiltin is in)-3.658 F -.2
+(vo)-.4 G -.1(ke).2 G 3.458(d\().1 G .959
+(presumably de\214ned in the shared object speci\214ed as an ar)-3.458 F
+.959(gument\), and the docu-)-.18 F 1.352
+(mentation to be printed by the)72 697.2 R F1(help)3.851 E F0 1.351
+(command \(possibly present in the shared object as well\).)3.851 F
+1.351(It w)6.351 F(ould)-.1 E(manage the details of e)72 709.2 Q
+(xtending the internal table of b)-.15 E(uiltins.)-.2 E EP
+%%Page: 10 10
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-10-)279.67 48 Q 3.291(Af)97 84 S 1.291 -.25
+(ew o)-3.291 H .791(ther b).25 F .791(uiltins w)-.2 F .791
+(ould also be desirable: tw)-.1 F 3.291(oa)-.1 G .791(re the POSIX.2)
+-3.291 F/F1 10/Times-Bold@0 SF(getconf)3.292 E F0 .792
+(command, which prints)3.292 F 1.412(the v)72 96 R 1.412
+(alues of system con\214guration v)-.25 F 1.411
+(ariables de\214ned by POSIX.2, and a)-.25 F F1(diso)3.911 E(wn)-.1 E F0
+-.2(bu)3.911 G 1.411(iltin, which causes a).2 F 1.347
+(shell running with job control acti)72 108 R 1.647 -.15(ve t)-.25 H
+3.847<6f99>.15 G(for)-3.847 E 1.347
+(get about\232 one or more background jobs in its internal jobs)-.18 F
+3.465(table. Using)72 120 R F1(getconf)3.465 E F0 3.465(,f)C .965(or e)
+-3.465 F .965(xample, a user could retrie)-.15 F 1.264 -.15(ve a v)-.25
+H .964(alue for)-.1 F F1($P)3.464 E -.95(AT)-.74 G(H).95 E F0 .964
+(guaranteed to \214nd all of the)3.464 F .884
+(POSIX standard utilities, or \214nd out ho)72 132 R 3.385(wl)-.25 G
+.885
+(ong \214lenames may be in the \214le system containing a speci\214ed)
+-3.385 F(directory)72 144 Q(.)-.65 E 1.521
+(There are no implementation timetables for an)97 159.6 R 4.021(yo)-.15
+G 4.021(ft)-4.021 G 1.52(hese features, nor are there concrete plans to)
+-4.021 F(include them.)72 171.6 Q(If an)5 E(yone has comments on these \
+proposals, feel free to send me electronic mail.)-.15 E F1 2.5
+(6. Re\215ections)72 195.6 R(and Lessons Lear)2.5 E(ned)-.15 E F0 .433
+(The lesson that has been repeated most often during Bash de)97 211.2 R
+-.15(ve)-.25 G .433(lopment is that there are dark corners).15 F .181
+(in the Bourne shell, and people use all of them.)72 223.2 R .18
+(In the original description of the Bourne shell, quoting and)5.181 F
+.073(the shell grammar are both poorly speci\214ed and incomplete; subs\
+equent descriptions ha)72 235.2 R .373 -.15(ve n)-.2 H .073
+(ot helped much.).15 F 1.856(The grammar presented in Bourne')72 247.2 R
+4.356(sp)-.55 G 1.856(aper describing the shell distrib)-4.356 F 1.855
+(uted with the Se)-.2 F -.15(ve)-.25 G 1.855(nth Edition of).15 F/F2 9
+/Times-Roman@0 SF(UNIX)72 259.2 Q F0 2.5<8769>C 2.5(ss)-2.5 G 2.5(of)
+-2.5 G(ar of)-2.6 E 2.5(ft)-.25 G(hat it does not allo)-2.5 E 2.5(wt)
+-.25 G(he command)-2.5 E/F3 10/Courier@0 SF(who|wc)2.5 E F0 5(.I)C 2.5
+(nf)-5 G(act, as T)-2.6 E(om Duf)-.8 E 2.5(fs)-.25 G(tates:)-2.5 E 1.375
+(Nobody really kno)97 274.8 R 1.375(ws what the Bourne shell')-.25 F
+3.875(sg)-.55 G 1.375(rammar is.)-3.875 F(Ev)6.376 E 1.376(en e)-.15 F
+1.376(xamination of the source)-.15 F(code is little help.\210)97 286.8
+Q .382(The POSIX.2 standard includes a)72 302.4 R/F4 10/Times-Italic@0
+SF(yacc)2.882 E F0 .382
+(grammar that comes close to capturing the Bourne shell')2.882 F 2.882
+(sb)-.55 G(eha)-2.882 E(vior)-.2 E(,)-.4 E -.2(bu)72 314.4 S 3.246(ti).2
+G 3.246(td)-3.246 G(isallo)-3.246 E .747(ws some constructs which sh ac\
+cepts without complaint \255 and there are scripts out there that)-.25 F
+.501(use them.)72 326.4 R .501(It took a fe)5.501 F 3.001(wv)-.25 G .501
+(ersions and se)-3.151 F -.15(ve)-.25 G .501(ral b).15 F .5
+(ug reports before Bash implemented sh-compatible quoting,)-.2 F .279
+(and there are still some \231le)72 338.4 R -.05(ga)-.15 G .279
+(l\232 sh constructs which Bash \215ags as syntax errors.).05 F .28
+(Complete sh compatibility)5.28 F(is a tough nut.)72 350.4 Q 1.231
+(The shell is bigger and slo)97 366 R 1.231(wer than I w)-.25 F 1.231
+(ould lik)-.1 F 1.23(e, though the current v)-.1 F 1.23
+(ersion is substantially f)-.15 F(aster)-.1 E .086(than pre)72 378 R
+(viously)-.25 E 5.086(.T)-.65 G .087
+(he readline library could stand a substantial re)-5.086 F 2.587
+(write. A)-.25 F .087(hand-written parser to replace the)2.587 F
+(current)72 390 Q F4(yacc)2.978 E F0 .478(-generated one w)B .477
+(ould probably result in a speedup, and w)-.1 F .477(ould solv)-.1 F
+2.977(eo)-.15 G .477(ne glaring problem:)-2.977 F(the)5.477 E .384
+(shell could parse commands in \231$\(...\)\232 constructs as the)72 402
+R 2.884(ya)-.15 G .385
+(re entered, rather than reporting errors when the)-2.884 F
+(construct is e)72 414 Q(xpanded.)-.15 E 1.064(As al)97 429.6 R -.1(wa)
+-.1 G 1.064(ys, there is some chaf).1 F 3.564(ft)-.25 G 3.564(og)-3.564
+G 3.564(ow)-3.564 G 1.064(ith the wheat.)-3.564 F 1.063
+(Areas of duplicated functionality need to be)6.063 F .382(cleaned up.)
+72 441.6 R .382(There are se)5.382 F -.15(ve)-.25 G .382
+(ral cases where Bash treats a v).15 F .382
+(ariable specially to enable functionality a)-.25 F -.25(va)-.2 G
+(ilable).25 E .185(another w)72 453.6 R .185(ay \()-.1 F F1($notify)A F0
+(vs.)2.684 E F1 .184(set -o notify)5.184 F F0(and)2.684 E F1($nolinks)
+2.684 E F0(vs.)2.684 E F1 .184(set -o ph)2.684 F(ysical)-.15 E F0 2.684
+(,f)C .184(or instance\); the special treatment)-2.684 F 3.421(of the v)
+72 465.6 R 3.421(ariable name should probably be remo)-.25 F -.15(ve)
+-.15 G 5.921(d. A).15 F(fe)5.921 E 5.921(wm)-.25 G 3.422
+(ore things could stand remo)-5.921 F -.25(va)-.15 G 3.422(l; the).25 F
+F1($allo)72 477.6 Q(w_null_glob_expansion)-.1 E F0(and)4.112 E F1
+($glob_dot_\214lenames)4.112 E F0 -.25(va)4.111 G 1.611
+(riables are of particularly questionable v).25 F(alue.)-.25 E(The)72
+489.6 Q F1($[...])3.977 E F0 1.477(arithmetic e)3.977 F -.25(va)-.25 G
+1.478(luation syntax is redundant no).25 F 3.978(wt)-.25 G 1.478
+(hat the POSIX-mandated)-3.978 F F1($\(\(...\)\))3.978 E F0 1.478
+(construct has)3.978 F .326(been implemented, and could be deleted.)72
+501.6 R .326(It w)5.326 F .326(ould be nice if the te)-.1 F .326
+(xt output by the)-.15 F F1(help)2.825 E F0 -.2(bu)2.825 G .325
+(iltin were e).2 F(xter)-.15 E(-)-.2 E .061
+(nal to the shell rather than compiled into it.)72 513.6 R .062
+(The beha)5.062 F .062(vior enabled by)-.2 F F1
+($command_oriented_history)2.562 E F0 2.562(,w)C(hich)-2.562 E 1.125
+(causes the shell to attempt to sa)72 525.6 R 1.424 -.15(ve a)-.2 H
+1.124(ll lines of a multi-line command in a single history entry).15 F
+3.624(,s)-.65 G 1.124(hould be)-3.624 F(made the def)72 537.6 Q
+(ault and the v)-.1 E(ariable remo)-.25 E -.15(ve)-.15 G(d.).15 E F1 2.5
+(7. A)72 561.6 R -.1(va)-1 G(ilability).1 E F0 .047
+(As with all other GNU softw)97 577.2 R .047(are, Bash is a)-.1 F -.25
+(va)-.2 G .047(ilable for anon).25 F .047(ymous FTP from)-.15 F F4(pr)
+2.547 E(ep.ai.mit.edu:/pub/gnu)-.37 E F0 1.05(and from other GNU softw)
+72 589.2 R 1.05(are mirror sites.)-.1 F 1.049(The current v)6.049 F
+1.049(ersion is in)-.15 F F4(bash-1.14.1.tar)3.549 E(.gz)-1.11 E F0
+1.049(in that directory)3.549 F(.)-.65 E(Use)72 601.2 Q F4(ar)5.965 E
+-.15(ch)-.37 G(ie).15 E F0 3.465(to \214nd the nearest archi)5.965 F
+3.766 -.15(ve s)-.25 H 5.966(ite. The).15 F 3.466(latest v)5.966 F 3.466
+(ersion is al)-.15 F -.1(wa)-.1 G 3.466(ys a).1 F -.25(va)-.2 G 3.466
+(ilable for FTP from).25 F F4(bash.CWR)72 613.2 Q -.25(U.)-.4 G
+(Edu:/pub/dist.).25 E F0(Bash documentation is a)5 E -.25(va)-.2 G
+(ilable for FTP from).25 E F4(bash.CWR)2.5 E -.25(U.)-.4 G
+(Edu:/pub/bash.).25 E F0 1.169(The Free Softw)97 628.8 R 1.169(are F)-.1
+F 1.169(oundation sells tapes and CD-R)-.15 F 1.168
+(OMs containing Bash; send electronic mail to)-.4 F F3
+(gnu@prep.ai.mit.edu)72 640.8 Q F0(or call)2.5 E F3(+1-617-876-3296)2.5
+E F0(for more information.)2.5 E .694(Bash is also distrib)97 656.4 R
+.694(uted with se)-.2 F -.15(ve)-.25 G .694(ral v).15 F .694(ersions of)
+-.15 F F2(UNIX)3.194 E F0 .694(-compatible systems.)B .695
+(It is included as /bin/sh)5.694 F .948(and /bin/bash on se)72 668.4 R
+-.15(ve)-.25 G .948(ral Linux distrib).15 F .948
+(utions \(more about the dif)-.2 F .948
+(ference in a moment\), and as contrib)-.25 F(uted)-.2 E .32 LW 144
+676.4 72 676.4 DL/F5 8/Times-Roman@0 SF .781
+(\207S. R. Bourne, \231UNIX T)72 688.2 R .781(ime-Sharing System:)-.28 F
+.781(The UNIX Shell\232,)4.781 F/F6 8/Times-Italic@0 SF .78
+(Bell System T)2.78 F(ec)-.736 E .78(hnical J)-.12 F(ournal)-.2 E F5
+2.78(,5)C .78(7\(6\), July-)-2.78 F(August, 1978, pp. 1971-1990.)72
+698.2 Q<8854>72 710 Q .431(om Duf)-.64 F .431
+(f, \231Rc \255 A Shell for Plan 9 and)-.2 F/F7 7/Times-Roman@0 SF(UNIX)
+2.432 E F5(systems\232,)2.432 E F6(Pr)2.432 E .432
+(oc. of the Summer 1990 EUUG Confer)-.36 F(ence)-.296 E F5 2.432(,L)C
+(on-)-2.432 E(don, July)72 720 Q 2(,1)-.52 G(990, pp. 21-33.)-2 E EP
+%%Page: 11 11
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(-11-)279.67 48 Q(softw)72 84 Q(are in BSDI')-.1
+E 2.5(sB)-.55 G(SD/386* and FreeBSD.)-2.5 E .598(The Linux distrib)97
+99.6 R .598(ution deserv)-.2 F .598(es special mention.)-.15 F .598
+(There are tw)5.598 F 3.099(oc)-.1 G .599
+(on\214gurations included in the stan-)-3.099 F .733(dard Bash distrib)
+72 111.6 R .732(ution: a \231normal\232 con\214guration, in which all o\
+f the standard features are included, and a)-.2 F .519(\231minimal\232 \
+con\214guration, which omits job control, aliases, history and command \
+line editing, the directory)72 123.6 R .886(stack and)72 135.6 R/F1 10
+/Times-Bold@0 SF(pushd/popd/dirs,)3.386 E F0 .886(process substitution,\
+ prompt string special character decoding, and the)3.386 F/F2 10
+/Times-Italic@0 SF(select)3.385 E F0 3.368(construct. This)72 147.6 R
+.868(minimal v)3.368 F .869
+(ersion is designed to be a drop-in replacement for the traditional)-.15
+F/F3 9/Times-Roman@0 SF(UNIX)3.369 E F0(/bin/sh,)3.369 E
+(and is included as the Linux /bin/sh in se)72 159.6 Q -.15(ve)-.25 G
+(ral packagings.).15 E F1 2.5(8. Conclusion)72 183.6 R F0 .8
+(Bash is a w)97 199.2 R(orth)-.1 E 3.3(ys)-.05 G .8(uccessor to sh.)-3.3
+F .8(It is suf)5.8 F .8(\214ciently portable to run on nearly e)-.25 F
+-.15(ve)-.25 G .8(ry v).15 F .8(ersion of)-.15 F F3(UNIX)3.299 E F0 .31
+(from 4.3 BSD to SVR4.2, and se)72 211.2 R -.15(ve)-.25 G(ral).15 E F3
+(UNIX)2.81 E F0 -.1(wo)2.81 G(rkalik).1 E 2.81(es. It)-.1 F .311(is rob)
+2.81 F .311(ust enough to replace sh on most of those)-.2 F 1.515
+(systems, and pro)72 223.2 R 1.515(vides more functionality)-.15 F 6.515
+(.I)-.65 G 4.015(th)-6.515 G 1.515(as se)-4.015 F -.15(ve)-.25 G 1.515
+(ral thousand re).15 F 1.515(gular users, and their feedback has)-.15 F
+(helped to mak)72 235.2 Q 2.5(ei)-.1 G 2.5(ta)-2.5 G 2.5(sg)-2.5 G
+(ood as it is today \255 a testament to the bene\214ts of free softw)
+-2.5 E(are.)-.1 E .32 LW 144 708.2 72 708.2 DL/F4 8/Times-Roman@0 SF
+(*BSD/386 is a trademark of Berk)72 720 Q(ele)-.08 E 2(yS)-.12 G(oftw)-2
+E(are Design, Inc.)-.08 E EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/article.pt.ps b/doc/article.pt.ps
new file mode 100644 (file)
index 0000000..875a04e
--- /dev/null
@@ -0,0 +1,1331 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.08
+%%DocumentNeededResources: font Palatino-Bold
+%%+ font Palatino-Italic
+%%+ font Palatino-Roman
+%%+ font Courier
+%%DocumentSuppliedResources: procset grops 1.08 0
+%%Pages: 12
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.08 0
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll 
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/FL{
+currentgray exch setgray fill setgray
+}bind def
+/BL/fill load def
+/LW/setlinewidth load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Palatino-Bold
+%%IncludeResource: font Palatino-Italic
+%%IncludeResource: font Palatino-Roman
+%%IncludeResource: font Courier
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
+792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
+/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
+/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
+/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
+/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
+/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
+/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
+/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
+/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
+/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
+/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
+/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
+/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
+/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
+/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
+/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
+/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
+/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
+/udieresis/yacute/thorn/ydieresis]def/Courier@0 ENC0/Courier RE
+/Palatino-Roman@0 ENC0/Palatino-Roman RE/Palatino-Italic@0 ENC0/Palatino-Italic
+RE/Palatino-Bold@0 ENC0/Palatino-Bold RE
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 12/Palatino-Bold@0 SF(Bash \255 The GNU shell*)223.71 120 Q/F1 10
+/Palatino-Italic@0 SF(Chet Ramey)263.415 144 Q(Case W)220.45 156 Q
+(estern Reserve University)-.2 E(chet@po.cwru.edu)251.305 168 Q/F2 10
+/Palatino-Bold@0 SF 2.5(1. Introduction)72 234 R(Bash)97 249.6 Q/F3 10
+/Palatino-Roman@0 SF .551(is the shell, or command language interpr)3.051 F
+(eter)-.18 E 3.051(,t)-.74 G .55(hat will appear in the GNU operating)334.708
+249.6 R 4.36(system. The)72 261.6 R 1.86(name is an acr)4.36 F 1.861
+(onym for the `)-.18 F 1.861(`Bourne-Again SHell')-.37 F 1.861
+(', a pun on Steve Bourne, the)-.37 F 1.274(author of the dir)72 273.6 R 1.274
+(ect ancestor of the curr)-.18 F(ent)-.18 E/F4 9/Palatino-Roman@0 SF(UNIX)3.774
+E F3 3.773<8773>C(hell)307.862 273.6 Q F1(/bin/sh)3.773 E F3 3.773(,w)C 1.273
+(hich appear)370.458 273.6 R 1.273(ed in the Seventh)-.18 F
+(Edition Bell Labs Resear)72 285.6 Q(ch version of)-.18 E F4(UNIX)2.5 E F3(.)A
+.925(Bash is an)97 301.2 R F2(sh)3.425 E F3 .925
+(\255compatible shell that incorporates useful featur)B .926(es fr)-.18 F .926
+(om the Korn shell \()-.18 F F2(ksh)A F3(\))A .737(and the C shell \()72 313.2
+R F2(csh)A F3 .737(\), described later in this article.)B .737
+(It is ultimately intended to be a conformant)5.737 F .278
+(implementation of the IEEE POSIX Shell and Utilities speci\214cation \(IEEE W)
+72 325.2 R .279(orking Gr)-.92 F .279(oup 1003.2\).)-.18 F(It of)72 337.2 Q
+(fers functional impr)-.18 E(ovements over sh for both interactive and pr)-.18
+E(ogramming use.)-.18 E 1.299(While the GNU operating system will most likely \
+include a version of the Berkeley shell)97 352.8 R .527
+(csh, Bash will be the default shell.)72 364.8 R .527(Like other GNU softwar)
+5.527 F .527(e, Bash is quite portable.)-.18 F .527(It curr)5.527 F(ently)-.18
+E -.08(ru)72 376.8 S 1.391(ns on nearly every version of).08 F F4(UNIX)3.891 E
+F3 1.391(and a few other operating systems \255 an independently-)3.891 F .278
+(supported port exists for OS/2, and ther)72 388.8 R 2.779(ea)-.18 G .639 -.18
+(re r)264.36 388.8 T .279(umors of ports to DOS and W).1 F .279(indows NT)-.55
+F 5.279(.P)-.74 G .279(orts to)475.591 388.8 R F4(UNIX)72 400.8 Q F3
+(-like systems such as QNX and Minix ar)A 2.5(ep)-.18 G
+(art of the distribution.)285.547 400.8 Q .897
+(The original author of Bash was Brian Fox, an employee of the Fr)97 416.4 R
+.896(ee Softwar)-.18 F 3.396(eF)-.18 G(oundation.)455.63 416.4 Q 1.287
+(The curr)72 428.4 R 1.287(ent developer and maintainer is Chet Ramey)-.18 F
+3.787(,av)-1.11 G 1.287(olunteer who works at Case W)335.573 428.4 R(estern)
+-.92 E(Reserve University)72 440.4 Q(.)-1.11 E F2 2.5(2. What')72 464.4 R 2.5
+(sP)-.55 G(OSIX, anyway?)124.22 464.4 Q F1(POSIX)97 480 Q F3 .947
+(is a name originally coined by Richar)5.113 F 3.447(dS)-.18 G .947
+(tallman for a family of open system stan-)316.422 480 R(dar)72 492 Q .644
+(ds based on)-.18 F F4(UNIX)3.144 E F3 5.644(.T)C(her)181.403 492 Q 3.144(ea)
+-.18 G 1.004 -.18(re a n)208.717 492 T .644(umber of aspects of).18 F F4(UNIX)
+3.145 E F3 .645(under consideration for standar)3.145 F(d-)-.18 E .814
+(ization, fr)72 504 R .814(om the basic system services at the system call and\
+ C library level to applications and)-.18 F 1.191
+(tools to system administration and management.)72 516 R 1.192(Each ar)6.191 F
+1.192(ea of standar)-.18 F 1.192(dization is assigned to a)-.18 F(working gr)72
+528 Q(oup in the 1003 series.)-.18 E .426
+(The POSIX Shell and Utilities standar)97 543.6 R 2.926(dh)-.18 G .426
+(as been developed by IEEE W)279.198 543.6 R .426(orking Gr)-.92 F .426
+(oup 1003.2)-.18 F .238
+(\(POSIX.2\).\210 It concentrates on the command interpr)72 555.6 R .238
+(eter interface and utility pr)-.18 F .238(ograms commonly)-.18 F 1.212
+(executed fr)72 567.6 R 1.212(om the command line or by other pr)-.18 F 3.712
+(ograms. An)-.18 F 1.212(initial version of the standar)3.712 F 3.712(dh)-.18 G
+(as)494.76 567.6 Q .695(been appr)72 579.6 R .695
+(oved and published by the IEEE, and work is curr)-.18 F .694
+(ently underway to update it.)-.18 F(Ther)5.694 E(e)-.18 E(ar)72 591.6 Q 2.5
+(ef)-.18 G(our primary ar)91.39 591.6 Q(eas of work in the 1003.2 standar)-.18
+E(d:)-.18 E 18.94<8341>72 607.2 S .397
+(spects of the shell's syntax and command language.)104.78 607.2 R 2.897(An)
+5.397 G .397(umber of special builtins such as)357.913 607.2 R F2(cd)97 619.2 Q
+F3(and)3.144 E F2(exec)3.144 E F3(ar)3.144 E 3.144(eb)-.18 G .644(eing speci\
+\214ed as part of the shell, since their functionality usually cannot)175.586
+619.2 R(be implemented by a separate executable;)97 631.2 Q 18.94<8341>72 646.8
+S .661(set of utilities to be called by shell scripts and applications.)107.94
+646.8 R .661(Examples ar)5.661 F 3.161(ep)-.18 G -.18(ro)447.859 646.8 S .661
+(grams like).18 F F1 3.472(sed, tr)97 658.8 R(,)-.74 E F3(and)5.972 E F1(awk.)
+4.306 E F3 1.806(Utilities commonly implemented as shell builtins ar)5.972 F
+4.305(ed)-.18 G 1.805(escribed in this)433.67 658.8 R .32 LW 76 668.8 72 668.8
+DL 80 668.8 76 668.8 DL 84 668.8 80 668.8 DL 88 668.8 84 668.8 DL 92 668.8 88
+668.8 DL 96 668.8 92 668.8 DL 100 668.8 96 668.8 DL 104 668.8 100 668.8 DL 108
+668.8 104 668.8 DL 112 668.8 108 668.8 DL 116 668.8 112 668.8 DL 120 668.8 116
+668.8 DL 124 668.8 120 668.8 DL 128 668.8 124 668.8 DL 132 668.8 128 668.8 DL
+136 668.8 132 668.8 DL 140 668.8 136 668.8 DL 144 668.8 140 668.8 DL/F5 8
+/Palatino-Roman@0 SF(*An earlier version of this article appear)72 678.8 Q
+(ed in The Linux Journal.)-.144 E<87>72 688.8 Q/F6 7/Palatino-Roman@0 SF(UNIX)2
+E F5(is a trademark of Bell Laboratories.)2 E(\210IEEE,)72 698.8 Q/F7 8
+/Palatino-Italic@0 SF 1.14(IEEE Standard for Information T)3.14 F 1.141
+(echnology -- Portable Operating System Interface \(POSIX\) Part 2: Shell and)
+-.888 F(Utilities)72 708.8 Q F5 2(,1)C(992.)106.672 708.8 Q EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-2-)279.67 48 S .638(section, such as)97 84 R/F1
+10/Palatino-Bold@0 SF(test)3.138 E F0(and)3.138 E F1(kill)3.138 E F0 5.638(.A)C
+3.138(ne)240.928 84 S .638
+(xpansion of this section's scope, termed the User Porta-)254.676 84 R
+(bility Extension, or UPE, has standar)97 96 Q(dized interactive pr)-.18 E
+(ograms such as)-.18 E/F2 10/Palatino-Italic@0 SF(vi)2.5 E F0(and)4.166 E F2
+(mailx;)2.5 E F0 18.94<8341>72 111.6 S(gr)108.58 111.6 Q 1.3
+(oup of functional interfaces to services pr)-.18 F 1.299
+(ovided by the shell, such as the traditional)-.18 F/F3 10/Courier@0 SF
+(system\(\))97 123.6 Q F0 3.385(Cl)3.385 G .885(ibrary function.)161.77 123.6 R
+(Ther)5.885 E 3.385(ea)-.18 G 1.245 -.18(re f)271.195 123.6 T .885
+(unctions to perform shell wor).18 F 3.385(de)-.18 G .885(xpansions, per)
+435.555 123.6 R(-)-.18 E 1.945(form \214lename expansion \()97 135.6 R F2
+(globbing)A F0 1.945(\), obtain values of POSIX.2 system con\214guration vari-)
+B(ables, r)97 147.6 Q(etrieve values of envir)-.18 E(onment variables \()-.18 E
+F3(getenv\(\))A F0(\), and other services;).833 E 18.94<8341>72 163.2 S
+(suite of `)107.28 163.2 Q(`development')-.37 E 2.5('u)-.37 G(tilities such as)
+219.63 163.2 Q F2(c89)2.5 E F0(\(the POSIX.2 version of)4.166 E F2(cc)2.5 E F0
+(\), and)A F2(yacc.)2.5 E F0 1.326(Bash is concerned with the aspects of the s\
+hell's behavior de\214ned by POSIX.2.)97 178.8 R 1.326(The shell)6.326 F 1.156
+(command language has of course been standar)72 190.8 R 1.156
+(dized, including the basic \215ow contr)-.18 F 1.156(ol and pr)-.18 F(o-)-.18
+E 1.168(gram execution constr)72 202.8 R 1.168(ucts, I/O r)-.08 F(edir)-.18 E
+1.168(ection and pipelining, ar)-.18 F 1.168(gument handling, variable expan-)
+-.18 F 1(sion, and quoting.)72 214.8 R(The)6 E F2(special)3.5 E F0 .999
+(builtins, which must be implemented as part of the shell to pr)5.166 F(o-)-.18
+E .698(vide the desir)72 226.8 R .698(ed functionality)-.18 F 3.198(,a)-1.11 G
+1.059 -.18(re s)213.942 226.8 T .699
+(peci\214ed as being part of the shell; examples of these ar).18 F(e)-.18 E F1
+(eval)3.199 E F0(and)72 238.8 Q F1(export)3.339 E F0 5.839(.O)C .839(ther util\
+ities appear in the sections of POSIX.2 not devoted to the shell which ar)
+137.358 238.8 R(e)-.18 E .131(commonly \(and in some cases must be\) implement\
+ed as builtin commands, such as)72 250.8 R F1(read)2.632 E F0(and)2.632 E F1
+(test)2.632 E F0(.)A .408(POSIX.2 also speci\214es aspects of the shell's inte\
+ractive behavior as part of the UPE, including job)72 262.8 R(contr)72 274.8 Q
+1.726(ol and command line editing.)-.18 F(Inter)6.726 E 1.726
+(estingly enough, only)-.18 F F2(vi)4.227 E F0 1.727
+(-style line editing commands)B(have been standar)72 286.8 Q(dized;)-.18 E F2
+(emacs)2.5 E F0(editing commands wer)2.5 E 2.5(el)-.18 G
+(eft out due to objections.)321.07 286.8 Q .376
+(While POSIX.2 includes much of what the shell has traditionally pr)97 302.4 R
+.375(ovided, some important)-.18 F .183(things have been omitted as being `)72
+314.4 R .183(`beyond its scope.')-.37 F 5.184('T)-.37 G(her)324.548 314.4 Q
+2.684(ei)-.18 G .184(s, for instance, no mention of a dif-)349.312 314.4 R(fer)
+72 326.4 Q 1.325(ence between a)-.18 F F2(login)3.825 E F0 1.325
+(shell and any other interactive shell \(since POSIX.2 does not specify a)5.491
+F .068(login pr)72 338.4 R 2.568(ogram\). No)-.18 F .068
+(\214xed startup \214les ar)2.568 F 2.568(ed)-.18 G .068
+(e\214ned, either \255 the standar)264.836 338.4 R 2.569(dd)-.18 G .069
+(oes not mention)398.607 338.4 R F2(.pr)2.569 E(o\214le)-.18 E F0(.)1.666 E F1
+2.5(3. Basic)72 362.4 R(Bash features)2.5 E F0 1.359(Since the Bourne shell pr)
+97 378 R 1.358(ovides Bash with most of its philosophical underpinnings, Bash)
+-.18 F .721(inherits most of its featur)72 390 R .721(es and functionality fr)
+-.18 F .721(om sh.)-.18 F .722(Bash implements all of the traditional sh)5.721
+F 1.342(\215ow contr)72 402 R 1.342(ol constr)-.18 F 1.342(ucts \()-.08 F F2
+(for)A F0(,)A F2(if)3.842 E F0(,)A F2(while)3.842 E F0 3.842(,e)C 3.842
+(tc.\). All)245.072 402 R 1.342
+(of the Bourne shell builtins, including those not)3.842 F .034
+(speci\214ed in the POSIX.2 standar)72 414 R .034(d, appear in Bash.)-.18 F
+(Shell)5.034 E F2(functions)2.534 E F0 2.534(,i)C(ntr)368.5 414 Q .035
+(oduced in the SVR2 version)-.18 F .237(of the Bourne shell, ar)72 426 R 2.736
+(es)-.18 G .236(imilar to shell scripts, but ar)181.472 426 R 2.736(ed)-.18 G
+.236(e\214ned using a special syntax and ar)319.828 426 R 2.736(ee)-.18 G(xe-)
+490.72 426 Q .276(cuted in the same pr)72 438 R .276
+(ocess as the calling shell.)-.18 F .277
+(Bash has shell functions which behave in a fashion)5.276 F(upwar)72 450 Q .114
+(d-compatible with sh functions.)-.18 F(Ther)5.114 E 2.614(ea)-.18 G .474 -.18
+(re c)279.8 450 T .114(ertain shell variables that Bash interpr).18 F .113
+(ets in the)-.18 F .975(same way as sh, such as)72 462 R F1(PS1)3.475 E F0(,)A
+F1(IFS)3.475 E F0 3.475(,a)C(nd)235.91 462 Q F1 -.74(PA)3.475 G(TH)-.18 E F0
+5.975(.B)C .976(ash implements essentially the same grammar)293.13 462 R(,)-.74
+E .025(parameter and variable expansion semantics, r)72 474 R(edir)-.18 E .025
+(ection, and quoting as the Bourne shell.)-.18 F(Wher)5.025 E(e)-.18 E(dif)72
+486 Q(fer)-.18 E 2.74(ences appear between the POSIX.2 standar)-.18 F 5.24(da)
+-.18 G 2.74(nd traditional sh behavior)314.53 486 R 5.24(,B)-.74 G 2.74
+(ash follows)451.05 486 R(POSIX.)72 498 Q .494(The Korn Shell \()97 513.6 R F1
+(ksh)A F0 2.994(\)i)C 2.994(sad)196.116 513.6 S .494
+(escendent of the Bourne shell written at A)217.454 513.6 R .494
+(T&T Bell Laboratories)-.74 F 1.435(by David Korn\207.)72 525.6 R 1.435(It pr)
+6.435 F 1.435(ovides a number of useful featur)-.18 F 1.436
+(es that POSIX and Bash have adopted.)-.18 F .87
+(Many of the interactive facilities in POSIX.2 have their r)72 537.6 R .869
+(oots in the ksh: for example, the POSIX)-.18 F .85(and ksh job contr)72 549.6
+R .85(ol facilities ar)-.18 F 3.351(en)-.18 G .851
+(early identical. Bash includes featur)225.181 549.6 R .851(es fr)-.18 F .851
+(om the Korn Shell for)-.18 F .564(both interactive use and shell pr)72 561.6 R
+3.063(ogramming. For)-.18 F(pr)3.063 E .563(ogramming, Bash pr)-.18 F .563
+(ovides variables such as)-.18 F F1(RANDOM)72 573.6 Q F0(and)2.768 E F1(REPL)
+2.768 E(Y)-.92 E F0 2.768(,t)C(he)184.284 573.6 Q F1(typeset)2.768 E F0 .268
+(builtin, the ability to r)2.768 F .269(emove substrings fr)-.18 F .269
+(om variables based)-.18 F .582(on patterns, and shell arithmetic.)72 585.6 R
+F1(RANDOM)5.582 E F0 .581(expands to a random number each time it is r)3.081 F
+(efer)-.18 E(-)-.18 E 2.583(enced; assigning a value to)72 597.6 R F1(RANDOM)
+5.083 E F0 2.583(seeds the random number generator)5.083 F(.)-.74 E F1(REPL)
+7.583 E(Y)-.92 E F0 2.584(is the)5.083 F .034(default variable used by the)72
+609.6 R F1(read)2.534 E F0 .034(builtin when no variable names ar)2.534 F 2.534
+(es)-.18 G .034(upplied as ar)383.348 609.6 R 2.534(guments. The)-.18 F F1
+(typeset)72 621.6 Q F0 .416
+(builtin is used to de\214ne variables and give them attributes such as)2.916 F
+F1(readonly)2.916 E F0 5.416(.B)C .416(ash arith-)461.754 621.6 R 1.31
+(metic allows the evaluation of an expr)72 633.6 R 1.31
+(ession and the substitution of the r)-.18 F 3.81(esult. Shell)-.18 F
+(variables)3.81 E .561(may be used as operands, and the r)72 645.6 R .561
+(esult of an expr)-.18 F .561(ession may be assigned to a variable.)-.18 F
+(Nearly)5.562 E(all of the operators fr)72 657.6 Q(om the C language ar)-.18 E
+2.5(ea)-.18 G(vailable, with the same pr)271.68 657.6 Q(ecedence r)-.18 E
+(ules:)-.08 E F3 6($e)97 675.6 S(cho $\(\(3 + 5 * 32\)\))115 675.6 Q(163)97
+687.6 Q .32 LW 76 698 72 698 DL 80 698 76 698 DL 84 698 80 698 DL 88 698 84 698
+DL 92 698 88 698 DL 96 698 92 698 DL 100 698 96 698 DL 104 698 100 698 DL 108
+698 104 698 DL 112 698 108 698 DL 116 698 112 698 DL 120 698 116 698 DL 124 698
+120 698 DL 128 698 124 698 DL 132 698 128 698 DL 136 698 132 698 DL 140 698 136
+698 DL 144 698 140 698 DL/F4 8/Palatino-Roman@0 SF
+(\207Morris Bolsky and David Korn,)72 708 Q/F5 8/Palatino-Italic@0 SF
+(The KornShell Command and Pr)2 E(ogramming Language)-.144 E F4 2(,P)C -.144
+(re)374.688 708 S(ntice Hall, 1989.).144 E EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-3-)279.67 48 S .953
+(For interactive use, Bash implements ksh-style aliases and builtins such as)72
+84 R/F1 10/Palatino-Bold@0 SF(fc)3.453 E F0 .953(\(discussed below\))3.453 F
+(and)72 96 Q F1(jobs)2.603 E F0 5.103(.B)C .104
+(ash aliases allow a string to be substituted for a command name.)124.686 96 R
+.104(They can be used to)5.104 F(cr)72 108 Q .936(eate a mnemonic for a)-.18 F
+/F2 9/Palatino-Roman@0 SF(UNIX)3.435 E F0 .935(command name \()3.435 F/F3 10
+/Courier@0 SF .935(alias del=rm)B F0 .935(\), to expand a single wor)B 3.435
+(dt)-.18 G 3.435(oa)490.105 108 S 1.465(complex command \()72 120 R F3 1.465
+(alias news='xterm -g 80x45 -title trn -e trn -e -S1 -N)B(&')72 132 Q F0 .738
+(\), or to ensur)B 3.238(et)-.18 G .737
+(hat a command is invoked with a basic set of options \()153.612 132 R F3 .737
+(alias ls="/bin/ls)B(-F")72 144 Q F0(\).)A .4(The C shell \()97 159.6 R F1(csh)
+A F0 .401(\)\207, originally written by Bill Joy while at Berkeley)B 2.901(,i)
+-1.11 G 2.901(sw)396.846 159.6 S .401(idely used and quite)412.327 159.6 R .002
+(popular for its interactive facilities.)72 171.6 R .002
+(Bash includes a csh-compatible history expansion mechanism)5.002 F(\(`)72
+183.6 Q 2.058(`! history')-.37 F 2.058
+('\), brace expansion, access to a stack of dir)-.37 F 2.058(ectories via the)
+-.18 F F1(pushd)4.558 E F0(,)A F1(popd)4.558 E F0 4.558(,a)C(nd)469.742 183.6 Q
+F1(dirs)4.558 E F0 .648
+(builtins, and tilde expansion, to generate users' home dir)72 195.6 R 3.148
+(ectories. T)-.18 F .647(ilde expansion has also been)-.55 F
+(adopted by both the Korn Shell and POSIX.2.)72 207.6 Q(Ther)97 223.2 Q 2.98
+(ew)-.18 G(er)133.62 223.2 Q 2.98(ec)-.18 G .48(ertain ar)154.39 223.2 R .48
+(eas in which POSIX.2 felt standar)-.18 F .48(dization was necessary)-.18 F
+2.98(,b)-1.11 G .48(ut no exist-)453.78 223.2 R 1.061(ing implementation pr)72
+235.2 R 1.062(ovided the pr)-.18 F 1.062(oper behavior)-.18 F 6.062(.T)-.74 G
+1.062(he working gr)312.43 235.2 R 1.062(oup invented and standar)-.18 F(d-)
+-.18 E .279(ized functionality in these ar)72 247.2 R .279
+(eas, which Bash implements.)-.18 F(The)5.278 E F1(command)2.778 E F0 .278
+(builtin was invented so)2.778 F 1.376
+(that shell functions could be written to r)72 259.2 R 1.376
+(eplace builtins; it makes the capabilities of the builtin)-.18 F .477
+(available to the function.)72 271.2 R .477(The r)5.477 F .477(eserved wor)-.18
+F 2.977(d`)-.18 G(`!')278.12 271.2 Q 2.977('w)-.37 G .477
+(as added to negate the r)300.187 271.2 R .477(eturn value of a com-)-.18 F
+1.09(mand or pipeline; it was nearly impossible to expr)72 283.2 R 1.09(ess `)
+-.18 F 1.09(`if not x')-.37 F 3.59('c)-.37 G 1.09
+(leanly using the sh language.)370.99 283.2 R(Ther)72 295.2 Q 3.684(ee)-.18 G
+1.183(xist multiple incompatible implementations of the)105.774 295.2 R F1
+(test)3.683 E F0 1.183(builtin, which tests \214les for type)3.683 F .38
+(and other attributes and performs arithmetic and string comparisons.)72 307.2
+R .38(POSIX consider)5.38 F .38(ed none of)-.18 F .469(these corr)72 319.2 R
+.468(ect, so the standar)-.18 F 2.968(db)-.18 G .468
+(ehavior was speci\214ed in terms of the number of ar)210.762 319.2 R .468
+(guments to the)-.18 F 2.52(command. POSIX.2)72 331.2 R .021
+(dictates exactly what will happen when four or fewer ar)2.52 F .021
+(guments ar)-.18 F 2.521(eg)-.18 G .021(iven to)473.589 331.2 R F1(test)72
+343.2 Q F0 4.905(,a)C 2.405(nd leaves the behavior unde\214ned when mor)100.505
+343.2 R 4.905(ea)-.18 G -.18(rg)325.27 343.2 S 2.404(uments ar).18 F 4.904(es)
+-.18 G 4.904(upplied. Bash)395.178 343.2 R 2.404(uses the)4.904 F
+(POSIX.2 algorithm, which was conceived by David Korn.)72 355.2 Q F1 2.5
+(3.1. Features)72 379.2 R(not in the Bourne Shell)2.5 E F0(Ther)97 394.8 Q
+3.958(ea)-.18 G 1.818 -.18(re a n)131.258 394.8 T 1.458(umber of minor dif).18
+F(fer)-.18 E 1.458(ences between Bash and the version of sh pr)-.18 F 1.458
+(esent on)-.18 F .503(most other versions of)72 406.8 R F2(UNIX)3.003 E F0
+5.503(.T)C .503(he majority of these ar)212.582 406.8 R 3.002(ed)-.18 G .502
+(ue to the POSIX standar)326.876 406.8 R .502(d, but some ar)-.18 F(e)-.18 E
+1.173(the r)72 418.8 R 1.173(esult of Bash adopting featur)-.18 F 1.173(es fr)
+-.18 F 1.173(om other shells.)-.18 F 1.174
+(For instance, Bash includes the new `)6.173 F(`!')-.37 E(')-.37 E -.18(re)72
+430.8 S .414(served wor).18 F .414(d, the)-.18 F F1(command)2.913 E F0 .413
+(builtin, the ability of the)2.913 F F1(read)2.913 E F0 .413(builtin to corr)
+2.913 F .413(ectly r)-.18 F .413(eturn a line end-)-.18 F 1.635
+(ing with a backslash, symbolic ar)72 442.8 R 1.635(guments to the)-.18 F F1
+(umask)4.135 E F0 1.636(builtin, variable substring r)4.136 F 1.636(emoval, a)
+-.18 F .791(way to get the length of a variable, and the new algorithm for the)
+72 454.8 R F1(test)3.29 E F0 .79(builtin fr)3.29 F .79(om the POSIX.2)-.18 F
+(standar)72 466.8 Q(d, none of which appear in sh.)-.18 E 1.408
+(Bash also implements the `)97 482.4 R(`$\(...\)')-.37 E 3.908('c)-.37 G 1.408
+(ommand substitution syntax, which supersedes the sh)255.56 482.4 R .54
+(`...` constr)72 494.4 R 3.04(uct. The)-.08 F -.37(``)3.04 G($\(...\)').37 E
+3.04('c)-.37 G(onstr)193.76 494.4 Q .54
+(uct expands to the output of the command contained within the)-.08 F(par)72
+506.4 Q .708(entheses, with trailing newlines r)-.18 F 3.208(emoved. The)-.18 F
+.709(sh syntax is accepted for backwar)3.208 F .709(ds compati-)-.18 F(bility)
+72 518.4 Q 2.901(,b)-1.11 G .401(ut the `)104.901 518.4 R(`$\(...\)')-.37 E
+2.901('f)-.37 G .401(orm is pr)169.634 518.4 R(eferr)-.18 E .401
+(ed because its quoting r)-.18 F .4(ules ar)-.08 F 2.9(em)-.18 G .4
+(uch simpler and it is easier)383.64 518.4 R(to nest.)72 530.4 Q .697
+(The Bourne shell does not pr)97 546 R .697(ovide such featur)-.18 F .698
+(es as brace expansion, the ability to de\214ne a)-.18 F 2.079(variable and a \
+function with the same name, local variables in shell functions, the ability t\
+o)72 558 R 1.933
+(enable and disable individual builtins or write a function to r)72 570 R 1.933
+(eplace a builtin, or a means to)-.18 F(export a shell function to a child pr)
+72 582 Q(ocess.)-.18 E 1.019
+(Bash has closed a long-standing shell security hole by not using the)97 597.6
+R F1($IFS)3.518 E F0 1.018(variable to split)3.518 F .861(each wor)72 609.6 R
+3.361(dr)-.18 G .861(ead by the shell, but splitting only the r)126.222 609.6 R
+.861(esults of expansion \(ksh and the 4.4 BSD sh)-.18 F .337
+(have \214xed this as well\).)72 621.6 R .337
+(Useful behavior such as a means to abort execution of a script r)5.337 F .336
+(ead with)-.18 F .282(the `)72 633.6 R(`.')-.37 E 2.782('c)-.37 G .283
+(ommand using the)108.754 633.6 R F1(return)2.783 E F0 .283
+(builtin or automatically exporting variables in the shell's envi-)2.783 F -.18
+(ro)72 645.6 S .166(nment to childr).18 F .166(en is also not pr)-.18 F .166
+(esent in the Bourne shell.)-.18 F .165(Bash pr)5.165 F .165(ovides a much mor)
+-.18 F 2.665(ep)-.18 G(owerful)469.19 645.6 Q(envir)72 657.6 Q
+(onment for both interactive use and pr)-.18 E(ogramming.)-.18 E .32 LW 76 688
+72 688 DL 80 688 76 688 DL 84 688 80 688 DL 88 688 84 688 DL 92 688 88 688 DL
+96 688 92 688 DL 100 688 96 688 DL 104 688 100 688 DL 108 688 104 688 DL 112
+688 108 688 DL 116 688 112 688 DL 120 688 116 688 DL 124 688 120 688 DL 128 688
+124 688 DL 132 688 128 688 DL 136 688 132 688 DL 140 688 136 688 DL 144 688 140
+688 DL/F4 8/Palatino-Roman@0 SF 1.489(\207Bill Joy)72 698 R 3.489(,A)-.888 G
+3.489(nI)113.666 698 S(ntr)124.507 698 Q 1.489(oduction to the C Shell,)-.144 F
+/F5 8/Palatino-Italic@0 SF 1.489(UNIX User)3.489 F 2.369 -.44('s S).296 H 1.489
+(upplementary Documents).44 F F4 3.489(,U)C 1.489(niversity of California at)
+377.116 698 R(Berkeley)72 708 Q 2(,1)-.888 G(986.)109.88 708 Q EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-4-)279.67 48 S/F1 10/Palatino-Bold@0 SF 2.5
+(4. Bash-speci\214c)72 84 R(Features)2.5 E F0 .897
+(This section details a few of the featur)97 99.6 R .897
+(es which make Bash unique.)-.18 F .898(Most of them pr)5.898 F(ovide)-.18 E
+(impr)72 111.6 Q 2.913(oved interactive use, but a few pr)-.18 F 2.912
+(ogramming impr)-.18 F 2.912(ovements ar)-.18 F 5.412(ep)-.18 G -.18(re)410.494
+111.6 S 2.912(sent as well.).18 F(Full)7.912 E(descriptions of these featur)72
+123.6 Q(es can be found in the Bash documentation.)-.18 E F1 2.5(4.1. Startup)
+72 147.6 R(Files)2.5 E F0 .207(Bash executes startup \214les dif)97 163.2 R
+(fer)-.18 E .207(ently than other shells.)-.18 F .207
+(The Bash behavior is a compr)5.207 F(omise)-.18 E 1.451(between the csh princ\
+iple of startup \214les with \214xed names executed for each shell and the sh)
+72 175.2 R -.37(``)72 187.2 S(minimalist').37 E 2.677('b)-.37 G(ehavior)138.207
+187.2 Q 5.177(.A)-.74 G 2.678(ni)186.504 187.2 S .178
+(nteractive instance of Bash started as a login shell r)197.912 187.2 R .178
+(eads and executes)-.18 F/F2 10/Palatino-Italic@0 SF(~/.bash_pr)72 199.2 Q
+(o\214le)-.18 E F0 .521(\(the \214le .bash_pr)4.687 F .52(o\214le in the user)
+-.18 F .52('s home dir).74 F .52(ectory\), if it exists.)-.18 F .52
+(An interactive non-)5.52 F 1.692(login shell r)72 211.2 R 1.692
+(eads and executes)-.18 F F2(~/.bashr)4.192 E(c)-.18 E F0 6.692(.A)1.666 G
+1.693(non-interactive shell \(one begun to execute a shell)271.99 211.2 R .56
+(script, for example\) r)72 223.2 R .559
+(eads no \214xed startup \214le, but uses the value of the variable)-.18 F F1
+($ENV)3.059 E F0 3.059(,i)C 3.059(fs)470.522 223.2 S .559(et, as)481.151 223.2
+R .06(the name of a startup \214le.)72 235.2 R .061(The ksh practice of r)5.06
+F(eading)-.18 E F1($ENV)2.561 E F0 .061(for every shell, with the accompany-)
+2.561 F 1.309(ing dif)72 247.2 R 1.309(\214culty of de\214ning the pr)-.18 F
+1.308(oper variables and functions for interactive and non-interactive)-.18 F
+.385(shells or having the \214le r)72 259.2 R .385
+(ead only for interactive shells, was consider)-.18 F .385(ed too complex.)-.18
+F .385(Ease of use)5.385 F .252(won out her)72 271.2 R 2.752(e. Inter)-.18 F
+(estingly)-.18 E 2.752(,t)-1.11 G .251(he next r)202.258 271.2 R .251
+(elease of ksh will change to r)-.18 F(eading)-.18 E F1($ENV)2.751 E F0 .251
+(only for interac-)2.751 F(tive shells.)72 283.2 Q F1 2.5(4.2. New)72 307.2 R
+(Builtin Commands)2.5 E F0(Ther)97 322.8 Q 3.077(ea)-.18 G .937 -.18(re a f)
+130.377 322.8 T .577(ew builtins which ar).18 F 3.077(en)-.18 G .578
+(ew or have been extended in Bash.)259.179 322.8 R(The)5.578 E F1(enable)3.078
+E F0(builtin)3.078 E .073(allows builtin commands to be turned on and of)72
+334.8 R 2.573(fa)-.18 G(rbitrarily)296.267 334.8 Q 5.073(.T)-1.11 G 2.573(ou)
+347.87 334.8 S .073(se the version of)361.933 334.8 R F2(echo)2.573 E F0 .073
+(found in a)4.239 F -1.76(user 's)72 346.8 R(sear)2.755 E .255
+(ch path rather than the Bash builtin,)-.18 F/F3 10/Courier@0 SF .255
+(enable -n echo)2.755 F F0(suf)2.756 E 2.756(\214ces. The)-.18 F F1(help)2.756
+E F0 .256(builtin pr)2.756 F(o-)-.18 E .618
+(vides quick synopses of the shell facilities without r)72 358.8 R .618
+(equiring access to a manual page.)-.18 F F1(Builtin)5.618 E F0(is)3.118 E .955
+(similar to)72 370.8 R F1(command)3.455 E F0 .955
+(in that it bypasses shell functions and dir)3.455 F .956
+(ectly executes builtin commands.)-.18 F 2.025
+(Access to a csh-style stack of dir)72 382.8 R 2.025(ectories is pr)-.18 F
+2.025(ovided via the)-.18 F F1(pushd)4.524 E F0(,)A F1(popd)4.524 E F0 4.524
+(,a)C(nd)429.142 382.8 Q F1(dirs)4.524 E F0(builtins.)4.524 E F1(Pushd)72 394.8
+Q F0(and)4.255 E F1(popd)4.255 E F0 1.755(insert and r)4.255 F 1.756(emove dir)
+-.18 F 1.756(ectories fr)-.18 F 1.756(om the stack, r)-.18 F(espectively)-.18 E
+4.256(,a)-1.11 G(nd)430.102 394.8 Q F1(dirs)4.256 E F0 1.756(lists the)4.256 F
+.458(stack contents.)72 406.8 R .457
+(On systems that allow \214ne-grained contr)5.458 F .457(ol of r)-.18 F(esour)
+-.18 E .457(ces, the)-.18 F F1(ulimit)2.957 E F0 .457(builtin can be)2.957 F
+1.216(used to tune these settings.)72 418.8 R F1(Ulimit)6.216 E F0 1.216
+(allows a user to contr)3.716 F 1.216(ol, among other things, whether cor)-.18
+F(e)-.18 E .306(dumps ar)72 430.8 R 2.806(et)-.18 G 2.806(ob)125.652 430.8 S
+2.806(eg)139.448 430.8 S .306
+(enerated, how much memory the shell or a child pr)152.604 430.8 R .306
+(ocess is allowed to allocate,)-.18 F .991(and how lar)72 442.8 R .991
+(ge a \214le cr)-.18 F .991(eated by a child pr)-.18 F .991(ocess can gr)-.18 F
+(ow)-.18 E 5.991(.T)-.92 G(he)343.212 442.8 Q F1(suspend)3.491 E F0 .992
+(command will stop the)3.491 F .532(shell pr)72 454.8 R .532
+(ocess when job contr)-.18 F .532
+(ol is active; most other shells do not allow themselves to be stopped)-.18 F
+.339(like that.)72 466.8 R F1 -.9(Ty)5.339 G(pe,).9 E F0 .339
+(the Bash answer to)2.839 F F1(which)2.839 E F0(and)2.839 E F1(whence,)2.839 E
+F0 .34(shows what will happen when a wor)2.839 F 2.84(di)-.18 G(s)499.76 466.8
+Q(typed as a command:)72 478.8 Q F3 6($t)97 496.8 S(ype export)115 496.8 Q
+(export is a shell builtin)97 508.8 Q 6($t)97 520.8 S(ype -t export)115 520.8 Q
+(builtin)97 532.8 Q 6($t)97 544.8 S(ype bash)115 544.8 Q(bash is /bin/bash)97
+556.8 Q 6($t)97 568.8 S(ype cd)115 568.8 Q(cd is a function)97 580.8 Q(cd \(\))
+97 592.8 Q({)97 604.8 Q(builtin cd ${1+"$@"} && xtitle $HOST: $PWD)121 616.8 Q
+(})97 628.8 Q F0 -.92(Va)72 650.4 S 1.138(rious modes tell what a command wor)
+.92 F 3.638(di)-.18 G 3.638(s\()273.156 650.4 S -.18(re)284.364 650.4 S 1.138
+(served wor).18 F 1.138(d, alias, function, builtin, or \214le\) or)-.18 F .596
+(which version of a command will be executed based on a user)72 662.4 R .597
+('s sear).74 F .597(ch path.)-.18 F .597(Some of this func-)5.597 F
+(tionality has been adopted by POSIX.2 and folded into the)72 674.4 Q F1
+(command)2.5 E F0(utility)2.5 E(.)-1.11 E EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-5-)279.67 48 S/F1 10/Palatino-Bold@0 SF 2.5
+(4.3. Editing)72 84 R(and Completion)2.5 E F0 1.094(One ar)97 99.6 R 1.094
+(ea in which Bash shines is command line editing.)-.18 F 1.093(Bash uses the)
+6.093 F/F2 10/Palatino-Italic@0 SF -.18(re)3.593 G(adline).18 E F0 1.093
+(library to)5.259 F -.18(re)72 111.6 S .27(ad and edit lines when interactive.)
+.18 F .271(Readline is a powerful and \215exible input facility that a user)
+5.27 F .013(can con\214gur)72 123.6 R 2.513(et)-.18 G 2.513(oi)137.466 123.6 S
+.013(ndividual tastes.)148.349 123.6 R .012
+(It allows lines to be edited using either emacs or vi commands,)5.013 F(wher)
+72 135.6 Q 3.039(et)-.18 G .539(hose commands ar)105.809 135.6 R 3.039(ea)-.18
+G(ppr)202.526 135.6 Q 3.039(opriate. The)-.18 F .539
+(full capability of emacs is not pr)3.039 F .54(esent \255 ther)-.18 F 3.04(ei)
+-.18 G 3.04(sn)485.44 135.6 S(o)498.54 135.6 Q .421(way to execute a named com\
+mand with M-x, for instance \255 but the existing commands ar)72 147.6 R 2.921
+(em)-.18 G(or)489.98 147.6 Q(e)-.18 E 2.773(than adequate.)72 159.6 R 2.773
+(The vi mode is compliant with the command line editing standar)7.773 F 2.774
+(dized by)-.18 F(POSIX.2.)72 171.6 Q 1.222(Readline is fully customizable.)97
+187.2 R 1.221(In addition to the basic commands and key bindings, the)6.222 F
+.263(library allows users to de\214ne additional key bindings using a startup \
+\214le.)72 199.2 R(The)5.263 E F2(inputr)2.763 E(c)-.18 E F0 .263
+(\214le, which)4.429 F .519(defaults to the \214le)72 211.2 R F2(~/.inputr)
+3.019 E(c)-.18 E F0 3.019(,i)1.666 G 3.019(sr)204.981 211.2 S .519
+(ead each time r)216.01 211.2 R .519
+(eadline initializes, permitting users to maintain a)-.18 F 1.084
+(consistent interface acr)72 223.2 R 1.084(oss a set of pr)-.18 F 3.585
+(ograms. Readline)-.18 F 1.085(includes an extensible interface, so each)3.585
+F(pr)72 235.2 Q .885
+(ogram using the library can add its own bindable commands and pr)-.18 F .885
+(ogram-speci\214c key bind-)-.18 F 2.844(ings. Bash)72 247.2 R .345(uses this \
+facility to add bindings that perform history expansion or shell wor)2.844 F
+2.845(de)-.18 G(xpan-)478.68 247.2 Q(sions on the curr)72 259.2 Q
+(ent input line.)-.18 E .164(Readline interpr)97 274.8 R .163
+(ets a number of variables which further tune its behavior)-.18 F 5.163(.V)-.74
+G .163(ariables exist to)435.264 274.8 R(contr)72 286.8 Q 2.503
+(ol whether or not eight-bit characters ar)-.18 F 5.003(ed)-.18 G(ir)300.789
+286.8 Q 2.503(ectly r)-.18 F 2.503(ead as input or converted to meta-)-.18 F
+(pr)72 298.8 Q .076(e\214xed key sequences \(a meta-pr)-.18 F .076
+(e\214xed key sequence consists of the character with the eighth bit)-.18 F
+(zer)72 310.8 Q .204(oed, pr)-.18 F .204(eceded by the)-.18 F F2(meta-pr)2.704
+E(e\214x)-.18 E F0(character)4.37 E 2.704(,u)-.74 G .205
+(sually escape, which selects an alternate keymap\),)282.17 310.8 R .76
+(to decide whether to output characters with the eighth bit set dir)72 322.8 R
+.759(ectly or as a meta-pr)-.18 F .759(e\214xed key)-.18 F .19
+(sequence, whether or not to wrap to a new scr)72 334.8 R .191
+(een line when a line being edited is longer than the)-.18 F(scr)72 346.8 Q
+.099(een width, the keymap to which subsequent key bindings should apply)-.18 F
+2.598(,o)-1.11 G 2.598(re)411.096 346.8 S .098(ven what happens)422.434 346.8 R
+1.031(when r)72 358.8 R 1.031(eadline wants to ring the terminal's bell.)-.18 F
+1.031(All of these variables can be set in the inputr)6.031 F(c)-.18 E(\214le.)
+72 370.8 Q .239(The startup \214le understands a set of C pr)97 386.4 R(epr)
+-.18 E(ocessor)-.18 E .238(-like conditional constr)-.18 F .238
+(ucts which allow)-.08 F 1.431
+(variables or key bindings to be assigned based on the application using r)72
+398.4 R 1.432(eadline, the terminal)-.18 F(curr)72 410.4 Q 1.676
+(ently being used, or the editing mode.)-.18 F 1.676(Users can add pr)6.676 F
+1.676(ogram-speci\214c bindings to make)-.18 F .478(their lives easier:)72
+422.4 R 2.978(Ih)5.478 G .478(ave bindings that let me edit the value of)
+165.012 422.4 R F1($P)2.978 E -.92(AT)-.74 G(H).92 E F0 .479
+(and double-quote the cur)2.979 F(-)-.18 E -.18(re)72 434.4 S(nt or pr).18 E
+(evious wor)-.18 E(d:)-.18 E/F3 10/Courier@0 SF 6(#M)97 452.4 S
+(acros that are convenient for shell interaction)115 452.4 Q($if Bash)97 464.4
+Q 6(#e)97 476.4 S(dit the path)115 476.4 Q
+("\\C-xp": "PATH=${PATH}\\e\\C-e\\C-a\\ef\\C-f")97 488.4 Q 6(#p)97 500.4 S
+(repare to type a quoted word -- insert open and close double)115 500.4 Q 6(#q)
+97 512.4 S(uotes and move to just after the open quote)115 512.4 Q
+("\\C-x\\"": "\\"\\"\\C-b")97 524.4 Q 6(#Q)97 536.4 S
+(uote the current or previous word)115 536.4 Q("\\C-xq": "\\eb\\"\\ef\\"")97
+548.4 Q($endif)97 560.4 Q F0(Ther)72 582 Q 3.06(ei)-.18 G 3.06(sar)103.27 582 S
+.56(eadline command to r)122.4 582 R(e-r)-.18 E .559
+(ead the \214le, so users can edit the \214le, change some bindings,)-.18 F
+(and begin to use them almost immediately)72 594 Q(.)-1.11 E .701
+(Bash implements the)97 609.6 R F1(bind)3.201 E F0 .701(builtin for mor)3.201 F
+3.201(ed)-.18 G .701(yamic contr)299.567 609.6 R .702(ol of r)-.18 F .702
+(eadline than the startup \214le)-.18 F(permits.)72 621.6 Q F1(Bind)5.572 E F0
+.572(is used in several ways.)3.072 F(In)5.572 E F2(list)3.071 E F0 .571
+(mode, it can display the curr)4.737 F .571(ent key bindings, list)-.18 F .752
+(all the r)72 633.6 R .752(eadline editing dir)-.18 F .752
+(ectives available for binding, list which keys invoke a given dir)-.18 F
+(ective,)-.18 E 1.327(or output the curr)72 645.6 R 1.327
+(ent set of key bindings in a format that can be incorporated dir)-.18 F 1.327
+(ectly into an)-.18 F(inputr)72 657.6 Q 3.075<638c>-.18 G 3.075(le. In)113.365
+657.6 R F2(batch)3.075 E F0 .575(mode, it r)4.741 F .575
+(eads a series of key bindings dir)-.18 F .575(ectly fr)-.18 F .576
+(om a \214le and passes them)-.18 F .751(to r)72 669.6 R 3.251(eadline. In)-.18
+F .751(its most common usage,)3.251 F F1(bind)3.251 E F0 .75
+(takes a single string and passes it dir)3.251 F .75(ectly to r)-.18 F(ead-)
+-.18 E .604(line, which interpr)72 681.6 R .604
+(ets the line as if it had just been r)-.18 F .605(ead fr)-.18 F .605
+(om the inputr)-.18 F 3.105<638c>-.18 G 3.105(le. Both)406.525 681.6 R .605
+(key bindings)3.105 F
+(and variable assignments may appear in the string given to)72 693.6 Q F1(bind)
+2.5 E F0(.)A 1.692(The r)97 709.2 R 1.691(eadline library also pr)-.18 F 1.691
+(ovides an interface for)-.18 F F2 1.691(word completion)4.191 F F0 6.691(.W)C
+1.691(hen the)419.582 709.2 R F2(completion)4.191 E F0 3.377
+(character \(usually T)72 721.2 R 3.377(AB\) is typed, r)-.74 F 3.378
+(eadline looks at the wor)-.18 F 5.878(dc)-.18 G(urr)375.406 721.2 Q 3.378
+(ently being enter)-.18 F 3.378(ed and)-.18 F EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-6-)279.67 48 S .089
+(computes the set of \214lenames of which the curr)72 84 R .088(ent wor)-.18 F
+2.588(di)-.18 G 2.588(sav)326.968 84 S .088(alid pr)347.034 84 R 2.588
+(e\214x. If)-.18 F(ther)2.588 E 2.588(ei)-.18 G 2.588(so)437.136 84 S .088
+(nly one pos-)449.424 84 R .81(sible completion, the r)72 96 R .81
+(est of the characters ar)-.18 F 3.31(ei)-.18 G .81(nserted dir)285.2 96 R
+(ectly)-.18 E 3.31(,o)-1.11 G .81(therwise the common pr)365.38 96 R .81
+(e\214x of)-.18 F .715(the set of \214lenames is added to the curr)72 108 R
+.715(ent wor)-.18 F 3.215(d. A)-.18 F .714(second T)3.214 F .714
+(AB character enter)-.74 F .714(ed immediately)-.18 F .527
+(after a non-unique completion causes r)72 120 R .527
+(eadline to list the possible completions; ther)-.18 F 3.027(ei)-.18 G 3.028
+(sa)453.964 120 S 3.028(no)466.232 120 S(ption)480.54 120 Q .265
+(to have the list displayed immediately)72 132 R 5.265(.R)-1.11 G .265
+(eadline pr)255.87 132 R .264(ovides hooks so that applications can pr)-.18 F
+(ovide)-.18 E 1.287(speci\214c types of completion befor)72 144 R 3.787(et)-.18
+G 1.287(he default \214lename completion is attempted.)237.284 144 R 1.287
+(This is quite)6.287 F 1.378(\215exible, though it is not completely user)72
+156 R(-pr)-.18 E 3.877(ogrammable. Bash,)-.18 F 1.377
+(for example, can complete \214le-)3.877 F 1.456
+(names, command names \(including aliases, builtins, shell r)72 168 R 1.457
+(eserved wor)-.18 F 1.457(ds, shell functions, and)-.18 F .598(executables fou\
+nd in the \214le system\), shell variables, usernames, and hostnames.)72 180 R
+.598(It uses a set of)5.598 F .346(heuristics that, while not perfect, is gene\
+rally quite good at determining what type of completion)72 192 R(to attempt.)72
+204 Q/F1 10/Palatino-Bold@0 SF 2.5(4.4. History)72 228 R F0 .487
+(Access to the list of commands pr)97 243.6 R .487(eviously enter)-.18 F .487
+(ed \(the)-.18 F/F2 10/Palatino-Italic@0 SF .487(command history)2.987 F F0
+2.987(\)i)C 2.987(sp)424.717 243.6 S -.18(ro)437.954 243.6 S .486
+(vided jointly).18 F .577(by Bash and the r)72 255.6 R .577(eadline library)
+-.18 F 5.577(.B)-1.11 G .578(ash pr)229.432 255.6 R .578(ovides variables \()
+-.18 F F1($HISTFILE)A F0(,)A F1($HISTSIZE)3.078 E F0 3.078(,a)C(nd)456.582
+255.6 Q F1($HIST)3.078 E(-)-.92 E(CONTROL)72 267.6 Q F0 3.306(\)a)C .806
+(nd the)135.846 267.6 R F1(history)3.306 E F0(and)3.306 E F1(fc)3.306 E F0 .805
+(builtins to manipulate the history list.)3.305 F .805(The value of)5.805 F F1
+($HIST)3.305 E(-)-.92 E(FILE)72 279.6 Q F0 1.393(specifes the \214le wher)3.893
+F 3.893(eB)-.18 G 1.393(ash writes the command history on exit and r)209.125
+279.6 R 1.394(eads it on startup.)-.18 F F1($HISTSIZE)72 291.6 Q F0 1.295
+(is used to limit the number of commands saved in the history)3.795 F(.)-1.11 E
+F1($HISTCONTROL)6.294 E F0(pr)72 303.6 Q .778(ovides a cr)-.18 F .779
+(ude form of contr)-.08 F .779(ol over which commands ar)-.18 F 3.279(es)-.18 G
+.779(aved on the history list: a value of)349.157 303.6 R F2(ignor)72 315.6 Q
+(espace)-.18 E F0 .548
+(means to not save commands which begin with a space; a value of)4.714 F F2
+(ignor)3.047 E(edups)-.18 E F0(means)4.713 E .296
+(to not save commands identical to the last command saved.)72 327.6 R F1
+($HISTCONTROL)5.296 E F0 .297(was named)2.796 F F1($his-)2.797 E(tory_control)
+72 339.6 Q F0 .611
+(in earlier versions of Bash; the old name is still accepted for backwar)3.112
+F .611(ds compatibil-)-.18 F(ity)72 351.6 Q 5.678(.T)-1.11 G(he)96.928 351.6 Q
+F1(history)3.178 E F0 .678(command can r)3.178 F .678
+(ead or write \214les containing the history list and display the cur)-.18 F(-)
+-.18 E -.18(re)72 363.6 S .913(nt list contents.).18 F(The)5.913 E F1(fc)3.413
+E F0 .913(builtin, adopted fr)3.413 F .912
+(om POSIX.2 and the Korn Shell, allows display and)-.18 F -.18(re)72 375.6 S
+.12(-execution, with optional editing, of commands fr).18 F .12
+(om the history list.)-.18 F .12(The r)5.12 F .12(eadline library of)-.18 F
+(fers)-.18 E 2.518(as)72 387.6 S .018(et of commands to sear)83.758 387.6 R
+.018(ch the history list for a portion of the curr)-.18 F .017
+(ent input line or a string typed)-.18 F 1.024(by the user)72 399.6 R 6.025(.F)
+-.74 G(inally)136.364 399.6 Q 3.525(,t)-1.11 G(he)169.649 399.6 Q F2(history)
+3.525 E F0(library)5.191 E 3.525(,g)-1.11 G 1.025(enerally incorporated dir)
+257.59 399.6 R 1.025(ectly into the r)-.18 F 1.025(eadline library)-.18 F(,)
+-1.11 E .709(implements a facility for history r)72 411.6 R .709
+(ecall, expansion, and r)-.18 F .709(e-execution of pr)-.18 F .709
+(evious commands very)-.18 F .711(similar to csh \(`)72 423.6 R .711
+(`bang history')-.37 F .711(', so called because the exclamation point intr)
+-.37 F .712(oduces a history sub-)-.18 F(stitution\):)72 435.6 Q/F3 10
+/Courier@0 SF 6($e)97 453.6 S(cho a b c d e)115 453.6 Q 6(abcde)97 465.6 S 6
+($!)97 477.6 S 6(!fghi)115 477.6 S(echo a b c d e f g h i)97 489.6 Q 6
+(abcdefghi)97 501.6 S 6($!)97 513.6 S(-2)115 513.6 Q(echo a b c d e)97 525.6 Q
+6(abcde)97 537.6 S 6($e)97 549.6 S(cho !-2:1-4)115 549.6 Q(echo a b c d)97
+561.6 Q 6(abcd)97 573.6 S F0 .555(The command history is only saved when the s\
+hell is interactive, so it is not available for use by)72 595.2 R
+(shell scripts.)72 607.2 Q F1 2.5(4.5. New)72 631.2 R(Shell V)2.5 E(ariables)
+-1.11 E F0(Ther)97 646.8 Q 2.916(ea)-.18 G .776 -.18(re a n)130.216 646.8 T
+.416(umber of convenience variables that Bash interpr).18 F .417
+(ets to make life easier)-.18 F 5.417(.T)-.74 G(hese)484.36 646.8 Q(include)72
+658.8 Q F1(FIGNORE)3.043 E F0 3.043(,w)C .542(hich is a set of \214lename suf)
+169.706 658.8 R .542(\214xes identifying \214les to exclude when complet-)-.18
+F .167(ing \214lenames;)72 670.8 R F1(HOSTTYPE)2.667 E F0 2.667(,w)C .167
+(hich is automatically set to a string describing the type of har)205.061 670.8
+R(dwar)-.18 E(e)-.18 E .333(on which Bash is curr)72 682.8 R .333
+(ently executing;)-.18 F F1(command_oriented_history)2.833 E F0 2.832(,w)C .332
+(hich dir)380.94 682.8 R .332(ects Bash to save all)-.18 F 1.264
+(lines of a multiple-line command such as a)72 694.8 R F2(while)3.765 E F0(or)
+3.765 E F2(for)3.765 E F0 1.265(loop in a single history entry)3.765 F 3.765
+(,a)-1.11 G(llowing)470.09 694.8 Q .13(easy r)72 706.8 R .13(e-editing; and)
+-.18 F F1(IGNOREEOF)2.63 E F0 2.63(,w)C .13
+(hose value indicates the number of consecutive EOF charac-)237.84 706.8 R .901
+(ters that an interactive shell will r)72 718.8 R .901(ead befor)-.18 F 3.401
+(ee)-.18 G .901(xiting \255 an easy way to keep yourself fr)280.258 718.8 R
+.902(om being)-.18 F 3.629(logged out accidentally)72 730.8 R 8.629(.T)-1.11 G
+(he)198.697 730.8 Q F1(auto_resume)6.129 E F0 3.628
+(variable alters the way the shell tr)6.128 F 3.628(eats simple)-.18 F EP
+%%Page: 7 7
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-7-)279.67 48 S .888
+(command names: if job contr)72 84 R .889
+(ol is active, and this variable is set, single-wor)-.18 F 3.389(ds)-.18 G .889
+(imple commands)426.431 84 R .843(without r)72 96 R(edir)-.18 E .843
+(ections cause the shell to \214rst look for and r)-.18 F .842
+(estart a suspended job with that name)-.18 F(befor)72 108 Q 2.5(es)-.18 G
+(tarting a new pr)106.41 108 Q(ocess.)-.18 E/F1 10/Palatino-Bold@0 SF 2.5
+(4.6. Brace)72 132 R(Expansion)2.5 E F0 .608(Since sh of)97 147.6 R .609
+(fers no convenient way to generate arbitrary strings that shar)-.18 F 3.109
+(eac)-.18 G .609(ommon pr)440.711 147.6 R(e\214x)-.18 E .036(or suf)72 159.6 R
+.036(\214x \(\214lename expansion r)-.18 F(equir)-.18 E .035
+(es that the \214lenames exist\), Bash implements)-.18 F/F2 10
+/Palatino-Italic@0 SF .035(brace expansion)2.535 F F0 2.535(,a)C .716
+(capability picked up fr)72 171.6 R .716(om csh.)-.18 F .717
+(Brace expansion is similar to \214lename expansion, but the strings)5.716 F
+2.557(generated need not corr)72 183.6 R 2.557(espond to existing \214les.)-.18
+F 5.057(Ab)7.557 G 2.557(race expr)322.296 183.6 R 2.557
+(ession consists of an optional)-.18 F F2(pr)72 195.6 Q(eamble)-.18 E F0 4.412
+(,f)1.666 G 1.912(ollowed by a pair of braces enclosing a series of comma-sepa\
+rated strings, and an)120.028 195.6 R(optional)72 207.6 Q F2(postamble)2.842 E
+F0 5.342(.T)1.666 G .342(he pr)167.49 207.6 R .342(eamble is pr)-.18 F .342
+(epended to each string within the braces, and the postam-)-.18 F
+(ble is then appended to each r)72 219.6 Q(esulting string:)-.18 E/F3 10
+/Courier@0 SF 6($e)97 237.6 S(cho a{d,c,b}e)115 237.6 Q(ade ace abe)97 249.6 Q
+F0 .898(As this example demonstrates, the r)72 271.2 R .899
+(esults of brace expansion ar)-.18 F 3.399(en)-.18 G .899
+(ot sorted, as they ar)374.176 271.2 R 3.399(eb)-.18 G 3.399<798c>477.961 271.2
+S(le-)492.97 271.2 Q(name expansion.)72 283.2 Q F1 2.5(4.7. Process)72 307.2 R
+(Substitution)2.5 E F0 .692(On systems that can support it, Bash pr)97 322.8 R
+.692(ovides a facility known as)-.18 F F2(pr)3.192 E .692(ocess substitution)
+-.18 F F0 5.692(.P)C -.18(ro)491.44 322.8 S(-).18 E .479(cess substitution is \
+similar to command substitution in that its speci\214cation includes a command)
+72 334.8 R .969(to execute, but the shell does not collect the command's outpu\
+t and insert it into the command)72 346.8 R 2.925(line. Rather)72 358.8 R 2.925
+(,B)-.74 G .425(ash opens a pipe to the command, which is r)136.65 358.8 R .426
+(un in the backgr)-.08 F 2.926(ound. The)-.18 F .426(shell uses)2.926 F .659
+(named pipes \(FIFOs\) or the)72 370.8 R F2(/dev/fd)3.158 E F0 .658
+(method of naming open \214les to expand the pr)4.824 F .658(ocess substitu-)
+-.18 F .559(tion to a \214lename which connects to the pipe when opened.)72
+382.8 R .56(This \214lename becomes the r)5.56 F .56(esult of)-.18 F .302
+(the expansion.)72 394.8 R(Pr)5.302 E .302
+(ocess substitution can be used to compar)-.18 F 2.801(et)-.18 G .301
+(he outputs of two dif)344.255 394.8 R(fer)-.18 E .301(ent versions)-.18 F
+(of an application as part of a r)72 406.8 Q(egr)-.18 E(ession test:)-.18 E F3
+6($c)97 424.8 S(mp <\(old_prog\) <\(new_prog\))115 424.8 Q F1 2.5(4.8. Prompt)
+72 454.8 R(Customization)2.5 E F0 .745(One of the mor)97 470.4 R 3.245(ep)-.18
+G .745(opular interactive featur)179.97 470.4 R .745(es that Bash pr)-.18 F
+.745(ovides is the ability to customize)-.18 F 1.946(the pr)72 482.4 R 4.446
+(ompt. Both)-.18 F F1($PS1)4.446 E F0(and)4.446 E F1($PS2,)4.446 E F0 1.945
+(the primary and secondary pr)4.445 F 1.945(ompts, ar)-.18 F 4.445(ee)-.18 G
+1.945(xpanded befor)432.885 482.4 R(e)-.18 E 2.168(being displayed.)72 494.4 R
+2.168(Parameter and variable expansion is performed when the pr)7.168 F 2.169
+(ompt string is)-.18 F .77
+(expanded, so any shell variable can be put into the pr)72 506.4 R .77
+(ompt \(e.g.,)-.18 F F1($SHL)3.27 E(VL)-.92 E F0 3.27(,w)C .77
+(hich indicates how)419.37 506.4 R .609(deeply the curr)72 518.4 R .609
+(ent shell is nested\).)-.18 F .609(Bash specially interpr)5.609 F .609
+(ets characters in the pr)-.18 F .61(ompt string pr)-.18 F(e-)-.18 E 1.224
+(ceded by a backslash.)72 530.4 R 1.224(Some of these backslash escapes ar)
+6.224 F 3.724(er)-.18 G 1.224(eplaced with the curr)348.91 530.4 R 1.224
+(ent time, the)-.18 F .542(date, the curr)72 542.4 R .542(ent working dir)-.18
+F(ectory)-.18 E 3.042(,t)-1.11 G .542
+(he username, and the command number or history number)237.3 542.4 R .623
+(of the command being enter)72 554.4 R 3.123(ed. Ther)-.18 F 3.123(ei)-.18 G
+3.122(se)249.038 554.4 S .622
+(ven a backslash escape to cause the shell to change its)261.19 554.4 R(pr)72
+566.4 Q 1.098(ompt when r)-.18 F 1.098(unning as r)-.08 F 1.098(oot after an)
+-.18 F F2(su)3.599 E F0 6.099(.B)C(efor)273.626 566.4 Q 3.599(ep)-.18 G 1.099
+(rinting each primary pr)305.375 566.4 R 1.099(ompt, Bash expands)-.18 F 1.458
+(the variable)72 578.4 R F1($PROMPT_COMMAND)3.958 E F0 1.457
+(and, if it has a value, executes the expanded value as a)3.957 F 1.038
+(command, allowing additional pr)72 590.4 R 1.038(ompt customization.)-.18 F
+1.038(For example, this assignment causes the)6.038 F(curr)72 602.4 Q .754
+(ent user)-.18 F 3.254(,t)-.74 G .754(he curr)134.598 602.4 R .753
+(ent host, the time, the last component of the curr)-.18 F .753
+(ent working dir)-.18 F(ectory)-.18 E 3.253(,t)-1.11 G(he)493.39 602.4 Q .813
+(level of shell nesting, and the history number of the curr)72 614.4 R .813
+(ent command to be embedded into the)-.18 F(primary pr)72 626.4 Q(ompt:)-.18 E
+F3 6($P)97 644.4 S(S1='\\u@\\h [\\t] \\W\($SHLVL:\\!\)\\$ ')115 644.4 Q
+(chet@odin [21:03:44] documentation\(2:636\)$ cd ..)97 656.4 Q
+(chet@odin [21:03:54] src\(2:637\)$)97 668.4 Q F0 1.289
+(The string being assigned is surr)72 690 R 1.289
+(ounded by single quotes so that if it is exported, the value of)-.18 F F1
+($SHL)72 702 Q(VL)-.92 E F0(will be updated by a child shell:)2.5 E F3
+(chet@odin [21:17:35] src\(2:638\)$ export PS1)97 720 Q EP
+%%Page: 8 8
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-8-)279.67 48 S/F1 10/Courier@0 SF
+(chet@odin [21:17:40] src\(2:639\)$ bash)97 84 Q
+(chet@odin [21:17:46] src\(3:696\)$)97 96 Q F0 .981
+(The \\$ escape is displayed as `)72 117.6 R(`)-.37 E/F2 10/Palatino-Bold@0 SF
+($)A F0 1.721 -.37('' w)D .981(hen r).37 F .981(unning as a normal user)-.08 F
+3.481(,b)-.74 G .981(ut as `)382.843 117.6 R(`)-.37 E F2(#)A F0 1.721 -.37
+('' w)D .982(hen r).37 F .982(unning as)-.08 F -.18(ro)72 129.6 S(ot.).18 E F2
+2.5(4.9. File)72 153.6 R(System V)2.5 E(iews)-.55 E F0 .42(Since Berkeley intr)
+97 169.2 R .42(oduced symbolic links in 4.2 BSD, one of their most annoying pr)
+-.18 F(operties)-.18 E .705(has been the `)72 181.2 R(`warping')-.37 E 3.205
+('t)-.37 G 3.205(oac)185.91 181.2 S .705(ompletely dif)207.22 181.2 R(fer)-.18
+E .705(ent ar)-.18 F .705(ea of the \214le system when using)-.18 F F2(cd)3.206
+E F0 3.206(,a)C .706(nd the)474.994 181.2 R -.18(re)72 193.2 S 2.292
+(sultant non-intuitive behavior of `).18 F(`)-.37 E F2 2.292(cd ..)B F0 -.37
+('')C 7.291(.T).37 G(he)282.761 193.2 Q/F3 9/Palatino-Roman@0 SF(UNIX)4.791 E
+F0 2.291(kernel tr)4.791 F 2.291(eats symbolic links)-.18 F/F4 10
+/Palatino-Italic@0 SF(physically)4.791 E F0(.)1.666 E .225(When the kernel is \
+translating a pathname in which one component is a symbolic link, it r)72 205.2
+R(eplaces)-.18 E .81(all or part of the pathname while pr)72 217.2 R .81
+(ocessing the link.)-.18 F .81(If the contents of the symbolic link begin)5.81
+F .033(with a slash, the kernel r)72 229.2 R .033(eplaces the pathname entir)
+-.18 F .033(ely; if not, the link contents r)-.18 F .034(eplace the curr)-.18 F
+(ent)-.18 E 2.814(component. In)72 241.2 R .314
+(either case, the symbolic link is visible.)2.814 F .313
+(If the link value is an absolute pathname,)5.314 F
+(the user \214nds himself in a completely dif)72 253.2 Q(fer)-.18 E
+(ent part of the \214le system.)-.18 E 1.291(Bash pr)97 268.8 R 1.291(ovides a)
+-.18 F F4(logical)3.791 E F0 1.291(view of the \214le system.)5.457 F 1.292
+(In this default mode, command and \214le-)6.292 F .727
+(name completion and builtin commands such as)72 280.8 R F2(cd)3.227 E F0(and)
+3.227 E F2(pushd)3.227 E F0 .727(which change the curr)3.227 F .727(ent work-)
+-.18 F .245(ing dir)72 292.8 R .245(ectory transpar)-.18 F .245
+(ently follow symbolic links as if they wer)-.18 F 2.746(ed)-.18 G(ir)365.822
+292.8 Q 2.746(ectories. The)-.18 F F2($PWD)2.746 E F0(variable,)2.746 E .562
+(which holds the shell's idea of the curr)72 304.8 R .561(ent working dir)-.18
+F(ectory)-.18 E 3.061(,d)-1.11 G .561(epends on the path used to r)354.924
+304.8 R(each)-.18 E(the dir)72 316.8 Q
+(ectory rather than its physical location in the local \214le system hierar)
+-.18 E(chy)-.18 E 5(.F)-1.11 G(or example:)427.35 316.8 Q F1 6($c)97 334.8 S 6
+(d/)115 334.8 S(usr/local/bin)133 334.8 Q 6($e)97 346.8 S(cho $PWD)115 346.8 Q
+(/usr/local/bin)97 358.8 Q 6($p)97 370.8 S(wd)115 370.8 Q(/usr/local/bin)97
+382.8 Q 6($/)97 394.8 S(bin/pwd)115 394.8 Q(/net/share/sun4/local/bin)97 406.8
+Q 6($c)97 418.8 S 6(d.)115 418.8 S(.)133 418.8 Q 6($p)97 430.8 S(wd)115 430.8 Q
+(/usr/local)97 442.8 Q 6($/)97 454.8 S(bin/pwd)115 454.8 Q
+(/net/share/sun4/local)97 466.8 Q 6($c)97 478.8 S 6(d.)115 478.8 S(.)133 478.8
+Q 6($p)97 490.8 S(wd)115 490.8 Q(/usr)97 502.8 Q 6($/)97 514.8 S(bin/pwd)115
+514.8 Q(/usr)97 526.8 Q F0 .094(One pr)72 548.4 R .094
+(oblem with this, of course, arises when pr)-.18 F .095
+(ograms that do not understand the shell's logical)-.18 F .805
+(notion of the \214le system interpr)72 560.4 R .805(et `)-.18 F(`..')-.37 E
+3.305('d)-.37 G(if)251.245 560.4 Q(fer)-.18 E(ently)-.18 E 5.805(.T)-1.11 G
+.804(his generally happens when Bash completes)304.86 560.4 R 1.864
+(\214lenames containing `)72 572.4 R(`..')-.37 E 4.364('a)-.37 G(ccor)194.902
+572.4 Q 1.864(ding to a logical hierar)-.18 F 1.865(chy which does not corr)
+-.18 F 1.865(espond to their)-.18 F .584(physical location.)72 584.4 R .583
+(For users who \214nd this tr)5.584 F .583(oublesome, a corr)-.18 F(esponding)
+-.18 E F4(physical)3.083 E F0 .583(view of the \214le)4.749 F
+(system is available:)72 596.4 Q F1 6($c)97 614.4 S 6(d/)115 614.4 S
+(usr/local/bin)133 614.4 Q 6($p)97 626.4 S(wd)115 626.4 Q(/usr/local/bin)97
+638.4 Q 6($s)97 650.4 S(et -o physical)115 650.4 Q 6($p)97 662.4 S(wd)115 662.4
+Q(/net/share/sun4/local/bin)97 674.4 Q EP
+%%Page: 9 9
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-9-)279.67 48 S/F1 10/Palatino-Bold@0 SF 2.5
+(4.10. Internationalization)72 84 R F0 .316(One of the most signi\214cant impr)
+97 99.6 R .316(ovements in version 1.13 of Bash was the change to `)-.18 F
+(`eight-)-.37 E .534(bit cleanliness')72 111.6 R 3.034('. Pr)-.37 F .533
+(evious versions used the eighth bit of characters to mark whether or not they)
+-.18 F(wer)72 123.6 Q 3.109(eq)-.18 G .609(uoted when performing wor)102.399
+123.6 R 3.109(de)-.18 G 3.109(xpansions. While)244.335 123.6 R .609
+(this did not af)3.109 F .61(fect the majority of users,)-.18 F 1.249
+(most of whom used only seven-bit ASCII characters, some found it con\214ning.)
+72 135.6 R 1.248(Beginning with)6.248 F .251
+(version 1.13, Bash implemented a dif)72 147.6 R(fer)-.18 E .251
+(ent quoting mechanism that did not alter the eighth bit of)-.18 F 3.228
+(characters. This)72 159.6 R .727(allowed Bash to manipulate \214les with `)
+3.228 F(`odd')-.37 E 3.227('c)-.37 G .727(haracters in their names, but did)
+356.825 159.6 R 1.924
+(nothing to help users enter those names, so version 1.13 intr)72 171.6 R 1.925
+(oduced changes to r)-.18 F 1.925(eadline that)-.18 F .658
+(made it eight-bit clean as well.)72 183.6 R .658(Options exist that for)5.658
+F .658(ce r)-.18 F .658(eadline to attach no special signi\214cance)-.18 F .834
+(to characters with the eighth bit set \(the default behavior is to convert th\
+ese characters to meta-)72 195.6 R(pr)72 207.6 Q 2.375(e\214xed key sequences\
+\) and to output these characters without conversion to meta-pr)-.18 F
+(e\214xed)-.18 E 2.924(sequences. These)72 219.6 R .424
+(changes, along with the expansion of keymaps to a full eight bits, enable r)
+2.924 F(ead-)-.18 E 1.025(line to work with most of the ISO-8859 family of cha\
+racter sets, used by many Eur)72 231.6 R 1.025(opean coun-)-.18 F(tries.)72
+243.6 Q F1(4.1)72 267.6 Q 2.5(1. POSIX)-.37 F(Mode)2.5 E F0 .834
+(Although Bash is intended to be POSIX.2 conformant, ther)97 283.2 R 3.334(ea)
+-.18 G 1.194 -.18(re a)374.606 283.2 T -.18(re).18 G .835
+(as in which the default).18 F .622
+(behavior is not compatible with the standar)72 295.2 R 3.121(d. For)-.18 F
+.621(users who wish to operate in a strict POSIX.2)3.121 F(envir)72 307.2 Q
+2.453(onment, Bash implements a)-.18 F/F2 10/Palatino-Italic@0 SF 2.453
+(POSIX mode)4.953 F F0 7.453(.W)C 2.453
+(hen this mode is active, Bash modi\214es its)305.808 307.2 R .969
+(default operation wher)72 319.2 R 3.469(ei)-.18 G 3.469(td)186.917 319.2 S(if)
+199.756 319.2 Q .969(fers fr)-.18 F .969(om POSIX.2 to match the standar)-.18 F
+3.468(d. POSIX)-.18 F .968(mode is enter)3.468 F(ed)-.18 E .474
+(when Bash is started with the)72 331.2 R F1(-posix)2.974 E F0 2.974
+(option. This)2.974 F(featur)2.974 E 2.974(ei)-.18 G 2.975(sa)334.31 331.2 S
+.475(lso available as an option to the)346.525 331.2 R F1(set)2.975 E F0
+(builtin,)72 343.2 Q F1 1.631(set -o posix)4.131 F F0 6.631(.F)C 1.631
+(or compatibility with other GNU softwar)177.054 343.2 R 4.131(et)-.18 G 1.63
+(hat attempts to be POSIX.2)379.02 343.2 R .627
+(compliant, Bash also enters POSIX mode if the variable)72 355.2 R F1($POSIXL)
+3.128 E(Y_CORRECT)-.92 E F0 .628(is set when Bash)3.128 F .891
+(is started or assigned a value during execution.)72 367.2 R F1
+($POSIX_PEDANTIC)5.891 E F0 .89(is accepted as well, to be)3.391 F .445
+(compatible with some older GNU utilities.)72 379.2 R .446
+(When Bash is started in POSIX mode, for example, it)5.445 F(sour)72 391.2 Q
+.342(ces the \214le named by the value of)-.18 F F1($ENV)2.842 E F0 .342
+(rather than the `)2.842 F(`normal')-.37 E 2.842('s)-.37 G .341
+(tartup \214les, and does not)392.566 391.2 R(allow r)72 403.2 Q(eserved wor)
+-.18 E(ds to be aliased.)-.18 E F1 2.5(5. New)72 427.2 R
+(Features and Future Plans)2.5 E F0(Ther)97 442.8 Q 4.157(ea)-.18 G 2.017 -.18
+(re s)131.457 442.8 T 1.658(everal featur).18 F 1.658(es intr)-.18 F 1.658
+(oduced in the curr)-.18 F 1.658(ent version of Bash, version 1.14, and a)-.18
+F .714(number under consideration for futur)72 454.8 R 3.214(er)-.18 G 3.214
+(eleases. This)253.61 454.8 R .714
+(section will brie\215y detail the new featur)3.214 F(es)-.18 E
+(in version 1.14 and describe several featur)72 466.8 Q
+(es that may appear in later versions.)-.18 E F1 2.5(5.1. New)72 490.8 R
+(Features in Bash-1.14)2.5 E F0 1.303(The new featur)97 506.4 R 1.304
+(es available in Bash-1.14 answer several of the most common r)-.18 F 1.304
+(equests for)-.18 F 2.815(enhancements. Most)72 518.4 R(notably)2.815 E 2.815
+(,t)-1.11 G(her)209.475 518.4 Q 2.815(ei)-.18 G 2.815(sam)234.37 518.4 S .314
+(echanism for including non-visible character sequences)258.07 518.4 R 1.795
+(in pr)72 530.4 R 1.796
+(ompts, such as those which cause a terminal to print characters in dif)-.18 F
+(fer)-.18 E 1.796(ent colors or in)-.18 F .354(standout mode.)72 542.4 R(Ther)
+5.354 E 2.854(ew)-.18 G .354(as nothing pr)183.572 542.4 R .353
+(eventing the use of these sequences in earlier versions, but)-.18 F 2.113
+(the r)72 554.4 R 2.113(eadline r)-.18 F 2.114
+(edisplay algorithm assumed each character occupied physical scr)-.18 F 2.114
+(een space and)-.18 F(would wrap lines pr)72 566.4 Q(ematur)-.18 E(ely)-.18 E
+(.)-1.11 E 1.183(Readline has a few new variables, several new bindable comman\
+ds, and some additional)97 582 R 1.399(emacs mode default key bindings.)72 594
+R 3.899(An)6.399 G 1.399(ew history sear)252.724 594 R 1.4
+(ch mode has been implemented: in this)-.18 F .033(mode, r)72 606 R .033
+(eadline sear)-.18 F .032(ches the history for lines beginning with the charac\
+ters between the beginning)-.18 F .452(of the curr)72 618 R .452
+(ent line and the cursor)-.18 F 5.452(.T)-.74 G .452(he existing r)233.074 618
+R .452(eadline incr)-.18 F .452(emental sear)-.18 F .453(ch commands no longer)
+-.18 F .947(match identical lines mor)72 630 R 3.447(et)-.18 G .947(han once.)
+198.068 630 R .946(Filename completion now expands variables in dir)5.947 F
+(ectory)-.18 E 2.516(names. The)72 642 R .016(history expansion facilities ar)
+2.516 F 2.516(en)-.18 G .017
+(ow nearly completely csh-compatible: missing modi-)270.006 642 R
+(\214ers have been added and history substitution has been extended.)72 654 Q
+.535(Several of the featur)97 669.6 R .535(es described earlier)-.18 F 3.035
+(,s)-.74 G .535(uch as)282.59 669.6 R F1 .534(set -o posix)3.035 F F0(and)3.034
+E F1($POSIX_PEDANTIC)3.034 E F0 3.034(,a)C -.18(re)495.44 669.6 S .749
+(new in version 1.14.)72 681.6 R(Ther)5.749 E 3.249(ei)-.18 G 3.249(san)199.455
+681.6 S .749(ew shell variable,)221.013 681.6 R F1(OSTYPE)3.249 E F0 3.25(,t)C
+3.25(ow)351.81 681.6 S .75(hich Bash assigns a value that)368.86 681.6 R .417
+(identi\214es the version of)72 693.6 R/F3 9/Palatino-Roman@0 SF(UNIX)2.917 E
+F0 .416(it's r)2.917 F .416(unning on \(gr)-.08 F .416(eat for putting ar)-.18
+F(chitectur)-.18 E .416(e-speci\214c binary dir)-.18 F(ec-)-.18 E 2.257
+(tories into the)72 705.6 R F1($P)4.757 E -.92(AT)-.74 G(H).92 E F0 4.757
+(\). T)B 2.257(wo variables have been r)-.9 F(enamed:)-.18 E F1($HISTCONTROL)
+4.758 E F0 -.18(re)4.758 G(places).18 E F1($his-)4.758 E(tory_control)72 717.6
+Q F0 5.733(,a)C(nd)140.793 717.6 Q F1($HOSTFILE)5.733 E F0 -.18(re)5.732 G
+(places).18 E F1($hostname_completion_\214le)5.732 E F0 8.232(.I)C 5.732(nb)
+401.622 717.6 S 3.232(oth cases, the old)418.704 717.6 R 2.337(names ar)72
+729.6 R 4.837(ea)-.18 G 2.338(ccepted for backwar)128.914 729.6 R 2.338
+(ds compatibility)-.18 F 7.338(.T)-1.11 G 2.338(he ksh)311.846 729.6 R F2
+(select)4.838 E F0(constr)6.504 E 2.338(uct, which allows the)-.08 F EP
+%%Page: 10 10
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-1)277.17 48 S 2.5(0-)288 48 S .565
+(generation of simple menus, has been implemented.)72 84 R .564
+(New capabilities have been added to exist-)5.565 F 1.446(ing variables:)72 96
+R/F1 10/Palatino-Bold@0 SF($auto_resume)3.946 E F0 1.446
+(can now take values of)3.946 F/F2 10/Palatino-Italic@0 SF(exact)3.947 E F0(or)
+5.613 E F2(substring)3.947 E F0 3.947(,a)1.666 G(nd)405.913 96 Q F1
+($HISTCONTROL)3.947 E F0 1.8(understands the value)72 108 R F2(ignor)4.3 E
+(eboth)-.18 E F0 4.3(,w)1.666 G 1.799(hich combines the two pr)238.106 108 R
+1.799(eviously acceptable values.)-.18 F(The)6.799 E F1(dirs)72 120 Q F0 2.612
+(builtin has acquir)5.112 F 2.613
+(ed options to print out speci\214c members of the dir)-.18 F 2.613
+(ectory stack.)-.18 F(The)7.613 E F1($nolinks)72 132 Q F0 .177
+(variable, which for)2.677 F .176
+(ces a physical view of the \214le system, has been superseded by the)-.18 F F1
+<ad50>2.676 E F0 1.486(option to the)72 144 R F1(set)3.986 E F0 1.486
+(builtin \(equivalent to)3.986 F F1 1.486(set -o physical)3.986 F F0 1.486
+(\); the variable is r)B 1.486(etained for backwar)-.18 F(ds)-.18 E
+(compatibility)72 156 Q 5.564(.T)-1.11 G .564(he version string contained in)
+144.074 156 R F1($BASH_VERSION)3.064 E F0 .563(now includes an indication of)
+3.064 F .501(the patch level as well as the `)72 168 R .501(`build version')
+-.37 F 3.001('. Some)-.37 F .502(little-used featur)3.001 F .502
+(es have been r)-.18 F 3.002(emoved: the)-.18 F F1(bye)72 180 Q F0 .943
+(synonym for)3.443 F F1(exit)3.443 E F0 .943(and the)3.443 F F1($NO_PROMPT_V)
+3.443 E(ARS)-1.29 E F0 .943(variable ar)3.443 F 3.443(eg)-.18 G 3.443
+(one. Ther)379.707 180 R 3.443(ei)-.18 G 3.443(sn)435.873 180 S .942(ow an or)
+449.376 180 R(ga-)-.18 E(nized test suite that can be r)72 192 Q(un as a r)-.08
+E(egr)-.18 E(ession test when building a new version of Bash.)-.18 E 1.42
+(The documentation has been thor)97 207.6 R 1.421(oughly over)-.18 F 1.421
+(hauled: ther)-.18 F 3.921(ei)-.18 G 3.921(san)372.184 207.6 S 1.421
+(ew manual page on the)395.086 207.6 R -.18(re)72 219.6 S 1.142
+(adline library and the).18 F F2(info)3.642 E F0 1.142
+(\214le has been updated to r)3.642 F 1.142(e\215ect the curr)-.18 F 1.142
+(ent version.)-.18 F 1.141(As always, as)6.142 F
+(many bugs as possible have been \214xed, although some sur)72 231.6 Q(ely r)
+-.18 E(emain.)-.18 E F1 2.5(5.2. Other)72 255.6 R(Features)2.5 E F0(Ther)97
+271.2 Q 3.692(ea)-.18 G 1.552 -.18(re a f)130.992 271.2 T 1.192(ew featur).18 F
+1.192(es that I hope to include in later Bash r)-.18 F 3.693(eleases. Some)-.18
+F(ar)3.693 E 3.693(eb)-.18 G 1.193(ased on)468.887 271.2 R(work alr)72 283.2 Q
+(eady done in other shells.)-.18 E 2.717
+(In addition to simple variables, a futur)97 298.8 R 5.217(er)-.18 G 2.716
+(elease of Bash will include one-dimensional)297.159 298.8 R .575
+(arrays, using the ksh implementation of arrays as a model.)72 310.8 R .575
+(Additions to the ksh syntax, such as)5.575 F F2(varname)72 322.8 Q F0 1.116
+(=\( ... \) to assign a list of wor)B 1.115(ds dir)-.18 F 1.115
+(ectly to an array and a mechanism to allow the)-.18 F F1(read)3.615 E F0 .492
+(builtin to r)72 334.8 R .492(ead a list of values dir)-.18 F .493
+(ectly into an array)-.18 F 2.993(,w)-1.11 G .493(ould be desirable.)313.615
+334.8 R .493(Given those extensions,)5.493 F .621(the ksh)72 346.8 R F1 .621
+(set \255A)3.121 F F0 .621(syntax may not be worth supporting \(the)3.121 F F1
+<ad41>3.12 E F0 .62(option assigns a list of values to an)3.12 F(array)72 358.8
+Q 2.5(,b)-1.11 G(ut is a rather peculiar special case\).)104.88 358.8 Q .522
+(Some shells include a means of)97 374.4 R F2(pr)3.022 E(ogrammable)-.18 E F0
+(wor)3.022 E 3.022(dc)-.18 G .522(ompletion, wher)331.796 374.4 R 3.023(et)-.18
+G .523(he user speci\214es on)416.561 374.4 R 3.291(ap)72 386.4 S(er)86.301
+386.4 Q .791(-command basis how the ar)-.18 F .791(guments of the command ar)
+-.18 F 3.291(et)-.18 G 3.29(ob)358.98 386.4 S 3.29(et)373.26 386.4 S -.18(re)
+384.6 386.4 S .79(ated when completion is).18 F .588
+(attempted: as \214lenames, hostnames, executable \214les, and so on.)72 398.4
+R .589(The other aspects of the curr)5.589 F(ent)-.18 E .649
+(Bash implementation could r)72 410.4 R .648
+(emain as-is; the existing heuristics would still be valid.)-.18 F .648
+(Only when)5.648 F 2.136(completing the ar)72 422.4 R 2.137
+(guments to a simple command would the pr)-.18 F 2.137
+(ogrammable completion be in)-.18 F(ef)72 434.4 Q(fect.)-.18 E .223
+(It would also be nice to give the user \214ner)97 450 R .223(-grained contr)
+-.18 F .222(ol over which commands ar)-.18 F 2.722(es)-.18 G(aved)482.45 450 Q
+1.603(onto the history list.)72 462 R 1.604(One pr)6.604 F 1.604
+(oposal is for a variable, tentatively named)-.18 F F1(HISTIGNORE)4.104 E F0
+4.104(,w)C(hich)485.01 462 Q .471
+(would contain a colon-separated list of commands.)72 474 R .471
+(Lines beginning with these commands, after)5.471 F .056(the r)72 486 R .056
+(estrictions of)-.18 F F1($HISTCONTROL)2.556 E F0 .057
+(have been applied, would not be placed onto the history list.)2.556 F 1.246(T\
+he shell pattern-matching capabilities could also be available when specifying\
+ the contents of)72 498 R F1($HISTIGNORE)72 510 Q F0(.)A .612
+(One thing that newer shells such as)97 525.6 R F1(wksh)3.112 E F0 .612
+(\(also known as)3.112 F F1(dtksh)3.112 E F0 3.112(\)p)C -.18(ro)397.502 525.6
+S .612(vide is a command to).18 F 1.826
+(dynamically load code implementing additional builtin commands into a r)72
+537.6 R 1.826(unning shell.)-.08 F(This)6.826 E 1.2
+(new builtin would take an object \214le or shar)72 549.6 R 1.2
+(ed library implementing the `)-.18 F(`body')-.37 E 3.7('o)-.37 G 3.7(ft)450.03
+549.6 S 1.2(he builtin)460.32 549.6 R(\()72 561.6 Q F2(xxx_builtin\(\))A F0
+1.094(for those familiar with Bash internals\) and a str)3.595 F(uctur)-.08 E
+3.594(ec)-.18 G 1.094(ontaining the name of the)386.094 561.6 R .731
+(new command, the function to call when the new builtin is invoked \(pr)72
+573.6 R .731(esumably de\214ned in the)-.18 F(shar)72 585.6 Q .881
+(ed object speci\214ed as an ar)-.18 F .881
+(gument\), and the documentation to be printed by the)-.18 F F1(help)3.38 E F0
+(com-)3.38 E .974(mand \(possibly pr)72 597.6 R .974(esent in the shar)-.18 F
+.975(ed object as well\).)-.18 F .975(It would manage the details of extending)
+5.975 F(the internal table of builtins.)72 609.6 Q 2.641(Af)97 625.2 S .141
+(ew other builtins would also be desirable: two ar)110.751 625.2 R 2.641(et)
+-.18 G .14(he POSIX.2)337.93 625.2 R F1(getconf)2.64 E F0 .14(command, which)
+2.64 F 1.518(prints the values of system con\214guration variables de\214ned b\
+y POSIX.2, and a)72 637.2 R F1(disown)4.019 E F0(builtin,)4.019 E .93
+(which causes a shell r)72 649.2 R .929(unning with job contr)-.08 F .929
+(ol active to `)-.18 F(`for)-.37 E .929(get about')-.18 F 3.429('o)-.37 G .929
+(ne or mor)397.563 649.2 R 3.429(eb)-.18 G(ackgr)456.25 649.2 Q(ound)-.18 E
+.095(jobs in its internal jobs table.)72 661.2 R(Using)5.095 E F1(getconf)2.595
+E F0 2.595(,f)C .095(or example, a user could r)274.02 661.2 R .096
+(etrieve a value for)-.18 F F1($P)2.596 E -.92(AT)-.74 G(H).92 E F0 .73
+(guaranteed to \214nd all of the POSIX standar)72 673.2 R 3.23(du)-.18 G .73
+(tilities, or \214nd out how long \214lenames may be in)282.86 673.2 R
+(the \214le system containing a speci\214ed dir)72 685.2 Q(ectory)-.18 E(.)
+-1.11 E(Ther)97 700.8 Q 4.171(ea)-.18 G 2.031 -.18(re n)131.471 700.8 T 4.171
+(oi).18 G 1.671(mplementation timetables for any of these featur)162.563 700.8
+R 1.672(es, nor ar)-.18 F 4.172(et)-.18 G(her)443.888 700.8 Q 4.172(ec)-.18 G
+(oncr)471.67 700.8 Q(ete)-.18 E .034(plans to include them.)72 712.8 R .034
+(If anyone has comments on these pr)5.034 F .034(oposals, feel fr)-.18 F .033
+(ee to send me electr)-.18 F(onic)-.18 E(mail.)72 724.8 Q EP
+%%Page: 11 11
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-1)277.445 48 S 2.5(1-)287.725 48 S/F1 10
+/Palatino-Bold@0 SF 2.5(6. Re\215ections)72 84 R(and Lessons Learned)2.5 E F0
+1.503(The lesson that has been r)97 99.6 R 1.504
+(epeated most often during Bash development is that ther)-.18 F 4.004(ea)-.18 G
+-.18(re)495.44 99.6 S 1.052
+(dark corners in the Bourne Shell, and people use all of them.)72 111.6 R 1.051
+(In the original description of the)6.052 F 1.37
+(Bourne shell, quoting and the shell grammar ar)72 123.6 R 3.87(eb)-.18 G 1.37
+(oth poorly speci\214ed and incomplete; subse-)304.61 123.6 R .387
+(quent descriptions have not helped much.)72 135.6 R .387(The grammar pr)5.387
+F .386(esented in Bourne's paper describing)-.18 F .059
+(the shell distributed with the Seventh Edition of)72 147.6 R/F2 9
+/Palatino-Roman@0 SF(UNIX)2.559 E F0 2.559<8769>C 2.559(ss)321.048 147.6 S
+2.559(of)332.087 147.6 S .059(ar of)343.436 147.6 R 2.559(ft)-.18 G .059
+(hat it does not allow the com-)372.704 147.6 R(mand)72 159.6 Q/F3 10/Courier@0
+SF(who|wc)2.5 E F0 5(.I)C 2.5(nf)147.13 159.6 S(act, as T)158.78 159.6 Q
+(om Duf)-.92 E 2.5(fs)-.18 G(tates:)237.21 159.6 Q .985(Nobody r)97 175.2 R
+.984(eally knows what the Bourne shell's grammar is.)-.18 F .984
+(Even examination of the)5.984 F(sour)97 187.2 Q(ce code is little help.\210)
+-.18 E .782(The POSIX.2 standar)72 202.8 R 3.282(di)-.18 G .782(ncludes a)
+177.496 202.8 R/F4 10/Palatino-Italic@0 SF(yacc)3.282 E F0 .782
+(grammar that comes close to capturing the Bourne shell's)3.282 F(behavior)72
+214.8 Q 3.67(,b)-.74 G 1.17(ut it disallows some constr)122.07 214.8 R 1.169
+(ucts which sh accepts without complaint \255 and ther)-.08 F 3.669(ea)-.18 G
+-.18(re)495.44 214.8 S .223(scripts out ther)72 226.8 R 2.723(et)-.18 G .223
+(hat use them.)149.659 226.8 R .224(It took a few versions and several bug r)
+5.223 F .224(eports befor)-.18 F 2.724(eB)-.18 G .224(ash imple-)457.436 226.8
+R .427(mented sh-compatible quoting, and ther)72 238.8 R 2.927(ea)-.18 G .787
+-.18(re s)264.265 238.8 T .426(till some `).18 F(`legal')-.37 E 2.926('s)-.37 G
+2.926(hc)359.87 238.8 S(onstr)373.056 238.8 Q .426(ucts which Bash \215ags as)
+-.08 F(syntax err)72 250.8 Q 2.5(ors. Complete)-.18 F
+(sh compatibility is a tough nut.)2.5 E .314
+(The shell is bigger and slower than I would like, though the curr)97 266.4 R
+.314(ent version is substantially)-.18 F 1.507(faster than pr)72 278.4 R
+(eviously)-.18 E 6.507(.T)-1.11 G 1.507(he r)185.841 278.4 R 1.507
+(eadline library could stand a substantial r)-.18 F 4.006(ewrite. A)-.18 F
+(hand-written)4.006 E .574(parser to r)72 290.4 R .574(eplace the curr)-.18 F
+(ent)-.18 E F4(yacc)3.074 E F0 .574(-generated one would pr)B .574(obably r)
+-.18 F .575(esult in a speedup, and would)-.18 F 1.865(solve one glaring pr)72
+302.4 R 4.365(oblem: the)-.18 F 1.864(shell could parse commands in `)4.364 F
+(`$\(...\)')-.37 E 4.364('c)-.37 G(onstr)408.058 302.4 Q 1.864(ucts as they ar)
+-.08 F(e)-.18 E(enter)72 314.4 Q(ed, rather than r)-.18 E(eporting err)-.18 E
+(ors when the constr)-.18 E(uct is expanded.)-.08 E .198(As always, ther)97 330
+R 2.698(ei)-.18 G 2.698(ss)176.004 330 S .198(ome chaf)187.182 330 R 2.699(ft)
+-.18 G 2.699(og)236.659 330 S 2.699(ow)250.378 330 S .199(ith the wheat.)
+266.877 330 R(Ar)5.199 E .199(eas of duplicated functionality need)-.18 F 1.009
+(to be cleaned up.)72 342 R(Ther)6.009 E 3.509(ea)-.18 G 1.369 -.18(re s)
+189.785 342 T 1.009(everal cases wher).18 F 3.509(eB)-.18 G 1.009(ash tr)
+300.041 342 R 1.008(eats a variable specially to enable func-)-.18 F 1.316
+(tionality available another way \()72 354 R F1($notify)A F0(vs.)3.816 E F1
+1.316(set -o notify)6.316 F F0(and)3.816 E F1($nolinks)3.816 E F0(vs.)3.816 E
+F1 1.316(set -o physical)3.816 F F0 3.816(,f)C(or)494.59 354 Q .925
+(instance\); the special tr)72 366 R .925
+(eatment of the variable name should pr)-.18 F .925(obably be r)-.18 F 3.425
+(emoved. A)-.18 F .925(few mor)3.425 F(e)-.18 E 2.296(things could stand r)72
+378 R 2.296(emoval; the)-.18 F F1($allow_null_glob_expansion)4.796 E F0(and)
+4.796 E F1($glob_dot_\214lenames)4.797 E F0(vari-)4.797 E .728(ables ar)72 390
+R 3.228(eo)-.18 G 3.228(fp)119.946 390 S .728(articularly questionable value.)
+132.514 390 R(The)5.728 E F1($[...])3.227 E F0 .727
+(arithmetic evaluation syntax is r)3.227 F(edundant)-.18 E .804
+(now that the POSIX-mandated)72 402 R F1($\(\(...\)\))3.304 E F0(constr)3.304 E
+.805(uct has been implemented, and could be deleted.)-.08 F(It)5.805 E 1.056
+(would be nice if the text output by the)72 414 R F1(help)3.556 E F0 1.055
+(builtin wer)3.556 F 3.555(ee)-.18 G 1.055
+(xternal to the shell rather than com-)339.79 414 R 1.365(piled into it.)72 426
+R 1.365(The behavior enabled by)6.365 F F1($command_oriented_history)3.865 E F0
+3.865(,w)C 1.365(hich causes the shell to)397.55 426 R 1.047
+(attempt to save all lines of a multi-line command in a single history entry)72
+438 R 3.547(,s)-1.11 G 1.047(hould be made the)418.109 438 R
+(default and the variable r)72 450 Q(emoved.)-.18 E F1 2.5(7. A)72 474 R
+(vailability)-.7 E F0 6.17(As with all other GNU softwar)97 489.6 R 6.17
+(e, Bash is available for anonymous FTP fr)-.18 F(om)-.18 E F4(pr)72 501.6 Q
+(ep.ai.mit.edu:/pub/gnu)-.18 E F0 2.136(and fr)6.302 F 2.136
+(om other GNU softwar)-.18 F 4.635(em)-.18 G(irr)334.21 501.6 Q 2.135
+(or sites.)-.18 F 2.135(The curr)7.135 F 2.135(ent version is in)-.18 F F4
+(bash-1.14.1.tar)72 513.6 Q(.gz)-.74 E F0 .241(in that dir)4.407 F(ectory)-.18
+E 5.241(.U)-1.11 G(se)234.27 513.6 Q F4(ar)2.741 E(chie)-.18 E F0 .241
+(to \214nd the near)4.407 F .241(est ar)-.18 F .241(chive site.)-.18 F .242
+(The latest version is)5.241 F .295(always available for FTP fr)72 525.6 R(om)
+-.18 E F4(bash.CWRU.Edu:/pub/dist.)2.795 E F0 .295
+(Bash documentation is available for FTP)4.461 F(fr)72 537.6 Q(om)-.18 E F4
+(bash.CWRU.Edu:/pub/bash.)2.5 E F0 1.207(The Fr)97 553.2 R 1.207(ee Softwar)
+-.18 F 3.707(eF)-.18 G 1.207
+(oundation sells tapes and CD-ROMs containing Bash; send electr)188.531 553.2 R
+(onic)-.18 E(mail to)72 565.2 Q F3(gnu@prep.ai.mit.edu)2.5 E F0(or call)2.5 E
+F3(+1-617-876-3296)2.5 E F0(for mor)2.5 E 2.5(ei)-.18 G(nformation.)387.54
+565.2 Q .283(Bash is also distributed with several versions of)97 580.8 R F2
+(UNIX)2.782 E F0 .282(-compatible systems.)B .282(It is included as)5.282 F
+.624(/bin/sh and /bin/bash on several Linux distributions \(mor)72 592.8 R
+3.124(ea)-.18 G .624(bout the dif)353.78 592.8 R(fer)-.18 E .624
+(ence in a moment\),)-.18 F(and as contributed softwar)72 604.8 Q 2.5(ei)-.18 G
+2.5(nB)200.83 604.8 S(SDI's BSD/386* and Fr)215.26 604.8 Q(eeBSD.)-.18 E .529
+(The Linux distribution deserves special mention.)97 620.4 R(Ther)5.529 E 3.029
+(ea)-.18 G .889 -.18(re t)354.414 620.4 T .529(wo con\214gurations included in)
+.18 F .037(the standar)72 632.4 R 2.537(dB)-.18 G .038(ash distribution: a `)
+136.364 632.4 R(`normal')-.37 E 2.538('c)-.37 G .038
+(on\214guration, in which all of the standar)268.256 632.4 R 2.538(df)-.18 G
+(eatur)456.022 632.4 Q .038(es ar)-.18 F(e)-.18 E .451(included, and a `)72
+644.4 R(`minimal')-.37 E 2.951('c)-.37 G .451
+(on\214guration, which omits job contr)199.384 644.4 R .451
+(ol, aliases, history and command)-.18 F .356(line editing, the dir)72 656.4 R
+.356(ectory stack and)-.18 F F1(pushd/popd/dirs,)2.856 E F0(pr)2.856 E .357
+(ocess substitution, pr)-.18 F .357(ompt string special)-.18 F .32 LW 76 666.4
+72 666.4 DL 80 666.4 76 666.4 DL 84 666.4 80 666.4 DL 88 666.4 84 666.4 DL 92
+666.4 88 666.4 DL 96 666.4 92 666.4 DL 100 666.4 96 666.4 DL 104 666.4 100
+666.4 DL 108 666.4 104 666.4 DL 112 666.4 108 666.4 DL 116 666.4 112 666.4 DL
+120 666.4 116 666.4 DL 124 666.4 120 666.4 DL 128 666.4 124 666.4 DL 132 666.4
+128 666.4 DL 136 666.4 132 666.4 DL 140 666.4 136 666.4 DL 144 666.4 140 666.4
+DL/F5 8/Palatino-Roman@0 SF .42(\207S. R. Bourne, `)72 676.4 R .42(`UNIX T)
+-.296 F .42(ime-Sharing System:)-.44 F .42(The UNIX Shell')4.42 F(',)-.296 E/F6
+8/Palatino-Italic@0 SF .42(Bell System T)2.42 F .42(echnical Journal)-.888 F F5
+2.42(,5)C .42(7\(6\), July-August,)405.004 676.4 R(1978, pp. 1971-1990.)72
+686.4 Q<8854>72 696.4 Q .209(om Duf)-.736 F .209(f, `)-.144 F .209
+(`Rc \255 A Shell for Plan 9 and)-.296 F/F7 7/Palatino-Roman@0 SF(UNIX)2.209 E
+F5(systems')2.209 E(',)-.296 E F6(Pr)2.209 E .208
+(oc. of the Summer 1990 EUUG Confer)-.144 F(ence)-.144 E F5 2.208(,L)C .208
+(ondon, Ju-)430.704 696.4 R(ly)72 706.4 Q 2(,1)-.888 G(990, pp. 21-33.)85.888
+706.4 Q(*BSD/386 is a trademark of Berkeley Softwar)72 716.4 Q 2(eD)-.144 G
+(esign, Inc.)243.472 716.4 Q EP
+%%Page: 12 12
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Palatino-Roman@0 SF 2.5(-1)277.17 48 S 2.5(2-)288 48 S 1.319
+(character decoding, and the)72 84 R/F1 10/Palatino-Italic@0 SF(select)3.818 E
+F0(constr)5.484 E 3.818(uct. This)-.08 F 1.318
+(minimal version is designed to be a dr)3.818 F(op-in)-.18 E -.18(re)72 96 S
+1.292(placement for the traditional).18 F/F2 9/Palatino-Roman@0 SF(UNIX)3.792 E
+F0 1.293(/bin/sh, and is included as the Linux /bin/sh in several)3.792 F
+(packagings.)72 108 Q/F3 10/Palatino-Bold@0 SF 2.5(8. Conclusion)72 132 R F0
+.19(Bash is a worthy successor to sh.)97 147.6 R .19(It is suf)5.19 F .19
+(\214ciently portable to r)-.18 F .19(un on nearly every version of)-.08 F F2
+(UNIX)72 159.6 Q F0(fr)2.929 E .429(om 4.3 BSD to SVR4.2, and several)-.18 F F2
+(UNIX)2.93 E F0 2.93(workalikes. It)2.93 F .43(is r)2.93 F .43
+(obust enough to r)-.18 F .43(eplace sh on)-.18 F 1.22
+(most of those systems, and pr)72 171.6 R 1.219(ovides mor)-.18 F 3.719(ef)-.18
+G(unctionality)271.896 171.6 Q 6.219(.I)-1.11 G 3.719(th)336.255 171.6 S 1.219
+(as several thousand r)349.054 171.6 R 1.219(egular users,)-.18 F .052(and the\
+ir feedback has helped to make it as good as it is today \255 a testament to t\
+he bene\214ts of fr)72 183.6 R(ee)-.18 E(softwar)72 195.6 Q(e.)-.18 E EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/article.txt b/doc/article.txt
new file mode 100644 (file)
index 0000000..c19ff92
--- /dev/null
@@ -0,0 +1,1111 @@
+
+
+
+
+
+
+
+
+
+                   Bash - The GNU shell*
+
+
+                         Chet Ramey
+              Case Western Reserve University
+                      chet@po.cwru.edu
+
+
+
+
+
+
+_\b1.  _\bI_\bn_\bt_\br_\bo_\bd_\bu_\bc_\bt_\bi_\bo_\bn
+
+     _\bB_\ba_\bs_\bh is the shell,  or  command  language  interpreter,
+that  will  appear in the GNU operating system.  The name is
+an acronym for the "Bourne-Again  SHell",  a  pun  on  Steve
+Bourne,  the  author  of  the direct ancestor of the current
+UNIX|\b- shell /_\bb_\bi_\bn/_\bs_\bh, which appeared in the  Seventh  Edition
+Bell Labs Research version of UNIX.
+
+     Bash is an sh-compatible shell that incorporates useful
+features  from  the  Korn shell (ksh) and the C shell (csh),
+described later in this article.  It is ultimately  intended
+to  be  a  conformant implementation of the IEEE POSIX Shell
+and Utilities specification (IEEE Working Group 1003.2).  It
+offers  functional improvements over sh for both interactive
+and programming use.
+
+     While the GNU operating system will most likely include
+a  version  of  the  Berkeley  shell  csh,  Bash will be the
+default shell.  Like other GNU software, Bash is quite port-
+able.  It currently runs on nearly every version of UNIX and
+a few other operating systems -  an  independently-supported
+port  exists  for OS/2, and there are rumors of ports to DOS
+and Windows NT.  Ports to UNIX-like systems such as QNX  and
+Minix are part of the distribution.
+
+     The original author of Bash was Brian Fox, an  employee
+of  the Free Software Foundation.  The current developer and
+maintainer is Chet Ramey, a  volunteer  who  works  at  Case
+Western Reserve University.
+
+_\b2.  _\bW_\bh_\ba_\bt'_\bs _\bP_\bO_\bS_\bI_\bX, _\ba_\bn_\by_\bw_\ba_\by?
+
+     _\bP_\bO_\bS_\bI_\bX is a name originally coined by  Richard  Stallman
+_________________________
+*An earlier version of this  article  appeared  in  The
+Linux Journal.
+|\b- UNIX is a trademark of Bell Laboratories.
+
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 2 -
+
+
+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  sys-
+tem  call  and  C library level to applications and tools to
+system administration and management.  Each  area  of  stan-
+dardization  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).|\b=  It  con-
+centrates  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.  There are four primary areas of work
+in the 1003.2 standard:
+
+o\b+    Aspects of the shell's syntax and command language.   A
+     number  of  special  builtins  such  as _\bc_\bd and _\be_\bx_\be_\bc are
+     being specified as part of the shell, since their func-
+     tionality  usually  cannot be implemented by a separate
+     executable;
+
+o\b+    A set of utilities to be called by  shell  scripts  and
+     applications.   Examples are programs like _\bs_\be_\bd, _\bt_\br, and
+     _\ba_\bw_\bk.  Utilities commonly implemented as shell  builtins
+     are  described  in this section, such as _\bt_\be_\bs_\bt and _\bk_\bi_\bl_\bl.
+     An expansion of this section's scope, termed  the  User
+     Portability   Extension,   or   UPE,  has  standardized
+     interactive programs such as _\bv_\bi and _\bm_\ba_\bi_\bl_\bx;
+
+o\b+    A group of functional interfaces to  services  provided
+     by  the  shell,  such  as  the  traditional  system() C
+     library function.  There are functions to perform shell
+     word expansions, perform filename expansion (_\bg_\bl_\bo_\bb_\bb_\bi_\bn_\bg),
+     obtain values of  POSIX.2  system  configuration  vari-
+     ables,   retrieve   values   of  environment  variables
+     (getenv()), _\ba_\bn_\bd _\bo_\bt_\bh_\be_\br _\bs_\be_\br_\bv_\bi_\bc_\be_\bs;
+
+o\b+    A suite of "development" utilities  such  as  _\bc_\b8_\b9  (the
+     POSIX.2 version of _\bc_\bc), and _\by_\ba_\bc_\bc.
+
+     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  con-
+trol  and  program execution constructs, I/O redirection and
+pipelining, argument handling, variable expansion, and quot-
+ing.   The  _\bs_\bp_\be_\bc_\bi_\ba_\bl  builtins,  which must be implemented as
+part of the shell to provide the desired functionality,  are
+_________________________
+|\b=IEEE, _\bI_\bE_\bE_\bE  _\bS_\bt_\ba_\bn_\bd_\ba_\br_\bd  _\bf_\bo_\br  _\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn  _\bT_\be_\bc_\bh_\bn_\bo_\bl_\bo_\bg_\by  --
+_\bP_\bo_\br_\bt_\ba_\bb_\bl_\be  _\bO_\bp_\be_\br_\ba_\bt_\bi_\bn_\bg  _\bS_\by_\bs_\bt_\be_\bm  _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be  (_\bP_\bO_\bS_\bI_\bX) _\bP_\ba_\br_\bt _\b2:
+_\bS_\bh_\be_\bl_\bl _\ba_\bn_\bd _\bU_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs, 1992.
+
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 3 -
+
+
+specified as being part of the shell; examples of these  are
+_\be_\bv_\ba_\bl  and _\be_\bx_\bp_\bo_\br_\bt.  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
+_\br_\be_\ba_\bd and  _\bt_\be_\bs_\bt.   POSIX.2  also  specifies  aspects  of  the
+shell's  interactive  behavior as part of the UPE, including
+job control and command line editing.  Interestingly enough,
+only  _\bv_\bi-style line editing commands have been standardized;
+_\be_\bm_\ba_\bc_\bs editing commands were left out due to objections.
+
+     While POSIX.2 includes much of what the shell has trad-
+itionally  provided, some important things have been omitted
+as being "beyond its scope."  There  is,  for  instance,  no
+mention  of a difference between a _\bl_\bo_\bg_\bi_\bn shell and any other
+interactive shell (since POSIX.2 does not  specify  a  login
+program).   No fixed startup files are defined, either - the
+standard does not mention ._\bp_\br_\bo_\bf_\bi_\bl_\be.
+
+_\b3.  _\bB_\ba_\bs_\bi_\bc _\bB_\ba_\bs_\bh _\bf_\be_\ba_\bt_\bu_\br_\be_\bs
+
+     Since the Bourne shell provides Bash with most  of  its
+philosophical  underpinnings,  Bash  inherits  most  of  its
+features and functionality from sh.  Bash implements all  of
+the  traditional sh flow control constructs (_\bf_\bo_\br, _\bi_\bf, _\bw_\bh_\bi_\bl_\be,
+etc.).  All of the Bourne shell  builtins,  including  those
+not  specified  in  the  POSIX.2  standard,  appear in Bash.
+Shell _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs, introduced  in  the  SVR2  version  of  the
+Bourne  shell, are similar to shell scripts, but are defined
+using a special syntax and are executed in the same  process
+as the calling shell.  Bash has shell functions which behave
+in a fashion upward-compatible with sh functions.  There are
+certain shell variables that Bash interprets in the same way
+as sh, such as _\bP_\bS_\b1, _\bI_\bF_\bS, and _\bP_\bA_\bT_\bH.  Bash  implements  essen-
+tially  the  same  grammar, parameter and variable expansion
+semantics, redirection, and quoting  as  the  Bourne  shell.
+Where  differences  appear  between the POSIX.2 standard and
+traditional sh behavior, Bash follows POSIX.
+
+     The Korn Shell (ksh) is  a  descendent  of  the  Bourne
+shell  written at AT&T Bell Laboratories by David Korn|\b-.  It
+provides a number of useful features  that  POSIX  and  Bash
+have adopted.  Many of the interactive facilities in POSIX.2
+have their roots in the ksh: for example, the POSIX and  ksh
+job  control  facilities are nearly identical. Bash includes
+features from the Korn Shell for both  interactive  use  and
+shell programming.  For programming, Bash provides variables
+such as _\bR_\bA_\bN_\bD_\bO_\bM and _\bR_\bE_\bP_\bL_\bY, the _\bt_\by_\bp_\be_\bs_\be_\bt builtin,  the  ability
+to  remove  substrings from variables based on patterns, and
+shell arithmetic.  _\bR_\bA_\bN_\bD_\bO_\bM expands to a  random  number  each
+time it is referenced; assigning a value to _\bR_\bA_\bN_\bD_\bO_\bM seeds the
+_________________________
+|\b-Morris Bolsky and David Korn,  _\bT_\bh_\be  _\bK_\bo_\br_\bn_\bS_\bh_\be_\bl_\bl  _\bC_\bo_\bm_\bm_\ba_\bn_\bd
+_\ba_\bn_\bd _\bP_\br_\bo_\bg_\br_\ba_\bm_\bm_\bi_\bn_\bg _\bL_\ba_\bn_\bg_\bu_\ba_\bg_\be, Prentice Hall, 1989.
+
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 4 -
+
+
+random number generator.  _\bR_\bE_\bP_\bL_\bY is the default variable used
+by  the  _\br_\be_\ba_\bd builtin when no variable names are supplied as
+arguments.  The _\bt_\by_\bp_\be_\bs_\be_\bt builtin is used to define  variables
+and  give them attributes such as readonly.  Bash arithmetic
+allows the evaluation of an expression and the  substitution
+of the result.  Shell variables may be used as operands, and
+the result of an expression may be assigned to  a  variable.
+Nearly  all  of the operators from the C language are avail-
+able, with the same precedence rules:
+\e9     $ echo $((3 + 5 * 32))
+     163
+\e9
+For interactive use, Bash implements ksh-style  aliases  and
+builtins  such  as  _\bf_\bc  (discussed  below)  and  _\bj_\bo_\bb_\bs.  Bash
+aliases allow a string to be substituted for a command name.
+They  can  be  used  to create a mnemonic for a UNIX command
+name (alias del=rm), to expand a single word  to  a  complex
+command (alias news='xterm -g 80x45 -title trn -e trn -e -S1
+-N &'), or to ensure that a command is invoked with a  basic
+set of options (alias ls="/bin/ls -F").
+
+     The C shell (csh)|\b-,  originally  written  by  Bill  Joy
+while  at Berkeley, is widely used and quite popular for its
+interactive facilities.  Bash includes a csh-compatible his-
+tory  expansion  mechanism  ("!  history"), brace expansion,
+access to a stack of directories via the  _\bp_\bu_\bs_\bh_\bd,  _\bp_\bo_\bp_\bd,  and
+_\bd_\bi_\br_\bs  builtins, and tilde expansion, to generate users' home
+directories.  Tilde expansion has also been adopted by  both
+the Korn Shell and POSIX.2.
+
+     There were certain areas in which  POSIX.2  felt  stan-
+dardization  was  necessary,  but no existing implementation
+provided the proper behavior.  The  working  group  invented
+and  standardized  functionality  in these areas, which Bash
+implements.  The _\bc_\bo_\bm_\bm_\ba_\bn_\bd builtin was invented so that  shell
+functions could be written to replace builtins; it makes the
+capabilities of the builtin available to the function.   The
+reserved  word "!" was added to negate the return value of a
+command or pipeline; it was nearly impossible to express "if
+not  x" cleanly using the sh language.  There exist multiple
+incompatible implementations  of  the  _\bt_\be_\bs_\bt  builtin,  which
+tests  files  for  type  and  other  attributes and performs
+arithmetic and string comparisons.  POSIX considered none of
+these  correct,  so  the  standard behavior was specified in
+terms of the number of arguments to  the  command.   POSIX.2
+dictates  exactly  what will happen when four or fewer argu-
+ments are given to _\bt_\be_\bs_\bt, and leaves the  behavior  undefined
+when  more  arguments  are  supplied.  Bash uses the POSIX.2
+_________________________
+|\b-Bill Joy, An Introduction to the C Shell, _\bU_\bN_\bI_\bX  _\bU_\bs_\be_\br'_\bs
+_\bS_\bu_\bp_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\br_\by  _\bD_\bo_\bc_\bu_\bm_\be_\bn_\bt_\bs,  University  of California at
+Berkeley, 1986.
+
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 5 -
+
+
+algorithm, which was conceived by David Korn.
+
+_\b3._\b1.  _\bF_\be_\ba_\bt_\bu_\br_\be_\bs _\bn_\bo_\bt _\bi_\bn _\bt_\bh_\be _\bB_\bo_\bu_\br_\bn_\be _\bS_\bh_\be_\bl_\bl
+
+     There are a number of minor  differences  between  Bash
+and  the  version  of  sh  present on most other versions of
+UNIX.  The majority of these are due to the POSIX  standard,
+but some are the result of Bash adopting features from other
+shells.  For instance, Bash includes the  new  "!"  reserved
+word,  the  _\bc_\bo_\bm_\bm_\ba_\bn_\bd builtin, the ability of the _\br_\be_\ba_\bd builtin
+to correctly return a line ending with a backslash, symbolic
+arguments  to the _\bu_\bm_\ba_\bs_\bk builtin, variable substring removal,
+a way to get the length of a variable, and the new algorithm
+for  the  _\bt_\be_\bs_\bt  builtin  from  the POSIX.2 standard, none of
+which appear in sh.
+
+     Bash also implements the "$(...)" command  substitution
+syntax,  which  supersedes  the  sh  `...`  construct.   The
+"$(...)" construct expands to the output of the command con-
+tained   within  the  parentheses,  with  trailing  newlines
+removed.  The sh syntax is accepted for  backwards  compati-
+bility, but the "$(...)" form is preferred because its quot-
+ing rules are much simpler and it is easier to nest.
+
+     The Bourne shell does  not  provide  such  features  as
+brace  expansion,  the  ability  to  define a variable and a
+function with the same name, local variables in shell  func-
+tions, the ability to enable and disable individual builtins
+or write a function to replace a  builtin,  or  a  means  to
+export a shell function to a child process.
+
+     Bash has closed a long-standing shell security hole  by
+not  using  the $_\bI_\bF_\bS variable to split each word read by the
+shell, but splitting only the results of expansion (ksh  and
+the  4.4  BSD  sh have fixed this as well).  Useful behavior
+such as a means to abort execution of a script read with the
+"."  command  using  the  return  builtin  or  automatically
+exporting variables in the shell's environment  to  children
+is  also  not  present in the Bourne shell.  Bash provides a
+much more powerful environment for both interactive use  and
+programming.
+
+_\b4.  _\bB_\ba_\bs_\bh-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc _\bF_\be_\ba_\bt_\bu_\br_\be_\bs
+
+     This section details a few of the features  which  make
+Bash unique.  Most of them provide improved interactive use,
+but a few programming  improvements  are  present  as  well.
+Full descriptions of these features can be found in the Bash
+documentation.
+
+_\b4._\b1.  _\bS_\bt_\ba_\br_\bt_\bu_\bp _\bF_\bi_\bl_\be_\bs
+
+     Bash executes  startup  files  differently  than  other
+shells.   The  Bash behavior is a compromise between the csh
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 6 -
+
+
+principle of startup files with  fixed  names  executed  for
+each shell and the sh "minimalist" behavior.  An interactive
+instance of Bash started as a login shell reads and executes
+~/._\bb_\ba_\bs_\bh__\bp_\br_\bo_\bf_\bi_\bl_\be  (the  file .bash_profile in the user's home
+directory), if it exists.  An  interactive  non-login  shell
+reads  and executes ~/._\bb_\ba_\bs_\bh_\br_\bc.  A non-interactive shell (one
+begun to execute a shell script, for example) reads no fixed
+startup  file,  but  uses the value of the variable $_\bE_\bN_\bV, if
+set, as the name of a startup file.   The  ksh  practice  of
+reading  $_\bE_\bN_\bV  for every shell, with the accompanying diffi-
+culty of defining the proper  variables  and  functions  for
+interactive  and  non-interactive  shells or having the file
+read only for interactive shells, was  considered  too  com-
+plex.   Ease  of  use won out here.  Interestingly, the next
+release of ksh will change to reading $_\bE_\bN_\bV only for interac-
+tive shells.
+
+_\b4._\b2.  _\bN_\be_\bw _\bB_\bu_\bi_\bl_\bt_\bi_\bn _\bC_\bo_\bm_\bm_\ba_\bn_\bd_\bs
+
+     There are a few builtins which are  new  or  have  been
+extended  in  Bash.   The _\be_\bn_\ba_\bb_\bl_\be builtin allows builtin com-
+mands to be turned on and off arbitrarily.  To use the  ver-
+sion  of  _\be_\bc_\bh_\bo found in a user's search path rather than the
+Bash builtin, enable -n echo  suffices.   The  _\bh_\be_\bl_\bp  builtin
+provides  quick  synopses  of  the  shell facilities without
+requiring access to a manual page.  _\bB_\bu_\bi_\bl_\bt_\bi_\bn  is  similar  to
+_\bc_\bo_\bm_\bm_\ba_\bn_\bd  in  that  it  bypasses shell functions and directly
+executes builtin commands.  Access to a csh-style  stack  of
+directories  is provided via the _\bp_\bu_\bs_\bh_\bd, _\bp_\bo_\bp_\bd, and _\bd_\bi_\br_\bs buil-
+tins.  _\bP_\bu_\bs_\bh_\bd and _\bp_\bo_\bp_\bd insert and remove directories from the
+stack,  respectively, and _\bd_\bi_\br_\bs lists the stack contents.  On
+systems that allow fine-grained control  of  resources,  the
+_\bu_\bl_\bi_\bm_\bi_\bt  builtin  can be used to tune these settings.  _\bU_\bl_\bi_\bm_\bi_\bt
+allows a user to control, among other things,  whether  core
+dumps  are  to  be generated, how much memory the shell or a
+child process is allowed to allocate, and how large  a  file
+created  by  a  child process can grow.  The _\bs_\bu_\bs_\bp_\be_\bn_\bd command
+will stop the shell process when job control is active; most
+other  shells  do  not  allow  themselves to be stopped like
+that.  _\bT_\by_\bp_\be, the Bash answer to _\bw_\bh_\bi_\bc_\bh and _\bw_\bh_\be_\bn_\bc_\be, shows what
+will happen when a word is typed as a command:
+\e9     $ type export
+     export is a shell builtin
+     $ type -t export
+     builtin
+     $ type bash
+     bash is /bin/bash
+     $ type cd
+     cd is a function
+     cd ()
+     {
+         builtin cd ${1+"$@"} && xtitle $HOST: $PWD
+     }
+\e9
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 7 -
+
+
+Various modes tell what a command word  is  (reserved  word,
+alias,  function,  builtin,  or  file) or which version of a
+command will be executed based  on  a  user's  search  path.
+Some  of  this functionality has been adopted by POSIX.2 and
+folded into the _\bc_\bo_\bm_\bm_\ba_\bn_\bd utility.
+
+_\b4._\b3.  _\bE_\bd_\bi_\bt_\bi_\bn_\bg _\ba_\bn_\bd _\bC_\bo_\bm_\bp_\bl_\be_\bt_\bi_\bo_\bn
+
+     One area in which Bash shines is command line  editing.
+Bash  uses  the _\br_\be_\ba_\bd_\bl_\bi_\bn_\be library to read and edit lines when
+interactive.  Readline is  a  powerful  and  flexible  input
+facility that a user can configure to individual tastes.  It
+allows lines to be edited using either emacs or vi commands,
+where  those  commands are appropriate.  The full capability
+of emacs is not present - there is no way to execute a named
+command  with  M-x, for instance - but the existing commands
+are more than adequate.  The vi mode is compliant  with  the
+command line editing standardized by POSIX.2.
+
+     Readline is fully customizable.   In  addition  to  the
+basic commands and key bindings, the library allows users to
+define additional key bindings using a  startup  file.   The
+_\bi_\bn_\bp_\bu_\bt_\br_\bc file, which defaults to the file ~/._\bi_\bn_\bp_\bu_\bt_\br_\bc, is read
+each time readline initializes, permitting users to maintain
+a  consistent  interface across a set of programs.  Readline
+includes an extensible interface, so each program using  the
+library  can  add  its  own  bindable  commands and program-
+specific key bindings.  Bash uses this facility to add bind-
+ings that perform history expansion or shell word expansions
+on the current input line.
+
+     Readline interprets a number of variables which further
+tune  its  behavior.   Variables exist to control whether or
+not eight-bit characters are directly read as input or  con-
+verted  to  meta-prefixed key sequences (a meta-prefixed key
+sequence consists of  the  character  with  the  eighth  bit
+zeroed,  preceded  by  the  _\bm_\be_\bt_\ba-_\bp_\br_\be_\bf_\bi_\bx  character,  usually
+escape,  which  selects  an  alternate  keymap),  to  decide
+whether  to  output  characters  with  the  eighth  bit  set
+directly or as a meta-prefixed key sequence, whether or  not
+to  wrap  to  a  new screen line when a line being edited is
+longer than the screen width, the keymap to which subsequent
+key  bindings  should apply, or even what happens when read-
+line wants to ring the terminal's bell.  All of these  vari-
+ables can be set in the inputrc file.
+
+     The startup file understands a set of  C  preprocessor-
+like  conditional  constructs  which  allow variables or key
+bindings to be assigned based on the application using read-
+line,  the  terminal  currently  being  used, or the editing
+mode.  Users can add program-specific bindings to make their
+lives easier:  I have bindings that let me edit the value of
+$_\bP_\bA_\bT_\bH and double-quote the current or previous word:
+\e9     # Macros that are convenient for shell interaction
+
+
+\e9                      October 28, 1994
+
+
+
+
+
+                           - 8 -
+
+
+     $if Bash
+     # edit the path
+     "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+     # prepare to type a quoted word -- insert open and close double
+     # quotes and move to just after the open quote
+     "\C-x\"": "\"\"\C-b"
+     # Quote the current or previous word
+     "\C-xq": "\eb\"\ef\""
+     $endif
+\e9
+There is a readline command to re-read the  file,  so  users
+can  edit  the  file, change some bindings, and begin to use
+them almost immediately.
+
+     Bash implements the _\bb_\bi_\bn_\bd builtin for more  dyamic  con-
+trol  of  readline  than  the startup file permits.  _\bB_\bi_\bn_\bd is
+used in several ways.  In _\bl_\bi_\bs_\bt  mode,  it  can  display  the
+current  key  bindings, list all the readline editing direc-
+tives available for binding, list which keys invoke a  given
+directive,  or  output  the current set of key bindings in a
+format that can be incorporated  directly  into  an  inputrc
+file.   In  _\bb_\ba_\bt_\bc_\bh  mode,  it  reads a series of key bindings
+directly from a file and passes them to  readline.   In  its
+most  common usage, _\bb_\bi_\bn_\bd takes a single string and passes it
+directly to readline, which interprets the line as if it had
+just been read from the inputrc file.  Both key bindings and
+variable assignments may appear in the string given to _\bb_\bi_\bn_\bd.
+
+     The readline library also  provides  an  interface  for
+_\bw_\bo_\br_\bd  _\bc_\bo_\bm_\bp_\bl_\be_\bt_\bi_\bo_\bn.   When  the  _\bc_\bo_\bm_\bp_\bl_\be_\bt_\bi_\bo_\bn character (usually
+TAB) is typed, readline looks at the  word  currently  being
+entered  and  computes  the  set  of  filenames of which the
+current word is a valid prefix.  If there is only one possi-
+ble  completion,  the  rest  of  the characters are inserted
+directly,  otherwise  the  common  prefix  of  the  set   of
+filenames  is added to the current word.  A second TAB char-
+acter entered  immediately  after  a  non-unique  completion
+causes  readline  to list the possible completions; there is
+an option to have the list displayed immediately.   Readline
+provides  hooks  so  that  applications can provide specific
+types of completion before the default  filename  completion
+is attempted.  This is quite flexible, though it is not com-
+pletely user-programmable.  Bash, for example, can  complete
+filenames, command names (including aliases, builtins, shell
+reserved words, shell functions, and  executables  found  in
+the file system), shell variables, usernames, and hostnames.
+It uses a set of heuristics that, while not perfect, is gen-
+erally  quite good at determining what type of completion to
+attempt.
+
+_\b4._\b4.  _\bH_\bi_\bs_\bt_\bo_\br_\by
+
+     Access to the list of commands previously entered  (the
+_\bc_\bo_\bm_\bm_\ba_\bn_\bd  _\bh_\bi_\bs_\bt_\bo_\br_\by)  is  provided  jointly  by  Bash  and  the
+
+
+\e9                      October 28, 1994
+
+
+
+
+
+                           - 9 -
+
+
+readline  library.   Bash  provides  variables   ($HISTFILE,
+$HISTSIZE, and $HISTCONTROL) and the _\bh_\bi_\bs_\bt_\bo_\br_\by and _\bf_\bc builtins
+to manipulate the history  list.   The  value  of  $_\bH_\bI_\bS_\bT_\bF_\bI_\bL_\bE
+specifes  the  file where Bash writes the command history on
+exit and reads it on startup.  $_\bH_\bI_\bS_\bT_\bS_\bI_\bZ_\bE is  used  to  limit
+the  number  of commands saved in the history.  $_\bH_\bI_\bS_\bT_\bC_\bO_\bN_\bT_\bR_\bO_\bL
+provides a crude form of control  over  which  commands  are
+saved  on  the history list: a value of _\bi_\bg_\bn_\bo_\br_\be_\bs_\bp_\ba_\bc_\be means to
+not save commands which begin  with  a  space;  a  value  of
+_\bi_\bg_\bn_\bo_\br_\be_\bd_\bu_\bp_\bs  means to not save commands identical to the last
+command saved.  $HISTCONTROL was named  $history_control  in
+earlier versions of Bash; the old name is still accepted for
+backwards compatibility.  The _\bh_\bi_\bs_\bt_\bo_\br_\by command  can  read  or
+write  files  containing  the  history  list and display the
+current list contents.  The _\bf_\bc builtin, adopted from POSIX.2
+and  the  Korn  Shell, allows display and re-execution, with
+optional editing, of commands from the  history  list.   The
+readline library offers a set of commands to search the his-
+tory list for a portion of  the  current  input  line  or  a
+string  typed  by  the  user.  Finally, the _\bh_\bi_\bs_\bt_\bo_\br_\by library,
+generally incorporated directly into the  readline  library,
+implements  a  facility  for  history recall, expansion, and
+re-execution of previous commands very similar to csh ("bang
+history", so called because the exclamation point introduces
+a history substitution):
+\e9     $ echo a b c d e
+     a b c d e
+     $ !! f g h i
+     echo a b c d e f g h i
+     a b c d e f g h i
+     $ !-2
+     echo a b c d e
+     a b c d e
+     $ echo !-2:1-4
+     echo a b c d
+     a b c d
+\e9
+The command history is only saved when the shell is interac-
+tive, so it is not available for use by shell scripts.
+
+_\b4._\b5.  _\bN_\be_\bw _\bS_\bh_\be_\bl_\bl _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs
+
+     There are a number of convenience variables  that  Bash
+interprets  to  make  life  easier.   These include _\bF_\bI_\bG_\bN_\bO_\bR_\bE,
+which is a set of filename  suffixes  identifying  files  to
+exclude   when  completing  filenames;  _\bH_\bO_\bS_\bT_\bT_\bY_\bP_\bE,  which  is
+automatically  set  to  a  string  describing  the  type  of
+hardware    on    which   Bash   is   currently   executing;
+_\bc_\bo_\bm_\bm_\ba_\bn_\bd__\bo_\br_\bi_\be_\bn_\bt_\be_\bd__\bh_\bi_\bs_\bt_\bo_\br_\by, which directs  Bash  to  save  all
+lines of a multiple-line command such as a _\bw_\bh_\bi_\bl_\be or _\bf_\bo_\br loop
+in a single history entry,  allowing  easy  re-editing;  and
+_\bI_\bG_\bN_\bO_\bR_\bE_\bE_\bO_\bF,  whose  value indicates the number of consecutive
+EOF characters that an interactive shell  will  read  before
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 10 -
+
+
+exiting - an easy way to keep yourself from being logged out
+accidentally.  The _\ba_\bu_\bt_\bo__\br_\be_\bs_\bu_\bm_\be variable alters the  way  the
+shell treats simple command names: if job control is active,
+and  this  variable  is  set,  single-word  simple  commands
+without  redirections  cause the shell to first look for and
+restart a suspended job with that name before starting a new
+process.
+
+_\b4._\b6.  _\bB_\br_\ba_\bc_\be _\bE_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn
+
+     Since sh offers no convenient way to generate arbitrary
+strings  that  share  a  common  prefix  or suffix (filename
+expansion requires that the filenames  exist),  Bash  imple-
+ments  _\bb_\br_\ba_\bc_\be  _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn,  a  capability  picked up from csh.
+Brace expansion is similar to filename  expansion,  but  the
+strings  generated need not correspond to existing files.  A
+brace expression consists of an optional _\bp_\br_\be_\ba_\bm_\bb_\bl_\be,  followed
+by  a  pair  of braces enclosing a series of comma-separated
+strings,  and  an  optional  _\bp_\bo_\bs_\bt_\ba_\bm_\bb_\bl_\be.   The  preamble   is
+prepended  to each string within the braces, and the postam-
+ble is then appended to each resulting string:
+\e9     $ echo a{d,c,b}e
+     ade ace abe
+\e9
+As this example demonstrates, the results of brace expansion
+are not sorted, as they are by filename expansion.
+
+_\b4._\b7.  _\bP_\br_\bo_\bc_\be_\bs_\bs _\bS_\bu_\bb_\bs_\bt_\bi_\bt_\bu_\bt_\bi_\bo_\bn
+
+     On systems that can support it, Bash provides a  facil-
+ity  known as _\bp_\br_\bo_\bc_\be_\bs_\bs _\bs_\bu_\bb_\bs_\bt_\bi_\bt_\bu_\bt_\bi_\bo_\bn.  Process substitution is
+similar to command substitution in  that  its  specification
+includes  a  command to execute, but the shell does not col-
+lect the command's output and insert  it  into  the  command
+line.   Rather,  Bash  opens a pipe to the command, which is
+run in the background.  The shell uses named  pipes  (FIFOs)
+or  the  /_\bd_\be_\bv/_\bf_\bd  method  of naming open files to expand the
+process substitution to a filename  which  connects  to  the
+pipe  when  opened.  This filename becomes the result of the
+expansion.  Process substitution can be used to compare  the
+outputs  of two different versions of an application as part
+of a regression test:
+\e9     $ cmp <(old_prog) <(new_prog)
+\e9
+_\b4._\b8.  _\bP_\br_\bo_\bm_\bp_\bt _\bC_\bu_\bs_\bt_\bo_\bm_\bi_\bz_\ba_\bt_\bi_\bo_\bn
+
+     One of the more popular interactive features that  Bash
+provides  is the ability to customize the prompt.  Both $_\bP_\bS_\b1
+and $_\bP_\bS_\b2, the primary and secondary  prompts,  are  expanded
+before being displayed.  Parameter and variable expansion is
+performed when the prompt string is expanded, so  any  shell
+variable  can  be  put  into the prompt (e.g., $_\bS_\bH_\bL_\bV_\bL, which
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 11 -
+
+
+indicates how deeply the current  shell  is  nested).   Bash
+specially  interprets  characters  in the prompt string pre-
+ceded by a backslash.  Some of these backslash  escapes  are
+replaced  with the current time, the date, the current work-
+ing directory, the username, and the command number or  his-
+tory  number  of the command being entered.  There is even a
+backslash escape to cause the shell  to  change  its  prompt
+when running as root after an _\bs_\bu.  Before printing each pri-
+mary prompt, Bash expands the variable $_\bP_\bR_\bO_\bM_\bP_\bT__\bC_\bO_\bM_\bM_\bA_\bN_\bD  and,
+if it has a value, executes the expanded value as a command,
+allowing additional prompt customization.  For example, this
+assignment  causes  the  current user, the current host, the
+time, the last component of the current  working  directory,
+the  level  of  shell nesting, and the history number of the
+current command to be embedded into the primary prompt:
+\e9     $ PS1='\u@\h [\t] \W($SHLVL:\!)\$ '
+     chet@odin [21:03:44] documentation(2:636)$ cd ..
+     chet@odin [21:03:54] src(2:637)$
+\e9
+The string being assigned is surrounded by single quotes  so
+that  if it is exported, the value of $_\bS_\bH_\bL_\bV_\bL will be updated
+by a child shell:
+\e9     chet@odin [21:17:35] src(2:638)$ export PS1
+     chet@odin [21:17:40] src(2:639)$ bash
+     chet@odin [21:17:46] src(3:696)$
+\e9
+The \$ escape is displayed as "$" when running as  a  normal
+user, but as "#" when running as root.
+
+_\b4._\b9.  _\bF_\bi_\bl_\be _\bS_\by_\bs_\bt_\be_\bm _\bV_\bi_\be_\bw_\bs
+
+     Since Berkeley introduced symbolic links  in  4.2  BSD,
+one of their most annoying properties has been the "warping"
+to a completely different area of the file system when using
+_\bc_\bd,  and  the  resultant  non-intuitive behavior of "cd ..".
+The UNIX kernel treats symbolic links _\bp_\bh_\by_\bs_\bi_\bc_\ba_\bl_\bl_\by.  When  the
+kernel is translating a pathname in which one component is a
+symbolic link, it replaces all or part of the pathname while
+processing  the  link.  If the contents of the symbolic link
+begin  with  a  slash,  the  kernel  replaces  the  pathname
+entirely; if not, the link contents replace the current com-
+ponent.  In either case, the symbolic link is  visible.   If
+the  link value is an absolute pathname, the user finds him-
+self in a completely different part of the file system.
+
+     Bash provides a _\bl_\bo_\bg_\bi_\bc_\ba_\bl view of the  file  system.   In
+this default mode, command and filename completion and buil-
+tin commands such as _\bc_\bd and _\bp_\bu_\bs_\bh_\bd which change  the  current
+working  directory transparently follow symbolic links as if
+they were directories.  The $_\bP_\bW_\bD variable, which  holds  the
+shell's  idea  of  the current working directory, depends on
+the path  used  to  reach  the  directory  rather  than  its
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 12 -
+
+
+physical  location  in the local file system hierarchy.  For
+example:
+\e9     $ cd /usr/local/bin
+     $ echo $PWD
+     /usr/local/bin
+     $ pwd
+     /usr/local/bin
+     $ /bin/pwd
+     /net/share/sun4/local/bin
+     $ cd ..
+     $ pwd
+     /usr/local
+     $ /bin/pwd
+     /net/share/sun4/local
+     $ cd ..
+     $ pwd
+     /usr
+     $ /bin/pwd
+     /usr
+\e9
+One problem with this, of course, arises when programs  that
+do  not  understand  the  shell's logical notion of the file
+system interpret ".." differently.  This  generally  happens
+when Bash completes filenames containing ".." according to a
+logical hierarchy which does not correspond to their  physi-
+cal  location.  For  users  who  find  this  troublesome,  a
+corresponding _\bp_\bh_\by_\bs_\bi_\bc_\ba_\bl view of the file system is available:
+\e9     $ cd /usr/local/bin
+     $ pwd
+     /usr/local/bin
+     $ set -o physical
+     $ pwd
+     /net/share/sun4/local/bin
+\e9
+_\b4._\b1_\b0.  _\bI_\bn_\bt_\be_\br_\bn_\ba_\bt_\bi_\bo_\bn_\ba_\bl_\bi_\bz_\ba_\bt_\bi_\bo_\bn
+
+     One of the most  significant  improvements  in  version
+1.13  of  Bash  was  the  change to "eight-bit cleanliness".
+Previous versions used the eighth bit of characters to  mark
+whether  or not they were quoted when performing word expan-
+sions.  While this did not affect  the  majority  of  users,
+most  of  whom  used  only  seven-bit ASCII characters, some
+found it  confining.   Beginning  with  version  1.13,  Bash
+implemented a different quoting mechanism that did not alter
+the eighth bit of characters.  This allowed Bash to  manipu-
+late  files  with  "odd"  characters in their names, but did
+nothing to help users enter those  names,  so  version  1.13
+introduced  changes to readline that made it eight-bit clean
+as well.  Options exist that force  readline  to  attach  no
+special  significance  to characters with the eighth bit set
+(the default behavior is  to  convert  these  characters  to
+meta-prefixed  key sequences) and to output these characters
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 13 -
+
+
+without  conversion  to  meta-prefixed   sequences.    These
+changes, along with the expansion of keymaps to a full eight
+bits, enable readline to work with most of the ISO-8859 fam-
+ily of character sets, used by many European countries.
+
+_\b4._\b1_\b1.  _\bP_\bO_\bS_\bI_\bX _\bM_\bo_\bd_\be
+
+     Although Bash is intended  to  be  POSIX.2  conformant,
+there  are areas in which the default behavior is not compa-
+tible with the standard.  For users who wish to operate in a
+strict  POSIX.2  environment,  Bash implements a _\bP_\bO_\bS_\bI_\bX _\bm_\bo_\bd_\be.
+When this mode is active, Bash modifies its  default  opera-
+tion  where  it  differs from POSIX.2 to match the standard.
+POSIX mode is entered when Bash is started with  the  -_\bp_\bo_\bs_\bi_\bx
+option.   This feature is also available as an option to the
+set builtin, set -o posix.  For compatibility with other GNU
+software  that  attempts  to be POSIX.2 compliant, Bash also
+enters POSIX mode if the variable  $_\bP_\bO_\bS_\bI_\bX_\bL_\bY__\bC_\bO_\bR_\bR_\bE_\bC_\bT  is  set
+when  Bash  is started or assigned a value during execution.
+$_\bP_\bO_\bS_\bI_\bX__\bP_\bE_\bD_\bA_\bN_\bT_\bI_\bC is accepted as well, to be  compatible  with
+some  older  GNU  utilities.   When Bash is started in POSIX
+mode, for example, it sources the file named by the value of
+$_\bE_\bN_\bV  rather  than  the "normal" startup files, and does not
+allow reserved words to be aliased.
+
+_\b5.  _\bN_\be_\bw _\bF_\be_\ba_\bt_\bu_\br_\be_\bs _\ba_\bn_\bd _\bF_\bu_\bt_\bu_\br_\be _\bP_\bl_\ba_\bn_\bs
+
+     There are several features introduced  in  the  current
+version of Bash, version 1.14, and a number under considera-
+tion for future releases.  This section will briefly  detail
+the  new  features  in  version  1.14  and  describe several
+features that may appear in later versions.
+
+_\b5._\b1.  _\bN_\be_\bw _\bF_\be_\ba_\bt_\bu_\br_\be_\bs _\bi_\bn _\bB_\ba_\bs_\bh-_\b1._\b1_\b4
+
+     The new features available in Bash-1.14 answer  several
+of the most common requests for enhancements.  Most notably,
+there is a mechanism  for  including  non-visible  character
+sequences  in  prompts, such as those which cause a terminal
+to print characters in different colors or in standout mode.
+There  was  nothing preventing the use of these sequences in
+earlier  versions,  but  the  readline  redisplay  algorithm
+assumed  each  character  occupied physical screen space and
+would wrap lines prematurely.
+
+     Readline has a few new variables, several new  bindable
+commands,  and  some additional emacs mode default key bind-
+ings.  A new history search mode has  been  implemented:  in
+this mode, readline searches the history for lines beginning
+with the characters between the  beginning  of  the  current
+line  and  the  cursor.   The  existing readline incremental
+search commands no longer match identical  lines  more  than
+once.   Filename  completion now expands variables in direc-
+tory names.  The history expansion facilities are now nearly
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 14 -
+
+
+completely csh-compatible: missing modifiers have been added
+and history substitution has been extended.
+
+     Several of the features described earlier, such as  _\bs_\be_\bt
+-_\bo  _\bp_\bo_\bs_\bi_\bx  and  $_\bP_\bO_\bS_\bI_\bX__\bP_\bE_\bD_\bA_\bN_\bT_\bI_\bC,  are  new  in version 1.14.
+There is a new shell variable, _\bO_\bS_\bT_\bY_\bP_\bE, to which Bash assigns
+a  value that identifies the version of UNIX it's running on
+(great for putting architecture-specific binary  directories
+into the $PATH).  Two variables have been renamed: $_\bH_\bI_\bS_\bT_\bC_\bO_\bN_\b-
+_\bT_\bR_\bO_\bL  replaces  $_\bh_\bi_\bs_\bt_\bo_\br_\by__\bc_\bo_\bn_\bt_\br_\bo_\bl,  and  $_\bH_\bO_\bS_\bT_\bF_\bI_\bL_\bE   replaces
+$_\bh_\bo_\bs_\bt_\bn_\ba_\bm_\be__\bc_\bo_\bm_\bp_\bl_\be_\bt_\bi_\bo_\bn__\bf_\bi_\bl_\be.  In both cases, the old names are
+accepted for backwards compatibility.  The ksh  _\bs_\be_\bl_\be_\bc_\bt  con-
+struct,  which  allows  the  generation of simple menus, has
+been implemented.   New  capabilities  have  been  added  to
+existing  variables:  $_\ba_\bu_\bt_\bo__\br_\be_\bs_\bu_\bm_\be  can  now  take values of
+_\be_\bx_\ba_\bc_\bt or _\bs_\bu_\bb_\bs_\bt_\br_\bi_\bn_\bg, and $_\bH_\bI_\bS_\bT_\bC_\bO_\bN_\bT_\bR_\bO_\bL understands  the  value
+_\bi_\bg_\bn_\bo_\br_\be_\bb_\bo_\bt_\bh,  which  combines  the  two previously acceptable
+values.  The _\bd_\bi_\br_\bs builtin has acquired options to print  out
+specific members of the directory stack.  The $_\bn_\bo_\bl_\bi_\bn_\bk_\bs vari-
+able, which forces a physical view of the file  system,  has
+been  superseded  by  the  -_\bP  option  to  the  _\bs_\be_\bt  builtin
+(equivalent to set -o physical); the  variable  is  retained
+for  backwards  compatibility.  The version string contained
+in $_\bB_\bA_\bS_\bH__\bV_\bE_\bR_\bS_\bI_\bO_\bN now includes an  indication  of  the  patch
+level  as  well  as  the  "build version".  Some little-used
+features have been removed:  the _\bb_\by_\be synonym  for  _\be_\bx_\bi_\bt  and
+the  $_\bN_\bO__\bP_\bR_\bO_\bM_\bP_\bT__\bV_\bA_\bR_\bS  variable  are  gone.   There is now an
+organized test suite that can be run as  a  regression  test
+when building a new version of Bash.
+
+     The documentation has been thoroughly overhauled: there
+is  a  new  manual page on the readline library and the _\bi_\bn_\bf_\bo
+file has been updated to reflect the  current  version.   As
+always,  as  many bugs as possible have been fixed, although
+some surely remain.
+
+_\b5._\b2.  _\bO_\bt_\bh_\be_\br _\bF_\be_\ba_\bt_\bu_\br_\be_\bs
+
+     There are a few features that  I  hope  to  include  in
+later Bash releases.  Some are based on work already done in
+other shells.
+
+     In addition to simple variables, a  future  release  of
+Bash  will  include  one-dimensional  arrays,  using the ksh
+implementation of arrays as a model.  Additions to  the  ksh
+syntax,  such  as  _\bv_\ba_\br_\bn_\ba_\bm_\be=( ... ) to assign a list of words
+directly to an array and a mechanism to allow the _\br_\be_\ba_\bd buil-
+tin  to  read a list of values directly into an array, would
+be desirable.  Given those extensions, the ksh _\bs_\be_\bt -_\bA syntax
+may not be worth supporting (the -_\bA option assigns a list of
+values to an array, but is a rather peculiar special case).
+
+     Some shells include a means of _\bp_\br_\bo_\bg_\br_\ba_\bm_\bm_\ba_\bb_\bl_\be  word  com-
+pletion, where the user specifies on a per-command basis how
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 15 -
+
+
+the arguments of the command are to be treated when  comple-
+tion  is  attempted:  as  filenames,  hostnames,  executable
+files, and so on.  The other aspects  of  the  current  Bash
+implementation  could  remain as-is; the existing heuristics
+would still be valid.  Only when completing the arguments to
+a  simple  command  would  the programmable completion be in
+effect.
+
+     It would also be nice to give  the  user  finer-grained
+control over which commands are saved onto the history list.
+One proposal is for a variable,  tentatively  named  _\bH_\bI_\bS_\bT_\bI_\bG_\b-
+_\bN_\bO_\bR_\bE,  which  would  contain  a colon-separated list of com-
+mands.  Lines beginning with these commands, after the  res-
+trictions  of  $_\bH_\bI_\bS_\bT_\bC_\bO_\bN_\bT_\bR_\bO_\bL  have been applied, would not be
+placed onto the history list.   The  shell  pattern-matching
+capabilities  could  also  be  available when specifying the
+contents of $_\bH_\bI_\bS_\bT_\bI_\bG_\bN_\bO_\bR_\bE.
+
+     One thing that newer shells such as _\bw_\bk_\bs_\bh (also known as
+_\bd_\bt_\bk_\bs_\bh)  provide is a command to dynamically load code imple-
+menting additional builtin commands into  a  running  shell.
+This new builtin would take an object file or shared library
+implementing the "body" of the  builtin  (_\bx_\bx_\bx__\bb_\bu_\bi_\bl_\bt_\bi_\bn()  for
+those familiar with Bash internals) and a structure contain-
+ing the name of the new command, the function to  call  when
+the new builtin is invoked (presumably defined in the shared
+object specified as an argument), and the  documentation  to
+be  printed  by  the  _\bh_\be_\bl_\bp  command (possibly present in the
+shared object as well).  It  would  manage  the  details  of
+extending the internal table of builtins.
+
+     A few other builtins would also be desirable:  two  are
+the POSIX.2 _\bg_\be_\bt_\bc_\bo_\bn_\bf command, which prints the values of sys-
+tem configuration variables defined by POSIX.2, and a _\bd_\bi_\bs_\bo_\bw_\bn
+builtin,  which  causes  a  shell  running  with job control
+active to "forget about" one or more background jobs in  its
+internal  jobs  table.   Using  _\bg_\be_\bt_\bc_\bo_\bn_\bf, for example, a user
+could retrieve a value for $_\bP_\bA_\bT_\bH guaranteed to find  all  of
+the POSIX standard utilities, or find out how long filenames
+may be in the file system containing a specified directory.
+
+     There are no implementation timetables for any of these
+features,  nor are there concrete plans to include them.  If
+anyone has comments on these proposals, feel free to send me
+electronic mail.
+
+_\b6.  _\bR_\be_\bf_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bs _\ba_\bn_\bd _\bL_\be_\bs_\bs_\bo_\bn_\bs _\bL_\be_\ba_\br_\bn_\be_\bd
+
+     The lesson that has been  repeated  most  often  during
+Bash  development  is  that  there  are  dark corners in the
+Bourne shell, and people use all of them.  In  the  original
+description of the Bourne shell, quoting and the shell gram-
+mar are both poorly  specified  and  incomplete;  subsequent
+descriptions have not helped much.  The grammar presented in
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 16 -
+
+
+Bourne's paper describing the  shell  distributed  with  the
+Seventh  Edition  of  UNIX|\b-  is  so far off that it does not
+allow the command who|wc.  In fact, as Tom Duff states:
+
+     Nobody really knows what the Bourne shell's  gram-
+     mar  is.   Even  examination of the source code is
+     little help.|\b=
+
+The POSIX.2 standard includes  a  _\by_\ba_\bc_\bc  grammar  that  comes
+close  to  capturing  the  Bourne  shell's  behavior, but it
+disallows some constructs which sh accepts without complaint
+-  and there are scripts out there that use them.  It took a
+few versions and several bug reports before Bash implemented
+sh-compatible  quoting,  and there are still some "legal" sh
+constructs which Bash flags as syntax errors.   Complete  sh
+compatibility is a tough nut.
+
+     The shell is bigger  and  slower  than  I  would  like,
+though the current version is substantially faster than pre-
+viously.  The readline library  could  stand  a  substantial
+rewrite.   A  hand-written  parser  to  replace  the current
+_\by_\ba_\bc_\bc-generated one would probably result in a  speedup,  and
+would solve one glaring problem:  the shell could parse com-
+mands in "$(...)" constructs as  they  are  entered,  rather
+than reporting errors when the construct is expanded.
+
+     As always, there is some chaff to go  with  the  wheat.
+Areas  of  duplicated  functionality  need to be cleaned up.
+There are several cases where Bash treats  a  variable  spe-
+cially   to   enable  functionality  available  another  way
+($notify vs.  set -o notify and $nolinks vs. set  -o  physi-
+cal,  for  instance);  the special treatment of the variable
+name should probably be removed.  A few  more  things  could
+stand    removal;    the    $_\ba_\bl_\bl_\bo_\bw__\bn_\bu_\bl_\bl__\bg_\bl_\bo_\bb__\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn   and
+$_\bg_\bl_\bo_\bb__\bd_\bo_\bt__\bf_\bi_\bl_\be_\bn_\ba_\bm_\be_\bs variables are of particularly  question-
+able  value.   The  $[...]  arithmetic  evaluation syntax is
+redundant now that the POSIX-mandated $((...)) construct has
+been implemented, and could be deleted.  It would be nice if
+the text output by the _\bh_\be_\bl_\bp builtin  were  external  to  the
+shell rather than compiled into it.  The behavior enabled by
+$_\bc_\bo_\bm_\bm_\ba_\bn_\bd__\bo_\br_\bi_\be_\bn_\bt_\be_\bd__\bh_\bi_\bs_\bt_\bo_\br_\by, which causes the shell to attempt
+to  save  all lines of a multi-line command in a single his-
+tory entry, should be made  the  default  and  the  variable
+removed.
+
+
+_________________________
+|\b-S. R. Bourne, "UNIX  Time-Sharing  System:   The  UNIX
+Shell",  _\bB_\be_\bl_\bl  _\bS_\by_\bs_\bt_\be_\bm  _\bT_\be_\bc_\bh_\bn_\bi_\bc_\ba_\bl  _\bJ_\bo_\bu_\br_\bn_\ba_\bl, 57(6), July-
+August, 1978, pp. 1971-1990.
+|\b=Tom Duff, "Rc - A Shell for Plan 9 and UNIX  systems",
+_\bP_\br_\bo_\bc. _\bo_\bf _\bt_\bh_\be _\bS_\bu_\bm_\bm_\be_\br _\b1_\b9_\b9_\b0 _\bE_\bU_\bU_\bG _\bC_\bo_\bn_\bf_\be_\br_\be_\bn_\bc_\be, London, July,
+1990, pp. 21-33.
+
+
+
+
+                      October 28, 1994
+
+
+
+
+
+                           - 17 -
+
+
+_\b7.  _\bA_\bv_\ba_\bi_\bl_\ba_\bb_\bi_\bl_\bi_\bt_\by
+
+     As with all other GNU software, Bash is  available  for
+anonymous  FTP  from _\bp_\br_\be_\bp._\ba_\bi._\bm_\bi_\bt._\be_\bd_\bu:/_\bp_\bu_\bb/_\bg_\bn_\bu and from other
+GNU software mirror sites.  The current version is in  _\bb_\ba_\bs_\bh-
+_\b1._\b1_\b4._\b1._\bt_\ba_\br._\bg_\bz  in  that  directory.   Use _\ba_\br_\bc_\bh_\bi_\be to find the
+nearest archive site.  The latest version is  always  avail-
+able  for FTP from _\bb_\ba_\bs_\bh._\bC_\bW_\bR_\bU._\bE_\bd_\bu:/_\bp_\bu_\bb/_\bd_\bi_\bs_\bt.  Bash documenta-
+tion is available for FTP from _\bb_\ba_\bs_\bh._\bC_\bW_\bR_\bU._\bE_\bd_\bu:/_\bp_\bu_\bb/_\bb_\ba_\bs_\bh.
+
+     The Free Software Foundation sells  tapes  and  CD-ROMs
+containing Bash; send electronic mail to gnu@prep.ai.mit.edu
+or call +1-617-876-3296 for more information.
+
+     Bash is  also  distributed  with  several  versions  of
+UNIX-compatible  systems.   It  is  included  as /bin/sh and
+/bin/bash on several Linux  distributions  (more  about  the
+difference  in  a  moment),  and  as contributed software in
+BSDI's BSD/386* and FreeBSD.
+
+     The Linux distribution deserves special mention.  There
+are two configurations included in the standard Bash distri-
+bution: a "normal" configuration, in which all of the  stan-
+dard  features  are included, and a "minimal" configuration,
+which omits job control, aliases, history and  command  line
+editing,  the  directory  stack and _\bp_\bu_\bs_\bh_\bd/_\bp_\bo_\bp_\bd/_\bd_\bi_\br_\bs, process
+substitution, prompt string special character decoding,  and
+the  _\bs_\be_\bl_\be_\bc_\bt  construct.  This minimal version is designed to
+be a drop-in replacement for the traditional  UNIX  /bin/sh,
+and is included as the Linux /bin/sh in several packagings.
+
+_\b8.  _\bC_\bo_\bn_\bc_\bl_\bu_\bs_\bi_\bo_\bn
+
+     Bash is a worthy successor to sh.  It  is  sufficiently
+portable to run on nearly every version of UNIX from 4.3 BSD
+to SVR4.2, and several UNIX workalikes.  It is robust enough
+to  replace  sh  on most of those systems, and provides more
+functionality.  It has several thousand regular  users,  and
+their  feedback has helped to make it as good as it is today
+- a testament to the benefits of free software.
+
+
+
+
+
+
+
+
+
+
+_________________________
+*BSD/386 is a trademark of  Berkeley  Software  Design,
+Inc.
+
+
+
+
+                      October 28, 1994
+
+
diff --git a/doc/bash.0 b/doc/bash.0
new file mode 100644 (file)
index 0000000..8a402dd
--- /dev/null
@@ -0,0 +1,4770 @@
+BASH(1)                                                                BASH(1)
+
+
+
+N\bNA\bAM\bME\bE
+       bash - GNU Bourne-Again SHell
+
+S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
+       b\bba\bas\bsh\bh [options] [file]
+
+C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
+       Bash is Copyright (C) 1989-2003 by the Free Software Foundation, Inc.
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+       B\bBa\bas\bsh\bh  is  an  s\bsh\bh-compatible  command language interpreter that executes
+       commands read from the standard input or from a file.  B\bBa\bas\bsh\bh also incor-
+       porates useful features from the _\bK_\bo_\br_\bn and _\bC shells (k\bks\bsh\bh and c\bcs\bsh\bh).
+
+       B\bBa\bas\bsh\bh  is  intended  to be a conformant implementation of the IEEE POSIX
+       Shell and Tools specification (IEEE Working Group 1003.2).
+
+O\bOP\bPT\bTI\bIO\bON\bNS\bS
+       In addition to the single-character shell  options  documented  in  the
+       description  of  the s\bse\bet\bt builtin command, b\bba\bas\bsh\bh interprets the following
+       options when it is invoked:
+
+       -\b-c\bc _\bs_\bt_\br_\bi_\bn_\bg If the -\b-c\bc option is present,  then  commands  are  read  from
+                 _\bs_\bt_\br_\bi_\bn_\bg.   If  there  are arguments after the _\bs_\bt_\br_\bi_\bn_\bg, they are
+                 assigned to the positional parameters, starting with $\b$0\b0.
+       -\b-i\bi        If the -\b-i\bi option is present, the shell is _\bi_\bn_\bt_\be_\br_\ba_\bc_\bt_\bi_\bv_\be.
+       -\b-l\bl        Make b\bba\bas\bsh\bh act as if it had been invoked as a login shell (see
+                 I\bIN\bNV\bVO\bOC\bCA\bAT\bTI\bIO\bON\bN below).
+       -\b-r\br        If  the  -\b-r\br  option  is present, the shell becomes _\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\be_\bd
+                 (see R\bRE\bES\bST\bTR\bRI\bIC\bCT\bTE\bED\bD S\bSH\bHE\bEL\bLL\bL below).
+       -\b-s\bs        If the -\b-s\bs option is present, or if no arguments remain  after
+                 option  processing,  then commands are read from the standard
+                 input.  This option allows the positional  parameters  to  be
+                 set when invoking an interactive shell.
+       -\b-D\bD        A  list of all double-quoted strings preceded by $\b$ is printed
+                 on the standard ouput.  These are the strings that  are  sub-
+                 ject to language translation when the current locale is not C\bC
+                 or P\bPO\bOS\bSI\bIX\bX.  This implies the -\b-n\bn option; no  commands  will  be
+                 executed.
+       [\b[-\b-+\b+]\b]O\bO [\b[_\bs_\bh_\bo_\bp_\bt_\b__\bo_\bp_\bt_\bi_\bo_\bn]\b]
+                 _\bs_\bh_\bo_\bp_\bt_\b__\bo_\bp_\bt_\bi_\bo_\bn  is  one  of  the  shell options accepted by the
+                 s\bsh\bho\bop\bpt\bt  builtin  (see  S\bSH\bHE\bEL\bLL\bL  B\bBU\bUI\bIL\bLT\bTI\bIN\bN  C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS  below).    If
+                 _\bs_\bh_\bo_\bp_\bt_\b__\bo_\bp_\bt_\bi_\bo_\bn is present, -\b-O\bO sets the value of that option; +\b+O\bO
+                 unsets it.  If _\bs_\bh_\bo_\bp_\bt_\b__\bo_\bp_\bt_\bi_\bo_\bn is not supplied,  the  names  and
+                 values  of the shell options accepted by s\bsh\bho\bop\bpt\bt are printed on
+                 the standard output.  If the invocation  option  is  +\b+O\bO,  the
+                 output  is displayed in a format that may be reused as input.
+       -\b--\b-        A -\b--\b- signals the end of options and disables  further  option
+                 processing.   Any arguments after the -\b--\b- are treated as file-
+                 names and arguments.  An argument of -\b- is equivalent to -\b--\b-.
+
+       B\bBa\bas\bsh\bh also  interprets  a  number  of  multi-character  options.   These
+       options  must  appear  on  the command line before the single-character
+       options to be recognized.
+
+       -\b--\b-d\bde\beb\bbu\bug\bgg\bge\ber\br
+              Arrange for the debugger profile to be executed before the shell
+              starts.   Turns  on extended debugging mode (see the description
+              of the e\bex\bxt\btd\bde\beb\bbu\bug\bg option to the s\bsh\bho\bop\bpt\bt  builtin  below)  and  shell
+              function tracing (see the description of the -\b-o\bo f\bfu\bun\bnc\bct\btr\bra\bac\bce\be option
+              to the s\bse\bet\bt builtin below).
+       -\b--\b-d\bdu\bum\bmp\bp-\b-p\bpo\bo-\b-s\bst\btr\bri\bin\bng\bgs\bs
+              Equivalent to -\b-D\bD, but the  output  is  in  the  GNU  _\bg_\be_\bt_\bt_\be_\bx_\bt  p\bpo\bo
+              (portable object) file format.
+       -\b--\b-d\bdu\bum\bmp\bp-\b-s\bst\btr\bri\bin\bng\bgs\bs
+              Equivalent to -\b-D\bD.
+       -\b--\b-h\bhe\bel\blp\bp Display  a  usage  message  on standard output and exit success-
+              fully.
+       -\b--\b-i\bin\bni\bit\bt-\b-f\bfi\bil\ble\be _\bf_\bi_\bl_\be
+       -\b--\b-r\brc\bcf\bfi\bil\ble\be _\bf_\bi_\bl_\be
+              Execute commands from _\bf_\bi_\bl_\be instead of the standard personal ini-
+              tialization  file  _\b~_\b/_\b._\bb_\ba_\bs_\bh_\br_\bc  if  the  shell is interactive (see
+              I\bIN\bNV\bVO\bOC\bCA\bAT\bTI\bIO\bON\bN below).
+
+       -\b--\b-l\blo\bog\bgi\bin\bn
+              Equivalent to -\b-l\bl.
+
+       -\b--\b-n\bno\boe\bed\bdi\bit\bti\bin\bng\bg
+              Do not use the GNU r\bre\bea\bad\bdl\bli\bin\bne\be library to read command  lines  when
+              the shell is interactive.
+
+       -\b--\b-n\bno\bop\bpr\bro\bof\bfi\bil\ble\be
+              Do  not read either the system-wide startup file _\b/_\be_\bt_\bc_\b/_\bp_\br_\bo_\bf_\bi_\bl_\be or
+              any  of  the  personal  initialization  files   _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bp_\br_\bo_\bf_\bi_\bl_\be,
+              _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bl_\bo_\bg_\bi_\bn,  or  _\b~_\b/_\b._\bp_\br_\bo_\bf_\bi_\bl_\be.   By  default,  b\bba\bas\bsh\bh reads these
+              files when it is  invoked  as  a  login  shell  (see  I\bIN\bNV\bVO\bOC\bCA\bAT\bTI\bIO\bON\bN
+              below).
+
+       -\b--\b-n\bno\bor\brc\bc Do  not  read  and  execute  the  personal  initialization  file
+              _\b~_\b/_\b._\bb_\ba_\bs_\bh_\br_\bc if the shell is interactive.  This  option  is  on  by
+              default if the shell is invoked as s\bsh\bh.
+
+       -\b--\b-p\bpo\bos\bsi\bix\bx
+              Change  the behavior of b\bba\bas\bsh\bh where the default operation differs
+              from the POSIX 1003.2 standard  to  match  the  standard  (_\bp_\bo_\bs_\bi_\bx
+              _\bm_\bo_\bd_\be).
+
+       -\b--\b-r\bre\bes\bst\btr\bri\bic\bct\bte\bed\bd
+              The shell becomes restricted (see R\bRE\bES\bST\bTR\bRI\bIC\bCT\bTE\bED\bD S\bSH\bHE\bEL\bLL\bL below).
+
+       -\b--\b-v\bve\ber\brb\bbo\bos\bse\be
+              Equivalent to  -\b-v\bv.
+
+       -\b--\b-v\bve\ber\brs\bsi\bio\bon\bn
+              Show  version information for this instance of b\bba\bas\bsh\bh on the stan-
+              dard output and exit successfully.
+
+A\bAR\bRG\bGU\bUM\bME\bEN\bNT\bTS\bS
+       If arguments remain after option processing, and neither the -\b-c\bc nor the
+       -\b-s\bs  option  has  been supplied, the first argument is assumed to be the
+       name of a file containing shell commands.  If b\bba\bas\bsh\bh is invoked  in  this
+       fashion,  $\b$0\b0 is set to the name of the file, and the positional parame-
+       ters are set to the remaining arguments.  B\bBa\bas\bsh\bh reads and executes  com-
+       mands  from this file, then exits.  B\bBa\bas\bsh\bh's exit status is the exit sta-
+       tus of the last command executed in the script.   If  no  commands  are
+       executed,  the  exit status is 0.  An attempt is first made to open the
+       file in the current directory, and, if no file is found, then the shell
+       searches the directories in P\bPA\bAT\bTH\bH for the script.
+
+I\bIN\bNV\bVO\bOC\bCA\bAT\bTI\bIO\bON\bN
+       A  _\bl_\bo_\bg_\bi_\bn _\bs_\bh_\be_\bl_\bl is one whose first character of argument zero is a -\b-, or
+       one started with the -\b--\b-l\blo\bog\bgi\bin\bn option.
+
+       An _\bi_\bn_\bt_\be_\br_\ba_\bc_\bt_\bi_\bv_\be shell is one started without  non-option  arguments  and
+       without  the  -\b-c\bc  option  whose standard input and output are both con-
+       nected to terminals (as determined by _\bi_\bs_\ba_\bt_\bt_\by(3)), or one  started  with
+       the  -\b-i\bi  option.   P\bPS\bS1\b1 is set and $\b$-\b- includes i\bi if b\bba\bas\bsh\bh is interactive,
+       allowing a shell script or a startup file to test this state.
+
+       The following paragraphs describe how b\bba\bas\bsh\bh executes its startup  files.
+       If  any  of  the files exist but cannot be read, b\bba\bas\bsh\bh reports an error.
+       Tildes are expanded in  file  names  as  described  below  under  T\bTi\bil\bld\bde\be
+       E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn in the E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN section.
+
+       When  b\bba\bas\bsh\bh is invoked as an interactive login shell, or as a non-inter-
+       active shell with the -\b--\b-l\blo\bog\bgi\bin\bn option, it first reads and executes  com-
+       mands  from  the file _\b/_\be_\bt_\bc_\b/_\bp_\br_\bo_\bf_\bi_\bl_\be, if that file exists.  After reading
+       that file, it looks for _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bp_\br_\bo_\bf_\bi_\bl_\be, _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bl_\bo_\bg_\bi_\bn, and _\b~_\b/_\b._\bp_\br_\bo_\bf_\bi_\bl_\be,
+       in  that order, and reads and executes commands from the first one that
+       exists and is readable.  The -\b--\b-n\bno\bop\bpr\bro\bof\bfi\bil\ble\be option may be  used  when  the
+       shell is started to inhibit this behavior.
+
+       When  a  login  shell  exits, b\bba\bas\bsh\bh reads and executes commands from the
+       file _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bl_\bo_\bg_\bo_\bu_\bt, if it exists.
+
+       When an interactive shell that is not a login shell  is  started,  b\bba\bas\bsh\bh
+       reads  and executes commands from _\b~_\b/_\b._\bb_\ba_\bs_\bh_\br_\bc, if that file exists.  This
+       may be inhibited by using the -\b--\b-n\bno\bor\brc\bc option.  The -\b--\b-r\brc\bcf\bfi\bil\ble\be _\bf_\bi_\bl_\be  option
+       will  force  b\bba\bas\bsh\bh  to  read  and  execute commands from _\bf_\bi_\bl_\be instead of
+       _\b~_\b/_\b._\bb_\ba_\bs_\bh_\br_\bc.
+
+       When b\bba\bas\bsh\bh is started non-interactively, to  run  a  shell  script,  for
+       example, it looks for the variable B\bBA\bAS\bSH\bH_\b_E\bEN\bNV\bV in the environment, expands
+       its value if it appears there, and uses the expanded value as the  name
+       of  a  file to read and execute.  B\bBa\bas\bsh\bh behaves as if the following com-
+       mand were executed:
+              if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
+       but the value of the P\bPA\bAT\bTH\bH variable is not used to search for  the  file
+       name.
+
+       If  b\bba\bas\bsh\bh  is  invoked  with  the name s\bsh\bh, it tries to mimic the startup
+       behavior of historical versions of s\bsh\bh as  closely  as  possible,  while
+       conforming  to the POSIX standard as well.  When invoked as an interac-
+       tive login shell, or a non-interactive shell with the  -\b--\b-l\blo\bog\bgi\bin\bn  option,
+       it  first  attempts  to read and execute commands from _\b/_\be_\bt_\bc_\b/_\bp_\br_\bo_\bf_\bi_\bl_\be and
+       _\b~_\b/_\b._\bp_\br_\bo_\bf_\bi_\bl_\be, in that order.  The  -\b--\b-n\bno\bop\bpr\bro\bof\bfi\bil\ble\be  option  may  be  used  to
+       inhibit  this  behavior.  When invoked as an interactive shell with the
+       name s\bsh\bh, b\bba\bas\bsh\bh looks for the variable E\bEN\bNV\bV, expands its value  if  it  is
+       defined,  and uses the expanded value as the name of a file to read and
+       execute.  Since a shell invoked as s\bsh\bh does not attempt to read and exe-
+       cute  commands from any other startup files, the -\b--\b-r\brc\bcf\bfi\bil\ble\be option has no
+       effect.  A non-interactive shell invoked with  the  name  s\bsh\bh  does  not
+       attempt  to  read  any  other  startup files.  When invoked as s\bsh\bh, b\bba\bas\bsh\bh
+       enters _\bp_\bo_\bs_\bi_\bx mode after the startup files are read.
+
+       When b\bba\bas\bsh\bh is started in _\bp_\bo_\bs_\bi_\bx mode, as with the  -\b--\b-p\bpo\bos\bsi\bix\bx  command  line
+       option, it follows the POSIX standard for startup files.  In this mode,
+       interactive shells expand the E\bEN\bNV\bV variable and commands  are  read  and
+       executed  from  the  file  whose  name is the expanded value.  No other
+       startup files are read.
+
+       B\bBa\bas\bsh\bh attempts to determine when it is being run  by  the  remote  shell
+       daemon,  usually  _\br_\bs_\bh_\bd.  If b\bba\bas\bsh\bh determines it is being run by _\br_\bs_\bh_\bd, it
+       reads and executes commands from _\b~_\b/_\b._\bb_\ba_\bs_\bh_\br_\bc, if that file exists and  is
+       readable.  It will not do this if invoked as s\bsh\bh.  The -\b--\b-n\bno\bor\brc\bc option may
+       be used to inhibit this behavior, and the -\b--\b-r\brc\bcf\bfi\bil\ble\be option may  be  used
+       to  force  another  file to be read, but _\br_\bs_\bh_\bd does not generally invoke
+       the shell with those options or allow them to be specified.
+
+       If the shell is started with the effective user (group) id not equal to
+       the real user (group) id, and the -\b-p\bp option is not supplied, no startup
+       files are read, shell functions are not inherited from the environment,
+       the  S\bSH\bHE\bEL\bLL\bLO\bOP\bPT\bTS\bS  variable, if it appears in the environment, is ignored,
+       and the effective user id is set to the real user id.  If the -\b-p\bp option
+       is  supplied  at  invocation, the startup behavior is the same, but the
+       effective user id is not reset.
+
+D\bDE\bEF\bFI\bIN\bNI\bIT\bTI\bIO\bON\bNS\bS
+       The following definitions are used throughout the rest  of  this  docu-
+       ment.
+       b\bbl\bla\ban\bnk\bk  A space or tab.
+       w\bwo\bor\brd\bd   A  sequence  of  characters  considered  as a single unit by the
+              shell.  Also known as a t\bto\bok\bke\ben\bn.
+       n\bna\bam\bme\be   A _\bw_\bo_\br_\bd consisting only of  alphanumeric  characters  and  under-
+              scores,  and beginning with an alphabetic character or an under-
+              score.  Also referred to as an i\bid\bde\ben\bnt\bti\bif\bfi\bie\ber\br.
+       m\bme\bet\bta\bac\bch\bha\bar\bra\bac\bct\bte\ber\br
+              A character that, when unquoted, separates words.   One  of  the
+              following:
+              |\b|  &\b& ;\b; (\b( )\b) <\b< >\b> s\bsp\bpa\bac\bce\be t\bta\bab\bb
+       c\bco\bon\bnt\btr\bro\bol\bl o\bop\bpe\ber\bra\bat\bto\bor\br
+              A _\bt_\bo_\bk_\be_\bn that performs a control function.  It is one of the fol-
+              lowing symbols:
+              |\b||\b| &\b& &\b&&\b& ;\b; ;\b;;\b; (\b( )\b) |\b| <\b<n\bne\bew\bwl\bli\bin\bne\be>\b>
+
+R\bRE\bES\bSE\bER\bRV\bVE\bED\bD W\bWO\bOR\bRD\bDS\bS
+       _\bR_\be_\bs_\be_\br_\bv_\be_\bd _\bw_\bo_\br_\bd_\bs are words that have a special meaning to the shell.  The
+       following words are recognized as reserved when unquoted and either the
+       first word of a simple command (see S\bSH\bHE\bEL\bLL\bL G\bGR\bRA\bAM\bMM\bMA\bAR\bR below) or  the  third
+       word of a c\bca\bas\bse\be or f\bfo\bor\br command:
+
+       !\b!  c\bca\bas\bse\be  d\bdo\bo d\bdo\bon\bne\be e\bel\bli\bif\bf e\bel\bls\bse\be e\bes\bsa\bac\bc f\bfi\bi f\bfo\bor\br f\bfu\bun\bnc\bct\bti\bio\bon\bn i\bif\bf i\bin\bn s\bse\bel\ble\bec\bct\bt t\bth\bhe\ben\bn u\bun\bnt\bti\bil\bl
+       w\bwh\bhi\bil\ble\be {\b{ }\b} t\bti\bim\bme\be [\b[[\b[ ]\b]]\b]
+
+S\bSH\bHE\bEL\bLL\bL G\bGR\bRA\bAM\bMM\bMA\bAR\bR
+   S\bSi\bim\bmp\bpl\ble\be C\bCo\bom\bmm\bma\ban\bnd\bds\bs
+       A _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd is a sequence of optional  variable  assignments  fol-
+       lowed  by  b\bbl\bla\ban\bnk\bk-separated  words and redirections, and terminated by a
+       _\bc_\bo_\bn_\bt_\br_\bo_\bl _\bo_\bp_\be_\br_\ba_\bt_\bo_\br.  The first word specifies the command to be executed,
+       and  is  passed  as  argument  zero.  The remaining words are passed as
+       arguments to the invoked command.
+
+       The return value of a _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd is its exit status,  or  128+_\bn  if
+       the command is terminated by signal _\bn.
+
+   P\bPi\bip\bpe\bel\bli\bin\bne\bes\bs
+       A _\bp_\bi_\bp_\be_\bl_\bi_\bn_\be is a sequence of one or more commands separated by the char-
+       acter |\b|.  The format for a pipeline is:
+
+              [t\bti\bim\bme\be [-\b-p\bp]] [ ! ] _\bc_\bo_\bm_\bm_\ba_\bn_\bd [ |\b| _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b2 ... ]
+
+       The standard output of _\bc_\bo_\bm_\bm_\ba_\bn_\bd is connected via a pipe to the  standard
+       input  of  _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b2.   This connection is performed before any redirec-
+       tions specified by the command (see R\bRE\bED\bDI\bIR\bRE\bEC\bCT\bTI\bIO\bON\bN below).
+
+       The return status of a pipeline is the exit status of the last command,
+       unless  the  p\bpi\bip\bpe\bef\bfa\bai\bil\bl  option  is enabled.  If p\bpi\bip\bpe\bef\bfa\bai\bil\bl is enabled, the
+       pipeline's return status is the value of the last  (rightmost)  command
+       to  exit  with a non-zero status, or zero if all commands exit success-
+       fully.  If the reserved word !\b!  precedes a pipeline, the exit status of
+       that  pipeline  is the logical negation of the exit status as described
+       above.  The shell waits for all commands in the pipeline  to  terminate
+       before returning a value.
+
+       If  the  t\bti\bim\bme\be reserved word precedes a pipeline, the elapsed as well as
+       user and system time consumed by its execution are  reported  when  the
+       pipeline  terminates.   The -\b-p\bp option changes the output format to that
+       specified by POSIX.  The T\bTI\bIM\bME\bEF\bFO\bOR\bRM\bMA\bAT\bT variable may be  set  to  a  format
+       string  that  specifies how the timing information should be displayed;
+       see the description of T\bTI\bIM\bME\bEF\bFO\bOR\bRM\bMA\bAT\bT under S\bSh\bhe\bel\bll\bl V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs below.
+
+       Each command in a pipeline is executed as a separate process (i.e.,  in
+       a subshell).
+
+   L\bLi\bis\bst\bts\bs
+       A  _\bl_\bi_\bs_\bt  is a sequence of one or more pipelines separated by one of the
+       operators ;\b;, &\b&, &\b&&\b&, or |\b||\b|, and optionally terminated by one of ;\b;, &\b&, or
+       <\b<n\bne\bew\bwl\bli\bin\bne\be>\b>.
+
+       Of these list operators, &\b&&\b& and |\b||\b| have equal precedence, followed by ;\b;
+       and &\b&,\b, which have equal precedence.
+
+       A sequence of one or more newlines may appear in a _\bl_\bi_\bs_\bt  instead  of  a
+       semicolon to delimit commands.
+
+       If  a  command  is terminated by the control operator &\b&, the shell exe-
+       cutes the command in the _\bb_\ba_\bc_\bk_\bg_\br_\bo_\bu_\bn_\bd in a subshell.  The shell does  not
+       wait  for  the command to finish, and the return status is 0.  Commands
+       separated by a ;\b; are executed sequentially; the shell  waits  for  each
+       command  to terminate in turn.  The return status is the exit status of
+       the last command executed.
+
+       The control operators &\b&&\b& and |\b||\b| denote AND lists and OR lists,  respec-
+       tively.  An AND list has the form
+
+              _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b1 &\b&&\b& _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b2
+
+       _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b2  is  executed if, and only if, _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b1 returns an exit status
+       of zero.
+
+       An OR list has the form
+
+              _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b1 |\b||\b| _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b2
+
+
+       _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b2 is executed if and only if _\bc_\bo_\bm_\bm_\ba_\bn_\bd_\b1 returns  a  non-zero  exit
+       status.   The  return  status of AND and OR lists is the exit status of
+       the last command executed in the list.
+
+   C\bCo\bom\bmp\bpo\bou\bun\bnd\bd C\bCo\bom\bmm\bma\ban\bnd\bds\bs
+       A _\bc_\bo_\bm_\bp_\bo_\bu_\bn_\bd _\bc_\bo_\bm_\bm_\ba_\bn_\bd is one of the following:
+
+       (_\bl_\bi_\bs_\bt) _\bl_\bi_\bs_\bt is executed in a subshell environment (see  C\bCO\bOM\bMM\bMA\bAN\bND\bD  E\bEX\bXE\bEC\bCU\bU-\b-
+              T\bTI\bIO\bON\bN  E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT below).  Variable assignments and builtin com-
+              mands that affect the  shell's  environment  do  not  remain  in
+              effect  after  the  command completes.  The return status is the
+              exit status of _\bl_\bi_\bs_\bt.
+
+       { _\bl_\bi_\bs_\bt; }
+              _\bl_\bi_\bs_\bt is simply executed in the current shell environment.   _\bl_\bi_\bs_\bt
+              must  be  terminated with a newline or semicolon.  This is known
+              as a _\bg_\br_\bo_\bu_\bp _\bc_\bo_\bm_\bm_\ba_\bn_\bd.  The return status is  the  exit  status  of
+              _\bl_\bi_\bs_\bt.   Note that unlike the metacharacters (\b( and )\b), {\b{ and }\b} are
+              _\br_\be_\bs_\be_\br_\bv_\be_\bd _\bw_\bo_\br_\bd_\bs and must occur where a reserved word is permitted
+              to  be  recognized.   Since they do not cause a word break, they
+              must be separated from _\bl_\bi_\bs_\bt by whitespace.
+
+       ((_\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn))
+              The _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn is evaluated according  to  the  rules  described
+              below  under A\bAR\bRI\bIT\bTH\bHM\bME\bET\bTI\bIC\bC E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN.  If the value of the expres-
+              sion is non-zero, the return status is 0; otherwise  the  return
+              status is 1.  This is exactly equivalent to l\ble\bet\bt "\b"_\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn"\b".
+
+       [\b[[\b[ _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn ]\b]]\b]
+              Return  a  status  of  0 or 1 depending on the evaluation of the
+              conditional expression _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn.  Expressions are composed  of
+              the  primaries  described  below  under C\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNA\bAL\bL E\bEX\bXP\bPR\bRE\bES\bSS\bSI\bIO\bON\bNS\bS.
+              Word splitting and pathname expansion are not performed  on  the
+              words  between  the  [\b[[\b[  and  ]\b]]\b]; tilde expansion, parameter and
+              variable expansion, arithmetic expansion, command  substitution,
+              process  substitution,  and quote removal are performed.  Condi-
+              tional operators such as -\b-f\bf must be unquoted to be recognized as
+              primaries.
+
+              When  the  =\b==\b= and !\b!=\b= operators are used, the string to the right
+              of the operator is considered a pattern and matched according to
+              the  rules  described  below under P\bPa\bat\btt\bte\ber\brn\bn M\bMa\bat\btc\bch\bhi\bin\bng\bg.  The return
+              value is 0 if the string matches or does not match the  pattern,
+              respectively,  and  1 otherwise.  Any part of the pattern may be
+              quoted to force it to be matched as a string.
+
+              An additional binary operator, =\b=~\b~, is available, with  the  same
+              precedence  as  =\b==\b=  and  !\b!=\b=.  When it is used, the string to the
+              right of the operator is considered an extended regular  expres-
+              sion and matched accordingly (as in _\br_\be_\bg_\be_\bx(3)).  The return value
+              is 0 if the string matches the pattern, and 1 otherwise.  If the
+              regular  expression  is syntactically incorrect, the conditional
+              expression's return value is 2.  If the shell option  n\bno\boc\bca\bas\bse\beg\bgl\blo\bob\bb
+              is enabled, the match is performed without regard to the case of
+              alphabetic  characters.   Substrings  matched  by  parenthesized
+              subexpressions  within  the  regular expression are saved in the
+              array variable B\bBA\bAS\bSH\bH_\b_R\bRE\bEM\bMA\bAT\bTC\bCH\bH.  The element of  B\bBA\bAS\bSH\bH_\b_R\bRE\bEM\bMA\bAT\bTC\bCH\bH  with
+              index 0 is the portion of the string matching the entire regular
+              expression.  The element of B\bBA\bAS\bSH\bH_\b_R\bRE\bEM\bMA\bAT\bTC\bCH\bH with  index  _\bn  is  the
+              portion  of the string matching the _\bnth parenthesized subexpres-
+              sion.
+
+              Expressions may  be  combined  using  the  following  operators,
+              listed in decreasing order of precedence:
+
+              (\b( _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn )\b)
+                     Returns  the  value  of  _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn.  This may be used to
+                     override the normal precedence of operators.
+              !\b! _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn
+                     True if _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn is false.
+              _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b1 &\b&&\b& _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b2
+                     True if both _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b1 and _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b2 are true.
+              _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b1 |\b||\b| _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b2
+                     True if either _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b1 or _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b2 is true.
+
+              The &\b&&\b& and |\b||\b| operators do not evaluate _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b2 if the value
+              of  _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\b1  is  sufficient to determine the return value of
+              the entire conditional expression.
+
+       f\bfo\bor\br _\bn_\ba_\bm_\be [ i\bin\bn _\bw_\bo_\br_\bd ] ; d\bdo\bo _\bl_\bi_\bs_\bt ; d\bdo\bon\bne\be
+              The list of words following i\bin\bn is expanded, generating a list of
+              items.  The variable _\bn_\ba_\bm_\be is set to each element of this list in
+              turn, and _\bl_\bi_\bs_\bt is executed each time.  If the i\bin\bn _\bw_\bo_\br_\bd  is  omit-
+              ted,  the  f\bfo\bor\br  command  executes  _\bl_\bi_\bs_\bt once for each positional
+              parameter that is set (see P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS below).  The return status
+              is  the  exit  status of the last command that executes.  If the
+              expansion of the items following i\bin\bn results in an empty list, no
+              commands are executed, and the return status is 0.
+
+       f\bfo\bor\br (( _\be_\bx_\bp_\br_\b1 ; _\be_\bx_\bp_\br_\b2 ; _\be_\bx_\bp_\br_\b3 )) ; d\bdo\bo _\bl_\bi_\bs_\bt ; d\bdo\bon\bne\be
+              First, the arithmetic expression _\be_\bx_\bp_\br_\b1 is evaluated according to
+              the rules described  below  under  A\bAR\bRI\bIT\bTH\bHM\bME\bET\bTI\bIC\bC  E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN.   The
+              arithmetic  expression  _\be_\bx_\bp_\br_\b2 is then evaluated repeatedly until
+              it evaluates to zero.  Each time _\be_\bx_\bp_\br_\b2 evaluates to  a  non-zero
+              value,  _\bl_\bi_\bs_\bt  is executed and the arithmetic expression _\be_\bx_\bp_\br_\b3 is
+              evaluated.  If any expression is omitted, it behaves  as  if  it
+              evaluates to 1.  The return value is the exit status of the last
+              command in _\bl_\bi_\bs_\bt that is executed, or false if any of the expres-
+              sions is invalid.
+
+       s\bse\bel\ble\bec\bct\bt _\bn_\ba_\bm_\be [ i\bin\bn _\bw_\bo_\br_\bd ] ; d\bdo\bo _\bl_\bi_\bs_\bt ; d\bdo\bon\bne\be
+              The list of words following i\bin\bn is expanded, generating a list of
+              items.  The set of expanded words is  printed  on  the  standard
+              error,  each  preceded  by a number.  If the i\bin\bn _\bw_\bo_\br_\bd is omitted,
+              the positional parameters are printed  (see  P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS  below).
+              The  P\bPS\bS3\b3 prompt is then displayed and a line read from the stan-
+              dard input.  If the line consists of a number  corresponding  to
+              one  of  the  displayed  words, then the value of _\bn_\ba_\bm_\be is set to
+              that word.  If the line is  empty,  the  words  and  prompt  are
+              displayed  again.   If  EOF is read, the command completes.  Any
+              other value read causes _\bn_\ba_\bm_\be to be set to null.  The  line  read
+              is saved in the variable R\bRE\bEP\bPL\bLY\bY.  The _\bl_\bi_\bs_\bt is executed after each
+              selection until a b\bbr\bre\bea\bak\bk command is executed.  The exit status of
+              s\bse\bel\ble\bec\bct\bt  is the exit status of the last command executed in _\bl_\bi_\bs_\bt,
+              or zero if no commands were executed.
+
+       c\bca\bas\bse\be _\bw_\bo_\br_\bd i\bin\bn [ [(] _\bp_\ba_\bt_\bt_\be_\br_\bn [ |\b| _\bp_\ba_\bt_\bt_\be_\br_\bn ] ... ) _\bl_\bi_\bs_\bt ;; ] ... e\bes\bsa\bac\bc
+              A c\bca\bas\bse\be command first expands _\bw_\bo_\br_\bd, and tries to match it against
+              each _\bp_\ba_\bt_\bt_\be_\br_\bn in turn, using the same matching rules as for path-
+              name expansion (see P\bPa\bat\bth\bhn\bna\bam\bme\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn below).  When a match  is
+              found,  the  corresponding  _\bl_\bi_\bs_\bt  is  executed.  After the first
+              match, no subsequent matches are attempted.  The exit 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
+              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
+              _\bl_\bi_\bs_\bt is executed and the command completes.  Otherwise, the e\bel\bls\bse\be
+              _\bl_\bi_\bs_\bt is executed, if present.  The exit status is the exit  sta-
+              tus of the last command executed, or zero if no condition tested
+              true.
+
+       w\bwh\bhi\bil\ble\be _\bl_\bi_\bs_\bt; d\bdo\bo _\bl_\bi_\bs_\bt; d\bdo\bon\bne\be
+       u\bun\bnt\bti\bil\bl _\bl_\bi_\bs_\bt; d\bdo\bo _\bl_\bi_\bs_\bt; d\bdo\bon\bne\be
+              The w\bwh\bhi\bil\ble\be command continuously executes the d\bdo\bo _\bl_\bi_\bs_\bt as  long  as
+              the  last  command  in _\bl_\bi_\bs_\bt returns an exit status of zero.  The
+              u\bun\bnt\bti\bil\bl command is identical to the w\bwh\bhi\bil\ble\be command, except that the
+              test  is  negated;  the  d\bdo\bo _\bl_\bi_\bs_\bt is executed as long as the last
+              command in _\bl_\bi_\bs_\bt returns a non-zero exit status.  The exit status
+              of  the  w\bwh\bhi\bil\ble\be and u\bun\bnt\bti\bil\bl commands is the exit status of the last
+              d\bdo\bo _\bl_\bi_\bs_\bt command executed, or zero if none was executed.
+
+   S\bSh\bhe\bel\bll\bl F\bFu\bun\bnc\bct\bti\bio\bon\bn D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bns\bs
+       A shell function is an object that is called like a simple command  and
+       executes  a  compound  command with a new set of positional parameters.
+       Shell functions are declared as follows:
+
+       [ f\bfu\bun\bnc\bct\bti\bio\bon\bn ] _\bn_\ba_\bm_\be () _\bc_\bo_\bm_\bp_\bo_\bu_\bn_\bd_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd [_\br_\be_\bd_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn]
+              This defines a function named _\bn_\ba_\bm_\be.  The reserved word  f\bfu\bun\bnc\bct\bti\bio\bon\bn
+              is  optional.   If  the  f\bfu\bun\bnc\bct\bti\bio\bon\bn reserved word is supplied, the
+              parentheses are optional.  The _\bb_\bo_\bd_\by of the function is the  com-
+              pound  command  _\bc_\bo_\bm_\bp_\bo_\bu_\bn_\bd_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd  (see C\bCo\bom\bmp\bpo\bou\bun\bnd\bd C\bCo\bom\bmm\bma\ban\bnd\bds\bs above).
+              That command is usually a _\bl_\bi_\bs_\bt of commands between { and },  but
+              may  be  any command listed under C\bCo\bom\bmp\bpo\bou\bun\bnd\bd C\bCo\bom\bmm\bma\ban\bnd\bds\bs above.  _\bc_\bo_\bm_\b-
+              _\bp_\bo_\bu_\bn_\bd_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd is executed whenever _\bn_\ba_\bm_\be is specified as the name
+              of  a  simple command.  Any redirections (see R\bRE\bED\bDI\bIR\bRE\bEC\bCT\bTI\bIO\bON\bN below)
+              specified when a function is  defined  are  performed  when  the
+              function  is executed.  The exit status of a function definition
+              is zero unless a syntax error occurs or a readonly function with
+              the same name already exists.  When executed, the exit status of
+              a function is the exit status of the last  command  executed  in
+              the body.  (See F\bFU\bUN\bNC\bCT\bTI\bIO\bON\bNS\bS below.)
+
+C\bCO\bOM\bMM\bME\bEN\bNT\bTS\bS
+       In a non-interactive shell, or an interactive shell in which the i\bin\bnt\bte\ber\br-\b-
+       a\bac\bct\bti\biv\bve\be_\b_c\bco\bom\bmm\bme\ben\bnt\bts\bs option to the  s\bsh\bho\bop\bpt\bt  builtin  is  enabled  (see  S\bSH\bHE\bEL\bLL\bL
+       B\bBU\bUI\bIL\bLT\bTI\bIN\bN  C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS  below), a word beginning with #\b# causes that word and
+       all remaining characters on that line to be  ignored.   An  interactive
+       shell  without  the  i\bin\bnt\bte\ber\bra\bac\bct\bti\biv\bve\be_\b_c\bco\bom\bmm\bme\ben\bnt\bts\bs option enabled does not allow
+       comments.  The i\bin\bnt\bte\ber\bra\bac\bct\bti\biv\bve\be_\b_c\bco\bom\bmm\bme\ben\bnt\bts\bs option is on by default in interac-
+       tive shells.
+
+Q\bQU\bUO\bOT\bTI\bIN\bNG\bG
+       _\bQ_\bu_\bo_\bt_\bi_\bn_\bg  is used to remove the special meaning of certain characters or
+       words to the shell.  Quoting can be used to disable  special  treatment
+       for special characters, to prevent reserved words from being recognized
+       as such, and to prevent parameter expansion.
+
+       Each of the _\bm_\be_\bt_\ba_\bc_\bh_\ba_\br_\ba_\bc_\bt_\be_\br_\bs listed above under D\bDE\bEF\bFI\bIN\bNI\bIT\bTI\bIO\bON\bNS\bS  has  special
+       meaning to the shell and must be quoted if it is to represent itself.
+
+       When  the command history expansion facilities are being used, the _\bh_\bi_\bs_\b-
+       _\bt_\bo_\br_\by _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn character, usually !\b!, must be quoted to prevent  history
+       expansion.
+
+       There  are  three  quoting  mechanisms:  the  _\be_\bs_\bc_\ba_\bp_\be  _\bc_\bh_\ba_\br_\ba_\bc_\bt_\be_\br, single
+       quotes, and double quotes.
+
+       A non-quoted backslash (\\b\) is the _\be_\bs_\bc_\ba_\bp_\be _\bc_\bh_\ba_\br_\ba_\bc_\bt_\be_\br.  It  preserves  the
+       literal value of the next character that follows, with the exception of
+       <newline>.  If a \\b\<newline> pair appears,  and  the  backslash  is  not
+       itself  quoted,  the \\b\<newline> is treated as a line continuation (that
+       is, it is removed from the input stream and effectively ignored).
+
+       Enclosing characters in single quotes preserves the  literal  value  of
+       each character within the quotes.  A single quote may not occur between
+       single quotes, even when preceded by a backslash.
+
+       Enclosing characters in double quotes preserves the  literal  value  of
+       all  characters  within  the quotes, with the exception of $\b$, `\b`, and \\b\.
+       The characters $\b$ and `\b`  retain  their  special  meaning  within  double
+       quotes.   The  backslash retains its special meaning only when followed
+       by one of the following characters: $\b$, `\b`, "\b", \\b\, or <\b<n\bne\bew\bwl\bli\bin\bne\be>\b>.  A double
+       quote  may  be quoted within double quotes by preceding it with a back-
+       slash.  When command history is being used, the double quote may not be
+       used to quote the history expansion character.
+
+       The  special  parameters  *\b*  and  @\b@ have special meaning when in double
+       quotes (see P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS below).
+
+       Words of the form $\b$'_\bs_\bt_\br_\bi_\bn_\bg' are treated specially.  The word expands to
+       _\bs_\bt_\br_\bi_\bn_\bg,  with  backslash-escaped characters replaced as specifed by the
+       ANSI C standard.  Backslash escape sequences, if present,  are  decoded
+       as follows:
+              \\b\a\ba     alert (bell)
+              \\b\b\bb     backspace
+              \\b\e\be     an escape character
+              \\b\f\bf     form feed
+              \\b\n\bn     new line
+              \\b\r\br     carriage return
+              \\b\t\bt     horizontal tab
+              \\b\v\bv     vertical tab
+              \\b\\\b\     backslash
+              \\b\'\b'     single quote
+              \\b\_\bn_\bn_\bn   the  eight-bit  character  whose value is the octal value
+                     _\bn_\bn_\bn (one to three digits)
+              \\b\x\bx_\bH_\bH   the eight-bit character whose value  is  the  hexadecimal
+                     value _\bH_\bH (one or two hex digits)
+              \\b\c\bc_\bx    a control-_\bx character
+
+       The  expanded  result  is  single-quoted, as if the dollar sign had not
+       been present.
+
+       A double-quoted string preceded by a dollar sign  ($\b$)  will  cause  the
+       string  to  be translated according to the current locale.  If the cur-
+       rent locale is C\bC or P\bPO\bOS\bSI\bIX\bX, the dollar sign is ignored.  If  the  string
+       is translated and replaced, the replacement is double-quoted.
+
+P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS
+       A  _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is an entity that stores values.  It can be a _\bn_\ba_\bm_\be, a num-
+       ber, or one of the special characters listed below under S\bSp\bpe\bec\bci\bia\bal\bl P\bPa\bar\bra\bam\bm-\b-
+       e\bet\bte\ber\brs\bs.   A _\bv_\ba_\br_\bi_\ba_\bb_\bl_\be is a parameter denoted by a _\bn_\ba_\bm_\be.  A variable has a
+       _\bv_\ba_\bl_\bu_\be and zero or more _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bs.  Attributes are assigned  using  the
+       d\bde\bec\bcl\bla\bar\bre\be  builtin command (see d\bde\bec\bcl\bla\bar\bre\be below in S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS).
+
+       A parameter is set if it has been assigned a value.  The null string is
+       a  valid  value.  Once a variable is set, it may be unset only by using
+       the u\bun\bns\bse\bet\bt builtin command (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).
+
+       A _\bv_\ba_\br_\bi_\ba_\bb_\bl_\be may be assigned to by a statement of the form
+
+              _\bn_\ba_\bm_\be=[_\bv_\ba_\bl_\bu_\be]
+
+       If _\bv_\ba_\bl_\bu_\be is not given, the variable is assigned the null  string.   All
+       _\bv_\ba_\bl_\bu_\be_\bs  undergo tilde expansion, parameter and variable expansion, com-
+       mand substitution, arithmetic expansion, and quote removal (see  E\bEX\bXP\bPA\bAN\bN-\b-
+       S\bSI\bIO\bON\bN below).  If the variable has its i\bin\bnt\bte\beg\bge\ber\br attribute set, then _\bv_\ba_\bl_\bu_\be
+       is evaluated as an arithmetic expression even if the $((...)) expansion
+       is  not  used  (see A\bAr\bri\bit\bth\bhm\bme\bet\bti\bic\bc E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn below).  Word splitting is not
+       performed, with the exception of "\b"$\b$@\b@"\b" as explained below under  S\bSp\bpe\bec\bci\bia\bal\bl
+       P\bPa\bar\bra\bam\bme\bet\bte\ber\brs\bs.   Pathname  expansion  is not performed.  Assignment state-
+       ments may also appear as arguments  to  the  a\bal\bli\bia\bas\bs,  d\bde\bec\bcl\bla\bar\bre\be,  t\bty\byp\bpe\bes\bse\bet\bt,
+       e\bex\bxp\bpo\bor\brt\bt, r\bre\bea\bad\bdo\bon\bnl\bly\by, and l\blo\boc\bca\bal\bl builtin commands.
+
+   P\bPo\bos\bsi\bit\bti\bio\bon\bna\bal\bl P\bPa\bar\bra\bam\bme\bet\bte\ber\brs\bs
+       A  _\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn_\ba_\bl  _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br  is a parameter denoted by one or more digits,
+       other than the single digit 0.  Positional parameters are assigned from
+       the  shell's  arguments when it is invoked, and may be reassigned using
+       the s\bse\bet\bt builtin command.  Positional parameters may not be assigned  to
+       with  assignment statements.  The positional parameters are temporarily
+       replaced when a shell function is executed (see F\bFU\bUN\bNC\bCT\bTI\bIO\bON\bNS\bS below).
+
+       When a positional parameter consisting of more than a single  digit  is
+       expanded, it must be enclosed in braces (see E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN below).
+
+   S\bSp\bpe\bec\bci\bia\bal\bl 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.
+       @\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"
+              "$\b$2\b2" ...  When there are no positional parameters, "$\b$@\b@"  and  $\b$@\b@
+              expand to nothing (i.e., they are removed).
+       #\b#      Expands to the number of positional parameters in decimal.
+       ?\b?      Expands  to  the status of the most recently executed foreground
+              pipeline.
+       -\b-      Expands to the current option flags as  specified  upon  invoca-
+              tion,  by  the  s\bse\bet\bt  builtin  command, or those set by the shell
+              itself (such as the -\b-i\bi option).
+       $\b$      Expands to the process ID of the shell.  In a  ()  subshell,  it
+              expands  to  the  process  ID of the current shell, not the sub-
+              shell.
+       !\b!      Expands to the process ID of the most  recently  executed  back-
+              ground (asynchronous) command.
+       0\b0      Expands  to  the name of the shell or shell script.  This is set
+              at shell initialization.  If b\bba\bas\bsh\bh is invoked with a file of com-
+              mands,  $\b$0\b0  is set to the name of that file.  If b\bba\bas\bsh\bh is started
+              with the -\b-c\bc option, then $\b$0\b0 is set to the first  argument  after
+              the  string to be executed, if one is present.  Otherwise, it is
+              set to the file name used to invoke b\bba\bas\bsh\bh, as given  by  argument
+              zero.
+       _\b_      At  shell startup, set to the absolute file name of the shell or
+              shell script being executed as  passed  in  the  argument  list.
+              Subsequently,  expands to the last argument to the previous com-
+              mand, after expansion.  Also set to the full file name  of  each
+              command  executed and placed in the environment exported to that
+              command.  When checking mail, this parameter holds the  name  of
+              the mail file currently being checked.
+
+   S\bSh\bhe\bel\bll\bl V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs
+       The following variables are set by the shell:
+
+       B\bBA\bAS\bSH\bH   Expands  to  the  full file name used to invoke this instance of
+              b\bba\bas\bsh\bh.
+       B\bBA\bAS\bSH\bH_\b_A\bAR\bRG\bGC\bC
+              An array variable whose values are the number of  parameters  in
+              each frame of the current bash execution call stack.  The number
+              of parameters to  the  current  subroutine  (shell  function  or
+              script  executed  with  .\b. or s\bso\bou\bur\brc\bce\be) is at the top of the stack.
+              When a subroutine is executed, the number of  parameters  passed
+              is pushed onto B\bBA\bAS\bSH\bH_\b_A\bAR\bRG\bGC\bC.
+       B\bBA\bAS\bSH\bH_\b_A\bAR\bRG\bGV\bV
+              An  array  variable containing all of the parameters in the cur-
+              rent bash execution call stack.  The final parameter of the last
+              subroutine  call is at the top of the stack; the first parameter
+              of the initial call is at the bottom.  When a subroutine is exe-
+              cuted, the parameters supplied are pushed onto B\bBA\bAS\bSH\bH_\b_A\bAR\bRG\bGV\bV.
+       B\bBA\bAS\bSH\bH_\b_C\bCO\bOM\bMM\bMA\bAN\bND\bD
+              The  command  currently  being executed or about to be executed,
+              unless the shell is executing a command as the result of a trap,
+              in  which  case  it  is the command executing at the time of the
+              trap.
+       B\bBA\bAS\bSH\bH_\b_E\bEX\bXE\bEC\bCU\bUT\bTI\bIO\bON\bN_\b_S\bST\bTR\bRI\bIN\bNG\bG
+              The command argument to the -\b-c\bc invocation option.
+       B\bBA\bAS\bSH\bH_\b_L\bLI\bIN\bNE\bEN\bNO\bO
+              An array variable whose members are the line numbers  in  source
+              files   corresponding   to   each   member   of  @var{FUNCNAME}.
+              $\b${\b{B\bBA\bAS\bSH\bH_\b_L\bLI\bIN\bNE\bEN\bNO\bO[\b[_\b$_\bi]\b]}\b} is the line number in the source  file  where
+              $\b${\b{F\bFU\bUN\bNC\bCN\bNA\bAM\bME\bE[\b[_\b$_\bi  _\b+  _\b1]\b]}\b} was called.  The corresponding source file
+              name is $\b${\b{B\bBA\bAS\bSH\bH_\b_S\bSO\bOU\bUR\bRC\bCE\bE[\b[_\b$_\bi _\b+ _\b1]\b]}\b}.\b.  U\bUs\bse\be L\bLI\bIN\bNE\bEN\bNO\bO t\bto\bo o\bob\bbt\bta\bai\bin\bn  t\bth\bhe\be  c\bcu\bur\br-\b-
+              r\bre\ben\bnt\bt l\bli\bin\bne\be n\bnu\bum\bmb\bbe\ber\br.\b.
+       B\bBA\bAS\bSH\bH_\b_R\bRE\bEM\bMA\bAT\bTC\bCH\bH
+              An  array  variable  whose members are assigned by the =\b=~\b~ binary
+              operator to the [\b[[\b[ conditional command.  The element with  index
+              0  is  the  portion  of  the  string matching the entire regular
+              expression.  The element with index _\bn  is  the  portion  of  the
+              string matching the _\bnth parenthesized subexpression.  This vari-
+              able is read-only.
+       B\bBA\bAS\bSH\bH_\b_S\bSO\bOU\bUR\bRC\bCE\bE
+              An array variable whose members are the source filenames  corre-
+              sponding to the elements in the F\bFU\bUN\bNC\bCN\bNA\bAM\bME\bE array variable.
+       B\bBA\bAS\bSH\bH_\b_S\bSU\bUB\bBS\bSH\bHE\bEL\bLL\bL
+              Incremented  by one each time a subshell or subshell environment
+              is spawned.  The initial value is 0.
+       B\bBA\bAS\bSH\bH_\b_V\bVE\bER\bRS\bSI\bIN\bNF\bFO\bO
+              A readonly array variable whose members hold version information
+              for  this  instance  of  b\bba\bas\bsh\bh.  The values assigned to the array
+              members are as follows:
+              B\bBA\bAS\bSH\bH_\b_V\bVE\bER\bRS\bSI\bIN\bNF\bFO\bO[\b[0]\b]        The major version number (the  _\br_\be_\bl_\be_\ba_\bs_\be).
+              B\bBA\bAS\bSH\bH_\b_V\bVE\bER\bRS\bSI\bIN\bNF\bFO\bO[\b[1]\b]        The  minor version number (the _\bv_\be_\br_\bs_\bi_\bo_\bn).
+              B\bBA\bAS\bSH\bH_\b_V\bVE\bER\bRS\bSI\bIN\bNF\bFO\bO[\b[2]\b]        The patch level.
+              B\bBA\bAS\bSH\bH_\b_V\bVE\bER\bRS\bSI\bIN\bNF\bFO\bO[\b[3]\b]        The build version.
+              B\bBA\bAS\bSH\bH_\b_V\bVE\bER\bRS\bSI\bIN\bNF\bFO\bO[\b[4]\b]        The release status (e.g., _\bb_\be_\bt_\ba_\b1).
+              B\bBA\bAS\bSH\bH_\b_V\bVE\bER\bRS\bSI\bIN\bNF\bFO\bO[\b[5]\b]        The value of M\bMA\bAC\bCH\bHT\bTY\bYP\bPE\bE.
+
+       B\bBA\bAS\bSH\bH_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN
+              Expands to a string describing the version of this  instance  of
+              b\bba\bas\bsh\bh.
+
+       C\bCO\bOM\bMP\bP_\b_C\bCW\bWO\bOR\bRD\bD
+              An  index  into $\b${\b{C\bCO\bOM\bMP\bP_\b_W\bWO\bOR\bRD\bDS\bS}\b} of the word containing the current
+              cursor position.  This  variable  is  available  only  in  shell
+              functions invoked by the programmable completion facilities (see
+              P\bPr\bro\bog\bgr\bra\bam\bmm\bma\bab\bbl\ble\be C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn below).
+
+       C\bCO\bOM\bMP\bP_\b_L\bLI\bIN\bNE\bE
+              The current command line.  This variable is  available  only  in
+              shell  functions  and  external  commands  invoked  by  the pro-
+              grammable completion  facilities  (see  P\bPr\bro\bog\bgr\bra\bam\bmm\bma\bab\bbl\ble\be  C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn
+              below).
+
+       C\bCO\bOM\bMP\bP_\b_P\bPO\bOI\bIN\bNT\bT
+              The  index of the current cursor position relative to the begin-
+              ning of the current command.  If the current cursor position  is
+              at the end of the current command, the value of this variable is
+              equal to $\b${\b{#\b#C\bCO\bOM\bMP\bP_\b_L\bLI\bIN\bNE\bE}\b}.  This  variable  is  available  only  in
+              shell  functions  and  external  commands  invoked  by  the pro-
+              grammable completion  facilities  (see  P\bPr\bro\bog\bgr\bra\bam\bmm\bma\bab\bbl\ble\be  C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn
+              below).
+
+       C\bCO\bOM\bMP\bP_\b_W\bWO\bOR\bRD\bDB\bBR\bRE\bEA\bAK\bKS\bS
+              The  set  of characters that the Readline library treats as word
+              separators when performing word completion.  If  C\bCO\bOM\bMP\bP_\b_W\bWO\bOR\bRD\bDB\bBR\bRE\bEA\bAK\bKS\bS
+              is  unset, it loses its special properties, even if it is subse-
+              quently reset.
+
+       C\bCO\bOM\bMP\bP_\b_W\bWO\bOR\bRD\bDS\bS
+              An array variable (see A\bAr\brr\bra\bay\bys\bs below) consisting of the  individ-
+              ual  words in the current command line.  This variable is avail-
+              able only in shell functions invoked by the programmable comple-
+              tion facilities (see P\bPr\bro\bog\bgr\bra\bam\bmm\bma\bab\bbl\ble\be C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn below).
+
+       D\bDI\bIR\bRS\bST\bTA\bAC\bCK\bK
+              An array variable (see A\bAr\brr\bra\bay\bys\bs below) containing the current con-
+              tents of the directory stack.  Directories appear in  the  stack
+              in  the order they are displayed by the d\bdi\bir\brs\bs builtin.  Assigning
+              to members of this array variable may be used to modify directo-
+              ries  already in the stack, but the p\bpu\bus\bsh\bhd\bd and p\bpo\bop\bpd\bd builtins must
+              be used to add and remove directories.  Assignment to this vari-
+              able  will  not  change  the  current directory.  If D\bDI\bIR\bRS\bST\bTA\bAC\bCK\bK is
+              unset, it loses its special properties, even  if  it  is  subse-
+              quently reset.
+
+       E\bEU\bUI\bID\bD   Expands  to  the effective user ID of the current user, initial-
+              ized at shell startup.  This variable is readonly.
+
+       F\bFU\bUN\bNC\bCN\bNA\bAM\bME\bE
+              An array variable containing the names of  all  shell  functions
+              currently in the execution call stack.  The element with index 0
+              is the name of any currently-executing shell function.  The bot-
+              tom-most  element  is  "main".  This variable exists only when a
+              shell function is executing.  Assignments to  F\bFU\bUN\bNC\bCN\bNA\bAM\bME\bE  have  no
+              effect  and  return  an  error status.  If F\bFU\bUN\bNC\bCN\bNA\bAM\bME\bE is unset, it
+              loses its special properties, even if it is subsequently  reset.
+
+       G\bGR\bRO\bOU\bUP\bPS\bS An  array  variable  containing  the list of groups of which the
+              current user is a member.  Assignments to G\bGR\bRO\bOU\bUP\bPS\bS have no  effect
+              and  return  an  error status.  If G\bGR\bRO\bOU\bUP\bPS\bS is unset, it loses its
+              special properties, even if it is subsequently reset.
+
+       H\bHI\bIS\bST\bTC\bCM\bMD\bD
+              The history number, or index in the history list, of the current
+              command.   If H\bHI\bIS\bST\bTC\bCM\bMD\bD is unset, it loses its special properties,
+              even if it is subsequently reset.
+
+       H\bHO\bOS\bST\bTN\bNA\bAM\bME\bE
+              Automatically set to the name of the current host.
+
+       H\bHO\bOS\bST\bTT\bTY\bYP\bPE\bE
+              Automatically set to a string that uniquely describes  the  type
+              of  machine  on which b\bba\bas\bsh\bh is executing.  The default is system-
+              dependent.
+
+       L\bLI\bIN\bNE\bEN\bNO\bO Each time this parameter is referenced, the shell substitutes  a
+              decimal  number  representing the current sequential line number
+              (starting with 1) within a script or function.  When  not  in  a
+              script  or  function, the value substituted is not guaranteed to
+              be meaningful.  If L\bLI\bIN\bNE\bEN\bNO\bO is unset, it loses its special proper-
+              ties, even if it is subsequently reset.
+
+       M\bMA\bAC\bCH\bHT\bTY\bYP\bPE\bE
+              Automatically  set  to  a string that fully describes the system
+              type on which b\bba\bas\bsh\bh is executing, in the  standard  GNU  _\bc_\bp_\bu_\b-_\bc_\bo_\bm_\b-
+              _\bp_\ba_\bn_\by_\b-_\bs_\by_\bs_\bt_\be_\bm format.  The default is system-dependent.
+
+       O\bOL\bLD\bDP\bPW\bWD\bD The previous working directory as set by the c\bcd\bd command.
+
+       O\bOP\bPT\bTA\bAR\bRG\bG The  value  of the last option argument processed by the g\bge\bet\bto\bop\bpt\bts\bs
+              builtin command (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).
+
+       O\bOP\bPT\bTI\bIN\bND\bD The index of the next argument to be processed  by  the  g\bge\bet\bto\bop\bpt\bts\bs
+              builtin command (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).
+
+       O\bOS\bST\bTY\bYP\bPE\bE Automatically  set to a string that describes the operating sys-
+              tem on which b\bba\bas\bsh\bh is executing.  The  default  is  system-depen-
+              dent.
+
+       P\bPI\bIP\bPE\bES\bST\bTA\bAT\bTU\bUS\bS
+              An  array  variable (see A\bAr\brr\bra\bay\bys\bs below) containing a list of exit
+              status values from the processes in  the  most-recently-executed
+              foreground pipeline (which may contain only a single command).
+
+       P\bPP\bPI\bID\bD   The  process  ID  of the shell's parent.  This variable is read-
+              only.
+
+       P\bPW\bWD\bD    The current working directory as set by the c\bcd\bd command.
+
+       R\bRA\bAN\bND\bDO\bOM\bM Each time this parameter is referenced, a random integer between
+              0 and 32767 is generated.  The sequence of random numbers may be
+              initialized by assigning a value to R\bRA\bAN\bND\bDO\bOM\bM.  If R\bRA\bAN\bND\bDO\bOM\bM is unset,
+              it  loses  its  special  properties,  even if it is subsequently
+              reset.
+
+       R\bRE\bEP\bPL\bLY\bY  Set to the line of input read by the r\bre\bea\bad\bd builtin  command  when
+              no arguments are supplied.
+
+       S\bSE\bEC\bCO\bON\bND\bDS\bS
+              Each  time  this  parameter is referenced, the number of seconds
+              since shell invocation is returned.  If a value is  assigned  to
+              S\bSE\bEC\bCO\bON\bND\bDS\bS,  the  value  returned upon subsequent references is the
+              number of seconds since the assignment plus the value  assigned.
+              If S\bSE\bEC\bCO\bON\bND\bDS\bS is unset, it loses its special properties, even if it
+              is subsequently reset.
+
+       S\bSH\bHE\bEL\bLL\bLO\bOP\bPT\bTS\bS
+              A colon-separated list of enabled shell options.  Each  word  in
+              the  list  is  a  valid  argument  for  the -\b-o\bo option to the s\bse\bet\bt
+              builtin command (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).  The options
+              appearing  in  S\bSH\bHE\bEL\bLL\bLO\bOP\bPT\bTS\bS are those reported as _\bo_\bn by s\bse\bet\bt -\b-o\bo.  If
+              this variable is in the environment when b\bba\bas\bsh\bh  starts  up,  each
+              shell  option  in  the  list  will be enabled before reading any
+              startup files.  This variable is read-only.
+
+       S\bSH\bHL\bLV\bVL\bL  Incremented by one each time an instance of b\bba\bas\bsh\bh is started.
+
+       U\bUI\bID\bD    Expands to the user ID of the current user, initialized at shell
+              startup.  This variable is readonly.
+
+       The  following  variables  are  used by the shell.  In some cases, b\bba\bas\bsh\bh
+       assigns a default value to a variable; these cases are noted below.
+
+       B\bBA\bAS\bSH\bH_\b_E\bEN\bNV\bV
+              If this parameter is set when b\bba\bas\bsh\bh is executing a shell  script,
+              its  value  is  interpreted as a filename containing commands to
+              initialize the shell, as in _\b~_\b/_\b._\bb_\ba_\bs_\bh_\br_\bc.  The value of B\bBA\bAS\bSH\bH_\b_E\bEN\bNV\bV is
+              subjected  to  parameter  expansion,  command  substitution, and
+              arithmetic expansion before being interpreted as  a  file  name.
+              P\bPA\bAT\bTH\bH is not used to search for the resultant file name.
+       C\bCD\bDP\bPA\bAT\bTH\bH The  search  path for the c\bcd\bd command.  This is a colon-separated
+              list of directories in which the  shell  looks  for  destination
+              directories  specified  by  the  c\bcd\bd  command.  A sample value is
+              ".:~:/usr".
+       C\bCO\bOL\bLU\bUM\bMN\bNS\bS
+              Used by the s\bse\bel\ble\bec\bct\bt builtin command  to  determine  the  terminal
+              width  when  printing  selection  lists.  Automatically set upon
+              receipt of a SIGWINCH.
+       C\bCO\bOM\bMP\bPR\bRE\bEP\bPL\bLY\bY
+              An array variable from which b\bba\bas\bsh\bh reads the possible completions
+              generated  by  a shell function invoked by the programmable com-
+              pletion facility (see P\bPr\bro\bog\bgr\bra\bam\bmm\bma\bab\bbl\ble\be C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn below).
+       E\bEM\bMA\bAC\bCS\bS  If b\bba\bas\bsh\bh finds this variable in the environment  when  the  shell
+              starts  with  value "t", it assumes that the shell is running in
+              an emacs shell buffer and disables line editing.
+       F\bFC\bCE\bED\bDI\bIT\bT The default editor for the f\bfc\bc builtin command.
+       F\bFI\bIG\bGN\bNO\bOR\bRE\bE
+              A colon-separated list of suffixes  to  ignore  when  performing
+              filename completion (see R\bRE\bEA\bAD\bDL\bLI\bIN\bNE\bE below).  A filename whose suf-
+              fix matches one of the entries in F\bFI\bIG\bGN\bNO\bOR\bRE\bE is excluded  from  the
+              list of matched filenames.  A sample value is ".o:~".
+       G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE
+              A colon-separated list of patterns defining the set of filenames
+              to be ignored by pathname expansion.  If a filename matched by a
+              pathname  expansion  pattern also matches one of the patterns in
+              G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE, it is removed from the list of matches.
+       H\bHI\bIS\bST\bTC\bCO\bON\bNT\bTR\bRO\bOL\bL
+              A colon-separated list of values controlling  how  commands  are
+              saved  on  the  history  list.   If  the list of values includes
+              _\bi_\bg_\bn_\bo_\br_\be_\bs_\bp_\ba_\bc_\be, lines which begin with a s\bsp\bpa\bac\bce\be  character  are  not
+              saved  in  the history list.  A value of _\bi_\bg_\bn_\bo_\br_\be_\bd_\bu_\bp_\bs causes lines
+              matching the previous history entry to not be saved.  A value of
+              _\bi_\bg_\bn_\bo_\br_\be_\bb_\bo_\bt_\bh is shorthand for _\bi_\bg_\bn_\bo_\br_\be_\bs_\bp_\ba_\bc_\be and _\bi_\bg_\bn_\bo_\br_\be_\bd_\bu_\bp_\bs.  A value
+              of _\be_\br_\ba_\bs_\be_\bd_\bu_\bp_\bs causes all previous lines matching the current line
+              to  be  removed from the history list before that line is saved.
+              Any value not in the above list is ignored.  If  H\bHI\bIS\bST\bTC\bCO\bON\bNT\bTR\bRO\bOL\bL  is
+              unset,  or does not include a valid value, all lines read by the
+              shell parser are saved on the history list, subject to the value
+              of  H\bHI\bIS\bST\bTI\bIG\bGN\bNO\bOR\bRE\bE.  The second and subsequent lines of a multi-line
+              compound command are not tested, and are added  to  the  history
+              regardless of the value of H\bHI\bIS\bST\bTC\bCO\bON\bNT\bTR\bRO\bOL\bL.
+       H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE
+              The name of the file in which command history is saved (see H\bHI\bIS\bS-\b-
+              T\bTO\bOR\bRY\bY below).  The default value is _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bh_\bi_\bs_\bt_\bo_\br_\by.   If  unset,
+              the  command  history  is  not  saved  when an interactive shell
+              exits.
+       H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bES\bSI\bIZ\bZE\bE
+              The maximum number of lines contained in the history file.  When
+              this  variable  is  assigned  a value, the history file is trun-
+              cated, if necessary, to contain no  more  than  that  number  of
+              lines.   The  default  value  is  500.  The history file is also
+              truncated to this size after  writing  it  when  an  interactive
+              shell exits.
+       H\bHI\bIS\bST\bTI\bIG\bGN\bNO\bOR\bRE\bE
+              A  colon-separated list of patterns used to decide which command
+              lines should be saved on the  history  list.   Each  pattern  is
+              anchored  at  the  beginning of the line and must match the com-
+              plete line (no implicit  `*\b*'  is  appended).   Each  pattern  is
+              tested  against  the line after the checks specified by H\bHI\bIS\bST\bTC\bCO\bON\bN-\b-
+              T\bTR\bRO\bOL\bL are applied.  In  addition  to  the  normal  shell  pattern
+              matching characters, `&\b&' matches the previous history line.  `&\b&'
+              may be escaped using  a  backslash;  the  backslash  is  removed
+              before attempting a match.  The second and subsequent lines of a
+              multi-line compound command are not tested, and are added to the
+              history regardless of the value of H\bHI\bIS\bST\bTI\bIG\bGN\bNO\bOR\bRE\bE.
+       H\bHI\bIS\bST\bTS\bSI\bIZ\bZE\bE
+              The  number  of commands to remember in the command history (see
+              H\bHI\bIS\bST\bTO\bOR\bRY\bY below).  The default value is 500.
+       H\bHI\bIS\bST\bTT\bTI\bIM\bME\bEF\bFO\bOR\bRM\bMA\bAT\bT
+              If this variable is set and not null, its value  is  used  as  a
+              format string for _\bs_\bt_\br_\bf_\bt_\bi_\bm_\be(3) to print the time stamp associated
+              with each history entry displayed by the  h\bhi\bis\bst\bto\bor\bry\by  builtin.   If
+              this  variable  is  set,  time stamps are written to the history
+              file so they may be preserved across shell sessions.
+       H\bHO\bOM\bME\bE   The home directory of the current user; the default argument for
+              the c\bcd\bd builtin command.  The value of this variable is also used
+              when performing tilde expansion.
+       H\bHO\bOS\bST\bTF\bFI\bIL\bLE\bE
+              Contains the name of a file in the  same  format  as  _\b/_\be_\bt_\bc_\b/_\bh_\bo_\bs_\bt_\bs
+              that should be read when the shell needs to complete a hostname.
+              The list of possible hostname completions may be  changed  while
+              the  shell  is  running;  the  next  time hostname completion is
+              attempted after the value is changed, b\bba\bas\bsh\bh adds the contents  of
+              the  new file to the existing list.  If H\bHO\bOS\bST\bTF\bFI\bIL\bLE\bE is set, but has
+              no value, b\bba\bas\bsh\bh attempts to read _\b/_\be_\bt_\bc_\b/_\bh_\bo_\bs_\bt_\bs to obtain the list of
+              possible  hostname  completions.   When  H\bHO\bOS\bST\bTF\bFI\bIL\bLE\bE  is unset, the
+              hostname list is cleared.
+       I\bIF\bFS\bS    The _\bI_\bn_\bt_\be_\br_\bn_\ba_\bl _\bF_\bi_\be_\bl_\bd _\bS_\be_\bp_\ba_\br_\ba_\bt_\bo_\br that is  used  for  word  splitting
+              after  expansion  and  to  split  lines into words with the r\bre\bea\bad\bd
+              builtin  command.   The  default  value  is  ``<space><tab><new-
+              line>''.
+       I\bIG\bGN\bNO\bOR\bRE\bEE\bEO\bOF\bF
+              Controls the action of an interactive shell on receipt of an E\bEO\bOF\bF
+              character as the sole input.  If set, the value is the number of
+              consecutive  E\bEO\bOF\bF  characters  which  must  be typed as the first
+              characters on an input line before b\bba\bas\bsh\bh exits.  If the  variable
+              exists  but  does not have a numeric value, or has no value, the
+              default value is 10.  If it does not exist,  E\bEO\bOF\bF  signifies  the
+              end of input to the shell.
+       I\bIN\bNP\bPU\bUT\bTR\bRC\bC
+              The  filename  for  the  r\bre\bea\bad\bdl\bli\bin\bne\be  startup  file, overriding the
+              default of _\b~_\b/_\b._\bi_\bn_\bp_\bu_\bt_\br_\bc (see R\bRE\bEA\bAD\bDL\bLI\bIN\bNE\bE below).
+       L\bLA\bAN\bNG\bG   Used to determine the  locale  category  for  any  category  not
+              specifically selected with a variable starting with L\bLC\bC_\b_.
+       L\bLC\bC_\b_A\bAL\bLL\bL This  variable  overrides  the  value  of L\bLA\bAN\bNG\bG and any other L\bLC\bC_\b_
+              variable specifying a locale category.
+       L\bLC\bC_\b_C\bCO\bOL\bLL\bLA\bAT\bTE\bE
+              This variable determines the collation order used  when  sorting
+              the  results  of pathname expansion, and determines the behavior
+              of  range  expressions,  equivalence  classes,   and   collating
+              sequences within pathname expansion and pattern matching.
+       L\bLC\bC_\b_C\bCT\bTY\bYP\bPE\bE
+              This  variable  determines  the interpretation of characters and
+              the behavior of character classes within pathname expansion  and
+              pattern matching.
+       L\bLC\bC_\b_M\bME\bES\bSS\bSA\bAG\bGE\bES\bS
+              This  variable  determines  the locale used to translate double-
+              quoted strings preceded by a $\b$.
+       L\bLC\bC_\b_N\bNU\bUM\bME\bER\bRI\bIC\bC
+              This variable determines the locale  category  used  for  number
+              formatting.
+       L\bLI\bIN\bNE\bES\bS  Used  by  the  s\bse\bel\ble\bec\bct\bt  builtin  command  to determine the column
+              length for printing selection  lists.   Automatically  set  upon
+              receipt of a SIGWINCH.
+       M\bMA\bAI\bIL\bL   If  this  parameter is set to a file name and the M\bMA\bAI\bIL\bLP\bPA\bAT\bTH\bH vari-
+              able is not set, b\bba\bas\bsh\bh informs the user of the arrival of mail in
+              the specified file.
+       M\bMA\bAI\bIL\bLC\bCH\bHE\bEC\bCK\bK
+              Specifies  how  often  (in  seconds)  b\bba\bas\bsh\bh checks for mail.  The
+              default is 60 seconds.  When it is time to check for  mail,  the
+              shell  does  so  before  displaying the primary prompt.  If this
+              variable is unset, or set to  a  value  that  is  not  a  number
+              greater than or equal to zero, the shell disables mail checking.
+       M\bMA\bAI\bIL\bLP\bPA\bAT\bTH\bH
+              A colon-separated list of file names to  be  checked  for  mail.
+              The message to be printed when mail arrives in a particular file
+              may be specified by separating the file name  from  the  message
+              with a `?'.  When used in the text of the message, $\b$_\b_ expands to
+              the name of the current mailfile.  Example:
+              M\bMA\bAI\bIL\bLP\bPA\bAT\bTH\bH='/var/mail/bfox?"You  have  mail":~/shell-mail?"$_  has
+              mail!"'
+              B\bBa\bas\bsh\bh  supplies  a default value for this variable, but the loca-
+              tion of the user mail files that it  uses  is  system  dependent
+              (e.g., /var/mail/$\b$U\bUS\bSE\bER\bR).
+       O\bOP\bPT\bTE\bER\bRR\bR If set to the value 1, b\bba\bas\bsh\bh displays error messages generated by
+              the g\bge\bet\bto\bop\bpt\bts\bs builtin command (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS  below).
+              O\bOP\bPT\bTE\bER\bRR\bR  is  initialized to 1 each time the shell is invoked or a
+              shell script is executed.
+       P\bPA\bAT\bTH\bH   The search path for commands.  It is a colon-separated  list  of
+              directories  in  which the shell looks for commands (see C\bCO\bOM\bMM\bMA\bAN\bND\bD
+              E\bEX\bXE\bEC\bCU\bUT\bTI\bIO\bON\bN below).  A zero-length (null) directory  name  in  the
+              value of P\bPA\bAT\bTH\bH indicates the current directory.  A null directory
+              name may appear as two adjacent colons,  or  as  an  initial  or
+              trailing  colon.   The  default path is system-dependent, and is
+              set by the administrator who installs b\bba\bas\bsh\bh.  A common  value  is
+              ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin''.
+       P\bPO\bOS\bSI\bIX\bXL\bLY\bY_\b_C\bCO\bOR\bRR\bRE\bEC\bCT\bT
+              If  this  variable  is  in the environment when b\bba\bas\bsh\bh starts, the
+              shell enters _\bp_\bo_\bs_\bi_\bx _\bm_\bo_\bd_\be before reading the startup files, as  if
+              the  -\b--\b-p\bpo\bos\bsi\bix\bx  invocation option had been supplied.  If it is set
+              while the shell is running, b\bba\bas\bsh\bh enables _\bp_\bo_\bs_\bi_\bx _\bm_\bo_\bd_\be, as  if  the
+              command _\bs_\be_\bt _\b-_\bo _\bp_\bo_\bs_\bi_\bx had been executed.
+       P\bPR\bRO\bOM\bMP\bPT\bT_\b_C\bCO\bOM\bMM\bMA\bAN\bND\bD
+              If set, the value is executed as a command prior to issuing each
+              primary prompt.
+       P\bPS\bS1\b1    The value of this parameter is expanded  (see  P\bPR\bRO\bOM\bMP\bPT\bTI\bIN\bNG\bG  below)
+              and  used  as  the  primary prompt string.  The default value is
+              ``\\b\s\bs-\b-\\b\v\bv\\b\$\b$ ''.
+       P\bPS\bS2\b2    The value of this parameter is expanded as with P\bPS\bS1\b1 and used  as
+              the secondary prompt string.  The default is ``>\b> ''.
+       P\bPS\bS3\b3    The value of this parameter is used as the prompt for the s\bse\bel\ble\bec\bct\bt
+              command (see S\bSH\bHE\bEL\bLL\bL G\bGR\bRA\bAM\bMM\bMA\bAR\bR above).
+       P\bPS\bS4\b4    The value of this parameter is expanded  as  with  P\bPS\bS1\b1  and  the
+              value  is  printed  before  each command b\bba\bas\bsh\bh displays during an
+              execution trace.  The first character of P\bPS\bS4\b4 is replicated  mul-
+              tiple  times, as necessary, to indicate multiple levels of indi-
+              rection.  The default is ``+\b+ ''.
+       T\bTI\bIM\bME\bEF\bFO\bOR\bRM\bMA\bAT\bT
+              The value of this parameter is used as a format string  specify-
+              ing  how  the timing information for pipelines prefixed with the
+              t\bti\bim\bme\be reserved word should be displayed.  The %\b% character  intro-
+              duces  an  escape  sequence  that is expanded to a time value or
+              other information.  The escape sequences and their meanings  are
+              as follows; the braces denote optional portions.
+              %\b%%\b%        A literal %\b%.
+              %\b%[\b[_\bp]\b][\b[l\bl]\b]R\bR  The elapsed time in seconds.
+              %\b%[\b[_\bp]\b][\b[l\bl]\b]U\bU  The number of CPU seconds spent in user mode.
+              %\b%[\b[_\bp]\b][\b[l\bl]\b]S\bS  The number of CPU seconds spent in system mode.
+              %\b%P\bP        The CPU percentage, computed as (%U + %S) / %R.
+
+              The  optional  _\bp is a digit specifying the _\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn, the number
+              of fractional digits after a decimal point.  A value of 0 causes
+              no decimal point or fraction to be output.  At most three places
+              after the decimal point may be specified; values  of  _\bp  greater
+              than  3 are changed to 3.  If _\bp is not specified, the value 3 is
+              used.
+
+              The optional l\bl specifies a longer format, including minutes,  of
+              the  form  _\bM_\bMm_\bS_\bS._\bF_\bFs.   The value of _\bp determines whether or not
+              the fraction is included.
+
+              If this variable is not set, b\bba\bas\bsh\bh acts as if it  had  the  value
+              $\b$'\b'\\b\n\bnr\bre\bea\bal\bl\\b\t\bt%\b%3\b3l\blR\bR\\b\n\bnu\bus\bse\ber\br\\b\t\bt%\b%3\b3l\blU\bU\\b\n\bns\bsy\bys\bs%\b%3\b3l\blS\bS'\b'.   If the value is null, no
+              timing information is displayed.  A trailing  newline  is  added
+              when the format string is displayed.
+
+       T\bTM\bMO\bOU\bUT\bT  If  set  to  a  value greater than zero, T\bTM\bMO\bOU\bUT\bT is treated as the
+              default timeout for the r\bre\bea\bad\bd builtin.  The s\bse\bel\ble\bec\bct\bt command termi-
+              nates if input does not arrive after T\bTM\bMO\bOU\bUT\bT seconds when input is
+              coming from a terminal.  In an interactive shell, the  value  is
+              interpreted  as  the  number  of seconds to wait for input after
+              issuing the primary prompt.  B\bBa\bas\bsh\bh terminates after  waiting  for
+              that number of seconds if input does not arrive.
+
+       a\bau\but\bto\bo_\b_r\bre\bes\bsu\bum\bme\be
+              This variable controls how the shell interacts with the user and
+              job control.  If this variable is set, single word  simple  com-
+              mands without redirections are treated as candidates for resump-
+              tion of an existing stopped job.  There is no ambiguity allowed;
+              if  there  is more than one job beginning with the string typed,
+              the job most recently accessed  is  selected.   The  _\bn_\ba_\bm_\be  of  a
+              stopped  job, in this context, is the command line used to start
+              it.  If set to the value _\be_\bx_\ba_\bc_\bt, the string supplied  must  match
+              the  name  of  a  stopped  job exactly; if set to _\bs_\bu_\bb_\bs_\bt_\br_\bi_\bn_\bg, the
+              string supplied needs to match a substring  of  the  name  of  a
+              stopped  job.  The _\bs_\bu_\bb_\bs_\bt_\br_\bi_\bn_\bg value provides functionality analo-
+              gous to the %\b%?\b?  job identifier (see J\bJO\bOB\bB C\bCO\bON\bNT\bTR\bRO\bOL\bL below).  If  set
+              to  any  other  value, the supplied string must be a prefix of a
+              stopped job's name; this provides functionality analogous to the
+              %\b% job identifier.
+
+       h\bhi\bis\bst\btc\bch\bha\bar\brs\bs
+              The  two or three characters which control history expansion and
+              tokenization (see H\bHI\bIS\bST\bTO\bOR\bRY\bY E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN below).  The first character
+              is  the _\bh_\bi_\bs_\bt_\bo_\br_\by _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn character, the character which signals
+              the start of a history  expansion,  normally  `!\b!'.   The  second
+              character  is the _\bq_\bu_\bi_\bc_\bk _\bs_\bu_\bb_\bs_\bt_\bi_\bt_\bu_\bt_\bi_\bo_\bn character, which is used as
+              shorthand for re-running the previous command  entered,  substi-
+              tuting  one  string  for another in the command.  The default is
+              `^\b^'.  The optional third character is the character which  indi-
+              cates  that the remainder of the line is a comment when found as
+              the first character of a word, normally `#\b#'.  The  history  com-
+              ment character causes history substitution to be skipped for the
+              remaining words on the line.  It does not necessarily cause  the
+              shell parser to treat the rest of the line as a comment.
+
+   A\bAr\brr\bra\bay\bys\bs
+       B\bBa\bas\bsh\bh  provides  one-dimensional  array  variables.  Any variable may be
+       used as an array; the d\bde\bec\bcl\bla\bar\bre\be builtin will explicitly declare an array.
+       There  is no maximum limit on the size of an array, nor any requirement
+       that members be indexed or assigned contiguously.  Arrays  are  indexed
+       using integers and are zero-based.
+
+       An  array is created automatically if any variable is assigned to using
+       the syntax _\bn_\ba_\bm_\be[_\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt]=_\bv_\ba_\bl_\bu_\be.   The  _\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt  is  treated  as  an
+       arithmetic  expression  that  must evaluate to a number greater than or
+       equal to zero.  To explicitly declare an array,  use  d\bde\bec\bcl\bla\bar\bre\be  -\b-a\ba  _\bn_\ba_\bm_\be
+       (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).  d\bde\bec\bcl\bla\bar\bre\be -\b-a\ba _\bn_\ba_\bm_\be[\b[_\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt]\b] is also
+       accepted; the _\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt is ignored.  Attributes may be specified for an
+       array variable using the d\bde\bec\bcl\bla\bar\bre\be and r\bre\bea\bad\bdo\bon\bnl\bly\by builtins.  Each attribute
+       applies to all members of an array.
+
+       Arrays  are  assigned  to  using  compound  assignments  of  the   form
+       _\bn_\ba_\bm_\be=(\b(value_\b1  ...  value_\bn)\b),  where  each  _\bv_\ba_\bl_\bu_\be  is  of  the form [_\bs_\bu_\bb_\b-
+       _\bs_\bc_\br_\bi_\bp_\bt]=_\bs_\bt_\br_\bi_\bn_\bg.  Only _\bs_\bt_\br_\bi_\bn_\bg is required.  If the optional brackets and
+       subscript  are supplied, that index is assigned to; otherwise the index
+       of the element assigned is the last index assigned to by the  statement
+       plus  one.   Indexing  starts at zero.  This syntax is also accepted by
+       the d\bde\bec\bcl\bla\bar\bre\be builtin.  Individual array  elements  may  be  assigned  to
+       using the _\bn_\ba_\bm_\be[_\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt]=_\bv_\ba_\bl_\bu_\be syntax introduced above.
+
+       Any  element  of  an  array may be referenced using ${_\bn_\ba_\bm_\be[_\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt]}.
+       The braces are required to avoid conflicts with pathname expansion.  If
+       _\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt  is  @\b@  or *\b*, the word expands to all members of _\bn_\ba_\bm_\be.  These
+       subscripts differ only when the word appears within double quotes.   If
+       the word is double-quoted, ${_\bn_\ba_\bm_\be[*]} expands to a single word with the
+       value of each array member separated by the first character of the  I\bIF\bFS\bS
+       special variable, and ${_\bn_\ba_\bm_\be[@]} expands each element of _\bn_\ba_\bm_\be to a sep-
+       arate word.  When there are no array  members,  ${_\bn_\ba_\bm_\be[@]}  expands  to
+       nothing.   This is analogous to the expansion of the special parameters
+       *\b* and @\b@ (see S\bSp\bpe\bec\bci\bia\bal\bl P\bPa\bar\bra\bam\bme\bet\bte\ber\brs\bs above).  ${#_\bn_\ba_\bm_\be[_\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt]} expands to
+       the  length  of ${_\bn_\ba_\bm_\be[_\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt]}.  If _\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt is *\b* or @\b@, the expan-
+       sion is the number of elements in  the  array.   Referencing  an  array
+       variable without a subscript is equivalent to referencing element zero.
+
+       The u\bun\bns\bse\bet\bt builtin is used to  destroy  arrays.   u\bun\bns\bse\bet\bt  _\bn_\ba_\bm_\be[_\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt]
+       destroys  the array element at index _\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt.  u\bun\bns\bse\bet\bt _\bn_\ba_\bm_\be, where _\bn_\ba_\bm_\be
+       is an array, or u\bun\bns\bse\bet\bt _\bn_\ba_\bm_\be[_\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt],  where  _\bs_\bu_\bb_\bs_\bc_\br_\bi_\bp_\bt  is  *\b*  or  @\b@,
+       removes the entire array.
+
+       The  d\bde\bec\bcl\bla\bar\bre\be,  l\blo\boc\bca\bal\bl,  and r\bre\bea\bad\bdo\bon\bnl\bly\by builtins each accept a -\b-a\ba option to
+       specify an array.  The r\bre\bea\bad\bd builtin accepts a -\b-a\ba  option  to  assign  a
+       list  of  words  read from the standard input to an array.  The s\bse\bet\bt and
+       d\bde\bec\bcl\bla\bar\bre\be builtins display array values in a way that allows them  to  be
+       reused as assignments.
+
+E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN
+       Expansion is performed on the command line after it has been split into
+       words.  There are seven kinds of expansion performed: _\bb_\br_\ba_\bc_\be  _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn,
+       _\bt_\bi_\bl_\bd_\be  _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn,  _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br  _\ba_\bn_\bd _\bv_\ba_\br_\bi_\ba_\bb_\bl_\be _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn, _\bc_\bo_\bm_\bm_\ba_\bn_\bd _\bs_\bu_\bb_\bs_\bt_\bi_\bt_\bu_\b-
+       _\bt_\bi_\bo_\bn, _\ba_\br_\bi_\bt_\bh_\bm_\be_\bt_\bi_\bc _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn, _\bw_\bo_\br_\bd _\bs_\bp_\bl_\bi_\bt_\bt_\bi_\bn_\bg, and _\bp_\ba_\bt_\bh_\bn_\ba_\bm_\be _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn.
+
+       The order of expansions is: brace expansion, tilde  expansion,  parame-
+       ter,  variable  and arithmetic expansion and command substitution (done
+       in a left-to-right fashion), word splitting, and pathname expansion.
+
+       On systems that can support it, there is an additional expansion avail-
+       able: _\bp_\br_\bo_\bc_\be_\bs_\bs _\bs_\bu_\bb_\bs_\bt_\bi_\bt_\bu_\bt_\bi_\bo_\bn.
+
+       Only brace expansion, word splitting, and pathname expansion can change
+       the number of words of the expansion; other expansions expand a  single
+       word  to a single word.  The only exceptions to this are the expansions
+       of "$\b$@\b@" and "$\b${\b{_\bn_\ba_\bm_\be[\b[@\b@]\b]}\b}" as explained above (see P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS).
+
+   B\bBr\bra\bac\bce\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn
+       _\bB_\br_\ba_\bc_\be _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn is a mechanism by which arbitrary strings may be gener-
+       ated.   This  mechanism is similar to _\bp_\ba_\bt_\bh_\bn_\ba_\bm_\be _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn, but the file-
+       names generated need not exist.  Patterns to be brace expanded take the
+       form of an optional _\bp_\br_\be_\ba_\bm_\bb_\bl_\be, followed by either a series of comma-sep-
+       arated strings or a sequence expression between a pair of braces,  fol-
+       lowed  by  an  optional  _\bp_\bo_\bs_\bt_\bs_\bc_\br_\bi_\bp_\bt.   The preamble is prefixed to each
+       string contained within the braces, and the postscript is then appended
+       to each resulting string, expanding left to right.
+
+       Brace  expansions  may  be nested.  The results of each expanded string
+       are not sorted;  left  to  right  order  is  preserved.   For  example,
+       a{\b{d,c,b}\b}e expands into `ade ace abe'.
+
+       A  sequence  expression takes the form {\b{_\bx.\b..\b._\by}\b}, where _\bx and _\by are either
+       integers or single characters.  When integers are supplied, the expres-
+       sion  expands  to each number between _\bx and _\by, inclusive.  When charac-
+       ters are supplied, the expression expands  to  each  character  lexico-
+       graphically between _\bx and _\by, inclusive.  Note that both _\bx and _\by must be
+       of the same type.
+
+       Brace expansion is performed before any other expansions, and any char-
+       acters  special to other expansions are preserved in the result.  It is
+       strictly textual.  B\bBa\bas\bsh\bh does not apply any syntactic interpretation  to
+       the context of the expansion or the text between the braces.
+
+       A  correctly-formed  brace  expansion must contain unquoted opening and
+       closing braces, and at least one unquoted comma  or  a  valid  sequence
+       expression.   Any incorrectly formed brace expansion is left unchanged.
+       A {\b{ or ,\b, may be quoted with a backslash to prevent its being considered
+       part  of  a brace expression.  To avoid conflicts with parameter expan-
+       sion, the string $\b${\b{ is not considered eligible for brace expansion.
+
+       This construct is typically used as shorthand when the common prefix of
+       the strings to be generated is longer than in the above example:
+
+              mkdir /usr/local/src/bash/{old,new,dist,bugs}
+       or
+              chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
+
+       Brace  expansion  introduces  a  slight incompatibility with historical
+       versions of s\bsh\bh.  s\bsh\bh does not treat opening or closing braces  specially
+       when  they  appear as part of a word, and preserves them in the output.
+       B\bBa\bas\bsh\bh removes braces from words as a  consequence  of  brace  expansion.
+       For  example,  a word entered to s\bsh\bh as _\bf_\bi_\bl_\be_\b{_\b1_\b,_\b2_\b} appears identically in
+       the output.  The same word is output as _\bf_\bi_\bl_\be_\b1 _\bf_\bi_\bl_\be_\b2 after expansion  by
+       b\bba\bas\bsh\bh.   If strict compatibility with s\bsh\bh is desired, start b\bba\bas\bsh\bh with the
+       +\b+B\bB option or disable brace expansion with the +\b+B\bB option to the s\bse\bet\bt com-
+       mand (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).
+
+   T\bTi\bil\bld\bde\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn
+       If  a  word  begins  with an unquoted tilde character (`~\b~'), all of the
+       characters preceding the first unquoted slash (or  all  characters,  if
+       there  is no unquoted slash) are considered a _\bt_\bi_\bl_\bd_\be_\b-_\bp_\br_\be_\bf_\bi_\bx.  If none of
+       the characters in the tilde-prefix are quoted, the  characters  in  the
+       tilde-prefix  following the tilde are treated as a possible _\bl_\bo_\bg_\bi_\bn _\bn_\ba_\bm_\be.
+       If this login name is the null string, the tilde is replaced  with  the
+       value  of  the shell parameter H\bHO\bOM\bME\bE.  If H\bHO\bOM\bME\bE is unset, the home direc-
+       tory of the user executing the shell is  substituted  instead.   Other-
+       wise,  the  tilde-prefix is replaced with the home directory associated
+       with the specified login name.
+
+       If the tilde-prefix is a `~+', the value  of  the  shell  variable  P\bPW\bWD\bD
+       replaces the tilde-prefix.  If the tilde-prefix is a `~-', the value of
+       the shell variable O\bOL\bLD\bDP\bPW\bWD\bD, if it is set, is substituted.  If the  char-
+       acters  following  the tilde in the tilde-prefix consist of a number _\bN,
+       optionally prefixed by a `+' or a `-',  the  tilde-prefix  is  replaced
+       with the corresponding element from the directory stack, as it would be
+       displayed by the d\bdi\bir\brs\bs builtin invoked with the tilde-prefix as an argu-
+       ment.   If  the characters following the tilde in the tilde-prefix con-
+       sist of a number without a leading `+' or `-', `+' is assumed.
+
+       If the login name is invalid, or the tilde expansion fails, the word is
+       unchanged.
+
+       Each variable assignment is checked for unquoted tilde-prefixes immedi-
+       ately following a :\b: or =\b=.  In these cases, tilde expansion is also per-
+       formed.   Consequently,  one  may use file names with tildes in assign-
+       ments to P\bPA\bAT\bTH\bH, M\bMA\bAI\bIL\bLP\bPA\bAT\bTH\bH, and C\bCD\bDP\bPA\bAT\bTH\bH, and the shell assigns the expanded
+       value.
+
+   P\bPa\bar\bra\bam\bme\bet\bte\ber\br E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn
+       The `$\b$' character introduces parameter expansion, command substitution,
+       or arithmetic expansion.  The parameter name or symbol to  be  expanded
+       may  be enclosed in braces, which are optional but serve to protect the
+       variable to be expanded from characters immediately following it  which
+       could be interpreted as part of the name.
+
+       When  braces  are  used, the matching ending brace is the first `}\b}' not
+       escaped by a backslash or within a quoted string,  and  not  within  an
+       embedded arithmetic expansion, command substitution, or paramter expan-
+       sion.
+
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br}
+              The value of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is substituted.  The braces are  required
+              when  _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br  is  a  positional  parameter with more than one
+              digit, or when _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is followed by a character which is not
+              to be interpreted as part of its name.
+
+       If the first character of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is an exclamation point, a level of
+       variable indirection is introduced.  B\bBa\bas\bsh\bh uses the value of  the  vari-
+       able  formed  from  the  rest of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br as the name of the variable;
+       this variable is then expanded and that value is used in  the  rest  of
+       the  substitution,  rather than the value of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br itself.  This is
+       known as _\bi_\bn_\bd_\bi_\br_\be_\bc_\bt _\be_\bx_\bp_\ba_\bn_\bs_\bi_\bo_\bn.  The exceptions to this are the expansions
+       of  ${!_\bp_\br_\be_\bf_\bi_\bx*} and ${!\b!_\bn_\ba_\bm_\be[_\b@]} described below.  The exclamation point
+       must immediately follow the left brace in order to  introduce  indirec-
+       tion.
+
+       In each of the cases below, _\bw_\bo_\br_\bd is subject to tilde expansion, parame-
+       ter expansion, command substitution, and  arithmetic  expansion.   When
+       not  performing substring expansion, b\bba\bas\bsh\bh tests for a parameter that is
+       unset or null; omitting the colon results in a test only for a  parame-
+       ter that is unset.
+
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br:\b:-\b-_\bw_\bo_\br_\bd}
+              U\bUs\bse\be  D\bDe\bef\bfa\bau\bul\blt\bt  V\bVa\bal\blu\bue\bes\bs.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is unset or null, the expan-
+              sion of _\bw_\bo_\br_\bd is substituted.  Otherwise, the value of  _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br
+              is substituted.
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br:\b:=\b=_\bw_\bo_\br_\bd}
+              A\bAs\bss\bsi\big\bgn\bn  D\bDe\bef\bfa\bau\bul\blt\bt  V\bVa\bal\blu\bue\bes\bs.   If  _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br  is  unset or null, the
+              expansion of _\bw_\bo_\br_\bd is assigned to _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br.  The value of _\bp_\ba_\br_\ba_\bm_\b-
+              _\be_\bt_\be_\br  is  then  substituted.   Positional parameters and special
+              parameters may not be assigned to in this way.
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br:\b:?\b?_\bw_\bo_\br_\bd}
+              D\bDi\bis\bsp\bpl\bla\bay\by E\bEr\brr\bro\bor\br i\bif\bf N\bNu\bul\bll\bl o\bor\br U\bUn\bns\bse\bet\bt.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is null or  unset,
+              the  expansion  of  _\bw_\bo_\br_\bd (or a message to that effect if _\bw_\bo_\br_\bd is
+              not present) is written to the standard error and the shell,  if
+              it is not interactive, exits.  Otherwise, the value of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br
+              is substituted.
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br:\b:+\b+_\bw_\bo_\br_\bd}
+              U\bUs\bse\be A\bAl\blt\bte\ber\brn\bna\bat\bte\be V\bVa\bal\blu\bue\be.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is null or unset, nothing  is
+              substituted, otherwise the expansion of _\bw_\bo_\br_\bd is substituted.
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br:\b:_\bo_\bf_\bf_\bs_\be_\bt}
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br:\b:_\bo_\bf_\bf_\bs_\be_\bt:\b:_\bl_\be_\bn_\bg_\bt_\bh}
+              S\bSu\bub\bbs\bst\btr\bri\bin\bng\bg  E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn.\b.   Expands  to  up  to _\bl_\be_\bn_\bg_\bt_\bh characters of
+              _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br starting at the character  specified  by  _\bo_\bf_\bf_\bs_\be_\bt.   If
+              _\bl_\be_\bn_\bg_\bt_\bh  is omitted, expands to the substring of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br start-
+              ing at the character specified by _\bo_\bf_\bf_\bs_\be_\bt.  _\bl_\be_\bn_\bg_\bt_\bh and _\bo_\bf_\bf_\bs_\be_\bt are
+              arithmetic   expressions   (see  A\bAR\bRI\bIT\bTH\bHM\bME\bET\bTI\bIC\bC  E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN  below).
+              _\bl_\be_\bn_\bg_\bt_\bh must evaluate to a number greater than or equal to  zero.
+              If  _\bo_\bf_\bf_\bs_\be_\bt  evaluates  to  a number less than zero, the value is
+              used as an offset from the end of the value  of  _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br.   If
+              _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br  is  @\b@,  the  result  is  _\bl_\be_\bn_\bg_\bt_\bh positional parameters
+              beginning at _\bo_\bf_\bf_\bs_\be_\bt.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is an array name indexed by @
+              or  *,  the  result is the _\bl_\be_\bn_\bg_\bt_\bh members of the array beginning
+              with ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br[_\bo_\bf_\bf_\bs_\be_\bt]}.   Substring  indexing  is  zero-based
+              unless  the  positional  parameters  are used, in which case the
+              indexing starts at 1.
+
+       ${!\b!_\bp_\br_\be_\bf_\bi_\bx*\b*}
+       ${!\b!_\bp_\br_\be_\bf_\bi_\bx@\b@}
+              Expands to the names of variables whose names begin with _\bp_\br_\be_\bf_\bi_\bx,
+              separated by the first character of the I\bIF\bFS\bS special variable.
+
+       ${!\b!_\bn_\ba_\bm_\be[_\b@]}
+       ${!\b!_\bn_\ba_\bm_\be[_\b*]}
+              If  _\bn_\ba_\bm_\be  is  an  array  variable,  expands to the list of array
+              indices (keys) assigned in _\bn_\ba_\bm_\be.   If  _\bn_\ba_\bm_\be  is  not  an  array,
+              expands  to 0 if _\bn_\ba_\bm_\be is set and null otherwise.  When _\b@ is used
+              and the expansion appears within double quotes, each key expands
+              to a separate word.
+
+       ${#\b#_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br}
+              The  length  in  characters of the value of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is substi-
+              tuted.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is *\b* or @\b@, the  value  substituted  is  the
+              number  of positional parameters.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is an array name
+              subscripted by *\b* or @\b@, the value substituted is  the  number  of
+              elements in the array.
+
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br#\b#_\bw_\bo_\br_\bd}
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br#\b##\b#_\bw_\bo_\br_\bd}
+              The  _\bw_\bo_\br_\bd  is  expanded to produce a pattern just as in pathname
+              expansion.  If the pattern matches the beginning of the value of
+              _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br,  then  the  result  of  the expansion is the expanded
+              value of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br with the shortest matching pattern (the ``#\b#''
+              case) or the longest matching pattern (the ``#\b##\b#'' case) deleted.
+              If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is @\b@ or *\b*, the pattern removal operation is applied
+              to  each  positional parameter in turn, and the expansion is the
+              resultant list.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is an array  variable  subscripted
+              with  @\b@  or  *\b*, the pattern removal operation is applied to each
+              member of the array in turn, and the expansion is the  resultant
+              list.
+
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br%\b%_\bw_\bo_\br_\bd}
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br%\b%%\b%_\bw_\bo_\br_\bd}
+              The  _\bw_\bo_\br_\bd  is  expanded to produce a pattern just as in pathname
+              expansion.  If the pattern matches a  trailing  portion  of  the
+              expanded value of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br, then the result of the expansion is
+              the expanded value of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br with the shortest matching  pat-
+              tern  (the  ``%\b%''  case)  or  the  longest matching pattern (the
+              ``%\b%%\b%'' case) deleted.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br  is  @\b@  or  *\b*,  the  pattern
+              removal  operation  is  applied  to each positional parameter in
+              turn, and the expansion is the resultant list.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br  is
+              an  array  variable subscripted with @\b@ or *\b*, the pattern removal
+              operation is applied to each member of the array  in  turn,  and
+              the expansion is the resultant list.
+
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br/\b/_\bp_\ba_\bt_\bt_\be_\br_\bn/\b/_\bs_\bt_\br_\bi_\bn_\bg}
+       ${_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br/\b//\b/_\bp_\ba_\bt_\bt_\be_\br_\bn/\b/_\bs_\bt_\br_\bi_\bn_\bg}
+              The _\bp_\ba_\bt_\bt_\be_\br_\bn is expanded to produce a pattern just as in pathname
+              expansion.  _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br is expanded and the longest match of  _\bp_\ba_\bt_\b-
+              _\bt_\be_\br_\bn  against  its  value is replaced with _\bs_\bt_\br_\bi_\bn_\bg.  In the first
+              form, only the first match is replaced.  The second form  causes
+              all  matches  of _\bp_\ba_\bt_\bt_\be_\br_\bn to be replaced with _\bs_\bt_\br_\bi_\bn_\bg.  If _\bp_\ba_\bt_\bt_\be_\br_\bn
+              begins with #\b#, it must match at the beginning  of  the  expanded
+              value  of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br.  If _\bp_\ba_\bt_\bt_\be_\br_\bn begins with %\b%, it must match at
+              the end of the expanded value of _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br.  If _\bs_\bt_\br_\bi_\bn_\bg is  null,
+              matches  of  _\bp_\ba_\bt_\bt_\be_\br_\bn are deleted and the /\b/ following _\bp_\ba_\bt_\bt_\be_\br_\bn may
+              be omitted.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is @\b@ or *\b*, the substitution  operation
+              is  applied to each positional parameter in turn, and the expan-
+              sion is the resultant list.  If _\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br is an  array  variable
+              subscripted  with  @\b@ or *\b*, the substitution operation is applied
+              to each member of the array in turn, and the  expansion  is  the
+              resultant list.
+
+   C\bCo\bom\bmm\bma\ban\bnd\bd S\bSu\bub\bbs\bst\bti\bit\btu\but\bti\bio\bon\bn
+       _\bC_\bo_\bm_\bm_\ba_\bn_\bd _\bs_\bu_\bb_\bs_\bt_\bi_\bt_\bu_\bt_\bi_\bo_\bn allows the output of a command to replace the com-
+       mand name.  There are two forms:
+
+
+              $\b$(\b(_\bc_\bo_\bm_\bm_\ba_\bn_\bd)\b)
+       or
+              `\b`_\bc_\bo_\bm_\bm_\ba_\bn_\bd`\b`
+
+       B\bBa\bas\bsh\bh performs the expansion by executing _\bc_\bo_\bm_\bm_\ba_\bn_\bd and replacing the com-
+       mand  substitution  with  the  standard output of the command, with any
+       trailing newlines deleted.  Embedded newlines are not deleted, but they
+       may  be  removed during word splitting.  The command substitution $\b$(\b(c\bca\bat\bt
+       _\bf_\bi_\bl_\be)\b) can be replaced by the equivalent but faster $\b$(\b(<\b< _\bf_\bi_\bl_\be)\b).
+
+       When the old-style backquote form of substitution  is  used,  backslash
+       retains  its  literal  meaning except when followed by $\b$, `\b`, or \\b\.  The
+       first backquote not preceded by a backslash terminates the command sub-
+       stitution.   When using the $(_\bc_\bo_\bm_\bm_\ba_\bn_\bd) form, all characters between the
+       parentheses make up the command; none are treated specially.
+
+       Command substitutions may be nested.  To nest when using the backquoted
+       form, escape the inner backquotes with backslashes.
+
+       If  the  substitution  appears within double quotes, word splitting and
+       pathname expansion are not performed on the results.
+
+   A\bAr\bri\bit\bth\bhm\bme\bet\bti\bic\bc E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn
+       Arithmetic expansion allows the evaluation of an arithmetic  expression
+       and  the  substitution of the result.  The format for arithmetic expan-
+       sion is:
+
+              $\b$(\b((\b(_\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn)\b))\b)
+
+       The _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn is treated as if it were within  double  quotes,  but  a
+       double  quote  inside  the  parentheses  is not treated specially.  All
+       tokens in the expression undergo parameter expansion, string expansion,
+       command  substitution, and quote removal.  Arithmetic expansions may be
+       nested.
+
+       The evaluation is performed according to the rules listed  below  under
+       A\bAR\bRI\bIT\bTH\bHM\bME\bET\bTI\bIC\bC E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN.  If _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn is invalid, b\bba\bas\bsh\bh prints a message
+       indicating failure and no substitution occurs.
+
+   P\bPr\bro\boc\bce\bes\bss\bs S\bSu\bub\bbs\bst\bti\bit\btu\but\bti\bio\bon\bn
+       _\bP_\br_\bo_\bc_\be_\bs_\bs _\bs_\bu_\bb_\bs_\bt_\bi_\bt_\bu_\bt_\bi_\bo_\bn is supported on systems that support  named  pipes
+       (_\bF_\bI_\bF_\bO_\bs)  or the /\b/d\bde\bev\bv/\b/f\bfd\bd method of naming open files.  It takes the form
+       of <\b<(\b(_\bl_\bi_\bs_\bt)\b) or >\b>(\b(_\bl_\bi_\bs_\bt)\b).  The process _\bl_\bi_\bs_\bt is run with its input or  out-
+       put connected to a _\bF_\bI_\bF_\bO or some file in /\b/d\bde\bev\bv/\b/f\bfd\bd.  The name of this file
+       is passed as an argument to the current command as the  result  of  the
+       expansion.   If the >\b>(\b(_\bl_\bi_\bs_\bt)\b) form is used, writing to the file will pro-
+       vide input for _\bl_\bi_\bs_\bt.  If the <\b<(\b(_\bl_\bi_\bs_\bt)\b) form is used, the file  passed  as
+       an argument should be read to obtain the output of _\bl_\bi_\bs_\bt.
+
+       When  available,  process substitution is performed simultaneously with
+       parameter and variable expansion, command substitution, and  arithmetic
+       expansion.
+
+   W\bWo\bor\brd\bd S\bSp\bpl\bli\bit\btt\bti\bin\bng\bg
+       The  shell  scans the results of parameter expansion, command substitu-
+       tion, and arithmetic expansion that did not occur within double  quotes
+       for _\bw_\bo_\br_\bd _\bs_\bp_\bl_\bi_\bt_\bt_\bi_\bn_\bg.
+
+       The  shell  treats each character of I\bIF\bFS\bS as a delimiter, and splits the
+       results of the other expansions into words on these characters.  If I\bIF\bFS\bS
+       is  unset,  or its value is exactly <\b<s\bsp\bpa\bac\bce\be>\b><\b<t\bta\bab\bb>\b><\b<n\bne\bew\bwl\bli\bin\bne\be>\b>, the default,
+       then any sequence of I\bIF\bFS\bS characters serves to delimit  words.   If  I\bIF\bFS\bS
+       has  a  value  other than the default, then sequences of the whitespace
+       characters s\bsp\bpa\bac\bce\be and t\bta\bab\bb are ignored at the beginning and  end  of  the
+       word,  as  long  as the whitespace character is in the value of I\bIF\bFS\bS (an
+       I\bIF\bFS\bS whitespace character).  Any  character  in  I\bIF\bFS\bS  that  is  not  I\bIF\bFS\bS
+       whitespace, along with any adjacent I\bIF\bFS\bS whitespace characters, delimits
+       a field.  A sequence of I\bIF\bFS\bS whitespace characters is also treated as  a
+       delimiter.  If the value of I\bIF\bFS\bS is null, no word splitting occurs.
+
+       Explicit  null  arguments  ("\b""\b"  or '\b''\b') are retained.  Unquoted implicit
+       null arguments, resulting from the expansion of parameters that have no
+       values,  are  removed.  If a parameter with no value is expanded within
+       double quotes, a null argument results and is retained.
+
+       Note that if no expansion occurs, no splitting is performed.
+
+   P\bPa\bat\bth\bhn\bna\bam\bme\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn
+       After word splitting, unless the -\b-f\bf option has  been  set,  b\bba\bas\bsh\bh  scans
+       each  word  for the characters *\b*, ?\b?, and [\b[.  If one of these characters
+       appears, then the word is regarded as a _\bp_\ba_\bt_\bt_\be_\br_\bn, and replaced  with  an
+       alphabetically  sorted  list of file names matching the pattern.  If no
+       matching file names are found, and the shell option  n\bnu\bul\bll\blg\bgl\blo\bob\bb  is  dis-
+       abled,  the word is left unchanged.  If the n\bnu\bul\bll\blg\bgl\blo\bob\bb option is set, and
+       no matches are found, the word  is  removed.   If  the  f\bfa\bai\bil\blg\bgl\blo\bob\bb  shell
+       option  is  set,  and no matches are found, an error message is printed
+       and the command is not executed.  If the  shell  option  n\bno\boc\bca\bas\bse\beg\bgl\blo\bob\bb  is
+       enabled,  the  match  is performed without regard to the case of alpha-
+       betic characters.  When a pattern is used for pathname  expansion,  the
+       character  `\b``\b`.\b.'\b''\b'   at  the  start  of a name or immediately following a
+       slash must be matched explicitly, unless the shell  option  d\bdo\bot\btg\bgl\blo\bob\bb  is
+       set.   When  matching  a  pathname,  the slash character must always be
+       matched explicitly.  In  other  cases,  the  `\b``\b`.\b.'\b''\b'   character  is  not
+       treated  specially.   See  the  description  of s\bsh\bho\bop\bpt\bt below under S\bSH\bHE\bEL\bLL\bL
+       B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS for a description of the n\bno\boc\bca\bas\bse\beg\bgl\blo\bob\bb,  n\bnu\bul\bll\blg\bgl\blo\bob\bb,  f\bfa\bai\bil\bl-\b-
+       g\bgl\blo\bob\bb, and d\bdo\bot\btg\bgl\blo\bob\bb shell options.
+
+       The  G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE  shell variable may be used to restrict the set of file
+       names matching a _\bp_\ba_\bt_\bt_\be_\br_\bn.  If G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE is  set,  each  matching  file
+       name  that  also  matches  one of the patterns in G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE is removed
+       from the list of matches.  The file names `\b``\b`.\b.'\b''\b'  and `\b``\b`.\b..\b.'\b''\b'  are always
+       ignored  when G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE is set and not null.  However, setting G\bGL\bLO\bOB\bBI\bIG\bG-\b-
+       N\bNO\bOR\bRE\bE to a non-null value has the effect of enabling the  d\bdo\bot\btg\bgl\blo\bob\bb  shell
+       option, so all other file names beginning with a `\b``\b`.\b.'\b''\b'  will match.  To
+       get the old behavior of ignoring file names  beginning  with  a  `\b``\b`.\b.'\b''\b',
+       make  `\b``\b`.\b.*\b*'\b''\b'  one of the patterns in G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE.  The d\bdo\bot\btg\bgl\blo\bob\bb option is
+       disabled when G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE is unset.
+
+       P\bPa\bat\btt\bte\ber\brn\bn M\bMa\bat\btc\bch\bhi\bin\bng\bg
+
+       Any character that appears in a pattern, other than the special pattern
+       characters  described below, matches itself.  The NUL character may not
+       occur in a pattern.  A backslash escapes the following  character;  the
+       escaping  backslash  is  discarded  when matching.  The special pattern
+       characters must be quoted if they are to be matched literally.
+
+       The special pattern characters have the following meanings:
+
+       *\b*      Matches any string, including the null string.
+       ?\b?      Matches any single character.
+       [\b[.\b..\b..\b.]\b]  Matches any one of the enclosed characters.  A pair  of  charac-
+              ters separated by a hyphen denotes a _\br_\ba_\bn_\bg_\be _\be_\bx_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn; any char-
+              acter that sorts between those two characters, inclusive,  using
+              the  current  locale's  collating sequence and character set, is
+              matched.  If the first character following the [\b[ is a !\b!  or a  ^\b^
+              then  any  character not enclosed is matched.  The sorting order
+              of characters in range expressions is determined by the  current
+              locale  and  the value of the L\bLC\bC_\b_C\bCO\bOL\bLL\bLA\bAT\bTE\bE shell variable, if set.
+              A -\b- may be matched by including it as the first or last  charac-
+              ter in the set.  A ]\b] may be matched by including it as the first
+              character in the set.
+
+              Within [\b[ and ]\b], _\bc_\bh_\ba_\br_\ba_\bc_\bt_\be_\br _\bc_\bl_\ba_\bs_\bs_\be_\bs can  be  specified  using  the
+              syntax  [\b[:\b:_\bc_\bl_\ba_\bs_\bs:\b:]\b],  where  _\bc_\bl_\ba_\bs_\bs is one of the following classes
+              defined in the POSIX.2 standard:
+              a\bal\bln\bnu\bum\bm a\bal\blp\bph\bha\ba a\bas\bsc\bci\bii\bi b\bbl\bla\ban\bnk\bk c\bcn\bnt\btr\brl\bl  d\bdi\big\bgi\bit\bt  g\bgr\bra\bap\bph\bh  l\blo\bow\bwe\ber\br  p\bpr\bri\bin\bnt\bt  p\bpu\bun\bnc\bct\bt
+              s\bsp\bpa\bac\bce\be u\bup\bpp\bpe\ber\br w\bwo\bor\brd\bd x\bxd\bdi\big\bgi\bit\bt
+              A character class matches any character belonging to that class.
+              The w\bwo\bor\brd\bd character class matches letters, digits, and the  char-
+              acter _.
+
+              Within  [\b[ and ]\b], an _\be_\bq_\bu_\bi_\bv_\ba_\bl_\be_\bn_\bc_\be _\bc_\bl_\ba_\bs_\bs can be specified using the
+              syntax [\b[=\b=_\bc=\b=]\b], which matches all characters with the same  colla-
+              tion  weight (as defined by the current locale) as the character
+              _\bc.
+
+              Within [\b[ and ]\b], the syntax [\b[.\b._\bs_\by_\bm_\bb_\bo_\bl.\b.]\b] matches the collating sym-
+              bol _\bs_\by_\bm_\bb_\bo_\bl.
+
+       If the e\bex\bxt\btg\bgl\blo\bob\bb shell option is enabled using the s\bsh\bho\bop\bpt\bt builtin, several
+       extended pattern matching operators are recognized.  In  the  following
+       description, a _\bp_\ba_\bt_\bt_\be_\br_\bn_\b-_\bl_\bi_\bs_\bt is a list of one or more patterns separated
+       by a |\b|.  Composite patterns may be formed using one or more of the fol-
+       lowing sub-patterns:
+
+              ?\b?(\b(_\bp_\ba_\bt_\bt_\be_\br_\bn_\b-_\bl_\bi_\bs_\bt)\b)
+                     Matches zero or one occurrence of the given patterns
+              *\b*(\b(_\bp_\ba_\bt_\bt_\be_\br_\bn_\b-_\bl_\bi_\bs_\bt)\b)
+                     Matches zero or more occurrences of the given patterns
+              +\b+(\b(_\bp_\ba_\bt_\bt_\be_\br_\bn_\b-_\bl_\bi_\bs_\bt)\b)
+                     Matches one or more occurrences of the given patterns
+              @\b@(\b(_\bp_\ba_\bt_\bt_\be_\br_\bn_\b-_\bl_\bi_\bs_\bt)\b)
+                     Matches exactly one of the given patterns
+              !\b!(\b(_\bp_\ba_\bt_\bt_\be_\br_\bn_\b-_\bl_\bi_\bs_\bt)\b)
+                     Matches anything except one of the given patterns
+
+   Q\bQu\buo\bot\bte\be R\bRe\bem\bmo\bov\bva\bal\bl
+       After the preceding expansions, all unquoted occurrences of the charac-
+       ters \\b\, '\b', and "\b" that did not result from one of the  above  expansions
+       are removed.
+
+R\bRE\bED\bDI\bIR\bRE\bEC\bCT\bTI\bIO\bON\bN
+       Before  a  command  is executed, its input and output may be _\br_\be_\bd_\bi_\br_\be_\bc_\bt_\be_\bd
+       using a special notation interpreted by  the  shell.   Redirection  may
+       also  be  used  to open and close files for the current shell execution
+       environment.  The following redirection operators may precede or appear
+       anywhere within a _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd or may follow a _\bc_\bo_\bm_\bm_\ba_\bn_\bd.  Redirections
+       are processed in the order they appear, from left to right.
+
+       In the following descriptions, if the file descriptor number  is  omit-
+       ted,  and  the  first  character  of the redirection operator is <\b<, the
+       redirection refers to the standard input (file descriptor 0).   If  the
+       first  character  of  the  redirection  operator  is >\b>, the redirection
+       refers to the standard output (file descriptor 1).
+
+       The word following the redirection operator in the  following  descrip-
+       tions,  unless  otherwise noted, is subjected to brace expansion, tilde
+       expansion, parameter expansion, command substitution, arithmetic expan-
+       sion,  quote  removal,  pathname  expansion, and word splitting.  If it
+       expands to more than one word, b\bba\bas\bsh\bh reports an error.
+
+       Note that the order of redirections is significant.  For  example,  the
+       command
+
+              ls >\b> dirlist 2>\b>&\b&1
+
+       directs  both  standard  output and standard error to the file _\bd_\bi_\br_\bl_\bi_\bs_\bt,
+       while the command
+
+              ls 2>\b>&\b&1 >\b> dirlist
+
+       directs only the standard output to file _\bd_\bi_\br_\bl_\bi_\bs_\bt, because the  standard
+       error  was duplicated as standard output before the standard output was
+       redirected to _\bd_\bi_\br_\bl_\bi_\bs_\bt.
+
+       B\bBa\bas\bsh\bh handles several filenames specially when they are used in redirec-
+       tions, as described in the following table:
+
+              /\b/d\bde\bev\bv/\b/f\bfd\bd/\b/_\bf_\bd
+                     If  _\bf_\bd  is  a valid integer, file descriptor _\bf_\bd is dupli-
+                     cated.
+              /\b/d\bde\bev\bv/\b/s\bst\btd\bdi\bin\bn
+                     File descriptor 0 is duplicated.
+              /\b/d\bde\bev\bv/\b/s\bst\btd\bdo\bou\but\bt
+                     File descriptor 1 is duplicated.
+              /\b/d\bde\bev\bv/\b/s\bst\btd\bde\ber\brr\br
+                     File descriptor 2 is duplicated.
+              /\b/d\bde\bev\bv/\b/t\btc\bcp\bp/\b/_\bh_\bo_\bs_\bt/\b/_\bp_\bo_\br_\bt
+                     If _\bh_\bo_\bs_\bt is a valid hostname or Internet address, and _\bp_\bo_\br_\bt
+                     is  an integer port number or service name, b\bba\bas\bsh\bh attempts
+                     to open a TCP connection to the corresponding socket.
+              /\b/d\bde\bev\bv/\b/u\bud\bdp\bp/\b/_\bh_\bo_\bs_\bt/\b/_\bp_\bo_\br_\bt
+                     If _\bh_\bo_\bs_\bt is a valid hostname or Internet address, and _\bp_\bo_\br_\bt
+                     is  an integer port number or service name, b\bba\bas\bsh\bh attempts
+                     to open a UDP connection to the corresponding socket.
+
+       A failure to open or create a file causes the redirection to fail.
+
+   R\bRe\bed\bdi\bir\bre\bec\bct\bti\bin\bng\bg I\bIn\bnp\bpu\but\bt
+       Redirection of input causes the file whose name results from the expan-
+       sion  of  _\bw_\bo_\br_\bd  to  be  opened for reading on file descriptor _\bn, or the
+       standard input (file descriptor 0) if _\bn is not specified.
+
+       The general format for redirecting input is:
+
+              [_\bn]<\b<_\bw_\bo_\br_\bd
+
+   R\bRe\bed\bdi\bir\bre\bec\bct\bti\bin\bng\bg O\bOu\but\btp\bpu\but\bt
+       Redirection of output causes the  file  whose  name  results  from  the
+       expansion of _\bw_\bo_\br_\bd to be opened for writing on file descriptor _\bn, or the
+       standard output (file descriptor 1) if _\bn is not specified.  If the file
+       does  not exist it is created; if it does exist it is truncated to zero
+       size.
+
+       The general format for redirecting output is:
+
+              [_\bn]>\b>_\bw_\bo_\br_\bd
+
+       If the redirection operator is >\b>, and the n\bno\boc\bcl\blo\bob\bbb\bbe\ber\br option to  the  s\bse\bet\bt
+       builtin  has  been enabled, the redirection will fail if the file whose
+       name results from the expansion of _\bw_\bo_\br_\bd exists and is a  regular  file.
+       If the redirection operator is >\b>|\b|, or the redirection operator is >\b> and
+       the n\bno\boc\bcl\blo\bob\bbb\bbe\ber\br option to the s\bse\bet\bt builtin command  is  not  enabled,  the
+       redirection is attempted even if the file named by _\bw_\bo_\br_\bd exists.
+
+   A\bAp\bpp\bpe\ben\bnd\bdi\bin\bng\bg R\bRe\bed\bdi\bir\bre\bec\bct\bte\bed\bd O\bOu\but\btp\bpu\but\bt
+       Redirection  of  output  in  this  fashion  causes  the file whose name
+       results from the expansion of _\bw_\bo_\br_\bd to be opened for appending  on  file
+       descriptor  _\bn,  or  the standard output (file descriptor 1) if _\bn is not
+       specified.  If the file does not exist it is created.
+
+       The general format for appending output is:
+
+              [_\bn]>\b>>\b>_\bw_\bo_\br_\bd
+
+
+   R\bRe\bed\bdi\bir\bre\bec\bct\bti\bin\bng\bg S\bSt\bta\ban\bnd\bda\bar\brd\bd O\bOu\but\btp\bpu\but\bt a\ban\bnd\bd S\bSt\bta\ban\bnd\bda\bar\brd\bd E\bEr\brr\bro\bor\br
+       B\bBa\bas\bsh\bh allows both the standard output (file descriptor 1) and the  stan-
+       dard  error  output  (file  descriptor  2) to be redirected to the file
+       whose name is the expansion of _\bw_\bo_\br_\bd with this construct.
+
+       There are two formats for  redirecting  standard  output  and  standard
+       error:
+
+              &\b&>\b>_\bw_\bo_\br_\bd
+       and
+              >\b>&\b&_\bw_\bo_\br_\bd
+
+       Of the two forms, the first is preferred.  This is semantically equiva-
+       lent to
+
+              >\b>_\bw_\bo_\br_\bd 2>\b>&\b&1
+
+   H\bHe\ber\bre\be D\bDo\boc\bcu\bum\bme\ben\bnt\bts\bs
+       This type of redirection instructs the shell to  read  input  from  the
+       current  source  until  a  line  containing only _\bw_\bo_\br_\bd (with no trailing
+       blanks) is seen.  All of the lines read up to that point are then  used
+       as the standard input for a command.
+
+       The format of here-documents is:
+
+              <\b<<\b<[-\b-]_\bw_\bo_\br_\bd
+                      _\bh_\be_\br_\be_\b-_\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt
+              _\bd_\be_\bl_\bi_\bm_\bi_\bt_\be_\br
+
+       No  parameter expansion, command substitution, arithmetic expansion, or
+       pathname expansion is performed on _\bw_\bo_\br_\bd.  If any characters in _\bw_\bo_\br_\bd are
+       quoted,  the  _\bd_\be_\bl_\bi_\bm_\bi_\bt_\be_\br is the result of quote removal on _\bw_\bo_\br_\bd, and the
+       lines in the here-document are not expanded.  If _\bw_\bo_\br_\bd is unquoted,  all
+       lines  of  the here-document are subjected to parameter expansion, com-
+       mand substitution, and arithmetic expansion.  In the latter  case,  the
+       character  sequence  \\b\<\b<n\bne\bew\bwl\bli\bin\bne\be>\b> is ignored, and \\b\ must be used to quote
+       the characters \\b\, $\b$, and `\b`.
+
+       If the redirection operator is <\b<<\b<-\b-, then all leading tab characters are
+       stripped  from  input  lines  and  the line containing _\bd_\be_\bl_\bi_\bm_\bi_\bt_\be_\br.  This
+       allows here-documents within shell scripts to be indented in a  natural
+       fashion.
+
+   H\bHe\ber\bre\be S\bSt\btr\bri\bin\bng\bgs\bs
+       A variant of here documents, the format is:
+
+              <\b<<\b<<\b<_\bw_\bo_\br_\bd
+
+       The _\bw_\bo_\br_\bd is expanded and supplied to the command on its standard input.
+
+   D\bDu\bup\bpl\bli\bic\bca\bat\bti\bin\bng\bg F\bFi\bil\ble\be D\bDe\bes\bsc\bcr\bri\bip\bpt\bto\bor\brs\bs
+       The redirection operator
+
+              [_\bn]<\b<&\b&_\bw_\bo_\br_\bd
+
+       is used to duplicate input file descriptors.  If _\bw_\bo_\br_\bd expands to one or
+       more  digits,  the file descriptor denoted by _\bn is made to be a copy of
+       that file descriptor.  If the digits in _\bw_\bo_\br_\bd  do  not  specify  a  file
+       descriptor  open for input, a redirection error occurs.  If _\bw_\bo_\br_\bd evalu-
+       ates to -\b-, file descriptor _\bn is closed.  If _\bn  is  not  specified,  the
+       standard input (file descriptor 0) is used.
+
+       The operator
+
+              [_\bn]>\b>&\b&_\bw_\bo_\br_\bd
+
+       is  used  similarly  to duplicate output file descriptors.  If _\bn is not
+       specified, the standard output (file descriptor 1)  is  used.   If  the
+       digits  in  _\bw_\bo_\br_\bd  do  not  specify a file descriptor open for output, a
+       redirection error occurs.  As a special case, if _\bn is omitted, and _\bw_\bo_\br_\bd
+       does not expand to one or more digits, the standard output and standard
+       error are redirected as described previously.
+
+   M\bMo\bov\bvi\bin\bng\bg F\bFi\bil\ble\be D\bDe\bes\bsc\bcr\bri\bip\bpt\bto\bor\brs\bs
+       The redirection operator
+
+              [_\bn]<\b<&\b&_\bd_\bi_\bg_\bi_\bt-\b-
+
+       moves the file descriptor _\bd_\bi_\bg_\bi_\bt to file descriptor _\bn, or  the  standard
+       input (file descriptor 0) if _\bn is not specified.  _\bd_\bi_\bg_\bi_\bt is closed after
+       being duplicated to _\bn.
+
+       Similarly, the redirection operator
+
+              [_\bn]>\b>&\b&_\bd_\bi_\bg_\bi_\bt-\b-
+
+       moves the file descriptor _\bd_\bi_\bg_\bi_\bt to file descriptor _\bn, or  the  standard
+       output (file descriptor 1) if _\bn is not specified.
+
+   O\bOp\bpe\ben\bni\bin\bng\bg F\bFi\bil\ble\be D\bDe\bes\bsc\bcr\bri\bip\bpt\bto\bor\brs\bs f\bfo\bor\br R\bRe\bea\bad\bdi\bin\bng\bg a\ban\bnd\bd W\bWr\bri\bit\bti\bin\bng\bg
+       The redirection operator
+
+              [_\bn]<\b<>\b>_\bw_\bo_\br_\bd
+
+       causes  the  file  whose name is the expansion of _\bw_\bo_\br_\bd to be opened for
+       both reading and writing on file descriptor _\bn, or on file descriptor  0
+       if _\bn is not specified.  If the file does not exist, it is created.
+
+A\bAL\bLI\bIA\bAS\bSE\bES\bS
+       _\bA_\bl_\bi_\ba_\bs_\be_\bs  allow a string to be substituted for a word when it is used as
+       the first word of a simple command.  The  shell  maintains  a  list  of
+       aliases  that  may  be set and unset with the a\bal\bli\bia\bas\bs and u\bun\bna\bal\bli\bia\bas\bs builtin
+       commands (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).  The first  word  of  each
+       command,  if  unquoted,  is  checked to see if it has an alias.  If so,
+       that word is replaced by the text of the alias.  The alias name and the
+       replacement  text  may  contain  any  valid  shell input, including the
+       _\bm_\be_\bt_\ba_\bc_\bh_\ba_\br_\ba_\bc_\bt_\be_\br_\bs listed above, with the exception that the alias name may
+       not  contain  _\b=.   The first word of the replacement text is tested for
+       aliases, but a word that is identical to an alias being expanded is not
+       expanded a second time.  This means that one may alias l\bls\bs to l\bls\bs -\b-F\bF, for
+       instance, and b\bba\bas\bsh\bh does not try to recursively expand  the  replacement
+       text.   If  the  last character of the alias value is a _\bb_\bl_\ba_\bn_\bk, then the
+       next command word following the alias is also checked for alias  expan-
+       sion.
+
+       Aliases are created and listed with the a\bal\bli\bia\bas\bs command, and removed with
+       the u\bun\bna\bal\bli\bia\bas\bs command.
+
+       There is no mechanism for using arguments in the replacement text.   If
+       arguments  are  needed,  a shell function should be used (see F\bFU\bUN\bNC\bCT\bTI\bIO\bON\bNS\bS
+       below).
+
+       Aliases are not expanded when the shell is not interactive, unless  the
+       e\bex\bxp\bpa\ban\bnd\bd_\b_a\bal\bli\bia\bas\bse\bes\bs  shell option is set using s\bsh\bho\bop\bpt\bt (see the description of
+       s\bsh\bho\bop\bpt\bt under S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).
+
+       The rules concerning the definition and use  of  aliases  are  somewhat
+       confusing.   B\bBa\bas\bsh\bh  always  reads  at  least  one complete line of input
+       before executing any  of  the  commands  on  that  line.   Aliases  are
+       expanded  when  a command is read, not when it is executed.  Therefore,
+       an alias definition appearing on the same line as another command  does
+       not  take  effect  until  the next line of input is read.  The commands
+       following the alias definition on that line are not affected by the new
+       alias.   This  behavior  is  also an issue when functions are executed.
+       Aliases are expanded when a function definition is read, not  when  the
+       function  is  executed,  because a function definition is itself a com-
+       pound command.  As a consequence, aliases defined in a function are not
+       available  until  after  that function is executed.  To be safe, always
+       put alias definitions on a separate line, and do not use a\bal\bli\bia\bas\bs in  com-
+       pound commands.
+
+       For almost every purpose, aliases are superseded by shell functions.
+
+F\bFU\bUN\bNC\bCT\bTI\bIO\bON\bNS\bS
+       A  shell  function,  defined  as  described  above under S\bSH\bHE\bEL\bLL\bL G\bGR\bRA\bAM\bMM\bMA\bAR\bR,
+       stores a series of commands for later execution.  When the  name  of  a
+       shell  function  is used as a simple command name, the list of commands
+       associated with that function name is executed.  Functions are executed
+       in  the  context  of  the  current  shell; no new process is created to
+       interpret them (contrast this with the execution of  a  shell  script).
+       When  a  function is executed, the arguments to the function become the
+       positional parameters during its execution.  The special parameter #\b# is
+       updated  to  reflect  the change.  Positional parameter 0 is unchanged.
+       The first element of the F\bFU\bUN\bNC\bCN\bNA\bAM\bME\bE variable is set to the  name  of  the
+       function  while  the  function  is executing.  All other aspects of the
+       shell execution environment are identical between a  function  and  its
+       caller  with  the exception that the D\bDE\bEB\bBU\bUG\bG trap (see the description of
+       the t\btr\bra\bap\bp builtin under S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below) is  not  inherited
+       unless  the  function  has  been  given  the  t\btr\bra\bac\bce\be  attribute (see the
+       description of the d\bde\bec\bcl\bla\bar\bre\be builtin below) or  the  -\b-o\bo  f\bfu\bun\bnc\bct\btr\bra\bac\bce\be  shell
+       option  has  been enabled with the s\bse\bet\bt builtin (in which case all func-
+       tions inherit the D\bDE\bEB\bBU\bUG\bG trap).
+
+       Variables local to the function may be declared with the l\blo\boc\bca\bal\bl  builtin
+       command.  Ordinarily, variables and their values are shared between the
+       function and its caller.
+
+       If the builtin command r\bre\bet\btu\bur\brn\bn is executed in a function,  the  function
+       completes  and  execution resumes with the next command after the func-
+       tion call.  Any command associated with the  R\bRE\bET\bTU\bUR\bRN\bN  trap  is  executed
+       before execution resumes.  When a function completes, the values of the
+       positional parameters and the special parameter #\b# are restored  to  the
+       values they had prior to the function's execution.
+
+       Function  names and definitions may be listed with the -\b-f\bf option to the
+       d\bde\bec\bcl\bla\bar\bre\be or t\bty\byp\bpe\bes\bse\bet\bt builtin commands.  The -\b-F\bF option to d\bde\bec\bcl\bla\bar\bre\be or t\bty\byp\bpe\be-\b-
+       s\bse\bet\bt  will  list the function names only (and optionally the source file
+       and line number, if the e\bex\bxt\btd\bde\beb\bbu\bug\bg shell option is  enabled).   Functions
+       may  be exported so that subshells automatically have them defined with
+       the -\b-f\bf option to the e\bex\bxp\bpo\bor\brt\bt builtin.  Note  that  shell  functions  and
+       variables  with  the same name may result in multiple identically-named
+       entries in the environment passed to the shell's children.  Care should
+       be taken in cases where this may cause a problem.
+
+       Functions  may  be  recursive.   No  limit  is imposed on the number of
+       recursive calls.
+
+A\bAR\bRI\bIT\bTH\bHM\bME\bET\bTI\bIC\bC E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN
+       The shell allows arithmetic expressions to be evaluated, under  certain
+       circumstances  (see the l\ble\bet\bt and d\bde\bec\bcl\bla\bar\bre\be builtin commands and A\bAr\bri\bit\bth\bhm\bme\bet\bti\bic\bc
+       E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn).  Evaluation is done in fixed-width integers with  no  check
+       for  overflow, though division by 0 is trapped and flagged as an error.
+       The operators and their precedence, associativity, and values  are  the
+       same  as in the C language.  The following list of operators is grouped
+       into levels of equal-precedence operators.  The levels  are  listed  in
+       order of decreasing precedence.
+
+       _\bi_\bd+\b++\b+ _\bi_\bd-\b--\b-
+              variable post-increment and post-decrement
+       +\b++\b+_\bi_\bd -\b--\b-_\bi_\bd
+              variable pre-increment and pre-decrement
+       -\b- +\b+    unary minus and plus
+       !\b! ~\b~    logical and bitwise negation
+       *\b**\b*     exponentiation
+       *\b* /\b/ %\b%  multiplication, division, remainder
+       +\b+ -\b-    addition, subtraction
+       <\b<<\b< >\b>>\b>  left and right bitwise shifts
+       <\b<=\b= >\b>=\b= <\b< >\b>
+              comparison
+       =\b==\b= !\b!=\b=  equality and inequality
+       &\b&      bitwise AND
+       ^\b^      bitwise exclusive OR
+       |\b|      bitwise OR
+       &\b&&\b&     logical AND
+       |\b||\b|     logical OR
+       _\be_\bx_\bp_\br?\b?_\be_\bx_\bp_\br:\b:_\be_\bx_\bp_\br
+              conditional operator
+       =\b= *\b*=\b= /\b/=\b= %\b%=\b= +\b+=\b= -\b-=\b= <\b<<\b<=\b= >\b>>\b>=\b= &\b&=\b= ^\b^=\b= |\b|=\b=
+              assignment
+       _\be_\bx_\bp_\br_\b1 ,\b, _\be_\bx_\bp_\br_\b2
+              comma
+
+       Shell  variables  are  allowed as operands; parameter expansion is per-
+       formed before the expression is evaluated.  Within an expression, shell
+       variables  may  also  be referenced by name without using the parameter
+       expansion syntax.  A shell variable that is null or unset evaluates  to
+       0 when referenced by name without using the parameter expansion syntax.
+       The value of a variable is evaluated as an arithmetic  expression  when
+       it  is  referenced, or when a variable which has been given the _\bi_\bn_\bt_\be_\bg_\be_\br
+       attribute using d\bde\bec\bcl\bla\bar\bre\be -\b-i\bi is assigned a value.  A null value evaluates
+       to  0.   A shell variable need not have its integer attribute turned on
+       to be used in an expression.
+
+       Constants with a leading 0 are interpreted as octal numbers.  A leading
+       0x  or  0X  denotes  hexadecimal.   Otherwise,  numbers  take  the form
+       [_\bb_\ba_\bs_\be_\b#]n, where _\bb_\ba_\bs_\be is a decimal number between 2 and 64  representing
+       the arithmetic base, and _\bn is a number in that base.  If _\bb_\ba_\bs_\be_\b# is omit-
+       ted, then base 10 is used.  The digits greater than 9  are  represented
+       by  the  lowercase  letters,  the  uppercase letters, @, and _, in that
+       order.  If _\bb_\ba_\bs_\be is less than or equal to 36,  lowercase  and  uppercase
+       letters  may be used interchangably to represent numbers between 10 and
+       35.
+
+       Operators are evaluated in order  of  precedence.   Sub-expressions  in
+       parentheses  are  evaluated first and may override the precedence rules
+       above.
+
+C\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNA\bAL\bL E\bEX\bXP\bPR\bRE\bES\bSS\bSI\bIO\bON\bNS\bS
+       Conditional expressions are used by the [\b[[\b[  compound  command  and  the
+       t\bte\bes\bst\bt  and [\b[ builtin commands to test file attributes and perform string
+       and arithmetic comparisons.  Expressions are formed from the  following
+       unary  or  binary  primaries.   If any _\bf_\bi_\bl_\be argument to one of the pri-
+       maries is of the form _\b/_\bd_\be_\bv_\b/_\bf_\bd_\b/_\bn, then file descriptor _\bn is checked.  If
+       the  _\bf_\bi_\bl_\be  argument  to  one  of  the  primaries  is one of _\b/_\bd_\be_\bv_\b/_\bs_\bt_\bd_\bi_\bn,
+       _\b/_\bd_\be_\bv_\b/_\bs_\bt_\bd_\bo_\bu_\bt, or _\b/_\bd_\be_\bv_\b/_\bs_\bt_\bd_\be_\br_\br, file descriptor 0, 1, or 2,  respectively,
+       is checked.
+
+       -\b-a\ba _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists.
+       -\b-b\bb _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is a block special file.
+       -\b-c\bc _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is a character special file.
+       -\b-d\bd _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is a directory.
+       -\b-e\be _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists.
+       -\b-f\bf _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is a regular file.
+       -\b-g\bg _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is set-group-id.
+       -\b-h\bh _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is a symbolic link.
+       -\b-k\bk _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and its ``sticky'' bit is set.
+       -\b-p\bp _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is a named pipe (FIFO).
+       -\b-r\br _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is readable.
+       -\b-s\bs _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and has a size greater than zero.
+       -\b-t\bt _\bf_\bd  True if file descriptor _\bf_\bd is open and refers to a terminal.
+       -\b-u\bu _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and its set-user-id bit is set.
+       -\b-w\bw _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is writable.
+       -\b-x\bx _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is executable.
+       -\b-O\bO _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is owned by the effective user id.
+       -\b-G\bG _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is owned by the effective group id.
+       -\b-L\bL _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is a symbolic link.
+       -\b-S\bS _\bf_\bi_\bl_\be
+              True if _\bf_\bi_\bl_\be exists and is a socket.
+       -\b-N\bN _\bf_\bi_\bl_\be
+              True  if  _\bf_\bi_\bl_\be  exists  and  has been modified since it was last
+              read.
+       _\bf_\bi_\bl_\be_\b1 -n\bnt\bt _\bf_\bi_\bl_\be_\b2
+              True if _\bf_\bi_\bl_\be_\b1 is newer (according  to  modification  date)  than
+              _\bf_\bi_\bl_\be_\b2, or if _\bf_\bi_\bl_\be_\b1 exists and _\bf_\bi_\bl_\be_\b2 does not.
+       _\bf_\bi_\bl_\be_\b1 -o\bot\bt _\bf_\bi_\bl_\be_\b2
+              True  if _\bf_\bi_\bl_\be_\b1 is older than _\bf_\bi_\bl_\be_\b2, or if _\bf_\bi_\bl_\be_\b2 exists and _\bf_\bi_\bl_\be_\b1
+              does not.
+       _\bf_\bi_\bl_\be_\b1 -\b-e\bef\bf _\bf_\bi_\bl_\be_\b2
+              True if _\bf_\bi_\bl_\be_\b1 and _\bf_\bi_\bl_\be_\b2 refer to the same device and inode  num-
+              bers.
+       -\b-o\bo _\bo_\bp_\bt_\bn_\ba_\bm_\be
+              True  if  shell  option  _\bo_\bp_\bt_\bn_\ba_\bm_\be  is  enabled.   See the list of
+              options under the description  of  the  -\b-o\bo  option  to  the  s\bse\bet\bt
+              builtin below.
+       -\b-z\bz _\bs_\bt_\br_\bi_\bn_\bg
+              True if the length of _\bs_\bt_\br_\bi_\bn_\bg is zero.
+       -\b-n\bn _\bs_\bt_\br_\bi_\bn_\bg
+       _\bs_\bt_\br_\bi_\bn_\bg True if the length of _\bs_\bt_\br_\bi_\bn_\bg is non-zero.
+       _\bs_\bt_\br_\bi_\bn_\bg_\b1 =\b==\b= _\bs_\bt_\br_\bi_\bn_\bg_\b2
+              True if the strings are equal.  =\b= may be used in place of =\b==\b= for
+              strict POSIX compliance.
+       _\bs_\bt_\br_\bi_\bn_\bg_\b1 !\b!=\b= _\bs_\bt_\br_\bi_\bn_\bg_\b2
+              True if the strings are not equal.
+       _\bs_\bt_\br_\bi_\bn_\bg_\b1 <\b< _\bs_\bt_\br_\bi_\bn_\bg_\b2
+              True if _\bs_\bt_\br_\bi_\bn_\bg_\b1 sorts before _\bs_\bt_\br_\bi_\bn_\bg_\b2  lexicographically  in  the
+              current locale.
+       _\bs_\bt_\br_\bi_\bn_\bg_\b1 >\b> _\bs_\bt_\br_\bi_\bn_\bg_\b2
+              True  if  _\bs_\bt_\br_\bi_\bn_\bg_\b1  sorts  after _\bs_\bt_\br_\bi_\bn_\bg_\b2 lexicographically in the
+              current locale.
+       _\ba_\br_\bg_\b1 O\bOP\bP _\ba_\br_\bg_\b2
+              O\bOP\bP is one of -\b-e\beq\bq, -\b-n\bne\be, -\b-l\blt\bt, -\b-l\ble\be, -\b-g\bgt\bt, or -\b-g\bge\be.  These  arithmetic
+              binary  operators return true if _\ba_\br_\bg_\b1 is equal to, not equal to,
+              less than, less than or equal to, greater than, or greater  than
+              or  equal  to _\ba_\br_\bg_\b2, respectively.  _\bA_\br_\bg_\b1 and _\ba_\br_\bg_\b2 may be positive
+              or negative integers.
+
+S\bSI\bIM\bMP\bPL\bLE\bE C\bCO\bOM\bMM\bMA\bAN\bND\bD E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN
+       When a simple command is executed, the  shell  performs  the  following
+       expansions, assignments, and redirections, from left to right.
+
+       1.     The  words  that  the  parser has marked as variable assignments
+              (those preceding the command name) and  redirections  are  saved
+              for later processing.
+
+       2.     The  words that are not variable assignments or redirections are
+              expanded.  If any words remain after expansion, the  first  word
+              is  taken  to be the name of the command and the remaining words
+              are the arguments.
+
+       3.     Redirections are performed as described above under R\bRE\bED\bDI\bIR\bRE\bEC\bCT\bTI\bIO\bON\bN.
+
+       4.     The text after the =\b= in each variable assignment undergoes tilde
+              expansion, parameter expansion, command substitution, arithmetic
+              expansion,  and quote removal before being assigned to the vari-
+              able.
+
+       If no command name results, the variable assignments affect the current
+       shell  environment.  Otherwise, the variables are added to the environ-
+       ment of the executed command and do not affect the current shell  envi-
+       ronment.   If  any  of  the assignments attempts to assign a value to a
+       readonly variable, an error occurs, and the command exits with  a  non-
+       zero status.
+
+       If  no  command  name  results,  redirections are performed, but do not
+       affect the current shell environment.  A redirection error  causes  the
+       command to exit with a non-zero status.
+
+       If  there is a command name left after expansion, execution proceeds as
+       described below.  Otherwise, the command exits.  If one of  the  expan-
+       sions  contained a command substitution, the exit status of the command
+       is the exit status of the  last  command  substitution  performed.   If
+       there were no command substitutions, the command exits with a status of
+       zero.
+
+C\bCO\bOM\bMM\bMA\bAN\bND\bD E\bEX\bXE\bEC\bCU\bUT\bTI\bIO\bON\bN
+       After a command has been split into words, if it results  in  a  simple
+       command  and  an  optional list of arguments, the following actions are
+       taken.
+
+       If the command name contains no slashes, the shell attempts  to  locate
+       it.   If  there  exists a shell function by that name, that function is
+       invoked as described above in F\bFU\bUN\bNC\bCT\bTI\bIO\bON\bNS\bS.  If the name does not match  a
+       function,  the shell searches for it in the list of shell builtins.  If
+       a match is found, that builtin is invoked.
+
+       If the name is neither a shell function nor a builtin, and contains  no
+       slashes,  b\bba\bas\bsh\bh  searches  each element of the P\bPA\bAT\bTH\bH for a directory con-
+       taining an executable file by that name.  B\bBa\bas\bsh\bh uses  a  hash  table  to
+       remember  the  full pathnames of executable files (see h\bha\bas\bsh\bh under S\bSH\bHE\bEL\bLL\bL
+       B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).  A full search of the directories in  P\bPA\bAT\bTH\bH  is
+       performed  only  if the command is not found in the hash table.  If the
+       search is unsuccessful, the shell prints an error message  and  returns
+       an exit status of 127.
+
+       If  the  search  is  successful, or if the command name contains one or
+       more slashes, the shell executes the named program in a separate execu-
+       tion environment.  Argument 0 is set to the name given, and the remain-
+       ing arguments to the command are set to the arguments given, if any.
+
+       If this execution fails because the file is not in  executable  format,
+       and  the file is not a directory, it is assumed to be a _\bs_\bh_\be_\bl_\bl _\bs_\bc_\br_\bi_\bp_\bt, a
+       file containing shell commands.  A subshell is spawned to  execute  it.
+       This  subshell  reinitializes itself, so that the effect is as if a new
+       shell had been invoked to handle the script, with  the  exception  that
+       the  locations  of  commands  remembered  by the parent (see h\bha\bas\bsh\bh below
+       under S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS) are retained by the child.
+
+       If the program is a file beginning with #\b#!\b!, the remainder of the  first
+       line  specifies an interpreter for the program.  The shell executes the
+       specified interpreter on operating systems that do not handle this exe-
+       cutable format themselves.  The arguments to the interpreter consist of
+       a single optional argument following the interpreter name on the  first
+       line  of  the program, followed by the name of the program, followed by
+       the command arguments, if any.
+
+C\bCO\bOM\bMM\bMA\bAN\bND\bD E\bEX\bXE\bEC\bCU\bUT\bTI\bIO\bON\bN E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
+       The shell has an _\be_\bx_\be_\bc_\bu_\bt_\bi_\bo_\bn _\be_\bn_\bv_\bi_\br_\bo_\bn_\bm_\be_\bn_\bt, which consists of  the  follow-
+       ing:
+
+
+       +\bo      open  files inherited by the shell at invocation, as modified by
+              redirections supplied to the e\bex\bxe\bec\bc builtin
+
+       +\bo      the current working directory as set by c\bcd\bd, p\bpu\bus\bsh\bhd\bd, or  p\bpo\bop\bpd\bd,  or
+              inherited by the shell at invocation
+
+       +\bo      the  file  creation  mode mask as set by u\bum\bma\bas\bsk\bk or inherited from
+              the shell's parent
+
+       +\bo      current traps set by t\btr\bra\bap\bp
+
+       +\bo      shell parameters that are set by variable assignment or with s\bse\bet\bt
+              or inherited from the shell's parent in the environment
+
+       +\bo      shell  functions  defined during execution or inherited from the
+              shell's parent in the environment
+
+       +\bo      options enabled at invocation (either by default  or  with  com-
+              mand-line arguments) or by s\bse\bet\bt
+
+       +\bo      options enabled by s\bsh\bho\bop\bpt\bt
+
+       +\bo      shell aliases defined with a\bal\bli\bia\bas\bs
+
+       +\bo      various  process  IDs,  including  those of background jobs, the
+              value of $\b$$\b$, and the value of $\b$P\bPP\bPI\bID\bD
+
+       When a simple command other than a builtin or shell function is  to  be
+       executed,  it  is invoked in a separate execution environment that con-
+       sists of the following.  Unless otherwise noted, the values are  inher-
+       ited from the shell.
+
+
+       +\bo      the  shell's  open  files,  plus any modifications and additions
+              specified by redirections to the command
+
+       +\bo      the current working directory
+
+       +\bo      the file creation mode mask
+
+       +\bo      shell variables and functions  marked  for  export,  along  with
+              variables exported for the command, passed in the environment
+
+       +\bo      traps caught by the shell are reset to the values inherited from
+              the shell's parent, and traps ignored by the shell are ignored
+
+       A command invoked  in  this  separate  environment  cannot  affect  the
+       shell's execution environment.
+
+       Command  substitution,  commands  grouped  with  parentheses, and asyn-
+       chronous commands are invoked in  a  subshell  environment  that  is  a
+       duplicate  of  the  shell  environment, except that traps caught by the
+       shell are reset to the values that the shell inherited from its  parent
+       at invocation.  Builtin commands that are invoked as part of a pipeline
+       are also executed in a subshell environment.  Changes made to the  sub-
+       shell environment cannot affect the shell's execution environment.
+
+       If  a  command  is  followed  by a &\b& and job control is not active, the
+       default standard input for the command is  the  empty  file  _\b/_\bd_\be_\bv_\b/_\bn_\bu_\bl_\bl.
+       Otherwise,  the  invoked  command  inherits the file descriptors of the
+       calling shell as modified by redirections.
+
+E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
+       When a program is invoked it is given an array of  strings  called  the
+       _\be_\bn_\bv_\bi_\br_\bo_\bn_\bm_\be_\bn_\bt.   This  is  a  list  of  _\bn_\ba_\bm_\be-_\bv_\ba_\bl_\bu_\be  pairs,  of  the  form
+       _\bn_\ba_\bm_\be=_\bv_\ba_\bl_\bu_\be.
+
+       The shell provides several ways  to  manipulate  the  environment.   On
+       invocation, the shell scans its own environment and creates a parameter
+       for each name found, automatically marking it for _\be_\bx_\bp_\bo_\br_\bt to child  pro-
+       cesses.   Executed  commands  inherit  the environment.  The e\bex\bxp\bpo\bor\brt\bt and
+       d\bde\bec\bcl\bla\bar\bre\be -\b-x\bx commands allow parameters and functions to be added  to  and
+       deleted from the environment.  If the value of a parameter in the envi-
+       ronment is modified, the new value becomes  part  of  the  environment,
+       replacing  the  old.  The environment inherited by any executed command
+       consists of the shell's initial environment, whose values may be  modi-
+       fied  in  the  shell, less any pairs removed by the u\bun\bns\bse\bet\bt command, plus
+       any additions via the e\bex\bxp\bpo\bor\brt\bt and d\bde\bec\bcl\bla\bar\bre\be -\b-x\bx commands.
+
+       The environment for any _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd or  function  may  be  augmented
+       temporarily  by  prefixing  it with parameter assignments, as described
+       above in P\bPA\bAR\bRA\bAM\bME\bET\bTE\bER\bRS\bS.  These assignment statements affect only the envi-
+       ronment seen by that command.
+
+       If  the  -\b-k\bk option is set (see the s\bse\bet\bt builtin command below), then _\ba_\bl_\bl
+       parameter assignments are placed in the environment for a command,  not
+       just those that precede the command name.
+
+       When  b\bba\bas\bsh\bh  invokes  an  external command, the variable _\b_ is set to the
+       full file name of the command and passed to that command in  its  envi-
+       ronment.
+
+E\bEX\bXI\bIT\bT S\bST\bTA\bAT\bTU\bUS\bS
+       For the shell's purposes, a command which exits with a zero exit status
+       has succeeded.  An exit status of zero indicates success.   A  non-zero
+       exit  status  indicates  failure.  When a command terminates on a fatal
+       signal _\bN, b\bba\bas\bsh\bh uses the value of 128+_\bN as the exit status.
+
+       If a command is not found, the child  process  created  to  execute  it
+       returns  a status of 127.  If a command is found but is not executable,
+       the return status is 126.
+
+       If a command fails because of an error during expansion or redirection,
+       the exit status is greater than zero.
+
+       Shell  builtin  commands return a status of 0 (_\bt_\br_\bu_\be) if successful, and
+       non-zero (_\bf_\ba_\bl_\bs_\be) if an error occurs while they execute.   All  builtins
+       return an exit status of 2 to indicate incorrect usage.
+
+       B\bBa\bas\bsh\bh  itself  returns  the  exit  status  of the last command executed,
+       unless a syntax error occurs, in which case it exits  with  a  non-zero
+       value.  See also the e\bex\bxi\bit\bt builtin command below.
+
+S\bSI\bIG\bGN\bNA\bAL\bLS\bS
+       When  b\bba\bas\bsh\bh  is  interactive,  in  the  absence of any traps, it ignores
+       S\bSI\bIG\bGT\bTE\bER\bRM\bM (so that k\bki\bil\bll\bl 0\b0 does not kill an interactive shell), and S\bSI\bIG\bGI\bIN\bNT\bT
+       is  caught and handled (so that the w\bwa\bai\bit\bt builtin is interruptible).  In
+       all cases, b\bba\bas\bsh\bh ignores S\bSI\bIG\bGQ\bQU\bUI\bIT\bT.  If job control  is  in  effect,  b\bba\bas\bsh\bh
+       ignores S\bSI\bIG\bGT\bTT\bTI\bIN\bN, S\bSI\bIG\bGT\bTT\bTO\bOU\bU, and S\bSI\bIG\bGT\bTS\bST\bTP\bP.
+
+       Non-builtin commands run by b\bba\bas\bsh\bh have signal handlers set to the values
+       inherited by the shell from its parent.  When job  control  is  not  in
+       effect,  asynchronous commands ignore S\bSI\bIG\bGI\bIN\bNT\bT and S\bSI\bIG\bGQ\bQU\bUI\bIT\bT in addition to
+       these inherited handlers.  Commands run as a result of command  substi-
+       tution ignore the keyboard-generated job control signals S\bSI\bIG\bGT\bTT\bTI\bIN\bN, S\bSI\bIG\bGT\bT-\b-
+       T\bTO\bOU\bU, and S\bSI\bIG\bGT\bTS\bST\bTP\bP.
+
+       The shell exits by default upon receipt of a S\bSI\bIG\bGH\bHU\bUP\bP.   Before  exiting,
+       an  interactive  shell  resends  the  S\bSI\bIG\bGH\bHU\bUP\bP  to  all  jobs, running or
+       stopped.  Stopped jobs are sent S\bSI\bIG\bGC\bCO\bON\bNT\bT to ensure that they receive the
+       S\bSI\bIG\bGH\bHU\bUP\bP.   To  prevent the shell from sending the signal to a particular
+       job, it should be removed from the jobs table with the  d\bdi\bis\bso\bow\bwn\bn  builtin
+       (see  S\bSH\bHE\bEL\bLL\bL  B\bBU\bUI\bIL\bLT\bTI\bIN\bN  C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS  below)  or marked to not receive S\bSI\bIG\bGH\bHU\bUP\bP
+       using d\bdi\bis\bso\bow\bwn\bn -\b-h\bh.
+
+       If the h\bhu\bup\bpo\bon\bne\bex\bxi\bit\bt shell option has been set with  s\bsh\bho\bop\bpt\bt,  b\bba\bas\bsh\bh  sends  a
+       S\bSI\bIG\bGH\bHU\bUP\bP to all jobs when an interactive login shell exits.
+
+       If  0for which a trap has been set, the trap will not be executed until
+       the command completes.  When b\bba\bas\bsh\bh is waiting for an  asynchronous  com-
+       mand  via  the w\bwa\bai\bit\bt builtin, the reception of a signal for which a trap
+       has been set will cause the w\bwa\bai\bit\bt builtin to return immediately with  an
+       exit  status greater than 128, immediately after which the trap is exe-
+       cuted.
+
+J\bJO\bOB\bB C\bCO\bON\bNT\bTR\bRO\bOL\bL
+       _\bJ_\bo_\bb _\bc_\bo_\bn_\bt_\br_\bo_\bl refers to the ability to  selectively  stop  (_\bs_\bu_\bs_\bp_\be_\bn_\bd)  the
+       execution of processes and continue (_\br_\be_\bs_\bu_\bm_\be) their execution at a later
+       point.  A user typically  employs  this  facility  via  an  interactive
+       interface supplied jointly by the system's terminal driver and b\bba\bas\bsh\bh.
+
+       The  shell  associates  a  _\bj_\bo_\bb with each pipeline.  It keeps a table of
+       currently executing jobs, which may be listed with  the  j\bjo\bob\bbs\bs  command.
+       When  b\bba\bas\bsh\bh starts a job asynchronously (in the _\bb_\ba_\bc_\bk_\bg_\br_\bo_\bu_\bn_\bd), it prints a
+       line that looks like:
+
+              [1] 25647
+
+       indicating that this job is job number 1 and that the process ID of the
+       last process in the pipeline associated with this job is 25647.  All of
+       the processes in a single pipeline are members of the same  job.   B\bBa\bas\bsh\bh
+       uses the _\bj_\bo_\bb abstraction as the basis for job control.
+
+       To  facilitate the implementation of the user interface to job control,
+       the operating system maintains the notion of a _\bc_\bu_\br_\br_\be_\bn_\bt _\bt_\be_\br_\bm_\bi_\bn_\ba_\bl _\bp_\br_\bo_\bc_\be_\bs_\bs
+       _\bg_\br_\bo_\bu_\bp _\bI_\bD.  Members of this process group (processes whose process group
+       ID is equal to the current terminal process group ID) receive keyboard-
+       generated  signals  such  as S\bSI\bIG\bGI\bIN\bNT\bT.  These processes are said to be in
+       the _\bf_\bo_\br_\be_\bg_\br_\bo_\bu_\bn_\bd.  _\bB_\ba_\bc_\bk_\bg_\br_\bo_\bu_\bn_\bd processes are those whose process group  ID
+       differs from the terminal's; such processes are immune to keyboard-gen-
+       erated signals.  Only foreground processes are allowed to read from  or
+       write to the terminal.  Background processes which attempt to read from
+       (write to) the terminal are sent a S\bSI\bIG\bGT\bTT\bTI\bIN\bN (\b(S\bSI\bIG\bGT\bTT\bTO\bOU\bU)\b) signal by the ter-
+       minal driver, which, unless caught, suspends the process.
+
+       If  the operating system on which b\bba\bas\bsh\bh is running supports job control,
+       b\bba\bas\bsh\bh contains facilities to use it.  Typing the _\bs_\bu_\bs_\bp_\be_\bn_\bd character (typ-
+       ically ^\b^Z\bZ, Control-Z) while a process is running causes that process to
+       be stopped and returns control to b\bba\bas\bsh\bh.   Typing  the  _\bd_\be_\bl_\ba_\by_\be_\bd  _\bs_\bu_\bs_\bp_\be_\bn_\bd
+       character  (typically  ^\b^Y\bY,  Control-Y) causes the process to be stopped
+       when it attempts to read input from the terminal,  and  control  to  be
+       returned  to b\bba\bas\bsh\bh.  The user may then manipulate the state of this job,
+       using the b\bbg\bg command to continue it in the background, the  f\bfg\bg  command
+       to continue it in the foreground, or the k\bki\bil\bll\bl command to kill it.  A ^\b^Z\bZ
+       takes effect immediately, and has the additional side effect of causing
+       pending output and typeahead to be discarded.
+
+       There are a number of ways to refer to a job in the shell.  The charac-
+       ter %\b% introduces a job name.  Job number _\bn may be referred to as %\b%n\bn.  A
+       job  may  also  be referred to using a prefix of the name used to start
+       it, or using a substring that appears in its command line.   For  exam-
+       ple, %\b%c\bce\be refers to a stopped c\bce\be job.  If a prefix matches more than one
+       job, b\bba\bas\bsh\bh reports an error.  Using %\b%?\b?c\bce\be, on the other hand,  refers  to
+       any job containing the string c\bce\be in its command line.  If the substring
+       matches more than one job, b\bba\bas\bsh\bh reports an error.  The symbols  %\b%%\b%  and
+       %\b%+\b+  refer  to  the shell's notion of the _\bc_\bu_\br_\br_\be_\bn_\bt _\bj_\bo_\bb, which is the last
+       job stopped while it was in the foreground  or  started  in  the  back-
+       ground.   The  _\bp_\br_\be_\bv_\bi_\bo_\bu_\bs _\bj_\bo_\bb may be referenced using %\b%-\b-.  In output per-
+       taining to jobs (e.g., the output of the j\bjo\bob\bbs\bs command), the current job
+       is always flagged with a +\b+, and the previous job with a -\b-.
+
+       Simply  naming a job can be used to bring it into the foreground: %\b%1\b1 is
+       a synonym for `\b``\b`f\bfg\bg %\b%1\b1'\b''\b', bringing job 1 from the  background  into  the
+       foreground.   Similarly,  `\b``\b`%\b%1\b1  &\b&'\b''\b'  resumes  job  1 in the background,
+       equivalent to `\b``\b`b\bbg\bg %\b%1\b1'\b''\b'.
+
+       The shell learns immediately whenever a job changes  state.   Normally,
+       b\bba\bas\bsh\bh waits until it is about to print a prompt before reporting changes
+       in a job's status so as to not interrupt any other output.  If  the  -\b-b\bb
+       option to the s\bse\bet\bt builtin command is enabled, b\bba\bas\bsh\bh reports such changes
+       immediately.  Any trap on S\bSI\bIG\bGC\bCH\bHL\bLD\bD  is  executed  for  each  child  that
+       exits.
+
+       If  an  attempt  to exit b\bba\bas\bsh\bh is made while jobs are stopped, the shell
+       prints a warning message.  The j\bjo\bob\bbs\bs command may then be used to inspect
+       their status.  If a second attempt to exit is made without an interven-
+       ing command, the shell does not print another warning, and the  stopped
+       jobs are terminated.
+
+P\bPR\bRO\bOM\bMP\bPT\bTI\bIN\bNG\bG
+       When executing interactively, b\bba\bas\bsh\bh displays the primary prompt P\bPS\bS1\b1 when
+       it is ready to read a command, and the secondary  prompt  P\bPS\bS2\b2  when  it
+       needs  more  input  to  complete  a  command.  B\bBa\bas\bsh\bh allows these prompt
+       strings to be customized by inserting  a  number  of  backslash-escaped
+       special characters that are decoded as follows:
+              \\b\a\ba     an ASCII bell character (07)
+              \\b\d\bd     the  date  in "Weekday Month Date" format (e.g., "Tue May
+                     26")
+              \\b\D\bD{\b{_\bf_\bo_\br_\bm_\ba_\bt}\b}
+                     the _\bf_\bo_\br_\bm_\ba_\bt is passed to _\bs_\bt_\br_\bf_\bt_\bi_\bm_\be(3)  and  the  result  is
+                     inserted  into the prompt string; an empty _\bf_\bo_\br_\bm_\ba_\bt results
+                     in a locale-specific time representation.  The braces are
+                     required
+              \\b\e\be     an ASCII escape character (033)
+              \\b\h\bh     the hostname up to the first `.'
+              \\b\H\bH     the hostname
+              \\b\j\bj     the number of jobs currently managed by the shell
+              \\b\l\bl     the basename of the shell's terminal device name
+              \\b\n\bn     newline
+              \\b\r\br     carriage return
+              \\b\s\bs     the  name  of  the shell, the basename of $\b$0\b0 (the portion
+                     following the final slash)
+              \\b\t\bt     the current time in 24-hour HH:MM:SS format
+              \\b\T\bT     the current time in 12-hour HH:MM:SS format
+              \\b\@\b@     the current time in 12-hour am/pm format
+              \\b\A\bA     the current time in 24-hour HH:MM format
+              \\b\u\bu     the username of the current user
+              \\b\v\bv     the version of b\bba\bas\bsh\bh (e.g., 2.00)
+              \\b\V\bV     the release of b\bba\bas\bsh\bh, version + patchelvel (e.g., 2.00.0)
+              \\b\w\bw     the current working directory
+              \\b\W\bW     the basename of the current working directory
+              \\b\!\b!     the history number of this command
+              \\b\#\b#     the command number of this command
+              \\b\$\b$     if the effective UID is 0, a #\b#, otherwise a $\b$
+              \\b\_\bn_\bn_\bn   the character corresponding to the octal number _\bn_\bn_\bn
+              \\b\\\b\     a backslash
+              \\b\[\b[     begin a sequence of non-printing characters, which  could
+                     be  used  to  embed  a terminal control sequence into the
+                     prompt
+              \\b\]\b]     end a sequence of non-printing characters
+
+       The command number and the history number are  usually  different:  the
+       history  number of a command is its position in the history list, which
+       may include commands  restored  from  the  history  file  (see  H\bHI\bIS\bST\bTO\bOR\bRY\bY
+       below),  while  the  command  number is the position in the sequence of
+       commands executed during the current shell session.  After  the  string
+       is  decoded,  it is expanded via parameter expansion, command substitu-
+       tion, arithmetic expansion, and quote removal, subject to the value  of
+       the  p\bpr\bro\bom\bmp\bpt\btv\bva\bar\brs\bs  shell option (see the description of the s\bsh\bho\bop\bpt\bt command
+       under S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).
+
+R\bRE\bEA\bAD\bDL\bLI\bIN\bNE\bE
+       This is the library that handles reading input when using  an  interac-
+       tive shell, unless the -\b--\b-n\bno\boe\bed\bdi\bit\bti\bin\bng\bg option is given at shell invocation.
+       By default, the line editing commands are similar to those of emacs.  A
+       vi-style  line  editing  interface is also available.  To turn off line
+       editing after the shell is running, use the +\b+o\bo e\bem\bma\bac\bcs\bs or +\b+o\bo  v\bvi\bi  options
+       to the s\bse\bet\bt builtin (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).
+
+   R\bRe\bea\bad\bdl\bli\bin\bne\be N\bNo\bot\bta\bat\bti\bio\bon\bn
+       In this section, the emacs-style notation is used to denote keystrokes.
+       Control keys are denoted by C-_\bk_\be_\by, e.g., C-n  means  Control-N.   Simi-
+       larly,  _\bm_\be_\bt_\ba  keys are denoted by M-_\bk_\be_\by, so M-x means Meta-X.  (On key-
+       boards without a _\bm_\be_\bt_\ba key, M-_\bx means ESC _\bx, i.e., press the Escape  key
+       then the _\bx key.  This makes ESC the _\bm_\be_\bt_\ba _\bp_\br_\be_\bf_\bi_\bx.  The combination M-C-_\bx
+       means ESC-Control-_\bx, or press the Escape key then hold the Control  key
+       while pressing the _\bx key.)
+
+       Readline commands may be given numeric _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs, which normally act as
+       a repeat count.  Sometimes, however, it is the  sign  of  the  argument
+       that  is  significant.   Passing  a negative argument to a command that
+       acts in the forward direction (e.g., k\bki\bil\bll\bl-\b-l\bli\bin\bne\be) causes that command  to
+       act  in  a  backward direction.  Commands whose behavior with arguments
+       deviates from this are noted below.
+
+       When a command is described as _\bk_\bi_\bl_\bl_\bi_\bn_\bg text, the text deleted is  saved
+       for possible future retrieval (_\by_\ba_\bn_\bk_\bi_\bn_\bg).  The killed text is saved in a
+       _\bk_\bi_\bl_\bl _\br_\bi_\bn_\bg.  Consecutive kills cause the text to be accumulated into one
+       unit, which can be yanked all at once.  Commands which do not kill text
+       separate the chunks of text on the kill ring.
+
+   R\bRe\bea\bad\bdl\bli\bin\bne\be I\bIn\bni\bit\bti\bia\bal\bli\biz\bza\bat\bti\bio\bon\bn
+       Readline is customized by putting commands in  an  initialization  file
+       (the  _\bi_\bn_\bp_\bu_\bt_\br_\bc  file).  The name of this file is taken from the value of
+       the I\bIN\bNP\bPU\bUT\bTR\bRC\bC variable.  If  that  variable  is  unset,  the  default  is
+       _\b~_\b/_\b._\bi_\bn_\bp_\bu_\bt_\br_\bc.   When a program which uses the readline library starts up,
+       the initialization file is read, and the key bindings and variables are
+       set.   There  are  only  a few basic constructs allowed in the readline
+       initialization file.  Blank lines are ignored.  Lines beginning with  a
+       #\b#  are  comments.   Lines  beginning with a $\b$ indicate conditional con-
+       structs.  Other lines denote key bindings and variable settings.
+
+       The default key-bindings may be changed with an  _\bi_\bn_\bp_\bu_\bt_\br_\bc  file.   Other
+       programs that use this library may add their own commands and bindings.
+
+       For example, placing
+
+              M-Control-u: universal-argument
+       or
+              C-Meta-u: universal-argument
+       into the _\bi_\bn_\bp_\bu_\bt_\br_\bc would make M-C-u execute the readline command  _\bu_\bn_\bi_\bv_\be_\br_\b-
+       _\bs_\ba_\bl_\b-_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt.
+
+       The  following  symbolic  character  names are recognized: _\bR_\bU_\bB_\bO_\bU_\bT, _\bD_\bE_\bL,
+       _\bE_\bS_\bC, _\bL_\bF_\bD, _\bN_\bE_\bW_\bL_\bI_\bN_\bE, _\bR_\bE_\bT, _\bR_\bE_\bT_\bU_\bR_\bN, _\bS_\bP_\bC, _\bS_\bP_\bA_\bC_\bE, and _\bT_\bA_\bB.
+
+       In addition to command names, readline allows keys to  be  bound  to  a
+       string that is inserted when the key is pressed (a _\bm_\ba_\bc_\br_\bo).
+
+   R\bRe\bea\bad\bdl\bli\bin\bne\be K\bKe\bey\by B\bBi\bin\bnd\bdi\bin\bng\bgs\bs
+       The  syntax for controlling key bindings in the _\bi_\bn_\bp_\bu_\bt_\br_\bc file is simple.
+       All that is required is the name of the command or the text of a  macro
+       and  a key sequence to which it should be bound. The name may be speci-
+       fied in one of two ways: as a symbolic key name, possibly with _\bM_\be_\bt_\ba_\b- or
+       _\bC_\bo_\bn_\bt_\br_\bo_\bl_\b- prefixes, or as a key sequence.
+
+       When using the form k\bke\bey\byn\bna\bam\bme\be:_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be or _\bm_\ba_\bc_\br_\bo, _\bk_\be_\by_\bn_\ba_\bm_\be is the name
+       of a key spelled out in English.  For example:
+
+              Control-u: universal-argument
+              Meta-Rubout: backward-kill-word
+              Control-o: "> output"
+
+       In the above example, _\bC_\b-_\bu is bound to the function  u\bun\bni\biv\bve\ber\brs\bsa\bal\bl-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt,
+       _\bM_\b-_\bD_\bE_\bL  is bound to the function b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-k\bki\bil\bll\bl-\b-w\bwo\bor\brd\bd, and _\bC_\b-_\bo is bound to
+       run the macro expressed on the right hand side (that is, to insert  the
+       text ``> output'' into the line).
+
+       In  the  second  form,  "\b"k\bke\bey\bys\bse\beq\bq"\b":_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be or _\bm_\ba_\bc_\br_\bo, k\bke\bey\bys\bse\beq\bq differs
+       from k\bke\bey\byn\bna\bam\bme\be above in that strings denoting an entire key sequence  may
+       be  specified  by  placing the sequence within double quotes.  Some GNU
+       Emacs style key escapes can be used, as in the following  example,  but
+       the symbolic character names are not recognized.
+
+              "\C-u": universal-argument
+              "\C-x\C-r": re-read-init-file
+              "\e[11~": "Function Key 1"
+
+       In this example, _\bC_\b-_\bu is again bound to the function u\bun\bni\biv\bve\ber\brs\bsa\bal\bl-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt.
+       _\bC_\b-_\bx _\bC_\b-_\br is bound to the function r\bre\be-\b-r\bre\bea\bad\bd-\b-i\bin\bni\bit\bt-\b-f\bfi\bil\ble\be, and _\bE_\bS_\bC _\b[ _\b1 _\b1 _\b~  is
+       bound to insert the text ``Function Key 1''.
+
+       The full set of GNU Emacs style escape sequences is
+              \\b\C\bC-\b-    control prefix
+              \\b\M\bM-\b-    meta prefix
+              \\b\e\be     an escape character
+              \\b\\\b\     backslash
+              \\b\"\b"     literal "
+              \\b\'\b'     literal '
+
+       In  addition  to  the GNU Emacs style escape sequences, a second set of
+       backslash escapes is available:
+              \\b\a\ba     alert (bell)
+              \\b\b\bb     backspace
+              \\b\d\bd     delete
+              \\b\f\bf     form feed
+              \\b\n\bn     newline
+              \\b\r\br     carriage return
+              \\b\t\bt     horizontal tab
+              \\b\v\bv     vertical tab
+              \\b\_\bn_\bn_\bn   the eight-bit character whose value is  the  octal  value
+                     _\bn_\bn_\bn (one to three digits)
+              \\b\x\bx_\bH_\bH   the  eight-bit  character  whose value is the hexadecimal
+                     value _\bH_\bH (one or two hex digits)
+
+       When entering the text of a macro, single or double quotes must be used
+       to indicate a macro definition.  Unquoted text is assumed to be a func-
+       tion name.  In the macro body, the backslash  escapes  described  above
+       are  expanded.   Backslash  will quote any other character in the macro
+       text, including " and '.
+
+       B\bBa\bas\bsh\bh allows the current readline key bindings to be displayed or  modi-
+       fied  with  the b\bbi\bin\bnd\bd builtin command.  The editing mode may be switched
+       during interactive use by using the -\b-o\bo option to the s\bse\bet\bt  builtin  com-
+       mand (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).
+
+   R\bRe\bea\bad\bdl\bli\bin\bne\be V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs
+       Readline has variables that can be used to further customize its behav-
+       ior.  A variable may be set in the _\bi_\bn_\bp_\bu_\bt_\br_\bc file with a statement of the
+       form
+
+              s\bse\bet\bt _\bv_\ba_\br_\bi_\ba_\bb_\bl_\be_\b-_\bn_\ba_\bm_\be _\bv_\ba_\bl_\bu_\be
+
+       Except  where  noted, readline variables can take the values O\bOn\bn or O\bOf\bff\bf.
+       The variables and their default values are:
+
+       b\bbe\bel\bll\bl-\b-s\bst\bty\byl\ble\be (\b(a\bau\bud\bdi\bib\bbl\ble\be)\b)
+              Controls what happens when readline wants to ring  the  terminal
+              bell.  If set to n\bno\bon\bne\be, readline never rings the bell.  If set to
+              v\bvi\bis\bsi\bib\bbl\ble\be, readline uses a visible bell if one is  available.   If
+              set to a\bau\bud\bdi\bib\bbl\ble\be, readline attempts to ring the terminal's bell.
+       c\bco\bom\bmm\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn (\b(`\b``\b`#\b#'\b''\b')\b)
+              The  string  that  is  inserted when the readline i\bin\bns\bse\ber\brt\bt-\b-c\bco\bom\bmm\bme\ben\bnt\bt
+              command is executed.  This command is bound to M\bM-\b-#\b# in emacs mode
+              and to #\b# in vi command mode.
+       c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bn-\b-i\big\bgn\bno\bor\bre\be-\b-c\bca\bas\bse\be (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, readline performs filename matching and completion
+              in a case-insensitive fashion.
+       c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bn-\b-q\bqu\bue\ber\bry\by-\b-i\bit\bte\bem\bms\bs (\b(1\b10\b00\b0)\b)
+              This determines when the user is queried about viewing the  num-
+              ber  of  possible  completions generated by the p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\be-\b-
+              t\bti\bio\bon\bns\bs command.  It may be set to any integer value greater  than
+              or  equal  to  zero.   If  the number of possible completions is
+              greater than or equal to the value of this variable, the user is
+              asked  whether or not he wishes to view them; otherwise they are
+              simply listed on the terminal.
+       c\bco\bon\bnv\bve\ber\brt\bt-\b-m\bme\bet\bta\ba (\b(O\bOn\bn)\b)
+              If set to O\bOn\bn, readline will convert characters with  the  eighth
+              bit set to an ASCII key sequence by stripping the eighth bit and
+              prefixing an escape character (in effect, using  escape  as  the
+              _\bm_\be_\bt_\ba _\bp_\br_\be_\bf_\bi_\bx).
+       d\bdi\bis\bsa\bab\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bn (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, readline will inhibit word completion.  Completion
+              characters will be inserted into the line as if  they  had  been
+              mapped to s\bse\bel\blf\bf-\b-i\bin\bns\bse\ber\brt\bt.
+       e\bed\bdi\bit\bti\bin\bng\bg-\b-m\bmo\bod\bde\be (\b(e\bem\bma\bac\bcs\bs)\b)
+              Controls whether readline begins with a set of key bindings sim-
+              ilar to _\be_\bm_\ba_\bc_\bs or _\bv_\bi.  e\bed\bdi\bit\bti\bin\bng\bg-\b-m\bmo\bod\bde\be can be set to either e\bem\bma\bac\bcs\bs or
+              v\bvi\bi.
+       e\ben\bna\bab\bbl\ble\be-\b-k\bke\bey\byp\bpa\bad\bd (\b(O\bOf\bff\bf)\b)
+              When set to O\bOn\bn, readline will try to enable the application key-
+              pad when it is called.  Some systems need  this  to  enable  the
+              arrow keys.
+       e\bex\bxp\bpa\ban\bnd\bd-\b-t\bti\bil\bld\bde\be (\b(O\bOf\bff\bf)\b)
+              If  set  to  o\bon\bn,  tilde  expansion  is  performed  when readline
+              attempts word completion.
+       h\bhi\bis\bst\bto\bor\bry\by-\b-p\bpr\bre\bes\bse\ber\brv\bve\be-\b-p\bpo\boi\bin\bnt\bt
+              If set to o\bon\bn, the history code attempts to place  point  at  the
+              same  location  on each history line retrived with p\bpr\bre\bev\bvi\bio\bou\bus\bs-\b-h\bhi\bis\bs-\b-
+              t\bto\bor\bry\by or n\bne\bex\bxt\bt-\b-h\bhi\bis\bst\bto\bor\bry\by.
+       h\bho\bor\bri\biz\bzo\bon\bnt\bta\bal\bl-\b-s\bsc\bcr\bro\bol\bll\bl-\b-m\bmo\bod\bde\be (\b(O\bOf\bff\bf)\b)
+              When set to O\bOn\bn, makes readline use a single  line  for  display,
+              scrolling the input horizontally on a single screen line when it
+              becomes longer than the screen width rather than wrapping  to  a
+              new line.
+       i\bin\bnp\bpu\but\bt-\b-m\bme\bet\bta\ba (\b(O\bOf\bff\bf)\b)
+              If  set to O\bOn\bn, readline will enable eight-bit input (that is, it
+              will not strip the high  bit  from  the  characters  it  reads),
+              regardless of what the terminal claims it can support.  The name
+              m\bme\bet\bta\ba-\b-f\bfl\bla\bag\bg is a synonym for this variable.
+       i\bis\bse\bea\bar\brc\bch\bh-\b-t\bte\ber\brm\bmi\bin\bna\bat\bto\bor\brs\bs (\b(`\b``\b`C\bC-\b-[\b[C\bC-\b-J\bJ'\b''\b')\b)
+              The string of characters that should  terminate  an  incremental
+              search  without  subsequently  executing the character as a com-
+              mand.  If this variable has not been given a value, the  charac-
+              ters _\bE_\bS_\bC and _\bC_\b-_\bJ will terminate an incremental search.
+       k\bke\bey\bym\bma\bap\bp (\b(e\bem\bma\bac\bcs\bs)\b)
+              Set  the current readline keymap.  The set of valid keymap names
+              is _\be_\bm_\ba_\bc_\bs_\b, _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd_\b, _\be_\bm_\ba_\bc_\bs_\b-_\bm_\be_\bt_\ba_\b,  _\be_\bm_\ba_\bc_\bs_\b-_\bc_\bt_\bl_\bx_\b,  _\bv_\bi_\b,  _\bv_\bi_\b-_\bc_\bo_\bm_\b-
+              _\bm_\ba_\bn_\bd,  and  _\bv_\bi_\b-_\bi_\bn_\bs_\be_\br_\bt.  _\bv_\bi is equivalent to _\bv_\bi_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd; _\be_\bm_\ba_\bc_\bs is
+              equivalent to _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd.  The default value is  _\be_\bm_\ba_\bc_\bs;  the
+              value of e\bed\bdi\bit\bti\bin\bng\bg-\b-m\bmo\bod\bde\be also affects the default keymap.
+       m\bma\bar\brk\bk-\b-d\bdi\bir\bre\bec\bct\bto\bor\bri\bie\bes\bs (\b(O\bOn\bn)\b)
+              If set to O\bOn\bn, completed directory names have a slash appended.
+       m\bma\bar\brk\bk-\b-m\bmo\bod\bdi\bif\bfi\bie\bed\bd-\b-l\bli\bin\bne\bes\bs (\b(O\bOf\bff\bf)\b)
+              If  set  to  O\bOn\bn,  history lines that have been modified are dis-
+              played with a preceding asterisk (*\b*).
+       m\bma\bar\brk\bk-\b-s\bsy\bym\bml\bli\bin\bnk\bke\bed\bd-\b-d\bdi\bir\bre\bec\bct\bto\bor\bri\bie\bes\bs (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, completed names which are symbolic links to direc-
+              tories   have   a  slash  appended  (subject  to  the  value  of
+              m\bma\bar\brk\bk-\b-d\bdi\bir\bre\bec\bct\bto\bor\bri\bie\bes\bs).
+       m\bma\bat\btc\bch\bh-\b-h\bhi\bid\bdd\bde\ben\bn-\b-f\bfi\bil\ble\bes\bs (\b(O\bOn\bn)\b)
+              This variable, when set to O\bOn\bn, causes readline  to  match  files
+              whose  names  begin  with  a  `.' (hidden files) when performing
+              filename completion, unless the leading `.' is supplied  by  the
+              user in the filename to be completed.
+       o\bou\but\btp\bpu\but\bt-\b-m\bme\bet\bta\ba (\b(O\bOf\bff\bf)\b)
+              If  set  to O\bOn\bn, readline will display characters with the eighth
+              bit set directly rather than as a meta-prefixed escape sequence.
+       p\bpa\bag\bge\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(O\bOn\bn)\b)
+              If  set to O\bOn\bn, readline uses an internal _\bm_\bo_\br_\be-like pager to dis-
+              play a screenful of possible completions at a time.
+       p\bpr\bri\bin\bnt\bt-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs-\b-h\bho\bor\bri\biz\bzo\bon\bnt\bta\bal\bll\bly\by (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, readline will  display  completions  with  matches
+              sorted  horizontally in alphabetical order, rather than down the
+              screen.
+       s\bsh\bho\bow\bw-\b-a\bal\bll\bl-\b-i\bif\bf-\b-a\bam\bmb\bbi\big\bgu\buo\bou\bus\bs (\b(O\bOf\bff\bf)\b)
+              This alters the default behavior of  the  completion  functions.
+              If set to o\bon\bn, words which have more than one possible completion
+              cause the matches to be listed immediately  instead  of  ringing
+              the bell.
+       s\bsh\bho\bow\bw-\b-a\bal\bll\bl-\b-i\bif\bf-\b-u\bun\bnm\bmo\bod\bdi\bif\bfi\bie\bed\bd (\b(O\bOf\bff\bf)\b)
+              This  alters the default behavior of the completion functions in
+              a fashion similar to s\bsh\bho\bow\bw-\b-a\bal\bll\bl-\b-i\bif\bf-\b-a\bam\bmb\bbi\big\bgu\buo\bou\bus\bs.  If set to o\bon\bn, words
+              which  have more than one possible completion without any possi-
+              ble partial completion (the possible completions don't  share  a
+              common  prefix)  cause  the  matches  to  be  listed immediately
+              instead of ringing the bell.
+       v\bvi\bis\bsi\bib\bbl\ble\be-\b-s\bst\bta\bat\bts\bs (\b(O\bOf\bff\bf)\b)
+              If set to O\bOn\bn, a character denoting a file's type as reported  by
+              _\bs_\bt_\ba_\bt(2)  is  appended to the filename when listing possible com-
+              pletions.
+
+   R\bRe\bea\bad\bdl\bli\bin\bne\be C\bCo\bon\bnd\bdi\bit\bti\bio\bon\bna\bal\bl C\bCo\bon\bns\bst\btr\bru\buc\bct\bts\bs
+       Readline implements a facility similar in  spirit  to  the  conditional
+       compilation  features  of  the C preprocessor which allows key bindings
+       and variable settings to be performed as the result  of  tests.   There
+       are four parser directives used.
+
+       $\b$i\bif\bf    The  $\b$i\bif\bf construct allows bindings to be made based on the edit-
+              ing mode, the terminal being  used,  or  the  application  using
+              readline.   The text of the test extends to the end of the line;
+              no characters are required to isolate it.
+
+              m\bmo\bod\bde\be   The m\bmo\bod\bde\be=\b= form of the  $\b$i\bif\bf  directive  is  used  to  test
+                     whether  readline  is  in  emacs or vi mode.  This may be
+                     used in conjunction with  the  s\bse\bet\bt  k\bke\bey\bym\bma\bap\bp  command,  for
+                     instance,  to  set  bindings  in  the  _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd and
+                     _\be_\bm_\ba_\bc_\bs_\b-_\bc_\bt_\bl_\bx keymaps only if readline is  starting  out  in
+                     emacs mode.
+
+              t\bte\ber\brm\bm   The  t\bte\ber\brm\bm=\b=  form may be used to include terminal-specific
+                     key bindings, perhaps to bind the key sequences output by
+                     the terminal's function keys.  The word on the right side
+                     of the =\b= is tested against the both full name of the ter-
+                     minal  and  the  portion  of the terminal name before the
+                     first -\b-.  This allows _\bs_\bu_\bn to match both _\bs_\bu_\bn and  _\bs_\bu_\bn_\b-_\bc_\bm_\bd,
+                     for instance.
+
+              a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bn
+                     The a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bn construct is used to include application-
+                     specific  settings.   Each  program  using  the  readline
+                     library  sets the _\ba_\bp_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bo_\bn _\bn_\ba_\bm_\be, and an initialization
+                     file can test for a particular value.  This could be used
+                     to  bind key sequences to functions useful for a specific
+                     program.  For instance, the following command adds a  key
+                     sequence  that  quotes  the  current  or previous word in
+                     Bash:
+
+                     $\b$i\bif\bf Bash
+                     # Quote the current or previous word
+                     "\C-xq": "\eb\"\ef\""
+                     $\b$e\ben\bnd\bdi\bif\bf
+
+       $\b$e\ben\bnd\bdi\bif\bf This command, as seen in the previous example, terminates an $\b$i\bif\bf
+              command.
+
+       $\b$e\bel\bls\bse\be  Commands in this branch of the $\b$i\bif\bf directive are executed if the
+              test fails.
+
+       $\b$i\bin\bnc\bcl\blu\bud\bde\be
+              This directive takes a single filename as an argument and  reads
+              commands  and bindings from that file.  For example, the follow-
+              ing directive would read _\b/_\be_\bt_\bc_\b/_\bi_\bn_\bp_\bu_\bt_\br_\bc:
+
+              $\b$i\bin\bnc\bcl\blu\bud\bde\be  _\b/_\be_\bt_\bc_\b/_\bi_\bn_\bp_\bu_\bt_\br_\bc
+
+   S\bSe\bea\bar\brc\bch\bhi\bin\bng\bg
+       Readline provides commands for searching through  the  command  history
+       (see H\bHI\bIS\bST\bTO\bOR\bRY\bY below) for lines containing a specified string.  There are
+       two search modes: _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt_\ba_\bl and _\bn_\bo_\bn_\b-_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt_\ba_\bl.
+
+       Incremental searches begin before the  user  has  finished  typing  the
+       search  string.  As each character of the search string is typed, read-
+       line displays the next entry from the history matching the string typed
+       so  far.   An  incremental  search  requires only as many characters as
+       needed to find the desired history entry.  The  characters  present  in
+       the  value of the i\bis\bse\bea\bar\brc\bch\bh-\b-t\bte\ber\brm\bmi\bin\bna\bat\bto\bor\brs\bs variable are used to terminate an
+       incremental search.  If that variable has not been assigned a value the
+       Escape  and  Control-J characters will terminate an incremental search.
+       Control-G will abort an incremental search  and  restore  the  original
+       line.   When the search is terminated, the history entry containing the
+       search string becomes the current line.
+
+       To find other matching entries in the history list, type  Control-S  or
+       Control-R  as appropriate.  This will search backward or forward in the
+       history for the next entry matching the search  string  typed  so  far.
+       Any  other  key sequence bound to a readline command will terminate the
+       search and execute that command.  For instance, a _\bn_\be_\bw_\bl_\bi_\bn_\be  will  termi-
+       nate the search and accept the line, thereby executing the command from
+       the history list.
+
+       Readline remembers the last incremental search string.  If two Control-
+       Rs  are  typed without any intervening characters defining a new search
+       string, any remembered search string is used.
+
+       Non-incremental searches read the entire search string before  starting
+       to  search  for matching history lines.  The search string may be typed
+       by the user or be part of the contents of the current line.
+
+   R\bRe\bea\bad\bdl\bli\bin\bne\be C\bCo\bom\bmm\bma\ban\bnd\bd N\bNa\bam\bme\bes\bs
+       The following is a list of the names of the commands  and  the  default
+       key sequences to which they are bound.  Command names without an accom-
+       panying key sequence are unbound by default.  In the following descrip-
+       tions,  _\bp_\bo_\bi_\bn_\bt refers to the current cursor position, and _\bm_\ba_\br_\bk refers to
+       a cursor position saved by the s\bse\bet\bt-\b-m\bma\bar\brk\bk command.  The text between  the
+       point and mark is referred to as the _\br_\be_\bg_\bi_\bo_\bn.
+
+   C\bCo\bom\bmm\bma\ban\bnd\bds\bs f\bfo\bor\br M\bMo\bov\bvi\bin\bng\bg
+       b\bbe\beg\bgi\bin\bnn\bni\bin\bng\bg-\b-o\bof\bf-\b-l\bli\bin\bne\be (\b(C\bC-\b-a\ba)\b)
+              Move to the start of the current line.
+       e\ben\bnd\bd-\b-o\bof\bf-\b-l\bli\bin\bne\be (\b(C\bC-\b-e\be)\b)
+              Move to the end of the line.
+       f\bfo\bor\brw\bwa\bar\brd\bd-\b-c\bch\bha\bar\br (\b(C\bC-\b-f\bf)\b)
+              Move forward a character.
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-c\bch\bha\bar\br (\b(C\bC-\b-b\bb)\b)
+              Move back a character.
+       f\bfo\bor\brw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-f\bf)\b)
+              Move forward to the end of the next word.  Words are composed of
+              alphanumeric characters (letters and digits).
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-b\bb)\b)
+              Move back to the start of the current or previous  word.   Words
+              are composed of alphanumeric characters (letters and digits).
+       c\bcl\ble\bea\bar\br-\b-s\bsc\bcr\bre\bee\ben\bn (\b(C\bC-\b-l\bl)\b)
+              Clear  the  screen  leaving  the  current line at the top of the
+              screen.  With an argument,  refresh  the  current  line  without
+              clearing the screen.
+       r\bre\bed\bdr\bra\baw\bw-\b-c\bcu\bur\brr\bre\ben\bnt\bt-\b-l\bli\bin\bne\be
+              Refresh the current line.
+
+   C\bCo\bom\bmm\bma\ban\bnd\bds\bs f\bfo\bor\br M\bMa\ban\bni\bip\bpu\bul\bla\bat\bti\bin\bng\bg t\bth\bhe\be H\bHi\bis\bst\bto\bor\bry\by
+       a\bac\bcc\bce\bep\bpt\bt-\b-l\bli\bin\bne\be (\b(N\bNe\bew\bwl\bli\bin\bne\be,\b, R\bRe\bet\btu\bur\brn\bn)\b)
+              Accept the line regardless of where the cursor is.  If this line
+              is non-empty, add it to the history list according to the  state
+              of  the H\bHI\bIS\bST\bTC\bCO\bON\bNT\bTR\bRO\bOL\bL variable.  If the line is a modified history
+              line, then restore the history line to its original state.
+       p\bpr\bre\bev\bvi\bio\bou\bus\bs-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(C\bC-\b-p\bp)\b)
+              Fetch the previous command from the history list, moving back in
+              the list.
+       n\bne\bex\bxt\bt-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(C\bC-\b-n\bn)\b)
+              Fetch  the next command from the history list, moving forward in
+              the list.
+       b\bbe\beg\bgi\bin\bnn\bni\bin\bng\bg-\b-o\bof\bf-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b-<\b<)\b)
+              Move to the first line in the history.
+       e\ben\bnd\bd-\b-o\bof\bf-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b->\b>)\b)
+              Move to the end of the input history, i.e., the  line  currently
+              being entered.
+       r\bre\bev\bve\ber\brs\bse\be-\b-s\bse\bea\bar\brc\bch\bh-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(C\bC-\b-r\br)\b)
+              Search  backward  starting  at  the current line and moving `up'
+              through the  history  as  necessary.   This  is  an  incremental
+              search.
+       f\bfo\bor\brw\bwa\bar\brd\bd-\b-s\bse\bea\bar\brc\bch\bh-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(C\bC-\b-s\bs)\b)
+              Search  forward  starting  at the current line and moving `down'
+              through the  history  as  necessary.   This  is  an  incremental
+              search.
+       n\bno\bon\bn-\b-i\bin\bnc\bcr\bre\bem\bme\ben\bnt\bta\bal\bl-\b-r\bre\bev\bve\ber\brs\bse\be-\b-s\bse\bea\bar\brc\bch\bh-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b-p\bp)\b)
+              Search backward through the history starting at the current line
+              using a non-incremental search for  a  string  supplied  by  the
+              user.
+       n\bno\bon\bn-\b-i\bin\bnc\bcr\bre\bem\bme\ben\bnt\bta\bal\bl-\b-f\bfo\bor\brw\bwa\bar\brd\bd-\b-s\bse\bea\bar\brc\bch\bh-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b-n\bn)\b)
+              Search  forward  through  the  history  using  a non-incremental
+              search for a string supplied by the user.
+       h\bhi\bis\bst\bto\bor\bry\by-\b-s\bse\bea\bar\brc\bch\bh-\b-f\bfo\bor\brw\bwa\bar\brd\bd
+              Search forward through the history for the string of  characters
+              between  the start of the current line and the point.  This is a
+              non-incremental search.
+       h\bhi\bis\bst\bto\bor\bry\by-\b-s\bse\bea\bar\brc\bch\bh-\b-b\bba\bac\bck\bkw\bwa\bar\brd\bd
+              Search backward through the history for the string of characters
+              between  the start of the current line and the point.  This is a
+              non-incremental search.
+       y\bya\ban\bnk\bk-\b-n\bnt\bth\bh-\b-a\bar\brg\bg (\b(M\bM-\b-C\bC-\b-y\by)\b)
+              Insert the first argument to the previous command  (usually  the
+              second word on the previous line) at point.  With an argument _\bn,
+              insert the _\bnth word from the previous command (the words in  the
+              previous  command  begin  with  word  0).   A  negative argument
+              inserts the _\bnth word from the end of the previous command.
+       y\bya\ban\bnk\bk-\b-l\bla\bas\bst\bt-\b-a\bar\brg\bg (\b(M\bM-\b-.\b.,\b, M\bM-\b-_\b_)\b)
+              Insert the last argument to the previous command (the last  word
+              of  the  previous  history  entry).   With  an  argument, behave
+              exactly like y\bya\ban\bnk\bk-\b-n\bnt\bth\bh-\b-a\bar\brg\bg.  Successive  calls  to  y\bya\ban\bnk\bk-\b-l\bla\bas\bst\bt-\b-a\bar\brg\bg
+              move  back through the history list, inserting the last argument
+              of each line in turn.
+       s\bsh\bhe\bel\bll\bl-\b-e\bex\bxp\bpa\ban\bnd\bd-\b-l\bli\bin\bne\be (\b(M\bM-\b-C\bC-\b-e\be)\b)
+              Expand the line as the shell does.  This performs alias and his-
+              tory expansion as well as all of the shell word expansions.  See
+              H\bHI\bIS\bST\bTO\bOR\bRY\bY E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN below for a description of history  expansion.
+       h\bhi\bis\bst\bto\bor\bry\by-\b-e\bex\bxp\bpa\ban\bnd\bd-\b-l\bli\bin\bne\be (\b(M\bM-\b-^\b^)\b)
+              Perform  history  expansion  on  the  current line.  See H\bHI\bIS\bST\bTO\bOR\bRY\bY
+              E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN below for a description of history expansion.
+       m\bma\bag\bgi\bic\bc-\b-s\bsp\bpa\bac\bce\be
+              Perform history expansion on  the  current  line  and  insert  a
+              space.  See H\bHI\bIS\bST\bTO\bOR\bRY\bY E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN below for a description of history
+              expansion.
+       a\bal\bli\bia\bas\bs-\b-e\bex\bxp\bpa\ban\bnd\bd-\b-l\bli\bin\bne\be
+              Perform alias expansion on the current line.  See A\bAL\bLI\bIA\bAS\bSE\bES\bS  above
+              for a description of alias expansion.
+       h\bhi\bis\bst\bto\bor\bry\by-\b-a\ban\bnd\bd-\b-a\bal\bli\bia\bas\bs-\b-e\bex\bxp\bpa\ban\bnd\bd-\b-l\bli\bin\bne\be
+              Perform history and alias expansion on the current line.
+       i\bin\bns\bse\ber\brt\bt-\b-l\bla\bas\bst\bt-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt (\b(M\bM-\b-.\b.,\b, M\bM-\b-_\b_)\b)
+              A synonym for y\bya\ban\bnk\bk-\b-l\bla\bas\bst\bt-\b-a\bar\brg\bg.
+       o\bop\bpe\ber\bra\bat\bte\be-\b-a\ban\bnd\bd-\b-g\bge\bet\bt-\b-n\bne\bex\bxt\bt (\b(C\bC-\b-o\bo)\b)
+              Accept  the  current  line for execution and fetch the next line
+              relative to the current line from the history for editing.   Any
+              argument is ignored.
+       e\bed\bdi\bit\bt-\b-a\ban\bnd\bd-\b-e\bex\bxe\bec\bcu\but\bte\be-\b-c\bco\bom\bmm\bma\ban\bnd\bd (\b(C\bC-\b-x\bxC\bC-\b-e\be)\b)
+              Invoke  an  editor  on the current command line, and execute the
+              result as shell commands.   B\bBa\bas\bsh\bh  attempts  to  invoke  $\b$F\bFC\bCE\bED\bDI\bIT\bT,
+              $\b$E\bED\bDI\bIT\bTO\bOR\bR, and _\be_\bm_\ba_\bc_\bs as the editor, in that order.
+
+   C\bCo\bom\bmm\bma\ban\bnd\bds\bs f\bfo\bor\br C\bCh\bha\ban\bng\bgi\bin\bng\bg T\bTe\bex\bxt\bt
+       d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br (\b(C\bC-\b-d\bd)\b)
+              Delete  the character at point.  If point is at the beginning of
+              the line, there are no characters in  the  line,  and  the  last
+              character typed was not bound to d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br, then return E\bEO\bOF\bF.
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br (\b(R\bRu\bub\bbo\bou\but\bt)\b)
+              Delete  the  character  behind the cursor.  When given a numeric
+              argument, save the deleted text on the kill ring.
+       f\bfo\bor\brw\bwa\bar\brd\bd-\b-b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br
+              Delete the character under the cursor, unless the cursor  is  at
+              the end of the line, in which case the character behind the cur-
+              sor is deleted.
+       q\bqu\buo\bot\bte\bed\bd-\b-i\bin\bns\bse\ber\brt\bt (\b(C\bC-\b-q\bq,\b, C\bC-\b-v\bv)\b)
+              Add the next character typed to the line verbatim.  This is  how
+              to insert characters like C\bC-\b-q\bq, for example.
+       t\bta\bab\bb-\b-i\bin\bns\bse\ber\brt\bt (\b(C\bC-\b-v\bv T\bTA\bAB\bB)\b)
+              Insert a tab character.
+       s\bse\bel\blf\bf-\b-i\bin\bns\bse\ber\brt\bt (\b(a\ba,\b, b\bb,\b, A\bA,\b, 1\b1,\b, !\b!,\b, .\b..\b..\b.)\b)
+              Insert the character typed.
+       t\btr\bra\ban\bns\bsp\bpo\bos\bse\be-\b-c\bch\bha\bar\brs\bs (\b(C\bC-\b-t\bt)\b)
+              Drag  the  character  before point forward over the character at
+              point, moving point forward as well.  If point is at the end  of
+              the  line, then this transposes the two characters before point.
+              Negative arguments have no effect.
+       t\btr\bra\ban\bns\bsp\bpo\bos\bse\be-\b-w\bwo\bor\brd\bds\bs (\b(M\bM-\b-t\bt)\b)
+              Drag the word before point past the  word  after  point,  moving
+              point  over  that  word  as well.  If point is at the end of the
+              line, this transposes the last two words on the line.
+       u\bup\bpc\bca\bas\bse\be-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-u\bu)\b)
+              Uppercase the current (or  following)  word.   With  a  negative
+              argument, uppercase the previous word, but do not move point.
+       d\bdo\bow\bwn\bnc\bca\bas\bse\be-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-l\bl)\b)
+              Lowercase  the  current  (or  following)  word.  With a negative
+              argument, lowercase the previous word, but do not move point.
+       c\bca\bap\bpi\bit\bta\bal\bli\biz\bze\be-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-c\bc)\b)
+              Capitalize the current (or following)  word.   With  a  negative
+              argument, capitalize the previous word, but do not move point.
+       o\bov\bve\ber\brw\bwr\bri\bit\bte\be-\b-m\bmo\bod\bde\be
+              Toggle  overwrite mode.  With an explicit positive numeric argu-
+              ment, switches to overwrite mode.  With an explicit non-positive
+              numeric argument, switches to insert mode.  This command affects
+              only e\bem\bma\bac\bcs\bs mode; v\bvi\bi mode does overwrite differently.  Each  call
+              to _\br_\be_\ba_\bd_\bl_\bi_\bn_\be_\b(_\b) starts in insert mode.  In overwrite mode, charac-
+              ters bound to s\bse\bel\blf\bf-\b-i\bin\bns\bse\ber\brt\bt replace the text at point rather  than
+              pushing  the  text  to  the  right.   Characters  bound to b\bba\bac\bck\bk-\b-
+              w\bwa\bar\brd\bd-\b-d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br replace  the  character  before  point  with  a
+              space.  By default, this command is unbound.
+
+   K\bKi\bil\bll\bli\bin\bng\bg a\ban\bnd\bd Y\bYa\ban\bnk\bki\bin\bng\bg
+       k\bki\bil\bll\bl-\b-l\bli\bin\bne\be (\b(C\bC-\b-k\bk)\b)
+              Kill the text from point to the end of the line.
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-k\bki\bil\bll\bl-\b-l\bli\bin\bne\be (\b(C\bC-\b-x\bx R\bRu\bub\bbo\bou\but\bt)\b)
+              Kill backward to the beginning of the line.
+       u\bun\bni\bix\bx-\b-l\bli\bin\bne\be-\b-d\bdi\bis\bsc\bca\bar\brd\bd (\b(C\bC-\b-u\bu)\b)
+              Kill  backward  from  point  to  the beginning of the line.  The
+              killed text is saved on the kill-ring.
+       k\bki\bil\bll\bl-\b-w\bwh\bho\bol\ble\be-\b-l\bli\bin\bne\be
+              Kill all characters on the current line, no matter  where  point
+              is.
+       k\bki\bil\bll\bl-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-d\bd)\b)
+              Kill  from  point  to the end of the current word, or if between
+              words, to the end of the next word.   Word  boundaries  are  the
+              same as those used by f\bfo\bor\brw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd.
+       b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-k\bki\bil\bll\bl-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-R\bRu\bub\bbo\bou\but\bt)\b)
+              Kill  the  word  behind  point.  Word boundaries are the same as
+              those used by b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd.
+       u\bun\bni\bix\bx-\b-w\bwo\bor\brd\bd-\b-r\bru\bub\bbo\bou\but\bt (\b(C\bC-\b-w\bw)\b)
+              Kill the word behind point, using white space as a  word  bound-
+              ary.  The killed text is saved on the kill-ring.
+       d\bde\bel\ble\bet\bte\be-\b-h\bho\bor\bri\biz\bzo\bon\bnt\bta\bal\bl-\b-s\bsp\bpa\bac\bce\be (\b(M\bM-\b-\\b\)\b)
+              Delete all spaces and tabs around point.
+       k\bki\bil\bll\bl-\b-r\bre\beg\bgi\bio\bon\bn
+              Kill the text in the current region.
+       c\bco\bop\bpy\by-\b-r\bre\beg\bgi\bio\bon\bn-\b-a\bas\bs-\b-k\bki\bil\bll\bl
+              Copy the text in the region to the kill buffer.
+       c\bco\bop\bpy\by-\b-b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd
+              Copy  the word before point to the kill buffer.  The word bound-
+              aries are the same as b\bba\bac\bck\bkw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd.
+       c\bco\bop\bpy\by-\b-f\bfo\bor\brw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd
+              Copy the word following point to  the  kill  buffer.   The  word
+              boundaries are the same as f\bfo\bor\brw\bwa\bar\brd\bd-\b-w\bwo\bor\brd\bd.
+       y\bya\ban\bnk\bk (\b(C\bC-\b-y\by)\b)
+              Yank the top of the kill ring into the buffer at point.
+       y\bya\ban\bnk\bk-\b-p\bpo\bop\bp (\b(M\bM-\b-y\by)\b)
+              Rotate  the kill ring, and yank the new top.  Only works follow-
+              ing y\bya\ban\bnk\bk or y\bya\ban\bnk\bk-\b-p\bpo\bop\bp.
+
+   N\bNu\bum\bme\ber\bri\bic\bc A\bAr\brg\bgu\bum\bme\ben\bnt\bts\bs
+       d\bdi\big\bgi\bit\bt-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt (\b(M\bM-\b-0\b0,\b, M\bM-\b-1\b1,\b, .\b..\b..\b.,\b, M\bM-\b--\b-)\b)
+              Add this digit to the argument already accumulating, or start  a
+              new argument.  M-- starts a negative argument.
+       u\bun\bni\biv\bve\ber\brs\bsa\bal\bl-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt
+              This  is another way to specify an argument.  If this command is
+              followed by one or more digits, optionally with a leading  minus
+              sign,  those digits define the argument.  If the command is fol-
+              lowed by digits, executing  u\bun\bni\biv\bve\ber\brs\bsa\bal\bl-\b-a\bar\brg\bgu\bum\bme\ben\bnt\bt  again  ends  the
+              numeric  argument, but is otherwise ignored.  As a special case,
+              if this command is immediately followed by a character  that  is
+              neither  a  digit or minus sign, the argument count for the next
+              command is multiplied by four.  The argument count is  initially
+              one,  so  executing this function the first time makes the argu-
+              ment count four, a second time makes the argument count sixteen,
+              and so on.
+
+   C\bCo\bom\bmp\bpl\ble\bet\bti\bin\bng\bg
+       c\bco\bom\bmp\bpl\ble\bet\bte\be (\b(T\bTA\bAB\bB)\b)
+              Attempt  to  perform  completion on the text before point.  B\bBa\bas\bsh\bh
+              attempts completion treating the text as a variable (if the text
+              begins  with  $\b$), username (if the text begins with ~\b~), hostname
+              (if the text begins with @\b@), or command (including  aliases  and
+              functions) in turn.  If none of these produces a match, filename
+              completion is attempted.
+       p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(M\bM-\b-?\b?)\b)
+              List the possible completions of the text before point.
+       i\bin\bns\bse\ber\brt\bt-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(M\bM-\b-*\b*)\b)
+              Insert all completions of the text before point that would  have
+              been generated by p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs.
+       m\bme\ben\bnu\bu-\b-c\bco\bom\bmp\bpl\ble\bet\bte\be
+              Similar  to c\bco\bom\bmp\bpl\ble\bet\bte\be, but replaces the word to be completed with
+              a single match from the list of possible completions.   Repeated
+              execution  of  m\bme\ben\bnu\bu-\b-c\bco\bom\bmp\bpl\ble\bet\bte\be  steps through the list of possible
+              completions, inserting each match in turn.  At the  end  of  the
+              list of completions, the bell is rung (subject to the setting of
+              b\bbe\bel\bll\bl-\b-s\bst\bty\byl\ble\be) and the original text is restored.  An argument of _\bn
+              moves  _\bn  positions  forward  in the list of matches; a negative
+              argument may be used to move backward through  the  list.   This
+              command  is  intended  to  be  bound  to  T\bTA\bAB\bB, but is unbound by
+              default.
+       d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br-\b-o\bor\br-\b-l\bli\bis\bst\bt
+              Deletes the character under the cursor if not at  the  beginning
+              or  end  of  the  line (like d\bde\bel\ble\bet\bte\be-\b-c\bch\bha\bar\br).  If at the end of the
+              line, behaves identically to p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs.  This command
+              is unbound by default.
+       c\bco\bom\bmp\bpl\ble\bet\bte\be-\b-f\bfi\bil\ble\ben\bna\bam\bme\be (\b(M\bM-\b-/\b/)\b)
+              Attempt filename completion on the text before point.
+       p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-f\bfi\bil\ble\ben\bna\bam\bme\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(C\bC-\b-x\bx /\b/)\b)
+              List the possible completions of the text before point, treating
+              it as a filename.
+       c\bco\bom\bmp\bpl\ble\bet\bte\be-\b-u\bus\bse\ber\brn\bna\bam\bme\be (\b(M\bM-\b-~\b~)\b)
+              Attempt completion on the text before point, treating  it  as  a
+              username.
+       p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-u\bus\bse\ber\brn\bna\bam\bme\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(C\bC-\b-x\bx ~\b~)\b)
+              List the possible completions of the text before point, treating
+              it as a username.
+       c\bco\bom\bmp\bpl\ble\bet\bte\be-\b-v\bva\bar\bri\bia\bab\bbl\ble\be (\b(M\bM-\b-$\b$)\b)
+              Attempt completion on the text before point, treating  it  as  a
+              shell variable.
+       p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-v\bva\bar\bri\bia\bab\bbl\ble\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(C\bC-\b-x\bx $\b$)\b)
+              List the possible completions of the text before point, treating
+              it as a shell variable.
+       c\bco\bom\bmp\bpl\ble\bet\bte\be-\b-h\bho\bos\bst\btn\bna\bam\bme\be (\b(M\bM-\b-@\b@)\b)
+              Attempt completion on the text before point, treating  it  as  a
+              hostname.
+       p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-h\bho\bos\bst\btn\bna\bam\bme\be-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(C\bC-\b-x\bx @\b@)\b)
+              List the possible completions of the text before point, treating
+              it as a hostname.
+       c\bco\bom\bmp\bpl\ble\bet\bte\be-\b-c\bco\bom\bmm\bma\ban\bnd\bd (\b(M\bM-\b-!\b!)\b)
+              Attempt completion on the text before point, treating  it  as  a
+              command  name.   Command  completion  attempts to match the text
+              against  aliases,  reserved  words,   shell   functions,   shell
+              builtins, and finally executable filenames, in that order.
+       p\bpo\bos\bss\bsi\bib\bbl\ble\be-\b-c\bco\bom\bmm\bma\ban\bnd\bd-\b-c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bns\bs (\b(C\bC-\b-x\bx !\b!)\b)
+              List the possible completions of the text before point, treating
+              it as a command name.
+       d\bdy\byn\bna\bam\bmi\bic\bc-\b-c\bco\bom\bmp\bpl\ble\bet\bte\be-\b-h\bhi\bis\bst\bto\bor\bry\by (\b(M\bM-\b-T\bTA\bAB\bB)\b)
+              Attempt completion on the text before point, comparing the  text
+              against  lines  from  the  history  list for possible completion
+              matches.
+       c\bco\bom\bmp\bpl\ble\bet\bte\be-\b-i\bin\bnt\bto\bo-\b-b\bbr\bra\bac\bce\bes\bs (\b(M\bM-\b-{\b{)\b)
+              Perform filename completion and insert the list of possible com-
+              pletions  enclosed within braces so the list is available to the
+              shell (see B\bBr\bra\bac\bce\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn above).
+
+   K\bKe\bey\byb\bbo\boa\bar\brd\bd M\bMa\bac\bcr\bro\bos\bs
+       s\bst\bta\bar\brt\bt-\b-k\bkb\bbd\bd-\b-m\bma\bac\bcr\bro\bo (\b(C\bC-\b-x\bx (\b()\b)
+              Begin saving the characters  typed  into  the  current  keyboard
+              macro.
+       e\ben\bnd\bd-\b-k\bkb\bbd\bd-\b-m\bma\bac\bcr\bro\bo (\b(C\bC-\b-x\bx )\b))\b)
+              Stop saving the characters typed into the current keyboard macro
+              and store the definition.
+       c\bca\bal\bll\bl-\b-l\bla\bas\bst\bt-\b-k\bkb\bbd\bd-\b-m\bma\bac\bcr\bro\bo (\b(C\bC-\b-x\bx e\be)\b)
+              Re-execute the last keyboard macro defined, by making the  char-
+              acters in the macro appear as if typed at the keyboard.
+
+   M\bMi\bis\bsc\bce\bel\bll\bla\ban\bne\beo\bou\bus\bs
+       r\bre\be-\b-r\bre\bea\bad\bd-\b-i\bin\bni\bit\bt-\b-f\bfi\bil\ble\be (\b(C\bC-\b-x\bx C\bC-\b-r\br)\b)
+              Read  in  the  contents of the _\bi_\bn_\bp_\bu_\bt_\br_\bc file, and incorporate any
+              bindings or variable assignments found there.
+       a\bab\bbo\bor\brt\bt (\b(C\bC-\b-g\bg)\b)
+              Abort the current editing command and ring the  terminal's  bell
+              (subject to the setting of b\bbe\bel\bll\bl-\b-s\bst\bty\byl\ble\be).
+       d\bdo\bo-\b-u\bup\bpp\bpe\ber\brc\bca\bas\bse\be-\b-v\bve\ber\brs\bsi\bio\bon\bn (\b(M\bM-\b-a\ba,\b, M\bM-\b-b\bb,\b, M\bM-\b-_\bx,\b, .\b..\b..\b.)\b)
+              If  the  metafied character _\bx is lowercase, run the command that
+              is bound to the corresponding uppercase character.
+       p\bpr\bre\bef\bfi\bix\bx-\b-m\bme\bet\bta\ba (\b(E\bES\bSC\bC)\b)
+              Metafy the next character typed.  E\bES\bSC\bC f\bf is equivalent to M\bMe\bet\bta\ba-\b-f\bf.
+       u\bun\bnd\bdo\bo (\b(C\bC-\b-_\b_,\b, C\bC-\b-x\bx C\bC-\b-u\bu)\b)
+              Incremental undo, separately remembered for each line.
+       r\bre\bev\bve\ber\brt\bt-\b-l\bli\bin\bne\be (\b(M\bM-\b-r\br)\b)
+              Undo  all changes made to this line.  This is like executing the
+              u\bun\bnd\bdo\bo command enough times to return  the  line  to  its  initial
+              state.
+       t\bti\bil\bld\bde\be-\b-e\bex\bxp\bpa\ban\bnd\bd (\b(M\bM-\b-&\b&)\b)
+              Perform tilde expansion on the current word.
+       s\bse\bet\bt-\b-m\bma\bar\brk\bk (\b(C\bC-\b-@\b@,\b, M\bM-\b-<\b<s\bsp\bpa\bac\bce\be>\b>)\b)
+              Set  the  mark to the point.  If a numeric argument is supplied,
+              the mark is set to that position.
+       e\bex\bxc\bch\bha\ban\bng\bge\be-\b-p\bpo\boi\bin\bnt\bt-\b-a\ban\bnd\bd-\b-m\bma\bar\brk\bk (\b(C\bC-\b-x\bx C\bC-\b-x\bx)\b)
+              Swap the point with the mark.  The current  cursor  position  is
+              set  to the saved position, and the old cursor position is saved
+              as the mark.
+       c\bch\bha\bar\bra\bac\bct\bte\ber\br-\b-s\bse\bea\bar\brc\bch\bh (\b(C\bC-\b-]\b])\b)
+              A character is read and point is moved to the next occurrence of
+              that  character.   A negative count searches for previous occur-
+              rences.
+       c\bch\bha\bar\bra\bac\bct\bte\ber\br-\b-s\bse\bea\bar\brc\bch\bh-\b-b\bba\bac\bck\bkw\bwa\bar\brd\bd (\b(M\bM-\b-C\bC-\b-]\b])\b)
+              A character is read and point is moved to  the  previous  occur-
+              rence  of  that character.  A negative count searches for subse-
+              quent occurrences.
+       i\bin\bns\bse\ber\brt\bt-\b-c\bco\bom\bmm\bme\ben\bnt\bt (\b(M\bM-\b-#\b#)\b)
+              Without a numeric argument,  the  value  of  the  readline  c\bco\bom\bm-\b-
+              m\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn  variable is inserted at the beginning of the current
+              line.  If a numeric argument is supplied, this command acts as a
+              toggle:   if  the characters at the beginning of the line do not
+              match the value of c\bco\bom\bmm\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn, the value is inserted,  other-
+              wise the characters in c\bco\bom\bmm\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn are deleted from the begin-
+              ning of the line.  In either case, the line is accepted as if  a
+              newline  had  been  typed.   The  default value of c\bco\bom\bmm\bme\ben\bnt\bt-\b-b\bbe\beg\bgi\bin\bn
+              causes this command to make the current line  a  shell  comment.
+              If  a  numeric  argument  causes  the  comment  character  to be
+              removed, the line will be executed by the shell.
+       g\bgl\blo\bob\bb-\b-c\bco\bom\bmp\bpl\ble\bet\bte\be-\b-w\bwo\bor\brd\bd (\b(M\bM-\b-g\bg)\b)
+              The word before point is  treated  as  a  pattern  for  pathname
+              expansion,  with  an asterisk implicitly appended.  This pattern
+              is used to generate a list of matching file names  for  possible
+              completions.
+       g\bgl\blo\bob\bb-\b-e\bex\bxp\bpa\ban\bnd\bd-\b-w\bwo\bor\brd\bd (\b(C\bC-\b-x\bx *\b*)\b)
+              The  word  before  point  is  treated  as a pattern for pathname
+              expansion, and the list of  matching  file  names  is  inserted,
+              replacing  the  word.   If  a  numeric  argument is supplied, an
+              asterisk is appended before pathname expansion.
+       g\bgl\blo\bob\bb-\b-l\bli\bis\bst\bt-\b-e\bex\bxp\bpa\ban\bns\bsi\bio\bon\bns\bs (\b(C\bC-\b-x\bx g\bg)\b)
+              The list  of  expansions  that  would  have  been  generated  by
+              g\bgl\blo\bob\bb-\b-e\bex\bxp\bpa\ban\bnd\bd-\b-w\bwo\bor\brd\bd  is  displayed,  and the line is redrawn.  If a
+              numeric argument is supplied, an  asterisk  is  appended  before
+              pathname expansion.
+       d\bdu\bum\bmp\bp-\b-f\bfu\bun\bnc\bct\bti\bio\bon\bns\bs
+              Print  all  of the functions and their key bindings to the read-
+              line output stream.  If a numeric argument is supplied, the out-
+              put  is  formatted  in such a way that it can be made part of an
+              _\bi_\bn_\bp_\bu_\bt_\br_\bc file.
+       d\bdu\bum\bmp\bp-\b-v\bva\bar\bri\bia\bab\bbl\ble\bes\bs
+              Print all of the settable readline variables and their values to
+              the  readline output stream.  If a numeric argument is supplied,
+              the output is formatted in such a way that it can be  made  part
+              of an _\bi_\bn_\bp_\bu_\bt_\br_\bc file.
+       d\bdu\bum\bmp\bp-\b-m\bma\bac\bcr\bro\bos\bs
+              Print  all of the readline key sequences bound to macros and the
+              strings they ouput.  If a numeric argument is supplied, the out-
+              put  is  formatted  in such a way that it can be made part of an
+              _\bi_\bn_\bp_\bu_\bt_\br_\bc file.
+       d\bdi\bis\bsp\bpl\bla\bay\by-\b-s\bsh\bhe\bel\bll\bl-\b-v\bve\ber\brs\bsi\bio\bon\bn (\b(C\bC-\b-x\bx C\bC-\b-v\bv)\b)
+              Display version information about the current instance of  b\bba\bas\bsh\bh.
+
+   P\bPr\bro\bog\bgr\bra\bam\bmm\bma\bab\bbl\ble\be C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn
+       When  word  completion  is  attempted  for an argument to a command for
+       which a completion specification (a _\bc_\bo_\bm_\bp_\bs_\bp_\be_\bc) has  been  defined  using
+       the  c\bco\bom\bmp\bpl\ble\bet\bte\be  builtin  (see  S\bSH\bHE\bEL\bLL\bL  B\bBU\bUI\bIL\bLT\bTI\bIN\bN  C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below), the pro-
+       grammable completion facilities are invoked.
+
+       First, the command name is identified.  If a compspec has been  defined
+       for that command, the compspec is used to generate the list of possible
+       completions for the word.  If the command word is a  full  pathname,  a
+       compspec  for  the full pathname is searched for first.  If no compspec
+       is found for the full pathname, an attempt is made to find  a  compspec
+       for the portion following the final slash.
+
+       Once  a  compspec  has  been  found, it is used to generate the list of
+       matching words.  If a compspec is not found, the default  b\bba\bas\bsh\bh  comple-
+       tion as described above under C\bCo\bom\bmp\bpl\ble\bet\bti\bin\bng\bg is performed.
+
+       First,  the  actions  specified by the compspec are used.  Only matches
+       which are prefixed by the word being completed are returned.  When  the
+       -\b-f\bf  or -\b-d\bd option is used for filename or directory name completion, the
+       shell variable F\bFI\bIG\bGN\bNO\bOR\bRE\bE is used to filter the matches.
+
+       Any completions specified by a filename expansion  pattern  to  the  -\b-G\bG
+       option are generated next.  The words generated by the pattern need not
+       match the word being completed.  The G\bGL\bLO\bOB\bBI\bIG\bGN\bNO\bOR\bRE\bE shell variable  is  not
+       used to filter the matches, but the F\bFI\bIG\bGN\bNO\bOR\bRE\bE variable is used.
+
+       Next,  the string specified as the argument to the -\b-W\bW option is consid-
+       ered.  The string is first split using the characters in the  I\bIF\bFS\bS  spe-
+       cial  variable  as delimiters.  Shell quoting is honored.  Each word is
+       then expanded using brace expansion,  tilde  expansion,  parameter  and
+       variable  expansion,  command  substitution,  arithmetic expansion, and
+       pathname expansion, as described above under  E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN.   The  results
+       are  split  using  the rules described above under W\bWo\bor\brd\bd S\bSp\bpl\bli\bit\btt\bti\bin\bng\bg.  The
+       results of the expansion are prefix-matched against the word being com-
+       pleted, and the matching words become the possible completions.
+
+       After  these matches have been generated, any shell function or command
+       specified with the -\b-F\bF and -\b-C\bC options is invoked.  When the  command  or
+       function  is  invoked,  the  C\bCO\bOM\bMP\bP_\b_L\bLI\bIN\bNE\bE  and  C\bCO\bOM\bMP\bP_\b_P\bPO\bOI\bIN\bNT\bT  variables  are
+       assigned values as described above under S\bSh\bhe\bel\bll\bl V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs.  If  a  shell
+       function  is being invoked, the C\bCO\bOM\bMP\bP_\b_W\bWO\bOR\bRD\bDS\bS and C\bCO\bOM\bMP\bP_\b_C\bCW\bWO\bOR\bRD\bD variables are
+       also set.  When the function or command is invoked, the first  argument
+       is  the  name  of  the command whose arguments are being completed, the
+       second argument is the word being completed, and the third argument  is
+       the  word  preceding  the  word  being completed on the current command
+       line.  No filtering of the generated completions against the word being
+       completed is performed; the function or command has complete freedom in
+       generating the matches.
+
+       Any function specified with -\b-F\bF is invoked first.  The function may  use
+       any  of  the  shell facilities, including the c\bco\bom\bmp\bpg\bge\ben\bn builtin described
+       below, to generate the matches.  It must put the  possible  completions
+       in the C\bCO\bOM\bMP\bPR\bRE\bEP\bPL\bLY\bY array variable.
+
+       Next,  any  command specified with the -\b-C\bC option is invoked in an envi-
+       ronment equivalent to command substitution.  It should print a list  of
+       completions,  one  per  line, to the standard output.  Backslash may be
+       used to escape a newline, if necessary.
+
+       After all of the possible completions are generated, any filter  speci-
+       fied  with  the -\b-X\bX option is applied to the list.  The filter is a pat-
+       tern as used for pathname expansion; a &\b& in  the  pattern  is  replaced
+       with  the text of the word being completed.  A literal &\b& may be escaped
+       with a backslash; the backslash is removed before attempting  a  match.
+       Any  completion that matches the pattern will be removed from the list.
+       A leading !\b! negates the pattern; in this case any completion not match-
+       ing the pattern will be removed.
+
+       Finally, any prefix and suffix specified with the -\b-P\bP and -\b-S\bS options are
+       added to each member of the completion list, and the result is returned
+       to the readline completion code as the list of possible completions.
+
+       If  the previously-applied actions do not generate any matches, and the
+       -\b-o\bo d\bdi\bir\brn\bna\bam\bme\bes\bs option was supplied  to  c\bco\bom\bmp\bpl\ble\bet\bte\be  when  the  compspec  was
+       defined, directory name completion is attempted.
+
+       If  the  -\b-o\bo  p\bpl\blu\bus\bsd\bdi\bir\brs\bs option was supplied to c\bco\bom\bmp\bpl\ble\bet\bte\be when the compspec
+       was defined, directory name completion is attempted and any matches are
+       added to the results of the other actions.
+
+       By  default,  if a compspec is found, whatever it generates is returned
+       to the completion code as the full set of  possible  completions.   The
+       default b\bba\bas\bsh\bh completions are not attempted, and the readline default of
+       filename completion is disabled.  If the -\b-o\bo b\bba\bas\bsh\bhd\bde\bef\bfa\bau\bul\blt\bt option was sup-
+       plied  to c\bco\bom\bmp\bpl\ble\bet\bte\be when the compspec was defined, the b\bba\bas\bsh\bh default com-
+       pletions are attempted if the compspec generates no matches.  If the -\b-o\bo
+       d\bde\bef\bfa\bau\bul\blt\bt  option was supplied to c\bco\bom\bmp\bpl\ble\bet\bte\be when the compspec was defined,
+       readline's default completion will be performed if the  compspec  (and,
+       if attempted, the default b\bba\bas\bsh\bh completions) generate no matches.
+
+       When  a  compspec  indicates that directory name completion is desired,
+       the programmable completion functions force readline to append a  slash
+       to  completed names which are symbolic links to directories, subject to
+       the value of the m\bma\bar\brk\bk-\b-d\bdi\bir\bre\bec\bct\bto\bor\bri\bie\bes\bs readline variable, regardless of  the
+       setting of the m\bma\bar\brk\bk-\b-s\bsy\bym\bml\bli\bin\bnk\bke\bed\bd-\b-d\bdi\bir\bre\bec\bct\bto\bor\bri\bie\bes\bs readline variable.
+
+H\bHI\bIS\bST\bTO\bOR\bRY\bY
+       When  the  -\b-o\bo  h\bhi\bis\bst\bto\bor\bry\by  option to the s\bse\bet\bt builtin is enabled, the shell
+       provides access to the _\bc_\bo_\bm_\bm_\ba_\bn_\bd _\bh_\bi_\bs_\bt_\bo_\br_\by, the list of commands previously
+       typed.   The  value  of  the H\bHI\bIS\bST\bTS\bSI\bIZ\bZE\bE variable is used as the number of
+       commands to save in a history list.  The text of the last H\bHI\bIS\bST\bTS\bSI\bIZ\bZE\bE com-
+       mands  (default  500)  is  saved.  The shell stores each command in the
+       history list prior to parameter and variable expansion  (see  E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN
+       above)  but after history expansion is performed, subject to the values
+       of the shell variables H\bHI\bIS\bST\bTI\bIG\bGN\bNO\bOR\bRE\bE and H\bHI\bIS\bST\bTC\bCO\bON\bNT\bTR\bRO\bOL\bL.
+
+       On startup, the history is initialized from the file named by the vari-
+       able  H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE  (default _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bh_\bi_\bs_\bt_\bo_\br_\by).  The file named by the value
+       of H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE is truncated, if necessary, to contain  no  more  than  the
+       number of lines specified by the value of H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bES\bSI\bIZ\bZE\bE.  When an inter-
+       active shell exits, the last $\b$H\bHI\bIS\bST\bTS\bSI\bIZ\bZE\bE lines are copied from  the  his-
+       tory list to $\b$H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE.  If the h\bhi\bis\bst\bta\bap\bpp\bpe\ben\bnd\bd shell option is enabled (see
+       the description of s\bsh\bho\bop\bpt\bt under S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below), the lines
+       are  appended  to the history file, otherwise the history file is over-
+       written.  If H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE is unset, or if the history file  is  unwritable,
+       the  history  is not saved.  After saving the history, the history file
+       is  truncated  to  contain  no  more  than  H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bES\bSI\bIZ\bZE\bE   lines.    If
+       H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bES\bSI\bIZ\bZE\bE is not set, no truncation is performed.
+
+       The  builtin  command f\bfc\bc (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below) may be used
+       to list or edit and re-execute a portion of the history list.  The h\bhi\bis\bs-\b-
+       t\bto\bor\bry\by  builtin  may  be  used  to display or modify the history list and
+       manipulate the history file.  When using command-line  editing,  search
+       commands  are available in each editing mode that provide access to the
+       history list.
+
+       The shell allows control over which commands are saved on  the  history
+       list.  The H\bHI\bIS\bST\bTC\bCO\bON\bNT\bTR\bRO\bOL\bL and H\bHI\bIS\bST\bTI\bIG\bGN\bNO\bOR\bRE\bE variables may be set to cause the
+       shell to save only a subset of the commands entered.  The c\bcm\bmd\bdh\bhi\bis\bst\bt shell
+       option,  if enabled, causes the shell to attempt to save each line of a
+       multi-line command in the same history entry, adding  semicolons  where
+       necessary  to preserve syntactic correctness.  The l\bli\bit\bth\bhi\bis\bst\bt shell option
+       causes the shell to save the command with embedded newlines instead  of
+       semicolons.  See the description of the s\bsh\bho\bop\bpt\bt builtin below under S\bSH\bHE\bEL\bLL\bL
+       B\bBU\bUI\bIL\bLT\bTI\bIN\bN  C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS  for  information  on  setting  and  unsetting  shell
+       options.
+
+H\bHI\bIS\bST\bTO\bOR\bRY\bY E\bEX\bXP\bPA\bAN\bNS\bSI\bIO\bON\bN
+       The  shell  supports a history expansion feature that is similar to the
+       history expansion in c\bcs\bsh\bh.\b.  This section describes what syntax  features
+       are  available.   This  feature  is  enabled by default for interactive
+       shells, and can be disabled using the +\b+H\bH option to the s\bse\bet\bt builtin com-
+       mand (see S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS below).  Non-interactive shells do not
+       perform history expansion by default.
+
+       History expansions introduce words from the history list into the input
+       stream,  making  it  easy to repeat commands, insert the arguments to a
+       previous command into the current input line, or fix errors in previous
+       commands quickly.
+
+       History  expansion  is  performed  immediately after a complete line is
+       read, before the shell breaks it into words.  It  takes  place  in  two
+       parts.   The  first is to determine which line from the history list to
+       use during substitution.  The second is to select portions of that line
+       for inclusion into the current one.  The line selected from the history
+       is the _\be_\bv_\be_\bn_\bt, and the portions of that line that  are  acted  upon  are
+       _\bw_\bo_\br_\bd_\bs.   Various  _\bm_\bo_\bd_\bi_\bf_\bi_\be_\br_\bs  are  available  to manipulate the selected
+       words.  The line is broken into words in the same fashion as when read-
+       ing  input, so that several _\bm_\be_\bt_\ba_\bc_\bh_\ba_\br_\ba_\bc_\bt_\be_\br-separated words surrounded by
+       quotes are considered one word.  History expansions are  introduced  by
+       the  appearance  of  the  history  expansion  character,  which is !\b! by
+       default.  Only backslash (\\b\) and single quotes can  quote  the  history
+       expansion character.
+
+       Several  characters inhibit history expansion if found immediately fol-
+       lowing the history expansion character, even if it is unquoted:  space,
+       tab,  newline,  carriage return, and =\b=.  If the e\bex\bxt\btg\bgl\blo\bob\bb shell option is
+       enabled, (\b( will also inhibit expansion.
+
+       Several shell options settable with the s\bsh\bho\bop\bpt\bt builtin may  be  used  to
+       tailor  the  behavior  of  history  expansion.  If the h\bhi\bis\bst\btv\bve\ber\bri\bif\bfy\by shell
+       option is enabled (see the description of the s\bsh\bho\bop\bpt\bt builtin), and r\bre\bea\bad\bd-\b-
+       l\bli\bin\bne\be is being used, history substitutions are not immediately passed to
+       the shell parser.  Instead, the expanded  line  is  reloaded  into  the
+       r\bre\bea\bad\bdl\bli\bin\bne\be editing buffer for further modification.  If r\bre\bea\bad\bdl\bli\bin\bne\be is being
+       used, and the h\bhi\bis\bst\btr\bre\bee\bed\bdi\bit\bt shell option is enabled, a failed history sub-
+       stitution will be reloaded into the r\bre\bea\bad\bdl\bli\bin\bne\be editing buffer for correc-
+       tion.  The -\b-p\bp option to the h\bhi\bis\bst\bto\bor\bry\by builtin command may be used to  see
+       what a history expansion will do before using it.  The -\b-s\bs option to the
+       h\bhi\bis\bst\bto\bor\bry\by builtin may be used to add commands to the end of  the  history
+       list  without  actually  executing them, so that they are available for
+       subsequent recall.
+
+       The shell allows control of the various characters used by the  history
+       expansion mechanism (see the description of h\bhi\bis\bst\btc\bch\bha\bar\brs\bs above under S\bSh\bhe\bel\bll\bl
+       V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs).
+
+   E\bEv\bve\ben\bnt\bt D\bDe\bes\bsi\big\bgn\bna\bat\bto\bor\brs\bs
+       An event designator is a reference to a command line entry in the  his-
+       tory list.
+
+       !\b!      Start  a  history substitution, except when followed by a b\bbl\bla\ban\bnk\bk,
+              newline, carriage return, = or ( (when the e\bex\bxt\btg\bgl\blo\bob\bb shell  option
+              is enabled using the s\bsh\bho\bop\bpt\bt builtin).
+       !\b!_\bn     Refer to command line _\bn.
+       !\b!-\b-_\bn    Refer to the current command line minus _\bn.
+       !\b!!\b!     Refer to the previous command.  This is a synonym for `!-1'.
+       !\b!_\bs_\bt_\br_\bi_\bn_\bg
+              Refer to the most recent command starting with _\bs_\bt_\br_\bi_\bn_\bg.
+       !\b!?\b?_\bs_\bt_\br_\bi_\bn_\bg[\b[?\b?]\b]
+              Refer  to the most recent command containing _\bs_\bt_\br_\bi_\bn_\bg.  The trail-
+              ing ?\b? may be omitted if _\bs_\bt_\br_\bi_\bn_\bg is followed immediately by a new-
+              line.
+       ^\b^_\bs_\bt_\br_\bi_\bn_\bg_\b1^\b^_\bs_\bt_\br_\bi_\bn_\bg_\b2^\b^
+              Quick  substitution.  Repeat the last command, replacing _\bs_\bt_\br_\bi_\bn_\bg_\b1
+              with _\bs_\bt_\br_\bi_\bn_\bg_\b2.  Equivalent to ``!!:s/_\bs_\bt_\br_\bi_\bn_\bg_\b1/_\bs_\bt_\br_\bi_\bn_\bg_\b2/'' (see M\bMo\bod\bd-\b-
+              i\bif\bfi\bie\ber\brs\bs below).
+       !\b!#\b#     The entire command line typed so far.
+
+   W\bWo\bor\brd\bd D\bDe\bes\bsi\big\bgn\bna\bat\bto\bor\brs\bs
+       Word  designators are used to select desired words from the event.  A :\b:
+       separates the event specification from the word designator.  It may  be
+       omitted  if  the word designator begins with a ^\b^, $\b$, *\b*, -\b-, or %\b%.  Words
+       are numbered from the beginning of the line, with the first word  being
+       denoted  by  0  (zero).  Words are inserted into the current line sepa-
+       rated by single spaces.
+
+       0\b0 (\b(z\bze\ber\bro\bo)\b)
+              The zeroth word.  For the shell, this is the command word.
+       _\bn      The _\bnth word.
+       ^\b^      The first argument.  That is, word 1.
+       $\b$      The last argument.
+       %\b%      The word matched by the most recent `?_\bs_\bt_\br_\bi_\bn_\bg?' search.
+       _\bx-\b-_\by    A range of words; `-_\by' abbreviates `0-_\by'.
+       *\b*      All of the words but the zeroth.  This is a synonym  for  `_\b1_\b-_\b$'.
+              It  is  not  an  error to use *\b* if there is just one word in the
+              event; the empty string is returned in that case.
+       x\bx*\b*     Abbreviates _\bx_\b-_\b$.
+       x\bx-\b-     Abbreviates _\bx_\b-_\b$ like x\bx*\b*, but omits the last word.
+
+       If a word designator is supplied without an  event  specification,  the
+       previous command is used as the event.
+
+   M\bMo\bod\bdi\bif\bfi\bie\ber\brs\bs
+       After  the optional word designator, there may appear a sequence of one
+       or more of the following modifiers, each preceded by a `:'.
+
+       h\bh      Remove a trailing file name component, leaving only the head.
+       t\bt      Remove all leading file name components, leaving the tail.
+       r\br      Remove a trailing suffix of the form _\b._\bx_\bx_\bx, leaving the basename.
+       e\be      Remove all but the trailing suffix.
+       p\bp      Print the new command but do not execute it.
+       q\bq      Quote the substituted words, escaping further substitutions.
+       x\bx      Quote  the  substituted words as with q\bq, but break into words at
+              b\bbl\bla\ban\bnk\bks\bs and newlines.
+       s\bs/\b/_\bo_\bl_\bd/\b/_\bn_\be_\bw/\b/
+              Substitute _\bn_\be_\bw for the first occurrence  of  _\bo_\bl_\bd  in  the  event
+              line.   Any  delimiter  can  be  used  in place of /.  The final
+              delimiter is optional if it is the last character of  the  event
+              line.   The delimiter may be quoted in _\bo_\bl_\bd and _\bn_\be_\bw with a single
+              backslash.  If & appears in _\bn_\be_\bw, it is replaced by _\bo_\bl_\bd.  A  sin-
+              gle  backslash  will  quote the &.  If _\bo_\bl_\bd is null, it is set to
+              the last _\bo_\bl_\bd substituted, or, if no previous  history  substitu-
+              tions took place, the last _\bs_\bt_\br_\bi_\bn_\bg in a !\b!?\b?_\bs_\bt_\br_\bi_\bn_\bg[\b[?\b?]\b]  search.
+       &\b&      Repeat the previous substitution.
+       g\bg      Cause changes to be applied over the entire event line.  This is
+              used in conjunction with `:\b:s\bs' (e.g.,  `:\b:g\bgs\bs/\b/_\bo_\bl_\bd/\b/_\bn_\be_\bw/\b/')  or  `:\b:&\b&'.
+              If  used with `:\b:s\bs', any delimiter can be used in place of /, and
+              the final delimiter is optional if it is the last  character  of
+              the event line.  An a\ba may be used as a synonym for g\bg.
+       G\bG      Apply  the following `s\bs' modifier once to each word in the event
+              line.
+
+S\bSH\bHE\bEL\bLL\bL B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS
+       Unless otherwise noted, each builtin command documented in this section
+       as accepting options preceded by -\b- accepts -\b--\b- to signify the end of the
+       options.
+       :\b: [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+              No effect; the command does nothing beyond  expanding  _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs
+              and  performing any specified redirections.  A zero exit code is
+              returned.
+
+        .\b.  _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+       s\bso\bou\bur\brc\bce\be _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+              Read and execute commands from _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be  in  the  current  shell
+              environment  and return the exit status of the last command exe-
+              cuted from _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be.  If _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be does not contain a slash, file
+              names  in  P\bPA\bAT\bTH\bH  are used to find the directory containing _\bf_\bi_\bl_\be_\b-
+              _\bn_\ba_\bm_\be.  The file searched for in P\bPA\bAT\bTH\bH  need  not  be  executable.
+              When  b\bba\bas\bsh\bh  is  not  in  _\bp_\bo_\bs_\bi_\bx  _\bm_\bo_\bd_\be,  the  current directory is
+              searched if no file is found in P\bPA\bAT\bTH\bH.  If the s\bso\bou\bur\brc\bce\bep\bpa\bat\bth\bh  option
+              to  the  s\bsh\bho\bop\bpt\bt  builtin  command  is turned off, the P\bPA\bAT\bTH\bH is not
+              searched.  If any _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs are supplied, they become the  posi-
+              tional  parameters  when  _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be  is  executed.  Otherwise the
+              positional parameters are unchanged.  The return status  is  the
+              status  of  the  last  command exited within the script (0 if no
+              commands are executed), and false if _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be is  not  found  or
+              cannot be read.
+
+       a\bal\bli\bia\bas\bs [-\b-p\bp] [_\bn_\ba_\bm_\be[=_\bv_\ba_\bl_\bu_\be] ...]
+              A\bAl\bli\bia\bas\bs with no arguments or with the -\b-p\bp option prints the list of
+              aliases in the form a\bal\bli\bia\bas\bs _\bn_\ba_\bm_\be=_\bv_\ba_\bl_\bu_\be on standard  output.   When
+              arguments  are supplied, an alias is defined for each _\bn_\ba_\bm_\be whose
+              _\bv_\ba_\bl_\bu_\be is given.  A trailing space in  _\bv_\ba_\bl_\bu_\be causes the next word
+              to be checked for alias substitution when the alias is expanded.
+              For each _\bn_\ba_\bm_\be in the argument list for which no  _\bv_\ba_\bl_\bu_\be  is  sup-
+              plied,  the  name  and  value  of  the  alias is printed.  A\bAl\bli\bia\bas\bs
+              returns true unless a _\bn_\ba_\bm_\be is given for which no alias has  been
+              defined.
+
+       b\bbg\bg [_\bj_\bo_\bb_\bs_\bp_\be_\bc]
+              Resume the suspended job _\bj_\bo_\bb_\bs_\bp_\be_\bc in the background, as if it had
+              been started with &\b&.  If _\bj_\bo_\bb_\bs_\bp_\be_\bc is  not  present,  the  shell's
+              notion  of the _\bc_\bu_\br_\br_\be_\bn_\bt _\bj_\bo_\bb is used.  b\bbg\bg _\bj_\bo_\bb_\bs_\bp_\be_\bc returns 0 unless
+              run when job control is disabled or, when run with  job  control
+              enabled,  if  _\bj_\bo_\bb_\bs_\bp_\be_\bc  was not found or started without job con-
+              trol.
+
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] [-\b-l\blp\bps\bsv\bvP\bPS\bSV\bV]
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] [-\b-q\bq _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn] [-\b-u\bu _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn] [-\b-r\br _\bk_\be_\by_\bs_\be_\bq]
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] -\b-f\bf _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] -\b-x\bx _\bk_\be_\by_\bs_\be_\bq:_\bs_\bh_\be_\bl_\bl_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] _\bk_\be_\by_\bs_\be_\bq:_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be
+       b\bbi\bin\bnd\bd _\br_\be_\ba_\bd_\bl_\bi_\bn_\be_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd
+              Display current r\bre\bea\bad\bdl\bli\bin\bne\be key and function bindings, bind  a  key
+              sequence  to  a  r\bre\bea\bad\bdl\bli\bin\bne\be  function  or macro, or set a r\bre\bea\bad\bdl\bli\bin\bne\be
+              variable.  Each non-option argument is a  command  as  it  would
+              appear  in  _\b._\bi_\bn_\bp_\bu_\bt_\br_\bc, but each binding or command must be passed
+              as a separate argument; e.g.,  '"\C-x\C-r":  re-read-init-file'.
+              Options, if supplied, have the following meanings:
+              -\b-m\bm _\bk_\be_\by_\bm_\ba_\bp
+                     Use _\bk_\be_\by_\bm_\ba_\bp as the keymap to be affected by the subsequent
+                     bindings.  Acceptable _\bk_\be_\by_\bm_\ba_\bp names are _\be_\bm_\ba_\bc_\bs_\b, _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\b-
+                     _\bd_\ba_\br_\bd_\b,  _\be_\bm_\ba_\bc_\bs_\b-_\bm_\be_\bt_\ba_\b,  _\be_\bm_\ba_\bc_\bs_\b-_\bc_\bt_\bl_\bx_\b,  _\bv_\bi_\b, _\bv_\bi_\b-_\bm_\bo_\bv_\be_\b, _\bv_\bi_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd,
+                     and _\bv_\bi_\b-_\bi_\bn_\bs_\be_\br_\bt.  _\bv_\bi is equivalent to _\bv_\bi_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd; _\be_\bm_\ba_\bc_\bs  is
+                     equivalent to _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd.
+              -\b-l\bl     List the names of all r\bre\bea\bad\bdl\bli\bin\bne\be functions.
+              -\b-p\bp     Display  r\bre\bea\bad\bdl\bli\bin\bne\be  function  names and bindings in such a
+                     way that they can be re-read.
+              -\b-P\bP     List current r\bre\bea\bad\bdl\bli\bin\bne\be function names and bindings.
+              -\b-v\bv     Display r\bre\bea\bad\bdl\bli\bin\bne\be variable names and values in such a  way
+                     that they can be re-read.
+              -\b-V\bV     List current r\bre\bea\bad\bdl\bli\bin\bne\be variable names and values.
+              -\b-s\bs     Display  r\bre\bea\bad\bdl\bli\bin\bne\be  key  sequences bound to macros and the
+                     strings they output in such a way that they  can  be  re-
+                     read.
+              -\b-S\bS     Display  r\bre\bea\bad\bdl\bli\bin\bne\be  key  sequences bound to macros and the
+                     strings they output.
+              -\b-f\bf _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be
+                     Read key bindings from _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be.
+              -\b-q\bq _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn
+                     Query about which keys invoke the named _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn.
+              -\b-u\bu _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn
+                     Unbind all keys bound to the named _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn.
+              -\b-r\br _\bk_\be_\by_\bs_\be_\bq
+                     Remove any current binding for _\bk_\be_\by_\bs_\be_\bq.
+              -\b-x\bx _\bk_\be_\by_\bs_\be_\bq:\b:_\bs_\bh_\be_\bl_\bl_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd
+                     Cause _\bs_\bh_\be_\bl_\bl_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd to be  executed  whenever  _\bk_\be_\by_\bs_\be_\bq  is
+                     entered.
+
+              The  return value is 0 unless an unrecognized option is given or
+              an error occurred.
+
+       b\bbr\bre\bea\bak\bk [_\bn]
+              Exit from within a f\bfo\bor\br, w\bwh\bhi\bil\ble\be, u\bun\bnt\bti\bil\bl, or s\bse\bel\ble\bec\bct\bt loop.  If  _\bn  is
+              specified,  break  _\bn  levels.   _\bn must be >= 1.  If _\bn is greater
+              than the number of enclosing  loops,  all  enclosing  loops  are
+              exited.  The return value is 0 unless the shell is not executing
+              a loop when b\bbr\bre\bea\bak\bk is executed.
+
+       b\bbu\bui\bil\blt\bti\bin\bn _\bs_\bh_\be_\bl_\bl_\b-_\bb_\bu_\bi_\bl_\bt_\bi_\bn [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+              Execute the specified shell builtin, passing it  _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs,  and
+              return its exit status.  This is useful when defining a function
+              whose name is the same as a shell builtin, retaining  the  func-
+              tionality of the builtin within the function.  The c\bcd\bd builtin is
+              commonly redefined this way.  The  return  status  is  false  if
+              _\bs_\bh_\be_\bl_\bl_\b-_\bb_\bu_\bi_\bl_\bt_\bi_\bn is not a shell builtin command.
+
+       c\bcd\bd [-\b-L\bL|\b|-\b-P\bP] [_\bd_\bi_\br]
+              Change  the  current directory to _\bd_\bi_\br.  The variable H\bHO\bOM\bME\bE is the
+              default _\bd_\bi_\br.  The variable C\bCD\bDP\bPA\bAT\bTH\bH defines the  search  path  for
+              the  directory  containing  _\bd_\bi_\br.  Alternative directory names in
+              C\bCD\bDP\bPA\bAT\bTH\bH are separated by a colon (:).  A null directory  name  in
+              C\bCD\bDP\bPA\bAT\bTH\bH  is  the  same as the current directory, i.e., ``.\b.''.  If
+              _\bd_\bi_\br begins with a slash (/), then C\bCD\bDP\bPA\bAT\bTH\bH is  not  used.  The  -\b-P\bP
+              option  says  to use the physical directory structure instead of
+              following symbolic links (see also the  -\b-P\bP  option  to  the  s\bse\bet\bt
+              builtin command); the -\b-L\bL option forces symbolic links to be fol-
+              lowed.  An argument of -\b- is equivalent to $\b$O\bOL\bLD\bDP\bPW\bWD\bD.   If  a  non-
+              empty  directory  name from C\bCD\bDP\bPA\bAT\bTH\bH is used, or if -\b- is the first
+              argument, and the directory change is successful,  the  absolute
+              pathname of the new working directory is written to the standard
+              output.  The return value is true if the directory was  success-
+              fully changed; false otherwise.
+
+       c\bca\bal\bll\ble\ber\br [_\be_\bx_\bp_\br]
+              Returns the context of any active subroutine call (a shell func-
+              tion or a script executed with the .\b. or s\bso\bou\bur\brc\bce\be builtins.   With-
+              out _\be_\bx_\bp_\br, c\bca\bal\bll\ble\ber\br displays the line number and source filename of
+              the current subroutine call.  If a non-negative integer is  sup-
+              plied as _\be_\bx_\bp_\br, c\bca\bal\bll\ble\ber\br displays the line number, subroutine name,
+              and source file corresponding to that position  in  the  current
+              execution  call  stack.  This extra information may be used, for
+              example, to print a stack trace.  The current frame is frame  0.
+              The  return  value is 0 unless the shell is not executing a sub-
+              routine call or _\be_\bx_\bp_\br does not correspond to a valid position  in
+              the call stack.
+
+       c\bco\bom\bmm\bma\ban\bnd\bd [-\b-p\bpV\bVv\bv] _\bc_\bo_\bm_\bm_\ba_\bn_\bd [_\ba_\br_\bg ...]
+              Run  _\bc_\bo_\bm_\bm_\ba_\bn_\bd  with  _\ba_\br_\bg_\bs  suppressing  the normal shell function
+              lookup. Only builtin commands or commands found in the P\bPA\bAT\bTH\bH  are
+              executed.   If the -\b-p\bp option is given, the search for _\bc_\bo_\bm_\bm_\ba_\bn_\bd is
+              performed using a default value for P\bPA\bAT\bTH\bH that is  guaranteed  to
+              find  all  of  the  standard  utilities.  If either the -\b-V\bV or -\b-v\bv
+              option is supplied, a description of _\bc_\bo_\bm_\bm_\ba_\bn_\bd is printed.  The -\b-v\bv
+              option  causes a single word indicating the command or file name
+              used to invoke _\bc_\bo_\bm_\bm_\ba_\bn_\bd to be displayed; the -\b-V\bV option produces a
+              more  verbose  description.  If the -\b-V\bV or -\b-v\bv option is supplied,
+              the exit status is 0 if _\bc_\bo_\bm_\bm_\ba_\bn_\bd was found, and  1  if  not.   If
+              neither option is supplied and an error occurred or _\bc_\bo_\bm_\bm_\ba_\bn_\bd can-
+              not be found, the exit status is 127.  Otherwise, the exit  sta-
+              tus of the c\bco\bom\bmm\bma\ban\bnd\bd builtin is the exit status of _\bc_\bo_\bm_\bm_\ba_\bn_\bd.
+
+       c\bco\bom\bmp\bpg\bge\ben\bn [_\bo_\bp_\bt_\bi_\bo_\bn] [_\bw_\bo_\br_\bd]
+              Generate  possible  completion matches for _\bw_\bo_\br_\bd according to the
+              _\bo_\bp_\bt_\bi_\bo_\bns, which may  be  any  option  accepted  by  the  c\bco\bom\bmp\bpl\ble\bet\bte\be
+              builtin  with  the exception of -\b-p\bp and -\b-r\br, and write the matches
+              to the standard output.  When using the -\b-F\bF or  -\b-C\bC  options,  the
+              various  shell  variables  set  by  the  programmable completion
+              facilities, while available, will not have useful values.
+
+              The matches will be generated in the same way  as  if  the  pro-
+              grammable  completion  code  had  generated them directly from a
+              completion specification with the same flags.  If _\bw_\bo_\br_\bd is speci-
+              fied, only those completions matching _\bw_\bo_\br_\bd will be displayed.
+
+              The  return  value is true unless an invalid option is supplied,
+              or no matches were generated.
+
+       c\bco\bom\bmp\bpl\ble\bet\bte\be [-\b-a\bab\bbc\bcd\bde\bef\bfg\bgj\bjk\bks\bsu\buv\bv] [-\b-o\bo _\bc_\bo_\bm_\bp_\b-_\bo_\bp_\bt_\bi_\bo_\bn] [-\b-A\bA _\ba_\bc_\bt_\bi_\bo_\bn] [-\b-G\bG _\bg_\bl_\bo_\bb_\bp_\ba_\bt]  [-\b-W\bW
+       _\bw_\bo_\br_\bd_\bl_\bi_\bs_\bt] [-\b-P\bP _\bp_\br_\be_\bf_\bi_\bx] [-\b-S\bS _\bs_\bu_\bf_\bf_\bi_\bx]
+              [-\b-X\bX _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt] [-\b-F\bF _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn] [-\b-C\bC _\bc_\bo_\bm_\bm_\ba_\bn_\bd] _\bn_\ba_\bm_\be [_\bn_\ba_\bm_\be _\b._\b._\b.]
+       c\bco\bom\bmp\bpl\ble\bet\bte\be -\b-p\bpr\br [_\bn_\ba_\bm_\be ...]
+              Specify how arguments to each _\bn_\ba_\bm_\be should be completed.  If  the
+              -\b-p\bp  option  is supplied, or if no options are supplied, existing
+              completion specifications are printed in a way that allows  them
+              to be reused as input.  The -\b-r\br option removes a completion spec-
+              ification for each _\bn_\ba_\bm_\be, or, if no _\bn_\ba_\bm_\bes are supplied, all  com-
+              pletion specifications.
+
+              The  process  of  applying  these completion specifications when
+              word completion is  attempted  is  described  above  under  P\bPr\bro\bo-\b-
+              g\bgr\bra\bam\bmm\bma\bab\bbl\ble\be C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn.
+
+              Other  options,  if specified, have the following meanings.  The
+              arguments to the -\b-G\bG, -\b-W\bW, and -\b-X\bX options (and, if necessary,  the
+              -\b-P\bP  and -\b-S\bS options) should be quoted to protect them from expan-
+              sion before the c\bco\bom\bmp\bpl\ble\bet\bte\be builtin is invoked.
+              -\b-o\bo _\bc_\bo_\bm_\bp_\b-_\bo_\bp_\bt_\bi_\bo_\bn
+                      The _\bc_\bo_\bm_\bp_\b-_\bo_\bp_\bt_\bi_\bo_\bn controls several aspects  of  the  comp-
+                      spec's  behavior beyond the simple generation of comple-
+                      tions.  _\bc_\bo_\bm_\bp_\b-_\bo_\bp_\bt_\bi_\bo_\bn may be one of:
+                      b\bba\bas\bsh\bhd\bde\bef\bfa\bau\bul\blt\bt
+                              Perform the rest of the default b\bba\bas\bsh\bh completions
+                              if the compspec generates no matches.
+                      d\bde\bef\bfa\bau\bul\blt\bt Use  readline's  default  filename completion if
+                              the compspec generates no matches.
+                      d\bdi\bir\brn\bna\bam\bme\bes\bs
+                              Perform directory name completion if  the  comp-
+                              spec generates no matches.
+                      f\bfi\bil\ble\ben\bna\bam\bme\bes\bs
+                              Tell  readline that the compspec generates file-
+                              names, so it can perform  any  filename-specific
+                              processing  (like  adding  a  slash to directory
+                              names or suppressing trailing spaces).  Intended
+                              to be used with shell functions.
+                      n\bno\bos\bsp\bpa\bac\bce\be Tell   readline  not  to  append  a  space  (the
+                              default) to words completed at the  end  of  the
+                              line.
+              -\b-A\bA _\ba_\bc_\bt_\bi_\bo_\bn
+                      The  _\ba_\bc_\bt_\bi_\bo_\bn  may  be  one of the following to generate a
+                      list of possible completions:
+                      a\bal\bli\bia\bas\bs   Alias names.  May also be specified as -\b-a\ba.
+                      a\bar\brr\bra\bay\byv\bva\bar\br
+                              Array variable names.
+                      b\bbi\bin\bnd\bdi\bin\bng\bg R\bRe\bea\bad\bdl\bli\bin\bne\be key binding names.
+                      b\bbu\bui\bil\blt\bti\bin\bn Names of shell builtin commands.   May  also  be
+                              specified as -\b-b\bb.
+                      c\bco\bom\bmm\bma\ban\bnd\bd Command names.  May also be specified as -\b-c\bc.
+                      d\bdi\bir\bre\bec\bct\bto\bor\bry\by
+                              Directory names.  May also be specified as -\b-d\bd.
+                      d\bdi\bis\bsa\bab\bbl\ble\bed\bd
+                              Names of disabled shell builtins.
+                      e\ben\bna\bab\bbl\ble\bed\bd Names of enabled shell builtins.
+                      e\bex\bxp\bpo\bor\brt\bt  Names  of exported shell variables.  May also be
+                              specified as -\b-e\be.
+                      f\bfi\bil\ble\be    File names.  May also be specified as -\b-f\bf.
+                      f\bfu\bun\bnc\bct\bti\bio\bon\bn
+                              Names of shell functions.
+                      g\bgr\bro\bou\bup\bp   Group names.  May also be specified as -\b-g\bg.
+                      h\bhe\bel\blp\bpt\bto\bop\bpi\bic\bc
+                              Help topics as accepted by the h\bhe\bel\blp\bp builtin.
+                      h\bho\bos\bst\btn\bna\bam\bme\be
+                              Hostnames, as taken from the file  specified  by
+                              the H\bHO\bOS\bST\bTF\bFI\bIL\bLE\bE shell variable.
+                      j\bjo\bob\bb     Job  names,  if job control is active.  May also
+                              be specified as -\b-j\bj.
+                      k\bke\bey\byw\bwo\bor\brd\bd Shell reserved words.  May also be specified  as
+                              -\b-k\bk.
+                      r\bru\bun\bnn\bni\bin\bng\bg Names of running jobs, if job control is active.
+                      s\bse\ber\brv\bvi\bic\bce\be Service names.  May also be specified as -\b-s\bs.
+                      s\bse\bet\bto\bop\bpt\bt  Valid arguments for the -\b-o\bo  option  to  the  s\bse\bet\bt
+                              builtin.
+                      s\bsh\bho\bop\bpt\bt   Shell  option  names  as  accepted  by the s\bsh\bho\bop\bpt\bt
+                              builtin.
+                      s\bsi\big\bgn\bna\bal\bl  Signal names.
+                      s\bst\bto\bop\bpp\bpe\bed\bd Names of stopped jobs, if job control is active.
+                      u\bus\bse\ber\br    User names.  May also be specified as -\b-u\bu.
+                      v\bva\bar\bri\bia\bab\bbl\ble\be
+                              Names of all shell variables.  May also be spec-
+                              ified as -\b-v\bv.
+              -\b-G\bG _\bg_\bl_\bo_\bb_\bp_\ba_\bt
+                      The filename expansion pattern _\bg_\bl_\bo_\bb_\bp_\ba_\bt  is  expanded  to
+                      generate the possible completions.
+              -\b-W\bW _\bw_\bo_\br_\bd_\bl_\bi_\bs_\bt
+                      The  _\bw_\bo_\br_\bd_\bl_\bi_\bs_\bt  is  split using the characters in the I\bIF\bFS\bS
+                      special variable as delimiters, and each resultant  word
+                      is  expanded.   The possible completions are the members
+                      of the resultant list which match the  word  being  com-
+                      pleted.
+              -\b-C\bC _\bc_\bo_\bm_\bm_\ba_\bn_\bd
+                      _\bc_\bo_\bm_\bm_\ba_\bn_\bd  is  executed in a subshell environment, and its
+                      output is used as the possible completions.
+              -\b-F\bF _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn
+                      The shell function _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn is executed in  the  current
+                      shell  environment.  When it finishes, the possible com-
+                      pletions are retrieved from the value of  the  C\bCO\bOM\bMP\bPR\bRE\bEP\bPL\bLY\bY
+                      array variable.
+              -\b-X\bX _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt
+                      _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt  is  a pattern as used for filename expansion.
+                      It is applied to the list of possible completions gener-
+                      ated  by  the  preceding options and arguments, and each
+                      completion matching _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt is removed from the  list.
+                      A  leading  !\b!  in _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt negates the pattern; in this
+                      case, any completion not matching _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt is  removed.
+              -\b-P\bP _\bp_\br_\be_\bf_\bi_\bx
+                      _\bp_\br_\be_\bf_\bi_\bx  is  added at the beginning of each possible com-
+                      pletion after all other options have been applied.
+              -\b-S\bS _\bs_\bu_\bf_\bf_\bi_\bx
+                      _\bs_\bu_\bf_\bf_\bi_\bx is appended to each possible completion after all
+                      other options have been applied.
+
+              The  return  value is true unless an invalid option is supplied,
+              an option other than -\b-p\bp or -\b-r\br is supplied without a  _\bn_\ba_\bm_\be  argu-
+              ment,  an  attempt  is made to remove a completion specification
+              for a _\bn_\ba_\bm_\be for which no specification exists, or an error occurs
+              adding a completion specification.
+
+       c\bco\bon\bnt\bti\bin\bnu\bue\be [_\bn]
+              Resume the next iteration of the enclosing f\bfo\bor\br, w\bwh\bhi\bil\ble\be, u\bun\bnt\bti\bil\bl, or
+              s\bse\bel\ble\bec\bct\bt loop.  If _\bn is specified, resume  at  the  _\bnth  enclosing
+              loop.   _\bn  must  be  >=  1.   If _\bn is greater than the number of
+              enclosing loops, the  last  enclosing  loop  (the  ``top-level''
+              loop) is resumed.  The return value is 0 unless the shell is not
+              executing a loop when c\bco\bon\bnt\bti\bin\bnu\bue\be is executed.
+
+       d\bde\bec\bcl\bla\bar\bre\be [-\b-a\baf\bfF\bFi\bir\brt\btx\bx] [-\b-p\bp] [_\bn_\ba_\bm_\be[=_\bv_\ba_\bl_\bu_\be] ...]
+       t\bty\byp\bpe\bes\bse\bet\bt [-\b-a\baf\bfF\bFi\bir\brt\btx\bx] [-\b-p\bp] [_\bn_\ba_\bm_\be[=_\bv_\ba_\bl_\bu_\be] ...]
+              Declare variables and/or give them attributes.  If no _\bn_\ba_\bm_\bes  are
+              given  then display the values of variables.  The -\b-p\bp option will
+              display the attributes and values of  each  _\bn_\ba_\bm_\be.   When  -\b-p\bp  is
+              used,  additional  options  are ignored.  The -\b-F\bF option inhibits
+              the display of function definitions; only the function name  and
+              attributes are printed.  If the e\bex\bxt\btd\bde\beb\bbu\bug\bg shell option is enabled
+              using s\bsh\bho\bop\bpt\bt, the source file name  and  line  number  where  the
+              function  is  defined  are  displayed  as  well.   The -\b-F\bF option
+              implies -\b-f\bf.  The following options can be used to restrict  out-
+              put  to  variables with the specified attribute or to give vari-
+              ables attributes:
+              -\b-a\ba     Each _\bn_\ba_\bm_\be is an array variable (see A\bAr\brr\bra\bay\bys\bs above).
+              -\b-f\bf     Use function names only.
+              -\b-i\bi     The variable is treated as an integer; arithmetic evalua-
+                     tion  (see  A\bAR\bRI\bIT\bTH\bHM\bME\bET\bTI\bIC\bC E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN )\b) is performed when the
+                     variable is assigned a value.
+              -\b-r\br     Make _\bn_\ba_\bm_\bes readonly.  These names cannot then be assigned
+                     values by subsequent assignment statements or unset.
+              -\b-t\bt     Give  each  _\bn_\ba_\bm_\be  the  _\bt_\br_\ba_\bc_\be attribute.  Traced functions
+                     inherit the D\bDE\bEB\bBU\bUG\bG trap from the calling shell.  The trace
+                     attribute has no special meaning for variables.
+              -\b-x\bx     Mark  _\bn_\ba_\bm_\bes  for  export  to  subsequent commands via the
+                     environment.
+
+              Using `+' instead of `-' turns off the attribute  instead,  with
+              the  exception that +\b+a\ba may not be used to destroy an array vari-
+              able.  When used in a function, makes each _\bn_\ba_\bm_\be local,  as  with
+              the  l\blo\boc\bca\bal\bl  command.   If a variable name is followed by =_\bv_\ba_\bl_\bu_\be,
+              the value of the variable is set to _\bv_\ba_\bl_\bu_\be.  The return value  is
+              0 unless an invalid option is encountered, an attempt is made to
+              define a function using ``-f foo=bar'', an attempt  is  made  to
+              assign  a  value  to  a readonly variable, an attempt is made to
+              assign a value to an array variable without using  the  compound
+              assignment  syntax (see A\bAr\brr\bra\bay\bys\bs above), one of the _\bn_\ba_\bm_\be_\bs is not a
+              valid shell variable name, an attempt is made to turn off  read-
+              only  status for a readonly variable, an attempt is made to turn
+              off array status for an array variable, or an attempt is made to
+              display a non-existent function with -\b-f\bf.
+
+       d\bdi\bir\brs\bs [\b[-\b-c\bcl\blp\bpv\bv]\b] [\b[+\b+_\bn]\b] [\b[-\b-_\bn]\b]
+              Without  options,  displays  the  list  of  currently remembered
+              directories.  The default display  is  on  a  single  line  with
+              directory  names  separated by spaces.  Directories are added to
+              the list with  the  p\bpu\bus\bsh\bhd\bd  command;  the  p\bpo\bop\bpd\bd  command  removes
+              entries from the list.
+              +\b+_\bn     Displays the _\bnth entry counting from the left of the list
+                     shown by d\bdi\bir\brs\bs when invoked without options, starting with
+                     zero.
+              -\b-_\bn     Displays  the  _\bnth  entry  counting from the right of the
+                     list shown by d\bdi\bir\brs\bs when invoked without options, starting
+                     with zero.
+              -\b-c\bc     Clears  the  directory  stack  by  deleting  all  of  the
+                     entries.
+              -\b-l\bl     Produces a longer listing;  the  default  listing  format
+                     uses a tilde to denote the home directory.
+              -\b-p\bp     Print the directory stack with one entry per line.
+              -\b-v\bv     Print  the  directory stack with one entry per line, pre-
+                     fixing each entry with its index in the stack.
+
+              The return value is 0 unless an invalid option is supplied or  _\bn
+              indexes beyond the end of the directory stack.
+
+       d\bdi\bis\bso\bow\bwn\bn [-\b-a\bar\br] [-\b-h\bh] [_\bj_\bo_\bb_\bs_\bp_\be_\bc ...]
+              Without  options,  each  _\bj_\bo_\bb_\bs_\bp_\be_\bc  is  removed  from the table of
+              active jobs.  If the -\b-h\bh option is given,  each  _\bj_\bo_\bb_\bs_\bp_\be_\bc  is  not
+              removed from the table, but is marked so that S\bSI\bIG\bGH\bHU\bUP\bP is not sent
+              to the job if the shell receives a S\bSI\bIG\bGH\bHU\bUP\bP.   If  no  _\bj_\bo_\bb_\bs_\bp_\be_\bc  is
+              present,  and  neither the -\b-a\ba nor the -\b-r\br option is supplied, the
+              _\bc_\bu_\br_\br_\be_\bn_\bt _\bj_\bo_\bb is used.  If no _\bj_\bo_\bb_\bs_\bp_\be_\bc is supplied, the  -\b-a\ba  option
+              means  to  remove or mark all jobs; the -\b-r\br option without a _\bj_\bo_\bb_\b-
+              _\bs_\bp_\be_\bc argument restricts operation to running jobs.   The  return
+              value is 0 unless a _\bj_\bo_\bb_\bs_\bp_\be_\bc does not specify a valid job.
+
+       e\bec\bch\bho\bo [-\b-n\bne\beE\bE] [_\ba_\br_\bg ...]
+              Output  the  _\ba_\br_\bgs,  separated  by spaces, followed by a newline.
+              The return status is always 0.  If -\b-n\bn is specified, the trailing
+              newline  is  suppressed.  If the -\b-e\be option is given, interpreta-
+              tion of the following backslash-escaped characters  is  enabled.
+              The  -\b-E\bE option disables the interpretation of these escape char-
+              acters, even on systems where they are interpreted  by  default.
+              The  x\bxp\bpg\bg_\b_e\bec\bch\bho\bo  shell option may be used to dynamically determine
+              whether or not e\bec\bch\bho\bo expands these escape characters by  default.
+              e\bec\bch\bho\bo  does  not  interpret  -\b--\b- to mean the end of options.  e\bec\bch\bho\bo
+              interprets the following escape sequences:
+              \\b\a\ba     alert (bell)
+              \\b\b\bb     backspace
+              \\b\c\bc     suppress trailing newline
+              \\b\e\be     an escape character
+              \\b\f\bf     form feed
+              \\b\n\bn     new line
+              \\b\r\br     carriage return
+              \\b\t\bt     horizontal tab
+              \\b\v\bv     vertical tab
+              \\b\\\b\     backslash
+              \\b\0\b0_\bn_\bn_\bn  the eight-bit character whose value is  the  octal  value
+                     _\bn_\bn_\bn (zero to three octal digits)
+              \\b\_\bn_\bn_\bn   the  eight-bit  character  whose value is the octal value
+                     _\bn_\bn_\bn (one to three octal digits)
+              \\b\x\bx_\bH_\bH   the eight-bit character whose value  is  the  hexadecimal
+                     value _\bH_\bH (one or two hex digits)
+
+       e\ben\bna\bab\bbl\ble\be [-\b-a\bad\bdn\bnp\bps\bs] [-\b-f\bf _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be] [_\bn_\ba_\bm_\be ...]
+              Enable  and disable builtin shell commands.  Disabling a builtin
+              allows a disk command which has the same name as a shell builtin
+              to  be  executed without specifying a full pathname, even though
+              the shell normally searches for builtins before  disk  commands.
+              If  -\b-n\bn  is  used,  each  _\bn_\ba_\bm_\be  is disabled; otherwise, _\bn_\ba_\bm_\be_\bs are
+              enabled.  For example, to use the t\bte\bes\bst\bt binary found via the P\bPA\bAT\bTH\bH
+              instead  of  the  shell builtin version, run ``enable -n test''.
+              The -\b-f\bf option means to load the new builtin  command  _\bn_\ba_\bm_\be  from
+              shared object _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be, on systems that support dynamic loading.
+              The -\b-d\bd option will delete a builtin previously loaded  with  -\b-f\bf.
+              If no _\bn_\ba_\bm_\be arguments are given, or if the -\b-p\bp option is supplied,
+              a list of shell builtins is printed.  With no other option argu-
+              ments,  the  list consists of all enabled shell builtins.  If -\b-n\bn
+              is supplied, only disabled builtins are printed.  If -\b-a\ba is  sup-
+              plied,  the  list printed includes all builtins, with an indica-
+              tion of whether or not each is enabled.  If -\b-s\bs is supplied,  the
+              output  is restricted to the POSIX _\bs_\bp_\be_\bc_\bi_\ba_\bl builtins.  The return
+              value is 0 unless a _\bn_\ba_\bm_\be is not a shell builtin or there  is  an
+              error loading a new builtin from a shared object.
+
+       e\bev\bva\bal\bl [_\ba_\br_\bg ...]
+              The  _\ba_\br_\bgs  are read and concatenated together into a single com-
+              mand.  This command is then read and executed by the shell,  and
+              its  exit status is returned as the value of e\bev\bva\bal\bl.  If there are
+              no _\ba_\br_\bg_\bs, or only null arguments, e\bev\bva\bal\bl returns 0.
+
+       e\bex\bxe\bec\bc [-\b-c\bcl\bl] [-\b-a\ba _\bn_\ba_\bm_\be] [_\bc_\bo_\bm_\bm_\ba_\bn_\bd [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]]
+              If _\bc_\bo_\bm_\bm_\ba_\bn_\bd is specified, it replaces the shell.  No new  process
+              is  created.  The _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs become the arguments to _\bc_\bo_\bm_\bm_\ba_\bn_\bd.  If
+              the -\b-l\bl option is supplied, the shell places a dash at the begin-
+              ning of the zeroth arg passed to _\bc_\bo_\bm_\bm_\ba_\bn_\bd.  This is what _\bl_\bo_\bg_\bi_\bn(1)
+              does.  The -\b-c\bc option causes _\bc_\bo_\bm_\bm_\ba_\bn_\bd to be executed with an empty
+              environment.   If  -\b-a\ba  is supplied, the shell passes _\bn_\ba_\bm_\be as the
+              zeroth argument to the executed command.  If _\bc_\bo_\bm_\bm_\ba_\bn_\bd  cannot  be
+              executed  for some reason, a non-interactive shell exits, unless
+              the shell option e\bex\bxe\bec\bcf\bfa\bai\bil\bl is enabled, in which case  it  returns
+              failure.   An interactive shell returns failure if the file can-
+              not be executed.  If _\bc_\bo_\bm_\bm_\ba_\bn_\bd is not specified, any  redirections
+              take  effect  in  the current shell, and the return status is 0.
+              If there is a redirection error, the return status is 1.
+
+       e\bex\bxi\bit\bt [_\bn]
+              Cause the shell to exit with a status of _\bn.  If  _\bn  is  omitted,
+              the exit status is that of the last command executed.  A trap on
+              E\bEX\bXI\bIT\bT is executed before the shell terminates.
+
+       e\bex\bxp\bpo\bor\brt\bt [-\b-f\bfn\bn] [_\bn_\ba_\bm_\be[=_\bw_\bo_\br_\bd]] ...
+       e\bex\bxp\bpo\bor\brt\bt -\b-p\bp
+              The supplied _\bn_\ba_\bm_\be_\bs are marked for automatic export to the  envi-
+              ronment  of subsequently executed commands.  If the -\b-f\bf option is
+              given, the _\bn_\ba_\bm_\be_\bs refer to functions.  If no _\bn_\ba_\bm_\be_\bs are given,  or
+              if  the  -\b-p\bp  option  is  supplied,  a list of all names that are
+              exported in this shell is printed.  The  -\b-n\bn  option  causes  the
+              export  property  to  be  removed from each _\bn_\ba_\bm_\be.  If a variable
+              name is followed by =_\bw_\bo_\br_\bd, the value of the variable is  set  to
+              _\bw_\bo_\br_\bd.   e\bex\bxp\bpo\bor\brt\bt  returns  an  exit  status of 0 unless an invalid
+              option is encountered, one of the _\bn_\ba_\bm_\be_\bs is  not  a  valid  shell
+              variable name, or -\b-f\bf is supplied with a _\bn_\ba_\bm_\be that is not a func-
+              tion.
+
+       f\bfc\bc [-\b-e\be _\be_\bn_\ba_\bm_\be] [-\b-n\bnl\blr\br] [_\bf_\bi_\br_\bs_\bt] [_\bl_\ba_\bs_\bt]
+       f\bfc\bc -\b-s\bs [_\bp_\ba_\bt=_\br_\be_\bp] [_\bc_\bm_\bd]
+              Fix Command.  In the first form, a range of commands from  _\bf_\bi_\br_\bs_\bt
+              to  _\bl_\ba_\bs_\bt  is selected from the history list.  _\bF_\bi_\br_\bs_\bt and _\bl_\ba_\bs_\bt may
+              be specified as a string (to locate the last  command  beginning
+              with  that  string)  or  as  a number (an index into the history
+              list, where a negative number is used as an offset from the cur-
+              rent command number).  If _\bl_\ba_\bs_\bt is not specified it is set to the
+              current command for listing (so that ``fc -l  -10''  prints  the
+              last 10 commands) and to _\bf_\bi_\br_\bs_\bt otherwise.  If _\bf_\bi_\br_\bs_\bt is not spec-
+              ified it is set to the previous command for editing and -16  for
+              listing.
+
+              The  -\b-n\bn option suppresses the command numbers when listing.  The
+              -\b-r\br option reverses the order of the commands.  If the -\b-l\bl  option
+              is  given,  the  commands are listed on standard output.  Other-
+              wise, the editor given by _\be_\bn_\ba_\bm_\be is invoked on a file  containing
+              those  commands.  If _\be_\bn_\ba_\bm_\be is not given, the value of the F\bFC\bCE\bED\bDI\bIT\bT
+              variable is used, and the value of E\bED\bDI\bIT\bTO\bOR\bR if F\bFC\bCE\bED\bDI\bIT\bT is not  set.
+              If  neither  variable  is set, _\bv_\bi is used.  When editing is com-
+              plete, the edited commands are echoed and executed.
+
+              In the second form, _\bc_\bo_\bm_\bm_\ba_\bn_\bd is re-executed after  each  instance
+              of  _\bp_\ba_\bt  is replaced by _\br_\be_\bp.  A useful alias to use with this is
+              ``r="fc -s"'', so that typing ``r cc''  runs  the  last  command
+              beginning with ``cc'' and typing ``r'' re-executes the last com-
+              mand.
+
+              If the first form is used, the  return  value  is  0  unless  an
+              invalid  option  is encountered or _\bf_\bi_\br_\bs_\bt or _\bl_\ba_\bs_\bt specify history
+              lines out of range.  If the -\b-e\be option is  supplied,  the  return
+              value is the value of the last command executed or failure if an
+              error occurs with the temporary file of commands.  If the second
+              form  is  used, the return status is that of the command re-exe-
+              cuted, unless _\bc_\bm_\bd does not specify  a  valid  history  line,  in
+              which case f\bfc\bc returns failure.
+
+       f\bfg\bg [_\bj_\bo_\bb_\bs_\bp_\be_\bc]
+              Resume  _\bj_\bo_\bb_\bs_\bp_\be_\bc  in the foreground, and make it the current job.
+              If _\bj_\bo_\bb_\bs_\bp_\be_\bc is not present, the shell's notion of the _\bc_\bu_\br_\br_\be_\bn_\bt _\bj_\bo_\bb
+              is  used.   The  return value is that of the command placed into
+              the foreground, or failure if run when job control  is  disabled
+              or, when run with job control enabled, if _\bj_\bo_\bb_\bs_\bp_\be_\bc does not spec-
+              ify a valid job or _\bj_\bo_\bb_\bs_\bp_\be_\bc specifies  a  job  that  was  started
+              without job control.
+
+       g\bge\bet\bto\bop\bpt\bts\bs _\bo_\bp_\bt_\bs_\bt_\br_\bi_\bn_\bg _\bn_\ba_\bm_\be [_\ba_\br_\bg_\bs]
+              g\bge\bet\bto\bop\bpt\bts\bs  is used by shell procedures to parse positional parame-
+              ters.  _\bo_\bp_\bt_\bs_\bt_\br_\bi_\bn_\bg contains the option  characters  to  be  recog-
+              nized;  if  a  character  is  followed by a colon, the option is
+              expected to have an argument, which should be separated from  it
+              by  white space.  The colon and question mark characters may not
+              be used as option characters.  Each time it is invoked,  g\bge\bet\bto\bop\bpt\bts\bs
+              places  the next option in the shell variable _\bn_\ba_\bm_\be, initializing
+              _\bn_\ba_\bm_\be if it does not exist, and the index of the next argument to
+              be processed into the variable O\bOP\bPT\bTI\bIN\bND\bD.  O\bOP\bPT\bTI\bIN\bND\bD is initialized to
+              1 each time the shell or a shell script  is  invoked.   When  an
+              option  requires  an argument, g\bge\bet\bto\bop\bpt\bts\bs places that argument into
+              the variable O\bOP\bPT\bTA\bAR\bRG\bG.  The shell does not reset O\bOP\bPT\bTI\bIN\bND\bD  automati-
+              cally;  it  must  be  manually  reset  between multiple calls to
+              g\bge\bet\bto\bop\bpt\bts\bs within the same shell invocation if a new set of parame-
+              ters is to be used.
+
+              When  the  end  of  options is encountered, g\bge\bet\bto\bop\bpt\bts\bs exits with a
+              return value greater than zero.  O\bOP\bPT\bTI\bIN\bND\bD is set to the  index  of
+              the first non-option argument, and n\bna\bam\bme\be is set to ?.
+
+              g\bge\bet\bto\bop\bpt\bts\bs  normally  parses the positional parameters, but if more
+              arguments are given in _\ba_\br_\bg_\bs, g\bge\bet\bto\bop\bpt\bts\bs parses those instead.
+
+              g\bge\bet\bto\bop\bpt\bts\bs can report errors in two ways.  If the  first  character
+              of  _\bo_\bp_\bt_\bs_\bt_\br_\bi_\bn_\bg  is  a  colon, _\bs_\bi_\bl_\be_\bn_\bt error reporting is used.  In
+              normal operation diagnostic messages are  printed  when  invalid
+              options  or  missing  option  arguments are encountered.  If the
+              variable O\bOP\bPT\bTE\bER\bRR\bR is set to 0, no  error  messages  will  be  dis-
+              played, even if the first character of _\bo_\bp_\bt_\bs_\bt_\br_\bi_\bn_\bg is not a colon.
+
+              If an invalid option is seen, g\bge\bet\bto\bop\bpt\bts\bs places ? into _\bn_\ba_\bm_\be and, if
+              not  silent,  prints  an  error  message  and unsets O\bOP\bPT\bTA\bAR\bRG\bG.  If
+              g\bge\bet\bto\bop\bpt\bts\bs is silent, the  option  character  found  is  placed  in
+              O\bOP\bPT\bTA\bAR\bRG\bG and no diagnostic message is printed.
+
+              If  a required argument is not found, and g\bge\bet\bto\bop\bpt\bts\bs is not silent,
+              a question mark (?\b?) is placed in _\bn_\ba_\bm_\be, O\bOP\bPT\bTA\bAR\bRG\bG is  unset,  and  a
+              diagnostic  message  is  printed.   If g\bge\bet\bto\bop\bpt\bts\bs is silent, then a
+              colon (:\b:) is placed in _\bn_\ba_\bm_\be and O\bOP\bPT\bTA\bAR\bRG\bG  is  set  to  the  option
+              character found.
+
+              g\bge\bet\bto\bop\bpt\bts\bs  returns true if an option, specified or unspecified, is
+              found.  It returns false if the end of options is encountered or
+              an error occurs.
+
+       h\bha\bas\bsh\bh [-\b-l\blr\br] [-\b-p\bp _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be] [-\b-d\bdt\bt] [_\bn_\ba_\bm_\be]
+              For  each  _\bn_\ba_\bm_\be, the full file name of the command is determined
+              by searching the directories in $\b$P\bPA\bAT\bTH\bH and remembered.  If the -\b-p\bp
+              option is supplied, no path search is performed, and _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be is
+              used as the full file name of the command.  The -\b-r\br option causes
+              the  shell  to  forget  all remembered locations.  The -\b-d\bd option
+              causes the shell to forget the remembered location of each _\bn_\ba_\bm_\be.
+              If  the  -\b-t\bt  option is supplied, the full pathname to which each
+              _\bn_\ba_\bm_\be corresponds is printed.  If  multiple  _\bn_\ba_\bm_\be  arguments  are
+              supplied  with  -\b-t\bt,  the  _\bn_\ba_\bm_\be is printed before the hashed full
+              pathname.  The -\b-l\bl option causes output to be displayed in a for-
+              mat  that may be reused as input.  If no arguments are given, or
+              if only -\b-l\bl is supplied, information about remembered commands is
+              printed.   The  return status is true unless a _\bn_\ba_\bm_\be is not found
+              or an invalid option is supplied.
+
+       h\bhe\bel\blp\bp [-\b-s\bs] [_\bp_\ba_\bt_\bt_\be_\br_\bn]
+              Display helpful information about builtin commands.  If  _\bp_\ba_\bt_\bt_\be_\br_\bn
+              is  specified, h\bhe\bel\blp\bp gives detailed help on all commands matching
+              _\bp_\ba_\bt_\bt_\be_\br_\bn; otherwise help for all the builtins and  shell  control
+              structures  is printed.  The -\b-s\bs option restricts the information
+              displayed to a short usage synopsis.  The  return  status  is  0
+              unless no command matches _\bp_\ba_\bt_\bt_\be_\br_\bn.
+
+       h\bhi\bis\bst\bto\bor\bry\by [\b[_\bn]\b]
+       h\bhi\bis\bst\bto\bor\bry\by -\b-c\bc
+       h\bhi\bis\bst\bto\bor\bry\by -\b-d\bd _\bo_\bf_\bf_\bs_\be_\bt
+       h\bhi\bis\bst\bto\bor\bry\by -\b-a\ban\bnr\brw\bw [_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be]
+       h\bhi\bis\bst\bto\bor\bry\by -\b-p\bp _\ba_\br_\bg [_\ba_\br_\bg _\b._\b._\b.]
+       h\bhi\bis\bst\bto\bor\bry\by -\b-s\bs _\ba_\br_\bg [_\ba_\br_\bg _\b._\b._\b.]
+              With no options, display the command history list with line num-
+              bers.  Lines listed with a *\b* have been modified.  An argument of
+              _\bn  lists only the last _\bn lines.  If the shell variable H\bHI\bIS\bST\bTT\bTI\bIM\bME\bE-\b-
+              F\bFO\bOR\bRM\bMA\bAT\bT is set and not null, it is used as a  format  string  for
+              _\bs_\bt_\br_\bf_\bt_\bi_\bm_\be(3)  to display the time stamp associated with each dis-
+              played history entry.  No intervening blank is  printed  between
+              the  formatted  time stamp and the history line.  If _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be is
+              supplied, it is used as the name of the history  file;  if  not,
+              the  value  of H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE is used.  Options, if supplied, have the
+              following meanings:
+              -\b-c\bc     Clear the history list by deleting all the entries.
+              -\b-d\bd _\bo_\bf_\bf_\bs_\be_\bt
+                     Delete the history entry at position _\bo_\bf_\bf_\bs_\be_\bt.
+              -\b-a\ba     Append the ``new'' history lines (history  lines  entered
+                     since  the  beginning of the current b\bba\bas\bsh\bh session) to the
+                     history file.
+              -\b-n\bn     Read the history lines not already read from the  history
+                     file  into  the  current  history  list.  These are lines
+                     appended to the history file since the beginning  of  the
+                     current b\bba\bas\bsh\bh session.
+              -\b-r\br     Read the contents of the history file and use them as the
+                     current history.
+              -\b-w\bw     Write the current history to the history file,  overwrit-
+                     ing the history file's contents.
+              -\b-p\bp     Perform  history  substitution  on the following _\ba_\br_\bg_\bs and
+                     display the result on  the  standard  output.   Does  not
+                     store  the results in the history list.  Each _\ba_\br_\bg must be
+                     quoted to disable normal history expansion.
+              -\b-s\bs     Store the _\ba_\br_\bg_\bs in the history list  as  a  single  entry.
+                     The  last  command  in the history list is removed before
+                     the _\ba_\br_\bg_\bs are added.
+
+              If the H\bHI\bIS\bST\bTT\bTI\bIM\bME\bEF\bFO\bOR\bRM\bMA\bAT\bT is set, the time stamp information associ-
+              ated  with  each  history  entry is written to the history file.
+              The return value is 0 unless an invalid option  is  encountered,
+              an  error  occurs  while reading or writing the history file, an
+              invalid _\bo_\bf_\bf_\bs_\be_\bt is supplied as an argument to -\b-d\bd, or the  history
+              expansion supplied as an argument to -\b-p\bp fails.
+
+       j\bjo\bob\bbs\bs [-\b-l\bln\bnp\bpr\brs\bs] [ _\bj_\bo_\bb_\bs_\bp_\be_\bc ... ]
+       j\bjo\bob\bbs\bs -\b-x\bx _\bc_\bo_\bm_\bm_\ba_\bn_\bd [ _\ba_\br_\bg_\bs ... ]
+              The first form lists the active jobs.  The options have the fol-
+              lowing meanings:
+              -\b-l\bl     List process IDs in addition to the normal information.
+              -\b-p\bp     List only the process  ID  of  the  job's  process  group
+                     leader.
+              -\b-n\bn     Display  information  only  about  jobs that have changed
+                     status since the user was last notified of their  status.
+              -\b-r\br     Restrict output to running jobs.
+              -\b-s\bs     Restrict output to stopped jobs.
+
+              If  _\bj_\bo_\bb_\bs_\bp_\be_\bc  is given, output is restricted to information about
+              that job.  The return status is 0 unless an  invalid  option  is
+              encountered or an invalid _\bj_\bo_\bb_\bs_\bp_\be_\bc is supplied.
+
+              If the -\b-x\bx option is supplied, j\bjo\bob\bbs\bs replaces any _\bj_\bo_\bb_\bs_\bp_\be_\bc found in
+              _\bc_\bo_\bm_\bm_\ba_\bn_\bd or _\ba_\br_\bg_\bs with the corresponding  process  group  ID,  and
+              executes _\bc_\bo_\bm_\bm_\ba_\bn_\bd passing it _\ba_\br_\bg_\bs, returning its exit status.
+
+       k\bki\bil\bll\bl [-\b-s\bs _\bs_\bi_\bg_\bs_\bp_\be_\bc | -\b-n\bn _\bs_\bi_\bg_\bn_\bu_\bm | -\b-_\bs_\bi_\bg_\bs_\bp_\be_\bc] [_\bp_\bi_\bd | _\bj_\bo_\bb_\bs_\bp_\be_\bc] ...
+       k\bki\bil\bll\bl -\b-l\bl [_\bs_\bi_\bg_\bs_\bp_\be_\bc | _\be_\bx_\bi_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs]
+              Send  the  signal  named  by  _\bs_\bi_\bg_\bs_\bp_\be_\bc or _\bs_\bi_\bg_\bn_\bu_\bm to the processes
+              named by _\bp_\bi_\bd or _\bj_\bo_\bb_\bs_\bp_\be_\bc.  _\bs_\bi_\bg_\bs_\bp_\be_\bc is either a signal  name  such
+              as  S\bSI\bIG\bGK\bKI\bIL\bLL\bL  or  a signal number; _\bs_\bi_\bg_\bn_\bu_\bm is a signal number.  If
+              _\bs_\bi_\bg_\bs_\bp_\be_\bc is a signal name, the name may be given with or  without
+              the  S\bSI\bIG\bG  prefix.   If  _\bs_\bi_\bg_\bs_\bp_\be_\bc  is not present, then S\bSI\bIG\bGT\bTE\bER\bRM\bM is
+              assumed.  An argument of -\b-l\bl lists  the  signal  names.   If  any
+              arguments  are  supplied when -\b-l\bl is given, the names of the sig-
+              nals corresponding to the arguments are listed, and  the  return
+              status  is 0.  The _\be_\bx_\bi_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs argument to -\b-l\bl is a number speci-
+              fying either a signal number or the exit  status  of  a  process
+              terminated  by a signal.  k\bki\bil\bll\bl returns true if at least one sig-
+              nal was successfully sent, or false if an  error  occurs  or  an
+              invalid option is encountered.
+
+       l\ble\bet\bt _\ba_\br_\bg [_\ba_\br_\bg ...]
+              Each _\ba_\br_\bg is an arithmetic expression to be evaluated (see A\bAR\bRI\bIT\bTH\bH-\b-
+              M\bME\bET\bTI\bIC\bC E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN).  If the last _\ba_\br_\bg evaluates to 0, l\ble\bet\bt  returns
+              1; 0 is returned otherwise.
+
+       l\blo\boc\bca\bal\bl [_\bo_\bp_\bt_\bi_\bo_\bn] [_\bn_\ba_\bm_\be[=_\bv_\ba_\bl_\bu_\be] ...]
+              For  each  argument, a local variable named _\bn_\ba_\bm_\be is created, and
+              assigned _\bv_\ba_\bl_\bu_\be.  The _\bo_\bp_\bt_\bi_\bo_\bn can be any of the  options  accepted
+              by d\bde\bec\bcl\bla\bar\bre\be.  When l\blo\boc\bca\bal\bl is used within a function, it causes the
+              variable _\bn_\ba_\bm_\be to have a visible scope restricted to  that  func-
+              tion and its children.  With no operands, l\blo\boc\bca\bal\bl writes a list of
+              local variables to the standard output.  It is an error  to  use
+              l\blo\boc\bca\bal\bl when not within a function.  The return status is 0 unless
+              l\blo\boc\bca\bal\bl is used outside a function, an invalid _\bn_\ba_\bm_\be  is  supplied,
+              or _\bn_\ba_\bm_\be is a readonly variable.
+
+       l\blo\bog\bgo\bou\but\bt Exit a login shell.
+
+       p\bpo\bop\bpd\bd [-n\bn] [+_\bn] [-_\bn]
+              Removes  entries  from  the directory stack.  With no arguments,
+              removes the top directory from the stack, and performs a  c\bcd\bd  to
+              the new top directory.  Arguments, if supplied, have the follow-
+              ing meanings:
+              +\b+_\bn     Removes the _\bnth entry counting from the left of the  list
+                     shown  by  d\bdi\bir\brs\bs, starting with zero.  For example: ``popd
+                     +0'' removes the first directory, ``popd +1'' the second.
+              -\b-_\bn     Removes the _\bnth entry counting from the right of the list
+                     shown by d\bdi\bir\brs\bs, starting with zero.  For  example:  ``popd
+                     -0''  removes the last directory, ``popd -1'' the next to
+                     last.
+              -\b-n\bn     Suppresses the normal change of directory  when  removing
+                     directories  from  the  stack,  so that only the stack is
+                     manipulated.
+
+              If the p\bpo\bop\bpd\bd command is successful, a d\bdi\bir\brs\bs is performed as  well,
+              and  the  return  status is 0.  p\bpo\bop\bpd\bd returns false if an invalid
+              option is encountered, the directory stack is empty, a non-exis-
+              tent directory stack entry is specified, or the directory change
+              fails.
+
+       p\bpr\bri\bin\bnt\btf\bf _\bf_\bo_\br_\bm_\ba_\bt [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+              Write the formatted _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs to the standard output  under  the
+              control  of  the _\bf_\bo_\br_\bm_\ba_\bt.  The _\bf_\bo_\br_\bm_\ba_\bt is a character string which
+              contains three types of objects:  plain  characters,  which  are
+              simply  copied  to  standard output, character escape sequences,
+              which are converted and copied to the standard output, and  for-
+              mat  specifications,  each  of which causes printing of the next
+              successive _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt.  In addition to the standard _\bp_\br_\bi_\bn_\bt_\bf(1) for-
+              mats,  %\b%b\bb  causes p\bpr\bri\bin\bnt\btf\bf to expand backslash escape sequences in
+              the corresponding _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt (except that  \\b\c\bc  terminates  output,
+              backslashes in \\b\'\b', \\b\"\b", and \\b\?\b? are not removed, and octal escapes
+              beginning with \\b\0\b0 may contain up to four digits), and %\b%q\bq  causes
+              p\bpr\bri\bin\bnt\btf\bf to output the corresponding _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt in a format that can
+              be reused as shell input.
+
+              The _\bf_\bo_\br_\bm_\ba_\bt is reused as necessary to consume all  of  the  _\ba_\br_\bg_\bu_\b-
+              _\bm_\be_\bn_\bt_\bs.  If the _\bf_\bo_\br_\bm_\ba_\bt requires more _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs than are supplied,
+              the extra format specifications behave as if  a  zero  value  or
+              null  string,  as  appropriate,  had  been supplied.  The return
+              value is zero on success, non-zero on failure.
+
+       p\bpu\bus\bsh\bhd\bd [-\b-n\bn] [_\bd_\bi_\br]
+       p\bpu\bus\bsh\bhd\bd [-\b-n\bn] [+_\bn] [-_\bn]
+              Adds a directory to the top of the directory stack,  or  rotates
+              the  stack,  making the new top of the stack the current working
+              directory.  With no arguments, exchanges the top two directories
+              and  returns 0, unless the directory stack is empty.  Arguments,
+              if supplied, have the following meanings:
+              +\b+_\bn     Rotates the stack so that  the  _\bnth  directory  (counting
+                     from  the  left  of the list shown by d\bdi\bir\brs\bs, starting with
+                     zero) is at the top.
+              -\b-_\bn     Rotates the stack so that  the  _\bnth  directory  (counting
+                     from  the  right of the list shown by d\bdi\bir\brs\bs, starting with
+                     zero) is at the top.
+              -\b-n\bn     Suppresses the normal change  of  directory  when  adding
+                     directories  to  the  stack,  so  that  only the stack is
+                     manipulated.
+              _\bd_\bi_\br    Adds _\bd_\bi_\br to the directory stack at the top, making it the
+                     new current working directory.
+
+              If the p\bpu\bus\bsh\bhd\bd command is successful, a d\bdi\bir\brs\bs is performed as well.
+              If the first form is used, p\bpu\bus\bsh\bhd\bd returns 0 unless the cd to  _\bd_\bi_\br
+              fails.   With the second form, p\bpu\bus\bsh\bhd\bd returns 0 unless the direc-
+              tory stack is empty, a non-existent directory stack  element  is
+              specified,  or the directory change to the specified new current
+              directory fails.
+
+       p\bpw\bwd\bd [-\b-L\bLP\bP]
+              Print the absolute pathname of the  current  working  directory.
+              The pathname printed contains no symbolic links if the -\b-P\bP option
+              is supplied or the -\b-o\bo p\bph\bhy\bys\bsi\bic\bca\bal\bl option to the s\bse\bet\bt builtin command
+              is  enabled.  If the -\b-L\bL option is used, the pathname printed may
+              contain symbolic links.  The return status is 0 unless an  error
+              occurs  while  reading  the  name of the current directory or an
+              invalid option is supplied.
+
+       r\bre\bea\bad\bd [-\b-e\ber\brs\bs] [-\b-u\bu _\bf_\bd] [-\b-t\bt _\bt_\bi_\bm_\be_\bo_\bu_\bt] [-\b-a\ba _\ba_\bn_\ba_\bm_\be] [-\b-p\bp _\bp_\br_\bo_\bm_\bp_\bt] [-\b-n\bn _\bn_\bc_\bh_\ba_\br_\bs] [-\b-d\bd
+       _\bd_\be_\bl_\bi_\bm] [_\bn_\ba_\bm_\be ...]
+              One line is read from the  standard  input,  or  from  the  file
+              descriptor  _\bf_\bd supplied as an argument to the -\b-u\bu option, and the
+              first word is assigned to the first _\bn_\ba_\bm_\be, the second word to the
+              second  _\bn_\ba_\bm_\be, and so on, with leftover words and their interven-
+              ing separators assigned to the last _\bn_\ba_\bm_\be.  If  there  are  fewer
+              words read from the input stream than names, the remaining names
+              are assigned empty values.  The characters in I\bIF\bFS\bS  are  used  to
+              split  the  line into words.  The backslash character (\\b\) may be
+              used to remove any special meaning for the next  character  read
+              and  for line continuation.  Options, if supplied, have the fol-
+              lowing meanings:
+              -\b-a\ba _\ba_\bn_\ba_\bm_\be
+                     The words are assigned to sequential indices of the array
+                     variable _\ba_\bn_\ba_\bm_\be, starting at 0.  _\ba_\bn_\ba_\bm_\be is unset before any
+                     new  values  are  assigned.   Other  _\bn_\ba_\bm_\be  arguments  are
+                     ignored.
+              -\b-d\bd _\bd_\be_\bl_\bi_\bm
+                     The  first  character  of  _\bd_\be_\bl_\bi_\bm is used to terminate the
+                     input line, rather than newline.
+              -\b-e\be     If the standard input is coming from a terminal, r\bre\bea\bad\bdl\bli\bin\bne\be
+                     (see R\bRE\bEA\bAD\bDL\bLI\bIN\bNE\bE above) is used to obtain the line.
+              -\b-n\bn _\bn_\bc_\bh_\ba_\br_\bs
+                     r\bre\bea\bad\bd  returns after reading _\bn_\bc_\bh_\ba_\br_\bs characters rather than
+                     waiting for a complete line of input.
+              -\b-p\bp _\bp_\br_\bo_\bm_\bp_\bt
+                     Display _\bp_\br_\bo_\bm_\bp_\bt on standard error, without a trailing new-
+                     line, before attempting to read any input.  The prompt is
+                     displayed only if input is coming from a terminal.
+              -\b-r\br     Backslash does not act as an escape character.  The back-
+                     slash  is considered to be part of the line.  In particu-
+                     lar, a backslash-newline pair may not be used as  a  line
+                     continuation.
+              -\b-s\bs     Silent mode.  If input is coming from a terminal, charac-
+                     ters are not echoed.
+              -\b-t\bt _\bt_\bi_\bm_\be_\bo_\bu_\bt
+                     Cause r\bre\bea\bad\bd to time out and return failure if  a  complete
+                     line  of  input is not read within _\bt_\bi_\bm_\be_\bo_\bu_\bt seconds.  This
+                     option has no effect if r\bre\bea\bad\bd is not  reading  input  from
+                     the terminal or a pipe.
+              -\b-u\bu _\bf_\bd  Read input from file descriptor _\bf_\bd.
+
+              If no _\bn_\ba_\bm_\be_\bs are supplied, the line read is assigned to the vari-
+              able R\bRE\bEP\bPL\bLY\bY.  The return code  is  zero,  unless  end-of-file  is
+              encountered,  r\bre\bea\bad\bd  times  out, or an invalid file descriptor is
+              supplied as the argument to -\b-u\bu.
+
+       r\bre\bea\bad\bdo\bon\bnl\bly\by [-\b-a\bap\bpf\bf] [_\bn_\ba_\bm_\be[=_\bw_\bo_\br_\bd] ...]
+              The given _\bn_\ba_\bm_\be_\bs are marked readonly; the values of  these  _\bn_\ba_\bm_\be_\bs
+              may  not  be changed by subsequent assignment.  If the -\b-f\bf option
+              is supplied, the functions corresponding to  the  _\bn_\ba_\bm_\be_\bs  are  so
+              marked.  The -\b-a\ba option restricts the variables to arrays.  If no
+              _\bn_\ba_\bm_\be arguments are given, or if the -\b-p\bp  option  is  supplied,  a
+              list  of  all  readonly  names is printed.  The -\b-p\bp option causes
+              output to be displayed in a format that may be reused as  input.
+              If  a variable name is followed by =_\bw_\bo_\br_\bd, the value of the vari-
+              able is set to _\bw_\bo_\br_\bd.  The return status is 0 unless  an  invalid
+              option  is  encountered,  one  of the _\bn_\ba_\bm_\be_\bs is not a valid shell
+              variable name, or -\b-f\bf is supplied with a _\bn_\ba_\bm_\be that is not a func-
+              tion.
+
+       r\bre\bet\btu\bur\brn\bn [_\bn]
+              Causes  a function to exit with the return value specified by _\bn.
+              If _\bn is omitted, the return status is that of the  last  command
+              executed  in the function body.  If used outside a function, but
+              during execution of a script by  the  .\b.   (s\bso\bou\bur\brc\bce\be)  command,  it
+              causes the shell to stop executing that script and return either
+              _\bn or the exit status of the last  command  executed  within  the
+              script  as  the  exit  status  of the script.  If used outside a
+              function and not during execution of a script by .\b.,  the  return
+              status is false.  Any command associated with the R\bRE\bET\bTU\bUR\bRN\bN trap is
+              executed before execution resumes after the function or  script.
+
+       s\bse\bet\bt [-\b--\b-a\bab\bbe\bef\bfh\bhk\bkm\bmn\bnp\bpt\btu\buv\bvx\bxB\bBC\bCH\bHP\bP] [-\b-o\bo _\bo_\bp_\bt_\bi_\bo_\bn] [_\ba_\br_\bg ...]
+              Without  options,  the name and value of each shell variable are
+              displayed in a format that can be reused as input.   The  output
+              is  sorted  according  to  the current locale.  When options are
+              specified, they set or unset shell  attributes.   Any  arguments
+              remaining  after the options are processed are treated as values
+              for the positional parameters and are assigned, in order, to $\b$1\b1,
+              $\b$2\b2,  .\b..\b..\b.   $\b$_\bn.   Options, if specified, have the following mean-
+              ings:
+              -\b-a\ba      Automatically mark variables  and  functions  which  are
+                      modified  or  created  for  export to the environment of
+                      subsequent commands.
+              -\b-b\bb      Report the status of terminated background jobs  immedi-
+                      ately, rather than before the next primary prompt.  This
+                      is effective only when job control is enabled.
+              -\b-e\be      Exit immediately if a _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd (see S\bSH\bHE\bEL\bLL\bL  G\bGR\bRA\bAM\bMM\bMA\bAR\bR
+                      above) exits with a non-zero status.  The shell does not
+                      exit if the command that fails is part  of  the  command
+                      list  immediately  following  a  w\bwh\bhi\bil\ble\be or u\bun\bnt\bti\bil\bl keyword,
+                      part of the test in an _\bi_\bf statement, part of a &\b&&\b& or  |\b||\b|
+                      list, or if the command's return value is being inverted
+                      via !\b!.  A trap on E\bER\bRR\bR, if set, is  executed  before  the
+                      shell exits.
+              -\b-f\bf      Disable pathname expansion.
+              -\b-h\bh      Remember  the location of commands as they are looked up
+                      for execution.  This is enabled by default.
+              -\b-k\bk      All arguments in the form of assignment  statements  are
+                      placed  in the environment for a command, not just those
+                      that precede the command name.
+              -\b-m\bm      Monitor mode.  Job control is enabled.  This  option  is
+                      on  by  default  for  interactive shells on systems that
+                      support it (see J\bJO\bOB\bB  C\bCO\bON\bNT\bTR\bRO\bOL\bL  above).   Background  pro-
+                      cesses  run  in a separate process group and a line con-
+                      taining their exit status is printed upon their  comple-
+                      tion.
+              -\b-n\bn      Read commands but do not execute them.  This may be used
+                      to check a shell script  for  syntax  errors.   This  is
+                      ignored by interactive shells.
+              -\b-o\bo _\bo_\bp_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be
+                      The _\bo_\bp_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be can be one of the following:
+                      a\bal\bll\ble\bex\bxp\bpo\bor\brt\bt
+                              Same as -\b-a\ba.
+                      b\bbr\bra\bac\bce\bee\bex\bxp\bpa\ban\bnd\bd
+                              Same as -\b-B\bB.
+                      e\bem\bma\bac\bcs\bs   Use  an  emacs-style command line editing inter-
+                              face.  This is enabled by default when the shell
+                              is interactive, unless the shell is started with
+                              the -\b--\b-n\bno\boe\bed\bdi\bit\bti\bin\bng\bg option.
+                      e\ber\brr\brt\btr\bra\bac\bce\be
+                              Same as -\b-E\bE.
+                      f\bfu\bun\bnc\bct\btr\bra\bac\bce\be
+                              Same as -\b-T\bT.
+                      e\ber\brr\bre\bex\bxi\bit\bt Same as -\b-e\be.
+                      h\bha\bas\bsh\bha\bal\bll\bl Same as -\b-h\bh.
+                      h\bhi\bis\bst\bte\bex\bxp\bpa\ban\bnd\bd
+                              Same as -\b-H\bH.
+                      h\bhi\bis\bst\bto\bor\bry\by Enable command history, as described above under
+                              H\bHI\bIS\bST\bTO\bOR\bRY\bY.  This option is on by default in inter-
+                              active shells.
+                      i\big\bgn\bno\bor\bre\bee\beo\bof\bf
+                              The  effect  is  as   if   the   shell   command
+                              ``IGNOREEOF=10''  had  been  executed (see S\bSh\bhe\bel\bll\bl
+                              V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs above).
+                      k\bke\bey\byw\bwo\bor\brd\bd Same as -\b-k\bk.
+                      m\bmo\bon\bni\bit\bto\bor\br Same as -\b-m\bm.
+                      n\bno\boc\bcl\blo\bob\bbb\bbe\ber\br
+                              Same as -\b-C\bC.
+                      n\bno\boe\bex\bxe\bec\bc  Same as -\b-n\bn.
+                      n\bno\bog\bgl\blo\bob\bb  Same as -\b-f\bf.  n\bno\bol\blo\bog\bg Currently ignored.
+                      n\bno\bot\bti\bif\bfy\by  Same as -\b-b\bb.
+                      n\bno\bou\bun\bns\bse\bet\bt Same as -\b-u\bu.
+                      o\bon\bne\bec\bcm\bmd\bd  Same as -\b-t\bt.
+                      p\bph\bhy\bys\bsi\bic\bca\bal\bl
+                              Same as -\b-P\bP.
+                      p\bpi\bip\bpe\bef\bfa\bai\bil\bl
+                              If set, the return value of a  pipeline  is  the
+                              value  of  the  last (rightmost) command to exit
+                              with a non-zero status, or zero if all  commands
+                              in  the pipeline exit successfully.  This option
+                              is disabled by default.
+                      p\bpo\bos\bsi\bix\bx   Change the behavior of b\bba\bas\bsh\bh  where  the  default
+                              operation differs from the POSIX 1003.2 standard
+                              to match the standard (_\b`_\bp_\bo_\bs_\bi_\bx _\bm_\bo_\bd_\be).
+                      p\bpr\bri\biv\bvi\bil\ble\beg\bge\bed\bd
+                              Same as -\b-p\bp.
+                      v\bve\ber\brb\bbo\bos\bse\be Same as -\b-v\bv.
+                      v\bvi\bi      Use a vi-style command line editing interface.
+                      x\bxt\btr\bra\bac\bce\be  Same as -\b-x\bx.
+                      If -\b-o\bo is supplied with no _\bo_\bp_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be, the values of the
+                      current  options are printed.  If +\b+o\bo is supplied with no
+                      _\bo_\bp_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be, a series of s\bse\bet\bt commands  to  recreate  the
+                      current  option  settings  is  displayed on the standard
+                      output.
+              -\b-p\bp      Turn on _\bp_\br_\bi_\bv_\bi_\bl_\be_\bg_\be_\bd mode.  In this  mode,  the  $\b$E\bEN\bNV\bV  and
+                      $\b$B\bBA\bAS\bSH\bH_\b_E\bEN\bNV\bV  files  are not processed, shell functions are
+                      not inherited from the environment,  and  the  S\bSH\bHE\bEL\bLL\bLO\bOP\bPT\bTS\bS
+                      variable,  if it appears in the environment, is ignored.
+                      If the shell is started with the effective user  (group)
+                      id  not  equal  to  the real user (group) id, and the -\b-p\bp
+                      option is not supplied, these actions are taken and  the
+                      effective user id is set to the real user id.  If the -\b-p\bp
+                      option is supplied at startup, the effective user id  is
+                      not reset.  Turning this option off causes the effective
+                      user and group ids to be set to the real user and  group
+                      ids.
+              -\b-t\bt      Exit after reading and executing one command.
+              -\b-u\bu      Treat unset variables as an error when performing param-
+                      eter expansion.  If expansion is attempted on  an  unset
+                      variable, the shell prints an error message, and, if not
+                      interactive, exits with a non-zero status.
+              -\b-v\bv      Print shell input lines as they are read.
+              -\b-x\bx      After expanding each _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd, f\bfo\bor\br  command,  c\bca\bas\bse\be
+                      command, s\bse\bel\ble\bec\bct\bt command, or arithmetic f\bfo\bor\br command, dis-
+                      play the expanded value of P\bPS\bS4\b4, followed by the  command
+                      and its expanded arguments or associated word list.
+              -\b-B\bB      The  shell performs brace expansion (see B\bBr\bra\bac\bce\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn
+                      above).  This is on by default.
+              -\b-C\bC      If set, b\bba\bas\bsh\bh does not overwrite an  existing  file  with
+                      the  >\b>,  >\b>&\b&,  and <\b<>\b> redirection operators.  This may be
+                      overridden when creating output files by using the redi-
+                      rection operator >\b>|\b| instead of >\b>.
+              -\b-E\bE      If set, any trap on E\bER\bRR\bR is inherited by shell functions,
+                      command substitutions, and commands executed in  a  sub-
+                      shell  environment.  The E\bER\bRR\bR trap is normally not inher-
+                      ited in such cases.
+              -\b-H\bH      Enable !\b!  style history substitution.  This option is on
+                      by default when the shell is interactive.
+              -\b-P\bP      If  set,  the  shell does not follow symbolic links when
+                      executing commands such as c\bcd\bd that  change  the  current
+                      working  directory.   It  uses  the  physical  directory
+                      structure instead.  By default, b\bba\bas\bsh\bh follows the logical
+                      chain  of  directories  when  performing  commands which
+                      change the current directory.
+              -\b-T\bT      If set, any trap on D\bDE\bEB\bBU\bUG\bG is inherited  by  shell  func-
+                      tions, command substitutions, and commands executed in a
+                      subshell environment.  The D\bDE\bEB\bBU\bUG\bG trap  is  normally  not
+                      inherited in such cases.
+              -\b--\b-      If  no arguments follow this option, then the positional
+                      parameters are unset.  Otherwise, the positional parame-
+                      ters  are  set  to  the _\ba_\br_\bgs, even if some of them begin
+                      with a -\b-.
+              -\b-       Signal the end of options, cause all remaining  _\ba_\br_\bgs  to
+                      be assigned to the positional parameters.  The -\b-x\bx and -\b-v\bv
+                      options are turned off.  If there are no _\ba_\br_\bgs, the posi-
+                      tional parameters remain unchanged.
+
+              The  options are off by default unless otherwise noted.  Using +
+              rather than - causes  these  options  to  be  turned  off.   The
+              options  can  also be specified as arguments to an invocation of
+              the shell.  The current set of options may be found in $\b$-\b-.   The
+              return status is always true unless an invalid option is encoun-
+              tered.
+
+       s\bsh\bhi\bif\bft\bt [_\bn]
+              The positional parameters from _\bn+1 ... are renamed  to  $\b$1\b1  .\b..\b..\b..\b.
+              Parameters  represented  by  the  numbers  $\b$#\b# down to $\b$#\b#-_\bn+1 are
+              unset.  _\bn must be a non-negative number less than  or  equal  to
+              $\b$#\b#.   If  _\bn is 0, no parameters are changed.  If _\bn is not given,
+              it is assumed to be 1.  If _\bn is greater than $\b$#\b#, the  positional
+              parameters  are  not changed.  The return status is greater than
+              zero if _\bn is greater than $\b$#\b# or less than zero; otherwise 0.
+
+       s\bsh\bho\bop\bpt\bt [-\b-p\bpq\bqs\bsu\bu] [-\b-o\bo] [_\bo_\bp_\bt_\bn_\ba_\bm_\be ...]
+              Toggle the values of variables controlling optional shell behav-
+              ior.  With no options, or with the -\b-p\bp option, a list of all set-
+              table options is displayed, with an indication of whether or not
+              each  is  set.  The -\b-p\bp option causes output to be displayed in a
+              form that may be reused as input.  Other options have  the  fol-
+              lowing meanings:
+              -\b-s\bs     Enable (set) each _\bo_\bp_\bt_\bn_\ba_\bm_\be.
+              -\b-u\bu     Disable (unset) each _\bo_\bp_\bt_\bn_\ba_\bm_\be.
+              -\b-q\bq     Suppresses  normal output (quiet mode); the return status
+                     indicates whether the _\bo_\bp_\bt_\bn_\ba_\bm_\be is set or unset.  If multi-
+                     ple  _\bo_\bp_\bt_\bn_\ba_\bm_\be arguments are given with -\b-q\bq, the return sta-
+                     tus is zero if all _\bo_\bp_\bt_\bn_\ba_\bm_\be_\bs are enabled; non-zero  other-
+                     wise.
+              -\b-o\bo     Restricts  the  values of _\bo_\bp_\bt_\bn_\ba_\bm_\be to be those defined for
+                     the -\b-o\bo option to the s\bse\bet\bt builtin.
+
+              If either -\b-s\bs or -\b-u\bu is used with no _\bo_\bp_\bt_\bn_\ba_\bm_\be arguments,  the  dis-
+              play is limited to those options which are set or unset, respec-
+              tively.  Unless otherwise noted, the s\bsh\bho\bop\bpt\bt options are  disabled
+              (unset) by default.
+
+              The  return  status when listing options is zero if all _\bo_\bp_\bt_\bn_\ba_\bm_\be_\bs
+              are enabled, non-zero  otherwise.   When  setting  or  unsetting
+              options,  the  return  status is zero unless an _\bo_\bp_\bt_\bn_\ba_\bm_\be is not a
+              valid shell option.
+
+              The list of s\bsh\bho\bop\bpt\bt options is:
+
+              c\bcd\bda\bab\bbl\ble\be_\b_v\bva\bar\brs\bs
+                      If set, an argument to the c\bcd\bd builtin  command  that  is
+                      not  a directory is assumed to be the name of a variable
+                      whose value is the directory to change to.
+              c\bcd\bds\bsp\bpe\bel\bll\bl If set, minor errors in the spelling of a directory com-
+                      ponent  in  a  c\bcd\bd command will be corrected.  The errors
+                      checked for are transposed characters, a missing charac-
+                      ter,  and  one  character  too many.  If a correction is
+                      found, the corrected file name is printed, and the  com-
+                      mand  proceeds.  This option is only used by interactive
+                      shells.
+              c\bch\bhe\bec\bck\bkh\bha\bas\bsh\bh
+                      If set, b\bba\bas\bsh\bh checks that a command found in the hash ta-
+                      ble  exists  before  trying  to execute it.  If a hashed
+                      command no longer exists, a normal path search  is  per-
+                      formed.
+              c\bch\bhe\bec\bck\bkw\bwi\bin\bns\bsi\biz\bze\be
+                      If  set,  b\bba\bas\bsh\bh checks the window size after each command
+                      and, if necessary,  updates  the  values  of  L\bLI\bIN\bNE\bES\bS  and
+                      C\bCO\bOL\bLU\bUM\bMN\bNS\bS.
+              c\bcm\bmd\bdh\bhi\bis\bst\bt If  set,  b\bba\bas\bsh\bh attempts to save all lines of a multiple-
+                      line command in the same  history  entry.   This  allows
+                      easy re-editing of multi-line commands.
+              d\bdo\bot\btg\bgl\blo\bob\bb If  set, b\bba\bas\bsh\bh includes filenames beginning with a `.' in
+                      the results of pathname expansion.
+              e\bex\bxe\bec\bcf\bfa\bai\bil\bl
+                      If set, a non-interactive shell will not exit if it can-
+                      not  execute  the  file  specified as an argument to the
+                      e\bex\bxe\bec\bc builtin command.  An  interactive  shell  does  not
+                      exit if e\bex\bxe\bec\bc fails.
+              e\bex\bxp\bpa\ban\bnd\bd_\b_a\bal\bli\bia\bas\bse\bes\bs
+                      If  set,  aliases  are expanded as described above under
+                      A\bAL\bLI\bIA\bAS\bSE\bES\bS.  This option is enabled by default for interac-
+                      tive shells.
+              e\bex\bxt\btd\bde\beb\bbu\bug\bg
+                      If  set,  behavior  intended  for  use  by  debuggers is
+                      enabled:
+                      1\b1.\b.     The -\b-F\bF option to the d\bde\bec\bcl\bla\bar\bre\be builtin displays the
+                             source file name and line number corresponding to
+                             each function name supplied as an argument.
+                      2\b2.\b.     If the command run by the D\bDE\bEB\bBU\bUG\bG  trap  returns  a
+                             non-zero  value,  the next command is skipped and
+                             not executed.
+                      3\b3.\b.     If the command run by the D\bDE\bEB\bBU\bUG\bG  trap  returns  a
+                             value  of 2, and the shell is executing in a sub-
+                             routine (a shell function or a shell script  exe-
+                             cuted  by  the  .\b.  or s\bso\bou\bur\brc\bce\be builtins), a call to
+                             r\bre\bet\btu\bur\brn\bn is simulated.
+              e\bex\bxt\btg\bgl\blo\bob\bb If set, the extended pattern matching features described
+                      above under P\bPa\bat\bth\bhn\bna\bam\bme\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn are enabled.
+              e\bex\bxt\btq\bqu\buo\bot\bte\be
+                      If  set,  $\b$'_\bs_\bt_\br_\bi_\bn_\bg'  and  $\b$"_\bs_\bt_\br_\bi_\bn_\bg" quoting is performed
+                      within  $\b${\b{_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br}\b}  expansions  enclosed   in   double
+                      quotes.  This option is enabled by default.
+              f\bfa\bai\bil\blg\bgl\blo\bob\bb
+                      If  set,  patterns  which fail to match filenames during
+                      pathname expansion result in an expansion error.
+              f\bfo\bor\brc\bce\be_\b_f\bfi\big\bgn\bno\bor\bre\be
+                      If set, the suffixes  specified  by  the  F\bFI\bIG\bGN\bNO\bOR\bRE\bE  shell
+                      variable  cause words to be ignored when performing word
+                      completion even if the ignored words are the only possi-
+                      ble  completions.   See  S\bSH\bHE\bEL\bLL\bL  V\bVA\bAR\bRI\bIA\bAB\bBL\bLE\bES\bS  above  for  a
+                      description of  F\bFI\bIG\bGN\bNO\bOR\bRE\bE.   This  option  is  enabled  by
+                      default.
+              g\bgn\bnu\bu_\b_e\ber\brr\brf\bfm\bmt\bt
+                      If set, shell error messages are written in the standard
+                      GNU error message format.
+              h\bhi\bis\bst\bta\bap\bpp\bpe\ben\bnd\bd
+                      If set, the history list is appended to the  file  named
+                      by  the  value  of  the H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE variable when the shell
+                      exits, rather than overwriting the file.
+              h\bhi\bis\bst\btr\bre\bee\bed\bdi\bit\bt
+                      If set, and r\bre\bea\bad\bdl\bli\bin\bne\be is being used, a user is given  the
+                      opportunity to re-edit a failed history substitution.
+              h\bhi\bis\bst\btv\bve\ber\bri\bif\bfy\by
+                      If  set, and r\bre\bea\bad\bdl\bli\bin\bne\be is being used, the results of his-
+                      tory substitution are  not  immediately  passed  to  the
+                      shell  parser.   Instead,  the  resulting line is loaded
+                      into the r\bre\bea\bad\bdl\bli\bin\bne\be editing buffer, allowing further modi-
+                      fication.
+              h\bho\bos\bst\btc\bco\bom\bmp\bpl\ble\bet\bte\be
+                      If set, and r\bre\bea\bad\bdl\bli\bin\bne\be is being used, b\bba\bas\bsh\bh will attempt to
+                      perform hostname completion when a word containing  a  @\b@
+                      is   being  completed  (see  C\bCo\bom\bmp\bpl\ble\bet\bti\bin\bng\bg  under  R\bRE\bEA\bAD\bDL\bLI\bIN\bNE\bE
+                      above).  This is enabled by default.
+              h\bhu\bup\bpo\bon\bne\bex\bxi\bit\bt
+                      If set, b\bba\bas\bsh\bh will send S\bSI\bIG\bGH\bHU\bUP\bP to all jobs when an inter-
+                      active login shell exits.
+              i\bin\bnt\bte\ber\bra\bac\bct\bti\biv\bve\be_\b_c\bco\bom\bmm\bme\ben\bnt\bts\bs
+                      If set, allow a word beginning with #\b# to cause that word
+                      and all remaining characters on that line to be  ignored
+                      in  an  interactive  shell  (see  C\bCO\bOM\bMM\bME\bEN\bNT\bTS\bS above).  This
+                      option is enabled by default.
+              l\bli\bit\bth\bhi\bis\bst\bt If set, and the c\bcm\bmd\bdh\bhi\bis\bst\bt option  is  enabled,  multi-line
+                      commands are saved to the history with embedded newlines
+                      rather than using semicolon separators where possible.
+              l\blo\bog\bgi\bin\bn_\b_s\bsh\bhe\bel\bll\bl
+                      The shell sets this option if it is started as  a  login
+                      shell  (see  I\bIN\bNV\bVO\bOC\bCA\bAT\bTI\bIO\bON\bN  above).   The  value may not be
+                      changed.
+              m\bma\bai\bil\blw\bwa\bar\brn\bn
+                      If set, and a file that b\bba\bas\bsh\bh is checking  for  mail  has
+                      been  accessed  since  the last time it was checked, the
+                      message ``The mail in _\bm_\ba_\bi_\bl_\bf_\bi_\bl_\be has been read''  is  dis-
+                      played.
+              n\bno\bo_\b_e\bem\bmp\bpt\bty\by_\b_c\bcm\bmd\bd_\b_c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bn
+                      If  set,  and  r\bre\bea\bad\bdl\bli\bin\bne\be  is  being  used,  b\bba\bas\bsh\bh will not
+                      attempt to search the P\bPA\bAT\bTH\bH for possible completions when
+                      completion is attempted on an empty line.
+              n\bno\boc\bca\bas\bse\beg\bgl\blo\bob\bb
+                      If  set,  b\bba\bas\bsh\bh  matches  filenames in a case-insensitive
+                      fashion when performing pathname expansion (see P\bPa\bat\bth\bhn\bna\bam\bme\be
+                      E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn above).
+              n\bnu\bul\bll\blg\bgl\blo\bob\bb
+                      If  set,  b\bba\bas\bsh\bh allows patterns which match no files (see
+                      P\bPa\bat\bth\bhn\bna\bam\bme\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn above) to expand to  a  null  string,
+                      rather than themselves.
+              p\bpr\bro\bog\bgc\bco\bom\bmp\bp
+                      If set, the programmable completion facilities (see P\bPr\bro\bo-\b-
+                      g\bgr\bra\bam\bmm\bma\bab\bbl\ble\be C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn above) are enabled.  This option is
+                      enabled by default.
+              p\bpr\bro\bom\bmp\bpt\btv\bva\bar\brs\bs
+                      If set, prompt strings undergo parameter expansion, com-
+                      mand  substitution,  arithmetic  expansion,  and   quote
+                      removal  after  being expanded as described in P\bPR\bRO\bOM\bMP\bPT\bTI\bIN\bNG\bG
+                      above.  This option is enabled by default.
+              r\bre\bes\bst\btr\bri\bic\bct\bte\bed\bd_\b_s\bsh\bhe\bel\bll\bl
+                      The  shell  sets  this  option  if  it  is  started   in
+                      restricted mode (see R\bRE\bES\bST\bTR\bRI\bIC\bCT\bTE\bED\bD S\bSH\bHE\bEL\bLL\bL below).  The value
+                      may not be changed.  This is not reset when the  startup
+                      files  are  executed, allowing the startup files to dis-
+                      cover whether or not a shell is restricted.
+              s\bsh\bhi\bif\bft\bt_\b_v\bve\ber\brb\bbo\bos\bse\be
+                      If set, the s\bsh\bhi\bif\bft\bt builtin prints an error  message  when
+                      the shift count exceeds the number of positional parame-
+                      ters.
+              s\bso\bou\bur\brc\bce\bep\bpa\bat\bth\bh
+                      If set, the s\bso\bou\bur\brc\bce\be (.\b.) builtin uses the value of P\bPA\bAT\bTH\bH to
+                      find  the  directory  containing the file supplied as an
+                      argument.  This option is enabled by default.
+              x\bxp\bpg\bg_\b_e\bec\bch\bho\bo
+                      If  set,  the  e\bec\bch\bho\bo  builtin  expands   backslash-escape
+                      sequences by default.
+       s\bsu\bus\bsp\bpe\ben\bnd\bd [-\b-f\bf]
+              Suspend  the execution of this shell until it receives a S\bSI\bIG\bGC\bCO\bON\bNT\bT
+              signal.  The -\b-f\bf option says not to complain if this is  a  login
+              shell;  just  suspend anyway.  The return status is 0 unless the
+              shell is a login shell and -\b-f\bf is not supplied, or if job control
+              is not enabled.
+       t\bte\bes\bst\bt _\be_\bx_\bp_\br
+       [\b[ _\be_\bx_\bp_\br ]\b]
+              Return  a  status  of  0 or 1 depending on the evaluation of the
+              conditional expression _\be_\bx_\bp_\br.  Each operator and operand must  be
+              a  separate argument.  Expressions are composed of the primaries
+              described above under C\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNA\bAL\bL E\bEX\bXP\bPR\bRE\bES\bSS\bSI\bIO\bON\bNS\bS.
+
+              Expressions may  be  combined  using  the  following  operators,
+              listed in decreasing order of precedence.
+              !\b! _\be_\bx_\bp_\br True if _\be_\bx_\bp_\br is false.
+              (\b( _\be_\bx_\bp_\br )\b)
+                     Returns  the value of _\be_\bx_\bp_\br.  This may be used to override
+                     the normal precedence of operators.
+              _\be_\bx_\bp_\br_\b1 -a\ba _\be_\bx_\bp_\br_\b2
+                     True if both _\be_\bx_\bp_\br_\b1 and _\be_\bx_\bp_\br_\b2 are true.
+              _\be_\bx_\bp_\br_\b1 -o\bo _\be_\bx_\bp_\br_\b2
+                     True if either _\be_\bx_\bp_\br_\b1 or _\be_\bx_\bp_\br_\b2 is true.
+
+              t\bte\bes\bst\bt and [\b[ evaluate conditional expressions using a set of rules
+              based on the number of arguments.
+
+              0 arguments
+                     The expression is false.
+              1 argument
+                     The expression is true if and only if the argument is not
+                     null.
+              2 arguments
+                     If the first argument is !\b!, the expression is true if and
+                     only  if the second argument is null.  If the first argu-
+                     ment is one of the  unary  conditional  operators  listed
+                     above  under  C\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNA\bAL\bL  E\bEX\bXP\bPR\bRE\bES\bSS\bSI\bIO\bON\bNS\bS, the expression is
+                     true if the unary test is true.  If the first argument is
+                     not a valid unary conditional operator, the expression is
+                     false.
+              3 arguments
+                     If the second argument is one of the  binary  conditional
+                     operators listed above under C\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNA\bAL\bL E\bEX\bXP\bPR\bRE\bES\bSS\bSI\bIO\bON\bNS\bS, the
+                     result of the expression is the result of the binary test
+                     using  the first and third arguments as operands.  If the
+                     first argument is !\b!, the value is  the  negation  of  the
+                     two-argument  test  using the second and third arguments.
+                     If the first argument is exactly (\b( and the third argument
+                     is  exactly )\b), the result is the one-argument test of the
+                     second argument.  Otherwise,  the  expression  is  false.
+                     The  -\b-a\ba  and -\b-o\bo operators are considered binary operators
+                     in this case.
+              4 arguments
+                     If the first argument is !\b!, the result is the negation of
+                     the  three-argument  expression composed of the remaining
+                     arguments.  Otherwise, the expression is parsed and eval-
+                     uated  according  to  precedence  using  the rules listed
+                     above.
+              5 or more arguments
+                     The expression  is  parsed  and  evaluated  according  to
+                     precedence using the rules listed above.
+
+       t\bti\bim\bme\bes\bs  Print  the  accumulated  user and system times for the shell and
+              for processes run from the shell.  The return status is 0.
+
+       t\btr\bra\bap\bp [-\b-l\blp\bp] [_\ba_\br_\bg] [_\bs_\bi_\bg_\bs_\bp_\be_\bc ...]
+              The command _\ba_\br_\bg is to  be  read  and  executed  when  the  shell
+              receives  signal(s)  _\bs_\bi_\bg_\bs_\bp_\be_\bc.  If _\ba_\br_\bg is absent or -\b-, all speci-
+              fied signals are reset to their original values (the values they
+              had  upon entrance to the shell).  If _\ba_\br_\bg is the null string the
+              signal specified by each _\bs_\bi_\bg_\bs_\bp_\be_\bc is ignored by the shell and  by
+              the  commands it invokes.  If _\ba_\br_\bg is not present and -\b-p\bp has been
+              supplied, then the trap commands associated  with  each  _\bs_\bi_\bg_\bs_\bp_\be_\bc
+              are  displayed.   If  no arguments are supplied or if only -\b-p\bp is
+              given, t\btr\bra\bap\bp prints the list of  commands  associated  with  each
+              signal  number.   The -\b-l\bl option causes the shell to print a list
+              of signal names and their corresponding numbers.   Each  _\bs_\bi_\bg_\bs_\bp_\be_\bc
+              is  either  a  signal  name  defined  in <_\bs_\bi_\bg_\bn_\ba_\bl_\b._\bh>, or a signal
+              number.  If a _\bs_\bi_\bg_\bs_\bp_\be_\bc is E\bEX\bXI\bIT\bT (0) the command _\ba_\br_\bg is executed on
+              exit  from the shell.  If a _\bs_\bi_\bg_\bs_\bp_\be_\bc is D\bDE\bEB\bBU\bUG\bG, the command _\ba_\br_\bg is
+              executed before every _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd, _\bf_\bo_\br command, _\bc_\ba_\bs_\be command,
+              _\bs_\be_\bl_\be_\bc_\bt  command,  every  arithmetic  _\bf_\bo_\br command, and before the
+              first command executes in a shell function  (see  S\bSH\bHE\bEL\bLL\bL  G\bGR\bRA\bAM\bMM\bMA\bAR\bR
+              above).   Refer  to the description of the e\bex\bxt\btg\bgl\blo\bob\bb option to the
+              s\bsh\bho\bop\bpt\bt builtin for details of its effect on the D\bDE\bEB\bBU\bUG\bG trap.  If a
+              _\bs_\bi_\bg_\bs_\bp_\be_\bc  is  E\bER\bRR\bR,  the command _\ba_\br_\bg is executed whenever a simple
+              command has a non-zero exit status,  subject  to  the  following
+              conditions.   The E\bER\bRR\bR trap is not executed if the failed command
+              is part of the command list immediately  following  a  w\bwh\bhi\bil\ble\be  or
+              u\bun\bnt\bti\bil\bl keyword, part of the test in an _\bi_\bf statement, part of a &\b&&\b&
+              or |\b||\b| list, or if the command's return value is  being  inverted
+              via  !\b!.   These  are  the  same conditions obeyed by the e\ber\brr\bre\bex\bxi\bit\bt
+              option.  If a _\bs_\bi_\bg_\bs_\bp_\be_\bc is R\bRE\bET\bTU\bUR\bRN\bN, the  command  _\ba_\br_\bg  is  executed
+              each  time  a  shell function or a script executed with the .\b. or
+              s\bso\bou\bur\brc\bce\be builtins finishes executing.  Signals ignored upon  entry
+              to  the  shell  cannot be trapped or reset.  Trapped signals are
+              reset to their original values in a child  process  when  it  is
+              created.   The return status is false if any _\bs_\bi_\bg_\bs_\bp_\be_\bc is invalid;
+              otherwise t\btr\bra\bap\bp returns true.
+
+       t\bty\byp\bpe\be [-\b-a\baf\bft\btp\bpP\bP] _\bn_\ba_\bm_\be [_\bn_\ba_\bm_\be ...]
+              With no options, indicate how each _\bn_\ba_\bm_\be would be interpreted  if
+              used as a command name.  If the -\b-t\bt option is used, t\bty\byp\bpe\be prints a
+              string which is one of _\ba_\bl_\bi_\ba_\bs,  _\bk_\be_\by_\bw_\bo_\br_\bd,  _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn,  _\bb_\bu_\bi_\bl_\bt_\bi_\bn,  or
+              _\bf_\bi_\bl_\be  if  _\bn_\ba_\bm_\be  is  an  alias,  shell  reserved  word, function,
+              builtin, or disk file, respectively.  If the _\bn_\ba_\bm_\be is not  found,
+              then  nothing  is  printed,  and  an  exit  status  of  false is
+              returned.  If the -\b-p\bp option is used,  t\bty\byp\bpe\be  either  returns  the
+              name of the disk file that would be executed if _\bn_\ba_\bm_\be were speci-
+              fied as a command name, or nothing if ``type -t name'' would not
+              return  _\bf_\bi_\bl_\be.  The -\b-P\bP option forces a P\bPA\bAT\bTH\bH search for each _\bn_\ba_\bm_\be,
+              even if ``type -t name'' would not return _\bf_\bi_\bl_\be.  If a command is
+              hashed,  -\b-p\bp  and  -\b-P\bP print the hashed value, not necessarily the
+              file that appears first in P\bPA\bAT\bTH\bH.  If the -\b-a\ba option is used, t\bty\byp\bpe\be
+              prints  all of the places that contain an executable named _\bn_\ba_\bm_\be.
+              This includes aliases and functions,  if  and  only  if  the  -\b-p\bp
+              option  is  not  also used.  The table of hashed commands is not
+              consulted when using -\b-a\ba.  The -\b-f\bf option suppresses  shell  func-
+              tion  lookup, as with the c\bco\bom\bmm\bma\ban\bnd\bd builtin.  t\bty\byp\bpe\be returns true if
+              any of the arguments are found, false if none are found.
+
+       u\bul\bli\bim\bmi\bit\bt [-\b-S\bSH\bHa\bac\bcd\bdf\bfl\blm\bmn\bnp\bps\bst\btu\buv\bv [_\bl_\bi_\bm_\bi_\bt]]
+              Provides control over the resources available to the  shell  and
+              to  processes started by it, on systems that allow such control.
+              The -\b-H\bH and -\b-S\bS options specify that the hard or soft limit is set
+              for  the  given resource.  A hard limit cannot be increased once
+              it is set; a soft limit may be increased up to the value of  the
+              hard  limit.   If  neither -\b-H\bH nor -\b-S\bS is specified, both the soft
+              and hard limits are set.  The value of _\bl_\bi_\bm_\bi_\bt can be a number  in
+              the unit specified for the resource or one of the special values
+              h\bha\bar\brd\bd, s\bso\bof\bft\bt, or u\bun\bnl\bli\bim\bmi\bit\bte\bed\bd,  which  stand  for  the  current  hard
+              limit,  the  current soft limit, and no limit, respectively.  If
+              _\bl_\bi_\bm_\bi_\bt is omitted, the current value of the  soft  limit  of  the
+              resource  is  printed, unless the -\b-H\bH option is given.  When more
+              than one resource is specified, the  limit  name  and  unit  are
+              printed before the value.  Other options are interpreted as fol-
+              lows:
+              -\b-a\ba     All current limits are reported
+              -\b-c\bc     The maximum size of core files created
+              -\b-d\bd     The maximum size of a process's data segment
+              -\b-f\bf     The maximum size of files created by the shell
+              -\b-l\bl     The maximum size that may be locked into memory
+              -\b-m\bm     The maximum resident set size
+              -\b-n\bn     The maximum number of open file descriptors (most systems
+                     do not allow this value to be set)
+              -\b-p\bp     The pipe size in 512-byte blocks (this may not be set)
+              -\b-s\bs     The maximum stack size
+              -\b-t\bt     The maximum amount of cpu time in seconds
+              -\b-u\bu     The  maximum  number  of  processes available to a single
+                     user
+              -\b-v\bv     The maximum amount of virtual  memory  available  to  the
+                     shell
+
+              If _\bl_\bi_\bm_\bi_\bt is given, it is the new value of the specified resource
+              (the -\b-a\ba option is display only).  If no option is given, then -\b-f\bf
+              is  assumed.  Values are in 1024-byte increments, except for -\b-t\bt,
+              which is in seconds, -\b-p\bp, which is in units of  512-byte  blocks,
+              and  -\b-n\bn and -\b-u\bu, which are unscaled values.  The return status is
+              0 unless an invalid option or argument is supplied, or an  error
+              occurs while setting a new limit.
+
+       u\bum\bma\bas\bsk\bk [-\b-p\bp] [-\b-S\bS] [_\bm_\bo_\bd_\be]
+              The user file-creation mask is set to _\bm_\bo_\bd_\be.  If _\bm_\bo_\bd_\be begins with
+              a digit, it is interpreted as an octal number; otherwise  it  is
+              interpreted  as a symbolic mode mask similar to that accepted by
+              _\bc_\bh_\bm_\bo_\bd(1).  If _\bm_\bo_\bd_\be is omitted, the current value of the mask  is
+              printed.   The  -\b-S\bS  option causes the mask to be printed in sym-
+              bolic form; the default output is an octal number.   If  the  -\b-p\bp
+              option is supplied, and _\bm_\bo_\bd_\be is omitted, the output is in a form
+              that may be reused as input.  The return status is 0 if the mode
+              was  successfully  changed  or if no _\bm_\bo_\bd_\be argument was supplied,
+              and false otherwise.
+
+       u\bun\bna\bal\bli\bia\bas\bs [-a\ba] [_\bn_\ba_\bm_\be ...]
+              Remove each _\bn_\ba_\bm_\be from the list of defined  aliases.   If  -\b-a\ba  is
+              supplied,  all  alias definitions are removed.  The return value
+              is true unless a supplied _\bn_\ba_\bm_\be is not a defined alias.
+
+       u\bun\bns\bse\bet\bt [-f\bfv\bv] [_\bn_\ba_\bm_\be ...]
+              For each _\bn_\ba_\bm_\be, remove the corresponding  variable  or  function.
+              If no options are supplied, or the -\b-v\bv option is given, each _\bn_\ba_\bm_\be
+              refers to a shell variable.   Read-only  variables  may  not  be
+              unset.  If -\b-f\bf is specifed, each _\bn_\ba_\bm_\be refers to a shell function,
+              and the function definition is removed.  Each unset variable  or
+              function  is  removed  from the environment passed to subsequent
+              commands.  If any of R\bRA\bAN\bND\bDO\bOM\bM, S\bSE\bEC\bCO\bON\bND\bDS\bS, L\bLI\bIN\bNE\bEN\bNO\bO, H\bHI\bIS\bST\bTC\bCM\bMD\bD, F\bFU\bUN\bNC\bCN\bNA\bAM\bME\bE,
+              G\bGR\bRO\bOU\bUP\bPS\bS,  or  D\bDI\bIR\bRS\bST\bTA\bAC\bCK\bK are unset, they lose their special proper-
+              ties, even if they are subsequently reset.  The exit  status  is
+              true unless a _\bn_\ba_\bm_\be is readonly.
+
+       w\bwa\bai\bit\bt [_\bn]
+              Wait  for  the specified process and return its termination sta-
+              tus.  _\bn may be a process ID or a job  specification;  if  a  job
+              spec  is  given, all processes in that job's pipeline are waited
+              for.  If _\bn is not given, all currently  active  child  processes
+              are waited for, and the return status is zero.  If _\bn specifies a
+              non-existent process or job, the return status is  127.   Other-
+              wise,  the  return status is the exit status of the last process
+              or job waited for.
+
+R\bRE\bES\bST\bTR\bRI\bIC\bCT\bTE\bED\bD S\bSH\bHE\bEL\bLL\bL
+       If b\bba\bas\bsh\bh is started with the name r\brb\bba\bas\bsh\bh, or the -\b-r\br option is supplied at
+       invocation,  the  shell becomes restricted.  A restricted shell is used
+       to set up an environment more controlled than the standard  shell.   It
+       behaves  identically  to b\bba\bas\bsh\bh with the exception that the following are
+       disallowed or not performed:
+
+       +\bo      changing directories with c\bcd\bd
+
+       +\bo      setting or unsetting the values of S\bSH\bHE\bEL\bLL\bL, P\bPA\bAT\bTH\bH, E\bEN\bNV\bV, or B\bBA\bAS\bSH\bH_\b_E\bEN\bNV\bV
+
+       +\bo      specifying command names containing /\b/
+
+       +\bo      specifying  a  file  name containing a /\b/ as an argument to the .\b.
+              builtin command
+
+       +\bo      Specifying a filename containing a slash as an argument  to  the
+              -\b-p\bp option to the h\bha\bas\bsh\bh builtin command
+
+       +\bo      importing  function  definitions  from  the shell environment at
+              startup
+
+       +\bo      parsing the value of S\bSH\bHE\bEL\bLL\bLO\bOP\bPT\bTS\bS from  the  shell  environment  at
+              startup
+
+       +\bo      redirecting  output using the >, >|, <>, >&, &>, and >> redirec-
+              tion operators
+
+       +\bo      using the e\bex\bxe\bec\bc builtin command to replace the shell with another
+              command
+
+       +\bo      adding  or  deleting builtin commands with the -\b-f\bf and -\b-d\bd options
+              to the e\ben\bna\bab\bbl\ble\be builtin command
+
+       +\bo      Using the  e\ben\bna\bab\bbl\ble\be  builtin  command  to  enable  disabled  shell
+              builtins
+
+       +\bo      specifying the -\b-p\bp option to the c\bco\bom\bmm\bma\ban\bnd\bd builtin command
+
+       +\bo      turning off restricted mode with s\bse\bet\bt +\b+r\br or s\bse\bet\bt +\b+o\bo r\bre\bes\bst\btr\bri\bic\bct\bte\bed\bd.
+
+       These restrictions are enforced after any startup files are read.
+
+       When a command that is found to be a shell script is executed (see C\bCO\bOM\bM-\b-
+       M\bMA\bAN\bND\bD E\bEX\bXE\bEC\bCU\bUT\bTI\bIO\bON\bN above), r\brb\bba\bas\bsh\bh turns off any restrictions  in  the  shell
+       spawned to execute the script.
+
+S\bSE\bEE\bE A\bAL\bLS\bSO\bO
+       _\bB_\ba_\bs_\bh _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bM_\ba_\bn_\bu_\ba_\bl, Brian Fox and Chet Ramey
+       _\bT_\bh_\be _\bG_\bn_\bu _\bR_\be_\ba_\bd_\bl_\bi_\bn_\be _\bL_\bi_\bb_\br_\ba_\br_\by, Brian Fox and Chet Ramey
+       _\bT_\bh_\be _\bG_\bn_\bu _\bH_\bi_\bs_\bt_\bo_\br_\by _\bL_\bi_\bb_\br_\ba_\br_\by, Brian Fox and Chet Ramey
+       _\bP_\bo_\br_\bt_\ba_\bb_\bl_\be  _\bO_\bp_\be_\br_\ba_\bt_\bi_\bn_\bg  _\bS_\by_\bs_\bt_\be_\bm  _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be _\b(_\bP_\bO_\bS_\bI_\bX_\b) _\bP_\ba_\br_\bt _\b2_\b: _\bS_\bh_\be_\bl_\bl _\ba_\bn_\bd _\bU_\bt_\bi_\bl_\bi_\b-
+       _\bt_\bi_\be_\bs, IEEE
+       _\bs_\bh(1), _\bk_\bs_\bh(1), _\bc_\bs_\bh(1)
+       _\be_\bm_\ba_\bc_\bs(1), _\bv_\bi(1)
+       _\br_\be_\ba_\bd_\bl_\bi_\bn_\be(3)
+
+F\bFI\bIL\bLE\bES\bS
+       _\b/_\bb_\bi_\bn_\b/_\bb_\ba_\bs_\bh
+              The b\bba\bas\bsh\bh executable
+       _\b/_\be_\bt_\bc_\b/_\bp_\br_\bo_\bf_\bi_\bl_\be
+              The systemwide initialization file, executed for login shells
+       _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bp_\br_\bo_\bf_\bi_\bl_\be
+              The personal initialization file, executed for login shells
+       _\b~_\b/_\b._\bb_\ba_\bs_\bh_\br_\bc
+              The individual per-interactive-shell startup file
+       _\b~_\b/_\b._\bb_\ba_\bs_\bh_\b__\bl_\bo_\bg_\bo_\bu_\bt
+              The  individual  login shell cleanup file, executed when a login
+              shell exits
+       _\b~_\b/_\b._\bi_\bn_\bp_\bu_\bt_\br_\bc
+              Individual _\br_\be_\ba_\bd_\bl_\bi_\bn_\be initialization file
+
+A\bAU\bUT\bTH\bHO\bOR\bRS\bS
+       Brian Fox, Free Software Foundation
+       bfox@gnu.org
+
+       Chet Ramey, Case Western Reserve University
+       chet@po.CWRU.Edu
+
+B\bBU\bUG\bG R\bRE\bEP\bPO\bOR\bRT\bTS\bS
+       If you find a bug in b\bba\bas\bsh\bh,\b, you should report it.  But first, you should
+       make  sure  that  it really is a bug, and that it appears in the latest
+       version  of  b\bba\bas\bsh\bh.   The  latest  version  is  always  available   from
+       _\bf_\bt_\bp_\b:_\b/_\b/_\bf_\bt_\bp_\b._\bg_\bn_\bu_\b._\bo_\br_\bg_\b/_\bp_\bu_\bb_\b/_\bb_\ba_\bs_\bh_\b/.
+
+       Once  you  have  determined that a bug actually exists, use the _\bb_\ba_\bs_\bh_\bb_\bu_\bg
+       command to submit a bug report.  If you have a fix, you are  encouraged
+       to  mail that as well!  Suggestions and `philosophical' bug reports may
+       be mailed  to  _\bb_\bu_\bg_\b-_\bb_\ba_\bs_\bh_\b@_\bg_\bn_\bu_\b._\bo_\br_\bg  or  posted  to  the  Usenet  newsgroup
+       g\bgn\bnu\bu.\b.b\bba\bas\bsh\bh.\b.b\bbu\bug\bg.
+
+       ALL bug reports should include:
+
+       The version number of b\bba\bas\bsh\bh
+       The hardware and operating system
+       The compiler used to compile
+       A description of the bug behaviour
+       A short script or `recipe' which exercises the bug
+
+       _\bb_\ba_\bs_\bh_\bb_\bu_\bg  inserts  the first three items automatically into the template
+       it provides for filing a bug report.
+
+       Comments and bug reports concerning this manual page should be directed
+       to _\bc_\bh_\be_\bt_\b@_\bp_\bo_\b._\bC_\bW_\bR_\bU_\b._\bE_\bd_\bu.
+
+B\bBU\bUG\bGS\bS
+       It's too big and too slow.
+
+       There are some subtle differences between b\bba\bas\bsh\bh and traditional versions
+       of s\bsh\bh, mostly because of the P\bPO\bOS\bSI\bIX\bX specification.
+
+       Aliases are confusing in some uses.
+
+       Shell builtin commands and functions are not stoppable/restartable.
+
+       Compound commands and command sequences of the form `a ; b ; c' are not
+       handled  gracefully  when process suspension is attempted.  When a pro-
+       cess is stopped, the shell immediately executes the next command in the
+       sequence.  It suffices to place the sequence of commands between paren-
+       theses to force it into a subshell, which may be stopped as a unit.
+
+       Commands inside of $\b$(\b(...)\b) command substitution  are  not  parsed  until
+       substitution  is attempted.  This will delay error reporting until some
+       time after the command is entered.
+
+       Array variables may not (yet) be exported.
+
+
+
+GNU Bash-3.0                      2003 Nov 13                          BASH(1)
index f98fd78..18b44f9 100644 (file)
@@ -6,12 +6,12 @@
 .\"    Case Western Reserve University
 .\"    chet@po.CWRU.Edu
 .\"
-.\"    Last Change: Fri Sep 12 18:20:41 EDT 2003
+.\"    Last Change: Thu Nov 13 09:47:27 EST 2003
 .\"
 .\" bash_builtins, strip all but Built-Ins section
 .if \n(zZ=1 .ig zZ
 .if \n(zY=1 .ig zY
-.TH BASH 1 "2003 Sep 12" "GNU Bash-3.0"
+.TH BASH 1 "2003 Nov 13" "GNU Bash-3.0"
 .\"
 .\" There's some problem with having a `@'
 .\" in a tagged paragraph with the BSD man macros.
@@ -51,8 +51,8 @@ bash \- GNU Bourne-Again SHell
 [options]
 [file]
 .SH COPYRIGHT
-.if n Bash is Copyright (C) 1989-2002 by the Free Software Foundation, Inc.
-.if t Bash is Copyright \(co 1989-2002 by the Free Software Foundation, Inc.
+.if n Bash is Copyright (C) 1989-2003 by the Free Software Foundation, Inc.
+.if t Bash is Copyright \(co 1989-2003 by the Free Software Foundation, Inc.
 .SH DESCRIPTION
 .B Bash
 is an \fBsh\fR-compatible command language interpreter that
@@ -1069,6 +1069,7 @@ of \fB"$@"\fP as explained below under
 .BR "Special Parameters" .
 Pathname expansion is not performed.
 Assignment statements may also appear as arguments to the
+.BR alias ,
 .BR declare ,
 .BR typeset ,
 .BR export ,
@@ -1821,8 +1822,8 @@ The default path is system-dependent,
 and is set by the administrator who installs
 .BR bash .
 A common value is
-.if t \f(CW/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.\fP.
-.if n ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.''.
+.if t \f(CW/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin\fP.
+.if n ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin''.
 .TP
 .B POSIXLY_CORRECT
 If this variable is in the environment when \fBbash\fP starts, the shell
@@ -3856,7 +3857,7 @@ and
 .SM
 .BR SIGTSTP .
 .PP
-Synchronous jobs started by \fBbash\fP have signal handlers
+Non-builtin commands run by \fBbash\fP have signal handlers
 set to the values inherited by the shell from its parent.
 When job control is not in effect, asynchronous commands
 ignore
@@ -3865,7 +3866,7 @@ ignore
 and
 .SM
 .B SIGQUIT
-as well.
+in addition to these inherited handlers.
 Commands run as a result of command substitution ignore the
 keyboard-generated job control signals
 .SM
@@ -3913,9 +3914,9 @@ sends a
 .B SIGHUP
 to all jobs when an interactive login shell exits.
 .PP
-When \fBbash\fP receives a signal for which a trap has been set while
-waiting for a command to complete, the trap will not be executed until
-the command completes.
+If \Bbash\fP is waiting for a command to complete and receives a signal
+for which a trap has been set, the trap will not be executed until
+the command completes. 
 When \fBbash\fP is waiting for an asynchronous command via the \fBwait\fP
 builtin, the reception of a signal for which a trap has been set will
 cause the \fBwait\fP builtin to return immediately with an exit status
@@ -6650,8 +6651,8 @@ option is supplied, a list
 of all names that are exported in this shell is printed.
 The
 .B \-n
-option causes the export property to be removed from the
-named variables.
+option causes the export property to be removed from each
+\fIname\fP.
 If a variable name is followed by =\fIword\fP, the value of
 the variable is set to \fIword\fP.
 .B export
@@ -7202,7 +7203,10 @@ format specifications, each of which causes printing of the next successive
 \fIargument\fP.
 In addition to the standard \fIprintf\fP(1) formats, \fB%b\fP causes
 \fBprintf\fP to expand backslash escape sequences in the corresponding
-\fIargument\fP, and \fB%q\fP causes \fBprintf\fP to output the corresponding
+\fIargument\fP (except that \fB\ec\fP terminates output, backslashes in
+\fB\e'\fP, \fB\e"\fP, and \fB\e?\fP are not removed, and octal escapes
+beginning with \fB\e0\fP may contain up to four digits),
+and \fB%q\fP causes \fBprintf\fP to output the corresponding
 \fIargument\fP in a format that can be reused as shell input.
 .sp 1
 The \fIformat\fP is reused as necessary to consume all of the \fIarguments\fP.
@@ -7433,8 +7437,8 @@ Options, if specified, have the following meanings:
 .PD 0
 .TP 8
 .B \-a
-Automatically mark variables and functions which are modified or created
-for export to the environment of subsequent commands.
+Automatically mark variables and functions which are modified or
+created for export to the environment of subsequent commands.
 .TP 8
 .B \-b
 Report the status of terminated background jobs
@@ -8224,7 +8228,8 @@ is
 .BR ERR ,
 the command
 .I arg
-is executed whenever a simple command has a non\-zero exit status.
+is executed whenever a simple command has a non\-zero exit status,
+subject to the following conditions.
 The
 .SM
 .B ERR
@@ -8243,6 +8248,7 @@ or
 list, or if the command's return value is
 being inverted via
 .BR ! .
+These are the same conditions obeyed by the \fBerrexit\fP option.
 If a
 .I sigspec
 is
diff --git a/doc/bash.1.orig b/doc/bash.1.orig
new file mode 100644 (file)
index 0000000..828ec96
--- /dev/null
@@ -0,0 +1,8583 @@
+.\"
+.\" MAN PAGE COMMENTS to
+.\"
+.\"    Chet Ramey
+.\"    Information Network Services
+.\"    Case Western Reserve University
+.\"    chet@po.CWRU.Edu
+.\"
+.\"    Last Change: Mon Apr 14 17:57:24 EDT 2003
+.\"
+.\" bash_builtins, strip all but Built-Ins section
+.if \n(zZ=1 .ig zZ
+.if \n(zY=1 .ig zY
+.TH BASH 1 "2003 April 14" "GNU Bash-3.0"
+.\"
+.\" There's some problem with having a `@'
+.\" in a tagged paragraph with the BSD man macros.
+.\" It has to do with `@' appearing in the }1 macro.
+.\" This is a problem on 4.3 BSD and Ultrix, but Sun
+.\" appears to have fixed it.
+.\" If you're seeing the characters
+.\" `@u-3p' appearing before the lines reading
+.\" `possible-hostname-completions
+.\" and `complete-hostname' down in READLINE,
+.\" then uncomment this redefinition.
+.\"
+.de }1
+.ds ]X \&\\*(]B\\
+.nr )E 0
+.if !"\\$1"" .nr )I \\$1n
+.}f
+.ll \\n(LLu
+.in \\n()Ru+\\n(INu+\\n()Iu
+.ti \\n(INu
+.ie !\\n()Iu+\\n()Ru-\w\a\\*(]X\au-3p \{\\*(]X
+.br\}
+.el \\*(]X\h\a|\\n()Iu+\\n()Ru\a\c
+.}f
+..
+.\"
+.\" File Name macro.  This used to be `.PN', for Path Name,
+.\" but Sun doesn't seem to like that very much.
+.\"
+.de FN
+\fI\|\\$1\|\fP
+..
+.SH NAME
+bash \- GNU Bourne-Again SHell
+.SH SYNOPSIS
+.B bash
+[options]
+[file]
+.SH COPYRIGHT
+.if n Bash is Copyright (C) 1989-2002 by the Free Software Foundation, Inc.
+.if t Bash is Copyright \(co 1989-2002 by the Free Software Foundation, Inc.
+.SH DESCRIPTION
+.B Bash
+is an \fBsh\fR-compatible command language interpreter that
+executes commands read from the standard input or from a file.
+.B Bash
+also incorporates useful features from the \fIKorn\fP and \fIC\fP
+shells (\fBksh\fP and \fBcsh\fP).
+.PP
+.B Bash
+is intended to be a conformant implementation of the IEEE
+POSIX Shell and Tools specification (IEEE Working Group 1003\.2).
+.SH OPTIONS
+In addition to the single-character shell options documented in the
+description of the \fBset\fR builtin command, \fBbash\fR
+interprets the following options when it is invoked:
+.PP
+.PD 0
+.TP 10
+.BI \-c "\| string\^"
+If the
+.B \-c
+option is present, then commands are read from
+.IR string .
+If there are arguments after the
+.IR string ,
+they are assigned to the positional parameters, starting with
+.BR $0 .
+.TP
+.B \-i
+If the
+.B \-i
+option is present, the shell is
+.IR interactive .
+.TP
+.B \-l
+Make
+.B bash
+act as if it had been invoked as a login shell (see
+.SM
+.B INVOCATION
+below).
+.TP
+.B \-r
+If the
+.B \-r
+option is present, the shell becomes
+.I restricted
+(see
+.SM
+.B "RESTRICTED SHELL"
+below).
+.TP
+.B \-s
+If the
+.B \-s
+option is present, or if no arguments remain after option
+processing, then commands are read from the standard input.
+This option allows the positional parameters to be set
+when invoking an interactive shell.
+.TP
+.B \-D
+A list of all double-quoted strings preceded by \fB$\fP
+is printed on the standard ouput.
+These are the strings that
+are subject to language translation when the current locale
+is not \fBC\fP or \fBPOSIX\fP.
+This implies the \fB\-n\fP option; no commands will be executed.
+.TP
+.B [\-+]O [\fIshopt_option\fP]
+\fIshopt_option\fP is one of the shell options accepted by the
+\fBshopt\fP builtin (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+If \fIshopt_option\fP is present, \fB\-O\fP sets the value of that option;
+\fB+O\fP unsets it.
+If \fIshopt_option\fP is not supplied, the names and values of the shell
+options accepted by \fBshopt\fP are printed on the standard output.
+If the invocation option is \fB+O\fP, the output is displayed in a format
+that may be reused as input.
+.TP
+.B \-\-
+A
+.B \-\-
+signals the end of options and disables further option processing.
+Any arguments after the
+.B \-\-
+are treated as filenames and arguments.  An argument of
+.B \-
+is equivalent to \fB\-\-\fP.
+.PD
+.PP
+.B Bash
+also interprets a number of multi-character options.
+These options must appear on the command line before the
+single-character options to be recognized.
+.PP
+.PD 0
+.TP
+.B \-\-debugger
+Arrange for the debugger profile to be executed before the shell
+starts.  Turns on extended debugging mode (see the description of the
+.B extdebug
+option to the
+.B shopt
+builtin below) and shell function tracing (see the description of the
+\fB\-o functrace\fP option to the
+.B set
+builtin below).
+.TP
+.B \-\-dump\-po\-strings
+Equivalent to \fB\-D\fP, but the output is in the GNU \fIgettext\fP
+\fBpo\fP (portable object) file format.
+.TP
+.B \-\-dump\-strings
+Equivalent to \fB\-D\fP.
+.TP
+.B \-\-help
+Display a usage message on standard output and exit successfully.
+.TP
+\fB\-\-init\-file\fP \fIfile\fP
+.PD 0
+.TP
+\fB\-\-rcfile\fP \fIfile\fP
+.PD
+Execute commands from
+.I file
+instead of the standard personal initialization file
+.I ~/.bashrc
+if the shell is interactive (see
+.SM
+.B INVOCATION
+below).
+.TP
+.B \-\-login
+Equivalent to \fB\-l\fP.
+.TP
+.B \-\-noediting
+Do not use the GNU
+.B readline
+library to read command lines when the shell is interactive.
+.TP
+.B \-\-noprofile
+Do not read either the system-wide startup file
+.FN /etc/profile
+or any of the personal initialization files
+.IR ~/.bash_profile ,
+.IR ~/.bash_login ,
+or
+.IR ~/.profile .
+By default,
+.B bash
+reads these files when it is invoked as a login shell (see
+.SM
+.B INVOCATION
+below).
+.TP
+.B \-\-norc
+Do not read and execute the personal initialization file
+.I ~/.bashrc
+if the shell is interactive.
+This option is on by default if the shell is invoked as
+.BR sh .
+.TP
+.B \-\-posix
+Change the behavior of \fBbash\fP where the default operation differs
+from the POSIX 1003.2 standard to match the standard (\fIposix mode\fP).
+.TP
+.B \-\-restricted
+The shell becomes restricted (see
+.SM
+.B "RESTRICTED SHELL"
+below).
+.TP
+.B \-\-verbose
+Equivalent to  \fB\-v\fP.
+.TP
+.B \-\-version
+Show version information for this instance of
+.B bash
+on the standard output and exit successfully.
+.PD
+.SH ARGUMENTS
+If arguments remain after option processing, and neither the
+.B \-c
+nor the
+.B \-s
+option has been supplied, the first argument is assumed to
+be the name of a file containing shell commands.
+If
+.B bash
+is invoked in this fashion, 
+.B $0
+is set to the name of the file, and the positional parameters
+are set to the remaining arguments.
+.B Bash
+reads and executes commands from this file, then exits.
+\fBBash\fP's exit status is the exit status of the last command
+executed in the script.
+If no commands are executed, the exit status is 0.
+An attempt is first made to open the file in the current directory, and,
+if no file is found, then the shell searches the directories in
+.SM
+.B PATH
+for the script.
+.SH INVOCATION
+A \fIlogin shell\fP is one whose first character of argument zero is a
+.BR \- ,
+or one started with the 
+.B \-\-login
+option.
+.PP
+An \fIinteractive\fP shell is one started without non-option arguments
+and without the
+.B \-c
+option
+whose standard input and output are
+both connected to terminals (as determined by
+.IR isatty (3)),
+or one started with the
+.B \-i
+option.
+.SM
+.B PS1
+is set and
+.B $\-
+includes
+.B i
+if
+.B bash
+is interactive,
+allowing a shell script or a startup file to test this state.
+.PP
+The following paragraphs describe how
+.B bash
+executes its startup files.
+If any of the files exist but cannot be read,
+.B bash
+reports an error.
+Tildes are expanded in file names as described below under
+.B "Tilde Expansion"
+in the
+.SM
+.B EXPANSION
+section.
+.PP
+When
+.B bash
+is invoked as an interactive login shell, or as a non-interactive shell
+with the \fB\-\-login\fP option, it first reads and
+executes commands from the file \fI/etc/profile\fP, if that
+file exists.
+After reading that file, it looks for \fI~/.bash_profile\fP,
+\fI~/.bash_login\fP, and \fI~/.profile\fP, in that order, and reads
+and executes commands from the first one that exists and is readable.
+The
+.B \-\-noprofile
+option may be used when the shell is started to inhibit this behavior.
+.PP
+When a login shell exits,
+.B bash
+reads and executes commands from the file \fI~/.bash_logout\fP, if it
+exists.
+.PP
+When an interactive shell that is not a login shell is started,
+.B bash
+reads and executes commands from \fI~/.bashrc\fP, if that file exists.
+This may be inhibited by using the
+.B \-\-norc
+option.
+The \fB\-\-rcfile\fP \fIfile\fP option will force
+.B bash
+to read and execute commands from \fIfile\fP instead of \fI~/.bashrc\fP.
+.PP
+When
+.B bash
+is started non-interactively, to run a shell script, for example, it
+looks for the variable
+.SM
+.B BASH_ENV
+in the environment, expands its value if it appears there, and uses the
+expanded value as the name of a file to read and execute.
+.B Bash
+behaves as if the following command were executed:
+.sp .5
+.RS
+.if t \f(CWif [ \-n "$BASH_ENV" ]; then . "$BASH_ENV"; fi\fP
+.if n if [ \-n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
+.RE
+.sp .5
+but the value of the
+.SM
+.B PATH
+variable is not used to search for the file name.
+.PP
+If
+.B bash
+is invoked with the name
+.BR sh ,
+it tries to mimic the startup behavior of historical versions of
+.B sh
+as closely as possible,
+while conforming to the POSIX standard as well.
+When invoked as an interactive login shell, or a non-interactive
+shell with the \fB\-\-login\fP option, it first attempts to
+read and execute commands from
+.I /etc/profile
+and
+.IR ~/.profile ,
+in that order.
+The
+.B \-\-noprofile
+option may be used to inhibit this behavior.
+When invoked as an interactive shell with the name
+.BR sh ,
+.B bash
+looks for the variable
+.SM
+.BR ENV ,
+expands its value if it is defined, and uses the
+expanded value as the name of a file to read and execute.
+Since a shell invoked as
+.B sh
+does not attempt to read and execute commands from any other startup
+files, the
+.B \-\-rcfile
+option has no effect.
+A non-interactive shell invoked with the name
+.B sh
+does not attempt to read any other startup files. 
+When invoked as
+.BR sh ,
+.B bash
+enters
+.I posix
+mode after the startup files are read.
+.PP
+When
+.B bash
+is started in
+.I posix
+mode, as with the
+.B \-\-posix
+command line option, it follows the POSIX standard for startup files.
+In this mode, interactive shells expand the
+.SM
+.B ENV
+variable and commands are read and executed from the file
+whose name is the expanded value.
+No other startup files are read.
+.PP
+.B Bash
+attempts to determine when it is being run by the remote shell
+daemon, usually \fIrshd\fP.
+If
+.B bash
+determines it is being run by \fIrshd\fP, it reads and executes
+commands from \fI~/.bashrc\fP, if that file exists and is readable.
+It will not do this if invoked as \fBsh\fP.
+The
+.B \-\-norc
+option may be used to inhibit this behavior, and the
+.B \-\-rcfile
+option may be used to force another file to be read, but
+\fIrshd\fP does not generally invoke the shell with those options
+or allow them to be specified.
+.PP
+If the shell is started with the effective user (group) id not equal to the
+real user (group) id, and the \fB\-p\fP option is not supplied, no startup
+files are read, shell functions are not inherited from the environment, the
+.SM
+.B SHELLOPTS
+variable, if it appears in the environment, is ignored,
+and the effective user id is set to the real user id.
+If the \fB\-p\fP option is supplied at invocation, the startup behavior is
+the same, but the effective user id is not reset.
+.SH DEFINITIONS
+.PP
+The following definitions are used throughout the rest of this
+document.
+.PD 0
+.TP
+.B blank 
+A space or tab.
+.TP
+.B word
+A sequence of characters considered as a single unit by the shell.
+Also known as a
+.BR token .
+.TP
+.B name
+A 
+.I word
+consisting only of alphanumeric characters and underscores, and
+beginning with an alphabetic character or an underscore.  Also
+referred to as an
+.BR identifier .
+.TP
+.B metacharacter
+A character that, when unquoted, separates words.  One of the following:
+.br
+.RS
+.PP
+.if t \fB|  &  ;  (  )  <  >  space  tab\fP
+.if n \fB|  & ; ( ) < > space tab\fP
+.RE
+.PP
+.TP
+.B control operator
+A \fItoken\fP that performs a control function.  It is one of the following
+symbols:
+.RS
+.PP
+.if t \fB\(bv\(bv  &  &&  ;  ;;  (  )  |  <newline>\fP
+.if n \fB|| & && ; ;; ( ) | <newline>\fP
+.RE
+.PD
+.SH "RESERVED WORDS"
+\fIReserved words\fP are words that have a special meaning to the shell.
+The following words are recognized as reserved when unquoted and either
+the first word of a simple command (see
+.SM
+.B SHELL GRAMMAR
+below) or the third word of a 
+.B case 
+or
+.B for
+command:
+.if t .RS
+.PP
+.B
+.if n ! case  do done elif else esac fi for function if in select then until while { } time [[ ]]
+.if t !    case    do    done    elif    else    esac    fi    for    function    if    in    select    then    until    while    {    }    time    [[    ]]
+.if t .RE
+.RE
+.SH "SHELL GRAMMAR"
+.SS Simple Commands
+.PP
+A \fIsimple command\fP is a sequence of optional variable assignments
+followed by \fBblank\fP-separated words and redirections, and
+terminated by a \fIcontrol operator\fP.  The first word
+specifies the command to be executed, and is passed as argument zero.
+The remaining words are passed as arguments to the invoked command.
+.PP
+The return value of a \fIsimple command\fP is its exit status, or
+128+\fIn\^\fP if the command is terminated by signal
+.IR n .
+.SS Pipelines
+.PP
+A \fIpipeline\fP is a sequence of one or more commands separated by
+the character
+.BR | .
+The format for a pipeline is:
+.RS
+.PP
+[\fBtime\fP [\fB\-p\fP]] [ ! ] \fIcommand\fP [ \fB|\fP \fIcommand2\fP ... ]
+.RE
+.PP
+The standard output of
+.I command
+is connected via a pipe to the standard input of
+.IR command2 .
+This connection is performed before any redirections specified by the
+command (see
+.SM
+.B REDIRECTION
+below).
+.PP
+If the reserved word
+.B !
+precedes a pipeline, the exit status of that
+pipeline is the logical NOT of the exit status of the last command.
+Otherwise, the status of the pipeline is the exit status of the last
+command.
+The shell waits for all commands in the pipeline to
+terminate before returning a value.
+.PP
+If the
+.B time
+reserved word precedes a pipeline, the elapsed as well as user and
+system time consumed by its execution are reported when the pipeline
+terminates.
+The \fB\-p\fP option changes the output format to that specified by POSIX.
+The
+.SM
+.B TIMEFORMAT
+variable may be set to a format string that specifies how the timing
+information should be displayed; see the description of
+.SM
+.B TIMEFORMAT
+under
+.B "Shell Variables"
+below.
+.PP
+Each command in a pipeline is executed as a separate process (i.e., in a
+subshell).
+.SS Lists
+.PP
+A \fIlist\fP is a sequence of one or more pipelines separated by one
+of the operators
+.BR ; ,
+.BR & ,
+.BR && ,
+or
+.BR \(bv\(bv ,
+and optionally terminated by one of
+.BR ; ,
+.BR & ,
+or
+.BR <newline> .
+.PP
+Of these list operators,
+.B &&
+and
+.B \(bv\(bv
+have equal precedence, followed by
+.B ;
+and
+.BR &,
+which have equal precedence.
+.PP
+A sequence of one or more newlines may appear in a \fIlist\fP instead
+of a semicolon to delimit commands.
+.PP
+If a command is terminated by the control operator
+.BR & ,
+the shell executes the command in the \fIbackground\fP
+in a subshell.  The shell does not wait for the command to
+finish, and the return status is 0.  Commands separated by a
+.B ;
+are executed sequentially; the shell waits for each
+command to terminate in turn.  The return status is the
+exit status of the last command executed.
+.PP
+The control operators
+.B &&
+and
+.B \(bv\(bv
+denote AND lists and OR lists, respectively.
+An AND list has the form
+.RS
+.PP
+\fIcommand1\fP \fB&&\fP \fIcommand2\fP
+.RE
+.PP
+.I command2
+is executed if, and only if,
+.I command1
+returns an exit status of zero.
+.PP
+An OR list has the form
+.RS
+.PP
+\fIcommand1\fP \fB\(bv\(bv\fP \fIcommand2\fP
+.PP
+.RE
+.PP
+.I command2
+is executed if and only if
+.I command1
+returns a non-zero exit status.  The return status of
+AND and OR lists is the exit status of the last command
+executed in the list.
+.SS Compound Commands
+.PP
+A \fIcompound command\fP is one of the following:
+.TP
+(\fIlist\fP)
+\fIlist\fP is executed in a subshell.  Variable assignments and builtin
+commands that affect the shell's environment do not remain in effect
+after the command completes.  The return status is the exit status of
+\fIlist\fP.
+.TP
+{ \fIlist\fP; }
+\fIlist\fP is simply executed in the current shell environment.
+\fIlist\fP must be terminated with a newline or semicolon.
+This is known as a \fIgroup command\fP.
+The return status is the exit status of
+\fIlist\fP.
+Note that unlike the metacharacters \fB(\fP and \fB)\fP, \fB{\fP and
+\fB}\fP are \fIreserved words\fP and must occur where a reserved
+word is permitted to be recognized.  Since they do not cause a word
+break, they must be separated from \fIlist\fP by whitespace.
+.TP
+((\fIexpression\fP))
+The \fIexpression\fP is evaluated according to the rules described
+below under
+.SM
+.BR "ARITHMETIC EVALUATION" .
+If the value of the expression is non-zero, the return status is 0;
+otherwise the return status is 1.  This is exactly equivalent to
+\fBlet "\fIexpression\fP"\fR.
+.TP
+\fB[[\fP \fIexpression\fP \fB]]\fP
+Return a status of 0 or 1 depending on the evaluation of
+the conditional expression \fIexpression\fP.
+Expressions are composed of the primaries described below under
+.SM
+.BR "CONDITIONAL EXPRESSIONS" .
+Word splitting and pathname expansion are not performed on the words
+between the \fB[[\fP and \fB]]\fP; tilde expansion, parameter and
+variable expansion, arithmetic expansion, command substitution, process
+substitution, and quote removal are performed.
+Conditional operators such as \fB\-f\fP must be unquoted to be recognized
+as primaries.
+.if t .sp 0.5
+.if n .sp 1
+When the \fB==\fP and \fB!=\fP operators are used, the string to the
+right of the operator is considered a pattern and matched according
+to the rules described below under \fBPattern Matching\fP.
+The return value is 0 if the string matches or does not match
+the pattern, respectively, and 1 otherwise.
+Any part of the pattern may be quoted to force it to be matched as a
+string.
+.if t .sp 0.5
+.if n .sp 1
+Expressions may be combined using the following operators, listed
+in decreasing order of precedence:
+.if t .sp 0.5
+.if n .sp 1
+.RS
+.PD 0
+.TP
+.B ( \fIexpression\fP )
+Returns the value of \fIexpression\fP.
+This may be used to override the normal precedence of operators.
+.TP
+.B ! \fIexpression\fP
+True if
+.I expression
+is false.
+.TP
+\fIexpression1\fP \fB&&\fP \fIexpression2\fP
+True if both
+.I expression1
+and
+.I expression2
+are true.
+.TP
+.if t \fIexpression1\fP \fB\(bv\(bv\fP \fIexpression2\fP
+.if n \fIexpression1\fP \fB||\fP \fIexpression2\fP
+True if either
+.I expression1
+or
+.I expression2
+is true.
+.PD
+.LP
+The \fB&&\fP and
+.if t \fB\(bv\(bv\fP
+.if n \fB||\fP
+operators do not evaluate \fIexpression2\fP if the value of
+\fIexpression1\fP is sufficient to determine the return value of
+the entire conditional expression.
+.RE
+.TP
+\fBfor\fP \fIname\fP [ \fBin\fP \fIword\fP ] ; \fBdo\fP \fIlist\fP ; \fBdone\fP
+The list of words following \fBin\fP is expanded, generating a list
+of items.
+The variable \fIname\fP is set to each element of this list
+in turn, and \fIlist\fP is executed each time.
+If the \fBin\fP \fIword\fP is omitted, the \fBfor\fP command executes
+\fIlist\fP once for each positional parameter that is set (see
+.SM
+.B PARAMETERS
+below).
+The return status is the exit status of the last command that executes.
+If the expansion of the items following \fBin\fP results in an empty
+list, no commands are executed, and the return status is 0.
+.TP
+\fBfor\fP (( \fIexpr1\fP ; \fIexpr2\fP ; \fIexpr3\fP )) ; \fBdo\fP \fIlist\fP ; \fBdone\fP
+First, the arithmetic expression \fIexpr1\fP is evaluated according
+to the rules described below under
+.SM
+.BR "ARITHMETIC EVALUATION" .
+The arithmetic expression \fIexpr2\fP is then evaluated repeatedly
+until it evaluates to zero.
+Each time \fIexpr2\fP evaluates to a non-zero value, \fIlist\fP is
+executed and the arithmetic expression \fIexpr3\fP is evaluated.
+If any expression is omitted, it behaves as if it evaluates to 1.
+The return value is the exit status of the last command in \fIlist\fP
+that is executed, or false if any of the expressions is invalid.
+.TP
+\fBselect\fP \fIname\fP [ \fBin\fP \fIword\fP ] ; \fBdo\fP \fIlist\fP ; \fBdone\fP
+The list of words following \fBin\fP is expanded, generating a list
+of items.  The set of expanded words is printed on the standard
+error, each preceded by a number.  If the \fBin\fP
+\fIword\fP is omitted, the positional parameters are printed (see
+.SM
+.B PARAMETERS
+below).  The
+.B PS3
+prompt is then displayed and a line read from the standard input.
+If the line consists of a number corresponding to one of
+the displayed words, then the value of
+.I name
+is set to that word.  If the line is empty, the words and prompt
+are displayed again.  If EOF is read, the command completes.  Any
+other value read causes
+.I name
+to be set to null.  The line read is saved in the variable
+.BR REPLY .
+The
+.I list
+is executed after each selection until a
+.B break
+command is executed.
+The exit status of
+.B select
+is the exit status of the last command executed in
+.IR list ,
+or zero if no commands were executed.
+.TP
+\fBcase\fP \fIword\fP \fBin\fP [ [(] \fIpattern\fP [ \fB|\fP \fIpattern\fP ] \
+... ) \fIlist\fP ;; ] ... \fBesac\fP
+A \fBcase\fP command first expands \fIword\fP, and tries to match
+it against each \fIpattern\fP in turn, using the same matching rules
+as for pathname expansion (see
+.B Pathname Expansion
+below).  When a match is found, the
+corresponding \fIlist\fP is executed.  After the first match, no
+subsequent matches are attempted.  The exit status is zero if no
+pattern matches.  Otherwise, it is the exit status of the
+last command executed in \fIlist\fP.
+.TP
+\fBif\fP \fIlist\fP; \fBthen\fP \fIlist;\fP \
+[ \fBelif\fP \fIlist\fP; \fBthen\fP \fIlist\fP; ] ... \
+[ \fBelse\fP \fIlist\fP; ] \fBfi\fP
+The
+.B if 
+.I list
+is executed.  If its exit status is zero, the
+\fBthen\fP \fIlist\fP is executed.  Otherwise, each \fBelif\fP
+\fIlist\fP is executed in turn, and if its exit status is zero,
+the corresponding \fBthen\fP \fIlist\fP is executed and the
+command completes.  Otherwise, the \fBelse\fP \fIlist\fP is
+executed, if present.  The exit status is the exit status of the
+last command executed, or zero if no condition tested true.
+.TP
+\fBwhile\fP \fIlist\fP; \fBdo\fP \fIlist\fP; \fBdone\fP
+.PD 0
+.TP
+\fBuntil\fP \fIlist\fP; \fBdo\fP \fIlist\fP; \fBdone\fP
+.PD
+The \fBwhile\fP command continuously executes the \fBdo\fP
+\fIlist\fP as long as the last command in \fIlist\fP returns
+an exit status of zero.  The \fBuntil\fP command is identical
+to the \fBwhile\fP command, except that the test is negated;
+the
+.B do
+.I list
+is executed as long as the last command in
+.I list
+returns a non-zero exit status.
+The exit status of the \fBwhile\fP and \fBuntil\fP commands
+is the exit status
+of the last \fBdo\fP \fIlist\fP command executed, or zero if
+none was executed.
+.TP
+[ \fBfunction\fP ] \fIname\fP () { \fIlist\fP; }
+This defines a function named \fIname\fP.  The \fIbody\fP of the
+function is the
+.I list
+of commands between { and }.  This list
+is executed whenever \fIname\fP is specified as the
+name of a simple command.  The exit status of a function is
+the exit status of the last command executed in the body.  (See
+.SM
+.B FUNCTIONS
+below.)
+.SH COMMENTS
+In a non-interactive shell, or an interactive shell in which the
+.B interactive_comments
+option to the
+.B shopt
+builtin is enabled (see
+.SM
+.B "SHELL BUILTIN COMMANDS"
+below), a word beginning with
+.B #
+causes that word and all remaining characters on that line to
+be ignored.  An interactive shell without the
+.B interactive_comments
+option enabled does not allow comments.  The
+.B interactive_comments
+option is on by default in interactive shells.
+.SH QUOTING
+\fIQuoting\fP is used to remove the special meaning of certain
+characters or words to the shell.  Quoting can be used to 
+disable special treatment for special characters, to prevent
+reserved words from being recognized as such, and to prevent
+parameter expansion.
+.PP
+Each of the \fImetacharacters\fP listed above under
+.SM
+.B DEFINITIONS
+has special meaning to the shell and must be quoted if it is to
+represent itself.
+.PP
+When the command history expansion facilities are being used, the
+\fIhistory expansion\fP character, usually \fB!\fP, must be quoted
+to prevent history expansion.
+.PP
+There are three quoting mechanisms: the
+.IR "escape character" ,
+single quotes, and double quotes.
+.PP
+A non-quoted backslash (\fB\e\fP) is the
+.IR "escape character" .
+It preserves the literal value of the next character that follows,
+with the exception of <newline>.  If a \fB\e\fP<newline> pair
+appears, and the backslash is not itself quoted, the \fB\e\fP<newline>
+is treated as a line continuation (that is, it is removed from the
+input stream and effectively ignored).
+.PP
+Enclosing characters in single quotes preserves the literal value
+of each character within the quotes.  A single quote may not occur
+between single quotes, even when preceded by a backslash.
+.PP
+Enclosing characters in double quotes preserves the literal value
+of all characters within the quotes, with the exception of
+.BR $ ,
+.BR ` ,
+and
+.BR \e .
+The characters
+.B $
+and
+.B `
+retain their special meaning within double quotes.  The backslash
+retains its special meaning only when followed by one of the following
+characters:
+.BR $ ,
+.BR ` ,
+\^\fB"\fP\^,
+.BR \e ,
+or
+.BR <newline> .
+A double quote may be quoted within double quotes by preceding it with
+a backslash.
+When command history is being used, the double quote may not be used to
+quote the history expansion character.
+.PP
+The special parameters
+.B *
+and
+.B @
+have special meaning when in double
+quotes (see
+.SM
+.B PARAMETERS
+below).
+.PP
+Words of the form \fB$\fP'\fIstring\fP' are treated specially.  The
+word expands to \fIstring\fP, with backslash-escaped characters replaced
+as specifed by the ANSI C standard.  Backslash escape sequences, if
+present, are decoded as follows:
+.RS
+.PD 0
+.TP
+.B \ea
+alert (bell)
+.TP
+.B \eb
+backspace
+.TP
+.B \ee
+an escape character
+.TP   
+.B \ef
+form feed
+.TP  
+.B \en
+new line
+.TP     
+.B \er
+carriage return
+.TP
+.B \et
+horizontal tab
+.TP   
+.B \ev
+vertical tab
+.TP
+.B \e\e
+backslash
+.TP
+.B \e'
+single quote
+.TP   
+.B \e\fInnn\fP
+the eight-bit character whose value is the octal value \fInnn\fP
+(one to three digits)
+.TP
+.B \ex\fIHH\fP
+the eight-bit character whose value is the hexadecimal value \fIHH\fP
+(one or two hex digits)
+.TP
+.B \ec\fIx\fP
+a control-\fIx\fP character
+.PD
+.RE
+.LP
+The expanded result is single-quoted, as if the dollar sign had
+not been present.
+.PP
+A double-quoted string preceded by a dollar sign (\fB$\fP) will cause
+the string to be translated according to the current locale.
+If the current locale is \fBC\fP or \fBPOSIX\fP, the dollar sign
+is ignored.
+If the string is translated and replaced, the replacement is
+double-quoted.
+.SH PARAMETERS
+A
+.I parameter
+is an entity that stores values.
+It can be a
+.IR name ,
+a number, or one of the special characters listed below under
+.BR "Special Parameters" .
+A
+.I variable
+is a parameter denoted by a
+.IR name .
+A variable has a \fIvalue\fP and zero or more \fIattributes\fP.
+Attributes are assigned using the
+.B declare
+builtin command (see
+.B declare
+below in
+.SM
+.BR "SHELL BUILTIN COMMANDS" ).
+.PP
+A parameter is set if it has been assigned a value.  The null string is
+a valid value.  Once a variable is set, it may be unset only by using
+the
+.B unset
+builtin command (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+.PP
+A
+.I variable
+may be assigned to by a statement of the form
+.RS
+.PP
+\fIname\fP=[\fIvalue\fP]
+.RE
+.PP
+If
+.I value
+is not given, the variable is assigned the null string.  All
+.I values
+undergo tilde expansion, parameter and variable expansion,
+command substitution, arithmetic expansion, and quote
+removal (see
+.SM
+.B EXPANSION
+below).  If the variable has its
+.B integer
+attribute set, then
+.I value
+is evaluated as an arithmetic expression even if the $((...)) expansion is
+not used (see
+.B "Arithmetic Expansion"
+below).
+Word splitting is not performed, with the exception
+of \fB"$@"\fP as explained below under
+.BR "Special Parameters" .
+Pathname expansion is not performed.
+Assignment statements may also appear as arguments to the
+.BR declare ,
+.BR typeset ,
+.BR export ,
+.BR readonly ,
+and
+.B local
+builtin commands.
+.SS Positional Parameters
+.PP
+A
+.I positional parameter
+is a parameter denoted by one or more
+digits, other than the single digit 0.  Positional parameters are
+assigned from the shell's arguments when it is invoked,
+and may be reassigned using the
+.B set
+builtin command.  Positional parameters may not be assigned to
+with assignment statements.  The positional parameters are
+temporarily replaced when a shell function is executed (see
+.SM
+.B FUNCTIONS
+below).
+.PP
+When a positional parameter consisting of more than a single
+digit is expanded, it must be enclosed in braces (see
+.SM
+.B EXPANSION
+below).
+.SS Special Parameters
+.PP
+The shell treats several parameters specially.  These parameters may
+only be referenced; assignment to them is not allowed.
+.PD 0
+.TP
+.B *
+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 
+.SM
+.B IFS
+special variable.  That is, "\fB$*\fP" is equivalent
+to "\fB$1\fP\fIc\fP\fB$2\fP\fIc\fP\fB...\fP", where
+.I c
+is the first character of the value of the
+.SM
+.B IFS
+variable.  If
+.SM
+.B IFS
+is unset, the parameters are separated by spaces.
+If
+.SM
+.B IFS
+is null, the parameters are joined without intervening separators.
+.TP
+.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, "\fB$@\fP" is equivalent to
+"\fB$1\fP" "\fB$2\fP" ...
+When there are no positional parameters, "\fB$@\fP" and 
+.B $@
+expand to nothing (i.e., they are removed).
+.TP
+.B #
+Expands to the number of positional parameters in decimal.
+.TP
+.B ?
+Expands to the status of the most recently executed foreground
+pipeline.
+.TP
+.B \-
+Expands to the current option flags as specified upon invocation, 
+by the
+.B set
+builtin command, or those set by the shell itself
+(such as the
+.B \-i
+option).
+.TP
+.B $
+Expands to the process ID of the shell.  In a () subshell, it
+expands to the process ID of the current shell, not the
+subshell.
+.TP
+.B !
+Expands to the process ID of the most recently executed background
+(asynchronous) command.
+.TP
+.B 0
+Expands to the name of the shell or shell script.  This is set at
+shell initialization.  If
+.B bash
+is invoked with a file of commands,
+.B $0
+is set to the name of that file.  If
+.B bash
+is started with the
+.B \-c
+option, then
+.B $0
+is set to the first argument after the string to be
+executed, if one is present.  Otherwise, it is set
+to the file name used to invoke
+.BR bash ,
+as given by argument zero.
+.TP
+.B _
+At shell startup, set to the absolute file name of the shell or shell
+script being executed as passed in the argument list.
+Subsequently, expands to the last argument to the previous command,
+after expansion.
+Also set to the full file name of each command executed and placed in
+the environment exported to that command.
+When checking mail, this parameter holds the name of the mail file
+currently being checked.
+.PD
+.SS Shell Variables
+.PP
+The following variables are set by the shell:
+.PP
+.PD 0
+.TP
+.B BASH
+Expands to the full file name used to invoke this instance of
+.BR bash .
+.TP
+.B BASH_ARGC
+An array variable whose values are the number of parameters in each
+frame of the current bash execution call stack.  The number of
+parameters to the current subroutine (shell function or script executed
+with \fB.\fP or \fBsource\fP) is at the top of the stack.  When a
+subroutine is executed, the number of parameters passed is pushed onto
+\fBBASH_ARGC\fP.
+.TP
+.B BASH_ARGV
+An array variable containing all of the parameters in the current bash
+execution call stack.  The final parameter of the last subroutine call
+is at the top of the stack; the first parameter of the initial call is
+at the bottom.  When a subroutine is executed, the parameters supplied
+are pushed onto \fBBASH_ARGV\fP.
+.TP
+.B BASH_COMMAND
+The command currently being executed or about to be executed, unless the
+shell is executing a command as the result of a trap,
+in which case it is the command executing at the time of the trap.
+.TP
+.B BASH_EXECUTION_STRING
+The command argument to the \fB\-c\fP invocation option.
+.TP
+.B BASH_LINENO
+An array variable whose members are the line numbers in source files
+corresponding to each member of @var{FUNCNAME}.
+\fB${BASH_LINENO[\fP\fI$i\fP\fB]}\fP is the line number in the source
+file where \fB${FUNCNAME[\fP\fI$i + 1\fP\fB]}\fP was called.
+The corresponding source file name is \fB${BASH_SOURCE[\fP\fI$i + 1\fP\fB]}\fB.
+Use \fBLINENO\fP to obtain the current line number.
+.TP
+.B BASH_SOURCE
+An array variable whose members are the source filenames corresponding
+to the elements in the \fBFUNCNAME\fP array variable.
+.TP
+.B BASH_SUBSHELL
+Incremented by one each time a subshell or subshell environment is spawned.
+The initial value is 0.
+.TP
+.B BASH_VERSINFO
+A readonly array variable whose members hold version information for
+this instance of
+.BR bash .
+The values assigned to the array members are as follows:
+.sp .5
+.RS
+.PD 0
+.TP 24
+.B BASH_VERSINFO[\fR0\fP]
+The major version number (the \fIrelease\fP).
+.TP
+.B BASH_VERSINFO[\fR1\fP]
+The minor version number (the \fIversion\fP).
+.TP
+.B BASH_VERSINFO[\fR2\fP]
+The patch level.
+.TP
+.B BASH_VERSINFO[\fR3\fP]
+The build version.
+.TP
+.B BASH_VERSINFO[\fR4\fP]
+The release status (e.g., \fIbeta1\fP).
+.TP
+.B BASH_VERSINFO[\fR5\fP]
+The value of \fBMACHTYPE\fP.
+.PD
+.RE
+.TP
+.B BASH_VERSION
+Expands to a string describing the version of this instance of
+.BR bash .
+.TP
+.B COMP_CWORD
+An index into \fB${COMP_WORDS}\fP of the word containing the current
+cursor position.
+This variable is available only in shell functions invoked by the
+programmable completion facilities (see \fBProgrammable Completion\fP
+below).
+.TP
+.B COMP_LINE
+The current command line.
+This variable is available only in shell functions and external
+commands invoked by the
+programmable completion facilities (see \fBProgrammable Completion\fP
+below).
+.TP
+.B COMP_POINT
+The index of the current cursor position relative to the beginning of
+the current command.
+If the current cursor position is at the end of the current command,
+the value of this variable is equal to \fB${#COMP_LINE}\fP.
+This variable is available only in shell functions and external
+commands invoked by the
+programmable completion facilities (see \fBProgrammable Completion\fP
+below).
+.TP
+.B COMP_WORDBREAKS
+The set of characters that the Readline library treats as word
+separators when performing word completion.
+If
+.SM
+.B COMP_WORDBREAKS
+is unset, it loses its special properties, even if it is
+subsequently reset.
+.TP
+.B COMP_WORDS
+An array variable (see \fBArrays\fP below) consisting of the individual
+words in the current command line.
+This variable is available only in shell functions invoked by the
+programmable completion facilities (see \fBProgrammable Completion\fP
+below).
+.TP
+.B DIRSTACK
+An array variable (see
+.B Arrays
+below) containing the current contents of the directory stack.
+Directories appear in the stack in the order they are displayed by the
+.B dirs
+builtin.
+Assigning to members of this array variable may be used to modify
+directories already in the stack, but the
+.B pushd
+and
+.B popd
+builtins must be used to add and remove directories.
+Assignment to this variable will not change the current directory.
+If
+.SM
+.B DIRSTACK
+is unset, it loses its special properties, even if it is
+subsequently reset.
+.TP
+.B EUID
+Expands to the effective user ID of the current user, initialized at
+shell startup.  This variable is readonly.
+.TP
+.B FUNCNAME
+An array variable containing the names of all shell functions
+currently in the execution call stack.
+The element with index 0 is the name of any currently-executing
+shell function.
+The bottom-most element is "main".
+This variable exists only when a shell function is executing.
+Assignments to
+.SM
+.B FUNCNAME
+have no effect and return an error status.
+If
+.SM
+.B FUNCNAME
+is unset, it loses its special properties, even if it is
+subsequently reset.
+.TP
+.B GROUPS
+An array variable containing the list of groups of which the current
+user is a member.
+Assignments to    
+.SM
+.B GROUPS
+have no effect and return an error status.
+If
+.SM
+.B GROUPS
+is unset, it loses its special properties, even if it is
+subsequently reset.
+.TP
+.B HISTCMD
+The history number, or index in the history list, of the current
+command.
+If
+.SM
+.B HISTCMD
+is unset, it loses its special properties, even if it is
+subsequently reset.
+.TP
+.B HOSTNAME
+Automatically set to the name of the current host.
+.TP
+.B HOSTTYPE
+Automatically set to a string that uniquely
+describes the type of machine on which
+.B bash
+is executing.
+The default is system-dependent.
+.TP
+.B LINENO
+Each time this parameter is referenced, the shell substitutes
+a decimal number representing the current sequential line number
+(starting with 1) within a script or function.  When not in a
+script or function, the value substituted is not guaranteed to
+be meaningful.
+If
+.SM
+.B LINENO
+is unset, it loses its special properties, even if it is
+subsequently reset.
+.TP
+.B MACHTYPE
+Automatically set to a string that fully describes the system
+type on which
+.B bash
+is executing, in the standard GNU \fIcpu-company-system\fP format.
+The default is system-dependent.
+.TP
+.B OLDPWD
+The previous working directory as set by the
+.B cd
+command.
+.TP
+.B OPTARG
+The value of the last option argument processed by the
+.B getopts
+builtin command (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+.TP
+.B OPTIND
+The index of the next argument to be processed by the
+.B getopts
+builtin command (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+.TP
+.B OSTYPE
+Automatically set to a string that
+describes the operating system on which
+.B bash
+is executing.
+The default is system-dependent.
+.TP
+.B PIPESTATUS
+An array variable (see
+.B Arrays
+below) containing a list of exit status values from the processes
+in the most-recently-executed foreground pipeline (which may
+contain only a single command).
+.TP
+.B PPID
+The process ID of the shell's parent.  This variable is readonly.
+.TP
+.B PWD
+The current working directory as set by the
+.B cd
+command.
+.TP
+.B RANDOM
+Each time this parameter is referenced, a random integer between
+0 and 32767 is
+generated.  The sequence of random numbers may be initialized by assigning
+a value to
+.SM
+.BR RANDOM .
+If
+.SM
+.B RANDOM
+is unset, it loses its special properties, even if it is
+subsequently reset.
+.TP
+.B REPLY
+Set to the line of input read by the
+.B read
+builtin command when no arguments are supplied.
+.TP
+.B SECONDS
+Each time this parameter is
+referenced, the number of seconds since shell invocation is returned.  If a
+value is assigned to 
+.SM
+.BR SECONDS ,
+the value returned upon subsequent
+references is
+the number of seconds since the assignment plus the value assigned.
+If
+.SM
+.B SECONDS
+is unset, it loses its special properties, even if it is
+subsequently reset.
+.TP
+.B SHELLOPTS
+A colon-separated list of enabled shell options.  Each word in
+the list is a valid argument for the
+.B \-o
+option to the
+.B set
+builtin command (see
+.SM
+.B "SHELL BUILTIN COMMANDS"
+below).  The options appearing in
+.SM
+.B SHELLOPTS
+are those reported as
+.I on
+by \fBset \-o\fP.
+If this variable is in the environment when
+.B bash
+starts up, each shell option in the list will be enabled before
+reading any startup files.
+This variable is read-only.
+.TP
+.B SHLVL
+Incremented by one each time an instance of
+.B bash
+is started.
+.TP
+.B UID
+Expands to the user ID of the current user, initialized at shell startup.
+This variable is readonly.
+.PD
+.PP
+The following variables are used by the shell.  In some cases,
+.B bash
+assigns a default value to a variable; these cases are noted
+below.
+.PP
+.PD 0
+.TP
+.B BASH_ENV
+If this parameter is set when \fBbash\fP is executing a shell script,
+its value is interpreted as a filename containing commands to
+initialize the shell, as in
+.IR ~/.bashrc .
+The value of
+.SM
+.B BASH_ENV
+is subjected to parameter expansion, command substitution, and arithmetic
+expansion before being interpreted as a file name.
+.SM
+.B PATH
+is not used to search for the resultant file name.
+.TP
+.B CDPATH
+The search path for the
+.B cd
+command.
+This is a colon-separated list of directories in which the shell looks
+for destination directories specified by the
+.B cd
+command.
+A sample value is
+.if t \f(CW".:~:/usr"\fP.
+.if n ".:~:/usr".
+.TP
+.B COLUMNS
+Used by the \fBselect\fP builtin command to determine the terminal width
+when printing selection lists.  Automatically set upon receipt of a SIGWINCH.
+.TP
+.B COMPREPLY
+An array variable from which \fBbash\fP reads the possible completions
+generated by a shell function invoked by the programmable completion
+facility (see \fBProgrammable Completion\fP below).
+.TP
+.B EMACS
+If \fBbash\fP finds this variable in the environment when the shell starts
+with value
+.if t \f(CWt\fP,
+.if n "t",
+it assumes that the shell is running in an emacs shell buffer and disables
+line editing.
+.TP
+.B FCEDIT
+The default editor for the
+.B fc
+builtin command.
+.TP
+.B FIGNORE
+A colon-separated list of suffixes to ignore when performing
+filename completion (see
+.SM
+.B READLINE
+below).
+A filename whose suffix matches one of the entries in 
+.SM
+.B FIGNORE
+is excluded from the list of matched filenames.
+A sample value is
+.if t \f(CW".o:~"\fP.
+.if n ".o:~".
+.TP
+.B GLOBIGNORE
+A colon-separated list of patterns defining the set of filenames to
+be ignored by pathname expansion.
+If a filename matched by a pathname expansion pattern also matches one
+of the patterns in
+.SM
+.BR GLOBIGNORE ,
+it is removed from the list of matches.
+.TP
+.B HISTCONTROL
+A colon-separated list of values controlling how commands are saved on
+the history list.
+If the list of values includes
+.IR ignorespace ,
+lines which begin with a
+.B space
+character are not saved in the history list.
+A value of 
+.I ignoredups
+causes lines matching the previous history entry to not be saved.
+A value of
+.I ignoreboth
+is shorthand for \fIignorespace\fP and \fIignoredups\fP.
+A value of
+.IR erasedups
+causes all previous lines matching the current line to be removed from
+the history list before that line is saved.
+Any value not in the above list is ignored.
+If \fBHISTCONTROL\fP is unset, or does not include a valid value,
+all lines read by the shell parser are saved on the history list,
+subject to the value of
+.BR HISTIGNORE .
+The second and subsequent lines of a multi-line compound command are
+not tested, and are added to the history regardless of the value of
+.BR HISTCONTROL .
+.TP
+.B HISTFILE
+The name of the file in which command history is saved (see
+.SM
+.B HISTORY
+below).  The default value is \fI~/.bash_history\fP.  If unset, the
+command history is not saved when an interactive shell exits.
+.TP
+.B HISTFILESIZE
+The maximum number of lines contained in the history file.  When this
+variable is assigned a value, the history file is truncated, if
+necessary, to contain no more than that number of lines.  The default
+value is 500.  The history file is also truncated to this size after
+writing it when an interactive shell exits.
+.TP
+.B HISTIGNORE
+A colon-separated list of patterns used to decide which command lines
+should be saved on the history list.  Each pattern is anchored at the
+beginning of the line and must match the complete line (no implicit
+`\fB*\fP' is appended).  Each pattern is tested against the line
+after the checks specified by
+.B HISTCONTROL
+are applied.
+In addition to the normal shell pattern matching characters, `\fB&\fP'
+matches the previous history line.  `\fB&\fP' may be escaped using a
+backslash; the backslash is removed before attempting a match.
+The second and subsequent lines of a multi-line compound command are
+not tested, and are added to the history regardless of the value of
+.BR HISTIGNORE .
+.TP
+.B HISTSIZE
+The number of commands to remember in the command history (see
+.SM
+.B HISTORY
+below).  The default value is 500.
+.TP
+.B HOME
+The home directory of the current user; the default argument for the
+\fBcd\fP builtin command.
+The value of this variable is also used when performing tilde expansion.
+.TP
+.B HOSTFILE
+Contains the name of a file in the same format as
+.FN /etc/hosts
+that should be read when the shell needs to complete a
+hostname.
+The list of possible hostname completions may be changed while the
+shell is running;
+the next time hostname completion is attempted after the
+value is changed,
+.B bash
+adds the contents of the new file to the existing list.
+If
+.SM
+.B HOSTFILE
+is set, but has no value, \fBbash\fP attempts to read
+.FN /etc/hosts
+to obtain the list of possible hostname completions.
+When
+.SM
+.B HOSTFILE
+is unset, the hostname list is cleared.
+.TP
+.B IFS
+The
+.I Internal Field Separator
+that is used
+for word splitting after expansion and to
+split lines into words with the
+.B read
+builtin command.  The default value is
+``<space><tab><newline>''.
+.TP
+.B IGNOREEOF
+Controls the
+action of an interactive shell on receipt of an
+.SM
+.B EOF
+character as the sole input.  If set, the value is the number of
+consecutive
+.SM
+.B EOF
+characters which must be
+typed as the first characters on an input line before
+.B bash
+exits.  If the variable exists but does not have a numeric value, or
+has no value, the default value is 10.  If it does not exist,
+.SM
+.B EOF
+signifies the end of input to the shell.
+.TP
+.B INPUTRC
+The filename for the
+.B readline
+startup file, overriding the default of
+.FN ~/.inputrc
+(see
+.SM
+.B READLINE
+below).
+.TP
+.B LANG
+Used to determine the locale category for any category not specifically
+selected with a variable starting with \fBLC_\fP.
+.TP
+.B LC_ALL
+This variable overrides the value of \fBLANG\fP and any other
+\fBLC_\fP variable specifying a locale category.
+.TP
+.B LC_COLLATE
+This variable determines the collation order used when sorting the
+results of pathname expansion, and determines the behavior of range
+expressions, equivalence classes, and collating sequences within
+pathname expansion and pattern matching.
+.TP
+.B LC_CTYPE
+This variable determines the interpretation of characters and the
+behavior of character classes within pathname expansion and pattern
+matching.
+.TP
+.B LC_MESSAGES
+This variable determines the locale used to translate double-quoted
+strings preceded by a \fB$\fP.
+.TP
+.B LC_NUMERIC
+This variable determines the locale category used for number formatting.
+.TP
+.B LINES
+Used by the \fBselect\fP builtin command to determine the column length
+for printing selection lists.  Automatically set upon receipt of a SIGWINCH.
+.TP
+.B MAIL
+If this parameter is set to a file name and the
+.SM
+.B MAILPATH
+variable is not set,
+.B bash
+informs the user of the arrival of mail in the specified file.
+.TP
+.B MAILCHECK
+Specifies how
+often (in seconds)
+.B bash
+checks for mail.  The default is 60 seconds.  When it is time to check
+for mail, the shell does so before displaying the primary prompt.
+If this variable is unset, or set to a value that is not a number
+greater than or equal to zero, the shell disables mail checking.
+.TP
+.B MAILPATH
+A colon-separated list of file names to be checked for mail. 
+The message to be printed when mail arrives in a particular file
+may be specified by separating the file name from the message with a `?'.
+When used in the text of the message, \fB$_\fP expands to the name of
+the current mailfile. 
+Example:
+.RS
+.PP
+\fBMAILPATH\fP='/var/mail/bfox?"You have mail":~/shell\-mail?"$_ has mail!"'
+.PP
+.B Bash
+supplies a default value for this variable, but the location of the user
+mail files that it uses is system dependent (e.g., /var/mail/\fB$USER\fP).
+.RE
+.TP
+.B OPTERR
+If set to the value 1,
+.B bash
+displays error messages generated by the
+.B getopts
+builtin command (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+.SM
+.B OPTERR
+is initialized to 1 each time the shell is invoked or a shell
+script is executed.
+.TP
+.B PATH
+The search path for commands.  It
+is a colon-separated list of directories in which
+the shell looks for commands (see
+.SM
+.B COMMAND EXECUTION
+below).
+A zero-length (null) directory name in the value of \fBPATH\fP indicates the
+current directory.
+A null directory name may appear as two adjacent colons, or as an initial
+or trailing colon.
+The default path is system-dependent,
+and is set by the administrator who installs
+.BR bash .
+A common value is
+.if t \f(CW/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.\fP.
+.if n ``/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:.''.
+.TP
+.B POSIXLY_CORRECT
+If this variable is in the environment when \fBbash\fP starts, the shell
+enters \fIposix mode\fP before reading the startup files, as if the
+.B \-\-posix
+invocation option had been supplied.  If it is set while the shell is
+running, \fBbash\fP enables \fIposix mode\fP, as if the command
+.if t \f(CWset -o posix\fP
+.if n \fIset -o posix\fP
+had been executed.
+.TP
+.B PROMPT_COMMAND
+If set, the value is executed as a command prior to issuing each primary
+prompt.
+.TP
+.B PS1
+The value of this parameter is expanded (see
+.SM
+.B PROMPTING
+below) and used as the primary prompt string.  The default value is
+``\fB\es\-\ev\e$ \fP''.
+.TP
+.B PS2
+The value of this parameter is expanded as with
+.B PS1
+and used as the secondary prompt string.  The default is
+``\fB> \fP''.
+.TP
+.B PS3
+The value of this parameter is used as the prompt for the
+.B select
+command (see
+.SM
+.B SHELL GRAMMAR
+above).
+.TP
+.B PS4
+The value of this parameter is expanded as with
+.B PS1
+and the value is printed before each command
+.B bash
+displays during an execution trace.  The first character of
+.SM
+.B PS4
+is replicated multiple times, as necessary, to indicate multiple
+levels of indirection.  The default is ``\fB+ \fP''.
+.TP
+.B TIMEFORMAT
+The value of this parameter is used as a format string specifying
+how the timing information for pipelines prefixed with the
+.B time
+reserved word should be displayed.
+The \fB%\fP character introduces an escape sequence that is
+expanded to a time value or other information.
+The escape sequences and their meanings are as follows; the
+braces denote optional portions.
+.sp .5
+.RS
+.PD 0
+.TP 10
+.B %%
+A literal \fB%\fP.
+.TP
+.B %[\fIp\fP][l]R
+The elapsed time in seconds.
+.TP
+.B %[\fIp\fP][l]U
+The number of CPU seconds spent in user mode.
+.TP
+.B %[\fIp\fP][l]S
+The number of CPU seconds spent in system mode.
+.TP
+.B %P
+The CPU percentage, computed as (%U + %S) / %R.
+.PD
+.RE
+.IP
+The optional \fIp\fP is a digit specifying the \fIprecision\fP,
+the number of fractional digits after a decimal point.
+A value of 0 causes no decimal point or fraction to be output.
+At most three places after the decimal point may be specified;
+values of \fIp\fP greater than 3 are changed to 3.
+If \fIp\fP is not specified, the value 3 is used.
+.IP
+The optional \fBl\fP specifies a longer format, including
+minutes, of the form \fIMM\fPm\fISS\fP.\fIFF\fPs.
+The value of \fIp\fP determines whether or not the fraction is
+included.
+.IP
+If this variable is not set, \fBbash\fP acts as if it had the
+value \fB$'\enreal\et%3lR\enuser\et%3lU\ensys\t%3lS'\fP.
+If the value is null, no timing information is displayed.
+A trailing newline is added when the format string is displayed.
+.TP
+.B TMOUT
+If set to a value greater than zero, \fBTMOUT\fP is treated as the
+default timeout for the \fBread\fP builtin.
+The \fBselect\fP command terminates if input does not arrive
+after \fBTMOUT\fP seconds when input is coming from a terminal.
+In an interactive shell, the value is interpreted as the
+number of seconds to wait for input after issuing the primary prompt.
+.B Bash
+terminates after waiting for that number of seconds if input does
+not arrive.
+.TP
+.B auto_resume
+This variable controls how the shell interacts with the user and
+job control.  If this variable is set, single word simple
+commands without redirections are treated as candidates for resumption
+of an existing stopped job.  There is no ambiguity allowed; if there is
+more than one job beginning with the string typed, the job most recently
+accessed is selected.  The
+.I name
+of a stopped job, in this context, is the command line used to
+start it.
+If set to the value
+.IR exact ,
+the string supplied must match the name of a stopped job exactly;
+if set to
+.IR substring ,
+the string supplied needs to match a substring of the name of a
+stopped job.  The
+.I substring
+value provides functionality analogous to the
+.B %?
+job identifier (see
+.SM
+.B JOB CONTROL
+below).  If set to any other value, the supplied string must
+be a prefix of a stopped job's name; this provides functionality
+analogous to the
+.B %
+job identifier.
+.TP
+.B histchars
+The two or three characters which control history expansion
+and tokenization (see
+.SM
+.B HISTORY EXPANSION
+below).  The first character is the \fIhistory expansion\fP character,
+the character which signals the start of a history
+expansion, normally `\fB!\fP'.
+The second character is the \fIquick substitution\fP
+character, which is used as shorthand for re-running the previous
+command entered, substituting one string for another in the command.
+The default is `\fB^\fP'.
+The optional third character is the character
+which indicates that the remainder of the line is a comment when found
+as the first character of a word, normally `\fB#\fP'.  The history
+comment character causes history substitution to be skipped for the
+remaining words on the line.  It does not necessarily cause the shell
+parser to treat the rest of the line as a comment.
+.PD
+.SS Arrays
+.B Bash
+provides one-dimensional array variables.  Any variable may be used as
+an array; the
+.B declare
+builtin will explicitly declare an array.  There is no maximum
+limit on the size of an array, nor any requirement that members
+be indexed or assigned contiguously.  Arrays are indexed using
+integers and are zero-based.
+.PP
+An array is created automatically if any variable is assigned to using
+the syntax \fIname\fP[\fIsubscript\fP]=\fIvalue\fP.  The
+.I subscript
+is treated as an arithmetic expression that must evaluate to a number
+greater than or equal to zero.  To explicitly declare an array, use
+.B declare \-a \fIname\fP
+(see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+.B declare \-a \fIname\fP[\fIsubscript\fP]
+is also accepted; the \fIsubscript\fP is ignored.  Attributes may be
+specified for an array variable using the
+.B declare
+and
+.B readonly
+builtins.  Each attribute applies to all members of an array.
+.PP
+Arrays are assigned to using compound assignments of the form
+\fIname\fP=\fB(\fPvalue\fI1\fP ... value\fIn\fP\fB)\fP, where each
+\fIvalue\fP is of the form [\fIsubscript\fP]=\fIstring\fP.  Only
+\fIstring\fP is required.  If
+the optional brackets and subscript are supplied, that index is assigned to;
+otherwise the index of the element assigned is the last index assigned
+to by the statement plus one.  Indexing starts at zero.
+This syntax is also accepted by the
+.B declare
+builtin.  Individual array elements may be assigned to using the
+\fIname\fP[\fIsubscript\fP]=\fIvalue\fP syntax introduced above.
+.PP
+Any element of an array may be referenced using
+${\fIname\fP[\fIsubscript\fP]}.  The braces are required to avoid
+conflicts with pathname expansion.  If
+\fIsubscript\fP is \fB@\fP or \fB*\fP, the word expands to
+all members of \fIname\fP.  These subscripts differ only when the
+word appears within double quotes.  If the word is double-quoted,
+${\fIname\fP[*]} expands to a single
+word with the value of each array member separated by the first
+character of the
+.SM
+.B IFS
+special variable, and ${\fIname\fP[@]} expands each element of
+\fIname\fP to a separate word.  When there are no array members,
+${\fIname\fP[@]} expands to nothing.  This is analogous to the expansion
+of the special parameters \fB*\fP and \fB@\fP (see
+.B Special Parameters
+above).  ${#\fIname\fP[\fIsubscript\fP]} expands to the length of
+${\fIname\fP[\fIsubscript\fP]}.  If \fIsubscript\fP is \fB*\fP or
+\fB@\fP, the expansion is the number of elements in the array.
+Referencing an array variable without a subscript is equivalent to
+referencing element zero.
+.PP
+The
+.B unset
+builtin is used to destroy arrays.  \fBunset\fP \fIname\fP[\fIsubscript\fP]
+destroys the array element at index \fIsubscript\fP.
+\fBunset\fP \fIname\fP, where \fIname\fP is an array, or
+\fBunset\fP \fIname\fP[\fIsubscript\fP], where
+\fIsubscript\fP is \fB*\fP or \fB@\fP, removes the entire array.
+.PP
+The
+.BR declare ,
+.BR local ,
+and
+.B readonly
+builtins each accept a
+.B \-a
+option to specify an array.  The
+.B read
+builtin accepts a
+.B \-a
+option to assign a list of words read from the standard input
+to an array.  The
+.B set
+and
+.B declare
+builtins display array values in a way that allows them to be
+reused as assignments.
+.SH EXPANSION
+Expansion is performed on the command line after it has been split into
+words.  There are seven kinds of expansion performed:
+.IR "brace expansion" ,
+.IR "tilde expansion" ,
+.IR "parameter and variable expansion" ,
+.IR "command substitution" ,
+.IR "arithmetic expansion" ,
+.IR "word splitting" ,
+and
+.IR "pathname expansion" .
+.PP
+The order of expansions is: brace expansion, tilde expansion,
+parameter, variable and arithmetic expansion and
+command substitution
+(done in a left-to-right fashion), word splitting, and pathname
+expansion.
+.PP
+On systems that can support it, there is an additional expansion
+available: \fIprocess substitution\fP.
+.PP
+Only brace expansion, word splitting, and pathname expansion
+can change the number of words of the expansion; other expansions
+expand a single word to a single word.
+The only exceptions to this are the expansions of
+"\fB$@\fP" and "\fB${\fP\fIname\fP\fB[@]}\fP"
+as explained above (see
+.SM
+.BR PARAMETERS ).
+.SS Brace Expansion
+.PP
+.I "Brace expansion"
+is a mechanism by which arbitrary strings
+may be generated.  This mechanism is similar to
+\fIpathname expansion\fP, but the filenames generated
+need not exist.  Patterns to be brace expanded take
+the form of an optional
+.IR preamble ,
+followed by either a series of comma-separated strings or
+a sequence expression between a pair of braces, followed by
+an optional
+.IR postscript .
+The preamble is prefixed to each string contained
+within the braces, and the postscript is then appended
+to each resulting string, expanding left to right.
+.PP
+Brace expansions may be nested.  The results of each expanded
+string are not sorted; left to right order is preserved.
+For example, a\fB{\fPd,c,b\fB}\fPe expands into `ade ace abe'.
+.PP
+A sequence expression takes the form \fB{\fP\fIx\fP\fB..\fP\fIy\fP\fB}\fP,
+where \fIx\fP and \fIy\fP are either integers or single characters.
+When integers are supplied, the expression expands to each number between
+\fIx\fP and \fIy\fP, inclusive.
+When characters are supplied, the expression expands to each character
+lexicographically between \fIx\fP and \fIy\fP, inclusive.  Note that
+both \fIx\fP and \fIy\fP must be of the same type.
+.PP
+Brace expansion is performed before any other expansions,
+and any characters special to other expansions are preserved
+in the result.  It is strictly textual.
+.B Bash
+does not apply any syntactic interpretation to the context of the
+expansion or the text between the braces.
+.PP
+A correctly-formed brace expansion must contain unquoted opening
+and closing braces, and at least one unquoted comma or a valid
+sequence expression.
+Any incorrectly formed brace expansion is left unchanged.
+A \fB{\fP or \fB,\fP may be quoted with a backslash to prevent its
+being considered part of a brace expression.
+To avoid conflicts with parameter expansion, the string \fB${\fP
+is not considered eligible for brace expansion.
+.PP
+This construct is typically used as shorthand when the common
+prefix of the strings to be generated is longer than in the
+above example:
+.RS
+.PP
+mkdir /usr/local/src/bash/{old,new,dist,bugs}
+.RE
+or
+.RS
+chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
+.RE
+.PP
+Brace expansion introduces a slight incompatibility with
+historical versions of
+.BR sh .
+.B sh
+does not treat opening or closing braces specially when they
+appear as part of a word, and preserves them in the output.
+.B Bash
+removes braces from words as a consequence of brace
+expansion.  For example, a word entered to
+.B sh
+as \fIfile{1,2}\fP
+appears identically in the output.  The same word is
+output as
+.I file1 file2
+after expansion by
+.BR bash .
+If strict compatibility with
+.B sh
+is desired, start
+.B bash
+with the
+.B +B 
+option or disable brace expansion with the
+.B +B
+option to the
+.B set
+command (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+.SS Tilde Expansion
+.PP
+If a word begins with an unquoted tilde character (`\fB~\fP'), all of
+the characters preceding the first unquoted slash (or all characters,
+if there is no unquoted slash) are considered a \fItilde-prefix\fP.
+If none of the characters in the tilde-prefix are quoted, the
+characters in the tilde-prefix following the tilde are treated as a
+possible \fIlogin name\fP.
+If this login name is the null string, the tilde is replaced with the
+value of the shell parameter
+.SM
+.BR HOME .
+If
+.SM
+.B HOME
+is unset, the home directory of the user executing the shell is
+substituted instead.
+Otherwise, the tilde-prefix is replaced with the home directory
+associated with the specified login name.
+.PP
+If the tilde-prefix is a `~+', the value of the shell variable
+.SM
+.B PWD
+replaces the tilde-prefix.
+If the tilde-prefix is a `~\-', the value of the shell variable
+.SM
+.BR OLDPWD ,
+if it is set, is substituted.
+If the characters following the tilde in the tilde-prefix consist
+of a number \fIN\fP, optionally prefixed
+by a `+' or a `\-', the tilde-prefix is replaced with the corresponding
+element from the directory stack, as it would be displayed by the
+.B dirs
+builtin invoked with the tilde-prefix as an argument.
+If the characters following the tilde in the tilde-prefix consist of a
+number without a leading `+' or `\-', `+' is assumed.
+.PP
+If the login name is invalid, or the tilde expansion fails, the word
+is unchanged.
+.PP
+Each variable assignment is checked for unquoted tilde-prefixes immediately
+following a
+.B :
+or
+.BR = .
+In these cases, tilde expansion is also performed.
+Consequently, one may use file names with tildes in assignments to
+.SM
+.BR PATH ,
+.SM
+.BR MAILPATH ,
+and
+.SM
+.BR CDPATH ,
+and the shell assigns the expanded value.
+.SS Parameter Expansion
+.PP
+The `\fB$\fP' character introduces parameter expansion,
+command substitution, or arithmetic expansion.  The parameter name
+or symbol to be expanded may be enclosed in braces, which
+are optional but serve to protect the variable to be expanded from
+characters immediately following it which could be
+interpreted as part of the name.
+.PP
+When braces are used, the matching ending brace is the first `\fB}\fP'
+not escaped by a backslash or within a quoted string, and not within an
+embedded arithmetic expansion, command substitution, or paramter
+expansion.
+.PP
+.PD 0
+.TP
+${\fIparameter\fP}
+The value of \fIparameter\fP is substituted.  The braces are required
+when
+.I parameter
+is a positional parameter with more than one digit,
+or when
+.I parameter
+is followed by a character which is not to be
+interpreted as part of its name.
+.PD
+.PP
+If the first character of \fIparameter\fP is an exclamation point,
+a level of variable indirection is introduced.
+\fBBash\fP uses the value of the variable formed from the rest of
+\fIparameter\fP as the name of the variable; this variable is then
+expanded and that value is used in the rest of the substitution, rather
+than the value of \fIparameter\fP itself.
+This is known as \fIindirect expansion\fP.
+The exceptions to this are the expansions of ${!\fIprefix\fP*} and
+${\fB!\fP\fIname\fP[\fI@\fP]} described below.
+The exclamation point must immediately follow the left brace in order to
+introduce indirection.
+.PP
+In each of the cases below, \fIword\fP is subject to tilde expansion,
+parameter expansion, command substitution, and arithmetic expansion.
+When not performing substring expansion, \fBbash\fP tests for a parameter
+that is unset or null; omitting the colon results in a test only for a
+parameter that is unset.
+.PP
+.PD 0
+.TP
+${\fIparameter\fP\fB:\-\fP\fIword\fP}
+\fBUse Default Values\fP.  If
+.I parameter
+is unset or null, the expansion of
+.I word
+is substituted.  Otherwise, the value of
+.I parameter
+is substituted.
+.TP
+${\fIparameter\fP\fB:=\fP\fIword\fP}
+\fBAssign Default Values\fP.
+If
+.I parameter
+is unset or null, the expansion of
+.I word
+is assigned to
+.IR parameter .
+The value of
+.I parameter
+is then substituted.  Positional parameters and special parameters may
+not be assigned to in this way.
+.TP
+${\fIparameter\fP\fB:?\fP\fIword\fP}
+\fBDisplay Error if Null or Unset\fP.
+If
+.I parameter
+is null or unset, the expansion of \fIword\fP (or a message to that effect
+if
+.I word
+is not present) is written to the standard error and the shell, if it
+is not interactive, exits.  Otherwise, the value of \fIparameter\fP is
+substituted.
+.TP
+${\fIparameter\fP\fB:+\fP\fIword\fP}
+\fBUse Alternate Value\fP.
+If
+.I parameter
+is null or unset, nothing is substituted, otherwise the expansion of
+.I word
+is substituted.
+.TP
+${\fIparameter\fP\fB:\fP\fIoffset\fP}
+.PD 0
+.TP
+${\fIparameter\fP\fB:\fP\fIoffset\fP\fB:\fP\fIlength\fP}
+.PD
+\fBSubstring Expansion.\fP
+Expands to up to \fIlength\fP characters of \fIparameter\fP
+starting at the character specified by \fIoffset\fP.
+If \fIlength\fP is omitted, expands to the substring of
+\fIparameter\fP starting at the character specified by \fIoffset\fP.
+\fIlength\fP and \fIoffset\fP are arithmetic expressions (see
+.SM
+.B
+ARITHMETIC EVALUATION
+below).
+\fIlength\fP must evaluate to a number greater than or equal to zero.
+If \fIoffset\fP evaluates to a number less than zero, the value
+is used as an offset from the end of the value of \fIparameter\fP.
+If \fIparameter\fP is \fB@\fP, the result is \fIlength\fP positional
+parameters beginning at \fIoffset\fP.
+If \fIparameter\fP is an array name indexed by @ or *,
+the result is the \fIlength\fP
+members of the array beginning with ${\fIparameter\fP[\fIoffset\fP]}.
+Substring indexing is zero-based unless the positional parameters 
+are used, in which case the indexing starts at 1.
+.TP
+${\fB!\fP\fIprefix\fP\fB*\fP}
+.PD 0
+.TP
+${\fB!\fP\fIprefix\fP\fB@\fP}
+.PD
+Expands to the names of variables whose names begin with \fIprefix\fP,
+separated by the first character of the
+.SM
+.B IFS
+special variable.
+.TP
+${\fB!\fP\fIname\fP[\fI@\fP]}
+.PD 0
+.TP
+${\fB!\fP\fIname\fP[\fI*\fP]}
+.PD
+If \fIname\fP is an array variable, expands to the list of array indices
+(keys) assigned in \fIname\fP.
+If \fIname\fP is not an array, expands to 0 if \fIname\fP is set and null
+otherwise.
+When \fI@\fP is used and the expansion appears within double quotes, each
+key expands to a separate word.
+.TP
+${\fB#\fP\fIparameter\fP}
+The length in characters of the value of \fIparameter\fP is substituted.
+If
+.I parameter
+is
+.B *
+or 
+.BR @ ,
+the value substituted is the number of positional parameters.
+If
+.I parameter
+is an array name subscripted by
+.B *
+or
+.BR @ ,
+the value substituted is the number of elements in the array.
+.TP
+${\fIparameter\fP\fB#\fP\fIword\fP}
+.PD 0
+.TP
+${\fIparameter\fP\fB##\fP\fIword\fP}
+.PD
+The 
+.I word
+is expanded to produce a pattern just as in pathname
+expansion.  If the pattern matches the beginning of
+the value of
+.IR parameter ,
+then the result of the expansion is the expanded value of
+.I parameter
+with the shortest matching pattern (the ``\fB#\fP'' case) or the
+longest matching pattern (the ``\fB##\fP'' case) deleted.
+If
+.I parameter
+is
+.B @
+or
+.BR * ,
+the pattern removal operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If
+.I parameter
+is an array variable subscripted with
+.B @
+or
+.BR * ,
+the pattern removal operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+.TP
+${\fIparameter\fP\fB%\fP\fIword\fP}
+.PD 0
+.TP
+${\fIparameter\fP\fB%%\fP\fIword\fP}
+.PD
+The \fIword\fP is expanded to produce a pattern just as in
+pathname expansion.
+If the pattern matches a trailing portion of the expanded value of
+.IR parameter ,
+then the result of the expansion is the expanded value of
+.I parameter
+with the shortest matching pattern (the ``\fB%\fP'' case) or the
+longest matching pattern (the ``\fB%%\fP'' case) deleted.
+If
+.I parameter
+is
+.B @
+or
+.BR * ,
+the pattern removal operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If
+.I parameter
+is an array variable subscripted with
+.B @
+or
+.BR * ,
+the pattern removal operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+.TP
+${\fIparameter\fP\fB/\fP\fIpattern\fP\fB/\fP\fIstring\fP}
+.PD 0
+.TP
+${\fIparameter\fP\fB//\fP\fIpattern\fP\fB/\fP\fIstring\fP}
+.PD
+The \fIpattern\fP is expanded to produce a pattern just as in
+pathname expansion.
+\fIParameter\fP is expanded and the longest match of \fIpattern\fP
+against its value is replaced with \fIstring\fP.
+In the first form, only the first match is replaced.
+The second form causes all matches of \fIpattern\fP to be
+replaced with \fIstring\fP.
+If \fIpattern\fP begins with \fB#\fP, it must match at the beginning
+of the expanded value of \fIparameter\fP.
+If \fIpattern\fP begins with \fB%\fP, it must match at the end
+of the expanded value of \fIparameter\fP.
+If \fIstring\fP is null, matches of \fIpattern\fP are deleted
+and the \fB/\fP following \fIpattern\fP may be omitted.
+If
+.I parameter
+is
+.B @
+or
+.BR * ,
+the substitution operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If
+.I parameter
+is an array variable subscripted with
+.B @
+or
+.BR * ,
+the substitution operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+.SS Command Substitution
+.PP
+\fICommand substitution\fP allows the output of a command to replace
+the command name.  There are two forms:
+.PP
+.RS
+.PP
+\fB$(\fP\fIcommand\fP\|\fB)\fP
+.RE
+or
+.RS
+\fB`\fP\fIcommand\fP\fB`\fP
+.RE
+.PP
+.B Bash
+performs the expansion by executing \fIcommand\fP and
+replacing the command substitution with the standard output of the
+command, with any trailing newlines deleted.
+Embedded newlines are not deleted, but they may be removed during
+word splitting.
+The command substitution \fB$(cat \fIfile\fP)\fR can be replaced by
+the equivalent but faster \fB$(< \fIfile\fP)\fR.
+.PP
+When the old-style backquote form of substitution is used,
+backslash retains its literal meaning except when followed by
+.BR $ ,
+.BR ` ,
+or
+.BR \e .
+The first backquote not preceded by a backslash terminates the
+command substitution.
+When using the $(\^\fIcommand\fP\|) form, all characters between the
+parentheses make up the command; none are treated specially.
+.PP
+Command substitutions may be nested.  To nest when using the backquoted form,
+escape the inner backquotes with backslashes.
+.PP
+If the substitution appears within double quotes, word splitting and
+pathname expansion are not performed on the results.
+.SS Arithmetic Expansion
+.PP
+Arithmetic expansion allows the evaluation of an arithmetic expression
+and the substitution of the result.  The format for arithmetic expansion is:
+.RS
+.PP
+\fB$((\fP\fIexpression\fP\fB))\fP
+.RE
+.PP
+The
+.I expression
+is treated as if it were within double quotes, but a double quote
+inside the parentheses is not treated specially.
+All tokens in the expression undergo parameter expansion, string
+expansion, command substitution, and quote removal.
+Arithmetic expansions may be nested.
+.PP
+The evaluation is performed according to the rules listed below under
+.SM
+.BR "ARITHMETIC EVALUATION" .
+If
+.I expression
+is invalid,
+.B bash
+prints a message indicating failure and no substitution occurs.
+.SS Process Substitution
+.PP
+\fIProcess substitution\fP is supported on systems that support named
+pipes (\fIFIFOs\fP) or the \fB/dev/fd\fP method of naming open files.
+It takes the form of
+\fB<(\fP\fIlist\^\fP\fB)\fP
+or
+\fB>(\fP\fIlist\^\fP\fB)\fP.
+The process \fIlist\fP is run with its input or output connected to a
+\fIFIFO\fP or some file in \fB/dev/fd\fP.  The name of this file is
+passed as an argument to the current command as the result of the
+expansion.  If the \fB>(\fP\fIlist\^\fP\fB)\fP form is used, writing to
+the file will provide input for \fIlist\fP.  If the
+\fB<(\fP\fIlist\^\fP\fB)\fP form is used, the file passed as an
+argument should be read to obtain the output of \fIlist\fP.
+.PP
+When available, process substitution is performed
+simultaneously with parameter and variable expansion, 
+command substitution,
+and arithmetic expansion.
+.SS Word Splitting
+.PP
+The shell scans the results of
+parameter expansion,
+command substitution,
+and
+arithmetic expansion
+that did not occur within double quotes for
+.IR "word splitting" .
+.PP
+The shell treats each character of
+.SM
+.B IFS
+as a delimiter, and splits the results of the other
+expansions into words on these characters.  If
+.SM
+.B IFS
+is unset, or its
+value is exactly
+.BR <space><tab><newline> ,
+the default, then
+any sequence of
+.SM
+.B IFS
+characters serves to delimit words.  If
+.SM
+.B IFS
+has a value other than the default, then sequences of
+the whitespace characters
+.B space
+and
+.B tab
+are ignored at the beginning and end of the
+word, as long as the whitespace character is in the
+value of
+.SM
+.BR IFS
+(an
+.SM
+.B IFS
+whitespace character).
+Any character in
+.SM
+.B IFS
+that is not
+.SM
+.B IFS
+whitespace, along with any adjacent
+.SM
+.B IFS
+whitespace characters, delimits a field.
+A sequence of
+.SM
+.B IFS
+whitespace characters is also treated as a delimiter.
+If the value of
+.SM
+.B IFS
+is null, no word splitting occurs.
+.PP
+Explicit null arguments (\^\f3"\^"\fP or \^\f3'\^'\fP\^) are retained.
+Unquoted implicit null arguments, resulting from the expansion of
+parameters that have no values, are removed.
+If a parameter with no value is expanded within double quotes, a
+null argument results and is retained.
+.PP
+Note that if no expansion occurs, no splitting
+is performed.
+.SS Pathname Expansion
+.PP
+After word splitting,
+unless the
+.B \-f
+option has been set,
+.B bash
+scans each word for the characters
+.BR * ,
+.BR ? ,
+and
+.BR [ .
+If one of these characters appears, then the word is
+regarded as a
+.IR pattern ,
+and replaced with an alphabetically sorted list of
+file names matching the pattern.
+If no matching file names are found,
+and the shell option
+.B nullglob
+is disabled, the word is left unchanged.
+If the 
+.B nullglob
+option is set, and no matches are found,
+the word is removed.
+If the shell option
+.B nocaseglob
+is enabled, the match is performed without regard to the case
+of alphabetic characters.
+When a pattern is used for pathname expansion,
+the character
+.B ``.''
+at the start of a name or immediately following a slash
+must be matched explicitly, unless the shell option
+.B dotglob
+is set.
+When matching a pathname, the slash character must always be
+matched explicitly.
+In other cases, the
+.B ``.''
+character is not treated specially.
+See the description of
+.B shopt
+below under
+.SM
+.B SHELL BUILTIN COMMANDS
+for a description of the
+.BR nocaseglob ,
+.BR nullglob ,
+and
+.B dotglob
+shell options.
+.PP
+The
+.SM
+.B GLOBIGNORE
+shell variable may be used to restrict the set of file names matching a
+.IR pattern .
+If
+.SM
+.B GLOBIGNORE
+is set, each matching file name that also matches one of the patterns in
+.SM
+.B GLOBIGNORE
+is removed from the list of matches.
+The file names
+.B ``.''
+and
+.B ``..''
+are always ignored when
+.SM
+.B GLOBIGNORE
+is set and not null.  However, setting
+.SM
+.B GLOBIGNORE
+to a non-null value has the effect of enabling the
+.B dotglob
+shell option, so all other file names beginning with a
+.B ``.''
+will match.
+To get the old behavior of ignoring file names beginning with a
+.BR ``.'' ,
+make
+.B ``.*''
+one of the patterns in
+.SM
+.BR GLOBIGNORE .
+The
+.B dotglob
+option is disabled when
+.SM
+.B GLOBIGNORE
+is unset.
+.PP
+\fBPattern Matching\fP
+.PP
+Any character that appears in a pattern, other than the special pattern
+characters described below, matches itself.  The NUL character may not
+occur in a pattern.  A backslash escapes the following character; the
+escaping backslash is discarded when matching.
+The special pattern characters must be quoted if
+they are to be matched literally.
+.PP
+The special pattern characters have the following meanings:
+.PP
+.PD 0
+.TP
+.B *
+Matches any string, including the null string.
+.TP
+.B ?
+Matches any single character.
+.TP
+.B [...]
+Matches any one of the enclosed characters.  A pair of characters
+separated by a hyphen denotes a
+\fIrange expression\fP;
+any character that sorts between those two characters, inclusive,
+using the current locale's collating sequence and character set,
+is matched.  If the first character following the
+.B [
+is a
+.B !
+or a
+.B ^
+then any character not enclosed is matched.
+The sorting order of characters in range expressions is determined by
+the current locale and the value of the \fBLC_COLLATE\fP shell variable,
+if set.
+A 
+.B \-
+may be matched by including it as the first or last character
+in the set.
+A
+.B ]
+may be matched by including it as the first character
+in the set.
+.br
+.if t .sp 0.5
+.if n .sp 1
+Within
+.B [
+and
+.BR ] ,
+\fIcharacter classes\fP can be specified using the syntax
+\fB[:\fP\fIclass\fP\fB:]\fP, where \fIclass\fP is one of the
+following classes defined in the POSIX.2 standard:
+.PP
+.RS
+.B
+.if n alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit
+.if t alnum   alpha   ascii   blank   cntrl   digit   graph   lower   print   punct   space   upper   word   xdigit
+.br
+A character class matches any character belonging to that class.
+The \fBword\fP character class matches letters, digits, and the character _.
+.br
+.if t .sp 0.5
+.if n .sp 1
+Within
+.B [
+and 
+.BR ] ,
+an \fIequivalence class\fP can be specified using the syntax
+\fB[=\fP\fIc\fP\fB=]\fP, which matches all characters with the
+same collation weight (as defined by the current locale) as
+the character \fIc\fP.
+.br
+.if t .sp 0.5
+.if n .sp 1
+Within
+.B [
+and 
+.BR ] ,
+the syntax \fB[.\fP\fIsymbol\fP\fB.]\fP matches the collating symbol
+\fIsymbol\fP.
+.RE
+.PD
+.PP
+If the \fBextglob\fP shell option is enabled using the \fBshopt\fP
+builtin, several extended pattern matching operators are recognized.
+In the following description, a \fIpattern-list\fP is a list of one
+or more patterns separated by a \fB|\fP.
+Composite patterns may be formed using one or more of the following
+sub-patterns:
+.sp 1
+.PD 0
+.RS
+.TP
+\fB?(\fP\^\fIpattern-list\^\fP\fB)\fP
+Matches zero or one occurrence of the given patterns
+.TP
+\fB*(\fP\^\fIpattern-list\^\fP\fB)\fP
+Matches zero or more occurrences of the given patterns
+.TP
+\fB+(\fP\^\fIpattern-list\^\fP\fB)\fP
+Matches one or more occurrences of the given patterns
+.TP
+\fB@(\fP\^\fIpattern-list\^\fP\fB)\fP
+Matches exactly one of the given patterns
+.TP
+\fB!(\fP\^\fIpattern-list\^\fP\fB)\fP
+Matches anything except one of the given patterns
+.RE
+.PD
+.SS Quote Removal
+.PP
+After the preceding expansions, all unquoted occurrences of the
+characters
+.BR \e ,
+.BR ' ,
+and \^\f3"\fP\^ that did not result from one of the above
+expansions are removed.
+.SH REDIRECTION
+Before a command is executed, its input and output
+may be
+.I redirected
+using a special notation interpreted by the shell.
+Redirection may also be used to open and close files for the
+current shell execution environment.  The following redirection
+operators may precede or appear anywhere within a
+.I simple command
+or may follow a
+.IR command .
+Redirections are processed in the order they appear, from
+left to right.
+.PP
+In the following descriptions, if the file descriptor number is
+omitted, and the first character of the redirection operator is
+.BR < ,
+the redirection refers to the standard input (file descriptor
+0).  If the first character of the redirection operator is
+.BR > ,
+the redirection refers to the standard output (file descriptor
+1).
+.PP
+The word following the redirection operator in the following
+descriptions, unless otherwise noted, is subjected to brace expansion,
+tilde expansion, parameter expansion, command substitution, arithmetic
+expansion, quote removal, pathname expansion, and word splitting.
+If it expands to more than one word,
+.B bash
+reports an error.
+.PP
+Note that the order of redirections is significant.  For example, 
+the command
+.RS
+.PP
+ls \fB>\fP dirlist 2\fB>&\fP1
+.RE
+.PP
+directs both standard output and standard error to the file 
+.IR dirlist ,
+while the command
+.RS
+.PP
+ls 2\fB>&\fP1 \fB>\fP dirlist
+.RE
+.PP
+directs only the standard output to file
+.IR dirlist ,
+because the standard error was duplicated as standard output
+before the standard output was redirected to
+.IR dirlist .
+.PP
+\fBBash\fP handles several filenames specially when they are used in
+redirections, as described in the following table:
+.RS
+.PP
+.PD 0
+.TP
+.B /dev/fd/\fIfd\fP
+If \fIfd\fP is a valid integer, file descriptor \fIfd\fP is duplicated.
+.TP
+.B /dev/stdin
+File descriptor 0 is duplicated.
+.TP
+.B /dev/stdout
+File descriptor 1 is duplicated.
+.TP
+.B /dev/stderr
+File descriptor 2 is duplicated.
+.TP
+.B /dev/tcp/\fIhost\fP/\fIport\fP
+If \fIhost\fP is a valid hostname or Internet address, and \fIport\fP
+is an integer port number or service name, \fBbash\fP attempts to open
+a TCP connection to the corresponding socket.
+.TP
+.B /dev/udp/\fIhost\fP/\fIport\fP
+If \fIhost\fP is a valid hostname or Internet address, and \fIport\fP
+is an integer port number or service name, \fBbash\fP attempts to open
+a UDP connection to the corresponding socket.
+.PD
+.RE
+.PP
+A failure to open or create a file causes the redirection to fail.
+.SS Redirecting Input
+.PP
+Redirection of input causes the file whose name results from
+the expansion of
+.I word
+to be opened for reading on file descriptor
+.IR n ,
+or the standard input (file descriptor 0) if
+.I n
+is not specified.
+.PP
+The general format for redirecting input is:
+.RS
+.PP
+[\fIn\fP]\fB<\fP\fIword\fP
+.RE
+.SS Redirecting Output
+.PP
+Redirection of output causes the file whose name results from
+the expansion of
+.I word
+to be opened for writing on file descriptor
+.IR n ,
+or the standard output (file descriptor 1) if
+.I n
+is not specified.  If the file does not exist it is created;
+if it does exist it is truncated to zero size.
+.PP
+The general format for redirecting output is:
+.RS
+.PP
+[\fIn\fP]\fB>\fP\fIword\fP
+.RE
+.PP
+If the redirection operator is
+.BR > ,
+and the
+.B noclobber
+option to the
+.B set
+builtin has been enabled, the redirection will fail if the file
+whose name results from the expansion of \fIword\fP exists and is
+a regular file.
+If the redirection operator is
+.BR >| ,
+or the redirection operator is
+.B >
+and the
+.B noclobber
+option to the
+.B set
+builtin command is not enabled, the redirection is attempted even
+if the file named by \fIword\fP exists.
+.SS Appending Redirected Output
+.PP
+Redirection of output in this fashion
+causes the file whose name results from
+the expansion of
+.I word
+to be opened for appending on file descriptor
+.IR n ,
+or the standard output (file descriptor 1) if
+.I n
+is not specified.  If the file does not exist it is created.
+.PP
+The general format for appending output is:
+.RS
+.PP
+[\fIn\fP]\fB>>\fP\fIword\fP
+.RE
+.PP
+.SS Redirecting Standard Output and Standard Error
+.PP
+.B Bash
+allows both the
+standard output (file descriptor 1) and
+the standard error output (file descriptor 2)
+to be redirected to the file whose name is the
+expansion of
+.I word
+with this construct.
+.PP
+There are two formats for redirecting standard output and
+standard error:
+.RS
+.PP
+\fB&>\fP\fIword\fP
+.RE
+and
+.RS
+\fB>&\fP\fIword\fP
+.RE
+.PP
+Of the two forms, the first is preferred.
+This is semantically equivalent to
+.RS
+.PP
+\fB>\fP\fIword\fP 2\fB>&\fP1
+.RE
+.SS Here Documents
+.PP
+This type of redirection instructs the shell to read input from the
+current source until a line containing only
+.I word
+(with no trailing blanks)
+is seen.  All of
+the lines read up to that point are then used as the standard
+input for a command.
+.PP
+The format of here-documents is:
+.RS
+.PP
+.nf
+\fB<<\fP[\fB\-\fP]\fIword\fP
+        \fIhere-document\fP
+\fIdelimiter\fP
+.fi
+.RE
+.PP
+No parameter expansion, command substitution, arithmetic expansion,
+or pathname expansion is performed on
+.IR word .
+If any characters in
+.I word
+are quoted, the
+.I delimiter
+is the result of quote removal on
+.IR word ,
+and the lines in the here-document are not expanded.
+If \fIword\fP is unquoted,
+all lines of the here-document are subjected to parameter expansion,
+command substitution, and arithmetic expansion.  In the latter
+case, the character sequence
+.B \e<newline>
+is ignored, and
+.B \e
+must be used to quote the characters
+.BR \e ,
+.BR $ ,
+and
+.BR ` .
+.PP
+If the redirection operator is
+.BR <<\- ,
+then all leading tab characters are stripped from input lines and the
+line containing
+.IR delimiter .
+This allows
+here-documents within shell scripts to be indented in a
+natural fashion.
+.SS "Here Strings"
+A variant of here documents, the format is:
+.RS
+.PP
+.nf
+\fB<<<\fP\fIword\fP
+.fi
+.RE
+.PP
+The \fIword\fP is expanded and supplied to the command on its standard
+input.
+.SS "Duplicating File Descriptors"
+.PP
+The redirection operator
+.RS
+.PP
+[\fIn\fP]\fB<&\fP\fIword\fP
+.RE
+.PP
+is used to duplicate input file descriptors.
+If
+.I word
+expands to one or more digits, the file descriptor denoted by
+.I n
+is made to be a copy of that file descriptor.
+If the digits in
+.I word
+do not specify a file descriptor open for input, a redirection error occurs.
+If
+.I word
+evaluates to
+.BR \- ,
+file descriptor
+.I n
+is closed.  If
+.I n
+is not specified, the standard input (file descriptor 0) is used.
+.PP
+The operator
+.RS
+.PP
+[\fIn\fP]\fB>&\fP\fIword\fP
+.RE
+.PP
+is used similarly to duplicate output file descriptors.  If
+.I n
+is not specified, the standard output (file descriptor 1) is used.
+If the digits in
+.I word
+do not specify a file descriptor open for output, a redirection error occurs.
+As a special case, if \fIn\fP is omitted, and \fIword\fP does not
+expand to one or more digits, the standard output and standard
+error are redirected as described previously.
+.SS "Moving File Descriptors"
+.PP
+The redirection operator
+.RS
+.PP
+[\fIn\fP]\fB<&\fP\fIdigit\fP\fB\-\fP
+.RE
+.PP
+moves the file descriptor \fIdigit\fP to file descriptor
+.IR n ,
+or the standard input (file descriptor 0) if \fIn\fP is not specified.
+\fIdigit\fP is closed after being duplicated to \fIn\fP.
+.PP
+Similarly, the redirection operator
+.RS
+.PP
+[\fIn\fP]\fB>&\fP\fIdigit\fP\fB\-\fP
+.RE
+.PP
+moves the file descriptor \fIdigit\fP to file descriptor
+.IR n ,
+or the standard output (file descriptor 1) if \fIn\fP is not specified.
+.SS "Opening File Descriptors for Reading and Writing"
+.PP
+The redirection operator
+.RS
+.PP
+[\fIn\fP]\fB<>\fP\fIword\fP
+.RE
+.PP
+causes the file whose name is the expansion of
+.I word
+to be opened for both reading and writing on file descriptor
+.IR n ,
+or on file descriptor 0 if
+.I n
+is not specified.  If the file does not exist, it is created.
+.SH ALIASES
+\fIAliases\fP allow a string to be substituted for a word when it is used
+as the first word of a simple command.
+The shell maintains a list of aliases that may be set and unset with the
+.B alias
+and
+.B unalias
+builtin commands (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+The first word of each command, if unquoted,
+is checked to see if it has an
+alias.  If so, that word is replaced by the text of the alias.
+The alias name and the replacement text may contain any valid
+shell input, including the
+.I metacharacters
+listed above, with the exception that the alias name may not
+contain \fI=\fP.  The first word of the replacement text is tested
+for aliases, but a word that is identical to an alias being expanded
+is not expanded a second time.  This means that one may alias
+.B ls
+to
+.BR "ls \-F" ,
+for instance, and
+.B bash
+does not try to recursively expand the replacement text.
+If the last character of the alias value is a
+.IR blank ,
+then the next command
+word following the alias is also checked for alias expansion.
+.PP
+Aliases are created and listed with the
+.B alias
+command, and removed with the
+.B unalias
+command.
+.PP
+There is no mechanism for using arguments in the replacement text.
+If arguments are needed, a shell function should be used (see
+.SM
+.B FUNCTIONS
+below).
+.PP
+Aliases are not expanded when the shell is not interactive, unless
+the
+.B expand_aliases
+shell option is set using
+.B shopt
+(see the description of
+.B shopt
+under
+.SM
+\fBSHELL BUILTIN COMMANDS\fP
+below).
+.PP
+The rules concerning the definition and use of aliases are
+somewhat confusing.
+.B Bash
+always reads at least one complete line
+of input before executing any
+of the commands on that line.  Aliases are expanded when a
+command is read, not when it is executed.  Therefore, an
+alias definition appearing on the same line as another
+command does not take effect until the next line of input is read.
+The commands following the alias definition
+on that line are not affected by the new alias.
+This behavior is also an issue when functions are executed.
+Aliases are expanded when a function definition is read,
+not when the function is executed, because a function definition
+is itself a compound command.  As a consequence, aliases
+defined in a function are not available until after that
+function is executed.  To be safe, always put
+alias definitions on a separate line, and do not use
+.B alias
+in compound commands.
+.PP
+For almost every purpose, aliases are superseded by
+shell functions.
+.SH FUNCTIONS
+A shell function, defined as described above under
+.SM
+.BR "SHELL GRAMMAR" ,
+stores a series of commands for later execution.
+When the name of a shell function is used as a simple command name,
+the list of commands associated with that function name is executed.
+Functions are executed in the context of the
+current shell; no new process is created to interpret
+them (contrast this with the execution of a shell script).
+When a function is executed, the arguments to the
+function become the positional parameters
+during its execution.
+The special parameter
+.B #
+is updated to reflect the change.  Positional parameter 0
+is unchanged.
+The first element of the
+.SM
+.B FUNCNAME
+variable is set to the name of the function while the function
+is executing.
+All other aspects of the shell execution
+environment are identical between a function and its caller
+with the exception that the
+.SM
+.B DEBUG
+trap (see the description of the
+.B trap
+builtin under
+.SM
+.B SHELL BUILTIN COMMANDS
+below) is not inherited unless the function has been given the
+\fBtrace\fP attribute (see the description of the
+.SM
+.B declare
+builtin below) or the
+\fB\-o functrace\fP shell option has been enabled with
+the \fBset\fP builtin
+(in which case all functions inherit the \fBDEBUG\fP trap).
+.PP
+Variables local to the function may be declared with the
+.B local
+builtin command.  Ordinarily, variables and their values
+are shared between the function and its caller.
+.PP
+If the builtin command
+.B return
+is executed in a function, the function completes and
+execution resumes with the next command after the function
+call.
+Any command associated with the \fBRETURN\fP trap is executed
+before execution resumes.
+When a function completes, the values of the
+positional parameters and the special parameter
+.B #
+are restored to the values they had prior to the function's
+execution.
+.PP
+Function names and definitions may be listed with the
+.B \-f
+option to the
+.B declare
+or
+.B typeset
+builtin commands.  The
+.B \-F
+option to
+.B declare
+or
+.B typeset
+will list the function names only
+(and optionally the source file and line number, if the \fBextdebug\fP
+shell option is enabled).
+Functions may be exported so that subshells
+automatically have them defined with the
+.B \-f
+option to the 
+.B export
+builtin.
+Note that shell functions and variables with the same name may result
+in multiple identically-named entries in the environment passed to the
+shell's children.
+Care should be taken in cases where this may cause a problem.
+.PP
+Functions may be recursive.  No limit is imposed on the number
+of recursive calls.
+.SH "ARITHMETIC EVALUATION"
+The shell allows arithmetic expressions to be evaluated, under
+certain circumstances (see the \fBlet\fP and \fBdeclare\fP builtin
+commands and \fBArithmetic Expansion\fP).
+Evaluation is done in fixed-width integers with no check for overflow,
+though division by 0 is trapped and flagged as an error.
+The operators and their precedence, associativity, and values
+are the same as in the C language.
+The following list of operators is grouped into levels of
+equal-precedence operators.
+The levels are listed in order of decreasing precedence.
+.PP
+.PD 0
+.TP
+.B \fIid\fP++ \fIid\fP\-\-
+variable post-increment and post-decrement
+.TP
+.B ++\fIid\fP \-\-\fIid\fP
+variable pre-increment and pre-decrement
+.TP
+.B \- +
+unary minus and plus
+.TP
+.B ! ~
+logical and bitwise negation
+.TP
+.B **
+exponentiation
+.TP
+.B * / %
+multiplication, division, remainder
+.TP
+.B + \-
+addition, subtraction
+.TP
+.B << >>
+left and right bitwise shifts
+.TP
+.B <= >= < >
+comparison
+.TP
+.B == !=
+equality and inequality
+.TP
+.B &
+bitwise AND
+.TP
+.B ^
+bitwise exclusive OR
+.TP
+.B |
+bitwise OR
+.TP
+.B &&
+logical AND
+.TP
+.B ||
+logical OR
+.TP
+.B \fIexpr\fP?\fIexpr\fP:\fIexpr\fP
+conditional operator
+.TP
+.B = *= /= %= += \-= <<= >>= &= ^= |=
+assignment
+.TP
+.B \fIexpr1\fP , \fIexpr2\fP
+comma
+.PD
+.PP
+Shell variables are allowed as operands; parameter expansion is
+performed before the expression is evaluated.
+Within an expression, shell variables may also be referenced by name
+without using the parameter expansion syntax.
+A shell variable that is null or unset evaluates to 0 when referenced
+by name without using the parameter expansion syntax.
+The value of a variable is evaluated as an arithmetic expression
+when it is referenced, or when a variable which has been given the
+\fIinteger\fP attribute using \fBdeclare -i\fP is assigned a value.
+A null value evaluates to 0.
+A shell variable need not have its integer attribute
+turned on to be used in an expression.
+.PP
+Constants with a leading 0 are interpreted as octal numbers.
+A leading 0x or 0X denotes hexadecimal.
+Otherwise, numbers take the form [\fIbase#\fP]n, where \fIbase\fP
+is a decimal number between 2 and 64 representing the arithmetic
+base, and \fIn\fP is a number in that base.
+If \fIbase#\fP is omitted, then base 10 is used.
+The digits greater than 9 are represented by the lowercase letters,
+the uppercase letters, @, and _, in that order.
+If \fIbase\fP is less than or equal to 36, lowercase and uppercase
+letters may be used interchangably to represent numbers between 10
+and 35.
+.PP
+Operators are evaluated in order of precedence.  Sub-expressions in
+parentheses are evaluated first and may override the precedence
+rules above.
+.SH "CONDITIONAL EXPRESSIONS"
+Conditional expressions are used by the \fB[[\fP compound command and
+the \fBtest\fP and \fB[\fP builtin commands to test file attributes
+and perform string and arithmetic comparisons.
+Expressions are formed from the following unary or binary primaries.
+If any \fIfile\fP argument to one of the primaries is of the form
+\fI/dev/fd/n\fP, then file descriptor \fIn\fP is checked.
+If the \fIfile\fP argument to one of the primaries is one of
+\fI/dev/stdin\fP, \fI/dev/stdout\fP, or \fI/dev/stderr\fP, file
+descriptor 0, 1, or 2, respectively, is checked.
+.sp 1
+.PD 0
+.TP
+.B \-a \fIfile\fP
+True if \fIfile\fP exists.
+.TP
+.B \-b \fIfile\fP
+True if \fIfile\fP exists and is a block special file.
+.TP
+.B \-c \fIfile\fP
+True if \fIfile\fP exists and is a character special file.
+.TP
+.B \-d \fIfile\fP
+True if \fIfile\fP exists and is a directory.
+.TP
+.B \-e \fIfile\fP
+True if \fIfile\fP exists.
+.TP
+.B \-f \fIfile\fP
+True if \fIfile\fP exists and is a regular file.
+.TP
+.B \-g \fIfile\fP
+True if \fIfile\fP exists and is set-group-id.
+.TP
+.B \-h \fIfile\fP
+True if \fIfile\fP exists and is a symbolic link.
+.TP
+.B \-k \fIfile\fP
+True if \fIfile\fP exists and its ``sticky'' bit is set.
+.TP
+.B \-p \fIfile\fP
+True if \fIfile\fP exists and is a named pipe (FIFO).
+.TP
+.B \-r \fIfile\fP
+True if \fIfile\fP exists and is readable.
+.TP
+.B \-s \fIfile\fP
+True if \fIfile\fP exists and has a size greater than zero.
+.TP
+.B \-t \fIfd\fP
+True if file descriptor
+.I fd
+is open and refers to a terminal.
+.TP
+.B \-u \fIfile\fP
+True if \fIfile\fP exists and its set-user-id bit is set.
+.TP
+.B \-w \fIfile\fP
+True if \fIfile\fP exists and is writable.
+.TP
+.B \-x \fIfile\fP
+True if \fIfile\fP exists and is executable.
+.TP
+.B \-O \fIfile\fP
+True if \fIfile\fP exists and is owned by the effective user id.
+.TP
+.B \-G \fIfile\fP
+True if \fIfile\fP exists and is owned by the effective group id.
+.TP
+.B \-L \fIfile\fP
+True if \fIfile\fP exists and is a symbolic link.
+.TP
+.B \-S \fIfile\fP
+True if \fIfile\fP exists and is a socket.
+.TP
+.B \-N \fIfile\fP
+True if \fIfile\fP exists and has been modified since it was last read.
+.TP
+\fIfile1\fP \-\fBnt\fP \fIfile2\fP
+True if \fIfile1\fP is newer (according to modification date) than \fIfile2\fP,
+or if \fIfile1\fP exists and \fPfile2\fP does not.
+.TP
+\fIfile1\fP \-\fBot\fP \fIfile2\fP
+True if \fIfile1\fP is older than \fIfile2\fP, or if \fIfile2\fP exists
+and \fIfile1\fP does not.
+.TP
+\fIfile1\fP \fB\-ef\fP \fIfile2\fP
+True if \fIfile1\fP and \fIfile2\fP refer to the same device and
+inode numbers.
+.TP
+.B \-o \fIoptname\fP
+True if shell option
+.I optname
+is enabled.
+See the list of options under the description of the
+.B \-o
+option to the
+.B set
+builtin below.
+.TP
+.B \-z \fIstring\fP
+True if the length of \fIstring\fP is zero.
+.TP
+.B \-n \fIstring\fP
+.TP
+\fIstring\fP
+True if the length of
+.I string
+is non-zero.
+.TP
+\fIstring1\fP \fB==\fP \fIstring2\fP
+True if the strings are equal.  \fB=\fP may be used in place of
+\fB==\fP for strict POSIX compliance.
+.TP
+\fIstring1\fP \fB!=\fP \fIstring2\fP
+True if the strings are not equal.
+.TP
+\fIstring1\fP \fB<\fP \fIstring2\fP
+True if \fIstring1\fP sorts before \fIstring2\fP lexicographically
+in the current locale.
+.TP
+\fIstring1\fP \fB>\fP \fIstring2\fP
+True if \fIstring1\fP sorts after \fIstring2\fP lexicographically
+in the current locale.
+.TP
+.I \fIarg1\fP \fBOP\fP \fIarg2\fP
+.SM
+.B OP
+is one of
+.BR \-eq ,
+.BR \-ne ,
+.BR \-lt ,
+.BR \-le ,
+.BR \-gt ,
+or
+.BR \-ge .
+These arithmetic binary operators return true if \fIarg1\fP
+is equal to, not equal to, less than, less than or equal to,
+greater than, or greater than or equal to \fIarg2\fP, respectively.
+.I Arg1
+and
+.I arg2
+may be positive or negative integers.
+.PD
+.SH "SIMPLE COMMAND EXPANSION"
+When a simple command is executed, the shell performs the following
+expansions, assignments, and redirections, from left to right.
+.IP 1.
+The words that the parser has marked as variable assignments (those
+preceding the command name) and redirections are saved for later
+processing.
+.IP 2.
+The words that are not variable assignments or redirections are
+expanded.  If any words remain after expansion, the first word
+is taken to be the name of the command and the remaining words are
+the arguments.
+.IP 3.
+Redirections are performed as described above under
+.SM
+.BR REDIRECTION .
+.IP 4.
+The text after the \fB=\fP in each variable assignment undergoes tilde
+expansion, parameter expansion, command substitution, arithmetic expansion,
+and quote removal before being assigned to the variable.
+.PP
+If no command name results, the variable assignments affect the current
+shell environment.  Otherwise, the variables are added to the environment
+of the executed command and do not affect the current shell environment.
+If any of the assignments attempts to assign a value to a readonly variable,
+an error occurs, and the command exits with a non-zero status.
+.PP
+If no command name results, redirections are performed, but do not
+affect the current shell environment.  A redirection error causes the
+command to exit with a non-zero status.
+.PP
+If there is a command name left after expansion, execution proceeds as
+described below.  Otherwise, the command exits.  If one of the expansions
+contained a command substitution, the exit status of the command is
+the exit status of the last command substitution performed.  If there
+were no command substitutions, the command exits with a status of zero.
+.SH "COMMAND EXECUTION"
+After a command has been split into words, if it results in a
+simple command and an optional list of arguments, the following
+actions are taken.
+.PP
+If the command name contains no slashes, the shell attempts to
+locate it.  If there exists a shell function by that name, that
+function is invoked as described above in
+.SM
+.BR FUNCTIONS .
+If the name does not match a function, the shell searches for
+it in the list of shell builtins.  If a match is found, that
+builtin is invoked.
+.PP
+If the name is neither a shell function nor a builtin,
+and contains no slashes,
+.B bash
+searches each element of the
+.SM
+.B PATH
+for a directory containing an executable file by that name.
+.B Bash
+uses a hash table to remember the full pathnames of executable
+files (see
+.B hash
+under
+.SM
+.B "SHELL BUILTIN COMMANDS"
+below).
+A full search of the directories in
+.SM
+.B PATH
+is performed only if the command is not found in the hash table.
+If the search is unsuccessful, the shell prints an error
+message and returns an exit status of 127.
+.PP
+If the search is successful, or if the command name contains
+one or more slashes, the shell executes the named program in a
+separate execution environment.
+Argument 0 is set to the name given, and the remaining arguments
+to the command are set to the arguments given, if any.
+.PP
+If this execution fails because the file is not in executable
+format, and the file is not a directory, it is assumed to be
+a \fIshell script\fP, a file
+containing shell commands.  A subshell is spawned to execute
+it.  This subshell reinitializes itself, so
+that the effect is as if a new shell had been invoked
+to handle the script, with the exception that the locations of
+commands remembered by the parent (see
+.B hash
+below under
+.SM
+\fBSHELL BUILTIN COMMANDS\fP)
+are retained by the child.
+.PP
+If the program is a file beginning with
+.BR #! ,
+the remainder of the first line specifies an interpreter
+for the program.  The shell executes the
+specified interpreter on operating systems that do not
+handle this executable format themselves.  The arguments to the 
+interpreter consist of a single optional argument following the
+interpreter name on the first line of the program, followed
+by the name of the program, followed by the command
+arguments, if any.
+.SH COMMAND EXECUTION ENVIRONMENT
+The shell has an \fIexecution environment\fP, which consists of the
+following:
+.sp 1
+.IP \(bu
+open files inherited by the shell at invocation, as modified by
+redirections supplied to the \fBexec\fP builtin
+.IP \(bu
+the current working directory as set by \fBcd\fP, \fBpushd\fP, or
+\fBpopd\fP, or inherited by the shell at invocation
+.IP \(bu
+the file creation mode mask as set by \fBumask\fP or inherited from
+the shell's parent
+.IP \(bu
+current traps set by \fBtrap\fP
+.IP \(bu
+shell parameters that are set by variable assignment or with \fBset\fP
+or inherited from the shell's parent in the environment
+.IP \(bu
+shell functions defined during execution or inherited from the shell's
+parent in the environment
+.IP \(bu
+options enabled at invocation (either by default or with command-line
+arguments) or by \fBset\fP
+.IP \(bu
+options enabled by \fBshopt\fP
+.IP \(bu
+shell aliases defined with \fBalias\fP
+.IP \(bu
+various process IDs, including those of background jobs, the value
+of \fB$$\fP, and the value of \fB$PPID\fP
+.PP
+When a simple command other than a builtin or shell function
+is to be executed, it
+is invoked in a separate execution environment that consists of
+the following.  Unless otherwise noted, the values are inherited
+from the shell.
+.sp 1
+.IP \(bu
+the shell's open files, plus any modifications and additions specified
+by redirections to the command
+.IP \(bu
+the current working directory
+.IP \(bu
+the file creation mode mask
+.IP \(bu
+shell variables and functions marked for export, along with variables
+exported for the command, passed in the environment
+.IP \(bu
+traps caught by the shell are reset to the values the inherited
+from the shell's parent, and traps ignored by the shell are ignored
+.PP
+A command invoked in this separate environment cannot affect the
+shell's execution environment. 
+.PP
+Command substitution and asynchronous commands are invoked in a
+subshell environment that is a duplicate of the shell environment,
+except that traps caught by the shell are reset to the values
+that the shell inherited from its parent at invocation.  Builtin
+commands that are invoked as part of a pipeline are also executed in a
+subshell environment.  Changes made to the subshell environment
+cannot affect the shell's execution environment.
+.PP
+If a command is followed by a \fB&\fP and job control is not active, the
+default standard input for the command is the empty file \fI/dev/null\fP.
+Otherwise, the invoked command inherits the file descriptors of the calling
+shell as modified by redirections.
+.SH ENVIRONMENT
+When a program is invoked it is given an array of strings
+called the
+.IR environment .
+This is a list of 
+\fIname\fP\-\fIvalue\fP pairs, of the form
+.IR "name\fR=\fPvalue" .
+.PP
+The shell provides several ways to manipulate the environment.
+On invocation, the shell scans its own environment and
+creates a parameter for each name found, automatically marking
+it for
+.I export
+to child processes.  Executed commands inherit the environment.
+The
+.B export
+and
+.B declare \-x
+commands allow parameters and functions to be added to and
+deleted from the environment.  If the value of a parameter
+in the environment is modified, the new value becomes part
+of the environment, replacing the old.  The environment
+inherited by any executed command consists of the shell's
+initial environment, whose values may be modified in the shell,
+less any pairs removed by the
+.B unset
+command, plus any additions via the
+.B export
+and
+.B declare \-x
+commands.
+.PP
+The environment for any
+.I simple command
+or function may be augmented temporarily by prefixing it with
+parameter assignments, as described above in
+.SM
+.BR PARAMETERS .
+These assignment statements affect only the environment seen
+by that command.
+.PP
+If the 
+.B \-k
+option is set (see the
+.B set
+builtin command below), then
+.I all
+parameter assignments are placed in the environment for a command,
+not just those that precede the command name.
+.PP
+When
+.B bash
+invokes an external command, the variable
+.B _
+is set to the full file name of the command and passed to that
+command in its environment.
+.SH "EXIT STATUS"
+For the shell's purposes, a command which exits with a 
+zero exit status has succeeded.  An exit status of zero
+indicates success.  A non-zero exit status indicates failure.
+When a command terminates on a fatal signal \fIN\fP, \fBbash\fP uses
+the value of 128+\fIN\fP as the exit status.
+.PP
+If a command is not found, the child process created to
+execute it returns a status of 127.  If a command is found
+but is not executable, the return status is 126.
+.PP
+If a command fails because of an error during expansion or redirection,
+the exit status is greater than zero.
+.PP
+Shell builtin commands return a status of 0 (\fItrue\fP) if
+successful, and non-zero (\fIfalse\fP) if an error occurs
+while they execute. 
+All builtins return an exit status of 2 to indicate incorrect usage.
+.PP
+\fBBash\fP itself returns the exit status of the last command
+executed, unless a syntax error occurs, in which case it exits
+with a non-zero value.  See also the \fBexit\fP builtin
+command below.
+.SH SIGNALS
+When \fBbash\fP is interactive, in the absence of any traps, it ignores
+.SM
+.B SIGTERM
+(so that \fBkill 0\fP does not kill an interactive shell),
+and
+.SM
+.B SIGINT
+is caught and handled (so that the \fBwait\fP builtin is interruptible).
+In all cases, \fBbash\fP ignores
+.SM
+.BR SIGQUIT .
+If job control is in effect,
+.B bash
+ignores
+.SM
+.BR SIGTTIN ,
+.SM
+.BR SIGTTOU ,
+and
+.SM
+.BR SIGTSTP .
+.PP
+Synchronous jobs started by \fBbash\fP have signal handlers
+set to the values inherited by the shell from its parent.
+When job control is not in effect, asynchronous commands
+ignore
+.SM
+.B SIGINT
+and
+.SM
+.B SIGQUIT
+as well.
+Commands run as a result of command substitution ignore the
+keyboard-generated job control signals
+.SM
+.BR SIGTTIN ,
+.SM
+.BR SIGTTOU ,
+and
+.SM
+.BR SIGTSTP .
+.PP
+The shell exits by default upon receipt of a
+.SM
+.BR SIGHUP .
+Before exiting, an interactive shell resends the
+.SM
+.B SIGHUP
+to all jobs, running or stopped.
+Stopped jobs are sent
+.SM
+.B SIGCONT
+to ensure that they receive the
+.SM
+.BR SIGHUP .
+To prevent the shell from
+sending the signal to a particular job, it should be removed from the
+jobs table with the 
+.B disown
+builtin (see
+.SM
+.B "SHELL BUILTIN COMMANDS"
+below) or marked 
+to not receive
+.SM
+.B SIGHUP
+using
+.BR "disown \-h" .
+.PP
+If the
+.B huponexit
+shell option has been set with
+.BR shopt ,
+.B bash
+sends a 
+.SM
+.B SIGHUP
+to all jobs when an interactive login shell exits.
+.PP
+When \fBbash\fP receives a signal for which a trap has been set while
+waiting for a command to complete, the trap will not be executed until
+the command completes.
+When \fBbash\fP is waiting for an asynchronous command via the \fBwait\fP
+builtin, the reception of a signal for which a trap has been set will
+cause the \fBwait\fP builtin to return immediately with an exit status
+greater than 128, immediately after which the trap is executed.
+.SH "JOB CONTROL"
+.I Job control
+refers to the ability to selectively stop (\fIsuspend\fP)
+the execution of processes and continue (\fIresume\fP)
+their execution at a later point.  A user typically employs
+this facility via an interactive interface supplied jointly
+by the system's terminal driver and
+.BR bash .
+.PP
+The shell associates a
+.I job
+with each pipeline.  It keeps a table of currently executing
+jobs, which may be listed with the
+.B jobs
+command.  When
+.B bash
+starts a job asynchronously (in the
+.IR background ),
+it prints a line that looks like:
+.RS
+.PP
+[1] 25647
+.RE
+.PP
+indicating that this job is job number 1 and that the process ID
+of the last process in the pipeline associated with this job is 25647.
+All of the processes in a single pipeline are members of the same job.
+.B Bash
+uses the
+.I job
+abstraction as the basis for job control.
+.PP
+To facilitate the implementation of the user interface to job
+control, the operating system maintains the notion of a \fIcurrent terminal
+process group ID\fP.  Members of this process group (processes whose
+process group ID is equal to the current terminal process group ID)
+receive keyboard-generated signals such as
+.SM
+.BR SIGINT .
+These processes are said to be in the
+.IR foreground .
+.I Background
+processes are those whose process group ID differs from the terminal's;
+such processes are immune to keyboard-generated signals.
+Only foreground processes are allowed to read from or write to the
+terminal.  Background processes which attempt to read from (write to) the
+terminal are sent a 
+.SM
+.B SIGTTIN (SIGTTOU)
+signal by the terminal driver, 
+which, unless caught, suspends the process.
+.PP
+If the operating system on which
+.B bash
+is running supports
+job control,
+.B bash
+contains facilities to use it.
+Typing the
+.I suspend
+character (typically
+.BR ^Z ,
+Control-Z) while a process is running
+causes that process to be stopped and returns control to 
+.BR bash .
+Typing the
+.I "delayed suspend"
+character (typically
+.BR ^Y ,
+Control-Y) causes the process to be stopped when it
+attempts to read input from the terminal, and control to
+be returned to
+.BR bash .
+The user may then manipulate the state of this job, using the
+.B bg
+command to continue it in the background, the
+.B fg
+command to continue it in the foreground, or
+the
+.B kill
+command to kill it.  A \fB^Z\fP takes effect immediately,
+and has the additional side effect of causing pending output
+and typeahead to be discarded.
+.PP
+There are a number of ways to refer to a job in the shell.
+The character
+.B %
+introduces a job name.  Job number
+.I n
+may be referred to as
+.BR %n .
+A job may also be referred to using a prefix of the name used to
+start it, or using a substring that appears in its command line.
+For example,
+.B %ce
+refers to a stopped
+.B ce
+job.  If a prefix matches more than one job,
+.B bash
+reports an error.  Using
+.BR %?ce ,
+on the other hand, refers to any job containing the string
+.B ce
+in its command line.  If the substring matches more than one job,
+.B bash
+reports an error.  The symbols
+.B %%
+and
+.B %+
+refer to the shell's notion of the
+.IR "current job" ,
+which is the last job stopped while it was in
+the foreground or started in the background.
+The 
+.I "previous job"
+may be referenced using
+.BR %\- .
+In output pertaining to jobs (e.g., the output of the
+.B jobs
+command), the current job is always flagged with a
+.BR + ,
+and the previous job with a
+.BR \- .
+.PP
+Simply naming a job can be used to bring it into the
+foreground:
+.B %1
+is a synonym for
+\fB``fg %1''\fP,
+bringing job 1 from the background into the foreground.
+Similarly,
+.B ``%1 &''
+resumes job 1 in the background, equivalent to
+\fB``bg %1''\fP.
+.PP
+The shell learns immediately whenever a job changes state.
+Normally,
+.B bash
+waits until it is about to print a prompt before reporting
+changes in a job's status so as to not interrupt
+any other output.  If the 
+.B \-b
+option to the
+.B set
+builtin command
+is enabled,
+.B bash
+reports such changes immediately.
+Any trap on
+.SM
+.B SIGCHLD
+is executed for each child that exits.
+.PP
+If an attempt to exit
+.B bash
+is made while jobs are stopped, the shell prints a warning message.  The
+.B jobs
+command may then be used to inspect their status.
+If a second attempt to exit is made without an intervening command,
+the shell does not print another warning, and the stopped
+jobs are terminated.
+.SH PROMPTING
+When executing interactively, 
+.B bash
+displays the primary prompt
+.SM
+.B PS1
+when it is ready to read a command, and the secondary prompt
+.SM
+.B PS2
+when it needs more input to complete a command.
+.B Bash
+allows these prompt strings to be customized by inserting a number of
+backslash-escaped special characters that are decoded as follows:
+.RS
+.PD 0
+.TP
+.B \ea
+an ASCII bell character (07)
+.TP
+.B \ed
+the date in "Weekday Month Date" format (e.g., "Tue May 26")
+.TP
+.B \eD{\fIformat\fP}
+the \fIformat\fP is passed to \fIstrftime\fP(3) and the result is inserted
+into the prompt string; an empty \fIformat\fP results in a locale-specific
+time representation.  The braces are required
+.TP
+.B \ee
+an ASCII escape character (033)
+.TP
+.B \eh
+the hostname up to the first `.'
+.TP
+.B \eH
+the hostname
+.TP
+.B \ej
+the number of jobs currently managed by the shell
+.TP
+.B \el
+the basename of the shell's terminal device name
+.TP
+.B \en
+newline
+.TP
+.B \er
+carriage return
+.TP
+.B \es
+the name of the shell, the basename of
+.B $0
+(the portion following the final slash)
+.TP
+.B \et
+the current time in 24-hour HH:MM:SS format
+.TP
+.B \eT
+the current time in 12-hour HH:MM:SS format
+.TP
+.B \e@
+the current time in 12-hour am/pm format
+.TP
+.B \eA
+the current time in 24-hour HH:MM format
+.TP
+.B \eu
+the username of the current user
+.TP
+.B \ev
+the version of \fBbash\fP (e.g., 2.00)
+.TP
+.B \eV
+the release of \fBbash\fP, version + patchelvel (e.g., 2.00.0)
+.TP
+.B \ew
+the current working directory
+.TP
+.B \eW
+the basename of the current working directory
+.TP
+.B \e!
+the history number of this command
+.TP
+.B \e#
+the command number of this command
+.TP
+.B \e$
+if the effective UID is 0, a
+.BR # ,
+otherwise a
+.B $
+.TP
+.B \e\fInnn\fP
+the character corresponding to the octal number \fInnn\fP
+.TP
+.B \e\e
+a backslash
+.TP
+.B \e[
+begin a sequence of non-printing characters, which could be used to
+embed a terminal control sequence into the prompt
+.TP
+.B \e]
+end a sequence of non-printing characters
+.PD
+.RE
+.PP
+The command number and the history number are usually different:
+the history number of a command is its position in the history
+list, which may include commands restored from the history file
+(see
+.SM
+.B HISTORY
+below), while the command number is the position in the sequence
+of commands executed during the current shell session.
+After the string is decoded, it is expanded via
+parameter expansion, command substitution, arithmetic
+expansion, and quote removal, subject to the value of the
+.B promptvars
+shell option (see the description of the
+.B shopt
+command under
+.SM
+.B "SHELL BUILTIN COMMANDS"
+below).
+.SH READLINE
+This is the library that handles reading input when using an interactive
+shell, unless the
+.B \-\-noediting
+option is given at shell invocation.
+By default, the line editing commands are similar to those of emacs.
+A vi-style line editing interface is also available.
+To turn off line editing after the shell is running, use the
+.B +o emacs
+or
+.B +o vi
+options to the
+.B set
+builtin (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+.SS "Readline Notation"
+.PP
+In this section, the emacs-style notation is used to denote
+keystrokes.  Control keys are denoted by C\-\fIkey\fR, e.g., C\-n
+means Control\-N.  Similarly, 
+.I meta
+keys are denoted by M\-\fIkey\fR, so M\-x means Meta\-X.  (On keyboards
+without a 
+.I meta
+key, M\-\fIx\fP means ESC \fIx\fP, i.e., press the Escape key
+then the
+.I x
+key.  This makes ESC the \fImeta prefix\fP.
+The combination M\-C\-\fIx\fP means ESC\-Control\-\fIx\fP,
+or press the Escape key
+then hold the Control key while pressing the
+.I x
+key.)
+.PP
+Readline commands may be given numeric
+.IR arguments ,
+which normally act as a repeat count.
+Sometimes, however, it is the sign of the argument that is significant.
+Passing a negative argument to a command that acts in the forward
+direction (e.g., \fBkill\-line\fP) causes that command to act in a
+backward direction. 
+Commands whose behavior with arguments deviates from this are noted
+below.
+.PP
+When a command is described as \fIkilling\fP text, the text
+deleted is saved for possible future retrieval
+(\fIyanking\fP).  The killed text is saved in a
+\fIkill ring\fP.  Consecutive kills cause the text to be
+accumulated into one unit, which can be yanked all at once. 
+Commands which do not kill text separate the chunks of text
+on the kill ring.
+.SS "Readline Initialization"
+.PP
+Readline is customized by putting commands in an initialization
+file (the \fIinputrc\fP file).
+The name of this file is taken from the value of the
+.SM
+.B INPUTRC
+variable.  If that variable is unset, the default is
+.IR ~/.inputrc .
+When a program which uses the readline library starts up, the
+initialization file is read, and the key bindings and variables
+are set.
+There are only a few basic constructs allowed in the
+readline initialization file.
+Blank lines are ignored.
+Lines beginning with a \fB#\fP are comments.
+Lines beginning with a \fB$\fP indicate conditional constructs.
+Other lines denote key bindings and variable settings.
+.PP
+The default key-bindings may be changed with an
+.I inputrc 
+file.
+Other programs that use this library may add their own commands
+and bindings.
+.PP
+For example, placing
+.RS
+.PP
+M\-Control\-u: universal\-argument
+.RE
+or
+.RS
+C\-Meta\-u: universal\-argument
+.RE
+into the 
+.I inputrc
+would make M\-C\-u execute the readline command
+.IR universal\-argument .
+.PP
+The following symbolic character names are recognized:
+.IR RUBOUT ,
+.IR DEL ,
+.IR ESC ,
+.IR LFD ,
+.IR NEWLINE ,
+.IR RET ,
+.IR RETURN ,
+.IR SPC ,
+.IR SPACE ,
+and
+.IR TAB .
+.PP
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a \fImacro\fP).
+.SS "Readline Key Bindings"
+.PP
+The syntax for controlling key bindings in the
+.I inputrc
+file is simple.  All that is required is the name of the
+command or the text of a macro and a key sequence to which
+it should be bound. The name may be specified in one of two ways:
+as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP
+prefixes, or as a key sequence.
+.PP
+When using the form \fBkeyname\fP:\^\fIfunction\-name\fP or \fImacro\fP,
+.I keyname
+is the name of a key spelled out in English.  For example:
+.sp
+.RS
+Control-u: universal\-argument
+.br
+Meta-Rubout: backward-kill-word
+.br
+Control-o: "> output"
+.RE
+.LP
+In the above example,
+.I C\-u
+is bound to the function
+.BR universal\-argument ,
+.I M\-DEL
+is bound to the function
+.BR backward\-kill\-word ,
+and
+.I C\-o
+is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+.if t \f(CW> output\fP
+.if n ``> output''
+into the line).
+.PP
+In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP,
+.B keyseq
+differs from
+.B keyname
+above in that strings denoting
+an entire key sequence may be specified by placing the sequence
+within double quotes.  Some GNU Emacs style key escapes can be
+used, as in the following example, but the symbolic character names
+are not recognized.
+.sp
+.RS
+"\eC\-u": universal\-argument
+.br
+"\eC\-x\eC\-r": re\-read\-init\-file
+.br
+"\ee[11~": "Function Key 1"
+.RE
+.PP
+In this example,
+.I C\-u
+is again bound to the function
+.BR universal\-argument .
+.I "C\-x C\-r"
+is bound to the function
+.BR re\-read\-init\-file ,
+and 
+.I "ESC [ 1 1 ~"
+is bound to insert the text
+.if t \f(CWFunction Key 1\fP.
+.if n ``Function Key 1''.
+.PP
+The full set of GNU Emacs style escape sequences is
+.RS
+.PD 0
+.TP
+.B \eC\-
+control prefix
+.TP
+.B \eM\-
+meta prefix
+.TP
+.B \ee
+an escape character
+.TP
+.B \e\e
+backslash
+.TP
+.B \e"
+literal "
+.TP
+.B \e'
+literal '
+.RE
+.PD
+.PP
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+.RS
+.PD 0
+.TP
+.B \ea
+alert (bell)
+.TP
+.B \eb
+backspace
+.TP
+.B \ed
+delete
+.TP
+.B \ef
+form feed
+.TP
+.B \en
+newline
+.TP
+.B \er
+carriage return
+.TP
+.B \et
+horizontal tab
+.TP
+.B \ev
+vertical tab
+.TP
+.B \e\fInnn\fP
+the eight-bit character whose value is the octal value \fInnn\fP
+(one to three digits)
+.TP
+.B \ex\fIHH\fP
+the eight-bit character whose value is the hexadecimal value \fIHH\fP
+(one or two hex digits)
+.RE
+.PD
+.PP
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including " and '.
+.PP
+.B Bash
+allows the current readline key bindings to be displayed or modified
+with the
+.B bind
+builtin command.  The editing mode may be switched during interactive
+use by using the
+.B \-o
+option to the
+.B set
+builtin command (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).
+.SS "Readline Variables"
+.PP
+Readline has variables that can be used to further customize its
+behavior.  A variable may be set in the
+.I inputrc
+file with a statement of the form
+.RS
+.PP
+\fBset\fP \fIvariable\-name\fP \fIvalue\fP
+.RE
+.PP
+Except where noted, readline variables can take the values
+.B On
+or
+.BR Off .
+The variables and their default values are:
+.PP
+.PD 0
+.TP
+.B bell\-style (audible)
+Controls what happens when readline wants to ring the terminal bell.
+If set to \fBnone\fP, readline never rings the bell.  If set to
+\fBvisible\fP, readline uses a visible bell if one is available.
+If set to \fBaudible\fP, readline attempts to ring the terminal's bell.
+.TP
+.B comment\-begin (``#'')
+The string that is inserted when the readline
+.B insert\-comment
+command is executed.
+This command is bound to
+.B M\-#
+in emacs mode and to
+.B #
+in vi command mode.
+.TP
+.B completion\-ignore\-case (Off)
+If set to \fBOn\fP, readline performs filename matching and completion
+in a case\-insensitive fashion.
+.TP
+.B completion\-query\-items (100)
+This determines when the user is queried about viewing
+the number of possible completions
+generated by the \fBpossible\-completions\fP command.
+It may be set to any integer value greater than or equal to
+zero.  If the number of possible completions is greater than
+or equal to the value of this variable, the user is asked whether
+or not he wishes to view them; otherwise they are simply listed
+on the terminal.
+.TP
+.B convert\-meta (On)
+If set to \fBOn\fP, readline will convert characters with the
+eighth bit set to an ASCII key sequence
+by stripping the eighth bit and prefixing an
+escape character (in effect, using escape as the \fImeta prefix\fP).
+.TP
+.B disable\-completion (Off)
+If set to \fBOn\fP, readline will inhibit word completion.  Completion
+characters will be inserted into the line as if they had been
+mapped to \fBself-insert\fP.
+.TP
+.B editing\-mode (emacs)
+Controls whether readline begins with a set of key bindings similar
+to \fIemacs\fP or \fIvi\fP.
+.B editing\-mode
+can be set to either
+.B emacs
+or
+.BR vi .
+.TP
+.B enable\-keypad (Off)
+When set to \fBOn\fP, readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.
+.TP
+.B expand\-tilde (Off)
+If set to \fBon\fP, tilde expansion is performed when readline
+attempts word completion.
+.TP
+.B history-preserve-point
+If set to \fBon\fP, the history code attempts to place point at the
+same location on each history line retrived with \fBprevious-history\fP
+or \fBnext-history\fP.
+.TP
+.B horizontal\-scroll\-mode (Off)
+When set to \fBOn\fP, makes readline use a single line for display,
+scrolling the input horizontally on a single screen line when it
+becomes longer than the screen width rather than wrapping to a new line.
+.TP
+.B input\-meta (Off)
+If set to \fBOn\fP, readline will enable eight-bit input (that is,
+it will not strip the high bit from the characters it reads),
+regardless of what the terminal claims it can support.  The name
+.B meta\-flag
+is a synonym for this variable.
+.TP
+.B isearch\-terminators (``C\-[C\-J'')
+The string of characters that should terminate an incremental
+search without subsequently executing the character as a command.
+If this variable has not been given a value, the characters
+\fIESC\fP and \fIC\-J\fP will terminate an incremental search.
+.TP
+.B keymap (emacs)
+Set the current readline keymap.  The set of valid keymap names is
+\fIemacs, emacs\-standard, emacs\-meta, emacs\-ctlx, vi,
+vi\-command\fP, and
+.IR vi\-insert .
+\fIvi\fP is equivalent to \fIvi\-command\fP; \fIemacs\fP is
+equivalent to \fIemacs\-standard\fP.  The default value is
+.IR emacs ;
+the value of
+.B editing\-mode
+also affects the default keymap.
+.TP
+.B mark\-directories (On)
+If set to \fBOn\fP, completed directory names have a slash
+appended.
+.TP
+.B mark\-modified\-lines (Off)
+If set to \fBOn\fP, history lines that have been modified are displayed
+with a preceding asterisk (\fB*\fP).
+.TP
+.B mark\-symlinked\-directories (Off)
+If set to \fBOn\fP, completed names which are symbolic links to directories
+have a slash appended (subject to the value of
+\fBmark\-directories\fP).
+.TP
+.B match\-hidden\-files (On)
+This variable, when set to \fBOn\fP, causes readline to match files whose
+names begin with a `.' (hidden files) when performing filename 
+completion, unless the leading `.' is
+supplied by the user in the filename to be completed.
+.TP
+.B output\-meta (Off)
+If set to \fBOn\fP, readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+.TP
+.B page\-completions (On)
+If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager
+to display a screenful of possible completions at a time.
+.TP
+.B print\-completions\-horizontally (Off)
+If set to \fBOn\fP, readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+.TP
+.B show\-all\-if\-ambiguous (Off)
+This alters the default behavior of the completion functions.  If
+set to
+.BR on ,
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+.TP
+.B visible\-stats (Off)
+If set to \fBOn\fP, a character denoting a file's type as reported
+by \fIstat\fP(2) is appended to the filename when listing possible
+completions.
+.PD
+.SS "Readline Conditional Constructs"
+.PP
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+.IP \fB$if\fP
+The 
+.B $if
+construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+.RS
+.IP \fBmode\fP
+The \fBmode=\fP form of the \fB$if\fP directive is used to test
+whether readline is in emacs or vi mode.
+This may be used in conjunction
+with the \fBset keymap\fP command, for instance, to set bindings in
+the \fIemacs\-standard\fP and \fIemacs\-ctlx\fP keymaps only if
+readline is starting out in emacs mode.
+.IP \fBterm\fP
+The \fBterm=\fP form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+.B =
+is tested against the both full name of the terminal and the portion
+of the terminal name before the first \fB\-\fP.  This allows
+.I sun
+to match both
+.I sun
+and
+.IR sun\-cmd ,
+for instance.
+.IP \fBapplication\fP
+The \fBapplication\fP construct is used to include
+application-specific settings.  Each program using the readline
+library sets the \fIapplication name\fP, and an initialization
+file can test for a particular value.
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+.sp 1
+.RS
+.nf
+\fB$if\fP Bash
+# Quote the current or previous word
+"\eC\-xq": "\eeb\e"\eef\e""
+\fB$endif\fP
+.fi
+.RE
+.RE
+.IP \fB$endif\fP
+This command, as seen in the previous example, terminates an
+\fB$if\fP command.
+.IP \fB$else\fP
+Commands in this branch of the \fB$if\fP directive are executed if
+the test fails.
+.IP \fB$include\fP
+This directive takes a single filename as an argument and reads commands
+and bindings from that file.  For example, the following directive
+would read \fI/etc/inputrc\fP:
+.sp 1
+.RS
+.nf
+\fB$include\fP \^ \fI/etc/inputrc\fP
+.fi
+.RE
+.SS Searching
+.PP
+Readline provides commands for searching through the command history
+(see
+.SM
+.B HISTORY
+below) for lines containing a specified string.
+There are two search modes:
+.I incremental
+and
+.IR non-incremental .
+.PP
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+The characters present in the value of the \fBisearch-terminators\fP
+variable are used to terminate an incremental search.
+If that variable has not been assigned a value the Escape and
+Control-J characters will terminate an incremental search.
+Control-G will abort an incremental search and restore the original
+line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+.PP
+To find other matching entries in the history list, type Control-S or
+Control-R as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a readline command will terminate
+the search and execute that command.
+For instance, a \fInewline\fP will terminate the search and accept
+the line, thereby executing the command from the history list.
+.PP
+Readline remembers the last incremental search string.  If two
+Control-Rs are typed without any intervening characters defining a
+new search string, any remembered search string is used.
+.PP
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+.SS "Readline Command Names"
+.PP
+The following is a list of the names of the commands and the default
+key sequences to which they are bound.
+Command names without an accompanying key sequence are unbound by default.
+In the following descriptions, \fIpoint\fP refers to the current cursor
+position, and \fImark\fP refers to a cursor position saved by the
+\fBset\-mark\fP command.
+The text between the point and mark is referred to as the \fIregion\fP.
+.SS Commands for Moving
+.PP
+.PD 0
+.TP
+.B beginning\-of\-line (C\-a)
+Move to the start of the current line.
+.TP
+.B end\-of\-line (C\-e)
+Move to the end of the line.
+.TP
+.B forward\-char (C\-f)
+Move forward a character.
+.TP
+.B backward\-char (C\-b)
+Move back a character.
+.TP
+.B forward\-word (M\-f)
+Move forward to the end of the next word.  Words are composed of
+alphanumeric characters (letters and digits).
+.TP
+.B backward\-word (M\-b)
+Move back to the start of the current or previous word.  Words are
+composed of alphanumeric characters (letters and digits).
+.TP
+.B clear\-screen (C\-l)
+Clear the screen leaving the current line at the top of the screen.
+With an argument, refresh the current line without clearing the
+screen.
+.TP
+.B redraw\-current\-line
+Refresh the current line.
+.PD
+.SS Commands for Manipulating the History
+.PP
+.PD 0
+.TP
+.B accept\-line (Newline, Return)
+Accept the line regardless of where the cursor is.  If this line is
+non-empty, add it to the history list according to the state of the
+.SM
+.B HISTCONTROL
+variable.  If the line is a modified history
+line, then restore the history line to its original state.
+.TP
+.B previous\-history (C\-p)
+Fetch the previous command from the history list, moving back in
+the list.
+.TP
+.B next\-history (C\-n)
+Fetch the next command from the history list, moving forward in the
+list.
+.TP
+.B beginning\-of\-history (M\-<)
+Move to the first line in the history.
+.TP
+.B end\-of\-history (M\->)
+Move to the end of the input history, i.e., the line currently being
+entered.
+.TP
+.B reverse\-search\-history (C\-r)
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+.TP
+.B forward\-search\-history (C\-s)
+Search forward starting at the current line and moving `down' through
+the history as necessary.  This is an incremental search.
+.TP
+.B non\-incremental\-reverse\-search\-history (M\-p)
+Search backward through the history starting at the current line
+using a non-incremental search for a string supplied by the user.
+.TP
+.B non\-incremental\-forward\-search\-history (M\-n)
+Search forward through the history using a non-incremental search for
+a string supplied by the user.
+.TP
+.B history\-search\-forward
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+.TP
+.B history\-search\-backward
+Search backward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+.TP
+.B yank\-nth\-arg (M\-C\-y)
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument
+.IR n ,
+insert the \fIn\fPth word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the \fIn\fPth word from the end of the previous command.
+.TP
+.B
+yank\-last\-arg (M\-.\^, M\-_\^)
+Insert the last argument to the previous command (the last word of
+the previous history entry).  With an argument,
+behave exactly like \fByank\-nth\-arg\fP.
+Successive calls to \fByank\-last\-arg\fP move back through the history
+list, inserting the last argument of each line in turn.
+.TP
+.B shell\-expand\-line (M\-C\-e)
+Expand the line as the shell does.  This
+performs alias and history expansion as well as all of the shell
+word expansions.  See
+.SM
+.B HISTORY EXPANSION
+below for a description of history expansion.
+.TP
+.B history\-expand\-line (M\-^)
+Perform history expansion on the current line.
+See
+.SM
+.B HISTORY EXPANSION
+below for a description of history expansion.
+.TP
+.B magic\-space
+Perform history expansion on the current line and insert a space.
+See
+.SM
+.B HISTORY EXPANSION
+below for a description of history expansion.
+.TP
+.B alias\-expand\-line
+Perform alias expansion on the current line.
+See
+.SM
+.B ALIASES
+above for a description of alias expansion.
+.TP
+.B history\-and\-alias\-expand\-line
+Perform history and alias expansion on the current line.
+.TP
+.B insert\-last\-argument (M\-.\^, M\-_\^)
+A synonym for \fByank\-last\-arg\fP.
+.TP
+.B operate\-and\-get\-next (C\-o)
+Accept the current line for execution and fetch the next line
+relative to the current line from the history for editing.  Any
+argument is ignored.
+.TP
+.B edit\-and\-execute\-command (C\-xC\-e)
+Invoke an editor on the current command line, and execute the result as shell
+commands.
+\fBBash\fP attempts to invoke
+.SM
+.BR $FCEDIT ,
+.SM
+.BR $EDITOR ,
+and \fIemacs\fP as the editor, in that order.
+.PD
+.SS Commands for Changing Text
+.PP
+.PD 0
+.TP
+.B delete\-char (C\-d)
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to \fBdelete\-char\fP,
+then return
+.SM
+.BR EOF .
+.TP
+.B backward\-delete\-char (Rubout)
+Delete the character behind the cursor.  When given a numeric argument,
+save the deleted text on the kill ring.
+.TP
+.B forward\-backward\-delete\-char
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.
+.TP
+.B quoted\-insert (C\-q, C\-v)
+Add the next character typed to the line verbatim.  This is
+how to insert characters like \fBC\-q\fP, for example.
+.TP
+.B tab\-insert (C\-v TAB)
+Insert a tab character.
+.TP
+.B self\-insert (a,\ b,\ A,\ 1,\ !,\ ...)
+Insert the character typed.
+.TP
+.B transpose\-chars (C\-t)
+Drag the character before point forward over the character at point,
+moving point forward as well.
+If point is at the end of the line, then this transposes
+the two characters before point.
+Negative arguments have no effect.
+.TP
+.B transpose\-words (M\-t)
+Drag the word before point past the word after point,
+moving point over that word as well.
+If point is at the end of the line, this transposes
+the last two words on the line.   
+.TP
+.B upcase\-word (M\-u)
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move point.
+.TP
+.B downcase\-word (M\-l)
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move point.
+.TP
+.B capitalize\-word (M\-c)
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move point.
+.TP
+.B overwrite\-mode
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+\fBemacs\fP mode; \fBvi\fP mode does overwrite differently.
+Each call to \fIreadline()\fP starts in insert mode.
+In overwrite mode, characters bound to \fBself\-insert\fP replace   
+the text at point rather than pushing the text to the right.
+Characters bound to \fBbackward\-delete\-char\fP replace the character
+before point with a space.  By default, this command is unbound.
+.PD
+.SS Killing and Yanking
+.PP
+.PD 0
+.TP
+.B kill\-line (C\-k)
+Kill the text from point to the end of the line.
+.TP
+.B backward\-kill\-line (C\-x Rubout)
+Kill backward to the beginning of the line.
+.TP
+.B unix\-line\-discard (C\-u)
+Kill backward from point to the beginning of the line.
+The killed text is saved on the kill-ring.
+.\" There is no real difference between this and backward-kill-line
+.TP
+.B kill\-whole\-line
+Kill all characters on the current line, no matter where point is.
+.TP
+.B kill\-word  (M\-d)
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as those used by \fBforward\-word\fP.
+.TP
+.B backward\-kill\-word (M\-Rubout)
+Kill the word behind point.
+Word boundaries are the same as those used by \fBbackward\-word\fP.
+.TP
+.B unix\-word\-rubout (C\-w)
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+.TP
+.B delete\-horizontal\-space (M\-\e)
+Delete all spaces and tabs around point.
+.TP
+.B kill\-region
+Kill the text in the current region.
+.TP
+.B copy\-region\-as\-kill
+Copy the text in the region to the kill buffer.
+.TP
+.B copy\-backward\-word
+Copy the word before point to the kill buffer.
+The word boundaries are the same as \fBbackward\-word\fP.
+.TP
+.B copy\-forward\-word
+Copy the word following point to the kill buffer.
+The word boundaries are the same as \fBforward\-word\fP.
+.TP
+.B yank (C\-y)
+Yank the top of the kill ring into the buffer at point.
+.TP
+.B yank\-pop (M\-y)
+Rotate the kill ring, and yank the new top.  Only works following
+.B yank
+or
+.BR yank\-pop .
+.PD
+.SS Numeric Arguments
+.PP
+.PD 0
+.TP
+.B digit\-argument (M\-0, M\-1, ..., M\-\-)
+Add this digit to the argument already accumulating, or start a new
+argument.  M\-\- starts a negative argument.
+.TP
+.B universal\-argument
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing
+.B universal\-argument
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+.PD
+.SS Completing
+.PP
+.PD 0
+.TP
+.B complete (TAB)
+Attempt to perform completion on the text before point.
+.B Bash
+attempts completion treating the text as a variable (if the
+text begins with \fB$\fP), username (if the text begins with
+\fB~\fP), hostname (if the text begins with \fB@\fP), or
+command (including aliases and functions) in turn.  If none
+of these produces a match, filename completion is attempted.
+.TP
+.B possible\-completions (M\-?)
+List the possible completions of the text before point.
+.TP
+.B insert\-completions (M\-*)
+Insert all completions of the text before point
+that would have been generated by
+\fBpossible\-completions\fP.
+.TP
+.B menu\-complete
+Similar to \fBcomplete\fP, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of \fBmenu\-complete\fP steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of \fBbell\-style\fP)
+and the original text is restored.
+An argument of \fIn\fP moves \fIn\fP positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to \fBTAB\fP, but is unbound
+by default.
+.TP
+.B delete\-char\-or\-list
+Deletes the character under the cursor if not at the beginning or
+end of the line (like \fBdelete\-char\fP).
+If at the end of the line, behaves identically to
+\fBpossible\-completions\fP.
+This command is unbound by default.
+.TP
+.B complete\-filename (M\-/)
+Attempt filename completion on the text before point.
+.TP
+.B possible\-filename\-completions (C\-x /)
+List the possible completions of the text before point,
+treating it as a filename.
+.TP
+.B complete\-username (M\-~)
+Attempt completion on the text before point, treating
+it as a username.
+.TP
+.B possible\-username\-completions (C\-x ~)
+List the possible completions of the text before point,
+treating it as a username.
+.TP
+.B complete\-variable (M\-$)
+Attempt completion on the text before point, treating
+it as a shell variable.
+.TP
+.B possible\-variable\-completions (C\-x $)
+List the possible completions of the text before point,
+treating it as a shell variable.
+.TP
+.B complete\-hostname (M\-@)
+Attempt completion on the text before point, treating
+it as a hostname.
+.TP
+.B possible\-hostname\-completions (C\-x @)
+List the possible completions of the text before point,
+treating it as a hostname.
+.TP
+.B complete\-command (M\-!)
+Attempt completion on the text before point, treating
+it as a command name.  Command completion attempts to
+match the text against aliases, reserved words, shell
+functions, shell builtins, and finally executable filenames,
+in that order.
+.TP
+.B possible\-command\-completions (C\-x !)
+List the possible completions of the text before point,
+treating it as a command name.
+.TP
+.B dynamic\-complete\-history (M\-TAB)
+Attempt completion on the text before point, comparing
+the text against lines from the history list for possible
+completion matches.
+.TP
+.B complete\-into\-braces (M\-{)
+Perform filename completion and insert the list of possible completions
+enclosed within braces so the list is available to the shell (see
+.B Brace Expansion
+above).
+.PD
+.SS Keyboard Macros
+.PP
+.PD 0
+.TP
+.B start\-kbd\-macro (C\-x (\^)
+Begin saving the characters typed into the current keyboard macro.
+.TP
+.B end\-kbd\-macro (C\-x )\^)
+Stop saving the characters typed into the current keyboard macro
+and store the definition.
+.TP
+.B call\-last\-kbd\-macro (C\-x e)
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+.PD
+.SS Miscellaneous
+.PP
+.PD 0
+.TP
+.B re\-read\-init\-file (C\-x C\-r)
+Read in the contents of the \fIinputrc\fP file, and incorporate
+any bindings or variable assignments found there.
+.TP
+.B abort (C\-g)
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+.BR bell\-style ).
+.TP
+.B do\-uppercase\-version (M\-a, M\-b, M\-\fIx\fP, ...)
+If the metafied character \fIx\fP is lowercase, run the command
+that is bound to the corresponding uppercase character.
+.TP
+.B prefix\-meta (ESC)
+Metafy the next character typed.
+.SM
+.B ESC
+.B f
+is equivalent to
+.BR Meta\-f .
+.TP
+.B undo (C\-_, C\-x C\-u)
+Incremental undo, separately remembered for each line.
+.TP
+.B revert\-line (M\-r)
+Undo all changes made to this line.  This is like executing the
+.B undo
+command enough times to return the line to its initial state.
+.TP
+.B tilde\-expand (M\-&)
+Perform tilde expansion on the current word.
+.TP
+.B set\-mark (C\-@, M\-<space>)
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+.TP
+.B exchange\-point\-and\-mark (C\-x C\-x)
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+.TP
+.B character\-search (C\-])
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+.TP
+.B character\-search\-backward (M\-C\-])
+A character is read and point is moved to the previous occurrence of that
+character.  A negative count searches for subsequent occurrences.
+.TP
+.B insert\-comment (M\-#)
+Without a numeric argument, the value of the readline
+.B comment\-begin
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value
+of \fBcomment\-begin\fP, the value is inserted, otherwise
+the characters in \fBcomment-begin\fP are deleted from the beginning of 
+the line.
+In either case, the line is accepted as if a newline had been typed.
+The default value of
+\fBcomment\-begin\fP causes this command to make the current line
+a shell comment.
+If a numeric argument causes the comment character to be removed, the line
+will be executed by the shell.
+.TP
+.B glob\-complete\-word (M\-g)
+The word before point is treated as a pattern for pathname expansion,
+with an asterisk implicitly appended.  This pattern is used to
+generate a list of matching file names for possible completions.
+.TP
+.B glob\-expand\-word (C\-x *)
+The word before point is treated as a pattern for pathname expansion,
+and the list of matching file names is inserted, replacing the word.
+If a numeric argument is supplied, an asterisk is appended before
+pathname expansion.
+.TP
+.B glob\-list\-expansions (C\-x g)
+The list of expansions that would have been generated by
+.B glob\-expand\-word
+is displayed, and the line is redrawn.
+If a numeric argument is supplied, an asterisk is appended before
+pathname expansion.
+.TP
+.B dump\-functions
+Print all of the functions and their key bindings to the
+readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-variables
+Print all of the settable readline variables and their values to the
+readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-macros
+Print all of the readline key sequences bound to macros and the
+strings they ouput.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B display\-shell\-version (C\-x C\-v)
+Display version information about the current instance of
+.BR bash .
+.PD
+.SS Programmable Completion
+.PP
+When word completion is attempted for an argument to a command for
+which a completion specification (a \fIcompspec\fP) has been defined
+using the \fBcomplete\fP builtin (see
+.SM
+.B "SHELL BUILTIN COMMANDS"
+below), the programmable completion facilities are invoked.
+.PP
+First, the command name is identified.
+If a compspec has been defined for that command, the
+compspec is used to generate the list of possible completions for the word.
+If the command word is a full pathname, a compspec for the full
+pathname is searched for first.
+If no compspec is found for the full pathname, an attempt is made to
+find a compspec for the portion following the final slash.
+.PP
+Once a compspec has been found, it is used to generate the list of
+matching words.
+If a compspec is not found, the default \fBbash\fP completion as
+described above under \fBCompleting\fP is performed.
+.PP
+First, the actions specified by the compspec are used.
+Only matches which are prefixed by the word being completed are
+returned.
+When the
+.B \-f
+or
+.B \-d
+option is used for filename or directory name completion, the shell
+variable
+.SM
+.B FIGNORE
+is used to filter the matches.
+.PP
+Any completions specified by a filename expansion pattern to the
+\fB\-G\fP option are generated next.
+The words generated by the pattern need not match the word
+being completed.
+The
+.SM
+.B GLOBIGNORE
+shell variable is not used to filter the matches, but the
+.SM
+.B FIGNORE
+variable is used.
+.PP
+Next, the string specified as the argument to the \fB\-W\fP option
+is considered.
+The string is first split using the characters in the
+.SM
+.B IFS
+special variable as delimiters.
+Shell quoting is honored.
+Each word is then expanded using
+brace expansion, tilde expansion, parameter and variable expansion,
+command substitution, arithmetic expansion, and pathname expansion,
+as described above under 
+.SM
+.BR EXPANSION .
+The results are split using the rules described above under
+\fBWord Splitting\fP.
+The results of the expansion are prefix-matched against the word being
+completed, and the matching words become the possible completions.
+.PP
+After these matches have been generated, any shell function or command
+specified with the \fB\-F\fP and \fB\-C\fP options is invoked.
+When the command or function is invoked, the
+.SM
+.B COMP_LINE
+and
+.SM
+.B COMP_POINT
+variables are assigned values as described above under
+\fBShell Variables\fP.
+If a shell function is being invoked, the 
+.SM
+.B COMP_WORDS
+and
+.SM
+.B COMP_CWORD
+variables are also set.
+When the function or command is invoked, the first argument is the
+name of the command whose arguments are being completed, the
+second argument is the word being completed, and the third argument
+is the word preceding the word being completed on the current command line.
+No filtering of the generated completions against the word being completed
+is performed; the function or command has complete freedom in generating
+the matches.
+.PP
+Any function specified with \fB\-F\fP is invoked first.
+The function may use any of the shell facilities, including the
+\fBcompgen\fP builtin described below, to generate the matches.
+It must put the possible completions in the
+.SM
+.B COMPREPLY
+array variable.
+.PP
+Next, any command specified with the \fB\-C\fP option is invoked
+in an environment equivalent to command substitution.
+It should print a list of completions, one per line, to the
+standard output.
+Backslash may be used to escape a newline, if necessary.
+.PP
+After all of the possible completions are generated, any filter
+specified with the \fB\-X\fP option is applied to the list.
+The filter is a pattern as used for pathname expansion; a \fB&\fP
+in the pattern is replaced with the text of the word being completed.
+A literal \fB&\fP may be escaped with a backslash; the backslash
+is removed before attempting a match.
+Any completion that matches the pattern will be removed from the list.
+A leading \fB!\fP negates the pattern; in this case any completion
+not matching the pattern will be removed.
+.PP
+Finally, any prefix and suffix specified with the \fB\-P\fP and \fB\-S\fP
+options are added to each member of the completion list, and the result is
+returned to the readline completion code as the list of possible
+completions.
+.PP
+If the previously-applied actions do not generate any matches, and the
+\fB\-o dirnames\fP option was supplied to \fBcomplete\fP when the
+compspec was defined, directory name completion is attempted.
+.PP
+By default, if a compspec is found, whatever it generates is returned
+to the completion code as the full set of possible completions.
+The default \fBbash\fP completions are not attempted, and the readline
+default of filename completion is disabled.
+If the \fB-o default\fP option was supplied to \fBcomplete\fP when the
+compspec was defined, readline's default completion will be performed
+if the compspec generates no matches.
+.PP
+When a compspec indicates that directory name completion is desired,
+the programmable completion functions force readline to append a slash
+to completed names which are symbolic links to directories, subject to  
+the value of the \fBmark\-directories\fP readline variable, regardless
+of the setting of the \fBmark-symlinked\-directories\fP readline variable.
+.SH HISTORY
+When the
+.B \-o history
+option to the
+.B set
+builtin is enabled, the shell provides access to the
+\fIcommand history\fP,
+the list of commands previously typed.
+The value of the \fBHISTSIZE\fP variable is used as the
+number of commands to save in a history list.
+The text of the last
+.SM
+.B HISTSIZE
+commands (default 500) is saved.  The shell
+stores each command in the history list prior to parameter and
+variable expansion (see
+.SM
+.B EXPANSION
+above) but after history expansion is performed, subject to the
+values of the shell variables
+.SM
+.B HISTIGNORE
+and
+.SM
+.BR HISTCONTROL .
+.PP
+On startup, the history is initialized from the file named by
+the variable
+.SM
+.B HISTFILE
+(default \fI~/.bash_history\fP).
+The file named by the value of
+.SM
+.B HISTFILE
+is truncated, if necessary, to contain no more than
+the number of lines specified by the value of
+.SM
+.BR HISTFILESIZE .
+When an interactive shell exits, the last
+.SM
+.B $HISTSIZE
+lines are copied from the history list to
+.SM
+.BR $HISTFILE .
+If the
+.B histappend
+shell option is enabled
+(see the description of
+.B shopt
+under
+.SM
+.B "SHELL BUILTIN COMMANDS"
+below), the lines are appended to the history file,
+otherwise the history file is overwritten.
+If
+.SM
+.B HISTFILE
+is unset, or if the history file is unwritable, the history is
+not saved.  After saving the history, the history file is truncated
+to contain no more than
+.SM
+.B HISTFILESIZE
+lines.  If
+.SM
+.B HISTFILESIZE
+is not set, no truncation is performed.
+.PP
+The builtin command
+.B fc
+(see
+.SM
+.B SHELL BUILTIN COMMANDS
+below) may be used to list or edit and re-execute a portion of
+the history list.
+The
+.B history
+builtin may be used to display or modify the history list and
+manipulate the history file.
+When using command-line editing, search commands
+are available in each editing mode that provide access to the
+history list.
+.PP
+The shell allows control over which commands are saved on the history
+list.  The
+.SM
+.B HISTCONTROL
+and
+.SM
+.B HISTIGNORE
+variables may be set to cause the shell to save only a subset of the
+commands entered.
+The
+.B cmdhist
+shell option, if enabled, causes the shell to attempt to save each
+line of a multi-line command in the same history entry, adding
+semicolons where necessary to preserve syntactic correctness.
+The
+.B lithist
+shell option causes the shell to save the command with embedded newlines
+instead of semicolons.  See the description of the
+.B shopt
+builtin below under
+.SM
+.B "SHELL BUILTIN COMMANDS"
+for information on setting and unsetting shell options.
+.SH "HISTORY EXPANSION"
+.PP
+The shell supports a history expansion feature that
+is similar to the history expansion in
+.BR csh.
+This section describes what syntax features are available.  This
+feature is enabled by default for interactive shells, and can be
+disabled using the
+.B \+H
+option to the
+.B set
+builtin command (see
+.SM
+.B SHELL BUILTIN COMMANDS
+below).  Non-interactive shells do not perform history expansion
+by default.
+.PP
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+.PP
+History expansion is performed immediately after a complete line
+is read, before the shell breaks it into words.
+It takes place in two parts.
+The first is to determine which line from the history list
+to use during substitution.
+The second is to select portions of that line for inclusion into
+the current one.
+The line selected from the history is the \fIevent\fP,
+and the portions of that line that are acted upon are \fIwords\fP.
+Various \fImodifiers\fP are available to manipulate the selected words.
+The line is broken into words in the same fashion as when reading input,
+so that several \fImetacharacter\fP-separated words surrounded by
+quotes are considered one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is \^\fB!\fP\^ by default.
+Only backslash (\^\fB\e\fP\^) and single quotes can quote
+the history expansion character.
+.PP
+Several shell options settable with the
+.B shopt
+builtin may be used to tailor the behavior of history expansion.
+If the
+.B histverify
+shell option is enabled (see the description of the
+.B shopt
+builtin), and
+.B readline
+is being used, history substitutions are not immediately passed to
+the shell parser.
+Instead, the expanded line is reloaded into the
+.B readline
+editing buffer for further modification.
+If
+.B readline
+is being used, and the
+.B histreedit
+shell option is enabled, a failed history substitution will be reloaded
+into the
+.B readline
+editing buffer for correction.
+The
+.B \-p
+option to the
+.B history
+builtin command may be used to see what a history expansion will
+do before using it.
+The
+.B \-s
+option to the
+.B history
+builtin may be used to add commands to the end of the history list
+without actually executing them, so that they are available for
+subsequent recall.
+.PP
+The shell allows control of the various characters used by the
+history expansion mechanism (see the description of
+.B histchars
+above under
+.BR "Shell Variables" ).
+.SS Event Designators
+.PP
+An event designator is a reference to a command line entry in the
+history list.
+.PP
+.PD 0
+.TP
+.B !
+Start a history substitution, except when followed by a
+.BR blank ,
+newline, = or ( (when the \fBextglob\fP shell option is enabled using
+the \fBshopt\fP builtin).
+.TP
+.B !\fIn\fR
+Refer to command line
+.IR n .
+.TP
+.B !\-\fIn\fR
+Refer to the current command line minus
+.IR n .
+.TP
+.B !!
+Refer to the previous command.  This is a synonym for `!\-1'.
+.TP
+.B !\fIstring\fR
+Refer to the most recent command starting with 
+.IR string .
+.TP
+.B !?\fIstring\fR\fB[?]\fR
+Refer to the most recent command containing
+.IR string .
+The trailing \fB?\fP may be omitted if
+.I string
+is followed immediately by a newline.
+.TP
+.B \d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u
+Quick substitution.  Repeat the last command, replacing
+.I string1
+with
+.IR string2 .
+Equivalent to
+``!!:s/\fIstring1\fP/\fIstring2\fP/''
+(see \fBModifiers\fP below).
+.TP
+.B !#
+The entire command line typed so far.
+.PD
+.SS Word Designators
+.PP
+Word designators are used to select desired words from the event.
+A 
+.B :
+separates the event specification from the word designator.
+It may be omitted if the word designator begins with a
+.BR ^ ,
+.BR $ ,
+.BR * ,
+.BR \- ,
+or
+.BR % .
+Words are numbered from the beginning of the line,
+with the first word being denoted by 0 (zero).
+Words are inserted into the current line separated by single spaces.
+.PP
+.PD 0
+.TP
+.B 0 (zero)
+The zeroth word.  For the shell, this is the command
+word.
+.TP
+.I n
+The \fIn\fRth word.
+.TP
+.B ^
+The first argument.  That is, word 1.
+.TP
+.B $
+The last argument.
+.TP
+.B %
+The word matched by the most recent `?\fIstring\fR?' search.
+.TP
+.I x\fB\-\fPy
+A range of words; `\-\fIy\fR' abbreviates `0\-\fIy\fR'.
+.TP
+.B *
+All of the words but the zeroth.  This is a synonym
+for `\fI1\-$\fP'.  It is not an error to use
+.B *
+if there is just one
+word in the event; the empty string is returned in that case.
+.TP
+.B x*
+Abbreviates \fIx\-$\fP.
+.TP
+.B x\-
+Abbreviates \fIx\-$\fP like \fBx*\fP, but omits the last word.
+.PD
+.PP
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+.SS Modifiers
+.PP
+After the optional word designator, there may appear a sequence of
+one or more of the following modifiers, each preceded by a `:'.
+.PP
+.PD 0
+.PP
+.TP
+.B h
+Remove a trailing file name component, leaving only the head.
+.TP
+.B t
+Remove all leading file name components, leaving the tail.
+.TP
+.B r
+Remove a trailing suffix of the form \fI.xxx\fP, leaving the
+basename.
+.TP
+.B e
+Remove all but the trailing suffix.
+.TP
+.B p
+Print the new command but do not execute it.
+.TP
+.B q
+Quote the substituted words, escaping further substitutions.
+.TP
+.B x
+Quote the substituted words as with
+.BR q ,
+but break into words at
+.B blanks
+and newlines.
+.TP
+.B s/\fIold\fP/\fInew\fP/
+Substitute
+.I new
+for the first occurrence of
+.I old
+in the event line.  Any delimiter can be used in place of /.  The
+final delimiter is optional if it is the last character of the
+event line.  The delimiter may be quoted in
+.I old
+and
+.I new
+with a single backslash.  If & appears in
+.IR new ,
+it is replaced by
+.IR old .
+A single backslash will quote the &.  If
+.I old
+is null, it is set to the last
+.I old
+substituted, or, if no previous history substitutions took place,
+the last
+.I string
+in a
+.B !?\fIstring\fR\fB[?]\fR
+search.
+.TP
+.B &
+Repeat the previous substitution.
+.TP
+.B g
+Cause changes to be applied over the entire event line.  This is
+used in conjunction with `\fB:s\fP' (e.g., `\fB:gs/\fIold\fP/\fInew\fP/\fR')
+or `\fB:&\fP'.  If used with
+`\fB:s\fP', any delimiter can be used
+in place of /, and the final delimiter is optional
+if it is the last character of the event line.
+An \fBa\fP may be used as a synonym for \fBg\fP.
+.TP
+.B G
+Apply the following `\fBs\fP' modifier once to each word in the event line.
+.PD
+.SH "SHELL BUILTIN COMMANDS"
+.\" start of bash_builtins
+.zZ
+.PP
+Unless otherwise noted, each builtin command documented in this
+section as accepting options preceded by
+.B \-
+accepts
+.B \-\-
+to signify the end of the options.
+.sp .5
+.PD 0
+.TP
+\fB:\fP [\fIarguments\fP]
+.PD
+No effect; the command does nothing beyond expanding
+.I arguments
+and performing any specified
+redirections.  A zero exit code is returned.
+.TP
+\fB .\| \fP \fIfilename\fP [\fIarguments\fP]
+.PD 0
+.TP
+\fBsource\fP \fIfilename\fP [\fIarguments\fP]
+.PD
+Read and execute commands from
+.I filename
+in the current
+shell environment and return the exit status of the last command
+executed from
+.IR filename .
+If
+.I filename
+does not contain a slash, file names in
+.SM
+.B PATH
+are used to find the directory containing
+.IR filename .
+The file searched for in
+.SM
+.B PATH
+need not be executable.
+When \fBbash\fP is not in \fIposix mode\fP, the current directory is
+searched if no file is found in
+.SM
+.BR PATH .
+If the
+.B sourcepath
+option to the
+.B shopt
+builtin command is turned off, the
+.SM
+.B PATH
+is not searched.
+If any \fIarguments\fP are supplied, they become the positional
+parameters when \fIfilename\fP is executed.  Otherwise the positional
+parameters are unchanged.
+The return status is the status of the last command exited within
+the script (0 if no commands are executed), and false if
+.I filename
+is not found or cannot be read.
+.TP
+\fBalias\fP [\fB\-p\fP] [\fIname\fP[=\fIvalue\fP] ...]
+\fBAlias\fP with no arguments or with the
+.B \-p
+option prints the list of aliases in the form
+\fBalias\fP \fIname\fP=\fIvalue\fP on standard output.
+When arguments are supplied, an alias is defined for
+each \fIname\fP whose \fIvalue\fP is given.
+A trailing space in  \fIvalue\fP causes the next word to be
+checked for alias substitution when the alias is expanded.
+For each \fIname\fP in the argument list for which no \fIvalue\fP
+is supplied, the name and value of the alias is printed.
+\fBAlias\fP returns true unless a \fIname\fP is given for which
+no alias has been defined.
+.TP
+\fBbg\fP [\fIjobspec\fP]
+Resume the suspended job \fIjobspec\fP in the background, as if it
+had been started with
+.BR & .
+If \fIjobspec\fP is not present, the shell's notion of the
+\fIcurrent job\fP is used.
+.B bg
+.I jobspec
+returns 0 unless run when job control is disabled or, when run with
+job control enabled, if \fIjobspec\fP was not found or started without
+job control.
+.TP
+\fBbind\fP [\fB\-m\fP \fIkeymap\fP] [\fB\-lpsvPSV\fP]
+.PD 0
+.TP
+\fBbind\fP [\fB\-m\fP \fIkeymap\fP] [\fB\-q\fP \fIfunction\fP] [\fB\-u\fP \fIfunction\fP] [\fB\-r\fP \fIkeyseq\fP]
+.TP
+\fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fB\-f\fP \fIfilename\fP
+.TP
+\fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fB\-x\fP \fIkeyseq\fP:\fIshell\-command\fP
+.TP
+\fBbind\fP [\fB\-m\fP \fIkeymap\fP] \fIkeyseq\fP:\fIfunction\-name\fP
+.TP
+\fBbind\fP \fIreadline\-command\fP
+.PD
+Display current
+.B readline
+key and function bindings, bind a key sequence to a
+.B readline
+function or macro, or set a
+.B readline
+variable.
+Each non-option argument is a command as it would appear in
+.IR .inputrc ,
+but each binding or command must be passed as a separate argument;
+e.g., '"\eC\-x\eC\-r": re\-read\-init\-file'.
+Options, if supplied, have the following meanings:
+.RS
+.PD 0
+.TP
+.B \-m \fIkeymap\fP
+Use
+.I keymap
+as the keymap to be affected by the subsequent bindings.
+Acceptable
+.I keymap
+names are
+\fIemacs, emacs\-standard, emacs\-meta, emacs\-ctlx, vi,
+vi\-move, vi\-command\fP, and
+.IR vi\-insert .
+\fIvi\fP is equivalent to \fIvi\-command\fP; \fIemacs\fP is
+equivalent to \fIemacs\-standard\fP.
+.TP
+.B \-l
+List the names of all \fBreadline\fP functions.
+.TP
+.B \-p
+Display \fBreadline\fP function names and bindings in such a way
+that they can be re-read.
+.TP
+.B \-P
+List current \fBreadline\fP function names and bindings.
+.TP
+.B \-v
+Display \fBreadline\fP variable names and values in such a way that they
+can be re-read.
+.TP
+.B \-V
+List current \fBreadline\fP variable names and values.
+.TP
+.B \-s
+Display \fBreadline\fP key sequences bound to macros and the strings
+they output in such a way that they can be re-read.
+.TP
+.B \-S
+Display \fBreadline\fP key sequences bound to macros and the strings
+they output.
+.TP
+.B \-f \fIfilename\fP
+Read key bindings from \fIfilename\fP.
+.TP
+.B \-q \fIfunction\fP
+Query about which keys invoke the named \fIfunction\fP.
+.TP
+.B \-u \fIfunction\fP
+Unbind all keys bound to the named \fIfunction\fP.
+.TP
+.B \-r \fIkeyseq\fP
+Remove any current binding for \fIkeyseq\fP.
+.TP
+.B \-x \fIkeyseq\fP:\fIshell\-command\fP
+Cause \fIshell\-command\fP to be executed whenever \fIkeyseq\fP is
+entered.
+.PD
+.PP
+The return value is 0 unless an unrecognized option is given or an
+error occurred.
+.RE
+.TP
+\fBbreak\fP [\fIn\fP]
+Exit from within a
+.BR for ,
+.BR while ,
+.BR until ,
+or
+.B select
+loop.  If \fIn\fP is specified, break \fIn\fP levels.
+.I n
+must be \(>= 1.  If
+.I n
+is greater than the number of enclosing loops, all enclosing loops
+are exited.  The return value is 0 unless the shell is not executing
+a loop when
+.B break
+is executed.
+.TP
+\fBbuiltin\fP \fIshell\-builtin\fP [\fIarguments\fP]
+Execute the specified shell builtin, passing it
+.IR arguments ,
+and return its exit status.
+This is useful when defining a
+function whose name is the same as a shell builtin,
+retaining the functionality of the builtin within the function.
+The \fBcd\fP builtin is commonly redefined this way.
+The return status is false if
+.I shell\-builtin
+is not a shell builtin command.
+.TP
+\fBcd\fP [\fB\-L|-P\fP] [\fIdir\fP]
+Change the current directory to \fIdir\fP.  The variable
+.SM
+.B HOME
+is the
+default
+.IR dir .
+The variable
+.SM
+.B CDPATH
+defines the search path for the directory containing
+.IR dir .
+Alternative directory names in
+.SM
+.B CDPATH
+are separated by a colon (:).  A null directory name in
+.SM
+.B CDPATH
+is the same as the current directory, i.e., ``\fB.\fP''.  If
+.I dir
+begins with a slash (/),
+then
+.SM
+.B CDPATH
+is not used. The
+.B \-P
+option says to use the physical directory structure instead of
+following symbolic links (see also the
+.B \-P
+option to the
+.B set
+builtin command); the
+.B \-L
+option forces symbolic links to be followed.  An argument of
+.B \-
+is equivalent to
+.SM
+.BR $OLDPWD .
+The return value is true if the directory was successfully changed;
+false otherwise.
+.TP
+\fBcaller\fP [\fIexpr\fP]
+Returns the context of any active subroutine call (a shell function or
+a script executed with the \fB.\fP or \fBsource\fP builtins.
+Without \fIexpr\fP, \fBcaller\fP displays the line number and source
+filename of the current subroutine call.
+If a non-negative integer is supplied as \fIexpr\fP, \fBcaller\fP 
+displays the line number, subroutine name, and source file corresponding
+to that position in the current execution call stack.  This extra
+information may be used, for example, to print a stack trace.  The
+current frame is frame 0.
+The return value is 0 unless the shell is not executing a subroutine
+call or \fIexpr\fP does not correspond to a valid position in the
+call stack.
+.TP
+\fBcommand\fP [\fB\-pVv\fP] \fIcommand\fP [\fIarg\fP ...]
+Run
+.I command
+with
+.I args
+suppressing the normal shell function lookup. Only builtin
+commands or commands found in the
+.SM
+.B PATH
+are executed.  If the
+.B \-p
+option is given, the search for
+.I command
+is performed using a default value for
+.B PATH
+that is guaranteed to find all of the standard utilities.
+If either the
+.B \-V
+or
+.B \-v
+option is supplied, a description of
+.I command
+is printed.  The
+.B \-v
+option causes a single word indicating the command or file name
+used to invoke
+.I command
+to be displayed; the
+.B \-V
+option produces a more verbose description.
+If the
+.B \-V
+or
+.B \-v
+option is supplied, the exit status is 0 if
+.I command
+was found, and 1 if not.  If neither option is supplied and
+an error occurred or
+.I command
+cannot be found, the exit status is 127.  Otherwise, the exit status of the
+.B command
+builtin is the exit status of
+.IR command .
+.TP
+\fBcompgen\fP [\fIoption\fP] [\fIword\fP]
+Generate possible completion matches for \fIword\fP according to
+the \fIoption\fPs, which may be any option accepted by the
+.B complete
+builtin with the exception of \fB\-p\fP and \fB\-r\fP, and write
+the matches to the standard output.
+When using the \fB\-F\fP or \fB\-C\fP options, the various shell variables
+set by the programmable completion facilities, while available, will not
+have useful values.
+.sp 1
+The matches will be generated in the same way as if the programmable
+completion code had generated them directly from a completion specification
+with the same flags.
+If \fIword\fP is specified, only those completions matching \fIword\fP
+will be displayed.
+.sp 1
+The return value is true unless an invalid option is supplied, or no
+matches were generated.
+.TP
+\fBcomplete\fP [\fB\-abcdefgjksuv\fP] [\fB\-o\fP \fIcomp-option\fP] [\fB\-A\fP \fIaction\fP] [\fB\-G\fP \fIglobpat\fP] [\fB\-W\fP \fIwordlist\fP] [\fB\-P\fP \fIprefix\fP] [\fB\-S\fP \fIsuffix\fP]
+.br
+[\fB\-X\fP \fIfilterpat\fP] [\fB\-F\fP \fIfunction\fP] [\fB\-C\fP \fIcommand\fP] \fIname\fP [\fIname ...\fP]
+.PD 0
+.TP
+\fBcomplete\fP \fB\-pr\fP [\fIname\fP ...]
+.PD
+Specify how arguments to each \fIname\fP should be completed.
+If the \fB\-p\fP option is supplied, or if no options are supplied,
+existing completion specifications are printed in a way that allows
+them to be reused as input.
+The \fB\-r\fP option removes a completion specification for
+each \fIname\fP, or, if no \fIname\fPs are supplied, all
+completion specifications.
+.sp 1
+The process of applying these completion specifications when word completion
+is attempted is described above under \fBProgrammable Completion\fP.
+.sp 1
+Other options, if specified, have the following meanings.
+The arguments to the \fB\-G\fP, \fB\-W\fP, and \fB\-X\fP options
+(and, if necessary, the \fB\-P\fP and \fB\-S\fP options)
+should be quoted to protect them from expansion before the
+.B complete
+builtin is invoked.
+.RS
+.PD 0
+.TP 8
+\fB\-o\fP \fIcomp-option\fP
+The \fIcomp-option\fP controls several aspects of the compspec's behavior
+beyond the simple generation of completions.
+\fIcomp-option\fP may be one of:
+.RS
+.TP 8
+.B default
+Use readline's default filename completion if the compspec generates
+no matches.
+.TP 8
+.B dirnames
+Perform directory name completion if the compspec generates no matches.
+.TP 8
+.B filenames
+Tell readline that the compspec generates filenames, so it can perform any
+filename\-specific processing (like adding a slash to directory names or
+suppressing trailing spaces).  Intended to be used with shell functions.
+.TP 8
+.B nospace
+Tell readline not to append a space (the default) to words completed at
+the end of the line.
+.RE
+.TP 8
+\fB\-A\fP \fIaction\fP
+The \fIaction\fP may be one of the following to generate a list of possible
+completions:
+.RS
+.TP 8
+.B alias
+Alias names.  May also be specified as \fB\-a\fP.
+.TP 8
+.B arrayvar
+Array variable names.
+.TP 8
+.B binding
+\fBReadline\fP key binding names.
+.TP 8
+.B builtin
+Names of shell builtin commands.  May also be specified as \fB\-b\fP.
+.TP 8
+.B command
+Command names.  May also be specified as \fB\-c\fP.
+.TP 8
+.B directory
+Directory names.  May also be specified as \fB\-d\fP.
+.TP 8
+.B disabled
+Names of disabled shell builtins.
+.TP 8
+.B enabled
+Names of enabled shell builtins.
+.TP 8
+.B export
+Names of exported shell variables.  May also be specified as \fB\-e\fP.
+.TP 8
+.B file
+File names.  May also be specified as \fB\-f\fP.
+.TP 8
+.B function
+Names of shell functions.
+.TP 8
+.B group
+Group names.  May also be specified as \fB\-g\fP.
+.TP 8
+.B helptopic
+Help topics as accepted by the \fBhelp\fP builtin.
+.TP 8
+.B hostname
+Hostnames, as taken from the file specified by the
+.SM
+.B HOSTFILE
+shell variable.
+.TP 8
+.B job
+Job names, if job control is active.  May also be specified as \fB\-j\fP.
+.TP 8
+.B keyword
+Shell reserved words.  May also be specified as \fB\-k\fP.
+.TP 8
+.B running
+Names of running jobs, if job control is active.
+.TP 8
+.B service
+Service names.  May also be specified as \fB\-s\fP.
+.TP 8
+.B setopt
+Valid arguments for the \fB\-o\fP option to the \fBset\fP builtin.
+.TP 8
+.B shopt
+Shell option names as accepted by the \fBshopt\fP builtin.
+.TP 8
+.B signal
+Signal names.
+.TP 8
+.B stopped
+Names of stopped jobs, if job control is active.
+.TP 8
+.B user
+User names.  May also be specified as \fB\-u\fP.
+.TP 8
+.B variable
+Names of all shell variables.  May also be specified as \fB\-v\fP.
+.RE
+.TP 8
+\fB\-G\fP \fIglobpat\fP
+The filename expansion pattern \fIglobpat\fP is expanded to generate
+the possible completions.
+.TP 8
+\fB\-W\fP \fIwordlist\fP
+The \fIwordlist\fP is split using the characters in the
+.SM
+.B IFS
+special variable as delimiters, and each resultant word is expanded.
+The possible completions are the members of the resultant list which
+match the word being completed.
+.TP 8
+\fB\-C\fP \fIcommand\fP
+\fIcommand\fP is executed in a subshell environment, and its output is
+used as the possible completions.
+.TP 8
+\fB\-F\fP \fIfunction\fP
+The shell function \fIfunction\fP is executed in the current shell
+environment.
+When it finishes, the possible completions are retrieved from the value
+of the
+.SM
+.B COMPREPLY
+array variable.
+.TP 8
+\fB\-X\fP \fIfilterpat\fP
+\fIfilterpat\fP is a pattern as used for filename expansion.
+It is applied to the list of possible completions generated by the
+preceding options and arguments, and each completion matching
+\fIfilterpat\fP is removed from the list.
+A leading \fB!\fP in \fIfilterpat\fP negates the pattern; in this
+case, any completion not matching \fIfilterpat\fP is removed.
+.TP 8
+\fB\-P\fP \fIprefix\fP
+\fIprefix\fP is added at the beginning of each possible completion
+after all other options have been applied.
+.TP 8
+\fB\-S\fP \fIsuffix\fP
+\fIsuffix\fP is appended to each possible completion
+after all other options have been applied.
+.PD
+.PP
+The return value is true unless an invalid option is supplied, an option
+other than \fB\-p\fP or \fB\-r\fP is supplied without a \fIname\fP
+argument, an attempt is made to remove a completion specification for
+a \fIname\fP for which no specification exists, or
+an error occurs adding a completion specification.
+.RE
+.TP
+\fBcontinue\fP [\fIn\fP]
+Resume the next iteration of the enclosing
+.BR for ,
+.BR while ,
+.BR until ,
+or
+.B select
+loop.
+If
+.I n
+is specified, resume at the \fIn\fPth enclosing loop.
+.I n
+must be \(>= 1.  If
+.I n
+is greater than the number of enclosing loops, the last enclosing loop
+(the ``top-level'' loop) is resumed.  The return value is 0 unless the
+shell is not executing a loop when
+.B continue
+is executed.
+.TP
+\fBdeclare\fP [\fB\-afFirtx\fP] [\fB\-p\fP] [\fIname\fP[=\fIvalue\fP] ...]
+.PD 0
+.TP
+\fBtypeset\fP [\fB\-afFirtx\fP] [\fB\-p\fP] [\fIname\fP[=\fIvalue\fP] ...]
+.PD
+Declare variables and/or give them attributes.
+If no \fIname\fPs are given then display the values of variables.
+The
+.B \-p
+option will display the attributes and values of each
+.IR name .
+When
+.B \-p
+is used, additional options are ignored.
+The
+.B \-F
+option inhibits the display of function definitions; only the
+function name and attributes are printed.
+If the \fBextdebug\fP shell option is enabled using \fBshopt\fP,
+the source file name and line number where the function is defined
+are displayed as well.  The
+.B \-F
+option implies
+.BR \-f .
+The following options can
+be used to restrict output to variables with the specified attribute or
+to give variables attributes:
+.RS
+.PD 0
+.TP
+.B \-a
+Each \fIname\fP is an array variable (see
+.B Arrays
+above).
+.TP
+.B \-f
+Use function names only.
+.TP
+.B \-i
+The variable is treated as an integer; arithmetic evaluation (see
+.SM
+.B "ARITHMETIC EVALUATION" ") "
+is performed when the variable is assigned a value.
+.TP
+.B \-r
+Make \fIname\fPs readonly.  These names cannot then be assigned values
+by subsequent assignment statements or unset.
+.TP
+.B \-t
+Give each \fIname\fP the \fItrace\fP attribute.
+Traced functions inherit the \fBDEBUG\fP trap from the calling shell.
+The trace attribute has no special meaning for variables.
+.TP
+.B \-x
+Mark \fIname\fPs for export to subsequent commands via the environment.
+.PD
+.PP
+Using `+' instead of `\-'
+turns off the attribute instead, with the exception that \fB+a\fP
+may not be used to destroy an array variable.  When used in a function,
+makes each
+\fIname\fP local, as with the 
+.B local
+command.
+If a variable name is followed by =\fIvalue\fP, the value of
+the variable is set to \fIvalue\fP.
+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'',
+.if t \f(CW\-f foo=bar\fP,
+an attempt is made to assign a value to a readonly variable,
+an attempt is made to assign a value to an array variable without
+using the compound assignment syntax (see
+.B Arrays
+above), one of the \fInames\fP is not a valid shell variable name,
+an attempt is made to turn off readonly status for a readonly variable,
+an attempt is made to turn off array status for an array variable,
+or an attempt is made to display a non-existent function with \fB\-f\fP.
+.RE
+.TP
+.B dirs [\fB\-clpv\fP] [+\fIn\fP] [\-\fIn\fP]
+Without options, displays the list of currently remembered directories.
+The default display is on a single line with directory names separated
+by spaces.
+Directories are added to the list with the 
+.B pushd
+command; the
+.B popd
+command removes entries from the list.
+.RS
+.PD 0
+.TP
+\fB+\fP\fIn\fP
+Displays the \fIn\fPth entry counting from the left of the list
+shown by
+.B dirs
+when invoked without options, starting with zero.
+.TP
+\fB\-\fP\fIn\fP
+Displays the \fIn\fPth entry counting from the right of the list
+shown by
+.B dirs
+when invoked without options, starting with zero.
+.TP
+.B \-c
+Clears the directory stack by deleting all of the entries.
+.TP
+.B \-l
+Produces a longer listing; the default listing format uses a 
+tilde to denote the home directory.
+.TP
+.B \-p
+Print the directory stack with one entry per line.
+.TP
+.B \-v
+Print the directory stack with one entry per line,
+prefixing each entry with its index in the stack.
+.PD
+.PP
+The return value is 0 unless an
+invalid option is supplied or \fIn\fP indexes beyond the end
+of the directory stack.
+.RE
+.TP
+\fBdisown\fP [\fB\-ar\fP] [\fB\-h\fP] [\fIjobspec\fP ...]
+Without options, each
+.I jobspec
+is removed from the table of active jobs.
+If the \fB\-h\fP option is given, each
+.I jobspec
+is not removed from the table, but is marked so that
+.SM
+.B SIGHUP
+is not sent to the job if the shell receives a
+.SM
+.BR SIGHUP .
+If no
+.I jobspec
+is present, and neither the
+.B \-a
+nor the
+.B \-r
+option is supplied, the \fIcurrent job\fP is used.
+If no
+.I jobspec
+is supplied, the
+.B \-a
+option means to remove or mark all jobs; the
+.B \-r
+option without a
+.I jobspec
+argument restricts operation to running jobs.
+The return value is 0 unless a
+.I jobspec
+does not specify a valid job.
+.TP
+\fBecho\fP [\fB\-neE\fP] [\fIarg\fP ...]
+Output the \fIarg\fPs, separated by spaces, followed by a newline.
+The return status is always 0.
+If \fB\-n\fP is specified, the trailing newline is
+suppressed.  If the \fB\-e\fP option is given, interpretation of
+the following backslash-escaped characters is enabled.  The
+.B \-E
+option disables the interpretation of these escape characters,
+even on systems where they are interpreted by default.
+The \fBxpg_echo\fP shell option may be used to
+dynamically determine whether or not \fBecho\fP expands these
+escape characters by default.
+.B echo
+does not interpret
+.B \-\-
+to mean the end of options.
+.B echo
+interprets the following escape sequences:
+.RS
+.PD 0
+.TP
+.B \ea
+alert (bell)
+.TP
+.B \eb
+backspace
+.TP
+.B \ec
+suppress trailing newline
+.TP
+.B \ee
+an escape character
+.TP
+.B \ef
+form feed
+.TP
+.B \en
+new line
+.TP
+.B \er
+carriage return
+.TP
+.B \et
+horizontal tab
+.TP
+.B \ev
+vertical tab
+.TP
+.B \e\e
+backslash
+.TP
+.B \e0\fInnn\fP
+the eight-bit character whose value is the octal value \fInnn\fP
+(zero to three octal digits)
+.TP
+.B \e\fInnn\fP
+the eight-bit character whose value is the octal value \fInnn\fP
+(one to three octal digits)
+.TP
+.B \ex\fIHH\fP
+the eight-bit character whose value is the hexadecimal value \fIHH\fP
+(one or two hex digits)
+.PD
+.RE
+.TP
+\fBenable\fP [\fB\-adnps\fP] [\fB\-f\fP \fIfilename\fP] [\fIname\fP ...]
+Enable and disable builtin shell commands.
+Disabling a builtin allows a disk command which has the same name
+as a shell builtin to be executed without specifying a full pathname,
+even though the shell normally searches for builtins before disk commands.
+If \fB\-n\fP is used, each \fIname\fP
+is disabled; otherwise,
+\fInames\fP are enabled.  For example, to use the
+.B test
+binary found via the
+.SM
+.B PATH
+instead of the shell builtin version, run
+.if t \f(CWenable -n test\fP.
+.if n ``enable -n test''.
+The
+.B \-f
+option means to load the new builtin command
+.I name
+from shared object
+.IR filename ,
+on systems that support dynamic loading.  The
+.B \-d
+option will delete a builtin previously loaded with
+.BR \-f .
+If no \fIname\fP arguments are given, or if the
+.B \-p
+option is supplied, a list of shell builtins is printed.
+With no other option arguments, the list consists of all enabled
+shell builtins.
+If \fB\-n\fP is supplied, only disabled builtins are printed.
+If \fB\-a\fP is supplied, the list printed includes all builtins, with an
+indication of whether or not each is enabled.
+If \fB\-s\fP is supplied, the output is restricted to the POSIX
+\fIspecial\fP builtins.
+The return value is 0 unless a
+.I name
+is not a shell builtin or there is an error loading a new builtin
+from a shared object.
+.TP
+\fBeval\fP [\fIarg\fP ...]
+The \fIarg\fPs are read and concatenated together into a single
+command.  This command is then read and executed by the shell, and
+its exit status is returned as the value of
+.BR eval .
+If there are no
+.IR args ,
+or only null arguments,
+.B eval
+returns 0.
+.TP
+\fBexec\fP [\fB\-cl\fP] [\fB\-a\fP \fIname\fP] [\fIcommand\fP [\fIarguments\fP]]
+If
+.I command
+is specified, it replaces the shell.
+No new process is created.  The
+.I arguments
+become the arguments to \fIcommand\fP.
+If the
+.B \-l
+option is supplied,
+the shell places a dash at the beginning of the zeroth arg passed to 
+.IR command .
+This is what
+.IR login (1)
+does.  The
+.B \-c
+option causes
+.I command
+to be executed with an empty environment.  If
+.B \-a
+is supplied, the shell passes
+.I name
+as the zeroth argument to the executed command.  If
+.I command
+cannot be executed for some reason, a non-interactive shell exits,
+unless the shell option
+.B execfail
+is enabled, in which case it returns failure.
+An interactive shell returns failure if the file cannot be executed.
+If
+.I command
+is not specified, any redirections take effect in the current shell,
+and the return status is 0.  If there is a redirection error, the
+return status is 1.
+.TP
+\fBexit\fP [\fIn\fP]
+Cause the shell to exit
+with a status of \fIn\fP.  If
+.I n
+is omitted, the exit status
+is that of the last command executed.
+A trap on
+.SM
+.B EXIT
+is executed before the shell terminates.
+.TP
+\fBexport\fP [\fB\-fn\fP\^] [\fIname\fP[=\fIword\fP]] ...
+.PD 0
+.TP
+.B export \-p
+.PD
+The supplied
+.I names
+are marked for automatic export to the environment of
+subsequently executed commands.  If the 
+.B \-f
+option is given,
+the 
+.I names
+refer to functions.
+If no
+.I names
+are given, or if the
+.B \-p
+option is supplied, a list
+of all names that are exported in this shell is printed.
+The
+.B \-n
+option causes the export property to be removed from the
+named variables.
+If a variable name is followed by =\fIword\fP, the value of
+the variable is set to \fIword\fP.
+.B export
+returns an exit status of 0 unless an invalid option is
+encountered,
+one of the \fInames\fP is not a valid shell variable name, or
+.B \-f
+is supplied with a
+.I name
+that is not a function.
+.TP
+\fBfc\fP [\fB\-e\fP \fIename\fP] [\fB\-nlr\fP] [\fIfirst\fP] [\fIlast\fP]
+.PD 0
+.TP
+\fBfc\fP \fB\-s\fP [\fIpat\fP=\fIrep\fP] [\fIcmd\fP]
+.PD
+Fix Command.  In the first form, a range of commands from
+.I first
+to
+.I last
+is selected from the history list.
+.I First
+and
+.I last
+may be specified as a string (to locate the last command beginning
+with that string) or as a number (an index into the history list,
+where a negative number is used as an offset from the current
+command number).  If 
+.I last
+is not specified it is set to
+the current command for listing (so that
+.if n ``fc \-l \-10''
+.if t \f(CWfc \-l \-10\fP
+prints the last 10 commands) and to
+.I first
+otherwise.
+If
+.I first
+is not specified it is set to the previous
+command for editing and \-16 for listing.
+.sp 1
+The
+.B \-n
+option suppresses
+the command numbers when listing.  The
+.B \-r
+option reverses the order of
+the commands.  If the
+.B \-l
+option is given,
+the commands are listed on
+standard output.  Otherwise, the editor given by
+.I ename
+is invoked
+on a file containing those commands.  If
+.I ename
+is not given, the
+value of the
+.SM
+.B FCEDIT
+variable is used, and
+the value of
+.SM
+.B EDITOR
+if
+.SM
+.B FCEDIT
+is not set.  If neither variable is set,
+.FN vi
+is used.  When editing is complete, the edited commands are
+echoed and executed.
+.sp 1
+In the second form, \fIcommand\fP is re-executed after each instance
+of \fIpat\fP is replaced by \fIrep\fP.
+A useful alias to use with this is
+.if n ``r="fc -s"'',
+.if t \f(CWr='fc \-s'\fP,
+so that typing
+.if n ``r cc''
+.if t \f(CWr cc\fP
+runs the last command beginning with
+.if n ``cc''
+.if t \f(CWcc\fP
+and typing
+.if n ``r''
+.if t \f(CWr\fP
+re-executes the last command.
+.sp 1
+If the first form is used, the return value is 0 unless an invalid
+option is encountered or
+.I first
+or
+.I last
+specify history lines out of range.
+If the
+.B \-e
+option is supplied, the return value is the value of the last
+command executed or failure if an error occurs with the temporary
+file of commands.  If the second form is used, the return status
+is that of the command re-executed, unless
+.I cmd
+does not specify a valid history line, in which case
+.B fc
+returns failure.
+.TP
+\fBfg\fP [\fIjobspec\fP]
+Resume
+.I jobspec
+in the foreground, and make it the current job.
+If
+.I jobspec
+is not present, the shell's notion of the \fIcurrent job\fP is used.
+The return value is that of the command placed into the foreground,
+or failure if run when job control is disabled or, when run with
+job control enabled, if
+.I jobspec
+does not specify a valid job or
+.I jobspec
+specifies a job that was started without job control.
+.TP
+\fBgetopts\fP \fIoptstring\fP \fIname\fP [\fIargs\fP]
+.B getopts
+is used by shell procedures to parse positional parameters.
+.I optstring
+contains the option characters to be recognized; if a character
+is followed by a colon, the option is expected to have an
+argument, which should be separated from it by white space.
+The colon and question mark characters may not be used as
+option characters.
+Each time it is invoked,
+.B getopts
+places the next option in the shell variable
+.IR name ,
+initializing
+.I name
+if it does not exist,
+and the index of the next argument to be processed into the
+variable
+.SM
+.BR OPTIND .
+.SM
+.B OPTIND
+is initialized to 1 each time the shell or a shell script
+is invoked.  When an option requires an argument,
+.B getopts
+places that argument into the variable
+.SM
+.BR OPTARG .
+The shell does not reset
+.SM
+.B OPTIND
+automatically; it must be manually reset between multiple
+calls to
+.B getopts
+within the same shell invocation if a new set of parameters
+is to be used.
+.sp 1
+When the end of options is encountered, \fBgetopts\fP exits with a
+return value greater than zero.
+\fBOPTIND\fP is set to the index of the first non-option argument,
+and \fBname\fP is set to ?.
+.sp 1
+.B getopts
+normally parses the positional parameters, but if more arguments are
+given in
+.IR args ,
+.B getopts
+parses those instead.
+.sp 1
+.B getopts
+can report errors in two ways.  If the first character of
+.I optstring
+is a colon,
+.I silent
+error reporting is used.  In normal operation diagnostic messages
+are printed when invalid options or missing option arguments are
+encountered.
+If the variable
+.SM
+.B OPTERR
+is set to 0, no error messages will be displayed, even if the first
+character of 
+.I optstring
+is not a colon.
+.sp 1
+If an invalid option is seen,
+.B getopts
+places ? into
+.I name
+and, if not silent,
+prints an error message and unsets
+.SM
+.BR OPTARG .
+If
+.B getopts
+is silent,
+the option character found is placed in
+.SM
+.B OPTARG
+and no diagnostic message is printed.
+.sp 1
+If a required argument is not found, and
+.B getopts
+is not silent,
+a question mark (\^\fB?\fP\^) is placed in
+.IR name ,
+.SM
+.B OPTARG
+is unset, and a diagnostic message is printed.
+If
+.B getopts
+is silent, then a colon (\^\fB:\fP\^) is placed in
+.I name
+and
+.SM
+.B OPTARG
+is set to the option character found.
+.sp 1
+.B getopts
+returns true if an option, specified or unspecified, is found.
+It returns false if the end of options is encountered or an
+error occurs.
+.TP
+\fBhash\fP [\fB\-lr\fP] [\fB\-p\fP \fIfilename\fP] [\fB\-dt\fP] [\fIname\fP]
+For each
+.IR name ,
+the full file name of the command is determined by searching
+the directories in
+.B $PATH
+and remembered.
+If the
+.B \-p
+option is supplied, no path search is performed, and
+.I filename
+is used as the full file name of the command.
+The
+.B \-r
+option causes the shell to forget all
+remembered locations.
+The
+.B \-d
+option causes the shell to forget the remembered location of each \fIname\fP.
+If the
+.B \-t
+option is supplied, the full pathname to which each \fIname\fP corresponds
+is printed.  If multiple \fIname\fP arguments are supplied with \fB\-t\fP,
+the \fIname\fP is printed before the hashed full pathname.
+The
+.B \-l
+option causes output to be displayed in a format that may be reused as input.
+If no arguments are given, or if only \fB\-l\fP is supplied,
+information about remembered commands is printed.
+The return status is true unless a
+.I name
+is not found or an invalid option is supplied.
+.TP
+\fBhelp\fP [\fB\-s\fP] [\fIpattern\fP]
+Display helpful information about builtin commands.  If
+.I pattern
+is specified,
+.B help
+gives detailed help on all commands matching
+.IR pattern ;
+otherwise help for all the builtins and shell control structures
+is printed.
+The \fB\-s\fP option restricts the information displayed to a short
+usage synopsis.
+The return status is 0 unless no command matches
+.IR pattern .
+.TP
+\fBhistory [\fIn\fP]
+.PD 0
+.TP
+\fBhistory\fP \fB\-c\fP
+.TP
+\fBhistory \-d\fP \fIoffset\fP
+.TP
+\fBhistory\fP \fB\-anrw\fP [\fIfilename\fP]
+.TP
+\fBhistory\fP \fB\-p\fP \fIarg\fP [\fIarg ...\fP]
+.TP
+\fBhistory\fP \fB\-s\fP \fIarg\fP [\fIarg ...\fP]
+.PD
+With no options, display the command
+history list with line numbers.  Lines listed
+with a 
+.B *
+have been modified.  An argument of
+.I n
+lists only the last
+.I n
+lines.  If \fIfilename\fP is supplied, it is used as the
+name of the history file; if not, the value of
+.SM
+.B HISTFILE
+is used.  Options, if supplied, have the following meanings:
+.RS
+.PD 0
+.TP
+.B \-c
+Clear the history list by deleting all the entries.
+.TP
+\fB\-d\fP \fIoffset\fP
+Delete the history entry at position \fIoffset\fP.
+.TP
+.B \-a
+Append the ``new'' history lines (history lines entered since the
+beginning of the current \fBbash\fP session) to the history file.
+.TP
+.B \-n
+Read the history lines not already read from the history
+file into the current history list.  These are lines
+appended to the history file since the beginning of the
+current \fBbash\fP session.
+.TP
+.B \-r
+Read the contents of the history file
+and use them as the current history.
+.TP
+.B \-w
+Write the current history to the history file, overwriting the
+history file's contents.
+.TP
+.B \-p
+Perform history substitution on the following \fIargs\fP and display
+the result on the standard output.
+Does not store the results in the history list.
+Each \fIarg\fP must be quoted to disable normal history expansion.
+.TP
+.B \-s
+Store the
+.I args
+in the history list as a single entry.  The last command in the
+history list is removed before the
+.I args
+are added.
+.PD
+.PP
+The return value is 0 unless an invalid option is encountered, an
+error occurs while reading or writing the history file, an invalid
+\fIoffset\fP is supplied as an argument to \fB\-d\fP, or the
+history expansion supplied as an argument to \fB\-p\fP fails.
+.RE
+.TP
+\fBjobs\fP [\fB\-lnprs\fP] [ \fIjobspec\fP ... ]
+.PD 0
+.TP
+\fBjobs\fP \fB\-x\fP \fIcommand\fP [ \fIargs\fP ... ]
+.PD
+The first form lists the active jobs.  The options have the following
+meanings:
+.RS
+.PD 0
+.TP
+.B \-l
+List process IDs
+in addition to the normal information.
+.TP
+.B \-p
+List only the process ID of the job's process group
+leader.
+.TP
+.B \-n
+Display information only about jobs that have changed status since
+the user was last notified of their status.
+.TP
+.B \-r
+Restrict output to running jobs.
+.TP
+.B \-s
+Restrict output to stopped jobs.
+.PD
+.PP
+If
+.I jobspec
+is given, output is restricted to information about that job.
+The return status is 0 unless an invalid option is encountered
+or an invalid
+.I jobspec
+is supplied.
+.PP
+If the
+.B \-x
+option is supplied,
+.B jobs
+replaces any
+.I jobspec
+found in
+.I command
+or
+.I args
+with the corresponding process group ID, and executes
+.I command
+passing it
+.IR args ,
+returning its exit status.
+.RE
+.TP
+\fBkill\fP [\fB\-s\fP \fIsigspec\fP | \fB\-n\fP \fIsignum\fP | \fB\-\fP\fIsigspec\fP] [\fIpid\fP | \fIjobspec\fP] ...
+.PD 0
+.TP
+\fBkill\fP \fB\-l\fP [\fIsigspec\fP | \fIexit_status\fP]
+.PD
+Send the signal named by
+.I sigspec
+or
+.I signum
+to the processes named by
+.I pid
+or
+.IR jobspec .
+.I sigspec
+is either a signal name such as
+.SM
+.B SIGKILL
+or a signal number;
+.I signum
+is a signal number.  If
+.I sigspec
+is a signal name, the name may be
+given with or without the
+.SM
+.B SIG
+prefix.
+If
+.I sigspec
+is not present, then
+.SM
+.B SIGTERM
+is assumed.
+An argument of
+.B \-l
+lists the signal names.
+If any arguments are supplied when
+.B \-l
+is given, the names of the signals corresponding to the arguments are
+listed, and the return status is 0.
+The \fIexit_status\fP argument to
+.B \-l
+is a number specifying either a signal number or the exit status of
+a process terminated by a signal.
+.B kill
+returns true if at least one signal was successfully sent, or false
+if an error occurs or an invalid option is encountered.
+.TP
+\fBlet\fP \fIarg\fP [\fIarg\fP ...]
+Each
+.I arg
+is an arithmetic expression to be evaluated (see
+.SM
+.BR "ARITHMETIC EVALUATION" ).
+If the last
+.I arg
+evaluates to 0,
+.B let
+returns 1; 0 is returned otherwise.
+.TP
+\fBlocal\fP [\fIoption\fP] [\fIname\fP[=\fIvalue\fP] ...]
+For each argument, a local variable named
+.I name 
+is created, and assigned
+.IR value .
+The \fIoption\fP can be any of the options accepted by \fBdeclare\fP.
+When
+.B local
+is used within a function, it causes the variable
+.I name
+to have a visible scope restricted to that function and its children.
+With no operands,
+.B local
+writes a list of local variables to the standard output.  It is
+an error to use
+.B local
+when not within a function.  The return status is 0 unless
+.B local
+is used outside a function, an invalid
+.I name
+is supplied, or
+\fIname\fP is a readonly variable.
+.TP
+.B logout
+Exit a login shell.
+.TP
+\fBpopd\fP [\-\fBn\fP] [+\fIn\fP] [\-\fIn\fP]
+Removes entries from the directory stack.  With no arguments,
+removes the top directory from the stack, and performs a
+.B cd
+to the new top directory.
+Arguments, if supplied, have the following meanings:
+.RS
+.PD 0
+.TP
+\fB+\fP\fIn\fP
+Removes the \fIn\fPth entry counting from the left of the list
+shown by
+.BR dirs ,
+starting with zero.  For example:
+.if n ``popd +0''
+.if t \f(CWpopd +0\fP
+removes the first directory,
+.if n ``popd +1''
+.if t \f(CWpopd +1\fP
+the second.
+.TP
+\fB\-\fP\fIn\fP
+Removes the \fIn\fPth entry counting from the right of the list
+shown by
+.BR dirs ,
+starting with zero.  For example:
+.if n ``popd -0''
+.if t \f(CWpopd -0\fP
+removes the last directory,
+.if n ``popd -1''
+.if t \f(CWpopd -1\fP
+the next to last.
+.TP
+.B \-n
+Suppresses the normal change of directory when removing directories
+from the stack, so that only the stack is manipulated.
+.PD
+.PP
+If the
+.B popd
+command is successful, a 
+.B dirs
+is performed as well, and the return status is 0.
+.B popd
+returns false if an invalid option is encountered, the directory stack
+is empty, a non-existent directory stack entry is specified, or the
+directory change fails.
+.RE
+.TP
+\fBprintf\fP \fIformat\fP [\fIarguments\fP]
+Write the formatted \fIarguments\fP to the standard output under the
+control of the \fIformat\fP.
+The \fIformat\fP is a character string which contains three types of objects:
+plain characters, which are simply copied to standard output, character
+escape sequences, which are converted and copied to the standard output, and
+format specifications, each of which causes printing of the next successive
+\fIargument\fP.
+In addition to the standard \fIprintf\fP(1) formats, \fB%b\fP causes
+\fBprintf\fP to expand backslash escape sequences in the corresponding
+\fIargument\fP, and \fB%q\fP causes \fBprintf\fP to output the corresponding
+\fIargument\fP in a format that can be reused as shell input.
+.sp 1
+The \fIformat\fP is reused as necessary to consume all of the \fIarguments\fP.
+If the \fIformat\fP requires more \fIarguments\fP than are supplied, the
+extra format specifications behave as if a zero value or null string, as
+appropriate, had been supplied.  The return value is zero on success,
+non-zero on failure.
+.TP
+\fBpushd\fP [\fB\-n\fP] [\fIdir\fP]
+.PD 0
+.TP
+\fBpushd\fP [\fB\-n\fP] [+\fIn\fP] [\-\fIn\fP]
+.PD
+Adds a directory to the top of the directory stack, or rotates
+the stack, making the new top of the stack the current working
+directory.  With no arguments, exchanges the top two directories
+and returns 0, unless the directory stack is empty.
+Arguments, if supplied, have the following meanings:
+.RS
+.PD 0
+.TP
+\fB+\fP\fIn\fP
+Rotates the stack so that the \fIn\fPth directory
+(counting from the left of the list shown by
+.BR dirs ,
+starting with zero)
+is at the top.
+.TP
+\fB\-\fP\fIn\fP
+Rotates the stack so that the \fIn\fPth directory
+(counting from the right of the list shown by
+.BR dirs ,
+starting with zero) is at the top.
+.TP
+.B \-n
+Suppresses the normal change of directory when adding directories
+to the stack, so that only the stack is manipulated.
+.TP
+.I dir
+Adds
+.I dir
+to the directory stack at the top, making it the
+new current working directory.
+.PD
+.PP
+If the
+.B pushd
+command is successful, a 
+.B dirs
+is performed as well.
+If the first form is used,
+.B pushd
+returns 0 unless the cd to
+.I dir
+fails.  With the second form,
+.B pushd
+returns 0 unless the directory stack is empty,
+a non-existent directory stack element is specified,
+or the directory change to the specified new current directory
+fails.
+.RE
+.TP
+\fBpwd\fP [\fB\-LP\fP]
+Print the absolute pathname of the current working directory.
+The pathname printed contains no symbolic links if the
+.B \-P
+option is supplied or the 
+.B \-o physical
+option to the
+.B set
+builtin command is enabled.
+If the
+.B \-L
+option is used, the pathname printed may contain symbolic links.
+The return status is 0 unless an error occurs while
+reading the name of the current directory or an
+invalid option is supplied.
+.TP
+\fBread\fP [\fB\-ers\fP] [\fB\-u\fP \fIfd\fP] [\fB\-t\fP \fItimeout\fP] [\fB\-a\fP \fIaname\fP] [\fB\-p\fP \fIprompt\fP] [\fB\-n\fP \fInchars\fP] [\fB\-d\fP \fIdelim\fP] [\fIname\fP ...]
+One line is read from the standard input, or from the file descriptor
+\fIfd\fP supplied as an argument to the \fB\-u\fP option, and the first word
+is assigned to the first
+.IR name ,
+the second word to the second
+.IR name ,
+and so on, with leftover words and their intervening separators assigned
+to the last
+.IR name .
+If there are fewer words read from the input stream than names,
+the remaining names are assigned empty values.
+The characters in 
+.SM
+.B IFS
+are used to split the line into words.
+The backslash character (\fB\e\fP) may be used to remove any special
+meaning for the next character read and for line continuation.
+Options, if supplied, have the following meanings:
+.RS
+.PD 0
+.TP
+.B \-a \fIaname\fP
+The words are assigned to sequential indices
+of the array variable
+.IR aname ,
+starting at 0.
+.I aname
+is unset before any new values are assigned.
+Other \fIname\fP arguments are ignored.
+.TP
+.B \-d \fIdelim\fP
+The first character of \fIdelim\fP is used to terminate the input line,
+rather than newline.
+.TP
+.B \-e
+If the standard input
+is coming from a terminal,
+.B readline
+(see
+.SM
+.B READLINE
+above) is used to obtain the line.
+.TP
+.B \-n \fInchars\fP
+\fBread\fP returns after reading \fInchars\fP characters rather than
+waiting for a complete line of input.
+.TP
+.B \-p \fIprompt\fP
+Display \fIprompt\fP on standard error, without a
+trailing newline, before attempting to read any input.  The prompt
+is displayed only if input is coming from a terminal.
+.TP
+.B \-r
+Backslash does not act as an escape character.
+The backslash is considered to be part of the line.
+In particular, a backslash-newline pair may not be used as a line
+continuation.
+.TP
+.B \-s
+Silent mode.  If input is coming from a terminal, characters are
+not echoed.
+.TP
+.B \-t \fItimeout\fP
+Cause \fBread\fP to time out and return failure if a complete line of
+input is not read within \fItimeout\fP seconds.
+This option has no effect if \fBread\fP is not reading input from the
+terminal or a pipe.
+.TP
+.B \-u \fIfd\FP
+Read input from file descriptor \fIfd\fP.
+.PD
+.PP
+If no
+.I names
+are supplied, the line read is assigned to the variable
+.SM
+.BR REPLY .
+The return code is zero, unless end-of-file is encountered, \fBread\fP
+times out, or an invalid file descriptor is supplied as the argument to
+\fB\-u\fP.
+.RE
+.TP
+\fBreadonly\fP [\fB\-apf\fP] [\fIname\fP[=\fIword\fP] ...]
+.PD
+The given
+\fInames\fP are marked readonly; the values of these
+.I names
+may not be changed by subsequent assignment.
+If the
+.B \-f
+option is supplied, the functions corresponding to the
+\fInames\fP are so
+marked.
+The
+.B \-a
+option restricts the variables to arrays.
+If no
+.I name
+arguments are given, or if the
+.B \-p
+option is supplied, a list of all readonly names is printed.
+The
+.B \-p
+option causes output to be displayed in a format that
+may be reused as input.
+If a variable name is followed by =\fIword\fP, the value of
+the variable is set to \fIword\fP.
+The return status is 0 unless an invalid option is encountered,
+one of the
+.I names
+is not a valid shell variable name, or
+.B \-f
+is supplied with a
+.I name
+that is not a function.
+.TP
+\fBreturn\fP [\fIn\fP]
+Causes a function to exit with the return value specified by
+.IR n .
+If 
+.I n
+is omitted, the return status is that of the last command
+executed in the function body.  If used outside a function,
+but during execution of a script by the 
+.B .
+(\fBsource\fP) command, it causes the shell to stop executing
+that script and return either
+.I n
+or the exit status of the last command executed within the
+script as the exit status of the script.  If used outside a
+function and not during execution of a script by \fB.\fP\^,
+the return status is false.
+Any command associated with the \fBRETURN\fP trap is executed
+before execution resumes after the function or script.
+.TP
+\fBset\fP [\fB\-\-abefhkmnptuvxBCHP\fP] [\fB\-o\fP \fIoption\fP] [\fIarg\fP ...]
+Without options, the name and value of each shell variable are displayed
+in a format that can be reused as input.
+The output is sorted according to the current locale.
+When options are specified, they set or unset shell attributes.
+Any arguments remaining after the options are processed are treated
+as values for the positional parameters and are assigned, in order, to 
+.BR $1 ,
+.BR $2 ,
+.B ...
+.BR $\fIn\fP .
+Options, if specified, have the following meanings:
+.RS
+.PD 0
+.TP 8
+.B \-a
+Automatically mark variables and functions which are modified or created
+for export to the environment of subsequent commands.
+.TP 8
+.B \-b
+Report the status of terminated background jobs
+immediately, rather than before the next primary prompt.  This is
+effective only when job control is enabled.
+.TP 8
+.B \-e
+Exit immediately if a \fIsimple command\fP (see
+.SM
+.B SHELL GRAMMAR
+above) exits with a non-zero status.
+The shell does not exit if the
+command that fails is part of the command list immediately following a
+.B while
+or
+.B until
+keyword, 
+part of the test in an
+.I if
+statement, part of a
+.B &&
+or
+.B \(bv\(bv
+list, or if the command's return value is
+being inverted via
+.BR ! .
+A trap on \fBERR\fP, if set, is executed before the shell exits.
+.TP 8
+.B \-f
+Disable pathname expansion.
+.TP 8 
+.B \-h
+Remember the location of commands as they are looked up for execution.
+This is enabled by default.
+.TP 8
+.B \-k
+All arguments in the form of assignment statements
+are placed in the environment for a command, not just
+those that precede the command name.
+.TP 8
+.B \-m
+Monitor mode.  Job control is enabled.  This option is on
+by default for interactive shells on systems that support
+it (see
+.SM
+.B JOB CONTROL
+above).  Background processes run in a separate process
+group and a line containing their exit status is printed
+upon their completion.
+.TP 8
+.B \-n
+Read commands but do not execute them.  This may be used to 
+check a shell script for syntax errors.  This is ignored by
+interactive shells.
+.TP 8
+.B \-o \fIoption\-name\fP
+The \fIoption\-name\fP can be one of the following:
+.RS
+.TP 8
+.B allexport
+Same as
+.BR \-a .
+.TP 8
+.B braceexpand
+Same as
+.BR \-B .
+.TP 8
+.B emacs
+Use an emacs-style command line editing interface.  This is enabled
+by default when the shell is interactive, unless the shell is started
+with the
+.B \-\-noediting
+option.
+.TP 8
+.B errtrace
+Same as
+.BR \-E .
+.TP 8
+.B functrace
+Same as
+.BR \-T .
+.TP 8
+.B errexit
+Same as
+.BR \-e .
+.TP 8
+.B hashall
+Same as
+.BR \-h .
+.TP 8
+.B histexpand
+Same as
+.BR \-H .
+.TP 8
+.B history
+Enable command history, as described above under
+.SM
+.BR HISTORY .
+This option is on by default in interactive shells.
+.TP 8
+.B ignoreeof
+The effect is as if the shell command
+.if t \f(CWIGNOREEOF=10\fP
+.if n ``IGNOREEOF=10''
+had been executed
+(see
+.B Shell Variables
+above).
+.TP 8
+.B keyword
+Same as
+.BR \-k .
+.TP 8
+.B monitor
+Same as
+.BR \-m .
+.TP 8
+.B noclobber
+Same as
+.BR \-C .
+.TP 8
+.B noexec
+Same as
+.BR \-n .
+.TP 8
+.B noglob
+Same as
+.BR \-f .
+.B nolog
+Currently ignored.
+.TP 8
+.B notify
+Same as
+.BR \-b .
+.TP 8
+.B nounset
+Same as
+.BR \-u .
+.TP 8
+.B onecmd
+Same as
+.BR \-t .
+.TP 8
+.B physical
+Same as
+.BR \-P .
+.TP 8
+.B posix
+Change the behavior of
+.B bash
+where the default operation differs
+from the POSIX 1003.2 standard to match the standard (\fIposix mode\fP).
+.TP 8
+.B privileged
+Same as
+.BR \-p .
+.TP 8
+.B verbose
+Same as
+.BR \-v .
+.TP 8
+.B vi
+Use a vi-style command line editing interface.
+.TP 8
+.B xtrace
+Same as
+.BR \-x .
+.sp .5
+.PP
+If
+.B \-o
+is supplied with no \fIoption\-name\fP, the values of the current options are
+printed.
+If
+.B +o
+is supplied with no \fIoption\-name\fP, a series of
+.B set
+commands to recreate the current option settings is displayed on
+the standard output.
+.RE
+.TP 8
+.B \-p
+Turn on
+.I privileged
+mode.  In this mode, the
+.SM
+.B $ENV
+and
+.SM
+.B $BASH_ENV
+files are not processed, shell functions are not inherited from the
+environment, and the
+.SM
+.B SHELLOPTS
+variable, if it appears in the environment, is ignored.
+If the shell is started with the effective user (group) id not equal to the
+real user (group) id, and the \fB\-p\fP option is not supplied, these actions
+are taken and the effective user id is set to the real user id.
+If the \fB\-p\fP option is supplied at startup, the effective user id is
+not reset.
+Turning this option off causes the effective user
+and group ids to be set to the real user and group ids.
+.TP 8
+.B \-t
+Exit after reading and executing one command.
+.TP 8
+.B \-u
+Treat unset variables as an error when performing
+parameter expansion.  If expansion is attempted on an
+unset variable, the shell prints an error message, and,
+if not interactive, exits with a non-zero status.
+.TP 8
+.B \-v
+Print shell input lines as they are read.
+.TP 8
+.B \-x
+After expanding each \fIsimple command\fP,
+\fBfor\fP command, \fBcase\fP command, \fBselect\fP command, or
+arithmetic \fBfor\fP command, display the expanded value of
+.SM
+.BR PS4 ,
+followed by the command and its expanded arguments
+or associated word list.
+.TP 8
+.B \-B
+The shell performs brace expansion (see
+.B Brace Expansion
+above).  This is on by default.
+.TP 8
+.B \-C
+If set,
+.B bash
+does not overwrite an existing file with the
+.BR > ,
+.BR >& ,
+and
+.B <>
+redirection operators.  This may be overridden when 
+creating output files by using the redirection operator
+.B >|
+instead of
+.BR > .
+.TP 8
+.B \-E
+If set, any trap on \fBERR\fP is inherited by shell functions, command
+substitutions, and commands executed in a subshell environment.
+The \fBERR\fP trap is normally not inherited in such cases.
+.TP 8
+.B \-H
+Enable
+.B !
+style history substitution.  This option is on by
+default when the shell is interactive.
+.TP 8
+.B \-P
+If set, the shell does not follow symbolic links when executing
+commands such as
+.B cd
+that change the current working directory.  It uses the
+physical directory structure instead.  By default,
+.B bash
+follows the logical chain of directories when performing commands
+which change the current directory.
+.TP 8
+.B \-T
+If set, any trap on \fBDEBUG\fP is inherited by shell functions, command
+substitutions, and commands executed in a subshell environment.
+The \fBDEBUG\fP trap is normally not inherited in such cases.
+.TP 8
+.B \-\-
+If no arguments follow this option, then the positional parameters are
+unset.  Otherwise, the positional parameters are set to the
+\fIarg\fPs, even if some of them begin with a
+.BR \- .
+.TP 8
+.B \-
+Signal the end of options, cause all remaining \fIarg\fPs to be
+assigned to the positional parameters.  The
+.B \-x
+and
+.B \-v
+options are turned off.
+If there are no \fIarg\fPs,
+the positional parameters remain unchanged.
+.PD
+.PP
+The options are off by default unless otherwise noted.
+Using + rather than \- causes these options to be turned off.
+The options can also be specified as arguments to an invocation of
+the shell.
+The current set of options may be found in
+.BR $\- .
+The return status is always true unless an invalid option is encountered.
+.RE
+.TP
+\fBshift\fP [\fIn\fP]
+The positional parameters from \fIn\fP+1 ... are renamed to
+.B $1
+.B ....
+Parameters represented by the numbers \fB$#\fP
+down to \fB$#\fP\-\fIn\fP+1 are unset.
+.I n
+must be a non-negative number less than or equal to \fB$#\fP.
+If
+.I n
+is 0, no parameters are changed.
+If
+.I n 
+is not given, it is assumed to be 1.
+If
+.I n
+is greater than \fB$#\fP, the positional parameters are not changed.
+The return status is greater than zero if
+.I n
+is greater than
+.B $#
+or less than zero; otherwise 0.
+.TP
+\fBshopt\fP [\fB\-pqsu\fP] [\fB\-o\fP] [\fIoptname\fP ...]
+Toggle the values of variables controlling optional shell behavior.
+With no options, or with the
+.B \-p
+option, a list of all settable options is displayed, with
+an indication of whether or not each is set.
+The \fB\-p\fP option causes output to be displayed in a form that
+may be reused as input.
+Other options have the following meanings:
+.RS
+.PD 0
+.TP
+.B \-s
+Enable (set) each \fIoptname\fP.
+.TP
+.B \-u
+Disable (unset) each \fIoptname\fP.
+.TP
+.B \-q
+Suppresses normal output (quiet mode); the return status indicates
+whether the \fIoptname\fP is set or unset.
+If multiple \fIoptname\fP arguments are given with
+.BR \-q ,
+the return status is zero if all \fIoptnames\fP are enabled; non-zero
+otherwise.
+.TP
+.B \-o
+Restricts the values of \fIoptname\fP to be those defined for the
+.B \-o
+option to the
+.B set
+builtin.
+.PD
+.PP
+If either
+.B \-s
+or
+.B \-u
+is used with no \fIoptname\fP arguments, the display is limited to
+those options which are set or unset, respectively.
+Unless otherwise noted, the \fBshopt\fP options are disabled (unset)
+by default.
+.PP
+The return status when listing options is zero if all \fIoptnames\fP
+are enabled, non-zero otherwise.  When setting or unsetting options,
+the return status is zero unless an \fIoptname\fP is not a valid shell
+option.
+.PP
+The list of \fBshopt\fP options is:
+.if t .sp .5v
+.if n .sp 1v
+.PD 0
+.TP 8
+.B cdable_vars
+If set, an argument to the
+.B cd
+builtin command that
+is not a directory is assumed to be the name of a variable whose
+value is the directory to change to.
+.TP 8
+.B cdspell
+If set, minor errors in the spelling of a directory component in a
+.B cd
+command will be corrected.
+The errors checked for are transposed characters,
+a missing character, and one character too many.
+If a correction is found, the corrected file name is printed,
+and the command proceeds.
+This option is only used by interactive shells.
+.TP 8
+.B checkhash
+If set, \fBbash\fP checks that a command found in the hash
+table exists before trying to execute it.  If a hashed command no
+longer exists, a normal path search is performed.
+.TP 8
+.B checkwinsize
+If set, \fBbash\fP checks the window size after each command
+and, if necessary, updates the values of
+.SM
+.B LINES
+and
+.SM
+.BR COLUMNS .
+.TP 8
+.B cmdhist
+If set,
+.B bash
+attempts to save all lines of a multiple-line
+command in the same history entry.  This allows
+easy re-editing of multi-line commands.
+.TP 8
+.B dotglob
+If set, 
+.B bash
+includes filenames beginning with a `.' in the results of pathname
+expansion.
+.TP 8
+.B execfail
+If set, a non-interactive shell will not exit if
+it cannot execute the file specified as an argument to the
+.B exec
+builtin command.  An interactive shell does not exit if
+.B exec
+fails.
+.TP 8
+.B expand_aliases
+If set, aliases are expanded as described above under
+.SM
+.BR ALIASES .
+This option is enabled by default for interactive shells.
+.TP 8
+.B extdebug
+If set, behavior intended for use by debuggers is enabled:
+.RS
+.TP
+.B 1.
+The \fB\-F\fP option to the \fBdeclare\fP builtin displays the source
+file name and line number corresponding to each function name supplied
+as an argument.
+.TP
+.B 2.
+If the command run by the \fBDEBUG\fP trap returns a non-zero value, the
+next command is skipped and not executed.
+.TP
+.B 3.
+If the command run by the \fBDEBUG\fP trap returns a value of 2, and the
+shell is executing in a subroutine (a shell function or a shell script
+executed by the \fB.\fP or \fBsource\fP builtins), a call to
+\fBreturn\fP is simulated.
+.RE
+.TP 8
+.B extglob
+If set, the extended pattern matching features described above under
+\fBPathname Expansion\fP are enabled.
+.TP 8
+.B extquote
+If set, \fB$\fP'\fIstring\fP' and \fB$\fP"\fIstring\fP" quoting is
+performed within \fB${\fP\fIparameter\fP\fB}\fP expansions
+enclosed in double quotes.  This option is enabled by default.
+.TP 8
+.B histappend
+If set, the history list is appended to the file named by the value
+of the
+.B HISTFILE
+variable when the shell exits, rather than overwriting the file.
+.TP 8
+.B histreedit
+If set, and
+.B readline
+is being used, a user is given the opportunity to re-edit a
+failed history substitution.
+.TP 8
+.B histverify
+If set, and 
+.B readline
+is being used, the results of history substitution are not immediately
+passed to the shell parser.  Instead, the resulting line is loaded into
+the \fBreadline\fP editing buffer, allowing further modification.
+.TP 8
+.B hostcomplete
+If set, and
+.B readline
+is being used, \fBbash\fP will attempt to perform hostname completion when a
+word containing a \fB@\fP is being completed (see
+.B Completing
+under
+.SM
+.B READLINE
+above).
+This is enabled by default.
+.TP 8
+.B huponexit
+If set, \fBbash\fP will send
+.SM
+.B SIGHUP
+to all jobs when an interactive login shell exits.
+.TP 8
+.B interactive_comments
+If set, allow a word beginning with
+.B #
+to cause that word and all remaining characters on that
+line to be ignored in an interactive shell (see
+.SM
+.B COMMENTS
+above).  This option is enabled by default.
+.TP 8
+.B lithist
+If set, and the
+.B cmdhist
+option is enabled, multi-line commands are saved to the history with
+embedded newlines rather than using semicolon separators where possible.
+.TP 8
+.B login_shell
+The shell sets this option if it is started as a login shell (see
+.SM
+.B "INVOCATION"
+above).
+The value may not be changed.
+.TP 8
+.B mailwarn
+If set, and a file that \fBbash\fP is checking for mail has been  
+accessed since the last time it was checked, the message ``The mail in
+\fImailfile\fP has been read'' is displayed.
+.TP 8
+.B no_empty_cmd_completion
+If set, and
+.B readline
+is being used,
+.B bash
+will not attempt to search the \fBPATH\fP for possible completions when
+completion is attempted on an empty line.
+.TP 8
+.B nocaseglob
+If set,
+.B bash
+matches filenames in a case\-insensitive fashion when performing pathname
+expansion (see
+.B Pathname Expansion
+above).
+.TP 8
+.B nullglob
+If set,
+.B bash
+allows patterns which match no
+files (see
+.B Pathname Expansion
+above)
+to expand to a null string, rather than themselves.
+.TP 8
+.B progcomp
+If set, the programmable completion facilities (see
+\fBProgrammable Completion\fP above) are enabled.
+This option is enabled by default.
+.TP 8
+.B promptvars
+If set, prompt strings undergo variable and parameter expansion after
+being expanded as described in
+.SM
+.B PROMPTING
+above.  This option is enabled by default.
+.TP 8
+.B restricted_shell
+The shell sets this option if it is started in restricted mode (see
+.SM
+.B "RESTRICTED SHELL"
+below).
+The value may not be changed.
+This is not reset when the startup files are executed, allowing
+the startup files to discover whether or not a shell is restricted.
+.TP 8
+.B shift_verbose
+If set, the
+.B shift
+builtin prints an error message when the shift count exceeds the
+number of positional parameters.
+.TP 8
+.B sourcepath
+If set, the
+\fBsource\fP (\fB.\fP) builtin uses the value of
+.SM
+.B PATH
+to find the directory containing the file supplied as an argument.
+This option is enabled by default.
+.TP 8
+.B xpg_echo
+If set, the \fBecho\fP builtin expands backslash-escape sequences
+by default.
+.RE
+.TP
+\fBsuspend\fP [\fB\-f\fP]
+Suspend the execution of this shell until it receives a
+.SM
+.B SIGCONT
+signal.  The
+.B \-f
+option says not to complain if this is 
+a login shell; just suspend anyway.  The return status is 0 unless
+the shell is a login shell and
+.B \-f
+is not supplied, or if job control is not enabled.
+.TP
+\fBtest\fP \fIexpr\fP
+.PD 0
+.TP
+\fB[\fP \fIexpr\fP \fB]\fP
+Return a status of 0 or 1 depending on
+the evaluation of the conditional expression
+.IR expr .
+Each operator and operand must be a separate argument.
+Expressions are composed of the primaries described above under
+.SM
+.BR "CONDITIONAL EXPRESSIONS" .
+.if t .sp 0.5
+.if n .sp 1
+Expressions may be combined using the following operators, listed
+in decreasing order of precedence.
+.RS
+.PD 0
+.TP
+.B ! \fIexpr\fP
+True if
+.I expr
+is false.
+.TP
+.B ( \fIexpr\fP )
+Returns the value of \fIexpr\fP.
+This may be used to override the normal precedence of operators.
+.TP
+\fIexpr1\fP \-\fBa\fP \fIexpr2\fP
+True if both
+.I expr1
+and
+.I expr2
+are true.
+.TP
+\fIexpr1\fP \-\fBo\fP \fIexpr2\fP
+True if either
+.I expr1
+or
+.I expr2
+is true.
+.PD
+.PP
+\fBtest\fP and \fB[\fP evaluate conditional
+expressions using a set of rules based on the number of arguments.
+.if t .sp 0.5
+.if n .sp 1
+.PD 0
+.TP
+0 arguments
+The expression is false.
+.TP
+1 argument
+The expression is true if and only if the argument is not null.
+.TP
+2 arguments
+If the first argument is \fB!\fP, the expression is true if and
+only if the second argument is null.
+If the first argument is one of the unary conditional operators listed above
+under
+.SM
+.BR "CONDITIONAL EXPRESSIONS" ,
+the expression is true if the unary test is true.
+If the first argument is not a valid unary conditional operator, the expression
+is false.
+.TP
+3 arguments
+If the second argument is one of the binary conditional operators listed above
+under
+.SM
+.BR "CONDITIONAL EXPRESSIONS" ,
+the result of the expression is the result of the binary test using
+the first and third arguments as operands.
+If the first argument is \fB!\fP, the value is the negation of
+the two-argument test using the second and third arguments.
+If the first argument is exactly \fB(\fP and the third argument is
+exactly \fB)\fP, the result is the one-argument test of the second
+argument.
+Otherwise, the expression is false.
+The \fB\-a\fP and \fB\-o\fP operators are considered binary operators
+in this case.  
+.TP
+4 arguments
+If the first argument is \fB!\fP, the result is the negation of
+the three-argument expression composed of the remaining arguments.
+Otherwise, the expression is parsed and evaluated according to 
+precedence using the rules listed above.
+.TP
+5 or more arguments
+The expression is parsed and evaluated according to precedence
+using the rules listed above.
+.RE
+.PD
+.TP
+.B times
+Print the accumulated user and system times for the shell and
+for processes run from the shell.  The return status is 0.
+.TP
+\fBtrap\fP [\fB\-lp\fP] [\fIarg\fP] [\fIsigspec\fP ...]
+The command
+.I arg
+is to be read and executed when the shell receives
+signal(s)
+.IR sigspec .
+If
+.I arg
+is absent or
+.BR \- ,
+all specified signals are
+reset to their original values (the values they had
+upon entrance to the shell).
+If 
+.I arg
+is the null string the signal specified by each
+.I sigspec
+is ignored by the shell and by the commands it invokes.
+If
+.I arg
+is not present and
+.B \-p
+has been supplied, then the trap commands associated with each
+.I sigspec
+are displayed.
+If no arguments are supplied or if only
+.B \-p
+is given,
+.B trap
+prints the list of commands associated with each signal number.
+The
+.B \-l
+option causes the shell to print a list of signal names and
+their corresponding numbers.
+Each
+.I sigspec
+is either
+a signal name defined in <\fIsignal.h\fP>, or a signal number.
+If a
+.I sigspec
+is
+.SM
+.B EXIT
+(0) the command
+.I arg
+is executed on exit from the shell.
+If a
+.I sigspec
+is
+.SM
+.BR DEBUG ,
+the command
+.I arg
+is executed before every \fIsimple command\fP, \fIfor\fP command,
+\fIcase\fP command, \fIselect\fP command, every arithmetic \fIfor\fP
+command, and before the first command executes in a shell function (see
+.SM
+.B SHELL GRAMMAR
+above).
+Refer to the description of the \fBextglob\fP option to the
+\fBshopt\fP builtin for details of its effect on the \fBDEBUG\fP trap.
+If a
+.I sigspec
+is
+.SM
+.BR ERR ,
+the command
+.I arg
+is executed whenever a simple command has a non\-zero exit status.
+The
+.SM
+.B ERR
+trap is not executed if the failed
+command is part of the command list immediately following a
+.B while
+or
+.B until
+keyword, 
+part of the test in an
+.I if
+statement, part of a
+.B &&
+or
+.B \(bv\(bv
+list, or if the command's return value is
+being inverted via
+.BR ! .
+If a
+.I sigspec
+is
+.SM
+.BR RETURN ,
+the command
+.I arg
+is executed each time a shell function or a script executed with the
+\fB.\fP or \fBsource\fP builtins finishes executing.
+Signals ignored upon entry to the shell cannot be trapped or reset.
+Trapped signals are reset to their original values in a child
+process when it is created.
+The return status is false if any
+.I sigspec
+is invalid; otherwise
+.B trap
+returns true.
+.TP
+\fBtype\fP [\fB\-aftpP\fP] \fIname\fP [\fIname\fP ...]
+With no options, 
+indicate how each
+.I name
+would be interpreted if used as a command name.
+If the
+.B \-t
+option is used,
+.B type
+prints a string which is one of
+.IR alias ,
+.IR keyword ,
+.IR function ,
+.IR builtin ,
+or
+.I file 
+if
+.I name
+is an alias, shell reserved word, function, builtin, or disk file,
+respectively.
+If the
+.I name
+is not found, then nothing is printed, and an exit status of false
+is returned.
+If the
+.B \-p
+option is used,
+.B type
+either returns the name of the disk file
+that would be executed if
+.I name
+were specified as a command name,
+or nothing if
+.if t \f(CWtype -t name\fP
+.if n ``type -t name''
+would not return
+.IR file .
+The
+.B \-P
+option forces a
+.SM
+.B PATH
+search for each \fIname\fP, even if
+.if t \f(CWtype -t name\fP
+.if n ``type -t name''
+would not return
+.IR file .
+If a command is hashed,
+.B \-p
+and
+.B \-P
+print the hashed value, not necessarily the file that appears
+first in 
+.SM
+.BR PATH .
+If the
+.B \-a
+option is used, 
+.B type
+prints all of the places that contain
+an executable named 
+.IR name .
+This includes aliases and functions,
+if and only if the 
+.B \-p
+option is not also used.
+The table of hashed commands is not consulted
+when using
+.BR \-a .
+The
+.B \-f
+option suppresses shell function lookup, as with the \fBcommand\fP builtin.
+.B type
+returns true if any of the arguments are found, false if
+none are found.
+.TP
+\fBulimit\fP [\fB\-SHacdflmnpstuv\fP [\fIlimit\fP]]
+Provides control over the resources available to the shell and to
+processes started by it, on systems that allow such control.
+The \fB\-H\fP and \fB\-S\fP options specify that the hard or soft limit is
+set for the given resource.  A hard limit cannot be increased once it
+is set; a soft limit may be increased up to the value of the hard limit.
+If neither \fB\-H\fP nor \fB\-S\fP is specified, both the soft and hard
+limits are set.
+The value of
+.I limit
+can be a number in the unit specified for the resource
+or one of the special values
+.BR hard ,
+.BR soft ,
+or
+.BR unlimited ,
+which stand for the current hard limit, the current soft limit, and
+no limit, respectively.
+If
+.I limit
+is omitted, the current value of the soft limit of the resource is
+printed, unless the \fB\-H\fP option is given.  When more than one
+resource is specified, the limit name and unit are printed before the value.
+Other options are interpreted as follows:
+.RS
+.PD 0
+.TP
+.B \-a
+All current limits are reported
+.TP
+.B \-c
+The maximum size of core files created
+.TP
+.B \-d
+The maximum size of a process's data segment
+.TP
+.B \-f
+The maximum size of files created by the shell
+.TP
+.B \-l
+The maximum size that may be locked into memory
+.TP
+.B \-m
+The maximum resident set size
+.TP
+.B \-n
+The maximum number of open file descriptors (most systems do not
+allow this value to be set)
+.TP
+.B \-p
+The pipe size in 512-byte blocks (this may not be set)
+.TP
+.B \-s
+The maximum stack size
+.TP
+.B \-t
+The maximum amount of cpu time in seconds
+.TP
+.B \-u
+The maximum number of processes available to a single user
+.TP
+.B \-v
+The maximum amount of virtual memory available to the shell
+.PD
+.PP
+If
+.I limit
+is given, it is the new value of the specified resource (the
+.B \-a
+option is display only).
+If no option is given, then
+.B \-f
+is assumed.  Values are in 1024-byte increments, except for
+.BR \-t ,
+which is in seconds,
+.BR \-p ,
+which is in units of 512-byte blocks,
+and
+.B \-n
+and
+.BR \-u ,
+which are unscaled values.
+The return status is 0 unless an invalid option or argument is supplied,
+or an error occurs while setting a new limit.
+.RE
+.TP
+\fBumask\fP [\fB\-p\fP] [\fB\-S\fP] [\fImode\fP]
+The user file-creation mask is set to 
+.IR mode .
+If
+.I mode
+begins with a digit, it
+is interpreted as an octal number; otherwise
+it is interpreted as a symbolic mode mask similar
+to that accepted by
+.IR chmod (1).
+If
+.I mode
+is omitted, the current value of the mask is printed.
+The
+.B \-S
+option causes the mask to be printed in symbolic form; the
+default output is an octal number.
+If the
+.B \-p
+option is supplied, and
+.I mode
+is omitted, the output is in a form that may be reused as input.
+The return status is 0 if the mode was successfully changed or if
+no \fImode\fP argument was supplied, and false otherwise.
+.TP
+\fBunalias\fP [\-\fBa\fP] [\fIname\fP ...]
+Remove each \fIname\fP from the list of defined aliases.  If
+.B \-a
+is supplied, all alias definitions are removed.  The return
+value is true unless a supplied
+.I name
+is not a defined alias.
+.TP
+\fBunset\fP [\-\fBfv\fP] [\fIname\fP ...]
+For each
+.IR name ,
+remove the corresponding variable or function.
+If no options are supplied, or the
+.B \-v
+option is given, each
+.I name
+refers to a shell variable.
+Read-only variables may not be unset.
+If
+.B \-f
+is specifed, 
+each
+.I name
+refers to a shell function, and the function definition
+is removed.
+Each unset variable or function is removed from the environment
+passed to subsequent commands.
+If any of
+.SM
+.BR RANDOM ,
+.SM
+.BR SECONDS ,
+.SM
+.BR LINENO ,
+.SM
+.BR HISTCMD ,
+.SM
+.BR FUNCNAME ,
+.SM
+.BR GROUPS ,
+or
+.SM
+.B DIRSTACK
+are unset, they lose their special properties, even if they are
+subsequently reset.  The exit status is true unless a
+.I name
+is readonly.
+.TP
+\fBwait\fP [\fIn\fP]
+Wait for the specified process and return its termination
+status.
+.I n
+may be a process
+ID or a job specification; if a job spec is given, all processes
+in that job's pipeline are waited for.  If
+.I n
+is not given, all currently active child processes
+are waited for, and the return status is zero.  If
+.I n
+specifies a non-existent process or job, the return status is
+127.  Otherwise, the return status is the exit status of the last
+process or job waited for.
+.\" bash_builtins
+.if \n(zZ=1 .ig zZ
+.SH "RESTRICTED SHELL"
+.\" rbash.1
+.zY
+.PP
+If
+.B bash
+is started with the name
+.BR rbash ,
+or the
+.B \-r
+option is supplied at invocation,
+the shell becomes restricted.
+A restricted shell is used to
+set up an environment more controlled than the standard shell.
+It behaves identically to
+.B bash
+with the exception that the following are disallowed or not performed:
+.IP \(bu
+changing directories with \fBcd\fP
+.IP \(bu
+setting or unsetting the values of
+.BR SHELL ,
+.BR PATH ,
+.BR ENV ,
+or
+.B BASH_ENV
+.IP \(bu
+specifying command names containing
+.B /
+.IP \(bu
+specifying a file name containing a
+.B /
+as an argument to the
+.B .
+builtin command
+.IP \(bu
+Specifying a filename containing a slash as an argument to the
+.B \-p
+option to the
+.B hash
+builtin command
+.IP \(bu
+importing function definitions from the shell environment at startup
+.IP \(bu
+parsing the value of \fBSHELLOPTS\fP from the shell environment at startup
+.IP \(bu
+redirecting output using the >, >|, <>, >&, &>, and >> redirection operators
+.IP \(bu
+using the
+.B exec
+builtin command to replace the shell with another command
+.IP \(bu
+adding or deleting builtin commands with the
+.B \-f
+and
+.B \-d
+options to the
+.B enable
+builtin command
+.IP \(bu
+Using the \fBenable\fP builtin command to enable disabled shell builtins
+.IP \(bu
+specifying the
+.B \-p
+option to the
+.B command
+builtin command
+.IP \(bu
+turning off restricted mode with
+\fBset +r\fP or \fBset +o restricted\fP.
+.PP
+These restrictions are enforced after any startup files are read.
+.PP
+When a command that is found to be a shell script is executed (see
+.SM
+.B "COMMAND EXECUTION"
+above),
+.B rbash
+turns off any restrictions in the shell spawned to execute the
+script.
+.\" end of rbash.1
+.if \n(zY=1 .ig zY
+.SH "SEE ALSO"
+.PD 0
+.TP
+\fIBash Reference Manual\fP, Brian Fox and Chet Ramey
+.TP
+\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIPortable Operating System Interface (POSIX) Part 2: Shell and Utilities\fP, IEEE
+.TP
+\fIsh\fP(1), \fIksh\fP(1), \fIcsh\fP(1)
+.TP
+\fIemacs\fP(1), \fIvi\fP(1)
+.TP
+\fIreadline\fP(3)
+.PD
+.SH FILES
+.PD 0
+.TP
+.FN /bin/bash
+The \fBbash\fP executable
+.TP
+.FN /etc/profile
+The systemwide initialization file, executed for login shells
+.TP
+.FN ~/.bash_profile
+The personal initialization file, executed for login shells
+.TP
+.FN ~/.bashrc
+The individual per-interactive-shell startup file
+.TP
+.FN ~/.bash_logout
+The individual login shell cleanup file, executed when a login shell exits
+.TP
+.FN ~/.inputrc
+Individual \fIreadline\fP initialization file
+.PD
+.SH AUTHORS
+Brian Fox, Free Software Foundation
+.br
+bfox@gnu.org
+.PP
+Chet Ramey, Case Western Reserve University
+.br
+chet@po.CWRU.Edu
+.SH BUG REPORTS
+If you find a bug in
+.B bash,
+you should report it.  But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of
+.BR bash .
+The latest version is always available from
+\fIftp://ftp.gnu.org/pub/bash/\fP.
+.PP
+Once you have determined that a bug actually exists, use the
+.I bashbug
+command to submit a bug report.
+If you have a fix, you are encouraged to mail that as well!
+Suggestions and `philosophical' bug reports may be mailed
+to \fIbug-bash@gnu.org\fP or posted to the Usenet
+newsgroup
+.BR gnu.bash.bug .
+.PP
+ALL bug reports should include:
+.PP
+.PD 0
+.TP 20
+The version number of \fBbash\fR
+.TP
+The hardware and operating system
+.TP
+The compiler used to compile
+.TP
+A description of the bug behaviour
+.TP
+A short script or `recipe' which exercises the bug
+.PD
+.PP
+.I bashbug
+inserts the first three items automatically into the template
+it provides for filing a bug report.
+.PP
+Comments and bug reports concerning
+this manual page should be directed to
+.IR chet@po.CWRU.Edu .
+.SH BUGS
+.PP
+It's too big and too slow.
+.PP
+There are some subtle differences between 
+.B bash
+and traditional versions of
+.BR sh ,
+mostly because of the
+.SM
+.B POSIX
+specification.
+.PP
+Aliases are confusing in some uses.
+.PP
+Shell builtin commands and functions are not stoppable/restartable.
+.PP
+Compound commands and command sequences of the form `a ; b ; c'
+are not handled gracefully when process suspension is attempted.
+When a process is stopped, the shell immediately executes the next
+command in the sequence.
+It suffices to place the sequence of commands between
+parentheses to force it into a subshell, which may be stopped as
+a unit.
+.PP
+Commands inside of \fB$(\fP...\fB)\fP command substitution are not
+parsed until substitution is attempted.  This will delay error
+reporting until some time after the command is entered.
+.PP
+Array variables may not (yet) be exported.
+.zZ
+.zY
diff --git a/doc/bash.html b/doc/bash.html
new file mode 100644 (file)
index 0000000..28a80c4
--- /dev/null
@@ -0,0 +1,11339 @@
+<HTML><HEAD>
+<TITLE>BASH(1) Manual Page</TITLE>
+</HEAD>
+<BODY><TABLE WIDTH=100%>
+<TH ALIGN=LEFT>BASH(1)<TH ALIGN=CENTER>2003 Nov 13<TH ALIGN=RIGHT>BASH(1)
+</TABLE>
+<BR><A HREF="#index">Index</A>
+<HR>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<A NAME="lbAB">&nbsp;</A>
+<H2>NAME</H2>
+
+bash - GNU Bourne-Again SHell
+<A NAME="lbAC">&nbsp;</A>
+<H2>SYNOPSIS</H2>
+
+<B>bash</B>
+
+[options]
+[file]
+<A NAME="lbAD">&nbsp;</A>
+<H2>COPYRIGHT</H2>
+
+
+Bash is Copyright &#169; 1989-2003 by the Free Software Foundation, Inc.
+<A NAME="lbAE">&nbsp;</A>
+<H2>DESCRIPTION</H2>
+
+<B>Bash</B>
+
+is an <B>sh</B>-compatible command language interpreter that
+executes commands read from the standard input or from a file.
+<B>Bash</B>
+
+also incorporates useful features from the <I>Korn</I> and <I>C</I>
+shells (<B>ksh</B> and <B>csh</B>).
+<P>
+
+<B>Bash</B>
+
+is intended to be a conformant implementation of the IEEE
+POSIX Shell and Tools specification (IEEE Working Group 1003.2).
+<A NAME="lbAF">&nbsp;</A>
+<H2>OPTIONS</H2>
+
+In addition to the single-character shell options documented in the
+description of the <B>set</B> builtin command, <B>bash</B>
+interprets the following options when it is invoked:
+<P>
+
+
+<DL COMPACT>
+<DT><B>-c</B><I> string</I>
+
+<DD>
+If the
+<B>-c</B>
+
+option is present, then commands are read from
+<I>string</I>.
+
+If there are arguments after the
+<I>string</I>,
+
+they are assigned to the positional parameters, starting with
+<B>$0</B>.
+
+<DT><B>-i</B>
+
+<DD>
+If the
+<B>-i</B>
+
+option is present, the shell is
+<I>interactive</I>.
+
+<DT><B>-l</B>
+
+<DD>
+Make
+<B>bash</B>
+
+act as if it had been invoked as a login shell (see
+<FONT SIZE=-1><B>INVOCATION</B>
+
+</FONT>
+below).
+<DT><B>-r</B>
+
+<DD>
+If the
+<B>-r</B>
+
+option is present, the shell becomes
+<I>restricted</I>
+
+(see
+<FONT SIZE=-1><B>RESTRICTED SHELL</B>
+
+</FONT>
+below).
+<DT><B>-s</B>
+
+<DD>
+If the
+<B>-s</B>
+
+option is present, or if no arguments remain after option
+processing, then commands are read from the standard input.
+This option allows the positional parameters to be set
+when invoking an interactive shell.
+<DT><B>-D</B>
+
+<DD>
+A list of all double-quoted strings preceded by <B>$</B>
+is printed on the standard ouput.
+These are the strings that
+are subject to language translation when the current locale
+is not <B>C</B> or <B>POSIX</B>.
+This implies the <B>-n</B> option; no commands will be executed.
+<DT><B>[-+]O [</B><I>shopt_option</I>]
+
+<DD>
+<I>shopt_option</I> is one of the shell options accepted by the
+<B>shopt</B> builtin (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+If <I>shopt_option</I> is present, <B>-O</B> sets the value of that option;
+<B>+O</B> unsets it.
+If <I>shopt_option</I> is not supplied, the names and values of the shell
+options accepted by <B>shopt</B> are printed on the standard output.
+If the invocation option is <B>+O</B>, the output is displayed in a format
+that may be reused as input.
+<DT><B>--</B>
+
+<DD>
+A
+<B>--</B>
+
+signals the end of options and disables further option processing.
+Any arguments after the
+<B>--</B>
+
+are treated as filenames and arguments.  An argument of
+<B>-</B>
+
+is equivalent to <B>--</B>.
+
+</DL>
+<P>
+
+<B>Bash</B>
+
+also interprets a number of multi-character options.
+These options must appear on the command line before the
+single-character options to be recognized.
+<P>
+
+
+<DL COMPACT>
+<DT><B>--debugger</B>
+
+<DD>
+Arrange for the debugger profile to be executed before the shell
+starts.  Turns on extended debugging mode (see the description of the
+<B>extdebug</B>
+
+option to the
+<B>shopt</B>
+
+builtin below) and shell function tracing (see the description of the
+<B>-o functrace</B> option to the
+<B>set</B>
+
+builtin below).
+<DT><B>--dump-po-strings</B>
+
+<DD>
+Equivalent to <B>-D</B>, but the output is in the GNU <I>gettext</I>
+<B>po</B> (portable object) file format.
+<DT><B>--dump-strings</B>
+
+<DD>
+Equivalent to <B>-D</B>.
+<DT><B>--help</B>
+
+<DD>
+Display a usage message on standard output and exit successfully.
+<DT><B>--init-file</B> <I>file</I><DD>
+
+<DT><B>--rcfile</B> <I>file</I><DD>
+
+Execute commands from
+<I>file</I>
+
+instead of the standard personal initialization file
+<A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>
+
+if the shell is interactive (see
+<FONT SIZE=-1><B>INVOCATION</B>
+
+</FONT>
+below).
+<DT><B>--login</B>
+
+<DD>
+Equivalent to <B>-l</B>.
+<DT><B>--noediting</B>
+
+<DD>
+Do not use the GNU
+<B>readline</B>
+
+library to read command lines when the shell is interactive.
+<DT><B>--noprofile</B>
+
+<DD>
+Do not read either the system-wide startup file
+
+<A HREF="file:/etc/profile"><I>/etc/profile</I></A>
+
+or any of the personal initialization files
+<A HREF="file:~/.bash_profile"><I>~/.bash_profile</I></A>,
+
+<A HREF="file:~/.bash_login"><I>~/.bash_login</I></A>,
+
+or
+<A HREF="file:~/.profile"><I>~/.profile</I></A>.
+
+By default,
+<B>bash</B>
+
+reads these files when it is invoked as a login shell (see
+<FONT SIZE=-1><B>INVOCATION</B>
+
+</FONT>
+below).
+<DT><B>--norc</B>
+
+<DD>
+Do not read and execute the personal initialization file
+<A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>
+
+if the shell is interactive.
+This option is on by default if the shell is invoked as
+<B>sh</B>.
+
+<DT><B>--posix</B>
+
+<DD>
+Change the behavior of <B>bash</B> where the default operation differs
+from the POSIX 1003.2 standard to match the standard (<I>posix mode</I>).
+<DT><B>--restricted</B>
+
+<DD>
+The shell becomes restricted (see
+<FONT SIZE=-1><B>RESTRICTED SHELL</B>
+
+</FONT>
+below).
+<DT><B>--verbose</B>
+
+<DD>
+Equivalent to  <B>-v</B>.
+<DT><B>--version</B>
+
+<DD>
+Show version information for this instance of
+<B>bash</B>
+
+on the standard output and exit successfully.
+
+</DL>
+<A NAME="lbAG">&nbsp;</A>
+<H2>ARGUMENTS</H2>
+
+If arguments remain after option processing, and neither the
+<B>-c</B>
+
+nor the
+<B>-s</B>
+
+option has been supplied, the first argument is assumed to
+be the name of a file containing shell commands.
+If
+<B>bash</B>
+
+is invoked in this fashion, 
+<B>$0</B>
+
+is set to the name of the file, and the positional parameters
+are set to the remaining arguments.
+<B>Bash</B>
+
+reads and executes commands from this file, then exits.
+<B>Bash</B>'s exit status is the exit status of the last command
+executed in the script.
+If no commands are executed, the exit status is 0.
+An attempt is first made to open the file in the current directory, and,
+if no file is found, then the shell searches the directories in
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+for the script.
+<A NAME="lbAH">&nbsp;</A>
+<H2>INVOCATION</H2>
+
+A <I>login shell</I> is one whose first character of argument zero is a
+<B>-</B>,
+
+or one started with the 
+<B>--login</B>
+
+option.
+<P>
+
+An <I>interactive</I> shell is one started without non-option arguments
+and without the
+<B>-c</B>
+
+option
+whose standard input and output are
+both connected to terminals (as determined by
+<I>isatty</I>(3)),
+
+or one started with the
+<B>-i</B>
+
+option.
+<FONT SIZE=-1><B>PS1</B>
+
+</FONT>
+is set and
+<B>$-</B>
+
+includes
+<B>i</B>
+
+if
+<B>bash</B>
+
+is interactive,
+allowing a shell script or a startup file to test this state.
+<P>
+
+The following paragraphs describe how
+<B>bash</B>
+
+executes its startup files.
+If any of the files exist but cannot be read,
+<B>bash</B>
+
+reports an error.
+Tildes are expanded in file names as described below under
+<B>Tilde Expansion</B>
+
+in the
+<FONT SIZE=-1><B>EXPANSION</B>
+
+</FONT>
+section.
+<P>
+
+When
+<B>bash</B>
+
+is invoked as an interactive login shell, or as a non-interactive shell
+with the <B>--login</B> option, it first reads and
+executes commands from the file <A HREF="file:/etc/profile"><I>/etc/profile</I></A>, if that
+file exists.
+After reading that file, it looks for <A HREF="file:~/.bash_profile"><I>~/.bash_profile</I></A>,
+<A HREF="file:~/.bash_login"><I>~/.bash_login</I></A>, and <A HREF="file:~/.profile"><I>~/.profile</I></A>, in that order, and reads
+and executes commands from the first one that exists and is readable.
+The
+<B>--noprofile</B>
+
+option may be used when the shell is started to inhibit this behavior.
+<P>
+
+When a login shell exits,
+<B>bash</B>
+
+reads and executes commands from the file <A HREF="file:~/.bash_logout"><I>~/.bash_logout</I></A>, if it
+exists.
+<P>
+
+When an interactive shell that is not a login shell is started,
+<B>bash</B>
+
+reads and executes commands from <A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>, if that file exists.
+This may be inhibited by using the
+<B>--norc</B>
+
+option.
+The <B>--rcfile</B> <I>file</I> option will force
+<B>bash</B>
+
+to read and execute commands from <I>file</I> instead of <A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>.
+<P>
+
+When
+<B>bash</B>
+
+is started non-interactively, to run a shell script, for example, it
+looks for the variable
+<FONT SIZE=-1><B>BASH_ENV</B>
+
+</FONT>
+in the environment, expands its value if it appears there, and uses the
+expanded value as the name of a file to read and execute.
+<B>Bash</B>
+
+behaves as if the following command were executed:
+<P>
+<DL COMPACT><DT><DD>
+<TT>if [ -n &quot;$BASH_ENV&quot; ]; then . &quot;$BASH_ENV&quot;; fi</TT>
+
+</DL>
+
+<P>
+but the value of the
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+variable is not used to search for the file name.
+<P>
+
+If
+<B>bash</B>
+
+is invoked with the name
+<B>sh</B>,
+
+it tries to mimic the startup behavior of historical versions of
+<B>sh</B>
+
+as closely as possible,
+while conforming to the POSIX standard as well.
+When invoked as an interactive login shell, or a non-interactive
+shell with the <B>--login</B> option, it first attempts to
+read and execute commands from
+<A HREF="file:/etc/profile"><I>/etc/profile</I></A>
+
+and
+<A HREF="file:~/.profile"><I>~/.profile</I></A>,
+
+in that order.
+The
+<B>--noprofile</B>
+
+option may be used to inhibit this behavior.
+When invoked as an interactive shell with the name
+<B>sh</B>,
+
+<B>bash</B>
+
+looks for the variable
+<FONT SIZE=-1><B>ENV</B>,
+
+</FONT>
+expands its value if it is defined, and uses the
+expanded value as the name of a file to read and execute.
+Since a shell invoked as
+<B>sh</B>
+
+does not attempt to read and execute commands from any other startup
+files, the
+<B>--rcfile</B>
+
+option has no effect.
+A non-interactive shell invoked with the name
+<B>sh</B>
+
+does not attempt to read any other startup files. 
+When invoked as
+<B>sh</B>,
+
+<B>bash</B>
+
+enters
+<I>posix</I>
+
+mode after the startup files are read.
+<P>
+
+When
+<B>bash</B>
+
+is started in
+<I>posix</I>
+
+mode, as with the
+<B>--posix</B>
+
+command line option, it follows the POSIX standard for startup files.
+In this mode, interactive shells expand the
+<FONT SIZE=-1><B>ENV</B>
+
+</FONT>
+variable and commands are read and executed from the file
+whose name is the expanded value.
+No other startup files are read.
+<P>
+
+<B>Bash</B>
+
+attempts to determine when it is being run by the remote shell
+daemon, usually <I>rshd</I>.
+If
+<B>bash</B>
+
+determines it is being run by <I>rshd</I>, it reads and executes
+commands from <A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>, if that file exists and is readable.
+It will not do this if invoked as <B>sh</B>.
+The
+<B>--norc</B>
+
+option may be used to inhibit this behavior, and the
+<B>--rcfile</B>
+
+option may be used to force another file to be read, but
+<I>rshd</I> does not generally invoke the shell with those options
+or allow them to be specified.
+<P>
+
+If the shell is started with the effective user (group) id not equal to the
+real user (group) id, and the <B>-p</B> option is not supplied, no startup
+files are read, shell functions are not inherited from the environment, the
+<FONT SIZE=-1><B>SHELLOPTS</B>
+
+</FONT>
+variable, if it appears in the environment, is ignored,
+and the effective user id is set to the real user id.
+If the <B>-p</B> option is supplied at invocation, the startup behavior is
+the same, but the effective user id is not reset.
+<A NAME="lbAI">&nbsp;</A>
+<H2>DEFINITIONS</H2>
+
+<P>
+
+The following definitions are used throughout the rest of this
+document.
+
+<DL COMPACT>
+<DT><B>blank </B>
+
+<DD>
+A space or tab.
+<DT><B>word</B>
+
+<DD>
+A sequence of characters considered as a single unit by the shell.
+Also known as a
+<B>token</B>.
+
+<DT><B>name</B>
+
+<DD>
+A 
+<I>word</I>
+
+consisting only of alphanumeric characters and underscores, and
+beginning with an alphabetic character or an underscore.  Also
+referred to as an
+<B>identifier</B>.
+
+<DT><B>metacharacter</B>
+
+<DD>
+A character that, when unquoted, separates words.  One of the following:
+<BR>
+
+<DL COMPACT><DT><DD>
+<P>
+
+<B>|  &amp;  ;  (  )  &lt;  &gt;  space  tab</B>
+
+</DL>
+
+</DL>
+<P>
+
+<DL COMPACT>
+<DT><B>control operator</B>
+
+<DD>
+A <I>token</I> that performs a control function.  It is one of the following
+symbols:
+<DL COMPACT><DT><DD>
+<P>
+
+<B>||  &amp;  &amp;&amp;  ;  ;;  (  )  |  &lt;newline&gt;</B>
+
+</DL>
+
+
+</DL>
+<A NAME="lbAJ">&nbsp;</A>
+<H2>RESERVED WORDS</H2>
+
+<I>Reserved words</I> are words that have a special meaning to the shell.
+The following words are recognized as reserved when unquoted and either
+the first word of a simple command (see
+<FONT SIZE=-1><B>SHELL GRAMMAR</B>
+
+</FONT>
+below) or the third word of a 
+<B>case </B>
+
+or
+<B>for</B>
+
+command:
+<DL COMPACT><DT><DD>
+
+<P>
+
+<B>
+</B>
+
+!    case    do    done    elif    else    esac    fi    for    function    if    in    select    then    until    while    {    }    time    [[    ]]
+</DL>
+
+
+
+<A NAME="lbAK">&nbsp;</A>
+<H2>SHELL GRAMMAR</H2>
+
+<A NAME="lbAL">&nbsp;</A>
+<H3>Simple Commands</H3>
+
+<P>
+
+A <I>simple command</I> is a sequence of optional variable assignments
+followed by <B>blank</B>-separated words and redirections, and
+terminated by a <I>control operator</I>.  The first word
+specifies the command to be executed, and is passed as argument zero.
+The remaining words are passed as arguments to the invoked command.
+<P>
+
+The return value of a <I>simple command</I> is its exit status, or
+128+<I>n</I> if the command is terminated by signal
+<I>n</I>.
+
+<A NAME="lbAM">&nbsp;</A>
+<H3>Pipelines</H3>
+
+<P>
+
+A <I>pipeline</I> is a sequence of one or more commands separated by
+the character
+<B>|</B>.
+
+The format for a pipeline is:
+<DL COMPACT><DT><DD>
+<P>
+
+[<B>time</B> [<B>-p</B>]] [ ! ] <I>command</I> [ <B>|</B> <I>command2</I> ... ]
+</DL>
+
+<P>
+
+The standard output of
+<I>command</I>
+
+is connected via a pipe to the standard input of
+<I>command2</I>.
+
+This connection is performed before any redirections specified by the
+command (see
+<FONT SIZE=-1><B>REDIRECTION</B>
+
+</FONT>
+below).
+<P>
+
+The return status of a pipeline is the exit status of the last
+command, unless the <B>pipefail</B> option is enabled.
+If <B>pipefail</B> is enabled, the pipeline's return status is the
+value of the last (rightmost) command to exit with a non-zero status,
+or zero if all commands exit successfully.
+If the reserved word
+<B>!</B>
+
+precedes a pipeline, the exit status of that pipeline is the logical
+negation of the exit status as described above.
+The shell waits for all commands in the pipeline to
+terminate before returning a value.
+<P>
+
+If the
+<B>time</B>
+
+reserved word precedes a pipeline, the elapsed as well as user and
+system time consumed by its execution are reported when the pipeline
+terminates.
+The <B>-p</B> option changes the output format to that specified by POSIX.
+The
+<FONT SIZE=-1><B>TIMEFORMAT</B>
+
+</FONT>
+variable may be set to a format string that specifies how the timing
+information should be displayed; see the description of
+<FONT SIZE=-1><B>TIMEFORMAT</B>
+
+</FONT>
+under
+<B>Shell Variables</B>
+
+below.
+<P>
+
+Each command in a pipeline is executed as a separate process (i.e., in a
+subshell).
+<A NAME="lbAN">&nbsp;</A>
+<H3>Lists</H3>
+
+<P>
+
+A <I>list</I> is a sequence of one or more pipelines separated by one
+of the operators
+<B>;</B>,
+
+<B>&amp;</B>,
+
+<B>&amp;&amp;</B>,
+
+or
+<B>||</B>,
+
+and optionally terminated by one of
+<B>;</B>,
+
+<B>&amp;</B>,
+
+or
+<B>&lt;newline&gt;</B>.
+
+<P>
+
+Of these list operators,
+<B>&amp;&amp;</B>
+
+and
+<B>||</B>
+
+have equal precedence, followed by
+<B>;</B>
+
+and
+<B>&amp;,</B>
+
+which have equal precedence.
+<P>
+
+A sequence of one or more newlines may appear in a <I>list</I> instead
+of a semicolon to delimit commands.
+<P>
+
+If a command is terminated by the control operator
+<B>&amp;</B>,
+
+the shell executes the command in the <I>background</I>
+in a subshell.  The shell does not wait for the command to
+finish, and the return status is 0.  Commands separated by a
+<B>;</B>
+
+are executed sequentially; the shell waits for each
+command to terminate in turn.  The return status is the
+exit status of the last command executed.
+<P>
+
+The control operators
+<B>&amp;&amp;</B>
+
+and
+<B>||</B>
+
+denote AND lists and OR lists, respectively.
+An AND list has the form
+<DL COMPACT><DT><DD>
+<P>
+
+<I>command1</I> <B>&amp;&amp;</B> <I>command2</I>
+</DL>
+
+<P>
+
+<I>command2</I>
+
+is executed if, and only if,
+<I>command1</I>
+
+returns an exit status of zero.
+<P>
+
+An OR list has the form
+<DL COMPACT><DT><DD>
+<P>
+
+<I>command1</I> <B>||</B> <I>command2</I>
+<P>
+
+</DL>
+
+<P>
+
+<I>command2</I>
+
+is executed if and only if
+<I>command1</I>
+
+returns a non-zero exit status.  The return status of
+AND and OR lists is the exit status of the last command
+executed in the list.
+<A NAME="lbAO">&nbsp;</A>
+<H3>Compound Commands</H3>
+
+<P>
+
+A <I>compound command</I> is one of the following:
+<DL COMPACT>
+<DT>(<I>list</I>)<DD>
+<I>list</I> is executed in a subshell environment (see
+<FONT SIZE=-1><B>COMMAND EXECUTION ENVIRONMENT</B></FONT>
+below).
+Variable assignments and builtin
+commands that affect the shell's environment do not remain in effect
+after the command completes.  The return status is the exit status of
+<I>list</I>.
+<DT>{ <I>list</I>; }<DD>
+<I>list</I> is simply executed in the current shell environment.
+<I>list</I> must be terminated with a newline or semicolon.
+This is known as a <I>group command</I>.
+The return status is the exit status of
+<I>list</I>.
+Note that unlike the metacharacters <B>(</B> and <B>)</B>, <B>{</B> and
+<B>}</B> are <I>reserved words</I> and must occur where a reserved
+word is permitted to be recognized.  Since they do not cause a word
+break, they must be separated from <I>list</I> by whitespace.
+<DT>((<I>expression</I>))<DD>
+The <I>expression</I> is evaluated according to the rules described
+below under
+<FONT SIZE=-1><B>ARITHMETIC EVALUATION</B>.
+
+</FONT>
+If the value of the expression is non-zero, the return status is 0;
+otherwise the return status is 1.  This is exactly equivalent to
+<B>let &quot;</B><I>expression</I>&quot;.
+<DT><B>[[</B> <I>expression</I> <B>]]</B><DD>
+Return a status of 0 or 1 depending on the evaluation of
+the conditional expression <I>expression</I>.
+Expressions are composed of the primaries described below under
+<FONT SIZE=-1><B>CONDITIONAL EXPRESSIONS</B>.
+
+</FONT>
+Word splitting and pathname expansion are not performed on the words
+between the <B>[[</B> and <B>]]</B>; tilde expansion, parameter and
+variable expansion, arithmetic expansion, command substitution, process
+substitution, and quote removal are performed.
+Conditional operators such as <B>-f</B> must be unquoted to be recognized
+as primaries.
+<P>
+
+
+When the <B>==</B> and <B>!=</B> operators are used, the string to the
+right of the operator is considered a pattern and matched according
+to the rules described below under <B>Pattern Matching</B>.
+The return value is 0 if the string matches or does not match
+the pattern, respectively, and 1 otherwise.
+Any part of the pattern may be quoted to force it to be matched as a
+string.
+<P>
+
+
+An additional binary operator, <B>=~</B>, is available, with the same
+precedence as <B>==</B> and <B>!=</B>.
+When it is used, the string to the right of the operator is considered
+an extended regular expression and matched accordingly (as in <I>regex</I>(3)).  
+The return value is 0 if the string matches
+the pattern, and 1 otherwise.
+If the regular expression is syntactically incorrect, the conditional
+expression's return value is 2.
+If the shell option
+<B>nocaseglob</B>
+
+is enabled, the match is performed without regard to the case
+of alphabetic characters.
+Substrings matched by parenthesized subexpressions within the regular
+expression are saved in the array variable <B>BASH_REMATCH</B>.
+The element of <B>BASH_REMATCH</B> with index 0 is the portion of the string
+matching the entire regular expression.
+The element of <B>BASH_REMATCH</B> with index <I>n</I> is the portion of the
+string matching the <I>n</I>th parenthesized subexpression.
+<P>
+
+
+Expressions may be combined using the following operators, listed
+in decreasing order of precedence:
+<P>
+
+
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>( </B><I>expression</I> )
+
+<DD>
+Returns the value of <I>expression</I>.
+This may be used to override the normal precedence of operators.
+<DT><B>! </B><I>expression</I>
+
+<DD>
+True if
+<I>expression</I>
+
+is false.
+<DT><I>expression1</I> <B>&amp;&amp;</B> <I>expression2</I><DD>
+True if both
+<I>expression1</I>
+
+and
+<I>expression2</I>
+
+are true.
+<DT><I>expression1</I> <B>||</B> <I>expression2</I>
+<DD>
+
+True if either
+<I>expression1</I>
+
+or
+<I>expression2</I>
+
+is true.
+
+</DL>
+<P>
+
+The <B>&amp;&amp;</B> and
+<B>||</B>
+
+operators do not evaluate <I>expression2</I> if the value of
+<I>expression1</I> is sufficient to determine the return value of
+the entire conditional expression.
+</DL>
+
+<DT><B>for</B> <I>name</I> [ <B>in</B> <I>word</I> ] ; <B>do</B> <I>list</I> ; <B>done</B><DD>
+The list of words following <B>in</B> is expanded, generating a list
+of items.
+The variable <I>name</I> is set to each element of this list
+in turn, and <I>list</I> is executed each time.
+If the <B>in</B> <I>word</I> is omitted, the <B>for</B> command executes
+<I>list</I> once for each positional parameter that is set (see
+<FONT SIZE=-1><B>PARAMETERS</B>
+
+</FONT>
+below).
+The return status is the exit status of the last command that executes.
+If the expansion of the items following <B>in</B> results in an empty
+list, no commands are executed, and the return status is 0.
+<DT><B>for</B> (( <I>expr1</I> ; <I>expr2</I> ; <I>expr3</I> )) ; <B>do</B> <I>list</I> ; <B>done</B><DD>
+First, the arithmetic expression <I>expr1</I> is evaluated according
+to the rules described below under
+<FONT SIZE=-1><B>ARITHMETIC EVALUATION</B>.
+
+</FONT>
+The arithmetic expression <I>expr2</I> is then evaluated repeatedly
+until it evaluates to zero.
+Each time <I>expr2</I> evaluates to a non-zero value, <I>list</I> is
+executed and the arithmetic expression <I>expr3</I> is evaluated.
+If any expression is omitted, it behaves as if it evaluates to 1.
+The return value is the exit status of the last command in <I>list</I>
+that is executed, or false if any of the expressions is invalid.
+<DT><B>select</B> <I>name</I> [ <B>in</B> <I>word</I> ] ; <B>do</B> <I>list</I> ; <B>done</B><DD>
+The list of words following <B>in</B> is expanded, generating a list
+of items.  The set of expanded words is printed on the standard
+error, each preceded by a number.  If the <B>in</B>
+<I>word</I> is omitted, the positional parameters are printed (see
+<FONT SIZE=-1><B>PARAMETERS</B>
+
+</FONT>
+below).  The
+<B>PS3</B>
+
+prompt is then displayed and a line read from the standard input.
+If the line consists of a number corresponding to one of
+the displayed words, then the value of
+<I>name</I>
+
+is set to that word.  If the line is empty, the words and prompt
+are displayed again.  If EOF is read, the command completes.  Any
+other value read causes
+<I>name</I>
+
+to be set to null.  The line read is saved in the variable
+<B>REPLY</B>.
+
+The
+<I>list</I>
+
+is executed after each selection until a
+<B>break</B>
+
+command is executed.
+The exit status of
+<B>select</B>
+
+is the exit status of the last command executed in
+<I>list</I>,
+
+or zero if no commands were executed.
+<DT><B>case</B> <I>word</I> <B>in</B> [ [(] <I>pattern</I> [ <B>|</B> <I>pattern</I> ] 
+<DD>
+A <B>case</B> command first expands <I>word</I>, and tries to match
+it against each <I>pattern</I> in turn, using the same matching rules
+as for pathname expansion (see
+<B>Pathname Expansion</B>
+
+below).  When a match is found, the
+corresponding <I>list</I> is executed.  After the first match, no
+subsequent matches are attempted.  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>
+The
+<B>if </B>
+
+<I>list</I>
+
+is executed.  If its exit status is zero, the
+<B>then</B> <I>list</I> is executed.  Otherwise, each <B>elif</B>
+<I>list</I> is executed in turn, and if its exit status is zero,
+the corresponding <B>then</B> <I>list</I> is executed and the
+command completes.  Otherwise, the <B>else</B> <I>list</I> is
+executed, if present.  The exit status is the exit status of the
+last command executed, or zero if no condition tested true.
+<DT><B>while</B> <I>list</I>; <B>do</B> <I>list</I>; <B>done</B><DD>
+
+<DT><B>until</B> <I>list</I>; <B>do</B> <I>list</I>; <B>done</B><DD>
+
+The <B>while</B> command continuously executes the <B>do</B>
+<I>list</I> as long as the last command in <I>list</I> returns
+an exit status of zero.  The <B>until</B> command is identical
+to the <B>while</B> command, except that the test is negated;
+the
+<B>do</B>
+
+<I>list</I>
+
+is executed as long as the last command in
+<I>list</I>
+
+returns a non-zero exit status.
+The exit status of the <B>while</B> and <B>until</B> commands
+is the exit status
+of the last <B>do</B> <I>list</I> command executed, or zero if
+none was executed.
+</DL>
+<A NAME="lbAP">&nbsp;</A>
+<H3>Shell Function Definitions</H3>
+
+<P>
+
+A shell function is an object that is called like a simple command and
+executes a compound command with a new set of positional parameters.
+Shell functions are declared as follows:
+<DL COMPACT>
+<DT>[ <B>function</B> ] <I>name</I> () <I>compound-command</I> [<I>redirection</I>]<DD>
+This defines a function named <I>name</I>.
+The reserved word <B>function</B> is optional.
+If the <B>function</B> reserved word is supplied, the parentheses are optional.
+The <I>body</I> of the function is the compound command
+<I>compound-command </I>
+
+(see <B>Compound Commands</B> above).
+That command is usually a <I>list</I> of commands between { and }, but
+may be any command listed under <B>Compound Commands</B> above.
+<I>compound-command</I> is executed whenever <I>name</I> is specified as the
+name of a simple command.
+Any redirections (see
+<FONT SIZE=-1><B>REDIRECTION</B>
+
+</FONT>
+below) specified when a function is defined are performed
+when the function is executed.
+The exit status of a function definition is zero unless a syntax error
+occurs or a readonly function with the same name already exists.
+When executed, the exit status of a function is the exit status of the
+last command executed in the body.  (See
+<FONT SIZE=-1><B>FUNCTIONS</B>
+
+</FONT>
+below.)
+</DL>
+<A NAME="lbAQ">&nbsp;</A>
+<H2>COMMENTS</H2>
+
+In a non-interactive shell, or an interactive shell in which the
+<B>interactive_comments</B>
+
+option to the
+<B>shopt</B>
+
+builtin is enabled (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below), a word beginning with
+<B>#</B>
+
+causes that word and all remaining characters on that line to
+be ignored.  An interactive shell without the
+<B>interactive_comments</B>
+
+option enabled does not allow comments.  The
+<B>interactive_comments</B>
+
+option is on by default in interactive shells.
+<A NAME="lbAR">&nbsp;</A>
+<H2>QUOTING</H2>
+
+<I>Quoting</I> is used to remove the special meaning of certain
+characters or words to the shell.  Quoting can be used to 
+disable special treatment for special characters, to prevent
+reserved words from being recognized as such, and to prevent
+parameter expansion.
+<P>
+
+Each of the <I>metacharacters</I> listed above under
+<FONT SIZE=-1><B>DEFINITIONS</B>
+
+</FONT>
+has special meaning to the shell and must be quoted if it is to
+represent itself.
+<P>
+
+When the command history expansion facilities are being used, the
+<I>history expansion</I> character, usually <B>!</B>, must be quoted
+to prevent history expansion.
+<P>
+
+There are three quoting mechanisms: the
+<I>escape character</I>,
+
+single quotes, and double quotes.
+<P>
+
+A non-quoted backslash (<B>\</B>) is the
+<I>escape character</I>.
+
+It preserves the literal value of the next character that follows,
+with the exception of &lt;newline&gt;.  If a <B>\</B>&lt;newline&gt; pair
+appears, and the backslash is not itself quoted, the <B>\</B>&lt;newline&gt;
+is treated as a line continuation (that is, it is removed from the
+input stream and effectively ignored).
+<P>
+
+Enclosing characters in single quotes preserves the literal value
+of each character within the quotes.  A single quote may not occur
+between single quotes, even when preceded by a backslash.
+<P>
+
+Enclosing characters in double quotes preserves the literal value
+of all characters within the quotes, with the exception of
+<B>$</B>,
+
+<B>`</B>,
+
+and
+<B>\</B>.
+
+The characters
+<B>$</B>
+
+and
+<B>`</B>
+
+retain their special meaning within double quotes.  The backslash
+retains its special meaning only when followed by one of the following
+characters:
+<B>$</B>,
+
+<B>`</B>,
+
+<B>&quot;</B>,
+<B>\</B>,
+
+or
+<B>&lt;newline&gt;</B>.
+
+A double quote may be quoted within double quotes by preceding it with
+a backslash.
+When command history is being used, the double quote may not be used to
+quote the history expansion character.
+<P>
+
+The special parameters
+<B>*</B>
+
+and
+<B>@</B>
+
+have special meaning when in double
+quotes (see
+<FONT SIZE=-1><B>PARAMETERS</B>
+
+</FONT>
+below).
+<P>
+
+Words of the form <B>$</B>'<I>string</I>' are treated specially.  The
+word expands to <I>string</I>, with backslash-escaped characters replaced
+as specifed by the ANSI C standard.  Backslash escape sequences, if
+present, are decoded as follows:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>\a</B>
+
+<DD>
+alert (bell)
+<DT><B>\b</B>
+
+<DD>
+backspace
+<DT><B>\e</B>
+
+<DD>
+an escape character
+<DT><B>\f</B>
+
+<DD>
+form feed
+<DT><B>\n</B>
+
+<DD>
+new line
+<DT><B>\r</B>
+
+<DD>
+carriage return
+<DT><B>\t</B>
+
+<DD>
+horizontal tab
+<DT><B>\v</B>
+
+<DD>
+vertical tab
+<DT><B>\\</B>
+
+<DD>
+backslash
+<DT><B>\'</B>
+
+<DD>
+single quote
+<DT><B>\</B><I>nnn</I>
+
+<DD>
+the eight-bit character whose value is the octal value <I>nnn</I>
+(one to three digits)
+<DT><B>\x</B><I>HH</I>
+
+<DD>
+the eight-bit character whose value is the hexadecimal value <I>HH</I>
+(one or two hex digits)
+<DT><B>\c</B><I>x</I>
+
+<DD>
+a control-<I>x</I> character
+
+</DL></DL>
+
+<P>
+
+The expanded result is single-quoted, as if the dollar sign had
+not been present.
+<P>
+
+A double-quoted string preceded by a dollar sign (<B>$</B>) will cause
+the string to be translated according to the current locale.
+If the current locale is <B>C</B> or <B>POSIX</B>, the dollar sign
+is ignored.
+If the string is translated and replaced, the replacement is
+double-quoted.
+<A NAME="lbAS">&nbsp;</A>
+<H2>PARAMETERS</H2>
+
+A
+<I>parameter</I>
+
+is an entity that stores values.
+It can be a
+<I>name</I>,
+
+a number, or one of the special characters listed below under
+<B>Special Parameters</B>.
+
+A
+<I>variable</I>
+
+is a parameter denoted by a
+<I>name</I>.
+
+A variable has a <I>value</I> and zero or more <I>attributes</I>.
+Attributes are assigned using the
+<B>declare</B>
+
+builtin command (see
+<B>declare</B>
+
+below in
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>).
+
+</FONT>
+<P>
+
+A parameter is set if it has been assigned a value.  The null string is
+a valid value.  Once a variable is set, it may be unset only by using
+the
+<B>unset</B>
+
+builtin command (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<P>
+
+A
+<I>variable</I>
+
+may be assigned to by a statement of the form
+<DL COMPACT><DT><DD>
+<P>
+
+<I>name</I>=[<I>value</I>]
+</DL>
+
+<P>
+
+If
+<I>value</I>
+
+is not given, the variable is assigned the null string.  All
+<I>values</I>
+
+undergo tilde expansion, parameter and variable expansion,
+command substitution, arithmetic expansion, and quote
+removal (see
+<FONT SIZE=-1><B>EXPANSION</B>
+
+</FONT>
+below).  If the variable has its
+<B>integer</B>
+
+attribute set, then
+<I>value</I>
+
+is evaluated as an arithmetic expression even if the $((...)) expansion is
+not used (see
+<B>Arithmetic Expansion</B>
+
+below).
+Word splitting is not performed, with the exception
+of <B>&quot;$@&quot;</B> as explained below under
+<B>Special Parameters</B>.
+
+Pathname expansion is not performed.
+Assignment statements may also appear as arguments to the
+<B>alias</B>,
+
+<B>declare</B>,
+
+<B>typeset</B>,
+
+<B>export</B>,
+
+<B>readonly</B>,
+
+and
+<B>local</B>
+
+builtin commands.
+<A NAME="lbAT">&nbsp;</A>
+<H3>Positional Parameters</H3>
+
+<P>
+
+A
+<I>positional parameter</I>
+
+is a parameter denoted by one or more
+digits, other than the single digit 0.  Positional parameters are
+assigned from the shell's arguments when it is invoked,
+and may be reassigned using the
+<B>set</B>
+
+builtin command.  Positional parameters may not be assigned to
+with assignment statements.  The positional parameters are
+temporarily replaced when a shell function is executed (see
+<FONT SIZE=-1><B>FUNCTIONS</B>
+
+</FONT>
+below).
+<P>
+
+When a positional parameter consisting of more than a single
+digit is expanded, it must be enclosed in braces (see
+<FONT SIZE=-1><B>EXPANSION</B>
+
+</FONT>
+below).
+<A NAME="lbAU">&nbsp;</A>
+<H3>Special Parameters</H3>
+
+<P>
+
+The shell treats several parameters specially.  These parameters may
+only be referenced; assignment to them is not allowed.
+
+<DL COMPACT>
+<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
+with the value of each parameter separated by the first character
+of the 
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+special variable.  That is, &quot;<B>$*</B>&quot; is equivalent
+to &quot;<B>$1</B><I>c</I><B>$2</B><I>c</I><B>...</B>&quot;, where
+<I>c</I>
+
+is the first character of the value of the
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+variable.  If
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+is unset, the parameters are separated by spaces.
+If
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+is null, the parameters are joined without intervening separators.
+<DT><B>@</B>
+
+<DD>
+Expands to the positional parameters, starting from one.  When the
+expansion occurs within double quotes, each parameter expands to a
+separate word.  That is, &quot;<B>$@</B>&quot; is equivalent to
+&quot;<B>$1</B>&quot; &quot;<B>$2</B>&quot; ...
+When there are no positional parameters, &quot;<B>$@</B>&quot; and 
+<B>$@</B>
+
+expand to nothing (i.e., they are removed).
+<DT><B>#</B>
+
+<DD>
+Expands to the number of positional parameters in decimal.
+<DT><B>?</B>
+
+<DD>
+Expands to the status of the most recently executed foreground
+pipeline.
+<DT><B>-</B>
+
+<DD>
+Expands to the current option flags as specified upon invocation, 
+by the
+<B>set</B>
+
+builtin command, or those set by the shell itself
+(such as the
+<B>-i</B>
+
+option).
+<DT><B>$</B>
+
+<DD>
+Expands to the process ID of the shell.  In a () subshell, it
+expands to the process ID of the current shell, not the
+subshell.
+<DT><B>!</B>
+
+<DD>
+Expands to the process ID of the most recently executed background
+(asynchronous) command.
+<DT><B>0</B>
+
+<DD>
+Expands to the name of the shell or shell script.  This is set at
+shell initialization.  If
+<B>bash</B>
+
+is invoked with a file of commands,
+<B>$0</B>
+
+is set to the name of that file.  If
+<B>bash</B>
+
+is started with the
+<B>-c</B>
+
+option, then
+<B>$0</B>
+
+is set to the first argument after the string to be
+executed, if one is present.  Otherwise, it is set
+to the file name used to invoke
+<B>bash</B>,
+
+as given by argument zero.
+<DT><B>_</B>
+
+<DD>
+At shell startup, set to the absolute file name of the shell or shell
+script being executed as passed in the argument list.
+Subsequently, expands to the last argument to the previous command,
+after expansion.
+Also set to the full file name of each command executed and placed in
+the environment exported to that command.
+When checking mail, this parameter holds the name of the mail file
+currently being checked.
+
+</DL>
+<A NAME="lbAV">&nbsp;</A>
+<H3>Shell Variables</H3>
+
+<P>
+
+The following variables are set by the shell:
+<P>
+
+
+<DL COMPACT>
+<DT><B>BASH</B>
+
+<DD>
+Expands to the full file name used to invoke this instance of
+<B>bash</B>.
+
+<DT><B>BASH_ARGC</B>
+
+<DD>
+An array variable whose values are the number of parameters in each
+frame of the current bash execution call stack.  The number of
+parameters to the current subroutine (shell function or script executed
+with <B>.</B> or <B>source</B>) is at the top of the stack.  When a
+subroutine is executed, the number of parameters passed is pushed onto
+<B>BASH_ARGC</B>.
+<DT><B>BASH_ARGV</B>
+
+<DD>
+An array variable containing all of the parameters in the current bash
+execution call stack.  The final parameter of the last subroutine call
+is at the top of the stack; the first parameter of the initial call is
+at the bottom.  When a subroutine is executed, the parameters supplied
+are pushed onto <B>BASH_ARGV</B>.
+<DT><B>BASH_COMMAND</B>
+
+<DD>
+The command currently being executed or about to be executed, unless the
+shell is executing a command as the result of a trap,
+in which case it is the command executing at the time of the trap.
+<DT><B>BASH_EXECUTION_STRING</B>
+
+<DD>
+The command argument to the <B>-c</B> invocation option.
+<DT><B>BASH_LINENO</B>
+
+<DD>
+An array variable whose members are the line numbers in source files
+corresponding to each member of @var{FUNCNAME}.
+<B>${BASH_LINENO[</B><I>$i</I><B>]}</B> is the line number in the source
+file where <B>${FUNCNAME[</B><I>$i + 1</I><B>]}</B> was called.
+The corresponding source file name is <B>${BASH_SOURCE[</B><I>$i + 1</I><B>]}.
+Use LINENO</B> to obtain the current line number.
+<DT><B>BASH_REMATCH</B>
+
+<DD>
+An array variable whose members are assigned by the <B>=~</B> binary
+operator to the <B>[[</B> conditional command.
+The element with index 0 is the portion of the string
+matching the entire regular expression.
+The element with index <I>n</I> is the portion of the
+string matching the <I>n</I>th parenthesized subexpression.
+This variable is read-only.
+<DT><B>BASH_SOURCE</B>
+
+<DD>
+An array variable whose members are the source filenames corresponding
+to the elements in the <B>FUNCNAME</B> array variable.
+<DT><B>BASH_SUBSHELL</B>
+
+<DD>
+Incremented by one each time a subshell or subshell environment is spawned.
+The initial value is 0.
+<DT><B>BASH_VERSINFO</B>
+
+<DD>
+A readonly array variable whose members hold version information for
+this instance of
+<B>bash</B>.
+
+The values assigned to the array members are as follows:
+<P>
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>BASH_VERSINFO[</B>0]
+
+<DD>
+The major version number (the <I>release</I>).
+<DT><B>BASH_VERSINFO[</B>1]
+
+<DD>
+The minor version number (the <I>version</I>).
+<DT><B>BASH_VERSINFO[</B>2]
+
+<DD>
+The patch level.
+<DT><B>BASH_VERSINFO[</B>3]
+
+<DD>
+The build version.
+<DT><B>BASH_VERSINFO[</B>4]
+
+<DD>
+The release status (e.g., <I>beta1</I>).
+<DT><B>BASH_VERSINFO[</B>5]
+
+<DD>
+The value of <B>MACHTYPE</B>.
+
+</DL></DL>
+
+<DT><B>BASH_VERSION</B>
+
+<DD>
+Expands to a string describing the version of this instance of
+<B>bash</B>.
+
+<DT><B>COMP_CWORD</B>
+
+<DD>
+An index into <B>${COMP_WORDS}</B> of the word containing the current
+cursor position.
+This variable is available only in shell functions invoked by the
+programmable completion facilities (see <B>Programmable Completion</B>
+below).
+<DT><B>COMP_LINE</B>
+
+<DD>
+The current command line.
+This variable is available only in shell functions and external
+commands invoked by the
+programmable completion facilities (see <B>Programmable Completion</B>
+below).
+<DT><B>COMP_POINT</B>
+
+<DD>
+The index of the current cursor position relative to the beginning of
+the current command.
+If the current cursor position is at the end of the current command,
+the value of this variable is equal to <B>${#COMP_LINE}</B>.
+This variable is available only in shell functions and external
+commands invoked by the
+programmable completion facilities (see <B>Programmable Completion</B>
+below).
+<DT><B>COMP_WORDBREAKS</B>
+
+<DD>
+The set of characters that the Readline library treats as word
+separators when performing word completion.
+If
+<FONT SIZE=-1><B>COMP_WORDBREAKS</B>
+
+</FONT>
+is unset, it loses its special properties, even if it is
+subsequently reset.
+<DT><B>COMP_WORDS</B>
+
+<DD>
+An array variable (see <B>Arrays</B> below) consisting of the individual
+words in the current command line.
+This variable is available only in shell functions invoked by the
+programmable completion facilities (see <B>Programmable Completion</B>
+below).
+<DT><B>DIRSTACK</B>
+
+<DD>
+An array variable (see
+<B>Arrays</B>
+
+below) containing the current contents of the directory stack.
+Directories appear in the stack in the order they are displayed by the
+<B>dirs</B>
+
+builtin.
+Assigning to members of this array variable may be used to modify
+directories already in the stack, but the
+<B>pushd</B>
+
+and
+<B>popd</B>
+
+builtins must be used to add and remove directories.
+Assignment to this variable will not change the current directory.
+If
+<FONT SIZE=-1><B>DIRSTACK</B>
+
+</FONT>
+is unset, it loses its special properties, even if it is
+subsequently reset.
+<DT><B>EUID</B>
+
+<DD>
+Expands to the effective user ID of the current user, initialized at
+shell startup.  This variable is readonly.
+<DT><B>FUNCNAME</B>
+
+<DD>
+An array variable containing the names of all shell functions
+currently in the execution call stack.
+The element with index 0 is the name of any currently-executing
+shell function.
+The bottom-most element is &quot;main&quot;.
+This variable exists only when a shell function is executing.
+Assignments to
+<FONT SIZE=-1><B>FUNCNAME</B>
+
+</FONT>
+have no effect and return an error status.
+If
+<FONT SIZE=-1><B>FUNCNAME</B>
+
+</FONT>
+is unset, it loses its special properties, even if it is
+subsequently reset.
+<DT><B>GROUPS</B>
+
+<DD>
+An array variable containing the list of groups of which the current
+user is a member.
+Assignments to    
+<FONT SIZE=-1><B>GROUPS</B>
+
+</FONT>
+have no effect and return an error status.
+If
+<FONT SIZE=-1><B>GROUPS</B>
+
+</FONT>
+is unset, it loses its special properties, even if it is
+subsequently reset.
+<DT><B>HISTCMD</B>
+
+<DD>
+The history number, or index in the history list, of the current
+command.
+If
+<FONT SIZE=-1><B>HISTCMD</B>
+
+</FONT>
+is unset, it loses its special properties, even if it is
+subsequently reset.
+<DT><B>HOSTNAME</B>
+
+<DD>
+Automatically set to the name of the current host.
+<DT><B>HOSTTYPE</B>
+
+<DD>
+Automatically set to a string that uniquely
+describes the type of machine on which
+<B>bash</B>
+
+is executing.
+The default is system-dependent.
+<DT><B>LINENO</B>
+
+<DD>
+Each time this parameter is referenced, the shell substitutes
+a decimal number representing the current sequential line number
+(starting with 1) within a script or function.  When not in a
+script or function, the value substituted is not guaranteed to
+be meaningful.
+If
+<FONT SIZE=-1><B>LINENO</B>
+
+</FONT>
+is unset, it loses its special properties, even if it is
+subsequently reset.
+<DT><B>MACHTYPE</B>
+
+<DD>
+Automatically set to a string that fully describes the system
+type on which
+<B>bash</B>
+
+is executing, in the standard GNU <I>cpu-company-system</I> format.
+The default is system-dependent.
+<DT><B>OLDPWD</B>
+
+<DD>
+The previous working directory as set by the
+<B>cd</B>
+
+command.
+<DT><B>OPTARG</B>
+
+<DD>
+The value of the last option argument processed by the
+<B>getopts</B>
+
+builtin command (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<DT><B>OPTIND</B>
+
+<DD>
+The index of the next argument to be processed by the
+<B>getopts</B>
+
+builtin command (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<DT><B>OSTYPE</B>
+
+<DD>
+Automatically set to a string that
+describes the operating system on which
+<B>bash</B>
+
+is executing.
+The default is system-dependent.
+<DT><B>PIPESTATUS</B>
+
+<DD>
+An array variable (see
+<B>Arrays</B>
+
+below) containing a list of exit status values from the processes
+in the most-recently-executed foreground pipeline (which may
+contain only a single command).
+<DT><B>PPID</B>
+
+<DD>
+The process ID of the shell's parent.  This variable is readonly.
+<DT><B>PWD</B>
+
+<DD>
+The current working directory as set by the
+<B>cd</B>
+
+command.
+<DT><B>RANDOM</B>
+
+<DD>
+Each time this parameter is referenced, a random integer between
+0 and 32767 is
+generated.  The sequence of random numbers may be initialized by assigning
+a value to
+<FONT SIZE=-1><B>RANDOM</B>.
+
+</FONT>
+If
+<FONT SIZE=-1><B>RANDOM</B>
+
+</FONT>
+is unset, it loses its special properties, even if it is
+subsequently reset.
+<DT><B>REPLY</B>
+
+<DD>
+Set to the line of input read by the
+<B>read</B>
+
+builtin command when no arguments are supplied.
+<DT><B>SECONDS</B>
+
+<DD>
+Each time this parameter is
+referenced, the number of seconds since shell invocation is returned.  If a
+value is assigned to 
+<FONT SIZE=-1><B>SECONDS</B>,
+
+</FONT>
+the value returned upon subsequent
+references is
+the number of seconds since the assignment plus the value assigned.
+If
+<FONT SIZE=-1><B>SECONDS</B>
+
+</FONT>
+is unset, it loses its special properties, even if it is
+subsequently reset.
+<DT><B>SHELLOPTS</B>
+
+<DD>
+A colon-separated list of enabled shell options.  Each word in
+the list is a valid argument for the
+<B>-o</B>
+
+option to the
+<B>set</B>
+
+builtin command (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).  The options appearing in
+<FONT SIZE=-1><B>SHELLOPTS</B>
+
+</FONT>
+are those reported as
+<I>on</I>
+
+by <B>set -o</B>.
+If this variable is in the environment when
+<B>bash</B>
+
+starts up, each shell option in the list will be enabled before
+reading any startup files.
+This variable is read-only.
+<DT><B>SHLVL</B>
+
+<DD>
+Incremented by one each time an instance of
+<B>bash</B>
+
+is started.
+<DT><B>UID</B>
+
+<DD>
+Expands to the user ID of the current user, initialized at shell startup.
+This variable is readonly.
+
+</DL>
+<P>
+
+The following variables are used by the shell.  In some cases,
+<B>bash</B>
+
+assigns a default value to a variable; these cases are noted
+below.
+<P>
+
+
+<DL COMPACT>
+<DT><B>BASH_ENV</B>
+
+<DD>
+If this parameter is set when <B>bash</B> is executing a shell script,
+its value is interpreted as a filename containing commands to
+initialize the shell, as in
+<A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>.
+
+The value of
+<FONT SIZE=-1><B>BASH_ENV</B>
+
+</FONT>
+is subjected to parameter expansion, command substitution, and arithmetic
+expansion before being interpreted as a file name.
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+is not used to search for the resultant file name.
+<DT><B>CDPATH</B>
+
+<DD>
+The search path for the
+<B>cd</B>
+
+command.
+This is a colon-separated list of directories in which the shell looks
+for destination directories specified by the
+<B>cd</B>
+
+command.
+A sample value is
+<TT>&quot;.:~:/usr&quot;</TT>.
+
+<DT><B>COLUMNS</B>
+
+<DD>
+Used by the <B>select</B> builtin command to determine the terminal width
+when printing selection lists.  Automatically set upon receipt of a SIGWINCH.
+<DT><B>COMPREPLY</B>
+
+<DD>
+An array variable from which <B>bash</B> reads the possible completions
+generated by a shell function invoked by the programmable completion
+facility (see <B>Programmable Completion</B> below).
+<DT><B>EMACS</B>
+
+<DD>
+If <B>bash</B> finds this variable in the environment when the shell starts
+with value
+<TT>t</TT>,
+
+it assumes that the shell is running in an emacs shell buffer and disables
+line editing.
+<DT><B>FCEDIT</B>
+
+<DD>
+The default editor for the
+<B>fc</B>
+
+builtin command.
+<DT><B>FIGNORE</B>
+
+<DD>
+A colon-separated list of suffixes to ignore when performing
+filename completion (see
+<FONT SIZE=-1><B>READLINE</B>
+
+</FONT>
+below).
+A filename whose suffix matches one of the entries in 
+<FONT SIZE=-1><B>FIGNORE</B>
+
+</FONT>
+is excluded from the list of matched filenames.
+A sample value is
+<TT>&quot;.o:~&quot;</TT>.
+
+<DT><B>GLOBIGNORE</B>
+
+<DD>
+A colon-separated list of patterns defining the set of filenames to
+be ignored by pathname expansion.
+If a filename matched by a pathname expansion pattern also matches one
+of the patterns in
+<FONT SIZE=-1><B>GLOBIGNORE</B>,
+
+</FONT>
+it is removed from the list of matches.
+<DT><B>HISTCONTROL</B>
+
+<DD>
+A colon-separated list of values controlling how commands are saved on
+the history list.
+If the list of values includes
+<I>ignorespace</I>,
+
+lines which begin with a
+<B>space</B>
+
+character are not saved in the history list.
+A value of 
+<I>ignoredups</I>
+
+causes lines matching the previous history entry to not be saved.
+A value of
+<I>ignoreboth</I>
+
+is shorthand for <I>ignorespace</I> and <I>ignoredups</I>.
+A value of
+<I>erasedups</I>
+
+causes all previous lines matching the current line to be removed from
+the history list before that line is saved.
+Any value not in the above list is ignored.
+If <B>HISTCONTROL</B> is unset, or does not include a valid value,
+all lines read by the shell parser are saved on the history list,
+subject to the value of
+<B>HISTIGNORE</B>.
+
+The second and subsequent lines of a multi-line compound command are
+not tested, and are added to the history regardless of the value of
+<B>HISTCONTROL</B>.
+
+<DT><B>HISTFILE</B>
+
+<DD>
+The name of the file in which command history is saved (see
+<FONT SIZE=-1><B>HISTORY</B>
+
+</FONT>
+below).  The default value is <A HREF="file:~/.bash_history"><I>~/.bash_history</I></A>.  If unset, the
+command history is not saved when an interactive shell exits.
+<DT><B>HISTFILESIZE</B>
+
+<DD>
+The maximum number of lines contained in the history file.  When this
+variable is assigned a value, the history file is truncated, if
+necessary, to contain no more than that number of lines.  The default
+value is 500.  The history file is also truncated to this size after
+writing it when an interactive shell exits.
+<DT><B>HISTIGNORE</B>
+
+<DD>
+A colon-separated list of patterns used to decide which command lines
+should be saved on the history list.  Each pattern is anchored at the
+beginning of the line and must match the complete line (no implicit
+`<B>*</B>' is appended).  Each pattern is tested against the line
+after the checks specified by
+<B>HISTCONTROL</B>
+
+are applied.
+In addition to the normal shell pattern matching characters, `<B>&amp;</B>'
+matches the previous history line.  `<B>&amp;</B>' may be escaped using a
+backslash; the backslash is removed before attempting a match.
+The second and subsequent lines of a multi-line compound command are
+not tested, and are added to the history regardless of the value of
+<B>HISTIGNORE</B>.
+
+<DT><B>HISTSIZE</B>
+
+<DD>
+The number of commands to remember in the command history (see
+<FONT SIZE=-1><B>HISTORY</B>
+
+</FONT>
+below).  The default value is 500.
+<DT><B>HISTTIMEFORMAT</B>
+
+<DD>
+If this variable is set and not null, its value is used as a format string
+for <I>strftime</I>(3) to print the time stamp associated with each history
+entry displayed by the <B>history</B> builtin.
+If this variable is set, time stamps are written to the history file so
+they may be preserved across shell sessions.
+<DT><B>HOME</B>
+
+<DD>
+The home directory of the current user; the default argument for the
+<B>cd</B> builtin command.
+The value of this variable is also used when performing tilde expansion.
+<DT><B>HOSTFILE</B>
+
+<DD>
+Contains the name of a file in the same format as
+
+<I>/etc/hosts</I>
+
+that should be read when the shell needs to complete a
+hostname.
+The list of possible hostname completions may be changed while the
+shell is running;
+the next time hostname completion is attempted after the
+value is changed,
+<B>bash</B>
+
+adds the contents of the new file to the existing list.
+If
+<FONT SIZE=-1><B>HOSTFILE</B>
+
+</FONT>
+is set, but has no value, <B>bash</B> attempts to read
+
+<I>/etc/hosts</I>
+
+to obtain the list of possible hostname completions.
+When
+<FONT SIZE=-1><B>HOSTFILE</B>
+
+</FONT>
+is unset, the hostname list is cleared.
+<DT><B>IFS</B>
+
+<DD>
+The
+<I>Internal Field Separator</I>
+
+that is used
+for word splitting after expansion and to
+split lines into words with the
+<B>read</B>
+
+builtin command.  The default value is
+``&lt;space&gt;&lt;tab&gt;&lt;newline&gt;''.
+<DT><B>IGNOREEOF</B>
+
+<DD>
+Controls the
+action of an interactive shell on receipt of an
+<FONT SIZE=-1><B>EOF</B>
+
+</FONT>
+character as the sole input.  If set, the value is the number of
+consecutive
+<FONT SIZE=-1><B>EOF</B>
+
+</FONT>
+characters which must be
+typed as the first characters on an input line before
+<B>bash</B>
+
+exits.  If the variable exists but does not have a numeric value, or
+has no value, the default value is 10.  If it does not exist,
+<FONT SIZE=-1><B>EOF</B>
+
+</FONT>
+signifies the end of input to the shell.
+<DT><B>INPUTRC</B>
+
+<DD>
+The filename for the
+<B>readline</B>
+
+startup file, overriding the default of
+
+<A HREF="file:~/.inputrc"><I>~/.inputrc</I></A>
+
+(see
+<FONT SIZE=-1><B>READLINE</B>
+
+</FONT>
+below).
+<DT><B>LANG</B>
+
+<DD>
+Used to determine the locale category for any category not specifically
+selected with a variable starting with <B>LC_</B>.
+<DT><B>LC_ALL</B>
+
+<DD>
+This variable overrides the value of <B>LANG</B> and any other
+<B>LC_</B> variable specifying a locale category.
+<DT><B>LC_COLLATE</B>
+
+<DD>
+This variable determines the collation order used when sorting the
+results of pathname expansion, and determines the behavior of range
+expressions, equivalence classes, and collating sequences within
+pathname expansion and pattern matching.
+<DT><B>LC_CTYPE</B>
+
+<DD>
+This variable determines the interpretation of characters and the
+behavior of character classes within pathname expansion and pattern
+matching.
+<DT><B>LC_MESSAGES</B>
+
+<DD>
+This variable determines the locale used to translate double-quoted
+strings preceded by a <B>$</B>.
+<DT><B>LC_NUMERIC</B>
+
+<DD>
+This variable determines the locale category used for number formatting.
+<DT><B>LINES</B>
+
+<DD>
+Used by the <B>select</B> builtin command to determine the column length
+for printing selection lists.  Automatically set upon receipt of a SIGWINCH.
+<DT><B>MAIL</B>
+
+<DD>
+If this parameter is set to a file name and the
+<FONT SIZE=-1><B>MAILPATH</B>
+
+</FONT>
+variable is not set,
+<B>bash</B>
+
+informs the user of the arrival of mail in the specified file.
+<DT><B>MAILCHECK</B>
+
+<DD>
+Specifies how
+often (in seconds)
+<B>bash</B>
+
+checks for mail.  The default is 60 seconds.  When it is time to check
+for mail, the shell does so before displaying the primary prompt.
+If this variable is unset, or set to a value that is not a number
+greater than or equal to zero, the shell disables mail checking.
+<DT><B>MAILPATH</B>
+
+<DD>
+A colon-separated list of file names to be checked for mail. 
+The message to be printed when mail arrives in a particular file
+may be specified by separating the file name from the message with a `?'.
+When used in the text of the message, <B>$_</B> expands to the name of
+the current mailfile. 
+Example:
+<DL COMPACT><DT><DD>
+<P>
+
+<B>MAILPATH</B>='/var/mail/bfox?&quot;You have mail&quot;:~/shell-mail?&quot;$_ has mail!&quot;'
+<P>
+
+<B>Bash</B>
+
+supplies a default value for this variable, but the location of the user
+mail files that it uses is system dependent (e.g., /var/mail/<B>$USER</B>).
+</DL>
+
+<DT><B>OPTERR</B>
+
+<DD>
+If set to the value 1,
+<B>bash</B>
+
+displays error messages generated by the
+<B>getopts</B>
+
+builtin command (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<FONT SIZE=-1><B>OPTERR</B>
+
+</FONT>
+is initialized to 1 each time the shell is invoked or a shell
+script is executed.
+<DT><B>PATH</B>
+
+<DD>
+The search path for commands.  It
+is a colon-separated list of directories in which
+the shell looks for commands (see
+<FONT SIZE=-1><B>COMMAND EXECUTION</B>
+
+</FONT>
+below).
+A zero-length (null) directory name in the value of <B>PATH</B> indicates the
+current directory.
+A null directory name may appear as two adjacent colons, or as an initial
+or trailing colon.
+The default path is system-dependent,
+and is set by the administrator who installs
+<B>bash</B>.
+
+A common value is
+<TT>/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin</TT>.
+
+<DT><B>POSIXLY_CORRECT</B>
+
+<DD>
+If this variable is in the environment when <B>bash</B> starts, the shell
+enters <I>posix mode</I> before reading the startup files, as if the
+<B>--posix</B>
+
+invocation option had been supplied.  If it is set while the shell is
+running, <B>bash</B> enables <I>posix mode</I>, as if the command
+<TT>set -o posix</TT>
+
+had been executed.
+<DT><B>PROMPT_COMMAND</B>
+
+<DD>
+If set, the value is executed as a command prior to issuing each primary
+prompt.
+<DT><B>PS1</B>
+
+<DD>
+The value of this parameter is expanded (see
+<FONT SIZE=-1><B>PROMPTING</B>
+
+</FONT>
+below) and used as the primary prompt string.  The default value is
+``<B>\s-\v\$ </B>''.
+<DT><B>PS2</B>
+
+<DD>
+The value of this parameter is expanded as with
+<B>PS1</B>
+
+and used as the secondary prompt string.  The default is
+``<B>&gt; </B>''.
+<DT><B>PS3</B>
+
+<DD>
+The value of this parameter is used as the prompt for the
+<B>select</B>
+
+command (see
+<FONT SIZE=-1><B>SHELL GRAMMAR</B>
+
+</FONT>
+above).
+<DT><B>PS4</B>
+
+<DD>
+The value of this parameter is expanded as with
+<B>PS1</B>
+
+and the value is printed before each command
+<B>bash</B>
+
+displays during an execution trace.  The first character of
+<FONT SIZE=-1><B>PS4</B>
+
+</FONT>
+is replicated multiple times, as necessary, to indicate multiple
+levels of indirection.  The default is ``<B>+ </B>''.
+<DT><B>TIMEFORMAT</B>
+
+<DD>
+The value of this parameter is used as a format string specifying
+how the timing information for pipelines prefixed with the
+<B>time</B>
+
+reserved word should be displayed.
+The <B>%</B> character introduces an escape sequence that is
+expanded to a time value or other information.
+The escape sequences and their meanings are as follows; the
+braces denote optional portions.
+<P>
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>%%</B>
+
+<DD>
+A literal <B>%</B>.
+<DT><B>%[</B><I>p</I>][l]R
+
+<DD>
+The elapsed time in seconds.
+<DT><B>%[</B><I>p</I>][l]U
+
+<DD>
+The number of CPU seconds spent in user mode.
+<DT><B>%[</B><I>p</I>][l]S
+
+<DD>
+The number of CPU seconds spent in system mode.
+<DT><B>%P</B>
+
+<DD>
+The CPU percentage, computed as (%U + %S) / %R.
+
+</DL></DL>
+
+<DT><DD>
+The optional <I>p</I> is a digit specifying the <I>precision</I>,
+the number of fractional digits after a decimal point.
+A value of 0 causes no decimal point or fraction to be output.
+At most three places after the decimal point may be specified;
+values of <I>p</I> greater than 3 are changed to 3.
+If <I>p</I> is not specified, the value 3 is used.
+<DT><DD>
+The optional <B>l</B> specifies a longer format, including
+minutes, of the form <I>MM</I>m<I>SS</I>.<I>FF</I>s.
+The value of <I>p</I> determines whether or not the fraction is
+included.
+<DT><DD>
+If this variable is not set, <B>bash</B> acts as if it had the
+value <B>$'\nreal\t%3lR\nuser\t%3lU\nsys       %3lS'</B>.
+If the value is null, no timing information is displayed.
+A trailing newline is added when the format string is displayed.
+<DT><B>TMOUT</B>
+
+<DD>
+If set to a value greater than zero, <B>TMOUT</B> is treated as the
+default timeout for the <B>read</B> builtin.
+The <B>select</B> command terminates if input does not arrive
+after <B>TMOUT</B> seconds when input is coming from a terminal.
+In an interactive shell, the value is interpreted as the
+number of seconds to wait for input after issuing the primary prompt.
+<B>Bash</B>
+
+terminates after waiting for that number of seconds if input does
+not arrive.
+<DT><B>auto_resume</B>
+
+<DD>
+This variable controls how the shell interacts with the user and
+job control.  If this variable is set, single word simple
+commands without redirections are treated as candidates for resumption
+of an existing stopped job.  There is no ambiguity allowed; if there is
+more than one job beginning with the string typed, the job most recently
+accessed is selected.  The
+<I>name</I>
+
+of a stopped job, in this context, is the command line used to
+start it.
+If set to the value
+<I>exact</I>,
+
+the string supplied must match the name of a stopped job exactly;
+if set to
+<I>substring</I>,
+
+the string supplied needs to match a substring of the name of a
+stopped job.  The
+<I>substring</I>
+
+value provides functionality analogous to the
+<B>%?</B>
+
+job identifier (see
+<FONT SIZE=-1><B>JOB CONTROL</B>
+
+</FONT>
+below).  If set to any other value, the supplied string must
+be a prefix of a stopped job's name; this provides functionality
+analogous to the
+<B>%</B>
+
+job identifier.
+<DT><B>histchars</B>
+
+<DD>
+The two or three characters which control history expansion
+and tokenization (see
+<FONT SIZE=-1><B>HISTORY EXPANSION</B>
+
+</FONT>
+below).  The first character is the <I>history expansion</I> character,
+the character which signals the start of a history
+expansion, normally `<B>!</B>'.
+The second character is the <I>quick substitution</I>
+character, which is used as shorthand for re-running the previous
+command entered, substituting one string for another in the command.
+The default is `<B>^</B>'.
+The optional third character is the character
+which indicates that the remainder of the line is a comment when found
+as the first character of a word, normally `<B>#</B>'.  The history
+comment character causes history substitution to be skipped for the
+remaining words on the line.  It does not necessarily cause the shell
+parser to treat the rest of the line as a comment.
+
+</DL>
+<A NAME="lbAW">&nbsp;</A>
+<H3>Arrays</H3>
+
+<B>Bash</B>
+
+provides one-dimensional array variables.  Any variable may be used as
+an array; the
+<B>declare</B>
+
+builtin will explicitly declare an array.  There is no maximum
+limit on the size of an array, nor any requirement that members
+be indexed or assigned contiguously.  Arrays are indexed using
+integers and are zero-based.
+<P>
+
+An array is created automatically if any variable is assigned to using
+the syntax <I>name</I>[<I>subscript</I>]=<I>value</I>.  The
+<I>subscript</I>
+
+is treated as an arithmetic expression that must evaluate to a number
+greater than or equal to zero.  To explicitly declare an array, use
+<B>declare -a </B><I>name</I>
+
+(see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<B>declare -a </B><I>name</I>[<I>subscript</I>]
+
+is also accepted; the <I>subscript</I> is ignored.  Attributes may be
+specified for an array variable using the
+<B>declare</B>
+
+and
+<B>readonly</B>
+
+builtins.  Each attribute applies to all members of an array.
+<P>
+
+Arrays are assigned to using compound assignments of the form
+<I>name</I>=<B>(</B>value<I>1</I> ... value<I>n</I><B>)</B>, where each
+<I>value</I> is of the form [<I>subscript</I>]=<I>string</I>.  Only
+<I>string</I> is required.  If
+the optional brackets and subscript are supplied, that index is assigned to;
+otherwise the index of the element assigned is the last index assigned
+to by the statement plus one.  Indexing starts at zero.
+This syntax is also accepted by the
+<B>declare</B>
+
+builtin.  Individual array elements may be assigned to using the
+<I>name</I>[<I>subscript</I>]=<I>value</I> syntax introduced above.
+<P>
+
+Any element of an array may be referenced using
+${<I>name</I>[<I>subscript</I>]}.  The braces are required to avoid
+conflicts with pathname expansion.  If
+<I>subscript</I> is <B>@</B> or <B>*</B>, the word expands to
+all members of <I>name</I>.  These subscripts differ only when the
+word appears within double quotes.  If the word is double-quoted,
+${<I>name</I>[*]} expands to a single
+word with the value of each array member separated by the first
+character of the
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+special variable, and ${<I>name</I>[@]} expands each element of
+<I>name</I> to a separate word.  When there are no array members,
+${<I>name</I>[@]} expands to nothing.  This is analogous to the expansion
+of the special parameters <B>*</B> and <B>@</B> (see
+<B>Special Parameters</B>
+
+above).  ${#<I>name</I>[<I>subscript</I>]} expands to the length of
+${<I>name</I>[<I>subscript</I>]}.  If <I>subscript</I> is <B>*</B> or
+<B>@</B>, the expansion is the number of elements in the array.
+Referencing an array variable without a subscript is equivalent to
+referencing element zero.
+<P>
+
+The
+<B>unset</B>
+
+builtin is used to destroy arrays.  <B>unset</B> <I>name</I>[<I>subscript</I>]
+destroys the array element at index <I>subscript</I>.
+<B>unset</B> <I>name</I>, where <I>name</I> is an array, or
+<B>unset</B> <I>name</I>[<I>subscript</I>], where
+<I>subscript</I> is <B>*</B> or <B>@</B>, removes the entire array.
+<P>
+
+The
+<B>declare</B>,
+
+<B>local</B>,
+
+and
+<B>readonly</B>
+
+builtins each accept a
+<B>-a</B>
+
+option to specify an array.  The
+<B>read</B>
+
+builtin accepts a
+<B>-a</B>
+
+option to assign a list of words read from the standard input
+to an array.  The
+<B>set</B>
+
+and
+<B>declare</B>
+
+builtins display array values in a way that allows them to be
+reused as assignments.
+<A NAME="lbAX">&nbsp;</A>
+<H2>EXPANSION</H2>
+
+Expansion is performed on the command line after it has been split into
+words.  There are seven kinds of expansion performed:
+<I>brace expansion</I>,
+
+<I>tilde expansion</I>,
+
+<I>parameter and variable expansion</I>,
+
+<I>command substitution</I>,
+
+<I>arithmetic expansion</I>,
+
+<I>word splitting</I>,
+
+and
+<I>pathname expansion</I>.
+
+<P>
+
+The order of expansions is: brace expansion, tilde expansion,
+parameter, variable and arithmetic expansion and
+command substitution
+(done in a left-to-right fashion), word splitting, and pathname
+expansion.
+<P>
+
+On systems that can support it, there is an additional expansion
+available: <I>process substitution</I>.
+<P>
+
+Only brace expansion, word splitting, and pathname expansion
+can change the number of words of the expansion; other expansions
+expand a single word to a single word.
+The only exceptions to this are the expansions of
+&quot;<B>$@</B>&quot; and &quot;<B>${</B><I>name</I><B>[@]}</B>&quot;
+as explained above (see
+<FONT SIZE=-1><B>PARAMETERS</B>).
+
+</FONT>
+<A NAME="lbAY">&nbsp;</A>
+<H3>Brace Expansion</H3>
+
+<P>
+
+<I>Brace expansion</I>
+
+is a mechanism by which arbitrary strings
+may be generated.  This mechanism is similar to
+<I>pathname expansion</I>, but the filenames generated
+need not exist.  Patterns to be brace expanded take
+the form of an optional
+<I>preamble</I>,
+
+followed by either a series of comma-separated strings or
+a sequence expression between a pair of braces, followed by
+an optional
+<I>postscript</I>.
+
+The preamble is prefixed to each string contained
+within the braces, and the postscript is then appended
+to each resulting string, expanding left to right.
+<P>
+
+Brace expansions may be nested.  The results of each expanded
+string are not sorted; left to right order is preserved.
+For example, a<B>{</B>d,c,b<B>}</B>e expands into `ade ace abe'.
+<P>
+
+A sequence expression takes the form <B>{</B><I>x</I><B>..</B><I>y</I><B>}</B>,
+where <I>x</I> and <I>y</I> are either integers or single characters.
+When integers are supplied, the expression expands to each number between
+<I>x</I> and <I>y</I>, inclusive.
+When characters are supplied, the expression expands to each character
+lexicographically between <I>x</I> and <I>y</I>, inclusive.  Note that
+both <I>x</I> and <I>y</I> must be of the same type.
+<P>
+
+Brace expansion is performed before any other expansions,
+and any characters special to other expansions are preserved
+in the result.  It is strictly textual.
+<B>Bash</B>
+
+does not apply any syntactic interpretation to the context of the
+expansion or the text between the braces.
+<P>
+
+A correctly-formed brace expansion must contain unquoted opening
+and closing braces, and at least one unquoted comma or a valid
+sequence expression.
+Any incorrectly formed brace expansion is left unchanged.
+A <B>{</B> or <B>,</B> may be quoted with a backslash to prevent its
+being considered part of a brace expression.
+To avoid conflicts with parameter expansion, the string <B>${</B>
+is not considered eligible for brace expansion.
+<P>
+
+This construct is typically used as shorthand when the common
+prefix of the strings to be generated is longer than in the
+above example:
+<DL COMPACT><DT><DD>
+<P>
+
+mkdir /usr/local/src/bash/{old,new,dist,bugs}
+</DL>
+
+or
+<DL COMPACT><DT><DD>
+chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
+</DL>
+
+<P>
+
+Brace expansion introduces a slight incompatibility with
+historical versions of
+<B>sh</B>.
+
+<B>sh</B>
+
+does not treat opening or closing braces specially when they
+appear as part of a word, and preserves them in the output.
+<B>Bash</B>
+
+removes braces from words as a consequence of brace
+expansion.  For example, a word entered to
+<B>sh</B>
+
+as <I>file{1,2}</I>
+appears identically in the output.  The same word is
+output as
+<I>file1 file2</I>
+
+after expansion by
+<B>bash</B>.
+
+If strict compatibility with
+<B>sh</B>
+
+is desired, start
+<B>bash</B>
+
+with the
+<B>+B </B>
+
+option or disable brace expansion with the
+<B>+B</B>
+
+option to the
+<B>set</B>
+
+command (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<A NAME="lbAZ">&nbsp;</A>
+<H3>Tilde Expansion</H3>
+
+<P>
+
+If a word begins with an unquoted tilde character (`<B>~</B>'), all of
+the characters preceding the first unquoted slash (or all characters,
+if there is no unquoted slash) are considered a <I>tilde-prefix</I>.
+If none of the characters in the tilde-prefix are quoted, the
+characters in the tilde-prefix following the tilde are treated as a
+possible <I>login name</I>.
+If this login name is the null string, the tilde is replaced with the
+value of the shell parameter
+<FONT SIZE=-1><B>HOME</B>.
+
+</FONT>
+If
+<FONT SIZE=-1><B>HOME</B>
+
+</FONT>
+is unset, the home directory of the user executing the shell is
+substituted instead.
+Otherwise, the tilde-prefix is replaced with the home directory
+associated with the specified login name.
+<P>
+
+If the tilde-prefix is a `~+', the value of the shell variable
+<FONT SIZE=-1><B>PWD</B>
+
+</FONT>
+replaces the tilde-prefix.
+If the tilde-prefix is a `~-', the value of the shell variable
+<FONT SIZE=-1><B>OLDPWD</B>,
+
+</FONT>
+if it is set, is substituted.
+If the characters following the tilde in the tilde-prefix consist
+of a number <I>N</I>, optionally prefixed
+by a `+' or a `-', the tilde-prefix is replaced with the corresponding
+element from the directory stack, as it would be displayed by the
+<B>dirs</B>
+
+builtin invoked with the tilde-prefix as an argument.
+If the characters following the tilde in the tilde-prefix consist of a
+number without a leading `+' or `-', `+' is assumed.
+<P>
+
+If the login name is invalid, or the tilde expansion fails, the word
+is unchanged.
+<P>
+
+Each variable assignment is checked for unquoted tilde-prefixes immediately
+following a
+<B>:</B>
+
+or
+<B>=</B>.
+
+In these cases, tilde expansion is also performed.
+Consequently, one may use file names with tildes in assignments to
+<FONT SIZE=-1><B>PATH</B>,
+
+</FONT>
+<FONT SIZE=-1><B>MAILPATH</B>,
+
+</FONT>
+and
+<FONT SIZE=-1><B>CDPATH</B>,
+
+</FONT>
+and the shell assigns the expanded value.
+<A NAME="lbBA">&nbsp;</A>
+<H3>Parameter Expansion</H3>
+
+<P>
+
+The `<B>$</B>' character introduces parameter expansion,
+command substitution, or arithmetic expansion.  The parameter name
+or symbol to be expanded may be enclosed in braces, which
+are optional but serve to protect the variable to be expanded from
+characters immediately following it which could be
+interpreted as part of the name.
+<P>
+
+When braces are used, the matching ending brace is the first `<B>}</B>'
+not escaped by a backslash or within a quoted string, and not within an
+embedded arithmetic expansion, command substitution, or paramter
+expansion.
+<P>
+
+
+<DL COMPACT>
+<DT>${<I>parameter</I>}<DD>
+The value of <I>parameter</I> is substituted.  The braces are required
+when
+<I>parameter</I>
+
+is a positional parameter with more than one digit,
+or when
+<I>parameter</I>
+
+is followed by a character which is not to be
+interpreted as part of its name.
+
+</DL>
+<P>
+
+If the first character of <I>parameter</I> is an exclamation point,
+a level of variable indirection is introduced.
+<B>Bash</B> uses the value of the variable formed from the rest of
+<I>parameter</I> as the name of the variable; this variable is then
+expanded and that value is used in the rest of the substitution, rather
+than the value of <I>parameter</I> itself.
+This is known as <I>indirect expansion</I>.
+The exceptions to this are the expansions of ${!<I>prefix</I>*} and
+${<B>!</B><I>name</I>[<I>@</I>]} described below.
+The exclamation point must immediately follow the left brace in order to
+introduce indirection.
+<P>
+
+In each of the cases below, <I>word</I> is subject to tilde expansion,
+parameter expansion, command substitution, and arithmetic expansion.
+When not performing substring expansion, <B>bash</B> tests for a parameter
+that is unset or null; omitting the colon results in a test only for a
+parameter that is unset.
+<P>
+
+
+<DL COMPACT>
+<DT>${<I>parameter</I><B>:-</B><I>word</I>}<DD>
+<B>Use Default Values</B>.  If
+<I>parameter</I>
+
+is unset or null, the expansion of
+<I>word</I>
+
+is substituted.  Otherwise, the value of
+<I>parameter</I>
+
+is substituted.
+<DT>${<I>parameter</I><B>:=</B><I>word</I>}<DD>
+<B>Assign Default Values</B>.
+If
+<I>parameter</I>
+
+is unset or null, the expansion of
+<I>word</I>
+
+is assigned to
+<I>parameter</I>.
+
+The value of
+<I>parameter</I>
+
+is then substituted.  Positional parameters and special parameters may
+not be assigned to in this way.
+<DT>${<I>parameter</I><B>:?</B><I>word</I>}<DD>
+<B>Display Error if Null or Unset</B>.
+If
+<I>parameter</I>
+
+is null or unset, the expansion of <I>word</I> (or a message to that effect
+if
+<I>word</I>
+
+is not present) is written to the standard error and the shell, if it
+is not interactive, exits.  Otherwise, the value of <I>parameter</I> is
+substituted.
+<DT>${<I>parameter</I><B>:+</B><I>word</I>}<DD>
+<B>Use Alternate Value</B>.
+If
+<I>parameter</I>
+
+is null or unset, nothing is substituted, otherwise the expansion of
+<I>word</I>
+
+is substituted.
+<DT>${<I>parameter</I><B>:</B><I>offset</I>}<DD>
+
+<DT>${<I>parameter</I><B>:</B><I>offset</I><B>:</B><I>length</I>}<DD>
+
+<B>Substring Expansion.</B>
+Expands to up to <I>length</I> characters of <I>parameter</I>
+starting at the character specified by <I>offset</I>.
+If <I>length</I> is omitted, expands to the substring of
+<I>parameter</I> starting at the character specified by <I>offset</I>.
+<I>length</I> and <I>offset</I> are arithmetic expressions (see
+<FONT SIZE=-1><B>ARITHMETIC EVALUATION</B>
+
+</FONT>
+below).
+<I>length</I> must evaluate to a number greater than or equal to zero.
+If <I>offset</I> evaluates to a number less than zero, the value
+is used as an offset from the end of the value of <I>parameter</I>.
+If <I>parameter</I> is <B>@</B>, the result is <I>length</I> positional
+parameters beginning at <I>offset</I>.
+If <I>parameter</I> is an array name indexed by @ or *,
+the result is the <I>length</I>
+members of the array beginning with ${<I>parameter</I>[<I>offset</I>]}.
+Substring indexing is zero-based unless the positional parameters 
+are used, in which case the indexing starts at 1.
+<DT>${<B>!</B><I>prefix</I><B>*</B>}<DD>
+
+<DT>${<B>!</B><I>prefix</I><B>@</B>}<DD>
+
+Expands to the names of variables whose names begin with <I>prefix</I>,
+separated by the first character of the
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+special variable.
+<DT>${<B>!</B><I>name</I>[<I>@</I>]}<DD>
+
+<DT>${<B>!</B><I>name</I>[<I>*</I>]}<DD>
+
+If <I>name</I> is an array variable, expands to the list of array indices
+(keys) assigned in <I>name</I>.
+If <I>name</I> is not an array, expands to 0 if <I>name</I> is set and null
+otherwise.
+When <I>@</I> is used and the expansion appears within double quotes, each
+key expands to a separate word.
+<DT>${<B>#</B><I>parameter</I>}<DD>
+The length in characters of the value of <I>parameter</I> is substituted.
+If
+<I>parameter</I>
+
+is
+<B>*</B>
+
+or 
+<B>@</B>,
+
+the value substituted is the number of positional parameters.
+If
+<I>parameter</I>
+
+is an array name subscripted by
+<B>*</B>
+
+or
+<B>@</B>,
+
+the value substituted is the number of elements in the array.
+<DT>${<I>parameter</I><B>#</B><I>word</I>}<DD>
+
+<DT>${<I>parameter</I><B>##</B><I>word</I>}<DD>
+
+The 
+<I>word</I>
+
+is expanded to produce a pattern just as in pathname
+expansion.  If the pattern matches the beginning of
+the value of
+<I>parameter</I>,
+
+then the result of the expansion is the expanded value of
+<I>parameter</I>
+
+with the shortest matching pattern (the ``<B>#</B>'' case) or the
+longest matching pattern (the ``<B>##</B>'' case) deleted.
+If
+<I>parameter</I>
+
+is
+<B>@</B>
+
+or
+<B>*</B>,
+
+the pattern removal operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If
+<I>parameter</I>
+
+is an array variable subscripted with
+<B>@</B>
+
+or
+<B>*</B>,
+
+the pattern removal operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+<DT>${<I>parameter</I><B>%</B><I>word</I>}<DD>
+
+<DT>${<I>parameter</I><B>%%</B><I>word</I>}<DD>
+
+The <I>word</I> is expanded to produce a pattern just as in
+pathname expansion.
+If the pattern matches a trailing portion of the expanded value of
+<I>parameter</I>,
+
+then the result of the expansion is the expanded value of
+<I>parameter</I>
+
+with the shortest matching pattern (the ``<B>%</B>'' case) or the
+longest matching pattern (the ``<B>%%</B>'' case) deleted.
+If
+<I>parameter</I>
+
+is
+<B>@</B>
+
+or
+<B>*</B>,
+
+the pattern removal operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If
+<I>parameter</I>
+
+is an array variable subscripted with
+<B>@</B>
+
+or
+<B>*</B>,
+
+the pattern removal operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+<DT>${<I>parameter</I><B>/</B><I>pattern</I><B>/</B><I>string</I>}<DD>
+
+<DT>${<I>parameter</I><B>//</B><I>pattern</I><B>/</B><I>string</I>}<DD>
+
+The <I>pattern</I> is expanded to produce a pattern just as in
+pathname expansion.
+<I>Parameter</I> is expanded and the longest match of <I>pattern</I>
+against its value is replaced with <I>string</I>.
+In the first form, only the first match is replaced.
+The second form causes all matches of <I>pattern</I> to be
+replaced with <I>string</I>.
+If <I>pattern</I> begins with <B>#</B>, it must match at the beginning
+of the expanded value of <I>parameter</I>.
+If <I>pattern</I> begins with <B>%</B>, it must match at the end
+of the expanded value of <I>parameter</I>.
+If <I>string</I> is null, matches of <I>pattern</I> are deleted
+and the <B>/</B> following <I>pattern</I> may be omitted.
+If
+<I>parameter</I>
+
+is
+<B>@</B>
+
+or
+<B>*</B>,
+
+the substitution operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If
+<I>parameter</I>
+
+is an array variable subscripted with
+<B>@</B>
+
+or
+<B>*</B>,
+
+the substitution operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+</DL>
+<A NAME="lbBB">&nbsp;</A>
+<H3>Command Substitution</H3>
+
+<P>
+
+<I>Command substitution</I> allows the output of a command to replace
+the command name.  There are two forms:
+<P>
+
+<DL COMPACT><DT><DD>
+<P>
+
+<B>$(</B><I>command</I><B>)</B>
+</DL>
+
+or
+<DL COMPACT><DT><DD>
+<B>`</B><I>command</I><B>`</B>
+</DL>
+
+<P>
+
+<B>Bash</B>
+
+performs the expansion by executing <I>command</I> and
+replacing the command substitution with the standard output of the
+command, with any trailing newlines deleted.
+Embedded newlines are not deleted, but they may be removed during
+word splitting.
+The command substitution <B>$(cat </B><I>file</I>) can be replaced by
+the equivalent but faster <B>$(&lt; </B><I>file</I>).
+<P>
+
+When the old-style backquote form of substitution is used,
+backslash retains its literal meaning except when followed by
+<B>$</B>,
+
+<B>`</B>,
+
+or
+<B>\</B>.
+
+The first backquote not preceded by a backslash terminates the
+command substitution.
+When using the $(<I>command</I>) form, all characters between the
+parentheses make up the command; none are treated specially.
+<P>
+
+Command substitutions may be nested.  To nest when using the backquoted form,
+escape the inner backquotes with backslashes.
+<P>
+
+If the substitution appears within double quotes, word splitting and
+pathname expansion are not performed on the results.
+<A NAME="lbBC">&nbsp;</A>
+<H3>Arithmetic Expansion</H3>
+
+<P>
+
+Arithmetic expansion allows the evaluation of an arithmetic expression
+and the substitution of the result.  The format for arithmetic expansion is:
+<DL COMPACT><DT><DD>
+<P>
+
+<B>$((</B><I>expression</I><B>))</B>
+</DL>
+
+<P>
+
+The
+<I>expression</I>
+
+is treated as if it were within double quotes, but a double quote
+inside the parentheses is not treated specially.
+All tokens in the expression undergo parameter expansion, string
+expansion, command substitution, and quote removal.
+Arithmetic expansions may be nested.
+<P>
+
+The evaluation is performed according to the rules listed below under
+<FONT SIZE=-1><B>ARITHMETIC EVALUATION</B>.
+
+</FONT>
+If
+<I>expression</I>
+
+is invalid,
+<B>bash</B>
+
+prints a message indicating failure and no substitution occurs.
+<A NAME="lbBD">&nbsp;</A>
+<H3>Process Substitution</H3>
+
+<P>
+
+<I>Process substitution</I> is supported on systems that support named
+pipes (<I>FIFOs</I>) or the <B>/dev/fd</B> method of naming open files.
+It takes the form of
+<B>&lt;(</B><I>list</I><B>)</B>
+or
+<B>&gt;(</B><I>list</I><B>)</B>.
+The process <I>list</I> is run with its input or output connected to a
+<I>FIFO</I> or some file in <B>/dev/fd</B>.  The name of this file is
+passed as an argument to the current command as the result of the
+expansion.  If the <B>&gt;(</B><I>list</I><B>)</B> form is used, writing to
+the file will provide input for <I>list</I>.  If the
+<B>&lt;(</B><I>list</I><B>)</B> form is used, the file passed as an
+argument should be read to obtain the output of <I>list</I>.
+<P>
+
+When available, process substitution is performed
+simultaneously with parameter and variable expansion, 
+command substitution,
+and arithmetic expansion.
+<A NAME="lbBE">&nbsp;</A>
+<H3>Word Splitting</H3>
+
+<P>
+
+The shell scans the results of
+parameter expansion,
+command substitution,
+and
+arithmetic expansion
+that did not occur within double quotes for
+<I>word splitting</I>.
+
+<P>
+
+The shell treats each character of
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+as a delimiter, and splits the results of the other
+expansions into words on these characters.  If
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+is unset, or its
+value is exactly
+<B>&lt;space&gt;&lt;tab&gt;&lt;newline&gt;</B>,
+
+the default, then
+any sequence of
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+characters serves to delimit words.  If
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+has a value other than the default, then sequences of
+the whitespace characters
+<B>space</B>
+
+and
+<B>tab</B>
+
+are ignored at the beginning and end of the
+word, as long as the whitespace character is in the
+value of
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+(an
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+whitespace character).
+Any character in
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+that is not
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+whitespace, along with any adjacent
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+whitespace characters, delimits a field.
+A sequence of
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+whitespace characters is also treated as a delimiter.
+If the value of
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+is null, no word splitting occurs.
+<P>
+
+Explicit null arguments (<B>&quot;&quot;</B> or <B>''</B>) are retained.
+Unquoted implicit null arguments, resulting from the expansion of
+parameters that have no values, are removed.
+If a parameter with no value is expanded within double quotes, a
+null argument results and is retained.
+<P>
+
+Note that if no expansion occurs, no splitting
+is performed.
+<A NAME="lbBF">&nbsp;</A>
+<H3>Pathname Expansion</H3>
+
+<P>
+
+After word splitting,
+unless the
+<B>-f</B>
+
+option has been set,
+<B>bash</B>
+
+scans each word for the characters
+<B>*</B>,
+
+<B>?</B>,
+
+and
+<B>[</B>.
+
+If one of these characters appears, then the word is
+regarded as a
+<I>pattern</I>,
+
+and replaced with an alphabetically sorted list of
+file names matching the pattern.
+If no matching file names are found,
+and the shell option
+<B>nullglob</B>
+
+is disabled, the word is left unchanged.
+If the 
+<B>nullglob</B>
+
+option is set, and no matches are found,
+the word is removed.
+If the
+<B>failglob</B>
+
+shell option is set, and no matches are found, an error message
+is printed and the command is not executed.
+If the shell option
+<B>nocaseglob</B>
+
+is enabled, the match is performed without regard to the case
+of alphabetic characters.
+When a pattern is used for pathname expansion,
+the character
+<B>``.''</B>
+
+at the start of a name or immediately following a slash
+must be matched explicitly, unless the shell option
+<B>dotglob</B>
+
+is set.
+When matching a pathname, the slash character must always be
+matched explicitly.
+In other cases, the
+<B>``.''</B>
+
+character is not treated specially.
+See the description of
+<B>shopt</B>
+
+below under
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+for a description of the
+<B>nocaseglob</B>,
+
+<B>nullglob</B>,
+
+<B>failglob</B>,
+
+and
+<B>dotglob</B>
+
+shell options.
+<P>
+
+The
+<FONT SIZE=-1><B>GLOBIGNORE</B>
+
+</FONT>
+shell variable may be used to restrict the set of file names matching a
+<I>pattern</I>.
+
+If
+<FONT SIZE=-1><B>GLOBIGNORE</B>
+
+</FONT>
+is set, each matching file name that also matches one of the patterns in
+<FONT SIZE=-1><B>GLOBIGNORE</B>
+
+</FONT>
+is removed from the list of matches.
+The file names
+<B>``.''</B>
+
+and
+<B>``..''</B>
+
+are always ignored when
+<FONT SIZE=-1><B>GLOBIGNORE</B>
+
+</FONT>
+is set and not null.  However, setting
+<FONT SIZE=-1><B>GLOBIGNORE</B>
+
+</FONT>
+to a non-null value has the effect of enabling the
+<B>dotglob</B>
+
+shell option, so all other file names beginning with a
+<B>``.''</B>
+
+will match.
+To get the old behavior of ignoring file names beginning with a
+<B>``.''</B>,
+
+make
+<B>``.*''</B>
+
+one of the patterns in
+<FONT SIZE=-1><B>GLOBIGNORE</B>.
+
+</FONT>
+The
+<B>dotglob</B>
+
+option is disabled when
+<FONT SIZE=-1><B>GLOBIGNORE</B>
+
+</FONT>
+is unset.
+<P>
+
+<B>Pattern Matching</B>
+<P>
+
+Any character that appears in a pattern, other than the special pattern
+characters described below, matches itself.  The NUL character may not
+occur in a pattern.  A backslash escapes the following character; the
+escaping backslash is discarded when matching.
+The special pattern characters must be quoted if
+they are to be matched literally.
+<P>
+
+The special pattern characters have the following meanings:
+<P>
+
+
+<DL COMPACT>
+<DT><B>*</B>
+
+<DD>
+Matches any string, including the null string.
+<DT><B>?</B>
+
+<DD>
+Matches any single character.
+<DT><B>[...]</B>
+
+<DD>
+Matches any one of the enclosed characters.  A pair of characters
+separated by a hyphen denotes a
+<I>range expression</I>;
+any character that sorts between those two characters, inclusive,
+using the current locale's collating sequence and character set,
+is matched.  If the first character following the
+<B>[</B>
+
+is a
+<B>!</B>
+
+or a
+<B>^</B>
+
+then any character not enclosed is matched.
+The sorting order of characters in range expressions is determined by
+the current locale and the value of the <B>LC_COLLATE</B> shell variable,
+if set.
+A 
+<B>-</B>
+
+may be matched by including it as the first or last character
+in the set.
+A
+<B>]</B>
+
+may be matched by including it as the first character
+in the set.
+<BR>
+
+<P>
+
+
+Within
+<B>[</B>
+
+and
+<B>]</B>,
+
+<I>character classes</I> can be specified using the syntax
+<B>[:</B><I>class</I><B>:]</B>, where <I>class</I> is one of the
+following classes defined in the POSIX.2 standard:
+</DL>
+<P>
+
+<DL COMPACT><DT><DD>
+<B>
+</B>
+
+alnum   alpha   ascii   blank   cntrl   digit   graph   lower   print   punct   space   upper   word   xdigit
+<BR>
+
+A character class matches any character belonging to that class.
+The <B>word</B> character class matches letters, digits, and the character _.
+<BR>
+
+<P>
+
+
+Within
+<B>[</B>
+
+and 
+<B>]</B>,
+
+an <I>equivalence class</I> can be specified using the syntax
+<B>[=</B><I>c</I><B>=]</B>, which matches all characters with the
+same collation weight (as defined by the current locale) as
+the character <I>c</I>.
+<BR>
+
+<P>
+
+
+Within
+<B>[</B>
+
+and 
+<B>]</B>,
+
+the syntax <B>[.</B><I>symbol</I><B>.]</B> matches the collating symbol
+<I>symbol</I>.
+</DL>
+
+
+<P>
+
+If the <B>extglob</B> shell option is enabled using the <B>shopt</B>
+builtin, several extended pattern matching operators are recognized.
+In the following description, a <I>pattern-list</I> is a list of one
+or more patterns separated by a <B>|</B>.
+Composite patterns may be formed using one or more of the following
+sub-patterns:
+<P>
+
+<DL COMPACT><DT><DD>
+<DL COMPACT>
+<DT><B>?(</B><I>pattern-list</I><B>)</B><DD>
+Matches zero or one occurrence of the given patterns
+<DT><B>*(</B><I>pattern-list</I><B>)</B><DD>
+Matches zero or more occurrences of the given patterns
+<DT><B>+(</B><I>pattern-list</I><B>)</B><DD>
+Matches one or more occurrences of the given patterns
+<DT><B>@(</B><I>pattern-list</I><B>)</B><DD>
+Matches exactly one of the given patterns
+<DT><B>!(</B><I>pattern-list</I><B>)</B><DD>
+Matches anything except one of the given patterns
+</DL></DL>
+
+
+<A NAME="lbBG">&nbsp;</A>
+<H3>Quote Removal</H3>
+
+<P>
+
+After the preceding expansions, all unquoted occurrences of the
+characters
+<B>\</B>,
+
+<B>'</B>,
+
+and <B>&quot;</B> that did not result from one of the above
+expansions are removed.
+<A NAME="lbBH">&nbsp;</A>
+<H2>REDIRECTION</H2>
+
+Before a command is executed, its input and output
+may be
+<I>redirected</I>
+
+using a special notation interpreted by the shell.
+Redirection may also be used to open and close files for the
+current shell execution environment.  The following redirection
+operators may precede or appear anywhere within a
+<I>simple command</I>
+
+or may follow a
+<I>command</I>.
+
+Redirections are processed in the order they appear, from
+left to right.
+<P>
+
+In the following descriptions, if the file descriptor number is
+omitted, and the first character of the redirection operator is
+<B>&lt;</B>,
+
+the redirection refers to the standard input (file descriptor
+0).  If the first character of the redirection operator is
+<B>&gt;</B>,
+
+the redirection refers to the standard output (file descriptor
+1).
+<P>
+
+The word following the redirection operator in the following
+descriptions, unless otherwise noted, is subjected to brace expansion,
+tilde expansion, parameter expansion, command substitution, arithmetic
+expansion, quote removal, pathname expansion, and word splitting.
+If it expands to more than one word,
+<B>bash</B>
+
+reports an error.
+<P>
+
+Note that the order of redirections is significant.  For example, 
+the command
+<DL COMPACT><DT><DD>
+<P>
+
+ls <B>&gt;</B> dirlist 2<B>&gt;&amp;</B>1
+</DL>
+
+<P>
+
+directs both standard output and standard error to the file 
+<I>dirlist</I>,
+
+while the command
+<DL COMPACT><DT><DD>
+<P>
+
+ls 2<B>&gt;&amp;</B>1 <B>&gt;</B> dirlist
+</DL>
+
+<P>
+
+directs only the standard output to file
+<I>dirlist</I>,
+
+because the standard error was duplicated as standard output
+before the standard output was redirected to
+<I>dirlist</I>.
+
+<P>
+
+<B>Bash</B> handles several filenames specially when they are used in
+redirections, as described in the following table:
+<DL COMPACT><DT><DD>
+<P>
+
+
+<DL COMPACT>
+<DT><B>/dev/fd/</B><I>fd</I>
+
+<DD>
+If <I>fd</I> is a valid integer, file descriptor <I>fd</I> is duplicated.
+<DT><B>/dev/stdin</B>
+
+<DD>
+File descriptor 0 is duplicated.
+<DT><B>/dev/stdout</B>
+
+<DD>
+File descriptor 1 is duplicated.
+<DT><B>/dev/stderr</B>
+
+<DD>
+File descriptor 2 is duplicated.
+<DT><B>/dev/tcp/</B><I>host</I>/<I>port</I>
+
+<DD>
+If <I>host</I> is a valid hostname or Internet address, and <I>port</I>
+is an integer port number or service name, <B>bash</B> attempts to open
+a TCP connection to the corresponding socket.
+<DT><B>/dev/udp/</B><I>host</I>/<I>port</I>
+
+<DD>
+If <I>host</I> is a valid hostname or Internet address, and <I>port</I>
+is an integer port number or service name, <B>bash</B> attempts to open
+a UDP connection to the corresponding socket.
+
+</DL></DL>
+
+<P>
+
+A failure to open or create a file causes the redirection to fail.
+<A NAME="lbBI">&nbsp;</A>
+<H3>Redirecting Input</H3>
+
+<P>
+
+Redirection of input causes the file whose name results from
+the expansion of
+<I>word</I>
+
+to be opened for reading on file descriptor
+<I>n</I>,
+
+or the standard input (file descriptor 0) if
+<I>n</I>
+
+is not specified.
+<P>
+
+The general format for redirecting input is:
+<DL COMPACT><DT><DD>
+<P>
+
+[<I>n</I>]<B>&lt;</B><I>word</I>
+</DL>
+
+<A NAME="lbBJ">&nbsp;</A>
+<H3>Redirecting Output</H3>
+
+<P>
+
+Redirection of output causes the file whose name results from
+the expansion of
+<I>word</I>
+
+to be opened for writing on file descriptor
+<I>n</I>,
+
+or the standard output (file descriptor 1) if
+<I>n</I>
+
+is not specified.  If the file does not exist it is created;
+if it does exist it is truncated to zero size.
+<P>
+
+The general format for redirecting output is:
+<DL COMPACT><DT><DD>
+<P>
+
+[<I>n</I>]<B>&gt;</B><I>word</I>
+</DL>
+
+<P>
+
+If the redirection operator is
+<B>&gt;</B>,
+
+and the
+<B>noclobber</B>
+
+option to the
+<B>set</B>
+
+builtin has been enabled, the redirection will fail if the file
+whose name results from the expansion of <I>word</I> exists and is
+a regular file.
+If the redirection operator is
+<B>&gt;|</B>,
+
+or the redirection operator is
+<B>&gt;</B>
+
+and the
+<B>noclobber</B>
+
+option to the
+<B>set</B>
+
+builtin command is not enabled, the redirection is attempted even
+if the file named by <I>word</I> exists.
+<A NAME="lbBK">&nbsp;</A>
+<H3>Appending Redirected Output</H3>
+
+<P>
+
+Redirection of output in this fashion
+causes the file whose name results from
+the expansion of
+<I>word</I>
+
+to be opened for appending on file descriptor
+<I>n</I>,
+
+or the standard output (file descriptor 1) if
+<I>n</I>
+
+is not specified.  If the file does not exist it is created.
+<P>
+
+The general format for appending output is:
+<DL COMPACT><DT><DD>
+<P>
+
+[<I>n</I>]<B>&gt;&gt;</B><I>word</I>
+</DL>
+
+<P>
+
+<A NAME="lbBL">&nbsp;</A>
+<H3>Redirecting Standard Output and Standard Error</H3>
+
+<P>
+
+<B>Bash</B>
+
+allows both the
+standard output (file descriptor 1) and
+the standard error output (file descriptor 2)
+to be redirected to the file whose name is the
+expansion of
+<I>word</I>
+
+with this construct.
+<P>
+
+There are two formats for redirecting standard output and
+standard error:
+<DL COMPACT><DT><DD>
+<P>
+
+<B>&amp;&gt;</B><I>word</I>
+</DL>
+
+and
+<DL COMPACT><DT><DD>
+<B>&gt;&amp;</B><I>word</I>
+</DL>
+
+<P>
+
+Of the two forms, the first is preferred.
+This is semantically equivalent to
+<DL COMPACT><DT><DD>
+<P>
+
+<B>&gt;</B><I>word</I> 2<B>&gt;&amp;</B>1
+</DL>
+
+<A NAME="lbBM">&nbsp;</A>
+<H3>Here Documents</H3>
+
+<P>
+
+This type of redirection instructs the shell to read input from the
+current source until a line containing only
+<I>word</I>
+
+(with no trailing blanks)
+is seen.  All of
+the lines read up to that point are then used as the standard
+input for a command.
+<P>
+
+The format of here-documents is:
+<DL COMPACT><DT><DD>
+<P>
+
+<PRE>
+<B>&lt;&lt;</B>[<B>-</B>]<I>word</I>
+        <I>here-document</I>
+<I>delimiter</I>
+</PRE>
+
+</DL>
+
+<P>
+
+No parameter expansion, command substitution, arithmetic expansion,
+or pathname expansion is performed on
+<I>word</I>.
+
+If any characters in
+<I>word</I>
+
+are quoted, the
+<I>delimiter</I>
+
+is the result of quote removal on
+<I>word</I>,
+
+and the lines in the here-document are not expanded.
+If <I>word</I> is unquoted,
+all lines of the here-document are subjected to parameter expansion,
+command substitution, and arithmetic expansion.  In the latter
+case, the character sequence
+<B>\&lt;newline&gt;</B>
+
+is ignored, and
+<B>\</B>
+
+must be used to quote the characters
+<B>\</B>,
+
+<B>$</B>,
+
+and
+<B>`</B>.
+
+<P>
+
+If the redirection operator is
+<B>&lt;&lt;-</B>,
+
+then all leading tab characters are stripped from input lines and the
+line containing
+<I>delimiter</I>.
+
+This allows
+here-documents within shell scripts to be indented in a
+natural fashion.
+<A NAME="lbBN">&nbsp;</A>
+<H3>Here Strings</H3>
+
+A variant of here documents, the format is:
+<DL COMPACT><DT><DD>
+<P>
+
+<PRE>
+<B>&lt;&lt;&lt;</B><I>word</I>
+</PRE>
+
+</DL>
+
+<P>
+
+The <I>word</I> is expanded and supplied to the command on its standard
+input.
+<A NAME="lbBO">&nbsp;</A>
+<H3>Duplicating File Descriptors</H3>
+
+<P>
+
+The redirection operator
+<DL COMPACT><DT><DD>
+<P>
+
+[<I>n</I>]<B>&lt;&amp;</B><I>word</I>
+</DL>
+
+<P>
+
+is used to duplicate input file descriptors.
+If
+<I>word</I>
+
+expands to one or more digits, the file descriptor denoted by
+<I>n</I>
+
+is made to be a copy of that file descriptor.
+If the digits in
+<I>word</I>
+
+do not specify a file descriptor open for input, a redirection error occurs.
+If
+<I>word</I>
+
+evaluates to
+<B>-</B>,
+
+file descriptor
+<I>n</I>
+
+is closed.  If
+<I>n</I>
+
+is not specified, the standard input (file descriptor 0) is used.
+<P>
+
+The operator
+<DL COMPACT><DT><DD>
+<P>
+
+[<I>n</I>]<B>&gt;&amp;</B><I>word</I>
+</DL>
+
+<P>
+
+is used similarly to duplicate output file descriptors.  If
+<I>n</I>
+
+is not specified, the standard output (file descriptor 1) is used.
+If the digits in
+<I>word</I>
+
+do not specify a file descriptor open for output, a redirection error occurs.
+As a special case, if <I>n</I> is omitted, and <I>word</I> does not
+expand to one or more digits, the standard output and standard
+error are redirected as described previously.
+<A NAME="lbBP">&nbsp;</A>
+<H3>Moving File Descriptors</H3>
+
+<P>
+
+The redirection operator
+<DL COMPACT><DT><DD>
+<P>
+
+[<I>n</I>]<B>&lt;&amp;</B><I>digit</I><B>-</B>
+</DL>
+
+<P>
+
+moves the file descriptor <I>digit</I> to file descriptor
+<I>n</I>,
+
+or the standard input (file descriptor 0) if <I>n</I> is not specified.
+<I>digit</I> is closed after being duplicated to <I>n</I>.
+<P>
+
+Similarly, the redirection operator
+<DL COMPACT><DT><DD>
+<P>
+
+[<I>n</I>]<B>&gt;&amp;</B><I>digit</I><B>-</B>
+</DL>
+
+<P>
+
+moves the file descriptor <I>digit</I> to file descriptor
+<I>n</I>,
+
+or the standard output (file descriptor 1) if <I>n</I> is not specified.
+<A NAME="lbBQ">&nbsp;</A>
+<H3>Opening File Descriptors for Reading and Writing</H3>
+
+<P>
+
+The redirection operator
+<DL COMPACT><DT><DD>
+<P>
+
+[<I>n</I>]<B>&lt;&gt;</B><I>word</I>
+</DL>
+
+<P>
+
+causes the file whose name is the expansion of
+<I>word</I>
+
+to be opened for both reading and writing on file descriptor
+<I>n</I>,
+
+or on file descriptor 0 if
+<I>n</I>
+
+is not specified.  If the file does not exist, it is created.
+<A NAME="lbBR">&nbsp;</A>
+<H2>ALIASES</H2>
+
+<I>Aliases</I> allow a string to be substituted for a word when it is used
+as the first word of a simple command.
+The shell maintains a list of aliases that may be set and unset with the
+<B>alias</B>
+
+and
+<B>unalias</B>
+
+builtin commands (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+The first word of each command, if unquoted,
+is checked to see if it has an
+alias.  If so, that word is replaced by the text of the alias.
+The alias name and the replacement text may contain any valid
+shell input, including the
+<I>metacharacters</I>
+
+listed above, with the exception that the alias name may not
+contain <I>=</I>.  The first word of the replacement text is tested
+for aliases, but a word that is identical to an alias being expanded
+is not expanded a second time.  This means that one may alias
+<B>ls</B>
+
+to
+<B>ls -F</B>,
+
+for instance, and
+<B>bash</B>
+
+does not try to recursively expand the replacement text.
+If the last character of the alias value is a
+<I>blank</I>,
+
+then the next command
+word following the alias is also checked for alias expansion.
+<P>
+
+Aliases are created and listed with the
+<B>alias</B>
+
+command, and removed with the
+<B>unalias</B>
+
+command.
+<P>
+
+There is no mechanism for using arguments in the replacement text.
+If arguments are needed, a shell function should be used (see
+<FONT SIZE=-1><B>FUNCTIONS</B>
+
+</FONT>
+below).
+<P>
+
+Aliases are not expanded when the shell is not interactive, unless
+the
+<B>expand_aliases</B>
+
+shell option is set using
+<B>shopt</B>
+
+(see the description of
+<B>shopt</B>
+
+under
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B></FONT>
+below).
+<P>
+
+The rules concerning the definition and use of aliases are
+somewhat confusing.
+<B>Bash</B>
+
+always reads at least one complete line
+of input before executing any
+of the commands on that line.  Aliases are expanded when a
+command is read, not when it is executed.  Therefore, an
+alias definition appearing on the same line as another
+command does not take effect until the next line of input is read.
+The commands following the alias definition
+on that line are not affected by the new alias.
+This behavior is also an issue when functions are executed.
+Aliases are expanded when a function definition is read,
+not when the function is executed, because a function definition
+is itself a compound command.  As a consequence, aliases
+defined in a function are not available until after that
+function is executed.  To be safe, always put
+alias definitions on a separate line, and do not use
+<B>alias</B>
+
+in compound commands.
+<P>
+
+For almost every purpose, aliases are superseded by
+shell functions.
+<A NAME="lbBS">&nbsp;</A>
+<H2>FUNCTIONS</H2>
+
+A shell function, defined as described above under
+<FONT SIZE=-1><B>SHELL GRAMMAR</B>,
+
+</FONT>
+stores a series of commands for later execution.
+When the name of a shell function is used as a simple command name,
+the list of commands associated with that function name is executed.
+Functions are executed in the context of the
+current shell; no new process is created to interpret
+them (contrast this with the execution of a shell script).
+When a function is executed, the arguments to the
+function become the positional parameters
+during its execution.
+The special parameter
+<B>#</B>
+
+is updated to reflect the change.  Positional parameter 0
+is unchanged.
+The first element of the
+<FONT SIZE=-1><B>FUNCNAME</B>
+
+</FONT>
+variable is set to the name of the function while the function
+is executing.
+All other aspects of the shell execution
+environment are identical between a function and its caller
+with the exception that the
+<FONT SIZE=-1><B>DEBUG</B>
+
+</FONT>
+trap (see the description of the
+<B>trap</B>
+
+builtin under
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below) is not inherited unless the function has been given the
+<B>trace</B> attribute (see the description of the
+<FONT SIZE=-1><B>declare</B>
+
+</FONT>
+builtin below) or the
+<B>-o functrace</B> shell option has been enabled with
+the <B>set</B> builtin
+(in which case all functions inherit the <B>DEBUG</B> trap).
+<P>
+
+Variables local to the function may be declared with the
+<B>local</B>
+
+builtin command.  Ordinarily, variables and their values
+are shared between the function and its caller.
+<P>
+
+If the builtin command
+<B>return</B>
+
+is executed in a function, the function completes and
+execution resumes with the next command after the function
+call.
+Any command associated with the <B>RETURN</B> trap is executed
+before execution resumes.
+When a function completes, the values of the
+positional parameters and the special parameter
+<B>#</B>
+
+are restored to the values they had prior to the function's
+execution.
+<P>
+
+Function names and definitions may be listed with the
+<B>-f</B>
+
+option to the
+<B>declare</B>
+
+or
+<B>typeset</B>
+
+builtin commands.  The
+<B>-F</B>
+
+option to
+<B>declare</B>
+
+or
+<B>typeset</B>
+
+will list the function names only
+(and optionally the source file and line number, if the <B>extdebug</B>
+shell option is enabled).
+Functions may be exported so that subshells
+automatically have them defined with the
+<B>-f</B>
+
+option to the 
+<B>export</B>
+
+builtin.
+Note that shell functions and variables with the same name may result
+in multiple identically-named entries in the environment passed to the
+shell's children.
+Care should be taken in cases where this may cause a problem.
+<P>
+
+Functions may be recursive.  No limit is imposed on the number
+of recursive calls.
+<A NAME="lbBT">&nbsp;</A>
+<H2>ARITHMETIC EVALUATION</H2>
+
+The shell allows arithmetic expressions to be evaluated, under
+certain circumstances (see the <B>let</B> and <B>declare</B> builtin
+commands and <B>Arithmetic Expansion</B>).
+Evaluation is done in fixed-width integers with no check for overflow,
+though division by 0 is trapped and flagged as an error.
+The operators and their precedence, associativity, and values
+are the same as in the C language.
+The following list of operators is grouped into levels of
+equal-precedence operators.
+The levels are listed in order of decreasing precedence.
+<P>
+
+
+<DL COMPACT>
+<DT><B></B><I>id</I>++ <I>id</I>--
+
+<DD>
+variable post-increment and post-decrement
+<DT><B>++</B><I>id</I> --<I>id</I>
+
+<DD>
+variable pre-increment and pre-decrement
+<DT><B>- +</B>
+
+<DD>
+unary minus and plus
+<DT><B>! ~</B>
+
+<DD>
+logical and bitwise negation
+<DT><B>**</B>
+
+<DD>
+exponentiation
+<DT><B>* / %</B>
+
+<DD>
+multiplication, division, remainder
+<DT><B>+ -</B>
+
+<DD>
+addition, subtraction
+<DT><B>&lt;&lt; &gt;&gt;</B>
+
+<DD>
+left and right bitwise shifts
+<DT><B>&lt;= &gt;= &lt; &gt;</B>
+
+<DD>
+comparison
+<DT><B>== !=</B>
+
+<DD>
+equality and inequality
+<DT><B>&amp;</B>
+
+<DD>
+bitwise AND
+<DT><B>^</B>
+
+<DD>
+bitwise exclusive OR
+<DT><B>|</B>
+
+<DD>
+bitwise OR
+<DT><B>&amp;&amp;</B>
+
+<DD>
+logical AND
+<DT><B>||</B>
+
+<DD>
+logical OR
+<DT><B></B><I>expr</I>?<I>expr</I>:<I>expr</I>
+
+<DD>
+conditional operator
+<DT><B>= *= /= %= += -= &lt;&lt;= &gt;&gt;= &amp;= ^= |=</B>
+
+<DD>
+assignment
+<DT><B></B><I>expr1</I> , <I>expr2</I>
+
+<DD>
+comma
+
+</DL>
+<P>
+
+Shell variables are allowed as operands; parameter expansion is
+performed before the expression is evaluated.
+Within an expression, shell variables may also be referenced by name
+without using the parameter expansion syntax.
+A shell variable that is null or unset evaluates to 0 when referenced
+by name without using the parameter expansion syntax.
+The value of a variable is evaluated as an arithmetic expression
+when it is referenced, or when a variable which has been given the
+<I>integer</I> attribute using <B>declare -i</B> is assigned a value.
+A null value evaluates to 0.
+A shell variable need not have its integer attribute
+turned on to be used in an expression.
+<P>
+
+Constants with a leading 0 are interpreted as octal numbers.
+A leading 0x or 0X denotes hexadecimal.
+Otherwise, numbers take the form [<I>base#</I>]n, where <I>base</I>
+is a decimal number between 2 and 64 representing the arithmetic
+base, and <I>n</I> is a number in that base.
+If <I>base#</I> is omitted, then base 10 is used.
+The digits greater than 9 are represented by the lowercase letters,
+the uppercase letters, @, and _, in that order.
+If <I>base</I> is less than or equal to 36, lowercase and uppercase
+letters may be used interchangably to represent numbers between 10
+and 35.
+<P>
+
+Operators are evaluated in order of precedence.  Sub-expressions in
+parentheses are evaluated first and may override the precedence
+rules above.
+<A NAME="lbBU">&nbsp;</A>
+<H2>CONDITIONAL EXPRESSIONS</H2>
+
+Conditional expressions are used by the <B>[[</B> compound command and
+the <B>test</B> and <B>[</B> builtin commands to test file attributes
+and perform string and arithmetic comparisons.
+Expressions are formed from the following unary or binary primaries.
+If any <I>file</I> argument to one of the primaries is of the form
+<I>/dev/fd/n</I>, then file descriptor <I>n</I> is checked.
+If the <I>file</I> argument to one of the primaries is one of
+<I>/dev/stdin</I>, <I>/dev/stdout</I>, or <I>/dev/stderr</I>, file
+descriptor 0, 1, or 2, respectively, is checked.
+<P>
+
+<DL COMPACT>
+<DT><B>-a </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists.
+<DT><B>-b </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is a block special file.
+<DT><B>-c </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is a character special file.
+<DT><B>-d </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is a directory.
+<DT><B>-e </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists.
+<DT><B>-f </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is a regular file.
+<DT><B>-g </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is set-group-id.
+<DT><B>-h </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is a symbolic link.
+<DT><B>-k </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and its ``sticky'' bit is set.
+<DT><B>-p </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is a named pipe (FIFO).
+<DT><B>-r </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is readable.
+<DT><B>-s </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and has a size greater than zero.
+<DT><B>-t </B><I>fd</I>
+
+<DD>
+True if file descriptor
+<I>fd</I>
+
+is open and refers to a terminal.
+<DT><B>-u </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and its set-user-id bit is set.
+<DT><B>-w </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is writable.
+<DT><B>-x </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is executable.
+<DT><B>-O </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is owned by the effective user id.
+<DT><B>-G </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is owned by the effective group id.
+<DT><B>-L </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is a symbolic link.
+<DT><B>-S </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and is a socket.
+<DT><B>-N </B><I>file</I>
+
+<DD>
+True if <I>file</I> exists and has been modified since it was last read.
+<DT><I>file1</I> -<B>nt</B> <I>file2</I><DD>
+True if <I>file1</I> is newer (according to modification date) than <I>file2</I>,
+or if <I>file1</I> exists and file2 does not.
+<DT><I>file1</I> -<B>ot</B> <I>file2</I><DD>
+True if <I>file1</I> is older than <I>file2</I>, or if <I>file2</I> exists
+and <I>file1</I> does not.
+<DT><I>file1</I> <B>-ef</B> <I>file2</I><DD>
+True if <I>file1</I> and <I>file2</I> refer to the same device and
+inode numbers.
+<DT><B>-o </B><I>optname</I>
+
+<DD>
+True if shell option
+<I>optname</I>
+
+is enabled.
+See the list of options under the description of the
+<B>-o</B>
+
+option to the
+<B>set</B>
+
+builtin below.
+<DT><B>-z </B><I>string</I>
+
+<DD>
+True if the length of <I>string</I> is zero.
+<DT><B>-n </B><I>string</I>
+
+<DD>
+<DT><I>string</I><DD>
+True if the length of
+<I>string</I>
+
+is non-zero.
+<DT><I>string1</I> <B>==</B> <I>string2</I><DD>
+True if the strings are equal.  <B>=</B> may be used in place of
+<B>==</B> for strict POSIX compliance.
+<DT><I>string1</I> <B>!=</B> <I>string2</I><DD>
+True if the strings are not equal.
+<DT><I>string1</I> <B>&lt;</B> <I>string2</I><DD>
+True if <I>string1</I> sorts before <I>string2</I> lexicographically
+in the current locale.
+<DT><I>string1</I> <B>&gt;</B> <I>string2</I><DD>
+True if <I>string1</I> sorts after <I>string2</I> lexicographically
+in the current locale.
+<DT><I>arg1</I> <B>OP</B> <I>arg2</I>
+
+<DD>
+<FONT SIZE=-1><B>OP</B>
+
+</FONT>
+is one of
+<B>-eq</B>,
+
+<B>-ne</B>,
+
+<B>-lt</B>,
+
+<B>-le</B>,
+
+<B>-gt</B>,
+
+or
+<B>-ge</B>.
+
+These arithmetic binary operators return true if <I>arg1</I>
+is equal to, not equal to, less than, less than or equal to,
+greater than, or greater than or equal to <I>arg2</I>, respectively.
+<I>Arg1</I>
+
+and
+<I>arg2</I>
+
+may be positive or negative integers.
+
+</DL>
+<A NAME="lbBV">&nbsp;</A>
+<H2>SIMPLE COMMAND EXPANSION</H2>
+
+When a simple command is executed, the shell performs the following
+expansions, assignments, and redirections, from left to right.
+<DL COMPACT>
+<DT>1.<DD>
+The words that the parser has marked as variable assignments (those
+preceding the command name) and redirections are saved for later
+processing.
+<DT>2.<DD>
+The words that are not variable assignments or redirections are
+expanded.  If any words remain after expansion, the first word
+is taken to be the name of the command and the remaining words are
+the arguments.
+<DT>3.<DD>
+Redirections are performed as described above under
+<FONT SIZE=-1><B>REDIRECTION</B>.
+
+</FONT>
+<DT>4.<DD>
+The text after the <B>=</B> in each variable assignment undergoes tilde
+expansion, parameter expansion, command substitution, arithmetic expansion,
+and quote removal before being assigned to the variable.
+</DL>
+<P>
+
+If no command name results, the variable assignments affect the current
+shell environment.  Otherwise, the variables are added to the environment
+of the executed command and do not affect the current shell environment.
+If any of the assignments attempts to assign a value to a readonly variable,
+an error occurs, and the command exits with a non-zero status.
+<P>
+
+If no command name results, redirections are performed, but do not
+affect the current shell environment.  A redirection error causes the
+command to exit with a non-zero status.
+<P>
+
+If there is a command name left after expansion, execution proceeds as
+described below.  Otherwise, the command exits.  If one of the expansions
+contained a command substitution, the exit status of the command is
+the exit status of the last command substitution performed.  If there
+were no command substitutions, the command exits with a status of zero.
+<A NAME="lbBW">&nbsp;</A>
+<H2>COMMAND EXECUTION</H2>
+
+After a command has been split into words, if it results in a
+simple command and an optional list of arguments, the following
+actions are taken.
+<P>
+
+If the command name contains no slashes, the shell attempts to
+locate it.  If there exists a shell function by that name, that
+function is invoked as described above in
+<FONT SIZE=-1><B>FUNCTIONS</B>.
+
+</FONT>
+If the name does not match a function, the shell searches for
+it in the list of shell builtins.  If a match is found, that
+builtin is invoked.
+<P>
+
+If the name is neither a shell function nor a builtin,
+and contains no slashes,
+<B>bash</B>
+
+searches each element of the
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+for a directory containing an executable file by that name.
+<B>Bash</B>
+
+uses a hash table to remember the full pathnames of executable
+files (see
+<B>hash</B>
+
+under
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+A full search of the directories in
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+is performed only if the command is not found in the hash table.
+If the search is unsuccessful, the shell prints an error
+message and returns an exit status of 127.
+<P>
+
+If the search is successful, or if the command name contains
+one or more slashes, the shell executes the named program in a
+separate execution environment.
+Argument 0 is set to the name given, and the remaining arguments
+to the command are set to the arguments given, if any.
+<P>
+
+If this execution fails because the file is not in executable
+format, and the file is not a directory, it is assumed to be
+a <I>shell script</I>, a file
+containing shell commands.  A subshell is spawned to execute
+it.  This subshell reinitializes itself, so
+that the effect is as if a new shell had been invoked
+to handle the script, with the exception that the locations of
+commands remembered by the parent (see
+<B>hash</B>
+
+below under
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>)</FONT>
+are retained by the child.
+<P>
+
+If the program is a file beginning with
+<B>#!</B>,
+
+the remainder of the first line specifies an interpreter
+for the program.  The shell executes the
+specified interpreter on operating systems that do not
+handle this executable format themselves.  The arguments to the 
+interpreter consist of a single optional argument following the
+interpreter name on the first line of the program, followed
+by the name of the program, followed by the command
+arguments, if any.
+<A NAME="lbBX">&nbsp;</A>
+<H2>COMMAND EXECUTION ENVIRONMENT</H2>
+
+The shell has an <I>execution environment</I>, which consists of the
+following:
+<P>
+<DL COMPACT>
+<DT>*<DD>
+open files inherited by the shell at invocation, as modified by
+redirections supplied to the <B>exec</B> builtin
+<DT>*<DD>
+the current working directory as set by <B>cd</B>, <B>pushd</B>, or
+<B>popd</B>, or inherited by the shell at invocation
+<DT>*<DD>
+the file creation mode mask as set by <B>umask</B> or inherited from
+the shell's parent
+<DT>*<DD>
+current traps set by <B>trap</B>
+<DT>*<DD>
+shell parameters that are set by variable assignment or with <B>set</B>
+or inherited from the shell's parent in the environment
+<DT>*<DD>
+shell functions defined during execution or inherited from the shell's
+parent in the environment
+<DT>*<DD>
+options enabled at invocation (either by default or with command-line
+arguments) or by <B>set</B>
+<DT>*<DD>
+options enabled by <B>shopt</B>
+<DT>*<DD>
+shell aliases defined with <B>alias</B>
+<DT>*<DD>
+various process IDs, including those of background jobs, the value
+of <B>$$</B>, and the value of <B>$PPID</B>
+</DL>
+<P>
+
+When a simple command other than a builtin or shell function
+is to be executed, it
+is invoked in a separate execution environment that consists of
+the following.  Unless otherwise noted, the values are inherited
+from the shell.
+<P>
+<DL COMPACT>
+<DT>*<DD>
+the shell's open files, plus any modifications and additions specified
+by redirections to the command
+<DT>*<DD>
+the current working directory
+<DT>*<DD>
+the file creation mode mask
+<DT>*<DD>
+shell variables and functions marked for export, along with variables
+exported for the command, passed in the environment
+<DT>*<DD>
+traps caught by the shell are reset to the values inherited from the
+shell's parent, and traps ignored by the shell are ignored
+</DL>
+<P>
+
+A command invoked in this separate environment cannot affect the
+shell's execution environment. 
+<P>
+
+Command substitution, commands grouped with parentheses,
+and asynchronous commands are invoked in a
+subshell environment that is a duplicate of the shell environment,
+except that traps caught by the shell are reset to the values
+that the shell inherited from its parent at invocation.  Builtin
+commands that are invoked as part of a pipeline are also executed in a
+subshell environment.  Changes made to the subshell environment
+cannot affect the shell's execution environment.
+<P>
+
+If a command is followed by a <B>&amp;</B> and job control is not active, the
+default standard input for the command is the empty file <I>/dev/null</I>.
+Otherwise, the invoked command inherits the file descriptors of the calling
+shell as modified by redirections.
+<A NAME="lbBY">&nbsp;</A>
+<H2>ENVIRONMENT</H2>
+
+When a program is invoked it is given an array of strings
+called the
+<I>environment</I>.
+
+This is a list of 
+<I>name</I>-<I>value</I> pairs, of the form
+<I>name</I>=value.
+
+<P>
+
+The shell provides several ways to manipulate the environment.
+On invocation, the shell scans its own environment and
+creates a parameter for each name found, automatically marking
+it for
+<I>export</I>
+
+to child processes.  Executed commands inherit the environment.
+The
+<B>export</B>
+
+and
+<B>declare -x</B>
+
+commands allow parameters and functions to be added to and
+deleted from the environment.  If the value of a parameter
+in the environment is modified, the new value becomes part
+of the environment, replacing the old.  The environment
+inherited by any executed command consists of the shell's
+initial environment, whose values may be modified in the shell,
+less any pairs removed by the
+<B>unset</B>
+
+command, plus any additions via the
+<B>export</B>
+
+and
+<B>declare -x</B>
+
+commands.
+<P>
+
+The environment for any
+<I>simple command</I>
+
+or function may be augmented temporarily by prefixing it with
+parameter assignments, as described above in
+<FONT SIZE=-1><B>PARAMETERS</B>.
+
+</FONT>
+These assignment statements affect only the environment seen
+by that command.
+<P>
+
+If the 
+<B>-k</B>
+
+option is set (see the
+<B>set</B>
+
+builtin command below), then
+<I>all</I>
+
+parameter assignments are placed in the environment for a command,
+not just those that precede the command name.
+<P>
+
+When
+<B>bash</B>
+
+invokes an external command, the variable
+<B>_</B>
+
+is set to the full file name of the command and passed to that
+command in its environment.
+<A NAME="lbBZ">&nbsp;</A>
+<H2>EXIT STATUS</H2>
+
+For the shell's purposes, a command which exits with a 
+zero exit status has succeeded.  An exit status of zero
+indicates success.  A non-zero exit status indicates failure.
+When a command terminates on a fatal signal <I>N</I>, <B>bash</B> uses
+the value of 128+<I>N</I> as the exit status.
+<P>
+
+If a command is not found, the child process created to
+execute it returns a status of 127.  If a command is found
+but is not executable, the return status is 126.
+<P>
+
+If a command fails because of an error during expansion or redirection,
+the exit status is greater than zero.
+<P>
+
+Shell builtin commands return a status of 0 (<I>true</I>) if
+successful, and non-zero (<I>false</I>) if an error occurs
+while they execute. 
+All builtins return an exit status of 2 to indicate incorrect usage.
+<P>
+
+<B>Bash</B> itself returns the exit status of the last command
+executed, unless a syntax error occurs, in which case it exits
+with a non-zero value.  See also the <B>exit</B> builtin
+command below.
+<A NAME="lbCA">&nbsp;</A>
+<H2>SIGNALS</H2>
+
+When <B>bash</B> is interactive, in the absence of any traps, it ignores
+<FONT SIZE=-1><B>SIGTERM</B>
+
+</FONT>
+(so that <B>kill 0</B> does not kill an interactive shell),
+and
+<FONT SIZE=-1><B>SIGINT</B>
+
+</FONT>
+is caught and handled (so that the <B>wait</B> builtin is interruptible).
+In all cases, <B>bash</B> ignores
+<FONT SIZE=-1><B>SIGQUIT</B>.
+
+</FONT>
+If job control is in effect,
+<B>bash</B>
+
+ignores
+<FONT SIZE=-1><B>SIGTTIN</B>,
+
+</FONT>
+<FONT SIZE=-1><B>SIGTTOU</B>,
+
+</FONT>
+and
+<FONT SIZE=-1><B>SIGTSTP</B>.
+
+</FONT>
+<P>
+
+Non-builtin commands run by <B>bash</B> have signal handlers
+set to the values inherited by the shell from its parent.
+When job control is not in effect, asynchronous commands
+ignore
+<FONT SIZE=-1><B>SIGINT</B>
+
+</FONT>
+and
+<FONT SIZE=-1><B>SIGQUIT</B>
+
+</FONT>
+in addition to these inherited handlers.
+Commands run as a result of command substitution ignore the
+keyboard-generated job control signals
+<FONT SIZE=-1><B>SIGTTIN</B>,
+
+</FONT>
+<FONT SIZE=-1><B>SIGTTOU</B>,
+
+</FONT>
+and
+<FONT SIZE=-1><B>SIGTSTP</B>.
+
+</FONT>
+<P>
+
+The shell exits by default upon receipt of a
+<FONT SIZE=-1><B>SIGHUP</B>.
+
+</FONT>
+Before exiting, an interactive shell resends the
+<FONT SIZE=-1><B>SIGHUP</B>
+
+</FONT>
+to all jobs, running or stopped.
+Stopped jobs are sent
+<FONT SIZE=-1><B>SIGCONT</B>
+
+</FONT>
+to ensure that they receive the
+<FONT SIZE=-1><B>SIGHUP</B>.
+
+</FONT>
+To prevent the shell from
+sending the signal to a particular job, it should be removed from the
+jobs table with the 
+<B>disown</B>
+
+builtin (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below) or marked 
+to not receive
+<FONT SIZE=-1><B>SIGHUP</B>
+
+</FONT>
+using
+<B>disown -h</B>.
+
+<P>
+
+If the
+<B>huponexit</B>
+
+shell option has been set with
+<B>shopt</B>,
+
+<B>bash</B>
+
+sends a 
+<FONT SIZE=-1><B>SIGHUP</B>
+
+</FONT>
+to all jobs when an interactive login shell exits.
+<P>
+
+If Bbash is waiting for a command to complete and receives a signal
+for which a trap has been set, the trap will not be executed until
+the command completes. 
+When <B>bash</B> is waiting for an asynchronous command via the <B>wait</B>
+builtin, the reception of a signal for which a trap has been set will
+cause the <B>wait</B> builtin to return immediately with an exit status
+greater than 128, immediately after which the trap is executed.
+<A NAME="lbCB">&nbsp;</A>
+<H2>JOB CONTROL</H2>
+
+<I>Job control</I>
+
+refers to the ability to selectively stop (<I>suspend</I>)
+the execution of processes and continue (<I>resume</I>)
+their execution at a later point.  A user typically employs
+this facility via an interactive interface supplied jointly
+by the system's terminal driver and
+<B>bash</B>.
+
+<P>
+
+The shell associates a
+<I>job</I>
+
+with each pipeline.  It keeps a table of currently executing
+jobs, which may be listed with the
+<B>jobs</B>
+
+command.  When
+<B>bash</B>
+
+starts a job asynchronously (in the
+<I>background</I>),
+
+it prints a line that looks like:
+<DL COMPACT><DT><DD>
+<P>
+
+[1] 25647
+</DL>
+
+<P>
+
+indicating that this job is job number 1 and that the process ID
+of the last process in the pipeline associated with this job is 25647.
+All of the processes in a single pipeline are members of the same job.
+<B>Bash</B>
+
+uses the
+<I>job</I>
+
+abstraction as the basis for job control.
+<P>
+
+To facilitate the implementation of the user interface to job
+control, the operating system maintains the notion of a <I>current terminal
+process group ID</I>.  Members of this process group (processes whose
+process group ID is equal to the current terminal process group ID)
+receive keyboard-generated signals such as
+<FONT SIZE=-1><B>SIGINT</B>.
+
+</FONT>
+These processes are said to be in the
+<I>foreground</I>.
+
+<I>Background</I>
+
+processes are those whose process group ID differs from the terminal's;
+such processes are immune to keyboard-generated signals.
+Only foreground processes are allowed to read from or write to the
+terminal.  Background processes which attempt to read from (write to) the
+terminal are sent a 
+<FONT SIZE=-1><B>SIGTTIN (SIGTTOU)</B>
+
+</FONT>
+signal by the terminal driver, 
+which, unless caught, suspends the process.
+<P>
+
+If the operating system on which
+<B>bash</B>
+
+is running supports
+job control,
+<B>bash</B>
+
+contains facilities to use it.
+Typing the
+<I>suspend</I>
+
+character (typically
+<B>^Z</B>,
+
+Control-Z) while a process is running
+causes that process to be stopped and returns control to 
+<B>bash</B>.
+
+Typing the
+<I>delayed suspend</I>
+
+character (typically
+<B>^Y</B>,
+
+Control-Y) causes the process to be stopped when it
+attempts to read input from the terminal, and control to
+be returned to
+<B>bash</B>.
+
+The user may then manipulate the state of this job, using the
+<B>bg</B>
+
+command to continue it in the background, the
+<B>fg</B>
+
+command to continue it in the foreground, or
+the
+<B>kill</B>
+
+command to kill it.  A <B>^Z</B> takes effect immediately,
+and has the additional side effect of causing pending output
+and typeahead to be discarded.
+<P>
+
+There are a number of ways to refer to a job in the shell.
+The character
+<B>%</B>
+
+introduces a job name.  Job number
+<I>n</I>
+
+may be referred to as
+<B>%n</B>.
+
+A job may also be referred to using a prefix of the name used to
+start it, or using a substring that appears in its command line.
+For example,
+<B>%ce</B>
+
+refers to a stopped
+<B>ce</B>
+
+job.  If a prefix matches more than one job,
+<B>bash</B>
+
+reports an error.  Using
+<B>%?ce</B>,
+
+on the other hand, refers to any job containing the string
+<B>ce</B>
+
+in its command line.  If the substring matches more than one job,
+<B>bash</B>
+
+reports an error.  The symbols
+<B>%%</B>
+
+and
+<B>%+</B>
+
+refer to the shell's notion of the
+<I>current job</I>,
+
+which is the last job stopped while it was in
+the foreground or started in the background.
+The 
+<I>previous job</I>
+
+may be referenced using
+<B>%-</B>.
+
+In output pertaining to jobs (e.g., the output of the
+<B>jobs</B>
+
+command), the current job is always flagged with a
+<B>+</B>,
+
+and the previous job with a
+<B>-</B>.
+
+<P>
+
+Simply naming a job can be used to bring it into the
+foreground:
+<B>%1</B>
+
+is a synonym for
+<B>``fg %1''</B>,
+bringing job 1 from the background into the foreground.
+Similarly,
+<B>``%1 &amp;''</B>
+
+resumes job 1 in the background, equivalent to
+<B>``bg %1''</B>.
+<P>
+
+The shell learns immediately whenever a job changes state.
+Normally,
+<B>bash</B>
+
+waits until it is about to print a prompt before reporting
+changes in a job's status so as to not interrupt
+any other output.  If the 
+<B>-b</B>
+
+option to the
+<B>set</B>
+
+builtin command
+is enabled,
+<B>bash</B>
+
+reports such changes immediately.
+Any trap on
+<FONT SIZE=-1><B>SIGCHLD</B>
+
+</FONT>
+is executed for each child that exits.
+<P>
+
+If an attempt to exit
+<B>bash</B>
+
+is made while jobs are stopped, the shell prints a warning message.  The
+<B>jobs</B>
+
+command may then be used to inspect their status.
+If a second attempt to exit is made without an intervening command,
+the shell does not print another warning, and the stopped
+jobs are terminated.
+<A NAME="lbCC">&nbsp;</A>
+<H2>PROMPTING</H2>
+
+When executing interactively, 
+<B>bash</B>
+
+displays the primary prompt
+<FONT SIZE=-1><B>PS1</B>
+
+</FONT>
+when it is ready to read a command, and the secondary prompt
+<FONT SIZE=-1><B>PS2</B>
+
+</FONT>
+when it needs more input to complete a command.
+<B>Bash</B>
+
+allows these prompt strings to be customized by inserting a number of
+backslash-escaped special characters that are decoded as follows:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>\a</B>
+
+<DD>
+an ASCII bell character (07)
+<DT><B>\d</B>
+
+<DD>
+the date in &quot;Weekday Month Date&quot; format (e.g., &quot;Tue May 26&quot;)
+<DT><B>\D{</B><I>format</I>}
+
+<DD>
+the <I>format</I> is passed to <I>strftime</I>(3) and the result is inserted
+into the prompt string; an empty <I>format</I> results in a locale-specific
+time representation.  The braces are required
+<DT><B>\e</B>
+
+<DD>
+an ASCII escape character (033)
+<DT><B>\h</B>
+
+<DD>
+the hostname up to the first `.'
+<DT><B>\H</B>
+
+<DD>
+the hostname
+<DT><B>\j</B>
+
+<DD>
+the number of jobs currently managed by the shell
+<DT><B>\l</B>
+
+<DD>
+the basename of the shell's terminal device name
+<DT><B>\n</B>
+
+<DD>
+newline
+<DT><B>\r</B>
+
+<DD>
+carriage return
+<DT><B>\s</B>
+
+<DD>
+the name of the shell, the basename of
+<B>$0</B>
+
+(the portion following the final slash)
+<DT><B>\t</B>
+
+<DD>
+the current time in 24-hour HH:MM:SS format
+<DT><B>\T</B>
+
+<DD>
+the current time in 12-hour HH:MM:SS format
+<DT><B>\@</B>
+
+<DD>
+the current time in 12-hour am/pm format
+<DT><B>\A</B>
+
+<DD>
+the current time in 24-hour HH:MM format
+<DT><B>\u</B>
+
+<DD>
+the username of the current user
+<DT><B>\v</B>
+
+<DD>
+the version of <B>bash</B> (e.g., 2.00)
+<DT><B>\V</B>
+
+<DD>
+the release of <B>bash</B>, version + patchelvel (e.g., 2.00.0)
+<DT><B>\w</B>
+
+<DD>
+the current working directory
+<DT><B>\W</B>
+
+<DD>
+the basename of the current working directory
+<DT><B>\!</B>
+
+<DD>
+the history number of this command
+<DT><B>\#</B>
+
+<DD>
+the command number of this command
+<DT><B>\$</B>
+
+<DD>
+if the effective UID is 0, a
+<B>#</B>,
+
+otherwise a
+<B>$</B>
+
+<DT><B>\</B><I>nnn</I>
+
+<DD>
+the character corresponding to the octal number <I>nnn</I>
+<DT><B>\\</B>
+
+<DD>
+a backslash
+<DT><B>\[</B>
+
+<DD>
+begin a sequence of non-printing characters, which could be used to
+embed a terminal control sequence into the prompt
+<DT><B>\]</B>
+
+<DD>
+end a sequence of non-printing characters
+
+</DL></DL>
+
+<P>
+
+The command number and the history number are usually different:
+the history number of a command is its position in the history
+list, which may include commands restored from the history file
+(see
+<FONT SIZE=-1><B>HISTORY</B>
+
+</FONT>
+below), while the command number is the position in the sequence
+of commands executed during the current shell session.
+After the string is decoded, it is expanded via
+parameter expansion, command substitution, arithmetic
+expansion, and quote removal, subject to the value of the
+<B>promptvars</B>
+
+shell option (see the description of the
+<B>shopt</B>
+
+command under
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<A NAME="lbCD">&nbsp;</A>
+<H2>READLINE</H2>
+
+This is the library that handles reading input when using an interactive
+shell, unless the
+<B>--noediting</B>
+
+option is given at shell invocation.
+By default, the line editing commands are similar to those of emacs.
+A vi-style line editing interface is also available.
+To turn off line editing after the shell is running, use the
+<B>+o emacs</B>
+
+or
+<B>+o vi</B>
+
+options to the
+<B>set</B>
+
+builtin (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<A NAME="lbCE">&nbsp;</A>
+<H3>Readline Notation</H3>
+
+<P>
+
+In this section, the emacs-style notation is used to denote
+keystrokes.  Control keys are denoted by C-<I>key</I>, e.g., C-n
+means Control-N.  Similarly, 
+<I>meta</I>
+
+keys are denoted by M-<I>key</I>, so M-x means Meta-X.  (On keyboards
+without a 
+<I>meta</I>
+
+key, M-<I>x</I> means ESC <I>x</I>, i.e., press the Escape key
+then the
+<I>x</I>
+
+key.  This makes ESC the <I>meta prefix</I>.
+The combination M-C-<I>x</I> means ESC-Control-<I>x</I>,
+or press the Escape key
+then hold the Control key while pressing the
+<I>x</I>
+
+key.)
+<P>
+
+Readline commands may be given numeric
+<I>arguments</I>,
+
+which normally act as a repeat count.
+Sometimes, however, it is the sign of the argument that is significant.
+Passing a negative argument to a command that acts in the forward
+direction (e.g., <B>kill-line</B>) causes that command to act in a
+backward direction. 
+Commands whose behavior with arguments deviates from this are noted
+below.
+<P>
+
+When a command is described as <I>killing</I> text, the text
+deleted is saved for possible future retrieval
+(<I>yanking</I>).  The killed text is saved in a
+<I>kill ring</I>.  Consecutive kills cause the text to be
+accumulated into one unit, which can be yanked all at once. 
+Commands which do not kill text separate the chunks of text
+on the kill ring.
+<A NAME="lbCF">&nbsp;</A>
+<H3>Readline Initialization</H3>
+
+<P>
+
+Readline is customized by putting commands in an initialization
+file (the <I>inputrc</I> file).
+The name of this file is taken from the value of the
+<FONT SIZE=-1><B>INPUTRC</B>
+
+</FONT>
+variable.  If that variable is unset, the default is
+<A HREF="file:~/.inputrc"><I>~/.inputrc</I></A>.
+
+When a program which uses the readline library starts up, the
+initialization file is read, and the key bindings and variables
+are set.
+There are only a few basic constructs allowed in the
+readline initialization file.
+Blank lines are ignored.
+Lines beginning with a <B>#</B> are comments.
+Lines beginning with a <B>$</B> indicate conditional constructs.
+Other lines denote key bindings and variable settings.
+<P>
+
+The default key-bindings may be changed with an
+<I>inputrc </I>
+
+file.
+Other programs that use this library may add their own commands
+and bindings.
+<P>
+
+For example, placing
+<DL COMPACT><DT><DD>
+<P>
+
+M-Control-u: universal-argument
+</DL>
+
+or
+<DL COMPACT><DT><DD>
+C-Meta-u: universal-argument
+</DL>
+
+into the 
+<I>inputrc</I>
+
+would make M-C-u execute the readline command
+<I>universal-argument</I>.
+
+<P>
+
+The following symbolic character names are recognized:
+<I>RUBOUT</I>,
+
+<I>DEL</I>,
+
+<I>ESC</I>,
+
+<I>LFD</I>,
+
+<I>NEWLINE</I>,
+
+<I>RET</I>,
+
+<I>RETURN</I>,
+
+<I>SPC</I>,
+
+<I>SPACE</I>,
+
+and
+<I>TAB</I>.
+
+<P>
+
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a <I>macro</I>).
+<A NAME="lbCG">&nbsp;</A>
+<H3>Readline Key Bindings</H3>
+
+<P>
+
+The syntax for controlling key bindings in the
+<I>inputrc</I>
+
+file is simple.  All that is required is the name of the
+command or the text of a macro and a key sequence to which
+it should be bound. The name may be specified in one of two ways:
+as a symbolic key name, possibly with <I>Meta-</I> or <I>Control-</I>
+prefixes, or as a key sequence.
+<P>
+
+When using the form <B>keyname</B>:<I>function-name</I> or <I>macro</I>,
+<I>keyname</I>
+
+is the name of a key spelled out in English.  For example:
+<P>
+<DL COMPACT><DT><DD>
+Control-u: universal-argument
+<BR>
+
+Meta-Rubout: backward-kill-word
+<BR>
+
+Control-o: &quot;&gt; output&quot;
+</DL>
+
+<P>
+
+In the above example,
+<I>C-u</I>
+
+is bound to the function
+<B>universal-argument</B>,
+
+<I>M-DEL</I>
+
+is bound to the function
+<B>backward-kill-word</B>,
+
+and
+<I>C-o</I>
+
+is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+<TT>&gt; output</TT>
+
+into the line).
+<P>
+
+In the second form, <B>&quot;keyseq&quot;</B>:<I>function-name</I> or <I>macro</I>,
+<B>keyseq</B>
+
+differs from
+<B>keyname</B>
+
+above in that strings denoting
+an entire key sequence may be specified by placing the sequence
+within double quotes.  Some GNU Emacs style key escapes can be
+used, as in the following example, but the symbolic character names
+are not recognized.
+<P>
+<DL COMPACT><DT><DD>
+&quot;\C-u&quot;: universal-argument
+<BR>
+
+&quot;\C-x\C-r&quot;: re-read-init-file
+<BR>
+
+&quot;\e[11~&quot;: &quot;Function Key 1&quot;
+</DL>
+
+<P>
+
+In this example,
+<I>C-u</I>
+
+is again bound to the function
+<B>universal-argument</B>.
+
+<I>C-x C-r</I>
+
+is bound to the function
+<B>re-read-init-file</B>,
+
+and 
+<I>ESC [ 1 1 ~</I>
+
+is bound to insert the text
+<TT>Function Key 1</TT>.
+
+<P>
+
+The full set of GNU Emacs style escape sequences is
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>\C-</B>
+
+<DD>
+control prefix
+<DT><B>\M-</B>
+
+<DD>
+meta prefix
+<DT><B>\e</B>
+
+<DD>
+an escape character
+<DT><B>\\</B>
+
+<DD>
+backslash
+<DT><B>\</B>
+
+<DD>
+literal &quot;
+<DT><B>\'</B>
+
+<DD>
+literal '
+</DL></DL>
+
+
+<P>
+
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>\a</B>
+
+<DD>
+alert (bell)
+<DT><B>\b</B>
+
+<DD>
+backspace
+<DT><B>\d</B>
+
+<DD>
+delete
+<DT><B>\f</B>
+
+<DD>
+form feed
+<DT><B>\n</B>
+
+<DD>
+newline
+<DT><B>\r</B>
+
+<DD>
+carriage return
+<DT><B>\t</B>
+
+<DD>
+horizontal tab
+<DT><B>\v</B>
+
+<DD>
+vertical tab
+<DT><B>\</B><I>nnn</I>
+
+<DD>
+the eight-bit character whose value is the octal value <I>nnn</I>
+(one to three digits)
+<DT><B>\x</B><I>HH</I>
+
+<DD>
+the eight-bit character whose value is the hexadecimal value <I>HH</I>
+(one or two hex digits)
+</DL></DL>
+
+
+<P>
+
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including &quot; and '.
+<P>
+
+<B>Bash</B>
+
+allows the current readline key bindings to be displayed or modified
+with the
+<B>bind</B>
+
+builtin command.  The editing mode may be switched during interactive
+use by using the
+<B>-o</B>
+
+option to the
+<B>set</B>
+
+builtin command (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).
+<A NAME="lbCH">&nbsp;</A>
+<H3>Readline Variables</H3>
+
+<P>
+
+Readline has variables that can be used to further customize its
+behavior.  A variable may be set in the
+<I>inputrc</I>
+
+file with a statement of the form
+<DL COMPACT><DT><DD>
+<P>
+
+<B>set</B> <I>variable-name</I> <I>value</I>
+</DL>
+
+<P>
+
+Except where noted, readline variables can take the values
+<B>On</B>
+
+or
+<B>Off</B>.
+
+The variables and their default values are:
+<P>
+
+
+<DL COMPACT>
+<DT><B>bell-style (audible)</B>
+
+<DD>
+Controls what happens when readline wants to ring the terminal bell.
+If set to <B>none</B>, readline never rings the bell.  If set to
+<B>visible</B>, readline uses a visible bell if one is available.
+If set to <B>audible</B>, readline attempts to ring the terminal's bell.
+<DT><B>comment-begin (``#'')</B>
+
+<DD>
+The string that is inserted when the readline
+<B>insert-comment</B>
+
+command is executed.
+This command is bound to
+<B>M-#</B>
+
+in emacs mode and to
+<B>#</B>
+
+in vi command mode.
+<DT><B>completion-ignore-case (Off)</B>
+
+<DD>
+If set to <B>On</B>, readline performs filename matching and completion
+in a case-insensitive fashion.
+<DT><B>completion-query-items (100)</B>
+
+<DD>
+This determines when the user is queried about viewing
+the number of possible completions
+generated by the <B>possible-completions</B> command.
+It may be set to any integer value greater than or equal to
+zero.  If the number of possible completions is greater than
+or equal to the value of this variable, the user is asked whether
+or not he wishes to view them; otherwise they are simply listed
+on the terminal.
+<DT><B>convert-meta (On)</B>
+
+<DD>
+If set to <B>On</B>, readline will convert characters with the
+eighth bit set to an ASCII key sequence
+by stripping the eighth bit and prefixing an
+escape character (in effect, using escape as the <I>meta prefix</I>).
+<DT><B>disable-completion (Off)</B>
+
+<DD>
+If set to <B>On</B>, readline will inhibit word completion.  Completion
+characters will be inserted into the line as if they had been
+mapped to <B>self-insert</B>.
+<DT><B>editing-mode (emacs)</B>
+
+<DD>
+Controls whether readline begins with a set of key bindings similar
+to <I>emacs</I> or <I>vi</I>.
+<B>editing-mode</B>
+
+can be set to either
+<B>emacs</B>
+
+or
+<B>vi</B>.
+
+<DT><B>enable-keypad (Off)</B>
+
+<DD>
+When set to <B>On</B>, readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.
+<DT><B>expand-tilde (Off)</B>
+
+<DD>
+If set to <B>on</B>, tilde expansion is performed when readline
+attempts word completion.
+<DT><B>history-preserve-point</B>
+
+<DD>
+If set to <B>on</B>, the history code attempts to place point at the
+same location on each history line retrived with <B>previous-history</B>
+or <B>next-history</B>.
+<DT><B>horizontal-scroll-mode (Off)</B>
+
+<DD>
+When set to <B>On</B>, makes readline use a single line for display,
+scrolling the input horizontally on a single screen line when it
+becomes longer than the screen width rather than wrapping to a new line.
+<DT><B>input-meta (Off)</B>
+
+<DD>
+If set to <B>On</B>, readline will enable eight-bit input (that is,
+it will not strip the high bit from the characters it reads),
+regardless of what the terminal claims it can support.  The name
+<B>meta-flag</B>
+
+is a synonym for this variable.
+<DT><B>isearch-terminators (``C-[C-J'')</B>
+
+<DD>
+The string of characters that should terminate an incremental
+search without subsequently executing the character as a command.
+If this variable has not been given a value, the characters
+<I>ESC</I> and <I>C-J</I> will terminate an incremental search.
+<DT><B>keymap (emacs)</B>
+
+<DD>
+Set the current readline keymap.  The set of valid keymap names is
+<I>emacs, emacs-standard, emacs-meta, emacs-ctlx, vi,
+vi-command</I>, and
+<I>vi-insert</I>.
+
+<I>vi</I> is equivalent to <I>vi-command</I>; <I>emacs</I> is
+equivalent to <I>emacs-standard</I>.  The default value is
+<I>emacs</I>;
+
+the value of
+<B>editing-mode</B>
+
+also affects the default keymap.
+<DT><B>mark-directories (On)</B>
+
+<DD>
+If set to <B>On</B>, completed directory names have a slash
+appended.
+<DT><B>mark-modified-lines (Off)</B>
+
+<DD>
+If set to <B>On</B>, history lines that have been modified are displayed
+with a preceding asterisk (<B>*</B>).
+<DT><B>mark-symlinked-directories (Off)</B>
+
+<DD>
+If set to <B>On</B>, completed names which are symbolic links to directories
+have a slash appended (subject to the value of
+<B>mark-directories</B>).
+<DT><B>match-hidden-files (On)</B>
+
+<DD>
+This variable, when set to <B>On</B>, causes readline to match files whose
+names begin with a `.' (hidden files) when performing filename 
+completion, unless the leading `.' is
+supplied by the user in the filename to be completed.
+<DT><B>output-meta (Off)</B>
+
+<DD>
+If set to <B>On</B>, readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+<DT><B>page-completions (On)</B>
+
+<DD>
+If set to <B>On</B>, readline uses an internal <I>more</I>-like pager
+to display a screenful of possible completions at a time.
+<DT><B>print-completions-horizontally (Off)</B>
+
+<DD>
+If set to <B>On</B>, readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+<DT><B>show-all-if-ambiguous (Off)</B>
+
+<DD>
+This alters the default behavior of the completion functions.  If
+set to
+<B>on</B>,
+
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+<DT><B>show-all-if-unmodified (Off)</B>
+
+<DD>
+This alters the default behavior of the completion functions in
+a fashion similar to <B>show-all-if-ambiguous</B>.
+If set to
+<B>on</B>,
+
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+<DT><B>visible-stats (Off)</B>
+
+<DD>
+If set to <B>On</B>, a character denoting a file's type as reported
+by <I>stat</I>(2) is appended to the filename when listing possible
+completions.
+
+</DL>
+<A NAME="lbCI">&nbsp;</A>
+<H3>Readline Conditional Constructs</H3>
+
+<P>
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+<DL COMPACT>
+<DT><B>$if</B><DD>
+The 
+<B>$if</B>
+
+construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+<DL COMPACT><DT><DD>
+<DL COMPACT>
+<DT><B>mode</B><DD>
+The <B>mode=</B> form of the <B>$if</B> directive is used to test
+whether readline is in emacs or vi mode.
+This may be used in conjunction
+with the <B>set keymap</B> command, for instance, to set bindings in
+the <I>emacs-standard</I> and <I>emacs-ctlx</I> keymaps only if
+readline is starting out in emacs mode.
+<DT><B>term</B><DD>
+The <B>term=</B> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+<B>=</B>
+
+is tested against the both full name of the terminal and the portion
+of the terminal name before the first <B>-</B>.  This allows
+<I>sun</I>
+
+to match both
+<I>sun</I>
+
+and
+<I>sun-cmd</I>,
+
+for instance.
+<DT><B>application</B><DD>
+The <B>application</B> construct is used to include
+application-specific settings.  Each program using the readline
+library sets the <I>application name</I>, and an initialization
+file can test for a particular value.
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+<P>
+<DL COMPACT><DT><DD>
+<PRE>
+<B>$if</B> Bash
+# Quote the current or previous word
+&quot;\C-xq&quot;: &quot;\eb\&quot;\ef\&quot;&quot;
+<B>$endif</B>
+</PRE>
+
+</DL>
+
+</DL></DL>
+
+<DT><B>$endif</B><DD>
+This command, as seen in the previous example, terminates an
+<B>$if</B> command.
+<DT><B>$else</B><DD>
+Commands in this branch of the <B>$if</B> directive are executed if
+the test fails.
+<DT><B>$include</B><DD>
+This directive takes a single filename as an argument and reads commands
+and bindings from that file.  For example, the following directive
+would read <A HREF="file:/etc/inputrc"><I>/etc/inputrc</I></A>:
+<P>
+<DL COMPACT><DT><DD>
+<PRE>
+<B>$include</B>  <A HREF="file:/etc/inputrc"><I>/etc/inputrc</I></A>
+</PRE>
+
+</DL>
+
+</DL>
+<A NAME="lbCJ">&nbsp;</A>
+<H3>Searching</H3>
+
+<P>
+
+Readline provides commands for searching through the command history
+(see
+<FONT SIZE=-1><B>HISTORY</B>
+
+</FONT>
+below) for lines containing a specified string.
+There are two search modes:
+<I>incremental</I>
+
+and
+<I>non-incremental</I>.
+
+<P>
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+The characters present in the value of the <B>isearch-terminators</B>
+variable are used to terminate an incremental search.
+If that variable has not been assigned a value the Escape and
+Control-J characters will terminate an incremental search.
+Control-G will abort an incremental search and restore the original
+line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+<P>
+
+To find other matching entries in the history list, type Control-S or
+Control-R as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a readline command will terminate
+the search and execute that command.
+For instance, a <I>newline</I> will terminate the search and accept
+the line, thereby executing the command from the history list.
+<P>
+
+Readline remembers the last incremental search string.  If two
+Control-Rs are typed without any intervening characters defining a
+new search string, any remembered search string is used.
+<P>
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+<A NAME="lbCK">&nbsp;</A>
+<H3>Readline Command Names</H3>
+
+<P>
+
+The following is a list of the names of the commands and the default
+key sequences to which they are bound.
+Command names without an accompanying key sequence are unbound by default.
+In the following descriptions, <I>point</I> refers to the current cursor
+position, and <I>mark</I> refers to a cursor position saved by the
+<B>set-mark</B> command.
+The text between the point and mark is referred to as the <I>region</I>.
+<A NAME="lbCL">&nbsp;</A>
+<H3>Commands for Moving</H3>
+
+<P>
+
+
+<DL COMPACT>
+<DT><B>beginning-of-line (C-a)</B>
+
+<DD>
+Move to the start of the current line.
+<DT><B>end-of-line (C-e)</B>
+
+<DD>
+Move to the end of the line.
+<DT><B>forward-char (C-f)</B>
+
+<DD>
+Move forward a character.
+<DT><B>backward-char (C-b)</B>
+
+<DD>
+Move back a character.
+<DT><B>forward-word (M-f)</B>
+
+<DD>
+Move forward to the end of the next word.  Words are composed of
+alphanumeric characters (letters and digits).
+<DT><B>backward-word (M-b)</B>
+
+<DD>
+Move back to the start of the current or previous word.  Words are
+composed of alphanumeric characters (letters and digits).
+<DT><B>clear-screen (C-l)</B>
+
+<DD>
+Clear the screen leaving the current line at the top of the screen.
+With an argument, refresh the current line without clearing the
+screen.
+<DT><B>redraw-current-line</B>
+
+<DD>
+Refresh the current line.
+
+</DL>
+<A NAME="lbCM">&nbsp;</A>
+<H3>Commands for Manipulating the History</H3>
+
+<P>
+
+
+<DL COMPACT>
+<DT><B>accept-line (Newline, Return)</B>
+
+<DD>
+Accept the line regardless of where the cursor is.  If this line is
+non-empty, add it to the history list according to the state of the
+<FONT SIZE=-1><B>HISTCONTROL</B>
+
+</FONT>
+variable.  If the line is a modified history
+line, then restore the history line to its original state.
+<DT><B>previous-history (C-p)</B>
+
+<DD>
+Fetch the previous command from the history list, moving back in
+the list.
+<DT><B>next-history (C-n)</B>
+
+<DD>
+Fetch the next command from the history list, moving forward in the
+list.
+<DT><B>beginning-of-history (M-&lt;)</B>
+
+<DD>
+Move to the first line in the history.
+<DT><B>end-of-history (M-&gt;)</B>
+
+<DD>
+Move to the end of the input history, i.e., the line currently being
+entered.
+<DT><B>reverse-search-history (C-r)</B>
+
+<DD>
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+<DT><B>forward-search-history (C-s)</B>
+
+<DD>
+Search forward starting at the current line and moving `down' through
+the history as necessary.  This is an incremental search.
+<DT><B>non-incremental-reverse-search-history (M-p)</B>
+
+<DD>
+Search backward through the history starting at the current line
+using a non-incremental search for a string supplied by the user.
+<DT><B>non-incremental-forward-search-history (M-n)</B>
+
+<DD>
+Search forward through the history using a non-incremental search for
+a string supplied by the user.
+<DT><B>history-search-forward</B>
+
+<DD>
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+<DT><B>history-search-backward</B>
+
+<DD>
+Search backward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+<DT><B>yank-nth-arg (M-C-y)</B>
+
+<DD>
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument
+<I>n</I>,
+
+insert the <I>n</I>th word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the <I>n</I>th word from the end of the previous command.
+<DT><B>yank-last-arg (M-., M-_)</B>
+
+<DD>
+Insert the last argument to the previous command (the last word of
+the previous history entry).  With an argument,
+behave exactly like <B>yank-nth-arg</B>.
+Successive calls to <B>yank-last-arg</B> move back through the history
+list, inserting the last argument of each line in turn.
+<DT><B>shell-expand-line (M-C-e)</B>
+
+<DD>
+Expand the line as the shell does.  This
+performs alias and history expansion as well as all of the shell
+word expansions.  See
+<FONT SIZE=-1><B>HISTORY EXPANSION</B>
+
+</FONT>
+below for a description of history expansion.
+<DT><B>history-expand-line (M-^)</B>
+
+<DD>
+Perform history expansion on the current line.
+See
+<FONT SIZE=-1><B>HISTORY EXPANSION</B>
+
+</FONT>
+below for a description of history expansion.
+<DT><B>magic-space</B>
+
+<DD>
+Perform history expansion on the current line and insert a space.
+See
+<FONT SIZE=-1><B>HISTORY EXPANSION</B>
+
+</FONT>
+below for a description of history expansion.
+<DT><B>alias-expand-line</B>
+
+<DD>
+Perform alias expansion on the current line.
+See
+<FONT SIZE=-1><B>ALIASES</B>
+
+</FONT>
+above for a description of alias expansion.
+<DT><B>history-and-alias-expand-line</B>
+
+<DD>
+Perform history and alias expansion on the current line.
+<DT><B>insert-last-argument (M-., M-_)</B>
+
+<DD>
+A synonym for <B>yank-last-arg</B>.
+<DT><B>operate-and-get-next (C-o)</B>
+
+<DD>
+Accept the current line for execution and fetch the next line
+relative to the current line from the history for editing.  Any
+argument is ignored.
+<DT><B>edit-and-execute-command (C-xC-e)</B>
+
+<DD>
+Invoke an editor on the current command line, and execute the result as shell
+commands.
+<B>Bash</B> attempts to invoke
+<FONT SIZE=-1><B>$FCEDIT</B>,
+
+</FONT>
+<FONT SIZE=-1><B>$EDITOR</B>,
+
+</FONT>
+and <I>emacs</I> as the editor, in that order.
+
+</DL>
+<A NAME="lbCN">&nbsp;</A>
+<H3>Commands for Changing Text</H3>
+
+<P>
+
+
+<DL COMPACT>
+<DT><B>delete-char (C-d)</B>
+
+<DD>
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to <B>delete-char</B>,
+then return
+<FONT SIZE=-1><B>EOF</B>.
+
+</FONT>
+<DT><B>backward-delete-char (Rubout)</B>
+
+<DD>
+Delete the character behind the cursor.  When given a numeric argument,
+save the deleted text on the kill ring.
+<DT><B>forward-backward-delete-char</B>
+
+<DD>
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.
+<DT><B>quoted-insert (C-q, C-v)</B>
+
+<DD>
+Add the next character typed to the line verbatim.  This is
+how to insert characters like <B>C-q</B>, for example.
+<DT><B>tab-insert (C-v TAB)</B>
+
+<DD>
+Insert a tab character.
+<DT><B>self-insert (a,&nbsp;b,&nbsp;A,&nbsp;1,&nbsp;!,&nbsp;...)</B>
+
+<DD>
+Insert the character typed.
+<DT><B>transpose-chars (C-t)</B>
+
+<DD>
+Drag the character before point forward over the character at point,
+moving point forward as well.
+If point is at the end of the line, then this transposes
+the two characters before point.
+Negative arguments have no effect.
+<DT><B>transpose-words (M-t)</B>
+
+<DD>
+Drag the word before point past the word after point,
+moving point over that word as well.
+If point is at the end of the line, this transposes
+the last two words on the line.   
+<DT><B>upcase-word (M-u)</B>
+
+<DD>
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move point.
+<DT><B>downcase-word (M-l)</B>
+
+<DD>
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move point.
+<DT><B>capitalize-word (M-c)</B>
+
+<DD>
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move point.
+<DT><B>overwrite-mode</B>
+
+<DD>
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+<B>emacs</B> mode; <B>vi</B> mode does overwrite differently.
+Each call to <I>readline()</I> starts in insert mode.
+In overwrite mode, characters bound to <B>self-insert</B> replace   
+the text at point rather than pushing the text to the right.
+Characters bound to <B>backward-delete-char</B> replace the character
+before point with a space.  By default, this command is unbound.
+
+</DL>
+<A NAME="lbCO">&nbsp;</A>
+<H3>Killing and Yanking</H3>
+
+<P>
+
+
+<DL COMPACT>
+<DT><B>kill-line (C-k)</B>
+
+<DD>
+Kill the text from point to the end of the line.
+<DT><B>backward-kill-line (C-x Rubout)</B>
+
+<DD>
+Kill backward to the beginning of the line.
+<DT><B>unix-line-discard (C-u)</B>
+
+<DD>
+Kill backward from point to the beginning of the line.
+The killed text is saved on the kill-ring.
+
+<DT><B>kill-whole-line</B>
+
+<DD>
+Kill all characters on the current line, no matter where point is.
+<DT><B>kill-word  (M-d)</B>
+
+<DD>
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as those used by <B>forward-word</B>.
+<DT><B>backward-kill-word (M-Rubout)</B>
+
+<DD>
+Kill the word behind point.
+Word boundaries are the same as those used by <B>backward-word</B>.
+<DT><B>unix-word-rubout (C-w)</B>
+
+<DD>
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+<DT><B>delete-horizontal-space (M-\)</B>
+
+<DD>
+Delete all spaces and tabs around point.
+<DT><B>kill-region</B>
+
+<DD>
+Kill the text in the current region.
+<DT><B>copy-region-as-kill</B>
+
+<DD>
+Copy the text in the region to the kill buffer.
+<DT><B>copy-backward-word</B>
+
+<DD>
+Copy the word before point to the kill buffer.
+The word boundaries are the same as <B>backward-word</B>.
+<DT><B>copy-forward-word</B>
+
+<DD>
+Copy the word following point to the kill buffer.
+The word boundaries are the same as <B>forward-word</B>.
+<DT><B>yank (C-y)</B>
+
+<DD>
+Yank the top of the kill ring into the buffer at point.
+<DT><B>yank-pop (M-y)</B>
+
+<DD>
+Rotate the kill ring, and yank the new top.  Only works following
+<B>yank</B>
+
+or
+<B>yank-pop</B>.
+
+
+</DL>
+<A NAME="lbCP">&nbsp;</A>
+<H3>Numeric Arguments</H3>
+
+<P>
+
+
+<DL COMPACT>
+<DT><B>digit-argument (M-0, M-1, ..., M--)</B>
+
+<DD>
+Add this digit to the argument already accumulating, or start a new
+argument.  M-- starts a negative argument.
+<DT><B>universal-argument</B>
+
+<DD>
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing
+<B>universal-argument</B>
+
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+
+</DL>
+<A NAME="lbCQ">&nbsp;</A>
+<H3>Completing</H3>
+
+<P>
+
+
+<DL COMPACT>
+<DT><B>complete (TAB)</B>
+
+<DD>
+Attempt to perform completion on the text before point.
+<B>Bash</B>
+
+attempts completion treating the text as a variable (if the
+text begins with <B>$</B>), username (if the text begins with
+<B>~</B>), hostname (if the text begins with <B>@</B>), or
+command (including aliases and functions) in turn.  If none
+of these produces a match, filename completion is attempted.
+<DT><B>possible-completions (M-?)</B>
+
+<DD>
+List the possible completions of the text before point.
+<DT><B>insert-completions (M-*)</B>
+
+<DD>
+Insert all completions of the text before point
+that would have been generated by
+<B>possible-completions</B>.
+<DT><B>menu-complete</B>
+
+<DD>
+Similar to <B>complete</B>, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of <B>menu-complete</B> steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of <B>bell-style</B>)
+and the original text is restored.
+An argument of <I>n</I> moves <I>n</I> positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to <B>TAB</B>, but is unbound
+by default.
+<DT><B>delete-char-or-list</B>
+
+<DD>
+Deletes the character under the cursor if not at the beginning or
+end of the line (like <B>delete-char</B>).
+If at the end of the line, behaves identically to
+<B>possible-completions</B>.
+This command is unbound by default.
+<DT><B>complete-filename (M-/)</B>
+
+<DD>
+Attempt filename completion on the text before point.
+<DT><B>possible-filename-completions (C-x /)</B>
+
+<DD>
+List the possible completions of the text before point,
+treating it as a filename.
+<DT><B>complete-username (M-~)</B>
+
+<DD>
+Attempt completion on the text before point, treating
+it as a username.
+<DT><B>possible-username-completions (C-x ~)</B>
+
+<DD>
+List the possible completions of the text before point,
+treating it as a username.
+<DT><B>complete-variable (M-$)</B>
+
+<DD>
+Attempt completion on the text before point, treating
+it as a shell variable.
+<DT><B>possible-variable-completions (C-x $)</B>
+
+<DD>
+List the possible completions of the text before point,
+treating it as a shell variable.
+<DT><B>complete-hostname (M-@)</B>
+
+<DD>
+Attempt completion on the text before point, treating
+it as a hostname.
+<DT><B>possible-hostname-completions (C-x @)</B>
+
+<DD>
+List the possible completions of the text before point,
+treating it as a hostname.
+<DT><B>complete-command (M-!)</B>
+
+<DD>
+Attempt completion on the text before point, treating
+it as a command name.  Command completion attempts to
+match the text against aliases, reserved words, shell
+functions, shell builtins, and finally executable filenames,
+in that order.
+<DT><B>possible-command-completions (C-x !)</B>
+
+<DD>
+List the possible completions of the text before point,
+treating it as a command name.
+<DT><B>dynamic-complete-history (M-TAB)</B>
+
+<DD>
+Attempt completion on the text before point, comparing
+the text against lines from the history list for possible
+completion matches.
+<DT><B>complete-into-braces (M-{)</B>
+
+<DD>
+Perform filename completion and insert the list of possible completions
+enclosed within braces so the list is available to the shell (see
+<B>Brace Expansion</B>
+
+above).
+
+</DL>
+<A NAME="lbCR">&nbsp;</A>
+<H3>Keyboard Macros</H3>
+
+<P>
+
+
+<DL COMPACT>
+<DT><B>start-kbd-macro (C-x ()</B>
+
+<DD>
+Begin saving the characters typed into the current keyboard macro.
+<DT><B>end-kbd-macro (C-x ))</B>
+
+<DD>
+Stop saving the characters typed into the current keyboard macro
+and store the definition.
+<DT><B>call-last-kbd-macro (C-x e)</B>
+
+<DD>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+
+</DL>
+<A NAME="lbCS">&nbsp;</A>
+<H3>Miscellaneous</H3>
+
+<P>
+
+
+<DL COMPACT>
+<DT><B>re-read-init-file (C-x C-r)</B>
+
+<DD>
+Read in the contents of the <I>inputrc</I> file, and incorporate
+any bindings or variable assignments found there.
+<DT><B>abort (C-g)</B>
+
+<DD>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<B>bell-style</B>).
+
+<DT><B>do-uppercase-version (M-a, M-b, M-</B><I>x</I>, ...)
+
+<DD>
+If the metafied character <I>x</I> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+<DT><B>prefix-meta (ESC)</B>
+
+<DD>
+Metafy the next character typed.
+<FONT SIZE=-1><B>ESC</B>
+
+</FONT>
+<B>f</B>
+
+is equivalent to
+<B>Meta-f</B>.
+
+<DT><B>undo (C-_, C-x C-u)</B>
+
+<DD>
+Incremental undo, separately remembered for each line.
+<DT><B>revert-line (M-r)</B>
+
+<DD>
+Undo all changes made to this line.  This is like executing the
+<B>undo</B>
+
+command enough times to return the line to its initial state.
+<DT><B>tilde-expand (M-&amp;)</B>
+
+<DD>
+Perform tilde expansion on the current word.
+<DT><B>set-mark (C-@, M-&lt;space&gt;)</B>
+
+<DD>
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+<DT><B>exchange-point-and-mark (C-x C-x)</B>
+
+<DD>
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+<DT><B>character-search (C-])</B>
+
+<DD>
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+<DT><B>character-search-backward (M-C-])</B>
+
+<DD>
+A character is read and point is moved to the previous occurrence of that
+character.  A negative count searches for subsequent occurrences.
+<DT><B>insert-comment (M-#)</B>
+
+<DD>
+Without a numeric argument, the value of the readline
+<B>comment-begin</B>
+
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value
+of <B>comment-begin</B>, the value is inserted, otherwise
+the characters in <B>comment-begin</B> are deleted from the beginning of 
+the line.
+In either case, the line is accepted as if a newline had been typed.
+The default value of
+<B>comment-begin</B> causes this command to make the current line
+a shell comment.
+If a numeric argument causes the comment character to be removed, the line
+will be executed by the shell.
+<DT><B>glob-complete-word (M-g)</B>
+
+<DD>
+The word before point is treated as a pattern for pathname expansion,
+with an asterisk implicitly appended.  This pattern is used to
+generate a list of matching file names for possible completions.
+<DT><B>glob-expand-word (C-x *)</B>
+
+<DD>
+The word before point is treated as a pattern for pathname expansion,
+and the list of matching file names is inserted, replacing the word.
+If a numeric argument is supplied, an asterisk is appended before
+pathname expansion.
+<DT><B>glob-list-expansions (C-x g)</B>
+
+<DD>
+The list of expansions that would have been generated by
+<B>glob-expand-word</B>
+
+is displayed, and the line is redrawn.
+If a numeric argument is supplied, an asterisk is appended before
+pathname expansion.
+<DT><B>dump-functions</B>
+
+<DD>
+Print all of the functions and their key bindings to the
+readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <I>inputrc</I> file.
+<DT><B>dump-variables</B>
+
+<DD>
+Print all of the settable readline variables and their values to the
+readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <I>inputrc</I> file.
+<DT><B>dump-macros</B>
+
+<DD>
+Print all of the readline key sequences bound to macros and the
+strings they ouput.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <I>inputrc</I> file.
+<DT><B>display-shell-version (C-x C-v)</B>
+
+<DD>
+Display version information about the current instance of
+<B>bash</B>.
+
+
+</DL>
+<A NAME="lbCT">&nbsp;</A>
+<H3>Programmable Completion</H3>
+
+<P>
+
+When word completion is attempted for an argument to a command for
+which a completion specification (a <I>compspec</I>) has been defined
+using the <B>complete</B> builtin (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below), the programmable completion facilities are invoked.
+<P>
+
+First, the command name is identified.
+If a compspec has been defined for that command, the
+compspec is used to generate the list of possible completions for the word.
+If the command word is a full pathname, a compspec for the full
+pathname is searched for first.
+If no compspec is found for the full pathname, an attempt is made to
+find a compspec for the portion following the final slash.
+<P>
+
+Once a compspec has been found, it is used to generate the list of
+matching words.
+If a compspec is not found, the default <B>bash</B> completion as
+described above under <B>Completing</B> is performed.
+<P>
+
+First, the actions specified by the compspec are used.
+Only matches which are prefixed by the word being completed are
+returned.
+When the
+<B>-f</B>
+
+or
+<B>-d</B>
+
+option is used for filename or directory name completion, the shell
+variable
+<FONT SIZE=-1><B>FIGNORE</B>
+
+</FONT>
+is used to filter the matches.
+<P>
+
+Any completions specified by a filename expansion pattern to the
+<B>-G</B> option are generated next.
+The words generated by the pattern need not match the word
+being completed.
+The
+<FONT SIZE=-1><B>GLOBIGNORE</B>
+
+</FONT>
+shell variable is not used to filter the matches, but the
+<FONT SIZE=-1><B>FIGNORE</B>
+
+</FONT>
+variable is used.
+<P>
+
+Next, the string specified as the argument to the <B>-W</B> option
+is considered.
+The string is first split using the characters in the
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+special variable as delimiters.
+Shell quoting is honored.
+Each word is then expanded using
+brace expansion, tilde expansion, parameter and variable expansion,
+command substitution, arithmetic expansion, and pathname expansion,
+as described above under 
+<FONT SIZE=-1><B>EXPANSION</B>.
+
+</FONT>
+The results are split using the rules described above under
+<B>Word Splitting</B>.
+The results of the expansion are prefix-matched against the word being
+completed, and the matching words become the possible completions.
+<P>
+
+After these matches have been generated, any shell function or command
+specified with the <B>-F</B> and <B>-C</B> options is invoked.
+When the command or function is invoked, the
+<FONT SIZE=-1><B>COMP_LINE</B>
+
+</FONT>
+and
+<FONT SIZE=-1><B>COMP_POINT</B>
+
+</FONT>
+variables are assigned values as described above under
+<B>Shell Variables</B>.
+If a shell function is being invoked, the 
+<FONT SIZE=-1><B>COMP_WORDS</B>
+
+</FONT>
+and
+<FONT SIZE=-1><B>COMP_CWORD</B>
+
+</FONT>
+variables are also set.
+When the function or command is invoked, the first argument is the
+name of the command whose arguments are being completed, the
+second argument is the word being completed, and the third argument
+is the word preceding the word being completed on the current command line.
+No filtering of the generated completions against the word being completed
+is performed; the function or command has complete freedom in generating
+the matches.
+<P>
+
+Any function specified with <B>-F</B> is invoked first.
+The function may use any of the shell facilities, including the
+<B>compgen</B> builtin described below, to generate the matches.
+It must put the possible completions in the
+<FONT SIZE=-1><B>COMPREPLY</B>
+
+</FONT>
+array variable.
+<P>
+
+Next, any command specified with the <B>-C</B> option is invoked
+in an environment equivalent to command substitution.
+It should print a list of completions, one per line, to the
+standard output.
+Backslash may be used to escape a newline, if necessary.
+<P>
+
+After all of the possible completions are generated, any filter
+specified with the <B>-X</B> option is applied to the list.
+The filter is a pattern as used for pathname expansion; a <B>&amp;</B>
+in the pattern is replaced with the text of the word being completed.
+A literal <B>&amp;</B> may be escaped with a backslash; the backslash
+is removed before attempting a match.
+Any completion that matches the pattern will be removed from the list.
+A leading <B>!</B> negates the pattern; in this case any completion
+not matching the pattern will be removed.
+<P>
+
+Finally, any prefix and suffix specified with the <B>-P</B> and <B>-S</B>
+options are added to each member of the completion list, and the result is
+returned to the readline completion code as the list of possible
+completions.
+<P>
+
+If the previously-applied actions do not generate any matches, and the
+<B>-o dirnames</B> option was supplied to <B>complete</B> when the
+compspec was defined, directory name completion is attempted.
+<P>
+
+If the <B>-o plusdirs</B> option was supplied to <B>complete</B> when the
+compspec was defined, directory name completion is attempted and any
+matches are added to the results of the other actions.
+<P>
+
+By default, if a compspec is found, whatever it generates is returned
+to the completion code as the full set of possible completions.
+The default <B>bash</B> completions are not attempted, and the readline
+default of filename completion is disabled.
+If the <B>-o bashdefault</B> option was supplied to <B>complete</B> when
+the compspec was defined, the <B>bash</B> default completions are attempted
+if the compspec generates no matches.
+If the <B>-o default</B> option was supplied to <B>complete</B> when the
+compspec was defined, readline's default completion will be performed
+if the compspec (and, if attempted, the default <B>bash</B> completions)
+generate no matches.
+<P>
+
+When a compspec indicates that directory name completion is desired,
+the programmable completion functions force readline to append a slash
+to completed names which are symbolic links to directories, subject to  
+the value of the <B>mark-directories</B> readline variable, regardless
+of the setting of the <B>mark-symlinked-directories</B> readline variable.
+<A NAME="lbCU">&nbsp;</A>
+<H2>HISTORY</H2>
+
+When the
+<B>-o history</B>
+
+option to the
+<B>set</B>
+
+builtin is enabled, the shell provides access to the
+<I>command history</I>,
+the list of commands previously typed.
+The value of the <B>HISTSIZE</B> variable is used as the
+number of commands to save in a history list.
+The text of the last
+<FONT SIZE=-1><B>HISTSIZE</B>
+
+</FONT>
+commands (default 500) is saved.  The shell
+stores each command in the history list prior to parameter and
+variable expansion (see
+<FONT SIZE=-1><B>EXPANSION</B>
+
+</FONT>
+above) but after history expansion is performed, subject to the
+values of the shell variables
+<FONT SIZE=-1><B>HISTIGNORE</B>
+
+</FONT>
+and
+<FONT SIZE=-1><B>HISTCONTROL</B>.
+
+</FONT>
+<P>
+
+On startup, the history is initialized from the file named by
+the variable
+<FONT SIZE=-1><B>HISTFILE</B>
+
+</FONT>
+(default <A HREF="file:~/.bash_history"><I>~/.bash_history</I></A>).
+The file named by the value of
+<FONT SIZE=-1><B>HISTFILE</B>
+
+</FONT>
+is truncated, if necessary, to contain no more than
+the number of lines specified by the value of
+<FONT SIZE=-1><B>HISTFILESIZE</B>.
+
+</FONT>
+When an interactive shell exits, the last
+<FONT SIZE=-1><B>$HISTSIZE</B>
+
+</FONT>
+lines are copied from the history list to
+<FONT SIZE=-1><B>$HISTFILE</B>.
+
+</FONT>
+If the
+<B>histappend</B>
+
+shell option is enabled
+(see the description of
+<B>shopt</B>
+
+under
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below), the lines are appended to the history file,
+otherwise the history file is overwritten.
+If
+<FONT SIZE=-1><B>HISTFILE</B>
+
+</FONT>
+is unset, or if the history file is unwritable, the history is
+not saved.  After saving the history, the history file is truncated
+to contain no more than
+<FONT SIZE=-1><B>HISTFILESIZE</B>
+
+</FONT>
+lines.  If
+<FONT SIZE=-1><B>HISTFILESIZE</B>
+
+</FONT>
+is not set, no truncation is performed.
+<P>
+
+The builtin command
+<B>fc</B>
+
+(see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below) may be used to list or edit and re-execute a portion of
+the history list.
+The
+<B>history</B>
+
+builtin may be used to display or modify the history list and
+manipulate the history file.
+When using command-line editing, search commands
+are available in each editing mode that provide access to the
+history list.
+<P>
+
+The shell allows control over which commands are saved on the history
+list.  The
+<FONT SIZE=-1><B>HISTCONTROL</B>
+
+</FONT>
+and
+<FONT SIZE=-1><B>HISTIGNORE</B>
+
+</FONT>
+variables may be set to cause the shell to save only a subset of the
+commands entered.
+The
+<B>cmdhist</B>
+
+shell option, if enabled, causes the shell to attempt to save each
+line of a multi-line command in the same history entry, adding
+semicolons where necessary to preserve syntactic correctness.
+The
+<B>lithist</B>
+
+shell option causes the shell to save the command with embedded newlines
+instead of semicolons.  See the description of the
+<B>shopt</B>
+
+builtin below under
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+for information on setting and unsetting shell options.
+<A NAME="lbCV">&nbsp;</A>
+<H2>HISTORY EXPANSION</H2>
+
+<P>
+
+The shell supports a history expansion feature that
+is similar to the history expansion in
+<B>csh.</B>
+
+This section describes what syntax features are available.  This
+feature is enabled by default for interactive shells, and can be
+disabled using the
+<B>+H</B>
+
+option to the
+<B>set</B>
+
+builtin command (see
+<FONT SIZE=-1><B>SHELL BUILTIN COMMANDS</B>
+
+</FONT>
+below).  Non-interactive shells do not perform history expansion
+by default.
+<P>
+
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+<P>
+
+History expansion is performed immediately after a complete line
+is read, before the shell breaks it into words.
+It takes place in two parts.
+The first is to determine which line from the history list
+to use during substitution.
+The second is to select portions of that line for inclusion into
+the current one.
+The line selected from the history is the <I>event</I>,
+and the portions of that line that are acted upon are <I>words</I>.
+Various <I>modifiers</I> are available to manipulate the selected words.
+The line is broken into words in the same fashion as when reading input,
+so that several <I>metacharacter</I>-separated words surrounded by
+quotes are considered one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is <B>!</B> by default.
+Only backslash (<B>\</B>) and single quotes can quote
+the history expansion character.
+<P>
+
+Several characters inhibit history expansion if found immediately
+following the history expansion character, even if it is unquoted:
+space, tab, newline, carriage return, and <B>=</B>.
+If the <B>extglob</B> shell option is enabled, <B>(</B> will also
+inhibit expansion.
+<P>
+
+Several shell options settable with the
+<B>shopt</B>
+
+builtin may be used to tailor the behavior of history expansion.
+If the
+<B>histverify</B>
+
+shell option is enabled (see the description of the
+<B>shopt</B>
+
+builtin), and
+<B>readline</B>
+
+is being used, history substitutions are not immediately passed to
+the shell parser.
+Instead, the expanded line is reloaded into the
+<B>readline</B>
+
+editing buffer for further modification.
+If
+<B>readline</B>
+
+is being used, and the
+<B>histreedit</B>
+
+shell option is enabled, a failed history substitution will be reloaded
+into the
+<B>readline</B>
+
+editing buffer for correction.
+The
+<B>-p</B>
+
+option to the
+<B>history</B>
+
+builtin command may be used to see what a history expansion will
+do before using it.
+The
+<B>-s</B>
+
+option to the
+<B>history</B>
+
+builtin may be used to add commands to the end of the history list
+without actually executing them, so that they are available for
+subsequent recall.
+<P>
+
+The shell allows control of the various characters used by the
+history expansion mechanism (see the description of
+<B>histchars</B>
+
+above under
+<B>Shell Variables</B>).
+
+<A NAME="lbCW">&nbsp;</A>
+<H3>Event Designators</H3>
+
+<P>
+
+An event designator is a reference to a command line entry in the
+history list.
+<P>
+
+
+<DL COMPACT>
+<DT><B>!</B>
+
+<DD>
+Start a history substitution, except when followed by a
+<B>blank</B>,
+
+newline, carriage return, =
+or ( (when the <B>extglob</B> shell option is enabled using
+the <B>shopt</B> builtin).
+<DT><B>!</B><I>n</I>
+
+<DD>
+Refer to command line
+<I>n</I>.
+
+<DT><B>!-</B><I>n</I>
+
+<DD>
+Refer to the current command line minus
+<I>n</I>.
+
+<DT><B>!!</B>
+
+<DD>
+Refer to the previous command.  This is a synonym for `!-1'.
+<DT><B>!</B><I>string</I>
+
+<DD>
+Refer to the most recent command starting with 
+<I>string</I>.
+
+<DT><B>!?</B><I>string</I><B>[?]</B>
+
+<DD>
+Refer to the most recent command containing
+<I>string</I>.
+
+The trailing <B>?</B> may be omitted if
+<I>string</I>
+
+is followed immediately by a newline.
+<DT><B></B><FONT SIZE=+2><B>^</B></FONT><B></B><I>string1</I><FONT SIZE=+2>^</FONT><I>string2</I><FONT SIZE=+2>^</FONT>
+
+<DD>
+Quick substitution.  Repeat the last command, replacing
+<I>string1</I>
+
+with
+<I>string2</I>.
+
+Equivalent to
+``!!:s/<I>string1</I>/<I>string2</I>/''
+(see <B>Modifiers</B> below).
+<DT><B>!#</B>
+
+<DD>
+The entire command line typed so far.
+
+</DL>
+<A NAME="lbCX">&nbsp;</A>
+<H3>Word Designators</H3>
+
+<P>
+
+Word designators are used to select desired words from the event.
+A 
+<B>:</B>
+
+separates the event specification from the word designator.
+It may be omitted if the word designator begins with a
+<B>^</B>,
+
+<B>$</B>,
+
+<B>*</B>,
+
+<B>-</B>,
+
+or
+<B>%</B>.
+
+Words are numbered from the beginning of the line,
+with the first word being denoted by 0 (zero).
+Words are inserted into the current line separated by single spaces.
+<P>
+
+
+<DL COMPACT>
+<DT><B>0 (zero)</B>
+
+<DD>
+The zeroth word.  For the shell, this is the command
+word.
+<DT><I>n</I>
+
+<DD>
+The <I>n</I>th word.
+<DT><B>^</B>
+
+<DD>
+The first argument.  That is, word 1.
+<DT><B>$</B>
+
+<DD>
+The last argument.
+<DT><B>%</B>
+
+<DD>
+The word matched by the most recent `?<I>string</I>?' search.
+<DT><I>x</I><B>-</B>y
+
+<DD>
+A range of words; `-<I>y</I>' abbreviates `0-<I>y</I>'.
+<DT><B>*</B>
+
+<DD>
+All of the words but the zeroth.  This is a synonym
+for `<I>1-$</I>'.  It is not an error to use
+<B>*</B>
+
+if there is just one
+word in the event; the empty string is returned in that case.
+<DT><B>x*</B>
+
+<DD>
+Abbreviates <I>x-$</I>.
+<DT><B>x-</B>
+
+<DD>
+Abbreviates <I>x-$</I> like <B>x*</B>, but omits the last word.
+
+</DL>
+<P>
+
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+<A NAME="lbCY">&nbsp;</A>
+<H3>Modifiers</H3>
+
+<P>
+
+After the optional word designator, there may appear a sequence of
+one or more of the following modifiers, each preceded by a `:'.
+<P>
+
+
+<P>
+
+<DL COMPACT>
+<DT><B>h</B>
+
+<DD>
+Remove a trailing file name component, leaving only the head.
+<DT><B>t</B>
+
+<DD>
+Remove all leading file name components, leaving the tail.
+<DT><B>r</B>
+
+<DD>
+Remove a trailing suffix of the form <I>.xxx</I>, leaving the
+basename.
+<DT><B>e</B>
+
+<DD>
+Remove all but the trailing suffix.
+<DT><B>p</B>
+
+<DD>
+Print the new command but do not execute it.
+<DT><B>q</B>
+
+<DD>
+Quote the substituted words, escaping further substitutions.
+<DT><B>x</B>
+
+<DD>
+Quote the substituted words as with
+<B>q</B>,
+
+but break into words at
+<B>blanks</B>
+
+and newlines.
+<DT><B>s/</B><I>old</I>/<I>new</I>/
+
+<DD>
+Substitute
+<I>new</I>
+
+for the first occurrence of
+<I>old</I>
+
+in the event line.  Any delimiter can be used in place of /.  The
+final delimiter is optional if it is the last character of the
+event line.  The delimiter may be quoted in
+<I>old</I>
+
+and
+<I>new</I>
+
+with a single backslash.  If &amp; appears in
+<I>new</I>,
+
+it is replaced by
+<I>old</I>.
+
+A single backslash will quote the &amp;.  If
+<I>old</I>
+
+is null, it is set to the last
+<I>old</I>
+
+substituted, or, if no previous history substitutions took place,
+the last
+<I>string</I>
+
+in a
+<B>!?</B><I>string</I><B>[?]</B>
+
+search.
+<DT><B>&amp;</B>
+
+<DD>
+Repeat the previous substitution.
+<DT><B>g</B>
+
+<DD>
+Cause changes to be applied over the entire event line.  This is
+used in conjunction with `<B>:s</B>' (e.g., `<B>:gs/</B><I>old</I>/<I>new</I>/')
+or `<B>:&amp;</B>'.  If used with
+`<B>:s</B>', any delimiter can be used
+in place of /, and the final delimiter is optional
+if it is the last character of the event line.
+An <B>a</B> may be used as a synonym for <B>g</B>.
+<DT><B>G</B>
+
+<DD>
+Apply the following `<B>s</B>' modifier once to each word in the event line.
+
+</DL>
+<A NAME="lbCZ">&nbsp;</A>
+<H2>SHELL BUILTIN COMMANDS</H2>
+
+
+
+<P>
+
+Unless otherwise noted, each builtin command documented in this
+section as accepting options preceded by
+<B>-</B>
+
+accepts
+<B>--</B>
+
+to signify the end of the options.
+<P>
+
+<DL COMPACT>
+<DT><B>:</B> [<I>arguments</I>]<DD>
+
+No effect; the command does nothing beyond expanding
+<I>arguments</I>
+
+and performing any specified
+redirections.  A zero exit code is returned.
+<DT><B> . </B> <I>filename</I> [<I>arguments</I>]<DD>
+
+<DT><B>source</B> <I>filename</I> [<I>arguments</I>]<DD>
+
+Read and execute commands from
+<I>filename</I>
+
+in the current
+shell environment and return the exit status of the last command
+executed from
+<I>filename</I>.
+
+If
+<I>filename</I>
+
+does not contain a slash, file names in
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+are used to find the directory containing
+<I>filename</I>.
+
+The file searched for in
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+need not be executable.
+When <B>bash</B> is not in <I>posix mode</I>, the current directory is
+searched if no file is found in
+<FONT SIZE=-1><B>PATH</B>.
+
+</FONT>
+If the
+<B>sourcepath</B>
+
+option to the
+<B>shopt</B>
+
+builtin command is turned off, the
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+is not searched.
+If any <I>arguments</I> are supplied, they become the positional
+parameters when <I>filename</I> is executed.  Otherwise the positional
+parameters are unchanged.
+The return status is the status of the last command exited within
+the script (0 if no commands are executed), and false if
+<I>filename</I>
+
+is not found or cannot be read.
+<DT><B>alias</B> [<B>-p</B>] [<I>name</I>[=<I>value</I>] ...]<DD>
+<B>Alias</B> with no arguments or with the
+<B>-p</B>
+
+option prints the list of aliases in the form
+<B>alias</B> <I>name</I>=<I>value</I> on standard output.
+When arguments are supplied, an alias is defined for
+each <I>name</I> whose <I>value</I> is given.
+A trailing space in  <I>value</I> causes the next word to be
+checked for alias substitution when the alias is expanded.
+For each <I>name</I> in the argument list for which no <I>value</I>
+is supplied, the name and value of the alias is printed.
+<B>Alias</B> returns true unless a <I>name</I> is given for which
+no alias has been defined.
+<DT><B>bg</B> [<I>jobspec</I>]<DD>
+Resume the suspended job <I>jobspec</I> in the background, as if it
+had been started with
+<B>&amp;</B>.
+
+If <I>jobspec</I> is not present, the shell's notion of the
+<I>current job</I> is used.
+<B>bg</B>
+
+<I>jobspec</I>
+
+returns 0 unless run when job control is disabled or, when run with
+job control enabled, if <I>jobspec</I> was not found or started without
+job control.
+<DT><B>bind</B> [<B>-m</B> <I>keymap</I>] [<B>-lpsvPSV</B>]<DD>
+
+<DT><B>bind</B> [<B>-m</B> <I>keymap</I>] [<B>-q</B> <I>function</I>] [<B>-u</B> <I>function</I>] [<B>-r</B> <I>keyseq</I>]<DD>
+<DT><B>bind</B> [<B>-m</B> <I>keymap</I>] <B>-f</B> <I>filename</I><DD>
+<DT><B>bind</B> [<B>-m</B> <I>keymap</I>] <B>-x</B> <I>keyseq</I>:<I>shell-command</I><DD>
+<DT><B>bind</B> [<B>-m</B> <I>keymap</I>] <I>keyseq</I>:<I>function-name</I><DD>
+<DT><B>bind</B> <I>readline-command</I><DD>
+
+Display current
+<B>readline</B>
+
+key and function bindings, bind a key sequence to a
+<B>readline</B>
+
+function or macro, or set a
+<B>readline</B>
+
+variable.
+Each non-option argument is a command as it would appear in
+<I>.inputrc</I>,
+
+but each binding or command must be passed as a separate argument;
+e.g., '&quot;\C-x\C-r&quot;: re-read-init-file'.
+Options, if supplied, have the following meanings:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-m </B><I>keymap</I>
+
+<DD>
+Use
+<I>keymap</I>
+
+as the keymap to be affected by the subsequent bindings.
+Acceptable
+<I>keymap</I>
+
+names are
+<I>emacs, emacs-standard, emacs-meta, emacs-ctlx, vi,
+vi-move, vi-command</I>, and
+<I>vi-insert</I>.
+
+<I>vi</I> is equivalent to <I>vi-command</I>; <I>emacs</I> is
+equivalent to <I>emacs-standard</I>.
+<DT><B>-l</B>
+
+<DD>
+List the names of all <B>readline</B> functions.
+<DT><B>-p</B>
+
+<DD>
+Display <B>readline</B> function names and bindings in such a way
+that they can be re-read.
+<DT><B>-P</B>
+
+<DD>
+List current <B>readline</B> function names and bindings.
+<DT><B>-v</B>
+
+<DD>
+Display <B>readline</B> variable names and values in such a way that they
+can be re-read.
+<DT><B>-V</B>
+
+<DD>
+List current <B>readline</B> variable names and values.
+<DT><B>-s</B>
+
+<DD>
+Display <B>readline</B> key sequences bound to macros and the strings
+they output in such a way that they can be re-read.
+<DT><B>-S</B>
+
+<DD>
+Display <B>readline</B> key sequences bound to macros and the strings
+they output.
+<DT><B>-f </B><I>filename</I>
+
+<DD>
+Read key bindings from <I>filename</I>.
+<DT><B>-q </B><I>function</I>
+
+<DD>
+Query about which keys invoke the named <I>function</I>.
+<DT><B>-u </B><I>function</I>
+
+<DD>
+Unbind all keys bound to the named <I>function</I>.
+<DT><B>-r </B><I>keyseq</I>
+
+<DD>
+Remove any current binding for <I>keyseq</I>.
+<DT><B>-x </B><I>keyseq</I>:<I>shell-command</I>
+
+<DD>
+Cause <I>shell-command</I> to be executed whenever <I>keyseq</I> is
+entered.
+
+</DL>
+<P>
+
+The return value is 0 unless an unrecognized option is given or an
+error occurred.
+</DL>
+
+<DT><B>break</B> [<I>n</I>]<DD>
+Exit from within a
+<B>for</B>,
+
+<B>while</B>,
+
+<B>until</B>,
+
+or
+<B>select</B>
+
+loop.  If <I>n</I> is specified, break <I>n</I> levels.
+<I>n</I>
+
+must be >= 1.  If
+<I>n</I>
+
+is greater than the number of enclosing loops, all enclosing loops
+are exited.  The return value is 0 unless the shell is not executing
+a loop when
+<B>break</B>
+
+is executed.
+<DT><B>builtin</B> <I>shell-builtin</I> [<I>arguments</I>]<DD>
+Execute the specified shell builtin, passing it
+<I>arguments</I>,
+
+and return its exit status.
+This is useful when defining a
+function whose name is the same as a shell builtin,
+retaining the functionality of the builtin within the function.
+The <B>cd</B> builtin is commonly redefined this way.
+The return status is false if
+<I>shell-builtin</I>
+
+is not a shell builtin command.
+<DT><B>cd</B> [<B>-L|-P</B>] [<I>dir</I>]<DD>
+Change the current directory to <I>dir</I>.  The variable
+<FONT SIZE=-1><B>HOME</B>
+
+</FONT>
+is the
+default
+<I>dir</I>.
+
+The variable
+<FONT SIZE=-1><B>CDPATH</B>
+
+</FONT>
+defines the search path for the directory containing
+<I>dir</I>.
+
+Alternative directory names in
+<FONT SIZE=-1><B>CDPATH</B>
+
+</FONT>
+are separated by a colon (:).  A null directory name in
+<FONT SIZE=-1><B>CDPATH</B>
+
+</FONT>
+is the same as the current directory, i.e., ``<B>.</B>''.  If
+<I>dir</I>
+
+begins with a slash (/),
+then
+<FONT SIZE=-1><B>CDPATH</B>
+
+</FONT>
+is not used. The
+<B>-P</B>
+
+option says to use the physical directory structure instead of
+following symbolic links (see also the
+<B>-P</B>
+
+option to the
+<B>set</B>
+
+builtin command); the
+<B>-L</B>
+
+option forces symbolic links to be followed.  An argument of
+<B>-</B>
+
+is equivalent to
+<FONT SIZE=-1><B>$OLDPWD</B>.
+
+</FONT>
+If a non-empty directory name from <B>CDPATH</B> is used, or if
+<B>-</B> is the first argument, and the directory change is
+successful, the absolute pathname of the new working directory is
+written to the standard output.
+The return value is true if the directory was successfully changed;
+false otherwise.
+<DT><B>caller</B> [<I>expr</I>]<DD>
+Returns the context of any active subroutine call (a shell function or
+a script executed with the <B>.</B> or <B>source</B> builtins.
+Without <I>expr</I>, <B>caller</B> displays the line number and source
+filename of the current subroutine call.
+If a non-negative integer is supplied as <I>expr</I>, <B>caller</B> 
+displays the line number, subroutine name, and source file corresponding
+to that position in the current execution call stack.  This extra
+information may be used, for example, to print a stack trace.  The
+current frame is frame 0.
+The return value is 0 unless the shell is not executing a subroutine
+call or <I>expr</I> does not correspond to a valid position in the
+call stack.
+<DT><B>command</B> [<B>-pVv</B>] <I>command</I> [<I>arg</I> ...]<DD>
+Run
+<I>command</I>
+
+with
+<I>args</I>
+
+suppressing the normal shell function lookup. Only builtin
+commands or commands found in the
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+are executed.  If the
+<B>-p</B>
+
+option is given, the search for
+<I>command</I>
+
+is performed using a default value for
+<B>PATH</B>
+
+that is guaranteed to find all of the standard utilities.
+If either the
+<B>-V</B>
+
+or
+<B>-v</B>
+
+option is supplied, a description of
+<I>command</I>
+
+is printed.  The
+<B>-v</B>
+
+option causes a single word indicating the command or file name
+used to invoke
+<I>command</I>
+
+to be displayed; the
+<B>-V</B>
+
+option produces a more verbose description.
+If the
+<B>-V</B>
+
+or
+<B>-v</B>
+
+option is supplied, the exit status is 0 if
+<I>command</I>
+
+was found, and 1 if not.  If neither option is supplied and
+an error occurred or
+<I>command</I>
+
+cannot be found, the exit status is 127.  Otherwise, the exit status of the
+<B>command</B>
+
+builtin is the exit status of
+<I>command</I>.
+
+<DT><B>compgen</B> [<I>option</I>] [<I>word</I>]<DD>
+Generate possible completion matches for <I>word</I> according to
+the <I>option</I>s, which may be any option accepted by the
+<B>complete</B>
+
+builtin with the exception of <B>-p</B> and <B>-r</B>, and write
+the matches to the standard output.
+When using the <B>-F</B> or <B>-C</B> options, the various shell variables
+set by the programmable completion facilities, while available, will not
+have useful values.
+<P>
+The matches will be generated in the same way as if the programmable
+completion code had generated them directly from a completion specification
+with the same flags.
+If <I>word</I> is specified, only those completions matching <I>word</I>
+will be displayed.
+<P>
+The return value is true unless an invalid option is supplied, or no
+matches were generated.
+<DT><B>complete</B> [<B>-abcdefgjksuv</B>] [<B>-o</B> <I>comp-option</I>] [<B>-A</B> <I>action</I>] [<B>-G</B> <I>globpat</I>] [<B>-W</B> <I>wordlist</I>] [<B>-P</B> <I>prefix</I>] [<B>-S</B> <I>suffix</I>]<DD>
+<BR>
+
+[<B>-X</B> <I>filterpat</I>] [<B>-F</B> <I>function</I>] [<B>-C</B> <I>command</I>] <I>name</I> [<I>name ...</I>]
+
+<DT><B>complete</B> <B>-pr</B> [<I>name</I> ...]<DD>
+
+Specify how arguments to each <I>name</I> should be completed.
+If the <B>-p</B> option is supplied, or if no options are supplied,
+existing completion specifications are printed in a way that allows
+them to be reused as input.
+The <B>-r</B> option removes a completion specification for
+each <I>name</I>, or, if no <I>name</I>s are supplied, all
+completion specifications.
+<P>
+The process of applying these completion specifications when word completion
+is attempted is described above under <B>Programmable Completion</B>.
+<P>
+Other options, if specified, have the following meanings.
+The arguments to the <B>-G</B>, <B>-W</B>, and <B>-X</B> options
+(and, if necessary, the <B>-P</B> and <B>-S</B> options)
+should be quoted to protect them from expansion before the
+<B>complete</B>
+
+builtin is invoked.
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-o</B> <I>comp-option</I><DD>
+The <I>comp-option</I> controls several aspects of the compspec's behavior
+beyond the simple generation of completions.
+<I>comp-option</I> may be one of:
+<DL COMPACT><DT><DD>
+<DL COMPACT>
+<DT><B>bashdefault</B>
+
+<DD>
+Perform the rest of the default <B>bash</B> completions if the compspec
+generates no matches.
+<DT><B>default</B>
+
+<DD>
+Use readline's default filename completion if the compspec generates
+no matches.
+<DT><B>dirnames</B>
+
+<DD>
+Perform directory name completion if the compspec generates no matches.
+<DT><B>filenames</B>
+
+<DD>
+Tell readline that the compspec generates filenames, so it can perform any
+filename-specific processing (like adding a slash to directory names or
+suppressing trailing spaces).  Intended to be used with shell functions.
+<DT><B>nospace</B>
+
+<DD>
+Tell readline not to append a space (the default) to words completed at
+the end of the line.
+</DL></DL>
+
+<DT><B>-A</B> <I>action</I><DD>
+The <I>action</I> may be one of the following to generate a list of possible
+completions:
+<DL COMPACT><DT><DD>
+<DL COMPACT>
+<DT><B>alias</B>
+
+<DD>
+Alias names.  May also be specified as <B>-a</B>.
+<DT><B>arrayvar</B>
+
+<DD>
+Array variable names.
+<DT><B>binding</B>
+
+<DD>
+<B>Readline</B> key binding names.
+<DT><B>builtin</B>
+
+<DD>
+Names of shell builtin commands.  May also be specified as <B>-b</B>.
+<DT><B>command</B>
+
+<DD>
+Command names.  May also be specified as <B>-c</B>.
+<DT><B>directory</B>
+
+<DD>
+Directory names.  May also be specified as <B>-d</B>.
+<DT><B>disabled</B>
+
+<DD>
+Names of disabled shell builtins.
+<DT><B>enabled</B>
+
+<DD>
+Names of enabled shell builtins.
+<DT><B>export</B>
+
+<DD>
+Names of exported shell variables.  May also be specified as <B>-e</B>.
+<DT><B>file</B>
+
+<DD>
+File names.  May also be specified as <B>-f</B>.
+<DT><B>function</B>
+
+<DD>
+Names of shell functions.
+<DT><B>group</B>
+
+<DD>
+Group names.  May also be specified as <B>-g</B>.
+<DT><B>helptopic</B>
+
+<DD>
+Help topics as accepted by the <B>help</B> builtin.
+<DT><B>hostname</B>
+
+<DD>
+Hostnames, as taken from the file specified by the
+<FONT SIZE=-1><B>HOSTFILE</B>
+
+</FONT>
+shell variable.
+<DT><B>job</B>
+
+<DD>
+Job names, if job control is active.  May also be specified as <B>-j</B>.
+<DT><B>keyword</B>
+
+<DD>
+Shell reserved words.  May also be specified as <B>-k</B>.
+<DT><B>running</B>
+
+<DD>
+Names of running jobs, if job control is active.
+<DT><B>service</B>
+
+<DD>
+Service names.  May also be specified as <B>-s</B>.
+<DT><B>setopt</B>
+
+<DD>
+Valid arguments for the <B>-o</B> option to the <B>set</B> builtin.
+<DT><B>shopt</B>
+
+<DD>
+Shell option names as accepted by the <B>shopt</B> builtin.
+<DT><B>signal</B>
+
+<DD>
+Signal names.
+<DT><B>stopped</B>
+
+<DD>
+Names of stopped jobs, if job control is active.
+<DT><B>user</B>
+
+<DD>
+User names.  May also be specified as <B>-u</B>.
+<DT><B>variable</B>
+
+<DD>
+Names of all shell variables.  May also be specified as <B>-v</B>.
+</DL></DL>
+
+<DT><B>-G</B> <I>globpat</I><DD>
+The filename expansion pattern <I>globpat</I> is expanded to generate
+the possible completions.
+<DT><B>-W</B> <I>wordlist</I><DD>
+The <I>wordlist</I> is split using the characters in the
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+special variable as delimiters, and each resultant word is expanded.
+The possible completions are the members of the resultant list which
+match the word being completed.
+<DT><B>-C</B> <I>command</I><DD>
+<I>command</I> is executed in a subshell environment, and its output is
+used as the possible completions.
+<DT><B>-F</B> <I>function</I><DD>
+The shell function <I>function</I> is executed in the current shell
+environment.
+When it finishes, the possible completions are retrieved from the value
+of the
+<FONT SIZE=-1><B>COMPREPLY</B>
+
+</FONT>
+array variable.
+<DT><B>-X</B> <I>filterpat</I><DD>
+<I>filterpat</I> is a pattern as used for filename expansion.
+It is applied to the list of possible completions generated by the
+preceding options and arguments, and each completion matching
+<I>filterpat</I> is removed from the list.
+A leading <B>!</B> in <I>filterpat</I> negates the pattern; in this
+case, any completion not matching <I>filterpat</I> is removed.
+<DT><B>-P</B> <I>prefix</I><DD>
+<I>prefix</I> is added at the beginning of each possible completion
+after all other options have been applied.
+<DT><B>-S</B> <I>suffix</I><DD>
+<I>suffix</I> is appended to each possible completion
+after all other options have been applied.
+
+</DL>
+<P>
+
+The return value is true unless an invalid option is supplied, an option
+other than <B>-p</B> or <B>-r</B> is supplied without a <I>name</I>
+argument, an attempt is made to remove a completion specification for
+a <I>name</I> for which no specification exists, or
+an error occurs adding a completion specification.
+</DL>
+
+<DT><B>continue</B> [<I>n</I>]<DD>
+Resume the next iteration of the enclosing
+<B>for</B>,
+
+<B>while</B>,
+
+<B>until</B>,
+
+or
+<B>select</B>
+
+loop.
+If
+<I>n</I>
+
+is specified, resume at the <I>n</I>th enclosing loop.
+<I>n</I>
+
+must be >= 1.  If
+<I>n</I>
+
+is greater than the number of enclosing loops, the last enclosing loop
+(the ``top-level'' loop) is resumed.  The return value is 0 unless the
+shell is not executing a loop when
+<B>continue</B>
+
+is executed.
+<DT><B>declare</B> [<B>-afFirtx</B>] [<B>-p</B>] [<I>name</I>[=<I>value</I>] ...]<DD>
+
+<DT><B>typeset</B> [<B>-afFirtx</B>] [<B>-p</B>] [<I>name</I>[=<I>value</I>] ...]<DD>
+
+Declare variables and/or give them attributes.
+If no <I>name</I>s are given then display the values of variables.
+The
+<B>-p</B>
+
+option will display the attributes and values of each
+<I>name</I>.
+
+When
+<B>-p</B>
+
+is used, additional options are ignored.
+The
+<B>-F</B>
+
+option inhibits the display of function definitions; only the
+function name and attributes are printed.
+If the <B>extdebug</B> shell option is enabled using <B>shopt</B>,
+the source file name and line number where the function is defined
+are displayed as well.  The
+<B>-F</B>
+
+option implies
+<B>-f</B>.
+
+The following options can
+be used to restrict output to variables with the specified attribute or
+to give variables attributes:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-a</B>
+
+<DD>
+Each <I>name</I> is an array variable (see
+<B>Arrays</B>
+
+above).
+<DT><B>-f</B>
+
+<DD>
+Use function names only.
+<DT><B>-i</B>
+
+<DD>
+The variable is treated as an integer; arithmetic evaluation (see
+<FONT SIZE=-1><B>ARITHMETIC EVALUATION ) </B>
+
+</FONT>
+is performed when the variable is assigned a value.
+<DT><B>-r</B>
+
+<DD>
+Make <I>name</I>s readonly.  These names cannot then be assigned values
+by subsequent assignment statements or unset.
+<DT><B>-t</B>
+
+<DD>
+Give each <I>name</I> the <I>trace</I> attribute.
+Traced functions inherit the <B>DEBUG</B> trap from the calling shell.
+The trace attribute has no special meaning for variables.
+<DT><B>-x</B>
+
+<DD>
+Mark <I>name</I>s for export to subsequent commands via the environment.
+
+</DL>
+<P>
+
+Using `+' instead of `-'
+turns off the attribute instead, with the exception that <B>+a</B>
+may not be used to destroy an array variable.  When used in a function,
+makes each
+<I>name</I> local, as with the 
+<B>local</B>
+
+command.
+If a variable name is followed by =<I>value</I>, the value of
+the variable is set to <I>value</I>.
+The return value is 0 unless an invalid option is encountered,
+an attempt is made to define a function using
+
+<TT>-f foo=bar</TT>,
+an attempt is made to assign a value to a readonly variable,
+an attempt is made to assign a value to an array variable without
+using the compound assignment syntax (see
+<B>Arrays</B>
+
+above), one of the <I>names</I> is not a valid shell variable name,
+an attempt is made to turn off readonly status for a readonly variable,
+an attempt is made to turn off array status for an array variable,
+or an attempt is made to display a non-existent function with <B>-f</B>.
+</DL>
+
+<DT><B>dirs [-clpv</B>] [+<I>n</I>] [-<I>n</I>]
+
+<DD>
+Without options, displays the list of currently remembered directories.
+The default display is on a single line with directory names separated
+by spaces.
+Directories are added to the list with the 
+<B>pushd</B>
+
+command; the
+<B>popd</B>
+
+command removes entries from the list.
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>+</B><I>n</I><DD>
+Displays the <I>n</I>th entry counting from the left of the list
+shown by
+<B>dirs</B>
+
+when invoked without options, starting with zero.
+<DT><B>-</B><I>n</I><DD>
+Displays the <I>n</I>th entry counting from the right of the list
+shown by
+<B>dirs</B>
+
+when invoked without options, starting with zero.
+<DT><B>-c</B>
+
+<DD>
+Clears the directory stack by deleting all of the entries.
+<DT><B>-l</B>
+
+<DD>
+Produces a longer listing; the default listing format uses a 
+tilde to denote the home directory.
+<DT><B>-p</B>
+
+<DD>
+Print the directory stack with one entry per line.
+<DT><B>-v</B>
+
+<DD>
+Print the directory stack with one entry per line,
+prefixing each entry with its index in the stack.
+
+</DL>
+<P>
+
+The return value is 0 unless an
+invalid option is supplied or <I>n</I> indexes beyond the end
+of the directory stack.
+</DL>
+
+<DT><B>disown</B> [<B>-ar</B>] [<B>-h</B>] [<I>jobspec</I> ...]<DD>
+Without options, each
+<I>jobspec</I>
+
+is removed from the table of active jobs.
+If the <B>-h</B> option is given, each
+<I>jobspec</I>
+
+is not removed from the table, but is marked so that
+<FONT SIZE=-1><B>SIGHUP</B>
+
+</FONT>
+is not sent to the job if the shell receives a
+<FONT SIZE=-1><B>SIGHUP</B>.
+
+</FONT>
+If no
+<I>jobspec</I>
+
+is present, and neither the
+<B>-a</B>
+
+nor the
+<B>-r</B>
+
+option is supplied, the <I>current job</I> is used.
+If no
+<I>jobspec</I>
+
+is supplied, the
+<B>-a</B>
+
+option means to remove or mark all jobs; the
+<B>-r</B>
+
+option without a
+<I>jobspec</I>
+
+argument restricts operation to running jobs.
+The return value is 0 unless a
+<I>jobspec</I>
+
+does not specify a valid job.
+<DT><B>echo</B> [<B>-neE</B>] [<I>arg</I> ...]<DD>
+Output the <I>arg</I>s, separated by spaces, followed by a newline.
+The return status is always 0.
+If <B>-n</B> is specified, the trailing newline is
+suppressed.  If the <B>-e</B> option is given, interpretation of
+the following backslash-escaped characters is enabled.  The
+<B>-E</B>
+
+option disables the interpretation of these escape characters,
+even on systems where they are interpreted by default.
+The <B>xpg_echo</B> shell option may be used to
+dynamically determine whether or not <B>echo</B> expands these
+escape characters by default.
+<B>echo</B>
+
+does not interpret
+<B>--</B>
+
+to mean the end of options.
+<B>echo</B>
+
+interprets the following escape sequences:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>\a</B>
+
+<DD>
+alert (bell)
+<DT><B>\b</B>
+
+<DD>
+backspace
+<DT><B>\c</B>
+
+<DD>
+suppress trailing newline
+<DT><B>\e</B>
+
+<DD>
+an escape character
+<DT><B>\f</B>
+
+<DD>
+form feed
+<DT><B>\n</B>
+
+<DD>
+new line
+<DT><B>\r</B>
+
+<DD>
+carriage return
+<DT><B>\t</B>
+
+<DD>
+horizontal tab
+<DT><B>\v</B>
+
+<DD>
+vertical tab
+<DT><B>\\</B>
+
+<DD>
+backslash
+<DT><B>\0</B><I>nnn</I>
+
+<DD>
+the eight-bit character whose value is the octal value <I>nnn</I>
+(zero to three octal digits)
+<DT><B>\</B><I>nnn</I>
+
+<DD>
+the eight-bit character whose value is the octal value <I>nnn</I>
+(one to three octal digits)
+<DT><B>\x</B><I>HH</I>
+
+<DD>
+the eight-bit character whose value is the hexadecimal value <I>HH</I>
+(one or two hex digits)
+
+</DL></DL>
+
+<DT><B>enable</B> [<B>-adnps</B>] [<B>-f</B> <I>filename</I>] [<I>name</I> ...]<DD>
+Enable and disable builtin shell commands.
+Disabling a builtin allows a disk command which has the same name
+as a shell builtin to be executed without specifying a full pathname,
+even though the shell normally searches for builtins before disk commands.
+If <B>-n</B> is used, each <I>name</I>
+is disabled; otherwise,
+<I>names</I> are enabled.  For example, to use the
+<B>test</B>
+
+binary found via the
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+instead of the shell builtin version, run
+<TT>enable -n test</TT>.
+
+The
+<B>-f</B>
+
+option means to load the new builtin command
+<I>name</I>
+
+from shared object
+<I>filename</I>,
+
+on systems that support dynamic loading.  The
+<B>-d</B>
+
+option will delete a builtin previously loaded with
+<B>-f</B>.
+
+If no <I>name</I> arguments are given, or if the
+<B>-p</B>
+
+option is supplied, a list of shell builtins is printed.
+With no other option arguments, the list consists of all enabled
+shell builtins.
+If <B>-n</B> is supplied, only disabled builtins are printed.
+If <B>-a</B> is supplied, the list printed includes all builtins, with an
+indication of whether or not each is enabled.
+If <B>-s</B> is supplied, the output is restricted to the POSIX
+<I>special</I> builtins.
+The return value is 0 unless a
+<I>name</I>
+
+is not a shell builtin or there is an error loading a new builtin
+from a shared object.
+<DT><B>eval</B> [<I>arg</I> ...]<DD>
+The <I>arg</I>s are read and concatenated together into a single
+command.  This command is then read and executed by the shell, and
+its exit status is returned as the value of
+<B>eval</B>.
+
+If there are no
+<I>args</I>,
+
+or only null arguments,
+<B>eval</B>
+
+returns 0.
+<DT><B>exec</B> [<B>-cl</B>] [<B>-a</B> <I>name</I>] [<I>command</I> [<I>arguments</I>]]<DD>
+If
+<I>command</I>
+
+is specified, it replaces the shell.
+No new process is created.  The
+<I>arguments</I>
+
+become the arguments to <I>command</I>.
+If the
+<B>-l</B>
+
+option is supplied,
+the shell places a dash at the beginning of the zeroth arg passed to 
+<I>command</I>.
+
+This is what
+<I>login</I>(1)
+
+does.  The
+<B>-c</B>
+
+option causes
+<I>command</I>
+
+to be executed with an empty environment.  If
+<B>-a</B>
+
+is supplied, the shell passes
+<I>name</I>
+
+as the zeroth argument to the executed command.  If
+<I>command</I>
+
+cannot be executed for some reason, a non-interactive shell exits,
+unless the shell option
+<B>execfail</B>
+
+is enabled, in which case it returns failure.
+An interactive shell returns failure if the file cannot be executed.
+If
+<I>command</I>
+
+is not specified, any redirections take effect in the current shell,
+and the return status is 0.  If there is a redirection error, the
+return status is 1.
+<DT><B>exit</B> [<I>n</I>]<DD>
+Cause the shell to exit
+with a status of <I>n</I>.  If
+<I>n</I>
+
+is omitted, the exit status
+is that of the last command executed.
+A trap on
+<FONT SIZE=-1><B>EXIT</B>
+
+</FONT>
+is executed before the shell terminates.
+<DT><B>export</B> [<B>-fn</B>] [<I>name</I>[=<I>word</I>]] ...<DD>
+
+<DT><B>export -p</B>
+
+<DD>
+
+The supplied
+<I>names</I>
+
+are marked for automatic export to the environment of
+subsequently executed commands.  If the 
+<B>-f</B>
+
+option is given,
+the 
+<I>names</I>
+
+refer to functions.
+If no
+<I>names</I>
+
+are given, or if the
+<B>-p</B>
+
+option is supplied, a list
+of all names that are exported in this shell is printed.
+The
+<B>-n</B>
+
+option causes the export property to be removed from each
+<I>name</I>.
+If a variable name is followed by =<I>word</I>, the value of
+the variable is set to <I>word</I>.
+<B>export</B>
+
+returns an exit status of 0 unless an invalid option is
+encountered,
+one of the <I>names</I> is not a valid shell variable name, or
+<B>-f</B>
+
+is supplied with a
+<I>name</I>
+
+that is not a function.
+<DT><B>fc</B> [<B>-e</B> <I>ename</I>] [<B>-nlr</B>] [<I>first</I>] [<I>last</I>]<DD>
+
+<DT><B>fc</B> <B>-s</B> [<I>pat</I>=<I>rep</I>] [<I>cmd</I>]<DD>
+
+Fix Command.  In the first form, a range of commands from
+<I>first</I>
+
+to
+<I>last</I>
+
+is selected from the history list.
+<I>First</I>
+
+and
+<I>last</I>
+
+may be specified as a string (to locate the last command beginning
+with that string) or as a number (an index into the history list,
+where a negative number is used as an offset from the current
+command number).  If 
+<I>last</I>
+
+is not specified it is set to
+the current command for listing (so that
+
+<TT>fc -l -10</TT>
+prints the last 10 commands) and to
+<I>first</I>
+
+otherwise.
+If
+<I>first</I>
+
+is not specified it is set to the previous
+command for editing and -16 for listing.
+<P>
+The
+<B>-n</B>
+
+option suppresses
+the command numbers when listing.  The
+<B>-r</B>
+
+option reverses the order of
+the commands.  If the
+<B>-l</B>
+
+option is given,
+the commands are listed on
+standard output.  Otherwise, the editor given by
+<I>ename</I>
+
+is invoked
+on a file containing those commands.  If
+<I>ename</I>
+
+is not given, the
+value of the
+<FONT SIZE=-1><B>FCEDIT</B>
+
+</FONT>
+variable is used, and
+the value of
+<FONT SIZE=-1><B>EDITOR</B>
+
+</FONT>
+if
+<FONT SIZE=-1><B>FCEDIT</B>
+
+</FONT>
+is not set.  If neither variable is set,
+
+<I>vi</I>
+
+is used.  When editing is complete, the edited commands are
+echoed and executed.
+<P>
+In the second form, <I>command</I> is re-executed after each instance
+of <I>pat</I> is replaced by <I>rep</I>.
+A useful alias to use with this is
+
+<TT>r='fc -s'</TT>,
+so that typing
+
+<TT>r cc</TT>
+runs the last command beginning with
+
+<TT>cc</TT>
+and typing
+
+<TT>r</TT>
+re-executes the last command.
+<P>
+If the first form is used, the return value is 0 unless an invalid
+option is encountered or
+<I>first</I>
+
+or
+<I>last</I>
+
+specify history lines out of range.
+If the
+<B>-e</B>
+
+option is supplied, the return value is the value of the last
+command executed or failure if an error occurs with the temporary
+file of commands.  If the second form is used, the return status
+is that of the command re-executed, unless
+<I>cmd</I>
+
+does not specify a valid history line, in which case
+<B>fc</B>
+
+returns failure.
+<DT><B>fg</B> [<I>jobspec</I>]<DD>
+Resume
+<I>jobspec</I>
+
+in the foreground, and make it the current job.
+If
+<I>jobspec</I>
+
+is not present, the shell's notion of the <I>current job</I> is used.
+The return value is that of the command placed into the foreground,
+or failure if run when job control is disabled or, when run with
+job control enabled, if
+<I>jobspec</I>
+
+does not specify a valid job or
+<I>jobspec</I>
+
+specifies a job that was started without job control.
+<DT><B>getopts</B> <I>optstring</I> <I>name</I> [<I>args</I>]<DD>
+<B>getopts</B>
+
+is used by shell procedures to parse positional parameters.
+<I>optstring</I>
+
+contains the option characters to be recognized; if a character
+is followed by a colon, the option is expected to have an
+argument, which should be separated from it by white space.
+The colon and question mark characters may not be used as
+option characters.
+Each time it is invoked,
+<B>getopts</B>
+
+places the next option in the shell variable
+<I>name</I>,
+
+initializing
+<I>name</I>
+
+if it does not exist,
+and the index of the next argument to be processed into the
+variable
+<FONT SIZE=-1><B>OPTIND</B>.
+
+</FONT>
+<FONT SIZE=-1><B>OPTIND</B>
+
+</FONT>
+is initialized to 1 each time the shell or a shell script
+is invoked.  When an option requires an argument,
+<B>getopts</B>
+
+places that argument into the variable
+<FONT SIZE=-1><B>OPTARG</B>.
+
+</FONT>
+The shell does not reset
+<FONT SIZE=-1><B>OPTIND</B>
+
+</FONT>
+automatically; it must be manually reset between multiple
+calls to
+<B>getopts</B>
+
+within the same shell invocation if a new set of parameters
+is to be used.
+<P>
+When the end of options is encountered, <B>getopts</B> exits with a
+return value greater than zero.
+<B>OPTIND</B> is set to the index of the first non-option argument,
+and <B>name</B> is set to ?.
+<P>
+<B>getopts</B>
+
+normally parses the positional parameters, but if more arguments are
+given in
+<I>args</I>,
+
+<B>getopts</B>
+
+parses those instead.
+<P>
+<B>getopts</B>
+
+can report errors in two ways.  If the first character of
+<I>optstring</I>
+
+is a colon,
+<I>silent</I>
+
+error reporting is used.  In normal operation diagnostic messages
+are printed when invalid options or missing option arguments are
+encountered.
+If the variable
+<FONT SIZE=-1><B>OPTERR</B>
+
+</FONT>
+is set to 0, no error messages will be displayed, even if the first
+character of 
+<I>optstring</I>
+
+is not a colon.
+<P>
+If an invalid option is seen,
+<B>getopts</B>
+
+places ? into
+<I>name</I>
+
+and, if not silent,
+prints an error message and unsets
+<FONT SIZE=-1><B>OPTARG</B>.
+
+</FONT>
+If
+<B>getopts</B>
+
+is silent,
+the option character found is placed in
+<FONT SIZE=-1><B>OPTARG</B>
+
+</FONT>
+and no diagnostic message is printed.
+<P>
+If a required argument is not found, and
+<B>getopts</B>
+
+is not silent,
+a question mark (<B>?</B>) is placed in
+<I>name</I>,
+
+<FONT SIZE=-1><B>OPTARG</B>
+
+</FONT>
+is unset, and a diagnostic message is printed.
+If
+<B>getopts</B>
+
+is silent, then a colon (<B>:</B>) is placed in
+<I>name</I>
+
+and
+<FONT SIZE=-1><B>OPTARG</B>
+
+</FONT>
+is set to the option character found.
+<P>
+<B>getopts</B>
+
+returns true if an option, specified or unspecified, is found.
+It returns false if the end of options is encountered or an
+error occurs.
+<DT><B>hash</B> [<B>-lr</B>] [<B>-p</B> <I>filename</I>] [<B>-dt</B>] [<I>name</I>]<DD>
+For each
+<I>name</I>,
+
+the full file name of the command is determined by searching
+the directories in
+<B>$PATH</B>
+
+and remembered.
+If the
+<B>-p</B>
+
+option is supplied, no path search is performed, and
+<I>filename</I>
+
+is used as the full file name of the command.
+The
+<B>-r</B>
+
+option causes the shell to forget all
+remembered locations.
+The
+<B>-d</B>
+
+option causes the shell to forget the remembered location of each <I>name</I>.
+If the
+<B>-t</B>
+
+option is supplied, the full pathname to which each <I>name</I> corresponds
+is printed.  If multiple <I>name</I> arguments are supplied with <B>-t</B>,
+the <I>name</I> is printed before the hashed full pathname.
+The
+<B>-l</B>
+
+option causes output to be displayed in a format that may be reused as input.
+If no arguments are given, or if only <B>-l</B> is supplied,
+information about remembered commands is printed.
+The return status is true unless a
+<I>name</I>
+
+is not found or an invalid option is supplied.
+<DT><B>help</B> [<B>-s</B>] [<I>pattern</I>]<DD>
+Display helpful information about builtin commands.  If
+<I>pattern</I>
+
+is specified,
+<B>help</B>
+
+gives detailed help on all commands matching
+<I>pattern</I>;
+
+otherwise help for all the builtins and shell control structures
+is printed.
+The <B>-s</B> option restricts the information displayed to a short
+usage synopsis.
+The return status is 0 unless no command matches
+<I>pattern</I>.
+
+<DT><B>history [</B><I>n</I>]<DD>
+
+<DT><B>history</B> <B>-c</B><DD>
+<DT><B>history -d</B> <I>offset</I><DD>
+<DT><B>history</B> <B>-anrw</B> [<I>filename</I>]<DD>
+<DT><B>history</B> <B>-p</B> <I>arg</I> [<I>arg ...</I>]<DD>
+<DT><B>history</B> <B>-s</B> <I>arg</I> [<I>arg ...</I>]<DD>
+
+With no options, display the command
+history list with line numbers.  Lines listed
+with a 
+<B>*</B>
+
+have been modified.  An argument of
+<I>n</I>
+
+lists only the last
+<I>n</I>
+
+lines.
+If the shell variable <B>HISTTIMEFORMAT</B> is set and not null,
+it is used as a format string for <I>strftime</I>(3) to display
+the time stamp associated with each displayed history entry.
+No intervening blank is printed between the formatted time stamp
+and the history line.
+If <I>filename</I> is supplied, it is used as the
+name of the history file; if not, the value of
+<FONT SIZE=-1><B>HISTFILE</B>
+
+</FONT>
+is used.  Options, if supplied, have the following meanings:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-c</B>
+
+<DD>
+Clear the history list by deleting all the entries.
+<DT><B>-d</B> <I>offset</I><DD>
+Delete the history entry at position <I>offset</I>.
+<DT><B>-a</B>
+
+<DD>
+Append the ``new'' history lines (history lines entered since the
+beginning of the current <B>bash</B> session) to the history file.
+<DT><B>-n</B>
+
+<DD>
+Read the history lines not already read from the history
+file into the current history list.  These are lines
+appended to the history file since the beginning of the
+current <B>bash</B> session.
+<DT><B>-r</B>
+
+<DD>
+Read the contents of the history file
+and use them as the current history.
+<DT><B>-w</B>
+
+<DD>
+Write the current history to the history file, overwriting the
+history file's contents.
+<DT><B>-p</B>
+
+<DD>
+Perform history substitution on the following <I>args</I> and display
+the result on the standard output.
+Does not store the results in the history list.
+Each <I>arg</I> must be quoted to disable normal history expansion.
+<DT><B>-s</B>
+
+<DD>
+Store the
+<I>args</I>
+
+in the history list as a single entry.  The last command in the
+history list is removed before the
+<I>args</I>
+
+are added.
+
+</DL>
+<P>
+
+If the <B>HISTTIMEFORMAT</B> is set, the time stamp information
+associated with each history entry is written to the history file.
+The return value is 0 unless an invalid option is encountered, an
+error occurs while reading or writing the history file, an invalid
+<I>offset</I> is supplied as an argument to <B>-d</B>, or the
+history expansion supplied as an argument to <B>-p</B> fails.
+</DL>
+
+<DT><B>jobs</B> [<B>-lnprs</B>] [ <I>jobspec</I> ... ]<DD>
+
+<DT><B>jobs</B> <B>-x</B> <I>command</I> [ <I>args</I> ... ]<DD>
+
+The first form lists the active jobs.  The options have the following
+meanings:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-l</B>
+
+<DD>
+List process IDs
+in addition to the normal information.
+<DT><B>-p</B>
+
+<DD>
+List only the process ID of the job's process group
+leader.
+<DT><B>-n</B>
+
+<DD>
+Display information only about jobs that have changed status since
+the user was last notified of their status.
+<DT><B>-r</B>
+
+<DD>
+Restrict output to running jobs.
+<DT><B>-s</B>
+
+<DD>
+Restrict output to stopped jobs.
+
+</DL>
+<P>
+
+If
+<I>jobspec</I>
+
+is given, output is restricted to information about that job.
+The return status is 0 unless an invalid option is encountered
+or an invalid
+<I>jobspec</I>
+
+is supplied.
+<P>
+
+If the
+<B>-x</B>
+
+option is supplied,
+<B>jobs</B>
+
+replaces any
+<I>jobspec</I>
+
+found in
+<I>command</I>
+
+or
+<I>args</I>
+
+with the corresponding process group ID, and executes
+<I>command</I>
+
+passing it
+<I>args</I>,
+
+returning its exit status.
+</DL>
+
+<DT><B>kill</B> [<B>-s</B> <I>sigspec</I> | <B>-n</B> <I>signum</I> | <B>-</B><I>sigspec</I>] [<I>pid</I> | <I>jobspec</I>] ...<DD>
+
+<DT><B>kill</B> <B>-l</B> [<I>sigspec</I> | <I>exit_status</I>]<DD>
+
+Send the signal named by
+<I>sigspec</I>
+
+or
+<I>signum</I>
+
+to the processes named by
+<I>pid</I>
+
+or
+<I>jobspec</I>.
+
+<I>sigspec</I>
+
+is either a signal name such as
+<FONT SIZE=-1><B>SIGKILL</B>
+
+</FONT>
+or a signal number;
+<I>signum</I>
+
+is a signal number.  If
+<I>sigspec</I>
+
+is a signal name, the name may be
+given with or without the
+<FONT SIZE=-1><B>SIG</B>
+
+</FONT>
+prefix.
+If
+<I>sigspec</I>
+
+is not present, then
+<FONT SIZE=-1><B>SIGTERM</B>
+
+</FONT>
+is assumed.
+An argument of
+<B>-l</B>
+
+lists the signal names.
+If any arguments are supplied when
+<B>-l</B>
+
+is given, the names of the signals corresponding to the arguments are
+listed, and the return status is 0.
+The <I>exit_status</I> argument to
+<B>-l</B>
+
+is a number specifying either a signal number or the exit status of
+a process terminated by a signal.
+<B>kill</B>
+
+returns true if at least one signal was successfully sent, or false
+if an error occurs or an invalid option is encountered.
+<DT><B>let</B> <I>arg</I> [<I>arg</I> ...]<DD>
+Each
+<I>arg</I>
+
+is an arithmetic expression to be evaluated (see
+<FONT SIZE=-1><B>ARITHMETIC EVALUATION</B>).
+
+</FONT>
+If the last
+<I>arg</I>
+
+evaluates to 0,
+<B>let</B>
+
+returns 1; 0 is returned otherwise.
+<DT><B>local</B> [<I>option</I>] [<I>name</I>[=<I>value</I>] ...]<DD>
+For each argument, a local variable named
+<I>name </I>
+
+is created, and assigned
+<I>value</I>.
+
+The <I>option</I> can be any of the options accepted by <B>declare</B>.
+When
+<B>local</B>
+
+is used within a function, it causes the variable
+<I>name</I>
+
+to have a visible scope restricted to that function and its children.
+With no operands,
+<B>local</B>
+
+writes a list of local variables to the standard output.  It is
+an error to use
+<B>local</B>
+
+when not within a function.  The return status is 0 unless
+<B>local</B>
+
+is used outside a function, an invalid
+<I>name</I>
+
+is supplied, or
+<I>name</I> is a readonly variable.
+<DT><B>logout</B>
+
+<DD>
+Exit a login shell.
+<DT><B>popd</B> [-<B>n</B>] [+<I>n</I>] [-<I>n</I>]<DD>
+Removes entries from the directory stack.  With no arguments,
+removes the top directory from the stack, and performs a
+<B>cd</B>
+
+to the new top directory.
+Arguments, if supplied, have the following meanings:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>+</B><I>n</I><DD>
+Removes the <I>n</I>th entry counting from the left of the list
+shown by
+<B>dirs</B>,
+
+starting with zero.  For example:
+
+<TT>popd +0</TT>
+removes the first directory,
+
+<TT>popd +1</TT>
+the second.
+<DT><B>-</B><I>n</I><DD>
+Removes the <I>n</I>th entry counting from the right of the list
+shown by
+<B>dirs</B>,
+
+starting with zero.  For example:
+
+<TT>popd -0</TT>
+removes the last directory,
+
+<TT>popd -1</TT>
+the next to last.
+<DT><B>-n</B>
+
+<DD>
+Suppresses the normal change of directory when removing directories
+from the stack, so that only the stack is manipulated.
+
+</DL>
+<P>
+
+If the
+<B>popd</B>
+
+command is successful, a 
+<B>dirs</B>
+
+is performed as well, and the return status is 0.
+<B>popd</B>
+
+returns false if an invalid option is encountered, the directory stack
+is empty, a non-existent directory stack entry is specified, or the
+directory change fails.
+</DL>
+
+<DT><B>printf</B> <I>format</I> [<I>arguments</I>]<DD>
+Write the formatted <I>arguments</I> to the standard output under the
+control of the <I>format</I>.
+The <I>format</I> is a character string which contains three types of objects:
+plain characters, which are simply copied to standard output, character
+escape sequences, which are converted and copied to the standard output, and
+format specifications, each of which causes printing of the next successive
+<I>argument</I>.
+In addition to the standard <I>printf</I>(1) formats, <B>%b</B> causes
+<B>printf</B> to expand backslash escape sequences in the corresponding
+<I>argument</I> (except that <B>\c</B> terminates output, backslashes in
+<B>\'</B>, <B>\&quot;</B>, and <B>\?</B> are not removed, and octal escapes
+beginning with <B>\0</B> may contain up to four digits),
+and <B>%q</B> causes <B>printf</B> to output the corresponding
+<I>argument</I> in a format that can be reused as shell input.
+<P>
+The <I>format</I> is reused as necessary to consume all of the <I>arguments</I>.
+If the <I>format</I> requires more <I>arguments</I> than are supplied, the
+extra format specifications behave as if a zero value or null string, as
+appropriate, had been supplied.  The return value is zero on success,
+non-zero on failure.
+<DT><B>pushd</B> [<B>-n</B>] [<I>dir</I>]<DD>
+
+<DT><B>pushd</B> [<B>-n</B>] [+<I>n</I>] [-<I>n</I>]<DD>
+
+Adds a directory to the top of the directory stack, or rotates
+the stack, making the new top of the stack the current working
+directory.  With no arguments, exchanges the top two directories
+and returns 0, unless the directory stack is empty.
+Arguments, if supplied, have the following meanings:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>+</B><I>n</I><DD>
+Rotates the stack so that the <I>n</I>th directory
+(counting from the left of the list shown by
+<B>dirs</B>,
+
+starting with zero)
+is at the top.
+<DT><B>-</B><I>n</I><DD>
+Rotates the stack so that the <I>n</I>th directory
+(counting from the right of the list shown by
+<B>dirs</B>,
+
+starting with zero) is at the top.
+<DT><B>-n</B>
+
+<DD>
+Suppresses the normal change of directory when adding directories
+to the stack, so that only the stack is manipulated.
+<DT><I>dir</I>
+
+<DD>
+Adds
+<I>dir</I>
+
+to the directory stack at the top, making it the
+new current working directory.
+
+</DL>
+<P>
+
+If the
+<B>pushd</B>
+
+command is successful, a 
+<B>dirs</B>
+
+is performed as well.
+If the first form is used,
+<B>pushd</B>
+
+returns 0 unless the cd to
+<I>dir</I>
+
+fails.  With the second form,
+<B>pushd</B>
+
+returns 0 unless the directory stack is empty,
+a non-existent directory stack element is specified,
+or the directory change to the specified new current directory
+fails.
+</DL>
+
+<DT><B>pwd</B> [<B>-LP</B>]<DD>
+Print the absolute pathname of the current working directory.
+The pathname printed contains no symbolic links if the
+<B>-P</B>
+
+option is supplied or the 
+<B>-o physical</B>
+
+option to the
+<B>set</B>
+
+builtin command is enabled.
+If the
+<B>-L</B>
+
+option is used, the pathname printed may contain symbolic links.
+The return status is 0 unless an error occurs while
+reading the name of the current directory or an
+invalid option is supplied.
+<DT><B>read</B> [<B>-ers</B>] [<B>-u</B> <I>fd</I>] [<B>-t</B> <I>timeout</I>] [<B>-a</B> <I>aname</I>] [<B>-p</B> <I>prompt</I>] [<B>-n</B> <I>nchars</I>] [<B>-d</B> <I>delim</I>] [<I>name</I> ...]<DD>
+One line is read from the standard input, or from the file descriptor
+<I>fd</I> supplied as an argument to the <B>-u</B> option, and the first word
+is assigned to the first
+<I>name</I>,
+
+the second word to the second
+<I>name</I>,
+
+and so on, with leftover words and their intervening separators assigned
+to the last
+<I>name</I>.
+
+If there are fewer words read from the input stream than names,
+the remaining names are assigned empty values.
+The characters in 
+<FONT SIZE=-1><B>IFS</B>
+
+</FONT>
+are used to split the line into words.
+The backslash character (<B>\</B>) may be used to remove any special
+meaning for the next character read and for line continuation.
+Options, if supplied, have the following meanings:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-a </B><I>aname</I>
+
+<DD>
+The words are assigned to sequential indices
+of the array variable
+<I>aname</I>,
+
+starting at 0.
+<I>aname</I>
+
+is unset before any new values are assigned.
+Other <I>name</I> arguments are ignored.
+<DT><B>-d </B><I>delim</I>
+
+<DD>
+The first character of <I>delim</I> is used to terminate the input line,
+rather than newline.
+<DT><B>-e</B>
+
+<DD>
+If the standard input
+is coming from a terminal,
+<B>readline</B>
+
+(see
+<FONT SIZE=-1><B>READLINE</B>
+
+</FONT>
+above) is used to obtain the line.
+<DT><B>-n </B><I>nchars</I>
+
+<DD>
+<B>read</B> returns after reading <I>nchars</I> characters rather than
+waiting for a complete line of input.
+<DT><B>-p </B><I>prompt</I>
+
+<DD>
+Display <I>prompt</I> on standard error, without a
+trailing newline, before attempting to read any input.  The prompt
+is displayed only if input is coming from a terminal.
+<DT><B>-r</B>
+
+<DD>
+Backslash does not act as an escape character.
+The backslash is considered to be part of the line.
+In particular, a backslash-newline pair may not be used as a line
+continuation.
+<DT><B>-s</B>
+
+<DD>
+Silent mode.  If input is coming from a terminal, characters are
+not echoed.
+<DT><B>-t </B><I>timeout</I>
+
+<DD>
+Cause <B>read</B> to time out and return failure if a complete line of
+input is not read within <I>timeout</I> seconds.
+This option has no effect if <B>read</B> is not reading input from the
+terminal or a pipe.
+<DT><B>-u </B><I>fdFP</I>
+
+<DD>
+Read input from file descriptor <I>fd</I>.
+
+</DL>
+<P>
+
+If no
+<I>names</I>
+
+are supplied, the line read is assigned to the variable
+<FONT SIZE=-1><B>REPLY</B>.
+
+</FONT>
+The return code is zero, unless end-of-file is encountered, <B>read</B>
+times out, or an invalid file descriptor is supplied as the argument to
+<B>-u</B>.
+</DL>
+
+<DT><B>readonly</B> [<B>-apf</B>] [<I>name</I>[=<I>word</I>] ...]<DD>
+
+The given
+<I>names</I> are marked readonly; the values of these
+<I>names</I>
+
+may not be changed by subsequent assignment.
+If the
+<B>-f</B>
+
+option is supplied, the functions corresponding to the
+<I>names</I> are so
+marked.
+The
+<B>-a</B>
+
+option restricts the variables to arrays.
+If no
+<I>name</I>
+
+arguments are given, or if the
+<B>-p</B>
+
+option is supplied, a list of all readonly names is printed.
+The
+<B>-p</B>
+
+option causes output to be displayed in a format that
+may be reused as input.
+If a variable name is followed by =<I>word</I>, the value of
+the variable is set to <I>word</I>.
+The return status is 0 unless an invalid option is encountered,
+one of the
+<I>names</I>
+
+is not a valid shell variable name, or
+<B>-f</B>
+
+is supplied with a
+<I>name</I>
+
+that is not a function.
+<DT><B>return</B> [<I>n</I>]<DD>
+Causes a function to exit with the return value specified by
+<I>n</I>.
+
+If 
+<I>n</I>
+
+is omitted, the return status is that of the last command
+executed in the function body.  If used outside a function,
+but during execution of a script by the 
+<B>.</B>
+
+(<B>source</B>) command, it causes the shell to stop executing
+that script and return either
+<I>n</I>
+
+or the exit status of the last command executed within the
+script as the exit status of the script.  If used outside a
+function and not during execution of a script by <B>.</B>,
+the return status is false.
+Any command associated with the <B>RETURN</B> trap is executed
+before execution resumes after the function or script.
+<DT><B>set</B> [<B>--abefhkmnptuvxBCHP</B>] [<B>-o</B> <I>option</I>] [<I>arg</I> ...]<DD>
+Without options, the name and value of each shell variable are displayed
+in a format that can be reused as input.
+The output is sorted according to the current locale.
+When options are specified, they set or unset shell attributes.
+Any arguments remaining after the options are processed are treated
+as values for the positional parameters and are assigned, in order, to 
+<B>$1</B>,
+
+<B>$2</B>,
+
+<B>...</B>
+
+<B>$</B><I>n</I>.
+
+Options, if specified, have the following meanings:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-a</B>
+
+<DD>
+Automatically mark variables and functions which are modified or
+created for export to the environment of subsequent commands.
+<DT><B>-b</B>
+
+<DD>
+Report the status of terminated background jobs
+immediately, rather than before the next primary prompt.  This is
+effective only when job control is enabled.
+<DT><B>-e</B>
+
+<DD>
+Exit immediately if a <I>simple command</I> (see
+<FONT SIZE=-1><B>SHELL GRAMMAR</B>
+
+</FONT>
+above) exits with a non-zero status.
+The shell does not exit if the
+command that fails is part of the command list immediately following a
+<B>while</B>
+
+or
+<B>until</B>
+
+keyword, 
+part of the test in an
+<I>if</I>
+
+statement, part of a
+<B>&amp;&amp;</B>
+
+or
+<B>||</B>
+
+list, or if the command's return value is
+being inverted via
+<B>!</B>.
+
+A trap on <B>ERR</B>, if set, is executed before the shell exits.
+<DT><B>-f</B>
+
+<DD>
+Disable pathname expansion.
+<DT><B>-h</B>
+
+<DD>
+Remember the location of commands as they are looked up for execution.
+This is enabled by default.
+<DT><B>-k</B>
+
+<DD>
+All arguments in the form of assignment statements
+are placed in the environment for a command, not just
+those that precede the command name.
+<DT><B>-m</B>
+
+<DD>
+Monitor mode.  Job control is enabled.  This option is on
+by default for interactive shells on systems that support
+it (see
+<FONT SIZE=-1><B>JOB CONTROL</B>
+
+</FONT>
+above).  Background processes run in a separate process
+group and a line containing their exit status is printed
+upon their completion.
+<DT><B>-n</B>
+
+<DD>
+Read commands but do not execute them.  This may be used to 
+check a shell script for syntax errors.  This is ignored by
+interactive shells.
+<DT><B>-o </B><I>option-name</I>
+
+<DD>
+The <I>option-name</I> can be one of the following:
+<DL COMPACT><DT><DD>
+<DL COMPACT>
+<DT><B>allexport</B>
+
+<DD>
+Same as
+<B>-a</B>.
+
+<DT><B>braceexpand</B>
+
+<DD>
+Same as
+<B>-B</B>.
+
+<DT><B>emacs</B>
+
+<DD>
+Use an emacs-style command line editing interface.  This is enabled
+by default when the shell is interactive, unless the shell is started
+with the
+<B>--noediting</B>
+
+option.
+<DT><B>errtrace</B>
+
+<DD>
+Same as
+<B>-E</B>.
+
+<DT><B>functrace</B>
+
+<DD>
+Same as
+<B>-T</B>.
+
+<DT><B>errexit</B>
+
+<DD>
+Same as
+<B>-e</B>.
+
+<DT><B>hashall</B>
+
+<DD>
+Same as
+<B>-h</B>.
+
+<DT><B>histexpand</B>
+
+<DD>
+Same as
+<B>-H</B>.
+
+<DT><B>history</B>
+
+<DD>
+Enable command history, as described above under
+<FONT SIZE=-1><B>HISTORY</B>.
+
+</FONT>
+This option is on by default in interactive shells.
+<DT><B>ignoreeof</B>
+
+<DD>
+The effect is as if the shell command
+<TT>IGNOREEOF=10</TT>
+
+had been executed
+(see
+<B>Shell Variables</B>
+
+above).
+<DT><B>keyword</B>
+
+<DD>
+Same as
+<B>-k</B>.
+
+<DT><B>monitor</B>
+
+<DD>
+Same as
+<B>-m</B>.
+
+<DT><B>noclobber</B>
+
+<DD>
+Same as
+<B>-C</B>.
+
+<DT><B>noexec</B>
+
+<DD>
+Same as
+<B>-n</B>.
+
+<DT><B>noglob</B>
+
+<DD>
+Same as
+<B>-f</B>.
+
+<B>nolog</B>
+
+Currently ignored.
+<DT><B>notify</B>
+
+<DD>
+Same as
+<B>-b</B>.
+
+<DT><B>nounset</B>
+
+<DD>
+Same as
+<B>-u</B>.
+
+<DT><B>onecmd</B>
+
+<DD>
+Same as
+<B>-t</B>.
+
+<DT><B>physical</B>
+
+<DD>
+Same as
+<B>-P</B>.
+
+<DT><B>pipefail</B>
+
+<DD>
+If set, the return value of a pipeline is the value of the last
+(rightmost) command to exit with a non-zero status, or zero if all
+commands in the pipeline exit successfully.
+This option is disabled by default.
+<DT><B>posix</B>
+
+<DD>
+Change the behavior of
+<B>bash</B>
+
+where the default operation differs
+from the POSIX 1003.2 standard to match the standard (<I>`posix mode</I>).
+<DT><B>privileged</B>
+
+<DD>
+Same as
+<B>-p</B>.
+
+<DT><B>verbose</B>
+
+<DD>
+Same as
+<B>-v</B>.
+
+<DT><B>vi</B>
+
+<DD>
+Use a vi-style command line editing interface.
+<DT><B>xtrace</B>
+
+<DD>
+Same as
+<B>-x</B>.
+
+<P>
+</DL>
+<P>
+
+If
+<B>-o</B>
+
+is supplied with no <I>option-name</I>, the values of the current options are
+printed.
+If
+<B>+o</B>
+
+is supplied with no <I>option-name</I>, a series of
+<B>set</B>
+
+commands to recreate the current option settings is displayed on
+the standard output.
+</DL>
+
+<DT><B>-p</B>
+
+<DD>
+Turn on
+<I>privileged</I>
+
+mode.  In this mode, the
+<FONT SIZE=-1><B>$ENV</B>
+
+</FONT>
+and
+<FONT SIZE=-1><B>$BASH_ENV</B>
+
+</FONT>
+files are not processed, shell functions are not inherited from the
+environment, and the
+<FONT SIZE=-1><B>SHELLOPTS</B>
+
+</FONT>
+variable, if it appears in the environment, is ignored.
+If the shell is started with the effective user (group) id not equal to the
+real user (group) id, and the <B>-p</B> option is not supplied, these actions
+are taken and the effective user id is set to the real user id.
+If the <B>-p</B> option is supplied at startup, the effective user id is
+not reset.
+Turning this option off causes the effective user
+and group ids to be set to the real user and group ids.
+<DT><B>-t</B>
+
+<DD>
+Exit after reading and executing one command.
+<DT><B>-u</B>
+
+<DD>
+Treat unset variables as an error when performing
+parameter expansion.  If expansion is attempted on an
+unset variable, the shell prints an error message, and,
+if not interactive, exits with a non-zero status.
+<DT><B>-v</B>
+
+<DD>
+Print shell input lines as they are read.
+<DT><B>-x</B>
+
+<DD>
+After expanding each <I>simple command</I>,
+<B>for</B> command, <B>case</B> command, <B>select</B> command, or
+arithmetic <B>for</B> command, display the expanded value of
+<FONT SIZE=-1><B>PS4</B>,
+
+</FONT>
+followed by the command and its expanded arguments
+or associated word list.
+<DT><B>-B</B>
+
+<DD>
+The shell performs brace expansion (see
+<B>Brace Expansion</B>
+
+above).  This is on by default.
+<DT><B>-C</B>
+
+<DD>
+If set,
+<B>bash</B>
+
+does not overwrite an existing file with the
+<B>&gt;</B>,
+
+<B>&gt;&amp;</B>,
+
+and
+<B>&lt;&gt;</B>
+
+redirection operators.  This may be overridden when 
+creating output files by using the redirection operator
+<B>&gt;|</B>
+
+instead of
+<B>&gt;</B>.
+
+<DT><B>-E</B>
+
+<DD>
+If set, any trap on <B>ERR</B> is inherited by shell functions, command
+substitutions, and commands executed in a subshell environment.
+The <B>ERR</B> trap is normally not inherited in such cases.
+<DT><B>-H</B>
+
+<DD>
+Enable
+<B>!</B>
+
+style history substitution.  This option is on by
+default when the shell is interactive.
+<DT><B>-P</B>
+
+<DD>
+If set, the shell does not follow symbolic links when executing
+commands such as
+<B>cd</B>
+
+that change the current working directory.  It uses the
+physical directory structure instead.  By default,
+<B>bash</B>
+
+follows the logical chain of directories when performing commands
+which change the current directory.
+<DT><B>-T</B>
+
+<DD>
+If set, any trap on <B>DEBUG</B> is inherited by shell functions, command
+substitutions, and commands executed in a subshell environment.
+The <B>DEBUG</B> trap is normally not inherited in such cases.
+<DT><B>--</B>
+
+<DD>
+If no arguments follow this option, then the positional parameters are
+unset.  Otherwise, the positional parameters are set to the
+<I>arg</I>s, even if some of them begin with a
+<B>-</B>.
+
+<DT><B>-</B>
+
+<DD>
+Signal the end of options, cause all remaining <I>arg</I>s to be
+assigned to the positional parameters.  The
+<B>-x</B>
+
+and
+<B>-v</B>
+
+options are turned off.
+If there are no <I>arg</I>s,
+the positional parameters remain unchanged.
+
+</DL>
+<P>
+
+The options are off by default unless otherwise noted.
+Using + rather than - causes these options to be turned off.
+The options can also be specified as arguments to an invocation of
+the shell.
+The current set of options may be found in
+<B>$-</B>.
+
+The return status is always true unless an invalid option is encountered.
+</DL>
+
+<DT><B>shift</B> [<I>n</I>]<DD>
+The positional parameters from <I>n</I>+1 ... are renamed to
+<B>$1</B>
+
+<B>....</B>
+
+Parameters represented by the numbers <B>$#</B>
+down to <B>$#</B>-<I>n</I>+1 are unset.
+<I>n</I>
+
+must be a non-negative number less than or equal to <B>$#</B>.
+If
+<I>n</I>
+
+is 0, no parameters are changed.
+If
+<I>n </I>
+
+is not given, it is assumed to be 1.
+If
+<I>n</I>
+
+is greater than <B>$#</B>, the positional parameters are not changed.
+The return status is greater than zero if
+<I>n</I>
+
+is greater than
+<B>$#</B>
+
+or less than zero; otherwise 0.
+<DT><B>shopt</B> [<B>-pqsu</B>] [<B>-o</B>] [<I>optname</I> ...]<DD>
+Toggle the values of variables controlling optional shell behavior.
+With no options, or with the
+<B>-p</B>
+
+option, a list of all settable options is displayed, with
+an indication of whether or not each is set.
+The <B>-p</B> option causes output to be displayed in a form that
+may be reused as input.
+Other options have the following meanings:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-s</B>
+
+<DD>
+Enable (set) each <I>optname</I>.
+<DT><B>-u</B>
+
+<DD>
+Disable (unset) each <I>optname</I>.
+<DT><B>-q</B>
+
+<DD>
+Suppresses normal output (quiet mode); the return status indicates
+whether the <I>optname</I> is set or unset.
+If multiple <I>optname</I> arguments are given with
+<B>-q</B>,
+
+the return status is zero if all <I>optnames</I> are enabled; non-zero
+otherwise.
+<DT><B>-o</B>
+
+<DD>
+Restricts the values of <I>optname</I> to be those defined for the
+<B>-o</B>
+
+option to the
+<B>set</B>
+
+builtin.
+
+</DL>
+<P>
+
+If either
+<B>-s</B>
+
+or
+<B>-u</B>
+
+is used with no <I>optname</I> arguments, the display is limited to
+those options which are set or unset, respectively.
+Unless otherwise noted, the <B>shopt</B> options are disabled (unset)
+by default.
+<P>
+
+The return status when listing options is zero if all <I>optnames</I>
+are enabled, non-zero otherwise.  When setting or unsetting options,
+the return status is zero unless an <I>optname</I> is not a valid shell
+option.
+<P>
+
+The list of <B>shopt</B> options is:
+<P>
+
+
+
+<DL COMPACT>
+<DT><B>cdable_vars</B>
+
+<DD>
+If set, an argument to the
+<B>cd</B>
+
+builtin command that
+is not a directory is assumed to be the name of a variable whose
+value is the directory to change to.
+<DT><B>cdspell</B>
+
+<DD>
+If set, minor errors in the spelling of a directory component in a
+<B>cd</B>
+
+command will be corrected.
+The errors checked for are transposed characters,
+a missing character, and one character too many.
+If a correction is found, the corrected file name is printed,
+and the command proceeds.
+This option is only used by interactive shells.
+<DT><B>checkhash</B>
+
+<DD>
+If set, <B>bash</B> checks that a command found in the hash
+table exists before trying to execute it.  If a hashed command no
+longer exists, a normal path search is performed.
+<DT><B>checkwinsize</B>
+
+<DD>
+If set, <B>bash</B> checks the window size after each command
+and, if necessary, updates the values of
+<FONT SIZE=-1><B>LINES</B>
+
+</FONT>
+and
+<FONT SIZE=-1><B>COLUMNS</B>.
+
+</FONT>
+<DT><B>cmdhist</B>
+
+<DD>
+If set,
+<B>bash</B>
+
+attempts to save all lines of a multiple-line
+command in the same history entry.  This allows
+easy re-editing of multi-line commands.
+<DT><B>dotglob</B>
+
+<DD>
+If set, 
+<B>bash</B>
+
+includes filenames beginning with a `.' in the results of pathname
+expansion.
+<DT><B>execfail</B>
+
+<DD>
+If set, a non-interactive shell will not exit if
+it cannot execute the file specified as an argument to the
+<B>exec</B>
+
+builtin command.  An interactive shell does not exit if
+<B>exec</B>
+
+fails.
+<DT><B>expand_aliases</B>
+
+<DD>
+If set, aliases are expanded as described above under
+<FONT SIZE=-1><B>ALIASES</B>.
+
+</FONT>
+This option is enabled by default for interactive shells.
+<DT><B>extdebug</B>
+
+<DD>
+If set, behavior intended for use by debuggers is enabled:
+<DL COMPACT><DT><DD>
+<DL COMPACT>
+<DT><B>1.</B>
+
+<DD>
+The <B>-F</B> option to the <B>declare</B> builtin displays the source
+file name and line number corresponding to each function name supplied
+as an argument.
+<DT><B>2.</B>
+
+<DD>
+If the command run by the <B>DEBUG</B> trap returns a non-zero value, the
+next command is skipped and not executed.
+<DT><B>3.</B>
+
+<DD>
+If the command run by the <B>DEBUG</B> trap returns a value of 2, and the
+shell is executing in a subroutine (a shell function or a shell script
+executed by the <B>.</B> or <B>source</B> builtins), a call to
+<B>return</B> is simulated.
+</DL></DL>
+
+<DT><B>extglob</B>
+
+<DD>
+If set, the extended pattern matching features described above under
+<B>Pathname Expansion</B> are enabled.
+<DT><B>extquote</B>
+
+<DD>
+If set, <B>$</B>'<I>string</I>' and <B>$</B>&quot;<I>string</I>&quot; quoting is
+performed within <B>${</B><I>parameter</I><B>}</B> expansions
+enclosed in double quotes.  This option is enabled by default.
+<DT><B>failglob</B>
+
+<DD>
+If set, patterns which fail to match filenames during pathname expansion
+result in an expansion error.
+<DT><B>force_fignore</B>
+
+<DD>
+If set, the suffixes specified by the <B>FIGNORE</B> shell variable
+cause words to be ignored when performing word completion even if
+the ignored words are the only possible completions.
+See
+<FONT SIZE=-1><B>SHELL VARIABLES</B></FONT>
+above for a description of <B>FIGNORE</B>.
+This option is enabled by default.
+<DT><B>gnu_errfmt</B>
+
+<DD>
+If set, shell error messages are written in the standard GNU error
+message format.
+<DT><B>histappend</B>
+
+<DD>
+If set, the history list is appended to the file named by the value
+of the
+<B>HISTFILE</B>
+
+variable when the shell exits, rather than overwriting the file.
+<DT><B>histreedit</B>
+
+<DD>
+If set, and
+<B>readline</B>
+
+is being used, a user is given the opportunity to re-edit a
+failed history substitution.
+<DT><B>histverify</B>
+
+<DD>
+If set, and 
+<B>readline</B>
+
+is being used, the results of history substitution are not immediately
+passed to the shell parser.  Instead, the resulting line is loaded into
+the <B>readline</B> editing buffer, allowing further modification.
+<DT><B>hostcomplete</B>
+
+<DD>
+If set, and
+<B>readline</B>
+
+is being used, <B>bash</B> will attempt to perform hostname completion when a
+word containing a <B>@</B> is being completed (see
+<B>Completing</B>
+
+under
+<FONT SIZE=-1><B>READLINE</B>
+
+</FONT>
+above).
+This is enabled by default.
+<DT><B>huponexit</B>
+
+<DD>
+If set, <B>bash</B> will send
+<FONT SIZE=-1><B>SIGHUP</B>
+
+</FONT>
+to all jobs when an interactive login shell exits.
+<DT><B>interactive_comments</B>
+
+<DD>
+If set, allow a word beginning with
+<B>#</B>
+
+to cause that word and all remaining characters on that
+line to be ignored in an interactive shell (see
+<FONT SIZE=-1><B>COMMENTS</B>
+
+</FONT>
+above).  This option is enabled by default.
+<DT><B>lithist</B>
+
+<DD>
+If set, and the
+<B>cmdhist</B>
+
+option is enabled, multi-line commands are saved to the history with
+embedded newlines rather than using semicolon separators where possible.
+<DT><B>login_shell</B>
+
+<DD>
+The shell sets this option if it is started as a login shell (see
+<FONT SIZE=-1><B>INVOCATION</B>
+
+</FONT>
+above).
+The value may not be changed.
+<DT><B>mailwarn</B>
+
+<DD>
+If set, and a file that <B>bash</B> is checking for mail has been  
+accessed since the last time it was checked, the message ``The mail in
+<I>mailfile</I> has been read'' is displayed.
+<DT><B>no_empty_cmd_completion</B>
+
+<DD>
+If set, and
+<B>readline</B>
+
+is being used,
+<B>bash</B>
+
+will not attempt to search the <B>PATH</B> for possible completions when
+completion is attempted on an empty line.
+<DT><B>nocaseglob</B>
+
+<DD>
+If set,
+<B>bash</B>
+
+matches filenames in a case-insensitive fashion when performing pathname
+expansion (see
+<B>Pathname Expansion</B>
+
+above).
+<DT><B>nullglob</B>
+
+<DD>
+If set,
+<B>bash</B>
+
+allows patterns which match no
+files (see
+<B>Pathname Expansion</B>
+
+above)
+to expand to a null string, rather than themselves.
+<DT><B>progcomp</B>
+
+<DD>
+If set, the programmable completion facilities (see
+<B>Programmable Completion</B> above) are enabled.
+This option is enabled by default.
+<DT><B>promptvars</B>
+
+<DD>
+If set, prompt strings undergo
+parameter expansion, command substitution, arithmetic
+expansion, and quote removal after being expanded as described in
+<FONT SIZE=-1><B>PROMPTING</B>
+
+</FONT>
+above.  This option is enabled by default.
+<DT><B>restricted_shell</B>
+
+<DD>
+The shell sets this option if it is started in restricted mode (see
+<FONT SIZE=-1><B>RESTRICTED SHELL</B>
+
+</FONT>
+below).
+The value may not be changed.
+This is not reset when the startup files are executed, allowing
+the startup files to discover whether or not a shell is restricted.
+<DT><B>shift_verbose</B>
+
+<DD>
+If set, the
+<B>shift</B>
+
+builtin prints an error message when the shift count exceeds the
+number of positional parameters.
+<DT><B>sourcepath</B>
+
+<DD>
+If set, the
+<B>source</B> (<B>.</B>) builtin uses the value of
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+to find the directory containing the file supplied as an argument.
+This option is enabled by default.
+<DT><B>xpg_echo</B>
+
+<DD>
+If set, the <B>echo</B> builtin expands backslash-escape sequences
+by default.
+</DL></DL>
+
+<DT><B>suspend</B> [<B>-f</B>]<DD>
+Suspend the execution of this shell until it receives a
+<FONT SIZE=-1><B>SIGCONT</B>
+
+</FONT>
+signal.  The
+<B>-f</B>
+
+option says not to complain if this is 
+a login shell; just suspend anyway.  The return status is 0 unless
+the shell is a login shell and
+<B>-f</B>
+
+is not supplied, or if job control is not enabled.
+<DT><B>test</B> <I>expr</I><DD>
+
+<DT><B>[</B> <I>expr</I> <B>]</B><DD>
+Return a status of 0 or 1 depending on
+the evaluation of the conditional expression
+<I>expr</I>.
+
+Each operator and operand must be a separate argument.
+Expressions are composed of the primaries described above under
+<FONT SIZE=-1><B>CONDITIONAL EXPRESSIONS</B>.
+
+</FONT>
+<P>
+
+
+Expressions may be combined using the following operators, listed
+in decreasing order of precedence.
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>! </B><I>expr</I>
+
+<DD>
+True if
+<I>expr</I>
+
+is false.
+<DT><B>( </B><I>expr</I> )
+
+<DD>
+Returns the value of <I>expr</I>.
+This may be used to override the normal precedence of operators.
+<DT><I>expr1</I> -<B>a</B> <I>expr2</I><DD>
+True if both
+<I>expr1</I>
+
+and
+<I>expr2</I>
+
+are true.
+<DT><I>expr1</I> -<B>o</B> <I>expr2</I><DD>
+True if either
+<I>expr1</I>
+
+or
+<I>expr2</I>
+
+is true.
+
+</DL>
+<P>
+
+<B>test</B> and <B>[</B> evaluate conditional
+expressions using a set of rules based on the number of arguments.
+<P>
+
+
+
+<DL COMPACT>
+<DT>0 arguments<DD>
+The expression is false.
+<DT>1 argument<DD>
+The expression is true if and only if the argument is not null.
+<DT>2 arguments<DD>
+If the first argument is <B>!</B>, the expression is true if and
+only if the second argument is null.
+If the first argument is one of the unary conditional operators listed above
+under
+<FONT SIZE=-1><B>CONDITIONAL EXPRESSIONS</B>,
+
+</FONT>
+the expression is true if the unary test is true.
+If the first argument is not a valid unary conditional operator, the expression
+is false.
+<DT>3 arguments<DD>
+If the second argument is one of the binary conditional operators listed above
+under
+<FONT SIZE=-1><B>CONDITIONAL EXPRESSIONS</B>,
+
+</FONT>
+the result of the expression is the result of the binary test using
+the first and third arguments as operands.
+If the first argument is <B>!</B>, the value is the negation of
+the two-argument test using the second and third arguments.
+If the first argument is exactly <B>(</B> and the third argument is
+exactly <B>)</B>, the result is the one-argument test of the second
+argument.
+Otherwise, the expression is false.
+The <B>-a</B> and <B>-o</B> operators are considered binary operators
+in this case.  
+<DT>4 arguments<DD>
+If the first argument is <B>!</B>, the result is the negation of
+the three-argument expression composed of the remaining arguments.
+Otherwise, the expression is parsed and evaluated according to 
+precedence using the rules listed above.
+<DT>5 or more arguments<DD>
+The expression is parsed and evaluated according to precedence
+using the rules listed above.
+</DL></DL>
+
+
+<DT><B>times</B>
+
+<DD>
+Print the accumulated user and system times for the shell and
+for processes run from the shell.  The return status is 0.
+<DT><B>trap</B> [<B>-lp</B>] [<I>arg</I>] [<I>sigspec</I> ...]<DD>
+The command
+<I>arg</I>
+
+is to be read and executed when the shell receives
+signal(s)
+<I>sigspec</I>.
+
+If
+<I>arg</I>
+
+is absent or
+<B>-</B>,
+
+all specified signals are
+reset to their original values (the values they had
+upon entrance to the shell).
+If 
+<I>arg</I>
+
+is the null string the signal specified by each
+<I>sigspec</I>
+
+is ignored by the shell and by the commands it invokes.
+If
+<I>arg</I>
+
+is not present and
+<B>-p</B>
+
+has been supplied, then the trap commands associated with each
+<I>sigspec</I>
+
+are displayed.
+If no arguments are supplied or if only
+<B>-p</B>
+
+is given,
+<B>trap</B>
+
+prints the list of commands associated with each signal number.
+The
+<B>-l</B>
+
+option causes the shell to print a list of signal names and
+their corresponding numbers.
+Each
+<I>sigspec</I>
+
+is either
+a signal name defined in &lt;<I>signal.h</I>&gt;, or a signal number.
+If a
+<I>sigspec</I>
+
+is
+<FONT SIZE=-1><B>EXIT</B>
+
+</FONT>
+(0) the command
+<I>arg</I>
+
+is executed on exit from the shell.
+If a
+<I>sigspec</I>
+
+is
+<FONT SIZE=-1><B>DEBUG</B>,
+
+</FONT>
+the command
+<I>arg</I>
+
+is executed before every <I>simple command</I>, <I>for</I> command,
+<I>case</I> command, <I>select</I> command, every arithmetic <I>for</I>
+command, and before the first command executes in a shell function (see
+<FONT SIZE=-1><B>SHELL GRAMMAR</B>
+
+</FONT>
+above).
+Refer to the description of the <B>extglob</B> option to the
+<B>shopt</B> builtin for details of its effect on the <B>DEBUG</B> trap.
+If a
+<I>sigspec</I>
+
+is
+<FONT SIZE=-1><B>ERR</B>,
+
+</FONT>
+the command
+<I>arg</I>
+
+is executed whenever a simple command has a non-zero exit status,
+subject to the following conditions.
+The
+<FONT SIZE=-1><B>ERR</B>
+
+</FONT>
+trap is not executed if the failed
+command is part of the command list immediately following a
+<B>while</B>
+
+or
+<B>until</B>
+
+keyword, 
+part of the test in an
+<I>if</I>
+
+statement, part of a
+<B>&amp;&amp;</B>
+
+or
+<B>||</B>
+
+list, or if the command's return value is
+being inverted via
+<B>!</B>.
+
+These are the same conditions obeyed by the <B>errexit</B> option.
+If a
+<I>sigspec</I>
+
+is
+<FONT SIZE=-1><B>RETURN</B>,
+
+</FONT>
+the command
+<I>arg</I>
+
+is executed each time a shell function or a script executed with the
+<B>.</B> or <B>source</B> builtins finishes executing.
+Signals ignored upon entry to the shell cannot be trapped or reset.
+Trapped signals are reset to their original values in a child
+process when it is created.
+The return status is false if any
+<I>sigspec</I>
+
+is invalid; otherwise
+<B>trap</B>
+
+returns true.
+<DT><B>type</B> [<B>-aftpP</B>] <I>name</I> [<I>name</I> ...]<DD>
+With no options, 
+indicate how each
+<I>name</I>
+
+would be interpreted if used as a command name.
+If the
+<B>-t</B>
+
+option is used,
+<B>type</B>
+
+prints a string which is one of
+<I>alias</I>,
+
+<I>keyword</I>,
+
+<I>function</I>,
+
+<I>builtin</I>,
+
+or
+<I>file </I>
+
+if
+<I>name</I>
+
+is an alias, shell reserved word, function, builtin, or disk file,
+respectively.
+If the
+<I>name</I>
+
+is not found, then nothing is printed, and an exit status of false
+is returned.
+If the
+<B>-p</B>
+
+option is used,
+<B>type</B>
+
+either returns the name of the disk file
+that would be executed if
+<I>name</I>
+
+were specified as a command name,
+or nothing if
+<TT>type -t name</TT>
+
+would not return
+<I>file</I>.
+
+The
+<B>-P</B>
+
+option forces a
+<FONT SIZE=-1><B>PATH</B>
+
+</FONT>
+search for each <I>name</I>, even if
+<TT>type -t name</TT>
+
+would not return
+<I>file</I>.
+
+If a command is hashed,
+<B>-p</B>
+
+and
+<B>-P</B>
+
+print the hashed value, not necessarily the file that appears
+first in 
+<FONT SIZE=-1><B>PATH</B>.
+
+</FONT>
+If the
+<B>-a</B>
+
+option is used, 
+<B>type</B>
+
+prints all of the places that contain
+an executable named 
+<I>name</I>.
+
+This includes aliases and functions,
+if and only if the 
+<B>-p</B>
+
+option is not also used.
+The table of hashed commands is not consulted
+when using
+<B>-a</B>.
+
+The
+<B>-f</B>
+
+option suppresses shell function lookup, as with the <B>command</B> builtin.
+<B>type</B>
+
+returns true if any of the arguments are found, false if
+none are found.
+<DT><B>ulimit</B> [<B>-SHacdflmnpstuv</B> [<I>limit</I>]]<DD>
+Provides control over the resources available to the shell and to
+processes started by it, on systems that allow such control.
+The <B>-H</B> and <B>-S</B> options specify that the hard or soft limit is
+set for the given resource.  A hard limit cannot be increased once it
+is set; a soft limit may be increased up to the value of the hard limit.
+If neither <B>-H</B> nor <B>-S</B> is specified, both the soft and hard
+limits are set.
+The value of
+<I>limit</I>
+
+can be a number in the unit specified for the resource
+or one of the special values
+<B>hard</B>,
+
+<B>soft</B>,
+
+or
+<B>unlimited</B>,
+
+which stand for the current hard limit, the current soft limit, and
+no limit, respectively.
+If
+<I>limit</I>
+
+is omitted, the current value of the soft limit of the resource is
+printed, unless the <B>-H</B> option is given.  When more than one
+resource is specified, the limit name and unit are printed before the value.
+Other options are interpreted as follows:
+<DL COMPACT><DT><DD>
+
+<DL COMPACT>
+<DT><B>-a</B>
+
+<DD>
+All current limits are reported
+<DT><B>-c</B>
+
+<DD>
+The maximum size of core files created
+<DT><B>-d</B>
+
+<DD>
+The maximum size of a process's data segment
+<DT><B>-f</B>
+
+<DD>
+The maximum size of files created by the shell
+<DT><B>-l</B>
+
+<DD>
+The maximum size that may be locked into memory
+<DT><B>-m</B>
+
+<DD>
+The maximum resident set size
+<DT><B>-n</B>
+
+<DD>
+The maximum number of open file descriptors (most systems do not
+allow this value to be set)
+<DT><B>-p</B>
+
+<DD>
+The pipe size in 512-byte blocks (this may not be set)
+<DT><B>-s</B>
+
+<DD>
+The maximum stack size
+<DT><B>-t</B>
+
+<DD>
+The maximum amount of cpu time in seconds
+<DT><B>-u</B>
+
+<DD>
+The maximum number of processes available to a single user
+<DT><B>-v</B>
+
+<DD>
+The maximum amount of virtual memory available to the shell
+
+</DL>
+<P>
+
+If
+<I>limit</I>
+
+is given, it is the new value of the specified resource (the
+<B>-a</B>
+
+option is display only).
+If no option is given, then
+<B>-f</B>
+
+is assumed.  Values are in 1024-byte increments, except for
+<B>-t</B>,
+
+which is in seconds,
+<B>-p</B>,
+
+which is in units of 512-byte blocks,
+and
+<B>-n</B>
+
+and
+<B>-u</B>,
+
+which are unscaled values.
+The return status is 0 unless an invalid option or argument is supplied,
+or an error occurs while setting a new limit.
+</DL>
+
+<DT><B>umask</B> [<B>-p</B>] [<B>-S</B>] [<I>mode</I>]<DD>
+The user file-creation mask is set to 
+<I>mode</I>.
+
+If
+<I>mode</I>
+
+begins with a digit, it
+is interpreted as an octal number; otherwise
+it is interpreted as a symbolic mode mask similar
+to that accepted by
+<I>chmod</I>(1).
+
+If
+<I>mode</I>
+
+is omitted, the current value of the mask is printed.
+The
+<B>-S</B>
+
+option causes the mask to be printed in symbolic form; the
+default output is an octal number.
+If the
+<B>-p</B>
+
+option is supplied, and
+<I>mode</I>
+
+is omitted, the output is in a form that may be reused as input.
+The return status is 0 if the mode was successfully changed or if
+no <I>mode</I> argument was supplied, and false otherwise.
+<DT><B>unalias</B> [-<B>a</B>] [<I>name</I> ...]<DD>
+Remove each <I>name</I> from the list of defined aliases.  If
+<B>-a</B>
+
+is supplied, all alias definitions are removed.  The return
+value is true unless a supplied
+<I>name</I>
+
+is not a defined alias.
+<DT><B>unset</B> [-<B>fv</B>] [<I>name</I> ...]<DD>
+For each
+<I>name</I>,
+
+remove the corresponding variable or function.
+If no options are supplied, or the
+<B>-v</B>
+
+option is given, each
+<I>name</I>
+
+refers to a shell variable.
+Read-only variables may not be unset.
+If
+<B>-f</B>
+
+is specifed, 
+each
+<I>name</I>
+
+refers to a shell function, and the function definition
+is removed.
+Each unset variable or function is removed from the environment
+passed to subsequent commands.
+If any of
+<FONT SIZE=-1><B>RANDOM</B>,
+
+</FONT>
+<FONT SIZE=-1><B>SECONDS</B>,
+
+</FONT>
+<FONT SIZE=-1><B>LINENO</B>,
+
+</FONT>
+<FONT SIZE=-1><B>HISTCMD</B>,
+
+</FONT>
+<FONT SIZE=-1><B>FUNCNAME</B>,
+
+</FONT>
+<FONT SIZE=-1><B>GROUPS</B>,
+
+</FONT>
+or
+<FONT SIZE=-1><B>DIRSTACK</B>
+
+</FONT>
+are unset, they lose their special properties, even if they are
+subsequently reset.  The exit status is true unless a
+<I>name</I>
+
+is readonly.
+<DT><B>wait</B> [<I>n</I>]<DD>
+Wait for the specified process and return its termination
+status.
+<I>n</I>
+
+may be a process
+ID or a job specification; if a job spec is given, all processes
+in that job's pipeline are waited for.  If
+<I>n</I>
+
+is not given, all currently active child processes
+are waited for, and the return status is zero.  If
+<I>n</I>
+
+specifies a non-existent process or job, the return status is
+127.  Otherwise, the return status is the exit status of the last
+process or job waited for.
+
+
+</DL>
+<A NAME="lbDA">&nbsp;</A>
+<H2>RESTRICTED SHELL</H2>
+
+
+
+<P>
+
+If
+<B>bash</B>
+
+is started with the name
+<B>rbash</B>,
+
+or the
+<B>-r</B>
+
+option is supplied at invocation,
+the shell becomes restricted.
+A restricted shell is used to
+set up an environment more controlled than the standard shell.
+It behaves identically to
+<B>bash</B>
+
+with the exception that the following are disallowed or not performed:
+<DL COMPACT>
+<DT>*<DD>
+changing directories with <B>cd</B>
+<DT>*<DD>
+setting or unsetting the values of
+<B>SHELL</B>,
+
+<B>PATH</B>,
+
+<B>ENV</B>,
+
+or
+<B>BASH_ENV</B>
+
+<DT>*<DD>
+specifying command names containing
+<B>/</B>
+
+<DT>*<DD>
+specifying a file name containing a
+<B>/</B>
+
+as an argument to the
+<B>.</B>
+
+builtin command
+<DT>*<DD>
+Specifying a filename containing a slash as an argument to the
+<B>-p</B>
+
+option to the
+<B>hash</B>
+
+builtin command
+<DT>*<DD>
+importing function definitions from the shell environment at startup
+<DT>*<DD>
+parsing the value of <B>SHELLOPTS</B> from the shell environment at startup
+<DT>*<DD>
+redirecting output using the &gt;, &gt;|, &lt;&gt;, &gt;&amp;, &amp;&gt;, and &gt;&gt; redirection operators
+<DT>*<DD>
+using the
+<B>exec</B>
+
+builtin command to replace the shell with another command
+<DT>*<DD>
+adding or deleting builtin commands with the
+<B>-f</B>
+
+and
+<B>-d</B>
+
+options to the
+<B>enable</B>
+
+builtin command
+<DT>*<DD>
+Using the <B>enable</B> builtin command to enable disabled shell builtins
+<DT>*<DD>
+specifying the
+<B>-p</B>
+
+option to the
+<B>command</B>
+
+builtin command
+<DT>*<DD>
+turning off restricted mode with
+<B>set +r</B> or <B>set +o restricted</B>.
+</DL>
+<P>
+
+These restrictions are enforced after any startup files are read.
+<P>
+
+When a command that is found to be a shell script is executed (see
+<FONT SIZE=-1><B>COMMAND EXECUTION</B>
+
+</FONT>
+above),
+<B>rbash</B>
+
+turns off any restrictions in the shell spawned to execute the
+script.
+
+
+<A NAME="lbDB">&nbsp;</A>
+<H2>SEE ALSO</H2>
+
+
+<DL COMPACT>
+<DT><I>Bash Reference Manual</I>, Brian Fox and Chet Ramey<DD>
+<DT><I>The Gnu Readline Library</I>, Brian Fox and Chet Ramey<DD>
+<DT><I>The Gnu History Library</I>, Brian Fox and Chet Ramey<DD>
+<DT><I>Portable Operating System Interface (POSIX) Part 2: Shell and Utilities</I>, IEEE<DD>
+<DT><I>sh</I>(1), <I>ksh</I>(1), <I>csh</I>(1)<DD>
+<DT><I>emacs</I>(1), <I>vi</I>(1)<DD>
+<DT><I>readline</I>(3)<DD>
+
+</DL>
+<A NAME="lbDC">&nbsp;</A>
+<H2>FILES</H2>
+
+
+<DL COMPACT>
+<DT>
+<A HREF="file:/bin/bash"><I>/bin/bash</I></A>
+
+<DD>
+The <B>bash</B> executable
+<DT>
+<A HREF="file:/etc/profile"><I>/etc/profile</I></A>
+
+<DD>
+The systemwide initialization file, executed for login shells
+<DT>
+<A HREF="file:~/.bash_profile"><I>~/.bash_profile</I></A>
+
+<DD>
+The personal initialization file, executed for login shells
+<DT>
+<A HREF="file:~/.bashrc"><I>~/.bashrc</I></A>
+
+<DD>
+The individual per-interactive-shell startup file
+<DT>
+<A HREF="file:~/.bash_logout"><I>~/.bash_logout</I></A>
+
+<DD>
+The individual login shell cleanup file, executed when a login shell exits
+<DT>
+<A HREF="file:~/.inputrc"><I>~/.inputrc</I></A>
+
+<DD>
+Individual <I>readline</I> initialization file
+
+</DL>
+<A NAME="lbDD">&nbsp;</A>
+<H2>AUTHORS</H2>
+
+Brian Fox, Free Software Foundation
+<BR>
+
+<A HREF="mailto:bfox@gnu.org">bfox@gnu.org</A>
+<P>
+
+Chet Ramey, Case Western Reserve University
+<BR>
+
+<A HREF="mailto:chet@po.CWRU.Edu">chet@po.CWRU.Edu</A>
+<A NAME="lbDE">&nbsp;</A>
+<H2>BUG REPORTS</H2>
+
+If you find a bug in
+<B>bash,</B>
+
+you should report it.  But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of
+<B>bash</B>.
+
+The latest version is always available from
+<I><A HREF="ftp://ftp.gnu.org/pub/bash/">ftp://ftp.gnu.org/pub/bash/</A></I>.
+<P>
+
+Once you have determined that a bug actually exists, use the
+<I>bashbug</I>
+
+command to submit a bug report.
+If you have a fix, you are encouraged to mail that as well!
+Suggestions and `philosophical' bug reports may be mailed
+to <I><A HREF="mailto:bug-bash@gnu.org">bug-bash@gnu.org</A></I> or posted to the Usenet
+newsgroup
+<A HREF="news:gnu.bash.bug">gnu.bash.bug</A>.
+
+<P>
+
+ALL bug reports should include:
+<P>
+
+
+<DL COMPACT>
+<DT>The version number of <B>bash</B><DD>
+<DT>The hardware and operating system<DD>
+<DT>The compiler used to compile<DD>
+<DT>A description of the bug behaviour<DD>
+<DT>A short script or `recipe' which exercises the bug<DD>
+
+</DL>
+<P>
+
+<I>bashbug</I>
+
+inserts the first three items automatically into the template
+it provides for filing a bug report.
+<P>
+
+Comments and bug reports concerning
+this manual page should be directed to
+<I><A HREF="mailto:chet@po.CWRU.Edu">chet@po.CWRU.Edu</A></I>.
+
+<A NAME="lbDF">&nbsp;</A>
+<H2>BUGS</H2>
+
+<P>
+
+It's too big and too slow.
+<P>
+
+There are some subtle differences between 
+<B>bash</B>
+
+and traditional versions of
+<B>sh</B>,
+
+mostly because of the
+<FONT SIZE=-1><B>POSIX</B>
+
+</FONT>
+specification.
+<P>
+
+Aliases are confusing in some uses.
+<P>
+
+Shell builtin commands and functions are not stoppable/restartable.
+<P>
+
+Compound commands and command sequences of the form `a ; b ; c'
+are not handled gracefully when process suspension is attempted.
+When a process is stopped, the shell immediately executes the next
+command in the sequence.
+It suffices to place the sequence of commands between
+parentheses to force it into a subshell, which may be stopped as
+a unit.
+<P>
+
+Commands inside of <B>$(</B>...<B>)</B> command substitution are not
+parsed until substitution is attempted.  This will delay error
+reporting until some time after the command is entered.
+<P>
+
+Array variables may not (yet) be exported.
+
+
+
+<HR>
+<A NAME="index">&nbsp;</A><H2>Index</H2>
+<DL>
+<DT><A HREF="#lbAB">NAME</A><DD>
+<DT><A HREF="#lbAC">SYNOPSIS</A><DD>
+<DT><A HREF="#lbAD">COPYRIGHT</A><DD>
+<DT><A HREF="#lbAE">DESCRIPTION</A><DD>
+<DT><A HREF="#lbAF">OPTIONS</A><DD>
+<DT><A HREF="#lbAG">ARGUMENTS</A><DD>
+<DT><A HREF="#lbAH">INVOCATION</A><DD>
+<DT><A HREF="#lbAI">DEFINITIONS</A><DD>
+<DT><A HREF="#lbAJ">RESERVED WORDS</A><DD>
+<DT><A HREF="#lbAK">SHELL GRAMMAR</A><DD>
+<DL>
+<DT><A HREF="#lbAL">Simple Commands</A><DD>
+<DT><A HREF="#lbAM">Pipelines</A><DD>
+<DT><A HREF="#lbAN">Lists</A><DD>
+<DT><A HREF="#lbAO">Compound Commands</A><DD>
+<DT><A HREF="#lbAP">Shell Function Definitions</A><DD>
+</DL>
+<DT><A HREF="#lbAQ">COMMENTS</A><DD>
+<DT><A HREF="#lbAR">QUOTING</A><DD>
+<DT><A HREF="#lbAS">PARAMETERS</A><DD>
+<DL>
+<DT><A HREF="#lbAT">Positional Parameters</A><DD>
+<DT><A HREF="#lbAU">Special Parameters</A><DD>
+<DT><A HREF="#lbAV">Shell Variables</A><DD>
+<DT><A HREF="#lbAW">Arrays</A><DD>
+</DL>
+<DT><A HREF="#lbAX">EXPANSION</A><DD>
+<DL>
+<DT><A HREF="#lbAY">Brace Expansion</A><DD>
+<DT><A HREF="#lbAZ">Tilde Expansion</A><DD>
+<DT><A HREF="#lbBA">Parameter Expansion</A><DD>
+<DT><A HREF="#lbBB">Command Substitution</A><DD>
+<DT><A HREF="#lbBC">Arithmetic Expansion</A><DD>
+<DT><A HREF="#lbBD">Process Substitution</A><DD>
+<DT><A HREF="#lbBE">Word Splitting</A><DD>
+<DT><A HREF="#lbBF">Pathname Expansion</A><DD>
+<DT><A HREF="#lbBG">Quote Removal</A><DD>
+</DL>
+<DT><A HREF="#lbBH">REDIRECTION</A><DD>
+<DL>
+<DT><A HREF="#lbBI">Redirecting Input</A><DD>
+<DT><A HREF="#lbBJ">Redirecting Output</A><DD>
+<DT><A HREF="#lbBK">Appending Redirected Output</A><DD>
+<DT><A HREF="#lbBL">Redirecting Standard Output and Standard Error</A><DD>
+<DT><A HREF="#lbBM">Here Documents</A><DD>
+<DT><A HREF="#lbBN">Here Strings</A><DD>
+<DT><A HREF="#lbBO">Duplicating File Descriptors</A><DD>
+<DT><A HREF="#lbBP">Moving File Descriptors</A><DD>
+<DT><A HREF="#lbBQ">Opening File Descriptors for Reading and Writing</A><DD>
+</DL>
+<DT><A HREF="#lbBR">ALIASES</A><DD>
+<DT><A HREF="#lbBS">FUNCTIONS</A><DD>
+<DT><A HREF="#lbBT">ARITHMETIC EVALUATION</A><DD>
+<DT><A HREF="#lbBU">CONDITIONAL EXPRESSIONS</A><DD>
+<DT><A HREF="#lbBV">SIMPLE COMMAND EXPANSION</A><DD>
+<DT><A HREF="#lbBW">COMMAND EXECUTION</A><DD>
+<DT><A HREF="#lbBX">COMMAND EXECUTION ENVIRONMENT</A><DD>
+<DT><A HREF="#lbBY">ENVIRONMENT</A><DD>
+<DT><A HREF="#lbBZ">EXIT STATUS</A><DD>
+<DT><A HREF="#lbCA">SIGNALS</A><DD>
+<DT><A HREF="#lbCB">JOB CONTROL</A><DD>
+<DT><A HREF="#lbCC">PROMPTING</A><DD>
+<DT><A HREF="#lbCD">READLINE</A><DD>
+<DL>
+<DT><A HREF="#lbCE">Readline Notation</A><DD>
+<DT><A HREF="#lbCF">Readline Initialization</A><DD>
+<DT><A HREF="#lbCG">Readline Key Bindings</A><DD>
+<DT><A HREF="#lbCH">Readline Variables</A><DD>
+<DT><A HREF="#lbCI">Readline Conditional Constructs</A><DD>
+<DT><A HREF="#lbCJ">Searching</A><DD>
+<DT><A HREF="#lbCK">Readline Command Names</A><DD>
+<DT><A HREF="#lbCL">Commands for Moving</A><DD>
+<DT><A HREF="#lbCM">Commands for Manipulating the History</A><DD>
+<DT><A HREF="#lbCN">Commands for Changing Text</A><DD>
+<DT><A HREF="#lbCO">Killing and Yanking</A><DD>
+<DT><A HREF="#lbCP">Numeric Arguments</A><DD>
+<DT><A HREF="#lbCQ">Completing</A><DD>
+<DT><A HREF="#lbCR">Keyboard Macros</A><DD>
+<DT><A HREF="#lbCS">Miscellaneous</A><DD>
+<DT><A HREF="#lbCT">Programmable Completion</A><DD>
+</DL>
+<DT><A HREF="#lbCU">HISTORY</A><DD>
+<DT><A HREF="#lbCV">HISTORY EXPANSION</A><DD>
+<DL>
+<DT><A HREF="#lbCW">Event Designators</A><DD>
+<DT><A HREF="#lbCX">Word Designators</A><DD>
+<DT><A HREF="#lbCY">Modifiers</A><DD>
+</DL>
+<DT><A HREF="#lbCZ">SHELL BUILTIN COMMANDS</A><DD>
+<DT><A HREF="#lbDA">RESTRICTED SHELL</A><DD>
+<DT><A HREF="#lbDB">SEE ALSO</A><DD>
+<DT><A HREF="#lbDC">FILES</A><DD>
+<DT><A HREF="#lbDD">AUTHORS</A><DD>
+<DT><A HREF="#lbDE">BUG REPORTS</A><DD>
+<DT><A HREF="#lbDF">BUGS</A><DD>
+</DL>
+<HR>
+This document was created by man2html from bash.1.<BR>
+Time: 13 November 2003 09:47:50 EST
+</BODY>
+</HTML>
diff --git a/doc/bash.info b/doc/bash.info
new file mode 100644 (file)
index 0000000..65eae6f
--- /dev/null
@@ -0,0 +1,9249 @@
+This is bash.info, produced by makeinfo version 4.5 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 3.0-alpha, 29 May 2003).
+
+   This is Edition 3.0, last updated 29 May 2003, of `The GNU Bash
+Reference Manual', for `Bash', Version 3.0-alpha.
+
+   Copyright (C) 1988-2003 Free Software Foundation, Inc.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.1 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual," and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License."
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+   
+INFO-DIR-SECTION Basics
+START-INFO-DIR-ENTRY
+* Bash: (bash).                     The GNU Bourne-Again SHell.
+END-INFO-DIR-ENTRY
+
+\1f
+File: bash.info,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
+
+Bash Features
+*************
+
+   This text is a brief description of the features that are present in
+the Bash shell (version 3.0-alpha, 29 May 2003)..
+
+   This is Edition 3.0, last updated 29 May 2003, of `The GNU Bash
+Reference Manual', for `Bash', Version 3.0-alpha.
+
+   Bash contains features that appear in other popular shells, and some
+features that only appear in Bash.  Some of the shells that Bash has
+borrowed concepts from are the Bourne Shell (`sh'), the Korn Shell
+(`ksh'), and the C-shell (`csh' and its successor, `tcsh'). The
+following menu breaks the features up into categories based upon which
+one of these other shells inspired the feature.
+
+   This manual is meant as a brief introduction to features found in
+Bash.  The Bash manual page should be used as the definitive reference
+on shell behavior.
+
+* Menu:
+
+* Introduction::               An introduction to the shell.
+
+* Definitions::                        Some definitions used in the rest of this
+                               manual.
+
+* Basic Shell Features::       The shell "building blocks".
+
+* Shell Builtin Commands::     Commands that are a part of the shell.
+
+* Shell Variables::            Variables used or set by Bash.
+
+* Bash Features::              Features found only in Bash.
+
+* Job Control::                        A chapter describing what job control is
+                               and how Bash allows you to use it.
+
+* Using History Interactively::        Chapter dealing with history expansion
+                               rules.
+
+* Command Line Editing::       Chapter describing the command line
+                               editing features.
+
+* Installing Bash::            How to build and install Bash on your system.
+
+* Reporting Bugs::             How to report bugs in Bash.
+
+* Major Differences From The Bourne Shell::    A terse list of the differences
+                                               between Bash and historical
+                                               versions of /bin/sh.
+
+* Copying This Manual::                Copying this manual.
+
+* Builtin Index::              Index of Bash builtin commands.
+
+* Reserved Word Index::                Index of Bash reserved words.
+
+* Variable Index::             Quick reference helps you find the
+                               variable you want.
+
+* Function Index::             Index of bindable Readline functions.
+
+* Concept Index::              General index for concepts described in
+                               this manual.
+
+\1f
+File: bash.info,  Node: Introduction,  Next: Definitions,  Prev: Top,  Up: Top
+
+Introduction
+************
+
+* Menu:
+
+* What is Bash?::              A short description of Bash.
+
+* What is a shell?::           A brief introduction to shells.
+
+\1f
+File: bash.info,  Node: What is Bash?,  Next: What is a shell?,  Up: Introduction
+
+What is Bash?
+=============
+
+   Bash is the shell, or command language interpreter, for the GNU
+operating system.  The name is an acronym for the `Bourne-Again SHell',
+a pun on Stephen Bourne, the author of the direct ancestor of the
+current Unix shell `/bin/sh', which appeared in the Seventh Edition
+Bell Labs Research version of Unix.
+
+   Bash is largely compatible with `sh' and incorporates useful
+features from the Korn shell `ksh' and the C shell `csh'.  It is
+intended to be a conformant implementation of the IEEE POSIX Shell and
+Tools specification (IEEE Working Group 1003.2).  It offers functional
+improvements over `sh' for both interactive and programming use.
+
+   While the GNU operating system provides other shells, including a
+version of `csh', Bash is the default shell.  Like other GNU software,
+Bash is quite portable.  It currently runs on nearly every version of
+Unix and a few other operating systems - independently-supported ports
+exist for MS-DOS, OS/2, Windows 95/98, and Windows NT.
+
+\1f
+File: bash.info,  Node: What is a shell?,  Prev: What is Bash?,  Up: Introduction
+
+What is a shell?
+================
+
+   At its base, a shell is simply a macro processor that executes
+commands.  A Unix shell is both a command interpreter, which provides
+the user interface to the rich set of GNU utilities, and a programming
+language, allowing these utilitites to be combined.  Files containing
+commands can be created, and become commands themselves.  These new
+commands have the same status as system commands in directories such as
+`/bin', allowing users or groups to establish custom environments.
+
+   A shell allows execution of GNU commands, both synchronously and
+asynchronously.  The shell waits for synchronous commands to complete
+before accepting more input; asynchronous commands continue to execute
+in parallel with the shell while it reads and executes additional
+commands.  The "redirection" constructs permit fine-grained control of
+the input and output of those commands.  Moreover, the shell allows
+control over the contents of commands' environments.  Shells may be
+used interactively or non-interactively: they accept input typed from
+the keyboard or from a file.
+
+   Shells also provide a small set of built-in commands ("builtins")
+implementing functionality impossible or inconvenient to obtain via
+separate utilities.  For example, `cd', `break', `continue', and
+`exec') cannot be implemented outside of the shell because they
+directly manipulate the shell itself.  The `history', `getopts',
+`kill', or `pwd' builtins, among others, could be implemented in
+separate utilities, but they are more convenient to use as builtin
+commands.  All of the shell builtins are described in subsequent
+sections.
+
+   While executing commands is essential, most of the power (and
+complexity) of shells is due to their embedded programming languages.
+Like any high-level language, the shell provides variables, flow
+control constructs, quoting, and functions.
+
+   Shells offer features geared specifically for interactive use rather
+than to augment the programming language.  These interactive features
+include job control, command line editing, history and aliases.  Each
+of these features is described in this manual.
+
+\1f
+File: bash.info,  Node: Definitions,  Next: Basic Shell Features,  Prev: Introduction,  Up: Top
+
+Definitions
+***********
+
+   These definitions are used throughout the remainder of this manual.
+
+`POSIX'
+     A family of open system standards based on Unix.  Bash is
+     concerned with POSIX 1003.2, the Shell and Tools Standard.
+
+`blank'
+     A space or tab character.
+
+`builtin'
+     A command that is implemented internally by the shell itself,
+     rather than by an executable program somewhere in the file system.
+
+`control operator'
+     A `word' that performs a control function.  It is a `newline' or
+     one of the following: `||', `&&', `&', `;', `;;', `|', `(', or `)'.
+
+`exit status'
+     The value returned by a command to its caller.  The value is
+     restricted to eight bits, so the maximum value is 255.
+
+`field'
+     A unit of text that is the result of one of the shell expansions.
+     After expansion, when executing a command, the resulting fields
+     are used as the command name and arguments.
+
+`filename'
+     A string of characters used to identify a file.
+
+`job'
+     A set of processes comprising a pipeline, and any processes
+     descended from it, that are all in the same process group.
+
+`job control'
+     A mechanism by which users can selectively stop (suspend) and
+     restart (resume) execution of processes.
+
+`metacharacter'
+     A character that, when unquoted, separates words.  A metacharacter
+     is a `blank' or one of the following characters: `|', `&', `;',
+     `(', `)', `<', or `>'.
+
+`name'
+     A `word' consisting solely of letters, numbers, and underscores,
+     and beginning with a letter or underscore.  `Name's are used as
+     shell variable and function names.  Also referred to as an
+     `identifier'.
+
+`operator'
+     A `control operator' or a `redirection operator'.  *Note
+     Redirections::, for a list of redirection operators.
+
+`process group'
+     A collection of related processes each having the same process
+     group ID.
+
+`process group ID'
+     A unique identifer that represents a `process group' during its
+     lifetime.
+
+`reserved word'
+     A `word' that has a special meaning to the shell.  Most reserved
+     words introduce shell flow control constructs, such as `for' and
+     `while'.
+
+`return status'
+     A synonym for `exit status'.
+
+`signal'
+     A mechanism by which a process may be notified by the kernel of an
+     event occurring in the system.
+
+`special builtin'
+     A shell builtin command that has been classified as special by the
+     POSIX 1003.2 standard.
+
+`token'
+     A sequence of characters considered a single unit by the shell.
+     It is either a `word' or an `operator'.
+
+`word'
+     A `token' that is not an `operator'.
+
+\1f
+File: bash.info,  Node: Basic Shell Features,  Next: Shell Builtin Commands,  Prev: Definitions,  Up: Top
+
+Basic Shell Features
+********************
+
+   Bash is an acronym for `Bourne-Again SHell'.  The Bourne shell is
+the traditional Unix shell originally written by Stephen Bourne.  All
+of the Bourne shell builtin commands are available in Bash, and the
+rules for evaluation and quoting are taken from the POSIX 1003.2
+specification for the `standard' Unix shell.
+
+   This chapter briefly summarizes the shell's `building blocks':
+commands, control structures, shell functions, shell parameters, shell
+expansions, redirections, which are a way to direct input and output
+from and to named files, and how the shell executes commands.
+
+* Menu:
+
+* Shell Syntax::               What your input means to the shell.
+* Shell Commands::             The types of commands you can use.
+* Shell Functions::            Grouping commands by name.
+* Shell Parameters::           How the shell stores values.
+* Shell Expansions::           How Bash expands parameters and the various
+                               expansions available.
+* Redirections::               A way to control where input and output go.
+* Executing Commands::         What happens when you run a command.
+* Shell Scripts::              Executing files of shell commands.
+
+\1f
+File: bash.info,  Node: Shell Syntax,  Next: Shell Commands,  Up: Basic Shell Features
+
+Shell Syntax
+============
+
+* Menu:
+
+* Shell Operation::    The basic operation of the shell.
+
+* Quoting::            How to remove the special meaning from characters.
+
+* Comments::           How to specify comments.
+
+   When the shell reads input, it proceeds through a sequence of
+operations.  If the input indicates the beginning of a comment, the
+shell ignores the comment symbol (`#'), and the rest of that line.
+
+   Otherwise, roughly speaking,  the shell reads its input and divides
+the input into words and operators, employing the quoting rules to
+select which meanings to assign various words and characters.
+
+   The shell then parses these tokens into commands and other
+constructs, removes the special meaning of certain words or characters,
+expands others, redirects input and output as needed, executes the
+specified command, waits for the command's exit status, and makes that
+exit status available for further inspection or processing.
+
+\1f
+File: bash.info,  Node: Shell Operation,  Next: Quoting,  Up: Shell Syntax
+
+Shell Operation
+---------------
+
+   The following is a brief description of the shell's operation when it
+reads and executes a command.  Basically, the shell does the following:
+
+  1. Reads its input from a file (*note Shell Scripts::), from a string
+     supplied as an argument to the `-c' invocation option (*note
+     Invoking Bash::), or from the user's terminal.
+
+  2. Breaks the input into words and operators, obeying the quoting
+     rules described in *Note Quoting::.  These tokens are separated by
+     `metacharacters'.  Alias expansion is performed by this step
+     (*note Aliases::).
+
+  3. Parses the tokens into simple and compound commands (*note Shell
+     Commands::).
+
+  4. Performs the various shell expansions (*note Shell Expansions::),
+     breaking the expanded tokens into lists of filenames (*note
+     Filename Expansion::) and commands and arguments.
+
+  5. Performs any necessary redirections (*note Redirections::) and
+     removes the redirection operators and their operands from the
+     argument list.
+
+  6. Executes the command (*note Executing Commands::).
+
+  7. Optionally waits for the command to complete and collects its exit
+     status (*note Exit Status::).
+
+
+\1f
+File: bash.info,  Node: Quoting,  Next: Comments,  Prev: Shell Operation,  Up: Shell Syntax
+
+Quoting
+-------
+
+* Menu:
+
+* Escape Character::   How to remove the special meaning from a single
+                       character.
+* Single Quotes::      How to inhibit all interpretation of a sequence
+                       of characters.
+* Double Quotes::      How to suppress most of the interpretation of a
+                       sequence of characters.
+* ANSI-C Quoting::     How to expand ANSI-C sequences in quoted strings.
+
+* Locale Translation:: How to translate strings into different languages.
+
+   Quoting is used to remove the special meaning of certain characters
+or words to the shell.  Quoting can be used to disable special
+treatment for special characters, to prevent reserved words from being
+recognized as such, and to prevent parameter expansion.
+
+   Each of the shell metacharacters (*note Definitions::) has special
+meaning to the shell and must be quoted if it is to represent itself.
+When the command history expansion facilities are being used, the
+HISTORY EXPANSION character, usually `!', must be quoted to prevent
+history expansion.  *Note Bash History Facilities::, for more details
+concerning history expansion.
+
+   There are three quoting mechanisms: the ESCAPE CHARACTER, single
+quotes, and double quotes.
+
+\1f
+File: bash.info,  Node: Escape Character,  Next: Single Quotes,  Up: Quoting
+
+Escape Character
+................
+
+   A non-quoted backslash `\' is the Bash escape character.  It
+preserves the literal value of the next character that follows, with
+the exception of `newline'.  If a `\newline' pair appears, and the
+backslash itself is not quoted, the `\newline' is treated as a line
+continuation (that is, it is removed from the input stream and
+effectively ignored).
+
+\1f
+File: bash.info,  Node: Single Quotes,  Next: Double Quotes,  Prev: Escape Character,  Up: Quoting
+
+Single Quotes
+.............
+
+   Enclosing characters in single quotes (`'') preserves the literal
+value of each character within the quotes.  A single quote may not occur
+between single quotes, even when preceded by a backslash.
+
+\1f
+File: bash.info,  Node: Double Quotes,  Next: ANSI-C Quoting,  Prev: Single Quotes,  Up: Quoting
+
+Double Quotes
+.............
+
+   Enclosing characters in double quotes (`"') preserves the literal
+value of all characters within the quotes, with the exception of `$',
+``', and `\'.  The characters `$' and ``' retain their special meaning
+within double quotes (*note Shell Expansions::).  The backslash retains
+its special meaning only when followed by one of the following
+characters: `$', ``', `"', `\', or `newline'.  Within double quotes,
+backslashes that are followed by one of these characters are removed.
+Backslashes preceding characters without a special meaning are left
+unmodified.  A double quote may be quoted within double quotes by
+preceding it with a backslash.  When command history is being used, the
+double quote may not be used to quote the history expansion character.
+
+   The special parameters `*' and `@' have special meaning when in
+double quotes (*note Shell Parameter Expansion::).
+
+\1f
+File: bash.info,  Node: ANSI-C Quoting,  Next: Locale Translation,  Prev: Double Quotes,  Up: Quoting
+
+ANSI-C Quoting
+..............
+
+   Words of the form `$'STRING'' are treated specially.  The word
+expands to STRING, with backslash-escaped characters replaced as
+specified by the ANSI C standard.  Backslash escape sequences, if
+present, are decoded as follows:
+
+`\a'
+     alert (bell)
+
+`\b'
+     backspace
+
+`\e'
+     an escape character (not ANSI C)
+
+`\f'
+     form feed
+
+`\n'
+     newline
+
+`\r'
+     carriage return
+
+`\t'
+     horizontal tab
+
+`\v'
+     vertical tab
+
+`\\'
+     backslash
+
+`\''
+     single quote
+
+`\NNN'
+     the eight-bit character whose value is the octal value NNN (one to
+     three digits)
+
+`\xHH'
+     the eight-bit character whose value is the hexadecimal value HH
+     (one or two hex digits)
+
+`\cX'
+     a control-X character
+
+The expanded result is single-quoted, as if the dollar sign had not
+been present.
+
+\1f
+File: bash.info,  Node: Locale Translation,  Prev: ANSI-C Quoting,  Up: Quoting
+
+Locale-Specific Translation
+...........................
+
+   A double-quoted string preceded by a dollar sign (`$') will cause
+the string to be translated according to the current locale.  If the
+current locale is `C' or `POSIX', the dollar sign is ignored.  If the
+string is translated and replaced, the replacement is double-quoted.
+
+   Some systems use the message catalog selected by the `LC_MESSAGES'
+shell variable.  Others create the name of the message catalog from the
+value of the `TEXTDOMAIN' shell variable, possibly adding a suffix of
+`.mo'.  If you use the `TEXTDOMAIN' variable, you may need to set the
+`TEXTDOMAINDIR' variable to the location of the message catalog files.
+Still others use both variables in this fashion:
+`TEXTDOMAINDIR'/`LC_MESSAGES'/LC_MESSAGES/`TEXTDOMAIN'.mo.
+
+\1f
+File: bash.info,  Node: Comments,  Prev: Quoting,  Up: Shell Syntax
+
+Comments
+--------
+
+   In a non-interactive shell, or an interactive shell in which the
+`interactive_comments' option to the `shopt' builtin is enabled (*note
+Bash Builtins::), a word beginning with `#' causes that word and all
+remaining characters on that line to be ignored.  An interactive shell
+without the `interactive_comments' option enabled does not allow
+comments.  The `interactive_comments' option is on by default in
+interactive shells.  *Note Interactive Shells::, for a description of
+what makes a shell interactive.
+
+\1f
+File: bash.info,  Node: Shell Commands,  Next: Shell Functions,  Prev: Shell Syntax,  Up: Basic Shell Features
+
+Shell Commands
+==============
+
+   A simple shell command such as `echo a b c' consists of the command
+itself followed by arguments, separated by spaces.
+
+   More complex shell commands are composed of simple commands arranged
+together in a variety of ways: in a pipeline in which the output of one
+command becomes the input of a second, in a loop or conditional
+construct, or in some other grouping.
+
+* Menu:
+
+* Simple Commands::            The most common type of command.
+* Pipelines::                  Connecting the input and output of several
+                               commands.
+* Lists::                      How to execute commands sequentially.
+* Looping Constructs::         Shell commands for iterative action.
+* Conditional Constructs::     Shell commands for conditional execution.
+* Command Grouping::           Ways to group commands.
+
+\1f
+File: bash.info,  Node: Simple Commands,  Next: Pipelines,  Up: Shell Commands
+
+Simple Commands
+---------------
+
+   A simple command is the kind of command encountered most often.
+It's just a sequence of words separated by `blank's, terminated by one
+of the shell's control operators (*note Definitions::).  The first word
+generally specifies a command to be executed, with the rest of the
+words being that command's arguments.
+
+   The return status (*note Exit Status::) of a simple command is its
+exit status as provided by the POSIX 1003.1 `waitpid' function, or
+128+N if the command was terminated by signal N.
+
+\1f
+File: bash.info,  Node: Pipelines,  Next: Lists,  Prev: Simple Commands,  Up: Shell Commands
+
+Pipelines
+---------
+
+   A `pipeline' is a sequence of simple commands separated by `|'.
+
+   The format for a pipeline is
+     [`time' [`-p']] [`!'] COMMAND1 [`|' COMMAND2 ...]
+
+The output of each command in the pipeline is connected via a pipe to
+the input of the next command.  That is, each command reads the
+previous command's output.
+
+   The reserved word `time' causes timing statistics to be printed for
+the pipeline once it finishes.  The statistics currently consist of
+elapsed (wall-clock) time and user and system time consumed by the
+command's execution.  The `-p' option changes the output format to that
+specified by POSIX.  The `TIMEFORMAT' variable may be set to a format
+string that specifies how the timing information should be displayed.
+*Note Bash Variables::, for a description of the available formats.
+The use of `time' as a reserved word permits the timing of shell
+builtins, shell functions, and pipelines.  An external `time' command
+cannot time these easily.
+
+   If the pipeline is not executed asynchronously (*note Lists::), the
+shell waits for all commands in the pipeline to complete.
+
+   Each command in a pipeline is executed in its own subshell (*note
+Command Execution Environment::).  The exit status of a pipeline is the
+exit status of the last command in the pipeline.  If the reserved word
+`!' precedes the pipeline, the exit status is the logical negation of
+the exit status of the last command.
+
+\1f
+File: bash.info,  Node: Lists,  Next: Looping Constructs,  Prev: Pipelines,  Up: Shell Commands
+
+Lists of Commands
+-----------------
+
+   A `list' is a sequence of one or more pipelines separated by one of
+the operators `;', `&', `&&', or `||', and optionally terminated by one
+of `;', `&', or a `newline'.
+
+   Of these list operators, `&&' and `||' have equal precedence,
+followed by `;' and `&', which have equal precedence.
+
+   A sequence of one or more newlines may appear in a `list' to delimit
+commands, equivalent to a semicolon.
+
+   If a command is terminated by the control operator `&', the shell
+executes the command asynchronously in a subshell.  This is known as
+executing the command in the BACKGROUND.  The shell does not wait for
+the command to finish, and the return status is 0 (true).  When job
+control is not active (*note Job Control::), the standard input for
+asynchronous commands, in the absence of any explicit redirections, is
+redirected from `/dev/null'.
+
+   Commands separated by a `;' are executed sequentially; the shell
+waits for each command to terminate in turn.  The return status is the
+exit status of the last command executed.
+
+   The control operators `&&' and `||' denote AND lists and OR lists,
+respectively.  An AND list has the form
+     COMMAND1 && COMMAND2
+
+COMMAND2 is executed if, and only if, COMMAND1 returns an exit status
+of zero.
+
+   An OR list has the form
+     COMMAND1 || COMMAND2
+
+COMMAND2 is executed if, and only if, COMMAND1 returns a non-zero exit
+status.
+
+   The return status of AND and OR lists is the exit status of the last
+command executed in the list.
+
+\1f
+File: bash.info,  Node: Looping Constructs,  Next: Conditional Constructs,  Prev: Lists,  Up: Shell Commands
+
+Looping Constructs
+------------------
+
+   Bash supports the following looping constructs.
+
+   Note that wherever a `;' appears in the description of a command's
+syntax, it may be replaced with one or more newlines.
+
+`until'
+     The syntax of the `until' command is:
+          until TEST-COMMANDS; do CONSEQUENT-COMMANDS; done
+     Execute CONSEQUENT-COMMANDS as long as TEST-COMMANDS has an exit
+     status which is not zero.  The return status is the exit status of
+     the last command executed in CONSEQUENT-COMMANDS, or zero if none
+     was executed.
+
+`while'
+     The syntax of the `while' command is:
+          while TEST-COMMANDS; do CONSEQUENT-COMMANDS; done
+
+     Execute CONSEQUENT-COMMANDS as long as TEST-COMMANDS has an exit
+     status of zero.  The return status is the exit status of the last
+     command executed in CONSEQUENT-COMMANDS, or zero if none was
+     executed.
+
+`for'
+     The syntax of the `for' command is:
+
+          for NAME [in WORDS ...]; do COMMANDS; done
+     Expand WORDS, and execute COMMANDS once for each member in the
+     resultant list, with NAME bound to the current member.  If `in
+     WORDS' is not present, the `for' command executes the COMMANDS
+     once for each positional parameter that is set, as if `in "$@"'
+     had been specified (*note Special Parameters::).  The return
+     status is the exit status of the last command that executes.  If
+     there are no items in the expansion of WORDS, no commands are
+     executed, and the return status is zero.
+
+     An alternate form of the `for' command is also supported:
+
+          for (( EXPR1 ; EXPR2 ; EXPR3 )) ; do COMMANDS ; done
+     First, the arithmetic expression EXPR1 is evaluated according to
+     the rules described below (*note Shell Arithmetic::).  The
+     arithmetic expression EXPR2 is then evaluated repeatedly until it
+     evaluates to zero.  Each time EXPR2 evaluates to a non-zero value,
+     COMMANDS are executed and the arithmetic expression EXPR3 is
+     evaluated.  If any expression is omitted, it behaves as if it
+     evaluates to 1.  The return value is the exit status of the last
+     command in LIST that is executed, or false if any of the
+     expressions is invalid.
+
+
+   The `break' and `continue' builtins (*note Bourne Shell Builtins::)
+may be used to control loop execution.
+
+\1f
+File: bash.info,  Node: Conditional Constructs,  Next: Command Grouping,  Prev: Looping Constructs,  Up: Shell Commands
+
+Conditional Constructs
+----------------------
+
+`if'
+     The syntax of the `if' command is:
+
+          if TEST-COMMANDS; then
+            CONSEQUENT-COMMANDS;
+          [elif MORE-TEST-COMMANDS; then
+            MORE-CONSEQUENTS;]
+          [else ALTERNATE-CONSEQUENTS;]
+          fi
+
+     The TEST-COMMANDS list is executed, and if its return status is
+     zero, the CONSEQUENT-COMMANDS list is executed.  If TEST-COMMANDS
+     returns a non-zero status, each `elif' list is executed in turn,
+     and if its exit status is zero, the corresponding MORE-CONSEQUENTS
+     is executed and the command completes.  If `else
+     ALTERNATE-CONSEQUENTS' is present, and the final command in the
+     final `if' or `elif' clause has a non-zero exit status, then
+     ALTERNATE-CONSEQUENTS is executed.  The return status is the exit
+     status of the last command executed, or zero if no condition
+     tested true.
+
+`case'
+     The syntax of the `case' command is:
+
+          `case WORD in [ [(] PATTERN [| PATTERN]...) COMMAND-LIST ;;]... esac'
+
+     `case' will selectively execute the COMMAND-LIST corresponding to
+     the first PATTERN that matches WORD.  The `|' is used to separate
+     multiple patterns, and the `)' operator terminates a pattern list.
+     A list of patterns and an associated command-list is known as a
+     CLAUSE.  Each clause must be terminated with `;;'.  The WORD
+     undergoes tilde expansion, parameter expansion, command
+     substitution, arithmetic expansion, and quote removal before
+     matching is attempted.  Each PATTERN undergoes tilde expansion,
+     parameter expansion, command substitution, and arithmetic
+     expansion.
+
+     There may be an arbitrary number of `case' clauses, each terminated
+     by a `;;'.  The first pattern that matches determines the
+     command-list that is executed.
+
+     Here is an example using `case' in a script that could be used to
+     describe one interesting feature of an animal:
+
+          echo -n "Enter the name of an animal: "
+          read ANIMAL
+          echo -n "The $ANIMAL has "
+          case $ANIMAL in
+            horse | dog | cat) echo -n "four";;
+            man | kangaroo ) echo -n "two";;
+            *) echo -n "an unknown number of";;
+          esac
+          echo " legs."
+
+     The return status is zero if no PATTERN is matched.  Otherwise, the
+     return status is the exit status of the COMMAND-LIST executed.
+
+`select'
+     The `select' construct allows the easy generation of menus.  It
+     has almost the same syntax as the `for' command:
+
+          select NAME [in WORDS ...]; do COMMANDS; done
+
+     The list of words following `in' is expanded, generating a list of
+     items.  The set of expanded words is printed on the standard error
+     output stream, each preceded by a number.  If the `in WORDS' is
+     omitted, the positional parameters are printed, as if `in "$@"'
+     had been specifed.  The `PS3' prompt is then displayed and a line
+     is read from the standard input.  If the line consists of a number
+     corresponding to one of the displayed words, then the value of
+     NAME is set to that word.  If the line is empty, the words and
+     prompt are displayed again.  If `EOF' is read, the `select'
+     command completes.  Any other value read causes NAME to be set to
+     null.  The line read is saved in the variable `REPLY'.
+
+     The COMMANDS are executed after each selection until a `break'
+     command is executed, at which point the `select' command completes.
+
+     Here is an example that allows the user to pick a filename from the
+     current directory, and displays the name and index of the file
+     selected.
+
+          select fname in *;
+          do
+               echo you picked $fname \($REPLY\)
+               break;
+          done
+
+`((...))'
+          (( EXPRESSION ))
+
+     The arithmetic EXPRESSION is evaluated according to the rules
+     described below (*note Shell Arithmetic::).  If the value of the
+     expression is non-zero, the return status is 0; otherwise the
+     return status is 1.  This is exactly equivalent to
+          let "EXPRESSION"
+
+     *Note Bash Builtins::, for a full description of the `let' builtin.
+
+`[[...]]'
+          [[ EXPRESSION ]]
+
+     Return a status of 0 or 1 depending on the evaluation of the
+     conditional expression EXPRESSION.  Expressions are composed of
+     the primaries described below in *Note Bash Conditional
+     Expressions::.  Word splitting and filename expansion are not
+     performed on the words between the `[[' and `]]'; tilde expansion,
+     parameter and variable expansion, arithmetic expansion, command
+     substitution, process substitution, and quote removal are
+     performed.  Conditional operators such as `-f' must be unquoted to
+     be recognized as primaries.
+
+     When the `==' and `!=' operators are used, the string to the right
+     of the operator is considered a pattern and matched according to
+     the rules described below in *Note Pattern Matching::.  The return
+     value is 0 if the string matches or does not match the pattern,
+     respectively, and 1 otherwise.  Any part of the pattern may be
+     quoted to force it to be matched as a string.
+
+     Expressions may be combined using the following operators, listed
+     in decreasing order of precedence:
+
+    `( EXPRESSION )'
+          Returns the value of EXPRESSION.  This may be used to
+          override the normal precedence of operators.
+
+    `! EXPRESSION'
+          True if EXPRESSION is false.
+
+    `EXPRESSION1 && EXPRESSION2'
+          True if both EXPRESSION1 and EXPRESSION2 are true.
+
+    `EXPRESSION1 || EXPRESSION2'
+          True if either EXPRESSION1 or EXPRESSION2 is true.
+
+     The `&&' and `||' operators do not evaluate EXPRESSION2 if the
+     value of EXPRESSION1 is sufficient to determine the return value
+     of the entire conditional expression.
+
+
+\1f
+File: bash.info,  Node: Command Grouping,  Prev: Conditional Constructs,  Up: Shell Commands
+
+Grouping Commands
+-----------------
+
+   Bash provides two ways to group a list of commands to be executed as
+a unit.  When commands are grouped, redirections may be applied to the
+entire command list.  For example, the output of all the commands in
+the list may be redirected to a single stream.
+
+`()'
+          ( LIST )
+
+     Placing a list of commands between parentheses causes a subshell
+     to be created, and each of the commands in LIST to be executed in
+     that subshell.  Since the LIST is executed in a subshell, variable
+     assignments do not remain in effect after the subshell completes.
+
+`{}'
+          { LIST; }
+
+     Placing a list of commands between curly braces causes the list to
+     be executed in the current shell context.  No subshell is created.
+     The semicolon (or newline) following LIST is required.
+
+   In addition to the creation of a subshell, there is a subtle
+difference between these two constructs due to historical reasons.  The
+braces are `reserved words', so they must be separated from the LIST by
+`blank's.  The parentheses are `operators', and are recognized as
+separate tokens by the shell even if they are not separated from the
+LIST by whitespace.
+
+   The exit status of both of these constructs is the exit status of
+LIST.
+
+\1f
+File: bash.info,  Node: Shell Functions,  Next: Shell Parameters,  Prev: Shell Commands,  Up: Basic Shell Features
+
+Shell Functions
+===============
+
+   Shell functions are a way to group commands for later execution
+using a single name for the group.  They are executed just like a
+"regular" command.  When the name of a shell function is used as a
+simple command name, the list of commands associated with that function
+name is executed.  Shell functions are executed in the current shell
+context; no new process is created to interpret them.
+
+   Functions are declared using this syntax:
+     [ `function' ] NAME () { COMMAND-LIST; }
+
+   This defines a shell function named NAME.  The reserved word
+`function' is optional.  If the `function' reserved word is supplied,
+the parentheses are optional.  The BODY of the function is the
+COMMAND-LIST between { and }.  This list is executed whenever NAME is
+specified as the name of a command.  The exit status of a function is
+the exit status of the last command executed in the body.
+
+   Note that for historical reasons, the curly braces that surround the
+body of the function must be separated from the body by `blank's or
+newlines.  This is because the braces are reserved words and are only
+recognized as such when they are separated by whitespace.  Also, the
+COMMAND-LIST must be terminated by a semicolon, a `&', or a newline.
+
+   When a function is executed, the arguments to the function become
+the positional parameters during its execution (*note Positional
+Parameters::).  The special parameter `#' that expands to the number of
+positional parameters is updated to reflect the change.  Positional
+parameter `0' is unchanged.  The first element of the `FUNCNAME'
+variable is set to the name of the function while the function is
+executing.  All other aspects of the shell execution environment are
+identical between a function and its caller with the exception that the
+`DEBUG' trap below) is not inherited unless the function has been given
+the `trace' attribute using the `declare' builtin or the `-o functrace'
+option has been enabled with the `set' builtin, (in which case all
+functions inherit the `DEBUG' trap).  *Note Bourne Shell Builtins::,
+for the description of the `trap' builtin.
+
+   If the builtin command `return' is executed in a function, the
+function completes and execution resumes with the next command after
+the function call.  Any command associated with the `RETURN' trap is
+executed before execution resumes.  When a function completes, the
+values of the positional parameters and the special parameter `#' are
+restored to the values they had prior to the function's execution.  If
+a numeric argument is given to `return', that is the function's return
+status; otherwise the function's return status is the exit status of
+the last command executed before the `return'.
+
+   Variables local to the function may be declared with the `local'
+builtin.  These variables are visible only to the function and the
+commands it invokes.
+
+   Function names and definitions may be listed with the `-f' option to
+the `declare' or `typeset' builtin commands (*note Bash Builtins::).
+The `-F' option to `declare' or `typeset' will list the function names
+only (and optionally the source file and line number, if the `extdebug'
+shell option is enabled).  Functions may be exported so that subshells
+automatically have them defined with the `-f' option to the `export'
+builtin (*note Bourne Shell Builtins::).  Note that shell functions and
+variables with the same name may result in multiple identically-named
+entries in the environment passed to the shell's children.  Care should
+be taken in cases where this may cause a problem.
+
+   Functions may be recursive.  No limit is placed on the number of
+recursive  calls.
+
+\1f
+File: bash.info,  Node: Shell Parameters,  Next: Shell Expansions,  Prev: Shell Functions,  Up: Basic Shell Features
+
+Shell Parameters
+================
+
+* Menu:
+
+* Positional Parameters::      The shell's command-line arguments.
+* Special Parameters::         Parameters denoted by special characters.
+
+   A PARAMETER is an entity that stores values.  It can be a `name', a
+number, or one of the special characters listed below.  A VARIABLE is a
+parameter denoted by a `name'.  A variable has a VALUE and zero or more
+ATTRIBUTES.  Attributes are assigned using the `declare' builtin command
+(see the description of the `declare' builtin in *Note Bash Builtins::).
+
+   A parameter is set if it has been assigned a value.  The null string
+is a valid value.  Once a variable is set, it may be unset only by using
+the `unset' builtin command.
+
+   A variable may be assigned to by a statement of the form
+     NAME=[VALUE]
+
+If VALUE is not given, the variable is assigned the null string.  All
+VALUEs undergo tilde expansion, parameter and variable expansion,
+command substitution, arithmetic expansion, and quote removal (detailed
+below).  If the variable has its `integer' attribute set, then VALUE is
+evaluated as an arithmetic expression even if the `$((...))' expansion
+is not used (*note Arithmetic Expansion::).  Word splitting is not
+performed, with the exception of `"$@"' as explained below.  Filename
+expansion is not performed.  Assignment statements may also appear as
+arguments to the `declare', `typeset', `export', `readonly', and
+`local' builtin commands.
+
+\1f
+File: bash.info,  Node: Positional Parameters,  Next: Special Parameters,  Up: Shell Parameters
+
+Positional Parameters
+---------------------
+
+   A POSITIONAL PARAMETER is a parameter denoted by one or more digits,
+other than the single digit `0'.  Positional parameters are assigned
+from the shell's arguments when it is invoked, and may be reassigned
+using the `set' builtin command.  Positional parameter `N' may be
+referenced as `${N}', or as `$N' when `N' consists of a single digit.
+Positional parameters may not be assigned to with assignment statements.
+The `set' and `shift' builtins are used to set and unset them (*note
+Shell Builtin Commands::).  The positional parameters are temporarily
+replaced when a shell function is executed (*note Shell Functions::).
+
+   When a positional parameter consisting of more than a single digit
+is expanded, it must be enclosed in braces.
+
+\1f
+File: bash.info,  Node: Special Parameters,  Prev: Positional Parameters,  Up: Shell Parameters
+
+Special Parameters
+------------------
+
+   The shell treats several parameters specially.  These parameters may
+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.
+
+`@'
+     Expands to the positional parameters, starting from one.  When the
+     expansion occurs within double quotes, each parameter expands to a
+     separate word.  That is, `"$@"' is equivalent to `"$1" "$2" ...'.
+     When there are no positional parameters, `"$@"' and `$@' expand to
+     nothing (i.e., they are removed).
+
+`#'
+     Expands to the number of positional parameters in decimal.
+
+`?'
+     Expands to the exit status of the most recently executed foreground
+     pipeline.
+
+`-'
+     (A hyphen.)  Expands to the current option flags as specified upon
+     invocation, by the `set' builtin command, or those set by the
+     shell itself (such as the `-i' option).
+
+`$'
+     Expands to the process ID of the shell.  In a `()' subshell, it
+     expands to the process ID of the invoking shell, not the subshell.
+
+`!'
+     Expands to the process ID of the most recently executed background
+     (asynchronous) command.
+
+`0'
+     Expands to the name of the shell or shell script.  This is set at
+     shell initialization.  If Bash is invoked with a file of commands
+     (*note Shell Scripts::), `$0' is set to the name of that file.  If
+     Bash is started with the `-c' option (*note Invoking Bash::), then
+     `$0' is set to the first argument after the string to be executed,
+     if one is present.  Otherwise, it is set to the filename used to
+     invoke Bash, as given by argument zero.
+
+`_'
+     (An underscore.)  At shell startup, set to the absolute filename
+     of the shell or shell script being executed as passed in the
+     argument list.  Subsequently, expands to the last argument to the
+     previous command, after expansion.  Also set to the full pathname
+     of each command executed and placed in the environment exported to
+     that command.  When checking mail, this parameter holds the name
+     of the mail file.
+
+\1f
+File: bash.info,  Node: Shell Expansions,  Next: Redirections,  Prev: Shell Parameters,  Up: Basic Shell Features
+
+Shell Expansions
+================
+
+   Expansion is performed on the command line after it has been split
+into `token's.  There are seven kinds of expansion performed:
+   * brace expansion
+
+   * tilde expansion
+
+   * parameter and variable expansion
+
+   * command substitution
+
+   * arithmetic expansion
+
+   * word splitting
+
+   * filename expansion
+
+* Menu:
+
+* Brace Expansion::            Expansion of expressions within braces.
+* Tilde Expansion::            Expansion of the ~ character.
+* Shell Parameter Expansion::  How Bash expands variables to their values.
+* Command Substitution::       Using the output of a command as an argument.
+* Arithmetic Expansion::       How to use arithmetic in shell expansions.
+* Process Substitution::       A way to write and read to and from a
+                               command.
+* Word Splitting::     How the results of expansion are split into separate
+                       arguments.
+* Filename Expansion:: A shorthand for specifying filenames matching patterns.
+* Quote Removal::      How and when quote characters are removed from
+                       words.
+
+   The order of expansions is: brace expansion, tilde expansion,
+parameter, variable, and arithmetic expansion and command substitution
+(done in a left-to-right fashion), word splitting, and filename
+expansion.
+
+   On systems that can support it, there is an additional expansion
+available: PROCESS SUBSTITUTION.  This is performed at the same time as
+parameter, variable, and arithmetic expansion and command substitution.
+
+   Only brace expansion, word splitting, and filename expansion can
+change the number of words of the expansion; other expansions expand a
+single word to a single word.  The only exceptions to this are the
+expansions of `"$@"' (*note Special Parameters::) and `"${NAME[@]}"'
+(*note Arrays::).
+
+   After all expansions, `quote removal' (*note Quote Removal::) is
+performed.
+
+\1f
+File: bash.info,  Node: Brace Expansion,  Next: Tilde Expansion,  Up: Shell Expansions
+
+Brace Expansion
+---------------
+
+   Brace expansion is a mechanism by which arbitrary strings may be
+generated.  This mechanism is similar to FILENAME EXPANSION (*note
+Filename Expansion::), but the file names generated need not exist.
+Patterns to be brace expanded take the form of an optional PREAMBLE,
+followed by either a series of comma-separated strings or a sequnce
+expression between a pair of braces, followed by an optional POSTSCRIPT.
+The preamble is prefixed to each string contained within the braces, and
+the postscript is then appended to each resulting string, expanding left
+to right.
+
+   Brace expansions may be nested.  The results of each expanded string
+are not sorted; left to right order is preserved.  For example,
+     bash$ echo a{d,c,b}e
+     ade ace abe
+
+   A sequence expression takes the form `{X..Y}', where X and Y are
+either integers or single characters.  When integers are supplied, the
+expression expands to each number between X and Y, inclusive.  When
+characters are supplied, the expression expands to each character
+lexicographically between X and Y, inclusive.  Note that both X and Y
+must be of the same type.
+
+   Brace expansion is performed before any other expansions, and any
+characters special to other expansions are preserved in the result.  It
+is strictly textual.  Bash does not apply any syntactic interpretation
+to the context of the expansion or the text between the braces.  To
+avoid conflicts with parameter expansion, the string `${' is not
+considered eligible for brace expansion.
+
+   A correctly-formed brace expansion must contain unquoted opening and
+closing braces, and at least one unquoted comma or a valid sequence
+expression.  Any incorrectly formed brace expansion is left unchanged.
+
+   A { or `,' may be quoted with a backslash to prevent its being
+considered part of a brace expression.  To avoid conflicts with
+parameter expansion, the string `${' is not considered eligible for
+brace expansion.
+
+   This construct is typically used as shorthand when the common prefix
+of the strings to be generated is longer than in the above example:
+     mkdir /usr/local/src/bash/{old,new,dist,bugs}
+   or
+     chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
+
+\1f
+File: bash.info,  Node: Tilde Expansion,  Next: Shell Parameter Expansion,  Prev: Brace Expansion,  Up: Shell Expansions
+
+Tilde Expansion
+---------------
+
+   If a word begins with an unquoted tilde character (`~'), all of the
+characters up to the first unquoted slash (or all characters, if there
+is no unquoted slash) are considered a TILDE-PREFIX.  If none of the
+characters in the tilde-prefix are quoted, the characters in the
+tilde-prefix following the tilde are treated as a possible LOGIN NAME.
+If this login name is the null string, the tilde is replaced with the
+value of the `HOME' shell variable.  If `HOME' is unset, the home
+directory of the user executing the shell is substituted instead.
+Otherwise, the tilde-prefix is replaced with the home directory
+associated with the specified login name.
+
+   If the tilde-prefix is `~+', the value of the shell variable `PWD'
+replaces the tilde-prefix.  If the tilde-prefix is `~-', the value of
+the shell variable `OLDPWD', if it is set, is substituted.
+
+   If the characters following the tilde in the tilde-prefix consist of
+a number N, optionally prefixed by a `+' or a `-', the tilde-prefix is
+replaced with the corresponding element from the directory stack, as it
+would be displayed by the `dirs' builtin invoked with the characters
+following tilde in the tilde-prefix as an argument (*note The Directory
+Stack::).  If the tilde-prefix, sans the tilde, consists of a number
+without a leading `+' or `-', `+' is assumed.
+
+   If the login name is invalid, or the tilde expansion fails, the word
+is left unchanged.
+
+   Each variable assignment is checked for unquoted tilde-prefixes
+immediately following a `:' or `='.  In these cases, tilde expansion is
+also performed.  Consequently, one may use file names with tildes in
+assignments to `PATH', `MAILPATH', and `CDPATH', and the shell assigns
+the expanded value.
+
+   The following table shows how Bash treats unquoted tilde-prefixes:
+
+`~'
+     The value of `$HOME'
+
+`~/foo'
+     `$HOME/foo'
+
+`~fred/foo'
+     The subdirectory `foo' of the home directory of the user `fred'
+
+`~+/foo'
+     `$PWD/foo'
+
+`~-/foo'
+     `${OLDPWD-'~-'}/foo'
+
+`~N'
+     The string that would be displayed by `dirs +N'
+
+`~+N'
+     The string that would be displayed by `dirs +N'
+
+`~-N'
+     The string that would be displayed by `dirs -N'
+
+
+\1f
+File: bash.info,  Node: Shell Parameter Expansion,  Next: Command Substitution,  Prev: Tilde Expansion,  Up: Shell Expansions
+
+Shell Parameter Expansion
+-------------------------
+
+   The `$' character introduces parameter expansion, command
+substitution, or arithmetic expansion.  The parameter name or symbol to
+be expanded may be enclosed in braces, which are optional but serve to
+protect the variable to be expanded from characters immediately
+following it which could be interpreted as part of the name.
+
+   When braces are used, the matching ending brace is the first `}' not
+escaped by a backslash or within a quoted string, and not within an
+embedded arithmetic expansion, command substitution, or parameter
+expansion.
+
+   The basic form of parameter expansion is ${PARAMETER}.  The value of
+PARAMETER is substituted.  The braces are required when PARAMETER is a
+positional parameter with more than one digit, or when PARAMETER is
+followed by a character that is not to be interpreted as part of its
+name.
+
+   If the first character of PARAMETER is an exclamation point, a level
+of variable indirection is introduced.  Bash uses the value of the
+variable formed from the rest of PARAMETER as the name of the variable;
+this variable is then expanded and that value is used in the rest of
+the substitution, rather than the value of PARAMETER itself.  This is
+known as `indirect expansion'.  The exceptions to this are the
+expansions of ${!PREFIX*} and ${!NAME[@]} described below.  The
+exclamation point must immediately follow the left brace in order to
+introduce indirection.
+
+   In each of the cases below, WORD is subject to tilde expansion,
+parameter expansion, command substitution, and arithmetic expansion.
+
+   When not performing substring expansion, Bash tests for a parameter
+that is unset or null; omitting the colon results in a test only for a
+parameter that is unset.  Put another way, if the colon is included,
+the operator tests for both existence and that the value is not null;
+if the colon is omitted, the operator tests only for existence.
+
+`${PARAMETER:-WORD}'
+     If PARAMETER is unset or null, the expansion of WORD is
+     substituted.  Otherwise, the value of PARAMETER is substituted.
+
+`${PARAMETER:=WORD}'
+     If PARAMETER is unset or null, the expansion of WORD is assigned
+     to PARAMETER.  The value of PARAMETER is then substituted.
+     Positional parameters and special parameters may not be assigned
+     to in this way.
+
+`${PARAMETER:?WORD}'
+     If PARAMETER is null or unset, the expansion of WORD (or a message
+     to that effect if WORD is not present) is written to the standard
+     error and the shell, if it is not interactive, exits.  Otherwise,
+     the value of PARAMETER is substituted.
+
+`${PARAMETER:+WORD}'
+     If PARAMETER is null or unset, nothing is substituted, otherwise
+     the expansion of WORD is substituted.
+
+`${PARAMETER:OFFSET}'
+`${PARAMETER:OFFSET:LENGTH}'
+     Expands to up to LENGTH characters of PARAMETER starting at the
+     character specified by OFFSET.  If LENGTH is omitted, expands to
+     the substring of PARAMETER starting at the character specified by
+     OFFSET.  LENGTH and OFFSET are arithmetic expressions (*note Shell
+     Arithmetic::).  This is referred to as Substring Expansion.
+
+     LENGTH must evaluate to a number greater than or equal to zero.
+     If OFFSET evaluates to a number less than zero, the value is used
+     as an offset from the end of the value of PARAMETER.  If PARAMETER
+     is `@', the result is LENGTH positional parameters beginning at
+     OFFSET.  If PARAMETER is an array name indexed by `@' or `*', the
+     result is the LENGTH members of the array beginning with
+     `${PARAMETER[OFFSET]}'.  Substring indexing is zero-based unless
+     the positional parameters are used, in which case the indexing
+     starts at 1.
+
+`${!PREFIX*}'
+`${!PREFIX@}'
+     Expands to the names of variables whose names begin with PREFIX,
+     separated by the first character of the `IFS' special variable.
+
+`${!NAME[@]}'
+`${!NAME[*]}'
+     If NAME is an array variable, expands to the list of array indices
+     (keys) assigned in NAME.  If NAME is not an array, expands to 0 if
+     NAME is set and null otherwise.  When `@' is used and the
+     expansion appears within double quotes, each key expands to a
+     separate word.
+
+`${#PARAMETER}'
+     The length in characters of the expanded value of PARAMETER is
+     substituted.  If PARAMETER is `*' or `@', the value substituted is
+     the number of positional parameters.  If PARAMETER is an array
+     name subscripted by `*' or `@', the value substituted is the
+     number of elements in the array.
+
+`${PARAMETER#WORD}'
+`${PARAMETER##WORD}'
+     The WORD is expanded to produce a pattern just as in filename
+     expansion (*note Filename Expansion::).  If the pattern matches
+     the beginning of the expanded value of PARAMETER, then the result
+     of the expansion is the expanded value of PARAMETER with the
+     shortest matching pattern (the `#' case) or the longest matching
+     pattern (the `##' case) deleted.  If PARAMETER is `@' or `*', the
+     pattern removal operation is applied to each positional parameter
+     in turn, and the expansion is the resultant list.  If PARAMETER is
+     an array variable subscripted with `@' or `*', the pattern removal
+     operation is applied to each member of the array in turn, and the
+     expansion is the resultant list.
+
+`${PARAMETER%WORD}'
+`${PARAMETER%%WORD}'
+     The WORD is expanded to produce a pattern just as in filename
+     expansion.  If the pattern matches a trailing portion of the
+     expanded value of PARAMETER, then the result of the expansion is
+     the value of PARAMETER with the shortest matching pattern (the `%'
+     case) or the longest matching pattern (the `%%' case) deleted.  If
+     PARAMETER is `@' or `*', the pattern removal operation is applied
+     to each positional parameter in turn, and the expansion is the
+     resultant list.  If PARAMETER is an array variable subscripted
+     with `@' or `*', the pattern removal operation is applied to each
+     member of the array in turn, and the expansion is the resultant
+     list.
+
+`${PARAMETER/PATTERN/STRING}'
+`${PARAMETER//PATTERN/STRING}'
+     The PATTERN is expanded to produce a pattern just as in filename
+     expansion.  PARAMETER is expanded and the longest match of PATTERN
+     against its value is replaced with STRING.  In the first form,
+     only the first match is replaced.  The second form causes all
+     matches of PATTERN to be replaced with STRING.  If PATTERN begins
+     with `#', it must match at the beginning of the expanded value of
+     PARAMETER.  If PATTERN begins with `%', it must match at the end
+     of the expanded value of PARAMETER.  If STRING is null, matches of
+     PATTERN are deleted and the `/' following PATTERN may be omitted.
+     If PARAMETER is `@' or `*', the substitution operation is applied
+     to each positional parameter in turn, and the expansion is the
+     resultant list.  If PARAMETER is an array variable subscripted
+     with `@' or `*', the substitution operation is applied to each
+     member of the array in turn, and the expansion is the resultant
+     list.
+
+
+\1f
+File: bash.info,  Node: Command Substitution,  Next: Arithmetic Expansion,  Prev: Shell Parameter Expansion,  Up: Shell Expansions
+
+Command Substitution
+--------------------
+
+   Command substitution allows the output of a command to replace the
+command itself.  Command substitution occurs when a command is enclosed
+as follows:
+     $(COMMAND)
+
+or
+     `COMMAND`
+
+Bash performs the expansion by executing COMMAND and replacing the
+command substitution with the standard output of the command, with any
+trailing newlines deleted.  Embedded newlines are not deleted, but they
+may be removed during word splitting.  The command substitution `$(cat
+FILE)' can be replaced by the equivalent but faster `$(< FILE)'.
+
+   When the old-style backquote form of substitution is used, backslash
+retains its literal meaning except when followed by `$', ``', or `\'.
+The first backquote not preceded by a backslash terminates the command
+substitution.  When using the `$(COMMAND)' form, all characters between
+the parentheses make up the command; none are treated specially.
+
+   Command substitutions may be nested.  To nest when using the
+backquoted form, escape the inner backquotes with backslashes.
+
+   If the substitution appears within double quotes, word splitting and
+filename expansion are not performed on the results.
+
+\1f
+File: bash.info,  Node: Arithmetic Expansion,  Next: Process Substitution,  Prev: Command Substitution,  Up: Shell Expansions
+
+Arithmetic Expansion
+--------------------
+
+   Arithmetic expansion allows the evaluation of an arithmetic
+expression and the substitution of the result.  The format for
+arithmetic expansion is:
+
+     $(( EXPRESSION ))
+
+   The expression is treated as if it were within double quotes, but a
+double quote inside the parentheses is not treated specially.  All
+tokens in the expression undergo parameter expansion, command
+substitution, and quote removal.  Arithmetic expansions may be nested.
+
+   The evaluation is performed according to the rules listed below
+(*note Shell Arithmetic::).  If the expression is invalid, Bash prints
+a message indicating failure to the standard error and no substitution
+occurs.
+
+\1f
+File: bash.info,  Node: Process Substitution,  Next: Word Splitting,  Prev: Arithmetic Expansion,  Up: Shell Expansions
+
+Process Substitution
+--------------------
+
+   Process substitution is supported on systems that support named
+pipes (FIFOs) or the `/dev/fd' method of naming open files.  It takes
+the form of
+     <(LIST)
+
+or
+     >(LIST)
+
+The process LIST is run with its input or output connected to a FIFO or
+some file in `/dev/fd'.  The name of this file is passed as an argument
+to the current command as the result of the expansion.  If the
+`>(LIST)' form is used, writing to the file will provide input for
+LIST.  If the `<(LIST)' form is used, the file passed as an argument
+should be read to obtain the output of LIST.  Note that no space may
+appear between the `<' or `>' and the left parenthesis, otherwise the
+construct would be interpreted as a redirection.
+
+   When available, process substitution is performed simultaneously with
+parameter and variable expansion, command substitution, and arithmetic
+expansion.
+
+\1f
+File: bash.info,  Node: Word Splitting,  Next: Filename Expansion,  Prev: Process Substitution,  Up: Shell Expansions
+
+Word Splitting
+--------------
+
+   The shell scans the results of parameter expansion, command
+substitution, and arithmetic expansion that did not occur within double
+quotes for word splitting.
+
+   The shell treats each character of `$IFS' as a delimiter, and splits
+the results of the other expansions into words on these characters.  If
+`IFS' is unset, or its value is exactly `<space><tab><newline>', the
+default, then any sequence of `IFS' characters serves to delimit words.
+If `IFS' has a value other than the default, then sequences of the
+whitespace characters `space' and `tab' are ignored at the beginning
+and end of the word, as long as the whitespace character is in the
+value of `IFS' (an `IFS' whitespace character).  Any character in `IFS'
+that is not `IFS' whitespace, along with any adjacent `IFS' whitespace
+characters, delimits a field.  A sequence of `IFS' whitespace
+characters is also treated as a delimiter.  If the value of `IFS' is
+null, no word splitting occurs.
+
+   Explicit null arguments (`""' or `''') are retained.  Unquoted
+implicit null arguments, resulting from the expansion of parameters
+that have no values, are removed.  If a parameter with no value is
+expanded within double quotes, a null argument results and is retained.
+
+   Note that if no expansion occurs, no splitting is performed.
+
+\1f
+File: bash.info,  Node: Filename Expansion,  Next: Quote Removal,  Prev: Word Splitting,  Up: Shell Expansions
+
+Filename Expansion
+------------------
+
+* Menu:
+
+* Pattern Matching::   How the shell matches patterns.
+
+   After word splitting, unless the `-f' option has been set (*note The
+Set Builtin::), Bash scans each word for the characters `*', `?', and
+`['.  If one of these characters appears, then the word is regarded as
+a PATTERN, and replaced with an alphabetically sorted list of file
+names matching the pattern. If no matching file names are found, and
+the shell option `nullglob' is disabled, the word is left unchanged.
+If the `nullglob' option is set, and no matches are found, the word is
+removed.  If the shell option `nocaseglob' is enabled, the match is
+performed without regard to the case of alphabetic characters.
+
+   When a pattern is used for filename generation, the character `.' at
+the start of a filename or immediately following a slash must be
+matched explicitly, unless the shell option `dotglob' is set.  When
+matching a file name, the slash character must always be matched
+explicitly.  In other cases, the `.' character is not treated specially.
+
+   See the description of `shopt' in *Note Bash Builtins::, for a
+description of the `nocaseglob', `nullglob', and `dotglob' options.
+
+   The `GLOBIGNORE' shell variable may be used to restrict the set of
+filenames matching a pattern.  If `GLOBIGNORE' is set, each matching
+filename that also matches one of the patterns in `GLOBIGNORE' is
+removed from the list of matches.  The filenames `.' and `..' are
+always ignored when `GLOBIGNORE' is set and not null.  However, setting
+`GLOBIGNORE' to a non-null value has the effect of enabling the
+`dotglob' shell option, so all other filenames beginning with a `.'
+will match.  To get the old behavior of ignoring filenames beginning
+with a `.', make `.*' one of the patterns in `GLOBIGNORE'.  The
+`dotglob' option is disabled when `GLOBIGNORE' is unset.
+
+\1f
+File: bash.info,  Node: Pattern Matching,  Up: Filename Expansion
+
+Pattern Matching
+................
+
+   Any character that appears in a pattern, other than the special
+pattern characters described below, matches itself.  The NUL character
+may not occur in a pattern.  A backslash escapes the following
+character; the escaping backslash is discarded when matching.  The
+special pattern characters must be quoted if they are to be matched
+literally.
+
+   The special pattern characters have the following meanings:
+`*'
+     Matches any string, including the null string.
+
+`?'
+     Matches any single character.
+
+`[...]'
+     Matches any one of the enclosed characters.  A pair of characters
+     separated by a hyphen denotes a RANGE EXPRESSION; any character
+     that sorts between those two characters, inclusive, using the
+     current locale's collating sequence and character set, is matched.
+     If the first character following the `[' is a `!'  or a `^' then
+     any character not enclosed is matched.  A `-' may be matched by
+     including it as the first or last character in the set.  A `]' may
+     be matched by including it as the first character in the set.  The
+     sorting order of characters in range expressions is determined by
+     the current locale and the value of the `LC_COLLATE' shell
+     variable, if set.
+
+     For example, in the default C locale, `[a-dx-z]' is equivalent to
+     `[abcdxyz]'.  Many locales sort characters in dictionary order,
+     and in these locales `[a-dx-z]' is typically not equivalent to
+     `[abcdxyz]'; it might be equivalent to `[aBbCcDdxXyYz]', for
+     example.  To obtain the traditional interpretation of ranges in
+     bracket expressions, you can force the use of the C locale by
+     setting the `LC_COLLATE' or `LC_ALL' environment variable to the
+     value `C'.
+
+     Within `[' and `]', CHARACTER CLASSES can be specified using the
+     syntax `[:'CLASS`:]', where CLASS is one of the following classes
+     defined in the POSIX 1003.2 standard:
+          alnum   alpha   ascii   blank   cntrl   digit   graph   lower
+          print   punct   space   upper   word    xdigit
+
+     A character class matches any character belonging to that class.
+     The `word' character class matches letters, digits, and the
+     character `_'.
+
+     Within `[' and `]', an EQUIVALENCE CLASS can be specified using
+     the syntax `[='C`=]', which matches all characters with the same
+     collation weight (as defined by the current locale) as the
+     character C.
+
+     Within `[' and `]', the syntax `[.'SYMBOL`.]' matches the
+     collating symbol SYMBOL.
+
+   If the `extglob' shell option is enabled using the `shopt' builtin,
+several extended pattern matching operators are recognized.  In the
+following description, a PATTERN-LIST is a list of one or more patterns
+separated by a `|'.  Composite patterns may be formed using one or more
+of the following sub-patterns:
+
+`?(PATTERN-LIST)'
+     Matches zero or one occurrence of the given patterns.
+
+`*(PATTERN-LIST)'
+     Matches zero or more occurrences of the given patterns.
+
+`+(PATTERN-LIST)'
+     Matches one or more occurrences of the given patterns.
+
+`@(PATTERN-LIST)'
+     Matches exactly one of the given patterns.
+
+`!(PATTERN-LIST)'
+     Matches anything except one of the given patterns.
+
+\1f
+File: bash.info,  Node: Quote Removal,  Prev: Filename Expansion,  Up: Shell Expansions
+
+Quote Removal
+-------------
+
+   After the preceding expansions, all unquoted occurrences of the
+characters `\', `'', and `"' that did not result from one of the above
+expansions are removed.
+
+\1f
+File: bash.info,  Node: Redirections,  Next: Executing Commands,  Prev: Shell Expansions,  Up: Basic Shell Features
+
+Redirections
+============
+
+   Before a command is executed, its input and output may be REDIRECTED
+using a special notation interpreted by the shell.  Redirection may
+also be used to open and close files for the current shell execution
+environment.  The following redirection operators may precede or appear
+anywhere within a simple command or may follow a command.  Redirections
+are processed in the order they appear, from left to right.
+
+   In the following descriptions, if the file descriptor number is
+omitted, and the first character of the redirection operator is `<',
+the redirection refers to the standard input (file descriptor 0).  If
+the first character of the redirection operator is `>', the redirection
+refers to the standard output (file descriptor 1).
+
+   The word following the redirection operator in the following
+descriptions, unless otherwise noted, is subjected to brace expansion,
+tilde expansion, parameter expansion, command substitution, arithmetic
+expansion, quote removal, filename expansion, and word splitting.  If
+it expands to more than one word, Bash reports an error.
+
+   Note that the order of redirections is significant.  For example,
+the command
+     ls > DIRLIST 2>&1
+
+directs both standard output (file descriptor 1) and standard error
+(file descriptor 2) to the file DIRLIST, while the command
+     ls 2>&1 > DIRLIST
+
+directs only the standard output to file DIRLIST, because the standard
+error was duplicated as standard output before the standard output was
+redirected to DIRLIST.
+
+   Bash handles several filenames specially when they are used in
+redirections, as described in the following table:
+
+`/dev/fd/FD'
+     If FD is a valid integer, file descriptor FD is duplicated.
+
+`/dev/stdin'
+     File descriptor 0 is duplicated.
+
+`/dev/stdout'
+     File descriptor 1 is duplicated.
+
+`/dev/stderr'
+     File descriptor 2 is duplicated.
+
+`/dev/tcp/HOST/PORT'
+     If HOST is a valid hostname or Internet address, and PORT is an
+     integer port number or service name, Bash attempts to open a TCP
+     connection to the corresponding socket.
+
+`/dev/udp/HOST/PORT'
+     If HOST is a valid hostname or Internet address, and PORT is an
+     integer port number or service name, Bash attempts to open a UDP
+     connection to the corresponding socket.
+
+
+   A failure to open or create a file causes the redirection to fail.
+
+Redirecting Input
+-----------------
+
+   Redirection of input causes the file whose name results from the
+expansion of WORD to be opened for reading on file descriptor `n', or
+the standard input (file descriptor 0) if `n' is not specified.
+
+   The general format for redirecting input is:
+     [N]<WORD
+
+Redirecting Output
+------------------
+
+   Redirection of output causes the file whose name results from the
+expansion of WORD to be opened for writing on file descriptor N, or the
+standard output (file descriptor 1) if N is not specified.  If the file
+does not exist it is created; if it does exist it is truncated to zero
+size.
+
+   The general format for redirecting output is:
+     [N]>[|]WORD
+
+   If the redirection operator is `>', and the `noclobber' option to
+the `set' builtin has been enabled, the redirection will fail if the
+file whose name results from the expansion of WORD exists and is a
+regular file.  If the redirection operator is `>|', or the redirection
+operator is `>' and the `noclobber' option is not enabled, the
+redirection is attempted even if the file named by WORD exists.
+
+Appending Redirected Output
+---------------------------
+
+   Redirection of output in this fashion causes the file whose name
+results from the expansion of WORD to be opened for appending on file
+descriptor N, or the standard output (file descriptor 1) if N is not
+specified.  If the file does not exist it is created.
+
+   The general format for appending output is:
+     [N]>>WORD
+
+Redirecting Standard Output and Standard Error
+----------------------------------------------
+
+   Bash allows both the standard output (file descriptor 1) and the
+standard error output (file descriptor 2) to be redirected to the file
+whose name is the expansion of WORD with this construct.
+
+   There are two formats for redirecting standard output and standard
+error:
+     &>WORD
+
+and
+     >&WORD
+
+Of the two forms, the first is preferred.  This is semantically
+equivalent to
+     >WORD 2>&1
+
+Here Documents
+--------------
+
+   This type of redirection instructs the shell to read input from the
+current source until a line containing only WORD (with no trailing
+blanks) is seen.  All of the lines read up to that point are then used
+as the standard input for a command.
+
+   The format of here-documents is:
+     <<[-]WORD
+             HERE-DOCUMENT
+     DELIMITER
+
+   No parameter expansion, command substitution, arithmetic expansion,
+or filename expansion is performed on WORD.  If any characters in WORD
+are quoted, the DELIMITER is the result of quote removal on WORD, and
+the lines in the here-document are not expanded.  If WORD is unquoted,
+all lines of the here-document are subjected to parameter expansion,
+command substitution, and arithmetic expansion.  In the latter case,
+the character sequence `\newline' is ignored, and `\' must be used to
+quote the characters `\', `$', and ``'.
+
+   If the redirection operator is `<<-', then all leading tab
+characters are stripped from input lines and the line containing
+DELIMITER.  This allows here-documents within shell scripts to be
+indented in a natural fashion.
+
+Here Strings
+------------
+
+   A variant of here documents, the format is:
+     <<< WORD
+
+   The WORD is expanded and supplied to the command on its standard
+input.
+
+Duplicating File Descriptors
+----------------------------
+
+   The redirection operator
+     [N]<&WORD
+
+is used to duplicate input file descriptors.  If WORD expands to one or
+more digits, the file descriptor denoted by N is made to be a copy of
+that file descriptor.  If the digits in WORD do not specify a file
+descriptor open for input, a redirection error occurs.  If WORD
+evaluates to `-', file descriptor N is closed.  If N is not specified,
+the standard input (file descriptor 0) is used.
+
+   The operator
+     [N]>&WORD
+
+is used similarly to duplicate output file descriptors.  If N is not
+specified, the standard output (file descriptor 1) is used.  If the
+digits in WORD do not specify a file descriptor open for output, a
+redirection error occurs.  As a special case, if N is omitted, and WORD
+does not expand to one or more digits, the standard output and standard
+error are redirected as described previously.
+
+Moving File Descriptors
+-----------------------
+
+   The redirection operator
+     [N]<&DIGIT-
+
+moves the file descriptor DIGIT to file descriptor N, or the standard
+input (file descriptor 0) if N is not specified.  DIGIT is closed after
+being duplicated to N.
+
+   Similarly, the redirection operator
+     [N]>&DIGIT-
+
+moves the file descriptor DIGIT to file descriptor N, or the standard
+output (file descriptor 1) if N is not specified.
+
+Opening File Descriptors for Reading and Writing
+------------------------------------------------
+
+   The redirection operator
+     [N]<>WORD
+
+causes the file whose name is the expansion of WORD to be opened for
+both reading and writing on file descriptor N, or on file descriptor 0
+if N is not specified.  If the file does not exist, it is created.
+
+\1f
+File: bash.info,  Node: Executing Commands,  Next: Shell Scripts,  Prev: Redirections,  Up: Basic Shell Features
+
+Executing Commands
+==================
+
+* Menu:
+
+* Simple Command Expansion::   How Bash expands simple commands before
+                               executing them.
+
+* Command Search and Execution::       How Bash finds commands and runs them.
+
+* Command Execution Environment::      The environment in which Bash
+                                       executes commands that are not
+                                       shell builtins.
+
+* Environment::                The environment given to a command.
+
+* Exit Status::                The status returned by commands and how Bash
+                       interprets it.
+
+* Signals::            What happens when Bash or a command it runs
+                       receives a signal.
+
+\1f
+File: bash.info,  Node: Simple Command Expansion,  Next: Command Search and Execution,  Up: Executing Commands
+
+Simple Command Expansion
+------------------------
+
+   When a simple command is executed, the shell performs the following
+expansions, assignments, and redirections, from left to right.
+
+  1. The words that the parser has marked as variable assignments (those
+     preceding the command name) and redirections are saved for later
+     processing.
+
+  2. The words that are not variable assignments or redirections are
+     expanded (*note Shell Expansions::).  If any words remain after
+     expansion, the first word is taken to be the name of the command
+     and the remaining words are the arguments.
+
+  3. Redirections are performed as described above (*note
+     Redirections::).
+
+  4. The text after the `=' in each variable assignment undergoes tilde
+     expansion, parameter expansion, command substitution, arithmetic
+     expansion, and quote removal before being assigned to the variable.
+
+   If no command name results, the variable assignments affect the
+current shell environment.  Otherwise, the variables are added to the
+environment of the executed command and do not affect the current shell
+environment.  If any of the assignments attempts to assign a value to a
+readonly variable, an error occurs, and the command exits with a
+non-zero status.
+
+   If no command name results, redirections are performed, but do not
+affect the current shell environment.  A redirection error causes the
+command to exit with a non-zero status.
+
+   If there is a command name left after expansion, execution proceeds
+as described below.  Otherwise, the command exits.  If one of the
+expansions contained a command substitution, the exit status of the
+command is the exit status of the last command substitution performed.
+If there were no command substitutions, the command exits with a status
+of zero.
+
+\1f
+File: bash.info,  Node: Command Search and Execution,  Next: Command Execution Environment,  Prev: Simple Command Expansion,  Up: Executing Commands
+
+Command Search and Execution
+----------------------------
+
+   After a command has been split into words, if it results in a simple
+command and an optional list of arguments, the following actions are
+taken.
+
+  1. If the command name contains no slashes, the shell attempts to
+     locate it.  If there exists a shell function by that name, that
+     function is invoked as described in *Note Shell Functions::.
+
+  2. If the name does not match a function, the shell searches for it
+     in the list of shell builtins.  If a match is found, that builtin
+     is invoked.
+
+  3. If the name is neither a shell function nor a builtin, and
+     contains no slashes, Bash searches each element of `$PATH' for a
+     directory containing an executable file by that name.  Bash uses a
+     hash table to remember the full pathnames of executable files to
+     avoid multiple `PATH' searches (see the description of `hash' in
+     *Note Bourne Shell Builtins::).  A full search of the directories
+     in `$PATH' is performed only if the command is not found in the
+     hash table.  If the search is unsuccessful, the shell prints an
+     error message and returns an exit status of 127.
+
+  4. If the search is successful, or if the command name contains one
+     or more slashes, the shell executes the named program in a
+     separate execution environment.  Argument 0 is set to the name
+     given, and the remaining arguments to the command are set to the
+     arguments supplied, if any.
+
+  5. If this execution fails because the file is not in executable
+     format, and the file is not a directory, it is assumed to be a
+     SHELL SCRIPT and the shell executes it as described in *Note Shell
+     Scripts::.
+
+  6. If the command was not begun asynchronously, the shell waits for
+     the command to complete and collects its exit status.
+
+
+\1f
+File: bash.info,  Node: Command Execution Environment,  Next: Environment,  Prev: Command Search and Execution,  Up: Executing Commands
+
+Command Execution Environment
+-----------------------------
+
+   The shell has an EXECUTION ENVIRONMENT, which consists of the
+following:
+
+   * open files inherited by the shell at invocation, as modified by
+     redirections supplied to the `exec' builtin
+
+   * the current working directory as set by `cd', `pushd', or `popd',
+     or inherited by the shell at invocation
+
+   * the file creation mode mask as set by `umask' or inherited from
+     the shell's parent
+
+   * current traps set by `trap'
+
+   * shell parameters that are set by variable assignment or with `set'
+     or inherited from the shell's parent in the environment
+
+   * shell functions defined during execution or inherited from the
+     shell's parent in the environment
+
+   * options enabled at invocation (either by default or with
+     command-line arguments) or by `set'
+
+   * options enabled by `shopt'
+
+   * shell aliases defined with `alias' (*note Aliases::)
+
+   * various process IDs, including those of background jobs (*note
+     Lists::), the value of `$$', and the value of `$PPID'
+
+
+   When a simple command other than a builtin or shell function is to
+be executed, it is invoked in a separate execution environment that
+consists of the following.  Unless otherwise noted, the values are
+inherited from the shell.
+
+   * the shell's open files, plus any modifications and additions
+     specified by redirections to the command
+
+   * the current working directory
+
+   * the file creation mode mask
+
+   * shell variables and functions marked for export, along with
+     variables exported for the command, passed in the environment
+     (*note Environment::)
+
+   * traps caught by the shell are reset to the values inherited from
+     the shell's parent, and traps ignored by the shell are ignored
+
+
+   A command invoked in this separate environment cannot affect the
+shell's execution environment.
+
+   Command substitution and asynchronous commands are invoked in a
+subshell environment that is a duplicate of the shell environment,
+except that traps caught by the shell are reset to the values that the
+shell inherited from its parent at invocation.  Builtin commands that
+are invoked as part of a pipeline are also executed in a subshell
+environment.  Changes made to the subshell environment cannot affect
+the shell's execution environment.
+
+   If a command is followed by a `&' and job control is not active, the
+default standard input for the command is the empty file `/dev/null'.
+Otherwise, the invoked command inherits the file descriptors of the
+calling shell as modified by redirections.
+
+\1f
+File: bash.info,  Node: Environment,  Next: Exit Status,  Prev: Command Execution Environment,  Up: Executing Commands
+
+Environment
+-----------
+
+   When a program is invoked it is given an array of strings called the
+ENVIRONMENT.  This is a list of name-value pairs, of the form
+`name=value'.
+
+   Bash provides several ways to manipulate the environment.  On
+invocation, the shell scans its own environment and creates a parameter
+for each name found, automatically marking it for EXPORT to child
+processes.  Executed commands inherit the environment.  The `export'
+and `declare -x' commands allow parameters and functions to be added to
+and deleted from the environment.  If the value of a parameter in the
+environment is modified, the new value becomes part of the environment,
+replacing the old.  The environment inherited by any executed command
+consists of the shell's initial environment, whose values may be
+modified in the shell, less any pairs removed by the `unset' and
+`export -n' commands, plus any additions via the `export' and `declare
+-x' commands.
+
+   The environment for any simple command or function may be augmented
+temporarily by prefixing it with parameter assignments, as described in
+*Note Shell Parameters::.  These assignment statements affect only the
+environment seen by that command.
+
+   If the `-k' option is set (*note The Set Builtin::), then all
+parameter assignments are placed in the environment for a command, not
+just those that precede the command name.
+
+   When Bash invokes an external command, the variable `$_' is set to
+the full path name of the command and passed to that command in its
+environment.
+
+\1f
+File: bash.info,  Node: Exit Status,  Next: Signals,  Prev: Environment,  Up: Executing Commands
+
+Exit Status
+-----------
+
+   For the shell's purposes, a command which exits with a zero exit
+status has succeeded.  A non-zero exit status indicates failure.  This
+seemingly counter-intuitive scheme is used so there is one well-defined
+way to indicate success and a variety of ways to indicate various
+failure modes.  When a command terminates on a fatal signal whose
+number is N, Bash uses the value 128+N as the exit status.
+
+   If a command is not found, the child process created to execute it
+returns a status of 127.  If a command is found but is not executable,
+the return status is 126.
+
+   If a command fails because of an error during expansion or
+redirection, the exit status is greater than zero.
+
+   The exit status is used by the Bash conditional commands (*note
+Conditional Constructs::) and some of the list constructs (*note
+Lists::).
+
+   All of the Bash builtins return an exit status of zero if they
+succeed and a non-zero status on failure, so they may be used by the
+conditional and list constructs.  All builtins return an exit status of
+2 to indicate incorrect usage.
+
+\1f
+File: bash.info,  Node: Signals,  Prev: Exit Status,  Up: Executing Commands
+
+Signals
+-------
+
+   When Bash is interactive, in the absence of any traps, it ignores
+`SIGTERM' (so that `kill 0' does not kill an interactive shell), and
+`SIGINT' is caught and handled (so that the `wait' builtin is
+interruptible).  When Bash receives a `SIGINT', it breaks out of any
+executing loops.  In all cases, Bash ignores `SIGQUIT'.  If job control
+is in effect (*note Job Control::), Bash ignores `SIGTTIN', `SIGTTOU',
+and `SIGTSTP'.
+
+   Commands started by Bash have signal handlers set to the values
+inherited by the shell from its parent.  When job control is not in
+effect, asynchronous commands ignore `SIGINT' and `SIGQUIT' as well.
+Commands run as a result of command substitution ignore the
+keyboard-generated job control signals `SIGTTIN', `SIGTTOU', and
+`SIGTSTP'.
+
+   The shell exits by default upon receipt of a `SIGHUP'.  Before
+exiting, an interactive shell resends the `SIGHUP' to all jobs, running
+or stopped.  Stopped jobs are sent `SIGCONT' to ensure that they receive
+the `SIGHUP'.  To prevent the shell from sending the `SIGHUP' signal to
+a particular job, it should be removed from the jobs table with the
+`disown' builtin (*note Job Control Builtins::) or marked to not
+receive `SIGHUP' using `disown -h'.
+
+   If the  `huponexit' shell option has been set with `shopt' (*note
+Bash Builtins::), Bash sends a `SIGHUP' to all jobs when an interactive
+login shell exits.
+
+   When Bash receives a signal for which a trap has been set while
+waiting for a command to complete, the trap will not be executed until
+the command completes.  When Bash is waiting for an asynchronous
+command via the `wait' builtin, the reception of a signal for which a
+trap has been set will cause the `wait' builtin to return immediately
+with an exit status greater than 128, immediately after which the trap
+is executed.
+
+\1f
+File: bash.info,  Node: Shell Scripts,  Prev: Executing Commands,  Up: Basic Shell Features
+
+Shell Scripts
+=============
+
+   A shell script is a text file containing shell commands.  When such
+a file is used as the first non-option argument when invoking Bash, and
+neither the `-c' nor `-s' option is supplied (*note Invoking Bash::),
+Bash reads and executes commands from the file, then exits.  This mode
+of operation creates a non-interactive shell.  The shell first searches
+for the file in the current directory, and looks in the directories in
+`$PATH' if not found there.
+
+   When Bash runs a shell script, it sets the special parameter `0' to
+the name of the file, rather than the name of the shell, and the
+positional parameters are set to the remaining arguments, if any are
+given.  If no additional arguments are supplied, the positional
+parameters are unset.
+
+   A shell script may be made executable by using the `chmod' command
+to turn on the execute bit.  When Bash finds such a file while
+searching the `$PATH' for a command, it spawns a subshell to execute
+it.  In other words, executing
+     filename ARGUMENTS
+
+is equivalent to executing
+     bash filename ARGUMENTS
+
+if `filename' is an executable shell script.  This subshell
+reinitializes itself, so that the effect is as if a new shell had been
+invoked to interpret the script, with the exception that the locations
+of commands remembered by the parent (see the description of `hash' in
+*Note Bourne Shell Builtins::) are retained by the child.
+
+   Most versions of Unix make this a part of the operating system's
+command execution mechanism.  If the first line of a script begins with
+the two characters `#!', the remainder of the line specifies an
+interpreter for the program.  Thus, you can specify Bash, `awk', Perl,
+or some other interpreter and write the rest of the script file in that
+language.
+
+   The arguments to the interpreter consist of a single optional
+argument following the interpreter name on the first line of the script
+file, followed by the name of the script file, followed by the rest of
+the arguments.  Bash will perform this action on operating systems that
+do not handle it themselves.  Note that some older versions of Unix
+limit the interpreter name and argument to a maximum of 32 characters.
+
+   Bash scripts often begin with `#! /bin/bash' (assuming that Bash has
+been installed in `/bin'), since this ensures that Bash will be used to
+interpret the script, even if it is executed under another shell.
+
+\1f
+File: bash.info,  Node: Shell Builtin Commands,  Next: Shell Variables,  Prev: Basic Shell Features,  Up: Top
+
+Shell Builtin Commands
+**********************
+
+* Menu:
+
+* Bourne Shell Builtins::      Builtin commands inherited from the Bourne
+                               Shell.
+* Bash Builtins::              Table of builtins specific to Bash.
+* The Set Builtin::            This builtin is so overloaded it
+                               deserves its own section.
+* Special Builtins::           Builtin commands classified specially by
+                               POSIX.2.
+
+   Builtin commands are contained within the shell itself.  When the
+name of a builtin command is used as the first word of a simple command
+(*note Simple Commands::), the shell executes the command directly,
+without invoking another program.  Builtin commands are necessary to
+implement functionality impossible or inconvenient to obtain with
+separate utilities.
+
+   This section briefly the builtins which Bash inherits from the
+Bourne Shell, as well as the builtin commands which are unique to or
+have been extended in Bash.
+
+   Several builtin commands are described in other chapters:  builtin
+commands which provide the Bash interface to the job control facilities
+(*note Job Control Builtins::), the directory stack (*note Directory
+Stack Builtins::), the command history (*note Bash History Builtins::),
+and the programmable completion facilities (*note Programmable
+Completion Builtins::).
+
+   Many of the builtins have been extended by POSIX or Bash.
+
+\1f
+File: bash.info,  Node: Bourne Shell Builtins,  Next: Bash Builtins,  Up: Shell Builtin Commands
+
+Bourne Shell Builtins
+=====================
+
+   The following shell builtin commands are inherited from the Bourne
+Shell.  These commands are implemented as specified by the POSIX 1003.2
+standard.
+
+`:    (a colon)'
+          : [ARGUMENTS]
+     Do nothing beyond expanding ARGUMENTS and performing redirections.
+     The return status is zero.
+
+`.    (a period)'
+          . FILENAME [ARGUMENTS]
+     Read and execute commands from the FILENAME argument in the
+     current shell context.  If FILENAME does not contain a slash, the
+     `PATH' variable is used to find FILENAME.  When Bash is not in
+     POSIX mode, the current directory is searched if FILENAME is not
+     found in `$PATH'.  If any ARGUMENTS are supplied, they become the
+     positional parameters when FILENAME is executed.  Otherwise the
+     positional parameters are unchanged.  The return status is the
+     exit status of the last command executed, or zero if no commands
+     are executed.  If FILENAME is not found, or cannot be read, the
+     return status is non-zero.  This builtin is equivalent to `source'.
+
+`break'
+          break [N]
+     Exit from a `for', `while', `until', or `select' loop.  If N is
+     supplied, the Nth enclosing loop is exited.  N must be greater
+     than or equal to 1.  The return status is zero unless N is not
+     greater than or equal to 1.
+
+`cd'
+          cd [-L|-P] [DIRECTORY]
+     Change the current working directory to DIRECTORY.  If DIRECTORY
+     is not given, the value of the `HOME' shell variable is used.  If
+     the shell variable `CDPATH' exists, it is used as a search path.
+     If DIRECTORY begins with a slash, `CDPATH' is not used.
+
+     The `-P' option means to not follow symbolic links; symbolic links
+     are followed by default or with the `-L' option.  If DIRECTORY is
+     `-', it is equivalent to `$OLDPWD'.
+
+     If a non-empty directory name from `CDPATH' is used, or if `-' is
+     the first argument, and the directory change is successful, the
+     absolute pathname of the new working directory is written to the
+     standard output.
+
+     The return status is zero if the directory is successfully changed,
+     non-zero otherwise.
+
+`continue'
+          continue [N]
+     Resume the next iteration of an enclosing `for', `while', `until',
+     or `select' loop.  If N is supplied, the execution of the Nth
+     enclosing loop is resumed.  N must be greater than or equal to 1.
+     The return status is zero unless N is not greater than or equal to
+     1.
+
+`eval'
+          eval [ARGUMENTS]
+     The arguments are concatenated together into a single command,
+     which is then read and executed, and its exit status returned as
+     the exit status of `eval'.  If there are no arguments or only
+     empty arguments, the return status is zero.
+
+`exec'
+          exec [-cl] [-a NAME] [COMMAND [ARGUMENTS]]
+     If COMMAND is supplied, it replaces the shell without creating a
+     new process.  If the `-l' option is supplied, the shell places a
+     dash at the beginning of the zeroth arg passed to COMMAND.  This
+     is what the `login' program does.  The `-c' option causes COMMAND
+     to be executed with an empty environment.  If `-a' is supplied,
+     the shell passes NAME as the zeroth argument to COMMAND.  If no
+     COMMAND is specified, redirections may be used to affect the
+     current shell environment.  If there are no redirection errors, the
+     return status is zero; otherwise the return status is non-zero.
+
+`exit'
+          exit [N]
+     Exit the shell, returning a status of N to the shell's parent.  If
+     N is omitted, the exit status is that of the last command executed.
+     Any trap on `EXIT' is executed before the shell terminates.
+
+`export'
+          export [-fn] [-p] [NAME[=VALUE]]
+     Mark each NAME to be passed to child processes in the environment.
+     If the `-f' option is supplied, the NAMEs refer to shell
+     functions; otherwise the names refer to shell variables.  The `-n'
+     option means to no longer mark each NAME for export.  If no NAMES
+     are supplied, or if the `-p' option is given, a list of exported
+     names is displayed.  The `-p' option displays output in a form
+     that may be reused as input.  If a variable name is followed by
+     =VALUE, the value of the variable is set to VALUE.
+
+     The return status is zero unless an invalid option is supplied,
+     one of the names is not a valid shell variable name, or `-f' is
+     supplied with a name that is not a shell function.
+
+`getopts'
+          getopts OPTSTRING NAME [ARGS]
+     `getopts' is used by shell scripts to parse positional parameters.
+     OPTSTRING contains the option characters to be recognized; if a
+     character is followed by a colon, the option is expected to have an
+     argument, which should be separated from it by white space.  The
+     colon (`:') and question mark (`?') may not be used as option
+     characters.  Each time it is invoked, `getopts' places the next
+     option in the shell variable NAME, initializing NAME if it does
+     not exist, and the index of the next argument to be processed into
+     the variable `OPTIND'.  `OPTIND' is initialized to 1 each time the
+     shell or a shell script is invoked.  When an option requires an
+     argument, `getopts' places that argument into the variable
+     `OPTARG'.  The shell does not reset `OPTIND' automatically; it
+     must be manually reset between multiple calls to `getopts' within
+     the same shell invocation if a new set of parameters is to be used.
+
+     When the end of options is encountered, `getopts' exits with a
+     return value greater than zero.  `OPTIND' is set to the index of
+     the first non-option argument, and `name' is set to `?'.
+
+     `getopts' normally parses the positional parameters, but if more
+     arguments are given in ARGS, `getopts' parses those instead.
+
+     `getopts' can report errors in two ways.  If the first character of
+     OPTSTRING is a colon, SILENT error reporting is used.  In normal
+     operation diagnostic messages are printed when invalid options or
+     missing option arguments are encountered.  If the variable `OPTERR'
+     is set to 0, no error messages will be displayed, even if the first
+     character of `optstring' is not a colon.
+
+     If an invalid option is seen, `getopts' places `?' into NAME and,
+     if not silent, prints an error message and unsets `OPTARG'.  If
+     `getopts' is silent, the option character found is placed in
+     `OPTARG' and no diagnostic message is printed.
+
+     If a required argument is not found, and `getopts' is not silent,
+     a question mark (`?') is placed in NAME, `OPTARG' is unset, and a
+     diagnostic message is printed.  If `getopts' is silent, then a
+     colon (`:') is placed in NAME and `OPTARG' is set to the option
+     character found.
+
+`hash'
+          hash [-'r] [-p FILENAME] [-dt] [NAME]
+     Remember the full pathnames of commands specified as NAME
+     arguments, so they need not be searched for on subsequent
+     invocations.  The commands are found by searching through the
+     directories listed in `$PATH'.  The `-p' option inhibits the path
+     search, and FILENAME is used as the location of NAME.  The `-r'
+     option causes the shell to forget all remembered locations.  The
+     `-d' option causes the shell to forget the remembered location of
+     each NAME.  If the `-t' option is supplied, the full pathname to
+     which each NAME corresponds is printed.  If multiple NAME
+     arguments are supplied with `-t' the NAME is printed before the
+     hashed full pathname.  The `-l' option causes output to be
+     displayed in a format that may be reused as input.  If no
+     arguments are given, or if only `-l' is supplied, information
+     about remembered commands is printed.  The return status is zero
+     unless a NAME is not found or an invalid option is supplied.
+
+`pwd'
+          pwd [-LP]
+     Print the absolute pathname of the current working directory.  If
+     the `-P' option is supplied, the pathname printed will not contain
+     symbolic links.  If the `-L' option is supplied, the pathname
+     printed may contain symbolic links.  The return status is zero
+     unless an error is encountered while determining the name of the
+     current directory or an invalid option is supplied.
+
+`readonly'
+          readonly [-apf] [NAME[=VALUE]] ...
+     Mark each NAME as readonly.  The values of these names may not be
+     changed by subsequent assignment.  If the `-f' option is supplied,
+     each NAME refers to a shell function.  The `-a' option means each
+     NAME refers to an array variable.  If no NAME arguments are given,
+     or if the `-p' option is supplied, a list of all readonly names is
+     printed.  The `-p' option causes output to be displayed in a
+     format that may be reused as input.  If a variable name is
+     followed by =VALUE, the value of the variable is set to VALUE.
+     The return status is zero unless an invalid option is supplied,
+     one of the NAME arguments is not a valid shell variable or
+     function name, or the `-f' option is supplied with a name that is
+     not a shell function.
+
+`return'
+          return [N]
+     Cause a shell function to exit with the return value N.  If N is
+     not supplied, the return value is the exit status of the last
+     command executed in the function.  This may also be used to
+     terminate execution of a script being executed with the `.' (or
+     `source') builtin, returning either N or the exit status of the
+     last command executed within the script as the exit status of the
+     script.  Any command associated with the `RETURN' trap is executed
+     before execution resumes after the function or script.  The return
+     status is non-zero if `return' is used outside a function and not
+     during the execution of a script by `.' or `source'.
+
+`shift'
+          shift [N]
+     Shift the positional parameters to the left by N.  The positional
+     parameters from N+1 ... `$#' are renamed to `$1' ... `$#'-N+1.
+     Parameters represented by the numbers `$#' to N+1 are unset.  N
+     must be a non-negative number less than or equal to `$#'.  If N is
+     zero or greater than `$#', the positional parameters are not
+     changed.  If N is not supplied, it is assumed to be 1.  The return
+     status is zero unless N is greater than `$#' or less than zero,
+     non-zero otherwise.
+
+`test'
+`['
+     Evaluate a conditional expression EXPR.  Each operator and operand
+     must be a separate argument.  Expressions are composed of the
+     primaries described below in *Note Bash Conditional Expressions::.
+
+     When the `[' form is used, the last argument to the command must
+     be a `]'.
+
+     Expressions may be combined using the following operators, listed
+     in decreasing order of precedence.
+
+    `! EXPR'
+          True if EXPR is false.
+
+    `( EXPR )'
+          Returns the value of EXPR.  This may be used to override the
+          normal precedence of operators.
+
+    `EXPR1 -a EXPR2'
+          True if both EXPR1 and EXPR2 are true.
+
+    `EXPR1 -o EXPR2'
+          True if either EXPR1 or EXPR2 is true.
+
+     The `test' and `[' builtins evaluate conditional expressions using
+     a set of rules based on the number of arguments.
+
+    0 arguments
+          The expression is false.
+
+    1 argument
+          The expression is true if and only if the argument is not
+          null.
+
+    2 arguments
+          If the first argument is `!', the expression is true if and
+          only if the second argument is null.  If the first argument
+          is one of the unary conditional operators (*note Bash
+          Conditional Expressions::), the expression is true if the
+          unary test is true.  If the first argument is not a valid
+          unary operator, the expression is false.
+
+    3 arguments
+          If the second argument is one of the binary conditional
+          operators (*note Bash Conditional Expressions::), the result
+          of the expression is the result of the binary test using the
+          first and third arguments as operands.  If the first argument
+          is `!', the value is the negation of the two-argument test
+          using the second and third arguments.  If the first argument
+          is exactly `(' and the third argument is exactly `)', the
+          result is the one-argument test of the second argument.
+          Otherwise, the expression is false.  The `-a' and `-o'
+          operators are considered binary operators in this case.
+
+    4 arguments
+          If the first argument is `!', the result is the negation of
+          the three-argument expression composed of the remaining
+          arguments.  Otherwise, the expression is parsed and evaluated
+          according to precedence using the rules listed above.
+
+    5 or more arguments
+          The expression is parsed and evaluated according to precedence
+          using the rules listed above.
+
+`times'
+          times
+     Print out the user and system times used by the shell and its
+     children.  The return status is zero.
+
+`trap'
+          trap [-lp] [ARG] [SIGSPEC ...]
+     The commands in ARG are to be read and executed when the shell
+     receives signal SIGSPEC.  If ARG is absent or equal to `-', all
+     specified signals are reset to the values they had when the shell
+     was started.  If ARG is the null string, then the signal specified
+     by each SIGSPEC is ignored by the shell and commands it invokes.
+     If ARG is not present and `-p' has been supplied, the shell
+     displays the trap commands associated with each SIGSPEC.  If no
+     arguments are supplied, or only `-p' is given, `trap' prints the
+     list of commands associated with each signal number in a form that
+     may be reused as shell input.  The `-l' option causes the shell to
+     print a list of signal names and their corresponding numbers.
+
+     Each SIGSPEC is either a signal name such as `SIGINT' (with or
+     without the `SIG' prefix) or a signal number.  If a SIGSPEC is `0'
+     or `EXIT', ARG is executed when the shell exits.  If a SIGSPEC is
+     `DEBUG', the command ARG is executed before every simple command,
+     `for' command, `case' command, `select' command, every arithmetic
+     `for' command, and before the first command executes in a shell
+     function.  Refer to the description of the `extglob' option to the
+     `shopt' builtin (*note Bash Builtins::) for details of its effect
+     on the `DEBUG' trap.  If a SIGSPEC is `ERR', the command ARG is
+     executed whenever a simple command has a non-zero exit status.
+     The `ERR' trap is not executed if the failed command is part of the
+     command list immediately following an `until' or `while' keyword,
+     part of the test in an `if' statement, part of a `&&' or `||'
+     list, or if the command's return status is being inverted using
+     `!'.  If a SIGSPEC is `RETURN', the command ARG is executed each
+     time a shell function or a script executed with the `.' or
+     `source' builtins finishes executing.
+
+     Signals ignored upon entry to the shell cannot be trapped or reset.
+     Trapped signals are reset to their original values in a child
+     process when it is created.
+
+     The return status is zero unless a SIGSPEC does not specify a
+     valid signal.
+
+`umask'
+          umask [-p] [-S] [MODE]
+     Set the shell process's file creation mask to MODE.  If MODE
+     begins with a digit, it is interpreted as an octal number; if not,
+     it is interpreted as a symbolic mode mask similar to that accepted
+     by the `chmod' command.  If MODE is omitted, the current value of
+     the mask is printed.  If the `-S' option is supplied without a
+     MODE argument, the mask is printed in a symbolic format.  If the
+     `-p' option is supplied, and MODE is omitted, the output is in a
+     form that may be reused as input.  The return status is zero if
+     the mode is successfully changed or if no MODE argument is
+     supplied, and non-zero otherwise.
+
+     Note that when the mode is interpreted as an octal number, each
+     number of the umask is subtracted from `7'.  Thus, a umask of `022'
+     results in permissions of `755'.
+
+`unset'
+          unset [-fv] [NAME]
+     Each variable or function NAME is removed.  If no options are
+     supplied, or the `-v' option is given, each NAME refers to a shell
+     variable.  If the `-f' option is given, the NAMEs refer to shell
+     functions, and the function definition is removed.  Readonly
+     variables and functions may not be unset.  The return status is
+     zero unless a NAME is readonly.
+
+\1f
+File: bash.info,  Node: Bash Builtins,  Next: The Set Builtin,  Prev: Bourne Shell Builtins,  Up: Shell Builtin Commands
+
+Bash Builtin Commands
+=====================
+
+   This section describes builtin commands which are unique to or have
+been extended in Bash.  Some of these commands are specified in the
+POSIX 1003.2 standard.
+
+`alias'
+          alias [`-p'] [NAME[=VALUE] ...]
+
+     Without arguments or with the `-p' option, `alias' prints the list
+     of aliases on the standard output in a form that allows them to be
+     reused as input.  If arguments are supplied, an alias is defined
+     for each NAME whose VALUE is given.  If no VALUE is given, the name
+     and value of the alias is printed.  Aliases are described in *Note
+     Aliases::.
+
+`bind'
+          bind [-m KEYMAP] [-lpsvPSV]
+          bind [-m KEYMAP] [-q FUNCTION] [-u FUNCTION] [-r KEYSEQ]
+          bind [-m KEYMAP] -f FILENAME
+          bind [-m KEYMAP] -x KEYSEQ:SHELL-COMMAND
+          bind [-m KEYMAP] KEYSEQ:FUNCTION-NAME
+          bind READLINE-COMMAND
+
+     Display current Readline (*note Command Line Editing::) key and
+     function bindings, bind a key sequence to a Readline function or
+     macro, or set a Readline variable.  Each non-option argument is a
+     command as it would appear in a a Readline initialization file
+     (*note Readline Init File::), but each binding or command must be
+     passed as a separate argument;  e.g.,
+     `"\C-x\C-r":re-read-init-file'.  Options, if supplied, have the
+     following meanings:
+
+    `-m KEYMAP'
+          Use KEYMAP as the keymap to be affected by the subsequent
+          bindings.  Acceptable KEYMAP names are `emacs',
+          `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move',
+          `vi-command', and `vi-insert'.  `vi' is equivalent to
+          `vi-command'; `emacs' is equivalent to `emacs-standard'.
+
+    `-l'
+          List the names of all Readline functions.
+
+    `-p'
+          Display Readline function names and bindings in such a way
+          that they can be used as input or in a Readline
+          initialization file.
+
+    `-P'
+          List current Readline function names and bindings.
+
+    `-v'
+          Display Readline variable names and values in such a way that
+          they can be used as input or in a Readline initialization
+          file.
+
+    `-V'
+          List current Readline variable names and values.
+
+    `-s'
+          Display Readline key sequences bound to macros and the
+          strings they output in such a way that they can be used as
+          input or in a Readline initialization file.
+
+    `-S'
+          Display Readline key sequences bound to macros and the
+          strings they output.
+
+    `-f FILENAME'
+          Read key bindings from FILENAME.
+
+    `-q FUNCTION'
+          Query about which keys invoke the named FUNCTION.
+
+    `-u FUNCTION'
+          Unbind all keys bound to the named FUNCTION.
+
+    `-r KEYSEQ'
+          Remove any current binding for KEYSEQ.
+
+    `-x KEYSEQ:SHELL-COMMAND'
+          Cause SHELL-COMMAND to be executed whenever KEYSEQ is entered.
+
+
+     The return status is zero unless an invalid option is supplied or
+     an error occurs.
+
+`builtin'
+          builtin [SHELL-BUILTIN [ARGS]]
+     Run a shell builtin, passing it ARGS, and return its exit status.
+     This is useful when defining a shell function with the same name
+     as a shell builtin, retaining the functionality of the builtin
+     within the function.  The return status is non-zero if
+     SHELL-BUILTIN is not a shell builtin command.
+
+`caller'
+          caller [EXPR]
+     Returns the context of any active subroutine call (a shell
+     function or a script executed with the `.' or `source' builtins.
+
+     Without EXPR, `caller' displays the line number and source
+     filename of the current subroutine call.  If a non-negative
+     integer is supplied as EXPR, `caller' displays the line number,
+     subroutine name, and source file corresponding to that position in
+     the current execution call stack.  This extra information may be
+     used, for example, to print a stack trace.  The current frame is
+     frame 0.
+
+     The return value is 0 unless the shell is not executing a
+     subroutine call or EXPR does not correspond to a valid position in
+     the call stack.
+
+`command'
+          command [-pVv] COMMAND [ARGUMENTS ...]
+     Runs COMMAND with ARGUMENTS ignoring any shell function named
+     COMMAND.  Only shell builtin commands or commands found by
+     searching the `PATH' are executed.  If there is a shell function
+     named `ls', running `command ls' within the function will execute
+     the external command `ls' instead of calling the function
+     recursively.  The `-p' option means to use a default value for
+     `PATH' that is guaranteed to find all of the standard utilities.
+     The return status in this case is 127 if COMMAND cannot be found
+     or an error occurred, and the exit status of COMMAND otherwise.
+
+     If either the `-V' or `-v' option is supplied, a description of
+     COMMAND is printed.  The `-v' option causes a single word
+     indicating the command or file name used to invoke COMMAND to be
+     displayed; the `-V' option produces a more verbose description.
+     In this case, the return status is zero if COMMAND is found, and
+     non-zero if not.
+
+`declare'
+          declare [-afFirtx] [-p] [NAME[=VALUE] ...]
+
+     Declare variables and give them attributes.  If no NAMEs are
+     given, then display the values of variables instead.
+
+     The `-p' option will display the attributes and values of each
+     NAME.  When `-p' is used, additional options are ignored.  The
+     `-F' option inhibits the display of function definitions; only the
+     function name and attributes are printed.  If the `extdebug' shell
+     option is enabled using `shopt' (*note Bash Builtins::), the
+     source file name and line number where the function is defined are
+     displayed as well.  `-F' implies `-f'.  The following options can
+     be used to restrict output to variables with the specified
+     attributes or to give variables attributes:
+
+    `-a'
+          Each NAME is an array variable (*note Arrays::).
+
+    `-f'
+          Use function names only.
+
+    `-i'
+          The variable is to be treated as an integer; arithmetic
+          evaluation (*note Shell Arithmetic::) is performed when the
+          variable is assigned a value.
+
+    `-r'
+          Make NAMEs readonly.  These names cannot then be assigned
+          values by subsequent assignment statements or unset.
+
+    `-t'
+          Give each NAME the `trace' attribute.  Traced functions
+          inherit the `DEBUG' trap from the calling shell.  The trace
+          attribute has no special meaning for variables.
+
+    `-x'
+          Mark each NAME for export to subsequent commands via the
+          environment.
+
+     Using `+' instead of `-' turns off the attribute instead.  When
+     used in a function, `declare' makes each NAME local, as with the
+     `local' command.  If a variable name is followed by =VALUE, the
+     value of the variable is set to VALUE.
+
+     The return status is zero unless an invalid option is encountered,
+     an attempt is made to define a function using `-f foo=bar', an
+     attempt is made to assign a value to a readonly variable, an
+     attempt is made to assign a value to an array variable without
+     using the compound assignment syntax (*note Arrays::), one of the
+     NAMES is not a valid shell variable name, an attempt is made to
+     turn off readonly status for a readonly variable, an attempt is
+     made to turn off array status for an array variable, or an attempt
+     is made to display a non-existent function with `-f'.
+
+`echo'
+          echo [-neE] [ARG ...]
+     Output the ARGs, separated by spaces, terminated with a newline.
+     The return status is always 0.  If `-n' is specified, the trailing
+     newline is suppressed.  If the `-e' option is given,
+     interpretation of the following backslash-escaped characters is
+     enabled.  The `-E' option disables the interpretation of these
+     escape characters, even on systems where they are interpreted by
+     default.  The `xpg_echo' shell option may be used to dynamically
+     determine whether or not `echo' expands these escape characters by
+     default.  `echo' interprets the following escape sequences:
+    `\a'
+          alert (bell)
+
+    `\b'
+          backspace
+
+    `\c'
+          suppress trailing newline
+
+    `\e'
+          escape
+
+    `\f'
+          form feed
+
+    `\n'
+          new line
+
+    `\r'
+          carriage return
+
+    `\t'
+          horizontal tab
+
+    `\v'
+          vertical tab
+
+    `\\'
+          backslash
+
+    `\0NNN'
+          the eight-bit character whose value is the octal value NNN
+          (zero to three octal digits)
+
+    `\NNN'
+          the eight-bit character whose value is the octal value NNN
+          (one to three octal digits)
+
+    `\xHH'
+          the eight-bit character whose value is the hexadecimal value
+          HH (one or two hex digits)
+
+`enable'
+          enable [-n] [-p] [-f FILENAME] [-ads] [NAME ...]
+     Enable and disable builtin shell commands.  Disabling a builtin
+     allows a disk command which has the same name as a shell builtin
+     to be executed without specifying a full pathname, even though the
+     shell normally searches for builtins before disk commands.  If
+     `-n' is used, the NAMEs become disabled.  Otherwise NAMEs are
+     enabled.  For example, to use the `test' binary found via `$PATH'
+     instead of the shell builtin version, type `enable -n test'.
+
+     If the `-p' option is supplied, or no NAME arguments appear, a
+     list of shell builtins is printed.  With no other arguments, the
+     list consists of all enabled shell builtins.  The `-a' option
+     means to list each builtin with an indication of whether or not it
+     is enabled.
+
+     The `-f' option means to load the new builtin command NAME from
+     shared object FILENAME, on systems that support dynamic loading.
+     The `-d' option will delete a builtin loaded with `-f'.
+
+     If there are no options, a list of the shell builtins is displayed.
+     The `-s' option restricts `enable' to the POSIX special builtins.
+     If `-s' is used with `-f', the new builtin becomes a special
+     builtin (*note Special Builtins::).
+
+     The return status is zero unless a NAME is not a shell builtin or
+     there is an error loading a new builtin from a shared object.
+
+`help'
+          help [-s] [PATTERN]
+     Display helpful information about builtin commands.  If PATTERN is
+     specified, `help' gives detailed help on all commands matching
+     PATTERN, otherwise a list of the builtins is printed.  The `-s'
+     option restricts the information displayed to a short usage
+     synopsis.  The return status is zero unless no command matches
+     PATTERN.
+
+`let'
+          let EXPRESSION [EXPRESSION]
+     The `let' builtin allows arithmetic to be performed on shell
+     variables.  Each EXPRESSION is evaluated according to the rules
+     given below in *Note Shell Arithmetic::.  If the last EXPRESSION
+     evaluates to 0, `let' returns 1; otherwise 0 is returned.
+
+`local'
+          local [OPTION] NAME[=VALUE] ...
+     For each argument, a local variable named NAME is created, and
+     assigned VALUE.  The OPTION can be any of the options accepted by
+     `declare'.  `local' can only be used within a function; it makes
+     the variable NAME have a visible scope restricted to that function
+     and its children.  The return status is zero unless `local' is
+     used outside a function, an invalid NAME is supplied, or NAME is a
+     readonly variable.
+
+`logout'
+          logout [N]
+     Exit a login shell, returning a status of N to the shell's parent.
+
+`printf'
+          `printf' FORMAT [ARGUMENTS]
+     Write the formatted ARGUMENTS to the standard output under the
+     control of the FORMAT.  The FORMAT is a character string which
+     contains three types of objects: plain characters, which are
+     simply copied to standard output, character escape sequences,
+     which are converted and copied to the standard output, and format
+     specifications, each of which causes printing of the next
+     successive ARGUMENT.  In addition to the standard `printf(1)'
+     formats, `%b' causes `printf' to expand backslash escape sequences
+     in the corresponding ARGUMENT, and `%q' causes `printf' to output
+     the corresponding ARGUMENT in a format that can be reused as shell
+     input.
+
+     The FORMAT is reused as necessary to consume all of the ARGUMENTS.
+     If the FORMAT requires more ARGUMENTS than are supplied, the extra
+     format specifications behave as if a zero value or null string, as
+     appropriate, had been supplied.  The return value is zero on
+     success, non-zero on failure.
+
+`read'
+          read [-ers] [-a ANAME] [-d DELIM] [-n NCHARS] [-p PROMPT] [-t TIMEOUT] [-u FD] [NAME ...]
+     One line is read from the standard input, or from the file
+     descriptor FD supplied as an argument to the `-u' option, and the
+     first word is assigned to the first NAME, the second word to the
+     second NAME, and so on, with leftover words and their intervening
+     separators assigned to the last NAME.  If there are fewer words
+     read from the input stream than names, the remaining names are
+     assigned empty values.  The characters in the value of the `IFS'
+     variable are used to split the line into words.  The backslash
+     character `\' may be used to remove any special meaning for the
+     next character read and for line continuation.  If no names are
+     supplied, the line read is assigned to the variable `REPLY'.  The
+     return code is zero, unless end-of-file is encountered, `read'
+     times out, or an invalid file descriptor is supplied as the
+     argument to `-u'.  Options, if supplied, have the following
+     meanings:
+
+    `-a ANAME'
+          The words are assigned to sequential indices of the array
+          variable ANAME, starting at 0.  All elements are removed from
+          ANAME before the assignment.  Other NAME arguments are
+          ignored.
+
+    `-d DELIM'
+          The first character of DELIM is used to terminate the input
+          line, rather than newline.
+
+    `-e'
+          Readline (*note Command Line Editing::) is used to obtain the
+          line.
+
+    `-n NCHARS'
+          `read' returns after reading NCHARS characters rather than
+          waiting for a complete line of input.
+
+    `-p PROMPT'
+          Display PROMPT, without a trailing newline, before attempting
+          to read any input.  The prompt is displayed only if input is
+          coming from a terminal.
+
+    `-r'
+          If this option is given, backslash does not act as an escape
+          character.  The backslash is considered to be part of the
+          line.  In particular, a backslash-newline pair may not be
+          used as a line continuation.
+
+    `-s'
+          Silent mode.  If input is coming from a terminal, characters
+          are not echoed.
+
+    `-t TIMEOUT'
+          Cause `read' to time out and return failure if a complete
+          line of input is not read within TIMEOUT seconds.  This
+          option has no effect if `read' is not reading input from the
+          terminal or a pipe.
+
+    `-u FD'
+          Read input from file descriptor FD.
+
+
+`shopt'
+          shopt [-pqsu] [-o] [OPTNAME ...]
+     Toggle the values of variables controlling optional shell behavior.
+     With no options, or with the `-p' option, a list of all settable
+     options is displayed, with an indication of whether or not each is
+     set.  The `-p' option causes output to be displayed in a form that
+     may be reused as input.  Other options have the following meanings:
+
+    `-s'
+          Enable (set) each OPTNAME.
+
+    `-u'
+          Disable (unset) each OPTNAME.
+
+    `-q'
+          Suppresses normal output; the return status indicates whether
+          the OPTNAME is set or unset.  If multiple OPTNAME arguments
+          are given with `-q', the return status is zero if all
+          OPTNAMES are enabled; non-zero otherwise.
+
+    `-o'
+          Restricts the values of OPTNAME to be those defined for the
+          `-o' option to the `set' builtin (*note The Set Builtin::).
+
+     If either `-s' or `-u' is used with no OPTNAME arguments, the
+     display is limited to those options which are set or unset,
+     respectively.
+
+     Unless otherwise noted, the `shopt' options are disabled (off) by
+     default.
+
+     The return status when listing options is zero if all OPTNAMES are
+     enabled, non-zero otherwise.  When setting or unsetting options,
+     the return status is zero unless an OPTNAME is not a valid shell
+     option.
+
+     The list of `shopt' options is:
+    `cdable_vars'
+          If this is set, an argument to the `cd' builtin command that
+          is not a directory is assumed to be the name of a variable
+          whose value is the directory to change to.
+
+    `cdspell'
+          If set, minor errors in the spelling of a directory component
+          in a `cd' command will be corrected.  The errors checked for
+          are transposed characters, a missing character, and a
+          character too many.  If a correction is found, the corrected
+          path is printed, and the command proceeds.  This option is
+          only used by interactive shells.
+
+    `checkhash'
+          If this is set, Bash checks that a command found in the hash
+          table exists before trying to execute it.  If a hashed
+          command no longer exists, a normal path search is performed.
+
+    `checkwinsize'
+          If set, Bash checks the window size after each command and,
+          if necessary, updates the values of `LINES' and `COLUMNS'.
+
+    `cmdhist'
+          If set, Bash attempts to save all lines of a multiple-line
+          command in the same history entry.  This allows easy
+          re-editing of multi-line commands.
+
+    `dotglob'
+          If set, Bash includes filenames beginning with a `.' in the
+          results of filename expansion.
+
+    `execfail'
+          If this is set, a non-interactive shell will not exit if it
+          cannot execute the file specified as an argument to the `exec'
+          builtin command.  An interactive shell does not exit if `exec'
+          fails.
+
+    `expand_aliases'
+          If set, aliases are expanded as described below under Aliases,
+          *Note Aliases::.  This option is enabled by default for
+          interactive shells.
+
+    `extdebug'
+          If set, behavior intended for use by debuggers is enabled:
+
+            1. The `-F' option to the `declare' builtin (*note Bash
+               Builtins::) displays the source file name and line
+               number corresponding to each function name supplied as
+               an argument.
+
+            2. If the command run by the `DEBUG' trap returns a
+               non-zero value, the next command is skipped and not
+               executed.
+
+            3. If the command run by the `DEBUG' trap returns a value
+               of 2, and the shell is executing in a subroutine (a
+               shell function or a shell script executed by the `.' or
+               `source' builtins), a call to `return' is simulated.
+
+    `extglob'
+          If set, the extended pattern matching features described above
+          (*note Pattern Matching::) are enabled.
+
+    `extquote'
+          If set, `$'STRING'' and `$"STRING"' quoting is performed
+          within `${PARAMETER}' expansions enclosed in double quotes.
+          This option is enabled by default.
+
+    `force_fignore'
+          If set, the suffixes specified by the `FIGNORE' shell variable
+          cause words to be ignored when performing word completion
+          even if the ignored words are the only possible completions.
+          *Note Bash Variables::, for a description of `FIGNORE'.  This
+          option is enabled by default.
+
+    `gnu_errfmt'
+          If set, shell error messages are written in the standard GNU
+          error message format.
+
+    `histappend'
+          If set, the history list is appended to the file named by the
+          value of the `HISTFILE' variable when the shell exits, rather
+          than overwriting the file.
+
+    `histreedit'
+          If set, and Readline is being used, a user is given the
+          opportunity to re-edit a failed history substitution.
+
+    `histverify'
+          If set, and Readline is being used, the results of history
+          substitution are not immediately passed to the shell parser.
+          Instead, the resulting line is loaded into the Readline
+          editing buffer, allowing further modification.
+
+    `hostcomplete'
+          If set, and Readline is being used, Bash will attempt to
+          perform hostname completion when a word containing a `@' is
+          being completed (*note Commands For Completion::).  This
+          option is enabled by default.
+
+    `huponexit'
+          If set, Bash will send `SIGHUP' to all jobs when an
+          interactive login shell exits (*note Signals::).
+
+    `interactive_comments'
+          Allow a word beginning with `#' to cause that word and all
+          remaining characters on that line to be ignored in an
+          interactive shell.  This option is enabled by default.
+
+    `lithist'
+          If enabled, and the `cmdhist' option is enabled, multi-line
+          commands are saved to the history with embedded newlines
+          rather than using semicolon separators where possible.
+
+    `login_shell'
+          The shell sets this option if it is started as a login shell
+          (*note Invoking Bash::).  The value may not be changed.
+
+    `mailwarn'
+          If set, and a file that Bash is checking for mail has been
+          accessed since the last time it was checked, the message
+          `"The mail in MAILFILE has been read"' is displayed.
+
+    `no_empty_cmd_completion'
+          If set, and Readline is being used, Bash will not attempt to
+          search the `PATH' for possible completions when completion is
+          attempted on an empty line.
+
+    `nocaseglob'
+          If set, Bash matches filenames in a case-insensitive fashion
+          when performing filename expansion.
+
+    `nullglob'
+          If set, Bash allows filename patterns which match no files to
+          expand to a null string, rather than themselves.
+
+    `progcomp'
+          If set, the programmable completion facilities (*note
+          Programmable Completion::) are enabled.  This option is
+          enabled by default.
+
+    `promptvars'
+          If set, prompt strings undergo parameter expansion, command
+          substitution, arithmetic expansion, and quote removal after
+          being expanded as described below (*note Printing a Prompt::).
+          This option is enabled by default.
+
+    `restricted_shell'
+          The shell sets this option if it is started in restricted mode
+          (*note The Restricted Shell::).  The value may not be changed.
+          This is not reset when the startup files are executed,
+          allowing the startup files to discover whether or not a shell
+          is restricted.
+
+    `shift_verbose'
+          If this is set, the `shift' builtin prints an error message
+          when the shift count exceeds the number of positional
+          parameters.
+
+    `sourcepath'
+          If set, the `source' builtin uses the value of `PATH' to find
+          the directory containing the file supplied as an argument.
+          This option is enabled by default.
+
+    `xpg_echo'
+          If set, the `echo' builtin expands backslash-escape sequences
+          by default.
+
+
+     The return status when listing options is zero if all OPTNAMES are
+     enabled, non-zero otherwise.  When setting or unsetting options,
+     the return status is zero unless an OPTNAME is not a valid shell
+     option.
+
+`source'
+          source FILENAME
+     A synonym for `.' (*note Bourne Shell Builtins::).
+
+`type'
+          type [-afptP] [NAME ...]
+     For each NAME, indicate how it would be interpreted if used as a
+     command name.
+
+     If the `-t' option is used, `type' prints a single word which is
+     one of `alias', `function', `builtin', `file' or `keyword', if
+     NAME is an alias, shell function, shell builtin, disk file, or
+     shell reserved word, respectively.  If the NAME is not found, then
+     nothing is printed, and `type' returns a failure status.
+
+     If the `-p' option is used, `type' either returns the name of the
+     disk file that would be executed, or nothing if `-t' would not
+     return `file'.
+
+     The `-P' option forces a path search for each NAME, even if `-t'
+     would not return `file'.
+
+     If a command is hashed, `-p' and `-P' print the hashed value, not
+     necessarily the file that appears first in `$PATH'.
+
+     If the `-a' option is used, `type' returns all of the places that
+     contain an executable named FILE.  This includes aliases and
+     functions, if and only if the `-p' option is not also used.
+
+     If the `-f' option is used, `type' does not attempt to find shell
+     functions, as with the `command' builtin.
+
+     The return status is zero if any of the NAMES are found, non-zero
+     if none are found.
+
+`typeset'
+          typeset [-afFrxi] [-p] [NAME[=VALUE] ...]
+     The `typeset' command is supplied for compatibility with the Korn
+     shell; however, it has been deprecated in favor of the `declare'
+     builtin command.
+
+`ulimit'
+          ulimit [-acdflmnpstuvSH] [LIMIT]
+     `ulimit' provides control over the resources available to processes
+     started by the shell, on systems that allow such control.  If an
+     option is given, it is interpreted as follows:
+    `-S'
+          Change and report the soft limit associated with a resource.
+
+    `-H'
+          Change and report the hard limit associated with a resource.
+
+    `-a'
+          All current limits are reported.
+
+    `-c'
+          The maximum size of core files created.
+
+    `-d'
+          The maximum size of a process's data segment.
+
+    `-f'
+          The maximum size of files created by the shell.
+
+    `-l'
+          The maximum size that may be locked into memory.
+
+    `-m'
+          The maximum resident set size.
+
+    `-n'
+          The maximum number of open file descriptors.
+
+    `-p'
+          The pipe buffer size.
+
+    `-s'
+          The maximum stack size.
+
+    `-t'
+          The maximum amount of cpu time in seconds.
+
+    `-u'
+          The maximum number of processes available to a single user.
+
+    `-v'
+          The maximum amount of virtual memory available to the process.
+
+
+     If LIMIT is given, it is the new value of the specified resource;
+     the special LIMIT values `hard', `soft', and `unlimited' stand for
+     the current hard limit, the current soft limit, and no limit,
+     respectively.  Otherwise, the current value of the soft limit for
+     the specified resource is printed, unless the `-H' option is
+     supplied.  When setting new limits, if neither `-H' nor `-S' is
+     supplied, both the hard and soft limits are set.  If no option is
+     given, then `-f' is assumed.  Values are in 1024-byte increments,
+     except for `-t', which is in seconds, `-p', which is in units of
+     512-byte blocks, and `-n' and `-u', which are unscaled values.
+
+     The return status is zero unless an invalid option or argument is
+     supplied, or an error occurs while setting a new limit.
+
+`unalias'
+          unalias [-a] [NAME ... ]
+
+     Remove each NAME from the list of aliases.  If `-a' is supplied,
+     all aliases are removed.  Aliases are described in *Note Aliases::.
+
+
+\1f
+File: bash.info,  Node: The Set Builtin,  Next: Special Builtins,  Prev: Bash Builtins,  Up: Shell Builtin Commands
+
+The Set Builtin
+===============
+
+   This builtin is so complicated that it deserves its own section.
+
+`set'
+          set [--abefhkmnptuvxBCHP] [-o OPTION] [ARGUMENT ...]
+
+     If no options or arguments are supplied, `set' displays the names
+     and values of all shell variables and functions, sorted according
+     to the current locale, in a format that may be reused as input.
+
+     When options are supplied, they set or unset shell attributes.
+     Options, if specified, have the following meanings:
+
+    `-a'
+          Mark variables and function which are modified or created for
+          export to the environment of subsequent commands.
+
+    `-b'
+          Cause the status of terminated background jobs to be reported
+          immediately, rather than before printing the next primary
+          prompt.
+
+    `-e'
+          Exit immediately if a simple command (*note Simple
+          Commands::) exits with a non-zero status, unless the command
+          that fails is part of the command list immediately following
+          a `while' or `until' keyword, part of the test in an `if'
+          statement, part of a `&&' or `||' list, or if the command's
+          return status is being inverted using `!'.  A trap on `ERR',
+          if set, is executed before the shell exits.
+
+    `-f'
+          Disable file name generation (globbing).
+
+    `-h'
+          Locate and remember (hash) commands as they are looked up for
+          execution.  This option is enabled by default.
+
+    `-k'
+          All arguments in the form of assignment statements are placed
+          in the environment for a command, not just those that precede
+          the command name.
+
+    `-m'
+          Job control is enabled (*note Job Control::).
+
+    `-n'
+          Read commands but do not execute them; this may be used to
+          check a script for syntax errors.  This option is ignored by
+          interactive shells.
+
+    `-o OPTION-NAME'
+          Set the option corresponding to OPTION-NAME:
+
+         `allexport'
+               Same as `-a'.
+
+         `braceexpand'
+               Same as `-B'.
+
+         `emacs'
+               Use an `emacs'-style line editing interface (*note
+               Command Line Editing::).
+
+         `errexit'
+               Same as `-e'.
+
+         `errtrace'
+               Same as `-E'.
+
+         `functrace'
+               Same as `-T'.
+
+         `hashall'
+               Same as `-h'.
+
+         `histexpand'
+               Same as `-H'.
+
+         `history'
+               Enable command history, as described in *Note Bash
+               History Facilities::.  This option is on by default in
+               interactive shells.
+
+         `ignoreeof'
+               An interactive shell will not exit upon reading EOF.
+
+         `keyword'
+               Same as `-k'.
+
+         `monitor'
+               Same as `-m'.
+
+         `noclobber'
+               Same as `-C'.
+
+         `noexec'
+               Same as `-n'.
+
+         `noglob'
+               Same as `-f'.
+
+         `nolog'
+               Currently ignored.
+
+         `notify'
+               Same as `-b'.
+
+         `nounset'
+               Same as `-u'.
+
+         `onecmd'
+               Same as `-t'.
+
+         `physical'
+               Same as `-P'.
+
+         `posix'
+               Change the behavior of Bash where the default operation
+               differs from the POSIX 1003.2 standard to match the
+               standard (*note Bash POSIX Mode::).  This is intended to
+               make Bash behave as a strict superset of that standard.
+
+         `privileged'
+               Same as `-p'.
+
+         `verbose'
+               Same as `-v'.
+
+         `vi'
+               Use a `vi'-style line editing interface.
+
+         `xtrace'
+               Same as `-x'.
+
+    `-p'
+          Turn on privileged mode.  In this mode, the `$BASH_ENV' and
+          `$ENV' files are not processed, shell functions are not
+          inherited from the environment, and the `SHELLOPTS' variable,
+          if it appears in the environment, is ignored.  If the shell
+          is started with the effective user (group) id not equal to the
+          real user (group) id, and the `-p' option is not supplied,
+          these actions are taken and the effective user id is set to
+          the real user id.  If the `-p' option is supplied at startup,
+          the effective user id is not reset.  Turning this option off
+          causes the effective user and group ids to be set to the real
+          user and group ids.
+
+    `-t'
+          Exit after reading and executing one command.
+
+    `-u'
+          Treat unset variables as an error when performing parameter
+          expansion.  An error message will be written to the standard
+          error, and a non-interactive shell will exit.
+
+    `-v'
+          Print shell input lines as they are read.
+
+    `-x'
+          Print a trace of simple commands, \fBfor\fP commands,
+          \fBcase\fP commands, \fBselect\fP commands, and arithmetic
+          \fBfor\fP commands and their arguments or associated word
+          lists after they are expanded and before they are executed.
+          The value of the `PS4' variable is expanded and the resultant
+          value is printed before the command and its expanded
+          arguments.
+
+    `-B'
+          The shell will perform brace expansion (*note Brace
+          Expansion::).  This option is on by default.
+
+    `-C'
+          Prevent output redirection using `>', `>&', and `<>' from
+          overwriting existing files.
+
+    `-E'
+          If set, any trap on `ERR' is inherited by shell functions,
+          command substitutions, and commands executed in a subshell
+          environment.  The `ERR' trap is normally not inherited in
+          such cases.
+
+    `-H'
+          Enable `!' style history substitution (*note History
+          Interaction::).  This option is on by default for interactive
+          shells.
+
+    `-P'
+          If set, do not follow symbolic links when performing commands
+          such as `cd' which change the current directory.  The
+          physical directory is used instead.  By default, Bash follows
+          the logical chain of directories when performing commands
+          which change the current directory.
+
+          For example, if `/usr/sys' is a symbolic link to
+          `/usr/local/sys' then:
+               $ cd /usr/sys; echo $PWD
+               /usr/sys
+               $ cd ..; pwd
+               /usr
+
+          If `set -P' is on, then:
+               $ cd /usr/sys; echo $PWD
+               /usr/local/sys
+               $ cd ..; pwd
+               /usr/local
+
+    `-T'
+          If set, any trap on `DEBUG' is inherited by shell functions,
+          command substitutions, and commands executed in a subshell
+          environment.  The `DEBUG' trap is normally not inherited in
+          such cases.
+
+    `--'
+          If no arguments follow this option, then the positional
+          parameters are unset.  Otherwise, the positional parameters
+          are set to the ARGUMENTS, even if some of them begin with a
+          `-'.
+
+    `-'
+          Signal the end of options, cause all remaining ARGUMENTS to
+          be assigned to the positional parameters.  The `-x' and `-v'
+          options are turned off.  If there are no arguments, the
+          positional parameters remain unchanged.
+
+     Using `+' rather than `-' causes these options to be turned off.
+     The options can also be used upon invocation of the shell.  The
+     current set of options may be found in `$-'.
+
+     The remaining N ARGUMENTS are positional parameters and are
+     assigned, in order, to `$1', `$2', ...  `$N'.  The special
+     parameter `#' is set to N.
+
+     The return status is always zero unless an invalid option is
+     supplied.
+
+\1f
+File: bash.info,  Node: Special Builtins,  Prev: The Set Builtin,  Up: Shell Builtin Commands
+
+Special Builtins
+================
+
+   For historical reasons, the POSIX 1003.2 standard has classified
+several builtin commands as _special_.  When Bash is executing in POSIX
+mode, the special builtins differ from other builtin commands in three
+respects:
+
+  1. Special builtins are found before shell functions during command
+     lookup.
+
+  2. If a special builtin returns an error status, a non-interactive
+     shell exits.
+
+  3. Assignment statements preceding the command stay in effect in the
+     shell environment after the command completes.
+
+   When Bash is not executing in POSIX mode, these builtins behave no
+differently than the rest of the Bash builtin commands.  The Bash POSIX
+mode is described in *Note Bash POSIX Mode::.
+
+   These are the POSIX special builtins:
+     break : . continue eval exec exit export readonly return set
+     shift trap unset
+
+\1f
+File: bash.info,  Node: Shell Variables,  Next: Bash Features,  Prev: Shell Builtin Commands,  Up: Top
+
+Shell Variables
+***************
+
+* Menu:
+
+* Bourne Shell Variables::     Variables which Bash uses in the same way
+                               as the Bourne Shell.
+* Bash Variables::             List of variables that exist in Bash.
+
+   This chapter describes the shell variables that Bash uses.  Bash
+automatically assigns default values to a number of variables.
+
+\1f
+File: bash.info,  Node: Bourne Shell Variables,  Next: Bash Variables,  Up: Shell Variables
+
+Bourne Shell Variables
+======================
+
+   Bash uses certain shell variables in the same way as the Bourne
+shell.  In some cases, Bash assigns a default value to the variable.
+
+`CDPATH'
+     A colon-separated list of directories used as a search path for
+     the `cd' builtin command.
+
+`HOME'
+     The current user's home directory; the default for the `cd' builtin
+     command.  The value of this variable is also used by tilde
+     expansion (*note Tilde Expansion::).
+
+`IFS'
+     A list of characters that separate fields; used when the shell
+     splits words as part of expansion.
+
+`MAIL'
+     If this parameter is set to a filename and the `MAILPATH' variable
+     is not set, Bash informs the user of the arrival of mail in the
+     specified file.
+
+`MAILPATH'
+     A colon-separated list of filenames which the shell periodically
+     checks for new mail.  Each list entry can specify the message that
+     is printed when new mail arrives in the mail file by separating
+     the file name from the message with a `?'.  When used in the text
+     of the message, `$_' expands to the name of the current mail file.
+
+`OPTARG'
+     The value of the last option argument processed by the `getopts'
+     builtin.
+
+`OPTIND'
+     The index of the last option argument processed by the `getopts'
+     builtin.
+
+`PATH'
+     A colon-separated list of directories in which the shell looks for
+     commands.  A zero-length (null) directory name in the value of
+     `PATH' indicates the current directory.  A null directory name may
+     appear as two adjacent colons, or as an initial or trailing colon.
+
+`PS1'
+     The primary prompt string.  The default value is `\s-\v\$ '.
+     *Note Printing a Prompt::, for the complete list of escape
+     sequences that are expanded before `PS1' is displayed.
+
+`PS2'
+     The secondary prompt string.  The default value is `> '.
+
+
+\1f
+File: bash.info,  Node: Bash Variables,  Prev: Bourne Shell Variables,  Up: Shell Variables
+
+Bash Variables
+==============
+
+   These variables are set or used by Bash, but other shells do not
+normally treat them specially.
+
+   A few variables used by Bash are described in different chapters:
+variables for controlling the job control facilities (*note Job Control
+Variables::).
+
+`BASH'
+     The full pathname used to execute the current instance of Bash.
+
+`BASH_ARGC'
+     An array variable whose values are the number of parameters in each
+     frame of the current bash execution call stack.  The number of
+     parameters to the current subroutine (shell function or script
+     executed with `.' or `source') is at the top of the stack.  When a
+     subroutine is executed, the number of parameters passed is pushed
+     onto `BASH_ARGC'.
+
+`BASH_ARGV'
+     An array variable containing all of the parameters in the current
+     bash execution call stack.  The final parameter of the last
+     subroutine call is at the top of the stack; the first parameter of
+     the initial call is at the bottom.  When a subroutine is executed,
+     the parameters supplied are pushed onto `BASH_ARGV'.
+
+`BASH_COMMAND'
+     The command currently being executed or about to be executed,
+     unless the shell is executing a command as the result of a trap,
+     in which case it is the command executing at the time of the trap.
+
+`BASH_ENV'
+     If this variable is set when Bash is invoked to execute a shell
+     script, its value is expanded and used as the name of a startup
+     file to read before executing the script.  *Note Bash Startup
+     Files::.
+
+`BASH_EXECUTION_STRING'
+     The command argument to the `-c' invocation option.
+
+`BASH_LINENO'
+     An array variable whose members are the line numbers in source
+     files corresponding to each member of FUNCNAME.
+     `${BASH_LINENO[$i]}' is the line number in the source file where
+     `${FUNCNAME[$i + 1]}' was called.  The corresponding source file
+     name is `${BASH_SOURCE[$i + 1]}'.  Use `LINENO' to obtain the
+     current line number.
+
+`BASH_SOURCE'
+     An array variable whose members are the source filenames
+     corresponding to the elements in the `FUNCNAME' array variable.
+
+`BASH_SUBSHELL'
+     Incremented by one each time a subshell or subshell environment is
+     spawned.  The initial value is 0.
+
+`BASH_VERSINFO'
+     A readonly array variable (*note Arrays::) whose members hold
+     version information for this instance of Bash.  The values
+     assigned to the array members are as follows:
+
+    `BASH_VERSINFO[0]'
+          The major version number (the RELEASE).
+
+    `BASH_VERSINFO[1]'
+          The minor version number (the VERSION).
+
+    `BASH_VERSINFO[2]'
+          The patch level.
+
+    `BASH_VERSINFO[3]'
+          The build version.
+
+    `BASH_VERSINFO[4]'
+          The release status (e.g., BETA1).
+
+    `BASH_VERSINFO[5]'
+          The value of `MACHTYPE'.
+
+
+`BASH_VERSION'
+     The version number of the current instance of Bash.
+
+`COLUMNS'
+     Used by the `select' builtin command to determine the terminal
+     width when printing selection lists.  Automatically set upon
+     receipt of a `SIGWINCH'.
+
+`COMP_CWORD'
+     An index into `${COMP_WORDS}' of the word containing the current
+     cursor position.  This variable is available only in shell
+     functions invoked by the programmable completion facilities (*note
+     Programmable Completion::).
+
+`COMP_LINE'
+     The current command line.  This variable is available only in
+     shell functions and external commands invoked by the programmable
+     completion facilities (*note Programmable Completion::).
+
+`COMP_POINT'
+     The index of the current cursor position relative to the beginning
+     of the current command.  If the current cursor position is at the
+     end of the current command, the value of this variable is equal to
+     `${#COMP_LINE}'.  This variable is available only in shell
+     functions and external commands invoked by the programmable
+     completion facilities (*note Programmable Completion::).
+
+`COMP_WORDBREAKS'
+     The set of characters that the Readline library treats as word
+     separators when performing word completion.  If `COMP_WORDBREAKS'
+     is unset, it loses its special properties, even if it is
+     subsequently reset.
+
+`COMP_WORDS'
+     An array variable consisting of the individual words in the
+     current command line.  This variable is available only in shell
+     functions invoked by the programmable completion facilities (*note
+     Programmable Completion::).
+
+`COMPREPLY'
+     An array variable from which Bash reads the possible completions
+     generated by a shell function invoked by the programmable
+     completion facility (*note Programmable Completion::).
+
+`DIRSTACK'
+     An array variable containing the current contents of the directory
+     stack.  Directories appear in the stack in the order they are
+     displayed by the `dirs' builtin.  Assigning to members of this
+     array variable may be used to modify directories already in the
+     stack, but the `pushd' and `popd' builtins must be used to add and
+     remove directories.  Assignment to this variable will not change
+     the current directory.  If `DIRSTACK' is unset, it loses its
+     special properties, even if it is subsequently reset.
+
+`EMACS'
+     If Bash finds this variable in the environment when the shell
+     starts with value `t', it assumes that the shell is running in an
+     emacs shell buffer and disables line editing.
+
+`EUID'
+     The numeric effective user id of the current user.  This variable
+     is readonly.
+
+`FCEDIT'
+     The editor used as a default by the `-e' option to the `fc'
+     builtin command.
+
+`FIGNORE'
+     A colon-separated list of suffixes to ignore when performing
+     filename completion.  A file name whose suffix matches one of the
+     entries in `FIGNORE' is excluded from the list of matched file
+     names.  A sample value is `.o:~'
+
+`FUNCNAME'
+     An array variable containing the names of all shell functions
+     currently in the execution call stack.  The element with index 0
+     is the name of any currently-executing shell function.  The
+     bottom-most element is "main".  This variable exists only when a
+     shell function is executing.  Assignments to `FUNCNAME' have no
+     effect and return an error status.  If `FUNCNAME' is unset, it
+     loses its special properties, even if it is subsequently reset.
+
+`GLOBIGNORE'
+     A colon-separated list of patterns defining the set of filenames to
+     be ignored by filename expansion.  If a filename matched by a
+     filename expansion pattern also matches one of the patterns in
+     `GLOBIGNORE', it is removed from the list of matches.
+
+`GROUPS'
+     An array variable containing the list of groups of which the
+     current user is a member.  Assignments to `GROUPS' have no effect
+     and return an error status.  If `GROUPS' is unset, it loses its
+     special properties, even if it is subsequently reset.
+
+`histchars'
+     Up to three characters which control history expansion, quick
+     substitution, and tokenization (*note History Interaction::).  The
+     first character is the HISTORY EXPANSION character, that is, the
+     character which signifies the start of a history expansion,
+     normally `!'.  The second character is the character which
+     signifies `quick substitution' when seen as the first character on
+     a line, normally `^'.  The optional third character is the
+     character which indicates that the remainder of the line is a
+     comment when found as the first character of a word, usually `#'.
+     The history comment character causes history substitution to be
+     skipped for the remaining words on the line.  It does not
+     necessarily cause the shell parser to treat the rest of the line
+     as a comment.
+
+`HISTCMD'
+     The history number, or index in the history list, of the current
+     command.  If `HISTCMD' is unset, it loses its special properties,
+     even if it is subsequently reset.
+
+`HISTCONTROL'
+     A colon-separated list of values controlling how commands are
+     saved on the history list.  If the list of values includes
+     `ignorespace', lines which begin with a space character are not
+     saved in the history list.  A value of `ignoredups' causes lines
+     which match the previous history entry to not be saved.  A value
+     of `ignoreboth' is shorthand for `ignorespace' and `ignoredups'.
+     A value of `erasedups' causes all previous lines matching the
+     current line to be removed from the history list before that line
+     is saved.  Any value not in the above list is ignored.  If
+     `HISTCONTROL' is unset, or does not include a valid value, all
+     lines read by the shell parser are saved on the history list,
+     subject to the value of `HISTIGNORE'.  The second and subsequent
+     lines of a multi-line compound command are not tested, and are
+     added to the history regardless of the value of `HISTCONTROL'.
+
+`HISTFILE'
+     The name of the file to which the command history is saved.  The
+     default value is `~/.bash_history'.
+
+`HISTFILESIZE'
+     The maximum number of lines contained in the history file.  When
+     this variable is assigned a value, the history file is truncated,
+     if necessary, to contain no more than that number of lines.  The
+     history file is also truncated to this size after writing it when
+     an interactive shell exits.  The default value is 500.
+
+`HISTIGNORE'
+     A colon-separated list of patterns used to decide which command
+     lines should be saved on the history list.  Each pattern is
+     anchored at the beginning of the line and must match the complete
+     line (no implicit `*' is appended).  Each pattern is tested
+     against the line after the checks specified by `HISTCONTROL' are
+     applied.  In addition to the normal shell pattern matching
+     characters, `&' matches the previous history line.  `&' may be
+     escaped using a backslash; the backslash is removed before
+     attempting a match.  The second and subsequent lines of a
+     multi-line compound command are not tested, and are added to the
+     history regardless of the value of `HISTIGNORE'.
+
+     `HISTIGNORE' subsumes the function of `HISTCONTROL'.  A pattern of
+     `&' is identical to `ignoredups', and a pattern of `[ ]*' is
+     identical to `ignorespace'.  Combining these two patterns,
+     separating them with a colon, provides the functionality of
+     `ignoreboth'.
+
+`HISTSIZE'
+     The maximum number of commands to remember on the history list.
+     The default value is 500.
+
+`HOSTFILE'
+     Contains the name of a file in the same format as `/etc/hosts' that
+     should be read when the shell needs to complete a hostname.  The
+     list of possible hostname completions may be changed while the
+     shell is running; the next time hostname completion is attempted
+     after the value is changed, Bash adds the contents of the new file
+     to the existing list.  If `HOSTFILE' is set, but has no value,
+     Bash attempts to read `/etc/hosts' to obtain the list of possible
+     hostname completions.  When `HOSTFILE' is unset, the hostname list
+     is cleared.
+
+`HOSTNAME'
+     The name of the current host.
+
+`HOSTTYPE'
+     A string describing the machine Bash is running on.
+
+`IGNOREEOF'
+     Controls the action of the shell on receipt of an `EOF' character
+     as the sole input.  If set, the value denotes the number of
+     consecutive `EOF' characters that can be read as the first
+     character on an input line before the shell will exit.  If the
+     variable exists but does not have a numeric value (or has no
+     value) then the default is 10.  If the variable does not exist,
+     then `EOF' signifies the end of input to the shell.  This is only
+     in effect for interactive shells.
+
+`INPUTRC'
+     The name of the Readline initialization file, overriding the
+     default of `~/.inputrc'.
+
+`LANG'
+     Used to determine the locale category for any category not
+     specifically selected with a variable starting with `LC_'.
+
+`LC_ALL'
+     This variable overrides the value of `LANG' and any other `LC_'
+     variable specifying a locale category.
+
+`LC_COLLATE'
+     This variable determines the collation order used when sorting the
+     results of filename expansion, and determines the behavior of
+     range expressions, equivalence classes, and collating sequences
+     within filename expansion and pattern matching (*note Filename
+     Expansion::).
+
+`LC_CTYPE'
+     This variable determines the interpretation of characters and the
+     behavior of character classes within filename expansion and pattern
+     matching (*note Filename Expansion::).
+
+`LC_MESSAGES'
+     This variable determines the locale used to translate double-quoted
+     strings preceded by a `$' (*note Locale Translation::).
+
+`LC_NUMERIC'
+     This variable determines the locale category used for number
+     formatting.
+
+`LINENO'
+     The line number in the script or shell function currently
+     executing.
+
+`LINES'
+     Used by the `select' builtin command to determine the column length
+     for printing selection lists.  Automatically set upon receipt of a
+     `SIGWINCH'.
+
+`MACHTYPE'
+     A string that fully describes the system type on which Bash is
+     executing, in the standard GNU CPU-COMPANY-SYSTEM format.
+
+`MAILCHECK'
+     How often (in seconds) that the shell should check for mail in the
+     files specified in the `MAILPATH' or `MAIL' variables.  The
+     default is 60 seconds.  When it is time to check for mail, the
+     shell does so before displaying the primary prompt.  If this
+     variable is unset, or set to a value that is not a number greater
+     than or equal to zero, the shell disables mail checking.
+
+`OLDPWD'
+     The previous working directory as set by the `cd' builtin.
+
+`OPTERR'
+     If set to the value 1, Bash displays error messages generated by
+     the `getopts' builtin command.
+
+`OSTYPE'
+     A string describing the operating system Bash is running on.
+
+`PIPESTATUS'
+     An array variable (*note Arrays::) containing a list of exit
+     status values from the processes in the most-recently-executed
+     foreground pipeline (which may contain only a single command).
+
+`POSIXLY_CORRECT'
+     If this variable is in the environment when `bash' starts, the
+     shell enters POSIX mode (*note Bash POSIX Mode::) before reading
+     the startup files, as if the `--posix' invocation option had been
+     supplied.  If it is set while the shell is running, `bash' enables
+     POSIX mode, as if the command
+          `set -o posix'
+
+     had been executed.
+
+`PPID'
+     The process ID of the shell's parent process.  This variable is
+     readonly.
+
+`PROMPT_COMMAND'
+     If set, the value is interpreted as a command to execute before
+     the printing of each primary prompt (`$PS1').
+
+`PS3'
+     The value of this variable is used as the prompt for the `select'
+     command.  If this variable is not set, the `select' command
+     prompts with `#? '
+
+`PS4'
+     The value is the prompt printed before the command line is echoed
+     when the `-x' option is set (*note The Set Builtin::).  The first
+     character of `PS4' is replicated multiple times, as necessary, to
+     indicate multiple levels of indirection.  The default is `+ '.
+
+`PWD'
+     The current working directory as set by the `cd' builtin.
+
+`RANDOM'
+     Each time this parameter is referenced, a random integer between 0
+     and 32767 is generated.  Assigning a value to this variable seeds
+     the random number generator.
+
+`REPLY'
+     The default variable for the `read' builtin.
+
+`SECONDS'
+     This variable expands to the number of seconds since the shell was
+     started.  Assignment to this variable resets the count to the
+     value assigned, and the expanded value becomes the value assigned
+     plus the number of seconds since the assignment.
+
+`SHELLOPTS'
+     A colon-separated list of enabled shell options.  Each word in the
+     list is a valid argument for the `-o' option to the `set' builtin
+     command (*note The Set Builtin::).  The options appearing in
+     `SHELLOPTS' are those reported as `on' by `set -o'.  If this
+     variable is in the environment when Bash starts up, each shell
+     option in the list will be enabled before reading any startup
+     files.  This variable is readonly.
+
+`SHLVL'
+     Incremented by one each time a new instance of Bash is started.
+     This is intended to be a count of how deeply your Bash shells are
+     nested.
+
+`TIMEFORMAT'
+     The value of this parameter is used as a format string specifying
+     how the timing information for pipelines prefixed with the `time'
+     reserved word should be displayed.  The `%' character introduces an
+     escape sequence that is expanded to a time value or other
+     information.  The escape sequences and their meanings are as
+     follows; the braces denote optional portions.
+
+    `%%'
+          A literal `%'.
+
+    `%[P][l]R'
+          The elapsed time in seconds.
+
+    `%[P][l]U'
+          The number of CPU seconds spent in user mode.
+
+    `%[P][l]S'
+          The number of CPU seconds spent in system mode.
+
+    `%P'
+          The CPU percentage, computed as (%U + %S) / %R.
+
+     The optional P is a digit specifying the precision, the number of
+     fractional digits after a decimal point.  A value of 0 causes no
+     decimal point or fraction to be output.  At most three places
+     after the decimal point may be specified; values of P greater than
+     3 are changed to 3.  If P is not specified, the value 3 is used.
+
+     The optional `l' specifies a longer format, including minutes, of
+     the form MMmSS.FFs.  The value of P determines whether or not the
+     fraction is included.
+
+     If this variable is not set, Bash acts as if it had the value
+          `$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS''
+     If the value is null, no timing information is displayed.  A
+     trailing newline is added when the format string is displayed.
+
+`TMOUT'
+     If set to a value greater than zero, `TMOUT' is treated as the
+     default timeout for the `read' builtin (*note Bash Builtins::).
+     The `select' command (*note Conditional Constructs::) terminates
+     if input does not arrive after `TMOUT' seconds when input is coming
+     from a terminal.
+
+     In an interative shell, the value is interpreted as the number of
+     seconds to wait for input after issuing the primary prompt when
+     the shell is interactive.  Bash terminates after that number of
+     seconds if input does not arrive.
+
+`UID'
+     The numeric real user id of the current user.  This variable is
+     readonly.
+
+
+\1f
+File: bash.info,  Node: Bash Features,  Next: Job Control,  Prev: Shell Variables,  Up: Top
+
+Bash Features
+*************
+
+   This section describes features unique to Bash.
+
+* Menu:
+
+* Invoking Bash::              Command line options that you can give
+                               to Bash.
+* Bash Startup Files::         When and how Bash executes scripts.
+* Interactive Shells::         What an interactive shell is.
+* Bash Conditional Expressions::       Primitives used in composing expressions for
+                               the `test' builtin.
+* Shell Arithmetic::           Arithmetic on shell variables.
+* Aliases::                    Substituting one command for another.
+* Arrays::                     Array Variables.
+* The Directory Stack::                History of visited directories.
+* Printing a Prompt::          Controlling the PS1 string.
+* The Restricted Shell::       A more controlled mode of shell execution.
+* Bash POSIX Mode::            Making Bash behave more closely to what
+                               the POSIX standard specifies.
+
+\1f
+File: bash.info,  Node: Invoking Bash,  Next: Bash Startup Files,  Up: Bash Features
+
+Invoking Bash
+=============
+
+     bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o OPTION] [-O SHOPT_OPTION] [ARGUMENT ...]
+     bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o OPTION] [-O SHOPT_OPTION] -c STRING [ARGUMENT ...]
+     bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o OPTION] [-O SHOPT_OPTION] [ARGUMENT ...]
+
+   In addition to the single-character shell command-line options
+(*note The Set Builtin::), there are several multi-character options
+that you can use.  These options must appear on the command line before
+the single-character options to be recognized.
+
+`--debugger'
+     Arrange for the debugger profile to be executed before the shell
+     starts.  Turns on extended debugging mode (see *Note Bash
+     Builtins:: for a description of the `extdebug' option to the
+     `shopt' builtin) and shell function tracing (see *Note The Set
+     Builtin:: for a description of the `-o functrace' option).
+
+`--dump-po-strings'
+     A list of all double-quoted strings preceded by `$' is printed on
+     the standard ouput in the GNU `gettext' PO (portable object) file
+     format.  Equivalent to `-D' except for the output format.
+
+`--dump-strings'
+     Equivalent to `-D'.
+
+`--help'
+     Display a usage message on standard output and exit sucessfully.
+
+`--init-file FILENAME'
+`--rcfile FILENAME'
+     Execute commands from FILENAME (instead of `~/.bashrc') in an
+     interactive shell.
+
+`--login'
+     Equivalent to `-l'.
+
+`--noediting'
+     Do not use the GNU Readline library (*note Command Line Editing::)
+     to read  command lines when the shell is interactive.
+
+`--noprofile'
+     Don't load the system-wide startup file `/etc/profile' or any of
+     the personal initialization files `~/.bash_profile',
+     `~/.bash_login', or `~/.profile' when Bash is invoked as a login
+     shell.
+
+`--norc'
+     Don't read the `~/.bashrc' initialization file in an interactive
+     shell.  This is on by default if the shell is invoked as `sh'.
+
+`--posix'
+     Change the behavior of Bash where the default operation differs
+     from the POSIX 1003.2 standard to match the standard.  This is
+     intended to make Bash behave as a strict superset of that
+     standard.  *Note Bash POSIX Mode::, for a description of the Bash
+     POSIX mode.
+
+`--restricted'
+     Make the shell a restricted shell (*note The Restricted Shell::).
+
+`--verbose'
+     Equivalent to `-v'.  Print shell input lines as they're read.
+
+`--version'
+     Show version information for this instance of Bash on the standard
+     output and exit successfully.
+
+
+   There are several single-character options that may be supplied at
+invocation which are not available with the `set' builtin.
+
+`-c STRING'
+     Read and execute commands from STRING after processing the
+     options, then exit.  Any remaining arguments are assigned to the
+     positional parameters, starting with `$0'.
+
+`-i'
+     Force the shell to run interactively.  Interactive shells are
+     described in *Note Interactive Shells::.
+
+`-l'
+     Make this shell act as if it had been directly invoked by login.
+     When the shell is interactive, this is equivalent to starting a
+     login shell with `exec -l bash'.  When the shell is not
+     interactive, the login shell startup files will be executed.
+     `exec bash -l' or `exec bash --login' will replace the current
+     shell with a Bash login shell.  *Note Bash Startup Files::, for a
+     description of the special behavior of a login shell.
+
+`-r'
+     Make the shell a restricted shell (*note The Restricted Shell::).
+
+`-s'
+     If this option is present, or if no arguments remain after option
+     processing, then commands are read from the standard input.  This
+     option allows the positional parameters to be set when invoking an
+     interactive shell.
+
+`-D'
+     A list of all double-quoted strings preceded by `$' is printed on
+     the standard ouput.  These are the strings that are subject to
+     language translation when the current locale is not `C' or `POSIX'
+     (*note Locale Translation::).  This implies the `-n' option; no
+     commands will be executed.
+
+`[-+]O [SHOPT_OPTION]'
+     SHOPT_OPTION is one of the shell options accepted by the `shopt'
+     builtin (*note Shell Builtin Commands::).  If SHOPT_OPTION is
+     present, `-O' sets the value of that option; `+O' unsets it.  If
+     SHOPT_OPTION is not supplied, the names and values of the shell
+     options accepted by `shopt' are printed on the standard output.
+     If the invocation option is `+O', the output is displayed in a
+     format that may be reused as input.
+
+`--'
+     A `--' signals the end of options and disables further option
+     processing.  Any arguments after the `--' are treated as filenames
+     and arguments.
+
+
+   A _login_ shell is one whose first character of argument zero is
+`-', or one invoked with the `--login' option.
+
+   An _interactive_ shell is one started without non-option arguments,
+unless `-s' is specified, without specifying the `-c' option, and whose
+input and output are both connected to terminals (as determined by
+`isatty(3)'), or one started with the `-i' option.  *Note Interactive
+Shells::, for more information.
+
+   If arguments remain after option processing, and neither the `-c'
+nor the `-s' option has been supplied, the first argument is assumed to
+be the name of a file containing shell commands (*note Shell Scripts::).
+When Bash is invoked in this fashion, `$0' is set to the name of the
+file, and the positional parameters are set to the remaining arguments.
+Bash reads and executes commands from this file, then exits.  Bash's
+exit status is the exit status of the last command executed in the
+script.  If no commands are executed, the exit status is 0.
+
+\1f
+File: bash.info,  Node: Bash Startup Files,  Next: Interactive Shells,  Prev: Invoking Bash,  Up: Bash Features
+
+Bash Startup Files
+==================
+
+   This section describs how Bash executes its startup files.  If any
+of the files exist but cannot be read, Bash reports an error.  Tildes
+are expanded in file names as described above under Tilde Expansion
+(*note Tilde Expansion::).
+
+   Interactive shells are described in *Note Interactive Shells::.
+
+Invoked as an interactive login shell, or with `--login'
+........................................................
+
+   When Bash is invoked as an interactive login shell, or as a
+non-interactive shell with the `--login' option, it first reads and
+executes commands from the file `/etc/profile', if that file exists.
+After reading that file, it looks for `~/.bash_profile',
+`~/.bash_login', and `~/.profile', in that order, and reads and
+executes commands from the first one that exists and is readable.  The
+`--noprofile' option may be used when the shell is started to inhibit
+this behavior.
+
+   When a login shell exits, Bash reads and executes commands from the
+file `~/.bash_logout', if it exists.
+
+Invoked as an interactive non-login shell
+.........................................
+
+   When an interactive shell that is not a login shell is started, Bash
+reads and executes commands from `~/.bashrc', if that file exists.
+This may be inhibited by using the `--norc' option.  The `--rcfile
+FILE' option will force Bash to read and execute commands from FILE
+instead of `~/.bashrc'.
+
+   So, typically, your `~/.bash_profile' contains the line
+     `if [ -f ~/.bashrc ]; then . ~/.bashrc; fi'
+
+after (or before) any login-specific initializations.
+
+Invoked non-interactively
+.........................
+
+   When Bash is started non-interactively, to run a shell script, for
+example, it looks for the variable `BASH_ENV' in the environment,
+expands its value if it appears there, and uses the expanded value as
+the name of a file to read and execute.  Bash behaves as if the
+following command were executed:
+     `if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi'
+
+but the value of the `PATH' variable is not used to search for the file
+name.
+
+   As noted above, if a non-interactive shell is invoked with the
+`--login' option, Bash attempts to read and execute commands from the
+login shell startup files.
+
+Invoked with name `sh'
+......................
+
+   If Bash is invoked with the name `sh', it tries to mimic the startup
+behavior of historical versions of `sh' as closely as possible, while
+conforming to the POSIX standard as well.
+
+   When invoked as an interactive login shell, or as a non-interactive
+shell with the `--login' option, it first attempts to read and execute
+commands from `/etc/profile' and `~/.profile', in that order.  The
+`--noprofile' option may be used to inhibit this behavior.  When
+invoked as an interactive shell with the name `sh', Bash looks for the
+variable `ENV', expands its value if it is defined, and uses the
+expanded value as the name of a file to read and execute.  Since a
+shell invoked as `sh' does not attempt to read and execute commands
+from any other startup files, the `--rcfile' option has no effect.  A
+non-interactive shell invoked with the name `sh' does not attempt to
+read any other startup files.
+
+   When invoked as `sh', Bash enters POSIX mode after the startup files
+are read.
+
+Invoked in POSIX mode
+.....................
+
+   When Bash is started in POSIX mode, as with the `--posix' command
+line option, it follows the POSIX standard for startup files.  In this
+mode, interactive shells expand the `ENV' variable and commands are
+read and executed from the file whose name is the expanded value.  No
+other startup files are read.
+
+Invoked by remote shell daemon
+..............................
+
+   Bash attempts to determine when it is being run by the remote shell
+daemon, usually `rshd'.  If Bash determines it is being run by rshd, it
+reads and executes commands from `~/.bashrc', if that file exists and
+is readable.  It will not do this if invoked as `sh'.  The `--norc'
+option may be used to inhibit this behavior, and the `--rcfile' option
+may be used to force another file to be read, but `rshd' does not
+generally invoke the shell with those options or allow them to be
+specified.
+
+Invoked with unequal effective and real UID/GIDs
+................................................
+
+   If Bash is started with the effective user (group) id not equal to
+the real user (group) id, and the `-p' option is not supplied, no
+startup files are read, shell functions are not inherited from the
+environment, the `SHELLOPTS' variable, if it appears in the
+environment, is ignored, and the effective user id is set to the real
+user id.  If the `-p' option is supplied at invocation, the startup
+behavior is the same, but the effective user id is not reset.
+
+\1f
+File: bash.info,  Node: Interactive Shells,  Next: Bash Conditional Expressions,  Prev: Bash Startup Files,  Up: Bash Features
+
+Interactive Shells
+==================
+
+* Menu:
+
+* What is an Interactive Shell?::      What determines whether a shell is Interactive.
+* Is this Shell Interactive?:: How to tell if a shell is interactive.
+* Interactive Shell Behavior:: What changes in a interactive shell?
+
+\1f
+File: bash.info,  Node: What is an Interactive Shell?,  Next: Is this Shell Interactive?,  Up: Interactive Shells
+
+What is an Interactive Shell?
+-----------------------------
+
+   An interactive shell is one started without non-option arguments,
+unless `-s' is specified, without specifiying the `-c' option, and
+whose input and output are both connected to terminals (as determined
+by `isatty(3)'), or one started with the `-i' option.
+
+   An interactive shell generally reads from and writes to a user's
+terminal.
+
+   The `-s' invocation option may be used to set the positional
+parameters when an interactive shell is started.
+
+\1f
+File: bash.info,  Node: Is this Shell Interactive?,  Next: Interactive Shell Behavior,  Prev: What is an Interactive Shell?,  Up: Interactive Shells
+
+Is this Shell Interactive?
+--------------------------
+
+   To determine within a startup script whether or not Bash is running
+interactively, test the value of the `-' special parameter.  It
+contains `i' when the shell is interactive.  For example:
+
+     case "$-" in
+     *i*)      echo This shell is interactive ;;
+     *)        echo This shell is not interactive ;;
+     esac
+
+   Alternatively, startup scripts may examine the variable `PS1'; it is
+unset in non-interactive shells, and set in interactive shells.  Thus:
+
+     if [ -z "$PS1" ]; then
+             echo This shell is not interactive
+     else
+             echo This shell is interactive
+     fi
+
+\1f
+File: bash.info,  Node: Interactive Shell Behavior,  Prev: Is this Shell Interactive?,  Up: Interactive Shells
+
+Interactive Shell Behavior
+--------------------------
+
+   When the shell is running interactively, it changes its behavior in
+several ways.
+
+  1. Startup files are read and executed as described in *Note Bash
+     Startup Files::.
+
+  2. Job Control (*note Job Control::) is enabled by default.  When job
+     control is in effect, Bash ignores the keyboard-generated job
+     control signals `SIGTTIN', `SIGTTOU', and `SIGTSTP'.
+
+  3. Bash expands and displays `PS1' before reading the first line of a
+     command, and expands and displays `PS2' before reading the second
+     and subsequent lines of a multi-line command.
+
+  4. Bash executes the value of the `PROMPT_COMMAND' variable as a
+     command before printing the primary prompt, `$PS1' (*note Bash
+     Variables::).
+
+  5. Readline (*note Command Line Editing::) is used to read commands
+     from the user's terminal.
+
+  6. Bash inspects the value of the `ignoreeof' option to `set -o'
+     instead of exiting immediately when it receives an `EOF' on its
+     standard input when reading a command (*note The Set Builtin::).
+
+  7. Command history (*note Bash History Facilities::) and history
+     expansion (*note History Interaction::) are enabled by default.
+     Bash will save the command history to the file named by `$HISTFILE'
+     when an interactive shell exits.
+
+  8. Alias expansion (*note Aliases::) is performed by default.
+
+  9. In the absence of any traps, Bash ignores `SIGTERM' (*note
+     Signals::).
+
+ 10. In the absence of any traps, `SIGINT' is caught and handled
+     ((*note Signals::).  `SIGINT' will interrupt some shell builtins.
+
+ 11. An interactive login shell sends a `SIGHUP' to all jobs on exit if
+     the `hupoxexit' shell option has been enabled (*note Signals::).
+
+ 12. The `-n' invocation option is ignored, and `set -n' has no effect
+     (*note The Set Builtin::).
+
+ 13. Bash will check for mail periodically, depending on the values of
+     the `MAIL', `MAILPATH', and `MAILCHECK' shell variables (*note
+     Bash Variables::).
+
+ 14. Expansion errors due to references to unbound shell variables after
+     `set -u' has been enabled will not cause the shell to exit (*note
+     The Set Builtin::).
+
+ 15. The shell will not exit on expansion errors caused by VAR being
+     unset or null in `${VAR:?WORD}' expansions (*note Shell Parameter
+     Expansion::).
+
+ 16. Redirection errors encountered by shell builtins will not cause the
+     shell to exit.
+
+ 17. When running in POSIX mode, a special builtin returning an error
+     status will not cause the shell to exit (*note Bash POSIX Mode::).
+
+ 18. A failed `exec' will not cause the shell to exit (*note Bourne
+     Shell Builtins::).
+
+ 19. Parser syntax errors will not cause the shell to exit.
+
+ 20. Simple spelling correction for directory arguments to the `cd'
+     builtin is enabled by default (see the description of the `cdspell'
+     option to the `shopt' builtin in *Note Bash Builtins::).
+
+ 21. The shell will check the value of the `TMOUT' variable and exit if
+     a command is not read within the specified number of seconds after
+     printing `$PS1' (*note Bash Variables::).
+
+
+\1f
+File: bash.info,  Node: Bash Conditional Expressions,  Next: Shell Arithmetic,  Prev: Interactive Shells,  Up: Bash Features
+
+Bash Conditional Expressions
+============================
+
+   Conditional expressions are used by the `[[' compound command and
+the `test' and `[' builtin commands.
+
+   Expressions may be unary or binary.  Unary expressions are often
+used to examine the status of a file.  There are string operators and
+numeric comparison operators as well.  If the FILE argument to one of
+the primaries is of the form `/dev/fd/N', then file descriptor N is
+checked.  If the FILE argument to one of the primaries is one of
+`/dev/stdin', `/dev/stdout', or `/dev/stderr', file descriptor 0, 1, or
+2, respectively, is checked.
+
+`-a FILE'
+     True if FILE exists.
+
+`-b FILE'
+     True if FILE exists and is a block special file.
+
+`-c FILE'
+     True if FILE exists and is a character special file.
+
+`-d FILE'
+     True if FILE exists and is a directory.
+
+`-e FILE'
+     True if FILE exists.
+
+`-f FILE'
+     True if FILE exists and is a regular file.
+
+`-g FILE'
+     True if FILE exists and its set-group-id bit is set.
+
+`-h FILE'
+     True if FILE exists and is a symbolic link.
+
+`-k FILE'
+     True if FILE exists and its "sticky" bit is set.
+
+`-p FILE'
+     True if FILE exists and is a named pipe (FIFO).
+
+`-r FILE'
+     True if FILE exists and is readable.
+
+`-s FILE'
+     True if FILE exists and has a size greater than zero.
+
+`-t FD'
+     True if file descriptor FD is open and refers to a terminal.
+
+`-u FILE'
+     True if FILE exists and its set-user-id bit is set.
+
+`-w FILE'
+     True if FILE exists and is writable.
+
+`-x FILE'
+     True if FILE exists and is executable.
+
+`-O FILE'
+     True if FILE exists and is owned by the effective user id.
+
+`-G FILE'
+     True if FILE exists and is owned by the effective group id.
+
+`-L FILE'
+     True if FILE exists and is a symbolic link.
+
+`-S FILE'
+     True if FILE exists and is a socket.
+
+`-N FILE'
+     True if FILE exists and has been modified since it was last read.
+
+`FILE1 -nt FILE2'
+     True if FILE1 is newer (according to modification date) than
+     FILE2, or if FILE1 exists and FILE2 does not.
+
+`FILE1 -ot FILE2'
+     True if FILE1 is older than FILE2, or if FILE2 exists and FILE1
+     does not.
+
+`FILE1 -ef FILE2'
+     True if FILE1 and FILE2 refer to the same device and inode numbers.
+
+`-o OPTNAME'
+     True if shell option OPTNAME is enabled.  The list of options
+     appears in the description of the `-o' option to the `set' builtin
+     (*note The Set Builtin::).
+
+`-z STRING'
+     True if the length of STRING is zero.
+
+`-n STRING'
+`STRING'
+     True if the length of STRING is non-zero.
+
+`STRING1 == STRING2'
+     True if the strings are equal.  `=' may be used in place of `=='
+     for strict POSIX compliance.
+
+`STRING1 != STRING2'
+     True if the strings are not equal.
+
+`STRING1 < STRING2'
+     True if STRING1 sorts before STRING2 lexicographically in the
+     current locale.
+
+`STRING1 > STRING2'
+     True if STRING1 sorts after STRING2 lexicographically in the
+     current locale.
+
+`ARG1 OP ARG2'
+     `OP' is one of `-eq', `-ne', `-lt', `-le', `-gt', or `-ge'.  These
+     arithmetic binary operators return true if ARG1 is equal to, not
+     equal to, less than, less than or equal to, greater than, or
+     greater than or equal to ARG2, respectively.  ARG1 and ARG2 may be
+     positive or negative integers.
+
+
+\1f
+File: bash.info,  Node: Shell Arithmetic,  Next: Aliases,  Prev: Bash Conditional Expressions,  Up: Bash Features
+
+Shell Arithmetic
+================
+
+   The shell allows arithmetic expressions to be evaluated, as one of
+the shell expansions or by the `let' and the `-i' option to the
+`declare' builtins.
+
+   Evaluation is done in fixed-width integers with no check for
+overflow, though division by 0 is trapped and flagged as an error.  The
+operators and their precedence, associativity, and values are the same
+as in the C language.  The following list of operators is grouped into
+levels of equal-precedence operators.  The levels are listed in order
+of decreasing precedence.
+
+`ID++ ID--'
+     variable post-increment and post-decrement
+
+`++ID --ID'
+     variable pre-increment and pre-decrement
+
+`- +'
+     unary minus and plus
+
+`! ~'
+     logical and bitwise negation
+
+`**'
+     exponentiation
+
+`* / %'
+     multiplication, division, remainder
+
+`+ -'
+     addition, subtraction
+
+`<< >>'
+     left and right bitwise shifts
+
+`<= >= < >'
+     comparison
+
+`== !='
+     equality and inequality
+
+`&'
+     bitwise AND
+
+`^'
+     bitwise exclusive OR
+
+`|'
+     bitwise OR
+
+`&&'
+     logical AND
+
+`||'
+     logical OR
+
+`expr ? expr : expr'
+     conditional operator
+
+`= *= /= %= += -= <<= >>= &= ^= |='
+     assignment
+
+`expr1 , expr2'
+     comma
+
+   Shell variables are allowed as operands; parameter expansion is
+performed before the expression is evaluated.  Within an expression,
+shell variables may also be referenced by name without using the
+parameter expansion syntax.  A shell variable that is null or unset
+evaluates to 0 when referenced by name without using the parameter
+expansion syntax.  The value of a variable is evaluated as an
+arithmetic expression when it is referenced, or when a variable which
+has been given the INTEGER attribute using `declare -i' is assigned a
+value.  A null value evaluates to 0.  A shell variable need not have
+its integer attribute turned on to be used in an expression.
+
+   Constants with a leading 0 are interpreted as octal numbers.  A
+leading `0x' or `0X' denotes hexadecimal.  Otherwise, numbers take the
+form [BASE`#']N, where BASE is a decimal number between 2 and 64
+representing the arithmetic base, and N is a number in that base.  If
+BASE`#' is omitted, then base 10 is used.  The digits greater than 9
+are represented by the lowercase letters, the uppercase letters, `@',
+and `_', in that order.  If BASE is less than or equal to 36, lowercase
+and uppercase letters may be used interchangably to represent numbers
+between 10 and 35.
+
+   Operators are evaluated in order of precedence.  Sub-expressions in
+parentheses are evaluated first and may override the precedence rules
+above.
+
+\1f
+File: bash.info,  Node: Aliases,  Next: Arrays,  Prev: Shell Arithmetic,  Up: Bash Features
+
+Aliases
+=======
+
+   ALIASES allow a string to be substituted for a word when it is used
+as the first word of a simple command.  The shell maintains a list of
+aliases that may be set and unset with the `alias' and `unalias'
+builtin commands.
+
+   The first word of each simple command, if unquoted, is checked to see
+if it has an alias.  If so, that word is replaced by the text of the
+alias.  The alias name and the replacement text may contain any valid
+shell input, including shell metacharacters, with the exception that
+the alias name may not contain `='.  The first word of the replacement
+text is tested for aliases, but a word that is identical to an alias
+being expanded is not expanded a second time.  This means that one may
+alias `ls' to `"ls -F"', for instance, and Bash does not try to
+recursively expand the replacement text. If the last character of the
+alias value is a space or tab character, then the next command word
+following the alias is also checked for alias expansion.
+
+   Aliases are created and listed with the `alias' command, and removed
+with the `unalias' command.
+
+   There is no mechanism for using arguments in the replacement text,
+as in `csh'.  If arguments are needed, a shell function should be used
+(*note Shell Functions::).
+
+   Aliases are not expanded when the shell is not interactive, unless
+the `expand_aliases' shell option is set using `shopt' (*note Bash
+Builtins::).
+
+   The rules concerning the definition and use of aliases are somewhat
+confusing.  Bash always reads at least one complete line of input
+before executing any of the commands on that line.  Aliases are
+expanded when a command is read, not when it is executed.  Therefore, an
+alias definition appearing on the same line as another command does not
+take effect until the next line of input is read.  The commands
+following the alias definition on that line are not affected by the new
+alias.  This behavior is also an issue when functions are executed.
+Aliases are expanded when a function definition is read, not when the
+function is executed, because a function definition is itself a
+compound command.  As a consequence, aliases defined in a function are
+not available until after that function is executed.  To be safe,
+always put alias definitions on a separate line, and do not use `alias'
+in compound commands.
+
+   For almost every purpose, shell functions are preferred over aliases.
+
+\1f
+File: bash.info,  Node: Arrays,  Next: The Directory Stack,  Prev: Aliases,  Up: Bash Features
+
+Arrays
+======
+
+   Bash provides one-dimensional array variables.  Any variable may be
+used as an array; the `declare' builtin will explicitly declare an
+array.  There is no maximum limit on the size of an array, nor any
+requirement that members be indexed or assigned contiguously.  Arrays
+are zero-based.
+
+   An array is created automatically if any variable is assigned to
+using the syntax
+     name[SUBSCRIPT]=VALUE
+
+The SUBSCRIPT is treated as an arithmetic expression that must evaluate
+to a number greater than or equal to zero.  To explicitly declare an
+array, use
+     declare -a NAME
+
+The syntax
+     declare -a NAME[SUBSCRIPT]
+
+is also accepted; the SUBSCRIPT is ignored.  Attributes may be
+specified for an array variable using the `declare' and `readonly'
+builtins.  Each attribute applies to all members of an array.
+
+   Arrays are assigned to using compound assignments of the form
+     name=(value1 ... valueN)
+
+where each VALUE is of the form `[[SUBSCRIPT]=]'STRING.  If the
+optional subscript is supplied, that index is assigned to; otherwise
+the index of the element assigned is the last index assigned to by the
+statement plus one.  Indexing starts at zero.  This syntax is also
+accepted by the `declare' builtin.  Individual array elements may be
+assigned to using the `name['SUBSCRIPT`]='VALUE syntax introduced above.
+
+   Any element of an array may be referenced using
+`${name['SUBSCRIPT`]}'.  The braces are required to avoid conflicts
+with the shell's filename expansion operators.  If the SUBSCRIPT is `@'
+or `*', the word expands to all members of the array NAME.  These
+subscripts differ only when the word appears within double quotes.  If
+the word is double-quoted, `${name[*]}' expands to a single word with
+the value of each array member separated by the first character of the
+`IFS' variable, and `${name[@]}' expands each element of NAME to a
+separate word.  When there are no array members, `${name[@]}' expands
+to nothing.  This is analogous to the expansion of the special
+parameters `@' and `*'.  `${#name['SUBSCRIPT`]}' expands to the length
+of `${name['SUBSCRIPT`]}'.  If SUBSCRIPT is `@' or `*', the expansion
+is the number of elements in the array.  Referencing an array variable
+without a subscript is equivalent to referencing element zero.
+
+   The `unset' builtin is used to destroy arrays.  `unset'
+NAME[SUBSCRIPT] destroys the array element at index SUBSCRIPT.  `unset'
+NAME, where NAME is an array, removes the entire array. A subscript of
+`*' or `@' also removes the entire array.
+
+   The `declare', `local', and `readonly' builtins each accept a `-a'
+option to specify an array.  The `read' builtin accepts a `-a' option
+to assign a list of words read from the standard input to an array, and
+can read values from the standard input into individual array elements.
+The `set' and `declare' builtins display array values in a way that
+allows them to be reused as input.
+
+\1f
+File: bash.info,  Node: The Directory Stack,  Next: Printing a Prompt,  Prev: Arrays,  Up: Bash Features
+
+The Directory Stack
+===================
+
+* Menu:
+
+* Directory Stack Builtins::           Bash builtin commands to manipulate
+                                       the directory stack.
+
+   The directory stack is a list of recently-visited directories.  The
+`pushd' builtin adds directories to the stack as it changes the current
+directory, and the `popd' builtin removes specified directories from
+the stack and changes the current directory to the directory removed.
+The `dirs' builtin displays the contents of the directory stack.
+
+   The contents of the directory stack are also visible as the value of
+the `DIRSTACK' shell variable.
+
+\1f
+File: bash.info,  Node: Directory Stack Builtins,  Up: The Directory Stack
+
+Directory Stack Builtins
+------------------------
+
+`dirs'
+          dirs [+N | -N] [-clpv]
+     Display the list of currently remembered directories.  Directories
+     are added to the list with the `pushd' command; the `popd' command
+     removes directories from the list.
+    `+N'
+          Displays the Nth directory (counting from the left of the
+          list printed by `dirs' when invoked without options), starting
+          with zero.
+
+    `-N'
+          Displays the Nth directory (counting from the right of the
+          list printed by `dirs' when invoked without options), starting
+          with zero.
+
+    `-c'
+          Clears the directory stack by deleting all of the elements.
+
+    `-l'
+          Produces a longer listing; the default listing format uses a
+          tilde to denote the home directory.
+
+    `-p'
+          Causes `dirs' to print the directory stack with one entry per
+          line.
+
+    `-v'
+          Causes `dirs' to print the directory stack with one entry per
+          line, prefixing each entry with its index in the stack.
+
+`popd'
+          popd [+N | -N] [-n]
+
+     Remove the top entry from the directory stack, and `cd' to the new
+     top directory.  When no arguments are given, `popd' removes the
+     top directory from the stack and performs a `cd' to the new top
+     directory.  The elements are numbered from 0 starting at the first
+     directory listed with `dirs'; i.e., `popd' is equivalent to `popd
+     +0'.
+    `+N'
+          Removes the Nth directory (counting from the left of the list
+          printed by `dirs'), starting with zero.
+
+    `-N'
+          Removes the Nth directory (counting from the right of the
+          list printed by `dirs'), starting with zero.
+
+    `-n'
+          Suppresses the normal change of directory when removing
+          directories from the stack, so that only the stack is
+          manipulated.
+
+`pushd'
+          pushd [DIR | +N | -N] [-n]
+
+     Save the current directory on the top of the directory stack and
+     then `cd' to DIR.  With no arguments, `pushd' exchanges the top
+     two directories.
+
+    `+N'
+          Brings the Nth directory (counting from the left of the list
+          printed by `dirs', starting with zero) to the top of the list
+          by rotating the stack.
+
+    `-N'
+          Brings the Nth directory (counting from the right of the list
+          printed by `dirs', starting with zero) to the top of the list
+          by rotating the stack.
+
+    `-n'
+          Suppresses the normal change of directory when adding
+          directories to the stack, so that only the stack is
+          manipulated.
+
+    `DIR'
+          Makes the current working directory be the top of the stack,
+          and then executes the equivalent of ``cd' DIR'.  `cd's to DIR.
+
+
+\1f
+File: bash.info,  Node: Printing a Prompt,  Next: The Restricted Shell,  Prev: The Directory Stack,  Up: Bash Features
+
+Controlling the Prompt
+======================
+
+   The value of the variable `PROMPT_COMMAND' is examined just before
+Bash prints each primary prompt.  If `PROMPT_COMMAND' is set and has a
+non-null value, then the value is executed just as if it had been typed
+on the command line.
+
+   In addition, the following table describes the special characters
+which can appear in the prompt variables:
+
+`\a'
+     A bell character.
+
+`\d'
+     The date, in "Weekday Month Date" format (e.g., "Tue May 26").
+
+`\D{FORMAT}'
+     The FORMAT is passed to `strftime'(3) and the result is inserted
+     into the prompt string; an empty FORMAT results in a
+     locale-specific time representation.  The braces are required.
+
+`\e'
+     An escape character.
+
+`\h'
+     The hostname, up to the first `.'.
+
+`\H'
+     The hostname.
+
+`\j'
+     The number of jobs currently managed by the shell.
+
+`\l'
+     The basename of the shell's terminal device name.
+
+`\n'
+     A newline.
+
+`\r'
+     A carriage return.
+
+`\s'
+     The name of the shell, the basename of `$0' (the portion following
+     the final slash).
+
+`\t'
+     The time, in 24-hour HH:MM:SS format.
+
+`\T'
+     The time, in 12-hour HH:MM:SS format.
+
+`\@'
+     The time, in 12-hour am/pm format.
+
+`\A'
+     The time, in 24-hour HH:MM format.
+
+`\u'
+     The username of the current user.
+
+`\v'
+     The version of Bash (e.g., 2.00)
+
+`\V'
+     The release of Bash, version + patchlevel (e.g., 2.00.0)
+
+`\w'
+     The current working directory.
+
+`\W'
+     The basename of `$PWD'.
+
+`\!'
+     The history number of this command.
+
+`\#'
+     The command number of this command.
+
+`\$'
+     If the effective uid is 0, `#', otherwise `$'.
+
+`\NNN'
+     The character whose ASCII code is the octal value NNN.
+
+`\\'
+     A backslash.
+
+`\['
+     Begin a sequence of non-printing characters.  This could be used to
+     embed a terminal control sequence into the prompt.
+
+`\]'
+     End a sequence of non-printing characters.
+
+   The command number and the history number are usually different: the
+history number of a command is its position in the history list, which
+may include commands restored from the history file (*note Bash History
+Facilities::), while the command number is the position in the sequence
+of commands executed during the current shell session.
+
+   After the string is decoded, it is expanded via parameter expansion,
+command substitution, arithmetic expansion, and quote removal, subject
+to the value of the `promptvars' shell option (*note Bash Builtins::).
+
+\1f
+File: bash.info,  Node: The Restricted Shell,  Next: Bash POSIX Mode,  Prev: Printing a Prompt,  Up: Bash Features
+
+The Restricted Shell
+====================
+
+   If Bash is started with the name `rbash', or the `--restricted' or
+`-r' option is supplied at invocation, the shell becomes restricted.  A
+restricted shell is used to set up an environment more controlled than
+the standard shell.  A restricted shell behaves identically to `bash'
+with the exception that the following are disallowed or not performed:
+
+   * Changing directories with the `cd' builtin.
+
+   * Setting or unsetting the values of the `SHELL', `PATH', `ENV', or
+     `BASH_ENV' variables.
+
+   * Specifying command names containing slashes.
+
+   * Specifying a filename containing a slash as an argument to the `.'
+     builtin command.
+
+   * Specifying a filename containing a slash as an argument to the `-p'
+     option to the `hash' builtin command.
+
+   * Importing function definitions from the shell environment at
+     startup.
+
+   * Parsing the value of `SHELLOPTS' from the shell environment at
+     startup.
+
+   * Redirecting output using the `>', `>|', `<>', `>&', `&>', and `>>'
+     redirection operators.
+
+   * Using the `exec' builtin to replace the shell with another command.
+
+   * Adding or deleting builtin commands with the `-f' and `-d' options
+     to the `enable' builtin.
+
+   * Using the `enable' builtin command to enable disabled shell
+     builtins.
+
+   * Specifying the `-p' option to the `command' builtin.
+
+   * Turning off restricted mode with `set +r' or `set +o restricted'.
+
+   These restrictions are enforced after any startup files are read.
+
+   When a command that is found to be a shell script is executed (*note
+Shell Scripts::), `rbash' turns off any restrictions in the shell
+spawned to execute the script.
+
+\1f
+File: bash.info,  Node: Bash POSIX Mode,  Prev: The Restricted Shell,  Up: Bash Features
+
+Bash POSIX Mode
+===============
+
+   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 1003.2 standard by changing the behavior to match
+that specified by POSIX in areas where the Bash default differs.
+
+   When invoked as `sh', Bash enters POSIX mode after reading the
+startup files.
+
+   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 message printed by the job control code and builtins when a job
+     exits with a non-zero status is `Done(status)'.
+
+  3. The message printed by the job control code and builtins when a job
+     is stopped is `Stopped(SIGNAME)', where SIGNAME is, for example,
+     `SIGTSTP'.
+
+  4. Reserved words may not be aliased.
+
+  5. The POSIX 1003.2 `PS1' and `PS2' expansions of `!' to the history
+     number and `!!' to `!' are enabled, and parameter expansion is
+     performed on the values of `PS1' and `PS2' regardless of the
+     setting of the `promptvars' option.
+
+  6. Interactive comments are enabled by default.  (Bash has them on by
+     default anyway.)
+
+  7. The POSIX 1003.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' (this is the default
+     value of `$HISTFILE').
+
+ 10. The output of `kill -l' prints all the signal names on a single
+     line, separated by spaces, without the `SIG' prefix.
+
+ 11. Non-interactive shells exit if FILENAME in `.' FILENAME is not
+     found.
+
+ 12. Non-interactive shells exit if a syntax error in an arithmetic
+     expansion results in an invalid expression.
+
+ 13. Redirection operators do not perform filename expansion on the word
+     in the redirection unless the shell is interactive.
+
+ 14. Redirection operators do not perform word splitting on the word in
+     the redirection.
+
+ 15. Function names must be valid shell `name's.  That is, they may not
+     contain characters other than letters, digits, and underscores, and
+     may not start with a digit.  Declaring a function with an invalid
+     name causes a fatal syntax error in non-interactive shells.
+
+ 16. POSIX 1003.2 `special' builtins are found before shell functions
+     during command lookup.
+
+ 17. If a POSIX 1003.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.
+
+ 18. If the `cd' builtin finds a directory to change to using
+     `$CDPATH', the value it assigns to the `PWD' variable does not
+     contain any symbolic links, as if `cd -P' had been executed.
+
+ 19. If `CDPATH' is set, the `cd' builtin will not implicitly append
+     the current directory to it.  This means that `cd' will fail if no
+     valid directory name can be constructed from any of the entries in
+     `$CDPATH', even if the a directory with the same name as the name
+     given as an argument to `cd' exists in the current directory.
+
+ 20. A non-interactive shell exits with an error status if a variable
+     assignment error occurs when no command name follows the assignment
+     statements.  A variable assignment error occurs, for example, when
+     trying to assign a value to a readonly variable.
+
+ 21. 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 readonly variable.
+
+ 22. Process substitution is not available.
+
+ 23. Assignment statements preceding POSIX 1003.2 special builtins
+     persist in the shell environment after the builtin completes.
+
+ 24. Assignment statements preceding shell function calls persist in the
+     shell environment after the function returns, as if a POSIX
+     special builtin command had been executed.
+
+ 25. The `export' and `readonly' builtin commands display their output
+     in the format required by POSIX 1003.2.
+
+ 26. The `trap' builtin displays signal names without the leading `SIG'.
+
+ 27. The `.' and `source' builtins do not search the current directory
+     for the filename argument if it is not found by searching `PATH'.
+
+ 28. Subshells spawned to execute command substitutions inherit the
+     value of the `-e' option from the parent shell.  When not in POSIX
+     mode, Bash clears the `-e' option in such subshells.
+
+ 29. Alias expansion is always enabled, even in non-interactive shells.
+
+ 30. When the `set' builtin is invoked without options, it does not
+     display shell function names and definitions.
+
+ 31. When the `set' builtin is invoked without options, it displays
+     variable values without quotes, unless they contain shell
+     metacharacters, even if the result contains nonprinting characters.
+
+ 32. When the `cd' builtin is invoked in LOGICAL mode, and the pathname
+     constructed from `$PWD' and the directory name supplied as an
+     argument does not refer to an existing directory, `cd' will fail
+     instead of falling back to PHYSICAL mode.
+
+   There is other POSIX 1003.2 behavior that Bash does not implement.
+Specifically:
+
+  1. Assignment statements affect the execution environment of all
+     builtins, not just special ones.
+
+  2. When a subshell is created to execute a shell script with execute
+     permission, but without a leading `#!', Bash sets `$0' to the full
+     pathname of the script as found by searching `$PATH', rather than
+     the command as typed by the user.
+
+  3. When using `.' to source a shell script found in `$PATH', bash
+     checks execute permission bits rather than read permission bits,
+     just as if it were searching for a command.
+
+
+\1f
+File: bash.info,  Node: Job Control,  Next: Using History Interactively,  Prev: Bash Features,  Up: Top
+
+Job Control
+***********
+
+   This chapter discusses what job control is, how it works, and how
+Bash allows you to access its facilities.
+
+* Menu:
+
+* Job Control Basics::         How job control works.
+* Job Control Builtins::       Bash builtin commands used to interact
+                               with job control.
+* Job Control Variables::      Variables Bash uses to customize job
+                               control.
+
+\1f
+File: bash.info,  Node: Job Control Basics,  Next: Job Control Builtins,  Up: Job Control
+
+Job Control Basics
+==================
+
+   Job control refers to the ability to selectively stop (suspend) the
+execution of processes and continue (resume) their execution at a later
+point.  A user typically employs this facility via an interactive
+interface supplied jointly by the system's terminal driver and Bash.
+
+   The shell associates a JOB with each pipeline.  It keeps a table of
+currently executing jobs, which may be listed with the `jobs' command.
+When Bash starts a job asynchronously, it prints a line that looks like:
+     [1] 25647
+
+indicating that this job is job number 1 and that the process ID of the
+last process in the pipeline associated with this job is 25647.  All of
+the processes in a single pipeline are members of the same job.  Bash
+uses the JOB abstraction as the basis for job control.
+
+   To facilitate the implementation of the user interface to job
+control, the operating system maintains the notion of a current terminal
+process group ID.  Members of this process group (processes whose
+process group ID is equal to the current terminal process group ID)
+receive keyboard-generated signals such as `SIGINT'.  These processes
+are said to be in the foreground.  Background processes are those whose
+process group ID differs from the terminal's; such processes are immune
+to keyboard-generated signals.  Only foreground processes are allowed
+to read from or write to the terminal.  Background processes which
+attempt to read from (write to) the terminal are sent a `SIGTTIN'
+(`SIGTTOU') signal by the terminal driver, which, unless caught,
+suspends the process.
+
+   If the operating system on which Bash is running supports job
+control, Bash contains facilities to use it.  Typing the SUSPEND
+character (typically `^Z', Control-Z) while a process is running causes
+that process to be stopped and returns control to Bash.  Typing the
+DELAYED SUSPEND character (typically `^Y', Control-Y) causes the
+process to be stopped when it attempts to read input from the terminal,
+and control to be returned to Bash.  The user then manipulates the
+state of this job, using the `bg' command to continue it in the
+background, the `fg' command to continue it in the foreground, or the
+`kill' command to kill it.  A `^Z' takes effect immediately, and has
+the additional side effect of causing pending output and typeahead to
+be discarded.
+
+   There are a number of ways to refer to a job in the shell.  The
+character `%' introduces a job name.
+
+   Job number `n' may be referred to as `%n'.  The symbols `%%' and
+`%+' refer to the shell's notion of the current job, which is the last
+job stopped while it was in the foreground or started in the
+background.  The previous job may be referenced using `%-'.  In output
+pertaining to jobs (e.g., the output of the `jobs' command), the
+current job is always flagged with a `+', and the previous job with a
+`-'.
+
+   A job may also be referred to using a prefix of the name used to
+start it, or using a substring that appears in its command line.  For
+example, `%ce' refers to a stopped `ce' job. Using `%?ce', on the other
+hand, refers to any job containing the string `ce' in its command line.
+If the prefix or substring matches more than one job, Bash reports an
+error.
+
+   Simply naming a job can be used to bring it into the foreground:
+`%1' is a synonym for `fg %1', bringing job 1 from the background into
+the foreground.  Similarly, `%1 &' resumes job 1 in the background,
+equivalent to `bg %1'
+
+   The shell learns immediately whenever a job changes state.
+Normally, Bash waits until it is about to print a prompt before
+reporting changes in a job's status so as to not interrupt any other
+output.  If the `-b' option to the `set' builtin is enabled, Bash
+reports such changes immediately (*note The Set Builtin::).  Any trap
+on `SIGCHLD' is executed for each child process that exits.
+
+   If an attempt to exit Bash is while jobs are stopped, the shell
+prints a message warning that there are stopped jobs.  The `jobs'
+command may then be used to inspect their status.  If a second attempt
+to exit is made without an intervening command, Bash does not print
+another warning, and the stopped jobs are terminated.
+
+\1f
+File: bash.info,  Node: Job Control Builtins,  Next: Job Control Variables,  Prev: Job Control Basics,  Up: Job Control
+
+Job Control Builtins
+====================
+
+`bg'
+          bg [JOBSPEC]
+     Resume the suspended job JOBSPEC in the background, as if it had
+     been started with `&'.  If JOBSPEC is not supplied, the current
+     job is used.  The return status is zero unless it is run when job
+     control is not enabled, or, when run with job control enabled, if
+     JOBSPEC was not found or JOBSPEC specifies a job that was started
+     without job control.
+
+`fg'
+          fg [JOBSPEC]
+     Resume the job JOBSPEC in the foreground and make it the current
+     job.  If JOBSPEC is not supplied, the current job is used.  The
+     return status is that of the command placed into the foreground,
+     or non-zero if run when job control is disabled or, when run with
+     job control enabled, JOBSPEC does not specify a valid job or
+     JOBSPEC specifies a job that was started without job control.
+
+`jobs'
+          jobs [-lnprs] [JOBSPEC]
+          jobs -x COMMAND [ARGUMENTS]
+
+     The first form lists the active jobs.  The options have the
+     following meanings:
+
+    `-l'
+          List process IDs in addition to the normal information.
+
+    `-n'
+          Display information only about jobs that have changed status
+          since the user was last notified of their status.
+
+    `-p'
+          List only the process ID of the job's process group leader.
+
+    `-r'
+          Restrict output to running jobs.
+
+    `-s'
+          Restrict output to stopped jobs.
+
+     If JOBSPEC is given, output is restricted to information about
+     that job.  If JOBSPEC is not supplied, the status of all jobs is
+     listed.
+
+     If the `-x' option is supplied, `jobs' replaces any JOBSPEC found
+     in COMMAND or ARGUMENTS with the corresponding process group ID,
+     and executes COMMAND, passing it ARGUMENTs, returning its exit
+     status.
+
+`kill'
+          kill [-s SIGSPEC] [-n SIGNUM] [-SIGSPEC] JOBSPEC or PID
+          kill -l [EXIT_STATUS]
+     Send a signal specified by SIGSPEC or SIGNUM to the process named
+     by job specification JOBSPEC or process ID PID.  SIGSPEC is either
+     a signal name such as `SIGINT' (with or without the `SIG' prefix)
+     or a signal number; SIGNUM is a signal number.  If SIGSPEC and
+     SIGNUM are not present, `SIGTERM' is used.  The `-l' option lists
+     the signal names.  If any arguments are supplied when `-l' is
+     given, the names of the signals corresponding to the arguments are
+     listed, and the return status is zero.  EXIT_STATUS is a number
+     specifying a signal number or the exit status of a process
+     terminated by a signal.  The return status is zero if at least one
+     signal was successfully sent, or non-zero if an error occurs or an
+     invalid option is encountered.
+
+`wait'
+          wait [JOBSPEC or PID]
+     Wait until the child process specified by process ID PID or job
+     specification JOBSPEC exits and return the exit status of the last
+     command waited for.  If a job spec is given, all processes in the
+     job are waited for.  If no arguments are given, all currently
+     active child processes are waited for, and the return status is
+     zero.  If neither JOBSPEC nor PID specifies an active child process
+     of the shell, the return status is 127.
+
+`disown'
+          disown [-ar] [-h] [JOBSPEC ...]
+     Without options, each JOBSPEC is removed from the table of active
+     jobs.  If the `-h' option is given, the job is not removed from
+     the table, but is marked so that `SIGHUP' is not sent to the job
+     if the shell receives a `SIGHUP'.  If JOBSPEC is not present, and
+     neither the `-a' nor `-r' option is supplied, the current job is
+     used.  If no JOBSPEC is supplied, the `-a' option means to remove
+     or mark all jobs; the `-r' option without a JOBSPEC argument
+     restricts operation to running jobs.
+
+`suspend'
+          suspend [-f]
+     Suspend the execution of this shell until it receives a `SIGCONT'
+     signal.  The `-f' option means to suspend even if the shell is a
+     login shell.
+
+
+   When job control is not active, the `kill' and `wait' builtins do
+not accept JOBSPEC arguments.  They must be supplied process IDs.
+
+\1f
+File: bash.info,  Node: Job Control Variables,  Prev: Job Control Builtins,  Up: Job Control
+
+Job Control Variables
+=====================
+
+`auto_resume'
+     This variable controls how the shell interacts with the user and
+     job control.  If this variable exists then single word simple
+     commands without redirections are treated as candidates for
+     resumption of an existing job.  There is no ambiguity allowed; if
+     there is more than one job beginning with the string typed, then
+     the most recently accessed job will be selected.  The name of a
+     stopped job, in this context, is the command line used to start
+     it.  If this variable is set to the value `exact', the string
+     supplied must match the name of a stopped job exactly; if set to
+     `substring', the string supplied needs to match a substring of the
+     name of a stopped job.  The `substring' value provides
+     functionality analogous to the `%?' job ID (*note Job Control
+     Basics::).  If set to any other value, the supplied string must be
+     a prefix of a stopped job's name; this provides functionality
+     analogous to the `%' job ID.
+
+
+\1f
+File: bash.info,  Node: Command Line Editing,  Next: Installing Bash,  Prev: Using History Interactively,  Up: Top
+
+Command Line Editing
+********************
+
+   This chapter describes the basic features of the GNU command line
+editing interface.  Command line editing is provided by the Readline
+library, which is used by several different programs, including Bash.
+
+* Menu:
+
+* Introduction and Notation::  Notation used in this text.
+* Readline Interaction::       The minimum set of commands for editing a line.
+* Readline Init File::         Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+                               available for binding
+* Readline vi Mode::           A short description of how to make Readline
+                               behave like the vi editor.
+
+* Programmable Completion::    How to specify the possible completions for
+                               a specific command.
+* Programmable Completion Builtins::   Builtin commands to specify how to
+                               complete arguments for a particular command.
+
+\1f
+File: bash.info,  Node: Introduction and Notation,  Next: Readline Interaction,  Up: Command Line Editing
+
+Introduction to Line Editing
+============================
+
+   The following paragraphs describe the notation used to represent
+keystrokes.
+
+   The text `C-k' is read as `Control-K' and describes the character
+produced when the <k> key is pressed while the Control key is depressed.
+
+   The text `M-k' is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <k>
+key is pressed.  The Meta key is labeled <ALT> on many keyboards.  On
+keyboards with two keys labeled <ALT> (usually to either side of the
+space bar), the <ALT> on the left side is generally set to work as a
+Meta key.  The <ALT> key on the right may also be configured to work as
+a Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+   If you do not have a Meta or <ALT> key, or another key working as a
+Meta key, the identical keystroke can be generated by typing <ESC>
+_first_, and then typing <k>.  Either process is known as "metafying"
+the <k> key.
+
+   The text `M-C-k' is read as `Meta-Control-k' and describes the
+character produced by "metafying" `C-k'.
+
+   In addition, several keys have their own names.  Specifically,
+<DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves
+when seen in this text, or in an init file (*note Readline Init File::).
+If your keyboard lacks a <LFD> key, typing <C-j> will produce the
+desired character.  The <RET> key may be labeled <Return> or <Enter> on
+some keyboards.
+
+\1f
+File: bash.info,  Node: Readline Interaction,  Next: Readline Init File,  Prev: Introduction and Notation,  Up: Command Line Editing
+
+Readline Interaction
+====================
+
+   Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <RET>.  You do not have to be at the end of
+the line to press <RET>; the entire line is accepted regardless of the
+location of the cursor within the line.
+
+* Menu:
+
+* Readline Bare Essentials::   The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands::  How to delete text, and how to get it back!
+* Readline Arguments::         Giving numeric arguments to commands.
+* Searching::                  Searching through previous lines.
+
+\1f
+File: bash.info,  Node: Readline Bare Essentials,  Next: Readline Movement Commands,  Up: Readline Interaction
+
+Readline Bare Essentials
+------------------------
+
+   In order to enter characters into the line, simply type them.  The
+typed character appears where the cursor was, and then the cursor moves
+one space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+
+   Sometimes you may mistype a character, and not notice the error
+until you have typed several other characters.  In that case, you can
+type `C-b' to move the cursor to the left, and then correct your
+mistake.  Afterwards, you can move the cursor to the right with `C-f'.
+
+   When you add text in the middle of a line, you will notice that
+characters to the right of the cursor are `pushed over' to make room
+for the text that you have inserted.  Likewise, when you delete text
+behind the cursor, characters to the right of the cursor are `pulled
+back' to fill in the blank space created by the removal of the text.  A
+list of the bare essentials for editing the text of an input line
+follows.
+
+`C-b'
+     Move back one character.
+
+`C-f'
+     Move forward one character.
+
+<DEL> or <Backspace>
+     Delete the character to the left of the cursor.
+
+`C-d'
+     Delete the character underneath the cursor.
+
+Printing characters
+     Insert the character into the line at the cursor.
+
+`C-_' or `C-x C-u'
+     Undo the last editing command.  You can undo all the way back to an
+     empty line.
+
+(Depending on your configuration, the <Backspace> key be set to delete
+the character to the left of the cursor and the <DEL> key set to delete
+the character underneath the cursor, like `C-d', rather than the
+character to the left of the cursor.)
+
+\1f
+File: bash.info,  Node: Readline Movement Commands,  Next: Readline Killing Commands,  Prev: Readline Bare Essentials,  Up: Readline Interaction
+
+Readline Movement Commands
+--------------------------
+
+   The above table describes the most basic keystrokes that you need in
+order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to `C-b', `C-f', `C-d', and
+<DEL>.  Here are some commands for moving more rapidly about the line.
+
+`C-a'
+     Move to the start of the line.
+
+`C-e'
+     Move to the end of the line.
+
+`M-f'
+     Move forward a word, where a word is composed of letters and
+     digits.
+
+`M-b'
+     Move backward a word.
+
+`C-l'
+     Clear the screen, reprinting the current line at the top.
+
+   Notice how `C-f' moves forward a character, while `M-f' moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+
+\1f
+File: bash.info,  Node: Readline Killing Commands,  Next: Readline Arguments,  Prev: Readline Movement Commands,  Up: Readline Interaction
+
+Readline Killing Commands
+-------------------------
+
+   "Killing" text means to delete the text from the line, but to save
+it away for later use, usually by "yanking" (re-inserting) it back into
+the line.  (`Cut' and `paste' are more recent jargon for `kill' and
+`yank'.)
+
+   If the description for a command says that it `kills' text, then you
+can be sure that you can get the text back in a different (or the same)
+place later.
+
+   When you use a kill command, the text is saved in a "kill-ring".
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill ring is not line
+specific; the text that you killed on a previously typed line is
+available to be yanked back later, when you are typing another line.
+
+   Here is the list of commands for killing text.
+
+`C-k'
+     Kill the text from the current cursor position to the end of the
+     line.
+
+`M-d'
+     Kill from the cursor to the end of the current word, or, if between
+     words, to the end of the next word.  Word boundaries are the same
+     as those used by `M-f'.
+
+`M-<DEL>'
+     Kill from the cursor the start of the current word, or, if between
+     words, to the start of the previous word.  Word boundaries are the
+     same as those used by `M-b'.
+
+`C-w'
+     Kill from the cursor to the previous whitespace.  This is
+     different than `M-<DEL>' because the word boundaries differ.
+
+
+   Here is how to "yank" the text back into the line.  Yanking means to
+copy the most-recently-killed text from the kill buffer.
+
+`C-y'
+     Yank the most recently killed text back into the buffer at the
+     cursor.
+
+`M-y'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `C-y' or `M-y'.
+
+\1f
+File: bash.info,  Node: Readline Arguments,  Next: Searching,  Prev: Readline Killing Commands,  Up: Readline Interaction
+
+Readline Arguments
+------------------
+
+   You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the sign of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type `M-- C-k'.
+
+   The general way to pass numeric arguments to a command is to type
+meta digits before the command.  If the first `digit' typed is a minus
+sign (`-'), then the sign of the argument will be negative.  Once you
+have typed one meta digit to get the argument started, you can type the
+remainder of the digits, and then the command.  For example, to give
+the `C-d' command an argument of 10, you could type `M-1 0 C-d', which
+will delete the next ten characters on the input line.
+
+\1f
+File: bash.info,  Node: Searching,  Prev: Readline Arguments,  Up: Readline Interaction
+
+Searching for Commands in the History
+-------------------------------------
+
+   Readline provides commands for searching through the command history
+(*note Bash History Facilities::) for lines containing a specified
+string.  There are two search modes:  "incremental" and
+"non-incremental".
+
+   Incremental searches begin before the user has finished typing the
+search string.  As each character of the search string is typed,
+Readline displays the next entry from the history matching the string
+typed so far.  An incremental search requires only as many characters
+as needed to find the desired history entry.  To search backward in the
+history for a particular string, type `C-r'.  Typing `C-s' searches
+forward through the history.  The characters present in the value of
+the `isearch-terminators' variable are used to terminate an incremental
+search.  If that variable has not been assigned a value, the <ESC> and
+`C-J' characters will terminate an incremental search.  `C-g' will
+abort an incremental search and restore the original line.  When the
+search is terminated, the history entry containing the search string
+becomes the current line.
+
+   To find other matching entries in the history list, type `C-r' or
+`C-s' as appropriate.  This will search backward or forward in the
+history for the next entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate the
+search and execute that command.  For instance, a <RET> will terminate
+the search and accept the line, thereby executing the command from the
+history list.  A movement command will terminate the search, make the
+last line found the current line, and begin editing.
+
+   Readline remembers the last incremental search string.  If two
+`C-r's are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+
+   Non-incremental searches read the entire search string before
+starting to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+
+\1f
+File: bash.info,  Node: Readline Init File,  Next: Bindable Readline Commands,  Prev: Readline Interaction,  Up: Command Line Editing
+
+Readline Init File
+==================
+
+   Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.  Any user can customize programs that use Readline by
+putting commands in an "inputrc" file, conventionally in his home
+directory.  The name of this file is taken from the value of the shell
+variable `INPUTRC'.  If that variable is unset, the default is
+`~/.inputrc'.
+
+   When a program which uses the Readline library starts up, the init
+file is read, and the key bindings are set.
+
+   In addition, the `C-x C-r' command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+* Menu:
+
+* Readline Init File Syntax::  Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs::        Conditional key bindings in the inputrc file.
+
+* Sample Init File::           An example inputrc file.
+
+\1f
+File: bash.info,  Node: Readline Init File Syntax,  Next: Conditional Init Constructs,  Up: Readline Init File
+
+Readline Init File Syntax
+-------------------------
+
+   There are only a few basic constructs allowed in the Readline init
+file.  Blank lines are ignored.  Lines beginning with a `#' are
+comments.  Lines beginning with a `$' indicate conditional constructs
+(*note Conditional Init Constructs::).  Other lines denote variable
+settings and key bindings.
+
+Variable Settings
+     You can modify the run-time behavior of Readline by altering the
+     values of variables in Readline using the `set' command within the
+     init file.  The syntax is simple:
+
+          set VARIABLE VALUE
+
+     Here, for example, is how to change from the default Emacs-like
+     key binding to use `vi' line editing commands:
+
+          set editing-mode vi
+
+     Variable names and values, where appropriate, are recognized
+     without regard to case.
+
+     The `bind -V' command lists the current Readline variable names
+     and values.  *Note Bash Builtins::.
+
+     A great deal of run-time behavior is changeable with the following
+     variables.
+
+    `bell-style'
+          Controls what happens when Readline wants to ring the
+          terminal bell.  If set to `none', Readline never rings the
+          bell.  If set to `visible', Readline uses a visible bell if
+          one is available.  If set to `audible' (the default),
+          Readline attempts to ring the terminal's bell.
+
+    `comment-begin'
+          The string to insert at the beginning of the line when the
+          `insert-comment' command is executed.  The default value is
+          `"#"'.
+
+    `completion-ignore-case'
+          If set to `on', Readline performs filename matching and
+          completion in a case-insensitive fashion.  The default value
+          is `off'.
+
+    `completion-query-items'
+          The number of possible completions that determines when the
+          user is asked whether the list of possibilities should be
+          displayed.  If the number of possible completions is greater
+          than this value, Readline will ask the user whether or not he
+          wishes to view them; otherwise, they are simply listed.  This
+          variable must be set to an integer value greater than or
+          equal to 0.  The default limit is `100'.
+
+    `convert-meta'
+          If set to `on', Readline will convert characters with the
+          eighth bit set to an ASCII key sequence by stripping the
+          eighth bit and prefixing an <ESC> character, converting them
+          to a meta-prefixed key sequence.  The default value is `on'.
+
+    `disable-completion'
+          If set to `On', Readline will inhibit word completion.
+          Completion  characters will be inserted into the line as if
+          they had been mapped to `self-insert'.  The default is `off'.
+
+    `editing-mode'
+          The `editing-mode' variable controls which default set of key
+          bindings is used.  By default, Readline starts up in Emacs
+          editing mode, where the keystrokes are most similar to Emacs.
+          This variable can be set to either `emacs' or `vi'.
+
+    `enable-keypad'
+          When set to `on', Readline will try to enable the application
+          keypad when it is called.  Some systems need this to enable
+          the arrow keys.  The default is `off'.
+
+    `expand-tilde'
+          If set to `on', tilde expansion is performed when Readline
+          attempts word completion.  The default is `off'.
+
+          If set to `on', the history code attempts to place point at
+          the same location on each history line retrieved with
+          `previous-history' or `next-history'.
+
+    `horizontal-scroll-mode'
+          This variable can be set to either `on' or `off'.  Setting it
+          to `on' means that the text of the lines being edited will
+          scroll horizontally on a single screen line when they are
+          longer than the width of the screen, instead of wrapping onto
+          a new screen line.  By default, this variable is set to `off'.
+
+    `input-meta'
+          If set to `on', Readline will enable eight-bit input (it will
+          not clear the eighth bit in the characters it reads),
+          regardless of what the terminal claims it can support.  The
+          default value is `off'.  The name `meta-flag' is a synonym
+          for this variable.
+
+    `isearch-terminators'
+          The string of characters that should terminate an incremental
+          search without subsequently executing the character as a
+          command (*note Searching::).  If this variable has not been
+          given a value, the characters <ESC> and `C-J' will terminate
+          an incremental search.
+
+    `keymap'
+          Sets Readline's idea of the current keymap for key binding
+          commands.  Acceptable `keymap' names are `emacs',
+          `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move',
+          `vi-command', and `vi-insert'.  `vi' is equivalent to
+          `vi-command'; `emacs' is equivalent to `emacs-standard'.  The
+          default value is `emacs'.  The value of the `editing-mode'
+          variable also affects the default keymap.
+
+    `mark-directories'
+          If set to `on', completed directory names have a slash
+          appended.  The default is `on'.
+
+    `mark-modified-lines'
+          This variable, when set to `on', causes Readline to display an
+          asterisk (`*') at the start of history lines which have been
+          modified.  This variable is `off' by default.
+
+    `mark-symlinked-directories'
+          If set to `on', completed names which are symbolic links to
+          directories have a slash appended (subject to the value of
+          `mark-directories').  The default is `off'.
+
+    `match-hidden-files'
+          This variable, when set to `on', causes Readline to match
+          files whose names begin with a `.' (hidden files) when
+          performing filename completion, unless the leading `.' is
+          supplied by the user in the filename to be completed.  This
+          variable is `on' by default.
+
+    `output-meta'
+          If set to `on', Readline will display characters with the
+          eighth bit set directly rather than as a meta-prefixed escape
+          sequence.  The default is `off'.
+
+    `page-completions'
+          If set to `on', Readline uses an internal `more'-like pager
+          to display a screenful of possible completions at a time.
+          This variable is `on' by default.
+
+    `print-completions-horizontally'
+          If set to `on', Readline will display completions with matches
+          sorted horizontally in alphabetical order, rather than down
+          the screen.  The default is `off'.
+
+    `show-all-if-ambiguous'
+          This alters the default behavior of the completion functions.
+          If set to `on', words which have more than one possible
+          completion cause the matches to be listed immediately instead
+          of ringing the bell.  The default value is `off'.
+
+    `show-all-if-unmodified'
+          This alters the default behavior of the completion functions
+          in a fashion similar to SHOW-ALL-IF-AMBIGUOUS.  set to `on',
+          words which have more than one possible completion without any
+          possible partial completion (the possible completions don't
+          share a common prefix) cause the matches to be listed
+          immediately instead of ringing the bell.  The default value
+          is `off'.
+
+    `visible-stats'
+          If set to `on', a character denoting a file's type is
+          appended to the filename when listing possible completions.
+          The default is `off'.
+
+
+Key Bindings
+     The syntax for controlling key bindings in the init file is
+     simple.  First you need to find the name of the command that you
+     want to change.  The following sections contain tables of the
+     command name, the default keybinding, if any, and a short
+     description of what the command does.
+
+     Once you know the name of the command, simply place on a line in
+     the init file the name of the key you wish to bind the command to,
+     a colon, and then the name of the command.  The name of the key
+     can be expressed in different ways, depending on what you find most
+     comfortable.
+
+     In addition to command names, readline allows keys to be bound to
+     a string that is inserted when the key is pressed (a MACRO).
+
+     The `bind -p' command displays Readline function names and
+     bindings in a format that can put directly into an initialization
+     file.  *Note Bash Builtins::.
+
+    KEYNAME: FUNCTION-NAME or MACRO
+          KEYNAME is the name of a key spelled out in English.  For
+          example:
+               Control-u: universal-argument
+               Meta-Rubout: backward-kill-word
+               Control-o: "> output"
+
+          In the above example, `C-u' is bound to the function
+          `universal-argument', `M-DEL' is bound to the function
+          `backward-kill-word', and `C-o' is bound to run the macro
+          expressed on the right hand side (that is, to insert the text
+          `> output' into the line).
+
+          A number of symbolic character names are recognized while
+          processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
+          NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.
+
+    "KEYSEQ": FUNCTION-NAME or MACRO
+          KEYSEQ differs from KEYNAME above in that strings denoting an
+          entire key sequence can be specified, by placing the key
+          sequence in double quotes.  Some GNU Emacs style key escapes
+          can be used, as in the following example, but the special
+          character names are not recognized.
+
+               "\C-u": universal-argument
+               "\C-x\C-r": re-read-init-file
+               "\e[11~": "Function Key 1"
+
+          In the above example, `C-u' is again bound to the function
+          `universal-argument' (just as it was in the first example),
+          `C-x C-r' is bound to the function `re-read-init-file', and
+          `<ESC> <[> <1> <1> <~>' is bound to insert the text `Function
+          Key 1'.
+
+
+     The following GNU Emacs style escape sequences are available when
+     specifying key sequences:
+
+    `\C-'
+          control prefix
+
+    `\M-'
+          meta prefix
+
+    `\e'
+          an escape character
+
+    `\\'
+          backslash
+
+    `\"'
+          <">, a double quotation mark
+
+    `\''
+          <'>, a single quote or apostrophe
+
+     In addition to the GNU Emacs style escape sequences, a second set
+     of backslash escapes is available:
+
+    `\a'
+          alert (bell)
+
+    `\b'
+          backspace
+
+    `\d'
+          delete
+
+    `\f'
+          form feed
+
+    `\n'
+          newline
+
+    `\r'
+          carriage return
+
+    `\t'
+          horizontal tab
+
+    `\v'
+          vertical tab
+
+    `\NNN'
+          the eight-bit character whose value is the octal value NNN
+          (one to three digits)
+
+    `\xHH'
+          the eight-bit character whose value is the hexadecimal value
+          HH (one or two hex digits)
+
+     When entering the text of a macro, single or double quotes must be
+     used to indicate a macro definition.  Unquoted text is assumed to
+     be a function name.  In the macro body, the backslash escapes
+     described above are expanded.  Backslash will quote any other
+     character in the macro text, including `"' and `''.  For example,
+     the following binding will make `C-x \' insert a single `\' into
+     the line:
+          "\C-x\\": "\\"
+
+
+\1f
+File: bash.info,  Node: Conditional Init Constructs,  Next: Sample Init File,  Prev: Readline Init File Syntax,  Up: Readline Init File
+
+Conditional Init Constructs
+---------------------------
+
+   Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key bindings
+and variable settings to be performed as the result of tests.  There
+are four parser directives used.
+
+`$if'
+     The `$if' construct allows bindings to be made based on the
+     editing mode, the terminal being used, or the application using
+     Readline.  The text of the test extends to the end of the line; no
+     characters are required to isolate it.
+
+    `mode'
+          The `mode=' form of the `$if' directive is used to test
+          whether Readline is in `emacs' or `vi' mode.  This may be
+          used in conjunction with the `set keymap' command, for
+          instance, to set bindings in the `emacs-standard' and
+          `emacs-ctlx' keymaps only if Readline is starting out in
+          `emacs' mode.
+
+    `term'
+          The `term=' form may be used to include terminal-specific key
+          bindings, perhaps to bind the key sequences output by the
+          terminal's function keys.  The word on the right side of the
+          `=' is tested against both the full name of the terminal and
+          the portion of the terminal name before the first `-'.  This
+          allows `sun' to match both `sun' and `sun-cmd', for instance.
+
+    `application'
+          The APPLICATION construct is used to include
+          application-specific settings.  Each program using the
+          Readline library sets the APPLICATION NAME, and you can test
+          for a particular value.  This could be used to bind key
+          sequences to functions useful for a specific program.  For
+          instance, the following command adds a key sequence that
+          quotes the current or previous word in Bash:
+               $if Bash
+               # Quote the current or previous word
+               "\C-xq": "\eb\"\ef\""
+               $endif
+
+`$endif'
+     This command, as seen in the previous example, terminates an `$if'
+     command.
+
+`$else'
+     Commands in this branch of the `$if' directive are executed if the
+     test fails.
+
+`$include'
+     This directive takes a single filename as an argument and reads
+     commands and bindings from that file.  For example, the following
+     directive reads from `/etc/inputrc':
+          $include /etc/inputrc
+
+\1f
+File: bash.info,  Node: Sample Init File,  Prev: Conditional Init Constructs,  Up: Readline Init File
+
+Sample Init File
+----------------
+
+   Here is an example of an INPUTRC file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+
+
+     # This file controls the behaviour of line input editing for
+     # programs that use the GNU Readline library.  Existing
+     # programs include FTP, Bash, and GDB.
+     #
+     # You can re-read the inputrc file with C-x C-r.
+     # Lines beginning with '#' are comments.
+     #
+     # First, include any systemwide bindings and variable
+     # assignments from /etc/Inputrc
+     $include /etc/Inputrc
+     
+     #
+     # Set various bindings for emacs mode.
+     
+     set editing-mode emacs
+     
+     $if mode=emacs
+     
+     Meta-Control-h:   backward-kill-word      Text after the function name is ignored
+     
+     #
+     # Arrow keys in keypad mode
+     #
+     #"\M-OD":        backward-char
+     #"\M-OC":        forward-char
+     #"\M-OA":        previous-history
+     #"\M-OB":        next-history
+     #
+     # Arrow keys in ANSI mode
+     #
+     "\M-[D":        backward-char
+     "\M-[C":        forward-char
+     "\M-[A":        previous-history
+     "\M-[B":        next-history
+     #
+     # Arrow keys in 8 bit keypad mode
+     #
+     #"\M-\C-OD":       backward-char
+     #"\M-\C-OC":       forward-char
+     #"\M-\C-OA":       previous-history
+     #"\M-\C-OB":       next-history
+     #
+     # Arrow keys in 8 bit ANSI mode
+     #
+     #"\M-\C-[D":       backward-char
+     #"\M-\C-[C":       forward-char
+     #"\M-\C-[A":       previous-history
+     #"\M-\C-[B":       next-history
+     
+     C-q: quoted-insert
+     
+     $endif
+     
+     # An old-style binding.  This happens to be the default.
+     TAB: complete
+     
+     # Macros that are convenient for shell interaction
+     $if Bash
+     # edit the path
+     "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+     # prepare to type a quoted word --
+     # insert open and close double quotes
+     # and move to just after the open quote
+     "\C-x\"": "\"\"\C-b"
+     # insert a backslash (testing backslash escapes
+     # in sequences and macros)
+     "\C-x\\": "\\"
+     # Quote the current or previous word
+     "\C-xq": "\eb\"\ef\""
+     # Add a binding to refresh the line, which is unbound
+     "\C-xr": redraw-current-line
+     # Edit variable on current line.
+     "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+     $endif
+     
+     # use a visible bell if one is available
+     set bell-style visible
+     
+     # don't strip characters to 7 bits when reading
+     set input-meta on
+     
+     # allow iso-latin1 characters to be inserted rather
+     # than converted to prefix-meta sequences
+     set convert-meta off
+     
+     # display characters with the eighth bit set directly
+     # rather than as meta-prefixed characters
+     set output-meta on
+     
+     # if there are more than 150 possible completions for
+     # a word, ask the user if he wants to see all of them
+     set completion-query-items 150
+     
+     # For FTP
+     $if Ftp
+     "\C-xg": "get \M-?"
+     "\C-xt": "put \M-?"
+     "\M-.": yank-last-arg
+     $endif
+
+\1f
+File: bash.info,  Node: Bindable Readline Commands,  Next: Readline vi Mode,  Prev: Readline Init File,  Up: Command Line Editing
+
+Bindable Readline Commands
+==========================
+
+* Menu:
+
+* Commands For Moving::                Moving about the line.
+* Commands For History::       Getting at previous lines.
+* Commands For Text::          Commands for changing text.
+* Commands For Killing::       Commands for killing and yanking.
+* Numeric Arguments::          Specifying numeric arguments, repeat counts.
+* Commands For Completion::    Getting Readline to do the typing for you.
+* Keyboard Macros::            Saving and re-executing typed characters
+* Miscellaneous Commands::     Other miscellaneous commands.
+
+   This section describes Readline commands that may be bound to key
+sequences.  You can list your key bindings by executing `bind -P' or,
+for a more terse format, suitable for an INPUTRC file, `bind -p'.
+(*Note Bash Builtins::.)  Command names without an accompanying key
+sequence are unbound by default.
+
+   In the following descriptions, "point" refers to the current cursor
+position, and "mark" refers to a cursor position saved by the
+`set-mark' command.  The text between the point and mark is referred to
+as the "region".
+
+\1f
+File: bash.info,  Node: Commands For Moving,  Next: Commands For History,  Up: Bindable Readline Commands
+
+Commands For Moving
+-------------------
+
+`beginning-of-line (C-a)'
+     Move to the start of the current line.
+
+`end-of-line (C-e)'
+     Move to the end of the line.
+
+`forward-char (C-f)'
+     Move forward a character.
+
+`backward-char (C-b)'
+     Move back a character.
+
+`forward-word (M-f)'
+     Move forward to the end of the next word.  Words are composed of
+     letters and digits.
+
+`backward-word (M-b)'
+     Move back to the start of the current or previous word.  Words are
+     composed of letters and digits.
+
+`clear-screen (C-l)'
+     Clear the screen and redraw the current line, leaving the current
+     line at the top of the screen.
+
+`redraw-current-line ()'
+     Refresh the current line.  By default, this is unbound.
+
+
+\1f
+File: bash.info,  Node: Commands For History,  Next: Commands For Text,  Prev: Commands For Moving,  Up: Bindable Readline Commands
+
+Commands For Manipulating The History
+-------------------------------------
+
+`accept-line (Newline or Return)'
+     Accept the line regardless of where the cursor is.  If this line is
+     non-empty, add it to the history list according to the setting of
+     the `HISTCONTROL' and `HISTIGNORE' variables.  If this line is a
+     modified history line, then restore the history line to its
+     original state.
+
+`previous-history (C-p)'
+     Move `back' through the history list, fetching the previous
+     command.
+
+`next-history (C-n)'
+     Move `forward' through the history list, fetching the next command.
+
+`beginning-of-history (M-<)'
+     Move to the first line in the history.
+
+`end-of-history (M->)'
+     Move to the end of the input history, i.e., the line currently
+     being entered.
+
+`reverse-search-history (C-r)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary.  This is an incremental search.
+
+`forward-search-history (C-s)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary.  This is an incremental
+     search.
+
+`non-incremental-reverse-search-history (M-p)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`non-incremental-forward-search-history (M-n)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`history-search-forward ()'
+     Search forward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`history-search-backward ()'
+     Search backward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`yank-nth-arg (M-C-y)'
+     Insert the first argument to the previous command (usually the
+     second word on the previous line) at point.  With an argument N,
+     insert the Nth word from the previous command (the words in the
+     previous command begin with word 0).  A negative argument inserts
+     the Nth word from the end of the previous command.
+
+`yank-last-arg (M-. or M-_)'
+     Insert last argument to the previous command (the last word of the
+     previous history entry).  With an argument, behave exactly like
+     `yank-nth-arg'.  Successive calls to `yank-last-arg' move back
+     through the history list, inserting the last argument of each line
+     in turn.
+
+
+\1f
+File: bash.info,  Node: Commands For Text,  Next: Commands For Killing,  Prev: Commands For History,  Up: Bindable Readline Commands
+
+Commands For Changing Text
+--------------------------
+
+`delete-char (C-d)'
+     Delete the character at point.  If point is at the beginning of
+     the line, there are no characters in the line, and the last
+     character typed was not bound to `delete-char', then return EOF.
+
+`backward-delete-char (Rubout)'
+     Delete the character behind the cursor.  A numeric argument means
+     to kill the characters instead of deleting them.
+
+`forward-backward-delete-char ()'
+     Delete the character under the cursor, unless the cursor is at the
+     end of the line, in which case the character behind the cursor is
+     deleted.  By default, this is not bound to a key.
+
+`quoted-insert (C-q or C-v)'
+     Add the next character typed to the line verbatim.  This is how to
+     insert key sequences like `C-q', for example.
+
+`self-insert (a, b, A, 1, !, ...)'
+     Insert yourself.
+
+`transpose-chars (C-t)'
+     Drag the character before the cursor forward over the character at
+     the cursor, moving the cursor forward as well.  If the insertion
+     point is at the end of the line, then this transposes the last two
+     characters of the line.  Negative arguments have no effect.
+
+`transpose-words (M-t)'
+     Drag the word before point past the word after point, moving point
+     past that word as well.  If the insertion point is at the end of
+     the line, this transposes the last two words on the line.
+
+`upcase-word (M-u)'
+     Uppercase the current (or following) word.  With a negative
+     argument, uppercase the previous word, but do not move the cursor.
+
+`downcase-word (M-l)'
+     Lowercase the current (or following) word.  With a negative
+     argument, lowercase the previous word, but do not move the cursor.
+
+`capitalize-word (M-c)'
+     Capitalize the current (or following) word.  With a negative
+     argument, capitalize the previous word, but do not move the cursor.
+
+`overwrite-mode ()'
+     Toggle overwrite mode.  With an explicit positive numeric argument,
+     switches to overwrite mode.  With an explicit non-positive numeric
+     argument, switches to insert mode.  This command affects only
+     `emacs' mode; `vi' mode does overwrite differently.  Each call to
+     `readline()' starts in insert mode.
+
+     In overwrite mode, characters bound to `self-insert' replace the
+     text at point rather than pushing the text to the right.
+     Characters bound to `backward-delete-char' replace the character
+     before point with a space.
+
+     By default, this command is unbound.
+
+
+\1f
+File: bash.info,  Node: Commands For Killing,  Next: Numeric Arguments,  Prev: Commands For Text,  Up: Bindable Readline Commands
+
+Killing And Yanking
+-------------------
+
+`kill-line (C-k)'
+     Kill the text from point to the end of the line.
+
+`backward-kill-line (C-x Rubout)'
+     Kill backward to the beginning of the line.
+
+`unix-line-discard (C-u)'
+     Kill backward from the cursor to the beginning of the current line.
+
+`kill-whole-line ()'
+     Kill all characters on the current line, no matter where point is.
+     By default, this is unbound.
+
+`kill-word (M-d)'
+     Kill from point to the end of the current word, or if between
+     words, to the end of the next word.  Word boundaries are the same
+     as `forward-word'.
+
+`backward-kill-word (M-<DEL>)'
+     Kill the word behind point.  Word boundaries are the same as
+     `backward-word'.
+
+`unix-word-rubout (C-w)'
+     Kill the word behind point, using white space as a word boundary.
+     The killed text is saved on the kill-ring.
+
+`delete-horizontal-space ()'
+     Delete all spaces and tabs around point.  By default, this is
+     unbound.
+
+`kill-region ()'
+     Kill the text in the current region.  By default, this command is
+     unbound.
+
+`copy-region-as-kill ()'
+     Copy the text in the region to the kill buffer, so it can be yanked
+     right away.  By default, this command is unbound.
+
+`copy-backward-word ()'
+     Copy the word before point to the kill buffer.  The word
+     boundaries are the same as `backward-word'.  By default, this
+     command is unbound.
+
+`copy-forward-word ()'
+     Copy the word following point to the kill buffer.  The word
+     boundaries are the same as `forward-word'.  By default, this
+     command is unbound.
+
+`yank (C-y)'
+     Yank the top of the kill ring into the buffer at point.
+
+`yank-pop (M-y)'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `yank' or `yank-pop'.
+
+\1f
+File: bash.info,  Node: Numeric Arguments,  Next: Commands For Completion,  Prev: Commands For Killing,  Up: Bindable Readline Commands
+
+Specifying Numeric Arguments
+----------------------------
+
+`digit-argument (M-0, M-1, ... M--)'
+     Add this digit to the argument already accumulating, or start a new
+     argument.  `M--' starts a negative argument.
+
+`universal-argument ()'
+     This is another way to specify an argument.  If this command is
+     followed by one or more digits, optionally with a leading minus
+     sign, those digits define the argument.  If the command is
+     followed by digits, executing `universal-argument' again ends the
+     numeric argument, but is otherwise ignored.  As a special case, if
+     this command is immediately followed by a character that is
+     neither a digit or minus sign, the argument count for the next
+     command is multiplied by four.  The argument count is initially
+     one, so executing this function the first time makes the argument
+     count four, a second time makes the argument count sixteen, and so
+     on.  By default, this is not bound to a key.
+
+\1f
+File: bash.info,  Node: Commands For Completion,  Next: Keyboard Macros,  Prev: Numeric Arguments,  Up: Bindable Readline Commands
+
+Letting Readline Type For You
+-----------------------------
+
+`complete (<TAB>)'
+     Attempt to perform completion on the text before point.  The
+     actual completion performed is application-specific.  Bash
+     attempts completion treating the text as a variable (if the text
+     begins with `$'), username (if the text begins with `~'), hostname
+     (if the text begins with `@'), or command (including aliases and
+     functions) in turn.  If none of these produces a match, filename
+     completion is attempted.
+
+`possible-completions (M-?)'
+     List the possible completions of the text before point.
+
+`insert-completions (M-*)'
+     Insert all completions of the text before point that would have
+     been generated by `possible-completions'.
+
+`menu-complete ()'
+     Similar to `complete', but replaces the word to be completed with
+     a single match from the list of possible completions.  Repeated
+     execution of `menu-complete' steps through the list of possible
+     completions, inserting each match in turn.  At the end of the list
+     of completions, the bell is rung (subject to the setting of
+     `bell-style') and the original text is restored.  An argument of N
+     moves N positions forward in the list of matches; a negative
+     argument may be used to move backward through the list.  This
+     command is intended to be bound to <TAB>, but is unbound by
+     default.
+
+`delete-char-or-list ()'
+     Deletes the character under the cursor if not at the beginning or
+     end of the line (like `delete-char').  If at the end of the line,
+     behaves identically to `possible-completions'.  This command is
+     unbound by default.
+
+`complete-filename (M-/)'
+     Attempt filename completion on the text before point.
+
+`possible-filename-completions (C-x /)'
+     List the possible completions of the text before point, treating
+     it as a filename.
+
+`complete-username (M-~)'
+     Attempt completion on the text before point, treating it as a
+     username.
+
+`possible-username-completions (C-x ~)'
+     List the possible completions of the text before point, treating
+     it as a username.
+
+`complete-variable (M-$)'
+     Attempt completion on the text before point, treating it as a
+     shell variable.
+
+`possible-variable-completions (C-x $)'
+     List the possible completions of the text before point, treating
+     it as a shell variable.
+
+`complete-hostname (M-@)'
+     Attempt completion on the text before point, treating it as a
+     hostname.
+
+`possible-hostname-completions (C-x @)'
+     List the possible completions of the text before point, treating
+     it as a hostname.
+
+`complete-command (M-!)'
+     Attempt completion on the text before point, treating it as a
+     command name.  Command completion attempts to match the text
+     against aliases, reserved words, shell functions, shell builtins,
+     and finally executable filenames, in that order.
+
+`possible-command-completions (C-x !)'
+     List the possible completions of the text before point, treating
+     it as a command name.
+
+`dynamic-complete-history (M-<TAB>)'
+     Attempt completion on the text before point, comparing the text
+     against lines from the history list for possible completion
+     matches.
+
+`complete-into-braces (M-{)'
+     Perform filename completion and insert the list of possible
+     completions enclosed within braces so the list is available to the
+     shell (*note Brace Expansion::).
+
+
+\1f
+File: bash.info,  Node: Keyboard Macros,  Next: Miscellaneous Commands,  Prev: Commands For Completion,  Up: Bindable Readline Commands
+
+Keyboard Macros
+---------------
+
+`start-kbd-macro (C-x ()'
+     Begin saving the characters typed into the current keyboard macro.
+
+`end-kbd-macro (C-x ))'
+     Stop saving the characters typed into the current keyboard macro
+     and save the definition.
+
+`call-last-kbd-macro (C-x e)'
+     Re-execute the last keyboard macro defined, by making the
+     characters in the macro appear as if typed at the keyboard.
+
+
+\1f
+File: bash.info,  Node: Miscellaneous Commands,  Prev: Keyboard Macros,  Up: Bindable Readline Commands
+
+Some Miscellaneous Commands
+---------------------------
+
+`re-read-init-file (C-x C-r)'
+     Read in the contents of the INPUTRC file, and incorporate any
+     bindings or variable assignments found there.
+
+`abort (C-g)'
+     Abort the current editing command and ring the terminal's bell
+     (subject to the setting of `bell-style').
+
+`do-uppercase-version (M-a, M-b, M-X, ...)'
+     If the metafied character X is lowercase, run the command that is
+     bound to the corresponding uppercase character.
+
+`prefix-meta (<ESC>)'
+     Metafy the next character typed.  This is for keyboards without a
+     meta key.  Typing `<ESC> f' is equivalent to typing `M-f'.
+
+`undo (C-_ or C-x C-u)'
+     Incremental undo, separately remembered for each line.
+
+`revert-line (M-r)'
+     Undo all changes made to this line.  This is like executing the
+     `undo' command enough times to get back to the beginning.
+
+`tilde-expand (M-&)'
+     Perform tilde expansion on the current word.
+
+`set-mark (C-@)'
+     Set the mark to the point.  If a numeric argument is supplied, the
+     mark is set to that position.
+
+`exchange-point-and-mark (C-x C-x)'
+     Swap the point with the mark.  The current cursor position is set
+     to the saved position, and the old cursor position is saved as the
+     mark.
+
+`character-search (C-])'
+     A character is read and point is moved to the next occurrence of
+     that character.  A negative count searches for previous
+     occurrences.
+
+`character-search-backward (M-C-])'
+     A character is read and point is moved to the previous occurrence
+     of that character.  A negative count searches for subsequent
+     occurrences.
+
+`insert-comment (M-#)'
+     Without a numeric argument, the value of the `comment-begin'
+     variable is inserted at the beginning of the current line.  If a
+     numeric argument is supplied, this command acts as a toggle:  if
+     the characters at the beginning of the line do not match the value
+     of `comment-begin', the value is inserted, otherwise the
+     characters in `comment-begin' are deleted from the beginning of
+     the line.  In either case, the line is accepted as if a newline
+     had been typed.  The default value of `comment-begin' causes this
+     command to make the current line a shell comment.  If a numeric
+     argument causes the comment character to be removed, the line will
+     be executed by the shell.
+
+`dump-functions ()'
+     Print all of the functions and their key bindings to the Readline
+     output stream.  If a numeric argument is supplied, the output is
+     formatted in such a way that it can be made part of an INPUTRC
+     file.  This command is unbound by default.
+
+`dump-variables ()'
+     Print all of the settable variables and their values to the
+     Readline output stream.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`dump-macros ()'
+     Print all of the Readline key sequences bound to macros and the
+     strings they output.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`glob-complete-word (M-g)'
+     The word before point is treated as a pattern for pathname
+     expansion, with an asterisk implicitly appended.  This pattern is
+     used to generate a list of matching file names for possible
+     completions.
+
+`glob-expand-word (C-x *)'
+     The word before point is treated as a pattern for pathname
+     expansion, and the list of matching file names is inserted,
+     replacing the word.  If a numeric argument is supplied, a `*' is
+     appended before pathname expansion.
+
+`glob-list-expansions (C-x g)'
+     The list of expansions that would have been generated by
+     `glob-expand-word' is displayed, and the line is redrawn.  If a
+     numeric argument is supplied, a `*' is appended before pathname
+     expansion.
+
+`display-shell-version (C-x C-v)'
+     Display version information about the current instance of Bash.
+
+`shell-expand-line (M-C-e)'
+     Expand the line as the shell does.  This performs alias and
+     history expansion as well as all of the shell word expansions
+     (*note Shell Expansions::).
+
+`history-expand-line (M-^)'
+     Perform history expansion on the current line.
+
+`magic-space ()'
+     Perform history expansion on the current line and insert a space
+     (*note History Interaction::).
+
+`alias-expand-line ()'
+     Perform alias expansion on the current line (*note Aliases::).
+
+`history-and-alias-expand-line ()'
+     Perform history and alias expansion on the current line.
+
+`insert-last-argument (M-. or M-_)'
+     A synonym for `yank-last-arg'.
+
+`operate-and-get-next (C-o)'
+     Accept the current line for execution and fetch the next line
+     relative to the current line from the history for editing.  Any
+     argument is ignored.
+
+`edit-and-execute-command (C-xC-e)'
+     Invoke an editor on the current command line, and execute the
+     result as shell commands.  Bash attempts to invoke `$FCEDIT',
+     `$EDITOR', and `emacs' as the editor, in that order.
+
+
+\1f
+File: bash.info,  Node: Readline vi Mode,  Next: Programmable Completion,  Prev: Bindable Readline Commands,  Up: Command Line Editing
+
+Readline vi Mode
+================
+
+   While the Readline library does not have a full set of `vi' editing
+functions, it does contain enough to allow simple editing of the line.
+The Readline `vi' mode behaves as specified in the POSIX 1003.2
+standard.
+
+   In order to switch interactively between `emacs' and `vi' editing
+modes, use the `set -o emacs' and `set -o vi' commands (*note The Set
+Builtin::).  The Readline default is `emacs' mode.
+
+   When you enter a line in `vi' mode, you are already placed in
+`insertion' mode, as if you had typed an `i'.  Pressing <ESC> switches
+you into `command' mode, where you can edit the text of the line with
+the standard `vi' movement keys, move to previous history lines with
+`k' and subsequent lines with `j', and so forth.
+
+\1f
+File: bash.info,  Node: Programmable Completion,  Next: Programmable Completion Builtins,  Prev: Readline vi Mode,  Up: Command Line Editing
+
+Programmable Completion
+=======================
+
+   When word completion is attempted for an argument to a command for
+which a completion specification (a COMPSPEC) has been defined using
+the `complete' builtin (*note Programmable Completion Builtins::), the
+programmable completion facilities are invoked.
+
+   First, the command name is identified.  If a compspec has been
+defined for that command, the compspec is used to generate the list of
+possible completions for the word.  If the command word is a full
+pathname, a compspec for the full pathname is searched for first.  If
+no compspec is found for the full pathname, an attempt is made to find
+a compspec for the portion following the final slash.
+
+   Once a compspec has been found, it is used to generate the list of
+matching words.  If a compspec is not found, the default Bash completion
+described above (*note Commands For Completion::) is performed.
+
+   First, the actions specified by the compspec are used.  Only matches
+which are prefixed by the word being completed are returned.  When the
+`-f' or `-d' option is used for filename or directory name completion,
+the shell variable `FIGNORE' is used to filter the matches.  *Note Bash
+Variables::, for a description of `FIGNORE'.
+
+   Any completions specified by a filename expansion pattern to the
+`-G' option are generated next.  The words generated by the pattern
+need not match the word being completed.  The `GLOBIGNORE' shell
+variable is not used to filter the matches, but the `FIGNORE' shell
+variable is used.
+
+   Next, the string specified as the argument to the `-W' option is
+considered.  The string is first split using the characters in the `IFS'
+special variable as delimiters.  Shell quoting is honored.  Each word
+is then expanded using brace expansion, tilde expansion, parameter and
+variable expansion, command substitution, arithmetic expansion, and
+pathname expansion, as described above (*note Shell Expansions::).  The
+results are split using the rules described above (*note Word
+Splitting::).  The results of the expansion are prefix-matched against
+the word being completed, and the matching words become the possible
+completions.
+
+   After these matches have been generated, any shell function or
+command specified with the `-F' and `-C' options is invoked.  When the
+command or function is invoked, the `COMP_LINE' and `COMP_POINT'
+variables are assigned values as described above (*note Bash
+Variables::).  If a shell function is being invoked, the `COMP_WORDS'
+and `COMP_CWORD' variables are also set.  When the function or command
+is invoked, the first argument is the name of the command whose
+arguments are being completed, the second argument is the word being
+completed, and the third argument is the word preceding the word being
+completed on the current command line.  No filtering of the generated
+completions against the word being completed is performed; the function
+or command has complete freedom in generating the matches.
+
+   Any function specified with `-F' is invoked first.  The function may
+use any of the shell facilities, including the `compgen' builtin
+described below (*note Programmable Completion Builtins::), to generate
+the matches.  It must put the possible completions in the `COMPREPLY'
+array variable.
+
+   Next, any command specified with the `-C' option is invoked in an
+environment equivalent to command substitution.  It should print a list
+of completions, one per line, to the standard output.  Backslash may be
+used to escape a newline, if necessary.
+
+   After all of the possible completions are generated, any filter
+specified with the `-X' option is applied to the list.  The filter is a
+pattern as used for pathname expansion; a `&' in the pattern is
+replaced with the text of the word being completed.  A literal `&' may
+be escaped with a backslash; the backslash is removed before attempting
+a match.  Any completion that matches the pattern will be removed from
+the list.  A leading `!' negates the pattern; in this case any
+completion not matching the pattern will be removed.
+
+   Finally, any prefix and suffix specified with the `-P' and `-S'
+options are added to each member of the completion list, and the result
+is returned to the Readline completion code as the list of possible
+completions.
+
+   If the previously-applied actions do not generate any matches, and
+the `-o dirnames' option was supplied to `complete' when the compspec
+was defined, directory name completion is attempted.
+
+   If the `-o plusdirs' option was supplied to `complete' when the
+compspec was defined, directory name completion is attempted and any
+matches are added to the results of the other actions.
+
+   By default, if a compspec is found, whatever it generates is
+returned to the completion code as the full set of possible completions.
+The default Bash completions are not attempted, and the Readline default
+of filename completion is disabled.  If the `-o bashdefault' option was
+supplied to `complete' when the compspec was defined, the default Bash
+completions are attempted if the compspec generates no matches.  If the
+`-o default' option was supplied to `complete' when the compspec was
+defined, Readline's default completion will be performed if the
+compspec (and, if attempted, the default Bash completions) generate no
+matches.
+
+   When a compspec indicates that directory name completion is desired,
+the programmable completion functions force Readline to append a slash
+to completed names which are symbolic links to directories, subject to
+the value of the MARK-DIRECTORIES Readline variable, regardless of the
+setting of the MARK-SYMLINKED-DIRECTORIES Readline variable.
+
+\1f
+File: bash.info,  Node: Programmable Completion Builtins,  Prev: Programmable Completion,  Up: Command Line Editing
+
+Programmable Completion Builtins
+================================
+
+   Two builtin commands are available to manipulate the programmable
+completion facilities.
+
+`compgen'
+          `compgen [OPTION] [WORD]'
+
+     Generate possible completion matches for WORD according to the
+     OPTIONs, which may be any option accepted by the `complete'
+     builtin with the exception of `-p' and `-r', and write the matches
+     to the standard output.  When using the `-F' or `-C' options, the
+     various shell variables set by the programmable completion
+     facilities, while available, will not have useful values.
+
+     The matches will be generated in the same way as if the
+     programmable completion code had generated them directly from a
+     completion specification with the same flags.  If WORD is
+     specified, only those completions matching WORD will be displayed.
+
+     The return value is true unless an invalid option is supplied, or
+     no matches were generated.
+
+`complete'
+          `complete [-abcdefgjksuv] [-o COMP-OPTION] [-A ACTION] [-G GLOBPAT] [-W WORDLIST]
+          [-P PREFIX] [-S SUFFIX] [-X FILTERPAT] [-F FUNCTION]
+          [-C COMMAND] NAME [NAME ...]'
+          `complete -pr [NAME ...]'
+
+     Specify how arguments to each NAME should be completed.  If the
+     `-p' option is supplied, or if no options are supplied, existing
+     completion specifications are printed in a way that allows them to
+     be reused as input.  The `-r' option removes a completion
+     specification for each NAME, or, if no NAMEs are supplied, all
+     completion specifications.
+
+     The process of applying these completion specifications when word
+     completion is attempted is described above (*note Programmable
+     Completion::).
+
+     Other options, if specified, have the following meanings.  The
+     arguments to the `-G', `-W', and `-X' options (and, if necessary,
+     the `-P' and `-S' options) should be quoted to protect them from
+     expansion before the `complete' builtin is invoked.
+
+    `-o COMP-OPTION'
+          The COMP-OPTION controls several aspects of the compspec's
+          behavior beyond the simple generation of completions.
+          COMP-OPTION may be one of:
+
+         `bashdefault'
+               Perform the rest of the default Bash completions if the
+               compspec generates no matches.
+
+         `default'
+               Use Readline's default filename completion if the
+               compspec generates no matches.
+
+         `dirnames'
+               Perform directory name completion if the compspec
+               generates no matches.
+
+         `filenames'
+               Tell Readline that the compspec generates filenames, so
+               it can perform any filename-specific processing (like
+               adding a slash to directory names or suppressing
+               trailing spaces).  This option is intended to be used
+               with shell functions specified with `-F'.
+
+         `nospace'
+               Tell Readline not to append a space (the default) to
+               words completed at the end of the line.
+
+    `-A ACTION'
+          The ACTION may be one of the following to generate a list of
+          possible completions:
+
+         `alias'
+               Alias names.  May also be specified as `-a'.
+
+         `arrayvar'
+               Array variable names.
+
+         `binding'
+               Readline key binding names (*note Bindable Readline
+               Commands::).
+
+         `builtin'
+               Names of shell builtin commands.  May also be specified
+               as `-b'.
+
+         `command'
+               Command names.  May also be specified as `-c'.
+
+         `directory'
+               Directory names.  May also be specified as `-d'.
+
+         `disabled'
+               Names of disabled shell builtins.
+
+         `enabled'
+               Names of enabled shell builtins.
+
+         `export'
+               Names of exported shell variables.  May also be
+               specified as `-e'.
+
+         `file'
+               File names.  May also be specified as `-f'.
+
+         `function'
+               Names of shell functions.
+
+         `group'
+               Group names.  May also be specified as `-g'.
+
+         `helptopic'
+               Help topics as accepted by the `help' builtin (*note
+               Bash Builtins::).
+
+         `hostname'
+               Hostnames, as taken from the file specified by the
+               `HOSTFILE' shell variable (*note Bash Variables::).
+
+         `job'
+               Job names, if job control is active.  May also be
+               specified as `-j'.
+
+         `keyword'
+               Shell reserved words.  May also be specified as `-k'.
+
+         `running'
+               Names of running jobs, if job control is active.
+
+         `service'
+               Service names.  May also be specified as `-s'.
+
+         `setopt'
+               Valid arguments for the `-o' option to the `set' builtin
+               (*note The Set Builtin::).
+
+         `shopt'
+               Shell option names as accepted by the `shopt' builtin
+               (*note Bash Builtins::).
+
+         `signal'
+               Signal names.
+
+         `stopped'
+               Names of stopped jobs, if job control is active.
+
+         `user'
+               User names.  May also be specified as `-u'.
+
+         `variable'
+               Names of all shell variables.  May also be specified as
+               `-v'.
+
+    `-G GLOBPAT'
+          The filename expansion pattern GLOBPAT is expanded to generate
+          the possible completions.
+
+    `-W WORDLIST'
+          The WORDLIST is split using the characters in the `IFS'
+          special variable as delimiters, and each resultant word is
+          expanded.  The possible completions are the members of the
+          resultant list which match the word being completed.
+
+    `-C COMMAND'
+          COMMAND is executed in a subshell environment, and its output
+          is used as the possible completions.
+
+    `-F FUNCTION'
+          The shell function FUNCTION is executed in the current shell
+          environment.  When it finishes, the possible completions are
+          retrieved from the value of the `COMPREPLY' array variable.
+
+    `-X FILTERPAT'
+          FILTERPAT is a pattern as used for filename expansion.  It is
+          applied to the list of possible completions generated by the
+          preceding options and arguments, and each completion matching
+          FILTERPAT is removed from the list.  A leading `!' in
+          FILTERPAT negates the pattern; in this case, any completion
+          not matching FILTERPAT is removed.
+
+    `-P PREFIX'
+          PREFIX is added at the beginning of each possible completion
+          after all other options have been applied.
+
+    `-S SUFFIX'
+          SUFFIX is appended to each possible completion after all
+          other options have been applied.
+
+     The return value is true unless an invalid option is supplied, an
+     option other than `-p' or `-r' is supplied without a NAME
+     argument, an attempt is made to remove a completion specification
+     for a NAME for which no specification exists, or an error occurs
+     adding a completion specification.
+
+
+\1f
+File: bash.info,  Node: Using History Interactively,  Next: Command Line Editing,  Prev: Job Control,  Up: Top
+
+Using History Interactively
+***************************
+
+   This chapter describes how to use the GNU History Library
+interactively, from a user's standpoint.  It should be considered a
+user's guide.  For information on using the GNU History Library in
+other programs, see the GNU Readline Library Manual.
+
+* Menu:
+
+* Bash History Facilities::    How Bash lets you manipulate your command
+                               history.
+* Bash History Builtins::      The Bash builtin commands that manipulate
+                               the command history.
+* History Interaction::                What it feels like using History as a user.
+
+\1f
+File: bash.info,  Node: Bash History Facilities,  Next: Bash History Builtins,  Up: Using History Interactively
+
+Bash History Facilities
+=======================
+
+   When the `-o history' option to the `set' builtin is enabled (*note
+The Set Builtin::), the shell provides access to the "command history",
+the list of commands previously typed.  The value of the `HISTSIZE'
+shell variable is used as the number of commands to save in a history
+list.  The text of the last `$HISTSIZE' commands (default 500) is saved.
+The shell stores each command in the history list prior to parameter
+and variable expansion but after history expansion is performed,
+subject to the values of the shell variables `HISTIGNORE' and
+`HISTCONTROL'.
+
+   When the shell starts up, the history is initialized from the file
+named by the `HISTFILE' variable (default `~/.bash_history').  The file
+named by the value of `HISTFILE' is truncated, if necessary, to contain
+no more than the number of lines specified by the value of the
+`HISTFILESIZE' variable.  When an interactive shell exits, the last
+`$HISTSIZE' lines are copied from the history list to the file named by
+`$HISTFILE'.  If the `histappend' shell option is set (*note Bash
+Builtins::), the lines are appended to the history file, otherwise the
+history file is overwritten.  If `HISTFILE' is unset, or if the history
+file is unwritable, the history is not saved.  After saving the
+history, the history file is truncated to contain no more than
+`$HISTFILESIZE' lines.  If `HISTFILESIZE' is not set, no truncation is
+performed.
+
+   The builtin command `fc' may be used to list or edit and re-execute
+a portion of the history list.  The `history' builtin may be used to
+display or modify the history list and manipulate the history file.
+When using command-line editing, search commands are available in each
+editing mode that provide access to the history list (*note Commands
+For History::).
+
+   The shell allows control over which commands are saved on the history
+list.  The `HISTCONTROL' and `HISTIGNORE' variables may be set to cause
+the shell to save only a subset of the commands entered.  The `cmdhist'
+shell option, if enabled, causes the shell to attempt to save each line
+of a multi-line command in the same history entry, adding semicolons
+where necessary to preserve syntactic correctness.  The `lithist' shell
+option causes the shell to save the command with embedded newlines
+instead of semicolons.  The `shopt' builtin is used to set these
+options.  *Note Bash Builtins::, for a description of `shopt'.
+
+\1f
+File: bash.info,  Node: Bash History Builtins,  Next: History Interaction,  Prev: Bash History Facilities,  Up: Using History Interactively
+
+Bash History Builtins
+=====================
+
+   Bash provides two builtin commands which manipulate the history list
+and history file.
+
+`fc'
+          `fc [-e ENAME] [-nlr] [FIRST] [LAST]'
+          `fc -s [PAT=REP] [COMMAND]'
+
+     Fix Command.  In the first form, a range of commands from FIRST to
+     LAST is selected from the history list.  Both FIRST and LAST may
+     be specified as a string (to locate the most recent command
+     beginning with that string) or as a number (an index into the
+     history list, where a negative number is used as an offset from the
+     current command number).  If LAST is not specified it is set to
+     FIRST.  If FIRST is not specified it is set to the previous
+     command for editing and -16 for listing.  If the `-l' flag is
+     given, the commands are listed on standard output.  The `-n' flag
+     suppresses the command numbers when listing.  The `-r' flag
+     reverses the order of the listing.  Otherwise, the editor given by
+     ENAME is invoked on a file containing those commands.  If ENAME is
+     not given, the value of the following variable expansion is used:
+     `${FCEDIT:-${EDITOR:-vi}}'.  This says to use the value of the
+     `FCEDIT' variable if set, or the value of the `EDITOR' variable if
+     that is set, or `vi' if neither is set.  When editing is complete,
+     the edited commands are echoed and executed.
+
+     In the second form, COMMAND is re-executed after each instance of
+     PAT in the selected command is replaced by REP.
+
+     A useful alias to use with the `fc' command is `r='fc -s'', so
+     that typing `r cc' runs the last command beginning with `cc' and
+     typing `r' re-executes the last command (*note Aliases::).
+
+`history'
+          history [N]
+          history -c
+          history -d OFFSET
+          history [-anrw] [FILENAME]
+          history -ps ARG
+
+     With no options, display the history list with line numbers.
+     Lines prefixed with a `*' have been modified.  An argument of N
+     lists only the last N lines.  Options, if supplied, have the
+     following meanings:
+
+    `-c'
+          Clear the history list.  This may be combined with the other
+          options to replace the history list completely.
+
+    `-d OFFSET'
+          Delete the history entry at position OFFSET.  OFFSET should
+          be specified as it appears when the history is displayed.
+
+    `-a'
+          Append the new history lines (history lines entered since the
+          beginning of the current Bash session) to the history file.
+
+    `-n'
+          Append the history lines not already read from the history
+          file to the current history list.  These are lines appended
+          to the history file since the beginning of the current Bash
+          session.
+
+    `-r'
+          Read the current history file and append its contents to the
+          history list.
+
+    `-w'
+          Write out the current history to the history file.
+
+    `-p'
+          Perform history substitution on the ARGs and display the
+          result on the standard output, without storing the results in
+          the history list.
+
+    `-s'
+          The ARGs are added to the end of the history list as a single
+          entry.
+
+
+     When any of the `-w', `-r', `-a', or `-n' options is used, if
+     FILENAME is given, then it is used as the history file.  If not,
+     then the value of the `HISTFILE' variable is used.
+
+
+\1f
+File: bash.info,  Node: History Interaction,  Prev: Bash History Builtins,  Up: Using History Interactively
+
+History Expansion
+=================
+
+   The History library provides a history expansion feature that is
+similar to the history expansion provided by `csh'.  This section
+describes the syntax used to manipulate the history information.
+
+   History expansions introduce words from the history list into the
+input stream, making it easy to repeat commands, insert the arguments
+to a previous command into the current input line, or fix errors in
+previous commands quickly.
+
+   History expansion takes place in two parts.  The first is to
+determine which line from the history list should be used during
+substitution.  The second is to select portions of that line for
+inclusion into the current one.  The line selected from the history is
+called the "event", and the portions of that line that are acted upon
+are called "words".  Various "modifiers" are available to manipulate
+the selected words.  The line is broken into words in the same fashion
+that Bash does, so that several words surrounded by quotes are
+considered one word.  History expansions are introduced by the
+appearance of the history expansion character, which is `!' by default.
+Only `\' and `'' may be used to escape the history expansion character.
+
+   Several shell options settable with the `shopt' builtin (*note Bash
+Builtins::) may be used to tailor the behavior of history expansion.
+If the `histverify' shell option is enabled, and Readline is being
+used, history substitutions are not immediately passed to the shell
+parser.  Instead, the expanded line is reloaded into the Readline
+editing buffer for further modification.  If Readline is being used,
+and the `histreedit' shell option is enabled, a failed history
+expansion will be reloaded into the Readline editing buffer for
+correction.  The `-p' option to the `history' builtin command may be
+used to see what a history expansion will do before using it.  The `-s'
+option to the `history' builtin may be used to add commands to the end
+of the history list without actually executing them, so that they are
+available for subsequent recall.  This is most useful in conjunction
+with Readline.
+
+   The shell allows control of the various characters used by the
+history expansion mechanism with the `histchars' variable.
+
+* Menu:
+
+* Event Designators::  How to specify which history line to use.
+* Word Designators::   Specifying which words are of interest.
+* Modifiers::          Modifying the results of substitution.
+
+\1f
+File: bash.info,  Node: Event Designators,  Next: Word Designators,  Up: History Interaction
+
+Event Designators
+-----------------
+
+   An event designator is a reference to a command line entry in the
+history list.
+
+`!'
+     Start a history substitution, except when followed by a space, tab,
+     the end of the line, `=' or `(' (when the `extglob' shell option
+     is enabled using the `shopt' builtin).
+
+`!N'
+     Refer to command line N.
+
+`!-N'
+     Refer to the command N lines back.
+
+`!!'
+     Refer to the previous command.  This is a synonym for `!-1'.
+
+`!STRING'
+     Refer to the most recent command starting with STRING.
+
+`!?STRING[?]'
+     Refer to the most recent command containing STRING.  The trailing
+     `?' may be omitted if the STRING is followed immediately by a
+     newline.
+
+`^STRING1^STRING2^'
+     Quick Substitution.  Repeat the last command, replacing STRING1
+     with STRING2.  Equivalent to `!!:s/STRING1/STRING2/'.
+
+`!#'
+     The entire command line typed so far.
+
+
+\1f
+File: bash.info,  Node: Word Designators,  Next: Modifiers,  Prev: Event Designators,  Up: History Interaction
+
+Word Designators
+----------------
+
+   Word designators are used to select desired words from the event.  A
+`:' separates the event specification from the word designator.  It may
+be omitted if the word designator begins with a `^', `$', `*', `-', or
+`%'.  Words are numbered from the beginning of the line, with the first
+word being denoted by 0 (zero).  Words are inserted into the current
+line separated by single spaces.
+
+   For example,
+
+`!!'
+     designates the preceding command.  When you type this, the
+     preceding command is repeated in toto.
+
+`!!:$'
+     designates the last argument of the preceding command.  This may be
+     shortened to `!$'.
+
+`!fi:2'
+     designates the second argument of the most recent command starting
+     with the letters `fi'.
+
+   Here are the word designators:
+
+`0 (zero)'
+     The `0'th word.  For many applications, this is the command word.
+
+`N'
+     The Nth word.
+
+`^'
+     The first argument; that is, word 1.
+
+`$'
+     The last argument.
+
+`%'
+     The word matched by the most recent `?STRING?' search.
+
+`X-Y'
+     A range of words; `-Y' abbreviates `0-Y'.
+
+`*'
+     All of the words, except the `0'th.  This is a synonym for `1-$'.
+     It is not an error to use `*' if there is just one word in the
+     event; the empty string is returned in that case.
+
+`X*'
+     Abbreviates `X-$'
+
+`X-'
+     Abbreviates `X-$' like `X*', but omits the last word.
+
+
+   If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
+\1f
+File: bash.info,  Node: Modifiers,  Prev: Word Designators,  Up: History Interaction
+
+Modifiers
+---------
+
+   After the optional word designator, you can add a sequence of one or
+more of the following modifiers, each preceded by a `:'.
+
+`h'
+     Remove a trailing pathname component, leaving only the head.
+
+`t'
+     Remove all leading  pathname  components, leaving the tail.
+
+`r'
+     Remove a trailing suffix of the form `.SUFFIX', leaving the
+     basename.
+
+`e'
+     Remove all but the trailing suffix.
+
+`p'
+     Print the new command but do not execute it.
+
+`q'
+     Quote the substituted words, escaping further substitutions.
+
+`x'
+     Quote the substituted words as with `q', but break into words at
+     spaces, tabs, and newlines.
+
+`s/OLD/NEW/'
+     Substitute NEW for the first occurrence of OLD in the event line.
+     Any delimiter may be used in place of `/'.  The delimiter may be
+     quoted in OLD and NEW with a single backslash.  If `&' appears in
+     NEW, it is replaced by OLD.  A single backslash will quote the
+     `&'.  The final delimiter is optional if it is the last character
+     on the input line.
+
+`&'
+     Repeat the previous substitution.
+
+`g'
+`a'
+     Cause changes to be applied over the entire event line.  Used in
+     conjunction with `s', as in `gs/OLD/NEW/', or with `&'.
+
+`G'
+     Apply the following `s' modifier once to each word in the event.
+
+
+\1f
+File: bash.info,  Node: Installing Bash,  Next: Reporting Bugs,  Prev: Command Line Editing,  Up: Top
+
+Installing Bash
+***************
+
+   This chapter provides basic instructions for installing Bash on the
+various supported platforms.  The distribution supports the GNU
+operating systems, nearly every version of Unix, and several non-Unix
+systems such as BeOS and Interix.  Other independent ports exist for
+MS-DOS, OS/2, Windows 95/98, and Windows NT.
+
+* Menu:
+
+* Basic Installation:: Installation instructions.
+
+* Compilers and Options::      How to set special options for various
+                               systems.
+
+* Compiling For Multiple Architectures::       How to compile Bash for more
+                                               than one kind of system from
+                                               the same source tree.
+
+* Installation Names:: How to set the various paths used by the installation.
+
+* Specifying the System Type:: How to configure Bash for a particular system.
+
+* Sharing Defaults::   How to share default configuration values among GNU
+                       programs.
+
+* Operation Controls:: Options recognized by the configuration program.
+
+* Optional Features::  How to enable and disable optional features when
+                       building Bash.
+
+\1f
+File: bash.info,  Node: Basic Installation,  Next: Compilers and Options,  Up: Installing Bash
+
+Basic Installation
+==================
+
+   These are installation instructions for Bash.
+
+   The simplest way to compile Bash is:
+
+  1. `cd' to the directory containing the source code and type
+     `./configure' to configure Bash for your system.  If you're using
+     `csh' on an old version of System V, you might need to type `sh
+     ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes some time.  While running, it prints
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile Bash and build the `bashbug' bug reporting
+     script.
+
+  3. Optionally, type `make tests' to run the Bash test suite.
+
+  4. Type `make install' to install `bash' and `bashbug'.  This will
+     also install the manual pages and Info file.
+
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package
+(the top directory, the `builtins', `doc', and `support' directories,
+each directory under `lib', and several others).  It also creates a
+`config.h' file containing system-dependent definitions.  Finally, it
+creates a shell script named `config.status' that you can run in the
+future to recreate the current configuration, a file `config.cache'
+that saves the results of its tests to speed up reconfiguring, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').  If at some point `config.cache' contains
+results you don't want to keep, you may remove or edit it.
+
+   To find out more about the options and arguments that the
+`configure' script understands, type
+
+     bash-2.04$ ./configure --help
+
+at the Bash prompt in your Bash source directory.
+
+   If you need to do unusual things to compile Bash, please try to
+figure out how `configure' could check whether or not to do them, and
+mail diffs or instructions to <bash-maintainers@gnu.org> so they can be
+considered for the next release.
+
+   The file `configure.in' is used to create `configure' by a program
+called Autoconf.  You only need `configure.in' if you want to change it
+or regenerate `configure' using a newer version of Autoconf.  If you do
+this, make sure you are using Autoconf version 2.50 or newer.
+
+   You can remove the program binaries and object files from the source
+code directory by typing `make clean'.  To also remove the files that
+`configure' created (so you can compile Bash for a different kind of
+computer), type `make distclean'.
+
+\1f
+File: bash.info,  Node: Compilers and Options,  Next: Compiling For Multiple Architectures,  Prev: Basic Installation,  Up: Installing Bash
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+   On systems that have the `env' program, you can do it like this:
+
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+   The configuration process uses GCC to build Bash if it is available.
+
+\1f
+File: bash.info,  Node: Compiling For Multiple Architectures,  Next: Installation Names,  Prev: Compilers and Options,  Up: Installing Bash
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile Bash for more than one kind of computer at the same
+time, by placing the object files for each architecture in their own
+directory.  To do this, you must use a version of `make' that supports
+the `VPATH' variable, such as GNU `make'.  `cd' to the directory where
+you want the object files and executables to go and run the `configure'
+script from the source directory.  You may need to supply the
+`--srcdir=PATH' argument to tell `configure' where the source files
+are.  `configure' automatically checks for the source code in the
+directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you can compile Bash for one architecture at a time in the
+source code directory.  After you have installed Bash for one
+architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+   Alternatively, if your system supports symbolic links, you can use
+the `support/mkclone' script to create a build tree which has symbolic
+links back to each file in the source directory.  Here's an example
+that creates a build directory in the current directory from a source
+directory `/usr/gnu/src/bash-2.0':
+
+     bash /usr/gnu/src/bash-2.0/support/mkclone -s /usr/gnu/src/bash-2.0 .
+
+The `mkclone' script requires Bash, so you must have already built Bash
+for at least one architecture before you can create build directories
+for other architectures.
+
+\1f
+File: bash.info,  Node: Installation Names,  Next: Specifying the System Type,  Prev: Compiling For Multiple Architectures,  Up: Installing Bash
+
+Installation Names
+==================
+
+   By default, `make install' will install into `/usr/local/bin',
+`/usr/local/man', etc.  You can specify an installation prefix other
+than `/usr/local' by giving `configure' the option `--prefix=PATH', or
+by specifying a value for the `DESTDIR' `make' variable when running
+`make install'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', `make install' will
+use PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+\1f
+File: bash.info,  Node: Specifying the System Type,  Next: Sharing Defaults,  Prev: Installation Names,  Up: Installing Bash
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but need to determine by the type of host Bash will run
+on.  Usually `configure' can figure that out, but if it prints a
+message saying it can not guess the host type, give it the
+`--host=TYPE' option.  `TYPE' can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+`CPU-COMPANY-SYSTEM' (e.g., `i386-unknown-freebsd4.2').
+
+   See the file `support/config.sub' for the possible values of each
+field.
+
+\1f
+File: bash.info,  Node: Sharing Defaults,  Next: Operation Controls,  Prev: Specifying the System Type,  Up: Installing Bash
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: the Bash `configure' looks for a site script, but not all
+`configure' scripts do.
+
+\1f
+File: bash.info,  Node: Operation Controls,  Next: Optional Features,  Prev: Sharing Defaults,  Up: Installing Bash
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+     Look for the Bash source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+   `configure' also accepts some other, not widely used, boilerplate
+options.  `configure --help' prints the complete list.
+
+\1f
+File: bash.info,  Node: Optional Features,  Prev: Operation Controls,  Up: Installing Bash
+
+Optional Features
+=================
+
+   The Bash `configure' has a number of `--enable-FEATURE' options,
+where FEATURE indicates an optional part of Bash.  There are also
+several `--with-PACKAGE' options, where PACKAGE is something like
+`bash-malloc' or `purify'.  To turn off the default use of a package,
+use `--without-PACKAGE'.  To configure Bash without a feature that is
+enabled by default, use `--disable-FEATURE'.
+
+   Here is a complete list of the `--enable-' and `--with-' options
+that the Bash `configure' recognizes.
+
+`--with-afs'
+     Define if you are using the Andrew File System from Transarc.
+
+`--with-bash-malloc'
+     Use the Bash version of `malloc' in `lib/malloc/malloc.c'.  This
+     is not the same `malloc' that appears in GNU libc, but an older
+     version derived from the 4.2 BSD `malloc'.  This `malloc' is very
+     fast, but wastes some space on each allocation.  This option is
+     enabled by default.  The `NOTES' file contains a list of systems
+     for which this should be turned off, and `configure' disables this
+     option automatically for a number of systems.
+
+`--with-curses'
+     Use the curses library instead of the termcap library.  This should
+     be supplied if your system has an inadequate or incomplete termcap
+     database.
+
+`--with-gnu-malloc'
+     A synonym for `--with-bash-malloc'.
+
+`--with-installed-readline[=PREFIX]'
+     Define this to make Bash link with a locally-installed version of
+     Readline rather than the version in `lib/readline'.  This works
+     only with Readline 4.3 and later versions.  If PREFIX is `yes' or
+     not supplied, `configure' uses the values of the make variables
+     `includedir' and `libdir', which are subdirectories of `prefix' by
+     default, to find the installed version of Readline if it is not in
+     the standard system include and library directories.  If PREFIX is
+     `no', Bash links with the version in `lib/readline'.  If PREFIX is
+     set to any other value, `configure' treats it as a directory
+     pathname and looks for the installed version of Readline in
+     subdirectories of that directory (include files in
+     PREFIX/`include' and the library in PREFIX/`lib').
+
+`--with-purify'
+     Define this to use the Purify memory allocation checker from
+     Rational Software.
+
+`--enable-minimal-config'
+     This produces a shell with minimal features, close to the
+     historical Bourne shell.
+
+   There are several `--enable-' options that alter how Bash is
+compiled and linked, rather than changing run-time features.
+
+`--enable-largefile'
+     Enable support for large files
+     (http://www.sas.com/standards/large_file/x_open.20Mar96.html) if
+     the operating system requires special compiler options to build
+     programs which can access large files.  This is enabled by
+     default, if the operating system provides large file support.
+
+`--enable-profiling'
+     This builds a Bash binary that produces profiling information to be
+     processed by `gprof' each time it is executed.
+
+`--enable-static-link'
+     This causes Bash to be linked statically, if `gcc' is being used.
+     This could be used to build a version to use as root's shell.
+
+   The `minimal-config' option can be used to disable all of the
+following options, but it is processed first, so individual options may
+be enabled using `enable-FEATURE'.
+
+   All of the following options except for `disabled-builtins' and
+`xpg-echo-default' are enabled by default, unless the operating system
+does not provide the necessary support.
+
+`--enable-alias'
+     Allow alias expansion and include the `alias' and `unalias'
+     builtins (*note Aliases::).
+
+`--enable-arith-for-command'
+     Include support for the alternate form of the `for' command that
+     behaves like the C language `for' statement (*note Looping
+     Constructs::).
+
+`--enable-array-variables'
+     Include support for one-dimensional array shell variables (*note
+     Arrays::).
+
+`--enable-bang-history'
+     Include support for `csh'-like history substitution (*note History
+     Interaction::).
+
+`--enable-brace-expansion'
+     Include `csh'-like brace expansion ( `b{a,b}c' ==> `bac bbc' ).
+     See *Note Brace Expansion::, for a complete description.
+
+`--enable-command-timing'
+     Include support for recognizing `time' as a reserved word and for
+     displaying timing statistics for the pipeline following `time'
+     (*note Pipelines::).  This allows pipelines as well as shell
+     builtins and functions to be timed.
+
+`--enable-cond-command'
+     Include support for the `[[' conditional command (*note
+     Conditional Constructs::).
+
+`--enable-directory-stack'
+     Include support for a `csh'-like directory stack and the `pushd',
+     `popd', and `dirs' builtins (*note The Directory Stack::).
+
+`--enable-disabled-builtins'
+     Allow builtin commands to be invoked via `builtin xxx' even after
+     `xxx' has been disabled using `enable -n xxx'.  See *Note Bash
+     Builtins::, for details of the `builtin' and `enable' builtin
+     commands.
+
+`--enable-dparen-arithmetic'
+     Include support for the `((...))' command (*note Conditional
+     Constructs::).
+
+`--enable-extended-glob'
+     Include support for the extended pattern matching features
+     described above under *Note Pattern Matching::.
+
+`--enable-help-builtin'
+     Include the `help' builtin, which displays help on shell builtins
+     and variables (*note Bash Builtins::).
+
+`--enable-history'
+     Include command history and the `fc' and `history' builtin
+     commands (*note Bash History Facilities::).
+
+`--enable-job-control'
+     This enables the job control features (*note Job Control::), if
+     the operating system supports them.
+
+`--enable-multibyte'
+     This enables support for multibyte characters if the operating
+     system provides the necessary support.
+
+`--enable-net-redirections'
+     This enables the special handling of filenames of the form
+     `/dev/tcp/HOST/PORT' and `/dev/udp/HOST/PORT' when used in
+     redirections (*note Redirections::).
+
+`--enable-process-substitution'
+     This enables process substitution (*note Process Substitution::) if
+     the operating system provides the necessary support.
+
+`--enable-prompt-string-decoding'
+     Turn on the interpretation of a number of backslash-escaped
+     characters in the `$PS1', `$PS2', `$PS3', and `$PS4' prompt
+     strings.  See *Note Printing a Prompt::, for a complete list of
+     prompt string escape sequences.
+
+`--enable-progcomp'
+     Enable the programmable completion facilities (*note Programmable
+     Completion::).  If Readline is not enabled, this option has no
+     effect.
+
+`--enable-readline'
+     Include support for command-line editing and history with the Bash
+     version of the Readline library (*note Command Line Editing::).
+
+`--enable-restricted'
+     Include support for a "restricted shell".  If this is enabled,
+     Bash, when called as `rbash', enters a restricted mode.  See *Note
+     The Restricted Shell::, for a description of restricted mode.
+
+`--enable-select'
+     Include the `select' builtin, which allows the generation of simple
+     menus (*note Conditional Constructs::).
+
+`--enable-usg-echo-default'
+     A synonym for `--enable-xpg-echo-default'.
+
+`--enable-xpg-echo-default'
+     Make the `echo' builtin expand backslash-escaped characters by
+     default, without requiring the `-e' option.  This sets the default
+     value of the `xpg_echo' shell option to `on', which makes the Bash
+     `echo' behave more like the version specified in the Single Unix
+     Specification, version 2.  *Note Bash Builtins::, for a
+     description of the escape sequences that `echo' recognizes.
+
+
+   The file `config-top.h' contains C Preprocessor `#define' statements
+for options which are not settable from `configure'.  Some of these are
+not meant to be changed; beware of the consequences if you do.  Read
+the comments associated with each definition for more information about
+its effect.
+
+\1f
+File: bash.info,  Node: Reporting Bugs,  Next: Major Differences From The Bourne Shell,  Prev: Installing Bash,  Up: Top
+
+Reporting Bugs
+**************
+
+   Please report all bugs you find in Bash.  But first, you should make
+sure that it really is a bug, and that it appears in the latest version
+of Bash.  The latest version of Bash is always available for FTP from
+`ftp://ftp.gnu.org/pub/bash/'.
+
+   Once you have determined that a bug actually exists, use the
+`bashbug' command to submit a bug report.  If you have a fix, you are
+encouraged to mail that as well!  Suggestions and `philosophical' bug
+reports may be mailed to <bug-bash@gnu.org> or posted to the Usenet
+newsgroup `gnu.bash.bug'.
+
+   All bug reports should include:
+   * The version number of Bash.
+
+   * The hardware and operating system.
+
+   * The compiler used to compile Bash.
+
+   * A description of the bug behaviour.
+
+   * A short script or `recipe' which exercises the bug and may be used
+     to reproduce it.
+
+`bashbug' inserts the first three items automatically into the template
+it provides for filing a bug report.
+
+   Please send all reports concerning this manual to <chet@po.CWRU.Edu>.
+
+\1f
+File: bash.info,  Node: Major Differences From The Bourne Shell,  Next: Copying This Manual,  Prev: Reporting Bugs,  Up: Top
+
+Major Differences From The Bourne Shell
+***************************************
+
+   Bash implements essentially the same grammar, parameter and variable
+expansion, redirection, and quoting as the Bourne Shell.  Bash uses the
+POSIX 1003.2 standard as the specification of how these features are to
+be implemented.  There are some differences between the traditional
+Bourne shell and Bash; this section quickly details the differences of
+significance.  A number of these differences are explained in greater
+depth in previous sections.  This section uses the version of `sh'
+included in SVR4.2 as the baseline reference.
+
+   * Bash is POSIX-conformant, even where the POSIX specification
+     differs from traditional `sh' behavior (*note Bash POSIX Mode::).
+
+   * Bash has multi-character invocation options (*note Invoking
+     Bash::).
+
+   * Bash has command-line editing (*note Command Line Editing::) and
+     the `bind' builtin.
+
+   * Bash provides a programmable word completion mechanism (*note
+     Programmable Completion::), and two builtin commands, `complete'
+     and `compgen', to manipulate it.
+
+   * Bash has command history (*note Bash History Facilities::) and the
+     `history' and `fc' builtins to manipulate it.
+
+   * Bash implements `csh'-like history expansion (*note History
+     Interaction::).
+
+   * Bash has one-dimensional array variables (*note Arrays::), and the
+     appropriate variable expansions and assignment syntax to use them.
+     Several of the Bash builtins take options to act on arrays.  Bash
+     provides a number of built-in array variables.
+
+   * The `$'...'' quoting syntax, which expands ANSI-C
+     backslash-escaped characters in the text between the single quotes,
+     is supported (*note ANSI-C Quoting::).
+
+   * Bash supports the `$"..."' quoting syntax to do locale-specific
+     translation of the characters between the double quotes.  The
+     `-D', `--dump-strings', and `--dump-po-strings' invocation options
+     list the translatable strings found in a script (*note Locale
+     Translation::).
+
+   * Bash implements the `!' keyword to negate the return value of a
+     pipeline (*note Pipelines::).  Very useful when an `if' statement
+     needs to act only if a test fails.
+
+   * Bash has the `time' reserved word and command timing (*note
+     Pipelines::).  The display of the timing statistics may be
+     controlled with the `TIMEFORMAT' variable.
+
+   * Bash implements the `for (( EXPR1 ; EXPR2 ; EXPR3 ))' arithmetic
+     for command, similar to the C language (*note Looping
+     Constructs::).
+
+   * Bash includes the `select' compound command, which allows the
+     generation of simple menus (*note Conditional Constructs::).
+
+   * Bash includes the `[[' compound command, which makes conditional
+     testing part of the shell grammar (*note Conditional Constructs::).
+
+   * Bash includes brace expansion (*note Brace Expansion::) and tilde
+     expansion (*note Tilde Expansion::).
+
+   * Bash implements command aliases and the `alias' and `unalias'
+     builtins (*note Aliases::).
+
+   * Bash provides shell arithmetic, the `((' compound command (*note
+     Conditional Constructs::), and arithmetic expansion (*note Shell
+     Arithmetic::).
+
+   * Variables present in the shell's initial environment are
+     automatically exported to child processes.  The Bourne shell does
+     not normally do this unless the variables are explicitly marked
+     using the `export' command.
+
+   * Bash includes the POSIX pattern removal `%', `#', `%%' and `##'
+     expansions to remove leading or trailing substrings from variable
+     values (*note Shell Parameter Expansion::).
+
+   * The expansion `${#xx}', which returns the length of `${xx}', is
+     supported (*note Shell Parameter Expansion::).
+
+   * The expansion `${var:'OFFSET`[:'LENGTH`]}', which expands to the
+     substring of `var''s value of length LENGTH, beginning at OFFSET,
+     is present (*note Shell Parameter Expansion::).
+
+   * The expansion `${var/[/]'PATTERN`[/'REPLACEMENT`]}', which matches
+     PATTERN and replaces it with REPLACEMENT in the value of `var', is
+     available (*note Shell Parameter Expansion::).
+
+   * The expansion `${!PREFIX}*' expansion, which expands to the names
+     of all shell variables whose names begin with PREFIX, is available
+     (*note Shell Parameter Expansion::).
+
+   * Bash has INDIRECT variable expansion using `${!word}' (*note Shell
+     Parameter Expansion::).
+
+   * Bash can expand positional parameters beyond `$9' using `${NUM}'.
+
+   * The POSIX `$()' form of command substitution is implemented (*note
+     Command Substitution::), and preferred to the Bourne shell's ```'
+     (which is also implemented for backwards compatibility).
+
+   * Bash has process substitution (*note Process Substitution::).
+
+   * Bash automatically assigns variables that provide information
+     about the current user (`UID', `EUID', and `GROUPS'), the current
+     host (`HOSTTYPE', `OSTYPE', `MACHTYPE', and `HOSTNAME'), and the
+     instance of Bash that is running (`BASH', `BASH_VERSION', and
+     `BASH_VERSINFO').  *Note Bash Variables::, for details.
+
+   * The `IFS' variable is used to split only the results of expansion,
+     not all words (*note Word Splitting::).  This closes a
+     longstanding shell security hole.
+
+   * Bash implements the full set of POSIX 1003.2 filename expansion
+     operators, including CHARACTER CLASSES, EQUIVALENCE CLASSES, and
+     COLLATING SYMBOLS (*note Filename Expansion::).
+
+   * Bash implements extended pattern matching features when the
+     `extglob' shell option is enabled (*note Pattern Matching::).
+
+   * It is possible to have a variable and a function with the same
+     name; `sh' does not separate the two name spaces.
+
+   * Bash functions are permitted to have local variables using the
+     `local' builtin, and thus useful recursive functions may be written
+     (*note Bash Builtins::).
+
+   * Variable assignments preceding commands affect only that command,
+     even builtins and functions (*note Environment::).  In `sh', all
+     variable assignments preceding commands are global unless the
+     command is executed from the file system.
+
+   * Bash performs filename expansion on filenames specified as operands
+     to input and output redirection operators (*note Redirections::).
+
+   * Bash contains the `<>' redirection operator, allowing a file to be
+     opened for both reading and writing, and the `&>' redirection
+     operator, for directing standard output and standard error to the
+     same file (*note Redirections::).
+
+   * Bash treats a number of filenames specially when they are used in
+     redirection operators (*note Redirections::).
+
+   * Bash can open network connections to arbitrary machines and
+     services with the redirection operators (*note Redirections::).
+
+   * The `noclobber' option is available to avoid overwriting existing
+     files with output redirection (*note The Set Builtin::).  The `>|'
+     redirection operator may be used to override `noclobber'.
+
+   * The Bash `cd' and `pwd' builtins (*note Bourne Shell Builtins::)
+     each take `-L' and `-P' options to switch between logical and
+     physical modes.
+
+   * Bash allows a function to override a builtin with the same name,
+     and provides access to that builtin's functionality within the
+     function via the `builtin' and `command' builtins (*note Bash
+     Builtins::).
+
+   * The `command' builtin allows selective disabling of functions when
+     command lookup is performed (*note Bash Builtins::).
+
+   * Individual builtins may be enabled or disabled using the `enable'
+     builtin (*note Bash Builtins::).
+
+   * The Bash `exec' builtin takes additional options that allow users
+     to control the contents of the environment passed to the executed
+     command, and what the zeroth argument to the command is to be
+     (*note Bourne Shell Builtins::).
+
+   * Shell functions may be exported to children via the environment
+     using `export -f' (*note Shell Functions::).
+
+   * The Bash `export', `readonly', and `declare' builtins can take a
+     `-f' option to act on shell functions, a `-p' option to display
+     variables with various attributes set in a format that can be used
+     as shell input, a `-n' option to remove various variable
+     attributes, and `name=value' arguments to set variable attributes
+     and values simultaneously.
+
+   * The Bash `hash' builtin allows a name to be associated with an
+     arbitrary filename, even when that filename cannot be found by
+     searching the `$PATH', using `hash -p' (*note Bourne Shell
+     Builtins::).
+
+   * Bash includes a `help' builtin for quick reference to shell
+     facilities (*note Bash Builtins::).
+
+   * The `printf' builtin is available to display formatted output
+     (*note Bash Builtins::).
+
+   * The Bash `read' builtin (*note Bash Builtins::) will read a line
+     ending in `\' with the `-r' option, and will use the `REPLY'
+     variable as a default if no non-option arguments are supplied.
+     The Bash `read' builtin also accepts a prompt string with the `-p'
+     option and will use Readline to obtain the line when given the
+     `-e' option.  The `read' builtin also has additional options to
+     control input: the `-s' option will turn off echoing of input
+     characters as they are read, the `-t' option will allow `read' to
+     time out if input does not arrive within a specified number of
+     seconds, the `-n' option will allow reading only a specified
+     number of characters rather than a full line, and the `-d' option
+     will read until a particular character rather than newline.
+
+   * The `return' builtin may be used to abort execution of scripts
+     executed with the `.' or `source' builtins (*note Bourne Shell
+     Builtins::).
+
+   * Bash includes the `shopt' builtin, for finer control of shell
+     optional capabilities (*note Bash Builtins::), and allows these
+     options to be set and unset at shell invocation (*note Invoking
+     Bash::).
+
+   * Bash has much more optional behavior controllable with the `set'
+     builtin (*note The Set Builtin::).
+
+   * The `test' builtin (*note Bourne Shell Builtins::) is slightly
+     different, as it implements the POSIX algorithm, which specifies
+     the behavior based on the number of arguments.
+
+   * The `trap' builtin (*note Bourne Shell Builtins::) allows a
+     `DEBUG' pseudo-signal specification, similar to `EXIT'.  Commands
+     specified with a `DEBUG' trap are executed before every simple
+     command, `for' command, `case' command, `select' command, every
+     arithmetic `for' command, and before the first command executes in
+     a shell function.  The `DEBUG' trap is not inherited by shell
+     functions unless the function has been given the `trace' attribute
+     or the `functrace' option has been enabled using the `shopt'
+     builtin.  The `extdebug' shell option has additional effects on the
+     `DEBUG' trap.
+
+     The `trap' builtin (*note Bourne Shell Builtins::) allows an `ERR'
+     pseudo-signal specification, similar to `EXIT' and `DEBUG'.
+     Commands specified with an `ERR' trap are executed after a simple
+     command fails, with a few exceptions.  The `ERR' trap is not
+     inherited by shell functions unless the `-o errtrace' option to
+     the `set' builtin is enabled.
+
+     The `trap' builtin (*note Bourne Shell Builtins::) allows a
+     `RETURN' pseudo-signal specification, similar to `EXIT' and
+     `DEBUG'.  Commands specified with an `RETURN' trap are executed
+     before execution resumes after a shell function or a shell script
+     executed with `.' or `source' returns.  The `RETURN' trap is not
+     inherited by shell functions.
+
+   * The Bash `type' builtin is more extensive and gives more
+     information about the names it finds (*note Bash Builtins::).
+
+   * The Bash `umask' builtin permits a `-p' option to cause the output
+     to be displayed in the form of a `umask' command that may be
+     reused as input (*note Bourne Shell Builtins::).
+
+   * Bash implements a `csh'-like directory stack, and provides the
+     `pushd', `popd', and `dirs' builtins to manipulate it (*note The
+     Directory Stack::).  Bash also makes the directory stack visible
+     as the value of the `DIRSTACK' shell variable.
+
+   * Bash interprets special backslash-escaped characters in the prompt
+     strings when interactive (*note Printing a Prompt::).
+
+   * The Bash restricted mode is more useful (*note The Restricted
+     Shell::); the SVR4.2 shell restricted mode is too limited.
+
+   * The `disown' builtin can remove a job from the internal shell job
+     table (*note Job Control Builtins::) or suppress the sending of
+     `SIGHUP' to a job when the shell exits as the result of a `SIGHUP'.
+
+   * The SVR4.2 shell has two privilege-related builtins (`mldmode' and
+     `priv') not present in Bash.
+
+   * Bash does not have the `stop' or `newgrp' builtins.
+
+   * Bash does not use the `SHACCT' variable or perform shell
+     accounting.
+
+   * The SVR4.2 `sh' uses a `TIMEOUT' variable like Bash uses `TMOUT'.
+
+
+More features unique to Bash may be found in *Note Bash Features::.
+
+Implementation Differences From The SVR4.2 Shell
+================================================
+
+   Since Bash is a completely new implementation, it does not suffer
+from many of the limitations of the SVR4.2 shell.  For instance:
+
+   * Bash does not fork a subshell when redirecting into or out of a
+     shell control structure such as  an `if' or `while' statement.
+
+   * Bash does not allow unbalanced quotes.  The SVR4.2 shell will
+     silently insert a needed closing quote at `EOF' under certain
+     circumstances.  This can be the cause of some hard-to-find errors.
+
+   * The SVR4.2 shell uses a baroque memory management scheme based on
+     trapping `SIGSEGV'.  If the shell is started from a process with
+     `SIGSEGV' blocked (e.g., by using the `system()' C library
+     function call), it misbehaves badly.
+
+   * In a questionable attempt at security, the SVR4.2 shell, when
+     invoked without the `-p' option, will alter its real and effective
+     UID and GID if they are less than some magic threshold value,
+     commonly 100.  This can lead to unexpected results.
+
+   * The SVR4.2 shell does not allow users to trap `SIGSEGV',
+     `SIGALRM', or `SIGCHLD'.
+
+   * The SVR4.2 shell does not allow the `IFS', `MAILCHECK', `PATH',
+     `PS1', or `PS2' variables to be unset.
+
+   * The SVR4.2 shell treats `^' as the undocumented equivalent of `|'.
+
+   * Bash allows multiple option arguments when it is invoked (`-x -v');
+     the SVR4.2 shell allows only one option argument (`-xv').  In
+     fact, some versions of the shell dump core if the second argument
+     begins with a `-'.
+
+   * The SVR4.2 shell exits a script if any builtin fails; Bash exits a
+     script only if one of the POSIX 1003.2 special builtins fails, and
+     only for certain failures, as enumerated in the POSIX 1003.2
+     standard.
+
+   * The SVR4.2 shell behaves differently when invoked as `jsh' (it
+     turns on job control).
+
+\1f
+File: bash.info,  Node: Copying This Manual,  Next: Builtin Index,  Prev: Major Differences From The Bourne Shell,  Up: Top
+
+Copying This Manual
+*******************
+
+* Menu:
+
+* GNU Free Documentation License::      License for copying this manual.
+
+\1f
+File: bash.info,  Node: GNU Free Documentation License,  Up: Copying This Manual
+
+GNU Free Documentation License
+==============================
+
+                      Version 1.2, November 2002
+     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+     
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided for under this License.  Any other
+     attempt to copy, modify, sublicense or distribute the Document is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.
+
+ADDENDUM: How to use this License for your documents
+----------------------------------------------------
+
+   To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.2
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+       A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: bash.info,  Node: Builtin Index,  Next: Reserved Word Index,  Prev: Copying This Manual,  Up: Top
+
+Index of Shell Builtin Commands
+*******************************
+
+* Menu:
+
+* .:                                     Bourne Shell Builtins.
+* ::                                     Bourne Shell Builtins.
+* [:                                     Bourne Shell Builtins.
+* alias:                                 Bash Builtins.
+* bg:                                    Job Control Builtins.
+* bind:                                  Bash Builtins.
+* break:                                 Bourne Shell Builtins.
+* builtin:                               Bash Builtins.
+* caller:                                Bash Builtins.
+* cd:                                    Bourne Shell Builtins.
+* command:                               Bash Builtins.
+* compgen:                               Programmable Completion Builtins.
+* complete:                              Programmable Completion Builtins.
+* continue:                              Bourne Shell Builtins.
+* declare:                               Bash Builtins.
+* dirs:                                  Directory Stack Builtins.
+* disown:                                Job Control Builtins.
+* echo:                                  Bash Builtins.
+* enable:                                Bash Builtins.
+* eval:                                  Bourne Shell Builtins.
+* exec:                                  Bourne Shell Builtins.
+* exit:                                  Bourne Shell Builtins.
+* export:                                Bourne Shell Builtins.
+* fc:                                    Bash History Builtins.
+* fg:                                    Job Control Builtins.
+* getopts:                               Bourne Shell Builtins.
+* hash:                                  Bourne Shell Builtins.
+* help:                                  Bash Builtins.
+* history:                               Bash History Builtins.
+* jobs:                                  Job Control Builtins.
+* kill:                                  Job Control Builtins.
+* let:                                   Bash Builtins.
+* local:                                 Bash Builtins.
+* logout:                                Bash Builtins.
+* popd:                                  Directory Stack Builtins.
+* printf:                                Bash Builtins.
+* pushd:                                 Directory Stack Builtins.
+* pwd:                                   Bourne Shell Builtins.
+* read:                                  Bash Builtins.
+* readonly:                              Bourne Shell Builtins.
+* return:                                Bourne Shell Builtins.
+* set:                                   The Set Builtin.
+* shift:                                 Bourne Shell Builtins.
+* shopt:                                 Bash Builtins.
+* source:                                Bash Builtins.
+* suspend:                               Job Control Builtins.
+* test:                                  Bourne Shell Builtins.
+* times:                                 Bourne Shell Builtins.
+* trap:                                  Bourne Shell Builtins.
+* type:                                  Bash Builtins.
+* typeset:                               Bash Builtins.
+* ulimit:                                Bash Builtins.
+* umask:                                 Bourne Shell Builtins.
+* unalias:                               Bash Builtins.
+* unset:                                 Bourne Shell Builtins.
+* wait:                                  Job Control Builtins.
+
+\1f
+File: bash.info,  Node: Reserved Word Index,  Next: Variable Index,  Prev: Builtin Index,  Up: Top
+
+Index of Shell Reserved Words
+*****************************
+
+* Menu:
+
+* !:                                     Pipelines.
+* [[:                                    Conditional Constructs.
+* ]]:                                    Conditional Constructs.
+* case:                                  Conditional Constructs.
+* do:                                    Looping Constructs.
+* done:                                  Looping Constructs.
+* elif:                                  Conditional Constructs.
+* else:                                  Conditional Constructs.
+* esac:                                  Conditional Constructs.
+* fi:                                    Conditional Constructs.
+* for:                                   Looping Constructs.
+* function:                              Shell Functions.
+* if:                                    Conditional Constructs.
+* in:                                    Conditional Constructs.
+* select:                                Conditional Constructs.
+* then:                                  Conditional Constructs.
+* time:                                  Pipelines.
+* until:                                 Looping Constructs.
+* while:                                 Looping Constructs.
+* {:                                     Command Grouping.
+* }:                                     Command Grouping.
+
+\1f
+File: bash.info,  Node: Variable Index,  Next: Function Index,  Prev: Reserved Word Index,  Up: Top
+
+Parameter and Variable Index
+****************************
+
+* Menu:
+
+* !:                                     Special Parameters.
+* #:                                     Special Parameters.
+* $:                                     Special Parameters.
+* *:                                     Special Parameters.
+* -:                                     Special Parameters.
+* 0:                                     Special Parameters.
+* ?:                                     Special Parameters.
+* @:                                     Special Parameters.
+* _:                                     Special Parameters.
+* auto_resume:                           Job Control Variables.
+* BASH:                                  Bash Variables.
+* BASH_ARGC:                             Bash Variables.
+* BASH_ARGV:                             Bash Variables.
+* BASH_COMMAND:                          Bash Variables.
+* BASH_ENV:                              Bash Variables.
+* BASH_EXECUTION_STRING:                 Bash Variables.
+* BASH_LINENO:                           Bash Variables.
+* BASH_SOURCE:                           Bash Variables.
+* BASH_SUBSHELL:                         Bash Variables.
+* BASH_VERSINFO:                         Bash Variables.
+* BASH_VERSION:                          Bash Variables.
+* bell-style:                            Readline Init File Syntax.
+* CDPATH:                                Bourne Shell Variables.
+* COLUMNS:                               Bash Variables.
+* comment-begin:                         Readline Init File Syntax.
+* COMP_CWORD:                            Bash Variables.
+* COMP_LINE:                             Bash Variables.
+* COMP_POINT:                            Bash Variables.
+* COMP_WORDBREAKS:                       Bash Variables.
+* COMP_WORDS:                            Bash Variables.
+* completion-query-items:                Readline Init File Syntax.
+* COMPREPLY:                             Bash Variables.
+* convert-meta:                          Readline Init File Syntax.
+* DIRSTACK:                              Bash Variables.
+* disable-completion:                    Readline Init File Syntax.
+* editing-mode:                          Readline Init File Syntax.
+* EMACS:                                 Bash Variables.
+* enable-keypad:                         Readline Init File Syntax.
+* EUID:                                  Bash Variables.
+* expand-tilde:                          Readline Init File Syntax.
+* FCEDIT:                                Bash Variables.
+* FIGNORE:                               Bash Variables.
+* FUNCNAME:                              Bash Variables.
+* GLOBIGNORE:                            Bash Variables.
+* GROUPS:                                Bash Variables.
+* histchars:                             Bash Variables.
+* HISTCMD:                               Bash Variables.
+* HISTCONTROL:                           Bash Variables.
+* HISTFILE:                              Bash Variables.
+* HISTFILESIZE:                          Bash Variables.
+* HISTIGNORE:                            Bash Variables.
+* history-preserve-point:                Readline Init File Syntax.
+* HISTSIZE:                              Bash Variables.
+* HOME:                                  Bourne Shell Variables.
+* horizontal-scroll-mode:                Readline Init File Syntax.
+* HOSTFILE:                              Bash Variables.
+* HOSTNAME:                              Bash Variables.
+* HOSTTYPE:                              Bash Variables.
+* IFS:                                   Bourne Shell Variables.
+* IGNOREEOF:                             Bash Variables.
+* input-meta:                            Readline Init File Syntax.
+* INPUTRC:                               Bash Variables.
+* isearch-terminators:                   Readline Init File Syntax.
+* keymap:                                Readline Init File Syntax.
+* LANG:                                  Bash Variables.
+* LC_ALL:                                Bash Variables.
+* LC_COLLATE:                            Bash Variables.
+* LC_CTYPE:                              Bash Variables.
+* LC_MESSAGES <1>:                       Locale Translation.
+* LC_MESSAGES:                           Bash Variables.
+* LC_NUMERIC:                            Bash Variables.
+* LINENO:                                Bash Variables.
+* LINES:                                 Bash Variables.
+* MACHTYPE:                              Bash Variables.
+* MAIL:                                  Bourne Shell Variables.
+* MAILCHECK:                             Bash Variables.
+* MAILPATH:                              Bourne Shell Variables.
+* mark-modified-lines:                   Readline Init File Syntax.
+* mark-symlinked-directories:            Readline Init File Syntax.
+* match-hidden-files:                    Readline Init File Syntax.
+* meta-flag:                             Readline Init File Syntax.
+* OLDPWD:                                Bash Variables.
+* OPTARG:                                Bourne Shell Variables.
+* OPTERR:                                Bash Variables.
+* OPTIND:                                Bourne Shell Variables.
+* OSTYPE:                                Bash Variables.
+* output-meta:                           Readline Init File Syntax.
+* page-completions:                      Readline Init File Syntax.
+* PATH:                                  Bourne Shell Variables.
+* PIPESTATUS:                            Bash Variables.
+* POSIXLY_CORRECT:                       Bash Variables.
+* PPID:                                  Bash Variables.
+* PROMPT_COMMAND:                        Bash Variables.
+* PS1:                                   Bourne Shell Variables.
+* PS2:                                   Bourne Shell Variables.
+* PS3:                                   Bash Variables.
+* PS4:                                   Bash Variables.
+* PWD:                                   Bash Variables.
+* RANDOM:                                Bash Variables.
+* REPLY:                                 Bash Variables.
+* SECONDS:                               Bash Variables.
+* SHELLOPTS:                             Bash Variables.
+* SHLVL:                                 Bash Variables.
+* show-all-if-ambiguous:                 Readline Init File Syntax.
+* show-all-if-unmodified:                Readline Init File Syntax.
+* TEXTDOMAIN:                            Locale Translation.
+* TEXTDOMAINDIR:                         Locale Translation.
+* TIMEFORMAT:                            Bash Variables.
+* TMOUT:                                 Bash Variables.
+* UID:                                   Bash Variables.
+* visible-stats:                         Readline Init File Syntax.
+
+\1f
+File: bash.info,  Node: Function Index,  Next: Concept Index,  Prev: Variable Index,  Up: Top
+
+Function Index
+**************
+
+* Menu:
+
+* abort (C-g):                           Miscellaneous Commands.
+* accept-line (Newline or Return):       Commands For History.
+* backward-char (C-b):                   Commands For Moving.
+* backward-delete-char (Rubout):         Commands For Text.
+* backward-kill-line (C-x Rubout):       Commands For Killing.
+* backward-kill-word (M-<DEL>):          Commands For Killing.
+* backward-word (M-b):                   Commands For Moving.
+* beginning-of-history (M-<):            Commands For History.
+* beginning-of-line (C-a):               Commands For Moving.
+* call-last-kbd-macro (C-x e):           Keyboard Macros.
+* capitalize-word (M-c):                 Commands For Text.
+* character-search (C-]):                Miscellaneous Commands.
+* character-search-backward (M-C-]):     Miscellaneous Commands.
+* clear-screen (C-l):                    Commands For Moving.
+* complete (<TAB>):                      Commands For Completion.
+* copy-backward-word ():                 Commands For Killing.
+* copy-forward-word ():                  Commands For Killing.
+* copy-region-as-kill ():                Commands For Killing.
+* delete-char (C-d):                     Commands For Text.
+* delete-char-or-list ():                Commands For Completion.
+* delete-horizontal-space ():            Commands For Killing.
+* digit-argument (M-0, M-1, ... M--):    Numeric Arguments.
+* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
+* downcase-word (M-l):                   Commands For Text.
+* dump-functions ():                     Miscellaneous Commands.
+* dump-macros ():                        Miscellaneous Commands.
+* dump-variables ():                     Miscellaneous Commands.
+* end-kbd-macro (C-x )):                 Keyboard Macros.
+* end-of-history (M->):                  Commands For History.
+* end-of-line (C-e):                     Commands For Moving.
+* exchange-point-and-mark (C-x C-x):     Miscellaneous Commands.
+* forward-backward-delete-char ():       Commands For Text.
+* forward-char (C-f):                    Commands For Moving.
+* forward-search-history (C-s):          Commands For History.
+* forward-word (M-f):                    Commands For Moving.
+* history-search-backward ():            Commands For History.
+* history-search-forward ():             Commands For History.
+* insert-comment (M-#):                  Miscellaneous Commands.
+* insert-completions (M-*):              Commands For Completion.
+* kill-line (C-k):                       Commands For Killing.
+* kill-region ():                        Commands For Killing.
+* kill-whole-line ():                    Commands For Killing.
+* kill-word (M-d):                       Commands For Killing.
+* menu-complete ():                      Commands For Completion.
+* next-history (C-n):                    Commands For History.
+* non-incremental-forward-search-history (M-n): Commands For History.
+* non-incremental-reverse-search-history (M-p): Commands For History.
+* overwrite-mode ():                     Commands For Text.
+* possible-completions (M-?):            Commands For Completion.
+* prefix-meta (<ESC>):                   Miscellaneous Commands.
+* previous-history (C-p):                Commands For History.
+* quoted-insert (C-q or C-v):            Commands For Text.
+* re-read-init-file (C-x C-r):           Miscellaneous Commands.
+* redraw-current-line ():                Commands For Moving.
+* reverse-search-history (C-r):          Commands For History.
+* revert-line (M-r):                     Miscellaneous Commands.
+* self-insert (a, b, A, 1, !, ...):      Commands For Text.
+* set-mark (C-@):                        Miscellaneous Commands.
+* start-kbd-macro (C-x ():               Keyboard Macros.
+* transpose-chars (C-t):                 Commands For Text.
+* transpose-words (M-t):                 Commands For Text.
+* undo (C-_ or C-x C-u):                 Miscellaneous Commands.
+* universal-argument ():                 Numeric Arguments.
+* unix-line-discard (C-u):               Commands For Killing.
+* unix-word-rubout (C-w):                Commands For Killing.
+* upcase-word (M-u):                     Commands For Text.
+* yank (C-y):                            Commands For Killing.
+* yank-last-arg (M-. or M-_):            Commands For History.
+* yank-nth-arg (M-C-y):                  Commands For History.
+* yank-pop (M-y):                        Commands For Killing.
+
+\1f
+File: bash.info,  Node: Concept Index,  Prev: Function Index,  Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* alias expansion:                       Aliases.
+* arithmetic evaluation:                 Shell Arithmetic.
+* arithmetic expansion:                  Arithmetic Expansion.
+* arithmetic, shell:                     Shell Arithmetic.
+* arrays:                                Arrays.
+* background:                            Job Control Basics.
+* Bash configuration:                    Basic Installation.
+* Bash installation:                     Basic Installation.
+* Bourne shell:                          Basic Shell Features.
+* brace expansion:                       Brace Expansion.
+* builtin:                               Definitions.
+* command editing:                       Readline Bare Essentials.
+* command execution:                     Command Search and Execution.
+* command expansion:                     Simple Command Expansion.
+* command history:                       Bash History Facilities.
+* command search:                        Command Search and Execution.
+* command substitution:                  Command Substitution.
+* command timing:                        Pipelines.
+* commands, conditional:                 Conditional Constructs.
+* commands, grouping:                    Command Grouping.
+* commands, lists:                       Lists.
+* commands, looping:                     Looping Constructs.
+* commands, pipelines:                   Pipelines.
+* commands, shell:                       Shell Commands.
+* commands, simple:                      Simple Commands.
+* comments, shell:                       Comments.
+* completion builtins:                   Programmable Completion Builtins.
+* configuration:                         Basic Installation.
+* control operator:                      Definitions.
+* directory stack:                       The Directory Stack.
+* editing command lines:                 Readline Bare Essentials.
+* environment:                           Environment.
+* evaluation, arithmetic:                Shell Arithmetic.
+* event designators:                     Event Designators.
+* execution environment:                 Command Execution Environment.
+* exit status <1>:                       Definitions.
+* exit status:                           Exit Status.
+* expansion:                             Shell Expansions.
+* expansion, arithmetic:                 Arithmetic Expansion.
+* expansion, brace:                      Brace Expansion.
+* expansion, filename:                   Filename Expansion.
+* expansion, parameter:                  Shell Parameter Expansion.
+* expansion, pathname:                   Filename Expansion.
+* expansion, tilde:                      Tilde Expansion.
+* expressions, arithmetic:               Shell Arithmetic.
+* expressions, conditional:              Bash Conditional Expressions.
+* FDL, GNU Free Documentation License:   GNU Free Documentation License.
+* field:                                 Definitions.
+* filename:                              Definitions.
+* filename expansion:                    Filename Expansion.
+* foreground:                            Job Control Basics.
+* functions, shell:                      Shell Functions.
+* history builtins:                      Bash History Builtins.
+* history events:                        Event Designators.
+* history expansion:                     History Interaction.
+* history list:                          Bash History Facilities.
+* History, how to use:                   Programmable Completion Builtins.
+* identifier:                            Definitions.
+* initialization file, readline:         Readline Init File.
+* installation:                          Basic Installation.
+* interaction, readline:                 Readline Interaction.
+* interactive shell <1>:                 Interactive Shells.
+* interactive shell:                     Invoking Bash.
+* internationalization:                  Locale Translation.
+* job:                                   Definitions.
+* job control <1>:                       Job Control Basics.
+* job control:                           Definitions.
+* kill ring:                             Readline Killing Commands.
+* killing text:                          Readline Killing Commands.
+* localization:                          Locale Translation.
+* login shell:                           Invoking Bash.
+* matching, pattern:                     Pattern Matching.
+* metacharacter:                         Definitions.
+* name:                                  Definitions.
+* native languages:                      Locale Translation.
+* notation, readline:                    Readline Bare Essentials.
+* operator, shell:                       Definitions.
+* parameter expansion:                   Shell Parameter Expansion.
+* parameters:                            Shell Parameters.
+* parameters, positional:                Positional Parameters.
+* parameters, special:                   Special Parameters.
+* pathname expansion:                    Filename Expansion.
+* pattern matching:                      Pattern Matching.
+* pipeline:                              Pipelines.
+* POSIX:                                 Definitions.
+* POSIX Mode:                            Bash POSIX Mode.
+* process group:                         Definitions.
+* process group ID:                      Definitions.
+* process substitution:                  Process Substitution.
+* programmable completion:               Programmable Completion.
+* prompting:                             Printing a Prompt.
+* quoting:                               Quoting.
+* quoting, ANSI:                         ANSI-C Quoting.
+* Readline, how to use:                  Job Control Variables.
+* redirection:                           Redirections.
+* reserved word:                         Definitions.
+* restricted shell:                      The Restricted Shell.
+* return status:                         Definitions.
+* shell arithmetic:                      Shell Arithmetic.
+* shell function:                        Shell Functions.
+* shell script:                          Shell Scripts.
+* shell variable:                        Shell Parameters.
+* shell, interactive:                    Interactive Shells.
+* signal:                                Definitions.
+* signal handling:                       Signals.
+* special builtin <1>:                   Definitions.
+* special builtin:                       Special Builtins.
+* startup files:                         Bash Startup Files.
+* suspending jobs:                       Job Control Basics.
+* tilde expansion:                       Tilde Expansion.
+* token:                                 Definitions.
+* translation, native languages:         Locale Translation.
+* variable, shell:                       Shell Parameters.
+* variables, readline:                   Readline Init File Syntax.
+* word:                                  Definitions.
+* word splitting:                        Word Splitting.
+* yanking text:                          Readline Killing Commands.
+
+
+\1f
+Tag Table:
+Node: Top\7f1363
+Node: Introduction\7f3512
+Node: What is Bash?\7f3737
+Node: What is a shell?\7f4838
+Node: Definitions\7f7072
+Node: Basic Shell Features\7f9812
+Node: Shell Syntax\7f11041
+Node: Shell Operation\7f12065
+Node: Quoting\7f13350
+Node: Escape Character\7f14612
+Node: Single Quotes\7f15084
+Node: Double Quotes\7f15419
+Node: ANSI-C Quoting\7f16432
+Node: Locale Translation\7f17375
+Node: Comments\7f18258
+Node: Shell Commands\7f18863
+Node: Simple Commands\7f19744
+Node: Pipelines\7f20365
+Node: Lists\7f21901
+Node: Looping Constructs\7f23524
+Node: Conditional Constructs\7f25969
+Node: Command Grouping\7f31985
+Node: Shell Functions\7f33362
+Node: Shell Parameters\7f37152
+Node: Positional Parameters\7f38714
+Node: Special Parameters\7f39605
+Node: Shell Expansions\7f42263
+Node: Brace Expansion\7f44183
+Node: Tilde Expansion\7f46499
+Node: Shell Parameter Expansion\7f48831
+Node: Command Substitution\7f56085
+Node: Arithmetic Expansion\7f57407
+Node: Process Substitution\7f58248
+Node: Word Splitting\7f59285
+Node: Filename Expansion\7f60737
+Node: Pattern Matching\7f62722
+Node: Quote Removal\7f66043
+Node: Redirections\7f66329
+Node: Executing Commands\7f73804
+Node: Simple Command Expansion\7f74471
+Node: Command Search and Execution\7f76392
+Node: Command Execution Environment\7f78389
+Node: Environment\7f81115
+Node: Exit Status\7f82766
+Node: Signals\7f83961
+Node: Shell Scripts\7f85872
+Node: Shell Builtin Commands\7f88383
+Node: Bourne Shell Builtins\7f89813
+Node: Bash Builtins\7f106585
+Node: The Set Builtin\7f134397
+Node: Special Builtins\7f142322
+Node: Shell Variables\7f143294
+Node: Bourne Shell Variables\7f143730
+Node: Bash Variables\7f145707
+Node: Bash Features\7f164458
+Node: Invoking Bash\7f165340
+Node: Bash Startup Files\7f171151
+Node: Interactive Shells\7f176021
+Node: What is an Interactive Shell?\7f176423
+Node: Is this Shell Interactive?\7f177058
+Node: Interactive Shell Behavior\7f177864
+Node: Bash Conditional Expressions\7f181131
+Node: Shell Arithmetic\7f184551
+Node: Aliases\7f187291
+Node: Arrays\7f189794
+Node: The Directory Stack\7f192814
+Node: Directory Stack Builtins\7f193520
+Node: Printing a Prompt\7f196399
+Node: The Restricted Shell\7f199025
+Node: Bash POSIX Mode\7f200850
+Node: Job Control\7f207047
+Node: Job Control Basics\7f207513
+Node: Job Control Builtins\7f211793
+Node: Job Control Variables\7f216089
+Node: Command Line Editing\7f217239
+Node: Introduction and Notation\7f218237
+Node: Readline Interaction\7f219854
+Node: Readline Bare Essentials\7f221040
+Node: Readline Movement Commands\7f222820
+Node: Readline Killing Commands\7f223776
+Node: Readline Arguments\7f225685
+Node: Searching\7f226720
+Node: Readline Init File\7f228897
+Node: Readline Init File Syntax\7f229951
+Node: Conditional Init Constructs\7f241592
+Node: Sample Init File\7f244116
+Node: Bindable Readline Commands\7f247299
+Node: Commands For Moving\7f248498
+Node: Commands For History\7f249347
+Node: Commands For Text\7f252236
+Node: Commands For Killing\7f254897
+Node: Numeric Arguments\7f256847
+Node: Commands For Completion\7f257974
+Node: Keyboard Macros\7f261555
+Node: Miscellaneous Commands\7f262114
+Node: Readline vi Mode\7f267413
+Node: Programmable Completion\7f268322
+Node: Programmable Completion Builtins\7f274129
+Node: Using History Interactively\7f281491
+Node: Bash History Facilities\7f282170
+Node: Bash History Builtins\7f284730
+Node: History Interaction\7f288298
+Node: Event Designators\7f290849
+Node: Word Designators\7f291853
+Node: Modifiers\7f293483
+Node: Installing Bash\7f294880
+Node: Basic Installation\7f296022
+Node: Compilers and Options\7f298707
+Node: Compiling For Multiple Architectures\7f299441
+Node: Installation Names\7f301098
+Node: Specifying the System Type\7f301909
+Node: Sharing Defaults\7f302618
+Node: Operation Controls\7f303283
+Node: Optional Features\7f304234
+Node: Reporting Bugs\7f312311
+Node: Major Differences From The Bourne Shell\7f313486
+Node: Copying This Manual\7f328729
+Node: GNU Free Documentation License\7f328983
+Node: Builtin Index\7f351376
+Node: Reserved Word Index\7f355003
+Node: Variable Index\7f356479
+Node: Function Index\7f363358
+Node: Concept Index\7f367908
+\1f
+End Tag Table
diff --git a/doc/bash.pdf b/doc/bash.pdf
new file mode 100644 (file)
index 0000000..088c9d7
Binary files /dev/null and b/doc/bash.pdf differ
diff --git a/doc/bash.ps b/doc/bash.ps
new file mode 100644 (file)
index 0000000..29e3e87
--- /dev/null
@@ -0,0 +1,7271 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.18.1
+%%CreationDate: Thu Nov 13 09:47:38 2003
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%+ font Times-Italic
+%%+ font Courier
+%%+ font Symbol
+%%+ font Palatino-Roman
+%%+ font Palatino-Italic
+%%+ font Palatino-Bold
+%%DocumentSuppliedResources: procset grops 1.18 1
+%%Pages: 63
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.18 1
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/Fr{
+setrgbcolor fill
+}bind def
+/Fk{
+setcmykcolor fill
+}bind def
+/Fg{
+setgray fill
+}bind def
+/FL/fill load def
+/LW/setlinewidth load def
+/Cr/setrgbcolor load def
+/Ck/setcmykcolor load def
+/Cg/setgray load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Courier
+%%IncludeResource: font Symbol
+%%IncludeResource: font Palatino-Roman
+%%IncludeResource: font Palatino-Italic
+%%IncludeResource: font Palatino-Bold
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Palatino-Bold@0 ENC0/Palatino-Bold RE/Palatino-Italic@0 ENC0
+/Palatino-Italic RE/Palatino-Roman@0 ENC0/Palatino-Roman RE/Courier@0
+ENC0/Courier RE/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0
+/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
+%%EndProlog
+%%Page: 1 1
+%%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.95/Times-Bold@0 SF -.219(NA)72 84 S(ME).219 E F0
+(bash \255 GNU Bourne-Ag)108 96 Q(ain SHell)-.05 E F1(SYNOPSIS)72 112.8
+Q/F2 10/Times-Bold@0 SF(bash)108 124.8 Q F0([options] [\214le])2.5 E F1
+(COPYRIGHT)72 141.6 Q F0(Bash is Cop)108 153.6 Q
+(yright \251 1989-2003 by the Free Softw)-.1 E(are F)-.1 E
+(oundation, Inc.)-.15 E F1(DESCRIPTION)72 170.4 Q F2(Bash)108 182.4 Q F0
+.973(is an)3.474 F F2(sh)3.473 E F0 .973
+(-compatible command language interpreter that e)B -.15(xe)-.15 G .973
+(cutes commands read from the standard).15 F(input or from a \214le.)108
+194.4 Q F2(Bash)5 E F0(also incorporates useful features from the)2.5 E
+/F3 10/Times-Italic@0 SF -.4(Ko)2.5 G(rn).4 E F0(and)2.5 E F3(C)2.5 E F0
+(shells \()2.5 E F2(ksh)A F0(and)2.5 E F2(csh)2.5 E F0(\).)A F2(Bash)108
+211.2 Q F0 1.54(is intended to be a conformant implementation of the IE\
+EE POSIX Shell and T)4.04 F 1.54(ools speci\214cation)-.8 F(\(IEEE W)108
+223.2 Q(orking Group 1003.2\).)-.8 E F1(OPTIONS)72 240 Q F0 .52(In addi\
+tion to the single-character shell options documented in the descriptio\
+n of the)108 252 R F2(set)3.02 E F0 -.2(bu)3.02 G .52(iltin command,).2
+F F2(bash)108 264 Q F0(interprets the follo)2.5 E
+(wing options when it is in)-.25 E -.2(vo)-.4 G -.1(ke).2 G(d:).1 E F2
+<ad63>108 280.8 Q F3(string)4.166 E F0 .796(If the)12.354 F F2<ad63>
+3.296 E F0 .796(option is present, then commands are read from)3.296 F
+F3(string)3.296 E F0 5.796(.I).22 G 3.297(ft)-5.796 G .797(here are ar)
+-3.297 F .797(guments after)-.18 F(the)158 292.8 Q F3(string)2.5 E F0
+2.5(,t).22 G(he)-2.5 E 2.5(ya)-.15 G
+(re assigned to the positional parameters, starting with)-2.5 E F2($0)
+2.5 E F0(.)A F2<ad69>108 304.8 Q F0(If the)41.52 E F2<ad69>2.5 E F0
+(option is present, the shell is)2.5 E F3(inter)2.5 E(active)-.15 E F0
+(.).18 E F2<ad6c>108 316.8 Q F0(Mak)41.52 E(e)-.1 E F2(bash)2.5 E F0
+(act as if it had been in)2.5 E -.2(vo)-.4 G -.1(ke).2 G 2.5(da).1 G 2.5
+(sal)-2.5 G(ogin shell \(see)-2.5 E/F4 9/Times-Bold@0 SF(INV)2.5 E(OCA)
+-.405 E(TION)-.855 E F0(belo)2.25 E(w\).)-.25 E F2<ad72>108 328.8 Q F0
+(If the)39.86 E F2<ad72>2.5 E F0(option is present, the shell becomes)
+2.5 E F3 -.37(re)2.5 G(stricted).37 E F0(\(see)3.27 E F4
+(RESTRICTED SHELL)2.5 E F0(belo)2.25 E(w\).)-.25 E F2<ad73>108 340.8 Q
+F0 .602(If the)40.41 F F2<ad73>3.102 E F0 .602
+(option is present, or if no ar)3.102 F .602
+(guments remain after option processing, then commands)-.18 F .616
+(are read from the standard input.)158 352.8 R .617(This option allo)
+5.617 F .617(ws the positional parameters to be set when)-.25 F(in)158
+364.8 Q -.2(vo)-.4 G(king an interacti).2 E .3 -.15(ve s)-.25 H(hell.)
+.15 E F2<ad44>108 376.8 Q F0 3.358(Al)37.08 G .858
+(ist of all double-quoted strings preceded by)-3.358 F F2($)3.358 E F0
+.857(is printed on the standard ouput.)3.357 F .857(These are)5.857 F
+.458(the strings that are subject to language translation when the curr\
+ent locale is not)158 388.8 R F2(C)2.958 E F0(or)2.959 E F2(POSIX)2.959
+E F0(.)A(This implies the)158 400.8 Q F2<ad6e>2.5 E F0
+(option; no commands will be e)2.5 E -.15(xe)-.15 G(cuted.).15 E F2
+([\255+]O [)108 412.8 Q F3(shopt_option)A F2(])A F3(shopt_option)158
+424.8 Q F0 1.097(is one of the shell options accepted by the)3.597 F F2
+(shopt)3.597 E F0 -.2(bu)3.597 G 1.097(iltin \(see).2 F F4 1.096
+(SHELL B)3.596 F(UIL)-.09 E(TIN)-.828 E(COMMANDS)158 436.8 Q F0(belo)
+3.002 E 3.252(w\). If)-.25 F F3(shopt_option)3.253 E F0 .753
+(is present,)3.253 F F2<ad4f>3.253 E F0 .753(sets the v)3.253 F .753
+(alue of that option;)-.25 F F2(+O)3.253 E F0(unsets)3.253 E 2.625
+(it. If)158 448.8 R F3(shopt_option)2.625 E F0 .125
+(is not supplied, the names and v)2.625 F .124
+(alues of the shell options accepted by)-.25 F F2(shopt)2.624 E F0 .505
+(are printed on the standard output.)158 460.8 R .505(If the in)5.505 F
+-.2(vo)-.4 G .505(cation option is).2 F F2(+O)3.005 E F0 3.005(,t)C .506
+(he output is displayed in a)-3.005 F
+(format that may be reused as input.)158 472.8 Q F2<adad>108 484.8 Q F0
+(A)38.6 E F2<adad>3.364 E F0 .864
+(signals the end of options and disables further option processing.)
+3.364 F(An)5.863 E 3.363(ya)-.15 G -.18(rg)-3.363 G .863(uments after)
+.18 F(the)158 496.8 Q F2<adad>2.5 E F0
+(are treated as \214lenames and ar)2.5 E 2.5(guments. An)-.18 F(ar)2.5 E
+(gument of)-.18 E F2<ad>2.5 E F0(is equi)2.5 E -.25(va)-.25 G(lent to)
+.25 E F2<adad>2.5 E F0(.)A F2(Bash)108 513.6 Q F0 .303
+(also interprets a number of multi-character options.)2.803 F .304
+(These options must appear on the command line)5.303 F
+(before the single-character options to be recognized.)108 525.6 Q F2
+<adad646562>108 542.4 Q(ugger)-.2 E F0 .475(Arrange for the deb)144
+554.4 R .475(ugger pro\214le to be e)-.2 F -.15(xe)-.15 G .475
+(cuted before the shell starts.).15 F -.45(Tu)5.474 G .474(rns on e).45
+F .474(xtended deb)-.15 F(ug-)-.2 E .452
+(ging mode \(see the description of the)144 566.4 R F2(extdeb)2.952 E
+(ug)-.2 E F0 .452(option to the)2.952 F F2(shopt)2.952 E F0 -.2(bu)2.952
+G .452(iltin belo).2 F .452(w\) and shell func-)-.25 F
+(tion tracing \(see the description of the)144 578.4 Q F2
+(\255o functrace)2.5 E F0(option to the)2.5 E F2(set)2.5 E F0 -.2(bu)2.5
+G(iltin belo).2 E(w\).)-.25 E F2(\255\255dump\255po\255strings)108 590.4
+Q F0(Equi)144 602.4 Q -.25(va)-.25 G(lent to).25 E F2<ad44>2.5 E F0 2.5
+(,b)C(ut the output is in the GNU)-2.7 E F3 -.1(ge)2.5 G(tte).1 E(xt)-.2
+E F2(po)2.5 E F0(\(portable object\) \214le format.)2.5 E F2
+(\255\255dump\255strings)108 614.4 Q F0(Equi)144 626.4 Q -.25(va)-.25 G
+(lent to).25 E F2<ad44>2.5 E F0(.)A F2(\255\255help)108 638.4 Q F0
+(Display a usage message on standard output and e)6.26 E
+(xit successfully)-.15 E(.)-.65 E F2<adad696e6974ad8c6c65>108 650.4 Q F3
+(\214le)2.5 E F2<adad72>108 662.4 Q(c\214le)-.18 E F3(\214le)2.5 E F0
+(Ex)144 674.4 Q 1.599(ecute commands from)-.15 F F3(\214le)6.009 E F0
+1.598(instead of the standard personal initialization \214le)4.279 F F3
+(~/.bashr)3.598 E(c)-.37 E F0 1.598(if the)4.408 F(shell is interacti)
+144 686.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 F2(\255\255login)108 703.2 Q F0
+(Equi)144 715.2 Q -.25(va)-.25 G(lent to).25 E F2<ad6c>2.5 E F0(.)A
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 202.965(31)-2.5 G
+0 Cg EP
+%%Page: 2 2
+%%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(\255\255noediting)108 84 Q F0
+(Do not use the GNU)144 96 Q F1 -.18(re)2.5 G(adline).18 E F0
+(library to read command lines when the shell is interacti)2.5 E -.15
+(ve)-.25 G(.).15 E F1(\255\255nopr)108 112.8 Q(o\214le)-.18 E F0 .017
+(Do not read either the system-wide startup \214le)144 124.8 R/F2 10
+/Times-Italic@0 SF(/etc/pr)4.183 E(o\214le)-.45 E F0 .017(or an)4.183 F
+2.517(yo)-.15 G 2.517(ft)-2.517 G .018
+(he personal initialization \214les)-2.517 F F2(~/.bash_pr)144 136.8 Q
+(o\214le)-.45 E F0(,).18 E F2(~/.bash_lo)2.698 E(gin)-.1 E F0 2.698(,o)
+.24 G(r)-2.698 E F2(~/.pr)2.698 E(o\214le)-.45 E F0 5.198(.B).18 G 2.698
+(yd)-5.198 G(ef)-2.698 E(ault,)-.1 E F1(bash)2.698 E F0 .198
+(reads these \214les when it is in)2.698 F -.2(vo)-.4 G -.1(ke).2 G
+2.697(da).1 G(s)-2.697 E 2.5(al)144 148.8 S(ogin shell \(see)-2.5 E/F3 9
+/Times-Bold@0 SF(INV)2.5 E(OCA)-.405 E(TION)-.855 E F0(belo)2.25 E(w\).)
+-.25 E F1<adad6e6f72>108 165.6 Q(c)-.18 E F0 1.228(Do not read and e)
+5.34 F -.15(xe)-.15 G 1.228(cute the personal initialization \214le).15
+F F2(~/.bashr)3.228 E(c)-.37 E F0 1.228(if the shell is interacti)4.038
+F -.15(ve)-.25 G 6.228(.T).15 G(his)-6.228 E(option is on by def)144
+177.6 Q(ault if the shell is in)-.1 E -.2(vo)-.4 G -.1(ke).2 G 2.5(da).1
+G(s)-2.5 E F1(sh)2.5 E F0(.)A F1(\255\255posix)108 194.4 Q F0 .374
+(Change the beha)144 206.4 R .374(vior of)-.2 F F1(bash)2.874 E F0 .374
+(where the def)2.874 F .374(ault operation dif)-.1 F .373
+(fers from the POSIX 1003.2 standard)-.25 F(to match the standard \()144
+218.4 Q F2(posix mode)A F0(\).)A F1<adad72>108 235.2 Q(estricted)-.18 E
+F0(The shell becomes restricted \(see)144 247.2 Q F3(RESTRICTED SHELL)
+2.5 E F0(belo)2.25 E(w\).)-.25 E F1<adad76>108 264 Q(erbose)-.1 E F0
+(Equi)144 276 Q -.25(va)-.25 G(lent to).25 E F1<ad76>5 E F0(.)A F1
+<adad76>108 292.8 Q(ersion)-.1 E F0(Sho)144 304.8 Q 2.5(wv)-.25 G
+(ersion information for this instance of)-2.65 E F1(bash)2.5 E F0
+(on the standard output and e)2.5 E(xit successfully)-.15 E(.)-.65 E/F4
+10.95/Times-Bold@0 SF(ARGUMENTS)72 321.6 Q F0 .016(If ar)108 333.6 R
+.016(guments remain after option processing, and neither the)-.18 F F1
+<ad63>2.516 E F0 .016(nor the)2.516 F F1<ad73>2.516 E F0 .016
+(option has been supplied, the \214rst)2.516 F(ar)108 345.6 Q .041(gume\
+nt is assumed to be the name of a \214le containing shell commands.)-.18
+F(If)5.041 E F1(bash)2.541 E F0 .041(is in)2.541 F -.2(vo)-.4 G -.1(ke)
+.2 G 2.541(di).1 G 2.541(nt)-2.541 G .041(his f)-2.541 F(ashion,)-.1 E
+F1($0)108 357.6 Q F0 .936(is set to the name of the \214le, and the pos\
+itional parameters are set to the remaining ar)3.435 F(guments.)-.18 E
+F1(Bash)5.936 E F0 .234(reads and e)108 369.6 R -.15(xe)-.15 G .234
+(cutes commands from this \214le, then e).15 F(xits.)-.15 E F1(Bash)
+5.234 E F0 1.334 -.55('s e)D .234(xit status is the e).4 F .233
+(xit status of the last com-)-.15 F .348(mand e)108 381.6 R -.15(xe)-.15
+G .348(cuted in the script.).15 F .348(If no commands are e)5.348 F -.15
+(xe)-.15 G .348(cuted, the e).15 F .349(xit status is 0.)-.15 F .349
+(An attempt is \214rst made to)5.349 F .254
+(open the \214le in the current directory)108 393.6 R 2.754(,a)-.65 G
+.253
+(nd, if no \214le is found, then the shell searches the directories in)
+-2.754 F F3 -.666(PA)2.753 G(TH)-.189 E F0(for the script.)108 405.6 Q
+F4(INV)72 422.4 Q(OCA)-.493 E(TION)-1.04 E F0(A)108 434.4 Q F2(lo)2.5 E
+(gin shell)-.1 E F0(is one whose \214rst character of ar)2.5 E
+(gument zero is a)-.18 E F1<ad>2.5 E F0 2.5(,o)C 2.5(ro)-2.5 G
+(ne started with the)-2.5 E F1(\255\255login)2.5 E F0(option.)2.5 E(An)
+108 451.2 Q F2(inter)2.814 E(active)-.15 E F0 .314
+(shell is one started without non-option ar)2.814 F .315
+(guments and without the)-.18 F F1<ad63>2.815 E F0 .315
+(option whose standard)2.815 F 1.14
+(input and output are both connected to terminals \(as determined by)108
+463.2 R F2(isatty)3.639 E F0 1.139(\(3\)\), or one started with the).32
+F F1<ad69>3.639 E F0(option.)108 475.2 Q F3(PS1)5.289 E F0 .289
+(is set and)2.539 F F1<24ad>2.789 E F0(includes)2.789 E F1(i)2.789 E F0
+(if)2.789 E F1(bash)2.789 E F0 .289(is interacti)2.789 F -.15(ve)-.25 G
+2.789(,a).15 G(llo)-2.789 E .29
+(wing a shell script or a startup \214le to test this)-.25 F(state.)108
+487.2 Q .033(The follo)108 504 R .033(wing paragraphs describe ho)-.25 F
+(w)-.25 E F1(bash)2.532 E F0 -.15(exe)2.532 G .032
+(cutes its startup \214les.).15 F .032(If an)5.032 F 2.532(yo)-.15 G
+2.532(ft)-2.532 G .032(he \214les e)-2.532 F .032(xist b)-.15 F .032
+(ut cannot be)-.2 F(read,)108 516 Q F1(bash)3.085 E F0 .585
+(reports an error)3.085 F 5.585(.T)-.55 G .585(ildes are e)-5.935 F .586
+(xpanded in \214le names as described belo)-.15 F 3.086(wu)-.25 G(nder)
+-3.086 E F1 -.18(Ti)3.086 G .586(lde Expansion).18 F F0(in the)108 528 Q
+F3(EXP)2.5 E(ANSION)-.666 E F0(section.)2.25 E(When)108 544.8 Q F1(bash)
+2.896 E F0 .396(is in)2.896 F -.2(vo)-.4 G -.1(ke).2 G 2.896(da).1 G
+2.896(sa)-2.896 G 2.896(ni)-2.896 G(nteracti)-2.896 E .696 -.15(ve l)
+-.25 H .396(ogin shell, or as a non-interacti).15 F .695 -.15(ve s)-.25
+H .395(hell with the).15 F F1(\255\255login)2.895 E F0 .395(option, it)
+2.895 F 1.333(\214rst reads and e)108 556.8 R -.15(xe)-.15 G 1.333
+(cutes commands from the \214le).15 F F2(/etc/pr)3.833 E(o\214le)-.45 E
+F0 3.834(,i)C 3.834(ft)-3.834 G 1.334(hat \214le e)-3.834 F 3.834
+(xists. After)-.15 F 1.334(reading that \214le, it)3.834 F .249
+(looks for)108 568.8 R F2(~/.bash_pr)2.749 E(o\214le)-.45 E F0(,)A F2
+(~/.bash_lo)2.749 E(gin)-.1 E F0 2.749(,a)C(nd)-2.749 E F2(~/.pr)2.749 E
+(o\214le)-.45 E F0 2.749(,i)C 2.749(nt)-2.749 G .249(hat order)-2.749 F
+2.748(,a)-.4 G .248(nd reads and e)-2.748 F -.15(xe)-.15 G .248
+(cutes commands from).15 F .796(the \214rst one that e)108 580.8 R .796
+(xists and is readable.)-.15 F(The)5.796 E F1(\255\255nopr)3.296 E
+(o\214le)-.18 E F0 .797(option may be used when the shell is started to)
+3.296 F(inhibit this beha)108 592.8 Q(vior)-.2 E(.)-.55 E
+(When a login shell e)108 609.6 Q(xits,)-.15 E F1(bash)2.5 E F0
+(reads and e)2.5 E -.15(xe)-.15 G(cutes commands from the \214le).15 E
+F2(~/.bash_lo)2.5 E(gout)-.1 E F0 2.5(,i)C 2.5(fi)-2.5 G 2.5(te)-2.5 G
+(xists.)-2.65 E 1.698(When an interacti)108 626.4 R 1.998 -.15(ve s)-.25
+H 1.698(hell that is not a login shell is started,).15 F F1(bash)4.197 E
+F0 1.697(reads and e)4.197 F -.15(xe)-.15 G 1.697(cutes commands from)
+.15 F F2(~/.bashr)108 638.4 Q(c)-.37 E F0 2.535(,i)C 2.535(ft)-2.535 G
+.035(hat \214le e)-2.535 F 2.535(xists. This)-.15 F .036
+(may be inhibited by using the)2.535 F F1<adad6e6f72>2.536 E(c)-.18 E F0
+2.536(option. The)2.536 F F1<adad72>2.536 E(c\214le)-.18 E F2(\214le)
+2.536 E F0 .036(option will)2.536 F(force)108 650.4 Q F1(bash)2.5 E F0
+(to read and e)2.5 E -.15(xe)-.15 G(cute commands from).15 E F2(\214le)
+2.5 E F0(instead of)2.5 E F2(~/.bashr)2.5 E(c)-.37 E F0(.)A(When)108
+667.2 Q F1(bash)5.306 E F0 2.806(is started non-interacti)5.306 F -.15
+(ve)-.25 G(ly).15 E 5.306(,t)-.65 G 5.306(or)-5.306 G 2.806
+(un a shell script, for e)-5.306 F 2.805(xample, it looks for the v)-.15
+F(ariable)-.25 E F3 -.27(BA)108 679.2 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(name of a \214le to read and e)108 691.2 Q -.15
+(xe)-.15 G(cute.).15 E F1(Bash)5 E F0(beha)2.5 E -.15(ve)-.2 G 2.5(sa)
+.15 G 2.5(si)-2.5 G 2.5(ft)-2.5 G(he follo)-2.5 E(wing command were e)
+-.25 E -.15(xe)-.15 G(cuted:).15 E/F5 10/Courier@0 SF
+(if [ \255n "$BASH_ENV" ]; then . "$BASH_ENV"; fi)144 709.2 Q F0 -.2(bu)
+108 727.2 S 2.5(tt).2 G(he v)-2.5 E(alue of the)-.25 E F3 -.666(PA)2.5 G
+(TH)-.189 E F0 -.25(va)2.25 G
+(riable is not used to search for the \214le name.).25 E(GNU Bash-3.0)72
+768 Q(2003 No)147.975 E 2.5(v1)-.15 G 202.965(32)-2.5 G 0 Cg EP
+%%Page: 3 3
+%%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(If)108 84 Q/F1 10/Times-Bold@0 SF(bash)3.417 E F0 .917(is in)
+3.417 F -.2(vo)-.4 G -.1(ke).2 G 3.417(dw).1 G .917(ith the name)-3.417
+F F1(sh)3.417 E F0 3.417(,i)C 3.417(tt)-3.417 G .917
+(ries to mimic the startup beha)-3.417 F .917(vior of historical v)-.2 F
+.917(ersions of)-.15 F F1(sh)3.417 E F0(as)3.417 E .145
+(closely as possible, while conforming to the POSIX standard as well.)
+108 96 R .145(When in)5.145 F -.2(vo)-.4 G -.1(ke).2 G 2.645(da).1 G
+2.645(sa)-2.645 G 2.645(ni)-2.645 G(nteracti)-2.645 E .445 -.15(ve l)
+-.25 H(ogin).15 E 1.264(shell, or a non-interacti)108 108 R 1.564 -.15
+(ve s)-.25 H 1.264(hell with the).15 F F1(\255\255login)3.764 E F0 1.264
+(option, it \214rst attempts to read and e)3.764 F -.15(xe)-.15 G 1.263
+(cute commands).15 F(from)108 120 Q/F2 10/Times-Italic@0 SF(/etc/pr)
+4.142 E(o\214le)-.45 E F0(and)3.172 E F2(~/.pr)2.992 E(o\214le)-.45 E F0
+2.992(,i).18 G 2.992(nt)-2.992 G .492(hat order)-2.992 F 5.492(.T)-.55 G
+(he)-5.492 E F1(\255\255nopr)2.992 E(o\214le)-.18 E F0 .493
+(option may be used to inhibit this beha)2.993 F(vior)-.2 E(.)-.55 E
+.418(When in)108 132 R -.2(vo)-.4 G -.1(ke).2 G 2.918(da).1 G 2.918(sa)
+-2.918 G 2.918(ni)-2.918 G(nteracti)-2.918 E .718 -.15(ve s)-.25 H .418
+(hell with the name).15 F F1(sh)2.918 E F0(,)A F1(bash)2.918 E F0 .418
+(looks for the v)2.918 F(ariable)-.25 E/F3 9/Times-Bold@0 SF(ENV)2.918 E
+/F4 9/Times-Roman@0 SF(,)A F0 -.15(ex)2.667 G .417(pands its v).15 F
+(alue)-.25 E .171(if it is de\214ned, and uses the e)108 144 R .171
+(xpanded v)-.15 F .171(alue as the name of a \214le to read and e)-.25 F
+-.15(xe)-.15 G 2.671(cute. Since).15 F 2.671(as)2.671 G .171(hell in)
+-2.671 F -.2(vo)-.4 G -.1(ke).2 G(d).1 E(as)108 156 Q F1(sh)3.081 E F0
+.581(does not attempt to read and e)3.081 F -.15(xe)-.15 G .581
+(cute commands from an).15 F 3.08(yo)-.15 G .58
+(ther startup \214les, the)-3.08 F F1<adad72>3.08 E(c\214le)-.18 E F0
+.58(option has)3.08 F .182(no ef)108 168 R 2.682(fect. A)-.25 F
+(non-interacti)2.682 E .482 -.15(ve s)-.25 H .182(hell in).15 F -.2(vo)
+-.4 G -.1(ke).2 G 2.682(dw).1 G .182(ith the name)-2.682 F F1(sh)2.682 E
+F0 .182(does not attempt to read an)2.682 F 2.683(yo)-.15 G .183
+(ther startup \214les.)-2.683 F(When in)108 180 Q -.2(vo)-.4 G -.1(ke).2
+G 2.5(da).1 G(s)-2.5 E F1(sh)2.5 E F0(,)A F1(bash)2.5 E F0(enters)2.5 E
+F2(posix)3.75 E F0(mode after the startup \214les are read.)3.03 E(When)
+108 196.8 Q F1(bash)2.727 E F0 .226(is started in)2.727 F F2(posix)3.976
+E F0 .226(mode, as with the)3.256 F F1(\255\255posix)2.726 E F0 .226
+(command line option, it follo)2.726 F .226(ws the POSIX stan-)-.25 F
+.341(dard for startup \214les.)108 208.8 R .341(In this mode, interacti)
+5.341 F .641 -.15(ve s)-.25 H .341(hells e).15 F .341(xpand the)-.15 F
+F3(ENV)2.841 E F0 -.25(va)2.591 G .342(riable and commands are read and)
+.25 F -.15(exe)108 220.8 S(cuted from the \214le whose name is the e).15
+E(xpanded v)-.15 E 2.5(alue. No)-.25 F(other startup \214les are read.)
+2.5 E F1(Bash)108 237.6 Q F0 .577(attempts to determine when it is bein\
+g run by the remote shell daemon, usually)3.077 F F2 -.1(rs)3.076 G(hd)
+.1 E F0 5.576(.I)C(f)-5.576 E F1(bash)3.076 E F0(deter)3.076 E(-)-.2 E
+.301(mines it is being run by)108 249.6 R F2 -.1(rs)2.801 G(hd).1 E F0
+2.801(,i)C 2.801(tr)-2.801 G .301(eads and e)-2.801 F -.15(xe)-.15 G
+.301(cutes commands from).15 F F2(~/.bashr)2.801 E(c)-.37 E F0 2.801(,i)
+C 2.801(ft)-2.801 G .301(hat \214le e)-2.801 F .301(xists and is read-)
+-.15 F 2.97(able. It)108 261.6 R .47(will not do this if in)2.97 F -.2
+(vo)-.4 G -.1(ke).2 G 2.97(da).1 G(s)-2.97 E F1(sh)2.97 E F0 5.47(.T)C
+(he)-5.47 E F1<adad6e6f72>2.97 E(c)-.18 E F0 .47
+(option may be used to inhibit this beha)2.97 F(vior)-.2 E 2.97(,a)-.4 G
+.47(nd the)-2.97 F F1<adad72>108 273.6 Q(c\214le)-.18 E F0 .886
+(option may be used to force another \214le to be read, b)3.386 F(ut)-.2
+E F2 -.1(rs)3.386 G(hd).1 E F0 .887(does not generally in)3.387 F -.2
+(vo)-.4 G 1.087 -.1(ke t).2 H .887(he shell).1 F
+(with those options or allo)108 285.6 Q 2.5(wt)-.25 G
+(hem to be speci\214ed.)-2.5 E 1.208
+(If the shell is started with the ef)108 302.4 R(fecti)-.25 E 1.508 -.15
+(ve u)-.25 H 1.207
+(ser \(group\) id not equal to the real user \(group\) id, and the).15 F
+F1<ad70>3.707 E F0 .536(option is not supplied, no startup \214les are \
+read, shell functions are not inherited from the en)108 314.4 R .536
+(vironment, the)-.4 F F3(SHELLOPTS)108 326.4 Q F0 -.25(va)2.46 G .21
+(riable, if it appears in the en).25 F .21
+(vironment, is ignored, and the ef)-.4 F(fecti)-.25 E .51 -.15(ve u)-.25
+H .21(ser id is set to the real).15 F .261(user id.)108 338.4 R .261
+(If the)5.261 F F1<ad70>2.761 E F0 .261(option is supplied at in)2.761 F
+-.2(vo)-.4 G .261(cation, the startup beha).2 F .261
+(vior is the same, b)-.2 F .261(ut the ef)-.2 F(fecti)-.25 E .561 -.15
+(ve u)-.25 H .261(ser id).15 F(is not reset.)108 350.4 Q/F5 10.95
+/Times-Bold@0 SF(DEFINITIONS)72 367.2 Q F0(The follo)108 379.2 Q
+(wing de\214nitions are used throughout the rest of this document.)-.25
+E F1(blank)108 391.2 Q F0 2.5(As)11.54 G(pace or tab)-2.5 E(.)-.4 E F1
+-.1(wo)108 403.2 S(rd).1 E F0 2.5(As)13.88 G
+(equence of characters considered as a single unit by the shell.)-2.5 E
+(Also kno)5 E(wn as a)-.25 E F1(tok)2.5 E(en)-.1 E F0(.)A F1(name)108
+415.2 Q F0(A)12.67 E F2(wor)3.006 E(d)-.37 E F0 .165
+(consisting only of alphanumeric characters and underscores, and be)
+3.436 F .165(ginning with an alpha-)-.15 F
+(betic character or an underscore.)144 427.2 Q(Also referred to as an)5
+E F1(identi\214er)2.5 E F0(.)A F1(metacharacter)108 439.2 Q F0 2.5(Ac)
+144 451.2 S(haracter that, when unquoted, separates w)-2.5 E 2.5
+(ords. One)-.1 F(of the follo)2.5 E(wing:)-.25 E F1 5(|&;\(\)<>s)144
+463.2 S 2.5(pace tab)-5 F(contr)108 475.2 Q(ol operator)-.18 E F0(A)144
+487.2 Q F2(tok)2.5 E(en)-.1 E F0(that performs a control function.)2.5 E
+(It is one of the follo)5 E(wing symbols:)-.25 E/F6 10/Symbol SF<efef>
+144 499.2 Q F1 5(&&)5 G 5(&;;)-5 G 5(;\(\)|<)-5 G(newline>)-5 E F5
+(RESER)72 516 Q(VED W)-.602 E(ORDS)-.11 E F2 .306(Reserved wor)108 528 R
+(ds)-.37 E F0 .306(are w)2.806 F .306(ords that ha)-.1 F .606 -.15
+(ve a s)-.2 H .306(pecial meaning to the shell.).15 F .307(The follo)
+5.307 F .307(wing w)-.25 F .307(ords are recognized as)-.1 F(reserv)108
+540 Q .227(ed when unquoted and either the \214rst w)-.15 F .227
+(ord of a simple command \(see)-.1 F F3 .226(SHELL GRAMMAR)2.727 F F0
+(belo)2.476 E .226(w\) or)-.25 F(the third w)108 552 Q(ord of a)-.1 E F1
+(case)2.5 E F0(or)2.5 E F1 -.25(fo)2.5 G(r).25 E F0(command:)2.5 E F1
+11.915(!c)144 568.8 S 9.416(ase do done elif else esac \214 f)-11.915 F
+9.416(or function if in select then until)-.25 F 7.5
+(while { } time [[ ]])144 580.8 R F5(SHELL GRAMMAR)72 597.6 Q F1
+(Simple Commands)87 609.6 Q F0(A)108 621.6 Q F2 .389(simple command)
+2.889 F F0 .389(is a sequence of optional v)2.889 F .388
+(ariable assignments follo)-.25 F .388(wed by)-.25 F F1(blank)2.888 E F0
+.388(-separated w)B .388(ords and)-.1 F .815
+(redirections, and terminated by a)108 633.6 R F2(contr)3.315 E .815
+(ol oper)-.45 F(ator)-.15 E F0 5.815(.T)C .815(he \214rst w)-5.815 F
+.816(ord speci\214es the command to be e)-.1 F -.15(xe)-.15 G(cuted,).15
+E(and is passed as ar)108 645.6 Q(gument zero.)-.18 E(The remaining w)5
+E(ords are passed as ar)-.1 E(guments to the in)-.18 E -.2(vo)-.4 G -.1
+(ke).2 G 2.5(dc).1 G(ommand.)-2.5 E .176(The return v)108 662.4 R .176
+(alue of a)-.25 F F2 .176(simple command)2.676 F F0 .175(is its e)2.676
+F .175(xit status, or 128+)-.15 F F2(n)A F0 .175
+(if the command is terminated by signal)3.508 F F2(n)2.675 E F0(.).24 E
+F1(Pipelines)87 679.2 Q F0(A)108 691.2 Q F2(pipeline)2.919 E F0 .419
+(is a sequence of one or more commands separated by the character)2.919
+F F1(|)2.92 E F0 5.42(.T)C .42(he format for a pipeline)-5.42 F(is:)108
+703.2 Q([)144 720 Q F1(time)A F0([)2.5 E F1<ad70>A F0(]] [ ! ])A F2
+(command)2.5 E F0([)2.5 E F1(|)2.5 E F2(command2)2.5 E F0(... ])2.5 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 202.965(33)-2.5 G
+0 Cg EP
+%%Page: 4 4
+%%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 .244(The standard output of)108 84 R/F1 10/Times-Italic@0 SF
+(command)2.944 E F0 .243
+(is connected via a pipe to the standard input of)3.514 F F1(command2)
+2.743 E F0 5.243(.T).02 G .243(his connec-)-5.243 F
+(tion is performed before an)108 96 Q 2.5(yr)-.15 G
+(edirections speci\214ed by the command \(see)-2.5 E/F2 9/Times-Bold@0
+SF(REDIRECTION)2.5 E F0(belo)2.25 E(w\).)-.25 E .48
+(The return status of a pipeline is the e)108 112.8 R .48
+(xit status of the last command, unless the)-.15 F/F3 10/Times-Bold@0 SF
+(pipefail)2.98 E F0 .48(option is enabled.)2.98 F(If)108 124.8 Q F3
+(pipefail)2.687 E F0 .187(is enabled, the pipeline')2.687 F 2.687(sr)
+-.55 G .186(eturn status is the v)-2.687 F .186
+(alue of the last \(rightmost\) command to e)-.25 F .186(xit with a)-.15
+F .61(non-zero status, or zero if all commands e)108 136.8 R .611
+(xit successfully)-.15 F 5.611(.I)-.65 G 3.111(ft)-5.611 G .611
+(he reserv)-3.111 F .611(ed w)-.15 F(ord)-.1 E F3(!)3.111 E F0 .611
+(precedes a pipeline, the)5.611 F -.15(ex)108 148.8 S .55
+(it status of that pipeline is the logical ne).15 F -.05(ga)-.15 G .55
+(tion of the e).05 F .55(xit status as described abo)-.15 F -.15(ve)-.15
+G 5.55(.T).15 G .55(he shell w)-5.55 F .55(aits for)-.1 F
+(all commands in the pipeline to terminate before returning a v)108
+160.8 Q(alue.)-.25 E .298(If the)108 177.6 R F3(time)2.799 E F0(reserv)
+2.799 E .299(ed w)-.15 F .299(ord precedes a pipeline, the elapsed as w\
+ell as user and system time consumed by its)-.1 F -.15(exe)108 189.6 S
+.14(cution are reported when the pipeline terminates.).15 F(The)5.139 E
+F3<ad70>2.639 E F0 .139(option changes the output format to that spec-)
+2.639 F .779(i\214ed by POSIX.)108 201.6 R(The)5.779 E F2(TIMEFORMA)
+3.279 E(T)-.855 E F0 -.25(va)3.029 G .779
+(riable may be set to a format string that speci\214es ho).25 F 3.28(wt)
+-.25 G .78(he timing)-3.28 F
+(information should be displayed; see the description of)108 213.6 Q F2
+(TIMEFORMA)2.5 E(T)-.855 E F0(under)2.25 E F3(Shell V)2.5 E(ariables)
+-.92 E F0(belo)2.5 E -.65(w.)-.25 G(Each command in a pipeline is e)108
+230.4 Q -.15(xe)-.15 G
+(cuted as a separate process \(i.e., in a subshell\).).15 E F3(Lists)87
+247.2 Q F0(A)108 259.2 Q F1(list)2.601 E F0 .101(is a sequence of one o\
+r more pipelines separated by one of the operators)2.601 F F3(;)2.6 E F0
+(,)A F3(&)2.6 E F0(,)A F3(&&)2.6 E F0 2.6(,o)C(r)-2.6 E/F4 10/Symbol SF
+<efef>2.6 E F0 2.6(,a)C .1(nd option-)-2.6 F(ally terminated by one of)
+108 271.2 Q F3(;)2.5 E F0(,)A F3(&)2.5 E F0 2.5(,o)C(r)-2.5 E F3
+(<newline>)2.5 E F0(.)A .656(Of these list operators,)108 288 R F3(&&)
+3.156 E F0(and)3.156 E F4<efef>3.156 E F0(ha)3.156 E .956 -.15(ve e)-.2
+H .656(qual precedence, follo).15 F .656(wed by)-.25 F F3(;)3.156 E F0
+(and)3.156 E F3(&,)3.156 E F0 .656(which ha)3.156 F .957 -.15(ve e)-.2 H
+.657(qual prece-).15 F(dence.)108 300 Q 2.5(As)108 316.8 S
+(equence of one or more ne)-2.5 E(wlines may appear in a)-.25 E F1(list)
+2.5 E F0(instead of a semicolon to delimit commands.)2.5 E .029
+(If a command is terminated by the control operator)108 333.6 R F3(&)
+2.529 E F0 2.529(,t)C .029(he shell e)-2.529 F -.15(xe)-.15 G .029
+(cutes the command in the).15 F F1(bac)2.528 E(kgr)-.2 E(ound)-.45 E F0
+(in)2.528 E 2.875(as)108 345.6 S 2.875(ubshell. The)-2.875 F .375
+(shell does not w)2.875 F .375
+(ait for the command to \214nish, and the return status is 0.)-.1 F .376
+(Commands sepa-)5.376 F .849(rated by a)108 357.6 R F3(;)3.349 E F0 .849
+(are e)3.349 F -.15(xe)-.15 G .848(cuted sequentially; the shell w).15 F
+.848(aits for each command to terminate in turn.)-.1 F .848(The return)
+5.848 F(status is the e)108 369.6 Q(xit status of the last command e)
+-.15 E -.15(xe)-.15 G(cuted.).15 E(The control operators)108 386.4 Q F3
+(&&)2.5 E F0(and)2.5 E F4<efef>2.5 E F0
+(denote AND lists and OR lists, respecti)2.5 E -.15(ve)-.25 G(ly).15 E 5
+(.A)-.65 G 2.5(nA)-5 G(ND list has the form)-2.5 E F1(command1)144 403.2
+Q F3(&&)2.5 E F1(command2)2.5 E(command2)108.2 420 Q F0(is e)2.52 E -.15
+(xe)-.15 G(cuted if, and only if,).15 E F1(command1)2.7 E F0
+(returns an e)2.5 E(xit status of zero.)-.15 E(An OR list has the form)
+108 436.8 Q F1(command1)144 453.6 Q F4<efef>2.5 E F1(command2)2.5 E
+(command2)108.2 475.2 Q F0 .728(is e)3.248 F -.15(xe)-.15 G .729
+(cuted if and only if).15 F F1(command1)3.429 E F0 .729
+(returns a non-zero e)3.229 F .729(xit status.)-.15 F .729
+(The return status of AND)5.729 F(and OR lists is the e)108 487.2 Q
+(xit status of the last command e)-.15 E -.15(xe)-.15 G
+(cuted in the list.).15 E F3(Compound Commands)87 504 Q F0(A)108 516 Q
+F1(compound command)2.5 E F0(is one of the follo)2.5 E(wing:)-.25 E(\()
+108 532.8 Q F1(list)A F0(\))A F1(list)17.11 E F0 .011(is e)2.512 F -.15
+(xe)-.15 G .011(cuted in a subshell en).15 F .011(vironment \(see)-.4 F
+F2 .011(COMMAND EXECUTION ENVIR)2.511 F(ONMENT)-.27 E F0(belo)2.261 E
+(w\).)-.25 E -1.11(Va)144 544.8 S 1.063(riable assignments and b)1.11 F
+1.064(uiltin commands that af)-.2 F 1.064(fect the shell')-.25 F 3.564
+(se)-.55 G -.4(nv)-3.564 G 1.064(ironment do not remain in).4 F(ef)144
+556.8 Q(fect after the command completes.)-.25 E
+(The return status is the e)5 E(xit status of)-.15 E F1(list)2.5 E F0(.)
+A({)108 573.6 Q F1(list)2.5 E F0 2.5(;})C F1(list)3.89 E F0 .402
+(is simply e)2.902 F -.15(xe)-.15 G .401(cuted in the current shell en)
+.15 F(vironment.)-.4 E F1(list)5.401 E F0 .401
+(must be terminated with a ne)2.901 F .401(wline or)-.25 F 3.214
+(semicolon. This)144 585.6 R .714(is kno)3.214 F .714(wn as a)-.25 F F1
+(gr)3.215 E .715(oup command)-.45 F F0 5.715(.T)C .715
+(he return status is the e)-5.715 F .715(xit status of)-.15 F F1(list)
+3.215 E F0 5.715(.N)C(ote)-5.715 E .22(that unlik)144 597.6 R 2.72(et)
+-.1 G .22(he metacharacters)-2.72 F F3(\()2.72 E F0(and)2.72 E F3(\))
+2.72 E F0(,)A F3({)2.72 E F0(and)2.72 E F3(})2.719 E F0(are)2.719 E F1
+-.37(re)2.719 G .219(served wor).37 F(ds)-.37 E F0 .219
+(and must occur where a reserv)2.719 F(ed)-.15 E -.1(wo)144 609.6 S .256
+(rd is permitted to be recognized.).1 F .256(Since the)5.256 F 2.756(yd)
+-.15 G 2.756(on)-2.756 G .257(ot cause a w)-2.756 F .257(ord break, the)
+-.1 F 2.757(ym)-.15 G .257(ust be separated)-2.757 F(from)144 621.6 Q F1
+(list)2.5 E F0(by whitespace.)2.5 E(\(\()108 638.4 Q F1 -.2(ex)C(pr).2 E
+(ession)-.37 E F0(\)\))A(The)144 650.4 Q F1 -.2(ex)2.552 G(pr).2 E
+(ession)-.37 E F0 .052(is e)2.552 F -.25(va)-.25 G .051
+(luated according to the rules described belo).25 F 2.551(wu)-.25 G
+(nder)-2.551 E F2 .051(ARITHMETIC EV)2.551 F(ALU)-1.215 E(A-)-.54 E
+(TION)144 662.4 Q/F5 9/Times-Roman@0 SF(.)A F0 .411(If the v)4.91 F .411
+(alue of the e)-.25 F .411(xpression is non-zero, the return status is \
+0; otherwise the return status)-.15 F(is 1.)144 674.4 Q(This is e)5 E
+(xactly equi)-.15 E -.25(va)-.25 G(lent to).25 E F3(let ")2.5 E F1 -.2
+(ex)C(pr).2 E(ession)-.37 E F3(")A F0(.)A F3([[)108 691.2 Q F1 -.2(ex)
+2.5 G(pr).2 E(ession)-.37 E F3(]])2.5 E F0 1.3
+(Return a status of 0 or 1 depending on the e)144 703.2 R -.25(va)-.25 G
+1.299(luation of the conditional e).25 F(xpression)-.15 E F1 -.2(ex)
+3.799 G(pr).2 E(ession)-.37 E F0(.)A 2.273
+(Expressions are composed of the primaries described belo)144 715.2 R
+4.774(wu)-.25 G(nder)-4.774 E F2(CONDITION)4.774 E 2.274(AL EXPRES-)-.18
+F(SIONS)144 727.2 Q F5(.)A F0 -.8(Wo)5.633 G 1.133
+(rd splitting and pathname e).8 F 1.133
+(xpansion are not performed on the w)-.15 F 1.133(ords between the)-.1 F
+F3([[)3.632 E F0(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G
+202.965(34)-2.5 G 0 Cg EP
+%%Page: 5 5
+%%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(and)144 84 Q/F1 10/Times-Bold@0 SF(]])2.963 E F0 2.963(;t)C .463
+(ilde e)-2.963 F .464(xpansion, parameter and v)-.15 F .464(ariable e)
+-.25 F .464(xpansion, arithmetic e)-.15 F .464
+(xpansion, command substi-)-.15 F 1.081
+(tution, process substitution, and quote remo)144 96 R -.25(va)-.15 G
+3.581(la).25 G 1.081(re performed.)-3.581 F 1.081
+(Conditional operators such as)6.081 F F1<ad66>3.58 E F0
+(must be unquoted to be recognized as primaries.)144 108 Q .502
+(When the)144 126 R F1(==)3.002 E F0(and)3.002 E F1(!=)3.002 E F0 .502(\
+operators are used, the string to the right of the operator is consider\
+ed a pat-)3.002 F 1.383
+(tern and matched according to the rules described belo)144 138 R 3.883
+(wu)-.25 G(nder)-3.883 E F1 -.1(Pa)3.883 G(tter).1 E 3.883(nM)-.15 G
+(atching)-3.883 E F0 6.383(.T)C 1.383(he return)-6.383 F -.25(va)144 150
+S .589
+(lue is 0 if the string matches or does not match the pattern, respecti)
+.25 F -.15(ve)-.25 G(ly).15 E 3.089(,a)-.65 G .589(nd 1 otherwise.)
+-3.089 F(An)5.589 E(y)-.15 E(part of the pattern may be quoted to force\
+ it to be matched as a string.)144 162 Q .243
+(An additional binary operator)144 180 R(,)-.4 E F1(=~)2.743 E F0 2.743
+(,i)C 2.743(sa)-2.743 G -.25(va)-2.943 G .243
+(ilable, with the same precedence as).25 F F1(==)2.743 E F0(and)2.743 E
+F1(!=)2.743 E F0 5.243(.W)C .243(hen it is)-5.243 F 1.953
+(used, the string to the right of the operator is considered an e)144
+192 R 1.954(xtended re)-.15 F 1.954(gular e)-.15 F 1.954(xpression and)
+-.15 F .207(matched accordingly \(as in)144 204 R/F2 10/Times-Italic@0
+SF -.37(re)2.707 G -.1(ge)-.03 G(x)-.1 E F0 2.707(\(3\)\). The)B .207
+(return v)2.707 F .207
+(alue is 0 if the string matches the pattern, and 1)-.25 F 3.345
+(otherwise. If)144 216 R .845(the re)3.345 F .845(gular e)-.15 F .846
+(xpression is syntactically incorrect, the conditional e)-.15 F
+(xpression')-.15 E 3.346(sr)-.55 G(eturn)-3.346 E -.25(va)144 228 S .252
+(lue is 2.).25 F .251(If the shell option)5.252 F F1(nocaseglob)2.751 E
+F0 .251(is enabled, the match is performed without re)2.751 F -.05(ga)
+-.15 G .251(rd to the).05 F .101(case of alphabetic characters.)144 240
+R .101(Substrings matched by parenthesized sube)5.101 F .101
+(xpressions within the re)-.15 F(g-)-.15 E 5.406(ular e)144 252 R 5.406
+(xpression are sa)-.15 F -.15(ve)-.2 G 7.906(di).15 G 7.906(nt)-7.906 G
+5.405(he array v)-7.906 F(ariable)-.25 E F1 -.3(BA)7.905 G(SH_REMA).3 E
+(TCH)-.95 E F0 10.405(.T)C 5.405(he element of)-10.405 F F1 -.3(BA)144
+264 S(SH_REMA).3 E(TCH)-.95 E F0 .87(with inde)3.37 F 3.37(x0i)-.15 G
+3.37(st)-3.37 G .87(he portion of the string matching the entire re)
+-3.37 F .87(gular e)-.15 F(xpres-)-.15 E 3.346(sion. The)144 276 R .846
+(element of)3.346 F F1 -.3(BA)3.346 G(SH_REMA).3 E(TCH)-.95 E F0 .846
+(with inde)3.346 F(x)-.15 E F2(n)3.346 E F0 .846
+(is the portion of the string matching the)3.346 F F2(n)144 288 Q F0
+(th parenthesized sube)A(xpression.)-.15 E .785
+(Expressions may be combined using the follo)144 306 R .786
+(wing operators, listed in decreasing order of prece-)-.25 F(dence:)144
+318 Q F1(\()144 336 Q F2 -.2(ex)2.5 G(pr).2 E(ession)-.37 E F1(\))2.5 E
+F0 .523(Returns the v)180 348 R .522(alue of)-.25 F F2 -.2(ex)3.022 G
+(pr).2 E(ession)-.37 E F0 5.522(.T)C .522(his may be used to o)-5.522 F
+-.15(ve)-.15 G .522(rride the normal precedence of).15 F(operators.)180
+360 Q F1(!)144 372 Q F2 -.2(ex)2.5 G(pr).2 E(ession)-.37 E F0 -.35(Tr)
+180 384 S(ue if).35 E F2 -.2(ex)2.5 G(pr).2 E(ession)-.37 E F0(is f)2.74
+E(alse.)-.1 E F2 -.2(ex)144 396 S(pr).2 E(ession1)-.37 E F1(&&)2.5 E F2
+-.2(ex)2.5 G(pr).2 E(ession2)-.37 E F0 -.35(Tr)180 408 S(ue if both).35
+E F2 -.2(ex)2.5 G(pr).2 E(ession1)-.37 E F0(and)2.5 E F2 -.2(ex)2.5 G
+(pr).2 E(ession2)-.37 E F0(are true.)2.52 E F2 -.2(ex)144 420 S(pr).2 E
+(ession1)-.37 E/F3 10/Symbol SF<efef>2.5 E F2 -.2(ex)2.5 G(pr).2 E
+(ession2)-.37 E F0 -.35(Tr)180 432 S(ue if either).35 E F2 -.2(ex)2.5 G
+(pr).2 E(ession1)-.37 E F0(or)2.5 E F2 -.2(ex)2.5 G(pr).2 E(ession2)-.37
+E F0(is true.)2.52 E(The)144 448.8 Q F1(&&)3.298 E F0(and)3.298 E F3
+<efef>3.298 E F0 .798(operators do not e)3.298 F -.25(va)-.25 G(luate)
+.25 E F2 -.2(ex)3.298 G(pr).2 E(ession2)-.37 E F0 .798(if the v)3.298 F
+.798(alue of)-.25 F F2 -.2(ex)3.298 G(pr).2 E(ession1)-.37 E F0 .799
+(is suf)3.298 F .799(\214cient to)-.25 F(determine the return v)144
+460.8 Q(alue of the entire conditional e)-.25 E(xpression.)-.15 E F1
+-.25(fo)108 477.6 S(r).25 E F2(name)2.5 E F0([)2.5 E F1(in)2.5 E F2(wor)
+2.5 E(d)-.37 E F0 2.5(];)2.5 G F1(do)A F2(list)2.5 E F0(;)2.5 E F1(done)
+2.5 E F0 .424(The list of w)144 489.6 R .424(ords follo)-.1 F(wing)-.25
+E F1(in)2.924 E F0 .423(is e)2.924 F .423
+(xpanded, generating a list of items.)-.15 F .423(The v)5.423 F(ariable)
+-.25 E F2(name)2.923 E F0 .423(is set to)2.923 F .653
+(each element of this list in turn, and)144 501.6 R F2(list)3.153 E F0
+.653(is e)3.153 F -.15(xe)-.15 G .653(cuted each time.).15 F .653
+(If the)5.653 F F1(in)3.153 E F2(wor)3.153 E(d)-.37 E F0 .653
+(is omitted, the)3.153 F F1 -.25(fo)3.153 G(r).25 E F0 .649(command e)
+144 513.6 R -.15(xe)-.15 G(cutes).15 E F2(list)3.149 E F0 .648
+(once for each positional parameter that is set \(see)3.148 F/F4 9
+/Times-Bold@0 SF -.666(PA)3.148 G(RAMETERS).666 E F0(belo)2.898 E(w\).)
+-.25 E .153(The return status is the e)144 525.6 R .153
+(xit status of the last command that e)-.15 F -.15(xe)-.15 G 2.654
+(cutes. If).15 F .154(the e)2.654 F .154(xpansion of the items)-.15 F
+(follo)144 537.6 Q(wing)-.25 E F1(in)2.5 E F0
+(results in an empty list, no commands are e)2.5 E -.15(xe)-.15 G
+(cuted, and the return status is 0.).15 E F1 -.25(fo)108 554.4 S(r).25 E
+F0(\(\()2.5 E F2 -.2(ex)2.5 G(pr1).2 E F0(;)2.5 E F2 -.2(ex)2.5 G(pr2).2
+E F0(;)2.5 E F2 -.2(ex)2.5 G(pr3).2 E F0(\)\) ;)2.5 E F1(do)2.5 E F2
+(list)2.5 E F0(;)2.5 E F1(done)2.5 E F0 1.236(First, the arithmetic e)
+144 566.4 R(xpression)-.15 E F2 -.2(ex)3.736 G(pr1).2 E F0 1.235(is e)
+3.736 F -.25(va)-.25 G 1.235
+(luated according to the rules described belo).25 F 3.735(wu)-.25 G
+(nder)-3.735 E F4 .561(ARITHMETIC EV)144 578.4 R(ALU)-1.215 E -.855(AT)
+-.54 G(ION).855 E/F5 9/Times-Roman@0 SF(.)A F0 .561(The arithmetic e)
+5.061 F(xpression)-.15 E F2 -.2(ex)3.061 G(pr2).2 E F0 .562(is then e)
+3.062 F -.25(va)-.25 G .562(luated repeatedly until).25 F .592(it e)144
+590.4 R -.25(va)-.25 G .592(luates to zero.).25 F .592(Each time)5.592 F
+F2 -.2(ex)3.092 G(pr2).2 E F0 -.25(eva)3.092 G .592
+(luates to a non-zero v).25 F(alue,)-.25 E F2(list)3.092 E F0 .591(is e)
+3.092 F -.15(xe)-.15 G .591(cuted and the arith-).15 F .228(metic e)144
+602.4 R(xpression)-.15 E F2 -.2(ex)2.728 G(pr3).2 E F0 .229(is e)2.728 F
+-.25(va)-.25 G 2.729(luated. If).25 F(an)2.729 E 2.729(ye)-.15 G .229
+(xpression is omitted, it beha)-2.879 F -.15(ve)-.2 G 2.729(sa).15 G
+2.729(si)-2.729 G 2.729(fi)-2.729 G 2.729(te)-2.729 G -.25(va)-2.979 G
+.229(luates to 1.).25 F .228(The return v)144 614.4 R .228
+(alue is the e)-.25 F .228(xit status of the last command in)-.15 F F2
+(list)2.728 E F0 .227(that is e)2.728 F -.15(xe)-.15 G .227(cuted, or f)
+.15 F .227(alse if an)-.1 F 2.727(yo)-.15 G 2.727(ft)-2.727 G(he)-2.727
+E -.15(ex)144 626.4 S(pressions is in).15 E -.25(va)-.4 G(lid.).25 E F1
+(select)108 643.2 Q F2(name)2.5 E F0([)2.5 E F1(in)2.5 E F2(wor)2.5 E(d)
+-.37 E F0 2.5(];)2.5 G F1(do)A F2(list)2.5 E F0(;)2.5 E F1(done)2.5 E F0
+.432(The list of w)144 655.2 R .432(ords follo)-.1 F(wing)-.25 E F1(in)
+2.932 E F0 .432(is e)2.932 F .432(xpanded, generating a list of items.)
+-.15 F .433(The set of e)5.433 F .433(xpanded w)-.15 F(ords)-.1 E .843
+(is printed on the standard error)144 667.2 R 3.342(,e)-.4 G .842
+(ach preceded by a number)-3.342 F 5.842(.I)-.55 G 3.342(ft)-5.842 G(he)
+-3.342 E F1(in)3.342 E F2(wor)3.342 E(d)-.37 E F0 .842
+(is omitted, the posi-)3.342 F .064(tional parameters are printed \(see)
+144 679.2 R F4 -.666(PA)2.564 G(RAMETERS).666 E F0(belo)2.314 E 2.564
+(w\). The)-.25 F F1(PS3)2.564 E F0 .064(prompt is then displayed and a)
+2.564 F .214(line read from the standard input.)144 691.2 R .213
+(If the line consists of a number corresponding to one of the dis-)5.214
+F 1.537(played w)144 703.2 R 1.537(ords, then the v)-.1 F 1.537(alue of)
+-.25 F F2(name)4.397 E F0 1.537(is set to that w)4.217 F 4.037(ord. If)
+-.1 F 1.538(the line is empty)4.038 F 4.038(,t)-.65 G 1.538(he w)-4.038
+F 1.538(ords and)-.1 F .066(prompt are displayed ag)144 715.2 R 2.566
+(ain. If)-.05 F .065(EOF is read, the command completes.)2.566 F(An)
+5.065 E 2.565(yo)-.15 G .065(ther v)-2.565 F .065(alue read causes)-.25
+F F2(name)144 727.2 Q F0 .759(to be set to null.)3.439 F .759
+(The line read is sa)5.759 F -.15(ve)-.2 G 3.26(di).15 G 3.26(nt)-3.26 G
+.76(he v)-3.26 F(ariable)-.25 E F1(REPL)3.26 E(Y)-.92 E F0 5.76(.T)C(he)
+-5.76 E F2(list)3.35 E F0 .76(is e)3.94 F -.15(xe)-.15 G .76
+(cuted after).15 F(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G
+202.965(35)-2.5 G 0 Cg EP
+%%Page: 6 6
+%%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 .072(each selection until a)144 84 R/F1 10/Times-Bold@0 SF(br)
+2.571 E(eak)-.18 E F0 .071(command is e)2.571 F -.15(xe)-.15 G 2.571
+(cuted. The).15 F -.15(ex)2.571 G .071(it status of).15 F F1(select)
+2.571 E F0 .071(is the e)2.571 F .071(xit status of the)-.15 F
+(last command e)144 96 Q -.15(xe)-.15 G(cuted in).15 E/F2 10
+/Times-Italic@0 SF(list)2.5 E F0 2.5(,o).68 G 2.5(rz)-2.5 G
+(ero if no commands were e)-2.5 E -.15(xe)-.15 G(cuted.).15 E F1(case)
+108 112.8 Q F2(wor)2.5 E(d)-.37 E F1(in)2.5 E F0 2.5([[)2.5 G(\(])-2.5 E
+F2(pattern)2.5 E F0([)2.5 E F1(|)2.5 E F2(pattern)2.5 E F0 2.5(].)2.5 G
+(.. \))-2.5 E F2(list)2.5 E F0(;; ] ...)2.5 E F1(esac)2.5 E F0(A)144
+124.8 Q F1(case)3.264 E F0 .764(command \214rst e)3.264 F(xpands)-.15 E
+F2(wor)3.264 E(d)-.37 E F0 3.264(,a)C .764(nd tries to match it ag)
+-3.264 F .764(ainst each)-.05 F F2(pattern)3.264 E F0 .765
+(in turn, using the)3.264 F 2.028(same matching rules as for pathname e)
+144 136.8 R 2.027(xpansion \(see)-.15 F F1 -.1(Pa)4.527 G 2.027
+(thname Expansion).1 F F0(belo)4.527 E 4.527(w\). When)-.25 F(a)4.527 E
+.89(match is found, the corresponding)144 148.8 R F2(list)3.39 E F0 .89
+(is e)3.39 F -.15(xe)-.15 G 3.39(cuted. After).15 F .89
+(the \214rst match, no subsequent matches)3.39 F .523(are attempted.)144
+160.8 R .523(The e)5.523 F .523
+(xit status is zero if no pattern matches.)-.15 F .523
+(Otherwise, it is the e)5.523 F .522(xit status of the)-.15 F
+(last command e)144 172.8 Q -.15(xe)-.15 G(cuted in).15 E F2(list)2.5 E
+F0(.)A F1(if)108 189.6 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 201.6 Q F1(if)2.977 E F2(list)3.067 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.978 E F2(list)2.978 E F0 1.088(is e)144 213.6 R -.15(xe)-.15 G
+1.088(cuted in turn, and if its e).15 F 1.087
+(xit status is zero, the corresponding)-.15 F F1(then)3.587 E F2(list)
+3.587 E F0 1.087(is e)3.587 F -.15(xe)-.15 G 1.087(cuted and the).15 F
+.103(command completes.)144 225.6 R .103(Otherwise, the)5.103 F F1(else)
+2.603 E F2(list)2.603 E F0 .103(is e)2.603 F -.15(xe)-.15 G .103
+(cuted, if present.).15 F .103(The e)5.103 F .103(xit status is the e)
+-.15 F .104(xit sta-)-.15 F(tus of the last command e)144 237.6 Q -.15
+(xe)-.15 G(cuted, or zero if no condition tested true.).15 E F1(while)
+108 254.4 Q F2(list)2.5 E F0(;)A F1(do)2.5 E F2(list)2.5 E F0(;)A F1
+(done)2.5 E(until)108 266.4 Q F2(list)2.5 E F0(;)A F1(do)2.5 E F2(list)
+2.5 E F0(;)A F1(done)2.5 E F0(The)144 278.4 Q F1(while)3.104 E F0 .603
+(command continuously e)3.104 F -.15(xe)-.15 G .603(cutes the).15 F F1
+(do)3.103 E F2(list)3.103 E F0 .603(as long as the last command in)3.103
+F F2(list)3.103 E F0(returns)3.103 E .47(an e)144 290.4 R .47
+(xit status of zero.)-.15 F(The)5.47 E F1(until)2.97 E F0 .471
+(command is identical to the)2.97 F F1(while)2.971 E F0 .471(command, e)
+2.971 F .471(xcept that the test)-.15 F .096(is ne)144 302.4 R -.05(ga)
+-.15 G .096(ted; the).05 F F1(do)2.596 E F2(list)2.686 E F0 .095(is e)
+3.276 F -.15(xe)-.15 G .095(cuted as long as the last command in).15 F
+F2(list)2.685 E F0 .095(returns a non-zero e)3.275 F .095(xit status.)
+-.15 F 1.306(The e)144 314.4 R 1.306(xit status of the)-.15 F F1(while)
+3.806 E F0(and)3.806 E F1(until)3.807 E F0 1.307(commands is the e)3.807
+F 1.307(xit status of the last)-.15 F F1(do)3.807 E F2(list)3.807 E F0
+(command)3.807 E -.15(exe)144 326.4 S(cuted, or zero if none w).15 E
+(as e)-.1 E -.15(xe)-.15 G(cuted.).15 E F1(Shell Function De\214nitions)
+87 343.2 Q F0 2.698(As)108 355.2 S .198
+(hell function is an object that is called lik)-2.698 F 2.698(eas)-.1 G
+.198(imple command and e)-2.698 F -.15(xe)-.15 G .197
+(cutes a compound command with).15 F 2.5(an)108 367.2 S .5 -.25(ew s)
+-2.5 H(et of positional parameters.).25 E
+(Shell functions are declared as follo)5 E(ws:)-.25 E([)108 384 Q F1
+(function)2.5 E F0(])2.5 E F2(name)2.5 E F0(\(\))2.5 E F2
+(compound\255command)2.5 E F0([)2.5 E F2 -.37(re)C(dir).37 E(ection)-.37
+E F0(])A 1.402(This de\214nes a function named)144 396 R F2(name)3.902 E
+F0 6.402(.T)C 1.402(he reserv)-6.402 F 1.402(ed w)-.15 F(ord)-.1 E F1
+(function)3.902 E F0 1.402(is optional.)3.902 F 1.403(If the)6.402 F F1
+(function)3.903 E F0(reserv)144 408 Q .162(ed w)-.15 F .162
+(ord is supplied, the parentheses are optional.)-.1 F(The)5.162 E F2
+(body)2.662 E F0 .162(of the function is the compound)2.662 F(command)
+144 420 Q F2(compound\255command)2.784 E F0(\(see)3.354 E F1 .084
+(Compound Commands)2.584 F F0(abo)2.584 E -.15(ve)-.15 G 2.584(\). That)
+.15 F .084(command is usually a)2.584 F F2(list)144 432 Q F0 .044
+(of commands between { and }, b)2.544 F .044(ut may be an)-.2 F 2.544
+(yc)-.15 G .044(ommand listed under)-2.544 F F1 .044(Compound Commands)
+2.544 F F0(abo)144 444 Q -.15(ve)-.15 G(.).15 E F2(compound\255command)
+6.67 E F0 1.67(is e)4.17 F -.15(xe)-.15 G 1.671(cuted whene).15 F -.15
+(ve)-.25 G(r).15 E F2(name)4.171 E F0 1.671
+(is speci\214ed as the name of a simple)4.171 F 3.009(command. An)144
+456 R 3.009(yr)-.15 G .509(edirections \(see)-3.009 F/F3 9/Times-Bold@0
+SF(REDIRECTION)3.009 E F0(belo)2.759 E .509
+(w\) speci\214ed when a function is de\214ned are)-.25 F .58
+(performed when the function is e)144 468 R -.15(xe)-.15 G 3.08
+(cuted. The).15 F -.15(ex)3.081 G .581
+(it status of a function de\214nition is zero unless a).15 F .177(synta\
+x error occurs or a readonly function with the same name already e)144
+480 R 2.677(xists. When)-.15 F -.15(exe)2.677 G .177(cuted, the).15 F
+-.15(ex)144 492 S .64(it status of a function is the e).15 F .64
+(xit status of the last command e)-.15 F -.15(xe)-.15 G .64
+(cuted in the body).15 F 5.64(.\()-.65 G(See)-5.64 E F3(FUNC-)3.14 E
+(TIONS)144 504 Q F0(belo)2.25 E -.65(w.)-.25 G(\)).65 E/F4 10.95
+/Times-Bold@0 SF(COMMENTS)72 520.8 Q F0 .982(In a non-interacti)108
+532.8 R 1.282 -.15(ve s)-.25 H .982(hell, or an interacti).15 F 1.282
+-.15(ve s)-.25 H .982(hell in which the).15 F F1(interacti)3.482 E -.1
+(ve)-.1 G(_comments).1 E F0 .982(option to the)3.482 F F1(shopt)3.482 E
+F0 -.2(bu)108 544.8 S .951(iltin is enabled \(see).2 F F3 .952(SHELL B)
+3.451 F(UIL)-.09 E .952(TIN COMMANDS)-.828 F F0(belo)3.202 E .952
+(w\), a w)-.25 F .952(ord be)-.1 F .952(ginning with)-.15 F F1(#)3.452 E
+F0 .952(causes that w)3.452 F(ord)-.1 E .605
+(and all remaining characters on that line to be ignored.)108 556.8 R
+.604(An interacti)5.605 F .904 -.15(ve s)-.25 H .604(hell without the)
+.15 F F1(interacti)3.104 E -.1(ve)-.1 G(_com-).1 E(ments)108 568.8 Q F0
+1.336(option enabled does not allo)3.836 F 3.836(wc)-.25 G 3.836
+(omments. The)-3.836 F F1(interacti)3.836 E -.1(ve)-.1 G(_comments).1 E
+F0 1.337(option is on by def)3.837 F 1.337(ault in)-.1 F(interacti)108
+580.8 Q .3 -.15(ve s)-.25 H(hells.).15 E F4 -.11(QU)72 597.6 S -.438(OT)
+.11 G(ING).438 E F2(Quoting)108 609.6 Q F0 .478(is used to remo)2.978 F
+.777 -.15(ve t)-.15 H .477
+(he special meaning of certain characters or w).15 F .477
+(ords to the shell.)-.1 F .477(Quoting can be)5.477 F .184
+(used to disable special treatment for special characters, to pre)108
+621.6 R -.15(ve)-.25 G .185(nt reserv).15 F .185(ed w)-.15 F .185
+(ords from being recognized as)-.1 F(such, and to pre)108 633.6 Q -.15
+(ve)-.25 G(nt parameter e).15 E(xpansion.)-.15 E .289(Each of the)108
+650.4 R F2(metac)2.789 E(har)-.15 E(acter)-.15 E(s)-.1 E F0 .288
+(listed abo)2.789 F .588 -.15(ve u)-.15 H(nder).15 E F3(DEFINITIONS)
+2.788 E F0 .288(has special meaning to the shell and must be)2.538 F
+(quoted if it is to represent itself.)108 662.4 Q .705
+(When the command history e)108 679.2 R .705(xpansion f)-.15 F .705
+(acilities are being used, the)-.1 F F2 .705(history e)3.205 F(xpansion)
+-.2 E F0(character)3.205 E 3.205(,u)-.4 G(sually)-3.205 E F1(!)3.205 E
+F0(,)A(must be quoted to pre)108 691.2 Q -.15(ve)-.25 G(nt history e).15
+E(xpansion.)-.15 E(There are three quoting mechanisms: the)108 708 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 2.975(An)108 724.8 S .475
+(on-quoted backslash \()-2.975 F F1(\\)A F0 2.974(\)i)C 2.974(st)-2.974
+G(he)-2.974 E F2 .474(escape c)2.974 F(har)-.15 E(acter)-.15 E F0 5.474
+(.I).73 G 2.974(tp)-5.474 G(reserv)-2.974 E .474(es the literal v)-.15 F
+.474(alue of the ne)-.25 F .474(xt character that)-.15 F(GNU Bash-3.0)72
+768 Q(2003 No)147.975 E 2.5(v1)-.15 G 202.965(36)-2.5 G 0 Cg EP
+%%Page: 7 7
+%%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(follo)108 84 Q 1.553(ws, with the e)-.25 F 1.553(xception of <ne)
+-.15 F 4.053(wline>. If)-.25 F(a)4.053 E/F1 10/Times-Bold@0 SF(\\)4.053
+E F0(<ne)A 1.553(wline> pair appears, and the backslash is not itself)
+-.25 F 1.123(quoted, the)108 96 R F1(\\)3.623 E F0(<ne)A 1.122
+(wline> is treated as a line continuation \(that is, it is remo)-.25 F
+-.15(ve)-.15 G 3.622(df).15 G 1.122(rom the input stream and)-3.622 F
+(ef)108 108 Q(fecti)-.25 E -.15(ve)-.25 G(ly ignored\).).15 E .295
+(Enclosing characters in single quotes preserv)108 124.8 R .295
+(es the literal v)-.15 F .295(alue of each character within the quotes.)
+-.25 F 2.795(As)5.295 G(in-)-2.795 E
+(gle quote may not occur between single quotes, e)108 136.8 Q -.15(ve)
+-.25 G 2.5(nw).15 G(hen preceded by a backslash.)-2.5 E .034
+(Enclosing characters in double quotes preserv)108 153.6 R .034
+(es the literal v)-.15 F .034
+(alue of all characters within the quotes, with the)-.25 F -.15(ex)108
+165.6 S 1.266(ception of).15 F F1($)3.766 E F0(,)A F1(`)3.766 E F0 3.766
+(,a)C(nd)-3.766 E F1(\\)3.766 E F0 6.266(.T)C 1.266(he characters)-6.266
+F F1($)3.766 E F0(and)3.766 E F1(`)3.766 E F0 1.266
+(retain their special meaning within double quotes.)3.766 F(The)6.267 E
+.637(backslash retains its special meaning only when follo)108 177.6 R
+.637(wed by one of the follo)-.25 F .637(wing characters:)-.25 F F1($)
+3.137 E F0(,)A F1(`)3.137 E F0(,)A F1(")3.97 E F0(,).833 E F1(\\)3.136 E
+F0 3.136(,o)C(r)-3.136 E F1(<newline>)108 189.6 Q F0 5.526(.A)C .526(do\
+uble quote may be quoted within double quotes by preceding it with a ba\
+ckslash.)-2.5 F(When)5.527 E .244(command history is being used, the do\
+uble quote may not be used to quote the history e)108 201.6 R .243
+(xpansion character)-.15 F(.)-.55 E(The special parameters)108 218.4 Q
+F1(*)2.5 E F0(and)2.5 E F1(@)2.5 E F0(ha)2.5 E .3 -.15(ve s)-.2 H
+(pecial meaning when in double quotes \(see).15 E/F2 9/Times-Bold@0 SF
+-.666(PA)2.5 G(RAMETERS).666 E F0(belo)2.25 E(w\).)-.25 E -.8(Wo)108
+235.2 S .007(rds of the form).8 F F1($)2.507 E F0(')A/F3 10
+/Times-Italic@0 SF(string)A F0 2.507('a)C .007(re treated specially)
+-2.507 F 5.007(.T)-.65 G .007(he w)-5.007 F .007(ord e)-.1 F .008
+(xpands to)-.15 F F3(string)2.508 E F0 2.508(,w)C .008
+(ith backslash-escaped char)-2.508 F(-)-.2 E .03
+(acters replaced as specifed by the ANSI C standard.)108 247.2 R .029
+(Backslash escape sequences, if present, are decoded as)5.029 F(follo)
+108 259.2 Q(ws:)-.25 E F1(\\a)144 271.2 Q F0(alert \(bell\))28.22 E F1
+(\\b)144 283.2 Q F0(backspace)27.66 E F1(\\e)144 295.2 Q F0
+(an escape character)28.78 E F1(\\f)144 307.2 Q F0(form feed)29.89 E F1
+(\\n)144 319.2 Q F0(ne)27.66 E 2.5(wl)-.25 G(ine)-2.5 E F1(\\r)144 331.2
+Q F0(carriage return)28.78 E F1(\\t)144 343.2 Q F0(horizontal tab)29.89
+E F1(\\v)144 355.2 Q F0 -.15(ve)28.22 G(rtical tab).15 E F1(\\\\)144
+367.2 Q F0(backslash)30.44 E F1(\\')144 379.2 Q F0(single quote)29.89 E
+F1(\\)144 391.2 Q F3(nnn)A F0(the eight-bit character whose v)18.22 E
+(alue is the octal v)-.25 E(alue)-.25 E F3(nnn)2.5 E F0
+(\(one to three digits\))2.5 E F1(\\x)144 403.2 Q F3(HH)A F0
+(the eight-bit character whose v)13.78 E(alue is the he)-.25 E
+(xadecimal v)-.15 E(alue)-.25 E F3(HH)2.5 E F0(\(one or tw)2.5 E 2.5(oh)
+-.1 G .3 -.15(ex d)-2.5 H(igits\)).15 E F1(\\c)144 415.2 Q F3(x)A F0 2.5
+(ac)24.34 G(ontrol-)-2.5 E F3(x)A F0(character)2.5 E(The e)108 432 Q(xp\
+anded result is single-quoted, as if the dollar sign had not been prese\
+nt.)-.15 E 2.985(Ad)108 448.8 S .485
+(ouble-quoted string preceded by a dollar sign \()-2.985 F F1($)A F0
+2.986(\)w)C .486(ill cause the string to be translated according to the)
+-2.986 F .118(current locale.)108 460.8 R .118(If the current locale is)
+5.118 F F1(C)2.618 E F0(or)2.618 E F1(POSIX)2.618 E F0 2.618(,t)C .117
+(he dollar sign is ignored.)-2.618 F .117
+(If the string is translated and)5.117 F
+(replaced, the replacement is double-quoted.)108 472.8 Q/F4 10.95
+/Times-Bold@0 SF -.81(PA)72 489.6 S(RAMETERS).81 E F0(A)108 501.6 Q F3
+(par)4.592 E(ameter)-.15 E F0 .842(is an entity that stores v)4.072 F
+3.342(alues. It)-.25 F .842(can be a)3.342 F F3(name)3.343 E F0 3.343
+(,an).18 G(umber)-3.343 E 3.343(,o)-.4 G 3.343(ro)-3.343 G .843
+(ne of the special characters)-3.343 F .823(listed belo)108 513.6 R
+3.323(wu)-.25 G(nder)-3.323 E F1 .823(Special P)3.323 F(arameters)-.1 E
+F0 5.823(.A)C F3(variable)-2.21 E F0 .823(is a parameter denoted by a)
+3.503 F F3(name)3.323 E F0 5.823(.A).18 G -.25(va)-2.5 G .823
+(riable has a).25 F F3(value)108 525.6 Q F0 .368(and zero or more)2.868
+F F3(attrib)2.868 E(utes)-.2 E F0 5.369(.A)C(ttrib)-5.369 E .369
+(utes are assigned using the)-.2 F F1(declar)2.869 E(e)-.18 E F0 -.2(bu)
+2.869 G .369(iltin command \(see).2 F F1(declar)2.869 E(e)-.18 E F0
+(belo)108 537.6 Q 2.5(wi)-.25 G(n)-2.5 E F2(SHELL B)2.5 E(UIL)-.09 E
+(TIN COMMANDS)-.828 E/F5 9/Times-Roman@0 SF(\).)A F0 2.755(Ap)108 554.4
+S .255(arameter is set if it has been assigned a v)-2.755 F 2.754
+(alue. The)-.25 F .254(null string is a v)2.754 F .254(alid v)-.25 F
+2.754(alue. Once)-.25 F 2.754(av)2.754 G .254(ariable is set, it)-3.004
+F(may be unset only by using the)108 566.4 Q F1(unset)2.5 E F0 -.2(bu)
+2.5 G(iltin command \(see).2 E F2(SHELL B)2.5 E(UIL)-.09 E(TIN COMMANDS)
+-.828 E F0(belo)2.25 E(w\).)-.25 E(A)108 583.2 Q F3(variable)2.79 E F0
+(may be assigned to by a statement of the form)2.68 E F3(name)144 600 Q
+F0(=[)A F3(value)A F0(])A(If)108 616.8 Q F3(value)3.022 E F0 .232
+(is not gi)2.912 F -.15(ve)-.25 G .232(n, the v).15 F .232
+(ariable is assigned the null string.)-.25 F(All)5.233 E F3(values)3.023
+E F0(under)3.003 E .233(go tilde e)-.18 F .233(xpansion, parameter)-.15
+F .515(and v)108 628.8 R .515(ariable e)-.25 F .515
+(xpansion, command substitution, arithmetic e)-.15 F .515
+(xpansion, and quote remo)-.15 F -.25(va)-.15 G 3.015(l\().25 G(see)
+-3.015 E F2(EXP)3.015 E(ANSION)-.666 E F0(belo)108 640.8 Q 2.698
+(w\). If)-.25 F .198(the v)2.698 F .198(ariable has its)-.25 F F1
+(integer)2.698 E F0(attrib)2.698 E .198(ute set, then)-.2 F F3(value)
+2.988 E F0 .198(is e)2.878 F -.25(va)-.25 G .199
+(luated as an arithmetic e).25 F .199(xpression e)-.15 F -.15(ve)-.25 G
+(n).15 E .902(if the $\(\(...\)\) e)108 652.8 R .902
+(xpansion is not used \(see)-.15 F F1 .901(Arithmetic Expansion)3.401 F
+F0(belo)3.401 E 3.401(w\). W)-.25 F .901
+(ord splitting is not performed,)-.8 F 1.178(with the e)108 664.8 R
+1.178(xception of)-.15 F F1("$@")3.678 E F0 1.178(as e)3.678 F 1.179
+(xplained belo)-.15 F 3.679(wu)-.25 G(nder)-3.679 E F1 1.179(Special P)
+3.679 F(arameters)-.1 E F0 6.179(.P)C 1.179(athname e)-6.329 F 1.179
+(xpansion is not)-.15 F 3.649(performed. Assignment)108 676.8 R 1.149
+(statements may also appear as ar)3.649 F 1.148(guments to the)-.18 F F1
+(alias)3.648 E F0(,)A F1(declar)3.648 E(e)-.18 E F0(,)A F1(typeset)3.648
+E F0(,)A F1(export)3.648 E F0(,)A F1 -.18(re)108 688.8 S(adonly).18 E F0
+2.5(,a)C(nd)-2.5 E F1(local)2.5 E F0 -.2(bu)2.5 G(iltin commands.).2 E
+F1 -.2(Po)87 705.6 S(sitional P).2 E(arameters)-.1 E F0(A)108 717.6 Q F3
+.705(positional par)4.455 F(ameter)-.15 E F0 .706(is a parameter denote\
+d by one or more digits, other than the single digit 0.)3.935 F(Posi-)
+5.706 E .445(tional parameters are assigned from the shell')108 729.6 R
+2.944(sa)-.55 G -.18(rg)-2.944 G .444(uments when it is in).18 F -.2(vo)
+-.4 G -.1(ke).2 G .444(d, and may be reassigned using).1 F(GNU Bash-3.0)
+72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 202.965(37)-2.5 G 0 Cg EP
+%%Page: 8 8
+%%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(the)108 84 Q/F1 10/Times-Bold@0 SF(set)3.333 E F0 -.2(bu)3.333 G
+.833(iltin command.).2 F .834(Positional parameters may not be assigned\
+ to with assignment statements.)5.833 F(The)5.834 E .334(positional par\
+ameters are temporarily replaced when a shell function is e)108 96 R
+-.15(xe)-.15 G .333(cuted \(see).15 F/F2 9/Times-Bold@0 SF(FUNCTIONS)
+2.833 E F0(belo)2.583 E(w\).)-.25 E 1.403(When a positional parameter c\
+onsisting of more than a single digit is e)108 112.8 R 1.404
+(xpanded, it must be enclosed in)-.15 F(braces \(see)108 124.8 Q F2(EXP)
+2.5 E(ANSION)-.666 E F0(belo)2.25 E(w\).)-.25 E F1(Special P)87 141.6 Q
+(arameters)-.1 E F0 1.675(The shell treats se)108 153.6 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 165.6 Q(wed.)-.25 E F1(*)108 177.6 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 189.6 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 201.6 R F2(IFS)2.503 E F0 .003(special v)2.253 F
+2.503(ariable. That)-.25 F .003(is, ")2.503 F F1($*)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 F1
+($1)A/F3 10/Times-Italic@0 SF(c)A F1($2)A F3(c)A F1(...)A F0 .003
+(", where)B F3(c)2.703 E F0 .004(is the \214rst char)2.813 F(-)-.2 E
+.769(acter of the v)144 213.6 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 225.6 Q F0(is null, the parameters are joined without interv)
+2.25 E(ening separators.)-.15 E F1(@)108 237.6 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 249.6 R .114(xpands to a separate w)
+-.15 F 2.614(ord. That)-.1 F .113(is, ")2.613 F F1($@)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 F1
+($1)A F0 2.613("")C F1($2)-2.613 E F0 2.613(".)C(..)-2.613 E .032
+(When there are no positional parameters, ")144 261.6 R F1($@)A F0 2.532
+("a)C(nd)-2.532 E F1($@)2.532 E F0 -.15(ex)2.532 G .032
+(pand to nothing \(i.e., the).15 F 2.532(ya)-.15 G .032(re remo)-2.532 F
+-.15(ve)-.15 G(d\).).15 E F1(#)108 273.6 Q F0
+(Expands to the number of positional parameters in decimal.)31 E F1(?)
+108 285.6 Q F0(Expands to the status of the most recently e)31 E -.15
+(xe)-.15 G(cuted fore).15 E(ground pipeline.)-.15 E F1<ad>108 297.6 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 309.6 Q F1<ad69>2.5 E F0(option\).)2.5 E F1($)108 321.6 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 333.6 Q F1(!)108 345.6 Q F0
+(Expands to the process ID of the most recently e)32.67 E -.15(xe)-.15 G
+(cuted background \(asynchronous\) command.).15 E F1(0)108 357.6 Q F0
+1.692(Expands to the name of the shell or shell script.)31 F 1.691
+(This is set at shell initialization.)6.692 F(If)6.691 E F1(bash)4.191 E
+F0(is)4.191 E(in)144 369.6 Q -.2(vo)-.4 G -.1(ke).2 G 3.077(dw).1 G .577
+(ith a \214le of commands,)-3.077 F F1($0)3.077 E F0 .578
+(is set to the name of that \214le.)3.077 F(If)5.578 E F1(bash)3.078 E
+F0 .578(is started with the)3.078 F F1<ad63>3.078 E F0 .369
+(option, then)144 381.6 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.368 E
+(-)-.2 E(wise, it is set to the \214le name used to in)144 393.6 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 405.6 Q F0 .1(At shell startup, set to the absolute \214le nam\
+e of the shell or shell script being e)31 F -.15(xe)-.15 G .1
+(cuted as passed in).15 F 1.706(the ar)144 417.6 R 1.706(gument list.)
+-.18 F(Subsequently)6.706 E 4.206(,e)-.65 G 1.705(xpands to the last ar)
+-4.356 F 1.705(gument to the pre)-.18 F 1.705(vious command, after)-.25
+F -.15(ex)144 429.6 S 2.515(pansion. Also).15 F .016
+(set to the full \214le name of each command e)2.515 F -.15(xe)-.15 G
+.016(cuted and placed in the en).15 F(vironment)-.4 E -.15(ex)144 441.6
+S 1.006(ported to that command.).15 F 1.006
+(When checking mail, this parameter holds the name of the mail \214le)
+6.006 F(currently being check)144 453.6 Q(ed.)-.1 E F1(Shell V)87 470.4
+Q(ariables)-.92 E F0(The follo)108 482.4 Q(wing v)-.25 E
+(ariables are set by the shell:)-.25 E F1 -.3(BA)108 499.2 S(SH).3 E F0
+(Expands to the full \214le name 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 511.2
+S(SH_ARGC).3 E F0 1.039(An array v)144 523.2 R 1.039(ariable whose v)
+-.25 F 1.039
+(alues are the number of parameters in each frame of the current bash)
+-.25 F -.15(exe)144 535.2 S .535(cution call stack.).15 F .535(The numb\
+er of parameters to the current subroutine \(shell function or script)
+5.535 F -.15(exe)144 547.2 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(parameters passed is pushed onto)144 559.2 Q
+F1 -.3(BA)2.5 G(SH_ARGC).3 E F0(.)A F1 -.3(BA)108 571.2 S(SH_ARGV).3 E
+F0 1.092(An array v)144 583.2 R 1.091
+(ariable containing all of the parameters in the current bash e)-.25 F
+-.15(xe)-.15 G 1.091(cution call stack.).15 F(The)6.091 E .275(\214nal \
+parameter of the last subroutine call is at the top of the stack; the \
+\214rst parameter of the initial)144 595.2 R 1.424
+(call is at the bottom.)144 607.2 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 F1 -.3(BA)144 619.2 S(SH_ARGV).3 E F0(.)A F1 -.3(BA)108 631.2 S
+(SH_COMMAND).3 E F0 1.242(The command currently being e)144 643.2 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
+655.2 Q -.15(xe)-.15 G(cuting at the time of the trap.).15 E F1 -.3(BA)
+108 667.2 S(SH_EXECUTION_STRING).3 E F0(The command ar)144 679.2 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 691.2 S(SH_LINENO).3 E F0 .034
+(An array v)144 703.2 R .034(ariable whose members are the line numbers\
+ in source \214les corresponding to each mem-)-.25 F .53(ber of @v)144
+715.2 R(ar{FUNCN)-.25 E(AME}.)-.35 E F1(${B)5.53 E(ASH_LINENO[)-.3 E F3
+($i)A F1(]})A F0 .53(is the line number in the source \214le where)3.03
+F F1(${FUNCN)144 727.2 Q(AME[)-.2 E F3 8.951($i + 1)B F1(]})A F0 -.1(wa)
+11.451 G 11.451(sc).1 G 11.451(alled. The)-11.451 F 8.951
+(corresponding source \214le name is)11.451 F(GNU Bash-3.0)72 768 Q
+(2003 No)147.975 E 2.5(v1)-.15 G 202.965(38)-2.5 G 0 Cg EP
+%%Page: 9 9
+%%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(${B)144 84 Q(ASH_SOURCE[)-.3 E/F2 10
+/Times-Italic@0 SF($i + 1)A F1 2.5(]}. Use)B(LINENO to obtain the curr)
+2.5 E(ent line number)-.18 E(.)-1 E -.3(BA)108 96 S(SH_REMA).3 E(TCH)
+-.95 E F0 .005(An array v)144 108 R .005
+(ariable whose members are assigned by the)-.25 F F1(=~)2.506 E F0 .006
+(binary operator to the)2.506 F F1([[)2.506 E F0 .006(conditional com-)
+2.506 F 2.507(mand. The)144 120 R .007(element with inde)2.507 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 .006(gular e)
+-.15 F(xpression.)-.15 E .997(The element with inde)144 132 R(x)-.15 E
+F2(n)3.497 E F0 .997(is the portion of the string matching the)3.497 F
+F2(n)3.498 E F0 .998(th parenthesized sube)B(xpres-)-.15 E 2.5
+(sion. This)144 144 R -.25(va)2.5 G(riable is read-only).25 E(.)-.65 E
+F1 -.3(BA)108 156 S(SH_SOURCE).3 E F0 .89(An array v)144 168 R .889(ari\
+able whose members are the source \214lenames corresponding to the elem\
+ents in the)-.25 F F1(FUNCN)144 180 Q(AME)-.2 E F0(array v)2.5 E
+(ariable.)-.25 E F1 -.3(BA)108 192 S(SH_SUBSHELL).3 E F0 .401
+(Incremented by one each time a subshell or subshell en)144 204 R .401
+(vironment is spa)-.4 F 2.902(wned. The)-.15 F .402(initial v)2.902 F
+.402(alue is)-.25 F(0.)144 216 Q F1 -.3(BA)108 228 S(SH_VERSINFO).3 E F0
+2.645(Ar)144 240 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 252 S
+(lues assigned to the array members are as follo).25 E(ws:)-.25 E F1 -.3
+(BA)144 270 S(SH_VERSINFO[).3 E F0(0)A F1(])A F0(The major v)24.74 E
+(ersion number \(the)-.15 E F2 -.37(re)2.5 G(lease).37 E F0(\).)A F1 -.3
+(BA)144 282 S(SH_VERSINFO[).3 E F0(1)A F1(])A F0(The minor v)24.74 E
+(ersion number \(the)-.15 E F2(ver)2.5 E(sion)-.1 E F0(\).)A F1 -.3(BA)
+144 294 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 306 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 318 S
+(SH_VERSINFO[).3 E F0(4)A F1(])A F0(The release status \(e.g.,)24.74 E
+F2(beta1)2.5 E F0(\).)A F1 -.3(BA)144 330 S(SH_VERSINFO[).3 E F0(5)A F1
+(])A F0(The v)24.74 E(alue of)-.25 E F1(MA)2.5 E(CHTYPE)-.55 E F0(.)A F1
+-.3(BA)108 346.8 S(SH_VERSION).3 E F0
+(Expands to a string describing the v)144 358.8 Q
+(ersion of this instance of)-.15 E F1(bash)2.5 E F0(.)A F1(COMP_CW)108
+375.6 Q(ORD)-.1 E F0 .396(An inde)144 387.6 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 399.6 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 411.6 Q(ogrammable Completion)-.18
+E F0(belo)2.5 E(w\).)-.25 E F1(COMP_LINE)108 428.4 Q F0 1.207
+(The current command line.)144 440.4 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 452.4 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 464.4 Q(w\).)-.25 E F1(COMP_POINT)108 481.2 Q F0 .666
+(The inde)144 493.2 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
+505.2 R .534(alue of this v)-.25 F .534(ariable is equal to)-.25 F F1
+(${#COMP_LINE})144 517.2 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 529.2 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_W)108
+546 Q(ORDBREAKS)-.1 E F0 1.284
+(The set of characters that the Readline library treats as w)144 558 R
+1.283(ord separators when performing w)-.1 F(ord)-.1 E 3.125
+(completion. If)144 570 R/F3 9/Times-Bold@0 SF(COMP_W)3.125 E(ORDBREAKS)
+-.09 E F0 .626(is unset, it loses its special properties, e)2.875 F -.15
+(ve)-.25 G 3.126(ni).15 G 3.126(fi)-3.126 G 3.126(ti)-3.126 G 3.126(ss)
+-3.126 G(ubse-)-3.126 E(quently reset.)144 582 Q F1(COMP_W)108 598.8 Q
+(ORDS)-.1 E F0 .654(An array v)144 610.8 R .654(ariable \(see)-.25 F F1
+(Arrays)3.154 E F0(belo)3.154 E .654(w\) consisting of the indi)-.25 F
+.653(vidual w)-.25 F .653(ords in the current command)-.1 F 3.477
+(line. This)144 622.8 R -.25(va)3.477 G .977(riable is a).25 F -.25(va)
+-.2 G .978(ilable only in shell functions in).25 F -.2(vo)-.4 G -.1(ke)
+.2 G 3.478(db).1 G 3.478(yt)-3.478 G .978(he programmable completion)
+-3.478 F -.1(fa)144 634.8 S(cilities \(see).1 E F1(Pr)2.5 E
+(ogrammable Completion)-.18 E F0(belo)2.5 E(w\).)-.25 E F1(DIRST)108
+651.6 Q -.55(AC)-.9 G(K).55 E F0 2.26(An array v)144 663.6 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.094(Directories appear in the stack in the order the)144 675.6 R 3.594
+(ya)-.15 G 1.095(re displayed by the)-3.594 F F1(dirs)3.595 E F0 -.2(bu)
+3.595 G 3.595(iltin. Assigning).2 F(to)3.595 E 1.432
+(members of this array v)144 687.6 R 1.432
+(ariable may be used to modify directories already in the stack, b)-.25
+F 1.431(ut the)-.2 F F1(pushd)144 699.6 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 .351(will not change the current directory)144 711.6 R
+5.35(.I)-.65 G(f)-5.35 E F3(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.85
+(ni).15 G(f)-2.85 E(it is subsequently reset.)144 723.6 Q(GNU Bash-3.0)
+72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 202.965(39)-2.5 G 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/F1 10/Times-Bold@0 SF(EUID)108 84 Q F0 1.103(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.104
+(This v)6.103 F 1.104(ariable is)-.25 F(readonly)144 96 Q(.)-.65 E F1
+(FUNCN)108 112.8 Q(AME)-.2 E F0 .479(An array v)144 124.8 R .479
+(ariable containing the names of all shell functions currently in the e)
+-.25 F -.15(xe)-.15 G .478(cution call stack.).15 F .276
+(The element with inde)144 136.8 R 2.776(x0i)-.15 G 2.776(st)-2.776 G
+.276(he name of an)-2.776 F 2.777(yc)-.15 G(urrently-e)-2.777 E -.15(xe)
+-.15 G .277(cuting shell function.).15 F .277(The bottom-most)5.277 F
+.81(element is "main".)144 148.8 R .81(This v)5.81 F .81(ariable e)-.25
+F .81(xists only when a shell function is e)-.15 F -.15(xe)-.15 G 3.31
+(cuting. Assignments).15 F(to)3.31 E/F2 9/Times-Bold@0 SF(FUNCN)144
+160.8 Q(AME)-.18 E F0(ha)2.634 E .684 -.15(ve n)-.2 H 2.884(oe).15 G
+-.25(ff)-2.884 G .384(ect and return an error status.).25 F(If)5.385 E
+F2(FUNCN)2.885 E(AME)-.18 E F0 .385(is unset, it loses its special)2.635
+F(properties, e)144 172.8 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(GR)108 189.6 Q
+(OUPS)-.3 E F0 1.229(An array v)144 201.6 R 1.228(ariable containing th\
+e list of groups of which the current user is a member)-.25 F 6.228(.A)
+-.55 G(ssign-)-6.228 E .596(ments to)144 213.6 R F2(GR)3.096 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 225.6 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
+242.4 Q F0 .356(The history number)144 254.4 R 2.856(,o)-.4 G 2.856(ri)
+-2.856 G(nde)-2.856 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.855 E F0 .355(is unset, it)2.605 F
+(loses its special properties, e)144 266.4 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 283.2 Q(AME)-.2 E F0
+(Automatically set to the name of the current host.)144 295.2 Q F1
+(HOSTTYPE)108 312 Q F0 .222(Automatically set to a string that uniquely\
+ describes the type of machine on which)144 324 R F1(bash)2.723 E F0
+.223(is e)2.723 F -.15(xe)-.15 G(cut-).15 E 2.5(ing. The)144 336 R(def)
+2.5 E(ault is system-dependent.)-.1 E F1(LINENO)108 352.8 Q F0 1.408(Ea\
+ch time this parameter is referenced, the shell substitutes a decimal n\
+umber representing the)144 364.8 R .078(current sequential line number \
+\(starting with 1\) within a script or function.)144 376.8 R .079
+(When not in a script or)5.078 F .307(function, the v)144 388.8 R .307
+(alue substituted is not guaranteed to be meaningful.)-.25 F(If)5.306 E
+F2(LINENO)2.806 E F0 .306(is unset, it loses its)2.556 F
+(special properties, e)144 400.8 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
+417.6 Q(CHTYPE)-.55 E F0 .898(Automatically set to a string that fully \
+describes the system type on which)144 429.6 R F1(bash)3.398 E F0 .899
+(is e)3.398 F -.15(xe)-.15 G .899(cuting, in).15 F(the standard GNU)144
+441.6 Q/F3 10/Times-Italic@0 SF(cpu-company-system)2.5 E F0 2.5
+(format. The)2.5 F(def)2.5 E(ault is system-dependent.)-.1 E F1(OLDPWD)
+108 458.4 Q F0(The pre)144 470.4 Q(vious w)-.25 E
+(orking directory as set by the)-.1 E F1(cd)2.5 E F0(command.)2.5 E F1
+(OPT)108 487.2 Q(ARG)-.9 E F0 1.627(The v)144 499.2 R 1.627
+(alue of the last option ar)-.25 F 1.627(gument processed by the)-.18 F
+F1(getopts)4.127 E F0 -.2(bu)4.127 G 1.626(iltin command \(see).2 F F2
+(SHELL)4.126 E -.09(BU)144 511.2 S(IL).09 E(TIN COMMANDS)-.828 E F0
+(belo)2.25 E(w\).)-.25 E F1(OPTIND)108 528 Q F0 1.651(The inde)144 540 R
+4.151(xo)-.15 G 4.151(ft)-4.151 G 1.651(he ne)-4.151 F 1.651(xt ar)-.15
+F 1.652(gument to be processed by the)-.18 F F1(getopts)4.152 E F0 -.2
+(bu)4.152 G 1.652(iltin command \(see).2 F F2(SHELL)4.152 E -.09(BU)144
+552 S(IL).09 E(TIN COMMANDS)-.828 E F0(belo)2.25 E(w\).)-.25 E F1
+(OSTYPE)108 568.8 Q F0 .329(Automatically set to a string that describe\
+s the operating system on which)144 580.8 R F1(bash)2.829 E F0 .329
+(is e)2.829 F -.15(xe)-.15 G 2.829(cuting. The).15 F(def)144 592.8 Q
+(ault is system-dependent.)-.1 E F1(PIPEST)108 609.6 Q -.95(AT)-.9 G(US)
+.95 E F0 .61(An array v)144 621.6 R .61(ariable \(see)-.25 F F1(Arrays)
+3.11 E F0(belo)3.11 E .61(w\) containing a list of e)-.25 F .61
+(xit status v)-.15 F .61(alues from the processes in)-.25 F
+(the most-recently-e)144 633.6 Q -.15(xe)-.15 G(cuted fore).15 E
+(ground pipeline \(which may contain only a single command\).)-.15 E F1
+(PPID)108 650.4 Q F0(The process ID of the shell')12.67 E 2.5(sp)-.55 G
+2.5(arent. This)-2.5 F -.25(va)2.5 G(riable is readonly).25 E(.)-.65 E
+F1(PWD)108 667.2 Q F0(The current w)12.67 E
+(orking directory as set by the)-.1 E F1(cd)2.5 E F0(command.)2.5 E F1
+(RANDOM)108 684 Q F0 .566
+(Each time this parameter is referenced, a random inte)144 696 R .565
+(ger between 0 and 32767 is generated.)-.15 F(The)5.565 E .01
+(sequence of random numbers may be initialized by assigning a v)144 708
+R .01(alue to)-.25 F F2(RANDOM)2.51 E/F4 9/Times-Roman@0 SF(.)A F0(If)
+4.51 E F2(RANDOM)2.51 E F0(is)2.26 E
+(unset, it loses its special properties, e)144 720 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(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(31)
+-2.5 G(0)-197.965 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(REPL)108 84 Q(Y)-.92 E F0
+(Set to the line of input read by the)144 96 Q F1 -.18(re)2.5 G(ad).18 E
+F0 -.2(bu)2.5 G(iltin command when no ar).2 E(guments are supplied.)-.18
+E F1(SECONDS)108 112.8 Q F0 .795(Each time this parameter is referenced\
+, the number of seconds since shell in)144 124.8 R -.2(vo)-.4 G .795
+(cation is returned.).2 F .712(If a v)144 136.8 R .712
+(alue is assigned to)-.25 F/F2 9/Times-Bold@0 SF(SECONDS)3.212 E/F3 9
+/Times-Roman@0 SF(,)A F0 .712(the v)2.962 F .712
+(alue returned upon subsequent references is the number)-.25 F .408
+(of seconds since the assignment plus the v)144 148.8 R .408
+(alue assigned.)-.25 F(If)5.408 E F2(SECONDS)2.908 E F0 .407
+(is unset, it loses its special)2.658 F(properties, e)144 160.8 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(SHELLOPTS)108 177.6 Q F0 3.262(Ac)144
+189.6 S .763(olon-separated list of enabled shell options.)-3.262 F .763
+(Each w)5.763 F .763(ord in the list is a v)-.1 F .763(alid ar)-.25 F
+.763(gument for the)-.18 F F1<ad6f>144 201.6 Q F0 1.174(option to the)
+3.674 F F1(set)3.674 E F0 -.2(bu)3.674 G 1.174(iltin command \(see).2 F
+F2 1.173(SHELL B)3.673 F(UIL)-.09 E 1.173(TIN COMMANDS)-.828 F F0(belo)
+3.423 E 3.673(w\). The)-.25 F(options)3.673 E .019(appearing in)144
+213.6 R F2(SHELLOPTS)2.519 E F0 .019(are those reported as)2.269 F/F4 10
+/Times-Italic@0 SF(on)2.749 E F0(by)2.759 E F1 .019(set \255o)2.519 F F0
+5.019(.I)C 2.519(ft)-5.019 G .019(his v)-2.519 F .02
+(ariable is in the en)-.25 F(vironment)-.4 E(when)144 225.6 Q F1(bash)
+3.142 E F0 .642(starts up, each shell option in the list will be enable\
+d before reading an)3.142 F 3.141(ys)-.15 G .641(tartup \214les.)-3.141
+F(This v)144 237.6 Q(ariable is read-only)-.25 E(.)-.65 E F1(SHL)108
+254.4 Q(VL)-.92 E F0(Incremented by one each time an instance of)144
+266.4 Q F1(bash)2.5 E F0(is started.)2.5 E F1(UID)108 283.2 Q F0
+(Expands to the user ID of the current user)17.67 E 2.5(,i)-.4 G
+(nitialized at shell startup.)-2.5 E(This v)5 E(ariable is readonly)-.25
+E(.)-.65 E .993(The follo)108 300 R .993(wing v)-.25 F .994
+(ariables are used by the shell.)-.25 F .994(In some cases,)5.994 F F1
+(bash)3.494 E F0 .994(assigns a def)3.494 F .994(ault v)-.1 F .994
+(alue to a v)-.25 F(ariable;)-.25 E(these cases are noted belo)108 312 Q
+-.65(w.)-.25 G F1 -.3(BA)108 328.8 S(SH_ENV).3 E F0 .506
+(If this parameter is set when)144 340.8 R F1(bash)3.006 E F0 .506(is e)
+3.006 F -.15(xe)-.15 G .505(cuting a shell script, its v).15 F .505
+(alue is interpreted as a \214lename)-.25 F .354
+(containing commands to initialize the shell, as in)144 352.8 R F4
+(~/.bashr)2.855 E(c)-.37 E F0 5.355(.T).31 G .355(he v)-5.355 F .355
+(alue of)-.25 F F2 -.27(BA)2.855 G(SH_ENV).27 E F0 .355(is subjected)
+2.605 F .525(to parameter e)144 364.8 R .525
+(xpansion, command substitution, and arithmetic e)-.15 F .525
+(xpansion before being interpreted)-.15 F(as a \214le name.)144 376.8 Q
+F2 -.666(PA)5 G(TH)-.189 E F0
+(is not used to search for the resultant \214le name.)2.25 E F1(CDP)108
+388.8 Q -.95(AT)-.74 G(H).95 E F0 1.247(The search path for the)144
+400.8 R F1(cd)3.747 E F0 3.747(command. This)3.747 F 1.248
+(is a colon-separated list of directories in which the)3.747 F 3.796
+(shell looks for destination directories speci\214ed by the)144 412.8 R
+F1(cd)6.295 E F0 6.295(command. A)6.295 F 3.795(sample v)6.295 F 3.795
+(alue is)-.25 F/F5 10/Courier@0 SF(".:~:/usr")144 424.8 Q F0(.)A F1
+(COLUMNS)108 436.8 Q F0 .425(Used by the)144 448.8 R F1(select)2.925 E
+F0 -.2(bu)2.925 G .425(iltin command to determine the terminal width wh\
+en printing selection lists.).2 F
+(Automatically set upon receipt of a SIGWINCH.)144 460.8 Q F1(COMPREPL)
+108 472.8 Q(Y)-.92 E F0 .848(An array v)144 484.8 R .848
+(ariable from which)-.25 F F1(bash)3.348 E F0 .848
+(reads the possible completions generated by a shell function)3.348 F
+(in)144 496.8 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(acility \(see)-.1 E F1(Pr)2.5 E
+(ogrammable Completion)-.18 E F0(belo)2.5 E(w\).)-.25 E F1(EMA)108 508.8
+Q(CS)-.55 E F0(If)144 520.8 Q F1(bash)2.535 E F0 .035(\214nds this v)
+2.535 F .035(ariable in the en)-.25 F .036
+(vironment when the shell starts with v)-.4 F(alue)-.25 E F5(t)2.536 E
+F0 2.536(,i)C 2.536(ta)-2.536 G .036(ssumes that the)-2.536 F
+(shell is running in an emacs shell b)144 532.8 Q(uf)-.2 E
+(fer and disables line editing.)-.25 E F1(FCEDIT)108 544.8 Q F0(The def)
+144 556.8 Q(ault editor for the)-.1 E F1(fc)2.5 E F0 -.2(bu)2.5 G
+(iltin command.).2 E F1(FIGNORE)108 568.8 Q F0 2.599(Ac)144 580.8 S .098
+(olon-separated list of suf)-2.599 F<8c78>-.25 E .098
+(es to ignore when performing \214lename completion \(see)-.15 F F2
+(READLINE)2.598 E F0(belo)144 592.8 Q 2.704(w\). A)-.25 F .204
+(\214lename whose suf)2.704 F .205(\214x matches one of the entries in)
+-.25 F F2(FIGNORE)2.705 E F0 .205(is e)2.455 F .205
+(xcluded from the list)-.15 F(of matched \214lenames.)144 604.8 Q 2.5
+(As)5 G(ample v)-2.5 E(alue is)-.25 E F5(".o:~")2.5 E F0(.)A F1
+(GLOBIGNORE)108 616.8 Q F0 3.118(Ac)144 628.8 S .618(olon-separated lis\
+t of patterns de\214ning the set of \214lenames to be ignored by pathna\
+me e)-3.118 F(xpan-)-.15 E 3.131(sion. If)144 640.8 R 3.132<618c>3.131 G
+.632(lename matched by a pathname e)-3.132 F .632
+(xpansion pattern also matches one of the patterns in)-.15 F F2
+(GLOBIGNORE)144 652.8 Q F3(,)A F0(it is remo)2.25 E -.15(ve)-.15 G 2.5
+(df).15 G(rom the list of matches.)-2.5 E F1(HISTCONTR)108 664.8 Q(OL)
+-.3 E F0 2.654(Ac)144 676.8 S .153(olon-separated list of v)-2.654 F
+.153(alues controlling ho)-.25 F 2.653(wc)-.25 G .153(ommands are sa)
+-2.653 F -.15(ve)-.2 G 2.653(do).15 G 2.653(nt)-2.653 G .153
+(he history list.)-2.653 F .153(If the list)5.153 F .49(of v)144 688.8 R
+.49(alues includes)-.25 F F4(ignor)2.99 E(espace)-.37 E F0 2.99(,l).18 G
+.49(ines which be)-2.99 F .491(gin with a)-.15 F F1(space)2.991 E F0
+.491(character are not sa)2.991 F -.15(ve)-.2 G 2.991(di).15 G 2.991(nt)
+-2.991 G .491(he his-)-2.991 F .558(tory list.)144 700.8 R 3.058(Av)
+5.558 G .558(alue of)-3.308 F F4(ignor)3.068 E(edups)-.37 E F0 .558
+(causes lines matching the pre)3.328 F .557
+(vious history entry to not be sa)-.25 F -.15(ve)-.2 G(d.).15 E 2.958
+(Av)144 712.8 S .458(alue of)-3.208 F F4(ignor)2.968 E(eboth)-.37 E F0
+.458(is shorthand for)3.238 F F4(ignor)2.959 E(espace)-.37 E F0(and)
+2.959 E F4(ignor)2.959 E(edups)-.37 E F0 5.459(.A)C -.25(va)-2.5 G .459
+(lue of).25 F F4(er)2.959 E(asedups)-.15 E F0(causes)2.959 E .699
+(all pre)144 724.8 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-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(31)-2.5 G
+(1)-197.965 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(sa)144 84 Q -.15(ve)-.2 G 4.296(d. An).15 F 4.296(yv)-.15 G 1.797
+(alue not in the abo)-4.546 F 2.097 -.15(ve l)-.15 H 1.797
+(ist is ignored.).15 F(If)6.797 E/F1 10/Times-Bold@0 SF(HISTCONTR)4.297
+E(OL)-.3 E F0 1.797(is unset, or does not)4.297 F .613(include a v)144
+96 R .612(alid v)-.25 F .612
+(alue, all lines read by the shell parser are sa)-.25 F -.15(ve)-.2 G
+3.112(do).15 G 3.112(nt)-3.112 G .612(he history list, subject to the)
+-3.112 F -.25(va)144 108 S .985(lue of).25 F F1(HISTIGNORE)3.485 E F0
+5.986(.T)C .986
+(he second and subsequent lines of a multi-line compound command)-5.986
+F(are not tested, and are added to the history re)144 120 Q -.05(ga)-.15
+G(rdless of the v).05 E(alue of)-.25 E F1(HISTCONTR)2.5 E(OL)-.3 E F0(.)
+A F1(HISTFILE)108 132 Q F0 .181
+(The name of the \214le in which command history is sa)144 144 R -.15
+(ve)-.2 G 2.681(d\().15 G(see)-2.681 E/F2 9/Times-Bold@0 SF(HIST)2.681 E
+(OR)-.162 E(Y)-.315 E F0(belo)2.431 E 2.681(w\). The)-.25 F(def)2.681 E
+.181(ault v)-.1 F(alue)-.25 E(is)144 156 Q/F3 10/Times-Italic@0 SF
+(~/.bash_history)2.5 E F0 5(.I)C 2.5(fu)-5 G
+(nset, the command history is not sa)-2.5 E -.15(ve)-.2 G 2.5(dw).15 G
+(hen an interacti)-2.5 E .3 -.15(ve s)-.25 H(hell e).15 E(xits.)-.15 E
+F1(HISTFILESIZE)108 168 Q F0 1.622
+(The maximum number of lines contained in the history \214le.)144 180 R
+1.623(When this v)6.623 F 1.623(ariable is assigned a)-.25 F -.25(va)144
+192 S .311(lue, the history \214le is truncated, if necessary).25 F
+2.811(,t)-.65 G 2.811(oc)-2.811 G .311
+(ontain no more than that number of lines.)-2.811 F(The)5.311 E(def)144
+204 Q .386(ault v)-.1 F .386(alue is 500.)-.25 F .387(The history \214l\
+e is also truncated to this size after writing it when an interac-)5.386
+F(ti)144 216 Q .3 -.15(ve s)-.25 H(hell e).15 E(xits.)-.15 E F1
+(HISTIGNORE)108 228 Q F0 2.658(Ac)144 240 S .158(olon-separated list of\
+ patterns used to decide which command lines should be sa)-2.658 F -.15
+(ve)-.2 G 2.657(do).15 G 2.657(nt)-2.657 G .157(he his-)-2.657 F .707
+(tory list.)144 252 R .707(Each pattern is anchored at the be)5.707 F
+.708(ginning of the line and must match the complete line)-.15 F .626
+(\(no implicit `)144 264 R F1(*)A F0 3.126('i)C 3.126(sa)-3.126 G 3.126
+(ppended\). Each)-3.126 F .626(pattern is tested ag)3.126 F .625
+(ainst the line after the checks speci\214ed by)-.05 F F1(HISTCONTR)144
+276 Q(OL)-.3 E F0 1.154(are applied.)3.654 F 1.154
+(In addition to the normal shell pattern matching characters, `)6.154 F
+F1(&)A F0(')A 2.515(matches the pre)144 288 R 2.515(vious history line.)
+-.25 F(`)7.514 E F1(&)A F0 5.014('m)C 2.514
+(ay be escaped using a backslash; the backslash is)-5.014 F(remo)144 300
+Q -.15(ve)-.15 G 3.352(db).15 G .852(efore attempting a match.)-3.352 F
+.852(The second and subsequent lines of a multi-line compound)5.852 F
+(command are not tested, and are added to the history re)144 312 Q -.05
+(ga)-.15 G(rdless of the v).05 E(alue of)-.25 E F1(HISTIGNORE)2.5 E F0
+(.)A F1(HISTSIZE)108 324 Q F0 1.942
+(The number of commands to remember in the command history \(see)144 336
+R F2(HIST)4.442 E(OR)-.162 E(Y)-.315 E F0(belo)4.192 E 4.442(w\). The)
+-.25 F(def)144 348 Q(ault v)-.1 E(alue is 500.)-.25 E F1(HISTTIMEFORMA)
+108 360 Q(T)-.95 E F0 .951(If this v)144 372 R .951
+(ariable is set and not null, its v)-.25 F .952
+(alue is used as a format string for)-.25 F F3(strftime)3.452 E F0 .952
+(\(3\) to print the)B .673
+(time stamp associated with each history entry displayed by the)144 384
+R F1(history)3.173 E F0 -.2(bu)3.172 G 3.172(iltin. If).2 F .672(this v)
+3.172 F .672(ariable is)-.25 F
+(set, time stamps are written to the history \214le so the)144 396 Q 2.5
+(ym)-.15 G(ay be preserv)-2.5 E(ed across shell sessions.)-.15 E F1
+(HOME)108 408 Q F0 1.27(The home directory of the current user; the def)
+144 420 R 1.27(ault ar)-.1 F 1.27(gument for the)-.18 F F1(cd)3.77 E F0
+-.2(bu)3.77 G 1.27(iltin command.).2 F(The)6.27 E -.25(va)144 432 S
+(lue of this v).25 E(ariable is also used when performing tilde e)-.25 E
+(xpansion.)-.15 E F1(HOSTFILE)108 444 Q F0 1.015
+(Contains the name of a \214le in the same format as)144 456 R F3
+(/etc/hosts)5.181 E F0 1.015(that should be read when the shell)5.181 F
+.55(needs to complete a hostname.)144 468 R .551
+(The list of possible hostname completions may be changed while)5.551 F
+1.059(the shell is running; the ne)144 480 R 1.059
+(xt time hostname completion is attempted after the v)-.15 F 1.058
+(alue is changed,)-.25 F F1(bash)144 492 Q F0 .715
+(adds the contents of the ne)3.215 F 3.215<778c>-.25 G .715(le to the e)
+-3.215 F .715(xisting list.)-.15 F(If)5.716 E F2(HOSTFILE)3.216 E F0
+.716(is set, b)2.966 F .716(ut has no v)-.2 F(alue,)-.25 E F1(bash)144
+504 Q F0 2.236(attempts to read)4.736 F F3(/etc/hosts)6.401 E F0 2.235
+(to obtain the list of possible hostname completions.)6.401 F(When)7.235
+E F2(HOSTFILE)144 516 Q F0(is unset, the hostname list is cleared.)2.25
+E F1(IFS)108 528 Q F0(The)20.44 E F3 .555(Internal F)3.635 F .555
+(ield Separ)-.45 F(ator)-.15 E F0 .555(that is used for w)3.785 F .556
+(ord splitting after e)-.1 F .556(xpansion and to split lines into)-.15
+F -.1(wo)144 540 S(rds with the).1 E F1 -.18(re)2.5 G(ad).18 E F0 -.2
+(bu)2.5 G(iltin command.).2 E(The def)5 E(ault v)-.1 E(alue is `)-.25 E
+(`<space><tab><ne)-.74 E(wline>')-.25 E('.)-.74 E F1(IGNOREEOF)108 552 Q
+F0 .503(Controls the action of an interacti)144 564 R .803 -.15(ve s)
+-.25 H .503(hell on receipt of an).15 F F2(EOF)3.003 E F0 .503
+(character as the sole input.)2.753 F .503(If set,)5.503 F .426(the v)
+144 576 R .426(alue is the number of consecuti)-.25 F -.15(ve)-.25 G F2
+(EOF)3.076 E F0 .426
+(characters which must be typed as the \214rst characters)2.676 F .303
+(on an input line before)144 588 R F1(bash)2.802 E F0 -.15(ex)2.802 G
+2.802(its. If).15 F .302(the v)2.802 F .302(ariable e)-.25 F .302
+(xists b)-.15 F .302(ut does not ha)-.2 F .602 -.15(ve a n)-.2 H .302
+(umeric v).15 F .302(alue, or has)-.25 F(no v)144 600 Q(alue, the def)
+-.25 E(ault v)-.1 E(alue is 10.)-.25 E(If it does not e)5 E(xist,)-.15 E
+F2(EOF)2.5 E F0(signi\214es the end of input to the shell.)2.25 E F1
+(INPUTRC)108 612 Q F0 1.435(The \214lename for the)144 624 R F1 -.18(re)
+3.936 G(adline).18 E F0 1.436(startup \214le, o)3.936 F -.15(ve)-.15 G
+1.436(rriding the def).15 F 1.436(ault of)-.1 F F3(~/.inputr)5.602 E(c)
+-.37 E F0(\(see)5.602 E F2(READLINE)3.936 E F0(belo)144 636 Q(w\).)-.25
+E F1(LANG)108 648 Q F0 1.24(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.239
+(gory not speci\214cally selected with a v)-.15 F(ariable)-.25 E
+(starting with)144 660 Q F1(LC_)2.5 E F0(.)A F1(LC_ALL)108 672 Q F0 .764
+(This v)144 684 R .764(ariable o)-.25 F -.15(ve)-.15 G .764
+(rrides the v).15 F .764(alue of)-.25 F F1(LANG)3.264 E F0 .764(and an)
+3.264 F 3.264(yo)-.15 G(ther)-3.264 E F1(LC_)3.264 E F0 -.25(va)3.264 G
+.764(riable specifying a locale cate-).25 F(gory)144 696 Q(.)-.65 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(31)-2.5 G
+(2)-197.965 E 0 Cg EP
+%%Page: 13 13
+%%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(LC_COLLA)108 84 Q(TE)-.95 E F0 .412(This v)
+144 96 R .412(ariable determines the collation order used when sorting \
+the results of pathname e)-.25 F(xpansion,)-.15 E 1.464
+(and determines the beha)144 108 R 1.464(vior of range e)-.2 F 1.465
+(xpressions, equi)-.15 F -.25(va)-.25 G 1.465
+(lence classes, and collating sequences).25 F(within pathname e)144 120
+Q(xpansion and pattern matching.)-.15 E F1(LC_CTYPE)108 132 Q F0 1.936
+(This v)144 144 R 1.936
+(ariable determines the interpretation of characters and the beha)-.25 F
+1.935(vior of character classes)-.2 F(within pathname e)144 156 Q
+(xpansion and pattern matching.)-.15 E F1(LC_MESSA)108 168 Q(GES)-.55 E
+F0(This v)144 180 Q(ariable determines the locale used to translate dou\
+ble-quoted strings preceded by a)-.25 E F1($)2.5 E F0(.)A F1(LC_NUMERIC)
+108 192 Q F0(This v)144 204 Q(ariable determines the locale cate)-.25 E
+(gory used for number formatting.)-.15 E F1(LINES)108 216 Q F0 1.218
+(Used by the)5.99 F F1(select)3.718 E F0 -.2(bu)3.718 G 1.219(iltin com\
+mand to determine the column length for printing selection lists.).2 F
+(Automatically set upon receipt of a SIGWINCH.)144 228 Q F1(MAIL)108 240
+Q F0 .188(If this parameter is set to a \214le name and the)8.78 F/F2 9
+/Times-Bold@0 SF(MAILP)2.687 E -.855(AT)-.666 G(H).855 E F0 -.25(va)
+2.437 G .187(riable is not set,).25 F F1(bash)2.687 E F0 .187
+(informs the user)2.687 F(of the arri)144 252 Q -.25(va)-.25 G 2.5(lo)
+.25 G 2.5(fm)-2.5 G(ail in the speci\214ed \214le.)-2.5 E F1(MAILCHECK)
+108 264 Q F0 .098(Speci\214es ho)144 276 R 2.598(wo)-.25 G .098
+(ften \(in seconds\))-2.598 F F1(bash)2.598 E F0 .098(checks for mail.)
+2.598 F .098(The def)5.098 F .098(ault is 60 seconds.)-.1 F .099
+(When it is time)5.099 F .224(to check for mail, the shell does so befo\
+re displaying the primary prompt.)144 288 R .223(If this v)5.223 F .223
+(ariable is unset,)-.25 F .066(or set to a v)144 300 R .066(alue that i\
+s not a number greater than or equal to zero, the shell disables mail c\
+hecking.)-.25 F F1(MAILP)108 312 Q -.95(AT)-.74 G(H).95 E F0 2.815(Ac)
+144 324 S .314(olon-separated list of \214le names to be check)-2.815 F
+.314(ed for mail.)-.1 F .314(The message to be printed when mail)5.314 F
+(arri)144 336 Q -.15(ve)-.25 G 3.42(si).15 G 3.42(nap)-3.42 G .92(artic\
+ular \214le may be speci\214ed by separating the \214le name from the m\
+essage with a)-3.42 F 2.808(`?'. When)144 348 R .308(used in the te)
+2.808 F .308(xt of the message,)-.15 F F1($_)2.808 E F0 -.15(ex)2.808 G
+.308(pands to the name of the current mail\214le.).15 F(Exam-)5.307 E
+(ple:)144 360 Q F1(MAILP)144 372 Q -.95(AT)-.74 G(H).95 E F0(='/v)A
+(ar/mail/bfox?"Y)-.25 E(ou ha)-1.1 E .3 -.15(ve m)-.2 H
+(ail":~/shell\255mail?"$_ has mail!"').15 E F1(Bash)144 384 Q F0 .388
+(supplies a def)2.888 F .388(ault v)-.1 F .388(alue for this v)-.25 F
+.388(ariable, b)-.25 F .389
+(ut the location of the user mail \214les that it uses is)-.2 F
+(system dependent \(e.g., /v)144 396 Q(ar/mail/)-.25 E F1($USER)A F0
+(\).)A F1(OPTERR)108 408 Q F0 .39(If set to the v)144 420 R .39(alue 1,)
+-.25 F F1(bash)2.89 E F0 .389(displays error messages generated by the)
+2.889 F F1(getopts)2.889 E F0 -.2(bu)2.889 G .389(iltin command \(see).2
+F F2 .359(SHELL B)144 432 R(UIL)-.09 E .359(TIN COMMANDS)-.828 F F0
+(belo)2.609 E(w\).)-.25 E F2(OPTERR)5.359 E F0 .36
+(is initialized to 1 each time the shell is in)2.609 F -.2(vo)-.4 G -.1
+(ke).2 G(d).1 E(or a shell script is e)144 444 Q -.15(xe)-.15 G(cuted.)
+.15 E F1 -.74(PA)108 456 S(TH)-.21 E F0 .588
+(The search path for commands.)9.91 F .587
+(It is a colon-separated list of directories in which the shell looks)
+5.588 F .471(for commands \(see)144 468 R F2 .471(COMMAND EXECUTION)
+2.971 F F0(belo)2.722 E 2.972(w\). A)-.25 F .472
+(zero-length \(null\) directory name in the)2.972 F -.25(va)144 480 S
+.345(lue of).25 F F1 -.74(PA)2.845 G(TH)-.21 E F0 .345
+(indicates the current directory)2.845 F 5.345(.A)-.65 G .344
+(null directory name may appear as tw)-2.5 F 2.844(oa)-.1 G(djacent)
+-2.844 E .867(colons, or as an initial or trailing colon.)144 492 R .868
+(The def)5.868 F .868(ault path is system-dependent, and is set by the)
+-.1 F 26.329(administrator who installs)144 504 R F1(bash)28.829 E F0
+31.329(.A)C 26.328(common v)-2.501 F 26.328(alue is)-.25 F/F3 10
+/Courier@0 SF(/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin)144 516
+Q F0(.)A F1(POSIXL)108 528 Q(Y_CORRECT)-.92 E F0 .471(If this v)144 540
+R .471(ariable is in the en)-.25 F .471(vironment when)-.4 F F1(bash)
+2.971 E F0 .471(starts, the shell enters)2.971 F/F4 10/Times-Italic@0 SF
+.472(posix mode)2.972 F F0 .472(before reading)2.972 F .011
+(the startup \214les, as if the)144 552 R F1(\255\255posix)2.511 E F0
+(in)2.511 E -.2(vo)-.4 G .011(cation option had been supplied.).2 F .011
+(If it is set while the shell is)5.011 F(running,)144 564 Q F1(bash)2.5
+E F0(enables)2.5 E F4(posix mode)2.5 E F0 2.5(,a)C 2.5(si)-2.5 G 2.5(ft)
+-2.5 G(he command)-2.5 E F3(set -o posix)2.5 E F0(had been e)2.5 E -.15
+(xe)-.15 G(cuted.).15 E F1(PR)108 576 Q(OMPT_COMMAND)-.3 E F0
+(If set, the v)144 588 Q(alue is e)-.25 E -.15(xe)-.15 G
+(cuted as a command prior to issuing each primary prompt.).15 E F1(PS1)
+108 600 Q F0 .064(The v)19.33 F .065(alue of this parameter is e)-.25 F
+.065(xpanded \(see)-.15 F F2(PR)2.565 E(OMPTING)-.27 E F0(belo)2.315 E
+.065(w\) and used as the primary prompt)-.25 F 2.5(string. The)144 612 R
+(def)2.5 E(ault v)-.1 E(alue is `)-.25 E(`)-.74 E F1(\\s\255\\v\\$)A F0
+-.74('')2.5 G(.).74 E F1(PS2)108 624 Q F0 .005(The v)19.33 F .005
+(alue of this parameter is e)-.25 F .005(xpanded as with)-.15 F F1(PS1)
+2.505 E F0 .004(and used as the secondary prompt string.)2.505 F(The)
+5.004 E(def)144 636 Q(ault is `)-.1 E(`)-.74 E F1(>)A F0 -.74('')2.5 G
+(.).74 E F1(PS3)108 648 Q F0 1.115(The v)19.33 F 1.115
+(alue of this parameter is used as the prompt for the)-.25 F F1(select)
+3.615 E F0 1.116(command \(see)3.616 F F2 1.116(SHELL GRAM-)3.616 F(MAR)
+144 660 Q F0(abo)2.25 E -.15(ve)-.15 G(\).).15 E F1(PS4)108 672 Q F0
+1.099(The v)19.33 F 1.099(alue of this parameter is e)-.25 F 1.099
+(xpanded as with)-.15 F F1(PS1)3.599 E F0 1.099(and the v)3.599 F 1.098
+(alue is printed before each com-)-.25 F(mand)144 684 Q F1(bash)3.725 E
+F0 1.225(displays during an e)3.725 F -.15(xe)-.15 G 1.225
+(cution trace.).15 F 1.226(The \214rst character of)6.225 F F2(PS4)3.726
+E F0 1.226(is replicated multiple)3.476 F(times, as necessary)144 696 Q
+2.5(,t)-.65 G 2.5(oi)-2.5 G(ndicate multiple le)-2.5 E -.15(ve)-.25 G
+(ls of indirection.).15 E(The def)5 E(ault is `)-.1 E(`)-.74 E F1(+)A F0
+-.74('')2.5 G(.).74 E(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)
+-.15 G 197.965(31)-2.5 G(3)-197.965 E 0 Cg EP
+%%Page: 14 14
+%%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(TIMEFORMA)108 84 Q(T)-.95 E F0 .827(The v)
+144 96 R .826
+(alue of this parameter is used as a format string specifying ho)-.25 F
+3.326(wt)-.25 G .826(he timing information for)-3.326 F .648
+(pipelines pre\214x)144 108 R .648(ed with the)-.15 F F1(time)3.148 E F0
+(reserv)3.148 E .648(ed w)-.15 F .649(ord should be displayed.)-.1 F
+(The)5.649 E F1(%)3.149 E F0 .649(character introduces)3.149 F .712
+(an escape sequence that is e)144 120 R .711(xpanded to a time v)-.15 F
+.711(alue or other information.)-.25 F .711(The escape sequences)5.711 F
+(and their meanings are as follo)144 132 Q
+(ws; the braces denote optional portions.)-.25 E F1(%%)144 150 Q F0 2.5
+(Al)30 G(iteral)-2.5 E F1(%)2.5 E F0(.)A F1(%[)144 162 Q/F2 10
+/Times-Italic@0 SF(p)A F1(][l]R)A F0(The elapsed time in seconds.)11.68
+E F1(%[)144 174 Q F2(p)A F1(][l]U)A F0
+(The number of CPU seconds spent in user mode.)11.68 E F1(%[)144 186 Q
+F2(p)A F1(][l]S)A F0(The number of CPU seconds spent in system mode.)
+13.34 E F1(%P)144 198 Q F0
+(The CPU percentage, computed as \(%U + %S\) / %R.)33.89 E .87
+(The optional)144 214.8 R F2(p)3.37 E F0 .87(is a digit specifying the)
+3.37 F F2(pr)3.37 E(ecision)-.37 E F0 3.37(,t)C .87
+(he number of fractional digits after a decimal)-3.37 F 2.526(point. A)
+144 226.8 R -.25(va)2.526 G .025
+(lue of 0 causes no decimal point or fraction to be output.).25 F .025
+(At most three places after the)5.025 F .537
+(decimal point may be speci\214ed; v)144 238.8 R .537(alues of)-.25 F F2
+(p)3.037 E F0 .537(greater than 3 are changed to 3.)3.037 F(If)5.538 E
+F2(p)3.038 E F0 .538(is not speci\214ed,)3.038 F(the v)144 250.8 Q
+(alue 3 is used.)-.25 E .668(The optional)144 267.6 R F1(l)3.168 E F0
+.668(speci\214es a longer format, including minutes, of the form)3.168 F
+F2(MM)3.168 E F0(m)A F2(SS)A F0(.)A F2(FF)A F0 3.167(s. The)B -.25(va)
+3.167 G(lue).25 E(of)144 279.6 Q F2(p)2.5 E F0
+(determines whether or not the fraction is included.)2.5 E 13.364
+(If this v)144 296.4 R 13.364(ariable is not set,)-.25 F F1(bash)15.865
+E F0 13.365(acts as if it had the v)15.865 F(alue)-.25 E F1($'\\nr)144
+308.4 Q(eal\\t%3lR\\nuser\\t%3lU\\nsys%3lS')-.18 E F0 5.031(.I)C 2.531
+(ft)-5.031 G .031(he v)-2.531 F .031
+(alue is null, no timing information is displayed.)-.25 F 2.5(At)144
+320.4 S(railing ne)-2.5 E
+(wline is added when the format string is displayed.)-.25 E F1(TMOUT)108
+337.2 Q F0 .717(If set to a v)144 349.2 R .717(alue greater than zero,)
+-.25 F F1(TMOUT)3.217 E F0 .717(is treated as the def)3.217 F .718
+(ault timeout for the)-.1 F F1 -.18(re)3.218 G(ad).18 E F0 -.2(bu)3.218
+G(iltin.).2 E(The)144 361.2 Q F1(select)2.542 E F0 .042
+(command terminates if input does not arri)2.542 F .342 -.15(ve a)-.25 H
+(fter).15 E F1(TMOUT)2.542 E F0 .042(seconds when input is com-)2.542 F
+.885(ing from a terminal.)144 373.2 R .885(In an interacti)5.885 F 1.185
+-.15(ve s)-.25 H .885(hell, the v).15 F .886
+(alue is interpreted as the number of seconds to)-.25 F -.1(wa)144 385.2
+S .546(it for input after issuing the primary prompt.).1 F F1(Bash)5.546
+E F0 .546(terminates after w)3.046 F .546(aiting for that number of)-.1
+F(seconds if input does not arri)144 397.2 Q -.15(ve)-.25 G(.).15 E F1
+(auto_r)108 414 Q(esume)-.18 E F0 .53(This v)144 426 R .53
+(ariable controls ho)-.25 F 3.03(wt)-.25 G .531
+(he shell interacts with the user and job control.)-3.03 F .531
+(If this v)5.531 F .531(ariable is set,)-.25 F .539(single w)144 438 R
+.538(ord simple commands without redirections are treated as candidates\
+ for resumption of an)-.1 F -.15(ex)144 450 S .366(isting stopped job)
+.15 F 5.366(.T)-.4 G .366(here is no ambiguity allo)-5.366 F .366
+(wed; if there is more than one job be)-.25 F .367(ginning with)-.15 F
+1.125(the string typed, the job most recently accessed is selected.)144
+462 R(The)6.125 E F2(name)3.985 E F0 1.124(of a stopped job, in this)
+3.805 F(conte)144 474 Q 1.132(xt, is the command line used to start it.)
+-.15 F 1.133(If set to the v)6.133 F(alue)-.25 E F2 -.2(ex)3.633 G(act)
+.2 E F0 3.633(,t).68 G 1.133(he string supplied must)-3.633 F .625
+(match the name of a stopped job e)144 486 R .624(xactly; if set to)-.15
+F F2(substring)3.124 E F0 3.124(,t).22 G .624
+(he string supplied needs to match a)-3.124 F .884
+(substring of the name of a stopped job)144 498 R 5.884(.T)-.4 G(he)
+-5.884 E F2(substring)3.724 E F0 -.25(va)3.604 G .885(lue pro).25 F .885
+(vides functionality analogous to)-.15 F(the)144 510 Q F1(%?)3.334 E F0
+.834(job identi\214er \(see)5.834 F/F3 9/Times-Bold@0 SF .834(JOB CONTR)
+3.334 F(OL)-.27 E F0(belo)3.084 E 3.334(w\). If)-.25 F .834(set to an)
+3.334 F 3.334(yo)-.15 G .834(ther v)-3.334 F .833
+(alue, the supplied string)-.25 F .314
+(must be a pre\214x of a stopped job')144 522 R 2.814(sn)-.55 G .314
+(ame; this pro)-2.814 F .314(vides functionality analogous to the)-.15 F
+F1(%)2.814 E F0 .315(job iden-)2.815 F(ti\214er)144 534 Q(.)-.55 E F1
+(histchars)108 550.8 Q F0 2.07(The tw)144 562.8 R 4.57(oo)-.1 G 4.57(rt)
+-4.57 G 2.07(hree characters which control history e)-4.57 F 2.07
+(xpansion and tok)-.15 F 2.07(enization \(see)-.1 F F3(HIST)4.569 E(OR)
+-.162 E(Y)-.315 E(EXP)144 574.8 Q(ANSION)-.666 E F0(belo)3.465 E 3.715
+(w\). The)-.25 F 1.215(\214rst character is the)3.715 F F2 1.216
+(history e)3.715 F(xpansion)-.2 E F0(character)3.716 E 3.716(,t)-.4 G
+1.216(he character which)-3.716 F .798(signals the start of a history e)
+144 586.8 R .798(xpansion, normally `)-.15 F F1(!)A F0 3.298('. The)B
+.798(second character is the)3.298 F F2(quic)3.298 E 3.298(ks)-.2 G
+(ubstitu-)-3.298 E(tion)144 598.8 Q F0(character)2.739 E 2.739(,w)-.4 G
+.239(hich is used as shorthand for re-running the pre)-2.739 F .24
+(vious command entered, substitut-)-.25 F .576
+(ing one string for another in the command.)144 610.8 R .575(The def)
+5.575 F .575(ault is `)-.1 F F1(^)A F0 3.075('. The)B .575
+(optional third character is the)3.075 F .223(character which indicates\
+ that the remainder of the line is a comment when found as the \214rst \
+char)144 622.8 R(-)-.2 E 1.294(acter of a w)144 634.8 R 1.294
+(ord, normally `)-.1 F F1(#)A F0 3.794('. The)B 1.293
+(history comment character causes history substitution to be)3.794 F
+.379(skipped for the remaining w)144 646.8 R .379(ords on the line.)-.1
+F .38(It does not necessarily cause the shell parser to treat)5.379 F
+(the rest of the line as a comment.)144 658.8 Q F1(Arrays)87 675.6 Q
+(Bash)108 687.6 Q F0(pro)2.958 E .458(vides one-dimensional array v)-.15
+F 2.958(ariables. An)-.25 F 2.958(yv)-.15 G .458
+(ariable may be used as an array; the)-3.208 F F1(declar)2.958 E(e)-.18
+E F0 -.2(bu)2.958 G(iltin).2 E .96(will e)108 699.6 R .96
+(xplicitly declare an array)-.15 F 5.96(.T)-.65 G .961
+(here is no maximum limit on the size of an array)-5.96 F 3.461(,n)-.65
+G .961(or an)-3.461 F 3.461(yr)-.15 G(equirement)-3.461 E
+(that members be inde)108 711.6 Q -.15(xe)-.15 G 2.5(do).15 G 2.5(ra)
+-2.5 G(ssigned contiguously)-2.5 E 5(.A)-.65 G(rrays are inde)-5 E -.15
+(xe)-.15 G 2.5(du).15 G(sing inte)-2.5 E(gers and are zero-based.)-.15 E
+1.302(An array is created automatically if an)108 728.4 R 3.801(yv)-.15
+G 1.301(ariable is assigned to using the syntax)-4.051 F F2(name)3.801 E
+F0([)A F2(subscript)A F0(]=)A F2(value)A F0(.)A(GNU Bash-3.0)72 768 Q
+(2003 No)147.975 E 2.5(v1)-.15 G 197.965(31)-2.5 G(4)-197.965 E 0 Cg EP
+%%Page: 15 15
+%%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(The)108 84 Q/F1 10/Times-Italic@0 SF(subscript)3.181 E F0 .341
+(is treated as an arithmetic e)3.521 F .342(xpression that must e)-.15 F
+-.25(va)-.25 G .342(luate to a number greater than or equal to).25 F
+4.077(zero. T)108 96 R 4.077(oe)-.8 G 1.577(xplicitly declare an array)
+-4.227 F 4.077(,u)-.65 G(se)-4.077 E/F2 10/Times-Bold@0 SF(declar)4.077
+E 4.077<65ad>-.18 G(a)-4.077 E F1(name)4.077 E F0(\(see)4.077 E/F3 9
+/Times-Bold@0 SF 1.577(SHELL B)4.077 F(UIL)-.09 E 1.576(TIN COMMANDS)
+-.828 F F0(belo)3.826 E(w\).)-.25 E F2(declar)108 108 Q 3.375<65ad>-.18
+G(a)-3.375 E F1(name)3.375 E F2([)A F1(subscript)A F2(])A F0 .875
+(is also accepted; the)3.375 F F1(subscript)3.375 E F0 .875(is ignored.)
+3.375 F(Attrib)5.875 E .876(utes may be speci\214ed for an)-.2 F
+(array v)108 120 Q(ariable using the)-.25 E F2(declar)2.5 E(e)-.18 E F0
+(and)2.5 E F2 -.18(re)2.5 G(adonly).18 E F0 -.2(bu)2.5 G 2.5
+(iltins. Each).2 F(attrib)2.5 E(ute applies to all members of an array)
+-.2 E(.)-.65 E 1.647
+(Arrays are assigned to using compound assignments of the form)108 136.8
+R F1(name)4.147 E F0(=)A F2(\()A F0 -.25(va)C(lue).25 E F1(1)A F0 1.647
+(... v)4.147 F(alue)-.25 E F1(n)A F2(\))A F0 4.147(,w)C 1.647(here each)
+-4.147 F F1(value)108 148.8 Q F0 .65(is of the form [)3.15 F F1
+(subscript)A F0(]=)A F1(string)A F0 5.65(.O)C(nly)-5.65 E F1(string)3.15
+E F0 .65(is required.)3.15 F .65(If the optional brack)5.65 F .65
+(ets and subscript are)-.1 F .277(supplied, that inde)108 160.8 R 2.777
+(xi)-.15 G 2.777(sa)-2.777 G .277(ssigned to; otherwise the inde)-2.777
+F 2.777(xo)-.15 G 2.777(ft)-2.777 G .276
+(he element assigned is the last inde)-2.777 F 2.776(xa)-.15 G .276
+(ssigned to)-2.776 F 1.393(by the statement plus one.)108 172.8 R(Inde)
+6.393 E 1.393(xing starts at zero.)-.15 F 1.394
+(This syntax is also accepted by the)6.394 F F2(declar)3.894 E(e)-.18 E
+F0 -.2(bu)3.894 G(iltin.).2 E(Indi)108 184.8 Q
+(vidual array elements may be assigned to using the)-.25 E F1(name)2.5 E
+F0([)A F1(subscript)A F0(]=)A F1(value)A F0(syntax introduced abo)2.5 E
+-.15(ve)-.15 G(.).15 E(An)108 201.6 Q 3.576(ye)-.15 G 1.076
+(lement of an array may be referenced using ${)-3.576 F F1(name)A F0([)A
+F1(subscript)A F0 3.575(]}. The)B 1.075(braces are required to a)3.575 F
+-.2(vo)-.2 G(id).2 E 1.541(con\215icts with pathname e)108 213.6 R 4.041
+(xpansion. If)-.15 F F1(subscript)4.041 E F0(is)4.041 E F2(@)4.041 E F0
+(or)4.041 E F2(*)4.041 E F0 4.041(,t)C 1.541(he w)-4.041 F 1.541(ord e)
+-.1 F 1.541(xpands to all members of)-.15 F F1(name)4.042 E F0(.)A 1.057
+(These subscripts dif)108 225.6 R 1.057(fer only when the w)-.25 F 1.057
+(ord appears within double quotes.)-.1 F 1.056(If the w)6.056 F 1.056
+(ord is double-quoted,)-.1 F(${)108 237.6 Q F1(name)A F0 .52([*]} e)B
+.52(xpands to a single w)-.15 F .52(ord with the v)-.1 F .521
+(alue of each array member separated by the \214rst character)-.25 F
+1.375(of the)108 249.6 R F3(IFS)3.875 E F0 1.375(special v)3.625 F 1.375
+(ariable, and ${)-.25 F F1(name)A F0 1.375([@]} e)B 1.375
+(xpands each element of)-.15 F F1(name)3.875 E F0 1.374(to a separate w)
+3.875 F 3.874(ord. When)-.1 F 1.003(there are no array members, ${)108
+261.6 R F1(name)A F0 1.004([@]} e)B 1.004(xpands to nothing.)-.15 F
+1.004(This is analogous to the e)6.004 F 1.004(xpansion of the)-.15 F
+.694(special parameters)108 273.6 R F2(*)3.194 E F0(and)3.194 E F2(@)
+3.194 E F0(\(see)3.194 E F2 .694(Special P)3.194 F(arameters)-.1 E F0
+(abo)3.194 E -.15(ve)-.15 G 3.194(\). ${#).15 F F1(name)A F0([)A F1
+(subscript)A F0 .694(]} e)B .693(xpands to the length)-.15 F .154(of ${)
+108 285.6 R F1(name)A F0([)A F1(subscript)A F0 2.654(]}. If)B F1
+(subscript)2.654 E F0(is)2.654 E F2(*)2.654 E F0(or)2.654 E F2(@)2.654 E
+F0 2.654(,t)C .154(he e)-2.654 F .155
+(xpansion is the number of elements in the array)-.15 F 5.155(.R)-.65 G
+(efer)-5.155 E(-)-.2 E(encing an array v)108 297.6 Q
+(ariable without a subscript is equi)-.25 E -.25(va)-.25 G
+(lent to referencing element zero.).25 E(The)108 314.4 Q F2(unset)2.767
+E F0 -.2(bu)2.767 G .267(iltin is used to destro).2 F 2.767(ya)-.1 G
+(rrays.)-2.767 E F2(unset)5.267 E F1(name)2.767 E F0([)A F1(subscript)A
+F0 2.767(]d)C(estro)-2.767 E .267(ys the array element at inde)-.1 F(x)
+-.15 E F1(sub-)2.766 E(script)108 326.4 Q F0(.)A F2(unset)5.3 E F1(name)
+2.8 E F0 2.8(,w)C(here)-2.8 E F1(name)2.8 E F0 .3(is an array)2.8 F
+2.801(,o)-.65 G(r)-2.801 E F2(unset)2.801 E F1(name)2.801 E F0([)A F1
+(subscript)A F0 .301(], where)B F1(subscript)2.801 E F0(is)2.801 E F2(*)
+2.801 E F0(or)2.801 E F2(@)2.801 E F0 2.801(,r)C(emo)-2.801 E -.15(ve)
+-.15 G(s).15 E(the entire array)108 338.4 Q(.)-.65 E(The)108 355.2 Q F2
+(declar)3.671 E(e)-.18 E F0(,)A F2(local)3.671 E F0 3.671(,a)C(nd)-3.671
+E F2 -.18(re)3.671 G(adonly).18 E F0 -.2(bu)3.671 G 1.171
+(iltins each accept a).2 F F2<ad61>3.671 E F0 1.17
+(option to specify an array)3.671 F 6.17(.T)-.65 G(he)-6.17 E F2 -.18
+(re)3.67 G(ad).18 E F0 -.2(bu)3.67 G(iltin).2 E .44(accepts a)108 367.2
+R F2<ad61>2.941 E F0 .441(option to assign a list of w)2.941 F .441
+(ords read from the standard input to an array)-.1 F 5.441(.T)-.65 G(he)
+-5.441 E F2(set)2.941 E F0(and)2.941 E F2(declar)2.941 E(e)-.18 E F0 -.2
+(bu)108 379.2 S(iltins display array v).2 E(alues in a w)-.25 E
+(ay that allo)-.1 E(ws them to be reused as assignments.)-.25 E/F4 10.95
+/Times-Bold@0 SF(EXP)72 396 Q(ANSION)-.81 E F0 .76(Expansion is perform\
+ed on the command line after it has been split into w)108 408 R 3.26
+(ords. There)-.1 F .76(are se)3.26 F -.15(ve)-.25 G 3.26(nk).15 G .76
+(inds of)-3.26 F -.15(ex)108 420 S .369(pansion performed:).15 F F1(br)
+2.869 E .369(ace e)-.15 F(xpansion)-.2 E F0(,).24 E F1 .369(tilde e)
+2.869 F(xpansion)-.2 E F0(,).24 E F1(par)2.869 E .369
+(ameter and variable e)-.15 F(xpansion)-.2 E F0(,).24 E F1 .37
+(command sub-)2.869 F(stitution)108 432 Q F0(,).24 E F1(arithmetic e)2.5
+E(xpansion)-.2 E F0(,).24 E F1(wor)2.5 E 2.5(ds)-.37 G(plitting)-2.5 E
+F0 2.5(,a).22 G(nd)-2.5 E F1(pathname e)2.5 E(xpansion)-.2 E F0(.).24 E
+.471(The order of e)108 448.8 R .471(xpansions is: brace e)-.15 F .471
+(xpansion, tilde e)-.15 F .471(xpansion, parameter)-.15 F 2.971(,v)-.4 G
+.47(ariable and arithmetic e)-3.221 F(xpansion)-.15 E
+(and command substitution \(done in a left-to-right f)108 460.8 Q
+(ashion\), w)-.1 E(ord splitting, and pathname e)-.1 E(xpansion.)-.15 E
+(On systems that can support it, there is an additional e)108 477.6 Q
+(xpansion a)-.15 E -.25(va)-.2 G(ilable:).25 E F1(pr)2.5 E
+(ocess substitution)-.45 E F0(.)A 1.486(Only brace e)108 494.4 R 1.486
+(xpansion, w)-.15 F 1.486(ord splitting, and pathname e)-.1 F 1.487
+(xpansion can change the number of w)-.15 F 1.487(ords of the)-.1 F -.15
+(ex)108 506.4 S 1.165(pansion; other e).15 F 1.165(xpansions e)-.15 F
+1.165(xpand a single w)-.15 F 1.165(ord to a single w)-.1 F 3.665
+(ord. The)-.1 F 1.164(only e)3.665 F 1.164(xceptions to this are the)
+-.15 F -.15(ex)108 518.4 S(pansions of ").15 E F2($@)A F0 2.5("a)C(nd ")
+-2.5 E F2(${)A F1(name)A F2([@]})A F0 2.5("a)C 2.5(se)-2.5 G
+(xplained abo)-2.65 E .3 -.15(ve \()-.15 H(see).15 E F3 -.666(PA)2.5 G
+(RAMETERS).666 E/F5 9/Times-Roman@0 SF(\).)A F2(Brace Expansion)87 535.2
+Q F1(Br)108.58 547.2 Q .606(ace e)-.15 F(xpansion)-.2 E F0 .606
+(is a mechanism by which arbitrary strings may be generated.)3.346 F
+.606(This mechanism is similar)5.606 F(to)108 559.2 Q F1 .415
+(pathname e)2.915 F(xpansion)-.2 E F0 2.915(,b)C .415
+(ut the \214lenames generated need not e)-3.115 F 2.915(xist. P)-.15 F
+.415(atterns to be brace e)-.15 F .415(xpanded tak)-.15 F 2.915(et)-.1 G
+(he)-2.915 E .151(form of an optional)108 571.2 R F1(pr)2.651 E(eamble)
+-.37 E F0 2.651(,f).18 G(ollo)-2.651 E .151
+(wed by either a series of comma-separated strings or a sequence e)-.25
+F(xpres-)-.15 E .563(sion between a pair of braces, follo)108 583.2 R
+.563(wed by an optional)-.25 F F1(postscript)3.063 E F0 5.563(.T).68 G
+.563(he preamble is pre\214x)-5.563 F .563(ed to each string)-.15 F .659
+(contained within the braces, and the postscript is then appended to ea\
+ch resulting string, e)108 595.2 R .659(xpanding left to)-.15 F(right.)
+108 607.2 Q .719(Brace e)108 624 R .719(xpansions may be nested.)-.15 F
+.719(The results of each e)5.719 F .719
+(xpanded string are not sorted; left to right order is)-.15 F(preserv)
+108 636 Q 2.5(ed. F)-.15 F(or e)-.15 E(xample, a)-.15 E F2({)A F0(d,c,b)
+A F2(})A F0 2.5(ee)C(xpands into `ade ace abe'.)-2.65 E 3.133(As)108
+652.8 S .633(equence e)-3.133 F .633(xpression tak)-.15 F .633
+(es the form)-.1 F F2({)3.133 E F1(x)A F2(..)A F1(y)A F2(})A F0 3.133
+(,w)C(here)-3.133 E F1(x)3.133 E F0(and)3.134 E F1(y)3.134 E F0 .634
+(are either inte)3.134 F .634(gers or single characters.)-.15 F(When)
+5.634 E(inte)108 664.8 Q .402(gers are supplied, the e)-.15 F .402
+(xpression e)-.15 F .401(xpands to each number between)-.15 F F1(x)2.901
+E F0(and)2.901 E F1(y)2.901 E F0 2.901(,i)C(nclusi)-2.901 E -.15(ve)-.25
+G 5.401(.W).15 G .401(hen characters)-5.401 F .687(are supplied, the e)
+108 676.8 R .688(xpression e)-.15 F .688(xpands to each character le)
+-.15 F .688(xicographically between)-.15 F F1(x)3.188 E F0(and)3.188 E
+F1(y)3.188 E F0 3.188(,i)C(nclusi)-3.188 E -.15(ve)-.25 G 5.688(.N).15 G
+(ote)-5.688 E(that both)108 688.8 Q F1(x)2.5 E F0(and)2.5 E F1(y)2.5 E
+F0(must be of the same type.)2.5 E .582(Brace e)108 705.6 R .582
+(xpansion is performed before an)-.15 F 3.082(yo)-.15 G .581(ther e)
+-3.082 F .581(xpansions, and an)-.15 F 3.081(yc)-.15 G .581
+(haracters special to other e)-3.081 F(xpansions)-.15 E .015
+(are preserv)108 717.6 R .015(ed in the result.)-.15 F .015
+(It is strictly te)5.015 F(xtual.)-.15 E F2(Bash)5.016 E F0 .016
+(does not apply an)2.516 F 2.516(ys)-.15 G .016
+(yntactic interpretation to the con-)-2.516 F(te)108 729.6 Q
+(xt of the e)-.15 E(xpansion or the te)-.15 E(xt between the braces.)
+-.15 E(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(31)
+-2.5 G(5)-197.965 E 0 Cg EP
+%%Page: 16 16
+%%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 3.633(Ac)108 84 S 1.133(orrectly-formed brace e)-3.633 F 1.132(x\
+pansion must contain unquoted opening and closing braces, and at least \
+one)-.15 F 3.44(unquoted comma or a v)108 96 R 3.441(alid sequence e)
+-.25 F 5.941(xpression. An)-.15 F 5.941(yi)-.15 G 3.441
+(ncorrectly formed brace e)-5.941 F 3.441(xpansion is left)-.15 F 2.755
+(unchanged. A)108 108 R/F1 10/Times-Bold@0 SF({)2.755 E F0(or)2.755 E F1
+(,)2.755 E F0 .255(may be quoted with a backslash to pre)2.755 F -.15
+(ve)-.25 G .255(nt its being considered part of a brace e).15 F(xpres-)
+-.15 E 2.91(sion. T)108 120 R 2.91(oa)-.8 G -.2(vo)-3.11 G .41
+(id con\215icts with parameter e).2 F .411(xpansion, the string)-.15 F
+F1(${)2.911 E F0 .411(is not considered eligible for brace e)2.911 F
+(xpan-)-.15 E(sion.)108 132 Q 1.476(This construct is typically used as\
+ shorthand when the common pre\214x of the strings to be generated is)
+108 148.8 R(longer than in the abo)108 160.8 Q .3 -.15(ve ex)-.15 H
+(ample:).15 E(mkdir /usr/local/src/bash/{old,ne)144 177.6 Q -.65(w,)-.25
+G(dist,b).65 E(ugs})-.2 E(or)108 189.6 Q(cho)144 201.6 Q
+(wn root /usr/{ucb/{e)-.25 E(x,edit},lib/{e)-.15 E(x?.?*,ho)-.15 E(w_e)
+-.25 E(x}})-.15 E .618(Brace e)108 218.4 R .618
+(xpansion introduces a slight incompatibility with historical v)-.15 F
+.618(ersions of)-.15 F F1(sh)3.118 E F0(.)A F1(sh)5.618 E F0 .618
+(does not treat open-)3.118 F .248
+(ing or closing braces specially when the)108 230.4 R 2.748(ya)-.15 G
+.247(ppear as part of a w)-2.748 F .247(ord, and preserv)-.1 F .247
+(es them in the output.)-.15 F F1(Bash)5.247 E F0(remo)108 242.4 Q -.15
+(ve)-.15 G 3.53(sb).15 G 1.03(races from w)-3.53 F 1.03
+(ords as a consequence of brace e)-.1 F 3.53(xpansion. F)-.15 F 1.03
+(or e)-.15 F 1.03(xample, a w)-.15 F 1.03(ord entered to)-.1 F F1(sh)
+3.53 E F0(as)3.53 E/F2 10/Times-Italic@0 SF(\214le{1,2})108 254.4 Q F0
+.515(appears identically in the output.)3.015 F .515(The same w)5.515 F
+.515(ord is output as)-.1 F F2 .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 .436
+(If strict compatibility with)108 266.4 R F1(sh)2.936 E F0 .436
+(is desired, start)2.936 F F1(bash)2.936 E F0 .436(with the)2.936 F F1
+(+B)2.936 E F0 .436(option or disable brace e)2.936 F .437
+(xpansion with the)-.15 F F1(+B)108 278.4 Q F0(option to the)2.5 E F1
+(set)2.5 E F0(command \(see)2.5 E/F3 9/Times-Bold@0 SF(SHELL B)2.5 E
+(UIL)-.09 E(TIN COMMANDS)-.828 E F0(belo)2.25 E(w\).)-.25 E F1 -.18(Ti)
+87 295.2 S(lde Expansion).18 E F0 1.087(If a w)108 307.2 R 1.087(ord be)
+-.1 F 1.087(gins with an unquoted tilde character \(`)-.15 F F1(~)A F0
+1.086('\), all of the characters preceding the \214rst unquoted)B .185(\
+slash \(or all characters, if there is no unquoted slash\) are consider\
+ed a)108 319.2 R F2(tilde-pr)2.685 E(e\214x)-.37 E F0 5.185(.I)C 2.685
+(fn)-5.185 G .185(one of the characters)-2.685 F .726(in the tilde-pre\
+\214x are quoted, the characters in the tilde-pre\214x follo)108 331.2 R
+.725(wing the tilde are treated as a possible)-.25 F F2(lo)108 343.2 Q
+.522(gin name)-.1 F F0 5.522(.I)C 3.022(ft)-5.522 G .522
+(his login name is the null string, the tilde is replaced with the v)
+-3.022 F .523(alue of the shell parameter)-.25 F F3(HOME)108 355.2 Q/F4
+9/Times-Roman@0 SF(.)A F0(If)4.787 E F3(HOME)2.787 E F0 .287
+(is unset, the home directory of the user e)2.537 F -.15(xe)-.15 G .286
+(cuting the shell is substituted instead.).15 F(Other)5.286 E(-)-.2 E(w\
+ise, the tilde-pre\214x is replaced with the home directory associated \
+with the speci\214ed login name.)108 367.2 Q .092
+(If the tilde-pre\214x is a `~+', the v)108 384 R .092
+(alue of the shell v)-.25 F(ariable)-.25 E F3(PWD)2.592 E F0 .092
+(replaces the tilde-pre\214x.)2.342 F .093(If the tilde-pre\214x is)
+5.093 F 3.404(a`)108 396 S .904(~\255', the v)-3.404 F .904
+(alue of the shell v)-.25 F(ariable)-.25 E F3(OLDPWD)3.404 E F4(,)A F0
+.904(if it is set, is substituted.)3.154 F .903(If the characters follo)
+5.903 F .903(wing the)-.25 F 1.641
+(tilde in the tilde-pre\214x consist of a number)108 408 R F2(N)4.141 E
+F0 4.142(,o)C 1.642(ptionally pre\214x)-4.142 F 1.642
+(ed by a `+' or a `\255', the tilde-pre\214x is)-.15 F 1.438(replaced w\
+ith the corresponding element from the directory stack, as it w)108 420
+R 1.437(ould be displayed by the)-.1 F F1(dirs)3.937 E F0 -.2(bu)108 432
+S .454(iltin in).2 F -.2(vo)-.4 G -.1(ke).2 G 2.954(dw).1 G .454
+(ith the tilde-pre\214x as an ar)-2.954 F 2.954(gument. If)-.18 F .454
+(the characters follo)2.954 F .455(wing the tilde in the tilde-pre\214x)
+-.25 F
+(consist of a number without a leading `+' or `\255', `+' is assumed.)
+108 444 Q(If the login name is in)108 460.8 Q -.25(va)-.4 G
+(lid, or the tilde e).25 E(xpansion f)-.15 E(ails, the w)-.1 E
+(ord is unchanged.)-.1 E .827(Each v)108 477.6 R .827
+(ariable assignment is check)-.25 F .827(ed for unquoted tilde-pre\214x)
+-.1 F .827(es immediately follo)-.15 F .827(wing a)-.25 F F1(:)3.326 E
+F0(or)3.326 E F1(=)3.326 E F0 5.826(.I)C 3.326(nt)-5.826 G(hese)-3.326 E
+.466(cases, tilde e)108 489.6 R .466(xpansion is also performed.)-.15 F
+(Consequently)5.467 E 2.967(,o)-.65 G .467
+(ne may use \214le names with tildes in assignments)-2.967 F(to)108
+501.6 Q F3 -.666(PA)2.5 G(TH)-.189 E F4(,)A F3(MAILP)2.25 E -.855(AT)
+-.666 G(H).855 E F4(,)A F0(and)2.25 E F3(CDP)2.5 E -.855(AT)-.666 G(H)
+.855 E F4(,)A F0(and the shell assigns the e)2.25 E(xpanded v)-.15 E
+(alue.)-.25 E F1 -.1(Pa)87 518.4 S(rameter Expansion).1 E F0 1.606
+(The `)108 530.4 R F1($)A F0 4.106('c)C 1.606
+(haracter introduces parameter e)-4.106 F 1.605
+(xpansion, command substitution, or arithmetic e)-.15 F 4.105
+(xpansion. The)-.15 F .406(parameter name or symbol to be e)108 542.4 R
+.407(xpanded may be enclosed in braces, which are optional b)-.15 F .407
+(ut serv)-.2 F 2.907(et)-.15 G 2.907(op)-2.907 G(ro-)-2.907 E .033
+(tect the v)108 554.4 R .033(ariable to be e)-.25 F .033
+(xpanded from characters immediately follo)-.15 F .032
+(wing it which could be interpreted as part)-.25 F(of the name.)108
+566.4 Q 1.189
+(When braces are used, the matching ending brace is the \214rst `)108
+583.2 R F1(})A F0 3.69('n)C 1.19(ot escaped by a backslash or within a)
+-3.69 F .053(quoted string, and not within an embedded arithmetic e)108
+595.2 R .052(xpansion, command substitution, or paramter e)-.15 F(xpan-)
+-.15 E(sion.)108 607.2 Q(${)108 624 Q F2(par)A(ameter)-.15 E F0(})A
+1.204(The v)144 636 R 1.204(alue of)-.25 F F2(par)3.704 E(ameter)-.15 E
+F0 1.204(is substituted.)3.704 F 1.204(The braces are required when)
+6.204 F F2(par)4.955 E(ameter)-.15 E F0 1.205(is a positional)4.435 F
+.264(parameter with more than one digit, or when)144 648 R F2(par)4.014
+E(ameter)-.15 E F0 .264(is follo)3.494 F .264
+(wed by a character which is not to)-.25 F
+(be interpreted as part of its name.)144 660 Q 1.508
+(If the \214rst character of)108 676.8 R F2(par)4.009 E(ameter)-.15 E F0
+1.509(is an e)4.009 F 1.509(xclamation point, a le)-.15 F -.15(ve)-.25 G
+4.009(lo).15 G 4.009(fv)-4.009 G 1.509
+(ariable indirection is introduced.)-4.259 F F1(Bash)108 688.8 Q F0 .106
+(uses the v)2.606 F .106(alue of the v)-.25 F .106
+(ariable formed from the rest of)-.25 F F2(par)2.606 E(ameter)-.15 E F0
+.106(as the name of the v)2.606 F .106(ariable; this v)-.25 F(ari-)-.25
+E .351(able is then e)108 700.8 R .351(xpanded and that v)-.15 F .352
+(alue is used in the rest of the substitution, rather than the v)-.25 F
+.352(alue of)-.25 F F2(par)2.852 E(ame-)-.15 E(ter)108 712.8 Q F0 2.52
+(itself. This)2.52 F .02(is kno)2.52 F .02(wn as)-.25 F F2(indir)2.52 E
+.02(ect e)-.37 F(xpansion)-.2 E F0 5.019(.T)C .019(he e)-5.019 F .019
+(xceptions to this are the e)-.15 F .019(xpansions of ${!)-.15 F F2(pr)A
+(e\214x)-.37 E F0 .019(*} and)B(${)108 724.8 Q F1(!)A F2(name)A F0([)A
+F2(@)A F0 .762(]} described belo)B 4.563 -.65(w. T)-.25 H .763(he e).65
+F .763(xclamation point must immediately follo)-.15 F 3.263(wt)-.25 G
+.763(he left brace in order to)-3.263 F(GNU Bash-3.0)72 768 Q(2003 No)
+147.975 E 2.5(v1)-.15 G 197.965(31)-2.5 G(6)-197.965 E 0 Cg EP
+%%Page: 17 17
+%%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(introduce indirection.)108 84 Q .334(In each of the cases belo)
+108 100.8 R -.65(w,)-.25 G/F1 10/Times-Italic@0 SF(wor)3.484 E(d)-.37 E
+F0 .334(is subject to tilde e)2.834 F .334(xpansion, parameter e)-.15 F
+.334(xpansion, command substitution,)-.15 F 1.417(and arithmetic e)108
+112.8 R 3.918(xpansion. When)-.15 F 1.418(not performing substring e)
+3.918 F(xpansion,)-.15 E/F2 10/Times-Bold@0 SF(bash)3.918 E F0 1.418
+(tests for a parameter that is)3.918 F(unset or null; omitting the colo\
+n results in a test only for a parameter that is unset.)108 124.8 Q(${)
+108 141.6 Q F1(par)A(ameter)-.15 E F2<3aad>A F1(wor)A(d)-.37 E F0(})A F2
+.723(Use Default V)144 153.6 R(alues)-.92 E F0 5.723(.I)C(f)-5.723 E F1
+(par)4.473 E(ameter)-.15 E F0 .723(is unset or null, the e)3.953 F .722
+(xpansion of)-.15 F F1(wor)3.562 E(d)-.37 E F0 .722(is substituted.)
+3.992 F(Other)5.722 E(-)-.2 E(wise, the v)144 165.6 Q(alue of)-.25 E F1
+(par)3.75 E(ameter)-.15 E F0(is substituted.)3.23 E(${)108 177.6 Q F1
+(par)A(ameter)-.15 E F2(:=)A F1(wor)A(d)-.37 E F0(})A F2 2.004
+(Assign Default V)144 189.6 R(alues)-.92 E F0 7.004(.I)C(f)-7.004 E F1
+(par)5.754 E(ameter)-.15 E F0 2.005(is unset or null, the e)5.234 F
+2.005(xpansion of)-.15 F F1(wor)4.845 E(d)-.37 E F0 2.005
+(is assigned to)5.275 F F1(par)144 201.6 Q(ameter)-.15 E F0 5.279(.T).73
+G .279(he v)-5.279 F .279(alue of)-.25 F F1(par)4.029 E(ameter)-.15 E F0
+.278(is then substituted.)3.508 F .278
+(Positional parameters and special param-)5.278 F
+(eters may not be assigned to in this w)144 213.6 Q(ay)-.1 E(.)-.65 E
+(${)108 225.6 Q F1(par)A(ameter)-.15 E F2(:?)A F1(wor)A(d)-.37 E F0(})A
+F2 .535(Display Err)144 237.6 R .535(or if Null or Unset)-.18 F F0 5.535
+(.I)C(f)-5.535 E F1(par)4.285 E(ameter)-.15 E F0 .535
+(is null or unset, the e)3.765 F .535(xpansion of)-.15 F F1(wor)3.035 E
+(d)-.37 E F0 .535(\(or a mes-)3.035 F .662(sage to that ef)144 249.6 R
+.662(fect if)-.25 F F1(wor)3.502 E(d)-.37 E F0 .661(is not present\) is\
+ written to the standard error and the shell, if it is not)3.932 F
+(interacti)144 261.6 Q -.15(ve)-.25 G 2.5(,e).15 G 2.5(xits. Otherwise,)
+-2.65 F(the v)2.5 E(alue of)-.25 E F1(par)2.5 E(ameter)-.15 E F0
+(is substituted.)2.5 E(${)108 273.6 Q F1(par)A(ameter)-.15 E F2(:+)A F1
+(wor)A(d)-.37 E F0(})A F2 .745(Use Alter)144 285.6 R .745(nate V)-.15 F
+(alue)-.92 E F0 5.745(.I)C(f)-5.745 E F1(par)4.495 E(ameter)-.15 E F0
+.745(is null or unset, nothing is substituted, otherwise the e)3.975 F
+(xpan-)-.15 E(sion of)144 297.6 Q F1(wor)2.84 E(d)-.37 E F0
+(is substituted.)3.27 E(${)108 309.6 Q F1(par)A(ameter)-.15 E F2(:)A F1
+(of)A(fset)-.18 E F0(})A(${)108 321.6 Q F1(par)A(ameter)-.15 E F2(:)A F1
+(of)A(fset)-.18 E F2(:)A F1(length)A F0(})A F2 .797
+(Substring Expansion.)144 333.6 R F0 .796(Expands to up to)5.797 F F1
+(length)3.296 E F0 .796(characters of)3.296 F F1(par)3.296 E(ameter)-.15
+E F0 .796(starting at the character)3.296 F .228(speci\214ed by)144
+345.6 R F1(of)2.728 E(fset)-.18 E F0 5.228(.I)C(f)-5.228 E F1(length)
+2.728 E F0 .229(is omitted, e)2.729 F .229(xpands to the substring of)
+-.15 F F1(par)2.729 E(ameter)-.15 E F0 .229(starting at the char)2.729 F
+(-)-.2 E .433(acter speci\214ed by)144 357.6 R F1(of)2.933 E(fset)-.18 E
+F0(.)A F1(length)5.433 E F0(and)2.933 E F1(of)2.933 E(fset)-.18 E F0
+.433(are arithmetic e)2.933 F .433(xpressions \(see)-.15 F/F3 9
+/Times-Bold@0 SF .432(ARITHMETIC EV)2.933 F(ALU-)-1.215 E -.855(AT)144
+369.6 S(ION).855 E F0(belo)2.576 E(w\).)-.25 E F1(length)5.326 E F0 .326
+(must e)2.826 F -.25(va)-.25 G .326
+(luate to a number greater than or equal to zero.).25 F(If)5.327 E F1
+(of)2.827 E(fset)-.18 E F0 -.25(eva)2.827 G(luates).25 E .016
+(to a number less than zero, the v)144 381.6 R .015
+(alue is used as an of)-.25 F .015(fset from the end of the v)-.25 F
+.015(alue of)-.25 F F1(par)2.515 E(ameter)-.15 E F0 5.015(.I)C(f)-5.015
+E F1(par)144 393.6 Q(ameter)-.15 E F0(is)3.25 E F2(@)3.25 E F0 3.25(,t)C
+.75(he result is)-3.25 F F1(length)3.25 E F0 .75
+(positional parameters be)3.25 F .75(ginning at)-.15 F F1(of)3.25 E
+(fset)-.18 E F0 5.75(.I)C(f)-5.75 E F1(par)3.25 E(ameter)-.15 E F0 .75
+(is an)3.25 F 1.835(array name inde)144 405.6 R -.15(xe)-.15 G 4.335(db)
+.15 G 4.335(y@o)-4.335 G 4.335(r*)-4.335 G 4.335(,t)-4.335 G 1.835
+(he result is the)-4.335 F F1(length)4.335 E F0 1.834
+(members of the array be)4.335 F 1.834(ginning with)-.15 F(${)144 417.6
+Q F1(par)A(ameter)-.15 E F0([)A F1(of)A(fset)-.18 E F0 2.999
+(]}. Substring)B(inde)2.999 E .499
+(xing is zero-based unless the positional parameters are used,)-.15 F
+(in which case the inde)144 429.6 Q(xing starts at 1.)-.15 E(${)108
+446.4 Q F2(!)A F1(pr)A(e\214x)-.37 E F2(*)A F0(})A(${)108 458.4 Q F2(!)A
+F1(pr)A(e\214x)-.37 E F2(@)A F0(})A .42(Expands to the names of v)144
+470.4 R .42(ariables whose names be)-.25 F .42(gin with)-.15 F F1(pr)
+2.92 E(e\214x)-.37 E F0 2.92(,s)C .42(eparated by the \214rst character)
+-2.92 F(of the)144 482.4 Q F3(IFS)2.5 E F0(special v)2.25 E(ariable.)
+-.25 E(${)108 499.2 Q F2(!)A F1(name)A F0([)A F1(@)A F0(]})A(${)108
+511.2 Q F2(!)A F1(name)A F0([)A F1(*)A F0(]})A(If)144 523.2 Q F1(name)
+2.921 E F0 .421(is an array v)2.921 F .421(ariable, e)-.25 F .421
+(xpands to the list of array indices \(k)-.15 F -.15(ey)-.1 G .421
+(s\) assigned in).15 F F1(name)2.921 E F0 5.422(.I)C(f)-5.422 E F1(name)
+2.922 E F0 .238(is not an array)144 535.2 R 2.738(,e)-.65 G .238
+(xpands to 0 if)-2.888 F F1(name)2.738 E F0 .237
+(is set and null otherwise.)2.738 F(When)5.237 E F1(@)2.737 E F0 .237
+(is used and the e)2.737 F(xpansion)-.15 E
+(appears within double quotes, each k)144 547.2 Q .3 -.15(ey ex)-.1 H
+(pands to a separate w).15 E(ord.)-.1 E(${)108 564 Q F2(#)A F1(par)A
+(ameter)-.15 E F0(})A 1.391(The length in characters of the v)144 576 R
+1.392(alue of)-.25 F F1(par)3.892 E(ameter)-.15 E F0 1.392
+(is substituted.)3.892 F(If)6.392 E F1(par)5.142 E(ameter)-.15 E F0(is)
+4.622 E F2(*)3.892 E F0(or)3.892 E F2(@)3.892 E F0 3.892(,t)C(he)-3.892
+E -.25(va)144 588 S 1.749
+(lue substituted is the number of positional parameters.).25 F(If)6.749
+E F1(par)5.498 E(ameter)-.15 E F0 1.748(is an array name sub-)4.978 F
+(scripted by)144 600 Q F2(*)2.5 E F0(or)2.5 E F2(@)2.5 E F0 2.5(,t)C
+(he v)-2.5 E(alue substituted is the number of elements in the array)
+-.25 E(.)-.65 E(${)108 616.8 Q F1(par)A(ameter)-.15 E F2(#)A F1(wor)A(d)
+-.37 E F0(})A(${)108 628.8 Q F1(par)A(ameter)-.15 E F2(##)A F1(wor)A(d)
+-.37 E F0(})A(The)144 640.8 Q F1(wor)3.33 E(d)-.37 E F0 .49(is e)3.76 F
+.491(xpanded to produce a pattern just as in pathname e)-.15 F 2.991
+(xpansion. If)-.15 F .491(the pattern matches)2.991 F .412(the be)144
+652.8 R .412(ginning of the v)-.15 F .411(alue of)-.25 F F1(par)2.911 E
+(ameter)-.15 E F0 2.911(,t).73 G .411(hen the result of the e)-2.911 F
+.411(xpansion is the e)-.15 F .411(xpanded v)-.15 F .411(alue of)-.25 F
+F1(par)145.25 664.8 Q(ameter)-.15 E F0 .607
+(with the shortest matching pattern \(the `)3.837 F(`)-.74 E F2(#)A F0
+2.087 -.74('' c)D .607(ase\) or the longest matching pattern \(the).74 F
+-.74(``)144 676.8 S F2(##).74 E F0 1.654 -.74('' c)D .174
+(ase\) deleted.).74 F(If)5.174 E F1(par)3.924 E(ameter)-.15 E F0(is)
+3.404 E F2(@)2.674 E F0(or)2.674 E F2(*)2.674 E F0 2.674(,t)C .173
+(he pattern remo)-2.674 F -.25(va)-.15 G 2.673(lo).25 G .173
+(peration is applied to each posi-)-2.673 F .654
+(tional parameter in turn, and the e)144 688.8 R .654
+(xpansion is the resultant list.)-.15 F(If)5.655 E F1(par)4.405 E
+(ameter)-.15 E F0 .655(is an array v)3.885 F(ariable)-.25 E .651
+(subscripted with)144 700.8 R F2(@)3.151 E F0(or)3.151 E F2(*)3.151 E F0
+3.151(,t)C .651(he pattern remo)-3.151 F -.25(va)-.15 G 3.151(lo).25 G
+.65(peration is applied to each member of the array in)-3.151 F
+(turn, and the e)144 712.8 Q(xpansion is the resultant list.)-.15 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(31)-2.5 G
+(7)-197.965 E 0 Cg EP
+%%Page: 18 18
+%%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(${)108 84 Q/F1 10/Times-Italic@0 SF(par)A(ameter)-.15 E/F2 10
+/Times-Bold@0 SF(%)A F1(wor)A(d)-.37 E F0(})A(${)108 96 Q F1(par)A
+(ameter)-.15 E F2(%%)A F1(wor)A(d)-.37 E F0(})A(The)144 108 Q F1(wor)
+2.618 E(d)-.37 E F0 .118(is e)2.618 F .119
+(xpanded to produce a pattern just as in pathname e)-.15 F 2.619
+(xpansion. If)-.15 F .119(the pattern matches a)2.619 F 2.402
+(trailing portion of the e)144 120 R 2.402(xpanded v)-.15 F 2.401
+(alue of)-.25 F F1(par)4.901 E(ameter)-.15 E F0 4.901(,t).73 G 2.401
+(hen the result of the e)-4.901 F 2.401(xpansion is the)-.15 F -.15(ex)
+144 132 S 1.152(panded v).15 F 1.152(alue of)-.25 F F1(par)4.902 E
+(ameter)-.15 E F0 1.152(with the shortest matching pattern \(the `)4.382
+F(`)-.74 E F2(%)A F0 2.632 -.74('' c)D 1.153(ase\) or the longest).74 F
+.79(matching pattern \(the `)144 144 R(`)-.74 E F2(%%)A F0 2.27 -.74
+('' c)D .79(ase\) deleted.).74 F(If)5.79 E F1(par)4.54 E(ameter)-.15 E
+F0(is)4.02 E F2(@)3.29 E F0(or)3.29 E F2(*)3.29 E F0 3.29(,t)C .79
+(he pattern remo)-3.29 F -.25(va)-.15 G 3.29(lo).25 G(pera-)-3.29 E
+1.758(tion is applied to each positional parameter in turn, and the e)
+144 156 R 1.758(xpansion is the resultant list.)-.15 F(If)6.759 E F1
+(par)145.25 168 Q(ameter)-.15 E F0 .089(is an array v)3.319 F .089
+(ariable subscripted with)-.25 F F2(@)2.589 E F0(or)2.589 E F2(*)2.589 E
+F0 2.589(,t)C .089(he pattern remo)-2.589 F -.25(va)-.15 G 2.588(lo).25
+G .088(peration is applied to)-2.588 F
+(each member of the array in turn, and the e)144 180 Q
+(xpansion is the resultant list.)-.15 E(${)108 196.8 Q F1(par)A(ameter)
+-.15 E F2(/)A F1(pattern)A F2(/)A F1(string)A F0(})A(${)108 208.8 Q F1
+(par)A(ameter)-.15 E F2(//)A F1(pattern)A F2(/)A F1(string)A F0(})A(The)
+144 220.8 Q F1(pattern)5.085 E F0 2.585(is e)5.085 F 2.585
+(xpanded to produce a pattern just as in pathname e)-.15 F(xpansion.)
+-.15 E F1 -.8(Pa)7.585 G -.15(ra).8 G(meter).15 E F0(is)5.085 E -.15(ex)
+144 232.8 S 1.17(panded and the longest match of).15 F F1(pattern)3.67 E
+F0(ag)3.669 E 1.169(ainst its v)-.05 F 1.169(alue is replaced with)-.25
+F F1(string)3.669 E F0 6.169(.I)C 3.669(nt)-6.169 G 1.169(he \214rst)
+-3.669 F 2.028(form, only the \214rst match is replaced.)144 244.8 R
+2.028(The second form causes all matches of)7.028 F F1(pattern)4.528 E
+F0 2.029(to be)4.529 F 1.36(replaced with)144 256.8 R F1(string)3.86 E
+F0 6.36(.I)C(f)-6.36 E F1(pattern)3.86 E F0(be)3.86 E 1.36(gins with)
+-.15 F F2(#)3.86 E F0 3.86(,i)C 3.86(tm)-3.86 G 1.36
+(ust match at the be)-3.86 F 1.36(ginning of the e)-.15 F(xpanded)-.15 E
+-.25(va)144 268.8 S .62(lue of).25 F F1(par)3.12 E(ameter)-.15 E F0 5.62
+(.I)C(f)-5.62 E F1(pattern)3.12 E F0(be)3.12 E .62(gins with)-.15 F F2
+(%)3.12 E F0 3.12(,i)C 3.121(tm)-3.12 G .621
+(ust match at the end of the e)-3.121 F .621(xpanded v)-.15 F .621
+(alue of)-.25 F F1(par)144 280.8 Q(ameter)-.15 E F0 6.254(.I)C(f)-6.254
+E F1(string)3.754 E F0 1.253(is null, matches of)3.753 F F1(pattern)
+3.753 E F0 1.253(are deleted and the)3.753 F F2(/)3.753 E F0(follo)3.753
+E(wing)-.25 E F1(pattern)3.753 E F0 1.253(may be)3.753 F 2.678
+(omitted. If)144 292.8 R F1(par)3.928 E(ameter)-.15 E F0(is)3.408 E F2
+(@)2.678 E F0(or)2.678 E F2(*)2.679 E F0 2.679(,t)C .179
+(he substitution operation is applied to each positional parameter)
+-2.679 F .619(in turn, and the e)144 304.8 R .619
+(xpansion is the resultant list.)-.15 F(If)5.619 E F1(par)4.369 E
+(ameter)-.15 E F0 .618(is an array v)3.849 F .618
+(ariable subscripted with)-.25 F F2(@)144 316.8 Q F0(or)3.223 E F2(*)
+3.223 E F0 3.223(,t)C .723(he substitution operation is applied to each\
+ member of the array in turn, and the e)-3.223 F(xpan-)-.15 E
+(sion is the resultant list.)144 328.8 Q F2(Command Substitution)87
+345.6 Q F1 1.698(Command substitution)108 357.6 R F0(allo)4.198 E 1.697
+(ws the output of a command to replace the command name.)-.25 F 1.697
+(There are tw)6.697 F(o)-.1 E(forms:)108 369.6 Q F2($\()144 391.2 Q F1
+(command)A F2(\))1.666 E F0(or)108 403.2 Q F2(`)144 415.2 Q F1(command)A
+F2(`)A(Bash)108 432 Q F0 .019(performs the e)2.519 F .019(xpansion by e)
+-.15 F -.15(xe)-.15 G(cuting).15 E F1(command)2.519 E F0 .02
+(and replacing the command substitution with the stan-)2.519 F .768
+(dard output of the command, with an)108 444 R 3.268(yt)-.15 G .768
+(railing ne)-3.268 F .768(wlines deleted.)-.25 F .768(Embedded ne)5.768
+F .768(wlines are not deleted, b)-.25 F(ut)-.2 E(the)108 456 Q 3.218(ym)
+-.15 G .718(ay be remo)-3.218 F -.15(ve)-.15 G 3.218(dd).15 G .719
+(uring w)-3.218 F .719(ord splitting.)-.1 F .719
+(The command substitution)5.719 F F2($\(cat)3.219 E F1(\214le)3.219 E F2
+(\))A F0 .719(can be replaced by the)3.219 F(equi)108 468 Q -.25(va)-.25
+G(lent b).25 E(ut f)-.2 E(aster)-.1 E F2($\(<)2.5 E F1(\214le)2.5 E F2
+(\))A F0(.)A 1.724(When the old-style backquote form of substitution is\
+ used, backslash retains its literal meaning e)108 484.8 R(xcept)-.15 E
+.314(when follo)108 496.8 R .314(wed by)-.25 F F2($)2.814 E F0(,)A F2(`)
+2.814 E F0 2.814(,o)C(r)-2.814 E F2(\\)2.814 E F0 5.314(.T)C .315(he \
+\214rst backquote not preceded by a backslash terminates the command su\
+b-)-5.314 F 3.887(stitution. When)108 508.8 R 1.387(using the $\()3.887
+F F1(command).833 E F0 3.887(\)f)1.666 G 1.386
+(orm, all characters between the parentheses mak)-3.887 F 3.886(eu)-.1 G
+3.886(pt)-3.886 G 1.386(he com-)-3.886 F
+(mand; none are treated specially)108 520.8 Q(.)-.65 E .894
+(Command substitutions may be nested.)108 537.6 R 2.494 -.8(To n)5.894 H
+.894(est when using the backquoted form, escape the inner back-).8 F
+(quotes with backslashes.)108 549.6 Q .422
+(If the substitution appears within double quotes, w)108 566.4 R .422
+(ord splitting and pathname e)-.1 F .422(xpansion are not performed)-.15
+F(on the results.)108 578.4 Q F2(Arithmetic Expansion)87 595.2 Q F0
+1.034(Arithmetic e)108 607.2 R 1.034(xpansion allo)-.15 F 1.034
+(ws the e)-.25 F -.25(va)-.25 G 1.034(luation of an arithmetic e).25 F
+1.035(xpression and the substitution of the result.)-.15 F
+(The format for arithmetic e)108 619.2 Q(xpansion is:)-.15 E F2($\(\()
+144 636 Q F1 -.2(ex)C(pr).2 E(ession)-.37 E F2(\)\))A F0(The)108 652.8 Q
+F1 -.2(ex)2.666 G(pr).2 E(ession)-.37 E F0 .165
+(is treated as if it were within double quotes, b)2.906 F .165
+(ut a double quote inside the parentheses is not)-.2 F 1.074
+(treated specially)108 664.8 R 6.074(.A)-.65 G 1.074(ll tok)-6.074 F
+1.074(ens in the e)-.1 F 1.074(xpression under)-.15 F 1.074
+(go parameter e)-.18 F 1.074(xpansion, string e)-.15 F 1.075
+(xpansion, command)-.15 F(substitution, and quote remo)108 676.8 Q -.25
+(va)-.15 G 2.5(l. Arithmetic).25 F -.15(ex)2.5 G
+(pansions may be nested.).15 E 1.379(The e)108 693.6 R -.25(va)-.25 G
+1.378(luation is performed according to the rules listed belo).25 F
+3.878(wu)-.25 G(nder)-3.878 E/F3 9/Times-Bold@0 SF 1.378(ARITHMETIC EV)
+3.878 F(ALU)-1.215 E -.855(AT)-.54 G(ION).855 E/F4 9/Times-Roman@0 SF(.)
+A F0(If)5.878 E F1 -.2(ex)108 705.6 S(pr).2 E(ession)-.37 E F0(is in)
+2.74 E -.25(va)-.4 G(lid,).25 E F2(bash)2.5 E F0
+(prints a message indicating f)2.5 E(ailure and no substitution occurs.)
+-.1 E(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(31)
+-2.5 G(8)-197.965 E 0 Cg EP
+%%Page: 19 19
+%%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(Pr)87 84 Q(ocess Substitution)-.18 E/F2 10
+/Times-Italic@0 SF(Pr)108 96 Q .97(ocess substitution)-.45 F F0 .971
+(is supported on systems that support named pipes \()3.47 F F2(FIFOs)A
+F0 3.471(\)o)C 3.471(rt)-3.471 G(he)-3.471 E F1(/de)3.471 E(v/fd)-.15 E
+F0 .971(method of)3.471 F .022(naming open \214les.)108 108 R .021
+(It tak)5.022 F .021(es the form of)-.1 F F1(<\()2.521 E F2(list)A F1
+(\)).833 E F0(or)2.521 E F1(>\()2.521 E F2(list)A F1(\)).833 E F0 5.021
+(.T)C .021(he process)-5.021 F F2(list)2.521 E F0 .021
+(is run with its input or output con-)2.521 F .058(nected to a)108 120 R
+F2(FIFO)2.558 E F0 .058(or some \214le in)2.558 F F1(/de)2.558 E(v/fd)
+-.15 E F0 5.058(.T)C .058(he name of this \214le is passed as an ar)
+-5.058 F .059(gument to the current com-)-.18 F .131
+(mand as the result of the e)108 132 R 2.631(xpansion. If)-.15 F(the)
+2.63 E F1(>\()2.63 E F2(list)A F1(\)).833 E F0 .13
+(form is used, writing to the \214le will pro)2.63 F .13(vide input for)
+-.15 F F2(list)2.63 E F0(.)A(If the)108 144 Q F1(<\()2.5 E F2(list)A F1
+(\)).833 E F0(form is used, the \214le passed as an ar)2.5 E
+(gument should be read to obtain the output of)-.18 E F2(list)2.5 E F0
+(.)A .896(When a)108 160.8 R -.25(va)-.2 G .896(ilable, process substit\
+ution is performed simultaneously with parameter and v).25 F .897
+(ariable e)-.25 F(xpansion,)-.15 E
+(command substitution, and arithmetic e)108 172.8 Q(xpansion.)-.15 E F1
+-.75(Wo)87 189.6 S(rd Splitting).75 E F0 1.143
+(The shell scans the results of parameter e)108 201.6 R 1.142
+(xpansion, command substitution, and arithmetic e)-.15 F 1.142
+(xpansion that)-.15 F(did not occur within double quotes for)108 213.6 Q
+F2(wor)2.5 E 2.5(ds)-.37 G(plitting)-2.5 E F0(.).22 E .063
+(The shell treats each character of)108 230.4 R/F3 9/Times-Bold@0 SF
+(IFS)2.563 E F0 .063(as a delimiter)2.313 F 2.563(,a)-.4 G .063
+(nd splits the results of the other e)-2.563 F .063(xpansions into w)
+-.15 F(ords)-.1 E .628(on these characters.)108 242.4 R(If)5.628 E F3
+(IFS)3.128 E F0 .627(is unset, or its v)2.877 F .627(alue is e)-.25 F
+(xactly)-.15 E F1(<space><tab><newline>)3.127 E F0 3.127(,t)C .627
+(he def)-3.127 F .627(ault, then an)-.1 F(y)-.15 E 2.527(sequence of)108
+254.4 R F3(IFS)5.027 E F0 2.527(characters serv)4.777 F 2.527
+(es to delimit w)-.15 F 5.027(ords. If)-.1 F F3(IFS)5.027 E F0 2.527
+(has a v)4.777 F 2.527(alue other than the def)-.25 F 2.528(ault, then)
+-.1 F .363(sequences of the whitespace characters)108 266.4 R F1(space)
+2.863 E F0(and)2.863 E F1(tab)2.863 E F0 .363(are ignored at the be)
+2.863 F .362(ginning and end of the w)-.15 F .362(ord, as)-.1 F .334
+(long as the whitespace character is in the v)108 278.4 R .334(alue of)
+-.25 F F3(IFS)2.834 E F0(\(an)2.584 E F3(IFS)2.834 E F0 .335
+(whitespace character\).)2.585 F(An)5.335 E 2.835(yc)-.15 G .335
+(haracter in)-2.835 F F3(IFS)2.835 E F0 .296(that is not)108 290.4 R F3
+(IFS)2.795 E F0 .295(whitespace, along with an)2.545 F 2.795(ya)-.15 G
+(djacent)-2.795 E F3(IFS)2.795 E F0 .295
+(whitespace characters, delimits a \214eld.)2.545 F 2.795(As)5.295 G
+(equence)-2.795 E(of)108 302.4 Q F3(IFS)3.752 E F0 1.252
+(whitespace characters is also treated as a delimiter)3.502 F 6.252(.I)
+-.55 G 3.752(ft)-6.252 G 1.252(he v)-3.752 F 1.252(alue of)-.25 F F3
+(IFS)3.752 E F0 1.253(is null, no w)3.502 F 1.253(ord splitting)-.1 F
+(occurs.)108 314.4 Q 1.8(Explicit null ar)108 331.2 R 1.8(guments \()
+-.18 F F1 .833("").833 G F0(or)3.467 E F1 .833('')5.133 G F0 4.3(\)a)C
+1.8(re retained.)-4.3 F 1.799(Unquoted implicit null ar)6.8 F 1.799
+(guments, resulting from the)-.18 F -.15(ex)108 343.2 S .176
+(pansion of parameters that ha).15 F .476 -.15(ve n)-.2 H 2.676(ov).15 G
+.176(alues, are remo)-2.926 F -.15(ve)-.15 G 2.676(d. If).15 F 2.677(ap)
+2.677 G .177(arameter with no v)-2.677 F .177(alue is e)-.25 F .177
+(xpanded within)-.15 F(double quotes, a null ar)108 355.2 Q
+(gument results and is retained.)-.18 E(Note that if no e)108 372 Q
+(xpansion occurs, no splitting is performed.)-.15 E F1 -.1(Pa)87 388.8 S
+(thname Expansion).1 E F0 .371(After w)108 400.8 R .371
+(ord splitting, unless the)-.1 F F1<ad66>2.871 E F0 .371
+(option has been set,)2.871 F F1(bash)2.871 E F0 .37(scans each w)2.87 F
+.37(ord for the characters)-.1 F F1(*)2.87 E F0(,)A F1(?)2.87 E F0 2.87
+(,a)C(nd)-2.87 E F1([)2.87 E F0(.)A .677
+(If one of these characters appears, then the w)108 412.8 R .677
+(ord is re)-.1 F -.05(ga)-.15 G .677(rded as a).05 F F2(pattern)3.177 E
+F0 3.177(,a).24 G .678(nd replaced with an alphabeti-)-3.177 F 1.457
+(cally sorted list of \214le names matching the pattern.)108 424.8 R
+1.456(If no matching \214le names are found, and the shell)6.457 F
+(option)108 436.8 Q F1(nullglob)3.265 E F0 .765(is disabled, the w)3.265
+F .765(ord is left unchanged.)-.1 F .765(If the)5.765 F F1(nullglob)
+3.265 E F0 .765(option is set, and no matches are)3.265 F .306
+(found, the w)108 448.8 R .306(ord is remo)-.1 F -.15(ve)-.15 G 2.806
+(d. If).15 F(the)2.805 E F1(failglob)2.805 E F0 .305
+(shell option is set, and no matches are found, an error message)2.805 F
+.928(is printed and the command is not e)108 460.8 R -.15(xe)-.15 G
+3.428(cuted. If).15 F .928(the shell option)3.428 F F1(nocaseglob)3.428
+E F0 .929(is enabled, the match is per)3.429 F(-)-.2 E .033
+(formed without re)108 472.8 R -.05(ga)-.15 G .033
+(rd to the case of alphabetic characters.).05 F .032
+(When a pattern is used for pathname e)5.032 F(xpansion,)-.15 E .104
+(the character)108 484.8 R F1 -.63(``)2.604 G -.55(.').63 G(')-.08 E F0
+.104(at the start of a name or immediately follo)5.104 F .105
+(wing a slash must be matched e)-.25 F(xplicitly)-.15 E 2.605(,u)-.65 G
+(nless)-2.605 E .888(the shell option)108 496.8 R F1(dotglob)3.388 E F0
+.888(is set.)3.388 F .887
+(When matching a pathname, the slash character must al)5.888 F -.1(wa)
+-.1 G .887(ys be matched).1 F -.15(ex)108 508.8 S(plicitly).15 E 6.165
+(.I)-.65 G 3.665(no)-6.165 G 1.165(ther cases, the)-3.665 F F1 -.63(``)
+3.665 G -.55(.').63 G(')-.08 E F0 1.166
+(character is not treated specially)6.165 F 6.166(.S)-.65 G 1.166
+(ee the description of)-6.166 F F1(shopt)3.666 E F0(belo)3.666 E(w)-.25
+E(under)108 520.8 Q F3 .478(SHELL B)2.978 F(UIL)-.09 E .478
+(TIN COMMANDS)-.828 F F0 .477(for a description of the)2.728 F F1
+(nocaseglob)2.977 E F0(,)A F1(nullglob)2.977 E F0(,)A F1(failglob)2.977
+E F0 2.977(,a)C(nd)-2.977 E F1(dotglob)2.977 E F0(shell options.)108
+532.8 Q(The)108 549.6 Q F3(GLOBIGNORE)2.63 E F0 .13(shell v)2.38 F .131
+(ariable may be used to restrict the set of \214le names matching a)-.25
+F F2(pattern)2.631 E F0 5.131(.I).24 G(f)-5.131 E F3(GLO-)2.631 E
+(BIGNORE)108 561.6 Q F0 2.015(is set, each matching \214le name that al\
+so matches one of the patterns in)4.265 F F3(GLOBIGNORE)4.515 E F0(is)
+4.264 E(remo)108 573.6 Q -.15(ve)-.15 G 2.503(df).15 G .003
+(rom the list of matches.)-2.503 F .003(The \214le names)5.003 F F1 -.63
+(``)2.503 G -.55(.').63 G(')-.08 E F0(and)5.003 E F1 -.63(``)2.503 G(..)
+.63 E -.63('')-.55 G F0 .004(are al)5.633 F -.1(wa)-.1 G .004
+(ys ignored when).1 F F3(GLOBIGNORE)2.504 E F0(is)2.254 E .046
+(set and not null.)108 585.6 R(Ho)5.046 E(we)-.25 E -.15(ve)-.25 G .846
+-.4(r, s).15 H(etting).4 E F3(GLOBIGNORE)2.546 E F0 .046
+(to a non-null v)2.296 F .045(alue has the ef)-.25 F .045
+(fect of enabling the)-.25 F F1(dotglob)2.545 E F0 .613
+(shell option, so all other \214le names be)108 597.6 R .614
+(ginning with a)-.15 F F1 -.63(``)3.114 G -.55(.').63 G(')-.08 E F0 .614
+(will match.)5.614 F 2.214 -.8(To g)5.614 H .614(et the old beha).8 F
+.614(vior of ignoring)-.2 F .457(\214le names be)108 609.6 R .457
+(ginning with a)-.15 F F1 -.63(``)2.957 G -.55(.').63 G(')-.08 E F0
+2.957(,m)C(ak)-2.957 E(e)-.1 E F1 -.63(``)2.957 G(.*').63 E(')-.63 E F0
+.457(one of the patterns in)5.457 F F3(GLOBIGNORE)2.957 E/F4 9
+/Times-Roman@0 SF(.)A F0(The)4.957 E F1(dotglob)2.956 E F0 .456
+(option is)2.956 F(disabled when)108 621.6 Q F3(GLOBIGNORE)2.5 E F0
+(is unset.)2.25 E F1 -.1(Pa)108 638.4 S(tter).1 E 2.5(nM)-.15 G(atching)
+-2.5 E F0(An)108 655.2 Q 3.138(yc)-.15 G .638(haracter that appears in \
+a pattern, other than the special pattern characters described belo)
+-3.138 F 1.938 -.65(w, m)-.25 H(atches).65 E 3.62(itself. The)108 667.2
+R 1.12(NUL character may not occur in a pattern.)3.62 F 3.62(Ab)6.12 G
+1.12(ackslash escapes the follo)-3.62 F 1.12(wing character; the)-.25 F
+.576(escaping backslash is discarded when matching.)108 679.2 R .576
+(The special pattern characters must be quoted if the)5.576 F 3.076(ya)
+-.15 G(re)-3.076 E(to be matched literally)108 691.2 Q(.)-.65 E
+(The special pattern characters ha)108 708 Q .3 -.15(ve t)-.2 H
+(he follo).15 E(wing meanings:)-.25 E(GNU Bash-3.0)72 768 Q(2003 No)
+147.975 E 2.5(v1)-.15 G 197.965(31)-2.5 G(9)-197.965 E 0 Cg EP
+%%Page: 20 20
+%%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(*)108 84 Q F0(Matches an)31 E 2.5(ys)-.15 G
+(tring, including the null string.)-2.5 E F1(?)108 96 Q F0(Matches an)31
+E 2.5(ys)-.15 G(ingle character)-2.5 E(.)-.55 E F1([...])108 108 Q F0
+.257(Matches an)21.84 F 2.757(yo)-.15 G .257
+(ne of the enclosed characters.)-2.757 F 2.757(Ap)5.257 G .257
+(air of characters separated by a h)-2.757 F .256(yphen denotes a)-.05 F
+/F2 10/Times-Italic@0 SF -.15(ra)144 120 S(ng).15 E 3.289(ee)-.1 G(xpr)
+-3.489 E(ession)-.37 E F0 3.289(;a)C 1.089 -.15(ny c)-3.289 H .789
+(haracter that sorts between those tw).15 F 3.289(oc)-.1 G .789
+(haracters, inclusi)-3.289 F -.15(ve)-.25 G 3.29(,u).15 G .79
+(sing the cur)-3.29 F(-)-.2 E .35(rent locale')144 132 R 2.85(sc)-.55 G
+.35(ollating sequence and character set, is matched.)-2.85 F .349
+(If the \214rst character follo)5.349 F .349(wing the)-.25 F F1([)2.849
+E F0 .563(is a)144 144 R F1(!)3.063 E F0 .563(or a)5.563 F F1(^)3.063 E
+F0 .564(then an)3.063 F 3.064(yc)-.15 G .564
+(haracter not enclosed is matched.)-3.064 F .564
+(The sorting order of characters in range)5.564 F -.15(ex)144 156 S
+1.102(pressions is determined by the current locale and the v).15 F
+1.102(alue of the)-.25 F F1(LC_COLLA)3.602 E(TE)-.95 E F0 1.102(shell v)
+3.602 F(ari-)-.25 E .088(able, if set.)144 168 R(A)5.088 E F1<ad>2.588 E
+F0 .088(may be matched by including it as the \214rst or last character\
+ in the set.)2.588 F(A)5.089 E F1(])2.589 E F0 .089(may be)2.589 F
+(matched by including it as the \214rst character in the set.)144 180 Q
+-.4(Wi)144 198 S(thin).4 E F1([)2.915 E F0(and)2.915 E F1(])2.915 E F0
+(,)A F2 -.15(ch)2.915 G(ar).15 E .415(acter classes)-.15 F F0 .415
+(can be speci\214ed using the syntax)2.915 F F1([:)2.915 E F2(class)A F1
+(:])A F0 2.914(,w)C(here)-2.914 E F2(class)2.914 E F0 .414(is one of)
+2.914 F(the follo)144 210 Q
+(wing classes de\214ned in the POSIX.2 standard:)-.25 E F1 5.421
+(alnum alpha ascii blank cntrl digit graph lo)144 222 R 5.421
+(wer print punct space upper w)-.1 F(ord)-.1 E(xdigit)144 234 Q F0 2.519
+(Ac)144 246 S .019(haracter class matches an)-2.519 F 2.519(yc)-.15 G
+.019(haracter belonging to that class.)-2.519 F(The)5.018 E F1 -.1(wo)
+2.518 G(rd).1 E F0 .018(character class matches)2.518 F
+(letters, digits, and the character _.)144 258 Q -.4(Wi)144 276 S(thin)
+.4 E F1([)3.546 E F0(and)3.546 E F1(])3.546 E F0 3.546(,a)C(n)-3.546 E
+F2 1.046(equivalence class)3.546 F F0 1.046
+(can be speci\214ed using the syntax)3.546 F F1([=)3.547 E F2(c)A F1(=])
+A F0 3.547(,w)C 1.047(hich matches all)-3.547 F(characters with the sam\
+e collation weight \(as de\214ned by the current locale\) as the charac\
+ter)144 288 Q F2(c)2.5 E F0(.)A -.4(Wi)144 306 S(thin).4 E F1([)2.5 E F0
+(and)2.5 E F1(])2.5 E F0 2.5(,t)C(he syntax)-2.5 E F1([.)2.5 E F2
+(symbol)A F1(.])A F0(matches the collating symbol)2.5 E F2(symbol)2.5 E
+F0(.)A .705(If the)108 322.8 R F1(extglob)3.205 E F0 .705
+(shell option is enabled using the)3.205 F F1(shopt)3.205 E F0 -.2(bu)
+3.205 G .704(iltin, se).2 F -.15(ve)-.25 G .704(ral e).15 F .704
+(xtended pattern matching operators)-.15 F .255(are recognized.)108
+334.8 R .255(In the follo)5.255 F .255(wing description, a)-.25 F F2
+(pattern-list)2.755 E F0 .255
+(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 346.8 Q(wing sub-patterns:)-.25 E F1(?\()144 370.8 Q F2
+(pattern-list).833 E F1(\)).833 E F0
+(Matches zero or one occurrence of the gi)180 382.8 Q -.15(ve)-.25 G 2.5
+(np).15 G(atterns)-2.5 E F1(*\()144 394.8 Q F2(pattern-list).833 E F1
+(\)).833 E F0(Matches zero or more occurrences of the gi)180 406.8 Q
+-.15(ve)-.25 G 2.5(np).15 G(atterns)-2.5 E F1(+\()144 418.8 Q F2
+(pattern-list).833 E F1(\)).833 E F0
+(Matches one or more occurrences of the gi)180 430.8 Q -.15(ve)-.25 G
+2.5(np).15 G(atterns)-2.5 E F1(@\()144 442.8 Q F2(pattern-list).833 E F1
+(\)).833 E F0(Matches e)180 454.8 Q(xactly one of the gi)-.15 E -.15(ve)
+-.25 G 2.5(np).15 G(atterns)-2.5 E F1(!\()144 466.8 Q F2(pattern-list)
+.833 E F1(\)).833 E F0(Matches an)180 478.8 Q(ything e)-.15 E
+(xcept one of the gi)-.15 E -.15(ve)-.25 G 2.5(np).15 G(atterns)-2.5 E
+F1(Quote Remo)87 495.6 Q -.1(va)-.1 G(l).1 E F0 1.081
+(After the preceding e)108 507.6 R 1.08
+(xpansions, all unquoted occurrences of the characters)-.15 F F1(\\)3.58
+E F0(,)A F1(')3.58 E F0 3.58(,a)C(nd)-3.58 E F1(")4.413 E F0 1.08
+(that did not result)4.413 F(from one of the abo)108 519.6 Q .3 -.15
+(ve ex)-.15 H(pansions are remo).15 E -.15(ve)-.15 G(d.).15 E/F3 10.95
+/Times-Bold@0 SF(REDIRECTION)72 536.4 Q F0 .545(Before a command is e)
+108 548.4 R -.15(xe)-.15 G .545(cuted, its input and output may be).15 F
+F2 -.37(re)3.045 G(dir).37 E(ected)-.37 E F0 .545
+(using a special notation interpreted)3.815 F .617(by the shell.)108
+560.4 R .617(Redirection may also be used to open and close \214les for\
+ the current shell e)5.617 F -.15(xe)-.15 G .616(cution en).15 F(viron-)
+-.4 E 3.274(ment. The)108 572.4 R(follo)3.274 E .774
+(wing redirection operators may precede or appear an)-.25 F .774
+(ywhere within a)-.15 F F2 .775(simple command)3.615 F F0(or)4.045 E
+(may follo)108 584.4 Q 2.5(wa)-.25 G F2(command)A F0 5(.R).77 G
+(edirections are processed in the order the)-5 E 2.5(ya)-.15 G(ppear)
+-2.5 E 2.5(,f)-.4 G(rom left to right.)-2.5 E .448(In the follo)108
+601.2 R .447(wing descriptions, if the \214le descriptor number is omit\
+ted, and the \214rst character of the redirec-)-.25 F .365
+(tion operator is)108 613.2 R F1(<)2.865 E F0 2.865(,t)C .366
+(he redirection refers to the standard input \(\214le descriptor 0\).)
+-2.865 F .366(If the \214rst character of the)5.366 F
+(redirection operator is)108 625.2 Q F1(>)2.5 E F0 2.5(,t)C
+(he redirection refers to the standard output \(\214le descriptor 1\).)
+-2.5 E .825(The w)108 642 R .825(ord follo)-.1 F .824
+(wing the redirection operator in the follo)-.25 F .824
+(wing descriptions, unless otherwise noted, is sub-)-.25 F .772
+(jected to brace e)108 654 R .773(xpansion, tilde e)-.15 F .773
+(xpansion, parameter e)-.15 F .773
+(xpansion, command substitution, arithmetic e)-.15 F(xpan-)-.15 E .844
+(sion, quote remo)108 666 R -.25(va)-.15 G .843(l, pathname e).25 F .843
+(xpansion, and w)-.15 F .843(ord splitting.)-.1 F .843(If it e)5.843 F
+.843(xpands to more than one w)-.15 F(ord,)-.1 E F1(bash)3.343 E F0
+(reports an error)108 678 Q(.)-.55 E
+(Note that the order of redirections is signi\214cant.)108 694.8 Q -.15
+(Fo)5 G 2.5(re).15 G(xample, the command)-2.65 E(ls)144 711.6 Q F1(>)2.5
+E F0(dirlist 2)2.5 E F1(>&)A F0(1)A
+(directs both standard output and standard error to the \214le)108 728.4
+Q F2(dirlist)2.5 E F0 2.5(,w).68 G(hile the command)-2.5 E(GNU Bash-3.0)
+72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(32)-2.5 G(0)-197.965 E
+0 Cg EP
+%%Page: 21 21
+%%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(ls 2)144 84 Q/F1 10/Times-Bold@0 SF(>&)A F0(1)A F1(>)2.5 E F0
+(dirlist)2.5 E .387(directs only the standard output to \214le)108 100.8
+R/F2 10/Times-Italic@0 SF(dirlist)2.887 E F0 2.887(,b).68 G .388
+(ecause the standard error w)-2.887 F .388
+(as duplicated as standard output)-.1 F(before the standard output w)108
+112.8 Q(as redirected to)-.1 E F2(dirlist)2.5 E F0(.).68 E F1(Bash)108
+129.6 Q F0 .599(handles se)3.099 F -.15(ve)-.25 G .599
+(ral \214lenames specially when the).15 F 3.099(ya)-.15 G .598
+(re used in redirections, as described in the follo)-3.099 F(wing)-.25 E
+(table:)108 141.6 Q F1(/de)144 158.4 Q(v/fd/)-.15 E F2(fd)A F0(If)180
+170.4 Q F2(fd)2.5 E F0(is a v)2.5 E(alid inte)-.25 E(ger)-.15 E 2.5
+<2c8c>-.4 G(le descriptor)-2.5 E F2(fd)2.5 E F0(is duplicated.)2.5 E F1
+(/de)144 182.4 Q(v/stdin)-.15 E F0(File descriptor 0 is duplicated.)180
+194.4 Q F1(/de)144 206.4 Q(v/stdout)-.15 E F0
+(File descriptor 1 is duplicated.)180 218.4 Q F1(/de)144 230.4 Q
+(v/stderr)-.15 E F0(File descriptor 2 is duplicated.)180 242.4 Q F1(/de)
+144 254.4 Q(v/tcp/)-.15 E F2(host)A F1(/)A F2(port)A F0(If)180 266.4 Q
+F2(host)2.996 E F0 .496(is a v)2.996 F .496
+(alid hostname or Internet address, and)-.25 F F2(port)2.997 E F0 .497
+(is an inte)2.997 F .497(ger port number or ser)-.15 F(-)-.2 E
+(vice name,)180 278.4 Q F1(bash)2.5 E F0
+(attempts to open a TCP connection to the corresponding sock)2.5 E(et.)
+-.1 E F1(/de)144 290.4 Q(v/udp/)-.15 E F2(host)A F1(/)A F2(port)A F0(If)
+180 302.4 Q F2(host)2.997 E F0 .497(is a v)2.997 F .497
+(alid hostname or Internet address, and)-.25 F F2(port)2.996 E F0 .496
+(is an inte)2.996 F .496(ger port number or ser)-.15 F(-)-.2 E
+(vice name,)180 314.4 Q F1(bash)2.5 E F0
+(attempts to open a UDP connection to the corresponding sock)2.5 E(et.)
+-.1 E 2.5(Af)108 331.2 S
+(ailure to open or create a \214le causes the redirection to f)-2.6 E
+(ail.)-.1 E F1(Redir)87 348 Q(ecting Input)-.18 E F0 .391
+(Redirection of input causes the \214le whose name results from the e)
+108 360 R .391(xpansion of)-.15 F F2(wor)3.231 E(d)-.37 E F0 .391
+(to be opened for read-)3.661 F(ing on \214le descriptor)108 372 Q F2(n)
+2.5 E F0 2.5(,o).24 G 2.5(rt)-2.5 G
+(he standard input \(\214le descriptor 0\) if)-2.5 E F2(n)2.86 E F0
+(is not speci\214ed.)2.74 E
+(The general format for redirecting input is:)108 388.8 Q([)144 405.6 Q
+F2(n)A F0(])A F1(<)A F2(wor)A(d)-.37 E F1(Redir)87 422.4 Q
+(ecting Output)-.18 E F0 .175
+(Redirection of output causes the \214le whose name results from the e)
+108 434.4 R .174(xpansion of)-.15 F F2(wor)3.014 E(d)-.37 E F0 .174
+(to be opened for writ-)3.444 F .824(ing on \214le descriptor)108 446.4
+R F2(n)3.324 E F0 3.324(,o).24 G 3.324(rt)-3.324 G .824
+(he standard output \(\214le descriptor 1\) if)-3.324 F F2(n)3.684 E F0
+.824(is not speci\214ed.)3.564 F .825(If the \214le does not)5.825 F
+-.15(ex)108 458.4 S(ist it is created; if it does e).15 E
+(xist it is truncated to zero size.)-.15 E
+(The general format for redirecting output is:)108 475.2 Q([)144 492 Q
+F2(n)A F0(])A F1(>)A F2(wor)A(d)-.37 E F0 .155
+(If the redirection operator is)108 508.8 R F1(>)2.655 E F0 2.655(,a)C
+.155(nd the)-2.655 F F1(noclob)2.655 E(ber)-.1 E F0 .154(option to the)
+2.654 F F1(set)2.654 E F0 -.2(bu)2.654 G .154
+(iltin has been enabled, the redirection).2 F .076(will f)108 520.8 R
+.076(ail if the \214le whose name results from the e)-.1 F .076
+(xpansion of)-.15 F F2(wor)2.576 E(d)-.37 E F0 -.15(ex)2.576 G .076
+(ists and is a re).15 F .077(gular \214le.)-.15 F .077(If the redirec-)
+5.077 F .548(tion operator is)108 532.8 R F1(>|)3.048 E F0 3.048(,o)C
+3.048(rt)-3.048 G .548(he redirection operator is)-3.048 F F1(>)3.047 E
+F0 .547(and the)3.047 F F1(noclob)3.047 E(ber)-.1 E F0 .547
+(option to the)3.047 F F1(set)3.047 E F0 -.2(bu)3.047 G .547
+(iltin command is).2 F(not enabled, the redirection is attempted e)108
+544.8 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(ft)-2.5 G(he \214le named by)
+-2.5 E F2(wor)2.5 E(d)-.37 E F0 -.15(ex)2.5 G(ists.).15 E F1 -.25(Ap)87
+561.6 S(pending Redir).25 E(ected Output)-.18 E F0 .641
+(Redirection of output in this f)108 573.6 R .642
+(ashion causes the \214le whose name results from the e)-.1 F .642
+(xpansion of)-.15 F F2(wor)3.482 E(d)-.37 E F0 .642(to be)3.912 F .474
+(opened for appending on \214le descriptor)108 585.6 R F2(n)2.974 E F0
+2.974(,o).24 G 2.974(rt)-2.974 G .474
+(he standard output \(\214le descriptor 1\) if)-2.974 F F2(n)3.333 E F0
+.473(is not speci\214ed.)3.213 F(If)5.473 E(the \214le does not e)108
+597.6 Q(xist it is created.)-.15 E
+(The general format for appending output is:)108 614.4 Q([)144 631.2 Q
+F2(n)A F0(])A F1(>>)A F2(wor)A(d)-.37 E F1(Redir)87 652.8 Q
+(ecting Standard Output and Standard Err)-.18 E(or)-.18 E(Bash)108 664.8
+Q F0(allo)3.141 E .642(ws both the standard output \(\214le descriptor \
+1\) and the standard error output \(\214le descriptor 2\) to)-.25 F
+(be redirected to the \214le whose name is the e)108 676.8 Q
+(xpansion of)-.15 E F2(wor)2.84 E(d)-.37 E F0(with this construct.)3.27
+E(There are tw)108 693.6 Q 2.5(of)-.1 G
+(ormats for redirecting standard output and standard error:)-2.5 E F1
+(&>)144 710.4 Q F2(wor)A(d)-.37 E F0(and)108 722.4 Q(GNU Bash-3.0)72 768
+Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(32)-2.5 G(1)-197.965 E 0 Cg EP
+%%Page: 22 22
+%%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(>&)144 84 Q/F2 10/Times-Italic@0 SF(wor)A
+(d)-.37 E F0(Of the tw)108 100.8 Q 2.5(of)-.1 G
+(orms, the \214rst is preferred.)-2.5 E(This is semantically equi)5 E
+-.25(va)-.25 G(lent to).25 E F1(>)144 117.6 Q F2(wor)A(d)-.37 E F0(2)2.5
+E F1(>&)A F0(1)A F1(Her)87 134.4 Q 2.5(eD)-.18 G(ocuments)-2.5 E F0 .33
+(This type of redirection instructs the shell to read input from the cu\
+rrent source until a line containing only)108 146.4 R F2(wor)108.34
+158.4 Q(d)-.37 E F0 .683(\(with no trailing blanks\) is seen.)3.953 F
+.684
+(All of the lines read up to that point are then used as the standard)
+5.684 F(input for a command.)108 170.4 Q
+(The format of here-documents is:)108 187.2 Q F1(<<)144 204 Q F0([)A F1
+<ad>A F0(])A F2(wor)A(d)-.37 E(her)164 216 Q(e-document)-.37 E
+(delimiter)144 228 Q F0 .128(No parameter e)108 244.8 R .127
+(xpansion, command substitution, arithmetic e)-.15 F .127
+(xpansion, or pathname e)-.15 F .127(xpansion is performed)-.15 F(on)108
+256.8 Q F2(wor)3.274 E(d)-.37 E F0 5.774(.I).77 G 3.274(fa)-5.774 G
+1.074 -.15(ny c)-3.274 H .774(haracters in).15 F F2(wor)3.614 E(d)-.37 E
+F0 .774(are quoted, the)4.044 F F2(delimiter)3.624 E F0 .774
+(is the result of quote remo)4.004 F -.25(va)-.15 G 3.275(lo).25 G(n)
+-3.275 E F2(wor)3.275 E(d)-.37 E F0 3.275(,a).77 G(nd)-3.275 E .905
+(the lines in the here-document are not e)108 268.8 R 3.405(xpanded. If)
+-.15 F F2(wor)3.405 E(d)-.37 E F0 .904
+(is unquoted, all lines of the here-document are)3.405 F .694
+(subjected to parameter e)108 280.8 R .695
+(xpansion, command substitution, and arithmetic e)-.15 F 3.195
+(xpansion. In)-.15 F .695(the latter case, the)3.195 F
+(character sequence)108 292.8 Q F1(\\<newline>)2.5 E F0(is ignored, and)
+2.5 E F1(\\)2.5 E F0(must be used to quote the characters)2.5 E F1(\\)
+2.5 E F0(,)A F1($)2.5 E F0 2.5(,a)C(nd)-2.5 E F1(`)2.5 E F0(.)A .602
+(If the redirection operator is)108 309.6 R F1(<<\255)3.101 E F0 3.101
+(,t)C .601(hen all leading tab characters are stripped from input lines\
+ and the line)-3.101 F(containing)108 321.6 Q F2(delimiter)2.5 E F0 5
+(.T).73 G(his allo)-5 E
+(ws here-documents within shell scripts to be indented in a natural f)
+-.25 E(ashion.)-.1 E F1(Her)87 338.4 Q 2.5(eS)-.18 G(trings)-2.5 E F0
+2.5(Av)108 350.4 S(ariant of here documents, the format is:)-2.75 E F1
+(<<<)144 367.2 Q F2(wor)A(d)-.37 E F0(The)108 384 Q F2(wor)2.5 E(d)-.37
+E F0(is e)2.5 E
+(xpanded and supplied to the command on its standard input.)-.15 E F1
+(Duplicating File Descriptors)87 400.8 Q F0(The redirection operator)108
+412.8 Q([)144 429.6 Q F2(n)A F0(])A F1(<&)A F2(wor)A(d)-.37 E F0 .126
+(is used to duplicate input \214le descriptors.)108 446.4 R(If)5.127 E
+F2(wor)2.967 E(d)-.37 E F0 -.15(ex)3.397 G .127
+(pands to one or more digits, the \214le descriptor denoted).15 F(by)108
+458.4 Q F2(n)3.318 E F0 .458(is made to be a cop)3.198 F 2.958(yo)-.1 G
+2.958(ft)-2.958 G .457(hat \214le descriptor)-2.958 F 5.457(.I)-.55 G
+2.957(ft)-5.457 G .457(he digits in)-2.957 F F2(wor)3.297 E(d)-.37 E F0
+.457(do not specify a \214le descriptor open)3.727 F .149
+(for input, a redirection error occurs.)108 470.4 R(If)5.149 E F2(wor)
+2.989 E(d)-.37 E F0 -.25(eva)3.419 G .149(luates to).25 F F1<ad>2.649 E
+F0 2.65<2c8c>C .15(le descriptor)-2.65 F F2(n)3.01 E F0 .15(is closed.)
+2.89 F(If)5.15 E F2(n)3.01 E F0 .15(is not speci\214ed,)2.89 F
+(the standard input \(\214le descriptor 0\) is used.)108 482.4 Q
+(The operator)108 499.2 Q([)144 516 Q F2(n)A F0(])A F1(>&)A F2(wor)A(d)
+-.37 E F0 .444
+(is used similarly to duplicate output \214le descriptors.)108 532.8 R
+(If)5.444 E F2(n)3.304 E F0 .443
+(is not speci\214ed, the standard output \(\214le descrip-)3.183 F 1.357
+(tor 1\) is used.)108 544.8 R 1.357(If the digits in)6.357 F F2(wor)
+4.197 E(d)-.37 E F0 1.358(do not specify a \214le descriptor open for o\
+utput, a redirection error)4.627 F 2.597(occurs. As)108 556.8 R 2.597
+(as)2.597 G .097(pecial case, if)-2.597 F F2(n)2.596 E F0 .096
+(is omitted, and)2.596 F F2(wor)2.596 E(d)-.37 E F0 .096(does not e)
+2.596 F .096(xpand to one or more digits, the standard out-)-.15 F
+(put and standard error are redirected as described pre)108 568.8 Q
+(viously)-.25 E(.)-.65 E F1(Mo)87 585.6 Q(ving File Descriptors)-.1 E F0
+(The redirection operator)108 597.6 Q([)144 614.4 Q F2(n)A F0(])A F1(<&)
+A F2(digit)A F1<ad>A F0(mo)108 631.2 Q -.15(ve)-.15 G 3.035(st).15 G
+.535(he \214le descriptor)-3.035 F F2(digit)3.035 E F0 .535
+(to \214le descriptor)3.035 F F2(n)3.035 E F0 3.035(,o).24 G 3.035(rt)
+-3.035 G .536(he standard input \(\214le descriptor 0\) if)-3.035 F F2
+(n)3.036 E F0 .536(is not speci-)3.036 F(\214ed.)108 643.2 Q F2(digit)5
+E F0(is closed after being duplicated to)2.5 E F2(n)2.5 E F0(.)A
+(Similarly)108 660 Q 2.5(,t)-.65 G(he redirection operator)-2.5 E([)144
+676.8 Q F2(n)A F0(])A F1(>&)A F2(digit)A F1<ad>A F0(mo)108 693.6 Q -.15
+(ve)-.15 G 2.786(st).15 G .286(he \214le descriptor)-2.786 F F2(digit)
+2.786 E F0 .286(to \214le descriptor)2.786 F F2(n)2.786 E F0 2.786(,o)
+.24 G 2.786(rt)-2.786 G .285
+(he standard output \(\214le descriptor 1\) if)-2.786 F F2(n)2.785 E F0
+.285(is not speci-)2.785 F(\214ed.)108 705.6 Q(GNU Bash-3.0)72 768 Q
+(2003 No)147.975 E 2.5(v1)-.15 G 197.965(32)-2.5 G(2)-197.965 E 0 Cg EP
+%%Page: 23 23
+%%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(Opening File Descriptors f)87 84 Q
+(or Reading and Writing)-.25 E F0(The redirection operator)108 96 Q([)
+144 112.8 Q/F2 10/Times-Italic@0 SF(n)A F0(])A F1(<>)A F2(wor)A(d)-.37 E
+F0 1.349(causes the \214le whose name is the e)108 129.6 R 1.349
+(xpansion of)-.15 F F2(wor)4.189 E(d)-.37 E F0 1.349
+(to be opened for both reading and writing on \214le)4.619 F(descriptor)
+108 141.6 Q F2(n)2.5 E F0 2.5(,o).24 G 2.5(ro)-2.5 G 2.5<6e8c>-2.5 G
+(le descriptor 0 if)-2.5 E F2(n)2.86 E F0(is not speci\214ed.)2.74 E
+(If the \214le does not e)5 E(xist, it is created.)-.15 E/F3 10.95
+/Times-Bold@0 SF(ALIASES)72 158.4 Q F2(Aliases)108 170.4 Q F0(allo)3.174
+E 3.174(was)-.25 G .674(tring to be substituted for a w)-3.174 F .674
+(ord when it is used as the \214rst w)-.1 F .673
+(ord of a simple command.)-.1 F .394(The shell maintains a list of alia\
+ses that may be set and unset with the)108 182.4 R F1(alias)2.894 E F0
+(and)2.894 E F1(unalias)2.894 E F0 -.2(bu)2.894 G .394(iltin commands).2
+F(\(see)108 194.4 Q/F4 9/Times-Bold@0 SF .763(SHELL B)3.264 F(UIL)-.09 E
+.763(TIN COMMANDS)-.828 F F0(belo)3.013 E 3.263(w\). The)-.25 F .763
+(\214rst w)3.263 F .763(ord of each command, if unquoted, is check)-.1 F
+.763(ed to)-.1 F .633(see if it has an alias.)108 206.4 R .633
+(If so, that w)5.633 F .633(ord is replaced by the te)-.1 F .634
+(xt of the alias.)-.15 F .634(The alias name and the replace-)5.634 F
+.538(ment te)108 218.4 R .538(xt may contain an)-.15 F 3.038(yv)-.15 G
+.537(alid shell input, including the)-3.288 F F2(metac)3.417 E(har)-.15
+E(acter)-.15 E(s)-.1 E F0 .537(listed abo)3.307 F -.15(ve)-.15 G 3.037
+(,w).15 G .537(ith the e)-3.037 F(xception)-.15 E .996
+(that the alias name may not contain)108 230.4 R F2(=)3.496 E F0 5.996
+(.T)C .996(he \214rst w)-5.996 F .997(ord of the replacement te)-.1 F
+.997(xt is tested for aliases, b)-.15 F .997(ut a)-.2 F -.1(wo)108 242.4
+S .495(rd that is identical to an alias being e).1 F .495
+(xpanded is not e)-.15 F .495(xpanded a second time.)-.15 F .494
+(This means that one may)5.494 F(alias)108 254.4 Q F1(ls)3.019 E F0(to)
+3.019 E F1 .519(ls \255F)3.019 F F0 3.019(,f)C .519(or instance, and)
+-3.019 F F1(bash)3.019 E F0 .52(does not try to recursi)3.019 F -.15(ve)
+-.25 G .52(ly e).15 F .52(xpand the replacement te)-.15 F 3.02(xt. If)
+-.15 F .52(the last)3.02 F .441(character of the alias v)108 266.4 R
+.441(alue is a)-.25 F F2(blank)2.941 E F0 2.941(,t).67 G .441
+(hen the ne)-2.941 F .441(xt command w)-.15 F .441(ord follo)-.1 F .441
+(wing the alias is also check)-.25 F .441(ed for)-.1 F(alias e)108 278.4
+Q(xpansion.)-.15 E(Aliases are created and listed with the)108 295.2 Q
+F1(alias)2.5 E F0(command, and remo)2.5 E -.15(ve)-.15 G 2.5(dw).15 G
+(ith the)-2.5 E F1(unalias)2.5 E F0(command.)2.5 E .284
+(There is no mechanism for using ar)108 312 R .284
+(guments in the replacement te)-.18 F 2.784(xt. If)-.15 F(ar)2.784 E
+.284(guments are needed, a shell func-)-.18 F(tion should be used \(see)
+108 324 Q F4(FUNCTIONS)2.5 E F0(belo)2.25 E(w\).)-.25 E 1.22
+(Aliases are not e)108 340.8 R 1.22
+(xpanded when the shell is not interacti)-.15 F -.15(ve)-.25 G 3.72(,u)
+.15 G 1.22(nless the)-3.72 F F1(expand_aliases)3.72 E F0 1.22
+(shell option is set)3.72 F(using)108 352.8 Q F1(shopt)2.5 E F0
+(\(see the description of)2.5 E F1(shopt)2.5 E F0(under)2.5 E F4
+(SHELL B)2.5 E(UIL)-.09 E(TIN COMMANDS)-.828 E F0(belo)2.25 E(w\).)-.25
+E .435
+(The rules concerning the de\214nition and use of aliases are some)108
+369.6 R .436(what confusing.)-.25 F F1(Bash)5.436 E F0(al)2.936 E -.1
+(wa)-.1 G .436(ys reads at least).1 F .338
+(one complete line of input before e)108 381.6 R -.15(xe)-.15 G .338
+(cuting an).15 F 2.838(yo)-.15 G 2.838(ft)-2.838 G .338
+(he commands on that line.)-2.838 F .337(Aliases are e)5.337 F .337
+(xpanded when)-.15 F 3.403(ac)108 393.6 S .904
+(ommand is read, not when it is e)-3.403 F -.15(xe)-.15 G 3.404
+(cuted. Therefore,).15 F .904
+(an alias de\214nition appearing on the same line as)3.404 F 1.162
+(another command does not tak)108 405.6 R 3.662(ee)-.1 G -.25(ff)-3.662
+G 1.162(ect until the ne).25 F 1.162(xt line of input is read.)-.15 F
+1.161(The commands follo)6.161 F 1.161(wing the)-.25 F .277
+(alias de\214nition on that line are not af)108 417.6 R .277
+(fected by the ne)-.25 F 2.777(wa)-.25 G 2.777(lias. This)-2.777 F(beha)
+2.777 E .277(vior is also an issue when functions)-.2 F .699(are e)108
+429.6 R -.15(xe)-.15 G 3.199(cuted. Aliases).15 F .699(are e)3.199 F
+.699(xpanded when a function de\214nition is read, not when the functio\
+n is e)-.15 F -.15(xe)-.15 G(cuted,).15 E .494
+(because a function de\214nition is itself a compound command.)108 441.6
+R .495(As a consequence, aliases de\214ned in a func-)5.494 F .085
+(tion are not a)108 453.6 R -.25(va)-.2 G .084
+(ilable until after that function is e).25 F -.15(xe)-.15 G 2.584
+(cuted. T).15 F 2.584(ob)-.8 G 2.584(es)-2.584 G .084(afe, al)-2.584 F
+-.1(wa)-.1 G .084(ys put alias de\214nitions on a sepa-).1 F
+(rate line, and do not use)108 465.6 Q F1(alias)2.5 E F0
+(in compound commands.)2.5 E -.15(Fo)108 482.4 S 2.5(ra).15 G(lmost e)
+-2.5 E -.15(ve)-.25 G
+(ry purpose, aliases are superseded by shell functions.).15 E F3
+(FUNCTIONS)72 499.2 Q F0 3.467(As)108 511.2 S .967
+(hell function, de\214ned as described abo)-3.467 F 1.267 -.15(ve u)-.15
+H(nder).15 E F4 .967(SHELL GRAMMAR)3.467 F/F5 9/Times-Roman@0 SF(,)A F0
+.968(stores a series of commands for)3.217 F 1.002(later e)108 523.2 R
+-.15(xe)-.15 G 3.502(cution. When).15 F 1.002(the name of a shell funct\
+ion is used as a simple command name, the list of com-)3.502 F .315
+(mands associated with that function name is e)108 535.2 R -.15(xe)-.15
+G 2.816(cuted. Functions).15 F .316(are e)2.816 F -.15(xe)-.15 G .316
+(cuted in the conte).15 F .316(xt of the current)-.15 F .036
+(shell; no ne)108 547.2 R 2.536(wp)-.25 G .036
+(rocess is created to interpret them \(contrast this with the e)-2.536 F
+-.15(xe)-.15 G .036(cution of a shell script\).).15 F .035(When a)5.035
+F .639(function is e)108 559.2 R -.15(xe)-.15 G .639(cuted, the ar).15 F
+.639
+(guments to the function become the positional parameters during its e)
+-.18 F -.15(xe)-.15 G(cution.).15 E .999(The special parameter)108 571.2
+R F1(#)3.498 E F0 .998(is updated to re\215ect the change.)3.498 F .998
+(Positional parameter 0 is unchanged.)5.998 F .998(The \214rst)5.998 F
+.369(element of the)108 583.2 R F4(FUNCN)2.869 E(AME)-.18 E F0 -.25(va)
+2.619 G .37
+(riable is set to the name of the function while the function is e).25 F
+-.15(xe)-.15 G 2.87(cuting. All).15 F 1.285
+(other aspects of the shell e)108 595.2 R -.15(xe)-.15 G 1.285
+(cution en).15 F 1.285
+(vironment are identical between a function and its caller with the)-.4
+F -.15(ex)108 607.2 S 1.96(ception that the).15 F F4(DEB)4.46 E(UG)-.09
+E F0 1.961(trap \(see the description of the)4.21 F F1(trap)4.461 E F0
+-.2(bu)4.461 G 1.961(iltin under).2 F F4 1.961(SHELL B)4.461 F(UIL)-.09
+E 1.961(TIN COM-)-.828 F(MANDS)108 619.2 Q F0(belo)2.343 E .092
+(w\) is not inherited unless the function has been gi)-.25 F -.15(ve)
+-.25 G 2.592(nt).15 G(he)-2.592 E F1(trace)2.592 E F0(attrib)2.592 E
+.092(ute \(see the description of)-.2 F(the)108 631.2 Q F4(declar)3.115
+E(e)-.162 E F0 -.2(bu)2.865 G .615(iltin belo).2 F .615(w\) or the)-.25
+F F1 .616(\255o functrace)3.115 F F0 .616
+(shell option has been enabled with the)3.116 F F1(set)3.116 E F0 -.2
+(bu)3.116 G .616(iltin \(in which).2 F(case all functions inherit the)
+108 643.2 Q F1(DEB)2.5 E(UG)-.1 E F0(trap\).)2.5 E -1.11(Va)108 660 S
+.656(riables local to the function may be declared with the)1.11 F F1
+(local)3.155 E F0 -.2(bu)3.155 G .655(iltin command.).2 F(Ordinarily)
+5.655 E 3.155(,v)-.65 G .655(ariables and)-3.405 F(their v)108 672 Q
+(alues are shared between the function and its caller)-.25 E(.)-.55 E
+.043(If the b)108 688.8 R .043(uiltin command)-.2 F F1 -.18(re)2.543 G
+(tur).18 E(n)-.15 E F0 .043(is e)2.543 F -.15(xe)-.15 G .043
+(cuted in a function, the function completes and e).15 F -.15(xe)-.15 G
+.044(cution resumes with).15 F 1.012(the ne)108 700.8 R 1.012
+(xt command after the function call.)-.15 F(An)6.011 E 3.511(yc)-.15 G
+1.011(ommand associated with the)-3.511 F F1(RETURN)3.511 E F0 1.011
+(trap is e)3.511 F -.15(xe)-.15 G(cuted).15 E .213(before e)108 712.8 R
+-.15(xe)-.15 G .213(cution resumes.).15 F .213
+(When a function completes, the v)5.213 F .214
+(alues of the positional parameters and the spe-)-.25 F(cial parameter)
+108 724.8 Q F1(#)2.5 E F0(are restored to the v)2.5 E(alues the)-.25 E
+2.5(yh)-.15 G(ad prior to the function')-2.5 E 2.5(se)-.55 G -.15(xe)
+-2.65 G(cution.).15 E(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)
+-.15 G 197.965(32)-2.5 G(3)-197.965 E 0 Cg EP
+%%Page: 24 24
+%%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 1.359(Function names and de\214nitions may be listed with the)108
+84 R/F1 10/Times-Bold@0 SF<ad66>3.858 E F0 1.358(option to the)3.858 F
+F1(declar)3.858 E(e)-.18 E F0(or)3.858 E F1(typeset)3.858 E F0 -.2(bu)
+3.858 G 1.358(iltin com-).2 F 3.39(mands. The)108 96 R F1<ad46>3.39 E F0
+.89(option to)3.39 F F1(declar)3.39 E(e)-.18 E F0(or)3.39 E F1(typeset)
+3.39 E F0 .89
+(will list the function names only \(and optionally the source)3.39 F
+.327(\214le and line number)108 108 R 2.827(,i)-.4 G 2.827(ft)-2.827 G
+(he)-2.827 E F1(extdeb)2.827 E(ug)-.2 E F0 .326
+(shell option is enabled\).)2.827 F .326(Functions may be e)5.326 F .326
+(xported so that subshells)-.15 F .011(automatically ha)108 120 R .311
+-.15(ve t)-.2 H .011(hem de\214ned with the).15 F F1<ad66>2.511 E F0
+.011(option to the)2.511 F F1(export)2.511 E F0 -.2(bu)2.511 G 2.511
+(iltin. Note).2 F .012(that shell functions and v)2.511 F(ari-)-.25 E
+.188(ables with the same name may result in multiple identically-named \
+entries in the en)108 132 R .187(vironment passed to the)-.4 F(shell')
+108 144 Q 2.5(sc)-.55 G 2.5(hildren. Care)-2.5 F(should be tak)2.5 E
+(en in cases where this may cause a problem.)-.1 E
+(Functions may be recursi)108 160.8 Q -.15(ve)-.25 G 5(.N).15 G 2.5(ol)
+-5 G(imit is imposed on the number of recursi)-2.5 E .3 -.15(ve c)-.25 H
+(alls.).15 E/F2 10.95/Times-Bold@0 SF(ARITHMETIC EV)72 177.6 Q(ALU)
+-1.478 E -1.04(AT)-.657 G(ION)1.04 E F0 2.297(The shell allo)108 189.6 R
+2.297(ws arithmetic e)-.25 F 2.297(xpressions to be e)-.15 F -.25(va)
+-.25 G 2.297(luated, under certain circumstances \(see the).25 F F1(let)
+4.798 E F0(and)4.798 E F1(declar)108 201.6 Q(e)-.18 E F0 -.2(bu)2.706 G
+.206(iltin commands and).2 F F1 .206(Arithmetic Expansion)2.706 F F0
+2.705(\). Ev)B .205(aluation is done in \214x)-.25 F .205(ed-width inte)
+-.15 F .205(gers with no)-.15 F .428(check for o)108 213.6 R -.15(ve)
+-.15 G(r\215o).15 E 1.728 -.65(w, t)-.25 H .428(hough di).65 F .428
+(vision by 0 is trapped and \215agged as an error)-.25 F 5.429(.T)-.55 G
+.429(he operators and their prece-)-5.429 F 1.92(dence, associati)108
+225.6 R(vity)-.25 E 4.42(,a)-.65 G 1.92(nd v)-4.42 F 1.92
+(alues are the same as in the C language.)-.25 F 1.919(The follo)6.919 F
+1.919(wing list of operators is)-.25 F(grouped into le)108 237.6 Q -.15
+(ve)-.25 G(ls of equal-precedence operators.).15 E(The le)5 E -.15(ve)
+-.25 G(ls are listed in order of decreasing precedence.).15 E/F3 10
+/Times-Italic@0 SF(id)108 254.4 Q F1(++)A F3(id)2.5 E F1<adad>A F0 -.25
+(va)144 266.4 S(riable post-increment and post-decrement).25 E F1(++)108
+278.4 Q F3(id)A F1<adad>2.5 E F3(id)A F0 -.25(va)144 290.4 S
+(riable pre-increment and pre-decrement).25 E F1 2.5<ad2b>108 302.4 S F0
+(unary minus and plus)19.6 E F1 2.5(!~)108 314.4 S F0
+(logical and bitwise ne)24.34 E -.05(ga)-.15 G(tion).05 E F1(**)108
+326.4 Q F0 -.15(ex)26 G(ponentiation).15 E F1 2.5(*/%)108 338.4 S F0
+(multiplication, di)10.72 E(vision, remainder)-.25 E F1 2.5<2bad>108
+350.4 S F0(addition, subtraction)19.6 E F1(<< >>)108 362.4 Q F0
+(left and right bitwise shifts)10.7 E F1(<= >= < >)108 374.4 Q F0
+(comparison)144 386.4 Q F1(== !=)108 398.4 Q F0(equality and inequality)
+13.07 E F1(&)108 410.4 Q F0(bitwise AND)27.67 E F1(^)108 422.4 Q F0
+(bitwise e)32.67 E(xclusi)-.15 E .3 -.15(ve O)-.25 H(R).15 E F1(|)108
+434.4 Q F0(bitwise OR)33.8 E F1(&&)108 446.4 Q F0(logical AND)19.34 E F1
+(||)108 458.4 Q F0(logical OR)31.6 E F3 -.2(ex)108 470.4 S(pr).2 E F1(?)
+A F3 -.2(ex)C(pr).2 E F1(:)A F3 -.2(ex)C(pr).2 E F0
+(conditional operator)144 482.4 Q F1 2.5(=*)108 494.4 S 2.5(=/)-2.5 G
+2.5(=%)-2.5 G 2.5(=+)-2.5 G 2.5<3dad>-2.5 G 2.5(=<)-2.5 G
+(<= >>= &= ^= |=)-2.5 E F0(assignment)144 506.4 Q F3 -.2(ex)108 518.4 S
+(pr1).2 E F1(,)2.5 E F3 -.2(ex)2.5 G(pr2).2 E F0(comma)144 530.4 Q .68
+(Shell v)108 547.2 R .68(ariables are allo)-.25 F .68
+(wed as operands; parameter e)-.25 F .68
+(xpansion is performed before the e)-.15 F .68(xpression is e)-.15 F
+-.25(va)-.25 G(lu-).25 E 3.508(ated. W)108 559.2 R 1.008(ithin an e)-.4
+F 1.008(xpression, shell v)-.15 F 1.007
+(ariables may also be referenced by name without using the parameter)
+-.25 F -.15(ex)108 571.2 S 1.04(pansion syntax.).15 F 3.54(As)6.04 G
+1.04(hell v)-3.54 F 1.04(ariable that is null or unset e)-.25 F -.25(va)
+-.25 G 1.041(luates to 0 when referenced by name without).25 F 1.467
+(using the parameter e)108 583.2 R 1.467(xpansion syntax.)-.15 F 1.467
+(The v)6.467 F 1.467(alue of a v)-.25 F 1.467(ariable is e)-.25 F -.25
+(va)-.25 G 1.466(luated as an arithmetic e).25 F(xpression)-.15 E 1.389
+(when it is referenced, or when a v)108 595.2 R 1.389
+(ariable which has been gi)-.25 F -.15(ve)-.25 G 3.89(nt).15 G(he)-3.89
+E F3(inte)3.89 E -.1(ge)-.4 G(r).1 E F0(attrib)3.89 E 1.39(ute using)-.2
+F F1(declar)3.89 E 3.89(e-)-.18 G(i)-3.89 E F0(is)3.89 E .344
+(assigned a v)108 607.2 R 2.844(alue. A)-.25 F .343(null v)2.843 F .343
+(alue e)-.25 F -.25(va)-.25 G .343(luates to 0.).25 F 2.843(As)5.343 G
+.343(hell v)-2.843 F .343(ariable need not ha)-.25 F .643 -.15(ve i)-.2
+H .343(ts inte).15 F .343(ger attrib)-.15 F .343(ute turned on)-.2 F
+(to be used in an e)108 619.2 Q(xpression.)-.15 E 1.406
+(Constants with a leading 0 are interpreted as octal numbers.)108 636 R
+3.906(Al)6.406 G 1.407(eading 0x or 0X denotes he)-3.906 F(xadecimal.)
+-.15 E .59(Otherwise, numbers tak)108 648 R 3.09(et)-.1 G .59(he form [)
+-3.09 F F3(base#)A F0 .59(]n, where)B F3(base)3.089 E F0 .589
+(is a decimal number between 2 and 64 represent-)3.089 F .092
+(ing the arithmetic base, and)108 660 R F3(n)2.592 E F0 .093
+(is a number in that base.)2.592 F(If)5.093 E F3(base#)2.593 E F0 .093
+(is omitted, then base 10 is used.)2.593 F .093(The digits)5.093 F .065
+(greater than 9 are represented by the lo)108 672 R .064
+(wercase letters, the uppercase letters, @, and _, in that order)-.25 F
+5.064(.I)-.55 G(f)-5.064 E F3(base)2.564 E F0 .696
+(is less than or equal to 36, lo)108 684 R .697
+(wercase and uppercase letters may be used interchang)-.25 F .697
+(ably to represent num-)-.05 F(bers between 10 and 35.)108 696 Q .235
+(Operators are e)108 712.8 R -.25(va)-.25 G .235
+(luated in order of precedence.).25 F(Sub-e)5.234 E .234
+(xpressions in parentheses are e)-.15 F -.25(va)-.25 G .234
+(luated \214rst and may).25 F -.15(ove)108 724.8 S
+(rride the precedence rules abo).15 E -.15(ve)-.15 G(.).15 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(32)-2.5 G
+(4)-197.965 E 0 Cg EP
+%%Page: 25 25
+%%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.95/Times-Bold@0 SF(CONDITION)72 84 Q(AL EXPRESSIONS)-.219 E
+F0 .255(Conditional e)108 96 R .255(xpressions are used by the)-.15 F/F2
+10/Times-Bold@0 SF([[)2.755 E F0 .255(compound command and the)2.755 F
+F2(test)2.755 E F0(and)2.755 E F2([)2.756 E F0 -.2(bu)2.756 G .256
+(iltin commands to test).2 F .77(\214le attrib)108 108 R .77
+(utes and perform string and arithmetic comparisons.)-.2 F .77
+(Expressions are formed from the follo)5.77 F(wing)-.25 E 1.04
+(unary or binary primaries.)108 120 R 1.04(If an)6.04 F(y)-.15 E/F3 10
+/Times-Italic@0 SF(\214le)3.54 E F0(ar)3.54 E 1.041
+(gument to one of the primaries is of the form)-.18 F F3(/de)3.541 E
+(v/fd/n)-.15 E F0 3.541(,t)C 1.041(hen \214le)-3.541 F(descriptor)108
+132 Q F3(n)3.789 E F0 1.289(is check)3.789 F 3.789(ed. If)-.1 F(the)
+3.789 E F3(\214le)3.789 E F0(ar)3.789 E 1.289
+(gument to one of the primaries is one of)-.18 F F3(/de)3.789 E(v/stdin)
+-.15 E F0(,)A F3(/de)3.788 E(v/stdout)-.15 E F0 3.788(,o)C(r)-3.788 E F3
+(/de)108 144 Q(v/stderr)-.15 E F0 2.5<2c8c>C
+(le descriptor 0, 1, or 2, respecti)-2.5 E -.15(ve)-.25 G(ly).15 E 2.5
+(,i)-.65 G 2.5(sc)-2.5 G(heck)-2.5 E(ed.)-.1 E F2<ad61>108 168 Q F3
+(\214le)2.5 E F0 -.35(Tr)10.58 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)
+2.5 G(ists.).15 E F2<ad62>108 180 Q F3(\214le)2.5 E F0 -.35(Tr)10.02 G
+(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)2.5 G
+(ists and is a block special \214le.).15 E F2<ad63>108 192 Q F3(\214le)
+2.5 E F0 -.35(Tr)11.14 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)2.5 G
+(ists and is a character special \214le.).15 E F2<ad64>108 204 Q F3
+(\214le)2.5 E F0 -.35(Tr)10.02 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)
+2.5 G(ists and is a directory).15 E(.)-.65 E F2<ad65>108 216 Q F3
+(\214le)2.5 E F0 -.35(Tr)11.14 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)
+2.5 G(ists.).15 E F2<ad66>108 228 Q F3(\214le)2.5 E F0 -.35(Tr)12.25 G
+(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)2.5 G(ists and is a re).15 E
+(gular \214le.)-.15 E F2<ad67>108 240 Q F3(\214le)2.5 E F0 -.35(Tr)10.58
+G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)2.5 G
+(ists and is set-group-id.).15 E F2<ad68>108 252 Q F3(\214le)2.5 E F0
+-.35(Tr)10.02 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)2.5 G
+(ists and is a symbolic link.).15 E F2<ad6b>108 264 Q F3(\214le)2.5 E F0
+-.35(Tr)10.02 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)2.5 G
+(ists and its `).15 E(`stick)-.74 E(y')-.15 E 2.5('b)-.74 G(it is set.)
+-2.5 E F2<ad70>108 276 Q F3(\214le)2.5 E F0 -.35(Tr)10.02 G(ue if).35 E
+F3(\214le)2.5 E F0 -.15(ex)2.5 G(ists and is a named pipe \(FIFO\).).15
+E F2<ad72>108 288 Q F3(\214le)2.5 E F0 -.35(Tr)11.14 G(ue if).35 E F3
+(\214le)2.5 E F0 -.15(ex)2.5 G(ists and is readable.).15 E F2<ad73>108
+300 Q F3(\214le)2.5 E F0 -.35(Tr)11.69 G(ue if).35 E F3(\214le)2.5 E F0
+-.15(ex)2.5 G(ists and has a size greater than zero.).15 E F2<ad74>108
+312 Q F3(fd)2.5 E F0 -.35(Tr)16.69 G(ue if \214le descriptor).35 E F3
+(fd)4.47 E F0(is open and refers to a terminal.)3.27 E F2<ad75>108 324 Q
+F3(\214le)2.5 E F0 -.35(Tr)10.02 G(ue if).35 E F3(\214le)2.5 E F0 -.15
+(ex)2.5 G(ists and its set-user).15 E(-id bit is set.)-.2 E F2<ad77>108
+336 Q F3(\214le)2.5 E F0 -.35(Tr)8.36 G(ue if).35 E F3(\214le)2.5 E F0
+-.15(ex)2.5 G(ists and is writable.).15 E F2<ad78>108 348 Q F3(\214le)
+2.5 E F0 -.35(Tr)10.58 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)2.5 G
+(ists and is e).15 E -.15(xe)-.15 G(cutable.).15 E F2<ad4f>108 360 Q F3
+(\214le)2.5 E F0 -.35(Tr)7.8 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)
+2.5 G(ists and is o).15 E(wned by the ef)-.25 E(fecti)-.25 E .3 -.15
+(ve u)-.25 H(ser id.).15 E F2<ad47>108 372 Q F3(\214le)2.5 E F0 -.35(Tr)
+7.8 G(ue if).35 E F3(\214le)2.5 E F0 -.15(ex)2.5 G(ists and is o).15 E
+(wned by the ef)-.25 E(fecti)-.25 E .3 -.15(ve g)-.25 H(roup id.).15 E
+F2<ad4c>108 384 Q F3(\214le)2.5 E F0 -.35(Tr)8.91 G(ue if).35 E F3
+(\214le)2.5 E F0 -.15(ex)2.5 G(ists and is a symbolic link.).15 E F2
+<ad53>108 396 Q F3(\214le)2.5 E F0 -.35(Tr)10.02 G(ue if).35 E F3
+(\214le)2.5 E F0 -.15(ex)2.5 G(ists and is a sock).15 E(et.)-.1 E F2
+<ad4e>108 408 Q F3(\214le)2.5 E F0 -.35(Tr)8.36 G(ue if).35 E F3(\214le)
+2.5 E F0 -.15(ex)2.5 G(ists and has been modi\214ed since it w).15 E
+(as last read.)-.1 E F3(\214le1)108 420 Q F0<ad>2.5 E F2(nt)A F3
+(\214le2)2.5 E F0 -.35(Tr)144 432 S .038(ue if).35 F F3(\214le1)2.538 E
+F0 .039(is ne)2.539 F .039
+(wer \(according to modi\214cation date\) than)-.25 F F3(\214le2)2.539 E
+F0 2.539(,o)C 2.539(ri)-2.539 G(f)-2.539 E F3(\214le1)2.539 E F0 -.15
+(ex)2.539 G .039(ists and).15 F F3(\214le2)2.539 E F0 .039(does not.)
+2.539 F F3(\214le1)108 444 Q F0<ad>2.5 E F2(ot)A F3(\214le2)2.5 E F0
+-.35(Tr)144 456 S(ue if).35 E F3(\214le1)2.5 E F0(is older than)2.5 E F3
+(\214le2)2.5 E F0 2.5(,o)C 2.5(ri)-2.5 G(f)-2.5 E F3(\214le2)2.5 E F0
+-.15(ex)2.5 G(ists and).15 E F3(\214le1)2.5 E F0(does not.)2.5 E F3
+(\214le1)108 468 Q F2(\255ef)2.5 E F3(\214le2)2.5 E F0 -.35(Tr)144 480 S
+(ue if).35 E F3(\214le1)2.5 E F0(and)2.5 E F3(\214le2)2.5 E F0
+(refer to the same de)2.5 E(vice and inode numbers.)-.25 E F2<ad6f>108
+492 Q F3(optname)2.5 E F0 -.35(Tr)144 504 S 1.144(ue if shell option).35
+F F3(optname)3.874 E F0 1.144(is enabled.)3.824 F 1.143
+(See the list of options under the description of the)6.144 F F2<ad6f>
+3.643 E F0(option to the)144 516 Q F2(set)2.5 E F0 -.2(bu)2.5 G
+(iltin belo).2 E -.65(w.)-.25 G F2<ad7a>108 528 Q F3(string)2.5 E F0
+-.35(Tr)144 540 S(ue if the length of).35 E F3(string)2.5 E F0(is zero.)
+2.5 E F2<ad6e>108 552 Q F3(string)2.5 E(string)108 564 Q F0 -.35(Tr)
+12.66 G(ue if the length of).35 E F3(string)2.84 E F0(is non-zero.)2.72
+E F3(string1)108 576 Q F2(==)2.5 E F3(string2)2.5 E F0 -.35(Tr)144 588 S
+(ue if the strings are equal.).35 E F2(=)5 E F0(may be used in place of)
+2.5 E F2(==)2.5 E F0(for strict POSIX compliance.)2.5 E F3(string1)108
+600 Q F2(!=)2.5 E F3(string2)2.5 E F0 -.35(Tr)144 612 S
+(ue if the strings are not equal.).35 E F3(string1)108 624 Q F2(<)2.5 E
+F3(string2)2.5 E F0 -.35(Tr)144 636 S(ue if).35 E F3(string1)2.5 E F0
+(sorts before)2.5 E F3(string2)2.5 E F0(le)2.5 E
+(xicographically in the current locale.)-.15 E F3(string1)108 648 Q F2
+(>)2.5 E F3(string2)2.5 E F0 -.35(Tr)144 660 S(ue if).35 E F3(string1)
+2.5 E F0(sorts after)2.5 E F3(string2)2.5 E F0(le)2.5 E
+(xicographically in the current locale.)-.15 E F3(ar)108.33 672 Q(g1)
+-.37 E F2(OP)2.5 E F3(ar)2.5 E(g2)-.37 E/F4 9/Times-Bold@0 SF(OP)144 684
+Q F0 .385(is one of)2.634 F F2(\255eq)2.885 E F0(,)A F2(\255ne)2.885 E
+F0(,)A F2(\255lt)2.885 E F0(,)A F2(\255le)2.885 E F0(,)A F2(\255gt)2.885
+E F0 2.885(,o)C(r)-2.885 E F2(\255ge)2.885 E F0 5.385(.T)C .385
+(hese arithmetic binary operators return true if)-5.385 F F3(ar)2.885 E
+(g1)-.37 E F0 .845(is equal to, not equal to, less than, less than or e\
+qual to, greater than, or greater than or equal to)144 696 R F3(ar)144
+708 Q(g2)-.37 E F0 2.5(,r)C(especti)-2.5 E -.15(ve)-.25 G(ly).15 E(.)
+-.65 E F3(Ar)6.01 E(g1)-.37 E F0(and)2.5 E F3(ar)2.83 E(g2)-.37 E F0
+(may be positi)2.52 E .3 -.15(ve o)-.25 H 2.5(rn).15 G -2.25 -.15(eg a)
+-2.5 H(ti).15 E .3 -.15(ve i)-.25 H(nte).15 E(gers.)-.15 E(GNU Bash-3.0)
+72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(32)-2.5 G(5)-197.965 E
+0 Cg EP
+%%Page: 26 26
+%%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.95/Times-Bold@0 SF(SIMPLE COMMAND EXP)72 84 Q(ANSION)-.81 E
+F0 .613(When a simple command is e)108 96 R -.15(xe)-.15 G .614
+(cuted, the shell performs the follo).15 F .614(wing e)-.25 F .614
+(xpansions, assignments, and redi-)-.15 F(rections, from left to right.)
+108 108 Q 26(1. The)108 124.8 R -.1(wo)4.349 G 1.849
+(rds that the parser has mark).1 F 1.848(ed as v)-.1 F 1.848
+(ariable assignments \(those preceding the command)-.25 F
+(name\) and redirections are sa)144 136.8 Q -.15(ve)-.2 G 2.5(df).15 G
+(or later processing.)-2.5 E 26(2. The)108 153.6 R -.1(wo)3.663 G 1.163
+(rds that are not v).1 F 1.164
+(ariable assignments or redirections are e)-.25 F 3.664(xpanded. If)-.15
+F(an)3.664 E 3.664(yw)-.15 G 1.164(ords remain)-3.764 F .776(after e)144
+165.6 R .776(xpansion, the \214rst w)-.15 F .776(ord is tak)-.1 F .775
+(en to be the name of the command and the remaining w)-.1 F(ords)-.1 E
+(are the ar)144 177.6 Q(guments.)-.18 E 26(3. Redirections)108 194.4 R
+(are performed as described abo)2.5 E .3 -.15(ve u)-.15 H(nder).15 E/F2
+9/Times-Bold@0 SF(REDIRECTION)2.5 E/F3 9/Times-Roman@0 SF(.)A F0 26
+(4. The)108 211.2 R(te)3.216 E .717(xt after the)-.15 F/F4 10
+/Times-Bold@0 SF(=)3.217 E F0 .717(in each v)3.217 F .717
+(ariable assignment under)-.25 F .717(goes tilde e)-.18 F .717
+(xpansion, parameter e)-.15 F(xpansion,)-.15 E .34
+(command substitution, arithmetic e)144 223.2 R .339
+(xpansion, and quote remo)-.15 F -.25(va)-.15 G 2.839(lb).25 G .339
+(efore being assigned to the v)-2.839 F(ari-)-.25 E(able.)144 235.2 Q
+.332(If no command name results, the v)108 252 R .332
+(ariable assignments af)-.25 F .332(fect the current shell en)-.25 F
+2.833(vironment. Otherwise,)-.4 F(the)2.833 E -.25(va)108 264 S .757
+(riables are added to the en).25 F .757(vironment of the e)-.4 F -.15
+(xe)-.15 G .757(cuted command and do not af).15 F .757
+(fect the current shell en)-.25 F(vi-)-.4 E 3.176(ronment. If)108 276 R
+(an)3.176 E 3.176(yo)-.15 G 3.176(ft)-3.176 G .677
+(he assignments attempts to assign a v)-3.176 F .677
+(alue to a readonly v)-.25 F .677(ariable, an error occurs, and)-.25 F
+(the command e)108 288 Q(xits with a non-zero status.)-.15 E .15
+(If no command name results, redirections are performed, b)108 304.8 R
+.149(ut do not af)-.2 F .149(fect the current shell en)-.25 F 2.649
+(vironment. A)-.4 F(redirection error causes the command to e)108 316.8
+Q(xit with a non-zero status.)-.15 E 1.064
+(If there is a command name left after e)108 333.6 R 1.064(xpansion, e)
+-.15 F -.15(xe)-.15 G 1.064(cution proceeds as described belo).15 F
+4.864 -.65(w. O)-.25 H 1.064(therwise, the).65 F .069(command e)108
+345.6 R 2.569(xits. If)-.15 F .069(one of the e)2.569 F .069
+(xpansions contained a command substitution, the e)-.15 F .068
+(xit status of the command)-.15 F .466(is the e)108 357.6 R .466
+(xit status of the last command substitution performed.)-.15 F .467
+(If there were no command substitutions, the)5.466 F(command e)108 369.6
+Q(xits with a status of zero.)-.15 E F1(COMMAND EXECUTION)72 386.4 Q F0
+.547(After a command has been split into w)108 398.4 R .546
+(ords, if it results in a simple command and an optional list of ar)-.1
+F(gu-)-.18 E(ments, the follo)108 410.4 Q(wing actions are tak)-.25 E
+(en.)-.1 E .379(If the command name contains no slashes, the shell atte\
+mpts to locate it.)108 427.2 R .379(If there e)5.379 F .379
+(xists a shell function by)-.15 F .246(that name, that function is in)
+108 439.2 R -.2(vo)-.4 G -.1(ke).2 G 2.746(da).1 G 2.746(sd)-2.746 G
+.246(escribed abo)-2.746 F .546 -.15(ve i)-.15 H(n).15 E F2(FUNCTIONS)
+2.746 E F3(.)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 451.2 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 .309
+(If the name is neither a shell function nor a b)108 468 R .31
+(uiltin, and contains no slashes,)-.2 F F4(bash)2.81 E F0 .31
+(searches each element of)2.81 F(the)108 480 Q F2 -.666(PA)3.163 G(TH)
+-.189 E F0 .662(for a directory containing an e)2.913 F -.15(xe)-.15 G
+.662(cutable \214le by that name.).15 F F4(Bash)5.662 E F0 .662
+(uses a hash table to remember)3.162 F 1.914(the full pathnames of e)108
+492 R -.15(xe)-.15 G 1.915(cutable \214les \(see).15 F F4(hash)4.415 E
+F0(under)4.415 E F2 1.915(SHELL B)4.415 F(UIL)-.09 E 1.915(TIN COMMANDS)
+-.828 F F0(belo)4.165 E 4.415(w\). A)-.25 F(full)4.415 E .72
+(search of the directories in)108 504 R F2 -.666(PA)3.22 G(TH)-.189 E F0
+.719(is performed only if the command is not found in the hash table.)
+2.97 F .719(If the)5.719 F(search is unsuccessful, the shell prints an \
+error message and returns an e)108 516 Q(xit status of 127.)-.15 E 1.089
+(If the search is successful, or if the command name contains one or mo\
+re slashes, the shell e)108 532.8 R -.15(xe)-.15 G 1.09(cutes the).15 F
+.198(named program in a separate e)108 544.8 R -.15(xe)-.15 G .198
+(cution en).15 F 2.698(vironment. Ar)-.4 F .198
+(gument 0 is set to the name gi)-.18 F -.15(ve)-.25 G .197
+(n, and the remain-).15 F(ing ar)108 556.8 Q
+(guments to the command are set to the ar)-.18 E(guments gi)-.18 E -.15
+(ve)-.25 G(n, if an).15 E -.65(y.)-.15 G 1.809(If this e)108 573.6 R
+-.15(xe)-.15 G 1.809(cution f).15 F 1.809
+(ails because the \214le is not in e)-.1 F -.15(xe)-.15 G 1.809
+(cutable format, and the \214le is not a directory).15 F 4.309(,i)-.65 G
+4.309(ti)-4.309 G(s)-4.309 E .678(assumed to be a)108 585.6 R/F5 10
+/Times-Italic@0 SF .678(shell script)3.178 F F0 3.178(,a\214)C .678
+(le containing shell commands.)-3.178 F 3.178(As)5.678 G .678
+(ubshell is spa)-3.178 F .677(wned to e)-.15 F -.15(xe)-.15 G .677
+(cute it.).15 F(This)5.677 E .329
+(subshell reinitializes itself, so that the ef)108 597.6 R .329
+(fect is as if a ne)-.25 F 2.83(ws)-.25 G .33(hell had been in)-2.83 F
+-.2(vo)-.4 G -.1(ke).2 G 2.83(dt).1 G 2.83(oh)-2.83 G .33
+(andle the script, with)-2.83 F 1.219(the e)108 609.6 R 1.219
+(xception that the locations of commands remembered by the parent \(see)
+-.15 F F4(hash)3.719 E F0(belo)3.719 E 3.719(wu)-.25 G(nder)-3.719 E F2
+(SHELL)3.719 E -.09(BU)108 621.6 S(IL).09 E(TIN COMMANDS)-.828 E F3(\))A
+F0(are retained by the child.)2.25 E .347(If the program is a \214le be)
+108 638.4 R .347(ginning with)-.15 F F4(#!)2.847 E F0 2.847(,t)C .348(h\
+e remainder of the \214rst line speci\214es an interpreter for the pro-)
+-2.847 F 3.178(gram. The)108 650.4 R .678(shell e)3.178 F -.15(xe)-.15 G
+.678(cutes the speci\214ed interpreter on operating systems that do not\
+ handle this e).15 F -.15(xe)-.15 G(cutable).15 E 1.192(format themselv)
+108 662.4 R 3.692(es. The)-.15 F(ar)3.693 E 1.193
+(guments to the interpreter consist of a single optional ar)-.18 F 1.193
+(gument follo)-.18 F 1.193(wing the)-.25 F 1.131
+(interpreter name on the \214rst line of the program, follo)108 674.4 R
+1.13(wed by the name of the program, follo)-.25 F 1.13(wed by the)-.25 F
+(command ar)108 686.4 Q(guments, if an)-.18 E -.65(y.)-.15 G F1
+(COMMAND EXECUTION ENVIR)72 703.2 Q(ONMENT)-.329 E F0(The shell has an)
+108 715.2 Q F5 -.2(ex)2.5 G(ecution en).2 E(vir)-.4 E(onment)-.45 E F0
+2.5(,w)C(hich consists of the follo)-2.5 E(wing:)-.25 E(GNU Bash-3.0)72
+768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(32)-2.5 G(6)-197.965 E 0
+Cg EP
+%%Page: 27 27
+%%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 32.5<836f>108 84 S 1.405
+(pen \214les inherited by the shell at in)-32.5 F -.2(vo)-.4 G 1.406
+(cation, as modi\214ed by redirections supplied to the).2 F/F1 10
+/Times-Bold@0 SF(exec)3.906 E F0 -.2(bu)144 96 S(iltin).2 E 32.5<8374>
+108 112.8 S(he current w)-32.5 E(orking directory as set by)-.1 E F1(cd)
+2.5 E F0(,)A F1(pushd)2.5 E F0 2.5(,o)C(r)-2.5 E F1(popd)2.5 E F0 2.5
+(,o)C 2.5(ri)-2.5 G(nherited by the shell at in)-2.5 E -.2(vo)-.4 G
+(cation).2 E 32.5<8374>108 129.6 S
+(he \214le creation mode mask as set by)-32.5 E F1(umask)2.5 E F0
+(or inherited from the shell')2.5 E 2.5(sp)-.55 G(arent)-2.5 E 32.5
+<8363>108 146.4 S(urrent traps set by)-32.5 E F1(trap)2.5 E F0 32.5
+<8373>108 163.2 S .257(hell parameters that are set by v)-32.5 F .256
+(ariable assignment or with)-.25 F F1(set)2.756 E F0 .256
+(or inherited from the shell')2.756 F 2.756(sp)-.55 G(arent)-2.756 E
+(in the en)144 175.2 Q(vironment)-.4 E 32.5<8373>108 192 S
+(hell functions de\214ned during e)-32.5 E -.15(xe)-.15 G
+(cution or inherited from the shell').15 E 2.5(sp)-.55 G
+(arent in the en)-2.5 E(vironment)-.4 E 32.5<836f>108 208.8 S
+(ptions enabled at in)-32.5 E -.2(vo)-.4 G(cation \(either by def).2 E
+(ault or with command-line ar)-.1 E(guments\) or by)-.18 E F1(set)2.5 E
+F0 32.5<836f>108 225.6 S(ptions enabled by)-32.5 E F1(shopt)2.5 E F0
+32.5<8373>108 242.4 S(hell aliases de\214ned with)-32.5 E F1(alias)2.5 E
+F0 32.5<8376>108 259.2 S
+(arious process IDs, including those of background jobs, the v)-32.75 E
+(alue of)-.25 E F1($$)2.5 E F0 2.5(,a)C(nd the v)-2.5 E(alue of)-.25 E
+F1($PPID)2.5 E F0 .426(When a simple command other than a b)108 276 R
+.427(uiltin or shell function is to be e)-.2 F -.15(xe)-.15 G .427
+(cuted, it is in).15 F -.2(vo)-.4 G -.1(ke).2 G 2.927(di).1 G 2.927(nas)
+-2.927 G(eparate)-2.927 E -.15(exe)108 288 S .134(cution en).15 F .134
+(vironment that consists of the follo)-.4 F 2.634(wing. Unless)-.25 F
+.133(otherwise noted, the v)2.634 F .133(alues are inherited from)-.25 F
+(the shell.)108 300 Q 32.5<8374>108 328.8 S 1.055(he shell')-32.5 F
+3.555(so)-.55 G 1.055(pen \214les, plus an)-3.555 F 3.556(ym)-.15 G
+1.056
+(odi\214cations and additions speci\214ed by redirections to the com-)
+-3.556 F(mand)144 340.8 Q 32.5<8374>108 357.6 S(he current w)-32.5 E
+(orking directory)-.1 E 32.5<8374>108 374.4 S
+(he \214le creation mode mask)-32.5 E 32.5<8373>108 391.2 S .857(hell v)
+-32.5 F .857(ariables and functions mark)-.25 F .857(ed for e)-.1 F .857
+(xport, along with v)-.15 F .857(ariables e)-.25 F .857
+(xported for the command,)-.15 F(passed in the en)144 403.2 Q(vironment)
+-.4 E 32.5<8374>108 420 S .306
+(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 432 Q
+2.5(Ac)108 448.8 S(ommand in)-2.5 E -.2(vo)-.4 G -.1(ke).2 G 2.5(di).1 G
+2.5(nt)-2.5 G(his separate en)-2.5 E(vironment cannot af)-.4 E
+(fect the shell')-.25 E 2.5(se)-.55 G -.15(xe)-2.65 G(cution en).15 E
+(vironment.)-.4 E .577(Command substitution, commands grouped with pare\
+ntheses, and asynchronous commands are in)108 465.6 R -.2(vo)-.4 G -.1
+(ke).2 G 3.077(di).1 G(n)-3.077 E 2.744(as)108 477.6 S .244(ubshell en)
+-2.744 F .244(vironment that is a duplicate of the shell en)-.4 F .245
+(vironment, e)-.4 F .245(xcept that traps caught by the shell are)-.15 F
+.359(reset to the v)108 489.6 R .358
+(alues that the shell inherited from its parent at in)-.25 F -.2(vo)-.4
+G 2.858(cation. Builtin).2 F .358(commands that are in)2.858 F -.2(vo)
+-.4 G -.1(ke).2 G(d).1 E .856(as part of a pipeline are also e)108 501.6
+R -.15(xe)-.15 G .856(cuted in a subshell en).15 F 3.357
+(vironment. Changes)-.4 F .857(made to the subshell en)3.357 F(viron-)
+-.4 E(ment cannot af)108 513.6 Q(fect the shell')-.25 E 2.5(se)-.55 G
+-.15(xe)-2.65 G(cution en).15 E(vironment.)-.4 E .405
+(If a command is follo)108 530.4 R .405(wed by a)-.25 F F1(&)2.905 E F0
+.404(and job control is not acti)2.905 F -.15(ve)-.25 G 2.904(,t).15 G
+.404(he def)-2.904 F .404(ault standard input for the command)-.1 F .197
+(is the empty \214le)108 542.4 R/F2 10/Times-Italic@0 SF(/de)2.697 E
+(v/null)-.15 E F0 5.197(.O)C .197(therwise, the in)-5.197 F -.2(vo)-.4 G
+-.1(ke).2 G 2.697(dc).1 G .198
+(ommand inherits the \214le descriptors of the calling shell)-2.697 F
+(as modi\214ed by redirections.)108 554.4 Q/F3 10.95/Times-Bold@0 SF
+(ENVIR)72 571.2 Q(ONMENT)-.329 E F0 2.354(When a program is in)108 583.2
+R -.2(vo)-.4 G -.1(ke).2 G 4.853(di).1 G 4.853(ti)-4.853 G 4.853(sg)
+-4.853 G -2.15 -.25(iv e)-4.853 H 4.853(na).25 G 4.853(na)-4.853 G 2.353
+(rray of strings called the)-4.853 F F2(en)4.853 E(vir)-.4 E(onment)-.45
+E F0 7.353(.T).68 G 2.353(his is a list of)-7.353 F F2(name)108 595.2 Q
+F0<ad>A F2(value)A F0(pairs, of the form)2.5 E F2(name)2.5 E F0(=)A F2
+(value)A F0(.).18 E 1.485(The shell pro)108 612 R 1.485(vides se)-.15 F
+-.15(ve)-.25 G 1.485(ral w).15 F 1.485(ays to manipulate the en)-.1 F
+3.985(vironment. On)-.4 F(in)3.985 E -.2(vo)-.4 G 1.486
+(cation, the shell scans its o).2 F(wn)-.25 E(en)108 624 Q .144(vironme\
+nt and creates a parameter for each name found, automatically marking i\
+t for)-.4 F F2 -.2(ex)2.643 G(port).2 E F0 .143(to child pro-)3.323 F
+2.703(cesses. Ex)108 636 R .203(ecuted commands inherit the en)-.15 F
+2.703(vironment. The)-.4 F F1(export)2.703 E F0(and)2.703 E F1(declar)
+2.703 E 2.703<65ad>-.18 G(x)-2.703 E F0 .203(commands allo)2.703 F 2.704
+(wp)-.25 G(aram-)-2.704 E 1.153
+(eters and functions to be added to and deleted from the en)108 648 R
+3.653(vironment. If)-.4 F 1.153(the v)3.653 F 1.153
+(alue of a parameter in the)-.25 F(en)108 660 Q .64
+(vironment is modi\214ed, the ne)-.4 F 3.14(wv)-.25 G .64
+(alue becomes part of the en)-3.39 F .64(vironment, replacing the old.)
+-.4 F .64(The en)5.64 F(viron-)-.4 E .58(ment inherited by an)108 672 R
+3.08(ye)-.15 G -.15(xe)-3.23 G .58(cuted command consists of the shell')
+.15 F 3.08(si)-.55 G .58(nitial en)-3.08 F .58(vironment, whose v)-.4 F
+.58(alues may be)-.25 F .3(modi\214ed in the shell, less an)108 684 R
+2.8(yp)-.15 G .3(airs remo)-2.8 F -.15(ve)-.15 G 2.8(db).15 G 2.801(yt)
+-2.8 G(he)-2.801 E F1(unset)2.801 E F0 .301(command, plus an)2.801 F
+2.801(ya)-.15 G .301(dditions via the)-2.801 F F1(export)2.801 E F0(and)
+2.801 E F1(declar)108 696 Q 2.5<65ad>-.18 G(x)-2.5 E F0(commands.)2.5 E
+.563(The en)108 712.8 R .563(vironment for an)-.4 F(y)-.15 E F2 .563
+(simple command)3.403 F F0 .562
+(or function may be augmented temporarily by pre\214xing it with)3.833 F
+.202(parameter assignments, as described abo)108 724.8 R .502 -.15(ve i)
+-.15 H(n).15 E/F4 9/Times-Bold@0 SF -.666(PA)2.702 G(RAMETERS).666 E/F5
+9/Times-Roman@0 SF(.)A F0 .202(These assignment statements af)4.702 F
+.203(fect only the)-.25 F(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5
+(v1)-.15 G 197.965(32)-2.5 G(7)-197.965 E 0 Cg EP
+%%Page: 28 28
+%%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(en)108 84 Q(vironment seen by that command.)-.4 E .81(If the)108
+100.8 R/F1 10/Times-Bold@0 SF<ad6b>3.31 E F0 .81
+(option is set \(see the)3.31 F F1(set)3.31 E F0 -.2(bu)3.31 G .81
+(iltin command belo).2 F .81(w\), then)-.25 F/F2 10/Times-Italic@0 SF
+(all)3.64 E F0 .81(parameter assignments are placed in)3.82 F(the en)108
+112.8 Q
+(vironment for a command, not just those that precede the command name.)
+-.4 E(When)108 129.6 Q F1(bash)3.396 E F0(in)3.396 E -.2(vo)-.4 G -.1
+(ke).2 G 3.396(sa).1 G 3.397(ne)-3.396 G .897(xternal command, the v)
+-3.547 F(ariable)-.25 E F1(_)3.397 E F0 .897
+(is set to the full \214le name of the command and)3.397 F
+(passed to that command in its en)108 141.6 Q(vironment.)-.4 E/F3 10.95
+/Times-Bold@0 SF(EXIT ST)72 158.4 Q -1.04(AT)-.986 G(US)1.04 E F0 -.15
+(Fo)108 170.4 S 3.373(rt).15 G .873(he shell')-3.373 F 3.373(sp)-.55 G
+.873(urposes, a command which e)-3.373 F .873(xits with a zero e)-.15 F
+.873(xit status has succeeded.)-.15 F .872(An e)5.872 F .872
+(xit status of)-.15 F .048(zero indicates success.)108 182.4 R 2.548(An)
+5.048 G .049(on-zero e)-2.548 F .049(xit status indicates f)-.15 F 2.549
+(ailure. When)-.1 F 2.549(ac)2.549 G .049(ommand terminates on a f)
+-2.549 F .049(atal sig-)-.1 F(nal)108 194.4 Q F2(N)2.5 E F0(,)A F1(bash)
+2.5 E F0(uses the v)2.5 E(alue of 128+)-.25 E F2(N)A F0(as the e)2.5 E
+(xit status.)-.15 E .405
+(If a command is not found, the child process created to e)108 211.2 R
+-.15(xe)-.15 G .404(cute it returns a status of 127.).15 F .404
+(If a command is)5.404 F(found b)108 223.2 Q(ut is not e)-.2 E -.15(xe)
+-.15 G(cutable, the return status is 126.).15 E(If a command f)108 240 Q
+(ails because of an error during e)-.1 E(xpansion or redirection, the e)
+-.15 E(xit status is greater than zero.)-.15 E .08(Shell b)108 256.8 R
+.08(uiltin commands return a status of 0 \()-.2 F F2(true)A F0 2.581
+(\)i)C 2.581(fs)-2.581 G .081(uccessful, and non-zero \()-2.581 F F2
+(false)A F0 2.581(\)i)C 2.581(fa)-2.581 G 2.581(ne)-2.581 G .081
+(rror occurs while)-2.581 F(the)108 268.8 Q 2.5(ye)-.15 G -.15(xe)-2.65
+G 2.5(cute. All).15 F -.2(bu)2.5 G(iltins return an e).2 E
+(xit status of 2 to indicate incorrect usage.)-.15 E F1(Bash)108 285.6 Q
+F0 .202(itself returns the e)2.702 F .202
+(xit status of the last command e)-.15 F -.15(xe)-.15 G .201
+(cuted, unless a syntax error occurs, in which case).15 F(it e)108 297.6
+Q(xits with a non-zero v)-.15 E 2.5(alue. See)-.25 F(also the)2.5 E F1
+(exit)2.5 E F0 -.2(bu)2.5 G(iltin command belo).2 E -.65(w.)-.25 G F3
+(SIGN)72 314.4 Q(ALS)-.219 E F0(When)108 326.4 Q F1(bash)3.182 E F0 .682
+(is interacti)3.182 F -.15(ve)-.25 G 3.182(,i).15 G 3.182(nt)-3.182 G
+.682(he absence of an)-3.182 F 3.183(yt)-.15 G .683(raps, it ignores)
+-3.183 F/F4 9/Times-Bold@0 SF(SIGTERM)3.183 E F0 .683(\(so that)2.933 F
+F1 .683(kill 0)3.183 F F0 .683(does not kill an)3.183 F(interacti)108
+338.4 Q .758 -.15(ve s)-.25 H .458(hell\), and).15 F F4(SIGINT)2.958 E
+F0 .458(is caught and handled \(so that the)2.708 F F1(wait)2.958 E F0
+-.2(bu)2.958 G .457(iltin is interruptible\).).2 F .457(In all cases,)
+5.457 F F1(bash)108 350.4 Q F0(ignores)2.5 E F4(SIGQ)2.5 E(UIT)-.09 E/F5
+9/Times-Roman@0 SF(.)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(Non-b)108 367.2
+Q 1.064(uiltin commands run by)-.2 F F1(bash)3.564 E F0(ha)3.564 E 1.365
+-.15(ve s)-.2 H 1.065(ignal handlers set to the v).15 F 1.065
+(alues inherited by the shell from its)-.25 F 3.248(parent. When)108
+379.2 R .748(job control is not in ef)3.248 F .747
+(fect, asynchronous commands ignore)-.25 F F4(SIGINT)3.247 E F0(and)
+2.997 E F4(SIGQ)3.247 E(UIT)-.09 E F0 .747(in addi-)2.997 F .652
+(tion to these inherited handlers.)108 391.2 R .653
+(Commands run as a result of command substitution ignore the k)5.652 F
+-.15(ey)-.1 G(board-).15 E(generated job control signals)108 403.2 Q 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 2.046(The shell e)108 420 R 2.046(xits by def)
+-.15 F 2.045(ault upon receipt of a)-.1 F F4(SIGHUP)4.545 E F5(.)A F0
+2.045(Before e)6.545 F 2.045(xiting, an interacti)-.15 F 2.345 -.15
+(ve s)-.25 H 2.045(hell resends the).15 F F4(SIGHUP)108 432 Q F0 1.004
+(to all jobs, running or stopped.)3.254 F 1.004(Stopped jobs are sent)
+6.004 F F4(SIGCONT)3.505 E F0 1.005(to ensure that the)3.255 F 3.505(yr)
+-.15 G(ecei)-3.505 E 1.305 -.15(ve t)-.25 H(he).15 E F4(SIGHUP)108 444 Q
+F5(.)A F0 2.53 -.8(To p)5.43 H(re).8 E -.15(ve)-.25 G .93(nt the shell \
+from sending the signal to a particular job, it should be remo).15 F
+-.15(ve)-.15 G 3.429(df).15 G .929(rom the)-3.429 F 1.356
+(jobs table with the)108 456 R F1(diso)3.856 E(wn)-.1 E F0 -.2(bu)3.856
+G 1.356(iltin \(see).2 F F4 1.356(SHELL B)3.856 F(UIL)-.09 E 1.356
+(TIN COMMANDS)-.828 F F0(belo)3.607 E 1.357(w\) or mark)-.25 F 1.357
+(ed to not recei)-.1 F -.15(ve)-.25 G F4(SIGHUP)108 468 Q F0(using)2.25
+E F1(diso)2.5 E(wn \255h)-.1 E F0(.)A .166(If the)108 484.8 R F1
+(huponexit)2.666 E F0 .166(shell option has been set with)2.666 F F1
+(shopt)2.666 E F0(,)A F1(bash)2.666 E F0 .166(sends a)2.666 F F4(SIGHUP)
+2.666 E F0 .166(to all jobs when an interacti)2.416 F -.15(ve)-.25 G
+(login shell e)108 496.8 Q(xits.)-.15 E .076
+(If 0for which a trap has been set, the trap will not be e)108 513.6 R
+-.15(xe)-.15 G .077(cuted until the command completes.).15 F(When)5.077
+E F1(bash)2.577 E F0(is)2.577 E -.1(wa)108 525.6 S .826
+(iting for an asynchronous command via the).1 F F1(wait)3.326 E F0 -.2
+(bu)3.326 G .826(iltin, the reception of a signal for which a trap has)
+.2 F .369(been set will cause the)108 537.6 R F1(wait)2.869 E F0 -.2(bu)
+2.869 G .369(iltin to return immediately with an e).2 F .37
+(xit status greater than 128, immediately)-.15 F
+(after which the trap is e)108 549.6 Q -.15(xe)-.15 G(cuted.).15 E F3
+(JOB CONTR)72 566.4 Q(OL)-.329 E F2 -.25(Jo)108 578.4 S 4.568(bc).25 G
+(ontr)-4.568 E(ol)-.45 E F0 2.068(refers to the ability to selecti)5.078
+F -.15(ve)-.25 G 2.067(ly stop \().15 F F2(suspend)A F0 4.567(\)t)C
+2.067(he e)-4.567 F -.15(xe)-.15 G 2.067
+(cution of processes and continue).15 F(\()108 590.4 Q F2 -.37(re)C
+(sume).37 E F0 3.201(\)t)C .701(heir e)-3.201 F -.15(xe)-.15 G .702
+(cution at a later point.).15 F 3.202(Au)5.702 G .702
+(ser typically emplo)-3.202 F .702(ys this f)-.1 F .702
+(acility via an interacti)-.1 F 1.002 -.15(ve i)-.25 H(nterf).15 E(ace)
+-.1 E(supplied jointly by the system')108 602.4 Q 2.5(st)-.55 G
+(erminal dri)-2.5 E -.15(ve)-.25 G 2.5(ra).15 G(nd)-2.5 E F1(bash)2.5 E
+F0(.)A .785(The shell associates a)108 619.2 R F2(job)5.025 E F0 .785
+(with each pipeline.)3.515 F .784(It k)5.785 F .784
+(eeps a table of currently e)-.1 F -.15(xe)-.15 G .784
+(cuting jobs, which may be).15 F .34(listed with the)108 631.2 R F1
+(jobs)2.84 E F0 2.84(command. When)2.84 F F1(bash)2.84 E F0 .341
+(starts a job asynchronously \(in the)2.84 F F2(bac)2.841 E(kgr)-.2 E
+(ound)-.45 E F0 .341(\), it prints a line).77 F(that looks lik)108 643.2
+Q(e:)-.1 E([1] 25647)144 660 Q .241(indicating that this job is job num\
+ber 1 and that the process ID of the last process in the pipeline assoc\
+iated)108 676.8 R .732(with this job is 25647.)108 688.8 R .733
+(All of the processes in a single pipeline are members of the same job)
+5.732 F(.)-.4 E F1(Bash)5.733 E F0(uses)3.233 E(the)108 700.8 Q F2(job)
+4.24 E F0(abstraction as the basis for job control.)2.73 E 3.063 -.8
+(To f)108 717.6 T 1.463(acilitate the implementation of the user interf)
+.7 F 1.462(ace to job control, the operating system maintains the)-.1 F
+.87(notion of a)108 729.6 R F2(curr)3.37 E .87(ent terminal pr)-.37 F
+.871(ocess gr)-.45 F .871(oup ID)-.45 F F0 5.871(.M)C .871
+(embers of this process group \(processes whose process)-5.871 F
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(32)-2.5 G
+(8)-197.965 E 0 Cg EP
+%%Page: 29 29
+%%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 .023
+(group ID is equal to the current terminal process group ID\) recei)108
+84 R .323 -.15(ve k)-.25 H -.15(ey).05 G .023
+(board-generated signals such as).15 F/F1 9/Times-Bold@0 SF(SIG-)2.522 E
+(INT)108 96 Q/F2 9/Times-Roman@0 SF(.)A F0 1.346
+(These processes are said to be in the)5.846 F/F3 10/Times-Italic@0 SF
+(for)3.847 E -.4(eg)-.37 G -.45(ro).4 G(und).45 E F0(.).77 E F3(Bac)
+6.927 E(kgr)-.2 E(ound)-.45 E F0 1.347
+(processes are those whose process)4.617 F .146(group ID dif)108 108 R
+.146(fers from the terminal')-.25 F .146
+(s; such processes are immune to k)-.55 F -.15(ey)-.1 G .145
+(board-generated signals.).15 F .145(Only fore-)5.145 F .041
+(ground processes are allo)108 120 R .042
+(wed to read from or write to the terminal.)-.25 F .042
+(Background processes which attempt to)5.042 F 1.64
+(read from \(write to\) the terminal are sent a)108 132 R F1 1.639
+(SIGTTIN \(SIGTT)4.14 F(OU\))-.162 E F0 1.639
+(signal by the terminal dri)3.889 F -.15(ve)-.25 G 2.439 -.4(r, w).15 H
+(hich,).4 E(unless caught, suspends the process.)108 144 Q 1.087
+(If the operating system on which)108 160.8 R/F4 10/Times-Bold@0 SF
+(bash)3.587 E F0 1.088(is running supports job control,)3.588 F F4(bash)
+3.588 E F0 1.088(contains f)3.588 F 1.088(acilities to use it.)-.1 F -.8
+(Ty)108 172.8 S .302(ping the).8 F F3(suspend)3.142 E F0 .302
+(character \(typically)3.572 F F4(^Z)2.801 E F0 2.801(,C)C .301
+(ontrol-Z\) while a process is running causes that process to be)-2.801
+F 2.142(stopped and returns control to)108 184.8 R F4(bash)4.642 E F0
+7.142(.T)C 2.142(yping the)-7.942 F F3 2.142(delayed suspend)4.992 F F0
+2.143(character \(typically)5.413 F F4(^Y)4.643 E F0 4.643(,C)C
+(ontrol-Y\))-4.643 E .021(causes the process to be stopped when it atte\
+mpts to read input from the terminal, and control to be returned)108
+196.8 R(to)108 208.8 Q F4(bash)3.392 E F0 5.892(.T)C .892
+(he user may then manipulate the state of this job, using the)-5.892 F
+F4(bg)3.392 E F0 .892(command to continue it in the)3.392 F .895
+(background, the)108 220.8 R F4(fg)3.395 E F0 .895
+(command to continue it in the fore)3.395 F .895(ground, or the)-.15 F
+F4(kill)3.395 E F0 .894(command to kill it.)3.395 F(A)5.894 E F4(^Z)
+3.394 E F0(tak)3.394 E(es)-.1 E(ef)108 232.8 Q .948(fect immediately)
+-.25 F 3.448(,a)-.65 G .948(nd has the additional side ef)-3.448 F .948
+(fect of causing pending output and typeahead to be dis-)-.25 F(carded.)
+108 244.8 Q 1.098(There are a number of w)108 261.6 R 1.097
+(ays to refer to a job in the shell.)-.1 F 1.097(The character)6.097 F
+F4(%)3.597 E F0 1.097(introduces a job name.)3.597 F(Job)6.097 E(number)
+108 273.6 Q F3(n)3.13 E F0 .27(may be referred to as)3.01 F F4(%n)2.77 E
+F0 5.27(.A)C .27
+(job may also be referred to using a pre\214x of the name used to start)
+-2.5 F .277(it, or using a substring that appears in its command line.)
+108 285.6 R -.15(Fo)5.277 G 2.777(re).15 G(xample,)-2.927 E F4(%ce)2.777
+E F0 .277(refers to a stopped)2.777 F F4(ce)2.777 E F0(job)2.777 E 5.277
+(.I)-.4 G 2.777(fa)-5.277 G .38(pre\214x matches more than one job,)108
+297.6 R F4(bash)2.88 E F0 .38(reports an error)2.88 F 5.38(.U)-.55 G
+(sing)-5.38 E F4(%?ce)2.88 E F0 2.88(,o)C 2.88(nt)-2.88 G .38
+(he other hand, refers to an)-2.88 F 2.88(yj)-.15 G(ob)-2.88 E .623
+(containing the string)108 309.6 R F4(ce)3.123 E F0 .622
+(in its command line.)3.123 F .622
+(If the substring matches more than one job,)5.622 F F4(bash)3.122 E F0
+.622(reports an)3.122 F(error)108 321.6 Q 5.143(.T)-.55 G .143
+(he symbols)-5.143 F F4(%%)2.643 E F0(and)2.643 E F4(%+)2.643 E F0 .143
+(refer to the shell')2.643 F 2.643(sn)-.55 G .143(otion of the)-2.643 F
+F3(curr)2.643 E .143(ent job)-.37 F F0 2.643(,w).23 G .143
+(hich is the last job stopped)-2.643 F 1.209(while it w)108 333.6 R
+1.209(as in the fore)-.1 F 1.208(ground or started in the background.)
+-.15 F(The)6.208 E F3(pr)4.958 E -.15(ev)-.37 G 1.208(ious job).15 F F0
+1.208(may be referenced using)3.938 F F4<25ad>108 345.6 Q F0 5.486(.I)C
+2.986(no)-5.486 G .486
+(utput pertaining to jobs \(e.g., the output of the)-2.986 F F4(jobs)
+2.987 E F0 .487(command\), the current job is al)2.987 F -.1(wa)-.1 G
+.487(ys \215agged).1 F(with a)108 357.6 Q F4(+)2.5 E F0 2.5(,a)C
+(nd the pre)-2.5 E(vious job with a)-.25 E F4<ad>2.5 E F0(.)A .444
+(Simply naming a job can be used to bring it into the fore)108 374.4 R
+(ground:)-.15 E F4(%1)2.943 E F0 .443(is a synon)2.943 F .443(ym for)
+-.15 F F4 -.63(``)2.943 G .443(fg %1').63 F(')-.63 E F0 2.943(,b)C
+(ringing)-2.943 E 1.472(job 1 from the background into the fore)108
+386.4 R 3.972(ground. Similarly)-.15 F(,)-.65 E F4 -.63(``)3.973 G 1.473
+(%1 &').63 F(')-.63 E F0 1.473(resumes job 1 in the background,)3.973 F
+(equi)108 398.4 Q -.25(va)-.25 G(lent to).25 E F4 -.63(``)2.5 G(bg %1')
+.63 E(')-.63 E F0(.)A .131(The shell learns immediately whene)108 415.2
+R -.15(ve)-.25 G 2.631(raj).15 G .131(ob changes state.)-2.631 F
+(Normally)5.131 E(,)-.65 E F4(bash)2.631 E F0 -.1(wa)2.63 G .13
+(its until it is about to print a).1 F .157
+(prompt before reporting changes in a job')108 427.2 R 2.657(ss)-.55 G
+.157(tatus so as to not interrupt an)-2.657 F 2.658(yo)-.15 G .158
+(ther output.)-2.658 F .158(If the)5.158 F F4<ad62>2.658 E F0 .158
+(option to)2.658 F(the)108 439.2 Q F4(set)3.952 E F0 -.2(bu)3.952 G
+1.452(iltin command is enabled,).2 F F4(bash)3.952 E F0 1.451
+(reports such changes immediately)3.952 F 6.451(.A)-.65 G 1.751 -.15
+(ny t)-6.451 H 1.451(rap on).15 F F1(SIGCHLD)3.951 E F0(is)3.701 E -.15
+(exe)108 451.2 S(cuted for each child that e).15 E(xits.)-.15 E 1.026
+(If an attempt to e)108 468 R(xit)-.15 E F4(bash)3.527 E F0 1.027
+(is made while jobs are stopped, the shell prints a w)3.527 F 1.027
+(arning message.)-.1 F(The)6.027 E F4(jobs)3.527 E F0 .256
+(command may then be used to inspect their status.)108 480 R .255
+(If a second attempt to e)5.255 F .255(xit is made without an interv)
+-.15 F(en-)-.15 E(ing command, the shell does not print another w)108
+492 Q(arning, and the stopped jobs are terminated.)-.1 E/F5 10.95
+/Times-Bold@0 SF(PR)72 508.8 Q(OMPTING)-.329 E F0 .644(When e)108 520.8
+R -.15(xe)-.15 G .644(cuting interacti).15 F -.15(ve)-.25 G(ly).15 E(,)
+-.65 E F4(bash)3.144 E F0 .645(displays the primary prompt)3.145 F F1
+(PS1)3.145 E F0 .645(when it is ready to read a command,)2.895 F 1.826
+(and the secondary prompt)108 532.8 R F1(PS2)4.326 E F0 1.825
+(when it needs more input to complete a command.)4.076 F F4(Bash)6.825 E
+F0(allo)4.325 E 1.825(ws these)-.25 F 1.499(prompt strings to be custom\
+ized by inserting a number of backslash-escaped special characters that\
+ are)108 544.8 R(decoded as follo)108 556.8 Q(ws:)-.25 E F4(\\a)144
+568.8 Q F0(an ASCII bell character \(07\))28.22 E F4(\\d)144 580.8 Q F0
+(the date in "W)27.66 E(eekday Month Date" format \(e.g., "T)-.8 E
+(ue May 26"\))-.45 E F4(\\D{)144 592.8 Q F3(format)A F4(})A F0(the)180
+604.8 Q F3(format)3.927 E F0 1.427(is passed to)3.927 F F3(strftime)
+3.927 E F0 1.427
+(\(3\) and the result is inserted into the prompt string; an)B(empty)180
+616.8 Q F3(format)2.5 E F0
+(results in a locale-speci\214c time representation.)2.5 E
+(The braces are required)5 E F4(\\e)144 628.8 Q F0
+(an ASCII escape character \(033\))28.78 E F4(\\h)144 640.8 Q F0
+(the hostname up to the \214rst `.)27.66 E(')-.7 E F4(\\H)144 652.8 Q F0
+(the hostname)25.44 E F4(\\j)144 664.8 Q F0
+(the number of jobs currently managed by the shell)29.89 E F4(\\l)144
+676.8 Q F0(the basename of the shell')30.44 E 2.5(st)-.55 G(erminal de)
+-2.5 E(vice name)-.25 E F4(\\n)144 688.8 Q F0(ne)27.66 E(wline)-.25 E F4
+(\\r)144 700.8 Q F0(carriage return)28.78 E F4(\\s)144 712.8 Q F0
+(the name of the shell, the basename of)29.33 E F4($0)2.5 E F0
+(\(the portion follo)2.5 E(wing the \214nal slash\))-.25 E(GNU Bash-3.0)
+72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(32)-2.5 G(9)-197.965 E
+0 Cg EP
+%%Page: 30 30
+%%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(\\t)144 84 Q F0
+(the current time in 24-hour HH:MM:SS format)29.89 E F1(\\T)144 96 Q F0
+(the current time in 12-hour HH:MM:SS format)26.55 E F1(\\@)144 108 Q F0
+(the current time in 12-hour am/pm format)23.92 E F1(\\A)144 120 Q F0
+(the current time in 24-hour HH:MM format)26 E F1(\\u)144 132 Q F0
+(the username of the current user)27.66 E F1(\\v)144 144 Q F0(the v)
+28.22 E(ersion of)-.15 E F1(bash)2.5 E F0(\(e.g., 2.00\))2.5 E F1(\\V)
+144 156 Q F0(the release of)26 E F1(bash)2.5 E F0 2.5(,v)C
+(ersion + patchelv)-2.65 E(el \(e.g., 2.00.0\))-.15 E F1(\\w)144 168 Q
+F0(the current w)26 E(orking directory)-.1 E F1(\\W)144 180 Q F0
+(the basename of the current w)23.22 E(orking directory)-.1 E F1(\\!)144
+192 Q F0(the history number of this command)29.89 E F1(\\#)144 204 Q F0
+(the command number of this command)28.22 E F1(\\$)144 216 Q F0
+(if the ef)28.22 E(fecti)-.25 E .3 -.15(ve U)-.25 H(ID is 0, a).15 E F1
+(#)2.5 E F0 2.5(,o)C(therwise a)-2.5 E F1($)2.5 E(\\)144 228 Q/F2 10
+/Times-Italic@0 SF(nnn)A F0
+(the character corresponding to the octal number)18.22 E F2(nnn)2.5 E F1
+(\\\\)144 240 Q F0 2.5(ab)30.44 G(ackslash)-2.5 E F1(\\[)144 252 Q F0
+(be)29.89 E 1.257(gin a sequence of non-printing characters, which coul\
+d be used to embed a terminal)-.15 F(control sequence into the prompt)
+180 264 Q F1(\\])144 276 Q F0(end a sequence of non-printing characters)
+29.89 E .12(The command number and the history number are usually dif)
+108 292.8 R .119(ferent: the history number of a command is its)-.25 F
+1.585(position in the history list, which may include commands restored\
+ from the history \214le \(see)108 304.8 R/F3 9/Times-Bold@0 SF(HIST)
+4.085 E(OR)-.162 E(Y)-.315 E F0(belo)108 316.8 Q .541(w\), while the co\
+mmand number is the position in the sequence of commands e)-.25 F -.15
+(xe)-.15 G .54(cuted during the cur).15 F(-)-.2 E .546
+(rent shell session.)108 328.8 R .546
+(After the string is decoded, it is e)5.546 F .546
+(xpanded via parameter e)-.15 F .546(xpansion, command substitu-)-.15 F
+.352(tion, arithmetic e)108 340.8 R .352(xpansion, and quote remo)-.15 F
+-.25(va)-.15 G .352(l, subject to the v).25 F .352(alue of the)-.25 F F1
+(pr)2.852 E(omptv)-.18 E(ars)-.1 E F0 .351(shell option \(see the)2.852
+F(description of the)108 352.8 Q F1(shopt)2.5 E F0(command under)2.5 E
+F3(SHELL B)2.5 E(UIL)-.09 E(TIN COMMANDS)-.828 E F0(belo)2.25 E(w\).)
+-.25 E/F4 10.95/Times-Bold@0 SF(READLINE)72 369.6 Q F0 .15
+(This is the library that handles reading input when using an interacti)
+108 381.6 R .451 -.15(ve s)-.25 H .151(hell, unless the).15 F F1
+(\255\255noediting)2.651 E F0(option)2.651 E .067(is gi)108 393.6 R -.15
+(ve)-.25 G 2.567(na).15 G 2.566(ts)-2.567 G .066(hell in)-2.566 F -.2
+(vo)-.4 G 2.566(cation. By).2 F(def)2.566 E .066
+(ault, the line editing commands are similar to those of emacs.)-.1 F
+2.566(Av)5.066 G(i-style)-2.566 E .565(line editing interf)108 405.6 R
+.565(ace is also a)-.1 F -.25(va)-.2 G 3.065(ilable. T).25 F 3.065(ot)
+-.8 G .565(urn of)-3.065 F 3.065(fl)-.25 G .565
+(ine editing after the shell is running, use the)-3.065 F F1 .566
+(+o emacs)3.066 F F0(or)108 417.6 Q F1(+o vi)2.5 E F0(options to the)2.5
+E F1(set)2.5 E F0 -.2(bu)2.5 G(iltin \(see).2 E F3(SHELL B)2.5 E(UIL)
+-.09 E(TIN COMMANDS)-.828 E F0(belo)2.25 E(w\).)-.25 E F1
+(Readline Notation)87 434.4 Q F0 .568
+(In this section, the emacs-style notation is used to denote k)108 446.4
+R -.15(ey)-.1 G(strok).15 E 3.067(es. Control)-.1 F -.1(ke)3.067 G .567
+(ys are denoted by C\255)-.05 F F2 -.1(ke)C(y)-.2 E F0(,)A 1.152
+(e.g., C\255n means Control\255N.)108 458.4 R(Similarly)6.152 E(,)-.65 E
+F2(meta)4.032 E F0 -.1(ke)3.913 G 1.153(ys are denoted by M\255)-.05 F
+F2 -.1(ke)C(y)-.2 E F0 3.653(,s)C 3.653(oM)-3.653 G 1.153
+(\255x means Meta\255X.)-3.653 F(\(On)6.153 E -.1(ke)108 470.4 S .831
+(yboards without a)-.05 F F2(meta)3.711 E F0 -.1(ke)3.591 G 2.131 -.65
+(y, M)-.05 H<ad>.65 E F2(x)A F0 .831(means ESC)3.331 F F2(x)3.331 E F0
+3.331(,i)C .83(.e., press the Escape k)-3.331 F 1.13 -.15(ey t)-.1 H .83
+(hen the).15 F F2(x)4.1 E F0 -.1(ke)3.86 G 4.63 -.65(y. T)-.05 H .83
+(his mak).65 F(es)-.1 E .599(ESC the)108 482.4 R F2 .599(meta pr)3.099 F
+(e\214x)-.37 E F0 5.599(.T)C .599(he combination M\255C\255)-5.599 F F2
+(x)A F0 .599(means ESC\255Control\255)3.099 F F2(x)A F0 3.099(,o)C 3.099
+(rp)-3.099 G .6(ress the Escape k)-3.099 F .9 -.15(ey t)-.1 H .6
+(hen hold).15 F(the Control k)108 494.4 Q .3 -.15(ey w)-.1 H
+(hile pressing the).15 E F2(x)3.27 E F0 -.1(ke)3.03 G -.65(y.)-.05 G(\))
+.65 E .62(Readline commands may be gi)108 511.2 R -.15(ve)-.25 G 3.119
+(nn).15 G(umeric)-3.119 E F2(ar)3.119 E(guments)-.37 E F0 3.119(,w).27 G
+.619(hich normally act as a repeat count.)-3.119 F(Sometimes,)5.619 E
+(ho)108 523.2 Q(we)-.25 E -.15(ve)-.25 G 1.418 -.4(r, i).15 H 3.118(ti)
+.4 G 3.119(st)-3.118 G .619(he sign of the ar)-3.119 F .619
+(gument that is signi\214cant.)-.18 F -.15(Pa)5.619 G .619(ssing a ne)
+.15 F -.05(ga)-.15 G(ti).05 E .919 -.15(ve a)-.25 H -.18(rg).15 G .619
+(ument to a command that).18 F 1.019(acts in the forw)108 535.2 R 1.018
+(ard direction \(e.g.,)-.1 F F1(kill\255line)3.518 E F0 3.518(\)c)C
+1.018(auses that command to act in a backw)-3.518 F 1.018
+(ard direction.)-.1 F(Com-)6.018 E(mands whose beha)108 547.2 Q
+(vior with ar)-.2 E(guments de)-.18 E(viates from this are noted belo)
+-.25 E -.65(w.)-.25 G .811(When a command is described as)108 564 R F2
+(killing)3.311 E F0(te)3.311 E .811(xt, the te)-.15 F .811
+(xt deleted is sa)-.15 F -.15(ve)-.2 G 3.311(df).15 G .812
+(or possible future retrie)-3.311 F -.25(va)-.25 G 3.312(l\().25 G F2
+(yank-)-3.312 E(ing)108 576 Q F0 2.529(\). The)B .029(killed te)2.529 F
+.029(xt is sa)-.15 F -.15(ve)-.2 G 2.529(di).15 G 2.529(na)-2.529 G F2
+.029(kill ring)B F0 5.029(.C)C(onsecuti)-5.029 E .329 -.15(ve k)-.25 H
+.029(ills cause the te).15 F .029(xt to be accumulated into one unit,)
+-.15 F .567(which can be yank)108 588 R .567(ed all at once.)-.1 F .567
+(Commands which do not kill te)5.567 F .567
+(xt separate the chunks of te)-.15 F .567(xt on the kill)-.15 F(ring.)
+108 600 Q F1(Readline Initialization)87 616.8 Q F0 .091(Readline is cus\
+tomized by putting commands in an initialization \214le \(the)108 628.8
+R F2(inputr)2.591 E(c)-.37 E F0 2.591(\214le\). The)2.591 F .091
+(name of this \214le)2.591 F .196(is tak)108 640.8 R .196(en from the v)
+-.1 F .196(alue of the)-.25 F F3(INPUTRC)2.696 E F0 -.25(va)2.446 G
+2.696(riable. If).25 F .196(that v)2.696 F .196
+(ariable is unset, the def)-.25 F .196(ault is)-.1 F F2(~/.inputr)2.696
+E(c)-.37 E F0 5.196(.W).31 G .197(hen a)-5.196 F 1.034(program which us\
+es the readline library starts up, the initialization \214le is read, a\
+nd the k)108 652.8 R 1.334 -.15(ey b)-.1 H 1.034(indings and).15 F -.25
+(va)108 664.8 S 1.149(riables are set.).25 F 1.149(There are only a fe)
+6.149 F 3.649(wb)-.25 G 1.149(asic constructs allo)-3.649 F 1.15
+(wed in the readline initialization \214le.)-.25 F(Blank)6.15 E .737
+(lines are ignored.)108 676.8 R .737(Lines be)5.737 F .737
+(ginning with a)-.15 F F1(#)3.237 E F0 .737(are comments.)3.237 F .737
+(Lines be)5.737 F .737(ginning with a)-.15 F F1($)3.237 E F0 .736
+(indicate conditional)3.236 F 2.5(constructs. Other)108 688.8 R
+(lines denote k)2.5 E .3 -.15(ey b)-.1 H(indings and v).15 E
+(ariable settings.)-.25 E .986(The def)108 705.6 R .986(ault k)-.1 F
+-.15(ey)-.1 G .987(-bindings may be changed with an).15 F F2(inputr)
+3.497 E(c)-.37 E F0 3.487(\214le. Other)3.797 F .987
+(programs that use this library may)3.487 F(add their o)108 717.6 Q
+(wn commands and bindings.)-.25 E(GNU Bash-3.0)72 768 Q(2003 No)147.975
+E 2.5(v1)-.15 G 197.965(33)-2.5 G(0)-197.965 E 0 Cg EP
+%%Page: 31 31
+%%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 -.15(Fo)108 84 S 2.5(re).15 G(xample, placing)-2.65 E
+(M\255Control\255u: uni)144 100.8 Q -.15(ve)-.25 G(rsal\255ar).15 E
+(gument)-.18 E(or)108 112.8 Q(C\255Meta\255u: uni)144 124.8 Q -.15(ve)
+-.25 G(rsal\255ar).15 E(gument)-.18 E(into the)108 136.8 Q/F1 10
+/Times-Italic@0 SF(inputr)2.51 E(c)-.37 E F0 -.1(wo)2.81 G(uld mak).1 E
+2.5(eM)-.1 G(\255C\255u e)-2.5 E -.15(xe)-.15 G
+(cute the readline command).15 E F1(univer)2.5 E(sal\255ar)-.1 E(gument)
+-.37 E F0(.).68 E 1.261(The follo)108 153.6 R 1.261
+(wing symbolic character names are recognized:)-.25 F F1 -.4(RU)3.761 G
+(BOUT).4 E F0(,)1.27 E F1(DEL)3.761 E F0(,).53 E F1(ESC)3.761 E F0(,).72
+E F1(LFD)3.761 E F0(,).28 E F1(NEWLINE)3.76 E F0(,).73 E F1(RET)3.76 E
+F0(,)1.27 E F1(RETURN)108 165.6 Q F0(,)1.1 E F1(SPC)2.5 E F0(,).72 E F1
+(SP)2.5 E -.3(AC)-.9 G(E).3 E F0 2.5(,a).73 G(nd)-2.5 E F1 -.5(TA)2.5 G
+(B).5 E F0(.).27 E .209(In addition to command names, readline allo)108
+182.4 R .209(ws k)-.25 F -.15(ey)-.1 G 2.709(st).15 G 2.709(ob)-2.709 G
+2.709(eb)-2.709 G .209(ound to a string that is inserted when the k)
+-2.709 F .509 -.15(ey i)-.1 H(s).15 E(pressed \(a)108 194.4 Q F1(macr)
+2.5 E(o)-.45 E F0(\).)A/F2 10/Times-Bold@0 SF(Readline K)87 211.2 Q
+(ey Bindings)-.25 E F0 .366(The syntax for controlling k)108 223.2 R
+.666 -.15(ey b)-.1 H .366(indings in the).15 F F1(inputr)2.876 E(c)-.37
+E F0 .366(\214le is simple.)3.176 F .366
+(All that is required is the name of the)5.366 F .382(command or the te)
+108 235.2 R .383(xt of a macro and a k)-.15 F .683 -.15(ey s)-.1 H .383
+(equence to which it should be bound. The name may be speci-).15 F .853
+(\214ed in one of tw)108 247.2 R 3.353(ow)-.1 G .853
+(ays: as a symbolic k)-3.453 F 1.153 -.15(ey n)-.1 H .853
+(ame, possibly with).15 F F1(Meta\255)3.353 E F0(or)3.353 E F1(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 259.2 Q 1.541(When using the form)108 276 R F2
+-.1(ke)4.041 G(yname).1 E F0(:)A F1(function\255name).833 E F0(or)4.041
+E F1(macr)4.042 E(o)-.45 E F0(,)A F1 -.1(ke)4.042 G(yname)-.2 E F0 1.542
+(is the name of a k)4.222 F 1.842 -.15(ey s)-.1 H 1.542(pelled out in)
+.15 F 2.5(English. F)108 288 R(or e)-.15 E(xample:)-.15 E
+(Control-u: uni)144 312 Q -.15(ve)-.25 G(rsal\255ar).15 E(gument)-.18 E
+(Meta-Rubout: backw)144 324 Q(ard-kill-w)-.1 E(ord)-.1 E
+(Control-o: "> output")144 336 Q .699(In the abo)108 352.8 R .998 -.15
+(ve ex)-.15 H(ample,).15 E F1(C\255u)3.038 E F0 .698
+(is bound to the function)3.448 F F2(uni)3.198 E -.1(ve)-.1 G
+(rsal\255ar).1 E(gument)-.1 E F0(,)A F1(M\255DEL)3.878 E F0 .698
+(is bound to the func-)3.728 F(tion)108 364.8 Q F2
+(backward\255kill\255w)2.758 E(ord)-.1 E F0 2.758(,a)C(nd)-2.758 E F1
+(C\255o)2.598 E F0 .258(is bound to run the macro e)2.938 F .259
+(xpressed on the right hand side \(that is, to)-.15 F(insert the te)108
+376.8 Q(xt)-.15 E/F3 10/Courier@0 SF 6(>o)2.5 G(utput)-6 E F0
+(into the line\).)2.5 E .056(In the second form,)108 393.6 R F2("k)2.556
+E(eyseq")-.1 E F0(:)A F1(function\255name).833 E F0(or)2.556 E F1(macr)
+2.556 E(o)-.45 E F0(,)A F2 -.1(ke)2.556 G(yseq).1 E F0(dif)2.555 E .055
+(fers from)-.25 F F2 -.1(ke)2.555 G(yname).1 E F0(abo)2.555 E .355 -.15
+(ve i)-.15 H 2.555(nt).15 G .055(hat strings)-2.555 F 1.284
+(denoting an entire k)108 405.6 R 1.584 -.15(ey s)-.1 H 1.284(equence m\
+ay be speci\214ed by placing the sequence within double quotes.).15 F
+(Some)6.284 E .386(GNU Emacs style k)108 417.6 R .686 -.15(ey e)-.1 H
+.385(scapes can be used, as in the follo).15 F .385(wing e)-.25 F .385
+(xample, b)-.15 F .385(ut the symbolic character names)-.2 F
+(are not recognized.)108 429.6 Q("\\C\255u": uni)144 453.6 Q -.15(ve)
+-.25 G(rsal\255ar).15 E(gument)-.18 E
+("\\C\255x\\C\255r": re\255read\255init\255\214le)144 465.6 Q
+("\\e[11~": "Function K)144 477.6 Q .3 -.15(ey 1)-.25 H(").15 E .314
+(In this e)108 494.4 R(xample,)-.15 E F1(C\255u)2.654 E F0 .314(is ag)
+3.064 F .315(ain bound to the function)-.05 F F2(uni)2.815 E -.1(ve)-.1
+G(rsal\255ar).1 E(gument)-.1 E F0(.)A F1 .315(C\255x C\255r)5.155 F F0
+.315(is bound to the func-)3.545 F(tion)108 506.4 Q F2 -.18(re)2.5 G
+<ad72>.18 E(ead\255init\255\214le)-.18 E F0 2.5(,a)C(nd)-2.5 E F1
+(ESC [ 1 1 ~)3.01 E F0(is bound to insert the te)3.94 E(xt)-.15 E F3
+(Function Key 1)2.5 E F0(.)A
+(The full set of GNU Emacs style escape sequences is)108 523.2 Q F2
+<5c43ad>144 535.2 Q F0(control pre\214x)20.3 E F2<5c4dad>144 547.2 Q F0
+(meta pre\214x)18.08 E F2(\\e)144 559.2 Q F0(an escape character)28.78 E
+F2(\\\\)144 571.2 Q F0(backslash)30.44 E F2(\\")144 583.2 Q F0
+(literal ")27.67 E F2(\\')144 595.2 Q F0(literal ')29.89 E(In addition \
+to the GNU Emacs style escape sequences, a second set of backslash esca\
+pes is a)108 612 Q -.25(va)-.2 G(ilable:).25 E F2(\\a)144 624 Q F0
+(alert \(bell\))28.22 E F2(\\b)144 636 Q F0(backspace)27.66 E F2(\\d)144
+648 Q F0(delete)27.66 E F2(\\f)144 660 Q F0(form feed)29.89 E F2(\\n)144
+672 Q F0(ne)27.66 E(wline)-.25 E F2(\\r)144 684 Q F0(carriage return)
+28.78 E F2(\\t)144 696 Q F0(horizontal tab)29.89 E F2(\\v)144 708 Q F0
+-.15(ve)28.22 G(rtical tab).15 E(GNU Bash-3.0)72 768 Q(2003 No)147.975 E
+2.5(v1)-.15 G 197.965(33)-2.5 G(1)-197.965 E 0 Cg EP
+%%Page: 32 32
+%%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(\\)144 84 Q/F2 10/Times-Italic@0 SF(nnn)A
+F0(the eight-bit character whose v)18.22 E(alue is the octal v)-.25 E
+(alue)-.25 E F2(nnn)2.5 E F0(\(one to three digits\))2.5 E F1(\\x)144 96
+Q F2(HH)A F0(the eight-bit character whose v)13.78 E(alue is the he)-.25
+E(xadecimal v)-.15 E(alue)-.25 E F2(HH)2.5 E F0(\(one or tw)2.5 E 2.5
+(oh)-.1 G .3 -.15(ex d)-2.5 H(igits\)).15 E 1.142(When entering the te)
+108 112.8 R 1.141(xt of a macro, single or double quotes must be used t\
+o indicate a macro de\214nition.)-.15 F .089(Unquoted te)108 124.8 R
+.089(xt is assumed to be a function name.)-.15 F .09(In the macro body)
+5.089 F 2.59(,t)-.65 G .09(he backslash escapes described abo)-2.59 F
+-.15(ve)-.15 G(are e)108 136.8 Q 2.5(xpanded. Backslash)-.15 F
+(will quote an)2.5 E 2.5(yo)-.15 G(ther character in the macro te)-2.5 E
+(xt, including " and '.)-.15 E F1(Bash)108 153.6 Q F0(allo)2.93 E .43
+(ws the current readline k)-.25 F .73 -.15(ey b)-.1 H .429
+(indings to be displayed or modi\214ed with the).15 F F1(bind)2.929 E F0
+-.2(bu)2.929 G .429(iltin command.).2 F .045
+(The editing mode may be switched during interacti)108 165.6 R .345 -.15
+(ve u)-.25 H .046(se by using the).15 F F1<ad6f>2.546 E F0 .046
+(option to the)2.546 F F1(set)2.546 E F0 -.2(bu)2.546 G .046
+(iltin command).2 F(\(see)108 177.6 Q/F3 9/Times-Bold@0 SF(SHELL B)2.5 E
+(UIL)-.09 E(TIN COMMANDS)-.828 E F0(belo)2.25 E(w\).)-.25 E F1
+(Readline V)87 194.4 Q(ariables)-.92 E F0 .044(Readline has v)108 206.4
+R .043(ariables that can be used to further customize its beha)-.25 F
+(vior)-.2 E 5.043(.A)-.55 G -.25(va)-2.5 G .043
+(riable may be set in the).25 F F2(inpu-)2.553 E(tr)108 218.4 Q(c)-.37 E
+F0(\214le with a statement of the form)2.81 E F1(set)144 235.2 Q F2
+(variable\255name value)2.5 E F0 .488(Except where noted, readline v)108
+252 R .489(ariables can tak)-.25 F 2.989(et)-.1 G .489(he v)-2.989 F
+(alues)-.25 E F1(On)2.989 E F0(or)2.989 E F1(Off)2.989 E F0 5.489(.T)C
+.489(he v)-5.489 F .489(ariables and their def)-.25 F .489(ault v)-.1 F
+(al-)-.25 E(ues are:)108 264 Q F1(bell\255style \(audible\))108 280.8 Q
+F0 .011(Controls what happens when readline w)144 292.8 R .011
+(ants to ring the terminal bell.)-.1 F .01(If set to)5.01 F F1(none)2.51
+E F0 2.51(,r)C .01(eadline ne)-2.51 F -.15(ve)-.25 G(r).15 E .94
+(rings the bell.)144 304.8 R .94(If set to)5.94 F F1(visible)3.44 E F0
+3.44(,r)C .94(eadline uses a visible bell if one is a)-3.44 F -.25(va)
+-.2 G 3.44(ilable. If).25 F .94(set to)3.44 F F1(audible)3.44 E F0(,)A
+(readline attempts to ring the terminal')144 316.8 Q 2.5(sb)-.55 G(ell.)
+-2.5 E F1(comment\255begin \(`)108 328.8 Q(`#')-.63 E('\))-.63 E F0 .885
+(The string that is inserted when the readline)144 340.8 R F1
+(insert\255comment)3.385 E F0 .884(command is e)3.384 F -.15(xe)-.15 G
+3.384(cuted. This).15 F(com-)3.384 E(mand is bound to)144 352.8 Q F1
+(M\255#)2.5 E F0(in emacs mode and to)2.5 E F1(#)2.5 E F0
+(in vi command mode.)2.5 E F1(completion\255ignor)108 364.8 Q
+(e\255case \(Off\))-.18 E F0(If set to)144 376.8 Q F1(On)2.5 E F0 2.5
+(,r)C(eadline performs \214lename matching and completion in a case\255\
+insensiti)-2.5 E .3 -.15(ve f)-.25 H(ashion.).05 E F1
+(completion\255query\255items \(100\))108 388.8 Q F0 .529
+(This determines when the user is queried about vie)144 400.8 R .53
+(wing the number of possible completions gen-)-.25 F .561(erated by the)
+144 412.8 R F1(possible\255completions)3.061 E F0 3.061(command. It)
+3.061 F .561(may be set to an)3.061 F 3.06(yi)-.15 G(nte)-3.06 E .56
+(ger v)-.15 F .56(alue greater than or)-.25 F .782(equal to zero.)144
+424.8 R .783(If the number of possible completions is greater than or e\
+qual to the v)5.782 F .783(alue of this)-.25 F -.25(va)144 436.8 S .237
+(riable, the user is ask).25 F .237(ed whether or not he wishes to vie)
+-.1 F 2.737(wt)-.25 G .237(hem; otherwise the)-2.737 F 2.737(ya)-.15 G
+.237(re simply listed)-2.737 F(on the terminal.)144 448.8 Q F1(con)108
+460.8 Q -.1(ve)-.4 G(rt\255meta \(On\)).1 E F0 .612(If set to)144 472.8
+R F1(On)3.112 E F0 3.112(,r)C .613(eadline will con)-3.112 F -.15(ve)-.4
+G .613(rt characters with the eighth bit set to an ASCII k).15 F .913
+-.15(ey s)-.1 H .613(equence by).15 F .541
+(stripping the eighth bit and pre\214xing an escape character \(in ef)
+144 484.8 R .541(fect, using escape as the)-.25 F F2 .541(meta pr)3.041
+F(e-)-.37 E<8c78>144 496.8 Q F0(\).)A F1(disable\255completion \(Off\))
+108 508.8 Q F0 .038(If set to)144 520.8 R F1(On)2.538 E F0 2.538(,r)C
+.038(eadline will inhibit w)-2.538 F .038(ord completion.)-.1 F .038
+(Completion characters will be inserted into the)5.038 F(line as if the)
+144 532.8 Q 2.5(yh)-.15 G(ad been mapped to)-2.5 E F1(self-insert)2.5 E
+F0(.)A F1(editing\255mode \(emacs\))108 544.8 Q F0 .253
+(Controls whether readline be)144 556.8 R .253(gins with a set of k)-.15
+F .553 -.15(ey b)-.1 H .253(indings similar to).15 F F2(emacs)2.752 E F0
+(or)2.752 E F2(vi)2.752 E F0(.)A F1(editing\255mode)5.252 E F0
+(can be set to either)144 568.8 Q F1(emacs)2.5 E F0(or)2.5 E F1(vi)2.5 E
+F0(.)A F1(enable\255k)108 580.8 Q(eypad \(Off\))-.1 E F0 .892
+(When set to)144 592.8 R F1(On)3.393 E F0 3.393(,r)C .893
+(eadline will try to enable the application k)-3.393 F -.15(ey)-.1 G
+.893(pad when it is called.).15 F .893(Some sys-)5.893 F
+(tems need this to enable the arro)144 604.8 Q 2.5(wk)-.25 G -.15(ey)
+-2.6 G(s.).15 E F1(expand\255tilde \(Off\))108 616.8 Q F0(If set to)144
+628.8 Q F1(on)2.5 E F0 2.5(,t)C(ilde e)-2.5 E
+(xpansion is performed when readline attempts w)-.15 E(ord completion.)
+-.1 E F1(history-pr)108 640.8 Q(eser)-.18 E -.1(ve)-.1 G(-point).1 E F0
+1.493(If set to)144 652.8 R F1(on)3.993 E F0 3.993(,t)C 1.493(he histor\
+y code attempts to place point at the same location on each history lin\
+e)-3.993 F(retri)144 664.8 Q -.15(ve)-.25 G 2.5(dw).15 G(ith)-2.5 E F1
+(pr)2.5 E -.15(ev)-.18 G(ious-history).15 E F0(or)2.5 E F1(next-history)
+2.5 E F0(.)A F1(horizontal\255scr)108 676.8 Q(oll\255mode \(Off\))-.18 E
+F0 .448(When set to)144 688.8 R F1(On)2.948 E F0 2.948(,m)C(ak)-2.948 E
+.448(es readline use a single line for display)-.1 F 2.948(,s)-.65 G
+.449(crolling the input horizontally on a)-2.948 F 1.194(single screen \
+line when it becomes longer than the screen width rather than wrapping \
+to a ne)144 700.8 R(w)-.25 E(line.)144 712.8 Q(GNU Bash-3.0)72 768 Q
+(2003 No)147.975 E 2.5(v1)-.15 G 197.965(33)-2.5 G(2)-197.965 E 0 Cg EP
+%%Page: 33 33
+%%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(input\255meta \(Off\))108 84 Q F0 .227
+(If set to)144 96 R F1(On)2.727 E F0 2.727(,r)C .228(eadline will enabl\
+e eight-bit input \(that is, it will not strip the high bit from the ch\
+ar)-2.727 F(-)-.2 E .957(acters it reads\), re)144 108 R -.05(ga)-.15 G
+.956(rdless of what the terminal claims it can support.).05 F .956
+(The name)5.956 F F1(meta\255\215ag)3.456 E F0 .956(is a)3.456 F(synon)
+144 120 Q(ym for this v)-.15 E(ariable.)-.25 E F1(isear)108 132 Q
+(ch\255terminators \(`)-.18 E(`C\255[C\255J')-.63 E('\))-.63 E F0 .439(\
+The string of characters that should terminate an incremental search wi\
+thout subsequently e)144 144 R -.15(xe)-.15 G(cut-).15 E .935
+(ing the character as a command.)144 156 R .935(If this v)5.935 F .935
+(ariable has not been gi)-.25 F -.15(ve)-.25 G 3.434(nav).15 G .934
+(alue, the characters)-3.684 F/F2 10/Times-Italic@0 SF(ESC)3.434 E F0
+(and)144 168 Q F2(C\255J)2.5 E F0(will terminate an incremental search.)
+2.5 E F1 -.1(ke)108 180 S(ymap \(emacs\)).1 E F0 2.02
+(Set the current readline k)144 192 R -.15(ey)-.1 G 4.521(map. The).15 F
+2.021(set of v)4.521 F 2.021(alid k)-.25 F -.15(ey)-.1 G 2.021
+(map names is).15 F F2 2.021(emacs, emacs\255standar)4.521 F(d,)-.37 E
+.069(emacs\255meta, emacs\255ctlx, vi, vi\255command)144 204 R F0 2.568
+(,a)C(nd)-2.568 E F2(vi\255insert)2.568 E F0(.).68 E F2(vi)5.068 E F0
+.068(is equi)2.568 F -.25(va)-.25 G .068(lent to).25 F F2(vi\255command)
+2.568 E F0(;)A F2(emacs)2.568 E F0 1.543(is equi)144 216 R -.25(va)-.25
+G 1.543(lent to).25 F F2(emacs\255standar)4.044 E(d)-.37 E F0 6.544(.T)C
+1.544(he def)-6.544 F 1.544(ault v)-.1 F 1.544(alue is)-.25 F F2(emacs)
+4.044 E F0 4.044(;t).27 G 1.544(he v)-4.044 F 1.544(alue of)-.25 F F1
+(editing\255mode)4.044 E F0(also)4.044 E(af)144 228 Q(fects the def)-.25
+E(ault k)-.1 E -.15(ey)-.1 G(map.).15 E F1(mark\255dir)108 240 Q
+(ectories \(On\))-.18 E F0(If set to)144 252 Q F1(On)2.5 E F0 2.5(,c)C
+(ompleted directory names ha)-2.5 E .3 -.15(ve a s)-.2 H(lash appended.)
+.15 E F1(mark\255modi\214ed\255lines \(Off\))108 264 Q F0(If set to)144
+276 Q F1(On)2.5 E F0 2.5(,h)C(istory lines that ha)-2.5 E .3 -.15(ve b)
+-.2 H(een modi\214ed are displayed with a preceding asterisk \().15 E F1
+(*)A F0(\).)A F1(mark\255symlink)108 288 Q(ed\255dir)-.1 E
+(ectories \(Off\))-.18 E F0 .175(If set to)144 300 R F1(On)2.675 E F0
+2.675(,c)C .175
+(ompleted names which are symbolic links to directories ha)-2.675 F .475
+-.15(ve a s)-.2 H .175(lash appended \(sub-).15 F(ject to the v)144 312
+Q(alue of)-.25 E F1(mark\255dir)2.5 E(ectories)-.18 E F0(\).)A F1
+(match\255hidden\255\214les \(On\))108 324 Q F0 .192(This v)144 336 R
+.192(ariable, when set to)-.25 F F1(On)2.692 E F0 2.692(,c)C .192
+(auses readline to match \214les whose names be)-2.692 F .193
+(gin with a `.)-.15 F 2.693('\()-.7 G(hidden)-2.693 E 1.024
+(\214les\) when performing \214lename completion, unless the leading `.)
+144 348 R 3.523('i)-.7 G 3.523(ss)-3.523 G 1.023
+(upplied by the user in the)-3.523 F(\214lename to be completed.)144 360
+Q F1(output\255meta \(Off\))108 372 Q F0 .506(If set to)144 384 R F1(On)
+3.006 E F0 3.006(,r)C .507(eadline will display characters with the eig\
+hth bit set directly rather than as a meta-)-3.006 F(pre\214x)144 396 Q
+(ed escape sequence.)-.15 E F1(page\255completions \(On\))108 408 Q F0
+.809(If set to)144 420 R F1(On)3.308 E F0 3.308(,r)C .808
+(eadline uses an internal)-3.308 F F2(mor)3.308 E(e)-.37 E F0(-lik)A
+3.308(ep)-.1 G .808(ager to display a screenful of possible comple-)
+-3.308 F(tions at a time.)144 432 Q F1
+(print\255completions\255horizontally \(Off\))108 444 Q F0 1.318
+(If set to)144 456 R F1(On)3.818 E F0 3.818(,r)C 1.319(eadline will dis\
+play completions with matches sorted horizontally in alphabetical)-3.818
+F(order)144 468 Q 2.5(,r)-.4 G(ather than do)-2.5 E(wn the screen.)-.25
+E F1(sho)108 480 Q(w\255all\255if\255ambiguous \(Off\))-.1 E F0 .478
+(This alters the def)144 492 R .478(ault beha)-.1 F .478
+(vior of the completion functions.)-.2 F .477(If set to)5.477 F F1(on)
+2.977 E F0 2.977(,w)C .477(ords which ha)-3.077 F .777 -.15(ve m)-.2 H
+(ore).15 E 1.264(than one possible completion cause the matches to be l\
+isted immediately instead of ringing the)144 504 R(bell.)144 516 Q F1
+(sho)108 528 Q(w\255all\255if\255unmodi\214ed \(Off\))-.1 E F0 5.346
+(This alters the def)144 540 R 5.346(ault beha)-.1 F 5.345
+(vior of the completion functions in a f)-.2 F 5.345(ashion similar to)
+-.1 F F1(sho)144 552 Q(w\255all\255if\255ambiguous)-.1 E F0 6.922(.I)C
+4.422(fs)-6.922 G 1.922(et to)-4.422 F F1(on)4.422 E F0 4.422(,w)C 1.922
+(ords which ha)-4.522 F 2.223 -.15(ve m)-.2 H 1.923
+(ore than one possible completion).15 F 1.04(without an)144 564 R 3.54
+(yp)-.15 G 1.039
+(ossible partial completion \(the possible completions don')-3.54 F
+3.539(ts)-.18 G 1.039(hare a common pre\214x\))-3.539 F(cause the match\
+es to be listed immediately instead of ringing the bell.)144 576 Q F1
+(visible\255stats \(Off\))108 588 Q F0 .846(If set to)144 600 R F1(On)
+3.346 E F0 3.346(,ac)C .846(haracter denoting a \214le')-3.346 F 3.346
+(st)-.55 G .846(ype as reported by)-3.346 F F2(stat)3.346 E F0 .846
+(\(2\) is appended to the \214lename)B
+(when listing possible completions.)144 612 Q F1
+(Readline Conditional Constructs)87 628.8 Q F0 .05
+(Readline implements a f)108 640.8 R .05(acility similar in spirit to t\
+he conditional compilation features of the C preprocessor)-.1 F .096
+(which allo)108 652.8 R .096(ws k)-.25 F .396 -.15(ey b)-.1 H .096
+(indings and v).15 F .096
+(ariable settings to be performed as the result of tests.)-.25 F .097
+(There are four parser)5.096 F(directi)108 664.8 Q -.15(ve)-.25 G 2.5
+(su).15 G(sed.)-2.5 E F1($if)108 681.6 Q F0(The)24.89 E F1($if)2.963 E
+F0 .463(construct allo)2.963 F .462(ws bindings to be made based on the\
+ editing mode, the terminal being used,)-.25 F .477
+(or the application using readline.)144 693.6 R .477(The te)5.477 F .477
+(xt of the test e)-.15 F .477
+(xtends to the end of the line; no characters)-.15 F
+(are required to isolate it.)144 705.6 Q(GNU Bash-3.0)72 768 Q(2003 No)
+147.975 E 2.5(v1)-.15 G 197.965(33)-2.5 G(3)-197.965 E 0 Cg EP
+%%Page: 34 34
+%%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(mode)144 84 Q F0(The)12.67 E F1(mode=)3.712
+E F0 1.212(form of the)3.712 F F1($if)3.711 E F0(directi)3.711 E 1.511
+-.15(ve i)-.25 H 3.711(su).15 G 1.211
+(sed to test whether readline is in emacs or vi)-3.711 F 3.065
+(mode. This)180 96 R .565(may be used in conjunction with the)3.065 F F1
+.565(set k)3.065 F(eymap)-.1 E F0 .565(command, for instance, to)3.065 F
+.735(set bindings in the)180 108 R/F2 10/Times-Italic@0 SF
+(emacs\255standar)3.235 E(d)-.37 E F0(and)3.235 E F2(emacs\255ctlx)3.235
+E F0 -.1(ke)3.235 G .735(ymaps only if readline is starting)-.05 F
+(out in emacs mode.)180 120 Q F1(term)144 136.8 Q F0(The)15.46 E F1
+(term=)3.196 E F0 .696
+(form may be used to include terminal-speci\214c k)3.196 F .996 -.15
+(ey b)-.1 H .697(indings, perhaps to bind).15 F .654(the k)180 148.8 R
+.954 -.15(ey s)-.1 H .654(equences output by the terminal').15 F 3.154
+(sf)-.55 G .654(unction k)-3.154 F -.15(ey)-.1 G 3.154(s. The).15 F -.1
+(wo)3.154 G .654(rd on the right side of).1 F(the)180 160.8 Q F1(=)3.231
+E F0 .731(is tested ag)3.231 F .732(ainst the both full name of the ter\
+minal and the portion of the terminal)-.05 F(name before the \214rst)180
+172.8 Q F1<ad>2.5 E F0 5(.T)C(his allo)-5 E(ws)-.25 E F2(sun)2.84 E F0
+(to match both)2.74 E F2(sun)2.84 E F0(and)2.74 E F2(sun\255cmd)2.5 E F0
+2.5(,f).77 G(or instance.)-2.5 E F1(application)144 189.6 Q F0(The)180
+201.6 Q F1(application)3.003 E F0 .503
+(construct is used to include application-speci\214c settings.)3.003 F
+.503(Each program)5.503 F .114(using the readline library sets the)180
+213.6 R F2 .114(application name)2.614 F F0 2.614(,a)C .114
+(nd an initialization \214le can test for a)-2.614 F .501(particular v)
+180 225.6 R 3.001(alue. This)-.25 F .501(could be used to bind k)3.001 F
+.801 -.15(ey s)-.1 H .5(equences to functions useful for a spe-).15 F
+.396(ci\214c program.)180 237.6 R -.15(Fo)5.396 G 2.896(ri).15 G .396
+(nstance, the follo)-2.896 F .396(wing command adds a k)-.25 F .696 -.15
+(ey s)-.1 H .397(equence that quotes the).15 F(current or pre)180 249.6
+Q(vious w)-.25 E(ord in Bash:)-.1 E F1($if)180 273.6 Q F0(Bash)2.5 E 2.5
+(#Q)180 285.6 S(uote the current or pre)-2.5 E(vious w)-.25 E(ord)-.1 E
+("\\C\255xq": "\\eb\\"\\ef\\"")180 297.6 Q F1($endif)180 309.6 Q($endif)
+108 326.4 Q F0(This command, as seen in the pre)9.33 E(vious e)-.25 E
+(xample, terminates an)-.15 E F1($if)2.5 E F0(command.)2.5 E F1($else)
+108 343.2 Q F0(Commands in this branch of the)15.45 E F1($if)2.5 E F0
+(directi)2.5 E .3 -.15(ve a)-.25 H(re e).15 E -.15(xe)-.15 G
+(cuted if the test f).15 E(ails.)-.1 E F1($include)108 360 Q F0 .357
+(This directi)144 372 R .657 -.15(ve t)-.25 H(ak).15 E .357
+(es a single \214lename as an ar)-.1 F .356
+(gument and reads commands and bindings from that)-.18 F 2.5(\214le. F)
+144 384 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 F1
+($include)144 408 Q F2(/etc/inputr)5.833 E(c)-.37 E F1(Sear)87 424.8 Q
+(ching)-.18 E F0 .834(Readline pro)108 436.8 R .834
+(vides commands for searching through the command history \(see)-.15 F
+/F3 9/Times-Bold@0 SF(HIST)3.335 E(OR)-.162 E(Y)-.315 E F0(belo)3.085 E
+.835(w\) for lines)-.25 F(containing a speci\214ed string.)108 448.8 Q
+(There are tw)5 E 2.5(os)-.1 G(earch modes:)-2.5 E F2(incr)2.51 E
+(emental)-.37 E F0(and)3.01 E F2(non-incr)2.5 E(emental)-.37 E F0(.).51
+E .698(Incremental searches be)108 465.6 R .698
+(gin before the user has \214nished typing the search string.)-.15 F
+.697(As each character of the)5.697 F .112
+(search string is typed, readline displays the ne)108 477.6 R .112
+(xt entry from the history matching the string typed so f)-.15 F(ar)-.1
+E 5.113(.A)-.55 G(n)-5.113 E .542
+(incremental search requires only as man)108 489.6 R 3.042(yc)-.15 G
+.542(haracters as needed to \214nd the desired history entry)-3.042 F
+5.541(.T)-.65 G .541(he char)-5.541 F(-)-.2 E .224
+(acters present in the v)108 501.6 R .224(alue of the)-.25 F F1(isear)
+2.724 E(ch-terminators)-.18 E F0 -.25(va)2.724 G .224
+(riable are used to terminate an incremental search.).25 F .66
+(If that v)108 513.6 R .66(ariable has not been assigned a v)-.25 F .66
+(alue the Escape and Control-J characters will terminate an incre-)-.25
+F .096(mental search.)108 525.6 R .096(Control-G will abort an incremen\
+tal search and restore the original line.)5.096 F .097
+(When the search is)5.097 F(terminated, the history entry containing th\
+e search string becomes the current line.)108 537.6 Q 2.939 -.8(To \214)
+108 554.4 T 1.339(nd other matching entries in the history list, type C\
+ontrol-S or Control-R as appropriate.).8 F 1.338(This will)6.338 F .674
+(search backw)108 566.4 R .674(ard or forw)-.1 F .674
+(ard in the history for the ne)-.1 F .675
+(xt entry matching the search string typed so f)-.15 F(ar)-.1 E 5.675
+(.A)-.55 G -.15(ny)-5.675 G .175(other k)108 578.4 R .475 -.15(ey s)-.1
+H .174
+(equence bound to a readline command will terminate the search and e).15
+F -.15(xe)-.15 G .174(cute that command.).15 F -.15(Fo)5.174 G(r).15 E
+.54(instance, a)108 590.4 R F2(ne)3.04 E(wline)-.15 E F0 .541
+(will terminate the search and accept the line, thereby e)3.04 F -.15
+(xe)-.15 G .541(cuting the command from the).15 F(history list.)108
+602.4 Q .653(Readline remembers the last incremental search string.)108
+619.2 R .653(If tw)5.653 F 3.153(oC)-.1 G .653
+(ontrol-Rs are typed without an)-3.153 F 3.152(yi)-.15 G(nterv)-3.152 E
+(en-)-.15 E(ing characters de\214ning a ne)108 631.2 Q 2.5(ws)-.25 G
+(earch string, an)-2.5 E 2.5(yr)-.15 G(emembered search string is used.)
+-2.5 E .567(Non-incremental searches read the entire search string befo\
+re starting to search for matching history lines.)108 648 R(The search \
+string may be typed by the user or be part of the contents of the curre\
+nt line.)108 660 Q F1(Readline Command Names)87 676.8 Q F0 1.392
+(The follo)108 688.8 R 1.391
+(wing is a list of the names of the commands and the def)-.25 F 1.391
+(ault k)-.1 F 1.691 -.15(ey s)-.1 H 1.391(equences to which the).15 F
+3.891(ya)-.15 G(re)-3.891 E 2.621(bound. Command)108 700.8 R .121
+(names without an accompan)2.621 F .121(ying k)-.15 F .421 -.15(ey s)-.1
+H .122(equence are unbound by def).15 F 2.622(ault. In)-.1 F .122
+(the follo)2.622 F(wing)-.25 E(descriptions,)108 712.8 Q F2(point)3.411
+E F0 .911(refers to the current cursor position, and)3.411 F F2(mark)
+3.411 E F0 .91(refers to a cursor position sa)3.411 F -.15(ve)-.2 G 3.41
+(db).15 G 3.41(yt)-3.41 G(he)-3.41 E F1(set\255mark)108 724.8 Q F0 2.5
+(command. The)2.5 F(te)2.5 E
+(xt between the point and mark is referred to as the)-.15 E F2 -.37(re)
+2.5 G(gion)-.03 E F0(.)A(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)
+-.15 G 197.965(33)-2.5 G(4)-197.965 E 0 Cg EP
+%%Page: 35 35
+%%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(Commands f)87 84 Q(or Mo)-.25 E(ving)-.1 E
+(beginning\255of\255line \(C\255a\))108 96 Q F0(Mo)144 108 Q .3 -.15
+(ve t)-.15 H 2.5(ot).15 G(he start of the current line.)-2.5 E F1
+(end\255of\255line \(C\255e\))108 120 Q F0(Mo)144 132 Q .3 -.15(ve t)
+-.15 H 2.5(ot).15 G(he end of the line.)-2.5 E F1 -.25(fo)108 144 S
+(rward\255char \(C\255f\)).25 E F0(Mo)144 156 Q .3 -.15(ve f)-.15 H(orw)
+.15 E(ard a character)-.1 E(.)-.55 E F1(backward\255char \(C\255b\))108
+168 Q F0(Mo)144 180 Q .3 -.15(ve b)-.15 H(ack a character).15 E(.)-.55 E
+F1 -.25(fo)108 192 S(rward\255w).25 E(ord \(M\255f\))-.1 E F0(Mo)144 204
+Q .822 -.15(ve f)-.15 H(orw).15 E .522(ard to the end of the ne)-.1 F
+.523(xt w)-.15 F 3.023(ord. W)-.1 F .523
+(ords are composed of alphanumeric characters \(let-)-.8 F
+(ters and digits\).)144 216 Q F1(backward\255w)108 228 Q(ord \(M\255b\))
+-.1 E F0(Mo)144 240 Q 1.71 -.15(ve b)-.15 H 1.41
+(ack to the start of the current or pre).15 F 1.41(vious w)-.25 F 3.91
+(ord. W)-.1 F 1.41(ords are composed of alphanumeric)-.8 F
+(characters \(letters and digits\).)144 252 Q F1(clear\255scr)108 264 Q
+(een \(C\255l\))-.18 E F0 .993(Clear the screen lea)144 276 R .993
+(ving the current line at the top of the screen.)-.2 F -.4(Wi)5.993 G
+.993(th an ar).4 F .993(gument, refresh the)-.18 F
+(current line without clearing the screen.)144 288 Q F1 -.18(re)108 300
+S(draw\255curr).18 E(ent\255line)-.18 E F0(Refresh the current line.)144
+312 Q F1(Commands f)87 328.8 Q(or Manipulating the History)-.25 E
+(accept\255line \(Newline, Retur)108 340.8 Q(n\))-.15 E F0 .159
+(Accept the line re)144 352.8 R -.05(ga)-.15 G .159
+(rdless of where the cursor is.).05 F .158(If this line is non-empty)
+5.158 F 2.658(,a)-.65 G .158(dd it to the history list)-2.658 F .699
+(according to the state of the)144 364.8 R/F2 9/Times-Bold@0 SF
+(HISTCONTR)3.199 E(OL)-.27 E F0 -.25(va)2.949 G 3.199(riable. If).25 F
+.699(the line is a modi\214ed history line, then)3.199 F
+(restore the history line to its original state.)144 376.8 Q F1(pr)108
+388.8 Q -.15(ev)-.18 G(ious\255history \(C\255p\)).15 E F0
+(Fetch the pre)144 400.8 Q(vious command from the history list, mo)-.25
+E(ving back in the list.)-.15 E F1(next\255history \(C\255n\))108 412.8
+Q F0(Fetch the ne)144 424.8 Q(xt command from the history list, mo)-.15
+E(ving forw)-.15 E(ard in the list.)-.1 E F1
+(beginning\255of\255history \(M\255<\))108 436.8 Q F0(Mo)144 448.8 Q .3
+-.15(ve t)-.15 H 2.5(ot).15 G(he \214rst line in the history)-2.5 E(.)
+-.65 E F1(end\255of\255history \(M\255>\))108 460.8 Q F0(Mo)144 472.8 Q
+.3 -.15(ve t)-.15 H 2.5(ot).15 G(he end of the input history)-2.5 E 2.5
+(,i)-.65 G(.e., the line currently being entered.)-2.5 E F1 -2.29 -.18
+(re v)108 484.8 T(erse\255sear).08 E(ch\255history \(C\255r\))-.18 E F0
+1.471(Search backw)144 496.8 R 1.471
+(ard starting at the current line and mo)-.1 F 1.47
+(ving `up' through the history as necessary)-.15 F(.)-.65 E
+(This is an incremental search.)144 508.8 Q F1 -.25(fo)108 520.8 S
+(rward\255sear).25 E(ch\255history \(C\255s\))-.18 E F0 1.131
+(Search forw)144 532.8 R 1.131(ard starting at the current line and mo)
+-.1 F 1.132(ving `do)-.15 F 1.132(wn' through the history as necessary)
+-.25 F(.)-.65 E(This is an incremental search.)144 544.8 Q F1
+(non\255incr)108 556.8 Q(emental\255r)-.18 E -2.3 -.15(ev e)-.18 H
+(rse\255sear).15 E(ch\255history \(M\255p\))-.18 E F0 .165(Search backw)
+144 568.8 R .164(ard through the history starting at the current line u\
+sing a non-incremental search for)-.1 F 2.5(as)144 580.8 S
+(tring supplied by the user)-2.5 E(.)-.55 E F1(non\255incr)108 592.8 Q
+(emental\255f)-.18 E(orward\255sear)-.25 E(ch\255history \(M\255n\))-.18
+E F0 1.353(Search forw)144 604.8 R 1.354(ard through the history using \
+a non-incremental search for a string supplied by the)-.1 F(user)144
+616.8 Q(.)-.55 E F1(history\255sear)108 628.8 Q(ch\255f)-.18 E(orward)
+-.25 E F0 .249(Search forw)144 640.8 R .249(ard through the history for\
+ the string of characters between the start of the current line)-.1 F
+(and the point.)144 652.8 Q(This is a non-incremental search.)5 E F1
+(history\255sear)108 664.8 Q(ch\255backward)-.18 E F0 .95(Search backw)
+144 676.8 R .951(ard through the history for the string of characters b\
+etween the start of the current)-.1 F(line and the point.)144 688.8 Q
+(This is a non-incremental search.)5 E F1(yank\255nth\255ar)108 700.8 Q
+2.5(g\()-.1 G<4dad43ad7929>-2.5 E F0 .622(Insert the \214rst ar)144
+712.8 R .622(gument to the pre)-.18 F .622
+(vious command \(usually the second w)-.25 F .622(ord on the pre)-.1 F
+.622(vious line\))-.25 F .794(at point.)144 724.8 R -.4(Wi)5.794 G .794
+(th an ar).4 F(gument)-.18 E/F3 10/Times-Italic@0 SF(n)3.294 E F0 3.294
+(,i).24 G .794(nsert the)-3.294 F F3(n)3.294 E F0 .794(th w)B .794
+(ord from the pre)-.1 F .794(vious command \(the w)-.25 F .795
+(ords in the)-.1 F(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G
+197.965(33)-2.5 G(5)-197.965 E 0 Cg EP
+%%Page: 36 36
+%%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(pre)144 84 Q .292(vious command be)-.25 F .292(gin with w)-.15 F
+.291(ord 0\).)-.1 F 2.791(An)5.291 G -2.25 -.15(eg a)-2.791 H(ti).15 E
+.591 -.15(ve a)-.25 H -.18(rg).15 G .291(ument inserts the).18 F/F1 10
+/Times-Italic@0 SF(n)2.791 E F0 .291(th w)B .291(ord from the end of)-.1
+F(the pre)144 96 Q(vious command.)-.25 E/F2 10/Times-Bold@0 SF
+(yank\255last\255ar)108 108 Q 2.5(g\()-.1 G -1.667(M\255. ,)-2.5 F
+-1.667(M\255_ \))2.5 F F0 1.307(Insert the last ar)144 120 R 1.307
+(gument to the pre)-.18 F 1.307(vious command \(the last w)-.25 F 1.308
+(ord of the pre)-.1 F 1.308(vious history entry\).)-.25 F -.4(Wi)144 132
+S .736(th an ar).4 F .736(gument, beha)-.18 F 1.036 -.15(ve ex)-.2 H
+.736(actly lik).15 F(e)-.1 E F2(yank\255nth\255ar)3.235 E(g)-.1 E F0
+5.735(.S)C(uccessi)-5.735 E 1.035 -.15(ve c)-.25 H .735(alls to).15 F F2
+(yank\255last\255ar)3.235 E(g)-.1 E F0(mo)3.235 E -.15(ve)-.15 G
+(back through the history list, inserting the last ar)144 144 Q
+(gument of each line in turn.)-.18 E F2
+(shell\255expand\255line \(M\255C\255e\))108 156 Q F0 .622
+(Expand the line as the shell does.)144 168 R .622
+(This performs alias and history e)5.622 F .623
+(xpansion as well as all of the)-.15 F(shell w)144 180 Q(ord e)-.1 E 2.5
+(xpansions. See)-.15 F/F3 9/Times-Bold@0 SF(HIST)2.5 E(OR)-.162 E 2.25
+(YE)-.315 G(XP)-2.25 E(ANSION)-.666 E F0(belo)2.25 E 2.5(wf)-.25 G
+(or a description of history e)-2.5 E(xpansion.)-.15 E F2
+(history\255expand\255line \(M\255^\))108 192 Q F0 .939
+(Perform history e)144 204 R .939(xpansion on the current line.)-.15 F
+(See)5.939 E F3(HIST)3.439 E(OR)-.162 E 3.189(YE)-.315 G(XP)-3.189 E
+(ANSION)-.666 E F0(belo)3.189 E 3.438(wf)-.25 G .938(or a descrip-)
+-3.438 F(tion of history e)144 216 Q(xpansion.)-.15 E F2(magic\255space)
+108 228 Q F0 1.626(Perform history e)144 240 R 1.626
+(xpansion on the current line and insert a space.)-.15 F(See)6.627 E F3
+(HIST)4.127 E(OR)-.162 E 3.877(YE)-.315 G(XP)-3.877 E(ANSION)-.666 E F0
+(belo)144 252 Q 2.5(wf)-.25 G(or a description of history e)-2.5 E
+(xpansion.)-.15 E F2(alias\255expand\255line)108 264 Q F0 .395
+(Perform alias e)144 276 R .395(xpansion on the current line.)-.15 F
+(See)5.395 E F3(ALIASES)2.895 E F0(abo)2.645 E .694 -.15(ve f)-.15 H
+.394(or a description of alias e).15 F(xpan-)-.15 E(sion.)144 288 Q F2
+(history\255and\255alias\255expand\255line)108 300 Q F0
+(Perform history and alias e)144 312 Q(xpansion on the current line.)
+-.15 E F2(insert\255last\255ar)108 324 Q(gument \(M\255.)-.1 E 2.5(,M)
+.833 G -1.667(\255_ \))-2.5 F F0 2.5(As)144 336 S(ynon)-2.5 E(ym for)
+-.15 E F2(yank\255last\255ar)2.5 E(g)-.1 E F0(.)A F2
+(operate\255and\255get\255next \(C\255o\))108 348 Q F0 .947
+(Accept the current line for e)144 360 R -.15(xe)-.15 G .948
+(cution and fetch the ne).15 F .948(xt line relati)-.15 F 1.248 -.15
+(ve t)-.25 H 3.448(ot).15 G .948(he current line from the)-3.448 F
+(history for editing.)144 372 Q(An)5 E 2.5(ya)-.15 G -.18(rg)-2.5 G
+(ument is ignored.).18 E F2
+(edit\255and\255execute\255command \(C\255xC\255e\))108 384 Q F0(In)144
+396 Q -.2(vo)-.4 G 1.226 -.1(ke a).2 H 3.526(ne).1 G 1.026
+(ditor on the current command line, and e)-3.526 F -.15(xe)-.15 G 1.026
+(cute the result as shell commands.).15 F F2(Bash)6.026 E F0
+(attempts to in)144 408 Q -.2(vo)-.4 G -.1(ke).2 G F3($FCEDIT)2.6 E/F4 9
+/Times-Roman@0 SF(,)A F3($EDIT)2.25 E(OR)-.162 E F4(,)A F0(and)2.25 E F1
+(emacs)2.5 E F0(as the editor)2.5 E 2.5(,i)-.4 G 2.5(nt)-2.5 G
+(hat order)-2.5 E(.)-.55 E F2(Commands f)87 424.8 Q(or Changing T)-.25 E
+(ext)-.92 E(delete\255char \(C\255d\))108 436.8 Q F0 .357
+(Delete the character at point.)144 448.8 R .358(If point is at the be)
+5.358 F .358(ginning of the line, there are no characters in the)-.15 F
+(line, and the last character typed w)144 460.8 Q(as not bound to)-.1 E
+F2(delete\255char)2.5 E F0 2.5(,t)C(hen return)-2.5 E F3(EOF)2.5 E F4(.)
+A F2(backward\255delete\255char \(Rubout\))108 472.8 Q F0 .553
+(Delete the character behind the cursor)144 484.8 R 5.553(.W)-.55 G .553
+(hen gi)-5.553 F -.15(ve)-.25 G 3.053(nan).15 G .553(umeric ar)-3.053 F
+.552(gument, sa)-.18 F .852 -.15(ve t)-.2 H .552(he deleted te).15 F
+.552(xt on)-.15 F(the kill ring.)144 496.8 Q F2 -.25(fo)108 508.8 S
+(rward\255backward\255delete\255char).25 E F0 .473
+(Delete the character under the cursor)144 520.8 R 2.973(,u)-.4 G .474
+(nless the cursor is at the end of the line, in which case the)-2.973 F
+(character behind the cursor is deleted.)144 532.8 Q F2
+(quoted\255insert \(C\255q, C\255v\))108 544.8 Q F0 .779(Add the ne)144
+556.8 R .779(xt character typed to the line v)-.15 F 3.279
+(erbatim. This)-.15 F .779(is ho)3.279 F 3.279(wt)-.25 G 3.279(oi)-3.279
+G .779(nsert characters lik)-3.279 F(e)-.1 E F2(C\255q)3.278 E F0 3.278
+(,f)C(or)-3.278 E -.15(ex)144 568.8 S(ample.).15 E F2
+(tab\255insert \(C\255v T)108 580.8 Q(AB\))-.9 E F0
+(Insert a tab character)144 592.8 Q(.)-.55 E F2
+(self\255insert \(a, b, A, 1, !, ...\))108 604.8 Q F0
+(Insert the character typed.)144 616.8 Q F2
+(transpose\255chars \(C\255t\))108 628.8 Q F0 .321
+(Drag the character before point forw)144 640.8 R .321(ard o)-.1 F -.15
+(ve)-.15 G 2.821(rt).15 G .321(he character at point, mo)-2.821 F .322
+(ving point forw)-.15 F .322(ard as well.)-.1 F 1.182
+(If point is at the end of the line, then this transposes the tw)144
+652.8 R 3.682(oc)-.1 G 1.182(haracters before point.)-3.682 F(Ne)6.182 E
+-.05(ga)-.15 G(ti).05 E -.15(ve)-.25 G(ar)144 664.8 Q(guments ha)-.18 E
+.3 -.15(ve n)-.2 H 2.5(oe).15 G -.25(ff)-2.5 G(ect.).25 E F2
+(transpose\255w)108 676.8 Q(ords \(M\255t\))-.1 E F0 .023(Drag the w)144
+688.8 R .023(ord before point past the w)-.1 F .023(ord after point, mo)
+-.1 F .023(ving point o)-.15 F -.15(ve)-.15 G 2.524(rt).15 G .024(hat w)
+-2.524 F .024(ord as well.)-.1 F .024(If point)5.024 F
+(is at the end of the line, this transposes the last tw)144 700.8 Q 2.5
+(ow)-.1 G(ords on the line.)-2.6 E(GNU Bash-3.0)72 768 Q(2003 No)147.975
+E 2.5(v1)-.15 G 197.965(33)-2.5 G(6)-197.965 E 0 Cg EP
+%%Page: 37 37
+%%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(upcase\255w)108 84 Q(ord \(M\255u\))-.1 E
+F0 1.699(Uppercase the current \(or follo)144 96 R 1.698(wing\) w)-.25 F
+4.198(ord. W)-.1 F 1.698(ith a ne)-.4 F -.05(ga)-.15 G(ti).05 E 1.998
+-.15(ve a)-.25 H -.18(rg).15 G 1.698(ument, uppercase the pre).18 F
+(vious)-.25 E -.1(wo)144 108 S(rd, b).1 E(ut do not mo)-.2 E .3 -.15
+(ve p)-.15 H(oint.).15 E F1(do)108 120 Q(wncase\255w)-.1 E
+(ord \(M\255l\))-.1 E F0(Lo)144 132 Q 1.647
+(wercase the current \(or follo)-.25 F 1.647(wing\) w)-.25 F 4.147
+(ord. W)-.1 F 1.648(ith a ne)-.4 F -.05(ga)-.15 G(ti).05 E 1.948 -.15
+(ve a)-.25 H -.18(rg).15 G 1.648(ument, lo).18 F 1.648(wercase the pre)
+-.25 F(vious)-.25 E -.1(wo)144 144 S(rd, b).1 E(ut do not mo)-.2 E .3
+-.15(ve p)-.15 H(oint.).15 E F1(capitalize\255w)108 156 Q
+(ord \(M\255c\))-.1 E F0 1.975(Capitalize the current \(or follo)144 168
+R 1.974(wing\) w)-.25 F 4.474(ord. W)-.1 F 1.974(ith a ne)-.4 F -.05(ga)
+-.15 G(ti).05 E 2.274 -.15(ve a)-.25 H -.18(rg).15 G 1.974
+(ument, capitalize the pre).18 F(vious)-.25 E -.1(wo)144 180 S(rd, b).1
+E(ut do not mo)-.2 E .3 -.15(ve p)-.15 H(oint.).15 E F1 -.1(ove)108 192
+S(rwrite\255mode).1 E F0 -.8(To)144 204 S .437(ggle o).8 F -.15(ve)-.15
+G .437(rwrite mode.).15 F -.4(Wi)5.437 G .437(th an e).4 F .437
+(xplicit positi)-.15 F .738 -.15(ve n)-.25 H .438(umeric ar).15 F .438
+(gument, switches to o)-.18 F -.15(ve)-.15 G .438(rwrite mode.).15 F -.4
+(Wi)144 216 S .781(th an e).4 F .781(xplicit non-positi)-.15 F 1.081
+-.15(ve n)-.25 H .781(umeric ar).15 F .781
+(gument, switches to insert mode.)-.18 F .78(This command af)5.781 F
+(fects)-.25 E(only)144 228 Q F1(emacs)4.394 E F0(mode;)4.394 E F1(vi)
+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/F2 10
+/Times-Italic@0 SF -.37(re)4.395 G(adline\(\)).37 E F0 1.895
+(starts in insert)4.395 F 3.969(mode. In)144 240 R -.15(ove)3.969 G
+1.469(rwrite mode, characters bound to).15 F F1(self\255insert)3.969 E
+F0 1.468(replace the te)3.969 F 1.468(xt at point rather than)-.15 F
+.957(pushing the te)144 252 R .957(xt to the right.)-.15 F .958
+(Characters bound to)5.957 F F1(backward\255delete\255char)3.458 E F0
+.958(replace the character)3.458 F(before point with a space.)144 264 Q
+(By def)5 E(ault, this command is unbound.)-.1 E F1(Killing and Y)87
+280.8 Q(anking)-.85 E(kill\255line \(C\255k\))108 292.8 Q F0
+(Kill the te)144 304.8 Q(xt from point to the end of the line.)-.15 E F1
+(backward\255kill\255line \(C\255x Rubout\))108 316.8 Q F0(Kill backw)
+144 328.8 Q(ard to the be)-.1 E(ginning of the line.)-.15 E F1
+(unix\255line\255discard \(C\255u\))108 340.8 Q F0(Kill backw)144 352.8
+Q(ard from point to the be)-.1 E(ginning of the line.)-.15 E
+(The killed te)5 E(xt is sa)-.15 E -.15(ve)-.2 G 2.5(do).15 G 2.5(nt)
+-2.5 G(he kill-ring.)-2.5 E F1(kill\255whole\255line)108 364.8 Q F0
+(Kill all characters on the current line, no matter where point is.)144
+376.8 Q F1(kill\255w)108 388.8 Q(ord \(M\255d\))-.1 E F0 .729
+(Kill from point to the end of the current w)144 400.8 R .728
+(ord, or if between w)-.1 F .728(ords, to the end of the ne)-.1 F .728
+(xt w)-.15 F(ord.)-.1 E -.8(Wo)144 412.8 S
+(rd boundaries are the same as those used by).8 E F1 -.25(fo)2.5 G
+(rward\255w).25 E(ord)-.1 E F0(.)A F1(backward\255kill\255w)108 424.8 Q
+(ord \(M\255Rubout\))-.1 E F0(Kill the w)144 436.8 Q(ord behind point.)
+-.1 E -.8(Wo)5 G(rd boundaries are the same as those used by).8 E F1
+(backward\255w)2.5 E(ord)-.1 E F0(.)A F1(unix\255w)108 448.8 Q
+(ord\255rubout \(C\255w\))-.1 E F0 .364(Kill the w)144 460.8 R .364
+(ord behind point, using white space as a w)-.1 F .365(ord boundary)-.1
+F 5.365(.T)-.65 G .365(he killed te)-5.365 F .365(xt is sa)-.15 F -.15
+(ve)-.2 G 2.865(do).15 G 2.865(nt)-2.865 G(he)-2.865 E(kill-ring.)144
+472.8 Q F1(delete\255horizontal\255space \(M\255\\\))108 484.8 Q F0
+(Delete all spaces and tabs around point.)144 496.8 Q F1(kill\255r)108
+508.8 Q(egion)-.18 E F0(Kill the te)144 520.8 Q(xt in the current re)
+-.15 E(gion.)-.15 E F1(copy\255r)108 532.8 Q(egion\255as\255kill)-.18 E
+F0(Cop)144 544.8 Q 2.5(yt)-.1 G(he te)-2.5 E(xt in the re)-.15 E
+(gion to the kill b)-.15 E(uf)-.2 E(fer)-.25 E(.)-.55 E F1
+(copy\255backward\255w)108 556.8 Q(ord)-.1 E F0(Cop)144 568.8 Q 4.801
+(yt)-.1 G 2.301(he w)-4.801 F 2.301(ord before point to the kill b)-.1 F
+(uf)-.2 E(fer)-.25 E 7.301(.T)-.55 G 2.301(he w)-7.301 F 2.3
+(ord boundaries are the same as)-.1 F F1(back-)4.8 E(ward\255w)144 580.8
+Q(ord)-.1 E F0(.)A F1(copy\255f)108 592.8 Q(orward\255w)-.25 E(ord)-.1 E
+F0(Cop)144 604.8 Q 4.507(yt)-.1 G 2.007(he w)-4.507 F 2.007(ord follo)
+-.1 F 2.007(wing point to the kill b)-.25 F(uf)-.2 E(fer)-.25 E 7.008
+(.T)-.55 G 2.008(he w)-7.008 F 2.008(ord boundaries are the same as)-.1
+F F1 -.25(fo)4.508 G -.37(r-).25 G(ward\255w)144 616.8 Q(ord)-.1 E F0(.)
+A F1(yank \(C\255y\))108 628.8 Q F0 -1(Ya)144 640.8 S
+(nk the top of the kill ring into the b)1 E(uf)-.2 E(fer at point.)-.25
+E F1(yank\255pop \(M\255y\))108 652.8 Q F0
+(Rotate the kill ring, and yank the ne)144 664.8 Q 2.5(wt)-.25 G 2.5
+(op. Only)-2.5 F -.1(wo)2.5 G(rks follo).1 E(wing)-.25 E F1(yank)2.5 E
+F0(or)2.5 E F1(yank\255pop)2.5 E F0(.)A F1(Numeric Ar)87 681.6 Q
+(guments)-.1 E(digit\255ar)108 693.6 Q
+(gument \(M\2550, M\2551, ..., M\255\255\))-.1 E F0 .642
+(Add this digit to the ar)144 705.6 R .641
+(gument already accumulating, or start a ne)-.18 F 3.141(wa)-.25 G -.18
+(rg)-3.141 G 3.141(ument. M\255\255).18 F .641(starts a ne)3.141 F(g-)
+-.15 E(ati)144 717.6 Q .3 -.15(ve a)-.25 H -.18(rg).15 G(ument.).18 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(33)-2.5 G
+(7)-197.965 E 0 Cg EP
+%%Page: 38 38
+%%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(uni)108 84 Q -.1(ve)-.1 G(rsal\255ar).1 E
+(gument)-.1 E F0 .778(This is another w)144 96 R .779
+(ay to specify an ar)-.1 F 3.279(gument. If)-.18 F .779
+(this command is follo)3.279 F .779(wed by one or more digits,)-.25 F
+1.376
+(optionally with a leading minus sign, those digits de\214ne the ar)144
+108 R 3.876(gument. If)-.18 F 1.376(the command is fol-)3.876 F(lo)144
+120 Q 1.17(wed by digits, e)-.25 F -.15(xe)-.15 G(cuting).15 E F1(uni)
+3.67 E -.1(ve)-.1 G(rsal\255ar).1 E(gument)-.1 E F0(ag)3.67 E 1.17
+(ain ends the numeric ar)-.05 F 1.17(gument, b)-.18 F 1.17(ut is other)
+-.2 F(-)-.2 E .899(wise ignored.)144 132 R .898
+(As a special case, if this command is immediately follo)5.899 F .898
+(wed by a character that is)-.25 F .243
+(neither a digit or minus sign, the ar)144 144 R .243
+(gument count for the ne)-.18 F .243(xt command is multiplied by four)
+-.15 F 5.243(.T)-.55 G(he)-5.243 E(ar)144 156 Q .378
+(gument count is initially one, so e)-.18 F -.15(xe)-.15 G .378
+(cuting this function the \214rst time mak).15 F .378(es the ar)-.1 F
+.378(gument count)-.18 F(four)144 168 Q 2.5(,as)-.4 G(econd time mak)
+-2.5 E(es the ar)-.1 E(gument count sixteen, and so on.)-.18 E F1
+(Completing)87 184.8 Q(complete \(T)108 196.8 Q(AB\))-.9 E F0 1.137
+(Attempt to perform completion on the te)144 208.8 R 1.137
+(xt before point.)-.15 F F1(Bash)6.137 E F0 1.137
+(attempts completion treating the)3.637 F(te)144 220.8 Q .533(xt as a v)
+-.15 F .533(ariable \(if the te)-.25 F .533(xt be)-.15 F .533(gins with)
+-.15 F F1($)3.033 E F0 .533(\), username \(if the te)B .532(xt be)-.15 F
+.532(gins with)-.15 F F1(~)3.032 E F0 .532(\), hostname \(if the)B(te)
+144 232.8 Q .701(xt be)-.15 F .701(gins with)-.15 F F1(@)3.201 E F0 .701
+(\), or command \(including aliases and functions\) in turn.)B .702
+(If none of these pro-)5.701 F
+(duces a match, \214lename completion is attempted.)144 244.8 Q F1
+(possible\255completions \(M\255?\))108 256.8 Q F0
+(List the possible completions of the te)144 268.8 Q(xt before point.)
+-.15 E F1(insert\255completions \(M\255*\))108 280.8 Q F0 .783
+(Insert all completions of the te)144 292.8 R .783
+(xt before point that w)-.15 F .783(ould ha)-.1 F 1.083 -.15(ve b)-.2 H
+.783(een generated by).15 F F1(possible\255com-)3.282 E(pletions)144
+304.8 Q F0(.)A F1(menu\255complete)108 316.8 Q F0 .928(Similar to)144
+328.8 R F1(complete)3.428 E F0 3.428(,b)C .929(ut replaces the w)-3.628
+F .929(ord to be completed with a single match from the list of)-.1 F
+1.194(possible completions.)144 340.8 R 1.194(Repeated e)6.194 F -.15
+(xe)-.15 G 1.194(cution of).15 F F1(menu\255complete)3.694 E F0 1.193
+(steps through the list of possible)3.694 F .828
+(completions, inserting each match in turn.)144 352.8 R .828
+(At the end of the list of completions, the bell is rung)5.828 F .727
+(\(subject to the setting of)144 364.8 R F1(bell\255style)3.227 E F0
+3.227(\)a)C .727(nd the original te)-3.227 F .727(xt is restored.)-.15 F
+.727(An ar)5.727 F .727(gument of)-.18 F/F2 10/Times-Italic@0 SF(n)3.227
+E F0(mo)3.227 E -.15(ve)-.15 G(s).15 E F2(n)3.227 E F0 1.73
+(positions forw)144 376.8 R 1.73(ard in the list of matches; a ne)-.1 F
+-.05(ga)-.15 G(ti).05 E 2.03 -.15(ve a)-.25 H -.18(rg).15 G 1.73
+(ument may be used to mo).18 F 2.03 -.15(ve b)-.15 H(ackw).15 E(ard)-.1
+E(through the list.)144 388.8 Q(This command is intended to be bound to)
+5 E F1 -.9(TA)2.5 G(B).9 E F0 2.5(,b)C(ut is unbound by def)-2.7 E
+(ault.)-.1 E F1(delete\255char\255or\255list)108 400.8 Q F0 .234
+(Deletes the character under the cursor if not at the be)144 412.8 R
+.234(ginning or end of the line \(lik)-.15 F(e)-.1 E F1(delete\255char)
+2.734 E F0(\).)A .425(If at the end of the line, beha)144 424.8 R -.15
+(ve)-.2 G 2.925(si).15 G .425(dentically to)-2.925 F F1
+(possible\255completions)2.925 E F0 5.425(.T)C .425
+(his command is unbound)-5.425 F(by def)144 436.8 Q(ault.)-.1 E F1
+(complete\255\214lename \(M\255/\))108 448.8 Q F0
+(Attempt \214lename completion on the te)144 460.8 Q(xt before point.)
+-.15 E F1(possible\255\214lename\255completions \(C\255x /\))108 472.8 Q
+F0(List the possible completions of the te)144 484.8 Q
+(xt before point, treating it as a \214lename.)-.15 E F1
+(complete\255user)108 496.8 Q(name \(M\255~\))-.15 E F0
+(Attempt completion on the te)144 508.8 Q
+(xt before point, treating it as a username.)-.15 E F1(possible\255user)
+108 520.8 Q(name\255completions \(C\255x ~\))-.15 E F0
+(List the possible completions of the te)144 532.8 Q
+(xt before point, treating it as a username.)-.15 E F1(complete\255v)108
+544.8 Q(ariable \(M\255$\))-.1 E F0(Attempt completion on the te)144
+556.8 Q(xt before point, treating it as a shell v)-.15 E(ariable.)-.25 E
+F1(possible\255v)108 568.8 Q(ariable\255completions \(C\255x $\))-.1 E
+F0(List the possible completions of the te)144 580.8 Q
+(xt before point, treating it as a shell v)-.15 E(ariable.)-.25 E F1
+(complete\255hostname \(M\255@\))108 592.8 Q F0
+(Attempt completion on the te)144 604.8 Q
+(xt before point, treating it as a hostname.)-.15 E F1
+(possible\255hostname\255completions \(C\255x @\))108 616.8 Q F0
+(List the possible completions of the te)144 628.8 Q
+(xt before point, treating it as a hostname.)-.15 E F1
+(complete\255command \(M\255!\))108 640.8 Q F0 .581
+(Attempt completion on the te)144 652.8 R .581
+(xt before point, treating it as a command name.)-.15 F .58
+(Command comple-)5.58 F .715(tion attempts to match the te)144 664.8 R
+.715(xt ag)-.15 F .715(ainst aliases, reserv)-.05 F .715(ed w)-.15 F
+.715(ords, shell functions, shell b)-.1 F .715(uiltins, and)-.2 F
+(\214nally e)144 676.8 Q -.15(xe)-.15 G
+(cutable \214lenames, in that order).15 E(.)-.55 E F1
+(possible\255command\255completions \(C\255x !\))108 688.8 Q F0
+(List the possible completions of the te)144 700.8 Q
+(xt before point, treating it as a command name.)-.15 E(GNU Bash-3.0)72
+768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(33)-2.5 G(8)-197.965 E 0
+Cg EP
+%%Page: 39 39
+%%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(dynamic\255complete\255history \(M\255T)108
+84 Q(AB\))-.9 E F0 .425(Attempt completion on the te)144 96 R .425
+(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 108 Q F1
+(complete\255into\255braces \(M\255{\))108 120 Q F0 .4(Perform \214lena\
+me completion and insert the list of possible completions enclosed with\
+in braces so)144 132 R(the list is a)144 144 Q -.25(va)-.2 G
+(ilable to the shell \(see).25 E F1(Brace Expansion)2.5 E F0(abo)2.5 E
+-.15(ve)-.15 G(\).).15 E F1 -.25(Ke)87 160.8 S(yboard Macr).25 E(os)-.18
+E(start\255kbd\255macr)108 172.8 Q 2.5(o\()-.18 G(C\255x \()-2.5 E(\))
+.833 E F0(Be)144 184.8 Q(gin sa)-.15 E
+(ving the characters typed into the current k)-.2 E -.15(ey)-.1 G
+(board macro.).15 E F1(end\255kbd\255macr)108 196.8 Q 2.5(o\()-.18 G
+(C\255x \))-2.5 E(\)).833 E F0(Stop sa)144 208.8 Q
+(ving the characters typed into the current k)-.2 E -.15(ey)-.1 G
+(board macro and store the de\214nition.).15 E F1
+(call\255last\255kbd\255macr)108 220.8 Q 2.5(o\()-.18 G(C\255x e\))-2.5
+E F0(Re-e)144 232.8 Q -.15(xe)-.15 G 1(cute the last k).15 F -.15(ey)-.1
+G .999(board macro de\214ned, by making the characters in the macro app\
+ear as if).15 F(typed at the k)144 244.8 Q -.15(ey)-.1 G(board.).15 E F1
+(Miscellaneous)87 261.6 Q -.18(re)108 273.6 S<ad72>.18 E
+(ead\255init\255\214le \(C\255x C\255r\))-.18 E F0 1.776
+(Read in the contents of the)144 285.6 R/F2 10/Times-Italic@0 SF(inputr)
+4.276 E(c)-.37 E F0 1.777(\214le, and incorporate an)4.276 F 4.277(yb)
+-.15 G 1.777(indings or v)-4.277 F 1.777(ariable assignments)-.25 F
+(found there.)144 297.6 Q F1(abort \(C\255g\))108 309.6 Q F0 3.249
+(Abort the current editing command and ring the terminal')144 321.6 R
+5.748(sb)-.55 G 3.248(ell \(subject to the setting of)-5.748 F F1
+(bell\255style)144 333.6 Q F0(\).)A F1(do\255upper)108 345.6 Q
+(case\255v)-.18 E(ersion \(M\255a, M\255b, M\255)-.1 E F2(x)A F1 2.5(,.)
+C(..\))-2.5 E F0 1.755(If the meta\214ed character)144 357.6 R F2(x)
+4.255 E F0 1.755(is lo)4.255 F 1.756
+(wercase, run the command that is bound to the corresponding)-.25 F
+(uppercase character)144 369.6 Q(.)-.55 E F1(pr)108 381.6 Q
+(e\214x\255meta \(ESC\))-.18 E F0(Metafy the ne)144 393.6 Q
+(xt character typed.)-.15 E/F3 9/Times-Bold@0 SF(ESC)5 E F1(f)2.25 E F0
+(is equi)2.5 E -.25(va)-.25 G(lent to).25 E F1(Meta\255f)2.5 E F0(.)A F1
+(undo \(C\255_, C\255x C\255u\))108 405.6 Q F0
+(Incremental undo, separately remembered for each line.)144 417.6 Q F1
+-2.29 -.18(re v)108 429.6 T(ert\255line \(M\255r\)).08 E F0 1.095
+(Undo all changes made to this line.)144 441.6 R 1.095(This is lik)6.095
+F 3.595(ee)-.1 G -.15(xe)-3.745 G 1.095(cuting the).15 F F1(undo)3.595 E
+F0 1.095(command enough times to)3.595 F
+(return the line to its initial state.)144 453.6 Q F1
+(tilde\255expand \(M\255&\))108 465.6 Q F0(Perform tilde e)144 477.6 Q
+(xpansion on the current w)-.15 E(ord.)-.1 E F1
+(set\255mark \(C\255@, M\255<space>\))108 489.6 Q F0
+(Set the mark to the point.)144 501.6 Q(If a numeric ar)5 E
+(gument is supplied, the mark is set to that position.)-.18 E F1
+(exchange\255point\255and\255mark \(C\255x C\255x\))108 513.6 Q F0(Sw)
+144 525.6 Q .282(ap the point with the mark.)-.1 F .283
+(The current cursor position is set to the sa)5.283 F -.15(ve)-.2 G
+2.783(dp).15 G .283(osition, and the old)-2.783 F(cursor position is sa)
+144 537.6 Q -.15(ve)-.2 G 2.5(da).15 G 2.5(st)-2.5 G(he mark.)-2.5 E F1
+(character\255sear)108 549.6 Q(ch \(C\255]\))-.18 E F0 3.036(Ac)144
+561.6 S .536(haracter is read and point is mo)-3.036 F -.15(ve)-.15 G
+3.035(dt).15 G 3.035(ot)-3.035 G .535(he ne)-3.035 F .535
+(xt occurrence of that character)-.15 F 5.535(.A)-.55 G(ne)-2.5 E -.05
+(ga)-.15 G(ti).05 E .835 -.15(ve c)-.25 H(ount).15 E(searches for pre)
+144 573.6 Q(vious occurrences.)-.25 E F1(character\255sear)108 585.6 Q
+(ch\255backward \(M\255C\255]\))-.18 E F0 3.543(Ac)144 597.6 S 1.043
+(haracter is read and point is mo)-3.543 F -.15(ve)-.15 G 3.544(dt).15 G
+3.544(ot)-3.544 G 1.044(he pre)-3.544 F 1.044
+(vious occurrence of that character)-.25 F 6.044(.A)-.55 G(ne)-2.5 E
+-.05(ga)-.15 G(ti).05 E -.15(ve)-.25 G
+(count searches for subsequent occurrences.)144 609.6 Q F1
+(insert\255comment \(M\255#\))108 621.6 Q F0 -.4(Wi)144 633.6 S .481
+(thout a numeric ar).4 F .481(gument, the v)-.18 F .481
+(alue of the readline)-.25 F F1(comment\255begin)2.981 E F0 -.25(va)
+2.981 G .48(riable is inserted at the).25 F(be)144 645.6 Q .097
+(ginning of the current line.)-.15 F .098(If a numeric ar)5.097 F .098
+(gument is supplied, this command acts as a toggle:)-.18 F(if)5.098 E
+.322(the characters at the be)144 657.6 R .321
+(ginning of the line do not match the v)-.15 F .321(alue of)-.25 F F1
+(comment\255begin)2.821 E F0 2.821(,t)C .321(he v)-2.821 F .321(alue is)
+-.25 F 1.013(inserted, otherwise the characters in)144 669.6 R F1
+(comment-begin)3.514 E F0 1.014(are deleted from the be)3.514 F 1.014
+(ginning of the line.)-.15 F 1.469
+(In either case, the line is accepted as if a ne)144 681.6 R 1.468
+(wline had been typed.)-.25 F 1.468(The def)6.468 F 1.468(ault v)-.1 F
+1.468(alue of)-.25 F F1(com-)3.968 E(ment\255begin)144 693.6 Q F0 .839
+(causes this command to mak)3.339 F 3.339(et)-.1 G .839
+(he current line a shell comment.)-3.339 F .84(If a numeric ar)5.84 F
+(gu-)-.18 E(ment causes the comment character to be remo)144 705.6 Q
+-.15(ve)-.15 G(d, the line will be e).15 E -.15(xe)-.15 G
+(cuted by the shell.).15 E(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5
+(v1)-.15 G 197.965(33)-2.5 G(9)-197.965 E 0 Cg EP
+%%Page: 40 40
+%%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(glob\255complete\255w)108 84 Q
+(ord \(M\255g\))-.1 E F0 .792(The w)144 96 R .791
+(ord before point is treated as a pattern for pathname e)-.1 F .791
+(xpansion, with an asterisk implicitly)-.15 F 2.5(appended. This)144 108
+R(pattern is used to generate a list of matching \214le names for possi\
+ble completions.)2.5 E F1(glob\255expand\255w)108 120 Q
+(ord \(C\255x *\))-.1 E F0 .371(The w)144 132 R .372
+(ord before point is treated as a pattern for pathname e)-.1 F .372
+(xpansion, and the list of matching \214le)-.15 F .516
+(names is inserted, replacing the w)144 144 R 3.016(ord. If)-.1 F 3.016
+(an)3.016 G .516(umeric ar)-3.016 F .516
+(gument is supplied, an asterisk is appended)-.18 F(before pathname e)
+144 156 Q(xpansion.)-.15 E F1(glob\255list\255expansions \(C\255x g\))
+108 168 Q F0 .923(The list of e)144 180 R .923(xpansions that w)-.15 F
+.923(ould ha)-.1 F 1.223 -.15(ve b)-.2 H .923(een generated by).15 F F1
+(glob\255expand\255w)3.423 E(ord)-.1 E F0 .923(is displayed, and)3.423 F
+.872(the line is redra)144 192 R 3.372(wn. If)-.15 F 3.372(an)3.372 G
+.872(umeric ar)-3.372 F .872
+(gument is supplied, an asterisk is appended before pathname)-.18 F -.15
+(ex)144 204 S(pansion.).15 E F1(dump\255functions)108 216 Q F0 .626
+(Print all of the functions and their k)144 228 R .926 -.15(ey b)-.1 H
+.627(indings to the readline output stream.).15 F .627(If a numeric ar)
+5.627 F(gu-)-.18 E
+(ment is supplied, the output is formatted in such a w)144 240 Q
+(ay that it can be made part of an)-.1 E/F2 10/Times-Italic@0 SF(inputr)
+2.5 E(c)-.37 E F0(\214le.)2.5 E F1(dump\255v)108 252 Q(ariables)-.1 E F0
+1.8(Print all of the settable readline v)144 264 R 1.799
+(ariables and their v)-.25 F 1.799(alues to the readline output stream.)
+-.25 F 1.799(If a)6.799 F .304(numeric ar)144 276 R .304
+(gument is supplied, the output is formatted in such a w)-.18 F .304
+(ay that it can be made part of an)-.1 F F2(inputr)144 288 Q(c)-.37 E F0
+(\214le.)2.5 E F1(dump\255macr)108 300 Q(os)-.18 E F0 .756
+(Print all of the readline k)144 312 R 1.056 -.15(ey s)-.1 H .756
+(equences bound to macros and the strings the).15 F 3.256(yo)-.15 G
+3.256(uput. If)-3.256 F 3.255(an)3.255 G(umeric)-3.255 E(ar)144 324 Q
+.528(gument is supplied, the output is formatted in such a w)-.18 F .528
+(ay that it can be made part of an)-.1 F F2(inputr)3.028 E(c)-.37 E F0
+(\214le.)144 336 Q F1(display\255shell\255v)108 348 Q
+(ersion \(C\255x C\255v\))-.1 E F0(Display v)144 360 Q
+(ersion information about the current instance of)-.15 E F1(bash)2.5 E
+F0(.)A F1(Pr)87 376.8 Q(ogrammable Completion)-.18 E F0 .147(When w)108
+388.8 R .147(ord completion is attempted for an ar)-.1 F .147
+(gument to a command for which a completion speci\214cation \(a)-.18 F
+F2(compspec)108 400.8 Q F0 3.828(\)h)C 1.329
+(as been de\214ned using the)-3.828 F F1(complete)3.829 E F0 -.2(bu)
+3.829 G 1.329(iltin \(see).2 F/F3 9/Times-Bold@0 SF 1.329(SHELL B)3.829
+F(UIL)-.09 E 1.329(TIN COMMANDS)-.828 F F0(belo)3.579 E 1.329(w\), the)
+-.25 F(programmable completion f)108 412.8 Q(acilities are in)-.1 E -.2
+(vo)-.4 G -.1(ke).2 G(d.).1 E .334
+(First, the command name is identi\214ed.)108 429.6 R .333
+(If a compspec has been de\214ned for that command, the compspec is)
+5.334 F .587
+(used to generate the list of possible completions for the w)108 441.6 R
+3.087(ord. If)-.1 F .587(the command w)3.087 F .587
+(ord is a full pathname, a)-.1 F 1.181
+(compspec for the full pathname is searched for \214rst.)108 453.6 R
+1.18(If no compspec is found for the full pathname, an)6.181 F
+(attempt is made to \214nd a compspec for the portion follo)108 465.6 Q
+(wing the \214nal slash.)-.25 E .817(Once a compspec has been found, it\
+ is used to generate the list of matching w)108 482.4 R 3.317(ords. If)
+-.1 F 3.317(ac)3.317 G .817(ompspec is not)-3.317 F(found, the def)108
+494.4 Q(ault)-.1 E F1(bash)2.5 E F0(completion as described abo)2.5 E .3
+-.15(ve u)-.15 H(nder).15 E F1(Completing)2.5 E F0(is performed.)2.5 E
+.464(First, the actions speci\214ed by the compspec are used.)108 511.2
+R .463(Only matches which are pre\214x)5.464 F .463(ed by the w)-.15 F
+.463(ord being)-.1 F .595(completed are returned.)108 523.2 R .595
+(When the)5.595 F F1<ad66>3.095 E F0(or)3.095 E F1<ad64>3.095 E F0 .596
+(option is used for \214lename or directory name completion, the)3.095 F
+(shell v)108 535.2 Q(ariable)-.25 E F3(FIGNORE)2.5 E F0
+(is used to \214lter the matches.)2.25 E(An)108 552 Q 2.585(yc)-.15 G
+.085(ompletions speci\214ed by a \214lename e)-2.585 F .085
+(xpansion pattern to the)-.15 F F1<ad47>2.585 E F0 .085
+(option are generated ne)2.585 F 2.585(xt. The)-.15 F -.1(wo)2.585 G
+(rds).1 E .843(generated by the pattern need not match the w)108 564 R
+.844(ord being completed.)-.1 F(The)5.844 E F3(GLOBIGNORE)3.344 E F0
+.844(shell v)3.094 F .844(ariable is)-.25 F
+(not used to \214lter the matches, b)108 576 Q(ut the)-.2 E F3(FIGNORE)
+2.5 E F0 -.25(va)2.25 G(riable is used.).25 E(Ne)108 592.8 Q .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 .412(characters in the)108
+604.8 R F3(IFS)2.912 E F0 .412(special v)2.662 F .412
+(ariable as delimiters.)-.25 F .412(Shell quoting is honored.)5.412 F
+.413(Each w)5.412 F .413(ord is then e)-.1 F(xpanded)-.15 E 1.64
+(using brace e)108 616.8 R 1.64(xpansion, tilde e)-.15 F 1.64
+(xpansion, parameter and v)-.15 F 1.64(ariable e)-.25 F 1.64
+(xpansion, command substitution, arith-)-.15 F 1.344(metic e)108 628.8 R
+1.344(xpansion, and pathname e)-.15 F 1.344(xpansion, as described abo)
+-.15 F 1.644 -.15(ve u)-.15 H(nder).15 E F3(EXP)3.844 E(ANSION)-.666 E
+/F4 9/Times-Roman@0 SF(.)A F0 1.345(The results are split)5.844 F 1.265
+(using the rules described abo)108 640.8 R 1.565 -.15(ve u)-.15 H(nder)
+.15 E F1 -.75(Wo)3.765 G 1.265(rd Splitting).75 F F0 6.265(.T)C 1.265
+(he results of the e)-6.265 F 1.265(xpansion are pre\214x-matched)-.15 F
+(ag)108 652.8 Q(ainst the w)-.05 E
+(ord being completed, and the matching w)-.1 E
+(ords become the possible completions.)-.1 E 1.237
+(After these matches ha)108 669.6 R 1.537 -.15(ve b)-.2 H 1.237
+(een generated, an).15 F 3.737(ys)-.15 G 1.238
+(hell function or command speci\214ed with the)-3.737 F F1<ad46>3.738 E
+F0(and)3.738 E F1<ad43>3.738 E F0 .513(options is in)108 681.6 R -.2(vo)
+-.4 G -.1(ke).2 G 3.013(d. When).1 F .513(the command or function is in)
+3.013 F -.2(vo)-.4 G -.1(ke).2 G .513(d, the).1 F F3(COMP_LINE)3.013 E
+F0(and)2.763 E F3(COMP_POINT)3.013 E F0 -.25(va)2.763 G(ri-).25 E .872
+(ables are assigned v)108 693.6 R .872(alues as described abo)-.25 F
+1.172 -.15(ve u)-.15 H(nder).15 E F1 .873(Shell V)3.372 F(ariables)-.92
+E F0 5.873(.I)C 3.373(fas)-5.873 G .873(hell function is being in)-3.373
+F -.2(vo)-.4 G -.1(ke).2 G(d,).1 E(the)108 705.6 Q F3(COMP_W)5.261 E
+(ORDS)-.09 E F0(and)5.011 E F3(COMP_CW)5.26 E(ORD)-.09 E F0 -.25(va)5.01
+G 2.76(riables are also set.).25 F 2.76(When the function or command is)
+7.76 F(in)108 717.6 Q -.2(vo)-.4 G -.1(ke).2 G .403(d, the \214rst ar).1
+F .404(gument is the name of the command whose ar)-.18 F .404
+(guments are being completed, the second)-.18 F(ar)108 729.6 Q 1.994
+(gument is the w)-.18 F 1.993(ord being completed, and the third ar)-.1
+F 1.993(gument is the w)-.18 F 1.993(ord preceding the w)-.1 F 1.993
+(ord being)-.1 F(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G
+197.965(34)-2.5 G(0)-197.965 E 0 Cg EP
+%%Page: 41 41
+%%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 .499(completed on the current command line.)108 84 R .499
+(No \214ltering of the generated completions ag)5.499 F .5(ainst the w)
+-.05 F .5(ord being)-.1 F(completed is performed; the function or comma\
+nd has complete freedom in generating the matches.)108 96 Q(An)108 112.8
+Q 2.938(yf)-.15 G .437(unction speci\214ed with)-2.938 F/F1 10
+/Times-Bold@0 SF<ad46>2.937 E F0 .437(is in)2.937 F -.2(vo)-.4 G -.1(ke)
+.2 G 2.937<648c>.1 G 2.937(rst. The)-2.937 F .437(function may use an)
+2.937 F 2.937(yo)-.15 G 2.937(ft)-2.937 G .437(he shell f)-2.937 F .437
+(acilities, including)-.1 F(the)108 124.8 Q F1(compgen)2.956 E F0 -.2
+(bu)2.956 G .456(iltin described belo).2 F 1.756 -.65(w, t)-.25 H 2.956
+(og).65 G .456(enerate the matches.)-2.956 F .457
+(It must put the possible completions in the)5.456 F/F2 9/Times-Bold@0
+SF(COMPREPL)108 136.8 Q(Y)-.828 E F0(array v)2.25 E(ariable.)-.25 E(Ne)
+108 153.6 Q .081(xt, an)-.15 F 2.581(yc)-.15 G .081
+(ommand speci\214ed with the)-2.581 F F1<ad43>2.581 E F0 .081
+(option is in)2.581 F -.2(vo)-.4 G -.1(ke).2 G 2.581(di).1 G 2.58(na)
+-2.581 G 2.58(ne)-2.58 G -.4(nv)-2.58 G .08(ironment equi).4 F -.25(va)
+-.25 G .08(lent to command sub-).25 F 2.858(stitution. It)108 165.6 R
+.359(should print a list of completions, one per line, to the standard \
+output.)2.858 F .359(Backslash may be used)5.359 F(to escape a ne)108
+177.6 Q(wline, if necessary)-.25 E(.)-.65 E .377
+(After all of the possible completions are generated, an)108 194.4 R
+2.877<798c>-.15 G .377(lter speci\214ed with the)-2.877 F F1<ad58>2.876
+E F0 .376(option is applied to the)2.876 F 3.181(list. The)108 206.4 R
+.681(\214lter is a pattern as used for pathname e)3.181 F .681
+(xpansion; a)-.15 F F1(&)3.181 E F0 .682
+(in the pattern is replaced with the te)3.182 F .682(xt of)-.15 F .523
+(the w)108 218.4 R .523(ord being completed.)-.1 F 3.023(Al)5.523 G
+(iteral)-3.023 E F1(&)3.023 E F0 .522
+(may be escaped with a backslash; the backslash is remo)3.022 F -.15(ve)
+-.15 G 3.022(db).15 G(efore)-3.022 E .849(attempting a match.)108 230.4
+R(An)5.849 E 3.349(yc)-.15 G .849
+(ompletion that matches the pattern will be remo)-3.349 F -.15(ve)-.15 G
+3.35(df).15 G .85(rom the list.)-3.35 F 3.35(Al)5.85 G(eading)-3.35 E F1
+(!)3.35 E F0(ne)108 242.4 Q -.05(ga)-.15 G
+(tes the pattern; in this case an).05 E 2.5(yc)-.15 G
+(ompletion not matching the pattern will be remo)-2.5 E -.15(ve)-.15 G
+(d.).15 E(Finally)108 259.2 Q 3.087(,a)-.65 G .887 -.15(ny p)-3.087 H
+.587(re\214x and suf).15 F .587(\214x speci\214ed with the)-.25 F F1
+<ad50>3.087 E F0(and)3.087 E F1<ad53>3.087 E F0 .587
+(options are added to each member of the com-)3.087 F(pletion list, and\
+ the result is returned to the readline completion code as the list of \
+possible completions.)108 271.2 Q .246(If the pre)108 288 R .247
+(viously-applied actions do not generate an)-.25 F 2.747(ym)-.15 G .247
+(atches, and the)-2.747 F F1 .247(\255o dir)2.747 F(names)-.15 E F0 .247
+(option w)2.747 F .247(as supplied to)-.1 F F1(complete)108 300 Q F0
+(when the compspec w)2.5 E
+(as de\214ned, directory name completion is attempted.)-.1 E .462
+(If the)108 316.8 R F1 .462(\255o plusdirs)2.962 F F0 .462(option w)
+2.962 F .462(as supplied to)-.1 F F1(complete)2.962 E F0 .462
+(when the compspec w)2.962 F .462(as de\214ned, directory name com-)-.1
+F(pletion is attempted and an)108 328.8 Q 2.5(ym)-.15 G
+(atches are added to the results of the other actions.)-2.5 E .559
+(By def)108 345.6 R .559(ault, if a compspec is found, whate)-.1 F -.15
+(ve)-.25 G 3.059(ri).15 G 3.059(tg)-3.059 G .56
+(enerates is returned to the completion code as the full set)-3.059 F
+.632(of possible completions.)108 357.6 R .632(The def)5.632 F(ault)-.1
+E F1(bash)3.132 E F0 .631
+(completions are not attempted, and the readline def)3.131 F .631
+(ault of \214le-)-.1 F .558(name completion is disabled.)108 369.6 R
+.558(If the)5.558 F F1 .559(\255o bashdefault)3.059 F F0 .559(option w)
+3.059 F .559(as supplied to)-.1 F F1(complete)3.059 E F0 .559
+(when the compspec)3.059 F -.1(wa)108 381.6 S 3.172(sd).1 G .672
+(e\214ned, the)-3.172 F F1(bash)3.172 E F0(def)3.172 E .671
+(ault completions are attempted if the compspec generates no matches.)
+-.1 F .671(If the)5.671 F F1<ad6f>3.171 E(default)108 393.6 Q F0 1.207
+(option w)3.706 F 1.207(as supplied to)-.1 F F1(complete)3.707 E F0
+1.207(when the compspec w)3.707 F 1.207(as de\214ned, readline')-.1 F
+3.707(sd)-.55 G(ef)-3.707 E 1.207(ault completion)-.1 F
+(will be performed if the compspec \(and, if attempted, the def)108
+405.6 Q(ault)-.1 E F1(bash)2.5 E F0(completions\) generate no matches.)
+2.5 E .245(When a compspec indicates that directory name completion is \
+desired, the programmable completion func-)108 422.4 R .632(tions force\
+ readline to append a slash to completed names which are symbolic links\
+ to directories, subject)108 434.4 R 2.762(to the v)108 446.4 R 2.762
+(alue of the)-.25 F F1(mark\255dir)5.262 E(ectories)-.18 E F0 2.761
+(readline v)5.262 F 2.761(ariable, re)-.25 F -.05(ga)-.15 G 2.761
+(rdless of the setting of the).05 F F1(mark-sym-)5.261 E(link)108 458.4
+Q(ed\255dir)-.1 E(ectories)-.18 E F0(readline v)2.5 E(ariable.)-.25 E/F3
+10.95/Times-Bold@0 SF(HIST)72 475.2 Q(OR)-.197 E(Y)-.383 E F0 .371
+(When the)108 487.2 R F1 .371(\255o history)2.871 F F0 .371
+(option to the)2.871 F F1(set)2.872 E F0 -.2(bu)2.872 G .372
+(iltin is enabled, the shell pro).2 F .372(vides access to the)-.15 F/F4
+10/Times-Italic@0 SF .372(command history)2.872 F F0(,)A .032
+(the list of commands pre)108 499.2 R .031(viously typed.)-.25 F .031
+(The v)5.031 F .031(alue of the)-.25 F F1(HISTSIZE)2.531 E F0 -.25(va)
+2.531 G .031(riable is used as the number of com-).25 F .429
+(mands to sa)108 511.2 R .729 -.15(ve i)-.2 H 2.929(nah).15 G .429
+(istory list.)-2.929 F .429(The te)5.429 F .429(xt of the last)-.15 F F2
+(HISTSIZE)2.93 E F0 .43(commands \(def)2.68 F .43(ault 500\) is sa)-.1 F
+-.15(ve)-.2 G 2.93(d. The).15 F(shell)2.93 E .287
+(stores each command in the history list prior to parameter and v)108
+523.2 R .287(ariable e)-.25 F .287(xpansion \(see)-.15 F F2(EXP)2.787 E
+(ANSION)-.666 E F0(abo)2.537 E -.15(ve)-.15 G(\)).15 E -.2(bu)108 535.2
+S 4.065(ta).2 G 1.565(fter history e)-4.065 F 1.565
+(xpansion is performed, subject to the v)-.15 F 1.565
+(alues of the shell v)-.25 F(ariables)-.25 E F2(HISTIGNORE)4.065 E F0
+(and)3.816 E F2(HISTCONTR)108 547.2 Q(OL)-.27 E/F5 9/Times-Roman@0 SF(.)
+A F0 .082
+(On startup, the history is initialized from the \214le named by the v)
+108 564 R(ariable)-.25 E F2(HISTFILE)2.582 E F0(\(def)2.332 E(ault)-.1 E
+F4(~/.bash_history)2.582 E F0(\).)A .315(The \214le named by the v)108
+576 R .315(alue of)-.25 F F2(HISTFILE)2.815 E F0 .315
+(is truncated, if necessary)2.565 F 2.815(,t)-.65 G 2.815(oc)-2.815 G
+.315(ontain no more than the number of)-2.815 F .953
+(lines speci\214ed by the v)108 588 R .953(alue of)-.25 F F2
+(HISTFILESIZE)3.453 E F5(.)A F0 .953(When an interacti)5.453 F 1.253
+-.15(ve s)-.25 H .953(hell e).15 F .953(xits, the last)-.15 F F2
+($HISTSIZE)3.452 E F0(lines)3.202 E .649
+(are copied from the history list to)108 600 R F2($HISTFILE)3.15 E F5(.)
+A F0 .65(If the)5.15 F F1(histappend)3.15 E F0 .65
+(shell option is enabled \(see the descrip-)3.15 F .141(tion of)108 612
+R F1(shopt)2.641 E F0(under)2.641 E F2 .141(SHELL B)2.641 F(UIL)-.09 E
+.141(TIN COMMANDS)-.828 F F0(belo)2.391 E .141
+(w\), the lines are appended to the history \214le, other)-.25 F(-)-.2 E
+.572(wise the history \214le is o)108 624 R -.15(ve)-.15 G 3.073
+(rwritten. If).15 F F2(HISTFILE)3.073 E F0 .573
+(is unset, or if the history \214le is unwritable, the history is)2.823
+F 1.142(not sa)108 636 R -.15(ve)-.2 G 3.642(d. After).15 F(sa)3.642 E
+1.142(ving the history)-.2 F 3.642(,t)-.65 G 1.141
+(he history \214le is truncated to contain no more than)-3.642 F F2
+(HISTFILESIZE)3.641 E F0 2.5(lines. If)108 648 R F2(HISTFILESIZE)2.5 E
+F0(is not set, no truncation is performed.)2.25 E 1.293(The b)108 664.8
+R 1.293(uiltin command)-.2 F F1(fc)3.793 E F0(\(see)3.793 E F2 1.293
+(SHELL B)3.793 F(UIL)-.09 E 1.293(TIN COMMANDS)-.828 F F0(belo)3.543 E
+1.294(w\) may be used to list or edit and re-)-.25 F -.15(exe)108 676.8
+S .674(cute a portion of the history list.).15 F(The)5.673 E F1(history)
+3.173 E F0 -.2(bu)3.173 G .673
+(iltin may be used to display or modify the history list).2 F .279
+(and manipulate the history \214le.)108 688.8 R .279
+(When using command-line editing, search commands are a)5.279 F -.25(va)
+-.2 G .28(ilable in each).25 F(editing mode that pro)108 700.8 Q
+(vide access to the history list.)-.15 E 1.486(The shell allo)108 717.6
+R 1.486(ws control o)-.25 F -.15(ve)-.15 G 3.986(rw).15 G 1.486
+(hich commands are sa)-3.986 F -.15(ve)-.2 G 3.986(do).15 G 3.986(nt)
+-3.986 G 1.486(he history list.)-3.986 F(The)6.485 E F2(HISTCONTR)3.985
+E(OL)-.27 E F0(and)3.735 E F2(HISTIGNORE)108 729.6 Q F0 -.25(va)2.707 G
+.457(riables may be set to cause the shell to sa).25 F .758 -.15(ve o)
+-.2 H .458(nly a subset of the commands entered.).15 F(The)5.458 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(34)-2.5 G
+(1)-197.965 E 0 Cg EP
+%%Page: 42 42
+%%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(cmdhist)108 84 Q F0 .75
+(shell option, if enabled, causes the shell to attempt to sa)3.25 F 1.05
+-.15(ve e)-.2 H .75(ach line of a multi-line command in).15 F 1.077
+(the same history entry)108 96 R 3.577(,a)-.65 G 1.077
+(dding semicolons where necessary to preserv)-3.577 F 3.577(es)-.15 G
+1.077(yntactic correctness.)-3.577 F(The)6.077 E F1(lithist)3.577 E F0
+.374(shell option causes the shell to sa)108 108 R .674 -.15(ve t)-.2 H
+.374(he command with embedded ne).15 F .373
+(wlines instead of semicolons.)-.25 F .373(See the)5.373 F .318
+(description of the)108 120 R F1(shopt)2.818 E F0 -.2(bu)2.818 G .318
+(iltin belo).2 F 2.818(wu)-.25 G(nder)-2.818 E/F2 9/Times-Bold@0 SF .318
+(SHELL B)2.818 F(UIL)-.09 E .318(TIN COMMANDS)-.828 F F0 .319
+(for information on setting and)2.568 F(unsetting shell options.)108 132
+Q/F3 10.95/Times-Bold@0 SF(HIST)72 148.8 Q(OR)-.197 E 2.738(YE)-.383 G
+(XP)-2.738 E(ANSION)-.81 E F0 .611(The shell supports a history e)108
+160.8 R .611(xpansion feature that is similar to the history e)-.15 F
+.61(xpansion in)-.15 F F1(csh.)3.11 E F0 .61(This section)5.61 F .87
+(describes what syntax features are a)108 172.8 R -.25(va)-.2 G 3.371
+(ilable. This).25 F .871(feature is enabled by def)3.371 F .871
+(ault for interacti)-.1 F 1.171 -.15(ve s)-.25 H .871(hells, and).15 F
+2.014(can be disabled using the)108 184.8 R F1(+H)4.514 E F0 2.014
+(option to the)4.514 F F1(set)4.514 E F0 -.2(bu)4.514 G 2.014
+(iltin command \(see).2 F F2 2.013(SHELL B)4.513 F(UIL)-.09 E 2.013
+(TIN COMMANDS)-.828 F F0(belo)108 196.8 Q 2.5(w\). Non-interacti)-.25 F
+.3 -.15(ve s)-.25 H(hells do not perform history e).15 E
+(xpansion by def)-.15 E(ault.)-.1 E 1.305(History e)108 213.6 R 1.305
+(xpansions introduce w)-.15 F 1.306(ords from the history list into the\
+ input stream, making it easy to repeat)-.1 F .21
+(commands, insert the ar)108 225.6 R .21(guments to a pre)-.18 F .209
+(vious command into the current input line, or \214x errors in pre)-.25
+F(vious)-.25 E(commands quickly)108 237.6 Q(.)-.65 E 1.163(History e)108
+254.4 R 1.163(xpansion is performed immediately after a complete line i\
+s read, before the shell breaks it into)-.15 F -.1(wo)108 266.4 S 3.2
+(rds. It).1 F(tak)3.2 E .7(es place in tw)-.1 F 3.2(op)-.1 G 3.2
+(arts. The)-3.2 F .7
+(\214rst is to determine which line from the history list to use during)
+3.2 F 4.367(substitution. The)108 278.4 R 1.868(second is to select por\
+tions of that line for inclusion into the current one.)4.367 F 1.868
+(The line)6.868 F .663(selected from the history is the)108 290.4 R/F4
+10/Times-Italic@0 SF -.15(ev)3.163 G(ent).15 E F0 3.163(,a)C .663
+(nd the portions of that line that are acted upon are)-3.163 F F4(wor)
+3.162 E(ds)-.37 E F0 5.662(.V)C(arious)-6.772 E F4(modi\214er)108 302.4
+Q(s)-.1 E F0 .226(are a)2.726 F -.25(va)-.2 G .226
+(ilable to manipulate the selected w).25 F 2.726(ords. The)-.1 F .227
+(line is brok)2.726 F .227(en into w)-.1 F .227(ords in the same f)-.1 F
+(ashion)-.1 E .352(as when reading input, so that se)108 314.4 R -.15
+(ve)-.25 G(ral).15 E F4(metac)2.852 E(har)-.15 E(acter)-.15 E F0 .351
+(-separated w)B .351(ords surrounded by quotes are considered)-.1 F .624
+(one w)108 326.4 R 3.124(ord. History)-.1 F -.15(ex)3.124 G .624
+(pansions are introduced by the appearance of the history e).15 F .625
+(xpansion character)-.15 F 3.125(,w)-.4 G(hich)-3.125 E(is)108 338.4 Q
+F1(!)3.333 E F0(by def)3.333 E 2.5(ault. Only)-.1 F(backslash \()2.5 E
+F1(\\).833 E F0 2.5(\)a).833 G(nd single quotes can quote the history e)
+-2.5 E(xpansion character)-.15 E(.)-.55 E(Se)108 355.2 Q -.15(ve)-.25 G
+.03(ral characters inhibit history e).15 F .03
+(xpansion if found immediately follo)-.15 F .03(wing the history e)-.25
+F .03(xpansion character)-.15 F(,)-.4 E -2.15 -.25(ev e)108 367.2 T
+3.162(ni).25 G 3.162(fi)-3.162 G 3.162(ti)-3.162 G 3.162(su)-3.162 G
+.662(nquoted: space, tab, ne)-3.162 F .662(wline, carriage return, and)
+-.25 F F1(=)3.162 E F0 5.662(.I)C 3.162(ft)-5.662 G(he)-3.162 E F1
+(extglob)3.162 E F0 .662(shell option is enabled,)3.162 F F1(\()3.163 E
+F0(will also inhibit e)108 379.2 Q(xpansion.)-.15 E(Se)108 396 Q -.15
+(ve)-.25 G .11(ral shell options settable with the).15 F F1(shopt)2.61 E
+F0 -.2(bu)2.61 G .109(iltin may be used to tailor the beha).2 F .109
+(vior of history e)-.2 F(xpansion.)-.15 E 1.258(If the)108 408 R F1
+(histv)3.758 E(erify)-.1 E F0 1.259
+(shell option is enabled \(see the description of the)3.758 F F1(shopt)
+3.759 E F0 -.2(bu)3.759 G 1.259(iltin\), and).2 F F1 -.18(re)3.759 G
+(adline).18 E F0 1.259(is being)3.759 F 1.498(used, history substitutio\
+ns are not immediately passed to the shell parser)108 420 R 6.497(.I)
+-.55 G 1.497(nstead, the e)-6.497 F 1.497(xpanded line is)-.15 F 2.228
+(reloaded into the)108 432 R F1 -.18(re)4.728 G(adline).18 E F0 2.228
+(editing b)4.728 F(uf)-.2 E 2.228(fer for further modi\214cation.)-.25 F
+(If)7.228 E F1 -.18(re)4.728 G(adline).18 E F0 2.228
+(is being used, and the)4.728 F F1(histr)108 444 Q(eedit)-.18 E F0 1.202
+(shell option is enabled, a f)3.702 F 1.202
+(ailed history substitution will be reloaded into the)-.1 F F1 -.18(re)
+3.702 G(adline).18 E F0(editing)3.702 E -.2(bu)108 456 S -.25(ff).2 G
+1.16(er for correction.).25 F(The)6.16 E F1<ad70>3.66 E F0 1.16
+(option to the)3.66 F F1(history)3.66 E F0 -.2(bu)3.661 G 1.161
+(iltin command may be used to see what a history).2 F -.15(ex)108 468 S
+.056(pansion will do before using it.).15 F(The)5.056 E F1<ad73>2.556 E
+F0 .056(option to the)2.556 F F1(history)2.555 E F0 -.2(bu)2.555 G .055
+(iltin may be used to add commands to the).2 F
+(end of the history list without actually e)108 480 Q -.15(xe)-.15 G
+(cuting them, so that the).15 E 2.5(ya)-.15 G(re a)-2.5 E -.25(va)-.2 G
+(ilable for subsequent recall.).25 E 2.2(The shell allo)108 496.8 R 2.2
+(ws control of the v)-.25 F 2.2(arious characters used by the history e)
+-.25 F 2.2(xpansion mechanism \(see the)-.15 F(description of)108 508.8
+Q F1(histchars)2.5 E F0(abo)2.5 E .3 -.15(ve u)-.15 H(nder).15 E F1
+(Shell V)2.5 E(ariables)-.92 E F0(\).)A F1(Ev)87 525.6 Q
+(ent Designators)-.1 E F0(An e)108 537.6 Q -.15(ve)-.25 G(nt designator\
+ is a reference to a command line entry in the history list.).15 E F1(!)
+108 554.4 Q F0 1.608(Start a history substitution, e)32.67 F 1.608
+(xcept when follo)-.15 F 1.607(wed by a)-.25 F F1(blank)4.107 E F0 4.107
+(,n)C -.25(ew)-4.107 G 1.607(line, carriage return, = or \().25 F
+(\(when the)144 566.4 Q F1(extglob)2.5 E F0
+(shell option is enabled using the)2.5 E F1(shopt)2.5 E F0 -.2(bu)2.5 G
+(iltin\).).2 E F1(!)108 578.4 Q F4(n)A F0(Refer to command line)27.67 E
+F4(n)2.5 E F0(.).24 E F1<21ad>108 590.4 Q F4(n)A F0
+(Refer to the current command line minus)21.97 E F4(n)2.5 E F0(.).24 E
+F1(!!)108 602.4 Q F0(Refer to the pre)29.34 E(vious command.)-.25 E
+(This is a synon)5 E(ym for `!\2551'.)-.15 E F1(!)108 614.4 Q F4(string)
+A F0(Refer to the most recent command starting with)9.33 E F4(string)2.5
+E F0(.).22 E F1(!?)108 626.4 Q F4(string)A F1([?])A F0 1.022
+(Refer to the most recent command containing)144 638.4 R F4(string)3.522
+E F0 6.022(.T).22 G 1.022(he trailing)-6.022 F F1(?)3.522 E F0 1.022
+(may be omitted if)3.522 F F4(string)3.862 E F0(is)3.742 E(follo)144
+650.4 Q(wed immediately by a ne)-.25 E(wline.)-.25 E/F5 12/Times-Bold@0
+SF(^)108 667.4 Q F4(string1)-5 I F5(^)5 I F4(string2)-5 I F5(^)5 I F0
+2.63(Quick substitution.)144 674.4 R 2.629
+(Repeat the last command, replacing)7.629 F F4(string1)5.469 E F0(with)
+5.129 E F4(string2)5.129 E F0 7.629(.E).02 G(qui)-7.629 E -.25(va)-.25 G
+2.629(lent to).25 F -.74(``)144 686.4 S(!!:s/).74 E F4(string1)A F0(/)A
+F4(string2)A F0(/')A 2.5('\()-.74 G(see)-2.5 E F1(Modi\214ers)2.5 E F0
+(belo)2.5 E(w\).)-.25 E F1(!#)108 698.4 Q F0
+(The entire command line typed so f)27.67 E(ar)-.1 E(.)-.55 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(34)-2.5 G
+(2)-197.965 E 0 Cg EP
+%%Page: 43 43
+%%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 -.75(Wo)87 84 S(rd Designators).75 E F0 -.8
+(Wo)108 96 S 1.313(rd designators are used to select desired w).8 F
+1.314(ords from the e)-.1 F -.15(ve)-.25 G 3.814(nt. A).15 F F1(:)3.814
+E F0 1.314(separates the e)3.814 F -.15(ve)-.25 G 1.314
+(nt speci\214cation).15 F .53(from the w)108 108 R .529(ord designator)
+-.1 F 5.529(.I)-.55 G 3.029(tm)-5.529 G .529(ay be omitted if the w)
+-3.029 F .529(ord designator be)-.1 F .529(gins with a)-.15 F F1(^)3.029
+E F0(,)A F1($)3.029 E F0(,)A F1(*)3.029 E F0(,)A F1<ad>3.029 E F0 3.029
+(,o)C(r)-3.029 E F1(%)3.029 E F0 5.529(.W)C(ords)-6.329 E 1.3
+(are numbered from the be)108 120 R 1.3
+(ginning of the line, with the \214rst w)-.15 F 1.301
+(ord being denoted by 0 \(zero\).)-.1 F -.8(Wo)6.301 G 1.301(rds are).8
+F(inserted into the current line separated by single spaces.)108 132 Q
+F1 2.5(0\()108 148.8 S(zer)-2.5 E(o\))-.18 E F0(The zeroth w)144 160.8 Q
+2.5(ord. F)-.1 F(or the shell, this is the command w)-.15 E(ord.)-.1 E
+/F2 10/Times-Italic@0 SF(n)108.36 172.8 Q F0(The)30.64 E F2(n)2.5 E F0
+(th w)A(ord.)-.1 E F1(^)108 184.8 Q F0(The \214rst ar)32.67 E 2.5
+(gument. That)-.18 F(is, w)2.5 E(ord 1.)-.1 E F1($)108 196.8 Q F0
+(The last ar)31 E(gument.)-.18 E F1(%)108 208.8 Q F0(The w)26 E
+(ord matched by the most recent `?)-.1 E F2(string)A F0(?' search.)A F2
+(x)108.77 220.8 Q F1<ad>A F2(y)A F0 2.5(Ar)20.65 G(ange of w)-2.5 E
+(ords; `\255)-.1 E F2(y)A F0 2.5('a)C(bbre)-2.5 E(viates `0\255)-.25 E
+F2(y)A F0('.)A F1(*)108 232.8 Q F0 .316(All of the w)31 F .316(ords b)
+-.1 F .316(ut the zeroth.)-.2 F .315(This is a synon)5.315 F .315
+(ym for `)-.15 F F2(1\255$)A F0 2.815('. It)B .315
+(is not an error to use)2.815 F F1(*)2.815 E F0 .315(if there is)2.815 F
+(just one w)144 244.8 Q(ord in the e)-.1 E -.15(ve)-.25 G
+(nt; the empty string is returned in that case.).15 E F1(x*)108 256.8 Q
+F0(Abbre)26 E(viates)-.25 E F2(x\255$)2.5 E F0(.)A F1<78ad>108 268.8 Q
+F0(Abbre)25.3 E(viates)-.25 E F2(x\255$)2.5 E F0(lik)2.5 E(e)-.1 E F1
+(x*)2.5 E F0 2.5(,b)C(ut omits the last w)-2.7 E(ord.)-.1 E(If a w)108
+285.6 Q(ord designator is supplied without an e)-.1 E -.15(ve)-.25 G
+(nt speci\214cation, the pre).15 E(vious command is used as the e)-.25 E
+-.15(ve)-.25 G(nt.).15 E F1(Modi\214ers)87 302.4 Q F0 .183
+(After the optional w)108 314.4 R .183(ord designator)-.1 F 2.683(,t)-.4
+G .184(here may appear a sequence of one or more of the follo)-2.683 F
+.184(wing modi\214ers,)-.25 F(each preceded by a `:'.)108 326.4 Q F1(h)
+108 343.2 Q F0(Remo)30.44 E .3 -.15(ve a t)-.15 H
+(railing \214le name component, lea).15 E(ving only the head.)-.2 E F1
+(t)108 355.2 Q F0(Remo)32.67 E .3 -.15(ve a)-.15 H
+(ll leading \214le name components, lea).15 E(ving the tail.)-.2 E F1(r)
+108 367.2 Q F0(Remo)31.56 E .3 -.15(ve a t)-.15 H(railing suf).15 E
+(\214x of the form)-.25 E F2(.xxx)2.5 E F0 2.5(,l)C(ea)-2.5 E
+(ving the basename.)-.2 E F1(e)108 379.2 Q F0(Remo)31.56 E .3 -.15(ve a)
+-.15 H(ll b).15 E(ut the trailing suf)-.2 E(\214x.)-.25 E F1(p)108 391.2
+Q F0(Print the ne)30.44 E 2.5(wc)-.25 G(ommand b)-2.5 E(ut do not e)-.2
+E -.15(xe)-.15 G(cute it.).15 E F1(q)108 403.2 Q F0
+(Quote the substituted w)30.44 E(ords, escaping further substitutions.)
+-.1 E F1(x)108 415.2 Q F0(Quote the substituted w)31 E(ords as with)-.1
+E F1(q)2.5 E F0 2.5(,b)C(ut break into w)-2.7 E(ords at)-.1 E F1(blanks)
+2.5 E F0(and ne)2.5 E(wlines.)-.25 E F1(s/)108 427.2 Q F2(old)A F1(/)A
+F2(ne)A(w)-.15 E F1(/)A F0(Substitute)144 439.2 Q F2(ne)3.082 E(w)-.15 E
+F0 .221(for the \214rst occurrence of)3.032 F F2(old)2.951 E F0 .221
+(in the e)3.491 F -.15(ve)-.25 G .221(nt line.).15 F(An)5.221 E 2.721
+(yd)-.15 G .221(elimiter can be used in place)-2.721 F .616(of /.)144
+451.2 R .617
+(The \214nal delimiter is optional if it is the last character of the e)
+5.616 F -.15(ve)-.25 G .617(nt line.).15 F .617(The delimiter may)5.617
+F .666(be quoted in)144 463.2 R F2(old)3.396 E F0(and)3.936 E F2(ne)
+3.526 E(w)-.15 E F0 .666(with a single backslash.)3.476 F .666
+(If & appears in)5.666 F F2(ne)3.166 E(w)-.15 E F0 3.166(,i).31 G 3.166
+(ti)-3.166 G 3.166(sr)-3.166 G .666(eplaced by)-3.166 F F2(old)3.166 E
+F0 5.666(.A).77 G .274(single backslash will quote the &.)144 475.2 R
+(If)5.274 E F2(old)3.004 E F0 .274(is null, it is set to the last)3.544
+F F2(old)3.005 E F0 .275(substituted, or)3.545 F 2.775(,i)-.4 G 2.775
+(fn)-2.775 G 2.775(op)-2.775 G(re)-2.775 E(vi-)-.25 E
+(ous history substitutions took place, the last)144 487.2 Q F2(string)
+2.84 E F0(in a)2.72 E F1(!?)2.5 E F2(string)A F1([?])A F0(search.)5 E F1
+(&)108 499.2 Q F0(Repeat the pre)27.67 E(vious substitution.)-.25 E F1
+(g)108 511.2 Q F0 .398(Cause changes to be applied o)31 F -.15(ve)-.15 G
+2.898(rt).15 G .398(he entire e)-2.898 F -.15(ve)-.25 G .398(nt line.)
+.15 F .397(This is used in conjunction with `)5.398 F F1(:s)A F0 2.897
+('\()C(e.g.,)-2.897 E(`)144 523.2 Q F1(:gs/)A F2(old)A F1(/)A F2(ne)A(w)
+-.15 E F1(/)A F0 1.218('\) or `)B F1(:&)A F0 3.718('. If)B 1.218
+(used with `)3.718 F F1(:s)A F0 1.218(', an)B 3.718(yd)-.15 G 1.219
+(elimiter can be used in place of /, and the \214nal)-3.718 F .09
+(delimiter is optional if it is the last character of the e)144 535.2 R
+-.15(ve)-.25 G .089(nt line.).15 F(An)5.089 E F1(a)2.589 E F0 .089
+(may be used as a synon)2.589 F .089(ym for)-.15 F F1(g)144 547.2 Q F0
+(.)A F1(G)108 559.2 Q F0(Apply the follo)28.22 E(wing `)-.25 E F1(s)A F0
+2.5('m)C(odi\214er once to each w)-2.5 E(ord in the e)-.1 E -.15(ve)-.25
+G(nt line.).15 E/F3 10.95/Times-Bold@0 SF(SHELL B)72 576 Q(UIL)-.11 E
+(TIN COMMANDS)-1.007 E F0 .062(Unless otherwise noted, each b)108 588 R
+.062(uiltin command documented in this section as accepting options pre\
+ceded by)-.2 F F1<ad>108 600 Q F0(accepts)2.5 E F1<adad>2.5 E F0
+(to signify the end of the options.)2.5 E F1(:)108 618 Q F0([)2.5 E F2
+(ar)A(guments)-.37 E F0(])A .452(No ef)144 630 R .452
+(fect; the command does nothing be)-.25 F .452(yond e)-.15 F(xpanding)
+-.15 E F2(ar)3.282 E(guments)-.37 E F0 .451(and performing an)3.221 F
+2.951(ys)-.15 G(peci\214ed)-2.951 E 2.5(redirections. A)144 642 R
+(zero e)2.5 E(xit code is returned.)-.15 E F1(.)110.5 658.8 Q F2
+(\214lename)6.666 E F0([)2.5 E F2(ar)A(guments)-.37 E F0(])A F1(sour)108
+670.8 Q(ce)-.18 E F2(\214lename)2.5 E F0([)2.5 E F2(ar)A(guments)-.37 E
+F0(])A 1.02(Read and e)144 682.8 R -.15(xe)-.15 G 1.02
+(cute commands from).15 F F2(\214lename)5.43 E F0 1.02
+(in the current shell en)3.7 F 1.02(vironment and return the e)-.4 F
+(xit)-.15 E 1.68(status of the last command e)144 694.8 R -.15(xe)-.15 G
+1.68(cuted from).15 F F2(\214lename)4.18 E F0 6.68(.I).18 G(f)-6.68 E F2
+(\214lename)6.09 E F0 1.68(does not contain a slash, \214le)4.36 F .608
+(names in)144 706.8 R/F4 9/Times-Bold@0 SF -.666(PA)3.108 G(TH)-.189 E
+F0 .608(are used to \214nd the directory containing)2.858 F F2
+(\214lename)3.108 E F0 5.608(.T).18 G .608(he \214le searched for in)
+-5.608 F F4 -.666(PA)3.108 G(TH)-.189 E F0 .833(need not be e)144 718.8
+R -.15(xe)-.15 G 3.333(cutable. When).15 F F1(bash)3.333 E F0 .832
+(is not in)3.333 F F2 .832(posix mode)3.332 F F0 3.332(,t)C .832
+(he current directory is searched if no)-3.332 F .981
+(\214le is found in)144 730.8 R F4 -.666(PA)3.481 G(TH)-.189 E/F5 9
+/Times-Roman@0 SF(.)A F0 .981(If the)5.481 F F1(sour)3.481 E(cepath)-.18
+E F0 .981(option to the)3.481 F F1(shopt)3.481 E F0 -.2(bu)3.481 G .981
+(iltin command is turned of).2 F .982(f, the)-.25 F(GNU Bash-3.0)72 768
+Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(34)-2.5 G(3)-197.965 E 0 Cg EP
+%%Page: 44 44
+%%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 9/Times-Bold@0 SF -.666(PA)144 84 S(TH)-.189 E F0 .112
+(is not searched.)2.363 F .112(If an)5.112 F(y)-.15 E/F2 10
+/Times-Italic@0 SF(ar)2.612 E(guments)-.37 E F0 .112(are supplied, the)
+2.612 F 2.612(yb)-.15 G .112(ecome the positional parameters when)-2.612
+F F2(\214lename)144 96 Q F0 .341(is e)2.841 F -.15(xe)-.15 G 2.841
+(cuted. Otherwise).15 F .341(the positional parameters are unchanged.)
+2.841 F .342(The return status is the)5.342 F .716
+(status of the last command e)144 108 R .716
+(xited within the script \(0 if no commands are e)-.15 F -.15(xe)-.15 G
+.716(cuted\), and f).15 F .715(alse if)-.1 F F2(\214lename)145.91 120 Q
+F0(is not found or cannot be read.)2.68 E/F3 10/Times-Bold@0 SF(alias)
+108 136.8 Q F0([)2.5 E F3<ad70>A F0 2.5(][)C F2(name)-2.5 E F0([=)A F2
+(value)A F0 2.5(].)C(..])-2.5 E F3(Alias)144 148.8 Q F0 2.724
+(with no ar)5.224 F 2.724(guments or with the)-.18 F F3<ad70>5.224 E F0
+2.724(option prints the list of aliases in the form)5.224 F F3(alias)
+5.225 E F2(name)144 160.8 Q F0(=)A F2(value)A F0 .58
+(on standard output.)3.08 F .58(When ar)5.58 F .58
+(guments are supplied, an alias is de\214ned for each)-.18 F F2(name)
+3.08 E F0(whose)144 172.8 Q F2(value)2.895 E F0 .395(is gi)2.895 F -.15
+(ve)-.25 G 2.895(n. A).15 F .395(trailing space in)2.895 F F2(value)
+5.395 E F0 .395(causes the ne)2.895 F .395(xt w)-.15 F .395
+(ord to be check)-.1 F .395(ed for alias sub-)-.1 F .054
+(stitution when the alias is e)144 184.8 R 2.554(xpanded. F)-.15 F .054
+(or each)-.15 F F2(name)2.554 E F0 .054(in the ar)2.554 F .054
+(gument list for which no)-.18 F F2(value)2.554 E F0 .053(is sup-)2.553
+F 1.313(plied, the name and v)144 196.8 R 1.314
+(alue of the alias is printed.)-.25 F F3(Alias)6.314 E F0 1.314
+(returns true unless a)3.814 F F2(name)3.814 E F0 1.314(is gi)3.814 F
+-.15(ve)-.25 G 3.814(nf).15 G(or)-3.814 E
+(which no alias has been de\214ned.)144 208.8 Q F3(bg)108 225.6 Q F0([)
+2.5 E F2(jobspec)A F0(])A .357(Resume the suspended job)144 237.6 R F2
+(jobspec)2.857 E F0 .356
+(in the background, as if it had been started with)2.857 F F3(&)2.856 E
+F0 5.356(.I)C(f)-5.356 E F2(jobspec)2.856 E F0 .472
+(is not present, the shell')144 249.6 R 2.973(sn)-.55 G .473
+(otion of the)-2.973 F F2(curr)2.973 E .473(ent job)-.37 F F0 .473
+(is used.)2.973 F F3(bg)5.473 E F2(jobspec)4.713 E F0 .473
+(returns 0 unless run when)3.283 F .663(job control is disabled or)144
+261.6 R 3.163(,w)-.4 G .663(hen run with job control enabled, if)-3.163
+F F2(jobspec)3.163 E F0 -.1(wa)3.163 G 3.163(sn).1 G .663
+(ot found or started)-3.163 F(without job control.)144 273.6 Q F3(bind)
+108 290.4 Q F0([)2.5 E F3<ad6d>A F2 -.1(ke)2.5 G(ymap)-.2 E F0 2.5(][)C
+F3(\255lpsvPSV)-2.5 E F0(])A F3(bind)108 302.4 Q F0([)2.5 E F3<ad6d>A F2
+-.1(ke)2.5 G(ymap)-.2 E F0 2.5(][)C F3<ad71>-2.5 E F2(function)2.5 E F0
+2.5(][)C F3<ad75>-2.5 E F2(function)2.5 E F0 2.5(][)C F3<ad72>-2.5 E F2
+-.1(ke)2.5 G(yseq)-.2 E F0(])A F3(bind)108 314.4 Q F0([)2.5 E F3<ad6d>A
+F2 -.1(ke)2.5 G(ymap)-.2 E F0(])A F3<ad66>2.5 E F2(\214lename)2.5 E F3
+(bind)108 326.4 Q F0([)2.5 E F3<ad6d>A F2 -.1(ke)2.5 G(ymap)-.2 E F0(])A
+F3<ad78>2.5 E F2 -.1(ke)2.5 G(yseq)-.2 E F0(:)A F2(shell\255command)A F3
+(bind)108 338.4 Q F0([)2.5 E F3<ad6d>A F2 -.1(ke)2.5 G(ymap)-.2 E F0(])A
+F2 -.1(ke)2.5 G(yseq)-.2 E F0(:)A F2(function\255name)A F3(bind)108
+350.4 Q F2 -.37(re)2.5 G(adline\255command).37 E F0 .238
+(Display current)144 362.4 R F3 -.18(re)2.738 G(adline).18 E F0 -.1(ke)
+2.738 G 2.738(ya)-.05 G .239(nd function bindings, bind a k)-2.738 F
+.539 -.15(ey s)-.1 H .239(equence to a).15 F F3 -.18(re)2.739 G(adline)
+.18 E F0 .239(function or)2.739 F .476(macro, or set a)144 374.4 R F3
+-.18(re)2.976 G(adline).18 E F0 -.25(va)2.976 G 2.976(riable. Each).25 F
+.476(non-option ar)2.976 F .475(gument is a command as it w)-.18 F .475
+(ould appear in)-.1 F F2(.inputr)144 386.4 Q(c)-.37 E F0 2.983(,b).31 G
+.484(ut each binding or command must be passed as a separate ar)-3.183 F
+.484(gument; e.g., '"\\C\255x\\C\255r":)-.18 F 2.5
+(re\255read\255init\255\214le'. Options,)144 398.4 R(if supplied, ha)2.5
+E .3 -.15(ve t)-.2 H(he follo).15 E(wing meanings:)-.25 E F3<ad6d>144
+410.4 Q F2 -.1(ke)2.5 G(ymap)-.2 E F0(Use)180 422.4 Q F2 -.1(ke)5.159 G
+(ymap)-.2 E F0 2.659(as the k)5.349 F -.15(ey)-.1 G 2.658(map to be af)
+.15 F 2.658(fected by the subsequent bindings.)-.25 F(Acceptable)7.658 E
+F2 -.1(ke)180 434.4 S(ymap)-.2 E F0 3.192(names are)5.882 F F2 3.192
+(emacs, emacs\255standar)5.692 F 3.193
+(d, emacs\255meta, emacs\255ctlx, vi, vi\255mo)-.37 F(ve)-.1 E(,)-.1 E
+(vi\255command)180 446.4 Q F0 4.43(,a)C(nd)-4.43 E F2(vi\255insert)4.429
+E F0(.).68 E F2(vi)6.929 E F0 1.929(is equi)4.429 F -.25(va)-.25 G 1.929
+(lent to).25 F F2(vi\255command)4.429 E F0(;)A F2(emacs)4.429 E F0 1.929
+(is equi)4.429 F -.25(va)-.25 G 1.929(lent to).25 F F2(emacs\255standar)
+180 458.4 Q(d)-.37 E F0(.)A F3<ad6c>144 470.4 Q F0
+(List the names of all)27.52 E F3 -.18(re)2.5 G(adline).18 E F0
+(functions.)2.5 E F3<ad70>144 482.4 Q F0(Display)24.74 E F3 -.18(re)2.5
+G(adline).18 E F0(function names and bindings in such a w)2.5 E
+(ay that the)-.1 E 2.5(yc)-.15 G(an be re-read.)-2.5 E F3<ad50>144 494.4
+Q F0(List current)24.19 E F3 -.18(re)2.5 G(adline).18 E F0
+(function names and bindings.)2.5 E F3<ad76>144 506.4 Q F0(Display)25.3
+E F3 -.18(re)2.5 G(adline).18 E F0 -.25(va)2.5 G(riable names and v).25
+E(alues in such a w)-.25 E(ay that the)-.1 E 2.5(yc)-.15 G
+(an be re-read.)-2.5 E F3<ad56>144 518.4 Q F0(List current)23.08 E F3
+-.18(re)2.5 G(adline).18 E F0 -.25(va)2.5 G(riable names and v).25 E
+(alues.)-.25 E F3<ad73>144 530.4 Q F0(Display)26.41 E F3 -.18(re)3.655 G
+(adline).18 E F0 -.1(ke)3.655 G 3.655(ys)-.05 G 1.155
+(equences bound to macros and the strings the)-3.655 F 3.655(yo)-.15 G
+1.155(utput in such a)-3.655 F -.1(wa)180 542.4 S 2.5(yt).1 G(hat the)
+-2.5 E 2.5(yc)-.15 G(an be re-read.)-2.5 E F3<ad53>144 554.4 Q F0
+(Display)24.74 E F3 -.18(re)2.5 G(adline).18 E F0 -.1(ke)2.5 G 2.5(ys)
+-.05 G(equences bound to macros and the strings the)-2.5 E 2.5(yo)-.15 G
+(utput.)-2.5 E F3<ad66>144 566.4 Q F2(\214lename)2.5 E F0(Read k)180
+578.4 Q .3 -.15(ey b)-.1 H(indings from).15 E F2(\214lename)2.5 E F0(.)A
+F3<ad71>144 590.4 Q F2(function)2.5 E F0(Query about which k)180 602.4 Q
+-.15(ey)-.1 G 2.5(si).15 G -1.9 -.4(nv o)-2.5 H .2 -.1(ke t).4 H
+(he named).1 E F2(function)2.5 E F0(.)A F3<ad75>144 614.4 Q F2(function)
+2.5 E F0(Unbind all k)180 626.4 Q -.15(ey)-.1 G 2.5(sb).15 G
+(ound to the named)-2.5 E F2(function)2.5 E F0(.)A F3<ad72>144 638.4 Q
+F2 -.1(ke)2.5 G(yseq)-.2 E F0(Remo)180 650.4 Q .3 -.15(ve a)-.15 H .3
+-.15(ny c).15 H(urrent binding for).15 E F2 -.1(ke)2.5 G(yseq)-.2 E F0
+(.)A F3<ad78>144 662.4 Q F2 -.1(ke)2.5 G(yseq)-.2 E F3(:)A F2
+(shell\255command)A F0(Cause)180 674.4 Q F2(shell\255command)2.5 E F0
+(to be e)2.5 E -.15(xe)-.15 G(cuted whene).15 E -.15(ve)-.25 G(r).15 E
+F2 -.1(ke)2.5 G(yseq)-.2 E F0(is entered.)2.5 E(The return v)144 691.2 Q
+(alue is 0 unless an unrecognized option is gi)-.25 E -.15(ve)-.25 G 2.5
+(no).15 G 2.5(ra)-2.5 G 2.5(ne)-2.5 G(rror occurred.)-2.5 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(34)-2.5 G
+(4)-197.965 E 0 Cg EP
+%%Page: 45 45
+%%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(br)108 84 Q(eak)-.18 E F0([)2.5 E/F2 10
+/Times-Italic@0 SF(n)A F0(])A .055(Exit from within a)144 96 R F1 -.25
+(fo)2.555 G(r).25 E F0(,)A F1(while)2.555 E F0(,)A F1(until)2.555 E F0
+2.555(,o)C(r)-2.555 E F1(select)2.555 E F0 2.555(loop. If)2.555 F F2(n)
+2.555 E F0 .055(is speci\214ed, break)2.555 F F2(n)2.555 E F0(le)2.555 E
+-.15(ve)-.25 G(ls.).15 E F2(n)5.414 E F0 .054(must be)2.794 F/F3 10
+/Symbol SF<b3>2.554 E F0(1.)2.554 E(If)144 108 Q F2(n)3.074 E F0 .215(i\
+s greater than the number of enclosing loops, all enclosing loops are e)
+2.954 F 2.715(xited. The)-.15 F .215(return v)2.715 F(alue)-.25 E
+(is 0 unless the shell is not e)144 120 Q -.15(xe)-.15 G
+(cuting a loop when).15 E F1(br)2.5 E(eak)-.18 E F0(is e)2.5 E -.15(xe)
+-.15 G(cuted.).15 E F1 -.2(bu)108 136.8 S(iltin).2 E F2(shell\255b)2.5 E
+(uiltin)-.2 E F0([)2.5 E F2(ar)A(guments)-.37 E F0(])A(Ex)144 148.8 Q
+.793(ecute the speci\214ed shell b)-.15 F .793(uiltin, passing it)-.2 F
+F2(ar)3.293 E(guments)-.37 E F0 3.293(,a).27 G .793(nd return its e)
+-3.293 F .792(xit status.)-.15 F .792(This is useful)5.792 F .615
+(when de\214ning a function whose name is the same as a shell b)144
+160.8 R .616(uiltin, retaining the functionality of)-.2 F .57(the b)144
+172.8 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(is f)144 184.8 Q(alse if)-.1
+E F2(shell\255b)2.84 E(uiltin)-.2 E F0(is not a shell b)2.74 E
+(uiltin command.)-.2 E F1(cd)108 201.6 Q F0([)2.5 E F1(\255L|-P)A F0 2.5
+(][)C F2(dir)-2.5 E F0(])A .21(Change the current directory to)144 213.6
+R F2(dir)2.71 E F0 5.21(.T)C .21(he v)-5.21 F(ariable)-.25 E/F4 9
+/Times-Bold@0 SF(HOME)2.71 E F0 .21(is the def)2.46 F(ault)-.1 E F2(dir)
+2.71 E F0 5.21(.T).73 G .21(he v)-5.21 F(ariable)-.25 E F4(CDP)2.71 E
+-.855(AT)-.666 G(H).855 E F0 .777
+(de\214nes the search path for the directory containing)144 225.6 R F2
+(dir)3.276 E F0 5.776(.A).73 G(lternati)-5.776 E 1.076 -.15(ve d)-.25 H
+.776(irectory names in).15 F F4(CDP)3.276 E -.855(AT)-.666 G(H).855 E F0
+.764(are separated by a colon \(:\).)144 237.6 R 3.264(An)5.764 G .764
+(ull directory name in)-3.264 F F4(CDP)3.264 E -.855(AT)-.666 G(H).855 E
+F0 .764(is the same as the current direc-)3.014 F(tory)144 249.6 Q 2.974
+(,i)-.65 G .474(.e., `)-2.974 F(`)-.74 E F1(.)A F0 -.74('')C 5.474(.I)
+.74 G(f)-5.474 E F2(dir)3.324 E F0(be)3.704 E .474
+(gins with a slash \(/\), then)-.15 F F4(CDP)2.974 E -.855(AT)-.666 G(H)
+.855 E F0 .473(is not used. The)2.724 F F1<ad50>2.973 E F0 .473
+(option says to use)2.973 F .579(the ph)144 261.6 R .579
+(ysical directory structure instead of follo)-.05 F .579
+(wing symbolic links \(see also the)-.25 F F1<ad50>3.08 E F0 .58
+(option to the)3.08 F F1(set)144 273.6 Q F0 -.2(bu)3.384 G .884
+(iltin command\); the).2 F F1<ad4c>3.384 E F0 .884
+(option forces symbolic links to be follo)3.384 F 3.384(wed. An)-.25 F
+(ar)3.383 E .883(gument of)-.18 F F1<ad>3.383 E F0(is)3.383 E(equi)144
+285.6 Q -.25(va)-.25 G .062(lent to).25 F F4($OLDPWD)2.562 E/F5 9
+/Times-Roman@0 SF(.)A F0 .062(If a non-empty directory name from)4.562 F
+F1(CDP)2.562 E -.95(AT)-.74 G(H).95 E F0 .063(is used, or if)2.562 F F1
+<ad>2.563 E F0 .063(is the \214rst)2.563 F(ar)144 297.6 Q .116(gument, \
+and the directory change is successful, the absolute pathname of the ne)
+-.18 F 2.615(ww)-.25 G .115(orking direc-)-2.715 F 1.164
+(tory is written to the standard output.)144 309.6 R 1.164(The return v)
+6.164 F 1.165(alue is true if the directory w)-.25 F 1.165
+(as successfully)-.1 F(changed; f)144 321.6 Q(alse otherwise.)-.1 E F1
+(caller)108 338.4 Q F0([)2.5 E F2 -.2(ex)C(pr).2 E F0(])A .254
+(Returns the conte)144 350.4 R .254(xt of an)-.15 F 2.754(ya)-.15 G(cti)
+-2.754 E .554 -.15(ve s)-.25 H .254
+(ubroutine call \(a shell function or a script e).15 F -.15(xe)-.15 G
+.254(cuted with the).15 F F1(.)2.753 E F0(or)2.753 E F1(sour)144 362.4 Q
+(ce)-.18 E F0 -.2(bu)3.062 G 3.062(iltins. W).2 F(ithout)-.4 E F2 -.2
+(ex)3.062 G(pr).2 E F0(,)A F1(caller)3.062 E F0 .562
+(displays the line number and source \214lename of the current)3.062 F
+.254(subroutine call.)144 374.4 R .254(If a non-ne)5.254 F -.05(ga)-.15
+G(ti).05 E .554 -.15(ve i)-.25 H(nte).15 E .253(ger is supplied as)-.15
+F F2 -.2(ex)2.753 G(pr).2 E F0(,)A F1(caller)2.753 E F0 .253
+(displays the line number)2.753 F 2.753(,s)-.4 G(ub-)-2.753 E 1.327(rou\
+tine name, and source \214le corresponding to that position in the curr\
+ent e)144 386.4 R -.15(xe)-.15 G 1.328(cution call stack.).15 F .001
+(This e)144 398.4 R .001(xtra information may be used, for e)-.15 F .001
+(xample, to print a stack trace.)-.15 F(The current frame is frame)5 E
+3.019(0. The)144 410.4 R .519(return v)3.019 F .519
+(alue is 0 unless the shell is not e)-.25 F -.15(xe)-.15 G .52
+(cuting a subroutine call or).15 F F2 -.2(ex)3.02 G(pr).2 E F0 .52
+(does not corre-)3.02 F(spond to a v)144 422.4 Q
+(alid position in the call stack.)-.25 E F1(command)108 439.2 Q F0([)2.5
+E F1(\255pVv)A F0(])A F2(command)2.5 E F0([)2.5 E F2(ar)A(g)-.37 E F0
+(...])2.5 E(Run)144 451.2 Q F2(command)2.957 E F0(with)3.527 E F2(ar)
+3.087 E(gs)-.37 E F0 .257
+(suppressing the normal shell function lookup. Only b)3.027 F .257
+(uiltin commands or)-.2 F .501(commands found in the)144 463.2 R F4
+-.666(PA)3.001 G(TH)-.189 E F0 .502(are e)2.751 F -.15(xe)-.15 G 3.002
+(cuted. If).15 F(the)3.002 E F1<ad70>3.002 E F0 .502(option is gi)3.002
+F -.15(ve)-.25 G .502(n, the search for).15 F F2(command)3.202 E F0(is)
+3.772 E .232(performed using a def)144 475.2 R .231(ault v)-.1 F .231
+(alue for)-.25 F F1 -.74(PA)2.731 G(TH)-.21 E F0 .231
+(that is guaranteed to \214nd all of the standard utilities.)2.731 F(If)
+5.231 E .174(either the)144 487.2 R F1<ad56>2.674 E F0(or)2.674 E F1
+<ad76>2.674 E F0 .175(option is supplied, a description of)2.674 F F2
+(command)2.875 E F0 .175(is printed.)3.445 F(The)5.175 E F1<ad76>2.675 E
+F0 .175(option causes)2.675 F 3.11(as)144 499.2 S .61(ingle w)-3.11 F
+.61(ord indicating the command or \214le name used to in)-.1 F -.2(vo)
+-.4 G -.1(ke).2 G F2(command)3.41 E F0 .61(to be displayed; the)3.88 F
+F1<ad56>144 511.2 Q F0 .249(option produces a more v)2.749 F .249
+(erbose description.)-.15 F .249(If the)5.249 F F1<ad56>2.749 E F0(or)
+2.749 E F1<ad76>2.75 E F0 .25(option is supplied, the e)2.75 F .25
+(xit status)-.15 F 1.005(is 0 if)144 523.2 R F2(command)3.705 E F0 -.1
+(wa)4.275 G 3.505(sf).1 G 1.005(ound, and 1 if not.)-3.505 F 1.004
+(If neither option is supplied and an error occurred or)6.005 F F2
+(command)144.2 535.2 Q F0 1.598(cannot be found, the e)4.868 F 1.599
+(xit status is 127.)-.15 F 1.599(Otherwise, the e)6.599 F 1.599
+(xit status of the)-.15 F F1(command)4.099 E F0 -.2(bu)144 547.2 S
+(iltin is the e).2 E(xit status of)-.15 E F2(command)2.5 E F0(.).77 E F1
+(compgen)108 564 Q F0([)2.5 E F2(option)A F0 2.5(][)C F2(wor)-2.5 E(d)
+-.37 E F0(])A .013(Generate possible completion matches for)144 576 R F2
+(wor)2.513 E(d)-.37 E F0 .013(according to the)2.513 F F2(option)2.513 E
+F0 .013(s, which may be an)B 2.512(yo)-.15 G(ption)-2.512 E .981
+(accepted by the)144 588 R F1(complete)3.481 E F0 -.2(bu)3.481 G .981
+(iltin with the e).2 F .981(xception of)-.15 F F1<ad70>3.481 E F0(and)
+3.481 E F1<ad72>3.481 E F0 3.481(,a)C .982(nd write the matches to the)
+-3.481 F 1.415(standard output.)144 600 R 1.415(When using the)6.415 F
+F1<ad46>3.915 E F0(or)3.915 E F1<ad43>3.915 E F0 1.415(options, the v)
+3.915 F 1.415(arious shell v)-.25 F 1.415(ariables set by the pro-)-.25
+F(grammable completion f)144 612 Q(acilities, while a)-.1 E -.25(va)-.2
+G(ilable, will not ha).25 E .3 -.15(ve u)-.2 H(seful v).15 E(alues.)-.25
+E .352(The matches will be generated in the same w)144 636 R .352
+(ay as if the programmable completion code had gen-)-.1 F .02(erated th\
+em directly from a completion speci\214cation with the same \215ags.)144
+648 R(If)5.02 E F2(wor)2.52 E(d)-.37 E F0 .02(is speci\214ed, only)2.52
+F(those completions matching)144 660 Q F2(wor)2.5 E(d)-.37 E F0
+(will be displayed.)2.5 E(The return v)144 684 Q
+(alue is true unless an in)-.25 E -.25(va)-.4 G
+(lid option is supplied, or no matches were generated.).25 E F1
+(complete)108 700.8 Q F0([)2.786 E F1(\255abcdefgjksuv)A F0 2.786(][)C
+F1<ad6f>-2.786 E F2(comp-option)2.786 E F0 2.786(][)C F1<ad41>-2.786 E
+F2(action)2.786 E F0 2.786(][)C F1<ad47>-2.786 E F2(globpat)2.786 E F0
+2.786(][)C F1<ad57>-2.786 E F2(wor)2.786 E(dlist)-.37 E F0 2.786(][)C F1
+<ad50>-2.786 E F2(pr)2.786 E(e\214x)-.37 E F0 2.787(][)C F1<ad53>-2.787
+E F2(suf-)2.787 E<8c78>108 712.8 Q F0(])A([)144 724.8 Q F1<ad58>A F2
+(\214lterpat)2.5 E F0 2.5(][)C F1<ad46>-2.5 E F2(function)2.5 E F0 2.5
+(][)C F1<ad43>-2.5 E F2(command)2.5 E F0(])A F2(name)2.5 E F0([)2.5 E F2
+(name ...)A F0(])A(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G
+197.965(34)-2.5 G(5)-197.965 E 0 Cg EP
+%%Page: 46 46
+%%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(complete \255pr)108 84 Q F0([)2.5 E/F2 10
+/Times-Italic@0 SF(name)A F0(...])2.5 E .633(Specify ho)144 96 R 3.133
+(wa)-.25 G -.18(rg)-3.133 G .633(uments to each).18 F F2(name)3.133 E F0
+.633(should be completed.)3.133 F .634(If the)5.634 F F1<ad70>3.134 E F0
+.634(option is supplied, or if no)3.134 F .14(options are supplied, e)
+144 108 R .139(xisting completion speci\214cations are printed in a w)
+-.15 F .139(ay that allo)-.1 F .139(ws them to be)-.25 F .31
+(reused as input.)144 120 R(The)5.31 E F1<ad72>2.81 E F0 .31
+(option remo)2.81 F -.15(ve)-.15 G 2.81(sac).15 G .31
+(ompletion speci\214cation for each)-2.81 F F2(name)2.81 E F0 2.81(,o)C
+1.11 -.4(r, i)-2.81 H 2.81(fn).4 G(o)-2.81 E F2(name)2.81 E F0(s)A
+(are supplied, all completion speci\214cations.)144 132 Q 1.438
+(The process of applying these completion speci\214cations when w)144
+156 R 1.437(ord completion is attempted is)-.1 F(described abo)144 168 Q
+.3 -.15(ve u)-.15 H(nder).15 E F1(Pr)2.5 E(ogrammable Completion)-.18 E
+F0(.)A .555(Other options, if speci\214ed, ha)144 192 R .855 -.15(ve t)
+-.2 H .555(he follo).15 F .555(wing meanings.)-.25 F .555(The ar)5.555 F
+.555(guments to the)-.18 F F1<ad47>3.056 E F0(,)A F1<ad57>3.056 E F0
+3.056(,a)C(nd)-3.056 E F1<ad58>3.056 E F0 .723
+(options \(and, if necessary)144 204 R 3.223(,t)-.65 G(he)-3.223 E F1
+<ad50>3.223 E F0(and)3.223 E F1<ad53>3.223 E F0 .722
+(options\) should be quoted to protect them from e)3.223 F(xpan-)-.15 E
+(sion before the)144 216 Q F1(complete)2.5 E F0 -.2(bu)2.5 G
+(iltin is in).2 E -.2(vo)-.4 G -.1(ke).2 G(d.).1 E F1<ad6f>144 228 Q F2
+(comp-option)2.5 E F0(The)184 240 Q F2(comp-option)2.79 E F0 .291
+(controls se)2.791 F -.15(ve)-.25 G .291(ral aspects of the compspec')
+.15 F 2.791(sb)-.55 G(eha)-2.791 E .291(vior be)-.2 F .291
+(yond the simple)-.15 F(generation of completions.)184 252 Q F2
+(comp-option)5 E F0(may be one of:)2.5 E F1(bashdefault)184 264 Q F0
+.281(Perform the rest of the def)224 276 R(ault)-.1 E F1(bash)2.781 E F0
+.281(completions if the compspec generates no)2.781 F(matches.)224 288 Q
+F1(default)184 300 Q F0 2.875(Use readline')10 F 5.375(sd)-.55 G(ef)
+-5.375 E 2.876(ault \214lename completion if the compspec generates no)
+-.1 F(matches.)224 312 Q F1(dir)184 324 Q(names)-.15 E F0(Perform direc\
+tory name completion if the compspec generates no matches.)224 336 Q F1
+(\214lenames)184 348 Q F0 -.7(Te)224 360 S .137(ll readline that the co\
+mpspec generates \214lenames, so it can perform an).7 F 2.636<798c>-.15
+G(le-)-2.636 E .496(name\255speci\214c processing \(lik)224 372 R 2.996
+(ea)-.1 G .496(dding a slash to directory names or suppress-)-2.996 F
+(ing trailing spaces\).)224 384 Q
+(Intended to be used with shell functions.)5 E F1(nospace)184 396 Q F0
+-.7(Te)6.11 G .22(ll readline not to append a space \(the def).7 F .22
+(ault\) to w)-.1 F .22(ords completed at the end)-.1 F(of the line.)224
+408 Q F1<ad41>144 420 Q F2(action)2.5 E F0(The)184 432 Q F2(action)2.5 E
+F0(may be one of the follo)2.5 E
+(wing to generate a list of possible completions:)-.25 E F1(alias)184
+444 Q F0(Alias names.)20.55 E(May also be speci\214ed as)5 E F1<ad61>2.5
+E F0(.)A F1(arrayv)184 456 Q(ar)-.1 E F0(Array v)224 468 Q
+(ariable names.)-.25 E F1 4.7(binding Readline)184 480 R F0 -.1(ke)2.5 G
+2.5(yb)-.05 G(inding names.)-2.5 E F1 -.2(bu)184 492 S(iltin).2 E F0
+(Names of shell b)11.85 E(uiltin commands.)-.2 E
+(May also be speci\214ed as)5 E F1<ad62>2.5 E F0(.)A F1(command)184 504
+Q F0(Command names.)224 516 Q(May also be speci\214ed as)5 E F1<ad63>2.5
+E F0(.)A F1(dir)184 528 Q(ectory)-.18 E F0(Directory names.)224 540 Q
+(May also be speci\214ed as)5 E F1<ad64>2.5 E F0(.)A F1(disabled)184 552
+Q F0(Names of disabled shell b)224 564 Q(uiltins.)-.2 E F1(enabled)184
+576 Q F0(Names of enabled shell b)6.66 E(uiltins.)-.2 E F1(export)184
+588 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 F1(\214le)184
+600 Q F0(File names.)27.22 E(May also be speci\214ed as)5 E F1<ad66>2.5
+E F0(.)A F1(function)184 612 Q F0(Names of shell functions.)224 624 Q F1
+(gr)184 636 Q(oup)-.18 E F0(Group names.)14.62 E
+(May also be speci\214ed as)5 E F1<ad67>2.5 E F0(.)A F1(helptopic)184
+648 Q F0(Help topics as accepted by the)224 660 Q F1(help)2.5 E F0 -.2
+(bu)2.5 G(iltin.).2 E F1(hostname)184 672 Q F0(Hostnames, as tak)224 684
+Q(en from the \214le speci\214ed by the)-.1 E/F3 9/Times-Bold@0 SF
+(HOSTFILE)2.5 E F0(shell v)2.25 E(ariable.)-.25 E F1(job)184 696 Q F0
+(Job names, if job control is acti)26.11 E -.15(ve)-.25 G 5(.M).15 G
+(ay also be speci\214ed as)-5 E F1<ad6a>2.5 E F0(.)A(GNU Bash-3.0)72 768
+Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(34)-2.5 G(6)-197.965 E 0 Cg EP
+%%Page: 47 47
+%%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 -.1(ke)184 84 S(yw).1 E(ord)-.1 E F0
+(Shell reserv)224 96 Q(ed w)-.15 E 2.5(ords. May)-.1 F
+(also be speci\214ed as)2.5 E F1<ad6b>2.5 E F0(.)A F1(running)184 108 Q
+F0(Names of running jobs, if job control is acti)5.54 E -.15(ve)-.25 G
+(.).15 E F1(ser)184 120 Q(vice)-.1 E F0(Service names.)10.67 E
+(May also be speci\214ed as)5 E F1<ad73>2.5 E F0(.)A F1(setopt)184 132 Q
+F0 -1.11(Va)14.45 G(lid ar)1.11 E(guments for the)-.18 E F1<ad6f>2.5 E
+F0(option to the)2.5 E F1(set)2.5 E F0 -.2(bu)2.5 G(iltin.).2 E F1
+(shopt)184 144 Q F0(Shell option names as accepted by the)16.66 E F1
+(shopt)2.5 E F0 -.2(bu)2.5 G(iltin.).2 E F1(signal)184 156 Q F0
+(Signal names.)14.99 E F1(stopped)184 168 Q F0
+(Names of stopped jobs, if job control is acti)6.66 E -.15(ve)-.25 G(.)
+.15 E F1(user)184 180 Q F0(User names.)21.67 E
+(May also be speci\214ed as)5 E F1<ad75>2.5 E F0(.)A F1 -.1(va)184 192 S
+(riable).1 E F0(Names of all shell v)5.1 E 2.5(ariables. May)-.25 F
+(also be speci\214ed as)2.5 E F1<ad76>2.5 E F0(.)A F1<ad47>144 204 Q/F2
+10/Times-Italic@0 SF(globpat)2.5 E F0 1.41(The \214lename e)184 216 R
+1.411(xpansion pattern)-.15 F F2(globpat)3.911 E F0 1.411(is e)3.911 F
+1.411(xpanded to generate the possible comple-)-.15 F(tions.)184 228 Q
+F1<ad57>144 240 Q F2(wor)2.5 E(dlist)-.37 E F0(The)184 252 Q F2(wor)3.64
+E(dlist)-.37 E F0 1.14(is split using the characters in the)3.64 F/F3 9
+/Times-Bold@0 SF(IFS)3.64 E F0 1.139(special v)3.39 F 1.139
+(ariable as delimiters, and)-.25 F 2.007(each resultant w)184 264 R
+2.007(ord is e)-.1 F 4.507(xpanded. The)-.15 F 2.008
+(possible completions are the members of the)4.507 F
+(resultant list which match the w)184 276 Q(ord being completed.)-.1 E
+F1<ad43>144 288 Q F2(command)2.5 E(command)184 300 Q F0 1.056(is e)3.556
+F -.15(xe)-.15 G 1.056(cuted in a subshell en).15 F 1.056
+(vironment, and its output is used as the possible)-.4 F(completions.)
+184 312 Q F1<ad46>144 324 Q F2(function)2.5 E F0 1.18
+(The shell function)184 336 R F2(function)3.68 E F0 1.181(is e)3.681 F
+-.15(xe)-.15 G 1.181(cuted in the current shell en).15 F 3.681
+(vironment. When)-.4 F 1.181(it \214n-)3.681 F .932
+(ishes, the possible completions are retrie)184 348 R -.15(ve)-.25 G
+3.432(df).15 G .932(rom the v)-3.432 F .932(alue of the)-.25 F F3
+(COMPREPL)3.431 E(Y)-.828 E F0(array)3.181 E -.25(va)184 360 S(riable.)
+.25 E F1<ad58>144 372 Q F2(\214lterpat)2.5 E(\214lterpat)184 384 Q F0
+.733(is a pattern as used for \214lename e)3.233 F 3.233(xpansion. It)
+-.15 F .733(is applied to the list of possible)3.233 F 1.596
+(completions generated by the preceding options and ar)184 396 R 1.596
+(guments, and each completion)-.18 F(matching)184 408 Q F2(\214lterpat)
+3.204 E F0 .704(is remo)3.204 F -.15(ve)-.15 G 3.204(df).15 G .704
+(rom the list.)-3.204 F 3.204(Al)5.704 G(eading)-3.204 E F1(!)3.204 E F0
+(in)3.204 E F2(\214lterpat)3.205 E F0(ne)3.205 E -.05(ga)-.15 G .705
+(tes the pattern;).05 F(in this case, an)184 420 Q 2.5(yc)-.15 G
+(ompletion not matching)-2.5 E F2(\214lterpat)2.5 E F0(is remo)2.5 E
+-.15(ve)-.15 G(d.).15 E F1<ad50>144 432 Q F2(pr)2.5 E(e\214x)-.37 E(pr)
+184 444 Q(e\214x)-.37 E F0 .535(is added at the be)3.035 F .534
+(ginning of each possible completion after all other options ha)-.15 F
+-.15(ve)-.2 G(been applied.)184 456 Q F1<ad53>144 468 Q F2(suf)2.5 E
+2.81(\214x suf)-.18 F<8c78>-.18 E F0
+(is appended to each possible completion after all other options ha)2.5
+E .3 -.15(ve b)-.2 H(een applied.).15 E .466(The return v)144 484.8 R
+.466(alue is true unless an in)-.25 F -.25(va)-.4 G .466
+(lid option is supplied, an option other than).25 F F1<ad70>2.967 E F0
+(or)2.967 E F1<ad72>2.967 E F0 .467(is sup-)2.967 F 1.362
+(plied without a)144 496.8 R F2(name)3.862 E F0(ar)3.862 E 1.361
+(gument, an attempt is made to remo)-.18 F 1.661 -.15(ve a c)-.15 H
+1.361(ompletion speci\214cation for a).15 F F2(name)144 508.8 Q F0
+(for which no speci\214cation e)2.5 E
+(xists, or an error occurs adding a completion speci\214cation.)-.15 E
+F1(continue)108 525.6 Q F0([)2.5 E F2(n)A F0(])A 1.753(Resume the ne)144
+537.6 R 1.753(xt iteration of the enclosing)-.15 F F1 -.25(fo)4.254 G(r)
+.25 E F0(,)A F1(while)4.254 E F0(,)A F1(until)4.254 E F0 4.254(,o)C(r)
+-4.254 E F1(select)4.254 E F0 4.254(loop. If)4.254 F F2(n)4.614 E F0
+1.754(is speci\214ed,)4.494 F 1.209(resume at the)144 549.6 R F2(n)3.709
+E F0 1.209(th enclosing loop.)B F2(n)6.569 E F0 1.209(must be)3.949 F/F4
+10/Symbol SF<b3>3.709 E F0 3.709(1. If)3.709 F F2(n)4.069 E F0 1.209
+(is greater than the number of enclosing)3.949 F .667
+(loops, the last enclosing loop \(the `)144 561.6 R(`top-le)-.74 E -.15
+(ve)-.25 G(l').15 E 3.167('l)-.74 G .667(oop\) is resumed.)-3.167 F .668
+(The return v)5.668 F .668(alue is 0 unless the)-.25 F(shell is not e)
+144 573.6 Q -.15(xe)-.15 G(cuting a loop when).15 E F1(continue)2.5 E F0
+(is e)2.5 E -.15(xe)-.15 G(cuted.).15 E F1(declar)108 590.4 Q(e)-.18 E
+F0([)2.5 E F1(\255afFirtx)A F0 2.5(][)C F1<ad70>-2.5 E F0 2.5(][)C F2
+(name)-2.5 E F0([=)A F2(value)A F0 2.5(].)C(..])-2.5 E F1(typeset)108
+602.4 Q F0([)2.5 E F1(\255afFirtx)A F0 2.5(][)C F1<ad70>-2.5 E F0 2.5
+(][)C F2(name)-2.5 E F0([=)A F2(value)A F0 2.5(].)C(..])-2.5 E 1.265
+(Declare v)144 614.4 R 1.265(ariables and/or gi)-.25 F 1.565 -.15(ve t)
+-.25 H 1.265(hem attrib).15 F 3.765(utes. If)-.2 F(no)3.765 E F2(name)
+3.765 E F0 3.765(sa)C 1.265(re gi)-3.765 F -.15(ve)-.25 G 3.764(nt).15 G
+1.264(hen display the v)-3.764 F 1.264(alues of)-.25 F -.25(va)144 626.4
+S 3.326(riables. The).25 F F1<ad70>3.326 E F0 .826
+(option will display the attrib)3.326 F .826(utes and v)-.2 F .826
+(alues of each)-.25 F F2(name)3.326 E F0 5.827(.W).18 G(hen)-5.827 E F1
+<ad70>3.327 E F0 .827(is used,)3.327 F .22
+(additional options are ignored.)144 638.4 R(The)5.22 E F1<ad46>2.72 E
+F0 .22(option inhibits the display of function de\214nitions; only the)
+2.72 F .466(function name and attrib)144 650.4 R .466(utes are printed.)
+-.2 F .466(If the)5.466 F F1(extdeb)2.966 E(ug)-.2 E F0 .466
+(shell option is enabled using)2.966 F F1(shopt)2.966 E F0 2.966(,t)C
+(he)-2.966 E 1.308(source \214le name and line number where the functio\
+n is de\214ned are displayed as well.)144 662.4 R(The)6.308 E F1<ad46>
+3.808 E F0 .19(option implies)144 674.4 R F1<ad66>2.69 E F0 5.19(.T)C
+.19(he follo)-5.19 F .191
+(wing options can be used to restrict output to v)-.25 F .191
+(ariables with the speci-)-.25 F(\214ed attrib)144 686.4 Q(ute or to gi)
+-.2 E .3 -.15(ve v)-.25 H(ariables attrib)-.1 E(utes:)-.2 E F1<ad61>144
+698.4 Q F0(Each)25.3 E F2(name)2.5 E F0(is an array v)2.5 E
+(ariable \(see)-.25 E F1(Arrays)2.5 E F0(abo)2.5 E -.15(ve)-.15 G(\).)
+.15 E F1<ad66>144 710.4 Q F0(Use function names only)26.97 E(.)-.65 E
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(34)-2.5 G
+(7)-197.965 E 0 Cg EP
+%%Page: 48 48
+%%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<ad69>144 84 Q F0 .558(The v)27.52 F .558
+(ariable is treated as an inte)-.25 F .558(ger; arithmetic e)-.15 F -.25
+(va)-.25 G .558(luation \(see).25 F/F2 9/Times-Bold@0 SF .557
+(ARITHMETIC EV)3.058 F(ALU)-1.215 E(A-)-.54 E(TION \))180 96 Q F0
+(is performed when the v)2.25 E(ariable is assigned a v)-.25 E(alue.)
+-.25 E F1<ad72>144 108 Q F0(Mak)25.86 E(e)-.1 E/F3 10/Times-Italic@0 SF
+(name)5.046 E F0 5.046(sr)C(eadonly)-5.046 E 7.546(.T)-.65 G 2.546
+(hese names cannot then be assigned v)-7.546 F 2.547
+(alues by subsequent)-.25 F(assignment statements or unset.)180 120 Q F1
+<ad74>144 132 Q F0(Gi)26.97 E 1.231 -.15(ve e)-.25 H(ach).15 E F3(name)
+3.431 E F0(the)3.431 E F3(tr)3.431 E(ace)-.15 E F0(attrib)3.431 E 3.431
+(ute. T)-.2 F .931(raced functions inherit the)-.35 F F1(DEB)3.431 E(UG)
+-.1 E F0 .93(trap from the)3.43 F(calling shell.)180 144 Q
+(The trace attrib)5 E(ute has no special meaning for v)-.2 E(ariables.)
+-.25 E F1<ad78>144 156 Q F0(Mark)25.3 E F3(name)2.5 E F0 2.5(sf)C(or e)
+-2.5 E(xport to subsequent commands via the en)-.15 E(vironment.)-.4 E
+.336(Using `+' instead of `\255' turns of)144 172.8 R 2.837(ft)-.25 G
+.337(he attrib)-2.837 F .337(ute instead, with the e)-.2 F .337
+(xception that)-.15 F F1(+a)2.837 E F0 .337(may not be used)2.837 F .793
+(to destro)144 184.8 R 3.293(ya)-.1 G 3.293(na)-3.293 G .793(rray v)
+-3.293 F 3.293(ariable. When)-.25 F .793(used in a function, mak)3.293 F
+.793(es each)-.1 F F3(name)3.293 E F0 .793(local, as with the)3.293 F F1
+(local)3.292 E F0 2.842(command. If)144 196.8 R 2.842(av)2.842 G .342
+(ariable name is follo)-3.092 F .342(wed by =)-.25 F F3(value)A F0 2.842
+(,t)C .342(he v)-2.842 F .342(alue of the v)-.25 F .343
+(ariable is set to)-.25 F F3(value)2.843 E F0 5.343(.T)C(he)-5.343 E
+.801(return v)144 208.8 R .801(alue is 0 unless an in)-.25 F -.25(va)-.4
+G .8
+(lid option is encountered, an attempt is made to de\214ne a function)
+.25 F(using)144 220.8 Q/F4 10/Courier@0 SF 1.038(\255f foo=bar)3.538 F
+F0 3.538(,a)C 3.538(na)-3.538 G 1.038(ttempt is made to assign a v)
+-3.538 F 1.038(alue to a readonly v)-.25 F 1.039(ariable, an attempt is)
+-.25 F .974(made to assign a v)144 232.8 R .974(alue to an array v)-.25
+F .974(ariable without using the compound assignment syntax \(see)-.25 F
+F1(Arrays)144 244.8 Q F0(abo)2.86 E -.15(ve)-.15 G .36(\), one of the)
+.15 F F3(names)2.86 E F0 .36(is not a v)2.86 F .36(alid shell v)-.25 F
+.36(ariable name, an attempt is made to turn of)-.25 F(f)-.25 E .057
+(readonly status for a readonly v)144 256.8 R .057
+(ariable, an attempt is made to turn of)-.25 F 2.556(fa)-.25 G .056
+(rray status for an array v)-2.556 F(ari-)-.25 E
+(able, or an attempt is made to display a non-e)144 268.8 Q
+(xistent function with)-.15 E F1<ad66>2.5 E F0(.)A F1
+(dirs [\255clpv] [+)108 285.6 Q F3(n)A F1 2.5(][)C<ad>-2.5 E F3(n)A F1
+(])A F0 -.4(Wi)144 297.6 S .328
+(thout options, displays the list of currently remembered directories.)
+.4 F .329(The def)5.329 F .329(ault display is on a)-.1 F 1.238
+(single line with directory names separated by spaces.)144 309.6 R 1.238
+(Directories are added to the list with the)6.238 F F1(pushd)144 321.6 Q
+F0(command; the)2.5 E F1(popd)2.5 E F0(command remo)2.5 E -.15(ve)-.15 G
+2.5(se).15 G(ntries from the list.)-2.5 E F1(+)144 333.6 Q F3(n)A F0
+1.564(Displays the)25.3 F F3(n)4.064 E F0 1.565
+(th entry counting from the left of the list sho)B 1.565(wn by)-.25 F F1
+(dirs)4.065 E F0 1.565(when in)4.065 F -.2(vo)-.4 G -.1(ke).2 G(d).1 E
+(without options, starting with zero.)180 345.6 Q F1<ad>144 357.6 Q F3
+(n)A F0 1.194(Displays the)25.3 F F3(n)3.694 E F0 1.194
+(th entry counting from the right of the list sho)B 1.194(wn by)-.25 F
+F1(dirs)3.694 E F0 1.194(when in)3.694 F -.2(vo)-.4 G -.1(ke).2 G(d).1 E
+(without options, starting with zero.)180 369.6 Q F1<ad63>144 381.6 Q F0
+(Clears the directory stack by deleting all of the entries.)25.86 E F1
+<ad6c>144 393.6 Q F0 .324(Produces a longer listing; the def)27.52 F
+.324(ault listing format uses a tilde to denote the home direc-)-.1 F
+(tory)180 405.6 Q(.)-.65 E F1<ad70>144 417.6 Q F0
+(Print the directory stack with one entry per line.)24.74 E F1<ad76>144
+429.6 Q F0 .273(Print the directory stack with one entry per line, pre\
+\214xing each entry with its inde)25.3 F 2.772(xi)-.15 G 2.772(nt)-2.772
+G(he)-2.772 E(stack.)180 441.6 Q .257(The return v)144 458.4 R .258
+(alue is 0 unless an in)-.25 F -.25(va)-.4 G .258
+(lid option is supplied or).25 F F3(n)2.758 E F0(inde)2.758 E -.15(xe)
+-.15 G 2.758(sb).15 G -.15(ey)-2.758 G .258(ond the end of the direc-)
+.15 F(tory stack.)144 470.4 Q F1(diso)108 487.2 Q(wn)-.1 E F0([)2.5 E F1
+(\255ar)A F0 2.5(][)C F1<ad68>-2.5 E F0 2.5(][)C F3(jobspec)-2.5 E F0
+(...])2.5 E -.4(Wi)144 499.2 S .331(thout options, each).4 F F3(jobspec)
+4.571 E F0 .331(is remo)3.141 F -.15(ve)-.15 G 2.831(df).15 G .331
+(rom the table of acti)-2.831 F .63 -.15(ve j)-.25 H 2.83(obs. If).15 F
+(the)2.83 E F1<ad68>2.83 E F0 .33(option is gi)2.83 F -.15(ve)-.25 G(n,)
+.15 E(each)144 511.2 Q F3(jobspec)4.52 E F0 .28(is not remo)3.09 F -.15
+(ve)-.15 G 2.78(df).15 G .28(rom the table, b)-2.78 F .28(ut is mark)-.2
+F .28(ed so that)-.1 F F2(SIGHUP)2.78 E F0 .281
+(is not sent to the job if)2.53 F .224(the shell recei)144 523.2 R -.15
+(ve)-.25 G 2.724(sa).15 G F2(SIGHUP)A/F5 9/Times-Roman@0 SF(.)A F0 .224
+(If no)4.724 F F3(jobspec)4.464 E F0 .224(is present, and neither the)
+3.034 F F1<ad61>2.724 E F0 .224(nor the)2.724 F F1<ad72>2.724 E F0 .223
+(option is sup-)2.724 F .651(plied, the)144 535.2 R F3(curr)3.151 E .651
+(ent job)-.37 F F0 .651(is used.)3.151 F .652(If no)5.651 F F3(jobspec)
+4.892 E F0 .652(is supplied, the)3.462 F F1<ad61>3.152 E F0 .652
+(option means to remo)3.152 F .952 -.15(ve o)-.15 H 3.152(rm).15 G(ark)
+-3.152 E .435(all jobs; the)144 547.2 R F1<ad72>2.935 E F0 .435
+(option without a)2.935 F F3(jobspec)4.675 E F0(ar)3.245 E .434
+(gument restricts operation to running jobs.)-.18 F .434(The return)
+5.434 F -.25(va)144 559.2 S(lue is 0 unless a).25 E F3(jobspec)4.24 E F0
+(does not specify a v)2.81 E(alid job)-.25 E(.)-.4 E F1(echo)108 576 Q
+F0([)2.5 E F1(\255neE)A F0 2.5(][)C F3(ar)-2.5 E(g)-.37 E F0(...])2.5 E
+.394(Output the)144 588 R F3(ar)2.894 E(g)-.37 E F0 .394
+(s, separated by spaces, follo)B .395(wed by a ne)-.25 F 2.895
+(wline. The)-.25 F .395(return status is al)2.895 F -.1(wa)-.1 G .395
+(ys 0.).1 F(If)5.395 E F1<ad6e>2.895 E F0 .549
+(is speci\214ed, the trailing ne)144 600 R .548(wline is suppressed.)
+-.25 F .548(If the)5.548 F F1<ad65>3.048 E F0 .548(option is gi)3.048 F
+-.15(ve)-.25 G .548(n, interpretation of the fol-).15 F(lo)144 612 Q
+.052(wing backslash-escaped characters is enabled.)-.25 F(The)5.052 E F1
+<ad45>2.552 E F0 .053(option disables the interpretation of these)2.553
+F 1.503(escape characters, e)144 624 R -.15(ve)-.25 G 4.003(no).15 G
+4.003(ns)-4.003 G 1.502(ystems where the)-4.003 F 4.002(ya)-.15 G 1.502
+(re interpreted by def)-4.002 F 4.002(ault. The)-.1 F F1(xpg_echo)4.002
+E F0(shell)4.002 E .009
+(option may be used to dynamically determine whether or not)144 636 R F1
+(echo)2.509 E F0 -.15(ex)2.51 G .01(pands these escape characters).15 F
+.66(by def)144 648 R(ault.)-.1 E F1(echo)5.66 E F0 .66
+(does not interpret)3.16 F F1<adad>3.16 E F0 .659
+(to mean the end of options.)3.159 F F1(echo)5.659 E F0 .659
+(interprets the follo)3.159 F(wing)-.25 E(escape sequences:)144 660 Q F1
+(\\a)144 672 Q F0(alert \(bell\))28.22 E F1(\\b)144 684 Q F0(backspace)
+27.66 E F1(\\c)144 696 Q F0(suppress trailing ne)28.78 E(wline)-.25 E F1
+(\\e)144 708 Q F0(an escape character)28.78 E(GNU Bash-3.0)72 768 Q
+(2003 No)147.975 E 2.5(v1)-.15 G 197.965(34)-2.5 G(8)-197.965 E 0 Cg EP
+%%Page: 49 49
+%%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(\\f)144 84 Q F0(form feed)29.89 E F1(\\n)
+144 96 Q F0(ne)27.66 E 2.5(wl)-.25 G(ine)-2.5 E F1(\\r)144 108 Q F0
+(carriage return)28.78 E F1(\\t)144 120 Q F0(horizontal tab)29.89 E F1
+(\\v)144 132 Q F0 -.15(ve)28.22 G(rtical tab).15 E F1(\\\\)144 144 Q F0
+(backslash)30.44 E F1(\\0)144 156 Q/F2 10/Times-Italic@0 SF(nnn)A F0
+(the eight-bit character whose v)13.22 E(alue is the octal v)-.25 E
+(alue)-.25 E F2(nnn)2.5 E F0(\(zero to three octal digits\))2.5 E F1(\\)
+144 168 Q F2(nnn)A F0(the eight-bit character whose v)18.22 E
+(alue is the octal v)-.25 E(alue)-.25 E F2(nnn)2.5 E F0
+(\(one to three octal digits\))2.5 E F1(\\x)144 180 Q F2(HH)A F0
+(the eight-bit character whose v)13.78 E(alue is the he)-.25 E
+(xadecimal v)-.15 E(alue)-.25 E F2(HH)2.5 E F0(\(one or tw)2.5 E 2.5(oh)
+-.1 G .3 -.15(ex d)-2.5 H(igits\)).15 E F1(enable)108 196.8 Q F0([)2.5 E
+F1(\255adnps)A F0 2.5(][)C F1<ad66>-2.5 E F2(\214lename)2.5 E F0 2.5(][)
+C F2(name)-2.5 E F0(...])2.5 E .277(Enable and disable b)144 208.8 R
+.278(uiltin shell commands.)-.2 F .278(Disabling a b)5.278 F .278
+(uiltin allo)-.2 F .278(ws a disk command which has)-.25 F .834
+(the same name as a shell b)144 220.8 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.333(nt).15 G(hough)-3.333 E .989
+(the shell normally searches for b)144 232.8 R .989
+(uiltins before disk commands.)-.2 F(If)5.989 E F1<ad6e>3.489 E F0 .99
+(is used, each)3.49 F F2(name)3.49 E F0 .99(is dis-)3.49 F 1.582
+(abled; otherwise,)144 244.8 R F2(names)4.082 E F0 1.582(are enabled.)
+4.082 F -.15(Fo)6.582 G 4.082(re).15 G 1.582(xample, to use the)-4.232 F
+F1(test)4.082 E F0 1.582(binary found via the)4.082 F/F3 9/Times-Bold@0
+SF -.666(PA)4.081 G(TH)-.189 E F0 .08(instead of the shell b)144 256.8 R
+.08(uiltin v)-.2 F .08(ersion, run)-.15 F/F4 10/Courier@0 SF .081
+(enable -n test)2.58 F F0 5.081(.T)C(he)-5.081 E F1<ad66>2.581 E F0 .081
+(option means to load the ne)2.581 F(w)-.25 E -.2(bu)144 268.8 S 1.525
+(iltin command).2 F F2(name)4.385 E F0 1.524(from shared object)4.204 F
+F2(\214lename)4.024 E F0 4.024(,o).18 G 4.024(ns)-4.024 G 1.524
+(ystems that support dynamic loading.)-4.024 F(The)144 280.8 Q F1<ad64>
+2.866 E F0 .366(option will delete a b)2.866 F .366(uiltin pre)-.2 F
+.366(viously loaded with)-.25 F F1<ad66>2.867 E F0 5.367(.I)C 2.867(fn)
+-5.367 G(o)-2.867 E F2(name)2.867 E F0(ar)2.867 E .367(guments are gi)
+-.18 F -.15(ve)-.25 G .367(n, or).15 F .399(if the)144 292.8 R F1<ad70>
+2.899 E F0 .399(option is supplied, a list of shell b)2.899 F .399
+(uiltins is printed.)-.2 F -.4(Wi)5.399 G .399(th no other option ar).4
+F .398(guments, the)-.18 F .098(list consists of all enabled shell b)144
+304.8 R 2.598(uiltins. If)-.2 F F1<ad6e>2.598 E F0 .098
+(is supplied, only disabled b)2.598 F .099(uiltins are printed.)-.2 F
+(If)5.099 E F1<ad61>2.599 E F0 1.917
+(is supplied, the list printed includes all b)144 316.8 R 1.916
+(uiltins, with an indication of whether or not each is)-.2 F 2.878
+(enabled. If)144 328.8 R F1<ad73>2.878 E F0 .379
+(is supplied, the output is restricted to the POSIX)2.878 F F2(special)
+2.879 E F0 -.2(bu)2.879 G 2.879(iltins. The).2 F .379(return v)2.879 F
+(alue)-.25 E .995(is 0 unless a)144 340.8 R F2(name)3.855 E F0 .994
+(is not a shell b)3.675 F .994(uiltin or there is an error loading a ne)
+-.2 F 3.494(wb)-.25 G .994(uiltin from a shared)-3.694 F(object.)144
+352.8 Q F1 -2.3 -.15(ev a)108 369.6 T(l).15 E F0([)2.5 E F2(ar)A(g)-.37
+E F0(...])2.5 E(The)144 381.6 Q F2(ar)3.17 E(g)-.37 E F0 3.17(sa)C .671
+(re read and concatenated together into a single command.)-3.17 F .671
+(This command is then read)5.671 F .495(and e)144 393.6 R -.15(xe)-.15 G
+.495(cuted by the shell, and its e).15 F .495
+(xit status is returned as the v)-.15 F .495(alue of)-.25 F F1 -2.3 -.15
+(ev a)2.995 H(l).15 E F0 5.495(.I)C 2.995(ft)-5.495 G .495(here are no)
+-2.995 F F2(ar)2.995 E(gs)-.37 E F0(,).27 E(or only null ar)144 405.6 Q
+(guments,)-.18 E F1 -2.3 -.15(ev a)2.5 H(l).15 E F0(returns 0.)2.5 E F1
+(exec)108 422.4 Q F0([)2.5 E F1(\255cl)A F0 2.5(][)C F1<ad61>-2.5 E F2
+(name)2.5 E F0 2.5(][)C F2(command)-2.5 E F0([)2.5 E F2(ar)A(guments)
+-.37 E F0(]])A(If)144 434.4 Q F2(command)3.005 E F0 .305
+(is speci\214ed, it replaces the shell.)3.575 F .305(No ne)5.305 F 2.805
+(wp)-.25 G .306(rocess is created.)-2.805 F(The)5.306 E F2(ar)3.136 E
+(guments)-.37 E F0(become)3.076 E .177(the ar)144 446.4 R .177
+(guments to)-.18 F F2(command)2.676 E F0 5.176(.I)C 2.676(ft)-5.176 G
+(he)-2.676 E F1<ad6c>2.676 E F0 .176
+(option is supplied, the shell places a dash at the be)2.676 F .176
+(ginning of)-.15 F .159(the zeroth ar)144 458.4 R 2.659(gp)-.18 G .159
+(assed to)-2.659 F F2(command)2.659 E F0 5.159(.T).77 G .159
+(his is what)-5.159 F F2(lo)2.659 E(gin)-.1 E F0 .159(\(1\) does.).24 F
+(The)5.16 E F1<ad63>2.66 E F0 .16(option causes)2.66 F F2(command)2.86 E
+F0(to)3.43 E 1.196(be e)144 470.4 R -.15(xe)-.15 G 1.196
+(cuted with an empty en).15 F 3.696(vironment. If)-.4 F F1<ad61>3.696 E
+F0 1.196(is supplied, the shell passes)3.696 F F2(name)4.055 E F0 1.195
+(as the zeroth)3.875 F(ar)144 482.4 Q .02(gument to the e)-.18 F -.15
+(xe)-.15 G .02(cuted command.).15 F(If)5.02 E F2(command)2.72 E F0 .02
+(cannot be e)3.29 F -.15(xe)-.15 G .02
+(cuted for some reason, a non-inter).15 F(-)-.2 E(acti)144 494.4 Q 1.067
+-.15(ve s)-.25 H .767(hell e).15 F .767(xits, unless the shell option)
+-.15 F F1(execfail)3.266 E F0 .766
+(is enabled, in which case it returns f)3.266 F 3.266(ailure. An)-.1 F
+(interacti)144 506.4 Q 1.518 -.15(ve s)-.25 H 1.218(hell returns f).15 F
+1.219(ailure if the \214le cannot be e)-.1 F -.15(xe)-.15 G 3.719
+(cuted. If).15 F F2(command)3.919 E F0 1.219(is not speci\214ed, an)
+4.489 F(y)-.15 E .134(redirections tak)144 518.4 R 2.634(ee)-.1 G -.25
+(ff)-2.634 G .134(ect in the current shell, and the return status is 0.)
+.25 F .134(If there is a redirection error)5.134 F(,)-.4 E
+(the return status is 1.)144 530.4 Q F1(exit)108 547.2 Q F0([)2.5 E F2
+(n)A F0 6.29(]C)C .095(ause the shell to e)-6.29 F .095
+(xit with a status of)-.15 F F2(n)2.595 E F0 5.095(.I)C(f)-5.095 E F2(n)
+2.955 E F0 .096(is omitted, the e)2.835 F .096
+(xit status is that of the last command)-.15 F -.15(exe)144 559.2 S 2.5
+(cuted. A).15 F(trap on)2.5 E F3(EXIT)2.5 E F0(is e)2.25 E -.15(xe)-.15
+G(cuted before the shell terminates.).15 E F1(export)108 576 Q F0([)2.5
+E F1(\255fn)A F0 2.5(][).833 G F2(name)-2.5 E F0([=)A F2(wor)A(d)-.37 E
+F0(]] ...)A F1(export \255p)108 588 Q F0 .257(The supplied)144 600 R F2
+(names)3.117 E F0 .257(are mark)3.027 F .257(ed for automatic e)-.1 F
+.257(xport to the en)-.15 F .257(vironment of subsequently e)-.4 F -.15
+(xe)-.15 G(cuted).15 E 2.626(commands. If)144 612 R(the)2.626 E F1<ad66>
+2.626 E F0 .127(option is gi)2.627 F -.15(ve)-.25 G .127(n, the).15 F F2
+(names)2.987 E F0 .127(refer to functions.)2.897 F .127(If no)5.127 F F2
+(names)2.987 E F0 .127(are gi)2.897 F -.15(ve)-.25 G .127(n, or if the)
+.15 F F1<ad70>144 624 Q F0 .66
+(option is supplied, a list of all names that are e)3.16 F .659
+(xported in this shell is printed.)-.15 F(The)5.659 E F1<ad6e>3.159 E F0
+(option)3.159 E 1.586(causes the e)144 636 R 1.586
+(xport property to be remo)-.15 F -.15(ve)-.15 G 4.086(df).15 G 1.586
+(rom each)-4.086 F F2(name)4.086 E F0 6.586(.I)C 4.086(fav)-6.586 G
+1.587(ariable name is follo)-4.336 F 1.587(wed by)-.25 F(=)144 648 Q F2
+(wor)A(d)-.37 E F0 2.804(,t)C .304(he v)-2.804 F .304(alue of the v)-.25
+F .304(ariable is set to)-.25 F F2(wor)2.804 E(d)-.37 E F0(.)A F1
+(export)5.304 E F0 .304(returns an e)2.804 F .303
+(xit status of 0 unless an in)-.15 F -.25(va)-.4 G(lid).25 E .293
+(option is encountered, one of the)144 660 R F2(names)2.793 E F0 .293
+(is not a v)2.793 F .293(alid shell v)-.25 F .293(ariable name, or)-.25
+F F1<ad66>2.793 E F0 .294(is supplied with a)2.793 F F2(name)144.36 672
+Q F0(that is not a function.)2.68 E F1(fc)108 688.8 Q F0([)2.5 E F1
+<ad65>A F2(ename)2.5 E F0 2.5(][)C F1(\255nlr)-2.5 E F0 2.5(][)C F2
+<8c72>-2.5 E(st)-.1 E F0 2.5(][)C F2(last)-2.5 E F0(])A F1(fc \255s)108
+700.8 Q F0([)2.5 E F2(pat)A F0(=)A F2 -.37(re)C(p).37 E F0 2.5(][)C F2
+(cmd)-2.5 E F0(])A .478(Fix Command.)144 712.8 R .478
+(In the \214rst form, a range of commands from)5.478 F F2<8c72>4.888 E
+(st)-.1 E F0(to)3.658 E F2(last)3.068 E F0 .477
+(is selected from the his-)3.658 F .881(tory list.)144 724.8 R F2 -.45
+(Fi)5.881 G -.1(rs).45 G(t).1 E F0(and)4.061 E F2(last)3.471 E F0 .882
+(may be speci\214ed as a string \(to locate the last command be)4.062 F
+.882(ginning with)-.15 F(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)
+-.15 G 197.965(34)-2.5 G(9)-197.965 E 0 Cg EP
+%%Page: 50 50
+%%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 .797(that string\) or as a number \(an inde)144 84 R 3.297(xi)
+-.15 G .797(nto the history list, where a ne)-3.297 F -.05(ga)-.15 G(ti)
+.05 E 1.097 -.15(ve n)-.25 H .796(umber is used as an).15 F(of)144 96 Q
+.276(fset from the current command number\).)-.25 F(If)5.276 E/F1 10
+/Times-Italic@0 SF(last)2.866 E F0 .277
+(is not speci\214ed it is set to the current command)3.456 F .093
+(for listing \(so that)144 108 R/F2 10/Courier@0 SF .092
+(fc \255l \25510)2.592 F F0 .092(prints the last 10 commands\) and to)
+2.592 F F1<8c72>4.502 E(st)-.1 E F0 2.592(otherwise. If)3.272 F F1<8c72>
+4.502 E(st)-.1 E F0 .092(is not)3.272 F
+(speci\214ed it is set to the pre)144 120 Q
+(vious command for editing and \25516 for listing.)-.25 E(The)144 144 Q
+/F3 10/Times-Bold@0 SF<ad6e>2.522 E F0 .022
+(option suppresses the command numbers when listing.)2.522 F(The)5.022 E
+F3<ad72>2.522 E F0 .022(option re)2.522 F -.15(ve)-.25 G .022
+(rses the order of).15 F .438(the commands.)144 156 R .438(If the)5.438
+F F3<ad6c>2.938 E F0 .438(option is gi)2.938 F -.15(ve)-.25 G .438
+(n, the commands are listed on standard output.).15 F(Otherwise,)5.438 E
+.334(the editor gi)144 168 R -.15(ve)-.25 G 2.834(nb).15 G(y)-2.834 E F1
+(ename)3.024 E F0 .335(is in)3.014 F -.2(vo)-.4 G -.1(ke).2 G 2.835(do)
+.1 G 2.835(na\214)-2.835 G .335(le containing those commands.)-2.835 F
+(If)5.335 E F1(ename)3.025 E F0 .335(is not gi)3.015 F -.15(ve)-.25 G
+(n,).15 E .631(the v)144 180 R .631(alue of the)-.25 F/F4 9/Times-Bold@0
+SF(FCEDIT)3.131 E F0 -.25(va)2.881 G .631(riable is used, and the v).25
+F .631(alue of)-.25 F F4(EDIT)3.131 E(OR)-.162 E F0(if)2.881 E F4
+(FCEDIT)3.13 E F0 .63(is not set.)2.88 F .63(If nei-)5.63 F .95(ther v)
+144 192 R .95(ariable is set,)-.25 F F1(vi)5.116 E F0 .95(is used.)5.116
+F .951(When editing is complete, the edited commands are echoed and)5.95
+F -.15(exe)144 204 S(cuted.).15 E .04(In the second form,)144 228 R F1
+(command)2.54 E F0 .04(is re-e)2.54 F -.15(xe)-.15 G .039
+(cuted after each instance of).15 F F1(pat)2.539 E F0 .039
+(is replaced by)2.539 F F1 -.37(re)2.539 G(p).37 E F0 5.039(.A)C(useful)
+-2.5 E .406(alias to use with this is)144 240 R F2 .406(r='fc \255s')
+2.906 F F0 2.906(,s)C 2.906(ot)-2.906 G .406(hat typing)-2.906 F F2
+6.406(rc)2.906 G(c)-6.406 E F0 .406(runs the last command be)2.906 F
+.407(ginning with)-.15 F F2(cc)144 252 Q F0(and typing)2.5 E F2(r)2.5 E
+F0(re-e)2.5 E -.15(xe)-.15 G(cutes the last command.).15 E .142
+(If the \214rst form is used, the return v)144 276 R .142
+(alue is 0 unless an in)-.25 F -.25(va)-.4 G .142
+(lid option is encountered or).25 F F1<8c72>4.552 E(st)-.1 E F0(or)3.322
+E F1(last)2.732 E F0 .454(specify history lines out of range.)144 288 R
+.454(If the)5.454 F F3<ad65>2.954 E F0 .454
+(option is supplied, the return v)2.954 F .455(alue is the v)-.25 F .455
+(alue of the)-.25 F .788(last command e)144 300 R -.15(xe)-.15 G .788
+(cuted or f).15 F .787
+(ailure if an error occurs with the temporary \214le of commands.)-.1 F
+.787(If the)5.787 F 1.135
+(second form is used, the return status is that of the command re-e)144
+312 R -.15(xe)-.15 G 1.136(cuted, unless).15 F F1(cmd)3.836 E F0 1.136
+(does not)4.406 F(specify a v)144 324 Q
+(alid history line, in which case)-.25 E F3(fc)2.5 E F0(returns f)2.5 E
+(ailure.)-.1 E F3(fg)108 340.8 Q F0([)2.5 E F1(jobspec)A F0(])A(Resume)
+144 352.8 Q F1(jobspec)5.654 E F0 1.413(in the fore)4.224 F 1.413
+(ground, and mak)-.15 F 3.913(ei)-.1 G 3.913(tt)-3.913 G 1.413
+(he current job)-3.913 F 6.413(.I)-.4 G(f)-6.413 E F1(jobspec)5.653 E F0
+1.413(is not present, the)4.223 F(shell')144 364.8 Q 3.116(sn)-.55 G
+.616(otion of the)-3.116 F F1(curr)3.116 E .616(ent job)-.37 F F0 .617
+(is used.)3.116 F .617(The return v)5.617 F .617
+(alue is that of the command placed into the)-.25 F(fore)144 376.8 Q
+.363(ground, or f)-.15 F .363
+(ailure if run when job control is disabled or)-.1 F 2.862(,w)-.4 G .362
+(hen run with job control enabled, if)-2.862 F F1(jobspec)145.74 388.8 Q
+F0 .004(does not specify a v)2.814 F .004(alid job or)-.25 F F1(jobspec)
+4.244 E F0 .004(speci\214es a job that w)2.814 F .004
+(as started without job control.)-.1 F F3(getopts)108 405.6 Q F1
+(optstring name)2.5 E F0([)2.5 E F1(ar)A(gs)-.37 E F0(])A F3(getopts)144
+417.6 Q F0 .793
+(is used by shell procedures to parse positional parameters.)3.294 F F1
+(optstring)6.023 E F0 .793(contains the option)3.513 F .149
+(characters to be recognized; if a character is follo)144 429.6 R .15
+(wed by a colon, the option is e)-.25 F .15(xpected to ha)-.15 F .45
+-.15(ve a)-.2 H(n).15 E(ar)144 441.6 Q .579
+(gument, which should be separated from it by white space.)-.18 F .578
+(The colon and question mark char)5.579 F(-)-.2 E 1.665
+(acters may not be used as option characters.)144 453.6 R 1.665
+(Each time it is in)6.665 F -.2(vo)-.4 G -.1(ke).2 G(d,).1 E F3(getopts)
+4.165 E F0 1.665(places the ne)4.165 F(xt)-.15 E .797
+(option in the shell v)144 465.6 R(ariable)-.25 E F1(name)3.297 E F0
+3.297(,i).18 G(nitializing)-3.297 E F1(name)3.657 E F0 .797
+(if it does not e)3.477 F .796(xist, and the inde)-.15 F 3.296(xo)-.15 G
+3.296(ft)-3.296 G .796(he ne)-3.296 F(xt)-.15 E(ar)144 477.6 Q .085
+(gument to be processed into the v)-.18 F(ariable)-.25 E F4(OPTIND)2.585
+E/F5 9/Times-Roman@0 SF(.)A F4(OPTIND)4.585 E F0 .085
+(is initialized to 1 each time the shell)2.335 F .846
+(or a shell script is in)144 489.6 R -.2(vo)-.4 G -.1(ke).2 G 3.345
+(d. When).1 F .845(an option requires an ar)3.345 F(gument,)-.18 E F3
+(getopts)3.345 E F0 .845(places that ar)3.345 F(gument)-.18 E .803
+(into the v)144 501.6 R(ariable)-.25 E F4(OPT)3.303 E(ARG)-.81 E F5(.)A
+F0 .803(The shell does not reset)5.303 F F4(OPTIND)3.303 E F0 .804
+(automatically; it must be manually)3.054 F .294
+(reset between multiple calls to)144 513.6 R F3(getopts)2.793 E F0 .293
+(within the same shell in)2.793 F -.2(vo)-.4 G .293(cation if a ne).2 F
+2.793(ws)-.25 G .293(et of parameters)-2.793 F(is to be used.)144 525.6
+Q 2.043(When the end of options is encountered,)144 549.6 R F3(getopts)
+4.543 E F0 -.15(ex)4.543 G 2.043(its with a return v).15 F 2.044
+(alue greater than zero.)-.25 F F3(OPTIND)144 561.6 Q F0
+(is set to the inde)2.5 E 2.5(xo)-.15 G 2.5(ft)-2.5 G
+(he \214rst non-option ar)-2.5 E(gument, and)-.18 E F3(name)2.5 E F0
+(is set to ?.)2.5 E F3(getopts)144 585.6 Q F0 2.393
+(normally parses the positional parameters, b)4.893 F 2.392
+(ut if more ar)-.2 F 2.392(guments are gi)-.18 F -.15(ve)-.25 G 4.892
+(ni).15 G(n)-4.892 E F1(ar)4.892 E(gs)-.37 E F0(,).27 E F3(getopts)144
+597.6 Q F0(parses those instead.)2.5 E F3(getopts)144 621.6 Q F0 1.165
+(can report errors in tw)3.665 F 3.665(ow)-.1 G 3.665(ays. If)-3.765 F
+1.165(the \214rst character of)3.665 F F1(optstring)3.895 E F0 1.166
+(is a colon,)3.886 F F1(silent)4.006 E F0(error)4.346 E 1.264
+(reporting is used.)144 633.6 R 1.263
+(In normal operation diagnostic messages are printed when in)6.263 F
+-.25(va)-.4 G 1.263(lid options or).25 F .393(missing option ar)144
+645.6 R .393(guments are encountered.)-.18 F .394(If the v)5.394 F
+(ariable)-.25 E F4(OPTERR)2.894 E F0 .394
+(is set to 0, no error messages)2.644 F(will be displayed, e)144 657.6 Q
+-.15(ve)-.25 G 2.5(ni).15 G 2.5(ft)-2.5 G(he \214rst character of)-2.5 E
+F1(optstring)2.73 E F0(is not a colon.)2.72 E .667(If an in)144 681.6 R
+-.25(va)-.4 G .667(lid option is seen,).25 F F3(getopts)3.167 E F0 .667
+(places ? into)3.167 F F1(name)3.527 E F0 .666
+(and, if not silent, prints an error message)3.347 F .399(and unsets)144
+693.6 R F4(OPT)2.899 E(ARG)-.81 E F5(.)A F0(If)4.899 E F3(getopts)2.899
+E F0 .399(is silent, the option character found is placed in)2.899 F F4
+(OPT)2.899 E(ARG)-.81 E F0 .4(and no)2.65 F
+(diagnostic message is printed.)144 705.6 Q 1.242(If a required ar)144
+729.6 R 1.242(gument is not found, and)-.18 F F3(getopts)3.741 E F0
+1.241(is not silent, a question mark \()3.741 F F3(?).833 E F0 3.741
+(\)i).833 G 3.741(sp)-3.741 G 1.241(laced in)-3.741 F(GNU Bash-3.0)72
+768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(35)-2.5 G(0)-197.965 E 0
+Cg EP
+%%Page: 51 51
+%%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-Italic@0 SF(name)144 84 Q F0(,).18 E/F2 9
+/Times-Bold@0 SF(OPT)2.734 E(ARG)-.81 E F0 .234
+(is unset, and a diagnostic message is printed.)2.484 F(If)5.234 E/F3 10
+/Times-Bold@0 SF(getopts)2.734 E F0 .235(is silent, then a colon \()
+2.734 F F3(:).833 E F0(\)).833 E(is placed in)144 96 Q F1(name)2.86 E F0
+(and)2.68 E F2(OPT)2.5 E(ARG)-.81 E F0
+(is set to the option character found.)2.25 E F3(getopts)144 120 Q F0
+.902(returns true if an option, speci\214ed or unspeci\214ed, is found.)
+3.402 F .902(It returns f)5.902 F .901(alse if the end of)-.1 F
+(options is encountered or an error occurs.)144 132 Q F3(hash)108 148.8
+Q F0([)2.5 E F3(\255lr)A F0 2.5(][)C F3<ad70>-2.5 E F1(\214lename)2.5 E
+F0 2.5(][)C F3(\255dt)-2.5 E F0 2.5(][)C F1(name)-2.5 E F0(])A -.15(Fo)
+144 160.8 S 3.554(re).15 G(ach)-3.554 E F1(name)3.554 E F0 3.554(,t).18
+G 1.054(he full \214le name of the command is determined by searching t\
+he directories in)-3.554 F F3($P)144 172.8 Q -.95(AT)-.74 G(H).95 E F0
+.35(and remembered.)2.85 F .35(If the)5.35 F F3<ad70>2.85 E F0 .349
+(option is supplied, no path search is performed, and)2.849 F F1
+(\214lename)4.759 E F0 .452
+(is used as the full \214le name of the command.)144 184.8 R(The)5.452 E
+F3<ad72>2.952 E F0 .452(option causes the shell to for)2.952 F .453
+(get all remem-)-.18 F .593(bered locations.)144 196.8 R(The)5.593 E F3
+<ad64>3.093 E F0 .593(option causes the shell to for)3.093 F .592
+(get the remembered location of each)-.18 F F1(name)3.092 E F0(.)A .02
+(If the)144 208.8 R F3<ad74>2.52 E F0 .02
+(option is supplied, the full pathname to which each)2.52 F F1(name)
+2.521 E F0 .021(corresponds is printed.)2.521 F .021(If multi-)5.021 F
+(ple)144 220.8 Q F1(name)3.704 E F0(ar)3.704 E 1.204
+(guments are supplied with)-.18 F F3<ad74>3.703 E F0 3.703(,t)C(he)
+-3.703 E F1(name)3.703 E F0 1.203
+(is printed before the hashed full pathname.)3.703 F(The)144 232.8 Q F3
+<ad6c>3.215 E F0 .715(option causes output to be displayed in a format \
+that may be reused as input.)3.215 F .716(If no ar)5.716 F(gu-)-.18 E
+1.184(ments are gi)144 244.8 R -.15(ve)-.25 G 1.184(n, or if only).15 F
+F3<ad6c>3.684 E F0 1.183
+(is supplied, information about remembered commands is printed.)3.684 F
+(The return status is true unless a)144 256.8 Q F1(name)2.86 E F0
+(is not found or an in)2.68 E -.25(va)-.4 G(lid option is supplied.).25
+E F3(help)108 273.6 Q F0([)2.5 E F3<ad73>A F0 2.5(][)C F1(pattern)-2.5 E
+F0(])A .866(Display helpful information about b)144 285.6 R .867
+(uiltin commands.)-.2 F(If)5.867 E F1(pattern)4.617 E F0 .867
+(is speci\214ed,)3.607 F F3(help)3.367 E F0(gi)3.367 E -.15(ve)-.25 G
+3.367(sd).15 G(etailed)-3.367 E .307(help on all commands matching)144
+297.6 R F1(pattern)2.807 E F0 2.807(;o).24 G .307
+(therwise help for all the b)-2.807 F .306
+(uiltins and shell control struc-)-.2 F .596(tures is printed.)144 309.6
+R(The)5.596 E F3<ad73>3.096 E F0 .596
+(option restricts the information displayed to a short usage synopsis.)
+3.096 F(The)5.596 E(return status is 0 unless no command matches)144
+321.6 Q F1(pattern)2.5 E F0(.).24 E F3(history [)108 338.4 Q F1(n)A F3
+(])A(history \255c)108 350.4 Q(history \255d)108 362.4 Q F1(of)2.5 E
+(fset)-.18 E F3(history \255anrw)108 374.4 Q F0([)2.5 E F1(\214lename)A
+F0(])A F3(history \255p)108 386.4 Q F1(ar)2.5 E(g)-.37 E F0([)2.5 E F1
+(ar)A 2.5(g.)-.37 G(..)-2.5 E F0(])A F3(history \255s)108 398.4 Q F1(ar)
+2.5 E(g)-.37 E F0([)2.5 E F1(ar)A 2.5(g.)-.37 G(..)-2.5 E F0(])A -.4(Wi)
+144 410.4 S .752
+(th no options, display the command history list with line numbers.).4 F
+.752(Lines listed with a)5.752 F F3(*)3.251 E F0(ha)3.251 E -.15(ve)-.2
+G 1.23(been modi\214ed.)144 422.4 R 1.23(An ar)6.23 F 1.23(gument of)
+-.18 F F1(n)4.09 E F0 1.231(lists only the last)3.97 F F1(n)4.091 E F0
+3.731(lines. If)3.971 F 1.231(the shell v)3.731 F(ariable)-.25 E F3
+(HISTTIME-)3.731 E(FORMA)144 434.4 Q(T)-.95 E F0 .25
+(is set and not null, it is used as a format string for)2.75 F F1
+(strftime)2.749 E F0 .249(\(3\) to display the time stamp)B .378
+(associated with each displayed history entry)144 446.4 R 5.378(.N)-.65
+G 2.878(oi)-5.378 G(nterv)-2.878 E .379
+(ening blank is printed between the format-)-.15 F .815
+(ted time stamp and the history line.)144 458.4 R(If)5.814 E F1
+(\214lename)3.314 E F0 .814
+(is supplied, it is used as the name of the history)3.314 F
+(\214le; if not, the v)144 470.4 Q(alue of)-.25 E F2(HISTFILE)2.5 E F0
+(is used.)2.25 E(Options, if supplied, ha)5 E .3 -.15(ve t)-.2 H
+(he follo).15 E(wing meanings:)-.25 E F3<ad63>144 482.4 Q F0
+(Clear the history list by deleting all the entries.)25.86 E F3<ad64>144
+494.4 Q F1(of)2.5 E(fset)-.18 E F0(Delete the history entry at position)
+180 506.4 Q F1(of)2.5 E(fset)-.18 E F0(.)A F3<ad61>144 518.4 Q F0 .598
+(Append the `)25.3 F(`ne)-.74 E(w')-.25 E 3.098('h)-.74 G .598
+(istory lines \(history lines entered since the be)-3.098 F .599
+(ginning of the current)-.15 F F3(bash)180 530.4 Q F0
+(session\) to the history \214le.)2.5 E F3<ad6e>144 542.4 Q F0 .854(Rea\
+d the history lines not already read from the history \214le into the c\
+urrent history list.)24.74 F .772
+(These are lines appended to the history \214le since the be)180 554.4 R
+.773(ginning of the current)-.15 F F3(bash)3.273 E F0(ses-)3.273 E
+(sion.)180 566.4 Q F3<ad72>144 578.4 Q F0(Read the contents of the hist\
+ory \214le and use them as the current history)25.86 E(.)-.65 E F3<ad77>
+144 590.4 Q F0(Write the current history to the history \214le, o)23.08
+E -.15(ve)-.15 G(rwriting the history \214le').15 E 2.5(sc)-.55 G
+(ontents.)-2.5 E F3<ad70>144 602.4 Q F0 .626
+(Perform history substitution on the follo)24.74 F(wing)-.25 E F1(ar)
+3.125 E(gs)-.37 E F0 .625(and display the result on the standard)3.125 F
+2.975(output. Does)180 614.4 R .475
+(not store the results in the history list.)2.975 F(Each)5.475 E F1(ar)
+2.975 E(g)-.37 E F0 .475(must be quoted to disable)2.975 F
+(normal history e)180 626.4 Q(xpansion.)-.15 E F3<ad73>144 638.4 Q F0
+.363(Store the)26.41 F F1(ar)3.193 E(gs)-.37 E F0 .363
+(in the history list as a single entry)3.133 F 5.363(.T)-.65 G .362
+(he last command in the history list is)-5.363 F(remo)180 650.4 Q -.15
+(ve)-.15 G 2.5(db).15 G(efore the)-2.5 E F1(ar)2.83 E(gs)-.37 E F0
+(are added.)2.77 E .28(If the)144 667.2 R F3(HISTTIMEFORMA)2.78 E(T)-.95
+E F0 .28
+(is set, the time stamp information associated with each history entry)
+2.78 F .216(is written to the history \214le.)144 679.2 R .216
+(The return v)5.216 F .216(alue is 0 unless an in)-.25 F -.25(va)-.4 G
+.216(lid option is encountered, an error).25 F .422
+(occurs while reading or writing the history \214le, an in)144 691.2 R
+-.25(va)-.4 G(lid).25 E F1(of)2.922 E(fset)-.18 E F0 .422
+(is supplied as an ar)2.922 F .422(gument to)-.18 F F3<ad64>2.922 E F0
+(,)A(or the history e)144 703.2 Q(xpansion supplied as an ar)-.15 E
+(gument to)-.18 E F3<ad70>2.5 E F0 -.1(fa)2.5 G(ils.).1 E(GNU Bash-3.0)
+72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(35)-2.5 G(1)-197.965 E
+0 Cg EP
+%%Page: 52 52
+%%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(jobs)108 84 Q F0([)2.5 E F1(\255lnprs)A F0
+2.5(][)C/F2 10/Times-Italic@0 SF(jobspec)A F0(... ])2.5 E F1(jobs \255x)
+108 96 Q F2(command)2.5 E F0([)2.5 E F2(ar)2.5 E(gs)-.37 E F0(... ])2.5
+E(The \214rst form lists the acti)144 108 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 F1<ad6c>144 120 Q F0
+(List process IDs in addition to the normal information.)27.52 E F1
+<ad70>144 132 Q F0(List only the process ID of the job')24.74 E 2.5(sp)
+-.55 G(rocess group leader)-2.5 E(.)-.55 E F1<ad6e>144 144 Q F0 .194
+(Display information only about jobs that ha)24.74 F .494 -.15(ve c)-.2
+H .193(hanged status since the user w).15 F .193(as last noti-)-.1 F
+(\214ed of their status.)180 156 Q F1<ad72>144 168 Q F0
+(Restrict output to running jobs.)25.86 E F1<ad73>144 180 Q F0
+(Restrict output to stopped jobs.)26.41 E(If)144 196.8 Q F2(jobspec)
+4.553 E F0 .313(is gi)3.123 F -.15(ve)-.25 G .313
+(n, output is restricted to information about that job).15 F 5.314(.T)
+-.4 G .314(he return status is 0 unless)-5.314 F(an in)144 208.8 Q -.25
+(va)-.4 G(lid option is encountered or an in).25 E -.25(va)-.4 G(lid).25
+E F2(jobspec)4.24 E F0(is supplied.)2.81 E .395(If the)144 225.6 R F1
+<ad78>2.895 E F0 .394(option is supplied,)2.894 F F1(jobs)2.894 E F0
+.394(replaces an)2.894 F(y)-.15 E F2(jobspec)4.634 E F0 .394(found in)
+3.204 F F2(command)3.094 E F0(or)3.664 E F2(ar)3.224 E(gs)-.37 E F0 .394
+(with the corre-)3.164 F(sponding process group ID, and e)144 237.6 Q
+-.15(xe)-.15 G(cutes).15 E F2(command)2.7 E F0(passing it)3.27 E F2(ar)
+2.5 E(gs)-.37 E F0 2.5(,r).27 G(eturning its e)-2.5 E(xit status.)-.15 E
+F1(kill)108 254.4 Q F0([)2.5 E F1<ad73>A F2(sigspec)2.5 E F0(|)2.5 E F1
+<ad6e>2.5 E F2(signum)2.5 E F0(|)2.5 E F1<ad>2.5 E F2(sigspec)A F0 2.5
+(][)C F2(pid)-2.5 E F0(|)2.5 E F2(jobspec)2.5 E F0 2.5(].)C(..)-2.5 E F1
+(kill \255l)108 266.4 Q F0([)2.5 E F2(sigspec)A F0(|)2.5 E F2 -.2(ex)2.5
+G(it_status).2 E F0(])A .119(Send the signal named by)144 278.4 R F2
+(sigspec)2.959 E F0(or)2.929 E F2(signum)2.959 E F0 .119
+(to the processes named by)2.939 F F2(pid)3.87 E F0(or)3.39 E F2
+(jobspec)2.62 E F0(.).31 E F2(sigspec)5.46 E F0(is)2.93 E .048
+(either a signal name such as)144 290.4 R/F3 9/Times-Bold@0 SF(SIGKILL)
+2.548 E F0 .047(or a signal number;)2.298 F F2(signum)2.887 E F0 .047
+(is a signal number)2.867 F 5.047(.I)-.55 G(f)-5.047 E F2(sigspec)2.887
+E F0(is)2.857 E 3.394(as)144 302.4 S .894
+(ignal name, the name may be gi)-3.394 F -.15(ve)-.25 G 3.394(nw).15 G
+.894(ith or without the)-3.394 F F3(SIG)3.394 E F0 3.394(pre\214x. If)
+3.144 F F2(sigspec)3.734 E F0 .894(is not present,)3.704 F(then)144
+314.4 Q F3(SIGTERM)3.073 E F0 .572(is assumed.)2.822 F .572(An ar)5.572
+F .572(gument of)-.18 F F1<ad6c>3.072 E F0 .572(lists the signal names.)
+3.072 F .572(If an)5.572 F 3.072(ya)-.15 G -.18(rg)-3.072 G .572
+(uments are sup-).18 F .267(plied when)144 326.4 R F1<ad6c>2.767 E F0
+.267(is gi)2.767 F -.15(ve)-.25 G .267
+(n, the names of the signals corresponding to the ar).15 F .267
+(guments are listed, and the)-.18 F .288(return status is 0.)144 338.4 R
+(The)5.288 E F2 -.2(ex)2.788 G(it_status).2 E F0(ar)2.788 E .288
+(gument to)-.18 F F1<ad6c>2.788 E F0 .287
+(is a number specifying either a signal number or)2.788 F .551(the e)144
+350.4 R .551(xit status of a process terminated by a signal.)-.15 F F1
+(kill)5.551 E F0 .551(returns true if at least one signal w)3.051 F .552
+(as suc-)-.1 F(cessfully sent, or f)144 362.4 Q
+(alse if an error occurs or an in)-.1 E -.25(va)-.4 G
+(lid option is encountered.).25 E F1(let)108 379.2 Q F2(ar)2.5 E(g)-.37
+E F0([)2.5 E F2(ar)A(g)-.37 E F0(...])2.5 E(Each)144 391.2 Q F2(ar)3.965
+E(g)-.37 E F0 1.135(is an arithmetic e)3.855 F 1.134(xpression to be e)
+-.15 F -.25(va)-.25 G 1.134(luated \(see).25 F F3 1.134(ARITHMETIC EV)
+3.634 F(ALU)-1.215 E -.855(AT)-.54 G(ION).855 E/F4 9/Times-Roman@0 SF
+(\).)A F0 1.134(If the)5.634 F(last)144 403.2 Q F2(ar)2.83 E(g)-.37 E F0
+-.25(eva)2.72 G(luates to 0,).25 E F1(let)2.5 E F0
+(returns 1; 0 is returned otherwise.)2.5 E F1(local)108 420 Q F0([)2.5 E
+F2(option)A F0 2.5(][)C F2(name)-2.5 E F0([=)A F2(value)A F0 2.5(].)C
+(..])-2.5 E -.15(Fo)144 432 S 2.56(re).15 G .06(ach ar)-2.56 F .06
+(gument, a local v)-.18 F .06(ariable named)-.25 F F2(name)2.92 E F0 .06
+(is created, and assigned)2.74 F F2(value)2.56 E F0 5.06(.T).18 G(he)
+-5.06 E F2(option)2.56 E F0 .06(can be)2.56 F(an)144 444 Q 3.153(yo)-.15
+G 3.153(ft)-3.153 G .653(he options accepted by)-3.153 F F1(declar)3.153
+E(e)-.18 E F0 5.652(.W)C(hen)-5.652 E F1(local)3.152 E F0 .652
+(is used within a function, it causes the v)3.152 F(ari-)-.25 E(able)144
+456 Q F2(name)3.72 E F0 .86(to ha)3.54 F 1.16 -.15(ve a v)-.2 H .861
+(isible scope restricted to that function and its children.).15 F -.4
+(Wi)5.861 G .861(th no operands,).4 F F1(local)144 468 Q F0 1.165
+(writes a list of local v)3.665 F 1.165
+(ariables to the standard output.)-.25 F 1.165(It is an error to use)
+6.165 F F1(local)3.664 E F0 1.164(when not)3.664 F .232
+(within a function.)144 480 R .233(The return status is 0 unless)5.232 F
+F1(local)2.733 E F0 .233(is used outside a function, an in)2.733 F -.25
+(va)-.4 G(lid).25 E F2(name)3.093 E F0(is)2.913 E(supplied, or)144 492 Q
+F2(name)2.5 E F0(is a readonly v)2.5 E(ariable.)-.25 E F1(logout)108
+508.8 Q F0(Exit a login shell.)9.33 E F1(popd)108 525.6 Q F0<5bad>2.5 E
+F1(n)A F0 2.5(][)C(+)-2.5 E F2(n)A F0 2.5(][)C<ad>-2.5 E F2(n)A F0(])A
+(Remo)144 537.6 Q -.15(ve)-.15 G 2.8(se).15 G .3
+(ntries from the directory stack.)-2.8 F -.4(Wi)5.299 G .299(th no ar).4
+F .299(guments, remo)-.18 F -.15(ve)-.15 G 2.799(st).15 G .299
+(he top directory from the)-2.799 F 1.478(stack, and performs a)144
+549.6 R F1(cd)3.978 E F0 1.479(to the ne)3.978 F 3.979(wt)-.25 G 1.479
+(op directory)-3.979 F 6.479(.A)-.65 G -.18(rg)-6.479 G 1.479
+(uments, if supplied, ha).18 F 1.779 -.15(ve t)-.2 H 1.479(he follo).15
+F(wing)-.25 E(meanings:)144 561.6 Q F1(+)144 573.6 Q F2(n)A F0(Remo)25.3
+E -.15(ve)-.15 G 2.64(st).15 G(he)-2.64 E F2(n)2.64 E F0 .14
+(th entry counting from the left of the list sho)B .14(wn by)-.25 F F1
+(dirs)2.64 E F0 2.64(,s)C .14(tarting with zero.)-2.64 F -.15(Fo)180
+585.6 S 2.5(re).15 G(xample:)-2.65 E/F5 10/Courier@0 SF(popd +0)2.5 E F0
+(remo)2.5 E -.15(ve)-.15 G 2.5(st).15 G(he \214rst directory)-2.5 E(,)
+-.65 E F5(popd +1)2.5 E F0(the second.)2.5 E F1<ad>144 597.6 Q F2(n)A F0
+(Remo)25.3 E -.15(ve)-.15 G 3.759(st).15 G(he)-3.759 E F2(n)3.759 E F0
+1.259(th entry counting from the right of the list sho)B 1.26(wn by)-.25
+F F1(dirs)3.76 E F0 3.76(,s)C 1.26(tarting with)-3.76 F 2.5(zero. F)180
+609.6 R(or e)-.15 E(xample:)-.15 E F5(popd -0)2.5 E F0(remo)2.5 E -.15
+(ve)-.15 G 2.5(st).15 G(he last directory)-2.5 E(,)-.65 E F5(popd -1)2.5
+E F0(the ne)2.5 E(xt to last.)-.15 E F1<ad6e>144 621.6 Q F0 .551
+(Suppresses the normal change of directory when remo)24.74 F .551
+(ving directories from the stack, so)-.15 F
+(that only the stack is manipulated.)180 633.6 Q .643(If the)144 650.4 R
+F1(popd)3.143 E F0 .643(command is successful, a)3.143 F F1(dirs)3.143 E
+F0 .644(is performed as well, and the return status is 0.)3.143 F F1
+(popd)5.644 E F0 .416(returns f)144 662.4 R .416(alse if an in)-.1 F
+-.25(va)-.4 G .415
+(lid option is encountered, the directory stack is empty).25 F 2.915
+(,an)-.65 G(on-e)-2.915 E .415(xistent direc-)-.15 F
+(tory stack entry is speci\214ed, or the directory change f)144 674.4 Q
+(ails.)-.1 E F1(printf)108 691.2 Q F2(format)2.5 E F0([)2.5 E F2(ar)A
+(guments)-.37 E F0(])A .372(Write the formatted)144 703.2 R F2(ar)2.872
+E(guments)-.37 E F0 .372
+(to the standard output under the control of the)2.872 F F2(format)2.872
+E F0 5.372(.T)C(he)-5.372 E F2(format)2.872 E F0 1.804(is a character s\
+tring which contains three types of objects: plain characters, which ar\
+e simply)144 715.2 R 1.858
+(copied to standard output, character escape sequences, which are con)
+144 727.2 R -.15(ve)-.4 G 1.859(rted and copied to the).15 F
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(35)-2.5 G
+(2)-197.965 E 0 Cg EP
+%%Page: 53 53
+%%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 1.172(standard output, and format speci\214cations, each of whic\
+h causes printing of the ne)144 84 R 1.171(xt successi)-.15 F -.15(ve)
+-.25 G/F1 10/Times-Italic@0 SF(ar)144 96 Q(gument)-.37 E F0 6.273(.I)C
+3.773(na)-6.273 G 1.274(ddition to the standard)-3.773 F F1(printf)3.774
+E F0 1.274(\(1\) formats,)B/F2 10/Times-Bold@0 SF(%b)3.774 E F0(causes)
+3.774 E F2(printf)3.774 E F0 1.274(to e)3.774 F 1.274(xpand backslash)
+-.15 F .62(escape sequences in the corresponding)144 108 R F1(ar)3.119 E
+(gument)-.37 E F0(\(e)3.119 E .619(xcept that)-.15 F F2(\\c)3.119 E F0
+.619(terminates output, backslashes in)3.119 F F2(\\')144 120 Q F0(,)A
+F2(\\")2.953 E F0 2.953(,a)C(nd)-2.953 E F2(\\?)2.954 E F0 .454
+(are not remo)2.954 F -.15(ve)-.15 G .454(d, and octal escapes be).15 F
+.454(ginning with)-.15 F F2(\\0)2.954 E F0 .454
+(may contain up to four digits\),)2.954 F(and)144 132 Q F2(%q)2.568 E F0
+(causes)2.568 E F2(printf)2.568 E F0 .068(to output the corresponding)
+2.568 F F1(ar)2.568 E(gument)-.37 E F0 .067
+(in a format that can be reused as shell)2.568 F(input.)144 144 Q(The)
+144 168 Q F1(format)3.423 E F0 .923
+(is reused as necessary to consume all of the)3.423 F F1(ar)3.423 E
+(guments)-.37 E F0 5.923(.I)C 3.423(ft)-5.923 G(he)-3.423 E F1(format)
+3.423 E F0 .924(requires more)3.424 F F1(ar)144 180 Q(guments)-.37 E F0
+.033(than are supplied, the e)2.534 F .033
+(xtra format speci\214cations beha)-.15 F .333 -.15(ve a)-.2 H 2.533(si)
+.15 G 2.533(faz)-2.533 G .033(ero v)-2.533 F .033(alue or null string,)
+-.25 F(as appropriate, had been supplied.)144 192 Q(The return v)5 E
+(alue is zero on success, non-zero on f)-.25 E(ailure.)-.1 E F2(pushd)
+108 208.8 Q F0([)2.5 E F2<ad6e>A F0 2.5(][)C F1(dir)-2.5 E F0(])A F2
+(pushd)108 220.8 Q F0([)2.5 E F2<ad6e>A F0 2.5(][)C(+)-2.5 E F1(n)A F0
+2.5(][)C<ad>-2.5 E F1(n)A F0(])A .639(Adds a directory to the top of th\
+e directory stack, or rotates the stack, making the ne)144 232.8 R 3.14
+(wt)-.25 G .64(op of the)-3.14 F 1.316(stack the current w)144 244.8 R
+1.316(orking directory)-.1 F 6.316(.W)-.65 G 1.315(ith no ar)-6.716 F
+1.315(guments, e)-.18 F 1.315(xchanges the top tw)-.15 F 3.815(od)-.1 G
+1.315(irectories and)-3.815 F .871
+(returns 0, unless the directory stack is empty)144 256.8 R 5.871(.A)
+-.65 G -.18(rg)-5.871 G .872(uments, if supplied, ha).18 F 1.172 -.15
+(ve t)-.2 H .872(he follo).15 F .872(wing mean-)-.25 F(ings:)144 268.8 Q
+F2(+)144 280.8 Q F1(n)A F0 1.268(Rotates the stack so that the)25.3 F F1
+(n)3.768 E F0 1.267
+(th directory \(counting from the left of the list sho)B 1.267(wn by)
+-.25 F F2(dirs)180 292.8 Q F0 2.5(,s)C
+(tarting with zero\) is at the top.)-2.5 E F2<ad>144 304.8 Q F1(n)A F0
+.92(Rotates the stack so that the)25.3 F F1(n)3.42 E F0 .92
+(th directory \(counting from the right of the list sho)B .92(wn by)-.25
+F F2(dirs)180 316.8 Q F0 2.5(,s)C(tarting with zero\) is at the top.)
+-2.5 E F2<ad6e>144 328.8 Q F0 .902(Suppresses the normal change of dire\
+ctory when adding directories to the stack, so that)24.74 F
+(only the stack is manipulated.)180 340.8 Q F1(dir)144.35 352.8 Q F0
+(Adds)23.98 E F1(dir)2.85 E F0
+(to the directory stack at the top, making it the ne)3.23 E 2.5(wc)-.25
+G(urrent w)-2.5 E(orking directory)-.1 E(.)-.65 E .488(If the)144 369.6
+R F2(pushd)2.988 E F0 .488(command is successful, a)2.988 F F2(dirs)
+2.988 E F0 .488(is performed as well.)2.988 F .489
+(If the \214rst form is used,)5.488 F F2(pushd)2.989 E F0 1.04
+(returns 0 unless the cd to)144 381.6 R F1(dir)3.89 E F0 -.1(fa)4.27 G
+3.539(ils. W).1 F 1.039(ith the second form,)-.4 F F2(pushd)3.539 E F0
+1.039(returns 0 unless the directory)3.539 F .846(stack is empty)144
+393.6 R 3.346(,an)-.65 G(on-e)-3.346 E .847(xistent directory stack ele\
+ment is speci\214ed, or the directory change to the)-.15 F
+(speci\214ed ne)144 405.6 Q 2.5(wc)-.25 G(urrent directory f)-2.5 E
+(ails.)-.1 E F2(pwd)108 422.4 Q F0([)2.5 E F2(\255LP)A F0(])A .845
+(Print the absolute pathname of the current w)144 434.4 R .845
+(orking directory)-.1 F 5.844(.T)-.65 G .844
+(he pathname printed contains no)-5.844 F .181(symbolic links if the)144
+446.4 R F2<ad50>2.681 E F0 .181(option is supplied or the)2.681 F F2
+.181(\255o ph)2.681 F(ysical)-.15 E F0 .181(option to the)2.681 F F2
+(set)2.681 E F0 -.2(bu)2.681 G .182(iltin command is).2 F 3.264
+(enabled. If)144 458.4 R(the)3.264 E F2<ad4c>3.264 E F0 .763
+(option is used, the pathname printed may contain symbolic links.)3.264
+F .763(The return)5.763 F 1.36(status is 0 unless an error occurs while\
+ reading the name of the current directory or an in)144 470.4 R -.25(va)
+-.4 G(lid).25 E(option is supplied.)144 482.4 Q F2 -.18(re)108 499.2 S
+(ad).18 E F0([)2.5 E F2(\255ers)A F0 2.5(][)C F2<ad75>-2.5 E F1(fd)2.5 E
+F0 2.5(][)C F2<ad74>-2.5 E F1(timeout)2.5 E F0 2.5(][)C F2<ad61>-2.5 E
+F1(aname)2.5 E F0 2.5(][)C F2<ad70>-2.5 E F1(pr)2.5 E(ompt)-.45 E F0 2.5
+(][)C F2<ad6e>-2.5 E F1(nc)2.5 E(har)-.15 E(s)-.1 E F0 2.5(][)C F2<ad64>
+-2.5 E F1(delim)2.5 E F0 2.5(][)C F1(name)-2.5 E F0(...])2.5 E .516(One\
+ line is read from the standard input, or from the \214le descriptor)144
+511.2 R F1(fd)3.016 E F0 .516(supplied as an ar)3.016 F .516(gument to)
+-.18 F(the)144 523.2 Q F2<ad75>2.538 E F0 .038
+(option, and the \214rst w)2.538 F .038(ord is assigned to the \214rst)
+-.1 F F1(name)2.539 E F0 2.539(,t).18 G .039(he second w)-2.539 F .039
+(ord to the second)-.1 F F1(name)2.539 E F0(,).18 E .42
+(and so on, with lefto)144 535.2 R -.15(ve)-.15 G 2.92(rw).15 G .42
+(ords and their interv)-3.02 F .42
+(ening separators assigned to the last)-.15 F F1(name)2.92 E F0 5.42(.I)
+.18 G 2.92(ft)-5.42 G(here)-2.92 E .54(are fe)144 547.2 R .54(wer w)-.25
+F .541(ords read from the input stream than names, the remaining names \
+are assigned empty)-.1 F -.25(va)144 559.2 S 2.511(lues. The).25 F .011
+(characters in)2.511 F/F3 9/Times-Bold@0 SF(IFS)2.511 E F0 .011
+(are used to split the line into w)2.261 F 2.511(ords. The)-.1 F .011
+(backslash character \()2.511 F F2(\\)A F0 2.51(\)m)C(ay)-2.51 E 1.89
+(be used to remo)144 571.2 R 2.19 -.15(ve a)-.15 H 2.19 -.15(ny s).15 H
+1.891(pecial meaning for the ne).15 F 1.891
+(xt character read and for line continuation.)-.15 F
+(Options, if supplied, ha)144 583.2 Q .3 -.15(ve t)-.2 H(he follo).15 E
+(wing meanings:)-.25 E F2<ad61>144 595.2 Q F1(aname)2.5 E F0 1.05(The w)
+180 607.2 R 1.049
+(ords are assigned to sequential indices of the array v)-.1 F(ariable)
+-.25 E F1(aname)3.549 E F0 3.549(,s).18 G 1.049(tarting at 0.)-3.549 F
+F1(aname)180.33 619.2 Q F0(is unset before an)2.68 E 2.5(yn)-.15 G .5
+-.25(ew va)-2.5 H(lues are assigned.).25 E(Other)5 E F1(name)2.5 E F0
+(ar)2.5 E(guments are ignored.)-.18 E F2<ad64>144 631.2 Q F1(delim)2.5 E
+F0(The \214rst character of)180 643.2 Q F1(delim)2.5 E F0
+(is used to terminate the input line, rather than ne)2.5 E(wline.)-.25 E
+F2<ad65>144 655.2 Q F0 .372
+(If the standard input is coming from a terminal,)25.86 F F2 -.18(re)
+2.873 G(adline).18 E F0(\(see)2.873 E F3(READLINE)2.873 E F0(abo)2.623 E
+-.15(ve)-.15 G 2.873(\)i).15 G 2.873(su)-2.873 G(sed)-2.873 E
+(to obtain the line.)180 667.2 Q F2<ad6e>144 679.2 Q F1(nc)2.5 E(har)
+-.15 E(s)-.1 E F2 -.18(re)180 691.2 S(ad).18 E F0 1.395
+(returns after reading)3.895 F F1(nc)3.895 E(har)-.15 E(s)-.1 E F0 1.395
+(characters rather than w)3.895 F 1.394(aiting for a complete line of)
+-.1 F(input.)180 703.2 Q(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)
+-.15 G 197.965(35)-2.5 G(3)-197.965 E 0 Cg EP
+%%Page: 54 54
+%%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<ad70>144 84 Q/F2 10/Times-Italic@0 SF(pr)
+2.5 E(ompt)-.45 E F0(Display)180 96 Q F2(pr)3.66 E(ompt)-.45 E F0 1.161
+(on standard error)3.66 F 3.661(,w)-.4 G 1.161(ithout a trailing ne)
+-3.661 F 1.161(wline, before attempting to read)-.25 F(an)180 108 Q 2.5
+(yi)-.15 G 2.5(nput. The)-2.5 F
+(prompt is displayed only if input is coming from a terminal.)2.5 E F1
+<ad72>144 120 Q F0 .544(Backslash does not act as an escape character)
+25.86 F 5.543(.T)-.55 G .543(he backslash is considered to be part of)
+-5.543 F(the line.)180 132 Q(In particular)5 E 2.5(,ab)-.4 G
+(ackslash-ne)-2.5 E(wline pair may not be used as a line continuation.)
+-.25 E F1<ad73>144 144 Q F0(Silent mode.)26.41 E
+(If input is coming from a terminal, characters are not echoed.)5 E F1
+<ad74>144 156 Q F2(timeout)2.5 E F0(Cause)180 168 Q F1 -.18(re)3.548 G
+(ad).18 E F0 1.048(to time out and return f)3.548 F 1.048
+(ailure if a complete line of input is not read within)-.1 F F2(timeout)
+180 180 Q F0 2.92(seconds. This)2.92 F .42(option has no ef)2.92 F .42
+(fect if)-.25 F F1 -.18(re)2.92 G(ad).18 E F0 .42
+(is not reading input from the terminal)2.92 F(or a pipe.)180 192 Q F1
+<ad75>144 204 Q F2(fd)2.5 E/F3 10/Palatino-Roman@0 SF(Read input fr)
+14.46 E(om \214le descriptor)-.18 E/F4 10/Palatino-Italic@0 SF(fd)2.5 E
+F3(.)A .335(If no)144 220.8 R F4(names)3.095 E F3(ar)2.895 E 2.835(es)
+-.18 G .335(upplied, the line r)-2.835 F .336
+(ead is assigned to the variable)-.18 F/F5 9/Palatino-Bold@0 SF(REPL)
+2.836 E(Y)-.828 E/F6 9/Palatino-Roman@0 SF(.)A F3 .336(The r)4.836 F
+.336(eturn code)-.18 F 1.058(is zer)144 232.8 R 1.058
+(o, unless end-of-\214le is encounter)-.18 F(ed,)-.18 E/F7 10
+/Palatino-Bold@0 SF(read)3.558 E F3 1.058
+(times out, or an invalid \214le descriptor is)3.558 F
+(supplied as the ar)144 244.8 Q(gument to)-.18 E F7<ad75>2.5 E F3(.)A F7
+(readonly)108 261.6 Q F3([)2.5 E F7(\255apf)A F3 2.5(][)C F4(name)-2.5 E
+F3([=)A F4(word)A F3 2.5(].)C(..])-2.5 E .587(The given)144 273.6 R F4
+(names)3.087 E F3(ar)3.087 E 3.087(em)-.18 G .587(arked r)-3.087 F .587
+(eadonly; the values of these)-.18 F F4(names)3.347 E F3 .588
+(may not be changed by)3.148 F .833(subsequent assignment.)144 285.6 R
+.833(If the)5.833 F F7<ad66>3.333 E F3 .832
+(option is supplied, the functions corr)3.333 F .832(esponding to the)
+-.18 F F4(names)144 297.6 Q F3(ar)3.809 E 3.809(es)-.18 G 3.809(om)
+-3.809 G 3.809(arked. The)-3.809 F F7<ad61>3.809 E F3 1.309(option r)
+3.809 F 1.309(estricts the variables to arrays.)-.18 F 1.31(If no)6.31 F
+F4(name)4.07 E F3(ar)4.16 E(gu-)-.18 E 1.058(ments ar)144 309.6 R 3.557
+(eg)-.18 G 1.057(iven, or if the)-3.557 F F7<ad70>3.557 E F3 1.057
+(option is supplied, a list of all r)3.557 F 1.057
+(eadonly names is printed.)-.18 F(The)144 321.6 Q F7<ad70>2.577 E F3
+.077(option causes output to be displayed in a format that may be r)
+2.577 F .078(eused as input.)-.18 F .078(If a)5.078 F .903
+(variable name is followed by =)144 333.6 R F4(word)A F3 3.403(,t)C .902
+(he value of the variable is set to)-3.403 F F4(word)3.402 E F3 5.902
+(.T)C .902(he r)-5.902 F(eturn)-.18 E .997
+(status is 0 unless an invalid option is encounter)144 345.6 R .998
+(ed, one of the)-.18 F F4(names)3.758 E F3 .998(is not a valid shell)
+3.558 F(variable name, or)144 357.6 Q F7<ad66>2.5 E F3
+(is supplied with a)2.5 E F4(name)2.76 E F3(that is not a function.)2.85
+E F7(return)108 374.4 Q F3([)2.5 E F4(n)A F3(])A .563
+(Causes a function to exit with the r)144 386.4 R .563
+(eturn value speci\214ed by)-.18 F F4(n)3.063 E F3 5.563(.I).08 G(f)
+-5.563 E F4(n)3.323 E F3 .563(is omitted, the r)3.143 F(eturn)-.18 E
+.544(status is that of the last command executed in the function body)
+144 398.4 R 5.545(.I)-1.11 G 3.045(fu)-5.545 G .545(sed outside a func-)
+-3.045 F 1.148(tion, but during execution of a script by the)144 410.4 R
+F7(.)3.648 E F3(\()6.148 E F7(source)A F3 3.648(\)c)C 1.148
+(ommand, it causes the shell to)-3.648 F .63
+(stop executing that script and r)144 422.4 R .63(eturn either)-.18 F F4
+(n)3.391 E F3 .631(or the exit status of the last command exe-)3.211 F
+.541(cuted within the script as the exit status of the script.)144 434.4
+R .54(If used outside a function and not)5.54 F .037
+(during execution of a script by)144 446.4 R F7(.)2.538 E F3 2.538(,t)
+.833 G .038(he r)-2.538 F .038(eturn status is false.)-.18 F .038
+(Any command associated with)5.038 F(the)144 458.4 Q F7(RETURN)2.5 E F3
+(trap is executed befor)2.5 E 2.5(ee)-.18 G(xecution r)-2.5 E
+(esumes after the function or script.)-.18 E F7(set)108 475.2 Q F3([)2.5
+E F7(\255\255abefhkmnptuvxBCHP)A F3 2.5(][)C F7<ad6f>-2.5 E F4(option)
+2.5 E F3 2.5(][)C F4(ar)-2.5 E(g)-.18 E F3(...])2.5 E -.55(Wi)144 487.2
+S .246(thout options, the name and value of each shell variable ar).55 F
+2.745(ed)-.18 G .245(isplayed in a format that)-2.745 F 2.183(can be r)
+144 499.2 R 2.183(eused as input.)-.18 F 2.184
+(The output is sorted accor)7.183 F 2.184(ding to the curr)-.18 F 2.184
+(ent locale.)-.18 F(When)7.184 E 1.006(options ar)144 511.2 R 3.506(es)
+-.18 G 1.006(peci\214ed, they set or unset shell attributes.)-3.506 F
+1.006(Any ar)6.006 F 1.005(guments r)-.18 F 1.005(emaining after)-.18 F
+1.981(the options ar)144 523.2 R 4.481(ep)-.18 G -.18(ro)-4.481 G 1.981
+(cessed ar).18 F 4.481(et)-.18 G -.18(re)-4.481 G 1.982
+(ated as values for the positional parameters and ar).18 F(e)-.18 E
+(assigned, in or)144 535.2 Q(der)-.18 E 2.5(,t)-.74 G(o)-2.5 E F7($1)2.5
+E F3(,)A F7($2)2.5 E F3(,)A F7 2.5(... $)2.5 F F4(n)A F3 5(.O)C
+(ptions, if speci\214ed, have the following meanings:)-5 E F7<ad61>144
+547.2 Q F3 1.063(Automatically mark variables and functions which ar)
+28.94 F 3.563(em)-.18 G 1.063(odi\214ed or cr)-3.563 F 1.063(eated for)
+-.18 F(export to the envir)184 559.2 Q(onment of subsequent commands.)
+-.18 E F7<ad62>144 571.2 Q F3 .096
+(Report the status of terminated backgr)27.83 F .096
+(ound jobs immediately)-.18 F 2.596(,r)-1.11 G .096(ather than befor)
+-2.596 F(e)-.18 E(the next primary pr)184 583.2 Q 2.5(ompt. This)-.18 F
+(is ef)2.5 E(fective only when job contr)-.18 E(ol is enabled.)-.18 E F7
+<ad65>144 595.2 Q F3 .179(Exit immediately if a)28.94 F F4 .178
+(simple command)2.679 F F3(\(see)2.678 E F5 .178(SHELL GRAMMAR)2.678 F
+F3 .178(above\) exits with a)2.428 F(non-zer)184 607.2 Q 3.232(os)-.18 G
+3.232(tatus. The)-3.232 F .733
+(shell does not exit if the command that fails is part of the)3.232 F
+.696(command list immediately following a)184 619.2 R F7(while)3.196 E
+F3(or)3.196 E F7(until)3.196 E F3(keywor)3.196 E .696
+(d, part of the test)-.18 F .98(in an)184 631.2 R F4(if)3.64 E F3 .98
+(statement, part of a)5.33 F F7(&&)3.48 E F3(or)3.481 E/F8 10/Symbol SF
+<efef>3.481 E F3 .981(list, or if the command's r)3.481 F .981
+(eturn value is)-.18 F(being inverted via)184 643.2 Q F7(!)2.5 E F3 5
+(.A)C(trap on)-2.5 E F7(ERR)2.5 E F3 2.5(,i)C 2.5(fs)-2.5 G
+(et, is executed befor)-2.5 E 2.5(et)-.18 G(he shell exits.)-2.5 E F7
+<ad66>144 655.2 Q F3(Disable pathname expansion.)30.05 E F7<ad68>144
+667.2 Q F3 .592(Remember the location of commands as they ar)27.83 F
+3.092(el)-.18 G .591(ooked up for execution.)-3.092 F(This)5.591 E
+(is enabled by default.)184 679.2 Q F7<ad6b>144 691.2 Q F3 .934(All ar)
+27.83 F .934(guments in the form of assignment statements ar)-.18 F
+3.434(ep)-.18 G .935(laced in the envir)-3.434 F(on-)-.18 E
+(ment for a command, not just those that pr)184 703.2 Q
+(ecede the command name.)-.18 E F7<ad6d>144 715.2 Q F3 .711
+(Monitor mode.)25.05 F .711(Job contr)5.711 F .711(ol is enabled.)-.18 F
+.711(This option is on by default for interac-)5.711 F 1.164
+(tive shells on systems that support it \(see)184 727.2 R F5 1.165
+(JOB CONTROL)3.665 F F3 3.665(above\). Backgr)3.415 F(ound)-.18 E F0
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(35)-2.5 G
+(4)-197.965 E 0 Cg EP
+%%Page: 55 55
+%%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/Palatino-Roman@0 SF(pr)184 84 Q .54(ocesses r)-.18 F .54
+(un in a separate pr)-.08 F .539(ocess gr)-.18 F .539
+(oup and a line containing their exit status)-.18 F
+(is printed upon their completion.)184 96 Q/F2 10/Palatino-Bold@0 SF
+<ad6e>144 108 Q F1 1.313(Read commands but do not execute them.)27.83 F
+1.313(This may be used to check a shell)6.313 F(script for syntax err)
+184 120 Q 2.5(ors. This)-.18 F(is ignor)2.5 E(ed by interactive shells.)
+-.18 E F2<ad6f>144 132 Q/F3 10/Palatino-Italic@0 SF(option\255name)2.5 E
+F1(The)184 144 Q F3(option\255name)2.5 E F1
+(can be one of the following:)2.5 E F2(allexport)184 156 Q F1(Same as)
+224 168 Q F2<ad61>2.5 E F1(.)A F2(braceexpand)184 180 Q F1(Same as)224
+192 Q F2<ad42>2.5 E F1(.)A F2(emacs)184 204 Q F1 .412
+(Use an emacs-style command line editing interface.)12.23 F .412
+(This is enabled by)5.412 F .358(default when the shell is interactive,\
+ unless the shell is started with the)224 216 R F2(\255\255noediting)224
+228 Q F1(option.)2.5 E F2(errtrace)184 240 Q F1(Same as)5.56 E F2<ad45>
+2.5 E F1(.)A F2(functrace)184 252 Q F1(Same as)224 264 Q F2<ad54>2.5 E
+F1(.)A F2(errexit)184 276 Q F1(Same as)10.56 E F2<ad65>2.5 E F1(.)A F2
+(hashall)184 288 Q F1(Same as)6.68 E F2<ad68>2.5 E F1(.)A F2(histexpand)
+184 300 Q F1(Same as)224 312 Q F2<ad48>2.5 E F1(.)A F2(history)184 324 Q
+F1 2.271(Enable command history)7.78 F 4.771(,a)-1.11 G 4.771(sd)-4.771
+G 2.271(escribed above under)-4.771 F/F4 9/Palatino-Bold@0 SF(HISTOR)
+4.771 E(Y)-.495 E/F5 9/Palatino-Roman@0 SF(.)A F1(This)6.77 E
+(option is on by default in interactive shells.)224 336 Q F2(ignoreeof)
+184 348 Q F1 1.673(The ef)224 360 R 1.673
+(fect is as if the shell command)-.18 F/F6 10/Courier@0 SF(IGNOREEOF=10)
+4.174 E F1 1.674(had been exe-)4.174 F(cuted \(see)224 372 Q F2(Shell V)
+2.5 E(ariables)-1.11 E F1(above\).)2.5 E F2(keyword)184 384 Q F1
+(Same as)224 396 Q F2<ad6b>2.5 E F1(.)A F2(monitor)184 408 Q F1(Same as)
+224 420 Q F2<ad6d>2.5 E F1(.)A F2(noclobber)184 432 Q F1(Same as)224 444
+Q F2<ad43>2.5 E F1(.)A F2(noexec)184 456 Q F1(Same as)8.89 E F2<ad6e>2.5
+E F1(.)A F2(noglob)184 468 Q F1(Same as)7.77 E F2<ad66>2.5 E F1(.)A F2
+(nolog)5 E F1(Curr)2.5 E(ently ignor)-.18 E(ed.)-.18 E F2(notify)184 480
+Q F1(Same as)12.22 E F2<ad62>2.5 E F1(.)A F2(nounset)184 492 Q F1
+(Same as)224 504 Q F2<ad75>2.5 E F1(.)A F2(onecmd)184 516 Q F1(Same as)
+224 528 Q F2<ad74>2.5 E F1(.)A F2(physical)184 540 Q F1(Same as)224 552
+Q F2<ad50>2.5 E F1(.)A F2(pipefail)184 564 Q F1 .735(If set, the r)224
+576 R .734
+(eturn value of a pipeline is the value of the last \(rightmost\))-.18 F
+.31(command to exit with a non-zer)224 588 R 2.811(os)-.18 G .311
+(tatus, or zer)-2.811 F 2.811(oi)-.18 G 2.811(fa)-2.811 G .311
+(ll commands in the)-2.811 F(pipeline exit successfully)224 600 Q 5(.T)
+-1.11 G(his option is disabled by default.)-5 E F2(posix)184 612 Q F1
+.815(Change the behavior of)15.56 F F2(bash)3.315 E F1(wher)3.315 E
+3.315(et)-.18 G .815(he default operation dif)-3.315 F .815(fers fr)-.18
+F(om)-.18 E(the POSIX 1003.2 standar)224 624 Q 2.5(dt)-.18 G 2.5(om)-2.5
+G(atch the standar)-2.5 E 2.5(d\()-.18 G F3(`posix mode)-2.5 E F1(\).)A
+F2(privileged)184 636 Q F1(Same as)224 648 Q F2<ad70>2.5 E F1(.)A F2
+(verbose)184 660 Q F1(Same as)224 672 Q F2<ad76>2.5 E F1(.)A F2(vi)184
+684 Q F1(Use a vi-style command line editing interface.)31.11 E F2
+(xtrace)184 696 Q F1(Same as)13.34 E F2<ad78>2.5 E F1(.)A(If)184 714 Q
+F2<ad6f>4.63 E F1 2.131(is supplied with no)4.63 F F3(option\255name)
+4.631 E F1 4.631(,t)C 2.131(he values of the curr)-4.631 F 2.131
+(ent options ar)-.18 F(e)-.18 E 4.412(printed. If)184 726 R F2(+o)4.412
+E F1 1.912(is supplied with no)4.412 F F3(option\255name)4.412 E F1
+4.411(,as)C 1.911(eries of)-4.411 F F2(set)4.411 E F1 1.911(commands to)
+4.411 F F0(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965
+(35)-2.5 G(5)-197.965 E 0 Cg EP
+%%Page: 56 56
+%%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/Palatino-Roman@0 SF -.18(re)184 84 S(cr).18 E
+(eate the curr)-.18 E(ent option settings is displayed on the standar)
+-.18 E 2.5(do)-.18 G(utput.)-2.5 E/F2 10/Palatino-Bold@0 SF<ad70>144 96
+Q F1 -.9(Tu)27.83 G .853(rn on).9 F/F3 10/Palatino-Italic@0 SF
+(privileged)3.923 E F1 3.353(mode. In)3.683 F .853(this mode, the)3.353
+F/F4 9/Palatino-Bold@0 SF($ENV)3.353 E F1(and)3.103 E F4($BASH_ENV)3.354
+E F1 .854(\214les ar)3.104 F 3.354(en)-.18 G(ot)-3.354 E(pr)184 108 Q
+2.873(ocessed, shell functions ar)-.18 F 5.373(en)-.18 G 2.873
+(ot inherited fr)-5.373 F 2.873(om the envir)-.18 F 2.873
+(onment, and the)-.18 F F4(SHELLOPTS)184 120 Q F1 .548
+(variable, if it appears in the envir)2.798 F .548(onment, is ignor)-.18
+F 3.049(ed. If)-.18 F .549(the shell is)3.049 F 1.115
+(started with the ef)184 132 R 1.115(fective user \(gr)-.18 F 1.115
+(oup\) id not equal to the r)-.18 F 1.115(eal user \(gr)-.18 F 1.115
+(oup\) id,)-.18 F .497(and the)184 144 R F2<ad70>2.997 E F1 .498
+(option is not supplied, these actions ar)2.998 F 2.998(et)-.18 G .498
+(aken and the ef)-2.998 F .498(fective user)-.18 F .685
+(id is set to the r)184 156 R .685(eal user id.)-.18 F .685(If the)5.685
+F F2<ad70>3.185 E F1 .684(option is supplied at startup, the ef)3.185 F
+(fective)-.18 E .752(user id is not r)184 168 R 3.252(eset. T)-.18 F
+.752(urning this option of)-.9 F 3.252(fc)-.18 G .752(auses the ef)
+-3.252 F .753(fective user and gr)-.18 F(oup)-.18 E
+(ids to be set to the r)184 180 Q(eal user and gr)-.18 E(oup ids.)-.18 E
+F2<ad74>144 192 Q F1(Exit after r)30.61 E
+(eading and executing one command.)-.18 E F2<ad75>144 204 Q F1 -.88 -.9
+(Tr e)27.83 H 2.498(at unset variables as an err).9 F 2.498
+(or when performing parameter expansion.)-.18 F(If)7.498 E .869
+(expansion is attempted on an unset variable, the shell prints an err)
+184 216 R .87(or message,)-.18 F
+(and, if not interactive, exits with a non-zer)184 228 Q 2.5(os)-.18 G
+(tatus.)-2.5 E F2<ad76>144 240 Q F1(Print shell input lines as they ar)
+28.38 E 2.5(er)-.18 G(ead.)-2.68 E F2<ad78>144 252 Q F1 2.637
+(After expanding each)28.94 F F3 2.637(simple command)5.137 F F1(,)A F2
+(for)5.137 E F1(command,)5.137 E F2(case)5.136 E F1(command,)5.136 E F2
+(select)5.136 E F1 .954(command, or arithmetic)184 264 R F2(for)3.454 E
+F1 .955(command, display the expanded value of)3.455 F F4(PS4)3.455 E/F5
+9/Palatino-Roman@0 SF(,)A F1(fol-)3.205 E
+(lowed by the command and its expanded ar)184 276 Q
+(guments or associated wor)-.18 E 2.5(dl)-.18 G(ist.)-2.5 E F2<ad42>144
+288 Q F1 .484(The shell performs brace expansion \(see)27.27 F F2 .484
+(Brace Expansion)2.984 F F1 2.984(above\). This)2.984 F .484(is on by)
+2.984 F(default.)184 300 Q F2<ad43>144 312 Q F1 .077(If set,)26.72 F F2
+(bash)2.577 E F1 .077(does not overwrite an existing \214le with the)
+2.577 F F2(>)2.578 E F1(,)A F2(>&)2.578 E F1 2.578(,a)C(nd)-2.578 E F2
+(<>)2.578 E F1 -.18(re)2.578 G(dir).18 E(ection)-.18 E 2.645
+(operators. This)184 324 R .145(may be overridden when cr)2.645 F .145
+(eating output \214les by using the r)-.18 F(edi-)-.18 E -.18(re)184 336
+S(ction operator).18 E F2(>|)2.5 E F1(instead of)2.5 E F2(>)2.5 E F1(.)A
+F2<ad45>144 348 Q F1 .901(If set, any trap on)27.83 F F2(ERR)3.402 E F1
+.902(is inherited by shell functions, command substitutions,)3.402 F .75
+(and commands executed in a subshell envir)184 360 R 3.25(onment. The)
+-.18 F F2(ERR)3.25 E F1 .75(trap is normally)3.25 F
+(not inherited in such cases.)184 372 Q F2<ad48>144 384 Q F1(Enable)
+25.61 E F2(!)2.515 E F1 .015(style history substitution.)5.015 F .016
+(This option is on by default when the shell is)5.016 F(interactive.)184
+396 Q F2<ad50>144 408 Q F1 .693(If set, the shell does not follow symbo\
+lic links when executing commands such)27.83 F(as)184 420 Q F2(cd)3.569
+E F1 1.069(that change the curr)3.569 F 1.069(ent working dir)-.18 F
+(ectory)-.18 E 6.069(.I)-1.11 G 3.569(tu)-6.069 G 1.07
+(ses the physical dir)-3.569 F(ectory)-.18 E(str)184 432 Q(uctur)-.08 E
+2.912(ei)-.18 G 2.912(nstead. By)-2.912 F(default,)2.912 E F2(bash)2.912
+E F1 .412(follows the logical chain of dir)2.912 F .411(ectories when)
+-.18 F(performing commands which change the curr)184 444 Q(ent dir)-.18
+E(ectory)-.18 E(.)-1.11 E F2<ad54>144 456 Q F1 1.25(If set, any trap on)
+27.27 F F2(DEBUG)3.751 E F1 1.251
+(is inherited by shell functions, command substitu-)3.751 F .712
+(tions, and commands executed in a subshell envir)184 468 R 3.212
+(onment. The)-.18 F F2(DEBUG)3.212 E F1 .711(trap is)3.211 F
+(normally not inherited in such cases.)184 480 Q F2<adad>144 492 Q F1
+1.781(If no ar)27.88 F 1.782
+(guments follow this option, then the positional parameters ar)-.18 F
+4.282(eu)-.18 G(nset.)-4.282 E 1.303
+(Otherwise, the positional parameters ar)184 504 R 3.803(es)-.18 G 1.303
+(et to the)-3.803 F F3(ar)3.803 E(g)-.18 E F1 1.303
+(s, even if some of them)B(begin with a)184 516 Q F2<ad>2.5 E F1(.)A F2
+<ad>144 528 Q F1 1.295(Signal the end of options, cause all r)33.94 F
+(emaining)-.18 E F3(ar)3.796 E(g)-.18 E F1 3.796(st)C 3.796(ob)-3.796 G
+3.796(ea)-3.796 G 1.296(ssigned to the posi-)-3.796 F .042
+(tional parameters.)184 540 R(The)5.042 E F2<ad78>2.542 E F1(and)2.542 E
+F2<ad76>2.542 E F1 .041(options ar)2.541 F 2.541(et)-.18 G .041
+(urned of)-2.541 F 2.541(f. If)-.18 F(ther)2.541 E 2.541(ea)-.18 G .401
+-.18(re n)-2.541 H(o).18 E F3(ar)2.541 E(g)-.18 E F1 .041(s, the)B
+(positional parameters r)184 552 Q(emain unchanged.)-.18 E .12
+(The options ar)144 568.8 R 2.62(eo)-.18 G .48 -.18(ff b)-2.62 H 2.62
+(yd).18 G .121(efault unless otherwise noted.)-2.62 F .121
+(Using + rather than \255 causes these)5.121 F .278
+(options to be turned of)144 580.8 R 2.778(f. The)-.18 F .277
+(options can also be speci\214ed as ar)2.777 F .277
+(guments to an invocation)-.18 F .722(of the shell.)144 592.8 R .723
+(The curr)5.723 F .723(ent set of options may be found in)-.18 F F2
+<24ad>3.223 E F1 5.723(.T)C .723(he r)-5.723 F .723
+(eturn status is always)-.18 F(tr)144 604.8 Q
+(ue unless an invalid option is encounter)-.08 E(ed.)-.18 E F2(shift)108
+621.6 Q F1([)2.5 E F3(n)A F1(])A .807(The positional parameters fr)144
+633.6 R(om)-.18 E F3(n)3.306 E F1 .806(+1 ... ar)B 3.306(er)-.18 G .806
+(enamed to)-3.486 F F2 .806($1 ....)3.306 F F1 .806(Parameters r)5.806 F
+(epr)-.18 E .806(esented by)-.18 F .055(the numbers)144 645.6 R F2($#)
+2.555 E F1 .055(down to)2.555 F F2($#)2.555 E F1<ad>A F3(n)A F1 .055
+(+1 ar)B 2.555(eu)-.18 G(nset.)-2.555 E F3(n)5.315 E F1 .055
+(must be a non-negative number less than or)2.635 F .495(equal to)144
+657.6 R F2($#)2.995 E F1 5.495(.I)C(f)-5.495 E F3(n)3.255 E F1 .494
+(is 0, no parameters ar)3.075 F 2.994(ec)-.18 G 2.994(hanged. If)-2.994
+F F3(n)3.254 E F1 .494(is not given, it is assumed to be 1.)3.074 F(If)
+144 669.6 Q F3(n)4.052 E F1 1.292(is gr)3.872 F 1.292(eater than)-.18 F
+F2($#)3.792 E F1 3.792(,t)C 1.292(he positional parameters ar)-3.792 F
+3.792(en)-.18 G 1.292(ot changed.)-3.792 F 1.292(The r)6.292 F 1.292
+(eturn status is)-.18 F(gr)144 681.6 Q(eater than zer)-.18 E 2.5(oi)-.18
+G(f)-2.5 E F3(n)2.76 E F1(is gr)2.58 E(eater than)-.18 E F2($#)2.5 E F1
+(or less than zer)2.5 E(o; otherwise 0.)-.18 E F2(shopt)108 698.4 Q F1
+([)2.5 E F2(\255pqsu)A F1 2.5(][)C F2<ad6f>-2.5 E F1 2.5(][)C F3
+(optname)-2.5 E F1(...])2.5 E -.92(To)144 710.4 S 1.523
+(ggle the values of variables contr).92 F 1.522
+(olling optional shell behavior)-.18 F 6.522(.W)-.74 G 1.522
+(ith no options, or)-7.072 F 2.531(with the)144 722.4 R F2<ad70>5.031 E
+F1 2.531(option, a list of all settable options is displayed, with an i\
+ndication of)5.031 F F0(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)
+-.15 G 197.965(35)-2.5 G(6)-197.965 E 0 Cg EP
+%%Page: 57 57
+%%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/Palatino-Roman@0 SF .962(whether or not each is set.)144 84
+R(The)5.962 E/F2 10/Palatino-Bold@0 SF<ad70>3.462 E F1 .962
+(option causes output to be displayed in a form that)3.462 F(may be r)
+144 96 Q(eused as input.)-.18 E
+(Other options have the following meanings:)5 E F2<ad73>144 108 Q F1
+(Enable \(set\) each)25.5 E/F3 10/Palatino-Italic@0 SF(optname)2.5 E F1
+(.)A F2<ad75>144 120 Q F1(Disable \(unset\) each)23.83 E F3(optname)2.5
+E F1(.)A F2<ad71>144 132 Q F1(Suppr)23.83 E .903
+(esses normal output \(quiet mode\); the r)-.18 F .903
+(eturn status indicates whether the)-.18 F F3(optname)180 144 Q F1 1.679
+(is set or unset.)4.179 F 1.679(If multiple)6.679 F F3(optname)4.178 E
+F1(ar)4.178 E 1.678(guments ar)-.18 F 4.178(eg)-.18 G 1.678(iven with)
+-4.178 F F2<ad71>4.178 E F1 4.178(,t)C(he)-4.178 E -.18(re)180 156 S
+(turn status is zer).18 E 2.5(oi)-.18 G 2.5(fa)-2.5 G(ll)-2.5 E F3
+(optnames)2.5 E F1(ar)2.5 E 2.5(ee)-.18 G(nabled; non-zer)-2.5 E 2.5(oo)
+-.18 G(therwise.)-2.5 E F2<ad6f>144 168 Q F1 1.348
+(Restricts the values of)24.38 F F3(optname)3.848 E F1 1.348
+(to be those de\214ned for the)3.848 F F2<ad6f>3.848 E F1 1.348
+(option to the)3.848 F F2(set)3.848 E F1(builtin.)180 180 Q 1.86
+(If either)144 196.8 R F2<ad73>4.36 E F1(or)4.36 E F2<ad75>4.36 E F1
+1.86(is used with no)4.36 F F3(optname)4.36 E F1(ar)4.36 E 1.86
+(guments, the display is limited to those)-.18 F 1.061(options which ar)
+144 208.8 R 3.561(es)-.18 G 1.062(et or unset, r)-3.561 F(espectively)
+-.18 E 6.062(.U)-1.11 G 1.062(nless otherwise noted, the)-6.062 F F2
+(shopt)3.562 E F1(options)3.562 E(ar)144 220.8 Q 2.5(ed)-.18 G
+(isabled \(unset\) by default.)-2.5 E .473(The r)144 237.6 R .473
+(eturn status when listing options is zer)-.18 F 2.973(oi)-.18 G 2.973
+(fa)-2.973 G(ll)-2.973 E F3(optnames)2.973 E F1(ar)2.973 E 2.973(ee)-.18
+G .472(nabled, non-zer)-2.973 F 2.972(oo)-.18 G(ther)-2.972 E(-)-.18 E
+2.601(wise. When)144 249.6 R .101(setting or unsetting options, the r)
+2.601 F .101(eturn status is zer)-.18 F 2.602(ou)-.18 G .102(nless an)
+-2.602 F F3(optname)2.602 E F1 .102(is not)2.602 F 2.5(av)144 261.6 S
+(alid shell option.)-2.5 E(The list of)144 278.4 Q F2(shopt)2.5 E F1
+(options is:)2.5 E F2(cdable_vars)144 296.4 Q F1 .364(If set, an ar)184
+308.4 R .364(gument to the)-.18 F F2(cd)2.864 E F1 .364
+(builtin command that is not a dir)2.864 F .364(ectory is assumed)-.18 F
+(to be the name of a variable whose value is the dir)184 320.4 Q
+(ectory to change to.)-.18 E F2(cdspell)144 332.4 Q F1 1.137
+(If set, minor err)7.24 F 1.138(ors in the spelling of a dir)-.18 F
+1.138(ectory component in a)-.18 F F2(cd)3.638 E F1(command)3.638 E
+1.289(will be corr)184 344.4 R 3.788(ected. The)-.18 F(err)3.788 E 1.288
+(ors checked for ar)-.18 F 3.788(et)-.18 G 1.288
+(ransposed characters, a missing)-3.788 F(character)184 356.4 Q 2.74(,a)
+-.74 G .24(nd one character too many)-2.74 F 5.241(.I)-1.11 G 2.741(fac)
+-5.241 G(orr)-2.741 E .241(ection is found, the corr)-.18 F .241
+(ected \214le)-.18 F .431(name is printed, and the command pr)184 368.4
+R 2.931(oceeds. This)-.18 F .43(option is only used by inter)2.931 F(-)
+-.18 E(active shells.)184 380.4 Q F2(checkhash)144 392.4 Q F1 .762
+(If set,)184 404.4 R F2(bash)3.262 E F1 .763
+(checks that a command found in the hash table exists befor)3.263 F
+3.263(et)-.18 G(rying)-3.263 E .023(to execute it.)184 416.4 R .023
+(If a hashed command no longer exists, a normal path sear)5.023 F .022
+(ch is per)-.18 F(-)-.18 E(formed.)184 428.4 Q F2(checkwinsize)144 440.4
+Q F1 2.584(If set,)184 452.4 R F2(bash)5.084 E F1 2.584
+(checks the window size after each command and, if necessary)5.084 F(,)
+-1.11 E(updates the values of)184 464.4 Q/F4 9/Palatino-Bold@0 SF(LINES)
+2.5 E F1(and)2.25 E F4(COLUMNS)2.5 E/F5 9/Palatino-Roman@0 SF(.)A F2
+(cmdhist)144 476.4 Q F1 1.298(If set,)184 488.4 R F2(bash)3.798 E F1
+1.297(attempts to save all lines of a multiple-line command in the same)
+3.797 F(history entry)184 500.4 Q 5(.T)-1.11 G(his allows easy r)-5 E
+(e-editing of multi-line commands.)-.18 E F2(dotglob)144 512.4 Q F1
+1.338(If set,)184 524.4 R F2(bash)3.838 E F1 1.338
+(includes \214lenames beginning with a `.' in the r)3.838 F 1.339
+(esults of pathname)-.18 F(expansion.)184 536.4 Q F2(execfail)144 548.4
+Q F1 .315(If set, a non-interactive shell will not exit if it cannot ex\
+ecute the \214le speci\214ed as)5.01 F .783(an ar)184 560.4 R .783
+(gument to the)-.18 F F2(exec)3.283 E F1 .783(builtin command.)3.283 F
+.783(An interactive shell does not exit if)5.783 F F2(exec)184 572.4 Q
+F1(fails.)2.5 E F2(expand_aliases)144 584.4 Q F1 1.159
+(If set, aliases ar)184 596.4 R 3.659(ee)-.18 G 1.159
+(xpanded as described above under)-3.659 F F4(ALIASES)3.659 E F5(.)A F1
+1.159(This option is)5.659 F(enabled by default for interactive shells.)
+184 608.4 Q F2(extdebug)144 620.4 Q F1
+(If set, behavior intended for use by debuggers is enabled:)184 632.4 Q
+F2(1.)184 644.4 Q F1(The)28.5 E F2<ad46>3.607 E F1 1.107(option to the)
+3.607 F F2(declare)3.607 E F1 1.108(builtin displays the sour)3.607 F
+1.108(ce \214le name and)-.18 F .624(line number corr)220 656.4 R .624
+(esponding to each function name supplied as an ar)-.18 F(gu-)-.18 E
+(ment.)220 668.4 Q F2(2.)184 680.4 Q F1 .98(If the command r)28.5 F .98
+(un by the)-.08 F F2(DEBUG)3.48 E F1 .98(trap r)3.48 F .98
+(eturns a non-zer)-.18 F 3.48(ov)-.18 G .98(alue, the)-3.48 F
+(next command is skipped and not executed.)220 692.4 Q F2(3.)184 704.4 Q
+F1 1.107(If the command r)28.5 F 1.107(un by the)-.08 F F2(DEBUG)3.607 E
+F1 1.106(trap r)3.606 F 1.106(eturns a value of 2, and the)-.18 F .87
+(shell is executing in a subr)220 716.4 R .871
+(outine \(a shell function or a shell script exe-)-.18 F(cuted by the)
+220 728.4 Q F2(.)2.5 E F1(or)2.5 E F2(source)2.5 E F1
+(builtins\), a call to)2.5 E F2(return)2.5 E F1(is simulated.)2.5 E F0
+(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(35)-2.5 G
+(7)-197.965 E 0 Cg EP
+%%Page: 58 58
+%%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/Palatino-Bold@0 SF(extglob)144 84 Q/F2 10/Palatino-Roman@0
+SF .432(If set, the extended pattern matching featur)6.11 F .432
+(es described above under)-.18 F F1(Pathname)2.932 E(Expansion)184 96 Q
+F2(ar)2.5 E 2.5(ee)-.18 G(nabled.)-2.5 E F1(extquote)144 108 Q F2 .143
+(If set,)184 120 R F1($)2.643 E F2(')A/F3 10/Palatino-Italic@0 SF
+(string)A F2 2.643('a)C(nd)-2.643 E F1($)2.643 E F2(")A F3(string)A F2
+2.643("q)C .143(uoting is performed within)-2.643 F F1(${)2.643 E F3
+(parameter)A F1(})A F2(expansions)2.643 E(enclosed in double quotes.)184
+132 Q(This option is enabled by default.)5 E F1(failglob)144 144 Q F2
+.507(If set, patterns which fail to match \214lenames during pathname e\
+xpansion r)184 156 R(esult)-.18 E(in an expansion err)184 168 Q(or)-.18
+E(.)-.74 E F1(force_\214gnore)144 180 Q F2 1.118(If set, the suf)184 192
+R 1.118(\214xes speci\214ed by the)-.18 F F1(FIGNORE)3.618 E F2 1.119
+(shell variable cause wor)3.619 F 1.119(ds to be)-.18 F(ignor)184 204 Q
+1.291(ed when performing wor)-.18 F 3.791(dc)-.18 G 1.291
+(ompletion even if the ignor)-3.791 F 1.291(ed wor)-.18 F 1.291(ds ar)
+-.18 F 3.79(et)-.18 G(he)-3.79 E 1.7(only possible completions.)184 216
+R(See)6.7 E/F4 9/Palatino-Bold@0 SF 1.7(SHELL V)4.2 F(ARIABLES)-1.161 E
+F2 1.701(above for a description of)3.95 F F1(FIGNORE)184 228 Q F2 5(.T)
+C(his option is enabled by default.)-5 E F1(gnu_errfmt)144 240 Q F2 .843
+(If set, shell err)184 252 R .843(or messages ar)-.18 F 3.342(ew)-.18 G
+.842(ritten in the standar)-3.342 F 3.342(dG)-.18 G .842(NU err)-3.342 F
+.842(or message for)-.18 F(-)-.18 E(mat.)184 264 Q F1(histappend)144 276
+Q F2 1.127(If set, the history list is appended to the \214le named by \
+the value of the)184 288 R F1(HIST)3.627 E(-)-.92 E(FILE)184 300 Q F2
+(variable when the shell exits, rather than overwriting the \214le.)2.5
+E F1(histreedit)144 312 Q F2 1.381(If set, and)184 324 R F1(readline)
+3.881 E F2 1.381(is being used, a user is given the opportunity to r)
+3.881 F 1.38(e-edit a)-.18 F(failed history substitution.)184 336 Q F1
+(histverify)144 348 Q F2 2.133(If set, and)184 360 R F1(readline)4.633 E
+F2 2.133(is being used, the r)4.633 F 2.133
+(esults of history substitution ar)-.18 F 4.634(en)-.18 G(ot)-4.634 E
+.383(immediately passed to the shell parser)184 372 R 5.383(.I)-.74 G
+.382(nstead, the r)-5.383 F .382(esulting line is loaded into)-.18 F
+(the)184 384 Q F1(readline)2.5 E F2(editing buf)2.5 E(fer)-.18 E 2.5(,a)
+-.74 G(llowing further modi\214cation.)-2.5 E F1(hostcomplete)144 396 Q
+F2 .647(If set, and)184 408 R F1(readline)3.147 E F2 .648
+(is being used,)3.147 F F1(bash)3.148 E F2 .648
+(will attempt to perform hostname com-)3.148 F .44(pletion when a wor)
+184 420 R 2.939(dc)-.18 G .439(ontaining a)-2.939 F F1(@)2.939 E F2 .439
+(is being completed \(see)2.939 F F1(Completing)2.939 E F2(under)2.939 E
+F4(READLINE)184 432 Q F2 2.5(above\). This)2.25 F
+(is enabled by default.)2.5 E F1(huponexit)144 444 Q F2(If set,)184 456
+Q F1(bash)2.5 E F2(will send)2.5 E F4(SIGHUP)2.5 E F2
+(to all jobs when an interactive login shell exits.)2.25 E F1
+(interactive_comments)144 468 Q F2 .26(If set, allow a wor)184 480 R
+2.76(db)-.18 G .26(eginning with)-2.76 F F1(#)2.76 E F2 .26
+(to cause that wor)2.76 F 2.76(da)-.18 G .26(nd all r)-2.76 F .26
+(emaining char)-.18 F(-)-.18 E .512(acters on that line to be ignor)184
+492 R .512(ed in an interactive shell \(see)-.18 F F4(COMMENTS)3.012 E
+F2(above\).)2.762 E(This option is enabled by default.)184 504 Q F1
+(lithist)144 516 Q F2 .513(If set, and the)12.8 F F1(cmdhist)3.013 E F2
+.513(option is enabled, multi-line commands ar)3.013 F 3.013(es)-.18 G
+.513(aved to the)-3.013 F .643(history with embedded newlines rather th\
+an using semicolon separators wher)184 528 R(e)-.18 E(possible.)184 540
+Q F1(login_shell)144 552 Q F2 2.454
+(The shell sets this option if it is started as a login shell \(see)184
+564 R F4(INVOCA)4.954 E(TION)-.828 E F2 2.5(above\). The)184 576 R
+(value may not be changed.)2.5 E F1(mailwarn)144 588 Q F2 .965
+(If set, and a \214le that)184 600 R F1(bash)3.465 E F2 .964
+(is checking for mail has been accessed since the last)3.464 F 1.647
+(time it was checked, the message `)184 612 R 1.647(`The mail in)-.37 F
+F3(mail\214le)4.147 E F2 1.647(has been r)4.147 F(ead')-.18 E 4.148('i)
+-.37 G 4.148(sd)-4.148 G(is-)-4.148 E(played.)184 624 Q F1
+(no_empty_cmd_completion)144 636 Q F2 .572(If set, and)184 648 R F1
+(readline)3.072 E F2 .572(is being used,)3.072 F F1(bash)3.072 E F2 .572
+(will not attempt to sear)3.072 F .572(ch the)-.18 F F1 -.74(PA)3.072 G
+(TH)-.18 E F2(for)3.072 E
+(possible completions when completion is attempted on an empty line.)184
+660 Q F1(nocaseglob)144 672 Q F2 1.548(If set,)184 684 R F1(bash)4.048 E
+F2 1.548
+(matches \214lenames in a case\255insensitive fashion when performing)
+4.048 F(pathname expansion \(see)184 696 Q F1(Pathname Expansion)2.5 E
+F2(above\).)2.5 E F0(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15
+G 197.965(35)-2.5 G(8)-197.965 E 0 Cg EP
+%%Page: 59 59
+%%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/Palatino-Bold@0 SF(nullglob)144 84 Q/F2 10/Palatino-Roman@0
+SF 2.34(If set,)184 96 R F1(bash)4.84 E F2 2.34
+(allows patterns which match no \214les \(see)4.84 F F1 2.34
+(Pathname Expansion)4.84 F F2
+(above\) to expand to a null string, rather than themselves.)184 108 Q
+F1(progcomp)144 120 Q F2 1.198(If set, the pr)184 132 R 1.199
+(ogrammable completion facilities \(see)-.18 F F1 1.199
+(Programmable Completion)3.699 F F2(above\) ar)184 144 Q 2.5(ee)-.18 G
+2.5(nabled. This)-2.5 F(option is enabled by default.)2.5 E F1
+(promptvars)144 156 Q F2 2.553(If set, pr)184 168 R 2.553
+(ompt strings under)-.18 F 2.552
+(go parameter expansion, command substitution,)-.18 F 1.007
+(arithmetic expansion, and quote r)184 180 R 1.007
+(emoval after being expanded as described in)-.18 F/F3 9/Palatino-Bold@0
+SF(PROMPTING)184 192 Q F2 2.5(above. This)2.25 F
+(option is enabled by default.)2.5 E F1(restricted_shell)144 204 Q F2
+1.743(The shell sets this option if it is started in r)184 216 R 1.742
+(estricted mode \(see)-.18 F F3(RESTRICTED)4.242 E(SHELL)184 228 Q F2
+4.862(below\). The)4.612 F 2.362(value may not be changed.)4.862 F 2.362
+(This is not r)7.362 F 2.362(eset when the)-.18 F .294
+(startup \214les ar)184 240 R 2.794(ee)-.18 G .294
+(xecuted, allowing the startup \214les to discover whether or not a)
+-2.794 F(shell is r)184 252 Q(estricted.)-.18 E F1(shift_verbose)144 264
+Q F2 .527(If set, the)184 276 R F1(shift)3.028 E F2 .528
+(builtin prints an err)3.028 F .528
+(or message when the shift count exceeds the)-.18 F
+(number of positional parameters.)184 288 Q F1(sourcepath)144 300 Q F2
+.515(If set, the)184 312 R F1(source)3.015 E F2(\()3.014 E F1(.)A F2
+3.014(\)b)C .514(uiltin uses the value of)-3.014 F F3 -.666(PA)3.014 G
+(TH)-.162 E F2 .514(to \214nd the dir)2.764 F .514(ectory contain-)-.18
+F(ing the \214le supplied as an ar)184 324 Q 2.5(gument. This)-.18 F
+(option is enabled by default.)2.5 E F1(xpg_echo)144 336 Q F2
+(If set, the)184 348 Q F1(echo)2.5 E F2
+(builtin expands backslash-escape sequences by default.)2.5 E F1
+(suspend)108 360 Q F2([)2.5 E F1<ad66>A F2(])A .048
+(Suspend the execution of this shell until it r)144 372 R .048
+(eceives a)-.18 F F3(SIGCONT)2.548 E F2 2.548(signal. The)2.298 F F1
+<ad66>2.548 E F2 .048(option says)2.548 F .327
+(not to complain if this is a login shell; just suspend anyway)144 384 R
+5.327(.T)-1.11 G .327(he r)-5.327 F .327(eturn status is 0 unless)-.18 F
+(the shell is a login shell and)144 396 Q F1<ad66>2.5 E F2
+(is not supplied, or if job contr)2.5 E(ol is not enabled.)-.18 E F1
+(test)108 408 Q/F4 10/Palatino-Italic@0 SF(expr)2.5 E F1([)108 420 Q F4
+(expr)2.5 E F1(])2.5 E F2 .544(Return a status of 0 or 1 depending on t\
+he evaluation of the conditional expr)6.56 F(ession)-.18 E F4(expr)3.044
+E F2(.).45 E .789(Each operator and operand must be a separate ar)144
+432 R 3.288(gument. Expr)-.18 F .788(essions ar)-.18 F 3.288(ec)-.18 G
+.788(omposed of)-3.288 F(the primaries described above under)144 444 Q
+F3(CONDITIONAL EXPRESSIONS)2.5 E/F5 9/Palatino-Roman@0 SF(.)A F2(Expr)
+144 462 Q .054
+(essions may be combined using the following operators, listed in decr)
+-.18 F .055(easing or)-.18 F .055(der of)-.18 F(pr)144 474 Q(ecedence.)
+-.18 E F1(!)144 486 Q F4(expr)2.5 E F2 -.78 -.9(Tr u)12.94 H 2.5(ei).9 G
+(f)-2.5 E F4(expr)2.85 E F2(is false.)2.95 E F1(\()144 498 Q F4(expr)2.5
+E F1(\))2.5 E F2 .847(Returns the value of)6.56 F F4(expr)3.347 E F2
+5.847(.T)C .847(his may be used to override the normal pr)-5.847 F
+(ecedence)-.18 E(of operators.)180 510 Q F4(expr1)144 522 Q F2<ad>2.5 E
+F1(a)A F4(expr2)2.5 E F2 -.78 -.9(Tr u)180 534 T 2.5(ei).9 G 2.5(fb)-2.5
+G(oth)-2.5 E F4(expr1)2.85 E F2(and)2.5 E F4(expr2)2.85 E F2(ar)2.5 E
+2.5(et)-.18 G -.08(ru)-2.5 G(e.).08 E F4(expr1)144 546 Q F2<ad>2.5 E F1
+(o)A F4(expr2)2.5 E F2 -.78 -.9(Tr u)180 558 T 2.5(ei).9 G 2.5(fe)-2.5 G
+(ither)-2.5 E F4(expr1)2.85 E F2(or)2.5 E F4(expr2)2.85 E F2(is tr)2.5 E
+(ue.)-.08 E F1(test)144 574.8 Q F2(and)3.576 E F1([)3.576 E F2 1.076
+(evaluate conditional expr)3.576 F 1.076(essions using a set of r)-.18 F
+1.076(ules based on the number of)-.08 F(ar)144 586.8 Q(guments.)-.18 E
+2.5(0a)144 604.8 S -.18(rg)-2.5 G(uments).18 E(The expr)180 616.8 Q
+(ession is false.)-.18 E 2.5(1a)144 628.8 S -.18(rg)-2.5 G(ument).18 E
+(The expr)180 640.8 Q(ession is tr)-.18 E(ue if and only if the ar)-.08
+E(gument is not null.)-.18 E 2.5(2a)144 652.8 S -.18(rg)-2.5 G(uments)
+.18 E .209(If the \214rst ar)180 664.8 R .208(gument is)-.18 F F1(!)
+2.708 E F2 2.708(,t)C .208(he expr)-2.708 F .208(ession is tr)-.18 F
+.208(ue if and only if the second ar)-.08 F(gument)-.18 E 2.143
+(is null.)180 676.8 R 2.144(If the \214rst ar)7.143 F 2.144
+(gument is one of the unary conditional operators listed)-.18 F 1.402
+(above under)180 688.8 R F3 1.401(CONDITIONAL EXPRESSIONS)3.901 F F5(,)A
+F2 1.401(the expr)3.651 F 1.401(ession is tr)-.18 F 1.401
+(ue if the unary)-.08 F 1.355(test is tr)180 700.8 R 3.855(ue. If)-.08 F
+1.356(the \214rst ar)3.855 F 1.356
+(gument is not a valid unary conditional operator)-.18 F 3.856(,t)-.74 G
+(he)-3.856 E(expr)180 712.8 Q(ession is false.)-.18 E F0(GNU Bash-3.0)72
+768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(35)-2.5 G(9)-197.965 E 0
+Cg EP
+%%Page: 60 60
+%%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/Palatino-Roman@0 SF 2.5(3a)144 84 S -.18(rg)-2.5 G(uments)
+.18 E 1.5(If the second ar)180 96 R 1.499
+(gument is one of the binary conditional operators listed above)-.18 F
+(under)180 108 Q/F2 9/Palatino-Bold@0 SF .64(CONDITIONAL EXPRESSIONS)
+3.14 F/F3 9/Palatino-Roman@0 SF(,)A F1 .64(the r)2.89 F .64
+(esult of the expr)-.18 F .64(ession is the r)-.18 F .641(esult of)-.18
+F .529(the binary test using the \214rst and thir)180 120 R 3.029(da)
+-.18 G -.18(rg)-3.029 G .528(uments as operands.).18 F .528
+(If the \214rst ar)5.528 F(gu-)-.18 E .106(ment is)180 132 R/F4 10
+/Palatino-Bold@0 SF(!)2.606 E F1 2.606(,t)C .107
+(he value is the negation of the two-ar)-2.606 F .107
+(gument test using the second and)-.18 F(thir)180 144 Q 4.633(da)-.18 G
+-.18(rg)-4.633 G 4.633(uments. If).18 F 2.133(the \214rst ar)4.633 F
+2.132(gument is exactly)-.18 F F4(\()4.632 E F1 2.132(and the thir)4.632
+F 4.632(da)-.18 G -.18(rg)-4.632 G 2.132(ument is).18 F(exactly)180 156
+Q F4(\))2.925 E F1 2.925(,t)C .426(he r)-2.925 F .426
+(esult is the one-ar)-.18 F .426(gument test of the second ar)-.18 F
+2.926(gument. Otherwise,)-.18 F .43(the expr)180 168 R .43
+(ession is false.)-.18 F(The)5.43 E F4<ad61>2.93 E F1(and)2.93 E F4
+<ad6f>2.93 E F1 .43(operators ar)2.93 F 2.93(ec)-.18 G(onsider)-2.93 E
+.43(ed binary operators)-.18 F(in this case.)180 180 Q 2.5(4a)144 192 S
+-.18(rg)-2.5 G(uments).18 E .668(If the \214rst ar)180 204 R .668
+(gument is)-.18 F F4(!)3.168 E F1 3.168(,t)C .669(he r)-3.168 F .669
+(esult is the negation of the thr)-.18 F(ee-ar)-.18 E .669(gument expr)
+-.18 F(es-)-.18 E .409(sion composed of the r)180 216 R .409
+(emaining ar)-.18 F 2.909(guments. Otherwise,)-.18 F .409(the expr)2.909
+F .409(ession is parsed)-.18 F(and evaluated accor)180 228 Q(ding to pr)
+-.18 E(ecedence using the r)-.18 E(ules listed above.)-.08 E 2.5(5o)144
+240 S 2.5(rm)-2.5 G(or)-2.5 E 2.5(ea)-.18 G -.18(rg)-2.5 G(uments).18 E
+.781(The expr)180 252 R .782(ession is parsed and evaluated accor)-.18 F
+.782(ding to pr)-.18 F .782(ecedence using the r)-.18 F(ules)-.08 E
+(listed above.)180 264 Q F4(times)108 280.8 Q F1 .334
+(Print the accumulated user and system times for the shell and for pr)
+11.01 F .334(ocesses r)-.18 F .334(un fr)-.08 F .334(om the)-.18 F 2.5
+(shell. The)144 292.8 R -.18(re)2.5 G(turn status is 0.).18 E F4(trap)
+108 309.6 Q F1([)2.5 E F4(\255lp)A F1 2.5(][)C/F5 10/Palatino-Italic@0
+SF(ar)-2.5 E(g)-.18 E F1 2.5(][)C F5(sigspec)-2.5 E F1(...])2.5 E .563
+(The command)144 321.6 R F5(ar)3.523 E(g)-.18 E F1 .563(is to be r)3.543
+F .563(ead and executed when the shell r)-.18 F .564
+(eceives signal\(s\))-.18 F F5(sigspec)3.064 E F1 5.564(.I).32 G(f)
+-5.564 E F5(ar)144.46 333.6 Q(g)-.18 E F1 .942(is absent or)3.922 F F4
+<ad>3.442 E F1 3.441(,a)C .941(ll speci\214ed signals ar)-3.441 F 3.441
+(er)-.18 G .941(eset to their original values \(the values they)-3.621 F
+1.892(had upon entrance to the shell\).)144 345.6 R(If)6.892 E F5(ar)
+4.852 E(g)-.18 E F1 1.893
+(is the null string the signal speci\214ed by each)4.872 F F5(sigspec)
+144.41 357.6 Q F1 .515(is ignor)3.335 F .514
+(ed by the shell and by the commands it invokes.)-.18 F(If)5.514 E F5
+(ar)3.474 E(g)-.18 E F1 .514(is not pr)3.494 F .514(esent and)-.18 F F4
+<ad70>144 369.6 Q F1 2.161
+(has been supplied, then the trap commands associated with each)4.66 F
+F5(sigspec)5.071 E F1(ar)4.981 E 4.661(ed)-.18 G(is-)-4.661 E 3.428
+(played. If)144 381.6 R .927(no ar)3.427 F .927(guments ar)-.18 F 3.427
+(es)-.18 G .927(upplied or if only)-3.427 F F4<ad70>3.427 E F1 .927
+(is given,)3.427 F F4(trap)3.427 E F1 .927(prints the list of com-)3.427
+F .646(mands associated with each signal number)144 393.6 R 5.647(.T)
+-.74 G(he)-5.647 E F4<ad6c>3.147 E F1 .647
+(option causes the shell to print a list)3.147 F 1.095
+(of signal names and their corr)144 405.6 R 1.095(esponding numbers.)
+-.18 F(Each)6.095 E F5(sigspec)4.005 E F1 1.094(is either a signal name)
+3.914 F .369(de\214ned in <)144 417.6 R F5(signal.h)A F1 .369
+(>, or a signal number)B 5.37(.I)-.74 G 2.87(fa)-5.37 G F5(sigspec).41 E
+F1(is)3.19 E F2(EXIT)2.87 E F1 .37(\(0\) the command)2.62 F F5(ar)3.33 E
+(g)-.18 E F1 .37(is exe-)3.35 F .801(cuted on exit fr)144 429.6 R .8
+(om the shell.)-.18 F .8(If a)5.8 F F5(sigspec)3.71 E F1(is)3.62 E F2
+(DEBUG)3.3 E F3(,)A F1 .8(the command)3.05 F F5(ar)3.76 E(g)-.18 E F1 .8
+(is executed befor)3.78 F(e)-.18 E(every)144 441.6 Q F5 .439
+(simple command)2.939 F F1(,)A F5(for)2.939 E F1(command,)2.939 E F5
+(case)2.939 E F1(command,)2.939 E F5(select)2.939 E F1 .439
+(command, every arithmetic)2.939 F F5(for)2.94 E F1 .592
+(command, and befor)144 453.6 R 3.092(et)-.18 G .592
+(he \214rst command executes in a shell function \(see)-3.092 F F2 .591
+(SHELL GRAM-)3.091 F(MAR)144 465.6 Q F1 2.534(above\). Refer)2.284 F
+.034(to the description of the)2.534 F F4(extglob)2.535 E F1 .035
+(option to the)2.535 F F4(shopt)2.535 E F1 .035(builtin for details)
+2.535 F .547(of its ef)144 477.6 R .547(fect on the)-.18 F F4(DEBUG)
+3.046 E F1 3.046(trap. If)3.046 F(a)3.046 E F5(sigspec)3.456 E F1(is)
+3.366 E F2(ERR)3.046 E F3(,)A F1 .546(the command)2.796 F F5(ar)3.506 E
+(g)-.18 E F1 .546(is executed when-)3.526 F 1.03
+(ever a simple command has a non\255zer)144 489.6 R 3.531(oe)-.18 G
+1.031(xit status, subject to the following conditions.)-3.531 F(The)144
+501.6 Q F2(ERR)3.034 E F1 .533(trap is not executed if the failed comma\
+nd is part of the command list immedi-)2.784 F .222(ately following a)
+144 513.6 R F4(while)2.722 E F1(or)2.722 E F4(until)2.722 E F1(keywor)
+2.722 E .222(d, part of the test in an)-.18 F F5(if)2.882 E F1 .223
+(statement, part of a)4.572 F F4(&&)2.723 E F1(or)144 525.6 Q/F6 10
+/Symbol SF<efef>3.613 E F1 1.113(list, or if the command's r)3.613 F
+1.113(eturn value is being inverted via)-.18 F F4(!)3.613 E F1 6.113(.T)
+C 1.113(hese ar)-6.113 F 3.613(et)-.18 G 1.112(he same)-3.613 F .316
+(conditions obeyed by the)144 537.6 R F4(errexit)2.816 E F1 2.816
+(option. If)2.816 F(a)2.816 E F5(sigspec)3.226 E F1(is)3.136 E F2
+(RETURN)2.816 E F3(,)A F1 .316(the command)2.566 F F5(ar)3.277 E(g)-.18
+E F1 .317(is exe-)3.297 F .448
+(cuted each time a shell function or a script executed with the)144
+549.6 R F4(.)2.948 E F1(or)2.948 E F4(source)2.948 E F1 .448
+(builtins \214nishes)2.948 F 3.427(executing. Signals)144 561.6 R(ignor)
+3.427 E .928(ed upon entry to the shell cannot be trapped or r)-.18 F
+3.428(eset. T)-.18 F(rapped)-.9 E .615(signals ar)144 573.6 R 3.115(er)
+-.18 G .615(eset to their original values in a child pr)-3.295 F .615
+(ocess when it is cr)-.18 F 3.115(eated. The)-.18 F -.18(re)3.115 G
+(turn).18 E(status is false if any)144 585.6 Q F5(sigspec)2.91 E F1
+(is invalid; otherwise)2.82 E F4(trap)2.5 E F1 -.18(re)2.5 G(turns tr)
+.18 E(ue.)-.08 E F4(type)108 602.4 Q F1([)2.5 E F4(\255aftpP)A F1(])A F5
+(name)2.5 E F1([)2.5 E F5(name)A F1(...])2.5 E -.55(Wi)144 614.4 S 1.475
+(th no options, indicate how each).55 F F5(name)4.236 E F1 1.476
+(would be interpr)4.326 F 1.476(eted if used as a command)-.18 F 2.726
+(name. If)144 626.4 R(the)2.726 E F4<ad74>2.726 E F1 .226
+(option is used,)2.726 F F4(type)2.725 E F1 .225
+(prints a string which is one of)2.725 F F5(alias)2.725 E F1(,).06 E F5
+(keyword)2.725 E F1(,).33 E F5(function)2.725 E F1(,).08 E F5(builtin)
+144 638.4 Q F1 2.555(,o).08 G(r)-2.555 E F5(\214le)4.675 E F1(if)2.905 E
+F5(name)2.815 E F1 .056(is an alias, shell r)2.905 F .056(eserved wor)
+-.18 F .056(d, function, builtin, or disk \214le, r)-.18 F(espec-)-.18 E
+(tively)144 650.4 Q 6.635(.I)-1.11 G 4.135(ft)-6.635 G(he)-4.135 E F5
+(name)4.395 E F1 1.635
+(is not found, then nothing is printed, and an exit status of false is)
+4.485 F -.18(re)144 662.4 S 2.522(turned. If).18 F(the)2.523 E F4<ad70>
+2.523 E F1 .023(option is used,)2.523 F F4(type)2.523 E F1 .023
+(either r)2.523 F .023(eturns the name of the disk \214le that would)
+-.18 F 1.086(be executed if)144 674.4 R F5(name)3.846 E F1(wer)3.936 E
+3.586(es)-.18 G 1.086(peci\214ed as a command name, or nothing if)-3.586
+F/F7 10/Courier@0 SF 1.086(type -t name)3.586 F F1 .015(would not r)144
+686.4 R(eturn)-.18 E F5(\214le)2.515 E F1 5.015(.T).35 G(he)-5.015 E F4
+<ad50>2.515 E F1 .015(option for)2.515 F .015(ces a)-.18 F F2 -.666(PA)
+2.515 G(TH)-.162 E F1(sear)2.266 E .016(ch for each)-.18 F F5(name)2.516
+E F1 2.516(,e)C .016(ven if)-2.516 F F7 .016(type -t)2.516 F(name)144
+698.4 Q F1 .645(would not r)3.145 F(eturn)-.18 E F5(\214le)3.145 E F1
+5.645(.I).35 G 3.145(fac)-5.645 G .645(ommand is hashed,)-3.145 F F4
+<ad70>3.145 E F1(and)3.145 E F4<ad50>3.145 E F1 .645
+(print the hashed value,)3.145 F .41
+(not necessarily the \214le that appears \214rst in)144 710.4 R F2 -.666
+(PA)2.911 G(TH)-.162 E F3(.)A F1 .411(If the)4.911 F F4<ad61>2.911 E F1
+.411(option is used,)2.911 F F4(type)2.911 E F1 .411(prints all)2.911 F
+.164(of the places that contain an executable named)144 722.4 R F5(name)
+2.664 E F1 5.164(.T).35 G .164(his includes aliases and functions,)
+-5.164 F F0(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G
+197.965(36)-2.5 G(0)-197.965 E 0 Cg EP
+%%Page: 61 61
+%%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/Palatino-Roman@0 SF .73(if and only if the)144 84 R/F2 10
+/Palatino-Bold@0 SF<ad70>3.23 E F1 .73(option is not also used.)3.23 F
+.73(The table of hashed commands is not con-)5.73 F .498
+(sulted when using)144 96 R F2<ad61>2.998 E F1 5.498(.T)C(he)-5.498 E F2
+<ad66>2.998 E F1 .498(option suppr)2.998 F .498
+(esses shell function lookup, as with the)-.18 F F2(com-)2.997 E(mand)
+144 108 Q F1(builtin.)4.557 E F2(type)7.057 E F1 -.18(re)4.557 G 2.057
+(turns tr).18 F 2.057(ue if any of the ar)-.08 F 2.057(guments ar)-.18 F
+4.558(ef)-.18 G 2.058(ound, false if none ar)-4.558 F(e)-.18 E(found.)
+144 120 Q F2(ulimit)108 136.8 Q F1([)2.5 E F2(\255SHacd\215mnpstuv)A F1
+([)2.5 E/F3 10/Palatino-Italic@0 SF(limit)A F1(]])A(Pr)144 148.8 Q .062
+(ovides contr)-.18 F .062(ol over the r)-.18 F(esour)-.18 E .061
+(ces available to the shell and to pr)-.18 F .061
+(ocesses started by it, on)-.18 F 1.496(systems that allow such contr)
+144 160.8 R 3.996(ol. The)-.18 F F2<ad48>3.997 E F1(and)3.997 E F2<ad53>
+3.997 E F1 1.497(options specify that the har)3.997 F 3.997(do)-.18 G
+3.997(rs)-3.997 G(oft)-3.997 E .884(limit is set for the given r)144
+172.8 R(esour)-.18 E 3.384(ce. A)-.18 F(har)3.384 E 3.384(dl)-.18 G .884
+(imit cannot be incr)-3.384 F .884(eased once it is set; a soft)-.18 F
+.088(limit may be incr)144 184.8 R .088
+(eased up to the value of the har)-.18 F 2.588(dl)-.18 G 2.588(imit. If)
+-2.588 F(neither)2.589 E F2<ad48>2.589 E F1(nor)2.589 E F2<ad53>2.589 E
+F1 .089(is speci\214ed,)2.589 F .163(both the soft and har)144 196.8 R
+2.663(dl)-.18 G .163(imits ar)-2.663 F 2.663(es)-.18 G 2.663(et. The)
+-2.663 F .163(value of)2.663 F F3(limit)2.803 E F1 .162
+(can be a number in the unit speci-)2.933 F .175(\214ed for the r)144
+208.8 R(esour)-.18 E .175(ce or one of the special values)-.18 F F2
+(hard)2.676 E F1(,)A F2(soft)2.676 E F1 2.676(,o)C(r)-2.676 E F2
+(unlimited)2.676 E F1 2.676(,w)C .176(hich stand for)-2.676 F .243
+(the curr)144 220.8 R .243(ent har)-.18 F 2.743(dl)-.18 G .243
+(imit, the curr)-2.743 F .243(ent soft limit, and no limit, r)-.18 F
+(espectively)-.18 E 5.242(.I)-1.11 G(f)-5.242 E F3(limit)2.882 E F1 .242
+(is omitted,)3.012 F .081(the curr)144 232.8 R .081
+(ent value of the soft limit of the r)-.18 F(esour)-.18 E .081
+(ce is printed, unless the)-.18 F F2<ad48>2.581 E F1 .082
+(option is given.)2.582 F .33(When mor)144 244.8 R 2.83(et)-.18 G .33
+(han one r)-2.83 F(esour)-.18 E .329
+(ce is speci\214ed, the limit name and unit ar)-.18 F 2.829(ep)-.18 G
+.329(rinted befor)-2.829 F 2.829(et)-.18 G(he)-2.829 E 2.5(value. Other)
+144 256.8 R(options ar)2.5 E 2.5(ei)-.18 G(nterpr)-2.5 E
+(eted as follows:)-.18 E F2<ad61>144 268.8 Q F1(All curr)24.94 E
+(ent limits ar)-.18 E 2.5(er)-.18 G(eported)-2.68 E F2<ad63>144 280.8 Q
+F1(The maximum size of cor)25.5 E 2.5<658c>-.18 G(les cr)-2.5 E(eated)
+-.18 E F2<ad64>144 292.8 Q F1(The maximum size of a pr)23.83 E
+(ocess's data segment)-.18 E F2<ad66>144 304.8 Q F1
+(The maximum size of \214les cr)26.05 E(eated by the shell)-.18 E F2
+<ad6c>144 316.8 Q F1(The maximum size that may be locked into memory)
+26.61 E F2<ad6d>144 328.8 Q F1(The maximum r)21.05 E(esident set size)
+-.18 E F2<ad6e>144 340.8 Q F1 .958(The maximum number of open \214le de\
+scriptors \(most systems do not allow this)23.83 F(value to be set\))180
+352.8 Q F2<ad70>144 364.8 Q F1
+(The pipe size in 512-byte blocks \(this may not be set\))23.83 E F2
+<ad73>144 376.8 Q F1(The maximum stack size)25.5 E F2<ad74>144 388.8 Q
+F1(The maximum amount of cpu time in seconds)26.61 E F2<ad75>144 400.8 Q
+F1(The maximum number of pr)23.83 E(ocesses available to a single user)
+-.18 E F2<ad76>144 412.8 Q F1
+(The maximum amount of virtual memory available to the shell)24.38 E(If)
+144 429.6 Q F3(limit)4.151 E F1 1.511
+(is given, it is the new value of the speci\214ed r)4.281 F(esour)-.18 E
+1.51(ce \(the)-.18 F F2<ad61>4.01 E F1 1.51(option is display)4.01 F
+4.315(only\). If)144 441.6 R 1.815(no option is given, then)4.315 F F2
+<ad66>4.315 E F1 1.815(is assumed.)4.315 F -.92(Va)6.815 G 1.815
+(lues ar).92 F 4.315(ei)-.18 G 4.315(n1)-4.315 G 1.815(024-byte incr)
+-4.315 F(ements,)-.18 E .973(except for)144 453.6 R F2<ad74>3.473 E F1
+3.473(,w)C .973(hich is in seconds,)-3.473 F F2<ad70>3.473 E F1 3.473
+(,w)C .973(hich is in units of 512-byte blocks, and)-3.473 F F2<ad6e>
+3.473 E F1(and)3.472 E F2<ad75>144 465.6 Q F1 3.517(,w)C 1.017(hich ar)
+-3.517 F 3.517(eu)-.18 G 1.017(nscaled values.)-3.517 F 1.017(The r)
+6.017 F 1.018(eturn status is 0 unless an invalid option or ar)-.18 F
+(gu-)-.18 E(ment is supplied, or an err)144 477.6 Q
+(or occurs while setting a new limit.)-.18 E F2(umask)108 494.4 Q F1([)
+2.5 E F2<ad70>A F1 2.5(][)C F2<ad53>-2.5 E F1 2.5(][)C F3(mode)-2.5 E F1
+(])A .536(The user \214le-cr)144 506.4 R .536(eation mask is set to)-.18
+F F3(mode)3.035 E F1 5.535(.I).35 G(f)-5.535 E F3(mode)3.295 E F1 .535
+(begins with a digit, it is interpr)3.385 F .535(eted as)-.18 F 1.826
+(an octal number; otherwise it is interpr)144 518.4 R 1.827
+(eted as a symbolic mode mask similar to that)-.18 F .951(accepted by)
+144 530.4 R F3(chmod)3.451 E F1 3.451(\(1\). If).33 F F3(mode)3.711 E F1
+.951(is omitted, the curr)3.801 F .95(ent value of the mask is printed.)
+-.18 F(The)5.95 E F2<ad53>144 542.4 Q F1 .607(option causes the mask to\
+ be printed in symbolic form; the default output is an octal)3.106 F
+(number)144 554.4 Q 6.02(.I)-.74 G 3.52(ft)-6.02 G(he)-3.52 E F2<ad70>
+3.52 E F1 1.02(option is supplied, and)3.52 F F3(mode)3.78 E F1 1.02
+(is omitted, the output is in a form that)3.87 F .236(may be r)144 566.4
+R .236(eused as input.)-.18 F .236(The r)5.236 F .237
+(eturn status is 0 if the mode was successfully changed or if)-.18 F(no)
+144 578.4 Q F3(mode)2.5 E F1(ar)2.5 E
+(gument was supplied, and false otherwise.)-.18 E F2(unalias)108 595.2 Q
+F1<5bad>2.5 E F2(a)A F1 2.5(][)C F3(name)-2.5 E F1(...])2.5 E .719
+(Remove each)144 607.2 R F3(name)3.219 E F1(fr)3.219 E .719
+(om the list of de\214ned aliases.)-.18 F(If)5.719 E F2<ad61>3.219 E F1
+.718(is supplied, all alias de\214nitions)3.218 F(ar)144 619.2 Q 2.5(er)
+-.18 G 2.5(emoved. The)-2.68 F -.18(re)2.5 G(turn value is tr).18 E
+(ue unless a supplied)-.08 E F3(name)2.76 E F1
+(is not a de\214ned alias.)2.85 E F2(unset)108 636 Q F1<5bad>2.5 E F2
+(fv)A F1 2.5(][)C F3(name)-2.5 E F1(...])2.5 E 1.61(For each)144 648 R
+F3(name)4.11 E F1 4.11(,r).35 G 1.61(emove the corr)-4.29 F 1.61
+(esponding variable or function.)-.18 F 1.61(If no options ar)6.61 F
+4.11(es)-.18 G(up-)-4.11 E .474(plied, or the)144 660 R F2<ad76>2.974 E
+F1 .473(option is given, each)2.974 F F3(name)3.233 E F1 -.18(re)3.323 G
+.473(fers to a shell variable.).18 F .473(Read-only variables)5.473 F
+.48(may not be unset.)144 672 R(If)5.48 E F2<ad66>2.98 E F1 .48
+(is specifed, each)2.98 F F3(name)3.24 E F1 -.18(re)3.33 G .48
+(fers to a shell function, and the function).18 F .405
+(de\214nition is r)144 684 R 2.905(emoved. Each)-.18 F .405
+(unset variable or function is r)2.905 F .405(emoved fr)-.18 F .405
+(om the envir)-.18 F(onment)-.18 E 1.474(passed to subsequent commands.)
+144 696 R 1.475(If any of)6.475 F/F4 9/Palatino-Bold@0 SF(RANDOM)3.975 E
+/F5 9/Palatino-Roman@0 SF(,)A F4(SECONDS)3.725 E F5(,)A F4(LINENO)3.725
+E F5(,)A F4(HISTCMD)3.725 E F5(,)A F4(FUNCNAME)144 708 Q F5(,)A F4
+(GROUPS)2.804 E F5(,)A F1(or)2.803 E F4(DIRST)3.053 E(ACK)-.828 E F1(ar)
+2.803 E 3.053(eu)-.18 G .553(nset, they lose their special pr)-3.053 F
+.553(operties, even if)-.18 F(they ar)144 720 Q 2.5(es)-.18 G
+(ubsequently r)-2.5 E 2.5(eset. The)-.18 F(exit status is tr)2.5 E
+(ue unless a)-.08 E F3(name)2.76 E F1(is r)2.85 E(eadonly)-.18 E(.)-1.11
+E F0(GNU Bash-3.0)72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(36)
+-2.5 G(1)-197.965 E 0 Cg EP
+%%Page: 62 62
+%%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/Palatino-Bold@0 SF(wait)108 84 Q/F2 10/Palatino-Roman@0 SF
+([)2.5 E/F3 10/Palatino-Italic@0 SF(n)A F2(])A -.92(Wa)144 96 S .298
+(it for the speci\214ed pr).92 F .298(ocess and r)-.18 F .298
+(eturn its termination status.)-.18 F F3(n)5.558 E F2 .298(may be a pr)
+2.878 F .299(ocess ID or)-.18 F 2.799(aj)144 108 S .298
+(ob speci\214cation; if a job spec is given, all pr)-2.799 F .298
+(ocesses in that job's pipeline ar)-.18 F 2.798(ew)-.18 G .298
+(aited for)-2.798 F(.)-.74 E(If)144 120 Q F3(n)2.78 E F2 .02
+(is not given, all curr)2.6 F .02(ently active child pr)-.18 F .02
+(ocesses ar)-.18 F 2.52(ew)-.18 G .02(aited for)-2.52 F 2.52(,a)-.74 G
+.02(nd the r)-2.52 F .02(eturn status is)-.18 F(zer)144 132 Q 3.138
+(o. If)-.18 F F3(n)3.398 E F2 .638(speci\214es a non-existent pr)3.218 F
+.637(ocess or job, the r)-.18 F .637(eturn status is 127.)-.18 F .637
+(Otherwise, the)5.637 F -.18(re)144 144 S
+(turn status is the exit status of the last pr).18 E
+(ocess or job waited for)-.18 E(.)-.74 E/F4 10.95/Palatino-Bold@0 SF
+(RESTRICTED SHELL)72 160.8 Q F2(If)108 172.8 Q F1(bash)4.638 E F2 2.138
+(is started with the name)4.638 F F1(rbash)4.638 E F2 4.638(,o)C 4.638
+(rt)-4.638 G(he)-4.638 E F1<ad72>4.638 E F2 2.139
+(option is supplied at invocation, the shell)4.638 F .618(becomes r)108
+184.8 R 3.118(estricted. A)-.18 F -.18(re)3.118 G .618
+(stricted shell is used to set up an envir).18 F .618(onment mor)-.18 F
+3.118(ec)-.18 G(ontr)-3.118 E .618(olled than the)-.18 F(standar)108
+196.8 Q 4.197(ds)-.18 G 4.197(hell. It)-4.197 F 1.697
+(behaves identically to)4.197 F F1(bash)4.197 E F2 1.697
+(with the exception that the following ar)4.197 F 4.198(ed)-.18 G(isal-)
+-4.198 E(lowed or not performed:)108 208.8 Q 29.94<8363>108 225.6 S
+(hanging dir)-29.94 E(ectories with)-.18 E F1(cd)2.5 E F2 29.94<8373>108
+242.4 S(etting or unsetting the values of)-29.94 E F1(SHELL)2.5 E F2(,)A
+F1 -.74(PA)2.5 G(TH)-.18 E F2(,)A F1(ENV)2.5 E F2 2.5(,o)C(r)-2.5 E F1
+(BASH_ENV)2.5 E F2 29.94<8373>108 259.2 S
+(pecifying command names containing)-29.94 E F1(/)2.5 E F2 29.94<8373>
+108 276 S(pecifying a \214le name containing a)-29.94 E F1(/)2.5 E F2
+(as an ar)2.5 E(gument to the)-.18 E F1(.)2.5 E F2(builtin command)5 E
+29.94<8353>108 292.8 S 1.565
+(pecifying a \214lename containing a slash as an ar)-29.94 F 1.565
+(gument to the)-.18 F F1<ad70>4.064 E F2 1.564(option to the)4.064 F F1
+(hash)4.064 E F2(builtin command)144 304.8 Q 29.94<8369>108 321.6 S
+(mporting function de\214nitions fr)-29.94 E(om the shell envir)-.18 E
+(onment at startup)-.18 E 29.94<8370>108 338.4 S(arsing the value of)
+-29.94 E F1(SHELLOPTS)2.5 E F2(fr)2.5 E(om the shell envir)-.18 E
+(onment at startup)-.18 E 29.94<8372>108 355.2 S(edir)-30.12 E
+(ecting output using the >, >|, <>, >&, &>, and >> r)-.18 E(edir)-.18 E
+(ection operators)-.18 E 29.94<8375>108 372 S(sing the)-29.94 E F1(exec)
+2.5 E F2(builtin command to r)2.5 E
+(eplace the shell with another command)-.18 E 29.94<8361>108 388.8 S
+1.208(dding or deleting builtin commands with the)-29.94 F F1<ad66>3.708
+E F2(and)3.708 E F1<ad64>3.708 E F2 1.208(options to the)3.708 F F1
+(enable)3.708 E F2(builtin)3.708 E(command)144 400.8 Q 29.94<8355>108
+417.6 S(sing the)-29.94 E F1(enable)2.5 E F2
+(builtin command to enable disabled shell builtins)2.5 E 29.94<8373>108
+434.4 S(pecifying the)-29.94 E F1<ad70>2.5 E F2(option to the)2.5 E F1
+(command)2.5 E F2(builtin command)2.5 E 29.94<8374>108 451.2 S
+(urning of)-29.94 E 2.5(fr)-.18 G(estricted mode with)-2.68 E F1(set +r)
+2.5 E F2(or)2.5 E F1(set +o restricted)2.5 E F2(.)A(These r)108 468 Q
+(estrictions ar)-.18 E 2.5(ee)-.18 G(nfor)-2.5 E
+(ced after any startup \214les ar)-.18 E 2.5(er)-.18 G(ead.)-2.68 E
+1.694
+(When a command that is found to be a shell script is executed \(see)108
+484.8 R/F5 9/Palatino-Bold@0 SF 1.694(COMMAND EXECUTION)4.194 F F2
+(above\),)108 496.8 Q F1(rbash)2.5 E F2(turns of)2.5 E 2.5(fa)-.18 G
+(ny r)-2.5 E(estrictions in the shell spawned to execute the script.)
+-.18 E F4(SEE ALSO)72 513.6 Q F3(Bash Refer)108 525.6 Q(ence Manual)-.18
+E F2 2.5(,B)C(rian Fox and Chet Ramey)-2.5 E F3
+(The Gnu Readline Library)108 537.6 Q F2 2.5(,B)C
+(rian Fox and Chet Ramey)-2.5 E F3(The Gnu History Library)108 549.6 Q
+F2 2.5(,B)C(rian Fox and Chet Ramey)-2.5 E F3(Portable Operating System\
+ Interface \(POSIX\) Part 2: Shell and Utilities)108 561.6 Q F2 2.5(,I)C
+(EEE)-2.5 E F3(sh)108 573.6 Q F2(\(1\),)A F3(ksh)2.5 E F2(\(1\),)A F3
+(csh)2.5 E F2(\(1\))A F3(emacs)108 585.6 Q F2(\(1\),)A F3(vi)2.5 E F2
+(\(1\))A F3 -.18(re)108 597.6 S(adline).18 E F2(\(3\))A F4(FILES)72
+614.4 Q F3(/bin/bash)109.666 626.4 Q F2(The)144 638.4 Q F1(bash)2.5 E F2
+(executable)2.5 E F3(/etc/pr)109.666 650.4 Q(o\214le)-.18 E F2
+(The systemwide initialization \214le, executed for login shells)144
+662.4 Q F3(~/.bash_pr)109.666 674.4 Q(o\214le)-.18 E F2
+(The personal initialization \214le, executed for login shells)144 686.4
+Q F3(~/.bashr)109.666 698.4 Q(c)-.18 E F2(The individual per)144 710.4 Q
+(-interactive-shell startup \214le)-.18 E F0(GNU Bash-3.0)72 768 Q
+(2003 No)147.975 E 2.5(v1)-.15 G 197.965(36)-2.5 G(2)-197.965 E 0 Cg EP
+%%Page: 63 63
+%%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/Palatino-Italic@0 SF(~/.bash_logout)109.666 84 Q/F2 10
+/Palatino-Roman@0 SF(The individual login shell cleanup \214le, execute\
+d when a login shell exits)144 96 Q F1(~/.inputr)109.666 108 Q(c)-.18 E
+F2(Individual)144 120 Q F1 -.18(re)2.5 G(adline).18 E F2
+(initialization \214le)2.5 E/F3 10.95/Palatino-Bold@0 SF(AUTHORS)72
+136.8 Q F2(Brian Fox, Fr)108 148.8 Q(ee Softwar)-.18 E 2.5(eF)-.18 G
+(oundation)-2.5 E(bfox@gnu.or)108 160.8 Q(g)-.18 E(Chet Ramey)108 177.6
+Q 2.5(,C)-1.11 G(ase W)-2.5 E(estern Reserve University)-.92 E
+(chet@po.CWRU.Edu)108 189.6 Q F3(BUG REPOR)72 206.4 Q(TS)-.602 E F2 .481
+(If you \214nd a bug in)108 218.4 R/F4 10/Palatino-Bold@0 SF(bash,)2.981
+E F2 .481(you should r)2.981 F .481(eport it.)-.18 F .481
+(But \214rst, you should make sur)5.481 F 2.981(et)-.18 G .481(hat it r)
+-2.981 F .481(eally is a)-.18 F .459
+(bug, and that it appears in the latest version of)108 230.4 R F4(bash)
+2.959 E F2 5.459(.T)C .459(he latest version is always available fr)
+-5.459 F(om)-.18 E F1(ftp://ftp.gnu.or)108 242.4 Q(g/pub/bash/)-.18 E F2
+(.)A .558(Once you have determined that a bug actually exists, use the)
+108 259.2 R F1(bashbug)3.188 E F2 .558(command to submit a bug)3.538 F
+-.18(re)108 271.2 S 3.162(port. If).18 F .662(you have a \214x, you ar)
+3.162 F 3.162(ee)-.18 G .662(ncouraged to mail that as well!)-3.162 F
+.661(Suggestions and `philosophi-)5.662 F 3.73(cal' bug r)108 283.2 R
+3.731(eports may be mailed to)-.18 F F1(bug-bash@gnu.or)6.231 E(g)-.18 E
+F2 3.731(or posted to the Usenet newsgr)6.231 F(oup)-.18 E F4
+(gnu.bash.bug)108 295.2 Q F2(.)A(ALL bug r)108 312 Q
+(eports should include:)-.18 E(The version number of)108 328.8 Q F4
+(bash)2.5 E F2(The har)108 340.8 Q(dwar)-.18 E 2.5(ea)-.18 G
+(nd operating system)-2.5 E(The compiler used to compile)108 352.8 Q 2.5
+(Ad)108 364.8 S(escription of the bug behaviour)-2.5 E 2.5(As)108 376.8
+S(hort script or `r)-2.5 E(ecipe' which exer)-.18 E(cises the bug)-.18 E
+F1(bashbug)108.13 393.6 Q F2 1.316(inserts the \214rst thr)4.296 F 1.316
+(ee items automatically into the template it pr)-.18 F 1.316
+(ovides for \214ling a bug)-.18 F -.18(re)108 405.6 S(port.).18 E 7.697
+(Comments and bug r)108 422.4 R 7.697
+(eports concerning this manual page should be dir)-.18 F 7.698(ected to)
+-.18 F F1(chet@po.CWRU.Edu)108 434.4 Q F2(.).06 E F3(BUGS)72 451.2 Q F2
+(It's too big and too slow)108 463.2 Q(.)-.92 E(Ther)108 480 Q 2.833(ea)
+-.18 G .693 -.18(re s)-2.833 H .332(ome subtle dif).18 F(fer)-.18 E .332
+(ences between)-.18 F F4(bash)2.832 E F2 .332
+(and traditional versions of)2.832 F F4(sh)2.832 E F2 2.832(,m)C .332
+(ostly because of)-2.832 F(the)108 492 Q/F5 9/Palatino-Bold@0 SF(POSIX)
+2.5 E F2(speci\214cation.)2.25 E(Aliases ar)108 508.8 Q 2.5(ec)-.18 G
+(onfusing in some uses.)-2.5 E(Shell builtin commands and functions ar)
+108 525.6 Q 2.5(en)-.18 G(ot stoppable/r)-2.5 E(estartable.)-.18 E .462
+(Compound commands and command sequences of the form `a ; b ; c' ar)108
+542.4 R 2.963(en)-.18 G .463(ot handled gracefully)-2.963 F 1.257
+(when pr)108 554.4 R 1.257(ocess suspension is attempted.)-.18 F 1.257
+(When a pr)6.257 F 1.257(ocess is stopped, the shell immediately exe-)
+-.18 F .373(cutes the next command in the sequence.)108 566.4 R .373
+(It suf)5.373 F .374(\214ces to place the sequence of commands between)
+-.18 F(par)108 578.4 Q(entheses to for)-.18 E
+(ce it into a subshell, which may be stopped as a unit.)-.18 E .951
+(Commands inside of)108 595.2 R F4($\()3.451 E F2(...)A F4(\))A F2 .951
+(command substitution ar)3.451 F 3.451(en)-.18 G .951
+(ot parsed until substitution is attempted.)-3.451 F
+(This will delay err)108 607.2 Q(or r)-.18 E
+(eporting until some time after the command is enter)-.18 E(ed.)-.18 E
+(Array variables may not \(yet\) be exported.)108 624 Q F0(GNU Bash-3.0)
+72 768 Q(2003 No)147.975 E 2.5(v1)-.15 G 197.965(36)-2.5 G(3)-197.965 E
+0 Cg EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/bashbug.0 b/doc/bashbug.0
new file mode 100644 (file)
index 0000000..fca3983
--- /dev/null
@@ -0,0 +1,66 @@
+
+
+
+BASHBUG(1)                                             BASHBUG(1)
+
+
+N\bNA\bAM\bME\bE
+       bashbug - report a bug in bash
+
+S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
+       b\bba\bas\bsh\bhb\bbu\bug\bg [_\ba_\bd_\bd_\br_\be_\bs_\bs]
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+       b\bba\bas\bsh\bhb\bbu\bug\bg  is  a  shell  script to help the user compose and
+       mail bug reports concerning bash  in  a  standard  format.
+       b\bba\bas\bsh\bhb\bbu\bug\bg  invokes  the  editor specified by the environment
+       variable E\bED\bDI\bIT\bTO\bOR\bR on a temporary copy of the bug report for-
+       mat  outline. The user must fill in the appropriate fields
+       and exit the editor.  b\bba\bas\bsh\bhb\bbu\bug\bg  then  mails  the  completed
+       report  to  _\bb_\bu_\bg_\b-_\bb_\ba_\bs_\bh_\b@_\bg_\bn_\bu_\b._\bo_\br_\bg,  or  _\ba_\bd_\bd_\br_\be_\bs_\bs.  If the report
+       cannot be mailed, it is saved in the file _\bd_\be_\ba_\bd_\b._\bb_\ba_\bs_\bh_\bb_\bu_\bg  in
+       the invoking user's home directory.
+
+       The  bug  report  format  outline consists of several sec-
+       tions.  The first section provides information  about  the
+       machine,  operating system, the bash version, and the com-
+       pilation environment.  The second section should be filled
+       in  with  a  description  of  the  bug.  The third section
+       should be a description of how to reproduce the bug.   The
+       optional  fourth section is for a proposed fix.  Fixes are
+       encouraged.
+
+E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
+       b\bba\bas\bsh\bhb\bbu\bug\bg will utilize the following  environment  variables
+       if they exist:
+
+       E\bED\bDI\bIT\bTO\bOR\bR Specifies  the  preferred  editor. If E\bED\bDI\bIT\bTO\bOR\bR is not
+              set, b\bba\bas\bsh\bhb\bbu\bug\bg defaults to e\bem\bma\bac\bcs\bs.
+
+       H\bHO\bOM\bME\bE   Directory in which the failed bug report  is  saved
+              if the mail fails.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+GNU                        1998 July 30                         1
+
+
diff --git a/doc/bashbug.ps b/doc/bashbug.ps
new file mode 100644 (file)
index 0000000..6cfe8c5
--- /dev/null
@@ -0,0 +1,251 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.10
+%%CreationDate: Wed Sep 30 13:53:50 1998
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%+ font Times-Italic
+%%DocumentSuppliedResources: procset grops 1.10 0
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.10 0
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/FL{
+currentgray exch setgray fill setgray
+}bind def
+/BL/fill load def
+/LW/setlinewidth load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0/Times-Bold RE
+/Times-Roman@0 ENC0/Times-Roman RE
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SHB).35 E 347.52(UG\(1\) B)-.1 F
+(ASHB)-.35 E(UG\(1\))-.1 E/F1 9/Times-Bold@0 SF -.18(NA)72 84 S(ME).18 E
+F0(bashb)108 96 Q(ug \255 report a b)-.2 E(ug in bash)-.2 E F1(SYNOPSIS)
+72 112.8 Q/F2 10/Times-Bold@0 SF(bashb)108 124.8 Q(ug)-.2 E F0([)2.5 E
+/F3 10/Times-Italic@0 SF(addr)A(ess)-.37 E F0(])A F1(DESCRIPTION)72
+141.6 Q F2(bashb)108 153.6 Q(ug)-.2 E F0 .446
+(is a shell script to help the user compose and mail b)2.947 F .446
+(ug reports concerning bash in a standard for)-.2 F(-)-.2 E(mat.)108
+165.6 Q F2(bashb)5.961 E(ug)-.2 E F0(in)3.461 E -.2(vo)-.4 G -.1(ke).2 G
+3.461(st).1 G .962(he editor speci\214ed by the en)-3.461 F .962
+(vironment v)-.4 F(ariable)-.25 E F1(EDIT)3.462 E(OR)-.162 E F0 .962
+(on a temporary cop)3.212 F 3.462(yo)-.1 G(f)-3.462 E .374(the b)108
+177.6 R .374(ug report format outline. The user must \214ll in the appr\
+opriate \214elds and e)-.2 F .374(xit the editor)-.15 F(.)-.55 E F2
+(bashb)5.373 E(ug)-.2 E F0(then)2.873 E .439
+(mails the completed report to)108 189.6 R F3 -.2(bu)2.939 G
+(g-bash@gnu.or).2 E(g)-.37 E F0 2.939(,o)C(r)-2.939 E F3(addr)2.939 E
+(ess)-.37 E F0 5.439(.I)C 2.939(ft)-5.439 G .44
+(he report cannot be mailed, it is sa)-2.939 F -.15(ve)-.2 G 2.94(di).15
+G(n)-2.94 E(the \214le)108 201.6 Q F3(dead.bashb)2.5 E(ug)-.2 E F0
+(in the in)2.5 E -.2(vo)-.4 G(king user').2 E 2.5(sh)-.55 G
+(ome directory)-2.5 E(.)-.65 E .354(The b)108 218.4 R .354
+(ug report format outline consists of se)-.2 F -.15(ve)-.25 G .353
+(ral sections.).15 F .353(The \214rst section pro)5.353 F .353
+(vides information about the)-.15 F .37
+(machine, operating system, the bash v)108 230.4 R .371
+(ersion, and the compilation en)-.15 F 2.871(vironment. The)-.4 F .371
+(second section should)2.871 F .209
+(be \214lled in with a description of the b)108 242.4 R 2.709(ug. The)
+-.2 F .208(third section should be a description of ho)2.709 F 2.708(wt)
+-.25 G 2.708(or)-2.708 G .208(eproduce the)-2.708 F -.2(bu)108 254.4 S
+2.5(g. The).2 F(optional fourth section is for a proposed \214x.)2.5 E
+(Fix)5 E(es are encouraged.)-.15 E F1(ENVIR)72 271.2 Q(ONMENT)-.27 E F2
+(bashb)108 283.2 Q(ug)-.2 E F0(will utilize the follo)2.5 E(wing en)-.25
+E(vironment v)-.4 E(ariables if the)-.25 E 2.5(ye)-.15 G(xist:)-2.65 E
+F2(EDIT)108 300 Q(OR)-.18 E F0(Speci\214es the preferred editor)144 312
+Q 2.5(.I)-.55 G(f)-2.5 E F1(EDIT)2.5 E(OR)-.162 E F0(is not set,)2.25 E
+F2(bashb)2.5 E(ug)-.2 E F0(def)2.5 E(aults to)-.1 E F2(emacs)2.5 E F0(.)
+A F2(HOME)108 328.8 Q F0(Directory in which the f)144 340.8 Q(ailed b)
+-.1 E(ug report is sa)-.2 E -.15(ve)-.2 G 2.5(di).15 G 2.5(ft)-2.5 G
+(he mail f)-2.5 E(ails.)-.1 E 184.005(GNU 1998)72 768 R(July 30)2.5 E(1)
+203.165 E EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/bashman.html b/doc/bashman.html
new file mode 120000 (symlink)
index 0000000..0cf7097
--- /dev/null
@@ -0,0 +1 @@
+bash.html
\ No newline at end of file
diff --git a/doc/bashref.aux b/doc/bashref.aux
new file mode 100644 (file)
index 0000000..232ba2b
--- /dev/null
@@ -0,0 +1,369 @@
+@xrdef{Introduction-title}{Introduction}
+@xrdef{Introduction-pg}{1}
+@xrdef{Introduction-snt}{Chapter@tie 1}
+@xrdef{What is Bash?-title}{What is Bash?}
+@xrdef{What is Bash?-pg}{1}
+@xrdef{What is Bash?-snt}{Section@tie 1.1}
+@xrdef{What is a shell?-title}{What is a shell?}
+@xrdef{What is a shell?-pg}{1}
+@xrdef{What is a shell?-snt}{Section@tie 1.2}
+@xrdef{Definitions-title}{Definitions}
+@xrdef{Definitions-pg}{3}
+@xrdef{Definitions-snt}{Chapter@tie 2}
+@xrdef{Basic Shell Features-title}{Basic Shell Features}
+@xrdef{Basic Shell Features-pg}{5}
+@xrdef{Basic Shell Features-snt}{Chapter@tie 3}
+@xrdef{Shell Syntax-title}{Shell Syntax}
+@xrdef{Shell Syntax-pg}{5}
+@xrdef{Shell Syntax-snt}{Section@tie 3.1}
+@xrdef{Shell Operation-title}{Shell Operation}
+@xrdef{Shell Operation-pg}{5}
+@xrdef{Shell Operation-snt}{Section@tie 3.1.1}
+@xrdef{Quoting-title}{Quoting}
+@xrdef{Quoting-pg}{6}
+@xrdef{Quoting-snt}{Section@tie 3.1.2}
+@xrdef{Escape Character-title}{Escape Character}
+@xrdef{Escape Character-pg}{6}
+@xrdef{Escape Character-snt}{Section@tie 3.1.2.1}
+@xrdef{Single Quotes-title}{Single Quotes}
+@xrdef{Single Quotes-pg}{6}
+@xrdef{Single Quotes-snt}{Section@tie 3.1.2.2}
+@xrdef{Double Quotes-title}{Double Quotes}
+@xrdef{Double Quotes-pg}{6}
+@xrdef{Double Quotes-snt}{Section@tie 3.1.2.3}
+@xrdef{ANSI-C Quoting-title}{ANSI-C Quoting}
+@xrdef{ANSI-C Quoting-pg}{6}
+@xrdef{ANSI-C Quoting-snt}{Section@tie 3.1.2.4}
+@xrdef{Locale Translation-title}{Locale-Specific Translation}
+@xrdef{Locale Translation-pg}{7}
+@xrdef{Locale Translation-snt}{Section@tie 3.1.2.5}
+@xrdef{Comments-title}{Comments}
+@xrdef{Comments-pg}{7}
+@xrdef{Comments-snt}{Section@tie 3.1.3}
+@xrdef{Shell Commands-title}{Shell Commands}
+@xrdef{Shell Commands-pg}{8}
+@xrdef{Shell Commands-snt}{Section@tie 3.2}
+@xrdef{Simple Commands-title}{Simple Commands}
+@xrdef{Simple Commands-pg}{8}
+@xrdef{Simple Commands-snt}{Section@tie 3.2.1}
+@xrdef{Pipelines-title}{Pipelines}
+@xrdef{Pipelines-pg}{8}
+@xrdef{Pipelines-snt}{Section@tie 3.2.2}
+@xrdef{Lists-title}{Lists of Commands}
+@xrdef{Lists-pg}{9}
+@xrdef{Lists-snt}{Section@tie 3.2.3}
+@xrdef{Compound Commands-title}{Compound Commands}
+@xrdef{Compound Commands-pg}{9}
+@xrdef{Compound Commands-snt}{Section@tie 3.2.4}
+@xrdef{Looping Constructs-title}{Looping Constructs}
+@xrdef{Looping Constructs-pg}{9}
+@xrdef{Looping Constructs-snt}{Section@tie 3.2.4.1}
+@xrdef{Conditional Constructs-title}{Conditional Constructs}
+@xrdef{Conditional Constructs-pg}{10}
+@xrdef{Conditional Constructs-snt}{Section@tie 3.2.4.2}
+@xrdef{Command Grouping-title}{Grouping Commands}
+@xrdef{Command Grouping-pg}{13}
+@xrdef{Command Grouping-snt}{Section@tie 3.2.4.3}
+@xrdef{Shell Functions-title}{Shell Functions}
+@xrdef{Shell Functions-pg}{13}
+@xrdef{Shell Functions-snt}{Section@tie 3.3}
+@xrdef{Shell Parameters-title}{Shell Parameters}
+@xrdef{Shell Parameters-pg}{15}
+@xrdef{Shell Parameters-snt}{Section@tie 3.4}
+@xrdef{Positional Parameters-title}{Positional Parameters}
+@xrdef{Positional Parameters-pg}{15}
+@xrdef{Positional Parameters-snt}{Section@tie 3.4.1}
+@xrdef{Special Parameters-title}{Special Parameters}
+@xrdef{Special Parameters-pg}{15}
+@xrdef{Special Parameters-snt}{Section@tie 3.4.2}
+@xrdef{Shell Expansions-title}{Shell Expansions}
+@xrdef{Shell Expansions-pg}{16}
+@xrdef{Shell Expansions-snt}{Section@tie 3.5}
+@xrdef{Brace Expansion-title}{Brace Expansion}
+@xrdef{Brace Expansion-pg}{17}
+@xrdef{Brace Expansion-snt}{Section@tie 3.5.1}
+@xrdef{Tilde Expansion-title}{Tilde Expansion}
+@xrdef{Tilde Expansion-pg}{18}
+@xrdef{Tilde Expansion-snt}{Section@tie 3.5.2}
+@xrdef{Shell Parameter Expansion-title}{Shell Parameter Expansion}
+@xrdef{Shell Parameter Expansion-pg}{18}
+@xrdef{Shell Parameter Expansion-snt}{Section@tie 3.5.3}
+@xrdef{Command Substitution-title}{Command Substitution}
+@xrdef{Command Substitution-pg}{21}
+@xrdef{Command Substitution-snt}{Section@tie 3.5.4}
+@xrdef{Arithmetic Expansion-title}{Arithmetic Expansion}
+@xrdef{Arithmetic Expansion-pg}{21}
+@xrdef{Arithmetic Expansion-snt}{Section@tie 3.5.5}
+@xrdef{Process Substitution-title}{Process Substitution}
+@xrdef{Process Substitution-pg}{22}
+@xrdef{Process Substitution-snt}{Section@tie 3.5.6}
+@xrdef{Word Splitting-title}{Word Splitting}
+@xrdef{Word Splitting-pg}{22}
+@xrdef{Word Splitting-snt}{Section@tie 3.5.7}
+@xrdef{Filename Expansion-title}{Filename Expansion}
+@xrdef{Filename Expansion-pg}{22}
+@xrdef{Filename Expansion-snt}{Section@tie 3.5.8}
+@xrdef{Pattern Matching-title}{Pattern Matching}
+@xrdef{Pattern Matching-pg}{23}
+@xrdef{Pattern Matching-snt}{Section@tie 3.5.8.1}
+@xrdef{Quote Removal-title}{Quote Removal}
+@xrdef{Quote Removal-pg}{24}
+@xrdef{Quote Removal-snt}{Section@tie 3.5.9}
+@xrdef{Redirections-title}{Redirections}
+@xrdef{Redirections-pg}{24}
+@xrdef{Redirections-snt}{Section@tie 3.6}
+@xrdef{Executing Commands-title}{Executing Commands}
+@xrdef{Executing Commands-pg}{28}
+@xrdef{Executing Commands-snt}{Section@tie 3.7}
+@xrdef{Simple Command Expansion-title}{Simple Command Expansion}
+@xrdef{Simple Command Expansion-pg}{28}
+@xrdef{Simple Command Expansion-snt}{Section@tie 3.7.1}
+@xrdef{Command Search and Execution-title}{Command Search and Execution}
+@xrdef{Command Search and Execution-pg}{28}
+@xrdef{Command Search and Execution-snt}{Section@tie 3.7.2}
+@xrdef{Command Execution Environment-title}{Command Execution Environment}
+@xrdef{Command Execution Environment-pg}{29}
+@xrdef{Command Execution Environment-snt}{Section@tie 3.7.3}
+@xrdef{Environment-title}{Environment}
+@xrdef{Environment-pg}{30}
+@xrdef{Environment-snt}{Section@tie 3.7.4}
+@xrdef{Exit Status-title}{Exit Status}
+@xrdef{Exit Status-pg}{30}
+@xrdef{Exit Status-snt}{Section@tie 3.7.5}
+@xrdef{Signals-title}{Signals}
+@xrdef{Signals-pg}{31}
+@xrdef{Signals-snt}{Section@tie 3.7.6}
+@xrdef{Shell Scripts-title}{Shell Scripts}
+@xrdef{Shell Scripts-pg}{31}
+@xrdef{Shell Scripts-snt}{Section@tie 3.8}
+@xrdef{Shell Builtin Commands-title}{Shell Builtin Commands}
+@xrdef{Shell Builtin Commands-pg}{33}
+@xrdef{Shell Builtin Commands-snt}{Chapter@tie 4}
+@xrdef{Bourne Shell Builtins-title}{Bourne Shell Builtins}
+@xrdef{Bourne Shell Builtins-pg}{33}
+@xrdef{Bourne Shell Builtins-snt}{Section@tie 4.1}
+@xrdef{Bash Builtins-title}{Bash Builtin Commands}
+@xrdef{Bash Builtins-pg}{39}
+@xrdef{Bash Builtins-snt}{Section@tie 4.2}
+@xrdef{The Set Builtin-title}{The Set Builtin}
+@xrdef{The Set Builtin-pg}{50}
+@xrdef{The Set Builtin-snt}{Section@tie 4.3}
+@xrdef{Special Builtins-title}{Special Builtins}
+@xrdef{Special Builtins-pg}{53}
+@xrdef{Special Builtins-snt}{Section@tie 4.4}
+@xrdef{Shell Variables-title}{Shell Variables}
+@xrdef{Shell Variables-pg}{55}
+@xrdef{Shell Variables-snt}{Chapter@tie 5}
+@xrdef{Bourne Shell Variables-title}{Bourne Shell Variables}
+@xrdef{Bourne Shell Variables-pg}{55}
+@xrdef{Bourne Shell Variables-snt}{Section@tie 5.1}
+@xrdef{Bash Variables-title}{Bash Variables}
+@xrdef{Bash Variables-pg}{55}
+@xrdef{Bash Variables-snt}{Section@tie 5.2}
+@xrdef{Bash Features-title}{Bash Features}
+@xrdef{Bash Features-pg}{63}
+@xrdef{Bash Features-snt}{Chapter@tie 6}
+@xrdef{Invoking Bash-title}{Invoking Bash}
+@xrdef{Invoking Bash-pg}{63}
+@xrdef{Invoking Bash-snt}{Section@tie 6.1}
+@xrdef{Bash Startup Files-title}{Bash Startup Files}
+@xrdef{Bash Startup Files-pg}{65}
+@xrdef{Bash Startup Files-snt}{Section@tie 6.2}
+@xrdef{Interactive Shells-title}{Interactive Shells}
+@xrdef{Interactive Shells-pg}{67}
+@xrdef{Interactive Shells-snt}{Section@tie 6.3}
+@xrdef{What is an Interactive Shell?-title}{What is an Interactive Shell?}
+@xrdef{What is an Interactive Shell?-pg}{67}
+@xrdef{What is an Interactive Shell?-snt}{Section@tie 6.3.1}
+@xrdef{Is this Shell Interactive?-title}{Is this Shell Interactive?}
+@xrdef{Is this Shell Interactive?-pg}{67}
+@xrdef{Is this Shell Interactive?-snt}{Section@tie 6.3.2}
+@xrdef{Interactive Shell Behavior-title}{Interactive Shell Behavior}
+@xrdef{Interactive Shell Behavior-pg}{67}
+@xrdef{Interactive Shell Behavior-snt}{Section@tie 6.3.3}
+@xrdef{Bash Conditional Expressions-title}{Bash Conditional Expressions}
+@xrdef{Bash Conditional Expressions-pg}{69}
+@xrdef{Bash Conditional Expressions-snt}{Section@tie 6.4}
+@xrdef{Shell Arithmetic-title}{Shell Arithmetic}
+@xrdef{Shell Arithmetic-pg}{70}
+@xrdef{Shell Arithmetic-snt}{Section@tie 6.5}
+@xrdef{Aliases-title}{Aliases}
+@xrdef{Aliases-pg}{71}
+@xrdef{Aliases-snt}{Section@tie 6.6}
+@xrdef{Arrays-title}{Arrays}
+@xrdef{Arrays-pg}{72}
+@xrdef{Arrays-snt}{Section@tie 6.7}
+@xrdef{The Directory Stack-title}{The Directory Stack}
+@xrdef{The Directory Stack-pg}{73}
+@xrdef{The Directory Stack-snt}{Section@tie 6.8}
+@xrdef{Directory Stack Builtins-title}{Directory Stack Builtins}
+@xrdef{Directory Stack Builtins-pg}{73}
+@xrdef{Directory Stack Builtins-snt}{Section@tie 6.8.1}
+@xrdef{Printing a Prompt-title}{Controlling the Prompt}
+@xrdef{Printing a Prompt-pg}{75}
+@xrdef{Printing a Prompt-snt}{Section@tie 6.9}
+@xrdef{The Restricted Shell-title}{The Restricted Shell}
+@xrdef{The Restricted Shell-pg}{76}
+@xrdef{The Restricted Shell-snt}{Section@tie 6.10}
+@xrdef{Bash POSIX Mode-title}{Bash POSIX Mode}
+@xrdef{Bash POSIX Mode-pg}{76}
+@xrdef{Bash POSIX Mode-snt}{Section@tie 6.11}
+@xrdef{Job Control-title}{Job Control}
+@xrdef{Job Control-pg}{79}
+@xrdef{Job Control-snt}{Chapter@tie 7}
+@xrdef{Job Control Basics-title}{Job Control Basics}
+@xrdef{Job Control Basics-pg}{79}
+@xrdef{Job Control Basics-snt}{Section@tie 7.1}
+@xrdef{Job Control Builtins-title}{Job Control Builtins}
+@xrdef{Job Control Builtins-pg}{80}
+@xrdef{Job Control Builtins-snt}{Section@tie 7.2}
+@xrdef{Job Control Variables-title}{Job Control Variables}
+@xrdef{Job Control Variables-pg}{82}
+@xrdef{Job Control Variables-snt}{Section@tie 7.3}
+@xrdef{Command Line Editing-title}{Command Line Editing}
+@xrdef{Command Line Editing-pg}{83}
+@xrdef{Command Line Editing-snt}{Chapter@tie 8}
+@xrdef{Introduction and Notation-title}{Introduction to Line Editing}
+@xrdef{Introduction and Notation-pg}{83}
+@xrdef{Introduction and Notation-snt}{Section@tie 8.1}
+@xrdef{Readline Interaction-title}{Readline Interaction}
+@xrdef{Readline Interaction-pg}{83}
+@xrdef{Readline Interaction-snt}{Section@tie 8.2}
+@xrdef{Readline Bare Essentials-title}{Readline Bare Essentials}
+@xrdef{Readline Bare Essentials-pg}{83}
+@xrdef{Readline Bare Essentials-snt}{Section@tie 8.2.1}
+@xrdef{Readline Movement Commands-title}{Readline Movement Commands}
+@xrdef{Readline Movement Commands-pg}{84}
+@xrdef{Readline Movement Commands-snt}{Section@tie 8.2.2}
+@xrdef{Readline Killing Commands-title}{Readline Killing Commands}
+@xrdef{Readline Killing Commands-pg}{85}
+@xrdef{Readline Killing Commands-snt}{Section@tie 8.2.3}
+@xrdef{Readline Arguments-title}{Readline Arguments}
+@xrdef{Readline Arguments-pg}{85}
+@xrdef{Readline Arguments-snt}{Section@tie 8.2.4}
+@xrdef{Searching-title}{Searching for Commands in the History}
+@xrdef{Searching-pg}{86}
+@xrdef{Searching-snt}{Section@tie 8.2.5}
+@xrdef{Readline Init File-title}{Readline Init File}
+@xrdef{Readline Init File-pg}{86}
+@xrdef{Readline Init File-snt}{Section@tie 8.3}
+@xrdef{Readline Init File Syntax-title}{Readline Init File Syntax}
+@xrdef{Readline Init File Syntax-pg}{86}
+@xrdef{Readline Init File Syntax-snt}{Section@tie 8.3.1}
+@xrdef{Conditional Init Constructs-title}{Conditional Init Constructs}
+@xrdef{Conditional Init Constructs-pg}{91}
+@xrdef{Conditional Init Constructs-snt}{Section@tie 8.3.2}
+@xrdef{Sample Init File-title}{Sample Init File}
+@xrdef{Sample Init File-pg}{92}
+@xrdef{Sample Init File-snt}{Section@tie 8.3.3}
+@xrdef{Bindable Readline Commands-title}{Bindable Readline Commands}
+@xrdef{Bindable Readline Commands-pg}{95}
+@xrdef{Bindable Readline Commands-snt}{Section@tie 8.4}
+@xrdef{Commands For Moving-title}{Commands For Moving}
+@xrdef{Commands For Moving-pg}{95}
+@xrdef{Commands For Moving-snt}{Section@tie 8.4.1}
+@xrdef{Commands For History-title}{Commands For Manipulating The History}
+@xrdef{Commands For History-pg}{95}
+@xrdef{Commands For History-snt}{Section@tie 8.4.2}
+@xrdef{Commands For Text-title}{Commands For Changing Text}
+@xrdef{Commands For Text-pg}{97}
+@xrdef{Commands For Text-snt}{Section@tie 8.4.3}
+@xrdef{Commands For Killing-title}{Killing And Yanking}
+@xrdef{Commands For Killing-pg}{98}
+@xrdef{Commands For Killing-snt}{Section@tie 8.4.4}
+@xrdef{Numeric Arguments-title}{Specifying Numeric Arguments}
+@xrdef{Numeric Arguments-pg}{99}
+@xrdef{Numeric Arguments-snt}{Section@tie 8.4.5}
+@xrdef{Commands For Completion-title}{Letting Readline Type For You}
+@xrdef{Commands For Completion-pg}{99}
+@xrdef{Commands For Completion-snt}{Section@tie 8.4.6}
+@xrdef{Keyboard Macros-title}{Keyboard Macros}
+@xrdef{Keyboard Macros-pg}{100}
+@xrdef{Keyboard Macros-snt}{Section@tie 8.4.7}
+@xrdef{Miscellaneous Commands-title}{Some Miscellaneous Commands}
+@xrdef{Miscellaneous Commands-pg}{101}
+@xrdef{Miscellaneous Commands-snt}{Section@tie 8.4.8}
+@xrdef{Readline vi Mode-title}{Readline vi Mode}
+@xrdef{Readline vi Mode-pg}{103}
+@xrdef{Readline vi Mode-snt}{Section@tie 8.5}
+@xrdef{Programmable Completion-title}{Programmable Completion}
+@xrdef{Programmable Completion-pg}{103}
+@xrdef{Programmable Completion-snt}{Section@tie 8.6}
+@xrdef{Programmable Completion Builtins-title}{Programmable Completion Builtins}
+@xrdef{Programmable Completion Builtins-pg}{105}
+@xrdef{Programmable Completion Builtins-snt}{Section@tie 8.7}
+@xrdef{Using History Interactively-title}{Using History Interactively}
+@xrdef{Using History Interactively-pg}{109}
+@xrdef{Using History Interactively-snt}{Chapter@tie 9}
+@xrdef{Bash History Facilities-title}{Bash History Facilities}
+@xrdef{Bash History Facilities-pg}{109}
+@xrdef{Bash History Facilities-snt}{Section@tie 9.1}
+@xrdef{Bash History Builtins-title}{Bash History Builtins}
+@xrdef{Bash History Builtins-pg}{109}
+@xrdef{Bash History Builtins-snt}{Section@tie 9.2}
+@xrdef{History Interaction-title}{History Expansion}
+@xrdef{History Interaction-pg}{111}
+@xrdef{History Interaction-snt}{Section@tie 9.3}
+@xrdef{Event Designators-title}{Event Designators}
+@xrdef{Event Designators-pg}{111}
+@xrdef{Event Designators-snt}{Section@tie 9.3.1}
+@xrdef{Word Designators-title}{Word Designators}
+@xrdef{Word Designators-pg}{112}
+@xrdef{Word Designators-snt}{Section@tie 9.3.2}
+@xrdef{Modifiers-title}{Modifiers}
+@xrdef{Modifiers-pg}{113}
+@xrdef{Modifiers-snt}{Section@tie 9.3.3}
+@xrdef{Installing Bash-title}{Installing Bash}
+@xrdef{Installing Bash-pg}{115}
+@xrdef{Installing Bash-snt}{Chapter@tie 10}
+@xrdef{Basic Installation-title}{Basic Installation}
+@xrdef{Basic Installation-pg}{115}
+@xrdef{Basic Installation-snt}{Section@tie 10.1}
+@xrdef{Compilers and Options-title}{Compilers and Options}
+@xrdef{Compilers and Options-pg}{116}
+@xrdef{Compilers and Options-snt}{Section@tie 10.2}
+@xrdef{Compiling For Multiple Architectures-title}{Compiling For Multiple Architectures}
+@xrdef{Compiling For Multiple Architectures-pg}{116}
+@xrdef{Compiling For Multiple Architectures-snt}{Section@tie 10.3}
+@xrdef{Installation Names-title}{Installation Names}
+@xrdef{Installation Names-pg}{116}
+@xrdef{Installation Names-snt}{Section@tie 10.4}
+@xrdef{Specifying the System Type-title}{Specifying the System Type}
+@xrdef{Specifying the System Type-pg}{117}
+@xrdef{Specifying the System Type-snt}{Section@tie 10.5}
+@xrdef{Sharing Defaults-title}{Sharing Defaults}
+@xrdef{Sharing Defaults-pg}{117}
+@xrdef{Sharing Defaults-snt}{Section@tie 10.6}
+@xrdef{Operation Controls-title}{Operation Controls}
+@xrdef{Operation Controls-pg}{117}
+@xrdef{Operation Controls-snt}{Section@tie 10.7}
+@xrdef{Optional Features-title}{Optional Features}
+@xrdef{Optional Features-pg}{117}
+@xrdef{Optional Features-snt}{Section@tie 10.8}
+@xrdef{Reporting Bugs-title}{Reporting Bugs}
+@xrdef{Reporting Bugs-pg}{123}
+@xrdef{Reporting Bugs-snt}{Appendix@tie @char65{}}
+@xrdef{Major Differences From The Bourne Shell-title}{Major Differences From The Bourne Shell}
+@xrdef{Major Differences From The Bourne Shell-pg}{125}
+@xrdef{Major Differences From The Bourne Shell-snt}{Appendix@tie @char66{}}
+@xrdef{Copying This Manual-title}{Copying This Manual}
+@xrdef{Copying This Manual-pg}{131}
+@xrdef{Copying This Manual-snt}{Appendix@tie @char67{}}
+@xrdef{GNU Free Documentation License-title}{GNU Free Documentation License}
+@xrdef{GNU Free Documentation License-pg}{131}
+@xrdef{GNU Free Documentation License-snt}{Section@tie @char67.1}
+@xrdef{Builtin Index-title}{Index of Shell Builtin Commands}
+@xrdef{Builtin Index-pg}{139}
+@xrdef{Builtin Index-snt}{}
+@xrdef{Reserved Word Index-title}{Index of Shell Reserved Words}
+@xrdef{Reserved Word Index-pg}{141}
+@xrdef{Reserved Word Index-snt}{}
+@xrdef{Variable Index-title}{Parameter and Variable Index}
+@xrdef{Variable Index-pg}{143}
+@xrdef{Variable Index-snt}{}
+@xrdef{Function Index-title}{Function Index}
+@xrdef{Function Index-pg}{145}
+@xrdef{Function Index-snt}{}
+@xrdef{Concept Index-title}{Concept Index}
+@xrdef{Concept Index-pg}{147}
+@xrdef{Concept Index-snt}{}
diff --git a/doc/bashref.bt b/doc/bashref.bt
new file mode 100644 (file)
index 0000000..7dfad50
--- /dev/null
@@ -0,0 +1,56 @@
+\entry{:}{33}{\code {:}}
+\entry{.}{33}{\code {.}}
+\entry{break}{33}{\code {break}}
+\entry{cd}{33}{\code {cd}}
+\entry{continue}{34}{\code {continue}}
+\entry{eval}{34}{\code {eval}}
+\entry{exec}{34}{\code {exec}}
+\entry{exit}{34}{\code {exit}}
+\entry{export}{34}{\code {export}}
+\entry{getopts}{35}{\code {getopts}}
+\entry{hash}{35}{\code {hash}}
+\entry{pwd}{36}{\code {pwd}}
+\entry{readonly}{36}{\code {readonly}}
+\entry{return}{36}{\code {return}}
+\entry{shift}{36}{\code {shift}}
+\entry{test}{37}{\code {test}}
+\entry{[}{37}{\code {[}}
+\entry{times}{38}{\code {times}}
+\entry{trap}{38}{\code {trap}}
+\entry{umask}{38}{\code {umask}}
+\entry{unset}{39}{\code {unset}}
+\entry{alias}{39}{\code {alias}}
+\entry{bind}{39}{\code {bind}}
+\entry{builtin}{40}{\code {builtin}}
+\entry{caller}{40}{\code {caller}}
+\entry{command}{41}{\code {command}}
+\entry{declare}{41}{\code {declare}}
+\entry{echo}{42}{\code {echo}}
+\entry{enable}{42}{\code {enable}}
+\entry{help}{43}{\code {help}}
+\entry{let}{43}{\code {let}}
+\entry{local}{43}{\code {local}}
+\entry{logout}{43}{\code {logout}}
+\entry{printf}{43}{\code {printf}}
+\entry{read}{44}{\code {read}}
+\entry{shopt}{45}{\code {shopt}}
+\entry{source}{48}{\code {source}}
+\entry{type}{48}{\code {type}}
+\entry{typeset}{49}{\code {typeset}}
+\entry{ulimit}{49}{\code {ulimit}}
+\entry{unalias}{50}{\code {unalias}}
+\entry{set}{50}{\code {set}}
+\entry{dirs}{73}{\code {dirs}}
+\entry{popd}{74}{\code {popd}}
+\entry{pushd}{74}{\code {pushd}}
+\entry{bg}{80}{\code {bg}}
+\entry{fg}{80}{\code {fg}}
+\entry{jobs}{80}{\code {jobs}}
+\entry{kill}{81}{\code {kill}}
+\entry{wait}{81}{\code {wait}}
+\entry{disown}{81}{\code {disown}}
+\entry{suspend}{81}{\code {suspend}}
+\entry{compgen}{105}{\code {compgen}}
+\entry{complete}{105}{\code {complete}}
+\entry{fc}{109}{\code {fc}}
+\entry{history}{110}{\code {history}}
diff --git a/doc/bashref.bts b/doc/bashref.bts
new file mode 100644 (file)
index 0000000..aab8628
--- /dev/null
@@ -0,0 +1,76 @@
+\initial {.}
+\entry {\code {.}}{33}
+\initial {:}
+\entry {\code {:}}{33}
+\initial {[}
+\entry {\code {[}}{37}
+\initial {A}
+\entry {\code {alias}}{39}
+\initial {B}
+\entry {\code {bg}}{80}
+\entry {\code {bind}}{39}
+\entry {\code {break}}{33}
+\entry {\code {builtin}}{40}
+\initial {C}
+\entry {\code {caller}}{40}
+\entry {\code {cd}}{33}
+\entry {\code {command}}{41}
+\entry {\code {compgen}}{105}
+\entry {\code {complete}}{105}
+\entry {\code {continue}}{34}
+\initial {D}
+\entry {\code {declare}}{41}
+\entry {\code {dirs}}{73}
+\entry {\code {disown}}{81}
+\initial {E}
+\entry {\code {echo}}{42}
+\entry {\code {enable}}{42}
+\entry {\code {eval}}{34}
+\entry {\code {exec}}{34}
+\entry {\code {exit}}{34}
+\entry {\code {export}}{34}
+\initial {F}
+\entry {\code {fc}}{109}
+\entry {\code {fg}}{80}
+\initial {G}
+\entry {\code {getopts}}{35}
+\initial {H}
+\entry {\code {hash}}{35}
+\entry {\code {help}}{43}
+\entry {\code {history}}{110}
+\initial {J}
+\entry {\code {jobs}}{80}
+\initial {K}
+\entry {\code {kill}}{81}
+\initial {L}
+\entry {\code {let}}{43}
+\entry {\code {local}}{43}
+\entry {\code {logout}}{43}
+\initial {P}
+\entry {\code {popd}}{74}
+\entry {\code {printf}}{43}
+\entry {\code {pushd}}{74}
+\entry {\code {pwd}}{36}
+\initial {R}
+\entry {\code {read}}{44}
+\entry {\code {readonly}}{36}
+\entry {\code {return}}{36}
+\initial {S}
+\entry {\code {set}}{50}
+\entry {\code {shift}}{36}
+\entry {\code {shopt}}{45}
+\entry {\code {source}}{48}
+\entry {\code {suspend}}{81}
+\initial {T}
+\entry {\code {test}}{37}
+\entry {\code {times}}{38}
+\entry {\code {trap}}{38}
+\entry {\code {type}}{48}
+\entry {\code {typeset}}{49}
+\initial {U}
+\entry {\code {ulimit}}{49}
+\entry {\code {umask}}{38}
+\entry {\code {unalias}}{50}
+\entry {\code {unset}}{39}
+\initial {W}
+\entry {\code {wait}}{81}
diff --git a/doc/bashref.cp b/doc/bashref.cp
new file mode 100644 (file)
index 0000000..1d42b6c
--- /dev/null
@@ -0,0 +1,118 @@
+\entry{POSIX}{3}{POSIX}
+\entry{builtin}{3}{builtin}
+\entry{control operator}{3}{control operator}
+\entry{exit status}{3}{exit status}
+\entry{field}{3}{field}
+\entry{filename}{3}{filename}
+\entry{job}{3}{job}
+\entry{job control}{3}{job control}
+\entry{metacharacter}{3}{metacharacter}
+\entry{name}{3}{name}
+\entry{identifier}{3}{identifier}
+\entry{operator, shell}{3}{operator, shell}
+\entry{process group}{3}{process group}
+\entry{process group ID}{3}{process group ID}
+\entry{reserved word}{3}{reserved word}
+\entry{return status}{3}{return status}
+\entry{signal}{4}{signal}
+\entry{special builtin}{4}{special builtin}
+\entry{token}{4}{token}
+\entry{word}{4}{word}
+\entry{Bourne shell}{5}{Bourne shell}
+\entry{quoting}{6}{quoting}
+\entry{quoting, ANSI}{6}{quoting, ANSI}
+\entry{localization}{7}{localization}
+\entry{internationalization}{7}{internationalization}
+\entry{native languages}{7}{native languages}
+\entry{translation, native languages}{7}{translation, native languages}
+\entry{comments, shell}{7}{comments, shell}
+\entry{commands, shell}{8}{commands, shell}
+\entry{commands, simple}{8}{commands, simple}
+\entry{pipeline}{8}{pipeline}
+\entry{commands, pipelines}{8}{commands, pipelines}
+\entry{command timing}{8}{command timing}
+\entry{commands, lists}{9}{commands, lists}
+\entry{commands, compound}{9}{commands, compound}
+\entry{commands, looping}{9}{commands, looping}
+\entry{commands, conditional}{10}{commands, conditional}
+\entry{commands, grouping}{13}{commands, grouping}
+\entry{shell function}{13}{shell function}
+\entry{functions, shell}{13}{functions, shell}
+\entry{parameters}{15}{parameters}
+\entry{variable, shell}{15}{variable, shell}
+\entry{shell variable}{15}{shell variable}
+\entry{parameters, positional}{15}{parameters, positional}
+\entry{parameters, special}{15}{parameters, special}
+\entry{expansion}{16}{expansion}
+\entry{brace expansion}{17}{brace expansion}
+\entry{expansion, brace}{17}{expansion, brace}
+\entry{tilde expansion}{18}{tilde expansion}
+\entry{expansion, tilde}{18}{expansion, tilde}
+\entry{parameter expansion}{18}{parameter expansion}
+\entry{expansion, parameter}{18}{expansion, parameter}
+\entry{command substitution}{21}{command substitution}
+\entry{expansion, arithmetic}{21}{expansion, arithmetic}
+\entry{arithmetic expansion}{21}{arithmetic expansion}
+\entry{process substitution}{22}{process substitution}
+\entry{word splitting}{22}{word splitting}
+\entry{expansion, filename}{22}{expansion, filename}
+\entry{expansion, pathname}{22}{expansion, pathname}
+\entry{filename expansion}{22}{filename expansion}
+\entry{pathname expansion}{22}{pathname expansion}
+\entry{pattern matching}{23}{pattern matching}
+\entry{matching, pattern}{23}{matching, pattern}
+\entry{redirection}{24}{redirection}
+\entry{command expansion}{28}{command expansion}
+\entry{command execution}{28}{command execution}
+\entry{command search}{28}{command search}
+\entry{execution environment}{29}{execution environment}
+\entry{environment}{30}{environment}
+\entry{exit status}{30}{exit status}
+\entry{signal handling}{31}{signal handling}
+\entry{shell script}{31}{shell script}
+\entry{special builtin}{53}{special builtin}
+\entry{login shell}{65}{login shell}
+\entry{interactive shell}{65}{interactive shell}
+\entry{startup files}{65}{startup files}
+\entry{interactive shell}{67}{interactive shell}
+\entry{shell, interactive}{67}{shell, interactive}
+\entry{expressions, conditional}{69}{expressions, conditional}
+\entry{arithmetic, shell}{70}{arithmetic, shell}
+\entry{shell arithmetic}{70}{shell arithmetic}
+\entry{expressions, arithmetic}{70}{expressions, arithmetic}
+\entry{evaluation, arithmetic}{70}{evaluation, arithmetic}
+\entry{arithmetic evaluation}{70}{arithmetic evaluation}
+\entry{alias expansion}{71}{alias expansion}
+\entry{arrays}{72}{arrays}
+\entry{directory stack}{73}{directory stack}
+\entry{prompting}{75}{prompting}
+\entry{restricted shell}{76}{restricted shell}
+\entry{POSIX Mode}{76}{POSIX Mode}
+\entry{job control}{79}{job control}
+\entry{foreground}{79}{foreground}
+\entry{background}{79}{background}
+\entry{suspending jobs}{79}{suspending jobs}
+\entry{Readline, how to use}{82}{Readline, how to use}
+\entry{interaction, readline}{83}{interaction, readline}
+\entry{notation, readline}{83}{notation, readline}
+\entry{command editing}{83}{command editing}
+\entry{editing command lines}{83}{editing command lines}
+\entry{killing text}{85}{killing text}
+\entry{yanking text}{85}{yanking text}
+\entry{kill ring}{85}{kill ring}
+\entry{initialization file, readline}{86}{initialization file, readline}
+\entry{variables, readline}{87}{variables, readline}
+\entry{programmable completion}{103}{programmable completion}
+\entry{completion builtins}{105}{completion builtins}
+\entry{History, how to use}{108}{History, how to use}
+\entry{command history}{109}{command history}
+\entry{history list}{109}{history list}
+\entry{history builtins}{109}{history builtins}
+\entry{history expansion}{111}{history expansion}
+\entry{event designators}{111}{event designators}
+\entry{history events}{111}{history events}
+\entry{installation}{115}{installation}
+\entry{configuration}{115}{configuration}
+\entry{Bash installation}{115}{Bash installation}
+\entry{Bash configuration}{115}{Bash configuration}
+\entry{FDL, GNU Free Documentation License}{131}{FDL, GNU Free Documentation License}
diff --git a/doc/bashref.cps b/doc/bashref.cps
new file mode 100644 (file)
index 0000000..1580164
--- /dev/null
@@ -0,0 +1,136 @@
+\initial {A}
+\entry {alias expansion}{71}
+\entry {arithmetic evaluation}{70}
+\entry {arithmetic expansion}{21}
+\entry {arithmetic, shell}{70}
+\entry {arrays}{72}
+\initial {B}
+\entry {background}{79}
+\entry {Bash configuration}{115}
+\entry {Bash installation}{115}
+\entry {Bourne shell}{5}
+\entry {brace expansion}{17}
+\entry {builtin}{3}
+\initial {C}
+\entry {command editing}{83}
+\entry {command execution}{28}
+\entry {command expansion}{28}
+\entry {command history}{109}
+\entry {command search}{28}
+\entry {command substitution}{21}
+\entry {command timing}{8}
+\entry {commands, compound}{9}
+\entry {commands, conditional}{10}
+\entry {commands, grouping}{13}
+\entry {commands, lists}{9}
+\entry {commands, looping}{9}
+\entry {commands, pipelines}{8}
+\entry {commands, shell}{8}
+\entry {commands, simple}{8}
+\entry {comments, shell}{7}
+\entry {completion builtins}{105}
+\entry {configuration}{115}
+\entry {control operator}{3}
+\initial {D}
+\entry {directory stack}{73}
+\initial {E}
+\entry {editing command lines}{83}
+\entry {environment}{30}
+\entry {evaluation, arithmetic}{70}
+\entry {event designators}{111}
+\entry {execution environment}{29}
+\entry {exit status}{3, 30}
+\entry {expansion}{16}
+\entry {expansion, arithmetic}{21}
+\entry {expansion, brace}{17}
+\entry {expansion, filename}{22}
+\entry {expansion, parameter}{18}
+\entry {expansion, pathname}{22}
+\entry {expansion, tilde}{18}
+\entry {expressions, arithmetic}{70}
+\entry {expressions, conditional}{69}
+\initial {F}
+\entry {FDL, GNU Free Documentation License}{131}
+\entry {field}{3}
+\entry {filename}{3}
+\entry {filename expansion}{22}
+\entry {foreground}{79}
+\entry {functions, shell}{13}
+\initial {H}
+\entry {history builtins}{109}
+\entry {history events}{111}
+\entry {history expansion}{111}
+\entry {history list}{109}
+\entry {History, how to use}{108}
+\initial {I}
+\entry {identifier}{3}
+\entry {initialization file, readline}{86}
+\entry {installation}{115}
+\entry {interaction, readline}{83}
+\entry {interactive shell}{65, 67}
+\entry {internationalization}{7}
+\initial {J}
+\entry {job}{3}
+\entry {job control}{3, 79}
+\initial {K}
+\entry {kill ring}{85}
+\entry {killing text}{85}
+\initial {L}
+\entry {localization}{7}
+\entry {login shell}{65}
+\initial {M}
+\entry {matching, pattern}{23}
+\entry {metacharacter}{3}
+\initial {N}
+\entry {name}{3}
+\entry {native languages}{7}
+\entry {notation, readline}{83}
+\initial {O}
+\entry {operator, shell}{3}
+\initial {P}
+\entry {parameter expansion}{18}
+\entry {parameters}{15}
+\entry {parameters, positional}{15}
+\entry {parameters, special}{15}
+\entry {pathname expansion}{22}
+\entry {pattern matching}{23}
+\entry {pipeline}{8}
+\entry {POSIX}{3}
+\entry {POSIX Mode}{76}
+\entry {process group}{3}
+\entry {process group ID}{3}
+\entry {process substitution}{22}
+\entry {programmable completion}{103}
+\entry {prompting}{75}
+\initial {Q}
+\entry {quoting}{6}
+\entry {quoting, ANSI}{6}
+\initial {R}
+\entry {Readline, how to use}{82}
+\entry {redirection}{24}
+\entry {reserved word}{3}
+\entry {restricted shell}{76}
+\entry {return status}{3}
+\initial {S}
+\entry {shell arithmetic}{70}
+\entry {shell function}{13}
+\entry {shell script}{31}
+\entry {shell variable}{15}
+\entry {shell, interactive}{67}
+\entry {signal}{4}
+\entry {signal handling}{31}
+\entry {special builtin}{4, 53}
+\entry {startup files}{65}
+\entry {suspending jobs}{79}
+\initial {T}
+\entry {tilde expansion}{18}
+\entry {token}{4}
+\entry {translation, native languages}{7}
+\initial {V}
+\entry {variable, shell}{15}
+\entry {variables, readline}{87}
+\initial {W}
+\entry {word}{4}
+\entry {word splitting}{22}
+\initial {Y}
+\entry {yanking text}{85}
diff --git a/doc/bashref.dvi b/doc/bashref.dvi
new file mode 100644 (file)
index 0000000..552e467
Binary files /dev/null and b/doc/bashref.dvi differ
diff --git a/doc/bashref.fn b/doc/bashref.fn
new file mode 100644 (file)
index 0000000..4216e4b
--- /dev/null
@@ -0,0 +1,95 @@
+\entry{beginning-of-line (C-a)}{95}{\code {beginning-of-line (C-a)}}
+\entry{end-of-line (C-e)}{95}{\code {end-of-line (C-e)}}
+\entry{forward-char (C-f)}{95}{\code {forward-char (C-f)}}
+\entry{backward-char (C-b)}{95}{\code {backward-char (C-b)}}
+\entry{forward-word (M-f)}{95}{\code {forward-word (M-f)}}
+\entry{backward-word (M-b)}{95}{\code {backward-word (M-b)}}
+\entry{clear-screen (C-l)}{95}{\code {clear-screen (C-l)}}
+\entry{redraw-current-line ()}{95}{\code {redraw-current-line ()}}
+\entry{accept-line (Newline or Return)}{95}{\code {accept-line (Newline or Return)}}
+\entry{previous-history (C-p)}{96}{\code {previous-history (C-p)}}
+\entry{next-history (C-n)}{96}{\code {next-history (C-n)}}
+\entry{beginning-of-history (M-<)}{96}{\code {beginning-of-history (M-<)}}
+\entry{end-of-history (M->)}{96}{\code {end-of-history (M->)}}
+\entry{reverse-search-history (C-r)}{96}{\code {reverse-search-history (C-r)}}
+\entry{forward-search-history (C-s)}{96}{\code {forward-search-history (C-s)}}
+\entry{non-incremental-reverse-search-history (M-p)}{96}{\code {non-incremental-reverse-search-history (M-p)}}
+\entry{non-incremental-forward-search-history (M-n)}{96}{\code {non-incremental-forward-search-history (M-n)}}
+\entry{history-search-forward ()}{96}{\code {history-search-forward ()}}
+\entry{history-search-backward ()}{96}{\code {history-search-backward ()}}
+\entry{yank-nth-arg (M-C-y)}{96}{\code {yank-nth-arg (M-C-y)}}
+\entry{yank-last-arg (M-. or M-_)}{96}{\code {yank-last-arg (M-. or M-_)}}
+\entry{delete-char (C-d)}{97}{\code {delete-char (C-d)}}
+\entry{backward-delete-char (Rubout)}{97}{\code {backward-delete-char (Rubout)}}
+\entry{forward-backward-delete-char ()}{97}{\code {forward-backward-delete-char ()}}
+\entry{quoted-insert (C-q or C-v)}{97}{\code {quoted-insert (C-q or C-v)}}
+\entry{self-insert (a, b, A, 1, !, ...{})}{97}{\code {self-insert (a, b, A, 1, !, \dots {})}}
+\entry{transpose-chars (C-t)}{97}{\code {transpose-chars (C-t)}}
+\entry{transpose-words (M-t)}{97}{\code {transpose-words (M-t)}}
+\entry{upcase-word (M-u)}{97}{\code {upcase-word (M-u)}}
+\entry{downcase-word (M-l)}{97}{\code {downcase-word (M-l)}}
+\entry{capitalize-word (M-c)}{97}{\code {capitalize-word (M-c)}}
+\entry{overwrite-mode ()}{97}{\code {overwrite-mode ()}}
+\entry{kill-line (C-k)}{98}{\code {kill-line (C-k)}}
+\entry{backward-kill-line (C-x Rubout)}{98}{\code {backward-kill-line (C-x Rubout)}}
+\entry{unix-line-discard (C-u)}{98}{\code {unix-line-discard (C-u)}}
+\entry{kill-whole-line ()}{98}{\code {kill-whole-line ()}}
+\entry{kill-word (M-d)}{98}{\code {kill-word (M-d)}}
+\entry{backward-kill-word (M-DEL)}{98}{\code {backward-kill-word (M-\key {DEL})}}
+\entry{unix-word-rubout (C-w)}{98}{\code {unix-word-rubout (C-w)}}
+\entry{delete-horizontal-space ()}{98}{\code {delete-horizontal-space ()}}
+\entry{kill-region ()}{98}{\code {kill-region ()}}
+\entry{copy-region-as-kill ()}{98}{\code {copy-region-as-kill ()}}
+\entry{copy-backward-word ()}{98}{\code {copy-backward-word ()}}
+\entry{copy-forward-word ()}{98}{\code {copy-forward-word ()}}
+\entry{yank (C-y)}{98}{\code {yank (C-y)}}
+\entry{yank-pop (M-y)}{98}{\code {yank-pop (M-y)}}
+\entry{digit-argument (M-0, M-1, ...{} M--)}{99}{\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}}
+\entry{universal-argument ()}{99}{\code {universal-argument ()}}
+\entry{complete (TAB)}{99}{\code {complete (\key {TAB})}}
+\entry{possible-completions (M-?)}{99}{\code {possible-completions (M-?)}}
+\entry{insert-completions (M-*)}{99}{\code {insert-completions (M-*)}}
+\entry{menu-complete ()}{99}{\code {menu-complete ()}}
+\entry{delete-char-or-list ()}{99}{\code {delete-char-or-list ()}}
+\entry{complete-filename (M-/)}{99}{\code {complete-filename (M-/)}}
+\entry{possible-filename-completions (C-x /)}{100}{\code {possible-filename-completions (C-x /)}}
+\entry{complete-username (M-~)}{100}{\code {complete-username (M-~)}}
+\entry{possible-username-completions (C-x ~)}{100}{\code {possible-username-completions (C-x ~)}}
+\entry{complete-variable (M-$)}{100}{\code {complete-variable (M-$)}}
+\entry{possible-variable-completions (C-x $)}{100}{\code {possible-variable-completions (C-x $)}}
+\entry{complete-hostname (M-@)}{100}{\code {complete-hostname (M-@)}}
+\entry{possible-hostname-completions (C-x @)}{100}{\code {possible-hostname-completions (C-x @)}}
+\entry{complete-command (M-!)}{100}{\code {complete-command (M-!)}}
+\entry{possible-command-completions (C-x !)}{100}{\code {possible-command-completions (C-x !)}}
+\entry{dynamic-complete-history (M-TAB)}{100}{\code {dynamic-complete-history (M-\key {TAB})}}
+\entry{complete-into-braces (M-{\tt \char 123})}{100}{\code {complete-into-braces (M-{\tt \char 123})}}
+\entry{start-kbd-macro (C-x ()}{100}{\code {start-kbd-macro (C-x ()}}
+\entry{end-kbd-macro (C-x ))}{100}{\code {end-kbd-macro (C-x ))}}
+\entry{call-last-kbd-macro (C-x e)}{101}{\code {call-last-kbd-macro (C-x e)}}
+\entry{re-read-init-file (C-x C-r)}{101}{\code {re-read-init-file (C-x C-r)}}
+\entry{abort (C-g)}{101}{\code {abort (C-g)}}
+\entry{do-uppercase-version (M-a, M-b, M-x, ...{})}{101}{\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}}
+\entry{prefix-meta (ESC)}{101}{\code {prefix-meta (\key {ESC})}}
+\entry{undo (C-_ or C-x C-u)}{101}{\code {undo (C-_ or C-x C-u)}}
+\entry{revert-line (M-r)}{101}{\code {revert-line (M-r)}}
+\entry{tilde-expand (M-&)}{101}{\code {tilde-expand (M-&)}}
+\entry{set-mark (C-@)}{101}{\code {set-mark (C-@)}}
+\entry{exchange-point-and-mark (C-x C-x)}{101}{\code {exchange-point-and-mark (C-x C-x)}}
+\entry{character-search (C-])}{101}{\code {character-search (C-])}}
+\entry{character-search-backward (M-C-])}{101}{\code {character-search-backward (M-C-])}}
+\entry{insert-comment (M-#)}{101}{\code {insert-comment (M-#)}}
+\entry{dump-functions ()}{102}{\code {dump-functions ()}}
+\entry{dump-variables ()}{102}{\code {dump-variables ()}}
+\entry{dump-macros ()}{102}{\code {dump-macros ()}}
+\entry{glob-complete-word (M-g)}{102}{\code {glob-complete-word (M-g)}}
+\entry{glob-expand-word (C-x *)}{102}{\code {glob-expand-word (C-x *)}}
+\entry{glob-list-expansions (C-x g)}{102}{\code {glob-list-expansions (C-x g)}}
+\entry{display-shell-version (C-x C-v)}{102}{\code {display-shell-version (C-x C-v)}}
+\entry{shell-expand-line (M-C-e)}{102}{\code {shell-expand-line (M-C-e)}}
+\entry{history-expand-line (M-^)}{102}{\code {history-expand-line (M-^)}}
+\entry{magic-space ()}{102}{\code {magic-space ()}}
+\entry{alias-expand-line ()}{102}{\code {alias-expand-line ()}}
+\entry{history-and-alias-expand-line ()}{103}{\code {history-and-alias-expand-line ()}}
+\entry{insert-last-argument (M-. or M-_)}{103}{\code {insert-last-argument (M-. or M-_)}}
+\entry{operate-and-get-next (C-o)}{103}{\code {operate-and-get-next (C-o)}}
+\entry{edit-and-execute-command (C-xC-e)}{103}{\code {edit-and-execute-command (C-xC-e)}}
diff --git a/doc/bashref.fns b/doc/bashref.fns
new file mode 100644 (file)
index 0000000..15a957a
--- /dev/null
@@ -0,0 +1,115 @@
+\initial {A}
+\entry {\code {abort (C-g)}}{101}
+\entry {\code {accept-line (Newline or Return)}}{95}
+\entry {\code {alias-expand-line ()}}{102}
+\initial {B}
+\entry {\code {backward-char (C-b)}}{95}
+\entry {\code {backward-delete-char (Rubout)}}{97}
+\entry {\code {backward-kill-line (C-x Rubout)}}{98}
+\entry {\code {backward-kill-word (M-\key {DEL})}}{98}
+\entry {\code {backward-word (M-b)}}{95}
+\entry {\code {beginning-of-history (M-<)}}{96}
+\entry {\code {beginning-of-line (C-a)}}{95}
+\initial {C}
+\entry {\code {call-last-kbd-macro (C-x e)}}{101}
+\entry {\code {capitalize-word (M-c)}}{97}
+\entry {\code {character-search (C-])}}{101}
+\entry {\code {character-search-backward (M-C-])}}{101}
+\entry {\code {clear-screen (C-l)}}{95}
+\entry {\code {complete (\key {TAB})}}{99}
+\entry {\code {complete-command (M-!)}}{100}
+\entry {\code {complete-filename (M-/)}}{99}
+\entry {\code {complete-hostname (M-@)}}{100}
+\entry {\code {complete-into-braces (M-{\tt \char 123})}}{100}
+\entry {\code {complete-username (M-~)}}{100}
+\entry {\code {complete-variable (M-$)}}{100}
+\entry {\code {copy-backward-word ()}}{98}
+\entry {\code {copy-forward-word ()}}{98}
+\entry {\code {copy-region-as-kill ()}}{98}
+\initial {D}
+\entry {\code {delete-char (C-d)}}{97}
+\entry {\code {delete-char-or-list ()}}{99}
+\entry {\code {delete-horizontal-space ()}}{98}
+\entry {\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}}{99}
+\entry {\code {display-shell-version (C-x C-v)}}{102}
+\entry {\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}}{101}
+\entry {\code {downcase-word (M-l)}}{97}
+\entry {\code {dump-functions ()}}{102}
+\entry {\code {dump-macros ()}}{102}
+\entry {\code {dump-variables ()}}{102}
+\entry {\code {dynamic-complete-history (M-\key {TAB})}}{100}
+\initial {E}
+\entry {\code {edit-and-execute-command (C-xC-e)}}{103}
+\entry {\code {end-kbd-macro (C-x ))}}{100}
+\entry {\code {end-of-history (M->)}}{96}
+\entry {\code {end-of-line (C-e)}}{95}
+\entry {\code {exchange-point-and-mark (C-x C-x)}}{101}
+\initial {F}
+\entry {\code {forward-backward-delete-char ()}}{97}
+\entry {\code {forward-char (C-f)}}{95}
+\entry {\code {forward-search-history (C-s)}}{96}
+\entry {\code {forward-word (M-f)}}{95}
+\initial {G}
+\entry {\code {glob-complete-word (M-g)}}{102}
+\entry {\code {glob-expand-word (C-x *)}}{102}
+\entry {\code {glob-list-expansions (C-x g)}}{102}
+\initial {H}
+\entry {\code {history-and-alias-expand-line ()}}{103}
+\entry {\code {history-expand-line (M-^)}}{102}
+\entry {\code {history-search-backward ()}}{96}
+\entry {\code {history-search-forward ()}}{96}
+\initial {I}
+\entry {\code {insert-comment (M-#)}}{101}
+\entry {\code {insert-completions (M-*)}}{99}
+\entry {\code {insert-last-argument (M-. or M-_)}}{103}
+\initial {K}
+\entry {\code {kill-line (C-k)}}{98}
+\entry {\code {kill-region ()}}{98}
+\entry {\code {kill-whole-line ()}}{98}
+\entry {\code {kill-word (M-d)}}{98}
+\initial {M}
+\entry {\code {magic-space ()}}{102}
+\entry {\code {menu-complete ()}}{99}
+\initial {N}
+\entry {\code {next-history (C-n)}}{96}
+\entry {\code {non-incremental-forward-search-history (M-n)}}{96}
+\entry {\code {non-incremental-reverse-search-history (M-p)}}{96}
+\initial {O}
+\entry {\code {operate-and-get-next (C-o)}}{103}
+\entry {\code {overwrite-mode ()}}{97}
+\initial {P}
+\entry {\code {possible-command-completions (C-x !)}}{100}
+\entry {\code {possible-completions (M-?)}}{99}
+\entry {\code {possible-filename-completions (C-x /)}}{100}
+\entry {\code {possible-hostname-completions (C-x @)}}{100}
+\entry {\code {possible-username-completions (C-x ~)}}{100}
+\entry {\code {possible-variable-completions (C-x $)}}{100}
+\entry {\code {prefix-meta (\key {ESC})}}{101}
+\entry {\code {previous-history (C-p)}}{96}
+\initial {Q}
+\entry {\code {quoted-insert (C-q or C-v)}}{97}
+\initial {R}
+\entry {\code {re-read-init-file (C-x C-r)}}{101}
+\entry {\code {redraw-current-line ()}}{95}
+\entry {\code {reverse-search-history (C-r)}}{96}
+\entry {\code {revert-line (M-r)}}{101}
+\initial {S}
+\entry {\code {self-insert (a, b, A, 1, !, \dots {})}}{97}
+\entry {\code {set-mark (C-@)}}{101}
+\entry {\code {shell-expand-line (M-C-e)}}{102}
+\entry {\code {start-kbd-macro (C-x ()}}{100}
+\initial {T}
+\entry {\code {tilde-expand (M-&)}}{101}
+\entry {\code {transpose-chars (C-t)}}{97}
+\entry {\code {transpose-words (M-t)}}{97}
+\initial {U}
+\entry {\code {undo (C-_ or C-x C-u)}}{101}
+\entry {\code {universal-argument ()}}{99}
+\entry {\code {unix-line-discard (C-u)}}{98}
+\entry {\code {unix-word-rubout (C-w)}}{98}
+\entry {\code {upcase-word (M-u)}}{97}
+\initial {Y}
+\entry {\code {yank (C-y)}}{98}
+\entry {\code {yank-last-arg (M-. or M-_)}}{96}
+\entry {\code {yank-nth-arg (M-C-y)}}{96}
+\entry {\code {yank-pop (M-y)}}{98}
diff --git a/doc/bashref.html b/doc/bashref.html
new file mode 100644 (file)
index 0000000..4a86961
--- /dev/null
@@ -0,0 +1,15156 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on December, 31  2003 by texi2html 1.64 -->
+<!-- 
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+-->
+<HEAD>
+<TITLE>Bash Reference Manual: </TITLE>
+
+<META NAME="description" CONTENT="Bash Reference Manual: ">
+<META NAME="keywords" CONTENT="Bash Reference Manual: ">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_Top"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Bash Reference Manual</H1></P><P>
+
+This text is a brief description of the features that are present in
+the Bash shell (version 3.0-alpha, 13 November 2003)..
+</P><P>
+
+This is Edition 3.0, last updated 13 November 2003,
+of <CITE>The GNU Bash Reference Manual</CITE>,
+for <CODE>Bash</CODE>, Version 3.0-alpha.
+</P><P>
+
+Bash contains features that appear in other popular shells, and some
+features that only appear in Bash.  Some of the shells that Bash has
+borrowed concepts from are the Bourne Shell (<TT>`sh'</TT>), the Korn Shell
+(<TT>`ksh'</TT>), and the C-shell (<TT>`csh'</TT> and its successor,
+<TT>`tcsh'</TT>). The following menu breaks the features up into
+categories based upon which one of these other shells inspired the
+feature.
+</P><P>
+
+This manual is meant as a brief introduction to features found in
+Bash.  The Bash manual page should be used as the definitive
+reference on shell behavior.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC1">1. Introduction</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An introduction to the shell.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC4">2. Definitions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Some definitions used in the rest of this
+                               manual.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC5">3. Basic Shell Features</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The shell "building blocks".</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC56">4. Shell Builtin Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands that are a part of the shell.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC61">5. Shell Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables used or set by Bash.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC64">6. Bash Features</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Features found only in Bash.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC87">7. Job Control</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A chapter describing what job control is
+                               and how Bash allows you to use it.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC115">9. Using History Interactively</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Chapter dealing with history expansion
+                               rules.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC91">8. Command Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Chapter describing the command line
+                               editing features.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC122">10. Installing Bash</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to build and install Bash on your system.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC131">A. Reporting Bugs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to report bugs in Bash.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC132">B. Major Differences From The Bourne Shell</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A terse list of the differences
+                                               between Bash and historical
+                                               versions of /bin/sh.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC134">C. Copying This Manual</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Copying this manual.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC137">Index of Shell Builtin Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of Bash builtin commands.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC138">Index of Shell Reserved Words</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of Bash reserved words.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC139">Parameter and Variable Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Quick reference helps you find the
+                               variable you want.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC140">Function Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of bindable Readline functions.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC141">Concept Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">General index for concepts described in
+                               this manual.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<HR SIZE=1>
+<A NAME="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC4"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<A NAME="Introduction"></A>
+<H1> 1. Introduction </H1>
+<!--docid::SEC1::-->
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC2">1.1 What is Bash?</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A short description of Bash.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC3">1.2 What is a shell?</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A brief introduction to shells.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="What is Bash?"></A>
+<HR SIZE="6">
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC4"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.1 What is Bash? </H2>
+<!--docid::SEC2::-->
+<P>
+
+Bash is the shell, or command language interpreter,
+for the GNU operating system.
+The name is an acronym for the <SAMP>`Bourne-Again SHell'</SAMP>,
+a pun on Stephen Bourne, the author of the direct ancestor of
+the current Unix shell <CODE>sh</CODE>, 
+which appeared in the Seventh Edition Bell Labs Research version
+of Unix.
+</P><P>
+
+Bash is largely compatible with <CODE>sh</CODE> and incorporates useful
+features from the Korn shell <CODE>ksh</CODE> and the C shell <CODE>csh</CODE>.
+It is intended to be a conformant implementation of the IEEE
+POSIX Shell and Tools specification (IEEE Working Group 1003.2).
+It offers functional improvements over <CODE>sh</CODE> for both interactive and
+programming use.
+</P><P>
+
+While the GNU operating system provides other shells, including
+a version of <CODE>csh</CODE>, Bash is the default shell.
+Like other GNU software, Bash is quite portable.  It currently runs
+on nearly every version of Unix and a few other operating systems -
+independently-supported ports exist for MS-DOS, OS/2,
+and Windows platforms.
+</P><P>
+
+<A NAME="What is a shell?"></A>
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC4"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.2 What is a shell? </H2>
+<!--docid::SEC3::-->
+<P>
+
+At its base, a shell is simply a macro processor that executes
+commands.  The term macro processor means functionality where text
+and symbols are expanded to create larger expressions.
+</P><P>
+
+A Unix shell is both a command interpreter and a programming
+language.  As a command interpreter, the shell provides the user
+interface to the rich set of GNU utilities.  The programming
+language features allow these utilitites to be combined.
+Files containing commands can be created, and become
+commands themselves.  These new commands have the same status as
+system commands in directories such as <TT>`/bin'</TT>, allowing users
+or groups to establish custom environments to automate their common
+tasks.
+</P><P>
+
+Shells may be used interactively or non-interactively.  In
+interactive mode, they accept input typed from the keyboard.
+When executing non-interactively, shells execute commands read
+from a file.
+</P><P>
+
+A shell allows execution of GNU commands, both synchronously and
+asynchronously.
+The shell waits for synchronous commands to complete before accepting
+more input; asynchronous commands continue to execute in parallel
+with the shell while it reads and executes additional commands.
+The <EM>redirection</EM> constructs permit
+fine-grained control of the input and output of those commands.
+Moreover, the shell allows control over the contents of commands'
+environments.
+</P><P>
+
+Shells also provide a small set of built-in
+commands (<EM>builtins</EM>) implementing functionality impossible
+or inconvenient to obtain via separate utilities.
+For example, <CODE>cd</CODE>, <CODE>break</CODE>, <CODE>continue</CODE>, and
+<CODE>exec</CODE>) cannot be implemented outside of the shell because
+they directly manipulate the shell itself.
+The <CODE>history</CODE>, <CODE>getopts</CODE>, <CODE>kill</CODE>, or <CODE>pwd</CODE>
+builtins, among others, could be implemented in separate utilities,
+but they are more convenient to use as builtin commands.
+All of the shell builtins are described in
+subsequent sections.
+</P><P>
+
+While executing commands is essential, most of the power (and
+complexity) of shells is due to their embedded programming
+languages.  Like any high-level language, the shell provides
+variables, flow control constructs, quoting, and functions. 
+</P><P>
+
+Shells offer features geared specifically for
+interactive use rather than to augment the programming language. 
+These interactive features include job control, command line
+editing, command history and aliases.  Each of these features is
+described in this manual.
+</P><P>
+
+<A NAME="Definitions"></A>
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 2. Definitions </H1>
+<!--docid::SEC4::-->
+These definitions are used throughout the remainder of this manual.
+<P>
+
+<DL COMPACT>
+
+<DT><CODE>POSIX</CODE>
+<DD><A NAME="IDX1"></A>
+A family of open system standards based on Unix.  Bash
+is concerned with POSIX 1003.2, the Shell and Tools Standard.
+<P>
+
+<DT><CODE>blank</CODE>
+<DD>A space or tab character.
+<P>
+
+<DT><CODE>builtin</CODE>
+<DD><A NAME="IDX2"></A>
+A command that is implemented internally by the shell itself, rather
+than by an executable program somewhere in the file system.
+<P>
+
+<DT><CODE>control operator</CODE>
+<DD><A NAME="IDX3"></A>
+A <CODE>word</CODE> that performs a control function.  It is a <CODE>newline</CODE>
+or one of the following:
+<SAMP>`||'</SAMP>, <SAMP>`&#38;&#38;'</SAMP>, <SAMP>`&#38;'</SAMP>, <SAMP>`;'</SAMP>, <SAMP>`;;'</SAMP>,
+<SAMP>`|'</SAMP>, <SAMP>`('</SAMP>, or <SAMP>`)'</SAMP>.
+<P>
+
+<DT><CODE>exit status</CODE>
+<DD><A NAME="IDX4"></A>
+The value returned by a command to its caller.  The value is restricted
+to eight bits, so the maximum value is 255.
+<P>
+
+<DT><CODE>field</CODE>
+<DD><A NAME="IDX5"></A>
+A unit of text that is the result of one of the shell expansions.  After
+expansion, when executing a command, the resulting fields are used as
+the command name and arguments.
+<P>
+
+<DT><CODE>filename</CODE>
+<DD><A NAME="IDX6"></A>
+A string of characters used to identify a file.
+<P>
+
+<DT><CODE>job</CODE>
+<DD><A NAME="IDX7"></A>
+A set of processes comprising a pipeline, and any processes descended
+from it, that are all in the same process group.
+<P>
+
+<DT><CODE>job control</CODE>
+<DD><A NAME="IDX8"></A>
+A mechanism by which users can selectively stop (suspend) and restart
+(resume) execution of processes.
+<P>
+
+<DT><CODE>metacharacter</CODE>
+<DD><A NAME="IDX9"></A>
+A character that, when unquoted, separates words.  A metacharacter is
+a <CODE>blank</CODE> or one of the following characters:
+<SAMP>`|'</SAMP>, <SAMP>`&#38;'</SAMP>, <SAMP>`;'</SAMP>, <SAMP>`('</SAMP>, <SAMP>`)'</SAMP>, <SAMP>`&#60;'</SAMP>, or
+<SAMP>`&#62;'</SAMP>.
+<P>
+
+<DT><CODE>name</CODE>
+<DD><A NAME="IDX10"></A>
+<A NAME="IDX11"></A>
+A <CODE>word</CODE> consisting solely of letters, numbers, and underscores,
+and beginning with a letter or underscore.  <CODE>Name</CODE>s are used as
+shell variable and function names.
+Also referred to as an <CODE>identifier</CODE>.
+<P>
+
+<DT><CODE>operator</CODE>
+<DD><A NAME="IDX12"></A>
+A <CODE>control operator</CODE> or a <CODE>redirection operator</CODE>.
+See section <A HREF="bashref.html#SEC38">3.6 Redirections</A>, for a list of redirection operators.
+<P>
+
+<DT><CODE>process group</CODE>
+<DD><A NAME="IDX13"></A>
+A collection of related processes each having the same process
+group ID.
+<P>
+
+<DT><CODE>process group ID</CODE>
+<DD><A NAME="IDX14"></A>
+A unique identifer that represents a <CODE>process group</CODE>
+during its lifetime.
+<P>
+
+<DT><CODE>reserved word</CODE>
+<DD><A NAME="IDX15"></A>
+A <CODE>word</CODE> that has a special meaning to the shell.  Most reserved
+words introduce shell flow control constructs, such as <CODE>for</CODE> and
+<CODE>while</CODE>.
+<P>
+
+<DT><CODE>return status</CODE>
+<DD><A NAME="IDX16"></A>
+A synonym for <CODE>exit status</CODE>.
+<P>
+
+<DT><CODE>signal</CODE>
+<DD><A NAME="IDX17"></A>
+A mechanism by which a process may be notified by the kernel
+of an event occurring in the system.
+<P>
+
+<DT><CODE>special builtin</CODE>
+<DD><A NAME="IDX18"></A>
+A shell builtin command that has been classified as special by the
+POSIX 1003.2 standard.
+<P>
+
+<DT><CODE>token</CODE>
+<DD><A NAME="IDX19"></A>
+A sequence of characters considered a single unit by the shell.  It is
+either a <CODE>word</CODE> or an <CODE>operator</CODE>.
+<P>
+
+<DT><CODE>word</CODE>
+<DD><A NAME="IDX20"></A>
+A <CODE>token</CODE> that is not an <CODE>operator</CODE>.
+</DL>
+<P>
+
+<A NAME="Basic Shell Features"></A>
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 3. Basic Shell Features </H1>
+<!--docid::SEC5::-->
+<P>
+
+Bash is an acronym for <SAMP>`Bourne-Again SHell'</SAMP>.
+The Bourne shell is
+the traditional Unix shell originally written by Stephen Bourne.
+All of the Bourne shell builtin commands are available in Bash,
+The rules for evaluation and quoting are taken from the POSIX
+specification for the `standard' Unix shell.
+</P><P>
+
+This chapter briefly summarizes the shell's `building blocks':
+commands, control structures, shell functions, shell <I>parameters</I>,
+shell expansions,
+<I>redirections</I>, which are a way to direct input and output from
+and to named files, and how the shell executes commands.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC6">3.1 Shell Syntax</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What your input means to the shell.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC15">3.2 Shell Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The types of commands you can use.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC23">3.3 Shell Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Grouping commands by name.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC24">3.4 Shell Parameters</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How the shell stores values.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC27">3.5 Shell Expansions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How Bash expands parameters and the various
+                               expansions available.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC38">3.6 Redirections</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A way to control where input and output go.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC48">3.7 Executing Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What happens when you run a command.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC55">3.8 Shell Scripts</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Executing files of shell commands.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Shell Syntax"></A>
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.1 Shell Syntax </H2>
+<!--docid::SEC6::-->
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC7">3.1.1 Shell Operation</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The basic operation of the shell.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC8">3.1.2 Quoting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to remove the special meaning from characters.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC14">3.1.3 Comments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to specify comments.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+When the shell reads input, it proceeds through a
+sequence of operations.  If the input indicates the beginning of a
+comment, the shell ignores the comment symbol (<SAMP>`#'</SAMP>), and the rest
+of that line.
+                                
+Otherwise, roughly speaking,  the shell reads its input and
+divides the input into words and operators, employing the quoting rules
+to select which meanings to assign various words and characters.
+</P><P>
+
+The shell then parses these tokens into commands and other constructs,
+removes the special meaning of certain words or characters, expands
+others, redirects input and output as needed, executes the specified
+command, waits for the command's exit status, and makes that exit status
+available for further inspection or processing.
+</P><P>
+
+<A NAME="Shell Operation"></A>
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.1.1 Shell Operation </H3>
+<!--docid::SEC7::-->
+<P>
+
+The following is a brief description of the shell's operation when it
+reads and executes a command.  Basically, the shell does the
+following:
+</P><P>
+
+<OL>
+<LI>
+Reads its input from a file (see section <A HREF="bashref.html#SEC55">3.8 Shell Scripts</A>), from a string
+supplied as an argument to the <SAMP>`-c'</SAMP> invocation option
+(see section <A HREF="bashref.html#SEC65">6.1 Invoking Bash</A>), or from the user's terminal.
+<P>
+
+<LI>
+Breaks the input into words and operators, obeying the quoting rules
+described in <A HREF="bashref.html#SEC8">3.1.2 Quoting</A>.  These tokens are separated by
+<CODE>metacharacters</CODE>.  Alias expansion is performed by this step
+(see section <A HREF="bashref.html#SEC80">6.6 Aliases</A>).
+<P>
+
+<LI>
+Parses the tokens into simple and compound commands
+(see section <A HREF="bashref.html#SEC15">3.2 Shell Commands</A>).
+<P>
+
+<LI>
+Performs the various shell expansions (see section <A HREF="bashref.html#SEC27">3.5 Shell Expansions</A>), breaking
+the expanded tokens into lists of filenames (see section <A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A>)
+and commands and arguments.
+<P>
+
+<LI>
+Performs any necessary redirections (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>) and removes
+the redirection operators and their operands from the argument list.
+<P>
+
+<LI>
+Executes the command (see section <A HREF="bashref.html#SEC48">3.7 Executing Commands</A>).
+<P>
+
+<LI>
+Optionally waits for the command to complete and collects its exit
+status (see section <A HREF="bashref.html#SEC53">3.7.5 Exit Status</A>).
+<P>
+
+</OL>
+<P>
+
+<A NAME="Quoting"></A>
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.1.2 Quoting </H3>
+<!--docid::SEC8::-->
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC9">3.1.2.1 Escape Character</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to remove the special meaning from a single
+                       character.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC10">3.1.2.2 Single Quotes</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to inhibit all interpretation of a sequence
+                       of characters.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC11">3.1.2.3 Double Quotes</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to suppress most of the interpretation of a
+                       sequence of characters.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC12">3.1.2.4 ANSI-C Quoting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to expand ANSI-C sequences in quoted strings.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to translate strings into different languages.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+Quoting is used to remove the special meaning of certain
+characters or words to the shell.  Quoting can be used to
+disable special treatment for special characters, to prevent
+reserved words from being recognized as such, and to prevent
+parameter expansion.
+</P><P>
+
+Each of the shell metacharacters (see section <A HREF="bashref.html#SEC4">2. Definitions</A>)
+has special meaning to the shell and must be quoted if it is to
+represent itself.
+When the command history expansion facilities are being used, the
+<VAR>history expansion</VAR> character, usually <SAMP>`!'</SAMP>, must be quoted
+to prevent history expansion.  See section <A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A>, for
+more details concerning history expansion.
+</P><P>
+
+There are three quoting mechanisms: the
+<VAR>escape character</VAR>, single quotes, and double quotes.
+</P><P>
+
+<A NAME="Escape Character"></A>
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC8"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.1.2.1 Escape Character </H4>
+<!--docid::SEC9::-->
+A non-quoted backslash <SAMP>`\'</SAMP> is the Bash escape character.
+It preserves the literal value of the next character that follows,
+with the exception of <CODE>newline</CODE>.  If a <CODE>\newline</CODE> pair
+appears, and the backslash itself is not quoted, the <CODE>\newline</CODE>
+is treated as a line continuation (that is, it is removed from
+the input stream and effectively ignored).
+<P>
+
+<A NAME="Single Quotes"></A>
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC11"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC8"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.1.2.2 Single Quotes </H4>
+<!--docid::SEC10::-->
+<P>
+
+Enclosing characters in single quotes (<SAMP>`''</SAMP>) preserves the literal value
+of each character within the quotes.  A single quote may not occur
+between single quotes, even when preceded by a backslash.
+</P><P>
+
+<A NAME="Double Quotes"></A>
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC12"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC8"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.1.2.3 Double Quotes </H4>
+<!--docid::SEC11::-->
+<P>
+
+Enclosing characters in double quotes (<SAMP>`"'</SAMP>) preserves the literal value
+of all characters within the quotes, with the exception of
+<SAMP>`$'</SAMP>, <SAMP>``'</SAMP>, and <SAMP>`\'</SAMP>.
+The characters <SAMP>`$'</SAMP> and <SAMP>``'</SAMP>
+retain their special meaning within double quotes (see section <A HREF="bashref.html#SEC27">3.5 Shell Expansions</A>).
+The backslash retains its special meaning only when followed by one of
+the following characters:
+<SAMP>`$'</SAMP>, <SAMP>``'</SAMP>, <SAMP>`"'</SAMP>, <SAMP>`\'</SAMP>, or <CODE>newline</CODE>.
+Within double quotes, backslashes that are followed by one of these
+characters are removed.  Backslashes preceding characters without a
+special meaning are left unmodified.
+A double quote may be quoted within double quotes by preceding it with
+a backslash.
+When command history is being used, the double quote may not be used to
+quote the history expansion character.
+</P><P>
+
+The special parameters <SAMP>`*'</SAMP> and <SAMP>`@'</SAMP> have special meaning
+when in double quotes (see section <A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>).
+</P><P>
+
+<A NAME="ANSI-C Quoting"></A>
+<HR SIZE="6">
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC8"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.1.2.4 ANSI-C Quoting </H4>
+<!--docid::SEC12::-->
+<P>
+
+Words of the form <CODE>$'<VAR>string</VAR>'</CODE> are treated specially.  The
+word expands to <VAR>string</VAR>, with backslash-escaped characters replaced
+as specified by the ANSI C standard.  Backslash escape sequences, if
+present, are decoded as follows:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>\a</CODE>
+<DD>alert (bell)
+<DT><CODE>\b</CODE>
+<DD>backspace
+<DT><CODE>\e</CODE>
+<DD>an escape character (not ANSI C)
+<DT><CODE>\f</CODE>
+<DD>form feed
+<DT><CODE>\n</CODE>
+<DD>newline
+<DT><CODE>\r</CODE>
+<DD>carriage return
+<DT><CODE>\t</CODE>
+<DD>horizontal tab
+<DT><CODE>\v</CODE>
+<DD>vertical tab
+<DT><CODE>\\</CODE>
+<DD>backslash
+<DT><CODE>\'</CODE>
+<DD>single quote
+<DT><CODE>\<VAR>nnn</VAR></CODE>
+<DD>the eight-bit character whose value is the octal value <VAR>nnn</VAR>
+(one to three digits)
+<DT><CODE>\x<VAR>HH</VAR></CODE>
+<DD>the eight-bit character whose value is the hexadecimal value <VAR>HH</VAR>
+(one or two hex digits)
+<DT><CODE>\c<VAR>x</VAR></CODE>
+<DD>a control-<VAR>x</VAR> character
+</DL>
+<P>
+
+The expanded result is single-quoted, as if the dollar sign had not
+been present.
+</P><P>
+
+<A NAME="Locale Translation"></A>
+<HR SIZE="6">
+<A NAME="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC8"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.1.2.5 Locale-Specific Translation </H4>
+<!--docid::SEC13::-->
+<P>
+
+A double-quoted string preceded by a dollar sign (<SAMP>`$'</SAMP>) will cause
+the string to be translated according to the current locale.
+If the current locale is <CODE>C</CODE> or <CODE>POSIX</CODE>, the dollar sign
+is ignored.
+If the string is translated and replaced, the replacement is
+double-quoted.
+</P><P>
+
+<A NAME="IDX21"></A>
+<A NAME="IDX22"></A>
+<A NAME="IDX23"></A>
+Some systems use the message catalog selected by the <CODE>LC_MESSAGES</CODE>
+shell variable.  Others create the name of the message catalog from the
+value of the <CODE>TEXTDOMAIN</CODE> shell variable, possibly adding a
+suffix of <SAMP>`.mo'</SAMP>.  If you use the <CODE>TEXTDOMAIN</CODE> variable, you
+may need to set the <CODE>TEXTDOMAINDIR</CODE> variable to the location of
+the message catalog files.  Still others use both variables in this
+fashion:
+<CODE>TEXTDOMAINDIR</CODE>/<CODE>LC_MESSAGES</CODE>/LC_MESSAGES/<CODE>TEXTDOMAIN</CODE>.mo.
+</P><P>
+
+<A NAME="Comments"></A>
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.1.3 Comments </H3>
+<!--docid::SEC14::-->
+<P>
+
+In a non-interactive shell, or an interactive shell in which the
+<CODE>interactive_comments</CODE> option to the <CODE>shopt</CODE>
+builtin is enabled (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>),
+a word beginning with <SAMP>`#'</SAMP>
+causes that word and all remaining characters on that line to
+be ignored.  An interactive shell without the <CODE>interactive_comments</CODE>
+option enabled does not allow comments.  The <CODE>interactive_comments</CODE>
+option is on by default in interactive shells.
+See section <A HREF="bashref.html#SEC74">6.3 Interactive Shells</A>, for a description of what makes
+a shell interactive.
+</P><P>
+
+<A NAME="Shell Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.2 Shell Commands </H2>
+<!--docid::SEC15::-->
+<P>
+
+A simple shell command such as <CODE>echo a b c</CODE> consists of the command
+itself followed by arguments, separated by spaces.
+</P><P>
+
+More complex shell commands are composed of simple commands arranged together
+in a variety of ways: in a pipeline in which the output of one command
+becomes the input of a second, in a loop or conditional construct, or in
+some other grouping.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC16">3.2.1 Simple Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The most common type of command.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC17">3.2.2 Pipelines</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Connecting the input and output of several
+                               commands.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC18">3.2.3 Lists of Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to execute commands sequentially.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC19">3.2.4 Compound Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Shell commands for control flow.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Simple Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.2.1 Simple Commands </H3>
+<!--docid::SEC16::-->
+<P>
+
+A simple command is the kind of command encountered most often.
+It's just a sequence of words separated by <CODE>blank</CODE>s, terminated
+by one of the shell's control operators (see section <A HREF="bashref.html#SEC4">2. Definitions</A>).  The
+first word generally specifies a command to be executed, with the
+rest of the words being that command's arguments.
+</P><P>
+
+The return status (see section <A HREF="bashref.html#SEC53">3.7.5 Exit Status</A>) of a simple command is
+its exit status as provided
+by the POSIX 1003.1 <CODE>waitpid</CODE> function, or 128+<VAR>n</VAR> if
+the command was terminated by signal <VAR>n</VAR>.
+</P><P>
+
+<A NAME="Pipelines"></A>
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC18"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.2.2 Pipelines </H3>
+<!--docid::SEC17::-->
+<P>
+
+A <CODE>pipeline</CODE> is a sequence of simple commands separated by
+<SAMP>`|'</SAMP>.
+</P><P>
+
+<A NAME="IDX24"></A>
+<A NAME="IDX25"></A>
+<A NAME="IDX26"></A>
+The format for a pipeline is
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<CODE>time</CODE> [<CODE>-p</CODE>]] [<CODE>!</CODE>] <VAR>command1</VAR> [<CODE>|</CODE> <VAR>command2</VAR> <small>...</small>]
+</pre></td></tr></table></P><P>
+
+The output of each command in the pipeline is connected via a pipe
+to the input of the next command.
+That is, each command reads the previous command's output.
+</P><P>
+
+The reserved word <CODE>time</CODE> causes timing statistics
+to be printed for the pipeline once it finishes.
+The statistics currently consist of elapsed (wall-clock) time and
+user and system time consumed by the command's execution.
+The <SAMP>`-p'</SAMP> option changes the output format to that specified
+by POSIX.
+The <CODE>TIMEFORMAT</CODE> variable may be set to a format string that
+specifies how the timing information should be displayed.
+See section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>, for a description of the available formats.
+The use of <CODE>time</CODE> as a reserved word permits the timing of
+shell builtins, shell functions, and pipelines.  An external
+<CODE>time</CODE> command cannot time these easily.
+</P><P>
+
+If the pipeline is not executed asynchronously (see section <A HREF="bashref.html#SEC18">3.2.3 Lists of Commands</A>), the
+shell waits for all commands in the pipeline to complete.
+</P><P>
+
+Each command in a pipeline is executed in its own subshell
+(see section <A HREF="bashref.html#SEC51">3.7.3 Command Execution Environment</A>).  The exit
+status of a pipeline is the exit status of the last command in the
+pipeline, unless the <CODE>pipefail</CODE> option is enabled
+(see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+If <CODE>pipefail</CODE> is enabled, the pipeline's return status is the
+value of the last (rightmost) command to exit with a non-zero status,
+or zero if all commands exit successfully.
+If the reserved word <SAMP>`!'</SAMP> precedes the pipeline, the
+exit status is the logical negation of the exit status as described
+above.
+The shell waits for all commands in the pipeline to terminate before
+returning a value.
+</P><P>
+
+<A NAME="Lists"></A>
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.2.3 Lists of Commands </H3>
+<!--docid::SEC18::-->
+<P>
+
+A <CODE>list</CODE> is a sequence of one or more pipelines separated by one
+of the operators <SAMP>`;'</SAMP>, <SAMP>`&#38;'</SAMP>, <SAMP>`&#38;&#38;'</SAMP>, or <SAMP>`||'</SAMP>,
+and optionally terminated by one of <SAMP>`;'</SAMP>, <SAMP>`&#38;'</SAMP>, or a
+<CODE>newline</CODE>.
+</P><P>
+
+Of these list operators, <SAMP>`&#38;&#38;'</SAMP> and <SAMP>`||'</SAMP>
+have equal precedence, followed by <SAMP>`;'</SAMP> and <SAMP>`&#38;'</SAMP>,
+which have equal precedence.
+</P><P>
+
+A sequence of one or more newlines may appear in a <CODE>list</CODE>
+to delimit commands, equivalent to a semicolon.
+</P><P>
+
+If a command is terminated by the control operator <SAMP>`&#38;'</SAMP>,
+the shell executes the command asynchronously in a subshell.
+This is known as executing the command in the <VAR>background</VAR>.
+The shell does not wait for the command to finish, and the return
+status is 0 (true).
+When job control is not active (see section <A HREF="bashref.html#SEC87">7. Job Control</A>),
+the standard input for asynchronous commands, in the absence of any
+explicit redirections, is redirected from <CODE>/dev/null</CODE>.
+</P><P>
+
+Commands separated by a <SAMP>`;'</SAMP> are executed sequentially; the shell
+waits for each command to terminate in turn.  The return status is the
+exit status of the last command executed.
+</P><P>
+
+The control operators <SAMP>`&#38;&#38;'</SAMP> and <SAMP>`||'</SAMP>
+denote AND lists and OR lists, respectively.
+An AND list has the form
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><VAR>command1</VAR> &#38;&#38; <VAR>command2</VAR>
+</pre></td></tr></table></P><P>
+
+<VAR>command2</VAR> is executed if, and only if, <VAR>command1</VAR>
+returns an exit status of zero.
+</P><P>
+
+An OR list has the form
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><VAR>command1</VAR> || <VAR>command2</VAR>
+</pre></td></tr></table></P><P>
+
+<VAR>command2</VAR> is executed if, and only if, <VAR>command1</VAR>
+returns a non-zero exit status.
+</P><P>
+
+The return status of
+AND and OR lists is the exit status of the last command
+executed in the list.
+</P><P>
+
+<A NAME="Compound Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC15"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.2.4 Compound Commands </H3>
+<!--docid::SEC19::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Shell commands for iterative action.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Shell commands for conditional execution.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC22">3.2.4.3 Grouping Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Ways to group commands.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+Compound commands are the shell programming constructs.
+Each construct begins with a reserved word or control operator and is
+terminated by a corresponding reserved word or operator.
+Any redirections (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>) associated with a compound command
+apply to all commands within that compound command unless explicitly overridden.
+</P><P>
+
+Bash provides looping constructs, conditional commands, and mechanisms
+to group commands and execute them as a unit.
+</P><P>
+
+<A NAME="Looping Constructs"></A>
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC19"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.2.4.1 Looping Constructs </H4>
+<!--docid::SEC20::-->
+<P>
+
+Bash supports the following looping constructs.
+</P><P>
+
+Note that wherever a <SAMP>`;'</SAMP> appears in the description of a
+command's syntax, it may be replaced with one or more newlines.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>until</CODE>
+<DD><A NAME="IDX27"></A>
+<A NAME="IDX28"></A>
+<A NAME="IDX29"></A>
+The syntax of the <CODE>until</CODE> command is:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>until <VAR>test-commands</VAR>; do <VAR>consequent-commands</VAR>; done
+</pre></td></tr></table>Execute <VAR>consequent-commands</VAR> as long as
+<VAR>test-commands</VAR> has an exit status which is not zero.
+The return status is the exit status of the last command executed
+in <VAR>consequent-commands</VAR>, or zero if none was executed.
+<P>
+
+<DT><CODE>while</CODE>
+<DD><A NAME="IDX30"></A>
+The syntax of the <CODE>while</CODE> command is:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>while <VAR>test-commands</VAR>; do <VAR>consequent-commands</VAR>; done
+</pre></td></tr></table><P>
+
+Execute <VAR>consequent-commands</VAR> as long as
+<VAR>test-commands</VAR> has an exit status of zero.
+The return status is the exit status of the last command executed
+in <VAR>consequent-commands</VAR>, or zero if none was executed.
+</P><P>
+
+<DT><CODE>for</CODE>
+<DD><A NAME="IDX31"></A>
+The syntax of the <CODE>for</CODE> command is:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>for <VAR>name</VAR> [in <VAR>words</VAR> <small>...</small>]; do <VAR>commands</VAR>; done
+</pre></td></tr></table>Expand <VAR>words</VAR>, and execute <VAR>commands</VAR> once for each member
+in the resultant list, with <VAR>name</VAR> bound to the current member.
+If <SAMP>`in <VAR>words</VAR>'</SAMP> is not present, the <CODE>for</CODE> command
+executes the <VAR>commands</VAR> once for each positional parameter that is
+set, as if <SAMP>`in "$@"'</SAMP> had been specified
+(see section <A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A>).
+The return status is the exit status of the last command that executes.
+If there are no items in the expansion of <VAR>words</VAR>, no commands are
+executed, and the return status is zero.
+</P><P>
+
+An alternate form of the <CODE>for</CODE> command is also supported:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>for (( <VAR>expr1</VAR> ; <VAR>expr2</VAR> ; <VAR>expr3</VAR> )) ; do <VAR>commands</VAR> ; done
+</pre></td></tr></table>First, the arithmetic expression <VAR>expr1</VAR> is evaluated according
+to the rules described below (see section <A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A>).
+The arithmetic expression <VAR>expr2</VAR> is then evaluated repeatedly
+until it evaluates to zero.   
+Each time <VAR>expr2</VAR> evaluates to a non-zero value, <VAR>commands</VAR> are
+executed and the arithmetic expression <VAR>expr3</VAR> is evaluated.       
+If any expression is omitted, it behaves as if it evaluates to 1.
+The return value is the exit status of the last command in <VAR>list</VAR>
+that is executed, or false if any of the expressions is invalid.
+</P><P>
+
+</DL>
+<P>
+
+The <CODE>break</CODE> and <CODE>continue</CODE> builtins (see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>)
+may be used to control loop execution.
+</P><P>
+
+<A NAME="Conditional Constructs"></A>
+<HR SIZE="6">
+<A NAME="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC19"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.2.4.2 Conditional Constructs </H4>
+<!--docid::SEC21::-->
+<P>
+
+<DL COMPACT>
+<DT><CODE>if</CODE>
+<DD><A NAME="IDX32"></A>
+<A NAME="IDX33"></A>
+<A NAME="IDX34"></A>
+<A NAME="IDX35"></A>
+<A NAME="IDX36"></A>
+The syntax of the <CODE>if</CODE> command is:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>if <VAR>test-commands</VAR>; then
+  <VAR>consequent-commands</VAR>;
+[elif <VAR>more-test-commands</VAR>; then
+  <VAR>more-consequents</VAR>;]
+[else <VAR>alternate-consequents</VAR>;]
+fi
+</pre></td></tr></table></P><P>
+
+The <VAR>test-commands</VAR> list is executed, and if its return status is zero,
+the <VAR>consequent-commands</VAR> list is executed.
+If <VAR>test-commands</VAR> returns a non-zero status, each <CODE>elif</CODE> list
+is executed in turn, and if its exit status is zero,
+the corresponding <VAR>more-consequents</VAR> is executed and the   
+command completes.
+If <SAMP>`else <VAR>alternate-consequents</VAR>'</SAMP> is present, and
+the final command in the final <CODE>if</CODE> or <CODE>elif</CODE> clause
+has a non-zero exit status, then <VAR>alternate-consequents</VAR> is executed.
+The return status is the exit status of the last command executed, or
+zero if no condition tested true.
+</P><P>
+
+<DT><CODE>case</CODE>
+<DD><A NAME="IDX37"></A>
+<A NAME="IDX38"></A>
+<A NAME="IDX39"></A>
+The syntax of the <CODE>case</CODE> command is:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>case <VAR>word</VAR> in [ [(] <VAR>pattern</VAR> [| <VAR>pattern</VAR>]<small>...</small>) <VAR>command-list</VAR> ;;]<small>...</small> esac</CODE>
+</pre></td></tr></table></P><P>
+
+<CODE>case</CODE> will selectively execute the <VAR>command-list</VAR> corresponding to
+the first <VAR>pattern</VAR> that matches <VAR>word</VAR>.
+The <SAMP>`|'</SAMP> is used to separate multiple patterns, and the <SAMP>`)'</SAMP>
+operator terminates a pattern list.
+A list of patterns and an associated command-list is known
+as a <VAR>clause</VAR>.  Each clause must be terminated with <SAMP>`;;'</SAMP>.
+The <VAR>word</VAR> undergoes tilde expansion, parameter expansion, command
+substitution, arithmetic expansion, and quote removal before matching is
+attempted.  Each <VAR>pattern</VAR> undergoes tilde expansion, parameter
+expansion, command substitution, and arithmetic expansion.
+</P><P>
+
+There may be an arbitrary number of <CODE>case</CODE> clauses, each terminated
+by a <SAMP>`;;'</SAMP>.  The first pattern that matches determines the
+command-list that is executed.
+</P><P>
+
+Here is an example using <CODE>case</CODE> in a script that could be used to
+describe one interesting feature of an animal:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>echo -n "Enter the name of an animal: "
+read ANIMAL
+echo -n "The $ANIMAL has "
+case $ANIMAL in
+  horse | dog | cat) echo -n "four";;
+  man | kangaroo ) echo -n "two";;
+  *) echo -n "an unknown number of";;
+esac
+echo " legs."
+</pre></td></tr></table></P><P>
+
+The return status is zero if no <VAR>pattern</VAR> is matched.  Otherwise, the
+return status is the exit status of the <VAR>command-list</VAR> executed.
+</P><P>
+
+<DT><CODE>select</CODE>
+<DD><A NAME="IDX40"></A>
+<P>
+
+The <CODE>select</CODE> construct allows the easy generation of menus.
+It has almost the same syntax as the <CODE>for</CODE> command:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>select <VAR>name</VAR> [in <VAR>words</VAR> <small>...</small>]; do <VAR>commands</VAR>; done
+</pre></td></tr></table></P><P>
+
+The list of words following <CODE>in</CODE> is expanded, generating a list
+of items.  The set of expanded words is printed on the standard
+error output stream, each preceded by a number.  If the
+<SAMP>`in <VAR>words</VAR>'</SAMP> is omitted, the positional parameters are printed,
+as if <SAMP>`in "$@"'</SAMP> had been specifed.
+The <CODE>PS3</CODE> prompt is then displayed and a line is read from the
+standard input.
+If the line consists of a number corresponding to one of the displayed
+words, then the value of <VAR>name</VAR> is set to that word.
+If the line is empty, the words and prompt are displayed again.
+If <CODE>EOF</CODE> is read, the <CODE>select</CODE> command completes.
+Any other value read causes <VAR>name</VAR> to be set to null.
+The line read is saved in the variable <CODE>REPLY</CODE>.
+</P><P>
+
+The <VAR>commands</VAR> are executed after each selection until a
+<CODE>break</CODE> command is executed, at which
+point the <CODE>select</CODE> command completes.
+</P><P>
+
+Here is an example that allows the user to pick a filename from the
+current directory, and displays the name and index of the file
+selected.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>select fname in *;
+do
+       echo you picked $fname \($REPLY\)
+       break;
+done
+</pre></td></tr></table></P><P>
+
+<DT><CODE>((<small>...</small>))</CODE>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>(( <VAR>expression</VAR> ))
+</pre></td></tr></table><P>
+
+The arithmetic <VAR>expression</VAR> is evaluated according to the rules
+described below (see section <A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A>).
+If the value of the expression is non-zero, the return status is 0;
+otherwise the return status is 1.  This is exactly equivalent to
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>let "<VAR>expression</VAR>"
+</pre></td></tr></table>See section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>, for a full description of the <CODE>let</CODE> builtin.
+</P><P>
+
+<DT><CODE>[[<small>...</small>]]</CODE>
+<DD><A NAME="IDX41"></A>
+<A NAME="IDX42"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[[ <VAR>expression</VAR> ]]
+</pre></td></tr></table><P>
+
+Return a status of 0 or 1 depending on the evaluation of
+the conditional expression <VAR>expression</VAR>.
+Expressions are composed of the primaries described below in
+<A HREF="bashref.html#SEC78">6.4 Bash Conditional Expressions</A>.
+Word splitting and filename expansion are not performed on the words
+between the <SAMP>`[['</SAMP> and <SAMP>`]]'</SAMP>; tilde expansion, parameter and
+variable expansion, arithmetic expansion, command substitution, process
+substitution, and quote removal are performed.
+Conditional operators such as <SAMP>`-f'</SAMP> must be unquoted to be recognized
+as primaries.
+</P><P>
+
+When the <SAMP>`=='</SAMP> and <SAMP>`!='</SAMP> operators are used, the string to the
+right of the operator is considered a pattern and matched according
+to the rules described below in <A HREF="bashref.html#SEC36">3.5.8.1 Pattern Matching</A>.
+The return value is 0 if the string matches or does not match
+the pattern, respectively, and 1 otherwise.
+Any part of the pattern may be quoted to force it to be matched as a
+string.
+</P><P>
+
+An additional binary operator, <SAMP>`=~'</SAMP>, is available, with the same
+precedence as <SAMP>`=='</SAMP> and <SAMP>`!='</SAMP>.
+When it is used, the string to the right of the operator is considered
+an extended regular expression and matched accordingly (as in <I>regex</I>3)).  
+The return value is 0 if the string matches
+the pattern, and 1 otherwise.
+If the regular expression is syntactically incorrect, the conditional
+expression's return value is 2.
+If the shell option <CODE>nocaseglob</CODE>
+(see the description of <CODE>shopt</CODE> in <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>)
+is enabled, the match is performed without regard to the case
+of alphabetic characters.
+Substrings matched by parenthesized subexpressions within the regular
+expression are saved in the array variable <CODE>BASH_REMATCH</CODE>.
+The element of <CODE>BASH_REMATCH</CODE> with index 0 is the portion of the string
+matching the entire regular expression.
+The element of <CODE>BASH_REMATCH</CODE> with index <VAR>n</VAR> is the portion of the
+string matching the <VAR>n</VAR>th parenthesized subexpression.
+</P><P>
+
+Expressions may be combined using the following operators, listed
+in decreasing order of precedence:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>( <VAR>expression</VAR> )</CODE>
+<DD>Returns the value of <VAR>expression</VAR>.
+This may be used to override the normal precedence of operators.
+<P>
+
+<DT><CODE>! <VAR>expression</VAR></CODE>
+<DD>True if <VAR>expression</VAR> is false.
+<P>
+
+<DT><CODE><VAR>expression1</VAR> &#38;&#38; <VAR>expression2</VAR></CODE>
+<DD>True if both <VAR>expression1</VAR> and <VAR>expression2</VAR> are true.
+<P>
+
+<DT><CODE><VAR>expression1</VAR> || <VAR>expression2</VAR></CODE>
+<DD>True if either <VAR>expression1</VAR> or <VAR>expression2</VAR> is true.
+</DL>
+The <CODE>&#38;&#38;</CODE> and <CODE>||</CODE> operators do not evaluate <VAR>expression2</VAR> if the
+value of <VAR>expression1</VAR> is sufficient to determine the return
+value of the entire conditional expression.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Command Grouping"></A>
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC19"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.2.4.3 Grouping Commands </H4>
+<!--docid::SEC22::-->
+<P>
+
+Bash provides two ways to group a list of commands to be executed
+as a unit.  When commands are grouped, redirections may be applied
+to the entire command list.  For example, the output of all the
+commands in the list may be redirected to a single stream.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>()</CODE>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>( <VAR>list</VAR> )
+</pre></td></tr></table><P>
+
+Placing a list of commands between parentheses causes a subshell
+environment to be created (see section <A HREF="bashref.html#SEC51">3.7.3 Command Execution Environment</A>), and each
+of the commands in <VAR>list</VAR> to be executed in that subshell.  Since the
+<VAR>list</VAR> is executed in a subshell, variable assignments do not remain in
+effect after the subshell completes. 
+</P><P>
+
+<DT><CODE>{}</CODE>
+<DD><A NAME="IDX43"></A>
+<A NAME="IDX44"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>{ <VAR>list</VAR>; }
+</pre></td></tr></table><P>
+
+Placing a list of commands between curly braces causes the list to
+be executed in the current shell context.  No subshell is created.
+The semicolon (or newline) following <VAR>list</VAR> is required.
+</DL>
+<P>
+
+In addition to the creation of a subshell, there is a subtle difference
+between these two constructs due to historical reasons.  The braces
+are <CODE>reserved words</CODE>, so they must be separated from the <VAR>list</VAR>
+by <CODE>blank</CODE>s.  The parentheses are <CODE>operators</CODE>, and are
+recognized as separate tokens by the shell even if they are not separated
+from the <VAR>list</VAR> by whitespace.
+</P><P>
+
+The exit status of both of these constructs is the exit status of
+<VAR>list</VAR>.
+</P><P>
+
+<A NAME="Shell Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC24"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC24"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.3 Shell Functions </H2>
+<!--docid::SEC23::-->
+<P>
+
+Shell functions are a way to group commands for later execution
+using a single name for the group.  They are executed just like
+a "regular" command.
+When the name of a shell function is used as a simple command name,
+the list of commands associated with that function name is executed.
+Shell functions are executed in the current
+shell context; no new process is created to interpret them.
+</P><P>
+
+Functions are declared using this syntax:
+<A NAME="IDX45"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[ <CODE>function</CODE> ] <VAR>name</VAR> () <VAR>compound-command</VAR> [ <VAR>redirections</VAR> ]
+</pre></td></tr></table></P><P>
+
+This defines a shell function named <VAR>name</VAR>.  The reserved
+word <CODE>function</CODE> is optional.
+If the <CODE>function</CODE> reserved
+word is supplied, the parentheses are optional.
+The <VAR>body</VAR> of the function is the compound command
+<VAR>compound-command</VAR> (see section <A HREF="bashref.html#SEC19">3.2.4 Compound Commands</A>).
+That command is usually a <VAR>list</VAR> enclosed between { and }, but
+may be any compound command listed above.
+<VAR>compound-command</VAR> is executed whenever <VAR>name</VAR> is specified as the
+name of a command.
+Any redirections (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>) associated with the shell function
+are performed when the function is executed.
+</P><P>
+
+The exit status of a function definition is zero unless a syntax error
+occurs or a readonly function with the same name already exists.
+When executed, the exit status of a function is the exit status of the
+last command executed in the body.
+</P><P>
+
+Note that for historical reasons, in the most common usage the curly braces
+that surround the body of the function must be separated from the body by
+<CODE>blank</CODE>s or newlines.
+This is because the braces are reserved words and are only recognized
+as such when they are separated by whitespace.
+Also, when using the braces, the <VAR>list</VAR> must be terminated by a semicolon,
+a <SAMP>`&#38;'</SAMP>, or a newline.
+</P><P>
+
+When a function is executed, the arguments to the
+function become the positional parameters
+during its execution (see section <A HREF="bashref.html#SEC25">3.4.1 Positional Parameters</A>).
+The special parameter <SAMP>`#'</SAMP> that expands to the number of
+positional parameters is updated to reflect the change.
+Positional parameter <CODE>0</CODE> is unchanged.
+The first element of the <CODE>FUNCNAME</CODE> variable is set to the
+name of the function while the function is executing.
+All other aspects of the shell execution
+environment are identical between a function and its caller
+with the exception that the <CODE>DEBUG</CODE> trap
+below) is not inherited unless the function has been given the
+<CODE>trace</CODE> attribute using the <CODE>declare</CODE> builtin or
+the <CODE>-o functrace</CODE> option has been enabled with
+the <CODE>set</CODE> builtin,
+(in which case all functions inherit the <CODE>DEBUG</CODE> trap).
+See section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>, for the description of the
+<CODE>trap</CODE> builtin.
+</P><P>
+
+If the builtin command <CODE>return</CODE>
+is executed in a function, the function completes and
+execution resumes with the next command after the function
+call.
+Any command associated with the <CODE>RETURN</CODE> trap is executed
+before execution resumes.
+When a function completes, the values of the
+positional parameters and the special parameter <SAMP>`#'</SAMP>
+are restored to the values they had prior to the function's
+execution.  If a numeric argument is given to <CODE>return</CODE>,
+that is the function's return status; otherwise the function's
+return status is the exit status of the last command executed
+before the <CODE>return</CODE>.
+</P><P>
+
+Variables local to the function may be declared with the
+<CODE>local</CODE> builtin.  These variables are visible only to
+the function and the commands it invokes.
+</P><P>
+
+Function names and definitions may be listed with the
+<SAMP>`-f'</SAMP> option to the <CODE>declare</CODE> or <CODE>typeset</CODE>
+builtin commands (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+The <SAMP>`-F'</SAMP> option to <CODE>declare</CODE> or <CODE>typeset</CODE>
+will list the function names only
+(and optionally the source file and line number, if the <CODE>extdebug</CODE>
+shell option is enabled).
+Functions may be exported so that subshells
+automatically have them defined with the
+<SAMP>`-f'</SAMP> option to the <CODE>export</CODE> builtin
+(see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>).
+Note that shell functions and variables with the same name may result
+in multiple identically-named entries in the environment passed to the
+shell's children.
+Care should be taken in cases where this may cause a problem.
+</P><P>
+
+Functions may be recursive.  No limit is placed on the number of
+recursive  calls.
+</P><P>
+
+<A NAME="Shell Parameters"></A>
+<HR SIZE="6">
+<A NAME="SEC24"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC23"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC25"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.4 Shell Parameters </H2>
+<!--docid::SEC24::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC25">3.4.1 Positional Parameters</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The shell's command-line arguments.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Parameters denoted by special characters.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+A <VAR>parameter</VAR> is an entity that stores values.
+It can be a <CODE>name</CODE>, a number, or one of the special characters
+listed below.
+A <VAR>variable</VAR> is a parameter denoted by a <CODE>name</CODE>.
+A variable has a <VAR>value</VAR> and zero or more <VAR>attributes</VAR>.
+Attributes are assigned using the <CODE>declare</CODE> builtin command
+(see the description of the <CODE>declare</CODE> builtin in <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+</P><P>
+
+A parameter is set if it has been assigned a value.  The null string is
+a valid value.  Once a variable is set, it may be unset only by using
+the <CODE>unset</CODE> builtin command.
+</P><P>
+
+A variable may be assigned to by a statement of the form
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><VAR>name</VAR>=[<VAR>value</VAR>]
+</pre></td></tr></table>If <VAR>value</VAR>
+is not given, the variable is assigned the null string.  All
+<VAR>value</VAR>s undergo tilde expansion, parameter and variable expansion,
+command substitution, arithmetic expansion, and quote
+removal (detailed below).  If the variable has its <CODE>integer</CODE>
+attribute set, then <VAR>value</VAR> 
+is evaluated as an arithmetic expression even if the <CODE>$((<small>...</small>))</CODE>
+expansion is not used (see section <A HREF="bashref.html#SEC32">3.5.5 Arithmetic Expansion</A>).
+Word splitting is not performed, with the exception
+of <CODE>"$@"</CODE> as explained below.
+Filename expansion is not performed.
+Assignment statements may also appear as arguments to the
+<CODE>alias</CODE>, 
+<CODE>declare</CODE>, <CODE>typeset</CODE>, <CODE>export</CODE>, <CODE>readonly</CODE>,
+and <CODE>local</CODE> builtin commands.
+</P><P>
+
+<A NAME="Positional Parameters"></A>
+<HR SIZE="6">
+<A NAME="SEC25"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC24"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC26"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC24"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.1 Positional Parameters </H3>
+<!--docid::SEC25::-->
+<P>
+
+A <VAR>positional parameter</VAR> is a parameter denoted by one or more
+digits, other than the single digit <CODE>0</CODE>.  Positional parameters are
+assigned from the shell's arguments when it is invoked,
+and may be reassigned using the <CODE>set</CODE> builtin command.
+Positional parameter <CODE>N</CODE> may be referenced as <CODE>${N}</CODE>, or
+as <CODE>$N</CODE> when <CODE>N</CODE> consists of a single digit.
+Positional parameters may not be assigned to with assignment statements.
+The <CODE>set</CODE> and <CODE>shift</CODE> builtins are used to set and
+unset them (see section <A HREF="bashref.html#SEC56">4. Shell Builtin Commands</A>).
+The positional parameters are
+temporarily replaced when a shell function is executed
+(see section <A HREF="bashref.html#SEC23">3.3 Shell Functions</A>).
+</P><P>
+
+When a positional parameter consisting of more than a single
+digit is expanded, it must be enclosed in braces.
+</P><P>
+
+<A NAME="Special Parameters"></A>
+<HR SIZE="6">
+<A NAME="SEC26"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC25"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC24"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.4.2 Special Parameters </H3>
+<!--docid::SEC26::-->
+<P>
+
+The shell treats several parameters specially.  These parameters may
+only be referenced; assignment to them is not allowed.
+</P><P>
+
+<DL COMPACT>
+
+<A NAME="IDX46"></A>
+<DT><CODE>*</CODE>
+<DD><A NAME="IDX47"></A>
+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 <CODE>IFS</CODE>
+special variable.  That is, <CODE>"$*"</CODE> is equivalent
+to <CODE>"$1<VAR>c</VAR>$2<VAR>c</VAR><small>...</small>"</CODE>, where <VAR>c</VAR>
+is the first character of the value of the <CODE>IFS</CODE>
+variable.
+If <CODE>IFS</CODE> is unset, the parameters are separated by spaces.
+If <CODE>IFS</CODE> is null, the parameters are joined without intervening
+separators.
+<P>
+
+<A NAME="IDX48"></A>
+<DT><CODE>@</CODE>
+<DD><A NAME="IDX49"></A>
+Expands to the positional parameters, starting from one.  When the
+expansion occurs within double quotes, each parameter expands to a
+separate word.  That is, <CODE>"$@"</CODE> is equivalent to
+<CODE>"$1" "$2" <small>...</small></CODE>.
+When there are no positional parameters, <CODE>"$@"</CODE> and
+<CODE>$@</CODE>
+expand to nothing (i.e., they are removed).
+<P>
+
+<A NAME="IDX50"></A>
+<DT><CODE>#</CODE>
+<DD><A NAME="IDX51"></A>
+Expands to the number of positional parameters in decimal.
+<P>
+
+<A NAME="IDX52"></A>
+<DT><CODE>?</CODE>
+<DD><A NAME="IDX53"></A>
+Expands to the exit status of the most recently executed foreground
+pipeline.
+<P>
+
+<A NAME="IDX54"></A>
+<DT><CODE>-</CODE>
+<DD><A NAME="IDX55"></A>
+(A hyphen.)  Expands to the current option flags as specified upon
+invocation, by the <CODE>set</CODE>
+builtin command, or those set by the shell itself
+(such as the <SAMP>`-i'</SAMP> option).
+<P>
+
+<A NAME="IDX56"></A>
+<DT><CODE>$</CODE>
+<DD><A NAME="IDX57"></A>
+Expands to the process ID of the shell.  In a <CODE>()</CODE> subshell, it
+expands to the process ID of the invoking shell, not the subshell.
+<P>
+
+<A NAME="IDX58"></A>
+<DT><CODE>!</CODE>
+<DD><A NAME="IDX59"></A>
+Expands to the process ID of the most recently executed background
+(asynchronous) command.
+<P>
+
+<A NAME="IDX60"></A>
+<DT><CODE>0</CODE>
+<DD><A NAME="IDX61"></A>
+Expands to the name of the shell or shell script.  This is set at
+shell initialization.  If Bash is invoked with a file of commands
+(see section <A HREF="bashref.html#SEC55">3.8 Shell Scripts</A>), <CODE>$0</CODE> is set to the name of that file.
+If Bash is started with the <SAMP>`-c'</SAMP> option (see section <A HREF="bashref.html#SEC65">6.1 Invoking Bash</A>),
+then <CODE>$0</CODE> is set to the first argument after the string to be
+executed, if one is present.  Otherwise, it is set
+to the filename used to invoke Bash, as given by argument zero.
+<P>
+
+<A NAME="IDX62"></A>
+<DT><CODE>_</CODE>
+<DD><A NAME="IDX63"></A>
+(An underscore.)
+At shell startup, set to the absolute filename of the shell or shell
+script being executed as passed in the argument list.
+Subsequently, expands to the last argument to the previous command,
+after expansion.   
+Also set to the full pathname of each command executed and placed in
+the environment exported to that command.
+When checking mail, this parameter holds the name of the mail file.
+</DL>
+<P>
+
+<A NAME="Shell Expansions"></A>
+<HR SIZE="6">
+<A NAME="SEC27"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC26"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC28"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.5 Shell Expansions </H2>
+<!--docid::SEC27::-->
+<P>
+
+Expansion is performed on the command line after it has been split into
+<CODE>token</CODE>s.  There are seven kinds of expansion performed:
+<UL>
+<LI>brace expansion
+<LI>tilde expansion
+<LI>parameter and variable expansion
+<LI>command substitution
+<LI>arithmetic expansion
+<LI>word splitting
+<LI>filename expansion
+</UL>
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC28">3.5.1 Brace Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Expansion of expressions within braces.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC29">3.5.2 Tilde Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Expansion of the ~ character.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How Bash expands variables to their values.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC31">3.5.4 Command Substitution</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Using the output of a command as an argument.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC32">3.5.5 Arithmetic Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to use arithmetic in shell expansions.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC33">3.5.6 Process Substitution</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A way to write and read to and from a
+                               command.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC34">3.5.7 Word Splitting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How the results of expansion are split into separate
+                       arguments.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A shorthand for specifying filenames matching patterns.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC37">3.5.9 Quote Removal</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How and when quote characters are removed from
+                       words.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+The order of expansions is: brace expansion, tilde expansion,
+parameter, variable, and arithmetic expansion and
+command substitution
+(done in a left-to-right fashion), word splitting, and filename
+expansion.
+</P><P>
+
+On systems that can support it, there is an additional expansion
+available: <VAR>process substitution</VAR>.  This is performed at the
+same time as parameter, variable, and arithmetic expansion and
+command substitution.
+</P><P>
+
+Only brace expansion, word splitting, and filename expansion
+can change the number of words of the expansion; other expansions
+expand a single word to a single word.
+The only exceptions to this are the expansions of
+<CODE>"$@"</CODE> (see section <A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A>) and <CODE>"${<VAR>name</VAR>[@]}"</CODE>
+(see section <A HREF="bashref.html#SEC81">6.7 Arrays</A>).
+</P><P>
+
+After all expansions, <CODE>quote removal</CODE> (see section <A HREF="bashref.html#SEC37">3.5.9 Quote Removal</A>)
+is performed.
+</P><P>
+
+<A NAME="Brace Expansion"></A>
+<HR SIZE="6">
+<A NAME="SEC28"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC29"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.1 Brace Expansion </H3>
+<!--docid::SEC28::-->
+<P>
+
+Brace expansion is a mechanism by which arbitrary strings may be generated.
+This mechanism is similar to
+<VAR>filename expansion</VAR> (see section <A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A>),
+but the file names generated need not exist.
+Patterns to be brace expanded take the form of an optional <VAR>preamble</VAR>,
+followed by either a series of comma-separated strings or a sequnce expression
+between a pair of braces,
+followed by an optional <VAR>postscript</VAR>.
+The preamble is prefixed to each string contained within the braces, and
+the postscript is then appended to each resulting string, expanding left
+to right.
+</P><P>
+
+Brace expansions may be nested.
+The results of each expanded string are not sorted; left to right order
+is preserved.
+For example,
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bash$ echo a{d,c,b}e
+ade ace abe
+</pre></td></tr></table></P><P>
+
+A sequence expression takes the form <CODE>{<VAR>x</VAR>..<VAR>y</VAR>}</CODE>,
+where <VAR>x</VAR> and <VAR>y</VAR> are either integers or single characters.
+When integers are supplied, the expression expands to each number between
+<VAR>x</VAR> and <VAR>y</VAR>, inclusive.
+When characters are supplied, the expression expands to each character
+lexicographically between <VAR>x</VAR> and <VAR>y</VAR>, inclusive.  Note that
+both <VAR>x</VAR> and <VAR>y</VAR> must be of the same type.
+</P><P>
+
+Brace expansion is performed before any other expansions,
+and any characters special to other expansions are preserved
+in the result.  It is strictly textual.  Bash
+does not apply any syntactic interpretation to the context of the
+expansion or the text between the braces.
+To avoid conflicts with parameter expansion, the string <SAMP>`${'</SAMP>
+is not considered eligible for brace expansion.
+</P><P>
+
+A correctly-formed brace expansion must contain unquoted opening
+and closing braces, and at least one unquoted comma or a valid
+sequence expression.
+Any incorrectly formed brace expansion is left unchanged.
+</P><P>
+
+A { or <SAMP>`,'</SAMP> may be quoted with a backslash to prevent its
+being considered part of a brace expression.
+To avoid conflicts with parameter expansion, the string <SAMP>`${'</SAMP>
+is not considered eligible for brace expansion.
+</P><P>
+
+This construct is typically used as shorthand when the common
+prefix of the strings to be generated is longer than in the
+above example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>mkdir /usr/local/src/bash/{old,new,dist,bugs}
+</pre></td></tr></table>or
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
+</pre></td></tr></table></P><P>
+
+<A NAME="Tilde Expansion"></A>
+<HR SIZE="6">
+<A NAME="SEC29"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC28"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC30"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC30"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.2 Tilde Expansion </H3>
+<!--docid::SEC29::-->
+<P>
+
+If a word begins with an unquoted tilde character (<SAMP>`~'</SAMP>), all of the
+characters up to the first unquoted slash (or all characters,
+if there is no unquoted slash) are considered a <VAR>tilde-prefix</VAR>.
+If none of the characters in the tilde-prefix are quoted, the
+characters in the tilde-prefix following the tilde are treated as a
+possible <VAR>login name</VAR>.
+If this login name is the null string, the tilde is replaced with the
+value of the <CODE>HOME</CODE> shell variable.
+If <CODE>HOME</CODE> is unset, the home directory of the user executing the
+shell is substituted instead.
+Otherwise, the tilde-prefix is replaced with the home directory
+associated with the specified login name.
+</P><P>
+
+If the tilde-prefix is <SAMP>`~+'</SAMP>, the value of
+the shell variable <CODE>PWD</CODE> replaces the tilde-prefix.
+If the tilde-prefix is <SAMP>`~-'</SAMP>, the value of the shell variable
+<CODE>OLDPWD</CODE>, if it is set, is substituted.
+</P><P>
+
+If the characters following the tilde in the tilde-prefix consist of a
+number <VAR>N</VAR>, optionally prefixed by a <SAMP>`+'</SAMP> or a <SAMP>`-'</SAMP>,
+the tilde-prefix is replaced with the
+corresponding element from the directory stack, as it would be displayed
+by the <CODE>dirs</CODE> builtin invoked with the characters following tilde
+in the tilde-prefix as an argument (see section <A HREF="bashref.html#SEC82">6.8 The Directory Stack</A>).
+If the tilde-prefix, sans the tilde, consists of a number without a
+leading <SAMP>`+'</SAMP> or <SAMP>`-'</SAMP>, <SAMP>`+'</SAMP> is assumed.
+</P><P>
+
+If the login name is invalid, or the tilde expansion fails, the word is
+left unchanged.
+</P><P>
+
+Each variable assignment is checked for unquoted tilde-prefixes immediately
+following a <SAMP>`:'</SAMP> or <SAMP>`='</SAMP>.
+In these cases, tilde expansion is also performed.
+Consequently, one may use file names with tildes in assignments to
+<CODE>PATH</CODE>, <CODE>MAILPATH</CODE>, and <CODE>CDPATH</CODE>,
+and the shell assigns the expanded value.
+</P><P>
+
+The following table shows how Bash treats unquoted tilde-prefixes:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>~</CODE>
+<DD>The value of <CODE>$HOME</CODE>
+<DT><CODE>~/foo</CODE>
+<DD><TT>`$HOME/foo'</TT>
+<P>
+
+<DT><CODE>~fred/foo</CODE>
+<DD>The subdirectory <CODE>foo</CODE> of the home directory of the user
+<CODE>fred</CODE>
+<P>
+
+<DT><CODE>~+/foo</CODE>
+<DD><TT>`$PWD/foo'</TT>
+<P>
+
+<DT><CODE>~-/foo</CODE>
+<DD><TT>`${OLDPWD-'~-'}/foo'</TT>
+<P>
+
+<DT><CODE>~<VAR>N</VAR></CODE>
+<DD>The string that would be displayed by <SAMP>`dirs +<VAR>N</VAR>'</SAMP>
+<P>
+
+<DT><CODE>~+<VAR>N</VAR></CODE>
+<DD>The string that would be displayed by <SAMP>`dirs +<VAR>N</VAR>'</SAMP>
+<P>
+
+<DT><CODE>~-<VAR>N</VAR></CODE>
+<DD>The string that would be displayed by <SAMP>`dirs -<VAR>N</VAR>'</SAMP>
+<P>
+
+</DL>
+<P>
+
+<A NAME="Shell Parameter Expansion"></A>
+<HR SIZE="6">
+<A NAME="SEC30"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC29"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC31"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.3 Shell Parameter Expansion </H3>
+<!--docid::SEC30::-->
+<P>
+
+The <SAMP>`$'</SAMP> character introduces parameter expansion,
+command substitution, or arithmetic expansion.  The parameter name
+or symbol to be expanded may be enclosed in braces, which
+are optional but serve to protect the variable to be expanded from
+characters immediately following it which could be
+interpreted as part of the name.
+</P><P>
+
+When braces are used, the matching ending brace is the first <SAMP>`}'</SAMP>
+not escaped by a backslash or within a quoted string, and not within an
+embedded arithmetic expansion, command substitution, or parameter
+expansion.
+</P><P>
+
+The basic form of parameter expansion is ${<VAR>parameter</VAR>}.
+The value of <VAR>parameter</VAR> is substituted.  The braces are required
+when <VAR>parameter</VAR>
+is a positional parameter with more than one digit,
+or when <VAR>parameter</VAR>
+is followed by a character that is not to be
+interpreted as part of its name.
+</P><P>
+
+If the first character of <VAR>parameter</VAR> is an exclamation point,
+a level of variable indirection is introduced.
+Bash uses the value of the variable formed from the rest of
+<VAR>parameter</VAR> as the name of the variable; this variable is then
+expanded and that value is used in the rest of the substitution, rather
+than the value of <VAR>parameter</VAR> itself.
+This is known as <CODE>indirect expansion</CODE>.
+The exceptions to this are the expansions of ${!<VAR>prefix*</VAR>}
+and ${!<VAR>name</VAR>[@]}
+described below.
+The exclamation point must immediately follow the left brace in order to
+introduce indirection.
+</P><P>
+
+In each of the cases below, <VAR>word</VAR> is subject to tilde expansion,
+parameter expansion, command substitution, and arithmetic expansion.
+</P><P>
+
+When not performing substring expansion, Bash tests for a parameter
+that is unset or null; omitting the colon results in a test only for a
+parameter that is unset.  Put another way, if the colon is included,
+the operator tests for both existence and that the value is not null;
+if the colon is omitted, the operator tests only for existence.
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>${<VAR>parameter</VAR>:-<VAR>word</VAR>}</CODE>
+<DD>If <VAR>parameter</VAR> is unset or null, the expansion of
+<VAR>word</VAR> is substituted.  Otherwise, the value of
+<VAR>parameter</VAR> is substituted.
+<P>
+
+<DT><CODE>${<VAR>parameter</VAR>:=<VAR>word</VAR>}</CODE>
+<DD>If <VAR>parameter</VAR>
+is unset or null, the expansion of <VAR>word</VAR>
+is assigned to <VAR>parameter</VAR>.
+The value of <VAR>parameter</VAR>
+is then substituted.  Positional parameters and special parameters may
+not be assigned to in this way.
+<P>
+
+<DT><CODE>${<VAR>parameter</VAR>:?<VAR>word</VAR>}</CODE>
+<DD>If <VAR>parameter</VAR>
+is null or unset, the expansion of <VAR>word</VAR> (or a message
+to that effect if <VAR>word</VAR>
+is not present) is written to the standard error and the shell, if it
+is not interactive, exits.  Otherwise, the value of <VAR>parameter</VAR> is
+substituted.
+<P>
+
+<DT><CODE>${<VAR>parameter</VAR>:+<VAR>word</VAR>}</CODE>
+<DD>If <VAR>parameter</VAR>
+is null or unset, nothing is substituted, otherwise the expansion of
+<VAR>word</VAR> is substituted.
+<P>
+
+<DT><CODE>${<VAR>parameter</VAR>:<VAR>offset</VAR>}</CODE>
+<DD><DT><CODE>${<VAR>parameter</VAR>:<VAR>offset</VAR>:<VAR>length</VAR>}</CODE>
+<DD>Expands to up to <VAR>length</VAR> characters of <VAR>parameter</VAR>
+starting at the character specified by <VAR>offset</VAR>.
+If <VAR>length</VAR> is omitted, expands to the substring of
+<VAR>parameter</VAR> starting at the character specified by <VAR>offset</VAR>.
+<VAR>length</VAR> and <VAR>offset</VAR> are arithmetic expressions
+(see section <A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A>).
+This is referred to as Substring Expansion.
+<P>
+
+<VAR>length</VAR> must evaluate to a number greater than or equal to zero.
+If <VAR>offset</VAR> evaluates to a number less than zero, the value
+is used as an offset from the end of the value of <VAR>parameter</VAR>.
+If <VAR>parameter</VAR> is <SAMP>`@'</SAMP>, the result is <VAR>length</VAR> positional
+parameters beginning at <VAR>offset</VAR>.
+If <VAR>parameter</VAR> is an array name indexed by <SAMP>`@'</SAMP> or <SAMP>`*'</SAMP>,
+the result is the <VAR>length</VAR>
+members of the array beginning with <CODE>${<VAR>parameter</VAR>[<VAR>offset</VAR>]}</CODE>.
+Substring indexing is zero-based unless the positional parameters
+are used, in which case the indexing starts at 1.
+</P><P>
+
+<DT><CODE>${!<VAR>prefix</VAR>*}</CODE>
+<DD><DT><CODE>${!<VAR>prefix</VAR>@}</CODE>
+<DD>Expands to the names of variables whose names begin with <VAR>prefix</VAR>,
+separated by the first character of the <CODE>IFS</CODE> special variable.
+<P>
+
+<DT><CODE>${!<VAR>name</VAR>[@]}</CODE>
+<DD><DT><CODE>${!<VAR>name</VAR>[*]}</CODE>
+<DD>If <VAR>name</VAR> is an array variable, expands to the list of array indices
+(keys) assigned in <VAR>name</VAR>.
+If <VAR>name</VAR> is not an array, expands to 0 if <VAR>name</VAR> is set and null
+otherwise.
+When <SAMP>`@'</SAMP> is used and the expansion appears within double quotes, each
+key expands to a separate word.
+<P>
+
+<DT><CODE>${#<VAR>parameter</VAR>}</CODE>
+<DD>The length in characters of the expanded value of <VAR>parameter</VAR> is
+substituted.
+If <VAR>parameter</VAR> is <SAMP>`*'</SAMP> or <SAMP>`@'</SAMP>, the value substituted
+is the number of positional parameters.
+If <VAR>parameter</VAR> is an array name subscripted by <SAMP>`*'</SAMP> or <SAMP>`@'</SAMP>, 
+the value substituted is the number of elements in the array.
+<P>
+
+<DT><CODE>${<VAR>parameter</VAR>#<VAR>word</VAR>}</CODE>
+<DD><DT><CODE>${<VAR>parameter</VAR>##<VAR>word</VAR>}</CODE>
+<DD>The <VAR>word</VAR>
+is expanded to produce a pattern just as in filename
+expansion (see section <A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A>).  If the pattern matches
+the beginning of the expanded value of <VAR>parameter</VAR>,
+then the result of the expansion is the expanded value of <VAR>parameter</VAR>
+with the shortest matching pattern (the <SAMP>`#'</SAMP> case) or the
+longest matching pattern (the <SAMP>`##'</SAMP> case) deleted.
+If <VAR>parameter</VAR> is <SAMP>`@'</SAMP> or <SAMP>`*'</SAMP>,
+the pattern removal operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If <VAR>parameter</VAR> is an array variable subscripted with
+<SAMP>`@'</SAMP> or <SAMP>`*'</SAMP>,
+the pattern removal operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+<P>
+
+<DT><CODE>${<VAR>parameter</VAR>%<VAR>word</VAR>}</CODE>
+<DD><DT><CODE>${<VAR>parameter</VAR>%%<VAR>word</VAR>}</CODE>
+<DD>The <VAR>word</VAR> is expanded to produce a pattern just as in
+filename expansion.
+If the pattern matches a trailing portion of the expanded value of
+<VAR>parameter</VAR>, then the result of the expansion is the value of
+<VAR>parameter</VAR> with the shortest matching pattern (the <SAMP>`%'</SAMP> case)
+or the longest matching pattern (the <SAMP>`%%'</SAMP> case) deleted.
+If <VAR>parameter</VAR> is <SAMP>`@'</SAMP> or <SAMP>`*'</SAMP>,
+the pattern removal operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If <VAR>parameter</VAR>
+is an array variable subscripted with <SAMP>`@'</SAMP> or <SAMP>`*'</SAMP>,
+the pattern removal operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+<P>
+
+<DT><CODE>${<VAR>parameter</VAR>/<VAR>pattern</VAR>/<VAR>string</VAR>}</CODE>
+<DD><DT><CODE>${<VAR>parameter</VAR>//<VAR>pattern</VAR>/<VAR>string</VAR>}</CODE>
+<DD><P>
+
+The <VAR>pattern</VAR> is expanded to produce a pattern just as in
+filename expansion.
+<VAR>Parameter</VAR> is expanded and the longest match of <VAR>pattern</VAR>
+against its value is replaced with <VAR>string</VAR>.
+In the first form, only the first match is replaced.
+The second form causes all matches of <VAR>pattern</VAR> to be
+replaced with <VAR>string</VAR>.
+If <VAR>pattern</VAR> begins with <SAMP>`#'</SAMP>, it must match at the beginning
+of the expanded value of <VAR>parameter</VAR>.
+If <VAR>pattern</VAR> begins with <SAMP>`%'</SAMP>, it must match at the end
+of the expanded value of <VAR>parameter</VAR>.
+If <VAR>string</VAR> is null, matches of <VAR>pattern</VAR> are deleted
+and the <CODE>/</CODE> following <VAR>pattern</VAR> may be omitted.
+If <VAR>parameter</VAR> is <SAMP>`@'</SAMP> or <SAMP>`*'</SAMP>,
+the substitution operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If <VAR>parameter</VAR>
+is an array variable subscripted with <SAMP>`@'</SAMP> or <SAMP>`*'</SAMP>,
+the substitution operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+</P><P>
+
+</DL>
+<P>
+
+<A NAME="Command Substitution"></A>
+<HR SIZE="6">
+<A NAME="SEC31"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC30"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC32"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC32"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.4 Command Substitution </H3>
+<!--docid::SEC31::-->
+<P>
+
+Command substitution allows the output of a command to replace
+the command itself.
+Command substitution occurs when a command is enclosed as follows:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$(<VAR>command</VAR>)
+</pre></td></tr></table>or
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>`<VAR>command</VAR>`
+</pre></td></tr></table></P><P>
+
+Bash performs the expansion by executing <VAR>command</VAR> and
+replacing the command substitution with the standard output of the
+command, with any trailing newlines deleted.
+Embedded newlines are not deleted, but they may be removed during
+word splitting.
+The command substitution <CODE>$(cat <VAR>file</VAR>)</CODE> can be
+replaced by the equivalent but faster <CODE>$(&#60; <VAR>file</VAR>)</CODE>.
+</P><P>
+
+When the old-style backquote form of substitution is used,
+backslash retains its literal meaning except when followed by
+<SAMP>`$'</SAMP>, <SAMP>``'</SAMP>, or <SAMP>`\'</SAMP>. 
+The first backquote not preceded by a backslash terminates the
+command substitution.
+When using the <CODE>$(<VAR>command</VAR>)</CODE> form, all characters between
+the parentheses make up the command; none are treated specially.
+</P><P>
+
+Command substitutions may be nested.  To nest when using the backquoted
+form, escape the inner backquotes with backslashes.
+</P><P>
+
+If the substitution appears within double quotes, word splitting and
+filename expansion are not performed on the results.
+</P><P>
+
+<A NAME="Arithmetic Expansion"></A>
+<HR SIZE="6">
+<A NAME="SEC32"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC31"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC33"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC33"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.5 Arithmetic Expansion </H3>
+<!--docid::SEC32::-->
+<P>
+
+Arithmetic expansion allows the evaluation of an arithmetic expression
+and the substitution of the result.  The format for arithmetic expansion is:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$(( <VAR>expression</VAR> ))
+</pre></td></tr></table></P><P>
+
+The expression is treated as if it were within double quotes, but
+a double quote inside the parentheses is not treated specially.
+All tokens in the expression undergo parameter expansion, command
+substitution, and quote removal.
+Arithmetic expansions may be nested. 
+</P><P>
+
+The evaluation is performed according to the rules listed below
+(see section <A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A>).
+If the expression is invalid, Bash prints a message indicating
+failure to the standard error and no substitution occurs.
+</P><P>
+
+<A NAME="Process Substitution"></A>
+<HR SIZE="6">
+<A NAME="SEC33"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC32"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC34"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC34"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.6 Process Substitution </H3>
+<!--docid::SEC33::-->
+<P>
+
+Process substitution is supported on systems that support named
+pipes (FIFOs) or the <TT>`/dev/fd'</TT> method of naming open files.
+It takes the form of 
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>&#60;(<VAR>list</VAR>)
+</pre></td></tr></table>or
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>&#62;(<VAR>list</VAR>)
+</pre></td></tr></table>The process <VAR>list</VAR> is run with its input or output connected to a
+FIFO or some file in <TT>`/dev/fd'</TT>.  The name of this file is
+passed as an argument to the current command as the result of the
+expansion.  If the <CODE>&#62;(<VAR>list</VAR>)</CODE> form is used, writing to
+the file will provide input for <VAR>list</VAR>.  If the
+<CODE>&#60;(<VAR>list</VAR>)</CODE> form is used, the file passed as an
+argument should be read to obtain the output of <VAR>list</VAR>.
+Note that no space may appear between the <CODE>&#60;</CODE> or <CODE>&#62;</CODE>
+and the left parenthesis, otherwise the construct would be interpreted
+as a redirection.
+</P><P>
+
+When available, process substitution is performed simultaneously with
+parameter and variable expansion, command substitution, and arithmetic
+expansion.
+</P><P>
+
+<A NAME="Word Splitting"></A>
+<HR SIZE="6">
+<A NAME="SEC34"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC33"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC35"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC35"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.7 Word Splitting </H3>
+<!--docid::SEC34::-->
+<P>
+
+The shell scans the results of parameter expansion, command substitution,
+and arithmetic expansion that did not occur within double quotes for
+word splitting.
+</P><P>
+
+The shell treats each character of <CODE>$IFS</CODE>
+as a delimiter, and splits the results of the other
+expansions into words on these characters.  If
+<CODE>IFS</CODE> is unset, or its value is exactly <CODE>&#60;space&#62;&#60;tab&#62;&#60;newline&#62;</CODE>,
+the default, then any sequence of <CODE>IFS</CODE>
+characters serves to delimit words.  If <CODE>IFS</CODE>
+has a value other than the default, then sequences of
+the whitespace characters <CODE>space</CODE> and <CODE>tab</CODE>
+are ignored at the beginning and end of the
+word, as long as the whitespace character is in the
+value of <CODE>IFS</CODE> (an <CODE>IFS</CODE> whitespace character).
+Any character in <CODE>IFS</CODE> that is not <CODE>IFS</CODE>
+whitespace, along with any adjacent <CODE>IFS</CODE>
+whitespace characters, delimits a field.  A sequence of <CODE>IFS</CODE>
+whitespace characters is also treated as a delimiter.
+If the value of <CODE>IFS</CODE> is null, no word splitting occurs.
+</P><P>
+
+Explicit null arguments (<CODE>""</CODE> or <CODE>"</CODE>) are retained.
+Unquoted implicit null arguments, resulting from the expansion of
+parameters that have no values, are removed.
+If a parameter with no value is expanded within double quotes, a
+null argument results and is retained.
+</P><P>
+
+Note that if no expansion occurs, no splitting
+is performed.
+</P><P>
+
+<A NAME="Filename Expansion"></A>
+<HR SIZE="6">
+<A NAME="SEC35"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC34"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC36"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC37"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC37"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.8 Filename Expansion </H3>
+<!--docid::SEC35::-->
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC36">3.5.8.1 Pattern Matching</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How the shell matches patterns.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<A NAME="IDX64"></A>
+<A NAME="IDX65"></A>
+<A NAME="IDX66"></A>
+<A NAME="IDX67"></A>
+<P>
+
+After word splitting, unless the <SAMP>`-f'</SAMP> option has been set
+(see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>), Bash scans each word for the characters
+<SAMP>`*'</SAMP>, <SAMP>`?'</SAMP>, and <SAMP>`['</SAMP>.
+If one of these characters appears, then the word is
+regarded as a <VAR>pattern</VAR>,
+and replaced with an alphabetically sorted list of
+file names matching the pattern. If no matching file names are found,
+and the shell option <CODE>nullglob</CODE> is disabled, the word is left
+unchanged.
+If the <CODE>nullglob</CODE> option is set, and no matches are found, the word
+is removed.
+If the <CODE>failglob</CODE> shell option is set, and no matches are found,
+an error message is printed and the command is not executed.
+If the shell option <CODE>nocaseglob</CODE> is enabled, the match is performed
+without regard to the case of alphabetic characters.
+</P><P>
+
+When a pattern is used for filename generation, the character <SAMP>`.'</SAMP>
+at the start of a filename or immediately following a slash
+must be matched explicitly, unless the shell option <CODE>dotglob</CODE> is set.
+When matching a file name, the slash character must always be
+matched explicitly.
+In other cases, the <SAMP>`.'</SAMP> character is not treated specially.
+</P><P>
+
+See the description of <CODE>shopt</CODE> in <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>,
+for a description of the <CODE>nocaseglob</CODE>, <CODE>nullglob</CODE>,
+<CODE>failglob</CODE>, and <CODE>dotglob</CODE> options.
+</P><P>
+
+The <CODE>GLOBIGNORE</CODE>
+shell variable may be used to restrict the set of filenames matching a
+pattern.  If <CODE>GLOBIGNORE</CODE>
+is set, each matching filename that also matches one of the patterns in
+<CODE>GLOBIGNORE</CODE> is removed from the list of matches.  The filenames
+<TT>`.'</TT> and <TT>`..'</TT>
+are always ignored when <CODE>GLOBIGNORE</CODE>
+is set and not null.
+However, setting <CODE>GLOBIGNORE</CODE> to a non-null value has the effect of
+enabling the <CODE>dotglob</CODE>
+shell option, so all other filenames beginning with a
+<SAMP>`.'</SAMP> will match.
+To get the old behavior of ignoring filenames beginning with a
+<SAMP>`.'</SAMP>, make <SAMP>`.*'</SAMP> one of the patterns in <CODE>GLOBIGNORE</CODE>.
+The <CODE>dotglob</CODE> option is disabled when <CODE>GLOBIGNORE</CODE>
+is unset.
+</P><P>
+
+<A NAME="Pattern Matching"></A>
+<HR SIZE="6">
+<A NAME="SEC36"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC35"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC37"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC37"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC35"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC37"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 3.5.8.1 Pattern Matching </H4>
+<!--docid::SEC36::-->
+<P>
+
+Any character that appears in a pattern, other than the special pattern
+characters described below, matches itself.
+The NUL character may not occur in a pattern.
+A backslash escapes the following character; the
+escaping backslash is discarded when matching.
+The special pattern characters must be quoted if they are to be matched
+literally.
+</P><P>
+
+The special pattern characters have the following meanings:
+<DL COMPACT>
+<DT><CODE>*</CODE>
+<DD>Matches any string, including the null string.
+<DT><CODE>?</CODE>
+<DD>Matches any single character.
+<DT><CODE>[<small>...</small>]</CODE>
+<DD>Matches any one of the enclosed characters.  A pair of characters
+separated by a hyphen denotes a <VAR>range expression</VAR>;
+any character that sorts between those two characters, inclusive,
+using the current locale's collating sequence and character set,
+is matched.  If the first character following the
+<SAMP>`['</SAMP> is a <SAMP>`!'</SAMP>  or a <SAMP>`^'</SAMP>
+then any character not enclosed is matched.  A <SAMP>`-'</SAMP>
+may be matched by including it as the first or last character
+in the set.  A <SAMP>`]'</SAMP> may be matched by including it as the first
+character in the set.
+The sorting order of characters in range expressions is determined by
+the current locale and the value of the <CODE>LC_COLLATE</CODE> shell variable,
+if set.
+<P>
+
+For example, in the default C locale, <SAMP>`[a-dx-z]'</SAMP> is equivalent to
+<SAMP>`[abcdxyz]'</SAMP>.  Many locales sort characters in dictionary order, and in
+these locales <SAMP>`[a-dx-z]'</SAMP> is typically not equivalent to <SAMP>`[abcdxyz]'</SAMP>;
+it might be equivalent to <SAMP>`[aBbCcDdxXyYz]'</SAMP>, for example.  To obtain
+the traditional interpretation of ranges in bracket expressions, you can
+force the use of the C locale by setting the <CODE>LC_COLLATE</CODE> or
+<CODE>LC_ALL</CODE> environment variable to the value <SAMP>`C'</SAMP>.
+</P><P>
+
+Within <SAMP>`['</SAMP> and <SAMP>`]'</SAMP>, <VAR>character classes</VAR> can be specified
+using the syntax
+<CODE>[:</CODE><VAR>class</VAR><CODE>:]</CODE>, where <VAR>class</VAR> is one of the
+following classes defined in the POSIX 1003.2 standard:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>alnum   alpha   ascii   blank   cntrl   digit   graph   lower
+print   punct   space   upper   word    xdigit
+</pre></td></tr></table>A character class matches any character belonging to that class.
+The <CODE>word</CODE> character class matches letters, digits, and the character
+<SAMP>`_'</SAMP>.
+</P><P>
+
+Within <SAMP>`['</SAMP> and <SAMP>`]'</SAMP>, an <VAR>equivalence class</VAR> can be
+specified using the syntax <CODE>[=</CODE><VAR>c</VAR><CODE>=]</CODE>, which
+matches all characters with the same collation weight (as defined
+by the current locale) as the character <VAR>c</VAR>.
+</P><P>
+
+Within <SAMP>`['</SAMP> and <SAMP>`]'</SAMP>, the syntax <CODE>[.</CODE><VAR>symbol</VAR><CODE>.]</CODE>
+matches the collating symbol <VAR>symbol</VAR>.
+</DL>
+<P>
+
+If the <CODE>extglob</CODE> shell option is enabled using the <CODE>shopt</CODE>
+builtin, several extended pattern matching operators are recognized.
+In the following description, a <VAR>pattern-list</VAR> is a list of one
+or more patterns separated by a <SAMP>`|'</SAMP>.
+Composite patterns may be formed using one or more of the following
+sub-patterns:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>?(<VAR>pattern-list</VAR>)</CODE>
+<DD>Matches zero or one occurrence of the given patterns.
+<P>
+
+<DT><CODE>*(<VAR>pattern-list</VAR>)</CODE>
+<DD>Matches zero or more occurrences of the given patterns.
+<P>
+
+<DT><CODE>+(<VAR>pattern-list</VAR>)</CODE>
+<DD>Matches one or more occurrences of the given patterns.
+<P>
+
+<DT><CODE>@(<VAR>pattern-list</VAR>)</CODE>
+<DD>Matches exactly one of the given patterns.
+<P>
+
+<DT><CODE>!(<VAR>pattern-list</VAR>)</CODE>
+<DD>Matches anything except one of the given patterns.
+</DL>
+<P>
+
+<A NAME="Quote Removal"></A>
+<HR SIZE="6">
+<A NAME="SEC37"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC36"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC27"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.5.9 Quote Removal </H3>
+<!--docid::SEC37::-->
+<P>
+
+After the preceding expansions, all unquoted occurrences of the
+characters <SAMP>`\'</SAMP>, <SAMP>`''</SAMP>, and <SAMP>`"'</SAMP> that did not
+result from one of the above expansions are removed.
+</P><P>
+
+<A NAME="Redirections"></A>
+<HR SIZE="6">
+<A NAME="SEC38"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC37"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC39"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.6 Redirections </H2>
+<!--docid::SEC38::-->
+<P>
+
+Before a command is executed, its input and output
+may be <VAR>redirected</VAR>
+using a special notation interpreted by the shell.
+Redirection may also be used to open and close files for the
+current shell execution environment.  The following redirection
+operators may precede or appear anywhere within a
+simple command or may follow a command.
+Redirections are processed in the order they appear, from
+left to right.
+</P><P>
+
+In the following descriptions, if the file descriptor number is
+omitted, and the first character of the redirection operator is
+<SAMP>`&#60;'</SAMP>, the redirection refers to the standard input (file
+descriptor 0).  If the first character of the redirection operator
+is <SAMP>`&#62;'</SAMP>, the redirection refers to the standard output (file
+descriptor 1).
+</P><P>
+
+The word following the redirection operator in the following
+descriptions, unless otherwise noted, is subjected to brace expansion,
+tilde expansion, parameter expansion, command substitution, arithmetic
+expansion, quote removal, filename expansion, and word splitting.
+If it expands to more than one word, Bash reports an error.
+</P><P>
+
+Note that the order of redirections is significant.  For example,
+the command
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>ls &#62; <VAR>dirlist</VAR> 2&#62;&#38;1
+</pre></td></tr></table>directs both standard output (file descriptor 1) and standard error
+(file descriptor 2) to the file <VAR>dirlist</VAR>, while the command
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>ls 2&#62;&#38;1 &#62; <VAR>dirlist</VAR>
+</pre></td></tr></table>directs only the standard output to file <VAR>dirlist</VAR>,
+because the standard error was duplicated as standard output
+before the standard output was redirected to <VAR>dirlist</VAR>.
+</P><P>
+
+Bash handles several filenames specially when they are used in
+redirections, as described in the following table:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>/dev/fd/<VAR>fd</VAR></CODE>
+<DD>If <VAR>fd</VAR> is a valid integer, file descriptor <VAR>fd</VAR> is duplicated.
+<P>
+
+<DT><CODE>/dev/stdin</CODE>
+<DD>File descriptor 0 is duplicated.
+<P>
+
+<DT><CODE>/dev/stdout</CODE>
+<DD>File descriptor 1 is duplicated.
+<P>
+
+<DT><CODE>/dev/stderr</CODE>
+<DD>File descriptor 2 is duplicated.
+<P>
+
+<DT><CODE>/dev/tcp/<VAR>host</VAR>/<VAR>port</VAR></CODE>
+<DD>If <VAR>host</VAR> is a valid hostname or Internet address, and <VAR>port</VAR>
+is an integer port number or service name, Bash attempts to open a TCP
+connection to the corresponding socket.
+<P>
+
+<DT><CODE>/dev/udp/<VAR>host</VAR>/<VAR>port</VAR></CODE>
+<DD>If <VAR>host</VAR> is a valid hostname or Internet address, and <VAR>port</VAR>
+is an integer port number or service name, Bash attempts to open a UDP
+connection to the corresponding socket.
+<P>
+
+</DL>
+<P>
+
+A failure to open or create a file causes the redirection to fail.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC39"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC40"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.1 Redirecting Input </H3>
+<!--docid::SEC39::-->
+Redirection of input causes the file whose name results from
+the expansion of <VAR>word</VAR>
+to be opened for reading on file descriptor <CODE>n</CODE>,
+or the standard input (file descriptor 0) if <CODE>n</CODE>
+is not specified.
+<P>
+
+The general format for redirecting input is:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<VAR>n</VAR>]&#60;<VAR>word</VAR>
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC40"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC39"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC41"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC41"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.2 Redirecting Output </H3>
+<!--docid::SEC40::-->
+Redirection of output causes the file whose name results from
+the expansion of <VAR>word</VAR>
+to be opened for writing on file descriptor <VAR>n</VAR>,
+or the standard output (file descriptor 1) if <VAR>n</VAR>
+is not specified.  If the file does not exist it is created;
+if it does exist it is truncated to zero size.
+<P>
+
+The general format for redirecting output is:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<VAR>n</VAR>]&#62;[|]<VAR>word</VAR>
+</pre></td></tr></table></P><P>
+
+If the redirection operator is <SAMP>`&#62;'</SAMP>, and the <CODE>noclobber</CODE>
+option to the <CODE>set</CODE> builtin has been enabled, the redirection
+will fail if the file whose name results from the expansion of
+<VAR>word</VAR> exists and is a regular file.
+If the redirection operator is <SAMP>`&#62;|'</SAMP>, or the redirection operator is
+<SAMP>`&#62;'</SAMP> and the <CODE>noclobber</CODE> option is not enabled, the redirection
+is attempted even if the file named by <VAR>word</VAR> exists.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC41"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC40"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC42"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC42"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.3 Appending Redirected Output </H3>
+<!--docid::SEC41::-->
+Redirection of output in this fashion
+causes the file whose name results from
+the expansion of <VAR>word</VAR>
+to be opened for appending on file descriptor <VAR>n</VAR>,
+or the standard output (file descriptor 1) if <VAR>n</VAR>
+is not specified.  If the file does not exist it is created.
+<P>
+
+The general format for appending output is:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<VAR>n</VAR>]&#62;&#62;<VAR>word</VAR>
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC42"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC41"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC43"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC43"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.4 Redirecting Standard Output and Standard Error </H3>
+<!--docid::SEC42::-->
+Bash allows both the
+standard output (file descriptor 1) and
+the standard error output (file descriptor 2)
+to be redirected to the file whose name is the
+expansion of <VAR>word</VAR> with this construct.
+<P>
+
+There are two formats for redirecting standard output and
+standard error:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>&#38;&#62;<VAR>word</VAR>
+</pre></td></tr></table>and
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>&#62;&#38;<VAR>word</VAR>
+</pre></td></tr></table>Of the two forms, the first is preferred.
+This is semantically equivalent to
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>&#62;<VAR>word</VAR> 2&#62;&#38;1
+</pre></td></tr></table></P><P>
+
+<HR SIZE="6">
+<A NAME="SEC43"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC42"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC44"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC44"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.5 Here Documents </H3>
+<!--docid::SEC43::-->
+This type of redirection instructs the shell to read input from the
+current source until a line containing only <VAR>word</VAR>
+(with no trailing blanks) is seen.  All of
+the lines read up to that point are then used as the standard
+input for a command.
+<P>
+
+The format of here-documents is:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>&#60;&#60;[-]<VAR>word</VAR>
+        <VAR>here-document</VAR>
+<VAR>delimiter</VAR>
+</pre></td></tr></table></P><P>
+
+No parameter expansion, command substitution, arithmetic expansion,
+or filename expansion is performed on
+<VAR>word</VAR>.  If any characters in <VAR>word</VAR> are quoted, the
+<VAR>delimiter</VAR> is the result of quote removal on <VAR>word</VAR>,
+and the lines in the here-document are not expanded.
+If <VAR>word</VAR> is unquoted,
+all lines of the here-document are subjected to parameter expansion,
+command substitution, and arithmetic expansion.  In the latter
+case, the character sequence <CODE>\newline</CODE> is ignored, and <SAMP>`\'</SAMP>
+must be used to quote the characters
+<SAMP>`\'</SAMP>, <SAMP>`$'</SAMP>, and <SAMP>``'</SAMP>.
+</P><P>
+
+If the redirection operator is <SAMP>`&#60;&#60;-'</SAMP>,
+then all leading tab characters are stripped from input lines and the
+line containing <VAR>delimiter</VAR>.
+This allows here-documents within shell scripts to be indented in a
+natural fashion.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC44"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC43"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC45"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.6 Here Strings </H3>
+<!--docid::SEC44::-->
+A variant of here documents, the format is:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>&#60;&#60;&#60; <VAR>word</VAR>
+</pre></td></tr></table><P>
+
+The <VAR>word</VAR> is expanded and supplied to the command on its standard
+input.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC45"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC44"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC46"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC46"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.7 Duplicating File Descriptors </H3>
+<!--docid::SEC45::-->
+The redirection operator
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<VAR>n</VAR>]&#60;&#38;<VAR>word</VAR>
+</pre></td></tr></table>is used to duplicate input file descriptors.
+If <VAR>word</VAR>
+expands to one or more digits, the file descriptor denoted by <VAR>n</VAR>
+is made to be a copy of that file descriptor.
+If the digits in <VAR>word</VAR> do not specify a file descriptor open for
+input, a redirection error occurs.
+If <VAR>word</VAR>
+evaluates to <SAMP>`-'</SAMP>, file descriptor <VAR>n</VAR> is closed.  If
+<VAR>n</VAR> is not specified, the standard input (file descriptor 0) is used.
+<P>
+
+The operator
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<VAR>n</VAR>]&#62;&#38;<VAR>word</VAR>
+</pre></td></tr></table>is used similarly to duplicate output file descriptors.  If
+<VAR>n</VAR> is not specified, the standard output (file descriptor 1) is used.
+If the digits in <VAR>word</VAR> do not specify a file descriptor open for
+output, a redirection error occurs.
+As a special case, if <VAR>n</VAR> is omitted, and <VAR>word</VAR> does not
+expand to one or more digits, the standard output and standard
+error are redirected as described previously.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC46"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC45"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC47"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC47"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.8 Moving File Descriptors </H3>
+<!--docid::SEC46::-->
+The redirection operator
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<VAR>n</VAR>]&#60;&#38;<VAR>digit</VAR>-
+</pre></td></tr></table>moves the file descriptor <VAR>digit</VAR> to file descriptor <VAR>n</VAR>,
+or the standard input (file descriptor 0) if <VAR>n</VAR> is not specified.
+<VAR>digit</VAR> is closed after being duplicated to <VAR>n</VAR>.
+<P>
+
+Similarly, the redirection operator
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<VAR>n</VAR>]&#62;&#38;<VAR>digit</VAR>-
+</pre></td></tr></table>moves the file descriptor <VAR>digit</VAR> to file descriptor <VAR>n</VAR>,
+or the standard output (file descriptor 1) if <VAR>n</VAR> is not specified.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC47"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC46"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC38"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.6.9 Opening File Descriptors for Reading and Writing </H3>
+<!--docid::SEC47::-->
+The redirection operator
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[<VAR>n</VAR>]&#60;&#62;<VAR>word</VAR>
+</pre></td></tr></table>causes the file whose name is the expansion of <VAR>word</VAR>
+to be opened for both reading and writing on file descriptor
+<VAR>n</VAR>, or on file descriptor 0 if <VAR>n</VAR>
+is not specified.  If the file does not exist, it is created.
+<P>
+
+<A NAME="Executing Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC48"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC47"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC49"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.7 Executing Commands </H2>
+<!--docid::SEC48::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC49">3.7.1 Simple Command Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How Bash expands simple commands before
+                               executing them.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC50">3.7.2 Command Search and Execution</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How Bash finds commands and runs them.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC51">3.7.3 Command Execution Environment</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The environment in which Bash
+                                       executes commands that are not
+                                       shell builtins.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC52">3.7.4 Environment</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The environment given to a command.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC53">3.7.5 Exit Status</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The status returned by commands and how Bash
+                       interprets it.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC54">3.7.6 Signals</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What happens when Bash or a command it runs
+                       receives a signal.</TD></TR>
+</TABLE>
+
+<br>
+</BLOCKQUOTE>
+<P>
+
+<A NAME="Simple Command Expansion"></A>
+<HR SIZE="6">
+<A NAME="SEC49"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC50"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.7.1 Simple Command Expansion </H3>
+<!--docid::SEC49::-->
+<P>
+
+When a simple command is executed, the shell performs the following
+expansions, assignments, and redirections, from left to right.
+</P><P>
+
+<OL>
+<LI>
+The words that the parser has marked as variable assignments (those
+preceding the command name) and redirections are saved for later
+processing.
+<P>
+
+<LI>
+The words that are not variable assignments or redirections are
+expanded (see section <A HREF="bashref.html#SEC27">3.5 Shell Expansions</A>).
+If any words remain after expansion, the first word
+is taken to be the name of the command and the remaining words are
+the arguments.
+<P>
+
+<LI>
+Redirections are performed as described above (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>).
+<P>
+
+<LI>
+The text after the <SAMP>`='</SAMP> in each variable assignment undergoes tilde
+expansion, parameter expansion, command substitution, arithmetic expansion,
+and quote removal before being assigned to the variable.
+</OL>
+<P>
+
+If no command name results, the variable assignments affect the current
+shell environment.  Otherwise, the variables are added to the environment
+of the executed command and do not affect the current shell environment.
+If any of the assignments attempts to assign a value to a readonly variable,
+an error occurs, and the command exits with a non-zero status.
+</P><P>
+
+If no command name results, redirections are performed, but do not
+affect the current shell environment.  A redirection error causes the
+command to exit with a non-zero status.
+</P><P>
+
+If there is a command name left after expansion, execution proceeds as
+described below.  Otherwise, the command exits.  If one of the expansions
+contained a command substitution, the exit status of the command is
+the exit status of the last command substitution performed.  If there
+were no command substitutions, the command exits with a status of zero.
+</P><P>
+
+<A NAME="Command Search and Execution"></A>
+<HR SIZE="6">
+<A NAME="SEC50"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC49"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC51"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC51"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.7.2 Command Search and Execution </H3>
+<!--docid::SEC50::-->
+<P>
+
+After a command has been split into words, if it results in a
+simple command and an optional list of arguments, the following
+actions are taken.
+</P><P>
+
+<OL>
+<LI>
+If the command name contains no slashes, the shell attempts to
+locate it.  If there exists a shell function by that name, that
+function is invoked as described in <A HREF="bashref.html#SEC23">3.3 Shell Functions</A>.
+<P>
+
+<LI>
+If the name does not match a function, the shell searches for
+it in the list of shell builtins.  If a match is found, that
+builtin is invoked.
+<P>
+
+<LI>
+If the name is neither a shell function nor a builtin,
+and contains no slashes, Bash searches each element of
+<CODE>$PATH</CODE> for a directory containing an executable file
+by that name.  Bash uses a hash table to remember the full
+pathnames of executable files to avoid multiple <CODE>PATH</CODE> searches
+(see the description of <CODE>hash</CODE> in <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>).
+A full search of the directories in <CODE>$PATH</CODE>
+is performed only if the command is not found in the hash table.
+If the search is unsuccessful, the shell prints an error
+message and returns an exit status of 127.
+<P>
+
+<LI>
+If the search is successful, or if the command name contains
+one or more slashes, the shell executes the named program in
+a separate execution environment.
+Argument 0 is set to the name given, and the remaining arguments
+to the command are set to the arguments supplied, if any.
+<P>
+
+<LI>
+If this execution fails because the file is not in executable
+format, and the file is not a directory, it is assumed to be a
+<VAR>shell script</VAR> and the shell executes it as described in
+<A HREF="bashref.html#SEC55">3.8 Shell Scripts</A>.
+<P>
+
+<LI>
+If the command was not begun asynchronously, the shell waits for
+the command to complete and collects its exit status.
+<P>
+
+</OL>
+<P>
+
+<A NAME="Command Execution Environment"></A>
+<HR SIZE="6">
+<A NAME="SEC51"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC50"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC52"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC52"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.7.3 Command Execution Environment </H3>
+<!--docid::SEC51::-->
+<P>
+
+The shell has an <VAR>execution environment</VAR>, which consists of the
+following:
+</P><P>
+
+<UL>
+<LI>
+open files inherited by the shell at invocation, as modified by
+redirections supplied to the <CODE>exec</CODE> builtin
+<P>
+
+<LI>
+the current working directory as set by <CODE>cd</CODE>, <CODE>pushd</CODE>, or
+<CODE>popd</CODE>, or inherited by the shell at invocation
+<P>
+
+<LI>
+the file creation mode mask as set by <CODE>umask</CODE> or inherited from
+the shell's parent
+<P>
+
+<LI>
+current traps set by <CODE>trap</CODE>
+<P>
+
+<LI>
+shell parameters that are set by variable assignment or with <CODE>set</CODE>
+or inherited from the shell's parent in the environment
+<P>
+
+<LI>
+shell functions defined during execution or inherited from the shell's
+parent in the environment
+<P>
+
+<LI>
+options enabled at invocation (either by default or with command-line
+arguments) or by <CODE>set</CODE>
+<P>
+
+<LI>
+options enabled by <CODE>shopt</CODE>
+<P>
+
+<LI>
+shell aliases defined with <CODE>alias</CODE> (see section <A HREF="bashref.html#SEC80">6.6 Aliases</A>)
+<P>
+
+<LI>
+various process IDs, including those of background jobs
+(see section <A HREF="bashref.html#SEC18">3.2.3 Lists of Commands</A>), the value of <CODE>$$</CODE>, and the value of
+<CODE>$PPID</CODE>
+<P>
+
+</UL>
+<P>
+
+When a simple command other than a builtin or shell function
+is to be executed, it
+is invoked in a separate execution environment that consists of
+the following.  Unless otherwise noted, the values are inherited
+from the shell.
+</P><P>
+
+<UL>
+<LI>
+the shell's open files, plus any modifications and additions specified
+by redirections to the command
+<P>
+
+<LI>
+the current working directory
+<P>
+
+<LI>
+the file creation mode mask
+<P>
+
+<LI>
+shell variables and functions marked for export, along with variables
+exported for the command, passed in the environment (see section <A HREF="bashref.html#SEC52">3.7.4 Environment</A>)
+<P>
+
+<LI>
+traps caught by the shell are reset to the values inherited from the
+shell's parent, and traps ignored by the shell are ignored
+<P>
+
+</UL>
+<P>
+
+A command invoked in this separate environment cannot affect the
+shell's execution environment. 
+</P><P>
+
+Command substitution, commands grouped with parentheses,
+and asynchronous commands are invoked in a
+subshell environment that is a duplicate of the shell environment,
+except that traps caught by the shell are reset to the values
+that the shell inherited from its parent at invocation.  Builtin
+commands that are invoked as part of a pipeline are also executed
+in a subshell environment.  Changes made to the subshell environment
+cannot affect the shell's execution environment.
+</P><P>
+
+If a command is followed by a <SAMP>`&#38;'</SAMP> and job control is not active, the
+default standard input for the command is the empty file <TT>`/dev/null'</TT>.
+Otherwise, the invoked command inherits the file descriptors of the calling
+shell as modified by redirections.
+</P><P>
+
+<A NAME="Environment"></A>
+<HR SIZE="6">
+<A NAME="SEC52"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC51"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC53"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC53"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.7.4 Environment </H3>
+<!--docid::SEC52::-->
+<P>
+
+When a program is invoked it is given an array of strings
+called the <VAR>environment</VAR>.
+This is a list of name-value pairs, of the form <CODE>name=value</CODE>.
+</P><P>
+
+Bash provides several ways to manipulate the environment.
+On invocation, the shell scans its own environment and
+creates a parameter for each name found, automatically marking
+it for <VAR>export</VAR>
+to child processes.  Executed commands inherit the environment.
+The <CODE>export</CODE> and <SAMP>`declare -x'</SAMP>
+commands allow parameters and functions to be added to and
+deleted from the environment.  If the value of a parameter
+in the environment is modified, the new value becomes part
+of the environment, replacing the old.  The environment
+inherited by any executed command consists of the shell's
+initial environment, whose values may be modified in the shell,
+less any pairs removed by the <CODE>unset</CODE> and <SAMP>`export -n'</SAMP>
+commands, plus any additions via the <CODE>export</CODE> and
+<SAMP>`declare -x'</SAMP> commands.
+</P><P>
+
+The environment for any simple command
+or function may be augmented temporarily by prefixing it with
+parameter assignments, as described in <A HREF="bashref.html#SEC24">3.4 Shell Parameters</A>.
+These assignment statements affect only the environment seen
+by that command.
+</P><P>
+
+If the <SAMP>`-k'</SAMP> option is set (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>), then all
+parameter assignments are placed in the environment for a command,
+not just those that precede the command name.
+</P><P>
+
+When Bash invokes an external command, the variable <SAMP>`$_'</SAMP>
+is set to the full path name of the command and passed to that
+command in its environment.
+</P><P>
+
+<A NAME="Exit Status"></A>
+<HR SIZE="6">
+<A NAME="SEC53"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC52"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC54"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC54"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.7.5 Exit Status </H3>
+<!--docid::SEC53::-->
+<P>
+
+For the shell's purposes, a command which exits with a
+zero exit status has succeeded.
+A non-zero exit status indicates failure.
+This seemingly counter-intuitive scheme is used so there
+is one well-defined way to indicate success and a variety of
+ways to indicate various failure modes.
+When a command terminates on a fatal signal whose number is <VAR>N</VAR>,
+Bash uses the value 128+<VAR>N</VAR> as the exit status.
+</P><P>
+
+If a command is not found, the child process created to
+execute it returns a status of 127.  If a command is found  
+but is not executable, the return status is 126.
+</P><P>
+
+If a command fails because of an error during expansion or redirection,
+the exit status is greater than zero.
+</P><P>
+
+The exit status is used by the Bash conditional commands
+(see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>) and some of the list
+constructs (see section <A HREF="bashref.html#SEC18">3.2.3 Lists of Commands</A>).
+</P><P>
+
+All of the Bash builtins return an exit status of zero if they succeed
+and a non-zero status on failure, so they may be used by the
+conditional and list constructs.
+All builtins return an exit status of 2 to indicate incorrect usage.
+</P><P>
+
+<A NAME="Signals"></A>
+<HR SIZE="6">
+<A NAME="SEC54"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC53"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC48"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 3.7.6 Signals </H3>
+<!--docid::SEC54::-->
+<P>
+
+When Bash is interactive, in the absence of any traps, it ignores
+<CODE>SIGTERM</CODE> (so that <SAMP>`kill 0'</SAMP> does not kill an interactive shell),
+and <CODE>SIGINT</CODE>
+is caught and handled (so that the <CODE>wait</CODE> builtin is interruptible).
+When Bash receives a <CODE>SIGINT</CODE>, it breaks out of any executing loops.
+In all cases, Bash ignores <CODE>SIGQUIT</CODE>.
+If job control is in effect (see section <A HREF="bashref.html#SEC87">7. Job Control</A>), Bash
+ignores <CODE>SIGTTIN</CODE>, <CODE>SIGTTOU</CODE>, and <CODE>SIGTSTP</CODE>.
+</P><P>
+
+Non-builtin commands started by Bash have signal handlers set to the
+values inherited by the shell from its parent.
+When job control is not in effect, asynchronous commands
+ignore <CODE>SIGINT</CODE> and <CODE>SIGQUIT</CODE> in addition to these inherited
+handlers.
+Commands run as a result of
+command substitution ignore the keyboard-generated job control signals
+<CODE>SIGTTIN</CODE>, <CODE>SIGTTOU</CODE>, and <CODE>SIGTSTP</CODE>.
+</P><P>
+
+The shell exits by default upon receipt of a <CODE>SIGHUP</CODE>.
+Before exiting, an interactive shell resends the <CODE>SIGHUP</CODE> to
+all jobs, running or stopped.
+Stopped jobs are sent <CODE>SIGCONT</CODE> to ensure that they receive
+the <CODE>SIGHUP</CODE>.
+To prevent the shell from sending the <CODE>SIGHUP</CODE> signal to a
+particular job, it should be removed
+from the jobs table with the <CODE>disown</CODE>
+builtin (see section <A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A>) or marked
+to not receive <CODE>SIGHUP</CODE> using <CODE>disown -h</CODE>.
+</P><P>
+
+If the  <CODE>huponexit</CODE> shell option has been set with <CODE>shopt</CODE>
+(see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>), Bash sends a <CODE>SIGHUP</CODE> to all jobs when
+an interactive login shell exits.
+</P><P>
+
+If Bash is waiting for a command to complete and receives a signal
+for which a trap has been set, the trap will not be executed until
+the command completes. 
+When Bash is waiting for an asynchronous
+command via the <CODE>wait</CODE> builtin, the reception of a signal for
+which a trap has been set will cause the <CODE>wait</CODE> builtin to return
+immediately with an exit status greater than 128, immediately after
+which the trap is executed.
+</P><P>
+
+<A NAME="Shell Scripts"></A>
+<HR SIZE="6">
+<A NAME="SEC55"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC54"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC5"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 3.8 Shell Scripts </H2>
+<!--docid::SEC55::-->
+<P>
+
+A shell script is a text file containing shell commands.  When such
+a file is used as the first non-option argument when invoking Bash,
+and neither the <SAMP>`-c'</SAMP> nor <SAMP>`-s'</SAMP> option is supplied
+(see section <A HREF="bashref.html#SEC65">6.1 Invoking Bash</A>), 
+Bash reads and executes commands from the file, then exits.  This
+mode of operation creates a non-interactive shell.  The shell first
+searches for the file in the current directory, and looks in the
+directories in <CODE>$PATH</CODE> if not found there.
+</P><P>
+
+When Bash runs
+a shell script, it sets the special parameter <CODE>0</CODE> to the name
+of the file, rather than the name of the shell, and the positional
+parameters are set to the remaining arguments, if any are given.
+If no additional arguments are supplied, the positional parameters
+are unset.
+</P><P>
+
+A shell script may be made executable by using the <CODE>chmod</CODE> command
+to turn on the execute bit.  When Bash finds such a file while
+searching the <CODE>$PATH</CODE> for a command, it spawns a subshell to
+execute it.  In other words, executing
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>filename <VAR>arguments</VAR>
+</pre></td></tr></table>is equivalent to executing
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bash filename <VAR>arguments</VAR>
+</pre></td></tr></table></P><P>
+
+if <CODE>filename</CODE> is an executable shell script.
+This subshell reinitializes itself, so that the effect is as if a
+new shell had been invoked to interpret the script, with the
+exception that the locations of commands remembered by the parent
+(see the description of <CODE>hash</CODE> in <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>)
+are retained by the child.
+</P><P>
+
+Most versions of Unix make this a part of the operating system's command
+execution mechanism.  If the first line of a script begins with
+the two characters <SAMP>`#!'</SAMP>, the remainder of the line specifies
+an interpreter for the program.
+Thus, you can specify Bash, <CODE>awk</CODE>, Perl, or some other
+interpreter and write the rest of the script file in that language.
+</P><P>
+
+The arguments to the interpreter
+consist of a single optional argument following the interpreter
+name on the first line of the script file, followed by the name of
+the script file, followed by the rest of the arguments.  Bash
+will perform this action on operating systems that do not handle it
+themselves.  Note that some older versions of Unix limit the interpreter
+name and argument to a maximum of 32 characters.
+</P><P>
+
+Bash scripts often begin with <CODE>#! /bin/bash</CODE> (assuming that
+Bash has been installed in <TT>`/bin'</TT>), since this ensures that
+Bash will be used to interpret the script, even if it is executed
+under another shell.
+</P><P>
+
+<A NAME="Shell Builtin Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC56"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC55"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC57"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 4. Shell Builtin Commands </H1>
+<!--docid::SEC56::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Builtin commands inherited from the Bourne
+                               Shell.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Table of builtins specific to Bash.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC59">4.3 The Set Builtin</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">This builtin is so overloaded it
+                               deserves its own section.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC60">4.4 Special Builtins</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Builtin commands classified specially by
+                               POSIX.2.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+Builtin commands are contained within the shell itself.
+When the name of a builtin command is used as the first word of
+a simple command (see section <A HREF="bashref.html#SEC16">3.2.1 Simple Commands</A>), the shell executes
+the command directly, without invoking another program.
+Builtin commands are necessary to implement functionality impossible
+or inconvenient to obtain with separate utilities.
+</P><P>
+
+This section briefly the builtins which Bash inherits from
+the Bourne Shell, as well as the builtin commands which are unique
+to or have been extended in Bash.
+</P><P>
+
+Several builtin commands are described in other chapters:  builtin
+commands which provide the Bash interface to the job control
+facilities (see section <A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A>), the directory stack
+(see section <A HREF="bashref.html#SEC83">6.8.1 Directory Stack Builtins</A>), the command history
+(see section <A HREF="bashref.html#SEC117">9.2 Bash History Builtins</A>), and the programmable completion
+facilities (see section <A HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A>).
+</P><P>
+
+Many of the builtins have been extended by POSIX or Bash.
+</P><P>
+
+<A NAME="Bourne Shell Builtins"></A>
+<HR SIZE="6">
+<A NAME="SEC57"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC58"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.1 Bourne Shell Builtins </H2>
+<!--docid::SEC57::-->
+<P>
+
+The following shell builtin commands are inherited from the Bourne Shell.
+These commands are implemented as specified by the POSIX 1003.2 standard.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>:    (a colon)</CODE>
+<DD><A NAME="IDX68"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>: [<VAR>arguments</VAR>]
+</pre></td></tr></table>Do nothing beyond expanding <VAR>arguments</VAR> and performing redirections.
+The return status is zero.
+<P>
+
+<DT><CODE>.    (a period)</CODE>
+<DD><A NAME="IDX69"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>. <VAR>filename</VAR> [<VAR>arguments</VAR>]
+</pre></td></tr></table>Read and execute commands from the <VAR>filename</VAR> argument in the
+current shell context.  If <VAR>filename</VAR> does not contain a slash,
+the <CODE>PATH</CODE> variable is used to find <VAR>filename</VAR>.
+When Bash is not in POSIX mode, the current directory is searched
+if <VAR>filename</VAR> is not found in <CODE>$PATH</CODE>.
+If any <VAR>arguments</VAR> are supplied, they become the positional
+parameters when <VAR>filename</VAR> is executed.  Otherwise the positional
+parameters are unchanged.
+The return status is the exit status of the last command executed, or
+zero if no commands are executed.  If <VAR>filename</VAR> is not found, or
+cannot be read, the return status is non-zero.
+This builtin is equivalent to <CODE>source</CODE>.
+<P>
+
+<DT><CODE>break</CODE>
+<DD><A NAME="IDX70"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>break [<VAR>n</VAR>]
+</pre></td></tr></table>Exit from a <CODE>for</CODE>, <CODE>while</CODE>, <CODE>until</CODE>, or <CODE>select</CODE> loop.
+If <VAR>n</VAR> is supplied, the <VAR>n</VAR>th enclosing loop is exited.
+<VAR>n</VAR> must be greater than or equal to 1.
+The return status is zero unless <VAR>n</VAR> is not greater than or equal to 1.
+<P>
+
+<DT><CODE>cd</CODE>
+<DD><A NAME="IDX71"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>cd [-L|-P] [<VAR>directory</VAR>]
+</pre></td></tr></table>Change the current working directory to <VAR>directory</VAR>.
+If <VAR>directory</VAR> is not given, the value of the <CODE>HOME</CODE> shell
+variable is used.
+If the shell variable <CODE>CDPATH</CODE> exists, it is used as a search path.
+If <VAR>directory</VAR> begins with a slash, <CODE>CDPATH</CODE> is not used.
+<P>
+
+The <SAMP>`-P'</SAMP> option means to not follow symbolic links; symbolic
+links are followed by default or with the <SAMP>`-L'</SAMP> option.
+If <VAR>directory</VAR> is <SAMP>`-'</SAMP>, it is equivalent to <CODE>$OLDPWD</CODE>.
+</P><P>
+
+If a non-empty directory name from <CODE>CDPATH</CODE> is used, or if
+<SAMP>`-'</SAMP> is the first argument, and the directory change is
+successful, the absolute pathname of the new working directory is
+written to the standard output.
+</P><P>
+
+The return status is zero if the directory is successfully changed,
+non-zero otherwise.
+</P><P>
+
+<DT><CODE>continue</CODE>
+<DD><A NAME="IDX72"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>continue [<VAR>n</VAR>]
+</pre></td></tr></table>Resume the next iteration of an enclosing <CODE>for</CODE>, <CODE>while</CODE>,
+<CODE>until</CODE>, or <CODE>select</CODE> loop.
+If <VAR>n</VAR> is supplied, the execution of the <VAR>n</VAR>th enclosing loop
+is resumed.
+<VAR>n</VAR> must be greater than or equal to 1.
+The return status is zero unless <VAR>n</VAR> is not greater than or equal to 1.
+<P>
+
+<DT><CODE>eval</CODE>
+<DD><A NAME="IDX73"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>eval [<VAR>arguments</VAR>]
+</pre></td></tr></table>The arguments are concatenated together into a single command, which is
+then read and executed, and its exit status returned as the exit status
+of <CODE>eval</CODE>.
+If there are no arguments or only empty arguments, the return status is
+zero.
+<P>
+
+<DT><CODE>exec</CODE>
+<DD><A NAME="IDX74"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>exec [-cl] [-a <VAR>name</VAR>] [<VAR>command</VAR> [<VAR>arguments</VAR>]]
+</pre></td></tr></table>If <VAR>command</VAR>
+is supplied, it replaces the shell without creating a new process.
+If the <SAMP>`-l'</SAMP> option is supplied, the shell places a dash at the
+beginning of the zeroth arg passed to <VAR>command</VAR>.
+This is what the <CODE>login</CODE> program does.
+The <SAMP>`-c'</SAMP> option causes <VAR>command</VAR> to be executed with an empty
+environment.
+If <SAMP>`-a'</SAMP> is supplied, the shell passes <VAR>name</VAR> as the zeroth
+argument to <VAR>command</VAR>.
+If no <VAR>command</VAR> is specified, redirections may be used to affect
+the current shell environment.  If there are no redirection errors, the
+return status is zero; otherwise the return status is non-zero.
+<P>
+
+<DT><CODE>exit</CODE>
+<DD><A NAME="IDX75"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>exit [<VAR>n</VAR>]
+</pre></td></tr></table>Exit the shell, returning a status of <VAR>n</VAR> to the shell's parent.
+If <VAR>n</VAR> is omitted, the exit status is that of the last command executed.
+Any trap on <CODE>EXIT</CODE> is executed before the shell terminates.
+<P>
+
+<DT><CODE>export</CODE>
+<DD><A NAME="IDX76"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>export [-fn] [-p] [<VAR>name</VAR>[=<VAR>value</VAR>]]
+</pre></td></tr></table>Mark each <VAR>name</VAR> to be passed to child processes
+in the environment.  If the <SAMP>`-f'</SAMP> option is supplied, the <VAR>name</VAR>s
+refer to shell functions; otherwise the names refer to shell variables.
+The <SAMP>`-n'</SAMP> option means to no longer mark each <VAR>name</VAR> for export.
+If no <VAR>names</VAR> are supplied, or if the <SAMP>`-p'</SAMP> option is given, a
+list of exported names is displayed.
+The <SAMP>`-p'</SAMP> option displays output in a form that may be reused as input.
+If a variable name is followed by =<VAR>value</VAR>, the value of
+the variable is set to <VAR>value</VAR>.
+<P>
+
+The return status is zero unless an invalid option is supplied, one of
+the names is not a valid shell variable name, or <SAMP>`-f'</SAMP> is supplied
+with a name that is not a shell function.
+</P><P>
+
+<DT><CODE>getopts</CODE>
+<DD><A NAME="IDX77"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>getopts <VAR>optstring</VAR> <VAR>name</VAR> [<VAR>args</VAR>]
+</pre></td></tr></table><CODE>getopts</CODE> is used by shell scripts to parse positional parameters.
+<VAR>optstring</VAR> contains the option characters to be recognized; if a
+character is followed by a colon, the option is expected to have an
+argument, which should be separated from it by white space.
+The colon (<SAMP>`:'</SAMP>) and question mark (<SAMP>`?'</SAMP>) may not be
+used as option characters.
+Each time it is invoked, <CODE>getopts</CODE>
+places the next option in the shell variable <VAR>name</VAR>, initializing
+<VAR>name</VAR> if it does not exist,
+and the index of the next argument to be processed into the
+variable <CODE>OPTIND</CODE>.
+<CODE>OPTIND</CODE> is initialized to 1 each time the shell or a shell script
+is invoked.
+When an option requires an argument,
+<CODE>getopts</CODE> places that argument into the variable <CODE>OPTARG</CODE>.
+The shell does not reset <CODE>OPTIND</CODE> automatically; it must be manually
+reset between multiple calls to <CODE>getopts</CODE> within the same shell
+invocation if a new set of parameters is to be used.
+<P>
+
+When the end of options is encountered, <CODE>getopts</CODE> exits with a
+return value greater than zero.
+<CODE>OPTIND</CODE> is set to the index of the first non-option argument,
+and <CODE>name</CODE> is set to <SAMP>`?'</SAMP>.
+</P><P>
+
+<CODE>getopts</CODE>
+normally parses the positional parameters, but if more arguments are
+given in <VAR>args</VAR>, <CODE>getopts</CODE> parses those instead.
+</P><P>
+
+<CODE>getopts</CODE> can report errors in two ways.  If the first character of
+<VAR>optstring</VAR> is a colon, <VAR>silent</VAR>
+error reporting is used.  In normal operation diagnostic messages
+are printed when invalid options or missing option arguments are
+encountered.
+If the variable <CODE>OPTERR</CODE>
+is set to 0, no error messages will be displayed, even if the first
+character of <CODE>optstring</CODE> is not a colon.
+</P><P>
+
+If an invalid option is seen,
+<CODE>getopts</CODE> places <SAMP>`?'</SAMP> into <VAR>name</VAR> and, if not silent,
+prints an error message and unsets <CODE>OPTARG</CODE>.
+If <CODE>getopts</CODE> is silent, the option character found is placed in
+<CODE>OPTARG</CODE> and no diagnostic message is printed.
+</P><P>
+
+If a required argument is not found, and <CODE>getopts</CODE>
+is not silent, a question mark (<SAMP>`?'</SAMP>) is placed in <VAR>name</VAR>,
+<CODE>OPTARG</CODE> is unset, and a diagnostic message is printed.
+If <CODE>getopts</CODE> is silent, then a colon (<SAMP>`:'</SAMP>) is placed in
+<VAR>name</VAR> and <CODE>OPTARG</CODE> is set to the option character found.
+</P><P>
+
+<DT><CODE>hash</CODE>
+<DD><A NAME="IDX78"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>hash [-'r] [-p <VAR>filename</VAR>] [-dt] [<VAR>name</VAR>]
+</pre></td></tr></table>Remember the full pathnames of commands specified as <VAR>name</VAR> arguments,
+so they need not be searched for on subsequent invocations.
+The commands are found by searching through the directories listed in
+<CODE>$PATH</CODE>.
+The <SAMP>`-p'</SAMP> option inhibits the path search, and <VAR>filename</VAR> is
+used as the location of <VAR>name</VAR>.
+The <SAMP>`-r'</SAMP> option causes the shell to forget all remembered locations.
+The <SAMP>`-d'</SAMP> option causes the shell to forget the remembered location
+of each <VAR>name</VAR>.
+If the <SAMP>`-t'</SAMP> option is supplied, the full pathname to which each
+<VAR>name</VAR> corresponds is printed.  If multiple <VAR>name</VAR> arguments are
+supplied with <SAMP>`-t'</SAMP> the <VAR>name</VAR> is printed before the hashed
+full pathname.
+The <SAMP>`-l'</SAMP> option causes output to be displayed in a format
+that may be reused as input.
+If no arguments are given, or if only <SAMP>`-l'</SAMP> is supplied,
+information about remembered commands is printed.
+The return status is zero unless a <VAR>name</VAR> is not found or an invalid
+option is supplied.
+<P>
+
+<DT><CODE>pwd</CODE>
+<DD><A NAME="IDX79"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>pwd [-LP]
+</pre></td></tr></table>Print the absolute pathname of the current working directory.
+If the <SAMP>`-P'</SAMP> option is supplied, the pathname printed will not
+contain symbolic links.
+If the <SAMP>`-L'</SAMP> option is supplied, the pathname printed may contain
+symbolic links.
+The return status is zero unless an error is encountered while
+determining the name of the current directory or an invalid option
+is supplied.
+<P>
+
+<DT><CODE>readonly</CODE>
+<DD><A NAME="IDX80"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>readonly [-apf] [<VAR>name</VAR>[=<VAR>value</VAR>]] <small>...</small>
+</pre></td></tr></table>Mark each <VAR>name</VAR> as readonly.
+The values of these names may not be changed by subsequent assignment.
+If the <SAMP>`-f'</SAMP> option is supplied, each <VAR>name</VAR> refers to a shell
+function.
+The <SAMP>`-a'</SAMP> option means each <VAR>name</VAR> refers to an array variable.
+If no <VAR>name</VAR> arguments are given, or if the <SAMP>`-p'</SAMP>
+option is supplied, a list of all readonly names is printed.
+The <SAMP>`-p'</SAMP> option causes output to be displayed in a format that
+may be reused as input.
+If a variable name is followed by =<VAR>value</VAR>, the value of
+the variable is set to <VAR>value</VAR>.
+The return status is zero unless an invalid option is supplied, one of
+the <VAR>name</VAR> arguments is not a valid shell variable or function name,
+or the <SAMP>`-f'</SAMP> option is supplied with a name that is not a shell function.
+<P>
+
+<DT><CODE>return</CODE>
+<DD><A NAME="IDX81"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>return [<VAR>n</VAR>]
+</pre></td></tr></table>Cause a shell function to exit with the return value <VAR>n</VAR>.
+If <VAR>n</VAR> is not supplied, the return value is the exit status of the
+last command executed in the function.
+This may also be used to terminate execution of a script being executed
+with the <CODE>.</CODE> (or <CODE>source</CODE>) builtin, returning either <VAR>n</VAR> or
+the exit status of the last command executed within the script as the exit
+status of the script.
+Any command associated with the <CODE>RETURN</CODE> trap is executed
+before execution resumes after the function or script.
+The return status is non-zero if <CODE>return</CODE> is used outside a function
+and not during the execution of a script by <CODE>.</CODE> or <CODE>source</CODE>.
+<P>
+
+<DT><CODE>shift</CODE>
+<DD><A NAME="IDX82"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>shift [<VAR>n</VAR>]
+</pre></td></tr></table>Shift the positional parameters to the left by <VAR>n</VAR>.
+The positional parameters from <VAR>n</VAR>+1 <small>...</small> <CODE>$#</CODE> are
+renamed to <CODE>$1</CODE> <small>...</small> <CODE>$#</CODE>-<VAR>n</VAR>+1.
+Parameters represented by the numbers <CODE>$#</CODE> to <VAR>n</VAR>+1 are unset.
+<VAR>n</VAR> must be a non-negative number less than or equal to <CODE>$#</CODE>.
+If <VAR>n</VAR> is zero or greater than <CODE>$#</CODE>, the positional parameters
+are not changed.
+If <VAR>n</VAR> is not supplied, it is assumed to be 1.
+The return status is zero unless <VAR>n</VAR> is greater than <CODE>$#</CODE> or
+less than zero, non-zero otherwise.
+<P>
+
+<DT><CODE>test</CODE>
+<DD><DT><CODE>[</CODE>
+<DD><A NAME="IDX83"></A>
+<A NAME="IDX84"></A>
+Evaluate a conditional expression <VAR>expr</VAR>.
+Each operator and operand must be a separate argument.
+Expressions are composed of the primaries described below in
+<A HREF="bashref.html#SEC78">6.4 Bash Conditional Expressions</A>.
+<P>
+
+When the <CODE>[</CODE> form is used, the last argument to the command must
+be a <CODE>]</CODE>.
+</P><P>
+
+Expressions may be combined using the following operators, listed in
+decreasing order of precedence.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>! <VAR>expr</VAR></CODE>
+<DD>True if <VAR>expr</VAR> is false.
+<P>
+
+<DT><CODE>( <VAR>expr</VAR> )</CODE>
+<DD>Returns the value of <VAR>expr</VAR>.
+This may be used to override the normal precedence of operators.
+<P>
+
+<DT><CODE><VAR>expr1</VAR> -a <VAR>expr2</VAR></CODE>
+<DD>True if both <VAR>expr1</VAR> and <VAR>expr2</VAR> are true.
+<P>
+
+<DT><CODE><VAR>expr1</VAR> -o <VAR>expr2</VAR></CODE>
+<DD>True if either <VAR>expr1</VAR> or <VAR>expr2</VAR> is true.
+</DL>
+<P>
+
+The <CODE>test</CODE> and <CODE>[</CODE> builtins evaluate conditional
+expressions using a set of rules based on the number of arguments.
+</P><P>
+
+<DL COMPACT>
+<DT>0 arguments
+<DD>The expression is false.
+<P>
+
+<DT>1 argument
+<DD>The expression is true if and only if the argument is not null.
+<P>
+
+<DT>2 arguments
+<DD>If the first argument is <SAMP>`!'</SAMP>, the expression is true if and
+only if the second argument is null.
+If the first argument is one of the unary conditional operators
+(see section <A HREF="bashref.html#SEC78">6.4 Bash Conditional Expressions</A>), the expression
+is true if the unary test is true.
+If the first argument is not a valid unary operator, the expression is
+false.
+<P>
+
+<DT>3 arguments
+<DD>If the second argument is one of the binary conditional
+operators (see section <A HREF="bashref.html#SEC78">6.4 Bash Conditional Expressions</A>), the
+result of the expression is the result of the binary test using the
+first and third arguments as operands.
+If the first argument is <SAMP>`!'</SAMP>, the value is the negation of
+the two-argument test using the second and third arguments.
+If the first argument is exactly <SAMP>`('</SAMP> and the third argument is
+exactly <SAMP>`)'</SAMP>, the result is the one-argument test of the second
+argument.
+Otherwise, the expression is false.
+The <SAMP>`-a'</SAMP> and <SAMP>`-o'</SAMP> operators are considered binary operators
+in this case.  
+<P>
+
+<DT>4 arguments
+<DD>If the first argument is <SAMP>`!'</SAMP>, the result is the negation of
+the three-argument expression composed of the remaining arguments.
+Otherwise, the expression is parsed and evaluated according to 
+precedence using the rules listed above.
+<P>
+
+<DT>5 or more arguments
+<DD>The expression is parsed and evaluated according to precedence
+using the rules listed above.
+</DL>
+<P>
+
+<DT><CODE>times</CODE>
+<DD><A NAME="IDX85"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>times
+</pre></td></tr></table>Print out the user and system times used by the shell and its children.
+The return status is zero.
+<P>
+
+<DT><CODE>trap</CODE>
+<DD><A NAME="IDX86"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>trap [-lp] [<VAR>arg</VAR>] [<VAR>sigspec</VAR> <small>...</small>]
+</pre></td></tr></table>The commands in <VAR>arg</VAR> are to be read and executed when the
+shell receives signal <VAR>sigspec</VAR>.  If <VAR>arg</VAR> is absent or
+equal to <SAMP>`-'</SAMP>, all specified signals are reset to the values
+they had when the shell was started.
+If <VAR>arg</VAR> is the null string, then the signal specified by
+each <VAR>sigspec</VAR> is ignored by the shell and commands it invokes.
+If <VAR>arg</VAR> is not present and <SAMP>`-p'</SAMP> has been supplied,
+the shell displays the trap commands associated with each <VAR>sigspec</VAR>.
+If no arguments are supplied, or
+only <SAMP>`-p'</SAMP> is given, <CODE>trap</CODE> prints the list of commands
+associated with each signal number in a form that may be reused as
+shell input.
+The <SAMP>`-l'</SAMP> option causes the shell to print a list of signal names
+and their corresponding numbers.
+<P>
+
+Each <VAR>sigspec</VAR> is either a signal name such as <CODE>SIGINT</CODE> (with
+or without the <CODE>SIG</CODE> prefix) or a signal number.
+If a <VAR>sigspec</VAR>
+is <CODE>0</CODE> or <CODE>EXIT</CODE>, <VAR>arg</VAR> is executed when the shell exits.
+If a <VAR>sigspec</VAR> is <CODE>DEBUG</CODE>, the command <VAR>arg</VAR> is executed
+before every simple command, <CODE>for</CODE> command, <CODE>case</CODE> command,
+<CODE>select</CODE> command, every arithmetic <CODE>for</CODE> command, and before
+the first command executes in a shell function.
+Refer to the description of the <CODE>extglob</CODE> option to the
+<CODE>shopt</CODE> builtin (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>) for details of its
+effect on the <CODE>DEBUG</CODE> trap.
+If a <VAR>sigspec</VAR> is <CODE>ERR</CODE>, the command <VAR>arg</VAR> 
+is executed whenever a simple command has a non-zero exit status,
+subject to the following conditions.
+The <CODE>ERR</CODE> trap is not executed if the failed command is part of the
+command list immediately following an <CODE>until</CODE> or <CODE>while</CODE> keyword,
+part of the test in an <CODE>if</CODE> statement,
+part of a <CODE>&#38;&#38;</CODE> or <CODE>||</CODE> list, or if the command's return
+status is being inverted using <CODE>!</CODE>.
+These are the same conditions obeyed by the <CODE>errexit</CODE> option.
+If a <VAR>sigspec</VAR> is <CODE>RETURN</CODE>, the command <VAR>arg</VAR> is executed
+each time a shell function or a script executed with the <CODE>.</CODE> or
+<CODE>source</CODE> builtins finishes executing.
+</P><P>
+
+Signals ignored upon entry to the shell cannot be trapped or reset.
+Trapped signals are reset to their original values in a child  
+process when it is created.
+</P><P>
+
+The return status is zero unless a <VAR>sigspec</VAR> does not specify a
+valid signal.
+</P><P>
+
+<DT><CODE>umask</CODE>
+<DD><A NAME="IDX87"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>umask [-p] [-S] [<VAR>mode</VAR>]
+</pre></td></tr></table>Set the shell process's file creation mask to <VAR>mode</VAR>.  If
+<VAR>mode</VAR> begins with a digit, it is interpreted as an octal number;
+if not, it is interpreted as a symbolic mode mask similar
+to that accepted by the <CODE>chmod</CODE> command.  If <VAR>mode</VAR> is
+omitted, the current value of the mask is printed.  If the <SAMP>`-S'</SAMP>
+option is supplied without a <VAR>mode</VAR> argument, the mask is printed
+in a symbolic format.
+If the  <SAMP>`-p'</SAMP> option is supplied, and <VAR>mode</VAR>
+is omitted, the output is in a form that may be reused as input.
+The return status is zero if the mode is successfully changed or if
+no <VAR>mode</VAR> argument is supplied, and non-zero otherwise.
+<P>
+
+Note that when the mode is interpreted as an octal number, each number
+of the umask is subtracted from <CODE>7</CODE>.  Thus, a umask of <CODE>022</CODE>
+results in permissions of <CODE>755</CODE>.
+</P><P>
+
+<DT><CODE>unset</CODE>
+<DD><A NAME="IDX88"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>unset [-fv] [<VAR>name</VAR>]
+</pre></td></tr></table>Each variable or function <VAR>name</VAR> is removed.
+If no options are supplied, or the <SAMP>`-v'</SAMP> option is given, each
+<VAR>name</VAR> refers to a shell variable. 
+If the <SAMP>`-f'</SAMP> option is given, the <VAR>name</VAR>s refer to shell
+functions, and the function definition is removed.
+Readonly variables and functions may not be unset.
+The return status is zero unless a <VAR>name</VAR> is readonly.
+</DL>
+<P>
+
+<A NAME="Bash Builtins"></A>
+<HR SIZE="6">
+<A NAME="SEC58"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC57"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC59"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC59"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.2 Bash Builtin Commands </H2>
+<!--docid::SEC58::-->
+<P>
+
+This section describes builtin commands which are unique to
+or have been extended in Bash.
+Some of these commands are specified in the POSIX 1003.2 standard.
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>alias</CODE>
+<DD><A NAME="IDX89"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>alias [<CODE>-p</CODE>] [<VAR>name</VAR>[=<VAR>value</VAR>] <small>...</small>]
+</pre></td></tr></table><P>
+
+Without arguments or with the <SAMP>`-p'</SAMP> option, <CODE>alias</CODE> prints
+the list of aliases on the standard output in a form that allows
+them to be reused as input.
+If arguments are supplied, an alias is defined for each <VAR>name</VAR>
+whose <VAR>value</VAR> is given.  If no <VAR>value</VAR> is given, the name
+and value of the alias is printed.
+Aliases are described in <A HREF="bashref.html#SEC80">6.6 Aliases</A>.
+</P><P>
+
+<DT><CODE>bind</CODE>
+<DD><A NAME="IDX90"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bind [-m <VAR>keymap</VAR>] [-lpsvPSV]
+bind [-m <VAR>keymap</VAR>] [-q <VAR>function</VAR>] [-u <VAR>function</VAR>] [-r <VAR>keyseq</VAR>]
+bind [-m <VAR>keymap</VAR>] -f <VAR>filename</VAR>
+bind [-m <VAR>keymap</VAR>] -x <VAR>keyseq:shell-command</VAR>
+bind [-m <VAR>keymap</VAR>] <VAR>keyseq:function-name</VAR>
+bind <VAR>readline-command</VAR>
+</pre></td></tr></table><P>
+
+Display current Readline (see section <A HREF="bashref.html#SEC91">8. Command Line Editing</A>)
+key and function bindings,
+bind a key sequence to a Readline function or macro,
+or set a Readline variable.
+Each non-option argument is a command as it would appear in a
+a Readline initialization file (see section <A HREF="bashref.html#SEC99">8.3 Readline Init File</A>),
+but each binding or command must be passed as a separate argument;  e.g.,
+<SAMP>`"\C-x\C-r":re-read-init-file'</SAMP>.
+Options, if supplied, have the following meanings:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>-m <VAR>keymap</VAR></CODE>
+<DD>Use <VAR>keymap</VAR> as the keymap to be affected by
+the subsequent bindings.  Acceptable <VAR>keymap</VAR>
+names are
+<CODE>emacs</CODE>,
+<CODE>emacs-standard</CODE>,
+<CODE>emacs-meta</CODE>,
+<CODE>emacs-ctlx</CODE>,
+<CODE>vi</CODE>,
+<CODE>vi-move</CODE>,
+<CODE>vi-command</CODE>, and
+<CODE>vi-insert</CODE>.
+<CODE>vi</CODE> is equivalent to <CODE>vi-command</CODE>;
+<CODE>emacs</CODE> is equivalent to <CODE>emacs-standard</CODE>.
+<P>
+
+<DT><CODE>-l</CODE>
+<DD>List the names of all Readline functions.
+<P>
+
+<DT><CODE>-p</CODE>
+<DD>Display Readline function names and bindings in such a way that they
+can be used as input or in a Readline initialization file.
+<P>
+
+<DT><CODE>-P</CODE>
+<DD>List current Readline function names and bindings.
+<P>
+
+<DT><CODE>-v</CODE>
+<DD>Display Readline variable names and values in such a way that they
+can be used as input or in a Readline initialization file.
+<P>
+
+<DT><CODE>-V</CODE>
+<DD>List current Readline variable names and values.
+<P>
+
+<DT><CODE>-s</CODE>
+<DD>Display Readline key sequences bound to macros and the strings they output
+in such a way that they can be used as input or in a Readline
+initialization file.
+<P>
+
+<DT><CODE>-S</CODE>
+<DD>Display Readline key sequences bound to macros and the strings they output.
+<P>
+
+<DT><CODE>-f <VAR>filename</VAR></CODE>
+<DD>Read key bindings from <VAR>filename</VAR>.
+<P>
+
+<DT><CODE>-q <VAR>function</VAR></CODE>
+<DD>Query about which keys invoke the named <VAR>function</VAR>.
+<P>
+
+<DT><CODE>-u <VAR>function</VAR></CODE>
+<DD>Unbind all keys bound to the named <VAR>function</VAR>.
+<P>
+
+<DT><CODE>-r <VAR>keyseq</VAR></CODE>
+<DD>Remove any current binding for <VAR>keyseq</VAR>.
+<P>
+
+<DT><CODE>-x <VAR>keyseq:shell-command</VAR></CODE>
+<DD>Cause <VAR>shell-command</VAR> to be executed whenever <VAR>keyseq</VAR> is
+entered.
+<P>
+
+</DL>
+<P>
+
+The return status is zero unless an invalid option is supplied or an
+error occurs.
+</P><P>
+
+<DT><CODE>builtin</CODE>
+<DD><A NAME="IDX91"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>builtin [<VAR>shell-builtin</VAR> [<VAR>args</VAR>]]
+</pre></td></tr></table>Run a shell builtin, passing it <VAR>args</VAR>, and return its exit status.
+This is useful when defining a shell function with the same
+name as a shell builtin, retaining the functionality of the builtin within
+the function.
+The return status is non-zero if <VAR>shell-builtin</VAR> is not a shell
+builtin command.
+<P>
+
+<DT><CODE>caller</CODE>
+<DD><A NAME="IDX92"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>caller [<VAR>expr</VAR>]
+</pre></td></tr></table>Returns the context of any active subroutine call (a shell function or
+a script executed with the <CODE>.</CODE> or <CODE>source</CODE> builtins).
+<P>
+
+Without <VAR>expr</VAR>, <CODE>caller</CODE> displays the line number and source
+filename of the current subroutine call.
+If a non-negative integer is supplied as <VAR>expr</VAR>, <CODE>caller</CODE> 
+displays the line number, subroutine name, and source file corresponding
+to that position in the current execution call stack.  This extra
+information may be used, for example, to print a stack trace.  The
+current frame is frame 0.
+</P><P>
+
+The return value is 0 unless the shell is not executing a subroutine
+call or <VAR>expr</VAR> does not correspond to a valid position in the
+call stack.
+</P><P>
+
+<DT><CODE>command</CODE>
+<DD><A NAME="IDX93"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>command [-pVv] <VAR>command</VAR> [<VAR>arguments</VAR> <small>...</small>]
+</pre></td></tr></table>Runs <VAR>command</VAR> with <VAR>arguments</VAR> ignoring any shell function
+named <VAR>command</VAR>.
+Only shell builtin commands or commands found by searching the
+<CODE>PATH</CODE> are executed.
+If there is a shell function named <CODE>ls</CODE>, running <SAMP>`command ls'</SAMP>
+within the function will execute the external command <CODE>ls</CODE>
+instead of calling the function recursively.
+The <SAMP>`-p'</SAMP> option means to use a default value for <CODE>PATH</CODE>
+that is guaranteed to find all of the standard utilities.
+The return status in this case is 127 if <VAR>command</VAR> cannot be
+found or an error occurred, and the exit status of <VAR>command</VAR>
+otherwise.
+<P>
+
+If either the <SAMP>`-V'</SAMP> or <SAMP>`-v'</SAMP> option is supplied, a
+description of <VAR>command</VAR> is printed.  The <SAMP>`-v'</SAMP> option
+causes a single word indicating the command or file name used to
+invoke <VAR>command</VAR> to be displayed; the <SAMP>`-V'</SAMP> option produces
+a more verbose description.  In this case, the return status is
+zero if <VAR>command</VAR> is found, and non-zero if not.
+</P><P>
+
+<DT><CODE>declare</CODE>
+<DD><A NAME="IDX94"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>declare [-afFirtx] [-p] [<VAR>name</VAR>[=<VAR>value</VAR>] <small>...</small>]
+</pre></td></tr></table><P>
+
+Declare variables and give them attributes.  If no <VAR>name</VAR>s
+are given, then display the values of variables instead. 
+</P><P>
+
+The <SAMP>`-p'</SAMP> option will display the attributes and values of each
+<VAR>name</VAR>.
+When <SAMP>`-p'</SAMP> is used, additional options are ignored.
+The <SAMP>`-F'</SAMP> option inhibits the display of function definitions;
+only the function name and attributes are printed.
+If the <CODE>extdebug</CODE> shell option is enabled using <CODE>shopt</CODE>
+(see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>), the source file name and line number where
+the function is defined are displayed as well.
+<SAMP>`-F'</SAMP> implies <SAMP>`-f'</SAMP>.
+The following options can be used to restrict output to variables with
+the specified attributes or to give variables attributes:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>-a</CODE>
+<DD>Each <VAR>name</VAR> is an array variable (see section <A HREF="bashref.html#SEC81">6.7 Arrays</A>).
+<P>
+
+<DT><CODE>-f</CODE>
+<DD>Use function names only.
+<P>
+
+<DT><CODE>-i</CODE>
+<DD>The variable is to be treated as
+an integer; arithmetic evaluation (see section <A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A>) is
+performed when the variable is assigned a value.
+<P>
+
+<DT><CODE>-r</CODE>
+<DD>Make <VAR>name</VAR>s readonly.  These names cannot then be assigned values
+by subsequent assignment statements or unset.
+<P>
+
+<DT><CODE>-t</CODE>
+<DD>Give each <VAR>name</VAR> the <CODE>trace</CODE> attribute.
+Traced functions inherit the <CODE>DEBUG</CODE> trap from the calling shell.
+The trace attribute has no special meaning for variables.
+<P>
+
+<DT><CODE>-x</CODE>
+<DD>Mark each <VAR>name</VAR> for export to subsequent commands via
+the environment.
+</DL>
+<P>
+
+Using <SAMP>`+'</SAMP> instead of <SAMP>`-'</SAMP> turns off the attribute instead.
+When used in a function, <CODE>declare</CODE> makes each <VAR>name</VAR> local,
+as with the <CODE>local</CODE> command.  If a variable name is followed by
+=<VAR>value</VAR>, the value of the variable is set to <VAR>value</VAR>.
+</P><P>
+
+The return status is zero unless an invalid option is encountered,
+an attempt is made to define a function using <SAMP>`-f foo=bar'</SAMP>,
+an attempt is made to assign a value to a readonly variable,
+an attempt is made to assign a value to an array variable without
+using the compound assignment syntax (see section <A HREF="bashref.html#SEC81">6.7 Arrays</A>),
+one of the <VAR>names</VAR> is not a valid shell variable name,
+an attempt is made to turn off readonly status for a readonly variable,
+an attempt is made to turn off array status for an array variable,
+or an attempt is made to display a non-existent function with <SAMP>`-f'</SAMP>.
+</P><P>
+
+<DT><CODE>echo</CODE>
+<DD><A NAME="IDX95"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>echo [-neE] [<VAR>arg</VAR> <small>...</small>]
+</pre></td></tr></table>Output the <VAR>arg</VAR>s, separated by spaces, terminated with a
+newline.
+The return status is always 0.
+If <SAMP>`-n'</SAMP> is specified, the trailing newline is suppressed.
+If the <SAMP>`-e'</SAMP> option is given, interpretation of the following
+backslash-escaped characters is enabled.
+The <SAMP>`-E'</SAMP> option disables the interpretation of these escape characters,
+even on systems where they are interpreted by default.
+The <CODE>xpg_echo</CODE> shell option may be used to
+dynamically determine whether or not <CODE>echo</CODE> expands these
+escape characters by default.
+<CODE>echo</CODE> interprets the following escape sequences:
+<DL COMPACT>
+<DT><CODE>\a</CODE>
+<DD>alert (bell)
+<DT><CODE>\b</CODE>
+<DD>backspace
+<DT><CODE>\c</CODE>
+<DD>suppress trailing newline
+<DT><CODE>\e</CODE>
+<DD>escape
+<DT><CODE>\f</CODE>
+<DD>form feed
+<DT><CODE>\n</CODE>
+<DD>new line
+<DT><CODE>\r</CODE>
+<DD>carriage return
+<DT><CODE>\t</CODE>
+<DD>horizontal tab
+<DT><CODE>\v</CODE>
+<DD>vertical tab
+<DT><CODE>\\</CODE>
+<DD>backslash
+<DT><CODE>\0<VAR>nnn</VAR></CODE>
+<DD>the eight-bit character whose value is the octal value <VAR>nnn</VAR>
+(zero to three octal digits)
+<DT><CODE>\<VAR>nnn</VAR></CODE>
+<DD>the eight-bit character whose value is the octal value <VAR>nnn</VAR>
+(one to three octal digits)
+<DT><CODE>\x<VAR>HH</VAR></CODE>
+<DD>the eight-bit character whose value is the hexadecimal value <VAR>HH</VAR>
+(one or two hex digits)
+</DL>
+<P>
+
+<DT><CODE>enable</CODE>
+<DD><A NAME="IDX96"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>enable [-n] [-p] [-f <VAR>filename</VAR>] [-ads] [<VAR>name</VAR> <small>...</small>]
+</pre></td></tr></table>Enable and disable builtin shell commands.
+Disabling a builtin allows a disk command which has the same name
+as a shell builtin to be executed without specifying a full pathname,
+even though the shell normally searches for builtins before disk commands.
+If <SAMP>`-n'</SAMP> is used, the <VAR>name</VAR>s become disabled.  Otherwise
+<VAR>name</VAR>s are enabled.  For example, to use the <CODE>test</CODE> binary
+found via <CODE>$PATH</CODE> instead of the shell builtin version, type
+<SAMP>`enable -n test'</SAMP>.
+<P>
+
+If the <SAMP>`-p'</SAMP> option is supplied, or no <VAR>name</VAR> arguments appear,
+a list of shell builtins is printed.  With no other arguments, the list
+consists of all enabled shell builtins.
+The <SAMP>`-a'</SAMP> option means to list
+each builtin with an indication of whether or not it is enabled. 
+</P><P>
+
+The <SAMP>`-f'</SAMP> option means to load the new builtin command <VAR>name</VAR>
+from shared object <VAR>filename</VAR>, on systems that support dynamic loading.
+The <SAMP>`-d'</SAMP> option will delete a builtin loaded with <SAMP>`-f'</SAMP>.
+</P><P>
+
+If there are no options, a list of the shell builtins is displayed.
+The <SAMP>`-s'</SAMP> option restricts <CODE>enable</CODE> to the POSIX special
+builtins.  If <SAMP>`-s'</SAMP> is used with <SAMP>`-f'</SAMP>, the new builtin becomes
+a special builtin (see section <A HREF="bashref.html#SEC60">4.4 Special Builtins</A>).
+</P><P>
+
+The return status is zero unless a <VAR>name</VAR> is not a shell builtin
+or there is an error loading a new builtin from a shared object.
+</P><P>
+
+<DT><CODE>help</CODE>
+<DD><A NAME="IDX97"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>help [-s] [<VAR>pattern</VAR>]
+</pre></td></tr></table>Display helpful information about builtin commands.
+If <VAR>pattern</VAR> is specified, <CODE>help</CODE> gives detailed help
+on all commands matching <VAR>pattern</VAR>, otherwise a list of
+the builtins is printed.
+The <SAMP>`-s'</SAMP> option restricts the information displayed to a short
+usage synopsis.
+The return status is zero unless no command matches <VAR>pattern</VAR>.
+<P>
+
+<DT><CODE>let</CODE>
+<DD><A NAME="IDX98"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>let <VAR>expression</VAR> [<VAR>expression</VAR>]
+</pre></td></tr></table>The <CODE>let</CODE> builtin allows arithmetic to be performed on shell
+variables.  Each <VAR>expression</VAR> is evaluated according to the
+rules given below in <A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A>.  If the
+last <VAR>expression</VAR> evaluates to 0, <CODE>let</CODE> returns 1;
+otherwise 0 is returned.
+<P>
+
+<DT><CODE>local</CODE>
+<DD><A NAME="IDX99"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>local [<VAR>option</VAR>] <VAR>name</VAR>[=<VAR>value</VAR>] <small>...</small>
+</pre></td></tr></table>For each argument, a local variable named <VAR>name</VAR> is created,
+and assigned <VAR>value</VAR>.
+The <VAR>option</VAR> can be any of the options accepted by <CODE>declare</CODE>.
+<CODE>local</CODE> can only be used within a function; it makes the variable
+<VAR>name</VAR> have a visible scope restricted to that function and its
+children.  The return status is zero unless <CODE>local</CODE> is used outside
+a function, an invalid <VAR>name</VAR> is supplied, or <VAR>name</VAR> is a
+readonly variable.
+<P>
+
+<DT><CODE>logout</CODE>
+<DD><A NAME="IDX100"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>logout [<VAR>n</VAR>]
+</pre></td></tr></table>Exit a login shell, returning a status of <VAR>n</VAR> to the shell's
+parent.
+<P>
+
+<DT><CODE>printf</CODE>
+<DD><A NAME="IDX101"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>printf</CODE> <VAR>format</VAR> [<VAR>arguments</VAR>]
+</pre></td></tr></table>Write the formatted <VAR>arguments</VAR> to the standard output under the
+control of the <VAR>format</VAR>.
+The <VAR>format</VAR> is a character string which contains three types of objects:
+plain characters, which are simply copied to standard output, character
+escape sequences, which are converted and copied to the standard output, and
+format specifications, each of which causes printing of the next successive
+<VAR>argument</VAR>.
+In addition to the standard <CODE>printf(1)</CODE> formats, <SAMP>`%b'</SAMP> causes
+<CODE>printf</CODE> to expand backslash escape sequences in the corresponding
+<VAR>argument</VAR>,
+(except that <SAMP>`\c'</SAMP> terminates output, backslashes in
+<SAMP>`\''</SAMP>, <SAMP>`\"'</SAMP>, and <SAMP>`\?'</SAMP> are not removed, and octal escapes
+beginning with <SAMP>`\0'</SAMP> may contain up to four digits),
+and <SAMP>`%q'</SAMP> causes <CODE>printf</CODE> to output the
+corresponding <VAR>argument</VAR> in a format that can be reused as shell input.
+<P>
+
+The <VAR>format</VAR> is reused as necessary to consume all of the <VAR>arguments</VAR>.
+If the <VAR>format</VAR> requires more <VAR>arguments</VAR> than are supplied, the
+extra format specifications behave as if a zero value or null string, as
+appropriate, had been supplied.  The return value is zero on success,
+non-zero on failure.
+</P><P>
+
+<DT><CODE>read</CODE>
+<DD><A NAME="IDX102"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>read [-ers] [-a <VAR>aname</VAR>] [-d <VAR>delim</VAR>] [-n <VAR>nchars</VAR>] [-p <VAR>prompt</VAR>] [-t <VAR>timeout</VAR>] [-u <VAR>fd</VAR>] [<VAR>name</VAR> <small>...</small>]
+</pre></td></tr></table>One line is read from the standard input, or from the file descriptor
+<VAR>fd</VAR> supplied as an argument to the <SAMP>`-u'</SAMP> option, and the first word
+is assigned to the first <VAR>name</VAR>, the second word to the second <VAR>name</VAR>,
+and so on, with leftover words and their intervening separators assigned
+to the last <VAR>name</VAR>.
+If there are fewer words read from the input stream than names,
+the remaining names are assigned empty values.
+The characters in the value of the <CODE>IFS</CODE> variable
+are used to split the line into words.
+The backslash character <SAMP>`\'</SAMP> may be used to remove any special
+meaning for the next character read and for line continuation.
+If no names are supplied, the line read is assigned to the
+variable <CODE>REPLY</CODE>.
+The return code is zero, unless end-of-file is encountered, <CODE>read</CODE>
+times out, or an invalid file descriptor is supplied as the argument to
+<SAMP>`-u'</SAMP>.
+Options, if supplied, have the following meanings:
+<P>
+
+<DL COMPACT>
+<DT><CODE>-a <VAR>aname</VAR></CODE>
+<DD>The words are assigned to sequential indices of the array variable
+<VAR>aname</VAR>, starting at 0.
+All elements are removed from <VAR>aname</VAR> before the assignment.
+Other <VAR>name</VAR> arguments are ignored.
+<P>
+
+<DT><CODE>-d <VAR>delim</VAR></CODE>
+<DD>The first character of <VAR>delim</VAR> is used to terminate the input line,
+rather than newline.
+<P>
+
+<DT><CODE>-e</CODE>
+<DD>Readline (see section <A HREF="bashref.html#SEC91">8. Command Line Editing</A>) is used to obtain the line.
+<P>
+
+<DT><CODE>-n <VAR>nchars</VAR></CODE>
+<DD><CODE>read</CODE> returns after reading <VAR>nchars</VAR> characters rather than
+waiting for a complete line of input.
+<P>
+
+<DT><CODE>-p <VAR>prompt</VAR></CODE>
+<DD>Display <VAR>prompt</VAR>, without a trailing newline, before attempting
+to read any input.
+The prompt is displayed only if input is coming from a terminal.
+<P>
+
+<DT><CODE>-r</CODE>
+<DD>If this option is given, backslash does not act as an escape character.
+The backslash is considered to be part of the line.
+In particular, a backslash-newline pair may not be used as a line
+continuation.
+<P>
+
+<DT><CODE>-s</CODE>
+<DD>Silent mode.  If input is coming from a terminal, characters are
+not echoed.
+<P>
+
+<DT><CODE>-t <VAR>timeout</VAR></CODE>
+<DD>Cause <CODE>read</CODE> to time out and return failure if a complete line of
+input is not read within <VAR>timeout</VAR> seconds.
+This option has no effect if <CODE>read</CODE> is not reading input from the
+terminal or a pipe.
+<P>
+
+<DT><CODE>-u <VAR>fd</VAR></CODE>
+<DD>Read input from file descriptor <VAR>fd</VAR>.
+<P>
+
+</DL>
+<P>
+
+<DT><CODE>shopt</CODE>
+<DD><A NAME="IDX103"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>shopt [-pqsu] [-o] [<VAR>optname</VAR> <small>...</small>]
+</pre></td></tr></table>Toggle the values of variables controlling optional shell behavior.
+With no options, or with the <SAMP>`-p'</SAMP> option, a list of all settable
+options is displayed, with an indication of whether or not each is set.
+The <SAMP>`-p'</SAMP> option causes output to be displayed in a form that
+may be reused as input.
+Other options have the following meanings:
+<P>
+
+<DL COMPACT>
+<DT><CODE>-s</CODE>
+<DD>Enable (set) each <VAR>optname</VAR>.
+<P>
+
+<DT><CODE>-u</CODE>
+<DD>Disable (unset) each <VAR>optname</VAR>.
+<P>
+
+<DT><CODE>-q</CODE>
+<DD>Suppresses normal output; the return status
+indicates whether the <VAR>optname</VAR> is set or unset.
+If multiple <VAR>optname</VAR> arguments are given with <SAMP>`-q'</SAMP>,
+the return status is zero if all <VAR>optnames</VAR> are enabled;
+non-zero otherwise.
+<P>
+
+<DT><CODE>-o</CODE>
+<DD>Restricts the values of
+<VAR>optname</VAR> to be those defined for the <SAMP>`-o'</SAMP> option to the
+<CODE>set</CODE> builtin (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+</DL>
+<P>
+
+If either <SAMP>`-s'</SAMP> or <SAMP>`-u'</SAMP>
+is used with no <VAR>optname</VAR> arguments, the display is limited to
+those options which are set or unset, respectively.
+</P><P>
+
+Unless otherwise noted, the <CODE>shopt</CODE> options are disabled (off)
+by default.
+</P><P>
+
+The return status when listing options is zero if all <VAR>optnames</VAR>
+are enabled, non-zero otherwise.  When setting or unsetting options,
+the return status is zero unless an <VAR>optname</VAR> is not a valid shell
+option.
+</P><P>
+
+The list of <CODE>shopt</CODE> options is:
+<DL COMPACT>
+<DT><CODE>cdable_vars</CODE>
+<DD>If this is set, an argument to the <CODE>cd</CODE>
+builtin command that
+is not a directory is assumed to be the name of a variable whose
+value is the directory to change to.
+<P>
+
+<DT><CODE>cdspell</CODE>
+<DD>If set, minor errors in the spelling of a directory component in a
+<CODE>cd</CODE> command will be corrected.
+The errors checked for are transposed characters,
+a missing character, and a character too many.
+If a correction is found, the corrected path is printed,
+and the command proceeds.
+This option is only used by interactive shells.
+<P>
+
+<DT><CODE>checkhash</CODE>
+<DD>If this is set, Bash checks that a command found in the hash
+table exists before trying to execute it.  If a hashed command no
+longer exists, a normal path search is performed.
+<P>
+
+<DT><CODE>checkwinsize</CODE>
+<DD>If set, Bash checks the window size after each command
+and, if necessary, updates the values of    
+<CODE>LINES</CODE> and <CODE>COLUMNS</CODE>.
+<P>
+
+<DT><CODE>cmdhist</CODE>
+<DD>If set, Bash
+attempts to save all lines of a multiple-line
+command in the same history entry.  This allows
+easy re-editing of multi-line commands.
+<P>
+
+<DT><CODE>dotglob</CODE>
+<DD>If set, Bash includes filenames beginning with a `.' in
+the results of filename expansion.
+<P>
+
+<DT><CODE>execfail</CODE>
+<DD>If this is set, a non-interactive shell will not exit if
+it cannot execute the file specified as an argument to the <CODE>exec</CODE>
+builtin command.  An interactive shell does not exit if <CODE>exec</CODE>
+fails.
+<P>
+
+<DT><CODE>expand_aliases</CODE>
+<DD>If set, aliases are expanded as described below under Aliases,
+<A HREF="bashref.html#SEC80">6.6 Aliases</A>.
+This option is enabled by default for interactive shells.
+<P>
+
+<DT><CODE>extdebug</CODE>
+<DD>If set, behavior intended for use by debuggers is enabled:
+<P>
+
+<OL>
+<LI>
+The <SAMP>`-F'</SAMP> option to the <CODE>declare</CODE> builtin (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>)
+displays the source file name and line number corresponding to each function
+name supplied as an argument.
+<P>
+
+<LI>
+If the command run by the <CODE>DEBUG</CODE> trap returns a non-zero value, the
+next command is skipped and not executed.
+<P>
+
+<LI>
+If the command run by the <CODE>DEBUG</CODE> trap returns a value of 2, and the
+shell is executing in a subroutine (a shell function or a shell script
+executed by the <CODE>.</CODE> or <CODE>source</CODE> builtins), a call to
+<CODE>return</CODE> is simulated.
+</OL>
+<P>
+
+<DT><CODE>extglob</CODE>
+<DD>If set, the extended pattern matching features described above
+(see section <A HREF="bashref.html#SEC36">3.5.8.1 Pattern Matching</A>) are enabled.
+<P>
+
+<DT><CODE>extquote</CODE>
+<DD>If set, <CODE>$'<VAR>string</VAR>'</CODE> and <CODE>$"<VAR>string</VAR>"</CODE> quoting is  
+performed within <CODE>${<VAR>parameter</VAR>}</CODE> expansions                     
+enclosed in double quotes.  This option is enabled by default. 
+<P>
+
+<DT><CODE>failglob</CODE>
+<DD>If set, patterns which fail to match filenames during pathname expansion
+result in an expansion error.
+<P>
+
+<DT><CODE>force_fignore</CODE>
+<DD>If set, the suffixes specified by the <CODE>FIGNORE</CODE> shell variable
+cause words to be ignored when performing word completion even if
+the ignored words are the only possible completions.
+See section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>, for a description of <CODE>FIGNORE</CODE>.
+This option is enabled by default.
+<P>
+
+<DT><CODE>gnu_errfmt</CODE>
+<DD>If set, shell error messages are written in the standard GNU error
+message format.
+<P>
+
+<DT><CODE>histappend</CODE>
+<DD>If set, the history list is appended to the file named by the value
+of the <CODE>HISTFILE</CODE>
+variable when the shell exits, rather than overwriting the file.
+<P>
+
+<DT><CODE>histreedit</CODE>
+<DD>If set, and Readline
+is being used, a user is given the opportunity to re-edit a
+failed history substitution.
+<P>
+
+<DT><CODE>histverify</CODE>
+<DD>If set, and Readline
+is being used, the results of history substitution are not immediately
+passed to the shell parser.  Instead, the resulting line is loaded into
+the Readline editing buffer, allowing further modification.
+<P>
+
+<DT><CODE>hostcomplete</CODE>
+<DD>If set, and Readline is being used, Bash will attempt to perform
+hostname completion when a word containing a <SAMP>`@'</SAMP> is being
+completed (see section <A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A>).  This option is enabled
+by default.
+<P>
+
+<DT><CODE>huponexit</CODE>
+<DD>If set, Bash will send <CODE>SIGHUP</CODE> to all jobs when an interactive
+login shell exits (see section <A HREF="bashref.html#SEC54">3.7.6 Signals</A>).
+<P>
+
+<DT><CODE>interactive_comments</CODE>
+<DD>Allow a word beginning with <SAMP>`#'</SAMP>
+to cause that word and all remaining characters on that
+line to be ignored in an interactive shell.
+This option is enabled by default.
+<P>
+
+<DT><CODE>lithist</CODE>
+<DD>If enabled, and the <CODE>cmdhist</CODE>
+option is enabled, multi-line commands are saved to the history with
+embedded newlines rather than using semicolon separators where possible.
+<P>
+
+<DT><CODE>login_shell</CODE>
+<DD>The shell sets this option if it is started as a login shell
+(see section <A HREF="bashref.html#SEC65">6.1 Invoking Bash</A>).
+The value may not be changed.
+<P>
+
+<DT><CODE>mailwarn</CODE>
+<DD>If set, and a file that Bash is checking for mail has been  
+accessed since the last time it was checked, the message
+<CODE>"The mail in <VAR>mailfile</VAR> has been read"</CODE> is displayed.
+<P>
+
+<DT><CODE>no_empty_cmd_completion</CODE>
+<DD>If set, and Readline is being used, Bash will not attempt to search
+the <CODE>PATH</CODE> for possible completions when completion is attempted
+on an empty line.
+<P>
+
+<DT><CODE>nocaseglob</CODE>
+<DD>If set, Bash matches filenames in a case-insensitive fashion when
+performing filename expansion.
+<P>
+
+<DT><CODE>nullglob</CODE>
+<DD>If set, Bash allows filename patterns which match no
+files to expand to a null string, rather than themselves.
+<P>
+
+<DT><CODE>progcomp</CODE>
+<DD>If set, the programmable completion facilities
+(see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>) are enabled.
+This option is enabled by default.
+<P>
+
+<DT><CODE>promptvars</CODE>
+<DD>If set, prompt strings undergo
+parameter expansion, command substitution, arithmetic
+expansion, and quote removal after being expanded
+as described below (see section <A HREF="bashref.html#SEC84">6.9 Controlling the Prompt</A>).
+This option is enabled by default.
+<P>
+
+<DT><CODE>restricted_shell</CODE>
+<DD>The shell sets this option if it is started in restricted mode
+(see section <A HREF="bashref.html#SEC85">6.10 The Restricted Shell</A>).
+The value may not be changed.
+This is not reset when the startup files are executed, allowing
+the startup files to discover whether or not a shell is restricted.
+<P>
+
+<DT><CODE>shift_verbose</CODE>
+<DD>If this is set, the <CODE>shift</CODE>
+builtin prints an error message when the shift count exceeds the
+number of positional parameters.
+<P>
+
+<DT><CODE>sourcepath</CODE>
+<DD>If set, the <CODE>source</CODE> builtin uses the value of <CODE>PATH</CODE>
+to find the directory containing the file supplied as an argument.
+This option is enabled by default.
+<P>
+
+<DT><CODE>xpg_echo</CODE>
+<DD>If set, the <CODE>echo</CODE> builtin expands backslash-escape sequences
+by default.
+<P>
+
+</DL>
+<P>
+
+The return status when listing options is zero if all <VAR>optnames</VAR>
+are enabled, non-zero otherwise.
+When setting or unsetting options, the return status is zero unless an
+<VAR>optname</VAR> is not a valid shell option.
+</P><P>
+
+<DT><CODE>source</CODE>
+<DD><A NAME="IDX104"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>source <VAR>filename</VAR>
+</pre></td></tr></table>A synonym for <CODE>.</CODE> (see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>).
+<P>
+
+<DT><CODE>type</CODE>
+<DD><A NAME="IDX105"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>type [-afptP] [<VAR>name</VAR> <small>...</small>]
+</pre></td></tr></table>For each <VAR>name</VAR>, indicate how it would be interpreted if used as a
+command name.
+<P>
+
+If the <SAMP>`-t'</SAMP> option is used, <CODE>type</CODE> prints a single word
+which is one of <SAMP>`alias'</SAMP>, <SAMP>`function'</SAMP>, <SAMP>`builtin'</SAMP>,
+<SAMP>`file'</SAMP> or <SAMP>`keyword'</SAMP>,
+if <VAR>name</VAR> is an alias, shell function, shell builtin,
+disk file, or shell reserved word, respectively.
+If the <VAR>name</VAR> is not found, then nothing is printed, and
+<CODE>type</CODE> returns a failure status.
+</P><P>
+
+If the <SAMP>`-p'</SAMP> option is used, <CODE>type</CODE> either returns the name
+of the disk file that would be executed, or nothing if <SAMP>`-t'</SAMP>
+would not return <SAMP>`file'</SAMP>.
+</P><P>
+
+The <SAMP>`-P'</SAMP> option forces a path search for each <VAR>name</VAR>, even if
+<SAMP>`-t'</SAMP> would not return <SAMP>`file'</SAMP>.
+</P><P>
+
+If a command is hashed, <SAMP>`-p'</SAMP> and <SAMP>`-P'</SAMP> print the hashed value,
+not necessarily the file that appears first in <CODE>$PATH</CODE>.
+</P><P>
+
+If the <SAMP>`-a'</SAMP> option is used, <CODE>type</CODE> returns all of the places
+that contain an executable named <VAR>file</VAR>.
+This includes aliases and functions, if and only if the <SAMP>`-p'</SAMP> option
+is not also used.
+</P><P>
+
+If the <SAMP>`-f'</SAMP> option is used, <CODE>type</CODE> does not attempt to find
+shell functions, as with the <CODE>command</CODE> builtin.
+</P><P>
+
+The return status is zero if any of the <VAR>names</VAR> are found, non-zero
+if none are found.
+</P><P>
+
+<DT><CODE>typeset</CODE>
+<DD><A NAME="IDX106"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>typeset [-afFrxi] [-p] [<VAR>name</VAR>[=<VAR>value</VAR>] <small>...</small>]
+</pre></td></tr></table>The <CODE>typeset</CODE> command is supplied for compatibility with the Korn
+shell; however, it has been deprecated in favor of the <CODE>declare</CODE>
+builtin command.
+<P>
+
+<DT><CODE>ulimit</CODE>
+<DD><A NAME="IDX107"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>ulimit [-acdflmnpstuvSH] [<VAR>limit</VAR>]
+</pre></td></tr></table><CODE>ulimit</CODE> provides control over the resources available to processes
+started by the shell, on systems that allow such control.  If an
+option is given, it is interpreted as follows:
+<DL COMPACT>
+<DT><CODE>-S</CODE>
+<DD>Change and report the soft limit associated with a resource.
+<P>
+
+<DT><CODE>-H</CODE>
+<DD>Change and report the hard limit associated with a resource.
+<P>
+
+<DT><CODE>-a</CODE>
+<DD>All current limits are reported.
+<P>
+
+<DT><CODE>-c</CODE>
+<DD>The maximum size of core files created.
+<P>
+
+<DT><CODE>-d</CODE>
+<DD>The maximum size of a process's data segment.
+<P>
+
+<DT><CODE>-f</CODE>
+<DD>The maximum size of files created by the shell.
+<P>
+
+<DT><CODE>-l</CODE>
+<DD>The maximum size that may be locked into memory.
+<P>
+
+<DT><CODE>-m</CODE>
+<DD>The maximum resident set size.
+<P>
+
+<DT><CODE>-n</CODE>
+<DD>The maximum number of open file descriptors.
+<P>
+
+<DT><CODE>-p</CODE>
+<DD>The pipe buffer size.
+<P>
+
+<DT><CODE>-s</CODE>
+<DD>The maximum stack size.
+<P>
+
+<DT><CODE>-t</CODE>
+<DD>The maximum amount of cpu time in seconds.
+<P>
+
+<DT><CODE>-u</CODE>
+<DD>The maximum number of processes available to a single user.
+<P>
+
+<DT><CODE>-v</CODE>
+<DD>The maximum amount of virtual memory available to the process.
+<P>
+
+</DL>
+<P>
+
+If <VAR>limit</VAR> is given, it is the new value of the specified resource;
+the special <VAR>limit</VAR> values <CODE>hard</CODE>, <CODE>soft</CODE>, and
+<CODE>unlimited</CODE> stand for the current hard limit, the current soft limit,
+and no limit, respectively.
+Otherwise, the current value of the soft limit for the specified resource
+is printed, unless the <SAMP>`-H'</SAMP> option is supplied.
+When setting new limits, if neither <SAMP>`-H'</SAMP> nor <SAMP>`-S'</SAMP> is supplied,
+both the hard and soft limits are set.
+If no option is given, then <SAMP>`-f'</SAMP> is assumed.  Values are in 1024-byte
+increments, except for <SAMP>`-t'</SAMP>, which is in seconds, <SAMP>`-p'</SAMP>,
+which is in units of 512-byte blocks, and <SAMP>`-n'</SAMP> and <SAMP>`-u'</SAMP>, which
+are unscaled values.
+</P><P>
+
+The return status is zero unless an invalid option or argument is supplied,
+or an error occurs while setting a new limit.
+</P><P>
+
+<DT><CODE>unalias</CODE>
+<DD><A NAME="IDX108"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>unalias [-a] [<VAR>name</VAR> <small>...</small> ]
+</pre></td></tr></table><P>
+
+Remove each <VAR>name</VAR> from the list of aliases.  If <SAMP>`-a'</SAMP> is
+supplied, all aliases are removed.
+Aliases are described in <A HREF="bashref.html#SEC80">6.6 Aliases</A>.
+</P><P>
+
+</DL>
+<P>
+
+<A NAME="The Set Builtin"></A>
+<HR SIZE="6">
+<A NAME="SEC59"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC58"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC60"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC60"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.3 The Set Builtin </H2>
+<!--docid::SEC59::-->
+<P>
+
+This builtin is so complicated that it deserves its own section.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>set</CODE>
+<DD><A NAME="IDX109"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set [--abefhkmnptuvxBCHP] [-o <VAR>option</VAR>] [<VAR>argument</VAR> <small>...</small>]
+</pre></td></tr></table><P>
+
+If no options or arguments are supplied, <CODE>set</CODE> displays the names
+and values of all shell variables and functions, sorted according to the
+current locale, in a format that may be reused as input.
+</P><P>
+
+When options are supplied, they set or unset shell attributes.
+Options, if specified, have the following meanings:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>-a</CODE>
+<DD>Mark variables and function which are modified or created for export
+to the environment of subsequent commands.
+<P>
+
+<DT><CODE>-b</CODE>
+<DD>Cause the status of terminated background jobs to be reported
+immediately, rather than before printing the next primary prompt.
+<P>
+
+<DT><CODE>-e</CODE>
+<DD>Exit immediately if a simple command (see section <A HREF="bashref.html#SEC16">3.2.1 Simple Commands</A>) exits
+with a non-zero status, unless the command that fails is part of the
+command list immediately following a <CODE>while</CODE> or <CODE>until</CODE>
+keyword, part of the test in an <CODE>if</CODE> statement,
+part of a <CODE>&#38;&#38;</CODE> or <CODE>||</CODE> list, or if the command's return
+status is being inverted using <CODE>!</CODE>.
+A trap on <CODE>ERR</CODE>, if set, is executed before the shell exits.
+<P>
+
+<DT><CODE>-f</CODE>
+<DD>Disable file name generation (globbing).
+<P>
+
+<DT><CODE>-h</CODE>
+<DD>Locate and remember (hash) commands as they are looked up for execution.
+This option is enabled by default.
+<P>
+
+<DT><CODE>-k</CODE>
+<DD>All arguments in the form of assignment statements are placed
+in the environment for a command, not just those that precede
+the command name.
+<P>
+
+<DT><CODE>-m</CODE>
+<DD>Job control is enabled (see section <A HREF="bashref.html#SEC87">7. Job Control</A>).
+<P>
+
+<DT><CODE>-n</CODE>
+<DD>Read commands but do not execute them; this may be used to check a
+script for syntax errors.
+This option is ignored by interactive shells.
+<P>
+
+<DT><CODE>-o <VAR>option-name</VAR></CODE>
+<DD><P>
+
+Set the option corresponding to <VAR>option-name</VAR>:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>allexport</CODE>
+<DD>Same as <CODE>-a</CODE>.
+<P>
+
+<DT><CODE>braceexpand</CODE>
+<DD>Same as <CODE>-B</CODE>.
+<P>
+
+<DT><CODE>emacs</CODE>
+<DD>Use an <CODE>emacs</CODE>-style line editing interface (see section <A HREF="bashref.html#SEC91">8. Command Line Editing</A>).
+<P>
+
+<DT><CODE>errexit</CODE>
+<DD>Same as <CODE>-e</CODE>.
+<P>
+
+<DT><CODE>errtrace</CODE>
+<DD>Same as <CODE>-E</CODE>.
+<P>
+
+<DT><CODE>functrace</CODE>
+<DD>Same as <CODE>-T</CODE>.
+<P>
+
+<DT><CODE>hashall</CODE>
+<DD>Same as <CODE>-h</CODE>.
+<P>
+
+<DT><CODE>histexpand</CODE>
+<DD>Same as <CODE>-H</CODE>.
+<P>
+
+<DT><CODE>history</CODE>
+<DD>Enable command history, as described in <A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A>.
+This option is on by default in interactive shells.
+<P>
+
+<DT><CODE>ignoreeof</CODE>
+<DD>An interactive shell will not exit upon reading EOF.
+<P>
+
+<DT><CODE>keyword</CODE>
+<DD>Same as <CODE>-k</CODE>.
+<P>
+
+<DT><CODE>monitor</CODE>
+<DD>Same as <CODE>-m</CODE>.
+<P>
+
+<DT><CODE>noclobber</CODE>
+<DD>Same as <CODE>-C</CODE>.
+<P>
+
+<DT><CODE>noexec</CODE>
+<DD>Same as <CODE>-n</CODE>.
+<P>
+
+<DT><CODE>noglob</CODE>
+<DD>Same as <CODE>-f</CODE>.
+<P>
+
+<DT><CODE>nolog</CODE>
+<DD>Currently ignored.
+<P>
+
+<DT><CODE>notify</CODE>
+<DD>Same as <CODE>-b</CODE>.
+<P>
+
+<DT><CODE>nounset</CODE>
+<DD>Same as <CODE>-u</CODE>.
+<P>
+
+<DT><CODE>onecmd</CODE>
+<DD>Same as <CODE>-t</CODE>.
+<P>
+
+<DT><CODE>physical</CODE>
+<DD>Same as <CODE>-P</CODE>.
+<P>
+
+<DT><CODE>pipefail</CODE>
+<DD>If set, the return value of a pipeline is the value of the last
+(rightmost) command to exit with a non-zero status, or zero if all
+commands in the pipeline exit successfully.
+This option is disabled by default.
+<P>
+
+<DT><CODE>posix</CODE>
+<DD>Change the behavior of Bash where the default operation differs
+from the POSIX 1003.2 standard to match the standard
+(see section <A HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A>).
+This is intended to make Bash behave as a strict superset of that
+standard.
+<P>
+
+<DT><CODE>privileged</CODE>
+<DD>Same as <CODE>-p</CODE>.
+<P>
+
+<DT><CODE>verbose</CODE>
+<DD>Same as <CODE>-v</CODE>.
+<P>
+
+<DT><CODE>vi</CODE>
+<DD>Use a <CODE>vi</CODE>-style line editing interface.
+<P>
+
+<DT><CODE>xtrace</CODE>
+<DD>Same as <CODE>-x</CODE>.
+</DL>
+<P>
+
+<DT><CODE>-p</CODE>
+<DD>Turn on privileged mode.
+In this mode, the <CODE>$BASH_ENV</CODE> and <CODE>$ENV</CODE> files are not
+processed, shell functions are not inherited from the environment,
+and the <CODE>SHELLOPTS</CODE> variable, if it appears in the environment,
+is ignored.
+If the shell is started with the effective user (group) id not equal to the
+real user (group) id, and the <CODE>-p</CODE> option is not supplied, these actions
+are taken and the effective user id is set to the real user id.
+If the <CODE>-p</CODE> option is supplied at startup, the effective user id is
+not reset.
+Turning this option off causes the effective user
+and group ids to be set to the real user and group ids.
+<P>
+
+<DT><CODE>-t</CODE>
+<DD>Exit after reading and executing one command.
+<P>
+
+<DT><CODE>-u</CODE>
+<DD>Treat unset variables as an error when performing parameter expansion.
+An error message will be written to the standard error, and a non-interactive
+shell will exit.
+<P>
+
+<DT><CODE>-v</CODE>
+<DD>Print shell input lines as they are read.
+<P>
+
+<DT><CODE>-x</CODE>
+<DD>Print a trace of simple commands, \fBfor\fP commands, \fBcase\fP
+commands, \fBselect\fP commands, and arithmetic \fBfor\fP commands
+and their arguments or associated word lists after they are
+expanded and before they are executed.  The value of the <CODE>PS4</CODE>
+variable is expanded and the resultant value is printed before
+the command and its expanded arguments.
+<P>
+
+<DT><CODE>-B</CODE>
+<DD>The shell will perform brace expansion (see section <A HREF="bashref.html#SEC28">3.5.1 Brace Expansion</A>).
+This option is on by default.
+<P>
+
+<DT><CODE>-C</CODE>
+<DD>Prevent output redirection using <SAMP>`&#62;'</SAMP>, <SAMP>`&#62;&#38;'</SAMP>, and <SAMP>`&#60;&#62;'</SAMP>
+from overwriting existing files.
+<P>
+
+<DT><CODE>-E</CODE>
+<DD>If set, any trap on <CODE>ERR</CODE> is inherited by shell functions, command
+substitutions, and commands executed in a subshell environment.
+The <CODE>ERR</CODE> trap is normally not inherited in such cases.
+<P>
+
+<DT><CODE>-H</CODE>
+<DD>Enable <SAMP>`!'</SAMP> style history substitution (see section <A HREF="bashref.html#SEC118">9.3 History Expansion</A>).
+This option is on by default for interactive shells.
+<P>
+
+<DT><CODE>-P</CODE>
+<DD>If set, do not follow symbolic links when performing commands such as
+<CODE>cd</CODE> which change the current directory.  The physical directory
+is used instead.  By default, Bash follows
+the logical chain of directories when performing commands
+which change the current directory.
+<P>
+
+For example, if <TT>`/usr/sys'</TT> is a symbolic link to <TT>`/usr/local/sys'</TT>
+then:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$ cd /usr/sys; echo $PWD
+/usr/sys
+$ cd ..; pwd
+/usr
+</pre></td></tr></table></P><P>
+
+If <CODE>set -P</CODE> is on, then:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$ cd /usr/sys; echo $PWD
+/usr/local/sys
+$ cd ..; pwd
+/usr/local
+</pre></td></tr></table></P><P>
+
+<DT><CODE>-T</CODE>
+<DD>If set, any trap on <CODE>DEBUG</CODE> is inherited by shell functions, command
+substitutions, and commands executed in a subshell environment.
+The <CODE>DEBUG</CODE> trap is normally not inherited in such cases.
+<P>
+
+<DT><CODE>--</CODE>
+<DD>If no arguments follow this option, then the positional parameters are
+unset.  Otherwise, the positional parameters are set to the
+<VAR>arguments</VAR>, even if some of them begin with a <SAMP>`-'</SAMP>.
+<P>
+
+<DT><CODE>-</CODE>
+<DD>Signal the end of options, cause all remaining <VAR>arguments</VAR>
+to be assigned to the positional parameters.  The <SAMP>`-x'</SAMP>
+and <SAMP>`-v'</SAMP>  options are turned off.
+If there are no arguments, the positional parameters remain unchanged.
+</DL>
+<P>
+
+Using <SAMP>`+'</SAMP> rather than <SAMP>`-'</SAMP> causes these options to be
+turned off.  The options can also be used upon invocation of the
+shell.  The current set of options may be found in <CODE>$-</CODE>.
+</P><P>
+
+The remaining N <VAR>arguments</VAR> are positional parameters and are
+assigned, in order, to <CODE>$1</CODE>, <CODE>$2</CODE>, <small>...</small>  <CODE>$N</CODE>.
+The special parameter <CODE>#</CODE> is set to N.
+</P><P>
+
+The return status is always zero unless an invalid option is supplied.
+</DL>
+<P>
+
+<A NAME="Special Builtins"></A>
+<HR SIZE="6">
+<A NAME="SEC60"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC59"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC56"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.4 Special Builtins </H2>
+<!--docid::SEC60::-->
+<P>
+
+For historical reasons, the POSIX 1003.2 standard has classified
+several builtin commands as <EM>special</EM>.
+When Bash is executing in POSIX mode, the special builtins
+differ from other builtin commands in three respects:
+</P><P>
+
+<OL>
+<LI>
+Special builtins are found before shell functions during command lookup.
+<P>
+
+<LI>
+If a special builtin returns an error status, a non-interactive shell exits.
+<P>
+
+<LI>
+Assignment statements preceding the command stay in effect in the shell
+environment after the command completes.
+</OL>
+<P>
+
+When Bash is not executing in POSIX mode, these builtins behave no
+differently than the rest of the Bash builtin commands.
+The Bash POSIX mode is described in <A HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A>. 
+</P><P>
+
+These are the POSIX special builtins:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>break : . continue eval exec exit export readonly return set
+shift trap unset
+</pre></td></tr></table></P><P>
+
+<A NAME="Shell Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC61"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC60"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC62"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 5. Shell Variables </H1>
+<!--docid::SEC61::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables which Bash uses in the same way
+                               as the Bourne Shell.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">List of variables that exist in Bash.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+This chapter describes the shell variables that Bash uses.
+Bash automatically assigns default values to a number of variables.
+</P><P>
+
+<A NAME="Bourne Shell Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC62"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC63"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 5.1 Bourne Shell Variables </H2>
+<!--docid::SEC62::-->
+<P>
+
+Bash uses certain shell variables in the same way as the Bourne shell.
+In some cases, Bash assigns a default value to the variable.
+</P><P>
+
+<DL COMPACT>
+
+<A NAME="IDX110"></A>
+<DT><CODE>CDPATH</CODE>
+<DD><A NAME="IDX111"></A>
+A colon-separated list of directories used as a search path for
+the <CODE>cd</CODE> builtin command.
+<P>
+
+<A NAME="IDX112"></A>
+<DT><CODE>HOME</CODE>
+<DD><A NAME="IDX113"></A>
+The current user's home directory; the default for the <CODE>cd</CODE> builtin
+command.
+The value of this variable is also used by tilde expansion
+(see section <A HREF="bashref.html#SEC29">3.5.2 Tilde Expansion</A>).
+<P>
+
+<A NAME="IDX114"></A>
+<DT><CODE>IFS</CODE>
+<DD><A NAME="IDX115"></A>
+A list of characters that separate fields; used when the shell splits
+words as part of expansion.
+<P>
+
+<A NAME="IDX116"></A>
+<DT><CODE>MAIL</CODE>
+<DD><A NAME="IDX117"></A>
+If this parameter is set to a filename and the <CODE>MAILPATH</CODE> variable
+is not set, Bash informs the user of the arrival of mail in
+the specified file.
+<P>
+
+<A NAME="IDX118"></A>
+<DT><CODE>MAILPATH</CODE>
+<DD><A NAME="IDX119"></A>
+A colon-separated list of filenames which the shell periodically checks
+for new mail.
+Each list entry can specify the message that is printed when new mail
+arrives in the mail file by separating the file name from the message with
+a <SAMP>`?'</SAMP>.
+When used in the text of the message, <CODE>$_</CODE> expands to the name of
+the current mail file.
+<P>
+
+<A NAME="IDX120"></A>
+<DT><CODE>OPTARG</CODE>
+<DD><A NAME="IDX121"></A>
+The value of the last option argument processed by the <CODE>getopts</CODE> builtin.
+<P>
+
+<A NAME="IDX122"></A>
+<DT><CODE>OPTIND</CODE>
+<DD><A NAME="IDX123"></A>
+The index of the last option argument processed by the <CODE>getopts</CODE> builtin.
+<P>
+
+<A NAME="IDX124"></A>
+<DT><CODE>PATH</CODE>
+<DD><A NAME="IDX125"></A>
+A colon-separated list of directories in which the shell looks for
+commands.
+A zero-length (null) directory name in the value of <CODE>PATH</CODE> indicates the
+current directory.
+A null directory name may appear as two adjacent colons, or as an initial
+or trailing colon.
+<P>
+
+<A NAME="IDX126"></A>
+<DT><CODE>PS1</CODE>
+<DD><A NAME="IDX127"></A>
+The primary prompt string.  The default value is <SAMP>`\s-\v\$ '</SAMP>.
+See section <A HREF="bashref.html#SEC84">6.9 Controlling the Prompt</A>, for the complete list of escape
+sequences that are expanded before <CODE>PS1</CODE> is displayed.
+<P>
+
+<A NAME="IDX128"></A>
+<DT><CODE>PS2</CODE>
+<DD><A NAME="IDX129"></A>
+The secondary prompt string.  The default value is <SAMP>`&#62; '</SAMP>.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Bash Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC63"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC62"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 5.2 Bash Variables </H2>
+<!--docid::SEC63::-->
+<P>
+
+These variables are set or used by Bash, but other shells
+do not normally treat them specially.
+</P><P>
+
+A few variables used by Bash are described in different chapters:
+variables for controlling the job control facilities
+(see section <A HREF="bashref.html#SEC90">7.3 Job Control Variables</A>).
+</P><P>
+
+<DL COMPACT>
+
+<A NAME="IDX130"></A>
+<DT><CODE>BASH</CODE>
+<DD><A NAME="IDX131"></A>
+The full pathname used to execute the current instance of Bash.
+<P>
+
+<A NAME="IDX132"></A>
+<DT><CODE>BASH_ARGC</CODE>
+<DD><A NAME="IDX133"></A>
+An array variable whose values are the number of parameters in each
+frame of the current bash execution call stack.  The number of
+parameters to the current subroutine (shell function or script executed
+with <CODE>.</CODE> or <CODE>source</CODE>) is at the top of the stack.  When a
+subroutine is executed, the number of parameters passed is pushed onto
+<CODE>BASH_ARGC</CODE>.
+<P>
+
+<A NAME="IDX134"></A>
+<DT><CODE>BASH_ARGV</CODE>
+<DD><A NAME="IDX135"></A>
+An array variable containing all of the parameters in the current bash
+execution call stack.  The final parameter of the last subroutine call
+is at the top of the stack; the first parameter of the initial call is
+at the bottom.  When a subroutine is executed, the parameters supplied
+are pushed onto <CODE>BASH_ARGV</CODE>.
+<P>
+
+<A NAME="IDX136"></A>
+<DT><CODE>BASH_COMMAND</CODE>
+<DD><A NAME="IDX137"></A>
+The command currently being executed or about to be executed, unless the
+shell is executing a command as the result of a trap,
+in which case it is the command executing at the time of the trap.
+<P>
+
+<A NAME="IDX138"></A>
+<DT><CODE>BASH_ENV</CODE>
+<DD><A NAME="IDX139"></A>
+If this variable is set when Bash is invoked to execute a shell
+script, its value is expanded and used as the name of a startup file
+to read before executing the script.  See section <A HREF="bashref.html#SEC66">6.2 Bash Startup Files</A>.
+<P>
+
+<A NAME="IDX140"></A>
+<DT><CODE>BASH_EXECUTION_STRING</CODE>
+<DD><A NAME="IDX141"></A>
+The command argument to the <SAMP>`-c'</SAMP> invocation option.
+<P>
+
+<A NAME="IDX142"></A>
+<DT><CODE>BASH_LINENO</CODE>
+<DD><A NAME="IDX143"></A>
+An array variable whose members are the line numbers in source files
+corresponding to each member of <VAR>FUNCNAME</VAR>.
+<CODE>${BASH_LINENO[$i]}</CODE> is the line number in the source file where
+<CODE>${FUNCNAME[$i + 1]}</CODE> was called.
+The corresponding source file name is <CODE>${BASH_SOURCE[$i + 1]}</CODE>.
+Use <CODE>LINENO</CODE> to obtain the current line number.
+<P>
+
+<A NAME="IDX144"></A>
+<DT><CODE>BASH_REMATCH</CODE>
+<DD><A NAME="IDX145"></A>
+An array variable whose members are assigned by the <SAMP>`=~'</SAMP> binary
+operator to the <CODE>[[</CODE> conditional command
+(see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>).
+The element with index 0 is the portion of the string
+matching the entire regular expression.
+The element with index <VAR>n</VAR> is the portion of the
+string matching the <VAR>n</VAR>th parenthesized subexpression.
+This variable is read-only.
+<P>
+
+<A NAME="IDX146"></A>
+<DT><CODE>BASH_SOURCE</CODE>
+<DD><A NAME="IDX147"></A>
+An array variable whose members are the source filenames corresponding
+to the elements in the <CODE>FUNCNAME</CODE> array variable.
+<P>
+
+<A NAME="IDX148"></A>
+<DT><CODE>BASH_SUBSHELL</CODE>
+<DD><A NAME="IDX149"></A>
+Incremented by one each time a subshell or subshell environment is spawned.
+The initial value is 0.
+<P>
+
+<A NAME="IDX150"></A>
+<DT><CODE>BASH_VERSINFO</CODE>
+<DD><A NAME="IDX151"></A>
+A readonly array variable (see section <A HREF="bashref.html#SEC81">6.7 Arrays</A>)
+whose members hold version information for this instance of Bash.
+The values assigned to the array members are as follows:
+<P>
+
+<DL COMPACT>
+
+<DT><CODE>BASH_VERSINFO[0]</CODE>
+<DD>The major version number (the <VAR>release</VAR>).
+<P>
+
+<DT><CODE>BASH_VERSINFO[1]</CODE>
+<DD>The minor version number (the <VAR>version</VAR>).
+<P>
+
+<DT><CODE>BASH_VERSINFO[2]</CODE>
+<DD>The patch level.
+<P>
+
+<DT><CODE>BASH_VERSINFO[3]</CODE>
+<DD>The build version.
+<P>
+
+<DT><CODE>BASH_VERSINFO[4]</CODE>
+<DD>The release status (e.g., <VAR>beta1</VAR>).
+<P>
+
+<DT><CODE>BASH_VERSINFO[5]</CODE>
+<DD>The value of <CODE>MACHTYPE</CODE>.
+<P>
+
+</DL>
+<P>
+
+<A NAME="IDX152"></A>
+<DT><CODE>BASH_VERSION</CODE>
+<DD><A NAME="IDX153"></A>
+The version number of the current instance of Bash.
+<P>
+
+<A NAME="IDX154"></A>
+<DT><CODE>COLUMNS</CODE>
+<DD><A NAME="IDX155"></A>
+Used by the <CODE>select</CODE> builtin command to determine the terminal width
+when printing selection lists.  Automatically set upon receipt of a
+<CODE>SIGWINCH</CODE>.
+<P>
+
+<A NAME="IDX156"></A>
+<DT><CODE>COMP_CWORD</CODE>
+<DD><A NAME="IDX157"></A>
+An index into <CODE>${COMP_WORDS}</CODE> of the word containing the current
+cursor position.
+This variable is available only in shell functions invoked by the
+programmable completion facilities (see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>).
+<P>
+
+<A NAME="IDX158"></A>
+<DT><CODE>COMP_LINE</CODE>
+<DD><A NAME="IDX159"></A>
+The current command line.
+This variable is available only in shell functions and external
+commands invoked by the
+programmable completion facilities (see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>).
+<P>
+
+<A NAME="IDX160"></A>
+<DT><CODE>COMP_POINT</CODE>
+<DD><A NAME="IDX161"></A>
+The index of the current cursor position relative to the beginning of
+the current command.
+If the current cursor position is at the end of the current command,
+the value of this variable is equal to <CODE>${#COMP_LINE}</CODE>.
+This variable is available only in shell functions and external
+commands invoked by the
+programmable completion facilities (see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>).
+<P>
+
+<A NAME="IDX162"></A>
+<DT><CODE>COMP_WORDBREAKS</CODE>
+<DD><A NAME="IDX163"></A>
+The set of characters that the Readline library treats as word
+separators when performing word completion.
+If <CODE>COMP_WORDBREAKS</CODE> is unset, it loses its special properties,
+even if it is subsequently reset.
+<P>
+
+<A NAME="IDX164"></A>
+<DT><CODE>COMP_WORDS</CODE>
+<DD><A NAME="IDX165"></A>
+An array variable consisting of the individual
+words in the current command line.
+This variable is available only in shell functions invoked by the
+programmable completion facilities (see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>).
+<P>
+
+<A NAME="IDX166"></A>
+<DT><CODE>COMPREPLY</CODE>
+<DD><A NAME="IDX167"></A>
+An array variable from which Bash reads the possible completions
+generated by a shell function invoked by the programmable completion
+facility (see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>).
+<P>
+
+<A NAME="IDX168"></A>
+<DT><CODE>DIRSTACK</CODE>
+<DD><A NAME="IDX169"></A>
+An array variable containing the current contents of the directory stack.
+Directories appear in the stack in the order they are displayed by the
+<CODE>dirs</CODE> builtin.
+Assigning to members of this array variable may be used to modify
+directories already in the stack, but the <CODE>pushd</CODE> and <CODE>popd</CODE>
+builtins must be used to add and remove directories.
+Assignment to this variable will not change the current directory.
+If <CODE>DIRSTACK</CODE> is unset, it loses its special properties, even if
+it is subsequently reset.
+<P>
+
+<A NAME="IDX170"></A>
+<DT><CODE>EMACS</CODE>
+<DD><A NAME="IDX171"></A>
+If Bash finds this variable in the environment when the shell
+starts with value <SAMP>`t'</SAMP>, it assumes that the shell is running in an
+emacs shell buffer and disables line editing.
+<P>
+
+<A NAME="IDX172"></A>
+<DT><CODE>EUID</CODE>
+<DD><A NAME="IDX173"></A>
+The numeric effective user id of the current user.  This variable
+is readonly.
+<P>
+
+<A NAME="IDX174"></A>
+<DT><CODE>FCEDIT</CODE>
+<DD><A NAME="IDX175"></A>
+The editor used as a default by the <SAMP>`-e'</SAMP> option to the <CODE>fc</CODE>
+builtin command.
+<P>
+
+<A NAME="IDX176"></A>
+<DT><CODE>FIGNORE</CODE>
+<DD><A NAME="IDX177"></A>
+A colon-separated list of suffixes to ignore when performing
+filename completion.
+A file name whose suffix matches one of the entries in 
+<CODE>FIGNORE</CODE>
+is excluded from the list of matched file names.  A sample
+value is <SAMP>`.o:~'</SAMP>
+<P>
+
+<A NAME="IDX178"></A>
+<DT><CODE>FUNCNAME</CODE>
+<DD><A NAME="IDX179"></A>
+An array variable containing the names of all shell functions
+currently in the execution call stack.
+The element with index 0 is the name of any currently-executing
+shell function.
+The bottom-most element is "main".
+This variable exists only when a shell function is executing.
+Assignments to <CODE>FUNCNAME</CODE> have no effect and return an error status.
+If <CODE>FUNCNAME</CODE> is unset, it loses its special properties, even if
+it is subsequently reset.
+<P>
+
+<A NAME="IDX180"></A>
+<DT><CODE>GLOBIGNORE</CODE>
+<DD><A NAME="IDX181"></A>
+A colon-separated list of patterns defining the set of filenames to
+be ignored by filename expansion.
+If a filename matched by a filename expansion pattern also matches one
+of the patterns in <CODE>GLOBIGNORE</CODE>, it is removed from the list
+of matches.
+<P>
+
+<A NAME="IDX182"></A>
+<DT><CODE>GROUPS</CODE>
+<DD><A NAME="IDX183"></A>
+An array variable containing the list of groups of which the current    
+user is a member.
+Assignments to <CODE>GROUPS</CODE> have no effect and return an error status.
+If <CODE>GROUPS</CODE> is unset, it loses its special properties, even if it is
+subsequently reset.
+<P>
+
+<A NAME="IDX184"></A>
+<DT><CODE>histchars</CODE>
+<DD><A NAME="IDX185"></A>
+Up to three characters which control history expansion, quick
+substitution, and tokenization (see section <A HREF="bashref.html#SEC118">9.3 History Expansion</A>).
+The first character is the
+<VAR>history expansion</VAR> character, that is, the character which signifies the
+start of a history expansion, normally <SAMP>`!'</SAMP>.  The second character is the
+character which signifies `quick substitution' when seen as the first
+character on a line, normally <SAMP>`^'</SAMP>.  The optional third character is the
+character which indicates that the remainder of the line is a comment when
+found as the first character of a word, usually <SAMP>`#'</SAMP>.  The history
+comment character causes history substitution to be skipped for the
+remaining words on the line.  It does not necessarily cause the shell
+parser to treat the rest of the line as a comment.
+<P>
+
+<A NAME="IDX186"></A>
+<DT><CODE>HISTCMD</CODE>
+<DD><A NAME="IDX187"></A>
+The history number, or index in the history list, of the current
+command.  If <CODE>HISTCMD</CODE> is unset, it loses its special properties,
+even if it is subsequently reset.
+<P>
+
+<A NAME="IDX188"></A>
+<DT><CODE>HISTCONTROL</CODE>
+<DD><A NAME="IDX189"></A>
+A colon-separated list of values controlling how commands are saved on
+the history list.
+If the list of values includes <SAMP>`ignorespace'</SAMP>, lines which begin
+with a space character are not saved in the history list.
+A value of <SAMP>`ignoredups'</SAMP> causes lines which match the previous
+history entry to not be saved.
+A value of <SAMP>`ignoreboth'</SAMP> is shorthand for
+<SAMP>`ignorespace'</SAMP> and <SAMP>`ignoredups'</SAMP>.
+A value of <SAMP>`erasedups'</SAMP> causes all previous lines matching the
+current line to be removed from the history list before that line
+is saved.
+Any value not in the above list is ignored.
+If <CODE>HISTCONTROL</CODE> is unset, or does not include a valid value, 
+all lines read by the shell parser are saved on the history list, 
+subject to the value of <CODE>HISTIGNORE</CODE>.
+The second and subsequent lines of a multi-line compound command are
+not tested, and are added to the history regardless of the value of
+<CODE>HISTCONTROL</CODE>.
+<P>
+
+<A NAME="IDX190"></A>
+<DT><CODE>HISTFILE</CODE>
+<DD><A NAME="IDX191"></A>
+The name of the file to which the command history is saved.  The
+default value is <TT>`~/.bash_history'</TT>.
+<P>
+
+<A NAME="IDX192"></A>
+<DT><CODE>HISTFILESIZE</CODE>
+<DD><A NAME="IDX193"></A>
+The maximum number of lines contained in the history file.  When this
+variable is assigned a value, the history file is truncated, if
+necessary, to contain no more than that number of lines.
+The history file is also truncated to this size after
+writing it when an interactive shell exits.
+The default value is 500.
+<P>
+
+<A NAME="IDX194"></A>
+<DT><CODE>HISTIGNORE</CODE>
+<DD><A NAME="IDX195"></A>
+A colon-separated list of patterns used to decide which command
+lines should be saved on the history list.  Each pattern is
+anchored at the beginning of the line and must match the complete
+line (no implicit <SAMP>`*'</SAMP> is appended).  Each pattern is tested
+against the line after the checks specified by <CODE>HISTCONTROL</CODE>
+are applied.  In addition to the normal shell pattern matching
+characters, <SAMP>`&#38;'</SAMP> matches the previous history line.  <SAMP>`&#38;'</SAMP>
+may be escaped using a backslash; the backslash is removed
+before attempting a match. 
+The second and subsequent lines of a multi-line compound command are
+not tested, and are added to the history regardless of the value of
+<CODE>HISTIGNORE</CODE>.
+<P>
+
+<CODE>HISTIGNORE</CODE> subsumes the function of <CODE>HISTCONTROL</CODE>.  A
+pattern of <SAMP>`&#38;'</SAMP> is identical to <CODE>ignoredups</CODE>, and a
+pattern of <SAMP>`[ ]*'</SAMP> is identical to <CODE>ignorespace</CODE>. 
+Combining these two patterns, separating them with a colon,
+provides the functionality of <CODE>ignoreboth</CODE>. 
+</P><P>
+
+<A NAME="IDX196"></A>
+<DT><CODE>HISTSIZE</CODE>
+<DD><A NAME="IDX197"></A>
+The maximum number of commands to remember on the history list.
+The default value is 500.
+<P>
+
+<A NAME="IDX198"></A>
+<DT><CODE>HISTTIMEFORMAT</CODE>
+<DD><A NAME="IDX199"></A>
+If this variable is set and not null, its value is used as a format string
+for <VAR>strftime</VAR> to print the time stamp associated with each history
+entry displayed by the <CODE>history</CODE> builtin.
+If this variable is set, time stamps are written to the history file so
+they may be preserved across shell sessions.
+<P>
+
+<A NAME="IDX200"></A>
+<DT><CODE>HOSTFILE</CODE>
+<DD><A NAME="IDX201"></A>
+Contains the name of a file in the same format as <TT>`/etc/hosts'</TT> that
+should be read when the shell needs to complete a hostname.
+The list of possible hostname completions may be changed while the shell
+is running;
+the next time hostname completion is attempted after the
+value is changed, Bash adds the contents of the new file to the
+existing list.
+If <CODE>HOSTFILE</CODE> is set, but has no value, Bash attempts to read 
+<TT>`/etc/hosts'</TT> to obtain the list of possible hostname completions.
+When <CODE>HOSTFILE</CODE> is unset, the hostname list is cleared.
+<P>
+
+<A NAME="IDX202"></A>
+<DT><CODE>HOSTNAME</CODE>
+<DD><A NAME="IDX203"></A>
+The name of the current host.
+<P>
+
+<A NAME="IDX204"></A>
+<DT><CODE>HOSTTYPE</CODE>
+<DD><A NAME="IDX205"></A>
+A string describing the machine Bash is running on.
+<P>
+
+<A NAME="IDX206"></A>
+<DT><CODE>IGNOREEOF</CODE>
+<DD><A NAME="IDX207"></A>
+Controls the action of the shell on receipt of an <CODE>EOF</CODE> character
+as the sole input.  If set, the value denotes the number
+of consecutive <CODE>EOF</CODE> characters that can be read as the
+first character on an input line
+before the shell will exit.  If the variable exists but does not
+have a numeric value (or has no value) then the default is 10.
+If the variable does not exist, then <CODE>EOF</CODE> signifies the end of 
+input to the shell.  This is only in effect for interactive shells.
+<P>
+
+<A NAME="IDX208"></A>
+<DT><CODE>INPUTRC</CODE>
+<DD><A NAME="IDX209"></A>
+The name of the Readline initialization file, overriding the default
+of <TT>`~/.inputrc'</TT>.
+<P>
+
+<A NAME="IDX210"></A>
+<DT><CODE>LANG</CODE>
+<DD><A NAME="IDX211"></A>
+Used to determine the locale category for any category not specifically
+selected with a variable starting with <CODE>LC_</CODE>.
+<P>
+
+<A NAME="IDX212"></A>
+<DT><CODE>LC_ALL</CODE>
+<DD><A NAME="IDX213"></A>
+This variable overrides the value of <CODE>LANG</CODE> and any other
+<CODE>LC_</CODE> variable specifying a locale category.
+<P>
+
+<A NAME="IDX214"></A>
+<DT><CODE>LC_COLLATE</CODE>
+<DD><A NAME="IDX215"></A>
+This variable determines the collation order used when sorting the
+results of filename expansion, and
+determines the behavior of range expressions, equivalence classes,
+and collating sequences within filename expansion and pattern matching
+(see section <A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A>).
+<P>
+
+<A NAME="IDX216"></A>
+<DT><CODE>LC_CTYPE</CODE>
+<DD><A NAME="IDX217"></A>
+This variable determines the interpretation of characters and the
+behavior of character classes within filename expansion and pattern
+matching (see section <A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A>).
+<P>
+
+<A NAME="IDX218"></A>
+<DT><CODE>LC_MESSAGES</CODE>
+<DD><A NAME="IDX219"></A>
+This variable determines the locale used to translate double-quoted
+strings preceded by a <SAMP>`$'</SAMP> (see section <A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A>).
+<P>
+
+<A NAME="IDX220"></A>
+<DT><CODE>LC_NUMERIC</CODE>
+<DD><A NAME="IDX221"></A>
+This variable determines the locale category used for number formatting.
+<P>
+
+<A NAME="IDX222"></A>
+<DT><CODE>LINENO</CODE>
+<DD><A NAME="IDX223"></A>
+The line number in the script or shell function currently executing.
+<P>
+
+<A NAME="IDX224"></A>
+<DT><CODE>LINES</CODE>
+<DD><A NAME="IDX225"></A>
+Used by the <CODE>select</CODE> builtin command to determine the column length
+for printing selection lists.  Automatically set upon receipt of a
+<CODE>SIGWINCH</CODE>.
+<P>
+
+<A NAME="IDX226"></A>
+<DT><CODE>MACHTYPE</CODE>
+<DD><A NAME="IDX227"></A>
+A string that fully describes the system type on which Bash
+is executing, in the standard GNU <VAR>cpu-company-system</VAR> format.
+<P>
+
+<A NAME="IDX228"></A>
+<DT><CODE>MAILCHECK</CODE>
+<DD><A NAME="IDX229"></A>
+How often (in seconds) that the shell should check for mail in the
+files specified in the <CODE>MAILPATH</CODE> or <CODE>MAIL</CODE> variables.
+The default is 60 seconds.  When it is time to check
+for mail, the shell does so before displaying the primary prompt.
+If this variable is unset, or set to a value that is not a number
+greater than or equal to zero, the shell disables mail checking.
+<P>
+
+<A NAME="IDX230"></A>
+<DT><CODE>OLDPWD</CODE>
+<DD><A NAME="IDX231"></A>
+The previous working directory as set by the <CODE>cd</CODE> builtin.
+<P>
+
+<A NAME="IDX232"></A>
+<DT><CODE>OPTERR</CODE>
+<DD><A NAME="IDX233"></A>
+If set to the value 1, Bash displays error messages
+generated by the <CODE>getopts</CODE> builtin command.
+<P>
+
+<A NAME="IDX234"></A>
+<DT><CODE>OSTYPE</CODE>
+<DD><A NAME="IDX235"></A>
+A string describing the operating system Bash is running on.
+<P>
+
+<A NAME="IDX236"></A>
+<DT><CODE>PIPESTATUS</CODE>
+<DD><A NAME="IDX237"></A>
+An array variable (see section <A HREF="bashref.html#SEC81">6.7 Arrays</A>)
+containing a list of exit status values from the processes
+in the most-recently-executed foreground pipeline (which may
+contain only a single command).
+<P>
+
+<A NAME="IDX238"></A>
+<DT><CODE>POSIXLY_CORRECT</CODE>
+<DD><A NAME="IDX239"></A>
+If this variable is in the environment when <CODE>bash</CODE> starts, the shell
+enters POSIX mode (see section <A HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A>) before reading the
+startup files, as if the <SAMP>`--posix'</SAMP> invocation option had been supplied.
+If it is set while the shell is running, <CODE>bash</CODE> enables POSIX mode,
+as if the command
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>set -o posix</CODE>
+</pre></td></tr></table>had been executed.  
+<P>
+
+<A NAME="IDX240"></A>
+<DT><CODE>PPID</CODE>
+<DD><A NAME="IDX241"></A>
+The process ID of the shell's parent process.  This variable
+is readonly.
+<P>
+
+<A NAME="IDX242"></A>
+<DT><CODE>PROMPT_COMMAND</CODE>
+<DD><A NAME="IDX243"></A>
+If set, the value is interpreted as a command to execute
+before the printing of each primary prompt (<CODE>$PS1</CODE>).
+<P>
+
+<A NAME="IDX244"></A>
+<DT><CODE>PS3</CODE>
+<DD><A NAME="IDX245"></A>
+The value of this variable is used as the prompt for the
+<CODE>select</CODE> command.  If this variable is not set, the
+<CODE>select</CODE> command prompts with <SAMP>`#? '</SAMP>
+<P>
+
+<A NAME="IDX246"></A>
+<DT><CODE>PS4</CODE>
+<DD><A NAME="IDX247"></A>
+The value is the prompt printed before the command line is echoed
+when the <SAMP>`-x'</SAMP> option is set (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+The first character of <CODE>PS4</CODE> is replicated multiple times, as
+necessary, to indicate multiple levels of indirection.
+The default is <SAMP>`+ '</SAMP>.
+<P>
+
+<A NAME="IDX248"></A>
+<DT><CODE>PWD</CODE>
+<DD><A NAME="IDX249"></A>
+The current working directory as set by the <CODE>cd</CODE> builtin.
+<P>
+
+<A NAME="IDX250"></A>
+<DT><CODE>RANDOM</CODE>
+<DD><A NAME="IDX251"></A>
+Each time this parameter is referenced, a random integer
+between 0 and 32767 is generated.  Assigning a value to this
+variable seeds the random number generator.
+<P>
+
+<A NAME="IDX252"></A>
+<DT><CODE>REPLY</CODE>
+<DD><A NAME="IDX253"></A>
+The default variable for the <CODE>read</CODE> builtin.
+<P>
+
+<A NAME="IDX254"></A>
+<DT><CODE>SECONDS</CODE>
+<DD><A NAME="IDX255"></A>
+This variable expands to the number of seconds since the
+shell was started.  Assignment to this variable resets
+the count to the value assigned, and the expanded value
+becomes the value assigned plus the number of seconds
+since the assignment.
+<P>
+
+<A NAME="IDX256"></A>
+<DT><CODE>SHELLOPTS</CODE>
+<DD><A NAME="IDX257"></A>
+A colon-separated list of enabled shell options.  Each word in
+the list is a valid argument for the <SAMP>`-o'</SAMP> option to the
+<CODE>set</CODE> builtin command (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+The options appearing in <CODE>SHELLOPTS</CODE> are those reported
+as <SAMP>`on'</SAMP> by <SAMP>`set -o'</SAMP>.
+If this variable is in the environment when Bash
+starts up, each shell option in the list will be enabled before
+reading any startup files.  This variable is readonly.
+<P>
+
+<A NAME="IDX258"></A>
+<DT><CODE>SHLVL</CODE>
+<DD><A NAME="IDX259"></A>
+Incremented by one each time a new instance of Bash is started.  This is
+intended to be a count of how deeply your Bash shells are nested.
+<P>
+
+<A NAME="IDX260"></A>
+<DT><CODE>TIMEFORMAT</CODE>
+<DD><A NAME="IDX261"></A>
+The value of this parameter is used as a format string specifying
+how the timing information for pipelines prefixed with the <CODE>time</CODE>
+reserved word should be displayed.
+The <SAMP>`%'</SAMP> character introduces an
+escape sequence that is expanded to a time value or other
+information.
+The escape sequences and their meanings are as
+follows; the braces denote optional portions. 
+<P>
+
+<DL COMPACT>
+
+<DT><CODE>%%</CODE>
+<DD>A literal <SAMP>`%'</SAMP>.
+<P>
+
+<DT><CODE>%[<VAR>p</VAR>][l]R</CODE>
+<DD>The elapsed time in seconds. 
+<P>
+
+<DT><CODE>%[<VAR>p</VAR>][l]U</CODE>
+<DD>The number of CPU seconds spent in user mode. 
+<P>
+
+<DT><CODE>%[<VAR>p</VAR>][l]S</CODE>
+<DD>The number of CPU seconds spent in system mode. 
+<P>
+
+<DT><CODE>%P</CODE>
+<DD>The CPU percentage, computed as (%U + %S) / %R. 
+</DL>
+<P>
+
+The optional <VAR>p</VAR> is a digit specifying the precision, the number of
+fractional digits after a decimal point.
+A value of 0 causes no decimal point or fraction to be output.
+At most three places after the decimal point may be specified; values
+of <VAR>p</VAR> greater than 3 are changed to 3.
+If <VAR>p</VAR> is not specified, the value 3 is used. 
+</P><P>
+
+The optional <CODE>l</CODE> specifies a longer format, including minutes, of
+the form <VAR>MM</VAR>m<VAR>SS</VAR>.<VAR>FF</VAR>s.
+The value of <VAR>p</VAR> determines whether or not the fraction is included. 
+</P><P>
+
+If this variable is not set, Bash acts as if it had the value
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'</CODE>
+</pre></td></tr></table>If the value is null, no timing information is displayed.
+A trailing newline is added when the format string is displayed.
+</P><P>
+
+<A NAME="IDX262"></A>
+<DT><CODE>TMOUT</CODE>
+<DD><A NAME="IDX263"></A>
+If set to a value greater than zero, <CODE>TMOUT</CODE> is treated as the
+default timeout for the <CODE>read</CODE> builtin (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+The <CODE>select</CODE> command (see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>) terminates
+if input does not arrive after <CODE>TMOUT</CODE> seconds when input is coming
+from a terminal.
+<P>
+
+In an interative shell, the value is interpreted as
+the number of seconds to wait for input after issuing the primary
+prompt when the shell is interactive.
+Bash terminates after that number of seconds if input does
+not arrive.
+</P><P>
+
+<A NAME="IDX264"></A>
+<DT><CODE>UID</CODE>
+<DD><A NAME="IDX265"></A>
+The numeric real user id of the current user.  This variable is readonly.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Bash Features"></A>
+<HR SIZE="6">
+<A NAME="SEC64"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC63"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC65"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 6. Bash Features </H1>
+<!--docid::SEC64::-->
+<P>
+
+This section describes features unique to Bash.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC65">6.1 Invoking Bash</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Command line options that you can give
+                               to Bash.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC66">6.2 Bash Startup Files</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">When and how Bash executes scripts.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC74">6.3 Interactive Shells</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What an interactive shell is.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC78">6.4 Bash Conditional Expressions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Primitives used in composing expressions for
+                               the <CODE>test</CODE> builtin.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Arithmetic on shell variables.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC80">6.6 Aliases</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Substituting one command for another.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC81">6.7 Arrays</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Array Variables.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC82">6.8 The Directory Stack</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">History of visited directories.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC84">6.9 Controlling the Prompt</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Controlling the PS1 string.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC85">6.10 The Restricted Shell</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A more controlled mode of shell execution.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Making Bash behave more closely to what
+                               the POSIX standard specifies.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Invoking Bash"></A>
+<HR SIZE="6">
+<A NAME="SEC65"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC66"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.1 Invoking Bash </H2>
+<!--docid::SEC65::-->
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o <VAR>option</VAR>] [-O <VAR>shopt_option</VAR>] [<VAR>argument</VAR> <small>...</small>]
+bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o <VAR>option</VAR>] [-O <VAR>shopt_option</VAR>] -c <VAR>string</VAR> [<VAR>argument</VAR> <small>...</small>]
+bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o <VAR>option</VAR>] [-O <VAR>shopt_option</VAR>] [<VAR>argument</VAR> <small>...</small>]
+</pre></td></tr></table></P><P>
+
+In addition to the single-character shell command-line options
+(see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>), there are several multi-character
+options that you can use.  These options must appear on the command
+line before the single-character options to be recognized. 
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>--debugger</CODE>
+<DD>Arrange for the debugger profile to be executed before the shell
+starts.  Turns on extended debugging mode (see <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>
+for a description of the <CODE>extdebug</CODE> option to the <CODE>shopt</CODE>
+builtin) and shell function tracing
+(see <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A> for a description of the <CODE>-o functrace</CODE>
+option).
+<P>
+
+<DT><CODE>--dump-po-strings</CODE>
+<DD>A list of all double-quoted strings preceded by <SAMP>`$'</SAMP>
+is printed on the standard ouput
+in the GNU <CODE>gettext</CODE> PO (portable object) file format.
+Equivalent to <SAMP>`-D'</SAMP> except for the output format.
+<P>
+
+<DT><CODE>--dump-strings</CODE>
+<DD>Equivalent to <SAMP>`-D'</SAMP>.
+<P>
+
+<DT><CODE>--help</CODE>
+<DD>Display a usage message on standard output and exit sucessfully.
+<P>
+
+<DT><CODE>--init-file <VAR>filename</VAR></CODE>
+<DD><DT><CODE>--rcfile <VAR>filename</VAR></CODE>
+<DD>Execute commands from <VAR>filename</VAR> (instead of <TT>`~/.bashrc'</TT>)
+in an interactive shell.
+<P>
+
+<DT><CODE>--login</CODE>
+<DD>Equivalent to <SAMP>`-l'</SAMP>.
+<P>
+
+<DT><CODE>--noediting</CODE>
+<DD>Do not use the GNU Readline library (see section <A HREF="bashref.html#SEC91">8. Command Line Editing</A>)
+to read  command lines when the shell is interactive.
+<P>
+
+<DT><CODE>--noprofile</CODE>
+<DD>Don't load the system-wide startup file <TT>`/etc/profile'</TT>
+or any of the personal initialization files
+<TT>`~/.bash_profile'</TT>, <TT>`~/.bash_login'</TT>, or <TT>`~/.profile'</TT>
+when Bash is invoked as a login shell.
+<P>
+
+<DT><CODE>--norc</CODE>
+<DD>Don't read the <TT>`~/.bashrc'</TT> initialization file in an
+interactive shell.  This is on by default if the shell is
+invoked as <CODE>sh</CODE>.
+<P>
+
+<DT><CODE>--posix</CODE>
+<DD>Change the behavior of Bash where the default operation differs
+from the POSIX 1003.2 standard to match the standard.  This
+is intended to make Bash behave as a strict superset of that
+standard.  See section <A HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A>, for a description of the Bash
+POSIX mode.
+<P>
+
+<DT><CODE>--restricted</CODE>
+<DD>Make the shell a restricted shell (see section <A HREF="bashref.html#SEC85">6.10 The Restricted Shell</A>).
+<P>
+
+<DT><CODE>--verbose</CODE>
+<DD>Equivalent to <SAMP>`-v'</SAMP>.  Print shell input lines as they're read.
+<P>
+
+<DT><CODE>--version</CODE>
+<DD>Show version information for this instance of
+Bash on the standard output and exit successfully.
+<P>
+
+</DL>
+<P>
+
+There are several single-character options that may be supplied at
+invocation which are not available with the <CODE>set</CODE> builtin.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>-c <VAR>string</VAR></CODE>
+<DD>Read and execute commands from <VAR>string</VAR> after processing the
+options, then exit.  Any remaining arguments are assigned to the
+positional parameters, starting with <CODE>$0</CODE>.
+<P>
+
+<DT><CODE>-i</CODE>
+<DD>Force the shell to run interactively.  Interactive shells are
+described in <A HREF="bashref.html#SEC74">6.3 Interactive Shells</A>.
+<P>
+
+<DT><CODE>-l</CODE>
+<DD>Make this shell act as if it had been directly invoked by login.
+When the shell is interactive, this is equivalent to starting a
+login shell with <SAMP>`exec -l bash'</SAMP>.
+When the shell is not interactive, the login shell startup files will
+be executed.
+<SAMP>`exec bash -l'</SAMP> or <SAMP>`exec bash --login'</SAMP>
+will replace the current shell with a Bash login shell.
+See section <A HREF="bashref.html#SEC66">6.2 Bash Startup Files</A>, for a description of the special behavior
+of a login shell.
+<P>
+
+<DT><CODE>-r</CODE>
+<DD>Make the shell a restricted shell (see section <A HREF="bashref.html#SEC85">6.10 The Restricted Shell</A>).
+<P>
+
+<DT><CODE>-s</CODE>
+<DD>If this option is present, or if no arguments remain after option
+processing, then commands are read from the standard input.
+This option allows the positional parameters to be set
+when invoking an interactive shell.
+<P>
+
+<DT><CODE>-D</CODE>
+<DD>A list of all double-quoted strings preceded by <SAMP>`$'</SAMP>
+is printed on the standard ouput.
+These are the strings that
+are subject to language translation when the current locale
+is not <CODE>C</CODE> or <CODE>POSIX</CODE> (see section <A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A>).
+This implies the <SAMP>`-n'</SAMP> option; no commands will be executed.
+<P>
+
+<DT><CODE>[-+]O [<VAR>shopt_option</VAR>]</CODE>
+<DD><VAR>shopt_option</VAR> is one of the shell options accepted by the
+<CODE>shopt</CODE> builtin (see section <A HREF="bashref.html#SEC56">4. Shell Builtin Commands</A>).
+If <VAR>shopt_option</VAR> is present, <SAMP>`-O'</SAMP> sets the value of that option;
+<SAMP>`+O'</SAMP> unsets it.  
+If <VAR>shopt_option</VAR> is not supplied, the names and values of the shell
+options accepted by <CODE>shopt</CODE> are printed on the standard output.
+If the invocation option is <SAMP>`+O'</SAMP>, the output is displayed in a format
+that may be reused as input.
+<P>
+
+<DT><CODE>--</CODE>
+<DD>A <CODE>--</CODE> signals the end of options and disables further option
+processing.
+Any arguments after the <CODE>--</CODE> are treated as filenames and arguments.
+<P>
+
+</DL>
+<P>
+
+<A NAME="IDX266"></A>
+A <EM>login</EM> shell is one whose first character of argument zero is
+<SAMP>`-'</SAMP>, or one invoked with the <SAMP>`--login'</SAMP> option.
+</P><P>
+
+<A NAME="IDX267"></A>
+An <EM>interactive</EM> shell is one started without non-option arguments,
+unless <SAMP>`-s'</SAMP> is specified,
+without specifying the <SAMP>`-c'</SAMP> option, and whose input and output are both
+connected to terminals (as determined by <CODE>isatty(3)</CODE>), or one
+started with the <SAMP>`-i'</SAMP> option.  See section <A HREF="bashref.html#SEC74">6.3 Interactive Shells</A>, for more
+information.
+</P><P>
+
+If arguments remain after option processing, and neither the
+<SAMP>`-c'</SAMP> nor the <SAMP>`-s'</SAMP>
+option has been supplied, the first argument is assumed to
+be the name of a file containing shell commands (see section <A HREF="bashref.html#SEC55">3.8 Shell Scripts</A>).
+When Bash is invoked in this fashion, <CODE>$0</CODE>
+is set to the name of the file, and the positional parameters
+are set to the remaining arguments.
+Bash reads and executes commands from this file, then exits.   
+Bash's exit status is the exit status of the last command executed
+in the script.  If no commands are executed, the exit status is 0.
+</P><P>
+
+<A NAME="Bash Startup Files"></A>
+<HR SIZE="6">
+<A NAME="SEC66"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC65"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC74"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC74"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.2 Bash Startup Files </H2>
+<!--docid::SEC66::-->
+<P>
+
+This section describs how Bash executes its startup files.
+If any of the files exist but cannot be read, Bash reports an error.
+Tildes are expanded in file names as described above under
+Tilde Expansion (see section <A HREF="bashref.html#SEC29">3.5.2 Tilde Expansion</A>).
+</P><P>
+
+Interactive shells are described in <A HREF="bashref.html#SEC74">6.3 Interactive Shells</A>.
+</P><P>
+
+<A NAME="SEC67"></A>
+<H4> Invoked as an interactive login shell, or with <SAMP>`--login'</SAMP> </H4>
+<!--docid::SEC67::-->
+<P>
+
+When Bash is invoked as an interactive login shell, or as a
+non-interactive shell with the <SAMP>`--login'</SAMP> option, it first reads and
+executes commands from the file <TT>`/etc/profile'</TT>, if that file exists.
+After reading that file, it looks for <TT>`~/.bash_profile'</TT>,
+<TT>`~/.bash_login'</TT>, and <TT>`~/.profile'</TT>, in that order, and reads
+and executes commands from the first one that exists and is readable.
+The <SAMP>`--noprofile'</SAMP> option may be used when the shell is started to
+inhibit this behavior.
+</P><P>
+
+When a login shell exits, Bash reads and executes commands from
+the file <TT>`~/.bash_logout'</TT>, if it exists.
+</P><P>
+
+<A NAME="SEC68"></A>
+<H4> Invoked as an interactive non-login shell </H4>
+<!--docid::SEC68::-->
+<P>
+
+When an interactive shell that is not a login shell is started, Bash
+reads and executes commands from <TT>`~/.bashrc'</TT>, if that file exists.
+This may be inhibited by using the <SAMP>`--norc'</SAMP> option.
+The <SAMP>`--rcfile <VAR>file</VAR>'</SAMP> option will force Bash to read and
+execute commands from <VAR>file</VAR> instead of <TT>`~/.bashrc'</TT>.
+</P><P>
+
+So, typically, your <TT>`~/.bash_profile'</TT> contains the line
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>if [ -f ~/.bashrc ]; then . ~/.bashrc; fi</CODE>
+</pre></td></tr></table>after (or before) any login-specific initializations.
+</P><P>
+
+<A NAME="SEC69"></A>
+<H4> Invoked non-interactively </H4>
+<!--docid::SEC69::-->
+<P>
+
+When Bash is started non-interactively, to run a shell script,
+for example, it looks for the variable <CODE>BASH_ENV</CODE> in the environment,
+expands its value if it appears there, and uses the expanded value as
+the name of a file to read and execute.  Bash behaves as if the
+following command were executed:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi</CODE>
+</pre></td></tr></table>but the value of the <CODE>PATH</CODE> variable is not used to search for the
+file name.
+</P><P>
+
+As noted above, if a non-interactive shell is invoked with the
+<SAMP>`--login'</SAMP> option, Bash attempts to read and execute commands from the
+login shell startup files. 
+</P><P>
+
+<A NAME="SEC70"></A>
+<H4> Invoked with name <CODE>sh</CODE> </H4>
+<!--docid::SEC70::-->
+<P>
+
+If Bash is invoked with the name <CODE>sh</CODE>, it tries to mimic the
+startup behavior of historical versions of <CODE>sh</CODE> as closely as
+possible, while conforming to the POSIX standard as well.
+</P><P>
+
+When invoked as an interactive login shell, or as a non-interactive
+shell with the <SAMP>`--login'</SAMP> option, it first attempts to read
+and execute commands from <TT>`/etc/profile'</TT> and <TT>`~/.profile'</TT>, in
+that order.
+The <SAMP>`--noprofile'</SAMP> option may be used to inhibit this behavior.
+When invoked as an interactive shell with the name <CODE>sh</CODE>, Bash
+looks for the variable <CODE>ENV</CODE>, expands its value if it is defined,
+and uses the expanded value as the name of a file to read and execute.
+Since a shell invoked as <CODE>sh</CODE> does not attempt to read and execute
+commands from any other startup files, the <SAMP>`--rcfile'</SAMP> option has
+no effect.
+A non-interactive shell invoked with the name <CODE>sh</CODE> does not attempt
+to read any other startup files.
+</P><P>
+
+When invoked as <CODE>sh</CODE>, Bash enters POSIX mode after
+the startup files are read.
+</P><P>
+
+<A NAME="SEC71"></A>
+<H4> Invoked in POSIX mode </H4>
+<!--docid::SEC71::-->
+<P>
+
+When Bash is started in POSIX mode, as with the
+<SAMP>`--posix'</SAMP> command line option, it follows the POSIX standard
+for startup files.
+In this mode, interactive shells expand the <CODE>ENV</CODE> variable
+and commands are read and executed from the file whose name is the
+expanded value.
+No other startup files are read.
+</P><P>
+
+<A NAME="SEC72"></A>
+<H4> Invoked by remote shell daemon </H4>
+<!--docid::SEC72::-->
+<P>
+
+Bash attempts to determine when it is being run by the remote shell
+daemon, usually <CODE>rshd</CODE>.  If Bash determines it is being run by
+rshd, it reads and executes commands from <TT>`~/.bashrc'</TT>, if that
+file exists and is readable.
+It will not do this if invoked as <CODE>sh</CODE>.
+The <SAMP>`--norc'</SAMP> option may be used to inhibit this behavior, and the
+<SAMP>`--rcfile'</SAMP> option may be used to force another file to be read, but
+<CODE>rshd</CODE> does not generally invoke the shell with those options or
+allow them to be specified.
+</P><P>
+
+<A NAME="SEC73"></A>
+<H4> Invoked with unequal effective and real UID/GIDs </H4>
+<!--docid::SEC73::-->
+<P>
+
+If Bash is started with the effective user (group) id not equal to the
+real user (group) id, and the <CODE>-p</CODE> option is not supplied, no startup
+files are read, shell functions are not inherited from the environment,
+the <CODE>SHELLOPTS</CODE> variable, if it appears in the environment, is ignored,
+and the effective user id is set to the real user id.
+If the <CODE>-p</CODE> option is supplied at invocation, the startup behavior is
+the same, but the effective user id is not reset.
+</P><P>
+
+<A NAME="Interactive Shells"></A>
+<HR SIZE="6">
+<A NAME="SEC74"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC66"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC75"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.3 Interactive Shells </H2>
+<!--docid::SEC74::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC75">6.3.1 What is an Interactive Shell?</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What determines whether a shell is Interactive.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC76">6.3.2 Is this Shell Interactive?</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to tell if a shell is interactive.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC77">6.3.3 Interactive Shell Behavior</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What changes in a interactive shell?</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="What is an Interactive Shell?"></A>
+<HR SIZE="6">
+<A NAME="SEC75"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC74"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC76"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC74"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 6.3.1 What is an Interactive Shell? </H3>
+<!--docid::SEC75::-->
+<P>
+
+An interactive shell
+is one started without non-option arguments, unless <SAMP>`-s'</SAMP> is
+specified, without specifiying the <SAMP>`-c'</SAMP> option, and
+whose input and output are both
+connected to terminals (as determined by <CODE>isatty(3)</CODE>),
+or one started with the <SAMP>`-i'</SAMP> option.
+</P><P>
+
+An interactive shell generally reads from and writes to a user's
+terminal.
+</P><P>
+
+The <SAMP>`-s'</SAMP> invocation option may be used to set the positional parameters
+when an interactive shell is started.
+</P><P>
+
+<A NAME="Is this Shell Interactive?"></A>
+<HR SIZE="6">
+<A NAME="SEC76"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC75"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC77"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC77"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC74"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 6.3.2 Is this Shell Interactive? </H3>
+<!--docid::SEC76::-->
+<P>
+
+To determine within a startup script whether or not Bash is
+running interactively,
+test the value of the <SAMP>`-'</SAMP> special parameter.
+It contains <CODE>i</CODE> when the shell is interactive.  For example:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>case "$-" in
+*i*)   echo This shell is interactive ;;
+*)     echo This shell is not interactive ;;
+esac
+</pre></td></tr></table></P><P>
+
+Alternatively, startup scripts may examine the variable
+<CODE>PS1</CODE>; it is unset in non-interactive shells, and set in
+interactive shells.  Thus:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>if [ -z "$PS1" ]; then
+        echo This shell is not interactive
+else
+        echo This shell is interactive
+fi
+</pre></td></tr></table></P><P>
+
+<A NAME="Interactive Shell Behavior"></A>
+<HR SIZE="6">
+<A NAME="SEC77"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC76"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC74"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 6.3.3 Interactive Shell Behavior </H3>
+<!--docid::SEC77::-->
+<P>
+
+When the shell is running interactively, it changes its behavior in
+several ways.
+</P><P>
+
+<OL>
+<LI>
+Startup files are read and executed as described in <A HREF="bashref.html#SEC66">6.2 Bash Startup Files</A>.
+<P>
+
+<LI>
+Job Control (see section <A HREF="bashref.html#SEC87">7. Job Control</A>) is enabled by default.  When job
+control is in effect, Bash ignores the keyboard-generated job control
+signals <CODE>SIGTTIN</CODE>, <CODE>SIGTTOU</CODE>, and <CODE>SIGTSTP</CODE>.
+<P>
+
+<LI>
+Bash expands and displays <CODE>PS1</CODE> before reading the first line
+of a command, and expands and displays <CODE>PS2</CODE> before reading the
+second and subsequent lines of a multi-line command.
+<P>
+
+<LI>
+Bash executes the value of the <CODE>PROMPT_COMMAND</CODE> variable as a command
+before printing the primary prompt, <CODE>$PS1</CODE>
+(see section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>).
+<P>
+
+<LI>
+Readline (see section <A HREF="bashref.html#SEC91">8. Command Line Editing</A>) is used to read commands from
+the user's terminal.
+<P>
+
+<LI>
+Bash inspects the value of the <CODE>ignoreeof</CODE> option to <CODE>set -o</CODE>
+instead of exiting immediately when it receives an <CODE>EOF</CODE> on its
+standard input when reading a command (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+<P>
+
+<LI>
+Command history (see section <A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A>)
+and history expansion (see section <A HREF="bashref.html#SEC118">9.3 History Expansion</A>)
+are enabled by default.
+Bash will save the command history to the file named by <CODE>$HISTFILE</CODE>
+when an interactive shell exits.
+<P>
+
+<LI>
+Alias expansion (see section <A HREF="bashref.html#SEC80">6.6 Aliases</A>) is performed by default.
+<P>
+
+<LI>
+In the absence of any traps, Bash ignores <CODE>SIGTERM</CODE>
+(see section <A HREF="bashref.html#SEC54">3.7.6 Signals</A>).
+<P>
+
+<LI>
+In the absence of any traps, <CODE>SIGINT</CODE> is caught and handled
+((see section <A HREF="bashref.html#SEC54">3.7.6 Signals</A>).
+<CODE>SIGINT</CODE> will interrupt some shell builtins.
+<P>
+
+<LI>
+An interactive login shell sends a <CODE>SIGHUP</CODE> to all jobs on exit
+if the <CODE>hupoxexit</CODE> shell option has been enabled (see section <A HREF="bashref.html#SEC54">3.7.6 Signals</A>).
+<P>
+
+<LI>
+The <SAMP>`-n'</SAMP> invocation option is ignored, and <SAMP>`set -n'</SAMP> has
+no effect (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+<P>
+
+<LI>
+Bash will check for mail periodically, depending on the values of the
+<CODE>MAIL</CODE>, <CODE>MAILPATH</CODE>, and <CODE>MAILCHECK</CODE> shell variables
+(see section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>).
+<P>
+
+<LI>
+Expansion errors due to references to unbound shell variables after
+<SAMP>`set -u'</SAMP> has been enabled will not cause the shell to exit
+(see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+<P>
+
+<LI>
+The shell will not exit on expansion errors caused by <VAR>var</VAR> being unset
+or null in <CODE>${<VAR>var</VAR>:?<VAR>word</VAR>}</CODE> expansions
+(see section <A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>).
+<P>
+
+<LI>
+Redirection errors encountered by shell builtins will not cause the
+shell to exit.
+<P>
+
+<LI>
+When running in POSIX mode, a special builtin returning an error
+status will not cause the shell to exit (see section <A HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A>).
+<LI>
+A failed <CODE>exec</CODE> will not cause the shell to exit
+(see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>).
+<P>
+
+<LI>
+Parser syntax errors will not cause the shell to exit.
+<P>
+
+<LI>
+Simple spelling correction for directory arguments to the <CODE>cd</CODE>
+builtin is enabled by default (see the description of the <CODE>cdspell</CODE>
+option to the <CODE>shopt</CODE> builtin in <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<LI>
+The shell will check the value of the <CODE>TMOUT</CODE> variable and exit
+if a command is not read within the specified number of seconds after
+printing <CODE>$PS1</CODE> (see section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>).
+<P>
+
+</OL>
+<P>
+
+<A NAME="Bash Conditional Expressions"></A>
+<HR SIZE="6">
+<A NAME="SEC78"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC77"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC79"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC79"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.4 Bash Conditional Expressions </H2>
+<!--docid::SEC78::-->
+<P>
+
+Conditional expressions are used by the <CODE>[[</CODE> compound command
+and the <CODE>test</CODE> and <CODE>[</CODE> builtin commands.
+</P><P>
+
+Expressions may be unary or binary.
+Unary expressions are often used to examine the status of a file.
+There are string operators and numeric comparison operators as well.
+If the <VAR>file</VAR> argument to one of the primaries is of the form
+<TT>`/dev/fd/<VAR>N</VAR>'</TT>, then file descriptor <VAR>N</VAR> is checked.
+If the <VAR>file</VAR> argument to one of the primaries is one of
+<TT>`/dev/stdin'</TT>, <TT>`/dev/stdout'</TT>, or <TT>`/dev/stderr'</TT>, file
+descriptor 0, 1, or 2, respectively, is checked.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>-a <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists.
+<P>
+
+<DT><CODE>-b <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is a block special file.
+<P>
+
+<DT><CODE>-c <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is a character special file.
+<P>
+
+<DT><CODE>-d <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is a directory.
+<P>
+
+<DT><CODE>-e <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists.
+<P>
+
+<DT><CODE>-f <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is a regular file.
+<P>
+
+<DT><CODE>-g <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and its set-group-id bit is set.
+<P>
+
+<DT><CODE>-h <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is a symbolic link.
+<P>
+
+<DT><CODE>-k <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and its "sticky" bit is set.
+<P>
+
+<DT><CODE>-p <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is a named pipe (FIFO).
+<P>
+
+<DT><CODE>-r <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is readable.
+<P>
+
+<DT><CODE>-s <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and has a size greater than zero.
+<P>
+
+<DT><CODE>-t <VAR>fd</VAR></CODE>
+<DD>True if file descriptor <VAR>fd</VAR> is open and refers to a terminal.
+<P>
+
+<DT><CODE>-u <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and its set-user-id bit is set.
+<P>
+
+<DT><CODE>-w <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is writable.
+<P>
+
+<DT><CODE>-x <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is executable.
+<P>
+
+<DT><CODE>-O <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is owned by the effective user id.
+<P>
+
+<DT><CODE>-G <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is owned by the effective group id.
+<P>
+
+<DT><CODE>-L <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is a symbolic link.
+<P>
+
+<DT><CODE>-S <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and is a socket.
+<P>
+
+<DT><CODE>-N <VAR>file</VAR></CODE>
+<DD>True if <VAR>file</VAR> exists and has been modified since it was last read.
+<P>
+
+<DT><CODE><VAR>file1</VAR> -nt <VAR>file2</VAR></CODE>
+<DD>True if <VAR>file1</VAR> is newer (according to modification date)
+than <VAR>file2</VAR>, or if <VAR>file1</VAR> exists and <VAR>file2</VAR> does not.
+<P>
+
+<DT><CODE><VAR>file1</VAR> -ot <VAR>file2</VAR></CODE>
+<DD>True if <VAR>file1</VAR> is older than <VAR>file2</VAR>,
+or if <VAR>file2</VAR> exists and <VAR>file1</VAR> does not.
+<P>
+
+<DT><CODE><VAR>file1</VAR> -ef <VAR>file2</VAR></CODE>
+<DD>True if <VAR>file1</VAR> and <VAR>file2</VAR> refer to the same device and
+inode numbers.
+<P>
+
+<DT><CODE>-o <VAR>optname</VAR></CODE>
+<DD>True if shell option <VAR>optname</VAR> is enabled.
+The list of options appears in the description of the <SAMP>`-o'</SAMP>
+option to the <CODE>set</CODE> builtin (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+<P>
+
+<DT><CODE>-z <VAR>string</VAR></CODE>
+<DD>True if the length of <VAR>string</VAR> is zero.
+<P>
+
+<DT><CODE>-n <VAR>string</VAR></CODE>
+<DD><DT><CODE><VAR>string</VAR></CODE>
+<DD>True if the length of <VAR>string</VAR> is non-zero.
+<P>
+
+<DT><CODE><VAR>string1</VAR> == <VAR>string2</VAR></CODE>
+<DD>True if the strings are equal.
+<SAMP>`='</SAMP> may be used in place of <SAMP>`=='</SAMP> for strict POSIX compliance.
+<P>
+
+<DT><CODE><VAR>string1</VAR> != <VAR>string2</VAR></CODE>
+<DD>True if the strings are not equal.
+<P>
+
+<DT><CODE><VAR>string1</VAR> &#60; <VAR>string2</VAR></CODE>
+<DD>True if <VAR>string1</VAR> sorts before <VAR>string2</VAR> lexicographically
+in the current locale.
+<P>
+
+<DT><CODE><VAR>string1</VAR> &#62; <VAR>string2</VAR></CODE>
+<DD>True if <VAR>string1</VAR> sorts after <VAR>string2</VAR> lexicographically
+in the current locale.
+<P>
+
+<DT><CODE><VAR>arg1</VAR> OP <VAR>arg2</VAR></CODE>
+<DD><CODE>OP</CODE> is one of 
+<SAMP>`-eq'</SAMP>, <SAMP>`-ne'</SAMP>, <SAMP>`-lt'</SAMP>, <SAMP>`-le'</SAMP>, <SAMP>`-gt'</SAMP>, or <SAMP>`-ge'</SAMP>.
+These arithmetic binary operators return true if <VAR>arg1</VAR>
+is equal to, not equal to, less than, less than or equal to,
+greater than, or greater than or equal to <VAR>arg2</VAR>,
+respectively.  <VAR>Arg1</VAR> and <VAR>arg2</VAR>
+may be positive or negative integers.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Shell Arithmetic"></A>
+<HR SIZE="6">
+<A NAME="SEC79"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC78"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC80"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC80"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.5 Shell Arithmetic </H2>
+<!--docid::SEC79::-->
+<P>
+
+The shell allows arithmetic expressions to be evaluated, as one of
+the shell expansions or by the <CODE>let</CODE> and the <SAMP>`-i'</SAMP> option
+to the <CODE>declare</CODE> builtins.
+</P><P>
+
+Evaluation is done in fixed-width integers with no check for overflow,
+though division by 0 is trapped and flagged as an error.
+The operators and their precedence, associativity, and values
+are the same as in the C language.
+The following list of operators is grouped into levels of
+equal-precedence operators.
+The levels are listed in order of decreasing precedence. 
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE><VAR>id</VAR>++ <VAR>id</VAR>--</CODE>
+<DD>variable post-increment and post-decrement 
+<P>
+
+<DT><CODE>++<VAR>id</VAR> --<VAR>id</VAR></CODE>
+<DD>variable pre-increment and pre-decrement
+<P>
+
+<DT><CODE>- +</CODE>
+<DD>unary minus and plus
+<P>
+
+<DT><CODE>! ~</CODE>
+<DD>logical and bitwise negation
+<P>
+
+<DT><CODE>**</CODE>
+<DD>exponentiation
+<P>
+
+<DT><CODE>* / %</CODE>
+<DD>multiplication, division, remainder
+<P>
+
+<DT><CODE>+ -</CODE>
+<DD>addition, subtraction
+<P>
+
+<DT><CODE>&#60;&#60; &#62;&#62;</CODE>
+<DD>left and right bitwise shifts
+<P>
+
+<DT><CODE>&#60;= &#62;= &#60; &#62;</CODE>
+<DD>comparison
+<P>
+
+<DT><CODE>== !=</CODE>
+<DD>equality and inequality
+<P>
+
+<DT><CODE>&#38;</CODE>
+<DD>bitwise AND
+<P>
+
+<DT><CODE>^</CODE>
+<DD>bitwise exclusive OR
+<P>
+
+<DT><CODE>|</CODE>
+<DD>bitwise OR
+<P>
+
+<DT><CODE>&#38;&#38;</CODE>
+<DD>logical AND
+<P>
+
+<DT><CODE>||</CODE>
+<DD>logical OR
+<P>
+
+<DT><CODE>expr ? expr : expr</CODE>
+<DD>conditional operator
+<P>
+
+<DT><CODE>= *= /= %= += -= &#60;&#60;= &#62;&#62;= &#38;= ^= |=</CODE>
+<DD>assignment
+<P>
+
+<DT><CODE>expr1 , expr2</CODE>
+<DD>comma
+</DL>
+<P>
+
+Shell variables are allowed as operands; parameter expansion is
+performed before the expression is evaluated. 
+Within an expression, shell variables may also be referenced by name
+without using the parameter expansion syntax.
+A shell variable that is null or unset evaluates to 0 when referenced
+by name without using the parameter expansion syntax.
+The value of a variable is evaluated as an arithmetic expression
+when it is referenced, or when a variable which has been given the  
+<VAR>integer</VAR> attribute using <SAMP>`declare -i'</SAMP> is assigned a value.
+A null value evaluates to 0.
+A shell variable need not have its integer attribute turned on
+to be used in an expression.
+</P><P>
+
+Constants with a leading 0 are interpreted as octal numbers.
+A leading <SAMP>`0x'</SAMP> or <SAMP>`0X'</SAMP> denotes hexadecimal.  Otherwise,
+numbers take the form [<VAR>base</VAR><CODE>#</CODE>]<VAR>n</VAR>, where <VAR>base</VAR>
+is a decimal number between 2 and 64 representing the arithmetic
+base, and <VAR>n</VAR> is a number in that base.  If <VAR>base</VAR><CODE>#</CODE> is
+omitted, then base 10 is used.
+The digits greater than 9 are represented by the lowercase letters,
+the uppercase letters, <SAMP>`@'</SAMP>, and <SAMP>`_'</SAMP>, in that order.
+If <VAR>base</VAR> is less than or equal to 36, lowercase and uppercase
+letters may be used interchangably to represent numbers between 10
+and 35.
+</P><P>
+
+Operators are evaluated in order of precedence.  Sub-expressions in
+parentheses are evaluated first and may override the precedence
+rules above.
+</P><P>
+
+<A NAME="Aliases"></A>
+<HR SIZE="6">
+<A NAME="SEC80"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC79"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC81"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC81"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.6 Aliases </H2>
+<!--docid::SEC80::-->
+<P>
+
+<VAR>Aliases</VAR> allow a string to be substituted for a word when it is used
+as the first word of a simple command.
+The shell maintains a list of aliases that may be set and unset with
+the <CODE>alias</CODE> and <CODE>unalias</CODE> builtin commands.
+</P><P>
+
+The first word of each simple command, if unquoted, is checked to see
+if it has an alias.
+If so, that word is replaced by the text of the alias.
+The alias name and the replacement text may contain any valid
+shell input, including shell metacharacters, with the exception
+that the alias name may not contain <SAMP>`='</SAMP>.
+The first word of the replacement text is tested for
+aliases, but a word that is identical to an alias being expanded
+is not expanded a second time.  This means that one may alias
+<CODE>ls</CODE> to <CODE>"ls -F"</CODE>,
+for instance, and Bash does not try to recursively expand the
+replacement text. If the last character of the alias value is a
+space or tab character, then the next command word following the
+alias is also checked for alias expansion.
+</P><P>
+
+Aliases are created and listed with the <CODE>alias</CODE>
+command, and removed with the <CODE>unalias</CODE> command.
+</P><P>
+
+There is no mechanism for using arguments in the replacement text,
+as in <CODE>csh</CODE>.
+If arguments are needed, a shell function should be used
+(see section <A HREF="bashref.html#SEC23">3.3 Shell Functions</A>).
+</P><P>
+
+Aliases are not expanded when the shell is not interactive,
+unless the <CODE>expand_aliases</CODE> shell option is set using
+<CODE>shopt</CODE> (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+</P><P>
+
+The rules concerning the definition and use of aliases are
+somewhat confusing.  Bash
+always reads at least one complete line
+of input before executing any
+of the commands on that line.  Aliases are expanded when a
+command is read, not when it is executed.  Therefore, an
+alias definition appearing on the same line as another
+command does not take effect until the next line of input is read.
+The commands following the alias definition
+on that line are not affected by the new alias.
+This behavior is also an issue when functions are executed.
+Aliases are expanded when a function definition is read,
+not when the function is executed, because a function definition
+is itself a compound command.  As a consequence, aliases
+defined in a function are not available until after that
+function is executed.  To be safe, always put
+alias definitions on a separate line, and do not use <CODE>alias</CODE>
+in compound commands.
+</P><P>
+
+For almost every purpose, shell functions are preferred over aliases.
+</P><P>
+
+<A NAME="Arrays"></A>
+<HR SIZE="6">
+<A NAME="SEC81"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC80"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC82"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC82"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.7 Arrays </H2>
+<!--docid::SEC81::-->
+<P>
+
+Bash provides one-dimensional array variables.  Any variable may be used as
+an array; the <CODE>declare</CODE> builtin will explicitly declare an array.
+There is no maximum
+limit on the size of an array, nor any requirement that members
+be indexed or assigned contiguously.  Arrays are zero-based.
+</P><P>
+
+An array is created automatically if any variable is assigned to using
+the syntax
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>name[<VAR>subscript</VAR>]=<VAR>value</VAR>
+</pre></td></tr></table></P><P>
+
+The <VAR>subscript</VAR>
+is treated as an arithmetic expression that must evaluate to a number
+greater than or equal to zero.  To explicitly declare an array, use
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>declare -a <VAR>name</VAR>
+</pre></td></tr></table>The syntax
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>declare -a <VAR>name</VAR>[<VAR>subscript</VAR>]
+</pre></td></tr></table>is also accepted; the <VAR>subscript</VAR> is ignored.  Attributes may be
+specified for an array variable using the <CODE>declare</CODE> and
+<CODE>readonly</CODE> builtins.  Each attribute applies to all members of
+an array.
+</P><P>
+
+Arrays are assigned to using compound assignments of the form
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>name=(value<VAR>1</VAR> <small>...</small> value<VAR>n</VAR>)
+</pre></td></tr></table>where each
+<VAR>value</VAR> is of the form <CODE>[[<VAR>subscript</VAR>]=]</CODE><VAR>string</VAR>.  If
+the optional subscript is supplied, that index is assigned to;
+otherwise the index of the element assigned is the last index assigned
+to by the statement plus one.  Indexing starts at zero.
+This syntax is also accepted by the <CODE>declare</CODE>
+builtin.  Individual array elements may be assigned to using the
+<CODE>name[</CODE><VAR>subscript</VAR><CODE>]=</CODE><VAR>value</VAR> syntax introduced above.
+</P><P>
+
+Any element of an array may be referenced using
+<CODE>${name[</CODE><VAR>subscript</VAR><CODE>]}</CODE>.
+The braces are required to avoid
+conflicts with the shell's filename expansion operators.  If the
+<VAR>subscript</VAR> is <SAMP>`@'</SAMP> or <SAMP>`*'</SAMP>, the word expands to all members
+of the array <VAR>name</VAR>.  These subscripts differ only when the word
+appears within double quotes.  If the word is double-quoted,
+<CODE>${name[*]}</CODE> expands to a single word with
+the value of each array member separated by the first character of the
+<CODE>IFS</CODE> variable, and <CODE>${name[@]}</CODE> expands each element of
+<VAR>name</VAR> to a separate word.  When there are no array members,
+<CODE>${name[@]}</CODE> expands to nothing.  This is analogous to the
+expansion of the special parameters <SAMP>`@'</SAMP> and <SAMP>`*'</SAMP>. 
+<CODE>${#name[</CODE><VAR>subscript</VAR><CODE>]}</CODE> expands to the length of
+<CODE>${name[</CODE><VAR>subscript</VAR><CODE>]}</CODE>.
+If <VAR>subscript</VAR> is <SAMP>`@'</SAMP> or
+<SAMP>`*'</SAMP>, the expansion is the number of elements in the array. 
+Referencing an array variable without a subscript is equivalent to
+referencing element zero. 
+</P><P>
+
+The <CODE>unset</CODE> builtin is used to destroy arrays.
+<CODE>unset</CODE> <VAR>name</VAR>[<VAR>subscript</VAR>]
+destroys the array element at index <VAR>subscript</VAR>.
+<CODE>unset</CODE> <VAR>name</VAR>, where <VAR>name</VAR> is an array, removes the
+entire array. A subscript of <SAMP>`*'</SAMP> or <SAMP>`@'</SAMP> also removes the
+entire array.
+</P><P>
+
+The <CODE>declare</CODE>, <CODE>local</CODE>, and <CODE>readonly</CODE>
+builtins each accept a <SAMP>`-a'</SAMP>
+option to specify an array.  The <CODE>read</CODE>
+builtin accepts a <SAMP>`-a'</SAMP>
+option to assign a list of words read from the standard input
+to an array, and can read values from the standard input into
+individual array elements.  The <CODE>set</CODE> and <CODE>declare</CODE>
+builtins display array values in a way that allows them to be
+reused as input.
+</P><P>
+
+<A NAME="The Directory Stack"></A>
+<HR SIZE="6">
+<A NAME="SEC82"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC81"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC83"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC84"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC84"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.8 The Directory Stack </H2>
+<!--docid::SEC82::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC83">6.8.1 Directory Stack Builtins</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Bash builtin commands to manipulate
+                                       the directory stack.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+The directory stack is a list of recently-visited directories.  The
+<CODE>pushd</CODE> builtin adds directories to the stack as it changes
+the current directory, and the <CODE>popd</CODE> builtin removes specified
+directories from the stack and changes the current directory to
+the directory removed.  The <CODE>dirs</CODE> builtin displays the contents
+of the directory stack.
+</P><P>
+
+The contents of the directory stack are also visible
+as the value of the <CODE>DIRSTACK</CODE> shell variable.
+</P><P>
+
+<A NAME="Directory Stack Builtins"></A>
+<HR SIZE="6">
+<A NAME="SEC83"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC82"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC84"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC84"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC82"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC84"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 6.8.1 Directory Stack Builtins </H3>
+<!--docid::SEC83::-->
+<P>
+
+<DL COMPACT>
+
+<DT><CODE>dirs</CODE>
+<DD><A NAME="IDX268"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>dirs [+<VAR>N</VAR> | -<VAR>N</VAR>] [-clpv]
+</pre></td></tr></table>Display the list of currently remembered directories.  Directories
+are added to the list with the <CODE>pushd</CODE> command; the
+<CODE>popd</CODE> command removes directories from the list.
+<DL COMPACT>
+<DT><CODE>+<VAR>N</VAR></CODE>
+<DD>Displays the <VAR>N</VAR>th directory (counting from the left of the
+list printed by <CODE>dirs</CODE> when invoked without options), starting
+with zero.
+<DT><CODE>-<VAR>N</VAR></CODE>
+<DD>Displays the <VAR>N</VAR>th directory (counting from the right of the
+list printed by <CODE>dirs</CODE> when invoked without options), starting
+with zero.
+<DT><CODE>-c</CODE>
+<DD>Clears the directory stack by deleting all of the elements.
+<DT><CODE>-l</CODE>
+<DD>Produces a longer listing; the default listing format uses a 
+tilde to denote the home directory.
+<DT><CODE>-p</CODE>
+<DD>Causes <CODE>dirs</CODE> to print the directory stack with one entry per
+line.
+<DT><CODE>-v</CODE>
+<DD>Causes <CODE>dirs</CODE> to print the directory stack with one entry per
+line, prefixing each entry with its index in the stack.
+</DL>
+<P>
+
+<DT><CODE>popd</CODE>
+<DD><A NAME="IDX269"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>popd [+<VAR>N</VAR> | -<VAR>N</VAR>] [-n]
+</pre></td></tr></table><P>
+
+Remove the top entry from the directory stack, and <CODE>cd</CODE>
+to the new top directory.
+When no arguments are given, <CODE>popd</CODE>
+removes the top directory from the stack and
+performs a <CODE>cd</CODE> to the new top directory.  The
+elements are numbered from 0 starting at the first directory listed with
+<CODE>dirs</CODE>; i.e., <CODE>popd</CODE> is equivalent to <CODE>popd +0</CODE>.
+<DL COMPACT>
+<DT><CODE>+<VAR>N</VAR></CODE>
+<DD>Removes the <VAR>N</VAR>th directory (counting from the left of the
+list printed by <CODE>dirs</CODE>), starting with zero.
+<DT><CODE>-<VAR>N</VAR></CODE>
+<DD>Removes the <VAR>N</VAR>th directory (counting from the right of the
+list printed by <CODE>dirs</CODE>), starting with zero.
+<DT><CODE>-n</CODE>
+<DD>Suppresses the normal change of directory when removing directories
+from the stack, so that only the stack is manipulated.
+</DL>
+<P>
+
+<A NAME="IDX270"></A>
+<DT><CODE>pushd</CODE>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>pushd [<VAR>dir</VAR> | <VAR>+N</VAR> | <VAR>-N</VAR>] [-n]
+</pre></td></tr></table><P>
+
+Save the current directory on the top of the directory stack
+and then <CODE>cd</CODE> to <VAR>dir</VAR>.
+With no arguments, <CODE>pushd</CODE> exchanges the top two directories.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>+<VAR>N</VAR></CODE>
+<DD>Brings the <VAR>N</VAR>th directory (counting from the left of the
+list printed by <CODE>dirs</CODE>, starting with zero) to the top of
+the list by rotating the stack.
+<DT><CODE>-<VAR>N</VAR></CODE>
+<DD>Brings the <VAR>N</VAR>th directory (counting from the right of the
+list printed by <CODE>dirs</CODE>, starting with zero) to the top of
+the list by rotating the stack.
+<DT><CODE>-n</CODE>
+<DD>Suppresses the normal change of directory when adding directories
+to the stack, so that only the stack is manipulated.
+<DT><CODE><VAR>dir</VAR></CODE>
+<DD>Makes the current working directory be the top of the stack, and then
+executes the equivalent of `<CODE>cd</CODE> <VAR>dir</VAR>'.
+<CODE>cd</CODE>s to <VAR>dir</VAR>.
+</DL>
+<P>
+
+</DL>
+<P>
+
+<A NAME="Printing a Prompt"></A>
+<HR SIZE="6">
+<A NAME="SEC84"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC83"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC85"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.9 Controlling the Prompt </H2>
+<!--docid::SEC84::-->
+<P>
+
+The value of the variable <CODE>PROMPT_COMMAND</CODE> is examined just before
+Bash prints each primary prompt.  If <CODE>PROMPT_COMMAND</CODE> is set and
+has a non-null value, then the
+value is executed just as if it had been typed on the command line.
+</P><P>
+
+In addition, the following table describes the special characters which
+can appear in the prompt variables:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>\a</CODE>
+<DD>A bell character.
+<DT><CODE>\d</CODE>
+<DD>The date, in "Weekday Month Date" format (e.g., "Tue May 26").
+<DT><CODE>\D{<VAR>format</VAR>}</CODE>
+<DD>The <VAR>format</VAR> is passed to <CODE>strftime</CODE>(3) and the result is inserted
+into the prompt string; an empty <VAR>format</VAR> results in a locale-specific
+time representation.  The braces are required.
+<DT><CODE>\e</CODE>
+<DD>An escape character.
+<DT><CODE>\h</CODE>
+<DD>The hostname, up to the first `.'.
+<DT><CODE>\H</CODE>
+<DD>The hostname.
+<DT><CODE>\j</CODE>
+<DD>The number of jobs currently managed by the shell.
+<DT><CODE>\l</CODE>
+<DD>The basename of the shell's terminal device name.
+<DT><CODE>\n</CODE>
+<DD>A newline.
+<DT><CODE>\r</CODE>
+<DD>A carriage return.
+<DT><CODE>\s</CODE>
+<DD>The name of the shell, the basename of <CODE>$0</CODE> (the portion
+following the final slash).
+<DT><CODE>\t</CODE>
+<DD>The time, in 24-hour HH:MM:SS format.
+<DT><CODE>\T</CODE>
+<DD>The time, in 12-hour HH:MM:SS format.
+<DT><CODE>\@</CODE>
+<DD>The time, in 12-hour am/pm format.
+<DT><CODE>\A</CODE>
+<DD>The time, in 24-hour HH:MM format.
+<DT><CODE>\u</CODE>
+<DD>The username of the current user.
+<DT><CODE>\v</CODE>
+<DD>The version of Bash (e.g., 2.00)          
+<DT><CODE>\V</CODE>
+<DD>The release of Bash, version + patchlevel (e.g., 2.00.0)
+<DT><CODE>\w</CODE>
+<DD>The current working directory.
+<DT><CODE>\W</CODE>
+<DD>The basename of <CODE>$PWD</CODE>.
+<DT><CODE>\!</CODE>
+<DD>The history number of this command.
+<DT><CODE>\#</CODE>
+<DD>The command number of this command.
+<DT><CODE>\$</CODE>
+<DD>If the effective uid is 0, <CODE>#</CODE>, otherwise <CODE>$</CODE>.
+<DT><CODE>\<VAR>nnn</VAR></CODE>
+<DD>The character whose ASCII code is the octal value <VAR>nnn</VAR>.
+<DT><CODE>\\</CODE>
+<DD>A backslash.
+<DT><CODE>\[</CODE>
+<DD>Begin a sequence of non-printing characters.  This could be used to
+embed a terminal control sequence into the prompt.
+<DT><CODE>\]</CODE>
+<DD>End a sequence of non-printing characters.
+</DL>
+<P>
+
+The command number and the history number are usually different:
+the history number of a command is its position in the history
+list, which may include commands restored from the history file
+(see section <A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A>), while the command number is
+the position in the sequence of commands executed during the current
+shell session.
+</P><P>
+
+After the string is decoded, it is expanded via
+parameter expansion, command substitution, arithmetic
+expansion, and quote removal, subject to the value of the
+<CODE>promptvars</CODE> shell option (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+</P><P>
+
+<A NAME="The Restricted Shell"></A>
+<HR SIZE="6">
+<A NAME="SEC85"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC84"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC86"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC66"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.10 The Restricted Shell </H2>
+<!--docid::SEC85::-->
+<P>
+
+If Bash is started with the name <CODE>rbash</CODE>, or the
+<SAMP>`--restricted'</SAMP>
+or
+<SAMP>`-r'</SAMP>
+option is supplied at invocation, the shell becomes restricted.
+A restricted shell is used to
+set up an environment more controlled than the standard shell.
+A restricted shell behaves identically to <CODE>bash</CODE>
+with the exception that the following are disallowed or not performed:
+</P><P>
+
+<UL>
+<LI>
+Changing directories with the <CODE>cd</CODE> builtin.
+<LI>
+Setting or unsetting the values of the <CODE>SHELL</CODE>, <CODE>PATH</CODE>,
+<CODE>ENV</CODE>, or <CODE>BASH_ENV</CODE> variables.
+<LI>
+Specifying command names containing slashes.
+<LI>
+Specifying a filename containing a slash as an argument to the <CODE>.</CODE>
+builtin command.
+<LI>
+Specifying a filename containing a slash as an argument to the <SAMP>`-p'</SAMP>
+option to the <CODE>hash</CODE> builtin command.
+<LI>
+Importing function definitions from the shell environment at startup.
+<LI>
+Parsing the value of <CODE>SHELLOPTS</CODE> from the shell environment at startup.
+<LI>
+Redirecting output using the <SAMP>`&#62;'</SAMP>, <SAMP>`&#62;|'</SAMP>, <SAMP>`&#60;&#62;'</SAMP>, <SAMP>`&#62;&#38;'</SAMP>,
+<SAMP>`&#38;&#62;'</SAMP>, and <SAMP>`&#62;&#62;'</SAMP> redirection operators.
+<LI>
+Using the <CODE>exec</CODE> builtin to replace the shell with another command.
+<LI>
+Adding or deleting builtin commands with the
+<SAMP>`-f'</SAMP> and <SAMP>`-d'</SAMP> options to the <CODE>enable</CODE> builtin.
+<LI>
+Using the <CODE>enable</CODE> builtin command to enable disabled shell builtins.
+<LI>
+Specifying the <SAMP>`-p'</SAMP> option to the <CODE>command</CODE> builtin.
+<LI>
+Turning off restricted mode with <SAMP>`set +r'</SAMP> or <SAMP>`set +o restricted'</SAMP>.
+</UL>
+<P>
+
+These restrictions are enforced after any startup files are read.
+</P><P>
+
+When a command that is found to be a shell script is executed
+(see section <A HREF="bashref.html#SEC55">3.8 Shell Scripts</A>), <CODE>rbash</CODE> turns off any restrictions in
+the shell spawned to execute the script.
+</P><P>
+
+<A NAME="Bash POSIX Mode"></A>
+<HR SIZE="6">
+<A NAME="SEC86"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC85"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC66"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC64"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 6.11 Bash POSIX Mode </H2>
+<!--docid::SEC86::-->
+<P>
+
+Starting Bash with the <SAMP>`--posix'</SAMP> command-line option or executing
+<SAMP>`set -o posix'</SAMP> while Bash is running will cause Bash to conform more
+closely to the POSIX 1003.2 standard by changing the behavior to
+match that specified by POSIX in areas where the Bash default differs.
+</P><P>
+
+When invoked as <CODE>sh</CODE>, Bash enters POSIX mode after reading the
+startup files.
+</P><P>
+
+The following list is what's changed when `POSIX mode' is in effect:
+</P><P>
+
+<OL>
+<LI>
+When a command in the hash table no longer exists, Bash will re-search
+<CODE>$PATH</CODE> to find the new location.  This is also available with
+<SAMP>`shopt -s checkhash'</SAMP>.
+<P>
+
+<LI>
+The message printed by the job control code and builtins when a job
+exits with a non-zero status is `Done(status)'.
+<P>
+
+<LI>
+The message printed by the job control code and builtins when a job
+is stopped is `Stopped(<VAR>signame</VAR>)', where <VAR>signame</VAR> is, for
+example, <CODE>SIGTSTP</CODE>.
+<P>
+
+<LI>
+Reserved words may not be aliased.
+<P>
+
+<LI>
+The POSIX 1003.2 <CODE>PS1</CODE> and <CODE>PS2</CODE> expansions of <SAMP>`!'</SAMP> to
+the history number and <SAMP>`!!'</SAMP> to <SAMP>`!'</SAMP> are enabled,
+and parameter expansion is performed on the values of <CODE>PS1</CODE> and
+<CODE>PS2</CODE> regardless of the setting of the <CODE>promptvars</CODE> option.
+<P>
+
+<LI>
+The POSIX 1003.2 startup files are executed (<CODE>$ENV</CODE>) rather than
+the normal Bash files.
+<P>
+
+<LI>
+Tilde expansion is only performed on assignments preceding a command
+name, rather than on all assignment statements on the line.
+<P>
+
+<LI>
+The default history file is <TT>`~/.sh_history'</TT> (this is the
+default value of <CODE>$HISTFILE</CODE>).
+<P>
+
+<LI>
+The output of <SAMP>`kill -l'</SAMP> prints all the signal names on a single line,
+separated by spaces, without the <SAMP>`SIG'</SAMP> prefix.
+<P>
+
+<LI>
+The <CODE>kill</CODE> builtin does not accept signal names with a <SAMP>`SIG'</SAMP>
+prefix.
+<P>
+
+<LI>
+Non-interactive shells exit if <VAR>filename</VAR> in <CODE>.</CODE> <VAR>filename</VAR>
+is not found.
+<P>
+
+<LI>
+Non-interactive shells exit if a syntax error in an arithmetic expansion
+results in an invalid expression.
+<P>
+
+<LI>
+Redirection operators do not perform filename expansion on the word
+in the redirection unless the shell is interactive.
+<P>
+
+<LI>
+Redirection operators do not perform word splitting on the word in the
+redirection.
+<P>
+
+<LI>
+Function names must be valid shell <CODE>name</CODE>s.  That is, they may not
+contain characters other than letters, digits, and underscores, and
+may not start with a digit.  Declaring a function with an invalid name
+causes a fatal syntax error in non-interactive shells.
+<P>
+
+<LI>
+POSIX 1003.2 `special' builtins are found before shell functions
+during command lookup.
+<P>
+
+<LI>
+If a POSIX 1003.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.
+<P>
+
+<LI>
+If the <CODE>cd</CODE> builtin finds a directory to change to
+using <CODE>$CDPATH</CODE>, the
+value it assigns to the <CODE>PWD</CODE> variable does not contain any
+symbolic links, as if <SAMP>`cd -P'</SAMP> had been executed.
+<P>
+
+<LI>
+If <CODE>CDPATH</CODE> is set, the <CODE>cd</CODE> builtin will not implicitly
+append the current directory to it.  This means that <CODE>cd</CODE> will
+fail if no valid directory name can be constructed from
+any of the entries in <CODE>$CDPATH</CODE>, even if the a directory with
+the same name as the name given as an argument to <CODE>cd</CODE> exists
+in the current directory.
+<P>
+
+<LI>
+A non-interactive shell exits with an error status if a variable
+assignment error occurs when no command name follows the assignment
+statements.
+A variable assignment error occurs, for example, when trying to assign
+a value to a readonly variable.
+<P>
+
+<LI>
+A non-interactive shell exits with an error status if the iteration
+variable in a <CODE>for</CODE> statement or the selection variable in a
+<CODE>select</CODE> statement is a readonly variable.
+<P>
+
+<LI>
+Process substitution is not available.
+<P>
+
+<LI>
+Assignment statements preceding POSIX 1003.2 special builtins
+persist in the shell environment after the builtin completes.
+<P>
+
+<LI>
+Assignment statements preceding shell function calls persist in the
+shell environment after the function returns, as if a POSIX
+special builtin command had been executed.
+<P>
+
+<LI>
+The <CODE>export</CODE> and <CODE>readonly</CODE> builtin commands display their
+output in the format required by POSIX 1003.2.
+<P>
+
+<LI>
+The <CODE>trap</CODE> builtin displays signal names without the leading
+<CODE>SIG</CODE>.
+<P>
+
+<LI>
+The <CODE>trap</CODE> builtin doesn't check the first argument for a possible
+signal specification and revert the signal handling to the original
+disposition if it is.  If users want to reset the handler for a given
+signal to the original disposition, they should use <SAMP>`-'</SAMP> as the
+first argument.
+<P>
+
+<LI>
+The <CODE>.</CODE> and <CODE>source</CODE> builtins do not search the current directory
+for the filename argument if it is not found by searching <CODE>PATH</CODE>.
+<P>
+
+<LI>
+Subshells spawned to execute command substitutions inherit the value of
+the <SAMP>`-e'</SAMP> option from the parent shell.  When not in POSIX mode,
+Bash clears the <SAMP>`-e'</SAMP> option in such subshells.
+<P>
+
+<LI>
+Alias expansion is always enabled, even in non-interactive shells.
+<P>
+
+<LI>
+When the <CODE>alias</CODE> builtin displays alias definitions, it does not
+display them with a leading <SAMP>`alias '</SAMP> unless the <SAMP>`-p'</SAMP> option
+is supplied.
+<P>
+
+<LI>
+When the <CODE>set</CODE> builtin is invoked without options, it does not display
+shell function names and definitions.
+<P>
+
+<LI>
+When the <CODE>set</CODE> builtin is invoked without options, it displays
+variable values without quotes, unless they contain shell metacharacters,
+even if the result contains nonprinting characters.
+<P>
+
+<LI>
+When the <CODE>cd</CODE> builtin is invoked in <VAR>logical</VAR> mode, and the pathname
+constructed from <CODE>$PWD</CODE> and the directory name supplied as an argument
+does not refer to an existing directory, <CODE>cd</CODE> will fail instead of
+falling back to <VAR>physical</VAR> mode.
+</OL>
+<P>
+
+There is other POSIX 1003.2 behavior that Bash does not implement.
+Specifically:
+</P><P>
+
+<OL>
+<LI>
+Assignment statements affect the execution environment of all
+builtins, not just special ones.
+<P>
+
+<LI>
+When a subshell is created to execute a shell script with execute permission,
+but without a leading <SAMP>`#!'</SAMP>, Bash sets <CODE>$0</CODE> to the full pathname of
+the script as found by searching <CODE>$PATH</CODE>, rather than the command as
+typed by the user.
+<P>
+
+<LI>
+When using <SAMP>`.'</SAMP> to source a shell script found in <CODE>$PATH</CODE>, bash
+checks execute permission bits rather than read permission bits, just as
+if it were searching for a command.
+<P>
+
+</OL>
+<P>
+
+<A NAME="Job Control"></A>
+<HR SIZE="6">
+<A NAME="SEC87"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC86"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC88"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 7. Job Control </H1>
+<!--docid::SEC87::-->
+<P>
+
+This chapter discusses what job control is, how it works, and how
+Bash allows you to access its facilities.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC88">7.1 Job Control Basics</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How job control works.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Bash builtin commands used to interact
+                               with job control.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC90">7.3 Job Control Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables Bash uses to customize job
+                               control.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Job Control Basics"></A>
+<HR SIZE="6">
+<A NAME="SEC88"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC89"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 7.1 Job Control Basics </H2>
+<!--docid::SEC88::-->
+<P>
+
+Job control
+refers to the ability to selectively stop (suspend)
+the execution of processes and continue (resume)
+their execution at a later point.  A user typically employs
+this facility via an interactive interface supplied jointly
+by the system's terminal driver and Bash.
+</P><P>
+
+The shell associates a <VAR>job</VAR> with each pipeline.  It keeps a
+table of currently executing jobs, which may be listed with the
+<CODE>jobs</CODE> command.  When Bash starts a job
+asynchronously, it prints a line that looks
+like:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>[1] 25647
+</pre></td></tr></table>indicating that this job is job number 1 and that the process ID
+of the last process in the pipeline associated with this job is
+25647.  All of the processes in a single pipeline are members of
+the same job.  Bash uses the <VAR>job</VAR> abstraction as the
+basis for job control. 
+</P><P>
+
+To facilitate the implementation of the user interface to job
+control, the operating system maintains the notion of a current terminal
+process group ID.  Members of this process group (processes whose
+process group ID is equal to the current terminal process group
+ID) receive keyboard-generated signals such as <CODE>SIGINT</CODE>. 
+These processes are said to be in the foreground.  Background
+processes are those whose process group ID differs from the
+terminal's; such processes are immune to keyboard-generated
+signals.  Only foreground processes are allowed to read from or
+write to the terminal.  Background processes which attempt to
+read from (write to) the terminal are sent a <CODE>SIGTTIN</CODE>
+(<CODE>SIGTTOU</CODE>) signal by the terminal driver, which, unless
+caught, suspends the process. 
+</P><P>
+
+If the operating system on which Bash is running supports
+job control, Bash contains facilities to use it.  Typing the
+<VAR>suspend</VAR> character (typically <SAMP>`^Z'</SAMP>, Control-Z) while a
+process is running causes that process to be stopped and returns
+control to Bash.  Typing the <VAR>delayed suspend</VAR> character
+(typically <SAMP>`^Y'</SAMP>, Control-Y) causes the process to be stopped
+when it attempts to read input from the terminal, and control to
+be returned to Bash.  The user then manipulates the state of
+this job, using the <CODE>bg</CODE> command to continue it in the
+background, the <CODE>fg</CODE> command to continue it in the
+foreground, or the <CODE>kill</CODE> command to kill it.  A <SAMP>`^Z'</SAMP>
+takes effect immediately, and has the additional side effect of
+causing pending output and typeahead to be discarded. 
+</P><P>
+
+There are a number of ways to refer to a job in the shell.  The
+character <SAMP>`%'</SAMP> introduces a job name.
+</P><P>
+
+Job number <CODE>n</CODE> may be referred to as <SAMP>`%n'</SAMP>.
+The symbols <SAMP>`%%'</SAMP> and
+<SAMP>`%+'</SAMP> refer to the shell's notion of the current job, which
+is the last job stopped while it was in the foreground or started
+in the background.  The
+previous job may be referenced using <SAMP>`%-'</SAMP>.  In output
+pertaining to jobs (e.g., the output of the <CODE>jobs</CODE> command),
+the current job is always flagged with a <SAMP>`+'</SAMP>, and the
+previous job with a <SAMP>`-'</SAMP>. 
+</P><P>
+
+A job may also be referred to
+using a prefix of the name used to start it, or using a substring
+that appears in its command line.  For example, <SAMP>`%ce'</SAMP> refers
+to a stopped <CODE>ce</CODE> job. Using <SAMP>`%?ce'</SAMP>, on the
+other hand, refers to any job containing the string <SAMP>`ce'</SAMP> in
+its command line.  If the prefix or substring matches more than one job,
+Bash reports an error.
+</P><P>
+
+Simply naming a job can be used to bring it into the foreground:
+<SAMP>`%1'</SAMP> is a synonym for <SAMP>`fg %1'</SAMP>, bringing job 1 from the
+background into the foreground.  Similarly, <SAMP>`%1 &#38;'</SAMP> resumes
+job 1 in the background, equivalent to <SAMP>`bg %1'</SAMP>
+</P><P>
+
+The shell learns immediately whenever a job changes state. 
+Normally, Bash waits until it is about to print a prompt
+before reporting changes in a job's status so as to not interrupt
+any other output.
+If the <SAMP>`-b'</SAMP> option to the <CODE>set</CODE> builtin is enabled,
+Bash reports such changes immediately (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+Any trap on <CODE>SIGCHLD</CODE> is executed for each child process
+that exits.
+</P><P>
+
+If an attempt to exit Bash is while jobs are stopped, the
+shell prints a message warning that there are stopped jobs.
+The <CODE>jobs</CODE> command may then be used to inspect their status.
+If a second attempt to exit is made without an intervening command,
+Bash does not print another warning, and the stopped jobs are terminated.
+</P><P>
+
+<A NAME="Job Control Builtins"></A>
+<HR SIZE="6">
+<A NAME="SEC89"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC88"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC90"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC90"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 7.2 Job Control Builtins </H2>
+<!--docid::SEC89::-->
+<P>
+
+<DL COMPACT>
+
+<DT><CODE>bg</CODE>
+<DD><A NAME="IDX271"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bg [<VAR>jobspec</VAR>]
+</pre></td></tr></table>Resume the suspended job <VAR>jobspec</VAR> in the background, as if it
+had been started with <SAMP>`&#38;'</SAMP>.
+If <VAR>jobspec</VAR> is not supplied, the current job is used.
+The return status is zero unless it is run when job control is not
+enabled, or, when run with job control enabled, if <VAR>jobspec</VAR> was
+not found or <VAR>jobspec</VAR> specifies a job that was started without
+job control.
+<P>
+
+<DT><CODE>fg</CODE>
+<DD><A NAME="IDX272"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>fg [<VAR>jobspec</VAR>]
+</pre></td></tr></table>Resume the job <VAR>jobspec</VAR> in the foreground and make it the current job.
+If <VAR>jobspec</VAR> is not supplied, the current job is used.
+The return status is that of the command placed into the foreground,
+or non-zero if run when job control is disabled or, when run with
+job control enabled, <VAR>jobspec</VAR> does not specify a valid job or
+<VAR>jobspec</VAR> specifies a job that was started without job control.
+<P>
+
+<DT><CODE>jobs</CODE>
+<DD><A NAME="IDX273"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>jobs [-lnprs] [<VAR>jobspec</VAR>]
+jobs -x <VAR>command</VAR> [<VAR>arguments</VAR>]
+</pre></td></tr></table><P>
+
+The first form lists the active jobs.  The options have the
+following meanings:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>-l</CODE>
+<DD>List process IDs in addition to the normal information.
+<P>
+
+<DT><CODE>-n</CODE>
+<DD>Display information only about jobs that have changed status since
+the user was last notified of their status.
+<P>
+
+<DT><CODE>-p</CODE>
+<DD>List only the process ID of the job's process group leader.
+<P>
+
+<DT><CODE>-r</CODE>
+<DD>Restrict output to running jobs.
+<P>
+
+<DT><CODE>-s</CODE>
+<DD>Restrict output to stopped jobs.
+</DL>
+<P>
+
+If <VAR>jobspec</VAR> is given,
+output is restricted to information about that job. 
+If <VAR>jobspec</VAR> is not supplied, the status of all jobs is
+listed.
+</P><P>
+
+If the <SAMP>`-x'</SAMP> option is supplied, <CODE>jobs</CODE> replaces any
+<VAR>jobspec</VAR> found in <VAR>command</VAR> or <VAR>arguments</VAR> with the
+corresponding process group ID, and executes <VAR>command</VAR>,
+passing it <VAR>argument</VAR>s, returning its exit status. 
+</P><P>
+
+<DT><CODE>kill</CODE>
+<DD><A NAME="IDX274"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>kill [-s <VAR>sigspec</VAR>] [-n <VAR>signum</VAR>] [-<VAR>sigspec</VAR>] <VAR>jobspec</VAR> or <VAR>pid</VAR>
+kill -l [<VAR>exit_status</VAR>]
+</pre></td></tr></table>Send a signal specified by <VAR>sigspec</VAR> or <VAR>signum</VAR> to the process
+named by job specification <VAR>jobspec</VAR> or process ID <VAR>pid</VAR>.
+<VAR>sigspec</VAR> is either a signal name such as <CODE>SIGINT</CODE> (with or without
+the <CODE>SIG</CODE> prefix) or a signal number; <VAR>signum</VAR> is a signal number.
+If <VAR>sigspec</VAR> and <VAR>signum</VAR> are not present, <CODE>SIGTERM</CODE> is used.
+The <SAMP>`-l'</SAMP> option lists the signal names.
+If any arguments are supplied when <SAMP>`-l'</SAMP> is given, the names of the
+signals corresponding to the arguments are listed, and the return status
+is zero.
+<VAR>exit_status</VAR> is a number specifying a signal number or the exit
+status of a process terminated by a signal.
+The return status is zero if at least one signal was successfully sent,
+or non-zero if an error occurs or an invalid option is encountered.
+<P>
+
+<DT><CODE>wait</CODE>
+<DD><A NAME="IDX275"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>wait [<VAR>jobspec</VAR> or <VAR>pid</VAR>]
+</pre></td></tr></table>Wait until the child process specified by process ID <VAR>pid</VAR> or job
+specification <VAR>jobspec</VAR> exits and return the exit status of the last
+command waited for.
+If a job spec is given, all processes in the job are waited for.
+If no arguments are given, all currently active child processes are
+waited for, and the return status is zero.
+If neither <VAR>jobspec</VAR> nor <VAR>pid</VAR> specifies an active child process
+of the shell, the return status is 127.
+<P>
+
+<DT><CODE>disown</CODE>
+<DD><A NAME="IDX276"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>disown [-ar] [-h] [<VAR>jobspec</VAR> <small>...</small>]
+</pre></td></tr></table>Without options, each <VAR>jobspec</VAR> is removed from the table of
+active jobs.
+If the <SAMP>`-h'</SAMP> option is given, the job is not removed from the table,
+but is marked so that <CODE>SIGHUP</CODE> is not sent to the job if the shell
+receives a <CODE>SIGHUP</CODE>.
+If <VAR>jobspec</VAR> is not present, and neither the <SAMP>`-a'</SAMP> nor <SAMP>`-r'</SAMP>
+option is supplied, the current job is used.
+If no <VAR>jobspec</VAR> is supplied, the <SAMP>`-a'</SAMP> option means to remove or
+mark all jobs; the <SAMP>`-r'</SAMP> option without a <VAR>jobspec</VAR>
+argument restricts operation to running jobs.
+<P>
+
+<DT><CODE>suspend</CODE>
+<DD><A NAME="IDX277"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>suspend [-f]
+</pre></td></tr></table>Suspend the execution of this shell until it receives a
+<CODE>SIGCONT</CODE> signal.  The <SAMP>`-f'</SAMP> option means to suspend
+even if the shell is a login shell.
+<P>
+
+</DL>
+<P>
+
+When job control is not active, the <CODE>kill</CODE> and <CODE>wait</CODE>
+builtins do not accept <VAR>jobspec</VAR> arguments.  They must be
+supplied process IDs.
+</P><P>
+
+<A NAME="Job Control Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC90"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC89"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC87"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 7.3 Job Control Variables </H2>
+<!--docid::SEC90::-->
+<P>
+
+<DL COMPACT>
+
+<A NAME="IDX278"></A>
+<DT><CODE>auto_resume</CODE>
+<DD><A NAME="IDX279"></A>
+This variable controls how the shell interacts with the user and
+job control.  If this variable exists then single word simple
+commands without redirections are treated as candidates for resumption
+of an existing job.  There is no ambiguity allowed; if there is
+more than one job beginning with the string typed, then
+the most recently accessed job will be selected.
+The name of a stopped job, in this context, is the command line
+used to start it.  If this variable is set to the value <SAMP>`exact'</SAMP>,
+the string supplied must match the name of a stopped job exactly;
+if set to <SAMP>`substring'</SAMP>,
+the string supplied needs to match a substring of the name of a
+stopped job.  The <SAMP>`substring'</SAMP> value provides functionality
+analogous to the <SAMP>`%?'</SAMP> job ID (see section <A HREF="bashref.html#SEC88">7.1 Job Control Basics</A>).
+If set to any other value, the supplied string must
+be a prefix of a stopped job's name; this provides functionality
+analogous to the <SAMP>`%'</SAMP> job ID.
+<P>
+
+</DL>
+<P>
+
+<A NAME="IDX280"></A>
+</P><P>
+
+<A NAME="Command Line Editing"></A>
+<HR SIZE="6">
+<A NAME="SEC91"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC90"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC92"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 8. Command Line Editing </H1>
+<!--docid::SEC91::-->
+<P>
+
+This chapter describes the basic features of the GNU
+command line editing interface.
+Command line editing is provided by the Readline library, which is
+used by several different programs, including Bash.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC92">8.1 Introduction to Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Notation used in this text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC93">8.2 Readline Interaction</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The minimum set of commands for editing a line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC99">8.3 Readline Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Customizing Readline from a user's view.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC103">8.4 Bindable Readline Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A description of most of the Readline commands
+                               available for binding</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC112">8.5 Readline vi Mode</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A short description of how to make Readline
+                               behave like the vi editor.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC113">8.6 Programmable Completion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to specify the possible completions for
+                               a specific command.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Builtin commands to specify how to
+                               complete arguments for a particular command.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Introduction and Notation"></A>
+<HR SIZE="6">
+<A NAME="SEC92"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC93"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 8.1 Introduction to Line Editing </H2>
+<!--docid::SEC92::-->
+<P>
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+</P><P>
+
+The text <KBD>C-k</KBD> is read as `Control-K' and describes the character
+produced when the <KBD>k</KBD> key is pressed while the Control key
+is depressed.
+</P><P>
+
+The text <KBD>M-k</KBD> is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <KBD>k</KBD>
+key is pressed.
+The Meta key is labeled <KBD>ALT</KBD> on many keyboards.
+On keyboards with two keys labeled <KBD>ALT</KBD> (usually to either side of
+the space bar), the <KBD>ALT</KBD> on the left side is generally set to
+work as a Meta key.
+The <KBD>ALT</KBD> key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+</P><P>
+
+If you do not have a Meta or <KBD>ALT</KBD> key, or another key working as
+a Meta key, the identical keystroke can be generated by typing <KBD>ESC</KBD>
+<EM>first</EM>, and then typing <KBD>k</KBD>.
+Either process is known as <EM>metafying</EM> the <KBD>k</KBD> key.
+</P><P>
+
+The text <KBD>M-C-k</KBD> is read as `Meta-Control-k' and describes the
+character produced by <EM>metafying</EM> <KBD>C-k</KBD>.
+</P><P>
+
+In addition, several keys have their own names.  Specifically,
+<KBD>DEL</KBD>, <KBD>ESC</KBD>, <KBD>LFD</KBD>, <KBD>SPC</KBD>, <KBD>RET</KBD>, and <KBD>TAB</KBD> all
+stand for themselves when seen in this text, or in an init file
+(see section <A HREF="bashref.html#SEC99">8.3 Readline Init File</A>).
+If your keyboard lacks a <KBD>LFD</KBD> key, typing <KBD>C-j</KBD> will
+produce the desired character.
+The <KBD>RET</KBD> key may be labeled <KBD>Return</KBD> or <KBD>Enter</KBD> on
+some keyboards.
+</P><P>
+
+<A NAME="Readline Interaction"></A>
+<HR SIZE="6">
+<A NAME="SEC93"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC92"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC94"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 8.2 Readline Interaction </H2>
+<!--docid::SEC93::-->
+<P>
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <KBD>RET</KBD>.  You do not have to be at the
+end of the line to press <KBD>RET</KBD>; the entire line is accepted
+regardless of the location of the cursor within the line.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC94">8.2.1 Readline Bare Essentials</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The least you need to know about Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC95">8.2.2 Readline Movement Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the input line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC96">8.2.3 Readline Killing Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to delete text, and how to get it back!</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC97">8.2.4 Readline Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Giving numeric arguments to commands.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC98">8.2.5 Searching for Commands in the History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Searching through previous lines.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Bare Essentials"></A>
+<HR SIZE="6">
+<A NAME="SEC94"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC93"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC95"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC93"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.2.1 Readline Bare Essentials </H3>
+<!--docid::SEC94::-->
+<P>
+
+In order to enter characters into the line, simply type them.  The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+</P><P>
+
+Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters.  In
+that case, you can type <KBD>C-b</KBD> to move the cursor to the left, and then
+correct your mistake.  Afterwards, you can move the cursor to the right
+with <KBD>C-f</KBD>.
+</P><P>
+
+When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are `pushed over' to make room for the text
+that you have inserted.  Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are `pulled back' to fill in the
+blank space created by the removal of the text.  A list of the bare
+essentials for editing the text of an input line follows.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-b</KBD>
+<DD>Move back one character.
+<DT><KBD>C-f</KBD>
+<DD>Move forward one character.
+<DT><KBD>DEL</KBD> or <KBD>Backspace</KBD>
+<DD>Delete the character to the left of the cursor.
+<DT><KBD>C-d</KBD>
+<DD>Delete the character underneath the cursor.
+<DT>Printing characters
+<DD>Insert the character into the line at the cursor.
+<DT><KBD>C-_</KBD> or <KBD>C-x C-u</KBD>
+<DD>Undo the last editing command.  You can undo all the way back to an
+empty line.
+</DL>
+<P>
+
+(Depending on your configuration, the <KBD>Backspace</KBD> key be set to
+delete the character to the left of the cursor and the <KBD>DEL</KBD> key set
+to delete the character underneath the cursor, like <KBD>C-d</KBD>, rather
+than the character to the left of the cursor.)
+</P><P>
+
+<A NAME="Readline Movement Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC95"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC94"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC96"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC96"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC93"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.2.2 Readline Movement Commands </H3>
+<!--docid::SEC95::-->
+<P>
+
+The above table describes the most basic keystrokes that you need
+in order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to <KBD>C-b</KBD>, <KBD>C-f</KBD>,
+<KBD>C-d</KBD>, and <KBD>DEL</KBD>.  Here are some commands for moving more rapidly
+about the line.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-a</KBD>
+<DD>Move to the start of the line.
+<DT><KBD>C-e</KBD>
+<DD>Move to the end of the line.
+<DT><KBD>M-f</KBD>
+<DD>Move forward a word, where a word is composed of letters and digits.
+<DT><KBD>M-b</KBD>
+<DD>Move backward a word.
+<DT><KBD>C-l</KBD>
+<DD>Clear the screen, reprinting the current line at the top.
+</DL>
+<P>
+
+Notice how <KBD>C-f</KBD> moves forward a character, while <KBD>M-f</KBD> moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+</P><P>
+
+<A NAME="Readline Killing Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC96"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC95"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC97"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC97"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC93"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.2.3 Readline Killing Commands </H3>
+<!--docid::SEC96::-->
+<P>
+
+<A NAME="IDX281"></A>
+<A NAME="IDX282"></A>
+</P><P>
+
+<EM>Killing</EM> text means to delete the text from the line, but to save
+it away for later use, usually by <EM>yanking</EM> (re-inserting)
+it back into the line.
+(`Cut' and `paste' are more recent jargon for `kill' and `yank'.)
+</P><P>
+
+If the description for a command says that it `kills' text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+</P><P>
+
+When you use a kill command, the text is saved in a <EM>kill-ring</EM>.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+<A NAME="IDX283"></A>
+</P><P>
+
+Here is the list of commands for killing text.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-k</KBD>
+<DD>Kill the text from the current cursor position to the end of the line.
+<P>
+
+<DT><KBD>M-d</KBD>
+<DD>Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by <KBD>M-f</KBD>.
+<P>
+
+<DT><KBD>M-<KBD>DEL</KBD></KBD>
+<DD>Kill from the cursor the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by <KBD>M-b</KBD>.
+<P>
+
+<DT><KBD>C-w</KBD>
+<DD>Kill from the cursor to the previous whitespace.  This is different than
+<KBD>M-<KBD>DEL</KBD></KBD> because the word boundaries differ.
+<P>
+
+</DL>
+<P>
+
+Here is how to <EM>yank</EM> the text back into the line.  Yanking
+means to copy the most-recently-killed text from the kill buffer.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-y</KBD>
+<DD>Yank the most recently killed text back into the buffer at the cursor.
+<P>
+
+<DT><KBD>M-y</KBD>
+<DD>Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <KBD>C-y</KBD> or <KBD>M-y</KBD>.
+</DL>
+<P>
+
+<A NAME="Readline Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC97"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC96"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC98"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC98"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC93"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.2.4 Readline Arguments </H3>
+<!--docid::SEC97::-->
+<P>
+
+You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the <I>sign</I> of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type <SAMP>`M-- C-k'</SAMP>.
+</P><P>
+
+The general way to pass numeric arguments to a command is to type meta
+digits before the command.  If the first `digit' typed is a minus
+sign (<SAMP>`-'</SAMP>), then the sign of the argument will be negative.  Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command.  For example, to give
+the <KBD>C-d</KBD> command an argument of 10, you could type <SAMP>`M-1 0 C-d'</SAMP>,
+which will delete the next ten characters on the input line.
+</P><P>
+
+<A NAME="Searching"></A>
+<HR SIZE="6">
+<A NAME="SEC98"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC97"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC93"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.2.5 Searching for Commands in the History </H3>
+<!--docid::SEC98::-->
+<P>
+
+Readline provides commands for searching through the command history
+(see section <A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A>)
+for lines containing a specified string.
+There are two search modes:  <EM>incremental</EM> and <EM>non-incremental</EM>.
+</P><P>
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+<KBD>C-r</KBD>.  Typing <KBD>C-s</KBD> searches forward through the history.
+The characters present in the value of the <CODE>isearch-terminators</CODE> variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the <KBD>ESC</KBD> and
+<KBD>C-J</KBD> characters will terminate an incremental search.
+<KBD>C-g</KBD> will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+</P><P>
+
+To find other matching entries in the history list, type <KBD>C-r</KBD> or
+<KBD>C-s</KBD> as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a <KBD>RET</KBD> will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+</P><P>
+
+Readline remembers the last incremental search string.  If two
+<KBD>C-r</KBD>s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+</P><P>
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+</P><P>
+
+<A NAME="Readline Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC99"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC98"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC100"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 8.3 Readline Init File </H2>
+<!--docid::SEC99::-->
+<P>
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an <EM>inputrc</EM> file, conventionally in his home directory.
+The name of this
+file is taken from the value of the shell variable <CODE>INPUTRC</CODE>.  If
+that variable is unset, the default is <TT>`~/.inputrc'</TT>.
+</P><P>
+
+When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+</P><P>
+
+In addition, the <CODE>C-x C-r</CODE> command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Syntax for the commands in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC101">8.3.2 Conditional Init Constructs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Conditional key bindings in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC102">8.3.3 Sample Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example inputrc file.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Init File Syntax"></A>
+<HR SIZE="6">
+<A NAME="SEC100"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC101"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.3.1 Readline Init File Syntax </H3>
+<!--docid::SEC100::-->
+<P>
+
+There are only a few basic constructs allowed in the
+Readline init file.  Blank lines are ignored.
+Lines beginning with a <SAMP>`#'</SAMP> are comments.
+Lines beginning with a <SAMP>`$'</SAMP> indicate conditional
+constructs (see section <A HREF="bashref.html#SEC101">8.3.2 Conditional Init Constructs</A>).  Other lines
+denote variable settings and key bindings.
+</P><P>
+
+<DL COMPACT>
+<DT>Variable Settings
+<DD>You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the <CODE>set</CODE> command within the init file.
+The syntax is simple:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set <VAR>variable</VAR> <VAR>value</VAR>
+</pre></td></tr></table></P><P>
+
+Here, for example, is how to
+change from the default Emacs-like key binding to use
+<CODE>vi</CODE> line editing commands:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set editing-mode vi
+</pre></td></tr></table></P><P>
+
+Variable names and values, where appropriate, are recognized without regard
+to case. 
+</P><P>
+
+The <CODE>bind -V</CODE> command lists the current Readline variable names
+and values.  See section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>.
+</P><P>
+
+A great deal of run-time behavior is changeable with the following
+variables.
+</P><P>
+
+<A NAME="IDX284"></A>
+<DL COMPACT>
+
+<DT><CODE>bell-style</CODE>
+<DD><A NAME="IDX285"></A>
+Controls what happens when Readline wants to ring the terminal bell.
+If set to <SAMP>`none'</SAMP>, Readline never rings the bell.  If set to
+<SAMP>`visible'</SAMP>, Readline uses a visible bell if one is available.
+If set to <SAMP>`audible'</SAMP> (the default), Readline attempts to ring
+the terminal's bell.
+<P>
+
+<DT><CODE>comment-begin</CODE>
+<DD><A NAME="IDX286"></A>
+The string to insert at the beginning of the line when the
+<CODE>insert-comment</CODE> command is executed.  The default value
+is <CODE>"#"</CODE>.
+<P>
+
+<DT><CODE>completion-ignore-case</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>completion-query-items</CODE>
+<DD><A NAME="IDX287"></A>
+The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than this value,
+Readline will ask the user whether or not he wishes to view
+them; otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to 0.
+The default limit is <CODE>100</CODE>.
+<P>
+
+<DT><CODE>convert-meta</CODE>
+<DD><A NAME="IDX288"></A>
+If set to <SAMP>`on'</SAMP>, Readline will convert characters with the
+eighth bit set to an ASCII key sequence by stripping the eighth
+bit and prefixing an <KBD>ESC</KBD> character, converting them to a
+meta-prefixed key sequence.  The default value is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>disable-completion</CODE>
+<DD><A NAME="IDX289"></A>
+If set to <SAMP>`On'</SAMP>, Readline will inhibit word completion.
+Completion  characters will be inserted into the line as if they had
+been mapped to <CODE>self-insert</CODE>.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>editing-mode</CODE>
+<DD><A NAME="IDX290"></A>
+The <CODE>editing-mode</CODE> variable controls which default set of
+key bindings is used.  By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs.  This variable can be
+set to either <SAMP>`emacs'</SAMP> or <SAMP>`vi'</SAMP>.
+<P>
+
+<DT><CODE>enable-keypad</CODE>
+<DD><A NAME="IDX291"></A>
+When set to <SAMP>`on'</SAMP>, Readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>expand-tilde</CODE>
+<DD><A NAME="IDX292"></A>
+If set to <SAMP>`on'</SAMP>, tilde expansion is performed when Readline
+attempts word completion.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<A NAME="IDX293"></A>
+If set to <SAMP>`on'</SAMP>, the history code attempts to place point at the
+same location on each history line retrieved with <CODE>previous-history</CODE>
+or <CODE>next-history</CODE>.
+</P><P>
+
+<DT><CODE>horizontal-scroll-mode</CODE>
+<DD><A NAME="IDX294"></A>
+This variable can be set to either <SAMP>`on'</SAMP> or <SAMP>`off'</SAMP>.  Setting it
+to <SAMP>`on'</SAMP> means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.  By default,
+this variable is set to <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>input-meta</CODE>
+<DD><A NAME="IDX295"></A>
+<A NAME="IDX296"></A>
+If set to <SAMP>`on'</SAMP>, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support.  The
+default value is <SAMP>`off'</SAMP>.  The name <CODE>meta-flag</CODE> is a
+synonym for this variable.
+<P>
+
+<DT><CODE>isearch-terminators</CODE>
+<DD><A NAME="IDX297"></A>
+The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (see section <A HREF="bashref.html#SEC98">8.2.5 Searching for Commands in the History</A>).
+If this variable has not been given a value, the characters <KBD>ESC</KBD> and
+<KBD>C-J</KBD> will terminate an incremental search.
+<P>
+
+<DT><CODE>keymap</CODE>
+<DD><A NAME="IDX298"></A>
+Sets Readline's idea of the current keymap for key binding commands.
+Acceptable <CODE>keymap</CODE> names are
+<CODE>emacs</CODE>,
+<CODE>emacs-standard</CODE>,
+<CODE>emacs-meta</CODE>,
+<CODE>emacs-ctlx</CODE>,
+<CODE>vi</CODE>,
+<CODE>vi-move</CODE>,
+<CODE>vi-command</CODE>, and
+<CODE>vi-insert</CODE>.
+<CODE>vi</CODE> is equivalent to <CODE>vi-command</CODE>; <CODE>emacs</CODE> is
+equivalent to <CODE>emacs-standard</CODE>.  The default value is <CODE>emacs</CODE>.
+The value of the <CODE>editing-mode</CODE> variable also affects the
+default keymap.
+<P>
+
+<DT><CODE>mark-directories</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, completed directory names have a slash
+appended.  The default is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>mark-modified-lines</CODE>
+<DD><A NAME="IDX299"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to display an
+asterisk (<SAMP>`*'</SAMP>) at the start of history lines which have been modified.
+This variable is <SAMP>`off'</SAMP> by default.
+<P>
+
+<DT><CODE>mark-symlinked-directories</CODE>
+<DD><A NAME="IDX300"></A>
+If set to <SAMP>`on'</SAMP>, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+<CODE>mark-directories</CODE>).
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>match-hidden-files</CODE>
+<DD><A NAME="IDX301"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to match files whose
+names begin with a <SAMP>`.'</SAMP> (hidden files) when performing filename
+completion, unless the leading <SAMP>`.'</SAMP> is
+supplied by the user in the filename to be completed.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>output-meta</CODE>
+<DD><A NAME="IDX302"></A>
+If set to <SAMP>`on'</SAMP>, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>page-completions</CODE>
+<DD><A NAME="IDX303"></A>
+If set to <SAMP>`on'</SAMP>, Readline uses an internal <CODE>more</CODE>-like pager
+to display a screenful of possible completions at a time.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>print-completions-horizontally</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-ambiguous</CODE>
+<DD><A NAME="IDX304"></A>
+This alters the default behavior of the completion functions.  If
+set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-unmodified</CODE>
+<DD><A NAME="IDX305"></A>
+This alters the default behavior of the completion functions in
+a fashion similar to <VAR>show-all-if-ambiguous</VAR>.
+If set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>visible-stats</CODE>
+<DD><A NAME="IDX306"></A>
+If set to <SAMP>`on'</SAMP>, a character denoting a file's type
+is appended to the filename when listing possible
+completions.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+</DL>
+<P>
+
+<DT>Key Bindings
+<DD>The syntax for controlling key bindings in the init file is
+simple.  First you need to find the name of the command that you
+want to change.  The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+<P>
+
+Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.  The name of the key
+can be expressed in different ways, depending on what you find most
+comfortable.
+</P><P>
+
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a <VAR>macro</VAR>).
+</P><P>
+
+The <CODE>bind -p</CODE> command displays Readline function names and
+bindings in a format that can put directly into an initialization file.
+See section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>.
+</P><P>
+
+<DL COMPACT>
+<DT><VAR>keyname</VAR>: <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyname</VAR> is the name of a key spelled out in English.  For example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "&#62; output"
+</pre></td></tr></table><P>
+
+In the above example, <KBD>C-u</KBD> is bound to the function
+<CODE>universal-argument</CODE>,
+<KBD>M-DEL</KBD> is bound to the function <CODE>backward-kill-word</CODE>, and
+<KBD>C-o</KBD> is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+<SAMP>`&#62; output'</SAMP> into the line).
+</P><P>
+
+A number of symbolic character names are recognized while
+processing this key binding syntax:
+<VAR>DEL</VAR>,
+<VAR>ESC</VAR>,
+<VAR>ESCAPE</VAR>,
+<VAR>LFD</VAR>,
+<VAR>NEWLINE</VAR>,
+<VAR>RET</VAR>,
+<VAR>RETURN</VAR>,
+<VAR>RUBOUT</VAR>,
+<VAR>SPACE</VAR>,
+<VAR>SPC</VAR>,
+and
+<VAR>TAB</VAR>.
+</P><P>
+
+<DT>"<VAR>keyseq</VAR>": <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyseq</VAR> differs from <VAR>keyname</VAR> above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes.  Some GNU Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+</pre></td></tr></table></P><P>
+
+In the above example, <KBD>C-u</KBD> is again bound to the function
+<CODE>universal-argument</CODE> (just as it was in the first example),
+<SAMP>`<KBD>C-x</KBD> <KBD>C-r</KBD>'</SAMP> is bound to the function <CODE>re-read-init-file</CODE>,
+and <SAMP>`<KBD>ESC</KBD> <KBD>[</KBD> <KBD>1</KBD> <KBD>1</KBD> <KBD>~</KBD>'</SAMP> is bound to insert
+the text <SAMP>`Function Key 1'</SAMP>.
+</P><P>
+
+</DL>
+<P>
+
+The following GNU Emacs style escape sequences are available when
+specifying key sequences:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE><KBD>\C-</KBD></CODE>
+<DD>control prefix
+<DT><CODE><KBD>\M-</KBD></CODE>
+<DD>meta prefix
+<DT><CODE><KBD>\e</KBD></CODE>
+<DD>an escape character
+<DT><CODE><KBD>\\</KBD></CODE>
+<DD>backslash
+<DT><CODE><KBD>\"</KBD></CODE>
+<DD><KBD>"</KBD>, a double quotation mark
+<DT><CODE><KBD>\'</KBD></CODE>
+<DD><KBD>'</KBD>, a single quote or apostrophe
+</DL>
+<P>
+
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>\a</CODE>
+<DD>alert (bell)
+<DT><CODE>\b</CODE>
+<DD>backspace
+<DT><CODE>\d</CODE>
+<DD>delete
+<DT><CODE>\f</CODE>
+<DD>form feed
+<DT><CODE>\n</CODE>
+<DD>newline
+<DT><CODE>\r</CODE>
+<DD>carriage return
+<DT><CODE>\t</CODE>
+<DD>horizontal tab
+<DT><CODE>\v</CODE>
+<DD>vertical tab
+<DT><CODE>\<VAR>nnn</VAR></CODE>
+<DD>the eight-bit character whose value is the octal value <VAR>nnn</VAR>
+(one to three digits)
+<DT><CODE>\x<VAR>HH</VAR></CODE>
+<DD>the eight-bit character whose value is the hexadecimal value <VAR>HH</VAR>
+(one or two hex digits)
+</DL>
+<P>
+
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including <SAMP>`"'</SAMP> and <SAMP>`''</SAMP>.
+For example, the following binding will make <SAMP>`<KBD>C-x</KBD> \'</SAMP>
+insert a single <SAMP>`\'</SAMP> into the line:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-x\\": "\\"
+</pre></td></tr></table></P><P>
+
+</DL>
+<P>
+
+<A NAME="Conditional Init Constructs"></A>
+<HR SIZE="6">
+<A NAME="SEC101"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC100"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC102"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC102"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.3.2 Conditional Init Constructs </H3>
+<!--docid::SEC101::-->
+<P>
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>$if</CODE>
+<DD>The <CODE>$if</CODE> construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+<P>
+
+<DL COMPACT>
+<DT><CODE>mode</CODE>
+<DD>The <CODE>mode=</CODE> form of the <CODE>$if</CODE> directive is used to test
+whether Readline is in <CODE>emacs</CODE> or <CODE>vi</CODE> mode.
+This may be used in conjunction
+with the <SAMP>`set keymap'</SAMP> command, for instance, to set bindings in
+the <CODE>emacs-standard</CODE> and <CODE>emacs-ctlx</CODE> keymaps only if
+Readline is starting out in <CODE>emacs</CODE> mode.
+<P>
+
+<DT><CODE>term</CODE>
+<DD>The <CODE>term=</CODE> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+<SAMP>`='</SAMP> is tested against both the full name of the terminal and
+the portion of the terminal name before the first <SAMP>`-'</SAMP>.  This
+allows <CODE>sun</CODE> to match both <CODE>sun</CODE> and <CODE>sun-cmd</CODE>,
+for instance.
+<P>
+
+<DT><CODE>application</CODE>
+<DD>The <VAR>application</VAR> construct is used to include
+application-specific settings.  Each program using the Readline
+library sets the <VAR>application name</VAR>, and you can test for
+a particular value. 
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+</pre></td></tr></table></DL>
+<P>
+
+<DT><CODE>$endif</CODE>
+<DD>This command, as seen in the previous example, terminates an
+<CODE>$if</CODE> command.
+<P>
+
+<DT><CODE>$else</CODE>
+<DD>Commands in this branch of the <CODE>$if</CODE> directive are executed if
+the test fails.
+<P>
+
+<DT><CODE>$include</CODE>
+<DD>This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from <TT>`/etc/inputrc'</TT>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$include /etc/inputrc
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Sample Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC102"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC101"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC99"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.3.3 Sample Init File </H3>
+<!--docid::SEC102::-->
+<P>
+
+Here is an example of an <VAR>inputrc</VAR> file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre># This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any systemwide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs 
+
+$if mode=emacs
+
+Meta-Control-h:        backward-kill-word      Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD":        backward-char
+#"\M-OC":        forward-char
+#"\M-OA":        previous-history
+#"\M-OB":        next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D":        backward-char
+"\M-[C":        forward-char
+"\M-[A":        previous-history
+"\M-[B":        next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD":       backward-char
+#"\M-\C-OC":       forward-char
+#"\M-\C-OA":       previous-history
+#"\M-\C-OB":       next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D":       backward-char
+#"\M-\C-[C":       forward-char
+#"\M-\C-[A":       previous-history
+#"\M-\C-[B":       next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding.  This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are more than 150 possible completions for
+# a word, ask the user if he wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+</pre></td></tr></table></P><P>
+
+<A NAME="Bindable Readline Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC103"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC102"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC104"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 8.4 Bindable Readline Commands </H2>
+<!--docid::SEC103::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting at previous lines.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for changing text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for killing and yanking.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC108">8.4.5 Specifying Numeric Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Specifying numeric arguments, repeat counts.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting Readline to do the typing for you.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC110">8.4.7 Keyboard Macros</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Saving and re-executing typed characters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Other miscellaneous commands.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+This section describes Readline commands that may be bound to key
+sequences.
+You can list your key bindings by executing
+<CODE>bind -P</CODE> or, for a more terse format, suitable for an
+<VAR>inputrc</VAR> file, <CODE>bind -p</CODE>.  (See section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>.)
+Command names without an accompanying key sequence are unbound by default.
+</P><P>
+
+In the following descriptions, <EM>point</EM> refers to the current cursor
+position, and <EM>mark</EM> refers to a cursor position saved by the
+<CODE>set-mark</CODE> command.
+The text between the point and mark is referred to as the <EM>region</EM>.
+</P><P>
+
+<A NAME="Commands For Moving"></A>
+<HR SIZE="6">
+<A NAME="SEC104"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC105"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.4.1 Commands For Moving </H3>
+<!--docid::SEC104::-->
+<DL COMPACT>
+<A NAME="IDX307"></A>
+<DT><CODE>beginning-of-line (C-a)</CODE>
+<DD><A NAME="IDX308"></A>
+Move to the start of the current line.
+<P>
+
+<A NAME="IDX309"></A>
+<DT><CODE>end-of-line (C-e)</CODE>
+<DD><A NAME="IDX310"></A>
+Move to the end of the line.
+<P>
+
+<A NAME="IDX311"></A>
+<DT><CODE>forward-char (C-f)</CODE>
+<DD><A NAME="IDX312"></A>
+Move forward a character.
+<P>
+
+<A NAME="IDX313"></A>
+<DT><CODE>backward-char (C-b)</CODE>
+<DD><A NAME="IDX314"></A>
+Move back a character.
+<P>
+
+<A NAME="IDX315"></A>
+<DT><CODE>forward-word (M-f)</CODE>
+<DD><A NAME="IDX316"></A>
+Move forward to the end of the next word.  Words are composed of
+letters and digits.
+<P>
+
+<A NAME="IDX317"></A>
+<DT><CODE>backward-word (M-b)</CODE>
+<DD><A NAME="IDX318"></A>
+Move back to the start of the current or previous word.  Words are
+composed of letters and digits.
+<P>
+
+<A NAME="IDX319"></A>
+<DT><CODE>clear-screen (C-l)</CODE>
+<DD><A NAME="IDX320"></A>
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+<P>
+
+<A NAME="IDX321"></A>
+<DT><CODE>redraw-current-line ()</CODE>
+<DD><A NAME="IDX322"></A>
+Refresh the current line.  By default, this is unbound.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For History"></A>
+<HR SIZE="6">
+<A NAME="SEC105"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC104"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC106"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC106"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.4.2 Commands For Manipulating The History </H3>
+<!--docid::SEC105::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX323"></A>
+<DT><CODE>accept-line (Newline or Return)</CODE>
+<DD><A NAME="IDX324"></A>
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, add it to the history list according to the setting of
+the <CODE>HISTCONTROL</CODE> and <CODE>HISTIGNORE</CODE> variables.
+If this line is a modified history line, then restore the history line
+to its original state.
+<P>
+
+<A NAME="IDX325"></A>
+<DT><CODE>previous-history (C-p)</CODE>
+<DD><A NAME="IDX326"></A>
+Move `back' through the history list, fetching the previous command.
+<P>
+
+<A NAME="IDX327"></A>
+<DT><CODE>next-history (C-n)</CODE>
+<DD><A NAME="IDX328"></A>
+Move `forward' through the history list, fetching the next command.
+<P>
+
+<A NAME="IDX329"></A>
+<DT><CODE>beginning-of-history (M-&#60;)</CODE>
+<DD><A NAME="IDX330"></A>
+Move to the first line in the history.
+<P>
+
+<A NAME="IDX331"></A>
+<DT><CODE>end-of-history (M-&#62;)</CODE>
+<DD><A NAME="IDX332"></A>
+Move to the end of the input history, i.e., the line currently
+being entered.
+<P>
+
+<A NAME="IDX333"></A>
+<DT><CODE>reverse-search-history (C-r)</CODE>
+<DD><A NAME="IDX334"></A>
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX335"></A>
+<DT><CODE>forward-search-history (C-s)</CODE>
+<DD><A NAME="IDX336"></A>
+Search forward starting at the current line and moving `down' through
+the the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX337"></A>
+<DT><CODE>non-incremental-reverse-search-history (M-p)</CODE>
+<DD><A NAME="IDX338"></A>
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX339"></A>
+<DT><CODE>non-incremental-forward-search-history (M-n)</CODE>
+<DD><A NAME="IDX340"></A>
+Search forward starting at the current line and moving `down'
+through the the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX341"></A>
+<DT><CODE>history-search-forward ()</CODE>
+<DD><A NAME="IDX342"></A>
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX343"></A>
+<DT><CODE>history-search-backward ()</CODE>
+<DD><A NAME="IDX344"></A>
+Search backward through the history for the string of characters
+between the start of the current line and the point.  This
+is a non-incremental search.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX345"></A>
+<DT><CODE>yank-nth-arg (M-C-y)</CODE>
+<DD><A NAME="IDX346"></A>
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument <VAR>n</VAR>,
+insert the <VAR>n</VAR>th word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the <VAR>n</VAR>th word from the end of the previous command.
+<P>
+
+<A NAME="IDX347"></A>
+<DT><CODE>yank-last-arg (M-. or M-_)</CODE>
+<DD><A NAME="IDX348"></A>
+Insert last argument to the previous command (the last word of the
+previous history entry).  With an
+argument, behave exactly like <CODE>yank-nth-arg</CODE>.
+Successive calls to <CODE>yank-last-arg</CODE> move back through the history
+list, inserting the last argument of each line in turn.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Text"></A>
+<HR SIZE="6">
+<A NAME="SEC106"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC105"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC107"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC107"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.4.3 Commands For Changing Text </H3>
+<!--docid::SEC106::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX349"></A>
+<DT><CODE>delete-char (C-d)</CODE>
+<DD><A NAME="IDX350"></A>
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to <CODE>delete-char</CODE>, then
+return EOF.
+<P>
+
+<A NAME="IDX351"></A>
+<DT><CODE>backward-delete-char (Rubout)</CODE>
+<DD><A NAME="IDX352"></A>
+Delete the character behind the cursor.  A numeric argument means
+to kill the characters instead of deleting them.
+<P>
+
+<A NAME="IDX353"></A>
+<DT><CODE>forward-backward-delete-char ()</CODE>
+<DD><A NAME="IDX354"></A>
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.  By default, this is not bound to a key.
+<P>
+
+<A NAME="IDX355"></A>
+<DT><CODE>quoted-insert (C-q or C-v)</CODE>
+<DD><A NAME="IDX356"></A>
+Add the next character typed to the line verbatim.  This is
+how to insert key sequences like <KBD>C-q</KBD>, for example.
+<P>
+
+<A NAME="IDX357"></A>
+<DT><CODE>self-insert (a, b, A, 1, !, <small>...</small>)</CODE>
+<DD><A NAME="IDX358"></A>
+Insert yourself.
+<P>
+
+<A NAME="IDX359"></A>
+<DT><CODE>transpose-chars (C-t)</CODE>
+<DD><A NAME="IDX360"></A>
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well.  If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+<P>
+
+<A NAME="IDX361"></A>
+<DT><CODE>transpose-words (M-t)</CODE>
+<DD><A NAME="IDX362"></A>
+Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+<P>
+
+<A NAME="IDX363"></A>
+<DT><CODE>upcase-word (M-u)</CODE>
+<DD><A NAME="IDX364"></A>
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX365"></A>
+<DT><CODE>downcase-word (M-l)</CODE>
+<DD><A NAME="IDX366"></A>
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX367"></A>
+<DT><CODE>capitalize-word (M-c)</CODE>
+<DD><A NAME="IDX368"></A>
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX369"></A>
+<DT><CODE>overwrite-mode ()</CODE>
+<DD><A NAME="IDX370"></A>
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+<CODE>emacs</CODE> mode; <CODE>vi</CODE> mode does overwrite differently.
+Each call to <CODE>readline()</CODE> starts in insert mode.
+<P>
+
+In overwrite mode, characters bound to <CODE>self-insert</CODE> replace
+the text at point rather than pushing the text to the right.
+Characters bound to <CODE>backward-delete-char</CODE> replace the character
+before point with a space.
+</P><P>
+
+By default, this command is unbound.
+</P><P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Killing"></A>
+<HR SIZE="6">
+<A NAME="SEC107"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC106"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC108"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC108"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.4.4 Killing And Yanking </H3>
+<!--docid::SEC107::-->
+<P>
+
+<DL COMPACT>
+
+<A NAME="IDX371"></A>
+<DT><CODE>kill-line (C-k)</CODE>
+<DD><A NAME="IDX372"></A>
+Kill the text from point to the end of the line.
+<P>
+
+<A NAME="IDX373"></A>
+<DT><CODE>backward-kill-line (C-x Rubout)</CODE>
+<DD><A NAME="IDX374"></A>
+Kill backward to the beginning of the line.
+<P>
+
+<A NAME="IDX375"></A>
+<DT><CODE>unix-line-discard (C-u)</CODE>
+<DD><A NAME="IDX376"></A>
+Kill backward from the cursor to the beginning of the current line.
+<P>
+
+<A NAME="IDX377"></A>
+<DT><CODE>kill-whole-line ()</CODE>
+<DD><A NAME="IDX378"></A>
+Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+<P>
+
+<A NAME="IDX379"></A>
+<DT><CODE>kill-word (M-d)</CODE>
+<DD><A NAME="IDX380"></A>
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as <CODE>forward-word</CODE>.
+<P>
+
+<A NAME="IDX381"></A>
+<DT><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE>
+<DD><A NAME="IDX382"></A>
+Kill the word behind point.
+Word boundaries are the same as <CODE>backward-word</CODE>.
+<P>
+
+<A NAME="IDX383"></A>
+<DT><CODE>unix-word-rubout (C-w)</CODE>
+<DD><A NAME="IDX384"></A>
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+<P>
+
+<A NAME="IDX385"></A>
+<DT><CODE>delete-horizontal-space ()</CODE>
+<DD><A NAME="IDX386"></A>
+Delete all spaces and tabs around point.  By default, this is unbound.
+<P>
+
+<A NAME="IDX387"></A>
+<DT><CODE>kill-region ()</CODE>
+<DD><A NAME="IDX388"></A>
+Kill the text in the current region.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX389"></A>
+<DT><CODE>copy-region-as-kill ()</CODE>
+<DD><A NAME="IDX390"></A>
+Copy the text in the region to the kill buffer, so it can be yanked
+right away.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX391"></A>
+<DT><CODE>copy-backward-word ()</CODE>
+<DD><A NAME="IDX392"></A>
+Copy the word before point to the kill buffer.
+The word boundaries are the same as <CODE>backward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX393"></A>
+<DT><CODE>copy-forward-word ()</CODE>
+<DD><A NAME="IDX394"></A>
+Copy the word following point to the kill buffer.
+The word boundaries are the same as <CODE>forward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX395"></A>
+<DT><CODE>yank (C-y)</CODE>
+<DD><A NAME="IDX396"></A>
+Yank the top of the kill ring into the buffer at point.
+<P>
+
+<A NAME="IDX397"></A>
+<DT><CODE>yank-pop (M-y)</CODE>
+<DD><A NAME="IDX398"></A>
+Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <CODE>yank</CODE> or <CODE>yank-pop</CODE>.
+</DL>
+<P>
+
+<A NAME="Numeric Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC108"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC107"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC109"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC109"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.4.5 Specifying Numeric Arguments </H3>
+<!--docid::SEC108::-->
+<DL COMPACT>
+
+<A NAME="IDX399"></A>
+<DT><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, <small>...</small> <KBD>M--</KBD>)</CODE>
+<DD><A NAME="IDX400"></A>
+Add this digit to the argument already accumulating, or start a new
+argument.  <KBD>M--</KBD> starts a negative argument.
+<P>
+
+<A NAME="IDX401"></A>
+<DT><CODE>universal-argument ()</CODE>
+<DD><A NAME="IDX402"></A>
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing <CODE>universal-argument</CODE>
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+</DL>
+<P>
+
+<A NAME="Commands For Completion"></A>
+<HR SIZE="6">
+<A NAME="SEC109"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC108"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC110"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC110"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.4.6 Letting Readline Type For You </H3>
+<!--docid::SEC109::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX403"></A>
+<DT><CODE>complete (<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX404"></A>
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+Bash attempts completion treating the text as a variable (if the
+text begins with <SAMP>`$'</SAMP>), username (if the text begins with
+<SAMP>`~'</SAMP>), hostname (if the text begins with <SAMP>`@'</SAMP>), or
+command (including aliases and functions) in turn.  If none 
+of these produces a match, filename completion is attempted.
+<P>
+
+<A NAME="IDX405"></A>
+<DT><CODE>possible-completions (M-?)</CODE>
+<DD><A NAME="IDX406"></A>
+List the possible completions of the text before point.
+<P>
+
+<A NAME="IDX407"></A>
+<DT><CODE>insert-completions (M-*)</CODE>
+<DD><A NAME="IDX408"></A>
+Insert all completions of the text before point that would have
+been generated by <CODE>possible-completions</CODE>.
+<P>
+
+<A NAME="IDX409"></A>
+<DT><CODE>menu-complete ()</CODE>
+<DD><A NAME="IDX410"></A>
+Similar to <CODE>complete</CODE>, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of <CODE>menu-complete</CODE> steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of <CODE>bell-style</CODE>)
+and the original text is restored.
+An argument of <VAR>n</VAR> moves <VAR>n</VAR> positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to <KBD>TAB</KBD>, but is unbound
+by default.
+<P>
+
+<A NAME="IDX411"></A>
+<DT><CODE>delete-char-or-list ()</CODE>
+<DD><A NAME="IDX412"></A>
+Deletes the character under the cursor if not at the beginning or
+end of the line (like <CODE>delete-char</CODE>).
+If at the end of the line, behaves identically to
+<CODE>possible-completions</CODE>.
+This command is unbound by default.
+<P>
+
+<A NAME="IDX413"></A>
+<DT><CODE>complete-filename (M-/)</CODE>
+<DD><A NAME="IDX414"></A>
+Attempt filename completion on the text before point.
+<P>
+
+<A NAME="IDX415"></A>
+<DT><CODE>possible-filename-completions (C-x /)</CODE>
+<DD><A NAME="IDX416"></A>
+List the possible completions of the text before point,
+treating it as a filename.
+<P>
+
+<A NAME="IDX417"></A>
+<DT><CODE>complete-username (M-~)</CODE>
+<DD><A NAME="IDX418"></A>
+Attempt completion on the text before point, treating
+it as a username.
+<P>
+
+<A NAME="IDX419"></A>
+<DT><CODE>possible-username-completions (C-x ~)</CODE>
+<DD><A NAME="IDX420"></A>
+List the possible completions of the text before point,
+treating it as a username.
+<P>
+
+<A NAME="IDX421"></A>
+<DT><CODE>complete-variable (M-$)</CODE>
+<DD><A NAME="IDX422"></A>
+Attempt completion on the text before point, treating
+it as a shell variable.
+<P>
+
+<A NAME="IDX423"></A>
+<DT><CODE>possible-variable-completions (C-x $)</CODE>
+<DD><A NAME="IDX424"></A>
+List the possible completions of the text before point,
+treating it as a shell variable.
+<P>
+
+<A NAME="IDX425"></A>
+<DT><CODE>complete-hostname (M-@)</CODE>
+<DD><A NAME="IDX426"></A>
+Attempt completion on the text before point, treating
+it as a hostname.
+<P>
+
+<A NAME="IDX427"></A>
+<DT><CODE>possible-hostname-completions (C-x @)</CODE>
+<DD><A NAME="IDX428"></A>
+List the possible completions of the text before point,
+treating it as a hostname.
+<P>
+
+<A NAME="IDX429"></A>
+<DT><CODE>complete-command (M-!)</CODE>
+<DD><A NAME="IDX430"></A>
+Attempt completion on the text before point, treating
+it as a command name.  Command completion attempts to
+match the text against aliases, reserved words, shell
+functions, shell builtins, and finally executable filenames,
+in that order.
+<P>
+
+<A NAME="IDX431"></A>
+<DT><CODE>possible-command-completions (C-x !)</CODE>
+<DD><A NAME="IDX432"></A>
+List the possible completions of the text before point,
+treating it as a command name.
+<P>
+
+<A NAME="IDX433"></A>
+<DT><CODE>dynamic-complete-history (M-<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX434"></A>
+Attempt completion on the text before point, comparing
+the text against lines from the history list for possible
+completion matches.
+<P>
+
+<A NAME="IDX435"></A>
+<DT><CODE>complete-into-braces (M-{)</CODE>
+<DD><A NAME="IDX436"></A>
+Perform filename completion and insert the list of possible completions
+enclosed within braces so the list is available to the shell
+(see section <A HREF="bashref.html#SEC28">3.5.1 Brace Expansion</A>).
+<P>
+
+</DL>
+<P>
+
+<A NAME="Keyboard Macros"></A>
+<HR SIZE="6">
+<A NAME="SEC110"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC109"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC111"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC111"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.4.7 Keyboard Macros </H3>
+<!--docid::SEC110::-->
+<DL COMPACT>
+
+<A NAME="IDX437"></A>
+<DT><CODE>start-kbd-macro (C-x ()</CODE>
+<DD><A NAME="IDX438"></A>
+Begin saving the characters typed into the current keyboard macro.
+<P>
+
+<A NAME="IDX439"></A>
+<DT><CODE>end-kbd-macro (C-x ))</CODE>
+<DD><A NAME="IDX440"></A>
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+<P>
+
+<A NAME="IDX441"></A>
+<DT><CODE>call-last-kbd-macro (C-x e)</CODE>
+<DD><A NAME="IDX442"></A>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Miscellaneous Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC111"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC110"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC103"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 8.4.8 Some Miscellaneous Commands </H3>
+<!--docid::SEC111::-->
+<DL COMPACT>
+
+<A NAME="IDX443"></A>
+<DT><CODE>re-read-init-file (C-x C-r)</CODE>
+<DD><A NAME="IDX444"></A>
+Read in the contents of the <VAR>inputrc</VAR> file, and incorporate
+any bindings or variable assignments found there.
+<P>
+
+<A NAME="IDX445"></A>
+<DT><CODE>abort (C-g)</CODE>
+<DD><A NAME="IDX446"></A>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<CODE>bell-style</CODE>).
+<P>
+
+<A NAME="IDX447"></A>
+<DT><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, <small>...</small>)</CODE>
+<DD><A NAME="IDX448"></A>
+If the metafied character <VAR>x</VAR> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+<P>
+
+<A NAME="IDX449"></A>
+<DT><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE>
+<DD><A NAME="IDX450"></A>
+Metafy the next character typed.  This is for keyboards
+without a meta key.  Typing <SAMP>`<KBD>ESC</KBD> f'</SAMP> is equivalent to typing
+<KBD>M-f</KBD>.
+<P>
+
+<A NAME="IDX451"></A>
+<DT><CODE>undo (C-_ or C-x C-u)</CODE>
+<DD><A NAME="IDX452"></A>
+Incremental undo, separately remembered for each line.
+<P>
+
+<A NAME="IDX453"></A>
+<DT><CODE>revert-line (M-r)</CODE>
+<DD><A NAME="IDX454"></A>
+Undo all changes made to this line.  This is like executing the <CODE>undo</CODE>
+command enough times to get back to the beginning.
+<P>
+
+<A NAME="IDX455"></A>
+<DT><CODE>tilde-expand (M-&#38;)</CODE>
+<DD><A NAME="IDX456"></A>
+Perform tilde expansion on the current word.
+<P>
+
+<A NAME="IDX457"></A>
+<DT><CODE>set-mark (C-@)</CODE>
+<DD><A NAME="IDX458"></A>
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+<P>
+
+<A NAME="IDX459"></A>
+<DT><CODE>exchange-point-and-mark (C-x C-x)</CODE>
+<DD><A NAME="IDX460"></A>
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+<P>
+
+<A NAME="IDX461"></A>
+<DT><CODE>character-search (C-])</CODE>
+<DD><A NAME="IDX462"></A>
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+<P>
+
+<A NAME="IDX463"></A>
+<DT><CODE>character-search-backward (M-C-])</CODE>
+<DD><A NAME="IDX464"></A>
+A character is read and point is moved to the previous occurrence
+of that character.  A negative count searches for subsequent
+occurrences.
+<P>
+
+<A NAME="IDX465"></A>
+<DT><CODE>insert-comment (M-#)</CODE>
+<DD><A NAME="IDX466"></A>
+Without a numeric argument, the value of the <CODE>comment-begin</CODE>
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value
+of <CODE>comment-begin</CODE>, the value is inserted, otherwise
+the characters in <CODE>comment-begin</CODE> are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+The default value of <CODE>comment-begin</CODE> causes this command
+to make the current line a shell comment.
+If a numeric argument causes the comment character to be removed, the line
+will be executed by the shell.
+<P>
+
+<A NAME="IDX467"></A>
+<DT><CODE>dump-functions ()</CODE>
+<DD><A NAME="IDX468"></A>
+Print all of the functions and their key bindings to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX469"></A>
+<DT><CODE>dump-variables ()</CODE>
+<DD><A NAME="IDX470"></A>
+Print all of the settable variables and their values to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX471"></A>
+<DT><CODE>dump-macros ()</CODE>
+<DD><A NAME="IDX472"></A>
+Print all of the Readline key sequences bound to macros and the
+strings they output.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX473"></A>
+<DT><CODE>glob-complete-word (M-g)</CODE>
+<DD><A NAME="IDX474"></A>
+The word before point is treated as a pattern for pathname expansion,
+with an asterisk implicitly appended.  This pattern is used to
+generate a list of matching file names for possible completions.
+<P>
+
+<A NAME="IDX475"></A>
+<DT><CODE>glob-expand-word (C-x *)</CODE>
+<DD><A NAME="IDX476"></A>
+The word before point is treated as a pattern for pathname expansion,
+and the list of matching file names is inserted, replacing the word.
+If a numeric argument is supplied, a <SAMP>`*'</SAMP> is appended before
+pathname expansion.
+<P>
+
+<A NAME="IDX477"></A>
+<DT><CODE>glob-list-expansions (C-x g)</CODE>
+<DD><A NAME="IDX478"></A>
+The list of expansions that would have been generated by
+<CODE>glob-expand-word</CODE> is displayed, and the line is redrawn.
+If a numeric argument is supplied, a <SAMP>`*'</SAMP> is appended before
+pathname expansion.
+<P>
+
+<A NAME="IDX479"></A>
+<DT><CODE>display-shell-version (C-x C-v)</CODE>
+<DD><A NAME="IDX480"></A>
+Display version information about the current instance of Bash.
+<P>
+
+<A NAME="IDX481"></A>
+<DT><CODE>shell-expand-line (M-C-e)</CODE>
+<DD><A NAME="IDX482"></A>
+Expand the line as the shell does.
+This performs alias and history expansion as well as all of the shell
+word expansions (see section <A HREF="bashref.html#SEC27">3.5 Shell Expansions</A>).
+<P>
+
+<A NAME="IDX483"></A>
+<DT><CODE>history-expand-line (M-^)</CODE>
+<DD><A NAME="IDX484"></A>
+Perform history expansion on the current line.
+<P>
+
+<A NAME="IDX485"></A>
+<DT><CODE>magic-space ()</CODE>
+<DD><A NAME="IDX486"></A>
+Perform history expansion on the current line and insert a space
+(see section <A HREF="bashref.html#SEC118">9.3 History Expansion</A>).
+<P>
+
+<A NAME="IDX487"></A>
+<DT><CODE>alias-expand-line ()</CODE>
+<DD><A NAME="IDX488"></A>
+Perform alias expansion on the current line (see section <A HREF="bashref.html#SEC80">6.6 Aliases</A>).
+<P>
+
+<A NAME="IDX489"></A>
+<DT><CODE>history-and-alias-expand-line ()</CODE>
+<DD><A NAME="IDX490"></A>
+Perform history and alias expansion on the current line.
+<P>
+
+<A NAME="IDX491"></A>
+<DT><CODE>insert-last-argument (M-. or M-_)</CODE>
+<DD><A NAME="IDX492"></A>
+A synonym for <CODE>yank-last-arg</CODE>.
+<P>
+
+<A NAME="IDX493"></A>
+<DT><CODE>operate-and-get-next (C-o)</CODE>
+<DD><A NAME="IDX494"></A>
+Accept the current line for execution and fetch the next line
+relative to the current line from the history for editing.  Any
+argument is ignored.
+<P>
+
+<A NAME="IDX495"></A>
+<DT><CODE>edit-and-execute-command (C-xC-e)</CODE>
+<DD><A NAME="IDX496"></A>
+Invoke an editor on the current command line, and execute the result as shell
+commands.
+Bash attempts to invoke
+<CODE>$FCEDIT</CODE>, <CODE>$EDITOR</CODE>, and <CODE>emacs</CODE>
+as the editor, in that order.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Readline vi Mode"></A>
+<HR SIZE="6">
+<A NAME="SEC112"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC111"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC113"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC113"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 8.5 Readline vi Mode </H2>
+<!--docid::SEC112::-->
+<P>
+
+While the Readline library does not have a full set of <CODE>vi</CODE>
+editing functions, it does contain enough to allow simple editing
+of the line.  The Readline <CODE>vi</CODE> mode behaves as specified in
+the POSIX 1003.2 standard.
+</P><P>
+
+In order to switch interactively between <CODE>emacs</CODE> and <CODE>vi</CODE>
+editing modes, use the <SAMP>`set -o emacs'</SAMP> and <SAMP>`set -o vi'</SAMP>
+commands (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+The Readline default is <CODE>emacs</CODE> mode.
+</P><P>
+
+When you enter a line in <CODE>vi</CODE> mode, you are already placed in
+`insertion' mode, as if you had typed an <SAMP>`i'</SAMP>.  Pressing <KBD>ESC</KBD>
+switches you into `command' mode, where you can edit the text of the
+line with the standard <CODE>vi</CODE> movement keys, move to previous
+history lines with <SAMP>`k'</SAMP> and subsequent lines with <SAMP>`j'</SAMP>, and
+so forth.
+</P><P>
+
+<A NAME="Programmable Completion"></A>
+<HR SIZE="6">
+<A NAME="SEC113"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC112"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC114"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC114"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 8.6 Programmable Completion </H2>
+<!--docid::SEC113::-->
+<P>
+
+When word completion is attempted for an argument to a command for
+which a completion specification (a <VAR>compspec</VAR>) has been defined
+using the <CODE>complete</CODE> builtin (see section <A HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A>),
+the programmable completion facilities are invoked. 
+</P><P>
+
+First, the command name is identified.
+If a compspec has been defined for that command, the
+compspec is used to generate the list of possible completions for the word.
+If the command word is a full pathname, a compspec for the full
+pathname is searched for first.
+If no compspec is found for the full pathname, an attempt is made to
+find a compspec for the portion following the final slash.
+</P><P>
+
+Once a compspec has been found, it is used to generate the list of
+matching words.
+If a compspec is not found, the default Bash completion
+described above (see section <A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A>) is performed.
+</P><P>
+
+First, the actions specified by the compspec are used.
+Only matches which are prefixed by the word being completed are
+returned.
+When the <SAMP>`-f'</SAMP> or <SAMP>`-d'</SAMP> option is used for filename or
+directory name completion, the shell variable <CODE>FIGNORE</CODE> is
+used to filter the matches.
+See section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>, for a description of <CODE>FIGNORE</CODE>.
+</P><P>
+
+Any completions specified by a filename expansion pattern to the
+<SAMP>`-G'</SAMP> option are generated next.
+The words generated by the pattern need not match the word being completed.
+The <CODE>GLOBIGNORE</CODE> shell variable is not used to filter the matches,
+but the <CODE>FIGNORE</CODE> shell variable is used.
+</P><P>
+
+Next, the string specified as the argument to the <SAMP>`-W'</SAMP> option
+is considered.
+The string is first split using the characters in the <CODE>IFS</CODE>
+special variable as delimiters.
+Shell quoting is honored.
+Each word is then expanded using
+brace expansion, tilde expansion, parameter and variable expansion,
+command substitution, arithmetic expansion, and pathname expansion,
+as described above (see section <A HREF="bashref.html#SEC27">3.5 Shell Expansions</A>).
+The results are split using the rules described above
+(see section <A HREF="bashref.html#SEC34">3.5.7 Word Splitting</A>).
+The results of the expansion are prefix-matched against the word being
+completed, and the matching words become the possible completions.
+</P><P>
+
+After these matches have been generated, any shell function or command
+specified with the <SAMP>`-F'</SAMP> and <SAMP>`-C'</SAMP> options is invoked.
+When the command or function is invoked, the <CODE>COMP_LINE</CODE> and
+<CODE>COMP_POINT</CODE> variables are assigned values as described above
+(see section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>).
+If a shell function is being invoked, the <CODE>COMP_WORDS</CODE> and
+<CODE>COMP_CWORD</CODE> variables are also set.
+When the function or command is invoked, the first argument is the
+name of the command whose arguments are being completed, the
+second argument is the word being completed, and the third argument
+is the word preceding the word being completed on the current command line.
+No filtering of the generated completions against the word being completed
+is performed; the function or command has complete freedom in generating
+the matches.
+</P><P>
+
+Any function specified with <SAMP>`-F'</SAMP> is invoked first.
+The function may use any of the shell facilities, including the
+<CODE>compgen</CODE> builtin described below
+(see section <A HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A>), to generate the matches.
+It must put the possible completions in the <CODE>COMPREPLY</CODE> array
+variable.
+</P><P>
+
+Next, any command specified with the <SAMP>`-C'</SAMP> option is invoked
+in an environment equivalent to command substitution.
+It should print a list of completions, one per line, to
+the standard output.
+Backslash may be used to escape a newline, if necessary.
+</P><P>
+
+After all of the possible completions are generated, any filter
+specified with the <SAMP>`-X'</SAMP> option is applied to the list.
+The filter is a pattern as used for pathname expansion; a <SAMP>`&#38;'</SAMP>
+in the pattern is replaced with the text of the word being completed.
+A literal <SAMP>`&#38;'</SAMP> may be escaped with a backslash; the backslash
+is removed before attempting a match.
+Any completion that matches the pattern will be removed from the list.
+A leading <SAMP>`!'</SAMP> negates the pattern; in this case any completion
+not matching the pattern will be removed.
+</P><P>
+
+Finally, any prefix and suffix specified with the <SAMP>`-P'</SAMP> and <SAMP>`-S'</SAMP>
+options are added to each member of the completion list, and the result is
+returned to the Readline completion code as the list of possible
+completions.
+</P><P>
+
+If the previously-applied actions do not generate any matches, and the
+<SAMP>`-o dirnames'</SAMP> option was supplied to <CODE>complete</CODE> when the
+compspec was defined, directory name completion is attempted. 
+</P><P>
+
+If the <SAMP>`-o plusdirs'</SAMP> option was supplied to <CODE>complete</CODE> when
+the compspec was defined, directory name completion is attempted and any
+matches are added to the results of the other actions.
+</P><P>
+
+By default, if a compspec is found, whatever it generates is returned to
+the completion code as the full set of possible completions.
+The default Bash completions are not attempted, and the Readline default
+of filename completion is disabled.
+If the <SAMP>`-o bashdefault'</SAMP> option was supplied to <CODE>complete</CODE> when
+the compspec was defined, the default Bash completions are attempted
+if the compspec generates no matches.
+If the <SAMP>`-o default'</SAMP> option was supplied to <CODE>complete</CODE> when the
+compspec was defined, Readline's default completion will be performed
+if the compspec (and, if attempted, the default Bash completions)
+generate no matches.
+</P><P>
+
+When a compspec indicates that directory name completion is desired,
+the programmable completion functions force Readline to append a slash
+to completed names which are symbolic links to directories, subject to
+the value of the <VAR>mark-directories</VAR> Readline variable, regardless
+of the setting of the <VAR>mark-symlinked-directories</VAR> Readline variable.
+</P><P>
+
+<A NAME="Programmable Completion Builtins"></A>
+<HR SIZE="6">
+<A NAME="SEC114"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC113"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC91"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 8.7 Programmable Completion Builtins </H2>
+<!--docid::SEC114::-->
+<P>
+
+Two builtin commands are available to manipulate the programmable completion
+facilities.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>compgen</CODE>
+<DD><A NAME="IDX497"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>compgen [<VAR>option</VAR>] [<VAR>word</VAR>]</CODE>
+</pre></td></tr></table><P>
+
+Generate possible completion matches for <VAR>word</VAR> according to
+the <VAR>option</VAR>s, which may be any option accepted by the
+<CODE>complete</CODE>
+builtin with the exception of <SAMP>`-p'</SAMP> and <SAMP>`-r'</SAMP>, and write
+the matches to the standard output.
+When using the <SAMP>`-F'</SAMP> or <SAMP>`-C'</SAMP> options, the various shell variables
+set by the programmable completion facilities, while available, will not
+have useful values.
+</P><P>
+
+The matches will be generated in the same way as if the programmable
+completion code had generated them directly from a completion specification
+with the same flags.
+If <VAR>word</VAR> is specified, only those completions matching <VAR>word</VAR>
+will be displayed.
+</P><P>
+
+The return value is true unless an invalid option is supplied, or no
+matches were generated.
+</P><P>
+
+<DT><CODE>complete</CODE>
+<DD><A NAME="IDX498"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>complete [-abcdefgjksuv] [-o <VAR>comp-option</VAR>] [-A <VAR>action</VAR>] [-G <VAR>globpat</VAR>] [-W <VAR>wordlist</VAR>]
+[-P <VAR>prefix</VAR>] [-S <VAR>suffix</VAR>] [-X <VAR>filterpat</VAR>] [-F <VAR>function</VAR>]
+[-C <VAR>command</VAR>] <VAR>name</VAR> [<VAR>name</VAR> <small>...</small>]</CODE>
+<CODE>complete -pr [<VAR>name</VAR> <small>...</small>]</CODE>
+</pre></td></tr></table><P>
+
+Specify how arguments to each <VAR>name</VAR> should be completed.
+If the <SAMP>`-p'</SAMP> option is supplied, or if no options are supplied, existing
+completion specifications are printed in a way that allows them to be
+reused as input.
+The <SAMP>`-r'</SAMP> option removes a completion specification for
+each <VAR>name</VAR>, or, if no <VAR>name</VAR>s are supplied, all
+completion specifications.
+</P><P>
+
+The process of applying these completion specifications when word completion
+is attempted is described above (see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>).
+</P><P>
+
+Other options, if specified, have the following meanings.
+The arguments to the <SAMP>`-G'</SAMP>, <SAMP>`-W'</SAMP>, and <SAMP>`-X'</SAMP> options
+(and, if necessary, the <SAMP>`-P'</SAMP> and <SAMP>`-S'</SAMP> options)
+should be quoted to protect them from expansion before the
+<CODE>complete</CODE> builtin is invoked.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>-o <VAR>comp-option</VAR></CODE>
+<DD>The <VAR>comp-option</VAR> controls several aspects of the compspec's behavior
+beyond the simple generation of completions.
+<VAR>comp-option</VAR> may be one of: 
+<P>
+
+<DL COMPACT>
+
+<DT><CODE>bashdefault</CODE>
+<DD>Perform the rest of the default Bash completions if the compspec
+generates no matches.
+<P>
+
+<DT><CODE>default</CODE>
+<DD>Use Readline's default filename completion if the compspec generates
+no matches.
+<P>
+
+<DT><CODE>dirnames</CODE>
+<DD>Perform directory name completion if the compspec generates no matches.
+<P>
+
+<DT><CODE>filenames</CODE>
+<DD>Tell Readline that the compspec generates filenames, so it can perform any
+filename-specific processing (like adding a slash to directory names or
+suppressing trailing spaces).  This option is intended to be used with
+shell functions specified with <SAMP>`-F'</SAMP>.
+<P>
+
+<DT><CODE>nospace</CODE>
+<DD>Tell Readline not to append a space (the default) to words completed at
+the end of the line.
+</DL>
+<P>
+
+<DT><CODE>-A <VAR>action</VAR></CODE>
+<DD>The <VAR>action</VAR> may be one of the following to generate a list of possible
+completions:
+<P>
+
+<DL COMPACT>
+<DT><CODE>alias</CODE>
+<DD>Alias names.  May also be specified as <SAMP>`-a'</SAMP>.
+<P>
+
+<DT><CODE>arrayvar</CODE>
+<DD>Array variable names.
+<P>
+
+<DT><CODE>binding</CODE>
+<DD>Readline key binding names (see section <A HREF="bashref.html#SEC103">8.4 Bindable Readline Commands</A>).
+<P>
+
+<DT><CODE>builtin</CODE>
+<DD>Names of shell builtin commands.  May also be specified as <SAMP>`-b'</SAMP>.
+<P>
+
+<DT><CODE>command</CODE>
+<DD>Command names.  May also be specified as <SAMP>`-c'</SAMP>.
+<P>
+
+<DT><CODE>directory</CODE>
+<DD>Directory names.  May also be specified as <SAMP>`-d'</SAMP>.
+<P>
+
+<DT><CODE>disabled</CODE>
+<DD>Names of disabled shell builtins.
+<P>
+
+<DT><CODE>enabled</CODE>
+<DD>Names of enabled shell builtins.
+<P>
+
+<DT><CODE>export</CODE>
+<DD>Names of exported shell variables.  May also be specified as <SAMP>`-e'</SAMP>.
+<P>
+
+<DT><CODE>file</CODE>
+<DD>File names.  May also be specified as <SAMP>`-f'</SAMP>.
+<P>
+
+<DT><CODE>function</CODE>
+<DD>Names of shell functions.
+<P>
+
+<DT><CODE>group</CODE>
+<DD>Group names.  May also be specified as <SAMP>`-g'</SAMP>.
+<P>
+
+<DT><CODE>helptopic</CODE>
+<DD>Help topics as accepted by the <CODE>help</CODE> builtin (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<DT><CODE>hostname</CODE>
+<DD>Hostnames, as taken from the file specified by the
+<CODE>HOSTFILE</CODE> shell variable (see section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>).
+<P>
+
+<DT><CODE>job</CODE>
+<DD>Job names, if job control is active.  May also be specified as <SAMP>`-j'</SAMP>.
+<P>
+
+<DT><CODE>keyword</CODE>
+<DD>Shell reserved words.  May also be specified as <SAMP>`-k'</SAMP>.
+<P>
+
+<DT><CODE>running</CODE>
+<DD>Names of running jobs, if job control is active.
+<P>
+
+<DT><CODE>service</CODE>
+<DD>Service names.  May also be specified as <SAMP>`-s'</SAMP>.
+<P>
+
+<DT><CODE>setopt</CODE>
+<DD>Valid arguments for the <SAMP>`-o'</SAMP> option to the <CODE>set</CODE> builtin
+(see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+<P>
+
+<DT><CODE>shopt</CODE>
+<DD>Shell option names as accepted by the <CODE>shopt</CODE> builtin
+(see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<DT><CODE>signal</CODE>
+<DD>Signal names.
+<P>
+
+<DT><CODE>stopped</CODE>
+<DD>Names of stopped jobs, if job control is active.
+<P>
+
+<DT><CODE>user</CODE>
+<DD>User names.  May also be specified as <SAMP>`-u'</SAMP>.
+<P>
+
+<DT><CODE>variable</CODE>
+<DD>Names of all shell variables.  May also be specified as <SAMP>`-v'</SAMP>.
+</DL>
+<P>
+
+<DT><CODE>-G <VAR>globpat</VAR></CODE>
+<DD>The filename expansion pattern <VAR>globpat</VAR> is expanded to generate
+the possible completions.
+<P>
+
+<DT><CODE>-W <VAR>wordlist</VAR></CODE>
+<DD>The <VAR>wordlist</VAR> is split using the characters in the
+<CODE>IFS</CODE> special variable as delimiters, and each resultant word
+is expanded.
+The possible completions are the members of the resultant list which
+match the word being completed.
+<P>
+
+<DT><CODE>-C <VAR>command</VAR></CODE>
+<DD><VAR>command</VAR> is executed in a subshell environment, and its output is
+used as the possible completions.
+<P>
+
+<DT><CODE>-F <VAR>function</VAR></CODE>
+<DD>The shell function <VAR>function</VAR> is executed in the current shell
+environment.
+When it finishes, the possible completions are retrieved from the value
+of the <CODE>COMPREPLY</CODE> array variable.
+<P>
+
+<DT><CODE>-X <VAR>filterpat</VAR></CODE>
+<DD><VAR>filterpat</VAR> is a pattern as used for filename expansion.
+It is applied to the list of possible completions generated by the
+preceding options and arguments, and each completion matching
+<VAR>filterpat</VAR> is removed from the list.
+A leading <SAMP>`!'</SAMP> in <VAR>filterpat</VAR> negates the pattern; in this
+case, any completion not matching <VAR>filterpat</VAR> is removed.
+<P>
+
+<DT><CODE>-P <VAR>prefix</VAR></CODE>
+<DD><VAR>prefix</VAR> is added at the beginning of each possible completion
+after all other options have been applied.
+<P>
+
+<DT><CODE>-S <VAR>suffix</VAR></CODE>
+<DD><VAR>suffix</VAR> is appended to each possible completion
+after all other options have been applied.
+</DL>
+<P>
+
+The return value is true unless an invalid option is supplied, an option
+other than <SAMP>`-p'</SAMP> or <SAMP>`-r'</SAMP> is supplied without a <VAR>name</VAR>
+argument, an attempt is made to remove a completion specification for
+a <VAR>name</VAR> for which no specification exists, or
+an error occurs adding a completion specification.
+</P><P>
+
+</DL>
+<A NAME="IDX499"></A>
+<P>
+
+<A NAME="Using History Interactively"></A>
+<HR SIZE="6">
+<A NAME="SEC115"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC114"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC116"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 9. Using History Interactively </H1>
+<!--docid::SEC115::-->
+<P>
+
+This chapter describes how to use the GNU History Library
+interactively, from a user's standpoint.
+It should be considered a user's guide.
+For information on using the GNU History Library in other programs,
+see the GNU Readline Library Manual.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How Bash lets you manipulate your command
+                               history.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC117">9.2 Bash History Builtins</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The Bash builtin commands that manipulate
+                               the command history.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC118">9.3 History Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What it feels like using History as a user.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Bash History Facilities"></A>
+<HR SIZE="6">
+<A NAME="SEC116"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC117"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 9.1 Bash History Facilities </H2>
+<!--docid::SEC116::-->
+<P>
+
+When the <SAMP>`-o history'</SAMP> option to the <CODE>set</CODE> builtin
+is enabled (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>),
+the shell provides access to the <EM>command history</EM>,
+the list of commands previously typed.
+The value of the <CODE>HISTSIZE</CODE> shell variable is used as the
+number of commands to save in a history list.
+The text of the last <CODE>$HISTSIZE</CODE>
+commands (default 500) is saved.
+The shell stores each command in the history list prior to
+parameter and variable expansion
+but after history expansion is performed, subject to the
+values of the shell variables
+<CODE>HISTIGNORE</CODE> and <CODE>HISTCONTROL</CODE>.
+</P><P>
+
+When the shell starts up, the history is initialized from the
+file named by the <CODE>HISTFILE</CODE> variable (default <TT>`~/.bash_history'</TT>).
+The file named by the value of <CODE>HISTFILE</CODE> is truncated, if
+necessary, to contain no more than the number of lines specified by
+the value of the <CODE>HISTFILESIZE</CODE> variable.
+When an interactive shell exits, the last
+<CODE>$HISTSIZE</CODE> lines are copied from the history list to the file
+named by <CODE>$HISTFILE</CODE>.
+If the <CODE>histappend</CODE> shell option is set (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>),
+the lines are appended to the history file,
+otherwise the history file is overwritten.
+If <CODE>HISTFILE</CODE>
+is unset, or if the history file is unwritable, the history is
+not saved.  After saving the history, the history file is truncated
+to contain no more than <CODE>$HISTFILESIZE</CODE>
+lines.  If <CODE>HISTFILESIZE</CODE> is not set, no truncation is performed.
+</P><P>
+
+If the <CODE>HISTTIMEFORMAT</CODE> is set, the time stamp information
+associated with each history entry is written to the history file.
+</P><P>
+
+The builtin command <CODE>fc</CODE> may be used to list or edit and re-execute
+a portion of the history list.
+The <CODE>history</CODE> builtin may be used to display or modify the history
+list and manipulate the history file.
+When using command-line editing, search commands
+are available in each editing mode that provide access to the
+history list (see section <A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A>).
+</P><P>
+
+The shell allows control over which commands are saved on the history
+list.  The <CODE>HISTCONTROL</CODE> and <CODE>HISTIGNORE</CODE>
+variables may be set to cause the shell to save only a subset of the
+commands entered.
+The <CODE>cmdhist</CODE>
+shell option, if enabled, causes the shell to attempt to save each
+line of a multi-line command in the same history entry, adding
+semicolons where necessary to preserve syntactic correctness.
+The <CODE>lithist</CODE>
+shell option causes the shell to save the command with embedded newlines
+instead of semicolons.
+The <CODE>shopt</CODE> builtin is used to set these options.
+See section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>, for a description of <CODE>shopt</CODE>.
+</P><P>
+
+<A NAME="Bash History Builtins"></A>
+<HR SIZE="6">
+<A NAME="SEC117"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC116"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC118"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC118"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 9.2 Bash History Builtins </H2>
+<!--docid::SEC117::-->
+<P>
+
+Bash provides two builtin commands which manipulate the
+history list and history file.
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>fc</CODE>
+<DD><A NAME="IDX500"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>fc [-e <VAR>ename</VAR>] [-nlr] [<VAR>first</VAR>] [<VAR>last</VAR>]</CODE>
+<CODE>fc -s [<VAR>pat</VAR>=<VAR>rep</VAR>] [<VAR>command</VAR>]</CODE>
+</pre></td></tr></table><P>
+
+Fix Command.  In the first form, a range of commands from <VAR>first</VAR> to
+<VAR>last</VAR> is selected from the history list.  Both <VAR>first</VAR> and
+<VAR>last</VAR> may be specified as a string (to locate the most recent
+command beginning with that string) or as a number (an index into the
+history list, where a negative number is used as an offset from the
+current command number).  If <VAR>last</VAR> is not specified it is set to
+<VAR>first</VAR>.  If <VAR>first</VAR> is not specified it is set to the previous
+command for editing and -16 for listing.  If the <SAMP>`-l'</SAMP> flag is
+given, the commands are listed on standard output.  The <SAMP>`-n'</SAMP> flag
+suppresses the command numbers when listing.  The <SAMP>`-r'</SAMP> flag
+reverses the order of the listing.  Otherwise, the editor given by
+<VAR>ename</VAR> is invoked on a file containing those commands.  If
+<VAR>ename</VAR> is not given, the value of the following variable expansion
+is used: <CODE>${FCEDIT:-${EDITOR:-vi}}</CODE>.  This says to use the
+value of the <CODE>FCEDIT</CODE> variable if set, or the value of the
+<CODE>EDITOR</CODE> variable if that is set, or <CODE>vi</CODE> if neither is set.
+When editing is complete, the edited commands are echoed and executed.
+</P><P>
+
+In the second form, <VAR>command</VAR> is re-executed after each instance
+of <VAR>pat</VAR> in the selected command is replaced by <VAR>rep</VAR>.
+</P><P>
+
+A useful alias to use with the <CODE>fc</CODE> command is <CODE>r='fc -s'</CODE>, so
+that typing <SAMP>`r cc'</SAMP> runs the last command beginning with <CODE>cc</CODE>
+and typing <SAMP>`r'</SAMP> re-executes the last command (see section <A HREF="bashref.html#SEC80">6.6 Aliases</A>).
+</P><P>
+
+<DT><CODE>history</CODE>
+<DD><A NAME="IDX501"></A>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>history [<VAR>n</VAR>]
+history -c
+history -d <VAR>offset</VAR>
+history [-anrw] [<VAR>filename</VAR>]
+history -ps <VAR>arg</VAR>
+</pre></td></tr></table><P>
+
+With no options, display the history list with line numbers.
+Lines prefixed with a <SAMP>`*'</SAMP> have been modified.
+An argument of <VAR>n</VAR> lists only the last <VAR>n</VAR> lines.
+If the shell variable <CODE>HISTTIMEFORMAT</CODE> is set and not null,
+it is used as a format string for <VAR>strftime</VAR> to display
+the time stamp associated with each displayed history entry.
+No intervening blank is printed between the formatted time stamp
+and the history line.
+</P><P>
+
+Options, if supplied, have the following meanings:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>-c</CODE>
+<DD>Clear the history list.  This may be combined
+with the other options to replace the history list completely.
+<P>
+
+<DT><CODE>-d <VAR>offset</VAR></CODE>
+<DD>Delete the history entry at position <VAR>offset</VAR>.
+<VAR>offset</VAR> should be specified as it appears when the history is
+displayed.
+<P>
+
+<DT><CODE>-a</CODE>
+<DD>Append the new
+history lines (history lines entered since the beginning of the
+current Bash session) to the history file.
+<P>
+
+<DT><CODE>-n</CODE>
+<DD>Append the history lines not already read from the history file
+to the current history list.  These are lines appended to the history
+file since the beginning of the current Bash session.
+<P>
+
+<DT><CODE>-r</CODE>
+<DD>Read the current history file and append its contents to
+the history list.
+<P>
+
+<DT><CODE>-w</CODE>
+<DD>Write out the current history to the history file.
+<P>
+
+<DT><CODE>-p</CODE>
+<DD>Perform history substitution on the <VAR>arg</VAR>s and display the result
+on the standard output, without storing the results in the history list.
+<P>
+
+<DT><CODE>-s</CODE>
+<DD>The <VAR>arg</VAR>s are added to the end of
+the history list as a single entry.
+<P>
+
+</DL>
+<P>
+
+When any of the <SAMP>`-w'</SAMP>, <SAMP>`-r'</SAMP>, <SAMP>`-a'</SAMP>, or <SAMP>`-n'</SAMP> options is
+used, if <VAR>filename</VAR>
+is given, then it is used as the history file.  If not, then
+the value of the <CODE>HISTFILE</CODE> variable is used.
+</P><P>
+
+</DL>
+<P>
+
+<A NAME="History Interaction"></A>
+<HR SIZE="6">
+<A NAME="SEC118"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC117"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC119"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC115"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 9.3 History Expansion </H2>
+<!--docid::SEC118::-->
+<P>
+
+The History library provides a history expansion feature that is similar
+to the history expansion provided by <CODE>csh</CODE>.  This section
+describes the syntax used to manipulate the history information.
+</P><P>
+
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+</P><P>
+
+History expansion takes place in two parts.  The first is to determine
+which line from the history list should be used during substitution.
+The second is to select portions of that line for inclusion into the
+current one.  The line selected from the history is called the
+<EM>event</EM>, and the portions of that line that are acted upon are
+called <EM>words</EM>.  Various <EM>modifiers</EM> are available to manipulate
+the selected words.  The line is broken into words in the same fashion
+that Bash does, so that several words
+surrounded by quotes are considered one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is <SAMP>`!'</SAMP> by default.
+Only <SAMP>`\'</SAMP> and <SAMP>`''</SAMP> may be used to escape the history expansion
+character.
+</P><P>
+
+Several shell options settable with the <CODE>shopt</CODE>
+builtin (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>) may be used to tailor
+the behavior of history expansion.  If the
+<CODE>histverify</CODE> shell option is enabled, and Readline
+is being used, history substitutions are not immediately passed to
+the shell parser.
+Instead, the expanded line is reloaded into the Readline
+editing buffer for further modification.
+If Readline is being used, and the <CODE>histreedit</CODE>
+shell option is enabled, a failed history expansion will be
+reloaded into the Readline editing buffer for correction.
+The <SAMP>`-p'</SAMP> option to the <CODE>history</CODE> builtin command
+may be used to see what a history expansion will do before using it.
+The <SAMP>`-s'</SAMP> option to the <CODE>history</CODE> builtin may be used to
+add commands to the end of the history list without actually executing
+them, so that they are available for subsequent recall.
+This is most useful in conjunction with Readline.
+</P><P>
+
+The shell allows control of the various characters used by the
+history expansion mechanism with the <CODE>histchars</CODE> variable.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC119">9.3.1 Event Designators</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to specify which history line to use.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC120">9.3.2 Word Designators</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Specifying which words are of interest.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC121">9.3.3 Modifiers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Modifying the results of substitution.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Event Designators"></A>
+<HR SIZE="6">
+<A NAME="SEC119"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC118"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC120"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 9.3.1 Event Designators </H3>
+<!--docid::SEC119::-->
+<P>
+
+An event designator is a reference to a command line entry in the
+history list.
+<A NAME="IDX502"></A>
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>!</CODE>
+<DD>Start a history substitution, except when followed by a space, tab,
+the end of the line, <SAMP>`='</SAMP> or <SAMP>`('</SAMP> (when the
+<CODE>extglob</CODE> shell option is enabled using the <CODE>shopt</CODE> builtin).
+<P>
+
+<DT><CODE>!<VAR>n</VAR></CODE>
+<DD>Refer to command line <VAR>n</VAR>.
+<P>
+
+<DT><CODE>!-<VAR>n</VAR></CODE>
+<DD>Refer to the command <VAR>n</VAR> lines back.
+<P>
+
+<DT><CODE>!!</CODE>
+<DD>Refer to the previous command.  This is a synonym for <SAMP>`!-1'</SAMP>.
+<P>
+
+<DT><CODE>!<VAR>string</VAR></CODE>
+<DD>Refer to the most recent command starting with <VAR>string</VAR>.
+<P>
+
+<DT><CODE>!?<VAR>string</VAR>[?]</CODE>
+<DD>Refer to the most recent command containing <VAR>string</VAR>.  The trailing
+<SAMP>`?'</SAMP> may be omitted if the <VAR>string</VAR> is followed immediately by
+a newline.
+<P>
+
+<DT><CODE>^<VAR>string1</VAR>^<VAR>string2</VAR>^</CODE>
+<DD>Quick Substitution.  Repeat the last command, replacing <VAR>string1</VAR>
+with <VAR>string2</VAR>.  Equivalent to
+<CODE>!!:s/<VAR>string1</VAR>/<VAR>string2</VAR>/</CODE>.
+<P>
+
+<DT><CODE>!#</CODE>
+<DD>The entire command line typed so far.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Word Designators"></A>
+<HR SIZE="6">
+<A NAME="SEC120"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC119"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC121"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC121"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 9.3.2 Word Designators </H3>
+<!--docid::SEC120::-->
+<P>
+
+Word designators are used to select desired words from the event.
+A <SAMP>`:'</SAMP> separates the event specification from the word designator.  It
+may be omitted if the word designator begins with a <SAMP>`^'</SAMP>, <SAMP>`$'</SAMP>,
+<SAMP>`*'</SAMP>, <SAMP>`-'</SAMP>, or <SAMP>`%'</SAMP>.  Words are numbered from the beginning
+of the line, with the first word being denoted by 0 (zero).  Words are
+inserted into the current line separated by single spaces.
+</P><P>
+
+For example,
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>!!</CODE>
+<DD>designates the preceding command.  When you type this, the preceding
+command is repeated in toto.
+<P>
+
+<DT><CODE>!!:$</CODE>
+<DD>designates the last argument of the preceding command.  This may be
+shortened to <CODE>!$</CODE>.
+<P>
+
+<DT><CODE>!fi:2</CODE>
+<DD>designates the second argument of the most recent command starting with
+the letters <CODE>fi</CODE>.
+</DL>
+<P>
+
+Here are the word designators:
+<DL COMPACT>
+
+<DT><CODE>0 (zero)</CODE>
+<DD>The <CODE>0</CODE>th word.  For many applications, this is the command word.
+<P>
+
+<DT><CODE><VAR>n</VAR></CODE>
+<DD>The <VAR>n</VAR>th word.
+<P>
+
+<DT><CODE>^</CODE>
+<DD>The first argument; that is, word 1.
+<P>
+
+<DT><CODE>$</CODE>
+<DD>The last argument.
+<P>
+
+<DT><CODE>%</CODE>
+<DD>The word matched by the most recent <SAMP>`?<VAR>string</VAR>?'</SAMP> search.
+<P>
+
+<DT><CODE><VAR>x</VAR>-<VAR>y</VAR></CODE>
+<DD>A range of words; <SAMP>`-<VAR>y</VAR>'</SAMP> abbreviates <SAMP>`0-<VAR>y</VAR>'</SAMP>.
+<P>
+
+<DT><CODE>*</CODE>
+<DD>All of the words, except the <CODE>0</CODE>th.  This is a synonym for <SAMP>`1-$'</SAMP>.
+It is not an error to use <SAMP>`*'</SAMP> if there is just one word in the event;
+the empty string is returned in that case.
+<P>
+
+<DT><CODE><VAR>x</VAR>*</CODE>
+<DD>Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP>
+<P>
+
+<DT><CODE><VAR>x</VAR>-</CODE>
+<DD>Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP> like <SAMP>`<VAR>x</VAR>*'</SAMP>, but omits the last word.
+<P>
+
+</DL>
+<P>
+
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+</P><P>
+
+<A NAME="Modifiers"></A>
+<HR SIZE="6">
+<A NAME="SEC121"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC120"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 9.3.3 Modifiers </H3>
+<!--docid::SEC121::-->
+<P>
+
+After the optional word designator, you can add a sequence of one or more
+of the following modifiers, each preceded by a <SAMP>`:'</SAMP>.
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>h</CODE>
+<DD>Remove a trailing pathname component, leaving only the head.
+<P>
+
+<DT><CODE>t</CODE>
+<DD>Remove all leading  pathname  components, leaving the tail.
+<P>
+
+<DT><CODE>r</CODE>
+<DD>Remove a trailing suffix of the form <SAMP>`.<VAR>suffix</VAR>'</SAMP>, leaving
+the basename.
+<P>
+
+<DT><CODE>e</CODE>
+<DD>Remove all but the trailing suffix.
+<P>
+
+<DT><CODE>p</CODE>
+<DD>Print the new command but do not execute it.
+<P>
+
+<DT><CODE>q</CODE>
+<DD>Quote the substituted words, escaping further substitutions.
+<P>
+
+<DT><CODE>x</CODE>
+<DD>Quote the substituted words as with <SAMP>`q'</SAMP>,
+but break into words at spaces, tabs, and newlines.
+<P>
+
+<DT><CODE>s/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>
+<DD>Substitute <VAR>new</VAR> for the first occurrence of <VAR>old</VAR> in the
+event line.  Any delimiter may be used in place of <SAMP>`/'</SAMP>.
+The delimiter may be quoted in <VAR>old</VAR> and <VAR>new</VAR>
+with a single backslash.  If <SAMP>`&#38;'</SAMP> appears in <VAR>new</VAR>,
+it is replaced by <VAR>old</VAR>.  A single backslash will quote
+the <SAMP>`&#38;'</SAMP>.  The final delimiter is optional if it is the last
+character on the input line.
+<P>
+
+<DT><CODE>&#38;</CODE>
+<DD>Repeat the previous substitution.
+<P>
+
+<DT><CODE>g</CODE>
+<DD><DT><CODE>a</CODE>
+<DD>Cause changes to be applied over the entire event line.  Used in
+conjunction with <SAMP>`s'</SAMP>, as in <CODE>gs/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>,
+or with <SAMP>`&#38;'</SAMP>.
+<P>
+
+<DT><CODE>G</CODE>
+<DD>Apply the following <SAMP>`s'</SAMP> modifier once to each word in the event.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Installing Bash"></A>
+<HR SIZE="6">
+<A NAME="SEC122"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC121"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC123"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC4"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 10. Installing Bash </H1>
+<!--docid::SEC122::-->
+<P>
+
+This chapter provides basic instructions for installing Bash on
+the various supported platforms.  The distribution supports the
+GNU operating systems, nearly every version of Unix, and several
+non-Unix systems such as BeOS and Interix.
+Other independent ports exist for
+MS-DOS, OS/2, and Windows platforms.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC123">10.1 Basic Installation</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Installation instructions.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC124">10.2 Compilers and Options</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to set special options for various
+                               systems.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC125">10.3 Compiling For Multiple Architectures</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to compile Bash for more
+                                               than one kind of system from
+                                               the same source tree.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC126">10.4 Installation Names</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to set the various paths used by the installation.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC127">10.5 Specifying the System Type</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to configure Bash for a particular system.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC128">10.6 Sharing Defaults</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to share default configuration values among GNU
+                       programs.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC129">10.7 Operation Controls</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Options recognized by the configuration program.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC130">10.8 Optional Features</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to enable and disable optional features when
+                       building Bash.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Basic Installation"></A>
+<HR SIZE="6">
+<A NAME="SEC123"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC124"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 10.1 Basic Installation </H2>
+<!--docid::SEC123::-->
+<P>
+
+These are installation instructions for Bash.
+</P><P>
+
+The simplest way to compile Bash is:
+</P><P>
+
+<OL>
+<LI>
+<CODE>cd</CODE> to the directory containing the source code and type
+<SAMP>`./configure'</SAMP> to configure Bash for your system.  If you're
+using <CODE>csh</CODE> on an old version of System V, you might need to
+type <SAMP>`sh ./configure'</SAMP> instead to prevent <CODE>csh</CODE> from trying
+to execute <CODE>configure</CODE> itself.
+<P>
+
+Running <CODE>configure</CODE> takes some time.
+While running, it prints messages telling which features it is
+checking for.
+</P><P>
+
+<LI>
+Type <SAMP>`make'</SAMP> to compile Bash and build the <CODE>bashbug</CODE> bug
+reporting script.
+<P>
+
+<LI>
+Optionally, type <SAMP>`make tests'</SAMP> to run the Bash test suite.
+<P>
+
+<LI>
+Type <SAMP>`make install'</SAMP> to install <CODE>bash</CODE> and <CODE>bashbug</CODE>.
+This will also install the manual pages and Info file.
+<P>
+
+</OL>
+<P>
+
+The <CODE>configure</CODE> shell script attempts to guess correct
+values for various system-dependent variables used during
+compilation.  It uses those values to create a <TT>`Makefile'</TT> in
+each directory of the package (the top directory, the
+<TT>`builtins'</TT>, <TT>`doc'</TT>, and <TT>`support'</TT> directories,
+each directory under <TT>`lib'</TT>, and several others).  It also creates a
+<TT>`config.h'</TT> file containing system-dependent definitions. 
+Finally, it creates a shell script named <CODE>config.status</CODE> that you
+can run in the future to recreate the current configuration, a
+file <TT>`config.cache'</TT> that saves the results of its tests to
+speed up reconfiguring, and a file <TT>`config.log'</TT> containing
+compiler output (useful mainly for debugging <CODE>configure</CODE>). 
+If at some point
+<TT>`config.cache'</TT> contains results you don't want to keep, you
+may remove or edit it. 
+</P><P>
+
+To find out more about the options and arguments that the
+<CODE>configure</CODE> script understands, type 
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bash-2.04$ ./configure --help
+</pre></td></tr></table></P><P>
+
+at the Bash prompt in your Bash source directory.
+</P><P>
+
+If you need to do unusual things to compile Bash, please
+try to figure out how <CODE>configure</CODE> could check whether or not
+to do them, and mail diffs or instructions to
+<A HREF="mailto:bash-maintainers@gnu.org">bash-maintainers@gnu.org</A> so they can be
+considered for the next release.
+</P><P>
+
+The file <TT>`configure.in'</TT> is used to create <CODE>configure</CODE>
+by a program called Autoconf.  You only need
+<TT>`configure.in'</TT> if you want to change it or regenerate
+<CODE>configure</CODE> using a newer version of Autoconf.  If
+you do this, make sure you are using Autoconf version 2.50 or
+newer.
+</P><P>
+
+You can remove the program binaries and object files from the
+source code directory by typing <SAMP>`make clean'</SAMP>.  To also remove the
+files that <CODE>configure</CODE> created (so you can compile Bash for
+a different kind of computer), type <SAMP>`make distclean'</SAMP>.
+</P><P>
+
+<A NAME="Compilers and Options"></A>
+<HR SIZE="6">
+<A NAME="SEC124"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC123"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC125"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC125"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 10.2 Compilers and Options </H2>
+<!--docid::SEC124::-->
+<P>
+
+Some systems require unusual options for compilation or linking
+that the <CODE>configure</CODE> script does not know about.  You can
+give <CODE>configure</CODE> initial values for variables by setting
+them in the environment.  Using a Bourne-compatible shell, you
+can do that on the command line like this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+</pre></td></tr></table></P><P>
+
+On systems that have the <CODE>env</CODE> program, you can do it like this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+</pre></td></tr></table></P><P>
+
+The configuration process uses GCC to build Bash if it
+is available.
+</P><P>
+
+<A NAME="Compiling For Multiple Architectures"></A>
+<HR SIZE="6">
+<A NAME="SEC125"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC124"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC126"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC126"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 10.3 Compiling For Multiple Architectures </H2>
+<!--docid::SEC125::-->
+<P>
+
+You can compile Bash for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of <CODE>make</CODE> that
+supports the <CODE>VPATH</CODE> variable, such as GNU <CODE>make</CODE>.
+<CODE>cd</CODE> to the
+directory where you want the object files and executables to go and run
+the <CODE>configure</CODE> script from the source directory.  You may need to
+supply the <SAMP>`--srcdir=PATH'</SAMP> argument to tell <CODE>configure</CODE> where the
+source files are.  <CODE>configure</CODE> automatically checks for the
+source code in the directory that <CODE>configure</CODE> is in and in `..'.
+</P><P>
+
+If you have to use a <CODE>make</CODE> that does not supports the <CODE>VPATH</CODE>
+variable, you can compile Bash for one architecture at a
+time in the source code directory.  After you have installed
+Bash for one architecture, use <SAMP>`make distclean'</SAMP> before
+reconfiguring for another architecture.
+</P><P>
+
+Alternatively, if your system supports symbolic links, you can use the
+<TT>`support/mkclone'</TT> script to create a build tree which has
+symbolic links back to each file in the source directory.  Here's an
+example that creates a build directory in the current directory from a
+source directory <TT>`/usr/gnu/src/bash-2.0'</TT>:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bash /usr/gnu/src/bash-2.0/support/mkclone -s /usr/gnu/src/bash-2.0 .
+</pre></td></tr></table></P><P>
+
+The <CODE>mkclone</CODE> script requires Bash, so you must have already built
+Bash for at least one architecture before you can create build
+directories for other architectures.
+</P><P>
+
+<A NAME="Installation Names"></A>
+<HR SIZE="6">
+<A NAME="SEC126"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC125"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC127"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC127"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 10.4 Installation Names </H2>
+<!--docid::SEC126::-->
+<P>
+
+By default, <SAMP>`make install'</SAMP> will install into
+<TT>`/usr/local/bin'</TT>, <TT>`/usr/local/man'</TT>, etc.  You can
+specify an installation prefix other than <TT>`/usr/local'</TT> by
+giving <CODE>configure</CODE> the option <SAMP>`--prefix=<VAR>PATH</VAR>'</SAMP>,
+or by specifying a value for the <CODE>DESTDIR</CODE> <SAMP>`make'</SAMP>
+variable when running <SAMP>`make install'</SAMP>.
+</P><P>
+
+You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. 
+If you give <CODE>configure</CODE> the option
+<SAMP>`--exec-prefix=<VAR>PATH</VAR>'</SAMP>, <SAMP>`make install'</SAMP> will use
+<VAR>PATH</VAR> as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix. 
+</P><P>
+
+<A NAME="Specifying the System Type"></A>
+<HR SIZE="6">
+<A NAME="SEC127"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC126"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC128"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC128"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 10.5 Specifying the System Type </H2>
+<!--docid::SEC127::-->
+<P>
+
+There may be some features <CODE>configure</CODE> can not figure out
+automatically, but need to determine by the type of host Bash
+will run on.  Usually <CODE>configure</CODE> can figure that
+out, but if it prints a message saying it can not guess the host
+type, give it the <SAMP>`--host=TYPE'</SAMP> option.  <SAMP>`TYPE'</SAMP> can
+either be a short name for the system type, such as <SAMP>`sun4'</SAMP>,
+or a canonical name with three fields: <SAMP>`CPU-COMPANY-SYSTEM'</SAMP>
+(e.g., <SAMP>`i386-unknown-freebsd4.2'</SAMP>).
+</P><P>
+
+See the file <TT>`support/config.sub'</TT> for the possible
+values of each field. 
+</P><P>
+
+<A NAME="Sharing Defaults"></A>
+<HR SIZE="6">
+<A NAME="SEC128"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC127"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC129"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC129"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 10.6 Sharing Defaults </H2>
+<!--docid::SEC128::-->
+<P>
+
+If you want to set default values for <CODE>configure</CODE> scripts to
+share, you can create a site shell script called
+<CODE>config.site</CODE> that gives default values for variables like
+<CODE>CC</CODE>, <CODE>cache_file</CODE>, and <CODE>prefix</CODE>.  <CODE>configure</CODE>
+looks for <TT>`PREFIX/share/config.site'</TT> if it exists, then
+<TT>`PREFIX/etc/config.site'</TT> if it exists.  Or, you can set the
+<CODE>CONFIG_SITE</CODE> environment variable to the location of the site
+script.  A warning: the Bash <CODE>configure</CODE> looks for a site script,
+but not all <CODE>configure</CODE> scripts do.
+</P><P>
+
+<A NAME="Operation Controls"></A>
+<HR SIZE="6">
+<A NAME="SEC129"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC128"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC130"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC130"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 10.7 Operation Controls </H2>
+<!--docid::SEC129::-->
+<P>
+
+<CODE>configure</CODE> recognizes the following options to control how it
+operates.
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>--cache-file=<VAR>file</VAR></CODE>
+<DD>Use and save the results of the tests in
+<VAR>file</VAR> instead of <TT>`./config.cache'</TT>.  Set <VAR>file</VAR> to
+<TT>`/dev/null'</TT> to disable caching, for debugging
+<CODE>configure</CODE>. 
+<P>
+
+<DT><CODE>--help</CODE>
+<DD>Print a summary of the options to <CODE>configure</CODE>, and exit.
+<P>
+
+<DT><CODE>--quiet</CODE>
+<DD><DT><CODE>--silent</CODE>
+<DD><DT><CODE>-q</CODE>
+<DD>Do not print messages saying which checks are being made.
+<P>
+
+<DT><CODE>--srcdir=<VAR>dir</VAR></CODE>
+<DD>Look for the Bash source code in directory <VAR>dir</VAR>.  Usually
+<CODE>configure</CODE> can determine that directory automatically.
+<P>
+
+<DT><CODE>--version</CODE>
+<DD>Print the version of Autoconf used to generate the <CODE>configure</CODE>
+script, and exit.
+</DL>
+<P>
+
+<CODE>configure</CODE> also accepts some other, not widely used, boilerplate
+options.  <SAMP>`configure --help'</SAMP> prints the complete list.
+</P><P>
+
+<A NAME="Optional Features"></A>
+<HR SIZE="6">
+<A NAME="SEC130"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC129"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 10.8 Optional Features </H2>
+<!--docid::SEC130::-->
+<P>
+
+The Bash <CODE>configure</CODE> has a number of <SAMP>`--enable-<VAR>feature</VAR>'</SAMP>
+options, where <VAR>feature</VAR> indicates an optional part of Bash.
+There are also several <SAMP>`--with-<VAR>package</VAR>'</SAMP> options,
+where <VAR>package</VAR> is something like <SAMP>`bash-malloc'</SAMP> or <SAMP>`purify'</SAMP>.
+To turn off the default use of a package, use
+<SAMP>`--without-<VAR>package</VAR>'</SAMP>.  To configure Bash without a feature
+that is enabled by default, use <SAMP>`--disable-<VAR>feature</VAR>'</SAMP>.
+</P><P>
+
+Here is a complete list of the <SAMP>`--enable-'</SAMP> and
+<SAMP>`--with-'</SAMP> options that the Bash <CODE>configure</CODE> recognizes. 
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>--with-afs</CODE>
+<DD>Define if you are using the Andrew File System from Transarc.
+<P>
+
+<DT><CODE>--with-bash-malloc</CODE>
+<DD>Use the Bash version of
+<CODE>malloc</CODE> in <TT>`lib/malloc/malloc.c'</TT>.  This is not the same
+<CODE>malloc</CODE> that appears in GNU libc, but an older version
+derived from the 4.2 BSD <CODE>malloc</CODE>.  This <CODE>malloc</CODE> is
+very fast, but wastes some space on each allocation.
+This option is enabled by default.
+The <TT>`NOTES'</TT> file contains a list of systems for
+which this should be turned off, and <CODE>configure</CODE> disables this
+option automatically for a number of systems.
+<P>
+
+<DT><CODE>--with-curses</CODE>
+<DD>Use the curses library instead of the termcap library.  This should
+be supplied if your system has an inadequate or incomplete termcap
+database.
+<P>
+
+<DT><CODE>--with-gnu-malloc</CODE>
+<DD>A synonym for <CODE>--with-bash-malloc</CODE>.
+<P>
+
+<DT><CODE>--with-installed-readline[=<VAR>PREFIX</VAR>]</CODE>
+<DD>Define this to make Bash link with a locally-installed version of Readline
+rather than the version in <TT>`lib/readline'</TT>.  This works only with
+Readline 4.3 and later versions.  If <VAR>PREFIX</VAR> is <CODE>yes</CODE> or not
+supplied, <CODE>configure</CODE> uses the values of the make variables
+<CODE>includedir</CODE> and <CODE>libdir</CODE>, which are subdirectories of <CODE>prefix</CODE>
+by default, to find the installed version of Readline if it is not in
+the standard system include and library directories.
+If <VAR>PREFIX</VAR> is <CODE>no</CODE>, Bash links with the version in
+<TT>`lib/readline'</TT>.
+If <VAR>PREFIX</VAR> is set to any other value, <CODE>configure</CODE> treats it as
+a directory pathname and looks for
+the installed version of Readline in subdirectories of that directory
+(include files in <VAR>PREFIX</VAR>/<CODE>include</CODE> and the library in
+<VAR>PREFIX</VAR>/<CODE>lib</CODE>).
+<P>
+
+<DT><CODE>--with-purify</CODE>
+<DD>Define this to use the Purify memory allocation checker from Rational
+Software.
+<P>
+
+<DT><CODE>--enable-minimal-config</CODE>
+<DD>This produces a shell with minimal features, close to the historical
+Bourne shell.
+</DL>
+<P>
+
+There are several <SAMP>`--enable-'</SAMP> options that alter how Bash is
+compiled and linked, rather than changing run-time features.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>--enable-largefile</CODE>
+<DD>Enable support for <A HREF="http://www.sas.com/standards/large_file/x_open.20Mar96.html">large files</A> if the operating system requires special compiler options
+to build programs which can access large files.  This is enabled by
+default, if the operating system provides large file support.
+<P>
+
+<DT><CODE>--enable-profiling</CODE>
+<DD>This builds a Bash binary that produces profiling information to be
+processed by <CODE>gprof</CODE> each time it is executed.
+<P>
+
+<DT><CODE>--enable-static-link</CODE>
+<DD>This causes Bash to be linked statically, if <CODE>gcc</CODE> is being used.
+This could be used to build a version to use as root's shell.
+</DL>
+<P>
+
+The <SAMP>`minimal-config'</SAMP> option can be used to disable all of
+the following options, but it is processed first, so individual
+options may be enabled using <SAMP>`enable-<VAR>feature</VAR>'</SAMP>. 
+</P><P>
+
+All of the following options except for <SAMP>`disabled-builtins'</SAMP> and
+<SAMP>`xpg-echo-default'</SAMP> are
+enabled by default, unless the operating system does not provide the
+necessary support.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>--enable-alias</CODE>
+<DD>Allow alias expansion and include the <CODE>alias</CODE> and <CODE>unalias</CODE>
+builtins (see section <A HREF="bashref.html#SEC80">6.6 Aliases</A>).
+<P>
+
+<DT><CODE>--enable-arith-for-command</CODE>
+<DD>Include support for the alternate form of the <CODE>for</CODE> command
+that behaves like the C language <CODE>for</CODE> statement
+(see section <A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A>).
+<P>
+
+<DT><CODE>--enable-array-variables</CODE>
+<DD>Include support for one-dimensional array shell variables
+(see section <A HREF="bashref.html#SEC81">6.7 Arrays</A>).
+<P>
+
+<DT><CODE>--enable-bang-history</CODE>
+<DD>Include support for <CODE>csh</CODE>-like history substitution
+(see section <A HREF="bashref.html#SEC118">9.3 History Expansion</A>).
+<P>
+
+<DT><CODE>--enable-brace-expansion</CODE>
+<DD>Include <CODE>csh</CODE>-like brace expansion
+( <CODE>b{a,b}c</CODE> ==> <CODE>bac bbc</CODE> ).
+See <A HREF="bashref.html#SEC28">3.5.1 Brace Expansion</A>, for a complete description.
+<P>
+
+<DT><CODE>--enable-command-timing</CODE>
+<DD>Include support for recognizing <CODE>time</CODE> as a reserved word and for
+displaying timing statistics for the pipeline following <CODE>time</CODE>
+(see section <A HREF="bashref.html#SEC17">3.2.2 Pipelines</A>).
+This allows pipelines as well as shell builtins and functions to be timed.
+<P>
+
+<DT><CODE>--enable-cond-command</CODE>
+<DD>Include support for the <CODE>[[</CODE> conditional command.
+(see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>).
+<P>
+
+<DT><CODE>--enable-cond-regexp</CODE>
+<DD>Include support for matching POSIX regular expressions using the
+<SAMP>`=~'</SAMP> binary operator in the <CODE>[[</CODE> conditional command.
+(see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>).
+<P>
+
+<DT><CODE>--enable-directory-stack</CODE>
+<DD>Include support for a <CODE>csh</CODE>-like directory stack and the
+<CODE>pushd</CODE>, <CODE>popd</CODE>, and <CODE>dirs</CODE> builtins
+(see section <A HREF="bashref.html#SEC82">6.8 The Directory Stack</A>).
+<P>
+
+<DT><CODE>--enable-disabled-builtins</CODE>
+<DD>Allow builtin commands to be invoked via <SAMP>`builtin xxx'</SAMP>
+even after <CODE>xxx</CODE> has been disabled using <SAMP>`enable -n xxx'</SAMP>.
+See <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>, for details of the <CODE>builtin</CODE> and
+<CODE>enable</CODE> builtin commands.
+<P>
+
+<DT><CODE>--enable-dparen-arithmetic</CODE>
+<DD>Include support for the <CODE>((<small>...</small>))</CODE> command
+(see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>).
+<P>
+
+<DT><CODE>--enable-extended-glob</CODE>
+<DD>Include support for the extended pattern matching features described
+above under <A HREF="bashref.html#SEC36">3.5.8.1 Pattern Matching</A>.
+<P>
+
+<DT><CODE>--enable-help-builtin</CODE>
+<DD>Include the <CODE>help</CODE> builtin, which displays help on shell builtins and
+variables (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<DT><CODE>--enable-history</CODE>
+<DD>Include command history and the <CODE>fc</CODE> and <CODE>history</CODE>
+builtin commands (see section <A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A>).
+<P>
+
+<DT><CODE>--enable-job-control</CODE>
+<DD>This enables the job control features (see section <A HREF="bashref.html#SEC87">7. Job Control</A>),
+if the operating system supports them.
+<P>
+
+<DT><CODE>--enable-multibyte</CODE>
+<DD>This enables support for multibyte characters if the operating
+system provides the necessary support.
+<P>
+
+<DT><CODE>--enable-net-redirections</CODE>
+<DD>This enables the special handling of filenames of the form
+<CODE>/dev/tcp/<VAR>host</VAR>/<VAR>port</VAR></CODE> and
+<CODE>/dev/udp/<VAR>host</VAR>/<VAR>port</VAR></CODE>
+when used in redirections (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>).
+<P>
+
+<DT><CODE>--enable-process-substitution</CODE>
+<DD>This enables process substitution (see section <A HREF="bashref.html#SEC33">3.5.6 Process Substitution</A>) if
+the operating system provides the necessary support.
+<P>
+
+<DT><CODE>--enable-prompt-string-decoding</CODE>
+<DD>Turn on the interpretation of a number of backslash-escaped characters
+in the <CODE>$PS1</CODE>, <CODE>$PS2</CODE>, <CODE>$PS3</CODE>, and <CODE>$PS4</CODE> prompt
+strings.  See <A HREF="bashref.html#SEC84">6.9 Controlling the Prompt</A>, for a complete list of prompt
+string escape sequences.
+<P>
+
+<DT><CODE>--enable-progcomp</CODE>
+<DD>Enable the programmable completion facilities
+(see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>).
+If Readline is not enabled, this option has no effect.
+<P>
+
+<DT><CODE>--enable-readline</CODE>
+<DD>Include support for command-line editing and history with the Bash
+version of the Readline library (see section <A HREF="bashref.html#SEC91">8. Command Line Editing</A>).
+<P>
+
+<DT><CODE>--enable-restricted</CODE>
+<DD>Include support for a <EM>restricted shell</EM>.  If this is enabled, Bash,
+when called as <CODE>rbash</CODE>, enters a restricted mode.  See
+<A HREF="bashref.html#SEC85">6.10 The Restricted Shell</A>, for a description of restricted mode.
+<P>
+
+<DT><CODE>--enable-select</CODE>
+<DD>Include the <CODE>select</CODE> builtin, which allows the generation of simple
+menus (see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>).
+<P>
+
+<DT><CODE>--enable-usg-echo-default</CODE>
+<DD>A synonym for <CODE>--enable-xpg-echo-default</CODE>.
+<P>
+
+<DT><CODE>--enable-xpg-echo-default</CODE>
+<DD>Make the <CODE>echo</CODE> builtin expand backslash-escaped characters by default,
+without requiring the <SAMP>`-e'</SAMP> option.
+This sets the default value of the <CODE>xpg_echo</CODE> shell option to <CODE>on</CODE>,
+which makes the Bash <CODE>echo</CODE> behave more like the version specified in
+the Single Unix Specification, version 2.
+See section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>, for a description of the escape sequences that
+<CODE>echo</CODE> recognizes.
+<P>
+
+</DL>
+<P>
+
+The file <TT>`config-top.h'</TT> contains C Preprocessor
+<SAMP>`#define'</SAMP> statements for options which are not settable from
+<CODE>configure</CODE>.
+Some of these are not meant to be changed; beware of the consequences if
+you do.
+Read the comments associated with each definition for more
+information about its effect.
+</P><P>
+
+<A NAME="Reporting Bugs"></A>
+<HR SIZE="6">
+<A NAME="SEC131"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC130"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC132"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC122"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC132"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> A. Reporting Bugs </H1>
+<!--docid::SEC131::-->
+<P>
+
+Please report all bugs you find in Bash.
+But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of Bash.
+The latest version of Bash is always available for FTP from
+<A HREF="ftp://ftp.gnu.org/pub/bash/">ftp://ftp.gnu.org/pub/bash/</A>.
+</P><P>
+
+Once you have determined that a bug actually exists, use the
+<CODE>bashbug</CODE> command to submit a bug report.
+If you have a fix, you are encouraged to mail that as well!
+Suggestions and `philosophical' bug reports may be mailed
+to <A HREF="mailto:bug-bash@gnu.org">bug-bash@gnu.org</A> or posted to the Usenet
+newsgroup <CODE>gnu.bash.bug</CODE>.
+</P><P>
+
+All bug reports should include:
+<UL>
+<LI>
+The version number of Bash.
+<LI>
+The hardware and operating system.
+<LI>
+The compiler used to compile Bash.
+<LI>
+A description of the bug behaviour.
+<LI>
+A short script or `recipe' which exercises the bug and may be used
+to reproduce it.
+</UL>
+<P>
+
+<CODE>bashbug</CODE> inserts the first three items automatically into
+the template it provides for filing a bug report.
+</P><P>
+
+Please send all reports concerning this manual to
+<A HREF="mailto:chet@po.CWRU.Edu">chet@po.CWRU.Edu</A>.
+</P><P>
+
+<A NAME="Major Differences From The Bourne Shell"></A>
+<HR SIZE="6">
+<A NAME="SEC132"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC131"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC133"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC134"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC134"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> B. Major Differences From The Bourne Shell </H1>
+<!--docid::SEC132::-->
+<P>
+
+Bash implements essentially the same grammar, parameter and
+variable expansion, redirection, and quoting as the Bourne Shell. 
+Bash uses the POSIX 1003.2 standard as the specification of
+how these features are to be implemented.  There are some
+differences between the traditional Bourne shell and Bash; this
+section quickly details the differences of significance.  A
+number of these differences are explained in greater depth in
+previous sections.
+This section uses the version of <CODE>sh</CODE> included in SVR4.2 as
+the baseline reference.
+</P><P>
+
+<UL>
+
+<LI>
+Bash is POSIX-conformant, even where the POSIX specification
+differs from traditional <CODE>sh</CODE> behavior (see section <A HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A>).
+<P>
+
+<LI>
+Bash has multi-character invocation options (see section <A HREF="bashref.html#SEC65">6.1 Invoking Bash</A>).
+<P>
+
+<LI>
+Bash has command-line editing (see section <A HREF="bashref.html#SEC91">8. Command Line Editing</A>) and
+the <CODE>bind</CODE> builtin.
+<P>
+
+<LI>
+Bash provides a programmable word completion mechanism
+(see section <A HREF="bashref.html#SEC113">8.6 Programmable Completion</A>), and two builtin commands,
+<CODE>complete</CODE> and <CODE>compgen</CODE>, to manipulate it.
+<P>
+
+<LI>
+Bash has command history (see section <A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A>) and the
+<CODE>history</CODE> and <CODE>fc</CODE> builtins to manipulate it.
+The Bash history list maintains timestamp information and uses the
+value of the <CODE>HISTTIMEFORMAT</CODE> variable to display it.
+<P>
+
+<LI>
+Bash implements <CODE>csh</CODE>-like history expansion
+(see section <A HREF="bashref.html#SEC118">9.3 History Expansion</A>).
+<P>
+
+<LI>
+Bash has one-dimensional array variables (see section <A HREF="bashref.html#SEC81">6.7 Arrays</A>), and the
+appropriate variable expansions and assignment syntax to use them.
+Several of the Bash builtins take options to act on arrays.
+Bash provides a number of built-in array variables.
+<P>
+
+<LI>
+The <CODE>$'<small>...</small>'</CODE> quoting syntax, which expands ANSI-C
+backslash-escaped characters in the text between the single quotes,
+is supported (see section <A HREF="bashref.html#SEC12">3.1.2.4 ANSI-C Quoting</A>).
+<P>
+
+<LI>
+Bash supports the <CODE>$"<small>...</small>"</CODE> quoting syntax to do
+locale-specific translation of the characters between the double
+quotes.  The <SAMP>`-D'</SAMP>, <SAMP>`--dump-strings'</SAMP>, and <SAMP>`--dump-po-strings'</SAMP>
+invocation options list the translatable strings found in a script
+(see section <A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A>).
+<P>
+
+<LI>
+Bash implements the <CODE>!</CODE> keyword to negate the return value of
+a pipeline (see section <A HREF="bashref.html#SEC17">3.2.2 Pipelines</A>).
+Very useful when an <CODE>if</CODE> statement needs to act only if a test fails.
+<P>
+
+<LI>
+Bash has the <CODE>time</CODE> reserved word and command timing (see section <A HREF="bashref.html#SEC17">3.2.2 Pipelines</A>).
+The display of the timing statistics may be controlled with the
+<CODE>TIMEFORMAT</CODE> variable.
+<P>
+
+<LI>
+Bash implements the <CODE>for (( <VAR>expr1</VAR> ; <VAR>expr2</VAR> ; <VAR>expr3</VAR> ))</CODE>
+arithmetic for command, similar to the C language (see section <A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A>).
+<P>
+
+<LI>
+Bash includes the <CODE>select</CODE> compound command, which allows the
+generation of simple menus (see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>).
+<P>
+
+<LI>
+Bash includes the <CODE>[[</CODE> compound command, which makes conditional
+testing part of the shell grammar (see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>).
+<P>
+
+<LI>
+Bash includes brace expansion (see section <A HREF="bashref.html#SEC28">3.5.1 Brace Expansion</A>) and tilde
+expansion (see section <A HREF="bashref.html#SEC29">3.5.2 Tilde Expansion</A>).
+<P>
+
+<LI>
+Bash implements command aliases and the <CODE>alias</CODE> and <CODE>unalias</CODE>
+builtins (see section <A HREF="bashref.html#SEC80">6.6 Aliases</A>).
+<P>
+
+<LI>
+Bash provides shell arithmetic, the <CODE>((</CODE> compound command
+(see section <A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>),
+and arithmetic expansion (see section <A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A>).
+<P>
+
+<LI>
+Variables present in the shell's initial environment are automatically
+exported to child processes.  The Bourne shell does not normally do
+this unless the variables are explicitly marked using the <CODE>export</CODE>
+command.
+<P>
+
+<LI>
+Bash includes the POSIX pattern removal <SAMP>`%'</SAMP>, <SAMP>`#'</SAMP>, <SAMP>`%%'</SAMP>
+and <SAMP>`##'</SAMP> expansions to remove leading or trailing substrings from
+variable values (see section <A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>).
+<P>
+
+<LI>
+The expansion <CODE>${#xx}</CODE>, which returns the length of <CODE>${xx}</CODE>,
+is supported (see section <A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>).
+<P>
+
+<LI>
+The expansion <CODE>${var:</CODE><VAR>offset</VAR><CODE>[:</CODE><VAR>length</VAR><CODE>]}</CODE>,
+which expands to the substring of <CODE>var</CODE>'s value of length
+<VAR>length</VAR>, beginning at <VAR>offset</VAR>, is present
+(see section <A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>).
+<P>
+
+<LI>
+The expansion
+<CODE>${var/[/]</CODE><VAR>pattern</VAR><CODE>[/</CODE><VAR>replacement</VAR><CODE>]}</CODE>,
+which matches <VAR>pattern</VAR> and replaces it with <VAR>replacement</VAR> in
+the value of <CODE>var</CODE>, is available (see section <A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>).
+<P>
+
+<LI>
+The expansion <CODE>${!<VAR>prefix}*</VAR></CODE> expansion, which expands to
+the names of all shell variables whose names begin with <VAR>prefix</VAR>,
+is available (see section <A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>).
+<P>
+
+<LI>
+Bash has <VAR>indirect</VAR> variable expansion using <CODE>${!word}</CODE>
+(see section <A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>).
+<P>
+
+<LI>
+Bash can expand positional parameters beyond <CODE>$9</CODE> using
+<CODE>${<VAR>num</VAR>}</CODE>.
+<P>
+
+<LI>
+The POSIX <CODE>$()</CODE> form of command substitution
+is implemented (see section <A HREF="bashref.html#SEC31">3.5.4 Command Substitution</A>),
+and preferred to the Bourne shell's <CODE>"</CODE> (which
+is also implemented for backwards compatibility).
+<P>
+
+<LI>
+Bash has process substitution (see section <A HREF="bashref.html#SEC33">3.5.6 Process Substitution</A>).
+<P>
+
+<LI>
+Bash automatically assigns variables that provide information about the
+current user (<CODE>UID</CODE>, <CODE>EUID</CODE>, and <CODE>GROUPS</CODE>), the current host
+(<CODE>HOSTTYPE</CODE>, <CODE>OSTYPE</CODE>, <CODE>MACHTYPE</CODE>, and <CODE>HOSTNAME</CODE>),
+and the instance of Bash that is running (<CODE>BASH</CODE>,
+<CODE>BASH_VERSION</CODE>, and <CODE>BASH_VERSINFO</CODE>).  See section <A HREF="bashref.html#SEC63">5.2 Bash Variables</A>,
+for details.
+<P>
+
+<LI>
+The <CODE>IFS</CODE> variable is used to split only the results of expansion,
+not all words (see section <A HREF="bashref.html#SEC34">3.5.7 Word Splitting</A>).
+This closes a longstanding shell security hole.
+<P>
+
+<LI>
+Bash implements the full set of POSIX 1003.2 filename expansion operators,
+including <VAR>character classes</VAR>, <VAR>equivalence classes</VAR>, and
+<VAR>collating symbols</VAR> (see section <A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A>).
+<P>
+
+<LI>
+Bash implements extended pattern matching features when the <CODE>extglob</CODE>
+shell option is enabled (see section <A HREF="bashref.html#SEC36">3.5.8.1 Pattern Matching</A>).
+<P>
+
+<LI>
+It is possible to have a variable and a function with the same name;
+<CODE>sh</CODE> does not separate the two name spaces.
+<P>
+
+<LI>
+Bash functions are permitted to have local variables using the
+<CODE>local</CODE> builtin, and thus useful recursive functions may be written
+(see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<LI>
+Variable assignments preceding commands affect only that command, even
+builtins and functions (see section <A HREF="bashref.html#SEC52">3.7.4 Environment</A>).
+In <CODE>sh</CODE>, all variable assignments 
+preceding commands are global unless the command is executed from the
+file system.
+<P>
+
+<LI>
+Bash performs filename expansion on filenames specified as operands
+to input and output redirection operators (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>).
+<P>
+
+<LI>
+Bash contains the <SAMP>`&#60;&#62;'</SAMP> redirection operator, allowing a file to be
+opened for both reading and writing, and the <SAMP>`&#38;&#62;'</SAMP> redirection
+operator, for directing standard output and standard error to the same
+file (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>).
+<P>
+
+<LI>
+Bash treats a number of filenames specially when they are
+used in redirection operators (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>).
+<P>
+
+<LI>
+Bash can open network connections to arbitrary machines and services
+with the redirection operators (see section <A HREF="bashref.html#SEC38">3.6 Redirections</A>).
+<P>
+
+<LI>
+The <CODE>noclobber</CODE> option is available to avoid overwriting existing
+files with output redirection (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+The <SAMP>`&#62;|'</SAMP> redirection operator may be used to override <CODE>noclobber</CODE>.
+<P>
+
+<LI>
+The Bash <CODE>cd</CODE> and <CODE>pwd</CODE> builtins (see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>)
+each take <SAMP>`-L'</SAMP> and <SAMP>`-P'</SAMP> options to switch between logical and
+physical modes.
+<P>
+
+<LI>
+Bash allows a function to override a builtin with the same name, and provides
+access to that builtin's functionality within the function via the
+<CODE>builtin</CODE> and <CODE>command</CODE> builtins (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<LI>
+The <CODE>command</CODE> builtin allows selective disabling of functions
+when command lookup is performed (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<LI>
+Individual builtins may be enabled or disabled using the <CODE>enable</CODE>
+builtin (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<LI>
+The Bash <CODE>exec</CODE> builtin takes additional options that allow users
+to control the contents of the environment passed to the executed
+command, and what the zeroth argument to the command is to be
+(see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>).
+<P>
+
+<LI>
+Shell functions may be exported to children via the environment
+using <CODE>export -f</CODE> (see section <A HREF="bashref.html#SEC23">3.3 Shell Functions</A>).
+<P>
+
+<LI>
+The Bash <CODE>export</CODE>, <CODE>readonly</CODE>, and <CODE>declare</CODE> builtins can
+take a <SAMP>`-f'</SAMP> option to act on shell functions, a <SAMP>`-p'</SAMP> option to
+display variables with various attributes set in a format that can be
+used as shell input, a <SAMP>`-n'</SAMP> option to remove various variable
+attributes, and <SAMP>`name=value'</SAMP> arguments to set variable attributes
+and values simultaneously.
+<P>
+
+<LI>
+The Bash <CODE>hash</CODE> builtin allows a name to be associated with
+an arbitrary filename, even when that filename cannot be found by
+searching the <CODE>$PATH</CODE>, using <SAMP>`hash -p'</SAMP>
+(see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>).
+<P>
+
+<LI>
+Bash includes a <CODE>help</CODE> builtin for quick reference to shell
+facilities (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<LI>
+The <CODE>printf</CODE> builtin is available to display formatted output
+(see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<LI>
+The Bash <CODE>read</CODE> builtin (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>)
+will read a line ending in <SAMP>`\'</SAMP> with
+the <SAMP>`-r'</SAMP> option, and will use the <CODE>REPLY</CODE> variable as a
+default if no non-option arguments are supplied.
+The Bash <CODE>read</CODE> builtin
+also accepts a prompt string with the <SAMP>`-p'</SAMP> option and will use
+Readline to obtain the line when given the <SAMP>`-e'</SAMP> option.
+The <CODE>read</CODE> builtin also has additional options to control input:
+the <SAMP>`-s'</SAMP> option will turn off echoing of input characters as
+they are read, the <SAMP>`-t'</SAMP> option will allow <CODE>read</CODE> to time out
+if input does not arrive within a specified number of seconds, the
+<SAMP>`-n'</SAMP> option will allow reading only a specified number of
+characters rather than a full line, and the <SAMP>`-d'</SAMP> option will read
+until a particular character rather than newline.
+<P>
+
+<LI>
+The <CODE>return</CODE> builtin may be used to abort execution of scripts
+executed with the <CODE>.</CODE> or <CODE>source</CODE> builtins
+(see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>).
+<P>
+
+<LI>
+Bash includes the <CODE>shopt</CODE> builtin, for finer control of shell
+optional capabilities (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>), and allows these options
+to be set and unset at shell invocation (see section <A HREF="bashref.html#SEC65">6.1 Invoking Bash</A>).
+<P>
+
+<LI>
+Bash has much more optional behavior controllable with the <CODE>set</CODE>
+builtin (see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+<P>
+
+<LI>
+The <SAMP>`-x'</SAMP> (<CODE>xtrace</CODE>) option displays commands other than
+simple commands when performing an execution trace
+(see section <A HREF="bashref.html#SEC59">4.3 The Set Builtin</A>).
+<P>
+
+<LI>
+The <CODE>test</CODE> builtin (see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>)
+is slightly different, as it implements the POSIX algorithm,
+which specifies the behavior based on the number of arguments.
+<P>
+
+<LI>
+Bash includes the <CODE>caller</CODE> builtin, which displays the context of
+any active subroutine call (a shell function or a script executed with
+the <CODE>.</CODE> or <CODE>source</CODE> builtins).  This supports the bash
+debugger.
+<P>
+
+<LI>
+The <CODE>trap</CODE> builtin (see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>) allows a
+<CODE>DEBUG</CODE> pseudo-signal specification, similar to <CODE>EXIT</CODE>.
+Commands specified with a <CODE>DEBUG</CODE> trap are executed before every
+simple command, <CODE>for</CODE> command, <CODE>case</CODE> command,
+<CODE>select</CODE> command, every arithmetic <CODE>for</CODE> command, and before
+the first command executes in a shell function.
+The <CODE>DEBUG</CODE> trap is not inherited by shell functions unless the
+function has been given the <CODE>trace</CODE> attribute or the
+<CODE>functrace</CODE> option has been enabled using the <CODE>shopt</CODE> builtin.
+The <CODE>extdebug</CODE> shell option has additional effects on the
+<CODE>DEBUG</CODE> trap.
+<P>
+
+The <CODE>trap</CODE> builtin (see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>) allows an
+<CODE>ERR</CODE> pseudo-signal specification, similar to <CODE>EXIT</CODE> and <CODE>DEBUG</CODE>.
+Commands specified with an <CODE>ERR</CODE> trap are executed after a simple
+command fails, with a few exceptions.
+The <CODE>ERR</CODE> trap is not inherited by shell functions unless the
+<CODE>-o errtrace</CODE> option to the <CODE>set</CODE> builtin is enabled.
+</P><P>
+
+The <CODE>trap</CODE> builtin (see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>) allows a
+<CODE>RETURN</CODE> pseudo-signal specification, similar to
+<CODE>EXIT</CODE> and <CODE>DEBUG</CODE>.
+Commands specified with an <CODE>RETURN</CODE> trap are executed before
+execution resumes after a shell function or a shell script executed with
+<CODE>.</CODE> or <CODE>source</CODE> returns.
+The <CODE>RETURN</CODE> trap is not inherited by shell functions.
+</P><P>
+
+<LI>
+The Bash <CODE>type</CODE> builtin is more extensive and gives more information
+about the names it finds (see section <A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>).
+<P>
+
+<LI>
+The Bash <CODE>umask</CODE> builtin permits a <SAMP>`-p'</SAMP> option to cause
+the output to be displayed in the form of a <CODE>umask</CODE> command
+that may be reused as input (see section <A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>).
+<P>
+
+<LI>
+Bash implements a <CODE>csh</CODE>-like directory stack, and provides the
+<CODE>pushd</CODE>, <CODE>popd</CODE>, and <CODE>dirs</CODE> builtins to manipulate it
+(see section <A HREF="bashref.html#SEC82">6.8 The Directory Stack</A>).
+Bash also makes the directory stack visible as the value of the
+<CODE>DIRSTACK</CODE> shell variable.
+<P>
+
+<LI>
+Bash interprets special backslash-escaped characters in the prompt
+strings when interactive (see section <A HREF="bashref.html#SEC84">6.9 Controlling the Prompt</A>).
+<P>
+
+<LI>
+The Bash restricted mode is more useful (see section <A HREF="bashref.html#SEC85">6.10 The Restricted Shell</A>);
+the SVR4.2 shell restricted mode is too limited.
+<P>
+
+<LI>
+The <CODE>disown</CODE> builtin can remove a job from the internal shell
+job table (see section <A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A>) or suppress the sending
+of <CODE>SIGHUP</CODE> to a job when the shell exits as the result of a
+<CODE>SIGHUP</CODE>.
+<P>
+
+<LI>
+The SVR4.2 shell has two privilege-related builtins
+(<CODE>mldmode</CODE> and <CODE>priv</CODE>) not present in Bash.
+<P>
+
+<LI>
+Bash does not have the <CODE>stop</CODE> or <CODE>newgrp</CODE> builtins.
+<P>
+
+<LI>
+Bash does not use the <CODE>SHACCT</CODE> variable or perform shell accounting.
+<P>
+
+<LI>
+The SVR4.2 <CODE>sh</CODE> uses a <CODE>TIMEOUT</CODE> variable like Bash uses
+<CODE>TMOUT</CODE>.
+<P>
+
+</UL>
+<P>
+
+More features unique to Bash may be found in <A HREF="bashref.html#SEC64">6. Bash Features</A>.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC133"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC132"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC134"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC132"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC132"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC134"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> B.1 Implementation Differences From The SVR4.2 Shell </H2>
+<!--docid::SEC133::-->
+<P>
+
+Since Bash is a completely new implementation, it does not suffer from
+many of the limitations of the SVR4.2 shell.  For instance:
+</P><P>
+
+<UL>
+
+<LI>
+Bash does not fork a subshell when redirecting into or out of
+a shell control structure such as  an <CODE>if</CODE> or <CODE>while</CODE>
+statement.
+<P>
+
+<LI>
+Bash does not allow unbalanced quotes.  The SVR4.2 shell will silently
+insert a needed closing quote at <CODE>EOF</CODE> under certain circumstances.
+This can be the cause of some hard-to-find errors.
+<P>
+
+<LI>
+The SVR4.2 shell uses a baroque memory management scheme based on
+trapping <CODE>SIGSEGV</CODE>.  If the shell is started from a process with
+<CODE>SIGSEGV</CODE> blocked (e.g., by using the <CODE>system()</CODE> C library
+function call), it misbehaves badly.
+<P>
+
+<LI>
+In a questionable attempt at security, the SVR4.2 shell,
+when invoked without the <SAMP>`-p'</SAMP> option, will alter its real
+and effective UID and GID if they are less than some
+magic threshold value, commonly 100.
+This can lead to unexpected results.
+<P>
+
+<LI>
+The SVR4.2 shell does not allow users to trap <CODE>SIGSEGV</CODE>,
+<CODE>SIGALRM</CODE>, or <CODE>SIGCHLD</CODE>.
+<P>
+
+<LI>
+The SVR4.2 shell does not allow the <CODE>IFS</CODE>, <CODE>MAILCHECK</CODE>,
+<CODE>PATH</CODE>, <CODE>PS1</CODE>, or <CODE>PS2</CODE> variables to be unset.
+<P>
+
+<LI>
+The SVR4.2 shell treats <SAMP>`^'</SAMP> as the undocumented equivalent of
+<SAMP>`|'</SAMP>.
+<P>
+
+<LI>
+Bash allows multiple option arguments when it is invoked (<CODE>-x -v</CODE>);
+the SVR4.2 shell allows only one option argument (<CODE>-xv</CODE>).  In
+fact, some versions of the shell dump core if the second argument begins
+with a <SAMP>`-'</SAMP>.
+<P>
+
+<LI>
+The SVR4.2 shell exits a script if any builtin fails; Bash exits
+a script only if one of the POSIX 1003.2 special builtins fails, and
+only for certain failures, as enumerated in the POSIX 1003.2 standard.
+<P>
+
+<LI>
+The SVR4.2 shell behaves differently when invoked as <CODE>jsh</CODE>
+(it turns on job control).
+</UL>
+<P>
+
+<A NAME="Copying This Manual"></A>
+<HR SIZE="6">
+<A NAME="SEC134"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC133"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC135"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> C. Copying This Manual </H1>
+<!--docid::SEC134::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="bashref.html#SEC135">C.1 GNU Free Documentation License</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">License for copying this manual.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="GNU Free Documentation License"></A>
+<HR SIZE="6">
+<A NAME="SEC135"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC134"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC136"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC134"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> C.1 GNU Free Documentation License </H2>
+<!--docid::SEC135::-->
+<P>
+
+<A NAME="IDX503"></A>
+<center>
+ Version 1.2, November 2002
+</center>
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></td></tr></table></P><P>
+
+<OL>
+<LI>
+PREAMBLE
+<P>
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document <EM>free</EM> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</P><P>
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</P><P>
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+</P><P>
+
+<LI>
+APPLICABILITY AND DEFINITIONS
+<P>
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</P><P>
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</P><P>
+
+A "Secondary Section" is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</P><P>
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+</P><P>
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</P><P>
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+</P><P>
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input
+format, <FONT SIZE="-1">SGML</FONT> or <FONT SIZE="-1">XML</FONT> using a publicly available
+<FONT SIZE="-1">DTD</FONT>, and standard-conforming simple <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> designed for human modification.  Examples
+of transparent image formats include <FONT SIZE="-1">PNG</FONT>, <FONT SIZE="-1">XCF</FONT> and
+<FONT SIZE="-1">JPG</FONT>.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <FONT SIZE="-1">SGML</FONT> or
+<FONT SIZE="-1">XML</FONT> for which the <FONT SIZE="-1">DTD</FONT> and/or processing tools are
+not generally available, and the machine-generated <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> produced by some word processors for
+output purposes only.
+</P><P>
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+</P><P>
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+</P><P>
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</P><P>
+
+<LI>
+VERBATIM COPYING
+<P>
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</P><P>
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</P><P>
+
+<LI>
+COPYING IN QUANTITY
+<P>
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</P><P>
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</P><P>
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</P><P>
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</P><P>
+
+<LI>
+MODIFICATIONS
+<P>
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+</P><P>
+
+<OL>
+<LI>
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+<P>
+
+<LI>
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+<P>
+
+<LI>
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+<P>
+
+<LI>
+Preserve all the copyright notices of the Document.
+<P>
+
+<LI>
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+<P>
+
+<LI>
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+<P>
+
+<LI>
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+<P>
+
+<LI>
+Include an unaltered copy of this License.
+<P>
+
+<LI>
+Preserve the section Entitled "History", Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled "History" in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+<P>
+
+<LI>
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the "History" section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+<P>
+
+<LI>
+For any section Entitled "Acknowledgements" or "Dedications", Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+<P>
+
+<LI>
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+<P>
+
+<LI>
+Delete any section Entitled "Endorsements".  Such a section
+may not be included in the Modified Version.
+<P>
+
+<LI>
+Do not retitle any existing section to be Entitled "Endorsements" or
+to conflict in title with any Invariant Section.
+<P>
+
+<LI>
+Preserve any Warranty Disclaimers.
+</OL>
+<P>
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+</P><P>
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</P><P>
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</P><P>
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</P><P>
+
+<LI>
+COMBINING DOCUMENTS
+<P>
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</P><P>
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</P><P>
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all
+sections Entitled "Endorsements."
+</P><P>
+
+<LI>
+COLLECTIONS OF DOCUMENTS
+<P>
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</P><P>
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</P><P>
+
+<LI>
+AGGREGATION WITH INDEPENDENT WORKS
+<P>
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</P><P>
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</P><P>
+
+<LI>
+TRANSLATION
+<P>
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</P><P>
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</P><P>
+
+<LI>
+TERMINATION
+<P>
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+</P><P>
+
+<LI>
+FUTURE REVISIONS OF THIS LICENSE
+<P>
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+</P><P>
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+</OL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC136"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC135"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC137"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC135"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> C.1.1 ADDENDUM: How to use this License for your documents </H3>
+<!--docid::SEC136::-->
+<P>
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>  Copyright (C)  <VAR>year</VAR>  <VAR>your name</VAR>.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>    with the Invariant Sections being <VAR>list their titles</VAR>, with
+    the Front-Cover Texts being <VAR>list</VAR>, and with the Back-Cover Texts
+    being <VAR>list</VAR>.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</P><P>
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</P><P>
+
+<A NAME="Builtin Index"></A>
+<HR SIZE="6">
+<A NAME="SEC137"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC136"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC138"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Index of Shell Builtin Commands </H1>
+<!--docid::SEC137::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#bt_." style="text-decoration:none"><b>.</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_:" style="text-decoration:none"><b>:</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_[" style="text-decoration:none"><b>[</b></A>
+ &nbsp; 
+<BR>
+<A HREF="bashref.html#bt_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_."></A>.</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX69"><CODE>.</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_:"></A>:</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX68"><CODE>:</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_["></A>[</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX84"><CODE>[</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX89"><CODE>alias</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX271"><CODE>bg</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX90"><CODE>bind</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX70"><CODE>break</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX91"><CODE>builtin</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX92"><CODE>caller</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX71"><CODE>cd</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX93"><CODE>command</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX497"><CODE>compgen</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX498"><CODE>complete</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX72"><CODE>continue</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX94"><CODE>declare</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX268"><CODE>dirs</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC83">6.8.1 Directory Stack Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX276"><CODE>disown</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX95"><CODE>echo</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX96"><CODE>enable</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX73"><CODE>eval</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX74"><CODE>exec</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX75"><CODE>exit</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX76"><CODE>export</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX500"><CODE>fc</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC117">9.2 Bash History Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX272"><CODE>fg</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_G"></A>G</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX77"><CODE>getopts</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX78"><CODE>hash</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX97"><CODE>help</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX501"><CODE>history</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC117">9.2 Bash History Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_J"></A>J</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX273"><CODE>jobs</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX274"><CODE>kill</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_L"></A>L</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX98"><CODE>let</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX99"><CODE>local</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX100"><CODE>logout</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX269"><CODE>popd</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC83">6.8.1 Directory Stack Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX101"><CODE>printf</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX270"><CODE>pushd</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC83">6.8.1 Directory Stack Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX79"><CODE>pwd</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX102"><CODE>read</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX80"><CODE>readonly</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX81"><CODE>return</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX109"><CODE>set</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC59">4.3 The Set Builtin</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX82"><CODE>shift</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX103"><CODE>shopt</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX104"><CODE>source</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX277"><CODE>suspend</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX83"><CODE>test</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX85"><CODE>times</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX86"><CODE>trap</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX105"><CODE>type</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX106"><CODE>typeset</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX107"><CODE>ulimit</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX87"><CODE>umask</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX108"><CODE>unalias</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX88"><CODE>unset</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="bt_W"></A>W</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX275"><CODE>wait</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC89">7.2 Job Control Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#bt_." style="text-decoration:none"><b>.</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_:" style="text-decoration:none"><b>:</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_[" style="text-decoration:none"><b>[</b></A>
+ &nbsp; 
+<BR>
+<A HREF="bashref.html#bt_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="bashref.html#bt_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<A NAME="Reserved Word Index"></A>
+<HR SIZE="6">
+<A NAME="SEC138"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC137"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC139"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Index of Shell Reserved Words </H1>
+<!--docid::SEC138::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#rw_!" style="text-decoration:none"><b>!</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_[" style="text-decoration:none"><b>[</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_]" style="text-decoration:none"><b>]</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_{" style="text-decoration:none"><b>{</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_}" style="text-decoration:none"><b>}</b></A>
+ &nbsp; 
+<BR>
+<A HREF="bashref.html#rw_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_!"></A>!</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX25"><CODE>!</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC17">3.2.2 Pipelines</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_["></A>[</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX41"><CODE>[[</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_]"></A>]</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX42"><CODE>]]</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_{"></A>{</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX43"><CODE>{</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC22">3.2.4.3 Grouping Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_}"></A>}</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX44"><CODE>}</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC22">3.2.4.3 Grouping Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX37"><CODE>case</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX28"><CODE>do</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX29"><CODE>done</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX35"><CODE>elif</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX34"><CODE>else</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX39"><CODE>esac</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX36"><CODE>fi</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX31"><CODE>for</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX45"><CODE>function</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC23">3.3 Shell Functions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX32"><CODE>if</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX38"><CODE>in</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX40"><CODE>select</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX33"><CODE>then</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX24"><CODE>time</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC17">3.2.2 Pipelines</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX27"><CODE>until</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="rw_W"></A>W</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX30"><CODE>while</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#rw_!" style="text-decoration:none"><b>!</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_[" style="text-decoration:none"><b>[</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_]" style="text-decoration:none"><b>]</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_{" style="text-decoration:none"><b>{</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_}" style="text-decoration:none"><b>}</b></A>
+ &nbsp; 
+<BR>
+<A HREF="bashref.html#rw_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="bashref.html#rw_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<A NAME="Variable Index"></A>
+<HR SIZE="6">
+<A NAME="SEC139"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC138"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC140"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Parameter and Variable Index </H1>
+<!--docid::SEC139::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#vr_!" style="text-decoration:none"><b>!</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_#" style="text-decoration:none"><b>#</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_$" style="text-decoration:none"><b>$</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_*" style="text-decoration:none"><b>*</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_0" style="text-decoration:none"><b>0</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_?" style="text-decoration:none"><b>?</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_@" style="text-decoration:none"><b>@</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr__" style="text-decoration:none"><b>_</b></A>
+ &nbsp; 
+<BR>
+<A HREF="bashref.html#vr_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_!"></A>!</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX58"><CODE>!</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX59"><CODE>!</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_#"></A>#</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX50"><CODE>#</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX51"><CODE>#</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_$"></A>$</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX56"><CODE>$</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX57"><CODE>$</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_*"></A>*</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX46"><CODE>*</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX47"><CODE>*</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_-"></A>-</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX54"><CODE>-</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX55"><CODE>-</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_0"></A>0</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX60"><CODE>0</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX61"><CODE>0</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_?"></A>?</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX52"><CODE>?</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX53"><CODE>?</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_@"></A>@</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX48"><CODE>@</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX49"><CODE>@</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr__"></A>_</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX62"><CODE>_</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX63"><CODE>_</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX278"><CODE>auto_resume</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC90">7.3 Job Control Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX279"><CODE>auto_resume</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC90">7.3 Job Control Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX130"><CODE>BASH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX131"><CODE>BASH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX132"><CODE>BASH_ARGC</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX133"><CODE>BASH_ARGC</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX134"><CODE>BASH_ARGV</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX135"><CODE>BASH_ARGV</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX136"><CODE>BASH_COMMAND</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX137"><CODE>BASH_COMMAND</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX138"><CODE>BASH_ENV</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX139"><CODE>BASH_ENV</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX140"><CODE>BASH_EXECUTION_STRING</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX141"><CODE>BASH_EXECUTION_STRING</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX142"><CODE>BASH_LINENO</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX143"><CODE>BASH_LINENO</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX144"><CODE>BASH_REMATCH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX145"><CODE>BASH_REMATCH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX146"><CODE>BASH_SOURCE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX147"><CODE>BASH_SOURCE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX148"><CODE>BASH_SUBSHELL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX149"><CODE>BASH_SUBSHELL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX150"><CODE>BASH_VERSINFO</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX151"><CODE>BASH_VERSINFO</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX152"><CODE>BASH_VERSION</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX153"><CODE>BASH_VERSION</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX285"><CODE>bell-style</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX110"><CODE>CDPATH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX111"><CODE>CDPATH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX154"><CODE>COLUMNS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX155"><CODE>COLUMNS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX286"><CODE>comment-begin</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX156"><CODE>COMP_CWORD</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX157"><CODE>COMP_CWORD</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX158"><CODE>COMP_LINE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX159"><CODE>COMP_LINE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX160"><CODE>COMP_POINT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX161"><CODE>COMP_POINT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX162"><CODE>COMP_WORDBREAKS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX163"><CODE>COMP_WORDBREAKS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX164"><CODE>COMP_WORDS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX165"><CODE>COMP_WORDS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX287"><CODE>completion-query-items</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX166"><CODE>COMPREPLY</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX167"><CODE>COMPREPLY</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX288"><CODE>convert-meta</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX168"><CODE>DIRSTACK</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX169"><CODE>DIRSTACK</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX289"><CODE>disable-completion</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX290"><CODE>editing-mode</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX170"><CODE>EMACS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX171"><CODE>EMACS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX291"><CODE>enable-keypad</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX172"><CODE>EUID</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX173"><CODE>EUID</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX292"><CODE>expand-tilde</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX174"><CODE>FCEDIT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX175"><CODE>FCEDIT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX176"><CODE>FIGNORE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX177"><CODE>FIGNORE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX178"><CODE>FUNCNAME</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX179"><CODE>FUNCNAME</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_G"></A>G</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX180"><CODE>GLOBIGNORE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX181"><CODE>GLOBIGNORE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX182"><CODE>GROUPS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX183"><CODE>GROUPS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX184"><CODE>histchars</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX185"><CODE>histchars</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX186"><CODE>HISTCMD</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX187"><CODE>HISTCMD</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX188"><CODE>HISTCONTROL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX189"><CODE>HISTCONTROL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX190"><CODE>HISTFILE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX191"><CODE>HISTFILE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX192"><CODE>HISTFILESIZE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX193"><CODE>HISTFILESIZE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX194"><CODE>HISTIGNORE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX195"><CODE>HISTIGNORE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX293"><CODE>history-preserve-point</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX196"><CODE>HISTSIZE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX197"><CODE>HISTSIZE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX198"><CODE>HISTTIMEFORMAT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX199"><CODE>HISTTIMEFORMAT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX112"><CODE>HOME</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX113"><CODE>HOME</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX294"><CODE>horizontal-scroll-mode</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX200"><CODE>HOSTFILE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX201"><CODE>HOSTFILE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX202"><CODE>HOSTNAME</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX203"><CODE>HOSTNAME</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX204"><CODE>HOSTTYPE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX205"><CODE>HOSTTYPE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX114"><CODE>IFS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX115"><CODE>IFS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX206"><CODE>IGNOREEOF</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX207"><CODE>IGNOREEOF</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX295"><CODE>input-meta</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX208"><CODE>INPUTRC</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX209"><CODE>INPUTRC</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX297"><CODE>isearch-terminators</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX298"><CODE>keymap</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_L"></A>L</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX210"><CODE>LANG</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX211"><CODE>LANG</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX212"><CODE>LC_ALL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX213"><CODE>LC_ALL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX214"><CODE>LC_COLLATE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX215"><CODE>LC_COLLATE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX216"><CODE>LC_CTYPE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX217"><CODE>LC_CTYPE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX21"><CODE>LC_MESSAGES</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX218"><CODE>LC_MESSAGES</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX219"><CODE>LC_MESSAGES</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX220"><CODE>LC_NUMERIC</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX221"><CODE>LC_NUMERIC</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX222"><CODE>LINENO</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX223"><CODE>LINENO</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX224"><CODE>LINES</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX225"><CODE>LINES</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_M"></A>M</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX226"><CODE>MACHTYPE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX227"><CODE>MACHTYPE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX116"><CODE>MAIL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX117"><CODE>MAIL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX228"><CODE>MAILCHECK</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX229"><CODE>MAILCHECK</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX118"><CODE>MAILPATH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX119"><CODE>MAILPATH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX299"><CODE>mark-modified-lines</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX300"><CODE>mark-symlinked-directories</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX301"><CODE>match-hidden-files</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX296"><CODE>meta-flag</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_O"></A>O</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX230"><CODE>OLDPWD</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX231"><CODE>OLDPWD</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX120"><CODE>OPTARG</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX121"><CODE>OPTARG</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX232"><CODE>OPTERR</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX233"><CODE>OPTERR</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX122"><CODE>OPTIND</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX123"><CODE>OPTIND</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX234"><CODE>OSTYPE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX235"><CODE>OSTYPE</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX302"><CODE>output-meta</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX303"><CODE>page-completions</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX124"><CODE>PATH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX125"><CODE>PATH</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX236"><CODE>PIPESTATUS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX237"><CODE>PIPESTATUS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX238"><CODE>POSIXLY_CORRECT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX239"><CODE>POSIXLY_CORRECT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX240"><CODE>PPID</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX241"><CODE>PPID</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX242"><CODE>PROMPT_COMMAND</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX243"><CODE>PROMPT_COMMAND</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX126"><CODE>PS1</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX127"><CODE>PS1</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX128"><CODE>PS2</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX129"><CODE>PS2</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX244"><CODE>PS3</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX245"><CODE>PS3</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX246"><CODE>PS4</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX247"><CODE>PS4</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX248"><CODE>PWD</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX249"><CODE>PWD</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX250"><CODE>RANDOM</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX251"><CODE>RANDOM</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX252"><CODE>REPLY</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX253"><CODE>REPLY</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX254"><CODE>SECONDS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX255"><CODE>SECONDS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX256"><CODE>SHELLOPTS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX257"><CODE>SHELLOPTS</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX258"><CODE>SHLVL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX259"><CODE>SHLVL</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX304"><CODE>show-all-if-ambiguous</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX305"><CODE>show-all-if-unmodified</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX22"><CODE>TEXTDOMAIN</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX23"><CODE>TEXTDOMAINDIR</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX260"><CODE>TIMEFORMAT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX261"><CODE>TIMEFORMAT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX262"><CODE>TMOUT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX263"><CODE>TMOUT</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX264"><CODE>UID</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX265"><CODE>UID</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC63">5.2 Bash Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_V"></A>V</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX306"><CODE>visible-stats</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#vr_!" style="text-decoration:none"><b>!</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_#" style="text-decoration:none"><b>#</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_$" style="text-decoration:none"><b>$</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_*" style="text-decoration:none"><b>*</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_0" style="text-decoration:none"><b>0</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_?" style="text-decoration:none"><b>?</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_@" style="text-decoration:none"><b>@</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr__" style="text-decoration:none"><b>_</b></A>
+ &nbsp; 
+<BR>
+<A HREF="bashref.html#vr_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="bashref.html#vr_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<A NAME="Function Index"></A>
+<HR SIZE="6">
+<A NAME="SEC140"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC139"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC141"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Function Index </H1>
+<!--docid::SEC140::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX445"><CODE>abort (C-g)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX446"><CODE>abort (C-g)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX323"><CODE>accept-line (Newline or Return)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX324"><CODE>accept-line (Newline or Return)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX487"><CODE>alias-expand-line ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX488"><CODE>alias-expand-line ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX313"><CODE>backward-char (C-b)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX314"><CODE>backward-char (C-b)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX351"><CODE>backward-delete-char (Rubout)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX352"><CODE>backward-delete-char (Rubout)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX373"><CODE>backward-kill-line (C-x Rubout)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX374"><CODE>backward-kill-line (C-x Rubout)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX381"><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX382"><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX317"><CODE>backward-word (M-b)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX318"><CODE>backward-word (M-b)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX329"><CODE>beginning-of-history (M-&#38;#60;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX330"><CODE>beginning-of-history (M-&#38;#60;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX307"><CODE>beginning-of-line (C-a)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX308"><CODE>beginning-of-line (C-a)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX441"><CODE>call-last-kbd-macro (C-x e)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC110">8.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX442"><CODE>call-last-kbd-macro (C-x e)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC110">8.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX367"><CODE>capitalize-word (M-c)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX368"><CODE>capitalize-word (M-c)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX461"><CODE>character-search (C-])</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX462"><CODE>character-search (C-])</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX463"><CODE>character-search-backward (M-C-])</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX464"><CODE>character-search-backward (M-C-])</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX319"><CODE>clear-screen (C-l)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX320"><CODE>clear-screen (C-l)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX403"><CODE>complete (<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX404"><CODE>complete (<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX429"><CODE>complete-command (M-!)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX430"><CODE>complete-command (M-!)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX413"><CODE>complete-filename (M-/)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX414"><CODE>complete-filename (M-/)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX425"><CODE>complete-hostname (M-@)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX426"><CODE>complete-hostname (M-@)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX435"><CODE>complete-into-braces (M-{)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX436"><CODE>complete-into-braces (M-{)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX417"><CODE>complete-username (M-~)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX418"><CODE>complete-username (M-~)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX421"><CODE>complete-variable (M-$)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX422"><CODE>complete-variable (M-$)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX391"><CODE>copy-backward-word ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX392"><CODE>copy-backward-word ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX393"><CODE>copy-forward-word ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX394"><CODE>copy-forward-word ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX389"><CODE>copy-region-as-kill ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX390"><CODE>copy-region-as-kill ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX349"><CODE>delete-char (C-d)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX350"><CODE>delete-char (C-d)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX411"><CODE>delete-char-or-list ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX412"><CODE>delete-char-or-list ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX385"><CODE>delete-horizontal-space ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX386"><CODE>delete-horizontal-space ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX399"><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, &#60;small&#62;...&#60;/small&#62; <KBD>M--</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC108">8.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX400"><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, &#60;small&#62;...&#60;/small&#62; <KBD>M--</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC108">8.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX479"><CODE>display-shell-version (C-x C-v)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX480"><CODE>display-shell-version (C-x C-v)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX447"><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX448"><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX365"><CODE>downcase-word (M-l)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX366"><CODE>downcase-word (M-l)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX467"><CODE>dump-functions ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX468"><CODE>dump-functions ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX471"><CODE>dump-macros ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX472"><CODE>dump-macros ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX469"><CODE>dump-variables ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX470"><CODE>dump-variables ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX433"><CODE>dynamic-complete-history (M-<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX434"><CODE>dynamic-complete-history (M-<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX495"><CODE>edit-and-execute-command (C-xC-e)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX496"><CODE>edit-and-execute-command (C-xC-e)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX439"><CODE>end-kbd-macro (C-x ))</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC110">8.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX440"><CODE>end-kbd-macro (C-x ))</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC110">8.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX331"><CODE>end-of-history (M-&#38;#62;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX332"><CODE>end-of-history (M-&#38;#62;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX309"><CODE>end-of-line (C-e)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX310"><CODE>end-of-line (C-e)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX459"><CODE>exchange-point-and-mark (C-x C-x)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX460"><CODE>exchange-point-and-mark (C-x C-x)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX353"><CODE>forward-backward-delete-char ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX354"><CODE>forward-backward-delete-char ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX311"><CODE>forward-char (C-f)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX312"><CODE>forward-char (C-f)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX335"><CODE>forward-search-history (C-s)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX336"><CODE>forward-search-history (C-s)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX315"><CODE>forward-word (M-f)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX316"><CODE>forward-word (M-f)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_G"></A>G</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX473"><CODE>glob-complete-word (M-g)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX474"><CODE>glob-complete-word (M-g)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX475"><CODE>glob-expand-word (C-x *)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX476"><CODE>glob-expand-word (C-x *)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX477"><CODE>glob-list-expansions (C-x g)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX478"><CODE>glob-list-expansions (C-x g)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX489"><CODE>history-and-alias-expand-line ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX490"><CODE>history-and-alias-expand-line ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX483"><CODE>history-expand-line (M-^)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX484"><CODE>history-expand-line (M-^)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX343"><CODE>history-search-backward ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX344"><CODE>history-search-backward ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX341"><CODE>history-search-forward ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX342"><CODE>history-search-forward ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX465"><CODE>insert-comment (M-#)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX466"><CODE>insert-comment (M-#)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX407"><CODE>insert-completions (M-*)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX408"><CODE>insert-completions (M-*)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX491"><CODE>insert-last-argument (M-. or M-_)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX492"><CODE>insert-last-argument (M-. or M-_)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX371"><CODE>kill-line (C-k)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX372"><CODE>kill-line (C-k)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX387"><CODE>kill-region ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX388"><CODE>kill-region ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX377"><CODE>kill-whole-line ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX378"><CODE>kill-whole-line ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX379"><CODE>kill-word (M-d)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX380"><CODE>kill-word (M-d)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_M"></A>M</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX485"><CODE>magic-space ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX486"><CODE>magic-space ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX409"><CODE>menu-complete ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX410"><CODE>menu-complete ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX327"><CODE>next-history (C-n)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX328"><CODE>next-history (C-n)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX339"><CODE>non-incremental-forward-search-history (M-n)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX340"><CODE>non-incremental-forward-search-history (M-n)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX337"><CODE>non-incremental-reverse-search-history (M-p)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX338"><CODE>non-incremental-reverse-search-history (M-p)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_O"></A>O</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX493"><CODE>operate-and-get-next (C-o)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX494"><CODE>operate-and-get-next (C-o)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX369"><CODE>overwrite-mode ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX370"><CODE>overwrite-mode ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX431"><CODE>possible-command-completions (C-x !)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX432"><CODE>possible-command-completions (C-x !)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX405"><CODE>possible-completions (M-?)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX406"><CODE>possible-completions (M-?)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX415"><CODE>possible-filename-completions (C-x /)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX416"><CODE>possible-filename-completions (C-x /)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX427"><CODE>possible-hostname-completions (C-x @)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX428"><CODE>possible-hostname-completions (C-x @)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX419"><CODE>possible-username-completions (C-x ~)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX420"><CODE>possible-username-completions (C-x ~)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX423"><CODE>possible-variable-completions (C-x $)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX424"><CODE>possible-variable-completions (C-x $)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX449"><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX450"><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX325"><CODE>previous-history (C-p)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX326"><CODE>previous-history (C-p)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Q"></A>Q</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX355"><CODE>quoted-insert (C-q or C-v)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX356"><CODE>quoted-insert (C-q or C-v)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX443"><CODE>re-read-init-file (C-x C-r)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX444"><CODE>re-read-init-file (C-x C-r)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX321"><CODE>redraw-current-line ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX322"><CODE>redraw-current-line ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX333"><CODE>reverse-search-history (C-r)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX334"><CODE>reverse-search-history (C-r)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX453"><CODE>revert-line (M-r)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX454"><CODE>revert-line (M-r)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX357"><CODE>self-insert (a, b, A, 1, !, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX358"><CODE>self-insert (a, b, A, 1, !, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX457"><CODE>set-mark (C-@)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX458"><CODE>set-mark (C-@)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX481"><CODE>shell-expand-line (M-C-e)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX482"><CODE>shell-expand-line (M-C-e)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX437"><CODE>start-kbd-macro (C-x ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC110">8.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX438"><CODE>start-kbd-macro (C-x ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC110">8.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX455"><CODE>tilde-expand (M-&#38;#38;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX456"><CODE>tilde-expand (M-&#38;#38;)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX359"><CODE>transpose-chars (C-t)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX360"><CODE>transpose-chars (C-t)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX361"><CODE>transpose-words (M-t)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX362"><CODE>transpose-words (M-t)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX451"><CODE>undo (C-_ or C-x C-u)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX452"><CODE>undo (C-_ or C-x C-u)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX401"><CODE>universal-argument ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC108">8.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX402"><CODE>universal-argument ()</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC108">8.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX375"><CODE>unix-line-discard (C-u)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX376"><CODE>unix-line-discard (C-u)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX383"><CODE>unix-word-rubout (C-w)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX384"><CODE>unix-word-rubout (C-w)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX363"><CODE>upcase-word (M-u)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX364"><CODE>upcase-word (M-u)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Y"></A>Y</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX395"><CODE>yank (C-y)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX396"><CODE>yank (C-y)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX347"><CODE>yank-last-arg (M-. or M-_)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX348"><CODE>yank-last-arg (M-. or M-_)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX345"><CODE>yank-nth-arg (M-C-y)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX346"><CODE>yank-nth-arg (M-C-y)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX397"><CODE>yank-pop (M-y)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX398"><CODE>yank-pop (M-y)</CODE></A></TD><TD valign=top><A HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="bashref.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<A NAME="Concept Index"></A>
+<HR SIZE="6">
+<A NAME="SEC141"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC140"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Concept Index </H1>
+<!--docid::SEC141::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC80">alias expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC80">6.6 Aliases</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC79">arithmetic evaluation</A></TD><TD valign=top><A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC32">arithmetic expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC32">3.5.5 Arithmetic Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC79">arithmetic, shell</A></TD><TD valign=top><A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC81">arrays</A></TD><TD valign=top><A HREF="bashref.html#SEC81">6.7 Arrays</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC88">background</A></TD><TD valign=top><A HREF="bashref.html#SEC88">7.1 Job Control Basics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC123">Bash configuration</A></TD><TD valign=top><A HREF="bashref.html#SEC123">10.1 Basic Installation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC123">Bash installation</A></TD><TD valign=top><A HREF="bashref.html#SEC123">10.1 Basic Installation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC5">Bourne shell</A></TD><TD valign=top><A HREF="bashref.html#SEC5">3. Basic Shell Features</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC28">brace expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC28">3.5.1 Brace Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX2">builtin</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC94">command editing</A></TD><TD valign=top><A HREF="bashref.html#SEC94">8.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC50">command execution</A></TD><TD valign=top><A HREF="bashref.html#SEC50">3.7.2 Command Search and Execution</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC49">command expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC49">3.7.1 Simple Command Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC116">command history</A></TD><TD valign=top><A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC50">command search</A></TD><TD valign=top><A HREF="bashref.html#SEC50">3.7.2 Command Search and Execution</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC31">command substitution</A></TD><TD valign=top><A HREF="bashref.html#SEC31">3.5.4 Command Substitution</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX26">command timing</A></TD><TD valign=top><A HREF="bashref.html#SEC17">3.2.2 Pipelines</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC19">commands, compound</A></TD><TD valign=top><A HREF="bashref.html#SEC19">3.2.4 Compound Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC21">commands, conditional</A></TD><TD valign=top><A HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC22">commands, grouping</A></TD><TD valign=top><A HREF="bashref.html#SEC22">3.2.4.3 Grouping Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC18">commands, lists</A></TD><TD valign=top><A HREF="bashref.html#SEC18">3.2.3 Lists of Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC20">commands, looping</A></TD><TD valign=top><A HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC17">commands, pipelines</A></TD><TD valign=top><A HREF="bashref.html#SEC17">3.2.2 Pipelines</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC15">commands, shell</A></TD><TD valign=top><A HREF="bashref.html#SEC15">3.2 Shell Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC16">commands, simple</A></TD><TD valign=top><A HREF="bashref.html#SEC16">3.2.1 Simple Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC14">comments, shell</A></TD><TD valign=top><A HREF="bashref.html#SEC14">3.1.3 Comments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC114">completion builtins</A></TD><TD valign=top><A HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC123">configuration</A></TD><TD valign=top><A HREF="bashref.html#SEC123">10.1 Basic Installation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX3">control operator</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC82">directory stack</A></TD><TD valign=top><A HREF="bashref.html#SEC82">6.8 The Directory Stack</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC94">editing command lines</A></TD><TD valign=top><A HREF="bashref.html#SEC94">8.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC52">environment</A></TD><TD valign=top><A HREF="bashref.html#SEC52">3.7.4 Environment</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC79">evaluation, arithmetic</A></TD><TD valign=top><A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC119">event designators</A></TD><TD valign=top><A HREF="bashref.html#SEC119">9.3.1 Event Designators</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC51">execution environment</A></TD><TD valign=top><A HREF="bashref.html#SEC51">3.7.3 Command Execution Environment</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX4">exit status</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC53">exit status</A></TD><TD valign=top><A HREF="bashref.html#SEC53">3.7.5 Exit Status</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC27">expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC27">3.5 Shell Expansions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC32">expansion, arithmetic</A></TD><TD valign=top><A HREF="bashref.html#SEC32">3.5.5 Arithmetic Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC28">expansion, brace</A></TD><TD valign=top><A HREF="bashref.html#SEC28">3.5.1 Brace Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX64">expansion, filename</A></TD><TD valign=top><A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC30">expansion, parameter</A></TD><TD valign=top><A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX65">expansion, pathname</A></TD><TD valign=top><A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC29">expansion, tilde</A></TD><TD valign=top><A HREF="bashref.html#SEC29">3.5.2 Tilde Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC79">expressions, arithmetic</A></TD><TD valign=top><A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC78">expressions, conditional</A></TD><TD valign=top><A HREF="bashref.html#SEC78">6.4 Bash Conditional Expressions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX503">FDL, GNU Free Documentation License</A></TD><TD valign=top><A HREF="bashref.html#SEC135">C.1 GNU Free Documentation License</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX5">field</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX6">filename</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX66">filename expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC88">foreground</A></TD><TD valign=top><A HREF="bashref.html#SEC88">7.1 Job Control Basics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC23">functions, shell</A></TD><TD valign=top><A HREF="bashref.html#SEC23">3.3 Shell Functions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC117">history builtins</A></TD><TD valign=top><A HREF="bashref.html#SEC117">9.2 Bash History Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX502">history events</A></TD><TD valign=top><A HREF="bashref.html#SEC119">9.3.1 Event Designators</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC118">history expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC118">9.3 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC116">history list</A></TD><TD valign=top><A HREF="bashref.html#SEC116">9.1 Bash History Facilities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX499">History, how to use</A></TD><TD valign=top><A HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX11">identifier</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC99">initialization file, readline</A></TD><TD valign=top><A HREF="bashref.html#SEC99">8.3 Readline Init File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC123">installation</A></TD><TD valign=top><A HREF="bashref.html#SEC123">10.1 Basic Installation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC93">interaction, readline</A></TD><TD valign=top><A HREF="bashref.html#SEC93">8.2 Readline Interaction</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX267">interactive shell</A></TD><TD valign=top><A HREF="bashref.html#SEC65">6.1 Invoking Bash</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC74">interactive shell</A></TD><TD valign=top><A HREF="bashref.html#SEC74">6.3 Interactive Shells</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC13">internationalization</A></TD><TD valign=top><A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_J"></A>J</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX7">job</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX8">job control</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC88">job control</A></TD><TD valign=top><A HREF="bashref.html#SEC88">7.1 Job Control Basics</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX283">kill ring</A></TD><TD valign=top><A HREF="bashref.html#SEC96">8.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX281">killing text</A></TD><TD valign=top><A HREF="bashref.html#SEC96">8.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_L"></A>L</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC13">localization</A></TD><TD valign=top><A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX266">login shell</A></TD><TD valign=top><A HREF="bashref.html#SEC65">6.1 Invoking Bash</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_M"></A>M</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC36">matching, pattern</A></TD><TD valign=top><A HREF="bashref.html#SEC36">3.5.8.1 Pattern Matching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX9">metacharacter</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX10">name</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC13">native languages</A></TD><TD valign=top><A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC94">notation, readline</A></TD><TD valign=top><A HREF="bashref.html#SEC94">8.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_O"></A>O</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX12">operator, shell</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC30">parameter expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC24">parameters</A></TD><TD valign=top><A HREF="bashref.html#SEC24">3.4 Shell Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC25">parameters, positional</A></TD><TD valign=top><A HREF="bashref.html#SEC25">3.4.1 Positional Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC26">parameters, special</A></TD><TD valign=top><A HREF="bashref.html#SEC26">3.4.2 Special Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX67">pathname expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC36">pattern matching</A></TD><TD valign=top><A HREF="bashref.html#SEC36">3.5.8.1 Pattern Matching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC17">pipeline</A></TD><TD valign=top><A HREF="bashref.html#SEC17">3.2.2 Pipelines</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX1">POSIX</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC86">POSIX Mode</A></TD><TD valign=top><A HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX13">process group</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX14">process group ID</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC33">process substitution</A></TD><TD valign=top><A HREF="bashref.html#SEC33">3.5.6 Process Substitution</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC113">programmable completion</A></TD><TD valign=top><A HREF="bashref.html#SEC113">8.6 Programmable Completion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC84">prompting</A></TD><TD valign=top><A HREF="bashref.html#SEC84">6.9 Controlling the Prompt</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_Q"></A>Q</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC8">quoting</A></TD><TD valign=top><A HREF="bashref.html#SEC8">3.1.2 Quoting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC12">quoting, ANSI</A></TD><TD valign=top><A HREF="bashref.html#SEC12">3.1.2.4 ANSI-C Quoting</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX280">Readline, how to use</A></TD><TD valign=top><A HREF="bashref.html#SEC90">7.3 Job Control Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC38">redirection</A></TD><TD valign=top><A HREF="bashref.html#SEC38">3.6 Redirections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX15">reserved word</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC85">restricted shell</A></TD><TD valign=top><A HREF="bashref.html#SEC85">6.10 The Restricted Shell</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX16">return status</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC79">shell arithmetic</A></TD><TD valign=top><A HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC23">shell function</A></TD><TD valign=top><A HREF="bashref.html#SEC23">3.3 Shell Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC55">shell script</A></TD><TD valign=top><A HREF="bashref.html#SEC55">3.8 Shell Scripts</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC24">shell variable</A></TD><TD valign=top><A HREF="bashref.html#SEC24">3.4 Shell Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC74">shell, interactive</A></TD><TD valign=top><A HREF="bashref.html#SEC74">6.3 Interactive Shells</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX17">signal</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC54">signal handling</A></TD><TD valign=top><A HREF="bashref.html#SEC54">3.7.6 Signals</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX18">special builtin</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC60">special builtin</A></TD><TD valign=top><A HREF="bashref.html#SEC60">4.4 Special Builtins</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC66">startup files</A></TD><TD valign=top><A HREF="bashref.html#SEC66">6.2 Bash Startup Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC88">suspending jobs</A></TD><TD valign=top><A HREF="bashref.html#SEC88">7.1 Job Control Basics</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC29">tilde expansion</A></TD><TD valign=top><A HREF="bashref.html#SEC29">3.5.2 Tilde Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX19">token</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC13">translation, native languages</A></TD><TD valign=top><A HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_V"></A>V</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC24">variable, shell</A></TD><TD valign=top><A HREF="bashref.html#SEC24">3.4 Shell Parameters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX284">variables, readline</A></TD><TD valign=top><A HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_W"></A>W</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX20">word</A></TD><TD valign=top><A HREF="bashref.html#SEC4">2. Definitions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#SEC34">word splitting</A></TD><TD valign=top><A HREF="bashref.html#SEC34">3.5.7 Word Splitting</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_Y"></A>Y</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="bashref.html#IDX282">yanking text</A></TD><TD valign=top><A HREF="bashref.html#SEC96">8.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="bashref.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+<A HREF="bashref.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<HR SIZE="6">
+<A NAME="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Table of Contents</H1>
+<UL>
+<A NAME="TOC1" HREF="bashref.html#SEC1">1. Introduction</A>
+<BR>
+<UL>
+<A NAME="TOC2" HREF="bashref.html#SEC2">1.1 What is Bash?</A>
+<BR>
+<A NAME="TOC3" HREF="bashref.html#SEC3">1.2 What is a shell?</A>
+<BR>
+</UL>
+<A NAME="TOC4" HREF="bashref.html#SEC4">2. Definitions</A>
+<BR>
+<A NAME="TOC5" HREF="bashref.html#SEC5">3. Basic Shell Features</A>
+<BR>
+<UL>
+<A NAME="TOC6" HREF="bashref.html#SEC6">3.1 Shell Syntax</A>
+<BR>
+<UL>
+<A NAME="TOC7" HREF="bashref.html#SEC7">3.1.1 Shell Operation</A>
+<BR>
+<A NAME="TOC8" HREF="bashref.html#SEC8">3.1.2 Quoting</A>
+<BR>
+<UL>
+<A NAME="TOC9" HREF="bashref.html#SEC9">3.1.2.1 Escape Character</A>
+<BR>
+<A NAME="TOC10" HREF="bashref.html#SEC10">3.1.2.2 Single Quotes</A>
+<BR>
+<A NAME="TOC11" HREF="bashref.html#SEC11">3.1.2.3 Double Quotes</A>
+<BR>
+<A NAME="TOC12" HREF="bashref.html#SEC12">3.1.2.4 ANSI-C Quoting</A>
+<BR>
+<A NAME="TOC13" HREF="bashref.html#SEC13">3.1.2.5 Locale-Specific Translation</A>
+<BR>
+</UL>
+<A NAME="TOC14" HREF="bashref.html#SEC14">3.1.3 Comments</A>
+<BR>
+</UL>
+<A NAME="TOC15" HREF="bashref.html#SEC15">3.2 Shell Commands</A>
+<BR>
+<UL>
+<A NAME="TOC16" HREF="bashref.html#SEC16">3.2.1 Simple Commands</A>
+<BR>
+<A NAME="TOC17" HREF="bashref.html#SEC17">3.2.2 Pipelines</A>
+<BR>
+<A NAME="TOC18" HREF="bashref.html#SEC18">3.2.3 Lists of Commands</A>
+<BR>
+<A NAME="TOC19" HREF="bashref.html#SEC19">3.2.4 Compound Commands</A>
+<BR>
+<UL>
+<A NAME="TOC20" HREF="bashref.html#SEC20">3.2.4.1 Looping Constructs</A>
+<BR>
+<A NAME="TOC21" HREF="bashref.html#SEC21">3.2.4.2 Conditional Constructs</A>
+<BR>
+<A NAME="TOC22" HREF="bashref.html#SEC22">3.2.4.3 Grouping Commands</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC23" HREF="bashref.html#SEC23">3.3 Shell Functions</A>
+<BR>
+<A NAME="TOC24" HREF="bashref.html#SEC24">3.4 Shell Parameters</A>
+<BR>
+<UL>
+<A NAME="TOC25" HREF="bashref.html#SEC25">3.4.1 Positional Parameters</A>
+<BR>
+<A NAME="TOC26" HREF="bashref.html#SEC26">3.4.2 Special Parameters</A>
+<BR>
+</UL>
+<A NAME="TOC27" HREF="bashref.html#SEC27">3.5 Shell Expansions</A>
+<BR>
+<UL>
+<A NAME="TOC28" HREF="bashref.html#SEC28">3.5.1 Brace Expansion</A>
+<BR>
+<A NAME="TOC29" HREF="bashref.html#SEC29">3.5.2 Tilde Expansion</A>
+<BR>
+<A NAME="TOC30" HREF="bashref.html#SEC30">3.5.3 Shell Parameter Expansion</A>
+<BR>
+<A NAME="TOC31" HREF="bashref.html#SEC31">3.5.4 Command Substitution</A>
+<BR>
+<A NAME="TOC32" HREF="bashref.html#SEC32">3.5.5 Arithmetic Expansion</A>
+<BR>
+<A NAME="TOC33" HREF="bashref.html#SEC33">3.5.6 Process Substitution</A>
+<BR>
+<A NAME="TOC34" HREF="bashref.html#SEC34">3.5.7 Word Splitting</A>
+<BR>
+<A NAME="TOC35" HREF="bashref.html#SEC35">3.5.8 Filename Expansion</A>
+<BR>
+<UL>
+<A NAME="TOC36" HREF="bashref.html#SEC36">3.5.8.1 Pattern Matching</A>
+<BR>
+</UL>
+<A NAME="TOC37" HREF="bashref.html#SEC37">3.5.9 Quote Removal</A>
+<BR>
+</UL>
+<A NAME="TOC38" HREF="bashref.html#SEC38">3.6 Redirections</A>
+<BR>
+<UL>
+<A NAME="TOC39" HREF="bashref.html#SEC39">3.6.1 Redirecting Input</A>
+<BR>
+<A NAME="TOC40" HREF="bashref.html#SEC40">3.6.2 Redirecting Output</A>
+<BR>
+<A NAME="TOC41" HREF="bashref.html#SEC41">3.6.3 Appending Redirected Output</A>
+<BR>
+<A NAME="TOC42" HREF="bashref.html#SEC42">3.6.4 Redirecting Standard Output and Standard Error</A>
+<BR>
+<A NAME="TOC43" HREF="bashref.html#SEC43">3.6.5 Here Documents</A>
+<BR>
+<A NAME="TOC44" HREF="bashref.html#SEC44">3.6.6 Here Strings</A>
+<BR>
+<A NAME="TOC45" HREF="bashref.html#SEC45">3.6.7 Duplicating File Descriptors</A>
+<BR>
+<A NAME="TOC46" HREF="bashref.html#SEC46">3.6.8 Moving File Descriptors</A>
+<BR>
+<A NAME="TOC47" HREF="bashref.html#SEC47">3.6.9 Opening File Descriptors for Reading and Writing</A>
+<BR>
+</UL>
+<A NAME="TOC48" HREF="bashref.html#SEC48">3.7 Executing Commands</A>
+<BR>
+<UL>
+<A NAME="TOC49" HREF="bashref.html#SEC49">3.7.1 Simple Command Expansion</A>
+<BR>
+<A NAME="TOC50" HREF="bashref.html#SEC50">3.7.2 Command Search and Execution</A>
+<BR>
+<A NAME="TOC51" HREF="bashref.html#SEC51">3.7.3 Command Execution Environment</A>
+<BR>
+<A NAME="TOC52" HREF="bashref.html#SEC52">3.7.4 Environment</A>
+<BR>
+<A NAME="TOC53" HREF="bashref.html#SEC53">3.7.5 Exit Status</A>
+<BR>
+<A NAME="TOC54" HREF="bashref.html#SEC54">3.7.6 Signals</A>
+<BR>
+</UL>
+<A NAME="TOC55" HREF="bashref.html#SEC55">3.8 Shell Scripts</A>
+<BR>
+</UL>
+<A NAME="TOC56" HREF="bashref.html#SEC56">4. Shell Builtin Commands</A>
+<BR>
+<UL>
+<A NAME="TOC57" HREF="bashref.html#SEC57">4.1 Bourne Shell Builtins</A>
+<BR>
+<A NAME="TOC58" HREF="bashref.html#SEC58">4.2 Bash Builtin Commands</A>
+<BR>
+<A NAME="TOC59" HREF="bashref.html#SEC59">4.3 The Set Builtin</A>
+<BR>
+<A NAME="TOC60" HREF="bashref.html#SEC60">4.4 Special Builtins</A>
+<BR>
+</UL>
+<A NAME="TOC61" HREF="bashref.html#SEC61">5. Shell Variables</A>
+<BR>
+<UL>
+<A NAME="TOC62" HREF="bashref.html#SEC62">5.1 Bourne Shell Variables</A>
+<BR>
+<A NAME="TOC63" HREF="bashref.html#SEC63">5.2 Bash Variables</A>
+<BR>
+</UL>
+<A NAME="TOC64" HREF="bashref.html#SEC64">6. Bash Features</A>
+<BR>
+<UL>
+<A NAME="TOC65" HREF="bashref.html#SEC65">6.1 Invoking Bash</A>
+<BR>
+<A NAME="TOC66" HREF="bashref.html#SEC66">6.2 Bash Startup Files</A>
+<BR>
+<A NAME="TOC74" HREF="bashref.html#SEC74">6.3 Interactive Shells</A>
+<BR>
+<UL>
+<A NAME="TOC75" HREF="bashref.html#SEC75">6.3.1 What is an Interactive Shell?</A>
+<BR>
+<A NAME="TOC76" HREF="bashref.html#SEC76">6.3.2 Is this Shell Interactive?</A>
+<BR>
+<A NAME="TOC77" HREF="bashref.html#SEC77">6.3.3 Interactive Shell Behavior</A>
+<BR>
+</UL>
+<A NAME="TOC78" HREF="bashref.html#SEC78">6.4 Bash Conditional Expressions</A>
+<BR>
+<A NAME="TOC79" HREF="bashref.html#SEC79">6.5 Shell Arithmetic</A>
+<BR>
+<A NAME="TOC80" HREF="bashref.html#SEC80">6.6 Aliases</A>
+<BR>
+<A NAME="TOC81" HREF="bashref.html#SEC81">6.7 Arrays</A>
+<BR>
+<A NAME="TOC82" HREF="bashref.html#SEC82">6.8 The Directory Stack</A>
+<BR>
+<UL>
+<A NAME="TOC83" HREF="bashref.html#SEC83">6.8.1 Directory Stack Builtins</A>
+<BR>
+</UL>
+<A NAME="TOC84" HREF="bashref.html#SEC84">6.9 Controlling the Prompt</A>
+<BR>
+<A NAME="TOC85" HREF="bashref.html#SEC85">6.10 The Restricted Shell</A>
+<BR>
+<A NAME="TOC86" HREF="bashref.html#SEC86">6.11 Bash POSIX Mode</A>
+<BR>
+</UL>
+<A NAME="TOC87" HREF="bashref.html#SEC87">7. Job Control</A>
+<BR>
+<UL>
+<A NAME="TOC88" HREF="bashref.html#SEC88">7.1 Job Control Basics</A>
+<BR>
+<A NAME="TOC89" HREF="bashref.html#SEC89">7.2 Job Control Builtins</A>
+<BR>
+<A NAME="TOC90" HREF="bashref.html#SEC90">7.3 Job Control Variables</A>
+<BR>
+</UL>
+<A NAME="TOC91" HREF="bashref.html#SEC91">8. Command Line Editing</A>
+<BR>
+<UL>
+<A NAME="TOC92" HREF="bashref.html#SEC92">8.1 Introduction to Line Editing</A>
+<BR>
+<A NAME="TOC93" HREF="bashref.html#SEC93">8.2 Readline Interaction</A>
+<BR>
+<UL>
+<A NAME="TOC94" HREF="bashref.html#SEC94">8.2.1 Readline Bare Essentials</A>
+<BR>
+<A NAME="TOC95" HREF="bashref.html#SEC95">8.2.2 Readline Movement Commands</A>
+<BR>
+<A NAME="TOC96" HREF="bashref.html#SEC96">8.2.3 Readline Killing Commands</A>
+<BR>
+<A NAME="TOC97" HREF="bashref.html#SEC97">8.2.4 Readline Arguments</A>
+<BR>
+<A NAME="TOC98" HREF="bashref.html#SEC98">8.2.5 Searching for Commands in the History</A>
+<BR>
+</UL>
+<A NAME="TOC99" HREF="bashref.html#SEC99">8.3 Readline Init File</A>
+<BR>
+<UL>
+<A NAME="TOC100" HREF="bashref.html#SEC100">8.3.1 Readline Init File Syntax</A>
+<BR>
+<A NAME="TOC101" HREF="bashref.html#SEC101">8.3.2 Conditional Init Constructs</A>
+<BR>
+<A NAME="TOC102" HREF="bashref.html#SEC102">8.3.3 Sample Init File</A>
+<BR>
+</UL>
+<A NAME="TOC103" HREF="bashref.html#SEC103">8.4 Bindable Readline Commands</A>
+<BR>
+<UL>
+<A NAME="TOC104" HREF="bashref.html#SEC104">8.4.1 Commands For Moving</A>
+<BR>
+<A NAME="TOC105" HREF="bashref.html#SEC105">8.4.2 Commands For Manipulating The History</A>
+<BR>
+<A NAME="TOC106" HREF="bashref.html#SEC106">8.4.3 Commands For Changing Text</A>
+<BR>
+<A NAME="TOC107" HREF="bashref.html#SEC107">8.4.4 Killing And Yanking</A>
+<BR>
+<A NAME="TOC108" HREF="bashref.html#SEC108">8.4.5 Specifying Numeric Arguments</A>
+<BR>
+<A NAME="TOC109" HREF="bashref.html#SEC109">8.4.6 Letting Readline Type For You</A>
+<BR>
+<A NAME="TOC110" HREF="bashref.html#SEC110">8.4.7 Keyboard Macros</A>
+<BR>
+<A NAME="TOC111" HREF="bashref.html#SEC111">8.4.8 Some Miscellaneous Commands</A>
+<BR>
+</UL>
+<A NAME="TOC112" HREF="bashref.html#SEC112">8.5 Readline vi Mode</A>
+<BR>
+<A NAME="TOC113" HREF="bashref.html#SEC113">8.6 Programmable Completion</A>
+<BR>
+<A NAME="TOC114" HREF="bashref.html#SEC114">8.7 Programmable Completion Builtins</A>
+<BR>
+</UL>
+<A NAME="TOC115" HREF="bashref.html#SEC115">9. Using History Interactively</A>
+<BR>
+<UL>
+<A NAME="TOC116" HREF="bashref.html#SEC116">9.1 Bash History Facilities</A>
+<BR>
+<A NAME="TOC117" HREF="bashref.html#SEC117">9.2 Bash History Builtins</A>
+<BR>
+<A NAME="TOC118" HREF="bashref.html#SEC118">9.3 History Expansion</A>
+<BR>
+<UL>
+<A NAME="TOC119" HREF="bashref.html#SEC119">9.3.1 Event Designators</A>
+<BR>
+<A NAME="TOC120" HREF="bashref.html#SEC120">9.3.2 Word Designators</A>
+<BR>
+<A NAME="TOC121" HREF="bashref.html#SEC121">9.3.3 Modifiers</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC122" HREF="bashref.html#SEC122">10. Installing Bash</A>
+<BR>
+<UL>
+<A NAME="TOC123" HREF="bashref.html#SEC123">10.1 Basic Installation</A>
+<BR>
+<A NAME="TOC124" HREF="bashref.html#SEC124">10.2 Compilers and Options</A>
+<BR>
+<A NAME="TOC125" HREF="bashref.html#SEC125">10.3 Compiling For Multiple Architectures</A>
+<BR>
+<A NAME="TOC126" HREF="bashref.html#SEC126">10.4 Installation Names</A>
+<BR>
+<A NAME="TOC127" HREF="bashref.html#SEC127">10.5 Specifying the System Type</A>
+<BR>
+<A NAME="TOC128" HREF="bashref.html#SEC128">10.6 Sharing Defaults</A>
+<BR>
+<A NAME="TOC129" HREF="bashref.html#SEC129">10.7 Operation Controls</A>
+<BR>
+<A NAME="TOC130" HREF="bashref.html#SEC130">10.8 Optional Features</A>
+<BR>
+</UL>
+<A NAME="TOC131" HREF="bashref.html#SEC131">A. Reporting Bugs</A>
+<BR>
+<A NAME="TOC132" HREF="bashref.html#SEC132">B. Major Differences From The Bourne Shell</A>
+<BR>
+<UL>
+<A NAME="TOC133" HREF="bashref.html#SEC133">B.1 Implementation Differences From The SVR4.2 Shell</A>
+<BR>
+</UL>
+<A NAME="TOC134" HREF="bashref.html#SEC134">C. Copying This Manual</A>
+<BR>
+<UL>
+<A NAME="TOC135" HREF="bashref.html#SEC135">C.1 GNU Free Documentation License</A>
+<BR>
+<UL>
+<A NAME="TOC136" HREF="bashref.html#SEC136">C.1.1 ADDENDUM: How to use this License for your documents</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC137" HREF="bashref.html#SEC137">Index of Shell Builtin Commands</A>
+<BR>
+<A NAME="TOC138" HREF="bashref.html#SEC138">Index of Shell Reserved Words</A>
+<BR>
+<A NAME="TOC139" HREF="bashref.html#SEC139">Parameter and Variable Index</A>
+<BR>
+<A NAME="TOC140" HREF="bashref.html#SEC140">Function Index</A>
+<BR>
+<A NAME="TOC141" HREF="bashref.html#SEC141">Concept Index</A>
+<BR>
+</UL>
+<HR SIZE=1>
+<A NAME="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="bashref.html#SEC1">1. Introduction</A>
+<BR>
+<A NAME="TOC4" HREF="bashref.html#SEC4">2. Definitions</A>
+<BR>
+<A NAME="TOC5" HREF="bashref.html#SEC5">3. Basic Shell Features</A>
+<BR>
+<A NAME="TOC56" HREF="bashref.html#SEC56">4. Shell Builtin Commands</A>
+<BR>
+<A NAME="TOC61" HREF="bashref.html#SEC61">5. Shell Variables</A>
+<BR>
+<A NAME="TOC64" HREF="bashref.html#SEC64">6. Bash Features</A>
+<BR>
+<A NAME="TOC87" HREF="bashref.html#SEC87">7. Job Control</A>
+<BR>
+<A NAME="TOC91" HREF="bashref.html#SEC91">8. Command Line Editing</A>
+<BR>
+<A NAME="TOC115" HREF="bashref.html#SEC115">9. Using History Interactively</A>
+<BR>
+<A NAME="TOC122" HREF="bashref.html#SEC122">10. Installing Bash</A>
+<BR>
+<A NAME="TOC131" HREF="bashref.html#SEC131">A. Reporting Bugs</A>
+<BR>
+<A NAME="TOC132" HREF="bashref.html#SEC132">B. Major Differences From The Bourne Shell</A>
+<BR>
+<A NAME="TOC134" HREF="bashref.html#SEC134">C. Copying This Manual</A>
+<BR>
+<A NAME="TOC137" HREF="bashref.html#SEC137">Index of Shell Builtin Commands</A>
+<BR>
+<A NAME="TOC138" HREF="bashref.html#SEC138">Index of Shell Reserved Words</A>
+<BR>
+<A NAME="TOC139" HREF="bashref.html#SEC139">Parameter and Variable Index</A>
+<BR>
+<A NAME="TOC140" HREF="bashref.html#SEC140">Function Index</A>
+<BR>
+<A NAME="TOC141" HREF="bashref.html#SEC141">Concept Index</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<A NAME="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="bashref.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<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>December, 31  2003</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+<P></P>  
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+previous or up-and-previous section 
+</TD>
+<TD>
+1.1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next or up-and-next section
+</TD>
+<TD>
+1.3
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+
+<HR SIZE=1>
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+by <I>Chet Ramey</I> on <I>December, 31  2003</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
index 349b559..5bf45bc 100644 (file)
@@ -2,9 +2,9 @@ This is bashref.info, produced by makeinfo version 4.5 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 3.0-alpha, 5 August 2003).
+the Bash shell (version 3.0-alpha, 13 November 2003).
 
-   This is Edition 3.0, last updated 5 August 2003, of `The GNU Bash
+   This is Edition 3.0, last updated 13 November 2003, of `The GNU Bash
 Reference Manual', for `Bash', Version 3.0-alpha.
 
    Copyright (C) 1988-2003 Free Software Foundation, Inc.
@@ -37,9 +37,9 @@ Bash Features
 *************
 
    This text is a brief description of the features that are present in
-the Bash shell (version 3.0-alpha, 5 August 2003)..
+the Bash shell (version 3.0-alpha, 13 November 2003)..
 
-   This is Edition 3.0, last updated 5 August 2003, of `The GNU Bash
+   This is Edition 3.0, last updated 13 November 2003, of `The GNU Bash
 Reference Manual', for `Bash', Version 3.0-alpha.
 
    Bash contains features that appear in other popular shells, and some
@@ -602,9 +602,14 @@ shell waits for all commands in the pipeline to complete.
 
    Each command in a pipeline is executed in its own subshell (*note
 Command Execution Environment::).  The exit status of a pipeline is the
-exit status of the last command in the pipeline.  If the reserved word
-`!' precedes the pipeline, the exit status is the logical negation of
-the exit status of the last command.
+exit status of the last command in the pipeline, unless the `pipefail'
+option is enabled (*note The Set Builtin::).  If `pipefail' is enabled,
+the pipeline's return status is the value of the last (rightmost)
+command to exit with a non-zero status, or zero if all commands exit
+successfully.  If the reserved word `!' precedes the pipeline, the exit
+status is the logical negation of the exit status as described above.
+The shell waits for all commands in the pipeline to terminate before
+returning a value.
 
 \1f
 File: bashref.info,  Node: Lists,  Next: Compound Commands,  Prev: Pipelines,  Up: Shell Commands
@@ -855,6 +860,22 @@ Conditional Constructs
      respectively, and 1 otherwise.  Any part of the pattern may be
      quoted to force it to be matched as a string.
 
+     An additional binary operator, `=~', is available, with the same
+     precedence as `==' and `!='.  When it is used, the string to the
+     right of the operator is considered an extended regular expression
+     and matched accordingly (as in regex3)).  The return value is 0 if
+     the string matches the pattern, and 1 otherwise.  If the regular
+     expression is syntactically incorrect, the conditional
+     expression's return value is 2.  If the shell option `nocaseglob'
+     (see the description of `shopt' in *Note Bash Builtins::) is
+     enabled, the match is performed without regard to the case of
+     alphabetic characters.  Substrings matched by parenthesized
+     subexpressions within the regular expression are saved in the
+     array variable `BASH_REMATCH'.  The element of `BASH_REMATCH' with
+     index 0 is the portion of the string matching the entire regular
+     expression.  The element of `BASH_REMATCH' with index N is the
+     portion of the string matching the Nth parenthesized subexpression.
+
      Expressions may be combined using the following operators, listed
      in decreasing order of precedence:
 
@@ -1025,8 +1046,8 @@ evaluated as an arithmetic expression even if the `$((...))' expansion
 is not used (*note Arithmetic Expansion::).  Word splitting is not
 performed, with the exception of `"$@"' as explained below.  Filename
 expansion is not performed.  Assignment statements may also appear as
-arguments to the `declare', `typeset', `export', `readonly', and
-`local' builtin commands.
+arguments to the `alias', `declare', `typeset', `export', `readonly',
+and `local' builtin commands.
 
 \1f
 File: bashref.info,  Node: Positional Parameters,  Next: Special Parameters,  Up: Shell Parameters
@@ -1556,8 +1577,10 @@ a PATTERN, and replaced with an alphabetically sorted list of file
 names matching the pattern. If no matching file names are found, and
 the shell option `nullglob' is disabled, the word is left unchanged.
 If the `nullglob' option is set, and no matches are found, the word is
-removed.  If the shell option `nocaseglob' is enabled, the match is
-performed without regard to the case of alphabetic characters.
+removed.  If the `failglob' shell option is set, and no matches are
+found, an error message is printed and the command is not executed.  If
+the shell option `nocaseglob' is enabled, the match is performed
+without regard to the case of alphabetic characters.
 
    When a pattern is used for filename generation, the character `.' at
 the start of a filename or immediately following a slash must be
@@ -1566,7 +1589,8 @@ matching a file name, the slash character must always be matched
 explicitly.  In other cases, the `.' character is not treated specially.
 
    See the description of `shopt' in *Note Bash Builtins::, for a
-description of the `nocaseglob', `nullglob', and `dotglob' options.
+description of the `nocaseglob', `nullglob', `failglob', and `dotglob'
+options.
 
    The `GLOBIGNORE' shell variable may be used to restrict the set of
 filenames matching a pattern.  If `GLOBIGNORE' is set, each matching
@@ -2141,12 +2165,12 @@ executing loops.  In all cases, Bash ignores `SIGQUIT'.  If job control
 is in effect (*note Job Control::), Bash ignores `SIGTTIN', `SIGTTOU',
 and `SIGTSTP'.
 
-   Commands started by Bash have signal handlers set to the values
-inherited by the shell from its parent.  When job control is not in
-effect, asynchronous commands ignore `SIGINT' and `SIGQUIT' as well.
-Commands run as a result of command substitution ignore the
-keyboard-generated job control signals `SIGTTIN', `SIGTTOU', and
-`SIGTSTP'.
+   Non-builtin commands started by Bash have signal handlers set to the
+values inherited by the shell from its parent.  When job control is not
+in effect, asynchronous commands ignore `SIGINT' and `SIGQUIT' in
+addition to these inherited handlers.  Commands run as a result of
+command substitution ignore the keyboard-generated job control signals
+`SIGTTIN', `SIGTTOU', and `SIGTSTP'.
 
    The shell exits by default upon receipt of a `SIGHUP'.  Before
 exiting, an interactive shell resends the `SIGHUP' to all jobs, running
@@ -2160,13 +2184,13 @@ receive `SIGHUP' using `disown -h'.
 Bash Builtins::), Bash sends a `SIGHUP' to all jobs when an interactive
 login shell exits.
 
-   When Bash receives a signal for which a trap has been set while
-waiting for a command to complete, the trap will not be executed until
-the command completes.  When Bash is waiting for an asynchronous
-command via the `wait' builtin, the reception of a signal for which a
-trap has been set will cause the `wait' builtin to return immediately
-with an exit status greater than 128, immediately after which the trap
-is executed.
+   If Bash is waiting for a command to complete and receives a signal
+for which a trap has been set, the trap will not be executed until the
+command completes.  When Bash is waiting for an asynchronous command
+via the `wait' builtin, the reception of a signal for which a trap has
+been set will cause the `wait' builtin to return immediately with an
+exit status greater than 128, immediately after which the trap is
+executed.
 
 \1f
 File: bashref.info,  Node: Shell Scripts,  Prev: Executing Commands,  Up: Basic Shell Features
@@ -2560,14 +2584,16 @@ standard.
      function.  Refer to the description of the `extglob' option to the
      `shopt' builtin (*note Bash Builtins::) for details of its effect
      on the `DEBUG' trap.  If a SIGSPEC is `ERR', the command ARG is
-     executed whenever a simple command has a non-zero exit status.
-     The `ERR' trap is not executed if the failed command is part of the
-     command list immediately following an `until' or `while' keyword,
-     part of the test in an `if' statement, part of a `&&' or `||'
-     list, or if the command's return status is being inverted using
-     `!'.  If a SIGSPEC is `RETURN', the command ARG is executed each
-     time a shell function or a script executed with the `.' or
-     `source' builtins finishes executing.
+     executed whenever a simple command has a non-zero exit status,
+     subject to the following conditions.  The `ERR' trap is not
+     executed if the failed command is part of the command list
+     immediately following an `until' or `while' keyword, part of the
+     test in an `if' statement, part of a `&&' or `||' list, or if the
+     command's return status is being inverted using `!'.  These are
+     the same conditions obeyed by the `errexit' option.  If a SIGSPEC
+     is `RETURN', the command ARG is executed each time a shell
+     function or a script executed with the `.' or `source' builtins
+     finishes executing.
 
      Signals ignored upon entry to the shell cannot be trapped or reset.
      Trapped signals are reset to their original values in a child
@@ -2704,7 +2730,7 @@ POSIX 1003.2 standard.
 `caller'
           caller [EXPR]
      Returns the context of any active subroutine call (a shell
-     function or a script executed with the `.' or `source' builtins.
+     function or a script executed with the `.' or `source' builtins).
 
      Without EXPR, `caller' displays the line number and source
      filename of the current subroutine call.  If a non-negative
@@ -2913,9 +2939,11 @@ POSIX 1003.2 standard.
      specifications, each of which causes printing of the next
      successive ARGUMENT.  In addition to the standard `printf(1)'
      formats, `%b' causes `printf' to expand backslash escape sequences
-     in the corresponding ARGUMENT, and `%q' causes `printf' to output
-     the corresponding ARGUMENT in a format that can be reused as shell
-     input.
+     in the corresponding ARGUMENT, (except that `\c' terminates
+     output, backslashes in `\'', `\"', and `\?' are not removed, and
+     octal escapes beginning with `\0' may contain up to four digits),
+     and `%q' causes `printf' to output the corresponding ARGUMENT in a
+     format that can be reused as shell input.
 
      The FORMAT is reused as necessary to consume all of the ARGUMENTS.
      If the FORMAT requires more ARGUMENTS than are supplied, the extra
@@ -3089,6 +3117,10 @@ POSIX 1003.2 standard.
           within `${PARAMETER}' expansions enclosed in double quotes.
           This option is enabled by default.
 
+    `failglob'
+          If set, patterns which fail to match filenames during
+          pathname expansion result in an expansion error.
+
     `force_fignore'
           If set, the suffixes specified by the `FIGNORE' shell variable
           cause words to be ignored when performing word completion
@@ -3427,6 +3459,12 @@ The Set Builtin
          `physical'
                Same as `-P'.
 
+         `pipefail'
+               If set, the return value of a pipeline is the value of
+               the last (rightmost) command to exit with a non-zero
+               status, or zero if all commands in the pipeline exit
+               successfully.  This option is disabled by default.
+
          `posix'
                Change the behavior of Bash where the default operation
                differs from the POSIX 1003.2 standard to match the
@@ -3699,6 +3737,14 @@ Variables::).
      name is `${BASH_SOURCE[$i + 1]}'.  Use `LINENO' to obtain the
      current line number.
 
+`BASH_REMATCH'
+     An array variable whose members are assigned by the `=~' binary
+     operator to the `[[' conditional command (*note Conditional
+     Constructs::).  The element with index 0 is the portion of the
+     string matching the entire regular expression.  The element with
+     index N is the portion of the string matching the Nth
+     parenthesized subexpression.  This variable is read-only.
+
 `BASH_SOURCE'
      An array variable whose members are the source filenames
      corresponding to the elements in the `FUNCNAME' array variable.
@@ -7865,7 +7911,12 @@ does not provide the necessary support.
      builtins and functions to be timed.
 
 `--enable-cond-command'
-     Include support for the `[[' conditional command (*note
+     Include support for the `[[' conditional command.  (*note
+     Conditional Constructs::).
+
+`--enable-cond-regexp'
+     Include support for matching POSIX regular expressions using the
+     `=~' binary operator in the `[[' conditional command.  (*note
      Conditional Constructs::).
 
 `--enable-directory-stack'
@@ -8016,7 +8067,9 @@ included in SVR4.2 as the baseline reference.
      and `compgen', to manipulate it.
 
    * Bash has command history (*note Bash History Facilities::) and the
-     `history' and `fc' builtins to manipulate it.
+     `history' and `fc' builtins to manipulate it.  The Bash history
+     list maintains timestamp information and uses the value of the
+     `HISTTIMEFORMAT' variable to display it.
 
    * Bash implements `csh'-like history expansion (*note History
      Interaction::).
@@ -8212,10 +8265,19 @@ included in SVR4.2 as the baseline reference.
    * Bash has much more optional behavior controllable with the `set'
      builtin (*note The Set Builtin::).
 
+   * The `-x' (`xtrace') option displays commands other than simple
+     commands when performing an execution trace (*note The Set
+     Builtin::).
+
    * The `test' builtin (*note Bourne Shell Builtins::) is slightly
      different, as it implements the POSIX algorithm, which specifies
      the behavior based on the number of arguments.
 
+   * Bash includes the `caller' builtin, which displays the context of
+     any active subroutine call (a shell function or a script executed
+     with the `.' or `source' builtins).  This supports the bash
+     debugger.
+
    * The `trap' builtin (*note Bourne Shell Builtins::) allows a
      `DEBUG' pseudo-signal specification, similar to `EXIT'.  Commands
      specified with a `DEBUG' trap are executed before every simple
@@ -8881,6 +8943,7 @@ Parameter and Variable Index
 * BASH_ENV:                              Bash Variables.
 * BASH_EXECUTION_STRING:                 Bash Variables.
 * BASH_LINENO:                           Bash Variables.
+* BASH_REMATCH:                          Bash Variables.
 * BASH_SOURCE:                           Bash Variables.
 * BASH_SUBSHELL:                         Bash Variables.
 * BASH_VERSINFO:                         Bash Variables.
@@ -9186,129 +9249,129 @@ Concept Index
 
 \1f
 Tag Table:
-Node: Top\7f1367
-Node: Introduction\7f3520
-Node: What is Bash?\7f3745
-Node: What is a shell?\7f4833
-Node: Definitions\7f7369
-Node: Basic Shell Features\7f10109
-Node: Shell Syntax\7f11327
-Node: Shell Operation\7f12351
-Node: Quoting\7f13636
-Node: Escape Character\7f14898
-Node: Single Quotes\7f15370
-Node: Double Quotes\7f15705
-Node: ANSI-C Quoting\7f16718
-Node: Locale Translation\7f17661
-Node: Comments\7f18544
-Node: Shell Commands\7f19149
-Node: Simple Commands\7f19910
-Node: Pipelines\7f20531
-Node: Lists\7f22067
-Node: Compound Commands\7f23689
-Node: Looping Constructs\7f24461
-Node: Conditional Constructs\7f26895
-Node: Command Grouping\7f32914
-Node: Shell Functions\7f34350
-Node: Shell Parameters\7f38615
-Node: Positional Parameters\7f40177
-Node: Special Parameters\7f41068
-Node: Shell Expansions\7f43726
-Node: Brace Expansion\7f45646
-Node: Tilde Expansion\7f47962
-Node: Shell Parameter Expansion\7f50294
-Node: Command Substitution\7f57548
-Node: Arithmetic Expansion\7f58870
-Node: Process Substitution\7f59711
-Node: Word Splitting\7f60748
-Node: Filename Expansion\7f62200
-Node: Pattern Matching\7f64185
-Node: Quote Removal\7f67506
-Node: Redirections\7f67792
-Node: Executing Commands\7f75267
-Node: Simple Command Expansion\7f75934
-Node: Command Search and Execution\7f77855
-Node: Command Execution Environment\7f79852
-Node: Environment\7f82614
-Node: Exit Status\7f84265
-Node: Signals\7f85460
-Node: Shell Scripts\7f87371
-Node: Shell Builtin Commands\7f89882
-Node: Bourne Shell Builtins\7f91312
-Node: Bash Builtins\7f108084
-Node: The Set Builtin\7f135896
-Node: Special Builtins\7f143821
-Node: Shell Variables\7f144793
-Node: Bourne Shell Variables\7f145229
-Node: Bash Variables\7f147206
-Node: Bash Features\7f166301
-Node: Invoking Bash\7f167183
-Node: Bash Startup Files\7f172994
-Node: Interactive Shells\7f177864
-Node: What is an Interactive Shell?\7f178266
-Node: Is this Shell Interactive?\7f178901
-Node: Interactive Shell Behavior\7f179707
-Node: Bash Conditional Expressions\7f182974
-Node: Shell Arithmetic\7f186394
-Node: Aliases\7f189134
-Node: Arrays\7f191637
-Node: The Directory Stack\7f194657
-Node: Directory Stack Builtins\7f195363
-Node: Printing a Prompt\7f198242
-Node: The Restricted Shell\7f200868
-Node: Bash POSIX Mode\7f202693
-Node: Job Control\7f209339
-Node: Job Control Basics\7f209805
-Node: Job Control Builtins\7f214085
-Node: Job Control Variables\7f218381
-Node: Command Line Editing\7f219531
-Node: Introduction and Notation\7f220529
-Node: Readline Interaction\7f222146
-Node: Readline Bare Essentials\7f223332
-Node: Readline Movement Commands\7f225112
-Node: Readline Killing Commands\7f226068
-Node: Readline Arguments\7f227977
-Node: Searching\7f229012
-Node: Readline Init File\7f231189
-Node: Readline Init File Syntax\7f232243
-Node: Conditional Init Constructs\7f243887
-Node: Sample Init File\7f246411
-Node: Bindable Readline Commands\7f249594
-Node: Commands For Moving\7f250793
-Node: Commands For History\7f251642
-Node: Commands For Text\7f254531
-Node: Commands For Killing\7f257192
-Node: Numeric Arguments\7f259142
-Node: Commands For Completion\7f260269
-Node: Keyboard Macros\7f263850
-Node: Miscellaneous Commands\7f264409
-Node: Readline vi Mode\7f269708
-Node: Programmable Completion\7f270617
-Node: Programmable Completion Builtins\7f276424
-Node: Using History Interactively\7f283786
-Node: Bash History Facilities\7f284465
-Node: Bash History Builtins\7f287155
-Node: History Interaction\7f291007
-Node: Event Designators\7f293558
-Node: Word Designators\7f294562
-Node: Modifiers\7f296192
-Node: Installing Bash\7f297589
-Node: Basic Installation\7f298723
-Node: Compilers and Options\7f301408
-Node: Compiling For Multiple Architectures\7f302142
-Node: Installation Names\7f303799
-Node: Specifying the System Type\7f304610
-Node: Sharing Defaults\7f305319
-Node: Operation Controls\7f305984
-Node: Optional Features\7f306935
-Node: Reporting Bugs\7f315012
-Node: Major Differences From The Bourne Shell\7f316187
-Node: Copying This Manual\7f331430
-Node: GNU Free Documentation License\7f331684
-Node: Builtin Index\7f354077
-Node: Reserved Word Index\7f357704
-Node: Variable Index\7f359180
-Node: Function Index\7f366116
-Node: Concept Index\7f370666
+Node: Top\7f1373
+Node: Introduction\7f3532
+Node: What is Bash?\7f3757
+Node: What is a shell?\7f4845
+Node: Definitions\7f7381
+Node: Basic Shell Features\7f10121
+Node: Shell Syntax\7f11339
+Node: Shell Operation\7f12363
+Node: Quoting\7f13648
+Node: Escape Character\7f14910
+Node: Single Quotes\7f15382
+Node: Double Quotes\7f15717
+Node: ANSI-C Quoting\7f16730
+Node: Locale Translation\7f17673
+Node: Comments\7f18556
+Node: Shell Commands\7f19161
+Node: Simple Commands\7f19922
+Node: Pipelines\7f20543
+Node: Lists\7f22409
+Node: Compound Commands\7f24031
+Node: Looping Constructs\7f24803
+Node: Conditional Constructs\7f27237
+Node: Command Grouping\7f34290
+Node: Shell Functions\7f35726
+Node: Shell Parameters\7f39991
+Node: Positional Parameters\7f41562
+Node: Special Parameters\7f42453
+Node: Shell Expansions\7f45111
+Node: Brace Expansion\7f47031
+Node: Tilde Expansion\7f49347
+Node: Shell Parameter Expansion\7f51679
+Node: Command Substitution\7f58933
+Node: Arithmetic Expansion\7f60255
+Node: Process Substitution\7f61096
+Node: Word Splitting\7f62133
+Node: Filename Expansion\7f63585
+Node: Pattern Matching\7f65709
+Node: Quote Removal\7f69030
+Node: Redirections\7f69316
+Node: Executing Commands\7f76791
+Node: Simple Command Expansion\7f77458
+Node: Command Search and Execution\7f79379
+Node: Command Execution Environment\7f81376
+Node: Environment\7f84138
+Node: Exit Status\7f85789
+Node: Signals\7f86984
+Node: Shell Scripts\7f88939
+Node: Shell Builtin Commands\7f91450
+Node: Bourne Shell Builtins\7f92880
+Node: Bash Builtins\7f109763
+Node: The Set Builtin\7f137885
+Node: Special Builtins\7f146103
+Node: Shell Variables\7f147075
+Node: Bourne Shell Variables\7f147511
+Node: Bash Variables\7f149488
+Node: Bash Features\7f168993
+Node: Invoking Bash\7f169875
+Node: Bash Startup Files\7f175686
+Node: Interactive Shells\7f180556
+Node: What is an Interactive Shell?\7f180958
+Node: Is this Shell Interactive?\7f181593
+Node: Interactive Shell Behavior\7f182399
+Node: Bash Conditional Expressions\7f185666
+Node: Shell Arithmetic\7f189086
+Node: Aliases\7f191826
+Node: Arrays\7f194329
+Node: The Directory Stack\7f197349
+Node: Directory Stack Builtins\7f198055
+Node: Printing a Prompt\7f200934
+Node: The Restricted Shell\7f203560
+Node: Bash POSIX Mode\7f205385
+Node: Job Control\7f212031
+Node: Job Control Basics\7f212497
+Node: Job Control Builtins\7f216777
+Node: Job Control Variables\7f221073
+Node: Command Line Editing\7f222223
+Node: Introduction and Notation\7f223221
+Node: Readline Interaction\7f224838
+Node: Readline Bare Essentials\7f226024
+Node: Readline Movement Commands\7f227804
+Node: Readline Killing Commands\7f228760
+Node: Readline Arguments\7f230669
+Node: Searching\7f231704
+Node: Readline Init File\7f233881
+Node: Readline Init File Syntax\7f234935
+Node: Conditional Init Constructs\7f246579
+Node: Sample Init File\7f249103
+Node: Bindable Readline Commands\7f252286
+Node: Commands For Moving\7f253485
+Node: Commands For History\7f254334
+Node: Commands For Text\7f257223
+Node: Commands For Killing\7f259884
+Node: Numeric Arguments\7f261834
+Node: Commands For Completion\7f262961
+Node: Keyboard Macros\7f266542
+Node: Miscellaneous Commands\7f267101
+Node: Readline vi Mode\7f272400
+Node: Programmable Completion\7f273309
+Node: Programmable Completion Builtins\7f279116
+Node: Using History Interactively\7f286478
+Node: Bash History Facilities\7f287157
+Node: Bash History Builtins\7f289847
+Node: History Interaction\7f293699
+Node: Event Designators\7f296250
+Node: Word Designators\7f297254
+Node: Modifiers\7f298884
+Node: Installing Bash\7f300281
+Node: Basic Installation\7f301415
+Node: Compilers and Options\7f304100
+Node: Compiling For Multiple Architectures\7f304834
+Node: Installation Names\7f306491
+Node: Specifying the System Type\7f307302
+Node: Sharing Defaults\7f308011
+Node: Operation Controls\7f308676
+Node: Optional Features\7f309627
+Node: Reporting Bugs\7f317899
+Node: Major Differences From The Bourne Shell\7f319074
+Node: Copying This Manual\7f334822
+Node: GNU Free Documentation License\7f335076
+Node: Builtin Index\7f357469
+Node: Reserved Word Index\7f361096
+Node: Variable Index\7f362572
+Node: Function Index\7f369565
+Node: Concept Index\7f374115
 \1f
 End Tag Table
diff --git a/doc/bashref.ky b/doc/bashref.ky
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/bashref.log b/doc/bashref.log
new file mode 100644 (file)
index 0000000..896f095
--- /dev/null
@@ -0,0 +1,366 @@
+This is TeX, Version 3.14159 (Web2C 7.3.1) (format=tex 2001.2.12)  31 DEC 2003 12:47
+**/usr/homes/chet/src/bash/src/doc/bashref.texi
+(/usr/homes/chet/src/bash/src/doc/bashref.texi (texinfo.tex
+Loading texinfo [version 2003-02-03.16]: Basics,
+\bindingoffset=\dimen16
+\normaloffset=\dimen17
+\pagewidth=\dimen18
+\pageheight=\dimen19
+\outerhsize=\dimen20
+\outervsize=\dimen21
+\cornerlong=\dimen22
+\cornerthick=\dimen23
+\topandbottommargin=\dimen24
+\headlinebox=\box16
+\footlinebox=\box17
+\margin=\insert252
+\EMsimple=\toks12
+\groupbox=\box18
+\groupinvalidhelp=\toks13
+\mil=\dimen25
+\exdentamount=\skip18
+\inmarginspacing=\skip19
+ pdf,
+\tempnum=\count26
+\lnkcount=\count27
+\filename=\toks14
+\filenamelength=\count28
+\pgn=\count29
+\toksA=\toks15
+\toksB=\toks16
+\toksC=\toks17
+\toksD=\toks18
+\boxA=\box19
+\countA=\count30
+ fonts,
+\sffam=\fam8
+\textleading=\dimen26
+\mainmagstep=\count31
+\fontdepth=\count32
+ page headings,
+\titlepagetopglue=\skip20
+\titlepagebottomglue=\skip21
+\evenheadline=\toks19
+\oddheadline=\toks20
+\evenfootline=\toks21
+\oddfootline=\toks22
+
+tables,
+\tableindent=\dimen27
+\itemindent=\dimen28
+\itemmargin=\dimen29
+\itemmax=\dimen30
+\itemno=\count33
+\multitableparskip=\skip22
+\multitableparindent=\skip23
+\multitablecolspace=\dimen31
+\multitablelinespace=\skip24
+\colcount=\count34
+\savedfootnotes=\box20
+ conditionals, indexing,
+\secondaryindent=\skip25
+\partialpage=\box21
+\doublecolumnhsize=\dimen32
+ sectioning,
+\chapno=\count35
+\secno=\count36
+\subsecno=\count37
+\subsubsecno=\count38
+\appendixno=\count39
+\absseclevel=\count40
+\secbase=\count41
+\chapheadingskip=\skip26
+\secheadingskip=\skip27
+\subsecheadingskip=\skip28
+ toc,
+\tocfile=\write0
+\contentsrightmargin=\skip29
+\savepageno=\count42
+\lastnegativepageno=\count43
+\shortappendixwidth=\dimen33
+\tocindent=\dimen34
+ environments,
+\errorbox=\box22
+\lispnarrowing=\skip30
+\envskipamount=\skip31
+\circthick=\dimen35
+\cartouter=\dimen36
+\cartinner=\dimen37
+\normbskip=\skip32
+\normpskip=\skip33
+\normlskip=\skip34
+\lskip=\skip35
+\rskip=\skip36
+\tabw=\dimen38
+ defuns,
+\defbodyindent=\skip37
+\defargsindent=\skip38
+\deflastargmargin=\skip39
+\parencount=\count44
+ macros,
+\macscribble=\write1
+\paramno=\count45
+\macname=\toks23
+
+cross references,
+\auxfile=\write2
+\savesfregister=\count46
+\footnoteno=\count47
+ (/usr/local/share/texmf/tex/plain/dvips/epsf.tex
+\epsffilein=\read0
+\epsfframemargin=\dimen39
+\epsfframethickness=\dimen40
+\epsfrsize=\dimen41
+\epsftmp=\dimen42
+\epsftsize=\dimen43
+\epsfxsize=\dimen44
+\epsfysize=\dimen45
+\pspoints=\dimen46
+\epsfnoopenhelp=\toks24
+)
+\noepsfhelp=\toks25
+
+localization,
+\nolanghelp=\toks26
+\defaultparindent=\dimen47
+ and turning on texinfo input format.) (bashref.aux)
+@cpindfile=@write3
+@fnindfile=@write4
+@vrindfile=@write5
+@tpindfile=@write6
+@kyindfile=@write7
+@pgindfile=@write8
+ (version.texi)
+@btindfile=@write9
+@rwindfile=@write10
+ [1
+\openout2 = `bashref.aux'.
+
+\openout3 = `bashref.cp'.
+
+\openout4 = `bashref.fn'.
+
+\openout5 = `bashref.vr'.
+
+\openout6 = `bashref.tp'.
+
+\openout7 = `bashref.ky'.
+
+\openout8 = `bashref.pg'.
+
+\openout9 = `bashref.bt'.
+
+\openout10 = `bashref.rw'.
+
+] [2] (bashref.toc [-1] [-2] [-3]) [-4] Chapter 1
+\openout0 = `bashref.toc'.
+
+ [1] Chapter 2 [2]
+[3] Chapter 3 [4] [5] [6] [7] [8] [9] [10]
+Overfull \hbox (43.33539pt too wide) in paragraph at lines 862--862
+ []@texttt case @textttsl word @texttt in [ [(] @textttsl pat-tern @texttt [| @
+textttsl pat-tern@texttt ][]) @textttsl command-list @texttt ;;][] esac[][] 
+
+@hbox(7.60416+2.43333)x433.62
+.@glue(@leftskip) 86.72375
+.@hbox(0.0+0.0)x0.0
+.@texttt c
+.@texttt a
+.@texttt s
+.etc.
+
+[11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25]
+[26] [27] [28] [29] [30] [31] Chapter 4 [32] [33] [34] [35] [36] [37] [38]
+Underfull \hbox (badness 5231) in paragraph at lines 3098--3111
+ @texttt emacs-meta[]@textrm , @texttt emacs-ctlx[]@textrm , @texttt vi[]@textr
+m , @texttt vi-move[]@textrm , @texttt vi-command[]@textrm , and
+
+@hbox(7.60416+2.12917)x433.62, glue set 3.7426
+.@glue(@leftskip) 115.63242
+.@texttt e
+.@texttt m
+.@texttt a
+.@texttt c
+.etc.
+
+[39] [40] [41] [42] [43]
+Overfull \hbox (43.33536pt too wide) in paragraph at lines 3435--3435
+ []@texttt read [-ers] [-a @textttsl aname@texttt ] [-d @textttsl de-lim@texttt
+ ] [-n @textttsl nchars@texttt ] [-p @textttsl prompt@texttt ] [-t @textttsl ti
+me-
+
+@hbox(7.60416+2.43333)x433.62
+.@glue(@leftskip) 86.72375
+.@hbox(0.0+0.0)x0.0
+.@texttt r
+.@texttt e
+.@texttt a
+.etc.
+
+[44] [45] [46] [47] [48] [49] [50] [51]
+Underfull \hbox (badness 4036) in paragraph at lines 4044--4051
+ @texttt -x[]@textrm Print a trace of sim-ple com-mands, @texttt \@textrm fB-fo
+r@texttt \@textrm fP com-mands,
+
+@hbox(7.60416+2.12917)x433.62, glue set 3.43124
+.@glue(@leftskip) 115.63242
+.@penalty 10000
+.@kern -57.81621
+.@texttt -
+.@texttt x
+.etc.
+
+[52] [53] Chapter 5 [54] [55] [56] [57] [58] [59] [60] [61] Chapter 6 [62]
+Overfull \hbox (51.96864pt too wide) in paragraph at lines 4756--4756
+ []@texttt bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@t
+exttt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar-
+
+@hbox(7.60416+2.43333)x433.62
+.@glue(@leftskip) 28.90755
+.@hbox(0.0+0.0)x0.0
+.@texttt b
+.@texttt a
+.@texttt s
+.etc.
+
+
+Overfull \hbox (76.23077pt too wide) in paragraph at lines 4757--4757
+ []@texttt bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@texttt 
+] [-O @textttsl shopt_option@texttt ] -c @textttsl string @texttt [@textttsl ar
+-
+
+@hbox(7.60416+2.43333)x433.62
+.@glue(@leftskip) 28.90755
+.@hbox(0.0+0.0)x0.0
+.@texttt b
+.@texttt a
+.@texttt s
+.etc.
+
+
+Overfull \hbox (34.72258pt too wide) in paragraph at lines 4758--4758
+ []@texttt bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o @textttsl op-tion@text
+tt ] [-O @textttsl shopt_option@texttt ] [@textttsl ar-
+
+@hbox(7.60416+2.43333)x433.62
+.@glue(@leftskip) 28.90755
+.@hbox(0.0+0.0)x0.0
+.@texttt b
+.@texttt a
+.@texttt s
+.etc.
+
+[63] [64]
+Underfull \hbox (badness 2245) in paragraph at lines 4932--4934
+[]@textrm When a lo-gin shell ex-its, Bash reads and ex-e-cutes com-mands from 
+the file
+
+@hbox(7.60416+2.12917)x433.62, glue set 2.82155
+.@hbox(0.0+0.0)x15.0
+.@textrm W
+.@textrm h
+.@textrm e
+.@textrm n
+.etc.
+
+[65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] Chapter 7
+[78] [79] [80] [81] (/usr/homes/chet/src/bash/src/lib/readline/doc/rluser.texi
+Chapter 8 [82] [83] [84] [85] [86] [87]
+Underfull \hbox (badness 5231) in paragraph at lines 488--504
+ @texttt emacs-meta[]@textrm , @texttt emacs-ctlx[]@textrm , @texttt vi[]@textr
+m , @texttt vi-move[]@textrm , @texttt vi-command[]@textrm , and
+
+@hbox(7.60416+2.12917)x433.62, glue set 3.7426
+.@glue(@leftskip) 115.63242
+.@texttt e
+.@texttt m
+.@texttt a
+.@texttt c
+.etc.
+
+[88] [89] [90] [91] [92]
+Overfull \hbox (26.43913pt too wide) in paragraph at lines 801--801
+ []@texttt Meta-Control-h: backward-kill-word Text after the function name is i
+gnored[] 
+
+@hbox(6.69167+2.43333)x433.62
+.@glue(@leftskip) 28.90755
+.@hbox(0.0+0.0)x0.0
+.@texttt M
+.@texttt e
+.@texttt t
+.etc.
+
+[93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104]
+Overfull \hbox (17.80585pt too wide) in paragraph at lines 1641--1641
+ []@texttt complete [-abcdefgjksuv] [-o @textttsl comp-option@texttt ] [-A @tex
+tttsl ac-tion@texttt ] [-G @textttsl glob-
+
+@hbox(7.60416+2.43333)x433.62
+.@glue(@leftskip) 86.72375
+.@hbox(0.0+0.0)x0.0
+.@texttt c
+.@texttt o
+.@texttt m
+.etc.
+
+[105] [106]
+Underfull \hbox (badness 2753) in paragraph at lines 1737--1740
+ @texttt hostname[]@textrm Hostnames, as taken from the file spec-i-fied by
+
+@hbox(7.60416+2.12917)x433.62, glue set 3.02202
+.@glue(@leftskip) 173.44862
+.@penalty 10000
+.@kern -57.81621
+.@texttt h
+.@texttt o
+.etc.
+
+[107]) (/usr/homes/chet/src/bash/src/lib/readline/doc/hsuser.texi Chapter 9
+[108] [109] [110] [111] [112]) Chapter 10 [113] [114] [115] [116] [117]
+Underfull \hbox (badness 2772) in paragraph at lines 6598--6602
+ []@textrm Enable sup-port for large files (@texttt http://www.sas.com/standard
+s/large_
+
+@hbox(8.2125+2.73749)x433.62, glue set 3.02754
+.@glue(@leftskip) 57.81621
+.@hbox(0.0+0.0)x0.0
+.@textrm E
+.@textrm n
+.@textrm a
+.etc.
+
+[118] [119] [120] Appendix A [121] [122] Appendix B [123] [124] [125] [126]
+[127] [128] Appendix C [129] [130] (fdl.texi [131] [132] [133] [134] [135]
+[136]) (Index of Shell Builtin Commands) [137] [138] (bashref.bts)
+(Index of Shell Reserved Words)
+Overfull \vbox (42.26959pt too high) has occurred while \output is active
+\vbox(643.19986+0.0)x433.62, glue set - 1.0
+.\glue(\topskip) 24.00002
+.\vbox(11.99998+0.0)x433.62
+..\hbox(11.99998+0.0)x433.62, glue set 148.745fil
+...\hbox(0.0+0.0)x0.0
+...\chaprm I
+...\chaprm n
+...\chaprm d
+...\chaprm e
+...etc.
+.\penalty 10000
+.\glue 12.0 plus 4.0 minus 4.0
+.\penalty 10000
+.etc.
+
+
+[139] [140] (bashref.rws) (Parameter and Variable Index) [141] [142]
+(bashref.vrs [143]) (Function Index) [144] (bashref.fns [145]) (Concept Index)
+[146] (bashref.cps [147]) [148] ) 
+Here is how much of TeX's memory you used:
+ 1713 strings out of 13013
+ 23227 string characters out of 97233
+ 52395 words of memory out of 263001
+ 2577 multiletter control sequences out of 10000+0
+ 31953 words of font info for 111 fonts, out of 400000 for 1000
+ 19 hyphenation exceptions out of 1000
+ 15i,8n,11p,273b,465s stack positions out of 300i,100n,500p,50000b,4000s
+
+Output written on bashref.dvi (154 pages, 578740 bytes).
diff --git a/doc/bashref.pdf b/doc/bashref.pdf
new file mode 100644 (file)
index 0000000..b3b8011
Binary files /dev/null and b/doc/bashref.pdf differ
diff --git a/doc/bashref.pg b/doc/bashref.pg
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/bashref.ps b/doc/bashref.ps
new file mode 100644 (file)
index 0000000..38f3b6f
--- /dev/null
@@ -0,0 +1,13283 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
+%%Title: bashref.dvi
+%%Pages: 154
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 600 -t letter -o bashref.ps bashref.dvi
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource:  TeX output 2003.12.31:1247
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 40258431 52099146 1000 600 600 (bashref.dvi)
+@start
+%DVIPSBitmapFont: Fa cmtt12 14.4 2
+/Fa 2 126 df<EE1FFC923801FFFE150F153F5D92B5FC4A14FC4AEBF8004A138003FCC7
+FC4A5A5DB3A9141F4A5A147F903803FFC0013F5B007FB5C8FCB55A5C14F014FC806C7FD8
+003F7F01037F9038007FE0143F6E7E140FB3A9816E7EEDFF806E13F86EEBFFFC6E14FE81
+81150F15019238001FFC2F5D79D23E>123 D<EA3FF048B47EB512F014FC80806C80D800
+1F7F01017FEB003F6E7E140FB3A9816E7E81913803FFC06E13FC6EEBFFFC6F13FE81150F
+153F5D92B512FC4AEBFC004A13C04A48C7FC5D4A5A5DB3A9141F4A5AEB01FF011F5B007F
+B55AB6C8FC5C5C14F06C1380D83FF0C9FC2F5D79D23E>125 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmr9 9 54
+/Fb 54 123 df<EC1FE0ECFFFC903803F01E90390FC00780EB1F8090393F000FC0017E13
+1F5BA2485AED0F8092C7FCA9ED0FC0B7FCA33901F8001F150FB3A6486CEB1FE0267FFFC1
+B5FCA328357FB42B>12 D<123C127EB4FCA21380A2127F123D1201A412031300A25A1206
+120E120C121C5A5A126009177A8715>44 D<EB0FE0EB7FFCEBF83E3903E00F803907C007
+C0EB8003000F14E0391F0001F0A24814F8A2003E1300007E14FCA500FE14FEB2007E14FC
+A56CEB01F8A36C14F0A2390F8003E03907C007C0A23903E00F803900F83E00EB7FFCEB0F
+E01F347DB126>48 D<13075B5B137FEA07FFB5FC13BFEAF83F1200B3B3A2497E007FB512
+80A319327AB126>I<EB3FC0EBFFF0000313FC380F80FF391E007F80001CEB3FC048EB1F
+E048130F15F00060130712FC6C14F87E1403A3007E1307123CC7FC15F0A2140F15E0EC1F
+C0A2EC3F801500147E5C495A5C495A495A495A49C7FC133E133C4913185B485A48481330
+485A48C7FC001C1470001FB512F05A5AB612E0A31D327CB126>I<EB1FE0EBFFFC4813FF
+3907E03F80390F001FC0001EEB0FE0001CEB07F0123F018013F8140313C01380A2381F00
+07C7FC15F0A2EC0FE015C0141FEC3F80EC7E00EB01F8EB7FE014FCEB003FEC1FC0EC0FE0
+EC07F015F8140315FC140115FEA3127EB4FCA415FC48130312780070EB07F86C14F0003C
+130F001FEB1FE0390FE03F800003B51200C613FCEB1FE01F347DB126>I<EC01C0A21403
+1407A2140F141FA2143F147F146F14CF1301EB038F140F1307130E130C131C1338133013
+7013E013C0EA0180120313001206120E120C5A123812305A12E0B71280A3C7380FC000A9
+4A7E0107B51280A321337EB226>I<000C14C0380FC00F90B5128015005C5C14F014C0D8
+0C18C7FC90C8FCA9EB0FC0EB7FF8EBF07C380FC03F9038001F80EC0FC0120E000CEB07E0
+A2C713F01403A215F8A41218127E12FEA315F0140712F8006014E01270EC0FC06C131F00
+3C14806CEB7F00380F80FE3807FFF8000113E038003F801D347CB126>I<14FE903807FF
+80011F13E090383F00F0017C13703901F801F8EBF003EA03E01207EA0FC0EC01F04848C7
+FCA248C8FCA35A127EEB07F0EB1FFC38FE381F9038700F809038E007C039FFC003E00180
+13F0EC01F8130015FC1400A24814FEA5127EA4127F6C14FCA26C1301018013F8000F14F0
+EBC0030007EB07E03903E00FC03901F81F806CB51200EB3FFCEB0FE01F347DB126>I<12
+30123C003FB6FCA34814FEA215FC0070C7123800601430157015E04814C01401EC0380C7
+EA07001406140E5C141814385CA25CA2495A1303A3495AA2130FA3131F91C7FCA25BA55B
+A9131C20347CB126>I<EB0FE0EB7FFC90B5FC3903F01F803907C007C0390F0003E0000E
+EB01F0001E1300001C14F8003C1478A3123EA2003F14F86D13F0EBC001D81FF013E09038
+F803C0390FFE07803907FF0F006C13DE6C13F87EEB3FFE8001F713C0D803E313E0D80780
+13F0390F007FF8001E131F003EEB07FC003C1303481301EC007E12F848143EA2151EA37E
+153C1278007C14787E6C14F0390F8003E03907F01FC00001B5120038007FFCEB1FE01F34
+7DB126>I<EB0FE0EB7FF8EBFFFE3803F83F3907E00F80390FC007C0D81F8013E0EC03F0
+EA3F0048EB01F8127EA200FE14FC1400A415FEA5007E1301A2127F7E1403EA1F80000F13
+073807C00E3803E01C3801F03838007FF090381FC0FC90C7FC1401A215F8A215F0140300
+1F14E0383F800715C0140FEC1F809038003F00001C137E381F01FC380FFFF0000313C0C6
+90C7FC1F347DB126>I<15E0A34A7EA24A7EA34A7EA3EC0DFE140CA2EC187FA34A6C7EA2
+02707FEC601FA202E07FECC00FA2D901807F1507A249486C7EA301066D7EA2010E80010F
+B5FCA249800118C77EA24981163FA2496E7EA3496E7EA20001821607487ED81FF04A7ED8
+FFFE49B512E0A333367DB53A>65 D<B7FC16E016F83A03FC0003FE0001EC00FFEE7F80EE
+3FC0161F17E0160F17F0A617E0161F17C0EE3F80EE7F0016FEED03FC90B612F05E9039FC
+0007FCED00FEEE3F80EE1FC0EE0FE017F0160717F8160317FCA617F81607A2EE0FF0EE1F
+E0163FEE7FC00003913803FF00B75A16F816C02E337DB236>I<B77E16F016FE3A01FE00
+01FF00009138003FC0EE0FE0707E707E707E707E177E177FEF3F80A2EF1FC0A3EF0FE0A4
+18F0AA18E0A3171F18C0A21880173F18005F17FE5F4C5AEE07F04C5AEE3FC000014AB45A
+B748C7FC16F8168034337EB23B>68 D<B81280A3D803FCC7FC0001151FEE07C01603A216
+01A21600A41760150CA31700A2151CA2153C15FC90B5FCA3EBFC00153C151CA2150CA592
+C8FCAB487EB512FEA32B337DB232>70 D<DA03FE130C91393FFF801C91B512E0903A03FE
+01F83C903A0FF0003C7CD91FC0EB0EFCD97F80130701FEC7120348481401000315005B48
+48157C485A173C485A171C123F5B007F160CA390C9FC4893C7FCAA0303B512E07E7F9239
+0003FE00705A123F7F121FA26C7E7F12076C7E7F6C6C14036C7E6D6C1307D91FC0EB0E7C
+D90FF0EB1C3CD903FEEBF81C0100B5EAF00C023F01C0C7FCDA03FEC8FC33377CB43C>I<
+B5D8FE03B512F8A3000190C73807FC006C486E5AB390B7FCA349C71203B3A3486C4A7EB5
+D8FE03B512F8A335337EB23A>I<B512FEA3000113006C5AB3B3A7487EB512FEA317337E
+B21C>I<B512FEA3D803FEC9FC6C5AB3A9EE0180A416031700A45EA25E5E5E5E16FE0003
+1407B7FCA329337DB230>76 D<D8FFFC923801FFF86D5DA20003EFFE00D801BFED06FCA3
+D99F80140CA2D98FC01418A3D987E01430A2D983F01460A3D981F814C0A3D980FCEB0180
+A2027EEB0300A36E1306A26E6C5AA36E6C5AA36E6C5AA26E6C5AA36E6C5AA3913800FD80
+A2037FC7FCA3486C133ED80FF04B7EB5011C90387FFFF8A33D337CB246>I<D8FFFE9138
+1FFFF87F80C6030013006E143CD9DFE01418EBCFF0A2EBC7F8EBC3FCA2EBC1FEEBC0FF6E
+7EA26E7E6E7EA26E7E6E7E6E7EA26E7E6E7EA2ED7F80ED3FC0ED1FE0A2ED0FF0ED07F8A2
+ED03FCED01FEED00FFA2EE7F98EE3FD8A2EE1FF8160F1607A216031601A2486C1400D807
+F81578B500C01438A2171835337EB23A>I<EC07FC91387FFFC0903901FC07F0903907E0
+00FCD90F80133E013FC76C7E017E6E7E496E7E48486E7E48486E7EA248486E7E000F8249
+157E001F167FA24848ED3F80A2007F17C0A290C9121FA24817E0AB6C17C06D153FA3003F
+17806D157FA2001F17006D5D000F5E6C6C4A5AA26C6C4A5A00015E6C6C4A5A017E4A5A6D
+4A5AD91FC0017FC7FCD907E013FC903901FC07F09039007FFFC0DA07FCC8FC33377CB43C
+>I<B612FEEDFFC016F03A03FC0007FC0001EC00FE167FEE3F80EE1FC017E0160FA217F0
+A617E0A2EE1FC0A2EE3F80EE7F0016FEED07F890B65A168001FCC9FCB3A2487EB512F8A3
+2C337DB234>I<B612FCEDFF8016F03A01FE0007FC0000EC01FEED007F707E707E83160F
+83A65FA24C5AA24C5A047EC7FC4B5AED0FF090B612C093C8FC9039FE001FC0ED07F06F7E
+6F7E150082167E167FA583A5180C17C0A2043F131C486C1618B500FEEB1FE0040F133893
+3807F070C93801FFE09338003F8036357EB239>82 D<90381FE00390387FFC0748B5FC39
+07F01FCF390F8003FF48C7FC003E80814880A200788000F880A46C80A27E92C7FC127F13
+C0EA3FF013FF6C13F06C13FF6C14C06C14F0C680013F7F01037F9038003FFF1403020013
+80157F153FED1FC0150F12C0A21507A37EA26CEC0F80A26C15006C5C6C143E6C147E01C0
+5B39F1FC03F800E0B512E0011F138026C003FEC7FC22377CB42B>I<B500FE90381FFFF8
+A3000190C813006C48153C1718B3AF1738017F1530A217706D6C1460011F15E06E495A01
+0F14036D6C495A6D6C49C7FCD901FC131E6DB413FC91383FFFF0020F13C0020190C8FC35
+357EB23A>85 D<267FFFFC90B512C0A3000101E090381FF80026007F80EB0FC0013F6E5A
+6E91C7FC6D6C130E010F140C6E5B6D6C133801035C6E13606D6C13E06D6C485A5EDA7F83
+C8FCEC3FC715C6EC1FECEC0FFC5D14076E7EA26E7E815C6F7E9138063FC0140E4A6C7E91
+38180FF0EC380702707F91386003FCECC0010101804A6C7E49C77E4981010E6E7E010C6E
+7E131C496E7E01786E7E13FCD807FEEC1FFEB56C90B512F8A335337EB23A>88
+D<EB7F803803FFF0380F80FC381C003E003F133F6D6C7E6E7EA26E7EEA1F00C7FCA4EB01
+FF131FEBFF873803FC07EA0FF0EA1FC0EA3F80127F13004815C05AA3140FA26C131F6C13
+3B3A3F8071F180391FC1E1FF2607FFC013003900FE003C22237DA126>97
+D<EA03F012FFA312071203AEEC3F80ECFFE09038F3C0F89038F7007E01FE7F49EB1F8049
+EB0FC05BED07E016F0A2150316F8AA16F0150716E0A2ED0FC07F6DEB1F8001ECEB3F0001
+CF137C90388381F8903801FFE0C76CC7FC25357EB32B>I<EB07F8EB3FFF9038FC07C039
+01F000E03903E003F03807C007120FEA1F80123F90380003E04890C7FCA2127E12FEAA12
+7FA26C14187F001F14386D1330000F14706C6C13E03903F001C03900FC0F8090383FFE00
+EB07F01D237EA122>I<153FEC0FFFA3EC007F81AEEB07F0EB3FFCEBFC0F3901F003BF39
+07E001FF48487E48487F8148C7FCA25A127E12FEAA127E127FA27E6C6C5BA26C6C5B6C6C
+4813803A03F007BFFC3900F81E3FEB3FFCD90FE0130026357DB32B>I<EB0FE0EB7FFCEB
+F83F3903F00F80D807E013C0390FC007E0381F800315F0EA3F0014014814F8127EA212FE
+A2B6FCA248C8FCA5127E127FA26C1418A26C6C1338000F14306D13706C6C13E03901F003
+C03900FC0F00EB3FFEEB07F01D237EA122>I<EB01FCEB07FF90381F078090383E0FC0EB
+7C1F13FCEA01F8A20003EB070049C7FCACB512F0A3D803F0C7FCB3A7487E387FFFE0A31A
+357FB417>I<151F90391FC07F809039FFF8E3C03901F07FC73907E03F033A0FC01F8380
+9039800F8000001F80EB00074880A66C5CEB800F000F5CEBC01F6C6C48C7FCEBF07C380E
+FFF8380C1FC0001CC9FCA3121EA2121F380FFFFEECFFC06C14F06C14FC4880381F000100
+3EEB007F4880ED1F8048140FA56C141F007C15006C143E6C5C390FC001F83903F007E0C6
+B51280D91FFCC7FC22337EA126>I<EA03F012FFA312071203AEEC1FC0EC7FF09038F1E0
+FC9038F3807C9038F7007E13FE497FA25BA25BB3486CEB7F80B538C7FFFCA326347EB32B
+>I<EA0780EA0FC0EA1FE0A4EA0FC0EA0780C7FCAAEA07E012FFA3120F1207B3A6EA0FF0
+B5FCA310337EB215>I<EB03C0EB07E0EB0FF0A4EB07E0EB03C090C7FCAAEB03F013FFA3
+13071303B3B01238127C00FE13E0130714C0130F007C138038381F00EA1FFCEA07F01443
+84B217>I<EA03F012FFA312071203AF913803FFE0A36E1300EC00F8EC01E05D4A5A020F
+C7FC141C5C5C14F0EBF3F8EBF7FC13FEEBFC7EEBF87F496C7E141F6E7E8114076E7E8114
+016E7E81486CEBFF80B500C313F0A324347EB329>I<EA07E012FFA3120F1207B3B3A7EA
+0FF0B5FCA310347EB315>I<2703F01FE013FF00FF90267FF80313C0903BF1E07C0F03E0
+903BF3803E1C01F02807F7003F387FD803FE1470496D486C7EA2495CA2495CB3486C496C
+487EB53BC7FFFE3FFFF0A33C217EA041>I<3903F01FC000FFEB7FF09038F1E0FC9038F3
+807C3907F7007EEA03FE497FA25BA25BB3486CEB7F80B538C7FFFCA326217EA02B>I<EB
+07F0EB3FFE9038FC1F803901F007C03903C001E000078048486C7E48C7127CA248147E00
+3E143E007E143FA300FE1580A8007E1500A36C147EA26C147C6D13FC6C6C485A00075C39
+03F007E03900FC1F80D93FFEC7FCEB07F021237EA126>I<3903F03F8000FFEBFFE09038
+F3C0F89038F7007ED807FE7F6C48EB1F804914C049130F16E0ED07F0A3ED03F8A9150716
+F0A216E0150F16C06D131F6DEB3F80160001FF13FC9038F381F89038F1FFE0D9F07FC7FC
+91C8FCAA487EB512C0A325307EA02B>I<903807F00390383FFC07EBFC0F3901F8038F38
+07E001000F14DF48486CB4FC497F123F90C77E5AA25A5AA9127FA36C6C5B121F6D5B000F
+5B3907E003BF3903F0073F3800F81EEB3FF8EB0FE090C7FCAAED7F8091380FFFFCA32630
+7DA029>I<3803E07C38FFE1FF9038E38F809038E71FC0EA07EEEA03ECA29038FC0F8049
+C7FCA35BB2487EB512E0A31A217FA01E>I<EBFF06000713CE381F00FE003C133E48131E
+140E5A1406A27EA200FE90C7FC6C7EEA7FFC383FFFC014F0000F7F6C7FC67FEB0FFF1300
+EC3F8000C0131F140F6C1307A37E15006C5B6C130E6C5B38F7807838E1FFE038C07F8019
+237EA11E>I<1330A51370A313F0A21201A212031207381FFFFEB5FCA23803F000AF1403
+A814073801F806A23800FC0EEB7E1CEB1FF8EB07E0182F7FAD1E>I<D803F0133F00FFEB
+0FFFA30007EB007F000380B35DA35D12016D4813800000903803BFFC90387E073FEB1FFE
+D907F8130026227EA02B>I<B5EBFFF0A3D80FF0EB3F800007EC1F000003140E150C6D13
+1C00011418A26C6C5BA26D1370017E1360137F6D5BA290381F8180A214C3010F90C7FCA2
+EB07E6A214FE6D5AA26D5AA36D5AA2146024217E9F29>I<B53A1FFF81FFF0A33C07F801
+FC003F8001F049EB1E0000030100141C816C6C017C1318A26D017E1338000002FE1330A2
+90267E01FF5B159F168090263F030F5BA216C0903A1F8607C180A202C613E390260FCC03
+90C7FCA2D907FC13F6ECF80116FE6D486C5AA36D481378A36D48133034217F9F37>I<B5
+3801FFF8A32603FE0013806C48EB7C0000001478017E1370017F5B90383F81C090381F83
+80D90FC3C7FCEB07E614FE6D5A6D5A6D7E80805B9038039F809038071FC09038060FE0EB
+0C0790381C03F0496C7E01707FEBF000000180000FECFF8026FFFC0313FCA326207F9F29
+>I<3A7FFF807FF8A33A07F8001FC00003EC0F800001EC070015066C6C5BA26D131C017E
+1318A26D5BA2EC8070011F1360ECC0E0010F5BA2903807E180A214F3010390C7FC14FBEB
+01FEA26D5AA31478A21430A25CA214E05CA2495A1278D8FC03C8FCA21306130EEA701CEA
+7838EA1FF0EA0FC025307F9F29>I<003FB512F0A2EB000F003C14E00038EB1FC00030EB
+3F800070137F1500006013FE495A13035CC6485A495AA2495A495A49C7FC153013FE485A
+12035B48481370485A001F14604913E0485A387F000348130F90B5FCA21C207E9F22>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmti9 9 1
+/Fc 1 47 df<121C127F12FFA412FE12380808778718>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmsltt10 9 18
+/Fd 18 122 df<007FB512F0B612F815FCA215F86C14F01E06789927>45
+D<147E903803FF804913C0011F13E04913F0EB7F879038FE01F8EBF800484813FC000314
+7C49137E4848133EA2485AA248C7FCA2123EA45AA500FC147C5AA215FC15F8A26CEB01F0
+A2007C130315E01407007EEB0FC015806C131FEC3F00381F807EEBC1FC6CB45A6C5B6C5B
+6C1380D8007EC7FC1F3079AE27>48 D<1438147C14FC14F8130113031307130F133F3803
+FFF05A13FD13F913E3EA000314E0A41307A214C0A4130FA21480A4131FA21400A45BA213
+3EA3387FFFFEB6FCA36C13FE182F77AE27>I<D9FF80EB3FC0486DEB7FE016FFA26C4A13
+C0D91EE0EBDE00013EEB03FE16BE013C14BCED073CA2150F90397CF00E7C151E0178EB1C
+78153C15381578D9F87013F8EC78F001F05CEC79E0A215C00001EB7BC1EC3B81D9E03F5B
+1501A2143E0003EB1C031400495CA400071407A2495CA3D87FF0EB7FF0A200FF14FFA26C
+486D5A2B2E7FAD27>77 D<EB7FF83801FFFE00076D7E8148809038F01FF0EBE0036C486C
+7EEA0180C8FC140114FF011F5B90B5FC1203120F481383387FF00301805BEAFE005A5A14
+07A24A5A6C133F38FF01FF90B6FC6C15807E000F01E313003803FE0021207A9F27>97
+D<EB03FE90380FFF80013F13E090B512F04814F83903FE03FC3807F800EA0FE04848137E
+5B48C7123EA2127E007FB512FEA4B612FC00FCC8FCA2127C127E1578007F14F8383F8001
+EBC003391FF80FF06CB512E06C14C0000114806CEBFE00EB1FF01F207A9F27>101
+D<EBFFC05AA37E1307130FA25CA4131FA2EC07F8EC1FFEEC7FFF91B512804914C0ECFC1F
+ECE00FECC0071480140049130F137E1680137CA301FC131FA2491400A400015CA249133E
+A33A7FFF87FFF0B500CF13F8A36C018713F0252E7FAD27>104 D<143814FE1301A46D5A
+147891C7FCA73803FFF0487FA37EEA00015CA41303A25CA41307A25CA4130FA25CA3007F
+B512C0B612E0A315C01B2F79AE27>I<90B5FC5AA37EEB001F5CA2143EA4147EA2147CA4
+14FCA25CA41301A25CA41303A25CA41307A25CA3007FB512F8B612FCA36C14F81E2E7BAD
+27>108 D<3A03F0FC07E03A07FBFE1FF090B5EA3FF8EDFFFCA2C690388FFC7C9039FE07
+F03C01FC13E001F813C0A23A01F00F807CA2167801E01300A300034913F8A2D9C01E13F0
+A40007EB3E01A2D9803C13E0A33A7FF0FF87FCD8FFF9EBCFFEA3D87FF1EB8FFC2720809F
+27>I<3903FE07F83907FF1FFEEC7FFF91B5128016C039003FFC1FECE00FECC007148014
+0049130F137E1680137CA301FC131FA2491400A400015CA249133EA33A7FFF87FFF0B500
+CF13F8A36C018713F025207F9F27>I<EB01FCEB0FFF013F13C090B512E04814F03903FC
+0FF83807F003390FE000FC1380001F147C48C7127E003E143EA25AA400FC147CA215FC00
+7C14F81401007EEB03F0A26CEB0FE09038801FC0391FE07F8090B512006C5B6C13F80001
+5B38007F801F207A9F27>I<3A07FF803FC0489038C1FFF002C713F802CF13FC6C90B5FC
+D8000F13E3ED03F89138FC01F09138F800604A1300495A5CA25CA291C8FC5BA2133EA413
+7EA2137CA3B6FCA526207D9F27>114 D<903807FF1C013F13FE90B5FC5A1207EBFC0139
+0FE000FC49137C5BA2153801E01300EA07FEEBFFF8000113FF6C6C13C0010F13E0903800
+7FF0EC03F8001C1301003EEB00FC157C007E14FC127FEC01F8EB80039038E01FF090B5FC
+B612C0158000F8EBFE0038703FF01F207B9F27>I<131E133FA2133EA4137EA2007FB512
+F0B612F8A36C14F0D800FCC7FC5BA41201A25BA41203A25BA2EC01E015F01403A2EC07E0
+140F9038F83FC090B5128015006C5B38007FF8EB1FC01D2979A827>I<397FC00FF839FF
+E01FFCA4000713004913F8A4000F1301A2018013F0A4001F1303A2010013E0A314075A14
+0F003EEB1FC0003F133FEB80FF90B512FE6C14FFA2000713EF0001EB07FE20207A9F27>
+I<3A03FFE07FF848ECFFFCA36C15F83A001F003E006D6C5A01075BECC1F0903803E3E05D
+903801F7806DB4C7FC5C147C143C147C14FE1301EB03CF9038078F80EB0F07011E7FEB3E
+03496C7E01F87F3801F0003A7FFC07FFC0486C4813E0A201FC14C0007F7F26207E9F27>
+120 D<3A01FFE01FFF486D5AA39138E01FFE3A001E0003C0A2011FEB0780A26DEB0F00A2
+151E148001075BA25DA26E5A1303ECC1E0A2ECC3C0EB01E3ECE780A202EFC7FC130014FE
+A25CA2147814F85C13015C13035C130700085BEA7E0F49C8FCEAFE3EEAF8FEB45A5B6C5A
+EA3FC06CC9FC28317F9F27>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmtt9 9 81
+/Fe 81 127 df<123C127E12FFAF127EAE123C1200A7123C127E12FFA4127E123C082F71
+AE27>33 D<90383C03C090387E07E0A7EBFE0F01FC13C0A2007FB512FEB7FCA4003F14FE
+3901F81F80AC003FB512FEB7FCA46C14FE3903F03F00A200075BEBE07EA73803C03C202E
+7DAD27>35 D<EB0380497EA5EB1FF0EBFFFE0003EBFF804814C0001F14E09038E7DFF039
+3F87C7F8387E07C3007C13C100FCEBC0FC12F814C1A300FCEBC0F800FE1470007F140013
+87EA3FFF7E6C13F86C13FE6CEBFF80C614C0010F13E06D13F014CFECC3F814C10038EBC0
+FC127C00FE147CA412FC00FE14F8007E13C1007FEBC3F0383F87C79038F7FFE06CB512C0
+6C1480000314006C13FC38003FE0EB07C0A56D5A1E3A7CB327>I<131FEB7FC0497E5A80
+EA03F1EBE1F8EA07E013C0A513C15C9039C3F1FF80D9E3E113C03803E7E3EBEFC101FF14
+80913881F800EC01F0EA01FEEBFC0301F85B00031307D807FC5B120F381FFE0FD83FBE5B
+EB3F1FD87E1F90C7FC149F38FC0FBF14FE1307ECFC020103EB0F80EB01F8A238FE03FC38
+7E07FE397F1FFF9F6CB61200149F6CEB0FFE390FFC03FC3903F000F822307EAE27>38
+D<120FEA1FC0123F13E0A213F0121F120F1201A4120313E01207EA0FC0A2EA3F80EA7F00
+5A5A12F812700C1773AD27>I<EB01C0EB03E0130F131FEB3FC0EB7F80EBFE00485A5B12
+03485A5B485AA2485AA248C7FCA3127EA45AAC127EA47EA36C7EA26C7EA26C7E7F6C7E12
+017F6C7EEB7F80EB3FC0EB1FE0130F1303EB01C0133A73B327>I<127012F812FE7E6C7E
+6C7EEA0FE06C7E12037F6C7E1200137EA27FA2EB1F80A3EB0FC0A4EB07E0ACEB0FC0A4EB
+1F80A3EB3F00A2137EA25B1201485A5B1207485AEA3FC0485A48C7FC5A12F81270133A7A
+B327>I<130F497EA60078EB81E000FEEB87F000FF138FEBDFBF6CB512E06C14C0000F14
+00000313FCC613F0A2000313FC000F13FF003F14C04814E039FFDFBFF0EB1F8F00FE1387
+0078EB81E00000EB8000A66DC7FC1C207BA627>I<120FEA3FC013E0EA7FF0A213F8A212
+3FA2120F120113F01203EA07E0121FEA7FC0EAFF8013005A12700D14738927>44
+D<007FB512F8B612FCA46C14F81E067C9927>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E
+000A0A728927>I<1538157C15FCA2140115F8140315F0140715E0140F15C0141F158014
+3F1500A25C147E14FE5C13015C13035C13075C130F5CA2131F5C133F91C7FC5B137E13FE
+5B12015B12035BA212075B120F5B121F5B123F90C8FC5A127E12FE5AA25A12781E3A7CB3
+27>I<EB07E0EB3FFC497E90B5FC4814803903FC3FC03907F00FE0390FE007F0EBC00339
+1F8001F8A248C712FCA2003E147C007E147EA3007C143E00FC143FAC007E147EA46C14FC
+A2EB8001001F14F8EBC003000F14F0EBE0073907F00FE03903FC3FC06CB512806C14006D
+5A6D5AEB07E020307DAE27>I<130E131FA25B5BA25B5A5A127FB5FCA213BFEA7E3F1200
+B3AA003FB512805A15C01580A21A2F79AE27>I<EB3FE03801FFF84813FE000FEBFF8048
+14C0393FE07FE0EB800F397F0007F0007EEB03F800FE13015A6C14FC1400A3127CC8FCA2
+140115F8A2140315F01407EC0FE0EC1FC0143FEC7F80ECFF00495A495A495A495A495A49
+5A495A01FEC7FC485AD807F81378484813FC485A485A48B5FCB6FCA36C14F81E2F7CAE27
+>I<EB1FF8EBFFFE0003EBFF80000F14C015E0391FF01FF0393FC007F8EB800115FC1400
+A26CC7FC1204C8FC140115F81403EC07F0140FEC3FE090381FFFC0491380A215E06D13F0
+9038001FF8EC03FC1401EC00FE157E157F153FA21238127C12FEA2157F48147E6C14FE00
+7FEB01FCEB8003393FF01FF86CB512F06C14E000031480C6EBFE00EB1FF820307DAE27>
+I<EC3F804A7EA214FF5BA2EB03F7EB07E7A2EB0FC71487131FEB3F07A2137E13FCA2EA01
+F813F01203EA07E0A2EA0FC0EA1F80A2EA3F00123E127E5AB7128016C0A36C1580C73807
+C000A849B5FC491480A36D1400222F7EAE27>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E
+00C7FCAC121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A20729F27>58
+D<120FEA3FC0A2EA7FE0A4EA3FC0A2EA0F00C7FCAC120FEA3F8013C0127F13E0A3123FA2
+120F120713C0120FA2EA3F80EA7F005A5A12F812700B2A739F27>I<153815FC14011407
+140FEC3FF8EC7FE0ECFFC001031300495AEB1FF8495A495A3801FF804890C7FCEA0FFC48
+5AEA7FF0EAFFC05BA27FEA7FF0EA1FF86C7EEA03FF6C7F38007FE06D7E6D7EEB07FE6D7E
+010013C0EC7FE0EC3FF8EC0FFC14071401140015381E287CAA27>I<127012FC7E6C7E7F
+EA7FF0EA1FF86C7EEA03FF6C7F38007FE06D7E6D7EEB07FE6D7E010013C0EC7FE0EC3FF8
+EC0FFC1407A2140FEC3FF8EC7FE0ECFFC001031300495AEB1FF8495A495A3801FF804890
+C7FCEA0FFC485AEA7FF0EAFFC05B48C8FC5A12701E287CAA27>62
+D<EBFFF8000313FF000F14C0003F14E04814F09038C01FF839FF0003FC4813011400A214
+01007C1303C7EA0FF8EC1FF0EC7FE0ECFFC0491300EB03FC495A5C495A5C131F5CA76DC7
+FC90C8FCA7130F497E497EA46D5A6DC7FC1E2E7CAD27>I<EB01FE903807FF80011F13C0
+017F13E090B512F048EB03F83803FC013907F000FC390FE01F7C9038C07FFE381F80FF13
+01485A393E07F1FF007E13E0397C0FC07FEC803FA2EAFC1F00F8EB001FA800FCEB803FD8
+7C0F133EA2ECC07E397E07E0FC003E13F1393F03FFF86C6C13F0018013E0390FC07FC090
+38E01F1E3907F0003FD803FC137F3901FF03FF6CEBFFFE6D13FC011F13F0010713C00101
+1300202E7DAD27>I<EB03F0497EA2497EA4143CEB1F3EA5EB3F3FA3EB3E1FA2017E7FA4
+496C7EA548486C7EA390B5FCA24880A3EBF003A248486C7EA4000F803A7FFC0FFF8000FF
+15C06D5A497E007F1580222F7EAE27>I<007FB5FCB612C08115F87E3907E003FCEC00FE
+157E157F81A6157EA25D1403EC0FF890B55A15C015F081819038E000FE157FED3F80151F
+A2ED0FC0A6151F1680153FED7F004A5A007FB55AB65A5D15E06C1480222E7FAD27>I<90
+3803F80E90381FFE1F90383FFFBF90B6FC5A3803FE0F3807F803497E48487E485A49137F
+A248C7123FA25A127E151E150012FE5AAA7E127EA2151E007F143F7EA26C7E157F6D137E
+6C6C13FE3907F001FCEBF8033903FE0FF86CB512F06C14E0013F13C06D1300EB03F82030
+7DAE27>I<387FFFFC14FFB612C06C80813907E00FF81407EC01FC6E7EA2157E157F8116
+80151FA316C0150FABED1F80A3153F1600A25D15FEA24A5A4A5A140F007FB55A5DB65A6C
+91C7FC14FC222E7FAD27>I<007FB61280B712C0A37E3907E0000FA6ED078092C7FCA4EC
+07804A7EA390B5FCA5EBE00FA36E5A91C8FCA4ED03C0ED07E0A7007FB6FCB7FCA36C15C0
+232E7FAD27>I<007FB61280B712C0A37E3907E0000FA6ED078092C7FCA4EC07804A7EA3
+90B5FCA5EBE00FA36E5A91C8FCAC387FFF80B57EA36C5B222E7EAD27>I<903807F03890
+381FFC7C90387FFFFC90B5FC5A3803FC1F3807F00F380FE007EBC003001F13011380123F
+90C7FCA2127EA2157892C7FC5AA8EC1FFF4A1380A3007E6D1300EC00FCA36C1301A21380
+121FEBC003120FEBE0073807F00F3803FC1F6CB5FC7EEB7FFE90381FFC78D907F0C7FC21
+307DAE27>I<3A7FFE07FFE0B54813F0A36C486C13E03A07E0007E00AF90B512FEA59038
+E0007EB03A7FFE07FFE0B54813F0A36C486C13E0242E7FAD27>I<007FB512E0B612F0A3
+6C14E039001F8000B3B2007FB512E0B612F0A36C14E01C2E7BAD27>I<3A7FFC07FF8016
+C0486C5A6C487E16803A07C001F80014035D4A5A4A5A141F5D4AC7FC147E14FE5CEBC1F8
+EBC3F013C75CEBCFF0EBDFF813FF8013FEEBFC7E143EEBF83F497E01E07F140F01C07F14
+07811403816E7EA26E7E157C157E3A7FFC01FFC016E0486C5A6C487E16C0232E7FAD27>
+75 D<387FFFC080B5FC7E5CD803F0C8FCB3AAED0780ED0FC0A7007FB6FCA2B7FC7E1680
+222E7FAD27>I<D87FE0EB7FE0486CEBFFF0A26D5A007F15E0000F150001B813DFEBBC03
+A3EBBE07019E139FA3EB9F0FA2018F131FA2149FA2EB879EA4EB839C14FCA3EB81F8A2EB
+80F01400AAD87FF0EBFFE0486C4813F0A36C486C13E0242E7FAD27>I<3A7FF003FFE048
+6C4813F0A213FC007F6D13E000079038003E0013DEA313CFA3148013C714C0A213C314E0
+A213C114F0A3EBC0F8A31478147CA2143C143EA2141E141F140FA3EC07BEA3EC03FEEA7F
+FCEAFFFE1401A26C486C5A242E7FAD27>I<EBFFFC0007EBFF80001F14E0A24814F0EBC0
+0F397F8007F8EB0003007E1301A348EB00FCB3A76C1301007E14F8A3007F1303EB800739
+3FE01FF090B5FC6C14E0A200071480C6EBFC001E307CAE27>I<007FB5FCB612E081816C
+803907E003FEEC00FF81ED3F80151F16C0150FA6151F1680153FED7F005DEC03FE90B55A
+5D5D5D92C7FC01E0C8FCADEA7FFEB5FCA36C5A222E7FAD27>I<387FFFF0B512FE6E7E81
+6C803907E01FF014076E7E1401811400A514015D14034A5A141F90B55A5D5DA281EBE01F
+6E7E14076E7EA816F0EDF1F8A4397FFE01FBB5EBFFF08016E06C48EB7FC0C8EA1F00252F
+7FAD27>82 D<90387FC0E03901FFF1F0000713FF5A5AEA3FE0EB801F387F000F007E1307
+12FE5A1403A3EC01E06C90C7FC127E127FEA3FC013F86CB47E6C13F86C13FE6CEBFF80C6
+14C0010F13E0010013F0140FEC07F81403140115FC1400127812FCA46CEB01F8A26C1303
+90388007F09038F01FE090B5FC15C0150000F85B38701FF81E307CAE27>I<007FB61280
+B712C0A439FC03F00FA60078EC0780000091C7FCB3AB90B512C04880A36C5C222E7EAD27
+>I<3A7FFE01FFF8B54813FCA36C486C13F83A07E0001F80B3AB6D133F00031500A26D5B
+0001147E6D13FE6C6C485A90387F87F814FF6D5B010F13C06D5BD901FEC7FC262F80AD27
+>I<3A7FFC03FFE06D5A00FF15F0007F15E0497E3A07E0007E00A46C6C5BA4EBF8010001
+5CA46C6C485AA490387E07E0A56D485AA4011F5B149FA3010F90C7FCA5EB07FEA46D5AA2
+6D5A242F7FAD27>I<D87FE0EB7FE0486CEBFFF0A36C48EB7FE0001FC7EA0F80A76C6CEB
+1F00A614F0EB81F83907C3FC3EA4149CEBC79EA30003143CA301E7137CEBEF9FA2140FA2
+00011478A49038FE07F8A300005CA2EBFC0390387801E0242F7FAD27>I<393FFC1FFE38
+7FFE3F815D383FFC1F3903F00FE001F85B1201EBFC1F00005CEBFE3F017E90C7FCEB7F7F
+EB3F7E14FE6D5AA26D5AA26D5AA21303130780130F80131F80EB3F7E147F497E017E7F14
+1F01FC7F140FD801F87F14071203496C7E120701E07F3A7FFC0FFF8000FF15C06D5A497E
+007F1580222E7EAD27>I<3A7FFC03FFE06D5A00FF15F0007F15E0497E3A07F000FE0000
+035CEBF80100015CA2EBFC0300005CEBFE07017E5BA26D485AA290381F9F80A3010F90C7
+FCA2EB07FEA26D5AA26D5AAF90381FFF80497FA36D5B242E7FAD27>I<003FB512FE4814
+FFA4007EC712FEEC01FCA2EC03F8EC07F0A2003CEB0FE0C7EA1FC0A2EC3F80EC7F00A214
+FE5C1301495A5C1307495A5C131F495A91C7FC5B13FEA2485A4848131E153F485A485AA2
+485A485AA248C7FCB7FCA46C14FE202E7DAD27>I<387FFFF0B512F8A314F000FCC7FCB3
+B3ACB512F014F8A36C13F0153A71B327>I<387FFFF0B512F8A37EEA0001B3B3ACEA7FFF
+B5FCA36C13F0153A7EB327>93 D<131C137E3801FF80000713E0001F13F84813FC38FFE7
+FF13C3130000FC133F0078131E180B79AD27>I<007FB512F8B612FCA46C14F81E067C7E
+27>I<13E0EA01F01207120F13E0EA1FC0EA3F00A2127E127C12FC5AA4B4FC138013C012
+7FA2123F1380EA0F000C1773B227>I<3803FFC0000F13F04813FC4813FF811380EC1FC0
+381F000F000480C71207A2EB0FFF137F0003B5FC120F5A383FFC07EA7FC0130012FE5AA4
+6C130F007F131FEBC0FF6CB612806C15C07E000313F1C69038807F8022207C9F27>I<EA
+7FE0487EA3127F1203A914FF01F313C090B512F08181EC81FE49C67E49EB3F8049131F16
+C049130FA216E01507A6150F16C07F151F6DEB3F80157F6DEBFF009038FF83FEECFFFC5D
+5D01F313C02601E0FEC7FC232E7FAD27>I<EB0FFF017F13C048B512E04814F05A380FF8
+07EA1FE0393FC003E0903880008048C8FC127EA212FE5AA67E127EA2007F14F0393F8001
+F813C0381FE003390FF80FF06CB5FC6C14E06C14C06C6C1300EB0FF81D207B9F27>I<EC
+3FF04A7EA3143F1401A9EB0FE1EB7FFD48B5FC5A5A380FF83F381FE00F383FC007EB8003
+EA7F00007E1301A212FE5AA67E007E1303A2127F6C1307EB800F381FE01F380FF03F6CB6
+12C06C15E06C13FD38007FF9D91FE013C0232E7EAD27>I<EB0FF8EB3FFE90B512800003
+14C04814E0390FFC0FF0391FE003F8EBC001D83F8013FC48C7FC127E157E12FEB612FEA4
+15FC00FCC8FC7E127E127F6C143C6D137E6C7E01F013FE390FFC07FC6CB5FC000114F86C
+14F0013F13C0903807FE001F207D9F27>I<EC1FF0ECFFF84913FC4913FE5BEB0FF014C0
+011F137CEC8000A6007FB512F0B612F8A36C14F039001F8000B3A4003FB512C04814E0A3
+6C14C01F2E7EAD27>I<153F90391FC0FF80D97FF313C048B612E05A4814EF390FF07F87
+3A1FC01FC3C0EDC000EB800F48486C7EA66C6C485AEBC01FA2390FF07F8090B5C7FC5C48
+5BEB7FF0EB1FC090C9FCA27F6CB5FC15E015F84814FE4880EB8001007EC7EA3F80007C14
+0F00FC15C0481407A46C140F007C1580007F143F6C6CEB7F009038F807FF6CB55A000714
+F86C5CC614C0D90FFCC7FC23337EA027>I<EA7FE0487EA3127F1203A9147F9038F1FFC0
+01F713F090B5FC8114C1EC01FCEBFE005B5BA25BB03A7FFF83FFE0B500C713F0A36C0183
+13E0242E7FAD27>I<130F497E497EA46D5A6DC7FC90C8FCA7383FFF80487FA37EEA000F
+B3A4007FB512F0B6FC15F815F07E1D2F7BAE27>I<143C147E14FFA4147E143C1400A738
+01FFFE4813FFA37EC7123FB3B0147E1238007C13FE38FE01FC1303B512F814F06C13E06C
+13803807FE0018407CAE27>I<EA7FE07F12FF127FA21201A991383FFFC04A13E0A36E13
+C0913803F8004A5A4A5A4A5A4A5A02FFC7FCEBF1FEEBF3FCEBF7F8EBFFFC8080143F496C
+7E496C7E01F87FEBF0076E7E6E7E816E7E157E3A7FFFC1FFF002C313F8B512E36C13C316
+F0252E80AD27>I<387FFF80B57EA37EEA000FB3B2007FB512F8B612FCA36C14F81E2E7C
+AD27>I<397F07C01F3AFF9FF07FC09039FFF9FFE091B57E7E3A0FFC7FF1F89038F03FC0
+01E0138001C01300A3EB803EB03A7FF0FFC3FF486C01E3138001F913E701F813E36C4801
+C313002920819F27>I<387FE07F39FFF1FFC001F713F090B5FC6C80000313C1EC01FCEB
+FE005B5BA25BB03A7FFF83FFE0B500C713F0A36C018313E024207F9F27>I<EB1FE0EB7F
+F83801FFFE487F481480390FF03FC0391FC00FE0393F8007F0EB00034814F8007E1301A2
+48EB00FCA76C1301007E14F8A2007F1303393F8007F0A2391FE01FE0390FF03FC06CB512
+806C14006C5B38007FF8EB1FE01E207C9F27>I<387FE0FFD8FFF313C090B512F0816C80
+0003EB81FE49C67E49EB3F8049131F16C049130FA216E01507A6150F16C07F151F6DEB3F
+80157F6DEBFF009038FF83FEECFFFC5D5D01F313C0D9F0FEC7FC91C8FCAC387FFF80B57E
+A36C5B23317F9F27>I<90380FF03C90383FFE7E90B5FC000314FE5A380FFC1F381FE007
+EBC003383F800148C7FC127EA200FE147E5AA67E007E14FEA2007F1301EA3F80EBC00338
+1FE007380FF81F6CB5FC7E6C147E38007FFCEB0FF090C7FCAC91381FFFF8A24A13FC6E13
+F8A226317E9F27>I<397FFC03FC39FFFE0FFF023F13804A13C0007F90B5FC39007FFE1F
+14F89138F00F809138E002004AC7FC5CA291C8FCA2137EAD007FB57EB67EA36C5C22207E
+9F27>I<9038FFF3800007EBFFC0121F5A5AEB803F38FC000F5AA2EC07806C90C7FCEA7F
+8013FC383FFFF06C13FC000713FF00011480D8000F13C09038003FE014070078EB03F000
+FC1301A27E14036CEB07E0EBE01F90B512C01580150000FB13FC38707FF01C207B9F27>
+I<133C137EA8007FB512F0B612F8A36C14F0D8007EC7FCAE1518157EA415FE6D13FC1483
+ECFFF86D13F06D13E0010313C0010013001F297EA827>I<397FE01FF8486C487EA3007F
+131F00031300B21401A21403EBFC0F6CB612E016F07EEB3FFE90390FF87FE024207F9F27
+>I<3A7FFC0FFF80486C4813C0A36C486C13803A07C000F800EBE00100035CA2EBF00300
+015CA2EBF80700005CA390387C0F80A36D48C7FCA3EB3F3FEB1F3EA214FE6D5AA36D5AA2
+6D5A22207E9F27>I<3A7FFE07FFE000FF15F06D5A497E007F15E03A0F80001F00A36D5B
+0007143EA414F0EBC1F83903E3FC7CA4EBE79EA200011478A301F713F8A2EBFF0F6C5CA3
+EBFE0790387C03E024207F9F27>I<393FFC1FFF486C5A168016006C487E3901F807E06C
+6C485A4A5A017E90C7FC6D5AEB1F7E5C6D5A13076D5A5C80497E130F497E143EEB3E3FEB
+7E1F90387C0F8001F87F00016D7E3803F0033A7FFE1FFF80A2B54813C06C486C1380A222
+207E9F27>I<3A7FFC0FFF80486C4813C0A36C486C13803A07E000F800000313015D13F0
+0001130301F85B1200A26D485A137CA290387E0F80133EA2011F90C7FC5CA2130F149E14
+BE130714FC1303A25C1301A25CA213035CA213075C1208EA3E0F007F5B131FD87E7FC8FC
+EA7FFE6C5A5B6C5AEA07C022317E9F27>I<001FB512FE4814FFA490380001FEEC03FCEC
+07F8EC0FF0001EEB1FE0C7EA3FC0EC7F80ECFF00495A495A495AEB1FE0495A495A49C7FC
+485A4848131E4848133F485A485A485A485AB7FCA46C14FE20207E9F27>I<EC07F8EC3F
+FC14FF130315F8903807FE00EB0FF05C5CB0131FEB7F80EA3FFFB5C7FC5BA27F003F7FEA
+007FEB1FC0130FB08080EB07FE903803FFF815FC1300143FEC07F81E3A7CB327>I<EA7F
+80EAFFF013FC13FF7E00017F38003FC0131F130FB080EB07F8ECFFF06D13FC7FA25B4913
+F0ECF800EB0FE05CB0131F133F48B45A007F90C7FCB5FC13FC13F0EA7F801E3A7CB327>
+125 D<3901F003803903FC07C0000F130F381FFE1F393FFF7F80397FBFFF0038FE1FFE48
+6C5A00F813F0387003E01A0A7AAD27>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmr8 8 26
+/Ff 26 118 df<123C127EB4FCA21380A2127F123D1201A312031300A25A1206120E5A5A
+5A126009157AAD14>39 D<B512C0A412047F9018>45 D<130C133C137CEA03FC12FFEAFC
+7C1200B3B113FE387FFFFEA2172C7AAB23>49 D<4A7E4A7EA34A7EA24A7EA3EC1BF81419
+A2EC30FCA2EC70FEEC607EA24A7EA349486C7EA2010380EC000FA201066D7EA3496D7EA2
+011FB57EA29038180001496D7EA349147EA201E0147F4980A20001ED1F801203000716C0
+D80FF0EC3FE0D8FFFC0103B5FCA2302F7EAE35>65 D<B612FCEDFF803A03F8000FC00001
+EC03F06F7E6F7E82167E167FA6167E16FE5E4B5A4B5AED0FE0ED7F8090B6C7FC16E09039
+F80003F0ED01FC6F7E167F821780161F17C0A61780163F17005E16FEED03FC0003EC0FF0
+B712C04BC7FC2A2D7DAC32>I<DA1FF013C09138FFFE01903903F00F8390390F8001E301
+3FC71277017C143F4848141F4848140F48481407A248481403121F491401123F90C8FC48
+1500A300FE1600AB127F17C0A27E7F001F15016D1580120F6C6C1403EE07006C6C14066C
+6C140ED8007C5C013F147890390F8001E0903903F00FC0902600FFFEC7FCEC1FF02A2F7C
+AD33>I<B612F815FF3A03F8001FE00001EC03F0ED00F8167E82EE1F80160F17C0EE07E0
+A2EE03F0A217F81601A317FCAA17F8A3EE03F0A217E0160717C0160FEE1F80EE3F00167E
+5EED03F00003EC1FE0B7128003F8C7FC2E2D7DAC36>I<B712FEA23903F800010001EC00
+3E828282A282A3178016011518A293C7FCA31538157815F890B5FCA2EBF8001578153815
+18A21760A392C712C0A4160117801603A21607160F163F0003913801FF00B8FCA22B2D7E
+AC30>I<B712FCA23903F800030001EC007C163E161E160EA21606A3160716031518A216
+00A31538157815F890B5FCA2EBF800157815381518A592C7FCAB487EB512F8A2282D7EAC
+2E>I<B512F8A2D803FCC8FC6C5AB3A7160CA41618A41638A2167816F81501ED07F00003
+141FB7FCA2262D7EAC2C>76 D<B612FCEDFF803A03F8000FE00001EC03F0ED00F882167E
+167F821780A617005E167E5E5EED03F0ED0FE090B6128003FCC7FC01F8C9FCB2487EB512
+F0A2292D7EAC30>80 D<B612C015FC3903F8007F0001EC0FC06F7E6F7E6F7E82150082A5
+5E15015E4B5A4B5A4B5A037FC7FC90B512FC15F09038F800FC153E6F7E150F826F7EA582
+A5170316F815031707486C903801FC0EB539F000FE1CEE3FF8C9EA07E0302E7DAC34>82
+D<90383F80303901FFF0703807C07C390F000EF0001E13074813034813011400127000F0
+1470A315307EA26C1400127E127FEA3FE013FE381FFFE06C13FC6C13FF00011480D8003F
+13E013039038003FF0EC07F81401140015FC157C12C0153CA37EA215787E6C14706C14F0
+6CEB01E039F78003C039E3F00F0038E07FFE38C00FF01E2F7CAD27>I<007FB712F8A290
+39000FC003007C150000701638A200601618A200E0161CA248160CA5C71500B3A94A7E01
+1FB512E0A22E2D7EAC33>I<EAFFE0A3EAE000B3B3B3A7EAFFE0A30B4379B114>91
+D<13FF000713C0380F01F0381C00F8003F137C80A2143F001E7FC7FCA4EB07FF137F3801
+FE1FEA07F0EA1FC0EA3F80EA7F00127E00FE14065AA3143F7E007E137F007FEBEF8C391F
+83C7FC390FFF03F83901FC01E01F207D9E23>97 D<EB1FE0EB7FFC3801F01E3803E00739
+07C01F80EA0F80EA1F005A003EEB0F00007E90C7FCA2127C12FCA9127EA215C07E6C1301
+01801380380FC0033907E007003801F03E38007FF8EB1FC01A207E9E1F>99
+D<EB1F80EBFFF03803E0783807C03E380F801E381F001FEC0F80123E007E130715C0127C
+12FCA3B6FCA200FCC8FCA5127EA2003E14C0123F6C1301390F80038001C013003803E00F
+3801F03C38007FF8EB1FC01A207E9E1F>101 D<130FEB1F80EB3FC0A4EB1F80EB0F0090
+C7FCA8EB07C013FFA2130F1307B3AD1230127838FC0F80A21400485AEA783EEA3FF8EA07
+E0123C83AD16>106 D<EA07C012FFA2120F1207ADEC1FFEA2EC0FF0EC07C05D020EC7FC
+5C5C5C5CEBC3C013C7EBCFE0EBDFF013F9EBF0F8497EEBC07E143E80816E7E14076E7E81
+6E7E486C487E3AFFFE07FF80A2212E7EAD25>I<3807C0FE39FFC3FF809038C703E0390F
+DE01F0EA07F8496C7EA25BA25BB2486C487E3AFFFE1FFFC0A2221E7E9D27>110
+D<3807C0FE39FFC7FF809038CF03E0390FDC01F03907F800FC49137E49133E49133FED1F
+80A3ED0FC0A8151F1680A2ED3F00A26D137E6D137C5D9038FC01F09038CE07E09038C7FF
+80D9C1FCC7FC01C0C8FCA9487EEAFFFEA2222B7E9D27>112 D<380781F838FF87FEEB8E
+3FEA0F9CEA07B813B0EBF01EEBE000A45BB0487EB5FCA2181E7E9D1C>114
+D<3801FE183807FFB8381E01F8EA3C00481378481338A21418A27E7EB41300EA7FF06CB4
+FC6C13C06C13F0000113F838001FFC130138C0007E143EA26C131EA27EA26C133CA26C13
+7838FF01F038E3FFC000C0130017207E9E1C>I<1360A413E0A312011203A21207121FB5
+12F0A23803E000AF1418A714383801F03014703800F860EB3FE0EB0F80152A7FA81B>I<
+D807C013F800FF131FA2000F130100071300B21401A314033803E007EC0EFC3A01F81CFF
+C038007FF890391FE0F800221F7E9D27>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmsy9 9 2
+/Fg 2 106 df<EB0180EB03C01307A21480130FA2EB1F00A2131E133EA25BA2137813F8
+A2485AA25B1203A2485AA25B120FA248C7FCA2121E123EA25AA2127812F8A41278127CA2
+7EA2121E121FA26C7EA212077FA26C7EA212017FA26C7EA21378137CA27FA2131E131FA2
+EB0F80A2130714C0A21303EB0180124A79B71E>104 D<126012F07EA21278127CA27EA2
+121E121FA26C7EA212077FA26C7EA212017FA26C7EA21378137CA27FA2131E131FA2EB0F
+80A2130714C0A41480130FA2EB1F00A2131E133EA25BA2137813F8A2485AA25B1203A248
+5AA25B120FA248C7FCA2121E123EA25AA2127812F8A25A1260124A7CB71E>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmcsc10 12 9
+/Fh 9 121 df<160C161E163EA2163C167CA2167816F8A216F01501A2ED03E0A216C015
+07A21680150FA216005DA2153EA2153C157CA2157815F8A25D1401A24A5AA25D1407A25D
+140FA292C7FC5CA2143EA2143C147CA2147814F8A2495AA25C1303A25C1307A25C130FA2
+49C8FCA2131E133EA2133C137CA2137813F8A2485AA25B1203A25B1207A25B120FA248C9
+FCA2121E123EA2123C127CA2127812F8A25A1260276479CA37>47
+D<B7FC16F016FC3A03FE0003FF6C489038007F80EE1FE0707E707E707E1601707E177FA2
+1880173F18C0A2EF1FE0A418F0AA18E0A4EF3FC0A21880177F180017FE16015F4C5AEE0F
+F04C5AEE7FC0486CD903FFC7FCB712FC16F093C8FC34337BB23E>100
+D<DA03FF1303021FEBE00791B5EAF80F0103903800FE1FD90FF8EB1F3FD91FE0EB07BFD9
+7F806DB4FC49C77E484880484881484881A2484881121F4981123F5BA2007F82A25B00FF
+93C7FCAA4BB512F86C7EA2DB00011380003F6F1300837F121F7F120F6C7E7F12036C7E6C
+6C5DEB7FC0D91FE05BD90FF8EB07DF903A03FF803F8F01009038FFFE07021FEBF8030203
+0180C7FC35357BB340>103 D<B512F8A33803FE006C5AB3B3A7487EB512F8A315337BB2
+1E>105 D<EC07FF023F13E0903901FE03FC903907F0007FD90FC0EB1F80D93F80EB0FE0
+49C76C7E01FE6E7E48486E7E48486E7E4848157FA24848ED3F80001F17C0A24848ED1FE0
+A3007F17F049150FA300FF17F8AA007F17F06D151FA2003F17E0A26D153F001F17C0A26C
+6CED7F80000717006D5D00035E6C6C4A5A6C6C4A5A017F4A5A6D6C495AD90FC0EB1F80D9
+07F0017FC7FC903901FE03FC9039003FFFE0020790C8FC35357BB33F>111
+D<B7FC16F016FC3A03FE0003FF6C489038007F80EE3FC0EE1FE0EE0FF0A2EE07F8A217FC
+A617F8A2EE0FF0A2EE1FE0EE3FC0EEFF00ED03FE90B612F816C001FCC9FCB3A2487EB512
+F8A32E337BB238>I<90390FF0018090387FFE0348B512873907F00FEF390FC001FF48C7
+FC003E143F151F5A150F5A1507A36C1403A27E6C91C7FC6C7E7FEA3FF8EBFF806C13FC6C
+EBFFC06C14F06C80C614FE011F7F01031480D9001F13C014019138003FE0151F150FED07
+F0150312E01501A37EA216E06C1403A26CEC07C06CEC0F806C6CEB1F0001E0133ED8FBFE
+13FC00F0B55AD8E01F13E0D8C00390C7FC24357BB32E>115 D<B500F890383FFFE0A3D8
+03FEC7000713006C48EC01FC705A1770B3AE000016F06D5DA2017E1401017F4A5A7F6D6C
+495A6E49C7FC6D6C131ED903F0137C903901FE03F89039007FFFE0021F1380DA03FCC8FC
+33347BB23D>117 D<267FFFF890383FFFF0A3000101E0010F13006C49EB07F8017F5D01
+3F15C06D6C5C6D6C49C7FC160E6D6C131E6D6C5B6D6C133816786D6C5B91387F81E0023F
+5B15C391381FE7806EB4C8FC5D14076E5A6E7EA26E7E4A7FA24A7F9138079FE091380F0F
+F0140E91381E07F84A6C7E4A6C7E14709138F000FF49486D7E4948133F4A8001076E7E49
+C76C7E131E013E6E7E017E6E7E01FE81000182D80FFF4A1380B500C0011F13FEA337337D
+B23D>120 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmtt12 13.14 8
+/Fi 8 116 df<003FB712804816C0B812E0A46C16C06C16802B087AA438>45
+D<91397FC003FC903A01FFF01FFF0107D9FC7F1380011F90B612C05B5B90B8FC48903AC0
+7FFE1F80913A001FF00F0048486D6CC7FC49130748486D7E491301000F81491300A76D13
+0100075D6D13036C6C495A6D130F6C6C495AECC07F91B55A5E485D93C8FCD807F713FC01
+E113F09038E07FC091CAFCA27F12037F6D7E6CB612C06C15FC4815FF4816C048824882D8
+1FF8C76C7ED83FE0EC07FC0180EC01FE48C9FC177F007E8200FE178048161FA66C163F00
+7FEE7F006D5D6C6C4A5A01F01407D81FFEEC3FFC3B0FFFE003FFF86C90B65A6C5EC61680
+013F4AC7FC010F14F8010314E09026003FFEC8FC324A7DAF38>103
+D<EA3FFE487EB5FCA37E7EC67EACED7FC0913801FFF8020713FE021F7F4A805C91B67EED
+C07F9139FE001FE002F8130F4A805C16075C5CA391C7FCB3A6273FFFFE03B512E0486D48
+14F0B6008F14F8A36C020714F06C496C14E035437FC238>I<14F0497E497E497EA46D5A
+6D5A6D5A91C8FCAB383FFFFC487FB5FCA37E7EC7FCB3AF007FB612F0B712F816FCA316F8
+6C15F0264476C338>I<387FFFFEB6FCA57EC77EB3B3B1007FB7FCB81280A56C16002943
+79C238>108 D<ED7FC03A3FFE01FFF8267FFF0713FEB5001F7F4A805C6C90B67E6CECC0
+7F3B007FFE001FE002F8130F4A805C16075C5CA391C7FCB3A6273FFFFE03B512E0486D48
+14F0B6008F14F8A36C020714F06C496C14E035307FAF38>110 D<EC7FC0903803FFF801
+0F13FE497F017F14C090B67E4881489038C07FF8489038001FFC01FC130748486D7E4913
+0148486D7E4980003F168049143F007F16C090C8121FA300FEED0FE0A96C151FA26C16C0
+A26D143FA26C6CEC7F80A26C6CECFF006D5B6C6C495A6D13076CB4EB1FFC6C9038C07FF8
+6C90B55A6C5D6D5C6D5C010F49C7FC010313F89038007FC02B327AB038>I<903907FF80
+F0017FEBF1F848B512FD000714FF5A5A5AEBFC00D87FE0131F0180130F48C71207481403
+A5007FEC01F001C090C7FCEA3FF013FE381FFFF86CEBFFC0000314F8C614FF013F148001
+0714E0D9003F13F0020013F8ED0FFC1503003CEC01FE007E140000FE15FF167F7EA37F6D
+14FF16FE01F013036DEB07FC01FF137F91B512F816F016E04815C0D8FC3F1400010F13FC
+D8780113E0283278B038>115 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmsltt10 10.95 50
+/Fj 50 122 df<137C13FE487E1480A214C0A3EA007F130F131F1480A3133F14005B137E
+13FE485A1203485AEA1FF0485AB45A5B90C7FC127C1238121D6BB730>39
+D<140F4A7EA2143FA492C7FCD8078014783A0FC07F01FCD81FF0130701F8130F9038FE7E
+3F01FFEBFFF86C90B512F0000315C0C615006D13FC011F13E001071380011F13E0017F13
+F848B512FE000780001F15C0267FFDFB13E0EBF1F8D8FFC1137F0183133FD87E03EB0FC0
+0078EC0780000049C7FCA21307A45C6D5A262777AE30>42 D<007FB612E0B712F016F8A3
+16F06C15E02507769E30>45 D<EC07F8EC1FFEEC7FFF49B512C04914E04914F090380FF8
+1F90391FE00FF890383FC00790397F8003FC9038FF00014914FE48481300485A16FF4848
+147FA2485AA2485AA25B123FA348C8FCA500FE15FEA4ED01FCA3ED03F8A215076C15F015
+0F6C15E0151F6D14C0ED3F80003F147F6DEBFF004A5A381FE0036D485A390FFC1FF86CB5
+5A6C5C6C14806C91C7FCEB7FFCEB0FE0283A78B830>48 D<EC03C0EC07E0A2140F141FA2
+143FEC7FC014FF1303130F90B5FC5A48148014BFEBFE3FEA01F8C7FC147F1500A55C5CA5
+13015CA513035CA513075CA5130F5CA2007FB512F8B612FCA46C14F81E3976B830>I<EC
+07FC91383FFF8091B512E0010314F84980011F8090393FF80FFF90267FE0011380EC8000
+49C7EA3FC05B0001151F4915E01203160FA349141F1201D800E015C090C8FC163F178016
+7F17005E4B5A15034B5A5EED1FF04B5A4B5A4B5A4A90C7FC4A5AEC0FFC4A5AEC3FE0ECFF
+C0495B4990C8FCEB07FCEB1FF8495AEB7FC0495A000390C712F0D807FC497E48481303EA
+3FF048B6FCB7FCA35E6C5D2B397AB830>I<EC07FE91387FFFC049B512F0010780498049
+8090393FFC03FFECE000D97F80EB7F80163FA391C7FCA2131C90C8FC167F17005E4B5A4B
+5A1507ED1FF8EDFFF091B55A495C93C7FC82826D809138003FF0ED07F86F7E15016F7EA2
+8282A3121C007E5D007F5D5A15015E4814034B5A6C140F6C6CEB3FF001E0495A3A3FFC03
+FFC06CB65A6C92C7FC6C14FC000114F06C6C13C0D90FFEC8FC293A7AB830>I<1378EA01
+FE487E5A1480A25A14007E5B6C5AEA00F090C7FCAFEA0F80EA3FC0487E7F12FFA45B127F
+6C5A6CC7FC11276DA630>58 D<ED1F80ED7FC08215FFA25CA3EC03F7A2140715E7A2140F
+15C7A2141F1587143FA2ED07F0147FA214FEA3EB01FCA3EB03F8A2EB07F0A3EB0FE0A249
+B5FCA2825BA25BEC0003A213FEA3485AA212035BD83FFFEB3FFF486D481380B56CB512C0
+A26C496C13806C496C13002A397DB830>65 D<913903FC01E091391FFF81F0027F13E391
+B512F7010314FF5B49130790261FF80113E049487ED97FC0137F495A91C7123F485A4848
+15C0A2485A5B120F5B001FED1F80491500003F92C7FC5BA3127F90CAFCA45A5AA716F86C
+4A7EA26C14035EA26D1307003F5D6D130F001F4A5A6D133F6C6C495A6D495A2607FF0790
+C7FC6CEBFFFE6C5C6C5C6D13E0011F1380D907FCC8FC2C3A78B830>67
+D<013FB512E04914FC90B67EEEFF806D15C07F902607F00013E0EE3FF0161FEE0FF81607
+010F15FC4A1303A2160117FEA2011F14005CA5133F5CA5017FEC01FC91C7FCA3EE03F8A2
+5B49EC07F0A2160F17E0161F000116C049143FEE7F80EEFF005D4B5A00034A5A49EB1FF8
+ED7FF0007FB65AB75A5E4BC7FC15F86C14C02F387EB730>I<013FB7FC49168090B812C0
+A27F7FD903F8C7EA3F80A4177F13074A150083171E94C7FCA2130F5CED01E04B7E821507
+131F91B55AA55B9138800FE0A46F5A017F90C9FC91CAFCA417F0494A7E491403A4160712
+01495DA2003FB7FC5AB8FCA26C5E6C5E32387EB730>I<013FB7FC49168090B812C0A27F
+7FD903F8C7EA3F80A4177F13074A150083171E94C7FCA2130F5CA2ED01E04B7E4B7E131F
+02C05B91B5FCA45B5EEC800FA35E017F6D5A91CAFCA55B5BA512015BA2387FFFF0B57E80
+A25C6C5B32387DB730>I<903B7FFF801FFFE090B56C4813F003E014F8A203C014F06D49
+6C13E0903B07F00001FC00A41603130F4A5CA41607131F4A5CA4160F133F91B65AA55B91
+C7EA1FC0A4163F5B495DA4167F12014992C7FCA45E1203495CA23B7FFF801FFFE0B56C48
+7FA46C496C5B35387EB730>72 D<013FB612804915C0A46D158090260007F0C7FCA5140F
+5DA5141F5DA5143F5DA5147F92C8FCA55C5CA513015CA513035CA2003FB6FC4881B77EA2
+6C5D6C92C7FC2A3879B730>I<0203B512F04A14F8A46E14F091390001FC00A41503A25E
+A41507A25EA4150FA25EA4151FA25EA4153FA25EA4157FA293C7FC123E127F5D6D5B38FF
+00014A5A6C13079038E03FF86CB55A5D6C5C000791C8FC6C13FC38007FE02D3979B730>
+I<90387FFFF890B57EA46D5BD903F8C8FCA513075CA5130F5CA5131F5CA5133F5CA5137F
+91C9FCA4EE03C049EC07E049140FA4161F12014915C0A2007FB7FCB8FCA317806C16002B
+387DB730>76 D<D93FF8ECFFE0496C4913F0496C4913F8A2017F4A13F0013F16E0010F91
+380FFE0002DE147E02DF131FA2EE3EFE131F029FEB7EFC167C16FC16F8ED80F9013F1381
+021FEBF1F8158316E1EC0F8716C3137F017E018F5B1683159F160316079038FE07BE01FC
+01FE5B15FCA215F8160F0001EB03F09026F801E05B91C7FCA3161F1203495DA4163F1207
+4992C7FCA2D87FFC903803FFE0486C497FA46C486D5B35387EB730>I<D97FFC90383FFF
+80496C4913C06E15E0A218C06D6E13800107913803F000ECEF80A31607130F02CF5C15C0
+14C7A2160F131F02875C15E0A30283131F133F02035C15F0A3163FEB7F01017E92C7FC15
+F8A35EEBFE0049147EA315FC16FE0001147C495CA4157D0003143D495C153FEA7FFFB512
+80A2151F5E6C496C5A33387DB730>I<013FB512FC4914FF90B712C017E06D15F06D15F8
+903A03F8003FFC160FEE03FE1601A20107EC00FF5CA2177FA3010F15FE5CA2160117FC16
+03011FEC07F84A130FEE1FF0EE7FE0923801FFC091B612804915005E16F816E093C7FC02
+80C8FC137F91C9FCA55B5BA512015BA2383FFFC0487FB57EA26C5B6C5B30387EB730>80
+D<017FB57E90B612F016FC82826D1580902607F00113C09238007FE0163F161FEE0FF013
+0F4A1307A5011FEC0FE05CEE1FC0163FEE7F8016FF013F010313009138800FFE91B55A5E
+16E05E4980829138001FF815076F7E15015B5BA500011403495CA2177817FCEEF9FE0003
+16FC4914F1A2267FFF8013FBB500C0EBFFF817F0816F13E06C49EB7FC0C9EA3F002F397E
+B730>82 D<001FB712E04816F017F8A35A903A001FC007F0A4160F48133F48028013E000
+7E1507003CED03C0C791C7FCA2147F92C8FCA55C5CA513015CA513035CA513075CA5130F
+5CA20007B57E48804880A26C5C6C5C2D3877B730>84 D<903A1FFF80FFFC4901C113FE49
+01E313FFA26D01C113FE6D018013FC903A01FE003F80EE7F005E6D6C5B15014B5A91387F
+83F8158791383F8FF0EDCFE015DF021F5BEDFF80A26E90C7FC5DA26E5AA25DA3140F4A7E
+A2143F4A7EA214FE01017F4A7EEB03F882903807F03F130F02E07F90381FC01F133F0280
+7F90387F000F5B498000011407485AD83FFFEB3FFF486D481380B590B512C0A26C6E1380
+6C496C130030387DB730>88 D<1278127C12FEA27EA27EA27FA2123F7FA2121F7FA2120F
+A27FA212077FA212037FA21201A27FA212007FA27F80A2133FA280A2131F80A2130F80A2
+130780A21303A280A2130180A2130080A280A21580A2143F15C0A2141FA3140FEC07801A
+4771BE30>92 D<003FB612F05AB712F8A36C15F07E25077C7D30>95
+D<903803FF80011F13F0017F13FC90B57E4880488149C67F49133F48486D7E0003140F5B
+C65A90C77FA25EA2EC3FFF0107B5FC133F90B6FC1203485D48EBE01F381FFE00EA3FF0D8
+7FC0133F5B48C75B5AA2157FA215FF6C4990C7FCEB8007267FE07F13FE90B7FC6C16806C
+14BF6C020F130000039038F803FEC601C0C8FC292A79A830>97 D<EA3FF8487E487EA212
+7F123FEA01FCA512035BA4EC1FF00007EBFFFC01F313FF01F7148090B612C016E09138F0
+3FF048EB800F9039FE0007F85B49EB03FC4913015B121F5B16FE1500A21501003F15FC5B
+A3150316F8127F1507ED0FF0A2ED1FE06DEB3FC000FF147F6DEBFF80D9F00313009038FC
+1FFE90B55A5D485C486C13C0D8781F90C7FC380007F8273977B730>I<EC1FFC91B51280
+010314C0010F14E04914F0137F9039FFF00FF848EB8007489038000FF0D807FC13074914
+E04848EB01C0484890C7FCA2485A5B127F90C9FCA35A5AA77E6CEC0F806D131FED3FC06C
+6C14806D137FD81FF8EBFF00380FFE0390B55A6C5C00015C6C14E0013F1380D907FCC7FC
+252A77A830>I<ED07FF4B13804B13C0A281819238003F80A4167FA21700A491387FC0FF
+903803FFF0010FEBFCFE4913FE017F13FF90B6FC48EBE07F48EB001F48486D5A49130748
+481303485A5B485A495C127FA290C7FC15075A485DA4150FA25E151F6C143F7E157F6D13
+FF6C6C485BEBE007261FF81F13FF6CB71280A26C14BF0001141F6CD9FC0F1300D91FE0C8
+FC2A397AB730>I<EC1FE0ECFFFC010313FF010F1480013F14C04914E09039FFF03FF048
+EB800F3A03FE0007F8484813035B485A4848EB01FC5B123F5B127F90C7FC90B6FCA2B712
+F8A316F048C9FCA37E7EED03C06DEB07E0003FEC0FF07F6C6CEB1FE06DEB7FC0390FFE03
+FF6CB612806C15006C14FC6C6C5B011F13E0010390C7FC262A79A830>I<EEFF80030713
+E0031F13F0157F92B512F85C4AEB07F0EC07FC03F813E091390FF001C04BC7FCA2141F5D
+A548B612FE48815AA36C5DC7D87F80C7FC92C8FCA55C5CA513015CA513035CA513075CA2
+007FB512FEB7FCA46C5C2D397CB830>I<913907F801FE913A3FFF0FFF804A13BF49B712
+C05B5B90260FFC0FEB1F8090271FF007F8130049486C6CC7FCECC001EB7F801400A25B5B
+A315034B5A7F6D495A9138803FE090383FE0FF49B55A90B65A93C8FC4814FC01F913F090
+38F87F80000390CAFC5BA27F120190B512FCEDFF8016E04815F8488148813A1FF00007FF
+D83FC01300498048C86C7E007E151F12FE5AA2163F94C7FC5E5E6C4A5AD87F80EB07FC6D
+131F3A3FFC01FFF86CB612E06C5D6C92C8FC000114FC6C6C13F0010F90C9FC323E7EA730
+>I<EB3FF8497E497EA2137F133FEB01FCA513035CA4ED0FF00107EB7FFE02F1B5FC02F7
+148091B6FC17C0EDF03F499038801FE015004A130F14F8A24A131F494814C0A25CA3163F
+133F4A1480A4167F137F91C71300A45E5B495CA23B7FFFF81FFFF8B56C4813FC5DA2816C
+496C13F82E387FB730>I<15E0EC03F8140781A35D6E5A6E5A91C8FCA990B512C048805A
+A27E7EEB001F5DA5143F5DA5147F92C7FCA55C5CA513015CA2007FB61280B712C016E0A2
+16C06C1580233979B830>I<163816FE150116FFA316FEED00FC16781600A991B512F049
+14F8A47FEC000716F0A4150FA216E0A4151FA216C0A4153FA21680A4157FA21600A45DA2
+5DA414015DA414035D1407003C5C007E130FB4495A4A5A14FF90B55A92C7FC6C5B6C13F8
+6C13E000071380284E7EB830>I<EB3FF8497E80A3133FEB00FCA513015CA5010390380F
+FFFE4A487F1880A218006F5B0107010013804A4890C7FCED03FC4B5AED1FF04B5A010FEB
+7F804A48C8FCECC3FEECC7FCECCFF8ECDFFCEB1FFF814A7E4A7E02F87FECE03F49486C7E
+02807FEC000F6F7E8215034980017E13016F7E3B3FFFF80FFFF0486D487FB56C5AA26C49
+7E6C496C5B31387FB730>I<90383FFFF8497F81A37F90380001FCA514035DA514075DA5
+140F5DA5141F5DA5143F5DA5147F92C7FCA55C5CA2003FB612F04815F8B712FCA26C15F8
+6C15F026387BB730>I<913903F001F83B01FF0FFC07FE489039BFFE1FFF91B5007F1380
+93B5FC18C06C9039FC3FFE1F3B003FF81FFC0F02E013F002C013E0A2028013C09139003F
+801F491680A2017E1400A401FE49133F49017E1400A5000102FE5B4949137EA500030101
+14FE01F0495BA23C3FFE07FF03FF80486C48018713C0B5009F01CF13E0A26C010F018713
+C06C486C01031380332881A730>I<ED0FF03A01FFE07FFE4801F1B5FC4801F7148091B6
+FC6C16C06CECF03FD8000F9038801FE015004A130F14F8A24A131F494814C0A25CA3163F
+133F4A1480A4167F137F91C71300A45E5B495CA23B7FFFF81FFFF8B56C4813FC5DA2816C
+496C13F82E287FA730>I<EC1FE0ECFFFC010313FF010F14804914E0137F9039FFE07FF0
+489038800FF83903FE000749EB03FC48481301484814FE491300485A123F5B167F48C8FC
+A300FE15FEA4150116FCA26CEC03F8150716F06C6C130FED1FE06DEB3FC06C6C137F3A1F
+F001FF80D9FC0713006CB55A6C14F86C5C6C14C06C6C90C7FCEB0FF8282A79A830>I<ED
+03FE903A3FFC1FFF8090267FFE7F13E001FF90B57E91B67E6D816D9038FE07FE0101EBF0
+019238C000FF5D92C7EA7F804A143F5C13035C18C0171FA2173F010716805CA3177F1800
+130F5F4C5AA24C5A6E495A011F140F6E495A6EEB7FE09139FF83FFC092B55A94C7FCD93F
+DF5B028F13F8028313E0028090C8FC92C9FC137FA291CAFCA45BA25BA4387FFFF0B57E80
+A25C6C5B323C82A730>I<91383FE00F903A01FFF81F800107EBFE3F011F13FF4914FF5B
+9038FFF03F48EB800F48496C1300D807FC7F48487F5B485A48487F5E5B127F90C8FC1501
+5A485DA41503A25E6C1407150F6C141F7F6C6C133FEDFFF0381FF001EBFC0F6CB6FC7E6C
+14EF6CEC8FE039007FFE0FEB0FF090C7FC151F5EA5153F5EA591381FFFFE4A7F5CA2806E
+5B293C7AA730>I<EE3FE03B01FFFC01FFF848D9FE0F13FC485C037F13FE6C91B5FC6C90
+B512E1D80001EC01FC15FC9238F000704B13005D5D4990C8FC5CA25CA25C13075CA5130F
+5CA5131F5CA2007FB512FCB67EA46C5C2F287DA730>I<91387FF838903903FFFE7C011F
+EBFFFC5B5B90B6FC48EBC01F3903FC0007491303484814F85BA3ED01F06D90C7FCEA03FE
+EBFFF06CEBFF806C14F06D13FC011F13FF01071480D9007F13C0020113E0EC001F001FEC
+0FF06D1307003F1403A27FA21507486CEB0FE0151F6DEB3FC09039FC03FF8090B6FC1600
+B612FC00FC5C013F13E0267807FEC7FC262A79A830>I<EB03C0497E80A3130F5CA5003F
+B612E04815F0B7FCA36C15E026003FC0C7FC5CA5137F91C8FCA55B5BA50001EC0F8049EB
+1FC0A3153F1680157F15FF6D4813009038FF07FE6CEBFFFC5D6D5B6D5B010F1380D903FC
+C7FC243378B130>I<D83FFCEB3FFC486C497E00FF14FFA2007F147F003F143F00011401
+495CA415031203495CA415071207495CA4150F120F495CA3151F153F001F147F4B5A000F
+5BD9F80F13FF90B712807EA26C149FC6D9FE0F1300D93FF0C8FC29287AA630>I<3B3FFF
+C07FFF80486DB512C0B515E0A26C16C06C496C13803B03F00007F0006D5C150F00015D15
+1F5E153F6D91C7FC5D0000147E15FE5D140101FE5BA290387E03F0A24A5AA24A5A137F4A
+5A133F4AC8FCA2147E14FE5C131F5CA25C6D5A2B2778A630>I<3B3FFFC01FFFE0486D48
+13F0B515F8A26C16F06C496C13E0D807E0C7EA7E00A35EA34B5AA34B5A143E147F4A485A
+13E1A249495A158FEBC7EF9138CF9F8014DF13CF029F90C7FC15BFEBDF8FEC0FBEA201FE
+13FE5D13FCA25D496C5A3903E003E02D2779A630>I<903AFFFE07FFF0486D4813F84816
+FCA26C16F86C496C13F0903A07F001FC006D6C485A6D6C485A4B5A6D6C485A4B5ADA7F7F
+C7FC157EEC3FFE6E5A5D6E5A5DA24A7E143F4A7EA2ECFCFCEB01F8903803F07E903807E0
+7F49487E011F8090383F801FD97F007F01FE6D7E263FFFC0B5FC4801E11480B515C0A26C
+16806C01C014002E277DA630>I<90B53801FFFE4802837F481780A26C17006C02015B90
+3A07E0001FC05F163F6E91C7FCA20103147EA25E804B5A13014B5AA26E485AA20100495A
+A24B5AA2027E90C8FC5D153E157E157C143E5D143F5DA26E5AA25DA25DA2143F92C9FC5C
+147E14FE5C1301003C5B387E03F0EAFF07495A48485AEB7F80B5FC91CAFC13FC6C5AEA3F
+E0EA1F80313C7EA630>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmbx12 13.14 64
+/Fk 64 122 df<922607FFE0EB1FF892B5D8FC01B5FC0207DAFF071480021F039F14C091
+3D7FFE007FFFF83FE0DAFFF0011F9038E07FF00103018049018013F84990C748EB00FF49
+484A5A495A4A5D495AF27FF0017F5E4A027FEC3FE0053FEC0F80051F91C7FCADBB12E0A5
+26007FF0C7D81FFCC8FCB3B3A2007FB5D8F01FB512FEA54D4D7ECC48>11
+D<923803FFE092B512FC020714FF021F81027F9038007FC0DAFFF0EB0FE0010301C08049
+90C7EA3FF84948147F4A81494814FF495AA2137F5CA2715A715A715AEF078094C8FCA8EF
+07FCB9FCA526007FF0C7123F171FB3B3003FB5D8E00FB512F8A53D4D7ECC44>I<EA07E0
+EA1FF8487E487E7FB5FC1480A314C0A27EA27EEA1FFBEA07E3EA0003A213071480A2130F
+A214005B131E133E5BA25B485A485A1207485A485A001EC7FC120C122577CB22>39
+D<EA07E0EA1FF0487E487E7FB5FCA31480A37EA27E7EEA07E7EA0007A2130F1400A35B13
+1E133E133C137C137813F8485AA2485A485A485A48C7FC121E120C1125778F22>44
+D<B7FCAA200A7F9C29>I<EA07E0EA1FF8EA3FFCEA7FFEA2B5FCA6EA7FFEA2EA3FFCEA1F
+F8EA07E01010778F22>I<15F014011407141F147FEB03FF137FB6FCA313FC1380C7FCB3
+B3B2007FB712E0A52B4777C63D>49 D<ECFFF80107EBFF80013F14F090B612FC48814801
+01EBFF802707F8003F13C0D80FE0010F13E0D81F806D13F0003F80D87FF06D13F86D15FC
+6D7F00FF16FE6D147FA217FF82A36C5A6C5A6C5A6C5AC95A17FEA3EEFFFCA24B13F817F0
+5D17E04B13C017804B13004B5A4B5A5EED7FE04B5A4A5B4A90C7FCEC07FC4A5A4A5A4B13
+1FEC3F804AC7FC14FE4948143E495AEB07E0495A4948147E49C8FC017E15FE90B7FC4816
+FC5A5A5A5A5A5AB8FC17F8A430477AC63D>I<EC3FFE0103B512E0010F14FC013F14FF90
+267FE01F7F9026FF000713E0D801FC6D7FD803F07F486C6D7FD80FFE817F486D80167FA3
+805C16FF7E91C75B6C5A6C5AD80020495B90C75C5D5F4B5B5F031F90C7FCED3FFC4AB45A
+49B512E0168016E016FC90C7EA3FFF030713C06F7F6F7F6F7F83707E83A2701380A318C0
+EA07E0EA1FF8487E487EA2B5FCA31880A25E491600127F494A5A6C485D01E05B001F4A5B
+D80FFC495B2707FFC03F13C06C90B65AC64BC7FC013F14F8010714E09026007FFEC8FC32
+487BC63D>I<EE07E0160FA2161F163F167F16FFA25D5D5DA25D5D5DA2157D15FDEC01F9
+15F1EC03E11407EC0FC1EC1F811501143F147E14FC14F8EB01F01303EB07E014C0EB0F80
+131FEB3F00133E5B13FC485A485A5B1207485A485A90C7FC123E127E5AB912FCA5C80003
+EBE000AD023FB612FCA536487DC73D>I<D8038015E001E0140301FC143F9039FFE003FF
+91B612C017801700A25E5E16F05E5E93C7FC15FC15F001E790C8FC01E0C9FCAAEC1FFC01
+E1B512C001E714F001EF14FC9039FFE01FFFDA0007138001FC6D13C001F06D13E04915F0
+497F17F8C913FC167F17FEA417FFA3EA0FC0EA3FF0487EA2487EA317FEA34914FF6C4815
+FC5B018015F86CC74813F07F6C6C4913E0D80FF04913C0D807FC011F13806CB46CB51200
+6C90B512FC6C5D013F14C0010F91C7FC010113F030487AC63D>I<ED7FF8913807FFFE02
+1F6D7E027F80903A01FFF01FE0010790388003F04948486C7E49486D7ED93FF013074948
+130F01FF4A7E4849133F5C5A4890C7FCA25A705A48486E5A705A003F92C8FCA3485AA215
+20913807FFE0021F13FC00FF497F4A6D7EDAFC017F9026FDF0007F4A6D7ED9FFC06D7E4A
+6D7E8391C7FC8382491680A318C05BA3127FA6123FA27F001F1780A3000F4B1300A26C6C
+5DA26C6D495A6C6D5C6C6D495A6D6C48485A90263FFC075B6DB65A6D4AC7FC01035C0100
+14F0020F90C8FC32487BC63D>I<121F7F7F13FE90B812E0A45A18C0188018005F5FA25F
+485E90C8EA07E0007E4B5A5F007C151F4CC7FC167E5E485D15014B5A4B5AC8485A4B5AA2
+4BC8FC157EA25D1401A24A5A1407A24A5AA2141FA24A5AA2147FA314FFA3495BA45BA55B
+AA6D5BA26D90C9FCEB007C334B79C93D>I<EC1FFF49B512F0010714FC011F14FF90263F
+F00713C049C77F01FCEC3FF04848EC0FF848481407000782491403000F821601A2121F7F
+A27F13FE6D140302C05C14F002FC495A6C6D130FDAFF805B9238E01FE06C6E485A9238FC
+FF806C91B5C7FC6C15FC6C5D7F6D14FE6D806D15C06D81011F81017F81D9FFDF80481307
+2603FE018048486C804848133F4848010F1480003F8049130148486D6C13C0161F824848
+140382A282A2177FA218807F127FEFFF007F6C6C4A5AA2D81FFC4A5A6C6CEC0FF86C6C6C
+EB3FF06C9039F003FFE06C90B612806C6C92C7FC011F14FC010714E09026003FFEC8FC32
+487BC63D>I<EC1FFE49B512C0010F14F04914FC90397FFC0FFE903AFFE003FF804849C6
+7F48496D7E4890C7FC486F7E484881161F003F825B007F82A28300FF81A31880A518C0A4
+5E127FA3003F5D7F121F5E120F6C6C91B5FC6C90388001EF6CEBC0036C9038E00FCF6DB5
+128F011F140F010701FE1480010113F8903800010091C7FCA24C1300A3D803F85D487E48
+7E486C4A5AA25F4C5AA24C5A49495B6C485D49010790C7FC01E0495AD807F8EB3FFC6CB4
+48B45A6C90B55A6C15C06D91C8FC011F13FC010313C032487BC63D>I<EA07E0EA1FF8EA
+3FFCEA7FFEA2B5FCA6EA7FFEA2EA3FFCEA1FF8EA07E0C7FCB0EA07E0EA1FF8EA3FFCEA7F
+FEA2B5FCA6EA7FFEA2EA3FFCEA1FF8EA07E0103077AF22>I<903803FFF8013FEBFF8090
+B612E0000315F8489038007FFCD80FF0EB1FFED81FC0EB07FF48C71480D87FC015C06D7F
+486C15E07FA66C5A6C484913C06C5A0007C7481380C8FC4B13004B5AED7FF84B5A16C04A
+5B4A90C7FC15FC4A5A5D140F5D4A5AA25D4AC8FCA3143EAB143C91C9FCA9147E49B47E49
+7F497FA2497FA66D5BA26D5B6D5BD9007EC8FC2B4D79CC3A>63 D<EE01F8A24C7EA34C7E
+A24C7EA34C7FA24C7FA34C7FA293B57EA34B8016F303038016E316E103078016C0030F80
+5E83031F814C7E4B81153E83037E81037C7F03FC815D830201824B7F0203825D83020782
+4B7F020F825D84021F8392B8FC4A83A34A83027CC8120F02FC835C840101844A81010384
+5C840107844A81010F845C85011F85496C82B600C091B712F0A5544D7CCC5D>65
+D<B912F0F0FF8019F019FC19FFD8001F0180C780061F7F727F727F727F727FA2727FA219
+7F86A84F5AA2626062604E5B4E5B4E1380067F90C7FC943803FFFC92B712F0198019F019
+FC0380C7383FFF80060F7F060313F0727F727F737E86851B80851BC0A21BE0A48561A41B
+C0A2611B80611B0096B5FC4E5B4E5B060F5B067F5BBB12C097C7FC19FC19F04EC8FC4B4B
+7CCA57>I<93261FFF80EB01C00307B500F81303033F02FE13074AB7EA800F0207EEE01F
+021F903AFE007FF83F027F01E0903807FC7F91B5C73801FEFF010301FCEC007F4901F081
+4901C0150F4949814990C97E494882495A48498248197F5C48193F5C48191F5C48190FA2
+485BA21A075AA391CDFCA2B5FCAD7EA280F207C0A27EA36C7F1A0F6C1A80806C191F6E18
+006C61806C197E6C6D177C6D6C17FC6D6C4C5A6D6D4B5A6D6D4B5A6D01F0ED1FC06D01FC
+4B5A010001FF03FFC7FC6E01E0EB07FE021F01FEEB3FFC020790B612F0020116C0DA003F
+92C8FC030714F8DB001F13804A4D79CB59>I<B912F0F0FF8019F019FC19FFD8001F9026
+80000114C0DD001F7F060713F806017F726C7E737E737F737F737F8587737F8587A2747E
+A38786A21C80A51CC0A586A462A51C80A51C00A26263A2631AFF636163614F5B634F5B07
+3F90C7FC4F5A4F5A06035B061F5B4DB512C0BBC8FC19FC19F0198006F0C9FC524B7CCA5E
+>I<BB12C0A486D8000F01E0C77E18071801F0007F193F191F190F1907861903A31901A3
+EF0F80A2737EA497C7FC171FA2173F177F17FF160392B6FCA5EDE0031600177F173F171F
+A2050FEC0F80A3F21F00A494C8FC621A3EA21A7EA31AFE6219011903A21907190FF13FF8
+19FF1803183FBBFCA262A3494A7CC951>I<BBFCA41A80D8001F01C0C7FC181F18038484
+197F193F191F1AC0190FA31907A4171FF103E0A496C7FCA25FA25F5F5E160792B6FCA5ED
+C0071601828383A283A794C9FCB1B8FCA5434A7CC94D>I<93261FFF80EB01C00307B500
+F81303033F02FE13074AB7EA800F0207EEE01F021F903AFE007FF83F027F01E0903807FC
+7F91B5C73801FEFF010301FCEC007F4901F0814901C0150F4949814990C97E494882495A
+48498248197F5C48193F5C48191F5C48190FA2485BA21A075AA391CEFCA2B5FCAD7E050F
+B712C080A37E94C7001FEBC000807EA27E807E807E806C7F7E6D7E6D7E6D7F6D01E05D6D
+6D5D6D13FC010001FF4AB5FC6E01E0EB07F9021F01FFEB3FF0020791B5EAE07F0201EEC0
+1FDA003FED0007030702F81301DB001F018090C8FC524D79CB60>I<B7D8FC01B712FCA5
+D8001F01C0C8001FEBC000B3AA92B9FCA503C0C8121FB3AEB7D8FC01B712FCA5564B7BCA
+60>I<B712FEA5D8000FEBE000B3B3B3ABB712FEA5274B7DCA2E>I<B700F8027FB512F0A5
+D8001F01C0C9EBC00074C7FCF101FE4F5A4F5AF10FE04F5A4F5A4FC8FCF001FE4E5A4E5A
+F00FE04E5A4E5A4EC9FCEF01FE4D5A4D5AEF0FE04D5A4D5A4DCAFCEE01FE16034C7E4C7F
+5E4C7F93B57E03C18015C303C780DBCFE77FDBDFC37FEDFF8104017F4B6C804B7F4B6D7F
+03E0814B6D7F8385717F717F83857180727F8486727F8486727F727F84867280737F8587
+737F87B700F8010FB612FCA5564B7CCA60>75 D<B8FCA5D8001F01C0C9FCB3B3A4193EA4
+197E197CA519FCA31801A2F003F8A21807180F181F183F187FEF01FF1707173FBA12F0A5
+3F4B7BCA4A>I<B600E04DB612806F5FA26F5FA2D8001F09FCC7FC6FEF0F7FA2DABFFE17
+1EA2DA9FFF173CA3028F6D1678A202876D16F0A202836DED01E0A302816DED03C0A20280
+6DED0780A26F6CED0F00A36F6C151EA26F6C5DA26F6D5CA26F6D5CA36F6D495AA26F6D49
+5AA26F6D495AA3706C49C7FCA2706C131EA2706C5BA3706D5AA2706D5AA270EBE1E0A370
+EBF3C0A270EBFF80A27190C8FCA2715AA3715AA2715A497EB600F06D480103B71280A371
+5A715A694B7BCA74>I<B600E092B612FC8181A281D8001F6D9239001FE0006F705A82A2
+8202BF7F029F7FA2028F7F02877F02837F8214810280806F7F6F7F83816F7F6F7F6F7F83
+816F80707F707F8482707F707F707FA2707F7014807113C019E0837113F07113F87113FC
+19FE837113FF71148F7213CF1AEF847213FF8484A284848485A2858585A285858585497E
+B600F8167F1A3F1A1F1A0FA2564B7BCA60>I<EEFFF8031FEBFFC04AB612FC020715FF02
+1FD9C01F13C091277FFE000313F0902601FFF09038007FFC49496E7E490180EC0FFF4990
+C86C7F49486F7F49486F7F017F8449486F7F4849707EA24849707E4885A24849701380A2
+481AC04A82A2481AE0A34890CA6C13F0A5B519F8AE6C1AF0A26E5EA36C1AE0A26E5E6C1A
+C0A26C1A806E5E6C1A006E5E6C616E16FF6C616C6D4B5B6D6C4B5B6E5D6D6D4A5B6D6D4A
+5B01076D4A90C7FC6D01F8ECFFFE6D01FE01035B9028007FFFC01F13F0021F90B612C002
+0793C8FC020115FCDA001F14C0030101FCC9FC4D4D79CB5C>I<B912C018FCF0FF8019F0
+85D8001F902680000713FE05007F063F1380060F13C07213E01AF0841AF8A27213FCA31A
+FEA81AFCA34E13F8A21AF0601AE04E13C0063F138095B51200050713FC92B75A19E096C7
+FC18F803C0CAFCB3ABB712FCA5474B7BCA54>I<EEFFF8031FEBFFC04AB612FC020715FF
+021FD9C01F13C091277FFE000313F0902601FFF09038007FFC49496E7E490180EC0FFF49
+90C86C7F49486F7F49486F7F49486F7F01FF844849707E4A163F48854849707EA2481A80
+4A82481AC0A291CA7E481AE0A3481AF0A24983A300FF1AF8AE007F1AF0A36D5FA26C1AE0
+A36C6D4C13C0A26C1A80A26C6D4C1300EE1FC06C6DD97FF0495A923801FFFC6C6D486D49
+5A6C912607F07F5CD97FF8903AC00F80FFF0913AFC0F8007C1D93FFE010001C35BD91FFF
+DA03E75B0107018F6DB5C7FC6D01EF5D6DD9FF805C6D6C01C014F0021FD9F01F13C00207
+90B6C8FC02014B1408DA001F6E141C03019038FC7F8092C87F726C133C73137C9638FC03
+FC96B5FC1BF884A37214F0A37214E0A27214C0721480721400735A735AF10FF04E6179CB
+5C>I<B9FC18F8F0FF8019E019F8D8000F9026C0000713FE9439007FFF80061F7F727F72
+7F727F84868684A286A862A24E5BA2624E5B4E5B4E5B4E5B95B5C8FC050713FC92B712F0
+198006FCC9FC18FF9226C0003F13C0050713F0717F717F717F187F85727FA28486A786A7
+1C3E86A28474137E72157C726D13FCB700FC6D9038FE01F872EBFF8373EBFFF0071F14E0
+07031480CD383FFE00574C7CCA5C>I<DA7FFCEB01C00103B5EAC003011FECF00749ECFC
+0F90B7121F48D9E00F13BF4890C713FFD807FC141F4848804848140382484880177F485A
+173F171F12FFA2170F7FA217077F7F7F6D92C7FC6D7E6C13F014FF15F86CECFF8016F86C
+15FF6C16C0836C826C826C826C82013F816D1680010716C01300020F15E01400030714F0
+ED007F160F16037013F882177F127800F8163FA3171FA27E18F0A27EA26CEE3FE07F18C0
+01E0157F6DEDFF8001FC160001FF140302E0EB0FFED97FFEEB3FFC486CB612F0D8FC0F5D
+D8F803158048C66C49C7FC48010313F0354D79CB44>I<003FBB12C0A5DA80019038FC00
+1FD9FC001601D87FF09438007FE001C0183F49181F90C7170FA2007E1907A3007C1903A5
+00FC1AF0481901A5C894C7FCB3B3A749B812FCA54C4A7CC955>I<B700F8023FB512F8A5
+D8001F01C0C9380FE000745AB3B3AD6D180F63811A1F6D96C7FC626D7F1A7E6D7F6D606E
+6C4B5A6E6CED07F06E6C4B5A6E01C0EC3FC06E01F049B45A020101FF011F90C8FC6E91B5
+5A033F15F8030715E0030092C9FC040713F0554C7CCA5E>I<B7D8E007B791B612C0A5D8
+003F0180C7000101FCC9387F80006F7070C7FC6D70183EA26F70167E6D71177C876F1BFC
+6D715F6F831E016D656F4B6D14036D65876F92B515076D656F4A8007F3160F6E64700103
+6E141F6E04E194C8FCA27001076E5C6E04C0163E8770010F177E6E4C6C157C70011F814F
+6C15FC6E637049EDC0016E033E6D5D1CE070017E16036E037C6D5D7001FC15F04E6D1407
+6E63DCFF01EEF80F6F4A6D5DA20583EEFC1F6F4A6D92C9FC1CFE05C75F6F4A6D143E05EF
+16FF4E6E137E6F197C05FF17FC6F91C86C5BA36F496F5BA24D816F61A26F496F5BA37048
+6F5BA370486F90CAFCA24D81041F5FA27048167C7A4C7ECA7F>87
+D<B700F84AB6FCA5D8001F01F0C93803FC006F705A6D4E5A6D6D4C5A816D4E5A6D6D4C5A
+826D4EC7FC6E6D5D70157E6E5F6E7F704A5A6E4C5A6E7F704A5A6E4C5A6E7F71495A6E4C
+C8FC6F7F71137E6F5D6F7F71485A6F4A5A6F13FC71485A6F4A5A6F13FFF09F806F02BFC9
+FC7013FF60705B8260705B8260B3A7037FB612FEA5584B7ECA5D>89
+D<130C131E137E5B485A5B485A485A485AA248C7FC121E123E123C127CA21278A212F85A
+A2EAF1F8EAF7FEB5FC1480A214C0A27EA37E14807E6C13006C5AEA01F8122579CB22>96
+D<ECFFFC010FEBFFC0017F14F090B612FC489038803FFF2703FC00077F486C6D7F486C6D
+7F6E7E83707EA3707E6C90C7FC6C5A6C5AC9FCA4ED1FFF021FB5FC49B6FC130F013FEBC0
+3F9038FFFE00000313F04813C04890C7FC485A485AA2485AA2485AA4167FA26D14FF007F
+15EF6D01017F6C6C903907CFFF806C6CD90F8F13FE6C9038E07F076C9038FFFE0300014A
+7ED8003F9038F0007F0103018090C7FC37337CB13C>I<EB7FC0B5FCA512037EB3A2ED0F
+FF037F13F002C1B512FC02C714FF9126CFF80F7F9126FFC00113E092C76C7E02FC6E7E4A
+6E7E5C4A6E7E84831980A219C083A319E0AC19C0A25F1980A34D1300606E141F606E4A5A
+6E4A5A02BF4A5A91261F80035B9027FE0FF01F5B496CB548C7FC496C14F849C614E0C8D8
+0FFEC8FC3B4D7CCB44>I<91380FFF8091B512F8010314FF010F158090263FFE0013C0D9
+7FF8EB1FE0D9FFE0EB3FF04849EB7FF8484913FF4890C7FC5A5B121F5B003FED7FF0EE3F
+E0007FED1FC093C7FC5BA212FFAC127F7FA2123FA26D153E121F6D157E6C167C6C6D14FC
+6C16F86C6D13036C01F0EB07F0D97FFCEB1FE06DB4EBFFC0010F90B5120001035C010014
+F0020F13802F337CB137>I<EF1FF0EE3FFFA51600177FB3A2EC0FFF91B512E0010314F8
+010F14FE013FEB01FF903A7FF8003FFFD9FFE0130F48497F48497F4890C77E4881485AA2
+485AA3127F5BA212FFAC127FA37F123FA2121F7F000F5D6C6C5C5E6C6D5B6C01E0497F6C
+6D017FEBFFE090393FFE03FE6DB512F801075C010114C09027001FFC00EBC0003B4D7CCB
+44>I<EC0FFF91B512F0010314FC010F14FF90263FFE077F90267FF0007F4948EB3FE048
+01806D7E48824890C76C7E4848140783485A003F6F7EA3485A701380A312FFA290B8FCA4
+01F8CAFCA5127FA27FA2123FA26C6CED0F80A2000F161F6C6C16006E5C6C6D147E6C6D5C
+6C6D495AD97FFCEB07F0903A1FFF803FE06D90B55A010392C7FCD9007F13FC020713C031
+337DB138>I<ED7FE0913807FFFC021F7F027F7F902601FFE0138049018113C0902607FE
+0113E049485A14F8131FEB3FF0A26F13C0EB7FE06F1380EE3E0093C7FCADB77EA526007F
+F0C8FCB3B3A2003FB512F8A52B4D7DCC26>I<DA7FFCEB0FF00103B538807FF8011F9138
+F1FFFC4991B512FE90267FF01F13F32701FFC007138348EB0001A248486DEBC1FC000FEE
+E0F849027F1300A2001F82A8000F5EA26D14FF00075E6C6C495BA26CD9C00790C7FC6C90
+38F01FFC4890B55A5ED803C314809026C07FFCC8FC000790CAFCA47FA27F13FC90B612FC
+EEFFC06C16F817FE6C8218806C17C06D16E00003B812F0120FD81FFCC7000F13F8D83FF0
+140049153F4848ED1FFC00FF160F491507A56D150F007F17F86D151F6C6CED3FF06C6CED
+7FE0D80FFE913801FFC06C6C6C010713806C01F8017F1300C690B612FC013F15F0010715
+80D9003F01F0C7FC37487DB03D>I<EB7FC0B5FCA512037EB3A2923801FFC0030F13F803
+3F13FE4B7F9126C1FE077F9126C3F0037F9138C7C001DACF8080150002DE7F02FC81A25C
+A25CA35CB3A9B6D8C07FEBFFE0A53B4C7BCB44>I<13FCEA03FF487F487FA2487FA66C5B
+A26C5B6C90C7FCEA00FC90C8FCACEB7FC0B5FCA512037EB3B3B61280A5194D7BCC22>I<
+EB7FC0B5FCA512037EB3A393383FFFFEA5040390C7FC17FCEE0FF04C5A4C5A4C5A04FEC8
+FCED03FC4B5A4B5AED1FC0ED7F804BC9FC14C102C37F14CF02DF7F91B57E825C4A6C7E02
+F87F4A6C7E9138C01FFF81836F7F6F7F816F7F83707E163F707E83707F707F84B6D8803F
+EBFF80A5394C7CCB41>107 D<EB7FC0B5FCA512037EB3B3B3AAB61280A5194C7BCB22>I<
+90287FC001FFE0EC7FF8B5010F01FC0103B5FC033F6D010F804B6D6C4814E0DBFE079026
+C03F817F9126C3F0019138FC007F0003D9C7E0DAE1F8806CDA8000D9F1E06D7E02CFC7EB
+F3C002DE91267FF780131F02FC03FFC77FA24A5DA24A5DA34A5DB3A9B6D8C03FB5D8F00F
+B512FCA55E317BB067>I<903A7FC001FFC0B5010F13F8033F13FE4B7F9126C1FE077F91
+26C3F0037F00039038C7C0016CD9CF8080150002DE7F02FC81A25CA25CA35CB3A9B6D8C0
+7FEBFFE0A53B317BB044>I<913807FF80027F13F80103B6FC010F15C090261FFE017F90
+3A7FF0003FF8D9FFC0EB0FFC48496D7E4890C76C7E4817804980000F17C048486E13E0A2
+003F17F049157FA2007F17F8A400FF17FCAB007F17F8A36C6CEDFFF0A3001F17E06D5C00
+0F17C06C6C4A13806C17006C6D495A6C01E0EB1FFC6D6C495A903A3FFE01FFF0010FB612
+C0010392C7FCD9007F13F80207138036337DB13D>I<90397FC00FFFB5017F13F002C1B5
+12FC02C714FF9126CFF80F7F9126FFC00313E0000391C77F6C01FC6E7E4A6E7E5C4A6E7E
+848319808319C0A47113E0AC4D13C0A319805FA219004D5A804D5A6E4A5A6E4A5A02FF49
+5BDB80075B9126EFF01F5B02E7B548C7FC02E314F802E014E0DB0FFEC8FC92CAFCAFB612
+C0A53B467CB044>I<DA0FFE14F091B5EAC0010103ECF003010F14F8013F903801FC0790
+3A7FFC007E0FD9FFF0131F4849EB0F9F4849EB07FF485B4890C77E82485A003F81A25B00
+7F167FA3485AAC6C7EA4123F6D15FF121F6D5C6C5D6C7F5E6C6D5B6C6D133F6C01F813FE
+90393FFE03FC6DB55A010714E00100148091381FFC0091C8FCAF047FEBFFE0A53B467CB0
+41>I<9039FF803FE0B5EBFFF8028113FE02837FDA87E11380EC8F830003D99F0713C06C
+139E14BCA214F8A24A6C13806F13004A6C5A93C7FCA45CB3A7B612E0A52A317CB032>I<
+90390FFF8070017FEBF1F048B6FC1207380FFC01391FE0003F4848130F491307127F90C7
+12035A1501A27FA213E06D90C7FC13FE387FFFF0ECFFC015F06C14FC6C14FF6C15806C15
+C06C15E0C615F0013F14F8010714FCEB007F14019138003FFE150F0078140700F81403A2
+6C1401A37E16FC6C14036D14F87F6DEB07F001F8EB1FE001FFEBFFC091B51280D8FC7F14
+00D8F81F13FCD8E00313C027337CB130>I<14F8A61301A41303A21307A2130FA2131F13
+3F137F13FF1203000F90B512F0B7FCA426007FF8C7FCB3A6167CAA013F14F880A290391F
+FE01F0010F1303903907FF87E06DEBFFC06D14806D6C1300EC0FFC26467EC430>I<D97F
+E0EC3FF0B5EC7FFFA5000315016C81B3AB5EA25EA25E7E6EEB0F7F017F021E7F6E017CEB
+FFE090393FFE01F86DB512F0010714E0010114C09027003FFE00EBC0003B327BB044>I<
+B66C90B512C0A5000101E0C73807F0006E5D6C5F6E140F017F5E80171F013F93C7FC6E5C
+011F153E6E147E6D157C6F13FC6D5DEDC001A26D01E05B16036D5DEDF0076D5DEDF80F02
+7F5CEDFC1F023F91C8FC15FE5E021F133EEDFF7E6E137C16FC6E5BA26E5BA36E5BA26E5B
+A26F5AA26FC9FCA23A317DAF41>I<B60081B500FC90387FFFF0A500019026E000030180
+903803FC006E715A6C6F5E6E6F1303017F61A26E496D1307013F616E6F130F011F4A5EA2
+6E6F131F6D4A93C7FCDD9FFC5B6DD9801F153E170F03C06E137E6D023F157C93383E07FF
+DBE07E15FC6DDA7C035C03F015816D02FC5D4C7E03F815C3DA7FF95E9226FDF00013E7DA
+3FFF5E4C137F19FF6E5F4C7FA26E496D90C8FCA26E5E93C7120FA26E486E5AA202015E4B
+1403A26E486E5A54317EAF59>I<B6D88007B512C0A526007FFCC7387F8000013F037EC7
+FC6E14FE6D6C495A6D6D485A6D6D485A6D01E05B4C5A6D6D485A6DEBF83F6E6C48C8FC91
+383FFEFE6E6C5A5E6E5B6E5B806E7FA26E7F82824A7F5C4A80DA0FE77FDA1FC37FDA3F81
+7F4AC67F147E4A6D7E49486D7E01036E7E49486D7F49487F49488149486D7F017F6E7FB5
+00F8011FEBFFF0A53C307EAF41>I<007FB500C090387FFFE0A5C601F0C73803F8006E5D
+017F5E6E1407013F5E6E140F011F5E6E141FA26D6D91C7FC5F6D153E6F137E6D157C6F13
+FC6D5DEDF0016D5DEDF803027F5C15FC1607DA3FFE5B160F021F5CEDFF1F6E91C8FC16BF
+6E13BE16FE6E5BA36E5BA26E5BA26F5AA26F5AA26F5AA393C9FC5D153E157E157CD81F80
+13FC486C5B387FE001D8FFF05B14035D14074A5A49485A007F49CAFCEBC07E383F81FC6C
+B45A6C5B6C13C0C648CBFC3B467EAF41>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmcsc10 10.95 23
+/Fl 23 121 df<B6FCA618067E9622>45 D<166016F01501A216E01503A216C01507A216
+80150FA2ED1F00A2151E153EA2153C157CA25DA25D1401A25D1403A25D1407A24A5AA292
+C7FC5CA2141E143EA25CA2147814F8A25C1301A25C1303A2495AA25C130FA291C8FC5BA2
+133EA2133C137CA2137813F8A25B1201A2485AA25B1207A25B120FA248C9FCA2121E123E
+A2123C127CA2127812F8A25A1260245B7AC332>47 D<EB07FC90383FFF8090B512E03903
+F01FF83907C007FC390F0001FE001E6D7E001C1580003CEC7FC05AED3FE01270B4FC6DEB
+1FF07FA56C5A6CC7FC120CC813E0153FA216C0157F168015FF16004A5A5D4A5A4A5A5D4A
+5A4A5A4AC7FC147E147C5C495A495A495A495A49C71270133E133C5B4914E0485A485A48
+5A48C7120148B6FCA25A4815C0B7FCA3243D7ABC32>50 D<EC01E0A24A7EA34A7EA34A7E
+A24A7E141CA2EC3CFFEC387FA24A6C7EA34A6C7EA2010180ECC00FA249486C7EA349486C
+7EA24980010E1301010FB5FC4980A2011CC7FC49147FA20178810170143FA201F0814914
+1F1201486C811207486CEC3FF8D8FFFE49B512C0A332317DB038>97
+D<B612FEEDFFC016F03A03FC0007F86C48EB01FE1500167F1780163F17C0A61780167F17
+0016FE4B5AED07F0ED7FE090B6128016F09039F80001FC6F7EEE7F80163FEE1FC017E016
+0F17F0A617E0161FA2EE3FC0EE7F80923801FF00486CEB07FEB712F85E93C7FC2C2F7CAE
+35>I<DA0FF81330DA7FFF13700103B5EAC0F090390FFC03F190391FE000F9D97F80133F
+01FEC7121F4848140F48481407485A000F1503491401121F491400123F5B127F1770A248
+C9FC1700AA6C6C1570A3123F6D15F0121F6D15E0000F15016D15C0000715036C6C15806C
+6C14076C6CEC0F00D97F80133ED91FE05B90390FFC03F00103B55AD9007F1380DA0FF8C7
+FC2C317BAF36>I<B612FCEDFFC016F03A03FE000FF86C48EB01FEED007FEE3F80EE1FC0
+EE0FE0EE07F0160317F8160117FCA2EE00FEA417FFAA17FEA3EE01FCA3EE03F817F01607
+EE0FE017C0EE3F80EE7F00ED01FE486CEB0FFCB712F016C04BC7FC302F7CAE39>I<B8FC
+A33903FE00016C489038003F80161F160F1607A21603A317C0ED1C01A393C7FCA2153CA2
+15FC90B5FCA3EBFC00153CA2151CA21770A392C712E0A41601A2EE03C0A21607160F161F
+486C14FFB81280A32C2F7CAE33>I<B712FEA33903FE00036C48EB007F828282A282A3EE
+0380A21538A293C7FCA31578A2EC01F890B5FCA3EBFC01EC0078A21538A592C8FCAA487E
+B512FCA3292F7CAE31>I<DA0FF81360DAFFFE13E00103EBFF8190390FF807E390393FC0
+00F34948137F01FEC7123F4848141F4848140F48481407120F491403485A003F1501A25B
+007F1500A348C9FC1700A8031FB5FCA26C7E9238001FF0EE0FE0123F7FA26C7E120F7F12
+076C7E6C7E6C6C141FD97F80133FD93FE0137B90390FFC03F10103B512E00100EC8060DA
+0FFCC7FC30317BAF3A>I<B5D8F81FB5FCA3D803FEC7EA7FC06C48EC3F80B190B7FCA301
+FCC7123FB3486CEC7FC0B5D8F81FB5FCA3302F7CAE38>I<B512F8A33803FE006C5AB3B3
+A3487EB512F8A3152F7DAE1B>I<90383FFFFCA39038007FC0EC3F80B3AD1218127EB4FC
+A3EC7F005A007C137E007813FE383C01F8381F03F03807FFC0C648C7FC1E307CAE27>I<
+B512FCA3D803FEC8FC6C5AB3A7160EA4161CA4163CA2167C16FC1501ED03F8486C131FB7
+FCA3272F7CAE2F>108 D<D8FFFE923807FFF0A3D803FF92380FFC006C5FD9DF80141DA3
+D9CFC01439A2D9C7E01471A3D9C3F014E1A2D9C1F8EB01C1A3D9C0FCEB0381A2027EEB07
+01A36E130EA291381F801CA391380FC038A2913807E070A3913803F0E0A3913801F9C0A2
+913800FF80A3486CEB7F00487E486C013E497EB5008091B512F0A2151C3C2F7CAE44>I<
+D8FFFC49B5FC7F7F00019138001FF06EEB0FE06EEB07C0EE0380EBDFE0EBCFF013C780EB
+C3FC13C180EBC0FF801580EC3FC0EC1FE0A2EC0FF0EC07F8A2EC03FCEC01FE140015FFED
+7F83153F16C3ED1FE3ED0FF3A2ED07FBED03FFA28181A2167F163F486C141F487E486C14
+0FB56C1307A21603302F7CAE38>I<EC1FF891B5FC903907F00FE090390FC003F0013FC7
+12FC017E147E49804848EC1F804848EC0FC04848EC07E0000F16F0491403001F16F84914
+01003F16FCA2007F16FE90C9FCA34816FFAA6C6CEC01FEA3003F16FCA26D1403001F16F8
+6C6CEC07F0A26C6CEC0FE0000316C06C6CEC1F806C6CEC3F00017E147E6D5C90390FC003
+F0903907F00FE00100B5C7FCEC1FF830317BAF3A>I<B612FCEDFF8016E03A03FE000FF8
+6C48EB03FCED00FE167FA2EE3F80A217C0A61780A2EE7F00A216FEED03F8ED0FF090B612
+C093C7FC01FCC9FCB2487EB512F8A32A2F7CAE33>I<B612E015FE6F7E3A03FE003FE06C
+48EB07F8ED01FC6F7EA2828283A594C7FC5E5E4B5A4B5A4B5AED3FC090B500FEC8FC5D90
+38FC007FED1F806F7E826F7EA26F7EA582A4EF01C016FEA21501486CED0380B538F800FF
+93383F8700EE1FFEC9EA03F832307CAE37>114 D<90383FC00C9038FFF81C0003EBFE3C
+390FE03FFC381F8007EB0003003E1301481300157C5A153CA36C141CA27E6C14006C7E13
+E013FE383FFFE06C13FE6CEBFF806C14E0000114F06C6C13F8010F13FC1300EC07FE1401
+1400157F153F12E0151FA37EA2151E6C143E6C143C6C147C6C14F89038C001F039FBF807
+E000F1B512C0D8E07F130038C007FC20317BAF2A>I<007FB712F8A39039801FF0073A7E
+000FE00000781678A20070163800F0163CA348161CA5C71500B3A8EC3FF8011FB512F0A3
+2E2E7CAD36>I<B5D8F801B5FCA3D803FEC7EA1FF06C48EC0FE0EE07C0EE0380B3AB1607
+6C6C1500A2017E5C017F141E6D141C6D6C133C6D6C5B6D6C485A903903FC07E00100B512
+80DA3FFEC7FCEC07F830307CAE38>I<3B7FFFF001FFFEA30003D9C00013E0C649EB7F80
+017F027EC7FC167C6D6C13786D6C5B6D6C5B15016D6C485AD903FC5B15076D6C48C8FC90
+3800FF1EEC7F9C15BCEC3FF86E5AA2140F6E7E14034A7E4A7EEC1EFF141C91383C7F804A
+6C7E14709138F01FE049486C7E49486C7E148001076D7E49486C7E130E011E6D7E496E7E
+017C6E7E13FC000382D80FFEEC7FF8B549B512C0A3322F7DAE38>120
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmti10 10.95 18
+/Fm 18 121 df<933807FF80043F13E09338FE00F8DB01F0133EDB07E0130E4B48131F4C
+137F031F14FF4BC7FCA218FE157E1878180015FE5DA31401A25DA414030103B712F0A218
+E0903A0003F000070207140F4B14C0A3171F020F15805DA2173F1800141F5D5F177EA214
+3F92C712FE5FA34A1301027EECF81CA3160302FEECF03C4A1538A21878187013014A0101
+13F018E0933800F1C0EF7F804948EC1F0094C7FCA35C1307A2001E5B127F130F00FF5BA2
+49CAFC12FEEAF81EEA703CEA7878EA1FF0EA07C0385383BF33>12
+D<120FEA3FC0127FA212FFA31380EA7F00123C0A0A77891C>46 D<147E49B47E903907C1
+C38090391F80EFC090383F00FF017E137F4914804848133F485AA248481400120F5B001F
+5C157E485AA215FE007F5C90C7FCA21401485C5AA21403EDF0385AA21407EDE078020F13
+70127C021F13F0007E013F13E0003E137FECF3E1261F01E313C03A0F8781E3803A03FF00
+FF00D800FC133E252977A72E>97 D<EC1FC0ECFFF0903803F03C903807C01E90381F800E
+90383F000F017E133F4913FF485A485A000714FE5B000F14FC48481300A2485AA3127F90
+C8FCA35A5AA6481403007E1407150F151E003E143C15786C14F0EC03E0390F800F803903
+E07E003801FFF838003FC0202977A72A>99 D<EE3F80ED1FFF1700A2ED007FA2167EA216
+FEA25EA21501A25EA21503A25EA21507A25E147E903801FF8F903807C1CF90391F80EFC0
+90383F00FF017E137F5B48486D5A485AA2485A000F92C7FC5B001F5CA24848137EA215FE
+127F90C75AA214015A485CA2140316384814F0A21407167891380FE070127C021F13F000
+7E013F5B003E137FECF3E1261F01E35B3A0F8781E3802703FF00FFC7FCD800FC133E2940
+77BE2E>I<EC3F80903801FFE0903807E0F890381F803CEB3E0001FC131E485A485A1207
+4848133E49133C121F4848137C15F8EC03F0397F000FE0ECFF809038FFFC00B512C048C8
+FCA45AA61506150E151E007C143C15786C14F0EC01E06CEB07C0390F801F003807C0FC38
+01FFF038007F801F2976A72A>I<EC03F0EC0FFC91383E0E1C9138FC077E903901F003FE
+1303903807E001D90FC013FCEB1F80A2EB3F004914F8137E01FE1303A2484814F0A21507
+12034914E0A2150F12074914C0A2151FA216805B153F1203ED7F006D5BA200015B000049
+5A9038F80F7E90387C1EFEEB1FF8903807E0FC90C7FC1401A25DA21403A25D001C130700
+7F5C48130F5D4A5A4AC7FC48137E00F85B387C03F0381FFFC0D803FEC8FC273B7CA72A>
+103 D<1478EB01FCA21303A314F8EB00E01400AD137C48B4FC38038F80EA0707000E13C0
+121E121CEA3C0F1238A2EA781F00701380A2EAF03F140012005B137E13FE5BA212015BA2
+12035B1438120713E0000F1378EBC070A214F0EB80E0A2EB81C01383148038078700EA03
+FEEA00F8163E79BC1C>105 D<EB07F0EA03FF14E0A2EA000FA214C0A2131FA21480A213
+3FA21400A25BA2137EA213FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA212
+1FA25BA2123FA290C7FCA25A1307127EA2EAFE0F130E12FCA2131E131CA2EA7C381378EA
+3C70EA1FE0EA0780144079BE17>108 D<D801F0D93F80137F3D07FC01FFE003FFC03D0F
+3E07C1F80F83F03D0E1F0F00FC1E01F8001E011C90387C3800001C49D97E707F003C01F0
+5C0038157F4A5C26783FC05C12704A91C7FC91C7127E00F003FE1301494A5CEA007EA203
+01140301FE5F495CA203031407000160495C180F03075D0003051F13E0494A1480A2030F
+EC3F810007F001C0495CA2031F91383E0380120F494AEC0700A2033F150E001FEF1E1C49
+91C7EA0FF80007C7000EEC03E0432979A74A>I<D801F0EB3F803A07FC01FFE03A0F3E07
+C1F83A0E1F0F00FC001E011C137C001C49137E003C13F012385C38783FC012705C91C7FC
+00F015FE495CEA007EA2150101FE5C5BA2150300015D5B15075E0003020F13704914C0A2
+031F13F00007ED80E05B1681EE01C0120F49EC0380A2EE0700001FEC0F0E49EB07FC0007
+C7EA01F02C2979A733>I<EC1FC0ECFFF8903803F07C90380FC01FEB1F8090393F000F80
+017E14C0491307484814E0485A12075B000F15F0485AA2485AA2ED0FE0127F90C7FCA215
+1F4815C05AA2ED3F80A2ED7F00A248147E007C5C007E13015D4A5A003E495A6C495A4A5A
+260F803EC7FC3807C0FC3801FFF038003F80242977A72E>I<903903E001F890390FF807
+FE903A1E7C1E0F80903A1C3E3C07C0013C137801389038E003E0EB783F017001C013F0ED
+80019038F07F0001E015F8147E1603000113FEA2C75AA20101140717F05CA20103140F17
+E05CA20107EC1FC0A24A1480163F010F15005E167E5E131F4B5A6E485A4B5A90393FB80F
+80DA9C1FC7FCEC0FFCEC03E049C9FCA2137EA213FEA25BA21201A25BA21203A2387FFFE0
+B5FCA22D3A80A72E>I<D801F013FC3A07FC07FF803A0F3E0F03C0260E1F1C13E0001EEB
+380F001C1370003CEBE01F123814C0D8783F14C00070903880070092C7FC91C8FC12F05B
+EA007EA313FE5BA312015BA312035BA312075BA3120F5BA3121F5B0007C9FC232979A726
+>114 D<EC7F80903801FFE0903807C0F890381F003C013E131C013C131E017C133E4913
+7E15FEA2000114FCA215706D13007FEBFFC014FC6C13FF15806D13C06D13E0010F13F013
+00140F14071403120C123F387F80011403D8FF0013E0A300FCEB07C000F0EB0F80127000
+78EB1F006C133C381F01F83807FFE0C690C7FC1F297AA725>I<EB01C0EB03F01307A25C
+A2130FA25CA2131FA25CA2133FA291C7FCA2007FB51280B6FC1500D8007EC7FC13FEA25B
+A21201A25BA21203A25BA21207A25BA2120FA25BA2121F141C1380A2003F133C1438EB00
+78147014F05C495AEA1F03495A6C48C7FCEA07FCEA01F0193A78B81E>I<017CEB01C048
+B4EB07F038038F80EA0707000E01C013F8121E001C1403EA3C0F0038EC01F0A2D8781F13
+0000705BA2EAF03F91C712E012005B017E130116C013FE5B1503000115805BA2ED070012
+03495B150EA25DA25D1578000114706D5B0000495A6D485AD97E0FC7FCEB1FFEEB03F025
+2979A72A>118 D<903903F001F890390FFC07FE90393C1E0E0F9026780F1C138001F0EB
+B83FD801E013F89039C007F07FEA0380000714E0D9000F140048151C000E4AC7FCA2001E
+131FA2C75BA2143F92C8FCA35C147EA314FE4A131CA30101143C001E1538003F491378D8
+7F811470018314F000FF5D9039077801C039FE0F7C033A7C0E3C078027783C1E1EC7FC39
+1FF80FFC3907E003F029297CA72A>120 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmbxti10 14.4 1
+/Fn 1 47 df<13FCEA03FF000F13804813C05AA25AA2B5FCA31480A214006C5A6C5A6C5A
+EA0FE0121271912B>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fo cmbx12 17.28 52
+/Fo 52 122 df<94267FFF80903801FFE0043FB500F0013F13FC4BB6D8FC01B57E030FDB
+FF0FECFF80037F04BF15C04AB5D8E00390B5008113E04A01FCC76CEBFC03020F01F091B5
+D8F00713F04A01C04914E04A90C7484A4813F84A4817804A485C49491700495B62495B76
+13F04970496D13E04B7213C0726F138072EE3E009AC7FCB0BD12FEA6D8000F01E0C849C9
+FCB3B3B0003FB6D8F803B712E0A665657DE45E>11 D<94387FFF80041FB512F04BB612FC
+030F81037F6F7E4AB5D8E0077F4A49C76C7E020F01F0EC1FF04A01C0147F4A90C8487E4A
+485C4A484A7F49495C495BA2495B4E7F49705B5DA3725B725B725B735A96C9FCAB0503B5
+12FEBBFCA6D8000F01E0C7120184B3B3AF003FB6D8F803B71280A651657DE45A>I<ED0F
+FF4AB512F8020F14FF023F15C091B712F049D9FC037F0107D9F00013FE4901C0EB3FFF49
+90C7000F7F49486E7F017F8349486E7F4A80488448496E7FA248844A157F4884A3481980
+A34819C04A81A34819E0A7B518F0B3A86C19E0A76C19C0A26E5DA26C1980A36C1900A36C
+6D4B5AA26C60A26C6D4A5B6C606E5C6D6C4A5B6D6C4A5B6D6D495B6D6D4990C7FC6D01F0
+EBFFFE6DD9FC035B010090B612F0023F15C0020F92C8FC020114F8DA001F138044607ADD
+51>48 D<16F04B7E1507151F153FEC01FF1407147F010FB5FCB7FCA41487EBF007C7FCB3
+B3B3B3007FB91280A6395E74DD51>I<913801FFF8021FEBFFC091B612F8010315FF010F
+16C0013F8290267FFC0114F89027FFE0003F7F4890C7000F7F48486E7FD807F86E148048
+486E14C048486E14E048486F13F001FC17F8486C816D17FC6E80B56C16FE8380A219FFA2
+83A36C5BA26C5B6C90C8FCD807FC5DEA01F0CA14FEA34D13FCA219F85F19F04D13E0A294
+B512C019804C14004C5B604C5B4C5B604C13804C90C7FC4C5A4C5A4B13F05F4B13804B90
+C8FC4B5AED1FF84B5A4B5A4B48143F4A5B4A48C8FC4A5A4A48157E4A5A4A5AEC7F8092C9
+FC02FE16FE495A495A4948ED01FCD90FC0150749B8FC5B5B90B9FC5A4818F85A5A5A5A5A
+BAFCA219F0A4405E78DD51>I<92B5FC020F14F8023F14FF49B712C04916F0010FD9C01F
+13FC90271FFC00077FD93FE001017F49486D8049C86C7F484883486C6F7F14C0486D826E
+806E82487FA4805CA36C5E4A5E6C5B6C5B6C495E011FC85A90C95CA294B55A614C91C7FC
+604C5B4C5B4C5B4C5B047F138092260FFFFEC8FC020FB512F817E094C9FC17F817FF91C7
+003F13E0040713F8040113FE707F717F7113E085717FA2717F85A285831A80A31AC0EA03
+FCEA0FFF487F487F487FA2B57EA31A80A34D14005C7E4A5E5F6C495E49C8485BD81FF85F
+000F5ED807FE92B55A6C6C6C4914806C01F0010791C7FC6C9026FF803F5B6D90B65A011F
+16F0010716C001014BC8FCD9001F14F0020149C9FC426079DD51>I<F01F804E7E187F18
+FFA25F5F5F5FA25F5F5FA294B5FC5E5E5EA25E5EEE3FBFEE7F3FA216FEED01FCED03F8ED
+07F0A2ED0FE0ED1FC0ED3F8016005D15FE4A5A4A5AA24A5A4A5A4A5A4A5AA24AC7FC14FE
+495A5C1303495A495A495A5C133F49C8FC13FE485AA2485A485A485A5B121F485A48C9FC
+12FEBCFCA6CA6CEBC000B1037FB8FCA6485E7CDD51>I<01C0EE01C0D801F8160F01FF16
+7F02F0EC07FFDAFF8090B5FC92B7128019006060606060606095C7FC17FC5F17E0178004
+FCC8FC16E09026FC3FFCC9FC91CBFCADED3FFE0203B512F0020F14FE023F6E7E91B712E0
+01FDD9E00F7F9027FFFE00037F02F801007F02E06EB4FC02806E138091C8FC496F13C049
+17E07113F0EA00F090C914F8A219FC83A219FEA419FFA3EA03F0EA0FFC487E487E487FA2
+B57EA319FEA35C4D13FC6C90C8FC5B4917F8EA3FF001804B13F06D17E0001F5E6C6C17C0
+6D4B1380D807FC92B512006C6C4A5B6C6C6C01075B6C01E0011F5BD97FFE90B55A6DB712
+C0010F93C7FC6D15FC010115F0D9003F1480020301F0C8FC406078DD51>I<EE1FFF0303
+B512E0031F14F892B612FE0203814AD9FC037F021F9039C0007FC04A90C7EA1FE0DAFFFC
+6E7E494914074949EC7FF8494914FF49495B4949497F4990C7FC495D5C13FF485BA25A4A
+6E5B5A715B48496E5B725A4894C8FCA35AA35C48913801FFE0030F13FE033F6D7E4B14E0
+92B612F89126E1FE037FB53AE3F0007FFEDAE7E06D7EDAEFC06D7F4B6D7F02FFC76C7F4A
+82717F4A82A2854A8085A24A1780A54A17C0A37EA77EA47E6E1780A27EA21A007E4D5B7E
+6E5E7E6E5E6C4C5B6D7E013F4B5B6D6C4A5B6D01C0495B6D6D90B5C7FC6DD9FC0713FC6D
+90B65A6D5E023F15C0020F92C8FC020114F8DA001F1380426079DD51>I<EA07E0120F7F
+13FCEBFFFC91B912F8A45AA21AF01AE01AC01A801A00A248606161616101E0C9123F0180
+4C5A48CA485A4D90C7FC60007E4C5A17074D5A4D5A4D5A485F4D5A17FF4C90C8FCC9485A
+5F4C5A160F4C5A5F163F4C5A16FF5F5D94C9FC5D5D5E150FA24B5AA2153FA24B5AA215FF
+A34A5BA25CA35CA44A5BA45CA65CAD6E5BA26E5BDA03FECAFC6E5A456377E051>I<9238
+3FFF800203B512FC021FECFF80027F15E049B712F849D9F0077F010F90C76C7ED91FFCEC
+1FFFD93FF06E7F494802037F494882717F484980854890C9127FA24884183FA25A80A380
+806E157F6E5E14FE6E7E6F4A5A6C14F003FC495B03FF495B6C1580DCE0075B6CDBF80F90
+C7FC9338FE1FFE6C9238FF7FF84D5A6D16C06D5E6D4BC8FC6D6F7E6D16E00101826D16FC
+023F814A8149B87E010783498390263FFE3F8190267FFC0F819026FFF003814849C6FC48
+496D804849131F4890C7000780160148486E1580003F163F49150F007F7014C049150171
+7E8400FF835B8484A384A21A80A27F007F1900607F003F606D160F001F606D4C5A6C6D15
+3F6C6D4B5A6C01F04B5A6C01FC02035B6C01FF021F5B6D9027F001FFFEC7FC6D90B65A01
+0F16F001035E010093C8FC020F14F8DA007F90C9FC426079DD51>I<ED3FFF0207B512F0
+023F14FC91B7FC010316C049D9F8077F49D9C00113F8013F496C6C7E4948C76C7E49486E
+7E4884484980717F4849825A48707F855A5C855A8583A2B583A41A80A71AC0A35F7EA46C
+5EA27E6E5C7EA26C5E6C7F6C5E6C6D147D6D6C14FD6D6CEB01F96D90388003F16D9038F0
+1FE16D90B500C11480010115816D6C1401021F13FC020113E091C8FC1A00A25FA261A3D9
+FF805E487F486D4A5B487FA2486D5E5F61615F614A4A90C7FC4D5A6C5B4A4A5A4A01035B
+D803FCC7485B6C6C021F13C0D9FFC0017F5B6CD9F803B5C8FC6DB612FC6D5D010F15E001
+0392C9FC010014F8020F1380426079DD51>I<F00FE04E7EA24E7EA34E7EA24E7EA34D7F
+A24D80A24D80A34D80A24D80A34D80A2DD7FBF7FA2181F05FF8017FE04016D7FA24D7E04
+038217F804076D80A24D7E040F8217E0041F6D80A24D7F043F825F047F6E7FA294C77E4C
+825E03016F7FA24C800303845E03076F80A24C80030F845E031F6F80A24C81033F845E03
+7F707F93B9FCA292BA7EA24A85A203FCC912070203865D020771805D86020F864B82021F
+865D87023F864B83027F8692CBFC874A864A840101875C496C728090381FFFC0B700E092
+B812FEA66F647BE37A>65 D<BB12F0F2FF801BF81BFEF3FFC088D800010280C7000114F8
+DF003F7F080F13FF74807480867480757FA2757FA28987A289A965A26365A2515BA298B5
+5A505C505C5091C7FC505B505B087F13F00703B512C096B6C8FC93B812F81BC01BF8F3FF
+801CE00480C8001F13F8080713FE08016D7E7480757F757F757F89757F89871E80871EC0
+A41EE087A663A21EC0A3631E80A2511400A2515B515B6398B55A505C08075C081F5C97B6
+C7FCBD5A1CF81CE099C8FC1BF898C9FC63627AE173>I<4DB5ED03C0057F02F014070407
+B600FE140F047FDBFFC0131F4BB800F0133F030F05FC137F033F9127F8007FFE13FF92B6
+C73807FF814A02F0020113C3020702C09138007FE74A91C9001FB5FC023F01FC16074A01
+F08291B54882490280824991CB7E49498449498449498449865D49498490B5FC484A84A2
+484A84A24891CD127FA25A4A1A3F5AA348491A1FA44899C7FCA25CA3B5FCB07EA380A27E
+A2F50FC0A26C7FA37E6E1A1F6C1D80A26C801D3F6C6E1A00A26C6E616D1BFE6D7F6F4E5A
+7F6D6D4E5A6D6D4E5A6D6D4E5A6D6E171F6D02E04D5A6E6DEFFF806E01FC4C90C7FC020F
+01FFEE07FE6E02C0ED1FF8020102F8ED7FF06E02FF913803FFE0033F02F8013F1380030F
+91B648C8FC030117F86F6C16E004071680DC007F02F8C9FC050191CAFC626677E375>I<
+BB12E0F2FF801BF01BFE757E1CF0D800010280C7000780DF007F13FE080F6D7E08018074
+80093F7F090F13FC757F757F877580767F8A88767F8A888AA2767FA28A881F80A37614C0
+A41FE0A5881FF0B05214E0A51FC0A4521480A31F006466A2525BA2525BA2525B666499B5
+5A515C5191C7FC515B515B515B097F5B50B512C008075C083F91C8FC0707B512FCBD12F0
+1CC051C9FC1BF81B8008E0CAFC6C627AE17C>I<BD12FCA488A2D8000102C0C71201F100
+0F1A01F2007F1B3F1B0F1B07757EA28787A288A3F43F80A31C1FA3197EA3F40FC0A499C7
+FC19FEA31801A218031807181F18FF93B6FCA6EEC000181F180718031801A21800A21D7E
+197EA21DFCA696C812011DF8A31C03A3F407F0A31C0FA21C1F1C3F1DE01C7F1CFF63631B
+0F093F13C098B5FC1A0797B6FCBEFCA31D80A35F617AE06A>I<BD12E0A41CF0A2D80001
+02C0C71207F1003F1A0F1A031A001B7F1B3FF31FF81B0FA21B07A21B03A21B011CFCA31B
+00A419FCA21C7EA41C00A21801A31803A21807180F183FEF01FF93B6FCA6EEC001EF003F
+180F18071803A21801A31800A896C9FCB3A5B912F8A657617AE065>I<B96C90B91280A6
+D8000102C0C9000102C0C7FCB3B3A293BBFCA604C0C91201B3B3A6B96C90B91280A67162
+7AE17E>72 D<B912E0A6C702E0C7FCB3B3B3B3AEB912E0A633627CE13C>I<020FB812F0
+A691C70001EC8000B3B3B3ACEA03FCEA0FFF487F487F487FA2B57EA45E96C7FCA36C4949
+5B604A5B6C90C75C6C484A5B01F84A5BD80FFE4A5B6C6C6C90B55A0001D9F80749C8FC6C
+90B65A013F15F0010F15C001014AC9FCD9001F13C044647CE153>I<B912F8A6D8000102
+C0CBFCB3B3B1F307E0A5F30FC0A61B1FA31B3F1C80A21B7FA21BFFA262A2626250130062
+62624FB5FC1907191F4EB6FCBDFC63A553627AE161>76 D<B700C0083FB612F070627097
+B7FCA37061D800010DF8C7FC70F103EFA202FD6DF107CFA202FC6DF10F8FA36F6DF01F0F
+A26F6D183EA26F6D187CA26F6D18F8A36F6DEF01F0A26F6DEF03E0A26F6DEF07C0A26F6D
+EF0F80A3706DEE1F00A2706D163EA2706D5EA2706D5EA3706D4B5AA2706D4B5AA2706D4B
+5AA2706D4B5AA3716D4AC7FCA2716D143EA2716D5CA2716D5CA3716D495AA2716D495AA2
+716D495AA2716D495AA3726D48C8FCA272EBC03EA2726D5AA2726D5AA372EBF9F0A272EB
+FFE0A2725CA2725CA37390C9FCA2735AA2735A90381FFFC0B700F86E480207B812F0A373
+5AA2735A8C627AE199>I<BB7E1AFCF2FFC01BF81BFE757ED800010280C7001F80070114
+F0736C7F081F7F747F747F7414807414C0A27414E0A21DF0A27513F8A41DFCA91DF8A498
+B512F0A21DE0A25014C01D8062501400505B505B087F5B4FB512E0071F5C93B9C7FC1BFC
+1BF01B8008F0C8FC04C0CCFCB3B3A2B97EA65E627AE16E>80 D<BA12F8F1FFE01AFEF2FF
+C01BF01BFED800010280C76C7F070714C0070014F0747F081F7F747F747F7480A2748089
+A37480A389A865A3505CA265A2505C9AC9FC505B505B505B087F5B4FB55A0707148096B5
+48CAFC93B812F81BC050CBFC621AFF932680000314C0DE007F7F071F13F8737F737F737F
+73808885888688A2747FA688A688A676140FF71F80A374801F3F86771400745E746E5BB9
+6E6E5B746E485A75EBFE07091F90B55A090715E009015DCF003F91C7FC0A0013FC71647A
+E178>82 D<DBFFFCEC01E0020FD9FFE01303027F02FC130749B7130F0107EEC01F011F16
+F049D9C007EBF83F4948C7383FFE7FD9FFF8020FB5FC4801E014014849804849153F91C9
+7E484882001F834982003F83845B007F187FA2193FA200FF181FA27F190FA27FA26D1707
+8080806C01F893C7FC80ECFF8015F86CECFFC016FC6CEDFFE017FE6CEEFFE018F86C17FE
+6C717E6C846C846D17F86D836D836D8313036D18806D6C17C0020F17E01401DA000F16F0
+1500040715F8EE007F1703050014FC183F84060713FE84A2007C8300FC83A2197FA3193F
+7EA31AFC7EA27F1AF86D177F7F1AF06D17FF6D18E06D5E01FF18C06E4B138002E04B1300
+02F84B5A02FFED3FFC01CF01E0ECFFF8018301FF010F5B010191B65A6D6C5E48011F93C7
+FC48010315FC48D9003F14E048020149C8FC476677E35A>I<001FBEFCA64849C79126E0
+000F148002E0180091C8171F498601F81A0349864986A2491B7FA2491B3F007F1DC090C9
+181FA4007E1C0FA600FE1DE0481C07A5CA95C7FCB3B3B3A3021FBAFCA663617AE070>I<
+B96C023FB612FEA6D8000102C0CA0007EBF000E2007FC7FCB3B3B3AA656D63A2821C0180
+6570170380525A6E7F6E4F5A70171F6E626E6D4D5A6E6D177F525A6E6E030390C8FC033F
+01E04B5A6F6DED1FFC6F01FCED7FF80303D9FF80903803FFE06F02F8017F5B6F6C90B7C9
+FC041F5E040716F8040016C0050F4ACAFCDD003F13C06F647AE17C>I<B800FC047FB612
+E0A6D800070280CB6CEB80006D6EDE07FCC7FC666D6E611D0F6D6E611D1FA26E6D611D3F
+6E6D611D7F6E6D96C8FC65A26E6D4D5AA26E6E5F1C036E6E5F1C076E6E5F1C0FA26E6E5F
+1C1F6F6D5F1C3F6F6D5F1C7FA26F6D4CC9FCA26F6D5E1B016F6E5D1B03A26F6E4A5AA26F
+6E5D1B0F6F6E5D1B1F706D5D1B3FA2706D5D1B7F706D92CAFC63706D5C1A01A2706E485A
+A27002C05B1A077002E05B1A0F7002F05B1A1FA27101F85B1A3F7101FC5B1A7F7101FE90
+CBFC62A2716D5AA2715CA2715CA3715CA2715CA2725BA2725BA37290CCFCA2725AA2725A
+A2725A73637DE17A>I<B800F8011FB80203B7FCA6D8000F91C9000102E0CAEBFE006D72
+F20FF07072715A230F6D73627072171F6D6A708277173F6D7397C7FC70846B6E72197E70
+7217FE6E726170855118016E6870731503636E68704C6E15076E68718451180F6EDE7E7F
+607172151F6E06FE61714B7E08016F153F6E4E6C95C8FC71840803616F4D6C177E710207
+6F15FE6F66714B7E080F7013016F4D6C5F7185081F18036F4D6C5F71023F7013076F94C7
+5F728450180F6F047E6E5E7272131F1AFE6F4C6E5EDEE00171133F6F4C6E93C9FC06F084
+070361704B6E157E06F87213FE1907704B6E5DDEFC0F1881704B6E5D06FE19C1071F18C3
+704B6E5DDEFF3F18E7706407BFC9FC07FF18FF704A705CA3704A705CA27099CAFC4F82A2
+7149705BA37149705BA27149705BA37149705BA37190CB5BA27148725AA37148725A7148
+72CBFCA0637DE1A7>I<913803FFFE027FEBFFF00103B612FE010F6F7E4916E090273FFE
+001F7FD97FE001077FD9FFF801017F486D6D7F717E486D6E7F85717FA2717FA36C496E7F
+A26C5B6D5AEB1FC090C9FCA74BB6FC157F0207B7FC147F49B61207010F14C0013FEBFE00
+4913F048B512C04891C7FC485B4813F85A5C485B5A5CA2B55AA45FA25F806C5E806C047D
+7F6EEB01F96C6DD903F1EBFF806C01FED90FE114FF6C9027FFC07FC01580000191B5487E
+6C6C4B7E011F02FC130F010302F001011400D9001F90CBFC49437CC14E>97
+D<903807FF80B6FCA6C6FC7F7FB3A8EFFFF8040FEBFF80047F14F00381B612FC038715FF
+038F010014C0DBBFF0011F7FDBFFC001077F93C76C7F4B02007F03F8824B6F7E4B6F1380
+4B17C0851BE0A27313F0A21BF8A37313FCA41BFEAE1BFCA44F13F8A31BF0A24F13E0A24F
+13C06F17804F1300816F4B5A6F4A5B4AB402075B4A6C6C495B9126F83FE0013F13C09127
+F00FFC03B55A4A6CB648C7FCDAC00115F84A6C15E091C7001F91C8FC90C8000313E04F65
+7BE35A>I<92380FFFF04AB67E020F15F0023F15FC91B77E01039039FE001FFF4901F801
+0113804901E0010713C04901804913E0017F90C7FC49484A13F0A2485B485B5A5C5A7113
+E0485B7113C048701380943800FE0095C7FC485BA4B5FCAE7EA280A27EA2806C18FCA26C
+6D150119F87E6C6D15036EED07F06C18E06C6D150F6D6DEC1FC06D01E0EC7F806D6DECFF
+00010701FCEB03FE6D9039FFC03FFC010091B512F0023F5D020F1580020102FCC7FCDA00
+0F13C03E437BC148>I<F17FF8050FB5FCA6EF000F8484B3A892380FFF804AB512F8020F
+14FE023FECFF8391B712E301039138807FF3499039F8000FFB011F01E00103B5FC494913
+004990C87E49488148498148834A815A485BA2485BA25AA3485BA4B5FCAE7EA46C7FA37E
+A26C7FA26C5F806C5F6C6D5D6C6D5D017F93B5FC6D6C6C0103806D6D49806D01F0D91FF7
+EBFFFE6D9039FE01FFE7010190B612876D6CECFE07021F14F8020314E09127003FFE00EC
+C0004F657BE35A>I<92380FFFC04AB512FC020FECFF80023F15E091B712F80103D9FE03
+7F499039F0007FFF011F01C0011F7F49496D7F4990C76C7F49486E7F48498048844A8048
+84485B727E5A5C48717EA35A5C721380A2B5FCA391B9FCA41A0002C0CBFCA67EA380A27E
+A27E6E160FF11F806C183F6C7FF17F006C7F6C6D16FE6C17016D6C4B5A6D6D4A5A6D01E0
+4A5A6D6DEC3FE0010301FC49B45A6D9026FFC01F90C7FC6D6C90B55A021F15F8020715E0
+020092C8FC030713F041437CC14A>I<EE3FFC0307B51280033F14C04AB612F0020715F8
+4A9038F03FFC4AEB807F913A7FFE00FFFE4A5A4B4813FF4913F05B4913E0A24913C0A270
+13FE4949EB7FFCEF3FF8EF1FF0EF07C094C7FCB0B812C0A6D8001F01C0C8FCB3B3B0007F
+B612FCA638657CE431>I<F107F8DB7FFEEC3FFE020FB5D8F001B5FC027FDAFE03148049
+B7128F49DCDFFD13C0010FD9F00FEBFFC149D9800114014990C7EBFC0349486E6C7E4948
+EC3FFF48496E018113800780130048F0C03E97C7FC48496E7FA34884A96C60A36C6D4A5B
+A26C60A26C6D4A90C8FC6D6C4A5A6D6C4A5A6D6D485BDBF00F5B4990B612C060D97C7F4A
+C9FCD9FC0F14F09126007FFECAFC92CCFC1201A47FA27F8014F091B77E18FE6CEFFFC019
+F06D17FC19FF6D846D846D846D84013F8490BAFC0003854801E0C712014890C9000F7F48
+4816014848EE007F4848717E8512FF5B85A56D5F007F616D173F003F616D177F6C6C4D5A
+6C01C003035B6C6D4B5B6C01F8031F5BC601FF92B5C7FC6D01F8011F5B011F90B712F801
+0717E0010094C8FC020F15F0DA003F01FCC9FC4A607CC151>I<903807FF80B6FCA6C6FC
+7F7FB3A8EF1FFF94B512F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FDB83
+F86D7FDB87F07FDB8FC0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2B7D8
+F007B71280A651647BE35A>I<EB0FE0EB3FF8497E48B5FCA24880A24880A76C5CA26C91
+C7FCA238007FFC6D5AEB0FE090C9FCAF903807FF80007FB5FCA6C6FC7F7FB3B3AEB712C0
+A622657BE42C>I<ED01FCED07FF4B1380033F13E0A24B13F0A292B512F8A76F13F0A26F
+13E0A2030F13806F1300ED01FC92C8FCAFEEFFF8021FB5FCA6EC000F8181B3B3B3AAEA07
+F0EA1FFC487E487EB56C4813F0A317E05D17C05D17806C4948130049495A6C48495A261F
+FE0313F06CB65A6C158000014AC7FC6C6C13F8010713802D8288E431>I<903807FF80B6
+FCA6C6FC7F7FB3B3B3B3ADB712E0A623647BE32C>108 D<902607FF80D91FFFEEFFF8B6
+91B500F00207EBFF80040702FC023F14E0041F02FF91B612F84C6F488193267FE07F6D48
+01037F922781FE001F9027E00FF0007FC6DA83F86D9026F01FC06D7F6DD987F06D4A487F
+6DD98FC0DBF87EC7804C6D027C80039FC76E488203BEEEFDF003BC6E4A8003FC04FF834B
+5FA24B5FA24B94C8FCA44B5EB3B2B7D8F007B7D8803FB612FCA67E417BC087>I<902607
+FF80EB1FFFB691B512F0040714FC041F14FF4C8193267FE07F7F922781FE001F7FC6DA83
+F86D7F6DD987F07F6DD98FC0814C7F039FC78015BE03BC8003FC825DA25DA25DA45DB3B2
+B7D8F007B71280A651417BC05A>I<923807FFE092B6FC020715E0021F15F8027F15FE49
+4848C66C6C7E010701F0010F13E04901C001037F49496D7F4990C87F49486F7E49486F7E
+48496F13804819C04A814819E048496F13F0A24819F8A348496F13FCA34819FEA4B518FF
+AD6C19FEA46C6D4B13FCA36C19F8A26C6D4B13F0A26C19E06C6D4B13C0A26C6D4B13806C
+6D4B13006D6C4B5A6D6D495B6D6D495B010701F0010F13E06D01FE017F5B010090B7C7FC
+023F15FC020715E0020092C8FC030713E048437CC151>I<902607FF80EBFFF8B6010FEB
+FF80047F14F00381B612FC038715FF038F010114C09227BFF0003F7FC6DAFFC0010F7F6D
+91C76C7F6D496E7F03F86E7F4B6E7F4B17804B6F13C0A27313E0A27313F0A21BF885A21B
+FCA3851BFEAE4F13FCA41BF861A21BF0611BE0611BC06F92B512801B006F5C6F4A5B6F4A
+5B03FF4A5B70495B04E0017F13C09226CFFC03B55A03C7B648C7FC03C115F803C015E004
+1F91C8FC040313E093CBFCB3A3B712F0A64F5D7BC05A>I<D90FFFEB0FFCB690383FFF80
+93B512E04B14F04B14F8923907FC7FFC92390FE0FFFEC6EC1F806DD93F0113FF6D133E15
+7E157C15F8A215F07013FEA24BEB7FFCEF3FF8EF0FE04B90C7FCA55DB3B0B712F8A63841
+7BC042>114 D<913A3FFF8007800107B5EAF81F011FECFE7F017F91B5FC48B8FC48EBE0
+014890C7121FD80FFC1407D81FF0801600485A007F167F49153FA212FF171FA27F7F7F6D
+92C7FC13FF14E014FF6C14F8EDFFC06C15FC16FF6C16C06C16F06C826C826C826C82013F
+1680010F16C01303D9007F15E0020315F0EC001F1500041F13F81607007C150100FC8117
+7F6C163FA2171F7EA26D16F0A27F173F6D16E06D157F6D16C001FEEDFF806D0203130002
+C0EB0FFE02FCEB7FFC01DFB65A010F5DD8FE0315C026F8007F49C7FC48010F13E035437B
+C140>I<EC07E0A6140FA5141FA3143FA2147FA214FF5BA25B5B5B5B137F48B5FC000F91
+B512FEB8FCA5D8001F01E0C8FCB3AFEF0FC0AC171F6D6D1480A2173F6D16006F5B6D6D13
+7E6D6D5B6DEBFF836EEBFFF86E5C020F14C002035C9126003FFCC7FC325C7DDA3F>I<90
+2607FFC0ED3FFEB60207B5FCA6C6EE00076D826D82B3B3A260A360A2607F60183E6D6D14
+7E4E7F6D6D4948806D6DD907F0ECFF806D01FFEB3FE06D91B55A6E1500021F5C020314F8
+DA003F018002F0C7FC51427BC05A>I<B700C00103B512FCA6C66C01C0C8381FFE006D6D
+ED07F0A26D6D5E190F6D6D5E191F6D606F153F6D95C7FC6F5DA26D6D157E19FE6D6E5C18
+016E5E7013036E5E701307A26E6D5C180F6E6D5C181F6E6D5C183F6E93C8FC705BA26E6D
+13FEA26E6E5A17816FEBC1F817C36F5C17E76F5C17FFA26F5CA26F5CA26F91C9FCA26F5B
+A36F5BA2705AA2705AA2705AA2705A4E417DBF55>I<007FB600C0017FB512F8A6D8001F
+01F8C70007EBF0006D040190C7FC6D6D5D6D6D4A5A6D6D4A5A70495A6D4C5A6E7F6E6D49
+5A6E6D495A7049C8FC6E4A5A6E6D485A6E6D485A6E13FFEF8FF06EEC9FE06FEBFFC06F5C
+6F91C9FC5F6F5B816F7F6F7F8481707F8493B57E4B805D4B80DB0FF37FDB1FE17F04C080
+153F4B486C7F4B486C7F4A486D7F4A486D7F4A5A4B6D7F020F6E7F4A486D7F4A486D804A
+5A4AC86C7F49486F7F4A6F7F0107707FEB3FFFB600F049B7FCA650407EBF55>120
+D<B700C00103B512FCA6D8003F01C0C8381FFE006FED07F0A26D6D5E190F6D6D5E191F6D
+6D5E193F6D95C7FC6F5D6D177E6F15FEA26D6E495AA26E6D5C18036E6D5C18076E5E7013
+0F6E5E70131FA26E6D495AA26E6D91C8FC606E6D137E18FE6E5D17816F5C17C3A26FEBE7
+F0A26FEBF7E017FF6F5CA26F5CA26F91C9FCA36F5BA26F5BA2705AA2705AA2705AA35FA2
+5F163F94CAFC5E167E16FED807E05CD81FF81301487E486C495AA2B5495AA24B5A5E151F
+4B5A6C4849CBFC15FEEBFC01393FF807FC391FF03FF06CB55A6C5C6C91CCFCC613FCEB1F
+E04E5D7DBF55>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fp cmsy10 10.95 5
+/Fp 5 56 df<007FB812F8B912FCA26C17F83604789847>0 D<EE7FFE0307B512E0033F
+14FC92B7FC0203D9C00313C0DA0FFCC7EA3FF0DA3FE0EC07FCDA7F80EC01FED901FEC9EA
+7F80D903F8EE1FC0D907E0EE07E04948707E4948707E49CB7E017E187E498449844848F0
+0F8000031AC04918074848F003E0A24848F001F0A248CD12F8A2001E1A78003E1A7CA200
+3C1A3C007C1A3EA200781A1EA300F81A1FA2481A0FAB6C1A1FA200781A1EA3007C1A3EA2
+003C1A3C003E1A7CA2001E1A78001F1AF8A26C6CF001F0A26C6CF003E0A26C6CF007C06D
+180F00011A806C6CF01F006D60017E187E6D606D6C4C5A6D6C4C5A6D6C4C5AD903F8EE1F
+C0D901FEEE7F809026007F80DA01FEC7FCDA3FE0EC07FCDA0FFCEC3FF0913B03FFC003FF
+C0020090B6C8FC033F14FC030714E09226007FFEC9FC50557BC05B>13
+D<EB0FFCEB3FFF90B512C0000314F04880488048804880A2481580A3B712C0AA6C1580A3
+6C1500A26C5C6C5C6C5C6C5CC614C0013F90C7FCEB0FFC22227BA72D>15
+D<19301978A2197C193CA2193E191EA2191F737EA2737E737EA2737E737E1A7C1A7EF21F
+80F20FC0F207F0007FBB12FCBDFCA26C1AFCCDEA07F0F20FC0F21F80F27E001A7C624F5A
+4F5AA24F5A4F5AA24FC7FC191EA2193E193CA2197C1978A2193050307BAE5B>33
+D<126012F0AE12FC12FEA212FC12F0AE126007227BA700>55 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fq cmsl10 10.95 54
+/Fq 54 122 df<9339FFC003F8030F9038F01FFE923A3FC07C7E0F923BFE001FF81F80DA
+03F890383FF07F4A48D9FFE013C0EC1FE04A4848EBC0FF03804A1380DA7F00157F4A9238
+003E004A6D91C7FC8301015D4A5CA4160113034A5CA416030007B812FCA3290007F00003
+F8C8FCA21607130F4A5CA4160F131F4A5CA4161F133F4A5CA4163F137F91C75BA4167F5B
+4992C9FCA31201486C49487EB5D8F83F13FF5DA242407EBF35>11
+D<EEFF80030F13F092383FC0789238FE001CDA03F8130E4A48133FDA1FE013FF4A5A4B5A
+EC7F005C5CEE00FE010115784A1400A513035CA4EE01FC0003B7FC17F8A23A0007F0000F
+1607A2130F4A14F0A4160F131F4A14E0A4161F133F4A14C0A4163F137F91C71380A4167F
+5B491500A31201486C903801FF80B5D8F83F13FCA25D30407EBF33>I<DCFF80EB7FC003
+0F9039E007FFF8923B3F80781FE03C923BFE003C7F000EDA03F8D91FFC7F4A484948EB1F
+80DA1FE0D9FFF0137F4A48485B03804A13FFDA7F005C5C4A92C7FCF27F0001016E153C4A
+4A91C7FCA5010314014A5CA41AFE0003BAFC62A23D0007F00003F800071903A2010F1407
+4A4A5CA41907011F140F4A4A5CA4190F013F141F4A4A5CA4191F017F143F91C7495CA419
+3F49147F4992C75BA31201486C49486CEBFFC0B5D8F83FD9FC1F13FE605D49407EBF4C>
+14 D<140E141E143EA4143CA3000FEC01E03A1F803803F001C0130F01F0EB1FE0D807F8
+EB7FC03A01FC70FE003900FE73F890383F77E090380FFF80D903FEC7FCEB00F0EB03FCEB
+1FFF90387EEFC03901FCE7F03907F0E3FC391FE0E1FF3A7F81E07F80903801C03F00FC14
+1F0078EC0F00D8200390C7FC1200A31307A35C91C8FC242774C32D>42
+D<007FB5FCA2B512FEA418067C961E>45 D<157015F014011407143F903803FFE0137FEB
+FFCFEBF80F1300141F15C0A5143F1580A5147F1500A55C5CA513015CA513035CA513075C
+A5130F5CA3131F497EB612F8A31D3D78BC2D>49 D<EC01FE91380FFFE0023F13F89138FC
+07FC903901E001FE903907C000FF49C7EA7F80011E15C0163F4915E05B0170141F13FF80
+A35A163FA26C90C7FC137E0118EC7FC090C8FCEEFF80A24B1300A24B5A5E4B5A4B5A4B5A
+5E4B5A4BC7FC15FEEC01F84A5A4A5A4A5A4AC8FC143E5C5CEB01E04948130E49485B49C7
+FC131E495C13705B48485C484814F0000FB6FC5A485D5AB7FC5EA22B3D7CBC2D>I<EC07
+FC91383FFF809138F80FE0903903C007F09039078003FC90380F0001011C14FE013C14FF
+137F1480EBFFC0A31480A291380003FE137E90C7FCED07FC16F8150F16F0ED1FE016C0ED
+3F80ED7E005DEC07F0903803FF8015F090380001FC6E7EED7F80ED3FC0A2ED1FE016F0A3
+16F8A4120EEA3F80486C133F16F012FFA216E0157F5B48C7EAFFC000F015800070491300
+12786C495A003EEB07F86C495A390FE03FE00003B51280C649C7FCEB1FE0283F7ABC2D>
+I<17E016011603831607A2160FA2161F83163FA2167F167716F7EEE7FCED01E316C31503
+16831507EE03FEED0F01150E151E151C153C03387FED7800157015F05D4A4880177F4A5A
+A24AC7FCA2020E81173F5C021FB6FC5CA20270C7EA3FE0171F5CA2495AA2494881170F49
+C8FCA2130EA24982013C1507A2137CD801FE4B7E2607FF80EC3FFEB500F00107B512FC19
+F85E3E417DC044>65 D<013FB7FC18E018FC903B007FE00007FE6E48903801FF80943800
+7FC05DF03FE0F01FF0A3027F16F892C8FCA54A16F04A153F19E0187F19C0F0FF8001014B
+13004A4A5A4D5AEF1FF04D5ADC03FFC7FC49B612F8EFFF8002F8C7EA3FE0EF0FF0EF07FC
+717E010715014A81711380A319C0130F5CA5011F4B13805C19005F601707013F4B5A4A4A
+5A4D5A4D5A017F913801FF8001FF020F90C7FCB812FC17F094C8FC3D3E7DBD40>I<DCFF
+C01338030F01F01378037F01FC13F0913A01FF803F01913A07FC000781DA1FE0EB03C3DA
+7FC0EB01E74AC812FF4948ED7FE0D907FC153F495A4948151F495A4948150F494816C018
+074890C9FC485AA2485A000F1880491603121FA248481607A295C7FC485AA412FF5BA75B
+A2181C183C1838A27F007F1778187018F0003F5F6D150160001F16036C6C4B5A95C7FC6C
+6C5D6C6C151E6C6C5D6C6C15F86D6C495A6D6CEB07C0D91FF0EB1F80D907FE01FEC8FC01
+01B512F86D6C13E0DA07FEC9FC3D4276BF42>I<013FB7FC18E018F8903B007FF0000FFE
+6E48EB01FF9438007FC04B6E7E180F85727E727E147F4B6E7EA2727EA302FF178092C9FC
+A54918C05CA41A8013034A5DA41A0013074A5DA261A24E5A130F4A5E180F61181F61011F
+4C5A5C4E5A4EC7FC4D5A4D5A013F4B5A4A4A5AEF3FE0EF7F80017F4A48C8FC01FFEC1FFC
+B812F0178004FCC9FC423E7DBD45>I<013FB812F8A39026007FF0C7127F6E48140F1803
+4B14011800A31978147F4B1570A502FF147092C7FCA3190017F0495D4A1301A21607161F
+91B6FC495DA29138FC003F160F1607160301075D5CA219E0180119C0010FEC07004A90C7
+12031980A218071900011F5E5C181EA2183E183C013F167C4A15FC4D5A1707017F151F01
+FF4AB45AB9FCA2603D3E7DBD3E>I<013FB812E0A3903A007FF000016E48EB003F180F4B
+14071803A31801147F4B15C0A514FF92C71270A395C7FC17F0495D5C160116031607161F
+49B65AA39138FC003F160F160701075D4A1303A5010F4AC8FC5C93C9FCA4131F5CA5133F
+5CA3137FEBFFF0B612F8A33B3E7DBD3B>I<4BB46C1370031F01F013F0037F9038FC01E0
+913A03FF807E03913A0FF8000F83DA1FE0EB07C7DA7F80EB01EF4AC812FFD903FE16C049
+48157F4948153F495A4948151F495A4948168091C9120F5A485AA2485A000F1800498212
+1FA248485EA295C7FC485AA412FF5BA6043FB512E05BA29339001FFC00715AA2607F127F
+A2171F123F6D5EA2121F7F000F163F6C7E6C6C4B5A7F6C6C15FF6C6DEB01EFD93FC0EB07
+C7D91FF0EB1F87D907FE9038FE03800101B5EAF8016D6C01E0C8FCDA07FEC9FC3C4276BF
+47>I<013FB5D8F807B6FC04F015FEA29026007FF0C7380FFE006E486E5AA24B5DA4180F
+147F4B5DA4181F14FF92C85BA4183F5B4A5EA491B8FC5B6102FCC8127FA318FF13074A93
+C7FCA45F130F4A5DA41703131F4A5DA41707133F4A5DA3017F150F496C4A7EB6D8E01FB5
+12FC6115C0483E7DBD44>I<011FB512FC5BA29039003FF8006E5AA25DA5143F5DA5147F
+5DA514FF92C7FCA55B5CA513035CA513075CA5130F5CA5131F5CA3133F497E007FB512F0
+A2B6FC263E7EBD21>I<013FB500F8010FB5FC4C5BA29026007FF0C7000313E06E486E13
+0019FC4B15F04E5A4E5A4E5A061EC7FC027F5D4B5C4D5A4D5AEF07804DC8FC02FF141E92
+C7127C5FEE01E04C5A4C5A49021FC9FC4A5B5E4C7E5D03077F01035B9139FC1F3FE0153C
+4B6C7E15F09139FFE00FF84913C092380007FC5C4A6D7E5C707E130F4A6D7F84177F717E
+A2011F6F7E5C717EA2717EA2013F6F7E5C84A2017F83496C4A13E0B600E0017F13FFA24B
+90B6FC483E7DBD47>75 D<013FB512FEA25E9026007FF8C8FCEC3FE0A25DA5147F5DA514
+FF92C9FCA55B5CA513035CA513075CA21838A21870130F5CA218E0A3011F15014A15C017
+03A21707EF0F80013F151F4A143F177FEFFF00017F140301FF143FB9FC5FA2353E7DBD39
+>I<90263FFFF093381FFFF85013F0629026007FF8EFF000023F4D5AA2023B933801DFC0
+A2DA39FCED039FA2F1073F14790271040E5BEC70FE191C19381A7F02F01670DAE07F94C7
+FC19E0A2F001C06201016D6C495A02C05FF00700A2180E6F6C14010103161C028003385B
+A218706F7EF0E00313070200DA01C05BA2923907F00380A294380700075B010E902603F8
+0E5C5FA25F190F011E6D6C5A011C605FA2EEFDC0DB00FF141F013C5D013860013C92C7FC
+017C5C01FE027E143F2607FF80017C4A7EB500FC037FB512E004785E4A1338553E7CBD53
+>I<90263FFFE0023FB5FC6F16FEA29026003FF8020313C0021F030013004A6C157C023B
+163C6F15381439810238167802787FDA707F157082153F82031F15F002F07FDAE00F5D82
+15078203031401010180DAC0015D82811780047F1303010315C04A013F5C17E0161F17F0
+040F1307010715F891C7000791C7FC17FC160317FE04015B4915FF010E6E130E188E177F
+18CEEF3FDE011E16FE011C6F5AA2170FA21707133C01386F5A133C017C150113FE2607FF
+801400B512FC18705C483E7DBD44>I<923803FF80031F13F09238FE01FE913903F0003F
+DA0FC0EB1FC0DA3F80EB07E0027EC76C7E49486E7E49488149486E7E4948157F495A013F
+17804948ED3FC049C9FCA24848EE1FE012035B000718F05B120FA2485A19F8123F5BA212
+7FA219F04848163FA5F07FE0A35BF0FFC0A219805F19007F4D5A127F4D5A60003F160F6D
+5E001F4C5A4D5A6C6C4B5A95C7FC6C6C15FE00034B5A6C6C4A5A6C6C4A5A017FEC1FC06D
+6C495AD90FE001FEC8FC903903F807F80100B512C0DA0FFCC9FC3D4276BF47>I<013FB6
+12FEEFFFE018F8903B007FF0000FFC6E48EB01FF7113804BEC7FC0183F19E0F01FF0A214
+7F5D19F8A402FFED3FF092C8FCA219E0A2F07FC05B4AEDFF8019004D5A4D5AEF0FF80103
+ED3FE04A903801FF8091B648C7FC17F002FCCAFCA213075CA5130F5CA5131F5CA5133F5C
+A3137F497EB612E0A25D3D3E7DBD3E>I<013FB612F017FF18E0903B007FF0003FF86E48
+EB07FCEF01FE4B6D7EF07F8019C0183F19E0147F4B15F0A502FFED7FE092C8FCA219C0F0
+FF80A2494B13004A5D4D5AEF0FF04D5AEF7F800103DA07FEC7FC91B612F017809139FC00
+07E0EE03F8EE00FC0107814A147F717EA284A2130F5CA484011F157F5CA41902013F1707
+5CA2F0F00F017F170E496C143FB600E0011F131C94380FF83C4B01071378CA3801FFE094
+38003F8040407DBD43>82 D<9238FF80070207EBE00F021FEBF81E91387F00FE02FCEB1F
+3ED903F0EB0FFE49481307494813034AEB01FC49C7FC491400133E137E177C491578A57F
+1770A26D1500808080EB7FFEECFFE06D13FEEDFFC06D14F06D14FC010380010080143F02
+031480DA003F13C015031500EE7FE0163F161FA2160F121CA31607160F003C16C0A31780
+003E151F1700007E5D007F153E6D5C16FC01E0495AD87DF0495AD8FCFCEB0FC03AF87F80
+3F8027F01FFFFEC7FCD8E00713F839C0007FC030427BBF33>I<0007B912F0A33C0FFE00
+0FF8003F01F0160F01C04A13034848160190C7FC121EF000E048141F5E1238A212781270
+153F5E5AA3C81600157F5EA515FF93C9FCA55C5DA514035DA514075DA5140F5DA3141FEC
+7FFC0003B7FCA33C3D76BC42>I<B600E090B512FC4B15F8A2000101C0C7000F13006C49
+EC03FCEF01F091C9FC60A317015A495EA417031203495EA4170712074993C7FCA45F120F
+49150EA4171E121F49151CA4173C123F491538A31778177017F05F001F15015F16036D4A
+5A000F93C8FC5E6C6C141E6C6C5C000115F86C6C495A017FEB07C090393FC03F8090260F
+FFFEC9FC010313F89038007FC03E4073BD44>I<B6017FB5D88007B512804A1A00A20007
+01C0010101E0C713F06C90C80180EC3FC06C48735A99C7FC057F150E1B1E6D191C6C1A3C
+1B3805FF15787214705E636EEB03BF017F4E5AEE073F505A040E7F051F4AC8FC161C6E17
+0E013F143862167804706D5BEEF00F04E05D90381FE00104C015F003035E0480140106F8
+5B9226070007130302F05F010F010E150797C9FC5D190E4BEB03FC616E5A01075F5D61DA
+F9C014FE05015BECFB8002FF6F5A7F92C75CA24A93CAFC835C606D5A605C604A15781870
+594074BD5D>87 D<010FB500F090B512F85B5FD9003F902680003F1300DA0FFEC7EA1FF8
+4BEC0FE00207168096C7FC6E6C141E181C6E6C143C606E6D5B4D5ADB7FC05B4D5A92383F
+E0074DC8FC92381FF01E171C6F6C5A5F923807FCF0EEFDE06FB45A5F6F90C9FCA26F7FA2
+707EA216FF4B7FED03DF9238079FF0ED0F1F92380E0FF8151C92383C07FC15784B6C7EEC
+01E04B6C7EEC038002076D7F4AC7FC021E6E7E5C02386E7E5C02F06E7E495A49486E7E13
+0749486E7E497E017F4B7E2603FFF091383FFF80007F01FC49B512FEB55CA2453E7EBD44
+>I<EC7FC0903803FFF890380FC07E90383E003F496D7E01FF6D7E82A248140782A26C5A
+137890C7120FA25EA2EC03FF147F903807FF1FEB1FE0D97F805B3801FE00EA03F8485A48
+48133F485A003F5D49EC81C048C7FCA2157F48ED03804814FFA2007F5B913903BF070090
+3880073F3A3FC00E1F8E260FE03C13FC3A03FFF00FF83A007FC003E02A2A7CA82D>97
+D<EB3F80EA1FFFA3C6FC137FA291C9FCA55B5BA512015BA4EC07F80003EB3FFF9039F8F8
+0FC09039FBE003E09039FF8001F891C77E5B4848147E49147F5B821780A2120F5B17C0A3
+167F001F16805BA4EEFF00123F5B4B5AA24B5A5E007F4A5AA24B5A6D495A4BC7FCD87CE0
+137E39F87001F839F03C07E039E00FFF80260003FCC8FC2A4077BE33>I<EC1FF0ECFFFE
+903903F01F8090390FC003C0D93F0013E0017E130F49131F000115F04848EB3FE0485AA2
+4848EB1FC0001FEC0F004990C7FC123FA2485AA412FF90C9FCA96CEC0380150716006C6C
+5B151E001F5C6C6C5B6C6C5B6C6C485A3901F80F8026007FFEC7FCEB0FF0242A7AA828>
+I<EE03F8ED01FFA3ED000F1607A217F0A4160FA217E0A4161FA217C0A491380FF03FECFF
+FC902603F81F138090390FC007BF90391F8003FF90387E0001497F0001157F4848150048
+5A120F5B001F5D485A5E5B127FA2150112FF90C75BA41503A25EA37E1507A26C4A5A7F00
+1F141F6C6C133F6C6CEBFFF83B03F001EFFFC03900F80F8F90383FFE0FD90FF0EBE0002D
+407ABE33>I<EC3FE0903801FFF8903807E07E90380F801F90393F000F80017E14C049EB
+07E0485A12034848EB03F0485AA2121F5B123FA248481307A290B6FCA2D8FF80C8FC90C9
+FCA87EED01C015036C15806D1307001FEC0F006D131E000F5C6C6C5B6C6C485A3900FC07
+C0D93FFFC7FCEB07F8242A7BA828>I<ED07F0ED3FFCEDFC1E913803F03F4A48B4FC4A48
+1380141FEC3F81DA7F0113008102FE137C93C7FCA213015CA513035CA50007B512F8A326
+0007F0C8FCA3130F5CA5131F5CA5133F5CA5137F91C9FCA55B5BA4EA03FF007F13FEB5FC
+A229407DBF1C>I<177C913907F803FE91393FFE0F8F9139FC0F9C3F903901F007F89039
+07E003E0D90FC013F0011F903801F80C02801400133FD97F007FA315035B495CA3017E49
+5A5E150F6D5C6D495A90263F803EC7FCECC0FC903871FFF09038E07F8091C9FC485AA47F
+A27F90B512F8EDFF806C15E016F86D8048B6FC3A07E0000FFED80F801300003FC8127F00
+3E815A00FC815AA25E163EA25E6C15FC007C4A5A6C4A5A6CEC0FC0D80FC0013FC7FC3903
+F801FCC6B512F0010F90C8FC303D7FA82D>I<147FEB3FFFA313017FA25CA513015CA513
+035CA4ED07F80107EB1FFF9139F0781FC09138F1E00F9139F38007E0ECF70002FE14F049
+5A5CA25CA24A130F131F4A14E0A4161F133F4A14C0A4163F137F91C71380A4167F5B4915
+00A300015D486C491380B5D8F87F13FCA32E3F7DBE33>I<1478EB01FE130314FFA25B14
+FE130314FCEB00F01400ACEB03F8EA01FF14F0A2EA001F130FA314E0A5131F14C0A5133F
+1480A5137F1400A55B5BA4EA03FF007F13F0A2B5FC183E7DBD1A>I<ED0780ED1FE0153F
+16F0157FA216E0153F16C0ED0F0092C7FCACED7F80EC3FFF1600A2140180A35DA41401A2
+5DA41403A25DA41407A25DA4140FA25DA4141FA25DA4143F5DA4121E267F807FC7FCA200
+FF137E14FE5CEB01F8495A387C07E0383C0FC0D80FFFC8FCEA03F8245187BD1C>I<147F
+EB3FFFA313017FA25CA513015CA513035CA501070103B5FC02F014FEA26F13F06F1380EE
+FE00010F14F84A485AED03C04B5A031FC7FC153E011F13784A5AECC3E0ECC7F0ECCFF814
+FF497F14F9ECE1FE14C04A7E4A7E4980017E133F82151F82150F01FE8049130782A20001
+81486C49B4FCB5D8F03F13F04B13E0A2303F7EBE30>I<143FEB1FFF5BA213017FA214FE
+A5130114FCA5130314F8A5130714F0A5130F14E0A5131F14C0A5133F1480A5137F1400A5
+5B5BA4EA03FF007F13F8A2B5FC183F7DBE1A>I<902707F007F8EB03FCD803FFD91FFF90
+380FFF80913CE0781FC03C0FE09126E1E00FEBF0073E001FE38007E1C003F090260FE700
+EBE38002EEDAF70013F802FC14FE02D85C14F84A5CA24A5C011F020F14074A4A14F0A501
+3F021F140F4A4A14E0A5017F023F141F91C74914C0A549027F143F4992C71380A300014B
+147F486C496DEBFFC0B5D8F87FD9FC3F13FEA347287DA74C>I<903907F007F8D803FFEB
+1FFF9139E0781FC09138E1E00F3B001FE38007E090380FE70002EE14F014FC14D814F85C
+A24A130F131F4A14E0A4161F133F4A14C0A4163F137F91C71380A4167F5B491500A30001
+5D486C491380B5D8F87F13FCA32E287DA733>I<EC0FF0ECFFFE903903F01F8090390FC0
+07C049C66C7E013E6D7E01FC6D7E48488049147C0003157E485A000F157F5B121FA2485A
+A2007F1680A2170048C85AA54B5AA25E5A6C4A5A7E4B5A5E6C140F6C6C5C4B5A6C6C013E
+C7FC6C6C5B6C6C485A3900FC0FE090383FFF80D90FF8C8FC292A7BA82D>I<91387F01FE
+903A7FFF0FFFC09139FE3E03F09238F801F8903A03FFE000FE6D49137F4B7F92C713804A
+15C04A141FA218E0A20103150F5C18F0A3171F010716E05CA3173F18C0130F4A147F1880
+A2EFFF004C5A011F5D16034C5A6E495AEE1FC06E495AD93FDC017EC7FC91388F01F89138
+83FFE0028090C8FC92C9FC137FA291CAFCA45BA25BA31201487EB512F8A3343A81A733>
+I<91390FE003C0DAFFFC1380903903F81E0790390FE0070F90391F80038FD97F0013DF01
+FE13014848903800FF00485A1207485A8248485C123F495CA2485AA2150112FF90C75BA4
+1503A25EA37E15077F003F4A5A151F6C6C133F6C6C137F000714FF3903F003CF3A00FC0F
+8FE090383FFE0FEB0FF090C7FC151F5EA5153F5EA4157F4B7E023F13FEA32A3A7AA730>
+I<903907F01F80D803FFEB7FE09138E1E1F09138E387F839001FE707EB0FE614EE02FC13
+F002D813E09138F801804AC7FCA25C131FA25CA4133F5CA5137F91C8FCA55B5BA3120148
+7EB512FEA325287EA724>I<9138FF81C0010713E390381F807F90397C003F8049131F48
+48130F5B00031407A248481400A27FA27F6D90C7FCEBFF8014FC6C13FF6C14C015F06C6C
+7F011F7F13079038007FFE1403140100381300157EA2123C153E157E007C147CA2007E14
+7815F8007F495A4A5A486C485A26F9E01FC7FC38E0FFFC38C01FE0222A7DA824>I<EB03
+80A4130791C7FCA25BA25BA2133EA2137E13FE12011207001FB512C0B6FCA2D801FCC7FC
+A312035BA512075BA5120F5BA41407001F130E13C0A4141E141C1380A26D5AA2000F5B14
+F03807E1E03801FF80D8007EC7FC1A3978B723>I<01FE147F00FFEC7FFF4914FEA20007
+140300031401A34914FCA4150312074914F8A41507120F4914F0A4150F121F4914E0A215
+1FA3153F4914C0157F15FFEC01DF3A0FC003BFE09138073FFF3803F01E3801FFF826003F
+E01380282977A733>I<B539E007FFF05D17E02707FE000313006C48EB01FC6F5A5E0001
+4A5A5EA24B5A6D1307000092C7FC5D150E6D5B7F5DA25D1480013F5B14815D14C3011F5B
+02C7C8FCA214CE14EEEB0FFCA25CA26D5A5CA25CA26D5A2C2878A630>I<B500C3B53803
+FFFCA204FE14F8290FFE003FE00013C0D807F86D48EB7F000003173E183C150F18386D5E
+0001141F705B153F4D5A15776D4B5A0000ECE7F04DC7FCEC01C3170E9038FF0383017F5D
+91380703F85FEC0E01021E5CD93F9C14F002BC6D5A02B813FDDAF8005B4A13FF5F6D5A94
+C8FC5C4A137E167C6DC7FC1678010E14383E2878A642>I<48B539C07FFFC0A33C000FFE
+003FF8006D48EB1FE0010315800101023EC7FC6E133C01005C027F5B6F5A91383F81C0ED
+C380DA1FC7C8FC15EFEC0FFE6E5A5D140381A24A7E140FEC1E7F023C7FEC383F02707FEC
+E01F010180903803C00F49486C7ED90F007F491303017E80D801FE80D807FF497EB5D880
+3F13F8A332277FA630>I<90B539E007FFF05E18E0902707FE000313006D48EB01FC705A
+5F01014A5A5F16036E5C0100140794C7FC160E805E805E1678ED8070023F13F05EED81C0
+15C191381FC38015C793C8FC15EF15EEEC0FFCA25DA26E5AA25DA26E5A5DA24AC9FC5C14
+0E141E141C5C121C003F5B5A485B495A130300FE5B4848CAFCEA701EEA783CEA3FF0EA0F
+C0343A80A630>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fr cmbx12 14.4 73
+/Fr 73 122 df<922601FFFC903801FFE0033F9026FF801F13F84AB6D8E07F13FE020F03
+F9B6FC023FD9C00FB500C0138091277FFC0003D9FE0113C0902601FFE049495A49494949
+4813E04990C714F049484A13E0495A19C0495A7413C0017F17804A6E6E1380719138007E
+007192C7FCAEBCFCA526007FF8C7000301C0C8FCB3B3A7007FB5D8F803B612F0A553547D
+D34E>11 D<EEFFFC031FEBFF804AB612E0020781021F9038C00FF8913A7FFE0003FCDAFF
+F0EB00FE4949EB03FF4901805B4990C7487F49485CA2495A4D7F013F6F5B5CA37190C7FC
+715AEF01F894C9FCA90403B512C0BAFCA526003FFCC7120783B3B3A6003FB5D8FC03B612
+C0A542547DD34B>I<EA07F0EA1FFC487E487EA2B51280A86C1300A86C5AA86C5AA86C5A
+A86C5AA76C5AA5C8FCAAEA07F0487EEA3FFE487EA2B51280A76C1300A26C5AEA0FF86C5A
+115474D329>33 D<DD03E0EC0F80A24D6C4A7EA2050F153FA24E5DA2051F157FA24E92C8
+FC053F5DA24E5CA2057F1401A295C75BA24D1403A24D5D04011507A24D5DA20403150FA2
+4D5D0407151FA24D5DA2040F153FA24D5D007FBEFCA2BF1280A36C1D006C64C96CC7D801
+FCC9FC4C1403A24C5D03011507A24C5DA20303150FA24C5D0307151FA24C5DA2030F153F
+A24C5D031F157FA24C92CAFC003FBD12FE4888BF1280A36C1D00A2C848C7D803F8CAFC02
+011507A24B5D0203150FA24B5DA20207151FA24B5D020F153FA24B5DA2021F157FA24B92
+CBFC023F5DA24B5CA2027F1401A292C75B4A1403A24A5DA201011507A24A5DA26D486E5A
+A2616A79D270>35 D<15F8A691380FFF8091B512F8010714FF011F15C049819026FFF8F8
+13F84801C0EB0FFC2603FE00EB03FE4848EC00FF49153F4848ED1F804848ED0FC0A24848
+ED07E0A24848157FEFFFF05EA200FF5DA37FA27F7013E06D6E13C06DED7F806DED1E006C
+B492C7FC14C014F86C13FF81EDFFC06C15F86C15FE826C16C06C826C826C826D816D8113
+0F01038101001680141F020115C08003F814E0163F160F82040113F0D81FE080487E486C
+157FA2486C153FA2171FA44916E05B6C5A1380007EC7EC3FC0A26C1780177F6C6CEDFF00
+7F6C6C4A5AD807F84A5A6C6CEC0FF82601FF80EB3FF06C9039F8F9FFE06DB65A011F92C7
+FC010714FC010114F0D9001F90C8FCEC00F8A6346179D943>I<EC01E0EC07F84A7EA66E
+5AA200041608001F163ED83FC015FFD87FE04A13806D6C485AD8FFF84A13C0D87FFE021F
+138001FF5C02835B6C01C390B51200000FD9F1E313FC0001D9F9E713E027003FFDEF90C7
+FC0107B512F8010114E0D9003F90C8FCEC07F8EC3FFF49B512E0010714F890393FFDEFFF
+2701FFF9E713E0000FD9F1E313FC003FD9C3F013FF4801836D138002037F01FE80D8FFF8
+020713C0D87FF06E138049486C7ED83FC06E1300D81F00153E00041608C792C7FCA24A7E
+A66E5AEC01E0323578D943>42 D<EA07F0EA1FF8487E487E7FB5FC1480A314C0A37EA27E
+7EEA07F3EA0003A213071480A3130F1400A25B131E133E133C137C5BA2485A485A485A48
+5A48C7FC121E120C1228769025>44 D<B712F0AB240B7F9F2D>I<EA07F0487E487E487E
+487EB51280A76C13006C5A6C5A6C5A6C5A1111769025>I<913803FFC0023F13FC91B6FC
+010315C0010F018113F0903A1FFC003FF849486D7E49486D7E49486D7E48496D13804849
+6D13C0A24817E04890C813F0A34817F8A24817FC49157FA3007F17FEA600FF17FFB3A500
+7F17FEA6003F17FCA26D15FFA26C17F8A36C17F0A26C6D4913E0A26C6D4913C06C17806E
+5B6C6D4913006D6C495AD91FFCEB3FF8903A0FFF81FFF06D90B55A01011580D9003F01FC
+C7FC020313C0384F7BCD43>48 D<157815FC14031407141F14FF130F0007B5FCB6FCA214
+7F13F0EAF800C7FCB3B3B3A6007FB712FEA52F4E76CD43>I<EC3FFE0103B512E0010F14
+FC013F14FF90B712C048D9C07F7F2703FE000F13F8D807F801037FD80FE06D7F48486D7F
+48488001F01680486C6E13C07F486C6E13E07FA27013F0A56C5AA26C5AEA0FF0EA03C0C9
+14E05EA218C05E1880A24C13005F4C5A4B5B5F4B5B5F4B5B4B90C7FC4B5A5E4B5AED7FE0
+4B5A4A5B4A48C8FC4A5A5D4A48EB01F04A5AEC3F804AC7FC02FEEC03E0495A495A495A49
+5AD91F80140749C8FC013E150F017FB7FC90B812C05A5A5A5A5A5A5AB9FC1880A4344E79
+CD43>I<91380FFFC091B512FC0107ECFF80011F15E090263FF8077F9026FF800113FC48
+48C76C7ED803F86E7E491680D807FC8048B416C080486D15E0A4805CA36C17C06C5B6C90
+C75AD801FC1680C9FC4C13005FA24C5A4B5B4B5B4B13C04B5BDBFFFEC7FC91B512F816E0
+16FCEEFF80DA000713E0030113F89238007FFE707E7013807013C018E07013F0A218F8A2
+7013FCA218FEA2EA03E0EA0FF8487E487E487EB57EA318FCA25E18F891C7FC6C17F0495C
+6C4816E001F04A13C06C484A1380D80FF84A13006CB44A5A6CD9F0075BC690B612F06D5D
+011F1580010302FCC7FCD9001F1380374F7ACD43>I<177C17FEA2160116031607160FA2
+161F163F167FA216FF5D5DA25D5DED1FBFED3F3F153E157C15FCEC01F815F0EC03E01407
+EC0FC01580EC1F005C147E147C5C1301495A495A5C495A131F49C7FC133E5B13FC485A5B
+485A1207485A485A90C8FC123E127E5ABA12C0A5C96C48C7FCAF020FB712C0A53A4F7CCE
+43>I<D80380150ED807E0157E01FEEC03FED9FFF0137F91B65A5F5F5F5F5F94C7FC5E5E
+16F016C093C8FC15F801E190C9FC01E0CAFCABEC0FFF027F13F001E3B512FE01E76E7E90
+26FFF8077FDAC0017F49C713F8496E7E49143F4981496E7E6C481680C9FC18C08218E0A4
+18F0A3EA0FE0487E487E487E487EA418E0A35B6C484A13C05B491680003EC85A003F1700
+6C6C4A5A6D5D6C6C4A5AD807F8495BD803FE01075B2701FFC03F5B6C90B65A013F4AC7FC
+6D14F8010314C09026007FF8C8FC344F79CD43>I<ED0FFF92B512E0020780021F14FC91
+397FFE03FE903A01FFF0007F4901C0EB3F804990C7121F4948EC7FC0494814FF49484913
+E049485B01FF5C485BA2485B5AA2486F13C04A6D1380486F1300177E94C7FC5AA291CAFC
+5AA21508913801FFF8020713FFB54814C04A14F04AC66C7E023C6D7E4A6D7E4A6D7E7013
+804A15C0A24A15E07013F05C18F8A491C714FCA37EA67EA46C17F880A27E18F06C5D18E0
+6C6D15C07E6E4913806C6D15006D6C495A6D6CEB7FFC6DB448485A6D90B55A010315C001
+0092C7FC023F13FC020713C0364F7ACD43>I<121F7F7FEBFF8091B81280A45A19006060
+60A2606060485F0180C86CC7FC007EC95A4C5A007C4B5A5F4C5A160F4C5A484B5A4C5A94
+C8FC16FEC812014B5A5E4B5A150F4B5AA24B5AA24B5A15FFA24A90C9FCA25C5D1407A214
+0FA25D141FA2143FA4147F5DA314FFA55BAC6D5BA2EC3FC06E5A395279D043>I<913807
+FFC0027F13FC0103B67E010F15E090261FFC0113F8903A3FE0003FFCD97F80EB0FFE49C7
+6C7E48488048486E1380000717C04980120F18E0177FA2121F7FA27F7F6E14FF02E015C0
+14F802FE4913806C7FDBC00313009238F007FE6C02F85B9238FE1FF86C9138FFBFF06CED
+FFE017806C4BC7FC6D806D81010F15E06D81010115FC010781011F81491680EBFFE74801
+8115C048D9007F14E04848011F14F048487F48481303030014F8484880161F4848020713
+FC1601824848157F173FA2171FA2170FA218F8A27F007F17F06D151FA26C6CED3FE0001F
+17C06D157F6C6CEDFF806C6C6C010313006C01E0EB0FFE6C01FCEBFFFC6C6CB612F06D5D
+010F1580010102FCC7FCD9000F13C0364F7ACD43>I<91380FFF8091B512F8010314FE01
+0F6E7E4901037F90267FF8007F4948EB3FF048496D7E484980486F7E484980824817805A
+91C714C05A7013E0A218F0B5FCA318F8A618FCA46C5DA37EA25E6C7F6C5DA26C5D6C7F6C
+6D137B6C6D13F390387FF803011FB512E36D14C30103028313F89039007FFE03EC004015
+00A218F05EA3D801F816E0487E486C16C0487E486D491380A218005E5F4C5A91C7FC6C48
+4A5A494A5A49495B6C48495BD803FC010F5B9027FF807FFEC7FC6C90B55A6C6C14F06D14
+C0010F49C8FC010013F0364F7ACD43>I<EA07F0487E487E487E487EB51280A76C13006C
+5A6C5A6C5A6C5AC8FCB3EA07F0487E487E487E487EB51280A76C13006C5A6C5A6C5A6C5A
+113576B425>I<91B5FC010F14F8017F14FF90B712C00003D9C00F7F2707FC00017FD80F
+E06D7F48486E7E48C87FD87FE06E7E7F7F486C1680A66C5A18006C485C6C5AC9485A5F4B
+5B4B5B4B5B4B5B4B90C7FC16FC4B5A4B5A16C04B5A93C8FC4A5A5D14035D5D14075DA25D
+140FA25DAB91CAFCAAEC1FC04A7EECFFF8497FA2497FA76D5BA26D5BEC3FE06E5A315479
+D340>63 D<933807FFF84BB612E0030F15FC037FEDFF80912801FFFC000F13E002070180
+9038007FF8DA1FF8C8EA07FEDA7FE0923801FF80DAFF806F6C7E4948CAEA1FE0D903F8EF
+07F0D907E0EF01F84948717E4948187E49CC7E017E737E49912601FFC06E7E4848021F01
+FC6E7E4991B61403000302036F804848499026C07FE06D7E49011F9026000FF01300000F
+DA3FFCD903F8804949486D6C147C001F4A48D9007E147E494849023E143EF13FFE484949
+6E6C133F003E49855E007E491A80007C92C8150FA25CA200FC1CC04849481807AD6C6D7E
+127C1D806E190FA2007E81003E7F82003F6D1A006C6D6D4A5CA26D6C6D4A143E000F6E6C
+49B5FC6D6D6C496E5A00076EB4010F5D6D01079026C07FE713C36C6C6D90B50083EBFFF0
+0001020003005C6D021F01FC013F13806C6C020101C0D907FEC7FC017E91CDFC7F6D7E6D
+7E6D7ED903F8F17FC0D901FEF003FF6D6C6C171FDA7FE04CB51200DA1FF8041F13F89126
+07FF800203B512C0020101FC49B500FCC7FC6E6CB812E0030F04FCC8FC03011680DB0007
+0280C9FC5A5579D369>I<171F4D7E4D7EA24D7EA34C7FA24C7FA34C7FA34C7FA24C7FA3
+4C8083047F80167E8304FE804C7E03018116F8830303814C7E03078116E083030F814C7E
+031F81168083033F8293C77E4B82157E8403FE824B800201835D840203834B800207835D
+844AB87EA24A83A3DA3F80C88092C97E4A84A2027E8202FE844A82010185A24A82010385
+4A82010785A24A82010F855C011F717FEBFFFCB600F8020FB712E0A55B547BD366>I<BA
+12C019FEF1FFC01AF01AFCD8000701F0C7000313FFDE007F7F737F070F7F737F87858785
+8785A287A84F5BA263616361634F5B4F5B077F90C7FC4E485A060713F892B812E097C8FC
+861AF003F0C7000313FE9539003FFF80070F13E0737F07017F87737F747E1C807413C0A2
+7413E0A31CF0A386A362A31CE0A2621CC0A250138097B5FC1C004F5B19074F5B073F13F0
+4EB55ABC128098C7FC1AF81AC007F8C8FC54527CD160>I<932601FFFCEC01C0047FD9FF
+C013030307B600F81307033F03FE131F92B8EA803F0203DAE003EBC07F020F01FCC7383F
+F0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901F8824949824949824949824949
+824990CA7E494883A2484983485B1B7F485B481A3FA24849181FA3485B1B0FA25AA298C7
+FC5CA2B5FCAE7EA280A2F307C07EA36C7FA21B0F6C6D1980A26C1A1F6C7F1C006C6D606C
+6D187EA26D6C606D6D4C5A6D6D16036D6D4C5A6D6D4C5A6D01FC4C5A6D6DEE7F806D6C6C
+6C4BC7FC6E01E0EC07FE020F01FEEC1FF80203903AFFE001FFF0020091B612C0033F93C8
+FC030715FCDB007F14E0040101FCC9FC525479D261>I<BA7E19FCF1FF801AF01AFCD800
+0701F0C7000F13FF060014C0071F7F070713F807017F737F747E747F747F86747F747F88
+86888688A2757EA31D8087A21DC0A51DE0A387A963A31DC0A51D80A2631D00A3515AA264
+6264505B6264505B505B5090C7FCF2FFFE4F5B07075B071F5B96B512C0060F91C8FCBB5A
+1AF01AC007FCC9FC19805B527CD167>I<BC1280A5D8000701F8C7000114C0F0001F1907
+1901851A7F1A3F1A1FA2F20FE0A21A07A31A03A318F81BF01A01A497C7FC1701A3170317
+07170F177F92B6FCA59238F8007F170F170717031701A317001B3EA31B7CA395C8FCA21B
+FCA21BF8A21A01A31A031BF01A071A0FA21A1F1A3FF27FE0F101FF1907191F0603B5FCBC
+FCA21BC0A34F517CD058>I<BB12FEA5D8000701F8C700077FF0007F191F190785858586
+861B80A21A1FA31A0FA41BC006F81307A497C7FCA31701A317031707170F177F92B6FCA5
+9238F8007F170F170717031701A31700A795C9FCB3B812F8A54A517CD055>I<932601FF
+FCEC01C0047FD9FFC013030307B600F81307033F03FE131F92B8EA803F0203DAE003EBC0
+7F020F01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901F882494982
+4949824949824949824990CA7E494883A2484983485B1B7F485B481A3FA24849181FA348
+5B1B0FA25AA298C8FC5CA2B5FCAE6C057FB712E0A280A36C94C7003FEBC000A36C7FA36C
+7FA27E6C7FA26C7F6C7FA26D7E6D7F6D7F6D6D5E6D7F6D01FC93B5FC6D13FF6D6C6D5C6E
+01F0EC07FB020F01FEEC1FF10203903AFFF001FFE0020091B6EAC07F033FEE001F030703
+FC1307DB007F02E01301040149CAFC5B5479D26A>I<B8D8C003B8FCA5D8000701F8C900
+1FEBE000B3AE92BAFCA503F8C9121FB3B1B8D8C003B8FCA560527CD169>I<B812C0A5D8
+000701F8C7FCB3B3B3B2B812C0A52A527CD132>I<027FB71280A591C76C90C7FCB3B3B3
+EA07F0EA1FFC487E487EA2B57EA44C5AA34A485B7E49495BD83FF8495BD81FE05DD80FFC
+011F5B2707FF807F90C8FC000190B512FC6C6C14F0011F14C0010101F8C9FC39537DD145
+>I<B800C091B612F8A5D8000701F8C90003EBF8009738007F8051C7FC505AF203F8F20F
+F0505A505A505A50C8FCF101FCF107F84F5A4F5A4F5A4F5A07FEC9FCF003FC4E5A4E5A4E
+5A4E5A4E5ADD01FECAFC4D5A4D5A4D5A4D7E173F4D7E4C487E4C7F5E4C804C804C80EEFF
+7F9226F9FE3F7FDBFBFC809226FFF81F7F4C7EDCC0077F0480804C7E4B6D804B6D804B82
+84727F727F8684727F727F8784728087737F85737F87737F85737F88857380747F888697
+B512FCB800C0013FECFFFEA55F527CD169>I<B812F8A5D8000701F8CAFCB3B3A91A7CA4
+1AFC1AF8A51901A31903A219071AF0190FA2191F193F197F19FF180360183F4DB5FCBB12
+E0A546527CD151>I<B600FC073FB512FE6F61A26F96B6FCA2D80007F5C00070EF01EFA2
+02EF6DEF03CFA202E76DEF078FA202E36DEF0F0FA202E16D171EA302E06D173CA26F6C17
+78A26F6C17F0A26F6DED01E0A26F6DED03C0A36F6DED0780A26F6DED0F00A26F6D151EA2
+6F6D5DA3706C5DA2706C5DA2706D495AA2706D495AA2706D495AA3706D49C7FCA2706D13
+1EA2706D5BA2716C5BA3716C5BA271EB81E0A271EBC3C0A271EBE780A27101FFC8FCA371
+5BA2715BA2725AA2725AA2D93FFC6F5AB74DB712FEA2725AA2725A77527CD180>I<B600
+FC93B7FC8181A282D800076E9239003FFC0070EE07E08282A28202EF7F02E77F02E380A2
+02E18002E0806F7F6F7F6F7FA26F7F6F7F6F806F80A26F80707F707F707F707FA2707F70
+80708070808583717F717F717F717FA27114807114C07114E07213F07213F8A27213FC72
+13FE7213FF721487A27214C77214E77313F77313FF85A285858585A28586868686A28686
+8686A2D93FFC187FB7173F1B1F1B0F1B07755A60527CD169>I<93380FFFC00303B6FC03
+1F15E092B712FC0203D9FC0013FF020F01C0010F13C0023F90C7000313F0DA7FFC02007F
+494848ED7FFE4901E0ED1FFF49496F7F49496F7F4990C96C7F49854948707F4948707FA2
+4849717E48864A83481B804A83481BC0A2481BE04A83A2481BF0A348497113F8A5B51AFC
+AF6C1BF86E5FA46C1BF0A26E5F6C1BE0A36C6D4D13C0A26C6D4D1380A26C1B006C6D4D5A
+6E5E6C626D6C4C5B6D6D4B5B6D6D4B5B6D6D4B5B6D6D4B5B6D6D4B90C7FC6D6D4B5A6D01
+FF02035B023F01E0011F13F0020F01FC90B512C0020390B7C8FC020016FC031F15E00303
+92C9FCDB001F13E0565479D265>I<BAFC19F819FF1AE086D8000701F0C7001F13FC0601
+13FF726C13807313C0070F13E01BF0857313F81BFCA27313FEA41BFFA81BFEA31BFC61A2
+1BF84F13F04F13E0614F13C04F13004E485A061F5B92B812F01AC04FC7FC19E003F8CBFC
+B3AEB812C0A550527CD15C>I<93380FFFC00303B6FC031F15E092B712FC0203D9FC0013
+FF020F01C0010F13C0023F90C7000313F0DA7FFC02007F902601FFF0ED3FFE49496F7E49
+496F7F49496F7F4990C96C7F4948707F4948707F01FF854A177F48864849717EA2484971
+1380A2481BC04A83481BE0A24A83481BF0A3481BF8A291CB7EA3B51AFCAF6C1BF8A26E5F
+A36C1BF0A36C6D4D13E0A36C1BC06E5F6C1B806E5F6CDB01FE16006C6D902607FF80495A
+4C13E06C6D013F6D495A017F91267F03F85C6D6C90277C00FC015B6D6C49D97E035B6D01
+806E485B6D6D48D91F8F5B6D01E0039F90C7FC6D01F06EB45A6DD9FCF85DDA3FFF6E13F0
+020F6D4913C0020301FF90B5C8FC020091B512FC031F180C0303181EDB001FEBE3FE93C7
+EA01FF74133E74137E7413FEF2F8077290B5FC1CFCA285A21CF8A2851CF07314E0A27314
+C0731480731400735B9638007FF8F21FE0576A79D265>I<B912F0F0FF8019F819FF1AC0
+D8000701F0C714F0060F7F060113FE727F737F737F85737F87A2737FA387A863A2616363
+A24F5B4F5B4F90C8FC4F5A06035B060F13F095B512C092B8C9FC19F819E019F89226F000
+0313FE9439007FFF80727F727F727F727F727F8684A28684A787A71D1C75133EA3857513
+7E73157C7513FC731401B86C6D9038F803F807039038FE07F07390B512E0736C14C0080F
+1400CEEA7FFC5F537CD164>I<91260FFF80130791B500F85B010702FF5B011FEDC03F49
+EDF07F9026FFFC006D5A4801E0EB0FFD4801800101B5FC4848C87E48488149150F001F82
+4981123F4981007F82A28412FF84A27FA26D82A27F7F6D93C7FC14C06C13F014FF15F86C
+ECFF8016FC6CEDFFC017F06C16FC6C16FF6C17C06C836C836D826D82010F821303010082
+021F16801400030F15C0ED007F040714E01600173F050F13F08383A200788200F882A318
+7FA27EA219E07EA26CEFFFC0A27F6D4B13806D17006D5D01FC4B5A01FF4B5A02C04A5A02
+F8EC7FF0903B1FFFC003FFE0486C90B65AD8FC0393C7FC48C66C14FC48010F14F048D900
+7F90C8FC3C5479D24B>I<003FBC1280A59126C0003F9038C0007F49C71607D87FF80601
+13C001E08449197F49193F90C8171FA2007E1A0FA3007C1A07A500FC1BE0481A03A6C994
+C7FCB3B3AC91B912F0A553517BD05E>I<B800C00103B612FCA5D8000701F8CAEBF000F3
+1F80B3B3B11B3FA26D97C7FC81637F1B7E6D6D17FE505A6E7E505A6E6D15076E4D5A6E6D
+4B5A6E6D4B5A6E01F84B5A6E6DDA03FFC8FC6E6CB46CEB0FFE6F9039F001FFF8030F90B6
+5A030316C0DB007F92C9FC040F14F8DC007F13805E537CD167>I<B700FE031FB512FEA5
+D8001F01F0CA383FFE00F307F06D626F170F6D62811B1F6D6D601B3F6D97C7FC6F5F6D19
+7E821BFE6E6D5E1A016E6D5E1A036E60701507A26E6D5E1A0F6E6D5E1A1F6E6070153FA2
+6E6D93C8FC626E6E147E1AFE6F5E711301A26F6D5C19036F6D5C19076F5E71130FA26F6D
+5C191F6F6D5C193F6F93C9FC715BA26FEC807E19FE706D5A18C1705C18E3705C18F318F7
+70EBFFE0A2705CA2705CA37091CAFCA2705BA2715AA3715AA2715AA2715A715A5F537DD1
+66>I<B700FC017FB600FE91B612F0A5D8003F01C0C8001F01E0C9EBF8006F71EE0FC06D
+7161876F1C1F6D7196C7FC6F8373606D1E3E6F836D7160876F1CFC6D666F4B801F016D66
+704A806E525A88704A17076E059F5F70021F80080F160F6E6570023F806EDC3E074CC8FC
+8870027E5F6EDC7C03163E7002FC804F6C167E6E1C7C700101814F6C16FC6E745B700103
+17016E4C6D5D060716C00580496D14036F63DDC00F16E04F6D14076F07F05BDDE01F170F
+6F92C76C5D1DF8DDF03E6E141F6F98C9FCDDF87E16FC067C6E5C6FF1FE3EDDFCFC177E6F
+4A6E147C1DFFDDFFF06E14FC6F62A24E816F62A270496F5BA24E817061A295C97E7061A2
+70487090CAFCA37048705AA24D1601040360A27048705A84537DD18B>I<003FB7D88003
+B7FCA5D8000749C8000701F8C7FC6D6D9238007F806D6E93C8FC7015FE6D17016E6D5D70
+4A5A6E16076E6D4A5A6E6D5D4F5A6E6D143F6E6D4A5A7191C9FC6E16FE6EECC00171485A
+6F5D6F6D485A6FEBF80F71485A6F5D6F6D485AEFFF7F6F4ACAFC6F5C6F5CA2705B705B84
+82707F707FA2707F7080855E4C80855E4C80DC3FCF7F058F7FEE7F074C6C7FDB01FE814C
+7E4B486C8003076E7F4B48814C7F4B486D7F033F824C7F4BC76C7F4B6E7F4A5A4B6E804A
+486E800207844A48814B6F7F4A4883023F824A486F7F92C96C7F02FE8401018301037180
+90263FFFC084B76C0103B712F8A55D527CD166>I<B8030FB61280A5D8000F01FCCA003F
+90C7FC6FEF07F86D6D606D4F5A826D6E4C5A6D4F5A826E6D4CC8FC6E18FE826E6D4B5A6E
+4D5A826E6D4B5A6E4D5A836E6E4A5A6E4D5A836F6D4AC9FC6F5E715C6F6D495A6F150371
+5C6F6D495A6F150F06805B6F6E485A6F153F06E05B706D48CAFC705C725A70EBFDFC7013
+FF61705C82705C6182715B96CBFCB3AA030FB712F8A561527ED166>I<B512F0A748C7FC
+B3B3B3B3B3B0B512F0A7147872D925>91 D<B512F8A7EA0003B3B3B3B3B3B0B5FCA71578
+7ED925>93 D<EC7FFF0107B512F0013F14FE90B77E48D9E00F7F2703FE000113F0486C6D
+7F6EEB3FFC48826E131F83707FA36C496D7FA26C90C7FC6C5AC9FCA6037FB5FC020FB6FC
+91B7FC01071487013FEBF0074913803901FFFC004813F0485B485B485B4890C7FC5A5BA2
+485AA45EA26D5C007F151D163D6C6C02797F6C6D01F113F86C9026C003E1EBFFE06C9026
+F81FC014F06C90B5487EC6ED001F011F01FC010713E0010101E090C8FC3C387CB641>97
+D<EB3FF0B5FCA51203C6FCB3A4923801FFE0030F13FE033FEBFFC092B612F002F301017F
+913AF7F8003FFEDAFFE0EB0FFF03806D7F92C76C7F4A6E7F4A824A6E7FA2727EA285A285
+84A31A80AC1A00A44E5AA36118FF616E4A5BA26E4A5B6E4A5B6F495BDACFC04990C7FCDA
+87F0EB7FFC913A03FE03FFF849C6B612E0496D148049011F01FCC8FC90C7000313C04154
+7BD24B>I<913801FFF8021FEBFF8091B612F0010315FC010F9038C00FFE903A1FFE0001
+FFD97FFC491380D9FFF05B4817C048495B5C5A485BA2486F138091C7FC486F1300705A48
+92C8FC5BA312FFAD127F7FA27EA2EF03E06C7F17076C6D15C07E6E140F6CEE1F806C6DEC
+3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01FF0010390B55A01001580023F49C7FC
+020113E033387CB63C>I<4DB47E0407B5FCA5EE001F1707B3A4913801FFE0021F13FC91
+B6FC010315C7010F9038E03FE74990380007F7D97FFC0101B5FC49487F4849143F484980
+485B83485B5A91C8FC5AA3485AA412FFAC127FA36C7EA37EA26C7F5F6C6D5C7E6C6D5C6C
+6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0FFFC07FCF6D90B5128F0101ECFE0FD9
+003F13F8020301C049C7FC41547CD24B>I<913803FFC0023F13FC49B6FC010715C04901
+817F903A3FFC007FF849486D7E49486D7E4849130F48496D7E48178048497F18C0488191
+C7FC4817E0A248815B18F0A212FFA490B8FCA318E049CAFCA6127FA27F7EA218E06CEE01
+F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C6DEC3F806D6CECFF00D91FFEEB03FE
+903A0FFFC03FF8010390B55A010015C0021F49C7FC020113F034387CB63D>I<ED3FFC02
+03B5FC020F14C0023F14E09139FFF81FF0499038C03FF849EB807F49903800FFFC495A49
+5AA2495AA2EE7FF8495AEE3FF0EE0FC093C7FCAEB712E0A526007FF8C8FCB3B3A7007FB5
+12FEA52E547CD329>I<DA3FFF14FF0103B5D8F00713C0010FDAFC1F13E0013FECFF7F90
+267FFC0F9038FF9FF09026FFE001EBF83F48496C13E0484990387FF01F4890C7D83FF813
+E0489338FC0FC0F0078048486E6CC7FCA2003F82A9001F5EA26C6C4A5AA26C5E6C6D495A
+6C6D495A6C6D485BDAFC0F5B4890B6C8FCD803EF14FC01C314F02607C03F90C9FC91CBFC
+A2120FA37FA213F813FE90B7FC6C16F817FF18C06C836C836C836D828448B9FC12074848
+C700031480D81FF8EC003F4848150748486F13C083485A83A56D5D007F18806D5D003F18
+006C6C4B5AD80FFEED1FFC6C6C6CEC7FF86C01E049485A6C01FE011F5B6C6CB71280010F
+03FCC7FC010115E0D9000F01FCC8FC3C4F7CB543>I<EB3FF0B5FCA51203C6FCB3A4EE1F
+FC93B512C0030314F0030F8092391FE07FFC92393F001FFE037C8003F07FDAF1E081ECF3
+C0DAF7807F8502FFC7FC5CA25CA45CB3ACB6D8F807B612C0A542537BD24B>I<137F497E
+000313E0487FA2487FA76C5BA26C5BC613806DC7FC90C8FCADEB3FF0B5FCA512017EB3B3
+A6B612E0A51B547BD325>I<157FEDFF80020313E04A13F0A24A13F8A76E13F0A26E13E0
+02001380ED7F0092C7FCADED1FF891B5FCA51401EC007FB3B3B1EA0780EA1FE0487E487E
+486C13FF16F0A216E05C16C04A13806C4848130049485A003F495A000FB512F06C5C0001
+148026001FFCC7FC256C87D329>I<EB3FF0B5FCA51203C6FCB3A54CB512F8A59339003F
+FE00EF1FF0EF3FC04D5A4DC7FCEE03FEEE07F84C5A4C5AEE7FC04CC8FC4B5A4B5AED0FF8
+ED1FE04B7E4B7EECF1FF02F37F02F77F91B6FC83159F030F7F02FE80DAF8077F4A7E6F7F
+6F7F83707E82707F84707F707F82707F84707F177F717E4D13C0B6D8F003B6FCA540537C
+D247>I<EB3FF0B5FCA512017EB3B3B3B1B612F0A51C537BD225>I<D93FF0D91FFCEDFFE0
+B591B500C0010713FE030302F0011F6D7E030F6E017F8092271FE07FFCD9FF037F922A3F
+001FFE01F8007F0003027C9126FF03E080C602F06DD90780137FDAF1E0038FC77FDAF3C0
+159EDAF7806D01BC143F07FC8102FFC75C4A5EA24A5EA44A5EB3ACB6D8F807B6D8C03FB5
+12FEA567367BB570>I<D93FF0EB1FFCB591B512C0030314F0030F8092391FE07FFC9239
+3F001FFE0003027C80C602F07FDAF1E081ECF3C0DAF7807F8502FFC7FC5CA25CA45CB3AC
+B6D8F807B612C0A542367BB54B>I<913801FFE0021F13FE91B612C0010315F0010F9038
+807FFC903A1FFC000FFED97FF86D6C7E49486D7F48496D7F48496D7F4A147F48834890C8
+6C7EA24883A248486F7EA3007F1880A400FF18C0AC007F1880A3003F18006D5DA26C5FA2
+6C5F6E147F6C5F6C6D4A5A6C6D495B6C6D495B6D6C495BD93FFE011F90C7FC903A0FFF80
+7FFC6D90B55A010015C0023F91C8FC020113E03A387CB643>I<903A3FF001FFE0B5010F
+13FE033FEBFFC092B612F002F301017F913AF7F8007FFE0003D9FFE0EB1FFFC602806D7F
+92C76C7F4A824A6E7F4A6E7FA2717FA285187F85A4721380AC1A0060A36118FFA2615F61
+6E4A5BA26E4A5B6E4A5B6F495B6F4990C7FC03F0EBFFFC9126FBFE075B02F8B612E06F14
+80031F01FCC8FC030313C092CBFCB1B612F8A5414D7BB54B>I<90397FE003FEB590380F
+FF80033F13E04B13F09238FE1FF89139E1F83FFC0003D9E3E013FEC6ECC07FECE78014EF
+150014EE02FEEB3FFC5CEE1FF8EE0FF04A90C7FCA55CB3AAB612FCA52F367CB537>114
+D<903903FFF00F013FEBFE1F90B7FC120348EB003FD80FF81307D81FE0130148487F4980
+127F90C87EA24881A27FA27F01F091C7FC13FCEBFFC06C13FF15F86C14FF16C06C15F06C
+816C816C81C681013F1580010F15C01300020714E0EC003F030713F015010078EC007F00
+F8153F161F7E160FA27E17E07E6D141F17C07F6DEC3F8001F8EC7F0001FEEB01FE9039FF
+C00FFC6DB55AD8FC1F14E0D8F807148048C601F8C7FC2C387CB635>I<143EA6147EA414
+FEA21301A313031307A2130F131F133F13FF5A000F90B6FCB8FCA426003FFEC8FCB3A9EE
+07C0AB011FEC0F8080A26DEC1F0015806DEBC03E6DEBF0FC6DEBFFF86D6C5B021F5B0203
+13802A4D7ECB34>I<D93FF8913801FFC0B50207B5FCA50003ED001FC61607B3AE5FA35F
+A2017F5D173B177B6D6C14F3DC01E313F06D6CD907C3EBFFC0903A0FFFC03F836D90B512
+03010114FE6D6C13F8020701E091C7FC42377BB54B>I<B600F00107B5FCA5000101F8C8
+EA7FE06C6DED3F00A2017F163E6E157E013F167C6E15FC6D5E6F13016D5E8117036D5E6F
+13076D5E6F130F6D5E6F131F6D93C7FC815F6E6C133E177E023F147C6F13FC6E5C16816E
+5C16C3A26EEBE3E016E76E5C16FF6E5CA26E91C8FCA26F5AA36F5AA26F5AA26F5AA26F5A
+6F5A40367DB447>I<B6D8E07FB5D8C003B512C0A5000101F0C701F0C7381FF8006E027F
+ED07E06C715DA26E023F150F017F705DA26E181F013F4B6C92C7FC6E606D70143E94B5FC
+6F177E6D4A6E137C03C001F315FC6D715B160303E001E114016D020702E05B03F013C06D
+71485A160F03F8D9807F13076D05F85B93381F003F03FC160F027F4902FC5BDBFE3E011F
+131F023F04FE90C8FC167EDBFF7C010F5B6E01FCECFF3E4C6D137E6E5FA24C7F6E5F4C7F
+6E5FA24C7F6E5F4C147FA26E5F93C8123F6F5EA2033E6FC9FC5A367DB461>I<007FB500
+F090387FFFFEA5C66C48C7000F90C7FC6D6CEC07F86D6D5C6D6D495A6D4B5A6F495A6D6D
+91C8FC6D6D137E6D6D5B91387FFE014C5A6E6C485A6EEB8FE06EEBCFC06EEBFF806E91C9
+FCA26E5B6E5B6F7E6F7EA26F7F834B7F4B7F92B5FCDA01FD7F03F87F4A486C7E4A486C7E
+020F7FDA1FC0804A486C7F4A486C7F02FE6D7F4A6D7F495A49486D7F01076F7E49486E7E
+49486E7FEBFFF0B500FE49B612C0A542357EB447>I<B600F00107B5FCA5C601F8C8EA7F
+E06EED3F00A26D6C153E187E013F167C6E15FC6D5E6F13016D5E6F13036D5E8117076D6D
+5C170F6D6D5C171F6D93C7FC6F5B027F143E6F137E023F147C6F13FCA26E6D5A16816EEB
+C1F016C36E5C16E76E5C16FF6E5CA26E91C8FCA36F5AA26F5AA26F5AA26F5AA26F5AA35E
+150F5E151F93C9FC5DD81FC0133E486C137E486C137C486C13FC5D14015D14034A5A6C48
+485A49485A263FC07FCAFCEB81FE6CB45A6C13F000035BC690CBFC404D7DB447>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fs cmtt10 10.95 93
+/Fs 93 127 df<121C127FEAFF80B3EA7F00B2123EC7FCA8121C127FA2EAFF80A3EA7F00
+A2121C09396DB830>33 D<00101304007C131F00FEEB3F80A26C137FA248133FB2007E14
+00007C7F003C131E00101304191C75B830>I<903907C007C0A2496C487EA8011F131FA2
+02C05BA3007FB7FCA2B81280A36C16006C5D3A007F807F80A2020090C7FCA9495BA2003F
+90B512FE4881B81280A36C1600A22701FC01FCC7FCA300031303A201F85BA76C486C5AA2
+29387DB730>I<1438147C14FCA4EB03FF011F13E090B512FC4880000780481580261FFE
+FD13C09039F0FC3FE0D83FC0131FD87F80EB0FF001001307007E15F800FE14035A1507A3
+6CEC03F0A2007F91C7FC138013C0EA3FF0EA1FFE13FF6C13FF6C14E0000114F86C6C7F01
+1F7F01037F0100148002FD13C09138FC7FE0151FED0FF015070018EC03F8127E1501B4FC
+A35AA26CEC03F07E01801307ED0FE0D83FC0131F01F0EB7FC0D81FFEB512806CB612006C
+5C6C5CC614F0013F13C0D907FEC7FCEB00FCA5147C143825477BBE30>I<D803C0EB01E0
+D80FF01303486C497E487E150F487ED87E7E495AEAFE7F5E486C133FA25E157FA24BC7FC
+6C5A5D387E7E01EA7FFED83FFC5B1403EA1FF86C48485AEA03C0C75B140FA25D141FA24A
+5AA25D147FA292C8FC5CA2495AA25C1303A25C1307A290390FF001E0ED07F84A487E011F
+497EA24A487E133F163F90267F807F1380ED7E1F14005BA25B1201A24848EB7F3F033F13
+004914FF12076F5A5B6F5A6C486D5A0001EC01E029477DBE30>I<EB07E0EB1FF8497E13
+7F497E803801FC7F497E810003131F13F0A6143F92C8FC91387F0FFF9026F87E1F138000
+0113FEEBF9FC13FB4A6C1300D9FFF013C06C13E0151F02C05BEB7F809038FF003F4892C7
+FC485C48EB807E5A15FE391FDFC0FC383F8FE014E1397F07F1F8EB03F300FEEBFBF0EB01
+FF5D7FEDC006027F130F91393F801F8015C06C137F6CEBFFE049EBF83F018701FC130026
+3FFFFBB5FC6C01F15B14E06C9038C03FFC00039038001FF8D801FCEB07E0293A7DB830>
+I<EA07C0EA0FF0EA1FF8A213FCA213FE120F1207EA007EA513FE13FCA2120113F81203EA
+07F0120FEA1FE0127FEAFFC013801300127C12380F1D70B730>I<141E147F14FF5BEB03
+FEEB07FCEB0FF0EB1FE0EB3FC0EB7F80EBFF00485A5B12035B485A120F5BA2485AA2123F
+5BA2127F90C7FCA412FEAD127FA47F123FA27F121FA26C7EA27F12076C7E7F12017F6C7E
+EB7F80EB3FC0EB1FE0EB0FF0EB07FCEB03FEEB01FF7F147F141E184771BE30>I<127812
+FE7E7F6C7E6C7EEA0FF06C7E6C7E6C7E6C7EEB7F80133F14C0131FEB0FE014F01307A2EB
+03F8A214FC1301A214FE1300A4147FAD14FEA4130114FCA2130314F8A2EB07F0A2130F14
+E0EB1FC0133F1480137FEBFF00485A485A485A485AEA3FE0485A485A90C7FC5A12781847
+78BE30>I<14E0497E497EA60038EC0380007EEC0FC0D8FF83EB3FE001C3137F9038F3F9
+FF267FFBFB13C06CB61280000FECFE00000314F86C5C6C6C13C0011F90C7FC017F13C048
+B512F04880000F14FE003FECFF80267FFBFB13C026FFF3F913E09038C3F87F0183133FD8
+7E03EB0FC00038EC0380000091C7FCA66D5A6D5A23277AAE30>I<143EA2147FAF007FB7
+FCA2B81280A36C1600A2C76CC8FCAF143EA229297DAF30>I<EA03E0EA0FF0EA1FF813FC
+EA3FFEA213FFA27EA27E1203EA007FA2137E13FEEA01FC1203EA07F8EA3FF0127FEAFFE0
+EA7F801300123C1019708B30>I<007FB612F0A2B712F8A36C15F0A225077B9E30>I<120F
+EA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F000C0C6E8B30>I<16F01501ED03F8A2
+1507A2ED0FF0A2ED1FE0A2ED3FC0A2ED7F80A2EDFF00A24A5AA25D1403A24A5AA24A5AA2
+4A5AA24A5AA24A5AA24AC7FCA2495AA25C1303A2495AA2495AA2495AA2495AA2495AA249
+C8FCA2485AA25B1203A2485AA2485AA2485AA2485AA2485AA248C9FCA25AA2127CA22547
+7BBE30>I<14FE903807FFC0497F013F13F8497F90B57E48EB83FF4848C6138049137F48
+48EB3FC04848EB1FE049130F001F15F0491307A24848EB03F8A290C712014815FCA400FE
+EC00FEAD6C14016C15FCA36D1303003F15F8A26D1307001F15F0A26D130F6C6CEB1FE0A2
+6C6CEB3FC06C6CEB7F806D13FF2601FF8313006CEBFFFE6D5B6D5B010F13E06D5BD900FE
+C7FC273A7CB830>I<EB03C0497EA2130FA2131FA2133F137F13FF1203123FB5FCA213EF
+138FEA7E0F1200B3B0003FB512F84814FCB612FEA26C14FC6C14F81F3977B830>I<EB07
+FC90383FFFC090B512F00003804814FE4880261FF80F1380263FE00113C09038C0007F48
+48EB3FE090C7121FED0FF04814075A6C15F81503A3127E1218C8FCA2150716F0150F16E0
+151F16C0153FED7F8015FF4A13005DEC07FC4A5A4A5A4A5A4A5A4A5A4990C7FC495A495A
+EB0FF0EB3FE0495A495A4890C8FC4848EB01F04848EB03F8485AEA1FE048B6FCB7FCA37E
+6C15F025397BB830>I<EB03FF013F13E090B512F84814FE4880481580260FFE0113C090
+38F0007F4848EB1FE0150F16F01507A26C5A6C5AC8FC150F16E0A2151FED3FC0157FEDFF
+8002071300903807FFFE495B5D8115FF6D1480D9000113C09138003FE0ED1FF0ED07F815
+0316FC150116FE1500A21218127EB4FCA2150116FC4814036C15F86C6C13076DEB1FF0D8
+3FF0133F3A1FFE01FFE06CB612C06C15806CECFE00C65C013F13F001031380273A7CB830
+>I<EC03FC4A7E140F141FA2143F147F157E14FEA2EB01FCEB03F8A2EB07F0A2EB0FE0EB
+1FC0A2EB3F80A2EB7F0013FEA2485A485AA2485AA2485A485AA2485AA248C7FC12FEB8FC
+1780A46C1600C8007EC7FCAA91387FFFFE91B6FCA46E5B29397DB830>I<000FB6128048
+15C05AA316800180C8FCAEEB83FF019F13C090B512F015FC8181D9FE0313809039F0007F
+C049133F0180EB1FE06CC7120F000E15F0C81207A216F81503A31218127EA2B4FC150716
+F048140F6C15E06C141F6DEB3FC06D137F3A3FE001FF80261FFC0F13006CB55A6C5C6C5C
+6C14E06C6C1380D90FFCC7FC25397BB730>I<EC0FF8EC7FFF49B51280010714E0131F49
+14F090387FF80F9039FFC007F84813803803FE005B485A4848EB03F0ED01E0484890C7FC
+5B123F5BA2127FEB000C903803FFE0010F13F8D8FF3F13FE48B6FCB7128016C09039FE00
+7FE001F8EB1FF001E0130F49EB07F849EB03FCA290C7120116FE1500A37EA46C7E15016D
+14FC121F6D1303000FEC07F86D130F6C6CEB1FF06DEB3FE03A03FF81FFC06C90B512806C
+15006D5B011F13F8010713E001011380273A7CB830>I<127CB712FC16FEA416FC48C7EA
+0FF816F0ED1FE0007CEC3FC0C8EA7F80EDFF00A24A5A4A5A5D14075D140F5D4A5AA24A5A
+A24AC7FCA25C5C13015CA213035CA213075CA4495AA6131F5CA96D5A6DC8FC273A7CB830
+>I<49B4FC011F13F0017F13FC90B57E0003ECFF804815C048010113E03A1FF8003FF049
+131FD83FC0EB07F8A24848EB03FC90C71201A56D1303003F15F86D13076C6CEB0FF06C6C
+EB1FE0D807FCEB7FC03A03FF83FF806C90B512006C6C13FC011F13F0497F90B512FE4880
+2607FE0013C0D80FF8EB3FE0D81FE0EB0FF04848EB07F8491303007F15FC90C712014815
+FE481400A66C14016C15FC6D1303003F15F86D1307D81FF0EB1FF06D133F3A0FFF01FFE0
+6C90B512C06C1580C6ECFE006D5B011F13F0010190C7FC273A7CB830>I<49B4FC010F13
+E0013F13F890B57E4880488048010113803A0FFC007FC0D81FF0EB3FE04848131F49EB0F
+F048481307A290C7EA03F85A4815FC1501A416FEA37E7E6D1303A26C6C13076C6C130F6D
+133FD80FFC13FF6CB6FC7E6C14FE6C14F9013FEBE1FC010F138190380060011400ED03F8
+A2150716F0150F000F15E0486C131F486CEB3FC0157FEDFF804A1300EC07FE391FF01FFC
+90B55A6C5C6C5C6C1480C649C7FCEB3FF0273A7CB830>I<120FEA3FC0EA7FE0A2EAFFF0
+A4EA7FE0A2EA3FC0EA0F00C7FCAF120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F
+000C276EA630>I<EA03C0EA0FF0EA1FF8A2EA3FFCA4EA1FF8A2EA0FF0EA03C0C7FCAFEA
+03C0EA0FF0121F13F8123F13FCA3121FA2120F12031200120113F8120313F01207EA1FE0
+123FEA7FC0EAFF80EA7F00127E12380E3470A630>I<16F01503ED07F8151F157FEDFFF0
+14034A13C0021F138091383FFE00ECFFF8495B010713C0495BD93FFEC7FC495A3801FFF0
+485B000F13804890C8FCEA7FFC5BEAFFE05B7FEA7FF87FEA1FFF6C7F000313E06C7F3800
+7FFC6D7E90380FFF806D7F010113F06D7FEC3FFE91381FFF80020713C06E13F01400ED7F
+F8151F1507ED03F01500252F7BB230>I<007FB7FCA2B81280A36C16006C5DCBFCA7003F
+B612FE4881B81280A36C1600A229157DA530>I<1278127EB4FC13C07FEA7FF813FEEA1F
+FF6C13C000037F6C13F86C6C7EEB1FFF6D7F010313E06D7F9038007FFC6E7E91380FFF80
+6E13C0020113F080ED3FF8151F153FEDFFF05C020713C04A138091383FFE004A5A903801
+FFF0495B010F13804990C7FCEB7FFC48485A4813E0000F5B4890C8FCEA7FFE13F8EAFFE0
+5B90C9FC127E1278252F7BB230>I<EB1FFE90B512E0000314F8000F14FE488048158026
+7FF80313C09038C0007F48C7121F16E0150FA3127E151F0018EC7FC0C812FF020313804A
+13004A5AEC1FF84A5AEC7FC04A5A92C7FC495AA2495A5CA213075CA86D5A90C9FCA8EB01
+C0EB07F0A2497EA36D5AA2EB01C023397AB830>I<EC1FE0ECFFF8010313FE010F7F4914
+804914C090397FF03FE09038FF800F4890380007F0D803FC13033A07F801FBF89038F007
+FF380FE01F4A13FCEA1FC0495A003FEBFF0F903800FE07903901FC03FE007FEBF801EA7E
+03ECF000A2EAFE0700FC49137EAA00FE6D13FED87E0314FCA2ECF801D87F0114F8003FEB
+FC03903900FE07F0903880FF0F001F90387FFFE06D6C13C0EA0FE06E13803A07F007FE00
+9038F801F86C6CC7127C6CB414FE6CEB800390387FF01F6DB512FC6D14F86D14E0010314
+C00100EBFE00EC1FF0273A7CB830>I<147F4A7EA2497FA4497F14F7A401077F14E3A301
+0F7FA314C1A2011F7FA490383F80FEA590387F007FA4498049133F90B6FCA34881A39038
+FC001F00038149130FA4000781491307A2D87FFFEB7FFFB56CB51280A46C496C13002939
+7DB830>I<007FB512F0B612FE6F7E82826C813A03F8001FF815076F7E1501A26F7EA615
+015EA24B5A1507ED1FF0ED7FE090B65A5E4BC7FC6F7E16E0829039F8000FF8ED03FC6F7E
+1500167FA3EE3F80A6167F1700A25E4B5A1503ED1FFC007FB6FCB75A5E16C05E6C02FCC7
+FC29387EB730>I<91387F803C903903FFF03E49EBFC7E011F13FE49EBFFFE5B9038FFE0
+7F48EB801F3903FE000F484813075B48481303A2484813015B123F491300A2127F90C8FC
+167C16005A5AAC7E7EA2167C6D14FE123FA27F121F6D13016C6C14FCA26C6CEB03F86D13
+076C6CEB0FF03901FF801F6C9038E07FE06DB512C06D14806D1400010713FC6D13F09038
+007FC0273A7CB830>I<003FB512E04814FCB67E6F7E6C816C813A03F8007FF0ED1FF815
+0F6F7E6F7E15016F7EA2EE7F80A2163F17C0161FA4EE0FE0AC161F17C0A3163F1780A216
+7F17005E4B5A15034B5A150F4B5AED7FF0003FB65A485DB75A93C7FC6C14FC6C14E02B38
+7FB730>I<007FB7FCB81280A47ED803F8C7123FA8EE1F0093C7FCA4157C15FEA490B5FC
+A6EBF800A4157C92C8FCA5EE07C0EE0FE0A9007FB7FCB8FCA46C16C02B387EB730>I<00
+3FB712804816C0B8FCA27E7ED801FCC7121FA8EE0F8093C7FCA5153E157FA490B6FCA690
+38FC007FA4153E92C8FCAE383FFFF8487FB5FCA27E6C5B2A387EB730>I<02FF13F00103
+EBC0F8010F13F1013F13FD4913FF90B6FC4813C1EC007F4848133F4848131F49130F485A
+491307121F5B123F491303A2127F90C7FC6F5A92C8FC5A5AA892B5FC4A14805CA26C7F6C
+6D1400ED03F8A27F003F1407A27F121F6D130F120F7F6C6C131FA2D803FE133F6C6C137F
+ECC1FF6C90B5FC7F6D13FB010F13F30103EBC1F0010090C8FC293A7DB830>I<3B3FFF80
+0FFFE0486D4813F0B56C4813F8A26C496C13F06C496C13E0D803F8C7EAFE00B290B6FCA6
+01F8C7FCB3A23B3FFF800FFFE0486D4813F0B56C4813F8A26C496C13F06C496C13E02D38
+7FB730>I<007FB6FCB71280A46C1500260007F0C7FCB3B3A8007FB6FCB71280A46C1500
+213879B730>I<D83FFF90380FFF80486D4813C0B56C5AA26C497E6C496C1380D803F090
+3803F8004B5A4B5A151F4B5A5E4BC7FC15FE14014A5A5D4A5A4A5A141F5D4A5A4AC8FC5C
+13F18101F37F13F790B57E14EFECC7F01483EC03F8140101FE7F496C7E5B157F497F8215
+1F82150F826F7EA26F7E1501821500D83FFF903803FFC0486D4813E0B56C5AA26C497E6C
+496C13C02B387FB730>75 D<383FFFF8487FB57EA26C5B6C5BD801FCC9FCB3B0EE0F80EE
+1FC0A9003FB7FC5AB8FCA27E6C16802A387EB730>I<D83FF8ECFFE0486C4913F0486C49
+13F8A2007F16F06C6C4913E00007160001EF14BFEC800FA39039E7C01F3FA4ECE03F01E3
+133EA2ECF07EA201E1137CA2ECF8FCA201E013F8A214FDEC7DF0A3147FEC3FE0A3EC1FC0
+A2EC070091C7FCADD83FFC903801FFE0486C4913F0B54913F8A26C486D13F06C486D13E0
+2D387FB730>I<D83FFC90381FFF80486C4913C0B54913E0A26C6D6C13C06C6E13800003
+913801F800EBF7C0A3EBF3E0A314F013F1A214F8A213F014FCA2147C147EA2143E143FA2
+141FA21581A2140F15C1A2140715E1A2140315F1A21401A215F91400A3157DA3153FEA3F
+FF481380B5EAC01FA26CEB800F6C496C5A2B387EB730>I<90383FFFE048B512FC000714
+FF4815804815C04815E0EBF80001E0133FD87F80EB0FF0A290C71207A44815F8481403B3
+A96C1407A26C15F0A36D130FA26D131F6C6CEB3FE001F813FF90B6FC6C15C06C15806C15
+00000114FCD8003F13E0253A7BB830>I<007FB512F0B612FE6F7E16E0826C813903F800
+3FED0FFCED03FE15016F7EA2821780163FA6167F17005EA24B5A1503ED0FFCED3FF890B6
+FC5E5E16804BC7FC15F001F8C9FCB0387FFFC0B57EA46C5B29387EB730>I<90383FFFE0
+48B512FC000714FF4815804815C04815E0EBF80001E0133F4848EB1FF049130F90C71207
+A44815F8481403B3A8147E14FE6CEBFF076C15F0EC7F87A2EC3FC7018013CF9038C01FFF
+D83FE014E0EBF80F90B6FC6C15C06C15806C1500000114FCD8003F7FEB00016E7EA21680
+157F16C0153F16E0151F16F0150FED07E025467BB830>I<003FB57E4814F0B612FC15FF
+6C816C812603F8017F9138003FF0151F6F7E15071503821501A515035E1507150F4B5A15
+3F4AB45A90B65A5E93C7FC5D8182D9F8007FED3FE0151F150F821507A817F8EEF1FCA53A
+3FFF8003FB4801C0EBFFF8B56C7E17F06C496C13E06C49EB7FC0C9EA1F002E397FB730>
+I<90390FF803C0D97FFF13E048B512C74814F74814FF5A381FF80F383FE001497E484813
+7F90C7123F5A48141FA2150FA37EED07C06C91C7FC7F7FEA3FF0EA1FFEEBFFF06C13FF6C
+14E0000114F86C80011F13FF01031480D9003F13C014019138007FE0151FED0FF0A2ED07
+F8A2007C140312FEA56C140716F07F6DEB0FE06D131F01F8EB3FC001FF13FF91B5128016
+0000FD5CD8FC7F13F8D8F81F5BD878011380253A7BB830>I<003FB712C04816E0B8FCA4
+3AFE003F800FA8007CED07C0C791C7FCB3B1011FB5FC4980A46D91C7FC2B387EB730>I<
+3B7FFFC007FFFCB56C4813FEA46C496C13FCD803F8C7EA3F80B3B16D147F00011600A36C
+6C14FE6D13016D5CEC800390393FE00FF890391FF83FF06DB55A6D5C6D5C6D91C7FC9038
+007FFCEC1FF02F3980B730>I<D87FFE90380FFFC0B54913E06E5AA24A7E6C486D13C0D8
+07F0903801FC00A26D130300035DA46C6C495AA46C6C495AA46D131F6D5CA3EC803F013F
+5CA46D6C48C7FCA490380FE0FEA401075B14F1A301035BA314FB01015BA314FFA26D5BA4
+6E5A6E5A2B397EB730>I<D83FFC903801FFE0486C4913F000FF16F8A2007F16F06C486D
+13E0D81FC09038001FC0000F1680A76D143F00071600A7000390380F803E9039F01FC07E
+EC3FE0A3EC7FF0A2147D0001157CA29039F8FDF8FCA314F8A300005D01F913FCA2ECF07C
+A201FD137DA2017D5CECE03DA3017F133FA2ECC01FA2013F5CA2EC800F6D486C5A2D397F
+B730>I<3A3FFF01FFF84801837F02C77FA202835B6C01015B3A01FC007F806D91C7FC00
+005C6D5BEB7F01EC81FCEB3F8314C3011F5B14E7010F5B14FF6D5BA26D5BA26D5BA26D90
+C8FCA4497FA2497FA2815B81EB0FE781EB1FC381EB3F8181EB7F0081497F49800001143F
+49800003141F49800007140FD87FFEEB7FFFB590B5128080A25C6C486D130029387DB730
+>I<D87FFF90381FFFC0B56C4813E0A46C496C13C0D803F8903803F8006D1307A26C6C49
+5AA26C6C5C151F6D5CEC803F013F5CECC07F011F91C7FCA290380FE0FEA214F101075BA2
+903803FBF8A201015B14FF6D5BA26E5AA36E5AB1903803FFF8497F497FA26D5B6D5B2B38
+7EB730>I<001FB612FC4815FE5AA490C7EA03FCED07F816F0150FED1FE016C0153FED7F
+80003E1500C85A4A5A5D14034A5A5D140F4A5A5D143F4A5A92C7FC5C495A5C1303495A5C
+130F495A5C133F495A91C8FC5B4848147C4914FE1203485A5B120F485A5B123F485A90B6
+FCB7FCA46C15FC27387CB730>I<007FB5FCB61280A4150048C8FCB3B3B3A5B6FC1580A4
+6C140019476DBE30>I<127CA212FEA27EA26C7EA26C7EA26C7EA26C7EA26C7EA26C7EA2
+12017FA26C7EA26D7EA26D7EA26D7EA26D7EA26D7EA26D7EA2130180A26D7EA26E7EA26E
+7EA26E7EA26E7EA26E7EA26E7EA2140181A26E7EA2ED7F80A2ED3FC0A2ED1FE0A2ED0FF0
+A2ED07F8A21503A2ED01F0150025477BBE30>I<007FB5FCB61280A47EC7123FB3B3B3A5
+007FB5FCB6FCA46C140019477DBE30>I<1307EB1FC0EB7FF0497E000313FE000FEBFF80
+003F14E0D87FFD13F039FFF07FF8EBC01FEB800F38FE0003007CEB01F00010EB00401D0E
+77B730>I<007FB612F0A2B712F8A36C15F0A225077B7D30>I<1338137CEA01FE12031207
+EA0FFC13F0EA1FE013C0EA3F8013005A127EA212FE5AA5EAFFC013E013F0127FA2123FA2
+EA1FE0EA07C00F1D70BE30>I<EB7FF80003B5FC4814C04880488048809038E01FFC9038
+C003FE14016E7E6C487F6CC77FC8123FA491B5FC130F137F48B6FC12075A48EB803F383F
+F800EA7FE0138048C7FC5AA4157F7E6C6C13FFEBC003263FF01FEBFF8090B712C07E6C14
+EF000314876CD9FE01138026003FE0C8FC2A2A7BA830>I<EA3FFC487E12FFA2127F123F
+1200AAEC03FE91381FFF80027F13E091B57E90B612FC82ECFE079138F001FF4A6C13804A
+137F4AEB3FC091C7121F17E049140FA217F01607A8160FA217E07F161F6EEB3FC0A26EEB
+7F806E13FFDAF00313009138FC0FFE91B55A5E495CD97E7F13C0D93C1F90C7FC90380003
+FC2C3980B730>I<ECFFE0010713FC011F7F017F7F90B612804815C048EB807F3907FC00
+3F485A485A49EB1F804848EB0F004990C7FC127F90C9FCA25A5AA87E7EA27F003FEC07C0
+6DEB0FE06C7E6D131F6C6C14C0D807FE133F9039FFC0FF806C90B5FCC615006D5B011F13
+F801075B01011380232A7AA830>I<913801FFE04A7F5CA28080EC0007AAEB03FE90381F
+FF874913E790B6FC5A5A481303380FFC00D81FF0133F49131F485A150F4848130790C7FC
+A25AA25AA87E6C140FA27F003F141F6D133F6C7E6D137F390FF801FF2607FE07EBFFC06C
+B712E06C16F06C14F76D01C713E0011F010313C0D907FCC8FC2C397DB730>I<49B4FC01
+0713E0011F13F8017F7F90B57E488048018113803A07FC007FC04848133FD81FE0EB1FE0
+150F484814F0491307127F90C7FCED03F85A5AB7FCA516F048C9FC7E7EA27F003FEC01F0
+6DEB03F86C7E6C7E6D1307D807FEEB1FF03A03FFC07FE06C90B5FC6C15C0013F14806DEB
+FE00010713F8010013C0252A7CA830>I<EDFF80020713E0021F13F05C4A13F891B5FC49
+1387903803FE079138FC03F0903907F800C04A1300A8003FB612C04815E0B7FCA36C15C0
+260007F0C7FCB3A9003FB512FE4880B71280A26C15006C5C25397DB830>I<D903FC13FF
+90261FFF8713C04913DF90B712E05A5A2607FE07138F903AF801FE07C048486C6CC7FCA2
+497F001F8149133FA56D137F000F92C7FC6D5BA26C6C485AEBFE0790B55A5D485C15C001
+DF5BD9C3FCC8FC01C0C9FCA37F7F6CB512F015FF6C15C04815F0488148813A3FE0001FFE
+0180130148C8127F007E8100FE168048151FA56C153F007FED7F006D5C6C6C495A01F013
+076CB4EB7FFC6C90B55A6C5D000115C06C6C91C7FC011F13FC010113C02B3E7DA730>I<
+EA3FFC487E12FFA2127F123F1200AAEC01FE91380FFF80023F13E091B57E90B67EA29138
+FE07FCECF8039138E001FE14C0EC8000A291C7FCA25BB3A23B3FFFF81FFFF8486D4813FC
+B500FE14FEA26C01FC14FC6C496C13F82F3880B730>I<14E0EB03F8A2497EA36D5AA2EB
+00E091C8FCA9381FFFF8487F5AA27E7EEA0001B3A9003FB612C04815E0B7FCA27E6C15C0
+23397AB830>I<EC01C0EC07F0A2EC0FF8A3EC07F0A2EC01C091C7FCA990B512F04814F8
+A47EEB0003B3B3A5EC07F0A2123C007EEB0FE0B4131FEC3FC0147F90B512806C14005C6C
+5B000F13F0000313C01D4E7CB830>I<EA7FF8487EA4127F1200AB0203B512804A14C017
+E0A217C06E14809139001FE0004B5A4B5A4BC7FC4A5A4A5AEC0FF84A5A4A5A4A5A4A5A01
+FD7F90B57E8114F7ECE3F8ECC1FCEC81FEEC00FF497F496D7E6F7E826F7E15076F7E6F7E
+3B7FFFF81FFFE0B56C4813F017F8A217F06C496C13E02D387FB730>I<387FFFF8B57EA4
+7EEA0001B3B3A8007FB612F0B712F8A46C15F025387BB730>I<02FC137E3B7FC3FF01FF
+80D8FFEF01877F90B500CF7F15DF92B57E6C010F13872607FE07EB03F801FC13FE9039F8
+03FC01A201F013F8A301E013F0B3A23C7FFE0FFF07FF80B548018F13C0A46C486C010713
+80322881A730>I<EC01FE3A3FFC0FFF80267FFE3F13E000FF90B57E90B67E7E6C9038FE
+07FCC6EBF8039138E001FE14C0EC8000A291C7FCA25BB3A23B3FFFF81FFFF8486D4813FC
+B500FE14FEA26C01FC14FC6C496C13F82F2880A730>I<49B4FC010F13E0013F13F8497F
+90B57E0003ECFF8014013A07FC007FC04848EB3FE0D81FE0EB0FF0A24848EB07F8491303
+007F15FC90C71201A300FEEC00FEA86C14016C15FCA26D1303003F15F86D13076D130F6C
+6CEB1FF06C6CEB3FE06D137F3A07FF01FFC06C90B512806C15006C6C13FC6D5B010F13E0
+010190C7FC272A7CA830>I<EC03FE3A3FFC1FFF80267FFE7F13E000FF90B57E90B612FC
+6C816CEBFE07C69038F001FF4A6C13804A137F4AEB3FC091C7121F17E049140FA217F016
+07A8160FA217E07F161F6EEB3FC0A26EEB7F806E13FFDAF00313009138FC0FFE91B55A5E
+495C6E13C0021F90C7FCEC03FC91C9FCAD383FFFF8487FB57EA26C5B6C5B2C3C80A730>
+I<49B413F8010FEBC1FC013F13F14913FD48B6FC5A481381390FFC007F49131F4848130F
+491307485A491303127F90C7FC15015A5AA77E7E15037FA26C6C1307150F6C6C131F6C6C
+133F01FC137F3907FF01FF6C90B5FC6C14FD6C14F9013F13F1010F13C1903803FE0190C7
+FCAD92B512F84A14FCA46E14F82E3C7DA730>I<ED07F83A3FFF803FFF486DB51280B512
+C302CF14C06C13DF6C9038FFFC3FD8001F13E09238801F809238000F004A90C7FC5C5C5C
+A25CA45CAF003FB512FC4880B7FCA26C5C6C5C2A287EA730>I<90381FFC1E48B5129F00
+0714FF5A5A5A387FF007EB800100FEC7FC4880A46C143E007F91C7FC13E06CB4FC6C13FC
+6CEBFF806C14E0000114F86C6C7F01037F9038000FFF02001380007C147F00FEEC1FC0A2
+150F7EA27F151F6DEB3F806D137F9039FC03FF0090B6FC5D5D00FC14F0D8F83F13C02678
+0FFEC7FC222A79A830>I<EB0780497E131FA9003FB612E04815F0B7FCA36C15E026001F
+C0C7FCB216F8ED01FCA5ECE003010FEB07F814F09138FC1FF06DB512E06D14C016806D14
+009038007FFCEC1FF026337EB130>I<D83FFCEB3FFC486C497E00FF14FFA2007F147F00
+3F143F00001400B3A41501A2150315076D130F903A7FC07FFFF891B612FC6D15FE7F6D49
+13FC6D9038F87FF8010001C0C7FC2F2880A630>I<3B3FFFC07FFF80486DB512C0B515E0
+A26C16C06C496C13803B01F80003F000A26D130700005DA26D130F017E5CA2017F131F6D
+5CA2EC803F011F91C7FCA26E5A010F137EA2ECE0FE01075BA214F101035BA3903801FBF0
+A314FF6D5BA36E5A6E5A2B277EA630>I<3B3FFFC01FFFE0486D4813F0B515F8A26C16F0
+6C496C13E0D807E0C7EA3F00A26D5C0003157EA56D14FE00015DEC0F80EC1FC0EC3FE0A3
+3A00FC7FF1F8A2147DA2ECFDF9017C5C14F8A3017E13FBA290393FF07FE0A3ECE03FA201
+1F5C90390F800F802D277FA630>I<3A3FFF81FFFC4801C37FB580A26C5D6C01815BC648
+C66CC7FC137FEC80FE90383F81FC90381FC3F8EB0FE3ECE7F06DB45A6D5B7F6D5B92C8FC
+147E147F5C497F81903803F7E0EB07E790380FE3F0ECC1F890381F81FC90383F80FE9038
+7F007E017E137F01FE6D7E48486D7E267FFF80B5FCB500C1148014E3A214C16C01801400
+29277DA630>I<3B3FFFC07FFF80486DB512C0B515E0A26C16C06C496C13803B01FC0003
+F000A2000014076D5C137E150F017F5C7F151FD91F805BA214C0010F49C7FCA214E00107
+137EA2EB03F0157C15FCEB01F85DA2EB00F9ECFDF0147D147FA26E5AA36E5AA35DA2143F
+92C8FCA25C147EA2000F13FE486C5AEA3FC1EBC3F81387EB8FF0EBFFE06C5B5C6C90C9FC
+6C5AEA01F02B3C7EA630>I<001FB612FC4815FE5AA316FC90C7EA0FF8ED1FF0ED3FE0ED
+7FC0EDFF80003E491300C7485A4A5A4A5A4A5A4A5A4A5A4A5A4990C7FC495A495A495A49
+5A495A495A4948133E4890C7127F485A485A485A485A485A48B7FCB8FCA46C15FE28277D
+A630>I<ED3FF0913803FFF8140F5C147F16F09138FFF00092C7FC495A5CB3A21303495A
+133F383FFFF0B55A5C91C8FC14C080003F7F38003FF813076D7E1301B3A2806D7E15F091
+387FFFF016F8141F8014039138003FF025477BBE30>I<127CA212FEB3B3B3AD127CA207
+476CBE30>I<EA7FE0EAFFFE6D7E8014F07EC66C7E13076D7E1301B3A2806D7E15E09138
+7FFFE06E13F8801407141F5C4A13E09138FFE00092C7FC495A5CB3A21303495A137F387F
+FFF0B5FC14C05C49C8FCEA7FE025477BBE30>I<017C133848B4137C48EB80FE4813C148
+13C348EBEFFC397FEFFFF0D8FF8713E0010713C0486C1380D87C0113003838007C1F0C78
+B730>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ft cmr10 10.95 86
+/Ft 86 125 df<4AB4EB0FE0021F9038E03FFC913A7F00F8FC1ED901FC90383FF03FD907
+F090397FE07F80494801FF13FF4948485BD93F805C137F0200ED7F00EF003E01FE6D91C7
+FC82ADB97EA3C648C76CC8FCB3AE486C4A7E007FD9FC3FEBFF80A339407FBF35>11
+D<EC03FE91383FFF809138FE03E0903903F800F0D90FE013384948137C90393F8001FE90
+387F00035B5BA2485A6F5AED007093C7FCAA16FEB7FCA33901FC000315011500B3AC486C
+497EB5D8F87F13FCA32E407EBF33>I<EC03FF023F13EE9138FE01FEEB03F090380FE003
+EB1FC0EB3F80EB7F005B5B150148481300AEB7FCA3D801FCC7FCB3AE486C497EB5D8F87F
+13FCA32E407EBF33>I<DA03FE49B4FC91273FFF801F13C0913BFE03E07F01F0903C03F0
+00F1FC0078D90FE0D97FF0131C49484948133E4948484913FF494848495A5B491500A248
+485C03016E5A0300153896C7FCAA197FBBFCA3D801FCC738FE00018485B3AC486C496CEC
+FF80B5D8F87FD9FC3F13FEA347407EBF4C>I<121EEA7F80EAFFC0A9EA7F80ACEA3F00AC
+121EAB120CC7FCA8121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A4179C019>33
+D<001E130F397F803FC000FF137F01C013E0A201E013F0A3007F133F391E600F30000013
+00A401E01370491360A3000114E04913C00003130101001380481303000EEB070048130E
+0018130C0038131C003013181C1C7DBE2D>I<14E0A4EB07FC90383FFF8090B512E03901
+F8E3F03903E0E0FCD807C0133CD80F807FD81F007F003E80003C1580007C140316C00078
+141F00F8143F157FA47EED3F806CEC0E0092C7FC127F138013C0EA3FF013FEEA1FFF6C13
+FC6C13FF6C14C06C806C6C13F8011F7F130301007FECE7FF14E102E01380157F153FED1F
+C0A2003E140F127FD8FF801307A5130000FC158000F0140F1270007815005D6C141E153E
+6C5C6C5C3907C0E1F03903F8EFE0C6B51280D93FFEC7FCEB0FF8EB00E0A422497BC32D>
+36 D<013F1603D9FFC04B7E2601E0E0150F2607C070151F48486C4BC7FC023E157E4848
+6C15FE48D90FC0EB03FC003ED90EF0EB0FF8DA0F3F13FD007E903A070FFFF1F0007C0200
+EB03E0160000FC6D6C495A170F604DC8FC5F173E5F17FC5F4C5A1603007CD907005B4C5A
+007E150F003E495C020E49C9FC003F5D6C49133E260F803C5B023813FC6C6C485B3A01E0
+E001F03800FFC090273F0003E0133F90C70007ECFFC09339C001E0E0923A0F8007C07003
+1F49487E0400143C033E90381F001C037E497F037C133E4B150F0201027E7F4B137C4A5A
+020702FCEB03805D4A5A141F92C7FC143E147E147C5CA2495A0103037CEB07005C494814
+7E010F033E5B4A160E49C8123F496F5B013E92380F803C49173801FC6F6C5A49923801E0
+E0496FB45A0160043FC7FC41497BC34C>I<121EEA7F8012FF13C0A213E0A3127FEA1E60
+1200A413E013C0A312011380120313005A120E5A1218123812300B1C79BE19>39
+D<1430147014E0EB01C0EB03801307EB0F00131E133E133C5B13F85B12015B1203A2485A
+A2120F5BA2121F90C7FCA25AA3123E127EA6127C12FCB2127C127EA6123E123FA37EA27F
+120FA27F1207A26C7EA212017F12007F13787F133E131E7FEB07801303EB01C0EB00E014
+701430145A77C323>I<12C07E12707E7E121E7E6C7E7F12036C7E7F12007F1378137CA2
+7FA2133F7FA21480130FA214C0A3130714E0A6130314F0B214E01307A614C0130FA31480
+A2131F1400A25B133EA25BA2137813F85B12015B485A12075B48C7FC121E121C5A5A5A5A
+145A7BC323>I<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A3120113
+80120313005A120E5A1218123812300B1C798919>44 D<B512FEA617067F961E>I<121E
+EA7F80A2EAFFC0A4EA7F80A2EA1E000A0A798919>I<ED0180ED03C01507A21680150FA2
+16005DA2151E153EA2153C157CA2157815F8A25D1401A25D1403A25D1407A25D140FA24A
+C7FCA2141E143EA2143C147CA2147814F8A25C1301A25C1303A25C1307A25C130FA291C8
+FC5BA2131E133EA25BA2137813F8A25B1201A25B1203A25B1207A25B120FA290C9FC5AA2
+121E123EA2123C127CA2127812F8A25A1260225B7BC32D>I<EB01FE90380FFFC090383F
+03F090387C00F849137C48487F48487F4848EB0F80A2000F15C04848EB07E0A3003F15F0
+A290C712034815F8A64815FCB3A26C15F8A56C6CEB07F0A3001F15E0A36C6CEB0FC0A26C
+6CEB1F80000315006C6C133E6C6C5B017C5B90383F03F090380FFFC0D901FEC7FC263F7D
+BC2D>I<EB01C013031307131F137FEA07FFB5FC139FEAF81F1200B3B3ACEB7FF0B612F8
+A31D3D78BC2D>I<EB07FC90383FFF8090B512E03903F01FF83907C007FC390F0001FE00
+1E6D7E001C1580003CEC7FC05AED3FE01270B4FC6DEB1FF07FA56C5A6CC7FC120CC813E0
+153FA216C0157F168015FF16004A5A5D4A5A4A5A5D4A5A4A5A4AC7FC147E147C5C495A49
+5A495A495A49C71270133E133C5B4914E0485A485A485A48C7120148B6FCA25A4815C0B7
+FCA3243D7CBC2D>I<EB07FC90383FFF809038F80FE03901E003F839078001FCD80F007F
+000E6D7E001E1580D81F80137F486C14C07FA27F5BA2121F6C5AC8138015FF1600A24A5A
+A24A5A5DEC07E04A5A023FC7FCEB1FFCECFF809038000FE0EC07F86E7E6E7E6E7E1680ED
+7FC0A216E0153FA216F0A2120C123F487E487EA316E0A249137F6CC713C01278EDFF807E
+6C4913006C495A3907C007FC3903F80FF0C6B55A013F1380D907F8C7FC243F7CBC2D>I<
+150E151E153EA2157EA215FE1401A21403EC077E1406140E141CA214381470A214E0EB01
+C0A2EB0380EB0700A2130E5BA25B5BA25B5B1201485A90C7FC5A120E120C121C5AA25A5A
+B8FCA3C8EAFE00AC4A7E49B6FCA3283E7EBD2D>I<00061403D80780131F01F813FE90B5
+FC5D5D5D15C092C7FC14FCEB3FE090C9FCACEB01FE90380FFF8090383E03E090387001F8
+496C7E49137E497F90C713800006141FC813C0A216E0150FA316F0A3120C127F7F12FFA4
+16E090C7121F12FC007015C012780038EC3F80123C6CEC7F00001F14FE6C6C485A6C6C48
+5A3903F80FE0C6B55A013F90C7FCEB07F8243F7CBC2D>I<EC1FE0ECFFF8903803F03E90
+380FC00F90391F000780133E017EEB1FC049133F4848137F12035B12074848EB3F80ED1F
+00001F91C7FC5BA2123FA3485AA214FE903887FF8039FF8F07E090389C01F09038B800FC
+01B0137E13F0497F16804914C0A2ED1FE0A34914F0A5127FA6123F6D14E0A2121FED3FC0
+A26C6C1480A20007EC7F006C6C137E6C6C5B6C6C485A90387E07F06DB45A010F1380D903
+FCC7FC243F7CBC2D>I<1238123C123F90B612FCA316F85A16F016E00078C712010070EC
+03C0ED078016005D48141E151C153C5DC8127015F04A5A5D14034A5A92C7FC5C141EA25C
+A2147C147814F8A213015C1303A31307A3130F5CA2131FA6133FAA6D5A0107C8FC26407B
+BD2D>I<EB03FC90381FFF8090387C07E09038F001F83901E0007C48487F48487F48C7FC
+ED0F80121E16C0003E1407A4123FA26DEB0F807F6C6C131F6D140001FC133E6C6C5B9038
+FF80786C6D5A6CEBF3E06CEBFF806C91C7FC133F6D13C06D7F013F13F801787F48486C7E
+3903E01FFF48486C1380260F800313C048487E489038007FE0003E143F007E141F007CEC
+0FF01507481403A31501A46C15E0007C1403A2007E15C06C14076CEC0F806DEB1F006C6C
+133ED807F05B3901FC03F86CB512E0011F1380D903FCC7FC243F7CBC2D>I<EB03FCEB1F
+FF90387E07C09038FC03F048486C7E48486C7E4848137C000F147E4848137F81003F1580
+5B007F15C0A2151F12FF16E0A516F0A5127F153FA36C7EA2001F147F120F6C6C13FF6D13
+DF000313013900F8039F90387E0F1FD91FFE13E0EB07F090C7FCA2ED3FC0A41680157FD8
+0F801400487E486C13FEA24A5A5D49485AEB8007391E000FE0001F495A260FC07FC7FC38
+03FFFE6C13F838003FC0243F7CBC2D>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FC
+B3121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A2779A619>I<121EEA7F80A2EAFFC0A4EA
+7F80A2EA1E00C7FCB3121E127FEAFF80A213C0A4127F121E1200A412011380A312031300
+5A1206120E120C121C5A1230A20A3979A619>I<007FB912E0BA12F0A26C18E0CDFCAE00
+7FB912E0BA12F0A26C18E03C167BA147>61 D<EB1FF890B5FC3903E01FC0390F0007F000
+1EEB03F848EB01FC4814FE140000FE14FF7E7FA46CC7FC123EC7EA01FEA2EC03FCEC07F8
+15F0EC0FC0EC1F80EC3F00143E5C147814F85C13015CA2495AA25CAB91C7FC90C8FCA8EB
+0780EB1FE0A2497EA46D5AA2EB078020407BBF2B>63 D<15074B7EA34B7EA34B7EA34B7E
+A34B7E15E7A2913801C7FC15C3A291380381FEA34AC67EA3020E6D7EA34A6D7EA34A6D7E
+A34A6D7EA34A6D7EA349486D7E91B6FCA249819138800001A249C87EA24982010E157FA2
+011E82011C153FA2013C820138151FA2017882170F13FC00034C7ED80FFF4B7EB500F001
+0FB512F8A33D417DC044>65 D<B712FCEEFF8017F00001903980000FF86C6CC7EA03FE70
+7E701380EF7FC0EF3FE0A2EF1FF0A218F8A3170F171FA318F0A2EF3FE0177F18C0EFFF80
+4C1300EE03FCEE0FF8EE7FE091B6C7FC17E091C7EA07FCEE01FE933800FF80EF7FC0EF3F
+E0EF1FF018F8170F18FC1707A218FEA718FC170FA2EF1FF818F0173FEF7FE0EFFFC00403
+138048486C90380FFE00B85A17E094C7FC373E7DBD40>I<DB3FF01306912603FFFE130E
+020F9038FF801E913A3FF007E03E9139FF8000F8D903FEC7EA7C7ED907F8EC1EFE494814
+0FD93FE0140749481403495A91C812014848150012034848167E5B000F173EA24848161E
+A2123F5B180E127FA349160012FFAC127F7F180EA2123FA27F001F171E181C6C7EA20007
+173C6D16386C6C1678000117706C6C16F06EEC01E06D6C15C06D6C1403D90FF0EC07806D
+6CEC1F00D903FE143E902600FF8013F891393FF007F0020FB512C0020391C7FC9138003F
+F037427BBF42>I<B712FCEEFF8017E000019039C0001FF86C6C48EB03FEEE00FF717E71
+7EEF0FE084717E717E170184717EA21980187F19C0A3F03FE0A519F0AB19E0A5F07FC0A2
+1980A218FF19004D5AA24D5A6017074D5A4D5AEF7FC04DC7FCEE03FE48486CEB1FF8B85A
+178004FCC8FC3C3E7DBD45>I<B912E0A300019038C000016C6C48EB001FEF0FF01703A2
+17011700A31870A418381638A41800A21678A216F81501150791B5FCA3EC800715011500
+1678A21638A2180EA3181C93C7FCA4183C1838A21878A318F8EF01F0A21707170F173F48
+486CEB03FFB912E0A3373E7DBD3E>I<B91280A300019038C000036C6C48EB007FEF1FC0
+170F1707A21703A31701A4EF00E0A21638A31800A31678A216F81501150791B5FCA3EC80
+07150115001678A21638A693C8FCAF3801FFE0B612F0A3333E7DBD3B>I<DB3FE0130C91
+2603FFFE131C021F9038FF803C913A7FF00FC07C9139FF0001F0D903FC90380078FC4948
+143DD91FE0141F4948140F4948140701FF15034890C8FC491501485A000716005B000F17
+7C5B001F173CA2485AA2181C127FA25B95C7FC12FFAB041FB512F0127FA26D9139000FFE
+00EF03FC123FA27F121FA26C7EA212077F12036C7E7F6C7F6D6C14076D7E6D6C140FD907
+F8141ED903FEEC3C7C902600FF80EBF83C913A7FF007F01C021FB5EAC00C020391C8FC91
+38003FF03C427BBF47>I<B6D8C01FB512F8A3000101E0C7383FFC0026007F80EC0FF0B3
+A691B7FCA30280C7120FB3A92601FFE0EC3FFCB6D8C01FB512F8A33D3E7DBD44>I<B612
+F0A3C6EBF000EB3FC0B3B3B2EBFFF0B612F0A31C3E7EBD21>I<011FB512FCA3D9000713
+006E5A1401B3B3A6123FEA7F80EAFFC0A44A5A1380D87F005B007C130700385C003C495A
+6C495A6C495A2603E07EC7FC3800FFF8EB3FC026407CBD2F>I<B600C090387FFFFCA300
+0101E0C7000F138026007F80913807FE0018F818E0604D5A4DC7FC173E5F5F4C5A4C5A4C
+5A4C5A4CC8FC163E5E5E4B5A4B5AED07804B7E151F4B7E4B7E15FF913881EFF8913883C7
+FCEC878791388F03FE91389E01FF14BCDAF8007F4A6D7E5C4A6D7E4A6D7EA2707E707EA2
+707E707EA2707F717E84173F717E717EA2717E848419802601FFE04A13C0B600C090B6FC
+A3403E7DBD47>I<B612F8A3000101E0C9FC38007F80B3B0EF0380A517071800A45FA35F
+A25F5F5F4C5A160748486C133FB8FCA3313E7DBD39>I<B500C093B512C0A300016D4BEB
+E000D8007F1880D977F0ED03BFA3D973F8ED073FA3D971FC150EA2D970FE151CA3027F15
+38A36E6C1470A36E6C14E0A26E6CEB01C0A36E6CEB0380A36E6CEB0700A26E6C130EA36E
+6C5BA3037F5BA26F6C5AA36F6C5AA392380FE1C0A3923807F380A26FB4C7FCA36F5AA213
+F8486C6D5AD807FFEFFFE0B500F80178017FEBFFC0A34A3E7CBD53>I<B56C91B512F880
+80D8007F030713006EEC01FC6E6E5A1870EB77FCEB73FEA2EB71FF01707FA26E7E6E7EA2
+6E7E6E7EA26E7E6E7EA26E7E6E7FA26F7E6F7EA26F7E6F7EA26F7E6F7EA26F7E6F1380A2
+EE7FC0EE3FE0A2EE1FF0EE0FF8A2EE07FCEE03FEA2EE01FF7013F0A2177F173FA2171F17
+0FA2170701F81503487ED807FF1501B500F81400A218703D3E7DBD44>I<ED7FE0913807
+FFFE91391FC03F8091397E0007E04948EB03F8D907F0EB00FE4948147F49486E7E49486E
+7E49C86C7E01FE6F7E00018349150300038348486F7EA248486F7EA2001F188049167F00
+3F18C0A3007F18E049163FA300FF18F0AC007F18E06D167FA4003F18C0A26C6CEEFF80A3
+6C6C4B1300A26C6C4B5A00035F6D150700015F6C6C4B5A6D5E6D6C4A5A6D6C4A5A6D6C4A
+C7FC6D6C14FED901FCEB03F8D9007FEB0FE091391FC03F80912607FFFEC8FC9138007FE0
+3C427BBF47>I<B712F8EEFF8017E000019039C0003FF86C6C48EB07FCEE01FE707EEF7F
+80EF3FC018E0A2EF1FF0A218F8A818F0A2EF3FE0A218C0EF7F80EFFF004C5AEE07FCEE3F
+F091B612C04CC7FC0280C9FCB3A73801FFE0B612C0A3353E7DBD3E>I<ED7FE0913807FF
+FE91391FC03F8091397F000FE0D901FCEB03F8D907F0EB00FE4948147F49486E7E49486E
+7E49C86C7E498248486F7E49150300038348486F7EA2000F834981001F1880A24848EE7F
+C0A3007F18E0A249163FA200FF18F0AC007F18E0A26D167FA3003F18C0A26C6CEEFF80A3
+000F18006D5D0007DA0F805B6C6C90393FE003FCED70706C6C496C485A6C6C48486C485A
+017FD9800E5BD93F819038061FC0D91FC19038073F80D90FE14AC7FCD907F1EB03FE9026
+01FDC013F8903A007EE007E091271FF03FC013180207B5FC9139007FE1E0DB0001143883
+711378A2706C13F0EFFF0318FFA27113E0A37113C0711380711300715AEF01F83D527BBF
+47>I<B712C016FCEEFF800001D9C00013E06C6C48EB1FF0EE07FCEE01FE707E84717EA2
+717EA284A760177F606017FF95C7FCEE01FCEE07F8EE1FE0EEFF8091B500FCC8FC16F091
+388001FCED003FEE1FC0707E707E83160383160183A383A484A4F0C004190EA28218E005
+7F131E2601FFE0161CB600C0EB3FF094381FF83805071370CA3801FFE09438003F803F40
+7DBD43>I<D907FC131890391FFF8038017FEBE0783901FC03F83A03F0007CF8D807C013
+3F4848130F001F140748C7FC003E1403007E1401A2007C140012FC1678A46C1538A27EA2
+6C6C14007F7FEA3FF8EBFF806C13F86CEBFF806C14F06C14FC6C14FF6C15C0013F14E001
+0714F0EB007F020713F89138007FFC150FED07FE15031501ED00FFA200E0157FA3163FA2
+7EA3163E7E167E6C157C6C15FC6C15F86D13016DEB03F06DEB07E0D8F9FCEB0FC03AF07F
+803F8090391FFFFE00D8E00713F839C0007FC028427BBF33>I<003FB91280A3903AF000
+7FE001018090393FC0003F48C7ED1FC0007E1707127C00781703A300701701A548EF00E0
+A5C81600B3B14B7E4B7E0107B612FEA33B3D7DBC42>I<B600C090B512F8A3000101E0C7
+0007130026007F80EC01FC715A1870B3B3A4013F16F06E5DA21701011F5E80010F15036E
+4A5A010793C7FC6D6C5C6D6C141E6D6C5C027F14F86E6C485A91390FF00FE00203B51280
+020049C8FCED1FF03D407DBD44>I<B691380FFFFEA3000301E0020113E06C0180913800
+7F806CEF3F00017F163E181C6E153C013F1638A26E1578011F1670A26D6C5DA26E140101
+075EA26E140301035EA26D6C4AC7FCA2806D150EA26F131E027F141CA26F133C023F1438
+A26E6C5BA26F13F0020F5CA2EDF80102075CA26E6C485AA2EDFE07020191C8FCA26F5A6E
+130EA2ED7F9CA216DCED3FF8A36F5AA36F5AA26F5AA36F5A3F407EBD44>I<B500FE017F
+B5D88007B5FCA3000301C0010101E0C713F86C90C849EC3FE07148EC0F807E7215006E14
+3F017F190E84A26D6C60A24D7E6D6C60A2EFE7F86D6C60A2933801C3FC6E18F001076104
+037F6E0281140101036104077F17006D6C4D5AA2040EEB7F806D6C4DC7FCA24CEB3FC0DA
+7F80160EA24CEB1FE003C0161E023F171C047814F0DBE070010F133C021F173804F014F8
+4C1307DA0FF05EA2DBF1C0EB03FCDA07F95EA2DBFB80EB01FEDA03FF6F5AA293C8FCA26E
+5FA24B157F020094C8FCA24B81037C153EA20378151E0338151C58407EBD5D>I<007FB5
+D8C003B512E0A3C649C7EBFC00D93FF8EC3FE06D48EC1F806D6C92C7FC171E6D6C141C6D
+6C143C5F6D6C14706D6D13F04C5ADA7FC05B023F13036F485ADA1FF090C8FC020F5BEDF8
+1E913807FC1C163C6E6C5A913801FF7016F06E5B6F5AA26F7E6F7EA28282153FED3BFEED
+71FF15F103E07F913801C07F0203804B6C7EEC07004A6D7E020E6D7E5C023C6D7E02386D
+7E14784A6D7E4A6D7F130149486E7E4A6E7E130749C86C7E496F7E497ED9FFC04A7E0007
+6DEC7FFFB500FC0103B512FEA33F3E7EBD44>I<B66C0103B51280A3000101F0C8EBF800
+6C6C48ED3FC0725A013F041EC7FC6D7E606D6C15386D6C1578606D6C5D6E14016D5E6D6D
+1303606E6C49C8FC6E6C5B170E6E6C131E171C6E6C5B6E6C137817706E6C13F06F5B6E13
+016EEB83C05FED7FC7DB3FE7C9FC16EFED1FFE5E150F6F5AB3A4ED1FFC020FB512FCA341
+3E7FBD44>I<003FB712F8A391C7EA1FF013F801E0EC3FE00180EC7FC090C8FC003EEDFF
+80A2003C4A1300007C4A5A12784B5A4B5AA200704A5AA24B5A4B5AA2C8485A4A90C7FCA2
+4A5A4A5AA24A5AA24A5A4A5AA24A5A4A5AA24990C8FCA2495A4948141CA2495A495AA249
+5A495A173C495AA24890C8FC485A1778485A484815F8A24848140116034848140F484814
+3FED01FFB8FCA32E3E7BBD38>I<EAFFFCA4EAF000B3B3B3B3ABEAFFFCA40E5B77C319>I<
+486C13C00003130101001380481303000EEB070048130E0018130C0038131C0030131800
+70133800601330A300E01370481360A400CFEB678039FFC07FE001E013F0A3007F133FA2
+003F131F01C013E0390F0007801C1C73BE2D>I<EAFFFCA4EA003CB3B3B3B3ABEAFFFCA4
+0E5B7FC319>I<EA0180120313005A120E5A12181238123012701260A312E05AA412CFEA
+FFC013E0A3127FA2123F13C0EA0F000B1C7ABE19>96 D<EB0FF8EBFFFE3903F01F803907
+8007E0000F6D7E9038E001F8D81FF07F6E7EA3157F6C5AEA0380C8FCA4EC1FFF0103B5FC
+90381FF87FEB7F803801FC00EA07F8EA0FE0485A485AA248C7FCEE038012FEA315FFA300
+7F5BEC03BF3B3F80071F8700261FC00E13CF3A07F03C0FFE3A01FFF807FC3A003FC001F0
+292A7DA82D>I<EA01FC12FFA3120712031201B1EC03FC91381FFF8091387C07E09039FD
+E001F09039FFC000FC4A137E91C77E49158049141F17C0EE0FE0A217F0A2160717F8AA17
+F0A2160FA217E0161F17C06D1580EE3F006D5C6E13FE9039F3C001F89039F1E003F09039
+E0780FC09026C03FFFC7FCC7EA07F82D407EBE33>I<49B4FC010F13E090383F00F8017C
+131E4848131F4848137F0007ECFF80485A5B121FA24848EB7F00151C007F91C7FCA290C9
+FC5AAB6C7EA3003FEC01C07F001F140316806C6C13076C6C14000003140E6C6C131E6C6C
+137890383F01F090380FFFC0D901FEC7FC222A7DA828>I<ED01FC15FFA3150715031501
+B114FF010713E190381F80F990387E003D49131FD803F81307485A49130348481301121F
+123F5B127FA290C7FCA25AAA7E7FA2123FA26C7E000F14037F000714076C6C497E6C6C49
+7ED8007C017913F890383F01F190380FFFC1903A01FE01FC002D407DBE33>I<EB01FE90
+380FFFC090383F03F09038FC01F848486C7E4848137E48487F000F158049131F001F15C0
+4848130FA2127F16E090C7FCA25AA290B6FCA290C9FCA67EA27F123F16E06C7E1501000F
+15C06C6C13036DEB07806C6C1400C66C131E017E5B90381F80F8903807FFE0010090C7FC
+232A7EA828>I<EC1FC0EC7FF8903801F83C903807E07E90380FC0FFEB1FC1EB3F811401
+137FEC00FE01FE137C1500AEB6FCA3C648C7FCB3AE487E007F13FFA320407EBF1C>I<16
+7C903903F801FF903A1FFF078F8090397E0FDE1F9038F803F83803F001A23B07E000FC06
+00000F6EC7FC49137E001F147FA8000F147E6D13FE00075C6C6C485AA23901F803E03903
+FE0FC026071FFFC8FCEB03F80006CAFC120EA3120FA27F7F6CB512E015FE6C6E7E6C15E0
+6C810003813A0FC0001FFC48C7EA01FE003E140048157E825A82A46C5D007C153E007E15
+7E6C5D6C6C495A6C6C495AD803F0EB0FC0D800FE017FC7FC90383FFFFC010313C0293D7E
+A82D>I<EA01FC12FFA3120712031201B1EC01FE913807FFC091381E07E091387803F091
+38E001F8D9FDC07F148001FF6D7E91C7FCA25BA25BB3A6486C497EB5D8F87F13FCA32E3F
+7DBE33>I<EA01E0EA07F8A2487EA46C5AA2EA01E0C8FCACEA01FC127FA3120712031201
+B3AC487EB512F0A3143E7DBD1A>I<1478EB01FEA2EB03FFA4EB01FEA2EB00781400AC14
+7FEB7FFFA313017F147FB3B3A5123E127F38FF807E14FEA214FCEB81F8EA7F01387C03F0
+381E07C0380FFF803801FC00185185BD1C>I<EA01FC12FFA3120712031201B292B51280
+A392383FFC0016E0168093C7FC153C5D5D4A5AEC07C04A5A4AC8FC143E147F4A7E13FD90
+38FFDFC0EC9FE0140F496C7E01FC7F496C7E1401816E7E81826F7E151F826F7EA282486C
+14FEB539F07FFFE0A32B3F7EBE30>I<EA01FC12FFA3120712031201B3B3B1487EB512F8
+A3153F7DBE1A>I<2701F801FE14FF00FF902707FFC00313E0913B1E07E00F03F0913B78
+03F03C01F80007903BE001F87000FC2603F9C06D487F000101805C01FBD900FF147F91C7
+5B13FF4992C7FCA2495CB3A6486C496CECFF80B5D8F87FD9FC3F13FEA347287DA74C>I<
+3901F801FE00FF903807FFC091381E07E091387803F000079038E001F82603F9C07F0001
+138001FB6D7E91C7FC13FF5BA25BB3A6486C497EB5D8F87F13FCA32E287DA733>I<14FF
+010713E090381F81F890387E007E01F8131F4848EB0F804848EB07C04848EB03E0000F15
+F04848EB01F8A2003F15FCA248C812FEA44815FFA96C15FEA36C6CEB01FCA3001F15F86C
+6CEB03F0A26C6CEB07E06C6CEB0FC06C6CEB1F80D8007EEB7E0090383F81FC90380FFFF0
+010090C7FC282A7EA82D>I<3901FC03FC00FF90381FFF8091387C0FE09039FDE003F03A
+07FFC001FC6C496C7E6C90C7127F49EC3F805BEE1FC017E0A2EE0FF0A3EE07F8AAEE0FF0
+A4EE1FE0A2EE3FC06D1580EE7F007F6E13FE9138C001F89039FDE007F09039FC780FC0DA
+3FFFC7FCEC07F891C9FCAD487EB512F8A32D3A7EA733>I<02FF131C0107EBC03C90381F
+80F090397F00387C01FC131CD803F8130E4848EB0FFC150748481303121F485A1501485A
+A448C7FCAA6C7EA36C7EA2001F14036C7E15076C6C130F6C7E6C6C133DD8007E13799038
+3F81F190380FFFC1903801FE0190C7FCAD4B7E92B512F8A32D3A7DA730>I<3901F807E0
+00FFEB1FF8EC787CECE1FE3807F9C100031381EA01FB1401EC00FC01FF1330491300A35B
+B3A5487EB512FEA31F287EA724>I<90383FC0603901FFF8E03807C03F381F000F003E13
+07003C1303127C0078130112F81400A27E7E7E6D1300EA7FF8EBFFC06C13F86C13FE6C7F
+6C1480000114C0D8003F13E0010313F0EB001FEC0FF800E01303A214017E1400A27E15F0
+7E14016C14E06CEB03C0903880078039F3E01F0038E0FFFC38C01FE01D2A7DA824>I<13
+1CA6133CA4137CA213FCA2120112031207001FB512C0B6FCA2D801FCC7FCB3A215E0A912
+009038FE01C0A2EB7F03013F138090381F8700EB07FEEB01F81B397EB723>I<D801FC14
+FE00FF147FA3000714030003140100011400B3A51501A31503120015076DEB06FF017E01
+0E13806D4913FC90381FC078903807FFE00100903880FE002E297DA733>I<B539E00FFF
+E0A32707FE000313006C48EB00FC5E00015D7F00005DA26D13016D5CA26D6C485AA2ECC0
+07011F91C7FCA290380FE00EA2ECF01E0107131CA26D6C5AA2ECFC7801011370A2ECFEF0
+01005BA2EC7FC0A36E5AA26EC8FCA3140E2B287EA630>I<B53BC3FFFE03FFF8A3290FFE
+003FE00013C06C486D48EB3F806C4817006D010F141E00016F131C15076D163C00004A6C
+1338A2017F5E4B7E151DD93F805DED3DFC1538D91FC04A5AED78FE9238707E03D90FE001
+7F5BEDE03F02F0140701070387C7FC9138F1C01F02F9148F010315CE9138FB800F02FF14
+DE6D15FCED00076D5DA24A1303027E5CA2027C1301023C5C023813003D287EA642>I<B5
+39F01FFFE0A30003D9C00F1300C690388007F8D97F0013E002805BD93FC05B011F49C7FC
+90380FE00EECF01E6D6C5A01035B6D6C5A6E5AEB00FF6E5A6E5A81141F814A7E81147BEC
+F1FC903801E1FEECC0FF01037F49486C7ED90F007F011E6D7E013E130F496D7E01FC8048
+6C80000F4A7EB539803FFFF8A32D277FA630>I<B539E00FFFE0A32707FE000313006C48
+EB01FC6F5A00015D7F00005DA2017F495AA2EC8003013F5CA26D6C48C7FCA26E5A010F13
+0EA26D6C5AA2ECF83C01031338A26D6C5AA2ECFEF001005BA2EC7FC0A36E5AA36EC8FCA2
+140EA2141E141C143C1438A2147800181370127EB45BA2495AA248485AD87E07C9FCEA78
+0EEA3C3CEA1FF8EA07E02B3A7EA630>I<001FB61280A2EBE0000180140049485A001E49
+5A121C4A5A003C495A141F00385C4A5A147F5D4AC7FCC6485AA2495A495A130F5C495A90
+393FC00380A2EB7F80EBFF005A5B484813071207491400485A48485BA248485B4848137F
+00FF495A90B6FCA221277EA628>I<BE12C0A25A0280985B>124 D
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fu cmbx12 20.736 13
+/Fu 13 118 df<BDFC1CFEF4FFC01DF81DFF1EC01EF08AC7003F49C9000F14FE09018075
+6C800A1F807680768076807680A27680A2777FA2208089A320C0A289A565A32080A35314
+00A29AB55AA2525C6764525C525C525C525C5249C7FC51B55A090714F0093F14C00807B6
+C8FC93BA12F81DC0651DFCF5FF801EF04CCA14FC0A3F13FF0A0F800A0314E076807614FC
+777F777F2080897714C020E0A27714F0A220F88920FCA47714FEA96520FCA45314F8A265
+20F06520E05314C0659AB61280521500525C1C0F5214F899B65A09075DC05A9CC7FC1EFC
+1EF01EC053C8FC1DE00AF8C9FC777679F58A>66 D<B800C051B8128071637163A37163A2
+7163C7003F57C8FC71F33FBFA203EF6DF37F3FA303E76E1AFEA203E36EF101FCA203E16E
+F103F8A203E06EF107F0A3706DF10FE0A2706DF11FC0A2706DF13F80A2706DF17F00A370
+6E18FEA2706E4D5AA2706E4D5AA3706E4D5AA2716D4D5AA2716D4D5AA2716D4D5AA3716D
+4DC7FCA2716E16FEA2716E4B5AA2716E4B5AA3716E4B5AA2726D4B5AA2726D4B5AA3726D
+4B5AA2726D4BC8FCA2726E14FEA2726E495AA3726E495AA2726E495AA2736D495AA2736D
+495AA3736D495AA2736D49C9FCA273EC80FEA2F481FC7314C1A273ECE3F8A273ECF7F0A2
+74EBFFE0A3745CA2745CA27491CAFCA2745BA3745BA2902603FFFE705BB800F897BA1280
+745BA2755AA3755A755AA97679F5B8>77 D<BC7E1BFF1CF01CFF1DC01DF81DFE777EC700
+3F91C8000715E0E0003F80090714FC090180756C7F7680768076807680A276808B888BA3
+7680A38CAA9DC8FCA3525CA267A2525C676467525C525C5291C9FC99B512FC515C090F5C
+097F14C0080FB6CAFC94B912FC1DE09ACBFC1CF81CFE767E94C8003F14E0080780080114
+FC746C7F757F7580758075807580A275808A87A28A888AA78BA78BA779147E22FFA288A2
+8B765E22FE76802103766E14FCBA00C06E6E1307766EEB0FF876ED801F779138E07FF00B
+1F91B512E00B0716C00B011680E3003FECFE00D1000714F8E4000F13E088787AF590>82
+D<92383FFFF80207B612E0027F15FC49B87E010717E0011F83499026F0007F13FC4948C7
+000F7F90B502036D7E486E6D806F6D80727F486E6E7F8486727FA28684A26C5C72806C5C
+6D90C8FC6D5AEB0FF8EB03E090CAFCA70507B6FC041FB7FC0303B8FC157F0203B9FC021F
+ECFE0391B612800103ECF800010F14C04991C7FC017F13FC90B512F04814C0485C4891C8
+FC485B5A485B5C5A5CA2B5FC5CA360A36E5DA26C5F6E5D187E6C6D846E4A48806C6D4A48
+14FC6C6ED90FF0ECFFFC6C02E090263FE07F14FE00019139FC03FFC06C91B6487E013F4B
+487E010F4B1307010303F01301D9003F0280D9003F13FC020101F8CBFC57507ACE5E>97
+D<93383FFFF00307B612C0033F15F84AB712FE0207707E021F17E0027F8391B526FC001F
+7F010302C001037F4991C7487F49495C495B4901F04A7F5B90B55A485CA2485C4891C8FC
+A248715B5C48715B725B4A6F5B489438007FC0071FC7FC96C8FC5AA25CA3B5FCAF7E80A4
+7E80A27E806CF11F80F23FC06C6E167FA26C6EEEFF80816C606C6E17006D6D4B5A6D6D15
+076D6D4B5A6D6D6C4A5A6D02E0EC7FF06D02F849485A01009126FF801F5B6E91B6C7FC02
+1F5E020716F8020116E06E6C1580030702FCC8FCDB003F13804A507ACE56>99
+D<93387FFF80030FB512FC037FECFF804AB712E0020716F8021F16FE027FD9F8077F49B5
+D8C000804991C7003F13E04901FC020F7F49496E7F49498049496E7F49496E7F90B55A48
+727E92C914804884485B1BC048841BE0485BA27313F05AA25C5AA21BF885A2B5FCA391BA
+FCA41BF002F8CCFCA67EA3807EA47E806CF103F0F207F86C7F1A0F6C6E17F06C191F6F17
+E06C6E163F6D6DEE7FC06D6D16FF6D6D4B13806D6D4B13006D6D6CEC0FFE6D02E0EC3FFC
+6D02F8ECFFF86D9126FFC00F5B023F91B65A020F178002034CC7FC020016F8031F15E003
+0392C8FCDB000F13E04D507BCE58>101 D<EF7FFE040FB512C093B612F0030715FC031F
+814B8192B5D8F01F13800203DA803F13C04A9026FC007F13E04A4990B5FC4A5B4A494814
+F04A13C091B51280A2491400A2495BA27114E05B4B6E13C0721380721300F007FC95C8FC
+B3B912C0A8D8000749CAFCB3B3B3A7007FB712FCA844797AF83B>I<903801FFFCB6FCA8
+C67E131F7FB3AD95380FFFE095B512FE05036E7E050F15E0053F15F84D81932701FFF01F
+7F4CD900077FDC07FC6D80DC0FF06D80DC1FC07F4C48824CC8FC047E6F7F5EEDFDF85E03
+FF707F5EA25EA25EA293C9FCA45DB3B3A6B8D8E003B81280A8617879F76C>104
+D<903801FFFCB6FCA8C67E131F7FB3B3B3B3B3ABB812C0A82A7879F735>108
+D<902601FFF891380FFFE0B692B512FE05036E7E050F15E0053F15F84D81932701FFF01F
+7F4CD900077FDC07FC6D80C66CDA0FF06D80011FDA1FC07F6D4A48824CC8FC047E6F7F5E
+EDF9F85E03FB707F5E15FF5EA25EA293C9FCA45DB3B3A6B8D8E003B81280A8614E79CD6C
+>110 D<902601FFF8EB07FEB691383FFFC094B512F00403804C14FE4C8093261FFC3F13
+8093263FE07F13C0DC7F80B5FCC66C5D011FDAFE0114E06DEBF9FC16F815FB16F016E015
+FF16C07114C05E72138095381FFE0093C76C5AF001E095C8FCA25DA65DB3B3A2B812F8A8
+434E7ACD4F>114 D<912603FFFCEB0780027F9039FFE00FC00103B6EAF83F010FEDFEFF
+013F92B5FC49EB000F2601FFF01300480180143F4890C8120F4848814848814981123F83
+485A187FA212FF6D163FA37F7F6DEE1F8002C092C7FC14F014FEECFFF06CECFF8016FEEE
+FFE06C16FC6C16FF18C06C836C17F86C836C836C83013F17806D17C0010717E0010117F0
+EB003F020716F8EC001F030015FC1607EE007F051F13FE1707007E82B482836D167FA218
+3F7F181FA27F19FC7FA26D163F6D17F86D167F19F06D16FF6E4A13E002E04A13C06E4A13
+8002FE023F1300913AFFC003FFFE01E790B65A01C316F0018016C026FE003F92C7FC4801
+0714F80070D9007F90C8FC3F507ACE4C>I<DAFFFE933803FFF8B60303B6FCA8C66CEE00
+01011F717E6D84B3B3A862A497B5FCA261A2616D5F1ADF6F150F6DEF1F9F073F806D6EDA
+7F1F13FF6D6ED901FEEDFF8070EB07FC023F01FEEB3FF86E90B612F06E16C00203168002
+00EDFE00031F14F80300028003C0C7FC614F79CD6C>117 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: Letter
+letter
+%%EndPaperSize
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 150 1318 a Fu(Bash)64 b(Reference)j(Man)-5 b(ual)p
+150 1385 3600 34 v 2361 1481 a Ft(Reference)31 b(Do)s(cumen)m(tation)h
+(for)e(Bash)2181 1589 y(Edition)e(3.0,)k(for)e Fs(Bash)f
+Ft(V)-8 b(ersion)30 b(3.0-alpha.)3139 1697 y(No)m(v)m(em)m(b)s(er)h
+(2003)150 4935 y Fr(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
+%%Page: 2 2
+2 1 bop 150 2889 a Ft(This)34 b(text)i(is)f(a)h(brief)e(description)g
+(of)h(the)h(features)g(that)g(are)g(presen)m(t)g(in)e(the)i(Bash)f
+(shell)f(\(v)m(ersion)150 2999 y(3.0-alpha,)d(13)g(No)m(v)m(em)m(b)s
+(er)h(2003\).)150 3133 y(This)c(is)i(Edition)e(3.0,)j(last)f(up)s
+(dated)f(13)i(No)m(v)m(em)m(b)s(er)h(2003,)g(of)e Fq(The)g(GNU)h(Bash)f
+(Reference)h(Man)m(ual)p Ft(,)150 3243 y(for)f Fs(Bash)p
+Ft(,)g(V)-8 b(ersion)30 b(3.0-alpha.)150 3377 y(Cop)m(yrigh)m(t)602
+3374 y(c)577 3377 y Fp(\015)g Ft(1988-2003)k(F)-8 b(ree)32
+b(Soft)m(w)m(are)f(F)-8 b(oundation,)31 b(Inc.)150 3512
+y(P)m(ermission)f(is)i(gran)m(ted)h(to)f(mak)m(e)i(and)d(distribute)f
+(v)m(erbatim)i(copies)g(of)g(this)f(man)m(ual)h(pro)m(vided)f(the)150
+3621 y(cop)m(yrigh)m(t)g(notice)f(and)g(this)f(p)s(ermission)f(notice)i
+(are)h(preserv)m(ed)f(on)h(all)e(copies.)390 3756 y(P)m(ermission)k(is)
+i(gran)m(ted)g(to)h(cop)m(y)-8 b(,)38 b(distribute)33
+b(and/or)i(mo)s(dify)e(this)h(do)s(cumen)m(t)h(under)390
+3866 y(the)j(terms)g(of)g(the)g(GNU)h(F)-8 b(ree)39 b(Do)s(cumen)m
+(tation)g(License,)g(V)-8 b(ersion)38 b(1.1)h(or)f(an)m(y)g(later)390
+3975 y(v)m(ersion)27 b(published)c(b)m(y)28 b(the)f(F)-8
+b(ree)29 b(Soft)m(w)m(are)f(F)-8 b(oundation;)29 b(with)d(no)h(In)m(v)
+-5 b(arian)m(t)27 b(Sections,)390 4085 y(with)i(the)i(F)-8
+b(ron)m(t-Co)m(v)m(er)33 b(texts)e(b)s(eing)f(\\A)h(GNU)g(Man)m(ual,")g
+(and)f(with)f(the)i(Bac)m(k-Co)m(v)m(er)390 4194 y(T)-8
+b(exts)33 b(as)g(in)e(\(a\))i(b)s(elo)m(w.)46 b(A)33
+b(cop)m(y)g(of)f(the)h(license)e(is)h(included)d(in)i(the)i(section)f
+(en)m(titled)390 4304 y(\\GNU)f(F)-8 b(ree)32 b(Do)s(cumen)m(tation)f
+(License.")390 4438 y(\(a\))39 b(The)f(FSF's)g(Bac)m(k-Co)m(v)m(er)j(T)
+-8 b(ext)39 b(is:)55 b(\\Y)-8 b(ou)39 b(ha)m(v)m(e)g(freedom)f(to)h
+(cop)m(y)f(and)g(mo)s(dify)390 4548 y(this)31 b(GNU)j(Man)m(ual,)f(lik)
+m(e)f(GNU)h(soft)m(w)m(are.)49 b(Copies)31 b(published)e(b)m(y)j(the)h
+(F)-8 b(ree)34 b(Soft)m(w)m(are)390 4658 y(F)-8 b(oundation)30
+b(raise)g(funds)e(for)j(GNU)g(dev)m(elopmen)m(t.")150
+4902 y(Published)c(b)m(y)j(the)h(F)-8 b(ree)31 b(Soft)m(w)m(are)h(F)-8
+b(oundation)150 5011 y(59)31 b(T)-8 b(emple)30 b(Place,)h(Suite)e(330,)
+150 5121 y(Boston,)j(MA)e(02111-1307)150 5230 y(USA)p
+eop
+%%Page: -1 3
+-1 2 bop 3725 -116 a Ft(i)150 299 y Fo(T)-13 b(able)54
+b(of)g(Con)l(ten)l(ts)150 641 y Fr(1)135 b(In)l(tro)t(duction)15
+b Fn(.)20 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f
+(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)60
+b Fr(1)449 778 y Ft(1.1)92 b(What)31 b(is)e(Bash?)21
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)51 b Ft(1)449 888 y(1.2)92
+b(What)31 b(is)e(a)i(shell?)14 b Fm(.)f(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44
+b Ft(1)150 1130 y Fr(2)135 b(De\014nitions)37 b Fn(.)19
+b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h
+(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)81
+b Fr(3)150 1400 y(3)135 b(Basic)45 b(Shell)g(F)-11 b(eatures)12
+b Fn(.)20 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f
+(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)57 b Fr(5)449 1537 y Ft(3.1)92
+b(Shell)28 b(Syn)m(tax)22 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)52
+b Ft(5)748 1646 y(3.1.1)93 b(Shell)28 b(Op)s(eration)10
+b Fm(.)k(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40
+b Ft(5)748 1756 y(3.1.2)93 b(Quoting)10 b Fm(.)k(.)h(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40
+b Ft(5)1047 1866 y(3.1.2.1)93 b(Escap)s(e)30 b(Character)24
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)53 b Ft(6)1047 1975 y(3.1.2.2)93
+b(Single)29 b(Quotes)15 b Fm(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)45
+b Ft(6)1047 2085 y(3.1.2.3)93 b(Double)30 b(Quotes)15
+b Fm(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)44 b Ft(6)1047 2194 y(3.1.2.4)93
+b(ANSI-C)30 b(Quoting)18 b Fm(.)c(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48
+b Ft(6)1047 2304 y(3.1.2.5)93 b(Lo)s(cale-Sp)s(eci\014c)30
+b(T)-8 b(ranslation)11 b Fm(.)j(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)41 b Ft(7)748 2413 y(3.1.3)93 b(Commen)m(ts)25
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)55 b Ft(7)449 2523 y(3.2)92 b(Shell)28 b(Commands)23
+b Fm(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)53 b Ft(7)748 2633 y(3.2.1)93
+b(Simple)28 b(Commands)15 b Fm(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)45 b Ft(8)748 2742 y(3.2.2)93 b(Pip)s(elines)14
+b Fm(.)e(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)44 b Ft(8)748 2852 y(3.2.3)93 b(Lists)29
+b(of)i(Commands)23 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+54 b Ft(8)748 2961 y(3.2.4)93 b(Comp)s(ound)28 b(Commands)17
+b Fm(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47 b Ft(9)1047 3071
+y(3.2.4.1)93 b(Lo)s(oping)29 b(Constructs)d Fm(.)15 b(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56
+b Ft(9)1047 3181 y(3.2.4.2)93 b(Conditional)28 b(Constructs)18
+b Fm(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47
+b Ft(10)1047 3290 y(3.2.4.3)93 b(Grouping)29 b(Commands)13
+b Fm(.)h(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)42 b Ft(13)449 3400 y(3.3)92 b(Shell)28 b(F)-8 b(unctions)8
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)38 b Ft(13)449 3509 y(3.4)92
+b(Shell)28 b(P)m(arameters)20 b Fm(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49 b
+Ft(14)748 3619 y(3.4.1)93 b(P)m(ositional)29 b(P)m(arameters)14
+b Fm(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)43 b Ft(15)748 3729
+y(3.4.2)93 b(Sp)s(ecial)28 b(P)m(arameters)h Fm(.)15
+b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 b Ft(15)449
+3838 y(3.5)92 b(Shell)28 b(Expansions)20 b Fm(.)13 b(.)i(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49
+b Ft(16)748 3948 y(3.5.1)93 b(Brace)31 b(Expansion)d
+Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)58
+b Ft(17)748 4057 y(3.5.2)93 b(Tilde)28 b(Expansion)17
+b Fm(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47
+b Ft(17)748 4167 y(3.5.3)93 b(Shell)28 b(P)m(arameter)j(Expansion)18
+b Fm(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)47 b Ft(18)748 4276 y(3.5.4)93 b(Command)29
+b(Substitution)d Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)58 b Ft(21)748
+4386 y(3.5.5)93 b(Arithmetic)29 b(Expansion)12 b Fm(.)i(.)h(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)42 b Ft(21)748 4496 y(3.5.6)93 b(Pro)s(cess)30
+b(Substitution)19 b Fm(.)13 b(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49
+b Ft(21)748 4605 y(3.5.7)93 b(W)-8 b(ord)30 b(Splitting)23
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55
+b Ft(22)748 4715 y(3.5.8)93 b(Filename)29 b(Expansion)24
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 b Ft(22)1047
+4824 y(3.5.8.1)93 b(P)m(attern)31 b(Matc)m(hing)20 b
+Fm(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)49 b Ft(23)748 4934 y(3.5.9)93 b(Quote)30
+b(Remo)m(v)-5 b(al)15 b Fm(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)44 b Ft(24)449 5044 y(3.6)92 b(Redirections)22
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53 b Ft(24)748 5153
+y(3.6.1)93 b(Redirecting)29 b(Input)11 b Fm(.)j(.)h(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)40 b Ft(25)748 5263 y(3.6.2)93 b(Redirecting)29
+b(Output)18 b Fm(.)13 b(.)i(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47
+b Ft(25)p eop
+%%Page: -2 4
+-2 3 bop 150 -116 a Ft(ii)2610 b(Bash)31 b(Reference)g(Man)m(ual)748
+83 y(3.6.3)93 b(App)s(ending)27 b(Redirected)j(Output)16
+b Fm(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)45 b Ft(26)748 193 y(3.6.4)93 b(Redirecting)29 b(Standard)g(Output)
+g(and)h(Standard)f(Error)954 302 y Fm(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)54 b Ft(26)748 412 y(3.6.5)93 b(Here)30
+b(Do)s(cumen)m(ts)13 b Fm(.)k(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)43 b Ft(26)748 521 y(3.6.6)93 b(Here)30 b(Strings)10
+b Fm(.)k(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)39 b Ft(26)748 631 y(3.6.7)93 b(Duplicating)28 b(File)i(Descriptors)
+17 b Fm(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)47 b Ft(27)748 741 y(3.6.8)93 b(Mo)m(ving)30
+b(File)g(Descriptors)15 b Fm(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)44
+b Ft(27)748 850 y(3.6.9)93 b(Op)s(ening)28 b(File)h(Descriptors)h(for)g
+(Reading)g(and)g(W)-8 b(riting)954 960 y Fm(.)16 b(.)f(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)54 b Ft(27)449 1069 y(3.7)92
+b(Executing)30 b(Commands)25 b Fm(.)15 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Ft(27)748 1179 y(3.7.1)93
+b(Simple)28 b(Command)h(Expansion)24 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55 b
+Ft(27)748 1289 y(3.7.2)93 b(Command)29 b(Searc)m(h)i(and)e(Execution)13
+b Fm(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)42
+b Ft(28)748 1398 y(3.7.3)93 b(Command)29 b(Execution)h(En)m(vironmen)m
+(t)18 b Fm(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)47
+b Ft(29)748 1508 y(3.7.4)93 b(En)m(vironmen)m(t)21 b
+Fm(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+50 b Ft(30)748 1617 y(3.7.5)93 b(Exit)29 b(Status)8 b
+Fm(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)37 b Ft(30)748 1727 y(3.7.6)93 b(Signals)10 b
+Fm(.)j(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)39 b Ft(31)449 1836 y(3.8)92 b(Shell)28
+b(Scripts)21 b Fm(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)51
+b Ft(31)150 2079 y Fr(4)135 b(Shell)45 b(Builtin)g(Commands)38
+b Fn(.)19 b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h
+(.)f(.)82 b Fr(33)449 2216 y Ft(4.1)92 b(Bourne)30 b(Shell)e(Builtins)
+16 b Fm(.)c(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)45 b Ft(33)449 2325 y(4.2)92 b(Bash)30 b(Builtin)e(Commands)17
+b Fm(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46
+b Ft(39)449 2435 y(4.3)92 b(The)30 b(Set)g(Builtin)22
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)53 b Ft(50)449 2545 y(4.4)92
+b(Sp)s(ecial)29 b(Builtins)22 b Fm(.)12 b(.)j(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)52
+b Ft(53)150 2787 y Fr(5)135 b(Shell)45 b(V)-11 b(ariables)10
+b Fn(.)21 b(.)e(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f
+(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)55 b Fr(55)449
+2924 y Ft(5.1)92 b(Bourne)30 b(Shell)e(V)-8 b(ariables)11
+b Fm(.)k(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40
+b Ft(55)449 3034 y(5.2)92 b(Bash)30 b(V)-8 b(ariables)17
+b Fm(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)46 b Ft(55)150 3276 y Fr(6)135
+b(Bash)44 b(F)-11 b(eatures)31 b Fn(.)20 b(.)f(.)g(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)
+g(.)h(.)75 b Fr(63)449 3413 y Ft(6.1)92 b(In)m(v)m(oking)30
+b(Bash)f Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)58 b Ft(63)449 3523
+y(6.2)92 b(Bash)30 b(Startup)g(Files)24 b Fm(.)15 b(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)55
+b Ft(65)449 3632 y(6.3)92 b(In)m(teractiv)m(e)32 b(Shells)14
+b Fm(.)f(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)43 b Ft(67)748 3742 y(6.3.1)93 b(What)31
+b(is)e(an)h(In)m(teractiv)m(e)i(Shell?)20 b Fm(.)13 b(.)i(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49
+b Ft(67)748 3851 y(6.3.2)93 b(Is)30 b(this)f(Shell)f(In)m(teractiv)m
+(e?)10 b Fm(.)17 b(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40 b Ft(67)748
+3961 y(6.3.3)93 b(In)m(teractiv)m(e)31 b(Shell)e(Beha)m(vior)22
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)51 b Ft(67)449 4071 y(6.4)92 b(Bash)30
+b(Conditional)e(Expressions)20 b Fm(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)49 b Ft(68)449 4180 y(6.5)92 b(Shell)28 b(Arithmetic)f
+Fm(.)15 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)57 b Ft(70)449 4290 y(6.6)92 b(Aliases)23
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53
+b Ft(71)449 4399 y(6.7)92 b(Arra)m(ys)29 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)58 b Ft(72)449 4509 y(6.8)92
+b(The)30 b(Directory)h(Stac)m(k)15 b Fm(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44 b Ft(73)748
+4619 y(6.8.1)93 b(Directory)30 b(Stac)m(k)i(Builtins)10
+b Fm(.)j(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)40 b Ft(73)449 4728 y(6.9)92
+b(Con)m(trolling)28 b(the)j(Prompt)15 b Fm(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 b Ft(74)449 4838 y(6.10)92
+b(The)30 b(Restricted)h(Shell)11 b Fm(.)i(.)i(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)40 b Ft(76)449 4947
+y(6.11)92 b(Bash)31 b(POSIX)e(Mo)s(de)16 b Fm(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)45 b
+Ft(76)p eop
+%%Page: -3 5
+-3 4 bop 3674 -116 a Ft(iii)150 83 y Fr(7)135 b(Job)45
+b(Con)l(trol)32 b Fn(.)20 b(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)
+76 b Fr(79)449 220 y Ft(7.1)92 b(Job)30 b(Con)m(trol)g(Basics)23
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)52 b Ft(79)449 330 y(7.2)92 b(Job)30 b(Con)m(trol)g
+(Builtins)12 b Fm(.)g(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)41 b Ft(80)449 439 y(7.3)92 b(Job)30
+b(Con)m(trol)g(V)-8 b(ariables)28 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)58 b Ft(81)150 682
+y Fr(8)135 b(Command)45 b(Line)g(Editing)38 b Fn(.)19
+b(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)81 b Fr(83)449 819 y Ft(8.1)92 b(In)m(tro)s(duction)29
+b(to)i(Line)e(Editing)22 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)53 b Ft(83)449 928 y(8.2)92 b(Readline)29 b(In)m(teraction)15
+b Fm(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)44 b Ft(83)748 1038 y(8.2.1)93 b(Readline)29 b(Bare)i(Essen)m
+(tials)23 b Fm(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)54 b Ft(83)748
+1147 y(8.2.2)93 b(Readline)29 b(Mo)m(v)m(emen)m(t)j(Commands)13
+b Fm(.)h(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+42 b Ft(84)748 1257 y(8.2.3)93 b(Readline)29 b(Killing)e(Commands)20
+b Fm(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)50 b Ft(84)748 1367 y(8.2.4)93 b(Readline)29
+b(Argumen)m(ts)23 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53
+b Ft(85)748 1476 y(8.2.5)93 b(Searc)m(hing)29 b(for)i(Commands)e(in)g
+(the)h(History)25 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)54
+b Ft(85)449 1586 y(8.3)92 b(Readline)29 b(Init)g(File)e
+Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)56 b Ft(86)748 1695 y(8.3.1)93 b(Readline)29
+b(Init)g(File)g(Syn)m(tax)12 b Fm(.)k(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)41
+b Ft(86)748 1805 y(8.3.2)93 b(Conditional)27 b(Init)j(Constructs)f
+Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)59 b Ft(91)748 1914 y(8.3.3)93 b(Sample)29
+b(Init)g(File)21 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)51 b Ft(92)449 2024 y(8.4)92 b(Bindable)29 b(Readline)g
+(Commands)12 b Fm(.)i(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)41
+b Ft(95)748 2134 y(8.4.1)93 b(Commands)29 b(F)-8 b(or)31
+b(Mo)m(ving)c Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Ft(95)748
+2243 y(8.4.2)93 b(Commands)29 b(F)-8 b(or)31 b(Manipulating)d(The)i
+(History)18 b Fm(.)d(.)g(.)g(.)g(.)g(.)g(.)47 b Ft(95)748
+2353 y(8.4.3)93 b(Commands)29 b(F)-8 b(or)31 b(Changing)e(T)-8
+b(ext)30 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)58 b Ft(96)748 2462 y(8.4.4)93 b(Killing)27
+b(And)i(Y)-8 b(anking)17 b Fm(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)46
+b Ft(98)748 2572 y(8.4.5)93 b(Sp)s(ecifying)27 b(Numeric)j(Argumen)m
+(ts)25 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)54 b Ft(98)748 2682 y(8.4.6)93 b(Letting)30
+b(Readline)f(T)m(yp)s(e)h(F)-8 b(or)31 b(Y)-8 b(ou)19
+b Fm(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+49 b Ft(99)748 2791 y(8.4.7)93 b(Keyb)s(oard)29 b(Macros)10
+b Fm(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40
+b Ft(100)748 2901 y(8.4.8)93 b(Some)30 b(Miscellaneous)f(Commands)12
+b Fm(.)i(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)42
+b Ft(101)449 3010 y(8.5)92 b(Readline)29 b(vi)g(Mo)s(de)d
+Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)55 b Ft(103)449 3120 y(8.6)92 b(Programmable)30
+b(Completion)12 b Fm(.)h(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)41
+b Ft(103)449 3230 y(8.7)92 b(Programmable)30 b(Completion)f(Builtins)12
+b Fm(.)g(.)j(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)42 b Ft(105)150 3472 y Fr(9)135 b(Using)45
+b(History)h(In)l(teractiv)l(ely)14 b Fn(.)22 b(.)d(.)h(.)f(.)g(.)h(.)f
+(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)58 b Fr(109)449 3609 y
+Ft(9.1)92 b(Bash)30 b(History)g(F)-8 b(acilities)11 b
+Fm(.)k(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)41
+b Ft(109)449 3719 y(9.2)92 b(Bash)30 b(History)g(Builtins)9
+b Fm(.)k(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)38
+b Ft(109)449 3828 y(9.3)92 b(History)30 b(Expansion)d
+Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)58 b Ft(111)748 3938 y(9.3.1)93 b(Ev)m(en)m(t)31
+b(Designators)21 b Fm(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)51
+b Ft(111)748 4047 y(9.3.2)93 b(W)-8 b(ord)30 b(Designators)f
+Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)58 b Ft(112)748
+4157 y(9.3.3)93 b(Mo)s(di\014ers)26 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)57 b Ft(113)150
+4399 y Fr(10)135 b(Installing)46 b(Bash)30 b Fn(.)20
+b(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f
+(.)h(.)f(.)g(.)h(.)f(.)h(.)74 b Fr(115)449 4536 y Ft(10.1)92
+b(Basic)31 b(Installation)26 b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 b Ft(115)449
+4646 y(10.2)92 b(Compilers)28 b(and)i(Options)22 b Fm(.)14
+b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)51
+b Ft(115)449 4755 y(10.3)92 b(Compiling)28 b(F)-8 b(or)31
+b(Multiple)d(Arc)m(hitectures)12 b Fm(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)41 b Ft(116)449
+4865 y(10.4)92 b(Installation)29 b(Names)22 b Fm(.)16
+b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)51
+b Ft(116)449 4975 y(10.5)92 b(Sp)s(ecifying)28 b(the)j(System)f(T)m(yp)
+s(e)11 b Fm(.)k(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)41 b Ft(116)449
+5084 y(10.6)92 b(Sharing)29 b(Defaults)21 b Fm(.)15 b(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)51
+b Ft(117)449 5194 y(10.7)92 b(Op)s(eration)29 b(Con)m(trols)12
+b Fm(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)41 b Ft(117)449 5303 y(10.8)92 b(Optional)29 b(F)-8
+b(eatures)17 b Fm(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)
+g(.)g(.)g(.)g(.)g(.)47 b Ft(117)p eop
+%%Page: -4 6
+-4 5 bop 150 -116 a Ft(iv)2588 b(Bash)31 b(Reference)g(Man)m(ual)150
+83 y Fr(App)t(endix)44 b(A)99 b(Rep)t(orting)46 b(Bugs)12
+b Fn(.)20 b(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)
+56 b Fr(123)150 353 y(App)t(endix)44 b(B)105 b(Ma)7 b(jor)46
+b(Di\013erences)g(F)-11 b(rom)45 b(The)f(Bourne)419 486
+y(Shell)17 b Fn(.)j(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g
+(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)
+f(.)h(.)f(.)61 b Fr(125)449 623 y Ft(B.1)92 b(Implemen)m(tation)29
+b(Di\013erences)i(F)-8 b(rom)31 b(The)f(SVR4.2)h(Shell)21
+b Fm(.)13 b(.)i(.)g(.)g(.)50 b Ft(129)150 865 y Fr(App)t(endix)44
+b(C)104 b(Cop)l(ying)46 b(This)e(Man)l(ual)27 b Fn(.)20
+b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)71 b Fr(131)449 1002
+y Ft(C.1)91 b(GNU)31 b(F)-8 b(ree)32 b(Do)s(cumen)m(tation)f(License)26
+b Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)56 b Ft(131)748 1112 y(C.1.1)92 b(ADDENDUM:)32
+b(Ho)m(w)f(to)h(use)e(this)f(License)h(for)g(y)m(our)930
+1221 y(do)s(cumen)m(ts)c Fm(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Ft(137)150 1464
+y Fr(Index)45 b(of)g(Shell)g(Builtin)h(Commands)27 b
+Fn(.)19 b(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)71
+b Fr(139)150 1733 y(Index)45 b(of)g(Shell)g(Reserv)l(ed)h(W)-11
+b(ords)41 b Fn(.)20 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h
+(.)85 b Fr(141)150 2003 y(P)l(arameter)47 b(and)d(V)-11
+b(ariable)46 b(Index)27 b Fn(.)19 b(.)g(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h
+(.)f(.)h(.)f(.)g(.)71 b Fr(143)150 2273 y(F)-11 b(unction)44
+b(Index)36 b Fn(.)19 b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)80
+b Fr(145)150 2543 y(Concept)45 b(Index)18 b Fn(.)i(.)f(.)h(.)f(.)g(.)h
+(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)
+h(.)f(.)g(.)h(.)f(.)h(.)62 b Fr(147)p eop
+%%Page: 1 7
+1 6 bop 150 -116 a Ft(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2591
+b(1)150 299 y Fo(1)80 b(In)l(tro)t(duction)150 675 y
+Fr(1.1)68 b(What)45 b(is)g(Bash?)275 923 y Ft(Bash)29
+b(is)g(the)g(shell,)g(or)g(command)g(language)h(in)m(terpreter,)g(for)f
+(the)h Fl(gnu)f Ft(op)s(erating)g(system.)40 b(The)150
+1033 y(name)33 b(is)f(an)h(acron)m(ym)g(for)g(the)g(`)p
+Fs(Bourne-Again)27 b(SHell)p Ft(',)32 b(a)i(pun)d(on)i(Stephen)f
+(Bourne,)h(the)g(author)150 1142 y(of)f(the)f(direct)g(ancestor)i(of)e
+(the)h(curren)m(t)f(Unix)f(shell)g Fs(sh)p Ft(,)h(whic)m(h)f(app)s
+(eared)h(in)f(the)i(Sev)m(en)m(th)g(Edition)150 1252
+y(Bell)e(Labs)g(Researc)m(h)h(v)m(ersion)f(of)g(Unix.)275
+1391 y(Bash)f(is)f(largely)h(compatible)f(with)g Fs(sh)h
+Ft(and)g(incorp)s(orates)f(useful)g(features)h(from)g(the)g(Korn)g
+(shell)150 1500 y Fs(ksh)37 b Ft(and)h(the)g(C)g(shell)e
+Fs(csh)p Ft(.)64 b(It)38 b(is)f(in)m(tended)g(to)i(b)s(e)f(a)g
+(conforman)m(t)h(implemen)m(tation)e(of)h(the)g Fl(ieee)150
+1610 y(posix)44 b Ft(Shell)f(and)i(T)-8 b(o)s(ols)45
+b(sp)s(eci\014cation)e(\()p Fl(ieee)i Ft(W)-8 b(orking)46
+b(Group)e(1003.2\).)88 b(It)45 b(o\013ers)h(functional)150
+1719 y(impro)m(v)m(emen)m(ts)31 b(o)m(v)m(er)g Fs(sh)f
+Ft(for)g(b)s(oth)g(in)m(teractiv)m(e)h(and)f(programming)f(use.)275
+1858 y(While)g(the)i Fl(gnu)f Ft(op)s(erating)g(system)h(pro)m(vides)e
+(other)i(shells,)e(including)e(a)k(v)m(ersion)f(of)h
+Fs(csh)p Ft(,)f(Bash)150 1968 y(is)i(the)i(default)e(shell.)47
+b(Lik)m(e)33 b(other)h Fl(gnu)f Ft(soft)m(w)m(are,)i(Bash)f(is)e(quite)
+h(p)s(ortable.)48 b(It)33 b(curren)m(tly)f(runs)g(on)150
+2077 y(nearly)27 b(ev)m(ery)h(v)m(ersion)f(of)g(Unix)g(and)f(a)i(few)f
+(other)h(op)s(erating)f(systems)g Fp(\000)g Ft(indep)s(enden)m
+(tly-supp)s(orted)150 2187 y(p)s(orts)j(exist)g(for)g
+Fl(ms-dos)p Ft(,)f Fl(os/2)p Ft(,)i(and)f(Windo)m(ws)f(platforms.)150
+2455 y Fr(1.2)68 b(What)45 b(is)g(a)h(shell?)275 2703
+y Ft(A)m(t)41 b(its)e(base,)k(a)e(shell)d(is)h(simply)f(a)j(macro)f
+(pro)s(cessor)g(that)h(executes)g(commands.)70 b(The)40
+b(term)150 2813 y(macro)29 b(pro)s(cessor)f(means)g(functionalit)m(y)f
+(where)h(text)i(and)e(sym)m(b)s(ols)f(are)h(expanded)g(to)h(create)h
+(larger)150 2922 y(expressions.)275 3061 y(A)k(Unix)g(shell)f(is)g(b)s
+(oth)h(a)h(command)g(in)m(terpreter)f(and)g(a)h(programming)e
+(language.)54 b(As)35 b(a)g(com-)150 3170 y(mand)30 b(in)m(terpreter,)h
+(the)h(shell)d(pro)m(vides)h(the)i(user)e(in)m(terface)i(to)g(the)f
+(ric)m(h)g(set)h(of)f Fl(gnu)g Ft(utilities.)40 b(The)150
+3280 y(programming)25 b(language)i(features)g(allo)m(w)f(these)h
+(utilitites)d(to)j(b)s(e)f(com)m(bined.)39 b(Files)25
+b(con)m(taining)h(com-)150 3390 y(mands)j(can)i(b)s(e)e(created,)j(and)
+d(b)s(ecome)i(commands)f(themselv)m(es.)41 b(These)30
+b(new)f(commands)h(ha)m(v)m(e)i(the)150 3499 y(same)f(status)h(as)f
+(system)g(commands)g(in)f(directories)g(suc)m(h)h(as)g(`)p
+Fs(/bin)p Ft(',)g(allo)m(wing)f(users)g(or)h(groups)f(to)150
+3609 y(establish)f(custom)h(en)m(vironmen)m(ts)g(to)h(automate)h(their)
+e(common)g(tasks.)275 3748 y(Shells)h(ma)m(y)j(b)s(e)f(used)g(in)m
+(teractiv)m(ely)h(or)g(non-in)m(teractiv)m(ely)-8 b(.)51
+b(In)33 b(in)m(teractiv)m(e)h(mo)s(de,)h(they)e(accept)150
+3857 y(input)20 b(t)m(yp)s(ed)i(from)g(the)h(k)m(eyb)s(oard.)37
+b(When)22 b(executing)h(non-in)m(teractiv)m(ely)-8 b(,)24
+b(shells)d(execute)i(commands)150 3967 y(read)30 b(from)g(a)h(\014le.)
+275 4105 y(A)41 b(shell)e(allo)m(ws)h(execution)i(of)f
+Fl(gnu)g Ft(commands,)i(b)s(oth)e(sync)m(hronously)e(and)i(async)m
+(hronously)-8 b(.)150 4215 y(The)29 b(shell)e(w)m(aits)j(for)f(sync)m
+(hronous)f(commands)h(to)h(complete)g(b)s(efore)f(accepting)g(more)h
+(input;)e(asyn-)150 4325 y(c)m(hronous)22 b(commands)h(con)m(tin)m(ue)g
+(to)g(execute)h(in)d(parallel)g(with)h(the)g(shell)f(while)g(it)h
+(reads)h(and)f(executes)150 4434 y(additional)32 b(commands.)50
+b(The)33 b Fq(redirection)f Ft(constructs)i(p)s(ermit)e(\014ne-grained)
+g(con)m(trol)i(of)g(the)g(input)150 4544 y(and)40 b(output)f(of)i
+(those)f(commands.)70 b(Moreo)m(v)m(er,)45 b(the)c(shell)d(allo)m(ws)h
+(con)m(trol)i(o)m(v)m(er)h(the)e(con)m(ten)m(ts)i(of)150
+4653 y(commands')30 b(en)m(vironmen)m(ts.)275 4792 y(Shells)i(also)j
+(pro)m(vide)g(a)g(small)f(set)h(of)g(built-in)d(commands)j(\()p
+Fq(builtins)t Ft(\))d(implemen)m(ting)h(function-)150
+4902 y(alit)m(y)j(imp)s(ossible)d(or)j(incon)m(v)m(enien)m(t)h(to)g
+(obtain)f(via)g(separate)h(utilities.)57 b(F)-8 b(or)37
+b(example,)h Fs(cd)p Ft(,)f Fs(break)p Ft(,)150 5011
+y Fs(continue)p Ft(,)43 b(and)f Fs(exec)p Ft(\))g(cannot)h(b)s(e)e
+(implemen)m(ted)g(outside)h(of)g(the)h(shell)d(b)s(ecause)j(they)f
+(directly)150 5121 y(manipulate)35 b(the)i(shell)d(itself.)59
+b(The)36 b Fs(history)p Ft(,)g Fs(getopts)p Ft(,)g Fs(kill)p
+Ft(,)h(or)g Fs(pwd)f Ft(builtins,)e(among)k(others,)150
+5230 y(could)32 b(b)s(e)g(implemen)m(ted)f(in)h(separate)h(utilities,)e
+(but)h(they)h(are)h(more)f(con)m(v)m(enien)m(t)g(to)h(use)e(as)h
+(builtin)150 5340 y(commands.)40 b(All)29 b(of)i(the)f(shell)f
+(builtins)e(are)k(describ)s(ed)d(in)h(subsequen)m(t)h(sections.)p
+eop
+%%Page: 2 8
+2 7 bop 150 -116 a Ft(2)2617 b(Bash)31 b(Reference)g(Man)m(ual)275
+299 y(While)37 b(executing)i(commands)f(is)f(essen)m(tial,)k(most)e(of)
+g(the)g(p)s(o)m(w)m(er)f(\(and)g(complexit)m(y\))h(of)g(shells)150
+408 y(is)33 b(due)g(to)i(their)e(em)m(b)s(edded)g(programming)g
+(languages.)51 b(Lik)m(e)34 b(an)m(y)g(high-lev)m(el)f(language,)j(the)
+e(shell)150 518 y(pro)m(vides)29 b(v)-5 b(ariables,)30
+b(\015o)m(w)g(con)m(trol)h(constructs,)g(quoting,)f(and)g(functions.)
+275 653 y(Shells)19 b(o\013er)k(features)f(geared)h(sp)s(eci\014cally)d
+(for)i(in)m(teractiv)m(e)h(use)f(rather)g(than)g(to)h(augmen)m(t)g(the)
+f(pro-)150 762 y(gramming)31 b(language.)47 b(These)32
+b(in)m(teractiv)m(e)h(features)f(include)e(job)i(con)m(trol,)i(command)
+d(line)g(editing,)150 872 y(command)f(history)f(and)h(aliases.)40
+b(Eac)m(h)31 b(of)g(these)g(features)f(is)g(describ)s(ed)e(in)h(this)g
+(man)m(ual.)p eop
+%%Page: 3 9
+3 8 bop 150 -116 a Ft(Chapter)30 b(2:)41 b(De\014nitions)2660
+b(3)150 299 y Fo(2)80 b(De\014nitions)275 527 y Ft(These)30
+b(de\014nitions)e(are)i(used)g(throughout)g(the)g(remainder)f(of)i
+(this)e(man)m(ual.)150 684 y Fs(POSIX)240 b Ft(A)41 b(family)e(of)i(op)
+s(en)g(system)g(standards)f(based)g(on)h(Unix.)71 b(Bash)41
+b(is)f(concerned)h(with)630 794 y Fl(posix)30 b Ft(1003.2,)j(the)d
+(Shell)f(and)g(T)-8 b(o)s(ols)30 b(Standard.)150 950
+y Fs(blank)240 b Ft(A)30 b(space)h(or)g(tab)f(c)m(haracter.)150
+1107 y Fs(builtin)144 b Ft(A)35 b(command)g(that)g(is)f(implemen)m(ted)
+f(in)m(ternally)g(b)m(y)i(the)g(shell)e(itself,)i(rather)f(than)h(b)m
+(y)630 1217 y(an)30 b(executable)h(program)f(somewhere)h(in)e(the)h
+(\014le)g(system.)150 1374 y Fs(control)e(operator)630
+1484 y Ft(A)c Fs(word)e Ft(that)i(p)s(erforms)f(a)h(con)m(trol)g
+(function.)37 b(It)24 b(is)e(a)i Fs(newline)e Ft(or)i(one)g(of)f(the)h
+(follo)m(wing:)630 1593 y(`)p Fs(||)p Ft(',)31 b(`)p
+Fs(&&)p Ft(',)f(`)p Fs(&)p Ft(',)h(`)p Fs(;)p Ft(',)g(`)p
+Fs(;;)p Ft(',)f(`)p Fs(|)p Ft(',)h(`)p Fs(\()p Ft(',)g(or)f(`)p
+Fs(\))p Ft('.)150 1750 y Fs(exit)f(status)630 1860 y
+Ft(The)f(v)-5 b(alue)28 b(returned)f(b)m(y)h(a)h(command)f(to)h(its)f
+(caller.)39 b(The)28 b(v)-5 b(alue)28 b(is)f(restricted)h(to)i(eigh)m
+(t)630 1969 y(bits,)g(so)g(the)h(maxim)m(um)e(v)-5 b(alue)30
+b(is)f(255.)150 2126 y Fs(field)240 b Ft(A)27 b(unit)f(of)h(text)h
+(that)g(is)e(the)h(result)f(of)h(one)h(of)f(the)g(shell)e(expansions.)
+39 b(After)27 b(expansion,)630 2236 y(when)e(executing)g(a)h(command,)h
+(the)f(resulting)d(\014elds)h(are)i(used)f(as)h(the)g(command)f(name)
+630 2346 y(and)30 b(argumen)m(ts.)150 2503 y Fs(filename)96
+b Ft(A)30 b(string)g(of)g(c)m(haracters)i(used)e(to)h(iden)m(tify)e(a)h
+(\014le.)150 2659 y Fs(job)336 b Ft(A)31 b(set)h(of)f(pro)s(cesses)g
+(comprising)e(a)i(pip)s(eline,)d(and)j(an)m(y)g(pro)s(cesses)g
+(descended)g(from)f(it,)630 2769 y(that)h(are)g(all)e(in)g(the)i(same)f
+(pro)s(cess)g(group.)150 2926 y Fs(job)f(control)630
+3036 y Ft(A)22 b(mec)m(hanism)f(b)m(y)g(whic)m(h)g(users)g(can)h
+(selectiv)m(ely)f(stop)h(\(susp)s(end\))e(and)h(restart)i(\(resume\))
+630 3145 y(execution)31 b(of)f(pro)s(cesses.)150 3302
+y Fs(metacharacter)630 3412 y Ft(A)25 b(c)m(haracter)i(that,)g(when)d
+(unquoted,)i(separates)g(w)m(ords.)38 b(A)26 b(metac)m(haracter)i(is)c
+(a)h Fs(blank)630 3521 y Ft(or)30 b(one)h(of)g(the)f(follo)m(wing)f(c)m
+(haracters:)42 b(`)p Fs(|)p Ft(',)31 b(`)p Fs(&)p Ft(',)g(`)p
+Fs(;)p Ft(',)g(`)p Fs(\()p Ft(',)f(`)p Fs(\))p Ft(',)h(`)p
+Fs(<)p Ft(',)g(or)f(`)p Fs(>)p Ft('.)150 3678 y Fs(name)288
+b Ft(A)37 b Fs(word)f Ft(consisting)g(solely)h(of)g(letters,)i(n)m(um)m
+(b)s(ers,)f(and)f(underscores,)h(and)f(b)s(eginning)630
+3788 y(with)22 b(a)h(letter)g(or)g(underscore.)38 b Fs(Name)p
+Ft(s)22 b(are)h(used)f(as)i(shell)d(v)-5 b(ariable)22
+b(and)g(function)g(names.)630 3898 y(Also)30 b(referred)g(to)h(as)f(an)
+h Fs(identifier)p Ft(.)150 4055 y Fs(operator)96 b Ft(A)38
+b Fs(control)28 b(operator)36 b Ft(or)h(a)i Fs(redirection)27
+b(operator)p Ft(.)61 b(See)38 b(Section)f(3.6)i([Redirec-)630
+4164 y(tions],)30 b(page)h(24,)h(for)e(a)h(list)e(of)h(redirection)f
+(op)s(erators.)150 4321 y Fs(process)f(group)630 4431
+y Ft(A)i(collection)h(of)f(related)g(pro)s(cesses)h(eac)m(h)g(ha)m
+(ving)f(the)h(same)f(pro)s(cess)g(group)g Fl(id)p Ft(.)150
+4588 y Fs(process)e(group)h(ID)630 4697 y Ft(A)h(unique)f(iden)m(tifer)
+g(that)i(represen)m(ts)f(a)h Fs(process)d(group)h Ft(during)f(its)i
+(lifetime.)150 4854 y Fs(reserved)e(word)630 4964 y Ft(A)h
+Fs(word)e Ft(that)i(has)f(a)h(sp)s(ecial)e(meaning)g(to)i(the)g(shell.)
+38 b(Most)30 b(reserv)m(ed)e(w)m(ords)g(in)m(tro)s(duce)630
+5073 y(shell)h(\015o)m(w)h(con)m(trol)h(constructs,)g(suc)m(h)f(as)g
+Fs(for)g Ft(and)g Fs(while)p Ft(.)150 5230 y Fs(return)f(status)630
+5340 y Ft(A)h(synon)m(ym)g(for)g Fs(exit)g(status)p Ft(.)p
+eop
+%%Page: 4 10
+4 9 bop 150 -116 a Ft(4)2617 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fs(signal)192 b Ft(A)40 b(mec)m(hanism)g(b)m(y)f(whic)m(h)g(a)i
+(pro)s(cess)e(ma)m(y)i(b)s(e)e(noti\014ed)g(b)m(y)h(the)h(k)m(ernel)e
+(of)h(an)g(ev)m(en)m(t)630 408 y(o)s(ccurring)29 b(in)g(the)i(system.)
+150 568 y Fs(special)d(builtin)630 677 y Ft(A)e(shell)f(builtin)e
+(command)j(that)h(has)f(b)s(een)f(classi\014ed)g(as)h(sp)s(ecial)f(b)m
+(y)h(the)h Fl(posix)e Ft(1003.2)630 787 y(standard.)150
+946 y Fs(token)240 b Ft(A)38 b(sequence)h(of)f(c)m(haracters)h
+(considered)e(a)i(single)e(unit)f(b)m(y)i(the)h(shell.)62
+b(It)38 b(is)f(either)h(a)630 1056 y Fs(word)29 b Ft(or)i(an)f
+Fs(operator)p Ft(.)150 1215 y Fs(word)288 b Ft(A)30 b
+Fs(token)f Ft(that)i(is)f(not)g(an)h Fs(operator)p Ft(.)p
+eop
+%%Page: 5 11
+5 10 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2292 b(5)150 299 y Fo(3)80 b(Basic)55
+b(Shell)f(F)-13 b(eatures)275 544 y Ft(Bash)27 b(is)f(an)h(acron)m(ym)h
+(for)f(`)p Fs(Bourne-Again)g(SHell)p Ft('.)39 b(The)26
+b(Bourne)h(shell)f(is)g(the)h(traditional)f(Unix)150
+653 y(shell)32 b(originally)f(written)h(b)m(y)h(Stephen)g(Bourne.)50
+b(All)32 b(of)i(the)f(Bourne)h(shell)d(builtin)f(commands)k(are)150
+763 y(a)m(v)-5 b(ailable)29 b(in)e(Bash,)j(The)f(rules)f(for)h(ev)-5
+b(aluation)29 b(and)f(quoting)h(are)g(tak)m(en)i(from)d(the)i
+Fl(posix)e Ft(sp)s(eci\014ca-)150 872 y(tion)i(for)g(the)h(`standard')f
+(Unix)f(shell.)275 1010 y(This)h(c)m(hapter)j(brie\015y)d(summarizes)h
+(the)i(shell's)d(`building)f(blo)s(c)m(ks':)44 b(commands,)32
+b(con)m(trol)h(struc-)150 1120 y(tures,)38 b(shell)c(functions,)i
+(shell)f Fm(p)-5 b(ar)g(ameters)p Ft(,)41 b(shell)34
+b(expansions,)j Fm(r)-5 b(e)g(dir)g(e)g(ctions)p Ft(,)40
+b(whic)m(h)35 b(are)i(a)f(w)m(a)m(y)h(to)150 1230 y(direct)30
+b(input)e(and)i(output)g(from)g(and)g(to)h(named)f(\014les,)f(and)h(ho)
+m(w)g(the)h(shell)e(executes)i(commands.)150 1496 y Fr(3.1)68
+b(Shell)45 b(Syn)l(tax)275 1744 y Ft(When)32 b(the)h(shell)e(reads)i
+(input,)f(it)g(pro)s(ceeds)g(through)h(a)g(sequence)g(of)g(op)s
+(erations.)47 b(If)33 b(the)g(input)150 1853 y(indicates)c(the)h(b)s
+(eginning)d(of)j(a)g(commen)m(t,)h(the)f(shell)e(ignores)h(the)h
+(commen)m(t)h(sym)m(b)s(ol)e(\(`)p Fs(#)p Ft('\),)i(and)e(the)150
+1963 y(rest)i(of)f(that)h(line.)275 2101 y(Otherwise,)g(roughly)f(sp)s
+(eaking,)i(the)g(shell)e(reads)i(its)f(input)f(and)i(divides)d(the)k
+(input)d(in)m(to)h(w)m(ords)150 2210 y(and)23 b(op)s(erators,)j(emplo)m
+(ying)c(the)i(quoting)g(rules)e(to)i(select)h(whic)m(h)d(meanings)h(to)
+i(assign)e(v)-5 b(arious)22 b(w)m(ords)150 2320 y(and)30
+b(c)m(haracters.)275 2458 y(The)38 b(shell)f(then)h(parses)g(these)h
+(tok)m(ens)h(in)m(to)e(commands)h(and)f(other)h(constructs,)i(remo)m(v)
+m(es)f(the)150 2568 y(sp)s(ecial)29 b(meaning)g(of)h(certain)g(w)m
+(ords)g(or)g(c)m(haracters,)i(expands)d(others,)h(redirects)g(input)e
+(and)h(output)150 2677 y(as)d(needed,)g(executes)g(the)g(sp)s
+(eci\014ed)d(command,)k(w)m(aits)e(for)g(the)g(command's)g(exit)h
+(status,)g(and)f(mak)m(es)150 2787 y(that)31 b(exit)f(status)h(a)m(v)-5
+b(ailable)30 b(for)g(further)f(insp)s(ection)f(or)j(pro)s(cessing.)150
+3018 y Fk(3.1.1)63 b(Shell)41 b(Op)s(eration)275 3266
+y Ft(The)28 b(follo)m(wing)f(is)h(a)h(brief)e(description)g(of)i(the)g
+(shell's)e(op)s(eration)i(when)e(it)i(reads)f(and)g(executes)j(a)150
+3375 y(command.)40 b(Basically)-8 b(,)31 b(the)f(shell)f(do)s(es)h(the)
+h(follo)m(wing:)199 3513 y(1.)61 b(Reads)42 b(its)g(input)e(from)i(a)g
+(\014le)g(\(see)h(Section)f(3.8)h([Shell)d(Scripts],)k(page)f(31\),)k
+(from)41 b(a)i(string)330 3623 y(supplied)24 b(as)k(an)f(argumen)m(t)g
+(to)h(the)g(`)p Fs(-c)p Ft(')f(in)m(v)m(o)s(cation)g(option)g(\(see)h
+(Section)g(6.1)g([In)m(v)m(oking)f(Bash],)330 3732 y(page)k(63\),)h(or)
+e(from)g(the)h(user's)f(terminal.)199 3869 y(2.)61 b(Breaks)43
+b(the)g(input)e(in)m(to)h(w)m(ords)g(and)g(op)s(erators,)k(ob)s(eying)c
+(the)h(quoting)f(rules)f(describ)s(ed)f(in)330 3978 y(Section)26
+b(3.1.2)j([Quoting],)e(page)g(6.)40 b(These)26 b(tok)m(ens)i(are)f
+(separated)g(b)m(y)f Fs(metacharacters)p Ft(.)36 b(Alias)330
+4088 y(expansion)29 b(is)h(p)s(erformed)e(b)m(y)j(this)e(step)h(\(see)i
+(Section)e(6.6)h([Aliases],)g(page)g(71\).)199 4224 y(3.)61
+b(P)m(arses)35 b(the)g(tok)m(ens)g(in)m(to)g(simple)d(and)i(comp)s
+(ound)f(commands)h(\(see)h(Section)g(3.2)g([Shell)e(Com-)330
+4334 y(mands],)d(page)h(8\).)199 4470 y(4.)61 b(P)m(erforms)40
+b(the)h(v)-5 b(arious)39 b(shell)g(expansions)g(\(see)i(Section)f(3.5)h
+([Shell)e(Expansions],)i(page)g(16\),)330 4580 y(breaking)34
+b(the)h(expanded)g(tok)m(ens)h(in)m(to)f(lists)e(of)i(\014lenames)g
+(\(see)h(Section)e(3.5.8)j([Filename)e(Ex-)330 4689 y(pansion],)29
+b(page)i(22\))h(and)e(commands)g(and)g(argumen)m(ts.)199
+4826 y(5.)61 b(P)m(erforms)36 b(an)m(y)i(necessary)f(redirections)e
+(\(see)j(Section)e(3.6)i([Redirections],)g(page)g(24\))g(and)e(re-)330
+4935 y(mo)m(v)m(es)c(the)e(redirection)f(op)s(erators)i(and)f(their)f
+(op)s(erands)g(from)h(the)h(argumen)m(t)f(list.)199 5071
+y(6.)61 b(Executes)31 b(the)g(command)f(\(see)h(Section)f(3.7)i
+([Executing)e(Commands],)g(page)h(28\).)199 5208 y(7.)61
+b(Optionally)37 b(w)m(aits)i(for)g(the)g(command)g(to)h(complete)f(and)
+g(collects)g(its)g(exit)g(status)g(\(see)h(Sec-)330 5317
+y(tion)30 b(3.7.5)i([Exit)e(Status],)h(page)g(30\).)p
+eop
+%%Page: 6 12
+6 11 bop 150 -116 a Ft(6)2617 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fk(3.1.2)63 b(Quoting)275 543 y Ft(Quoting)23 b(is)g(used)g(to)h
+(remo)m(v)m(e)i(the)e(sp)s(ecial)e(meaning)h(of)h(certain)g(c)m
+(haracters)i(or)d(w)m(ords)h(to)g(the)g(shell.)150 653
+y(Quoting)j(can)g(b)s(e)g(used)f(to)j(disable)c(sp)s(ecial)h(treatmen)m
+(t)j(for)e(sp)s(ecial)f(c)m(haracters,)k(to)e(prev)m(en)m(t)g(reserv)m
+(ed)150 762 y(w)m(ords)i(from)g(b)s(eing)f(recognized)h(as)h(suc)m(h,)f
+(and)g(to)h(prev)m(en)m(t)g(parameter)g(expansion.)275
+897 y(Eac)m(h)22 b(of)g(the)g(shell)e(metac)m(haracters)k(\(see)f
+(Chapter)e(2)i([De\014nitions],)f(page)h(3\))g(has)e(sp)s(ecial)g
+(meaning)150 1006 y(to)40 b(the)g(shell)d(and)i(m)m(ust)g(b)s(e)g
+(quoted)g(if)g(it)g(is)f(to)i(represen)m(t)g(itself.)66
+b(When)39 b(the)h(command)f(history)150 1116 y(expansion)e(facilities)g
+(are)h(b)s(eing)f(used,)j(the)e Fq(history)g(expansion)f
+Ft(c)m(haracter,)42 b(usually)36 b(`)p Fs(!)p Ft(',)k(m)m(ust)f(b)s(e)
+150 1225 y(quoted)27 b(to)g(prev)m(en)m(t)g(history)e(expansion.)38
+b(See)27 b(Section)f(9.1)i([Bash)e(History)g(F)-8 b(acilities],)27
+b(page)g(109,)i(for)150 1335 y(more)i(details)e(concerning)h(history)f
+(expansion.)275 1469 y(There)37 b(are)h(three)f(quoting)g(mec)m
+(hanisms:)55 b(the)38 b Fq(escap)s(e)g(c)m(haracter)p
+Ft(,)j(single)36 b(quotes,)k(and)d(double)150 1579 y(quotes.)150
+1803 y Fk(3.1.2.1)63 b(Escap)s(e)41 b(Character)275 2047
+y Ft(A)27 b(non-quoted)g(bac)m(kslash)g(`)p Fs(\\)p Ft(')g(is)f(the)i
+(Bash)f(escap)s(e)g(c)m(haracter.)42 b(It)27 b(preserv)m(es)g(the)g
+(literal)f(v)-5 b(alue)27 b(of)150 2157 y(the)g(next)g(c)m(haracter)h
+(that)f(follo)m(ws,)g(with)e(the)i(exception)f(of)h Fs(newline)p
+Ft(.)38 b(If)26 b(a)h Fs(\\newline)d Ft(pair)h(app)s(ears,)150
+2267 y(and)30 b(the)h(bac)m(kslash)f(itself)f(is)h(not)h(quoted,)g(the)
+f Fs(\\newline)f Ft(is)g(treated)j(as)f(a)g(line)e(con)m(tin)m(uation)h
+(\(that)150 2376 y(is,)g(it)g(is)f(remo)m(v)m(ed)i(from)f(the)h(input)d
+(stream)j(and)f(e\013ectiv)m(ely)h(ignored\).)150 2600
+y Fk(3.1.2.2)63 b(Single)42 b(Quotes)275 2844 y Ft(Enclosing)34
+b(c)m(haracters)k(in)c(single)h(quotes)i(\(`)p Fs(')p
+Ft('\))f(preserv)m(es)h(the)f(literal)e(v)-5 b(alue)36
+b(of)g(eac)m(h)h(c)m(haracter)150 2954 y(within)22 b(the)j(quotes.)39
+b(A)25 b(single)f(quote)h(ma)m(y)g(not)g(o)s(ccur)g(b)s(et)m(w)m(een)g
+(single)f(quotes,)i(ev)m(en)g(when)d(preceded)150 3064
+y(b)m(y)30 b(a)h(bac)m(kslash.)150 3288 y Fk(3.1.2.3)63
+b(Double)42 b(Quotes)275 3532 y Ft(Enclosing)34 b(c)m(haracters)k(in)d
+(double)g(quotes)i(\(`)p Fs(")p Ft('\))g(preserv)m(es)f(the)g(literal)f
+(v)-5 b(alue)36 b(of)g(all)f(c)m(haracters)150 3641 y(within)30
+b(the)j(quotes,)h(with)d(the)i(exception)g(of)f(`)p Fs($)p
+Ft(',)i(`)p Fs(`)p Ft(',)f(and)f(`)p Fs(\\)p Ft('.)48
+b(The)32 b(c)m(haracters)i(`)p Fs($)p Ft(')f(and)f(`)p
+Fs(`)p Ft(')g(retain)150 3751 y(their)j(sp)s(ecial)g(meaning)h(within)e
+(double)h(quotes)i(\(see)g(Section)f(3.5)h([Shell)e(Expansions],)h
+(page)h(16\).)150 3861 y(The)30 b(bac)m(kslash)g(retains)f(its)h(sp)s
+(ecial)f(meaning)g(only)h(when)f(follo)m(w)m(ed)h(b)m(y)g(one)h(of)f
+(the)h(follo)m(wing)d(c)m(har-)150 3970 y(acters:)54
+b(`)p Fs($)p Ft(',)39 b(`)p Fs(`)p Ft(',)g(`)p Fs(")p
+Ft(',)g(`)p Fs(\\)p Ft(',)f(or)f Fs(newline)p Ft(.)58
+b(Within)35 b(double)g(quotes,)k(bac)m(kslashes)e(that)g(are)g(follo)m
+(w)m(ed)150 4080 y(b)m(y)28 b(one)g(of)g(these)g(c)m(haracters)i(are)e
+(remo)m(v)m(ed.)41 b(Bac)m(kslashes)29 b(preceding)e(c)m(haracters)i
+(without)e(a)h(sp)s(ecial)150 4189 y(meaning)i(are)i(left)e(unmo)s
+(di\014ed.)40 b(A)31 b(double)f(quote)h(ma)m(y)h(b)s(e)e(quoted)i
+(within)c(double)i(quotes)h(b)m(y)g(pre-)150 4299 y(ceding)k(it)g(with)
+f(a)i(bac)m(kslash.)55 b(When)36 b(command)f(history)f(is)h(b)s(eing)f
+(used,)i(the)f(double)f(quote)i(ma)m(y)150 4408 y(not)31
+b(b)s(e)e(used)h(to)h(quote)g(the)g(history)e(expansion)g(c)m
+(haracter.)275 4543 y(The)41 b(sp)s(ecial)f(parameters)h(`)p
+Fs(*)p Ft(')h(and)f(`)p Fs(@)p Ft(')h(ha)m(v)m(e)g(sp)s(ecial)e
+(meaning)h(when)g(in)f(double)g(quotes)i(\(see)150 4653
+y(Section)30 b(3.5.3)i([Shell)d(P)m(arameter)j(Expansion],)d(page)i
+(18\).)150 4877 y Fk(3.1.2.4)63 b(ANSI-C)40 b(Quoting)275
+5121 y Ft(W)-8 b(ords)33 b(of)h(the)g(form)f Fs($')p
+Fj(string)11 b Fs(')31 b Ft(are)j(treated)g(sp)s(ecially)-8
+b(.)49 b(The)33 b(w)m(ord)g(expands)g(to)i Fq(string)p
+Ft(,)e(with)150 5230 y(bac)m(kslash-escap)s(ed)43 b(c)m(haracters)i
+(replaced)e(as)h(sp)s(eci\014ed)e(b)m(y)h(the)g(ANSI)g(C)g(standard.)79
+b(Bac)m(kslash)150 5340 y(escap)s(e)31 b(sequences,)g(if)e(presen)m(t,)
+i(are)g(deco)s(ded)f(as)g(follo)m(ws:)p eop
+%%Page: 7 13
+7 12 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2292 b(7)150 299 y Fs(\\a)384
+b Ft(alert)30 b(\(b)s(ell\))150 487 y Fs(\\b)384 b Ft(bac)m(kspace)150
+675 y Fs(\\e)g Ft(an)30 b(escap)s(e)h(c)m(haracter)h(\(not)f(ANSI)f
+(C\))150 862 y Fs(\\f)384 b Ft(form)30 b(feed)150 1050
+y Fs(\\n)384 b Ft(newline)150 1238 y Fs(\\r)g Ft(carriage)31
+b(return)150 1426 y Fs(\\t)384 b Ft(horizon)m(tal)30
+b(tab)150 1614 y Fs(\\v)384 b Ft(v)m(ertical)30 b(tab)150
+1802 y Fs(\\\\)384 b Ft(bac)m(kslash)150 1989 y Fs(\\')g
+Ft(single)29 b(quote)150 2177 y Fs(\\)p Fj(nnn)288 b
+Ft(the)31 b(eigh)m(t-bit)f(c)m(haracter)i(whose)e(v)-5
+b(alue)30 b(is)f(the)i(o)s(ctal)f(v)-5 b(alue)30 b Fq(nnn)f
+Ft(\(one)i(to)g(three)g(digits\))150 2365 y Fs(\\x)p
+Fj(HH)288 b Ft(the)36 b(eigh)m(t-bit)g(c)m(haracter)h(whose)f(v)-5
+b(alue)35 b(is)g(the)h(hexadecimal)f(v)-5 b(alue)35 b
+Fq(HH)46 b Ft(\(one)37 b(or)f(t)m(w)m(o)630 2475 y(hex)30
+b(digits\))150 2662 y Fs(\\c)p Fj(x)336 b Ft(a)31 b(con)m(trol-)p
+Fq(x)37 b Ft(c)m(haracter)150 2865 y(The)30 b(expanded)f(result)h(is)f
+(single-quoted,)h(as)h(if)e(the)h(dollar)f(sign)h(had)f(not)i(b)s(een)f
+(presen)m(t.)150 3146 y Fk(3.1.2.5)63 b(Lo)s(cale-Sp)s(eci\014c)41
+b(T)-10 b(ranslation)275 3418 y Ft(A)30 b(double-quoted)g(string)f
+(preceded)h(b)m(y)h(a)g(dollar)e(sign)g(\(`)p Fs($)p
+Ft('\))j(will)27 b(cause)32 b(the)e(string)g(to)h(b)s(e)f(trans-)150
+3528 y(lated)i(according)g(to)h(the)f(curren)m(t)g(lo)s(cale.)45
+b(If)32 b(the)g(curren)m(t)g(lo)s(cale)g(is)f Fs(C)h
+Ft(or)g Fs(POSIX)p Ft(,)f(the)h(dollar)f(sign)g(is)150
+3637 y(ignored.)40 b(If)30 b(the)g(string)g(is)f(translated)h(and)g
+(replaced,)g(the)h(replacemen)m(t)f(is)g(double-quoted.)275
+3800 y(Some)20 b(systems)h(use)f(the)h(message)h(catalog)g(selected)f
+(b)m(y)g(the)g Fs(LC_MESSAGES)c Ft(shell)i(v)-5 b(ariable.)37
+b(Others)150 3910 y(create)i(the)e(name)g(of)g(the)g(message)h(catalog)
+h(from)e(the)g(v)-5 b(alue)36 b(of)h(the)h Fs(TEXTDOMAIN)c
+Ft(shell)h(v)-5 b(ariable,)150 4019 y(p)s(ossibly)29
+b(adding)h(a)h(su\016x)g(of)h(`)p Fs(.mo)p Ft('.)43 b(If)31
+b(y)m(ou)h(use)f(the)h Fs(TEXTDOMAIN)c Ft(v)-5 b(ariable,)31
+b(y)m(ou)h(ma)m(y)g(need)f(to)h(set)150 4129 y(the)22
+b Fs(TEXTDOMAINDIR)d Ft(v)-5 b(ariable)21 b(to)i(the)f(lo)s(cation)g
+(of)g(the)h(message)g(catalog)h(\014les.)37 b(Still)20
+b(others)i(use)g(b)s(oth)150 4238 y(v)-5 b(ariables)29
+b(in)g(this)g(fashion:)40 b Fs(TEXTDOMAINDIR)p Ft(/)p
+Fs(LC_MESSAGES)p Ft(/LC)p 2528 4238 28 4 v 34 w(MESSA)m(GES/)p
+Fs(TEXTDOMAIN)p Ft(.mo.)150 4520 y Fk(3.1.3)63 b(Commen)m(ts)275
+4792 y Ft(In)34 b(a)j(non-in)m(teractiv)m(e)f(shell,)f(or)h(an)f(in)m
+(teractiv)m(e)i(shell)d(in)g(whic)m(h)h(the)g Fs(interactive_comments)
+150 4902 y Ft(option)i(to)h(the)f Fs(shopt)f Ft(builtin)e(is)i(enabled)
+g(\(see)i(Section)g(4.2)g([Bash)f(Builtins],)g(page)h(39\),)j(a)c(w)m
+(ord)150 5011 y(b)s(eginning)24 b(with)h(`)p Fs(#)p Ft(')h(causes)h
+(that)f(w)m(ord)g(and)g(all)f(remaining)g(c)m(haracters)i(on)f(that)h
+(line)e(to)i(b)s(e)f(ignored.)150 5121 y(An)43 b(in)m(teractiv)m(e)h
+(shell)e(without)g(the)h Fs(interactive_comments)38 b
+Ft(option)43 b(enabled)f(do)s(es)h(not)g(allo)m(w)150
+5230 y(commen)m(ts.)56 b(The)34 b Fs(interactive_comments)c
+Ft(option)k(is)g(on)h(b)m(y)g(default)f(in)g(in)m(teractiv)m(e)i
+(shells.)53 b(See)150 5340 y(Section)29 b(6.3)g([In)m(teractiv)m(e)i
+(Shells],)c(page)j(67,)g(for)e(a)i(description)c(of)j(what)g(mak)m(es)h
+(a)f(shell)e(in)m(teractiv)m(e.)p eop
+%%Page: 8 14
+8 13 bop 150 -116 a Ft(8)2617 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fr(3.2)68 b(Shell)45 b(Commands)275 553 y Ft(A)32
+b(simple)e(shell)g(command)i(suc)m(h)g(as)h Fs(echo)c(a)h(b)g(c)i
+Ft(consists)f(of)i(the)f(command)g(itself)f(follo)m(w)m(ed)h(b)m(y)150
+663 y(argumen)m(ts,)f(separated)g(b)m(y)f(spaces.)275
+808 y(More)h(complex)g(shell)e(commands)i(are)g(comp)s(osed)g(of)g
+(simple)e(commands)i(arranged)g(together)h(in)150 917
+y(a)f(v)-5 b(ariet)m(y)31 b(of)g(w)m(a)m(ys:)41 b(in)30
+b(a)h(pip)s(eline)c(in)i(whic)m(h)g(the)i(output)f(of)h(one)f(command)h
+(b)s(ecomes)f(the)h(input)e(of)150 1027 y(a)i(second,)f(in)g(a)g(lo)s
+(op)g(or)g(conditional)f(construct,)i(or)f(in)f(some)i(other)g
+(grouping.)150 1272 y Fk(3.2.1)63 b(Simple)40 b(Commands)275
+1526 y Ft(A)26 b(simple)f(command)i(is)e(the)i(kind)e(of)i(command)g
+(encoun)m(tered)g(most)g(often.)40 b(It's)27 b(just)f(a)i(sequence)150
+1636 y(of)f(w)m(ords)f(separated)h(b)m(y)g Fs(blank)p
+Ft(s,)f(terminated)g(b)m(y)h(one)g(of)g(the)g(shell's)e(con)m(trol)i
+(op)s(erators)g(\(see)h(Chap-)150 1745 y(ter)34 b(2)g([De\014nitions],)
+g(page)h(3\).)51 b(The)34 b(\014rst)f(w)m(ord)g(generally)g(sp)s
+(eci\014es)f(a)j(command)e(to)i(b)s(e)e(executed,)150
+1855 y(with)c(the)i(rest)f(of)h(the)f(w)m(ords)g(b)s(eing)f(that)i
+(command's)f(argumen)m(ts.)275 2000 y(The)h(return)h(status)g(\(see)i
+(Section)e(3.7.5)i([Exit)e(Status],)i(page)f(30\))g(of)g(a)g(simple)d
+(command)i(is)g(its)150 2109 y(exit)37 b(status)g(as)g(pro)m(vided)e(b)
+m(y)i(the)g Fl(posix)f Ft(1003.1)j Fs(waitpid)c Ft(function,)i(or)g
+(128)p Fs(+)p Fq(n)g Ft(if)f(the)h(command)150 2219 y(w)m(as)31
+b(terminated)f(b)m(y)g(signal)f Fq(n)p Ft(.)150 2463
+y Fk(3.2.2)63 b(Pip)s(elines)275 2718 y Ft(A)30 b Fs(pipeline)e
+Ft(is)i(a)g(sequence)h(of)g(simple)d(commands)i(separated)h(b)m(y)f(`)p
+Fs(|)p Ft('.)275 2863 y(The)f(format)i(for)f(a)h(pip)s(eline)c(is)390
+3007 y Fs([time)46 b([-p]])h([!])g Fj(command1)56 b Fs([|)47
+b Fj(command2)56 b Fs(...)o(])150 3152 y Ft(The)36 b(output)h(of)g(eac)
+m(h)h(command)e(in)g(the)h(pip)s(eline)c(is)j(connected)i(via)e(a)h
+(pip)s(e)e(to)j(the)f(input)e(of)i(the)150 3262 y(next)31
+b(command.)40 b(That)30 b(is,)g(eac)m(h)i(command)e(reads)g(the)g
+(previous)f(command's)h(output.)275 3407 y(The)36 b(reserv)m(ed)g(w)m
+(ord)g Fs(time)g Ft(causes)h(timing)e(statistics)h(to)h(b)s(e)f(prin)m
+(ted)f(for)h(the)h(pip)s(eline)c(once)k(it)150 3516 y(\014nishes.)50
+b(The)34 b(statistics)g(curren)m(tly)f(consist)h(of)g(elapsed)g(\(w)m
+(all-clo)s(c)m(k\))g(time)g(and)g(user)f(and)h(system)150
+3626 y(time)h(consumed)g(b)m(y)g(the)h(command's)f(execution.)56
+b(The)35 b(`)p Fs(-p)p Ft(')h(option)e(c)m(hanges)j(the)f(output)f
+(format)150 3735 y(to)i(that)f(sp)s(eci\014ed)e(b)m(y)i
+Fl(posix)p Ft(.)57 b(The)35 b Fs(TIMEFORMAT)e Ft(v)-5
+b(ariable)35 b(ma)m(y)i(b)s(e)e(set)h(to)h(a)f(format)g(string)f(that)
+150 3845 y(sp)s(eci\014es)28 b(ho)m(w)h(the)g(timing)e(information)h
+(should)e(b)s(e)j(displa)m(y)m(ed.)39 b(See)29 b(Section)g(5.2)h([Bash)
+f(V)-8 b(ariables],)150 3955 y(page)29 b(55,)h(for)e(a)g(description)f
+(of)h(the)g(a)m(v)-5 b(ailable)28 b(formats.)40 b(The)28
+b(use)g(of)g Fs(time)f Ft(as)i(a)f(reserv)m(ed)h(w)m(ord)f(p)s(er-)150
+4064 y(mits)f(the)h(timing)e(of)i(shell)e(builtins,)f(shell)h
+(functions,)h(and)g(pip)s(elines.)37 b(An)27 b(external)h
+Fs(time)e Ft(command)150 4174 y(cannot)31 b(time)f(these)h(easily)-8
+b(.)275 4318 y(If)24 b(the)h(pip)s(eline)d(is)i(not)h(executed)h(async)
+m(hronously)e(\(see)i(Section)f(3.2.3)i([Lists],)f(page)f(9\),)i(the)f
+(shell)150 4428 y(w)m(aits)k(for)g(all)g(commands)g(in)f(the)h(pip)s
+(eline)d(to)k(complete.)275 4573 y(Eac)m(h)25 b(command)g(in)f(a)h(pip)
+s(eline)d(is)i(executed)i(in)e(its)g(o)m(wn)i(subshell)c(\(see)k
+(Section)f(3.7.3)i([Command)150 4682 y(Execution)35 b(En)m(vironmen)m
+(t],)i(page)f(29\).)58 b(The)36 b(exit)f(status)h(of)g(a)g(pip)s(eline)
+d(is)h(the)i(exit)g(status)g(of)g(the)150 4792 y(last)31
+b(command)g(in)f(the)h(pip)s(eline,)d(unless)i(the)h
+Fs(pipefail)e Ft(option)i(is)f(enabled)g(\(see)i(Section)f(4.3)h([The)
+150 4902 y(Set)i(Builtin],)g(page)h(50\).)53 b(If)34
+b Fs(pipefail)e Ft(is)h(enabled,)h(the)h(pip)s(eline's)c(return)i
+(status)h(is)g(the)g(v)-5 b(alue)34 b(of)150 5011 y(the)e(last)g
+(\(righ)m(tmost\))h(command)f(to)h(exit)f(with)e(a)j(non-zero)f
+(status,)h(or)f(zero)h(if)e(all)g(commands)h(exit)150
+5121 y(successfully)-8 b(.)65 b(If)38 b(the)h(reserv)m(ed)g(w)m(ord)g
+(`)p Fs(!)p Ft(')g(precedes)g(the)g(pip)s(eline,)e(the)j(exit)e(status)
+h(is)f(the)h(logical)150 5230 y(negation)g(of)g(the)f(exit)h(status)g
+(as)f(describ)s(ed)f(ab)s(o)m(v)m(e.)66 b(The)38 b(shell)f(w)m(aits)i
+(for)f(all)f(commands)i(in)e(the)150 5340 y(pip)s(eline)27
+b(to)k(terminate)f(b)s(efore)g(returning)f(a)i(v)-5 b(alue.)p
+eop
+%%Page: 9 15
+9 14 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2292 b(9)150 299 y Fk(3.2.3)63
+b(Lists)41 b(of)g(Commands)275 547 y Ft(A)29 b Fs(list)f
+Ft(is)h(a)g(sequence)h(of)g(one)f(or)h(more)f(pip)s(elines)d(separated)
+k(b)m(y)f(one)h(of)f(the)h(op)s(erators)g(`)p Fs(;)p
+Ft(',)g(`)p Fs(&)p Ft(',)150 657 y(`)p Fs(&&)p Ft(',)h(or)f(`)p
+Fs(||)p Ft(',)g(and)g(optionally)f(terminated)h(b)m(y)g(one)h(of)f(`)p
+Fs(;)p Ft(',)h(`)p Fs(&)p Ft(',)g(or)f(a)h Fs(newline)p
+Ft(.)275 795 y(Of)23 b(these)h(list)e(op)s(erators,)k(`)p
+Fs(&&)p Ft(')d(and)g(`)p Fs(||)p Ft(')h(ha)m(v)m(e)h(equal)e
+(precedence,)j(follo)m(w)m(ed)d(b)m(y)h(`)p Fs(;)p Ft(')g(and)f(`)p
+Fs(&)p Ft(',)i(whic)m(h)150 905 y(ha)m(v)m(e)32 b(equal)d(precedence.)
+275 1044 y(A)g(sequence)h(of)g(one)g(or)g(more)g(newlines)d(ma)m(y)j
+(app)s(ear)f(in)g(a)h Fs(list)e Ft(to)j(delimit)c(commands,)j(equiv-)
+150 1153 y(alen)m(t)h(to)g(a)g(semicolon.)275 1292 y(If)c(a)h(command)f
+(is)g(terminated)g(b)m(y)h(the)g(con)m(trol)g(op)s(erator)g(`)p
+Fs(&)p Ft(',)h(the)e(shell)f(executes)j(the)f(command)150
+1401 y(async)m(hronously)f(in)h(a)h(subshell.)37 b(This)27
+b(is)h(kno)m(wn)g(as)h(executing)g(the)g(command)g(in)e(the)i
+Fq(bac)m(kground)p Ft(.)150 1511 y(The)f(shell)f(do)s(es)h(not)h(w)m
+(ait)f(for)g(the)h(command)f(to)i(\014nish,)c(and)i(the)h(return)e
+(status)i(is)f(0)h(\(true\).)40 b(When)150 1621 y(job)g(con)m(trol)g
+(is)g(not)g(activ)m(e)h(\(see)g(Chapter)f(7)h([Job)f(Con)m(trol],)i
+(page)f(79\),)j(the)d(standard)e(input)f(for)150 1730
+y(async)m(hronous)43 b(commands,)k(in)c(the)g(absence)i(of)f(an)m(y)g
+(explicit)e(redirections,)k(is)c(redirected)h(from)150
+1840 y Fs(/dev/null)p Ft(.)275 1979 y(Commands)19 b(separated)j(b)m(y)f
+(a)g(`)p Fs(;)p Ft(')g(are)h(executed)g(sequen)m(tially;)h(the)e(shell)
+e(w)m(aits)i(for)g(eac)m(h)h(command)150 2088 y(to)31
+b(terminate)g(in)e(turn.)39 b(The)30 b(return)f(status)i(is)e(the)i
+(exit)f(status)h(of)g(the)f(last)g(command)g(executed.)275
+2227 y(The)f(con)m(trol)i(op)s(erators)f(`)p Fs(&&)p
+Ft(')g(and)g(`)p Fs(||)p Ft(')g(denote)h Fl(and)e Ft(lists)g(and)h
+Fl(or)f Ft(lists,)g(resp)s(ectiv)m(ely)-8 b(.)41 b(An)30
+b Fl(and)150 2336 y Ft(list)f(has)h(the)h(form)390 2475
+y Fj(command1)56 b Fs(&&)47 b Fj(command2)150 2614 y
+Fq(command2)38 b Ft(is)29 b(executed)j(if,)d(and)h(only)f(if,)h
+Fq(command1)38 b Ft(returns)29 b(an)h(exit)g(status)h(of)g(zero.)275
+2752 y(An)f Fl(or)f Ft(list)g(has)h(the)h(form)390 2891
+y Fj(command1)56 b Fs(||)47 b Fj(command2)150 3030 y
+Fq(command2)38 b Ft(is)29 b(executed)j(if,)d(and)h(only)f(if,)h
+Fq(command1)38 b Ft(returns)29 b(a)i(non-zero)g(exit)f(status.)275
+3168 y(The)i(return)g(status)i(of)f Fl(and)f Ft(and)h
+Fl(or)f Ft(lists)g(is)g(the)h(exit)g(status)h(of)f(the)g(last)g
+(command)g(executed)150 3278 y(in)c(the)i(list.)150 3510
+y Fk(3.2.4)63 b(Comp)s(ound)41 b(Commands)275 3759 y
+Ft(Comp)s(ound)f(commands)i(are)h(the)g(shell)e(programming)g
+(constructs.)77 b(Eac)m(h)44 b(construct)e(b)s(egins)150
+3868 y(with)c(a)h(reserv)m(ed)g(w)m(ord)f(or)h(con)m(trol)g(op)s
+(erator)g(and)g(is)f(terminated)g(b)m(y)h(a)g(corresp)s(onding)e
+(reserv)m(ed)150 3978 y(w)m(ord)42 b(or)h(op)s(erator.)77
+b(An)m(y)42 b(redirections)f(\(see)j(Section)e(3.6)i([Redirections],)h
+(page)e(24\))g(asso)s(ciated)150 4087 y(with)25 b(a)h(comp)s(ound)f
+(command)h(apply)f(to)i(all)e(commands)h(within)d(that)k(comp)s(ound)e
+(command)h(unless)150 4197 y(explicitly)i(o)m(v)m(erridden.)275
+4336 y(Bash)45 b(pro)m(vides)g(lo)s(oping)f(constructs,)49
+b(conditional)44 b(commands,)50 b(and)44 b(mec)m(hanisms)h(to)h(group)
+150 4445 y(commands)30 b(and)g(execute)i(them)e(as)g(a)h(unit.)150
+4678 y Fk(3.2.4.1)63 b(Lo)s(oping)43 b(Constructs)275
+4926 y Ft(Bash)30 b(supp)s(orts)f(the)h(follo)m(wing)f(lo)s(oping)g
+(constructs.)275 5065 y(Note)35 b(that)f(wherev)m(er)g(a)g(`)p
+Fs(;)p Ft(')g(app)s(ears)f(in)g(the)h(description)e(of)i(a)g(command's)
+g(syn)m(tax,)i(it)d(ma)m(y)i(b)s(e)150 5174 y(replaced)30
+b(with)f(one)i(or)f(more)g(newlines.)150 5340 y Fs(until)240
+b Ft(The)30 b(syn)m(tax)h(of)f(the)h Fs(until)e Ft(command)h(is:)p
+eop
+%%Page: 10 16
+10 15 bop 150 -116 a Ft(10)2572 b(Bash)31 b(Reference)g(Man)m(ual)870
+299 y Fs(until)46 b Fj(test-commands)11 b Fs(;)44 b(do)j
+Fj(consequent-commands)11 b Fs(;)42 b(done)630 434 y
+Ft(Execute)g Fq(consequen)m(t-commands)k Ft(as)41 b(long)g(as)g
+Fq(test-commands)46 b Ft(has)41 b(an)g(exit)g(status)630
+543 y(whic)m(h)c(is)h(not)h(zero.)67 b(The)38 b(return)f(status)j(is)d
+(the)i(exit)g(status)g(of)g(the)g(last)f(command)630
+653 y(executed)31 b(in)e Fq(consequen)m(t-commands)p
+Ft(,)j(or)e(zero)h(if)f(none)g(w)m(as)h(executed.)150
+813 y Fs(while)240 b Ft(The)30 b(syn)m(tax)h(of)f(the)h
+Fs(while)e Ft(command)h(is:)870 948 y Fs(while)46 b Fj(test-commands)11
+b Fs(;)44 b(do)j Fj(consequent-commands)11 b Fs(;)42
+b(done)630 1083 y Ft(Execute)g Fq(consequen)m(t-commands)k
+Ft(as)41 b(long)g(as)g Fq(test-commands)46 b Ft(has)41
+b(an)g(exit)g(status)630 1193 y(of)34 b(zero.)53 b(The)34
+b(return)f(status)h(is)g(the)g(exit)g(status)h(of)f(the)g(last)g
+(command)g(executed)h(in)630 1302 y Fq(consequen)m(t-commands)p
+Ft(,)c(or)g(zero)g(if)e(none)h(w)m(as)h(executed.)150
+1463 y Fs(for)336 b Ft(The)30 b(syn)m(tax)h(of)f(the)h
+Fs(for)e Ft(command)i(is:)870 1598 y Fs(for)47 b Fj(name)57
+b Fs([in)47 b Fj(words)57 b Fs(...)o(];)47 b(do)g Fj(commands)11
+b Fs(;)45 b(done)630 1733 y Ft(Expand)31 b Fq(w)m(ords)p
+Ft(,)j(and)e(execute)i Fq(commands)i Ft(once)d(for)g(eac)m(h)h(mem)m(b)
+s(er)e(in)f(the)i(resultan)m(t)630 1842 y(list,)27 b(with)g
+Fq(name)33 b Ft(b)s(ound)26 b(to)j(the)f(curren)m(t)g(mem)m(b)s(er.)40
+b(If)27 b(`)p Fs(in)j Fj(words)11 b Ft(')27 b(is)g(not)h(presen)m(t,)h
+(the)630 1952 y Fs(for)g Ft(command)g(executes)i(the)e
+Fq(commands)k Ft(once)d(for)f(eac)m(h)i(p)s(ositional)c(parameter)j
+(that)630 2061 y(is)c(set,)i(as)f(if)f(`)p Fs(in)k("$@")p
+Ft(')c(had)g(b)s(een)g(sp)s(eci\014ed)f(\(see)j(Section)e(3.4.2)j([Sp)s
+(ecial)c(P)m(arameters],)630 2171 y(page)e(15\).)39 b(The)21
+b(return)g(status)h(is)f(the)h(exit)g(status)g(of)g(the)g(last)f
+(command)h(that)g(executes.)630 2281 y(If)i(there)h(are)h(no)e(items)h
+(in)e(the)i(expansion)f(of)h Fq(w)m(ords)p Ft(,)h(no)f(commands)f(are)h
+(executed,)j(and)630 2390 y(the)j(return)e(status)i(is)e(zero.)630
+2525 y(An)h(alternate)h(form)f(of)h(the)f Fs(for)g Ft(command)g(is)f
+(also)h(supp)s(orted:)870 2660 y Fs(for)47 b(\(\()g Fj(expr1)57
+b Fs(;)47 b Fj(expr2)57 b Fs(;)48 b Fj(expr3)57 b Fs(\)\))47
+b(;)g(do)g Fj(commands)57 b Fs(;)47 b(done)630 2795 y
+Ft(First,)37 b(the)g(arithmetic)f(expression)f Fq(expr1)43
+b Ft(is)35 b(ev)-5 b(aluated)37 b(according)f(to)h(the)g(rules)e(de-)
+630 2905 y(scrib)s(ed)40 b(b)s(elo)m(w)h(\(see)i(Section)f(6.5)h
+([Shell)e(Arithmetic],)j(page)f(70\).)77 b(The)42 b(arithmetic)630
+3014 y(expression)32 b Fq(expr2)41 b Ft(is)33 b(then)g(ev)-5
+b(aluated)34 b(rep)s(eatedly)f(un)m(til)f(it)h(ev)-5
+b(aluates)34 b(to)h(zero.)51 b(Eac)m(h)630 3124 y(time)22
+b Fq(expr2)30 b Ft(ev)-5 b(aluates)24 b(to)f(a)g(non-zero)h(v)-5
+b(alue,)24 b Fq(commands)i Ft(are)d(executed)g(and)g(the)g(arith-)630
+3233 y(metic)28 b(expression)f Fq(expr3)36 b Ft(is)27
+b(ev)-5 b(aluated.)40 b(If)28 b(an)m(y)h(expression)e(is)g(omitted,)i
+(it)f(b)s(eha)m(v)m(es)h(as)630 3343 y(if)h(it)h(ev)-5
+b(aluates)31 b(to)h(1.)44 b(The)30 b(return)g(v)-5 b(alue)31
+b(is)f(the)h(exit)g(status)h(of)f(the)g(last)g(command)g(in)630
+3453 y Fq(list)g Ft(that)g(is)e(executed,)j(or)e(false)g(if)g(an)m(y)g
+(of)h(the)f(expressions)f(is)h(in)m(v)-5 b(alid.)275
+3613 y(The)26 b Fs(break)g Ft(and)h Fs(continue)e Ft(builtins)f(\(see)k
+(Section)g(4.1)g([Bourne)g(Shell)d(Builtins],)h(page)i(33\))g(ma)m(y)
+150 3723 y(b)s(e)i(used)f(to)i(con)m(trol)g(lo)s(op)f(execution.)150
+3949 y Fk(3.2.4.2)63 b(Conditional)42 b(Constructs)150
+4193 y Fs(if)384 b Ft(The)30 b(syn)m(tax)h(of)f(the)h
+Fs(if)f Ft(command)g(is:)870 4328 y Fs(if)47 b Fj(test-commands)11
+b Fs(;)44 b(then)965 4438 y Fj(consequent-commands)11
+b Fs(;)870 4547 y([elif)46 b Fj(more-test-commands)11
+b Fs(;)42 b(then)965 4657 y Fj(more-consequents)11 b
+Fs(;])870 4767 y([else)46 b Fj(alternate-consequents)11
+b Fs(;])870 4876 y(fi)630 5011 y Ft(The)53 b Fq(test-commands)58
+b Ft(list)52 b(is)h(executed,)60 b(and)53 b(if)f(its)h(return)f(status)
+i(is)e(zero,)61 b(the)630 5121 y Fq(consequen)m(t-commands)44
+b Ft(list)39 b(is)g(executed.)70 b(If)40 b Fq(test-commands)k
+Ft(returns)39 b(a)h(non-zero)630 5230 y(status,)45 b(eac)m(h)e
+Fs(elif)d Ft(list)g(is)h(executed)i(in)d(turn,)k(and)d(if)f(its)h(exit)
+h(status)g(is)e(zero,)46 b(the)630 5340 y(corresp)s(onding)36
+b Fq(more-consequen)m(ts)42 b Ft(is)37 b(executed)h(and)f(the)h
+(command)g(completes.)62 b(If)p eop
+%%Page: 11 17
+11 16 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(11)630 299 y(`)p Fs(else)29
+b Fj(alternate-consequents)11 b Ft(')23 b(is)29 b(presen)m(t,)g(and)g
+(the)g(\014nal)f(command)g(in)g(the)h(\014nal)630 408
+y Fs(if)44 b Ft(or)g Fs(elif)f Ft(clause)h(has)g(a)h(non-zero)g(exit)f
+(status,)k(then)c Fq(alternate-consequen)m(ts)50 b Ft(is)630
+518 y(executed.)55 b(The)34 b(return)g(status)h(is)e(the)i(exit)g
+(status)g(of)g(the)g(last)f(command)h(executed,)630 628
+y(or)30 b(zero)i(if)d(no)h(condition)f(tested)i(true.)150
+784 y Fs(case)288 b Ft(The)30 b(syn)m(tax)h(of)f(the)h
+Fs(case)e Ft(command)h(is:)870 917 y Fs(case)47 b Fj(word)57
+b Fs(in)47 b([)g([\(])g Fj(pattern)57 b Fs([|)47 b Fj(pattern)11
+b Fs(]...)l(\))48 b Fj(command-list)55 b Fs(;;]...)46
+b(esac)630 1050 y(case)34 b Ft(will)e(selectiv)m(ely)i(execute)i(the)f
+Fq(command-list)h Ft(corresp)s(onding)c(to)k(the)e(\014rst)g
+Fq(pat-)630 1160 y(tern)40 b Ft(that)i(matc)m(hes)g Fq(w)m(ord)p
+Ft(.)71 b(The)40 b(`)p Fs(|)p Ft(')h(is)f(used)g(to)h(separate)h(m)m
+(ultiple)c(patterns,)44 b(and)630 1270 y(the)31 b(`)p
+Fs(\))p Ft(')h(op)s(erator)f(terminates)g(a)h(pattern)f(list.)42
+b(A)31 b(list)f(of)i(patterns)f(and)f(an)h(asso)s(ciated)630
+1379 y(command-list)e(is)g(kno)m(wn)h(as)g(a)h Fq(clause)p
+Ft(.)40 b(Eac)m(h)31 b(clause)f(m)m(ust)g(b)s(e)f(terminated)h(with)f
+(`)p Fs(;;)p Ft('.)630 1489 y(The)e Fq(w)m(ord)j Ft(undergo)s(es)d
+(tilde)f(expansion,)h(parameter)g(expansion,)g(command)h(substitu-)630
+1598 y(tion,)38 b(arithmetic)e(expansion,)h(and)g(quote)g(remo)m(v)-5
+b(al)37 b(b)s(efore)f(matc)m(hing)h(is)f(attempted.)630
+1708 y(Eac)m(h)e Fq(pattern)f Ft(undergo)s(es)g(tilde)f(expansion,)h
+(parameter)h(expansion,)f(command)g(sub-)630 1817 y(stitution,)c(and)h
+(arithmetic)g(expansion.)630 1951 y(There)g(ma)m(y)g(b)s(e)f(an)h
+(arbitrary)f(n)m(um)m(b)s(er)g(of)h Fs(case)f Ft(clauses,)h(eac)m(h)h
+(terminated)f(b)m(y)f(a)i(`)p Fs(;;)p Ft('.)630 2060
+y(The)f(\014rst)f(pattern)i(that)g(matc)m(hes)g(determines)f(the)g
+(command-list)g(that)h(is)e(executed.)630 2193 y(Here)35
+b(is)f(an)h(example)g(using)e Fs(case)h Ft(in)f(a)i(script)f(that)i
+(could)e(b)s(e)g(used)g(to)h(describ)s(e)f(one)630 2303
+y(in)m(teresting)c(feature)h(of)f(an)g(animal:)870 2436
+y Fs(echo)47 b(-n)g("Enter)f(the)h(name)f(of)i(an)f(animal:)f(")870
+2545 y(read)h(ANIMAL)870 2655 y(echo)g(-n)g("The)f($ANIMAL)g(has)h(")
+870 2765 y(case)g($ANIMAL)e(in)965 2874 y(horse)i(|)g(dog)g(|)h(cat\))e
+(echo)h(-n)g("four";;)965 2984 y(man)g(|)h(kangaroo)d(\))j(echo)e(-n)i
+("two";;)965 3093 y(*\))g(echo)e(-n)h("an)g(unknown)f(number)g(of";;)
+870 3203 y(esac)870 3313 y(echo)h(")g(legs.")630 3446
+y Ft(The)26 b(return)f(status)h(is)f(zero)i(if)e(no)h
+Fq(pattern)g Ft(is)f(matc)m(hed.)40 b(Otherwise,)26 b(the)h(return)e
+(status)630 3555 y(is)k(the)i(exit)f(status)h(of)f(the)h
+Fq(command-list)g Ft(executed.)150 3712 y Fs(select)630
+3845 y Ft(The)i Fs(select)f Ft(construct)i(allo)m(ws)f(the)h(easy)g
+(generation)g(of)f(men)m(us.)50 b(It)34 b(has)f(almost)h(the)630
+3954 y(same)d(syn)m(tax)g(as)f(the)h Fs(for)e Ft(command:)870
+4088 y Fs(select)46 b Fj(name)57 b Fs([in)47 b Fj(words)57
+b Fs(...)o(];)47 b(do)h Fj(commands)11 b Fs(;)44 b(done)630
+4221 y Ft(The)d(list)g(of)g(w)m(ords)h(follo)m(wing)e
+Fs(in)h Ft(is)g(expanded,)j(generating)e(a)g(list)e(of)i(items.)74
+b(The)630 4330 y(set)41 b(of)f(expanded)f(w)m(ords)g(is)h(prin)m(ted)e
+(on)i(the)g(standard)f(error)h(output)g(stream,)j(eac)m(h)630
+4440 y(preceded)30 b(b)m(y)g(a)h(n)m(um)m(b)s(er.)40
+b(If)29 b(the)i(`)p Fs(in)f Fj(words)11 b Ft(')29 b(is)g(omitted,)i
+(the)f(p)s(ositional)f(parameters)630 4549 y(are)24 b(prin)m(ted,)f(as)
+h(if)e(`)p Fs(in)30 b("$@")p Ft(')23 b(had)f(b)s(een)h(sp)s(ecifed.)37
+b(The)23 b Fs(PS3)f Ft(prompt)h(is)f(then)h(displa)m(y)m(ed)630
+4659 y(and)38 b(a)h(line)e(is)g(read)i(from)f(the)h(standard)e(input.)
+64 b(If)38 b(the)h(line)e(consists)h(of)g(a)h(n)m(um)m(b)s(er)630
+4769 y(corresp)s(onding)32 b(to)j(one)f(of)g(the)g(displa)m(y)m(ed)f(w)
+m(ords,)h(then)g(the)g(v)-5 b(alue)33 b(of)i Fq(name)k
+Ft(is)33 b(set)h(to)630 4878 y(that)g(w)m(ord.)49 b(If)32
+b(the)i(line)d(is)i(empt)m(y)-8 b(,)35 b(the)e(w)m(ords)g(and)f(prompt)
+h(are)g(displa)m(y)m(ed)f(again.)49 b(If)630 4988 y Fs(EOF)23
+b Ft(is)f(read,)k(the)d Fs(select)f Ft(command)i(completes.)39
+b(An)m(y)23 b(other)h(v)-5 b(alue)23 b(read)h(causes)g
+Fq(name)630 5097 y Ft(to)31 b(b)s(e)f(set)h(to)g(n)m(ull.)39
+b(The)29 b(line)g(read)h(is)g(sa)m(v)m(ed)h(in)e(the)i(v)-5
+b(ariable)29 b Fs(REPLY)p Ft(.)630 5230 y(The)42 b Fq(commands)j
+Ft(are)d(executed)h(after)g(eac)m(h)g(selection)f(un)m(til)e(a)j
+Fs(break)d Ft(command)i(is)630 5340 y(executed,)32 b(at)f(whic)m(h)e(p)
+s(oin)m(t)g(the)i Fs(select)d Ft(command)i(completes.)p
+eop
+%%Page: 12 18
+12 17 bop 150 -116 a Ft(12)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(Here)39 b(is)f(an)h(example)g(that)g(allo)m(ws)g(the)g(user)f(to)
+i(pic)m(k)e(a)h(\014lename)g(from)f(the)h(curren)m(t)630
+408 y(directory)-8 b(,)31 b(and)e(displa)m(ys)g(the)h(name)h(and)f
+(index)e(of)j(the)g(\014le)e(selected.)870 542 y Fs(select)46
+b(fname)g(in)i(*;)870 651 y(do)870 761 y(echo)f(you)g(picked)f($fname)g
+(\\\($REPLY\\\))870 870 y(break;)870 980 y(done)150 1136
+y(\(\(...)o(\)\))870 1270 y(\(\()h Fj(expression)56 b
+Fs(\)\))630 1403 y Ft(The)33 b(arithmetic)g Fq(expression)g
+Ft(is)f(ev)-5 b(aluated)34 b(according)g(to)g(the)g(rules)e(describ)s
+(ed)g(b)s(elo)m(w)630 1512 y(\(see)k(Section)e(6.5)i([Shell)d
+(Arithmetic],)i(page)h(70\).)55 b(If)34 b(the)h(v)-5
+b(alue)34 b(of)h(the)g(expression)f(is)630 1622 y(non-zero,)27
+b(the)f(return)e(status)i(is)f(0;)i(otherwise)e(the)h(return)e(status)i
+(is)f(1.)39 b(This)24 b(is)g(exactly)630 1731 y(equiv)-5
+b(alen)m(t)30 b(to)870 1864 y Fs(let)47 b(")p Fj(expression)11
+b Fs(")630 1998 y Ft(See)25 b(Section)g(4.2)i([Bash)e(Builtins],)f
+(page)i(39,)i(for)c(a)i(full)d(description)g(of)i(the)h
+Fs(let)e Ft(builtin.)150 2154 y Fs([[...)o(]])870 2287
+y([[)47 b Fj(expression)56 b Fs(]])630 2420 y Ft(Return)25
+b(a)h(status)f(of)h(0)g(or)g(1)g(dep)s(ending)d(on)i(the)h(ev)-5
+b(aluation)25 b(of)g(the)h(conditional)e(expres-)630
+2530 y(sion)29 b Fq(expression)p Ft(.)40 b(Expressions)28
+b(are)j(comp)s(osed)f(of)g(the)h(primaries)d(describ)s(ed)g(b)s(elo)m
+(w)h(in)630 2639 y(Section)35 b(6.4)i([Bash)f(Conditional)d
+(Expressions],)j(page)g(69.)57 b(W)-8 b(ord)36 b(splitting)e(and)h
+(\014le-)630 2749 y(name)24 b(expansion)g(are)h(not)f(p)s(erformed)f
+(on)h(the)h(w)m(ords)f(b)s(et)m(w)m(een)h(the)g(`)p Fs([[)p
+Ft(')f(and)g(`)p Fs(]])p Ft(';)i(tilde)630 2859 y(expansion,)k
+(parameter)h(and)f(v)-5 b(ariable)29 b(expansion,)h(arithmetic)f
+(expansion,)h(command)630 2968 y(substitution,)38 b(pro)s(cess)h
+(substitution,)f(and)g(quote)h(remo)m(v)-5 b(al)39 b(are)g(p)s
+(erformed.)63 b(Condi-)630 3078 y(tional)30 b(op)s(erators)g(suc)m(h)g
+(as)h(`)p Fs(-f)p Ft(')f(m)m(ust)g(b)s(e)g(unquoted)g(to)h(b)s(e)e
+(recognized)i(as)g(primaries.)630 3211 y(When)22 b(the)h(`)p
+Fs(==)p Ft(')f(and)g(`)p Fs(!=)p Ft(')g(op)s(erators)h(are)g(used,)g
+(the)g(string)e(to)j(the)e(righ)m(t)g(of)h(the)g(op)s(erator)630
+3320 y(is)30 b(considered)g(a)i(pattern)f(and)g(matc)m(hed)h(according)
+f(to)h(the)g(rules)e(describ)s(ed)f(b)s(elo)m(w)h(in)630
+3430 y(Section)g(3.5.8.1)j([P)m(attern)e(Matc)m(hing],)h(page)f(23.)41
+b(The)30 b(return)f(v)-5 b(alue)30 b(is)f(0)h(if)g(the)g(string)630
+3540 y(matc)m(hes)c(or)f(do)s(es)g(not)h(matc)m(h)f(the)h(pattern,)g
+(resp)s(ectiv)m(ely)-8 b(,)26 b(and)f(1)h(otherwise.)38
+b(An)m(y)25 b(part)630 3649 y(of)31 b(the)f(pattern)h(ma)m(y)g(b)s(e)e
+(quoted)i(to)g(force)g(it)f(to)h(b)s(e)f(matc)m(hed)h(as)f(a)h(string.)
+630 3782 y(An)i(additional)f(binary)g(op)s(erator,)j(`)p
+Fs(=~)p Ft(',)g(is)e(a)m(v)-5 b(ailable,)34 b(with)e(the)i(same)g
+(precedence)h(as)630 3892 y(`)p Fs(==)p Ft(')29 b(and)f(`)p
+Fs(!=)p Ft('.)40 b(When)29 b(it)f(is)g(used,)g(the)h(string)f(to)i(the)
+e(righ)m(t)h(of)g(the)g(op)s(erator)g(is)f(consid-)630
+4001 y(ered)34 b(an)g(extended)g(regular)f(expression)g(and)g(matc)m
+(hed)i(accordingly)e(\(as)h(in)f Fm(r)-5 b(e)g(gex)11
+b Ft(3\)\).)630 4111 y(The)39 b(return)f(v)-5 b(alue)39
+b(is)f(0)i(if)e(the)h(string)g(matc)m(hes)h(the)f(pattern,)j(and)d(1)h
+(otherwise.)66 b(If)630 4221 y(the)26 b(regular)f(expression)g(is)g
+(syn)m(tactically)h(incorrect,)h(the)f(conditional)e(expression's)h
+(re-)630 4330 y(turn)35 b(v)-5 b(alue)36 b(is)f(2.)59
+b(If)36 b(the)g(shell)f(option)g Fs(nocaseglob)f Ft(\(see)j(the)g
+(description)d(of)i Fs(shopt)630 4440 y Ft(in)42 b(Section)h(4.2)h
+([Bash)f(Builtins],)h(page)g(39\))g(is)e(enabled,)j(the)f(matc)m(h)f
+(is)f(p)s(erformed)630 4549 y(without)d(regard)h(to)h(the)f(case)h(of)g
+(alphab)s(etic)d(c)m(haracters.)72 b(Substrings)37 b(matc)m(hed)k(b)m
+(y)630 4659 y(paren)m(thesized)i(sub)s(expressions)e(within)h(the)i
+(regular)f(expression)g(are)h(sa)m(v)m(ed)h(in)e(the)630
+4769 y(arra)m(y)38 b(v)-5 b(ariable)36 b Fs(BASH_REMATCH)p
+Ft(.)59 b(The)36 b(elemen)m(t)i(of)g Fs(BASH_REMATCH)c
+Ft(with)i(index)g(0)i(is)630 4878 y(the)c(p)s(ortion)e(of)i(the)f
+(string)g(matc)m(hing)g(the)h(en)m(tire)g(regular)e(expression.)49
+b(The)33 b(elemen)m(t)630 4988 y(of)39 b Fs(BASH_REMATCH)c
+Ft(with)i(index)g Fq(n)g Ft(is)h(the)g(p)s(ortion)f(of)i(the)f(string)g
+(matc)m(hing)g(the)h Fq(n)p Ft(th)630 5097 y(paren)m(thesized)30
+b(sub)s(expression.)630 5230 y(Expressions)22 b(ma)m(y)i(b)s(e)e(com)m
+(bined)h(using)f(the)i(follo)m(wing)e(op)s(erators,)j(listed)d(in)g
+(decreasing)630 5340 y(order)30 b(of)g(precedence:)p
+eop
+%%Page: 13 19
+13 18 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(13)630 299 y Fs(\()30
+b Fj(expression)38 b Fs(\))1110 408 y Ft(Returns)30 b(the)h(v)-5
+b(alue)30 b(of)h Fq(expression)p Ft(.)41 b(This)29 b(ma)m(y)j(b)s(e)e
+(used)g(to)i(o)m(v)m(erride)f(the)1110 518 y(normal)e(precedence)i(of)g
+(op)s(erators.)630 667 y Fs(!)f Fj(expression)1110 776
+y Ft(T)-8 b(rue)30 b(if)f Fq(expression)g Ft(is)h(false.)630
+925 y Fj(expression1)38 b Fs(&&)30 b Fj(expression2)1110
+1034 y Ft(T)-8 b(rue)30 b(if)f(b)s(oth)h Fq(expression1)37
+b Ft(and)29 b Fq(expression2)37 b Ft(are)31 b(true.)630
+1183 y Fj(expression1)38 b Fs(||)30 b Fj(expression2)1110
+1292 y Ft(T)-8 b(rue)30 b(if)f(either)h Fq(expression1)37
+b Ft(or)30 b Fq(expression2)37 b Ft(is)29 b(true.)630
+1441 y(The)c Fs(&&)g Ft(and)g Fs(||)f Ft(op)s(erators)i(do)f(not)h(ev)
+-5 b(aluate)26 b Fq(expression2)32 b Ft(if)25 b(the)g(v)-5
+b(alue)25 b(of)h Fq(expression1)630 1550 y Ft(is)j(su\016cien)m(t)h(to)
+h(determine)f(the)g(return)g(v)-5 b(alue)30 b(of)g(the)h(en)m(tire)f
+(conditional)f(expression.)150 1758 y Fk(3.2.4.3)63 b(Grouping)43
+b(Commands)275 1997 y Ft(Bash)22 b(pro)m(vides)f(t)m(w)m(o)i(w)m(a)m
+(ys)g(to)g(group)f(a)g(list)f(of)h(commands)g(to)g(b)s(e)g(executed)h
+(as)f(a)h(unit.)36 b(When)22 b(com-)150 2106 y(mands)30
+b(are)i(group)s(ed,)f(redirections)f(ma)m(y)i(b)s(e)e(applied)g(to)i
+(the)f(en)m(tire)g(command)h(list.)42 b(F)-8 b(or)32
+b(example,)150 2216 y(the)f(output)f(of)g(all)f(the)i(commands)f(in)f
+(the)i(list)e(ma)m(y)i(b)s(e)e(redirected)h(to)h(a)g(single)e(stream.)
+150 2364 y Fs(\(\))870 2494 y(\()47 b Fj(list)58 b Fs(\))630
+2623 y Ft(Placing)28 b(a)h(list)e(of)i(commands)f(b)s(et)m(w)m(een)i
+(paren)m(theses)e(causes)i(a)f(subshell)c(en)m(vironmen)m(t)630
+2732 y(to)31 b(b)s(e)e(created)j(\(see)f(Section)f(3.7.3)i([Command)d
+(Execution)h(En)m(vironmen)m(t],)g(page)g(29\),)630 2842
+y(and)d(eac)m(h)i(of)e(the)h(commands)f(in)f Fq(list)i
+Ft(to)h(b)s(e)e(executed)h(in)e(that)i(subshell.)37 b(Since)27
+b(the)g Fq(list)630 2951 y Ft(is)h(executed)h(in)e(a)i(subshell,)e(v)-5
+b(ariable)27 b(assignmen)m(ts)h(do)h(not)g(remain)e(in)g(e\013ect)k
+(after)e(the)630 3061 y(subshell)e(completes.)150 3209
+y Fs({})870 3338 y({)47 b Fj(list)11 b Fs(;)46 b(})630
+3467 y Ft(Placing)28 b(a)i(list)e(of)i(commands)f(b)s(et)m(w)m(een)h
+(curly)e(braces)h(causes)h(the)f(list)f(to)i(b)s(e)f(executed)630
+3577 y(in)c(the)i(curren)m(t)g(shell)d(con)m(text.)42
+b(No)27 b(subshell)d(is)h(created.)41 b(The)26 b(semicolon)g(\(or)h
+(newline\))630 3687 y(follo)m(wing)i Fq(list)i Ft(is)e(required.)275
+3835 y(In)j(addition)f(to)i(the)g(creation)h(of)f(a)g(subshell,)e
+(there)i(is)f(a)h(subtle)e(di\013erence)i(b)s(et)m(w)m(een)g(these)h(t)
+m(w)m(o)150 3945 y(constructs)43 b(due)f(to)h(historical)e(reasons.)77
+b(The)42 b(braces)h(are)g Fs(reserved)28 b(words)p Ft(,)45
+b(so)d(they)h(m)m(ust)g(b)s(e)150 4054 y(separated)33
+b(from)f(the)g Fq(list)i Ft(b)m(y)e Fs(blank)p Ft(s.)45
+b(The)32 b(paren)m(theses)h(are)g Fs(operators)p Ft(,)d(and)i(are)h
+(recognized)g(as)150 4164 y(separate)e(tok)m(ens)h(b)m(y)e(the)h(shell)
+d(ev)m(en)j(if)e(they)i(are)g(not)f(separated)h(from)f(the)h
+Fq(list)g Ft(b)m(y)f(whitespace.)275 4293 y(The)f(exit)i(status)f(of)h
+(b)s(oth)f(of)g(these)h(constructs)g(is)e(the)i(exit)f(status)g(of)h
+Fq(list)p Ft(.)150 4534 y Fr(3.3)68 b(Shell)45 b(F)-11
+b(unctions)275 4773 y Ft(Shell)25 b(functions)h(are)h(a)h(w)m(a)m(y)g
+(to)g(group)f(commands)g(for)g(later)h(execution)f(using)f(a)i(single)e
+(name)h(for)150 4882 y(the)35 b(group.)55 b(They)35 b(are)g(executed)h
+(just)f(lik)m(e)f(a)i Fs(")p Ft(regular)p Fs(")e Ft(command.)54
+b(When)35 b(the)h(name)f(of)g(a)h(shell)150 4992 y(function)i(is)g
+(used)g(as)h(a)h(simple)d(command)i(name,)i(the)e(list)f(of)h(commands)
+g(asso)s(ciated)h(with)d(that)150 5101 y(function)24
+b(name)i(is)f(executed.)40 b(Shell)23 b(functions)h(are)j(executed)f
+(in)e(the)i(curren)m(t)g(shell)e(con)m(text;)29 b(no)c(new)150
+5211 y(pro)s(cess)30 b(is)f(created)j(to)f(in)m(terpret)f(them.)275
+5340 y(F)-8 b(unctions)29 b(are)i(declared)f(using)f(this)g(syn)m(tax:)
+p eop
+%%Page: 14 20
+14 19 bop 150 -116 a Ft(14)2572 b(Bash)31 b(Reference)g(Man)m(ual)390
+299 y Fs([)47 b(function)f(])h Fj(name)58 b Fs(\(\))47
+b Fj(compound-command)54 b Fs([)47 b Fj(redirections)55
+b Fs(])275 450 y Ft(This)30 b(de\014nes)i(a)h(shell)e(function)h(named)
+g Fq(name)p Ft(.)48 b(The)32 b(reserv)m(ed)h(w)m(ord)f
+Fs(function)f Ft(is)g(optional.)47 b(If)150 559 y(the)39
+b Fs(function)f Ft(reserv)m(ed)h(w)m(ord)g(is)f(supplied,)h(the)g
+(paren)m(theses)h(are)f(optional.)67 b(The)39 b Fq(b)s(o)s(dy)45
+b Ft(of)40 b(the)150 669 y(function)g(is)h(the)h(comp)s(ound)e(command)
+h Fq(comp)s(ound-command)j Ft(\(see)e(Section)g(3.2.4)h([Comp)s(ound)
+150 778 y(Commands],)33 b(page)g(9\).)48 b(That)33 b(command)g(is)e
+(usually)g(a)i Fq(list)g Ft(enclosed)f(b)s(et)m(w)m(een)i
+Fs({)e Ft(and)g Fs(})p Ft(,)h(but)f(ma)m(y)150 888 y(b)s(e)27
+b(an)m(y)h(comp)s(ound)e(command)h(listed)f(ab)s(o)m(v)m(e.)41
+b Fq(comp)s(ound-command)30 b Ft(is)d(executed)h(whenev)m(er)g
+Fq(name)150 998 y Ft(is)36 b(sp)s(eci\014ed)g(as)h(the)h(name)f(of)g(a)
+h(command.)61 b(An)m(y)37 b(redirections)f(\(see)i(Section)f(3.6)h
+([Redirections],)150 1107 y(page)31 b(24\))h(asso)s(ciated)f(with)e
+(the)h(shell)f(function)g(are)i(p)s(erformed)d(when)i(the)g(function)f
+(is)h(executed.)275 1258 y(The)c(exit)h(status)h(of)f(a)h(function)e
+(de\014nition)f(is)h(zero)i(unless)e(a)h(syn)m(tax)h(error)f(o)s(ccurs)
+g(or)g(a)h(readonly)150 1367 y(function)j(with)f(the)j(same)f(name)g
+(already)g(exists.)45 b(When)32 b(executed,)h(the)f(exit)g(status)h(of)
+f(a)g(function)150 1477 y(is)d(the)i(exit)f(status)h(of)f(the)h(last)f
+(command)g(executed)i(in)d(the)h(b)s(o)s(dy)-8 b(.)275
+1628 y(Note)22 b(that)f(for)f(historical)f(reasons,)k(in)d(the)h(most)g
+(common)g(usage)g(the)g(curly)e(braces)i(that)g(surround)150
+1737 y(the)38 b(b)s(o)s(dy)d(of)j(the)f(function)f(m)m(ust)h(b)s(e)g
+(separated)h(from)f(the)g(b)s(o)s(dy)f(b)m(y)h Fs(blank)p
+Ft(s)f(or)h(newlines.)60 b(This)150 1847 y(is)37 b(b)s(ecause)h(the)h
+(braces)f(are)h(reserv)m(ed)f(w)m(ords)g(and)f(are)i(only)e(recognized)
+i(as)f(suc)m(h)g(when)f(they)i(are)150 1956 y(separated)e(b)m(y)g
+(whitespace.)60 b(Also,)38 b(when)e(using)f(the)i(braces,)i(the)e
+Fq(list)h Ft(m)m(ust)e(b)s(e)g(terminated)h(b)m(y)g(a)150
+2066 y(semicolon,)30 b(a)h(`)p Fs(&)p Ft(',)f(or)h(a)g(newline.)275
+2217 y(When)h(a)i(function)e(is)g(executed,)j(the)e(argumen)m(ts)h(to)g
+(the)f(function)f(b)s(ecome)h(the)h(p)s(ositional)d(pa-)150
+2326 y(rameters)42 b(during)d(its)i(execution)h(\(see)g(Section)f
+(3.4.1)i([P)m(ositional)e(P)m(arameters],)46 b(page)c(15\).)75
+b(The)150 2436 y(sp)s(ecial)35 b(parameter)h(`)p Fs(#)p
+Ft(')g(that)h(expands)e(to)i(the)f(n)m(um)m(b)s(er)f(of)h(p)s
+(ositional)e(parameters)i(is)f(up)s(dated)g(to)150 2545
+y(re\015ect)28 b(the)g(c)m(hange.)41 b(P)m(ositional)27
+b(parameter)h Fs(0)f Ft(is)f(unc)m(hanged.)40 b(The)27
+b(\014rst)g(elemen)m(t)h(of)f(the)h Fs(FUNCNAME)150 2655
+y Ft(v)-5 b(ariable)25 b(is)h(set)h(to)h(the)f(name)f(of)h(the)g
+(function)e(while)g(the)i(function)e(is)h(executing.)39
+b(All)26 b(other)h(asp)s(ects)150 2765 y(of)32 b(the)g(shell)e
+(execution)j(en)m(vironmen)m(t)e(are)i(iden)m(tical)d(b)s(et)m(w)m(een)
+j(a)f(function)f(and)g(its)h(caller)f(with)g(the)150
+2874 y(exception)25 b(that)h(the)f Fs(DEBUG)f Ft(trap)h(b)s(elo)m(w\))g
+(is)f(not)i(inherited)c(unless)i(the)h(function)f(has)h(b)s(een)g(giv)m
+(en)g(the)150 2984 y Fs(trace)36 b Ft(attribute)g(using)g(the)h
+Fs(declare)e Ft(builtin)e(or)k(the)g Fs(-o)30 b(functrace)35
+b Ft(option)h(has)h(b)s(een)f(enabled)150 3093 y(with)c(the)h
+Fs(set)g Ft(builtin,)e(\(in)h(whic)m(h)g(case)i(all)e(functions)g
+(inherit)f(the)j Fs(DEBUG)e Ft(trap\).)49 b(See)34 b(Section)f(4.1)150
+3203 y([Bourne)d(Shell)f(Builtins],)f(page)j(33,)g(for)g(the)f
+(description)f(of)h(the)h Fs(trap)e Ft(builtin.)275 3354
+y(If)37 b(the)g(builtin)d(command)k Fs(return)d Ft(is)i(executed)h(in)f
+(a)h(function,)g(the)f(function)g(completes)h(and)150
+3463 y(execution)24 b(resumes)f(with)g(the)h(next)g(command)f(after)i
+(the)f(function)e(call.)38 b(An)m(y)24 b(command)f(asso)s(ciated)150
+3573 y(with)35 b(the)i Fs(RETURN)d Ft(trap)i(is)g(executed)h(b)s(efore)
+f(execution)h(resumes.)57 b(When)37 b(a)f(function)f(completes,)150
+3682 y(the)i(v)-5 b(alues)37 b(of)g(the)g(p)s(ositional)e(parameters)i
+(and)g(the)g(sp)s(ecial)f(parameter)h(`)p Fs(#)p Ft(')g(are)h(restored)
+f(to)h(the)150 3792 y(v)-5 b(alues)25 b(they)g(had)g(prior)e(to)j(the)g
+(function's)e(execution.)39 b(If)25 b(a)h(n)m(umeric)e(argumen)m(t)i
+(is)e(giv)m(en)h(to)h Fs(return)p Ft(,)150 3902 y(that)j(is)f(the)g
+(function's)g(return)f(status;)j(otherwise)e(the)g(function's)g(return)
+f(status)i(is)e(the)i(exit)g(status)150 4011 y(of)i(the)f(last)g
+(command)g(executed)i(b)s(efore)e(the)g Fs(return)p Ft(.)275
+4162 y(V)-8 b(ariables)29 b(lo)s(cal)g(to)h(the)g(function)e(ma)m(y)j
+(b)s(e)e(declared)g(with)f(the)i Fs(local)f Ft(builtin.)37
+b(These)29 b(v)-5 b(ariables)150 4271 y(are)31 b(visible)d(only)h(to)i
+(the)g(function)e(and)h(the)g(commands)g(it)g(in)m(v)m(ok)m(es.)275
+4422 y(F)-8 b(unction)37 b(names)g(and)g(de\014nitions)e(ma)m(y)k(b)s
+(e)e(listed)f(with)g(the)i(`)p Fs(-f)p Ft(')f(option)g(to)i(the)e
+Fs(declare)f Ft(or)150 4532 y Fs(typeset)d Ft(builtin)e(commands)k
+(\(see)h(Section)f(4.2)h([Bash)f(Builtins],)f(page)i(39\).)55
+b(The)35 b(`)p Fs(-F)p Ft(')g(option)f(to)150 4641 y
+Fs(declare)g Ft(or)i Fs(typeset)e Ft(will)f(list)i(the)h(function)f
+(names)h(only)f(\(and)h(optionally)e(the)i(source)g(\014le)g(and)150
+4751 y(line)31 b(n)m(um)m(b)s(er,)i(if)e(the)i Fs(extdebug)e
+Ft(shell)g(option)h(is)g(enabled\).)48 b(F)-8 b(unctions)32
+b(ma)m(y)i(b)s(e)e(exp)s(orted)g(so)h(that)150 4861 y(subshells)d
+(automatically)k(ha)m(v)m(e)g(them)g(de\014ned)e(with)g(the)h(`)p
+Fs(-f)p Ft(')h(option)f(to)h(the)f Fs(export)f Ft(builtin)e(\(see)150
+4970 y(Section)i(4.1)h([Bourne)f(Shell)e(Builtins],)h(page)i(33\).)47
+b(Note)33 b(that)g(shell)d(functions)h(and)g(v)-5 b(ariables)31
+b(with)150 5080 y(the)f(same)g(name)g(ma)m(y)g(result)f(in)g(m)m
+(ultiple)e(iden)m(tically-named)h(en)m(tries)i(in)e(the)i(en)m
+(vironmen)m(t)f(passed)150 5189 y(to)i(the)g(shell's)d(c)m(hildren.)39
+b(Care)30 b(should)f(b)s(e)g(tak)m(en)j(in)d(cases)i(where)f(this)f(ma)
+m(y)i(cause)g(a)g(problem.)275 5340 y(F)-8 b(unctions)29
+b(ma)m(y)i(b)s(e)f(recursiv)m(e.)40 b(No)31 b(limit)d(is)i(placed)g(on)
+g(the)g(n)m(um)m(b)s(er)g(of)g(recursiv)m(e)g(calls.)p
+eop
+%%Page: 15 21
+15 20 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(15)150 299 y Fr(3.4)68
+b(Shell)45 b(P)l(arameters)275 544 y Ft(A)32 b Fq(parameter)40
+b Ft(is)31 b(an)i(en)m(tit)m(y)g(that)g(stores)g(v)-5
+b(alues.)47 b(It)33 b(can)g(b)s(e)e(a)i Fs(name)p Ft(,)g(a)g(n)m(um)m
+(b)s(er,)f(or)g(one)h(of)g(the)150 654 y(sp)s(ecial)g(c)m(haracters)j
+(listed)e(b)s(elo)m(w.)52 b(A)35 b Fq(v)-5 b(ariable)39
+b Ft(is)33 b(a)i(parameter)h(denoted)e(b)m(y)h(a)g Fs(name)p
+Ft(.)52 b(A)35 b(v)-5 b(ariable)150 764 y(has)29 b(a)h
+Fq(v)-5 b(alue)34 b Ft(and)28 b(zero)j(or)e(more)g Fq(attributes)p
+Ft(.)40 b(A)m(ttributes)29 b(are)h(assigned)f(using)f(the)h
+Fs(declare)e Ft(builtin)150 873 y(command)22 b(\(see)h(the)f
+(description)e(of)i(the)g Fs(declare)f Ft(builtin)d(in)j(Section)h(4.2)
+h([Bash)f(Builtins],)g(page)g(39\).)275 1009 y(A)28 b(parameter)h(is)f
+(set)h(if)e(it)h(has)g(b)s(een)g(assigned)g(a)h(v)-5
+b(alue.)39 b(The)28 b(n)m(ull)f(string)g(is)h(a)h(v)-5
+b(alid)26 b(v)-5 b(alue.)40 b(Once)150 1119 y(a)31 b(v)-5
+b(ariable)29 b(is)g(set,)j(it)d(ma)m(y)i(b)s(e)f(unset)g(only)g(b)m(y)g
+(using)f(the)h Fs(unset)f Ft(builtin)e(command.)275 1254
+y(A)j(v)-5 b(ariable)29 b(ma)m(y)i(b)s(e)f(assigned)f(to)j(b)m(y)e(a)h
+(statemen)m(t)h(of)e(the)h(form)390 1390 y Fj(name)11
+b Fs(=[)p Fj(value)g Fs(])150 1526 y Ft(If)34 b Fq(v)-5
+b(alue)39 b Ft(is)34 b(not)h(giv)m(en,)g(the)g(v)-5 b(ariable)33
+b(is)h(assigned)g(the)g(n)m(ull)f(string.)52 b(All)33
+b Fq(v)-5 b(alue)5 b Ft(s)34 b(undergo)g(tilde)f(ex-)150
+1636 y(pansion,)i(parameter)g(and)f(v)-5 b(ariable)34
+b(expansion,)g(command)h(substitution,)f(arithmetic)g(expansion,)150
+1745 y(and)40 b(quote)h(remo)m(v)-5 b(al)41 b(\(detailed)g(b)s(elo)m
+(w\).)71 b(If)40 b(the)h(v)-5 b(ariable)39 b(has)i(its)f
+Fs(integer)f Ft(attribute)h(set,)k(then)150 1855 y Fq(v)-5
+b(alue)37 b Ft(is)32 b(ev)-5 b(aluated)33 b(as)g(an)g(arithmetic)f
+(expression)g(ev)m(en)i(if)d(the)i Fs($\(\(...)o(\)\))f
+Ft(expansion)g(is)g(not)h(used)150 1965 y(\(see)e(Section)f(3.5.5)j
+([Arithmetic)c(Expansion],)g(page)i(21\).)42 b(W)-8 b(ord)31
+b(splitting)d(is)i(not)g(p)s(erformed,)f(with)150 2074
+y(the)35 b(exception)g(of)g Fs("$@")f Ft(as)h(explained)e(b)s(elo)m(w.)
+53 b(Filename)34 b(expansion)g(is)g(not)h(p)s(erformed.)53
+b(Assign-)150 2184 y(men)m(t)33 b(statemen)m(ts)h(ma)m(y)f(also)f(app)s
+(ear)g(as)g(argumen)m(ts)h(to)g(the)g Fs(alias)p Ft(,)e
+Fs(declare)p Ft(,)g Fs(typeset)p Ft(,)g Fs(export)p Ft(,)150
+2293 y Fs(readonly)p Ft(,)d(and)i Fs(local)f Ft(builtin)e(commands.)150
+2520 y Fk(3.4.1)63 b(P)m(ositional)41 b(P)m(arameters)275
+2766 y Ft(A)36 b Fq(p)s(ositional)f(parameter)44 b Ft(is)36
+b(a)h(parameter)g(denoted)g(b)m(y)g(one)g(or)g(more)g(digits,)g(other)g
+(than)g(the)150 2875 y(single)i(digit)f Fs(0)p Ft(.)69
+b(P)m(ositional)39 b(parameters)i(are)f(assigned)f(from)h(the)g
+(shell's)e(argumen)m(ts)i(when)f(it)h(is)150 2985 y(in)m(v)m(ok)m(ed,)f
+(and)e(ma)m(y)g(b)s(e)g(reassigned)f(using)f(the)j Fs(set)e
+Ft(builtin)d(command.)61 b(P)m(ositional)36 b(parameter)h
+Fs(N)150 3094 y Ft(ma)m(y)27 b(b)s(e)g(referenced)f(as)h
+Fs(${N})p Ft(,)g(or)g(as)g Fs($N)f Ft(when)g Fs(N)g Ft(consists)h(of)g
+(a)g(single)e(digit.)39 b(P)m(ositional)26 b(parameters)150
+3204 y(ma)m(y)32 b(not)f(b)s(e)g(assigned)g(to)h(with)e(assignmen)m(t)h
+(statemen)m(ts.)45 b(The)30 b Fs(set)h Ft(and)g Fs(shift)e
+Ft(builtins)f(are)k(used)150 3314 y(to)h(set)f(and)f(unset)h(them)g
+(\(see)h(Chapter)e(4)h([Shell)e(Builtin)g(Commands],)h(page)i(33\).)47
+b(The)31 b(p)s(ositional)150 3423 y(parameters)24 b(are)g(temp)s
+(orarily)e(replaced)i(when)e(a)j(shell)d(function)g(is)h(executed)i
+(\(see)f(Section)g(3.3)h([Shell)150 3533 y(F)-8 b(unctions],)30
+b(page)i(13\).)275 3669 y(When)27 b(a)i(p)s(ositional)d(parameter)j
+(consisting)d(of)j(more)f(than)g(a)g(single)f(digit)g(is)g(expanded,)h
+(it)g(m)m(ust)150 3778 y(b)s(e)i(enclosed)g(in)f(braces.)150
+4005 y Fk(3.4.2)63 b(Sp)s(ecial)41 b(P)m(arameters)275
+4251 y Ft(The)27 b(shell)f(treats)j(sev)m(eral)f(parameters)h(sp)s
+(ecially)-8 b(.)38 b(These)28 b(parameters)g(ma)m(y)g(only)f(b)s(e)h
+(referenced;)150 4360 y(assignmen)m(t)i(to)h(them)g(is)e(not)i(allo)m
+(w)m(ed.)150 4522 y Fs(*)432 b Ft(Expands)29 b(to)h(the)h(p)s
+(ositional)c(parameters,)k(starting)f(from)f(one.)41
+b(When)30 b(the)g(expansion)630 4631 y(o)s(ccurs)e(within)d(double)i
+(quotes,)i(it)f(expands)f(to)i(a)f(single)f(w)m(ord)h(with)f(the)h(v)-5
+b(alue)28 b(of)g(eac)m(h)630 4741 y(parameter)i(separated)g(b)m(y)f
+(the)g(\014rst)g(c)m(haracter)i(of)e(the)h Fs(IFS)e Ft(sp)s(ecial)g(v)
+-5 b(ariable.)39 b(That)30 b(is,)630 4850 y Fs("$*")h
+Ft(is)h(equiv)-5 b(alen)m(t)31 b(to)j Fs("$1)p Fj(c)11
+b Fs($2)p Fj(c)g Fs(...)l(")p Ft(,)33 b(where)f Fq(c)38
+b Ft(is)31 b(the)i(\014rst)e(c)m(haracter)j(of)f(the)f(v)-5
+b(alue)630 4960 y(of)30 b(the)g Fs(IFS)g Ft(v)-5 b(ariable.)39
+b(If)30 b Fs(IFS)f Ft(is)g(unset,)h(the)g(parameters)g(are)h(separated)
+f(b)m(y)g(spaces.)41 b(If)630 5070 y Fs(IFS)29 b Ft(is)h(n)m(ull,)e
+(the)j(parameters)g(are)f(joined)g(without)f(in)m(terv)m(ening)h
+(separators.)150 5230 y Fs(@)432 b Ft(Expands)39 b(to)i(the)g(p)s
+(ositional)d(parameters,)44 b(starting)c(from)g(one.)71
+b(When)40 b(the)h(expan-)630 5340 y(sion)30 b(o)s(ccurs)h(within)d
+(double)i(quotes,)i(eac)m(h)g(parameter)g(expands)e(to)i(a)f(separate)h
+(w)m(ord.)p eop
+%%Page: 16 22
+16 21 bop 150 -116 a Ft(16)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(That)38 b(is,)i Fs("$@")d Ft(is)h(equiv)-5 b(alen)m(t)38
+b(to)h Fs("$1")29 b("$2")g(...)o Ft(.)65 b(When)38 b(there)h(are)g(no)f
+(p)s(ositional)630 408 y(parameters,)31 b Fs("$@")e Ft(and)h
+Fs($@)g Ft(expand)f(to)i(nothing)f(\(i.e.,)h(they)f(are)h(remo)m(v)m
+(ed\).)150 568 y Fs(#)432 b Ft(Expands)29 b(to)i(the)g(n)m(um)m(b)s(er)
+e(of)h(p)s(ositional)e(parameters)j(in)e(decimal.)150
+727 y Fs(?)432 b Ft(Expands)29 b(to)i(the)g(exit)f(status)h(of)f(the)h
+(most)f(recen)m(tly)h(executed)g(foreground)f(pip)s(eline.)150
+886 y Fs(-)432 b Ft(\(A)31 b(h)m(yphen.\))42 b(Expands)30
+b(to)h(the)g(curren)m(t)g(option)g(\015ags)g(as)g(sp)s(eci\014ed)e(up)s
+(on)h(in)m(v)m(o)s(cation,)630 996 y(b)m(y)35 b(the)h
+Fs(set)e Ft(builtin)e(command,)k(or)g(those)g(set)f(b)m(y)h(the)f
+(shell)f(itself)g(\(suc)m(h)h(as)h(the)f(`)p Fs(-i)p
+Ft(')630 1105 y(option\).)150 1264 y Fs($)432 b Ft(Expands)39
+b(to)j(the)f(pro)s(cess)f Fl(id)h Ft(of)g(the)g(shell.)71
+b(In)40 b(a)h Fs(\(\))f Ft(subshell,)h(it)f(expands)g(to)i(the)630
+1374 y(pro)s(cess)30 b Fl(id)g Ft(of)h(the)g(in)m(v)m(oking)e(shell,)g
+(not)i(the)f(subshell.)150 1533 y Fs(!)432 b Ft(Expands)39
+b(to)i(the)g(pro)s(cess)e Fl(id)i Ft(of)f(the)h(most)g(recen)m(tly)f
+(executed)h(bac)m(kground)g(\(asyn-)630 1643 y(c)m(hronous\))30
+b(command.)150 1802 y Fs(0)432 b Ft(Expands)20 b(to)j(the)f(name)g(of)g
+(the)g(shell)e(or)h(shell)f(script.)37 b(This)20 b(is)h(set)h(at)h
+(shell)d(initialization.)630 1911 y(If)44 b(Bash)g(is)f(in)m(v)m(ok)m
+(ed)i(with)e(a)h(\014le)f(of)i(commands)e(\(see)j(Section)e(3.8)h
+([Shell)d(Scripts],)630 2021 y(page)d(31\),)i Fs($0)d
+Ft(is)f(set)h(to)h(the)f(name)g(of)g(that)h(\014le.)63
+b(If)37 b(Bash)i(is)e(started)h(with)f(the)h(`)p Fs(-c)p
+Ft(')630 2131 y(option)h(\(see)h(Section)g(6.1)g([In)m(v)m(oking)g
+(Bash],)i(page)e(63\),)j(then)d Fs($0)e Ft(is)h(set)h(to)g(the)g
+(\014rst)630 2240 y(argumen)m(t)31 b(after)g(the)g(string)f(to)h(b)s(e)
+f(executed,)i(if)e(one)h(is)e(presen)m(t.)42 b(Otherwise,)30
+b(it)g(is)f(set)630 2350 y(to)i(the)g(\014lename)e(used)h(to)h(in)m(v)m
+(ok)m(e)g(Bash,)g(as)g(giv)m(en)f(b)m(y)g(argumen)m(t)h(zero.)150
+2509 y Fs(_)432 b Ft(\(An)34 b(underscore.\))50 b(A)m(t)34
+b(shell)e(startup,)j(set)f(to)g(the)g(absolute)f(\014lename)g(of)h(the)
+g(shell)e(or)630 2619 y(shell)j(script)i(b)s(eing)e(executed)j(as)g
+(passed)f(in)f(the)h(argumen)m(t)h(list.)60 b(Subsequen)m(tly)-8
+b(,)37 b(ex-)630 2728 y(pands)f(to)i(the)g(last)f(argumen)m(t)h(to)h
+(the)e(previous)f(command,)j(after)f(expansion.)61 b(Also)630
+2838 y(set)30 b(to)f(the)h(full)c(pathname)j(of)h(eac)m(h)g(command)f
+(executed)h(and)e(placed)h(in)e(the)j(en)m(viron-)630
+2947 y(men)m(t)37 b(exp)s(orted)f(to)h(that)h(command.)58
+b(When)37 b(c)m(hec)m(king)g(mail,)g(this)e(parameter)i(holds)630
+3057 y(the)31 b(name)f(of)h(the)f(mail)f(\014le.)150
+3314 y Fr(3.5)68 b(Shell)45 b(Expansions)275 3558 y Ft(Expansion)28
+b(is)h(p)s(erformed)f(on)i(the)g(command)g(line)e(after)j(it)e(has)h(b)
+s(een)f(split)f(in)m(to)i Fs(token)p Ft(s.)39 b(There)150
+3667 y(are)31 b(sev)m(en)g(kinds)d(of)j(expansion)e(p)s(erformed:)225
+3802 y Fp(\017)60 b Ft(brace)31 b(expansion)225 3936
+y Fp(\017)60 b Ft(tilde)29 b(expansion)225 4071 y Fp(\017)60
+b Ft(parameter)31 b(and)f(v)-5 b(ariable)29 b(expansion)225
+4205 y Fp(\017)60 b Ft(command)30 b(substitution)225
+4339 y Fp(\017)60 b Ft(arithmetic)30 b(expansion)225
+4474 y Fp(\017)60 b Ft(w)m(ord)30 b(splitting)225 4608
+y Fp(\017)60 b Ft(\014lename)30 b(expansion)275 4767
+y(The)j(order)g(of)h(expansions)f(is:)46 b(brace)34 b(expansion,)g
+(tilde)f(expansion,)g(parameter,)j(v)-5 b(ariable,)34
+b(and)150 4877 y(arithmetic)44 b(expansion)g(and)h(command)f
+(substitution)f(\(done)i(in)f(a)h(left-to-righ)m(t)h(fashion\),)i(w)m
+(ord)150 4986 y(splitting,)28 b(and)i(\014lename)g(expansion.)275
+5121 y(On)42 b(systems)h(that)h(can)g(supp)s(ort)e(it,)k(there)e(is)e
+(an)i(additional)d(expansion)h(a)m(v)-5 b(ailable:)66
+b Fq(pro)s(cess)150 5230 y(substitution)p Ft(.)59 b(This)35
+b(is)h(p)s(erformed)g(at)i(the)f(same)h(time)e(as)i(parameter,)h(v)-5
+b(ariable,)38 b(and)f(arithmetic)150 5340 y(expansion)29
+b(and)h(command)g(substitution.)p eop
+%%Page: 17 23
+17 22 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(17)275 299 y(Only)34
+b(brace)j(expansion,)g(w)m(ord)f(splitting,)g(and)g(\014lename)f
+(expansion)g(can)i(c)m(hange)h(the)e(n)m(um)m(b)s(er)150
+408 y(of)h(w)m(ords)f(of)g(the)h(expansion;)h(other)f(expansions)e
+(expand)h(a)h(single)e(w)m(ord)h(to)h(a)g(single)e(w)m(ord.)58
+b(The)150 518 y(only)31 b(exceptions)i(to)g(this)e(are)i(the)f
+(expansions)f(of)i Fs("$@")e Ft(\(see)i(Section)f(3.4.2)i([Sp)s(ecial)d
+(P)m(arameters],)150 628 y(page)g(15\))h(and)d Fs("${)p
+Fj(name)11 b Fs([@]}")27 b Ft(\(see)k(Section)g(6.7)g([Arra)m(ys],)g
+(page)g(72\).)275 787 y(After)41 b(all)g(expansions,)i
+Fs(quote)29 b(removal)40 b Ft(\(see)i(Section)g(3.5.9)h([Quote)f(Remo)m
+(v)-5 b(al],)46 b(page)c(24\))h(is)150 897 y(p)s(erformed.)150
+1172 y Fk(3.5.1)63 b(Brace)40 b(Expansion)275 1441 y
+Ft(Brace)21 b(expansion)f(is)g(a)h(mec)m(hanism)f(b)m(y)h(whic)m(h)e
+(arbitrary)h(strings)f(ma)m(y)j(b)s(e)e(generated.)38
+b(This)19 b(mec)m(h-)150 1551 y(anism)34 b(is)h(similar)d(to)k
+Fq(\014lename)f(expansion)f Ft(\(see)j(Section)e(3.5.8)i([Filename)e
+(Expansion],)g(page)h(22\),)150 1660 y(but)31 b(the)h(\014le)f(names)g
+(generated)i(need)f(not)g(exist.)44 b(P)m(atterns)33
+b(to)f(b)s(e)f(brace)h(expanded)f(tak)m(e)i(the)f(form)150
+1770 y(of)26 b(an)f(optional)f Fq(pream)m(ble)p Ft(,)i(follo)m(w)m(ed)f
+(b)m(y)h(either)f(a)g(series)g(of)h(comma-separated)h(strings)d(or)h(a)
+h(sequnce)150 1879 y(expression)35 b(b)s(et)m(w)m(een)h(a)h(pair)d(of)j
+(braces,)g(follo)m(w)m(ed)f(b)m(y)g(an)g(optional)f Fq(p)s(ostscript)p
+Ft(.)56 b(The)36 b(pream)m(ble)f(is)150 1989 y(pre\014xed)28
+b(to)h(eac)m(h)h(string)e(con)m(tained)h(within)d(the)j(braces,)g(and)g
+(the)g(p)s(ostscript)e(is)h(then)g(app)s(ended)f(to)150
+2099 y(eac)m(h)32 b(resulting)c(string,)i(expanding)e(left)j(to)g(righ)
+m(t.)275 2258 y(Brace)37 b(expansions)e(ma)m(y)i(b)s(e)f(nested.)59
+b(The)36 b(results)f(of)i(eac)m(h)g(expanded)f(string)f(are)i(not)g
+(sorted;)150 2368 y(left)30 b(to)h(righ)m(t)f(order)g(is)f(preserv)m
+(ed.)41 b(F)-8 b(or)31 b(example,)390 2528 y Fs(bash$)46
+b(echo)h(a{d,c,b}e)390 2637 y(ade)g(ace)g(abe)275 2797
+y Ft(A)24 b(sequence)h(expression)f(tak)m(es)i(the)f(form)f
+Fs({)p Fj(x)p Fs(..)p Fj(y)11 b Fs(})p Ft(,)23 b(where)i
+Fq(x)30 b Ft(and)24 b Fq(y)33 b Ft(are)25 b(either)f(in)m(tegers)h(or)f
+(single)150 2907 y(c)m(haracters.)43 b(When)30 b(in)m(tegers)h(are)g
+(supplied,)c(the)k(expression)e(expands)h(to)h(eac)m(h)h(n)m(um)m(b)s
+(er)d(b)s(et)m(w)m(een)i Fq(x)150 3016 y Ft(and)i Fq(y)p
+Ft(,)i(inclusiv)m(e.)50 b(When)34 b(c)m(haracters)h(are)f(supplied,)e
+(the)j(expression)d(expands)h(to)i(eac)m(h)g(c)m(haracter)150
+3126 y(lexicographically)28 b(b)s(et)m(w)m(een)j Fq(x)37
+b Ft(and)30 b Fq(y)p Ft(,)h(inclusiv)m(e.)39 b(Note)31
+b(that)g(b)s(oth)f Fq(x)37 b Ft(and)30 b Fq(y)38 b Ft(m)m(ust)30
+b(b)s(e)g(of)h(the)g(same)150 3235 y(t)m(yp)s(e.)275
+3395 y(Brace)36 b(expansion)f(is)f(p)s(erformed)g(b)s(efore)h(an)m(y)h
+(other)g(expansions,)g(and)f(an)m(y)g(c)m(haracters)i(sp)s(ecial)150
+3505 y(to)32 b(other)g(expansions)f(are)h(preserv)m(ed)f(in)g(the)g
+(result.)44 b(It)32 b(is)f(strictly)f(textual.)45 b(Bash)32
+b(do)s(es)f(not)h(apply)150 3614 y(an)m(y)27 b(syn)m(tactic)h(in)m
+(terpretation)f(to)h(the)f(con)m(text)i(of)e(the)g(expansion)f(or)h
+(the)h(text)g(b)s(et)m(w)m(een)f(the)h(braces.)150 3724
+y(T)-8 b(o)37 b(a)m(v)m(oid)f(con\015icts)g(with)f(parameter)i
+(expansion,)f(the)h(string)e(`)p Fs(${)p Ft(')h(is)f(not)h(considered)f
+(eligible)f(for)150 3833 y(brace)d(expansion.)275 3993
+y(A)e(correctly-formed)h(brace)g(expansion)e(m)m(ust)i(con)m(tain)g
+(unquoted)f(op)s(ening)f(and)h(closing)g(braces,)150
+4103 y(and)j(at)i(least)f(one)g(unquoted)g(comma)g(or)g(a)h(v)-5
+b(alid)31 b(sequence)i(expression.)47 b(An)m(y)33 b(incorrectly)f
+(formed)150 4212 y(brace)f(expansion)e(is)g(left)h(unc)m(hanged.)275
+4372 y(A)25 b Fs({)g Ft(or)g(`)p Fs(,)p Ft(')g(ma)m(y)h(b)s(e)f(quoted)
+g(with)f(a)i(bac)m(kslash)e(to)i(prev)m(en)m(t)g(its)f(b)s(eing)f
+(considered)g(part)h(of)g(a)h(brace)150 4482 y(expression.)50
+b(T)-8 b(o)34 b(a)m(v)m(oid)h(con\015icts)e(with)g(parameter)h
+(expansion,)g(the)g(string)f(`)p Fs(${)p Ft(')h(is)f(not)h(considered)
+150 4591 y(eligible)28 b(for)i(brace)h(expansion.)275
+4751 y(This)e(construct)i(is)f(t)m(ypically)g(used)g(as)h(shorthand)f
+(when)g(the)h(common)g(pre\014x)f(of)h(the)g(strings)f(to)150
+4861 y(b)s(e)g(generated)h(is)f(longer)g(than)g(in)f(the)h(ab)s(o)m(v)m
+(e)i(example:)390 5020 y Fs(mkdir)46 b(/usr/local/src/bash/{old,n)o
+(ew,)o(dist)o(,bug)o(s})275 5180 y Ft(or)390 5340 y Fs(chown)g(root)h
+(/usr/{ucb/{ex,edit},lib/)o({ex?)o(.?*,)o(how)o(_ex})o(})p
+eop
+%%Page: 18 24
+18 23 bop 150 -116 a Ft(18)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fk(3.5.2)63 b(Tilde)41 b(Expansion)275 541 y Ft(If)i(a)i(w)m(ord)
+e(b)s(egins)g(with)f(an)i(unquoted)f(tilde)g(c)m(haracter)j(\(`)p
+Fs(~)p Ft('\),)i(all)43 b(of)i(the)f(c)m(haracters)h(up)e(to)150
+651 y(the)35 b(\014rst)f(unquoted)f(slash)h(\(or)h(all)e(c)m
+(haracters,)k(if)d(there)h(is)e(no)i(unquoted)e(slash\))h(are)h
+(considered)f(a)150 760 y Fq(tilde-pre\014x)p Ft(.)53
+b(If)35 b(none)g(of)g(the)g(c)m(haracters)i(in)c(the)j(tilde-pre\014x)d
+(are)i(quoted,)i(the)e(c)m(haracters)i(in)d(the)150 870
+y(tilde-pre\014x)25 b(follo)m(wing)g(the)i(tilde)f(are)h(treated)h(as)f
+(a)g(p)s(ossible)d Fq(login)i(name)p Ft(.)39 b(If)27
+b(this)e(login)h(name)h(is)f(the)150 979 y(n)m(ull)j(string,)i(the)g
+(tilde)f(is)h(replaced)g(with)f(the)h(v)-5 b(alue)31
+b(of)g(the)h Fs(HOME)e Ft(shell)f(v)-5 b(ariable.)43
+b(If)31 b Fs(HOME)f Ft(is)g(unset,)150 1089 y(the)37
+b(home)f(directory)g(of)h(the)f(user)g(executing)h(the)g(shell)d(is)i
+(substituted)f(instead.)58 b(Otherwise,)37 b(the)150
+1198 y(tilde-pre\014x)28 b(is)i(replaced)g(with)f(the)h(home)h
+(directory)f(asso)s(ciated)g(with)f(the)i(sp)s(eci\014ed)e(login)g
+(name.)275 1331 y(If)j(the)h(tilde-pre\014x)d(is)i(`)p
+Fs(~+)p Ft(',)h(the)g(v)-5 b(alue)32 b(of)h(the)g(shell)e(v)-5
+b(ariable)32 b Fs(PWD)f Ft(replaces)i(the)g(tilde-pre\014x.)45
+b(If)150 1441 y(the)31 b(tilde-pre\014x)d(is)h(`)p Fs(~-)p
+Ft(',)i(the)f(v)-5 b(alue)30 b(of)h(the)f(shell)f(v)-5
+b(ariable)29 b Fs(OLDPWD)p Ft(,)g(if)g(it)h(is)g(set,)h(is)e
+(substituted.)275 1573 y(If)g(the)h(c)m(haracters)h(follo)m(wing)e(the)
+h(tilde)e(in)h(the)h(tilde-pre\014x)e(consist)h(of)h(a)h(n)m(um)m(b)s
+(er)d Fq(N)p Ft(,)j(optionally)150 1683 y(pre\014xed)22
+b(b)m(y)h(a)h(`)p Fs(+)p Ft(')f(or)h(a)f(`)p Fs(-)p Ft(',)j(the)d
+(tilde-pre\014x)e(is)i(replaced)f(with)g(the)i(corresp)s(onding)d
+(elemen)m(t)j(from)f(the)150 1792 y(directory)35 b(stac)m(k,)j(as)e(it)
+f(w)m(ould)f(b)s(e)h(displa)m(y)m(ed)f(b)m(y)i(the)f
+Fs(dirs)g Ft(builtin)d(in)m(v)m(ok)m(ed)k(with)e(the)h(c)m(haracters)
+150 1902 y(follo)m(wing)i(tilde)g(in)h(the)g(tilde-pre\014x)f(as)i(an)f
+(argumen)m(t)h(\(see)h(Section)e(6.8)i([The)e(Directory)h(Stac)m(k],)
+150 2011 y(page)d(73\).)57 b(If)35 b(the)g(tilde-pre\014x,)g(sans)g
+(the)h(tilde,)f(consists)g(of)h(a)f(n)m(um)m(b)s(er)f(without)h(a)g
+(leading)f(`)p Fs(+)p Ft(')i(or)150 2121 y(`)p Fs(-)p
+Ft(',)31 b(`)p Fs(+)p Ft(')f(is)g(assumed.)275 2253 y(If)f(the)i(login)
+e(name)i(is)e(in)m(v)-5 b(alid,)28 b(or)j(the)f(tilde)f(expansion)g
+(fails,)h(the)g(w)m(ord)g(is)g(left)g(unc)m(hanged.)275
+2386 y(Eac)m(h)f(v)-5 b(ariable)29 b(assignmen)m(t)g(is)f(c)m(hec)m(k)m
+(ed)j(for)e(unquoted)g(tilde-pre\014xes)e(immediately)h(follo)m(wing)g
+(a)150 2495 y(`)p Fs(:)p Ft(')j(or)f(`)p Fs(=)p Ft('.)42
+b(In)30 b(these)h(cases,)h(tilde)d(expansion)h(is)f(also)i(p)s
+(erformed.)40 b(Consequen)m(tly)-8 b(,)30 b(one)h(ma)m(y)h(use)e
+(\014le)150 2605 y(names)f(with)e(tildes)g(in)g(assignmen)m(ts)i(to)g
+Fs(PATH)p Ft(,)f Fs(MAILPATH)p Ft(,)f(and)h Fs(CDPATH)p
+Ft(,)f(and)h(the)h(shell)e(assigns)h(the)150 2715 y(expanded)i(v)-5
+b(alue.)275 2847 y(The)29 b(follo)m(wing)g(table)i(sho)m(ws)f(ho)m(w)g
+(Bash)h(treats)g(unquoted)e(tilde-pre\014xes:)150 3002
+y Fs(~)432 b Ft(The)30 b(v)-5 b(alue)30 b(of)g Fs($HOME)150
+3158 y(~/foo)240 b Ft(`)p Fs($HOME/foo)p Ft(')150 3313
+y Fs(~fred/foo)630 3423 y Ft(The)30 b(sub)s(directory)e
+Fs(foo)i Ft(of)g(the)h(home)f(directory)g(of)h(the)f(user)g
+Fs(fred)150 3578 y(~+/foo)192 b Ft(`)p Fs($PWD/foo)p
+Ft(')150 3733 y Fs(~-/foo)g Ft(`)p Fs(${OLDPWD-'~-'}/foo)p
+Ft(')150 3889 y Fs(~)p Fj(N)384 b Ft(The)30 b(string)f(that)i(w)m(ould)
+e(b)s(e)h(displa)m(y)m(ed)f(b)m(y)h(`)p Fs(dirs)g(+)p
+Fj(N)11 b Ft(')150 4044 y Fs(~+)p Fj(N)336 b Ft(The)30
+b(string)f(that)i(w)m(ould)e(b)s(e)h(displa)m(y)m(ed)f(b)m(y)h(`)p
+Fs(dirs)g(+)p Fj(N)11 b Ft(')150 4199 y Fs(~-)p Fj(N)336
+b Ft(The)30 b(string)f(that)i(w)m(ould)e(b)s(e)h(displa)m(y)m(ed)f(b)m
+(y)h(`)p Fs(dirs)g(-)p Fj(N)11 b Ft(')150 4418 y Fk(3.5.3)63
+b(Shell)41 b(P)m(arameter)e(Expansion)275 4660 y Ft(The)26
+b(`)p Fs($)p Ft(')i(c)m(haracter)h(in)m(tro)s(duces)d(parameter)i
+(expansion,)f(command)g(substitution,)f(or)i(arithmetic)150
+4769 y(expansion.)37 b(The)22 b(parameter)h(name)f(or)g(sym)m(b)s(ol)g
+(to)h(b)s(e)e(expanded)h(ma)m(y)h(b)s(e)f(enclosed)g(in)f(braces,)j
+(whic)m(h)150 4879 y(are)31 b(optional)e(but)h(serv)m(e)h(to)h(protect)
+f(the)g(v)-5 b(ariable)29 b(to)i(b)s(e)f(expanded)g(from)g(c)m
+(haracters)i(immediately)150 4988 y(follo)m(wing)d(it)h(whic)m(h)f
+(could)g(b)s(e)h(in)m(terpreted)g(as)g(part)h(of)f(the)h(name.)275
+5121 y(When)44 b(braces)i(are)f(used,)j(the)e(matc)m(hing)f(ending)f
+(brace)h(is)f(the)h(\014rst)g(`)p Fs(})p Ft(')g(not)g(escap)s(ed)h(b)m
+(y)f(a)150 5230 y(bac)m(kslash)39 b(or)g(within)e(a)i(quoted)g(string,)
+i(and)d(not)i(within)c(an)j(em)m(b)s(edded)f(arithmetic)h(expansion,)
+150 5340 y(command)30 b(substitution,)e(or)j(parameter)g(expansion.)p
+eop
+%%Page: 19 25
+19 24 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(19)275 299 y(The)40 b(basic)g(form)h
+(of)g(parameter)h(expansion)d(is)h($)p Fs({)p Fq(parameter)7
+b Fs(})p Ft(.)73 b(The)40 b(v)-5 b(alue)41 b(of)g Fq(parameter)48
+b Ft(is)150 408 y(substituted.)42 b(The)31 b(braces)g(are)h(required)d
+(when)i Fq(parameter)38 b Ft(is)30 b(a)i(p)s(ositional)d(parameter)j
+(with)e(more)150 518 y(than)i(one)g(digit,)g(or)g(when)g
+Fq(parameter)39 b Ft(is)31 b(follo)m(w)m(ed)h(b)m(y)g(a)h(c)m(haracter)
+h(that)e(is)g(not)g(to)h(b)s(e)f(in)m(terpreted)150 628
+y(as)f(part)f(of)g(its)g(name.)275 772 y(If)c(the)i(\014rst)f(c)m
+(haracter)i(of)e Fq(parameter)35 b Ft(is)26 b(an)h(exclamation)h(p)s
+(oin)m(t,)f(a)h(lev)m(el)f(of)g(v)-5 b(ariable)27 b(indirection)150
+882 y(is)37 b(in)m(tro)s(duced.)61 b(Bash)38 b(uses)f(the)h(v)-5
+b(alue)37 b(of)h(the)g(v)-5 b(ariable)37 b(formed)g(from)g(the)h(rest)g
+(of)g Fq(parameter)45 b Ft(as)150 991 y(the)32 b(name)h(of)f(the)h(v)-5
+b(ariable;)32 b(this)f(v)-5 b(ariable)31 b(is)h(then)g(expanded)f(and)h
+(that)h(v)-5 b(alue)31 b(is)h(used)f(in)g(the)i(rest)150
+1101 y(of)h(the)f(substitution,)g(rather)g(than)g(the)h(v)-5
+b(alue)33 b(of)h Fq(parameter)40 b Ft(itself.)49 b(This)32
+b(is)g(kno)m(wn)h(as)h Fs(indirect)150 1210 y(expansion)p
+Ft(.)81 b(The)44 b(exceptions)g(to)i(this)d(are)i(the)g(expansions)e
+(of)i($)p Fs({)p Ft(!)p Fq(pre\014x*)8 b Fs(})43 b Ft(and)h($)p
+Fs({)p Ft(!)p Fq(name)5 b Ft([)p Fs(@)p Ft(])p Fs(})150
+1320 y Ft(describ)s(ed)27 b(b)s(elo)m(w.)40 b(The)28
+b(exclamation)h(p)s(oin)m(t)g(m)m(ust)g(immediately)e(follo)m(w)h(the)i
+(left)e(brace)i(in)e(order)g(to)150 1430 y(in)m(tro)s(duce)h
+(indirection.)275 1574 y(In)39 b(eac)m(h)i(of)g(the)f(cases)h(b)s(elo)m
+(w,)h Fq(w)m(ord)i Ft(is)39 b(sub)5 b(ject)40 b(to)h(tilde)d
+(expansion,)k(parameter)f(expansion,)150 1684 y(command)30
+b(substitution,)e(and)i(arithmetic)g(expansion.)275 1828
+y(When)j(not)g(p)s(erforming)e(substring)g(expansion,)j(Bash)f(tests)h
+(for)f(a)h(parameter)g(that)g(is)e(unset)h(or)150 1938
+y(n)m(ull;)j(omitting)e(the)h(colon)g(results)f(in)g(a)i(test)g(only)e
+(for)h(a)g(parameter)h(that)f(is)g(unset.)54 b(Put)35
+b(another)150 2047 y(w)m(a)m(y)-8 b(,)31 b(if)d(the)h(colon)g(is)f
+(included,)e(the)j(op)s(erator)h(tests)f(for)g(b)s(oth)f(existence)h
+(and)g(that)g(the)g(v)-5 b(alue)29 b(is)f(not)150 2157
+y(n)m(ull;)h(if)g(the)h(colon)h(is)e(omitted,)i(the)f(op)s(erator)h
+(tests)g(only)f(for)g(existence.)150 2331 y Fs(${)p Fj(parameter)11
+b Fs(:)p Fp(\000)p Fj(word)g Fs(})630 2441 y Ft(If)30
+b Fq(parameter)37 b Ft(is)29 b(unset)h(or)h(n)m(ull,)d(the)j(expansion)
+e(of)h Fq(w)m(ord)k Ft(is)29 b(substituted.)39 b(Otherwise,)630
+2550 y(the)31 b(v)-5 b(alue)29 b(of)i Fq(parameter)37
+b Ft(is)30 b(substituted.)150 2720 y Fs(${)p Fj(parameter)11
+b Fs(:=)p Fj(word)g Fs(})630 2829 y Ft(If)33 b Fq(parameter)40
+b Ft(is)32 b(unset)g(or)h(n)m(ull,)f(the)h(expansion)f(of)h
+Fq(w)m(ord)j Ft(is)c(assigned)g(to)i Fq(parameter)p Ft(.)630
+2939 y(The)c(v)-5 b(alue)31 b(of)g Fq(parameter)38 b
+Ft(is)30 b(then)h(substituted.)41 b(P)m(ositional)30
+b(parameters)h(and)f(sp)s(ecial)630 3049 y(parameters)h(ma)m(y)g(not)f
+(b)s(e)g(assigned)g(to)h(in)e(this)g(w)m(a)m(y)-8 b(.)150
+3218 y Fs(${)p Fj(parameter)11 b Fs(:?)p Fj(word)g Fs(})630
+3328 y Ft(If)26 b Fq(parameter)33 b Ft(is)25 b(n)m(ull)f(or)i(unset,)h
+(the)f(expansion)f(of)h Fq(w)m(ord)k Ft(\(or)c(a)h(message)g(to)g(that)
+f(e\013ect)630 3437 y(if)h Fq(w)m(ord)k Ft(is)c(not)h(presen)m(t\))h
+(is)e(written)g(to)i(the)f(standard)f(error)h(and)f(the)h(shell,)f(if)g
+(it)h(is)f(not)630 3547 y(in)m(teractiv)m(e,)k(exits.)41
+b(Otherwise,)29 b(the)i(v)-5 b(alue)30 b(of)g Fq(parameter)38
+b Ft(is)29 b(substituted.)150 3716 y Fs(${)p Fj(parameter)11
+b Fs(:+)p Fj(word)g Fs(})630 3826 y Ft(If)35 b Fq(parameter)42
+b Ft(is)35 b(n)m(ull)e(or)j(unset,)g(nothing)f(is)f(substituted,)i
+(otherwise)e(the)i(expansion)630 3935 y(of)31 b Fq(w)m(ord)i
+Ft(is)d(substituted.)150 4105 y Fs(${)p Fj(parameter)11
+b Fs(:)p Fj(offset)g Fs(})150 4214 y(${)p Fj(parameter)g
+Fs(:)p Fj(offset)g Fs(:)p Fj(le)o(ngt)o(h)g Fs(})630
+4324 y Ft(Expands)44 b(to)i(up)e(to)i Fq(length)f Ft(c)m(haracters)i
+(of)e Fq(parameter)53 b Ft(starting)45 b(at)h(the)f(c)m(haracter)630
+4433 y(sp)s(eci\014ed)29 b(b)m(y)i Fq(o\013set)p Ft(.)42
+b(If)31 b Fq(length)f Ft(is)g(omitted,)h(expands)f(to)h(the)g
+(substring)e(of)h Fq(parameter)630 4543 y Ft(starting)37
+b(at)h(the)f(c)m(haracter)i(sp)s(eci\014ed)d(b)m(y)h
+Fq(o\013set)p Ft(.)62 b Fq(length)37 b Ft(and)g Fq(o\013set)j
+Ft(are)e(arithmetic)630 4653 y(expressions)29 b(\(see)j(Section)f(6.5)h
+([Shell)d(Arithmetic],)h(page)i(70\).)43 b(This)29 b(is)h(referred)g
+(to)i(as)630 4762 y(Substring)c(Expansion.)630 4902 y
+Fq(length)f Ft(m)m(ust)h(ev)-5 b(aluate)28 b(to)g(a)h(n)m(um)m(b)s(er)d
+(greater)j(than)e(or)h(equal)f(to)i(zero.)40 b(If)27
+b Fq(o\013set)k Ft(ev)-5 b(alu-)630 5011 y(ates)24 b(to)h(a)e(n)m(um)m
+(b)s(er)f(less)h(than)g(zero,)j(the)e(v)-5 b(alue)23
+b(is)f(used)h(as)g(an)h(o\013set)g(from)f(the)g(end)g(of)h(the)630
+5121 y(v)-5 b(alue)21 b(of)g Fq(parameter)p Ft(.)38 b(If)21
+b Fq(parameter)28 b Ft(is)20 b(`)p Fs(@)p Ft(',)j(the)f(result)e(is)g
+Fq(length)h Ft(p)s(ositional)e(parameters)630 5230 y(b)s(eginning)25
+b(at)k Fq(o\013set)p Ft(.)41 b(If)28 b Fq(parameter)35
+b Ft(is)27 b(an)h(arra)m(y)h(name)f(indexed)e(b)m(y)i(`)p
+Fs(@)p Ft(')g(or)g(`)p Fs(*)p Ft(',)h(the)g(re-)630 5340
+y(sult)20 b(is)h(the)g Fq(length)g Ft(mem)m(b)s(ers)g(of)g(the)h(arra)m
+(y)f(b)s(eginning)e(with)h Fs(${)p Fj(parameter)11 b
+Fs([)p Fj(offset)g Fs(]})p Ft(.)p eop
+%%Page: 20 26
+20 25 bop 150 -116 a Ft(20)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(Substring)g(indexing)h(is)g(zero-based)j(unless)d(the)i(p)s
+(ositional)d(parameters)j(are)g(used,)g(in)630 408 y(whic)m(h)29
+b(case)j(the)e(indexing)e(starts)j(at)g(1.)150 573 y
+Fs(${!)p Fj(prefix)11 b Fs(*})150 682 y(${!)p Fj(prefix)g
+Fs(@})630 792 y Ft(Expands)34 b(to)j(the)f(names)g(of)g(v)-5
+b(ariables)35 b(whose)g(names)h(b)s(egin)e(with)h Fq(pre\014x)p
+Ft(,)h(separated)630 902 y(b)m(y)30 b(the)h(\014rst)e(c)m(haracter)j
+(of)f(the)g Fs(IFS)e Ft(sp)s(ecial)g(v)-5 b(ariable.)150
+1066 y Fs(${!)p Fj(name)11 b Fs([@]})150 1176 y(${!)p
+Fj(name)g Fs([*]})630 1285 y Ft(If)26 b Fq(name)32 b
+Ft(is)26 b(an)g(arra)m(y)h(v)-5 b(ariable,)27 b(expands)f(to)h(the)g
+(list)e(of)i(arra)m(y)g(indices)e(\(k)m(eys\))j(assigned)630
+1395 y(in)23 b Fq(name)p Ft(.)39 b(If)24 b Fq(name)30
+b Ft(is)23 b(not)i(an)f(arra)m(y)-8 b(,)27 b(expands)c(to)j(0)f(if)e
+Fq(name)30 b Ft(is)23 b(set)i(and)f(n)m(ull)e(otherwise.)630
+1504 y(When)39 b(`)p Fs(@)p Ft(')h(is)e(used)h(and)f(the)i(expansion)e
+(app)s(ears)h(within)d(double)i(quotes,)43 b(eac)m(h)d(k)m(ey)630
+1614 y(expands)30 b(to)h(a)f(separate)i(w)m(ord.)150
+1778 y Fs(${#)p Fj(parameter)11 b Fs(})630 1888 y Ft(The)40
+b(length)f(in)g(c)m(haracters)j(of)e(the)h(expanded)e(v)-5
+b(alue)40 b(of)g Fq(parameter)47 b Ft(is)39 b(substituted.)630
+1998 y(If)j Fq(parameter)50 b Ft(is)42 b(`)p Fs(*)p Ft(')h(or)g(`)p
+Fs(@)p Ft(',)k(the)c(v)-5 b(alue)42 b(substituted)f(is)h(the)h(n)m(um)m
+(b)s(er)f(of)h(p)s(ositional)630 2107 y(parameters.)i(If)32
+b Fq(parameter)38 b Ft(is)31 b(an)h(arra)m(y)g(name)g(subscripted)e(b)m
+(y)h(`)p Fs(*)p Ft(')h(or)g(`)p Fs(@)p Ft(',)g(the)g(v)-5
+b(alue)630 2217 y(substituted)29 b(is)g(the)i(n)m(um)m(b)s(er)e(of)h
+(elemen)m(ts)h(in)e(the)i(arra)m(y)-8 b(.)150 2381 y
+Fs(${)p Fj(parameter)11 b Fs(#)p Fj(word)g Fs(})150 2491
+y(${)p Fj(parameter)g Fs(##)p Fj(word)g Fs(})630 2600
+y Ft(The)31 b Fq(w)m(ord)k Ft(is)c(expanded)g(to)i(pro)s(duce)e(a)h
+(pattern)g(just)f(as)i(in)d(\014lename)h(expansion)g(\(see)630
+2710 y(Section)k(3.5.8)i([Filename)e(Expansion],)h(page)g(22\).)56
+b(If)35 b(the)h(pattern)f(matc)m(hes)i(the)e(b)s(e-)630
+2819 y(ginning)26 b(of)i(the)h(expanded)e(v)-5 b(alue)28
+b(of)g Fq(parameter)p Ft(,)h(then)f(the)g(result)f(of)i(the)f
+(expansion)f(is)630 2929 y(the)36 b(expanded)f(v)-5 b(alue)35
+b(of)h Fq(parameter)43 b Ft(with)34 b(the)i(shortest)g(matc)m(hing)g
+(pattern)g(\(the)g(`)p Fs(#)p Ft(')630 3039 y(case\))26
+b(or)f(the)g(longest)f(matc)m(hing)h(pattern)g(\(the)g(`)p
+Fs(##)p Ft(')g(case\))h(deleted.)38 b(If)24 b Fq(parameter)32
+b Ft(is)24 b(`)p Fs(@)p Ft(')630 3148 y(or)k(`)p Fs(*)p
+Ft(',)i(the)e(pattern)h(remo)m(v)-5 b(al)28 b(op)s(eration)g(is)f
+(applied)g(to)i(eac)m(h)g(p)s(ositional)d(parameter)j(in)630
+3258 y(turn,)i(and)g(the)h(expansion)f(is)g(the)h(resultan)m(t)f(list.)
+43 b(If)32 b Fq(parameter)38 b Ft(is)31 b(an)h(arra)m(y)g(v)-5
+b(ariable)630 3367 y(subscripted)38 b(with)g(`)p Fs(@)p
+Ft(')i(or)g(`)p Fs(*)p Ft(',)j(the)d(pattern)h(remo)m(v)-5
+b(al)40 b(op)s(eration)f(is)g(applied)f(to)j(eac)m(h)630
+3477 y(mem)m(b)s(er)30 b(of)g(the)h(arra)m(y)g(in)e(turn,)g(and)h(the)h
+(expansion)e(is)g(the)i(resultan)m(t)f(list.)150 3641
+y Fs(${)p Fj(parameter)11 b Fs(\045)p Fj(word)g Fs(})150
+3751 y(${)p Fj(parameter)g Fs(\045\045)p Fj(word)g Fs(})630
+3861 y Ft(The)35 b Fq(w)m(ord)k Ft(is)34 b(expanded)h(to)h(pro)s(duce)e
+(a)i(pattern)f(just)g(as)h(in)e(\014lename)h(expansion.)54
+b(If)630 3970 y(the)43 b(pattern)g(matc)m(hes)h(a)g(trailing)d(p)s
+(ortion)g(of)i(the)g(expanded)g(v)-5 b(alue)42 b(of)h
+Fq(parameter)p Ft(,)630 4080 y(then)c(the)g(result)f(of)i(the)f
+(expansion)f(is)h(the)g(v)-5 b(alue)39 b(of)g Fq(parameter)46
+b Ft(with)38 b(the)i(shortest)630 4189 y(matc)m(hing)30
+b(pattern)f(\(the)h(`)p Fs(\045)p Ft(')g(case\))h(or)e(the)h(longest)g
+(matc)m(hing)f(pattern)h(\(the)g(`)p Fs(\045\045)p Ft(')g(case\))630
+4299 y(deleted.)48 b(If)32 b Fq(parameter)40 b Ft(is)32
+b(`)p Fs(@)p Ft(')h(or)g(`)p Fs(*)p Ft(',)h(the)f(pattern)g(remo)m(v)-5
+b(al)33 b(op)s(eration)g(is)f(applied)e(to)630 4408 y(eac)m(h)38
+b(p)s(ositional)d(parameter)j(in)e(turn,)i(and)e(the)h(expansion)f(is)h
+(the)g(resultan)m(t)g(list.)59 b(If)630 4518 y Fq(parameter)38
+b Ft(is)31 b(an)g(arra)m(y)h(v)-5 b(ariable)30 b(subscripted)f(with)h
+(`)p Fs(@)p Ft(')h(or)h(`)p Fs(*)p Ft(',)g(the)f(pattern)h(remo)m(v)-5
+b(al)630 4628 y(op)s(eration)29 b(is)g(applied)e(to)k(eac)m(h)g(mem)m
+(b)s(er)e(of)h(the)g(arra)m(y)g(in)e(turn,)h(and)g(the)h(expansion)f
+(is)630 4737 y(the)i(resultan)m(t)f(list.)150 4902 y
+Fs(${)p Fj(parameter)11 b Fs(/)p Fj(pattern)g Fs(/)p
+Fj(s)o(tri)o(ng)f Fs(})150 5011 y(${)p Fj(parameter)h
+Fs(//)p Fj(pattern)g Fs(/)o Fj(str)o(ing)f Fs(})630 5121
+y Ft(The)37 b Fq(pattern)g Ft(is)f(expanded)h(to)h(pro)s(duce)e(a)h
+(pattern)g(just)g(as)h(in)d(\014lename)i(expansion.)630
+5230 y Fq(P)m(arameter)46 b Ft(is)37 b(expanded)g(and)g(the)i(longest)f
+(matc)m(h)h(of)f Fq(pattern)g Ft(against)g(its)f(v)-5
+b(alue)38 b(is)630 5340 y(replaced)e(with)f Fq(string)p
+Ft(.)57 b(In)35 b(the)i(\014rst)e(form,)j(only)d(the)i(\014rst)e(matc)m
+(h)i(is)f(replaced.)57 b(The)p eop
+%%Page: 21 27
+21 26 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(21)630 299 y(second)26
+b(form)g(causes)h(all)e(matc)m(hes)i(of)g Fq(pattern)f
+Ft(to)h(b)s(e)f(replaced)g(with)f Fq(string)p Ft(.)38
+b(If)26 b Fq(pattern)630 408 y Ft(b)s(egins)34 b(with)g(`)p
+Fs(#)p Ft(',)j(it)e(m)m(ust)g(matc)m(h)h(at)g(the)g(b)s(eginning)d(of)i
+(the)h(expanded)e(v)-5 b(alue)35 b(of)h Fq(pa-)630 518
+y(rameter)p Ft(.)45 b(If)32 b Fq(pattern)g Ft(b)s(egins)e(with)g(`)p
+Fs(\045)p Ft(',)j(it)e(m)m(ust)h(matc)m(h)g(at)h(the)f(end)f(of)h(the)g
+(expanded)630 628 y(v)-5 b(alue)32 b(of)h Fq(parameter)p
+Ft(.)47 b(If)32 b Fq(string)39 b Ft(is)32 b(n)m(ull,)f(matc)m(hes)i(of)
+g Fq(pattern)g Ft(are)g(deleted)f(and)g(the)g Fs(/)630
+737 y Ft(follo)m(wing)i Fq(pattern)h Ft(ma)m(y)h(b)s(e)e(omitted.)55
+b(If)35 b Fq(parameter)42 b Ft(is)35 b(`)p Fs(@)p Ft(')g(or)g(`)p
+Fs(*)p Ft(',)i(the)e(substitution)630 847 y(op)s(eration)29
+b(is)f(applied)f(to)j(eac)m(h)g(p)s(ositional)d(parameter)j(in)d(turn,)
+i(and)g(the)g(expansion)f(is)630 956 y(the)j(resultan)m(t)g(list.)43
+b(If)30 b Fq(parameter)39 b Ft(is)30 b(an)h(arra)m(y)h(v)-5
+b(ariable)30 b(subscripted)f(with)h(`)p Fs(@)p Ft(')h(or)h(`)p
+Fs(*)p Ft(',)630 1066 y(the)e(substitution)e(op)s(eration)i(is)f
+(applied)f(to)j(eac)m(h)h(mem)m(b)s(er)e(of)g(the)g(arra)m(y)h(in)e
+(turn,)h(and)630 1176 y(the)h(expansion)e(is)g(the)i(resultan)m(t)f
+(list.)150 1443 y Fk(3.5.4)63 b(Command)39 b(Substitution)275
+1709 y Ft(Command)29 b(substitution)g(allo)m(ws)h(the)h(output)g(of)g
+(a)g(command)g(to)g(replace)g(the)g(command)g(itself.)150
+1819 y(Command)e(substitution)f(o)s(ccurs)j(when)e(a)i(command)f(is)f
+(enclosed)h(as)h(follo)m(ws:)390 1975 y Fs($\()p Fj(command)11
+b Fs(\))150 2131 y Ft(or)390 2288 y Fs(`)p Fj(command)g
+Fs(`)150 2444 y Ft(Bash)45 b(p)s(erforms)f(the)h(expansion)e(b)m(y)i
+(executing)h Fq(command)i Ft(and)c(replacing)g(the)h(command)g(sub-)150
+2554 y(stitution)39 b(with)g(the)h(standard)g(output)g(of)g(the)g
+(command,)j(with)c(an)m(y)i(trailing)d(newlines)g(deleted.)150
+2663 y(Em)m(b)s(edded)30 b(newlines)f(are)j(not)f(deleted,)h(but)f
+(they)g(ma)m(y)h(b)s(e)f(remo)m(v)m(ed)i(during)c(w)m(ord)i(splitting.)
+41 b(The)150 2773 y(command)21 b(substitution)e Fs($\(cat)29
+b Fj(file)11 b Fs(\))20 b Ft(can)i(b)s(e)f(replaced)f(b)m(y)i(the)g
+(equiv)-5 b(alen)m(t)20 b(but)h(faster)h Fs($\(<)30 b
+Fj(file)11 b Fs(\))p Ft(.)275 2929 y(When)33 b(the)i(old-st)m(yle)f
+(bac)m(kquote)h(form)f(of)g(substitution)e(is)h(used,)i(bac)m(kslash)e
+(retains)h(its)f(literal)150 3039 y(meaning)k(except)i(when)e(follo)m
+(w)m(ed)h(b)m(y)g(`)p Fs($)p Ft(',)j(`)p Fs(`)p Ft(',)f(or)e(`)p
+Fs(\\)p Ft('.)64 b(The)38 b(\014rst)f(bac)m(kquote)j(not)e(preceded)g
+(b)m(y)g(a)150 3148 y(bac)m(kslash)i(terminates)g(the)g(command)g
+(substitution.)67 b(When)40 b(using)f(the)h Fs($\()p
+Fj(command)11 b Fs(\))37 b Ft(form,)42 b(all)150 3258
+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 3414 y(Command)22 b(substitutions)e(ma)m(y)k(b)s(e)e(nested.)39
+b(T)-8 b(o)23 b(nest)g(when)f(using)g(the)h(bac)m(kquoted)h(form,)g
+(escap)s(e)150 3524 y(the)31 b(inner)d(bac)m(kquotes)k(with)d(bac)m
+(kslashes.)275 3680 y(If)f(the)i(substitution)c(app)s(ears)j(within)e
+(double)g(quotes,)j(w)m(ord)f(splitting)e(and)i(\014lename)f(expansion)
+150 3790 y(are)j(not)f(p)s(erformed)f(on)h(the)h(results.)150
+4057 y Fk(3.5.5)63 b(Arithmetic)39 b(Expansion)275 4323
+y Ft(Arithmetic)31 b(expansion)g(allo)m(ws)h(the)g(ev)-5
+b(aluation)32 b(of)h(an)f(arithmetic)g(expression)f(and)h(the)g
+(substi-)150 4433 y(tution)e(of)g(the)h(result.)39 b(The)30
+b(format)h(for)f(arithmetic)g(expansion)f(is:)390 4589
+y Fs($\(\()47 b Fj(expression)55 b Fs(\)\))275 4745 y
+Ft(The)33 b(expression)f(is)h(treated)h(as)g(if)f(it)g(w)m(ere)h
+(within)d(double)i(quotes,)i(but)e(a)h(double)e(quote)i(inside)150
+4855 y(the)27 b(paren)m(theses)g(is)f(not)h(treated)h(sp)s(ecially)-8
+b(.)38 b(All)25 b(tok)m(ens)j(in)d(the)i(expression)f(undergo)g
+(parameter)h(ex-)150 4965 y(pansion,)g(command)g(substitution,)f(and)h
+(quote)i(remo)m(v)-5 b(al.)40 b(Arithmetic)26 b(expansions)h(ma)m(y)h
+(b)s(e)f(nested.)275 5121 y(The)34 b(ev)-5 b(aluation)35
+b(is)g(p)s(erformed)f(according)h(to)h(the)g(rules)e(listed)g(b)s(elo)m
+(w)h(\(see)h(Section)f(6.5)i([Shell)150 5230 y(Arithmetic],)30
+b(page)h(70\).)42 b(If)30 b(the)h(expression)e(is)g(in)m(v)-5
+b(alid,)29 b(Bash)h(prin)m(ts)f(a)i(message)g(indicating)e(failure)150
+5340 y(to)i(the)g(standard)e(error)h(and)g(no)g(substitution)e(o)s
+(ccurs.)p eop
+%%Page: 22 28
+22 27 bop 150 -116 a Ft(22)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fk(3.5.6)63 b(Pro)s(cess)42 b(Substitution)275
+539 y Ft(Pro)s(cess)33 b(substitution)f(is)h(supp)s(orted)f(on)h
+(systems)h(that)h(supp)s(ort)d(named)h(pip)s(es)f(\()p
+Fl(fif)n(o)p Ft(s\))i(or)g(the)150 649 y(`)p Fs(/dev/fd)p
+Ft(')29 b(metho)s(d)h(of)g(naming)f(op)s(en)h(\014les.)40
+b(It)30 b(tak)m(es)i(the)f(form)f(of)390 779 y Fs(<\()p
+Fj(list)11 b Fs(\))150 910 y Ft(or)390 1041 y Fs(>\()p
+Fj(list)g Fs(\))150 1171 y Ft(The)23 b(pro)s(cess)g Fq(list)h
+Ft(is)e(run)g(with)g(its)h(input)f(or)h(output)g(connected)h(to)h(a)e
+Fl(fif)n(o)g Ft(or)h(some)g(\014le)e(in)g(`)p Fs(/dev/fd)p
+Ft('.)150 1281 y(The)28 b(name)h(of)g(this)e(\014le)h(is)g(passed)g(as)
+h(an)f(argumen)m(t)h(to)h(the)f(curren)m(t)f(command)h(as)f(the)h
+(result)f(of)h(the)150 1391 y(expansion.)39 b(If)28 b(the)h
+Fs(>\()p Fj(list)11 b Fs(\))26 b Ft(form)i(is)g(used,)g(writing)f(to)i
+(the)g(\014le)e(will)f(pro)m(vide)i(input)f(for)h Fq(list)p
+Ft(.)39 b(If)28 b(the)150 1500 y Fs(<\()p Fj(list)11
+b Fs(\))23 b Ft(form)h(is)h(used,)g(the)h(\014le)e(passed)h(as)g(an)g
+(argumen)m(t)h(should)d(b)s(e)i(read)g(to)h(obtain)f(the)g(output)g(of)
+150 1610 y Fq(list)p Ft(.)39 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 Fs(<)f Ft(or)h
+Fs(>)f Ft(and)g(the)h(left)f(paren)m(thesis,)h(otherwise)150
+1719 y(the)h(construct)f(w)m(ould)f(b)s(e)h(in)m(terpreted)g(as)g(a)h
+(redirection.)275 1850 y(When)36 b(a)m(v)-5 b(ailable,)37
+b(pro)s(cess)f(substitution)f(is)g(p)s(erformed)g(sim)m(ultaneously)f
+(with)i(parameter)h(and)150 1960 y(v)-5 b(ariable)29
+b(expansion,)h(command)g(substitution,)e(and)i(arithmetic)g(expansion.)
+150 2172 y Fk(3.5.7)63 b(W)-10 b(ord)41 b(Splitting)275
+2413 y Ft(The)35 b(shell)g(scans)h(the)g(results)f(of)h(parameter)h
+(expansion,)g(command)e(substitution,)h(and)g(arith-)150
+2522 y(metic)30 b(expansion)g(that)h(did)d(not)j(o)s(ccur)f(within)e
+(double)h(quotes)i(for)f(w)m(ord)g(splitting.)275 2653
+y(The)43 b(shell)f(treats)j(eac)m(h)h(c)m(haracter)f(of)g
+Fs($IFS)e Ft(as)h(a)g(delimiter,)i(and)d(splits)f(the)j(results)d(of)j
+(the)150 2763 y(other)40 b(expansions)e(in)m(to)i(w)m(ords)f(on)h
+(these)g(c)m(haracters.)70 b(If)39 b Fs(IFS)g Ft(is)g(unset,)j(or)d
+(its)g(v)-5 b(alue)39 b(is)g(exactly)150 2872 y Fs
+(<space><tab><newline>)p Ft(,)20 b(the)25 b(default,)g(then)f(an)m(y)g
+(sequence)h(of)g Fs(IFS)e Ft(c)m(haracters)j(serv)m(es)f(to)g(delimit)
+150 2982 y(w)m(ords.)38 b(If)21 b Fs(IFS)h Ft(has)g(a)h(v)-5
+b(alue)22 b(other)g(than)h(the)f(default,)i(then)e(sequences)g(of)h
+(the)f(whitespace)g(c)m(haracters)150 3091 y Fs(space)k
+Ft(and)h Fs(tab)g Ft(are)h(ignored)f(at)i(the)f(b)s(eginning)d(and)i
+(end)g(of)h(the)g(w)m(ord,)g(as)g(long)f(as)h(the)g(whitespace)150
+3201 y(c)m(haracter)34 b(is)e(in)f(the)i(v)-5 b(alue)32
+b(of)g Fs(IFS)g Ft(\(an)h Fs(IFS)e Ft(whitespace)i(c)m(haracter\).)49
+b(An)m(y)32 b(c)m(haracter)i(in)e Fs(IFS)f Ft(that)150
+3311 y(is)e(not)i Fs(IFS)f Ft(whitespace,)g(along)g(with)f(an)m(y)i
+(adjacen)m(t)h Fs(IFS)d Ft(whitespace)h(c)m(haracters,)i(delimits)c(a)j
+(\014eld.)150 3420 y(A)h(sequence)h(of)f Fs(IFS)f Ft(whitespace)h(c)m
+(haracters)i(is)d(also)h(treated)h(as)g(a)f(delimiter.)44
+b(If)32 b(the)g(v)-5 b(alue)32 b(of)g Fs(IFS)150 3530
+y Ft(is)d(n)m(ull,)g(no)h(w)m(ord)g(splitting)e(o)s(ccurs.)275
+3660 y(Explicit)41 b(n)m(ull)g(argumen)m(ts)i(\()p Fs("")g
+Ft(or)h Fs('')p Ft(\))f(are)g(retained.)79 b(Unquoted)43
+b(implicit)d(n)m(ull)h(argumen)m(ts,)150 3770 y(resulting)22
+b(from)h(the)g(expansion)f(of)i(parameters)g(that)g(ha)m(v)m(e)h(no)e
+(v)-5 b(alues,)24 b(are)g(remo)m(v)m(ed.)40 b(If)23 b(a)g(parameter)150
+3880 y(with)29 b(no)h(v)-5 b(alue)30 b(is)g(expanded)f(within)f(double)
+h(quotes,)i(a)g(n)m(ull)d(argumen)m(t)j(results)e(and)h(is)f(retained.)
+275 4010 y(Note)i(that)g(if)f(no)g(expansion)f(o)s(ccurs,)h(no)h
+(splitting)d(is)h(p)s(erformed.)150 4223 y Fk(3.5.8)63
+b(Filename)40 b(Expansion)275 4463 y Ft(After)22 b(w)m(ord)g
+(splitting,)g(unless)f(the)i(`)p Fs(-f)p Ft(')f(option)g(has)g(b)s(een)
+g(set)h(\(see)g(Section)g(4.3)g([The)f(Set)h(Builtin],)150
+4573 y(page)k(50\),)i(Bash)d(scans)h(eac)m(h)h(w)m(ord)e(for)g(the)h(c)
+m(haracters)g(`)p Fs(*)p Ft(',)h(`)p Fs(?)p Ft(',)g(and)e(`)p
+Fs([)p Ft('.)39 b(If)26 b(one)h(of)g(these)f(c)m(haracters)150
+4682 y(app)s(ears,)h(then)f(the)h(w)m(ord)f(is)g(regarded)h(as)g(a)g
+Fq(pattern)p Ft(,)g(and)g(replaced)f(with)f(an)i(alphab)s(etically)d
+(sorted)150 4792 y(list)30 b(of)i(\014le)f(names)h(matc)m(hing)g(the)g
+(pattern.)45 b(If)32 b(no)f(matc)m(hing)h(\014le)f(names)h(are)g
+(found,)f(and)h(the)g(shell)150 4902 y(option)27 b Fs(nullglob)f
+Ft(is)h(disabled,)g(the)h(w)m(ord)g(is)f(left)g(unc)m(hanged.)40
+b(If)28 b(the)g Fs(nullglob)e Ft(option)h(is)g(set,)j(and)150
+5011 y(no)38 b(matc)m(hes)h(are)f(found,)h(the)f(w)m(ord)f(is)g(remo)m
+(v)m(ed.)65 b(If)37 b(the)h Fs(failglob)e Ft(shell)g(option)h(is)g
+(set,)k(and)c(no)150 5121 y(matc)m(hes)f(are)g(found,)f(an)g(error)f
+(message)j(is)d(prin)m(ted)f(and)i(the)g(command)g(is)f(not)h
+(executed.)56 b(If)35 b(the)150 5230 y(shell)c(option)i
+Fs(nocaseglob)d Ft(is)i(enabled,)h(the)h(matc)m(h)g(is)e(p)s(erformed)f
+(without)h(regard)h(to)h(the)g(case)g(of)150 5340 y(alphab)s(etic)29
+b(c)m(haracters.)p eop
+%%Page: 23 29
+23 28 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(23)275 299 y(When)21
+b(a)i(pattern)f(is)f(used)h(for)f(\014lename)h(generation,)i(the)e(c)m
+(haracter)i(`)p Fs(.)p Ft(')e(at)h(the)f(start)h(of)f(a)h(\014lename)
+150 408 y(or)g(immediately)f(follo)m(wing)g(a)i(slash)e(m)m(ust)i(b)s
+(e)f(matc)m(hed)h(explicitly)-8 b(,)23 b(unless)f(the)h(shell)f(option)
+h Fs(dotglob)150 518 y Ft(is)30 b(set.)45 b(When)31 b(matc)m(hing)g(a)h
+(\014le)e(name,)i(the)g(slash)e(c)m(haracter)j(m)m(ust)e(alw)m(a)m(ys)h
+(b)s(e)f(matc)m(hed)h(explicitly)-8 b(.)150 628 y(In)30
+b(other)g(cases,)i(the)e(`)p Fs(.)p Ft(')h(c)m(haracter)h(is)d(not)i
+(treated)g(sp)s(ecially)-8 b(.)275 772 y(See)30 b(the)g(description)d
+(of)j Fs(shopt)f Ft(in)f(Section)i(4.2)h([Bash)f(Builtins],)e(page)i
+(39,)h(for)f(a)g(description)e(of)150 882 y(the)j Fs(nocaseglob)p
+Ft(,)c Fs(nullglob)p Ft(,)i Fs(failglob)p Ft(,)f(and)i
+Fs(dotglob)e Ft(options.)275 1026 y(The)k Fs(GLOBIGNORE)f
+Ft(shell)g(v)-5 b(ariable)32 b(ma)m(y)i(b)s(e)f(used)f(to)i(restrict)f
+(the)h(set)f(of)h(\014lenames)e(matc)m(hing)i(a)150 1136
+y(pattern.)39 b(If)25 b Fs(GLOBIGNORE)e Ft(is)i(set,)i(eac)m(h)g(matc)m
+(hing)f(\014lename)f(that)h(also)g(matc)m(hes)g(one)g(of)g(the)g
+(patterns)150 1245 y(in)32 b Fs(GLOBIGNORE)e Ft(is)i(remo)m(v)m(ed)i
+(from)e(the)i(list)d(of)i(matc)m(hes.)50 b(The)33 b(\014lenames)f(`)p
+Fs(.)p Ft(')h(and)f(`)p Fs(..)p Ft(')h(are)g(alw)m(a)m(ys)150
+1355 y(ignored)f(when)f Fs(GLOBIGNORE)f Ft(is)i(set)h(and)f(not)h(n)m
+(ull.)46 b(Ho)m(w)m(ev)m(er,)35 b(setting)e Fs(GLOBIGNORE)d
+Ft(to)j(a)g(non-n)m(ull)150 1465 y(v)-5 b(alue)33 b(has)g(the)h
+(e\013ect)h(of)f(enabling)e(the)i Fs(dotglob)e Ft(shell)f(option,)k(so)
+f(all)e(other)i(\014lenames)f(b)s(eginning)150 1574 y(with)42
+b(a)i(`)p Fs(.)p Ft(')f(will)e(matc)m(h.)80 b(T)-8 b(o)44
+b(get)h(the)e(old)g(b)s(eha)m(vior)f(of)i(ignoring)d(\014lenames)i(b)s
+(eginning)e(with)h(a)150 1684 y(`)p Fs(.)p Ft(',)d(mak)m(e)g(`)p
+Fs(.*)p Ft(')e(one)g(of)g(the)h(patterns)f(in)f Fs(GLOBIGNORE)p
+Ft(.)58 b(The)37 b Fs(dotglob)e Ft(option)i(is)f(disabled)f(when)150
+1793 y Fs(GLOBIGNORE)28 b Ft(is)h(unset.)150 2037 y Fk(3.5.8.1)63
+b(P)m(attern)40 b(Matc)m(hing)275 2291 y Ft(An)m(y)33
+b(c)m(haracter)i(that)f(app)s(ears)f(in)f(a)i(pattern,)g(other)g(than)f
+(the)g(sp)s(ecial)f(pattern)i(c)m(haracters)h(de-)150
+2401 y(scrib)s(ed)29 b(b)s(elo)m(w,)h(matc)m(hes)i(itself.)41
+b(The)31 b Fl(nul)f Ft(c)m(haracter)i(ma)m(y)f(not)h(o)s(ccur)e(in)g(a)
+h(pattern.)42 b(A)31 b(bac)m(kslash)150 2511 y(escap)s(es)36
+b(the)f(follo)m(wing)f(c)m(haracter;)40 b(the)c(escaping)f(bac)m
+(kslash)g(is)f(discarded)g(when)h(matc)m(hing.)55 b(The)150
+2620 y(sp)s(ecial)29 b(pattern)h(c)m(haracters)i(m)m(ust)f(b)s(e)e
+(quoted)i(if)e(they)i(are)f(to)i(b)s(e)d(matc)m(hed)i(literally)-8
+b(.)275 2765 y(The)29 b(sp)s(ecial)g(pattern)i(c)m(haracters)h(ha)m(v)m
+(e)f(the)g(follo)m(wing)e(meanings:)150 2939 y Fs(*)432
+b Ft(Matc)m(hes)32 b(an)m(y)f(string,)e(including)e(the)k(n)m(ull)d
+(string.)150 3108 y Fs(?)432 b Ft(Matc)m(hes)32 b(an)m(y)f(single)e(c)m
+(haracter.)150 3278 y Fs([...)o(])241 b Ft(Matc)m(hes)27
+b(an)m(y)e(one)g(of)g(the)g(enclosed)f(c)m(haracters.)41
+b(A)25 b(pair)e(of)i(c)m(haracters)i(separated)e(b)m(y)g(a)630
+3387 y(h)m(yphen)i(denotes)h(a)g Fq(range)g(expression)p
+Ft(;)f(an)m(y)i(c)m(haracter)g(that)f(sorts)g(b)s(et)m(w)m(een)g(those)
+h(t)m(w)m(o)630 3497 y(c)m(haracters,)f(inclusiv)m(e,)c(using)f(the)i
+(curren)m(t)f(lo)s(cale's)h(collating)f(sequence)h(and)f(c)m(haracter)
+630 3606 y(set,)31 b(is)e(matc)m(hed.)42 b(If)30 b(the)g(\014rst)g(c)m
+(haracter)i(follo)m(wing)d(the)h(`)p Fs([)p Ft(')h(is)e(a)i(`)p
+Fs(!)p Ft(')f(or)g(a)h(`)p Fs(^)p Ft(')g(then)f(an)m(y)630
+3716 y(c)m(haracter)c(not)f(enclosed)f(is)g(matc)m(hed.)40
+b(A)25 b(`)p Fp(\000)p Ft(')f(ma)m(y)i(b)s(e)e(matc)m(hed)h(b)m(y)f
+(including)e(it)i(as)h(the)630 3826 y(\014rst)32 b(or)h(last)g(c)m
+(haracter)i(in)d(the)h(set.)50 b(A)33 b(`)p Fs(])p Ft(')g(ma)m(y)h(b)s
+(e)e(matc)m(hed)i(b)m(y)f(including)d(it)i(as)i(the)630
+3935 y(\014rst)25 b(c)m(haracter)i(in)d(the)i(set.)40
+b(The)25 b(sorting)g(order)g(of)h(c)m(haracters)h(in)e(range)h
+(expressions)e(is)630 4045 y(determined)e(b)m(y)h(the)g(curren)m(t)f
+(lo)s(cale)h(and)g(the)g(v)-5 b(alue)22 b(of)h(the)h
+Fs(LC_COLLATE)c Ft(shell)h(v)-5 b(ariable,)630 4154 y(if)29
+b(set.)630 4294 y(F)-8 b(or)34 b(example,)f(in)f(the)h(default)f(C)g
+(lo)s(cale,)i(`)p Fs([a-dx-z])p Ft(')d(is)h(equiv)-5
+b(alen)m(t)32 b(to)i(`)p Fs([abcdxyz])p Ft('.)630 4403
+y(Man)m(y)68 b(lo)s(cales)f(sort)h(c)m(haracters)h(in)d(dictionary)h
+(order,)76 b(and)67 b(in)f(these)i(lo)s(cales)630 4513
+y(`)p Fs([a-dx-z])p Ft(')36 b(is)h(t)m(ypically)g(not)h(equiv)-5
+b(alen)m(t)37 b(to)i(`)p Fs([abcdxyz])p Ft(';)g(it)f(migh)m(t)f(b)s(e)g
+(equiv)-5 b(alen)m(t)630 4623 y(to)34 b(`)p Fs([aBbCcDdxXyYz])p
+Ft(',)c(for)j(example.)48 b(T)-8 b(o)33 b(obtain)g(the)g(traditional)e
+(in)m(terpretation)i(of)630 4732 y(ranges)g(in)e(brac)m(k)m(et)j
+(expressions,)f(y)m(ou)g(can)g(force)g(the)g(use)f(of)h(the)g(C)f(lo)s
+(cale)g(b)m(y)h(setting)630 4842 y(the)e Fs(LC_COLLATE)c
+Ft(or)k Fs(LC_ALL)d Ft(en)m(vironmen)m(t)i(v)-5 b(ariable)29
+b(to)i(the)g(v)-5 b(alue)30 b(`)p Fs(C)p Ft('.)630 4981
+y(Within)21 b(`)p Fs([)p Ft(')j(and)e(`)p Fs(])p Ft(',)j
+Fq(c)m(haracter)g(classes)i Ft(can)d(b)s(e)e(sp)s(eci\014ed)g(using)f
+(the)j(syn)m(tax)f Fs([:)p Fq(class)t Fs(:])p Ft(,)630
+5091 y(where)j Fq(class)k Ft(is)c(one)h(of)g(the)g(follo)m(wing)e
+(classes)i(de\014ned)e(in)h(the)g Fl(posix)g Ft(1003.2)k(standard:)870
+5230 y Fs(alnum)142 b(alpha)g(ascii)f(blank)h(cntrl)g(digit)g(graph)g
+(lower)870 5340 y(print)g(punct)g(space)f(upper)h(word)190
+b(xdigit)p eop
+%%Page: 24 30
+24 29 bop 150 -116 a Ft(24)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(A)42 b(c)m(haracter)h(class)e(matc)m(hes)i(an)m(y)f(c)m(haracter)
+h(b)s(elonging)d(to)i(that)g(class.)74 b(The)41 b Fs(word)630
+408 y Ft(c)m(haracter)32 b(class)e(matc)m(hes)i(letters,)e(digits,)g
+(and)f(the)i(c)m(haracter)h(`)p Fs(_)p Ft('.)630 544
+y(Within)23 b(`)p Fs([)p Ft(')h(and)g(`)p Fs(])p Ft(',)i(an)e
+Fq(equiv)-5 b(alence)24 b(class)k Ft(can)c(b)s(e)g(sp)s(eci\014ed)f
+(using)g(the)h(syn)m(tax)h Fs([=)p Fq(c)6 b Fs(=])p Ft(,)630
+653 y(whic)m(h)28 b(matc)m(hes)j(all)d(c)m(haracters)j(with)d(the)i
+(same)g(collation)e(w)m(eigh)m(t)i(\(as)g(de\014ned)e(b)m(y)i(the)630
+763 y(curren)m(t)g(lo)s(cale\))h(as)f(the)h(c)m(haracter)h
+Fq(c)p Ft(.)630 898 y(Within)20 b(`)p Fs([)p Ft(')h(and)g(`)p
+Fs(])p Ft(',)j(the)d(syn)m(tax)h Fs([.)p Fq(sym)m(b)s(ol)t
+Fs(.])d Ft(matc)m(hes)j(the)g(collating)f(sym)m(b)s(ol)f
+Fq(sym)m(b)s(ol)p Ft(.)275 1061 y(If)29 b(the)g Fs(extglob)f
+Ft(shell)f(option)i(is)g(enabled)f(using)g(the)i Fs(shopt)e
+Ft(builtin,)e(sev)m(eral)k(extended)g(pattern)150 1170
+y(matc)m(hing)36 b(op)s(erators)f(are)h(recognized.)57
+b(In)35 b(the)g(follo)m(wing)f(description,)h(a)h Fq(pattern-list)h
+Ft(is)e(a)h(list)e(of)150 1280 y(one)f(or)f(more)h(patterns)f
+(separated)h(b)m(y)f(a)h(`)p Fs(|)p Ft('.)47 b(Comp)s(osite)32
+b(patterns)g(ma)m(y)i(b)s(e)d(formed)h(using)f(one)i(or)150
+1389 y(more)e(of)f(the)h(follo)m(wing)d(sub-patterns:)150
+1551 y Fs(?\()p Fj(pattern-list)11 b Fs(\))630 1661 y
+Ft(Matc)m(hes)32 b(zero)f(or)g(one)f(o)s(ccurrence)h(of)f(the)h(giv)m
+(en)f(patterns.)150 1822 y Fs(*\()p Fj(pattern-list)11
+b Fs(\))630 1932 y Ft(Matc)m(hes)32 b(zero)f(or)g(more)f(o)s
+(ccurrences)h(of)f(the)h(giv)m(en)f(patterns.)150 2093
+y Fs(+\()p Fj(pattern-list)11 b Fs(\))630 2203 y Ft(Matc)m(hes)32
+b(one)f(or)f(more)h(o)s(ccurrences)f(of)h(the)f(giv)m(en)h(patterns.)
+150 2364 y Fs(@\()p Fj(pattern-list)11 b Fs(\))630 2473
+y Ft(Matc)m(hes)32 b(exactly)f(one)g(of)f(the)h(giv)m(en)f(patterns.)
+150 2635 y Fs(!\()p Fj(pattern-list)11 b Fs(\))630 2744
+y Ft(Matc)m(hes)32 b(an)m(ything)e(except)h(one)g(of)f(the)h(giv)m(en)f
+(patterns.)150 2972 y Fk(3.5.9)63 b(Quote)41 b(Remo)m(v)-7
+b(al)275 3218 y Ft(After)32 b(the)h(preceding)e(expansions,)h(all)f
+(unquoted)h(o)s(ccurrences)g(of)h(the)f(c)m(haracters)i(`)p
+Fs(\\)p Ft(',)f(`)p Fs(')p Ft(',)h(and)150 3327 y(`)p
+Fs(")p Ft(')d(that)g(did)d(not)j(result)e(from)h(one)h(of)f(the)h(ab)s
+(o)m(v)m(e)g(expansions)e(are)i(remo)m(v)m(ed.)150 3589
+y Fr(3.6)68 b(Redirections)275 3835 y Ft(Before)33 b(a)h(command)e(is)g
+(executed,)j(its)d(input)f(and)i(output)f(ma)m(y)i(b)s(e)e
+Fq(redirected)k Ft(using)31 b(a)i(sp)s(ecial)150 3945
+y(notation)f(in)m(terpreted)g(b)m(y)g(the)g(shell.)44
+b(Redirection)31 b(ma)m(y)i(also)f(b)s(e)g(used)f(to)i(op)s(en)e(and)h
+(close)g(\014les)f(for)150 4054 y(the)i(curren)m(t)g(shell)e(execution)
+i(en)m(vironmen)m(t.)48 b(The)33 b(follo)m(wing)e(redirection)h(op)s
+(erators)h(ma)m(y)h(precede)150 4164 y(or)29 b(app)s(ear)g(an)m(ywhere)
+g(within)e(a)j(simple)d(command)i(or)h(ma)m(y)g(follo)m(w)e(a)i
+(command.)40 b(Redirections)29 b(are)150 4274 y(pro)s(cessed)h(in)f
+(the)h(order)g(they)h(app)s(ear,)f(from)g(left)g(to)h(righ)m(t.)275
+4410 y(In)c(the)i(follo)m(wing)e(descriptions,)h(if)f(the)i(\014le)f
+(descriptor)f(n)m(um)m(b)s(er)h(is)f(omitted,)i(and)g(the)f(\014rst)g
+(c)m(har-)150 4519 y(acter)42 b(of)f(the)g(redirection)e(op)s(erator)i
+(is)f(`)p Fs(<)p Ft(',)j(the)e(redirection)e(refers)i(to)g(the)g
+(standard)f(input)e(\(\014le)150 4629 y(descriptor)32
+b(0\).)49 b(If)33 b(the)g(\014rst)f(c)m(haracter)i(of)g(the)f
+(redirection)e(op)s(erator)j(is)e(`)p Fs(>)p Ft(',)i(the)f(redirection)
+e(refers)150 4739 y(to)g(the)g(standard)e(output)h(\(\014le)g
+(descriptor)f(1\).)275 4875 y(The)i(w)m(ord)h(follo)m(wing)f(the)i
+(redirection)e(op)s(erator)h(in)f(the)i(follo)m(wing)e(descriptions,)g
+(unless)f(other-)150 4984 y(wise)20 b(noted,)j(is)d(sub)5
+b(jected)21 b(to)h(brace)f(expansion,)h(tilde)e(expansion,)i(parameter)
+f(expansion,)h(command)150 5094 y(substitution,)29 b(arithmetic)h
+(expansion,)g(quote)i(remo)m(v)-5 b(al,)32 b(\014lename)e(expansion,)g
+(and)g(w)m(ord)h(splitting.)150 5204 y(If)f(it)g(expands)f(to)i(more)g
+(than)f(one)h(w)m(ord,)f(Bash)h(rep)s(orts)e(an)h(error.)275
+5340 y(Note)h(that)g(the)g(order)f(of)g(redirections)f(is)h
+(signi\014can)m(t.)39 b(F)-8 b(or)31 b(example,)g(the)f(command)p
+eop
+%%Page: 25 31
+25 30 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(25)390 299 y Fs(ls)47
+b(>)h Fj(dirlist)56 b Fs(2>&1)150 437 y Ft(directs)27
+b(b)s(oth)g(standard)g(output)g(\(\014le)g(descriptor)f(1\))j(and)e
+(standard)f(error)i(\(\014le)f(descriptor)f(2\))i(to)h(the)150
+547 y(\014le)g Fq(dirlist)p Ft(,)f(while)g(the)j(command)390
+685 y Fs(ls)47 b(2>&1)g(>)g Fj(dirlist)150 823 y Ft(directs)33
+b(only)g(the)g(standard)g(output)g(to)h(\014le)f Fq(dirlist)p
+Ft(,)f(b)s(ecause)h(the)h(standard)f(error)g(w)m(as)h(duplicated)150
+932 y(as)d(standard)e(output)h(b)s(efore)g(the)h(standard)e(output)h(w)
+m(as)h(redirected)f(to)h Fq(dirlist)p Ft(.)275 1070 y(Bash)26
+b(handles)e(sev)m(eral)j(\014lenames)e(sp)s(ecially)f(when)i(they)g
+(are)g(used)g(in)f(redirections,)h(as)g(describ)s(ed)150
+1180 y(in)j(the)i(follo)m(wing)d(table:)150 1345 y Fs(/dev/fd/)p
+Fj(fd)630 1454 y Ft(If)i Fq(fd)j Ft(is)c(a)i(v)-5 b(alid)29
+b(in)m(teger,)i(\014le)e(descriptor)h Fq(fd)j Ft(is)c(duplicated.)150
+1617 y Fs(/dev/stdin)630 1727 y Ft(File)h(descriptor)f(0)i(is)e
+(duplicated.)150 1890 y Fs(/dev/stdout)630 1999 y Ft(File)h(descriptor)
+f(1)i(is)e(duplicated.)150 2162 y Fs(/dev/stderr)630
+2272 y Ft(File)h(descriptor)f(2)i(is)e(duplicated.)150
+2435 y Fs(/dev/tcp/)p Fj(host)11 b Fs(/)p Fj(port)630
+2544 y Ft(If)41 b Fq(host)i Ft(is)e(a)h(v)-5 b(alid)39
+b(hostname)j(or)f(In)m(ternet)h(address,)i(and)c Fq(p)s(ort)j
+Ft(is)e(an)g(in)m(teger)h(p)s(ort)630 2654 y(n)m(um)m(b)s(er)i(or)h
+(service)g(name,)k(Bash)c(attempts)h(to)g(op)s(en)f(a)g(TCP)g
+(connection)g(to)h(the)630 2764 y(corresp)s(onding)28
+b(so)s(c)m(k)m(et.)150 2927 y Fs(/dev/udp/)p Fj(host)11
+b Fs(/)p Fj(port)630 3036 y Ft(If)41 b Fq(host)i Ft(is)e(a)h(v)-5
+b(alid)39 b(hostname)j(or)f(In)m(ternet)h(address,)i(and)c
+Fq(p)s(ort)j Ft(is)e(an)g(in)m(teger)h(p)s(ort)630 3146
+y(n)m(um)m(b)s(er)h(or)i(service)f(name,)49 b(Bash)c(attempts)g(to)h
+(op)s(en)e(a)h(UDP)g(connection)f(to)i(the)630 3255 y(corresp)s(onding)
+28 b(so)s(c)m(k)m(et.)275 3420 y(A)i(failure)f(to)i(op)s(en)e(or)i
+(create)h(a)e(\014le)g(causes)h(the)f(redirection)f(to)i(fail.)150
+3651 y Fk(3.6.1)63 b(Redirecting)40 b(Input)275 3899
+y Ft(Redirection)33 b(of)h(input)f(causes)h(the)h(\014le)e(whose)h
+(name)h(results)e(from)h(the)g(expansion)f(of)i Fq(w)m(ord)i
+Ft(to)150 4009 y(b)s(e)d(op)s(ened)g(for)g(reading)f(on)i(\014le)e
+(descriptor)h Fs(n)p Ft(,)h(or)g(the)f(standard)g(input)f(\(\014le)h
+(descriptor)f(0\))i(if)f Fs(n)g Ft(is)150 4118 y(not)d(sp)s(eci\014ed.)
+275 4256 y(The)e(general)i(format)f(for)h(redirecting)e(input)f(is:)390
+4394 y Fs([)p Fj(n)11 b Fs(]<)p Fj(word)150 4626 y Fk(3.6.2)63
+b(Redirecting)40 b(Output)275 4873 y Ft(Redirection)29
+b(of)h(output)g(causes)h(the)g(\014le)e(whose)h(name)h(results)e(from)g
+(the)i(expansion)e(of)i Fq(w)m(ord)i Ft(to)150 4983 y(b)s(e)e(op)s
+(ened)g(for)g(writing)f(on)h(\014le)g(descriptor)f Fq(n)p
+Ft(,)i(or)f(the)h(standard)f(output)g(\(\014le)g(descriptor)f(1\))i(if)
+f Fq(n)g Ft(is)150 5092 y(not)j(sp)s(eci\014ed.)49 b(If)33
+b(the)h(\014le)f(do)s(es)g(not)h(exist)f(it)g(is)g(created;)k(if)32
+b(it)h(do)s(es)h(exist)f(it)g(is)g(truncated)h(to)g(zero)150
+5202 y(size.)275 5340 y(The)29 b(general)i(format)f(for)h(redirecting)e
+(output)h(is:)p eop
+%%Page: 26 32
+26 31 bop 150 -116 a Ft(26)2572 b(Bash)31 b(Reference)g(Man)m(ual)390
+299 y Fs([)p Fj(n)11 b Fs(]>[|])p Fj(word)275 426 y Ft(If)30
+b(the)h(redirection)e(op)s(erator)i(is)f(`)p Fs(>)p Ft(',)h(and)f(the)h
+Fs(noclobber)d Ft(option)i(to)h(the)g Fs(set)f Ft(builtin)d(has)k(b)s
+(een)150 535 y(enabled,)h(the)g(redirection)f(will)e(fail)i(if)g(the)h
+(\014le)f(whose)h(name)g(results)f(from)h(the)g(expansion)f(of)h
+Fq(w)m(ord)150 645 y Ft(exists)e(and)g(is)f(a)i(regular)f(\014le.)40
+b(If)30 b(the)h(redirection)e(op)s(erator)i(is)e(`)p
+Fs(>|)p Ft(',)i(or)f(the)h(redirection)e(op)s(erator)i(is)150
+754 y(`)p Fs(>)p Ft(')36 b(and)f(the)g Fs(noclobber)e
+Ft(option)i(is)g(not)h(enabled,)g(the)f(redirection)f(is)h(attempted)h
+(ev)m(en)h(if)d(the)i(\014le)150 864 y(named)30 b(b)m(y)g
+Fq(w)m(ord)k Ft(exists.)150 1065 y Fk(3.6.3)63 b(App)s(ending)42
+b(Redirected)e(Output)275 1301 y Ft(Redirection)27 b(of)i(output)f(in)f
+(this)h(fashion)f(causes)i(the)g(\014le)f(whose)g(name)h(results)e
+(from)h(the)h(expan-)150 1411 y(sion)k(of)g Fq(w)m(ord)k
+Ft(to)e(b)s(e)e(op)s(ened)g(for)g(app)s(ending)e(on)j(\014le)e
+(descriptor)h Fq(n)p Ft(,)h(or)g(the)f(standard)g(output)g(\(\014le)150
+1520 y(descriptor)c(1\))i(if)f Fq(n)g Ft(is)f(not)i(sp)s(eci\014ed.)39
+b(If)29 b(the)i(\014le)e(do)s(es)i(not)f(exist)g(it)g(is)g(created.)275
+1647 y(The)f(general)i(format)f(for)h(app)s(ending)d(output)i(is:)390
+1774 y Fs([)p Fj(n)11 b Fs(]>>)p Fj(word)150 1975 y Fk(3.6.4)63
+b(Redirecting)40 b(Standard)h(Output)g(and)g(Standard)g(Error)275
+2211 y Ft(Bash)31 b(allo)m(ws)f(b)s(oth)g(the)h(standard)g(output)f
+(\(\014le)h(descriptor)e(1\))j(and)e(the)i(standard)e(error)g(output)
+150 2320 y(\(\014le)c(descriptor)g(2\))i(to)f(b)s(e)g(redirected)f(to)i
+(the)f(\014le)f(whose)g(name)h(is)f(the)h(expansion)f(of)h
+Fq(w)m(ord)j Ft(with)c(this)150 2430 y(construct.)275
+2557 y(There)j(are)i(t)m(w)m(o)h(formats)e(for)h(redirecting)e
+(standard)g(output)h(and)g(standard)f(error:)390 2684
+y Fs(&>)p Fj(word)150 2810 y Ft(and)390 2937 y Fs(>&)p
+Fj(word)150 3064 y Ft(Of)h(the)g(t)m(w)m(o)i(forms,)e(the)h(\014rst)e
+(is)h(preferred.)39 b(This)29 b(is)g(seman)m(tically)h(equiv)-5
+b(alen)m(t)30 b(to)390 3190 y Fs(>)p Fj(word)57 b Fs(2>&1)150
+3391 y Fk(3.6.5)63 b(Here)41 b(Do)s(cumen)m(ts)275 3628
+y Ft(This)27 b(t)m(yp)s(e)i(of)h(redirection)e(instructs)g(the)h(shell)
+f(to)i(read)f(input)e(from)i(the)g(curren)m(t)h(source)f(un)m(til)f(a)
+150 3737 y(line)h(con)m(taining)g(only)h Fq(w)m(ord)j
+Ft(\(with)c(no)i(trailing)d(blanks\))h(is)g(seen.)41
+b(All)29 b(of)h(the)h(lines)d(read)i(up)f(to)i(that)150
+3847 y(p)s(oin)m(t)e(are)i(then)f(used)g(as)g(the)h(standard)f(input)e
+(for)i(a)h(command.)275 3973 y(The)e(format)i(of)g(here-do)s(cumen)m
+(ts)f(is:)390 4100 y Fs(<<[)p Fp(\000)p Fs(])p Fj(word)772
+4210 y(here-document)390 4319 y(delimiter)275 4446 y
+Ft(No)j(parameter)h(expansion,)f(command)g(substitution,)f(arithmetic)h
+(expansion,)g(or)g(\014lename)f(ex-)150 4556 y(pansion)i(is)g(p)s
+(erformed)f(on)i Fq(w)m(ord)p Ft(.)55 b(If)34 b(an)m(y)i(c)m(haracters)
+g(in)e Fq(w)m(ord)k Ft(are)d(quoted,)i(the)e Fq(delimiter)40
+b Ft(is)34 b(the)150 4665 y(result)39 b(of)i(quote)g(remo)m(v)-5
+b(al)41 b(on)f Fq(w)m(ord)p Ft(,)j(and)d(the)g(lines)f(in)g(the)i
+(here-do)s(cumen)m(t)f(are)h(not)f(expanded.)150 4775
+y(If)32 b Fq(w)m(ord)k Ft(is)c(unquoted,)g(all)g(lines)f(of)h(the)h
+(here-do)s(cumen)m(t)g(are)g(sub)5 b(jected)32 b(to)i(parameter)f
+(expansion,)150 4884 y(command)25 b(substitution,)e(and)i(arithmetic)f
+(expansion.)38 b(In)24 b(the)h(latter)g(case,)i(the)e(c)m(haracter)i
+(sequence)150 4994 y Fs(\\newline)h Ft(is)i(ignored,)f(and)h(`)p
+Fs(\\)p Ft(')h(m)m(ust)f(b)s(e)g(used)f(to)i(quote)g(the)g(c)m
+(haracters)h(`)p Fs(\\)p Ft(',)e(`)p Fs($)p Ft(',)h(and)f(`)p
+Fs(`)p Ft('.)275 5121 y(If)21 b(the)i(redirection)e(op)s(erator)i(is)e
+(`)p Fs(<<-)p Ft(',)j(then)e(all)f(leading)g(tab)i(c)m(haracters)h(are)
+e(stripp)s(ed)e(from)i(input)150 5230 y(lines)31 b(and)h(the)h(line)f
+(con)m(taining)g Fq(delimiter)p Ft(.)46 b(This)31 b(allo)m(ws)h
+(here-do)s(cumen)m(ts)h(within)d(shell)i(scripts)f(to)150
+5340 y(b)s(e)f(inden)m(ted)f(in)g(a)i(natural)e(fashion.)p
+eop
+%%Page: 27 33
+27 32 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(27)150 299 y Fk(3.6.6)63
+b(Here)41 b(Strings)275 551 y Ft(A)30 b(v)-5 b(arian)m(t)30
+b(of)h(here)f(do)s(cumen)m(ts,)g(the)h(format)g(is:)390
+694 y Fs(<<<)47 b Fj(word)275 836 y Ft(The)29 b Fq(w)m(ord)34
+b Ft(is)29 b(expanded)h(and)g(supplied)d(to)k(the)f(command)h(on)f(its)
+g(standard)f(input.)150 1077 y Fk(3.6.7)63 b(Duplicating)41
+b(File)g(Descriptors)275 1329 y Ft(The)29 b(redirection)g(op)s(erator)
+390 1471 y Fs([)p Fj(n)11 b Fs(]<&)p Fj(word)150 1614
+y Ft(is)34 b(used)f(to)j(duplicate)d(input)g(\014le)g(descriptors.)52
+b(If)34 b Fq(w)m(ord)k Ft(expands)c(to)h(one)g(or)g(more)g(digits,)f
+(the)h(\014le)150 1724 y(descriptor)d(denoted)i(b)m(y)g
+Fq(n)f Ft(is)f(made)i(to)g(b)s(e)f(a)h(cop)m(y)g(of)g(that)g(\014le)f
+(descriptor.)49 b(If)33 b(the)h(digits)e(in)g Fq(w)m(ord)150
+1833 y Ft(do)d(not)h(sp)s(ecify)e(a)i(\014le)e(descriptor)g(op)s(en)h
+(for)g(input,)f(a)i(redirection)e(error)h(o)s(ccurs.)40
+b(If)29 b Fq(w)m(ord)j Ft(ev)-5 b(aluates)150 1943 y(to)31
+b(`)p Fs(-)p Ft(',)g(\014le)f(descriptor)g Fq(n)g Ft(is)f(closed.)42
+b(If)30 b Fq(n)g Ft(is)f(not)i(sp)s(eci\014ed,)e(the)i(standard)f
+(input)f(\(\014le)h(descriptor)f(0\))150 2052 y(is)g(used.)275
+2195 y(The)g(op)s(erator)390 2337 y Fs([)p Fj(n)11 b
+Fs(]>&)p Fj(word)150 2480 y Ft(is)39 b(used)h(similarly)d(to)k
+(duplicate)d(output)i(\014le)g(descriptors.)69 b(If)40
+b Fq(n)f Ft(is)h(not)g(sp)s(eci\014ed,)h(the)g(standard)150
+2590 y(output)30 b(\(\014le)f(descriptor)g(1\))i(is)e(used.)39
+b(If)30 b(the)g(digits)f(in)f Fq(w)m(ord)34 b Ft(do)29
+b(not)i(sp)s(ecify)d(a)j(\014le)e(descriptor)g(op)s(en)150
+2699 y(for)38 b(output,)i(a)e(redirection)f(error)h(o)s(ccurs.)63
+b(As)38 b(a)h(sp)s(ecial)d(case,)42 b(if)37 b Fq(n)g
+Ft(is)g(omitted,)k(and)c Fq(w)m(ord)k Ft(do)s(es)150
+2809 y(not)28 b(expand)f(to)i(one)f(or)f(more)h(digits,)g(the)g
+(standard)e(output)i(and)f(standard)g(error)g(are)i(redirected)e(as)150
+2918 y(describ)s(ed)h(previously)-8 b(.)150 3159 y Fk(3.6.8)63
+b(Mo)m(ving)41 b(File)h(Descriptors)275 3411 y Ft(The)29
+b(redirection)g(op)s(erator)390 3554 y Fs([)p Fj(n)11
+b Fs(]<&)p Fj(digit)p Fs(-)150 3696 y Ft(mo)m(v)m(es)33
+b(the)f(\014le)f(descriptor)f Fq(digit)j Ft(to)f(\014le)f(descriptor)g
+Fq(n)p Ft(,)g(or)h(the)g(standard)f(input)e(\(\014le)j(descriptor)e
+(0\))150 3806 y(if)f Fq(n)h Ft(is)g(not)g(sp)s(eci\014ed.)39
+b Fq(digit)31 b Ft(is)f(closed)g(after)h(b)s(eing)e(duplicated)f(to)j
+Fq(n)p Ft(.)275 3948 y(Similarly)-8 b(,)27 b(the)j(redirection)f(op)s
+(erator)390 4091 y Fs([)p Fj(n)11 b Fs(]>&)p Fj(digit)p
+Fs(-)150 4233 y Ft(mo)m(v)m(es)29 b(the)g(\014le)e(descriptor)f
+Fq(digit)j Ft(to)g(\014le)e(descriptor)g Fq(n)p Ft(,)h(or)g(the)g
+(standard)f(output)h(\(\014le)f(descriptor)g(1\))150
+4343 y(if)i Fq(n)h Ft(is)g(not)g(sp)s(eci\014ed.)150
+4583 y Fk(3.6.9)63 b(Op)s(ening)42 b(File)f(Descriptors)h(for)f
+(Reading)g(and)g(W)-10 b(riting)275 4836 y Ft(The)29
+b(redirection)g(op)s(erator)390 4978 y Fs([)p Fj(n)11
+b Fs(]<>)p Fj(word)150 5121 y Ft(causes)39 b(the)g(\014le)f(whose)h
+(name)g(is)f(the)h(expansion)f(of)h Fq(w)m(ord)j Ft(to)d(b)s(e)g(op)s
+(ened)f(for)g(b)s(oth)h(reading)f(and)150 5230 y(writing)31
+b(on)h(\014le)g(descriptor)f Fq(n)p Ft(,)i(or)g(on)f(\014le)g
+(descriptor)g(0)h(if)e Fq(n)h Ft(is)g(not)h(sp)s(eci\014ed.)46
+b(If)32 b(the)h(\014le)e(do)s(es)i(not)150 5340 y(exist,)d(it)g(is)g
+(created.)p eop
+%%Page: 28 34
+28 33 bop 150 -116 a Ft(28)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fr(3.7)68 b(Executing)46 b(Commands)150 632 y Fk(3.7.1)63
+b(Simple)40 b(Command)g(Expansion)275 876 y Ft(When)35
+b(a)h(simple)d(command)j(is)e(executed,)k(the)e(shell)e(p)s(erforms)g
+(the)i(follo)m(wing)e(expansions,)h(as-)150 985 y(signmen)m(ts,)30
+b(and)g(redirections,)f(from)h(left)g(to)h(righ)m(t.)199
+1119 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)37 b(assignmen)m(ts)h(\(those)h(preceding)e
+(the)330 1229 y(command)30 b(name\))h(and)f(redirections)f(are)h(sa)m
+(v)m(ed)i(for)e(later)g(pro)s(cessing.)199 1363 y(2.)61
+b(The)39 b(w)m(ords)g(that)i(are)f(not)g(v)-5 b(ariable)38
+b(assignmen)m(ts)i(or)f(redirections)g(are)h(expanded)f(\(see)h(Sec-)
+330 1473 y(tion)c(3.5)j([Shell)c(Expansions],)i(page)h(16\).)61
+b(If)37 b(an)m(y)g(w)m(ords)f(remain)g(after)i(expansion,)g(the)f
+(\014rst)330 1582 y(w)m(ord)31 b(is)f(tak)m(en)i(to)g(b)s(e)f(the)g
+(name)h(of)f(the)h(command)f(and)f(the)i(remaining)d(w)m(ords)i(are)g
+(the)h(argu-)330 1692 y(men)m(ts.)199 1826 y(3.)61 b(Redirections)23
+b(are)h(p)s(erformed)f(as)h(describ)s(ed)e(ab)s(o)m(v)m(e)j(\(see)g
+(Section)f(3.6)h([Redirections],)g(page)f(24\).)199 1961
+y(4.)61 b(The)25 b(text)h(after)f(the)g(`)p Fs(=)p Ft(')h(in)d(eac)m(h)
+k(v)-5 b(ariable)23 b(assignmen)m(t)i(undergo)s(es)f(tilde)g
+(expansion,)h(parameter)330 2070 y(expansion,)48 b(command)e
+(substitution,)h(arithmetic)d(expansion,)49 b(and)c(quote)h(remo)m(v)-5
+b(al)45 b(b)s(efore)330 2180 y(b)s(eing)29 b(assigned)h(to)h(the)f(v)-5
+b(ariable.)275 2339 y(If)32 b(no)i(command)f(name)g(results,)g(the)h(v)
+-5 b(ariable)32 b(assignmen)m(ts)h(a\013ect)i(the)f(curren)m(t)f(shell)
+f(en)m(viron-)150 2448 y(men)m(t.)39 b(Otherwise,)26
+b(the)f(v)-5 b(ariables)24 b(are)i(added)f(to)h(the)f(en)m(vironmen)m
+(t)g(of)h(the)f(executed)h(command)g(and)150 2558 y(do)35
+b(not)f(a\013ect)j(the)d(curren)m(t)h(shell)e(en)m(vironmen)m(t.)53
+b(If)34 b(an)m(y)h(of)g(the)f(assignmen)m(ts)h(attempts)g(to)h(assign)
+150 2667 y(a)j(v)-5 b(alue)38 b(to)h(a)g(readonly)e(v)-5
+b(ariable,)40 b(an)e(error)g(o)s(ccurs,)j(and)c(the)i(command)f(exits)g
+(with)g(a)g(non-zero)150 2777 y(status.)275 2911 y(If)33
+b(no)g(command)g(name)h(results,)f(redirections)f(are)i(p)s(erformed,)f
+(but)g(do)h(not)f(a\013ect)i(the)f(curren)m(t)150 3021
+y(shell)29 b(en)m(vironmen)m(t.)40 b(A)30 b(redirection)f(error)h
+(causes)h(the)g(command)f(to)h(exit)f(with)f(a)i(non-zero)g(status.)275
+3155 y(If)26 b(there)i(is)e(a)i(command)f(name)h(left)f(after)h
+(expansion,)f(execution)h(pro)s(ceeds)f(as)g(describ)s(ed)e(b)s(elo)m
+(w.)150 3265 y(Otherwise,)38 b(the)f(command)g(exits.)61
+b(If)37 b(one)g(of)g(the)h(expansions)e(con)m(tained)h(a)h(command)f
+(substitu-)150 3374 y(tion,)h(the)e(exit)g(status)h(of)f(the)h(command)
+f(is)g(the)g(exit)g(status)h(of)f(the)h(last)f(command)g(substitution)
+150 3484 y(p)s(erformed.)55 b(If)35 b(there)g(w)m(ere)h(no)g(command)f
+(substitutions,)g(the)g(command)h(exits)f(with)f(a)i(status)g(of)150
+3593 y(zero.)150 3817 y Fk(3.7.2)63 b(Command)39 b(Searc)m(h)h(and)h
+(Execution)275 4061 y Ft(After)35 b(a)h(command)f(has)h(b)s(een)e
+(split)g(in)m(to)h(w)m(ords,)i(if)d(it)h(results)g(in)f(a)i(simple)d
+(command)i(and)g(an)150 4170 y(optional)30 b(list)f(of)h(argumen)m(ts,)
+h(the)g(follo)m(wing)d(actions)j(are)g(tak)m(en.)199
+4304 y(1.)61 b(If)24 b(the)g(command)g(name)g(con)m(tains)h(no)f
+(slashes,)h(the)f(shell)f(attempts)i(to)g(lo)s(cate)g(it.)38
+b(If)24 b(there)g(exists)330 4414 y(a)h(shell)e(function)g(b)m(y)h
+(that)h(name,)h(that)f(function)e(is)h(in)m(v)m(ok)m(ed)h(as)f(describ)
+s(ed)f(in)g(Section)h(3.3)i([Shell)330 4524 y(F)-8 b(unctions],)30
+b(page)i(13.)199 4658 y(2.)61 b(If)41 b(the)g(name)h(do)s(es)f(not)g
+(matc)m(h)i(a)e(function,)i(the)f(shell)d(searc)m(hes)k(for)e(it)g(in)f
+(the)h(list)f(of)i(shell)330 4767 y(builtins.)37 b(If)30
+b(a)h(matc)m(h)g(is)e(found,)h(that)h(builtin)c(is)i(in)m(v)m(ok)m(ed.)
+199 4902 y(3.)61 b(If)40 b(the)g(name)h(is)e(neither)h(a)g(shell)f
+(function)g(nor)h(a)g(builtin,)g(and)g(con)m(tains)g(no)h(slashes,)h
+(Bash)330 5011 y(searc)m(hes)d(eac)m(h)g(elemen)m(t)f(of)h
+Fs($PATH)d Ft(for)i(a)g(directory)g(con)m(taining)f(an)h(executable)g
+(\014le)f(b)m(y)h(that)330 5121 y(name.)56 b(Bash)36
+b(uses)f(a)h(hash)e(table)i(to)g(remem)m(b)s(er)f(the)h(full)d
+(pathnames)i(of)h(executable)g(\014les)e(to)330 5230
+y(a)m(v)m(oid)e(m)m(ultiple)d Fs(PATH)i Ft(searc)m(hes)i(\(see)f(the)g
+(description)e(of)h Fs(hash)g Ft(in)f(Section)i(4.1)g([Bourne)g(Shell)
+330 5340 y(Builtins],)i(page)i(33\).)55 b(A)35 b(full)e(searc)m(h)i(of)
+g(the)g(directories)f(in)g Fs($PATH)f Ft(is)h(p)s(erformed)g(only)g(if)
+g(the)p eop
+%%Page: 29 35
+29 34 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(29)330 299 y(command)31
+b(is)f(not)h(found)f(in)f(the)j(hash)e(table.)42 b(If)31
+b(the)g(searc)m(h)h(is)e(unsuccessful,)f(the)i(shell)e(prin)m(ts)330
+408 y(an)h(error)g(message)i(and)e(returns)f(an)h(exit)g(status)h(of)f
+(127.)199 544 y(4.)61 b(If)33 b(the)g(searc)m(h)h(is)f(successful,)g
+(or)g(if)f(the)i(command)f(name)g(con)m(tains)h(one)g(or)f(more)g
+(slashes,)h(the)330 653 y(shell)f(executes)j(the)f(named)f(program)g
+(in)g(a)h(separate)h(execution)e(en)m(vironmen)m(t.)54
+b(Argumen)m(t)35 b(0)330 763 y(is)29 b(set)i(to)h(the)e(name)h(giv)m
+(en,)f(and)g(the)h(remaining)d(argumen)m(ts)j(to)g(the)g(command)f(are)
+h(set)g(to)g(the)330 872 y(argumen)m(ts)g(supplied,)c(if)i(an)m(y)-8
+b(.)199 1008 y(5.)61 b(If)35 b(this)g(execution)h(fails)e(b)s(ecause)i
+(the)f(\014le)g(is)g(not)h(in)e(executable)j(format,)g(and)e(the)h
+(\014le)f(is)g(not)330 1117 y(a)e(directory)-8 b(,)33
+b(it)f(is)g(assumed)f(to)j(b)s(e)d(a)i Fq(shell)e(script)i
+Ft(and)f(the)h(shell)d(executes)k(it)e(as)h(describ)s(ed)d(in)330
+1227 y(Section)g(3.8)i([Shell)c(Scripts],)h(page)j(31.)199
+1362 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(,)41 b(the)d(shell)f(w)m(aits)i(for)f(the)h(command)f
+(to)330 1472 y(complete)31 b(and)f(collects)g(its)g(exit)g(status.)150
+1698 y Fk(3.7.3)63 b(Command)39 b(Execution)h(En)m(vironmen)m(t)275
+1944 y Ft(The)29 b(shell)g(has)h(an)g Fq(execution)h(en)m(vironmen)m(t)
+p Ft(,)f(whic)m(h)f(consists)h(of)h(the)f(follo)m(wing:)225
+2080 y Fp(\017)60 b Ft(op)s(en)32 b(\014les)f(inherited)f(b)m(y)j(the)f
+(shell)f(at)i(in)m(v)m(o)s(cation,)h(as)e(mo)s(di\014ed)f(b)m(y)h
+(redirections)f(supplied)e(to)330 2189 y(the)i Fs(exec)e
+Ft(builtin)225 2325 y Fp(\017)60 b Ft(the)28 b(curren)m(t)g(w)m(orking)
+g(directory)g(as)g(set)h(b)m(y)f Fs(cd)p Ft(,)g Fs(pushd)p
+Ft(,)g(or)g Fs(popd)p Ft(,)g(or)g(inherited)e(b)m(y)i(the)h(shell)d(at)
+330 2434 y(in)m(v)m(o)s(cation)225 2569 y Fp(\017)60
+b Ft(the)31 b(\014le)e(creation)i(mo)s(de)f(mask)g(as)h(set)g(b)m(y)f
+Fs(umask)f Ft(or)h(inherited)e(from)i(the)h(shell's)d(paren)m(t)225
+2705 y Fp(\017)60 b Ft(curren)m(t)30 b(traps)g(set)h(b)m(y)f
+Fs(trap)225 2840 y Fp(\017)60 b Ft(shell)28 b(parameters)h(that)h(are)g
+(set)g(b)m(y)g(v)-5 b(ariable)28 b(assignmen)m(t)h(or)h(with)e
+Fs(set)g Ft(or)i(inherited)d(from)i(the)330 2949 y(shell's)g(paren)m(t)
+h(in)f(the)i(en)m(vironmen)m(t)225 3084 y Fp(\017)60
+b Ft(shell)42 b(functions)g(de\014ned)g(during)g(execution)i(or)f
+(inherited)f(from)h(the)h(shell's)e(paren)m(t)h(in)g(the)330
+3194 y(en)m(vironmen)m(t)225 3329 y Fp(\017)60 b Ft(options)32
+b(enabled)g(at)i(in)m(v)m(o)s(cation)f(\(either)g(b)m(y)g(default)f(or)
+h(with)f(command-line)f(argumen)m(ts\))j(or)330 3439
+y(b)m(y)c Fs(set)225 3574 y Fp(\017)60 b Ft(options)30
+b(enabled)f(b)m(y)h Fs(shopt)225 3709 y Fp(\017)60 b
+Ft(shell)29 b(aliases)g(de\014ned)h(with)f Fs(alias)g
+Ft(\(see)i(Section)f(6.6)i([Aliases],)e(page)h(71\))225
+3844 y Fp(\017)60 b Ft(v)-5 b(arious)49 b(pro)s(cess)g
+Fl(id)p Ft(s,)55 b(including)46 b(those)51 b(of)e(bac)m(kground)h(jobs)
+f(\(see)i(Section)f(3.2.3)h([Lists],)330 3954 y(page)31
+b(9\),)g(the)g(v)-5 b(alue)30 b(of)g Fs($$)p Ft(,)g(and)g(the)h(v)-5
+b(alue)30 b(of)g Fs($PPID)275 4115 y Ft(When)k(a)g(simple)f(command)h
+(other)g(than)g(a)h(builtin)c(or)j(shell)f(function)g(is)g(to)i(b)s(e)f
+(executed,)i(it)e(is)150 4225 y(in)m(v)m(ok)m(ed)24 b(in)f(a)h
+(separate)h(execution)f(en)m(vironmen)m(t)g(that)g(consists)f(of)i(the)
+f(follo)m(wing.)37 b(Unless)23 b(otherwise)150 4335 y(noted,)31
+b(the)f(v)-5 b(alues)30 b(are)h(inherited)d(from)i(the)g(shell.)225
+4470 y Fp(\017)60 b Ft(the)31 b(shell's)f(op)s(en)g(\014les,)h(plus)e
+(an)m(y)i(mo)s(di\014cations)f(and)g(additions)f(sp)s(eci\014ed)h(b)m
+(y)h(redirections)e(to)330 4580 y(the)i(command)225 4715
+y Fp(\017)60 b Ft(the)31 b(curren)m(t)f(w)m(orking)f(directory)225
+4850 y Fp(\017)60 b Ft(the)31 b(\014le)e(creation)i(mo)s(de)f(mask)225
+4986 y Fp(\017)60 b Ft(shell)30 b(v)-5 b(ariables)31
+b(and)g(functions)g(mark)m(ed)h(for)g(exp)s(ort,)g(along)g(with)f(v)-5
+b(ariables)30 b(exp)s(orted)i(for)g(the)330 5095 y(command,)e(passed)g
+(in)f(the)i(en)m(vironmen)m(t)f(\(see)h(Section)f(3.7.4)j([En)m
+(vironmen)m(t],)d(page)h(30\))225 5230 y Fp(\017)60 b
+Ft(traps)31 b(caugh)m(t)h(b)m(y)f(the)g(shell)f(are)h(reset)h(to)g(the)
+f(v)-5 b(alues)31 b(inherited)d(from)j(the)g(shell's)f(paren)m(t,)i
+(and)330 5340 y(traps)e(ignored)g(b)m(y)g(the)g(shell)f(are)i(ignored)p
+eop
+%%Page: 30 36
+30 35 bop 150 -116 a Ft(30)2572 b(Bash)31 b(Reference)g(Man)m(ual)275
+299 y(A)41 b(command)g(in)m(v)m(ok)m(ed)h(in)e(this)h(separate)h(en)m
+(vironmen)m(t)f(cannot)h(a\013ect)h(the)f(shell's)e(execution)150
+408 y(en)m(vironmen)m(t.)275 540 y(Command)35 b(substitution,)h
+(commands)g(group)s(ed)f(with)h(paren)m(theses,)i(and)e(async)m
+(hronous)g(com-)150 650 y(mands)c(are)h(in)m(v)m(ok)m(ed)h(in)d(a)j
+(subshell)c(en)m(vironmen)m(t)i(that)i(is)e(a)h(duplicate)f(of)h(the)g
+(shell)e(en)m(vironmen)m(t,)150 760 y(except)k(that)g(traps)f(caugh)m
+(t)h(b)m(y)f(the)h(shell)d(are)i(reset)h(to)g(the)f(v)-5
+b(alues)34 b(that)h(the)f(shell)f(inherited)e(from)150
+869 y(its)h(paren)m(t)g(at)h(in)m(v)m(o)s(cation.)47
+b(Builtin)29 b(commands)j(that)h(are)g(in)m(v)m(ok)m(ed)g(as)f(part)g
+(of)h(a)f(pip)s(eline)d(are)k(also)150 979 y(executed)41
+b(in)e(a)i(subshell)c(en)m(vironmen)m(t.)71 b(Changes)40
+b(made)g(to)h(the)g(subshell)c(en)m(vironmen)m(t)j(cannot)150
+1088 y(a\013ect)32 b(the)f(shell's)d(execution)j(en)m(vironmen)m(t.)275
+1220 y(If)38 b(a)h(command)f(is)f(follo)m(w)m(ed)i(b)m(y)f(a)h(`)p
+Fs(&)p Ft(')g(and)f(job)g(con)m(trol)h(is)e(not)i(activ)m(e,)j(the)d
+(default)f(standard)150 1330 y(input)e(for)h(the)h(command)f(is)g(the)h
+(empt)m(y)g(\014le)e(`)p Fs(/dev/null)p Ft('.)61 b(Otherwise,)38
+b(the)g(in)m(v)m(ok)m(ed)g(command)150 1440 y(inherits)28
+b(the)j(\014le)e(descriptors)g(of)i(the)f(calling)f(shell)g(as)h(mo)s
+(di\014ed)f(b)m(y)h(redirections.)150 1656 y Fk(3.7.4)63
+b(En)m(vironmen)m(t)275 1898 y Ft(When)31 b(a)g(program)h(is)e(in)m(v)m
+(ok)m(ed)i(it)f(is)f(giv)m(en)h(an)h(arra)m(y)g(of)f(strings)f(called)h
+(the)g Fq(en)m(vironmen)m(t)p Ft(.)44 b(This)150 2007
+y(is)29 b(a)i(list)e(of)i(name-v)-5 b(alue)30 b(pairs,)f(of)i(the)f
+(form)g Fs(name=value)p Ft(.)275 2139 y(Bash)39 b(pro)m(vides)f(sev)m
+(eral)i(w)m(a)m(ys)h(to)f(manipulate)d(the)j(en)m(vironmen)m(t.)68
+b(On)38 b(in)m(v)m(o)s(cation,)k(the)e(shell)150 2249
+y(scans)g(its)g(o)m(wn)g(en)m(vironmen)m(t)g(and)g(creates)i(a)f
+(parameter)f(for)g(eac)m(h)i(name)e(found,)i(automatically)150
+2359 y(marking)25 b(it)g(for)h Fq(exp)s(ort)h Ft(to)g(c)m(hild)d(pro)s
+(cesses.)39 b(Executed)26 b(commands)g(inherit)e(the)i(en)m(vironmen)m
+(t.)38 b(The)150 2468 y Fs(export)d Ft(and)i(`)p Fs(declare)29
+b(-x)p Ft(')36 b(commands)h(allo)m(w)g(parameters)g(and)g(functions)f
+(to)i(b)s(e)e(added)h(to)h(and)150 2578 y(deleted)20
+b(from)g(the)h(en)m(vironmen)m(t.)37 b(If)20 b(the)h(v)-5
+b(alue)20 b(of)h(a)g(parameter)g(in)e(the)h(en)m(vironmen)m(t)h(is)e
+(mo)s(di\014ed,)i(the)150 2687 y(new)31 b(v)-5 b(alue)31
+b(b)s(ecomes)g(part)h(of)f(the)h(en)m(vironmen)m(t,)f(replacing)g(the)g
+(old.)43 b(The)31 b(en)m(vironmen)m(t)g(inherited)150
+2797 y(b)m(y)g(an)m(y)g(executed)h(command)f(consists)f(of)h(the)g
+(shell's)f(initial)e(en)m(vironmen)m(t,)j(whose)g(v)-5
+b(alues)30 b(ma)m(y)i(b)s(e)150 2907 y(mo)s(di\014ed)25
+b(in)g(the)i(shell,)f(less)g(an)m(y)h(pairs)e(remo)m(v)m(ed)j(b)m(y)f
+(the)g Fs(unset)e Ft(and)h(`)p Fs(export)j(-n)p Ft(')e(commands,)g
+(plus)150 3016 y(an)m(y)k(additions)d(via)i(the)h Fs(export)d
+Ft(and)i(`)p Fs(declare)f(-x)p Ft(')h(commands.)275 3148
+y(The)j(en)m(vironmen)m(t)h(for)g(an)m(y)g(simple)f(command)h(or)g
+(function)f(ma)m(y)h(b)s(e)g(augmen)m(ted)h(temp)s(orarily)150
+3258 y(b)m(y)c(pre\014xing)d(it)i(with)g(parameter)h(assignmen)m(ts,)g
+(as)f(describ)s(ed)f(in)g(Section)i(3.4)h([Shell)c(P)m(arameters],)150
+3367 y(page)i(15.)41 b(These)29 b(assignmen)m(t)h(statemen)m(ts)h
+(a\013ect)f(only)f(the)g(en)m(vironmen)m(t)g(seen)h(b)m(y)f(that)h
+(command.)275 3499 y(If)h(the)i(`)p Fs(-k)p Ft(')f(option)g(is)f(set)i
+(\(see)g(Section)f(4.3)h([The)f(Set)h(Builtin],)d(page)j(50\),)h(then)e
+(all)f(parameter)150 3609 y(assignmen)m(ts)e(are)h(placed)g(in)e(the)i
+(en)m(vironmen)m(t)f(for)h(a)g(command,)f(not)h(just)f(those)i(that)f
+(precede)g(the)150 3719 y(command)g(name.)275 3851 y(When)f(Bash)h(in)m
+(v)m(ok)m(es)h(an)f(external)f(command,)h(the)g(v)-5
+b(ariable)29 b(`)p Fs($_)p Ft(')h(is)f(set)h(to)h(the)f(full)d(path)j
+(name)150 3960 y(of)h(the)f(command)g(and)g(passed)g(to)h(that)g
+(command)f(in)f(its)h(en)m(vironmen)m(t.)150 4177 y Fk(3.7.5)63
+b(Exit)40 b(Status)275 4418 y Ft(F)-8 b(or)32 b(the)g(shell's)e(purp)s
+(oses,)g(a)j(command)e(whic)m(h)g(exits)g(with)g(a)h(zero)g(exit)g
+(status)g(has)f(succeeded.)150 4528 y(A)e(non-zero)h(exit)f(status)h
+(indicates)e(failure.)38 b(This)27 b(seemingly)h(coun)m(ter-in)m
+(tuitiv)m(e)h(sc)m(heme)h(is)e(used)h(so)150 4638 y(there)34
+b(is)f(one)h(w)m(ell-de\014ned)e(w)m(a)m(y)i(to)h(indicate)e(success)h
+(and)f(a)h(v)-5 b(ariet)m(y)34 b(of)g(w)m(a)m(ys)h(to)f(indicate)f(v)-5
+b(arious)150 4747 y(failure)36 b(mo)s(des.)62 b(When)38
+b(a)g(command)f(terminates)h(on)f(a)i(fatal)f(signal)e(whose)i(n)m(um)m
+(b)s(er)e(is)h Fq(N)p Ft(,)h(Bash)150 4857 y(uses)30
+b(the)g(v)-5 b(alue)30 b(128)p Fs(+)p Fq(N)42 b Ft(as)30
+b(the)h(exit)f(status.)275 4989 y(If)35 b(a)h(command)g(is)f(not)h
+(found,)g(the)g(c)m(hild)f(pro)s(cess)g(created)i(to)g(execute)g(it)f
+(returns)e(a)j(status)f(of)150 5098 y(127.)42 b(If)30
+b(a)h(command)f(is)f(found)g(but)h(is)f(not)i(executable,)g(the)g
+(return)e(status)i(is)e(126.)275 5230 y(If)j(a)i(command)f(fails)e(b)s
+(ecause)i(of)h(an)f(error)f(during)f(expansion)h(or)h(redirection,)g
+(the)h(exit)f(status)150 5340 y(is)c(greater)j(than)e(zero.)p
+eop
+%%Page: 31 37
+31 36 bop 150 -116 a Ft(Chapter)30 b(3:)41 b(Basic)31
+b(Shell)d(F)-8 b(eatures)2246 b(31)275 299 y(The)38 b(exit)g(status)h
+(is)f(used)g(b)m(y)g(the)h(Bash)g(conditional)e(commands)h(\(see)h
+(Section)g(3.2.4.2)i([Con-)150 408 y(ditional)f(Constructs],)k(page)f
+(10\))g(and)e(some)i(of)f(the)g(list)e(constructs)i(\(see)h(Section)e
+(3.2.3)j([Lists],)150 518 y(page)31 b(9\).)275 651 y(All)38
+b(of)i(the)h(Bash)f(builtins)c(return)j(an)h(exit)g(status)h(of)f(zero)
+h(if)e(they)h(succeed)g(and)g(a)g(non-zero)150 760 y(status)34
+b(on)f(failure,)g(so)h(they)g(ma)m(y)g(b)s(e)f(used)g(b)m(y)g(the)h
+(conditional)e(and)h(list)f(constructs.)50 b(All)33 b(builtins)150
+870 y(return)c(an)i(exit)f(status)h(of)f(2)h(to)g(indicate)e(incorrect)
+i(usage.)150 1089 y Fk(3.7.6)63 b(Signals)275 1332 y
+Ft(When)27 b(Bash)h(is)g(in)m(teractiv)m(e,)h(in)e(the)h(absence)h(of)f
+(an)m(y)g(traps,)h(it)e(ignores)h Fs(SIGTERM)e Ft(\(so)i(that)h(`)p
+Fs(kill)150 1441 y(0)p Ft(')k(do)s(es)g(not)g(kill)d(an)j(in)m
+(teractiv)m(e)h(shell\),)f(and)f Fs(SIGINT)f Ft(is)h(caugh)m(t)i(and)f
+(handled)e(\(so)i(that)h(the)f Fs(wait)150 1551 y Ft(builtin)21
+b(is)j(in)m(terruptible\).)36 b(When)24 b(Bash)g(receiv)m(es)i(a)e
+Fs(SIGINT)p Ft(,)h(it)f(breaks)g(out)h(of)f(an)m(y)h(executing)g(lo)s
+(ops.)150 1660 y(In)31 b(all)f(cases,)j(Bash)f(ignores)f
+Fs(SIGQUIT)p Ft(.)42 b(If)32 b(job)f(con)m(trol)h(is)e(in)h(e\013ect)i
+(\(see)f(Chapter)f(7)h([Job)g(Con)m(trol],)150 1770 y(page)f(79\),)h
+(Bash)e(ignores)g Fs(SIGTTIN)p Ft(,)f Fs(SIGTTOU)p Ft(,)g(and)g
+Fs(SIGTSTP)p Ft(.)275 1903 y(Non-builtin)f(commands)j(started)g(b)m(y)g
+(Bash)h(ha)m(v)m(e)g(signal)e(handlers)f(set)j(to)g(the)g(v)-5
+b(alues)30 b(inherited)150 2012 y(b)m(y)37 b(the)h(shell)e(from)h(its)g
+(paren)m(t.)62 b(When)38 b(job)f(con)m(trol)h(is)e(not)i(in)e
+(e\013ect,)41 b(async)m(hronous)c(commands)150 2122 y(ignore)e
+Fs(SIGINT)f Ft(and)h Fs(SIGQUIT)e Ft(in)i(addition)e(to)k(these)f
+(inherited)d(handlers.)54 b(Commands)35 b(run)f(as)i(a)150
+2232 y(result)26 b(of)i(command)f(substitution)f(ignore)h(the)h(k)m
+(eyb)s(oard-generated)g(job)g(con)m(trol)g(signals)e
+Fs(SIGTTIN)p Ft(,)150 2341 y Fs(SIGTTOU)p Ft(,)j(and)g
+Fs(SIGTSTP)p Ft(.)275 2474 y(The)h(shell)g(exits)h(b)m(y)g(default)f
+(up)s(on)g(receipt)h(of)g(a)h Fs(SIGHUP)p Ft(.)42 b(Before)32
+b(exiting,)f(an)g(in)m(teractiv)m(e)h(shell)150 2584
+y(resends)41 b(the)i Fs(SIGHUP)e Ft(to)i(all)e(jobs,)k(running)40
+b(or)i(stopp)s(ed.)76 b(Stopp)s(ed)41 b(jobs)h(are)h(sen)m(t)g
+Fs(SIGCONT)d Ft(to)150 2693 y(ensure)32 b(that)h(they)g(receiv)m(e)h
+(the)f Fs(SIGHUP)p Ft(.)47 b(T)-8 b(o)33 b(prev)m(en)m(t)g(the)g(shell)
+e(from)i(sending)e(the)i Fs(SIGHUP)e Ft(signal)150 2803
+y(to)i(a)g(particular)e(job,)i(it)f(should)f(b)s(e)h(remo)m(v)m(ed)h
+(from)g(the)f(jobs)g(table)h(with)e(the)i Fs(disown)e
+Ft(builtin)e(\(see)150 2912 y(Section)h(7.2)h([Job)f(Con)m(trol)g
+(Builtins],)e(page)j(80\))h(or)e(mark)m(ed)g(to)h(not)f(receiv)m(e)h
+Fs(SIGHUP)e Ft(using)g Fs(disown)150 3022 y(-h)p Ft(.)275
+3155 y(If)i(the)h Fs(huponexit)d Ft(shell)i(option)g(has)h(b)s(een)f
+(set)h(with)f Fs(shopt)f Ft(\(see)j(Section)f(4.2)h([Bash)f(Builtins],)
+150 3264 y(page)f(39\),)h(Bash)e(sends)g(a)h Fs(SIGHUP)d
+Ft(to)j(all)f(jobs)g(when)f(an)h(in)m(teractiv)m(e)h(login)f(shell)e
+(exits.)275 3397 y(If)38 b(Bash)h(is)f(w)m(aiting)g(for)h(a)g(command)f
+(to)i(complete)f(and)f(receiv)m(es)i(a)f(signal)f(for)g(whic)m(h)g(a)h
+(trap)150 3507 y(has)c(b)s(een)f(set,)i(the)f(trap)g(will)d(not)j(b)s
+(e)f(executed)i(un)m(til)d(the)i(command)f(completes.)54
+b(When)35 b(Bash)g(is)150 3616 y(w)m(aiting)h(for)h(an)g(async)m
+(hronous)g(command)g(via)g(the)g Fs(wait)f Ft(builtin,)f(the)j
+(reception)f(of)g(a)g(signal)f(for)150 3726 y(whic)m(h)e(a)h(trap)g
+(has)g(b)s(een)f(set)h(will)e(cause)i(the)g Fs(wait)f
+Ft(builtin)e(to)j(return)f(immediately)f(with)h(an)h(exit)150
+3836 y(status)c(greater)g(than)f(128,)i(immediately)d(after)i(whic)m(h)
+e(the)i(trap)f(is)f(executed.)150 4088 y Fr(3.8)68 b(Shell)45
+b(Scripts)275 4330 y Ft(A)c(shell)f(script)h(is)g(a)h(text)h(\014le)e
+(con)m(taining)g(shell)f(commands.)75 b(When)41 b(suc)m(h)h(a)g(\014le)
+f(is)g(used)g(as)150 4440 y(the)33 b(\014rst)f(non-option)g(argumen)m
+(t)i(when)e(in)m(v)m(oking)g(Bash,)i(and)e(neither)g(the)h(`)p
+Fs(-c)p Ft(')g(nor)g(`)p Fs(-s)p Ft(')f(option)h(is)150
+4550 y(supplied)i(\(see)40 b(Section)f(6.1)g([In)m(v)m(oking)g(Bash],)i
+(page)f(63\),)i(Bash)d(reads)f(and)g(executes)i(commands)150
+4659 y(from)31 b(the)h(\014le,)g(then)f(exits.)45 b(This)30
+b(mo)s(de)h(of)h(op)s(eration)g(creates)h(a)f(non-in)m(teractiv)m(e)g
+(shell.)43 b(The)32 b(shell)150 4769 y(\014rst)26 b(searc)m(hes)h(for)f
+(the)g(\014le)g(in)f(the)h(curren)m(t)h(directory)-8
+b(,)27 b(and)f(lo)s(oks)f(in)h(the)g(directories)f(in)g
+Fs($PATH)g Ft(if)h(not)150 4878 y(found)j(there.)275
+5011 y(When)34 b(Bash)h(runs)e(a)i(shell)e(script,)h(it)h(sets)g(the)f
+(sp)s(ecial)g(parameter)h Fs(0)f Ft(to)h(the)g(name)g(of)g(the)g
+(\014le,)150 5121 y(rather)k(than)g(the)h(name)f(of)h(the)f(shell,)h
+(and)f(the)h(p)s(ositional)d(parameters)i(are)h(set)g(to)g(the)g
+(remain-)150 5230 y(ing)e(argumen)m(ts,)k(if)c(an)m(y)h(are)g(giv)m
+(en.)66 b(If)39 b(no)g(additional)d(argumen)m(ts)k(are)f(supplied,)f
+(the)h(p)s(ositional)150 5340 y(parameters)31 b(are)f(unset.)p
+eop
+%%Page: 32 38
+32 37 bop 150 -116 a Ft(32)2572 b(Bash)31 b(Reference)g(Man)m(ual)275
+299 y(A)39 b(shell)f(script)g(ma)m(y)i(b)s(e)f(made)h(executable)g(b)m
+(y)f(using)f(the)i Fs(chmod)e Ft(command)h(to)h(turn)e(on)i(the)150
+408 y(execute)j(bit.)72 b(When)41 b(Bash)g(\014nds)e(suc)m(h)i(a)h
+(\014le)e(while)f(searc)m(hing)i(the)g Fs($PATH)f Ft(for)h(a)h
+(command,)h(it)150 518 y(spa)m(wns)30 b(a)g(subshell)e(to)j(execute)h
+(it.)40 b(In)30 b(other)g(w)m(ords,)g(executing)390 653
+y Fs(filename)46 b Fj(arguments)150 787 y Ft(is)29 b(equiv)-5
+b(alen)m(t)30 b(to)h(executing)390 922 y Fs(bash)47 b(filename)e
+Fj(arguments)150 1056 y Ft(if)29 b Fs(filename)e Ft(is)i(an)g
+(executable)i(shell)d(script.)39 b(This)28 b(subshell)f(reinitializes)f
+(itself,)j(so)h(that)h(the)e(e\013ect)150 1166 y(is)35
+b(as)i(if)f(a)g(new)g(shell)f(had)h(b)s(een)g(in)m(v)m(ok)m(ed)g(to)i
+(in)m(terpret)d(the)i(script,)g(with)e(the)i(exception)g(that)g(the)150
+1275 y(lo)s(cations)23 b(of)i(commands)e(remem)m(b)s(ered)h(b)m(y)g
+(the)g(paren)m(t)g(\(see)h(the)f(description)e(of)i Fs(hash)f
+Ft(in)g(Section)h(4.1)150 1385 y([Bourne)30 b(Shell)f(Builtins],)f
+(page)j(33\))h(are)e(retained)g(b)m(y)g(the)h(c)m(hild.)275
+1519 y(Most)36 b(v)m(ersions)f(of)h(Unix)e(mak)m(e)i(this)f(a)h(part)f
+(of)h(the)g(op)s(erating)f(system's)g(command)h(execution)150
+1629 y(mec)m(hanism.)49 b(If)33 b(the)g(\014rst)g(line)f(of)h(a)h
+(script)e(b)s(egins)g(with)g(the)h(t)m(w)m(o)i(c)m(haracters)g(`)p
+Fs(#!)p Ft(',)f(the)g(remainder)150 1738 y(of)d(the)g(line)f(sp)s
+(eci\014es)f(an)i(in)m(terpreter)f(for)h(the)g(program.)43
+b(Th)m(us,)30 b(y)m(ou)h(can)h(sp)s(ecify)d(Bash,)j Fs(awk)p
+Ft(,)e(P)m(erl,)150 1848 y(or)g(some)h(other)g(in)m(terpreter)f(and)f
+(write)h(the)g(rest)h(of)g(the)f(script)f(\014le)h(in)f(that)i
+(language.)275 1983 y(The)40 b(argumen)m(ts)h(to)g(the)g(in)m
+(terpreter)f(consist)g(of)h(a)g(single)f(optional)f(argumen)m(t)j
+(follo)m(wing)d(the)150 2092 y(in)m(terpreter)32 b(name)i(on)f(the)g
+(\014rst)f(line)g(of)h(the)g(script)f(\014le,)h(follo)m(w)m(ed)g(b)m(y)
+g(the)g(name)g(of)g(the)h(script)e(\014le,)150 2202 y(follo)m(w)m(ed)f
+(b)m(y)h(the)f(rest)h(of)g(the)f(argumen)m(ts.)45 b(Bash)31
+b(will)e(p)s(erform)h(this)h(action)h(on)f(op)s(erating)g(systems)150
+2311 y(that)24 b(do)g(not)f(handle)f(it)h(themselv)m(es.)39
+b(Note)25 b(that)f(some)g(older)f(v)m(ersions)f(of)i(Unix)e(limit)g
+(the)i(in)m(terpreter)150 2421 y(name)30 b(and)g(argumen)m(t)h(to)g(a)g
+(maxim)m(um)e(of)i(32)g(c)m(haracters.)275 2555 y(Bash)h(scripts)f
+(often)h(b)s(egin)f(with)g Fs(#!)f(/bin/bash)g Ft(\(assuming)h(that)i
+(Bash)f(has)g(b)s(een)f(installed)f(in)150 2665 y(`)p
+Fs(/bin)p Ft('\),)25 b(since)d(this)g(ensures)g(that)i(Bash)f(will)e(b)
+s(e)h(used)h(to)h(in)m(terpret)e(the)h(script,)h(ev)m(en)g(if)e(it)h
+(is)f(executed)150 2775 y(under)29 b(another)h(shell.)p
+eop
+%%Page: 33 39
+33 38 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(33)150 299 y Fo(4)80 b(Shell)55
+b(Builtin)g(Commands)275 572 y Ft(Builtin)22 b(commands)i(are)h(con)m
+(tained)g(within)d(the)j(shell)e(itself.)38 b(When)24
+b(the)h(name)g(of)g(a)g(builtin)c(com-)150 681 y(mand)26
+b(is)h(used)f(as)i(the)g(\014rst)e(w)m(ord)h(of)h(a)f(simple)f(command)
+h(\(see)h(Section)f(3.2.1)i([Simple)d(Commands],)150
+791 y(page)21 b(8\),)j(the)d(shell)e(executes)j(the)f(command)f
+(directly)-8 b(,)22 b(without)e(in)m(v)m(oking)g(another)h(program.)37
+b(Builtin)150 900 y(commands)f(are)h(necessary)g(to)g(implemen)m(t)e
+(functionalit)m(y)g(imp)s(ossible)e(or)k(incon)m(v)m(enien)m(t)f(to)h
+(obtain)150 1010 y(with)29 b(separate)i(utilities.)275
+1157 y(This)i(section)i(brie\015y)f(the)h(builtins)d(whic)m(h)i(Bash)h
+(inherits)e(from)i(the)g(Bourne)g(Shell,)g(as)g(w)m(ell)g(as)150
+1267 y(the)c(builtin)26 b(commands)k(whic)m(h)g(are)g(unique)f(to)i(or)
+f(ha)m(v)m(e)i(b)s(een)e(extended)g(in)f(Bash.)275 1414
+y(Sev)m(eral)44 b(builtin)c(commands)k(are)h(describ)s(ed)d(in)h(other)
+h(c)m(hapters:)69 b(builtin)40 b(commands)k(whic)m(h)150
+1524 y(pro)m(vide)22 b(the)i(Bash)f(in)m(terface)h(to)g(the)g(job)f
+(con)m(trol)h(facilities)d(\(see)j(Section)g(7.2)g([Job)f(Con)m(trol)g
+(Builtins],)150 1633 y(page)40 b(80\),)j(the)c(directory)g(stac)m(k)h
+(\(see)g(Section)f(6.8.1)i([Directory)f(Stac)m(k)g(Builtins],)f(page)h
+(73\),)j(the)150 1743 y(command)23 b(history)g(\(see)h(Section)f(9.2)i
+([Bash)f(History)f(Builtins],)f(page)j(109\),)h(and)d(the)h
+(programmable)150 1853 y(completion)30 b(facilities)e(\(see)k(Section)e
+(8.7)h([Programmable)f(Completion)f(Builtins],)f(page)k(105\).)275
+2000 y(Man)m(y)f(of)f(the)h(builtins)26 b(ha)m(v)m(e)32
+b(b)s(een)e(extended)g(b)m(y)g Fl(posix)g Ft(or)g(Bash.)150
+2290 y Fr(4.1)68 b(Bourne)45 b(Shell)g(Builtins)275 2546
+y Ft(The)31 b(follo)m(wing)f(shell)f(builtin)g(commands)i(are)h
+(inherited)d(from)i(the)h(Bourne)f(Shell.)43 b(These)31
+b(com-)150 2656 y(mands)e(are)i(implemen)m(ted)e(as)i(sp)s(eci\014ed)d
+(b)m(y)j(the)f Fl(posix)g Ft(1003.2)j(standard.)150 2835
+y Fs(:)d Ft(\(a)h(colon\))870 2944 y Fs(:)47 b([)p Fj(arguments)11
+b Fs(])630 3085 y Ft(Do)43 b(nothing)e(b)s(ey)m(ond)h(expanding)e
+Fq(argumen)m(ts)46 b Ft(and)c(p)s(erforming)e(redirections.)74
+b(The)630 3195 y(return)29 b(status)i(is)e(zero.)150
+3367 y Fs(.)h Ft(\(a)h(p)s(erio)s(d\))870 3477 y Fs(.)47
+b Fj(filename)57 b Fs([)p Fj(arguments)11 b Fs(])630
+3618 y Ft(Read)34 b(and)f(execute)i(commands)e(from)g(the)h
+Fq(\014lename)k Ft(argumen)m(t)c(in)e(the)i(curren)m(t)g(shell)630
+3727 y(con)m(text.)45 b(If)31 b Fq(\014lename)36 b Ft(do)s(es)31
+b(not)g(con)m(tain)h(a)f(slash,)g(the)h Fs(PATH)e Ft(v)-5
+b(ariable)30 b(is)g(used)g(to)i(\014nd)630 3837 y Fq(\014lename)p
+Ft(.)51 b(When)34 b(Bash)g(is)g(not)g(in)f Fl(posix)g
+Ft(mo)s(de,)i(the)g(curren)m(t)f(directory)f(is)g(searc)m(hed)630
+3946 y(if)d Fq(\014lename)35 b Ft(is)30 b(not)i(found)d(in)h
+Fs($PATH)p Ft(.)41 b(If)31 b(an)m(y)g Fq(argumen)m(ts)k
+Ft(are)c(supplied,)d(they)k(b)s(ecome)630 4056 y(the)e(p)s(ositional)e
+(parameters)j(when)e Fq(\014lename)34 b Ft(is)29 b(executed.)42
+b(Otherwise)29 b(the)h(p)s(ositional)630 4166 y(parameters)43
+b(are)h(unc)m(hanged.)79 b(The)42 b(return)g(status)i(is)e(the)h(exit)g
+(status)h(of)f(the)g(last)630 4275 y(command)37 b(executed,)k(or)c
+(zero)h(if)f(no)g(commands)g(are)h(executed.)63 b(If)36
+b Fq(\014lename)42 b Ft(is)37 b(not)630 4385 y(found,)22
+b(or)f(cannot)g(b)s(e)f(read,)j(the)e(return)f(status)h(is)f(non-zero.)
+38 b(This)19 b(builtin)f(is)h(equiv)-5 b(alen)m(t)630
+4494 y(to)31 b Fs(source)p Ft(.)150 4667 y Fs(break)870
+4808 y(break)46 b([)p Fj(n)11 b Fs(])630 4949 y Ft(Exit)44
+b(from)g(a)g Fs(for)p Ft(,)k Fs(while)p Ft(,)e Fs(until)p
+Ft(,)h(or)d Fs(select)f Ft(lo)s(op.)82 b(If)44 b Fq(n)g
+Ft(is)f(supplied,)i(the)g Fq(n)p Ft(th)630 5058 y(enclosing)39
+b(lo)s(op)g(is)h(exited.)69 b Fq(n)40 b Ft(m)m(ust)g(b)s(e)f(greater)j
+(than)d(or)i(equal)e(to)i(1.)70 b(The)40 b(return)630
+5168 y(status)31 b(is)e(zero)i(unless)e Fq(n)h Ft(is)f(not)i(greater)g
+(than)g(or)f(equal)g(to)h(1.)150 5340 y Fs(cd)p eop
+%%Page: 34 40
+34 39 bop 150 -116 a Ft(34)2572 b(Bash)31 b(Reference)g(Man)m(ual)870
+299 y Fs(cd)47 b([-L|-P])f([)p Fj(directory)11 b Fs(])630
+431 y Ft(Change)37 b(the)g(curren)m(t)f(w)m(orking)h(directory)f(to)i
+Fq(directory)p Ft(.)59 b(If)37 b Fq(directory)44 b Ft(is)36
+b(not)h(giv)m(en,)630 541 y(the)31 b(v)-5 b(alue)30 b(of)h(the)g
+Fs(HOME)e Ft(shell)g(v)-5 b(ariable)30 b(is)g(used.)40
+b(If)31 b(the)g(shell)e(v)-5 b(ariable)29 b Fs(CDPATH)g
+Ft(exists,)630 650 y(it)e(is)f(used)g(as)h(a)h(searc)m(h)f(path.)40
+b(If)26 b Fq(directory)34 b Ft(b)s(egins)26 b(with)g(a)h(slash,)g
+Fs(CDPATH)e Ft(is)h(not)h(used.)630 783 y(The)h(`)p Fs(-P)p
+Ft(')h(option)f(means)g(to)h(not)g(follo)m(w)f(sym)m(b)s(olic)f(links;)
+g(sym)m(b)s(olic)g(links)f(are)j(follo)m(w)m(ed)630 892
+y(b)m(y)23 b(default)g(or)h(with)e(the)i(`)p Fs(-L)p
+Ft(')f(option.)38 b(If)23 b Fq(directory)31 b Ft(is)22
+b(`)p Fs(-)p Ft(',)k(it)d(is)f(equiv)-5 b(alen)m(t)23
+b(to)i Fs($OLDPWD)p Ft(.)630 1025 y(If)33 b(a)h(non-empt)m(y)g
+(directory)f(name)g(from)g Fs(CDPATH)f Ft(is)g(used,)i(or)g(if)e(`)p
+Fs(-)p Ft(')i(is)e(the)i(\014rst)f(argu-)630 1134 y(men)m(t,)28
+b(and)e(the)h(directory)f(c)m(hange)i(is)e(successful,)h(the)g
+(absolute)f(pathname)h(of)f(the)h(new)630 1244 y(w)m(orking)j
+(directory)g(is)f(written)g(to)j(the)e(standard)g(output.)630
+1377 y(The)f(return)g(status)h(is)e(zero)j(if)d(the)i(directory)f(is)g
+(successfully)f(c)m(hanged,)i(non-zero)g(oth-)630 1486
+y(erwise.)150 1641 y Fs(continue)870 1774 y(continue)46
+b([)p Fj(n)11 b Fs(])630 1906 y Ft(Resume)32 b(the)g(next)g(iteration)g
+(of)g(an)g(enclosing)f Fs(for)p Ft(,)h Fs(while)p Ft(,)f
+Fs(until)p Ft(,)g(or)h Fs(select)f Ft(lo)s(op.)630 2016
+y(If)f Fq(n)h Ft(is)f(supplied,)d(the)32 b(execution)f(of)g(the)g
+Fq(n)p Ft(th)f(enclosing)g(lo)s(op)g(is)f(resumed.)42
+b Fq(n)30 b Ft(m)m(ust)h(b)s(e)630 2125 y(greater)39
+b(than)f(or)g(equal)f(to)i(1.)63 b(The)38 b(return)e(status)j(is)d
+(zero)j(unless)d Fq(n)i Ft(is)f(not)h(greater)630 2235
+y(than)30 b(or)g(equal)g(to)h(1.)150 2390 y Fs(eval)870
+2523 y(eval)47 b([)p Fj(arguments)11 b Fs(])630 2655
+y Ft(The)25 b(argumen)m(ts)h(are)g(concatenated)i(together)f(in)m(to)e
+(a)h(single)f(command,)h(whic)m(h)f(is)f(then)630 2765
+y(read)35 b(and)g(executed,)j(and)d(its)g(exit)g(status)h(returned)e
+(as)h(the)h(exit)f(status)h(of)g Fs(eval)p Ft(.)54 b(If)630
+2874 y(there)31 b(are)f(no)h(argumen)m(ts)f(or)h(only)e(empt)m(y)i
+(argumen)m(ts,)g(the)f(return)g(status)g(is)g(zero.)150
+3029 y Fs(exec)870 3162 y(exec)47 b([-cl])f([-a)h Fj(name)11
+b Fs(])46 b([)p Fj(command)56 b Fs([)p Fj(arguments)11
+b Fs(]])630 3294 y Ft(If)28 b Fq(command)j Ft(is)d(supplied,)d(it)j
+(replaces)g(the)g(shell)f(without)g(creating)i(a)f(new)g(pro)s(cess.)39
+b(If)630 3404 y(the)25 b(`)p Fs(-l)p Ft(')f(option)h(is)e(supplied,)g
+(the)i(shell)e(places)h(a)h(dash)f(at)i(the)f(b)s(eginning)d(of)i(the)h
+(zeroth)630 3513 y(arg)h(passed)f(to)h Fq(command)p Ft(.)39
+b(This)23 b(is)i(what)g(the)h Fs(login)d Ft(program)j(do)s(es.)38
+b(The)25 b(`)p Fs(-c)p Ft(')g(option)630 3623 y(causes)g
+Fq(command)i Ft(to)e(b)s(e)f(executed)h(with)e(an)h(empt)m(y)h(en)m
+(vironmen)m(t.)38 b(If)24 b(`)p Fs(-a)p Ft(')g(is)f(supplied,)630
+3733 y(the)32 b(shell)e(passes)i Fq(name)37 b Ft(as)c(the)f(zeroth)h
+(argumen)m(t)f(to)h Fq(command)p Ft(.)45 b(If)32 b(no)g
+Fq(command)j Ft(is)630 3842 y(sp)s(eci\014ed,)f(redirections)f(ma)m(y)i
+(b)s(e)f(used)f(to)i(a\013ect)h(the)f(curren)m(t)f(shell)f(en)m
+(vironmen)m(t.)52 b(If)630 3952 y(there)34 b(are)h(no)f(redirection)f
+(errors,)i(the)f(return)f(status)i(is)e(zero;)k(otherwise)d(the)g
+(return)630 4061 y(status)d(is)e(non-zero.)150 4217 y
+Fs(exit)870 4349 y(exit)47 b([)p Fj(n)11 b Fs(])630 4482
+y Ft(Exit)29 b(the)h(shell,)f(returning)e(a)k(status)f(of)g
+Fq(n)f Ft(to)h(the)g(shell's)e(paren)m(t.)41 b(If)30
+b Fq(n)f Ft(is)g(omitted,)h(the)630 4591 y(exit)c(status)h(is)f(that)h
+(of)g(the)g(last)f(command)g(executed.)41 b(An)m(y)26
+b(trap)h(on)f Fs(EXIT)f Ft(is)h(executed)630 4701 y(b)s(efore)k(the)h
+(shell)d(terminates.)150 4856 y Fs(export)870 4988 y(export)46
+b([-fn])g([-p])h([)p Fj(name)11 b Fs([=)p Fj(value)g
+Fs(]])630 5121 y Ft(Mark)40 b(eac)m(h)h Fq(name)k Ft(to)40
+b(b)s(e)f(passed)g(to)i(c)m(hild)d(pro)s(cesses)h(in)f(the)i(en)m
+(vironmen)m(t.)69 b(If)39 b(the)630 5230 y(`)p Fs(-f)p
+Ft(')29 b(option)g(is)g(supplied,)e(the)i Fq(name)5 b
+Ft(s)30 b(refer)f(to)h(shell)e(functions;)g(otherwise)h(the)h(names)630
+5340 y(refer)36 b(to)i(shell)c(v)-5 b(ariables.)58 b(The)36
+b(`)p Fs(-n)p Ft(')h(option)f(means)g(to)h(no)g(longer)f(mark)g(eac)m
+(h)i Fq(name)p eop
+%%Page: 35 41
+35 40 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(35)630 299 y(for)39 b(exp)s(ort.)65
+b(If)39 b(no)g Fq(names)j Ft(are)d(supplied,)f(or)h(if)f(the)h(`)p
+Fs(-p)p Ft(')g(option)f(is)g(giv)m(en,)j(a)e(list)f(of)630
+408 y(exp)s(orted)e(names)h(is)e(displa)m(y)m(ed.)58
+b(The)37 b(`)p Fs(-p)p Ft(')f(option)g(displa)m(ys)f(output)h(in)f(a)i
+(form)f(that)630 518 y(ma)m(y)c(b)s(e)e(reused)g(as)i(input.)41
+b(If)30 b(a)i(v)-5 b(ariable)29 b(name)j(is)e(follo)m(w)m(ed)g(b)m(y)h
+(=)p Fq(v)-5 b(alue)p Ft(,)31 b(the)g(v)-5 b(alue)31
+b(of)630 628 y(the)g(v)-5 b(ariable)29 b(is)g(set)i(to)g
+Fq(v)-5 b(alue)p Ft(.)630 761 y(The)29 b(return)e(status)j(is)e(zero)i
+(unless)d(an)i(in)m(v)-5 b(alid)26 b(option)j(is)f(supplied,)e(one)k
+(of)f(the)g(names)630 870 y(is)g(not)i(a)f(v)-5 b(alid)29
+b(shell)f(v)-5 b(ariable)29 b(name,)h(or)h(`)p Fs(-f)p
+Ft(')f(is)f(supplied)e(with)h(a)j(name)f(that)h(is)e(not)i(a)630
+980 y(shell)e(function.)150 1136 y Fs(getopts)870 1270
+y(getopts)46 b Fj(optstring)56 b(name)h Fs([)p Fj(args)11
+b Fs(])630 1403 y(getopts)28 b Ft(is)h(used)h(b)m(y)g(shell)e(scripts)h
+(to)h(parse)g(p)s(ositional)e(parameters.)41 b Fq(optstring)c
+Ft(con-)630 1512 y(tains)k(the)h(option)e(c)m(haracters)j(to)g(b)s(e)d
+(recognized;)48 b(if)41 b(a)g(c)m(haracter)j(is)c(follo)m(w)m(ed)h(b)m
+(y)h(a)630 1622 y(colon,)32 b(the)g(option)f(is)g(exp)s(ected)h(to)h
+(ha)m(v)m(e)g(an)e(argumen)m(t,)i(whic)m(h)e(should)e(b)s(e)i
+(separated)630 1731 y(from)37 b(it)g(b)m(y)g(white)g(space.)63
+b(The)37 b(colon)g(\(`)p Fs(:)p Ft('\))i(and)d(question)h(mark)g(\(`)p
+Fs(?)p Ft('\))i(ma)m(y)f(not)g(b)s(e)630 1841 y(used)g(as)g(option)g(c)
+m(haracters.)67 b(Eac)m(h)39 b(time)f(it)g(is)f(in)m(v)m(ok)m(ed,)k
+Fs(getopts)c Ft(places)h(the)h(next)630 1951 y(option)28
+b(in)f(the)i(shell)e(v)-5 b(ariable)28 b Fq(name)p Ft(,)h(initializing)
+c Fq(name)34 b Ft(if)27 b(it)h(do)s(es)h(not)g(exist,)g(and)f(the)630
+2060 y(index)k(of)h(the)h(next)f(argumen)m(t)h(to)g(b)s(e)e(pro)s
+(cessed)h(in)m(to)g(the)h(v)-5 b(ariable)32 b Fs(OPTIND)p
+Ft(.)48 b Fs(OPTIND)630 2170 y Ft(is)40 b(initialized)e(to)k(1)f(eac)m
+(h)h(time)f(the)g(shell)e(or)i(a)g(shell)e(script)h(is)g(in)m(v)m(ok)m
+(ed.)73 b(When)41 b(an)630 2279 y(option)35 b(requires)e(an)i(argumen)m
+(t,)i Fs(getopts)c Ft(places)i(that)h(argumen)m(t)g(in)m(to)f(the)g(v)
+-5 b(ariable)630 2389 y Fs(OPTARG)p Ft(.)55 b(The)35
+b(shell)e(do)s(es)j(not)g(reset)g Fs(OPTIND)e Ft(automatically;)k(it)d
+(m)m(ust)g(b)s(e)g(man)m(ually)630 2498 y(reset)i(b)s(et)m(w)m(een)g(m)
+m(ultiple)e(calls)g(to)i Fs(getopts)e Ft(within)f(the)j(same)g(shell)d
+(in)m(v)m(o)s(cation)j(if)f(a)630 2608 y(new)30 b(set)h(of)f
+(parameters)h(is)e(to)j(b)s(e)d(used.)630 2741 y(When)41
+b(the)h(end)e(of)i(options)f(is)f(encoun)m(tered,)45
+b Fs(getopts)39 b Ft(exits)i(with)f(a)i(return)e(v)-5
+b(alue)630 2851 y(greater)32 b(than)e(zero.)41 b Fs(OPTIND)29
+b Ft(is)g(set)i(to)g(the)g(index)e(of)h(the)h(\014rst)f(non-option)f
+(argumen)m(t,)630 2960 y(and)h Fs(name)f Ft(is)g(set)i(to)g(`)p
+Fs(?)p Ft('.)630 3093 y Fs(getopts)c Ft(normally)h(parses)g(the)i(p)s
+(ositional)d(parameters,)j(but)e(if)h(more)g(argumen)m(ts)h(are)630
+3203 y(giv)m(en)g(in)f Fq(args)p Ft(,)i Fs(getopts)e
+Ft(parses)h(those)h(instead.)630 3336 y Fs(getopts)h
+Ft(can)h(rep)s(ort)g(errors)g(in)g(t)m(w)m(o)i(w)m(a)m(ys.)51
+b(If)33 b(the)h(\014rst)e(c)m(haracter)k(of)d Fq(optstring)41
+b Ft(is)33 b(a)630 3446 y(colon,)i Fq(silen)m(t)h Ft(error)d(rep)s
+(orting)g(is)h(used.)51 b(In)33 b(normal)h(op)s(eration)f(diagnostic)h
+(messages)630 3555 y(are)c(prin)m(ted)d(when)h(in)m(v)-5
+b(alid)27 b(options)i(or)g(missing)e(option)h(argumen)m(ts)i(are)f
+(encoun)m(tered.)630 3665 y(If)34 b(the)g(v)-5 b(ariable)33
+b Fs(OPTERR)f Ft(is)h(set)i(to)f(0,)i(no)e(error)g(messages)h(will)c(b)
+s(e)i(displa)m(y)m(ed,)h(ev)m(en)h(if)630 3774 y(the)c(\014rst)e(c)m
+(haracter)j(of)f Fs(optstring)d Ft(is)h(not)i(a)f(colon.)630
+3907 y(If)39 b(an)h(in)m(v)-5 b(alid)38 b(option)h(is)g(seen,)j
+Fs(getopts)c Ft(places)i(`)p Fs(?)p Ft(')g(in)m(to)g
+Fq(name)45 b Ft(and,)d(if)d(not)h(silen)m(t,)630 4017
+y(prin)m(ts)e(an)i(error)f(message)h(and)f(unsets)g Fs(OPTARG)p
+Ft(.)67 b(If)39 b Fs(getopts)f Ft(is)h(silen)m(t,)i(the)e(option)630
+4127 y(c)m(haracter)32 b(found)d(is)g(placed)h(in)f Fs(OPTARG)g
+Ft(and)h(no)g(diagnostic)g(message)h(is)f(prin)m(ted.)630
+4260 y(If)d(a)g(required)e(argumen)m(t)j(is)e(not)h(found,)g(and)f
+Fs(getopts)f Ft(is)h(not)i(silen)m(t,)f(a)g(question)f(mark)630
+4369 y(\(`)p Fs(?)p Ft('\))i(is)f(placed)g(in)f Fq(name)p
+Ft(,)i Fs(OPTARG)e Ft(is)g(unset,)i(and)f(a)g(diagnostic)g(message)i
+(is)d(prin)m(ted.)38 b(If)630 4479 y Fs(getopts)28 b
+Ft(is)g(silen)m(t,)h(then)g(a)h(colon)g(\(`)p Fs(:)p
+Ft('\))g(is)f(placed)g(in)f Fq(name)35 b Ft(and)29 b
+Fs(OPTARG)f Ft(is)g(set)i(to)h(the)630 4589 y(option)f(c)m(haracter)i
+(found.)150 4745 y Fs(hash)870 4878 y(hash)47 b([-'r])f([-p)h
+Fj(filename)11 b Fs(])45 b([-dt])h([)p Fj(name)11 b Fs(])630
+5011 y Ft(Remem)m(b)s(er)36 b(the)g(full)e(pathnames)i(of)g(commands)g
+(sp)s(eci\014ed)f(as)h Fq(name)41 b Ft(argumen)m(ts,)e(so)630
+5121 y(they)34 b(need)h(not)f(b)s(e)g(searc)m(hed)h(for)f(on)g
+(subsequen)m(t)f(in)m(v)m(o)s(cations.)53 b(The)34 b(commands)g(are)630
+5230 y(found)39 b(b)m(y)i(searc)m(hing)f(through)g(the)h(directories)e
+(listed)g(in)g Fs($PATH)p Ft(.)70 b(The)40 b(`)p Fs(-p)p
+Ft(')g(option)630 5340 y(inhibits)35 b(the)k(path)g(searc)m(h,)j(and)c
+Fq(\014lename)43 b Ft(is)38 b(used)g(as)i(the)f(lo)s(cation)f(of)h
+Fq(name)p Ft(.)66 b(The)p eop
+%%Page: 36 42
+36 41 bop 150 -116 a Ft(36)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(`)p Fs(-r)p Ft(')d(option)f(causes)h(the)g(shell)f(to)h(forget)h
+(all)e(remem)m(b)s(ered)g(lo)s(cations.)39 b(The)28 b(`)p
+Fs(-d)p Ft(')f(option)630 408 y(causes)38 b(the)g(shell)e(to)i(forget)g
+(the)g(remem)m(b)s(ered)f(lo)s(cation)g(of)h(eac)m(h)h
+Fq(name)p Ft(.)62 b(If)37 b(the)h(`)p Fs(-t)p Ft(')630
+518 y(option)21 b(is)g(supplied,)f(the)i(full)d(pathname)j(to)g(whic)m
+(h)f(eac)m(h)h Fq(name)27 b Ft(corresp)s(onds)20 b(is)h(prin)m(ted.)630
+628 y(If)33 b(m)m(ultiple)e Fq(name)38 b Ft(argumen)m(ts)c(are)f
+(supplied)d(with)i(`)p Fs(-t)p Ft(')h(the)h Fq(name)k
+Ft(is)33 b(prin)m(ted)e(b)s(efore)630 737 y(the)i(hashed)f(full)e
+(pathname.)48 b(The)32 b(`)p Fs(-l)p Ft(')h(option)f(causes)h(output)f
+(to)i(b)s(e)e(displa)m(y)m(ed)f(in)h(a)630 847 y(format)g(that)g(ma)m
+(y)g(b)s(e)f(reused)g(as)g(input.)42 b(If)31 b(no)h(argumen)m(ts)g(are)
+f(giv)m(en,)i(or)e(if)f(only)h(`)p Fs(-l)p Ft(')630 956
+y(is)j(supplied,)e(information)h(ab)s(out)i(remem)m(b)s(ered)f
+(commands)g(is)g(prin)m(ted.)52 b(The)34 b(return)630
+1066 y(status)d(is)e(zero)i(unless)e(a)i Fq(name)k Ft(is)30
+b(not)g(found)f(or)i(an)f(in)m(v)-5 b(alid)28 b(option)i(is)f
+(supplied.)150 1217 y Fs(pwd)870 1347 y(pwd)47 b([-LP])630
+1477 y Ft(Prin)m(t)23 b(the)i(absolute)f(pathname)h(of)f(the)h(curren)m
+(t)f(w)m(orking)g(directory)-8 b(.)39 b(If)23 b(the)i(`)p
+Fs(-P)p Ft(')f(option)630 1587 y(is)35 b(supplied,)e(the)j(pathname)f
+(prin)m(ted)f(will)f(not)j(con)m(tain)g(sym)m(b)s(olic)e(links.)53
+b(If)35 b(the)h(`)p Fs(-L)p Ft(')630 1696 y(option)43
+b(is)g(supplied,)h(the)g(pathname)f(prin)m(ted)g(ma)m(y)h(con)m(tain)g
+(sym)m(b)s(olic)e(links.)78 b(The)630 1806 y(return)26
+b(status)h(is)g(zero)h(unless)d(an)i(error)g(is)f(encoun)m(tered)h
+(while)f(determining)f(the)i(name)630 1915 y(of)k(the)f(curren)m(t)g
+(directory)g(or)g(an)h(in)m(v)-5 b(alid)28 b(option)i(is)f(supplied.)
+150 2066 y Fs(readonly)870 2196 y(readonly)46 b([-apf])g([)p
+Fj(name)11 b Fs([=)p Fj(value)g Fs(]])43 b(...)630 2326
+y Ft(Mark)24 b(eac)m(h)h Fq(name)k Ft(as)24 b(readonly)-8
+b(.)38 b(The)24 b(v)-5 b(alues)23 b(of)h(these)g(names)g(ma)m(y)g(not)g
+(b)s(e)g(c)m(hanged)g(b)m(y)630 2436 y(subsequen)m(t)e(assignmen)m(t.)
+38 b(If)22 b(the)h(`)p Fs(-f)p Ft(')f(option)h(is)e(supplied,)g(eac)m
+(h)j Fq(name)k Ft(refers)22 b(to)i(a)f(shell)630 2545
+y(function.)51 b(The)34 b(`)p Fs(-a)p Ft(')g(option)g(means)h(eac)m(h)g
+Fq(name)40 b Ft(refers)33 b(to)j(an)e(arra)m(y)h(v)-5
+b(ariable.)51 b(If)34 b(no)630 2655 y Fq(name)d Ft(argumen)m(ts)26
+b(are)g(giv)m(en,)h(or)e(if)g(the)h(`)p Fs(-p)p Ft(')f(option)g(is)g
+(supplied,)e(a)j(list)f(of)g(all)g(readonly)630 2765
+y(names)37 b(is)f(prin)m(ted.)58 b(The)37 b(`)p Fs(-p)p
+Ft(')f(option)h(causes)g(output)g(to)g(b)s(e)f(displa)m(y)m(ed)g(in)f
+(a)j(format)630 2874 y(that)25 b(ma)m(y)g(b)s(e)f(reused)g(as)h(input.)
+37 b(If)24 b(a)h(v)-5 b(ariable)23 b(name)i(is)f(follo)m(w)m(ed)g(b)m
+(y)g(=)p Fq(v)-5 b(alue)p Ft(,)26 b(the)e(v)-5 b(alue)630
+2984 y(of)27 b(the)g(v)-5 b(ariable)25 b(is)h(set)h(to)g
+Fq(v)-5 b(alue)p Ft(.)39 b(The)26 b(return)g(status)h(is)e(zero)j
+(unless)d(an)h(in)m(v)-5 b(alid)24 b(option)630 3093
+y(is)29 b(supplied,)e(one)j(of)g(the)g Fq(name)35 b Ft(argumen)m(ts)30
+b(is)f(not)h(a)g(v)-5 b(alid)29 b(shell)f(v)-5 b(ariable)28
+b(or)i(function)630 3203 y(name,)h(or)f(the)h(`)p Fs(-f)p
+Ft(')f(option)g(is)f(supplied)e(with)i(a)i(name)f(that)h(is)f(not)g(a)h
+(shell)e(function.)150 3354 y Fs(return)870 3484 y(return)46
+b([)p Fj(n)11 b Fs(])630 3614 y Ft(Cause)30 b(a)g(shell)e(function)h
+(to)i(exit)e(with)g(the)h(return)f(v)-5 b(alue)30 b Fq(n)p
+Ft(.)40 b(If)29 b Fq(n)h Ft(is)f(not)h(supplied,)d(the)630
+3724 y(return)35 b(v)-5 b(alue)36 b(is)f(the)h(exit)g(status)g(of)h
+(the)f(last)g(command)g(executed)h(in)e(the)h(function.)630
+3833 y(This)20 b(ma)m(y)j(also)f(b)s(e)f(used)g(to)i(terminate)f
+(execution)g(of)g(a)h(script)e(b)s(eing)f(executed)j(with)e(the)630
+3943 y Fs(.)27 b Ft(\(or)g Fs(source)p Ft(\))f(builtin,)f(returning)g
+(either)h Fq(n)h Ft(or)g(the)g(exit)g(status)h(of)f(the)g(last)g
+(command)630 4052 y(executed)46 b(within)d(the)i(script)f(as)i(the)f
+(exit)g(status)h(of)f(the)h(script.)84 b(An)m(y)45 b(command)630
+4162 y(asso)s(ciated)29 b(with)e(the)h Fs(RETURN)f Ft(trap)h(is)f
+(executed)i(b)s(efore)f(execution)g(resumes)g(after)h(the)630
+4271 y(function)37 b(or)g(script.)62 b(The)38 b(return)e(status)i(is)f
+(non-zero)i(if)d Fs(return)h Ft(is)f(used)h(outside)h(a)630
+4381 y(function)29 b(and)h(not)g(during)f(the)h(execution)h(of)f(a)h
+(script)e(b)m(y)i Fs(.)f Ft(or)g Fs(source)p Ft(.)150
+4532 y Fs(shift)870 4662 y(shift)46 b([)p Fj(n)11 b Fs(])630
+4792 y Ft(Shift)40 b(the)h(p)s(ositional)e(parameters)j(to)g(the)f
+(left)g(b)m(y)h Fq(n)p Ft(.)73 b(The)40 b(p)s(ositional)g(parameters)
+630 4902 y(from)27 b Fq(n)p Fs(+)p Ft(1)33 b(.)22 b(.)g(.)39
+b Fs($#)27 b Ft(are)g(renamed)g(to)i Fs($1)j Ft(.)22
+b(.)h(.)38 b Fs($#)p Ft(-)p Fq(n)p Fs(+)p Ft(1.)h(P)m(arameters)29
+b(represen)m(ted)e(b)m(y)h(the)630 5011 y(n)m(um)m(b)s(ers)34
+b Fs($#)h Ft(to)h Fq(n)p Fs(+)p Ft(1)f(are)g(unset.)55
+b Fq(n)35 b Ft(m)m(ust)g(b)s(e)g(a)h(non-negativ)m(e)g(n)m(um)m(b)s(er)
+e(less)h(than)g(or)630 5121 y(equal)d(to)i Fs($#)p Ft(.)47
+b(If)33 b Fq(n)f Ft(is)g(zero)h(or)g(greater)h(than)f
+Fs($#)p Ft(,)g(the)g(p)s(ositional)d(parameters)j(are)h(not)630
+5230 y(c)m(hanged.)48 b(If)32 b Fq(n)g Ft(is)g(not)g(supplied,)f(it)h
+(is)f(assumed)h(to)h(b)s(e)f(1.)48 b(The)32 b(return)g(status)h(is)e
+(zero)630 5340 y(unless)e Fq(n)g Ft(is)h(greater)h(than)g
+Fs($#)e Ft(or)i(less)e(than)i(zero,)g(non-zero)g(otherwise.)p
+eop
+%%Page: 37 43
+37 42 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(37)150 299 y Fs(test)150
+408 y([)432 b Ft(Ev)-5 b(aluate)31 b(a)g(conditional)e(expression)g
+Fq(expr)p Ft(.)41 b(Eac)m(h)31 b(op)s(erator)g(and)f(op)s(erand)g(m)m
+(ust)h(b)s(e)f(a)630 518 y(separate)d(argumen)m(t.)40
+b(Expressions)24 b(are)j(comp)s(osed)e(of)i(the)f(primaries)e(describ)s
+(ed)g(b)s(elo)m(w)630 628 y(in)29 b(Section)h(6.4)i([Bash)e
+(Conditional)e(Expressions],)h(page)j(69.)630 762 y(When)e(the)h
+Fs([)f Ft(form)g(is)f(used,)h(the)g(last)h(argumen)m(t)f(to)i(the)e
+(command)g(m)m(ust)h(b)s(e)e(a)i Fs(])p Ft(.)630 897
+y(Expressions)22 b(ma)m(y)i(b)s(e)e(com)m(bined)h(using)f(the)i(follo)m
+(wing)e(op)s(erators,)j(listed)d(in)g(decreasing)630
+1006 y(order)30 b(of)g(precedence.)630 1166 y Fs(!)g
+Fj(expr)210 b Ft(T)-8 b(rue)30 b(if)f Fq(expr)37 b Ft(is)29
+b(false.)630 1325 y Fs(\()h Fj(expr)40 b Fs(\))122 b
+Ft(Returns)23 b(the)i(v)-5 b(alue)24 b(of)g Fq(expr)p
+Ft(.)38 b(This)23 b(ma)m(y)i(b)s(e)e(used)h(to)h(o)m(v)m(erride)f(the)h
+(normal)1110 1435 y(precedence)31 b(of)f(op)s(erators.)630
+1594 y Fj(expr1)39 b Fs(-a)30 b Fj(expr2)1110 1704 y
+Ft(T)-8 b(rue)30 b(if)f(b)s(oth)h Fq(expr1)37 b Ft(and)30
+b Fq(expr2)38 b Ft(are)30 b(true.)630 1863 y Fj(expr1)39
+b Fs(-o)30 b Fj(expr2)1110 1973 y Ft(T)-8 b(rue)30 b(if)f(either)h
+Fq(expr1)38 b Ft(or)30 b Fq(expr2)37 b Ft(is)30 b(true.)630
+2132 y(The)37 b Fs(test)f Ft(and)g Fs([)h Ft(builtins)d(ev)-5
+b(aluate)38 b(conditional)d(expressions)h(using)g(a)h(set)h(of)f(rules)
+630 2242 y(based)30 b(on)g(the)h(n)m(um)m(b)s(er)e(of)h(argumen)m(ts.)
+630 2401 y(0)h(argumen)m(ts)1110 2511 y(The)f(expression)f(is)g(false.)
+630 2670 y(1)i(argumen)m(t)1110 2780 y(The)f(expression)f(is)g(true)i
+(if)e(and)h(only)f(if)h(the)g(argumen)m(t)h(is)e(not)i(n)m(ull.)630
+2939 y(2)g(argumen)m(ts)1110 3049 y(If)f(the)h(\014rst)f(argumen)m(t)h
+(is)f(`)p Fs(!)p Ft(',)h(the)g(expression)f(is)g(true)g(if)g(and)g
+(only)g(if)g(the)1110 3158 y(second)k(argumen)m(t)f(is)g(n)m(ull.)48
+b(If)33 b(the)h(\014rst)e(argumen)m(t)i(is)f(one)h(of)f(the)h(unary)
+1110 3268 y(conditional)39 b(op)s(erators)i(\(see)g(Section)g(6.4)g
+([Bash)g(Conditional)d(Expres-)1110 3377 y(sions],)33
+b(page)g(69\),)i(the)e(expression)e(is)h(true)h(if)f(the)h(unary)e
+(test)j(is)e(true.)47 b(If)1110 3487 y(the)33 b(\014rst)g(argumen)m(t)h
+(is)e(not)h(a)h(v)-5 b(alid)32 b(unary)g(op)s(erator,)i(the)g
+(expression)e(is)1110 3597 y(false.)630 3756 y(3)f(argumen)m(ts)1110
+3866 y(If)k(the)g(second)g(argumen)m(t)g(is)f(one)i(of)f(the)g(binary)e
+(conditional)h(op)s(erators)1110 3975 y(\(see)23 b(Section)f(6.4)g
+([Bash)h(Conditional)c(Expressions],)j(page)h(69\),)i(the)d(result)1110
+4085 y(of)44 b(the)h(expression)e(is)g(the)h(result)f(of)i(the)f
+(binary)f(test)i(using)d(the)j(\014rst)1110 4194 y(and)33
+b(third)f(argumen)m(ts)i(as)g(op)s(erands.)50 b(If)33
+b(the)h(\014rst)g(argumen)m(t)g(is)f(`)p Fs(!)p Ft(',)i(the)1110
+4304 y(v)-5 b(alue)24 b(is)g(the)h(negation)g(of)g(the)g(t)m(w)m
+(o-argumen)m(t)i(test)f(using)d(the)i(second)g(and)1110
+4413 y(third)31 b(argumen)m(ts.)47 b(If)33 b(the)f(\014rst)g(argumen)m
+(t)h(is)f(exactly)h(`)p Fs(\()p Ft(')g(and)f(the)h(third)1110
+4523 y(argumen)m(t)h(is)f(exactly)h(`)p Fs(\))p Ft(',)h(the)f(result)e
+(is)h(the)h(one-argumen)m(t)g(test)h(of)f(the)1110 4633
+y(second)d(argumen)m(t.)45 b(Otherwise,)30 b(the)i(expression)e(is)g
+(false.)43 b(The)31 b(`)p Fs(-a)p Ft(')h(and)1110 4742
+y(`)p Fs(-o)p Ft(')e(op)s(erators)h(are)g(considered)e(binary)f(op)s
+(erators)j(in)e(this)g(case.)630 4902 y(4)i(argumen)m(ts)1110
+5011 y(If)h(the)i(\014rst)e(argumen)m(t)h(is)f(`)p Fs(!)p
+Ft(',)i(the)f(result)f(is)g(the)h(negation)g(of)g(the)g(three-)1110
+5121 y(argumen)m(t)h(expression)e(comp)s(osed)i(of)f(the)h(remaining)e
+(argumen)m(ts.)50 b(Oth-)1110 5230 y(erwise,)33 b(the)g(expression)f
+(is)g(parsed)h(and)f(ev)-5 b(aluated)33 b(according)h(to)f(prece-)1110
+5340 y(dence)e(using)d(the)j(rules)e(listed)g(ab)s(o)m(v)m(e.)p
+eop
+%%Page: 38 44
+38 43 bop 150 -116 a Ft(38)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(5)g(or)f(more)h(argumen)m(ts)1110 408 y(The)43
+b(expression)e(is)i(parsed)f(and)g(ev)-5 b(aluated)44
+b(according)f(to)g(precedence)1110 518 y(using)29 b(the)h(rules)f
+(listed)g(ab)s(o)m(v)m(e.)150 671 y Fs(times)870 803
+y(times)630 934 y Ft(Prin)m(t)36 b(out)i(the)g(user)e(and)h(system)g
+(times)g(used)g(b)m(y)g(the)h(shell)d(and)i(its)g(c)m(hildren.)59
+b(The)630 1044 y(return)29 b(status)i(is)e(zero.)150
+1198 y Fs(trap)870 1329 y(trap)47 b([-lp])f([)p Fj(arg)11
+b Fs(])46 b([)p Fj(sigspec)56 b Fs(...)o(])630 1461 y
+Ft(The)43 b(commands)f(in)g Fq(arg)51 b Ft(are)44 b(to)g(b)s(e)e(read)h
+(and)g(executed)h(when)e(the)h(shell)e(receiv)m(es)630
+1570 y(signal)31 b Fq(sigsp)s(ec)p Ft(.)46 b(If)32 b
+Fq(arg)40 b Ft(is)32 b(absen)m(t)g(or)h(equal)f(to)h(`)p
+Fs(-)p Ft(',)g(all)e(sp)s(eci\014ed)g(signals)g(are)h(reset)h(to)630
+1680 y(the)g(v)-5 b(alues)33 b(they)g(had)g(when)f(the)h(shell)f(w)m
+(as)h(started.)50 b(If)32 b Fq(arg)42 b Ft(is)32 b(the)h(n)m(ull)e
+(string,)i(then)630 1789 y(the)38 b(signal)g(sp)s(eci\014ed)e(b)m(y)i
+(eac)m(h)i Fq(sigsp)s(ec)j Ft(is)37 b(ignored)h(b)m(y)g(the)g(shell)f
+(and)g(commands)h(it)630 1899 y(in)m(v)m(ok)m(es.)j(If)30
+b Fq(arg)38 b Ft(is)29 b(not)h(presen)m(t)g(and)g(`)p
+Fs(-p)p Ft(')f(has)h(b)s(een)f(supplied,)e(the)k(shell)d(displa)m(ys)g
+(the)630 2008 y(trap)j(commands)g(asso)s(ciated)g(with)f(eac)m(h)i
+Fq(sigsp)s(ec)p Ft(.)42 b(If)31 b(no)g(argumen)m(ts)g(are)h(supplied,)c
+(or)630 2118 y(only)f(`)p Fs(-p)p Ft(')i(is)e(giv)m(en,)i
+Fs(trap)e Ft(prin)m(ts)g(the)i(list)d(of)j(commands)f(asso)s(ciated)h
+(with)e(eac)m(h)i(signal)630 2228 y(n)m(um)m(b)s(er)c(in)g(a)i(form)f
+(that)h(ma)m(y)g(b)s(e)f(reused)f(as)i(shell)d(input.)38
+b(The)26 b(`)p Fs(-l)p Ft(')g(option)g(causes)h(the)630
+2337 y(shell)i(to)i(prin)m(t)e(a)h(list)f(of)i(signal)e(names)h(and)g
+(their)g(corresp)s(onding)e(n)m(um)m(b)s(ers.)630 2469
+y(Eac)m(h)33 b Fq(sigsp)s(ec)38 b Ft(is)31 b(either)h(a)h(signal)f
+(name)g(suc)m(h)g(as)h Fs(SIGINT)e Ft(\(with)h(or)g(without)g(the)h
+Fs(SIG)630 2578 y Ft(pre\014x\))40 b(or)g(a)h(signal)e(n)m(um)m(b)s
+(er.)69 b(If)40 b(a)h Fq(sigsp)s(ec)k Ft(is)39 b Fs(0)h
+Ft(or)h Fs(EXIT)p Ft(,)h Fq(arg)48 b Ft(is)40 b(executed)h(when)630
+2688 y(the)i(shell)f(exits.)79 b(If)42 b(a)i Fq(sigsp)s(ec)k
+Ft(is)42 b Fs(DEBUG)p Ft(,)j(the)f(command)f Fq(arg)51
+b Ft(is)42 b(executed)i(b)s(efore)630 2798 y(ev)m(ery)21
+b(simple)d(command,)23 b Fs(for)c Ft(command,)k Fs(case)c
+Ft(command,)j Fs(select)d Ft(command,)j(ev)m(ery)630
+2907 y(arithmetic)42 b Fs(for)g Ft(command,)k(and)c(b)s(efore)g(the)h
+(\014rst)f(command)g(executes)i(in)e(a)h(shell)630 3017
+y(function.)50 b(Refer)33 b(to)i(the)f(description)e(of)i(the)g
+Fs(extglob)d Ft(option)j(to)g(the)g Fs(shopt)e Ft(builtin)630
+3126 y(\(see)i(Section)f(4.2)h([Bash)g(Builtins],)e(page)i(39\))g(for)f
+(details)f(of)i(its)e(e\013ect)j(on)e(the)g Fs(DEBUG)630
+3236 y Ft(trap.)77 b(If)43 b(a)g Fq(sigsp)s(ec)k Ft(is)42
+b Fs(ERR)p Ft(,)j(the)e(command)f Fq(arg)51 b Ft(is)42
+b(executed)h(whenev)m(er)g(a)g(simple)630 3345 y(command)33
+b(has)f(a)h(non-zero)g(exit)g(status,)h(sub)5 b(ject)33
+b(to)g(the)g(follo)m(wing)e(conditions.)46 b(The)630
+3455 y Fs(ERR)39 b Ft(trap)h(is)f(not)i(executed)g(if)e(the)h(failed)f
+(command)h(is)f(part)h(of)g(the)g(command)g(list)630
+3565 y(immediately)c(follo)m(wing)g(an)i Fs(until)e Ft(or)i
+Fs(while)e Ft(k)m(eyw)m(ord,)k(part)d(of)h(the)g(test)h(in)d(an)i
+Fs(if)630 3674 y Ft(statemen)m(t,)h(part)c(of)g(a)h Fs(&&)f
+Ft(or)g Fs(||)g Ft(list,)g(or)g(if)g(the)g(command's)g(return)f(status)
+i(is)e(b)s(eing)630 3784 y(in)m(v)m(erted)26 b(using)f
+Fs(!)p Ft(.)39 b(These)26 b(are)g(the)h(same)f(conditions)f(ob)s(ey)m
+(ed)h(b)m(y)h(the)f Fs(errexit)e Ft(option.)630 3893
+y(If)29 b(a)g Fq(sigsp)s(ec)34 b Ft(is)29 b Fs(RETURN)p
+Ft(,)f(the)h(command)g Fq(arg)37 b Ft(is)29 b(executed)h(eac)m(h)g
+(time)f(a)h(shell)d(function)630 4003 y(or)j(a)h(script)e(executed)j
+(with)d(the)h Fs(.)g Ft(or)h Fs(source)d Ft(builtins)f(\014nishes)h
+(executing.)630 4134 y(Signals)35 b(ignored)g(up)s(on)g(en)m(try)i(to)g
+(the)f(shell)f(cannot)i(b)s(e)f(trapp)s(ed)f(or)h(reset.)59
+b(T)-8 b(rapp)s(ed)630 4244 y(signals)29 b(are)i(reset)g(to)g(their)e
+(original)g(v)-5 b(alues)29 b(in)g(a)i(c)m(hild)e(pro)s(cess)h(when)f
+(it)h(is)g(created.)630 4376 y(The)g(return)f(status)i(is)e(zero)i
+(unless)e(a)i Fq(sigsp)s(ec)k Ft(do)s(es)30 b(not)h(sp)s(ecify)e(a)h(v)
+-5 b(alid)29 b(signal.)150 4529 y Fs(umask)870 4661 y(umask)46
+b([-p])h([-S])g([)p Fj(mode)11 b Fs(])630 4792 y Ft(Set)30
+b(the)f(shell)f(pro)s(cess's)h(\014le)g(creation)g(mask)h(to)g
+Fq(mo)s(de)p Ft(.)40 b(If)29 b Fq(mo)s(de)34 b Ft(b)s(egins)28
+b(with)g(a)i(digit,)630 4902 y(it)d(is)f(in)m(terpreted)g(as)h(an)g(o)s
+(ctal)h(n)m(um)m(b)s(er;)f(if)f(not,)i(it)f(is)f(in)m(terpreted)g(as)h
+(a)h(sym)m(b)s(olic)d(mo)s(de)630 5011 y(mask)k(similar)d(to)j(that)h
+(accepted)g(b)m(y)f(the)g Fs(chmod)e Ft(command.)40 b(If)28
+b Fq(mo)s(de)34 b Ft(is)27 b(omitted,)j(the)630 5121
+y(curren)m(t)36 b(v)-5 b(alue)35 b(of)h(the)h(mask)f(is)f(prin)m(ted.)
+56 b(If)35 b(the)h(`)p Fs(-S)p Ft(')g(option)g(is)f(supplied)e(without)
+i(a)630 5230 y Fq(mo)s(de)40 b Ft(argumen)m(t,)d(the)e(mask)g(is)f
+(prin)m(ted)g(in)g(a)i(sym)m(b)s(olic)d(format.)55 b(If)35
+b(the)g(`)p Fs(-p)p Ft(')g(option)630 5340 y(is)e(supplied,)e(and)i
+Fq(mo)s(de)38 b Ft(is)32 b(omitted,)j(the)f(output)f(is)f(in)h(a)h
+(form)f(that)h(ma)m(y)g(b)s(e)f(reused)p eop
+%%Page: 39 45
+39 44 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(39)630 299 y(as)31 b(input.)40
+b(The)31 b(return)f(status)h(is)f(zero)i(if)d(the)i(mo)s(de)g(is)f
+(successfully)f(c)m(hanged)i(or)g(if)f(no)630 408 y Fq(mo)s(de)35
+b Ft(argumen)m(t)c(is)e(supplied,)f(and)h(non-zero)i(otherwise.)630
+537 y(Note)38 b(that)e(when)g(the)g(mo)s(de)g(is)f(in)m(terpreted)h(as)
+g(an)g(o)s(ctal)h(n)m(um)m(b)s(er,)f(eac)m(h)i(n)m(um)m(b)s(er)d(of)630
+647 y(the)f(umask)g(is)g(subtracted)g(from)f Fs(7)p Ft(.)53
+b(Th)m(us,)34 b(a)h(umask)e(of)i Fs(022)e Ft(results)g(in)g(p)s
+(ermissions)630 756 y(of)e Fs(755)p Ft(.)150 905 y Fs(unset)870
+1033 y(unset)46 b([-fv])h([)p Fj(name)11 b Fs(])630 1162
+y Ft(Eac)m(h)34 b(v)-5 b(ariable)31 b(or)i(function)f
+Fq(name)38 b Ft(is)32 b(remo)m(v)m(ed.)50 b(If)32 b(no)h(options)g(are)
+g(supplied,)e(or)i(the)630 1272 y(`)p Fs(-v)p Ft(')h(option)g(is)g(giv)
+m(en,)h(eac)m(h)h Fq(name)k Ft(refers)34 b(to)h(a)g(shell)d(v)-5
+b(ariable.)52 b(If)34 b(the)h(`)p Fs(-f)p Ft(')f(option)g(is)630
+1381 y(giv)m(en,)26 b(the)e Fq(name)5 b Ft(s)25 b(refer)f(to)h(shell)e
+(functions,)h(and)g(the)g(function)f(de\014nition)f(is)i(remo)m(v)m
+(ed.)630 1491 y(Readonly)31 b(v)-5 b(ariables)31 b(and)h(functions)e
+(ma)m(y)j(not)f(b)s(e)g(unset.)45 b(The)32 b(return)f(status)h(is)f
+(zero)630 1600 y(unless)e(a)h Fq(name)36 b Ft(is)29 b(readonly)-8
+b(.)150 1841 y Fr(4.2)68 b(Bash)45 b(Builtin)g(Commands)275
+2079 y Ft(This)29 b(section)j(describ)s(es)e(builtin)f(commands)i(whic)
+m(h)f(are)j(unique)c(to)k(or)f(ha)m(v)m(e)h(b)s(een)e(extended)g(in)150
+2189 y(Bash.)41 b(Some)30 b(of)h(these)g(commands)f(are)g(sp)s
+(eci\014ed)f(in)g(the)i Fl(posix)e Ft(1003.2)k(standard.)150
+2337 y Fs(alias)870 2466 y(alias)46 b([-p])h([)p Fj(name)11
+b Fs([=)p Fj(value)g Fs(])43 b(...)o(])630 2594 y Ft(Without)g(argumen)
+m(ts)g(or)g(with)f(the)i(`)p Fs(-p)p Ft(')f(option,)j
+Fs(alias)41 b Ft(prin)m(ts)h(the)h(list)f(of)h(aliases)630
+2704 y(on)36 b(the)g(standard)f(output)h(in)e(a)j(form)e(that)i(allo)m
+(ws)e(them)h(to)g(b)s(e)g(reused)f(as)h(input.)55 b(If)630
+2814 y(argumen)m(ts)29 b(are)g(supplied,)d(an)j(alias)f(is)g(de\014ned)
+f(for)i(eac)m(h)h Fq(name)k Ft(whose)28 b Fq(v)-5 b(alue)34
+b Ft(is)28 b(giv)m(en.)630 2923 y(If)39 b(no)h Fq(v)-5
+b(alue)44 b Ft(is)39 b(giv)m(en,)j(the)e(name)f(and)g(v)-5
+b(alue)39 b(of)h(the)g(alias)f(is)g(prin)m(ted.)67 b(Aliases)39
+b(are)630 3033 y(describ)s(ed)28 b(in)h(Section)i(6.6)g([Aliases],)f
+(page)h(71.)150 3181 y Fs(bind)870 3310 y(bind)47 b([-m)g
+Fj(keymap)11 b Fs(])45 b([-lpsvPSV])870 3419 y(bind)i([-m)g
+Fj(keymap)11 b Fs(])45 b([-q)i Fj(function)11 b Fs(])45
+b([-u)h Fj(function)11 b Fs(])45 b([-r)i Fj(keyseq)11
+b Fs(])870 3529 y(bind)47 b([-m)g Fj(keymap)11 b Fs(])45
+b(-f)i Fj(filename)870 3638 y Fs(bind)g([-m)g Fj(keymap)11
+b Fs(])45 b(-x)i Fj(keyseq:shell-command)870 3748 y Fs(bind)g([-m)g
+Fj(keymap)11 b Fs(])45 b Fj(keyseq:function-name)870
+3858 y Fs(bind)i Fj(readline-command)630 3986 y Ft(Displa)m(y)24
+b(curren)m(t)h(Readline)f(\(see)i(Chapter)f(8)g([Command)g(Line)f
+(Editing],)h(page)h(83\))g(k)m(ey)630 4096 y(and)36 b(function)f
+(bindings,)h(bind)e(a)j(k)m(ey)g(sequence)g(to)h(a)f(Readline)e
+(function)g(or)i(macro,)630 4206 y(or)44 b(set)h(a)g(Readline)d(v)-5
+b(ariable.)81 b(Eac)m(h)45 b(non-option)f(argumen)m(t)g(is)f(a)i
+(command)f(as)g(it)630 4315 y(w)m(ould)34 b(app)s(ear)g(in)f(a)j(a)f
+(Readline)e(initialization)f(\014le)i(\(see)i(Section)e(8.3)i
+([Readline)e(Init)630 4425 y(File],)41 b(page)e(86\),)k(but)38
+b(eac)m(h)i(binding)c(or)j(command)g(m)m(ust)g(b)s(e)f(passed)g(as)i(a)
+f(separate)630 4534 y(argumen)m(t;)d(e.g.,)f(`)p Fs
+("\\C-x\\C-r":re-read-init-fi)o(le)p Ft('.)43 b(Options,)33
+b(if)g(supplied,)e(ha)m(v)m(e)630 4644 y(the)g(follo)m(wing)d
+(meanings:)630 4792 y Fs(-m)i Fj(keymap)1110 4902 y Ft(Use)54
+b Fq(k)m(eymap)j Ft(as)d(the)g(k)m(eymap)g(to)h(b)s(e)e(a\013ected)i(b)
+m(y)f(the)g(subsequen)m(t)1110 5011 y(bindings.)44 b(Acceptable)33
+b Fq(k)m(eymap)j Ft(names)c(are)h Fs(emacs)p Ft(,)f Fs(emacs-standard)p
+Ft(,)1110 5121 y Fs(emacs-meta)p Ft(,)99 b Fs(emacs-ctlx)p
+Ft(,)f Fs(vi)p Ft(,)j Fs(vi-move)p Ft(,)f Fs(vi-command)p
+Ft(,)f(and)1110 5230 y Fs(vi-insert)p Ft(.)64 b Fs(vi)38
+b Ft(is)g(equiv)-5 b(alen)m(t)39 b(to)g Fs(vi-command)p
+Ft(;)i Fs(emacs)c Ft(is)h(equiv)-5 b(alen)m(t)1110 5340
+y(to)31 b Fs(emacs-standard)p Ft(.)p eop
+%%Page: 40 46
+40 45 bop 150 -116 a Ft(40)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y Fs(-l)384 b Ft(List)30 b(the)g(names)g(of)h(all)e(Readline)g
+(functions.)630 454 y Fs(-p)384 b Ft(Displa)m(y)32 b(Readline)f
+(function)h(names)h(and)f(bindings)d(in)j(suc)m(h)g(a)i(w)m(a)m(y)f
+(that)1110 563 y(they)e(can)f(b)s(e)g(used)g(as)g(input)f(or)h(in)f(a)i
+(Readline)e(initialization)e(\014le.)630 718 y Fs(-P)384
+b Ft(List)30 b(curren)m(t)g(Readline)f(function)g(names)h(and)g
+(bindings.)630 873 y Fs(-v)384 b Ft(Displa)m(y)23 b(Readline)f(v)-5
+b(ariable)23 b(names)h(and)f(v)-5 b(alues)23 b(in)g(suc)m(h)g(a)i(w)m
+(a)m(y)f(that)h(they)1110 982 y(can)31 b(b)s(e)e(used)h(as)h(input)d
+(or)i(in)f(a)i(Readline)e(initialization)f(\014le.)630
+1137 y Fs(-V)384 b Ft(List)30 b(curren)m(t)g(Readline)f(v)-5
+b(ariable)29 b(names)h(and)g(v)-5 b(alues.)630 1292 y
+Fs(-s)384 b Ft(Displa)m(y)37 b(Readline)f(k)m(ey)i(sequences)f(b)s
+(ound)f(to)i(macros)g(and)f(the)g(strings)1110 1401 y(they)d(output)f
+(in)g(suc)m(h)g(a)h(w)m(a)m(y)h(that)f(they)g(can)g(b)s(e)f(used)g(as)h
+(input)d(or)j(in)f(a)1110 1511 y(Readline)c(initialization)e(\014le.)
+630 1666 y Fs(-S)384 b Ft(Displa)m(y)37 b(Readline)f(k)m(ey)i
+(sequences)f(b)s(ound)f(to)i(macros)g(and)f(the)g(strings)1110
+1775 y(they)31 b(output.)630 1930 y Fs(-f)f Fj(filename)1110
+2039 y Ft(Read)h(k)m(ey)g(bindings)c(from)j Fq(\014lename)p
+Ft(.)630 2194 y Fs(-q)g Fj(function)1110 2304 y Ft(Query)g(ab)s(out)g
+(whic)m(h)f(k)m(eys)i(in)m(v)m(ok)m(e)g(the)g(named)f
+Fq(function)p Ft(.)630 2458 y Fs(-u)g Fj(function)1110
+2568 y Ft(Un)m(bind)e(all)h(k)m(eys)i(b)s(ound)e(to)i(the)f(named)g
+Fq(function)p Ft(.)630 2723 y Fs(-r)g Fj(keyseq)1110
+2832 y Ft(Remo)m(v)m(e)i(an)m(y)f(curren)m(t)f(binding)d(for)j
+Fq(k)m(eyseq)p Ft(.)630 2987 y Fs(-x)g Fj(keyseq:shell-command)1110
+3097 y Ft(Cause)g Fq(shell-command)i Ft(to)g(b)s(e)d(executed)j(whenev)
+m(er)e Fq(k)m(eyseq)j Ft(is)d(en)m(tered.)630 3251 y(The)c(return)f
+(status)i(is)e(zero)j(unless)c(an)j(in)m(v)-5 b(alid)24
+b(option)i(is)f(supplied)e(or)k(an)f(error)g(o)s(ccurs.)150
+3406 y Fs(builtin)870 3538 y(builtin)46 b([)p Fj(shell-builtin)54
+b Fs([)p Fj(args)11 b Fs(]])630 3670 y Ft(Run)35 b(a)i(shell)d
+(builtin,)h(passing)g(it)h Fq(args)p Ft(,)i(and)e(return)f(its)h(exit)g
+(status.)59 b(This)34 b(is)i(useful)630 3780 y(when)29
+b(de\014ning)g(a)h(shell)f(function)g(with)g(the)h(same)h(name)f(as)h
+(a)g(shell)d(builtin,)f(retaining)630 3890 y(the)34 b(functionalit)m(y)
+e(of)i(the)f(builtin)d(within)h(the)j(function.)49 b(The)33
+b(return)g(status)h(is)e(non-)630 3999 y(zero)f(if)f
+Fq(shell-builtin)25 b Ft(is)k(not)i(a)g(shell)d(builtin)f(command.)150
+4154 y Fs(caller)870 4286 y(caller)46 b([)p Fj(expr)11
+b Fs(])630 4418 y Ft(Returns)34 b(the)g(con)m(text)j(of)e(an)m(y)g
+(activ)m(e)h(subroutine)c(call)i(\(a)h(shell)e(function)g(or)i(a)g
+(script)630 4528 y(executed)c(with)e(the)i Fs(.)f Ft(or)g
+Fs(source)f Ft(builtins\).)630 4660 y(Without)44 b Fq(expr)p
+Ft(,)k Fs(caller)43 b Ft(displa)m(ys)g(the)h(line)f(n)m(um)m(b)s(er)h
+(and)g(source)g(\014lename)g(of)h(the)630 4769 y(curren)m(t)35
+b(subroutine)f(call.)56 b(If)35 b(a)h(non-negativ)m(e)h(in)m(teger)f
+(is)f(supplied)d(as)k Fq(expr)p Ft(,)h Fs(caller)630
+4879 y Ft(displa)m(ys)i(the)h(line)f(n)m(um)m(b)s(er,)j(subroutine)c
+(name,)44 b(and)c(source)g(\014le)g(corresp)s(onding)e(to)630
+4989 y(that)d(p)s(osition)e(in)g(the)i(curren)m(t)f(execution)h(call)f
+(stac)m(k.)54 b(This)33 b(extra)i(information)e(ma)m(y)630
+5098 y(b)s(e)d(used,)g(for)g(example,)g(to)h(prin)m(t)e(a)i(stac)m(k)h
+(trace.)42 b(The)29 b(curren)m(t)i(frame)f(is)f(frame)i(0.)630
+5230 y(The)e(return)f(v)-5 b(alue)28 b(is)h(0)g(unless)f(the)h(shell)e
+(is)i(not)g(executing)g(a)h(subroutine)d(call)h(or)i
+Fq(expr)630 5340 y Ft(do)s(es)g(not)h(corresp)s(ond)e(to)i(a)g(v)-5
+b(alid)28 b(p)s(osition)h(in)g(the)h(call)g(stac)m(k.)p
+eop
+%%Page: 41 47
+41 46 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(41)150 299 y Fs(command)870
+433 y(command)46 b([-pVv])g Fj(command)56 b Fs([)p Fj(arguments)g
+Fs(...)o(])630 568 y Ft(Runs)32 b Fq(command)k Ft(with)c
+Fq(argumen)m(ts)37 b Ft(ignoring)31 b(an)m(y)i(shell)f(function)f
+(named)i Fq(command)p Ft(.)630 677 y(Only)38 b(shell)h(builtin)d
+(commands)k(or)g(commands)f(found)g(b)m(y)h(searc)m(hing)g(the)g
+Fs(PATH)f Ft(are)630 787 y(executed.)g(If)23 b(there)h(is)e(a)i(shell)d
+(function)h(named)h Fs(ls)p Ft(,)i(running)20 b(`)p Fs(command)29
+b(ls)p Ft(')23 b(within)e(the)630 897 y(function)32 b(will)e(execute)35
+b(the)f(external)f(command)g Fs(ls)f Ft(instead)h(of)g(calling)f(the)h
+(function)630 1006 y(recursiv)m(ely)-8 b(.)82 b(The)44
+b(`)p Fs(-p)p Ft(')h(option)f(means)g(to)h(use)g(a)f(default)g(v)-5
+b(alue)44 b(for)g Fs(PATH)g Ft(that)h(is)630 1116 y(guaran)m(teed)35
+b(to)f(\014nd)e(all)h(of)h(the)g(standard)f(utilities.)48
+b(The)33 b(return)g(status)h(in)e(this)h(case)630 1225
+y(is)28 b(127)h(if)f Fq(command)k Ft(cannot)d(b)s(e)e(found)h(or)g(an)g
+(error)h(o)s(ccurred,)f(and)g(the)h(exit)f(status)h(of)630
+1335 y Fq(command)34 b Ft(otherwise.)630 1469 y(If)25
+b(either)f(the)i(`)p Fs(-V)p Ft(')f(or)g(`)p Fs(-v)p
+Ft(')g(option)f(is)g(supplied,)g(a)h(description)e(of)j
+Fq(command)i Ft(is)c(prin)m(ted.)630 1579 y(The)j(`)p
+Fs(-v)p Ft(')h(option)g(causes)g(a)h(single)d(w)m(ord)i(indicating)e
+(the)i(command)g(or)g(\014le)f(name)h(used)630 1689 y(to)36
+b(in)m(v)m(ok)m(e)f Fq(command)k Ft(to)c(b)s(e)g(displa)m(y)m(ed;)h
+(the)f(`)p Fs(-V)p Ft(')g(option)f(pro)s(duces)f(a)j(more)f(v)m(erb)s
+(ose)630 1798 y(description.)59 b(In)36 b(this)g(case,)k(the)e(return)e
+(status)h(is)f(zero)i(if)e Fq(command)41 b Ft(is)36 b(found,)i(and)630
+1908 y(non-zero)31 b(if)e(not.)150 2067 y Fs(declare)870
+2202 y(declare)46 b([-afFirtx])f([-p])h([)p Fj(name)11
+b Fs([=)p Fj(value)g Fs(])44 b(...)o(])630 2336 y Ft(Declare)28
+b(v)-5 b(ariables)26 b(and)g(giv)m(e)i(them)f(attributes.)39
+b(If)27 b(no)g Fq(name)5 b Ft(s)27 b(are)h(giv)m(en,)g(then)f(displa)m
+(y)630 2446 y(the)k(v)-5 b(alues)29 b(of)i(v)-5 b(ariables)29
+b(instead.)630 2580 y(The)f(`)p Fs(-p)p Ft(')g(option)f(will)f(displa)m
+(y)g(the)j(attributes)e(and)h(v)-5 b(alues)27 b(of)i(eac)m(h)g
+Fq(name)p Ft(.)40 b(When)28 b(`)p Fs(-p)p Ft(')630 2690
+y(is)j(used,)h(additional)e(options)h(are)i(ignored.)45
+b(The)31 b(`)p Fs(-F)p Ft(')h(option)g(inhibits)c(the)k(displa)m(y)f
+(of)630 2800 y(function)g(de\014nitions;)g(only)h(the)g(function)f
+(name)i(and)f(attributes)g(are)g(prin)m(ted.)46 b(If)32
+b(the)630 2909 y Fs(extdebug)e Ft(shell)h(option)h(is)g(enabled)f
+(using)g Fs(shopt)h Ft(\(see)h(Section)f(4.2)i([Bash)f(Builtins],)630
+3019 y(page)k(39\),)h(the)e(source)g(\014le)f(name)h(and)g(line)e(n)m
+(um)m(b)s(er)g(where)i(the)g(function)e(is)h(de\014ned)630
+3128 y(are)g(displa)m(y)m(ed)f(as)h(w)m(ell.)53 b(`)p
+Fs(-F)p Ft(')34 b(implies)e(`)p Fs(-f)p Ft('.)54 b(The)35
+b(follo)m(wing)e(options)h(can)h(b)s(e)f(used)g(to)630
+3238 y(restrict)40 b(output)h(to)g(v)-5 b(ariables)40
+b(with)f(the)i(sp)s(eci\014ed)e(attributes)h(or)h(to)g(giv)m(e)g(v)-5
+b(ariables)630 3347 y(attributes:)630 3507 y Fs(-a)384
+b Ft(Eac)m(h)30 b Fq(name)k Ft(is)28 b(an)h(arra)m(y)h(v)-5
+b(ariable)28 b(\(see)i(Section)f(6.7)h([Arra)m(ys],)h(page)e(72\).)630
+3666 y Fs(-f)384 b Ft(Use)31 b(function)e(names)h(only)-8
+b(.)630 3826 y Fs(-i)384 b Ft(The)36 b(v)-5 b(ariable)35
+b(is)g(to)i(b)s(e)f(treated)h(as)g(an)f(in)m(teger;)k(arithmetic)35
+b(ev)-5 b(aluation)1110 3935 y(\(see)29 b(Section)e(6.5)i([Shell)d
+(Arithmetic],)i(page)g(70\))h(is)e(p)s(erformed)f(when)h(the)1110
+4045 y(v)-5 b(ariable)29 b(is)h(assigned)f(a)i(v)-5 b(alue.)630
+4204 y Fs(-r)384 b Ft(Mak)m(e)25 b Fq(name)5 b Ft(s)23
+b(readonly)-8 b(.)38 b(These)24 b(names)f(cannot)h(then)f(b)s(e)g
+(assigned)g(v)-5 b(alues)1110 4314 y(b)m(y)30 b(subsequen)m(t)g
+(assignmen)m(t)g(statemen)m(ts)i(or)f(unset.)630 4473
+y Fs(-t)384 b Ft(Giv)m(e)32 b(eac)m(h)i Fq(name)j Ft(the)32
+b Fs(trace)f Ft(attribute.)45 b(T)-8 b(raced)32 b(functions)f(inherit)f
+(the)1110 4583 y Fs(DEBUG)21 b Ft(trap)h(from)h(the)f(calling)f(shell.)
+37 b(The)22 b(trace)h(attribute)g(has)f(no)g(sp)s(ecial)1110
+4692 y(meaning)30 b(for)g(v)-5 b(ariables.)630 4852 y
+Fs(-x)384 b Ft(Mark)30 b(eac)m(h)h Fq(name)k Ft(for)29
+b(exp)s(ort)h(to)g(subsequen)m(t)f(commands)h(via)f(the)h(en)m(vi-)1110
+4961 y(ronmen)m(t.)630 5121 y(Using)24 b(`)p Fs(+)p Ft(')h(instead)g
+(of)g(`)p Fs(-)p Ft(')g(turns)f(o\013)h(the)g(attribute)g(instead.)38
+b(When)25 b(used)f(in)g(a)h(function,)630 5230 y Fs(declare)37
+b Ft(mak)m(es)i(eac)m(h)h Fq(name)k Ft(lo)s(cal,)d(as)d(with)g(the)h
+Fs(local)e Ft(command.)66 b(If)38 b(a)h(v)-5 b(ariable)630
+5340 y(name)30 b(is)g(follo)m(w)m(ed)g(b)m(y)g(=)p Fq(v)-5
+b(alue)p Ft(,)30 b(the)g(v)-5 b(alue)30 b(of)h(the)f(v)-5
+b(ariable)30 b(is)f(set)i(to)g Fq(v)-5 b(alue)p Ft(.)p
+eop
+%%Page: 42 48
+42 47 bop 150 -116 a Ft(42)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(The)k(return)f(status)i(is)f(zero)h(unless)e(an)h(in)m(v)-5
+b(alid)33 b(option)i(is)g(encoun)m(tered,)i(an)f(attempt)630
+408 y(is)31 b(made)h(to)g(de\014ne)f(a)h(function)f(using)f(`)p
+Fs(-f)g(foo=bar)p Ft(',)h(an)h(attempt)g(is)f(made)h(to)h(assign)630
+518 y(a)42 b(v)-5 b(alue)42 b(to)h(a)f(readonly)f(v)-5
+b(ariable,)45 b(an)d(attempt)h(is)e(made)h(to)h(assign)e(a)i(v)-5
+b(alue)41 b(to)i(an)630 628 y(arra)m(y)30 b(v)-5 b(ariable)28
+b(without)h(using)e(the)j(comp)s(ound)e(assignmen)m(t)h(syn)m(tax)h
+(\(see)h(Section)e(6.7)630 737 y([Arra)m(ys],)47 b(page)c(72\),)48
+b(one)43 b(of)g(the)g Fq(names)k Ft(is)42 b(not)h(a)g(v)-5
+b(alid)41 b(shell)g(v)-5 b(ariable)42 b(name,)k(an)630
+847 y(attempt)28 b(is)e(made)i(to)f(turn)f(o\013)i(readonly)e(status)h
+(for)g(a)h(readonly)e(v)-5 b(ariable,)27 b(an)g(attempt)630
+956 y(is)g(made)i(to)g(turn)e(o\013)i(arra)m(y)f(status)h(for)f(an)g
+(arra)m(y)h(v)-5 b(ariable,)28 b(or)g(an)g(attempt)i(is)d(made)h(to)630
+1066 y(displa)m(y)h(a)h(non-existen)m(t)h(function)e(with)g(`)p
+Fs(-f)p Ft('.)150 1227 y Fs(echo)870 1363 y(echo)47 b([-neE])f([)p
+Fj(arg)57 b Fs(...)o(])630 1498 y Ft(Output)31 b(the)i
+Fq(arg)8 b Ft(s,)33 b(separated)g(b)m(y)g(spaces,)g(terminated)f(with)f
+(a)i(newline.)45 b(The)32 b(return)630 1608 y(status)f(is)f(alw)m(a)m
+(ys)h(0.)41 b(If)31 b(`)p Fs(-n)p Ft(')f(is)g(sp)s(eci\014ed,)f(the)i
+(trailing)d(newline)h(is)g(suppressed.)40 b(If)30 b(the)630
+1717 y(`)p Fs(-e)p Ft(')23 b(option)h(is)e(giv)m(en,)j(in)m
+(terpretation)e(of)h(the)g(follo)m(wing)e(bac)m(kslash-escap)s(ed)h(c)m
+(haracters)630 1827 y(is)32 b(enabled.)47 b(The)32 b(`)p
+Fs(-E)p Ft(')h(option)f(disables)f(the)i(in)m(terpretation)f(of)h
+(these)g(escap)s(e)g(c)m(harac-)630 1936 y(ters,)42 b(ev)m(en)f(on)e
+(systems)h(where)f(they)h(are)g(in)m(terpreted)f(b)m(y)h(default.)68
+b(The)39 b Fs(xpg_echo)630 2046 y Ft(shell)d(option)i(ma)m(y)h(b)s(e)e
+(used)h(to)h(dynamically)d(determine)h(whether)h(or)g(not)g
+Fs(echo)f Ft(ex-)630 2155 y(pands)30 b(these)h(escap)s(e)h(c)m
+(haracters)g(b)m(y)f(default.)42 b Fs(echo)30 b Ft(in)m(terprets)h(the)
+g(follo)m(wing)e(escap)s(e)630 2265 y(sequences:)630
+2426 y Fs(\\a)384 b Ft(alert)30 b(\(b)s(ell\))630 2587
+y Fs(\\b)384 b Ft(bac)m(kspace)630 2749 y Fs(\\c)g Ft(suppress)28
+b(trailing)h(newline)630 2910 y Fs(\\e)384 b Ft(escap)s(e)630
+3071 y Fs(\\f)g Ft(form)30 b(feed)630 3232 y Fs(\\n)384
+b Ft(new)30 b(line)630 3393 y Fs(\\r)384 b Ft(carriage)31
+b(return)630 3554 y Fs(\\t)384 b Ft(horizon)m(tal)30
+b(tab)630 3715 y Fs(\\v)384 b Ft(v)m(ertical)30 b(tab)630
+3877 y Fs(\\\\)384 b Ft(bac)m(kslash)630 4038 y Fs(\\0)p
+Fj(nnn)240 b Ft(the)32 b(eigh)m(t-bit)g(c)m(haracter)i(whose)e(v)-5
+b(alue)32 b(is)f(the)h(o)s(ctal)h(v)-5 b(alue)31 b Fq(nnn)g
+Ft(\(zero)i(to)1110 4147 y(three)e(o)s(ctal)f(digits\))630
+4309 y Fs(\\)p Fj(nnn)288 b Ft(the)35 b(eigh)m(t-bit)f(c)m(haracter)i
+(whose)e(v)-5 b(alue)34 b(is)g(the)g(o)s(ctal)h(v)-5
+b(alue)34 b Fq(nnn)f Ft(\(one)i(to)1110 4418 y(three)c(o)s(ctal)f
+(digits\))630 4579 y Fs(\\x)p Fj(HH)288 b Ft(the)40 b(eigh)m(t-bit)f(c)
+m(haracter)i(whose)e(v)-5 b(alue)38 b(is)h(the)g(hexadecimal)g(v)-5
+b(alue)39 b Fq(HH)1110 4689 y Ft(\(one)31 b(or)f(t)m(w)m(o)i(hex)e
+(digits\))150 4850 y Fs(enable)870 4985 y(enable)46 b([-n])h([-p])f
+([-f)h Fj(filename)11 b Fs(])45 b([-ads])h([)p Fj(name)57
+b Fs(...)o(])630 5121 y Ft(Enable)35 b(and)g(disable)f(builtin)f(shell)
+h(commands.)56 b(Disabling)34 b(a)j(builtin)32 b(allo)m(ws)j(a)h(disk)
+630 5230 y(command)e(whic)m(h)f(has)h(the)g(same)h(name)f(as)h(a)f
+(shell)f(builtin)d(to)35 b(b)s(e)f(executed)h(without)630
+5340 y(sp)s(ecifying)25 b(a)i(full)e(pathname,)i(ev)m(en)h(though)f
+(the)g(shell)e(normally)g(searc)m(hes)j(for)f(builtins)p
+eop
+%%Page: 43 49
+43 48 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(43)630 299 y(b)s(efore)32
+b(disk)e(commands.)46 b(If)31 b(`)p Fs(-n)p Ft(')h(is)f(used,)h(the)g
+Fq(name)5 b Ft(s)32 b(b)s(ecome)h(disabled.)43 b(Otherwise)630
+408 y Fq(name)5 b Ft(s)44 b(are)h(enabled.)81 b(F)-8
+b(or)45 b(example,)j(to)d(use)f(the)g Fs(test)f Ft(binary)g(found)g
+(via)g Fs($PATH)630 518 y Ft(instead)30 b(of)g(the)h(shell)d(builtin)f
+(v)m(ersion,)j(t)m(yp)s(e)h(`)p Fs(enable)e(-n)h(test)p
+Ft('.)630 656 y(If)42 b(the)h(`)p Fs(-p)p Ft(')f(option)g(is)f
+(supplied,)i(or)f(no)h Fq(name)k Ft(argumen)m(ts)c(app)s(ear,)i(a)e
+(list)e(of)i(shell)630 766 y(builtins)34 b(is)j(prin)m(ted.)62
+b(With)37 b(no)g(other)h(argumen)m(ts,)j(the)d(list)e(consists)h(of)h
+(all)f(enabled)630 875 y(shell)31 b(builtins.)43 b(The)32
+b(`)p Fs(-a)p Ft(')h(option)f(means)g(to)i(list)d(eac)m(h)j(builtin)29
+b(with)i(an)h(indication)f(of)630 985 y(whether)f(or)g(not)h(it)f(is)f
+(enabled.)630 1123 y(The)40 b(`)p Fs(-f)p Ft(')g(option)f(means)h(to)h
+(load)f(the)g(new)f(builtin)e(command)j Fq(name)45 b
+Ft(from)40 b(shared)630 1233 y(ob)5 b(ject)27 b Fq(\014lename)p
+Ft(,)f(on)g(systems)g(that)h(supp)s(ort)d(dynamic)h(loading.)38
+b(The)26 b(`)p Fs(-d)p Ft(')g(option)g(will)630 1342
+y(delete)31 b(a)f(builtin)d(loaded)j(with)f(`)p Fs(-f)p
+Ft('.)630 1481 y(If)i(there)g(are)g(no)g(options,)g(a)g(list)f(of)h
+(the)g(shell)e(builtins)f(is)i(displa)m(y)m(ed.)41 b(The)31
+b(`)p Fs(-s)p Ft(')f(option)630 1590 y(restricts)e Fs(enable)f
+Ft(to)i(the)f Fl(posix)g Ft(sp)s(ecial)f(builtins.)37
+b(If)27 b(`)p Fs(-s)p Ft(')i(is)e(used)h(with)f(`)p Fs(-f)p
+Ft(',)i(the)f(new)630 1700 y(builtin)f(b)s(ecomes)k(a)f(sp)s(ecial)f
+(builtin)e(\(see)32 b(Section)e(4.4)h([Sp)s(ecial)e(Builtins],)f(page)j
+(53\).)630 1838 y(The)26 b(return)f(status)h(is)f(zero)i(unless)d(a)j
+Fq(name)k Ft(is)25 b(not)h(a)h(shell)d(builtin)f(or)j(there)g(is)f(an)h
+(error)630 1947 y(loading)j(a)i(new)f(builtin)d(from)j(a)g(shared)g(ob)
+5 b(ject.)150 2114 y Fs(help)870 2252 y(help)47 b([-s])f([)p
+Fj(pattern)11 b Fs(])630 2391 y Ft(Displa)m(y)38 b(helpful)e
+(information)h(ab)s(out)i(builtin)c(commands.)66 b(If)38
+b Fq(pattern)h Ft(is)f(sp)s(eci\014ed,)630 2500 y Fs(help)28
+b Ft(giv)m(es)h(detailed)f(help)f(on)i(all)f(commands)g(matc)m(hing)h
+Fq(pattern)p Ft(,)h(otherwise)e(a)h(list)f(of)630 2610
+y(the)36 b(builtins)c(is)j(prin)m(ted.)55 b(The)35 b(`)p
+Fs(-s)p Ft(')h(option)f(restricts)g(the)h(information)e(displa)m(y)m
+(ed)g(to)630 2719 y(a)e(short)g(usage)h(synopsis.)43
+b(The)32 b(return)f(status)h(is)f(zero)i(unless)d(no)i(command)g(matc)m
+(hes)630 2829 y Fq(pattern)p Ft(.)150 2996 y Fs(let)870
+3134 y(let)47 b Fj(expression)55 b Fs([)p Fj(expression)11
+b Fs(])630 3272 y Ft(The)41 b Fs(let)g Ft(builtin)d(allo)m(ws)j
+(arithmetic)f(to)j(b)s(e)d(p)s(erformed)g(on)i(shell)e(v)-5
+b(ariables.)72 b(Eac)m(h)630 3382 y Fq(expression)30
+b Ft(is)g(ev)-5 b(aluated)31 b(according)f(to)i(the)f(rules)f(giv)m(en)
+h(b)s(elo)m(w)f(in)f(Section)i(6.5)h([Shell)630 3491
+y(Arithmetic],)49 b(page)d(70.)87 b(If)45 b(the)g(last)g
+Fq(expression)g Ft(ev)-5 b(aluates)46 b(to)g(0,)k Fs(let)44
+b Ft(returns)g(1;)630 3601 y(otherwise)30 b(0)h(is)e(returned.)150
+3768 y Fs(local)870 3906 y(local)46 b([)p Fj(option)11
+b Fs(])45 b Fj(name)11 b Fs([=)p Fj(value)g Fs(])44 b(...)630
+4044 y Ft(F)-8 b(or)27 b(eac)m(h)g(argumen)m(t,)g(a)f(lo)s(cal)f(v)-5
+b(ariable)25 b(named)g Fq(name)31 b Ft(is)25 b(created,)j(and)d
+(assigned)g Fq(v)-5 b(alue)p Ft(.)630 4154 y(The)37 b
+Fq(option)g Ft(can)g(b)s(e)g(an)m(y)h(of)f(the)h(options)f(accepted)h
+(b)m(y)g Fs(declare)p Ft(.)59 b Fs(local)36 b Ft(can)i(only)630
+4263 y(b)s(e)j(used)h(within)d(a)k(function;)k(it)41
+b(mak)m(es)i(the)f(v)-5 b(ariable)41 b Fq(name)48 b Ft(ha)m(v)m(e)43
+b(a)f(visible)e(scop)s(e)630 4373 y(restricted)e(to)h(that)g(function)e
+(and)g(its)h(c)m(hildren.)62 b(The)38 b(return)f(status)h(is)g(zero)h
+(unless)630 4482 y Fs(local)g Ft(is)g(used)h(outside)f(a)i(function,)g
+(an)f(in)m(v)-5 b(alid)38 b Fq(name)46 b Ft(is)39 b(supplied,)h(or)g
+Fq(name)45 b Ft(is)40 b(a)630 4592 y(readonly)29 b(v)-5
+b(ariable.)150 4759 y Fs(logout)870 4897 y(logout)46
+b([)p Fj(n)11 b Fs(])630 5035 y Ft(Exit)30 b(a)h(login)e(shell,)g
+(returning)f(a)j(status)g(of)f Fq(n)g Ft(to)h(the)g(shell's)d(paren)m
+(t.)150 5202 y Fs(printf)870 5340 y(printf)46 b Fj(format)57
+b Fs([)p Fj(arguments)11 b Fs(])p eop
+%%Page: 44 50
+44 49 bop 150 -116 a Ft(44)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(W)-8 b(rite)26 b(the)h(formatted)f Fq(argumen)m(ts)k
+Ft(to)d(the)f(standard)f(output)h(under)e(the)i(con)m(trol)h(of)f(the)
+630 408 y Fq(format)p Ft(.)41 b(The)28 b Fq(format)j
+Ft(is)d(a)h(c)m(haracter)i(string)c(whic)m(h)h(con)m(tains)h(three)g(t)
+m(yp)s(es)g(of)g(ob)5 b(jects:)630 518 y(plain)26 b(c)m(haracters,)31
+b(whic)m(h)c(are)i(simply)d(copied)i(to)i(standard)d(output,)i(c)m
+(haracter)h(escap)s(e)630 628 y(sequences,)g(whic)m(h)e(are)h(con)m(v)m
+(erted)i(and)d(copied)h(to)g(the)h(standard)e(output,)h(and)g(format)
+630 737 y(sp)s(eci\014cations,)37 b(eac)m(h)g(of)g(whic)m(h)e(causes)h
+(prin)m(ting)e(of)j(the)f(next)h(successiv)m(e)f Fq(argumen)m(t)p
+Ft(.)630 847 y(In)31 b(addition)f(to)j(the)e(standard)g
+Fs(printf\(1\))f Ft(formats,)i(`)p Fs(\045b)p Ft(')g(causes)g
+Fs(printf)e Ft(to)j(expand)630 956 y(bac)m(kslash)38
+b(escap)s(e)h(sequences)f(in)g(the)g(corresp)s(onding)e
+Fq(argumen)m(t)p Ft(,)41 b(\(except)f(that)f(`)p Fs(\\c)p
+Ft(')630 1066 y(terminates)k(output,)k(bac)m(kslashes)c(in)f(`)p
+Fs(\\')p Ft(',)47 b(`)p Fs(\\")p Ft(',)g(and)c(`)p Fs(\\?)p
+Ft(')g(are)h(not)g(remo)m(v)m(ed,)k(and)630 1176 y(o)s(ctal)24
+b(escap)s(es)g(b)s(eginning)d(with)h(`)p Fs(\\0)p Ft(')i(ma)m(y)g(con)m
+(tain)g(up)f(to)h(four)f(digits\),)h(and)f(`)p Fs(\045q)p
+Ft(')h(causes)630 1285 y Fs(printf)31 b Ft(to)i(output)f(the)h(corresp)
+s(onding)e Fq(argumen)m(t)k Ft(in)c(a)i(format)g(that)g(can)g(b)s(e)f
+(reused)630 1395 y(as)f(shell)d(input.)630 1526 y(The)j
+Fq(format)i Ft(is)e(reused)f(as)i(necessary)f(to)i(consume)e(all)f(of)h
+(the)h Fq(argumen)m(ts)p Ft(.)44 b(If)30 b(the)i Fq(for-)630
+1636 y(mat)c Ft(requires)d(more)h Fq(argumen)m(ts)k Ft(than)25
+b(are)i(supplied,)c(the)j(extra)h(format)f(sp)s(eci\014cations)630
+1745 y(b)s(eha)m(v)m(e)j(as)g(if)e(a)i(zero)g(v)-5 b(alue)28
+b(or)h(n)m(ull)d(string,)i(as)h(appropriate,)f(had)g(b)s(een)g
+(supplied.)36 b(The)630 1855 y(return)29 b(v)-5 b(alue)30
+b(is)g(zero)h(on)f(success,)h(non-zero)g(on)f(failure.)150
+2008 y Fs(read)870 2140 y(read)47 b([-ers])f([-a)h Fj(aname)11
+b Fs(])45 b([-d)i Fj(delim)11 b Fs(])46 b([-n)h Fj(nchars)11
+b Fs(])45 b([-p)i Fj(prompt)11 b Fs(])45 b([-t)i Fj(time-)870
+2250 y(out)11 b Fs(])46 b([-u)h Fj(fd)11 b Fs(])46 b([)p
+Fj(name)57 b Fs(...])630 2381 y Ft(One)26 b(line)f(is)h(read)g(from)h
+(the)f(standard)g(input,)g(or)h(from)f(the)h(\014le)e(descriptor)h
+Fq(fd)j Ft(supplied)630 2491 y(as)37 b(an)g(argumen)m(t)h(to)f(the)h(`)
+p Fs(-u)p Ft(')e(option,)j(and)d(the)i(\014rst)e(w)m(ord)g(is)g
+(assigned)h(to)g(the)h(\014rst)630 2600 y Fq(name)p Ft(,)29
+b(the)f(second)h(w)m(ord)e(to)i(the)g(second)f Fq(name)p
+Ft(,)h(and)e(so)i(on,)g(with)e(lefto)m(v)m(er)i(w)m(ords)f(and)630
+2710 y(their)f(in)m(terv)m(ening)g(separators)i(assigned)e(to)i(the)f
+(last)g Fq(name)p Ft(.)40 b(If)27 b(there)i(are)f(few)m(er)g(w)m(ords)
+630 2819 y(read)44 b(from)f(the)g(input)f(stream)i(than)g(names,)j(the)
+c(remaining)f(names)i(are)g(assigned)630 2929 y(empt)m(y)31
+b(v)-5 b(alues.)40 b(The)30 b(c)m(haracters)i(in)d(the)i(v)-5
+b(alue)30 b(of)h(the)f Fs(IFS)g Ft(v)-5 b(ariable)29
+b(are)i(used)f(to)h(split)630 3039 y(the)37 b(line)f(in)m(to)h(w)m
+(ords.)61 b(The)36 b(bac)m(kslash)h(c)m(haracter)i(`)p
+Fs(\\)p Ft(')e(ma)m(y)h(b)s(e)f(used)f(to)i(remo)m(v)m(e)h(an)m(y)630
+3148 y(sp)s(ecial)f(meaning)h(for)g(the)g(next)h(c)m(haracter)h(read)e
+(and)g(for)g(line)f(con)m(tin)m(uation.)67 b(If)39 b(no)630
+3258 y(names)28 b(are)h(supplied,)d(the)i(line)f(read)i(is)e(assigned)h
+(to)h(the)f(v)-5 b(ariable)27 b Fs(REPLY)p Ft(.)39 b(The)28
+b(return)630 3367 y(co)s(de)i(is)e(zero,)j(unless)d(end-of-\014le)h(is)
+f(encoun)m(tered,)i Fs(read)f Ft(times)g(out,)h(or)f(an)h(in)m(v)-5
+b(alid)27 b(\014le)630 3477 y(descriptor)34 b(is)h(supplied)d(as)k(the)
+f(argumen)m(t)h(to)g(`)p Fs(-u)p Ft('.)56 b(Options,)36
+b(if)e(supplied,)g(ha)m(v)m(e)j(the)630 3587 y(follo)m(wing)29
+b(meanings:)630 3740 y Fs(-a)h Fj(aname)114 b Ft(The)34
+b(w)m(ords)f(are)i(assigned)e(to)i(sequen)m(tial)f(indices)e(of)i(the)g
+(arra)m(y)h(v)-5 b(ariable)1110 3850 y Fq(aname)p Ft(,)29
+b(starting)g(at)g(0.)40 b(All)27 b(elemen)m(ts)i(are)f(remo)m(v)m(ed)i
+(from)d Fq(aname)34 b Ft(b)s(efore)1110 3959 y(the)d(assignmen)m(t.)40
+b(Other)30 b Fq(name)36 b Ft(argumen)m(ts)30 b(are)h(ignored.)630
+4113 y Fs(-d)f Fj(delim)114 b Ft(The)41 b(\014rst)h(c)m(haracter)h(of)f
+Fq(delim)e Ft(is)h(used)h(to)g(terminate)g(the)g(input)e(line,)1110
+4222 y(rather)30 b(than)g(newline.)630 4376 y Fs(-e)384
+b Ft(Readline)26 b(\(see)j(Chapter)e(8)h([Command)f(Line)f(Editing],)h
+(page)h(83\))h(is)e(used)1110 4485 y(to)k(obtain)f(the)h(line.)630
+4639 y Fs(-n)f Fj(nchars)1110 4748 y Fs(read)38 b Ft(returns)f(after)j
+(reading)e Fq(nc)m(hars)k Ft(c)m(haracters)e(rather)f(than)g(w)m
+(aiting)1110 4858 y(for)30 b(a)h(complete)g(line)d(of)j(input.)630
+5011 y Fs(-p)f Fj(prompt)1110 5121 y Ft(Displa)m(y)36
+b Fq(prompt)p Ft(,)i(without)d(a)i(trailing)e(newline,)i(b)s(efore)f
+(attempting)h(to)1110 5230 y(read)g(an)m(y)h(input.)59
+b(The)37 b(prompt)g(is)f(displa)m(y)m(ed)g(only)g(if)g(input)g(is)g
+(coming)1110 5340 y(from)30 b(a)h(terminal.)p eop
+%%Page: 45 51
+45 50 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(45)630 299 y Fs(-r)384 b
+Ft(If)21 b(this)g(option)g(is)f(giv)m(en,)k(bac)m(kslash)d(do)s(es)g
+(not)h(act)h(as)f(an)f(escap)s(e)h(c)m(haracter.)1110
+408 y(The)30 b(bac)m(kslash)h(is)f(considered)g(to)i(b)s(e)e(part)h(of)
+g(the)g(line.)41 b(In)30 b(particular,)g(a)1110 518 y(bac)m
+(kslash-newline)e(pair)h(ma)m(y)i(not)g(b)s(e)f(used)f(as)i(a)g(line)d
+(con)m(tin)m(uation.)630 676 y Fs(-s)384 b Ft(Silen)m(t)26
+b(mo)s(de.)40 b(If)27 b(input)e(is)i(coming)g(from)g(a)h(terminal,)f(c)
+m(haracters)i(are)f(not)1110 786 y(ec)m(ho)s(ed.)630
+944 y Fs(-t)i Fj(timeout)1110 1054 y Ft(Cause)42 b Fs(read)g
+Ft(to)h(time)g(out)g(and)f(return)f(failure)g(if)h(a)h(complete)g(line)
+e(of)1110 1163 y(input)25 b(is)h(not)i(read)f(within)d
+Fq(timeout)29 b Ft(seconds.)40 b(This)25 b(option)i(has)f(no)h
+(e\013ect)1110 1273 y(if)i Fs(read)h Ft(is)f(not)i(reading)e(input)f
+(from)i(the)h(terminal)e(or)h(a)h(pip)s(e.)630 1431 y
+Fs(-u)f Fj(fd)258 b Ft(Read)31 b(input)d(from)i(\014le)f(descriptor)h
+Fq(fd)p Ft(.)150 1590 y Fs(shopt)870 1724 y(shopt)46
+b([-pqsu])g([-o])h([)p Fj(optname)56 b Fs(...)o(])630
+1857 y Ft(T)-8 b(oggle)46 b(the)e(v)-5 b(alues)44 b(of)h(v)-5
+b(ariables)43 b(con)m(trolling)h(optional)g(shell)e(b)s(eha)m(vior.)83
+b(With)44 b(no)630 1967 y(options,)31 b(or)g(with)f(the)h(`)p
+Fs(-p)p Ft(')g(option,)g(a)h(list)d(of)j(all)e(settable)h(options)g(is)
+f(displa)m(y)m(ed,)g(with)630 2077 y(an)k(indication)f(of)i(whether)f
+(or)g(not)h(eac)m(h)h(is)d(set.)54 b(The)34 b(`)p Fs(-p)p
+Ft(')h(option)f(causes)h(output)f(to)630 2186 y(b)s(e)i(displa)m(y)m
+(ed)f(in)f(a)j(form)f(that)h(ma)m(y)g(b)s(e)e(reused)h(as)g(input.)57
+b(Other)36 b(options)f(ha)m(v)m(e)j(the)630 2296 y(follo)m(wing)29
+b(meanings:)630 2454 y Fs(-s)384 b Ft(Enable)29 b(\(set\))j(eac)m(h)f
+Fq(optname)p Ft(.)630 2612 y Fs(-u)384 b Ft(Disable)29
+b(\(unset\))i(eac)m(h)h Fq(optname)p Ft(.)630 2771 y
+Fs(-q)384 b Ft(Suppresses)28 b(normal)g(output;)i(the)g(return)e
+(status)i(indicates)f(whether)g(the)1110 2880 y Fq(optname)37
+b Ft(is)30 b(set)i(or)f(unset.)43 b(If)31 b(m)m(ultiple)e
+Fq(optname)37 b Ft(argumen)m(ts)31 b(are)h(giv)m(en)1110
+2990 y(with)42 b(`)p Fs(-q)p Ft(',)k(the)d(return)f(status)h(is)f(zero)
+i(if)e(all)f Fq(optnames)47 b Ft(are)d(enabled;)1110
+3099 y(non-zero)31 b(otherwise.)630 3258 y Fs(-o)384
+b Ft(Restricts)41 b(the)h(v)-5 b(alues)41 b(of)g Fq(optname)47
+b Ft(to)42 b(b)s(e)f(those)h(de\014ned)e(for)h(the)h(`)p
+Fs(-o)p Ft(')1110 3367 y(option)20 b(to)i(the)f Fs(set)f
+Ft(builtin)d(\(see)22 b(Section)e(4.3)i([The)e(Set)h(Builtin],)g(page)g
+(50\).)630 3526 y(If)29 b(either)h(`)p Fs(-s)p Ft(')g(or)g(`)p
+Fs(-u)p Ft(')f(is)g(used)h(with)e(no)i Fq(optname)35
+b Ft(argumen)m(ts,)c(the)f(displa)m(y)e(is)h(limited)630
+3635 y(to)i(those)g(options)f(whic)m(h)f(are)i(set)f(or)h(unset,)f
+(resp)s(ectiv)m(ely)-8 b(.)630 3769 y(Unless)29 b(otherwise)h(noted,)h
+(the)g Fs(shopt)d Ft(options)i(are)h(disabled)d(\(o\013)7
+b(\))32 b(b)m(y)e(default.)630 3903 y(The)d(return)f(status)i(when)f
+(listing)e(options)i(is)f(zero)j(if)d(all)h Fq(optnames)k
+Ft(are)d(enabled,)f(non-)630 4013 y(zero)40 b(otherwise.)65
+b(When)39 b(setting)g(or)g(unsetting)f(options,)i(the)f(return)f
+(status)h(is)f(zero)630 4122 y(unless)29 b(an)h Fq(optname)36
+b Ft(is)29 b(not)i(a)g(v)-5 b(alid)28 b(shell)h(option.)630
+4256 y(The)h(list)f(of)h Fs(shopt)f Ft(options)h(is:)630
+4415 y Fs(cdable_vars)1110 4524 y Ft(If)k(this)g(is)g(set,)j(an)e
+(argumen)m(t)g(to)h(the)f Fs(cd)f Ft(builtin)e(command)i(that)i(is)e
+(not)1110 4634 y(a)d(directory)f(is)g(assumed)g(to)h(b)s(e)f(the)h
+(name)f(of)h(a)g(v)-5 b(ariable)29 b(whose)i(v)-5 b(alue)30
+b(is)1110 4743 y(the)h(directory)e(to)j(c)m(hange)f(to.)630
+4902 y Fs(cdspell)144 b Ft(If)27 b(set,)h(minor)e(errors)g(in)g(the)h
+(sp)s(elling)e(of)i(a)g(directory)g(comp)s(onen)m(t)g(in)f(a)i
+Fs(cd)1110 5011 y Ft(command)i(will)e(b)s(e)i(corrected.)43
+b(The)30 b(errors)g(c)m(hec)m(k)m(ed)j(for)d(are)h(transp)s(osed)1110
+5121 y(c)m(haracters,)46 b(a)c(missing)d(c)m(haracter,)47
+b(and)40 b(a)i(c)m(haracter)h(to)s(o)g(man)m(y)-8 b(.)74
+b(If)42 b(a)1110 5230 y(correction)24 b(is)e(found,)h(the)h(corrected)g
+(path)f(is)f(prin)m(ted,)h(and)g(the)g(command)1110 5340
+y(pro)s(ceeds.)40 b(This)29 b(option)h(is)f(only)h(used)f(b)m(y)h(in)m
+(teractiv)m(e)i(shells.)p eop
+%%Page: 46 52
+46 51 bop 150 -116 a Ft(46)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y Fs(checkhash)1110 408 y Ft(If)e(this)g(is)g(set,)h(Bash)g(c)m
+(hec)m(ks)h(that)g(a)f(command)f(found)g(in)f(the)i(hash)f(table)1110
+518 y(exists)j(b)s(efore)g(trying)g(to)i(execute)g(it.)47
+b(If)32 b(a)h(hashed)e(command)i(no)f(longer)1110 628
+y(exists,)e(a)h(normal)e(path)h(searc)m(h)h(is)f(p)s(erformed.)630
+775 y Fs(checkwinsize)1110 885 y Ft(If)41 b(set,)k(Bash)c(c)m(hec)m(ks)
+i(the)f(windo)m(w)d(size)j(after)g(eac)m(h)g(command)f(and,)j(if)1110
+995 y(necessary)-8 b(,)31 b(up)s(dates)f(the)g(v)-5 b(alues)30
+b(of)h Fs(LINES)e Ft(and)g Fs(COLUMNS)p Ft(.)630 1142
+y Fs(cmdhist)144 b Ft(If)33 b(set,)j(Bash)e(attempts)h(to)g(sa)m(v)m(e)
+g(all)e(lines)f(of)i(a)h(m)m(ultiple-line)30 b(command)1110
+1252 y(in)g(the)h(same)g(history)f(en)m(try)-8 b(.)42
+b(This)29 b(allo)m(ws)h(easy)i(re-editing)e(of)h(m)m(ulti-line)1110
+1361 y(commands.)630 1509 y Fs(dotglob)144 b Ft(If)27
+b(set,)i(Bash)f(includes)e(\014lenames)h(b)s(eginning)e(with)h(a)i(`.')
+41 b(in)26 b(the)i(results)f(of)1110 1619 y(\014lename)j(expansion.)630
+1766 y Fs(execfail)96 b Ft(If)24 b(this)g(is)f(set,)k(a)e(non-in)m
+(teractiv)m(e)g(shell)e(will)e(not)k(exit)g(if)e(it)h(cannot)i(execute)
+1110 1876 y(the)i(\014le)f(sp)s(eci\014ed)g(as)h(an)g(argumen)m(t)g(to)
+h(the)f Fs(exec)f Ft(builtin)e(command.)39 b(An)1110
+1986 y(in)m(teractiv)m(e)31 b(shell)e(do)s(es)h(not)g(exit)h(if)e
+Fs(exec)g Ft(fails.)630 2133 y Fs(expand_aliases)1110
+2243 y Ft(If)j(set,)h(aliases)e(are)i(expanded)e(as)h(describ)s(ed)e(b)
+s(elo)m(w)h(under)g(Aliases,)g(Sec-)1110 2352 y(tion)37
+b(6.6)i([Aliases],)h(page)f(71.)64 b(This)36 b(option)h(is)g(enabled)g
+(b)m(y)h(default)f(for)1110 2462 y(in)m(teractiv)m(e)31
+b(shells.)630 2610 y Fs(extdebug)96 b Ft(If)30 b(set,)h(b)s(eha)m(vior)
+f(in)m(tended)f(for)h(use)g(b)m(y)g(debuggers)g(is)g(enabled:)1159
+2738 y(1.)61 b(The)32 b(`)p Fs(-F)p Ft(')g(option)g(to)h(the)g
+Fs(declare)d Ft(builtin)f(\(see)34 b(Section)e(4.2)i([Bash)1290
+2848 y(Builtins],)26 b(page)j(39\))g(displa)m(ys)d(the)i(source)h
+(\014le)e(name)h(and)f(line)f(n)m(um-)1290 2958 y(b)s(er)j(corresp)s
+(onding)f(to)j(eac)m(h)g(function)e(name)h(supplied)d(as)k(an)f(argu-)
+1290 3067 y(men)m(t.)1159 3196 y(2.)61 b(If)20 b(the)h(command)g(run)e
+(b)m(y)i(the)f Fs(DEBUG)g Ft(trap)g(returns)g(a)h(non-zero)g(v)-5
+b(alue,)1290 3305 y(the)31 b(next)f(command)g(is)g(skipp)s(ed)e(and)h
+(not)i(executed.)1159 3434 y(3.)61 b(If)37 b(the)g(command)g(run)f(b)m
+(y)i(the)f Fs(DEBUG)f Ft(trap)h(returns)f(a)i(v)-5 b(alue)37
+b(of)g(2,)1290 3544 y(and)c(the)g(shell)f(is)g(executing)i(in)e(a)i
+(subroutine)d(\(a)j(shell)e(function)g(or)1290 3653 y(a)i(shell)f
+(script)g(executed)i(b)m(y)f(the)g Fs(.)g Ft(or)g Fs(source)e
+Ft(builtins\),)g(a)j(call)e(to)1290 3763 y Fs(return)c
+Ft(is)g(sim)m(ulated.)630 3911 y Fs(extglob)144 b Ft(If)26
+b(set,)i(the)f(extended)f(pattern)h(matc)m(hing)f(features)h(describ)s
+(ed)d(ab)s(o)m(v)m(e)k(\(see)1110 4020 y(Section)i(3.5.8.1)j([P)m
+(attern)f(Matc)m(hing],)f(page)g(23\))h(are)f(enabled.)630
+4168 y Fs(extquote)96 b Ft(If)49 b(set,)54 b Fs($')p
+Fj(string)11 b Fs(')46 b Ft(and)j Fs($")p Fj(string)11
+b Fs(")46 b Ft(quoting)j(is)f(p)s(erformed)f(within)1110
+4277 y Fs(${)p Fj(parameter)11 b Fs(})30 b Ft(expansions)i(enclosed)h
+(in)g(double)f(quotes.)51 b(This)31 b(option)1110 4387
+y(is)e(enabled)h(b)m(y)g(default.)630 4535 y Fs(failglob)96
+b Ft(If)30 b(set,)g(patterns)g(whic)m(h)f(fail)g(to)i(matc)m(h)g
+(\014lenames)e(during)e(pathname)j(ex-)1110 4644 y(pansion)f(result)g
+(in)g(an)h(expansion)g(error.)630 4792 y Fs(force_fignore)1110
+4902 y Ft(If)43 b(set,)k(the)d(su\016xes)f(sp)s(eci\014ed)e(b)m(y)j
+(the)f Fs(FIGNORE)f Ft(shell)f(v)-5 b(ariable)42 b(cause)1110
+5011 y(w)m(ords)31 b(to)h(b)s(e)f(ignored)g(when)g(p)s(erforming)e(w)m
+(ord)i(completion)g(ev)m(en)h(if)f(the)1110 5121 y(ignored)36
+b(w)m(ords)h(are)g(the)h(only)e(p)s(ossible)f(completions.)60
+b(See)37 b(Section)g(5.2)1110 5230 y([Bash)24 b(V)-8
+b(ariables],)25 b(page)g(55,)h(for)d(a)h(description)e(of)i
+Fs(FIGNORE)p Ft(.)37 b(This)21 b(option)1110 5340 y(is)29
+b(enabled)h(b)m(y)g(default.)p eop
+%%Page: 47 53
+47 52 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(47)630 299 y Fs(gnu_errfmt)1110
+408 y Ft(If)35 b(set,)j(shell)c(error)i(messages)g(are)h(written)d(in)h
+(the)h(standard)f Fl(gnu)g Ft(error)1110 518 y(message)c(format.)630
+667 y Fs(histappend)1110 777 y Ft(If)c(set,)j(the)e(history)f(list)f
+(is)h(app)s(ended)f(to)j(the)f(\014le)f(named)g(b)m(y)h(the)g(v)-5
+b(alue)28 b(of)1110 887 y(the)e Fs(HISTFILE)d Ft(v)-5
+b(ariable)24 b(when)g(the)h(shell)f(exits,)i(rather)f(than)h(o)m(v)m
+(erwriting)1110 996 y(the)31 b(\014le.)630 1146 y Fs(histreedit)1110
+1255 y Ft(If)i(set,)h(and)f(Readline)f(is)g(b)s(eing)g(used,)h(a)g
+(user)g(is)f(giv)m(en)h(the)h(opp)s(ortunit)m(y)1110
+1365 y(to)d(re-edit)f(a)h(failed)e(history)g(substitution.)630
+1514 y Fs(histverify)1110 1624 y Ft(If)35 b(set,)i(and)e(Readline)f(is)
+g(b)s(eing)g(used,)i(the)f(results)f(of)h(history)g(substitu-)1110
+1733 y(tion)h(are)h(not)g(immediately)e(passed)h(to)h(the)g(shell)e
+(parser.)59 b(Instead,)38 b(the)1110 1843 y(resulting)g(line)f(is)i
+(loaded)g(in)m(to)g(the)h(Readline)e(editing)g(bu\013er,)j(allo)m(wing)
+1110 1953 y(further)29 b(mo)s(di\014cation.)630 2102
+y Fs(hostcomplete)1110 2212 y Ft(If)38 b(set,)j(and)c(Readline)g(is)g
+(b)s(eing)g(used,)i(Bash)g(will)c(attempt)k(to)g(p)s(erform)1110
+2321 y(hostname)d(completion)f(when)g(a)h(w)m(ord)f(con)m(taining)g(a)h
+(`)p Fs(@)p Ft(')g(is)f(b)s(eing)f(com-)1110 2431 y(pleted)40
+b(\(see)h(Section)f(8.4.6)i([Commands)e(F)-8 b(or)41
+b(Completion],)g(page)g(99\).)1110 2540 y(This)29 b(option)g(is)h
+(enabled)f(b)m(y)h(default.)630 2690 y Fs(huponexit)1110
+2800 y Ft(If)i(set,)i(Bash)f(will)e(send)g Fs(SIGHUP)h
+Ft(to)h(all)f(jobs)g(when)g(an)g(in)m(teractiv)m(e)i(login)1110
+2909 y(shell)29 b(exits)h(\(see)h(Section)f(3.7.6)i([Signals],)e(page)h
+(31\).)630 3059 y Fs(interactive_comments)1110 3168 y
+Ft(Allo)m(w)25 b(a)i(w)m(ord)e(b)s(eginning)e(with)i(`)p
+Fs(#)p Ft(')h(to)h(cause)f(that)h(w)m(ord)f(and)f(all)g(remain-)1110
+3278 y(ing)40 b(c)m(haracters)j(on)e(that)h(line)e(to)i(b)s(e)f
+(ignored)f(in)g(an)h(in)m(teractiv)m(e)h(shell.)1110
+3387 y(This)29 b(option)g(is)h(enabled)f(b)m(y)h(default.)630
+3537 y Fs(lithist)144 b Ft(If)22 b(enabled,)h(and)e(the)h
+Fs(cmdhist)e Ft(option)i(is)f(enabled,)i(m)m(ulti-line)c(commands)1110
+3646 y(are)28 b(sa)m(v)m(ed)h(to)g(the)f(history)f(with)f(em)m(b)s
+(edded)h(newlines)f(rather)i(than)f(using)1110 3756 y(semicolon)j
+(separators)h(where)e(p)s(ossible.)630 3905 y Fs(login_shell)1110
+4015 y Ft(The)35 b(shell)f(sets)i(this)e(option)h(if)g(it)g(is)f
+(started)i(as)g(a)g(login)e(shell)g(\(see)i(Sec-)1110
+4125 y(tion)28 b(6.1)h([In)m(v)m(oking)g(Bash],)g(page)g(63\).)41
+b(The)28 b(v)-5 b(alue)28 b(ma)m(y)h(not)f(b)s(e)g(c)m(hanged.)630
+4274 y Fs(mailwarn)96 b Ft(If)34 b(set,)i(and)e(a)h(\014le)f(that)h
+(Bash)f(is)g(c)m(hec)m(king)h(for)g(mail)e(has)h(b)s(een)g(accessed)
+1110 4384 y(since)23 b(the)i(last)f(time)f(it)h(w)m(as)g(c)m(hec)m(k)m
+(ed,)k(the)c(message)h Fs("The)k(mail)h(in)f Fj(mail-)1110
+4493 y(file)40 b Fs(has)29 b(been)g(read")g Ft(is)h(displa)m(y)m(ed.)
+630 4643 y Fs(no_empty_cmd_completion)1110 4752 y Ft(If)g(set,)g(and)g
+(Readline)e(is)i(b)s(eing)e(used,)i(Bash)g(will)d(not)j(attempt)i(to)e
+(searc)m(h)1110 4862 y(the)25 b Fs(PATH)f Ft(for)h(p)s(ossible)d
+(completions)j(when)f(completion)g(is)g(attempted)i(on)1110
+4971 y(an)k(empt)m(y)h(line.)630 5121 y Fs(nocaseglob)1110
+5230 y Ft(If)38 b(set,)k(Bash)d(matc)m(hes)g(\014lenames)f(in)f(a)i
+(case-insensitiv)m(e)g(fashion)e(when)1110 5340 y(p)s(erforming)28
+b(\014lename)i(expansion.)p eop
+%%Page: 48 54
+48 53 bop 150 -116 a Ft(48)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y Fs(nullglob)96 b Ft(If)23 b(set,)j(Bash)e(allo)m(ws)e(\014lename)
+h(patterns)h(whic)m(h)e(matc)m(h)i(no)g(\014les)e(to)j(expand)1110
+408 y(to)31 b(a)g(n)m(ull)d(string,)i(rather)g(than)g(themselv)m(es.)
+630 573 y Fs(progcomp)96 b Ft(If)25 b(set,)i(the)f(programmable)f
+(completion)f(facilities)g(\(see)j(Section)e(8.6)i([Pro-)1110
+682 y(grammable)44 b(Completion],)j(page)e(103\))h(are)f(enabled.)81
+b(This)43 b(option)h(is)1110 792 y(enabled)29 b(b)m(y)i(default.)630
+956 y Fs(promptvars)1110 1066 y Ft(If)24 b(set,)i(prompt)d(strings)g
+(undergo)g(parameter)i(expansion,)f(command)g(sub-)1110
+1176 y(stitution,)32 b(arithmetic)f(expansion,)h(and)f(quote)i(remo)m
+(v)-5 b(al)32 b(after)h(b)s(eing)d(ex-)1110 1285 y(panded)39
+b(as)i(describ)s(ed)d(b)s(elo)m(w)i(\(see)h(Section)f(6.9)h([Prin)m
+(ting)e(a)i(Prompt],)1110 1395 y(page)31 b(75\).)42 b(This)29
+b(option)g(is)h(enabled)f(b)m(y)h(default.)630 1559 y
+Fs(restricted_shell)1110 1669 y Ft(The)40 b(shell)f(sets)i(this)f
+(option)g(if)g(it)h(is)e(started)j(in)d(restricted)i(mo)s(de)f(\(see)
+1110 1778 y(Section)35 b(6.10)h([The)f(Restricted)f(Shell],)h(page)g
+(76\).)56 b(The)34 b(v)-5 b(alue)34 b(ma)m(y)i(not)1110
+1888 y(b)s(e)c(c)m(hanged.)49 b(This)31 b(is)h(not)i(reset)f(when)f
+(the)h(startup)g(\014les)e(are)j(executed,)1110 1998
+y(allo)m(wing)h(the)h(startup)f(\014les)g(to)h(disco)m(v)m(er)g
+(whether)g(or)f(not)i(a)f(shell)e(is)h(re-)1110 2107
+y(stricted.)630 2271 y Fs(shift_verbose)1110 2381 y Ft(If)h(this)f(is)g
+(set,)k(the)d Fs(shift)f Ft(builtin)e(prin)m(ts)h(an)i(error)g(message)
+i(when)d(the)1110 2491 y(shift)29 b(coun)m(t)i(exceeds)g(the)g(n)m(um)m
+(b)s(er)e(of)h(p)s(ositional)f(parameters.)630 2655 y
+Fs(sourcepath)1110 2765 y Ft(If)22 b(set,)j(the)e Fs(source)e
+Ft(builtin)e(uses)j(the)h(v)-5 b(alue)22 b(of)h Fs(PATH)e
+Ft(to)j(\014nd)d(the)h(directory)1110 2874 y(con)m(taining)27
+b(the)g(\014le)g(supplied)d(as)j(an)g(argumen)m(t.)40
+b(This)26 b(option)h(is)f(enabled)1110 2984 y(b)m(y)k(default.)630
+3148 y Fs(xpg_echo)96 b Ft(If)31 b(set,)h(the)g Fs(echo)e
+Ft(builtin)e(expands)i(bac)m(kslash-escap)s(e)i(sequences)g(b)m(y)f
+(de-)1110 3258 y(fault.)630 3422 y(The)c(return)f(status)i(when)f
+(listing)e(options)i(is)f(zero)j(if)d(all)h Fq(optnames)k
+Ft(are)d(enabled,)f(non-)630 3532 y(zero)40 b(otherwise.)65
+b(When)39 b(setting)g(or)g(unsetting)f(options,)i(the)f(return)f
+(status)h(is)f(zero)630 3641 y(unless)29 b(an)h Fq(optname)36
+b Ft(is)29 b(not)i(a)g(v)-5 b(alid)28 b(shell)h(option.)150
+3806 y Fs(source)870 3943 y(source)46 b Fj(filename)630
+4080 y Ft(A)30 b(synon)m(ym)g(for)g Fs(.)g Ft(\(see)i(Section)e(4.1)h
+([Bourne)g(Shell)d(Builtins],)g(page)j(33\).)150 4244
+y Fs(type)870 4381 y(type)47 b([-afptP])e([)p Fj(name)57
+b Fs(...)o(])630 4518 y Ft(F)-8 b(or)42 b(eac)m(h)g Fq(name)p
+Ft(,)i(indicate)c(ho)m(w)i(it)e(w)m(ould)g(b)s(e)h(in)m(terpreted)f(if)
+g(used)g(as)i(a)f(command)630 4628 y(name.)630 4765 y(If)d(the)g(`)p
+Fs(-t)p Ft(')g(option)f(is)g(used,)j Fs(type)d Ft(prin)m(ts)f(a)j
+(single)d(w)m(ord)i(whic)m(h)f(is)g(one)h(of)h(`)p Fs(alias)p
+Ft(',)630 4874 y(`)p Fs(function)p Ft(',)32 b(`)p Fs(builtin)p
+Ft(',)g(`)p Fs(file)p Ft(')g(or)h(`)p Fs(keyword)p Ft(',)f(if)g
+Fq(name)38 b Ft(is)32 b(an)g(alias,)h(shell)e(function,)630
+4984 y(shell)i(builtin,)f(disk)i(\014le,)h(or)f(shell)f(reserv)m(ed)i
+(w)m(ord,)h(resp)s(ectiv)m(ely)-8 b(.)53 b(If)34 b(the)h
+Fq(name)40 b Ft(is)34 b(not)630 5093 y(found,)29 b(then)h(nothing)g(is)
+f(prin)m(ted,)g(and)h Fs(type)f Ft(returns)g(a)i(failure)e(status.)630
+5230 y(If)39 b(the)g(`)p Fs(-p)p Ft(')g(option)g(is)f(used,)j
+Fs(type)d Ft(either)g(returns)g(the)i(name)f(of)g(the)g(disk)f(\014le)g
+(that)630 5340 y(w)m(ould)29 b(b)s(e)h(executed,)h(or)g(nothing)e(if)g
+(`)p Fs(-t)p Ft(')i(w)m(ould)e(not)h(return)g(`)p Fs(file)p
+Ft('.)p eop
+%%Page: 49 55
+49 54 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(49)630 299 y(The)23 b(`)p
+Fs(-P)p Ft(')h(option)f(forces)h(a)g(path)g(searc)m(h)g(for)g(eac)m(h)g
+Fq(name)p Ft(,)i(ev)m(en)e(if)f(`)p Fs(-t)p Ft(')h(w)m(ould)e(not)i
+(return)630 408 y(`)p Fs(file)p Ft('.)630 542 y(If)34
+b(a)i(command)e(is)g(hashed,)h(`)p Fs(-p)p Ft(')g(and)f(`)p
+Fs(-P)p Ft(')h(prin)m(t)e(the)i(hashed)f(v)-5 b(alue,)36
+b(not)f(necessarily)630 651 y(the)c(\014le)e(that)i(app)s(ears)f
+(\014rst)f(in)g Fs($PATH)p Ft(.)630 784 y(If)36 b(the)h(`)p
+Fs(-a)p Ft(')g(option)f(is)g(used,)h Fs(type)f Ft(returns)f(all)h(of)h
+(the)g(places)f(that)h(con)m(tain)g(an)g(exe-)630 894
+y(cutable)c(named)g Fq(\014le)p Ft(.)49 b(This)32 b(includes)f(aliases)
+i(and)g(functions,)g(if)f(and)h(only)g(if)f(the)i(`)p
+Fs(-p)p Ft(')630 1003 y(option)c(is)f(not)i(also)f(used.)630
+1136 y(If)c(the)h(`)p Fs(-f)p Ft(')g(option)f(is)g(used,)h
+Fs(type)e Ft(do)s(es)i(not)g(attempt)g(to)h(\014nd)d(shell)g
+(functions,)h(as)h(with)630 1246 y(the)k Fs(command)d
+Ft(builtin.)630 1379 y(The)35 b(return)g(status)h(is)f(zero)h(if)f(an)m
+(y)h(of)g(the)g Fq(names)k Ft(are)c(found,)g(non-zero)g(if)f(none)h
+(are)630 1489 y(found.)150 1645 y Fs(typeset)870 1778
+y(typeset)46 b([-afFrxi])f([-p])i([)p Fj(name)11 b Fs([=)p
+Fj(value)g Fs(])43 b(...)o(])630 1911 y Ft(The)29 b Fs(typeset)f
+Ft(command)h(is)f(supplied)f(for)i(compatibilit)m(y)f(with)g(the)i
+(Korn)e(shell;)h(ho)m(w-)630 2021 y(ev)m(er,)i(it)f(has)g(b)s(een)g
+(deprecated)h(in)e(fa)m(v)m(or)j(of)e(the)h Fs(declare)d
+Ft(builtin)f(command.)150 2178 y Fs(ulimit)870 2311 y(ulimit)46
+b([-acdflmnpstuvSH])d([)p Fj(limit)11 b Fs(])630 2444
+y(ulimit)25 b Ft(pro)m(vides)g(con)m(trol)i(o)m(v)m(er)h(the)f
+(resources)f(a)m(v)-5 b(ailable)26 b(to)h(pro)s(cesses)f(started)h(b)m
+(y)g(the)630 2553 y(shell,)g(on)h(systems)g(that)h(allo)m(w)f(suc)m(h)g
+(con)m(trol.)40 b(If)28 b(an)g(option)g(is)f(giv)m(en,)i(it)e(is)h(in)m
+(terpreted)630 2663 y(as)j(follo)m(ws:)630 2819 y Fs(-S)384
+b Ft(Change)30 b(and)g(rep)s(ort)g(the)g(soft)h(limit)d(asso)s(ciated)j
+(with)e(a)i(resource.)630 2976 y Fs(-H)384 b Ft(Change)30
+b(and)g(rep)s(ort)g(the)g(hard)g(limit)e(asso)s(ciated)j(with)e(a)i
+(resource.)630 3133 y Fs(-a)384 b Ft(All)29 b(curren)m(t)h(limits)e
+(are)j(rep)s(orted.)630 3289 y Fs(-c)384 b Ft(The)30
+b(maxim)m(um)f(size)h(of)h(core)g(\014les)e(created.)630
+3446 y Fs(-d)384 b Ft(The)30 b(maxim)m(um)f(size)h(of)h(a)g(pro)s
+(cess's)f(data)h(segmen)m(t.)630 3602 y Fs(-f)384 b Ft(The)30
+b(maxim)m(um)f(size)h(of)h(\014les)e(created)j(b)m(y)e(the)g(shell.)630
+3759 y Fs(-l)384 b Ft(The)30 b(maxim)m(um)f(size)h(that)h(ma)m(y)g(b)s
+(e)f(lo)s(c)m(k)m(ed)h(in)m(to)f(memory)-8 b(.)630 3915
+y Fs(-m)384 b Ft(The)30 b(maxim)m(um)f(residen)m(t)h(set)h(size.)630
+4072 y Fs(-n)384 b Ft(The)30 b(maxim)m(um)f(n)m(um)m(b)s(er)g(of)i(op)s
+(en)e(\014le)h(descriptors.)630 4228 y Fs(-p)384 b Ft(The)30
+b(pip)s(e)e(bu\013er)i(size.)630 4385 y Fs(-s)384 b Ft(The)30
+b(maxim)m(um)f(stac)m(k)j(size.)630 4542 y Fs(-t)384
+b Ft(The)30 b(maxim)m(um)f(amoun)m(t)i(of)f(cpu)g(time)g(in)f(seconds.)
+630 4698 y Fs(-u)384 b Ft(The)30 b(maxim)m(um)f(n)m(um)m(b)s(er)g(of)i
+(pro)s(cesses)f(a)m(v)-5 b(ailable)30 b(to)h(a)f(single)g(user.)630
+4855 y Fs(-v)384 b Ft(The)29 b(maxim)m(um)g(amoun)m(t)h(of)g(virtual)e
+(memory)i(a)m(v)-5 b(ailable)29 b(to)h(the)g(pro)s(cess.)630
+5011 y(If)j Fq(limit)g Ft(is)g(giv)m(en,)h(it)f(is)g(the)h(new)f(v)-5
+b(alue)33 b(of)g(the)h(sp)s(eci\014ed)e(resource;)j(the)f(sp)s(ecial)e
+Fq(limit)630 5121 y Ft(v)-5 b(alues)26 b Fs(hard)p Ft(,)h
+Fs(soft)p Ft(,)g(and)g Fs(unlimited)d Ft(stand)j(for)g(the)g(curren)m
+(t)g(hard)f(limit,)g(the)h(curren)m(t)630 5230 y(soft)35
+b(limit,)f(and)h(no)f(limit,)g(resp)s(ectiv)m(ely)-8
+b(.)54 b(Otherwise,)35 b(the)g(curren)m(t)g(v)-5 b(alue)34
+b(of)h(the)h(soft)630 5340 y(limit)i(for)i(the)h(sp)s(eci\014ed)e
+(resource)i(is)e(prin)m(ted,)j(unless)d(the)h(`)p Fs(-H)p
+Ft(')h(option)e(is)h(supplied.)p eop
+%%Page: 50 56
+50 55 bop 150 -116 a Ft(50)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(When)e(setting)g(new)f(limits,)f(if)h(neither)g(`)p
+Fs(-H)p Ft(')g(nor)h(`)p Fs(-S)p Ft(')f(is)g(supplied,)f(b)s(oth)h(the)
+h(hard)f(and)630 408 y(soft)37 b(limits)d(are)j(set.)60
+b(If)36 b(no)g(option)g(is)g(giv)m(en,)i(then)e(`)p Fs(-f)p
+Ft(')h(is)e(assumed.)59 b(V)-8 b(alues)36 b(are)h(in)630
+518 y(1024-b)m(yte)27 b(incremen)m(ts,)f(except)f(for)f(`)p
+Fs(-t)p Ft(',)i(whic)m(h)d(is)h(in)f(seconds,)j(`)p Fs(-p)p
+Ft(',)g(whic)m(h)d(is)g(in)h(units)630 628 y(of)31 b(512-b)m(yte)h(blo)
+s(c)m(ks,)e(and)g(`)p Fs(-n)p Ft(')g(and)g(`)p Fs(-u)p
+Ft(',)h(whic)m(h)e(are)h(unscaled)g(v)-5 b(alues.)630
+757 y(The)34 b(return)g(status)h(is)e(zero)j(unless)d(an)h(in)m(v)-5
+b(alid)33 b(option)h(or)g(argumen)m(t)i(is)d(supplied,)g(or)630
+866 y(an)d(error)g(o)s(ccurs)g(while)f(setting)h(a)h(new)f(limit.)150
+1015 y Fs(unalias)870 1144 y(unalias)46 b([-a])g([)p
+Fj(name)57 b Fs(...)47 b(])630 1273 y Ft(Remo)m(v)m(e)39
+b(eac)m(h)f Fq(name)k Ft(from)36 b(the)h(list)f(of)h(aliases.)59
+b(If)36 b(`)p Fs(-a)p Ft(')h(is)f(supplied,)g(all)f(aliases)i(are)630
+1383 y(remo)m(v)m(ed.)42 b(Aliases)29 b(are)i(describ)s(ed)d(in)h
+(Section)i(6.6)g([Aliases],)f(page)h(71.)150 1624 y Fr(4.3)68
+b(The)45 b(Set)g(Builtin)275 1862 y Ft(This)28 b(builtin)f(is)i(so)i
+(complicated)f(that)h(it)f(deserv)m(es)h(its)f(o)m(wn)g(section.)150
+2011 y Fs(set)870 2140 y(set)47 b([--abefhkmnptuvxBCHP])42
+b([-o)47 b Fj(option)11 b Fs(])45 b([)p Fj(argument)56
+b Fs(...)o(])630 2269 y Ft(If)31 b(no)h(options)g(or)f(argumen)m(ts)i
+(are)f(supplied,)d Fs(set)i Ft(displa)m(ys)f(the)i(names)g(and)g(v)-5
+b(alues)31 b(of)630 2379 y(all)39 b(shell)f(v)-5 b(ariables)38
+b(and)h(functions,)i(sorted)f(according)f(to)i(the)f(curren)m(t)f(lo)s
+(cale,)j(in)d(a)630 2488 y(format)31 b(that)g(ma)m(y)g(b)s(e)e(reused)h
+(as)h(input.)630 2617 y(When)e(options)f(are)h(supplied,)d(they)j(set)h
+(or)f(unset)f(shell)f(attributes.)40 b(Options,)28 b(if)g(sp)s(ec-)630
+2727 y(i\014ed,)h(ha)m(v)m(e)j(the)e(follo)m(wing)f(meanings:)630
+2875 y Fs(-a)384 b Ft(Mark)32 b(v)-5 b(ariables)31 b(and)g(function)g
+(whic)m(h)g(are)h(mo)s(di\014ed)e(or)i(created)h(for)f(ex-)1110
+2985 y(p)s(ort)e(to)h(the)f(en)m(vironmen)m(t)g(of)h(subsequen)m(t)f
+(commands.)630 3134 y Fs(-b)384 b Ft(Cause)44 b(the)h(status)g(of)f
+(terminated)g(bac)m(kground)h(jobs)f(to)h(b)s(e)f(rep)s(orted)1110
+3243 y(immediately)-8 b(,)27 b(rather)g(than)f(b)s(efore)h(prin)m(ting)
+e(the)i(next)g(primary)f(prompt.)630 3392 y Fs(-e)384
+b Ft(Exit)36 b(immediately)f(if)g(a)i(simple)d(command)i(\(see)i
+(Section)e(3.2.1)i([Simple)1110 3501 y(Commands],)31
+b(page)i(8\))f(exits)f(with)g(a)h(non-zero)g(status,)g(unless)e(the)i
+(com-)1110 3611 y(mand)f(that)h(fails)f(is)g(part)g(of)h(the)g(command)
+g(list)e(immediately)g(follo)m(wing)1110 3720 y(a)41
+b Fs(while)d Ft(or)j Fs(until)e Ft(k)m(eyw)m(ord,)k(part)d(of)g(the)h
+(test)g(in)e(an)h Fs(if)g Ft(statemen)m(t,)1110 3830
+y(part)33 b(of)h(a)g Fs(&&)f Ft(or)g Fs(||)g Ft(list,)g(or)g(if)g(the)g
+(command's)h(return)e(status)i(is)e(b)s(eing)1110 3940
+y(in)m(v)m(erted)e(using)e Fs(!)p Ft(.)40 b(A)30 b(trap)f(on)h
+Fs(ERR)p Ft(,)f(if)g(set,)h(is)f(executed)i(b)s(efore)e(the)h(shell)
+1110 4049 y(exits.)630 4198 y Fs(-f)384 b Ft(Disable)29
+b(\014le)h(name)g(generation)h(\(globbing\).)630 4346
+y Fs(-h)384 b Ft(Lo)s(cate)33 b(and)e(remem)m(b)s(er)h(\(hash\))g
+(commands)f(as)h(they)g(are)g(lo)s(ok)m(ed)g(up)f(for)1110
+4456 y(execution.)41 b(This)28 b(option)i(is)g(enabled)f(b)m(y)h
+(default.)630 4605 y Fs(-k)384 b Ft(All)32 b(argumen)m(ts)i(in)e(the)i
+(form)f(of)g(assignmen)m(t)g(statemen)m(ts)j(are)d(placed)g(in)1110
+4714 y(the)38 b(en)m(vironmen)m(t)f(for)h(a)g(command,)h(not)f(just)f
+(those)i(that)f(precede)g(the)1110 4824 y(command)30
+b(name.)630 4972 y Fs(-m)384 b Ft(Job)30 b(con)m(trol)h(is)e(enabled)h
+(\(see)h(Chapter)f(7)g([Job)h(Con)m(trol],)f(page)h(79\).)630
+5121 y Fs(-n)384 b Ft(Read)21 b(commands)f(but)g(do)h(not)g(execute)h
+(them;)i(this)c(ma)m(y)h(b)s(e)f(used)g(to)h(c)m(hec)m(k)1110
+5230 y(a)42 b(script)f(for)h(syn)m(tax)g(errors.)75 b(This)40
+b(option)h(is)g(ignored)g(b)m(y)h(in)m(teractiv)m(e)1110
+5340 y(shells.)p eop
+%%Page: 51 57
+51 56 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(51)630 299 y Fs(-o)30 b Fj(option-name)1110
+408 y Ft(Set)h(the)f(option)g(corresp)s(onding)e(to)j
+Fq(option-name)5 b Ft(:)1110 581 y Fs(allexport)1590
+690 y Ft(Same)30 b(as)h Fs(-a)p Ft(.)1110 862 y Fs(braceexpand)1590
+972 y Ft(Same)f(as)h Fs(-B)p Ft(.)1110 1144 y Fs(emacs)240
+b Ft(Use)25 b(an)f Fs(emacs)p Ft(-st)m(yle)g(line)e(editing)h(in)m
+(terface)i(\(see)h(Chapter)e(8)1590 1254 y([Command)30
+b(Line)f(Editing],)g(page)i(83\).)1110 1426 y Fs(errexit)144
+b Ft(Same)30 b(as)h Fs(-e)p Ft(.)1110 1598 y Fs(errtrace)96
+b Ft(Same)30 b(as)h Fs(-E)p Ft(.)1110 1771 y Fs(functrace)1590
+1880 y Ft(Same)f(as)h Fs(-T)p Ft(.)1110 2052 y Fs(hashall)144
+b Ft(Same)30 b(as)h Fs(-h)p Ft(.)1110 2225 y Fs(histexpand)1590
+2334 y Ft(Same)f(as)h Fs(-H)p Ft(.)1110 2506 y Fs(history)144
+b Ft(Enable)38 b(command)h(history)-8 b(,)41 b(as)e(describ)s(ed)e(in)h
+(Section)h(9.1)1590 2616 y([Bash)e(History)f(F)-8 b(acilities],)37
+b(page)g(109.)60 b(This)35 b(option)h(is)f(on)1590 2725
+y(b)m(y)30 b(default)g(in)f(in)m(teractiv)m(e)i(shells.)1110
+2898 y Fs(ignoreeof)1590 3007 y Ft(An)f(in)m(teractiv)m(e)h(shell)e
+(will)f(not)i(exit)g(up)s(on)f(reading)h(EOF.)1110 3180
+y Fs(keyword)144 b Ft(Same)30 b(as)h Fs(-k)p Ft(.)1110
+3352 y Fs(monitor)144 b Ft(Same)30 b(as)h Fs(-m)p Ft(.)1110
+3524 y Fs(noclobber)1590 3634 y Ft(Same)f(as)h Fs(-C)p
+Ft(.)1110 3806 y Fs(noexec)192 b Ft(Same)30 b(as)h Fs(-n)p
+Ft(.)1110 3978 y Fs(noglob)192 b Ft(Same)30 b(as)h Fs(-f)p
+Ft(.)1110 4150 y Fs(nolog)240 b Ft(Curren)m(tly)29 b(ignored.)1110
+4322 y Fs(notify)192 b Ft(Same)30 b(as)h Fs(-b)p Ft(.)1110
+4495 y Fs(nounset)144 b Ft(Same)30 b(as)h Fs(-u)p Ft(.)1110
+4667 y Fs(onecmd)192 b Ft(Same)30 b(as)h Fs(-t)p Ft(.)1110
+4839 y Fs(physical)96 b Ft(Same)30 b(as)h Fs(-P)p Ft(.)1110
+5011 y Fs(pipefail)96 b Ft(If)44 b(set,)k(the)d(return)e(v)-5
+b(alue)44 b(of)g(a)h(pip)s(eline)40 b(is)k(the)g(v)-5
+b(alue)44 b(of)1590 5121 y(the)33 b(last)g(\(righ)m(tmost\))h(command)f
+(to)h(exit)f(with)f(a)h(non-zero)1590 5230 y(status,)28
+b(or)f(zero)g(if)e(all)h(commands)g(in)f(the)i(pip)s(eline)c(exit)k
+(suc-)1590 5340 y(cessfully)-8 b(.)39 b(This)29 b(option)h(is)f
+(disabled)f(b)m(y)j(default.)p eop
+%%Page: 52 58
+52 57 bop 150 -116 a Ft(52)2572 b(Bash)31 b(Reference)g(Man)m(ual)1110
+299 y Fs(posix)240 b Ft(Change)36 b(the)g(b)s(eha)m(vior)f(of)h(Bash)g
+(where)f(the)h(default)f(op)s(er-)1590 408 y(ation)c(di\013ers)e(from)h
+(the)h Fl(posix)f Ft(1003.2)k(standard)c(to)h(matc)m(h)1590
+518 y(the)44 b(standard)f(\(see)h(Section)g(6.11)h([Bash)f(POSIX)e(Mo)s
+(de],)1590 628 y(page)35 b(76\).)55 b(This)33 b(is)g(in)m(tended)h(to)h
+(mak)m(e)h(Bash)e(b)s(eha)m(v)m(e)i(as)f(a)1590 737 y(strict)30
+b(sup)s(erset)f(of)i(that)g(standard.)1110 906 y Fs(privileged)1590
+1015 y Ft(Same)f(as)h Fs(-p)p Ft(.)1110 1184 y Fs(verbose)144
+b Ft(Same)30 b(as)h Fs(-v)p Ft(.)1110 1353 y Fs(vi)384
+b Ft(Use)31 b(a)g Fs(vi)p Ft(-st)m(yle)f(line)f(editing)g(in)m
+(terface.)1110 1521 y Fs(xtrace)192 b Ft(Same)30 b(as)h
+Fs(-x)p Ft(.)630 1690 y Fs(-p)384 b Ft(T)-8 b(urn)33
+b(on)h(privileged)e(mo)s(de.)51 b(In)34 b(this)f(mo)s(de,)i(the)f
+Fs($BASH_ENV)e Ft(and)h Fs($ENV)1110 1799 y Ft(\014les)j(are)i(not)g
+(pro)s(cessed,)h(shell)d(functions)g(are)i(not)f(inherited)f(from)h
+(the)1110 1909 y(en)m(vironmen)m(t,)e(and)e(the)h Fs(SHELLOPTS)e
+Ft(v)-5 b(ariable,)33 b(if)g(it)h(app)s(ears)f(in)g(the)h(en-)1110
+2019 y(vironmen)m(t,)c(is)f(ignored.)40 b(If)29 b(the)i(shell)d(is)h
+(started)i(with)e(the)h(e\013ectiv)m(e)i(user)1110 2128
+y(\(group\))e(id)f(not)h(equal)g(to)g(the)g(real)g(user)f(\(group\))i
+(id,)e(and)g(the)h Fs(-p)f Ft(option)1110 2238 y(is)39
+b(not)h(supplied,)g(these)g(actions)h(are)f(tak)m(en)h(and)f(the)g
+(e\013ectiv)m(e)i(user)d(id)1110 2347 y(is)c(set)i(to)h(the)e(real)g
+(user)g(id.)57 b(If)36 b(the)h Fs(-p)f Ft(option)f(is)h(supplied)d(at)k
+(startup,)1110 2457 y(the)29 b(e\013ectiv)m(e)i(user)e(id)f(is)g(not)i
+(reset.)40 b(T)-8 b(urning)28 b(this)g(option)g(o\013)i(causes)g(the)
+1110 2567 y(e\013ectiv)m(e)d(user)e(and)g(group)g(ids)g(to)h(b)s(e)f
+(set)h(to)h(the)f(real)f(user)g(and)g(group)g(ids.)630
+2735 y Fs(-t)384 b Ft(Exit)30 b(after)h(reading)e(and)h(executing)g
+(one)h(command.)630 2904 y Fs(-u)384 b Ft(T)-8 b(reat)38
+b(unset)e(v)-5 b(ariables)35 b(as)j(an)e(error)h(when)e(p)s(erforming)g
+(parameter)i(ex-)1110 3013 y(pansion.)57 b(An)36 b(error)f(message)j
+(will)33 b(b)s(e)j(written)f(to)i(the)g(standard)e(error,)1110
+3123 y(and)30 b(a)h(non-in)m(teractiv)m(e)g(shell)d(will)g(exit.)630
+3292 y Fs(-v)384 b Ft(Prin)m(t)29 b(shell)g(input)f(lines)h(as)i(they)f
+(are)h(read.)630 3460 y Fs(-x)384 b Ft(Prin)m(t)81 b(a)i(trace)h(of)e
+(simple)e(commands,)96 b Fs(\\)p Ft(fBfor)p Fs(\\)p Ft(fP)81
+b(commands,)1110 3570 y Fs(\\)p Ft(fBcase)p Fs(\\)p Ft(fP)50
+b(commands,)55 b Fs(\\)p Ft(fBselect)p Fs(\\)p Ft(fP)50
+b(commands,)55 b(and)50 b(arithmetic)1110 3679 y Fs(\\)p
+Ft(fBfor)p Fs(\\)p Ft(fP)31 b(commands)g(and)g(their)g(argumen)m(ts)h
+(or)f(asso)s(ciated)h(w)m(ord)f(lists)1110 3789 y(after)k(they)g(are)g
+(expanded)f(and)h(b)s(efore)f(they)h(are)g(executed.)55
+b(The)34 b(v)-5 b(alue)1110 3898 y(of)34 b(the)g Fs(PS4)f
+Ft(v)-5 b(ariable)33 b(is)g(expanded)h(and)f(the)h(resultan)m(t)g(v)-5
+b(alue)33 b(is)g(prin)m(ted)1110 4008 y(b)s(efore)d(the)h(command)f
+(and)f(its)h(expanded)g(argumen)m(ts.)630 4177 y Fs(-B)384
+b Ft(The)41 b(shell)e(will)f(p)s(erform)i(brace)h(expansion)f(\(see)i
+(Section)f(3.5.1)h([Brace)1110 4286 y(Expansion],)29
+b(page)i(17\).)42 b(This)29 b(option)h(is)f(on)h(b)m(y)h(default.)630
+4455 y Fs(-C)384 b Ft(Prev)m(en)m(t)25 b(output)e(redirection)f(using)g
+(`)p Fs(>)p Ft(',)j(`)p Fs(>&)p Ft(',)g(and)e(`)p Fs(<>)p
+Ft(')g(from)h(o)m(v)m(erwriting)1110 4564 y(existing)29
+b(\014les.)630 4733 y Fs(-E)384 b Ft(If)39 b(set,)j(an)m(y)e(trap)f(on)
+g Fs(ERR)g Ft(is)f(inherited)f(b)m(y)i(shell)f(functions,)i(command)
+1110 4843 y(substitutions,)33 b(and)g(commands)g(executed)i(in)e(a)h
+(subshell)d(en)m(vironmen)m(t.)1110 4952 y(The)f Fs(ERR)f
+Ft(trap)i(is)e(normally)g(not)h(inherited)e(in)h(suc)m(h)h(cases.)630
+5121 y Fs(-H)384 b Ft(Enable)37 b(`)p Fs(!)p Ft(')i(st)m(yle)g(history)
+e(substitution)f(\(see)j(Section)g(9.3)g([History)f(In-)1110
+5230 y(teraction],)g(page)e(111\).)57 b(This)33 b(option)i(is)f(on)h(b)
+m(y)h(default)e(for)h(in)m(teractiv)m(e)1110 5340 y(shells.)p
+eop
+%%Page: 53 59
+53 58 bop 150 -116 a Ft(Chapter)30 b(4:)41 b(Shell)28
+b(Builtin)g(Commands)2069 b(53)630 299 y Fs(-P)384 b
+Ft(If)43 b(set,)k(do)c(not)g(follo)m(w)f(sym)m(b)s(olic)g(links)e(when)
+i(p)s(erforming)f(commands)1110 408 y(suc)m(h)29 b(as)h
+Fs(cd)f Ft(whic)m(h)f(c)m(hange)i(the)g(curren)m(t)f(directory)-8
+b(.)41 b(The)28 b(ph)m(ysical)h(direc-)1110 518 y(tory)34
+b(is)f(used)g(instead.)51 b(By)34 b(default,)g(Bash)g(follo)m(ws)f(the)
+h(logical)f(c)m(hain)h(of)1110 628 y(directories)i(when)f(p)s
+(erforming)g(commands)h(whic)m(h)f(c)m(hange)j(the)f(curren)m(t)1110
+737 y(directory)-8 b(.)1110 874 y(F)g(or)31 b(example,)f(if)f(`)p
+Fs(/usr/sys)p Ft(')f(is)h(a)h(sym)m(b)s(olic)f(link)f(to)i(`)p
+Fs(/usr/local/sys)p Ft(')1110 984 y(then:)1350 1121 y
+Fs($)47 b(cd)h(/usr/sys;)d(echo)i($PWD)1350 1230 y(/usr/sys)1350
+1340 y($)g(cd)h(..;)f(pwd)1350 1449 y(/usr)1110 1586
+y Ft(If)30 b Fs(set)f(-P)h Ft(is)g(on,)g(then:)1350 1723
+y Fs($)47 b(cd)h(/usr/sys;)d(echo)i($PWD)1350 1833 y(/usr/local/sys)
+1350 1943 y($)g(cd)h(..;)f(pwd)1350 2052 y(/usr/local)630
+2216 y(-T)384 b Ft(If)31 b(set,)h(an)m(y)f(trap)g(on)g
+Fs(DEBUG)e Ft(is)h(inherited)f(b)m(y)i(shell)e(functions,)h(command)
+1110 2326 y(substitutions,)j(and)g(commands)g(executed)i(in)e(a)h
+(subshell)d(en)m(vironmen)m(t.)1110 2436 y(The)f Fs(DEBUG)f
+Ft(trap)h(is)f(normally)g(not)i(inherited)d(in)h(suc)m(h)h(cases.)630
+2600 y Fs(--)384 b Ft(If)31 b(no)h(argumen)m(ts)f(follo)m(w)g(this)g
+(option,)g(then)g(the)h(p)s(ositional)e(parameters)1110
+2710 y(are)k(unset.)49 b(Otherwise,)33 b(the)h(p)s(ositional)d
+(parameters)j(are)g(set)g(to)g(the)g Fq(ar-)1110 2819
+y(gumen)m(ts)p Ft(,)d(ev)m(en)g(if)e(some)i(of)g(them)f(b)s(egin)f
+(with)g(a)i(`)p Fs(-)p Ft('.)630 2983 y Fs(-)432 b Ft(Signal)43
+b(the)i(end)f(of)h(options,)j(cause)d(all)f(remaining)e
+Fq(argumen)m(ts)49 b Ft(to)d(b)s(e)1110 3093 y(assigned)37
+b(to)i(the)f(p)s(ositional)e(parameters.)65 b(The)37
+b(`)p Fs(-x)p Ft(')h(and)g(`)p Fs(-v)p Ft(')g(options)1110
+3203 y(are)25 b(turned)e(o\013.)40 b(If)24 b(there)h(are)g(no)f
+(argumen)m(ts,)i(the)f(p)s(ositional)e(parameters)1110
+3312 y(remain)29 b(unc)m(hanged.)630 3477 y(Using)d(`)p
+Fs(+)p Ft(')i(rather)f(than)g(`)p Fs(-)p Ft(')g(causes)h(these)f
+(options)g(to)h(b)s(e)e(turned)g(o\013.)40 b(The)27 b(options)g(can)630
+3586 y(also)35 b(b)s(e)g(used)f(up)s(on)g(in)m(v)m(o)s(cation)h(of)g
+(the)g(shell.)54 b(The)34 b(curren)m(t)h(set)h(of)f(options)g(ma)m(y)h
+(b)s(e)630 3696 y(found)29 b(in)g Fs($-)p Ft(.)630 3833
+y(The)43 b(remaining)f(N)h Fq(argumen)m(ts)48 b Ft(are)c(p)s(ositional)
+d(parameters)j(and)f(are)h(assigned,)i(in)630 3942 y(order,)30
+b(to)h Fs($1)p Ft(,)f Fs($2)p Ft(,)36 b(.)22 b(.)g(.)42
+b Fs($N)p Ft(.)e(The)30 b(sp)s(ecial)f(parameter)i Fs(#)f
+Ft(is)f(set)i(to)g(N.)630 4079 y(The)f(return)f(status)i(is)e(alw)m(a)m
+(ys)i(zero)g(unless)e(an)h(in)m(v)-5 b(alid)28 b(option)i(is)f
+(supplied.)150 4349 y Fr(4.4)68 b(Sp)t(ecial)45 b(Builtins)275
+4598 y Ft(F)-8 b(or)25 b(historical)e(reasons,)j(the)e
+Fl(posix)g Ft(1003.2)j(standard)d(has)g(classi\014ed)f(sev)m(eral)i
+(builtin)c(commands)150 4707 y(as)37 b Fm(sp)-5 b(e)g(cial)p
+Ft(.)60 b(When)36 b(Bash)h(is)f(executing)g(in)f Fl(posix)h
+Ft(mo)s(de,)i(the)f(sp)s(ecial)e(builtins)d(di\013er)k(from)g(other)150
+4817 y(builtin)27 b(commands)j(in)f(three)i(resp)s(ects:)199
+4956 y(1.)61 b(Sp)s(ecial)29 b(builtins)d(are)31 b(found)e(b)s(efore)h
+(shell)f(functions)g(during)f(command)i(lo)s(okup.)199
+5093 y(2.)61 b(If)30 b(a)h(sp)s(ecial)e(builtin)e(returns)i(an)h(error)
+g(status,)h(a)g(non-in)m(teractiv)m(e)g(shell)d(exits.)199
+5230 y(3.)61 b(Assignmen)m(t)29 b(statemen)m(ts)i(preceding)e(the)g
+(command)g(sta)m(y)i(in)d(e\013ect)j(in)d(the)i(shell)d(en)m(vironmen)m
+(t)330 5340 y(after)k(the)f(command)h(completes.)p eop
+%%Page: 54 60
+54 59 bop 150 -116 a Ft(54)2572 b(Bash)31 b(Reference)g(Man)m(ual)275
+299 y(When)36 b(Bash)g(is)g(not)g(executing)h(in)e Fl(posix)g
+Ft(mo)s(de,)j(these)f(builtins)c(b)s(eha)m(v)m(e)k(no)f(di\013eren)m
+(tly)f(than)150 408 y(the)c(rest)f(of)h(the)f(Bash)h(builtin)26
+b(commands.)41 b(The)30 b(Bash)g Fl(posix)g Ft(mo)s(de)g(is)f(describ)s
+(ed)f(in)h(Section)h(6.11)150 518 y([Bash)h(POSIX)e(Mo)s(de],)i(page)g
+(76.)275 653 y(These)f(are)g(the)h Fl(posix)f Ft(sp)s(ecial)f
+(builtins:)390 787 y Fs(break)46 b(:)i(.)f(continue)f(eval)g(exec)h
+(exit)g(export)f(readonly)f(return)h(set)390 897 y(shift)g(trap)h
+(unset)p eop
+%%Page: 55 61
+55 60 bop 150 -116 a Ft(Chapter)30 b(5:)41 b(Shell)28
+b(V)-8 b(ariables)2457 b(55)150 299 y Fo(5)80 b(Shell)55
+b(V)-13 b(ariables)275 525 y Ft(This)35 b(c)m(hapter)j(describ)s(es)d
+(the)i(shell)e(v)-5 b(ariables)36 b(that)i(Bash)f(uses.)61
+b(Bash)37 b(automatically)g(assigns)150 635 y(default)30
+b(v)-5 b(alues)29 b(to)i(a)g(n)m(um)m(b)s(er)e(of)i(v)-5
+b(ariables.)150 887 y Fr(5.1)68 b(Bourne)45 b(Shell)g(V)-11
+b(ariables)275 1130 y Ft(Bash)36 b(uses)g(certain)g(shell)e(v)-5
+b(ariables)35 b(in)g(the)i(same)g(w)m(a)m(y)g(as)f(the)h(Bourne)f
+(shell.)57 b(In)35 b(some)i(cases,)150 1240 y(Bash)31
+b(assigns)e(a)i(default)e(v)-5 b(alue)30 b(to)h(the)g(v)-5
+b(ariable.)150 1396 y Fs(CDPATH)192 b Ft(A)39 b(colon-separated)h(list)
+d(of)i(directories)f(used)h(as)g(a)g(searc)m(h)h(path)e(for)h(the)g
+Fs(cd)f Ft(builtin)630 1505 y(command.)150 1662 y Fs(HOME)288
+b Ft(The)23 b(curren)m(t)h(user's)f(home)g(directory;)j(the)e(default)f
+(for)g(the)h Fs(cd)f Ft(builtin)d(command.)38 b(The)630
+1771 y(v)-5 b(alue)36 b(of)g(this)f(v)-5 b(ariable)35
+b(is)h(also)g(used)f(b)m(y)h(tilde)f(expansion)g(\(see)j(Section)e
+(3.5.2)i([Tilde)630 1881 y(Expansion],)29 b(page)i(18\).)150
+2037 y Fs(IFS)336 b Ft(A)25 b(list)g(of)g(c)m(haracters)i(that)f
+(separate)g(\014elds;)g(used)f(when)f(the)i(shell)d(splits)h(w)m(ords)g
+(as)i(part)630 2147 y(of)31 b(expansion.)150 2303 y Fs(MAIL)288
+b Ft(If)26 b(this)e(parameter)j(is)e(set)h(to)h(a)g(\014lename)e(and)g
+(the)h Fs(MAILPATH)e Ft(v)-5 b(ariable)25 b(is)g(not)h(set,)i(Bash)630
+2413 y(informs)h(the)h(user)g(of)g(the)h(arriv)-5 b(al)29
+b(of)h(mail)f(in)g(the)i(sp)s(eci\014ed)e(\014le.)150
+2569 y Fs(MAILPATH)96 b Ft(A)33 b(colon-separated)h(list)e(of)h
+(\014lenames)g(whic)m(h)f(the)h(shell)e(p)s(erio)s(dically)f(c)m(hec)m
+(ks)k(for)f(new)630 2678 y(mail.)58 b(Eac)m(h)37 b(list)e(en)m(try)i
+(can)g(sp)s(ecify)e(the)i(message)h(that)f(is)f(prin)m(ted)f(when)g
+(new)h(mail)630 2788 y(arriv)m(es)28 b(in)g(the)h(mail)e(\014le)h(b)m
+(y)h(separating)f(the)h(\014le)f(name)h(from)f(the)h(message)h(with)d
+(a)j(`)p Fs(?)p Ft('.)630 2898 y(When)i(used)f(in)g(the)h(text)i(of)e
+(the)g(message,)i Fs($_)e Ft(expands)f(to)i(the)f(name)g(of)h(the)f
+(curren)m(t)630 3007 y(mail)d(\014le.)150 3163 y Fs(OPTARG)192
+b Ft(The)30 b(v)-5 b(alue)30 b(of)g(the)h(last)f(option)g(argumen)m(t)h
+(pro)s(cessed)f(b)m(y)g(the)g Fs(getopts)f Ft(builtin.)150
+3320 y Fs(OPTIND)192 b Ft(The)30 b(index)f(of)h(the)h(last)f(option)g
+(argumen)m(t)h(pro)s(cessed)f(b)m(y)g(the)g Fs(getopts)f
+Ft(builtin.)150 3476 y Fs(PATH)288 b Ft(A)32 b(colon-separated)h(list)e
+(of)h(directories)f(in)f(whic)m(h)h(the)h(shell)e(lo)s(oks)i(for)g
+(commands.)45 b(A)630 3586 y(zero-length)d(\(n)m(ull\))f(directory)g
+(name)h(in)f(the)h(v)-5 b(alue)41 b(of)h Fs(PATH)f Ft(indicates)g(the)h
+(curren)m(t)630 3695 y(directory)-8 b(.)48 b(A)33 b(n)m(ull)d
+(directory)j(name)f(ma)m(y)i(app)s(ear)e(as)h(t)m(w)m(o)h(adjacen)m(t)g
+(colons,)f(or)g(as)g(an)630 3805 y(initial)28 b(or)i(trailing)e(colon.)
+150 3961 y Fs(PS1)336 b Ft(The)35 b(primary)e(prompt)i(string.)54
+b(The)35 b(default)g(v)-5 b(alue)34 b(is)h(`)p Fs(\\s-\\v\\$)28
+b Ft('.)56 b(See)36 b(Section)f(6.9)630 4071 y([Prin)m(ting)26
+b(a)i(Prompt],)g(page)h(75,)g(for)e(the)h(complete)g(list)f(of)g(escap)
+s(e)h(sequences)g(that)h(are)630 4180 y(expanded)h(b)s(efore)g
+Fs(PS1)f Ft(is)g(displa)m(y)m(ed.)150 4336 y Fs(PS2)336
+b Ft(The)30 b(secondary)g(prompt)g(string.)40 b(The)29
+b(default)h(v)-5 b(alue)30 b(is)f(`)p Fs(>)h Ft('.)150
+4589 y Fr(5.2)68 b(Bash)45 b(V)-11 b(ariables)275 4832
+y Ft(These)36 b(v)-5 b(ariables)36 b(are)i(set)f(or)h(used)e(b)m(y)h
+(Bash,)i(but)d(other)i(shells)d(do)i(not)g(normally)f(treat)i(them)150
+4941 y(sp)s(ecially)-8 b(.)275 5074 y(A)24 b(few)g(v)-5
+b(ariables)22 b(used)i(b)m(y)f(Bash)i(are)f(describ)s(ed)e(in)h
+(di\013eren)m(t)g(c)m(hapters:)38 b(v)-5 b(ariables)23
+b(for)h(con)m(trolling)150 5184 y(the)31 b(job)f(con)m(trol)g
+(facilities)f(\(see)i(Section)f(7.3)i([Job)e(Con)m(trol)g(V)-8
+b(ariables],)30 b(page)i(82\).)150 5340 y Fs(BASH)288
+b Ft(The)30 b(full)e(pathname)i(used)g(to)h(execute)h(the)e(curren)m(t)
+g(instance)g(of)h(Bash.)p eop
+%%Page: 56 62
+56 61 bop 150 -116 a Ft(56)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fs(BASH_ARGC)630 408 y Ft(An)f(arra)m(y)h(v)-5
+b(ariable)29 b(whose)h(v)-5 b(alues)30 b(are)h(the)f(n)m(um)m(b)s(er)f
+(of)i(parameters)g(in)e(eac)m(h)i(frame)g(of)630 518
+y(the)26 b(curren)m(t)f(bash)g(execution)h(call)f(stac)m(k.)41
+b(The)25 b(n)m(um)m(b)s(er)g(of)h(parameters)g(to)g(the)g(curren)m(t)
+630 628 y(subroutine)h(\(shell)h(function)h(or)g(script)f(executed)j
+(with)d Fs(.)h Ft(or)h Fs(source)p Ft(\))e(is)g(at)i(the)g(top)g(of)630
+737 y(the)h(stac)m(k.)42 b(When)30 b(a)g(subroutine)f(is)g(executed,)i
+(the)g(n)m(um)m(b)s(er)e(of)h(parameters)h(passed)f(is)630
+847 y(pushed)f(on)m(to)i Fs(BASH_ARGC)p Ft(.)150 1017
+y Fs(BASH_ARGV)630 1127 y Ft(An)24 b(arra)m(y)g(v)-5
+b(ariable)23 b(con)m(taining)h(all)f(of)h(the)h(parameters)f(in)f(the)h
+(curren)m(t)g(bash)g(execution)630 1236 y(call)33 b(stac)m(k.)53
+b(The)34 b(\014nal)f(parameter)h(of)g(the)g(last)g(subroutine)e(call)h
+(is)g(at)i(the)f(top)h(of)f(the)630 1346 y(stac)m(k;)28
+b(the)c(\014rst)f(parameter)i(of)f(the)g(initial)e(call)h(is)g(at)i
+(the)f(b)s(ottom.)39 b(When)24 b(a)g(subroutine)630 1456
+y(is)29 b(executed,)j(the)e(parameters)h(supplied)c(are)k(pushed)e(on)m
+(to)i Fs(BASH_ARGV)p Ft(.)150 1626 y Fs(BASH_COMMAND)630
+1736 y Ft(The)39 b(command)h(curren)m(tly)f(b)s(eing)f(executed)j(or)e
+(ab)s(out)h(to)g(b)s(e)f(executed,)44 b(unless)38 b(the)630
+1845 y(shell)f(is)h(executing)g(a)h(command)g(as)g(the)f(result)g(of)h
+(a)g(trap,)i(in)c(whic)m(h)g(case)j(it)e(is)g(the)630
+1955 y(command)30 b(executing)h(at)g(the)f(time)g(of)h(the)g(trap.)150
+2125 y Fs(BASH_ENV)96 b Ft(If)28 b(this)f(v)-5 b(ariable)28
+b(is)f(set)i(when)f(Bash)g(is)g(in)m(v)m(ok)m(ed)h(to)g(execute)h(a)e
+(shell)f(script,)h(its)g(v)-5 b(alue)28 b(is)630 2235
+y(expanded)33 b(and)h(used)g(as)g(the)h(name)f(of)g(a)h(startup)f
+(\014le)f(to)i(read)f(b)s(efore)g(executing)h(the)630
+2345 y(script.)40 b(See)30 b(Section)g(6.2)i([Bash)f(Startup)e(Files],)
+h(page)h(65.)150 2515 y Fs(BASH_EXECUTION_STRING)630
+2625 y Ft(The)f(command)g(argumen)m(t)h(to)g(the)g(`)p
+Fs(-c)p Ft(')f(in)m(v)m(o)s(cation)g(option.)150 2795
+y Fs(BASH_LINENO)630 2905 y Ft(An)38 b(arra)m(y)h(v)-5
+b(ariable)37 b(whose)i(mem)m(b)s(ers)e(are)i(the)g(line)e(n)m(um)m(b)s
+(ers)g(in)g(source)i(\014les)e(corre-)630 3014 y(sp)s(onding)h(to)j
+(eac)m(h)g(mem)m(b)s(er)e(of)i Fq(FUNCNAME)p Ft(.)g Fs
+(${BASH_LINENO[$i]})35 b Ft(is)k(the)i(line)630 3124
+y(n)m(um)m(b)s(er)34 b(in)f(the)i(source)g(\014le)f(where)g
+Fs(${FUNCNAME[$i)27 b(+)j(1]})k Ft(w)m(as)h(called.)54
+b(The)34 b(corre-)630 3233 y(sp)s(onding)d(source)j(\014le)f(name)h(is)
+f Fs(${BASH_SOURCE[$i)26 b(+)k(1]})p Ft(.)50 b(Use)35
+b Fs(LINENO)d Ft(to)i(obtain)630 3343 y(the)d(curren)m(t)f(line)e(n)m
+(um)m(b)s(er.)150 3513 y Fs(BASH_REMATCH)630 3623 y Ft(An)43
+b(arra)m(y)i(v)-5 b(ariable)42 b(whose)i(mem)m(b)s(ers)f(are)h
+(assigned)f(b)m(y)g(the)h(`)p Fs(=~)p Ft(')g(binary)e(op)s(erator)630
+3733 y(to)37 b(the)f Fs([[)g Ft(conditional)f(command)h(\(see)h
+(Section)f(3.2.4.2)j([Conditional)34 b(Constructs],)630
+3842 y(page)h(10\).)52 b(The)33 b(elemen)m(t)i(with)d(index)g(0)j(is)e
+(the)h(p)s(ortion)e(of)i(the)g(string)f(matc)m(hing)h(the)630
+3952 y(en)m(tire)28 b(regular)f(expression.)39 b(The)27
+b(elemen)m(t)i(with)d(index)h Fq(n)g Ft(is)g(the)h(p)s(ortion)f(of)h
+(the)g(string)630 4061 y(matc)m(hing)i(the)h Fq(n)p Ft(th)f(paren)m
+(thesized)g(sub)s(expression.)38 b(This)28 b(v)-5 b(ariable)29
+b(is)h(read-only)-8 b(.)150 4232 y Fs(BASH_SOURCE)630
+4341 y Ft(An)24 b(arra)m(y)h(v)-5 b(ariable)24 b(whose)g(mem)m(b)s(ers)
+g(are)h(the)g(source)f(\014lenames)g(corresp)s(onding)e(to)k(the)630
+4451 y(elemen)m(ts)31 b(in)e(the)h Fs(FUNCNAME)e Ft(arra)m(y)j(v)-5
+b(ariable.)150 4622 y Fs(BASH_SUBSHELL)630 4731 y Ft(Incremen)m(ted)34
+b(b)m(y)h(one)f(eac)m(h)i(time)e(a)g(subshell)e(or)i(subshell)d(en)m
+(vironmen)m(t)j(is)f(spa)m(wned.)630 4841 y(The)d(initial)d(v)-5
+b(alue)30 b(is)g(0.)150 5011 y Fs(BASH_VERSINFO)630 5121
+y Ft(A)36 b(readonly)f(arra)m(y)h(v)-5 b(ariable)35 b(\(see)h(Section)g
+(6.7)h([Arra)m(ys],)h(page)e(72\))h(whose)f(mem)m(b)s(ers)630
+5230 y(hold)31 b(v)m(ersion)h(information)e(for)i(this)f(instance)h(of)
+h(Bash.)46 b(The)32 b(v)-5 b(alues)31 b(assigned)h(to)h(the)630
+5340 y(arra)m(y)e(mem)m(b)s(ers)e(are)i(as)g(follo)m(ws:)p
+eop
+%%Page: 57 63
+57 62 bop 150 -116 a Ft(Chapter)30 b(5:)41 b(Shell)28
+b(V)-8 b(ariables)2457 b(57)630 299 y Fs(BASH_VERSINFO[0])1110
+408 y Ft(The)30 b(ma)5 b(jor)30 b(v)m(ersion)g(n)m(um)m(b)s(er)f(\(the)
+i Fq(release)5 b Ft(\).)630 582 y Fs(BASH_VERSINFO[1])1110
+692 y Ft(The)30 b(minor)f(v)m(ersion)h(n)m(um)m(b)s(er)f(\(the)i
+Fq(v)m(ersion)p Ft(\).)630 865 y Fs(BASH_VERSINFO[2])1110
+975 y Ft(The)f(patc)m(h)h(lev)m(el.)630 1148 y Fs(BASH_VERSINFO[3])1110
+1258 y Ft(The)f(build)d(v)m(ersion.)630 1431 y Fs(BASH_VERSINFO[4])1110
+1541 y Ft(The)j(release)h(status)f(\(e.g.,)j Fq(b)s(eta1)7
+b Ft(\).)630 1714 y Fs(BASH_VERSINFO[5])1110 1824 y Ft(The)30
+b(v)-5 b(alue)30 b(of)g Fs(MACHTYPE)p Ft(.)150 1998 y
+Fs(BASH_VERSION)630 2107 y Ft(The)g(v)m(ersion)g(n)m(um)m(b)s(er)f(of)h
+(the)h(curren)m(t)f(instance)g(of)h(Bash.)150 2281 y
+Fs(COLUMNS)144 b Ft(Used)36 b(b)m(y)h(the)f Fs(select)f
+Ft(builtin)e(command)k(to)g(determine)e(the)i(terminal)e(width)g(when)
+630 2390 y(prin)m(ting)28 b(selection)i(lists.)40 b(Automatically)30
+b(set)h(up)s(on)d(receipt)j(of)f(a)h Fs(SIGWINCH)p Ft(.)150
+2564 y Fs(COMP_CWORD)630 2673 y Ft(An)38 b(index)f(in)m(to)h
+Fs(${COMP_WORDS})d Ft(of)k(the)g(w)m(ord)f(con)m(taining)g(the)g
+(curren)m(t)g(cursor)g(p)s(o-)630 2783 y(sition.)70 b(This)39
+b(v)-5 b(ariable)39 b(is)g(a)m(v)-5 b(ailable)40 b(only)g(in)f(shell)g
+(functions)g(in)m(v)m(ok)m(ed)i(b)m(y)f(the)h(pro-)630
+2892 y(grammable)35 b(completion)f(facilities)g(\(see)i(Section)f(8.6)h
+([Programmable)f(Completion],)630 3002 y(page)c(103\).)150
+3176 y Fs(COMP_LINE)630 3285 y Ft(The)38 b(curren)m(t)h(command)f
+(line.)64 b(This)36 b(v)-5 b(ariable)38 b(is)g(a)m(v)-5
+b(ailable)38 b(only)f(in)h(shell)e(functions)630 3395
+y(and)25 b(external)g(commands)g(in)m(v)m(ok)m(ed)g(b)m(y)g(the)h
+(programmable)e(completion)h(facilities)e(\(see)630 3504
+y(Section)30 b(8.6)i([Programmable)e(Completion],)f(page)i(103\).)150
+3678 y Fs(COMP_POINT)630 3787 y Ft(The)25 b(index)f(of)i(the)g(curren)m
+(t)f(cursor)g(p)s(osition)f(relativ)m(e)i(to)g(the)g(b)s(eginning)d(of)
+i(the)h(curren)m(t)630 3897 y(command.)40 b(If)27 b(the)h(curren)m(t)g
+(cursor)g(p)s(osition)e(is)h(at)h(the)g(end)g(of)g(the)g(curren)m(t)g
+(command,)630 4007 y(the)i(v)-5 b(alue)29 b(of)h(this)f(v)-5
+b(ariable)29 b(is)g(equal)g(to)i Fs(${#COMP_LINE})p Ft(.)37
+b(This)28 b(v)-5 b(ariable)29 b(is)g(a)m(v)-5 b(ailable)630
+4116 y(only)35 b(in)f(shell)g(functions)g(and)h(external)g(commands)h
+(in)m(v)m(ok)m(ed)g(b)m(y)f(the)h(programmable)630 4226
+y(completion)30 b(facilities)e(\(see)k(Section)e(8.6)h([Programmable)f
+(Completion],)g(page)h(103\).)150 4399 y Fs(COMP_WORDBREAKS)630
+4509 y Ft(The)e(set)i(of)e(c)m(haracters)j(that)e(the)g(Readline)e
+(library)g(treats)i(as)g(w)m(ord)g(separators)g(when)630
+4619 y(p)s(erforming)h(w)m(ord)i(completion.)49 b(If)33
+b Fs(COMP_WORDBREAKS)c Ft(is)k(unset,)h(it)e(loses)i(its)e(sp)s(ecial)
+630 4728 y(prop)s(erties,)d(ev)m(en)i(if)e(it)h(is)g(subsequen)m(tly)f
+(reset.)150 4902 y Fs(COMP_WORDS)630 5011 y Ft(An)36
+b(arra)m(y)g(v)-5 b(ariable)35 b(consisting)g(of)h(the)g(individual)31
+b(w)m(ords)36 b(in)e(the)i(curren)m(t)g(command)630 5121
+y(line.)86 b(This)44 b(v)-5 b(ariable)45 b(is)g(a)m(v)-5
+b(ailable)45 b(only)g(in)g(shell)f(functions)h(in)m(v)m(ok)m(ed)h(b)m
+(y)g(the)g(pro-)630 5230 y(grammable)35 b(completion)f(facilities)g
+(\(see)i(Section)f(8.6)h([Programmable)f(Completion],)630
+5340 y(page)c(103\).)p eop
+%%Page: 58 64
+58 63 bop 150 -116 a Ft(58)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fs(COMPREPLY)630 408 y Ft(An)37 b(arra)m(y)h(v)-5
+b(ariable)36 b(from)h(whic)m(h)f(Bash)h(reads)g(the)h(p)s(ossible)c
+(completions)j(generated)630 518 y(b)m(y)c(a)g(shell)f(function)g(in)m
+(v)m(ok)m(ed)h(b)m(y)g(the)g(programmable)g(completion)f(facilit)m(y)g
+(\(see)i(Sec-)630 628 y(tion)c(8.6)h([Programmable)f(Completion],)g
+(page)h(103\).)150 774 y Fs(DIRSTACK)96 b Ft(An)26 b(arra)m(y)h(v)-5
+b(ariable)26 b(con)m(taining)g(the)h(curren)m(t)f(con)m(ten)m(ts)j(of)e
+(the)f(directory)h(stac)m(k.)41 b(Direc-)630 883 y(tories)32
+b(app)s(ear)g(in)f(the)i(stac)m(k)h(in)d(the)i(order)f(they)h(are)g
+(displa)m(y)m(ed)e(b)m(y)h(the)h Fs(dirs)e Ft(builtin.)630
+993 y(Assigning)d(to)j(mem)m(b)s(ers)f(of)g(this)f(arra)m(y)h(v)-5
+b(ariable)29 b(ma)m(y)i(b)s(e)e(used)h(to)h(mo)s(dify)d(directories)630
+1103 y(already)40 b(in)f(the)i(stac)m(k,)k(but)40 b(the)h
+Fs(pushd)e Ft(and)h Fs(popd)f Ft(builtins)e(m)m(ust)k(b)s(e)e(used)h
+(to)i(add)630 1212 y(and)37 b(remo)m(v)m(e)h(directories.)61
+b(Assignmen)m(t)36 b(to)i(this)e(v)-5 b(ariable)36 b(will)f(not)i(c)m
+(hange)i(the)e(cur-)630 1322 y(ren)m(t)c(directory)-8
+b(.)46 b(If)32 b Fs(DIRSTACK)e Ft(is)h(unset,)h(it)g(loses)g(its)g(sp)s
+(ecial)f(prop)s(erties,)g(ev)m(en)i(if)e(it)h(is)630
+1431 y(subsequen)m(tly)d(reset.)150 1577 y Fs(EMACS)240
+b Ft(If)31 b(Bash)h(\014nds)d(this)i(v)-5 b(ariable)30
+b(in)g(the)i(en)m(vironmen)m(t)f(when)f(the)i(shell)d(starts)j(with)e
+(v)-5 b(alue)630 1687 y(`)p Fs(t)p Ft(',)38 b(it)d(assumes)h(that)g
+(the)h(shell)d(is)h(running)e(in)i(an)h(emacs)g(shell)f(bu\013er)g(and)
+g(disables)630 1797 y(line)29 b(editing.)150 1943 y Fs(EUID)288
+b Ft(The)30 b(n)m(umeric)f(e\013ectiv)m(e)j(user)e(id)f(of)h(the)h
+(curren)m(t)f(user.)40 b(This)29 b(v)-5 b(ariable)29
+b(is)g(readonly)-8 b(.)150 2089 y Fs(FCEDIT)192 b Ft(The)30
+b(editor)g(used)f(as)i(a)g(default)e(b)m(y)i(the)f(`)p
+Fs(-e)p Ft(')g(option)g(to)h(the)g Fs(fc)f Ft(builtin)d(command.)150
+2235 y Fs(FIGNORE)144 b Ft(A)35 b(colon-separated)h(list)e(of)i
+(su\016xes)e(to)i(ignore)f(when)f(p)s(erforming)f(\014lename)i(comple-)
+630 2345 y(tion.)j(A)25 b(\014le)f(name)h(whose)f(su\016x)g(matc)m(hes)
+i(one)f(of)g(the)g(en)m(tries)f(in)g Fs(FIGNORE)e Ft(is)i(excluded)630
+2454 y(from)30 b(the)g(list)f(of)i(matc)m(hed)g(\014le)f(names.)40
+b(A)31 b(sample)e(v)-5 b(alue)30 b(is)g(`)p Fs(.o:~)p
+Ft(')150 2600 y Fs(FUNCNAME)96 b Ft(An)35 b(arra)m(y)i(v)-5
+b(ariable)34 b(con)m(taining)h(the)h(names)g(of)g(all)e(shell)g
+(functions)h(curren)m(tly)f(in)h(the)630 2710 y(execution)g(call)g
+(stac)m(k.)57 b(The)34 b(elemen)m(t)i(with)e(index)g(0)i(is)e(the)h
+(name)h(of)f(an)m(y)h(curren)m(tly-)630 2819 y(executing)h(shell)e
+(function.)57 b(The)37 b(b)s(ottom-most)g(elemen)m(t)g(is)f
+Fs(")p Ft(main)p Fs(")p Ft(.)57 b(This)35 b(v)-5 b(ariable)630
+2929 y(exists)32 b(only)g(when)g(a)h(shell)e(function)g(is)h
+(executing.)48 b(Assignmen)m(ts)32 b(to)h Fs(FUNCNAME)e
+Ft(ha)m(v)m(e)630 3039 y(no)36 b(e\013ect)h(and)e(return)f(an)i(error)f
+(status.)57 b(If)36 b Fs(FUNCNAME)d Ft(is)i(unset,)i(it)e(loses)g(its)g
+(sp)s(ecial)630 3148 y(prop)s(erties,)29 b(ev)m(en)i(if)e(it)h(is)g
+(subsequen)m(tly)f(reset.)150 3294 y Fs(GLOBIGNORE)630
+3404 y Ft(A)38 b(colon-separated)h(list)e(of)h(patterns)g(de\014ning)e
+(the)i(set)g(of)h(\014lenames)e(to)h(b)s(e)g(ignored)630
+3513 y(b)m(y)31 b(\014lename)f(expansion.)42 b(If)31
+b(a)h(\014lename)e(matc)m(hed)i(b)m(y)f(a)g(\014lename)g(expansion)f
+(pattern)630 3623 y(also)i(matc)m(hes)h(one)f(of)g(the)g(patterns)g(in)
+e Fs(GLOBIGNORE)p Ft(,)g(it)h(is)g(remo)m(v)m(ed)i(from)e(the)h(list)f
+(of)630 3733 y(matc)m(hes.)150 3879 y Fs(GROUPS)192 b
+Ft(An)36 b(arra)m(y)g(v)-5 b(ariable)35 b(con)m(taining)g(the)h(list)f
+(of)h(groups)g(of)g(whic)m(h)e(the)j(curren)m(t)e(user)h(is)f(a)630
+3988 y(mem)m(b)s(er.)47 b(Assignmen)m(ts)32 b(to)h Fs(GROUPS)e
+Ft(ha)m(v)m(e)j(no)f(e\013ect)h(and)e(return)g(an)g(error)g(status.)48
+b(If)630 4098 y Fs(GROUPS)29 b Ft(is)g(unset,)h(it)g(loses)g(its)g(sp)s
+(ecial)f(prop)s(erties,)g(ev)m(en)i(if)e(it)h(is)g(subsequen)m(tly)f
+(reset.)150 4244 y Fs(histchars)630 4354 y Ft(Up)d(to)g(three)g(c)m
+(haracters)i(whic)m(h)c(con)m(trol)j(history)d(expansion,)i(quic)m(k)g
+(substitution,)f(and)630 4463 y(tok)m(enization)k(\(see)h(Section)e
+(9.3)i([History)e(In)m(teraction],)i(page)g(111\).)41
+b(The)29 b(\014rst)e(c)m(harac-)630 4573 y(ter)j(is)e(the)h
+Fq(history)f(expansion)g Ft(c)m(haracter,)k(that)e(is,)e(the)i(c)m
+(haracter)h(whic)m(h)c(signi\014es)h(the)630 4682 y(start)d(of)f(a)h
+(history)e(expansion,)i(normally)d(`)p Fs(!)p Ft('.)39
+b(The)24 b(second)g(c)m(haracter)i(is)d(the)h(c)m(haracter)630
+4792 y(whic)m(h)35 b(signi\014es)f(`quic)m(k)i(substitution')e(when)h
+(seen)h(as)g(the)g(\014rst)f(c)m(haracter)j(on)e(a)g(line,)630
+4902 y(normally)25 b(`)p Fs(^)p Ft('.)39 b(The)26 b(optional)g(third)e
+(c)m(haracter)k(is)d(the)i(c)m(haracter)h(whic)m(h)d(indicates)g(that)
+630 5011 y(the)34 b(remainder)e(of)i(the)g(line)e(is)g(a)i(commen)m(t)h
+(when)e(found)f(as)i(the)g(\014rst)f(c)m(haracter)i(of)f(a)630
+5121 y(w)m(ord,)i(usually)d(`)p Fs(#)p Ft('.)55 b(The)34
+b(history)g(commen)m(t)i(c)m(haracter)h(causes)e(history)f
+(substitution)630 5230 y(to)27 b(b)s(e)f(skipp)s(ed)e(for)j(the)f
+(remaining)f(w)m(ords)h(on)h(the)f(line.)38 b(It)27 b(do)s(es)f(not)h
+(necessarily)e(cause)630 5340 y(the)31 b(shell)d(parser)i(to)h(treat)g
+(the)g(rest)g(of)f(the)h(line)d(as)j(a)g(commen)m(t.)p
+eop
+%%Page: 59 65
+59 64 bop 150 -116 a Ft(Chapter)30 b(5:)41 b(Shell)28
+b(V)-8 b(ariables)2457 b(59)150 299 y Fs(HISTCMD)144
+b Ft(The)35 b(history)g(n)m(um)m(b)s(er,)h(or)f(index)f(in)h(the)h
+(history)e(list,)i(of)g(the)g(curren)m(t)f(command.)56
+b(If)630 408 y Fs(HISTCMD)28 b Ft(is)g(unset,)i(it)f(loses)h(its)f(sp)s
+(ecial)f(prop)s(erties,)h(ev)m(en)h(if)f(it)g(is)g(subsequen)m(tly)f
+(reset.)150 578 y Fs(HISTCONTROL)630 688 y Ft(A)40 b(colon-separated)h
+(list)e(of)h(v)-5 b(alues)39 b(con)m(trolling)g(ho)m(w)h(commands)g
+(are)h(sa)m(v)m(ed)g(on)f(the)630 797 y(history)28 b(list.)39
+b(If)28 b(the)h(list)f(of)h(v)-5 b(alues)28 b(includes)e(`)p
+Fs(ignorespace)p Ft(',)h(lines)g(whic)m(h)h(b)s(egin)f(with)630
+907 y(a)39 b(space)g(c)m(haracter)i(are)e(not)g(sa)m(v)m(ed)g(in)f(the)
+h(history)e(list.)64 b(A)39 b(v)-5 b(alue)38 b(of)h(`)p
+Fs(ignoredups)p Ft(')630 1017 y(causes)34 b(lines)f(whic)m(h)g(matc)m
+(h)i(the)f(previous)e(history)h(en)m(try)i(to)g(not)f(b)s(e)f(sa)m(v)m
+(ed.)53 b(A)34 b(v)-5 b(alue)630 1126 y(of)32 b(`)p Fs(ignoreboth)p
+Ft(')d(is)i(shorthand)f(for)i(`)p Fs(ignorespace)p Ft(')d(and)i(`)p
+Fs(ignoredups)p Ft('.)42 b(A)32 b(v)-5 b(alue)31 b(of)630
+1236 y(`)p Fs(erasedups)p Ft(')g(causes)i(all)f(previous)g(lines)f
+(matc)m(hing)i(the)g(curren)m(t)g(line)e(to)j(b)s(e)e(remo)m(v)m(ed)630
+1345 y(from)42 b(the)h(history)e(list)h(b)s(efore)g(that)h(line)e(is)h
+(sa)m(v)m(ed.)78 b(An)m(y)43 b(v)-5 b(alue)42 b(not)h(in)e(the)i(ab)s
+(o)m(v)m(e)630 1455 y(list)33 b(is)h(ignored.)52 b(If)34
+b Fs(HISTCONTROL)e Ft(is)h(unset,)j(or)e(do)s(es)h(not)g(include)d(a)j
+(v)-5 b(alid)33 b(v)-5 b(alue,)35 b(all)630 1564 y(lines)28
+b(read)i(b)m(y)g(the)g(shell)e(parser)i(are)g(sa)m(v)m(ed)h(on)f(the)g
+(history)f(list,)g(sub)5 b(ject)30 b(to)g(the)g(v)-5
+b(alue)630 1674 y(of)42 b Fs(HISTIGNORE)p Ft(.)73 b(The)42
+b(second)g(and)g(subsequen)m(t)f(lines)f(of)j(a)f(m)m(ulti-line)d(comp)
+s(ound)630 1784 y(command)33 b(are)h(not)g(tested,)i(and)d(are)h(added)
+f(to)h(the)g(history)f(regardless)g(of)h(the)f(v)-5 b(alue)630
+1893 y(of)31 b Fs(HISTCONTROL)p Ft(.)150 2063 y Fs(HISTFILE)96
+b Ft(The)27 b(name)h(of)g(the)g(\014le)f(to)i(whic)m(h)e(the)h(command)
+f(history)g(is)g(sa)m(v)m(ed.)41 b(The)27 b(default)g(v)-5
+b(alue)630 2172 y(is)29 b(`)p Fs(~/.bash_history)p Ft('.)150
+2342 y Fs(HISTFILESIZE)630 2452 y Ft(The)d(maxim)m(um)e(n)m(um)m(b)s
+(er)h(of)h(lines)f(con)m(tained)h(in)f(the)h(history)f(\014le.)38
+b(When)26 b(this)f(v)-5 b(ariable)630 2561 y(is)24 b(assigned)h(a)h(v)
+-5 b(alue,)26 b(the)g(history)e(\014le)h(is)f(truncated,)j(if)d
+(necessary)-8 b(,)28 b(to)e(con)m(tain)f(no)h(more)630
+2671 y(than)34 b(that)h(n)m(um)m(b)s(er)d(of)j(lines.)50
+b(The)34 b(history)f(\014le)g(is)g(also)h(truncated)g(to)h(this)e(size)
+h(after)630 2781 y(writing)28 b(it)i(when)g(an)g(in)m(teractiv)m(e)h
+(shell)e(exits.)40 b(The)30 b(default)g(v)-5 b(alue)30
+b(is)f(500.)150 2950 y Fs(HISTIGNORE)630 3060 y Ft(A)k(colon-separated)
+g(list)e(of)i(patterns)f(used)g(to)h(decide)f(whic)m(h)f(command)h
+(lines)f(should)630 3169 y(b)s(e)h(sa)m(v)m(ed)h(on)g(the)f(history)g
+(list.)45 b(Eac)m(h)33 b(pattern)g(is)e(anc)m(hored)i(at)g(the)f(b)s
+(eginning)e(of)j(the)630 3279 y(line)41 b(and)g(m)m(ust)h(matc)m(h)h
+(the)g(complete)g(line)d(\(no)j(implicit)c(`)p Fs(*)p
+Ft(')j(is)f(app)s(ended\).)75 b(Eac)m(h)630 3389 y(pattern)42
+b(is)f(tested)h(against)g(the)g(line)e(after)i(the)g(c)m(hec)m(ks)h(sp)
+s(eci\014ed)d(b)m(y)i Fs(HISTCONTROL)630 3498 y Ft(are)37
+b(applied.)57 b(In)36 b(addition)f(to)i(the)g(normal)f(shell)e(pattern)
+j(matc)m(hing)g(c)m(haracters,)j(`)p Fs(&)p Ft(')630
+3608 y(matc)m(hes)d(the)f(previous)f(history)g(line.)55
+b(`)p Fs(&)p Ft(')36 b(ma)m(y)h(b)s(e)e(escap)s(ed)h(using)f(a)h(bac)m
+(kslash;)j(the)630 3717 y(bac)m(kslash)33 b(is)g(remo)m(v)m(ed)i(b)s
+(efore)e(attempting)h(a)h(matc)m(h.)51 b(The)34 b(second)f(and)h
+(subsequen)m(t)630 3827 y(lines)c(of)j(a)g(m)m(ulti-line)c(comp)s(ound)
+i(command)h(are)h(not)f(tested,)i(and)e(are)g(added)g(to)h(the)630
+3937 y(history)c(regardless)h(of)h(the)f(v)-5 b(alue)30
+b(of)h Fs(HISTIGNORE)p Ft(.)630 4076 y Fs(HISTIGNORE)20
+b Ft(subsumes)g(the)j(function)e(of)i Fs(HISTCONTROL)p
+Ft(.)35 b(A)23 b(pattern)f(of)h(`)p Fs(&)p Ft(')g(is)e(iden)m(tical)630
+4186 y(to)26 b Fs(ignoredups)p Ft(,)e(and)h(a)h(pattern)g(of)f(`)p
+Fs([)31 b(]*)p Ft(')25 b(is)g(iden)m(tical)f(to)i Fs(ignorespace)p
+Ft(.)36 b(Com)m(bining)630 4295 y(these)30 b(t)m(w)m(o)h(patterns,)f
+(separating)f(them)h(with)e(a)i(colon,)g(pro)m(vides)e(the)i
+(functionalit)m(y)e(of)630 4405 y Fs(ignoreboth)p Ft(.)150
+4575 y Fs(HISTSIZE)96 b Ft(The)42 b(maxim)m(um)f(n)m(um)m(b)s(er)g(of)i
+(commands)e(to)j(remem)m(b)s(er)d(on)h(the)h(history)e(list.)75
+b(The)630 4684 y(default)30 b(v)-5 b(alue)29 b(is)h(500.)150
+4854 y Fs(HISTTIMEFORMAT)630 4963 y Ft(If)44 b(this)f(v)-5
+b(ariable)43 b(is)g(set)h(and)g(not)g(n)m(ull,)i(its)e(v)-5
+b(alue)43 b(is)g(used)h(as)g(a)h(format)f(string)f(for)630
+5073 y Fq(strftime)c Ft(to)c(prin)m(t)e(the)i(time)f(stamp)g(asso)s
+(ciated)h(with)f(eac)m(h)h(history)f(en)m(try)g(displa)m(y)m(ed)630
+5183 y(b)m(y)g(the)f Fs(history)f Ft(builtin.)47 b(If)33
+b(this)g(v)-5 b(ariable)32 b(is)h(set,)i(time)e(stamps)h(are)g(written)
+e(to)j(the)630 5292 y(history)29 b(\014le)h(so)g(they)h(ma)m(y)g(b)s(e)
+f(preserv)m(ed)g(across)h(shell)d(sessions.)p eop
+%%Page: 60 66
+60 65 bop 150 -116 a Ft(60)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fs(HOSTFILE)96 b Ft(Con)m(tains)38 b(the)g(name)g(of)h(a)g
+(\014le)e(in)g(the)h(same)h(format)g(as)f(`)p Fs(/etc/hosts)p
+Ft(')e(that)j(should)630 408 y(b)s(e)i(read)h(when)f(the)i(shell)d
+(needs)h(to)i(complete)g(a)f(hostname.)76 b(The)42 b(list)e(of)i(p)s
+(ossible)630 518 y(hostname)26 b(completions)e(ma)m(y)j(b)s(e)d(c)m
+(hanged)j(while)c(the)j(shell)e(is)g(running;)h(the)h(next)f(time)630
+628 y(hostname)37 b(completion)g(is)f(attempted)i(after)g(the)f(v)-5
+b(alue)36 b(is)h(c)m(hanged,)i(Bash)e(adds)g(the)630
+737 y(con)m(ten)m(ts)27 b(of)f(the)g(new)f(\014le)g(to)i(the)f
+(existing)e(list.)38 b(If)25 b Fs(HOSTFILE)f Ft(is)h(set,)i(but)e(has)h
+(no)f(v)-5 b(alue,)630 847 y(Bash)41 b(attempts)g(to)g(read)f(`)p
+Fs(/etc/hosts)p Ft(')f(to)i(obtain)f(the)g(list)f(of)i(p)s(ossible)d
+(hostname)630 956 y(completions.)i(When)30 b Fs(HOSTFILE)e
+Ft(is)i(unset,)g(the)g(hostname)h(list)e(is)g(cleared.)150
+1125 y Fs(HOSTNAME)96 b Ft(The)30 b(name)g(of)h(the)f(curren)m(t)h
+(host.)150 1294 y Fs(HOSTTYPE)96 b Ft(A)30 b(string)g(describing)e(the)
+i(mac)m(hine)g(Bash)h(is)e(running)f(on.)150 1462 y Fs(IGNOREEOF)630
+1572 y Ft(Con)m(trols)e(the)i(action)f(of)g(the)g(shell)e(on)i(receipt)
+g(of)g(an)g Fs(EOF)f Ft(c)m(haracter)i(as)g(the)f(sole)g(input.)630
+1681 y(If)j(set,)i(the)f(v)-5 b(alue)31 b(denotes)g(the)g(n)m(um)m(b)s
+(er)f(of)h(consecutiv)m(e)h Fs(EOF)e Ft(c)m(haracters)i(that)f(can)h(b)
+s(e)630 1791 y(read)40 b(as)f(the)h(\014rst)f(c)m(haracter)i(on)f(an)f
+(input)f(line)g(b)s(efore)h(the)h(shell)e(will)f(exit.)69
+b(If)39 b(the)630 1901 y(v)-5 b(ariable)36 b(exists)g(but)g(do)s(es)g
+(not)h(ha)m(v)m(e)h(a)g(n)m(umeric)d(v)-5 b(alue)36 b(\(or)i(has)e(no)h
+(v)-5 b(alue\))36 b(then)h(the)630 2010 y(default)30
+b(is)g(10.)43 b(If)30 b(the)h(v)-5 b(ariable)29 b(do)s(es)i(not)g
+(exist,)g(then)f Fs(EOF)g Ft(signi\014es)f(the)i(end)f(of)h(input)630
+2120 y(to)g(the)g(shell.)39 b(This)28 b(is)i(only)f(in)g(e\013ect)j
+(for)e(in)m(teractiv)m(e)h(shells.)150 2288 y Fs(INPUTRC)144
+b Ft(The)68 b(name)h(of)f(the)h(Readline)e(initialization)f(\014le,)77
+b(o)m(v)m(erriding)67 b(the)i(default)f(of)630 2398 y(`)p
+Fs(~/.inputrc)p Ft('.)150 2567 y Fs(LANG)288 b Ft(Used)28
+b(to)h(determine)e(the)h(lo)s(cale)f(category)j(for)e(an)m(y)h
+(category)h(not)e(sp)s(eci\014cally)d(selected)630 2676
+y(with)k(a)i(v)-5 b(ariable)29 b(starting)h(with)f Fs(LC_)p
+Ft(.)150 2845 y Fs(LC_ALL)192 b Ft(This)27 b(v)-5 b(ariable)27
+b(o)m(v)m(errides)i(the)g(v)-5 b(alue)28 b(of)h Fs(LANG)f
+Ft(and)g(an)m(y)h(other)g Fs(LC_)f Ft(v)-5 b(ariable)27
+b(sp)s(ecifying)630 2954 y(a)k(lo)s(cale)f(category)-8
+b(.)150 3123 y Fs(LC_COLLATE)630 3232 y Ft(This)36 b(v)-5
+b(ariable)36 b(determines)h(the)h(collation)f(order)g(used)g(when)f
+(sorting)h(the)h(results)f(of)630 3342 y(\014lename)e(expansion,)i(and)
+f(determines)f(the)i(b)s(eha)m(vior)e(of)h(range)h(expressions,)g
+(equiv-)630 3452 y(alence)e(classes,)h(and)f(collating)f(sequences)h
+(within)d(\014lename)i(expansion)g(and)g(pattern)630
+3561 y(matc)m(hing)c(\(see)i(Section)e(3.5.8)i([Filename)e(Expansion],)
+f(page)i(22\).)150 3730 y Fs(LC_CTYPE)96 b Ft(This)35
+b(v)-5 b(ariable)35 b(determines)g(the)i(in)m(terpretation)f(of)h(c)m
+(haracters)h(and)e(the)g(b)s(eha)m(vior)g(of)630 3839
+y(c)m(haracter)46 b(classes)f(within)d(\014lename)i(expansion)g(and)g
+(pattern)h(matc)m(hing)g(\(see)g(Sec-)630 3949 y(tion)30
+b(3.5.8)i([Filename)e(Expansion],)f(page)i(22\).)150
+4118 y Fs(LC_MESSAGES)630 4227 y Ft(This)24 b(v)-5 b(ariable)25
+b(determines)g(the)h(lo)s(cale)g(used)f(to)i(translate)f(double-quoted)
+f(strings)g(pre-)630 4337 y(ceded)31 b(b)m(y)f(a)h(`)p
+Fs($)p Ft(')f(\(see)h(Section)g(3.1.2.5)h([Lo)s(cale)f(T)-8
+b(ranslation],)30 b(page)h(7\).)150 4505 y Fs(LC_NUMERIC)630
+4615 y Ft(This)e(v)-5 b(ariable)29 b(determines)g(the)i(lo)s(cale)f
+(category)i(used)e(for)g(n)m(um)m(b)s(er)f(formatting.)150
+4784 y Fs(LINENO)192 b Ft(The)30 b(line)f(n)m(um)m(b)s(er)g(in)g(the)h
+(script)g(or)g(shell)e(function)i(curren)m(tly)f(executing.)150
+4952 y Fs(LINES)240 b Ft(Used)25 b(b)m(y)g(the)g Fs(select)e
+Ft(builtin)f(command)j(to)h(determine)e(the)h(column)f(length)g(for)h
+(prin)m(t-)630 5062 y(ing)30 b(selection)g(lists.)39
+b(Automatically)30 b(set)h(up)s(on)e(receipt)h(of)g(a)h
+Fs(SIGWINCH)p Ft(.)150 5230 y Fs(MACHTYPE)96 b Ft(A)26
+b(string)f(that)i(fully)d(describ)s(es)g(the)i(system)g(t)m(yp)s(e)h
+(on)f(whic)m(h)e(Bash)j(is)e(executing,)i(in)e(the)630
+5340 y(standard)30 b Fl(gnu)g Fq(cpu-compan)m(y-system)h
+Ft(format.)p eop
+%%Page: 61 67
+61 66 bop 150 -116 a Ft(Chapter)30 b(5:)41 b(Shell)28
+b(V)-8 b(ariables)2457 b(61)150 299 y Fs(MAILCHECK)630
+408 y Ft(Ho)m(w)28 b(often)g(\(in)f(seconds\))h(that)g(the)f(shell)f
+(should)g(c)m(hec)m(k)j(for)e(mail)f(in)g(the)i(\014les)f(sp)s
+(eci\014ed)630 518 y(in)i(the)i Fs(MAILPATH)e Ft(or)i
+Fs(MAIL)e Ft(v)-5 b(ariables.)41 b(The)30 b(default)g(is)f(60)j
+(seconds.)42 b(When)30 b(it)g(is)g(time)630 628 y(to)37
+b(c)m(hec)m(k)h(for)e(mail,)h(the)g(shell)d(do)s(es)i(so)h(b)s(efore)f
+(displa)m(ying)e(the)i(primary)f(prompt.)57 b(If)630
+737 y(this)36 b(v)-5 b(ariable)36 b(is)g(unset,)i(or)f(set)h(to)g(a)f
+(v)-5 b(alue)37 b(that)g(is)f(not)i(a)f(n)m(um)m(b)s(er)f(greater)i
+(than)f(or)630 847 y(equal)30 b(to)h(zero,)g(the)g(shell)e(disables)f
+(mail)h(c)m(hec)m(king.)150 1011 y Fs(OLDPWD)192 b Ft(The)30
+b(previous)f(w)m(orking)g(directory)h(as)h(set)g(b)m(y)f(the)h
+Fs(cd)e Ft(builtin.)150 1176 y Fs(OPTERR)192 b Ft(If)35
+b(set)i(to)f(the)h(v)-5 b(alue)35 b(1,)j(Bash)e(displa)m(ys)e(error)h
+(messages)i(generated)g(b)m(y)f(the)g Fs(getopts)630
+1285 y Ft(builtin)27 b(command.)150 1450 y Fs(OSTYPE)192
+b Ft(A)30 b(string)g(describing)e(the)i(op)s(erating)g(system)h(Bash)f
+(is)g(running)d(on.)150 1614 y Fs(PIPESTATUS)630 1724
+y Ft(An)c(arra)m(y)h(v)-5 b(ariable)22 b(\(see)j(Section)e(6.7)i([Arra)
+m(ys],)g(page)f(72\))h(con)m(taining)e(a)h(list)e(of)i(exit)f(sta-)630
+1833 y(tus)i(v)-5 b(alues)26 b(from)f(the)h(pro)s(cesses)g(in)e(the)i
+(most-recen)m(tly-executed)i(foreground)d(pip)s(eline)630
+1943 y(\(whic)m(h)k(ma)m(y)i(con)m(tain)g(only)f(a)g(single)f
+(command\).)150 2107 y Fs(POSIXLY_CORRECT)630 2217 y
+Ft(If)j(this)g(v)-5 b(ariable)32 b(is)g(in)f(the)i(en)m(vironmen)m(t)g
+(when)e Fs(bash)h Ft(starts,)i(the)f(shell)e(en)m(ters)j
+Fl(posix)630 2326 y Ft(mo)s(de)22 b(\(see)h(Section)f(6.11)i([Bash)e
+(POSIX)f(Mo)s(de],)k(page)e(76\))g(b)s(efore)f(reading)f(the)h(startup)
+630 2436 y(\014les,)31 b(as)g(if)g(the)g(`)p Fs(--posix)p
+Ft(')f(in)m(v)m(o)s(cation)h(option)g(had)g(b)s(een)g(supplied.)40
+b(If)31 b(it)g(is)f(set)i(while)630 2545 y(the)f(shell)d(is)i(running,)
+d Fs(bash)j Ft(enables)f Fl(posix)h Ft(mo)s(de,)g(as)h(if)e(the)i
+(command)870 2682 y Fs(set)47 b(-o)g(posix)630 2819 y
+Ft(had)30 b(b)s(een)f(executed.)150 2984 y Fs(PPID)288
+b Ft(The)30 b(pro)s(cess)g Fl(id)g Ft(of)h(the)f(shell's)f(paren)m(t)i
+(pro)s(cess.)40 b(This)29 b(v)-5 b(ariable)29 b(is)g(readonly)-8
+b(.)150 3148 y Fs(PROMPT_COMMAND)630 3258 y Ft(If)32
+b(set,)h(the)f(v)-5 b(alue)32 b(is)f(in)m(terpreted)g(as)h(a)h(command)
+f(to)h(execute)g(b)s(efore)f(the)g(prin)m(ting)e(of)630
+3367 y(eac)m(h)i(primary)c(prompt)h(\()p Fs($PS1)p Ft(\).)150
+3532 y Fs(PS3)336 b Ft(The)34 b(v)-5 b(alue)34 b(of)g(this)f(v)-5
+b(ariable)33 b(is)h(used)f(as)i(the)f(prompt)g(for)g(the)g
+Fs(select)f Ft(command.)52 b(If)630 3641 y(this)29 b(v)-5
+b(ariable)29 b(is)h(not)g(set,)i(the)e Fs(select)f Ft(command)h
+(prompts)f(with)g(`)p Fs(#?)h Ft(')150 3806 y Fs(PS4)336
+b Ft(The)33 b(v)-5 b(alue)33 b(is)g(the)h(prompt)f(prin)m(ted)f(b)s
+(efore)h(the)h(command)f(line)f(is)h(ec)m(ho)s(ed)h(when)f(the)630
+3915 y(`)p Fs(-x)p Ft(')23 b(option)g(is)g(set)h(\(see)g(Section)g(4.3)
+g([The)f(Set)h(Builtin],)f(page)h(50\).)40 b(The)23 b(\014rst)f(c)m
+(haracter)630 4025 y(of)34 b Fs(PS4)g Ft(is)f(replicated)h(m)m(ultiple)
+e(times,)j(as)f(necessary)-8 b(,)37 b(to)e(indicate)e(m)m(ultiple)f
+(lev)m(els)i(of)630 4134 y(indirection.)k(The)30 b(default)g(is)f(`)p
+Fs(+)h Ft('.)150 4299 y Fs(PWD)336 b Ft(The)30 b(curren)m(t)g(w)m
+(orking)g(directory)g(as)g(set)h(b)m(y)f(the)h Fs(cd)f
+Ft(builtin.)150 4463 y Fs(RANDOM)192 b Ft(Eac)m(h)30
+b(time)f(this)f(parameter)h(is)f(referenced,)i(a)f(random)g(in)m(teger)
+g(b)s(et)m(w)m(een)h(0)f(and)g(32767)630 4573 y(is)h(generated.)43
+b(Assigning)29 b(a)i(v)-5 b(alue)30 b(to)h(this)f(v)-5
+b(ariable)29 b(seeds)i(the)g(random)f(n)m(um)m(b)s(er)f(gen-)630
+4682 y(erator.)150 4847 y Fs(REPLY)240 b Ft(The)30 b(default)f(v)-5
+b(ariable)30 b(for)g(the)g Fs(read)g Ft(builtin.)150
+5011 y Fs(SECONDS)144 b Ft(This)39 b(v)-5 b(ariable)39
+b(expands)h(to)h(the)g(n)m(um)m(b)s(er)e(of)i(seconds)g(since)f(the)g
+(shell)f(w)m(as)i(started.)630 5121 y(Assignmen)m(t)h(to)h(this)f(v)-5
+b(ariable)41 b(resets)i(the)g(coun)m(t)g(to)g(the)g(v)-5
+b(alue)42 b(assigned,)j(and)d(the)630 5230 y(expanded)35
+b(v)-5 b(alue)35 b(b)s(ecomes)i(the)f(v)-5 b(alue)35
+b(assigned)g(plus)f(the)i(n)m(um)m(b)s(er)f(of)h(seconds)g(since)630
+5340 y(the)31 b(assignmen)m(t.)p eop
+%%Page: 62 68
+62 67 bop 150 -116 a Ft(62)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fs(SHELLOPTS)630 408 y Ft(A)g(colon-separated)g(list)e(of)i
+(enabled)e(shell)g(options.)40 b(Eac)m(h)31 b(w)m(ord)f(in)f(the)i
+(list)e(is)h(a)h(v)-5 b(alid)630 518 y(argumen)m(t)29
+b(for)g(the)g(`)p Fs(-o)p Ft(')g(option)f(to)i(the)f
+Fs(set)f Ft(builtin)e(command)j(\(see)g(Section)g(4.3)h([The)630
+628 y(Set)f(Builtin],)e(page)i(50\).)42 b(The)28 b(options)g(app)s
+(earing)f(in)g Fs(SHELLOPTS)f Ft(are)j(those)h(rep)s(orted)630
+737 y(as)g(`)p Fs(on)p Ft(')f(b)m(y)h(`)p Fs(set)g(-o)p
+Ft('.)40 b(If)29 b(this)g(v)-5 b(ariable)28 b(is)h(in)f(the)i(en)m
+(vironmen)m(t)f(when)g(Bash)h(starts)g(up,)630 847 y(eac)m(h)41
+b(shell)c(option)i(in)f(the)i(list)e(will)e(b)s(e)j(enabled)g(b)s
+(efore)g(reading)f(an)m(y)i(startup)f(\014les.)630 956
+y(This)29 b(v)-5 b(ariable)29 b(is)g(readonly)-8 b(.)150
+1116 y Fs(SHLVL)240 b Ft(Incremen)m(ted)21 b(b)m(y)g(one)g(eac)m(h)h
+(time)e(a)i(new)e(instance)g(of)h(Bash)g(is)f(started.)38
+b(This)19 b(is)h(in)m(tended)630 1225 y(to)31 b(b)s(e)f(a)h(coun)m(t)g
+(of)f(ho)m(w)h(deeply)e(y)m(our)h(Bash)h(shells)d(are)j(nested.)150
+1385 y Fs(TIMEFORMAT)630 1494 y Ft(The)f(v)-5 b(alue)31
+b(of)g(this)f(parameter)h(is)f(used)g(as)h(a)g(format)h(string)e(sp)s
+(ecifying)e(ho)m(w)j(the)g(tim-)630 1604 y(ing)36 b(information)e(for)j
+(pip)s(elines)c(pre\014xed)i(with)g(the)i Fs(time)e Ft(reserv)m(ed)i(w)
+m(ord)f(should)f(b)s(e)630 1714 y(displa)m(y)m(ed.)j(The)27
+b(`)p Fs(\045)p Ft(')h(c)m(haracter)h(in)m(tro)s(duces)d(an)i(escap)s
+(e)g(sequence)g(that)g(is)e(expanded)h(to)630 1823 y(a)37
+b(time)f(v)-5 b(alue)35 b(or)i(other)f(information.)57
+b(The)36 b(escap)s(e)g(sequences)h(and)e(their)h(meanings)630
+1933 y(are)31 b(as)f(follo)m(ws;)g(the)h(braces)f(denote)h(optional)f
+(p)s(ortions.)630 2092 y Fs(\045\045)384 b Ft(A)30 b(literal)f(`)p
+Fs(\045)p Ft('.)630 2252 y Fs(\045[)p Fj(p)11 b Fs(][l]R)85
+b Ft(The)30 b(elapsed)g(time)g(in)f(seconds.)630 2411
+y Fs(\045[)p Fj(p)11 b Fs(][l]U)85 b Ft(The)30 b(n)m(um)m(b)s(er)f(of)h
+(CPU)g(seconds)h(sp)s(en)m(t)f(in)f(user)g(mo)s(de.)630
+2570 y Fs(\045[)p Fj(p)11 b Fs(][l]S)85 b Ft(The)30 b(n)m(um)m(b)s(er)f
+(of)h(CPU)g(seconds)h(sp)s(en)m(t)f(in)f(system)h(mo)s(de.)630
+2730 y Fs(\045P)384 b Ft(The)30 b(CPU)g(p)s(ercen)m(tage,)i(computed)e
+(as)h(\(\045U)f Fs(+)g Ft(\045S\))g(/)h(\045R.)630 2889
+y(The)23 b(optional)h Fq(p)i Ft(is)d(a)h(digit)f(sp)s(ecifying)e(the)j
+(precision,)g(the)g(n)m(um)m(b)s(er)f(of)h(fractional)f(digits)630
+2999 y(after)36 b(a)f(decimal)g(p)s(oin)m(t.)54 b(A)35
+b(v)-5 b(alue)35 b(of)g(0)h(causes)g(no)f(decimal)f(p)s(oin)m(t)g(or)i
+(fraction)f(to)h(b)s(e)630 3108 y(output.)48 b(A)m(t)34
+b(most)f(three)g(places)g(after)g(the)g(decimal)f(p)s(oin)m(t)g(ma)m(y)
+i(b)s(e)e(sp)s(eci\014ed;)h(v)-5 b(alues)630 3218 y(of)31
+b Fq(p)h Ft(greater)g(than)e(3)h(are)f(c)m(hanged)h(to)g(3.)42
+b(If)29 b Fq(p)k Ft(is)c(not)i(sp)s(eci\014ed,)e(the)i(v)-5
+b(alue)29 b(3)i(is)f(used.)630 3352 y(The)54 b(optional)f
+Fs(l)h Ft(sp)s(eci\014es)f(a)i(longer)e(format,)61 b(including)51
+b(min)m(utes,)60 b(of)54 b(the)g(form)630 3462 y Fq(MM)10
+b Ft(m)p Fq(SS)p Ft(.)p Fq(FF)d Ft(s.)103 b(The)50 b(v)-5
+b(alue)51 b(of)g Fq(p)j Ft(determines)c(whether)g(or)h(not)h(the)f
+(fraction)g(is)630 3572 y(included.)630 3706 y(If)30
+b(this)f(v)-5 b(ariable)29 b(is)h(not)g(set,)i(Bash)e(acts)h(as)g(if)e
+(it)h(had)g(the)h(v)-5 b(alue)870 3841 y Fs
+($'\\nreal\\t\0453lR\\nuser\\t\0453)o(lU\\n)o(sys\\)o(t\0453)o(lS')630
+3975 y Ft(If)37 b(the)g(v)-5 b(alue)37 b(is)f(n)m(ull,)h(no)h(timing)d
+(information)h(is)g(displa)m(y)m(ed.)60 b(A)37 b(trailing)f(newline)f
+(is)630 4085 y(added)30 b(when)f(the)i(format)f(string)g(is)f(displa)m
+(y)m(ed.)150 4244 y Fs(TMOUT)240 b Ft(If)22 b(set)h(to)g(a)g(v)-5
+b(alue)22 b(greater)i(than)e(zero,)j Fs(TMOUT)d Ft(is)f(treated)j(as)e
+(the)h(default)f(timeout)g(for)h(the)630 4354 y Fs(read)31
+b Ft(builtin)e(\(see)k(Section)e(4.2)j([Bash)e(Builtins],)e(page)j
+(39\).)47 b(The)32 b Fs(select)e Ft(command)630 4463
+y(\(see)f(Section)g(3.2.4.2)h([Conditional)d(Constructs],)h(page)i
+(10\))f(terminates)f(if)g(input)e(do)s(es)630 4573 y(not)31
+b(arriv)m(e)f(after)h Fs(TMOUT)e Ft(seconds)h(when)f(input)g(is)g
+(coming)h(from)g(a)h(terminal.)630 4707 y(In)d(an)h(in)m(terativ)m(e)g
+(shell,)e(the)i(v)-5 b(alue)29 b(is)e(in)m(terpreted)h(as)h(the)g(n)m
+(um)m(b)s(er)f(of)h(seconds)f(to)i(w)m(ait)630 4817 y(for)i(input)e
+(after)j(issuing)d(the)i(primary)f(prompt)g(when)g(the)i(shell)d(is)i
+(in)m(teractiv)m(e.)47 b(Bash)630 4927 y(terminates)30
+b(after)h(that)g(n)m(um)m(b)s(er)e(of)i(seconds)f(if)f(input)g(do)s(es)
+h(not)g(arriv)m(e.)150 5086 y Fs(UID)336 b Ft(The)30
+b(n)m(umeric)f(real)h(user)g(id)f(of)h(the)h(curren)m(t)f(user.)40
+b(This)29 b(v)-5 b(ariable)29 b(is)g(readonly)-8 b(.)p
+eop
+%%Page: 63 69
+63 68 bop 150 -116 a Ft(Chapter)30 b(6:)41 b(Bash)30
+b(F)-8 b(eatures)2484 b(63)150 299 y Fo(6)80 b(Bash)54
+b(F)-13 b(eatures)275 537 y Ft(This)28 b(section)j(describ)s(es)d
+(features)j(unique)d(to)k(Bash.)150 798 y Fr(6.1)68 b(In)l(v)l(oking)46
+b(Bash)390 1017 y Fs(bash)h([long-opt])e([-ir])h
+([-abefhkmnptuvxdBCDHP])c([-o)47 b Fj(option)11 b Fs(])45
+b([-O)i Fj(shopt_option)11 b Fs(])44 b([)p Fj(ar-)390
+1127 y(gument)57 b Fs(...)o(])390 1236 y(bash)47 b([long-opt])e
+([-abefhkmnptuvxdBCDHP])c([-o)47 b Fj(option)11 b Fs(])46
+b([-O)g Fj(shopt_option)11 b Fs(])44 b(-c)j Fj(string)57
+b Fs([)p Fj(ar-)390 1346 y(gument)g Fs(...)o(])390 1455
+y(bash)47 b([long-opt])e(-s)i([-abefhkmnptuvxdBCDHP])42
+b([-o)k Fj(option)11 b Fs(])46 b([-O)h Fj(shopt_option)11
+b Fs(])43 b([)p Fj(ar-)390 1565 y(gument)57 b Fs(...)o(])275
+1701 y Ft(In)28 b(addition)g(to)i(the)f(single-c)m(haracter)h(shell)e
+(command-line)g(options)h(\(see)h(Section)f(4.3)i([The)e(Set)150
+1810 y(Builtin],)24 b(page)h(50\),)i(there)e(are)g(sev)m(eral)g(m)m
+(ulti-c)m(haracter)g(options)f(that)h(y)m(ou)g(can)g(use.)38
+b(These)25 b(options)150 1920 y(m)m(ust)30 b(app)s(ear)g(on)g(the)h
+(command)f(line)f(b)s(efore)h(the)g(single-c)m(haracter)h(options)f(to)
+h(b)s(e)f(recognized.)150 2081 y Fs(--debugger)630 2191
+y Ft(Arrange)j(for)g(the)g(debugger)g(pro\014le)f(to)i(b)s(e)e
+(executed)i(b)s(efore)f(the)g(shell)e(starts.)49 b(T)-8
+b(urns)630 2301 y(on)40 b(extended)g(debugging)f(mo)s(de)h(\(see)h
+(Section)e(4.2)i([Bash)g(Builtins],)f(page)h(39)g(for)f(a)630
+2410 y(description)g(of)i(the)f Fs(extdebug)f Ft(option)h(to)h(the)g
+Fs(shopt)f Ft(builtin\))d(and)j(shell)f(function)630
+2520 y(tracing)35 b(\(see)h(Section)f(4.3)i([The)e(Set)g(Builtin],)g
+(page)h(50)g(for)f(a)g(description)f(of)h(the)h Fs(-o)630
+2629 y(functrace)28 b Ft(option\).)150 2790 y Fs(--dump-po-strings)630
+2900 y Ft(A)37 b(list)e(of)h(all)g(double-quoted)f(strings)g(preceded)h
+(b)m(y)h(`)p Fs($)p Ft(')f(is)g(prin)m(ted)f(on)h(the)h(standard)630
+3009 y(ouput)27 b(in)g(the)h Fl(gnu)g Fs(gettext)d Ft(PO)j(\(p)s
+(ortable)f(ob)5 b(ject\))29 b(\014le)e(format.)41 b(Equiv)-5
+b(alen)m(t)26 b(to)j(`)p Fs(-D)p Ft(')630 3119 y(except)i(for)f(the)h
+(output)f(format.)150 3280 y Fs(--dump-strings)630 3389
+y Ft(Equiv)-5 b(alen)m(t)29 b(to)i(`)p Fs(-D)p Ft('.)150
+3550 y Fs(--help)192 b Ft(Displa)m(y)30 b(a)g(usage)h(message)h(on)e
+(standard)g(output)g(and)f(exit)i(sucessfully)-8 b(.)150
+3711 y Fs(--init-file)27 b Fj(filename)150 3820 y Fs(--rcfile)h
+Fj(filename)630 3930 y Ft(Execute)42 b(commands)f(from)f
+Fq(\014lename)46 b Ft(\(instead)41 b(of)g(`)p Fs(~/.bashrc)p
+Ft('\))e(in)h(an)h(in)m(teractiv)m(e)630 4039 y(shell.)150
+4200 y Fs(--login)144 b Ft(Equiv)-5 b(alen)m(t)29 b(to)i(`)p
+Fs(-l)p Ft('.)150 4361 y Fs(--noediting)630 4471 y Ft(Do)h(not)e(use)h
+(the)g Fl(gnu)f Ft(Readline)g(library)e(\(see)j(Chapter)g(8)g([Command)
+f(Line)f(Editing],)630 4580 y(page)i(83\))h(to)f(read)f(command)g
+(lines)f(when)g(the)i(shell)d(is)i(in)m(teractiv)m(e.)150
+4741 y Fs(--noprofile)630 4850 y Ft(Don't)i(load)e(the)h(system-wide)f
+(startup)g(\014le)f(`)p Fs(/etc/profile)p Ft(')f(or)j(an)m(y)g(of)g
+(the)f(p)s(ersonal)630 4960 y(initialization)24 b(\014les)i(`)p
+Fs(~/.bash_profile)p Ft(',)f(`)p Fs(~/.bash_login)p Ft(',)g(or)i(`)p
+Fs(~/.profile)p Ft(')e(when)630 5070 y(Bash)31 b(is)e(in)m(v)m(ok)m(ed)
+i(as)f(a)h(login)e(shell.)150 5230 y Fs(--norc)192 b
+Ft(Don't)31 b(read)g(the)f(`)p Fs(~/.bashrc)p Ft(')f(initialization)e
+(\014le)i(in)g(an)i(in)m(teractiv)m(e)g(shell.)39 b(This)29
+b(is)g(on)630 5340 y(b)m(y)h(default)g(if)f(the)i(shell)d(is)i(in)m(v)m
+(ok)m(ed)h(as)f Fs(sh)p Ft(.)p eop
+%%Page: 64 70
+64 69 bop 150 -116 a Ft(64)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fs(--posix)144 b Ft(Change)24 b(the)h(b)s(eha)m(vior)e(of)h(Bash)
+h(where)e(the)i(default)e(op)s(eration)h(di\013ers)f(from)g(the)i
+Fl(posix)630 408 y Ft(1003.2)31 b(standard)d(to)i(matc)m(h)f(the)g
+(standard.)40 b(This)27 b(is)g(in)m(tended)h(to)i(mak)m(e)f(Bash)g(b)s
+(eha)m(v)m(e)630 518 y(as)39 b(a)f(strict)g(sup)s(erset)g(of)g(that)h
+(standard.)64 b(See)38 b(Section)g(6.11)i([Bash)f(POSIX)e(Mo)s(de],)630
+628 y(page)31 b(76,)h(for)e(a)g(description)f(of)h(the)h(Bash)g
+Fl(posix)e Ft(mo)s(de.)150 787 y Fs(--restricted)630
+897 y Ft(Mak)m(e)54 b(the)e(shell)e(a)j(restricted)f(shell)e(\(see)j
+(Section)f(6.10)i([The)d(Restricted)i(Shell],)630 1006
+y(page)31 b(76\).)150 1166 y Fs(--verbose)630 1275 y
+Ft(Equiv)-5 b(alen)m(t)29 b(to)i(`)p Fs(-v)p Ft('.)41
+b(Prin)m(t)29 b(shell)g(input)f(lines)h(as)i(they're)f(read.)150
+1435 y Fs(--version)630 1544 y Ft(Sho)m(w)e(v)m(ersion)f(information)f
+(for)i(this)f(instance)h(of)g(Bash)g(on)g(the)g(standard)f(output)h
+(and)630 1654 y(exit)i(successfully)-8 b(.)275 1813 y(There)28
+b(are)i(sev)m(eral)f(single-c)m(haracter)h(options)e(that)i(ma)m(y)g(b)
+s(e)e(supplied)e(at)k(in)m(v)m(o)s(cation)f(whic)m(h)f(are)150
+1923 y(not)j(a)m(v)-5 b(ailable)29 b(with)g(the)i Fs(set)e
+Ft(builtin.)150 2082 y Fs(-c)h Fj(string)630 2192 y Ft(Read)23
+b(and)f(execute)i(commands)f(from)f Fq(string)30 b Ft(after)23
+b(pro)s(cessing)e(the)i(options,)h(then)f(exit.)630 2301
+y(An)m(y)37 b(remaining)d(argumen)m(ts)j(are)g(assigned)f(to)h(the)g(p)
+s(ositional)d(parameters,)39 b(starting)630 2411 y(with)29
+b Fs($0)p Ft(.)150 2570 y Fs(-i)384 b Ft(F)-8 b(orce)22
+b(the)g(shell)d(to)i(run)f(in)m(teractiv)m(ely)-8 b(.)38
+b(In)m(teractiv)m(e)22 b(shells)d(are)j(describ)s(ed)c(in)i(Section)h
+(6.3)630 2680 y([In)m(teractiv)m(e)32 b(Shells],)d(page)i(67.)150
+2839 y Fs(-l)384 b Ft(Mak)m(e)33 b(this)d(shell)g(act)i(as)g(if)e(it)h
+(had)g(b)s(een)f(directly)g(in)m(v)m(ok)m(ed)i(b)m(y)g(login.)42
+b(When)31 b(the)h(shell)630 2949 y(is)k(in)m(teractiv)m(e,)41
+b(this)36 b(is)g(equiv)-5 b(alen)m(t)37 b(to)h(starting)g(a)f(login)g
+(shell)e(with)h(`)p Fs(exec)30 b(-l)g(bash)p Ft('.)630
+3059 y(When)h(the)g(shell)f(is)g(not)h(in)m(teractiv)m(e,)i(the)e
+(login)f(shell)g(startup)h(\014les)f(will)e(b)s(e)j(executed.)630
+3168 y(`)p Fs(exec)e(bash)h(-l)p Ft(')43 b(or)h(`)p Fs(exec)29
+b(bash)g(--login)p Ft(')42 b(will)f(replace)j(the)g(curren)m(t)f(shell)
+f(with)h(a)630 3278 y(Bash)26 b(login)e(shell.)37 b(See)26
+b(Section)f(6.2)i([Bash)e(Startup)g(Files],)h(page)g(65,)i(for)d(a)h
+(description)630 3387 y(of)31 b(the)f(sp)s(ecial)f(b)s(eha)m(vior)h(of)
+g(a)h(login)e(shell.)150 3547 y Fs(-r)384 b Ft(Mak)m(e)54
+b(the)e(shell)e(a)j(restricted)f(shell)e(\(see)j(Section)f(6.10)i([The)
+d(Restricted)i(Shell],)630 3656 y(page)31 b(76\).)150
+3816 y Fs(-s)384 b Ft(If)24 b(this)g(option)h(is)f(presen)m(t,)i(or)f
+(if)f(no)g(argumen)m(ts)i(remain)d(after)j(option)e(pro)s(cessing,)h
+(then)630 3925 y(commands)j(are)h(read)g(from)f(the)h(standard)f
+(input.)38 b(This)27 b(option)h(allo)m(ws)g(the)h(p)s(ositional)630
+4035 y(parameters)i(to)g(b)s(e)f(set)g(when)g(in)m(v)m(oking)f(an)i(in)
+m(teractiv)m(e)g(shell.)150 4194 y Fs(-D)384 b Ft(A)37
+b(list)e(of)h(all)g(double-quoted)f(strings)g(preceded)h(b)m(y)h(`)p
+Fs($)p Ft(')f(is)g(prin)m(ted)f(on)h(the)h(standard)630
+4304 y(ouput.)71 b(These)40 b(are)h(the)g(strings)f(that)h(are)g(sub)5
+b(ject)41 b(to)g(language)g(translation)f(when)630 4413
+y(the)d(curren)m(t)g(lo)s(cale)f(is)g(not)h Fs(C)g Ft(or)f
+Fs(POSIX)g Ft(\(see)h(Section)g(3.1.2.5)i([Lo)s(cale)f(T)-8
+b(ranslation],)630 4523 y(page)31 b(7\).)42 b(This)28
+b(implies)g(the)i(`)p Fs(-n)p Ft(')h(option;)f(no)g(commands)g(will)e
+(b)s(e)h(executed.)150 4682 y Fs([-+]O)g([)p Fj(shopt_option)11
+b Fs(])630 4792 y Fq(shopt)p 854 4792 28 4 v 40 w(option)43
+b Ft(is)g(one)i(of)f(the)g(shell)f(options)g(accepted)i(b)m(y)f(the)h
+Fs(shopt)d Ft(builtin)f(\(see)630 4902 y(Chapter)29 b(4)i([Shell)d
+(Builtin)f(Commands],)j(page)g(33\).)42 b(If)30 b Fq(shopt)p
+2856 4902 V 39 w(option)g Ft(is)f(presen)m(t,)h(`)p Fs(-O)p
+Ft(')630 5011 y(sets)39 b(the)f(v)-5 b(alue)38 b(of)g(that)h(option;)j
+(`)p Fs(+O)p Ft(')c(unsets)g(it.)64 b(If)38 b Fq(shopt)p
+2803 5011 V 39 w(option)g Ft(is)f(not)i(supplied,)630
+5121 y(the)28 b(names)f(and)h(v)-5 b(alues)27 b(of)g(the)h(shell)e
+(options)h(accepted)i(b)m(y)f Fs(shopt)e Ft(are)i(prin)m(ted)e(on)i
+(the)630 5230 y(standard)33 b(output.)50 b(If)33 b(the)h(in)m(v)m(o)s
+(cation)g(option)f(is)g(`)p Fs(+O)p Ft(',)h(the)g(output)f(is)g(displa)
+m(y)m(ed)f(in)h(a)630 5340 y(format)e(that)g(ma)m(y)g(b)s(e)e(reused)h
+(as)h(input.)p eop
+%%Page: 65 71
+65 70 bop 150 -116 a Ft(Chapter)30 b(6:)41 b(Bash)30
+b(F)-8 b(eatures)2484 b(65)150 299 y Fs(--)384 b Ft(A)38
+b Fs(--)g Ft(signals)e(the)j(end)e(of)i(options)e(and)h(disables)e
+(further)h(option)g(pro)s(cessing.)63 b(An)m(y)630 408
+y(argumen)m(ts)31 b(after)g(the)f Fs(--)g Ft(are)h(treated)g(as)g
+(\014lenames)e(and)h(argumen)m(ts.)275 575 y(A)d Fm(lo)-5
+b(gin)35 b Ft(shell)25 b(is)h(one)i(whose)f(\014rst)f(c)m(haracter)j
+(of)e(argumen)m(t)h(zero)f(is)g(`)p Fs(-)p Ft(',)h(or)f(one)g(in)m(v)m
+(ok)m(ed)h(with)e(the)150 685 y(`)p Fs(--login)p Ft(')j(option.)275
+825 y(An)24 b Fm(inter)-5 b(active)33 b Ft(shell)23 b(is)h(one)h
+(started)g(without)f(non-option)h(argumen)m(ts,)h(unless)e(`)p
+Fs(-s)p Ft(')g(is)g(sp)s(eci\014ed,)150 934 y(without)42
+b(sp)s(ecifying)e(the)k(`)p Fs(-c)p Ft(')e(option,)k(and)c(whose)h
+(input)e(and)h(output)g(are)h(b)s(oth)g(connected)g(to)150
+1044 y(terminals)20 b(\(as)j(determined)e(b)m(y)h Fs(isatty\(3\))p
+Ft(\),)f(or)i(one)f(started)g(with)f(the)h(`)p Fs(-i)p
+Ft(')g(option.)38 b(See)22 b(Section)g(6.3)150 1153 y([In)m(teractiv)m
+(e)32 b(Shells],)d(page)i(67,)g(for)f(more)h(information.)275
+1293 y(If)38 b(argumen)m(ts)h(remain)f(after)h(option)g(pro)s(cessing,)
+h(and)e(neither)g(the)h(`)p Fs(-c)p Ft(')f(nor)h(the)g(`)p
+Fs(-s)p Ft(')f(option)150 1403 y(has)33 b(b)s(een)g(supplied,)f(the)i
+(\014rst)e(argumen)m(t)j(is)d(assumed)h(to)h(b)s(e)f(the)h(name)g(of)g
+(a)g(\014le)f(con)m(taining)g(shell)150 1512 y(commands)d(\(see)g
+(Section)g(3.8)h([Shell)d(Scripts],)h(page)i(31\).)41
+b(When)30 b(Bash)g(is)f(in)m(v)m(ok)m(ed)i(in)d(this)h(fashion,)150
+1622 y Fs($0)37 b Ft(is)f(set)i(to)h(the)e(name)h(of)f(the)h(\014le,)h
+(and)d(the)i(p)s(ositional)d(parameters)j(are)g(set)g(to)g(the)g
+(remaining)150 1731 y(argumen)m(ts.)h(Bash)26 b(reads)f(and)g(executes)
+h(commands)f(from)g(this)f(\014le,)i(then)f(exits.)39
+b(Bash's)25 b(exit)h(status)150 1841 y(is)f(the)i(exit)g(status)f(of)h
+(the)g(last)f(command)g(executed)h(in)f(the)g(script.)39
+b(If)26 b(no)g(commands)g(are)h(executed,)150 1951 y(the)k(exit)f
+(status)h(is)e(0.)150 2221 y Fr(6.2)68 b(Bash)45 b(Startup)g(Files)275
+2470 y Ft(This)35 b(section)j(describs)e(ho)m(w)h(Bash)h(executes)h
+(its)e(startup)g(\014les.)61 b(If)37 b(an)m(y)h(of)g(the)g(\014les)e
+(exist)i(but)150 2579 y(cannot)26 b(b)s(e)e(read,)i(Bash)f(rep)s(orts)g
+(an)g(error.)38 b(Tildes)23 b(are)j(expanded)e(in)f(\014le)i(names)g
+(as)g(describ)s(ed)e(ab)s(o)m(v)m(e)150 2689 y(under)29
+b(Tilde)f(Expansion)h(\(see)i(Section)f(3.5.2)j([Tilde)28
+b(Expansion],)h(page)j(18\).)275 2828 y(In)m(teractiv)m(e)f(shells)e
+(are)i(describ)s(ed)d(in)h(Section)h(6.3)i([In)m(teractiv)m(e)g
+(Shells],)c(page)j(67.)150 3063 y Fk(In)m(v)m(ok)m(ed)40
+b(as)h(an)f(in)m(teractiv)m(e)f(login)j(shell,)g(or)g(with)e(`)p
+Fi(--login)p Fk(')275 3312 y Ft(When)e(Bash)g(is)g(in)m(v)m(ok)m(ed)h
+(as)f(an)g(in)m(teractiv)m(e)i(login)d(shell,)i(or)f(as)h(a)g(non-in)m
+(teractiv)m(e)g(shell)d(with)150 3422 y(the)f(`)p Fs(--login)p
+Ft(')d(option,)k(it)d(\014rst)h(reads)g(and)g(executes)i(commands)e
+(from)f(the)i(\014le)f(`)p Fs(/etc/profile)p Ft(',)150
+3531 y(if)27 b(that)i(\014le)e(exists.)40 b(After)28
+b(reading)g(that)g(\014le,)g(it)g(lo)s(oks)g(for)g(`)p
+Fs(~/.bash_profile)p Ft(',)d(`)p Fs(~/.bash_login)p Ft(',)150
+3641 y(and)j(`)p Fs(~/.profile)p Ft(',)f(in)h(that)h(order,)g(and)f
+(reads)g(and)h(executes)h(commands)e(from)g(the)h(\014rst)f(one)h(that)
+150 3750 y(exists)h(and)f(is)g(readable.)40 b(The)30
+b(`)p Fs(--noprofile)p Ft(')d(option)j(ma)m(y)g(b)s(e)g(used)f(when)g
+(the)h(shell)f(is)g(started)h(to)150 3860 y(inhibit)d(this)i(b)s(eha)m
+(vior.)275 3999 y(When)72 b(a)i(login)e(shell)f(exits,)84
+b(Bash)73 b(reads)g(and)g(executes)h(commands)f(from)g(the)g(\014le)150
+4109 y(`)p Fs(~/.bash_logout)p Ft(',)27 b(if)j(it)f(exists.)150
+4343 y Fk(In)m(v)m(ok)m(ed)40 b(as)h(an)f(in)m(teractiv)m(e)f
+(non-login)k(shell)275 4592 y Ft(When)35 b(an)g(in)m(teractiv)m(e)h
+(shell)e(that)h(is)g(not)g(a)h(login)e(shell)g(is)g(started,)j(Bash)f
+(reads)f(and)g(executes)150 4702 y(commands)24 b(from)f(`)p
+Fs(~/.bashrc)p Ft(',)h(if)f(that)h(\014le)f(exists.)39
+b(This)22 b(ma)m(y)j(b)s(e)e(inhibited)d(b)m(y)k(using)f(the)h(`)p
+Fs(--norc)p Ft(')150 4812 y(option.)51 b(The)33 b(`)p
+Fs(--rcfile)28 b Fj(file)11 b Ft(')33 b(option)g(will)e(force)k(Bash)f
+(to)h(read)e(and)h(execute)h(commands)e(from)150 4921
+y Fq(\014le)i Ft(instead)29 b(of)i(`)p Fs(~/.bashrc)p
+Ft('.)275 5061 y(So,)f(t)m(ypically)-8 b(,)30 b(y)m(our)g(`)p
+Fs(~/.bash_profile)p Ft(')d(con)m(tains)k(the)f(line)390
+5200 y Fs(if)47 b([)h(-f)f(~/.bashrc)e(];)i(then)g(.)g(~/.bashrc;)e(fi)
+150 5340 y Ft(after)31 b(\(or)g(b)s(efore\))f(an)m(y)h(login-sp)s
+(eci\014c)d(initializations.)p eop
+%%Page: 66 72
+66 71 bop 150 -116 a Ft(66)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fk(In)m(v)m(ok)m(ed)40 b(non-in)m(teractiv)m(ely)275
+571 y Ft(When)24 b(Bash)h(is)f(started)h(non-in)m(teractiv)m(ely)-8
+b(,)26 b(to)g(run)d(a)i(shell)e(script,)i(for)g(example,)h(it)e(lo)s
+(oks)g(for)h(the)150 680 y(v)-5 b(ariable)33 b Fs(BASH_ENV)f
+Ft(in)h(the)i(en)m(vironmen)m(t,)g(expands)f(its)f(v)-5
+b(alue)34 b(if)g(it)g(app)s(ears)f(there,)j(and)e(uses)g(the)150
+790 y(expanded)c(v)-5 b(alue)29 b(as)i(the)g(name)f(of)h(a)f(\014le)g
+(to)h(read)f(and)g(execute.)42 b(Bash)31 b(b)s(eha)m(v)m(es)g(as)g(if)e
+(the)h(follo)m(wing)150 900 y(command)g(w)m(ere)h(executed:)390
+1062 y Fs(if)47 b([)h(-n)f("$BASH_ENV")e(];)i(then)f(.)i("$BASH_ENV";)c
+(fi)150 1224 y Ft(but)30 b(the)g(v)-5 b(alue)30 b(of)h(the)f
+Fs(PATH)f Ft(v)-5 b(ariable)30 b(is)f(not)i(used)e(to)i(searc)m(h)g
+(for)f(the)h(\014le)e(name.)275 1387 y(As)38 b(noted)h(ab)s(o)m(v)m(e,)
+j(if)37 b(a)i(non-in)m(teractiv)m(e)g(shell)e(is)h(in)m(v)m(ok)m(ed)h
+(with)e(the)h(`)p Fs(--login)p Ft(')g(option,)i(Bash)150
+1496 y(attempts)31 b(to)g(read)g(and)e(execute)j(commands)e(from)g(the)
+h(login)e(shell)g(startup)g(\014les.)150 1776 y Fk(In)m(v)m(ok)m(ed)40
+b(with)g(name)g Fi(sh)275 2048 y Ft(If)29 b(Bash)g(is)g(in)m(v)m(ok)m
+(ed)h(with)e(the)i(name)f Fs(sh)p Ft(,)g(it)h(tries)e(to)j(mimic)d(the)
+h(startup)g(b)s(eha)m(vior)g(of)h(historical)150 2158
+y(v)m(ersions)g(of)g Fs(sh)g Ft(as)h(closely)f(as)g(p)s(ossible,)e
+(while)h(conforming)g(to)i(the)g Fl(posix)e Ft(standard)h(as)h(w)m
+(ell.)275 2320 y(When)50 b(in)m(v)m(ok)m(ed)i(as)g(an)f(in)m(teractiv)m
+(e)h(login)e(shell,)55 b(or)c(as)g(a)h(non-in)m(teractiv)m(e)f(shell)f
+(with)g(the)150 2430 y(`)p Fs(--login)p Ft(')39 b(option,)j(it)e
+(\014rst)f(attempts)i(to)g(read)f(and)g(execute)h(commands)f(from)g(`)p
+Fs(/etc/profile)p Ft(')150 2539 y(and)d(`)p Fs(~/.profile)p
+Ft(',)g(in)f(that)i(order.)62 b(The)37 b(`)p Fs(--noprofile)p
+Ft(')e(option)i(ma)m(y)h(b)s(e)f(used)g(to)h(inhibit)c(this)150
+2649 y(b)s(eha)m(vior.)81 b(When)44 b(in)m(v)m(ok)m(ed)g(as)h(an)f(in)m
+(teractiv)m(e)h(shell)d(with)h(the)h(name)g Fs(sh)p Ft(,)j(Bash)d(lo)s
+(oks)g(for)g(the)150 2759 y(v)-5 b(ariable)35 b Fs(ENV)p
+Ft(,)i(expands)e(its)h(v)-5 b(alue)35 b(if)g(it)h(is)f(de\014ned,)i
+(and)e(uses)h(the)g(expanded)g(v)-5 b(alue)35 b(as)i(the)f(name)150
+2868 y(of)i(a)h(\014le)f(to)h(read)f(and)g(execute.)66
+b(Since)37 b(a)i(shell)d(in)m(v)m(ok)m(ed)j(as)g Fs(sh)e
+Ft(do)s(es)h(not)h(attempt)g(to)g(read)g(and)150 2978
+y(execute)i(commands)e(from)g(an)m(y)h(other)g(startup)f(\014les,)i
+(the)f(`)p Fs(--rcfile)p Ft(')d(option)i(has)h(no)f(e\013ect.)70
+b(A)150 3087 y(non-in)m(teractiv)m(e)30 b(shell)d(in)m(v)m(ok)m(ed)i
+(with)f(the)h(name)g Fs(sh)f Ft(do)s(es)g(not)i(attempt)g(to)f(read)g
+(an)m(y)g(other)g(startup)150 3197 y(\014les.)275 3359
+y(When)h(in)m(v)m(ok)m(ed)g(as)h Fs(sh)p Ft(,)f(Bash)h(en)m(ters)g
+Fl(posix)e Ft(mo)s(de)h(after)h(the)g(startup)f(\014les)f(are)i(read.)
+150 3639 y Fk(In)m(v)m(ok)m(ed)40 b(in)h Fh(posix)f Fk(mo)s(de)275
+3911 y Ft(When)d(Bash)g(is)f(started)i(in)e Fl(posix)g
+Ft(mo)s(de,)j(as)e(with)f(the)i(`)p Fs(--posix)p Ft(')d(command)i(line)
+f(option,)i(it)150 4021 y(follo)m(ws)26 b(the)i Fl(posix)e
+Ft(standard)h(for)g(startup)g(\014les.)38 b(In)27 b(this)f(mo)s(de,)h
+(in)m(teractiv)m(e)i(shells)c(expand)h(the)i Fs(ENV)150
+4131 y Ft(v)-5 b(ariable)34 b(and)h(commands)g(are)h(read)g(and)f
+(executed)h(from)f(the)h(\014le)f(whose)g(name)g(is)g(the)h(expanded)
+150 4240 y(v)-5 b(alue.)40 b(No)31 b(other)g(startup)f(\014les)f(are)i
+(read.)150 4520 y Fk(In)m(v)m(ok)m(ed)40 b(b)m(y)g(remote)g(shell)i
+(daemon)275 4792 y Ft(Bash)34 b(attempts)i(to)f(determine)f(when)f(it)h
+(is)g(b)s(eing)f(run)g(b)m(y)h(the)h(remote)h(shell)c(daemon,)k
+(usually)150 4902 y Fs(rshd)p Ft(.)60 b(If)36 b(Bash)h(determines)f(it)
+h(is)f(b)s(eing)g(run)f(b)m(y)i(rshd,)h(it)e(reads)h(and)f(executes)j
+(commands)d(from)150 5011 y(`)p Fs(~/.bashrc)p Ft(',)h(if)f(that)h
+(\014le)f(exists)h(and)f(is)g(readable.)61 b(It)37 b(will)d(not)j(do)g
+(this)f(if)g(in)m(v)m(ok)m(ed)h(as)h Fs(sh)p Ft(.)59
+b(The)150 5121 y(`)p Fs(--norc)p Ft(')34 b(option)h(ma)m(y)i(b)s(e)e
+(used)f(to)j(inhibit)32 b(this)i(b)s(eha)m(vior,)j(and)e(the)g(`)p
+Fs(--rcfile)p Ft(')f(option)h(ma)m(y)i(b)s(e)150 5230
+y(used)25 b(to)h(force)g(another)g(\014le)e(to)j(b)s(e)e(read,)h(but)f
+Fs(rshd)g Ft(do)s(es)g(not)g(generally)g(in)m(v)m(ok)m(e)i(the)e(shell)
+f(with)g(those)150 5340 y(options)30 b(or)g(allo)m(w)g(them)g(to)h(b)s
+(e)f(sp)s(eci\014ed.)p eop
+%%Page: 67 73
+67 72 bop 150 -116 a Ft(Chapter)30 b(6:)41 b(Bash)30
+b(F)-8 b(eatures)2484 b(67)150 299 y Fk(In)m(v)m(ok)m(ed)40
+b(with)g(unequal)h(e\013ectiv)m(e)e(and)i(real)g Fh(uid/gid)p
+Fk(s)275 538 y Ft(If)26 b(Bash)i(is)e(started)i(with)e(the)h
+(e\013ectiv)m(e)i(user)e(\(group\))g(id)f(not)i(equal)f(to)h(the)f
+(real)g(user)g(\(group\))g(id,)150 648 y(and)f(the)i
+Fs(-p)e Ft(option)g(is)g(not)i(supplied,)c(no)j(startup)g(\014les)f
+(are)h(read,)h(shell)d(functions)h(are)h(not)g(inherited)150
+757 y(from)g(the)h(en)m(vironmen)m(t,)g(the)g Fs(SHELLOPTS)d
+Ft(v)-5 b(ariable,)27 b(if)g(it)g(app)s(ears)g(in)f(the)i(en)m
+(vironmen)m(t,)g(is)f(ignored,)150 867 y(and)g(the)h(e\013ectiv)m(e)i
+(user)d(id)f(is)h(set)h(to)h(the)f(real)f(user)g(id.)39
+b(If)27 b(the)h Fs(-p)g Ft(option)f(is)g(supplied)d(at)29
+b(in)m(v)m(o)s(cation,)150 977 y(the)i(startup)f(b)s(eha)m(vior)f(is)g
+(the)i(same,)g(but)f(the)g(e\013ectiv)m(e)i(user)e(id)f(is)g(not)i
+(reset.)150 1220 y Fr(6.3)68 b(In)l(teractiv)l(e)47 b(Shells)150
+1540 y Fk(6.3.1)63 b(What)40 b(is)h(an)g(In)m(teractiv)m(e)e(Shell?)275
+1779 y Ft(An)25 b(in)m(teractiv)m(e)h(shell)d(is)i(one)g(started)h
+(without)f(non-option)f(argumen)m(ts,)j(unless)d(`)p
+Fs(-s)p Ft(')h(is)f(sp)s(eci\014ed,)150 1889 y(without)40
+b(sp)s(eci\014ying)f(the)i(`)p Fs(-c)p Ft(')g(option,)j(and)c(whose)h
+(input)e(and)i(output)f(are)i(b)s(oth)e(connected)i(to)150
+1998 y(terminals)29 b(\(as)i(determined)e(b)m(y)h Fs(isatty\(3\))p
+Ft(\),)e(or)j(one)f(started)h(with)e(the)i(`)p Fs(-i)p
+Ft(')f(option.)275 2128 y(An)g(in)m(teractiv)m(e)h(shell)d(generally)i
+(reads)g(from)g(and)g(writes)f(to)i(a)g(user's)f(terminal.)275
+2258 y(The)e(`)p Fs(-s)p Ft(')i(in)m(v)m(o)s(cation)f(option)g(ma)m(y)h
+(b)s(e)f(used)f(to)i(set)g(the)g(p)s(ositional)d(parameters)i(when)g
+(an)g(in)m(ter-)150 2367 y(activ)m(e)j(shell)c(is)i(started.)150
+2577 y Fk(6.3.2)63 b(Is)41 b(this)g(Shell)g(In)m(teractiv)m(e?)275
+2817 y Ft(T)-8 b(o)32 b(determine)f(within)f(a)i(startup)g(script)f
+(whether)h(or)g(not)g(Bash)g(is)f(running)f(in)m(teractiv)m(ely)-8
+b(,)33 b(test)150 2926 y(the)42 b(v)-5 b(alue)41 b(of)g(the)h(`)p
+Fs(-)p Ft(')g(sp)s(ecial)e(parameter.)75 b(It)41 b(con)m(tains)h
+Fs(i)f Ft(when)g(the)h(shell)d(is)i(in)m(teractiv)m(e.)75
+b(F)-8 b(or)150 3036 y(example:)390 3166 y Fs(case)47
+b("$-")f(in)390 3275 y(*i*\))h(echo)f(This)h(shell)f(is)h(interactive)e
+(;;)390 3385 y(*\))i(echo)g(This)f(shell)h(is)g(not)g(interactive)e(;;)
+390 3495 y(esac)275 3624 y Ft(Alternativ)m(ely)-8 b(,)25
+b(startup)e(scripts)g(ma)m(y)h(examine)f(the)h(v)-5 b(ariable)23
+b Fs(PS1)p Ft(;)i(it)f(is)e(unset)i(in)e(non-in)m(teractiv)m(e)150
+3734 y(shells,)29 b(and)g(set)i(in)e(in)m(teractiv)m(e)j(shells.)38
+b(Th)m(us:)390 3864 y Fs(if)47 b([)h(-z)f("$PS1")f(];)h(then)772
+3973 y(echo)f(This)h(shell)f(is)i(not)f(interactive)390
+4083 y(else)772 4193 y(echo)f(This)h(shell)f(is)i(interactive)390
+4302 y(fi)150 4512 y Fk(6.3.3)63 b(In)m(teractiv)m(e)38
+b(Shell)k(Beha)m(vior)275 4752 y Ft(When)30 b(the)g(shell)f(is)g
+(running)f(in)m(teractiv)m(ely)-8 b(,)31 b(it)f(c)m(hanges)h(its)f(b)s
+(eha)m(vior)g(in)f(sev)m(eral)h(w)m(a)m(ys.)199 4881
+y(1.)61 b(Startup)37 b(\014les)f(are)i(read)f(and)g(executed)h(as)f
+(describ)s(ed)f(in)g(Section)h(6.2)h([Bash)g(Startup)e(Files],)330
+4991 y(page)31 b(65.)199 5121 y(2.)61 b(Job)35 b(Con)m(trol)f(\(see)i
+(Chapter)f(7)g([Job)g(Con)m(trol],)h(page)g(79\))g(is)e(enabled)g(b)m
+(y)h(default.)54 b(When)34 b(job)330 5230 y(con)m(trol)g(is)f(in)f
+(e\013ect,)37 b(Bash)d(ignores)f(the)h(k)m(eyb)s(oard-generated)h(job)e
+(con)m(trol)h(signals)f Fs(SIGTTIN)p Ft(,)330 5340 y
+Fs(SIGTTOU)p Ft(,)c(and)g Fs(SIGTSTP)p Ft(.)p eop
+%%Page: 68 74
+68 73 bop 150 -116 a Ft(68)2572 b(Bash)31 b(Reference)g(Man)m(ual)199
+299 y(3.)61 b(Bash)39 b(expands)f(and)g(displa)m(ys)f
+Fs(PS1)h Ft(b)s(efore)h(reading)f(the)h(\014rst)f(line)f(of)i(a)g
+(command,)i(and)d(ex-)330 408 y(pands)30 b(and)g(displa)m(ys)f
+Fs(PS2)g Ft(b)s(efore)i(reading)f(the)h(second)f(and)h(subsequen)m(t)f
+(lines)f(of)i(a)g(m)m(ulti-line)330 518 y(command.)199
+669 y(4.)61 b(Bash)26 b(executes)i(the)e(v)-5 b(alue)26
+b(of)g(the)h Fs(PROMPT_COMMAND)22 b Ft(v)-5 b(ariable)25
+b(as)i(a)f(command)g(b)s(efore)g(prin)m(ting)330 779
+y(the)31 b(primary)d(prompt,)i Fs($PS1)f Ft(\(see)i(Section)f(5.2)i
+([Bash)f(V)-8 b(ariables],)30 b(page)h(55\).)199 930
+y(5.)61 b(Readline)28 b(\(see)j(Chapter)e(8)h([Command)e(Line)h
+(Editing],)f(page)i(83\))h(is)e(used)g(to)h(read)f(commands)330
+1039 y(from)h(the)g(user's)g(terminal.)199 1190 y(6.)61
+b(Bash)36 b(insp)s(ects)f(the)i(v)-5 b(alue)36 b(of)g(the)g
+Fs(ignoreeof)e Ft(option)i(to)h Fs(set)29 b(-o)36 b Ft(instead)g(of)g
+(exiting)g(imme-)330 1300 y(diately)f(when)g(it)h(receiv)m(es)h(an)f
+Fs(EOF)f Ft(on)h(its)f(standard)g(input)f(when)i(reading)f(a)h(command)
+g(\(see)330 1409 y(Section)30 b(4.3)i([The)e(Set)g(Builtin],)f(page)i
+(50\).)199 1560 y(7.)61 b(Command)43 b(history)g(\(see)i(Section)f(9.1)
+h([Bash)f(History)g(F)-8 b(acilities],)47 b(page)e(109\))h(and)d
+(history)330 1670 y(expansion)22 b(\(see)j(Section)e(9.3)i([History)e
+(In)m(teraction],)j(page)e(111\))h(are)f(enabled)f(b)m(y)g(default.)38
+b(Bash)330 1779 y(will)20 b(sa)m(v)m(e)25 b(the)e(command)f(history)g
+(to)i(the)f(\014le)f(named)g(b)m(y)h Fs($HISTFILE)d Ft(when)i(an)h(in)m
+(teractiv)m(e)h(shell)330 1889 y(exits.)199 2040 y(8.)61
+b(Alias)29 b(expansion)h(\(see)h(Section)f(6.6)h([Aliases],)g(page)g
+(71\))h(is)d(p)s(erformed)g(b)m(y)h(default.)199 2191
+y(9.)61 b(In)24 b(the)g(absence)h(of)f(an)m(y)h(traps,)g(Bash)g
+(ignores)e Fs(SIGTERM)g Ft(\(see)i(Section)f(3.7.6)i([Signals],)e(page)
+h(31\).)154 2342 y(10.)61 b(In)26 b(the)h(absence)h(of)f(an)m(y)g
+(traps,)g Fs(SIGINT)e Ft(is)h(caugh)m(t)i(and)f(handled)d(\(\(see)29
+b(Section)d(3.7.6)j([Signals],)330 2451 y(page)i(31\).)42
+b Fs(SIGINT)29 b Ft(will)e(in)m(terrupt)i(some)i(shell)e(builtins.)154
+2602 y(11.)61 b(An)40 b(in)m(teractiv)m(e)h(login)e(shell)g(sends)g(a)i
+Fs(SIGHUP)d Ft(to)j(all)e(jobs)h(on)g(exit)g(if)g(the)g
+Fs(hupoxexit)e Ft(shell)330 2712 y(option)30 b(has)g(b)s(een)g(enabled)
+f(\(see)i(Section)f(3.7.6)j([Signals],)c(page)i(31\).)154
+2863 y(12.)61 b(The)31 b(`)p Fs(-n)p Ft(')g(in)m(v)m(o)s(cation)g
+(option)f(is)h(ignored,)f(and)h(`)p Fs(set)f(-n)p Ft(')g(has)h(no)g
+(e\013ect)i(\(see)f(Section)f(4.3)h([The)330 2972 y(Set)f(Builtin],)d
+(page)j(50\).)154 3123 y(13.)61 b(Bash)32 b(will)d(c)m(hec)m(k)34
+b(for)e(mail)e(p)s(erio)s(dically)-8 b(,)30 b(dep)s(ending)f(on)j(the)g
+(v)-5 b(alues)31 b(of)h(the)h Fs(MAIL)p Ft(,)e Fs(MAILPATH)p
+Ft(,)330 3233 y(and)f Fs(MAILCHECK)e Ft(shell)g(v)-5
+b(ariables)29 b(\(see)j(Section)e(5.2)h([Bash)g(V)-8
+b(ariables],)30 b(page)h(55\).)154 3384 y(14.)61 b(Expansion)31
+b(errors)i(due)f(to)i(references)f(to)h(un)m(b)s(ound)c(shell)h(v)-5
+b(ariables)32 b(after)i(`)p Fs(set)29 b(-u)p Ft(')k(has)g(b)s(een)330
+3494 y(enabled)c(will)f(not)j(cause)g(the)f(shell)f(to)i(exit)f(\(see)h
+(Section)g(4.3)g([The)f(Set)h(Builtin],)d(page)j(50\).)154
+3644 y(15.)61 b(The)48 b(shell)f(will)e(not)k(exit)f(on)h(expansion)e
+(errors)h(caused)g(b)m(y)h Fq(v)-5 b(ar)54 b Ft(b)s(eing)47
+b(unset)h(or)h(n)m(ull)d(in)330 3754 y Fs(${)p Fj(var)11
+b Fs(:?)p Fj(word)g Fs(})26 b Ft(expansions)j(\(see)i(Section)g(3.5.3)h
+([Shell)c(P)m(arameter)k(Expansion],)d(page)i(18\).)154
+3905 y(16.)61 b(Redirection)29 b(errors)h(encoun)m(tered)h(b)m(y)f
+(shell)f(builtins)e(will)g(not)k(cause)g(the)f(shell)f(to)i(exit.)154
+4056 y(17.)61 b(When)26 b(running)e(in)i Fl(posix)f Ft(mo)s(de,)j(a)f
+(sp)s(ecial)e(builtin)e(returning)i(an)h(error)h(status)g(will)d(not)i
+(cause)330 4166 y(the)31 b(shell)d(to)j(exit)g(\(see)g(Section)f(6.11)i
+([Bash)f(POSIX)e(Mo)s(de],)i(page)g(76\).)154 4316 y(18.)61
+b(A)34 b(failed)e Fs(exec)h Ft(will)e(not)j(cause)g(the)g(shell)e(to)i
+(exit)g(\(see)g(Section)g(4.1)h([Bourne)f(Shell)d(Builtins],)330
+4426 y(page)g(33\).)154 4577 y(19.)61 b(P)m(arser)31
+b(syn)m(tax)f(errors)g(will)e(not)j(cause)g(the)f(shell)f(to)i(exit.)
+154 4728 y(20.)61 b(Simple)19 b(sp)s(elling)g(correction)i(for)h
+(directory)f(argumen)m(ts)g(to)i(the)e Fs(cd)g Ft(builtin)d(is)j
+(enabled)f(b)m(y)i(default)330 4838 y(\(see)38 b(the)e(description)f
+(of)i(the)f Fs(cdspell)f Ft(option)h(to)h(the)g Fs(shopt)e
+Ft(builtin)e(in)j(Section)g(4.2)i([Bash)330 4947 y(Builtins],)28
+b(page)j(39\).)154 5098 y(21.)61 b(The)42 b(shell)f(will)f(c)m(hec)m(k)
+k(the)f(v)-5 b(alue)42 b(of)g(the)h Fs(TMOUT)e Ft(v)-5
+b(ariable)42 b(and)g(exit)g(if)g(a)h(command)f(is)g(not)330
+5208 y(read)30 b(within)e(the)i(sp)s(eci\014ed)e(n)m(um)m(b)s(er)h(of)i
+(seconds)f(after)g(prin)m(ting)e Fs($PS1)h Ft(\(see)i(Section)f(5.2)i
+([Bash)330 5317 y(V)-8 b(ariables],)30 b(page)h(55\).)p
+eop
+%%Page: 69 75
+69 74 bop 150 -116 a Ft(Chapter)30 b(6:)41 b(Bash)30
+b(F)-8 b(eatures)2484 b(69)150 299 y Fr(6.4)68 b(Bash)45
+b(Conditional)h(Expressions)275 548 y Ft(Conditional)35
+b(expressions)i(are)i(used)f(b)m(y)g(the)g Fs([[)g Ft(comp)s(ound)f
+(command)h(and)g(the)g Fs(test)g Ft(and)f Fs([)150 657
+y Ft(builtin)27 b(commands.)275 796 y(Expressions)k(ma)m(y)i(b)s(e)g
+(unary)f(or)h(binary)-8 b(.)47 b(Unary)33 b(expressions)e(are)j(often)f
+(used)f(to)i(examine)f(the)150 906 y(status)26 b(of)g(a)h(\014le.)38
+b(There)26 b(are)g(string)f(op)s(erators)h(and)g(n)m(umeric)e
+(comparison)i(op)s(erators)g(as)g(w)m(ell.)38 b(If)26
+b(the)150 1016 y Fq(\014le)37 b Ft(argumen)m(t)d(to)f(one)h(of)f(the)g
+(primaries)e(is)h(of)h(the)g(form)g(`)p Fs(/dev/fd/)p
+Fj(N)11 b Ft(',)31 b(then)i(\014le)f(descriptor)g Fq(N)43
+b Ft(is)150 1125 y(c)m(hec)m(k)m(ed.)e(If)26 b(the)g
+Fq(\014le)k Ft(argumen)m(t)c(to)h(one)f(of)g(the)h(primaries)c(is)i
+(one)h(of)g(`)p Fs(/dev/stdin)p Ft(',)f(`)p Fs(/dev/stdout)p
+Ft(',)150 1235 y(or)30 b(`)p Fs(/dev/stderr)p Ft(',)e(\014le)i
+(descriptor)f(0,)i(1,)g(or)g(2,)g(resp)s(ectiv)m(ely)-8
+b(,)30 b(is)f(c)m(hec)m(k)m(ed.)150 1401 y Fs(-a)h Fj(file)162
+b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35 b Ft(exists.)150
+1565 y Fs(-b)30 b Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f
+Fq(\014le)35 b Ft(exists)30 b(and)g(is)f(a)i(blo)s(c)m(k)f(sp)s(ecial)f
+(\014le.)150 1729 y Fs(-c)h Fj(file)162 b Ft(T)-8 b(rue)30
+b(if)f Fq(\014le)35 b Ft(exists)30 b(and)g(is)f(a)i(c)m(haracter)h(sp)s
+(ecial)d(\014le.)150 1893 y Fs(-d)h Fj(file)162 b Ft(T)-8
+b(rue)30 b(if)f Fq(\014le)35 b Ft(exists)30 b(and)g(is)f(a)i(directory)
+-8 b(.)150 2058 y Fs(-e)30 b Fj(file)162 b Ft(T)-8 b(rue)30
+b(if)f Fq(\014le)35 b Ft(exists.)150 2222 y Fs(-f)30
+b Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35
+b Ft(exists)30 b(and)g(is)f(a)i(regular)e(\014le.)150
+2386 y Fs(-g)h Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f
+Fq(\014le)35 b Ft(exists)30 b(and)g(its)f(set-group-id)h(bit)g(is)f
+(set.)150 2550 y Fs(-h)h Fj(file)162 b Ft(T)-8 b(rue)30
+b(if)f Fq(\014le)35 b Ft(exists)30 b(and)g(is)f(a)i(sym)m(b)s(olic)e
+(link.)150 2714 y Fs(-k)h Fj(file)162 b Ft(T)-8 b(rue)30
+b(if)f Fq(\014le)35 b Ft(exists)30 b(and)g(its)f Fs(")p
+Ft(stic)m(ky)p Fs(")h Ft(bit)g(is)f(set.)150 2878 y Fs(-p)h
+Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35 b
+Ft(exists)30 b(and)g(is)f(a)i(named)f(pip)s(e)e(\(FIF)m(O\).)150
+3042 y Fs(-r)i Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f
+Fq(\014le)35 b Ft(exists)30 b(and)g(is)f(readable.)150
+3206 y Fs(-s)h Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f
+Fq(\014le)35 b Ft(exists)30 b(and)g(has)g(a)g(size)h(greater)g(than)f
+(zero.)150 3370 y Fs(-t)g Fj(fd)258 b Ft(T)-8 b(rue)30
+b(if)f(\014le)h(descriptor)f Fq(fd)k Ft(is)d(op)s(en)f(and)h(refers)g
+(to)h(a)g(terminal.)150 3534 y Fs(-u)f Fj(file)162 b
+Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35 b Ft(exists)30 b(and)g(its)f
+(set-user-id)h(bit)f(is)h(set.)150 3698 y Fs(-w)g Fj(file)162
+b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35 b Ft(exists)30
+b(and)g(is)f(writable.)150 3863 y Fs(-x)h Fj(file)162
+b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35 b Ft(exists)30
+b(and)g(is)f(executable.)150 4027 y Fs(-O)h Fj(file)162
+b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35 b Ft(exists)30
+b(and)g(is)f(o)m(wned)h(b)m(y)h(the)f(e\013ectiv)m(e)i(user)e(id.)150
+4191 y Fs(-G)g Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f
+Fq(\014le)35 b Ft(exists)30 b(and)g(is)f(o)m(wned)h(b)m(y)h(the)f
+(e\013ectiv)m(e)i(group)e(id.)150 4355 y Fs(-L)g Fj(file)162
+b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35 b Ft(exists)30
+b(and)g(is)f(a)i(sym)m(b)s(olic)e(link.)150 4519 y Fs(-S)h
+Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35 b
+Ft(exists)30 b(and)g(is)f(a)i(so)s(c)m(k)m(et.)150 4683
+y Fs(-N)f Fj(file)162 b Ft(T)-8 b(rue)30 b(if)f Fq(\014le)35
+b Ft(exists)30 b(and)g(has)g(b)s(een)f(mo)s(di\014ed)g(since)g(it)h(w)m
+(as)h(last)f(read.)150 4847 y Fj(file1)39 b Fs(-nt)30
+b Fj(file2)630 4957 y Ft(T)-8 b(rue)23 b(if)g Fq(\014le1)31
+b Ft(is)23 b(new)m(er)h(\(according)g(to)h(mo)s(di\014cation)d(date\))j
+(than)f Fq(\014le2)p Ft(,)h(or)f(if)f Fq(\014le1)30 b
+Ft(exists)630 5066 y(and)g Fq(\014le2)37 b Ft(do)s(es)30
+b(not.)150 5230 y Fj(file1)39 b Fs(-ot)30 b Fj(file2)630
+5340 y Ft(T)-8 b(rue)30 b(if)f Fq(\014le1)37 b Ft(is)30
+b(older)f(than)h Fq(\014le2)p Ft(,)h(or)f(if)f Fq(\014le2)37
+b Ft(exists)30 b(and)g Fq(\014le1)37 b Ft(do)s(es)30
+b(not.)p eop
+%%Page: 70 76
+70 75 bop 150 -116 a Ft(70)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fj(file1)39 b Fs(-ef)30 b Fj(file2)630 408 y Ft(T)-8
+b(rue)30 b(if)f Fq(\014le1)37 b Ft(and)30 b Fq(\014le2)37
+b Ft(refer)30 b(to)i(the)e(same)h(device)f(and)g(ino)s(de)f(n)m(um)m(b)
+s(ers.)150 570 y Fs(-o)h Fj(optname)630 679 y Ft(T)-8
+b(rue)41 b(if)f(shell)f(option)i Fq(optname)47 b Ft(is)40
+b(enabled.)72 b(The)41 b(list)f(of)h(options)f(app)s(ears)h(in)f(the)
+630 789 y(description)18 b(of)j(the)f(`)p Fs(-o)p Ft(')g(option)g(to)h
+(the)g Fs(set)e Ft(builtin)e(\(see)k(Section)f(4.3)h([The)g(Set)f
+(Builtin],)630 898 y(page)31 b(50\).)150 1060 y Fs(-z)f
+Fj(string)630 1169 y Ft(T)-8 b(rue)30 b(if)f(the)i(length)f(of)g
+Fq(string)37 b Ft(is)30 b(zero.)150 1330 y Fs(-n)g Fj(string)150
+1440 y(string)192 b Ft(T)-8 b(rue)30 b(if)f(the)i(length)f(of)g
+Fq(string)37 b Ft(is)30 b(non-zero.)150 1601 y Fj(string1)39
+b Fs(==)30 b Fj(string2)630 1711 y Ft(T)-8 b(rue)33 b(if)g(the)h
+(strings)e(are)i(equal.)50 b(`)p Fs(=)p Ft(')34 b(ma)m(y)g(b)s(e)f
+(used)g(in)f(place)i(of)f(`)p Fs(==)p Ft(')h(for)f(strict)h
+Fl(posix)630 1820 y Ft(compliance.)150 1981 y Fj(string1)39
+b Fs(!=)30 b Fj(string2)630 2091 y Ft(T)-8 b(rue)30 b(if)f(the)i
+(strings)e(are)i(not)f(equal.)150 2252 y Fj(string1)39
+b Fs(<)30 b Fj(string2)630 2362 y Ft(T)-8 b(rue)30 b(if)f
+Fq(string1)37 b Ft(sorts)31 b(b)s(efore)f Fq(string2)37
+b Ft(lexicographically)28 b(in)h(the)i(curren)m(t)f(lo)s(cale.)150
+2523 y Fj(string1)39 b Fs(>)30 b Fj(string2)630 2632
+y Ft(T)-8 b(rue)30 b(if)f Fq(string1)37 b Ft(sorts)31
+b(after)g Fq(string2)37 b Ft(lexicographically)28 b(in)h(the)h(curren)m
+(t)h(lo)s(cale.)150 2794 y Fj(arg1)40 b Fs(OP)29 b Fj(arg2)630
+2903 y Fs(OP)k Ft(is)g(one)h(of)h(`)p Fs(-eq)p Ft(',)f(`)p
+Fs(-ne)p Ft(',)h(`)p Fs(-lt)p Ft(',)g(`)p Fs(-le)p Ft(',)f(`)p
+Fs(-gt)p Ft(',)h(or)f(`)p Fs(-ge)p Ft('.)51 b(These)34
+b(arithmetic)f(binary)630 3013 y(op)s(erators)j(return)e(true)i(if)e
+Fq(arg1)44 b Ft(is)35 b(equal)g(to,)j(not)e(equal)f(to,)j(less)d(than,)
+i(less)e(than)g(or)630 3122 y(equal)28 b(to,)h(greater)h(than,)e(or)g
+(greater)i(than)d(or)i(equal)e(to)i Fq(arg2)p Ft(,)h(resp)s(ectiv)m
+(ely)-8 b(.)40 b Fq(Arg1)c Ft(and)630 3232 y Fq(arg2)j
+Ft(ma)m(y)30 b(b)s(e)g(p)s(ositiv)m(e)g(or)g(negativ)m(e)i(in)m
+(tegers.)150 3494 y Fr(6.5)68 b(Shell)45 b(Arithmetic)275
+3740 y Ft(The)34 b(shell)e(allo)m(ws)i(arithmetic)g(expressions)g(to)h
+(b)s(e)f(ev)-5 b(aluated,)36 b(as)f(one)g(of)g(the)f(shell)f
+(expansions)150 3849 y(or)d(b)m(y)h(the)f Fs(let)g Ft(and)f(the)i(`)p
+Fs(-i)p Ft(')f(option)g(to)h(the)g Fs(declare)d Ft(builtins.)275
+3985 y(Ev)-5 b(aluation)25 b(is)h(done)g(in)f(\014xed-width)g(in)m
+(tegers)i(with)e(no)i(c)m(hec)m(k)h(for)e(o)m(v)m(er\015o)m(w,)j
+(though)d(division)e(b)m(y)150 4095 y(0)j(is)f(trapp)s(ed)g(and)h
+(\015agged)g(as)h(an)f(error.)39 b(The)26 b(op)s(erators)h(and)g(their)
+f(precedence,)i(asso)s(ciativit)m(y)-8 b(,)29 b(and)150
+4205 y(v)-5 b(alues)34 b(are)i(the)f(same)g(as)h(in)d(the)i(C)g
+(language.)55 b(The)35 b(follo)m(wing)e(list)h(of)h(op)s(erators)g(is)f
+(group)s(ed)g(in)m(to)150 4314 y(lev)m(els)25 b(of)h(equal-precedence)h
+(op)s(erators.)39 b(The)25 b(lev)m(els)h(are)g(listed)f(in)f(order)i
+(of)g(decreasing)f(precedence.)150 4476 y Fj(id)11 b
+Fs(++)29 b Fj(id)p Fs(--)630 4586 y Ft(v)-5 b(ariable)29
+b(p)s(ost-incremen)m(t)h(and)g(p)s(ost-decremen)m(t)150
+4747 y Fs(++)p Fj(id)40 b Fs(--)p Fj(id)630 4857 y Ft(v)-5
+b(ariable)29 b(pre-incremen)m(t)h(and)g(pre-decremen)m(t)150
+5018 y Fs(-)g(+)354 b Ft(unary)29 b(min)m(us)g(and)h(plus)150
+5179 y Fs(!)g(~)354 b Ft(logical)30 b(and)g(bit)m(wise)f(negation)150
+5340 y Fs(**)384 b Ft(exp)s(onen)m(tiation)p eop
+%%Page: 71 77
+71 76 bop 150 -116 a Ft(Chapter)30 b(6:)41 b(Bash)30
+b(F)-8 b(eatures)2484 b(71)150 299 y Fs(*)30 b(/)g(\045)276
+b Ft(m)m(ultiplication,)28 b(division,)f(remainder)150
+464 y Fs(+)j(-)354 b Ft(addition,)29 b(subtraction)150
+630 y Fs(<<)h(>>)258 b Ft(left)30 b(and)g(righ)m(t)g(bit)m(wise)f
+(shifts)150 795 y Fs(<=)h(>=)g(<)g(>)102 b Ft(comparison)150
+961 y Fs(==)30 b(!=)258 b Ft(equalit)m(y)30 b(and)g(inequalit)m(y)150
+1126 y Fs(&)432 b Ft(bit)m(wise)29 b(AND)150 1292 y Fs(^)432
+b Ft(bit)m(wise)29 b(exclusiv)m(e)h(OR)150 1458 y Fs(|)432
+b Ft(bit)m(wise)29 b(OR)150 1623 y Fs(&&)384 b Ft(logical)30
+b(AND)150 1789 y Fs(||)384 b Ft(logical)30 b(OR)150 1954
+y Fs(expr)f(?)h(expr)f(:)h(expr)630 2064 y Ft(conditional)f(op)s
+(erator)150 2229 y Fs(=)h(*=)g(/=)g(\045=)f(+=)h(-=)g(<<=)f(>>=)h(&=)g
+(^=)f(|=)630 2339 y Ft(assignmen)m(t)150 2504 y Fs(expr1)g(,)h(expr2)
+630 2614 y Ft(comma)275 2782 y(Shell)36 b(v)-5 b(ariables)37
+b(are)i(allo)m(w)m(ed)g(as)g(op)s(erands;)i(parameter)e(expansion)f(is)
+f(p)s(erformed)h(b)s(efore)g(the)150 2892 y(expression)f(is)g(ev)-5
+b(aluated.)65 b(Within)36 b(an)j(expression,)g(shell)d(v)-5
+b(ariables)37 b(ma)m(y)i(also)f(b)s(e)g(referenced)g(b)m(y)150
+3002 y(name)31 b(without)e(using)g(the)i(parameter)g(expansion)e(syn)m
+(tax.)42 b(A)31 b(shell)d(v)-5 b(ariable)30 b(that)h(is)e(n)m(ull)g(or)
+h(unset)150 3111 y(ev)-5 b(aluates)40 b(to)g(0)g(when)e(referenced)h(b)
+m(y)g(name)h(without)e(using)g(the)h(parameter)h(expansion)e(syn)m
+(tax.)150 3221 y(The)d(v)-5 b(alue)36 b(of)g(a)h(v)-5
+b(ariable)34 b(is)h(ev)-5 b(aluated)37 b(as)f(an)g(arithmetic)f
+(expression)g(when)g(it)g(is)g(referenced,)j(or)150 3330
+y(when)31 b(a)i(v)-5 b(ariable)31 b(whic)m(h)g(has)h(b)s(een)f(giv)m
+(en)i(the)f Fq(in)m(teger)39 b Ft(attribute)32 b(using)f(`)p
+Fs(declare)e(-i)p Ft(')i(is)h(assigned)150 3440 y(a)37
+b(v)-5 b(alue.)57 b(A)36 b(n)m(ull)e(v)-5 b(alue)36 b(ev)-5
+b(aluates)37 b(to)g(0.)58 b(A)36 b(shell)f(v)-5 b(ariable)34
+b(need)i(not)h(ha)m(v)m(e)g(its)f(in)m(teger)g(attribute)150
+3550 y(turned)29 b(on)h(to)i(b)s(e)d(used)h(in)f(an)h(expression.)275
+3690 y(Constan)m(ts)41 b(with)f(a)i(leading)d(0)j(are)g(in)m(terpreted)
+e(as)h(o)s(ctal)h(n)m(um)m(b)s(ers.)72 b(A)41 b(leading)f(`)p
+Fs(0x)p Ft(')h(or)g(`)p Fs(0X)p Ft(')150 3800 y(denotes)31
+b(hexadecimal.)41 b(Otherwise,)30 b(n)m(um)m(b)s(ers)f(tak)m(e)k(the)e
+(form)f([)p Fq(base)5 b Fs(#)p Ft(])p Fq(n)p Ft(,)31
+b(where)f Fq(base)36 b Ft(is)30 b(a)h(decimal)150 3909
+y(n)m(um)m(b)s(er)26 b(b)s(et)m(w)m(een)i(2)f(and)g(64)h(represen)m
+(ting)f(the)g(arithmetic)f(base,)j(and)d Fq(n)h Ft(is)f(a)i(n)m(um)m(b)
+s(er)e(in)g(that)i(base.)150 4019 y(If)39 b Fq(base)5
+b Fs(#)40 b Ft(is)f(omitted,)j(then)e(base)g(10)g(is)f(used.)68
+b(The)39 b(digits)g(greater)i(than)e(9)h(are)g(represen)m(ted)g(b)m(y)
+150 4129 y(the)34 b(lo)m(w)m(ercase)g(letters,)h(the)e(upp)s(ercase)g
+(letters,)h(`)p Fs(@)p Ft(',)h(and)e(`)p Fs(_)p Ft(',)h(in)e(that)i
+(order.)50 b(If)32 b Fq(base)39 b Ft(is)33 b(less)f(than)150
+4238 y(or)38 b(equal)f(to)i(36,)h(lo)m(w)m(ercase)g(and)d(upp)s(ercase)
+g(letters)h(ma)m(y)g(b)s(e)f(used)g(in)m(terc)m(hangably)g(to)i
+(represen)m(t)150 4348 y(n)m(um)m(b)s(ers)29 b(b)s(et)m(w)m(een)i(10)g
+(and)f(35.)275 4488 y(Op)s(erators)44 b(are)h(ev)-5 b(aluated)45
+b(in)f(order)g(of)h(precedence.)85 b(Sub-expressions)43
+b(in)g(paren)m(theses)j(are)150 4598 y(ev)-5 b(aluated)31
+b(\014rst)e(and)h(ma)m(y)h(o)m(v)m(erride)f(the)h(precedence)g(rules)e
+(ab)s(o)m(v)m(e.)150 4871 y Fr(6.6)68 b(Aliases)275 5121
+y Fq(Aliases)32 b Ft(allo)m(w)d(a)i(string)d(to)j(b)s(e)e(substituted)f
+(for)i(a)g(w)m(ord)f(when)g(it)g(is)g(used)g(as)h(the)g(\014rst)f(w)m
+(ord)h(of)g(a)150 5230 y(simple)g(command.)45 b(The)31
+b(shell)g(main)m(tains)f(a)j(list)d(of)i(aliases)g(that)g(ma)m(y)h(b)s
+(e)e(set)h(and)g(unset)f(with)g(the)150 5340 y Fs(alias)e
+Ft(and)h Fs(unalias)e Ft(builtin)f(commands.)p eop
+%%Page: 72 78
+72 77 bop 150 -116 a Ft(72)2572 b(Bash)31 b(Reference)g(Man)m(ual)275
+299 y(The)e(\014rst)f(w)m(ord)i(of)f(eac)m(h)i(simple)d(command,)i(if)e
+(unquoted,)h(is)g(c)m(hec)m(k)m(ed)i(to)g(see)f(if)f(it)g(has)g(an)g
+(alias.)150 408 y(If)34 b(so,)i(that)f(w)m(ord)f(is)f(replaced)h(b)m(y)
+g(the)h(text)g(of)g(the)f(alias.)52 b(The)34 b(alias)g(name)g(and)g
+(the)g(replacemen)m(t)150 518 y(text)g(ma)m(y)f(con)m(tain)g(an)m(y)g
+(v)-5 b(alid)31 b(shell)g(input,)h(including)d(shell)i(metac)m
+(haracters,)36 b(with)c(the)h(exception)150 628 y(that)i(the)f(alias)f
+(name)h(ma)m(y)h(not)g(con)m(tain)f(`)p Fs(=)p Ft('.)52
+b(The)34 b(\014rst)f(w)m(ord)h(of)g(the)g(replacemen)m(t)h(text)g(is)e
+(tested)150 737 y(for)26 b(aliases,)h(but)f(a)h(w)m(ord)f(that)h(is)f
+(iden)m(tical)f(to)i(an)g(alias)e(b)s(eing)g(expanded)h(is)g(not)g
+(expanded)g(a)h(second)150 847 y(time.)40 b(This)27 b(means)i(that)g
+(one)g(ma)m(y)h(alias)e Fs(ls)g Ft(to)i Fs("ls)f(-F")p
+Ft(,)g(for)f(instance,)i(and)e(Bash)h(do)s(es)f(not)h(try)g(to)150
+956 y(recursiv)m(ely)j(expand)g(the)h(replacemen)m(t)g(text.)50
+b(If)32 b(the)h(last)g(c)m(haracter)h(of)g(the)f(alias)f(v)-5
+b(alue)32 b(is)g(a)h(space)150 1066 y(or)f(tab)g(c)m(haracter,)j(then)d
+(the)g(next)g(command)g(w)m(ord)g(follo)m(wing)e(the)i(alias)g(is)f
+(also)h(c)m(hec)m(k)m(ed)i(for)e(alias)150 1176 y(expansion.)275
+1325 y(Aliases)27 b(are)h(created)i(and)d(listed)g(with)g(the)h
+Fs(alias)f Ft(command,)h(and)g(remo)m(v)m(ed)h(with)e(the)h
+Fs(unalias)150 1434 y Ft(command.)275 1583 y(There)44
+b(is)g(no)h(mec)m(hanism)f(for)g(using)g(argumen)m(ts)h(in)e(the)i
+(replacemen)m(t)h(text,)j(as)d(in)d Fs(csh)p Ft(.)83
+b(If)150 1693 y(argumen)m(ts)37 b(are)h(needed,)g(a)g(shell)d(function)
+g(should)g(b)s(e)i(used)f(\(see)i(Section)f(3.3)h([Shell)d(F)-8
+b(unctions],)150 1802 y(page)31 b(13\).)275 1951 y(Aliases)g(are)j(not)
+e(expanded)g(when)g(the)h(shell)e(is)h(not)h(in)m(teractiv)m(e,)h
+(unless)d(the)i Fs(expand_aliases)150 2061 y Ft(shell)c(option)g(is)h
+(set)h(using)e Fs(shopt)g Ft(\(see)i(Section)f(4.2)i([Bash)e
+(Builtins],)e(page)k(39\).)275 2210 y(The)38 b(rules)g(concerning)h
+(the)g(de\014nition)e(and)i(use)g(of)g(aliases)g(are)g(somewhat)h
+(confusing.)66 b(Bash)150 2320 y(alw)m(a)m(ys)41 b(reads)g(at)h(least)f
+(one)g(complete)h(line)d(of)i(input)e(b)s(efore)i(executing)g(an)m(y)g
+(of)g(the)g(commands)150 2429 y(on)h(that)h(line.)75
+b(Aliases)42 b(are)g(expanded)g(when)f(a)i(command)f(is)f(read,)46
+b(not)c(when)g(it)f(is)h(executed.)150 2539 y(Therefore,)g(an)e(alias)f
+(de\014nition)e(app)s(earing)i(on)g(the)h(same)h(line)d(as)i(another)g
+(command)f(do)s(es)h(not)150 2648 y(tak)m(e)31 b(e\013ect)f(un)m(til)e
+(the)h(next)g(line)f(of)h(input)e(is)h(read.)41 b(The)28
+b(commands)h(follo)m(wing)f(the)h(alias)f(de\014nition)150
+2758 y(on)f(that)h(line)d(are)j(not)f(a\013ected)i(b)m(y)e(the)g(new)g
+(alias.)39 b(This)25 b(b)s(eha)m(vior)h(is)g(also)h(an)g(issue)f(when)g
+(functions)150 2868 y(are)d(executed.)39 b(Aliases)22
+b(are)h(expanded)f(when)f(a)i(function)f(de\014nition)e(is)i(read,)i
+(not)f(when)e(the)i(function)150 2977 y(is)h(executed,)k(b)s(ecause)d
+(a)h(function)e(de\014nition)e(is)j(itself)f(a)h(comp)s(ound)f
+(command.)39 b(As)25 b(a)h(consequence,)150 3087 y(aliases)34
+b(de\014ned)f(in)g(a)h(function)f(are)i(not)f(a)m(v)-5
+b(ailable)34 b(un)m(til)e(after)j(that)g(function)e(is)g(executed.)53
+b(T)-8 b(o)35 b(b)s(e)150 3196 y(safe,)41 b(alw)m(a)m(ys)e(put)e(alias)
+h(de\014nitions)e(on)i(a)h(separate)g(line,)g(and)f(do)g(not)g(use)g
+Fs(alias)f Ft(in)g(comp)s(ound)150 3306 y(commands.)275
+3455 y(F)-8 b(or)31 b(almost)f(ev)m(ery)h(purp)s(ose,)e(shell)g
+(functions)g(are)h(preferred)g(o)m(v)m(er)h(aliases.)150
+3749 y Fr(6.7)68 b(Arra)l(ys)275 4007 y Ft(Bash)33 b(pro)m(vides)f
+(one-dimensional)f(arra)m(y)i(v)-5 b(ariables.)48 b(An)m(y)33
+b(v)-5 b(ariable)32 b(ma)m(y)h(b)s(e)g(used)f(as)h(an)g(arra)m(y;)150
+4117 y(the)c Fs(declare)d Ft(builtin)f(will)h(explicitly)g(declare)j
+(an)f(arra)m(y)-8 b(.)41 b(There)28 b(is)g(no)g(maxim)m(um)g(limit)e
+(on)i(the)h(size)150 4227 y(of)d(an)g(arra)m(y)-8 b(,)27
+b(nor)f(an)m(y)g(requiremen)m(t)f(that)h(mem)m(b)s(ers)f(b)s(e)g
+(indexed)f(or)i(assigned)f(con)m(tiguously)-8 b(.)39
+b(Arra)m(ys)150 4336 y(are)31 b(zero-based.)275 4485
+y(An)f(arra)m(y)g(is)g(created)h(automatically)f(if)g(an)m(y)h(v)-5
+b(ariable)29 b(is)g(assigned)h(to)h(using)e(the)h(syn)m(tax)390
+4634 y Fs(name[)p Fj(subscript)11 b Fs(]=)p Fj(value)150
+4783 y Ft(The)25 b Fq(subscript)f Ft(is)h(treated)h(as)f(an)g
+(arithmetic)f(expression)g(that)i(m)m(ust)f(ev)-5 b(aluate)26
+b(to)f(a)h(n)m(um)m(b)s(er)e(greater)150 4893 y(than)30
+b(or)g(equal)g(to)h(zero.)42 b(T)-8 b(o)31 b(explicitly)d(declare)i(an)
+g(arra)m(y)-8 b(,)32 b(use)390 5042 y Fs(declare)46 b(-a)h
+Fj(name)150 5191 y Ft(The)30 b(syn)m(tax)390 5340 y Fs(declare)46
+b(-a)h Fj(name)11 b Fs([)p Fj(subscript)g Fs(])p eop
+%%Page: 73 79
+73 78 bop 150 -116 a Ft(Chapter)30 b(6:)41 b(Bash)30
+b(F)-8 b(eatures)2484 b(73)150 299 y(is)28 b(also)i(accepted;)h(the)f
+Fq(subscript)f Ft(is)f(ignored.)40 b(A)m(ttributes)29
+b(ma)m(y)h(b)s(e)e(sp)s(eci\014ed)g(for)h(an)g(arra)m(y)h(v)-5
+b(ariable)150 408 y(using)39 b(the)i Fs(declare)d Ft(and)i
+Fs(readonly)f Ft(builtins.)67 b(Eac)m(h)42 b(attribute)e(applies)f(to)i
+(all)f(mem)m(b)s(ers)f(of)i(an)150 518 y(arra)m(y)-8
+b(.)275 663 y(Arra)m(ys)30 b(are)h(assigned)e(to)i(using)e(comp)s(ound)
+g(assignmen)m(ts)h(of)h(the)f(form)390 809 y Fs(name=\(value)p
+Fj(1)55 b Fs(...)47 b(value)p Fj(n)11 b Fs(\))150 954
+y Ft(where)37 b(eac)m(h)h Fq(v)-5 b(alue)42 b Ft(is)37
+b(of)g(the)h(form)e Fs([[)p Fj(subscript)11 b Fs(]=])p
+Fq(string)p Ft(.)57 b(If)36 b(the)i(optional)e(subscript)f(is)i(sup-)
+150 1064 y(plied,)42 b(that)g(index)e(is)g(assigned)h(to;)47
+b(otherwise)41 b(the)g(index)f(of)i(the)f(elemen)m(t)h(assigned)e(is)h
+(the)g(last)150 1173 y(index)33 b(assigned)h(to)h(b)m(y)f(the)h
+(statemen)m(t)h(plus)c(one.)54 b(Indexing)32 b(starts)j(at)g(zero.)54
+b(This)33 b(syn)m(tax)i(is)e(also)150 1283 y(accepted)i(b)m(y)f(the)g
+Fs(declare)e Ft(builtin.)47 b(Individual)30 b(arra)m(y)k(elemen)m(ts)g
+(ma)m(y)h(b)s(e)e(assigned)g(to)h(using)f(the)150 1392
+y Fs(name[)p Fq(subscript)r Fs(]=)p Fq(v)-5 b(alue)31
+b Ft(syn)m(tax)g(in)m(tro)s(duced)e(ab)s(o)m(v)m(e.)275
+1538 y(An)m(y)k(elemen)m(t)h(of)g(an)f(arra)m(y)h(ma)m(y)g(b)s(e)f
+(referenced)g(using)f Fs(${name[)p Fq(subscript)r Fs(]})p
+Ft(.)45 b(The)33 b(braces)h(are)150 1647 y(required)27
+b(to)k(a)m(v)m(oid)e(con\015icts)g(with)f(the)i(shell's)d(\014lename)i
+(expansion)f(op)s(erators.)41 b(If)28 b(the)i Fq(subscript)f
+Ft(is)150 1757 y(`)p Fs(@)p Ft(')g(or)h(`)p Fs(*)p Ft(',)f(the)h(w)m
+(ord)f(expands)f(to)i(all)e(mem)m(b)s(ers)g(of)i(the)f(arra)m(y)h
+Fq(name)p Ft(.)40 b(These)29 b(subscripts)e(di\013er)h(only)150
+1866 y(when)36 b(the)g(w)m(ord)g(app)s(ears)g(within)e(double)h
+(quotes.)60 b(If)36 b(the)h(w)m(ord)f(is)f(double-quoted,)j
+Fs(${name[*]})150 1976 y Ft(expands)20 b(to)h(a)g(single)e(w)m(ord)h
+(with)g(the)h(v)-5 b(alue)20 b(of)g(eac)m(h)i(arra)m(y)f(mem)m(b)s(er)f
+(separated)h(b)m(y)g(the)f(\014rst)g(c)m(haracter)150
+2086 y(of)38 b(the)g Fs(IFS)f Ft(v)-5 b(ariable,)39 b(and)e
+Fs(${name[@]})e Ft(expands)i(eac)m(h)i(elemen)m(t)f(of)g
+Fq(name)43 b Ft(to)c(a)f(separate)h(w)m(ord.)150 2195
+y(When)33 b(there)g(are)g(no)g(arra)m(y)g(mem)m(b)s(ers,)g
+Fs(${name[@]})d Ft(expands)i(to)i(nothing.)47 b(This)31
+b(is)h(analogous)h(to)150 2305 y(the)i(expansion)f(of)i(the)f(sp)s
+(ecial)f(parameters)h(`)p Fs(@)p Ft(')h(and)e(`)p Fs(*)p
+Ft('.)55 b Fs(${#name[)p Fq(subscript)r Fs(]})31 b Ft(expands)j(to)i
+(the)150 2414 y(length)k(of)g Fs(${name[)p Fq(subscript)r
+Fs(]})p Ft(.)66 b(If)40 b Fq(subscript)g Ft(is)g(`)p
+Fs(@)p Ft(')g(or)h(`)p Fs(*)p Ft(',)i(the)e(expansion)e(is)g(the)i(n)m
+(um)m(b)s(er)e(of)150 2524 y(elemen)m(ts)e(in)e(the)i(arra)m(y)-8
+b(.)60 b(Referencing)36 b(an)g(arra)m(y)i(v)-5 b(ariable)35
+b(without)g(a)i(subscript)e(is)g(equiv)-5 b(alen)m(t)36
+b(to)150 2634 y(referencing)30 b(elemen)m(t)g(zero.)275
+2779 y(The)i Fs(unset)g Ft(builtin)e(is)i(used)h(to)h(destro)m(y)g
+(arra)m(ys.)50 b Fs(unset)31 b Fq(name)5 b Ft([)p Fq(subscript)r
+Ft(])32 b(destro)m(ys)i(the)f(arra)m(y)150 2888 y(elemen)m(t)c(at)h
+(index)d Fq(subscript)p Ft(.)38 b Fs(unset)27 b Fq(name)p
+Ft(,)j(where)e Fq(name)34 b Ft(is)27 b(an)i(arra)m(y)-8
+b(,)30 b(remo)m(v)m(es)g(the)f(en)m(tire)g(arra)m(y)-8
+b(.)150 2998 y(A)30 b(subscript)f(of)h(`)p Fs(*)p Ft(')h(or)f(`)p
+Fs(@)p Ft(')h(also)f(remo)m(v)m(es)i(the)e(en)m(tire)h(arra)m(y)-8
+b(.)275 3143 y(The)22 b Fs(declare)p Ft(,)h Fs(local)p
+Ft(,)g(and)g Fs(readonly)e Ft(builtins)e(eac)m(h)25 b(accept)f(a)g(`)p
+Fs(-a)p Ft(')f(option)f(to)i(sp)s(ecify)e(an)h(arra)m(y)-8
+b(.)150 3253 y(The)24 b Fs(read)g Ft(builtin)e(accepts)k(a)f(`)p
+Fs(-a)p Ft(')g(option)g(to)g(assign)g(a)g(list)f(of)h(w)m(ords)f(read)h
+(from)g(the)g(standard)f(input)150 3363 y(to)37 b(an)f(arra)m(y)-8
+b(,)39 b(and)c(can)h(read)g(v)-5 b(alues)36 b(from)f(the)i(standard)e
+(input)f(in)m(to)i(individual)c(arra)m(y)k(elemen)m(ts.)150
+3472 y(The)30 b Fs(set)f Ft(and)h Fs(declare)e Ft(builtins)f(displa)m
+(y)h(arra)m(y)j(v)-5 b(alues)30 b(in)f(a)h(w)m(a)m(y)h(that)g(allo)m
+(ws)f(them)g(to)h(b)s(e)f(reused)150 3582 y(as)h(input.)150
+3866 y Fr(6.8)68 b(The)45 b(Directory)g(Stac)l(k)275
+4121 y Ft(The)26 b(directory)f(stac)m(k)j(is)e(a)h(list)e(of)i(recen)m
+(tly-visited)e(directories.)39 b(The)26 b Fs(pushd)f
+Ft(builtin)e(adds)j(direc-)150 4231 y(tories)e(to)g(the)h(stac)m(k)g
+(as)f(it)g(c)m(hanges)g(the)h(curren)m(t)e(directory)-8
+b(,)26 b(and)d(the)h Fs(popd)f Ft(builtin)d(remo)m(v)m(es)26
+b(sp)s(eci\014ed)150 4340 y(directories)h(from)h(the)h(stac)m(k)h(and)d
+(c)m(hanges)j(the)e(curren)m(t)g(directory)g(to)h(the)g(directory)e
+(remo)m(v)m(ed.)41 b(The)150 4450 y Fs(dirs)29 b Ft(builtin)e(displa)m
+(ys)i(the)h(con)m(ten)m(ts)i(of)f(the)f(directory)g(stac)m(k.)275
+4595 y(The)35 b(con)m(ten)m(ts)i(of)f(the)h(directory)e(stac)m(k)i(are)
+f(also)g(visible)e(as)i(the)g(v)-5 b(alue)35 b(of)h(the)g
+Fs(DIRSTACK)e Ft(shell)150 4705 y(v)-5 b(ariable.)150
+4951 y Fk(6.8.1)63 b(Directory)40 b(Stac)m(k)g(Builtins)150
+5200 y Fs(dirs)870 5340 y(dirs)47 b([+)p Fj(N)57 b Fs(|)48
+b(-)p Fj(N)11 b Fs(])46 b([-clpv])p eop
+%%Page: 74 80
+74 79 bop 150 -116 a Ft(74)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(Displa)m(y)i(the)h(list)e(of)i(curren)m(tly)f(remem)m(b)s(ered)g
+(directories.)49 b(Directories)34 b(are)g(added)f(to)630
+408 y(the)28 b(list)f(with)g(the)h Fs(pushd)f Ft(command;)i(the)f
+Fs(popd)f Ft(command)h(remo)m(v)m(es)h(directories)e(from)630
+518 y(the)k(list.)630 670 y Fs(+)p Fj(N)384 b Ft(Displa)m(ys)21
+b(the)h Fq(N)10 b Ft(th)21 b(directory)g(\(coun)m(ting)h(from)f(the)h
+(left)f(of)h(the)g(list)e(prin)m(ted)1110 780 y(b)m(y)30
+b Fs(dirs)f Ft(when)h(in)m(v)m(ok)m(ed)h(without)e(options\),)h
+(starting)g(with)g(zero.)630 932 y Fs(-)p Fj(N)384 b
+Ft(Displa)m(ys)45 b(the)i Fq(N)10 b Ft(th)46 b(directory)g(\(coun)m
+(ting)g(from)g(the)g(righ)m(t)g(of)h(the)f(list)1110
+1042 y(prin)m(ted)24 b(b)m(y)h Fs(dirs)g Ft(when)f(in)m(v)m(ok)m(ed)i
+(without)f(options\),)h(starting)g(with)e(zero.)630 1194
+y Fs(-c)384 b Ft(Clears)30 b(the)g(directory)g(stac)m(k)i(b)m(y)e
+(deleting)f(all)h(of)g(the)h(elemen)m(ts.)630 1347 y
+Fs(-l)384 b Ft(Pro)s(duces)30 b(a)i(longer)f(listing;)f(the)i(default)e
+(listing)g(format)h(uses)g(a)h(tilde)e(to)1110 1456 y(denote)h(the)f
+(home)h(directory)-8 b(.)630 1609 y Fs(-p)384 b Ft(Causes)30
+b Fs(dirs)f Ft(to)i(prin)m(t)e(the)i(directory)f(stac)m(k)i(with)d(one)
+h(en)m(try)h(p)s(er)e(line.)630 1761 y Fs(-v)384 b Ft(Causes)36
+b Fs(dirs)f Ft(to)i(prin)m(t)e(the)h(directory)g(stac)m(k)i(with)d(one)
+i(en)m(try)f(p)s(er)f(line,)1110 1871 y(pre\014xing)29
+b(eac)m(h)i(en)m(try)g(with)e(its)h(index)e(in)i(the)g(stac)m(k.)150
+2023 y Fs(popd)870 2154 y(popd)47 b([+)p Fj(N)57 b Fs(|)48
+b(-)p Fj(N)11 b Fs(])46 b([-n])630 2285 y Ft(Remo)m(v)m(e)26
+b(the)e(top)g(en)m(try)h(from)e(the)h(directory)g(stac)m(k,)j(and)c
+Fs(cd)h Ft(to)h(the)f(new)f(top)i(directory)-8 b(.)630
+2395 y(When)32 b(no)g(argumen)m(ts)h(are)g(giv)m(en,)g
+Fs(popd)e Ft(remo)m(v)m(es)j(the)f(top)f(directory)g(from)g(the)g(stac)
+m(k)630 2504 y(and)f(p)s(erforms)e(a)j Fs(cd)f Ft(to)h(the)f(new)g(top)
+h(directory)-8 b(.)43 b(The)31 b(elemen)m(ts)h(are)f(n)m(um)m(b)s(ered)
+f(from)630 2614 y(0)d(starting)f(at)h(the)g(\014rst)f(directory)g
+(listed)f(with)g Fs(dirs)p Ft(;)i(i.e.,)h Fs(popd)d Ft(is)h(equiv)-5
+b(alen)m(t)26 b(to)h Fs(popd)630 2724 y(+0)p Ft(.)630
+2876 y Fs(+)p Fj(N)384 b Ft(Remo)m(v)m(es)22 b(the)f
+Fq(N)10 b Ft(th)20 b(directory)f(\(coun)m(ting)i(from)f(the)g(left)g
+(of)h(the)f(list)f(prin)m(ted)1110 2986 y(b)m(y)30 b
+Fs(dirs)p Ft(\),)g(starting)g(with)f(zero.)630 3138 y
+Fs(-)p Fj(N)384 b Ft(Remo)m(v)m(es)46 b(the)g Fq(N)10
+b Ft(th)44 b(directory)g(\(coun)m(ting)h(from)g(the)g(righ)m(t)f(of)h
+(the)g(list)1110 3248 y(prin)m(ted)29 b(b)m(y)h Fs(dirs)p
+Ft(\),)g(starting)g(with)f(zero.)630 3400 y Fs(-n)384
+b Ft(Suppresses)27 b(the)j(normal)f(c)m(hange)h(of)g(directory)f(when)f
+(remo)m(ving)i(directo-)1110 3510 y(ries)f(from)h(the)h(stac)m(k,)h(so)
+f(that)g(only)e(the)i(stac)m(k)g(is)f(manipulated.)150
+3684 y Fs(pushd)870 3815 y(pushd)46 b([)p Fj(dir)58 b
+Fs(|)47 b(+)p Fj(N)58 b Fs(|)47 b Fj(-N)11 b Fs(])47
+b([-n])630 3946 y Ft(Sa)m(v)m(e)30 b(the)e(curren)m(t)g(directory)g(on)
+g(the)h(top)f(of)h(the)f(directory)g(stac)m(k)i(and)e(then)g
+Fs(cd)f Ft(to)i Fq(dir)p Ft(.)630 4055 y(With)h(no)g(argumen)m(ts,)h
+Fs(pushd)e Ft(exc)m(hanges)j(the)e(top)h(t)m(w)m(o)h(directories.)630
+4208 y Fs(+)p Fj(N)384 b Ft(Brings)28 b(the)g Fq(N)10
+b Ft(th)29 b(directory)f(\(coun)m(ting)h(from)f(the)g(left)h(of)f(the)h
+(list)e(prin)m(ted)1110 4317 y(b)m(y)34 b Fs(dirs)p Ft(,)g(starting)g
+(with)f(zero\))j(to)f(the)f(top)g(of)h(the)f(list)f(b)m(y)h(rotating)h
+(the)1110 4427 y(stac)m(k.)630 4579 y Fs(-)p Fj(N)384
+b Ft(Brings)22 b(the)h Fq(N)10 b Ft(th)23 b(directory)g(\(coun)m(ting)g
+(from)f(the)i(righ)m(t)e(of)h(the)h(list)d(prin)m(ted)1110
+4689 y(b)m(y)34 b Fs(dirs)p Ft(,)g(starting)g(with)f(zero\))j(to)f(the)
+f(top)g(of)h(the)f(list)f(b)m(y)h(rotating)h(the)1110
+4798 y(stac)m(k.)630 4951 y Fs(-n)384 b Ft(Suppresses)26
+b(the)i(normal)g(c)m(hange)h(of)f(directory)g(when)f(adding)g
+(directories)1110 5060 y(to)k(the)g(stac)m(k,)h(so)e(that)h(only)f(the)
+g(stac)m(k)i(is)e(manipulated.)630 5213 y Fj(dir)336
+b Ft(Mak)m(es)36 b(the)f(curren)m(t)g(w)m(orking)f(directory)g(b)s(e)g
+(the)h(top)g(of)g(the)g(stac)m(k,)j(and)1110 5322 y(then)30
+b(executes)i(the)e(equiv)-5 b(alen)m(t)30 b(of)h(`)p
+Fs(cd)f Fq(dir)7 b Ft('.)38 b Fs(cd)p Ft(s)30 b(to)h
+Fq(dir)p Ft(.)p eop
+%%Page: 75 81
+75 80 bop 150 -116 a Ft(Chapter)30 b(6:)41 b(Bash)30
+b(F)-8 b(eatures)2484 b(75)150 299 y Fr(6.9)68 b(Con)l(trolling)47
+b(the)e(Prompt)275 544 y Ft(The)c(v)-5 b(alue)42 b(of)g(the)h(v)-5
+b(ariable)41 b Fs(PROMPT_COMMAND)d Ft(is)j(examined)g(just)h(b)s(efore)
+g(Bash)g(prin)m(ts)f(eac)m(h)150 653 y(primary)f(prompt.)73
+b(If)41 b Fs(PROMPT_COMMAND)d Ft(is)i(set)i(and)f(has)h(a)g(non-n)m
+(ull)d(v)-5 b(alue,)44 b(then)d(the)h(v)-5 b(alue)41
+b(is)150 763 y(executed)31 b(just)f(as)h(if)e(it)h(had)g(b)s(een)f(t)m
+(yp)s(ed)h(on)h(the)f(command)g(line.)275 898 y(In)d(addition,)h(the)h
+(follo)m(wing)e(table)h(describ)s(es)f(the)i(sp)s(ecial)e(c)m
+(haracters)j(whic)m(h)e(can)g(app)s(ear)g(in)g(the)150
+1008 y(prompt)h(v)-5 b(ariables:)150 1168 y Fs(\\a)384
+b Ft(A)30 b(b)s(ell)f(c)m(haracter.)150 1328 y Fs(\\d)384
+b Ft(The)30 b(date,)h(in)e Fs(")p Ft(W)-8 b(eekda)m(y)32
+b(Mon)m(th)f(Date)p Fs(")h Ft(format)f(\(e.g.,)h Fs(")p
+Ft(T)-8 b(ue)30 b(Ma)m(y)h(26)p Fs(")p Ft(\).)150 1488
+y Fs(\\D{)p Fj(format)11 b Fs(})630 1598 y Ft(The)27
+b Fq(format)i Ft(is)e(passed)f(to)i Fs(strftime)p Ft(\(3\))f(and)f(the)
+i(result)e(is)g(inserted)g(in)m(to)h(the)h(prompt)630
+1708 y(string;)41 b(an)e(empt)m(y)f Fq(format)j Ft(results)c(in)g(a)i
+(lo)s(cale-sp)s(eci\014c)e(time)h(represen)m(tation.)64
+b(The)630 1817 y(braces)31 b(are)f(required.)150 1977
+y Fs(\\e)384 b Ft(An)30 b(escap)s(e)h(c)m(haracter.)150
+2137 y Fs(\\h)384 b Ft(The)30 b(hostname,)h(up)e(to)i(the)g(\014rst)e
+(`.'.)150 2298 y Fs(\\H)384 b Ft(The)30 b(hostname.)150
+2458 y Fs(\\j)384 b Ft(The)30 b(n)m(um)m(b)s(er)f(of)h(jobs)g(curren)m
+(tly)g(managed)h(b)m(y)f(the)g(shell.)150 2618 y Fs(\\l)384
+b Ft(The)30 b(basename)h(of)f(the)h(shell's)d(terminal)h(device)h
+(name.)150 2778 y Fs(\\n)384 b Ft(A)30 b(newline.)150
+2938 y Fs(\\r)384 b Ft(A)30 b(carriage)h(return.)150
+3098 y Fs(\\s)384 b Ft(The)22 b(name)g(of)h(the)f(shell,)g(the)h
+(basename)f(of)h Fs($0)f Ft(\(the)g(p)s(ortion)f(follo)m(wing)g(the)i
+(\014nal)d(slash\).)150 3258 y Fs(\\t)384 b Ft(The)30
+b(time,)g(in)f(24-hour)i(HH:MM:SS)g(format.)150 3418
+y Fs(\\T)384 b Ft(The)30 b(time,)g(in)f(12-hour)i(HH:MM:SS)g(format.)
+150 3579 y Fs(\\@)384 b Ft(The)30 b(time,)g(in)f(12-hour)i(am/pm)f
+(format.)150 3739 y Fs(\\A)384 b Ft(The)30 b(time,)g(in)f(24-hour)i
+(HH:MM)g(format.)150 3899 y Fs(\\u)384 b Ft(The)30 b(username)g(of)g
+(the)h(curren)m(t)f(user.)150 4059 y Fs(\\v)384 b Ft(The)30
+b(v)m(ersion)g(of)g(Bash)h(\(e.g.,)h(2.00\))150 4219
+y Fs(\\V)384 b Ft(The)30 b(release)h(of)f(Bash,)h(v)m(ersion)f
+Fs(+)g Ft(patc)m(hlev)m(el)g(\(e.g.,)j(2.00.0\))150 4379
+y Fs(\\w)384 b Ft(The)30 b(curren)m(t)g(w)m(orking)g(directory)-8
+b(.)150 4539 y Fs(\\W)384 b Ft(The)30 b(basename)h(of)f
+Fs($PWD)p Ft(.)150 4699 y Fs(\\!)384 b Ft(The)30 b(history)f(n)m(um)m
+(b)s(er)g(of)i(this)e(command.)150 4860 y Fs(\\#)384
+b Ft(The)30 b(command)g(n)m(um)m(b)s(er)f(of)i(this)e(command.)150
+5020 y Fs(\\$)384 b Ft(If)30 b(the)g(e\013ectiv)m(e)i(uid)d(is)g(0,)i
+Fs(#)p Ft(,)g(otherwise)f Fs($)p Ft(.)150 5180 y Fs(\\)p
+Fj(nnn)288 b Ft(The)30 b(c)m(haracter)i(whose)e(ASCI)s(I)f(co)s(de)h
+(is)g(the)g(o)s(ctal)h(v)-5 b(alue)30 b Fq(nnn)p Ft(.)150
+5340 y Fs(\\\\)384 b Ft(A)30 b(bac)m(kslash.)p eop
+%%Page: 76 82
+76 81 bop 150 -116 a Ft(76)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fs(\\[)384 b Ft(Begin)37 b(a)g(sequence)g(of)g(non-prin)m(ting)e
+(c)m(haracters.)61 b(This)35 b(could)h(b)s(e)h(used)f(to)h(em)m(b)s(ed)
+g(a)630 408 y(terminal)29 b(con)m(trol)i(sequence)f(in)m(to)h(the)f
+(prompt.)150 568 y Fs(\\])384 b Ft(End)29 b(a)i(sequence)g(of)f
+(non-prin)m(ting)e(c)m(haracters.)275 728 y(The)d(command)h(n)m(um)m(b)
+s(er)f(and)h(the)g(history)f(n)m(um)m(b)s(er)g(are)i(usually)d
+(di\013eren)m(t:)38 b(the)26 b(history)f(n)m(um)m(b)s(er)150
+838 y(of)i(a)f(command)h(is)e(its)h(p)s(osition)e(in)h(the)i(history)e
+(list,)h(whic)m(h)g(ma)m(y)h(include)d(commands)i(restored)g(from)150
+947 y(the)39 b(history)g(\014le)f(\(see)i(Section)f(9.1)i([Bash)e
+(History)g(F)-8 b(acilities],)41 b(page)f(109\),)j(while)38
+b(the)h(command)150 1057 y(n)m(um)m(b)s(er)j(is)g(the)i(p)s(osition)d
+(in)h(the)h(sequence)h(of)f(commands)g(executed)h(during)d(the)j
+(curren)m(t)f(shell)150 1167 y(session.)275 1302 y(After)35
+b(the)g(string)f(is)g(deco)s(ded,)i(it)e(is)g(expanded)g(via)h
+(parameter)g(expansion,)h(command)e(substi-)150 1411
+y(tution,)j(arithmetic)e(expansion,)h(and)f(quote)h(remo)m(v)-5
+b(al,)38 b(sub)5 b(ject)35 b(to)i(the)f(v)-5 b(alue)35
+b(of)h(the)g Fs(promptvars)150 1521 y Ft(shell)29 b(option)g(\(see)j
+(Section)e(4.2)h([Bash)g(Builtins],)d(page)j(39\).)150
+1779 y Fr(6.10)68 b(The)45 b(Restricted)h(Shell)275 2024
+y Ft(If)26 b(Bash)h(is)e(started)i(with)f(the)h(name)f
+Fs(rbash)p Ft(,)h(or)f(the)h(`)p Fs(--restricted)p Ft(')d(or)j(`)p
+Fs(-r)p Ft(')f(option)g(is)g(supplied)150 2133 y(at)32
+b(in)m(v)m(o)s(cation,)g(the)f(shell)e(b)s(ecomes)j(restricted.)43
+b(A)31 b(restricted)g(shell)e(is)h(used)h(to)h(set)f(up)f(an)i(en)m
+(viron-)150 2243 y(men)m(t)26 b(more)f(con)m(trolled)g(than)g(the)h
+(standard)e(shell.)38 b(A)25 b(restricted)g(shell)f(b)s(eha)m(v)m(es)i
+(iden)m(tically)d(to)j Fs(bash)150 2352 y Ft(with)j(the)i(exception)f
+(that)h(the)g(follo)m(wing)e(are)h(disallo)m(w)m(ed)f(or)i(not)f(p)s
+(erformed:)225 2487 y Fp(\017)60 b Ft(Changing)29 b(directories)g(with)
+h(the)g Fs(cd)g Ft(builtin.)225 2622 y Fp(\017)60 b Ft(Setting)30
+b(or)g(unsetting)g(the)h(v)-5 b(alues)29 b(of)i(the)f
+Fs(SHELL)p Ft(,)g Fs(PATH)p Ft(,)f Fs(ENV)p Ft(,)h(or)g
+Fs(BASH_ENV)e Ft(v)-5 b(ariables.)225 2757 y Fp(\017)60
+b Ft(Sp)s(ecifying)28 b(command)i(names)g(con)m(taining)g(slashes.)225
+2891 y Fp(\017)60 b Ft(Sp)s(ecifying)28 b(a)j(\014lename)e(con)m
+(taining)h(a)h(slash)e(as)i(an)f(argumen)m(t)h(to)g(the)f
+Fs(.)h Ft(builtin)26 b(command.)225 3026 y Fp(\017)60
+b Ft(Sp)s(ecifying)26 b(a)k(\014lename)e(con)m(taining)g(a)i(slash)d
+(as)i(an)g(argumen)m(t)h(to)f(the)g(`)p Fs(-p)p Ft(')g(option)f(to)i
+(the)f Fs(hash)330 3136 y Ft(builtin)e(command.)225 3270
+y Fp(\017)60 b Ft(Imp)s(orting)29 b(function)g(de\014nitions)f(from)h
+(the)i(shell)e(en)m(vironmen)m(t)h(at)h(startup.)225
+3405 y Fp(\017)60 b Ft(P)m(arsing)30 b(the)g(v)-5 b(alue)30
+b(of)h Fs(SHELLOPTS)d Ft(from)h(the)i(shell)e(en)m(vironmen)m(t)h(at)h
+(startup.)225 3540 y Fp(\017)60 b Ft(Redirecting)29 b(output)h(using)f
+(the)i(`)p Fs(>)p Ft(',)g(`)p Fs(>|)p Ft(',)f(`)p Fs(<>)p
+Ft(',)h(`)p Fs(>&)p Ft(',)f(`)p Fs(&>)p Ft(',)h(and)e(`)p
+Fs(>>)p Ft(')i(redirection)e(op)s(erators.)225 3675 y
+Fp(\017)60 b Ft(Using)30 b(the)g Fs(exec)f Ft(builtin)e(to)k(replace)g
+(the)f(shell)f(with)g(another)i(command.)225 3809 y Fp(\017)60
+b Ft(Adding)39 b(or)i(deleting)f(builtin)d(commands)k(with)e(the)i(`)p
+Fs(-f)p Ft(')g(and)f(`)p Fs(-d)p Ft(')h(options)f(to)i(the)f
+Fs(enable)330 3919 y Ft(builtin.)225 4054 y Fp(\017)60
+b Ft(Using)30 b(the)g Fs(enable)f Ft(builtin)e(command)j(to)h(enable)f
+(disabled)e(shell)g(builtins.)225 4188 y Fp(\017)60 b
+Ft(Sp)s(ecifying)28 b(the)i(`)p Fs(-p)p Ft(')h(option)f(to)h(the)f
+Fs(command)f Ft(builtin.)225 4323 y Fp(\017)60 b Ft(T)-8
+b(urning)28 b(o\013)j(restricted)f(mo)s(de)g(with)f(`)p
+Fs(set)h(+r)p Ft(')g(or)g(`)p Fs(set)g(+o)g(restricted)p
+Ft('.)275 4483 y(These)g(restrictions)f(are)i(enforced)f(after)h(an)m
+(y)g(startup)f(\014les)f(are)i(read.)275 4618 y(When)j(a)i(command)e
+(that)i(is)e(found)g(to)h(b)s(e)g(a)g(shell)e(script)h(is)g(executed)i
+(\(see)g(Section)f(3.8)h([Shell)150 4727 y(Scripts],)24
+b(page)f(31\),)j Fs(rbash)c Ft(turns)g(o\013)i(an)m(y)f(restrictions)f
+(in)g(the)h(shell)f(spa)m(wned)g(to)i(execute)g(the)g(script.)150
+4986 y Fr(6.11)68 b(Bash)45 b(POSIX)f(Mo)t(de)275 5230
+y Ft(Starting)20 b(Bash)h(with)e(the)i(`)p Fs(--posix)p
+Ft(')e(command-line)h(option)g(or)h(executing)g(`)p Fs(set)30
+b(-o)f(posix)p Ft(')20 b(while)150 5340 y(Bash)33 b(is)e(running)f
+(will)g(cause)j(Bash)f(to)i(conform)e(more)h(closely)f(to)h(the)g
+Fl(posix)e Ft(1003.2)k(standard)d(b)m(y)p eop
+%%Page: 77 83
+77 82 bop 150 -116 a Ft(Chapter)30 b(6:)41 b(Bash)30
+b(F)-8 b(eatures)2484 b(77)150 299 y(c)m(hanging)37 b(the)g(b)s(eha)m
+(vior)f(to)h(matc)m(h)h(that)f(sp)s(eci\014ed)f(b)m(y)g
+Fl(posix)g Ft(in)g(areas)h(where)g(the)g(Bash)g(default)150
+408 y(di\013ers.)275 554 y(When)30 b(in)m(v)m(ok)m(ed)g(as)h
+Fs(sh)p Ft(,)f(Bash)h(en)m(ters)g Fl(posix)e Ft(mo)s(de)h(after)h
+(reading)f(the)g(startup)g(\014les.)275 700 y(The)f(follo)m(wing)g
+(list)g(is)h(what's)g(c)m(hanged)h(when)e(`)p Fl(posix)h
+Ft(mo)s(de')h(is)e(in)g(e\013ect:)199 846 y(1.)61 b(When)28
+b(a)i(command)e(in)f(the)i(hash)f(table)h(no)f(longer)g(exists,)h(Bash)
+g(will)d(re-searc)m(h)k Fs($PATH)d Ft(to)i(\014nd)330
+955 y(the)i(new)e(lo)s(cation.)41 b(This)28 b(is)i(also)g(a)m(v)-5
+b(ailable)30 b(with)f(`)p Fs(shopt)g(-s)h(checkhash)p
+Ft('.)199 1095 y(2.)61 b(The)42 b(message)h(prin)m(ted)d(b)m(y)i(the)g
+(job)g(con)m(trol)h(co)s(de)f(and)f(builtins)e(when)i(a)h(job)g(exits)g
+(with)f(a)330 1205 y(non-zero)31 b(status)g(is)e(`Done\(status\)'.)199
+1345 y(3.)61 b(The)40 b(message)h(prin)m(ted)e(b)m(y)h(the)h(job)f(con)
+m(trol)g(co)s(de)h(and)f(builtins)c(when)k(a)g(job)g(is)g(stopp)s(ed)f
+(is)330 1455 y(`Stopp)s(ed\()p Fq(signame)5 b Ft(\)',)30
+b(where)g Fq(signame)35 b Ft(is,)30 b(for)g(example,)g
+Fs(SIGTSTP)p Ft(.)199 1595 y(4.)61 b(Reserv)m(ed)31 b(w)m(ords)f(ma)m
+(y)h(not)f(b)s(e)g(aliased.)199 1735 y(5.)61 b(The)39
+b Fl(posix)f Ft(1003.2)k Fs(PS1)d Ft(and)f Fs(PS2)h Ft(expansions)f(of)
+h(`)p Fs(!)p Ft(')h(to)g(the)f(history)f(n)m(um)m(b)s(er)g(and)h(`)p
+Fs(!!)p Ft(')g(to)330 1844 y(`)p Fs(!)p Ft(')c(are)h(enabled,)g(and)f
+(parameter)g(expansion)g(is)f(p)s(erformed)g(on)h(the)h(v)-5
+b(alues)34 b(of)i Fs(PS1)e Ft(and)h Fs(PS2)330 1954 y
+Ft(regardless)30 b(of)g(the)h(setting)f(of)h(the)f Fs(promptvars)e
+Ft(option.)199 2094 y(6.)61 b(The)30 b Fl(posix)g Ft(1003.2)i(startup)e
+(\014les)g(are)g(executed)i(\()p Fs($ENV)p Ft(\))e(rather)g(than)g(the)
+g(normal)g(Bash)g(\014les.)199 2234 y(7.)61 b(Tilde)28
+b(expansion)h(is)f(only)h(p)s(erformed)g(on)h(assignmen)m(ts)f
+(preceding)g(a)h(command)g(name,)g(rather)330 2344 y(than)g(on)g(all)g
+(assignmen)m(t)g(statemen)m(ts)i(on)e(the)h(line.)199
+2484 y(8.)61 b(The)30 b(default)f(history)h(\014le)f(is)h(`)p
+Fs(~/.sh_history)p Ft(')d(\(this)j(is)f(the)h(default)g(v)-5
+b(alue)30 b(of)g Fs($HISTFILE)p Ft(\).)199 2624 y(9.)61
+b(The)23 b(output)f(of)i(`)p Fs(kill)29 b(-l)p Ft(')23
+b(prin)m(ts)e(all)h(the)i(signal)d(names)i(on)g(a)h(single)e(line,)h
+(separated)g(b)m(y)g(spaces,)330 2733 y(without)29 b(the)i(`)p
+Fs(SIG)p Ft(')f(pre\014x.)154 2874 y(10.)61 b(The)30
+b Fs(kill)f Ft(builtin)e(do)s(es)j(not)h(accept)h(signal)d(names)h
+(with)f(a)i(`)p Fs(SIG)p Ft(')f(pre\014x.)154 3014 y(11.)61
+b(Non-in)m(teractiv)m(e)32 b(shells)c(exit)i(if)g Fq(\014lename)k
+Ft(in)29 b Fs(.)h Fq(\014lename)35 b Ft(is)30 b(not)g(found.)154
+3154 y(12.)61 b(Non-in)m(teractiv)m(e)39 b(shells)d(exit)i(if)f(a)h
+(syn)m(tax)g(error)g(in)e(an)i(arithmetic)f(expansion)g(results)f(in)h
+(an)330 3263 y(in)m(v)-5 b(alid)28 b(expression.)154
+3403 y(13.)61 b(Redirection)23 b(op)s(erators)h(do)g(not)g(p)s(erform)f
+(\014lename)g(expansion)g(on)h(the)g(w)m(ord)f(in)g(the)h(redirection)
+330 3513 y(unless)29 b(the)h(shell)f(is)g(in)m(teractiv)m(e.)154
+3653 y(14.)61 b(Redirection)29 b(op)s(erators)i(do)f(not)h(p)s(erform)e
+(w)m(ord)h(splitting)e(on)i(the)h(w)m(ord)f(in)f(the)h(redirection.)154
+3793 y(15.)61 b(F)-8 b(unction)34 b(names)h(m)m(ust)f(b)s(e)g(v)-5
+b(alid)33 b(shell)f Fs(name)p Ft(s.)52 b(That)34 b(is,)h(they)g(ma)m(y)
+g(not)g(con)m(tain)f(c)m(haracters)330 3903 y(other)f(than)g(letters,)g
+(digits,)g(and)f(underscores,)h(and)f(ma)m(y)h(not)g(start)h(with)d(a)i
+(digit.)47 b(Declaring)330 4012 y(a)31 b(function)e(with)g(an)h(in)m(v)
+-5 b(alid)28 b(name)j(causes)f(a)h(fatal)g(syn)m(tax)g(error)f(in)f
+(non-in)m(teractiv)m(e)i(shells.)154 4153 y(16.)61 b
+Fl(posix)23 b Ft(1003.2)j(`sp)s(ecial')c(builtins)e(are)k(found)e(b)s
+(efore)h(shell)f(functions)g(during)f(command)i(lo)s(okup.)154
+4293 y(17.)61 b(If)33 b(a)h Fl(posix)f Ft(1003.2)j(sp)s(ecial)c
+(builtin)f(returns)h(an)i(error)f(status,)i(a)f(non-in)m(teractiv)m(e)g
+(shell)e(exits.)330 4402 y(The)43 b(fatal)i(errors)e(are)h(those)h
+(listed)d(in)h(the)h(POSIX.2)g(standard,)j(and)c(include)f(things)h
+(lik)m(e)330 4512 y(passing)24 b(incorrect)i(options,)g(redirection)e
+(errors,)i(v)-5 b(ariable)24 b(assignmen)m(t)h(errors)g(for)g
+(assignmen)m(ts)330 4621 y(preceding)k(the)i(command)f(name,)h(and)e
+(so)i(on.)154 4762 y(18.)61 b(If)33 b(the)h Fs(cd)f Ft(builtin)e
+(\014nds)h(a)i(directory)f(to)i(c)m(hange)g(to)f(using)f
+Fs($CDPATH)p Ft(,)g(the)h(v)-5 b(alue)33 b(it)g(assigns)g(to)330
+4871 y(the)e Fs(PWD)e Ft(v)-5 b(ariable)29 b(do)s(es)h(not)h(con)m
+(tain)g(an)m(y)f(sym)m(b)s(olic)f(links,)f(as)j(if)e(`)p
+Fs(cd)h(-P)p Ft(')g(had)g(b)s(een)g(executed.)154 5011
+y(19.)61 b(If)34 b Fs(CDPATH)f Ft(is)g(set,)j(the)f Fs(cd)f
+Ft(builtin)d(will)g(not)k(implicitly)c(app)s(end)h(the)j(curren)m(t)f
+(directory)g(to)h(it.)330 5121 y(This)28 b(means)h(that)h
+Fs(cd)f Ft(will)e(fail)h(if)h(no)g(v)-5 b(alid)28 b(directory)h(name)g
+(can)h(b)s(e)f(constructed)h(from)f(an)m(y)h(of)330 5230
+y(the)i(en)m(tries)f(in)f Fs($CDPATH)p Ft(,)f(ev)m(en)j(if)f(the)g(a)h
+(directory)f(with)f(the)h(same)h(name)f(as)h(the)g(name)f(giv)m(en)330
+5340 y(as)g(an)f(argumen)m(t)h(to)g Fs(cd)f Ft(exists)g(in)f(the)h
+(curren)m(t)g(directory)-8 b(.)p eop
+%%Page: 78 84
+78 83 bop 150 -116 a Ft(78)2572 b(Bash)31 b(Reference)g(Man)m(ual)154
+299 y(20.)61 b(A)31 b(non-in)m(teractiv)m(e)h(shell)d(exits)i(with)e
+(an)i(error)g(status)g(if)f(a)h(v)-5 b(ariable)30 b(assignmen)m(t)h
+(error)f(o)s(ccurs)330 408 y(when)38 b(no)h(command)g(name)g(follo)m
+(ws)g(the)g(assignmen)m(t)g(statemen)m(ts.)69 b(A)39
+b(v)-5 b(ariable)38 b(assignmen)m(t)330 518 y(error)30
+b(o)s(ccurs,)g(for)g(example,)h(when)e(trying)h(to)h(assign)e(a)i(v)-5
+b(alue)30 b(to)h(a)g(readonly)e(v)-5 b(ariable.)154 653
+y(21.)61 b(A)43 b(non-in)m(teractiv)m(e)g(shell)e(exits)i(with)f(an)g
+(error)h(status)g(if)f(the)h(iteration)f(v)-5 b(ariable)42
+b(in)g(a)h Fs(for)330 762 y Ft(statemen)m(t)32 b(or)f(the)f(selection)g
+(v)-5 b(ariable)30 b(in)f(a)h Fs(select)f Ft(statemen)m(t)j(is)e(a)g
+(readonly)g(v)-5 b(ariable.)154 897 y(22.)61 b(Pro)s(cess)30
+b(substitution)e(is)i(not)g(a)m(v)-5 b(ailable.)154 1031
+y(23.)61 b(Assignmen)m(t)31 b(statemen)m(ts)h(preceding)e
+Fl(posix)h Ft(1003.2)i(sp)s(ecial)d(builtins)d(p)s(ersist)j(in)f(the)j
+(shell)d(en-)330 1141 y(vironmen)m(t)h(after)g(the)h(builtin)c
+(completes.)154 1275 y(24.)61 b(Assignmen)m(t)34 b(statemen)m(ts)i
+(preceding)e(shell)e(function)h(calls)h(p)s(ersist)f(in)g(the)i(shell)d
+(en)m(vironmen)m(t)330 1385 y(after)f(the)f(function)g(returns,)f(as)i
+(if)e(a)i Fl(posix)e Ft(sp)s(ecial)g(builtin)e(command)j(had)g(b)s(een)
+g(executed.)154 1519 y(25.)61 b(The)38 b Fs(export)f
+Ft(and)g Fs(readonly)f Ft(builtin)f(commands)j(displa)m(y)f(their)g
+(output)h(in)f(the)i(format)g(re-)330 1629 y(quired)29
+b(b)m(y)h Fl(posix)f Ft(1003.2.)154 1763 y(26.)61 b(The)30
+b Fs(trap)f Ft(builtin)e(displa)m(ys)h(signal)i(names)g(without)f(the)i
+(leading)e Fs(SIG)p Ft(.)154 1898 y(27.)61 b(The)24 b
+Fs(trap)g Ft(builtin)d(do)s(esn't)k(c)m(hec)m(k)h(the)f(\014rst)f
+(argumen)m(t)h(for)g(a)g(p)s(ossible)d(signal)i(sp)s(eci\014cation)g
+(and)330 2007 y(rev)m(ert)32 b(the)f(signal)f(handling)f(to)j(the)g
+(original)d(disp)s(osition)f(if)i(it)h(is.)43 b(If)30
+b(users)h(w)m(an)m(t)h(to)g(reset)g(the)330 2117 y(handler)j(for)h(a)i
+(giv)m(en)e(signal)g(to)h(the)g(original)e(disp)s(osition,)h(they)h
+(should)d(use)j(`)p Fs(-)p Ft(')g(as)g(the)g(\014rst)330
+2227 y(argumen)m(t.)154 2361 y(28.)61 b(The)21 b Fs(.)h
+Ft(and)f Fs(source)f Ft(builtins)e(do)j(not)h(searc)m(h)h(the)f(curren)
+m(t)f(directory)g(for)h(the)g(\014lename)e(argumen)m(t)330
+2471 y(if)29 b(it)h(is)g(not)g(found)f(b)m(y)i(searc)m(hing)f
+Fs(PATH)p Ft(.)154 2605 y(29.)61 b(Subshells)18 b(spa)m(wned)j(to)h
+(execute)g(command)g(substitutions)d(inherit)g(the)i(v)-5
+b(alue)21 b(of)h(the)f(`)p Fs(-e)p Ft(')g(option)330
+2715 y(from)34 b(the)h(paren)m(t)g(shell.)53 b(When)34
+b(not)i(in)d Fl(posix)h Ft(mo)s(de,)i(Bash)f(clears)g(the)g(`)p
+Fs(-e)p Ft(')f(option)h(in)e(suc)m(h)330 2824 y(subshells.)154
+2959 y(30.)61 b(Alias)29 b(expansion)h(is)f(alw)m(a)m(ys)i(enabled,)e
+(ev)m(en)j(in)d(non-in)m(teractiv)m(e)i(shells.)154 3093
+y(31.)61 b(When)43 b(the)g Fs(alias)f Ft(builtin)d(displa)m(ys)j(alias)
+g(de\014nitions,)i(it)e(do)s(es)h(not)g(displa)m(y)f(them)h(with)f(a)
+330 3203 y(leading)29 b(`)p Fs(alias)g Ft(')i(unless)e(the)h(`)p
+Fs(-p)p Ft(')g(option)g(is)g(supplied.)154 3337 y(32.)61
+b(When)40 b(the)g Fs(set)f Ft(builtin)e(is)i(in)m(v)m(ok)m(ed)h
+(without)f(options,)j(it)e(do)s(es)g(not)g(displa)m(y)e(shell)g
+(function)330 3447 y(names)30 b(and)g(de\014nitions.)154
+3582 y(33.)61 b(When)36 b(the)g Fs(set)g Ft(builtin)d(is)i(in)m(v)m(ok)
+m(ed)i(without)e(options,)i(it)f(displa)m(ys)e(v)-5 b(ariable)35
+b(v)-5 b(alues)36 b(without)330 3691 y(quotes,)26 b(unless)c(they)j
+(con)m(tain)f(shell)e(metac)m(haracters,)28 b(ev)m(en)d(if)e(the)h
+(result)f(con)m(tains)i(nonprin)m(ting)330 3801 y(c)m(haracters.)154
+3935 y(34.)61 b(When)35 b(the)g Fs(cd)f Ft(builtin)e(is)i(in)m(v)m(ok)m
+(ed)i(in)d Fq(logical)38 b Ft(mo)s(de,)e(and)f(the)g(pathname)g
+(constructed)g(from)330 4045 y Fs($PWD)i Ft(and)h(the)h(directory)e
+(name)i(supplied)c(as)k(an)f(argumen)m(t)h(do)s(es)f(not)g(refer)h(to)g
+(an)f(existing)330 4154 y(directory)-8 b(,)31 b Fs(cd)e
+Ft(will)f(fail)h(instead)h(of)g(falling)e(bac)m(k)k(to)f
+Fq(ph)m(ysical)h Ft(mo)s(de.)275 4314 y(There)d(is)h(other)g
+Fl(posix)g Ft(1003.2)j(b)s(eha)m(vior)c(that)i(Bash)g(do)s(es)f(not)h
+(implemen)m(t.)39 b(Sp)s(eci\014cally:)199 4448 y(1.)61
+b(Assignmen)m(t)25 b(statemen)m(ts)j(a\013ect)f(the)f(execution)f(en)m
+(vironmen)m(t)h(of)g(all)e(builtins,)f(not)j(just)f(sp)s(ecial)330
+4558 y(ones.)199 4692 y(2.)61 b(When)20 b(a)h(subshell)d(is)i(created)h
+(to)h(execute)g(a)f(shell)d(script)i(with)f(execute)j(p)s(ermission,)e
+(but)g(without)330 4802 y(a)35 b(leading)f(`)p Fs(#!)p
+Ft(',)i(Bash)g(sets)f Fs($0)f Ft(to)i(the)f(full)e(pathname)i(of)g(the)
+g(script)f(as)h(found)f(b)m(y)h(searc)m(hing)330 4912
+y Fs($PATH)p Ft(,)29 b(rather)h(than)h(the)f(command)g(as)h(t)m(yp)s
+(ed)f(b)m(y)g(the)h(user.)199 5046 y(3.)61 b(When)28
+b(using)e(`)p Fs(.)p Ft(')i(to)g(source)g(a)h(shell)d(script)g(found)h
+(in)f Fs($PATH)p Ft(,)i(bash)f(c)m(hec)m(ks)i(execute)g(p)s(ermission)
+330 5156 y(bits)g(rather)i(than)f(read)g(p)s(ermission)d(bits,)j(just)g
+(as)g(if)f(it)h(w)m(ere)h(searc)m(hing)f(for)h(a)f(command.)p
+eop
+%%Page: 79 85
+79 84 bop 150 -116 a Ft(Chapter)30 b(7:)41 b(Job)30 b(Con)m(trol)2570
+b(79)150 299 y Fo(7)80 b(Job)54 b(Con)l(trol)275 544
+y Ft(This)33 b(c)m(hapter)j(discusses)e(what)h(job)g(con)m(trol)h(is,)g
+(ho)m(w)f(it)g(w)m(orks,)i(and)e(ho)m(w)g(Bash)h(allo)m(ws)e(y)m(ou)i
+(to)150 653 y(access)c(its)d(facilities.)150 919 y Fr(7.1)68
+b(Job)45 b(Con)l(trol)h(Basics)275 1167 y Ft(Job)30 b(con)m(trol)i
+(refers)f(to)h(the)g(abilit)m(y)d(to)j(selectiv)m(ely)g(stop)f(\(susp)s
+(end\))f(the)h(execution)h(of)f(pro)s(cesses)150 1277
+y(and)24 b(con)m(tin)m(ue)h(\(resume\))g(their)f(execution)h(at)g(a)h
+(later)e(p)s(oin)m(t.)38 b(A)25 b(user)f(t)m(ypically)g(emplo)m(ys)g
+(this)g(facilit)m(y)150 1386 y(via)30 b(an)g(in)m(teractiv)m(e)h(in)m
+(terface)g(supplied)d(join)m(tly)h(b)m(y)h(the)h(system's)f(terminal)f
+(driv)m(er)g(and)h(Bash.)275 1524 y(The)23 b(shell)g(asso)s(ciates)i(a)
+g Fq(job)h Ft(with)d(eac)m(h)j(pip)s(eline.)35 b(It)25
+b(k)m(eeps)f(a)h(table)g(of)f(curren)m(tly)g(executing)g(jobs,)150
+1634 y(whic)m(h)32 b(ma)m(y)j(b)s(e)e(listed)f(with)g(the)i
+Fs(jobs)f Ft(command.)50 b(When)33 b(Bash)h(starts)g(a)g(job)g(async)m
+(hronously)-8 b(,)33 b(it)150 1744 y(prin)m(ts)c(a)i(line)d(that)j(lo)s
+(oks)f(lik)m(e:)390 1882 y Fs([1])47 b(25647)150 2020
+y Ft(indicating)31 b(that)j(this)e(job)h(is)f(job)h(n)m(um)m(b)s(er)f
+(1)i(and)f(that)g(the)h(pro)s(cess)f Fl(id)g Ft(of)g(the)h(last)f(pro)s
+(cess)g(in)f(the)150 2129 y(pip)s(eline)39 b(asso)s(ciated)k(with)e
+(this)g(job)h(is)g(25647.)78 b(All)41 b(of)i(the)g(pro)s(cesses)f(in)f
+(a)i(single)e(pip)s(eline)e(are)150 2239 y(mem)m(b)s(ers)30
+b(of)g(the)h(same)f(job.)41 b(Bash)30 b(uses)g(the)h
+Fq(job)h Ft(abstraction)e(as)h(the)g(basis)e(for)h(job)g(con)m(trol.)
+275 2377 y(T)-8 b(o)23 b(facilitate)g(the)g(implemen)m(tation)f(of)i
+(the)f(user)f(in)m(terface)i(to)g(job)f(con)m(trol,)i(the)e(op)s
+(erating)g(system)150 2486 y(main)m(tains)i(the)h(notion)g(of)g(a)g
+(curren)m(t)g(terminal)e(pro)s(cess)i(group)g Fl(id)p
+Ft(.)39 b(Mem)m(b)s(ers)26 b(of)g(this)f(pro)s(cess)g(group)150
+2596 y(\(pro)s(cesses)h(whose)g(pro)s(cess)g(group)g
+Fl(id)g Ft(is)g(equal)g(to)h(the)f(curren)m(t)g(terminal)f(pro)s(cess)h
+(group)f Fl(id)p Ft(\))i(receiv)m(e)150 2706 y(k)m(eyb)s
+(oard-generated)22 b(signals)e(suc)m(h)g(as)h Fs(SIGINT)p
+Ft(.)36 b(These)21 b(pro)s(cesses)g(are)g(said)f(to)h(b)s(e)g(in)e(the)
+i(foreground.)150 2815 y(Bac)m(kground)38 b(pro)s(cesses)f(are)h(those)
+g(whose)f(pro)s(cess)g(group)g Fl(id)h Ft(di\013ers)e(from)h(the)g
+(terminal's;)j(suc)m(h)150 2925 y(pro)s(cesses)24 b(are)g(imm)m(une)f
+(to)h(k)m(eyb)s(oard-generated)h(signals.)38 b(Only)22
+b(foreground)h(pro)s(cesses)h(are)g(allo)m(w)m(ed)150
+3034 y(to)35 b(read)f(from)f(or)h(write)f(to)i(the)f(terminal.)50
+b(Bac)m(kground)34 b(pro)s(cesses)g(whic)m(h)f(attempt)i(to)g(read)e
+(from)150 3144 y(\(write)d(to\))h(the)g(terminal)e(are)i(sen)m(t)g(a)f
+Fs(SIGTTIN)f Ft(\()p Fs(SIGTTOU)p Ft(\))g(signal)g(b)m(y)h(the)h
+(terminal)e(driv)m(er,)g(whic)m(h,)150 3254 y(unless)g(caugh)m(t,)i
+(susp)s(ends)d(the)j(pro)s(cess.)275 3392 y(If)j(the)i(op)s(erating)f
+(system)g(on)h(whic)m(h)e(Bash)h(is)g(running)d(supp)s(orts)i(job)h
+(con)m(trol,)i(Bash)f(con)m(tains)150 3501 y(facilities)26
+b(to)j(use)f(it.)39 b(T)m(yping)27 b(the)h Fq(susp)s(end)h
+Ft(c)m(haracter)h(\(t)m(ypically)d(`)p Fs(^Z)p Ft(',)i(Con)m(trol-Z\))f
+(while)e(a)i(pro)s(cess)150 3611 y(is)41 b(running)f(causes)j(that)g
+(pro)s(cess)f(to)h(b)s(e)f(stopp)s(ed)f(and)h(returns)f(con)m(trol)i
+(to)g(Bash.)77 b(T)m(yping)41 b(the)150 3720 y Fq(dela)m(y)m(ed)k(susp)
+s(end)g Ft(c)m(haracter)h(\(t)m(ypically)d(`)p Fs(^Y)p
+Ft(',)48 b(Con)m(trol-Y\))d(causes)f(the)h(pro)s(cess)e(to)i(b)s(e)f
+(stopp)s(ed)150 3830 y(when)26 b(it)h(attempts)i(to)f(read)f(input)f
+(from)g(the)i(terminal,)f(and)g(con)m(trol)g(to)h(b)s(e)f(returned)f
+(to)j(Bash.)39 b(The)150 3940 y(user)e(then)g(manipulates)f(the)i
+(state)h(of)f(this)e(job,)k(using)c(the)i Fs(bg)f Ft(command)g(to)h
+(con)m(tin)m(ue)g(it)f(in)g(the)150 4049 y(bac)m(kground,)h(the)f
+Fs(fg)g Ft(command)f(to)i(con)m(tin)m(ue)f(it)f(in)f(the)i(foreground,)
+h(or)f(the)g Fs(kill)f Ft(command)g(to)150 4159 y(kill)24
+b(it.)39 b(A)27 b(`)p Fs(^Z)p Ft(')g(tak)m(es)h(e\013ect)g(immediately)
+-8 b(,)26 b(and)g(has)h(the)f(additional)f(side)g(e\013ect)k(of)d
+(causing)g(p)s(ending)150 4268 y(output)k(and)g(t)m(yp)s(eahead)h(to)g
+(b)s(e)e(discarded.)275 4406 y(There)j(are)g(a)h(n)m(um)m(b)s(er)e(of)i
+(w)m(a)m(ys)g(to)h(refer)e(to)h(a)g(job)f(in)f(the)i(shell.)45
+b(The)32 b(c)m(haracter)i(`)p Fs(\045)p Ft(')f(in)m(tro)s(duces)150
+4516 y(a)e(job)f(name.)275 4654 y(Job)h(n)m(um)m(b)s(er)f
+Fs(n)h Ft(ma)m(y)h(b)s(e)f(referred)g(to)h(as)g(`)p Fs(\045n)p
+Ft('.)44 b(The)31 b(sym)m(b)s(ols)f(`)p Fs(\045\045)p
+Ft(')i(and)f(`)p Fs(\045+)p Ft(')g(refer)h(to)g(the)g(shell's)150
+4764 y(notion)42 b(of)g(the)h(curren)m(t)f(job,)j(whic)m(h)c(is)g(the)h
+(last)h(job)e(stopp)s(ed)h(while)e(it)i(w)m(as)g(in)f(the)i(foreground)
+150 4873 y(or)36 b(started)h(in)e(the)h(bac)m(kground.)58
+b(The)36 b(previous)f(job)g(ma)m(y)i(b)s(e)f(referenced)g(using)f(`)p
+Fs(\045-)p Ft('.)58 b(In)35 b(output)150 4983 y(p)s(ertaining)24
+b(to)j(jobs)e(\(e.g.,)k(the)d(output)g(of)g(the)g Fs(jobs)f
+Ft(command\),)j(the)e(curren)m(t)g(job)g(is)f(alw)m(a)m(ys)h(\015agged)
+150 5092 y(with)j(a)i(`)p Fs(+)p Ft(',)g(and)e(the)i(previous)e(job)h
+(with)f(a)i(`)p Fs(-)p Ft('.)275 5230 y(A)38 b(job)g(ma)m(y)h(also)f(b)
+s(e)g(referred)f(to)j(using)c(a)j(pre\014x)e(of)i(the)f(name)h(used)e
+(to)i(start)g(it,)h(or)f(using)e(a)150 5340 y(substring)28
+b(that)j(app)s(ears)f(in)f(its)h(command)g(line.)39 b(F)-8
+b(or)31 b(example,)f(`)p Fs(\045ce)p Ft(')g(refers)g(to)h(a)g(stopp)s
+(ed)e Fs(ce)h Ft(job.)p eop
+%%Page: 80 86
+80 85 bop 150 -116 a Ft(80)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y(Using)26 b(`)p Fs(\045?ce)p Ft(',)h(on)f(the)h(other)g(hand,)g
+(refers)f(to)h(an)m(y)g(job)g(con)m(taining)f(the)h(string)e(`)p
+Fs(ce)p Ft(')i(in)e(its)h(command)150 408 y(line.)39
+b(If)30 b(the)h(pre\014x)e(or)h(substring)e(matc)m(hes)k(more)e(than)h
+(one)f(job,)h(Bash)f(rep)s(orts)g(an)g(error.)275 544
+y(Simply)e(naming)i(a)h(job)g(can)g(b)s(e)f(used)h(to)g(bring)e(it)i
+(in)m(to)g(the)g(foreground:)41 b(`)p Fs(\0451)p Ft(')31
+b(is)f(a)i(synon)m(ym)e(for)150 654 y(`)p Fs(fg)g(\0451)p
+Ft(',)i(bringing)d(job)i(1)g(from)g(the)h(bac)m(kground)f(in)m(to)h
+(the)f(foreground.)44 b(Similarly)-8 b(,)28 b(`)p Fs(\0451)i(&)p
+Ft(')i(resumes)150 763 y(job)e(1)h(in)e(the)h(bac)m(kground,)h(equiv)-5
+b(alen)m(t)30 b(to)h(`)p Fs(bg)f(\0451)p Ft(')275 899
+y(The)g(shell)g(learns)g(immediately)g(whenev)m(er)h(a)h(job)f(c)m
+(hanges)h(state.)45 b(Normally)-8 b(,)31 b(Bash)g(w)m(aits)h(un)m(til)
+150 1009 y(it)24 b(is)g(ab)s(out)g(to)i(prin)m(t)d(a)i(prompt)f(b)s
+(efore)g(rep)s(orting)g(c)m(hanges)h(in)f(a)h(job's)f(status)h(so)g(as)
+g(to)g(not)g(in)m(terrupt)150 1119 y(an)m(y)g(other)g(output.)39
+b(If)24 b(the)i(`)p Fs(-b)p Ft(')e(option)h(to)g(the)g
+Fs(set)f Ft(builtin)e(is)i(enabled,)h(Bash)g(rep)s(orts)f(suc)m(h)h(c)m
+(hanges)150 1228 y(immediately)j(\(see)i(Section)f(4.3)h([The)f(Set)h
+(Builtin],)d(page)j(50\).)42 b(An)m(y)29 b(trap)g(on)g
+Fs(SIGCHLD)f Ft(is)g(executed)150 1338 y(for)i(eac)m(h)i(c)m(hild)c
+(pro)s(cess)i(that)h(exits.)275 1474 y(If)e(an)g(attempt)i(to)g(exit)e
+(Bash)h(is)f(while)f(jobs)h(are)h(stopp)s(ed,)f(the)h(shell)e(prin)m
+(ts)g(a)i(message)h(w)m(arning)150 1583 y(that)f(there)g(are)g(stopp)s
+(ed)f(jobs.)40 b(The)30 b Fs(jobs)e Ft(command)i(ma)m(y)g(then)f(b)s(e)
+h(used)f(to)h(insp)s(ect)f(their)f(status.)150 1693 y(If)i(a)h(second)g
+(attempt)g(to)h(exit)e(is)g(made)g(without)g(an)g(in)m(terv)m(ening)g
+(command,)h(Bash)f(do)s(es)h(not)f(prin)m(t)150 1802
+y(another)h(w)m(arning,)e(and)h(the)g(stopp)s(ed)g(jobs)g(are)g
+(terminated.)150 2063 y Fr(7.2)68 b(Job)45 b(Con)l(trol)h(Builtins)150
+2308 y Fs(bg)870 2443 y(bg)h([)p Fj(jobspec)11 b Fs(])630
+2578 y Ft(Resume)28 b(the)g(susp)s(ended)d(job)j Fq(jobsp)s(ec)k
+Ft(in)27 b(the)h(bac)m(kground,)h(as)f(if)f(it)g(had)g(b)s(een)g
+(started)630 2688 y(with)k(`)p Fs(&)p Ft('.)45 b(If)31
+b Fq(jobsp)s(ec)37 b Ft(is)31 b(not)h(supplied,)d(the)j(curren)m(t)g
+(job)f(is)g(used.)45 b(The)31 b(return)g(status)630 2797
+y(is)h(zero)h(unless)e(it)h(is)g(run)f(when)h(job)g(con)m(trol)h(is)f
+(not)h(enabled,)g(or,)g(when)f(run)f(with)g(job)630 2907
+y(con)m(trol)37 b(enabled,)h(if)e Fq(jobsp)s(ec)42 b
+Ft(w)m(as)37 b(not)h(found)d(or)i Fq(jobsp)s(ec)42 b
+Ft(sp)s(eci\014es)36 b(a)h(job)g(that)h(w)m(as)630 3017
+y(started)31 b(without)e(job)h(con)m(trol.)150 3177 y
+Fs(fg)870 3312 y(fg)47 b([)p Fj(jobspec)11 b Fs(])630
+3448 y Ft(Resume)43 b(the)g(job)g Fq(jobsp)s(ec)48 b
+Ft(in)42 b(the)h(foreground)g(and)f(mak)m(e)j(it)d(the)i(curren)m(t)f
+(job.)78 b(If)630 3557 y Fq(jobsp)s(ec)41 b Ft(is)36
+b(not)g(supplied,)f(the)h(curren)m(t)h(job)f(is)f(used.)58
+b(The)36 b(return)f(status)h(is)g(that)h(of)630 3667
+y(the)d(command)g(placed)g(in)m(to)g(the)g(foreground,)g(or)g(non-zero)
+h(if)e(run)g(when)g(job)g(con)m(trol)630 3776 y(is)h(disabled)f(or,)k
+(when)d(run)g(with)g(job)h(con)m(trol)g(enabled,)h Fq(jobsp)s(ec)k
+Ft(do)s(es)35 b(not)h(sp)s(ecify)e(a)630 3886 y(v)-5
+b(alid)29 b(job)h(or)g Fq(jobsp)s(ec)35 b Ft(sp)s(eci\014es)29
+b(a)i(job)f(that)h(w)m(as)g(started)g(without)e(job)h(con)m(trol.)150
+4047 y Fs(jobs)870 4182 y(jobs)47 b([-lnprs])e([)p Fj(jobspec)11
+b Fs(])870 4291 y(jobs)47 b(-x)g Fj(command)56 b Fs([)p
+Fj(arguments)11 b Fs(])630 4427 y Ft(The)30 b(\014rst)f(form)h(lists)f
+(the)i(activ)m(e)g(jobs.)41 b(The)30 b(options)f(ha)m(v)m(e)j(the)e
+(follo)m(wing)f(meanings:)630 4587 y Fs(-l)384 b Ft(List)30
+b(pro)s(cess)g Fl(id)p Ft(s)g(in)f(addition)g(to)i(the)f(normal)g
+(information.)630 4748 y Fs(-n)384 b Ft(Displa)m(y)24
+b(information)f(only)i(ab)s(out)f(jobs)h(that)g(ha)m(v)m(e)i(c)m
+(hanged)e(status)h(since)1110 4858 y(the)31 b(user)e(w)m(as)i(last)f
+(noti\014ed)f(of)i(their)e(status.)630 5018 y Fs(-p)384
+b Ft(List)30 b(only)f(the)i(pro)s(cess)f Fl(id)g Ft(of)h(the)f(job's)g
+(pro)s(cess)g(group)g(leader.)630 5179 y Fs(-r)384 b
+Ft(Restrict)30 b(output)g(to)i(running)27 b(jobs.)630
+5340 y Fs(-s)384 b Ft(Restrict)30 b(output)g(to)i(stopp)s(ed)d(jobs.)p
+eop
+%%Page: 81 87
+81 86 bop 150 -116 a Ft(Chapter)30 b(7:)41 b(Job)30 b(Con)m(trol)2570
+b(81)630 299 y(If)23 b Fq(jobsp)s(ec)28 b Ft(is)23 b(giv)m(en,)i
+(output)e(is)g(restricted)g(to)h(information)e(ab)s(out)h(that)h(job.)
+39 b(If)23 b Fq(jobsp)s(ec)630 408 y Ft(is)29 b(not)i(supplied,)c(the)k
+(status)g(of)f(all)f(jobs)h(is)g(listed.)630 552 y(If)h(the)g(`)p
+Fs(-x)p Ft(')g(option)g(is)f(supplied,)f Fs(jobs)h Ft(replaces)h(an)m
+(y)g Fq(jobsp)s(ec)37 b Ft(found)29 b(in)h Fq(command)35
+b Ft(or)630 662 y Fq(argumen)m(ts)41 b Ft(with)36 b(the)i(corresp)s
+(onding)d(pro)s(cess)i(group)f Fl(id)p Ft(,)k(and)c(executes)j
+Fq(command)p Ft(,)630 771 y(passing)29 b(it)h Fq(argumen)m(t)r
+Ft(s,)h(returning)e(its)g(exit)i(status.)150 949 y Fs(kill)870
+1093 y(kill)47 b([-s)g Fj(sigspec)11 b Fs(])45 b([-n)i
+Fj(signum)11 b Fs(])45 b([-)p Fj(sigspec)11 b Fs(])44
+b Fj(jobspec)57 b Fs(or)47 b Fj(pid)870 1202 y Fs(kill)g(-l)g([)p
+Fj(exit_status)11 b Fs(])630 1346 y Ft(Send)22 b(a)i(signal)e(sp)s
+(eci\014ed)g(b)m(y)h Fq(sigsp)s(ec)28 b Ft(or)c Fq(sign)m(um)e
+Ft(to)i(the)g(pro)s(cess)f(named)g(b)m(y)g(job)g(sp)s(eci\014-)630
+1456 y(cation)j Fq(jobsp)s(ec)31 b Ft(or)26 b(pro)s(cess)g
+Fl(id)g Fq(pid)p Ft(.)38 b Fq(sigsp)s(ec)31 b Ft(is)25
+b(either)g(a)i(signal)d(name)j(suc)m(h)e(as)i Fs(SIGINT)630
+1565 y Ft(\(with)e(or)h(without)g(the)g Fs(SIG)f Ft(pre\014x\))h(or)g
+(a)h(signal)e(n)m(um)m(b)s(er;)h Fq(sign)m(um)f Ft(is)g(a)i(signal)e(n)
+m(um)m(b)s(er.)630 1675 y(If)35 b Fq(sigsp)s(ec)k Ft(and)c
+Fq(sign)m(um)f Ft(are)h(not)h(presen)m(t,)g Fs(SIGTERM)d
+Ft(is)h(used.)54 b(The)35 b(`)p Fs(-l)p Ft(')g(option)f(lists)630
+1785 y(the)d(signal)e(names.)41 b(If)31 b(an)m(y)f(argumen)m(ts)h(are)g
+(supplied)d(when)h(`)p Fs(-l)p Ft(')i(is)e(giv)m(en,)i(the)g(names)630
+1894 y(of)g(the)f(signals)f(corresp)s(onding)g(to)i(the)g(argumen)m(ts)
+f(are)h(listed,)f(and)g(the)g(return)g(status)630 2004
+y(is)k(zero.)55 b Fq(exit)p 1122 2004 28 4 v 40 w(status)39
+b Ft(is)34 b(a)i(n)m(um)m(b)s(er)d(sp)s(ecifying)g(a)i(signal)f(n)m(um)
+m(b)s(er)g(or)h(the)g(exit)g(status)630 2113 y(of)i(a)f(pro)s(cess)g
+(terminated)g(b)m(y)h(a)f(signal.)58 b(The)36 b(return)f(status)i(is)e
+(zero)i(if)f(at)h(least)g(one)630 2223 y(signal)30 b(w)m(as)h
+(successfully)e(sen)m(t,)j(or)f(non-zero)h(if)e(an)h(error)f(o)s(ccurs)
+h(or)g(an)g(in)m(v)-5 b(alid)28 b(option)630 2333 y(is)h(encoun)m
+(tered.)150 2510 y Fs(wait)870 2654 y(wait)47 b([)p Fj(jobspec)56
+b Fs(or)47 b Fj(pid)11 b Fs(])630 2798 y Ft(W)-8 b(ait)44
+b(un)m(til)d(the)i(c)m(hild)f(pro)s(cess)g(sp)s(eci\014ed)g(b)m(y)h
+(pro)s(cess)f Fl(id)i Fq(pid)g Ft(or)f(job)g(sp)s(eci\014cation)630
+2907 y Fq(jobsp)s(ec)d Ft(exits)34 b(and)g(return)g(the)g(exit)h
+(status)g(of)g(the)g(last)f(command)g(w)m(aited)h(for.)53
+b(If)35 b(a)630 3017 y(job)g(sp)s(ec)f(is)g(giv)m(en,)i(all)e(pro)s
+(cesses)h(in)e(the)i(job)g(are)g(w)m(aited)g(for.)54
+b(If)35 b(no)f(argumen)m(ts)i(are)630 3127 y(giv)m(en,)c(all)e(curren)m
+(tly)g(activ)m(e)i(c)m(hild)e(pro)s(cesses)h(are)g(w)m(aited)g(for,)h
+(and)e(the)i(return)e(status)630 3236 y(is)g(zero.)44
+b(If)30 b(neither)g Fq(jobsp)s(ec)36 b Ft(nor)31 b Fq(pid)h
+Ft(sp)s(eci\014es)e(an)h(activ)m(e)h(c)m(hild)e(pro)s(cess)g(of)h(the)g
+(shell,)630 3346 y(the)g(return)e(status)i(is)e(127.)150
+3524 y Fs(disown)870 3667 y(disown)46 b([-ar])g([-h])h([)p
+Fj(jobspec)56 b Fs(...)o(])630 3811 y Ft(Without)31 b(options,)g(eac)m
+(h)i Fq(jobsp)s(ec)j Ft(is)31 b(remo)m(v)m(ed)h(from)f(the)h(table)f
+(of)h(activ)m(e)g(jobs.)44 b(If)31 b(the)630 3921 y(`)p
+Fs(-h)p Ft(')36 b(option)g(is)g(giv)m(en,)i(the)f(job)f(is)g(not)g
+(remo)m(v)m(ed)i(from)e(the)h(table,)h(but)e(is)f(mark)m(ed)i(so)630
+4030 y(that)d Fs(SIGHUP)d Ft(is)i(not)g(sen)m(t)h(to)g(the)f(job)g(if)f
+(the)i(shell)d(receiv)m(es)j(a)g Fs(SIGHUP)p Ft(.)47
+b(If)33 b Fq(jobsp)s(ec)38 b Ft(is)630 4140 y(not)32
+b(presen)m(t,)f(and)g(neither)g(the)g(`)p Fs(-a)p Ft(')g(nor)g(`)p
+Fs(-r)p Ft(')g(option)g(is)g(supplied,)d(the)k(curren)m(t)f(job)g(is)
+630 4249 y(used.)58 b(If)36 b(no)g Fq(jobsp)s(ec)41 b
+Ft(is)35 b(supplied,)g(the)i(`)p Fs(-a)p Ft(')f(option)g(means)g(to)h
+(remo)m(v)m(e)h(or)e(mark)g(all)630 4359 y(jobs;)28 b(the)f(`)p
+Fs(-r)p Ft(')g(option)f(without)g(a)h Fq(jobsp)s(ec)32
+b Ft(argumen)m(t)27 b(restricts)g(op)s(eration)f(to)i(running)630
+4468 y(jobs.)150 4646 y Fs(suspend)870 4790 y(suspend)46
+b([-f])630 4934 y Ft(Susp)s(end)28 b(the)i(execution)h(of)g(this)e
+(shell)f(un)m(til)h(it)h(receiv)m(es)h(a)g Fs(SIGCONT)e
+Ft(signal.)39 b(The)30 b(`)p Fs(-f)p Ft(')630 5043 y(option)g(means)g
+(to)h(susp)s(end)d(ev)m(en)j(if)f(the)g(shell)f(is)g(a)i(login)e
+(shell.)275 5230 y(When)h(job)f(con)m(trol)i(is)e(not)i(activ)m(e,)h
+(the)e Fs(kill)f Ft(and)h Fs(wait)f Ft(builtins)d(do)k(not)h(accept)h
+Fq(jobsp)s(ec)j Ft(argu-)150 5340 y(men)m(ts.)41 b(They)30
+b(m)m(ust)g(b)s(e)g(supplied)d(pro)s(cess)j Fl(id)p Ft(s.)p
+eop
+%%Page: 82 88
+82 87 bop 150 -116 a Ft(82)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fr(7.3)68 b(Job)45 b(Con)l(trol)h(V)-11 b(ariables)150
+543 y Fs(auto_resume)630 653 y Ft(This)30 b(v)-5 b(ariable)30
+b(con)m(trols)h(ho)m(w)h(the)f(shell)f(in)m(teracts)i(with)e(the)i
+(user)e(and)h(job)g(con)m(trol.)44 b(If)630 762 y(this)27
+b(v)-5 b(ariable)28 b(exists)g(then)g(single)f(w)m(ord)h(simple)f
+(commands)h(without)f(redirections)h(are)630 872 y(treated)j(as)g
+(candidates)e(for)h(resumption)f(of)h(an)g(existing)f(job.)41
+b(There)29 b(is)g(no)i(am)m(biguit)m(y)630 981 y(allo)m(w)m(ed;)d(if)e
+(there)h(is)f(more)h(than)f(one)h(job)g(b)s(eginning)d(with)h(the)i
+(string)f(t)m(yp)s(ed,)h(then)g(the)630 1091 y(most)j(recen)m(tly)g
+(accessed)g(job)f(will)e(b)s(e)i(selected.)41 b(The)29
+b(name)g(of)h(a)g(stopp)s(ed)e(job,)i(in)e(this)630 1200
+y(con)m(text,)i(is)d(the)h(command)g(line)e(used)h(to)h(start)g(it.)40
+b(If)27 b(this)g(v)-5 b(ariable)26 b(is)h(set)h(to)h(the)e(v)-5
+b(alue)630 1310 y(`)p Fs(exact)p Ft(',)33 b(the)g(string)f(supplied)e
+(m)m(ust)j(matc)m(h)g(the)h(name)f(of)g(a)g(stopp)s(ed)f(job)h
+(exactly;)i(if)630 1420 y(set)29 b(to)h(`)p Fs(substring)p
+Ft(',)d(the)i(string)f(supplied)d(needs)k(to)g(matc)m(h)h(a)f
+(substring)e(of)i(the)g(name)630 1529 y(of)38 b(a)f(stopp)s(ed)g(job.)
+62 b(The)37 b(`)p Fs(substring)p Ft(')e(v)-5 b(alue)37
+b(pro)m(vides)f(functionalit)m(y)g(analogous)i(to)630
+1639 y(the)g(`)p Fs(\045?)p Ft(')f(job)h Fl(id)f Ft(\(see)i(Section)e
+(7.1)i([Job)f(Con)m(trol)f(Basics],)j(page)e(79\).)64
+b(If)37 b(set)h(to)h(an)m(y)630 1748 y(other)32 b(v)-5
+b(alue,)31 b(the)h(supplied)c(string)j(m)m(ust)g(b)s(e)g(a)h(pre\014x)f
+(of)h(a)g(stopp)s(ed)e(job's)i(name;)g(this)630 1858
+y(pro)m(vides)d(functionalit)m(y)g(analogous)i(to)g(the)g(`)p
+Fs(\045)p Ft(')f(job)g Fl(id)p Ft(.)p eop
+%%Page: 83 89
+83 88 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(83)150 299 y Fo(8)80 b(Command)52
+b(Line)i(Editing)275 539 y Ft(This)38 b(c)m(hapter)i(describ)s(es)f
+(the)h(basic)f(features)h(of)h(the)f Fl(gnu)f Ft(command)h(line)e
+(editing)h(in)m(terface.)150 648 y(Command)25 b(line)f(editing)g(is)h
+(pro)m(vided)f(b)m(y)i(the)g(Readline)e(library)-8 b(,)25
+b(whic)m(h)g(is)g(used)g(b)m(y)g(sev)m(eral)h(di\013eren)m(t)150
+758 y(programs,)k(including)d(Bash.)150 1020 y Fr(8.1)68
+b(In)l(tro)t(duction)45 b(to)g(Line)h(Editing)275 1266
+y Ft(The)29 b(follo)m(wing)g(paragraphs)h(describ)s(e)f(the)h(notation)
+h(used)e(to)j(represen)m(t)e(k)m(eystrok)m(es.)275 1402
+y(The)i(text)j Fj(C-k)d Ft(is)h(read)g(as)h(`Con)m(trol-K')f(and)g
+(describ)s(es)f(the)h(c)m(haracter)i(pro)s(duced)d(when)g(the)3663
+1399 y Fg(h)p 3687 1346 38 4 v 3687 1402 a Ff(k)p 3687
+1417 V 3720 1399 a Fg(i)150 1512 y Ft(k)m(ey)f(is)f(pressed)f(while)f
+(the)j(Con)m(trol)f(k)m(ey)h(is)f(depressed.)275 1648
+y(The)h(text)i Fj(M-k)e Ft(is)g(read)g(as)i(`Meta-K')g(and)f(describ)s
+(es)e(the)i(c)m(haracter)h(pro)s(duced)e(when)f(the)i(Meta)150
+1757 y(k)m(ey)d(\(if)f(y)m(ou)h(ha)m(v)m(e)g(one\))g(is)f(depressed,)g
+(and)f(the)1859 1754 y Fg(h)p 1883 1701 V 1883 1757 a
+Ff(k)p 1883 1773 V 1916 1754 a Fg(i)1974 1757 y Ft(k)m(ey)j(is)d
+(pressed.)39 b(The)28 b(Meta)i(k)m(ey)f(is)f(lab)s(eled)3558
+1754 y Fg(h)p 3582 1701 143 4 v 3582 1757 a Ff(AL)-6
+b(T)p 3582 1773 V 3720 1754 a Fg(i)150 1867 y Ft(on)26
+b(man)m(y)g(k)m(eyb)s(oards.)39 b(On)26 b(k)m(eyb)s(oards)g(with)f(t)m
+(w)m(o)i(k)m(eys)g(lab)s(eled)2425 1864 y Fg(h)p 2450
+1811 V 2450 1867 a Ff(AL)-6 b(T)p 2450 1882 V 2587 1864
+a Fg(i)2643 1867 y Ft(\(usually)25 b(to)i(either)e(side)g(of)i(the)150
+1977 y(space)32 b(bar\),)g(the)775 1974 y Fg(h)p 799
+1921 V 799 1977 a Ff(AL)-6 b(T)p 799 1992 V 937 1974
+a Fg(i)998 1977 y Ft(on)32 b(the)f(left)g(side)g(is)f(generally)h(set)g
+(to)i(w)m(ork)e(as)h(a)f(Meta)i(k)m(ey)-8 b(.)45 b(The)3393
+1974 y Fg(h)p 3417 1921 V 3417 1977 a Ff(AL)-6 b(T)p
+3417 1992 V 3555 1974 a Fg(i)3616 1977 y Ft(k)m(ey)150
+2086 y(on)33 b(the)h(righ)m(t)f(ma)m(y)h(also)f(b)s(e)g(con\014gured)f
+(to)i(w)m(ork)g(as)g(a)f(Meta)i(k)m(ey)f(or)g(ma)m(y)g(b)s(e)e
+(con\014gured)h(as)h(some)150 2196 y(other)d(mo)s(di\014er,)d(suc)m(h)i
+(as)h(a)g(Comp)s(ose)f(k)m(ey)h(for)f(t)m(yping)g(accen)m(ted)i(c)m
+(haracters.)275 2332 y(If)21 b(y)m(ou)h(do)g(not)g(ha)m(v)m(e)h(a)f
+(Meta)h(or)1388 2329 y Fg(h)p 1412 2276 V 1412 2332 a
+Ff(AL)-6 b(T)p 1412 2348 V 1550 2329 a Fg(i)1601 2332
+y Ft(k)m(ey)e(,)25 b(or)d(another)g(k)m(ey)h(w)m(orking)e(as)h(a)g
+(Meta)h(k)m(ey)-8 b(,)25 b(the)d(iden)m(tical)150 2442
+y(k)m(eystrok)m(e)i(can)f(b)s(e)f(generated)i(b)m(y)e(t)m(yping)1619
+2439 y Fg(h)p 1643 2386 139 4 v 1643 2442 a Ff(ESC)p
+1643 2457 V 1777 2439 a Fg(i)1829 2442 y Fm(\014rst)p
+Ft(,)j(and)d(then)g(t)m(yping)2678 2439 y Fg(h)p 2703
+2386 38 4 v 2703 2442 a Ff(k)p 2703 2457 V 2736 2439
+a Fg(i)2765 2442 y Ft(.)38 b(Either)22 b(pro)s(cess)g(is)f(kno)m(wn)150
+2551 y(as)31 b Fq(metafying)38 b Ft(the)850 2548 y Fg(h)p
+874 2495 V 874 2551 a Ff(k)p 874 2567 V 907 2548 a Fg(i)968
+2551 y Ft(k)m(ey)-8 b(.)275 2688 y(The)39 b(text)j Fj(M-C-k)d
+Ft(is)g(read)h(as)h(`Meta-Con)m(trol-k')i(and)c(describ)s(es)g(the)h(c)
+m(haracter)i(pro)s(duced)d(b)m(y)150 2797 y Fq(metafying)f
+Fj(C-k)p Ft(.)275 2934 y(In)e(addition,)h(sev)m(eral)g(k)m(eys)g(ha)m
+(v)m(e)h(their)e(o)m(wn)h(names.)60 b(Sp)s(eci\014cally)-8
+b(,)2768 2931 y Fg(h)p 2792 2878 146 4 v 2792 2934 a
+Ff(DEL)p 2792 2949 V 2934 2931 a Fg(i)2964 2934 y Ft(,)3028
+2931 y Fg(h)p 3052 2878 139 4 v 3052 2934 a Ff(ESC)p
+3052 2949 V 3186 2931 a Fg(i)3216 2934 y Ft(,)3279 2931
+y Fg(h)p 3303 2878 144 4 v 3303 2934 a Ff(LFD)p 3303
+2949 V 3443 2931 a Fg(i)3473 2934 y Ft(,)3537 2931 y
+Fg(h)p 3561 2878 139 4 v 3561 2934 a Ff(SPC)p 3561 2949
+V 3695 2931 a Fg(i)3725 2934 y Ft(,)150 3040 y Fg(h)p
+174 2987 151 4 v 174 3043 a Ff(RET)p 174 3059 V 321 3040
+a Fg(i)351 3043 y Ft(,)47 b(and)612 3040 y Fg(h)p 637
+2987 148 4 v 637 3043 a Ff(T)-6 b(AB)p 637 3059 V 780
+3040 a Fg(i)853 3043 y Ft(all)43 b(stand)g(for)g(themselv)m(es)h(when)e
+(seen)i(in)e(this)g(text,)48 b(or)43 b(in)f(an)i(init)d(\014le)i(\(see)
+150 3153 y(Section)36 b(8.3)h([Readline)e(Init)g(File],)i(page)g(86\).)
+59 b(If)36 b(y)m(our)g(k)m(eyb)s(oard)g(lac)m(ks)g(a)2897
+3150 y Fg(h)p 2921 3097 144 4 v 2921 3153 a Ff(LFD)p
+2921 3168 V 3061 3150 a Fg(i)3127 3153 y Ft(k)m(ey)-8
+b(,)39 b(t)m(yping)3604 3150 y Fg(h)p 3628 3097 97 4
+v 3628 3153 a Ff(C-j)p 3628 3168 V 3720 3150 a Fg(i)150
+3262 y Ft(will)27 b(pro)s(duce)h(the)i(desired)e(c)m(haracter.)42
+b(The)1748 3259 y Fg(h)p 1772 3206 151 4 v 1772 3262
+a Ff(RET)p 1772 3278 V 1919 3259 a Fg(i)1978 3262 y Ft(k)m(ey)30
+b(ma)m(y)g(b)s(e)f(lab)s(eled)2770 3259 y Fg(h)p 2794
+3206 217 4 v 2794 3262 a Ff(Return)p 2794 3278 V 3007
+3259 a Fg(i)3066 3262 y Ft(or)3176 3259 y Fg(h)p 3201
+3206 172 4 v 3201 3262 a Ff(En)n(ter)p 3201 3278 V 3368
+3259 a Fg(i)3427 3262 y Ft(on)h(some)150 3372 y(k)m(eyb)s(oards.)150
+3634 y Fr(8.2)68 b(Readline)47 b(In)l(teraction)275 3880
+y Ft(Often)24 b(during)f(an)i(in)m(teractiv)m(e)h(session)f(y)m(ou)g(t)
+m(yp)s(e)h(in)e(a)h(long)g(line)e(of)j(text,)h(only)e(to)g(notice)h
+(that)g(the)150 3989 y(\014rst)32 b(w)m(ord)g(on)g(the)g(line)f(is)h
+(missp)s(elled.)43 b(The)32 b(Readline)f(library)f(giv)m(es)i(y)m(ou)h
+(a)g(set)g(of)f(commands)g(for)150 4099 y(manipulating)27
+b(the)j(text)h(as)f(y)m(ou)g(t)m(yp)s(e)g(it)f(in,)g(allo)m(wing)f(y)m
+(ou)i(to)h(just)e(\014x)g(y)m(our)h(t)m(yp)s(o,)g(and)g(not)g(forcing)
+150 4209 y(y)m(ou)e(to)h(ret)m(yp)s(e)g(the)f(ma)5 b(jorit)m(y)28
+b(of)g(the)h(line.)38 b(Using)27 b(these)i(editing)e(commands,)h(y)m
+(ou)h(mo)m(v)m(e)g(the)g(cursor)150 4318 y(to)35 b(the)f(place)h(that)f
+(needs)g(correction,)i(and)e(delete)g(or)g(insert)g(the)g(text)h(of)g
+(the)f(corrections.)53 b(Then,)150 4428 y(when)30 b(y)m(ou)i(are)f
+(satis\014ed)f(with)g(the)h(line,)f(y)m(ou)i(simply)c(press)2320
+4425 y Fg(h)p 2344 4372 151 4 v 2344 4428 a Ff(RET)p
+2344 4443 V 2491 4425 a Fg(i)2520 4428 y Ft(.)43 b(Y)-8
+b(ou)32 b(do)f(not)g(ha)m(v)m(e)i(to)e(b)s(e)g(at)h(the)150
+4537 y(end)j(of)h(the)g(line)e(to)j(press)1126 4534 y
+Fg(h)p 1150 4481 V 1150 4537 a Ff(RET)p 1150 4553 V 1297
+4534 a Fg(i)1327 4537 y Ft(;)h(the)e(en)m(tire)g(line)e(is)h(accepted)i
+(regardless)e(of)h(the)g(lo)s(cation)g(of)g(the)150 4647
+y(cursor)30 b(within)e(the)i(line.)150 4875 y Fk(8.2.1)63
+b(Readline)40 b(Bare)h(Essen)m(tials)275 5121 y Ft(In)22
+b(order)g(to)i(en)m(ter)g(c)m(haracters)g(in)m(to)f(the)h(line,)f
+(simply)d(t)m(yp)s(e)k(them.)38 b(The)22 b(t)m(yp)s(ed)h(c)m(haracter)i
+(app)s(ears)150 5230 y(where)32 b(the)h(cursor)e(w)m(as,)j(and)e(then)g
+(the)h(cursor)e(mo)m(v)m(es)j(one)f(space)g(to)g(the)g(righ)m(t.)46
+b(If)32 b(y)m(ou)h(mist)m(yp)s(e)f(a)150 5340 y(c)m(haracter,)g(y)m(ou)
+f(can)g(use)f(y)m(our)g(erase)h(c)m(haracter)h(to)f(bac)m(k)g(up)f(and)
+f(delete)i(the)g(mist)m(yp)s(ed)d(c)m(haracter.)p eop
+%%Page: 84 90
+84 89 bop 150 -116 a Ft(84)2572 b(Bash)31 b(Reference)g(Man)m(ual)275
+299 y(Sometimes)f(y)m(ou)h(ma)m(y)h(mist)m(yp)s(e)d(a)j(c)m(haracter,)g
+(and)e(not)i(notice)f(the)g(error)f(un)m(til)f(y)m(ou)i(ha)m(v)m(e)h(t)
+m(yp)s(ed)150 408 y(sev)m(eral)d(other)g(c)m(haracters.)42
+b(In)28 b(that)i(case,)g(y)m(ou)f(can)g(t)m(yp)s(e)h
+Fj(C-b)d Ft(to)j(mo)m(v)m(e)g(the)f(cursor)g(to)g(the)g(left,)h(and)150
+518 y(then)g(correct)i(y)m(our)e(mistak)m(e.)41 b(Afterw)m(ards,)31
+b(y)m(ou)f(can)h(mo)m(v)m(e)h(the)e(cursor)g(to)h(the)g(righ)m(t)f
+(with)f Fj(C-f)p Ft(.)275 679 y(When)j(y)m(ou)h(add)f(text)h(in)e(the)i
+(middle)d(of)j(a)g(line,)f(y)m(ou)g(will)e(notice)j(that)g(c)m
+(haracters)h(to)g(the)e(righ)m(t)150 789 y(of)d(the)g(cursor)f(are)h
+(`pushed)e(o)m(v)m(er')j(to)g(mak)m(e)f(ro)s(om)g(for)f(the)h(text)h
+(that)f(y)m(ou)g(ha)m(v)m(e)h(inserted.)39 b(Lik)m(ewise,)150
+898 y(when)e(y)m(ou)g(delete)h(text)h(b)s(ehind)34 b(the)k(cursor,)h(c)
+m(haracters)g(to)f(the)g(righ)m(t)f(of)h(the)g(cursor)e(are)i(`pulled)
+150 1008 y(bac)m(k')24 b(to)f(\014ll)e(in)g(the)i(blank)e(space)j
+(created)f(b)m(y)g(the)g(remo)m(v)-5 b(al)23 b(of)g(the)g(text.)39
+b(A)23 b(list)e(of)i(the)g(bare)f(essen)m(tials)150 1117
+y(for)30 b(editing)f(the)i(text)g(of)g(an)f(input)e(line)h(follo)m(ws.)
+150 1317 y Fj(C-b)336 b Ft(Mo)m(v)m(e)32 b(bac)m(k)g(one)e(c)m
+(haracter.)150 1502 y Fj(C-f)336 b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(one)
+h(c)m(haracter.)150 1685 y Fg(h)p 174 1632 146 4 v 174
+1688 a Ff(DEL)p 174 1704 V 316 1685 a Fg(i)376 1688 y
+Ft(or)487 1685 y Fg(h)p 512 1632 317 4 v 512 1688 a Ff(Bac)n(kspace)p
+512 1704 V 824 1685 a Fg(i)630 1798 y Ft(Delete)h(the)e(c)m(haracter)i
+(to)f(the)g(left)f(of)g(the)h(cursor.)150 1984 y Fj(C-d)336
+b Ft(Delete)32 b(the)e(c)m(haracter)i(underneath)d(the)i(cursor.)150
+2170 y(Prin)m(ting)e(c)m(haracters)630 2279 y(Insert)h(the)g(c)m
+(haracter)i(in)m(to)f(the)f(line)f(at)i(the)g(cursor.)150
+2465 y Fj(C-_)e Ft(or)i Fj(C-x)e(C-u)630 2575 y Ft(Undo)k(the)h(last)f
+(editing)f(command.)50 b(Y)-8 b(ou)34 b(can)f(undo)g(all)f(the)h(w)m(a)
+m(y)i(bac)m(k)f(to)g(an)g(empt)m(y)630 2684 y(line.)150
+2883 y(\(Dep)s(ending)f(on)h(y)m(our)g(con\014guration,)g(the)1726
+2880 y Fg(h)p 1750 2827 V 1750 2883 a Ff(Bac)n(kspace)p
+1750 2899 V 2063 2880 a Fg(i)2127 2883 y Ft(k)m(ey)h(b)s(e)e(set)h(to)h
+(delete)f(the)g(c)m(haracter)i(to)f(the)150 2993 y(left)e(of)g(the)g
+(cursor)f(and)h(the)1192 2990 y Fg(h)p 1216 2937 146
+4 v 1216 2993 a Ff(DEL)p 1216 3008 V 1358 2990 a Fg(i)1421
+2993 y Ft(k)m(ey)g(set)h(to)g(delete)f(the)g(c)m(haracter)i(underneath)
+c(the)i(cursor,)h(lik)m(e)150 3103 y Fj(C-d)p Ft(,)c(rather)g(than)g
+(the)h(c)m(haracter)h(to)f(the)f(left)g(of)h(the)f(cursor.\))150
+3380 y Fk(8.2.2)63 b(Readline)40 b(Mo)m(v)m(emen)m(t)g(Commands)275
+3650 y Ft(The)25 b(ab)s(o)m(v)m(e)i(table)f(describ)s(es)f(the)h(most)h
+(basic)e(k)m(eystrok)m(es)j(that)f(y)m(ou)f(need)g(in)f(order)g(to)i
+(do)f(editing)150 3760 y(of)g(the)f(input)f(line.)37
+b(F)-8 b(or)27 b(y)m(our)e(con)m(v)m(enience,)j(man)m(y)d(other)h
+(commands)f(ha)m(v)m(e)i(b)s(een)e(added)g(in)f(addition)150
+3869 y(to)33 b Fj(C-b)p Ft(,)e Fj(C-f)p Ft(,)h Fj(C-d)p
+Ft(,)g(and)1043 3866 y Fg(h)p 1067 3813 V 1067 3869 a
+Ff(DEL)p 1067 3885 V 1209 3866 a Fg(i)1239 3869 y Ft(.)45
+b(Here)33 b(are)f(some)g(commands)g(for)g(mo)m(ving)g(more)g(rapidly)d
+(ab)s(out)j(the)150 3979 y(line.)150 4178 y Fj(C-a)336
+b Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f(line.)150
+4364 y Fj(C-e)336 b Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h
+(line.)150 4550 y Fj(M-f)336 b Ft(Mo)m(v)m(e)32 b(forw)m(ard)e(a)h(w)m
+(ord,)f(where)g(a)h(w)m(ord)f(is)f(comp)s(osed)h(of)h(letters)g(and)e
+(digits.)150 4736 y Fj(M-b)336 b Ft(Mo)m(v)m(e)32 b(bac)m(kw)m(ard)f(a)
+g(w)m(ord.)150 4922 y Fj(C-l)336 b Ft(Clear)30 b(the)g(screen,)h
+(reprin)m(ting)d(the)j(curren)m(t)f(line)f(at)i(the)f(top.)275
+5121 y(Notice)25 b(ho)m(w)g Fj(C-f)e Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h
+(c)m(haracter,)j(while)23 b Fj(M-f)g Ft(mo)m(v)m(es)j(forw)m(ard)e(a)h
+(w)m(ord.)39 b(It)24 b(is)g(a)h(lo)s(ose)150 5230 y(con)m(v)m(en)m
+(tion)31 b(that)g(con)m(trol)f(k)m(eystrok)m(es)i(op)s(erate)e(on)g(c)m
+(haracters)h(while)d(meta)j(k)m(eystrok)m(es)h(op)s(erate)e(on)150
+5340 y(w)m(ords.)p eop
+%%Page: 85 91
+85 90 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(85)150 299 y Fk(8.2.3)63 b(Readline)40
+b(Killing)i(Commands)275 566 y Fq(Killing)f Ft(text)e(means)e(to)h
+(delete)f(the)h(text)g(from)f(the)g(line,)h(but)f(to)h(sa)m(v)m(e)h(it)
+d(a)m(w)m(a)m(y)k(for)d(later)g(use,)150 675 y(usually)32
+b(b)m(y)i Fq(y)m(anking)41 b Ft(\(re-inserting\))33 b(it)h(bac)m(k)h
+(in)m(to)f(the)g(line.)50 b(\(`Cut')35 b(and)e(`paste')i(are)g(more)f
+(recen)m(t)150 785 y(jargon)d(for)f(`kill')e(and)i(`y)m(ank'.\))275
+942 y(If)f(the)i(description)d(for)i(a)h(command)f(sa)m(ys)g(that)h(it)
+f(`kills')e(text,)k(then)e(y)m(ou)g(can)h(b)s(e)e(sure)h(that)h(y)m(ou)
+150 1052 y(can)g(get)g(the)g(text)g(bac)m(k)g(in)e(a)i(di\013eren)m(t)f
+(\(or)h(the)f(same\))h(place)g(later.)275 1209 y(When)23
+b(y)m(ou)g(use)g(a)h(kill)d(command,)j(the)g(text)g(is)e(sa)m(v)m(ed)j
+(in)d(a)h Fq(kill-ring)p Ft(.)35 b(An)m(y)24 b(n)m(um)m(b)s(er)e(of)h
+(consecutiv)m(e)150 1318 y(kills)28 b(sa)m(v)m(e)33 b(all)d(of)h(the)g
+(killed)e(text)j(together,)g(so)g(that)f(when)f(y)m(ou)h(y)m(ank)h(it)e
+(bac)m(k,)i(y)m(ou)g(get)g(it)e(all.)41 b(The)150 1428
+y(kill)30 b(ring)h(is)g(not)i(line)e(sp)s(eci\014c;)h(the)h(text)g
+(that)g(y)m(ou)g(killed)c(on)k(a)f(previously)e(t)m(yp)s(ed)j(line)d
+(is)i(a)m(v)-5 b(ailable)150 1537 y(to)31 b(b)s(e)f(y)m(ank)m(ed)h(bac)
+m(k)g(later,)g(when)e(y)m(ou)i(are)g(t)m(yping)e(another)i(line.)275
+1695 y(Here)f(is)g(the)g(list)f(of)i(commands)f(for)g(killing)d(text.)
+150 1888 y Fj(C-k)336 b Ft(Kill)28 b(the)i(text)i(from)e(the)g(curren)m
+(t)g(cursor)g(p)s(osition)f(to)i(the)f(end)g(of)g(the)h(line.)150
+2070 y Fj(M-d)336 b Ft(Kill)24 b(from)i(the)g(cursor)g(to)h(the)f(end)g
+(of)h(the)f(curren)m(t)g(w)m(ord,)h(or,)h(if)d(b)s(et)m(w)m(een)i(w)m
+(ords,)g(to)g(the)630 2180 y(end)j(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ord)30 b(b)s(oundaries)e(are)j(the)g(same)f(as)h(those)g(used)
+f(b)m(y)g Fj(M-f)p Ft(.)150 2362 y Fj(M-)246 2359 y Fg(h)p
+270 2306 146 4 v 270 2362 a Ff(DEL)p 270 2377 V 411 2359
+a Fg(i)630 2362 y Ft(Kill)e(from)i(the)h(cursor)f(the)g(start)h(of)g
+(the)g(curren)m(t)f(w)m(ord,)h(or,)f(if)g(b)s(et)m(w)m(een)h(w)m(ords,)
+f(to)i(the)630 2471 y(start)39 b(of)f(the)h(previous)e(w)m(ord.)64
+b(W)-8 b(ord)39 b(b)s(oundaries)d(are)j(the)f(same)h(as)g(those)f(used)
+g(b)m(y)630 2581 y Fj(M-b)p Ft(.)150 2763 y Fj(C-w)336
+b Ft(Kill)29 b(from)h(the)i(cursor)e(to)i(the)g(previous)d(whitespace.)
+43 b(This)30 b(is)g(di\013eren)m(t)h(than)g Fj(M-)3555
+2760 y Fg(h)p 3578 2707 V 3578 2763 a Ff(DEL)p 3578 2778
+V 3720 2760 a Fg(i)630 2872 y Ft(b)s(ecause)f(the)h(w)m(ord)f(b)s
+(oundaries)e(di\013er.)275 3066 y(Here)42 b(is)e(ho)m(w)i(to)g
+Fq(y)m(ank)47 b Ft(the)42 b(text)g(bac)m(k)h(in)m(to)e(the)h(line.)72
+b(Y)-8 b(anking)42 b(means)f(to)h(cop)m(y)h(the)e(most-)150
+3175 y(recen)m(tly-killed)29 b(text)i(from)f(the)g(kill)f(bu\013er.)150
+3369 y Fj(C-y)336 b Ft(Y)-8 b(ank)31 b(the)f(most)h(recen)m(tly)g
+(killed)d(text)j(bac)m(k)g(in)m(to)g(the)f(bu\013er)g(at)h(the)f
+(cursor.)150 3551 y Fj(M-y)336 b Ft(Rotate)36 b(the)f(kill-ring,)e(and)
+h(y)m(ank)h(the)f(new)g(top.)54 b(Y)-8 b(ou)35 b(can)g(only)e(do)i
+(this)e(if)h(the)h(prior)630 3660 y(command)30 b(is)g
+Fj(C-y)f Ft(or)h Fj(M-y)p Ft(.)150 3930 y Fk(8.2.4)63
+b(Readline)40 b(Argumen)m(ts)275 4197 y Ft(Y)-8 b(ou)29
+b(can)h(pass)f(n)m(umeric)f(argumen)m(ts)h(to)h(Readline)e(commands.)40
+b(Sometimes)29 b(the)g(argumen)m(t)h(acts)150 4306 y(as)40
+b(a)h(rep)s(eat)f(coun)m(t,)j(other)e(times)e(it)h(is)f(the)h
+Fm(sign)47 b Ft(of)41 b(the)f(argumen)m(t)g(that)h(is)e(signi\014can)m
+(t.)69 b(If)40 b(y)m(ou)150 4416 y(pass)33 b(a)h(negativ)m(e)h(argumen)
+m(t)f(to)g(a)g(command)f(whic)m(h)f(normally)g(acts)i(in)e(a)i(forw)m
+(ard)f(direction,)g(that)150 4525 y(command)i(will)e(act)j(in)e(a)i
+(bac)m(kw)m(ard)f(direction.)55 b(F)-8 b(or)36 b(example,)g(to)g(kill)d
+(text)j(bac)m(k)g(to)g(the)g(start)g(of)150 4635 y(the)31
+b(line,)e(y)m(ou)h(migh)m(t)g(t)m(yp)s(e)h(`)p Fs(M--)f(C-k)p
+Ft('.)275 4792 y(The)d(general)h(w)m(a)m(y)i(to)e(pass)g(n)m(umeric)f
+(argumen)m(ts)i(to)g(a)f(command)g(is)f(to)i(t)m(yp)s(e)f(meta)i
+(digits)c(b)s(efore)150 4902 y(the)31 b(command.)42 b(If)30
+b(the)h(\014rst)f(`digit')g(t)m(yp)s(ed)h(is)f(a)h(min)m(us)e(sign)h
+(\(`)p Fs(-)p Ft('\),)i(then)f(the)g(sign)e(of)i(the)g(argumen)m(t)150
+5011 y(will)36 b(b)s(e)h(negativ)m(e.)65 b(Once)38 b(y)m(ou)h(ha)m(v)m
+(e)g(t)m(yp)s(ed)f(one)h(meta)g(digit)e(to)h(get)i(the)e(argumen)m(t)h
+(started,)i(y)m(ou)150 5121 y(can)29 b(t)m(yp)s(e)g(the)g(remainder)e
+(of)i(the)g(digits,)f(and)h(then)f(the)h(command.)40
+b(F)-8 b(or)30 b(example,)f(to)g(giv)m(e)h(the)f Fj(C-d)150
+5230 y Ft(command)37 b(an)g(argumen)m(t)h(of)g(10,)i(y)m(ou)e(could)e
+(t)m(yp)s(e)i(`)p Fs(M-1)29 b(0)h(C-d)p Ft(',)39 b(whic)m(h)d(will)f
+(delete)j(the)f(next)h(ten)150 5340 y(c)m(haracters)32
+b(on)e(the)h(input)d(line.)p eop
+%%Page: 86 92
+86 91 bop 150 -116 a Ft(86)2572 b(Bash)31 b(Reference)g(Man)m(ual)150
+299 y Fk(8.2.5)63 b(Searc)m(hing)40 b(for)h(Commands)f(in)h(the)g
+(History)275 548 y Ft(Readline)21 b(pro)m(vides)h(commands)g(for)h
+(searc)m(hing)g(through)f(the)h(command)g(history)e(\(see)j(Section)f
+(9.1)150 657 y([Bash)37 b(History)g(F)-8 b(acilities],)38
+b(page)f(109\))i(for)d(lines)f(con)m(taining)i(a)g(sp)s(eci\014ed)e
+(string.)59 b(There)36 b(are)i(t)m(w)m(o)150 767 y(searc)m(h)31
+b(mo)s(des:)40 b Fq(incremen)m(tal)33 b Ft(and)d Fq(non-incremen)m(tal)
+p Ft(.)275 906 y(Incremen)m(tal)25 b(searc)m(hes)i(b)s(egin)d(b)s
+(efore)h(the)h(user)f(has)h(\014nished)d(t)m(yping)i(the)h(searc)m(h)g
+(string.)38 b(As)26 b(eac)m(h)150 1015 y(c)m(haracter)37
+b(of)e(the)h(searc)m(h)g(string)e(is)h(t)m(yp)s(ed,)h(Readline)e
+(displa)m(ys)g(the)h(next)h(en)m(try)g(from)e(the)i(history)150
+1125 y(matc)m(hing)24 b(the)g(string)f(t)m(yp)s(ed)h(so)g(far.)39
+b(An)23 b(incremen)m(tal)h(searc)m(h)g(requires)f(only)g(as)h(man)m(y)g
+(c)m(haracters)i(as)150 1235 y(needed)i(to)i(\014nd)d(the)i(desired)e
+(history)h(en)m(try)-8 b(.)41 b(T)-8 b(o)29 b(searc)m(h)h(bac)m(kw)m
+(ard)f(in)e(the)i(history)f(for)g(a)i(particular)150
+1344 y(string,)f(t)m(yp)s(e)g Fj(C-r)p Ft(.)40 b(T)m(yping)28
+b Fj(C-s)h Ft(searc)m(hes)h(forw)m(ard)f(through)g(the)g(history)-8
+b(.)40 b(The)29 b(c)m(haracters)i(presen)m(t)150 1454
+y(in)37 b(the)h(v)-5 b(alue)37 b(of)h(the)g Fs(isearch-terminators)33
+b Ft(v)-5 b(ariable)37 b(are)h(used)f(to)i(terminate)f(an)g(incremen)m
+(tal)150 1563 y(searc)m(h.)63 b(If)38 b(that)g(v)-5 b(ariable)36
+b(has)i(not)g(b)s(een)f(assigned)g(a)h(v)-5 b(alue,)39
+b(the)2578 1560 y Fg(h)p 2602 1507 139 4 v 2602 1563
+a Ff(ESC)p 2602 1579 V 2736 1560 a Fg(i)2804 1563 y Ft(and)e
+Fj(C-J)f Ft(c)m(haracters)k(will)150 1673 y(terminate)i(an)h(incremen)m
+(tal)e(searc)m(h.)78 b Fj(C-g)41 b Ft(will)f(ab)s(ort)i(an)g(incremen)m
+(tal)g(searc)m(h)h(and)f(restore)h(the)150 1782 y(original)27
+b(line.)39 b(When)28 b(the)h(searc)m(h)h(is)e(terminated,)h(the)g
+(history)f(en)m(try)h(con)m(taining)f(the)h(searc)m(h)h(string)150
+1892 y(b)s(ecomes)h(the)f(curren)m(t)g(line.)275 2031
+y(T)-8 b(o)31 b(\014nd)e(other)j(matc)m(hing)f(en)m(tries)g(in)e(the)i
+(history)f(list,)g(t)m(yp)s(e)i Fj(C-r)e Ft(or)h Fj(C-s)f
+Ft(as)h(appropriate.)42 b(This)150 2141 y(will)23 b(searc)m(h)k(bac)m
+(kw)m(ard)g(or)f(forw)m(ard)g(in)e(the)j(history)e(for)h(the)g(next)g
+(en)m(try)h(matc)m(hing)f(the)g(searc)m(h)h(string)150
+2250 y(t)m(yp)s(ed)37 b(so)h(far.)63 b(An)m(y)38 b(other)f(k)m(ey)i
+(sequence)f(b)s(ound)e(to)i(a)g(Readline)f(command)g(will)e(terminate)j
+(the)150 2360 y(searc)m(h)22 b(and)e(execute)j(that)e(command.)38
+b(F)-8 b(or)22 b(instance,)g(a)2127 2357 y Fg(h)p 2151
+2304 151 4 v 2151 2360 a Ff(RET)p 2151 2375 V 2298 2357
+a Fg(i)2349 2360 y Ft(will)c(terminate)j(the)g(searc)m(h)h(and)e
+(accept)150 2469 y(the)30 b(line,)e(thereb)m(y)h(executing)h(the)f
+(command)g(from)g(the)h(history)e(list.)39 b(A)29 b(mo)m(v)m(emen)m(t)j
+(command)d(will)150 2579 y(terminate)h(the)h(searc)m(h,)g(mak)m(e)h
+(the)e(last)g(line)f(found)g(the)i(curren)m(t)f(line,)f(and)h(b)s(egin)
+f(editing.)275 2718 y(Readline)k(remem)m(b)s(ers)h(the)h(last)g
+(incremen)m(tal)f(searc)m(h)h(string.)53 b(If)34 b(t)m(w)m(o)j
+Fj(C-r)p Ft(s)c(are)i(t)m(yp)s(ed)g(without)150 2828
+y(an)m(y)i(in)m(terv)m(ening)e(c)m(haracters)j(de\014ning)d(a)i(new)f
+(searc)m(h)h(string,)g(an)m(y)g(remem)m(b)s(ered)e(searc)m(h)i(string)f
+(is)150 2937 y(used.)275 3076 y(Non-incremen)m(tal)46
+b(searc)m(hes)i(read)e(the)h(en)m(tire)g(searc)m(h)g(string)f(b)s
+(efore)g(starting)g(to)i(searc)m(h)f(for)150 3186 y(matc)m(hing)c
+(history)e(lines.)76 b(The)42 b(searc)m(h)h(string)f(ma)m(y)h(b)s(e)f
+(t)m(yp)s(ed)g(b)m(y)g(the)h(user)f(or)h(b)s(e)f(part)g(of)h(the)150
+3295 y(con)m(ten)m(ts)32 b(of)f(the)f(curren)m(t)g(line.)150
+3564 y Fr(8.3)68 b(Readline)47 b(Init)e(File)275 3813
+y Ft(Although)f(the)h(Readline)f(library)e(comes)k(with)e(a)i(set)f(of)
+g(Emacs-lik)m(e)g(k)m(eybindings)e(installed)150 3922
+y(b)m(y)f(default,)h(it)f(is)e(p)s(ossible)f(to)k(use)e(a)h(di\013eren)
+m(t)f(set)h(of)g(k)m(eybindings.)72 b(An)m(y)42 b(user)f(can)h
+(customize)150 4032 y(programs)32 b(that)h(use)f(Readline)f(b)m(y)i
+(putting)e(commands)h(in)f(an)h Fq(inputrc)k Ft(\014le,)d(con)m(v)m(en)
+m(tionally)f(in)f(his)150 4142 y(home)e(directory)-8
+b(.)40 b(The)28 b(name)g(of)h(this)f(\014le)f(is)h(tak)m(en)i(from)e
+(the)h(v)-5 b(alue)28 b(of)h(the)f(shell)f(v)-5 b(ariable)28
+b Fs(INPUTRC)p Ft(.)150 4251 y(If)i(that)h(v)-5 b(ariable)29
+b(is)g(unset,)i(the)f(default)g(is)f(`)p Fs(~/.inputrc)p
+Ft('.)275 4390 y(When)g(a)h(program)f(whic)m(h)g(uses)g(the)h(Readline)
+e(library)f(starts)j(up,)f(the)h(init)e(\014le)g(is)h(read,)h(and)f
+(the)150 4500 y(k)m(ey)i(bindings)c(are)k(set.)275 4639
+y(In)26 b(addition,)g(the)h Fs(C-x)i(C-r)d Ft(command)h(re-reads)g
+(this)e(init)g(\014le,)i(th)m(us)g(incorp)s(orating)e(an)m(y)i(c)m
+(hanges)150 4748 y(that)k(y)m(ou)g(migh)m(t)f(ha)m(v)m(e)h(made)g(to)g
+(it.)150 4982 y Fk(8.3.1)63 b(Readline)40 b(Init)h(File)g(Syn)m(tax)275
+5230 y Ft(There)33 b(are)h(only)f(a)h(few)f(basic)g(constructs)h(allo)m
+(w)m(ed)f(in)g(the)h(Readline)e(init)g(\014le.)50 b(Blank)33
+b(lines)f(are)150 5340 y(ignored.)71 b(Lines)40 b(b)s(eginning)e(with)i
+(a)h(`)p Fs(#)p Ft(')g(are)h(commen)m(ts.)73 b(Lines)40
+b(b)s(eginning)e(with)h(a)j(`)p Fs($)p Ft(')f(indicate)p
+eop
+%%Page: 87 93
+87 92 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(87)150 299 y(conditional)40 b(constructs)h
+(\(see)i(Section)e(8.3.2)i([Conditional)c(Init)h(Constructs],)k(page)f
+(91\).)74 b(Other)150 408 y(lines)29 b(denote)i(v)-5
+b(ariable)29 b(settings)h(and)g(k)m(ey)h(bindings.)150
+562 y(V)-8 b(ariable)30 b(Settings)630 671 y(Y)-8 b(ou)41
+b(can)g(mo)s(dify)d(the)j(run-time)e(b)s(eha)m(vior)g(of)i(Readline)e
+(b)m(y)h(altering)f(the)i(v)-5 b(alues)40 b(of)630 781
+y(v)-5 b(ariables)32 b(in)g(Readline)h(using)f(the)h
+Fs(set)g Ft(command)g(within)e(the)j(init)e(\014le.)49
+b(The)33 b(syn)m(tax)630 891 y(is)c(simple:)870 1022
+y Fs(set)47 b Fj(variable)56 b(value)630 1154 y Ft(Here,)29
+b(for)e(example,)g(is)g(ho)m(w)g(to)h(c)m(hange)g(from)f(the)g(default)
+g(Emacs-lik)m(e)g(k)m(ey)h(binding)c(to)630 1263 y(use)30
+b Fs(vi)g Ft(line)f(editing)g(commands:)870 1395 y Fs(set)47
+b(editing-mode)d(vi)630 1526 y Ft(V)-8 b(ariable)34 b(names)h(and)g(v)
+-5 b(alues,)35 b(where)g(appropriate,)g(are)h(recognized)f(without)f
+(regard)630 1636 y(to)d(case.)630 1767 y(The)37 b Fs(bind)30
+b(-V)37 b Ft(command)g(lists)g(the)h(curren)m(t)f(Readline)g(v)-5
+b(ariable)36 b(names)i(and)f(v)-5 b(alues.)630 1877 y(See)31
+b(Section)f(4.2)h([Bash)g(Builtins],)d(page)j(39.)630
+2008 y(A)f(great)i(deal)e(of)h(run-time)e(b)s(eha)m(vior)g(is)g(c)m
+(hangeable)j(with)d(the)h(follo)m(wing)f(v)-5 b(ariables.)630
+2162 y Fs(bell-style)1110 2271 y Ft(Con)m(trols)43 b(what)h(happ)s(ens)
+e(when)h(Readline)g(w)m(an)m(ts)h(to)h(ring)d(the)i(termi-)1110
+2381 y(nal)36 b(b)s(ell.)59 b(If)37 b(set)h(to)g(`)p
+Fs(none)p Ft(',)g(Readline)e(nev)m(er)i(rings)d(the)j(b)s(ell.)59
+b(If)36 b(set)i(to)1110 2491 y(`)p Fs(visible)p Ft(',)32
+b(Readline)g(uses)h(a)g(visible)d(b)s(ell)h(if)h(one)h(is)f(a)m(v)-5
+b(ailable.)48 b(If)33 b(set)g(to)1110 2600 y(`)p Fs(audible)p
+Ft(')j(\(the)i(default\),)h(Readline)d(attempts)i(to)h(ring)d(the)h
+(terminal's)1110 2710 y(b)s(ell.)630 2863 y Fs(comment-begin)1110
+2973 y Ft(The)29 b(string)f(to)i(insert)e(at)i(the)f(b)s(eginning)e(of)
+i(the)h(line)d(when)h(the)i Fs(insert-)1110 3082 y(comment)e
+Ft(command)j(is)e(executed.)42 b(The)29 b(default)h(v)-5
+b(alue)30 b(is)f Fs("#")p Ft(.)630 3236 y Fs(completion-ignore-case)
+1110 3345 y Ft(If)e(set)h(to)g(`)p Fs(on)p Ft(',)g(Readline)e(p)s
+(erforms)g(\014lename)g(matc)m(hing)i(and)f(completion)1110
+3455 y(in)i(a)i(case-insensitiv)m(e)f(fashion.)39 b(The)30
+b(default)g(v)-5 b(alue)29 b(is)h(`)p Fs(off)p Ft('.)630
+3608 y Fs(completion-query-items)1110 3718 y Ft(The)c(n)m(um)m(b)s(er)f
+(of)h(p)s(ossible)e(completions)h(that)i(determines)e(when)g(the)i
+(user)1110 3828 y(is)h(ask)m(ed)i(whether)f(the)h(list)e(of)h(p)s
+(ossibilities)c(should)i(b)s(e)i(displa)m(y)m(ed.)39
+b(If)29 b(the)1110 3937 y(n)m(um)m(b)s(er)d(of)h(p)s(ossible)d
+(completions)i(is)g(greater)i(than)e(this)g(v)-5 b(alue,)27
+b(Readline)1110 4047 y(will)d(ask)j(the)f(user)g(whether)g(or)g(not)h
+(he)f(wishes)f(to)j(view)d(them;)j(otherwise,)1110 4156
+y(they)d(are)f(simply)e(listed.)38 b(This)22 b(v)-5 b(ariable)23
+b(m)m(ust)i(b)s(e)e(set)i(to)g(an)g(in)m(teger)f(v)-5
+b(alue)1110 4266 y(greater)32 b(than)e(or)g(equal)g(to)h(0.)41
+b(The)30 b(default)g(limit)e(is)h Fs(100)p Ft(.)630 4419
+y Fs(convert-meta)1110 4529 y Ft(If)22 b(set)g(to)h(`)p
+Fs(on)p Ft(',)h(Readline)d(will)e(con)m(v)m(ert)24 b(c)m(haracters)f
+(with)e(the)h(eigh)m(th)g(bit)f(set)1110 4639 y(to)h(an)f
+Fl(asci)r(i)g Ft(k)m(ey)h(sequence)g(b)m(y)f(stripping)d(the)k(eigh)m
+(th)f(bit)f(and)h(pre\014xing)e(an)1110 4745 y Fg(h)p
+1134 4692 139 4 v 1134 4748 a Ff(ESC)p 1134 4764 V 1268
+4745 a Fg(i)1332 4748 y Ft(c)m(haracter,)36 b(con)m(v)m(erting)f(them)f
+(to)g(a)h(meta-pre\014xed)f(k)m(ey)g(sequence.)1110 4858
+y(The)c(default)f(v)-5 b(alue)30 b(is)g(`)p Fs(on)p Ft('.)630
+5011 y Fs(disable-completion)1110 5121 y Ft(If)36 b(set)h(to)h(`)p
+Fs(On)p Ft(',)g(Readline)d(will)f(inhibit)f(w)m(ord)k(completion.)58
+b(Completion)1110 5230 y(c)m(haracters)28 b(will)23 b(b)s(e)i(inserted)
+g(in)m(to)h(the)h(line)d(as)i(if)f(they)i(had)e(b)s(een)g(mapp)s(ed)
+1110 5340 y(to)31 b Fs(self-insert)p Ft(.)38 b(The)30
+b(default)f(is)h(`)p Fs(off)p Ft('.)p eop
+%%Page: 88 94
+88 93 bop 150 -116 a Ft(88)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y Fs(editing-mode)1110 408 y Ft(The)d Fs(editing-mode)e
+Ft(v)-5 b(ariable)27 b(con)m(trols)i(whic)m(h)e(default)h(set)i(of)e(k)
+m(ey)i(bind-)1110 518 y(ings)24 b(is)g(used.)38 b(By)26
+b(default,)f(Readline)f(starts)h(up)f(in)g(Emacs)h(editing)f(mo)s(de,)
+1110 628 y(where)29 b(the)g(k)m(eystrok)m(es)i(are)e(most)h(similar)c
+(to)k(Emacs.)40 b(This)28 b(v)-5 b(ariable)28 b(can)1110
+737 y(b)s(e)i(set)h(to)g(either)f(`)p Fs(emacs)p Ft(')f(or)h(`)p
+Fs(vi)p Ft('.)630 934 y Fs(enable-keypad)1110 1044 y
+Ft(When)23 b(set)h(to)g(`)p Fs(on)p Ft(',)h(Readline)d(will)f(try)i(to)
+h(enable)f(the)g(application)f(k)m(eypad)1110 1154 y(when)k(it)g(is)f
+(called.)39 b(Some)27 b(systems)f(need)h(this)e(to)i(enable)f(the)h
+(arro)m(w)g(k)m(eys.)1110 1263 y(The)j(default)f(is)h(`)p
+Fs(off)p Ft('.)630 1461 y Fs(expand-tilde)1110 1570 y
+Ft(If)d(set)h(to)h(`)p Fs(on)p Ft(',)f(tilde)e(expansion)h(is)f(p)s
+(erformed)g(when)h(Readline)f(attempts)1110 1680 y(w)m(ord)k
+(completion.)40 b(The)30 b(default)f(is)h(`)p Fs(off)p
+Ft('.)1110 1833 y(If)f(set)i(to)f(`)p Fs(on)p Ft(',)g(the)g(history)f
+(co)s(de)h(attempts)g(to)h(place)e(p)s(oin)m(t)g(at)i(the)f(same)1110
+1943 y(lo)s(cation)j(on)g(eac)m(h)i(history)d(line)g(retriev)m(ed)h
+(with)f Fs(previous-history)d Ft(or)1110 2052 y Fs(next-history)p
+Ft(.)630 2250 y Fs(horizontal-scroll-mode)1110 2359 y
+Ft(This)34 b(v)-5 b(ariable)35 b(can)h(b)s(e)f(set)h(to)h(either)e(`)p
+Fs(on)p Ft(')h(or)g(`)p Fs(off)p Ft('.)57 b(Setting)35
+b(it)g(to)i(`)p Fs(on)p Ft(')1110 2469 y(means)26 b(that)h(the)f(text)h
+(of)g(the)f(lines)e(b)s(eing)h(edited)h(will)d(scroll)i(horizon)m
+(tally)1110 2578 y(on)32 b(a)g(single)e(screen)i(line)e(when)g(they)i
+(are)g(longer)g(than)f(the)h(width)e(of)i(the)1110 2688
+y(screen,)27 b(instead)f(of)g(wrapping)e(on)m(to)j(a)f(new)g(screen)g
+(line.)37 b(By)27 b(default,)f(this)1110 2798 y(v)-5
+b(ariable)29 b(is)h(set)g(to)i(`)p Fs(off)p Ft('.)630
+2995 y Fs(input-meta)1110 3104 y Ft(If)f(set)g(to)h(`)p
+Fs(on)p Ft(',)g(Readline)e(will)e(enable)j(eigh)m(t-bit)g(input)e(\(it)
+i(will)d(not)k(clear)1110 3214 y(the)40 b(eigh)m(th)f(bit)g(in)f(the)i
+(c)m(haracters)h(it)e(reads\),)k(regardless)38 b(of)i(what)g(the)1110
+3324 y(terminal)e(claims)h(it)h(can)g(supp)s(ort.)68
+b(The)39 b(default)g(v)-5 b(alue)39 b(is)g(`)p Fs(off)p
+Ft('.)69 b(The)1110 3433 y(name)30 b Fs(meta-flag)e Ft(is)i(a)g(synon)m
+(ym)g(for)g(this)g(v)-5 b(ariable.)630 3630 y Fs(isearch-terminators)
+1110 3740 y Ft(The)51 b(string)g(of)h(c)m(haracters)h(that)f(should)d
+(terminate)j(an)g(incremen)m(tal)1110 3850 y(searc)m(h)25
+b(without)f(subsequen)m(tly)g(executing)h(the)g(c)m(haracter)h(as)f(a)g
+(command)1110 3959 y(\(see)42 b(Section)e(8.2.5)j([Searc)m(hing],)h
+(page)d(86\).)73 b(If)41 b(this)f(v)-5 b(ariable)39 b(has)i(not)1110
+4069 y(b)s(een)31 b(giv)m(en)g(a)h(v)-5 b(alue,)31 b(the)h(c)m
+(haracters)2494 4066 y Fg(h)p 2518 4013 139 4 v 2518
+4069 a Ff(ESC)p 2518 4084 V 2652 4066 a Fg(i)2713 4069
+y Ft(and)f Fj(C-J)g Ft(will)e(terminate)i(an)1110 4178
+y(incremen)m(tal)f(searc)m(h.)630 4376 y Fs(keymap)192
+b Ft(Sets)39 b(Readline's)e(idea)i(of)g(the)g(curren)m(t)f(k)m(eymap)h
+(for)g(k)m(ey)g(binding)d(com-)1110 4485 y(mands.)81
+b(Acceptable)46 b Fs(keymap)c Ft(names)i(are)h Fs(emacs)p
+Ft(,)i Fs(emacs-standard)p Ft(,)1110 4595 y Fs(emacs-meta)p
+Ft(,)99 b Fs(emacs-ctlx)p Ft(,)f Fs(vi)p Ft(,)j Fs(vi-move)p
+Ft(,)f Fs(vi-command)p Ft(,)f(and)1110 4704 y Fs(vi-insert)p
+Ft(.)64 b Fs(vi)38 b Ft(is)g(equiv)-5 b(alen)m(t)39 b(to)g
+Fs(vi-command)p Ft(;)i Fs(emacs)c Ft(is)h(equiv)-5 b(alen)m(t)1110
+4814 y(to)33 b Fs(emacs-standard)p Ft(.)41 b(The)31 b(default)g(v)-5
+b(alue)31 b(is)g Fs(emacs)p Ft(.)44 b(The)31 b(v)-5 b(alue)32
+b(of)g(the)1110 4924 y Fs(editing-mode)27 b Ft(v)-5 b(ariable)29
+b(also)i(a\013ects)g(the)g(default)e(k)m(eymap.)630 5121
+y Fs(mark-directories)1110 5230 y Ft(If)38 b(set)g(to)h(`)p
+Fs(on)p Ft(',)i(completed)d(directory)f(names)h(ha)m(v)m(e)i(a)e(slash)
+f(app)s(ended.)1110 5340 y(The)30 b(default)f(is)h(`)p
+Fs(on)p Ft('.)p eop
+%%Page: 89 95
+89 94 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(89)630 299 y Fs(mark-modified-lines)1110
+408 y Ft(This)34 b(v)-5 b(ariable,)36 b(when)f(set)h(to)h(`)p
+Fs(on)p Ft(',)g(causes)g(Readline)d(to)j(displa)m(y)d(an)h(as-)1110
+518 y(terisk)e(\(`)p Fs(*)p Ft('\))i(at)f(the)g(start)g(of)g(history)f
+(lines)f(whic)m(h)g(ha)m(v)m(e)j(b)s(een)e(mo)s(di\014ed.)1110
+628 y(This)c(v)-5 b(ariable)29 b(is)g(`)p Fs(off)p Ft(')h(b)m(y)g
+(default.)630 786 y Fs(mark-symlinked-directori)o(es)1110
+896 y Ft(If)44 b(set)h(to)h(`)p Fs(on)p Ft(',)i(completed)d(names)g
+(whic)m(h)e(are)i(sym)m(b)s(olic)e(links)g(to)i(di-)1110
+1005 y(rectories)i(ha)m(v)m(e)g(a)g(slash)e(app)s(ended)f(\(sub)5
+b(ject)47 b(to)g(the)f(v)-5 b(alue)46 b(of)g Fs(mark-)1110
+1115 y(directories)p Ft(\).)38 b(The)30 b(default)f(is)h(`)p
+Fs(off)p Ft('.)630 1273 y Fs(match-hidden-files)1110
+1383 y Ft(This)20 b(v)-5 b(ariable,)23 b(when)f(set)g(to)h(`)p
+Fs(on)p Ft(',)h(causes)f(Readline)e(to)i(matc)m(h)g(\014les)e(whose)
+1110 1492 y(names)44 b(b)s(egin)f(with)g(a)h(`)p Fs(.)p
+Ft(')g(\(hidden)e(\014les\))i(when)f(p)s(erforming)f(\014lename)1110
+1602 y(completion,)i(unless)c(the)h(leading)f(`)p Fs(.)p
+Ft(')i(is)f(supplied)d(b)m(y)j(the)h(user)f(in)f(the)1110
+1711 y(\014lename)30 b(to)h(b)s(e)e(completed.)41 b(This)29
+b(v)-5 b(ariable)29 b(is)g(`)p Fs(on)p Ft(')i(b)m(y)f(default.)630
+1870 y Fs(output-meta)1110 1979 y Ft(If)35 b(set)h(to)g(`)p
+Fs(on)p Ft(',)h(Readline)d(will)f(displa)m(y)g(c)m(haracters)k(with)d
+(the)i(eigh)m(th)f(bit)1110 2089 y(set)i(directly)e(rather)h(than)g(as)
+h(a)g(meta-pre\014xed)f(escap)s(e)h(sequence.)59 b(The)1110
+2198 y(default)30 b(is)f(`)p Fs(off)p Ft('.)630 2357
+y Fs(page-completions)1110 2466 y Ft(If)k(set)i(to)f(`)p
+Fs(on)p Ft(',)h(Readline)e(uses)g(an)h(in)m(ternal)f
+Fs(more)p Ft(-lik)m(e)f(pager)i(to)h(displa)m(y)1110
+2576 y(a)e(screenful)e(of)h(p)s(ossible)e(completions)i(at)h(a)g(time.)
+46 b(This)30 b(v)-5 b(ariable)32 b(is)f(`)p Fs(on)p Ft(')1110
+2685 y(b)m(y)f(default.)630 2844 y Fs(print-completions-horizo)o(ntal)o
+(ly)1110 2953 y Ft(If)23 b(set)i(to)g(`)p Fs(on)p Ft(',)g(Readline)e
+(will)e(displa)m(y)h(completions)h(with)g(matc)m(hes)i(sorted)1110
+3063 y(horizon)m(tally)42 b(in)g(alphab)s(etical)g(order,)47
+b(rather)c(than)g(do)m(wn)g(the)h(screen.)1110 3173 y(The)30
+b(default)f(is)h(`)p Fs(off)p Ft('.)630 3331 y Fs
+(show-all-if-ambiguous)1110 3440 y Ft(This)e(alters)i(the)g(default)f
+(b)s(eha)m(vior)g(of)h(the)h(completion)e(functions.)39
+b(If)29 b(set)1110 3550 y(to)f(`)p Fs(on)p Ft(',)g(w)m(ords)f(whic)m(h)
+f(ha)m(v)m(e)j(more)f(than)f(one)h(p)s(ossible)d(completion)h(cause)
+1110 3660 y(the)39 b(matc)m(hes)h(to)g(b)s(e)e(listed)f(immediately)h
+(instead)g(of)h(ringing)e(the)i(b)s(ell.)1110 3769 y(The)30
+b(default)f(v)-5 b(alue)30 b(is)g(`)p Fs(off)p Ft('.)630
+3927 y Fs(show-all-if-unmodified)1110 4037 y Ft(This)37
+b(alters)h(the)h(default)f(b)s(eha)m(vior)g(of)g(the)h(completion)f
+(functions)f(in)h(a)1110 4147 y(fashion)24 b(similar)f(to)j
+Fq(sho)m(w-all-if-am)m(biguous)p Ft(.)37 b(If)25 b(set)h(to)h(`)p
+Fs(on)p Ft(',)f(w)m(ords)f(whic)m(h)1110 4256 y(ha)m(v)m(e)32
+b(more)f(than)f(one)i(p)s(ossible)c(completion)i(without)g(an)m(y)h(p)s
+(ossible)d(par-)1110 4366 y(tial)41 b(completion)h(\(the)h(p)s(ossible)
+d(completions)h(don't)h(share)g(a)h(common)1110 4475
+y(pre\014x\))30 b(cause)g(the)h(matc)m(hes)g(to)g(b)s(e)f(listed)e
+(immediately)h(instead)g(of)i(ring-)1110 4585 y(ing)f(the)g(b)s(ell.)39
+b(The)30 b(default)f(v)-5 b(alue)30 b(is)f(`)p Fs(off)p
+Ft('.)630 4743 y Fs(visible-stats)1110 4853 y Ft(If)i(set)i(to)f(`)p
+Fs(on)p Ft(',)h(a)f(c)m(haracter)i(denoting)d(a)h(\014le's)f(t)m(yp)s
+(e)h(is)f(app)s(ended)f(to)j(the)1110 4963 y(\014lename)d(when)f
+(listing)f(p)s(ossible)g(completions.)40 b(The)30 b(default)f(is)h(`)p
+Fs(off)p Ft('.)150 5121 y(Key)g(Bindings)630 5230 y(The)41
+b(syn)m(tax)i(for)f(con)m(trolling)e(k)m(ey)j(bindings)c(in)i(the)h
+(init)e(\014le)h(is)g(simple.)73 b(First)42 b(y)m(ou)630
+5340 y(need)27 b(to)i(\014nd)d(the)i(name)f(of)h(the)g(command)f(that)i
+(y)m(ou)f(w)m(an)m(t)g(to)g(c)m(hange.)41 b(The)27 b(follo)m(wing)p
+eop
+%%Page: 90 96
+90 95 bop 150 -116 a Ft(90)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(sections)36 b(con)m(tain)g(tables)g(of)g(the)g(command)f(name,)j
+(the)e(default)f(k)m(eybinding,)g(if)g(an)m(y)-8 b(,)630
+408 y(and)30 b(a)h(short)f(description)e(of)j(what)f(the)g(command)h
+(do)s(es.)630 543 y(Once)36 b(y)m(ou)g(kno)m(w)g(the)g(name)g(of)g(the)
+g(command,)h(simply)d(place)i(on)f(a)i(line)d(in)h(the)h(init)630
+653 y(\014le)d(the)h(name)f(of)h(the)g(k)m(ey)g(y)m(ou)g(wish)e(to)i
+(bind)e(the)i(command)f(to,)i(a)f(colon,)h(and)e(then)630
+762 y(the)f(name)g(of)g(the)g(command.)46 b(The)31 b(name)h(of)g(the)g
+(k)m(ey)h(can)f(b)s(e)f(expressed)h(in)e(di\013eren)m(t)630
+872 y(w)m(a)m(ys,)h(dep)s(ending)d(on)j(what)f(y)m(ou)h(\014nd)d(most)j
+(comfortable.)630 1006 y(In)k(addition)f(to)j(command)f(names,)i
+(readline)c(allo)m(ws)h(k)m(eys)i(to)g(b)s(e)e(b)s(ound)f(to)j(a)f
+(string)630 1116 y(that)31 b(is)e(inserted)h(when)f(the)i(k)m(ey)g(is)e
+(pressed)h(\(a)h Fq(macro)5 b Ft(\).)630 1250 y(The)42
+b Fs(bind)30 b(-p)42 b Ft(command)h(displa)m(ys)e(Readline)g(function)h
+(names)h(and)f(bindings)e(in)i(a)630 1360 y(format)37
+b(that)h(can)f(put)f(directly)g(in)m(to)h(an)g(initialization)d
+(\014le.)59 b(See)38 b(Section)e(4.2)j([Bash)630 1469
+y(Builtins],)28 b(page)j(39.)630 1629 y Fq(k)m(eyname)5
+b Ft(:)42 b Fq(function-name)34 b Ft(or)d Fq(macro)1110
+1738 y(k)m(eyname)k Ft(is)28 b(the)g(name)h(of)g(a)g(k)m(ey)h(sp)s
+(elled)c(out)j(in)f(English.)37 b(F)-8 b(or)30 b(example:)1350
+1873 y Fs(Control-u:)45 b(universal-argument)1350 1983
+y(Meta-Rubout:)f(backward-kill-word)1350 2092 y(Control-o:)h(">)i
+(output")1110 2227 y Ft(In)38 b(the)h(ab)s(o)m(v)m(e)h(example,)g
+Fj(C-u)e Ft(is)g(b)s(ound)e(to)k(the)e(function)g Fs(universal-)1110
+2336 y(argument)p Ft(,)g Fj(M-DEL)e Ft(is)h(b)s(ound)f(to)i(the)g
+(function)f Fs(backward-kill-word)p Ft(,)1110 2446 y(and)h
+Fj(C-o)g Ft(is)g(b)s(ound)f(to)j(run)d(the)j(macro)f(expressed)g(on)f
+(the)i(righ)m(t)e(hand)1110 2555 y(side)29 b(\(that)j(is,)d(to)i
+(insert)f(the)g(text)i(`)p Fs(>)e(output)p Ft(')f(in)m(to)h(the)h
+(line\).)1110 2690 y(A)37 b(n)m(um)m(b)s(er)f(of)h(sym)m(b)s(olic)e(c)m
+(haracter)k(names)e(are)g(recognized)g(while)e(pro-)1110
+2800 y(cessing)23 b(this)g(k)m(ey)h(binding)d(syn)m(tax:)37
+b Fq(DEL)p Ft(,)24 b Fq(ESC)p Ft(,)f Fq(ESCAPE)p Ft(,)g
+Fq(LFD)p Ft(,)h Fq(NEW-)1110 2909 y(LINE)p Ft(,)30 b
+Fq(RET)p Ft(,)g Fq(RETURN)p Ft(,)h Fq(R)m(UBOUT)p Ft(,)g
+Fq(SP)-8 b(A)m(CE)p Ft(,)30 b Fq(SPC)p Ft(,)g(and)f Fq(T)-8
+b(AB)p Ft(.)630 3068 y Fs(")p Fq(k)m(eyseq)r Fs(")p Ft(:)41
+b Fq(function-name)35 b Ft(or)30 b Fq(macro)1110 3178
+y(k)m(eyseq)k Ft(di\013ers)c(from)g Fq(k)m(eyname)37
+b Ft(ab)s(o)m(v)m(e)32 b(in)e(that)i(strings)e(denoting)g(an)h(en-)1110
+3288 y(tire)i(k)m(ey)i(sequence)f(can)g(b)s(e)f(sp)s(eci\014ed,)g(b)m
+(y)g(placing)g(the)h(k)m(ey)g(sequence)g(in)1110 3397
+y(double)28 b(quotes.)41 b(Some)29 b Fl(gnu)h Ft(Emacs)f(st)m(yle)h(k)m
+(ey)g(escap)s(es)g(can)g(b)s(e)f(used,)g(as)1110 3507
+y(in)j(the)i(follo)m(wing)f(example,)h(but)f(the)h(sp)s(ecial)f(c)m
+(haracter)i(names)f(are)g(not)1110 3616 y(recognized.)1350
+3751 y Fs("\\C-u":)46 b(universal-argument)1350 3861
+y("\\C-x\\C-r":)f(re-read-init-file)1350 3970 y("\\e[11~":)g("Function)
+h(Key)g(1")1110 4105 y Ft(In)64 b(the)g(ab)s(o)m(v)m(e)i(example,)73
+b Fj(C-u)64 b Ft(is)f(again)i(b)s(ound)d(to)k(the)e(function)1110
+4214 y Fs(universal-argument)39 b Ft(\(just)k(as)h(it)f(w)m(as)h(in)f
+(the)g(\014rst)g(example\),)48 b(`)p Fj(C-x)1110 4324
+y(C-r)p Ft(')41 b(is)f(b)s(ound)f(to)j(the)f(function)f
+Fs(re-read-init-file)p Ft(,)f(and)i(`)3462 4321 y Fg(h)p
+3486 4268 139 4 v 3486 4324 a Ff(ESC)p 3486 4339 V 3620
+4321 a Fg(i)31 b(h)p 3705 4268 20 4 v 3705 4324 a Ff([)p
+3705 4340 V 3720 4321 a Fg(i)1110 4430 y(h)p 1134 4377
+36 4 v 1134 4433 a Ff(1)p 1134 4449 V 1165 4430 a Fg(i)f(h)p
+1250 4377 V 1250 4433 a Ff(1)p 1250 4449 V 1281 4430
+a Fg(i)g(h)p 1365 4377 48 4 v 1365 4433 a Fs(~)p 1365
+4449 V 1409 4430 a Fg(i)1438 4433 y Ft(')h(is)e(b)s(ound)g(to)i(insert)
+e(the)i(text)g(`)p Fs(Function)d(Key)i(1)p Ft('.)630
+4593 y(The)f(follo)m(wing)f Fl(gnu)i Ft(Emacs)g(st)m(yle)g(escap)s(e)g
+(sequences)g(are)g(a)m(v)-5 b(ailable)29 b(when)g(sp)s(ecifying)630
+4702 y(k)m(ey)i(sequences:)630 4862 y Fj(\\C-)336 b Ft(con)m(trol)31
+b(pre\014x)630 5021 y Fj(\\M-)336 b Ft(meta)31 b(pre\014x)630
+5181 y Fj(\\e)384 b Ft(an)30 b(escap)s(e)h(c)m(haracter)630
+5340 y Fj(\\\\)384 b Ft(bac)m(kslash)p eop
+%%Page: 91 97
+91 96 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(91)630 299 y Fj(\\)p Fs(")1110
+296 y Fg(h)p 1134 243 48 4 v 1134 299 a Fs(")p 1134 314
+V 1178 296 a Fg(i)1208 299 y Ft(,)30 b(a)h(double)e(quotation)h(mark)
+630 460 y Fj(\\')1110 457 y Fg(h)p 1134 403 20 4 v 1134
+460 a Ff(')p 1134 475 V 1150 457 a Fg(i)1179 460 y Ft(,)h(a)g(single)e
+(quote)i(or)f(ap)s(ostrophe)630 620 y(In)d(addition)f(to)i(the)g
+Fl(gnu)f Ft(Emacs)h(st)m(yle)g(escap)s(e)g(sequences,)h(a)f(second)f
+(set)h(of)g(bac)m(kslash)630 730 y(escap)s(es)j(is)e(a)m(v)-5
+b(ailable:)630 890 y Fs(\\a)384 b Ft(alert)30 b(\(b)s(ell\))630
+1051 y Fs(\\b)384 b Ft(bac)m(kspace)630 1212 y Fs(\\d)g
+Ft(delete)630 1372 y Fs(\\f)g Ft(form)30 b(feed)630 1533
+y Fs(\\n)384 b Ft(newline)630 1694 y Fs(\\r)g Ft(carriage)31
+b(return)630 1854 y Fs(\\t)384 b Ft(horizon)m(tal)30
+b(tab)630 2015 y Fs(\\v)384 b Ft(v)m(ertical)30 b(tab)630
+2176 y Fs(\\)p Fj(nnn)288 b Ft(the)35 b(eigh)m(t-bit)f(c)m(haracter)i
+(whose)e(v)-5 b(alue)34 b(is)g(the)g(o)s(ctal)h(v)-5
+b(alue)34 b Fq(nnn)f Ft(\(one)i(to)1110 2285 y(three)c(digits\))630
+2446 y Fs(\\x)p Fj(HH)288 b Ft(the)40 b(eigh)m(t-bit)f(c)m(haracter)i
+(whose)e(v)-5 b(alue)38 b(is)h(the)g(hexadecimal)g(v)-5
+b(alue)39 b Fq(HH)1110 2555 y Ft(\(one)31 b(or)f(t)m(w)m(o)i(hex)e
+(digits\))630 2716 y(When)37 b(en)m(tering)g(the)h(text)g(of)g(a)g
+(macro,)i(single)c(or)h(double)f(quotes)i(m)m(ust)f(b)s(e)g(used)f(to)
+630 2826 y(indicate)21 b(a)g(macro)h(de\014nition.)36
+b(Unquoted)21 b(text)i(is)d(assumed)h(to)h(b)s(e)f(a)h(function)e
+(name.)38 b(In)630 2935 y(the)22 b(macro)f(b)s(o)s(dy)-8
+b(,)23 b(the)e(bac)m(kslash)g(escap)s(es)h(describ)s(ed)d(ab)s(o)m(v)m
+(e)k(are)e(expanded.)37 b(Bac)m(kslash)630 3045 y(will)g(quote)k(an)m
+(y)f(other)g(c)m(haracter)i(in)c(the)j(macro)f(text,)k(including)36
+b(`)p Fs(")p Ft(')k(and)g(`)p Fs(')p Ft('.)69 b(F)-8
+b(or)630 3154 y(example,)27 b(the)f(follo)m(wing)e(binding)e(will)h
+(mak)m(e)k(`)p Fj(C-x)j Fs(\\)p Ft(')c(insert)e(a)i(single)f(`)p
+Fs(\\)p Ft(')h(in)m(to)f(the)h(line:)870 3290 y Fs("\\C-x\\\\":)45
+b("\\\\")150 3516 y Fk(8.3.2)63 b(Conditional)41 b(Init)g(Constructs)
+275 3762 y Ft(Readline)34 b(implemen)m(ts)f(a)j(facilit)m(y)f(similar)d
+(in)i(spirit)f(to)j(the)g(conditional)e(compilation)g(features)150
+3871 y(of)h(the)f(C)g(prepro)s(cessor)g(whic)m(h)f(allo)m(ws)h(k)m(ey)h
+(bindings)c(and)j(v)-5 b(ariable)33 b(settings)i(to)g(b)s(e)f(p)s
+(erformed)f(as)150 3981 y(the)e(result)e(of)h(tests.)42
+b(There)30 b(are)h(four)e(parser)h(directiv)m(es)g(used.)150
+4142 y Fs($if)336 b Ft(The)31 b Fs($if)f Ft(construct)i(allo)m(ws)f
+(bindings)d(to)k(b)s(e)e(made)i(based)f(on)g(the)g(editing)f(mo)s(de,)i
+(the)630 4252 y(terminal)37 b(b)s(eing)f(used,)k(or)e(the)g
+(application)e(using)h(Readline.)62 b(The)38 b(text)h(of)f(the)g(test)
+630 4361 y(extends)30 b(to)h(the)g(end)f(of)g(the)h(line;)e(no)h(c)m
+(haracters)i(are)f(required)d(to)j(isolate)g(it.)630
+4522 y Fs(mode)288 b Ft(The)20 b Fs(mode=)g Ft(form)g(of)h(the)g
+Fs($if)f Ft(directiv)m(e)h(is)f(used)g(to)h(test)h(whether)e(Readline)
+1110 4631 y(is)28 b(in)h Fs(emacs)f Ft(or)h Fs(vi)g Ft(mo)s(de.)40
+b(This)28 b(ma)m(y)i(b)s(e)e(used)h(in)f(conjunction)h(with)f(the)1110
+4741 y(`)p Fs(set)i(keymap)p Ft(')c(command,)i(for)f(instance,)h(to)g
+(set)g(bindings)d(in)h(the)i Fs(emacs-)1110 4851 y(standard)23
+b Ft(and)h Fs(emacs-ctlx)f Ft(k)m(eymaps)i(only)f(if)g(Readline)g(is)g
+(starting)h(out)1110 4960 y(in)k Fs(emacs)g Ft(mo)s(de.)630
+5121 y Fs(term)288 b Ft(The)26 b Fs(term=)g Ft(form)g(ma)m(y)i(b)s(e)e
+(used)g(to)i(include)d(terminal-sp)s(eci\014c)f(k)m(ey)k(bind-)1110
+5230 y(ings,)37 b(p)s(erhaps)d(to)j(bind)d(the)i(k)m(ey)h(sequences)f
+(output)g(b)m(y)g(the)g(terminal's)1110 5340 y(function)23
+b(k)m(eys.)39 b(The)23 b(w)m(ord)h(on)f(the)i(righ)m(t)e(side)g(of)h
+(the)g(`)p Fs(=)p Ft(')g(is)f(tested)i(against)p eop
+%%Page: 92 98
+92 97 bop 150 -116 a Ft(92)2572 b(Bash)31 b(Reference)g(Man)m(ual)1110
+299 y(b)s(oth)e(the)h(full)e(name)i(of)g(the)g(terminal)f(and)g(the)i
+(p)s(ortion)d(of)i(the)g(terminal)1110 408 y(name)k(b)s(efore)f(the)g
+(\014rst)g(`)p Fs(-)p Ft('.)50 b(This)32 b(allo)m(ws)h
+Fs(sun)g Ft(to)h(matc)m(h)g(b)s(oth)f Fs(sun)g Ft(and)1110
+518 y Fs(sun-cmd)p Ft(,)c(for)h(instance.)630 677 y Fs(application)1110
+787 y Ft(The)21 b Fq(application)g Ft(construct)h(is)f(used)g(to)i
+(include)d(application-sp)s(eci\014c)f(set-)1110 897
+y(tings.)38 b(Eac)m(h)26 b(program)e(using)f(the)i(Readline)e(library)g
+(sets)i(the)g Fq(application)1110 1006 y(name)p Ft(,)g(and)e(y)m(ou)g
+(can)h(test)g(for)f(a)g(particular)f(v)-5 b(alue.)38
+b(This)21 b(could)h(b)s(e)h(used)f(to)1110 1116 y(bind)31
+b(k)m(ey)i(sequences)g(to)h(functions)d(useful)g(for)i(a)g(sp)s
+(eci\014c)e(program.)48 b(F)-8 b(or)1110 1225 y(instance,)34
+b(the)f(follo)m(wing)e(command)i(adds)f(a)i(k)m(ey)f(sequence)h(that)f
+(quotes)1110 1335 y(the)e(curren)m(t)f(or)g(previous)f(w)m(ord)h(in)f
+(Bash:)1350 1469 y Fs($if)47 b(Bash)1350 1579 y(#)g(Quote)g(the)g
+(current)f(or)h(previous)e(word)1350 1689 y("\\C-xq":)h
+("\\eb\\"\\ef\\"")1350 1798 y($endif)150 1958 y($endif)192
+b Ft(This)28 b(command,)j(as)f(seen)h(in)e(the)h(previous)f(example,)h
+(terminates)g(an)h Fs($if)e Ft(command.)150 2117 y Fs($else)240
+b Ft(Commands)29 b(in)g(this)h(branc)m(h)f(of)i(the)f
+Fs($if)g Ft(directiv)m(e)g(are)h(executed)g(if)e(the)i(test)g(fails.)
+150 2276 y Fs($include)96 b Ft(This)42 b(directiv)m(e)h(tak)m(es)i(a)e
+(single)g(\014lename)f(as)i(an)f(argumen)m(t)h(and)f(reads)g(commands)
+630 2386 y(and)38 b(bindings)d(from)j(that)i(\014le.)64
+b(F)-8 b(or)39 b(example,)i(the)e(follo)m(wing)e(directiv)m(e)h(reads)g
+(from)630 2496 y(`)p Fs(/etc/inputrc)p Ft(':)870 2630
+y Fs($include)46 b(/etc/inputrc)150 2854 y Fk(8.3.3)63
+b(Sample)40 b(Init)h(File)275 3098 y Ft(Here)31 b(is)e(an)h(example)h
+(of)f(an)g Fq(inputrc)k Ft(\014le.)41 b(This)28 b(illustrates)h(k)m(ey)
+i(binding,)d(v)-5 b(ariable)29 b(assignmen)m(t,)150 3208
+y(and)h(conditional)e(syn)m(tax.)p eop
+%%Page: 93 99
+93 98 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(93)390 408 y Fs(#)47 b(This)g(file)g(controls)e
+(the)i(behaviour)e(of)j(line)e(input)h(editing)e(for)390
+518 y(#)i(programs)f(that)h(use)g(the)f(GNU)h(Readline)f(library.)93
+b(Existing)390 628 y(#)47 b(programs)f(include)g(FTP,)g(Bash,)h(and)g
+(GDB.)390 737 y(#)390 847 y(#)g(You)g(can)g(re-read)f(the)h(inputrc)f
+(file)g(with)h(C-x)g(C-r.)390 956 y(#)g(Lines)g(beginning)e(with)i('#')
+g(are)g(comments.)390 1066 y(#)390 1176 y(#)g(First,)g(include)e(any)i
+(systemwide)e(bindings)h(and)h(variable)390 1285 y(#)g(assignments)e
+(from)i(/etc/Inputrc)390 1395 y($include)f(/etc/Inputrc)390
+1614 y(#)390 1724 y(#)h(Set)g(various)f(bindings)g(for)h(emacs)f(mode.)
+390 1943 y(set)h(editing-mode)d(emacs)390 2162 y($if)j(mode=emacs)390
+2381 y(Meta-Control-h:)91 b(backward-kill-word)43 b(Text)k(after)f(the)
+h(function)f(name)g(is)h(ignored)390 2600 y(#)390 2710
+y(#)g(Arrow)g(keys)f(in)i(keypad)e(mode)390 2819 y(#)390
+2929 y(#"\\M-OD":)379 b(backward-char)390 3039 y(#"\\M-OC":)g
+(forward-char)390 3148 y(#"\\M-OA":)g(previous-history)390
+3258 y(#"\\M-OB":)g(next-history)390 3367 y(#)390 3477
+y(#)47 b(Arrow)g(keys)f(in)i(ANSI)e(mode)390 3587 y(#)390
+3696 y("\\M-[D":)380 b(backward-char)390 3806 y("\\M-[C":)g
+(forward-char)390 3915 y("\\M-[A":)g(previous-history)390
+4025 y("\\M-[B":)g(next-history)390 4134 y(#)390 4244
+y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(keypad)f(mode)390
+4354 y(#)390 4463 y(#"\\M-\\C-OD":)331 b(backward-char)390
+4573 y(#"\\M-\\C-OC":)g(forward-char)390 4682 y(#"\\M-\\C-OA":)g
+(previous-history)390 4792 y(#"\\M-\\C-OB":)g(next-history)390
+4902 y(#)390 5011 y(#)47 b(Arrow)g(keys)f(in)i(8)f(bit)g(ANSI)g(mode)
+390 5121 y(#)390 5230 y(#"\\M-\\C-[D":)331 b(backward-char)390
+5340 y(#"\\M-\\C-[C":)g(forward-char)p eop
+%%Page: 94 100
+94 99 bop 150 -116 a Ft(94)2572 b(Bash)31 b(Reference)g(Man)m(ual)390
+299 y Fs(#"\\M-\\C-[A":)331 b(previous-history)390 408
+y(#"\\M-\\C-[B":)g(next-history)390 628 y(C-q:)47 b(quoted-insert)390
+847 y($endif)390 1066 y(#)g(An)h(old-style)d(binding.)93
+b(This)47 b(happens)f(to)h(be)g(the)g(default.)390 1176
+y(TAB:)g(complete)390 1395 y(#)g(Macros)g(that)f(are)h(convenient)e
+(for)i(shell)f(interaction)390 1504 y($if)h(Bash)390
+1614 y(#)g(edit)g(the)g(path)390 1724 y("\\C-xp":)f
+("PATH=${PATH}\\e\\C-e\\C-a)o(\\ef)o(\\C-f)o(")390 1833
+y(#)h(prepare)f(to)h(type)g(a)h(quoted)e(word)g(--)390
+1943 y(#)h(insert)g(open)f(and)h(close)f(double)h(quotes)390
+2052 y(#)g(and)g(move)g(to)g(just)g(after)f(the)h(open)g(quote)390
+2162 y("\\C-x\\"":)e("\\"\\"\\C-b")390 2271 y(#)i(insert)g(a)g
+(backslash)e(\(testing)h(backslash)f(escapes)390 2381
+y(#)i(in)h(sequences)d(and)i(macros\))390 2491 y("\\C-x\\\\":)e("\\\\")
+390 2600 y(#)i(Quote)g(the)g(current)f(or)h(previous)e(word)390
+2710 y("\\C-xq":)h("\\eb\\"\\ef\\"")390 2819 y(#)h(Add)g(a)h(binding)e
+(to)h(refresh)f(the)h(line,)f(which)g(is)h(unbound)390
+2929 y("\\C-xr":)f(redraw-current-line)390 3039 y(#)h(Edit)g(variable)f
+(on)h(current)f(line.)390 3148 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-)o(a\\C-)o(y=")390 3258
+y($endif)390 3477 y(#)i(use)g(a)h(visible)e(bell)g(if)h(one)g(is)h
+(available)390 3587 y(set)f(bell-style)e(visible)390
+3806 y(#)i(don't)g(strip)f(characters)f(to)i(7)h(bits)e(when)h(reading)
+390 3915 y(set)g(input-meta)e(on)390 4134 y(#)i(allow)g(iso-latin1)e
+(characters)g(to)i(be)g(inserted)f(rather)390 4244 y(#)h(than)g
+(converted)e(to)j(prefix-meta)c(sequences)390 4354 y(set)j
+(convert-meta)d(off)390 4573 y(#)j(display)f(characters)f(with)i(the)g
+(eighth)f(bit)h(set)g(directly)390 4682 y(#)g(rather)g(than)f(as)h
+(meta-prefixed)e(characters)390 4792 y(set)i(output-meta)e(on)390
+5011 y(#)i(if)h(there)e(are)h(more)g(than)f(150)h(possible)f
+(completions)e(for)390 5121 y(#)j(a)h(word,)e(ask)h(the)g(user)g(if)g
+(he)g(wants)f(to)i(see)f(all)f(of)i(them)390 5230 y(set)f
+(completion-query-items)42 b(150)p eop
+%%Page: 95 101
+95 100 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(95)390 299 y Fs(#)47 b(For)g(FTP)390
+408 y($if)g(Ftp)390 518 y("\\C-xg":)f("get)g(\\M-?")390
+628 y("\\C-xt":)g("put)g(\\M-?")390 737 y("\\M-.":)g(yank-last-arg)390
+847 y($endif)150 1086 y Fr(8.4)68 b(Bindable)45 b(Readline)i(Commands)
+275 1323 y Ft(This)33 b(section)j(describ)s(es)e(Readline)g(commands)i
+(that)g(ma)m(y)g(b)s(e)f(b)s(ound)f(to)i(k)m(ey)h(sequences.)56
+b(Y)-8 b(ou)150 1433 y(can)29 b(list)e(y)m(our)i(k)m(ey)g(bindings)d(b)
+m(y)j(executing)f Fs(bind)i(-P)e Ft(or,)h(for)g(a)g(more)f(terse)i
+(format,)f(suitable)f(for)g(an)150 1543 y Fq(inputrc)33
+b Ft(\014le,)28 b Fs(bind)h(-p)p Ft(.)40 b(\(See)30 b(Section)e(4.2)i
+([Bash)g(Builtins],)d(page)j(39.\))41 b(Command)28 b(names)h(without)
+150 1652 y(an)h(accompan)m(ying)h(k)m(ey)g(sequence)g(are)g(un)m(b)s
+(ound)d(b)m(y)i(default.)275 1780 y(In)25 b(the)h(follo)m(wing)f
+(descriptions,)g Fq(p)s(oin)m(t)i Ft(refers)f(to)h(the)f(curren)m(t)g
+(cursor)g(p)s(osition,)f(and)h Fq(mark)31 b Ft(refers)150
+1890 y(to)40 b(a)f(cursor)f(p)s(osition)f(sa)m(v)m(ed)j(b)m(y)f(the)g
+Fs(set-mark)d Ft(command.)66 b(The)38 b(text)i(b)s(et)m(w)m(een)g(the)f
+(p)s(oin)m(t)f(and)150 2000 y(mark)30 b(is)g(referred)f(to)i(as)g(the)f
+Fq(region)p Ft(.)150 2205 y Fk(8.4.1)63 b(Commands)40
+b(F)-10 b(or)41 b(Mo)m(ving)150 2443 y Fs(beginning-of-line)26
+b(\(C-a\))630 2553 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(start)h(of)g(the)f
+(curren)m(t)g(line.)150 2700 y Fs(end-of-line)d(\(C-e\))630
+2809 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h(line.)150
+2956 y Fs(forward-char)c(\(C-f\))630 3066 y Ft(Mo)m(v)m(e)32
+b(forw)m(ard)e(a)h(c)m(haracter.)150 3213 y Fs(backward-char)c(\(C-b\))
+630 3322 y Ft(Mo)m(v)m(e)32 b(bac)m(k)g(a)e(c)m(haracter.)150
+3469 y Fs(forward-word)d(\(M-f\))630 3579 y Ft(Mo)m(v)m(e)32
+b(forw)m(ard)e(to)h(the)f(end)g(of)g(the)h(next)f(w)m(ord.)41
+b(W)-8 b(ords)30 b(are)h(comp)s(osed)f(of)g(letters)h(and)630
+3689 y(digits.)150 3835 y Fs(backward-word)c(\(M-b\))630
+3945 y Ft(Mo)m(v)m(e)36 b(bac)m(k)e(to)g(the)g(start)g(of)g(the)g
+(curren)m(t)f(or)g(previous)f(w)m(ord.)50 b(W)-8 b(ords)34
+b(are)g(comp)s(osed)630 4055 y(of)d(letters)f(and)g(digits.)150
+4202 y Fs(clear-screen)d(\(C-l\))630 4311 y Ft(Clear)f(the)h(screen)f
+(and)h(redra)m(w)f(the)h(curren)m(t)f(line,)g(lea)m(ving)g(the)h
+(curren)m(t)g(line)e(at)i(the)g(top)630 4421 y(of)k(the)f(screen.)150
+4568 y Fs(redraw-current-line)25 b(\(\))630 4677 y Ft(Refresh)30
+b(the)g(curren)m(t)h(line.)39 b(By)30 b(default,)g(this)f(is)h(un)m(b)s
+(ound.)150 4883 y Fk(8.4.2)63 b(Commands)40 b(F)-10 b(or)41
+b(Manipulating)h(The)f(History)150 5121 y Fs(accept-line)27
+b(\(Newline)h(or)i(Return\))630 5230 y Ft(Accept)25 b(the)e(line)f
+(regardless)h(of)g(where)g(the)h(cursor)e(is.)38 b(If)23
+b(this)f(line)g(is)g(non-empt)m(y)-8 b(,)26 b(add)c(it)630
+5340 y(to)27 b(the)f(history)f(list)g(according)h(to)h(the)f(setting)h
+(of)f(the)g Fs(HISTCONTROL)d Ft(and)j Fs(HISTIGNORE)p
+eop
+%%Page: 96 102
+96 101 bop 150 -116 a Ft(96)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(v)-5 b(ariables.)40 b(If)30 b(this)g(line)f(is)h(a)h(mo)s
+(di\014ed)d(history)i(line,)f(then)h(restore)i(the)f(history)e(line)g
+(to)630 408 y(its)h(original)e(state.)150 562 y Fs(previous-history)e
+(\(C-p\))630 672 y Ft(Mo)m(v)m(e)32 b(`bac)m(k')g(through)e(the)g
+(history)g(list,)f(fetc)m(hing)h(the)h(previous)e(command.)150
+826 y Fs(next-history)e(\(C-n\))630 935 y Ft(Mo)m(v)m(e)32
+b(`forw)m(ard')f(through)e(the)i(history)e(list,)h(fetc)m(hing)g(the)h
+(next)f(command.)150 1089 y Fs(beginning-of-history)25
+b(\(M-<\))630 1199 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(\014rst)g(line)e(in)
+i(the)g(history)-8 b(.)150 1352 y Fs(end-of-history)26
+b(\(M->\))630 1462 y Ft(Mo)m(v)m(e)32 b(to)g(the)e(end)g(of)g(the)h
+(input)d(history)-8 b(,)30 b(i.e.,)h(the)g(line)d(curren)m(tly)i(b)s
+(eing)f(en)m(tered.)150 1616 y Fs(reverse-search-history)24
+b(\(C-r\))630 1725 y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)f(at)h
+(the)f(curren)m(t)g(line)e(and)i(mo)m(ving)g(`up')f(through)h(the)g
+(his-)630 1835 y(tory)g(as)f(necessary)-8 b(.)42 b(This)28
+b(is)i(an)g(incremen)m(tal)g(searc)m(h.)150 1989 y Fs
+(forward-search-history)24 b(\(C-s\))630 2098 y Ft(Searc)m(h)30
+b(forw)m(ard)f(starting)g(at)h(the)g(curren)m(t)f(line)f(and)h(mo)m
+(ving)g(`do)m(wn')g(through)g(the)h(the)630 2208 y(history)f(as)i
+(necessary)-8 b(.)41 b(This)29 b(is)g(an)i(incremen)m(tal)e(searc)m(h.)
+150 2362 y Fs(non-incremental-reverse-)o(sear)o(ch-h)o(ist)o(ory)24
+b(\(M-p\))630 2471 y Ft(Searc)m(h)31 b(bac)m(kw)m(ard)h(starting)f(at)h
+(the)f(curren)m(t)g(line)e(and)i(mo)m(ving)g(`up')f(through)h(the)g
+(his-)630 2581 y(tory)36 b(as)g(necessary)h(using)d(a)j(non-incremen)m
+(tal)e(searc)m(h)h(for)g(a)g(string)f(supplied)e(b)m(y)j(the)630
+2690 y(user.)150 2844 y Fs(non-incremental-forward-)o(sear)o(ch-h)o
+(ist)o(ory)24 b(\(M-n\))630 2954 y Ft(Searc)m(h)30 b(forw)m(ard)f
+(starting)g(at)h(the)g(curren)m(t)f(line)f(and)h(mo)m(ving)g(`do)m(wn')
+g(through)g(the)h(the)630 3063 y(history)c(as)g(necessary)i(using)d(a)i
+(non-incremen)m(tal)e(searc)m(h)j(for)e(a)h(string)f(supplied)d(b)m(y)k
+(the)630 3173 y(user.)150 3327 y Fs(history-search-forward)d(\(\))630
+3436 y Ft(Searc)m(h)42 b(forw)m(ard)f(through)f(the)i(history)e(for)h
+(the)h(string)e(of)i(c)m(haracters)h(b)s(et)m(w)m(een)f(the)630
+3546 y(start)36 b(of)f(the)g(curren)m(t)g(line)e(and)i(the)g(p)s(oin)m
+(t.)54 b(This)33 b(is)i(a)g(non-incremen)m(tal)f(searc)m(h.)56
+b(By)630 3655 y(default,)30 b(this)f(command)h(is)g(un)m(b)s(ound.)150
+3809 y Fs(history-search-backward)24 b(\(\))630 3919
+y Ft(Searc)m(h)35 b(bac)m(kw)m(ard)g(through)f(the)h(history)f(for)h
+(the)f(string)g(of)h(c)m(haracters)h(b)s(et)m(w)m(een)g(the)630
+4028 y(start)g(of)f(the)g(curren)m(t)g(line)e(and)i(the)g(p)s(oin)m(t.)
+54 b(This)33 b(is)i(a)g(non-incremen)m(tal)f(searc)m(h.)56
+b(By)630 4138 y(default,)30 b(this)f(command)h(is)g(un)m(b)s(ound.)150
+4292 y Fs(yank-nth-arg)d(\(M-C-y\))630 4401 y Ft(Insert)e(the)i
+(\014rst)e(argumen)m(t)h(to)h(the)f(previous)f(command)g(\(usually)f
+(the)i(second)g(w)m(ord)g(on)630 4511 y(the)k(previous)f(line\))f(at)j
+(p)s(oin)m(t.)39 b(With)30 b(an)g(argumen)m(t)g Fq(n)p
+Ft(,)g(insert)e(the)j Fq(n)p Ft(th)e(w)m(ord)g(from)h(the)630
+4621 y(previous)25 b(command)i(\(the)h(w)m(ords)e(in)g(the)h(previous)e
+(command)i(b)s(egin)e(with)h(w)m(ord)h(0\).)40 b(A)630
+4730 y(negativ)m(e)27 b(argumen)m(t)f(inserts)e(the)i
+Fq(n)p Ft(th)f(w)m(ord)g(from)g(the)h(end)f(of)h(the)g(previous)e
+(command.)150 4884 y Fs(yank-last-arg)j(\(M-.)i(or)h(M-_\))630
+4994 y Ft(Insert)k(last)h(argumen)m(t)h(to)g(the)f(previous)e(command)i
+(\(the)h(last)e(w)m(ord)h(of)g(the)g(previous)630 5103
+y(history)30 b(en)m(try\).)41 b(With)30 b(an)h(argumen)m(t,)g(b)s(eha)m
+(v)m(e)g(exactly)h(lik)m(e)e Fs(yank-nth-arg)p Ft(.)38
+b(Succes-)630 5213 y(siv)m(e)c(calls)g(to)h Fs(yank-last-arg)c
+Ft(mo)m(v)m(e)36 b(bac)m(k)g(through)d(the)i(history)f(list,)g
+(inserting)f(the)630 5322 y(last)d(argumen)m(t)h(of)g(eac)m(h)g(line)e
+(in)g(turn.)p eop
+%%Page: 97 103
+97 102 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(97)150 299 y Fk(8.4.3)63 b(Commands)40
+b(F)-10 b(or)41 b(Changing)g(T)-10 b(ext)150 549 y Fs(delete-char)27
+b(\(C-d\))630 659 y Ft(Delete)40 b(the)f(c)m(haracter)i(at)e(p)s(oin)m
+(t.)65 b(If)39 b(p)s(oin)m(t)e(is)h(at)i(the)f(b)s(eginning)d(of)j(the)
+g(line,)h(there)630 769 y(are)d(no)g(c)m(haracters)i(in)c(the)j(line,)f
+(and)f(the)h(last)g(c)m(haracter)i(t)m(yp)s(ed)e(w)m(as)g(not)g(b)s
+(ound)e(to)630 878 y Fs(delete-char)p Ft(,)28 b(then)i(return)f
+Fl(eof)p Ft(.)150 1050 y Fs(backward-delete-char)c(\(Rubout\))630
+1160 y Ft(Delete)31 b(the)g(c)m(haracter)g(b)s(ehind)d(the)i(cursor.)40
+b(A)30 b(n)m(umeric)f(argumen)m(t)i(means)f(to)h(kill)d(the)630
+1270 y(c)m(haracters)k(instead)d(of)i(deleting)e(them.)150
+1442 y Fs(forward-backward-delete-)o(char)24 b(\(\))630
+1551 y Ft(Delete)39 b(the)g(c)m(haracter)h(under)c(the)j(cursor,)h
+(unless)c(the)j(cursor)e(is)g(at)i(the)g(end)e(of)i(the)630
+1661 y(line,)31 b(in)f(whic)m(h)g(case)j(the)f(c)m(haracter)h(b)s
+(ehind)c(the)j(cursor)f(is)f(deleted.)45 b(By)32 b(default,)f(this)630
+1771 y(is)e(not)i(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150
+1943 y Fs(quoted-insert)27 b(\(C-q)i(or)h(C-v\))630 2052
+y Ft(Add)j(the)i(next)f(c)m(haracter)i(t)m(yp)s(ed)e(to)h(the)f(line)f
+(v)m(erbatim.)52 b(This)32 b(is)i(ho)m(w)g(to)h(insert)e(k)m(ey)630
+2162 y(sequences)e(lik)m(e)e Fj(C-q)p Ft(,)h(for)g(example.)150
+2334 y Fs(self-insert)d(\(a,)j(b,)g(A,)f(1,)h(!,)g(...)o(\))630
+2444 y Ft(Insert)g(y)m(ourself.)150 2616 y Fs(transpose-chars)c
+(\(C-t\))630 2725 y Ft(Drag)33 b(the)f(c)m(haracter)h(b)s(efore)f(the)g
+(cursor)f(forw)m(ard)h(o)m(v)m(er)h(the)f(c)m(haracter)i(at)e(the)g
+(cursor,)630 2835 y(mo)m(ving)j(the)h(cursor)f(forw)m(ard)g(as)g(w)m
+(ell.)55 b(If)35 b(the)h(insertion)e(p)s(oin)m(t)g(is)g(at)j(the)e(end)
+g(of)h(the)630 2945 y(line,)22 b(then)g(this)f(transp)s(oses)g(the)h
+(last)g(t)m(w)m(o)h(c)m(haracters)g(of)f(the)h(line.)36
+b(Negativ)m(e)24 b(argumen)m(ts)630 3054 y(ha)m(v)m(e)32
+b(no)e(e\013ect.)150 3226 y Fs(transpose-words)c(\(M-t\))630
+3336 y Ft(Drag)33 b(the)g(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)f(past)h
+(the)h(w)m(ord)f(after)g(p)s(oin)m(t,)h(mo)m(ving)f(p)s(oin)m(t)f(past)
+h(that)630 3446 y(w)m(ord)c(as)h(w)m(ell.)39 b(If)27
+b(the)i(insertion)d(p)s(oin)m(t)i(is)f(at)i(the)g(end)e(of)i(the)f
+(line,)g(this)f(transp)s(oses)h(the)630 3555 y(last)i(t)m(w)m(o)i(w)m
+(ords)e(on)g(the)h(line.)150 3727 y Fs(upcase-word)c(\(M-u\))630
+3837 y Ft(Upp)s(ercase)32 b(the)g(curren)m(t)g(\(or)g(follo)m(wing\))f
+(w)m(ord.)45 b(With)31 b(a)h(negativ)m(e)i(argumen)m(t,)f(upp)s(er-)630
+3947 y(case)e(the)g(previous)e(w)m(ord,)h(but)g(do)g(not)h(mo)m(v)m(e)h
+(the)e(cursor.)150 4119 y Fs(downcase-word)d(\(M-l\))630
+4228 y Ft(Lo)m(w)m(ercase)c(the)f(curren)m(t)f(\(or)h(follo)m(wing\))f
+(w)m(ord.)37 b(With)21 b(a)h(negativ)m(e)h(argumen)m(t,)h(lo)m(w)m
+(ercase)630 4338 y(the)31 b(previous)d(w)m(ord,)j(but)e(do)i(not)f(mo)m
+(v)m(e)i(the)f(cursor.)150 4510 y Fs(capitalize-word)26
+b(\(M-c\))630 4620 y Ft(Capitalize)20 b(the)i(curren)m(t)f(\(or)g
+(follo)m(wing\))f(w)m(ord.)38 b(With)20 b(a)i(negativ)m(e)g(argumen)m
+(t,)i(capitalize)630 4729 y(the)31 b(previous)d(w)m(ord,)j(but)e(do)i
+(not)f(mo)m(v)m(e)i(the)f(cursor.)150 4902 y Fs(overwrite-mode)26
+b(\(\))630 5011 y Ft(T)-8 b(oggle)34 b(o)m(v)m(erwrite)g(mo)s(de.)48
+b(With)32 b(an)h(explicit)e(p)s(ositiv)m(e)h(n)m(umeric)g(argumen)m(t,)
+i(switc)m(hes)630 5121 y(to)22 b(o)m(v)m(erwrite)h(mo)s(de.)37
+b(With)21 b(an)h(explicit)e(non-p)s(ositiv)m(e)g(n)m(umeric)h(argumen)m
+(t,)j(switc)m(hes)d(to)630 5230 y(insert)29 b(mo)s(de.)41
+b(This)29 b(command)i(a\013ects)h(only)d Fs(emacs)g Ft(mo)s(de;)i
+Fs(vi)f Ft(mo)s(de)g(do)s(es)g(o)m(v)m(erwrite)630 5340
+y(di\013eren)m(tly)-8 b(.)40 b(Eac)m(h)31 b(call)f(to)h
+Fs(readline\(\))c Ft(starts)k(in)e(insert)g(mo)s(de.)p
+eop
+%%Page: 98 104
+98 103 bop 150 -116 a Ft(98)2572 b(Bash)31 b(Reference)g(Man)m(ual)630
+299 y(In)d(o)m(v)m(erwrite)i(mo)s(de,)f(c)m(haracters)i(b)s(ound)c(to)j
+Fs(self-insert)c Ft(replace)j(the)h(text)g(at)g(p)s(oin)m(t)630
+408 y(rather)41 b(than)h(pushing)d(the)j(text)g(to)g(the)g(righ)m(t.)74
+b(Characters)42 b(b)s(ound)d(to)j Fs(backward-)630 518
+y(delete-char)27 b Ft(replace)k(the)f(c)m(haracter)i(b)s(efore)e(p)s
+(oin)m(t)g(with)f(a)h(space.)630 647 y(By)h(default,)e(this)h(command)g
+(is)f(un)m(b)s(ound.)150 854 y Fk(8.4.4)63 b(Killing)42
+b(And)e(Y)-10 b(anking)150 1093 y Fs(kill-line)28 b(\(C-k\))630
+1202 y Ft(Kill)g(the)i(text)i(from)e(p)s(oin)m(t)f(to)i(the)g(end)e(of)
+i(the)f(line.)150 1350 y Fs(backward-kill-line)25 b(\(C-x)30
+b(Rubout\))630 1460 y Ft(Kill)e(bac)m(kw)m(ard)j(to)g(the)f(b)s
+(eginning)e(of)i(the)h(line.)150 1608 y Fs(unix-line-discard)26
+b(\(C-u\))630 1718 y Ft(Kill)i(bac)m(kw)m(ard)j(from)e(the)i(cursor)f
+(to)h(the)f(b)s(eginning)e(of)j(the)f(curren)m(t)g(line.)150
+1866 y Fs(kill-whole-line)c(\(\))630 1975 y Ft(Kill)34
+b(all)h(c)m(haracters)j(on)f(the)f(curren)m(t)h(line,)f(no)h(matter)g
+(where)f(p)s(oin)m(t)g(is.)58 b(By)36 b(default,)630
+2085 y(this)29 b(is)h(un)m(b)s(ound.)150 2233 y Fs(kill-word)e(\(M-d\))
+630 2343 y Ft(Kill)f(from)i(p)s(oin)m(t)f(to)i(the)g(end)e(of)i(the)f
+(curren)m(t)h(w)m(ord,)f(or)g(if)g(b)s(et)m(w)m(een)h(w)m(ords,)f(to)h
+(the)g(end)630 2452 y(of)h(the)f(next)h(w)m(ord.)40 b(W)-8
+b(ord)31 b(b)s(oundaries)d(are)i(the)h(same)g(as)f Fs(forward-word)p
+Ft(.)150 2600 y Fs(backward-kill-word)25 b(\(M-)1183
+2597 y Fg(h)p 1207 2544 146 4 v 1207 2600 a Ff(DEL)p
+1207 2616 V 1348 2597 a Fg(i)1378 2600 y Fs(\))630 2710
+y Ft(Kill)h(the)j(w)m(ord)g(b)s(ehind)d(p)s(oin)m(t.)39
+b(W)-8 b(ord)29 b(b)s(oundaries)e(are)i(the)g(same)g(as)g
+Fs(backward-word)p Ft(.)150 2858 y Fs(unix-word-rubout)d(\(C-w\))630
+2968 y Ft(Kill)j(the)j(w)m(ord)f(b)s(ehind)e(p)s(oin)m(t,)i(using)f
+(white)h(space)h(as)g(a)g(w)m(ord)f(b)s(oundary)-8 b(.)43
+b(The)31 b(killed)630 3077 y(text)g(is)f(sa)m(v)m(ed)h(on)g(the)f
+(kill-ring.)150 3225 y Fs(delete-horizontal-space)24
+b(\(\))630 3335 y Ft(Delete)32 b(all)d(spaces)i(and)e(tabs)i(around)e
+(p)s(oin)m(t.)40 b(By)31 b(default,)e(this)h(is)f(un)m(b)s(ound.)150
+3483 y Fs(kill-region)e(\(\))630 3593 y Ft(Kill)h(the)i(text)i(in)d
+(the)h(curren)m(t)h(region.)40 b(By)31 b(default,)e(this)h(command)g
+(is)f(un)m(b)s(ound.)150 3741 y Fs(copy-region-as-kill)c(\(\))630
+3851 y Ft(Cop)m(y)34 b(the)g(text)h(in)e(the)h(region)f(to)i(the)f
+(kill)e(bu\013er,)i(so)g(it)g(can)g(b)s(e)f(y)m(ank)m(ed)i(righ)m(t)e
+(a)m(w)m(a)m(y)-8 b(.)630 3960 y(By)31 b(default,)e(this)h(command)g
+(is)f(un)m(b)s(ound.)150 4108 y Fs(copy-backward-word)c(\(\))630
+4218 y Ft(Cop)m(y)38 b(the)h(w)m(ord)f(b)s(efore)g(p)s(oin)m(t)f(to)j
+(the)e(kill)e(bu\013er.)64 b(The)38 b(w)m(ord)g(b)s(oundaries)e(are)j
+(the)630 4327 y(same)31 b(as)f Fs(backward-word)p Ft(.)38
+b(By)30 b(default,)g(this)f(command)h(is)g(un)m(b)s(ound.)150
+4476 y Fs(copy-forward-word)c(\(\))630 4585 y Ft(Cop)m(y)31
+b(the)g(w)m(ord)g(follo)m(wing)e(p)s(oin)m(t)h(to)i(the)f(kill)e
+(bu\013er.)42 b(The)30 b(w)m(ord)h(b)s(oundaries)d(are)k(the)630
+4695 y(same)f(as)f Fs(forward-word)p Ft(.)38 b(By)30
+b(default,)g(this)g(command)g(is)f(un)m(b)s(ound.)150
+4843 y Fs(yank)g(\(C-y\))630 4952 y Ft(Y)-8 b(ank)31
+b(the)f(top)h(of)g(the)f(kill)e(ring)h(in)m(to)i(the)f(bu\013er)g(at)h
+(p)s(oin)m(t.)150 5101 y Fs(yank-pop)d(\(M-y\))630 5210
+y Ft(Rotate)36 b(the)f(kill-ring,)e(and)h(y)m(ank)h(the)f(new)g(top.)54
+b(Y)-8 b(ou)35 b(can)g(only)e(do)i(this)e(if)h(the)h(prior)630
+5320 y(command)30 b(is)g Fs(yank)f Ft(or)h Fs(yank-pop)p
+Ft(.)p eop
+%%Page: 99 105
+99 104 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2105 b(99)150 299 y Fk(8.4.5)63 b(Sp)s(ecifying)41
+b(Numeric)f(Argumen)m(ts)150 548 y Fs(digit-argument)26
+b(\()p Fj(M-0)p Fs(,)j Fj(M-1)p Fs(,)h(...)f Fj(M--)p
+Fs(\))630 658 y Ft(Add)d(this)g(digit)f(to)j(the)f(argumen)m(t)g
+(already)g(accum)m(ulating,)g(or)g(start)h(a)f(new)f(argumen)m(t.)630
+767 y Fj(M--)j Ft(starts)i(a)g(negativ)m(e)h(argumen)m(t.)150
+937 y Fs(universal-argument)25 b(\(\))630 1047 y Ft(This)f(is)g
+(another)i(w)m(a)m(y)g(to)h(sp)s(ecify)d(an)h(argumen)m(t.)40
+b(If)25 b(this)f(command)i(is)e(follo)m(w)m(ed)h(b)m(y)h(one)630
+1156 y(or)k(more)f(digits,)g(optionally)f(with)g(a)i(leading)f(min)m
+(us)f(sign,)h(those)h(digits)e(de\014ne)h(the)h(ar-)630
+1266 y(gumen)m(t.)41 b(If)28 b(the)i(command)f(is)f(follo)m(w)m(ed)g(b)
+m(y)h(digits,)g(executing)g Fs(universal-argument)630
+1376 y Ft(again)j(ends)f(the)h(n)m(umeric)e(argumen)m(t,)j(but)e(is)g
+(otherwise)g(ignored.)44 b(As)32 b(a)g(sp)s(ecial)f(case,)630
+1485 y(if)h(this)g(command)g(is)g(immediately)f(follo)m(w)m(ed)i(b)m(y)
+f(a)h(c)m(haracter)i(that)e(is)f(neither)g(a)h(digit)630
+1595 y(or)28 b(min)m(us)e(sign,)i(the)g(argumen)m(t)g(coun)m(t)h(for)e
+(the)i(next)f(command)f(is)g(m)m(ultiplied)e(b)m(y)i(four.)630
+1704 y(The)37 b(argumen)m(t)h(coun)m(t)f(is)g(initially)d(one,)39
+b(so)f(executing)f(this)f(function)g(the)i(\014rst)e(time)630
+1814 y(mak)m(es)d(the)e(argumen)m(t)i(coun)m(t)f(four,)f(a)i(second)e
+(time)h(mak)m(es)g(the)g(argumen)m(t)g(coun)m(t)h(six-)630
+1924 y(teen,)e(and)f(so)h(on.)40 b(By)31 b(default,)f(this)f(is)g(not)i
+(b)s(ound)d(to)j(a)g(k)m(ey)-8 b(.)150 2169 y Fk(8.4.6)63
+b(Letting)40 b(Readline)h(T)m(yp)s(e)g(F)-10 b(or)42
+b(Y)-10 b(ou)150 2418 y Fs(complete)28 b(\()610 2415
+y Fg(h)p 634 2362 148 4 v 634 2418 a Ff(T)-6 b(AB)p 634
+2434 V 778 2415 a Fg(i)808 2418 y Fs(\))630 2528 y Ft(A)m(ttempt)24
+b(to)f(p)s(erform)e(completion)h(on)h(the)g(text)g(b)s(efore)f(p)s(oin)
+m(t.)38 b(The)22 b(actual)h(completion)630 2637 y(p)s(erformed)33
+b(is)g(application-sp)s(eci\014c.)49 b(Bash)35 b(attempts)g(completion)
+e(treating)i(the)f(text)630 2747 y(as)39 b(a)h(v)-5 b(ariable)37
+b(\(if)i(the)g(text)h(b)s(egins)d(with)h(`)p Fs($)p Ft('\),)k(username)
+c(\(if)h(the)g(text)h(b)s(egins)d(with)630 2857 y(`)p
+Fs(~)p Ft('\),)31 b(hostname)f(\(if)f(the)h(text)h(b)s(egins)d(with)h
+(`)p Fs(@)p Ft('\),)i(or)f(command)f(\(including)e(aliases)j(and)630
+2966 y(functions\))k(in)f(turn.)53 b(If)34 b(none)g(of)h(these)h(pro)s
+(duces)d(a)i(matc)m(h,)i(\014lename)d(completion)g(is)630
+3076 y(attempted.)150 3246 y Fs(possible-completions)25
+b(\(M-?\))630 3355 y Ft(List)30 b(the)g(p)s(ossible)e(completions)i(of)
+g(the)h(text)g(b)s(efore)f(p)s(oin)m(t.)150 3525 y Fs
+(insert-completions)25 b(\(M-*\))630 3635 y Ft(Insert)30
+b(all)f(completions)h(of)h(the)g(text)g(b)s(efore)f(p)s(oin)m(t)g(that)
+h(w)m(ould)e(ha)m(v)m(e)j(b)s(een)e(generated)630 3744
+y(b)m(y)g Fs(possible-completions)p Ft(.)150 3914 y Fs(menu-complete)d
+(\(\))630 4024 y Ft(Similar)21 b(to)j Fs(complete)p Ft(,)f(but)h
+(replaces)f(the)h(w)m(ord)g(to)g(b)s(e)f(completed)h(with)e(a)j(single)
+d(matc)m(h)630 4133 y(from)37 b(the)h(list)f(of)h(p)s(ossible)d
+(completions.)62 b(Rep)s(eated)39 b(execution)f(of)g
+Fs(menu-complete)630 4243 y Ft(steps)i(through)g(the)g(list)f(of)h(p)s
+(ossible)e(completions,)k(inserting)c(eac)m(h)k(matc)m(h)f(in)e(turn.)
+630 4353 y(A)m(t)f(the)f(end)f(of)h(the)g(list)e(of)i(completions,)g
+(the)g(b)s(ell)e(is)h(rung)g(\(sub)5 b(ject)36 b(to)i(the)f(setting)630
+4462 y(of)f Fs(bell-style)p Ft(\))e(and)h(the)h(original)f(text)i(is)e
+(restored.)57 b(An)36 b(argumen)m(t)h(of)f Fq(n)f Ft(mo)m(v)m(es)i
+Fq(n)630 4572 y Ft(p)s(ositions)c(forw)m(ard)h(in)f(the)i(list)f(of)g
+(matc)m(hes;)39 b(a)c(negativ)m(e)h(argumen)m(t)f(ma)m(y)g(b)s(e)f
+(used)g(to)630 4681 y(mo)m(v)m(e)40 b(bac)m(kw)m(ard)e(through)g(the)g
+(list.)63 b(This)37 b(command)h(is)f(in)m(tended)g(to)i(b)s(e)f(b)s
+(ound)e(to)630 4788 y Fg(h)p 654 4735 V 654 4791 a Ff(T)-6
+b(AB)p 654 4806 V 798 4788 a Fg(i)828 4791 y Ft(,)30
+b(but)g(is)f(un)m(b)s(ound)f(b)m(y)i(default.)150 4961
+y Fs(delete-char-or-list)25 b(\(\))630 5070 y Ft(Deletes)j(the)f(c)m
+(haracter)h(under)e(the)h(cursor)f(if)g(not)h(at)g(the)g(b)s(eginning)e
+(or)h(end)h(of)g(the)g(line)630 5180 y(\(lik)m(e)i Fs(delete-char)p
+Ft(\).)37 b(If)29 b(at)h(the)f(end)f(of)i(the)f(line,)f(b)s(eha)m(v)m
+(es)i(iden)m(tically)d(to)i Fs(possible-)630 5290 y(completions)p
+Ft(.)38 b(This)28 b(command)i(is)g(un)m(b)s(ound)e(b)m(y)i(default.)p
+eop
+%%Page: 100 106
+100 105 bop 150 -116 a Ft(100)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+150 299 y Fs(complete-filename)26 b(\(M-/\))630 408 y
+Ft(A)m(ttempt)32 b(\014lename)d(completion)h(on)g(the)h(text)g(b)s
+(efore)f(p)s(oin)m(t.)150 577 y Fs(possible-filename-comple)o(tion)o(s)
+24 b(\(C-x)30 b(/\))630 687 y Ft(List)e(the)h(p)s(ossible)d
+(completions)h(of)i(the)g(text)g(b)s(efore)g(p)s(oin)m(t,)f(treating)h
+(it)f(as)h(a)f(\014lename.)150 856 y Fs(complete-username)e(\(M-~\))630
+966 y Ft(A)m(ttempt)32 b(completion)d(on)i(the)f(text)i(b)s(efore)e(p)s
+(oin)m(t,)f(treating)i(it)f(as)g(a)h(username.)150 1135
+y Fs(possible-username-comple)o(tion)o(s)24 b(\(C-x)30
+b(~\))630 1244 y Ft(List)24 b(the)h(p)s(ossible)e(completions)h(of)h
+(the)g(text)h(b)s(efore)f(p)s(oin)m(t,)g(treating)g(it)g(as)g(a)g
+(username.)150 1413 y Fs(complete-variable)h(\(M-$\))630
+1523 y Ft(A)m(ttempt)32 b(completion)d(on)i(the)f(text)i(b)s(efore)e(p)
+s(oin)m(t,)f(treating)i(it)f(as)g(a)h(shell)e(v)-5 b(ariable.)150
+1692 y Fs(possible-variable-comple)o(tion)o(s)24 b(\(C-x)30
+b($\))630 1802 y Ft(List)41 b(the)h(p)s(ossible)e(completions)h(of)h
+(the)g(text)h(b)s(efore)e(p)s(oin)m(t,)k(treating)d(it)f(as)h(a)h
+(shell)630 1911 y(v)-5 b(ariable.)150 2080 y Fs(complete-hostname)26
+b(\(M-@\))630 2190 y Ft(A)m(ttempt)32 b(completion)d(on)i(the)f(text)i
+(b)s(efore)e(p)s(oin)m(t,)f(treating)i(it)f(as)g(a)h(hostname.)150
+2359 y Fs(possible-hostname-comple)o(tion)o(s)24 b(\(C-x)30
+b(@\))630 2468 y Ft(List)24 b(the)h(p)s(ossible)d(completions)h(of)i
+(the)g(text)g(b)s(efore)g(p)s(oin)m(t,)g(treating)g(it)f(as)g(a)h
+(hostname.)150 2637 y Fs(complete-command)h(\(M-!\))630
+2747 y Ft(A)m(ttempt)32 b(completion)e(on)h(the)g(text)h(b)s(efore)e(p)
+s(oin)m(t,)g(treating)h(it)g(as)g(a)g(command)g(name.)630
+2857 y(Command)46 b(completion)g(attempts)i(to)f(matc)m(h)h(the)f(text)
+h(against)f(aliases,)k(reserv)m(ed)630 2966 y(w)m(ords,)36
+b(shell)e(functions,)i(shell)d(builtins,)h(and)h(\014nally)e
+(executable)j(\014lenames,)g(in)e(that)630 3076 y(order.)150
+3245 y Fs(possible-command-complet)o(ions)24 b(\(C-x)29
+b(!\))630 3354 y Ft(List)c(the)i(p)s(ossible)d(completions)h(of)h(the)h
+(text)g(b)s(efore)f(p)s(oin)m(t,)g(treating)g(it)g(as)h(a)f(command)630
+3464 y(name.)150 3633 y Fs(dynamic-complete-history)e(\(M-)1470
+3630 y Fg(h)p 1493 3577 148 4 v 1493 3633 a Ff(T)-6 b(AB)p
+1493 3648 V 1637 3630 a Fg(i)1667 3633 y Fs(\))630 3743
+y Ft(A)m(ttempt)31 b(completion)f(on)g(the)g(text)h(b)s(efore)f(p)s
+(oin)m(t,)f(comparing)h(the)g(text)h(against)g(lines)630
+3852 y(from)f(the)g(history)g(list)f(for)h(p)s(ossible)e(completion)i
+(matc)m(hes.)150 4021 y Fs(complete-into-braces)25 b(\(M-{\))630
+4131 y Ft(P)m(erform)f(\014lename)e(completion)h(and)h(insert)e(the)i
+(list)e(of)i(p)s(ossible)d(completions)i(enclosed)630
+4240 y(within)32 b(braces)j(so)f(the)h(list)e(is)h(a)m(v)-5
+b(ailable)34 b(to)h(the)g(shell)e(\(see)i(Section)g(3.5.1)h([Brace)g
+(Ex-)630 4350 y(pansion],)29 b(page)i(17\).)150 4593
+y Fk(8.4.7)63 b(Keyb)s(oard)41 b(Macros)150 4842 y Fs(start-kbd-macro)
+26 b(\(C-x)j(\(\))630 4952 y Ft(Begin)h(sa)m(ving)h(the)f(c)m
+(haracters)i(t)m(yp)s(ed)e(in)m(to)g(the)h(curren)m(t)f(k)m(eyb)s(oard)
+g(macro.)150 5121 y Fs(end-kbd-macro)d(\(C-x)i(\)\))630
+5230 y Ft(Stop)e(sa)m(ving)g(the)h(c)m(haracters)g(t)m(yp)s(ed)f(in)m
+(to)h(the)f(curren)m(t)g(k)m(eyb)s(oard)g(macro)h(and)f(sa)m(v)m(e)i
+(the)630 5340 y(de\014nition.)p eop
+%%Page: 101 107
+101 106 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2060 b(101)150 299 y Fs(call-last-kbd-macro)25
+b(\(C-x)k(e\))630 408 y Ft(Re-execute)37 b(the)e(last)g(k)m(eyb)s(oard)
+g(macro)h(de\014ned,)f(b)m(y)h(making)e(the)h(c)m(haracters)i(in)d(the)
+630 518 y(macro)d(app)s(ear)f(as)g(if)g(t)m(yp)s(ed)g(at)h(the)f(k)m
+(eyb)s(oard.)150 739 y Fk(8.4.8)63 b(Some)40 b(Miscellaneous)j
+(Commands)150 982 y Fs(re-read-init-file)26 b(\(C-x)j(C-r\))630
+1091 y Ft(Read)22 b(in)f(the)h(con)m(ten)m(ts)h(of)f(the)g
+Fq(inputrc)k Ft(\014le,)d(and)e(incorp)s(orate)g(an)m(y)i(bindings)18
+b(or)k(v)-5 b(ariable)630 1201 y(assignmen)m(ts)30 b(found)f(there.)150
+1358 y Fs(abort)g(\(C-g\))630 1468 y Ft(Ab)s(ort)d(the)h(curren)m(t)f
+(editing)f(command)h(and)g(ring)g(the)g(terminal's)f(b)s(ell)g(\(sub)5
+b(ject)26 b(to)i(the)630 1577 y(setting)i(of)h Fs(bell-style)p
+Ft(\).)150 1734 y Fs(do-uppercase-version)25 b(\(M-a,)k(M-b,)g(M-)p
+Fj(x)p Fs(,)g(...)o(\))630 1844 y Ft(If)e(the)h(meta\014ed)g(c)m
+(haracter)h Fq(x)34 b Ft(is)27 b(lo)m(w)m(ercase,)i(run)e(the)g
+(command)h(that)g(is)f(b)s(ound)e(to)k(the)630 1953 y(corresp)s(onding)
+f(upp)s(ercase)i(c)m(haracter.)150 2111 y Fs(prefix-meta)d(\()753
+2108 y Fg(h)p 777 2055 139 4 v 777 2111 a Ff(ESC)p 777
+2126 V 911 2108 a Fg(i)941 2111 y Fs(\))630 2220 y Ft(Metafy)39
+b(the)e(next)h(c)m(haracter)h(t)m(yp)s(ed.)62 b(This)36
+b(is)g(for)i(k)m(eyb)s(oards)f(without)f(a)i(meta)g(k)m(ey)-8
+b(.)630 2330 y(T)m(yping)29 b(`)968 2327 y Fg(h)p 993
+2274 V 993 2330 a Ff(ESC)p 993 2345 V 1127 2327 a Fg(i)1187
+2330 y Fs(f)p Ft(')h(is)f(equiv)-5 b(alen)m(t)30 b(to)h(t)m(yping)f
+Fj(M-f)p Ft(.)150 2487 y Fs(undo)f(\(C-_)g(or)h(C-x)g(C-u\))630
+2596 y Ft(Incremen)m(tal)g(undo,)g(separately)g(remem)m(b)s(ered)g(for)
+g(eac)m(h)i(line.)150 2754 y Fs(revert-line)27 b(\(M-r\))630
+2863 y Ft(Undo)33 b(all)f(c)m(hanges)i(made)f(to)h(this)e(line.)47
+b(This)31 b(is)h(lik)m(e)h(executing)g(the)g Fs(undo)f
+Ft(command)630 2973 y(enough)e(times)g(to)h(get)h(bac)m(k)f(to)g(the)f
+(b)s(eginning.)150 3130 y Fs(tilde-expand)d(\(M-&\))630
+3239 y Ft(P)m(erform)j(tilde)f(expansion)h(on)g(the)g(curren)m(t)h(w)m
+(ord.)150 3396 y Fs(set-mark)d(\(C-@\))630 3506 y Ft(Set)33
+b(the)g(mark)f(to)i(the)f(p)s(oin)m(t.)47 b(If)32 b(a)h(n)m(umeric)f
+(argumen)m(t)h(is)f(supplied,)e(the)j(mark)g(is)e(set)630
+3616 y(to)g(that)g(p)s(osition.)150 3773 y Fs(exchange-point-and-mark)
+24 b(\(C-x)29 b(C-x\))630 3882 y Ft(Sw)m(ap)i(the)g(p)s(oin)m(t)f(with)
+g(the)h(mark.)43 b(The)31 b(curren)m(t)g(cursor)f(p)s(osition)g(is)g
+(set)i(to)f(the)h(sa)m(v)m(ed)630 3992 y(p)s(osition,)d(and)g(the)i
+(old)f(cursor)f(p)s(osition)g(is)g(sa)m(v)m(ed)j(as)e(the)h(mark.)150
+4149 y Fs(character-search)26 b(\(C-]\))630 4259 y Ft(A)f(c)m(haracter)
+h(is)e(read)h(and)f(p)s(oin)m(t)g(is)g(mo)m(v)m(ed)i(to)g(the)f(next)g
+(o)s(ccurrence)g(of)g(that)g(c)m(haracter.)630 4368 y(A)30
+b(negativ)m(e)i(coun)m(t)f(searc)m(hes)g(for)f(previous)f(o)s
+(ccurrences.)150 4525 y Fs(character-search-backwar)o(d)24
+b(\(M-C-]\))630 4635 y Ft(A)45 b(c)m(haracter)h(is)e(read)h(and)f(p)s
+(oin)m(t)g(is)g(mo)m(v)m(ed)i(to)f(the)g(previous)e(o)s(ccurrence)i(of)
+g(that)630 4745 y(c)m(haracter.)d(A)31 b(negativ)m(e)g(coun)m(t)g
+(searc)m(hes)h(for)e(subsequen)m(t)f(o)s(ccurrences.)150
+4902 y Fs(insert-comment)d(\(M-#\))630 5011 y Ft(Without)35
+b(a)h(n)m(umeric)f(argumen)m(t,)i(the)f(v)-5 b(alue)35
+b(of)h(the)g Fs(comment-begin)c Ft(v)-5 b(ariable)34
+b(is)h(in-)630 5121 y(serted)d(at)g(the)g(b)s(eginning)d(of)j(the)f
+(curren)m(t)h(line.)43 b(If)31 b(a)h(n)m(umeric)e(argumen)m(t)i(is)f
+(supplied,)630 5230 y(this)k(command)i(acts)g(as)g(a)g(toggle:)54
+b(if)36 b(the)g(c)m(haracters)i(at)g(the)e(b)s(eginning)e(of)j(the)g
+(line)630 5340 y(do)30 b(not)h(matc)m(h)h(the)f(v)-5
+b(alue)30 b(of)g Fs(comment-begin)p Ft(,)e(the)i(v)-5
+b(alue)30 b(is)g(inserted,)g(otherwise)g(the)p eop
+%%Page: 102 108
+102 107 bop 150 -116 a Ft(102)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+630 299 y(c)m(haracters)42 b(in)c Fs(comment-begin)f
+Ft(are)j(deleted)g(from)g(the)g(b)s(eginning)e(of)i(the)g(line.)69
+b(In)630 408 y(either)36 b(case,)k(the)e(line)d(is)h(accepted)j(as)e
+(if)f(a)h(newline)e(had)i(b)s(een)f(t)m(yp)s(ed.)60 b(The)37
+b(default)630 518 y(v)-5 b(alue)31 b(of)h Fs(comment-begin)c
+Ft(causes)k(this)e(command)i(to)g(mak)m(e)h(the)e(curren)m(t)h(line)e
+(a)i(shell)630 628 y(commen)m(t.)40 b(If)26 b(a)h(n)m(umeric)e(argumen)
+m(t)i(causes)g(the)f(commen)m(t)i(c)m(haracter)g(to)f(b)s(e)f(remo)m(v)
+m(ed,)630 737 y(the)31 b(line)d(will)g(b)s(e)i(executed)h(b)m(y)f(the)h
+(shell.)150 887 y Fs(dump-functions)26 b(\(\))630 996
+y Ft(Prin)m(t)f(all)h(of)g(the)h(functions)e(and)h(their)f(k)m(ey)i
+(bindings)c(to)28 b(the)e(Readline)f(output)h(stream.)630
+1106 y(If)31 b(a)h(n)m(umeric)f(argumen)m(t)h(is)f(supplied,)e(the)j
+(output)f(is)g(formatted)h(in)e(suc)m(h)i(a)g(w)m(a)m(y)g(that)630
+1215 y(it)e(can)h(b)s(e)e(made)i(part)f(of)g(an)h Fq(inputrc)j
+Ft(\014le.)40 b(This)28 b(command)i(is)g(un)m(b)s(ound)d(b)m(y)k
+(default.)150 1365 y Fs(dump-variables)26 b(\(\))630
+1474 y Ft(Prin)m(t)20 b(all)g(of)i(the)f(settable)h(v)-5
+b(ariables)20 b(and)h(their)f(v)-5 b(alues)21 b(to)h(the)f(Readline)f
+(output)h(stream.)630 1584 y(If)31 b(a)h(n)m(umeric)f(argumen)m(t)h(is)
+f(supplied,)e(the)j(output)f(is)g(formatted)h(in)e(suc)m(h)i(a)g(w)m(a)
+m(y)g(that)630 1694 y(it)e(can)h(b)s(e)e(made)i(part)f(of)g(an)h
+Fq(inputrc)j Ft(\014le.)40 b(This)28 b(command)i(is)g(un)m(b)s(ound)d
+(b)m(y)k(default.)150 1843 y Fs(dump-macros)c(\(\))630
+1953 y Ft(Prin)m(t)33 b(all)f(of)i(the)g(Readline)e(k)m(ey)j(sequences)
+f(b)s(ound)e(to)i(macros)g(and)f(the)h(strings)f(they)630
+2062 y(output.)53 b(If)35 b(a)g(n)m(umeric)e(argumen)m(t)j(is)d
+(supplied,)g(the)i(output)g(is)e(formatted)j(in)d(suc)m(h)i(a)630
+2172 y(w)m(a)m(y)c(that)g(it)e(can)h(b)s(e)g(made)g(part)f(of)i(an)e
+Fq(inputrc)34 b Ft(\014le.)40 b(This)28 b(command)i(is)f(un)m(b)s(ound)
+e(b)m(y)630 2281 y(default.)150 2431 y Fs(glob-complete-word)e(\(M-g\))
+630 2540 y Ft(The)i(w)m(ord)h(b)s(efore)f(p)s(oin)m(t)g(is)g(treated)i
+(as)f(a)h(pattern)f(for)f(pathname)h(expansion,)f(with)g(an)630
+2650 y(asterisk)d(implicitly)d(app)s(ended.)37 b(This)22
+b(pattern)j(is)e(used)h(to)h(generate)h(a)e(list)f(of)i(matc)m(hing)630
+2760 y(\014le)k(names)i(for)f(p)s(ossible)e(completions.)150
+2909 y Fs(glob-expand-word)e(\(C-x)j(*\))630 3019 y Ft(The)40
+b(w)m(ord)g(b)s(efore)g(p)s(oin)m(t)g(is)g(treated)h(as)g(a)g(pattern)g
+(for)f(pathname)g(expansion,)j(and)630 3128 y(the)d(list)e(of)h(matc)m
+(hing)h(\014le)e(names)h(is)g(inserted,)h(replacing)f(the)g(w)m(ord.)67
+b(If)39 b(a)h(n)m(umeric)630 3238 y(argumen)m(t)31 b(is)e(supplied,)f
+(a)i(`)p Fs(*)p Ft(')h(is)e(app)s(ended)g(b)s(efore)h(pathname)g
+(expansion.)150 3387 y Fs(glob-list-expansions)25 b(\(C-x)k(g\))630
+3497 y Ft(The)k(list)f(of)h(expansions)f(that)i(w)m(ould)e(ha)m(v)m(e)i
+(b)s(een)f(generated)h(b)m(y)f Fs(glob-expand-word)630
+3606 y Ft(is)g(displa)m(y)m(ed,)g(and)g(the)h(line)e(is)g(redra)m(wn.)
+50 b(If)33 b(a)h(n)m(umeric)f(argumen)m(t)h(is)e(supplied,)g(a)i(`)p
+Fs(*)p Ft(')630 3716 y(is)29 b(app)s(ended)g(b)s(efore)h(pathname)g
+(expansion.)150 3866 y Fs(display-shell-version)25 b(\(C-x)k(C-v\))630
+3975 y Ft(Displa)m(y)h(v)m(ersion)f(information)g(ab)s(out)h(the)h
+(curren)m(t)f(instance)g(of)g(Bash.)150 4125 y Fs(shell-expand-line)c
+(\(M-C-e\))630 4234 y Ft(Expand)34 b(the)h(line)f(as)i(the)f(shell)f
+(do)s(es.)55 b(This)33 b(p)s(erforms)h(alias)g(and)h(history)f
+(expansion)630 4344 y(as)g(w)m(ell)e(as)i(all)f(of)g(the)h(shell)e(w)m
+(ord)h(expansions)f(\(see)j(Section)e(3.5)i([Shell)c(Expansions],)630
+4453 y(page)g(16\).)150 4603 y Fs(history-expand-line)25
+b(\(M-^\))630 4712 y Ft(P)m(erform)30 b(history)g(expansion)f(on)h(the)
+h(curren)m(t)f(line.)150 4862 y Fs(magic-space)d(\(\))630
+4971 y Ft(P)m(erform)c(history)f(expansion)g(on)h(the)g(curren)m(t)g
+(line)e(and)i(insert)f(a)h(space)h(\(see)g(Section)f(9.3)630
+5081 y([History)30 b(In)m(teraction],)i(page)f(111\).)150
+5230 y Fs(alias-expand-line)26 b(\(\))630 5340 y Ft(P)m(erform)i(alias)
+g(expansion)f(on)h(the)h(curren)m(t)f(line)f(\(see)i(Section)f(6.6)i
+([Aliases],)e(page)h(71\).)p eop
+%%Page: 103 109
+103 108 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2060 b(103)150 299 y Fs(history-and-alias-expand)o
+(-lin)o(e)24 b(\(\))630 408 y Ft(P)m(erform)30 b(history)g(and)f(alias)
+h(expansion)f(on)h(the)h(curren)m(t)f(line.)150 570 y
+Fs(insert-last-argument)25 b(\(M-.)k(or)h(M-_\))630 680
+y Ft(A)g(synon)m(ym)g(for)g Fs(yank-last-arg)p Ft(.)150
+842 y Fs(operate-and-get-next)25 b(\(C-o\))630 952 y
+Ft(Accept)42 b(the)e(curren)m(t)h(line)d(for)j(execution)f(and)g(fetc)m
+(h)i(the)e(next)h(line)e(relativ)m(e)i(to)g(the)630 1061
+y(curren)m(t)30 b(line)f(from)h(the)g(history)g(for)g(editing.)39
+b(An)m(y)31 b(argumen)m(t)f(is)g(ignored.)150 1223 y
+Fs(edit-and-execute-command)24 b(\(C-xC-e\))630 1333
+y Ft(In)m(v)m(ok)m(e)34 b(an)f(editor)f(on)h(the)g(curren)m(t)f
+(command)h(line,)f(and)g(execute)i(the)f(result)f(as)h(shell)630
+1442 y(commands.)81 b(Bash)44 b(attempts)h(to)g(in)m(v)m(ok)m(e)g
+Fs($FCEDIT)p Ft(,)g Fs($EDITOR)p Ft(,)h(and)d Fs(emacs)g
+Ft(as)h(the)630 1552 y(editor,)30 b(in)f(that)i(order.)150
+1816 y Fr(8.5)68 b(Readline)47 b(vi)e(Mo)t(de)275 2062
+y Ft(While)22 b(the)i(Readline)e(library)f(do)s(es)j(not)g(ha)m(v)m(e)g
+(a)h(full)c(set)j(of)g Fs(vi)f Ft(editing)f(functions,)i(it)f(do)s(es)h
+(con)m(tain)150 2172 y(enough)34 b(to)h(allo)m(w)e(simple)f(editing)h
+(of)h(the)g(line.)50 b(The)34 b(Readline)e Fs(vi)i Ft(mo)s(de)f(b)s
+(eha)m(v)m(es)i(as)f(sp)s(eci\014ed)e(in)150 2281 y(the)f
+Fl(posix)e Ft(1003.2)k(standard.)275 2418 y(In)i(order)g(to)i(switc)m
+(h)e(in)m(teractiv)m(ely)h(b)s(et)m(w)m(een)g Fs(emacs)f
+Ft(and)g Fs(vi)g Ft(editing)f(mo)s(des,)j(use)f(the)g(`)p
+Fs(set)30 b(-o)150 2528 y(emacs)p Ft(')21 b(and)g(`)p
+Fs(set)29 b(-o)h(vi)p Ft(')21 b(commands)h(\(see)g(Section)g(4.3)h
+([The)e(Set)h(Builtin],)g(page)g(50\).)39 b(The)21 b(Readline)150
+2638 y(default)30 b(is)f Fs(emacs)g Ft(mo)s(de.)275 2775
+y(When)g(y)m(ou)i(en)m(ter)f(a)h(line)d(in)h Fs(vi)g
+Ft(mo)s(de,)h(y)m(ou)h(are)f(already)g(placed)f(in)g(`insertion')f(mo)s
+(de,)i(as)h(if)e(y)m(ou)150 2884 y(had)d(t)m(yp)s(ed)g(an)g(`)p
+Fs(i)p Ft('.)39 b(Pressing)1215 2881 y Fg(h)p 1239 2828
+139 4 v 1239 2884 a Ff(ESC)p 1239 2900 V 1373 2881 a
+Fg(i)1429 2884 y Ft(switc)m(hes)26 b(y)m(ou)h(in)m(to)f(`command')g(mo)
+s(de,)h(where)f(y)m(ou)h(can)f(edit)g(the)150 2994 y(text)35
+b(of)f(the)g(line)e(with)g(the)i(standard)f Fs(vi)g Ft(mo)m(v)m(emen)m
+(t)j(k)m(eys,)g(mo)m(v)m(e)f(to)f(previous)f(history)f(lines)g(with)150
+3103 y(`)p Fs(k)p Ft(')f(and)e(subsequen)m(t)h(lines)f(with)g(`)p
+Fs(j)p Ft(',)h(and)g(so)h(forth.)150 3367 y Fr(8.6)68
+b(Programmable)47 b(Completion)275 3614 y Ft(When)25
+b(w)m(ord)g(completion)g(is)g(attempted)h(for)g(an)f(argumen)m(t)h(to)h
+(a)f(command)f(for)h(whic)m(h)e(a)i(comple-)150 3723
+y(tion)e(sp)s(eci\014cation)f(\(a)j Fq(compsp)s(ec)6
+b Ft(\))24 b(has)g(b)s(een)g(de\014ned)g(using)f(the)h
+Fs(complete)f Ft(builtin)e(\(see)k(Section)g(8.7)150
+3833 y([Programmable)e(Completion)f(Builtins],)g(page)i(105\),)j(the)c
+(programmable)g(completion)f(facilities)g(are)150 3943
+y(in)m(v)m(ok)m(ed.)275 4080 y(First,)g(the)f(command)g(name)g(is)g
+(iden)m(ti\014ed.)35 b(If)21 b(a)g(compsp)s(ec)g(has)g(b)s(een)f
+(de\014ned)g(for)h(that)h(command,)150 4189 y(the)44
+b(compsp)s(ec)g(is)f(used)g(to)h(generate)i(the)e(list)e(of)i(p)s
+(ossible)e(completions)h(for)g(the)h(w)m(ord.)81 b(If)44
+b(the)150 4299 y(command)33 b(w)m(ord)f(is)g(a)h(full)e(pathname,)j(a)f
+(compsp)s(ec)f(for)h(the)g(full)e(pathname)h(is)g(searc)m(hed)i(for)e
+(\014rst.)150 4408 y(If)f(no)h(compsp)s(ec)f(is)g(found)f(for)h(the)h
+(full)e(pathname,)i(an)f(attempt)i(is)e(made)g(to)i(\014nd)d(a)i
+(compsp)s(ec)f(for)150 4518 y(the)g(p)s(ortion)e(follo)m(wing)f(the)j
+(\014nal)e(slash.)275 4655 y(Once)34 b(a)g(compsp)s(ec)g(has)g(b)s(een)
+f(found,)h(it)g(is)f(used)g(to)i(generate)h(the)e(list)f(of)h(matc)m
+(hing)g(w)m(ords.)51 b(If)150 4765 y(a)37 b(compsp)s(ec)f(is)f(not)i
+(found,)f(the)h(default)e(Bash)i(completion)e(describ)s(ed)f(ab)s(o)m
+(v)m(e)k(\(see)f(Section)f(8.4.6)150 4874 y([Commands)30
+b(F)-8 b(or)31 b(Completion],)e(page)i(99\))h(is)d(p)s(erformed.)275
+5011 y(First,)h(the)h(actions)f(sp)s(eci\014ed)f(b)m(y)i(the)f(compsp)s
+(ec)h(are)g(used.)40 b(Only)29 b(matc)m(hes)j(whic)m(h)d(are)i
+(pre\014xed)150 5121 y(b)m(y)25 b(the)h(w)m(ord)f(b)s(eing)e(completed)
+j(are)f(returned.)38 b(When)25 b(the)h(`)p Fs(-f)p Ft(')f(or)g(`)p
+Fs(-d)p Ft(')g(option)g(is)f(used)h(for)g(\014lename)150
+5230 y(or)30 b(directory)g(name)g(completion,)g(the)g(shell)f(v)-5
+b(ariable)29 b Fs(FIGNORE)f Ft(is)h(used)g(to)i(\014lter)f(the)g(matc)m
+(hes.)42 b(See)150 5340 y(Section)30 b(5.2)i([Bash)e(V)-8
+b(ariables],)31 b(page)g(55,)g(for)f(a)h(description)e(of)h
+Fs(FIGNORE)p Ft(.)p eop
+%%Page: 104 110
+104 109 bop 150 -116 a Ft(104)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+275 299 y(An)m(y)e(completions)f(sp)s(eci\014ed)g(b)m(y)h(a)h
+(\014lename)e(expansion)h(pattern)g(to)h(the)g(`)p Fs(-G)p
+Ft(')f(option)g(are)g(gener-)150 408 y(ated)h(next.)40
+b(The)29 b(w)m(ords)g(generated)h(b)m(y)f(the)h(pattern)f(need)g(not)g
+(matc)m(h)i(the)e(w)m(ord)g(b)s(eing)f(completed.)150
+518 y(The)42 b Fs(GLOBIGNORE)d Ft(shell)i(v)-5 b(ariable)41
+b(is)g(not)i(used)e(to)i(\014lter)e(the)i(matc)m(hes,)j(but)c(the)g
+Fs(FIGNORE)f Ft(shell)150 628 y(v)-5 b(ariable)29 b(is)h(used.)275
+778 y(Next,)35 b(the)g(string)d(sp)s(eci\014ed)h(as)h(the)g(argumen)m
+(t)g(to)h(the)f(`)p Fs(-W)p Ft(')g(option)f(is)g(considered.)51
+b(The)33 b(string)150 888 y(is)f(\014rst)f(split)g(using)g(the)i(c)m
+(haracters)h(in)d(the)i Fs(IFS)e Ft(sp)s(ecial)h(v)-5
+b(ariable)31 b(as)i(delimiters.)45 b(Shell)30 b(quoting)i(is)150
+998 y(honored.)37 b(Eac)m(h)21 b(w)m(ord)g(is)f(then)g(expanded)g
+(using)g(brace)h(expansion,)h(tilde)d(expansion,)j(parameter)g(and)150
+1107 y(v)-5 b(ariable)24 b(expansion,)h(command)g(substitution,)f
+(arithmetic)g(expansion,)h(and)g(pathname)g(expansion,)150
+1217 y(as)j(describ)s(ed)d(ab)s(o)m(v)m(e)k(\(see)f(Section)g(3.5)g
+([Shell)e(Expansions],)g(page)j(16\).)41 b(The)27 b(results)f(are)i
+(split)d(using)150 1326 y(the)33 b(rules)f(describ)s(ed)e(ab)s(o)m(v)m
+(e)k(\(see)g(Section)f(3.5.7)i([W)-8 b(ord)33 b(Splitting],)f(page)h
+(22\).)50 b(The)32 b(results)g(of)h(the)150 1436 y(expansion)g(are)i
+(pre\014x-matc)m(hed)f(against)h(the)f(w)m(ord)g(b)s(eing)f(completed,)
+j(and)e(the)g(matc)m(hing)g(w)m(ords)150 1545 y(b)s(ecome)d(the)f(p)s
+(ossible)e(completions.)275 1696 y(After)h(these)g(matc)m(hes)i(ha)m(v)
+m(e)f(b)s(een)f(generated,)h(an)m(y)g(shell)d(function)h(or)h(command)g
+(sp)s(eci\014ed)e(with)150 1806 y(the)j(`)p Fs(-F)p Ft(')g(and)f(`)p
+Fs(-C)p Ft(')h(options)f(is)g(in)m(v)m(ok)m(ed.)40 b(When)30
+b(the)g(command)g(or)f(function)g(is)g(in)m(v)m(ok)m(ed,)h(the)g
+Fs(COMP_)150 1915 y(LINE)21 b Ft(and)h Fs(COMP_POINT)d
+Ft(v)-5 b(ariables)21 b(are)i(assigned)f(v)-5 b(alues)21
+b(as)i(describ)s(ed)d(ab)s(o)m(v)m(e)k(\(see)f(Section)f(5.2)i([Bash)
+150 2025 y(V)-8 b(ariables],)31 b(page)h(55\).)44 b(If)30
+b(a)i(shell)d(function)g(is)h(b)s(eing)g(in)m(v)m(ok)m(ed,)i(the)f
+Fs(COMP_WORDS)d Ft(and)j Fs(COMP_CWORD)150 2134 y Ft(v)-5
+b(ariables)38 b(are)i(also)g(set.)68 b(When)40 b(the)f(function)g(or)g
+(command)g(is)g(in)m(v)m(ok)m(ed,)j(the)e(\014rst)f(argumen)m(t)h(is)
+150 2244 y(the)34 b(name)f(of)h(the)g(command)f(whose)g(argumen)m(ts)h
+(are)g(b)s(eing)e(completed,)j(the)e(second)h(argumen)m(t)g(is)150
+2354 y(the)h(w)m(ord)g(b)s(eing)f(completed,)i(and)f(the)g(third)e
+(argumen)m(t)j(is)e(the)h(w)m(ord)g(preceding)f(the)i(w)m(ord)e(b)s
+(eing)150 2463 y(completed)d(on)f(the)h(curren)m(t)g(command)f(line.)40
+b(No)31 b(\014ltering)e(of)i(the)g(generated)h(completions)e(against)
+150 2573 y(the)f(w)m(ord)g(b)s(eing)e(completed)i(is)f(p)s(erformed;)g
+(the)h(function)f(or)h(command)f(has)h(complete)g(freedom)g(in)150
+2682 y(generating)i(the)f(matc)m(hes.)275 2833 y(An)m(y)h(function)g
+(sp)s(eci\014ed)f(with)g(`)p Fs(-F)p Ft(')i(is)f(in)m(v)m(ok)m(ed)h
+(\014rst.)44 b(The)31 b(function)g(ma)m(y)h(use)g(an)m(y)g(of)g(the)g
+(shell)150 2943 y(facilities,)40 b(including)d(the)j
+Fs(compgen)d Ft(builtin)g(describ)s(ed)g(b)s(elo)m(w)i(\(see)i(Section)
+e(8.7)i([Programmable)150 3052 y(Completion)26 b(Builtins],)f(page)j
+(105\),)i(to)e(generate)h(the)e(matc)m(hes.)41 b(It)27
+b(m)m(ust)g(put)g(the)g(p)s(ossible)e(comple-)150 3162
+y(tions)30 b(in)f(the)h Fs(COMPREPLY)e Ft(arra)m(y)j(v)-5
+b(ariable.)275 3313 y(Next,)23 b(an)m(y)e(command)f(sp)s(eci\014ed)f
+(with)g(the)i(`)p Fs(-C)p Ft(')f(option)g(is)g(in)m(v)m(ok)m(ed)h(in)e
+(an)h(en)m(vironmen)m(t)g(equiv)-5 b(alen)m(t)150 3422
+y(to)26 b(command)e(substitution.)37 b(It)25 b(should)e(prin)m(t)h(a)h
+(list)f(of)h(completions,)g(one)g(p)s(er)f(line,)h(to)h(the)f(standard)
+150 3532 y(output.)40 b(Bac)m(kslash)31 b(ma)m(y)g(b)s(e)f(used)g(to)h
+(escap)s(e)g(a)f(newline,)f(if)g(necessary)-8 b(.)275
+3682 y(After)42 b(all)e(of)i(the)g(p)s(ossible)e(completions)h(are)h
+(generated,)k(an)m(y)c(\014lter)f(sp)s(eci\014ed)f(with)h(the)h(`)p
+Fs(-X)p Ft(')150 3792 y(option)33 b(is)f(applied)f(to)j(the)f(list.)47
+b(The)33 b(\014lter)f(is)g(a)i(pattern)f(as)g(used)g(for)g(pathname)g
+(expansion;)g(a)h(`)p Fs(&)p Ft(')150 3902 y(in)k(the)h(pattern)g(is)f
+(replaced)g(with)g(the)h(text)h(of)f(the)g(w)m(ord)g(b)s(eing)e
+(completed.)67 b(A)39 b(literal)e(`)p Fs(&)p Ft(')i(ma)m(y)150
+4011 y(b)s(e)e(escap)s(ed)h(with)f(a)i(bac)m(kslash;)j(the)c(bac)m
+(kslash)g(is)f(remo)m(v)m(ed)i(b)s(efore)e(attempting)i(a)f(matc)m(h.)
+65 b(An)m(y)150 4121 y(completion)33 b(that)i(matc)m(hes)g(the)f
+(pattern)g(will)d(b)s(e)j(remo)m(v)m(ed)h(from)e(the)h(list.)51
+b(A)34 b(leading)e(`)p Fs(!)p Ft(')j(negates)150 4230
+y(the)c(pattern;)f(in)f(this)h(case)h(an)m(y)g(completion)e(not)i(matc)
+m(hing)g(the)f(pattern)h(will)c(b)s(e)j(remo)m(v)m(ed.)275
+4381 y(Finally)-8 b(,)30 b(an)m(y)i(pre\014x)f(and)g(su\016x)g(sp)s
+(eci\014ed)f(with)h(the)h(`)p Fs(-P)p Ft(')f(and)g(`)p
+Fs(-S)p Ft(')h(options)f(are)h(added)f(to)i(eac)m(h)150
+4491 y(mem)m(b)s(er)e(of)g(the)h(completion)f(list,)f(and)h(the)h
+(result)e(is)h(returned)f(to)i(the)g(Readline)e(completion)h(co)s(de)
+150 4600 y(as)g(the)f(list)f(of)i(p)s(ossible)d(completions.)275
+4751 y(If)22 b(the)i(previously-applied)19 b(actions)24
+b(do)f(not)h(generate)h(an)m(y)f(matc)m(hes,)i(and)d(the)g(`)p
+Fs(-o)30 b(dirnames)p Ft(')22 b(op-)150 4861 y(tion)28
+b(w)m(as)g(supplied)d(to)k Fs(complete)d Ft(when)h(the)h(compsp)s(ec)g
+(w)m(as)g(de\014ned,)g(directory)f(name)i(completion)150
+4970 y(is)g(attempted.)275 5121 y(If)h(the)i(`)p Fs(-o)e(plusdirs)p
+Ft(')f(option)i(w)m(as)g(supplied)d(to)k Fs(complete)e
+Ft(when)g(the)h(compsp)s(ec)g(w)m(as)h(de\014ned,)150
+5230 y(directory)j(name)g(completion)g(is)f(attempted)i(and)f(an)m(y)h
+(matc)m(hes)g(are)g(added)f(to)h(the)f(results)f(of)i(the)150
+5340 y(other)31 b(actions.)p eop
+%%Page: 105 111
+105 110 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2060 b(105)275 299 y(By)31 b(default,)h(if)e(a)i
+(compsp)s(ec)f(is)g(found,)g(whatev)m(er)h(it)f(generates)i(is)d
+(returned)h(to)h(the)g(completion)150 408 y(co)s(de)21
+b(as)g(the)g(full)e(set)i(of)g(p)s(ossible)d(completions.)37
+b(The)20 b(default)g(Bash)h(completions)f(are)i(not)f(attempted,)150
+518 y(and)k(the)h(Readline)e(default)h(of)h(\014lename)f(completion)g
+(is)g(disabled.)36 b(If)26 b(the)g(`)p Fs(-o)k(bashdefault)p
+Ft(')22 b(option)150 628 y(w)m(as)i(supplied)c(to)25
+b Fs(complete)c Ft(when)i(the)g(compsp)s(ec)h(w)m(as)g(de\014ned,)g
+(the)f(default)g(Bash)h(completions)f(are)150 737 y(attempted)h(if)e
+(the)h(compsp)s(ec)g(generates)i(no)e(matc)m(hes.)39
+b(If)23 b(the)g(`)p Fs(-o)30 b(default)p Ft(')21 b(option)i(w)m(as)g
+(supplied)d(to)150 847 y Fs(complete)25 b Ft(when)h(the)h(compsp)s(ec)f
+(w)m(as)i(de\014ned,)e(Readline's)g(default)g(completion)g(will)e(b)s
+(e)i(p)s(erformed)150 956 y(if)j(the)i(compsp)s(ec)f(\(and,)g(if)g
+(attempted,)h(the)g(default)e(Bash)i(completions\))f(generate)i(no)e
+(matc)m(hes.)275 1098 y(When)20 b(a)i(compsp)s(ec)e(indicates)g(that)i
+(directory)f(name)g(completion)f(is)g(desired,)i(the)f(programmable)150
+1208 y(completion)29 b(functions)f(force)j(Readline)d(to)j(app)s(end)d
+(a)i(slash)f(to)h(completed)g(names)f(whic)m(h)g(are)h(sym-)150
+1317 y(b)s(olic)38 b(links)g(to)j(directories,)h(sub)5
+b(ject)40 b(to)h(the)f(v)-5 b(alue)40 b(of)g(the)g Fq(mark-directories)
+j Ft(Readline)c(v)-5 b(ariable,)150 1427 y(regardless)30
+b(of)g(the)h(setting)f(of)h(the)f Fq(mark-symlink)m(ed-directories)i
+Ft(Readline)d(v)-5 b(ariable.)150 1703 y Fr(8.7)68 b(Programmable)47
+b(Completion)f(Builtins)275 1954 y Ft(Tw)m(o)30 b(builtin)d(commands)j
+(are)h(a)m(v)-5 b(ailable)29 b(to)i(manipulate)e(the)i(programmable)e
+(completion)h(facil-)150 2063 y(ities.)150 2234 y Fs(compgen)870
+2372 y(compgen)46 b([)p Fj(option)11 b Fs(])45 b([)p
+Fj(word)11 b Fs(])630 2510 y Ft(Generate)27 b(p)s(ossible)c(completion)
+i(matc)m(hes)i(for)e Fq(w)m(ord)k Ft(according)d(to)g(the)g
+Fq(option)p Ft(s,)g(whic)m(h)630 2620 y(ma)m(y)i(b)s(e)f(an)m(y)h
+(option)f(accepted)i(b)m(y)e(the)h Fs(complete)d Ft(builtin)g(with)h
+(the)i(exception)f(of)h(`)p Fs(-p)p Ft(')630 2729 y(and)k(`)p
+Fs(-r)p Ft(',)i(and)e(write)g(the)h(matc)m(hes)h(to)g(the)f(standard)f
+(output.)48 b(When)33 b(using)e(the)i(`)p Fs(-F)p Ft(')630
+2839 y(or)28 b(`)p Fs(-C)p Ft(')g(options,)g(the)g(v)-5
+b(arious)28 b(shell)e(v)-5 b(ariables)27 b(set)h(b)m(y)g(the)g
+(programmable)g(completion)630 2948 y(facilities,)h(while)f(a)m(v)-5
+b(ailable,)30 b(will)e(not)j(ha)m(v)m(e)g(useful)e(v)-5
+b(alues.)630 3087 y(The)34 b(matc)m(hes)h(will)d(b)s(e)i(generated)h
+(in)e(the)i(same)g(w)m(a)m(y)g(as)g(if)e(the)i(programmable)e(com-)630
+3196 y(pletion)c(co)s(de)i(had)f(generated)i(them)e(directly)g(from)g
+(a)h(completion)f(sp)s(eci\014cation)f(with)630 3306
+y(the)g(same)h(\015ags.)40 b(If)29 b Fq(w)m(ord)j Ft(is)c(sp)s
+(eci\014ed,)g(only)g(those)i(completions)e(matc)m(hing)h
+Fq(w)m(ord)k Ft(will)630 3415 y(b)s(e)d(displa)m(y)m(ed.)630
+3553 y(The)24 b(return)g(v)-5 b(alue)24 b(is)g(true)g(unless)f(an)i(in)
+m(v)-5 b(alid)22 b(option)i(is)g(supplied,)e(or)j(no)g(matc)m(hes)g(w)m
+(ere)630 3663 y(generated.)150 3830 y Fs(complete)870
+3968 y(complete)46 b([-abcdefgjksuv])d([-o)k Fj(comp-option)11
+b Fs(])44 b([-A)j Fj(action)11 b Fs(])45 b([-G)i Fj(glob-)870
+4077 y(pat)11 b Fs(])46 b([-W)h Fj(wordlist)11 b Fs(])870
+4187 y([-P)47 b Fj(prefix)11 b Fs(])45 b([-S)i Fj(suffix)11
+b Fs(])45 b([-X)i Fj(filterpat)11 b Fs(])45 b([-F)i Fj(function)11
+b Fs(])870 4297 y([-C)47 b Fj(command)11 b Fs(])45 b
+Fj(name)57 b Fs([)p Fj(name)g Fs(...)o(])870 4406 y(complete)46
+b(-pr)g([)p Fj(name)57 b Fs(...])630 4544 y Ft(Sp)s(ecify)32
+b(ho)m(w)i(argumen)m(ts)h(to)f(eac)m(h)i Fq(name)j Ft(should)32
+b(b)s(e)h(completed.)52 b(If)33 b(the)i(`)p Fs(-p)p Ft(')e(option)630
+4654 y(is)c(supplied,)d(or)k(if)f(no)g(options)g(are)h(supplied,)d
+(existing)h(completion)h(sp)s(eci\014cations)g(are)630
+4763 y(prin)m(ted)42 b(in)h(a)h(w)m(a)m(y)h(that)f(allo)m(ws)f(them)h
+(to)g(b)s(e)g(reused)f(as)h(input.)79 b(The)43 b(`)p
+Fs(-r)p Ft(')g(option)630 4873 y(remo)m(v)m(es)29 b(a)f(completion)f
+(sp)s(eci\014cation)f(for)i(eac)m(h)g Fq(name)p Ft(,)h(or,)f(if)f(no)g
+Fq(name)5 b Ft(s)28 b(are)g(supplied,)630 4983 y(all)h(completion)h(sp)
+s(eci\014cations.)630 5121 y(The)f(pro)s(cess)g(of)h(applying)e(these)i
+(completion)e(sp)s(eci\014cations)h(when)f(w)m(ord)i(completion)630
+5230 y(is)k(attempted)i(is)e(describ)s(ed)f(ab)s(o)m(v)m(e)k(\(see)f
+(Section)f(8.6)h([Programmable)f(Completion],)630 5340
+y(page)c(103\).)p eop
+%%Page: 106 112
+106 111 bop 150 -116 a Ft(106)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+630 299 y(Other)41 b(options,)k(if)40 b(sp)s(eci\014ed,)j(ha)m(v)m(e)g
+(the)f(follo)m(wing)f(meanings.)74 b(The)41 b(argumen)m(ts)h(to)630
+408 y(the)e(`)p Fs(-G)p Ft(',)j(`)p Fs(-W)p Ft(',)g(and)d(`)p
+Fs(-X)p Ft(')g(options)f(\(and,)k(if)c(necessary)-8 b(,)44
+b(the)c(`)p Fs(-P)p Ft(')h(and)e(`)p Fs(-S)p Ft(')h(options\))630
+518 y(should)29 b(b)s(e)i(quoted)g(to)h(protect)g(them)f(from)g
+(expansion)f(b)s(efore)h(the)g Fs(complete)e Ft(builtin)630
+628 y(is)g(in)m(v)m(ok)m(ed.)630 782 y Fs(-o)h Fj(comp-option)1110
+892 y Ft(The)c Fq(comp-option)h Ft(con)m(trols)g(sev)m(eral)h(asp)s
+(ects)f(of)g(the)g(compsp)s(ec's)g(b)s(eha)m(v-)1110
+1002 y(ior)f(b)s(ey)m(ond)g(the)g(simple)f(generation)i(of)f
+(completions.)39 b Fq(comp-option)26 b Ft(ma)m(y)1110
+1111 y(b)s(e)k(one)g(of:)1110 1266 y Fs(bashdefault)1590
+1375 y Ft(P)m(erform)d(the)h(rest)f(of)h(the)g(default)e(Bash)i
+(completions)e(if)h(the)1590 1485 y(compsp)s(ec)j(generates)i(no)e
+(matc)m(hes.)1110 1640 y Fs(default)144 b Ft(Use)22 b(Readline's)e
+(default)h(\014lename)g(completion)f(if)h(the)h(comp-)1590
+1749 y(sp)s(ec)30 b(generates)i(no)e(matc)m(hes.)1110
+1904 y Fs(dirnames)96 b Ft(P)m(erform)46 b(directory)f(name)i
+(completion)e(if)g(the)h(compsp)s(ec)1590 2014 y(generates)32
+b(no)e(matc)m(hes.)1110 2168 y Fs(filenames)1590 2278
+y Ft(T)-8 b(ell)38 b(Readline)f(that)j(the)f(compsp)s(ec)f(generates)j
+(\014lenames,)1590 2388 y(so)29 b(it)g(can)g(p)s(erform)f(an)m(y)h
+(\014lename-sp)s(eci\014c)f(pro)s(cessing)f(\(lik)m(e)1590
+2497 y(adding)h(a)i(slash)e(to)i(directory)f(names)g(or)g(suppressing)e
+(trail-)1590 2607 y(ing)37 b(spaces\).)66 b(This)36 b(option)i(is)f(in)
+m(tended)g(to)i(b)s(e)f(used)f(with)1590 2716 y(shell)29
+b(functions)g(sp)s(eci\014ed)f(with)h(`)p Fs(-F)p Ft('.)1110
+2871 y Fs(nospace)144 b Ft(T)-8 b(ell)38 b(Readline)g(not)i(to)g(app)s
+(end)d(a)j(space)g(\(the)f(default\))g(to)1590 2981 y(w)m(ords)30
+b(completed)g(at)h(the)g(end)f(of)g(the)h(line.)630 3135
+y Fs(-A)f Fj(action)1110 3245 y Ft(The)25 b Fq(action)g
+Ft(ma)m(y)h(b)s(e)e(one)h(of)h(the)f(follo)m(wing)f(to)h(generate)i(a)e
+(list)f(of)h(p)s(ossible)1110 3354 y(completions:)1110
+3509 y Fs(alias)240 b Ft(Alias)29 b(names.)41 b(Ma)m(y)31
+b(also)g(b)s(e)f(sp)s(eci\014ed)e(as)j(`)p Fs(-a)p Ft('.)1110
+3664 y Fs(arrayvar)96 b Ft(Arra)m(y)31 b(v)-5 b(ariable)29
+b(names.)1110 3819 y Fs(binding)144 b Ft(Readline)28
+b(k)m(ey)h(binding)d(names)j(\(see)h(Section)e(8.4)i([Bindable)1590
+3928 y(Readline)f(Commands],)h(page)h(95\).)1110 4083
+y Fs(builtin)144 b Ft(Names)21 b(of)g(shell)d(builtin)g(commands.)37
+b(Ma)m(y)21 b(also)g(b)s(e)f(sp)s(eci\014ed)1590 4193
+y(as)31 b(`)p Fs(-b)p Ft('.)1110 4347 y Fs(command)144
+b Ft(Command)29 b(names.)41 b(Ma)m(y)32 b(also)e(b)s(e)g(sp)s
+(eci\014ed)e(as)j(`)p Fs(-c)p Ft('.)1110 4502 y Fs(directory)1590
+4612 y Ft(Directory)g(names.)40 b(Ma)m(y)32 b(also)e(b)s(e)g(sp)s
+(eci\014ed)f(as)h(`)p Fs(-d)p Ft('.)1110 4766 y Fs(disabled)96
+b Ft(Names)31 b(of)g(disabled)d(shell)g(builtins.)1110
+4921 y Fs(enabled)144 b Ft(Names)31 b(of)g(enabled)e(shell)f(builtins.)
+1110 5076 y Fs(export)192 b Ft(Names)34 b(of)f(exp)s(orted)f(shell)f(v)
+-5 b(ariables.)47 b(Ma)m(y)35 b(also)d(b)s(e)h(sp)s(eci-)1590
+5185 y(\014ed)d(as)g(`)p Fs(-e)p Ft('.)1110 5340 y Fs(file)288
+b Ft(File)30 b(names.)40 b(Ma)m(y)32 b(also)e(b)s(e)g(sp)s(eci\014ed)e
+(as)j(`)p Fs(-f)p Ft('.)p eop
+%%Page: 107 113
+107 112 bop 150 -116 a Ft(Chapter)30 b(8:)41 b(Command)29
+b(Line)h(Editing)2060 b(107)1110 299 y Fs(function)96
+b Ft(Names)31 b(of)g(shell)d(functions.)1110 451 y Fs(group)240
+b Ft(Group)30 b(names.)40 b(Ma)m(y)32 b(also)e(b)s(e)g(sp)s(eci\014ed)f
+(as)h(`)p Fs(-g)p Ft('.)1110 603 y Fs(helptopic)1590
+713 y Ft(Help)36 b(topics)g(as)h(accepted)h(b)m(y)e(the)h
+Fs(help)f Ft(builtin)d(\(see)k(Sec-)1590 822 y(tion)30
+b(4.2)h([Bash)g(Builtins],)d(page)j(39\).)1110 975 y
+Fs(hostname)96 b Ft(Hostnames,)89 b(as)76 b(tak)m(en)h(from)f(the)g
+(\014le)g(sp)s(eci\014ed)e(b)m(y)1590 1084 y(the)55 b
+Fs(HOSTFILE)e Ft(shell)h(v)-5 b(ariable)54 b(\(see)i(Section)f(5.2)i
+([Bash)1590 1194 y(V)-8 b(ariables],)30 b(page)h(55\).)1110
+1346 y Fs(job)336 b Ft(Job)31 b(names,)h(if)f(job)g(con)m(trol)h(is)f
+(activ)m(e.)45 b(Ma)m(y)33 b(also)f(b)s(e)f(sp)s(eci-)1590
+1456 y(\014ed)f(as)g(`)p Fs(-j)p Ft('.)1110 1608 y Fs(keyword)144
+b Ft(Shell)28 b(reserv)m(ed)j(w)m(ords.)40 b(Ma)m(y)32
+b(also)e(b)s(e)g(sp)s(eci\014ed)e(as)j(`)p Fs(-k)p Ft('.)1110
+1760 y Fs(running)144 b Ft(Names)31 b(of)g(running)c(jobs,)j(if)g(job)g
+(con)m(trol)g(is)g(activ)m(e.)1110 1912 y Fs(service)144
+b Ft(Service)30 b(names.)41 b(Ma)m(y)31 b(also)f(b)s(e)g(sp)s
+(eci\014ed)f(as)h(`)p Fs(-s)p Ft('.)1110 2064 y Fs(setopt)192
+b Ft(V)-8 b(alid)32 b(argumen)m(ts)h(for)f(the)h(`)p
+Fs(-o)p Ft(')g(option)f(to)i(the)f Fs(set)e Ft(builtin)1590
+2174 y(\(see)g(Section)g(4.3)g([The)f(Set)h(Builtin],)d(page)j(50\).)
+1110 2326 y Fs(shopt)240 b Ft(Shell)38 b(option)h(names)h(as)g
+(accepted)i(b)m(y)e(the)g Fs(shopt)e Ft(builtin)1590
+2436 y(\(see)31 b(Section)g(4.2)g([Bash)g(Builtins],)d(page)j(39\).)
+1110 2588 y Fs(signal)192 b Ft(Signal)29 b(names.)1110
+2740 y Fs(stopped)144 b Ft(Names)31 b(of)g(stopp)s(ed)e(jobs,)h(if)f
+(job)h(con)m(trol)h(is)f(activ)m(e.)1110 2892 y Fs(user)288
+b Ft(User)30 b(names.)41 b(Ma)m(y)32 b(also)e(b)s(e)g(sp)s(eci\014ed)e
+(as)j(`)p Fs(-u)p Ft('.)1110 3045 y Fs(variable)96 b
+Ft(Names)36 b(of)g(all)e(shell)g(v)-5 b(ariables.)54
+b(Ma)m(y)37 b(also)e(b)s(e)g(sp)s(eci\014ed)f(as)1590
+3154 y(`)p Fs(-v)p Ft('.)630 3306 y Fs(-G)c Fj(globpat)1110
+3416 y Ft(The)39 b(\014lename)g(expansion)g(pattern)h
+Fq(globpat)i Ft(is)d(expanded)g(to)h(generate)1110 3526
+y(the)31 b(p)s(ossible)c(completions.)630 3678 y Fs(-W)j
+Fj(wordlist)1110 3787 y Ft(The)24 b Fq(w)m(ordlist)i
+Ft(is)e(split)f(using)g(the)i(c)m(haracters)i(in)c(the)j
+Fs(IFS)e Ft(sp)s(ecial)f(v)-5 b(ariable)1110 3897 y(as)36
+b(delimiters,)f(and)h(eac)m(h)h(resultan)m(t)f(w)m(ord)f(is)g
+(expanded.)57 b(The)35 b(p)s(ossible)1110 4007 y(completions)29
+b(are)g(the)h(mem)m(b)s(ers)f(of)g(the)h(resultan)m(t)f(list)f(whic)m
+(h)g(matc)m(h)j(the)1110 4116 y(w)m(ord)f(b)s(eing)f(completed.)630
+4268 y Fs(-C)h Fj(command)1110 4378 y Fq(command)35 b
+Ft(is)d(executed)h(in)d(a)j(subshell)c(en)m(vironmen)m(t,)j(and)g(its)f
+(output)h(is)1110 4488 y(used)e(as)g(the)h(p)s(ossible)d(completions.)
+630 4640 y Fs(-F)i Fj(function)1110 4749 y Ft(The)25
+b(shell)g(function)f Fq(function)h Ft(is)g(executed)i(in)d(the)j
+(curren)m(t)e(shell)g(en)m(viron-)1110 4859 y(men)m(t.)40
+b(When)25 b(it)g(\014nishes,)f(the)i(p)s(ossible)d(completions)h(are)i
+(retriev)m(ed)f(from)1110 4969 y(the)31 b(v)-5 b(alue)29
+b(of)i(the)g Fs(COMPREPLY)c Ft(arra)m(y)k(v)-5 b(ariable.)630
+5121 y Fs(-X)30 b Fj(filterpat)1110 5230 y Fq(\014lterpat)c
+Ft(is)e(a)h(pattern)g(as)f(used)g(for)h(\014lename)f(expansion.)37
+b(It)25 b(is)f(applied)e(to)1110 5340 y(the)30 b(list)d(of)j(p)s
+(ossible)d(completions)h(generated)j(b)m(y)e(the)g(preceding)g(options)
+p eop
+%%Page: 108 114
+108 113 bop 150 -116 a Ft(108)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+1110 299 y(and)c(argumen)m(ts,)i(and)e(eac)m(h)i(completion)e(matc)m
+(hing)h Fq(\014lterpat)h Ft(is)e(remo)m(v)m(ed)1110 408
+y(from)j(the)h(list.)40 b(A)30 b(leading)g(`)p Fs(!)p
+Ft(')g(in)f Fq(\014lterpat)j Ft(negates)g(the)f(pattern;)g(in)e(this)
+1110 518 y(case,)j(an)m(y)e(completion)g(not)h(matc)m(hing)f
+Fq(\014lterpat)i Ft(is)d(remo)m(v)m(ed.)630 677 y Fs(-P)h
+Fj(prefix)1110 787 y Fq(pre\014x)39 b Ft(is)33 b(added)g(at)i(the)f(b)s
+(eginning)d(of)k(eac)m(h)g(p)s(ossible)c(completion)i(after)1110
+897 y(all)c(other)i(options)f(ha)m(v)m(e)h(b)s(een)f(applied.)630
+1056 y Fs(-S)g Fj(suffix)1110 1166 y Fq(su\016x)c Ft(is)19
+b(app)s(ended)g(to)i(eac)m(h)h(p)s(ossible)c(completion)i(after)h(all)e
+(other)i(options)1110 1275 y(ha)m(v)m(e)32 b(b)s(een)d(applied.)630
+1435 y(The)35 b(return)g(v)-5 b(alue)36 b(is)f(true)g(unless)g(an)g(in)
+m(v)-5 b(alid)34 b(option)h(is)g(supplied,)f(an)i(option)g(other)630
+1544 y(than)31 b(`)p Fs(-p)p Ft(')g(or)g(`)p Fs(-r)p
+Ft(')g(is)f(supplied)e(without)i(a)h Fq(name)37 b Ft(argumen)m(t,)32
+b(an)f(attempt)h(is)e(made)h(to)630 1654 y(remo)m(v)m(e)h(a)e
+(completion)g(sp)s(eci\014cation)f(for)h(a)h Fq(name)k
+Ft(for)30 b(whic)m(h)f(no)h(sp)s(eci\014cation)f(exists,)630
+1763 y(or)h(an)h(error)f(o)s(ccurs)g(adding)f(a)h(completion)g(sp)s
+(eci\014cation.)p eop
+%%Page: 109 115
+109 114 bop 150 -116 a Ft(Chapter)30 b(9:)41 b(Using)29
+b(History)h(In)m(teractiv)m(ely)1923 b(109)150 299 y
+Fo(9)80 b(Using)54 b(History)g(In)l(teractiv)l(ely)275
+562 y Ft(This)31 b(c)m(hapter)j(describ)s(es)d(ho)m(w)i(to)h(use)f(the)
+g Fl(gnu)g Ft(History)g(Library)e(in)m(teractiv)m(ely)-8
+b(,)34 b(from)f(a)h(user's)150 671 y(standp)s(oin)m(t.)75
+b(It)42 b(should)e(b)s(e)i(considered)f(a)h(user's)g(guide.)75
+b(F)-8 b(or)43 b(information)d(on)i(using)f(the)h Fl(gnu)150
+781 y Ft(History)30 b(Library)f(in)g(other)h(programs,)g(see)h(the)g
+Fl(gnu)f Ft(Readline)f(Library)g(Man)m(ual.)150 1062
+y Fr(9.1)68 b(Bash)45 b(History)h(F)-11 b(acilities)275
+1316 y Ft(When)36 b(the)h(`)p Fs(-o)30 b(history)p Ft(')k(option)i(to)i
+(the)e Fs(set)g Ft(builtin)d(is)j(enabled)f(\(see)j(Section)e(4.3)h
+([The)g(Set)150 1425 y(Builtin],)29 b(page)j(50\),)h(the)e(shell)f(pro)
+m(vides)g(access)i(to)g(the)f Fq(command)g(history)p
+Ft(,)g(the)g(list)f(of)h(commands)150 1535 y(previously)f(t)m(yp)s(ed.)
+47 b(The)33 b(v)-5 b(alue)32 b(of)g(the)h Fs(HISTSIZE)e
+Ft(shell)f(v)-5 b(ariable)32 b(is)g(used)f(as)i(the)g(n)m(um)m(b)s(er)e
+(of)i(com-)150 1644 y(mands)i(to)i(sa)m(v)m(e)h(in)d(a)h(history)g
+(list.)56 b(The)36 b(text)h(of)g(the)f(last)g Fs($HISTSIZE)e
+Ft(commands)i(\(default)f(500\))150 1754 y(is)h(sa)m(v)m(ed.)61
+b(The)36 b(shell)f(stores)j(eac)m(h)g(command)e(in)g(the)h(history)f
+(list)f(prior)g(to)j(parameter)f(and)f(v)-5 b(ari-)150
+1864 y(able)32 b(expansion)g(but)g(after)h(history)e(expansion)h(is)g
+(p)s(erformed,)f(sub)5 b(ject)33 b(to)g(the)g(v)-5 b(alues)32
+b(of)h(the)g(shell)150 1973 y(v)-5 b(ariables)29 b Fs(HISTIGNORE)f
+Ft(and)h Fs(HISTCONTROL)p Ft(.)275 2117 y(When)g(the)g(shell)f(starts)i
+(up,)f(the)h(history)e(is)h(initialized)d(from)j(the)h(\014le)e(named)h
+(b)m(y)h(the)f Fs(HISTFILE)150 2227 y Ft(v)-5 b(ariable)19
+b(\(default)i(`)p Fs(~/.bash_history)p Ft('\).)34 b(The)20
+b(\014le)g(named)g(b)m(y)h(the)g(v)-5 b(alue)20 b(of)h
+Fs(HISTFILE)d Ft(is)i(truncated,)150 2336 y(if)41 b(necessary)-8
+b(,)45 b(to)e(con)m(tain)f(no)g(more)g(than)f(the)h(n)m(um)m(b)s(er)f
+(of)h(lines)e(sp)s(eci\014ed)g(b)m(y)i(the)g(v)-5 b(alue)41
+b(of)h(the)150 2446 y Fs(HISTFILESIZE)21 b Ft(v)-5 b(ariable.)38
+b(When)24 b(an)g(in)m(teractiv)m(e)h(shell)e(exits,)i(the)g(last)f
+Fs($HISTSIZE)e Ft(lines)h(are)h(copied)150 2556 y(from)29
+b(the)i(history)d(list)h(to)i(the)f(\014le)f(named)g(b)m(y)h
+Fs($HISTFILE)p Ft(.)38 b(If)30 b(the)g Fs(histappend)d
+Ft(shell)h(option)h(is)g(set)150 2665 y(\(see)22 b(Section)f(4.2)h
+([Bash)g(Builtins],)e(page)i(39\),)j(the)c(lines)e(are)j(app)s(ended)d
+(to)j(the)f(history)f(\014le,)j(otherwise)150 2775 y(the)32
+b(history)e(\014le)g(is)h(o)m(v)m(erwritten.)44 b(If)31
+b Fs(HISTFILE)e Ft(is)i(unset,)g(or)h(if)e(the)i(history)e(\014le)g(is)
+h(un)m(writable,)f(the)150 2884 y(history)36 b(is)h(not)g(sa)m(v)m(ed.)
+63 b(After)38 b(sa)m(ving)f(the)g(history)-8 b(,)39 b(the)f(history)e
+(\014le)g(is)h(truncated)g(to)h(con)m(tain)g(no)150 2994
+y(more)31 b(than)f Fs($HISTFILESIZE)c Ft(lines.)39 b(If)30
+b Fs(HISTFILESIZE)d Ft(is)j(not)g(set,)h(no)g(truncation)e(is)h(p)s
+(erformed.)275 3138 y(If)h(the)h Fs(HISTTIMEFORMAT)d
+Ft(is)i(set,)i(the)f(time)g(stamp)g(information)e(asso)s(ciated)j(with)
+e(eac)m(h)i(history)150 3247 y(en)m(try)e(is)e(written)g(to)j(the)e
+(history)f(\014le.)275 3392 y(The)19 b(builtin)e(command)j
+Fs(fc)g Ft(ma)m(y)h(b)s(e)f(used)f(to)i(list)e(or)i(edit)f(and)f
+(re-execute)j(a)f(p)s(ortion)e(of)h(the)h(history)150
+3501 y(list.)39 b(The)27 b Fs(history)f Ft(builtin)f(ma)m(y)k(b)s(e)e
+(used)g(to)i(displa)m(y)e(or)h(mo)s(dify)e(the)i(history)f(list)g(and)h
+(manipulate)150 3611 y(the)j(history)f(\014le.)41 b(When)31
+b(using)e(command-line)g(editing,)h(searc)m(h)h(commands)g(are)g(a)m(v)
+-5 b(ailable)30 b(in)g(eac)m(h)150 3720 y(editing)43
+b(mo)s(de)i(that)g(pro)m(vide)f(access)i(to)f(the)g(history)e(list)h
+(\(see)h(Section)g(8.4.2)h([Commands)e(F)-8 b(or)150
+3830 y(History],)30 b(page)i(95\).)275 3974 y(The)47
+b(shell)g(allo)m(ws)h(con)m(trol)g(o)m(v)m(er)i(whic)m(h)d(commands)h
+(are)h(sa)m(v)m(ed)g(on)f(the)h(history)e(list.)93 b(The)150
+4084 y Fs(HISTCONTROL)25 b Ft(and)j Fs(HISTIGNORE)e Ft(v)-5
+b(ariables)27 b(ma)m(y)j(b)s(e)d(set)j(to)f(cause)g(the)g(shell)d(to)k
+(sa)m(v)m(e)g(only)e(a)h(subset)150 4193 y(of)e(the)g(commands)f(en)m
+(tered.)40 b(The)26 b Fs(cmdhist)f Ft(shell)g(option,)i(if)f(enabled,)g
+(causes)i(the)e(shell)f(to)j(attempt)150 4303 y(to)23
+b(sa)m(v)m(e)h(eac)m(h)f(line)e(of)h(a)h(m)m(ulti-line)c(command)j(in)f
+(the)i(same)f(history)f(en)m(try)-8 b(,)25 b(adding)c(semicolons)g
+(where)150 4412 y(necessary)37 b(to)f(preserv)m(e)h(syn)m(tactic)g
+(correctness.)58 b(The)36 b Fs(lithist)e Ft(shell)g(option)i(causes)h
+(the)f(shell)e(to)150 4522 y(sa)m(v)m(e)25 b(the)e(command)h(with)e(em)
+m(b)s(edded)g(newlines)f(instead)i(of)g(semicolons.)38
+b(The)23 b Fs(shopt)e Ft(builtin)f(is)j(used)150 4631
+y(to)31 b(set)g(these)g(options.)40 b(See)31 b(Section)f(4.2)h([Bash)g
+(Builtins],)d(page)j(39,)h(for)e(a)h(description)d(of)j
+Fs(shopt)p Ft(.)150 4913 y Fr(9.2)68 b(Bash)45 b(History)h(Builtins)275
+5166 y Ft(Bash)30 b(pro)m(vides)f(t)m(w)m(o)j(builtin)27
+b(commands)j(whic)m(h)f(manipulate)g(the)h(history)g(list)f(and)h
+(history)f(\014le.)150 5340 y Fs(fc)p eop
+%%Page: 110 116
+110 115 bop 150 -116 a Ft(110)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+870 299 y Fs(fc)47 b([-e)g Fj(ename)11 b Fs(])46 b([-nlr])g([)p
+Fj(first)11 b Fs(])45 b([)p Fj(last)11 b Fs(])870 408
+y(fc)47 b(-s)g([)p Fj(pat)11 b Fs(=)p Fj(rep)g Fs(])45
+b([)p Fj(command)11 b Fs(])630 539 y Ft(Fix)40 b(Command.)68
+b(In)39 b(the)i(\014rst)e(form,)j(a)e(range)h(of)f(commands)g(from)f
+Fq(\014rst)i Ft(to)g Fq(last)h Ft(is)630 648 y(selected)34
+b(from)f(the)g(history)f(list.)48 b(Both)34 b Fq(\014rst)h
+Ft(and)e Fq(last)i Ft(ma)m(y)f(b)s(e)e(sp)s(eci\014ed)g(as)h(a)h
+(string)630 758 y(\(to)26 b(lo)s(cate)g(the)f(most)h(recen)m(t)g
+(command)e(b)s(eginning)f(with)h(that)h(string\))g(or)g(as)g(a)g(n)m
+(um)m(b)s(er)630 867 y(\(an)f(index)e(in)m(to)h(the)h(history)f(list,)g
+(where)g(a)h(negativ)m(e)h(n)m(um)m(b)s(er)d(is)h(used)g(as)g(an)h
+(o\013set)g(from)630 977 y(the)j(curren)m(t)f(command)h(n)m(um)m(b)s
+(er\).)39 b(If)26 b Fq(last)i Ft(is)e(not)h(sp)s(eci\014ed)e(it)h(is)g
+(set)h(to)h Fq(\014rst)p Ft(.)39 b(If)26 b Fq(\014rst)i
+Ft(is)630 1087 y(not)j(sp)s(eci\014ed)e(it)h(is)g(set)i(to)f(the)g
+(previous)e(command)i(for)f(editing)g(and)g Fp(\000)p
+Ft(16)h(for)g(listing.)630 1196 y(If)f(the)g(`)p Fs(-l)p
+Ft(')g(\015ag)h(is)e(giv)m(en,)h(the)h(commands)e(are)i(listed)e(on)h
+(standard)f(output.)40 b(The)30 b(`)p Fs(-n)p Ft(')630
+1306 y(\015ag)i(suppresses)f(the)h(command)g(n)m(um)m(b)s(ers)e(when)i
+(listing.)43 b(The)32 b(`)p Fs(-r)p Ft(')g(\015ag)g(rev)m(erses)h(the)
+630 1415 y(order)g(of)g(the)h(listing.)47 b(Otherwise,)33
+b(the)g(editor)g(giv)m(en)g(b)m(y)g Fq(ename)39 b Ft(is)32
+b(in)m(v)m(ok)m(ed)i(on)f(a)h(\014le)630 1525 y(con)m(taining)g(those)h
+(commands.)52 b(If)33 b Fq(ename)40 b Ft(is)33 b(not)i(giv)m(en,)g(the)
+g(v)-5 b(alue)34 b(of)g(the)g(follo)m(wing)630 1634 y(v)-5
+b(ariable)31 b(expansion)f(is)h(used:)42 b Fs(${FCEDIT:-${EDITOR:-vi}})
+p Ft(.)d(This)30 b(sa)m(ys)i(to)g(use)g(the)630 1744
+y(v)-5 b(alue)33 b(of)g(the)h Fs(FCEDIT)e Ft(v)-5 b(ariable)32
+b(if)g(set,)j(or)f(the)f(v)-5 b(alue)33 b(of)h(the)f
+Fs(EDITOR)f Ft(v)-5 b(ariable)32 b(if)g(that)630 1854
+y(is)g(set,)j(or)e Fs(vi)g Ft(if)f(neither)g(is)g(set.)50
+b(When)33 b(editing)f(is)g(complete,)i(the)g(edited)e(commands)630
+1963 y(are)f(ec)m(ho)s(ed)g(and)f(executed.)630 2093
+y(In)k(the)g(second)g(form,)h Fq(command)j Ft(is)33 b(re-executed)j
+(after)f(eac)m(h)g(instance)f(of)g Fq(pat)j Ft(in)c(the)630
+2203 y(selected)e(command)f(is)f(replaced)h(b)m(y)h Fq(rep)p
+Ft(.)630 2333 y(A)g(useful)e(alias)h(to)i(use)e(with)g(the)h
+Fs(fc)f Ft(command)h(is)f Fs(r='fc)f(-s')p Ft(,)h(so)h(that)h(t)m
+(yping)e(`)p Fs(r)g(cc)p Ft(')630 2443 y(runs)35 b(the)h(last)g
+(command)g(b)s(eginning)e(with)h Fs(cc)g Ft(and)h(t)m(yping)f(`)p
+Fs(r)p Ft(')i(re-executes)h(the)e(last)630 2552 y(command)30
+b(\(see)h(Section)g(6.6)g([Aliases],)f(page)i(71\).)150
+2703 y Fs(history)870 2833 y(history)46 b([)p Fj(n)11
+b Fs(])870 2943 y(history)46 b(-c)870 3052 y(history)g(-d)h
+Fj(offset)870 3162 y Fs(history)f([-anrw])g([)p Fj(filename)11
+b Fs(])870 3271 y(history)46 b(-ps)h Fj(arg)630 3402
+y Ft(With)25 b(no)h(options,)g(displa)m(y)e(the)i(history)f(list)f
+(with)g(line)g(n)m(um)m(b)s(ers.)38 b(Lines)25 b(pre\014xed)f(with)630
+3511 y(a)35 b(`)p Fs(*)p Ft(')g(ha)m(v)m(e)h(b)s(een)e(mo)s(di\014ed.)
+52 b(An)34 b(argumen)m(t)h(of)g Fq(n)f Ft(lists)g(only)g(the)h(last)f
+Fq(n)g Ft(lines.)52 b(If)35 b(the)630 3621 y(shell)28
+b(v)-5 b(ariable)29 b Fs(HISTTIMEFORMAT)d Ft(is)j(set)i(and)e(not)i(n)m
+(ull,)d(it)i(is)f(used)g(as)h(a)h(format)f(string)630
+3730 y(for)36 b Fq(strftime)k Ft(to)c(displa)m(y)e(the)i(time)g(stamp)g
+(asso)s(ciated)g(with)f(eac)m(h)i(displa)m(y)m(ed)d(history)630
+3840 y(en)m(try)-8 b(.)47 b(No)33 b(in)m(terv)m(ening)e(blank)g(is)g
+(prin)m(ted)g(b)s(et)m(w)m(een)i(the)g(formatted)f(time)g(stamp)h(and)
+630 3950 y(the)e(history)e(line.)630 4080 y(Options,)g(if)h(supplied,)d
+(ha)m(v)m(e)k(the)g(follo)m(wing)e(meanings:)630 4230
+y Fs(-c)384 b Ft(Clear)22 b(the)h(history)f(list.)37
+b(This)21 b(ma)m(y)j(b)s(e)e(com)m(bined)g(with)f(the)i(other)h
+(options)1110 4340 y(to)31 b(replace)f(the)h(history)e(list)g
+(completely)-8 b(.)630 4491 y Fs(-d)30 b Fj(offset)1110
+4600 y Ft(Delete)24 b(the)g(history)e(en)m(try)i(at)g(p)s(osition)d
+Fq(o\013set)p Ft(.)39 b Fq(o\013set)27 b Ft(should)21
+b(b)s(e)i(sp)s(eci\014ed)1110 4710 y(as)31 b(it)f(app)s(ears)f(when)h
+(the)g(history)f(is)h(displa)m(y)m(ed.)630 4861 y Fs(-a)384
+b Ft(App)s(end)35 b(the)i(new)g(history)f(lines)f(\(history)h(lines)f
+(en)m(tered)j(since)e(the)h(b)s(e-)1110 4970 y(ginning)28
+b(of)j(the)f(curren)m(t)g(Bash)h(session\))f(to)h(the)g(history)e
+(\014le.)630 5121 y Fs(-n)384 b Ft(App)s(end)32 b(the)i(history)e
+(lines)g(not)i(already)f(read)h(from)f(the)h(history)e(\014le)h(to)1110
+5230 y(the)26 b(curren)m(t)f(history)f(list.)38 b(These)25
+b(are)h(lines)e(app)s(ended)g(to)i(the)f(history)g(\014le)1110
+5340 y(since)30 b(the)g(b)s(eginning)e(of)i(the)h(curren)m(t)f(Bash)h
+(session.)p eop
+%%Page: 111 117
+111 116 bop 150 -116 a Ft(Chapter)30 b(9:)41 b(Using)29
+b(History)h(In)m(teractiv)m(ely)1923 b(111)630 299 y
+Fs(-r)384 b Ft(Read)26 b(the)h(curren)m(t)f(history)f(\014le)g(and)h
+(app)s(end)e(its)i(con)m(ten)m(ts)i(to)f(the)f(history)1110
+408 y(list.)630 571 y Fs(-w)384 b Ft(W)-8 b(rite)31 b(out)f(the)h
+(curren)m(t)f(history)f(to)j(the)e(history)f(\014le.)630
+734 y Fs(-p)384 b Ft(P)m(erform)31 b(history)e(substitution)g(on)h(the)
+h Fq(arg)8 b Ft(s)31 b(and)f(displa)m(y)f(the)h(result)g(on)1110
+843 y(the)e(standard)f(output,)i(without)e(storing)g(the)h(results)f
+(in)g(the)h(history)f(list.)630 1006 y Fs(-s)384 b Ft(The)30
+b Fq(arg)8 b Ft(s)30 b(are)h(added)f(to)h(the)f(end)g(of)h(the)f
+(history)g(list)f(as)h(a)h(single)e(en)m(try)-8 b(.)630
+1168 y(When)24 b(an)m(y)h(of)f(the)h(`)p Fs(-w)p Ft(',)h(`)p
+Fs(-r)p Ft(',)f(`)p Fs(-a)p Ft(',)h(or)f(`)p Fs(-n)p
+Ft(')f(options)f(is)h(used,)h(if)e Fq(\014lename)29 b
+Ft(is)23 b(giv)m(en,)j(then)630 1278 y(it)31 b(is)g(used)g(as)h(the)f
+(history)g(\014le.)44 b(If)31 b(not,)h(then)g(the)f(v)-5
+b(alue)31 b(of)h(the)g Fs(HISTFILE)d Ft(v)-5 b(ariable)31
+b(is)630 1388 y(used.)150 1653 y Fr(9.3)68 b(History)46
+b(Expansion)275 1900 y Ft(The)35 b(History)g(library)e(pro)m(vides)i(a)
+h(history)e(expansion)h(feature)h(that)g(is)f(similar)e(to)j(the)g
+(history)150 2010 y(expansion)21 b(pro)m(vided)f(b)m(y)i
+Fs(csh)p Ft(.)37 b(This)21 b(section)h(describ)s(es)e(the)i(syn)m(tax)h
+(used)e(to)h(manipulate)f(the)h(history)150 2120 y(information.)275
+2257 y(History)30 b(expansions)f(in)m(tro)s(duce)g(w)m(ords)h(from)g
+(the)h(history)e(list)g(in)m(to)h(the)h(input)e(stream,)i(making)150
+2367 y(it)f(easy)h(to)g(rep)s(eat)g(commands,)f(insert)f(the)i(argumen)
+m(ts)f(to)h(a)g(previous)e(command)h(in)m(to)h(the)f(curren)m(t)150
+2476 y(input)e(line,)h(or)i(\014x)f(errors)f(in)g(previous)g(commands)h
+(quic)m(kly)-8 b(.)275 2614 y(History)26 b(expansion)f(tak)m(es)j
+(place)e(in)f(t)m(w)m(o)j(parts.)39 b(The)26 b(\014rst)g(is)f(to)i
+(determine)f(whic)m(h)f(line)g(from)h(the)150 2724 y(history)h(list)f
+(should)g(b)s(e)h(used)g(during)f(substitution.)37 b(The)27
+b(second)h(is)f(to)i(select)f(p)s(ortions)e(of)i(that)h(line)150
+2833 y(for)d(inclusion)c(in)m(to)k(the)g(curren)m(t)f(one.)40
+b(The)25 b(line)f(selected)i(from)g(the)g(history)e(is)h(called)g(the)h
+Fq(ev)m(en)m(t)p Ft(,)j(and)150 2943 y(the)21 b(p)s(ortions)f(of)h
+(that)h(line)d(that)j(are)g(acted)g(up)s(on)e(are)h(called)f
+Fq(w)m(ords)p Ft(.)38 b(V)-8 b(arious)20 b Fq(mo)s(di\014ers)j
+Ft(are)f(a)m(v)-5 b(ailable)150 3052 y(to)35 b(manipulate)d(the)i
+(selected)h(w)m(ords.)51 b(The)33 b(line)f(is)h(brok)m(en)h(in)m(to)g
+(w)m(ords)f(in)g(the)h(same)h(fashion)d(that)150 3162
+y(Bash)j(do)s(es,)h(so)f(that)h(sev)m(eral)f(w)m(ords)f(surrounded)f(b)
+m(y)i(quotes)g(are)g(considered)f(one)h(w)m(ord.)54 b(History)150
+3272 y(expansions)33 b(are)h(in)m(tro)s(duced)e(b)m(y)i(the)g(app)s
+(earance)g(of)g(the)g(history)f(expansion)g(c)m(haracter,)j(whic)m(h)d
+(is)150 3381 y(`)p Fs(!)p Ft(')e(b)m(y)f(default.)40
+b(Only)28 b(`)p Fs(\\)p Ft(')j(and)f(`)p Fs(')p Ft(')g(ma)m(y)h(b)s(e)f
+(used)g(to)h(escap)s(e)g(the)f(history)f(expansion)h(c)m(haracter.)275
+3519 y(Sev)m(eral)39 b(shell)f(options)h(settable)h(with)e(the)i
+Fs(shopt)e Ft(builtin)e(\(see)k(Section)g(4.2)g([Bash)g(Builtins],)150
+3629 y(page)32 b(39\))h(ma)m(y)f(b)s(e)f(used)g(to)i(tailor)e(the)g(b)s
+(eha)m(vior)g(of)h(history)f(expansion.)43 b(If)31 b(the)h
+Fs(histverify)d Ft(shell)150 3738 y(option)38 b(is)f(enabled,)i(and)f
+(Readline)e(is)i(b)s(eing)e(used,)k(history)d(substitutions)f(are)i
+(not)h(immediately)150 3848 y(passed)30 b(to)h(the)g(shell)e(parser.)40
+b(Instead,)30 b(the)h(expanded)f(line)f(is)g(reloaded)h(in)m(to)h(the)f
+(Readline)f(editing)150 3957 y(bu\013er)g(for)i(further)e(mo)s
+(di\014cation.)39 b(If)30 b(Readline)f(is)g(b)s(eing)g(used,)h(and)g
+(the)g Fs(histreedit)e Ft(shell)g(option)150 4067 y(is)33
+b(enabled,)h(a)h(failed)e(history)g(expansion)g(will)e(b)s(e)j
+(reloaded)f(in)m(to)h(the)h(Readline)d(editing)h(bu\013er)g(for)150
+4176 y(correction.)73 b(The)41 b(`)p Fs(-p)p Ft(')g(option)f(to)i(the)f
+Fs(history)f Ft(builtin)d(command)k(ma)m(y)h(b)s(e)e(used)h(to)g(see)h
+(what)150 4286 y(a)c(history)f(expansion)f(will)f(do)i(b)s(efore)h
+(using)e(it.)62 b(The)37 b(`)p Fs(-s)p Ft(')g(option)g(to)i(the)f
+Fs(history)d Ft(builtin)f(ma)m(y)150 4396 y(b)s(e)f(used)h(to)g(add)g
+(commands)f(to)i(the)f(end)g(of)g(the)g(history)f(list)g(without)g
+(actually)h(executing)g(them,)150 4505 y(so)k(that)h(they)f(are)g(a)m
+(v)-5 b(ailable)37 b(for)h(subsequen)m(t)f(recall.)63
+b(This)36 b(is)h(most)h(useful)f(in)f(conjunction)h(with)150
+4615 y(Readline.)275 4753 y(The)29 b(shell)g(allo)m(ws)h(con)m(trol)h
+(of)f(the)h(v)-5 b(arious)29 b(c)m(haracters)j(used)e(b)m(y)g(the)h
+(history)e(expansion)h(mec)m(ha-)150 4862 y(nism)f(with)g(the)h
+Fs(histchars)e Ft(v)-5 b(ariable.)150 5093 y Fk(9.3.1)63
+b(Ev)m(en)m(t)39 b(Designators)275 5340 y Ft(An)30 b(ev)m(en)m(t)h
+(designator)g(is)e(a)i(reference)g(to)g(a)f(command)h(line)d(en)m(try)j
+(in)e(the)i(history)e(list.)p eop
+%%Page: 112 118
+112 117 bop 150 -116 a Ft(112)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+150 299 y Fs(!)432 b Ft(Start)34 b(a)f(history)g(substitution,)f
+(except)i(when)f(follo)m(w)m(ed)g(b)m(y)g(a)h(space,)h(tab,)f(the)g
+(end)f(of)630 408 y(the)i(line,)e(`)p Fs(=)p Ft(')i(or)f(`)p
+Fs(\()p Ft(')h(\(when)e(the)i Fs(extglob)d Ft(shell)h(option)g(is)h
+(enabled)f(using)g(the)h Fs(shopt)630 518 y Ft(builtin\).)150
+674 y Fs(!)p Fj(n)384 b Ft(Refer)30 b(to)i(command)e(line)e
+Fq(n)p Ft(.)150 830 y Fs(!-)p Fj(n)336 b Ft(Refer)30
+b(to)i(the)e(command)g Fq(n)g Ft(lines)f(bac)m(k.)150
+985 y Fs(!!)384 b Ft(Refer)30 b(to)i(the)e(previous)f(command.)40
+b(This)29 b(is)g(a)i(synon)m(ym)f(for)g(`)p Fs(!-1)p
+Ft('.)150 1141 y Fs(!)p Fj(string)144 b Ft(Refer)30 b(to)i(the)e(most)h
+(recen)m(t)g(command)f(starting)h(with)e Fq(string)p
+Ft(.)150 1297 y Fs(!?)p Fj(string)11 b Fs([?])630 1406
+y Ft(Refer)34 b(to)g(the)f(most)h(recen)m(t)h(command)e(con)m(taining)g
+Fq(string)p Ft(.)49 b(The)33 b(trailing)f(`)p Fs(?)p
+Ft(')h(ma)m(y)i(b)s(e)630 1516 y(omitted)30 b(if)g(the)g
+Fq(string)37 b Ft(is)30 b(follo)m(w)m(ed)g(immediately)f(b)m(y)h(a)h
+(newline.)150 1672 y Fs(^)p Fj(string1)11 b Fs(^)p Fj(string2)g
+Fs(^)630 1781 y Ft(Quic)m(k)31 b(Substitution.)42 b(Rep)s(eat)32
+b(the)g(last)g(command,)g(replacing)e Fq(string1)39 b
+Ft(with)30 b Fq(string2)p Ft(.)630 1891 y(Equiv)-5 b(alen)m(t)29
+b(to)i Fs(!!:s/)p Fj(string1)11 b Fs(/)p Fj(string2)g
+Fs(/)p Ft(.)150 2047 y Fs(!#)384 b Ft(The)30 b(en)m(tire)g(command)g
+(line)f(t)m(yp)s(ed)h(so)h(far.)150 2265 y Fk(9.3.2)63
+b(W)-10 b(ord)41 b(Designators)275 2508 y Ft(W)-8 b(ord)35
+b(designators)f(are)h(used)f(to)h(select)g(desired)e(w)m(ords)i(from)f
+(the)h(ev)m(en)m(t.)55 b(A)34 b(`)p Fs(:)p Ft(')h(separates)h(the)150
+2617 y(ev)m(en)m(t)41 b(sp)s(eci\014cation)d(from)i(the)f(w)m(ord)g
+(designator.)68 b(It)40 b(ma)m(y)g(b)s(e)f(omitted)h(if)e(the)i(w)m
+(ord)f(designator)150 2727 y(b)s(egins)32 b(with)h(a)i(`)p
+Fs(^)p Ft(',)g(`)p Fs($)p Ft(',)g(`)p Fs(*)p Ft(',)h(`)p
+Fs(-)p Ft(',)f(or)f(`)p Fs(\045)p Ft('.)52 b(W)-8 b(ords)35
+b(are)f(n)m(um)m(b)s(ered)f(from)g(the)i(b)s(eginning)c(of)j(the)g
+(line,)150 2836 y(with)k(the)i(\014rst)f(w)m(ord)g(b)s(eing)f(denoted)i
+(b)m(y)g(0)g(\(zero\).)70 b(W)-8 b(ords)39 b(are)h(inserted)f(in)m(to)g
+(the)h(curren)m(t)g(line)150 2946 y(separated)31 b(b)m(y)f(single)f
+(spaces.)275 3079 y(F)-8 b(or)31 b(example,)150 3234
+y Fs(!!)384 b Ft(designates)36 b(the)g(preceding)f(command.)57
+b(When)35 b(y)m(ou)i(t)m(yp)s(e)f(this,)g(the)g(preceding)f(com-)630
+3344 y(mand)30 b(is)f(rep)s(eated)h(in)f(toto.)150 3500
+y Fs(!!:$)288 b Ft(designates)22 b(the)h(last)f(argumen)m(t)h(of)f(the)
+h(preceding)e(command.)38 b(This)21 b(ma)m(y)i(b)s(e)e(shortened)630
+3609 y(to)31 b Fs(!$)p Ft(.)150 3765 y Fs(!fi:2)240 b
+Ft(designates)29 b(the)h(second)f(argumen)m(t)h(of)f(the)h(most)f
+(recen)m(t)i(command)e(starting)g(with)f(the)630 3875
+y(letters)j Fs(fi)p Ft(.)275 4030 y(Here)f(are)h(the)g(w)m(ord)f
+(designators:)150 4186 y Fs(0)g(\(zero\))114 b Ft(The)30
+b Fs(0)p Ft(th)g(w)m(ord.)40 b(F)-8 b(or)31 b(man)m(y)g(applications,)e
+(this)g(is)g(the)i(command)f(w)m(ord.)150 4342 y Fj(n)432
+b Ft(The)30 b Fq(n)p Ft(th)g(w)m(ord.)150 4498 y Fs(^)432
+b Ft(The)30 b(\014rst)f(argumen)m(t;)j(that)f(is,)e(w)m(ord)h(1.)150
+4654 y Fs($)432 b Ft(The)30 b(last)g(argumen)m(t.)150
+4809 y Fs(\045)432 b Ft(The)30 b(w)m(ord)g(matc)m(hed)h(b)m(y)f(the)h
+(most)g(recen)m(t)g(`)p Fs(?)p Fj(string)11 b Fs(?)p
+Ft(')28 b(searc)m(h.)150 4965 y Fj(x)p Fs(-)p Fj(y)336
+b Ft(A)30 b(range)h(of)g(w)m(ords;)f(`)p Fs(-)p Fj(y)11
+b Ft(')30 b(abbreviates)g(`)p Fs(0-)p Fj(y)11 b Ft('.)150
+5121 y Fs(*)432 b Ft(All)26 b(of)i(the)g(w)m(ords,)g(except)h(the)e
+Fs(0)p Ft(th.)40 b(This)26 b(is)g(a)i(synon)m(ym)f(for)h(`)p
+Fs(1-$)p Ft('.)39 b(It)28 b(is)f(not)h(an)f(error)630
+5230 y(to)j(use)g(`)p Fs(*)p Ft(')f(if)g(there)h(is)f(just)g(one)h(w)m
+(ord)f(in)f(the)i(ev)m(en)m(t;)i(the)d(empt)m(y)i(string)d(is)h
+(returned)f(in)630 5340 y(that)j(case.)p eop
+%%Page: 113 119
+113 118 bop 150 -116 a Ft(Chapter)30 b(9:)41 b(Using)29
+b(History)h(In)m(teractiv)m(ely)1923 b(113)150 299 y
+Fj(x)11 b Fs(*)373 b Ft(Abbreviates)30 b(`)p Fj(x)p Fs(-$)p
+Ft(')150 458 y Fj(x)p Fs(-)384 b Ft(Abbreviates)30 b(`)p
+Fj(x)p Fs(-$)p Ft(')g(lik)m(e)f(`)p Fj(x)11 b Fs(*)p
+Ft(',)31 b(but)e(omits)h(the)h(last)f(w)m(ord.)275 618
+y(If)j(a)h(w)m(ord)g(designator)f(is)g(supplied)e(without)i(an)h(ev)m
+(en)m(t)h(sp)s(eci\014cation,)f(the)g(previous)e(command)150
+727 y(is)d(used)h(as)h(the)f(ev)m(en)m(t.)150 951 y Fk(9.3.3)63
+b(Mo)s(di\014ers)275 1196 y Ft(After)20 b(the)h(optional)f(w)m(ord)h
+(designator,)h(y)m(ou)f(can)g(add)f(a)h(sequence)g(of)g(one)g(or)g
+(more)g(of)g(the)f(follo)m(wing)150 1305 y(mo)s(di\014ers,)28
+b(eac)m(h)k(preceded)e(b)m(y)g(a)h(`)p Fs(:)p Ft('.)150
+1465 y Fs(h)432 b Ft(Remo)m(v)m(e)32 b(a)f(trailing)d(pathname)j(comp)s
+(onen)m(t,)g(lea)m(ving)f(only)f(the)i(head.)150 1624
+y Fs(t)432 b Ft(Remo)m(v)m(e)32 b(all)d(leading)h(pathname)g(comp)s
+(onen)m(ts,)h(lea)m(ving)f(the)g(tail.)150 1783 y Fs(r)432
+b Ft(Remo)m(v)m(e)32 b(a)f(trailing)d(su\016x)i(of)g(the)h(form)f(`)p
+Fs(.)p Fj(suffix)11 b Ft(',)28 b(lea)m(ving)j(the)f(basename.)150
+1943 y Fs(e)432 b Ft(Remo)m(v)m(e)32 b(all)d(but)h(the)h(trailing)d
+(su\016x.)150 2102 y Fs(p)432 b Ft(Prin)m(t)29 b(the)i(new)f(command)g
+(but)g(do)g(not)g(execute)i(it.)150 2262 y Fs(q)432 b
+Ft(Quote)31 b(the)f(substituted)f(w)m(ords,)h(escaping)g(further)f
+(substitutions.)150 2421 y Fs(x)432 b Ft(Quote)32 b(the)f(substituted)f
+(w)m(ords)g(as)i(with)e(`)p Fs(q)p Ft(',)i(but)e(break)h(in)m(to)h(w)m
+(ords)e(at)i(spaces,)h(tabs,)630 2531 y(and)d(newlines.)150
+2690 y Fs(s/)p Fj(old)11 b Fs(/)p Fj(new)g Fs(/)630 2800
+y Ft(Substitute)31 b Fq(new)40 b Ft(for)32 b(the)h(\014rst)f(o)s
+(ccurrence)h(of)f Fq(old)k Ft(in)31 b(the)i(ev)m(en)m(t)h(line.)46
+b(An)m(y)32 b(delimiter)630 2909 y(ma)m(y)25 b(b)s(e)g(used)f(in)f
+(place)i(of)g(`)p Fs(/)p Ft('.)39 b(The)24 b(delimiter)e(ma)m(y)k(b)s
+(e)e(quoted)h(in)e Fq(old)28 b Ft(and)c Fq(new)32 b Ft(with)24
+b(a)630 3019 y(single)j(bac)m(kslash.)39 b(If)28 b(`)p
+Fs(&)p Ft(')g(app)s(ears)g(in)e Fq(new)p Ft(,)j(it)e(is)h(replaced)f(b)
+m(y)h Fq(old)p Ft(.)39 b(A)28 b(single)f(bac)m(kslash)630
+3128 y(will)32 b(quote)j(the)g(`)p Fs(&)p Ft('.)54 b(The)34
+b(\014nal)f(delimiter)g(is)g(optional)h(if)g(it)g(is)f(the)i(last)g(c)m
+(haracter)h(on)630 3238 y(the)31 b(input)d(line.)150
+3397 y Fs(&)432 b Ft(Rep)s(eat)31 b(the)f(previous)f(substitution.)150
+3557 y Fs(g)150 3666 y(a)432 b Ft(Cause)38 b(c)m(hanges)i(to)f(b)s(e)f
+(applied)f(o)m(v)m(er)j(the)f(en)m(tire)f(ev)m(en)m(t)i(line.)64
+b(Used)39 b(in)e(conjunction)630 3776 y(with)29 b(`)p
+Fs(s)p Ft(',)i(as)f(in)g Fs(gs/)p Fj(old)11 b Fs(/)p
+Fj(new)g Fs(/)p Ft(,)26 b(or)k(with)g(`)p Fs(&)p Ft('.)150
+3935 y Fs(G)432 b Ft(Apply)29 b(the)h(follo)m(wing)f(`)p
+Fs(s)p Ft(')i(mo)s(di\014er)d(once)j(to)g(eac)m(h)h(w)m(ord)e(in)f(the)
+h(ev)m(en)m(t.)p eop
+%%Page: 114 120
+114 119 bop 150 -116 a Ft(114)2527 b(Bash)31 b(Reference)g(Man)m(ual)p
+eop
+%%Page: 115 121
+115 120 bop 150 -116 a Ft(Chapter)30 b(10:)41 b(Installing)28
+b(Bash)2356 b(115)150 299 y Fo(10)80 b(Installing)55
+b(Bash)275 535 y Ft(This)38 b(c)m(hapter)j(pro)m(vides)e(basic)g
+(instructions)f(for)i(installing)d(Bash)j(on)g(the)h(v)-5
+b(arious)39 b(supp)s(orted)150 645 y(platforms.)57 b(The)36
+b(distribution)d(supp)s(orts)h(the)j Fl(gnu)f Ft(op)s(erating)f
+(systems,)k(nearly)c(ev)m(ery)i(v)m(ersion)f(of)150 754
+y(Unix,)g(and)f(sev)m(eral)h(non-Unix)f(systems)h(suc)m(h)f(as)h(BeOS)g
+(and)f(In)m(terix.)56 b(Other)35 b(indep)s(enden)m(t)f(p)s(orts)150
+864 y(exist)c(for)g Fl(ms-dos)p Ft(,)g Fl(os/2)p Ft(,)g(and)g(Windo)m
+(ws)g(platforms.)150 1123 y Fr(10.1)68 b(Basic)45 b(Installation)275
+1367 y Ft(These)30 b(are)g(installation)f(instructions)f(for)i(Bash.)
+275 1503 y(The)f(simplest)g(w)m(a)m(y)i(to)g(compile)f(Bash)g(is:)199
+1638 y(1.)61 b Fs(cd)38 b Ft(to)h(the)f(directory)g(con)m(taining)g
+(the)h(source)f(co)s(de)h(and)f(t)m(yp)s(e)g(`)p Fs(./configure)p
+Ft(')e(to)j(con\014gure)330 1747 y(Bash)c(for)f(y)m(our)h(system.)54
+b(If)34 b(y)m(ou're)h(using)e Fs(csh)h Ft(on)g(an)h(old)f(v)m(ersion)g
+(of)h(System)f(V,)h(y)m(ou)g(migh)m(t)330 1857 y(need)21
+b(to)g(t)m(yp)s(e)g(`)p Fs(sh)30 b(./configure)p Ft(')18
+b(instead)i(to)h(prev)m(en)m(t)h Fs(csh)e Ft(from)g(trying)g(to)h
+(execute)h Fs(configure)330 1966 y Ft(itself.)330 2101
+y(Running)29 b Fs(configure)g Ft(tak)m(es)k(some)e(time.)44
+b(While)30 b(running,)f(it)i(prin)m(ts)f(messages)i(telling)e(whic)m(h)
+330 2211 y(features)h(it)f(is)f(c)m(hec)m(king)i(for.)199
+2346 y(2.)61 b(T)m(yp)s(e)30 b(`)p Fs(make)p Ft(')g(to)h(compile)e
+(Bash)i(and)e(build)f(the)i Fs(bashbug)f Ft(bug)g(rep)s(orting)g
+(script.)199 2481 y(3.)61 b(Optionally)-8 b(,)29 b(t)m(yp)s(e)h(`)p
+Fs(make)g(tests)p Ft(')f(to)i(run)e(the)h(Bash)h(test)g(suite.)199
+2615 y(4.)61 b(T)m(yp)s(e)36 b(`)p Fs(make)29 b(install)p
+Ft(')35 b(to)i(install)e Fs(bash)g Ft(and)h Fs(bashbug)p
+Ft(.)57 b(This)34 b(will)g(also)j(install)d(the)j(man)m(ual)330
+2725 y(pages)31 b(and)f(Info)g(\014le.)275 2885 y(The)20
+b Fs(configure)f Ft(shell)g(script)h(attempts)i(to)g(guess)f(correct)i
+(v)-5 b(alues)20 b(for)h(v)-5 b(arious)20 b(system-dep)s(enden)m(t)150
+2995 y(v)-5 b(ariables)42 b(used)h(during)f(compilation.)79
+b(It)43 b(uses)h(those)g(v)-5 b(alues)43 b(to)h(create)h(a)g(`)p
+Fs(Makefile)p Ft(')c(in)i(eac)m(h)150 3104 y(directory)24
+b(of)h(the)g(pac)m(k)-5 b(age)27 b(\(the)e(top)g(directory)-8
+b(,)26 b(the)f(`)p Fs(builtins)p Ft(',)f(`)p Fs(doc)p
+Ft(',)i(and)e(`)p Fs(support)p Ft(')g(directories,)150
+3214 y(eac)m(h)32 b(directory)e(under)e(`)p Fs(lib)p
+Ft(',)j(and)f(sev)m(eral)g(others\).)42 b(It)30 b(also)h(creates)g(a)g
+(`)p Fs(config.h)p Ft(')e(\014le)g(con)m(taining)150
+3324 y(system-dep)s(enden)m(t)i(de\014nitions.)42 b(Finally)-8
+b(,)31 b(it)g(creates)i(a)f(shell)e(script)g(named)h
+Fs(config.status)d Ft(that)150 3433 y(y)m(ou)k(can)g(run)e(in)g(the)h
+(future)g(to)h(recreate)h(the)f(curren)m(t)f(con\014guration,)g(a)h
+(\014le)f(`)p Fs(config.cache)p Ft(')d(that)150 3543
+y(sa)m(v)m(es)35 b(the)f(results)e(of)i(its)f(tests)i(to)f(sp)s(eed)f
+(up)g(recon\014guring,)g(and)g(a)h(\014le)f(`)p Fs(config.log)p
+Ft(')e(con)m(taining)150 3652 y(compiler)23 b(output)i(\(useful)e
+(mainly)g(for)i(debugging)e Fs(configure)p Ft(\).)37
+b(If)24 b(at)i(some)f(p)s(oin)m(t)f(`)p Fs(config.cache)p
+Ft(')150 3762 y(con)m(tains)31 b(results)e(y)m(ou)h(don't)h(w)m(an)m(t)
+g(to)g(k)m(eep,)g(y)m(ou)g(ma)m(y)g(remo)m(v)m(e)h(or)e(edit)g(it.)275
+3897 y(T)-8 b(o)37 b(\014nd)f(out)i(more)f(ab)s(out)h(the)f(options)g
+(and)g(argumen)m(ts)g(that)h(the)g Fs(configure)d Ft(script)h(under-)
+150 4007 y(stands,)30 b(t)m(yp)s(e)390 4142 y Fs(bash-2.04$)45
+b(./configure)g(--help)150 4277 y Ft(at)31 b(the)g(Bash)f(prompt)g(in)f
+(y)m(our)h(Bash)h(source)f(directory)-8 b(.)275 4412
+y(If)53 b(y)m(ou)h(need)f(to)i(do)e(un)m(usual)f(things)g(to)j(compile)
+e(Bash,)59 b(please)54 b(try)f(to)i(\014gure)e(out)h(ho)m(w)150
+4522 y Fs(configure)47 b Ft(could)i(c)m(hec)m(k)i(whether)e(or)g(not)h
+(to)h(do)e(them,)55 b(and)49 b(mail)f(di\013s)g(or)i(instructions)d(to)
+150 4631 y Fs(bash-maintainers@gnu.org)24 b Ft(so)30
+b(they)h(can)g(b)s(e)e(considered)h(for)g(the)g(next)h(release.)275
+4766 y(The)24 b(\014le)h(`)p Fs(configure.in)p Ft(')d(is)j(used)f(to)j
+(create)g Fs(configure)22 b Ft(b)m(y)k(a)g(program)f(called)f(Auto)s
+(conf.)39 b(Y)-8 b(ou)150 4876 y(only)30 b(need)g(`)p
+Fs(configure.in)p Ft(')d(if)j(y)m(ou)g(w)m(an)m(t)i(to)f(c)m(hange)g
+(it)f(or)g(regenerate)i Fs(configure)c Ft(using)h(a)i(new)m(er)150
+4986 y(v)m(ersion)24 b(of)g(Auto)s(conf.)39 b(If)24 b(y)m(ou)h(do)f
+(this,)h(mak)m(e)g(sure)f(y)m(ou)h(are)f(using)f(Auto)s(conf)i(v)m
+(ersion)e(2.50)j(or)f(new)m(er.)275 5121 y(Y)-8 b(ou)29
+b(can)f(remo)m(v)m(e)i(the)f(program)g(binaries)d(and)i(ob)5
+b(ject)29 b(\014les)f(from)g(the)h(source)f(co)s(de)h(directory)f(b)m
+(y)150 5230 y(t)m(yping)j(`)p Fs(make)e(clean)p Ft('.)42
+b(T)-8 b(o)32 b(also)f(remo)m(v)m(e)h(the)g(\014les)e(that)h
+Fs(configure)e Ft(created)j(\(so)g(y)m(ou)g(can)f(compile)150
+5340 y(Bash)g(for)f(a)g(di\013eren)m(t)g(kind)f(of)h(computer\),)h(t)m
+(yp)s(e)g(`)p Fs(make)e(distclean)p Ft('.)p eop
+%%Page: 116 122
+116 121 bop 150 -116 a Ft(116)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+150 299 y Fr(10.2)68 b(Compilers)46 b(and)f(Options)275
+560 y Ft(Some)40 b(systems)g(require)e(un)m(usual)g(options)h(for)h
+(compilation)f(or)h(linking)d(that)j(the)g Fs(configure)150
+669 y Ft(script)29 b(do)s(es)i(not)g(kno)m(w)f(ab)s(out.)41
+b(Y)-8 b(ou)31 b(can)g(giv)m(e)g Fs(configure)d Ft(initial)g(v)-5
+b(alues)30 b(for)g(v)-5 b(ariables)29 b(b)m(y)i(setting)150
+779 y(them)21 b(in)e(the)i(en)m(vironmen)m(t.)37 b(Using)20
+b(a)h(Bourne-compatible)f(shell,)h(y)m(ou)g(can)g(do)f(that)i(on)e(the)
+h(command)150 888 y(line)29 b(lik)m(e)g(this:)390 1039
+y Fs(CC=c89)46 b(CFLAGS=-O2)f(LIBS=-lposix)g(./configure)275
+1191 y Ft(On)29 b(systems)h(that)h(ha)m(v)m(e)h(the)f
+Fs(env)e Ft(program,)h(y)m(ou)h(can)g(do)f(it)g(lik)m(e)g(this:)390
+1342 y Fs(env)47 b(CPPFLAGS=-I/usr/local/in)o(clud)o(e)42
+b(LDFLAGS=-s)j(./configure)275 1493 y Ft(The)29 b(con\014guration)h
+(pro)s(cess)g(uses)g(GCC)g(to)h(build)c(Bash)k(if)e(it)h(is)g(a)m(v)-5
+b(ailable.)150 1792 y Fr(10.3)68 b(Compiling)46 b(F)-11
+b(or)45 b(Multiple)g(Arc)l(hitectures)275 2052 y Ft(Y)-8
+b(ou)28 b(can)h(compile)e(Bash)i(for)f(more)g(than)g(one)h(kind)d(of)j
+(computer)f(at)h(the)g(same)f(time,)h(b)m(y)f(placing)150
+2162 y(the)39 b(ob)5 b(ject)39 b(\014les)f(for)g(eac)m(h)i(arc)m
+(hitecture)f(in)e(their)h(o)m(wn)g(directory)-8 b(.)66
+b(T)-8 b(o)39 b(do)f(this,)i(y)m(ou)f(m)m(ust)f(use)h(a)150
+2271 y(v)m(ersion)32 b(of)h Fs(make)f Ft(that)i(supp)s(orts)d(the)i
+Fs(VPATH)e Ft(v)-5 b(ariable,)33 b(suc)m(h)f(as)i(GNU)f
+Fs(make)p Ft(.)47 b Fs(cd)33 b Ft(to)g(the)g(directory)150
+2381 y(where)23 b(y)m(ou)g(w)m(an)m(t)h(the)f(ob)5 b(ject)24
+b(\014les)e(and)g(executables)i(to)g(go)f(and)g(run)f(the)h
+Fs(configure)d Ft(script)i(from)h(the)150 2491 y(source)j(directory)-8
+b(.)39 b(Y)-8 b(ou)26 b(ma)m(y)g(need)g(to)g(supply)e(the)h(`)p
+Fs(--srcdir=PATH)p Ft(')e(argumen)m(t)j(to)h(tell)d Fs(configure)150
+2600 y Ft(where)43 b(the)h(source)g(\014les)f(are.)82
+b Fs(configure)41 b Ft(automatically)j(c)m(hec)m(ks)h(for)f(the)g
+(source)g(co)s(de)g(in)f(the)150 2710 y(directory)30
+b(that)h Fs(configure)d Ft(is)h(in)g(and)h(in)f(`..'.)275
+2861 y(If)20 b(y)m(ou)h(ha)m(v)m(e)i(to)e(use)g(a)g Fs(make)f
+Ft(that)i(do)s(es)e(not)i(supp)s(orts)d(the)i Fs(VPATH)e
+Ft(v)-5 b(ariable,)22 b(y)m(ou)g(can)f(compile)f(Bash)150
+2971 y(for)33 b(one)h(arc)m(hitecture)g(at)g(a)g(time)f(in)f(the)i
+(source)g(co)s(de)f(directory)-8 b(.)50 b(After)34 b(y)m(ou)g(ha)m(v)m
+(e)h(installed)c(Bash)150 3080 y(for)f(one)h(arc)m(hitecture,)g(use)f
+(`)p Fs(make)g(distclean)p Ft(')e(b)s(efore)i(recon\014guring)f(for)h
+(another)g(arc)m(hitecture.)275 3231 y(Alternativ)m(ely)-8
+b(,)23 b(if)d(y)m(our)i(system)g(supp)s(orts)d(sym)m(b)s(olic)h(links,)
+i(y)m(ou)g(can)g(use)f(the)h(`)p Fs(support/mkclone)p
+Ft(')150 3341 y(script)g(to)i(create)g(a)f(build)d(tree)k(whic)m(h)e
+(has)g(sym)m(b)s(olic)g(links)e(bac)m(k)k(to)g(eac)m(h)g(\014le)e(in)g
+(the)h(source)g(directory)-8 b(.)150 3450 y(Here's)41
+b(an)f(example)h(that)g(creates)h(a)e(build)e(directory)i(in)f(the)i
+(curren)m(t)f(directory)g(from)g(a)h(source)150 3560
+y(directory)30 b(`)p Fs(/usr/gnu/src/bash-2.0)p Ft(':)390
+3711 y Fs(bash)47 b(/usr/gnu/src/bash-2.0/s)o(uppo)o(rt/)o(mkcl)o(one)
+41 b(-s)47 b(/usr/gnu/src/bash-2.0)42 b(.)150 3862 y
+Ft(The)c Fs(mkclone)e Ft(script)h(requires)g(Bash,)j(so)f(y)m(ou)f(m)m
+(ust)h(ha)m(v)m(e)g(already)f(built)e(Bash)i(for)g(at)h(least)g(one)150
+3972 y(arc)m(hitecture)31 b(b)s(efore)f(y)m(ou)h(can)f(create)i(build)c
+(directories)h(for)h(other)h(arc)m(hitectures.)150 4271
+y Fr(10.4)68 b(Installation)47 b(Names)275 4531 y Ft(By)36
+b(default,)g(`)p Fs(make)29 b(install)p Ft(')34 b(will)g(install)f(in)m
+(to)j(`)p Fs(/usr/local/bin)p Ft(',)e(`)p Fs(/usr/local/man)p
+Ft(',)g(etc.)150 4641 y(Y)-8 b(ou)39 b(can)g(sp)s(ecify)e(an)i
+(installation)d(pre\014x)h(other)i(than)g(`)p Fs(/usr/local)p
+Ft(')d(b)m(y)i(giving)g Fs(configure)e Ft(the)150 4751
+y(option)k(`)p Fs(--prefix=)p Fj(PATH)11 b Ft(',)41 b(or)g(b)m(y)f(sp)s
+(ecifying)f(a)j(v)-5 b(alue)40 b(for)h(the)g Fs(DESTDIR)e
+Ft(`)p Fs(make)p Ft(')h(v)-5 b(ariable)40 b(when)150
+4860 y(running)28 b(`)p Fs(make)h(install)p Ft('.)275
+5011 y(Y)-8 b(ou)71 b(can)h(sp)s(ecify)e(separate)i(installation)d
+(pre\014xes)h(for)h(arc)m(hitecture-sp)s(eci\014c)g(\014les)g(and)150
+5121 y(arc)m(hitecture-indep)s(enden)m(t)36 b(\014les.)61
+b(If)37 b(y)m(ou)h(giv)m(e)f Fs(configure)e Ft(the)j(option)f(`)p
+Fs(--exec-prefix=)p Fj(PATH)11 b Ft(',)150 5230 y(`)p
+Fs(make)29 b(install)p Ft(')63 b(will)e(use)i Fq(P)-8
+b(A)g(TH)75 b Ft(as)64 b(the)g(pre\014x)e(for)i(installing)d(programs)i
+(and)h(libraries.)150 5340 y(Do)s(cumen)m(tation)31 b(and)f(other)h
+(data)g(\014les)e(will)f(still)g(use)i(the)h(regular)e(pre\014x.)p
+eop
+%%Page: 117 123
+117 122 bop 150 -116 a Ft(Chapter)30 b(10:)41 b(Installing)28
+b(Bash)2356 b(117)150 299 y Fr(10.5)68 b(Sp)t(ecifying)45
+b(the)g(System)h(T)l(yp)t(e)275 539 y Ft(There)35 b(ma)m(y)h(b)s(e)f
+(some)h(features)g Fs(configure)d Ft(can)j(not)g(\014gure)f(out)g
+(automatically)-8 b(,)38 b(but)d(need)g(to)150 649 y(determine)g(b)m(y)
+h(the)h(t)m(yp)s(e)f(of)g(host)h(Bash)f(will)e(run)g(on.)58
+b(Usually)35 b Fs(configure)f Ft(can)i(\014gure)g(that)g(out,)150
+758 y(but)c(if)g(it)g(prin)m(ts)g(a)h(message)h(sa)m(ying)f(it)f(can)i
+(not)f(guess)g(the)g(host)g(t)m(yp)s(e,)h(giv)m(e)f(it)f(the)h(`)p
+Fs(--host=TYPE)p Ft(')150 868 y(option.)38 b(`)p Fs(TYPE)p
+Ft(')25 b(can)g(either)f(b)s(e)h(a)g(short)g(name)g(for)g(the)g(system)
+g(t)m(yp)s(e,)h(suc)m(h)f(as)g(`)p Fs(sun4)p Ft(',)h(or)f(a)g
+(canonical)150 977 y(name)30 b(with)f(three)i(\014elds:)39
+b(`)p Fs(CPU-COMPANY-SYSTEM)p Ft(')26 b(\(e.g.,)32 b(`)p
+Fs(i386-unknown-freebsd4.2)p Ft('\).)275 1108 y(See)e(the)h(\014le)e(`)
+p Fs(support/config.sub)p Ft(')d(for)k(the)h(p)s(ossible)d(v)-5
+b(alues)29 b(of)i(eac)m(h)g(\014eld.)150 1354 y Fr(10.6)68
+b(Sharing)45 b(Defaults)275 1594 y Ft(If)34 b(y)m(ou)i(w)m(an)m(t)g(to)
+g(set)g(default)e(v)-5 b(alues)35 b(for)g Fs(configure)e
+Ft(scripts)h(to)i(share,)g(y)m(ou)g(can)g(create)g(a)g(site)150
+1704 y(shell)46 b(script)g(called)h Fs(config.site)d
+Ft(that)k(giv)m(es)g(default)f(v)-5 b(alues)47 b(for)g(v)-5
+b(ariables)46 b(lik)m(e)h Fs(CC)p Ft(,)52 b Fs(cache_)150
+1813 y(file)p Ft(,)43 b(and)e Fs(prefix)p Ft(.)73 b Fs(configure)39
+b Ft(lo)s(oks)i(for)g(`)p Fs(PREFIX/share/config.site)p
+Ft(')35 b(if)41 b(it)g(exists,)j(then)150 1923 y(`)p
+Fs(PREFIX/etc/config.site)p Ft(')20 b(if)25 b(it)g(exists.)39
+b(Or,)26 b(y)m(ou)g(can)g(set)g(the)g Fs(CONFIG_SITE)c
+Ft(en)m(vironmen)m(t)j(v)-5 b(ari-)150 2033 y(able)39
+b(to)h(the)g(lo)s(cation)f(of)g(the)h(site)f(script.)66
+b(A)40 b(w)m(arning:)57 b(the)40 b(Bash)g Fs(configure)c
+Ft(lo)s(oks)j(for)g(a)h(site)150 2142 y(script,)30 b(but)f(not)i(all)e
+Fs(configure)f Ft(scripts)h(do.)150 2388 y Fr(10.7)68
+b(Op)t(eration)46 b(Con)l(trols)275 2628 y Fs(configure)27
+b Ft(recognizes)k(the)g(follo)m(wing)e(options)h(to)h(con)m(trol)f(ho)m
+(w)h(it)f(op)s(erates.)150 2780 y Fs(--cache-file=)p
+Fj(file)630 2890 y Ft(Use)35 b(and)g(sa)m(v)m(e)h(the)f(results)f(of)h
+(the)h(tests)f(in)f Fq(\014le)39 b Ft(instead)34 b(of)i(`)p
+Fs(./config.cache)p Ft('.)51 b(Set)630 2999 y Fq(\014le)35
+b Ft(to)c(`)p Fs(/dev/null)p Ft(')d(to)j(disable)e(cac)m(hing,)i(for)f
+(debugging)f Fs(configure)p Ft(.)150 3151 y Fs(--help)192
+b Ft(Prin)m(t)29 b(a)i(summary)e(of)i(the)f(options)g(to)h
+Fs(configure)p Ft(,)d(and)i(exit.)150 3303 y Fs(--quiet)150
+3412 y(--silent)150 3522 y(-q)384 b Ft(Do)31 b(not)g(prin)m(t)e
+(messages)i(sa)m(ying)f(whic)m(h)g(c)m(hec)m(ks)h(are)g(b)s(eing)e
+(made.)150 3674 y Fs(--srcdir=)p Fj(dir)630 3783 y Ft(Lo)s(ok)j(for)g
+(the)g(Bash)g(source)h(co)s(de)f(in)f(directory)g Fq(dir)p
+Ft(.)44 b(Usually)31 b Fs(configure)e Ft(can)j(deter-)630
+3893 y(mine)d(that)i(directory)f(automatically)-8 b(.)150
+4045 y Fs(--version)630 4154 y Ft(Prin)m(t)28 b(the)i(v)m(ersion)f(of)h
+(Auto)s(conf)f(used)g(to)h(generate)h(the)f Fs(configure)d
+Ft(script,)i(and)g(exit.)275 4306 y Fs(configure)34 b
+Ft(also)j(accepts)h(some)g(other,)h(not)e(widely)e(used,)j(b)s
+(oilerplate)d(options.)60 b(`)p Fs(configure)150 4415
+y(--help)p Ft(')29 b(prin)m(ts)g(the)h(complete)h(list.)150
+4661 y Fr(10.8)68 b(Optional)46 b(F)-11 b(eatures)275
+4902 y Ft(The)34 b(Bash)h Fs(configure)d Ft(has)j(a)g(n)m(um)m(b)s(er)f
+(of)h(`)p Fs(--enable-)p Fj(feature)11 b Ft(')30 b(options,)36
+b(where)f Fq(feature)40 b Ft(in-)150 5011 y(dicates)32
+b(an)g(optional)f(part)h(of)g(Bash.)45 b(There)32 b(are)g(also)g(sev)m
+(eral)g(`)p Fs(--with-)p Fj(package)11 b Ft(')29 b(options,)i(where)150
+5121 y Fq(pac)m(k)-5 b(age)35 b Ft(is)27 b(something)h(lik)m(e)g(`)p
+Fs(bash-malloc)p Ft(')d(or)j(`)p Fs(purify)p Ft('.)39
+b(T)-8 b(o)29 b(turn)e(o\013)h(the)h(default)e(use)h(of)g(a)h(pac)m(k-)
+150 5230 y(age,)43 b(use)d(`)p Fs(--without-)p Fj(package)11
+b Ft('.)63 b(T)-8 b(o)40 b(con\014gure)g(Bash)f(without)g(a)h(feature)g
+(that)g(is)f(enabled)f(b)m(y)150 5340 y(default,)30 b(use)g(`)p
+Fs(--disable-)p Fj(feature)11 b Ft('.)p eop
+%%Page: 118 124
+118 123 bop 150 -116 a Ft(118)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+275 299 y(Here)21 b(is)f(a)h(complete)g(list)f(of)h(the)g(`)p
+Fs(--enable-)p Ft(')e(and)h(`)p Fs(--with-)p Ft(')g(options)g(that)h
+(the)g(Bash)g Fs(configure)150 408 y Ft(recognizes.)150
+589 y Fs(--with-afs)630 698 y Ft(De\014ne)31 b(if)e(y)m(ou)i(are)f
+(using)f(the)i(Andrew)e(File)h(System)g(from)g(T)-8 b(ransarc.)150
+872 y Fs(--with-bash-malloc)630 981 y Ft(Use)40 b(the)f(Bash)h(v)m
+(ersion)f(of)g Fs(malloc)f Ft(in)g(`)p Fs(lib/malloc/malloc.c)p
+Ft('.)63 b(This)38 b(is)g(not)i(the)630 1091 y(same)34
+b Fs(malloc)f Ft(that)h(app)s(ears)f(in)g Fl(gnu)h Ft(lib)s(c,)f(but)g
+(an)h(older)f(v)m(ersion)g(deriv)m(ed)g(from)h(the)630
+1200 y(4.2)45 b Fl(bsd)d Fs(malloc)p Ft(.)79 b(This)41
+b Fs(malloc)h Ft(is)h(v)m(ery)h(fast,)j(but)c(w)m(astes)h(some)g(space)
+g(on)g(eac)m(h)630 1310 y(allo)s(cation.)39 b(This)27
+b(option)g(is)h(enabled)f(b)m(y)h(default.)39 b(The)28
+b(`)p Fs(NOTES)p Ft(')f(\014le)h(con)m(tains)g(a)h(list)e(of)630
+1419 y(systems)e(for)h(whic)m(h)e(this)g(should)f(b)s(e)i(turned)f
+(o\013,)j(and)e Fs(configure)e Ft(disables)g(this)h(option)630
+1529 y(automatically)30 b(for)g(a)h(n)m(um)m(b)s(er)e(of)i(systems.)150
+1702 y Fs(--with-curses)630 1812 y Ft(Use)h(the)h(curses)e(library)f
+(instead)h(of)i(the)f(termcap)g(library)-8 b(.)44 b(This)31
+b(should)f(b)s(e)h(supplied)630 1921 y(if)e(y)m(our)i(system)f(has)g
+(an)h(inadequate)f(or)g(incomplete)g(termcap)g(database.)150
+2095 y Fs(--with-gnu-malloc)630 2204 y Ft(A)g(synon)m(ym)g(for)g
+Fs(--with-bash-malloc)p Ft(.)150 2378 y Fs(--with-installed-readlin)o
+(e[=)p Fj(P)o(REFI)o(X)11 b Fs(])630 2487 y Ft(De\014ne)26
+b(this)e(to)i(mak)m(e)h(Bash)f(link)d(with)h(a)i(lo)s(cally-installed)c
+(v)m(ersion)j(of)h(Readline)e(rather)630 2597 y(than)38
+b(the)h(v)m(ersion)f(in)g(`)p Fs(lib/readline)p Ft('.)62
+b(This)37 b(w)m(orks)i(only)e(with)h(Readline)f(4.3)j(and)630
+2706 y(later)28 b(v)m(ersions.)39 b(If)28 b Fq(PREFIX)37
+b Ft(is)27 b Fs(yes)g Ft(or)h(not)g(supplied,)d Fs(configure)h
+Ft(uses)h(the)h(v)-5 b(alues)28 b(of)630 2816 y(the)d(mak)m(e)g(v)-5
+b(ariables)23 b Fs(includedir)f Ft(and)h Fs(libdir)p
+Ft(,)h(whic)m(h)g(are)g(sub)s(directories)e(of)j Fs(prefix)630
+2926 y Ft(b)m(y)32 b(default,)f(to)i(\014nd)d(the)i(installed)e(v)m
+(ersion)h(of)h(Readline)f(if)g(it)g(is)g(not)h(in)f(the)h(standard)630
+3035 y(system)j(include)d(and)i(library)e(directories.)52
+b(If)34 b Fq(PREFIX)43 b Ft(is)34 b Fs(no)p Ft(,)h(Bash)f(links)f(with)
+g(the)630 3145 y(v)m(ersion)k(in)f(`)p Fs(lib/readline)p
+Ft('.)58 b(If)37 b Fq(PREFIX)46 b Ft(is)37 b(set)h(to)g(an)m(y)f(other)
+h(v)-5 b(alue,)38 b Fs(configure)630 3254 y Ft(treats)27
+b(it)f(as)g(a)h(directory)f(pathname)g(and)f(lo)s(oks)h(for)g(the)g
+(installed)e(v)m(ersion)i(of)g(Readline)630 3364 y(in)33
+b(sub)s(directories)e(of)j(that)h(directory)f(\(include)e(\014les)h(in)
+g Fq(PREFIX)9 b Ft(/)p Fs(include)32 b Ft(and)i(the)630
+3473 y(library)28 b(in)h Fq(PREFIX)9 b Ft(/)p Fs(lib)p
+Ft(\).)150 3647 y Fs(--with-purify)630 3756 y Ft(De\014ne)23
+b(this)f(to)i(use)f(the)g(Purify)e(memory)i(allo)s(cation)f(c)m(hec)m
+(k)m(er)j(from)e(Rational)g(Soft)m(w)m(are.)150 3930
+y Fs(--enable-minimal-config)630 4039 y Ft(This)f(pro)s(duces)g(a)i
+(shell)e(with)g(minimal)f(features,)k(close)f(to)g(the)g(historical)e
+(Bourne)h(shell.)275 4219 y(There)g(are)i(sev)m(eral)f(`)p
+Fs(--enable-)p Ft(')e(options)i(that)g(alter)g(ho)m(w)h(Bash)f(is)f
+(compiled)g(and)g(link)m(ed,)h(rather)150 4329 y(than)30
+b(c)m(hanging)g(run-time)f(features.)150 4509 y Fs(--enable-largefile)
+630 4619 y Ft(Enable)75 b(supp)s(ort)g(for)h(large)g(\014les)f(\()p
+Fs(http://www.sas.com/standar)o(ds/l)o(arge)o(_)630 4728
+y(file/x_open.20Mar96.html)o Ft(\))23 b(if)k(the)h(op)s(erating)g
+(system)g(requires)f(sp)s(ecial)f(compiler)630 4838 y(options)44
+b(to)h(build)c(programs)j(whic)m(h)f(can)h(access)i(large)e(\014les.)81
+b(This)43 b(is)g(enabled)g(b)m(y)630 4948 y(default,)30
+b(if)f(the)i(op)s(erating)f(system)g(pro)m(vides)f(large)i(\014le)e
+(supp)s(ort.)150 5121 y Fs(--enable-profiling)630 5230
+y Ft(This)h(builds)e(a)k(Bash)g(binary)e(that)i(pro)s(duces)e
+(pro\014ling)f(information)h(to)j(b)s(e)d(pro)s(cessed)630
+5340 y(b)m(y)g Fs(gprof)f Ft(eac)m(h)j(time)e(it)g(is)f(executed.)p
+eop
+%%Page: 119 125
+119 124 bop 150 -116 a Ft(Chapter)30 b(10:)41 b(Installing)28
+b(Bash)2356 b(119)150 299 y Fs(--enable-static-link)630
+408 y Ft(This)36 b(causes)i(Bash)f(to)h(b)s(e)f(link)m(ed)f(statically)
+-8 b(,)40 b(if)c Fs(gcc)h Ft(is)f(b)s(eing)g(used.)61
+b(This)36 b(could)h(b)s(e)630 518 y(used)30 b(to)h(build)c(a)k(v)m
+(ersion)f(to)h(use)f(as)g(ro)s(ot's)h(shell.)275 663
+y(The)f(`)p Fs(minimal-config)p Ft(')d(option)j(can)h(b)s(e)f(used)f
+(to)j(disable)c(all)i(of)h(the)f(follo)m(wing)f(options,)i(but)e(it)150
+772 y(is)g(pro)s(cessed)h(\014rst,)g(so)h(individual)26
+b(options)j(ma)m(y)i(b)s(e)f(enabled)f(using)g(`)p Fs(enable-)p
+Fj(feature)11 b Ft('.)275 899 y(All)35 b(of)i(the)f(follo)m(wing)f
+(options)h(except)i(for)e(`)p Fs(disabled-builtins)p
+Ft(')d(and)j(`)p Fs(xpg-echo-default)p Ft(')150 1009
+y(are)26 b(enabled)f(b)m(y)h(default,)g(unless)f(the)h(op)s(erating)f
+(system)h(do)s(es)g(not)g(pro)m(vide)f(the)h(necessary)g(supp)s(ort.)
+150 1154 y Fs(--enable-alias)630 1263 y Ft(Allo)m(w)39
+b(alias)g(expansion)g(and)g(include)e(the)j Fs(alias)f
+Ft(and)g Fs(unalias)e Ft(builtins)g(\(see)j(Sec-)630
+1373 y(tion)30 b(6.6)h([Aliases],)g(page)g(71\).)150
+1518 y Fs(--enable-arith-for-comma)o(nd)630 1627 y Ft(Include)20
+b(supp)s(ort)h(for)g(the)i(alternate)f(form)g(of)g(the)g
+Fs(for)f Ft(command)h(that)h(b)s(eha)m(v)m(es)f(lik)m(e)g(the)630
+1737 y(C)30 b(language)h Fs(for)e Ft(statemen)m(t)j(\(see)g(Section)e
+(3.2.4.1)j([Lo)s(oping)c(Constructs],)i(page)g(9\).)150
+1881 y Fs(--enable-array-variables)630 1991 y Ft(Include)g(supp)s(ort)h
+(for)h(one-dimensional)e(arra)m(y)i(shell)f(v)-5 b(ariables)31
+b(\(see)j(Section)f(6.7)i([Ar-)630 2101 y(ra)m(ys],)c(page)g(72\).)150
+2245 y Fs(--enable-bang-history)630 2355 y Ft(Include)k(supp)s(ort)g
+(for)h Fs(csh)p Ft(-lik)m(e)f(history)h(substitution)e(\(see)j(Section)
+f(9.3)i([History)e(In-)630 2464 y(teraction],)c(page)f(111\).)150
+2609 y Fs(--enable-brace-expansion)630 2719 y Ft(Include)39
+b Fs(csh)p Ft(-lik)m(e)g(brace)h(expansion)f(\()i Fs(b{a,b}c)2445
+2715 y Fp(7!)2576 2719 y Fs(bac)30 b(bbc)39 b Ft(\).)71
+b(See)40 b(Section)g(3.5.1)630 2828 y([Brace)32 b(Expansion],)d(page)i
+(17,)h(for)e(a)g(complete)h(description.)150 2973 y Fs
+(--enable-command-timing)630 3082 y Ft(Include)42 b(supp)s(ort)g(for)h
+(recognizing)g Fs(time)g Ft(as)g(a)h(reserv)m(ed)g(w)m(ord)f(and)g(for)
+h(displa)m(ying)630 3192 y(timing)35 b(statistics)h(for)g(the)g(pip)s
+(eline)d(follo)m(wing)i Fs(time)g Ft(\(see)i(Section)f(3.2.2)i([Pip)s
+(elines],)630 3302 y(page)24 b(8\).)39 b(This)22 b(allo)m(ws)g(pip)s
+(elines)e(as)k(w)m(ell)e(as)i(shell)d(builtins)f(and)j(functions)f(to)i
+(b)s(e)e(timed.)150 3446 y Fs(--enable-cond-command)630
+3556 y Ft(Include)32 b(supp)s(ort)g(for)i(the)g Fs([[)f
+Ft(conditional)f(command.)51 b(\(see)34 b(Section)g(3.2.4.2)i([Condi-)
+630 3665 y(tional)30 b(Constructs],)g(page)h(10\).)150
+3810 y Fs(--enable-cond-regexp)630 3920 y Ft(Include)e(supp)s(ort)g
+(for)i(matc)m(hing)g(POSIX)e(regular)h(expressions)g(using)f(the)i(`)p
+Fs(=~)p Ft(')g(binary)630 4029 y(op)s(erator)25 b(in)e(the)i
+Fs([[)f Ft(conditional)e(command.)39 b(\(see)25 b(Section)g(3.2.4.2)i
+([Conditional)22 b(Con-)630 4139 y(structs],)31 b(page)g(10\).)150
+4284 y Fs(--enable-directory-stack)630 4393 y Ft(Include)h(supp)s(ort)h
+(for)h(a)g Fs(csh)p Ft(-lik)m(e)f(directory)g(stac)m(k)j(and)d(the)i
+Fs(pushd)p Ft(,)f Fs(popd)p Ft(,)g(and)f Fs(dirs)630
+4503 y Ft(builtins)27 b(\(see)k(Section)f(6.8)i([The)e(Directory)h
+(Stac)m(k],)h(page)f(73\).)150 4647 y Fs(--enable-disabled-builti)o(ns)
+630 4757 y Ft(Allo)m(w)38 b(builtin)d(commands)j(to)h(b)s(e)f(in)m(v)m
+(ok)m(ed)h(via)f(`)p Fs(builtin)29 b(xxx)p Ft(')37 b(ev)m(en)j(after)f
+Fs(xxx)e Ft(has)630 4867 y(b)s(een)31 b(disabled)e(using)h(`)p
+Fs(enable)e(-n)i(xxx)p Ft('.)43 b(See)32 b(Section)f(4.2)i([Bash)e
+(Builtins],)f(page)i(39,)630 4976 y(for)e(details)g(of)g(the)h
+Fs(builtin)d Ft(and)i Fs(enable)e Ft(builtin)f(commands.)150
+5121 y Fs(--enable-dparen-arithmet)o(ic)630 5230 y Ft(Include)41
+b(supp)s(ort)g(for)h(the)h Fs(\(\(...)o(\)\))f Ft(command)g(\(see)i
+(Section)e(3.2.4.2)j([Conditional)630 5340 y(Constructs],)30
+b(page)h(10\).)p eop
+%%Page: 120 126
+120 125 bop 150 -116 a Ft(120)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+150 299 y Fs(--enable-extended-glob)630 408 y Ft(Include)39
+b(supp)s(ort)f(for)i(the)h(extended)f(pattern)h(matc)m(hing)f(features)
+h(describ)s(ed)d(ab)s(o)m(v)m(e)630 518 y(under)29 b(Section)h(3.5.8.1)
+j([P)m(attern)e(Matc)m(hing],)h(page)f(23.)150 682 y
+Fs(--enable-help-builtin)630 792 y Ft(Include)23 b(the)i
+Fs(help)f Ft(builtin,)e(whic)m(h)i(displa)m(ys)e(help)i(on)g(shell)f
+(builtins)e(and)k(v)-5 b(ariables)23 b(\(see)630 902
+y(Section)30 b(4.2)i([Bash)e(Builtins],)f(page)i(39\).)150
+1066 y Fs(--enable-history)630 1176 y Ft(Include)d(command)h(history)g
+(and)g(the)h Fs(fc)f Ft(and)g Fs(history)e Ft(builtin)g(commands)i
+(\(see)h(Sec-)630 1285 y(tion)g(9.1)h([Bash)g(History)f(F)-8
+b(acilities],)30 b(page)h(109\).)150 1450 y Fs(--enable-job-control)630
+1559 y Ft(This)d(enables)i(the)g(job)g(con)m(trol)g(features)h(\(see)g
+(Chapter)f(7)g([Job)g(Con)m(trol],)g(page)h(79\),)h(if)630
+1669 y(the)f(op)s(erating)e(system)i(supp)s(orts)d(them.)150
+1833 y Fs(--enable-multibyte)630 1943 y Ft(This)g(enables)i(supp)s(ort)
+e(for)i(m)m(ultib)m(yte)f(c)m(haracters)i(if)e(the)h(op)s(erating)g
+(system)g(pro)m(vides)630 2052 y(the)h(necessary)f(supp)s(ort.)150
+2217 y Fs(--enable-net-redirection)o(s)630 2326 y Ft(This)20
+b(enables)h(the)h(sp)s(ecial)f(handling)e(of)j(\014lenames)f(of)h(the)g
+(form)f Fs(/dev/tcp/)p Fj(host)11 b Fs(/)p Fj(port)630
+2436 y Ft(and)29 b Fs(/dev/udp/)p Fj(host)11 b Fs(/)p
+Fj(port)34 b Ft(when)28 b(used)g(in)g(redirections)g(\(see)i(Section)f
+(3.6)h([Redirec-)630 2545 y(tions],)g(page)h(24\).)150
+2710 y Fs(--enable-process-substit)o(utio)o(n)630 2819
+y Ft(This)48 b(enables)i(pro)s(cess)g(substitution)e(\(see)j(Section)f
+(3.5.6)i([Pro)s(cess)e(Substitution],)630 2929 y(page)31
+b(22\))h(if)d(the)i(op)s(erating)e(system)i(pro)m(vides)e(the)i
+(necessary)g(supp)s(ort.)150 3093 y Fs(--enable-prompt-string-d)o(ecod)
+o(ing)630 3203 y Ft(T)-8 b(urn)46 b(on)h(the)h(in)m(terpretation)e(of)i
+(a)g(n)m(um)m(b)s(er)e(of)h(bac)m(kslash-escap)s(ed)g(c)m(haracters)i
+(in)630 3313 y(the)39 b Fs($PS1)p Ft(,)g Fs($PS2)p Ft(,)h
+Fs($PS3)p Ft(,)f(and)f Fs($PS4)f Ft(prompt)h(strings.)63
+b(See)39 b(Section)f(6.9)i([Prin)m(ting)d(a)630 3422
+y(Prompt],)30 b(page)h(75,)h(for)e(a)h(complete)g(list)e(of)h(prompt)g
+(string)f(escap)s(e)i(sequences.)150 3587 y Fs(--enable-progcomp)630
+3696 y Ft(Enable)c(the)h(programmable)f(completion)h(facilities)e
+(\(see)j(Section)f(8.6)h([Programmable)630 3806 y(Completion],)g(page)j
+(103\).)42 b(If)30 b(Readline)f(is)g(not)i(enabled,)e(this)h(option)g
+(has)g(no)g(e\013ect.)150 3970 y Fs(--enable-readline)630
+4080 y Ft(Include)d(supp)s(ort)g(for)h(command-line)f(editing)g(and)h
+(history)f(with)g(the)i(Bash)g(v)m(ersion)f(of)630 4189
+y(the)j(Readline)e(library)f(\(see)j(Chapter)f(8)g([Command)g(Line)f
+(Editing],)g(page)i(83\).)150 4354 y Fs(--enable-restricted)630
+4463 y Ft(Include)40 b(supp)s(ort)g(for)i(a)g Fq(restricted)f(shell)p
+Ft(.)73 b(If)42 b(this)e(is)h(enabled,)j(Bash,)h(when)c(called)630
+4573 y(as)f Fs(rbash)p Ft(,)h(en)m(ters)f(a)g(restricted)g(mo)s(de.)68
+b(See)40 b(Section)g(6.10)h([The)f(Restricted)g(Shell],)630
+4682 y(page)31 b(76,)h(for)e(a)g(description)f(of)h(restricted)g(mo)s
+(de.)150 4847 y Fs(--enable-select)630 4956 y Ft(Include)k(the)h
+Fs(select)f Ft(builtin,)f(whic)m(h)h(allo)m(ws)h(the)h(generation)f(of)
+h(simple)d(men)m(us)i(\(see)630 5066 y(Section)30 b(3.2.4.2)j
+([Conditional)28 b(Constructs],)j(page)g(10\).)150 5230
+y Fs(--enable-usg-echo-defaul)o(t)630 5340 y Ft(A)f(synon)m(ym)g(for)g
+Fs(--enable-xpg-echo-default)p Ft(.)p eop
+%%Page: 121 127
+121 126 bop 150 -116 a Ft(Chapter)30 b(10:)41 b(Installing)28
+b(Bash)2356 b(121)150 299 y Fs(--enable-xpg-echo-defaul)o(t)630
+408 y Ft(Mak)m(e)26 b(the)f Fs(echo)e Ft(builtin)f(expand)i(bac)m
+(kslash-escap)s(ed)g(c)m(haracters)i(b)m(y)f(default,)g(without)630
+518 y(requiring)39 b(the)i(`)p Fs(-e)p Ft(')g(option.)72
+b(This)40 b(sets)h(the)g(default)g(v)-5 b(alue)40 b(of)i(the)f
+Fs(xpg_echo)e Ft(shell)630 628 y(option)25 b(to)h Fs(on)p
+Ft(,)g(whic)m(h)f(mak)m(es)h(the)g(Bash)g Fs(echo)e Ft(b)s(eha)m(v)m(e)
+i(more)g(lik)m(e)f(the)h(v)m(ersion)f(sp)s(eci\014ed)630
+737 y(in)40 b(the)i(Single)e(Unix)g(Sp)s(eci\014cation,)j(v)m(ersion)f
+(2.)74 b(See)42 b(Section)f(4.2)i([Bash)f(Builtins],)630
+847 y(page)31 b(39,)h(for)e(a)g(description)f(of)h(the)h(escap)s(e)g
+(sequences)f(that)h Fs(echo)f Ft(recognizes.)275 1006
+y(The)23 b(\014le)h(`)p Fs(config-top.h)p Ft(')d(con)m(tains)k(C)f
+(Prepro)s(cessor)g(`)p Fs(#define)p Ft(')e(statemen)m(ts)k(for)f
+(options)e(whic)m(h)150 1116 y(are)35 b(not)g(settable)h(from)e
+Fs(configure)p Ft(.)51 b(Some)35 b(of)g(these)g(are)h(not)f(mean)m(t)g
+(to)h(b)s(e)e(c)m(hanged;)k(b)s(ew)m(are)d(of)150 1225
+y(the)h(consequences)g(if)e(y)m(ou)i(do.)55 b(Read)36
+b(the)g(commen)m(ts)g(asso)s(ciated)g(with)e(eac)m(h)j(de\014nition)c
+(for)i(more)150 1335 y(information)29 b(ab)s(out)h(its)g(e\013ect.)p
+eop
+%%Page: 122 128
+122 127 bop 150 -116 a Ft(122)2527 b(Bash)31 b(Reference)g(Man)m(ual)p
+eop
+%%Page: 123 129
+123 128 bop 150 -116 a Ft(App)s(endix)28 b(A:)i(Rep)s(orting)g(Bugs)
+2299 b(123)150 299 y Fo(App)t(endix)53 b(A)121 b(Rep)t(orting)53
+b(Bugs)275 533 y Ft(Please)34 b(rep)s(ort)f(all)g(bugs)h(y)m(ou)g
+(\014nd)f(in)g(Bash.)52 b(But)34 b(\014rst,)h(y)m(ou)f(should)e(mak)m
+(e)j(sure)f(that)g(it)g(really)150 643 y(is)h(a)h(bug,)h(and)e(that)h
+(it)g(app)s(ears)f(in)f(the)i(latest)h(v)m(ersion)e(of)h(Bash.)57
+b(The)35 b(latest)i(v)m(ersion)e(of)h(Bash)g(is)150 752
+y(alw)m(a)m(ys)31 b(a)m(v)-5 b(ailable)30 b(for)g(FTP)g(from)g
+Fs(ftp://ftp.gnu.org/pub/ba)o(sh/)o Ft(.)275 887 y(Once)41
+b(y)m(ou)g(ha)m(v)m(e)h(determined)e(that)i(a)f(bug)g(actually)f
+(exists,)k(use)d(the)g Fs(bashbug)e Ft(command)i(to)150
+996 y(submit)24 b(a)i(bug)g(rep)s(ort.)38 b(If)26 b(y)m(ou)g(ha)m(v)m
+(e)h(a)f(\014x,)h(y)m(ou)f(are)g(encouraged)h(to)f(mail)f(that)h(as)g
+(w)m(ell!)38 b(Suggestions)150 1106 y(and)20 b(`philosophical')f(bug)h
+(rep)s(orts)g(ma)m(y)i(b)s(e)f(mailed)e(to)j Fs(bug-bash@gnu.org)17
+b Ft(or)k(p)s(osted)f(to)i(the)f(Usenet)150 1215 y(newsgroup)29
+b Fs(gnu.bash.bug)p Ft(.)275 1350 y(All)g(bug)g(rep)s(orts)h(should)e
+(include:)225 1484 y Fp(\017)60 b Ft(The)30 b(v)m(ersion)g(n)m(um)m(b)s
+(er)f(of)h(Bash.)225 1619 y Fp(\017)60 b Ft(The)30 b(hardw)m(are)g(and)
+g(op)s(erating)f(system.)225 1753 y Fp(\017)60 b Ft(The)30
+b(compiler)f(used)g(to)i(compile)f(Bash.)225 1888 y Fp(\017)60
+b Ft(A)30 b(description)f(of)h(the)h(bug)f(b)s(eha)m(viour.)225
+2022 y Fp(\017)60 b Ft(A)30 b(short)h(script)e(or)h(`recip)s(e')g(whic)
+m(h)f(exercises)i(the)f(bug)g(and)g(ma)m(y)h(b)s(e)f(used)f(to)i(repro)
+s(duce)e(it.)150 2182 y Fs(bashbug)d Ft(inserts)h(the)i(\014rst)f
+(three)g(items)g(automatically)g(in)m(to)h(the)f(template)h(it)f(pro)m
+(vides)f(for)h(\014ling)f(a)150 2291 y(bug)j(rep)s(ort.)275
+2426 y(Please)g(send)g(all)f(rep)s(orts)h(concerning)f(this)h(man)m
+(ual)f(to)i Fs(chet@po.CWRU.Edu)p Ft(.)p eop
+%%Page: 124 130
+124 129 bop 150 -116 a Ft(124)2527 b(Bash)31 b(Reference)g(Man)m(ual)p
+eop
+%%Page: 125 131
+125 130 bop 150 -116 a Ft(App)s(endix)28 b(B:)j(Ma)5
+b(jor)31 b(Di\013erences)f(F)-8 b(rom)31 b(The)f(Bourne)g(Shell)1256
+b(125)150 141 y Fo(App)t(endix)53 b(B)128 b(Ma)9 b(jor)54
+b(Di\013erences)e(F)-13 b(rom)53 b(The)g(Bourne)1135
+299 y(Shell)275 524 y Ft(Bash)25 b(implemen)m(ts)e(essen)m(tially)h
+(the)i(same)f(grammar,)i(parameter)e(and)g(v)-5 b(ariable)24
+b(expansion,)h(redi-)150 633 y(rection,)j(and)e(quoting)g(as)h(the)h
+(Bourne)e(Shell.)38 b(Bash)27 b(uses)f(the)h Fl(posix)f
+Ft(1003.2)k(standard)c(as)h(the)g(sp)s(ec-)150 743 y(i\014cation)k(of)g
+(ho)m(w)h(these)g(features)g(are)g(to)g(b)s(e)f(implemen)m(ted.)43
+b(There)31 b(are)h(some)g(di\013erences)f(b)s(et)m(w)m(een)150
+853 y(the)h(traditional)e(Bourne)h(shell)e(and)i(Bash;)i(this)d
+(section)i(quic)m(kly)e(details)h(the)g(di\013erences)g(of)h(signif-)
+150 962 y(icance.)51 b(A)34 b(n)m(um)m(b)s(er)e(of)i(these)h
+(di\013erences)e(are)h(explained)e(in)g(greater)j(depth)e(in)f
+(previous)h(sections.)150 1072 y(This)c(section)h(uses)g(the)h(v)m
+(ersion)e(of)i Fs(sh)f Ft(included)d(in)i(SVR4.2)j(as)e(the)h(baseline)
+e(reference.)225 1204 y Fp(\017)60 b Ft(Bash)32 b(is)g
+Fl(posix)p Ft(-conforman)m(t,)h(ev)m(en)g(where)f(the)g
+Fl(posix)g Ft(sp)s(eci\014cation)f(di\013ers)g(from)h(traditional)330
+1314 y Fs(sh)e Ft(b)s(eha)m(vior)f(\(see)j(Section)e(6.11)i([Bash)e
+(POSIX)g(Mo)s(de],)h(page)g(76\).)225 1447 y Fp(\017)60
+b Ft(Bash)26 b(has)g(m)m(ulti-c)m(haracter)g(in)m(v)m(o)s(cation)g
+(options)g(\(see)g(Section)g(6.1)h([In)m(v)m(oking)f(Bash],)i(page)e
+(63\).)225 1579 y Fp(\017)60 b Ft(Bash)28 b(has)g(command-line)f
+(editing)f(\(see)j(Chapter)f(8)g([Command)f(Line)g(Editing],)h(page)g
+(83\))i(and)330 1689 y(the)h Fs(bind)e Ft(builtin.)225
+1822 y Fp(\017)60 b Ft(Bash)46 b(pro)m(vides)f(a)h(programmable)f(w)m
+(ord)g(completion)g(mec)m(hanism)g(\(see)i(Section)f(8.6)h([Pro-)330
+1931 y(grammable)20 b(Completion],)h(page)g(103\),)k(and)19
+b(t)m(w)m(o)j(builtin)17 b(commands,)22 b Fs(complete)c
+Ft(and)i Fs(compgen)p Ft(,)330 2041 y(to)31 b(manipulate)e(it.)225
+2173 y Fp(\017)60 b Ft(Bash)26 b(has)f(command)h(history)e(\(see)j
+(Section)e(9.1)i([Bash)f(History)g(F)-8 b(acilities],)26
+b(page)g(109\))i(and)d(the)330 2283 y Fs(history)k Ft(and)h
+Fs(fc)g Ft(builtins)d(to)k(manipulate)e(it.)41 b(The)30
+b(Bash)h(history)f(list)f(main)m(tains)g(timestamp)330
+2393 y(information)g(and)g(uses)h(the)h(v)-5 b(alue)30
+b(of)g(the)h Fs(HISTTIMEFORMAT)26 b Ft(v)-5 b(ariable)30
+b(to)h(displa)m(y)d(it.)225 2525 y Fp(\017)60 b Ft(Bash)48
+b(implemen)m(ts)f Fs(csh)p Ft(-lik)m(e)g(history)g(expansion)g(\(see)i
+(Section)f(9.3)i([History)e(In)m(teraction],)330 2635
+y(page)31 b(111\).)225 2768 y Fp(\017)60 b Ft(Bash)33
+b(has)g(one-dimensional)e(arra)m(y)i(v)-5 b(ariables)32
+b(\(see)i(Section)f(6.7)h([Arra)m(ys],)g(page)g(72\),)h(and)e(the)330
+2877 y(appropriate)38 b(v)-5 b(ariable)38 b(expansions)g(and)h
+(assignmen)m(t)g(syn)m(tax)h(to)g(use)f(them.)67 b(Sev)m(eral)39
+b(of)h(the)330 2987 y(Bash)32 b(builtins)c(tak)m(e)34
+b(options)d(to)i(act)g(on)e(arra)m(ys.)46 b(Bash)32 b(pro)m(vides)f(a)h
+(n)m(um)m(b)s(er)f(of)h(built-in)c(arra)m(y)330 3096
+y(v)-5 b(ariables.)225 3229 y Fp(\017)60 b Ft(The)37
+b Fs($'...)n(')g Ft(quoting)f(syn)m(tax,)k(whic)m(h)c(expands)g(ANSI-C)
+h(bac)m(kslash-escap)s(ed)g(c)m(haracters)h(in)330 3339
+y(the)26 b(text)h(b)s(et)m(w)m(een)g(the)g(single)d(quotes,)k(is)d
+(supp)s(orted)g(\(see)i(Section)f(3.1.2.4)i([ANSI-C)e(Quoting],)330
+3448 y(page)31 b(6\).)225 3581 y Fp(\017)60 b Ft(Bash)69
+b(supp)s(orts)e(the)i Fs($"...)n(")g Ft(quoting)f(syn)m(tax)h(to)h(do)e
+(lo)s(cale-sp)s(eci\014c)g(translation)g(of)330 3690
+y(the)d(c)m(haracters)i(b)s(et)m(w)m(een)f(the)f(double)f(quotes.)145
+b(The)65 b(`)p Fs(-D)p Ft(',)74 b(`)p Fs(--dump-strings)p
+Ft(',)d(and)330 3800 y(`)p Fs(--dump-po-strings)p Ft(')27
+b(in)m(v)m(o)s(cation)k(options)f(list)g(the)h(translatable)f(strings)g
+(found)g(in)g(a)h(script)330 3910 y(\(see)g(Section)g(3.1.2.5)h([Lo)s
+(cale)f(T)-8 b(ranslation],)30 b(page)h(7\).)225 4042
+y Fp(\017)60 b Ft(Bash)44 b(implemen)m(ts)e(the)h Fs(!)h
+Ft(k)m(eyw)m(ord)g(to)g(negate)h(the)f(return)e(v)-5
+b(alue)43 b(of)h(a)g(pip)s(eline)c(\(see)k(Sec-)330 4152
+y(tion)32 b(3.2.2)j([Pip)s(elines],)c(page)j(8\).)49
+b(V)-8 b(ery)33 b(useful)e(when)h(an)h Fs(if)f Ft(statemen)m(t)j(needs)
+d(to)i(act)g(only)e(if)330 4261 y(a)f(test)g(fails.)225
+4394 y Fp(\017)60 b Ft(Bash)34 b(has)g(the)g Fs(time)f
+Ft(reserv)m(ed)h(w)m(ord)g(and)f(command)h(timing)f(\(see)i(Section)f
+(3.2.2)h([Pip)s(elines],)330 4504 y(page)g(8\).)52 b(The)33
+b(displa)m(y)g(of)h(the)g(timing)e(statistics)i(ma)m(y)h(b)s(e)e(con)m
+(trolled)h(with)f(the)h Fs(TIMEFORMAT)330 4613 y Ft(v)-5
+b(ariable.)225 4746 y Fp(\017)60 b Ft(Bash)23 b(implemen)m(ts)e(the)j
+Fs(for)29 b(\(\()h Fj(expr1)39 b Fs(;)30 b Fj(expr2)40
+b Fs(;)30 b Fj(expr3)39 b Fs(\)\))23 b Ft(arithmetic)f(for)g(command,)j
+(sim-)330 4855 y(ilar)k(to)i(the)g(C)f(language)g(\(see)i(Section)e
+(3.2.4.1)j([Lo)s(oping)c(Constructs],)i(page)g(9\).)225
+4988 y Fp(\017)60 b Ft(Bash)31 b(includes)d(the)i Fs(select)f
+Ft(comp)s(ound)g(command,)i(whic)m(h)e(allo)m(ws)h(the)h(generation)f
+(of)h(simple)330 5098 y(men)m(us)f(\(see)h(Section)f(3.2.4.2)j
+([Conditional)28 b(Constructs],)j(page)g(10\).)225 5230
+y Fp(\017)60 b Ft(Bash)26 b(includes)e(the)j Fs([[)f
+Ft(comp)s(ound)f(command,)i(whic)m(h)e(mak)m(es)i(conditional)e
+(testing)h(part)g(of)h(the)330 5340 y(shell)i(grammar)h(\(see)h
+(Section)f(3.2.4.2)j([Conditional)c(Constructs],)h(page)h(10\).)p
+eop
+%%Page: 126 132
+126 131 bop 150 -116 a Ft(126)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+225 299 y Fp(\017)60 b Ft(Bash)27 b(includes)e(brace)j(expansion)e
+(\(see)i(Section)f(3.5.1)j([Brace)e(Expansion],)f(page)h(17\))h(and)d
+(tilde)330 408 y(expansion)j(\(see)j(Section)e(3.5.2)i([Tilde)d
+(Expansion],)g(page)i(18\).)225 537 y Fp(\017)60 b Ft(Bash)24
+b(implemen)m(ts)f(command)g(aliases)h(and)f(the)i Fs(alias)d
+Ft(and)i Fs(unalias)e Ft(builtins)e(\(see)25 b(Section)f(6.6)330
+647 y([Aliases],)30 b(page)h(71\).)225 776 y Fp(\017)60
+b Ft(Bash)32 b(pro)m(vides)f(shell)f(arithmetic,)i(the)g
+Fs(\(\()g Ft(comp)s(ound)e(command)i(\(see)h(Section)e(3.2.4.2)k([Con-)
+330 886 y(ditional)29 b(Constructs],)h(page)i(10\),)g(and)e(arithmetic)
+g(expansion)f(\(see)j(Section)e(6.5)i([Shell)d(Arith-)330
+995 y(metic],)i(page)g(70\).)225 1124 y Fp(\017)60 b
+Ft(V)-8 b(ariables)29 b(presen)m(t)g(in)f(the)h(shell's)f(initial)e(en)
+m(vironmen)m(t)j(are)h(automatically)f(exp)s(orted)g(to)h(c)m(hild)330
+1234 y(pro)s(cesses.)38 b(The)23 b(Bourne)g(shell)e(do)s(es)i(not)g
+(normally)e(do)i(this)f(unless)g(the)h(v)-5 b(ariables)22
+b(are)h(explicitly)330 1343 y(mark)m(ed)30 b(using)f(the)i
+Fs(export)e Ft(command.)225 1472 y Fp(\017)60 b Ft(Bash)36
+b(includes)e(the)i Fl(posix)f Ft(pattern)h(remo)m(v)-5
+b(al)36 b(`)p Fs(\045)p Ft(',)i(`)p Fs(#)p Ft(',)g(`)p
+Fs(\045\045)p Ft(')e(and)f(`)p Fs(##)p Ft(')h(expansions)f(to)h(remo)m
+(v)m(e)330 1582 y(leading)d(or)h(trailing)e(substrings)g(from)h(v)-5
+b(ariable)33 b(v)-5 b(alues)34 b(\(see)h(Section)f(3.5.3)h([Shell)e(P)m
+(arameter)330 1691 y(Expansion],)c(page)i(18\).)225 1820
+y Fp(\017)60 b Ft(The)46 b(expansion)f Fs(${#xx})p Ft(,)k(whic)m(h)c
+(returns)g(the)i(length)e(of)i Fs(${xx})p Ft(,)i(is)d(supp)s(orted)e
+(\(see)j(Sec-)330 1930 y(tion)30 b(3.5.3)i([Shell)d(P)m(arameter)i
+(Expansion],)e(page)j(18\).)225 2059 y Fp(\017)60 b Ft(The)30
+b(expansion)f Fs(${var:)p Fq(o\013set)r Fs([:)p Fq(length)p
+Fs(]})p Ft(,)g(whic)m(h)g(expands)h(to)h(the)g(substring)d(of)j
+Fs(var)p Ft('s)e(v)-5 b(alue)330 2168 y(of)43 b(length)f
+Fq(length)p Ft(,)k(b)s(eginning)40 b(at)k Fq(o\013set)p
+Ft(,)j(is)42 b(presen)m(t)h(\(see)g(Section)g(3.5.3)i([Shell)c(P)m
+(arameter)330 2278 y(Expansion],)29 b(page)i(18\).)225
+2407 y Fp(\017)60 b Ft(The)21 b(expansion)e Fs(${var/[/])p
+Fq(pattern)p Fs([/)p Fq(replacemen)m(t)r Fs(]})p Ft(,)i(whic)m(h)e
+(matc)m(hes)k Fq(pattern)e Ft(and)f(replaces)330 2516
+y(it)28 b(with)e Fq(replacemen)m(t)31 b Ft(in)c(the)h(v)-5
+b(alue)28 b(of)g Fs(var)p Ft(,)g(is)f(a)m(v)-5 b(ailable)28
+b(\(see)h(Section)e(3.5.3)j([Shell)d(P)m(arameter)330
+2626 y(Expansion],)i(page)i(18\).)225 2755 y Fp(\017)60
+b Ft(The)32 b(expansion)f Fs(${!)p Fj(prefix)p Fs(})p
+Fj(*)40 b Ft(expansion,)31 b(whic)m(h)g(expands)h(to)h(the)f(names)g
+(of)h(all)e(shell)f(v)-5 b(ari-)330 2865 y(ables)35 b(whose)h(names)g
+(b)s(egin)f(with)g Fq(pre\014x)p Ft(,)h(is)f(a)m(v)-5
+b(ailable)36 b(\(see)h(Section)f(3.5.3)h([Shell)e(P)m(arameter)330
+2974 y(Expansion],)29 b(page)i(18\).)225 3103 y Fp(\017)60
+b Ft(Bash)22 b(has)f Fq(indirect)h Ft(v)-5 b(ariable)20
+b(expansion)h(using)f Fs(${!word})f Ft(\(see)k(Section)e(3.5.3)j
+([Shell)c(P)m(arameter)330 3213 y(Expansion],)29 b(page)i(18\).)225
+3342 y Fp(\017)60 b Ft(Bash)31 b(can)f(expand)g(p)s(ositional)e
+(parameters)j(b)s(ey)m(ond)e Fs($9)h Ft(using)f Fs(${)p
+Fj(num)11 b Fs(})p Ft(.)225 3471 y Fp(\017)60 b Ft(The)27
+b Fl(posix)g Fs($\(\))g Ft(form)g(of)h(command)g(substitution)d(is)i
+(implemen)m(ted)f(\(see)j(Section)e(3.5.4)j([Com-)330
+3580 y(mand)38 b(Substitution],)i(page)g(21\),)j(and)38
+b(preferred)g(to)i(the)g(Bourne)f(shell's)f Fs(``)g Ft(\(whic)m(h)h(is)
+f(also)330 3690 y(implemen)m(ted)29 b(for)h(bac)m(kw)m(ards)h
+(compatibilit)m(y\).)225 3819 y Fp(\017)60 b Ft(Bash)31
+b(has)f(pro)s(cess)g(substitution)e(\(see)j(Section)f(3.5.6)i([Pro)s
+(cess)f(Substitution],)d(page)j(22\).)225 3948 y Fp(\017)60
+b Ft(Bash)55 b(automatically)g(assigns)g(v)-5 b(ariables)53
+b(that)j(pro)m(vide)e(information)g(ab)s(out)h(the)g(curren)m(t)330
+4057 y(user)40 b(\()p Fs(UID)p Ft(,)i Fs(EUID)p Ft(,)g(and)e
+Fs(GROUPS)p Ft(\),)h(the)g(curren)m(t)f(host)g(\()p Fs(HOSTTYPE)p
+Ft(,)h Fs(OSTYPE)p Ft(,)h Fs(MACHTYPE)p Ft(,)f(and)330
+4167 y Fs(HOSTNAME)p Ft(\),)55 b(and)c(the)g(instance)g(of)h(Bash)f
+(that)h(is)e(running)f(\()p Fs(BASH)p Ft(,)56 b Fs(BASH_VERSION)p
+Ft(,)e(and)330 4276 y Fs(BASH_VERSINFO)p Ft(\).)37 b(See)31
+b(Section)f(5.2)i([Bash)e(V)-8 b(ariables],)31 b(page)g(55,)g(for)f
+(details.)225 4405 y Fp(\017)60 b Ft(The)44 b Fs(IFS)f
+Ft(v)-5 b(ariable)43 b(is)g(used)g(to)i(split)d(only)h(the)h(results)f
+(of)i(expansion,)h(not)e(all)f(w)m(ords)h(\(see)330 4515
+y(Section)28 b(3.5.7)i([W)-8 b(ord)29 b(Splitting],)e(page)i(22\).)41
+b(This)27 b(closes)h(a)h(longstanding)e(shell)f(securit)m(y)i(hole.)225
+4644 y Fp(\017)60 b Ft(Bash)33 b(implemen)m(ts)f(the)h(full)e(set)j(of)
+f Fl(posix)f Ft(1003.2)k(\014lename)c(expansion)g(op)s(erators,)i
+(including)330 4753 y Fq(c)m(haracter)23 b(classes)p
+Ft(,)g Fq(equiv)-5 b(alence)21 b(classes)p Ft(,)i(and)e
+Fq(collating)f(sym)m(b)s(ols)k Ft(\(see)e(Section)f(3.5.8)i([Filename)
+330 4863 y(Expansion],)29 b(page)i(22\).)225 4992 y Fp(\017)60
+b Ft(Bash)35 b(implemen)m(ts)e(extended)i(pattern)g(matc)m(hing)g
+(features)g(when)f(the)h Fs(extglob)d Ft(shell)h(option)330
+5101 y(is)c(enabled)h(\(see)h(Section)f(3.5.8.1)j([P)m(attern)f(Matc)m
+(hing],)f(page)g(23\).)225 5230 y Fp(\017)60 b Ft(It)22
+b(is)f(p)s(ossible)f(to)j(ha)m(v)m(e)g(a)f(v)-5 b(ariable)21
+b(and)h(a)g(function)f(with)g(the)h(same)g(name;)j Fs(sh)d
+Ft(do)s(es)g(not)g(separate)330 5340 y(the)31 b(t)m(w)m(o)g(name)g
+(spaces.)p eop
+%%Page: 127 133
+127 132 bop 150 -116 a Ft(App)s(endix)28 b(B:)j(Ma)5
+b(jor)31 b(Di\013erences)f(F)-8 b(rom)31 b(The)f(Bourne)g(Shell)1256
+b(127)225 299 y Fp(\017)60 b Ft(Bash)30 b(functions)d(are)j(p)s
+(ermitted)e(to)i(ha)m(v)m(e)h(lo)s(cal)e(v)-5 b(ariables)28
+b(using)g(the)h Fs(local)f Ft(builtin,)f(and)h(th)m(us)330
+408 y(useful)h(recursiv)m(e)g(functions)g(ma)m(y)i(b)s(e)f(written)f
+(\(see)j(Section)e(4.2)h([Bash)g(Builtins],)d(page)k(39\).)225
+537 y Fp(\017)60 b Ft(V)-8 b(ariable)23 b(assignmen)m(ts)h(preceding)e
+(commands)i(a\013ect)h(only)e(that)h(command,)h(ev)m(en)f(builtins)d
+(and)330 647 y(functions)35 b(\(see)i(Section)f(3.7.4)i([En)m(vironmen)
+m(t],)g(page)f(30\).)60 b(In)35 b Fs(sh)p Ft(,)j(all)d(v)-5
+b(ariable)35 b(assignmen)m(ts)330 757 y(preceding)29
+b(commands)h(are)h(global)f(unless)e(the)j(command)f(is)g(executed)h
+(from)f(the)g(\014le)g(system.)225 886 y Fp(\017)60 b
+Ft(Bash)44 b(p)s(erforms)e(\014lename)h(expansion)f(on)i(\014lenames)f
+(sp)s(eci\014ed)f(as)i(op)s(erands)e(to)j(input)d(and)330
+995 y(output)30 b(redirection)f(op)s(erators)i(\(see)g(Section)f(3.6)i
+([Redirections],)e(page)h(24\).)225 1124 y Fp(\017)60
+b Ft(Bash)29 b(con)m(tains)g(the)g(`)p Fs(<>)p Ft(')f(redirection)g(op)
+s(erator,)h(allo)m(wing)f(a)h(\014le)f(to)h(b)s(e)f(op)s(ened)g(for)h
+(b)s(oth)f(read-)330 1234 y(ing)34 b(and)g(writing,)g(and)g(the)h(`)p
+Fs(&>)p Ft(')g(redirection)e(op)s(erator,)j(for)f(directing)e(standard)
+h(output)h(and)330 1343 y(standard)30 b(error)g(to)h(the)f(same)h
+(\014le)e(\(see)j(Section)e(3.6)h([Redirections],)f(page)i(24\).)225
+1472 y Fp(\017)60 b Ft(Bash)25 b(treats)h(a)f(n)m(um)m(b)s(er)e(of)i
+(\014lenames)f(sp)s(ecially)e(when)i(they)h(are)g(used)f(in)f
+(redirection)h(op)s(erators)330 1582 y(\(see)31 b(Section)g(3.6)g
+([Redirections],)f(page)h(24\).)225 1711 y Fp(\017)60
+b Ft(Bash)33 b(can)f(op)s(en)g(net)m(w)m(ork)i(connections)e(to)i
+(arbitrary)d(mac)m(hines)h(and)g(services)g(with)f(the)i(redi-)330
+1820 y(rection)d(op)s(erators)h(\(see)g(Section)f(3.6)i
+([Redirections],)e(page)h(24\).)225 1949 y Fp(\017)60
+b Ft(The)29 b Fs(noclobber)e Ft(option)i(is)g(a)m(v)-5
+b(ailable)29 b(to)h(a)m(v)m(oid)g(o)m(v)m(erwriting)f(existing)g
+(\014les)f(with)h(output)g(redi-)330 2059 y(rection)g(\(see)i(Section)e
+(4.3)h([The)g(Set)f(Builtin],)f(page)i(50\).)41 b(The)29
+b(`)p Fs(>|)p Ft(')h(redirection)e(op)s(erator)h(ma)m(y)330
+2168 y(b)s(e)h(used)f(to)i(o)m(v)m(erride)g Fs(noclobber)p
+Ft(.)225 2297 y Fp(\017)60 b Ft(The)34 b(Bash)g Fs(cd)g
+Ft(and)f Fs(pwd)g Ft(builtins)e(\(see)k(Section)f(4.1)h([Bourne)g
+(Shell)d(Builtins],)g(page)j(33\))h(eac)m(h)330 2407
+y(tak)m(e)c(`)p Fs(-L)p Ft(')e(and)g(`)p Fs(-P)p Ft(')g(options)g(to)h
+(switc)m(h)f(b)s(et)m(w)m(een)h(logical)f(and)f(ph)m(ysical)g(mo)s
+(des.)225 2536 y Fp(\017)60 b Ft(Bash)25 b(allo)m(ws)f(a)i(function)d
+(to)j(o)m(v)m(erride)f(a)h(builtin)21 b(with)j(the)h(same)g(name,)i
+(and)d(pro)m(vides)g(access)i(to)330 2645 y(that)34 b(builtin's)c
+(functionalit)m(y)h(within)g(the)i(function)f(via)h(the)g
+Fs(builtin)f Ft(and)g Fs(command)g Ft(builtins)330 2755
+y(\(see)f(Section)g(4.2)g([Bash)g(Builtins],)d(page)j(39\).)225
+2884 y Fp(\017)60 b Ft(The)35 b Fs(command)e Ft(builtin)f(allo)m(ws)j
+(selectiv)m(e)h(disabling)d(of)i(functions)f(when)h(command)g(lo)s
+(okup)f(is)330 2993 y(p)s(erformed)29 b(\(see)i(Section)f(4.2)i([Bash)f
+(Builtins],)d(page)j(39\).)225 3122 y Fp(\017)60 b Ft(Individual)20
+b(builtins)g(ma)m(y)25 b(b)s(e)e(enabled)g(or)h(disabled)e(using)g(the)
+i Fs(enable)f Ft(builtin)d(\(see)25 b(Section)f(4.2)330
+3232 y([Bash)31 b(Builtins],)d(page)j(39\).)225 3361
+y Fp(\017)60 b Ft(The)26 b(Bash)h Fs(exec)e Ft(builtin)e(tak)m(es)28
+b(additional)c(options)i(that)h(allo)m(w)f(users)f(to)j(con)m(trol)f
+(the)f(con)m(ten)m(ts)330 3471 y(of)35 b(the)f(en)m(vironmen)m(t)g
+(passed)g(to)h(the)g(executed)g(command,)h(and)d(what)i(the)f(zeroth)h
+(argumen)m(t)330 3580 y(to)c(the)g(command)f(is)f(to)i(b)s(e)f(\(see)h
+(Section)g(4.1)g([Bourne)f(Shell)f(Builtins],)f(page)j(33\).)225
+3709 y Fp(\017)60 b Ft(Shell)27 b(functions)h(ma)m(y)i(b)s(e)f(exp)s
+(orted)g(to)h(c)m(hildren)d(via)i(the)h(en)m(vironmen)m(t)f(using)f
+Fs(export)g(-f)h Ft(\(see)330 3819 y(Section)h(3.3)i([Shell)c(F)-8
+b(unctions],)31 b(page)g(13\).)225 3948 y Fp(\017)60
+b Ft(The)37 b(Bash)g Fs(export)p Ft(,)h Fs(readonly)p
+Ft(,)f(and)f Fs(declare)g Ft(builtins)e(can)j(tak)m(e)i(a)f(`)p
+Fs(-f)p Ft(')f(option)g(to)h(act)g(on)330 4057 y(shell)24
+b(functions,)h(a)i(`)p Fs(-p)p Ft(')e(option)g(to)i(displa)m(y)d(v)-5
+b(ariables)24 b(with)h(v)-5 b(arious)24 b(attributes)i(set)g(in)e(a)j
+(format)330 4167 y(that)g(can)f(b)s(e)f(used)h(as)g(shell)e(input,)i(a)
+g(`)p Fs(-n)p Ft(')g(option)f(to)i(remo)m(v)m(e)h(v)-5
+b(arious)25 b(v)-5 b(ariable)25 b(attributes,)i(and)330
+4276 y(`)p Fs(name=value)p Ft(')h(argumen)m(ts)j(to)g(set)g(v)-5
+b(ariable)29 b(attributes)h(and)g(v)-5 b(alues)29 b(sim)m(ultaneously)
+-8 b(.)225 4405 y Fp(\017)60 b Ft(The)42 b(Bash)h Fs(hash)f
+Ft(builtin)d(allo)m(ws)k(a)g(name)g(to)g(b)s(e)f(asso)s(ciated)i(with)d
+(an)i(arbitrary)e(\014lename,)330 4515 y(ev)m(en)30 b(when)e(that)h
+(\014lename)f(cannot)i(b)s(e)e(found)g(b)m(y)h(searc)m(hing)f(the)h
+Fs($PATH)p Ft(,)g(using)e(`)p Fs(hash)i(-p)p Ft(')g(\(see)330
+4624 y(Section)h(4.1)i([Bourne)e(Shell)e(Builtins],)g(page)k(33\).)225
+4753 y Fp(\017)60 b Ft(Bash)27 b(includes)d(a)k Fs(help)d
+Ft(builtin)f(for)i(quic)m(k)g(reference)i(to)f(shell)e(facilities)g
+(\(see)j(Section)f(4.2)h([Bash)330 4863 y(Builtins],)g(page)j(39\).)225
+4992 y Fp(\017)60 b Ft(The)42 b Fs(printf)g Ft(builtin)d(is)j(a)m(v)-5
+b(ailable)42 b(to)i(displa)m(y)d(formatted)i(output)g(\(see)h(Section)f
+(4.2)h([Bash)330 5101 y(Builtins],)28 b(page)j(39\).)225
+5230 y Fp(\017)60 b Ft(The)26 b(Bash)h Fs(read)f Ft(builtin)d(\(see)28
+b(Section)f(4.2)h([Bash)f(Builtins],)e(page)j(39\))g(will)c(read)j(a)g
+(line)e(ending)330 5340 y(in)g(`)p Fs(\\)p Ft(')i(with)e(the)h(`)p
+Fs(-r)p Ft(')h(option,)g(and)e(will)f(use)i(the)h Fs(REPLY)e
+Ft(v)-5 b(ariable)25 b(as)i(a)f(default)g(if)f(no)i(non-option)p
+eop
+%%Page: 128 134
+128 133 bop 150 -116 a Ft(128)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+330 299 y(argumen)m(ts)g(are)h(supplied.)40 b(The)30
+b(Bash)i Fs(read)e Ft(builtin)d(also)32 b(accepts)g(a)g(prompt)e
+(string)g(with)g(the)330 408 y(`)p Fs(-p)p Ft(')35 b(option)f(and)g
+(will)e(use)j(Readline)e(to)j(obtain)e(the)h(line)e(when)h(giv)m(en)h
+(the)g(`)p Fs(-e)p Ft(')g(option.)53 b(The)330 518 y
+Fs(read)31 b Ft(builtin)e(also)k(has)f(additional)e(options)i(to)h(con)
+m(trol)g(input:)43 b(the)32 b(`)p Fs(-s)p Ft(')h(option)e(will)f(turn)i
+(o\013)330 628 y(ec)m(hoing)37 b(of)f(input)e(c)m(haracters)k(as)e
+(they)h(are)f(read,)i(the)e(`)p Fs(-t)p Ft(')g(option)g(will)e(allo)m
+(w)h Fs(read)g Ft(to)i(time)330 737 y(out)c(if)f(input)f(do)s(es)h(not)
+h(arriv)m(e)f(within)f(a)i(sp)s(eci\014ed)e(n)m(um)m(b)s(er)g(of)i
+(seconds,)h(the)f(`)p Fs(-n)p Ft(')f(option)h(will)330
+847 y(allo)m(w)27 b(reading)f(only)h(a)h(sp)s(eci\014ed)d(n)m(um)m(b)s
+(er)h(of)i(c)m(haracters)h(rather)e(than)g(a)h(full)d(line,)i(and)f
+(the)i(`)p Fs(-d)p Ft(')330 956 y(option)i(will)e(read)i(un)m(til)e(a)j
+(particular)e(c)m(haracter)j(rather)e(than)g(newline.)225
+1096 y Fp(\017)60 b Ft(The)33 b Fs(return)e Ft(builtin)f(ma)m(y)j(b)s
+(e)g(used)f(to)i(ab)s(ort)f(execution)g(of)g(scripts)f(executed)i(with)
+e(the)h Fs(.)g Ft(or)330 1205 y Fs(source)c Ft(builtins)d(\(see)32
+b(Section)e(4.1)h([Bourne)g(Shell)d(Builtins],)g(page)j(33\).)225
+1345 y Fp(\017)60 b Ft(Bash)43 b(includes)e(the)i Fs(shopt)f
+Ft(builtin,)h(for)g(\014ner)f(con)m(trol)i(of)f(shell)f(optional)g
+(capabilities)f(\(see)330 1455 y(Section)33 b(4.2)h([Bash)f(Builtins],)
+f(page)h(39\),)i(and)e(allo)m(ws)f(these)h(options)g(to)g(b)s(e)g(set)g
+(and)g(unset)f(at)330 1564 y(shell)d(in)m(v)m(o)s(cation)h(\(see)h
+(Section)f(6.1)i([In)m(v)m(oking)e(Bash],)h(page)h(63\).)225
+1704 y Fp(\017)60 b Ft(Bash)23 b(has)f(m)m(uc)m(h)g(more)h(optional)f
+(b)s(eha)m(vior)f(con)m(trollable)h(with)f(the)i Fs(set)e
+Ft(builtin)e(\(see)24 b(Section)e(4.3)330 1813 y([The)30
+b(Set)h(Builtin],)d(page)j(50\).)225 1953 y Fp(\017)60
+b Ft(The)31 b(`)p Fs(-x)p Ft(')g(\()p Fs(xtrace)p Ft(\))g(option)g
+(displa)m(ys)e(commands)j(other)f(than)h(simple)d(commands)i(when)g(p)s
+(er-)330 2062 y(forming)e(an)h(execution)h(trace)g(\(see)h(Section)e
+(4.3)h([The)g(Set)f(Builtin],)e(page)k(50\).)225 2202
+y Fp(\017)60 b Ft(The)28 b Fs(test)g Ft(builtin)e(\(see)k(Section)e
+(4.1)i([Bourne)f(Shell)e(Builtins],)g(page)j(33\))g(is)e(sligh)m(tly)f
+(di\013eren)m(t,)330 2311 y(as)c(it)f(implemen)m(ts)e(the)j
+Fl(posix)f Ft(algorithm,)h(whic)m(h)e(sp)s(eci\014es)g(the)i(b)s(eha)m
+(vior)e(based)h(on)h(the)f(n)m(um)m(b)s(er)330 2421 y(of)31
+b(argumen)m(ts.)225 2560 y Fp(\017)60 b Ft(Bash)31 b(includes)e(the)j
+Fs(caller)d Ft(builtin,)g(whic)m(h)h(displa)m(ys)f(the)i(con)m(text)i
+(of)f(an)m(y)g(activ)m(e)g(subroutine)330 2670 y(call)26
+b(\(a)h(shell)d(function)i(or)g(a)h(script)e(executed)i(with)e(the)i
+Fs(.)f Ft(or)g Fs(source)f Ft(builtins\).)36 b(This)25
+b(supp)s(orts)330 2780 y(the)31 b(bash)e(debugger.)225
+2919 y Fp(\017)60 b Ft(The)42 b Fs(trap)f Ft(builtin)e(\(see)44
+b(Section)e(4.1)i([Bourne)e(Shell)e(Builtins],)k(page)f(33\))h(allo)m
+(ws)e(a)g Fs(DEBUG)330 3029 y Ft(pseudo-signal)36 b(sp)s
+(eci\014cation,)i(similar)d(to)j Fs(EXIT)p Ft(.)62 b(Commands)36
+b(sp)s(eci\014ed)g(with)g(a)i Fs(DEBUG)e Ft(trap)330
+3138 y(are)k(executed)g(b)s(efore)f(ev)m(ery)h(simple)d(command,)42
+b Fs(for)c Ft(command,)k Fs(case)c Ft(command,)k Fs(select)330
+3248 y Ft(command,)35 b(ev)m(ery)g(arithmetic)e Fs(for)g
+Ft(command,)i(and)f(b)s(efore)g(the)g(\014rst)f(command)h(executes)h
+(in)330 3357 y(a)29 b(shell)e(function.)39 b(The)28 b
+Fs(DEBUG)g Ft(trap)g(is)g(not)h(inherited)d(b)m(y)j(shell)e(functions)g
+(unless)g(the)i(function)330 3467 y(has)35 b(b)s(een)g(giv)m(en)h(the)g
+Fs(trace)e Ft(attribute)h(or)h(the)g Fs(functrace)d Ft(option)i(has)g
+(b)s(een)g(enabled)f(using)330 3577 y(the)28 b Fs(shopt)e
+Ft(builtin.)36 b(The)27 b Fs(extdebug)f Ft(shell)g(option)h(has)g
+(additional)e(e\013ects)k(on)f(the)g Fs(DEBUG)e Ft(trap.)330
+3716 y(The)21 b Fs(trap)e Ft(builtin)f(\(see)k(Section)f(4.1)h([Bourne)
+f(Shell)e(Builtins],)i(page)h(33\))g(allo)m(ws)e(an)h
+Fs(ERR)f Ft(pseudo-)330 3826 y(signal)28 b(sp)s(eci\014cation,)h
+(similar)e(to)j Fs(EXIT)f Ft(and)g Fs(DEBUG)p Ft(.)39
+b(Commands)28 b(sp)s(eci\014ed)g(with)g(an)h Fs(ERR)g
+Ft(trap)330 3935 y(are)40 b(executed)g(after)g(a)f(simple)f(command)h
+(fails,)h(with)e(a)i(few)f(exceptions.)67 b(The)39 b
+Fs(ERR)g Ft(trap)g(is)330 4045 y(not)g(inherited)d(b)m(y)j(shell)e
+(functions)g(unless)g(the)i Fs(-o)29 b(errtrace)37 b
+Ft(option)h(to)h(the)g Fs(set)f Ft(builtin)d(is)330 4154
+y(enabled.)330 4294 y(The)j Fs(trap)g Ft(builtin)e(\(see)j(Section)g
+(4.1)h([Bourne)f(Shell)e(Builtins],)h(page)i(33\))g(allo)m(ws)e(a)i
+Fs(RETURN)330 4403 y Ft(pseudo-signal)33 b(sp)s(eci\014cation,)j
+(similar)c(to)k Fs(EXIT)e Ft(and)g Fs(DEBUG)p Ft(.)54
+b(Commands)34 b(sp)s(eci\014ed)f(with)h(an)330 4513 y
+Fs(RETURN)39 b Ft(trap)i(are)g(executed)h(b)s(efore)e(execution)h
+(resumes)f(after)h(a)g(shell)e(function)h(or)h(a)g(shell)330
+4623 y(script)35 b(executed)h(with)f Fs(.)g Ft(or)h Fs(source)e
+Ft(returns.)56 b(The)35 b Fs(RETURN)f Ft(trap)i(is)f(not)h(inherited)d
+(b)m(y)j(shell)330 4732 y(functions.)225 4872 y Fp(\017)60
+b Ft(The)30 b(Bash)g Fs(type)f Ft(builtin)e(is)i(more)h(extensiv)m(e)h
+(and)e(giv)m(es)i(more)f(information)f(ab)s(out)h(the)g(names)330
+4981 y(it)g(\014nds)f(\(see)i(Section)f(4.2)i([Bash)e(Builtins],)f
+(page)i(39\).)225 5121 y Fp(\017)60 b Ft(The)34 b(Bash)h
+Fs(umask)e Ft(builtin)e(p)s(ermits)i(a)h(`)p Fs(-p)p
+Ft(')h(option)f(to)h(cause)g(the)g(output)f(to)h(b)s(e)f(displa)m(y)m
+(ed)f(in)330 5230 y(the)i(form)g(of)g(a)h Fs(umask)e
+Ft(command)h(that)g(ma)m(y)h(b)s(e)f(reused)f(as)h(input)f(\(see)i
+(Section)f(4.1)h([Bourne)330 5340 y(Shell)28 b(Builtins],)g(page)k
+(33\).)p eop
+%%Page: 129 135
+129 134 bop 150 -116 a Ft(App)s(endix)28 b(B:)j(Ma)5
+b(jor)31 b(Di\013erences)f(F)-8 b(rom)31 b(The)f(Bourne)g(Shell)1256
+b(129)225 299 y Fp(\017)60 b Ft(Bash)34 b(implemen)m(ts)f(a)i
+Fs(csh)p Ft(-lik)m(e)e(directory)g(stac)m(k,)k(and)d(pro)m(vides)f(the)
+h Fs(pushd)p Ft(,)g Fs(popd)p Ft(,)g(and)g Fs(dirs)330
+408 y Ft(builtins)d(to)36 b(manipulate)d(it)i(\(see)g(Section)g(6.8)h
+([The)f(Directory)g(Stac)m(k],)j(page)d(73\).)56 b(Bash)35
+b(also)330 518 y(mak)m(es)c(the)g(directory)f(stac)m(k)h(visible)d(as)j
+(the)f(v)-5 b(alue)30 b(of)h(the)f Fs(DIRSTACK)f Ft(shell)f(v)-5
+b(ariable.)225 646 y Fp(\017)60 b Ft(Bash)28 b(in)m(terprets)g(sp)s
+(ecial)f(bac)m(kslash-escap)s(ed)h(c)m(haracters)h(in)e(the)i(prompt)e
+(strings)g(when)g(in)m(ter-)330 756 y(activ)m(e)32 b(\(see)f(Section)f
+(6.9)i([Prin)m(ting)c(a)j(Prompt],)g(page)g(75\).)225
+885 y Fp(\017)60 b Ft(The)46 b(Bash)h(restricted)f(mo)s(de)g(is)g(more)
+g(useful)f(\(see)i(Section)g(6.10)h([The)e(Restricted)h(Shell],)330
+994 y(page)31 b(76\);)h(the)f(SVR4.2)g(shell)d(restricted)i(mo)s(de)g
+(is)g(to)s(o)h(limited.)225 1123 y Fp(\017)60 b Ft(The)30
+b Fs(disown)f Ft(builtin)e(can)k(remo)m(v)m(e)h(a)f(job)f(from)g(the)h
+(in)m(ternal)e(shell)g(job)h(table)h(\(see)g(Section)g(7.2)330
+1232 y([Job)i(Con)m(trol)g(Builtins],)e(page)j(80\))h(or)e(suppress)e
+(the)i(sending)f(of)h Fs(SIGHUP)e Ft(to)j(a)g(job)f(when)f(the)330
+1342 y(shell)d(exits)h(as)g(the)h(result)e(of)i(a)f Fs(SIGHUP)p
+Ft(.)225 1470 y Fp(\017)60 b Ft(The)28 b(SVR4.2)h(shell)d(has)i(t)m(w)m
+(o)i(privilege-related)c(builtins)f(\()p Fs(mldmode)h
+Ft(and)i Fs(priv)p Ft(\))f(not)i(presen)m(t)f(in)330
+1580 y(Bash.)225 1708 y Fp(\017)60 b Ft(Bash)31 b(do)s(es)f(not)g(ha)m
+(v)m(e)i(the)e Fs(stop)g Ft(or)g Fs(newgrp)f Ft(builtins.)225
+1837 y Fp(\017)60 b Ft(Bash)31 b(do)s(es)f(not)g(use)g(the)h
+Fs(SHACCT)d Ft(v)-5 b(ariable)30 b(or)g(p)s(erform)f(shell)g(accoun)m
+(ting.)225 1965 y Fp(\017)60 b Ft(The)30 b(SVR4.2)h Fs(sh)f
+Ft(uses)g(a)g Fs(TIMEOUT)f Ft(v)-5 b(ariable)29 b(lik)m(e)h(Bash)g
+(uses)g Fs(TMOUT)p Ft(.)150 2112 y(More)h(features)g(unique)d(to)j
+(Bash)g(ma)m(y)g(b)s(e)f(found)f(in)g(Chapter)g(6)i([Bash)g(F)-8
+b(eatures],)32 b(page)f(63.)150 2351 y Fr(B.1)67 b(Implemen)l(tation)48
+b(Di\013erences)e(F)-11 b(rom)44 b(The)h(SVR4.2)g(Shell)275
+2589 y Ft(Since)38 b(Bash)i(is)e(a)i(completely)g(new)f(implemen)m
+(tation,)h(it)f(do)s(es)h(not)f(su\013er)g(from)g(man)m(y)h(of)g(the)
+150 2699 y(limitations)28 b(of)j(the)f(SVR4.2)h(shell.)39
+b(F)-8 b(or)31 b(instance:)225 2827 y Fp(\017)60 b Ft(Bash)32
+b(do)s(es)f(not)h(fork)f(a)h(subshell)c(when)j(redirecting)f(in)m(to)i
+(or)f(out)h(of)g(a)g(shell)d(con)m(trol)j(structure)330
+2937 y(suc)m(h)e(as)h(an)f Fs(if)g Ft(or)g Fs(while)f
+Ft(statemen)m(t.)225 3065 y Fp(\017)60 b Ft(Bash)29 b(do)s(es)f(not)h
+(allo)m(w)f(un)m(balanced)g(quotes.)41 b(The)28 b(SVR4.2)h(shell)e
+(will)f(silen)m(tly)h(insert)h(a)h(needed)330 3175 y(closing)e(quote)i
+(at)f Fs(EOF)f Ft(under)g(certain)g(circumstances.)40
+b(This)26 b(can)i(b)s(e)g(the)g(cause)g(of)g(some)h(hard-)330
+3285 y(to-\014nd)h(errors.)225 3413 y Fp(\017)60 b Ft(The)45
+b(SVR4.2)h(shell)d(uses)i(a)g(baro)s(que)g(memory)g(managemen)m(t)i(sc)
+m(heme)e(based)g(on)g(trapping)330 3523 y Fs(SIGSEGV)p
+Ft(.)57 b(If)35 b(the)i(shell)d(is)i(started)h(from)e(a)i(pro)s(cess)f
+(with)f Fs(SIGSEGV)f Ft(blo)s(c)m(k)m(ed)j(\(e.g.,)i(b)m(y)d(using)330
+3632 y(the)31 b Fs(system\(\))d Ft(C)i(library)e(function)h(call\),)h
+(it)g(misb)s(eha)m(v)m(es)g(badly)-8 b(.)225 3761 y Fp(\017)60
+b Ft(In)26 b(a)i(questionable)e(attempt)j(at)f(securit)m(y)-8
+b(,)28 b(the)f(SVR4.2)h(shell,)e(when)h(in)m(v)m(ok)m(ed)g(without)g
+(the)g(`)p Fs(-p)p Ft(')330 3870 y(option,)38 b(will)33
+b(alter)k(its)e(real)h(and)g(e\013ectiv)m(e)i Fl(uid)e
+Ft(and)g Fl(gid)h Ft(if)e(they)i(are)f(less)g(than)g(some)h(magic)330
+3980 y(threshold)29 b(v)-5 b(alue,)30 b(commonly)g(100.)42
+b(This)28 b(can)j(lead)f(to)h(unexp)s(ected)f(results.)225
+4108 y Fp(\017)60 b Ft(The)30 b(SVR4.2)h(shell)e(do)s(es)h(not)g(allo)m
+(w)g(users)g(to)h(trap)f Fs(SIGSEGV)p Ft(,)f Fs(SIGALRM)p
+Ft(,)f(or)j Fs(SIGCHLD)p Ft(.)225 4237 y Fp(\017)60 b
+Ft(The)34 b(SVR4.2)h(shell)e(do)s(es)i(not)f(allo)m(w)h(the)f
+Fs(IFS)p Ft(,)h Fs(MAILCHECK)p Ft(,)f Fs(PATH)p Ft(,)h
+Fs(PS1)p Ft(,)g(or)f Fs(PS2)g Ft(v)-5 b(ariables)33 b(to)330
+4346 y(b)s(e)d(unset.)225 4475 y Fp(\017)60 b Ft(The)30
+b(SVR4.2)h(shell)e(treats)i(`)p Fs(^)p Ft(')f(as)h(the)g(undo)s(cumen)m
+(ted)e(equiv)-5 b(alen)m(t)29 b(of)i(`)p Fs(|)p Ft('.)225
+4603 y Fp(\017)60 b Ft(Bash)37 b(allo)m(ws)f(m)m(ultiple)e(option)i
+(argumen)m(ts)h(when)e(it)h(is)g(in)m(v)m(ok)m(ed)h(\()p
+Fs(-x)30 b(-v)p Ft(\);)40 b(the)c(SVR4.2)i(shell)330
+4713 y(allo)m(ws)32 b(only)g(one)h(option)f(argumen)m(t)h(\()p
+Fs(-xv)p Ft(\).)47 b(In)32 b(fact,)i(some)f(v)m(ersions)f(of)h(the)g
+(shell)d(dump)h(core)330 4822 y(if)e(the)i(second)f(argumen)m(t)h(b)s
+(egins)e(with)g(a)i(`)p Fs(-)p Ft('.)225 4951 y Fp(\017)60
+b Ft(The)35 b(SVR4.2)i(shell)c(exits)j(a)g(script)f(if)f(an)m(y)i
+(builtin)c(fails;)37 b(Bash)f(exits)g(a)g(script)e(only)h(if)g(one)h
+(of)330 5060 y(the)d Fl(posix)g Ft(1003.2)i(sp)s(ecial)d(builtins)d
+(fails,)k(and)f(only)h(for)f(certain)h(failures,)g(as)g(en)m(umerated)g
+(in)330 5170 y(the)e Fl(posix)e Ft(1003.2)k(standard.)225
+5298 y Fp(\017)60 b Ft(The)30 b(SVR4.2)h(shell)e(b)s(eha)m(v)m(es)h
+(di\013eren)m(tly)f(when)h(in)m(v)m(ok)m(ed)h(as)f Fs(jsh)g
+Ft(\(it)g(turns)f(on)h(job)g(con)m(trol\).)p eop
+%%Page: 130 136
+130 135 bop 150 -116 a Ft(130)2527 b(Bash)31 b(Reference)g(Man)m(ual)p
+eop
+%%Page: 131 137
+131 136 bop 150 -116 a Ft(App)s(endix)28 b(C:)i(Cop)m(ying)f(This)g
+(Man)m(ual)2062 b(131)150 299 y Fo(App)t(endix)53 b(C)126
+b(Cop)l(ying)52 b(This)i(Man)l(ual)150 690 y Fr(C.1)68
+b(GNU)45 b(F)-11 b(ree)45 b(Do)t(cumen)l(tation)h(License)1396
+909 y Ft(V)-8 b(ersion)30 b(1.2,)i(No)m(v)m(em)m(b)s(er)g(2002)390
+1052 y(Cop)m(yrigh)m(t)842 1049 y(c)817 1052 y Fp(\015)e
+Ft(2000,2001,2002)36 b(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8
+b(oundation,)31 b(Inc.)390 1161 y(59)g(T)-8 b(emple)30
+b(Place,)h(Suite)e(330,)j(Boston,)g(MA)61 b(02111-1307,)35
+b(USA)390 1380 y(Ev)m(ery)m(one)c(is)f(p)s(ermitted)f(to)i(cop)m(y)g
+(and)f(distribute)e(v)m(erbatim)i(copies)390 1490 y(of)h(this)e
+(license)g(do)s(cumen)m(t,)i(but)e(c)m(hanging)i(it)f(is)f(not)i(allo)m
+(w)m(ed.)199 1632 y(0.)61 b(PREAMBLE)330 1770 y(The)37
+b(purp)s(ose)e(of)i(this)f(License)h(is)f(to)i(mak)m(e)g(a)g(man)m
+(ual,)g(textb)s(o)s(ok,)i(or)d(other)g(functional)f(and)330
+1880 y(useful)28 b(do)s(cumen)m(t)i Fq(free)36 b Ft(in)28
+b(the)j(sense)f(of)g(freedom:)41 b(to)31 b(assure)e(ev)m(ery)m(one)j
+(the)e(e\013ectiv)m(e)i(freedom)330 1990 y(to)g(cop)m(y)g(and)f
+(redistribute)e(it,)i(with)g(or)g(without)f(mo)s(difying)f(it,)j
+(either)f(commercially)f(or)h(non-)330 2099 y(commercially)-8
+b(.)53 b(Secondarily)-8 b(,)34 b(this)g(License)g(preserv)m(es)h(for)f
+(the)h(author)f(and)g(publisher)d(a)k(w)m(a)m(y)330 2209
+y(to)i(get)g(credit)f(for)g(their)f(w)m(ork,)j(while)c(not)i(b)s(eing)f
+(considered)g(resp)s(onsible)e(for)j(mo)s(di\014cations)330
+2318 y(made)30 b(b)m(y)h(others.)330 2457 y(This)21 b(License)i(is)f(a)
+i(kind)d(of)j(\\cop)m(yleft",)i(whic)m(h)c(means)h(that)h(deriv)-5
+b(ativ)m(e)22 b(w)m(orks)h(of)h(the)f(do)s(cumen)m(t)330
+2566 y(m)m(ust)34 b(themselv)m(es)g(b)s(e)f(free)h(in)f(the)h(same)g
+(sense.)51 b(It)34 b(complemen)m(ts)g(the)g(GNU)g(General)g(Public)330
+2676 y(License,)c(whic)m(h)f(is)h(a)g(cop)m(yleft)h(license)f(designed)
+f(for)h(free)h(soft)m(w)m(are.)330 2814 y(W)-8 b(e)31
+b(ha)m(v)m(e)f(designed)f(this)f(License)h(in)f(order)h(to)i(use)e(it)g
+(for)g(man)m(uals)g(for)g(free)h(soft)m(w)m(are,)h(b)s(ecause)330
+2924 y(free)42 b(soft)m(w)m(are)i(needs)e(free)g(do)s(cumen)m(tation:)
+64 b(a)42 b(free)h(program)f(should)e(come)j(with)e(man)m(uals)330
+3033 y(pro)m(viding)27 b(the)i(same)g(freedoms)f(that)i(the)f(soft)m(w)
+m(are)h(do)s(es.)40 b(But)29 b(this)e(License)i(is)f(not)h(limited)d
+(to)330 3143 y(soft)m(w)m(are)32 b(man)m(uals;)e(it)g(can)h(b)s(e)f
+(used)g(for)g(an)m(y)h(textual)g(w)m(ork,)g(regardless)f(of)h(sub)5
+b(ject)30 b(matter)i(or)330 3252 y(whether)f(it)g(is)f(published)e(as)k
+(a)f(prin)m(ted)f(b)s(o)s(ok.)44 b(W)-8 b(e)32 b(recommend)f(this)g
+(License)g(principally)c(for)330 3362 y(w)m(orks)j(whose)h(purp)s(ose)d
+(is)i(instruction)e(or)i(reference.)199 3500 y(1.)61
+b(APPLICABILITY)29 b(AND)j(DEFINITIONS)330 3639 y(This)38
+b(License)i(applies)e(to)i(an)m(y)h(man)m(ual)e(or)h(other)g(w)m(ork,)i
+(in)d(an)m(y)h(medium,)h(that)f(con)m(tains)h(a)330 3748
+y(notice)h(placed)f(b)m(y)g(the)h(cop)m(yrigh)m(t)g(holder)e(sa)m(ying)
+h(it)g(can)h(b)s(e)f(distributed)d(under)i(the)i(terms)330
+3858 y(of)c(this)e(License.)61 b(Suc)m(h)37 b(a)h(notice)g(gran)m(ts)g
+(a)g(w)m(orld-wide,)f(ro)m(y)m(alt)m(y-free)j(license,)e(unlimited)c
+(in)330 3967 y(duration,)48 b(to)e(use)f(that)g(w)m(ork)h(under)d(the)j
+(conditions)d(stated)j(herein.)84 b(The)45 b(\\Do)s(cumen)m(t",)330
+4077 y(b)s(elo)m(w,)28 b(refers)g(to)h(an)m(y)g(suc)m(h)f(man)m(ual)g
+(or)g(w)m(ork.)40 b(An)m(y)29 b(mem)m(b)s(er)e(of)i(the)f(public)e(is)h
+(a)i(licensee,)g(and)330 4187 y(is)24 b(addressed)g(as)h(\\y)m(ou".)40
+b(Y)-8 b(ou)26 b(accept)g(the)f(license)f(if)g(y)m(ou)i(cop)m(y)-8
+b(,)27 b(mo)s(dify)c(or)i(distribute)e(the)i(w)m(ork)330
+4296 y(in)k(a)i(w)m(a)m(y)g(requiring)d(p)s(ermission)f(under)i(cop)m
+(yrigh)m(t)i(la)m(w.)330 4435 y(A)j(\\Mo)s(di\014ed)e(V)-8
+b(ersion")34 b(of)g(the)g(Do)s(cumen)m(t)g(means)g(an)m(y)g(w)m(ork)f
+(con)m(taining)h(the)g(Do)s(cumen)m(t)g(or)330 4544 y(a)k(p)s(ortion)e
+(of)i(it,)h(either)e(copied)g(v)m(erbatim,)i(or)e(with)g(mo)s
+(di\014cations)e(and/or)j(translated)f(in)m(to)330 4654
+y(another)31 b(language.)330 4792 y(A)26 b(\\Secondary)g(Section")g(is)
+f(a)i(named)e(app)s(endix)e(or)j(a)h(fron)m(t-matter)g(section)f(of)g
+(the)g(Do)s(cumen)m(t)330 4902 y(that)c(deals)f(exclusiv)m(ely)f(with)g
+(the)h(relationship)e(of)i(the)h(publishers)17 b(or)k(authors)g(of)h
+(the)f(Do)s(cumen)m(t)330 5011 y(to)38 b(the)f(Do)s(cumen)m(t's)i(o)m
+(v)m(erall)e(sub)5 b(ject)37 b(\(or)h(to)g(related)f(matters\))h(and)f
+(con)m(tains)g(nothing)f(that)330 5121 y(could)j(fall)g(directly)g
+(within)f(that)j(o)m(v)m(erall)g(sub)5 b(ject.)70 b(\(Th)m(us,)42
+b(if)d(the)i(Do)s(cumen)m(t)g(is)e(in)g(part)i(a)330
+5230 y(textb)s(o)s(ok)24 b(of)g(mathematics,)i(a)e(Secondary)f(Section)
+g(ma)m(y)h(not)g(explain)e(an)m(y)i(mathematics.\))39
+b(The)330 5340 y(relationship)25 b(could)h(b)s(e)h(a)g(matter)i(of)e
+(historical)f(connection)h(with)f(the)i(sub)5 b(ject)27
+b(or)g(with)f(related)p eop
+%%Page: 132 138
+132 137 bop 150 -116 a Ft(132)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+330 299 y(matters,)38 b(or)d(of)h(legal,)g(commercial,)h
+(philosophical,)d(ethical)h(or)g(p)s(olitical)e(p)s(osition)h
+(regarding)330 408 y(them.)330 549 y(The)25 b(\\In)m(v)-5
+b(arian)m(t)26 b(Sections")g(are)g(certain)f(Secondary)h(Sections)f
+(whose)g(titles)g(are)h(designated,)h(as)330 659 y(b)s(eing)e(those)i
+(of)g(In)m(v)-5 b(arian)m(t)26 b(Sections,)i(in)d(the)i(notice)g(that)g
+(sa)m(ys)g(that)g(the)g(Do)s(cumen)m(t)g(is)f(released)330
+769 y(under)g(this)h(License.)39 b(If)27 b(a)h(section)g(do)s(es)g(not)
+f(\014t)h(the)g(ab)s(o)m(v)m(e)h(de\014nition)c(of)j(Secondary)f(then)h
+(it)f(is)330 878 y(not)32 b(allo)m(w)m(ed)g(to)g(b)s(e)g(designated)f
+(as)h(In)m(v)-5 b(arian)m(t.)45 b(The)31 b(Do)s(cumen)m(t)i(ma)m(y)f
+(con)m(tain)h(zero)f(In)m(v)-5 b(arian)m(t)330 988 y(Sections.)38
+b(If)25 b(the)f(Do)s(cumen)m(t)i(do)s(es)e(not)h(iden)m(tify)e(an)m(y)i
+(In)m(v)-5 b(arian)m(t)24 b(Sections)h(then)f(there)h(are)g(none.)330
+1129 y(The)36 b(\\Co)m(v)m(er)i(T)-8 b(exts")38 b(are)f(certain)f
+(short)h(passages)g(of)g(text)g(that)h(are)f(listed,)g(as)f(F)-8
+b(ron)m(t-Co)m(v)m(er)330 1238 y(T)g(exts)26 b(or)f(Bac)m(k-Co)m(v)m
+(er)j(T)-8 b(exts,)27 b(in)c(the)i(notice)h(that)f(sa)m(ys)h(that)g
+(the)f(Do)s(cumen)m(t)h(is)e(released)g(under)330 1348
+y(this)h(License.)39 b(A)25 b(F)-8 b(ron)m(t-Co)m(v)m(er)29
+b(T)-8 b(ext)26 b(ma)m(y)h(b)s(e)e(at)i(most)f(5)g(w)m(ords,)g(and)g(a)
+g(Bac)m(k-Co)m(v)m(er)j(T)-8 b(ext)26 b(ma)m(y)330 1457
+y(b)s(e)k(at)h(most)g(25)g(w)m(ords.)330 1598 y(A)36
+b(\\T)-8 b(ransparen)m(t")36 b(cop)m(y)g(of)g(the)f(Do)s(cumen)m(t)h
+(means)g(a)g(mac)m(hine-readable)f(cop)m(y)-8 b(,)38
+b(represen)m(ted)330 1708 y(in)c(a)i(format)g(whose)g(sp)s
+(eci\014cation)e(is)h(a)m(v)-5 b(ailable)35 b(to)i(the)f(general)f
+(public,)g(that)h(is)f(suitable)f(for)330 1817 y(revising)c(the)i(do)s
+(cumen)m(t)f(straigh)m(tforw)m(ardly)g(with)f(generic)i(text)h(editors)
+e(or)g(\(for)h(images)g(com-)330 1927 y(p)s(osed)23 b(of)h(pixels\))e
+(generic)i(pain)m(t)f(programs)h(or)f(\(for)h(dra)m(wings\))f(some)h
+(widely)e(a)m(v)-5 b(ailable)23 b(dra)m(wing)330 2037
+y(editor,)29 b(and)g(that)g(is)f(suitable)g(for)h(input)e(to)j(text)g
+(formatters)f(or)g(for)g(automatic)h(translation)e(to)330
+2146 y(a)f(v)-5 b(ariet)m(y)27 b(of)g(formats)g(suitable)f(for)g(input)
+f(to)j(text)g(formatters.)40 b(A)27 b(cop)m(y)g(made)g(in)f(an)h
+(otherwise)330 2256 y(T)-8 b(ransparen)m(t)37 b(\014le)g(format)h
+(whose)f(markup,)i(or)e(absence)h(of)g(markup,)g(has)g(b)s(een)f
+(arranged)g(to)330 2365 y(th)m(w)m(art)27 b(or)g(discourage)f
+(subsequen)m(t)g(mo)s(di\014cation)f(b)m(y)i(readers)f(is)f(not)i(T)-8
+b(ransparen)m(t.)39 b(An)27 b(image)330 2475 y(format)35
+b(is)e(not)i(T)-8 b(ransparen)m(t)34 b(if)f(used)h(for)g(an)m(y)g
+(substan)m(tial)f(amoun)m(t)i(of)g(text.)53 b(A)35 b(cop)m(y)g(that)g
+(is)330 2585 y(not)c(\\T)-8 b(ransparen)m(t")31 b(is)e(called)h
+(\\Opaque".)330 2725 y(Examples)52 b(of)h(suitable)f(formats)h(for)g(T)
+-8 b(ransparen)m(t)53 b(copies)g(include)e(plain)g Fl(asci)r(i)i
+Ft(without)330 2835 y(markup,)41 b(T)-8 b(exinfo)39 b(input)f(format,)k
+(LaT)1775 2855 y(E)1826 2835 y(X)d(input)f(format,)43
+b Fl(sgml)c Ft(or)g Fl(xml)g Ft(using)f(a)i(publicly)330
+2945 y(a)m(v)-5 b(ailable)31 b Fl(dtd)p Ft(,)g(and)g
+(standard-conforming)f(simple)g Fl(html)p Ft(,)h(P)m(ostScript)g(or)g
+Fl(pdf)g Ft(designed)f(for)330 3054 y(h)m(uman)37 b(mo)s(di\014cation.)
+63 b(Examples)37 b(of)h(transparen)m(t)g(image)h(formats)f(include)e
+Fl(png)p Ft(,)k Fl(x)n(cf)e Ft(and)330 3164 y Fl(jpg)p
+Ft(.)63 b(Opaque)38 b(formats)g(include)e(proprietary)h(formats)h(that)
+h(can)f(b)s(e)g(read)g(and)f(edited)h(only)330 3273 y(b)m(y)h
+(proprietary)f(w)m(ord)h(pro)s(cessors,)j Fl(sgml)c Ft(or)i
+Fl(xml)e Ft(for)i(whic)m(h)e(the)h Fl(dtd)g Ft(and/or)g(pro)s(cessing)
+330 3383 y(to)s(ols)31 b(are)g(not)g(generally)f(a)m(v)-5
+b(ailable,)31 b(and)f(the)h(mac)m(hine-generated)h Fl(html)p
+Ft(,)e(P)m(ostScript)h(or)g Fl(pdf)330 3493 y Ft(pro)s(duced)e(b)m(y)h
+(some)h(w)m(ord)f(pro)s(cessors)g(for)g(output)g(purp)s(oses)e(only)-8
+b(.)330 3634 y(The)34 b(\\Title)f(P)m(age")k(means,)e(for)f(a)h(prin)m
+(ted)e(b)s(o)s(ok,)i(the)f(title)g(page)h(itself,)f(plus)f(suc)m(h)g
+(follo)m(wing)330 3743 y(pages)28 b(as)g(are)g(needed)g(to)g(hold,)f
+(legibly)-8 b(,)27 b(the)h(material)f(this)g(License)g(requires)f(to)i
+(app)s(ear)f(in)g(the)330 3853 y(title)f(page.)40 b(F)-8
+b(or)28 b(w)m(orks)e(in)f(formats)i(whic)m(h)f(do)g(not)h(ha)m(v)m(e)h
+(an)m(y)e(title)h(page)g(as)g(suc)m(h,)g(\\Title)f(P)m(age")330
+3962 y(means)31 b(the)f(text)i(near)e(the)h(most)g(prominen)m(t)f(app)s
+(earance)g(of)h(the)g(w)m(ork's)g(title,)f(preceding)g(the)330
+4072 y(b)s(eginning)e(of)i(the)h(b)s(o)s(dy)e(of)h(the)h(text.)330
+4213 y(A)f(section)g(\\En)m(titled)f(XYZ")h(means)f(a)h(named)g
+(subunit)d(of)i(the)h(Do)s(cumen)m(t)h(whose)e(title)g(either)330
+4322 y(is)e(precisely)f(XYZ)i(or)f(con)m(tains)h(XYZ)g(in)e(paren)m
+(theses)j(follo)m(wing)d(text)j(that)f(translates)g(XYZ)f(in)330
+4432 y(another)e(language.)39 b(\(Here)26 b(XYZ)f(stands)f(for)h(a)g
+(sp)s(eci\014c)f(section)h(name)g(men)m(tioned)g(b)s(elo)m(w,)g(suc)m
+(h)330 4542 y(as)j(\\Ac)m(kno)m(wledgemen)m(ts",)k(\\Dedications",)d
+(\\Endorsemen)m(ts",)g(or)f(\\History".\))41 b(T)-8 b(o)29
+b(\\Preserv)m(e)330 4651 y(the)34 b(Title")f(of)g(suc)m(h)h(a)g
+(section)f(when)g(y)m(ou)h(mo)s(dify)d(the)j(Do)s(cumen)m(t)h(means)e
+(that)h(it)f(remains)g(a)330 4761 y(section)e(\\En)m(titled)e(XYZ")i
+(according)f(to)h(this)f(de\014nition.)330 4902 y(The)d(Do)s(cumen)m(t)
+i(ma)m(y)f(include)d(W)-8 b(arran)m(t)m(y)30 b(Disclaimers)c(next)i(to)
+g(the)g(notice)g(whic)m(h)e(states)j(that)330 5011 y(this)k(License)g
+(applies)f(to)j(the)f(Do)s(cumen)m(t.)52 b(These)33 b(W)-8
+b(arran)m(t)m(y)36 b(Disclaimers)c(are)j(considered)d(to)330
+5121 y(b)s(e)37 b(included)e(b)m(y)i(reference)h(in)f(this)f(License,)j
+(but)e(only)g(as)h(regards)f(disclaiming)e(w)m(arran)m(ties:)330
+5230 y(an)m(y)i(other)g(implication)e(that)i(these)g(W)-8
+b(arran)m(t)m(y)39 b(Disclaimers)c(ma)m(y)j(ha)m(v)m(e)g(is)e(v)m(oid)g
+(and)g(has)h(no)330 5340 y(e\013ect)32 b(on)e(the)h(meaning)e(of)i
+(this)e(License.)p eop
+%%Page: 133 139
+133 138 bop 150 -116 a Ft(App)s(endix)28 b(C:)i(Cop)m(ying)f(This)g
+(Man)m(ual)2062 b(133)199 299 y(2.)61 b(VERBA)-8 b(TIM)31
+b(COPYING)330 445 y(Y)-8 b(ou)39 b(ma)m(y)f(cop)m(y)h(and)e(distribute)
+f(the)i(Do)s(cumen)m(t)h(in)e(an)m(y)h(medium,)g(either)g(commercially)
+f(or)330 555 y(noncommercially)-8 b(,)45 b(pro)m(vided)c(that)i(this)e
+(License,)46 b(the)c(cop)m(yrigh)m(t)h(notices,)j(and)c(the)h(license)
+330 664 y(notice)36 b(sa)m(ying)g(this)e(License)i(applies)d(to)k(the)f
+(Do)s(cumen)m(t)g(are)g(repro)s(duced)e(in)h(all)f(copies,)k(and)330
+774 y(that)27 b(y)m(ou)g(add)f(no)h(other)f(conditions)f(whatso)s(ev)m
+(er)j(to)f(those)g(of)g(this)e(License.)39 b(Y)-8 b(ou)27
+b(ma)m(y)g(not)g(use)330 883 y(tec)m(hnical)33 b(measures)f(to)i
+(obstruct)f(or)g(con)m(trol)g(the)g(reading)f(or)h(further)e(cop)m
+(ying)i(of)g(the)g(copies)330 993 y(y)m(ou)25 b(mak)m(e)g(or)g
+(distribute.)36 b(Ho)m(w)m(ev)m(er,)28 b(y)m(ou)d(ma)m(y)g(accept)h
+(comp)s(ensation)e(in)f(exc)m(hange)k(for)d(copies.)330
+1103 y(If)32 b(y)m(ou)g(distribute)e(a)j(large)f(enough)g(n)m(um)m(b)s
+(er)f(of)h(copies)g(y)m(ou)g(m)m(ust)h(also)f(follo)m(w)f(the)h
+(conditions)330 1212 y(in)d(section)i(3.)330 1358 y(Y)-8
+b(ou)21 b(ma)m(y)h(also)e(lend)g(copies,)i(under)e(the)h(same)g
+(conditions)e(stated)j(ab)s(o)m(v)m(e,)i(and)c(y)m(ou)h(ma)m(y)g
+(publicly)330 1468 y(displa)m(y)29 b(copies.)199 1614
+y(3.)61 b(COPYING)30 b(IN)g(QUANTITY)330 1760 y(If)25
+b(y)m(ou)g(publish)d(prin)m(ted)h(copies)i(\(or)h(copies)f(in)f(media)g
+(that)i(commonly)f(ha)m(v)m(e)h(prin)m(ted)e(co)m(v)m(ers\))j(of)330
+1870 y(the)32 b(Do)s(cumen)m(t,)h(n)m(um)m(b)s(ering)d(more)i(than)f
+(100,)j(and)d(the)h(Do)s(cumen)m(t's)h(license)d(notice)i(requires)330
+1979 y(Co)m(v)m(er)j(T)-8 b(exts,)36 b(y)m(ou)f(m)m(ust)f(enclose)h
+(the)f(copies)g(in)f(co)m(v)m(ers)j(that)f(carry)-8 b(,)36
+b(clearly)d(and)h(legibly)-8 b(,)34 b(all)330 2089 y(these)40
+b(Co)m(v)m(er)g(T)-8 b(exts:)59 b(F)-8 b(ron)m(t-Co)m(v)m(er)41
+b(T)-8 b(exts)40 b(on)f(the)g(fron)m(t)g(co)m(v)m(er,)44
+b(and)38 b(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts)40 b(on)330
+2198 y(the)29 b(bac)m(k)h(co)m(v)m(er.)42 b(Both)30 b(co)m(v)m(ers)h(m)
+m(ust)e(also)g(clearly)f(and)h(legibly)e(iden)m(tify)g(y)m(ou)j(as)f
+(the)h(publisher)330 2308 y(of)k(these)h(copies.)52 b(The)34
+b(fron)m(t)h(co)m(v)m(er)h(m)m(ust)e(presen)m(t)g(the)h(full)d(title)i
+(with)e(all)i(w)m(ords)f(of)i(the)f(title)330 2418 y(equally)c
+(prominen)m(t)f(and)h(visible.)40 b(Y)-8 b(ou)31 b(ma)m(y)g(add)g
+(other)g(material)f(on)h(the)g(co)m(v)m(ers)h(in)d(addition.)330
+2527 y(Cop)m(ying)35 b(with)g(c)m(hanges)i(limited)d(to)j(the)g(co)m(v)
+m(ers,)i(as)d(long)g(as)h(they)f(preserv)m(e)g(the)h(title)e(of)i(the)
+330 2637 y(Do)s(cumen)m(t)h(and)e(satisfy)h(these)g(conditions,)h(can)f
+(b)s(e)g(treated)h(as)f(v)m(erbatim)g(cop)m(ying)g(in)f(other)330
+2746 y(resp)s(ects.)330 2892 y(If)c(the)h(required)e(texts)j(for)e
+(either)g(co)m(v)m(er)j(are)e(to)s(o)g(v)m(oluminous)e(to)i(\014t)g
+(legibly)-8 b(,)32 b(y)m(ou)h(should)e(put)330 3002 y(the)i(\014rst)f
+(ones)h(listed)e(\(as)j(man)m(y)f(as)g(\014t)g(reasonably\))f(on)h(the)
+g(actual)g(co)m(v)m(er,)i(and)e(con)m(tin)m(ue)g(the)330
+3112 y(rest)e(on)m(to)g(adjacen)m(t)h(pages.)330 3258
+y(If)27 b(y)m(ou)g(publish)c(or)k(distribute)e(Opaque)h(copies)h(of)g
+(the)h(Do)s(cumen)m(t)f(n)m(um)m(b)s(ering)e(more)j(than)e(100,)330
+3367 y(y)m(ou)i(m)m(ust)g(either)g(include)d(a)k(mac)m(hine-readable)e
+(T)-8 b(ransparen)m(t)28 b(cop)m(y)h(along)f(with)e(eac)m(h)j(Opaque)
+330 3477 y(cop)m(y)-8 b(,)38 b(or)d(state)h(in)e(or)h(with)f(eac)m(h)i
+(Opaque)e(cop)m(y)i(a)g(computer-net)m(w)m(ork)g(lo)s(cation)f(from)f
+(whic)m(h)330 3587 y(the)24 b(general)h(net)m(w)m(ork-using)f(public)d
+(has)j(access)i(to)f(do)m(wnload)e(using)g(public-standard)e(net)m(w)m
+(ork)330 3696 y(proto)s(cols)39 b(a)g(complete)g(T)-8
+b(ransparen)m(t)39 b(cop)m(y)g(of)g(the)h(Do)s(cumen)m(t,)i(free)d(of)g
+(added)f(material.)65 b(If)330 3806 y(y)m(ou)39 b(use)g(the)g(latter)g
+(option,)h(y)m(ou)g(m)m(ust)e(tak)m(e)j(reasonably)d(pruden)m(t)f
+(steps,)k(when)d(y)m(ou)h(b)s(egin)330 3915 y(distribution)c(of)j
+(Opaque)g(copies)g(in)e(quan)m(tit)m(y)-8 b(,)42 b(to)c(ensure)g(that)h
+(this)e(T)-8 b(ransparen)m(t)38 b(cop)m(y)h(will)330
+4025 y(remain)29 b(th)m(us)h(accessible)g(at)h(the)f(stated)h(lo)s
+(cation)f(un)m(til)e(at)j(least)g(one)f(y)m(ear)h(after)g(the)f(last)g
+(time)330 4134 y(y)m(ou)37 b(distribute)d(an)j(Opaque)f(cop)m(y)i
+(\(directly)e(or)g(through)g(y)m(our)h(agen)m(ts)h(or)f(retailers\))f
+(of)h(that)330 4244 y(edition)29 b(to)i(the)g(public.)330
+4390 y(It)k(is)e(requested,)j(but)e(not)h(required,)f(that)h(y)m(ou)g
+(con)m(tact)h(the)f(authors)f(of)h(the)g(Do)s(cumen)m(t)g(w)m(ell)330
+4500 y(b)s(efore)28 b(redistributing)d(an)m(y)k(large)g(n)m(um)m(b)s
+(er)e(of)i(copies,)g(to)g(giv)m(e)g(them)g(a)g(c)m(hance)h(to)f(pro)m
+(vide)f(y)m(ou)330 4609 y(with)h(an)h(up)s(dated)f(v)m(ersion)h(of)h
+(the)f(Do)s(cumen)m(t.)199 4755 y(4.)61 b(MODIFICA)-8
+b(TIONS)330 4902 y(Y)g(ou)26 b(ma)m(y)g(cop)m(y)g(and)f(distribute)e(a)
+j(Mo)s(di\014ed)e(V)-8 b(ersion)25 b(of)h(the)g(Do)s(cumen)m(t)g(under)
+e(the)h(conditions)330 5011 y(of)c(sections)g(2)h(and)e(3)h(ab)s(o)m(v)
+m(e,)k(pro)m(vided)19 b(that)j(y)m(ou)f(release)h(the)f(Mo)s(di\014ed)e
+(V)-8 b(ersion)21 b(under)e(precisely)330 5121 y(this)28
+b(License,)h(with)f(the)h(Mo)s(di\014ed)e(V)-8 b(ersion)29
+b(\014lling)d(the)j(role)g(of)g(the)g(Do)s(cumen)m(t,)h(th)m(us)f
+(licensing)330 5230 y(distribution)h(and)k(mo)s(di\014cation)e(of)j
+(the)f(Mo)s(di\014ed)e(V)-8 b(ersion)34 b(to)h(who)s(ev)m(er)f(p)s
+(ossesses)f(a)i(cop)m(y)g(of)330 5340 y(it.)40 b(In)30
+b(addition,)f(y)m(ou)h(m)m(ust)h(do)f(these)h(things)e(in)g(the)i(Mo)s
+(di\014ed)d(V)-8 b(ersion:)p eop
+%%Page: 134 140
+134 139 bop 150 -116 a Ft(134)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+357 299 y(A.)60 b(Use)33 b(in)e(the)i(Title)f(P)m(age)i(\(and)f(on)f
+(the)h(co)m(v)m(ers,)i(if)d(an)m(y\))h(a)g(title)f(distinct)f(from)i
+(that)g(of)g(the)510 408 y(Do)s(cumen)m(t,)j(and)d(from)g(those)i(of)f
+(previous)e(v)m(ersions)h(\(whic)m(h)g(should,)g(if)g(there)h(w)m(ere)g
+(an)m(y)-8 b(,)510 518 y(b)s(e)31 b(listed)f(in)g(the)h(History)g
+(section)g(of)h(the)f(Do)s(cumen)m(t\).)45 b(Y)-8 b(ou)32
+b(ma)m(y)g(use)f(the)g(same)h(title)f(as)510 628 y(a)g(previous)e(v)m
+(ersion)g(if)h(the)g(original)f(publisher)e(of)j(that)h(v)m(ersion)f
+(giv)m(es)h(p)s(ermission.)360 758 y(B.)61 b(List)30
+b(on)g(the)h(Title)e(P)m(age,)k(as)d(authors,)h(one)g(or)f(more)h(p)s
+(ersons)e(or)h(en)m(tities)h(resp)s(onsible)c(for)510
+867 y(authorship)d(of)i(the)h(mo)s(di\014cations)d(in)h(the)h(Mo)s
+(di\014ed)e(V)-8 b(ersion,)27 b(together)h(with)c(at)j(least)g(\014v)m
+(e)510 977 y(of)d(the)g(principal)d(authors)i(of)i(the)f(Do)s(cumen)m
+(t)g(\(all)f(of)i(its)e(principal)e(authors,)k(if)e(it)g(has)h(few)m
+(er)510 1087 y(than)30 b(\014v)m(e\),)h(unless)e(they)i(release)f(y)m
+(ou)h(from)f(this)f(requiremen)m(t.)359 1217 y(C.)60
+b(State)32 b(on)e(the)h(Title)f(page)h(the)g(name)g(of)g(the)g
+(publisher)c(of)k(the)g(Mo)s(di\014ed)e(V)-8 b(ersion,)31
+b(as)g(the)510 1326 y(publisher.)355 1456 y(D.)61 b(Preserv)m(e)31
+b(all)e(the)i(cop)m(yrigh)m(t)g(notices)f(of)h(the)f(Do)s(cumen)m(t.)
+363 1587 y(E.)60 b(Add)30 b(an)i(appropriate)e(cop)m(yrigh)m(t)i
+(notice)f(for)h(y)m(our)f(mo)s(di\014cations)e(adjacen)m(t)k(to)f(the)g
+(other)510 1696 y(cop)m(yrigh)m(t)f(notices.)365 1826
+y(F.)61 b(Include,)27 b(immediately)f(after)i(the)h(cop)m(yrigh)m(t)f
+(notices,)h(a)f(license)f(notice)h(giving)f(the)h(public)510
+1936 y(p)s(ermission)21 b(to)26 b(use)e(the)g(Mo)s(di\014ed)f(V)-8
+b(ersion)24 b(under)f(the)i(terms)f(of)h(this)e(License,)j(in)d(the)h
+(form)510 2045 y(sho)m(wn)30 b(in)f(the)h(Addendum)f(b)s(elo)m(w.)353
+2176 y(G.)61 b(Preserv)m(e)23 b(in)f(that)h(license)f(notice)h(the)g
+(full)e(lists)g(of)i(In)m(v)-5 b(arian)m(t)22 b(Sections)h(and)f
+(required)f(Co)m(v)m(er)510 2285 y(T)-8 b(exts)31 b(giv)m(en)f(in)f
+(the)i(Do)s(cumen)m(t's)g(license)f(notice.)357 2415
+y(H.)60 b(Include)29 b(an)h(unaltered)f(cop)m(y)i(of)g(this)e(License.)
+392 2545 y(I.)60 b(Preserv)m(e)33 b(the)f(section)g(En)m(titled)f
+(\\History",)i(Preserv)m(e)g(its)e(Title,)h(and)f(add)h(to)h(it)e(an)h
+(item)510 2655 y(stating)c(at)h(least)f(the)h(title,)f(y)m(ear,)i(new)d
+(authors,)i(and)e(publisher)d(of)29 b(the)f(Mo)s(di\014ed)e(V)-8
+b(ersion)510 2765 y(as)32 b(giv)m(en)f(on)g(the)h(Title)e(P)m(age.)45
+b(If)31 b(there)h(is)e(no)h(section)h(En)m(titled)e(\\History")i(in)e
+(the)h(Do)s(cu-)510 2874 y(men)m(t,)37 b(create)f(one)f(stating)g(the)g
+(title,)g(y)m(ear,)i(authors,)f(and)e(publisher)d(of)k(the)g(Do)s
+(cumen)m(t)510 2984 y(as)h(giv)m(en)g(on)g(its)g(Title)f(P)m(age,)k
+(then)d(add)g(an)g(item)f(describing)f(the)i(Mo)s(di\014ed)f(V)-8
+b(ersion)36 b(as)510 3093 y(stated)31 b(in)e(the)i(previous)e(sen)m
+(tence.)378 3224 y(J.)60 b(Preserv)m(e)33 b(the)g(net)m(w)m(ork)g(lo)s
+(cation,)g(if)e(an)m(y)-8 b(,)34 b(giv)m(en)e(in)g(the)g(Do)s(cumen)m
+(t)h(for)g(public)c(access)34 b(to)510 3333 y(a)e(T)-8
+b(ransparen)m(t)30 b(cop)m(y)i(of)g(the)f(Do)s(cumen)m(t,)h(and)f(lik)m
+(ewise)e(the)j(net)m(w)m(ork)g(lo)s(cations)e(giv)m(en)h(in)510
+3443 y(the)h(Do)s(cumen)m(t)g(for)g(previous)e(v)m(ersions)h(it)g(w)m
+(as)h(based)f(on.)45 b(These)31 b(ma)m(y)h(b)s(e)f(placed)g(in)g(the)
+510 3552 y(\\History")26 b(section.)39 b(Y)-8 b(ou)25
+b(ma)m(y)h(omit)f(a)g(net)m(w)m(ork)h(lo)s(cation)e(for)h(a)h(w)m(ork)f
+(that)g(w)m(as)h(published)510 3662 y(at)36 b(least)g(four)f(y)m(ears)i
+(b)s(efore)e(the)h(Do)s(cumen)m(t)h(itself,)f(or)f(if)g(the)h(original)
+e(publisher)e(of)k(the)510 3771 y(v)m(ersion)30 b(it)g(refers)g(to)h
+(giv)m(es)g(p)s(ermission.)354 3902 y(K.)60 b(F)-8 b(or)24
+b(an)m(y)h(section)e(En)m(titled)g(\\Ac)m(kno)m(wledgemen)m(ts")j(or)e
+(\\Dedications",)i(Preserv)m(e)e(the)g(Title)510 4011
+y(of)j(the)f(section,)i(and)e(preserv)m(e)h(in)e(the)i(section)f(all)g
+(the)g(substance)h(and)f(tone)h(of)f(eac)m(h)i(of)f(the)510
+4121 y(con)m(tributor)j(ac)m(kno)m(wledgemen)m(ts)i(and/or)e
+(dedications)f(giv)m(en)i(therein.)368 4251 y(L.)60 b(Preserv)m(e)36
+b(all)e(the)i(In)m(v)-5 b(arian)m(t)35 b(Sections)g(of)g(the)h(Do)s
+(cumen)m(t,)h(unaltered)e(in)f(their)g(text)j(and)510
+4361 y(in)e(their)g(titles.)56 b(Section)36 b(n)m(um)m(b)s(ers)e(or)i
+(the)g(equiv)-5 b(alen)m(t)36 b(are)g(not)g(considered)f(part)h(of)g
+(the)510 4470 y(section)31 b(titles.)341 4600 y(M.)61
+b(Delete)32 b(an)m(y)f(section)g(En)m(titled)e(\\Endorsemen)m(ts".)42
+b(Suc)m(h)30 b(a)i(section)e(ma)m(y)i(not)f(b)s(e)f(included)510
+4710 y(in)f(the)i(Mo)s(di\014ed)d(V)-8 b(ersion.)357
+4840 y(N.)60 b(Do)29 b(not)g(retitle)f(an)m(y)g(existing)g(section)g
+(to)h(b)s(e)f(En)m(titled)f(\\Endorsemen)m(ts")i(or)f(to)h(con\015ict)f
+(in)510 4950 y(title)i(with)f(an)m(y)i(In)m(v)-5 b(arian)m(t)30
+b(Section.)354 5080 y(O.)60 b(Preserv)m(e)31 b(an)m(y)g(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 5230 y(If)h(the)g(Mo)s(di\014ed)f
+(V)-8 b(ersion)33 b(includes)e(new)i(fron)m(t-matter)i(sections)e(or)g
+(app)s(endices)f(that)i(qualify)330 5340 y(as)28 b(Secondary)g
+(Sections)f(and)g(con)m(tain)i(no)e(material)h(copied)f(from)g(the)h
+(Do)s(cumen)m(t,)i(y)m(ou)e(ma)m(y)g(at)p eop
+%%Page: 135 141
+135 140 bop 150 -116 a Ft(App)s(endix)28 b(C:)i(Cop)m(ying)f(This)g
+(Man)m(ual)2062 b(135)330 299 y(y)m(our)32 b(option)g(designate)h(some)
+f(or)h(all)e(of)h(these)h(sections)g(as)f(in)m(v)-5 b(arian)m(t.)46
+b(T)-8 b(o)33 b(do)f(this,)g(add)g(their)330 408 y(titles)j(to)h(the)f
+(list)f(of)i(In)m(v)-5 b(arian)m(t)35 b(Sections)g(in)f(the)i(Mo)s
+(di\014ed)e(V)-8 b(ersion's)35 b(license)f(notice.)56
+b(These)330 518 y(titles)30 b(m)m(ust)g(b)s(e)g(distinct)f(from)g(an)m
+(y)i(other)g(section)f(titles.)330 650 y(Y)-8 b(ou)43
+b(ma)m(y)g(add)f(a)g(section)h(En)m(titled)e(\\Endorsemen)m(ts",)46
+b(pro)m(vided)41 b(it)h(con)m(tains)g(nothing)g(but)330
+759 y(endorsemen)m(ts)30 b(of)g(y)m(our)f(Mo)s(di\014ed)f(V)-8
+b(ersion)30 b(b)m(y)f(v)-5 b(arious)29 b(parties|for)g(example,)g
+(statemen)m(ts)j(of)330 869 y(p)s(eer)27 b(review)f(or)h(that)h(the)f
+(text)i(has)d(b)s(een)h(appro)m(v)m(ed)g(b)m(y)g(an)h(organization)f
+(as)g(the)h(authoritativ)m(e)330 978 y(de\014nition)g(of)j(a)f
+(standard.)330 1110 y(Y)-8 b(ou)29 b(ma)m(y)g(add)e(a)i(passage)g(of)g
+(up)e(to)i(\014v)m(e)g(w)m(ords)e(as)i(a)g(F)-8 b(ron)m(t-Co)m(v)m(er)
+30 b(T)-8 b(ext,)30 b(and)e(a)g(passage)i(of)e(up)330
+1219 y(to)g(25)g(w)m(ords)e(as)i(a)f(Bac)m(k-Co)m(v)m(er)j(T)-8
+b(ext,)29 b(to)f(the)f(end)f(of)i(the)f(list)f(of)h(Co)m(v)m(er)h(T)-8
+b(exts)27 b(in)f(the)i(Mo)s(di\014ed)330 1329 y(V)-8
+b(ersion.)57 b(Only)34 b(one)i(passage)h(of)f(F)-8 b(ron)m(t-Co)m(v)m
+(er)38 b(T)-8 b(ext)36 b(and)g(one)g(of)g(Bac)m(k-Co)m(v)m(er)j(T)-8
+b(ext)36 b(ma)m(y)h(b)s(e)330 1439 y(added)27 b(b)m(y)g(\(or)h(through)
+f(arrangemen)m(ts)h(made)g(b)m(y\))g(an)m(y)g(one)f(en)m(tit)m(y)-8
+b(.)41 b(If)27 b(the)h(Do)s(cumen)m(t)g(already)330 1548
+y(includes)k(a)i(co)m(v)m(er)h(text)g(for)f(the)g(same)h(co)m(v)m(er,)h
+(previously)c(added)h(b)m(y)h(y)m(ou)g(or)g(b)m(y)g(arrangemen)m(t)330
+1658 y(made)h(b)m(y)g(the)h(same)f(en)m(tit)m(y)h(y)m(ou)g(are)f
+(acting)h(on)f(b)s(ehalf)e(of,)k(y)m(ou)f(ma)m(y)g(not)f(add)g
+(another;)j(but)330 1767 y(y)m(ou)c(ma)m(y)h(replace)f(the)g(old)f
+(one,)j(on)e(explicit)e(p)s(ermission)f(from)i(the)i(previous)d
+(publisher)e(that)330 1877 y(added)g(the)g(old)g(one.)330
+2008 y(The)25 b(author\(s\))h(and)f(publisher\(s\))d(of)k(the)f(Do)s
+(cumen)m(t)h(do)g(not)f(b)m(y)h(this)e(License)h(giv)m(e)h(p)s
+(ermission)330 2118 y(to)31 b(use)f(their)f(names)i(for)f(publicit)m(y)
+d(for)k(or)f(to)h(assert)g(or)f(imply)e(endorsemen)m(t)i(of)h(an)m(y)g
+(Mo)s(di\014ed)330 2228 y(V)-8 b(ersion.)199 2359 y(5.)61
+b(COMBINING)31 b(DOCUMENTS)330 2491 y(Y)-8 b(ou)39 b(ma)m(y)g(com)m
+(bine)g(the)g(Do)s(cumen)m(t)g(with)f(other)g(do)s(cumen)m(ts)h
+(released)f(under)g(this)f(License,)330 2600 y(under)g(the)h(terms)g
+(de\014ned)f(in)g(section)h(4)h(ab)s(o)m(v)m(e)g(for)f(mo)s(di\014ed)e
+(v)m(ersions,)k(pro)m(vided)d(that)i(y)m(ou)330 2710
+y(include)23 b(in)h(the)h(com)m(bination)g(all)f(of)i(the)f(In)m(v)-5
+b(arian)m(t)25 b(Sections)g(of)h(all)e(of)h(the)h(original)d(do)s
+(cumen)m(ts,)330 2819 y(unmo)s(di\014ed,)i(and)h(list)f(them)i(all)e
+(as)i(In)m(v)-5 b(arian)m(t)27 b(Sections)f(of)h(y)m(our)g(com)m(bined)
+f(w)m(ork)g(in)g(its)g(license)330 2929 y(notice,)31
+b(and)f(that)h(y)m(ou)f(preserv)m(e)h(all)e(their)h(W)-8
+b(arran)m(t)m(y)32 b(Disclaimers.)330 3061 y(The)e(com)m(bined)f(w)m
+(ork)i(need)e(only)h(con)m(tain)g(one)h(cop)m(y)g(of)f(this)f(License,)
+i(and)e(m)m(ultiple)f(iden)m(tical)330 3170 y(In)m(v)-5
+b(arian)m(t)32 b(Sections)g(ma)m(y)h(b)s(e)f(replaced)g(with)f(a)i
+(single)e(cop)m(y)-8 b(.)48 b(If)32 b(there)h(are)g(m)m(ultiple)d(In)m
+(v)-5 b(arian)m(t)330 3280 y(Sections)26 b(with)g(the)h(same)g(name)g
+(but)f(di\013eren)m(t)g(con)m(ten)m(ts,)j(mak)m(e)f(the)f(title)f(of)h
+(eac)m(h)h(suc)m(h)f(section)330 3389 y(unique)32 b(b)m(y)i(adding)e
+(at)j(the)f(end)g(of)g(it,)g(in)f(paren)m(theses,)j(the)e(name)g(of)g
+(the)g(original)e(author)i(or)330 3499 y(publisher)21
+b(of)k(that)h(section)f(if)f(kno)m(wn,)i(or)f(else)g(a)g(unique)e(n)m
+(um)m(b)s(er.)38 b(Mak)m(e)26 b(the)g(same)f(adjustmen)m(t)330
+3608 y(to)g(the)g(section)f(titles)g(in)f(the)i(list)e(of)h(In)m(v)-5
+b(arian)m(t)25 b(Sections)f(in)f(the)h(license)g(notice)h(of)f(the)h
+(com)m(bined)330 3718 y(w)m(ork.)330 3850 y(In)41 b(the)g(com)m
+(bination,)j(y)m(ou)d(m)m(ust)g(com)m(bine)g(an)m(y)h(sections)f(En)m
+(titled)f(\\History")i(in)e(the)h(v)-5 b(ari-)330 3959
+y(ous)32 b(original)e(do)s(cumen)m(ts,)j(forming)e(one)h(section)g(En)m
+(titled)f(\\History";)j(lik)m(ewise)d(com)m(bine)h(an)m(y)330
+4069 y(sections)g(En)m(titled)e(\\Ac)m(kno)m(wledgemen)m(ts",)35
+b(and)c(an)m(y)h(sections)g(En)m(titled)f(\\Dedications".)45
+b(Y)-8 b(ou)330 4178 y(m)m(ust)30 b(delete)h(all)e(sections)i(En)m
+(titled)e(\\Endorsemen)m(ts.")199 4310 y(6.)61 b(COLLECTIONS)28
+b(OF)i(DOCUMENTS)330 4441 y(Y)-8 b(ou)32 b(ma)m(y)h(mak)m(e)g(a)f
+(collection)f(consisting)g(of)h(the)g(Do)s(cumen)m(t)g(and)g(other)g
+(do)s(cumen)m(ts)f(released)330 4551 y(under)41 b(this)g(License,)k
+(and)d(replace)g(the)h(individual)38 b(copies)k(of)g(this)f(License)h
+(in)f(the)i(v)-5 b(arious)330 4661 y(do)s(cumen)m(ts)42
+b(with)f(a)i(single)e(cop)m(y)j(that)f(is)e(included)f(in)h(the)i
+(collection,)i(pro)m(vided)c(that)j(y)m(ou)330 4770 y(follo)m(w)36
+b(the)i(rules)d(of)i(this)f(License)h(for)g(v)m(erbatim)g(cop)m(ying)g
+(of)g(eac)m(h)h(of)f(the)h(do)s(cumen)m(ts)e(in)g(all)330
+4880 y(other)31 b(resp)s(ects.)330 5011 y(Y)-8 b(ou)32
+b(ma)m(y)g(extract)h(a)f(single)e(do)s(cumen)m(t)h(from)g(suc)m(h)g(a)h
+(collection,)f(and)g(distribute)e(it)i(individu-)330
+5121 y(ally)j(under)f(this)h(License,)i(pro)m(vided)e(y)m(ou)h(insert)f
+(a)h(cop)m(y)h(of)f(this)f(License)g(in)m(to)h(the)h(extracted)330
+5230 y(do)s(cumen)m(t,)d(and)f(follo)m(w)g(this)f(License)h(in)g(all)f
+(other)i(resp)s(ects)f(regarding)g(v)m(erbatim)g(cop)m(ying)h(of)330
+5340 y(that)e(do)s(cumen)m(t.)p eop
+%%Page: 136 142
+136 141 bop 150 -116 a Ft(136)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+199 299 y(7.)61 b(A)m(GGREGA)-8 b(TION)32 b(WITH)e(INDEPENDENT)h(W)m
+(ORKS)330 428 y(A)d(compilation)f(of)h(the)g(Do)s(cumen)m(t)h(or)f(its)
+f(deriv)-5 b(ativ)m(es)28 b(with)e(other)j(separate)g(and)e(indep)s
+(enden)m(t)330 538 y(do)s(cumen)m(ts)33 b(or)g(w)m(orks,)h(in)e(or)i
+(on)f(a)g(v)m(olume)g(of)h(a)f(storage)i(or)e(distribution)d(medium,)i
+(is)h(called)330 648 y(an)d(\\aggregate")k(if)29 b(the)h(cop)m(yrigh)m
+(t)h(resulting)d(from)h(the)i(compilation)d(is)h(not)i(used)e(to)i
+(limit)d(the)330 757 y(legal)e(righ)m(ts)g(of)h(the)g(compilation's)e
+(users)h(b)s(ey)m(ond)g(what)g(the)h(individual)22 b(w)m(orks)k(p)s
+(ermit.)38 b(When)330 867 y(the)28 b(Do)s(cumen)m(t)g(is)f(included)e
+(an)i(aggregate,)32 b(this)26 b(License)h(do)s(es)h(not)g(apply)e(to)i
+(the)g(other)g(w)m(orks)330 976 y(in)h(the)i(aggregate)i(whic)m(h)c
+(are)i(not)f(themselv)m(es)h(deriv)-5 b(ativ)m(e)30 b(w)m(orks)g(of)h
+(the)f(Do)s(cumen)m(t.)330 1106 y(If)22 b(the)h(Co)m(v)m(er)h(T)-8
+b(ext)23 b(requiremen)m(t)f(of)h(section)g(3)g(is)f(applicable)f(to)i
+(these)h(copies)e(of)h(the)g(Do)s(cumen)m(t,)330 1215
+y(then)f(if)f(the)i(Do)s(cumen)m(t)g(is)f(less)f(than)h(one)h(half)e
+(of)i(the)g(en)m(tire)f(aggregate,)27 b(the)c(Do)s(cumen)m(t's)g(Co)m
+(v)m(er)330 1325 y(T)-8 b(exts)27 b(ma)m(y)g(b)s(e)f(placed)g(on)h(co)m
+(v)m(ers)h(that)f(brac)m(k)m(et)h(the)f(Do)s(cumen)m(t)g(within)d(the)j
+(aggregate,)j(or)d(the)330 1435 y(electronic)35 b(equiv)-5
+b(alen)m(t)34 b(of)i(co)m(v)m(ers)g(if)e(the)h(Do)s(cumen)m(t)h(is)e
+(in)g(electronic)h(form.)54 b(Otherwise)34 b(they)330
+1544 y(m)m(ust)c(app)s(ear)g(on)g(prin)m(ted)f(co)m(v)m(ers)j(that)f
+(brac)m(k)m(et)h(the)f(whole)e(aggregate.)199 1674 y(8.)61
+b(TRANSLA)-8 b(TION)330 1803 y(T)g(ranslation)39 b(is)g(considered)f(a)
+j(kind)d(of)i(mo)s(di\014cation,)h(so)f(y)m(ou)g(ma)m(y)h(distribute)c
+(translations)330 1913 y(of)45 b(the)f(Do)s(cumen)m(t)h(under)e(the)h
+(terms)h(of)f(section)h(4.)83 b(Replacing)43 b(In)m(v)-5
+b(arian)m(t)44 b(Sections)g(with)330 2022 y(translations)g(requires)g
+(sp)s(ecial)g(p)s(ermission)f(from)i(their)f(cop)m(yrigh)m(t)i
+(holders,)i(but)d(y)m(ou)g(ma)m(y)330 2132 y(include)22
+b(translations)i(of)g(some)h(or)g(all)e(In)m(v)-5 b(arian)m(t)24
+b(Sections)g(in)f(addition)g(to)i(the)g(original)e(v)m(ersions)330
+2242 y(of)32 b(these)f(In)m(v)-5 b(arian)m(t)32 b(Sections.)43
+b(Y)-8 b(ou)32 b(ma)m(y)g(include)d(a)j(translation)e(of)i(this)e
+(License,)i(and)e(all)h(the)330 2351 y(license)40 b(notices)h(in)f(the)
+i(Do)s(cumen)m(t,)j(and)40 b(an)m(y)i(W)-8 b(arran)m(t)m(y)42
+b(Disclaimers,)h(pro)m(vided)d(that)i(y)m(ou)330 2461
+y(also)e(include)e(the)i(original)e(English)g(v)m(ersion)h(of)h(this)f
+(License)h(and)f(the)h(original)e(v)m(ersions)i(of)330
+2570 y(those)35 b(notices)f(and)f(disclaimers.)50 b(In)33
+b(case)i(of)g(a)f(disagreemen)m(t)g(b)s(et)m(w)m(een)h(the)f
+(translation)g(and)330 2680 y(the)h(original)f(v)m(ersion)g(of)i(this)e
+(License)h(or)g(a)g(notice)h(or)f(disclaimer,)f(the)i(original)d(v)m
+(ersion)i(will)330 2790 y(prev)-5 b(ail.)330 2919 y(If)28
+b(a)h(section)g(in)e(the)i(Do)s(cumen)m(t)h(is)d(En)m(titled)h(\\Ac)m
+(kno)m(wledgemen)m(ts",)j(\\Dedications",)f(or)f(\\His-)330
+3029 y(tory",)f(the)f(requiremen)m(t)e(\(section)i(4\))g(to)g(Preserv)m
+(e)g(its)e(Title)h(\(section)g(1\))h(will)d(t)m(ypically)h(require)330
+3138 y(c)m(hanging)30 b(the)h(actual)g(title.)199 3268
+y(9.)61 b(TERMINA)-8 b(TION)330 3397 y(Y)g(ou)30 b(ma)m(y)h(not)f(cop)m
+(y)-8 b(,)31 b(mo)s(dify)-8 b(,)29 b(sublicense,)f(or)i(distribute)d
+(the)j(Do)s(cumen)m(t)g(except)h(as)f(expressly)330 3507
+y(pro)m(vided)40 b(for)i(under)e(this)h(License.)74 b(An)m(y)42
+b(other)g(attempt)h(to)g(cop)m(y)-8 b(,)46 b(mo)s(dify)-8
+b(,)43 b(sublicense)d(or)330 3616 y(distribute)34 b(the)j(Do)s(cumen)m
+(t)g(is)f(v)m(oid,)i(and)e(will)e(automatically)i(terminate)h(y)m(our)f
+(righ)m(ts)g(under)330 3726 y(this)27 b(License.)39 b(Ho)m(w)m(ev)m
+(er,)31 b(parties)c(who)g(ha)m(v)m(e)i(receiv)m(ed)f(copies,)h(or)e
+(righ)m(ts,)h(from)g(y)m(ou)g(under)e(this)330 3836 y(License)36
+b(will)e(not)j(ha)m(v)m(e)h(their)e(licenses)f(terminated)i(so)g(long)f
+(as)h(suc)m(h)f(parties)g(remain)g(in)f(full)330 3945
+y(compliance.)154 4075 y(10.)61 b(FUTURE)30 b(REVISIONS)f(OF)i(THIS)e
+(LICENSE)330 4204 y(The)41 b(F)-8 b(ree)43 b(Soft)m(w)m(are)f(F)-8
+b(oundation)42 b(ma)m(y)g(publish)c(new,)44 b(revised)c(v)m(ersions)h
+(of)h(the)g(GNU)g(F)-8 b(ree)330 4314 y(Do)s(cumen)m(tation)33
+b(License)e(from)h(time)g(to)h(time.)45 b(Suc)m(h)31
+b(new)h(v)m(ersions)f(will)f(b)s(e)h(similar)e(in)i(spirit)330
+4423 y(to)k(the)g(presen)m(t)f(v)m(ersion,)h(but)f(ma)m(y)h(di\013er)e
+(in)g(detail)g(to)i(address)f(new)g(problems)e(or)j(concerns.)330
+4533 y(See)c Fs(http://www.gnu.org/copy)o(left)o(/)p
+Ft(.)330 4663 y(Eac)m(h)f(v)m(ersion)f(of)h(the)f(License)g(is)g(giv)m
+(en)g(a)h(distinguishing)25 b(v)m(ersion)k(n)m(um)m(b)s(er.)39
+b(If)29 b(the)g(Do)s(cumen)m(t)330 4772 y(sp)s(eci\014es)44
+b(that)i(a)g(particular)d(n)m(um)m(b)s(ered)h(v)m(ersion)h(of)g(this)f
+(License)h(\\or)h(an)m(y)g(later)f(v)m(ersion")330 4882
+y(applies)31 b(to)i(it,)g(y)m(ou)f(ha)m(v)m(e)i(the)f(option)f(of)g
+(follo)m(wing)f(the)i(terms)f(and)g(conditions)f(either)h(of)g(that)330
+4991 y(sp)s(eci\014ed)k(v)m(ersion)i(or)f(of)h(an)m(y)h(later)f(v)m
+(ersion)f(that)h(has)g(b)s(een)f(published)d(\(not)39
+b(as)f(a)g(draft\))g(b)m(y)330 5101 y(the)33 b(F)-8 b(ree)34
+b(Soft)m(w)m(are)f(F)-8 b(oundation.)48 b(If)32 b(the)h(Do)s(cumen)m(t)
+g(do)s(es)g(not)g(sp)s(ecify)e(a)i(v)m(ersion)f(n)m(um)m(b)s(er)g(of)
+330 5210 y(this)h(License,)j(y)m(ou)e(ma)m(y)i(c)m(ho)s(ose)f(an)m(y)g
+(v)m(ersion)f(ev)m(er)h(published)c(\(not)k(as)g(a)f(draft\))h(b)m(y)f
+(the)h(F)-8 b(ree)330 5320 y(Soft)m(w)m(are)31 b(F)-8
+b(oundation.)p eop
+%%Page: 137 143
+137 142 bop 150 -116 a Ft(App)s(endix)28 b(C:)i(Cop)m(ying)f(This)g
+(Man)m(ual)2062 b(137)150 299 y Fk(C.1.1)62 b(ADDENDUM:)41
+b(Ho)m(w)f(to)h(use)h(this)f(License)g(for)g(y)m(our)g(do)s(cumen)m(ts)
+275 543 y Ft(T)-8 b(o)27 b(use)g(this)f(License)h(in)f(a)i(do)s(cumen)m
+(t)f(y)m(ou)h(ha)m(v)m(e)g(written,)f(include)e(a)j(cop)m(y)g(of)f(the)
+h(License)f(in)f(the)150 653 y(do)s(cumen)m(t)k(and)g(put)g(the)g
+(follo)m(wing)f(cop)m(yrigh)m(t)i(and)f(license)f(notices)h(just)g
+(after)h(the)g(title)f(page:)468 765 y Fe(Copyright)42
+b(\(C\))79 b Fd(year)88 b(your)40 b(name)p Fe(.)468 852
+y(Permission)i(is)e(granted)g(to)g(copy,)h(distribute)g(and/or)g
+(modify)f(this)g(document)468 939 y(under)h(the)f(terms)g(of)g(the)g
+(GNU)g(Free)g(Documentation)i(License,)f(Version)g(1.2)468
+1026 y(or)f(any)g(later)g(version)h(published)h(by)d(the)h(Free)g
+(Software)h(Foundation;)468 1113 y(with)g(no)e(Invariant)j(Sections,)f
+(no)f(Front-Cover)h(Texts,)g(and)f(no)f(Back-Cover)j(Texts.)468
+1200 y(A)e(copy)g(of)g(the)g(license)g(is)g(included)h(in)f(the)g
+(section)h(entitled)g(``GNU)468 1288 y(Free)g(Documentation)h
+(License''.)275 1410 y Ft(If)d(y)m(ou)h(ha)m(v)m(e)h(In)m(v)-5
+b(arian)m(t)40 b(Sections,)i(F)-8 b(ron)m(t-Co)m(v)m(er)42
+b(T)-8 b(exts)41 b(and)e(Bac)m(k-Co)m(v)m(er)k(T)-8 b(exts,)43
+b(replace)d(the)150 1520 y(\\with...T)-8 b(exts.")42
+b(line)28 b(with)i(this:)547 1632 y Fe(with)40 b(the)g(Invariant)h
+(Sections)g(being)g Fd(list)f(their)g(titles)p Fe(,)h(with)547
+1719 y(the)f(Front-Cover)i(Texts)e(being)g Fd(list)p
+Fe(,)h(and)f(with)g(the)g(Back-Cover)h(Texts)547 1806
+y(being)f Fd(list)p Fe(.)275 1929 y Ft(If)34 b(y)m(ou)i(ha)m(v)m(e)g
+(In)m(v)-5 b(arian)m(t)35 b(Sections)g(without)f(Co)m(v)m(er)i(T)-8
+b(exts,)38 b(or)d(some)g(other)h(com)m(bination)e(of)i(the)150
+2038 y(three,)31 b(merge)g(those)g(t)m(w)m(o)g(alternativ)m(es)g(to)g
+(suit)e(the)i(situation.)275 2173 y(If)23 b(y)m(our)h(do)s(cumen)m(t)f
+(con)m(tains)h(non)m(trivial)e(examples)i(of)g(program)f(co)s(de,)j(w)m
+(e)e(recommend)g(releasing)150 2283 y(these)44 b(examples)e(in)g
+(parallel)f(under)h(y)m(our)h(c)m(hoice)h(of)f(free)g(soft)m(w)m(are)h
+(license,)i(suc)m(h)d(as)g(the)g(GNU)150 2392 y(General)30
+b(Public)e(License,)j(to)g(p)s(ermit)d(their)i(use)g(in)f(free)h(soft)m
+(w)m(are.)p eop
+%%Page: 138 144
+138 143 bop 150 -116 a Ft(138)2527 b(Bash)31 b(Reference)g(Man)m(ual)p
+eop
+%%Page: 139 145
+139 144 bop 150 -116 a Ft(Index)30 b(of)g(Shell)e(Builtin)g(Commands)
+2133 b(139)150 299 y Fo(Index)53 b(of)h(Shell)g(Builtin)h(Commands)150
+560 y Fr(.)150 686 y Fe(.)17 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(33)150 945 y Fr(:)150 1071 y Fe(:)17 b Fc(.)12 b(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)42 b Fb(33)150 1339 y Fr([)150 1465 y Fe([)17
+b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(37)150 1732
+y Fr(A)150 1858 y Fe(alias)11 b Fc(.)j(.)e(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)37 b
+Fb(39)150 2116 y Fr(B)150 2242 y Fe(bg)15 b Fc(.)e(.)g(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)41 b Fb(80)150 2334 y Fe(bind)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38
+b Fb(39)150 2426 y Fe(break)11 b Fc(.)j(.)e(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)37 b
+Fb(33)150 2518 y Fe(builtin)8 b Fc(.)14 b(.)e(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b Fb(40)150
+2777 y Fr(C)150 2903 y Fe(caller)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35
+b Fb(40)150 2995 y Fe(cd)15 b Fc(.)e(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)41
+b Fb(33)150 3087 y Fe(command)8 b Fc(.)14 b(.)e(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b Fb(41)150
+3179 y Fe(compgen)7 b Fc(.)14 b(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)33 b Fb(105)150 3271 y Fe(complete)26
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+50 b Fb(105)150 3363 y Fe(continue)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)32 b Fb(34)150
+3621 y Fr(D)150 3747 y Fe(declare)8 b Fc(.)14 b(.)e(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34 b
+Fb(41)150 3839 y Fe(dirs)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38
+b Fb(73)150 3931 y Fe(disown)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fb(81)150
+4190 y Fr(E)150 4316 y Fe(echo)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38
+b Fb(42)150 4408 y Fe(enable)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fb(42)150
+4500 y Fe(eval)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38 b Fb(34)150
+4592 y Fe(exec)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38 b Fb(34)150
+4684 y Fe(exit)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38 b Fb(34)150
+4776 y Fe(export)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fb(34)150 5053
+y Fr(F)150 5179 y Fe(fc)14 b Fc(.)f(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40
+b Fb(109)150 5271 y Fe(fg)15 b Fc(.)e(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)41
+b Fb(80)150 5548 y Fr(G)150 5674 y Fe(getopts)8 b Fc(.)14
+b(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)34 b Fb(35)2025 560 y Fr(H)2025 676 y Fe(hash)13
+b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(35)2025 764 y Fe(help)13
+b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(43)2025 851 y Fe(history)7
+b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)
+g(.)h(.)33 b Fb(110)2025 1103 y Fr(J)2025 1219 y Fe(jobs)13
+b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(80)2025 1470 y Fr(K)2025
+1586 y Fe(kill)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(81)2025
+1819 y Fr(L)2025 1935 y Fe(let)14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(43)2025 2023 y Fe(local)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37
+b Fb(43)2025 2110 y Fe(logout)10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b
+Fb(43)2025 2362 y Fr(P)2025 2478 y Fe(popd)13 b Fc(.)g(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(74)2025 2565 y Fe(printf)10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b
+Fb(43)2025 2652 y Fe(pushd)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b
+Fb(74)2025 2739 y Fe(pwd)14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(36)2025 2991 y Fr(R)2025 3107 y Fe(read)13 b Fc(.)g(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+38 b Fb(44)2025 3194 y Fe(readonly)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(36)2025
+3281 y Fe(return)10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b Fb(36)2025 3514
+y Fr(S)2025 3630 y Fe(set)14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(50)2025 3718 y Fe(shift)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37
+b Fb(36)2025 3805 y Fe(shopt)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37
+b Fb(45)2025 3892 y Fe(source)10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b
+Fb(48)2025 3979 y Fe(suspend)8 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(81)2025
+4231 y Fr(T)2025 4347 y Fe(test)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(37)2025 4434 y Fe(times)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37
+b Fb(38)2025 4521 y Fe(trap)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(38)2025 4609 y Fe(type)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(48)2025 4696 y Fe(typeset)8 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(49)2025
+4948 y Fr(U)2025 5064 y Fe(ulimit)10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(49)2025 5151 y Fe(umask)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37
+b Fb(38)2025 5238 y Fe(unalias)8 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(50)2025
+5325 y Fe(unset)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(39)2025 5558
+y Fr(W)2025 5674 y Fe(wait)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(81)p eop
+%%Page: 140 146
+140 145 bop 150 -116 a Ft(140)2527 b(Bash)31 b(Reference)g(Man)m(ual)p
+eop
+%%Page: 141 147
+141 146 bop 150 -116 a Ft(Index)30 b(of)g(Shell)e(Reserv)m(ed)j(W)-8
+b(ords)2247 b(141)150 299 y Fo(Index)53 b(of)h(Shell)g(Reserv)l(ed)e(W)
+-13 b(ords)150 610 y Fr(!)150 743 y Fe(!)18 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)44 b Fb(8)150 1029 y
+Fr([)150 1162 y Fe([[)15 b Fc(.)e(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)41
+b Fb(12)150 1455 y Fr(])150 1587 y Fe(]])15 b Fc(.)e(.)g(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)41 b Fb(12)150 1873 y Fa({)150 2006 y Fe({)17 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(13)150 2292 y Fa(})150
+2425 y Fe(})17 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(13)150 2709 y Fr(C)150 2842 y Fe(case)13 b Fc(.)g(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38
+b Fb(11)150 3119 y Fr(D)150 3252 y Fe(do)16 b Fc(.)d(.)g(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)43 b Fb(9)150 3347 y Fe(done)14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(9)2025 610 y Fr(E)2025 726 y Fe(elif)13 b Fc(.)g(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(10)2025 814 y Fe(else)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(10)2025 901 y Fe(esac)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(11)2025 1134 y Fr(F)2025 1250 y Fe(fi)15 b Fc(.)e(.)f(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)41 b Fb(10)2025 1338 y Fe(for)14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(10)2025 1425 y Fe(function)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(13)2025
+1658 y Fr(I)2025 1775 y Fe(if)15 b Fc(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41
+b Fb(10)2025 1862 y Fe(in)15 b Fc(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41
+b Fb(11)2025 2095 y Fr(S)2025 2211 y Fe(select)10 b Fc(.)j(.)f(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(11)2025 2445 y Fr(T)2025 2561 y Fe(then)13 b Fc(.)g(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+38 b Fb(10)2025 2648 y Fe(time)14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)40
+b Fb(8)2025 2881 y Fr(U)2025 2998 y Fe(until)12 b Fc(.)h(.)g(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+38 b Fb(9)2025 3231 y Fr(W)2025 3347 y Fe(while)11 b
+Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)37 b Fb(10)p eop
+%%Page: 142 148
+142 147 bop 150 -116 a Ft(142)2527 b(Bash)31 b(Reference)g(Man)m(ual)p
+eop
+%%Page: 143 149
+143 148 bop 150 -116 a Ft(P)m(arameter)32 b(and)d(V)-8
+b(ariable)30 b(Index)2262 b(143)150 299 y Fo(P)l(arameter)53
+b(and)g(V)-13 b(ariable)55 b(Index)150 610 y Fr(!)150
+727 y Fe(!)17 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(16)150 963 y Fr(#)150 1080 y Fe(#)17 b Fc(.)12 b(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)42 b Fb(16)150 1325 y Fr($)150 1442 y Fe($)17
+b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(16)150 1694
+y Fr(*)150 1811 y Fe(*)17 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(15)150 2046 y Fr(-)150 2163 y Fe(-)17 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(16)150 2399 y Fr(?)150
+2516 y Fe(?)17 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(16)150 2751 y Fr(@)150 2868 y Fe(@)17 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(15)p 159 3104 41
+6 v 150 3221 a Fe(_)17 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(16)150 3456 y Fr(0)150 3573 y Fe(0)17 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(16)150 3809 y Fr(A)150
+3926 y Fe(auto_resume)23 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)46 b Fb(82)150 4171 y Fr(B)150 4288
+y Fe(BASH)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38 b Fb(55)150 4375
+y Fe(BASH_ARGC)25 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)49 b Fb(56)150 4463 y Fe(BASH_ARGV)25
+b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+49 b Fb(56)150 4551 y Fe(BASH_COMMAND)22 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)45 b Fb(56)150 4638 y
+Fe(BASH_ENV)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)32 b Fb(56)150 4726 y Fe(BASH_EXECUTION_STRING)
+d Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)50 b Fb(56)150 4814 y Fe(BASH_LINENO)23
+b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46
+b Fb(56)150 4901 y Fe(BASH_REMATCH)22 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)45 b Fb(56)150 4989 y Fe(BASH_SOURCE)23
+b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46
+b Fb(56)150 5077 y Fe(BASH_SUBSHELL)18 b Fc(.)d(.)d(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)43 b Fb(56)150 5165 y Fe(BASH_VERSINFO)18
+b Fc(.)d(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43
+b Fb(56)150 5252 y Fe(BASH_VERSION)22 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)45 b Fb(57)150 5340 y Fe(bell-style)24
+b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47
+b Fb(87)2025 610 y Fr(C)2025 730 y Fe(CDPATH)10 b Fc(.)j(.)f(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(55)2025 819 y Fe(COLUMNS)8 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(57)2025
+908 y Fe(comment-begin)18 b Fc(.)d(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)43 b Fb(87)2025 997 y Fe(COMP_CWORD)24 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48
+b Fb(57)2025 1086 y Fe(COMP_LINE)25 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(57)2025 1175
+y Fe(COMP_POINT)24 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)48 b Fb(57)2025 1264 y Fe(COMP_WORDBREAKS)15
+b Fc(.)g(.)e(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40 b Fb(57)2025
+1353 y Fe(COMP_WORDS)24 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)48 b Fb(57)2025 1442 y Fe(completion-query-items)27
+b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)48 b Fb(87)2025 1531 y Fe(COMPREPLY)25
+b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+49 b Fb(58)2025 1621 y Fe(convert-meta)22 b Fc(.)12 b(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 b Fb(87)2025 1863
+y Fr(D)2025 1983 y Fe(DIRSTACK)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(58)2025
+2072 y Fe(disable-completion)10 b Fc(.)17 b(.)12 b(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+36 b Fb(87)2025 2333 y Fr(E)2025 2453 y Fe(editing-mode)22
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45
+b Fb(88)2025 2542 y Fe(EMACS)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37
+b Fb(58)2025 2631 y Fe(enable-keypad)18 b Fc(.)d(.)d(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)43 b Fb(88)2025 2720 y Fe(EUID)13
+b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(58)2025 2809 y Fe(expand-tilde)22
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45
+b Fb(88)2025 3071 y Fr(F)2025 3190 y Fe(FCEDIT)10 b Fc(.)j(.)f(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(58)2025 3279 y Fe(FIGNORE)8 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(58)2025
+3368 y Fe(FUNCNAME)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(58)2025 3611 y
+Fr(G)2025 3731 y Fe(GLOBIGNORE)24 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48 b Fb(58)2025 3820
+y Fe(GROUPS)10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b Fb(58)2025 4063 y Fr(H)2025
+4182 y Fe(histchars)25 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(58)2025 4271 y Fe(HISTCMD)8
+b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+g(.)h(.)f(.)34 b Fb(59)2025 4360 y Fe(HISTCONTROL)23
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)46
+b Fb(59)2025 4449 y Fe(HISTFILE)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(59)2025
+4539 y Fe(HISTFILESIZE)22 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)45 b Fb(59)2025 4628 y Fe(HISTIGNORE)24
+b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48
+b Fb(59)2025 4717 y Fe(history-preserve-point)27 b Fc(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)48 b Fb(88)2025 4806 y Fe(HISTSIZE)7 b Fc(.)14
+b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+32 b Fb(59)2025 4895 y Fe(HISTTIMEFORMAT)16 b Fc(.)f(.)e(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)42 b Fb(59)2025 4984 y Fe(HOME)13
+b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(55)2025 5073 y Fe
+(horizontal-scroll-mode)27 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)48 b Fb(88)2025
+5162 y Fe(HOSTFILE)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(59)2025 5251 y
+Fe(HOSTNAME)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(60)2025 5340 y Fe(HOSTTYPE)7
+b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)32 b Fb(60)p eop
+%%Page: 144 150
+144 149 bop 150 -116 a Ft(144)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+150 299 y Fr(I)150 416 y Fe(IFS)14 b Fc(.)f(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)39
+b Fb(55)150 503 y Fe(IGNOREEOF)25 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(60)150 591
+y Fe(input-meta)24 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)47 b Fb(88)150 678 y Fe(INPUTRC)8 b Fc(.)14
+b(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)34 b Fb(60)150 766 y Fe(isearch-terminators)9 b Fc(.)17
+b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(88)150 1000 y Fr(K)150
+1117 y Fe(keymap)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fb(88)150 1370
+y Fr(L)150 1487 y Fe(LANG)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38
+b Fb(60)150 1575 y Fe(LC_ALL)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fb(60)150
+1662 y Fe(LC_COLLATE)24 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)47 b Fb(60)150 1750 y Fe(LC_CTYPE)7
+b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+g(.)h(.)32 b Fb(60)150 1837 y Fe(LC_MESSAGES)14 b Fc(.)h(.)d(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b Fb(7,)26 b(60)150
+1925 y Fe(LC_NUMERIC)e Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)47 b Fb(60)150 2012 y Fe(LINENO)10
+b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)35 b Fb(60)150 2100 y Fe(LINES)11 b Fc(.)j(.)e(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)37
+b Fb(60)150 2335 y Fr(M)150 2451 y Fe(MACHTYPE)7 b Fc(.)14
+b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+32 b Fb(60)150 2539 y Fe(MAIL)13 b Fc(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)38
+b Fb(55)150 2626 y Fe(MAILCHECK)25 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(61)150 2714
+y Fe(MAILPATH)7 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)32 b Fb(55)150 2801 y Fe(mark-modified-lines)9
+b Fc(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(89)150 2889
+y Fe(mark-symlinked-directories)17 b Fc(.)h(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(89)150 2977
+y Fe(match-hidden-files)10 b Fc(.)17 b(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)36
+b Fb(89)150 3064 y Fe(meta-flag)25 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(88)150 3317
+y Fr(O)150 3434 y Fe(OLDPWD)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fb(61)150
+3522 y Fe(OPTARG)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fb(55)150 3609
+y Fe(OPTERR)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)35 b Fb(61)150 3697 y Fe(OPTIND)10
+b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)35 b Fb(55)150 3784 y Fe(OSTYPE)10 b Fc(.)j(.)g(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)35
+b Fb(61)150 3872 y Fe(output-meta)23 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)46 b Fb(89)2025 299 y
+Fr(P)2025 420 y Fe(page-completions)13 b Fc(.)j(.)c(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)39 b Fb(89)2025 510 y Fe(PATH)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(55)2025 600 y Fe(PIPESTATUS)24 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48 b Fb(61)2025 689 y
+Fe(POSIXLY_CORRECT)15 b Fc(.)g(.)e(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40
+b Fb(61)2025 779 y Fe(PPID)13 b Fc(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(61)2025 869 y Fe(PROMPT_COMMAND)16 b Fc(.)f(.)e(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)42 b Fb(61)2025 958 y Fe(PS1)14 b
+Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(55)2025 1048 y Fe(PS2)14
+b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(55)2025 1138 y Fe(PS3)14
+b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(61)2025 1228 y Fe(PS4)14
+b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(61)2025 1317 y Fe(PWD)14
+b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(61)2025 1563 y Fr(R)2025
+1685 y Fe(RANDOM)10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b Fb(61)2025 1774
+y Fe(REPLY)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(61)2025 2021
+y Fr(S)2025 2142 y Fe(SECONDS)8 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)34 b Fb(61)2025
+2231 y Fe(SHELLOPTS)25 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(62)2025 2321 y Fe(SHLVL)11
+b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)37 b Fb(62)2025 2411 y Fe(show-all-if-ambiguous)29
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)50 b Fb(89)2025 2501 y Fe(show-all-if-unmodified)27
+b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)48 b Fb(89)2025 2747 y Fr(T)2025 2868
+y Fe(TEXTDOMAIN)25 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)49 b Fb(7)2025 2958 y Fe(TEXTDOMAINDIR)21
+b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45
+b Fb(7)2025 3047 y Fe(TIMEFORMAT)24 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)48 b Fb(62)2025 3137
+y Fe(TMOUT)11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(62)2025 3383
+y Fr(U)2025 3505 y Fe(UID)14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(62)2025 3751 y Fr(V)2025 3872 y Fe(visible-stats)18
+b Fc(.)d(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43
+b Fb(89)p eop
+%%Page: 145 151
+145 150 bop 150 -116 a Ft(F)-8 b(unction)30 b(Index)2861
+b(145)150 299 y Fo(F)-13 b(unction)53 b(Index)150 610
+y Fr(A)150 749 y Fe(abort)27 b(\(C-g\))8 b Fc(.)13 b(.)g(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34 b Fb(101)150 848
+y Fe(accept-line)28 b(\(Newline)g(or)e(Return\))12 b
+Fc(.)h(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)37 b
+Fb(95)150 946 y Fe(alias-expand-line)29 b(\(\))13 b Fc(.)g(.)g(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+39 b Fb(102)150 1257 y Fr(B)150 1397 y Fe(backward-char)29
+b(\(C-b\))16 b Fc(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fb(95)150
+1495 y Fe(backward-delete-char)30 b(\(Rubout\))21 b Fc(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 b
+Fb(97)150 1594 y Fe(backward-kill-line)30 b(\(C-x)c(Rubout\))f
+Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)49 b
+Fb(98)150 1692 y Fe(backward-kill-word)30 b(\(M-)999
+1689 y Fg(h)p 1024 1636 146 4 v 1024 1692 a Ff(DEL)p
+1024 1708 V 1165 1689 a Fg(i)1195 1692 y Fe(\))21 b Fc(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46
+b Fb(98)150 1791 y Fe(backward-word)29 b(\(M-b\))16 b
+Fc(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fb(95)150 1889 y Fe
+(beginning-of-history)30 b(\(M-<\))25 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)49 b Fb(96)150
+1988 y Fe(beginning-of-line)29 b(\(C-a\))10 b Fc(.)k(.)e(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(95)150 2299 y Fr(C)150 2438 y Fe(call-last-kbd-macro)30
+b(\(C-x)c(e\))10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)36 b Fb(101)150 2537 y Fe(capitalize-word)29
+b(\(M-c\))13 b Fc(.)g(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(97)150 2635
+y Fe(character-search)29 b(\(C-]\))10 b Fc(.)k(.)e(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)36
+b Fb(101)150 2734 y Fe(character-search-backward)31 b(\(M-C-]\))12
+b Fc(.)j(.)d(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(101)150 2832
+y Fe(clear-screen)28 b(\(C-l\))17 b Fc(.)d(.)e(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)43
+b Fb(95)150 2931 y Fe(complete)27 b(\()528 2928 y Fg(h)p
+553 2875 148 4 v 553 2931 a Ff(T)-6 b(AB)p 553 2946 V
+697 2928 a Fg(i)726 2931 y Fe(\))20 b Fc(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)45 b Fb(99)150 3029 y Fe(complete-command)29
+b(\(M-!\))10 b Fc(.)k(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)36 b Fb(100)150 3128 y Fe(complete-filename)
+29 b(\(M-/\))10 b Fc(.)k(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)35 b Fb(99)150 3226 y Fe(complete-hostname)
+29 b(\(M-@\))9 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)35 b Fb(100)150 3325 y Fe
+(complete-into-braces)30 b(\(M-{\))24 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)49 b Fb(100)150 3423
+y Fe(complete-username)29 b(\(M-~\))9 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)35
+b Fb(100)150 3522 y Fe(complete-variable)29 b(\(M-$\))9
+b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)35 b Fb(100)150 3620 y Fe(copy-backward-word)30
+b(\(\))13 b Fc(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(98)150 3719 y
+Fe(copy-forward-word)29 b(\(\))14 b Fc(.)f(.)g(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40
+b Fb(98)150 3817 y Fe(copy-region-as-kill)30 b(\(\))11
+b Fc(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)37 b Fb(98)150 4128 y Fr(D)150 4268 y
+Fe(delete-char)28 b(\(C-d\))20 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+44 b Fb(97)150 4366 y Fe(delete-char-or-list)30 b(\(\))11
+b Fc(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)37 b Fb(99)150 4465 y Fe(delete-horizontal-space)31
+b(\(\))24 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)49 b Fb(98)150 4563 y Fe(digit-argument)29
+b(\()p Fd(M-0)p Fe(,)e Fd(M-1)p Fe(,)f(...)g Fd(M--)p
+Fe(\))14 b Fc(.)g(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b
+Fb(99)150 4662 y Fe(display-shell-version)30 b(\(C-x)d(C-v\))c
+Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)48 b Fb(102)150
+4760 y Fe(do-uppercase-version)30 b(\(M-a,)d(M-b,)f(M-)p
+Fd(x)p Fe(,)h(...)q(\))317 4847 y Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)39
+b Fb(101)150 4946 y Fe(downcase-word)29 b(\(M-l\))16
+b Fc(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)41 b Fb(97)150 5044 y Fe(dump-functions)29
+b(\(\))18 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43 b Fb(102)150
+5143 y Fe(dump-macros)28 b(\(\))22 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)48 b Fb(102)150 5241 y Fe(dump-variables)29
+b(\(\))18 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43 b Fb(102)150
+5340 y Fe(dynamic-complete-history)31 b(\(M-)1234 5337
+y Fg(h)p 1259 5284 V 1259 5340 a Ff(T)-6 b(AB)p 1259
+5355 V 1403 5337 a Fg(i)1432 5340 y Fe(\))10 b Fc(.)j(.)g(.)f(.)g(.)h
+(.)f(.)36 b Fb(100)2025 610 y Fr(E)2025 730 y Fe
+(edit-and-execute-command)31 b(\(C-xC-e\))12 b Fc(.)i(.)f(.)f(.)g(.)h
+(.)f(.)g(.)39 b Fb(103)2025 819 y Fe(end-kbd-macro)28
+b(\(C-x)f(\)\))19 b Fc(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45 b Fb(100)2025
+909 y Fe(end-of-history)29 b(\(M->\))14 b Fc(.)f(.)g(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40
+b Fb(96)2025 998 y Fe(end-of-line)28 b(\(C-e\))20 b Fc(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44 b Fb(95)2025 1087 y
+Fe(exchange-point-and-mark)31 b(\(C-x)26 b(C-x\))20 b
+Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)45 b Fb(101)2025
+1349 y Fr(F)2025 1469 y Fe(forward-backward-delete-char)32
+b(\(\))16 b Fc(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)42
+b Fb(97)2025 1558 y Fe(forward-char)28 b(\(C-f\))17 b
+Fc(.)d(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)43 b Fb(95)2025 1647 y
+Fe(forward-search-history)30 b(\(C-s\))22 b Fc(.)13 b(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)47 b Fb(96)2025 1736
+y Fe(forward-word)28 b(\(M-f\))17 b Fc(.)d(.)e(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)43
+b Fb(95)2025 1988 y Fr(G)2025 2108 y Fe(glob-complete-word)29
+b(\(M-g\))7 b Fc(.)14 b(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)34 b Fb(102)2025 2197 y Fe(glob-expand-word)29
+b(\(C-x)e(*\))14 b Fc(.)f(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)40 b Fb(102)2025 2286 y Fe(glob-list-expansions)
+30 b(\(C-x)c(g\))8 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)35 b Fb(102)2025 2548 y Fr(H)2025 2668 y Fe
+(history-and-alias-expand-line)d(\(\))14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)40 b Fb(103)2025 2757 y Fe(history-expand-line)30
+b(\(M-^\))25 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)50 b Fb(102)2025 2846 y Fe(history-search-backward)31
+b(\(\))24 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)49 b Fb(96)2025 2935 y Fe(history-search-forward)30
+b(\(\))7 b Fc(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)33 b Fb(96)2025 3197 y Fr(I)2025 3317
+y Fe(insert-comment)c(\(M-#\))13 b Fc(.)g(.)g(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)39
+b Fb(101)2025 3406 y Fe(insert-completions)29 b(\(M-*\))8
+b Fc(.)14 b(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)34 b Fb(99)2025 3495 y Fe(insert-last-argument)c(\(M-.)c(or)
+g(M-_\))8 b Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)34
+b Fb(103)2025 3757 y Fr(K)2025 3877 y Fe(kill-line)27
+b(\(C-k\))c Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)47
+b Fb(98)2025 3966 y Fe(kill-region)28 b(\(\))23 b Fc(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)49 b Fb(98)2025
+4056 y Fe(kill-whole-line)29 b(\(\))17 b Fc(.)c(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)
+43 b Fb(98)2025 4145 y Fe(kill-word)27 b(\(M-d\))c Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)47 b Fb(98)2025
+4396 y Fr(M)2025 4516 y Fe(magic-space)28 b(\(\))22 b
+Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)48 b Fb(102)2025
+4605 y Fe(menu-complete)28 b(\(\))21 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)46 b Fb(99)2025 4867 y Fr(N)2025 4987 y Fe(next-history)28
+b(\(C-n\))17 b Fc(.)d(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)43 b Fb(96)2025
+5076 y Fe(non-incremental-forward-search)q(-hist)q(ory)32
+b(\(M-n\))2193 5164 y Fc(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b Fb(96)2025
+5253 y Fe(non-incremental-reverse-search)q(-hist)q(ory)32
+b(\(M-p\))2193 5340 y Fc(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b Fb(96)p
+eop
+%%Page: 146 152
+146 151 bop 150 -116 a Ft(146)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+150 299 y Fr(O)150 422 y Fe(operate-and-get-next)f(\(C-o\))24
+b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)49
+b Fb(103)150 513 y Fe(overwrite-mode)29 b(\(\))19 b Fc(.)12
+b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)44 b Fb(97)150 772 y Fr(P)150
+895 y Fe(possible-command-completions)32 b(\(C-x)26 b(!\))15
+b Fc(.)e(.)g(.)f(.)g(.)41 b Fb(100)150 985 y Fe(possible-completions)30
+b(\(M-?\))25 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)g(.)h(.)49 b Fb(99)150 1076 y Fe(possible-filename-completions)32
+b(\(C-x)27 b(/\))14 b Fc(.)e(.)g(.)h(.)39 b Fb(100)150
+1167 y Fe(possible-hostname-completions)32 b(\(C-x)27
+b(@\))14 b Fc(.)e(.)g(.)h(.)39 b Fb(100)150 1257 y Fe
+(possible-username-completions)32 b(\(C-x)27 b(~\))14
+b Fc(.)e(.)g(.)h(.)39 b Fb(100)150 1348 y Fe
+(possible-variable-completions)32 b(\(C-x)27 b($\))14
+b Fc(.)e(.)g(.)h(.)39 b Fb(100)150 1438 y Fe(prefix-meta)28
+b(\()646 1435 y Fg(h)p 671 1382 139 4 v 671 1438 a Ff(ESC)p
+671 1454 V 804 1435 a Fg(i)834 1438 y Fe(\))19 b Fc(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)45 b Fb(101)150 1529 y Fe(previous-history)29
+b(\(C-p\))11 b Fc(.)j(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(96)150 1799 y
+Fr(Q)150 1922 y Fe(quoted-insert)29 b(\(C-q)d(or)g(C-v\))20
+b Fc(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)45 b Fb(97)150 2191 y Fr(R)150 2314 y Fe(re-read-init-file)29
+b(\(C-x)e(C-r\))10 b Fc(.)j(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)36 b Fb(101)150 2405 y Fe(redraw-current-line)30
+b(\(\))11 b Fc(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)37 b Fb(95)150 2496 y Fe
+(reverse-search-history)31 b(\(C-r\))22 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46 b Fb(96)150 2586 y
+Fe(revert-line)28 b(\(M-r\))18 b Fc(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43
+b Fb(101)2025 299 y Fr(S)2025 417 y Fe(self-insert)28
+b(\(a,)e(b,)g(A,)g(1,)g(!,)g(...)q(\))13 b Fc(.)f(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(97)2025 505 y Fe(set-mark)27
+b(\(C-@\))c Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)48
+b Fb(101)2025 593 y Fe(shell-expand-line)29 b(\(M-C-e\))d
+Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)50
+b Fb(102)2025 681 y Fe(start-kbd-macro)29 b(\(C-x)d(\(\))16
+b Fc(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)42 b Fb(100)2025 927 y Fr(T)2025 1045 y Fe(tilde-expand)28
+b(\(M-&\))16 b Fc(.)e(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)42 b Fb(101)2025
+1133 y Fe(transpose-chars)29 b(\(C-t\))13 b Fc(.)g(.)f(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)39
+b Fb(97)2025 1221 y Fe(transpose-words)29 b(\(M-t\))13
+b Fc(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)39 b Fb(97)2025 1477 y Fr(U)2025
+1595 y Fe(undo)26 b(\(C-_)h(or)f(C-x)g(C-u\))14 b Fc(.)f(.)g(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40
+b Fb(101)2025 1683 y Fe(universal-argument)29 b(\(\))13
+b Fc(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)39 b Fb(99)2025 1771 y Fe(unix-line-discard)29
+b(\(C-u\))10 b Fc(.)k(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)36 b Fb(98)2025 1860 y Fe(unix-word-rubout)
+29 b(\(C-w\))11 b Fc(.)j(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)37 b Fb(98)2025 1948
+y Fe(upcase-word)28 b(\(M-u\))20 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)44 b Fb(97)2025 2204 y Fr(Y)2025 2322 y Fe(yank)26
+b(\(C-y\))11 b Fc(.)i(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)36 b Fb(98)2025 2410 y Fe(yank-last-arg)28
+b(\(M-.)f(or)f(M-_\))20 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)h(.)f(.)45 b Fb(96)2025 2498 y Fe(yank-nth-arg)28
+b(\(M-C-y\))14 b Fc(.)g(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)40 b Fb(96)2025
+2586 y Fe(yank-pop)27 b(\(M-y\))d Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)49 b Fb(98)p eop
+%%Page: 147 153
+147 152 bop 150 -116 a Ft(Concept)31 b(Index)2882 b(147)150
+299 y Fo(Concept)52 b(Index)150 638 y Fr(A)150 754 y
+Fb(alias)27 b(expansion)20 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)45 b Fb(71)150 841 y(arithmetic)25 b(ev)l(aluation)g
+Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)50 b Fb(70)150 929 y(arithmetic)25
+b(expansion)12 b Fc(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)38 b Fb(21)150
+1016 y(arithmetic,)26 b(shell)20 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)45 b Fb(70)150 1103 y(arra)n(ys)6 b Fc(.)13
+b(.)g(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)32 b Fb(72)150 1353 y Fr(B)150 1469 y Fb(bac)n(kground)23
+b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)49
+b Fb(79)150 1556 y(Bash)26 b(con\014guration)11 b Fc(.)i(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)36 b Fb(115)150 1643 y(Bash)26 b(installation)6
+b Fc(.)15 b(.)d(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)32 b Fb(115)150
+1730 y(Bourne)26 b(shell)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)36 b Fb(5)150 1818 y(brace)26
+b(expansion)d Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)48
+b Fb(17)150 1905 y(builtin)17 b Fc(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)43 b
+Fb(3)150 2138 y Fr(C)150 2254 y Fb(command)24 b(editing)19
+b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44 b Fb(83)150
+2341 y(command)24 b(execution)11 b Fc(.)h(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+37 b Fb(28)150 2428 y(command)24 b(expansion)f Fc(.)12
+b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)48 b Fb(28)150 2515 y(command)24
+b(history)16 b Fc(.)d(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(109)150 2603 y(command)24 b(searc)n(h)12 b Fc(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)38 b Fb(28)150 2690 y(command)24
+b(substitution)g Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)49 b Fb(21)150
+2777 y(command)24 b(timing)8 b Fc(.)k(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)34 b Fb(8)150 2864 y(commands,)24 b(comp)r(ound)8
+b Fc(.)k(.)g(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34 b Fb(9)150 2952 y(commands,)24
+b(conditional)13 b Fc(.)h(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)39 b Fb(10)150
+3039 y(commands,)24 b(grouping)15 b Fc(.)f(.)e(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)41
+b Fb(13)150 3126 y(commands,)24 b(lists)6 b Fc(.)14 b(.)f(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(9)150 3213 y(commands,)24
+b(lo)r(oping)h Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)49
+b Fb(9)150 3300 y(commands,)24 b(pip)r(elines)17 b Fc(.)d(.)e(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)43 b Fb(8)150 3388 y(commands,)24 b(shell)16
+b Fc(.)e(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)42
+b Fb(8)150 3475 y(commands,)24 b(simple)d Fc(.)12 b(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)47 b Fb(8)150 3562 y(commen)n(ts,)24
+b(shell)8 b Fc(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+34 b Fb(7)150 3649 y(completion)26 b(builtins)c Fc(.)12
+b(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)48 b Fb(105)150 3736 y(con\014guration)15
+b Fc(.)e(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)41
+b Fb(115)150 3824 y(con)n(trol)26 b(op)r(erator)c Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)47 b Fb(3)150
+4073 y Fr(D)150 4189 y Fb(directory)26 b(stac)n(k)e Fc(.)12
+b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)49 b Fb(73)150
+4439 y Fr(E)150 4555 y Fb(editing)26 b(command)e(lines)f
+Fc(.)12 b(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)47 b Fb(83)150 4642 y(en)n(vironmen)n(t)10
+b Fc(.)h(.)h(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)35
+b Fb(30)150 4729 y(ev)l(aluation,)26 b(arithmetic)13
+b Fc(.)g(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)39 b Fb(70)150 4817 y(ev)n(en)n(t)25
+b(designators)18 b Fc(.)c(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)44
+b Fb(111)150 4904 y(execution)26 b(en)n(vironmen)n(t)18
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)45 b Fb(29)150 4991 y(exit)25
+b(status)17 b Fc(.)c(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)43 b Fb(3,)26 b(30)150 5078 y(expansion)16 b Fc(.)d(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b
+Fb(16)150 5166 y(expansion,)26 b(arithmetic)19 b Fc(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)45 b Fb(21)150 5253 y(expansion,)26
+b(brace)12 b Fc(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)38
+b Fb(17)150 5340 y(expansion,)26 b(\014lename)18 b Fc(.)11
+b(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 b Fb(22)2025 638 y(expansion,)26
+b(parameter)21 b Fc(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)47 b Fb(18)2025
+729 y(expansion,)26 b(pathname)8 b Fc(.)j(.)h(.)h(.)f(.)g(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)34
+b Fb(22)2025 819 y(expansion,)26 b(tilde)9 b Fc(.)j(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)35 b Fb(18)2025 910 y(expressions,)27
+b(arithmetic)16 b Fc(.)c(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)42 b Fb(70)2025
+1000 y(expressions,)27 b(conditional)22 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)47
+b Fb(69)2025 1267 y Fr(F)2025 1390 y Fb(FDL,)25 b(GNU)g(F)-6
+b(ree)26 b(Do)r(cumen)n(tation)f(License)10 b Fc(.)j(.)g(.)f(.)g(.)h(.)
+36 b Fb(131)2025 1480 y(\014eld)21 b Fc(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)48
+b Fb(3)2025 1571 y(\014lename)8 b Fc(.)j(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34 b Fb(3)2025
+1661 y(\014lename)25 b(expansion)10 b Fc(.)i(.)h(.)f(.)g(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)36 b Fb(22)2025 1752 y(foreground)20 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)45
+b Fb(79)2025 1842 y(functions,)26 b(shell)c Fc(.)13 b(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)47 b Fb(13)2025 2109 y Fr(H)2025
+2232 y Fb(history)25 b(builtins)16 b Fc(.)d(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)42 b Fb(109)2025 2322 y(history)25 b(ev)n(en)n(ts)20
+b Fc(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46
+b Fb(111)2025 2413 y(history)25 b(expansion)13 b Fc(.)g(.)f(.)h(.)f(.)g
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)39 b Fb(111)2025 2503 y(history)25 b(list)18
+b Fc(.)c(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)44
+b Fb(109)2025 2594 y(History)-6 b(,)25 b(ho)n(w)h(to)g(use)20
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)46 b Fb(108)2025 2861
+y Fr(I)2025 2984 y Fb(iden)n(ti\014er)16 b Fc(.)c(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)43
+b Fb(3)2025 3074 y(initialization)28 b(\014le,)e(readline)7
+b Fc(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)33 b Fb(86)2025 3165 y(installation)11
+b Fc(.)j(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)37
+b Fb(115)2025 3255 y(in)n(teraction,)26 b(readline)9
+b Fc(.)14 b(.)e(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)35 b Fb(83)2025
+3346 y(in)n(teractiv)n(e)26 b(shell)20 b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)45 b Fb(65,)27 b(67)2025 3436 y(in)n(ternationalization)21
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)45 b Fb(7)2025
+3686 y Fr(J)2025 3809 y Fb(job)22 b Fc(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)48
+b Fb(3)2025 3900 y(job)26 b(con)n(trol)12 b Fc(.)h(.)f(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)38 b Fb(3,)26 b(79)2025
+4166 y Fr(K)2025 4289 y Fb(kill)g(ring)14 b Fc(.)f(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)40
+b Fb(85)2025 4380 y(killing)26 b(text)16 b Fc(.)c(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)42 b Fb(85)2025
+4647 y Fr(L)2025 4769 y Fb(lo)r(calization)10 b Fc(.)15
+b(.)d(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)36
+b Fb(7)2025 4860 y(login)26 b(shell)13 b Fc(.)h(.)e(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)39 b Fb(65)2025
+5127 y Fr(M)2025 5249 y Fb(matc)n(hing,)25 b(pattern)7
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)33 b Fb(23)2025
+5340 y(metac)n(haracter)17 b Fc(.)c(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)44 b Fb(3)p eop
+%%Page: 148 154
+148 153 bop 150 -116 a Ft(148)2527 b(Bash)31 b(Reference)g(Man)m(ual)
+150 299 y Fr(N)150 417 y Fb(name)20 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)47
+b Fb(3)150 506 y(nativ)n(e)25 b(languages)14 b Fc(.)h(.)d(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)h(.)40 b Fb(7)150 594 y(notation,)27
+b(readline)12 b Fc(.)h(.)f(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)38
+b Fb(83)150 851 y Fr(O)150 969 y Fb(op)r(erator,)27 b(shell)15
+b Fc(.)e(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)41
+b Fb(3)150 1225 y Fr(P)150 1344 y Fb(parameter)25 b(expansion)14
+b Fc(.)f(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)40 b Fb(18)150 1432 y(parameters)14
+b Fc(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)39
+b Fb(15)150 1521 y(parameters,)26 b(p)r(ositional)9 b
+Fc(.)14 b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)34 b Fb(15)150 1609 y(parameters,)26
+b(sp)r(ecial)f Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)49
+b Fb(15)150 1698 y(pathname)24 b(expansion)19 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)44 b Fb(22)150 1786 y(pattern)25
+b(matc)n(hing)18 b Fc(.)12 b(.)g(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43
+b Fb(23)150 1875 y(pip)r(eline)15 b Fc(.)e(.)f(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)41 b
+Fb(8)150 1963 y(POSIX)8 b Fc(.)k(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)34 b Fb(3)150
+2052 y(POSIX)25 b(Mo)r(de)10 b Fc(.)i(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)35 b Fb(76)150 2140 y(pro)r(cess)27
+b(group)7 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)33 b Fb(3)150 2229 y(pro)r(cess)27 b(group)e(ID)f
+Fc(.)12 b(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)50
+b Fb(3)150 2317 y(pro)r(cess)27 b(substitution)10 b Fc(.)i(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)
+f(.)g(.)h(.)f(.)36 b Fb(22)150 2406 y(programmable)25
+b(completion)16 b Fc(.)c(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)g(.)42 b Fb(103)150 2494 y(prompting)7
+b Fc(.)k(.)h(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)32 b Fb(75)150 2750 y Fr(Q)150 2869 y Fb(quoting)19
+b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)46 b Fb(6)150 2957 y(quoting,)26 b(ANSI)12
+b Fc(.)f(.)h(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)38
+b Fb(6)150 3213 y Fr(R)150 3332 y Fb(Readline,)26 b(ho)n(w)g(to)g(use)
+14 b Fc(.)e(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)39 b Fb(82)150 3421
+y(redirection)21 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)46 b Fb(24)2025 299 y(reserv)n(ed)25
+b(w)n(ord)f Fc(.)13 b(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)50 b Fb(3)2025 386 y(restricted)26 b(shell)8 b Fc(.)13
+b(.)g(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)34
+b Fb(76)2025 473 y(return)25 b(status)19 b Fc(.)13 b(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45 b Fb(3)2025
+707 y Fr(S)2025 823 y Fb(shell)26 b(arithmetic)12 b Fc(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)38 b Fb(70)2025 910 y(shell)26
+b(function)11 b Fc(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)37 b Fb(13)2025 997 y(shell)26 b(script)18 b Fc(.)13
+b(.)f(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)44
+b Fb(31)2025 1084 y(shell)26 b(v)l(ariable)17 b Fc(.)c(.)g(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)43 b Fb(15)2025 1172
+y(shell,)26 b(in)n(teractiv)n(e)16 b Fc(.)d(.)g(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)h(.)f(.)42 b Fb(67)2025 1259 y(signal)14 b Fc(.)f(.)g(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)40
+b Fb(4)2025 1346 y(signal)27 b(handling)18 b Fc(.)13
+b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)44 b Fb(31)2025
+1433 y(sp)r(ecial)27 b(builtin)12 b Fc(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)g(.)h(.)38 b Fb(4,)26 b(53)2025 1521 y(startup)f(\014les)20
+b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)45
+b Fb(65)2025 1608 y(susp)r(ending)25 b(jobs)7 b Fc(.)14
+b(.)e(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)33 b Fb(79)2025
+1858 y Fr(T)2025 1974 y Fb(tilde)26 b(expansion)19 b
+Fc(.)13 b(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)45
+b Fb(18)2025 2061 y(tok)n(en)18 b Fc(.)12 b(.)g(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)45
+b Fb(4)2025 2148 y(translation,)27 b(nativ)n(e)e(languages)9
+b Fc(.)14 b(.)f(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f
+(.)g(.)h(.)35 b Fb(7)2025 2398 y Fr(V)2025 2514 y Fb(v)l(ariable,)26
+b(shell)7 b Fc(.)13 b(.)f(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)
+h(.)32 b Fb(15)2025 2601 y(v)l(ariables,)27 b(readline)7
+b Fc(.)12 b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)32 b Fb(87)2025
+2851 y Fr(W)2025 2967 y Fb(w)n(ord)10 b Fc(.)i(.)h(.)f(.)g(.)h(.)f(.)g
+(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)
+f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)36
+b Fb(4)2025 3055 y(w)n(ord)26 b(splitting)21 b Fc(.)12
+b(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)46
+b Fb(22)2025 3304 y Fr(Y)2025 3421 y Fb(y)n(anking)25
+b(text)7 b Fc(.)k(.)i(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h
+(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)h(.)f(.)g(.)h(.)f(.)
+g(.)33 b Fb(85)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/bashref.rw b/doc/bashref.rw
new file mode 100644 (file)
index 0000000..bacca57
--- /dev/null
@@ -0,0 +1,21 @@
+\entry{time}{8}{\code {time}}
+\entry{!}{8}{\code {!}}
+\entry{until}{9}{\code {until}}
+\entry{do}{9}{\code {do}}
+\entry{done}{9}{\code {done}}
+\entry{while}{10}{\code {while}}
+\entry{for}{10}{\code {for}}
+\entry{if}{10}{\code {if}}
+\entry{then}{10}{\code {then}}
+\entry{else}{10}{\code {else}}
+\entry{elif}{10}{\code {elif}}
+\entry{fi}{10}{\code {fi}}
+\entry{case}{11}{\code {case}}
+\entry{in}{11}{\code {in}}
+\entry{esac}{11}{\code {esac}}
+\entry{select}{11}{\code {select}}
+\entry{[[}{12}{\code {[[}}
+\entry{]]}{12}{\code {]]}}
+\entry{{\tt \char 123}}{13}{\code {{\tt \char 123}}}
+\entry{{\tt \char 125}}{13}{\code {{\tt \char 125}}}
+\entry{function}{13}{\code {function}}
diff --git a/doc/bashref.rws b/doc/bashref.rws
new file mode 100644 (file)
index 0000000..45fd49c
--- /dev/null
@@ -0,0 +1,35 @@
+\initial {!}
+\entry {\code {!}}{8}
+\initial {[}
+\entry {\code {[[}}{12}
+\initial {]}
+\entry {\code {]]}}{12}
+\initial {{\tt \char 123}}
+\entry {\code {{\tt \char 123}}}{13}
+\initial {{\tt \char 125}}
+\entry {\code {{\tt \char 125}}}{13}
+\initial {C}
+\entry {\code {case}}{11}
+\initial {D}
+\entry {\code {do}}{9}
+\entry {\code {done}}{9}
+\initial {E}
+\entry {\code {elif}}{10}
+\entry {\code {else}}{10}
+\entry {\code {esac}}{11}
+\initial {F}
+\entry {\code {fi}}{10}
+\entry {\code {for}}{10}
+\entry {\code {function}}{13}
+\initial {I}
+\entry {\code {if}}{10}
+\entry {\code {in}}{11}
+\initial {S}
+\entry {\code {select}}{11}
+\initial {T}
+\entry {\code {then}}{10}
+\entry {\code {time}}{8}
+\initial {U}
+\entry {\code {until}}{9}
+\initial {W}
+\entry {\code {while}}{10}
index 849a85a..98e6f2f 100644 (file)
@@ -1204,6 +1204,7 @@ Word splitting is not performed, with the exception
 of @code{"$@@"} as explained below.
 Filename expansion is not performed.
 Assignment statements may also appear as arguments to the
+@code{alias}, 
 @code{declare}, @code{typeset}, @code{export}, @code{readonly},
 and @code{local} builtin commands.
 
@@ -2472,10 +2473,11 @@ In all cases, Bash ignores @code{SIGQUIT}.
 If job control is in effect (@pxref{Job Control}), Bash
 ignores @code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}.
 
-Commands started by Bash have signal handlers set to the
+Non-builtin commands started by Bash have signal handlers set to the
 values inherited by the shell from its parent.
 When job control is not in effect, asynchronous commands
-ignore @code{SIGINT} and @code{SIGQUIT} as well.
+ignore @code{SIGINT} and @code{SIGQUIT} in addition to these inherited
+handlers.
 Commands run as a result of
 command substitution ignore the keyboard-generated job control signals
 @code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}.
@@ -2495,9 +2497,9 @@ If the  @code{huponexit} shell option has been set with @code{shopt}
 (@pxref{Bash Builtins}), Bash sends a @code{SIGHUP} to all jobs when
 an interactive login shell exits.
 
-When Bash receives a signal for which a trap has been set while waiting
-for a command to complete, the trap will not be executed until the
-command completes. 
+If Bash is waiting for a command to complete and receives a signal
+for which a trap has been set, the trap will not be executed until
+the command completes. 
 When Bash is waiting for an asynchronous
 command via the @code{wait} builtin, the reception of a signal for
 which a trap has been set will cause the @code{wait} builtin to return
@@ -2993,12 +2995,14 @@ Refer to the description of the @code{extglob} option to the
 @code{shopt} builtin (@pxref{Bash Builtins}) for details of its
 effect on the @code{DEBUG} trap.
 If a @var{sigspec} is @code{ERR}, the command @var{arg} 
-is executed whenever a simple command has a non-zero exit status.
+is executed whenever a simple command has a non-zero exit status,
+subject to the following conditions.
 The @code{ERR} trap is not executed if the failed command is part of the
 command list immediately following an @code{until} or @code{while} keyword,
 part of the test in an @code{if} statement,
 part of a @code{&&} or @code{||} list, or if the command's return
 status is being inverted using @code{!}.
+These are the same conditions obeyed by the @code{errexit} option.
 If a @var{sigspec} is @code{RETURN}, the command @var{arg} is executed
 each time a shell function or a script executed with the @code{.} or
 @code{source} builtins finishes executing.
@@ -3170,7 +3174,7 @@ builtin command.
 caller [@var{expr}]
 @end example
 Returns the context of any active subroutine call (a shell function or
-a script executed with the @code{.} or @code{source} builtins.
+a script executed with the @code{.} or @code{source} builtins).
 
 Without @var{expr}, @code{caller} displays the line number and source
 filename of the current subroutine call.
@@ -3412,7 +3416,11 @@ format specifications, each of which causes printing of the next successive
 @var{argument}.
 In addition to the standard @code{printf(1)} formats, @samp{%b} causes
 @code{printf} to expand backslash escape sequences in the corresponding
-@var{argument}, and @samp{%q} causes @code{printf} to output the
+@var{argument},
+(except that @samp{\c} terminates output, backslashes in
+@samp{\'}, @samp{\"}, and @samp{\?} are not removed, and octal escapes
+beginning with @samp{\0} may contain up to four digits),
+and @samp{%q} causes @code{printf} to output the
 corresponding @var{argument} in a format that can be reused as shell input.
 
 The @var{format} is reused as necessary to consume all of the @var{arguments}.
@@ -6813,6 +6821,8 @@ Bash provides a programmable word completion mechanism
 @item
 Bash has command history (@pxref{Bash History Facilities}) and the
 @code{history} and @code{fc} builtins to manipulate it.
+The Bash history list maintains timestamp information and uses the
+value of the @code{HISTTIMEFORMAT} variable to display it.
 
 @item
 Bash implements @code{csh}-like history expansion
@@ -7062,11 +7072,22 @@ Bash has much more optional behavior controllable with the @code{set}
 builtin (@pxref{The Set Builtin}).
 
 @item
+The @samp{-x} (@code{xtrace}) option displays commands other than
+simple commands when performing an execution trace
+(@pxref{The Set Builtin}).
+
+@item
 The @code{test} builtin (@pxref{Bourne Shell Builtins})
 is slightly different, as it implements the @sc{posix} algorithm,
 which specifies the behavior based on the number of arguments.
 
 @item
+Bash includes the @code{caller} builtin, which displays the context of
+any active subroutine call (a shell function or a script executed with
+the @code{.} or @code{source} builtins).  This supports the bash
+debugger.
+
+@item
 The @code{trap} builtin (@pxref{Bourne Shell Builtins}) allows a
 @code{DEBUG} pseudo-signal specification, similar to @code{EXIT}.
 Commands specified with a @code{DEBUG} trap are executed before every
diff --git a/doc/bashref.texi.orig b/doc/bashref.texi.orig
new file mode 100644 (file)
index 0000000..fdce9e3
--- /dev/null
@@ -0,0 +1,7105 @@
+\input texinfo.tex @c -*- texinfo -*-
+@c %**start of header
+@setfilename bashref.info
+@settitle Bash Reference Manual
+@c %**end of header
+
+@setchapternewpage odd
+
+@include version.texi
+
+@copying
+This text is a brief description of the features that are present in
+the Bash shell (version @value{VERSION}, @value{UPDATED}).
+
+This is Edition @value{EDITION}, last updated @value{UPDATED},
+of @cite{The GNU Bash Reference Manual},
+for @code{Bash}, Version @value{VERSION}.
+
+Copyright @copyright{} 1988-2003 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.1 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU Manual,''
+and with the Back-Cover Texts as in (a) below.  A copy of the license is
+included in the section entitled ``GNU Free Documentation License.''
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+@end quotation
+@end copying
+
+@defcodeindex bt
+@defcodeindex rw
+@set BashFeatures
+
+@dircategory Basics
+@direntry
+* Bash: (bash).                     The GNU Bourne-Again SHell.
+@end direntry
+
+@finalout
+
+@titlepage
+@title Bash Reference Manual
+@subtitle Reference Documentation for Bash
+@subtitle Edition @value{EDITION}, for @code{Bash} Version @value{VERSION}.
+@subtitle @value{UPDATED-MONTH}
+@author Chet Ramey, Case Western Reserve University
+@author Brian Fox, Free Software Foundation
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+
+@sp 1
+Published by the Free Software Foundation @*
+59 Temple Place, Suite 330, @*
+Boston, MA 02111-1307 @*
+USA @*
+
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top, Introduction, (dir), (dir)
+@top Bash Features
+
+This text is a brief description of the features that are present in
+the Bash shell (version @value{VERSION}, @value{UPDATED})..
+
+This is Edition @value{EDITION}, last updated @value{UPDATED},
+of @cite{The GNU Bash Reference Manual},
+for @code{Bash}, Version @value{VERSION}.
+
+Bash contains features that appear in other popular shells, and some
+features that only appear in Bash.  Some of the shells that Bash has
+borrowed concepts from are the Bourne Shell (@file{sh}), the Korn Shell
+(@file{ksh}), and the C-shell (@file{csh} and its successor,
+@file{tcsh}). The following menu breaks the features up into
+categories based upon which one of these other shells inspired the
+feature.
+
+This manual is meant as a brief introduction to features found in
+Bash.  The Bash manual page should be used as the definitive
+reference on shell behavior.
+
+@menu
+* Introduction::               An introduction to the shell.
+
+* Definitions::                        Some definitions used in the rest of this
+                               manual.
+
+* Basic Shell Features::       The shell "building blocks".
+
+* Shell Builtin Commands::     Commands that are a part of the shell.
+
+* Shell Variables::            Variables used or set by Bash.
+
+* Bash Features::              Features found only in Bash.
+
+* Job Control::                        A chapter describing what job control is
+                               and how Bash allows you to use it.
+
+* Using History Interactively::        Chapter dealing with history expansion
+                               rules.
+
+* Command Line Editing::       Chapter describing the command line
+                               editing features.
+
+* Installing Bash::            How to build and install Bash on your system.
+
+* Reporting Bugs::             How to report bugs in Bash.
+
+* Major Differences From The Bourne Shell::    A terse list of the differences
+                                               between Bash and historical
+                                               versions of /bin/sh.
+
+* Copying This Manual::                Copying this manual.
+
+* Builtin Index::              Index of Bash builtin commands.
+
+* Reserved Word Index::                Index of Bash reserved words.
+
+* Variable Index::             Quick reference helps you find the
+                               variable you want.
+
+* Function Index::             Index of bindable Readline functions.
+
+* Concept Index::              General index for concepts described in
+                               this manual.
+@end menu
+@end ifnottex
+
+@node Introduction
+@chapter Introduction
+@menu
+* What is Bash?::              A short description of Bash.
+
+* What is a shell?::           A brief introduction to shells.
+@end menu
+
+@node What is Bash?
+@section What is Bash?
+
+Bash is the shell, or command language interpreter,
+for the @sc{gnu} operating system.
+The name is an acronym for the @samp{Bourne-Again SHell},
+a pun on Stephen Bourne, the author of the direct ancestor of
+the current Unix shell @code{/bin/sh}, 
+which appeared in the Seventh Edition Bell Labs Research version
+of Unix.
+
+Bash is largely compatible with @code{sh} and incorporates useful
+features from the Korn shell @code{ksh} and the C shell @code{csh}.
+It is intended to be a conformant implementation of the @sc{ieee}
+@sc{posix} Shell and Tools specification (@sc{ieee} Working Group 1003.2).
+It offers functional improvements over @code{sh} for both interactive and
+programming use.
+
+While the @sc{gnu} operating system provides other shells, including
+a version of @code{csh}, Bash is the default shell.
+Like other @sc{gnu} software, Bash is quite portable.  It currently runs
+on nearly every version of Unix and a few other operating systems @minus{}
+independently-supported ports exist for @sc{ms-dos}, @sc{os/2},
+Windows @sc{95/98}, and Windows @sc{nt}.
+
+@node What is a shell?
+@section What is a shell?
+
+At its base, a shell is simply a macro processor that executes
+commands.  A Unix shell is both a command interpreter, which
+provides the user interface to the rich set of @sc{gnu} utilities,
+and a programming language, allowing these utilitites to be
+combined.  Files containing commands can be created, and become
+commands themselves.  These new commands have the same status as
+system commands in directories such as @file{/bin}, allowing users
+or groups to establish custom environments. 
+
+A shell allows execution of @sc{gnu} commands, both synchronously and
+asynchronously.
+The shell waits for synchronous commands to complete before accepting
+more input; asynchronous commands continue to execute in parallel
+with the shell while it reads and executes additional commands.
+The @dfn{redirection} constructs permit
+fine-grained control of the input and output of those commands.
+Moreover, the shell allows control over the contents of commands'
+environments.
+Shells may be used interactively or non-interactively: they accept
+input typed from the keyboard or from a file.
+
+Shells also provide a small set of built-in
+commands (@dfn{builtins}) implementing functionality impossible
+or inconvenient to obtain via separate utilities.
+For example, @code{cd}, @code{break}, @code{continue}, and
+@code{exec}) cannot be implemented outside of the shell because
+they directly manipulate the shell itself.
+The @code{history}, @code{getopts}, @code{kill}, or @code{pwd}
+builtins, among others, could be implemented in separate utilities,
+but they are more convenient to use as builtin commands.
+All of the shell builtins are described in
+subsequent sections.
+
+While executing commands is essential, most of the power (and
+complexity) of shells is due to their embedded programming
+languages.  Like any high-level language, the shell provides
+variables, flow control constructs, quoting, and functions. 
+
+Shells offer features geared specifically for
+interactive use rather than to augment the programming language. 
+These interactive features include job control, command line
+editing, history and aliases.  Each of these features is
+described in this manual.
+
+@node Definitions
+@chapter Definitions
+These definitions are used throughout the remainder of this manual.
+
+@table @code
+
+@item POSIX
+@cindex POSIX
+A family of open system standards based on Unix.  Bash
+is concerned with @sc{posix} 1003.2, the Shell and Tools Standard.
+
+@item blank
+A space or tab character.
+
+@item builtin
+@cindex builtin
+A command that is implemented internally by the shell itself, rather
+than by an executable program somewhere in the file system.
+
+@item control operator
+@cindex control operator
+A @code{word} that performs a control function.  It is a @code{newline}
+or one of the following:
+@samp{||}, @samp{&&}, @samp{&}, @samp{;}, @samp{;;},
+@samp{|}, @samp{(}, or @samp{)}.
+
+@item exit status
+@cindex exit status
+The value returned by a command to its caller.  The value is restricted
+to eight bits, so the maximum value is 255.
+
+@item field
+@cindex field
+A unit of text that is the result of one of the shell expansions.  After
+expansion, when executing a command, the resulting fields are used as
+the command name and arguments.
+
+@item filename
+@cindex filename
+A string of characters used to identify a file.
+
+@item job
+@cindex job
+A set of processes comprising a pipeline, and any processes descended
+from it, that are all in the same process group.
+
+@item job control
+@cindex job control
+A mechanism by which users can selectively stop (suspend) and restart
+(resume) execution of processes.
+
+@item metacharacter
+@cindex metacharacter
+A character that, when unquoted, separates words.  A metacharacter is
+a @code{blank} or one of the following characters:
+@samp{|}, @samp{&}, @samp{;}, @samp{(}, @samp{)}, @samp{<}, or
+@samp{>}.
+
+@item name
+@cindex name
+@cindex identifier
+A @code{word} consisting solely of letters, numbers, and underscores,
+and beginning with a letter or underscore.  @code{Name}s are used as
+shell variable and function names.
+Also referred to as an @code{identifier}.
+
+@item operator
+@cindex operator, shell
+A @code{control operator} or a @code{redirection operator}.
+@xref{Redirections}, for a list of redirection operators.
+
+@item process group
+@cindex process group
+A collection of related processes each having the same process
+group @sc{id}.
+
+@item process group ID
+@cindex process group ID
+A unique identifer that represents a @code{process group}
+during its lifetime.
+
+@item reserved word
+@cindex reserved word
+A @code{word} that has a special meaning to the shell.  Most reserved
+words introduce shell flow control constructs, such as @code{for} and
+@code{while}.
+
+@item return status
+@cindex return status
+A synonym for @code{exit status}.
+
+@item signal
+@cindex signal
+A mechanism by which a process may be notified by the kernel
+of an event occurring in the system.
+
+@item special builtin
+@cindex special builtin
+A shell builtin command that has been classified as special by the
+@sc{posix} 1003.2 standard.
+
+@item token
+@cindex token
+A sequence of characters considered a single unit by the shell.  It is
+either a @code{word} or an @code{operator}.
+
+@item word
+@cindex word
+A @code{token} that is not an @code{operator}.
+@end table
+
+@node Basic Shell Features
+@chapter Basic Shell Features
+@cindex Bourne shell
+
+Bash is an acronym for @samp{Bourne-Again SHell}.
+The Bourne shell is
+the traditional Unix shell originally written by Stephen Bourne.
+All of the Bourne shell builtin commands are available in Bash,
+and the rules for evaluation and quoting are taken from the @sc{posix}
+1003.2 specification for the `standard' Unix shell.
+
+This chapter briefly summarizes the shell's `building blocks':
+commands, control structures, shell functions, shell @i{parameters},
+shell expansions,
+@i{redirections}, which are a way to direct input and output from
+and to named files, and how the shell executes commands.
+
+@menu
+* Shell Syntax::               What your input means to the shell.
+* Shell Commands::             The types of commands you can use.
+* Shell Functions::            Grouping commands by name.
+* Shell Parameters::           How the shell stores values.
+* Shell Expansions::           How Bash expands parameters and the various
+                               expansions available.
+* Redirections::               A way to control where input and output go.
+* Executing Commands::         What happens when you run a command.
+* Shell Scripts::              Executing files of shell commands.
+@end menu
+
+@node Shell Syntax
+@section Shell Syntax
+@menu
+* Shell Operation::    The basic operation of the shell.
+
+* Quoting::            How to remove the special meaning from characters.
+
+* Comments::           How to specify comments.
+@end menu
+
+When the shell reads input, it proceeds through a
+sequence of operations.  If the input indicates the beginning of a
+comment, the shell ignores the comment symbol (@samp{#}), and the rest
+of that line.
+                                
+Otherwise, roughly speaking,  the shell reads its input and
+divides the input into words and operators, employing the quoting rules
+to select which meanings to assign various words and characters.
+
+The shell then parses these tokens into commands and other constructs,
+removes the special meaning of certain words or characters, expands
+others, redirects input and output as needed, executes the specified
+command, waits for the command's exit status, and makes that exit status
+available for further inspection or processing.
+
+@node Shell Operation
+@subsection Shell Operation
+
+The following is a brief description of the shell's operation when it
+reads and executes a command.  Basically, the shell does the
+following:
+
+@enumerate
+@item
+Reads its input from a file (@pxref{Shell Scripts}), from a string
+supplied as an argument to the @option{-c} invocation option
+(@pxref{Invoking Bash}), or from the user's terminal.
+
+@item
+Breaks the input into words and operators, obeying the quoting rules
+described in @ref{Quoting}.  These tokens are separated by
+@code{metacharacters}.  Alias expansion is performed by this step
+(@pxref{Aliases}).
+
+@item
+Parses the tokens into simple and compound commands
+(@pxref{Shell Commands}).
+
+@item
+Performs the various shell expansions (@pxref{Shell Expansions}), breaking
+the expanded tokens into lists of filenames (@pxref{Filename Expansion})
+and commands and arguments.
+
+@item
+Performs any necessary redirections (@pxref{Redirections}) and removes
+the redirection operators and their operands from the argument list.
+
+@item
+Executes the command (@pxref{Executing Commands}).
+
+@item
+Optionally waits for the command to complete and collects its exit
+status (@pxref{Exit Status}).
+
+@end enumerate
+
+@node Quoting
+@subsection Quoting
+@cindex quoting
+@menu
+* Escape Character::   How to remove the special meaning from a single
+                       character.
+* Single Quotes::      How to inhibit all interpretation of a sequence
+                       of characters.
+* Double Quotes::      How to suppress most of the interpretation of a
+                       sequence of characters.
+* ANSI-C Quoting::     How to expand ANSI-C sequences in quoted strings.
+
+* Locale Translation:: How to translate strings into different languages.
+@end menu
+
+Quoting is used to remove the special meaning of certain
+characters or words to the shell.  Quoting can be used to
+disable special treatment for special characters, to prevent
+reserved words from being recognized as such, and to prevent
+parameter expansion.
+
+Each of the shell metacharacters (@pxref{Definitions})
+has special meaning to the shell and must be quoted if it is to
+represent itself.
+When the command history expansion facilities are being used, the
+@var{history expansion} character, usually @samp{!}, must be quoted
+to prevent history expansion.  @xref{Bash History Facilities}, for
+more details concerning history expansion.
+
+There are three quoting mechanisms: the
+@var{escape character}, single quotes, and double quotes.
+
+@node Escape Character
+@subsubsection Escape Character
+A non-quoted backslash @samp{\} is the Bash escape character.
+It preserves the literal value of the next character that follows,
+with the exception of @code{newline}.  If a @code{\newline} pair
+appears, and the backslash itself is not quoted, the @code{\newline}
+is treated as a line continuation (that is, it is removed from
+the input stream and effectively ignored).
+
+@node Single Quotes
+@subsubsection Single Quotes
+
+Enclosing characters in single quotes (@samp{'}) preserves the literal value
+of each character within the quotes.  A single quote may not occur
+between single quotes, even when preceded by a backslash.
+
+@node Double Quotes
+@subsubsection Double Quotes
+
+Enclosing characters in double quotes (@samp{"}) preserves the literal value
+of all characters within the quotes, with the exception of
+@samp{$}, @samp{`}, and @samp{\}.
+The characters @samp{$} and @samp{`}
+retain their special meaning within double quotes (@pxref{Shell Expansions}).
+The backslash retains its special meaning only when followed by one of
+the following characters:
+@samp{$}, @samp{`}, @samp{"}, @samp{\}, or @code{newline}.
+Within double quotes, backslashes that are followed by one of these
+characters are removed.  Backslashes preceding characters without a
+special meaning are left unmodified.
+A double quote may be quoted within double quotes by preceding it with
+a backslash.
+When command history is being used, the double quote may not be used to
+quote the history expansion character.
+
+The special parameters @samp{*} and @samp{@@} have special meaning
+when in double quotes (@pxref{Shell Parameter Expansion}).
+
+@node ANSI-C Quoting
+@subsubsection ANSI-C Quoting
+@cindex quoting, ANSI
+
+Words of the form @code{$'@var{string}'} are treated specially.  The
+word expands to @var{string}, with backslash-escaped characters replaced
+as specified by the ANSI C standard.  Backslash escape sequences, if
+present, are decoded as follows:
+
+@table @code
+@item \a
+alert (bell)
+@item \b
+backspace
+@item \e
+an escape character (not ANSI C)
+@item \f
+form feed
+@item \n
+newline
+@item \r
+carriage return
+@item \t
+horizontal tab
+@item \v
+vertical tab
+@item \\
+backslash
+@item \'
+single quote
+@item \@var{nnn}
+the eight-bit character whose value is the octal value @var{nnn}
+(one to three digits)
+@item \x@var{HH}
+the eight-bit character whose value is the hexadecimal value @var{HH}
+(one or two hex digits)
+@item \c@var{x}
+a control-@var{x} character
+@end table
+
+@noindent
+The expanded result is single-quoted, as if the dollar sign had not
+been present.
+
+@node Locale Translation
+@subsubsection Locale-Specific Translation
+@cindex localization
+@cindex internationalization
+@cindex native languages
+@cindex translation, native languages
+
+A double-quoted string preceded by a dollar sign (@samp{$}) will cause
+the string to be translated according to the current locale.
+If the current locale is @code{C} or @code{POSIX}, the dollar sign
+is ignored.
+If the string is translated and replaced, the replacement is
+double-quoted.
+
+@vindex LC_MESSAGES
+@vindex TEXTDOMAIN
+@vindex TEXTDOMAINDIR
+Some systems use the message catalog selected by the @env{LC_MESSAGES}
+shell variable.  Others create the name of the message catalog from the
+value of the @env{TEXTDOMAIN} shell variable, possibly adding a
+suffix of @samp{.mo}.  If you use the @env{TEXTDOMAIN} variable, you
+may need to set the @env{TEXTDOMAINDIR} variable to the location of
+the message catalog files.  Still others use both variables in this
+fashion:
+@env{TEXTDOMAINDIR}/@env{LC_MESSAGES}/LC_MESSAGES/@env{TEXTDOMAIN}.mo.
+
+@node Comments
+@subsection Comments
+@cindex comments, shell
+
+In a non-interactive shell, or an interactive shell in which the
+@code{interactive_comments} option to the @code{shopt}
+builtin is enabled (@pxref{Bash Builtins}),
+a word beginning with @samp{#}
+causes that word and all remaining characters on that line to
+be ignored.  An interactive shell without the @code{interactive_comments}
+option enabled does not allow comments.  The @code{interactive_comments}
+option is on by default in interactive shells.
+@xref{Interactive Shells}, for a description of what makes
+a shell interactive.
+
+@node Shell Commands
+@section Shell Commands
+@cindex commands, shell
+
+A simple shell command such as @code{echo a b c} consists of the command
+itself followed by arguments, separated by spaces.
+
+More complex shell commands are composed of simple commands arranged together
+in a variety of ways: in a pipeline in which the output of one command
+becomes the input of a second, in a loop or conditional construct, or in
+some other grouping.
+
+@menu
+* Simple Commands::            The most common type of command.
+* Pipelines::                  Connecting the input and output of several
+                               commands.
+* Lists::                      How to execute commands sequentially.
+* Looping Constructs::         Shell commands for iterative action.
+* Conditional Constructs::     Shell commands for conditional execution.
+* Command Grouping::           Ways to group commands.
+@end menu
+
+@node Simple Commands
+@subsection Simple Commands
+@cindex commands, simple
+
+A simple command is the kind of command encountered most often.
+It's just a sequence of words separated by @code{blank}s, terminated
+by one of the shell's control operators (@pxref{Definitions}).  The
+first word generally specifies a command to be executed, with the
+rest of the words being that command's arguments.
+
+The return status (@pxref{Exit Status}) of a simple command is
+its exit status as provided
+by the @sc{posix} 1003.1 @code{waitpid} function, or 128+@var{n} if
+the command was terminated by signal @var{n}.
+
+@node Pipelines
+@subsection Pipelines
+@cindex pipeline
+@cindex commands, pipelines
+
+A @code{pipeline} is a sequence of simple commands separated by
+@samp{|}.
+
+@rwindex time
+@rwindex !
+@cindex command timing
+The format for a pipeline is
+@example
+[@code{time} [@code{-p}]] [@code{!}] @var{command1} [@code{|} @var{command2} @dots{}]
+@end example
+
+@noindent
+The output of each command in the pipeline is connected via a pipe
+to the input of the next command.
+That is, each command reads the previous command's output.
+
+The reserved word @code{time} causes timing statistics
+to be printed for the pipeline once it finishes.
+The statistics currently consist of elapsed (wall-clock) time and
+user and system time consumed by the command's execution.
+The @option{-p} option changes the output format to that specified
+by @sc{posix}.
+The @env{TIMEFORMAT} variable may be set to a format string that
+specifies how the timing information should be displayed.
+@xref{Bash Variables}, for a description of the available formats.
+The use of @code{time} as a reserved word permits the timing of
+shell builtins, shell functions, and pipelines.  An external
+@code{time} command cannot time these easily.
+
+If the pipeline is not executed asynchronously (@pxref{Lists}), the
+shell waits for all commands in the pipeline to complete.
+
+Each command in a pipeline is executed in its own subshell
+(@pxref{Command Execution Environment}).  The exit
+status of a pipeline is the exit status of the last command in the
+pipeline.  If the reserved word @samp{!} precedes the pipeline, the
+exit status is the logical negation of the exit status of the last command.
+
+@node Lists
+@subsection Lists of Commands
+@cindex commands, lists
+
+A @code{list} is a sequence of one or more pipelines separated by one
+of the operators @samp{;}, @samp{&}, @samp{&&}, or @samp{||},
+and optionally terminated by one of @samp{;}, @samp{&}, or a
+@code{newline}.
+
+Of these list operators, @samp{&&} and @samp{||}
+have equal precedence, followed by @samp{;} and @samp{&},
+which have equal precedence.
+
+A sequence of one or more newlines may appear in a @code{list}
+to delimit commands, equivalent to a semicolon.
+
+If a command is terminated by the control operator @samp{&},
+the shell executes the command asynchronously in a subshell.
+This is known as executing the command in the @var{background}.
+The shell does not wait for the command to finish, and the return
+status is 0 (true).
+When job control is not active (@pxref{Job Control}),
+the standard input for asynchronous commands, in the absence of any
+explicit redirections, is redirected from @code{/dev/null}.
+
+Commands separated by a @samp{;} are executed sequentially; the shell
+waits for each command to terminate in turn.  The return status is the
+exit status of the last command executed.
+
+The control operators @samp{&&} and @samp{||}
+denote @sc{and} lists and @sc{or} lists, respectively.
+An @sc{and} list has the form
+@example
+@var{command1} && @var{command2}
+@end example
+
+@noindent
+@var{command2} is executed if, and only if, @var{command1}
+returns an exit status of zero.
+
+An @sc{or} list has the form
+@example
+@var{command1} || @var{command2}
+@end example
+
+@noindent
+@var{command2} is executed if, and only if, @var{command1}
+returns a non-zero exit status.
+
+The return status of
+@sc{and} and @sc{or} lists is the exit status of the last command
+executed in the list.
+
+@node Looping Constructs
+@subsection Looping Constructs
+@cindex commands, looping
+
+Bash supports the following looping constructs.
+
+Note that wherever a @samp{;} appears in the description of a
+command's syntax, it may be replaced with one or more newlines.
+
+@table @code
+@item until
+@rwindex until
+@rwindex do
+@rwindex done
+The syntax of the @code{until} command is:
+@example
+until @var{test-commands}; do @var{consequent-commands}; done
+@end example
+Execute @var{consequent-commands} as long as
+@var{test-commands} has an exit status which is not zero.
+The return status is the exit status of the last command executed
+in @var{consequent-commands}, or zero if none was executed.
+
+@item while
+@rwindex while
+The syntax of the @code{while} command is:
+@example
+while @var{test-commands}; do @var{consequent-commands}; done
+@end example
+
+Execute @var{consequent-commands} as long as
+@var{test-commands} has an exit status of zero.
+The return status is the exit status of the last command executed
+in @var{consequent-commands}, or zero if none was executed.
+
+@item for
+@rwindex for
+The syntax of the @code{for} command is:
+
+@example
+for @var{name} [in @var{words} @dots{}]; do @var{commands}; done
+@end example
+Expand @var{words}, and execute @var{commands} once for each member
+in the resultant list, with @var{name} bound to the current member.
+If @samp{in @var{words}} is not present, the @code{for} command
+executes the @var{commands} once for each positional parameter that is
+set, as if @samp{in "$@@"} had been specified
+(@pxref{Special Parameters}).
+The return status is the exit status of the last command that executes.
+If there are no items in the expansion of @var{words}, no commands are
+executed, and the return status is zero.
+
+An alternate form of the @code{for} command is also supported:
+
+@example
+for (( @var{expr1} ; @var{expr2} ; @var{expr3} )) ; do @var{commands} ; done
+@end example
+First, the arithmetic expression @var{expr1} is evaluated according
+to the rules described below (@pxref{Shell Arithmetic}).
+The arithmetic expression @var{expr2} is then evaluated repeatedly
+until it evaluates to zero.   
+Each time @var{expr2} evaluates to a non-zero value, @var{commands} are
+executed and the arithmetic expression @var{expr3} is evaluated.       
+If any expression is omitted, it behaves as if it evaluates to 1.
+The return value is the exit status of the last command in @var{list}
+that is executed, or false if any of the expressions is invalid.
+
+@end table
+
+The @code{break} and @code{continue} builtins (@pxref{Bourne Shell Builtins})
+may be used to control loop execution.
+
+@node Conditional Constructs
+@subsection Conditional Constructs
+@cindex commands, conditional
+
+@table @code
+@item if
+@rwindex if
+@rwindex then
+@rwindex else
+@rwindex elif
+@rwindex fi
+The syntax of the @code{if} command is:
+
+@example
+if @var{test-commands}; then
+  @var{consequent-commands};
+[elif @var{more-test-commands}; then
+  @var{more-consequents};]
+[else @var{alternate-consequents};]
+fi
+@end example
+
+The @var{test-commands} list is executed, and if its return status is zero,
+the @var{consequent-commands} list is executed.
+If @var{test-commands} returns a non-zero status, each @code{elif} list
+is executed in turn, and if its exit status is zero,
+the corresponding @var{more-consequents} is executed and the   
+command completes.
+If @samp{else @var{alternate-consequents}} is present, and
+the final command in the final @code{if} or @code{elif} clause
+has a non-zero exit status, then @var{alternate-consequents} is executed.
+The return status is the exit status of the last command executed, or
+zero if no condition tested true.
+
+@item case
+@rwindex case
+@rwindex in
+@rwindex esac
+The syntax of the @code{case} command is:
+
+@example
+@code{case @var{word} in [ [(] @var{pattern} [| @var{pattern}]@dots{}) @var{command-list} ;;]@dots{} esac}
+@end example
+
+@code{case} will selectively execute the @var{command-list} corresponding to
+the first @var{pattern} that matches @var{word}.
+The @samp{|} is used to separate multiple patterns, and the @samp{)}
+operator terminates a pattern list.
+A list of patterns and an associated command-list is known
+as a @var{clause}.  Each clause must be terminated with @samp{;;}.
+The @var{word} undergoes tilde expansion, parameter expansion, command
+substitution, arithmetic expansion, and quote removal before matching is
+attempted.  Each @var{pattern} undergoes tilde expansion, parameter
+expansion, command substitution, and arithmetic expansion.
+
+There may be an arbitrary number of @code{case} clauses, each terminated
+by a @samp{;;}.  The first pattern that matches determines the
+command-list that is executed.
+
+Here is an example using @code{case} in a script that could be used to
+describe one interesting feature of an animal:
+
+@example
+echo -n "Enter the name of an animal: "
+read ANIMAL
+echo -n "The $ANIMAL has "
+case $ANIMAL in
+  horse | dog | cat) echo -n "four";;
+  man | kangaroo ) echo -n "two";;
+  *) echo -n "an unknown number of";;
+esac
+echo " legs."
+@end example
+
+@noindent
+The return status is zero if no @var{pattern} is matched.  Otherwise, the
+return status is the exit status of the @var{command-list} executed.
+
+@item select
+@rwindex select
+
+The @code{select} construct allows the easy generation of menus.
+It has almost the same syntax as the @code{for} command:
+
+@example
+select @var{name} [in @var{words} @dots{}]; do @var{commands}; done
+@end example
+
+The list of words following @code{in} is expanded, generating a list
+of items.  The set of expanded words is printed on the standard
+error output stream, each preceded by a number.  If the
+@samp{in @var{words}} is omitted, the positional parameters are printed,
+as if @samp{in "$@@"} had been specifed.
+The @env{PS3} prompt is then displayed and a line is read from the
+standard input.
+If the line consists of a number corresponding to one of the displayed
+words, then the value of @var{name} is set to that word.
+If the line is empty, the words and prompt are displayed again.
+If @code{EOF} is read, the @code{select} command completes.
+Any other value read causes @var{name} to be set to null.
+The line read is saved in the variable @env{REPLY}.
+
+The @var{commands} are executed after each selection until a
+@code{break} command is executed, at which
+point the @code{select} command completes.
+
+Here is an example that allows the user to pick a filename from the
+current directory, and displays the name and index of the file
+selected.
+
+@example
+select fname in *;
+do
+       echo you picked $fname \($REPLY\)
+       break;
+done
+@end example
+
+@item ((@dots{}))
+@example
+(( @var{expression} ))
+@end example
+
+The arithmetic @var{expression} is evaluated according to the rules
+described below (@pxref{Shell Arithmetic}).
+If the value of the expression is non-zero, the return status is 0;
+otherwise the return status is 1.  This is exactly equivalent to
+@example
+let "@var{expression}"
+@end example
+@noindent
+@xref{Bash Builtins}, for a full description of the @code{let} builtin.
+
+@item [[@dots{}]]
+@rwindex [[
+@rwindex ]]
+@example
+[[ @var{expression} ]]
+@end example
+
+Return a status of 0 or 1 depending on the evaluation of
+the conditional expression @var{expression}.
+Expressions are composed of the primaries described below in
+@ref{Bash Conditional Expressions}.
+Word splitting and filename expansion are not performed on the words
+between the @samp{[[} and @samp{]]}; tilde expansion, parameter and
+variable expansion, arithmetic expansion, command substitution, process
+substitution, and quote removal are performed.
+Conditional operators such as @samp{-f} must be unquoted to be recognized
+as primaries.
+
+When the @samp{==} and @samp{!=} operators are used, the string to the
+right of the operator is considered a pattern and matched according
+to the rules described below in @ref{Pattern Matching}.
+The return value is 0 if the string matches or does not match
+the pattern, respectively, and 1 otherwise.
+Any part of the pattern may be quoted to force it to be matched as a
+string.
+
+Expressions may be combined using the following operators, listed
+in decreasing order of precedence:
+
+@table @code
+@item ( @var{expression} )
+Returns the value of @var{expression}.
+This may be used to override the normal precedence of operators.
+
+@item ! @var{expression}
+True if @var{expression} is false.
+
+@item @var{expression1} && @var{expression2}
+True if both @var{expression1} and @var{expression2} are true.
+
+@item @var{expression1} || @var{expression2}
+True if either @var{expression1} or @var{expression2} is true.
+@end table
+@noindent
+The @code{&&} and @code{||} operators do not evaluate @var{expression2} if the
+value of @var{expression1} is sufficient to determine the return
+value of the entire conditional expression.
+
+@end table
+
+@node Command Grouping
+@subsection Grouping Commands
+@cindex commands, grouping
+
+Bash provides two ways to group a list of commands to be executed
+as a unit.  When commands are grouped, redirections may be applied
+to the entire command list.  For example, the output of all the
+commands in the list may be redirected to a single stream.
+
+@table @code
+@item ()
+@example
+( @var{list} )
+@end example
+
+Placing a list of commands between parentheses causes a subshell
+to be created, and each of the commands in @var{list} to be executed
+in that subshell.  Since the @var{list} is executed in a subshell,
+variable assignments do not remain in effect after the subshell completes.
+
+@item @{@}
+@rwindex @{
+@rwindex @}
+@example
+@{ @var{list}; @}
+@end example
+
+Placing a list of commands between curly braces causes the list to
+be executed in the current shell context.  No subshell is created.
+The semicolon (or newline) following @var{list} is required.
+@end table
+
+In addition to the creation of a subshell, there is a subtle difference
+between these two constructs due to historical reasons.  The braces
+are @code{reserved words}, so they must be separated from the @var{list}
+by @code{blank}s.  The parentheses are @code{operators}, and are
+recognized as separate tokens by the shell even if they are not separated
+from the @var{list} by whitespace.
+
+The exit status of both of these constructs is the exit status of
+@var{list}.
+
+@node Shell Functions
+@section Shell Functions
+@cindex shell function
+@cindex functions, shell
+
+Shell functions are a way to group commands for later execution
+using a single name for the group.  They are executed just like
+a "regular" command.
+When the name of a shell function is used as a simple command name,
+the list of commands associated with that function name is executed.
+Shell functions are executed in the current
+shell context; no new process is created to interpret them.
+
+Functions are declared using this syntax:
+@rwindex function
+@example
+[ @code{function} ] @var{name} () @{ @var{command-list}; @}
+@end example
+
+This defines a shell function named @var{name}.  The reserved
+word @code{function} is optional.
+If the @code{function} reserved
+word is supplied, the parentheses are optional.
+The @var{body} of the function is the @var{command-list} between @{ and @}.
+This list is executed whenever @var{name} is specified as the
+name of a command.  The exit status of a function is
+the exit status of the last command executed in the body.
+
+Note that for historical reasons, the curly braces that surround
+the body of the function must be separated from the body by
+@code{blank}s or newlines.
+This is because the braces are reserved words and are only recognized
+as such when they are separated by whitespace.
+Also, the @var{command-list} must be terminated by a semicolon,
+a @samp{&}, or a newline.
+
+When a function is executed, the arguments to the
+function become the positional parameters
+during its execution (@pxref{Positional Parameters}).
+The special parameter @samp{#} that expands to the number of
+positional parameters is updated to reflect the change.
+Positional parameter @code{0} is unchanged.
+The first element of the @env{FUNCNAME} variable is set to the
+name of the function while the function is executing.
+All other aspects of the shell execution
+environment are identical between a function and its caller
+with the exception that the @env{DEBUG} trap
+below) is not inherited unless the function has been given the
+@code{trace} attribute using the @code{declare} builtin or
+the @code{-o functrace} option has been enabled with
+the @code{set} builtin,
+(in which case all functions inherit the @code{DEBUG} trap).
+@xref{Bourne Shell Builtins}, for the description of the
+@code{trap} builtin.
+
+If the builtin command @code{return}
+is executed in a function, the function completes and
+execution resumes with the next command after the function
+call.
+Any command associated with the @code{RETURN} trap is executed
+before execution resumes.
+When a function completes, the values of the
+positional parameters and the special parameter @samp{#}
+are restored to the values they had prior to the function's
+execution.  If a numeric argument is given to @code{return},
+that is the function's return status; otherwise the function's
+return status is the exit status of the last command executed
+before the @code{return}.
+
+Variables local to the function may be declared with the
+@code{local} builtin.  These variables are visible only to
+the function and the commands it invokes.
+
+Function names and definitions may be listed with the
+@option{-f} option to the @code{declare} or @code{typeset}
+builtin commands (@pxref{Bash Builtins}).
+The @option{-F} option to @code{declare} or @code{typeset}
+will list the function names only
+(and optionally the source file and line number, if the @code{extdebug}
+shell option is enabled).
+Functions may be exported so that subshells
+automatically have them defined with the
+@option{-f} option to the @code{export} builtin
+(@pxref{Bourne Shell Builtins}).
+Note that shell functions and variables with the same name may result
+in multiple identically-named entries in the environment passed to the
+shell's children.
+Care should be taken in cases where this may cause a problem.
+
+Functions may be recursive.  No limit is placed on the number of
+recursive  calls.
+
+@node Shell Parameters
+@section Shell Parameters
+@cindex parameters
+@cindex variable, shell
+@cindex shell variable
+
+@menu
+* Positional Parameters::      The shell's command-line arguments.
+* Special Parameters::         Parameters denoted by special characters.
+@end menu
+
+A @var{parameter} is an entity that stores values.
+It can be a @code{name}, a number, or one of the special characters
+listed below.
+A @var{variable} is a parameter denoted by a @code{name}.
+A variable has a @var{value} and zero or more @var{attributes}.
+Attributes are assigned using the @code{declare} builtin command
+(see the description of the @code{declare} builtin in @ref{Bash Builtins}).
+
+A parameter is set if it has been assigned a value.  The null string is
+a valid value.  Once a variable is set, it may be unset only by using
+the @code{unset} builtin command.
+
+A variable may be assigned to by a statement of the form
+@example
+@var{name}=[@var{value}]
+@end example
+@noindent
+If @var{value}
+is not given, the variable is assigned the null string.  All
+@var{value}s undergo tilde expansion, parameter and variable expansion,
+command substitution, arithmetic expansion, and quote
+removal (detailed below).  If the variable has its @code{integer}
+attribute set, then @var{value} 
+is evaluated as an arithmetic expression even if the @code{$((@dots{}))}
+expansion is not used (@pxref{Arithmetic Expansion}).
+Word splitting is not performed, with the exception
+of @code{"$@@"} as explained below.
+Filename expansion is not performed.
+Assignment statements may also appear as arguments to the
+@code{declare}, @code{typeset}, @code{export}, @code{readonly},
+and @code{local} builtin commands.
+
+@node Positional Parameters
+@subsection Positional Parameters
+@cindex parameters, positional
+
+A @var{positional parameter} is a parameter denoted by one or more
+digits, other than the single digit @code{0}.  Positional parameters are
+assigned from the shell's arguments when it is invoked,
+and may be reassigned using the @code{set} builtin command.
+Positional parameter @code{N} may be referenced as @code{$@{N@}}, or
+as @code{$N} when @code{N} consists of a single digit.
+Positional parameters may not be assigned to with assignment statements.
+The @code{set} and @code{shift} builtins are used to set and
+unset them (@pxref{Shell Builtin Commands}).
+The positional parameters are
+temporarily replaced when a shell function is executed
+(@pxref{Shell Functions}).
+
+When a positional parameter consisting of more than a single
+digit is expanded, it must be enclosed in braces.
+
+@node Special Parameters
+@subsection Special Parameters
+@cindex parameters, special
+
+The shell treats several parameters specially.  These parameters may
+only be referenced; assignment to them is not allowed.
+
+@vtable @code
+
+@item *
+Expands to the positional parameters, starting from one.  When the
+expansion occurs within double quotes, it expands to a single word
+with the value of each parameter separated by the first character
+of the @env{IFS}
+special variable.  That is, @code{"$*"} is equivalent
+to @code{"$1@var{c}$2@var{c}@dots{}"}, where @var{c}
+is the first character of the value of the @code{IFS}
+variable.
+If @env{IFS} is unset, the parameters are separated by spaces.
+If @env{IFS} is null, the parameters are joined without intervening
+separators.
+
+
+@item @@
+Expands to the positional parameters, starting from one.  When the
+expansion occurs within double quotes, each parameter expands to a
+separate word.  That is, @code{"$@@"} is equivalent to
+@code{"$1" "$2" @dots{}}.
+When there are no positional parameters, @code{"$@@"} and
+@code{$@@}
+expand to nothing (i.e., they are removed).
+
+@item #
+Expands to the number of positional parameters in decimal.
+
+@item ?
+Expands to the exit status of the most recently executed foreground
+pipeline.
+
+@item -
+(A hyphen.)  Expands to the current option flags as specified upon
+invocation, by the @code{set}
+builtin command, or those set by the shell itself
+(such as the @option{-i} option).
+
+@item $
+Expands to the process @sc{id} of the shell.  In a @code{()} subshell, it
+expands to the process @sc{id} of the invoking shell, not the subshell.
+
+@item !
+Expands to the process @sc{id} of the most recently executed background
+(asynchronous) command.
+
+@item 0
+Expands to the name of the shell or shell script.  This is set at
+shell initialization.  If Bash is invoked with a file of commands
+(@pxref{Shell Scripts}), @code{$0} is set to the name of that file.
+If Bash is started with the @option{-c} option (@pxref{Invoking Bash}),
+then @code{$0} is set to the first argument after the string to be
+executed, if one is present.  Otherwise, it is set
+to the filename used to invoke Bash, as given by argument zero.
+
+@item _
+(An underscore.)
+At shell startup, set to the absolute filename of the shell or shell
+script being executed as passed in the argument list.
+Subsequently, expands to the last argument to the previous command,
+after expansion.   
+Also set to the full pathname of each command executed and placed in
+the environment exported to that command.
+When checking mail, this parameter holds the name of the mail file.
+@end vtable
+
+@node Shell Expansions
+@section Shell Expansions
+@cindex expansion
+
+Expansion is performed on the command line after it has been split into
+@code{token}s.  There are seven kinds of expansion performed:
+@itemize @bullet
+@item brace expansion
+@item tilde expansion
+@item parameter and variable expansion
+@item command substitution
+@item arithmetic expansion
+@item word splitting
+@item filename expansion
+@end itemize
+
+@menu
+* Brace Expansion::            Expansion of expressions within braces.
+* Tilde Expansion::            Expansion of the ~ character.
+* Shell Parameter Expansion::  How Bash expands variables to their values.
+* Command Substitution::       Using the output of a command as an argument.
+* Arithmetic Expansion::       How to use arithmetic in shell expansions.
+* Process Substitution::       A way to write and read to and from a
+                               command.
+* Word Splitting::     How the results of expansion are split into separate
+                       arguments.
+* Filename Expansion:: A shorthand for specifying filenames matching patterns.
+* Quote Removal::      How and when quote characters are removed from
+                       words.
+@end menu
+
+The order of expansions is: brace expansion, tilde expansion,
+parameter, variable, and arithmetic expansion and
+command substitution
+(done in a left-to-right fashion), word splitting, and filename
+expansion.
+
+On systems that can support it, there is an additional expansion
+available: @var{process substitution}.  This is performed at the
+same time as parameter, variable, and arithmetic expansion and
+command substitution.
+
+Only brace expansion, word splitting, and filename expansion
+can change the number of words of the expansion; other expansions
+expand a single word to a single word.
+The only exceptions to this are the expansions of
+@code{"$@@"} (@pxref{Special Parameters}) and @code{"$@{@var{name}[@@]@}"}
+(@pxref{Arrays}).
+
+After all expansions, @code{quote removal} (@pxref{Quote Removal})
+is performed.
+
+@node Brace Expansion
+@subsection Brace Expansion
+@cindex brace expansion
+@cindex expansion, brace
+
+Brace expansion is a mechanism by which arbitrary strings may be generated.
+This mechanism is similar to
+@var{filename expansion} (@pxref{Filename Expansion}),
+but the file names generated need not exist.
+Patterns to be brace expanded take the form of an optional @var{preamble},
+followed by either a series of comma-separated strings or a sequnce expression
+between a pair of braces,
+followed by an optional @var{postscript}.
+The preamble is prefixed to each string contained within the braces, and
+the postscript is then appended to each resulting string, expanding left
+to right.
+
+Brace expansions may be nested.
+The results of each expanded string are not sorted; left to right order
+is preserved.
+For example,
+@example
+bash$ echo a@{d,c,b@}e
+ade ace abe
+@end example
+
+A sequence expression takes the form @code{@{@var{x}..@var{y}@}},
+where @var{x} and @var{y} are either integers or single characters.
+When integers are supplied, the expression expands to each number between
+@var{x} and @var{y}, inclusive.
+When characters are supplied, the expression expands to each character
+lexicographically between @var{x} and @var{y}, inclusive.  Note that
+both @var{x} and @var{y} must be of the same type.
+
+Brace expansion is performed before any other expansions,
+and any characters special to other expansions are preserved
+in the result.  It is strictly textual.  Bash
+does not apply any syntactic interpretation to the context of the
+expansion or the text between the braces.
+To avoid conflicts with parameter expansion, the string @samp{$@{}
+is not considered eligible for brace expansion.
+
+A correctly-formed brace expansion must contain unquoted opening
+and closing braces, and at least one unquoted comma or a valid
+sequence expression.
+Any incorrectly formed brace expansion is left unchanged.
+
+A @{ or @samp{,} may be quoted with a backslash to prevent its
+being considered part of a brace expression.
+To avoid conflicts with parameter expansion, the string @samp{$@{}
+is not considered eligible for brace expansion.
+
+This construct is typically used as shorthand when the common
+prefix of the strings to be generated is longer than in the
+above example:
+@example
+mkdir /usr/local/src/bash/@{old,new,dist,bugs@}
+@end example
+or
+@example
+chown root /usr/@{ucb/@{ex,edit@},lib/@{ex?.?*,how_ex@}@}
+@end example
+
+@node Tilde Expansion
+@subsection Tilde Expansion
+@cindex tilde expansion
+@cindex expansion, tilde
+
+If a word begins with an unquoted tilde character (@samp{~}), all of the
+characters up to the first unquoted slash (or all characters,
+if there is no unquoted slash) are considered a @var{tilde-prefix}.
+If none of the characters in the tilde-prefix are quoted, the
+characters in the tilde-prefix following the tilde are treated as a
+possible @var{login name}.
+If this login name is the null string, the tilde is replaced with the
+value of the @env{HOME} shell variable.
+If @env{HOME} is unset, the home directory of the user executing the
+shell is substituted instead.
+Otherwise, the tilde-prefix is replaced with the home directory
+associated with the specified login name.
+
+If the tilde-prefix is @samp{~+}, the value of
+the shell variable @env{PWD} replaces the tilde-prefix.
+If the tilde-prefix is @samp{~-}, the value of the shell variable
+@env{OLDPWD}, if it is set, is substituted.
+
+If the characters following the tilde in the tilde-prefix consist of a
+number @var{N}, optionally prefixed by a @samp{+} or a @samp{-},
+the tilde-prefix is replaced with the
+corresponding element from the directory stack, as it would be displayed
+by the @code{dirs} builtin invoked with the characters following tilde
+in the tilde-prefix as an argument (@pxref{The Directory Stack}).
+If the tilde-prefix, sans the tilde, consists of a number without a
+leading @samp{+} or @samp{-}, @samp{+} is assumed.
+
+If the login name is invalid, or the tilde expansion fails, the word is
+left unchanged.
+
+Each variable assignment is checked for unquoted tilde-prefixes immediately
+following a @samp{:} or @samp{=}.
+In these cases, tilde expansion is also performed.
+Consequently, one may use file names with tildes in assignments to
+@env{PATH}, @env{MAILPATH}, and @env{CDPATH},
+and the shell assigns the expanded value.
+
+The following table shows how Bash treats unquoted tilde-prefixes:
+
+@table @code
+@item ~
+The value of @code{$HOME}
+@item ~/foo
+@file{$HOME/foo}
+
+@item ~fred/foo
+The subdirectory @code{foo} of the home directory of the user
+@code{fred}
+
+@item ~+/foo
+@file{$PWD/foo}
+
+@item ~-/foo
+@file{$@{OLDPWD-'~-'@}/foo}
+
+@item ~@var{N}
+The string that would be displayed by @samp{dirs +@var{N}}
+
+@item ~+@var{N}
+The string that would be displayed by @samp{dirs +@var{N}}
+
+@item ~-@var{N}
+The string that would be displayed by @samp{dirs -@var{N}}
+
+@end table
+
+@node Shell Parameter Expansion
+@subsection Shell Parameter Expansion
+@cindex parameter expansion
+@cindex expansion, parameter
+
+The @samp{$} character introduces parameter expansion,
+command substitution, or arithmetic expansion.  The parameter name
+or symbol to be expanded may be enclosed in braces, which
+are optional but serve to protect the variable to be expanded from
+characters immediately following it which could be
+interpreted as part of the name.
+
+When braces are used, the matching ending brace is the first @samp{@}}
+not escaped by a backslash or within a quoted string, and not within an
+embedded arithmetic expansion, command substitution, or parameter
+expansion.
+
+The basic form of parameter expansion is $@{@var{parameter}@}.
+The value of @var{parameter} is substituted.  The braces are required
+when @var{parameter}
+is a positional parameter with more than one digit,
+or when @var{parameter}
+is followed by a character that is not to be
+interpreted as part of its name.
+
+If the first character of @var{parameter} is an exclamation point,
+a level of variable indirection is introduced.
+Bash uses the value of the variable formed from the rest of
+@var{parameter} as the name of the variable; this variable is then
+expanded and that value is used in the rest of the substitution, rather
+than the value of @var{parameter} itself.
+This is known as @code{indirect expansion}.
+The exceptions to this are the expansions of $@{!@var{prefix*}@}
+and $@{!@var{name}[@@]@}
+described below.
+The exclamation point must immediately follow the left brace in order to
+introduce indirection.
+
+In each of the cases below, @var{word} is subject to tilde expansion,
+parameter expansion, command substitution, and arithmetic expansion.
+
+When not performing substring expansion, Bash tests for a parameter
+that is unset or null; omitting the colon results in a test only for a
+parameter that is unset.  Put another way, if the colon is included,
+the operator tests for both existence and that the value is not null;
+if the colon is omitted, the operator tests only for existence.
+
+@table @code
+
+@item $@{@var{parameter}:@minus{}@var{word}@}
+If @var{parameter} is unset or null, the expansion of
+@var{word} is substituted.  Otherwise, the value of
+@var{parameter} is substituted.
+
+@item $@{@var{parameter}:=@var{word}@}
+If @var{parameter}
+is unset or null, the expansion of @var{word}
+is assigned to @var{parameter}.
+The value of @var{parameter}
+is then substituted.  Positional parameters and special parameters may
+not be assigned to in this way.
+
+@item $@{@var{parameter}:?@var{word}@}
+If @var{parameter}
+is null or unset, the expansion of @var{word} (or a message
+to that effect if @var{word}
+is not present) is written to the standard error and the shell, if it
+is not interactive, exits.  Otherwise, the value of @var{parameter} is
+substituted.
+
+@item $@{@var{parameter}:+@var{word}@}
+If @var{parameter}
+is null or unset, nothing is substituted, otherwise the expansion of
+@var{word} is substituted.
+
+@item $@{@var{parameter}:@var{offset}@}
+@itemx $@{@var{parameter}:@var{offset}:@var{length}@}
+Expands to up to @var{length} characters of @var{parameter}
+starting at the character specified by @var{offset}.
+If @var{length} is omitted, expands to the substring of
+@var{parameter} starting at the character specified by @var{offset}.
+@var{length} and @var{offset} are arithmetic expressions
+(@pxref{Shell Arithmetic}).
+This is referred to as Substring Expansion.
+
+@var{length} must evaluate to a number greater than or equal to zero.
+If @var{offset} evaluates to a number less than zero, the value
+is used as an offset from the end of the value of @var{parameter}.
+If @var{parameter} is @samp{@@}, the result is @var{length} positional
+parameters beginning at @var{offset}.
+If @var{parameter} is an array name indexed by @samp{@@} or @samp{*},
+the result is the @var{length}
+members of the array beginning with @code{$@{@var{parameter}[@var{offset}]@}}.
+Substring indexing is zero-based unless the positional parameters
+are used, in which case the indexing starts at 1.
+
+@item $@{!@var{prefix}*@}
+@itemx $@{!@var{prefix}@@@}
+Expands to the names of variables whose names begin with @var{prefix},
+separated by the first character of the @env{IFS} special variable.
+
+@item $@{!@var{name}[@@]@}
+@itemx $@{!@var{name}[*]@}
+If @var{name} is an array variable, expands to the list of array indices
+(keys) assigned in @var{name}.
+If @var{name} is not an array, expands to 0 if @var{name} is set and null
+otherwise.
+When @samp{@@} is used and the expansion appears within double quotes, each
+key expands to a separate word.
+
+@item $@{#@var{parameter}@}
+The length in characters of the expanded value of @var{parameter} is
+substituted.
+If @var{parameter} is @samp{*} or @samp{@@}, the value substituted
+is the number of positional parameters.
+If @var{parameter} is an array name subscripted by @samp{*} or @samp{@@}, 
+the value substituted is the number of elements in the array.
+
+@item $@{@var{parameter}#@var{word}@}
+@itemx $@{@var{parameter}##@var{word}@}
+The @var{word}
+is expanded to produce a pattern just as in filename
+expansion (@pxref{Filename Expansion}).  If the pattern matches
+the beginning of the expanded value of @var{parameter},
+then the result of the expansion is the expanded value of @var{parameter}
+with the shortest matching pattern (the @samp{#} case) or the
+longest matching pattern (the @samp{##} case) deleted.
+If @var{parameter} is @samp{@@} or @samp{*},
+the pattern removal operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If @var{parameter} is an array variable subscripted with
+@samp{@@} or @samp{*},
+the pattern removal operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+
+@item $@{@var{parameter}%@var{word}@}
+@itemx $@{@var{parameter}%%@var{word}@}
+The @var{word} is expanded to produce a pattern just as in
+filename expansion.
+If the pattern matches a trailing portion of the expanded value of
+@var{parameter}, then the result of the expansion is the value of
+@var{parameter} with the shortest matching pattern (the @samp{%} case)
+or the longest matching pattern (the @samp{%%} case) deleted.
+If @var{parameter} is @samp{@@} or @samp{*},
+the pattern removal operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If @var{parameter}
+is an array variable subscripted with @samp{@@} or @samp{*},
+the pattern removal operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+
+@item $@{@var{parameter}/@var{pattern}/@var{string}@} 
+@itemx $@{@var{parameter}//@var{pattern}/@var{string}@}
+
+The @var{pattern} is expanded to produce a pattern just as in
+filename expansion.
+@var{Parameter} is expanded and the longest match of @var{pattern}
+against its value is replaced with @var{string}.
+In the first form, only the first match is replaced.
+The second form causes all matches of @var{pattern} to be
+replaced with @var{string}.
+If @var{pattern} begins with @samp{#}, it must match at the beginning
+of the expanded value of @var{parameter}.
+If @var{pattern} begins with @samp{%}, it must match at the end
+of the expanded value of @var{parameter}.
+If @var{string} is null, matches of @var{pattern} are deleted
+and the @code{/} following @var{pattern} may be omitted.
+If @var{parameter} is @samp{@@} or @samp{*},
+the substitution operation is applied to each positional
+parameter in turn, and the expansion is the resultant list.
+If @var{parameter}
+is an array variable subscripted with @samp{@@} or @samp{*},
+the substitution operation is applied to each member of the
+array in turn, and the expansion is the resultant list.
+
+@end table
+
+@node Command Substitution
+@subsection Command Substitution
+@cindex command substitution
+
+Command substitution allows the output of a command to replace
+the command itself.
+Command substitution occurs when a command is enclosed as follows:
+@example
+$(@var{command})
+@end example
+@noindent
+or
+@example
+`@var{command}`
+@end example
+
+@noindent
+Bash performs the expansion by executing @var{command} and
+replacing the command substitution with the standard output of the
+command, with any trailing newlines deleted.
+Embedded newlines are not deleted, but they may be removed during
+word splitting.
+The command substitution @code{$(cat @var{file})} can be
+replaced by the equivalent but faster @code{$(< @var{file})}.
+
+When the old-style backquote form of substitution is used,
+backslash retains its literal meaning except when followed by
+@samp{$}, @samp{`}, or @samp{\}. 
+The first backquote not preceded by a backslash terminates the
+command substitution.
+When using the @code{$(@var{command})} form, all characters between
+the parentheses make up the command; none are treated specially.
+
+Command substitutions may be nested.  To nest when using the backquoted
+form, escape the inner backquotes with backslashes.
+
+If the substitution appears within double quotes, word splitting and
+filename expansion are not performed on the results.
+
+@node Arithmetic Expansion
+@subsection Arithmetic Expansion
+@cindex expansion, arithmetic
+@cindex arithmetic expansion
+
+Arithmetic expansion allows the evaluation of an arithmetic expression
+and the substitution of the result.  The format for arithmetic expansion is:
+
+@example
+$(( @var{expression} ))
+@end example
+
+The expression is treated as if it were within double quotes, but
+a double quote inside the parentheses is not treated specially.
+All tokens in the expression undergo parameter expansion, command
+substitution, and quote removal.
+Arithmetic expansions may be nested. 
+
+The evaluation is performed according to the rules listed below
+(@pxref{Shell Arithmetic}).
+If the expression is invalid, Bash prints a message indicating
+failure to the standard error and no substitution occurs.
+
+@node Process Substitution
+@subsection Process Substitution
+@cindex process substitution
+
+Process substitution is supported on systems that support named
+pipes (@sc{fifo}s) or the @file{/dev/fd} method of naming open files.
+It takes the form of 
+@example
+<(@var{list})
+@end example
+@noindent
+or
+@example
+>(@var{list})
+@end example
+@noindent
+The process @var{list} is run with its input or output connected to a
+@sc{fifo} or some file in @file{/dev/fd}.  The name of this file is
+passed as an argument to the current command as the result of the
+expansion.  If the @code{>(@var{list})} form is used, writing to
+the file will provide input for @var{list}.  If the
+@code{<(@var{list})} form is used, the file passed as an
+argument should be read to obtain the output of @var{list}.
+Note that no space may appear between the @code{<} or @code{>}
+and the left parenthesis, otherwise the construct would be interpreted
+as a redirection.
+
+When available, process substitution is performed simultaneously with
+parameter and variable expansion, command substitution, and arithmetic
+expansion.
+
+@node Word Splitting
+@subsection Word Splitting
+@cindex word splitting
+
+The shell scans the results of parameter expansion, command substitution,
+and arithmetic expansion that did not occur within double quotes for
+word splitting.
+
+The shell treats each character of @env{$IFS}
+as a delimiter, and splits the results of the other
+expansions into words on these characters.  If
+@env{IFS} is unset, or its value is exactly @code{<space><tab><newline>},
+the default, then any sequence of @env{IFS}
+characters serves to delimit words.  If @env{IFS}
+has a value other than the default, then sequences of
+the whitespace characters @code{space} and @code{tab}
+are ignored at the beginning and end of the
+word, as long as the whitespace character is in the
+value of @env{IFS} (an @env{IFS} whitespace character).
+Any character in @env{IFS} that is not @env{IFS}
+whitespace, along with any adjacent @env{IFS}
+whitespace characters, delimits a field.  A sequence of @env{IFS}
+whitespace characters is also treated as a delimiter.
+If the value of @env{IFS} is null, no word splitting occurs.
+
+Explicit null arguments (@code{""} or @code{''}) are retained.
+Unquoted implicit null arguments, resulting from the expansion of
+parameters that have no values, are removed.
+If a parameter with no value is expanded within double quotes, a
+null argument results and is retained.
+
+Note that if no expansion occurs, no splitting
+is performed.
+
+@node Filename Expansion
+@subsection Filename Expansion
+@menu
+* Pattern Matching::   How the shell matches patterns.
+@end menu
+@cindex expansion, filename
+@cindex expansion, pathname
+@cindex filename expansion
+@cindex pathname expansion
+
+After word splitting, unless the @option{-f} option has been set
+(@pxref{The Set Builtin}), Bash scans each word for the characters
+@samp{*}, @samp{?}, and @samp{[}.
+If one of these characters appears, then the word is
+regarded as a @var{pattern},
+and replaced with an alphabetically sorted list of
+file names matching the pattern. If no matching file names are found,
+and the shell option @code{nullglob} is disabled, the word is left
+unchanged.
+If the @code{nullglob} option is set, and no matches are found, the word
+is removed.
+If the shell option @code{nocaseglob} is enabled, the match is performed
+without regard to the case of alphabetic characters.
+
+When a pattern is used for filename generation, the character @samp{.}
+at the start of a filename or immediately following a slash
+must be matched explicitly, unless the shell option @code{dotglob} is set.
+When matching a file name, the slash character must always be
+matched explicitly.
+In other cases, the @samp{.} character is not treated specially.
+
+See the description of @code{shopt} in @ref{Bash Builtins},
+for a description of the @code{nocaseglob}, @code{nullglob},
+and @code{dotglob} options.
+
+The @env{GLOBIGNORE}
+shell variable may be used to restrict the set of filenames matching a
+pattern.  If @env{GLOBIGNORE}
+is set, each matching filename that also matches one of the patterns in
+@env{GLOBIGNORE} is removed from the list of matches.  The filenames
+@file{.} and @file{..}
+are always ignored when @env{GLOBIGNORE}
+is set and not null.
+However, setting @env{GLOBIGNORE} to a non-null value has the effect of
+enabling the @code{dotglob}
+shell option, so all other filenames beginning with a
+@samp{.} will match.
+To get the old behavior of ignoring filenames beginning with a
+@samp{.}, make @samp{.*} one of the patterns in @env{GLOBIGNORE}.
+The @code{dotglob} option is disabled when @env{GLOBIGNORE}
+is unset.
+
+@node Pattern Matching
+@subsubsection Pattern Matching
+@cindex pattern matching
+@cindex matching, pattern
+
+Any character that appears in a pattern, other than the special pattern
+characters described below, matches itself.
+The @sc{nul} character may not occur in a pattern.
+A backslash escapes the following character; the
+escaping backslash is discarded when matching.
+The special pattern characters must be quoted if they are to be matched
+literally.
+
+The special pattern characters have the following meanings:
+@table @code
+@item *
+Matches any string, including the null string.
+@item ?
+Matches any single character.
+@item [@dots{}]
+Matches any one of the enclosed characters.  A pair of characters
+separated by a hyphen denotes a @var{range expression};
+any character that sorts between those two characters, inclusive,
+using the current locale's collating sequence and character set,
+is matched.  If the first character following the
+@samp{[} is a @samp{!}  or a @samp{^}
+then any character not enclosed is matched.  A @samp{@minus{}}
+may be matched by including it as the first or last character
+in the set.  A @samp{]} may be matched by including it as the first
+character in the set.
+The sorting order of characters in range expressions is determined by
+the current locale and the value of the @env{LC_COLLATE} shell variable,
+if set.
+
+For example, in the default C locale, @samp{[a-dx-z]} is equivalent to
+@samp{[abcdxyz]}.  Many locales sort characters in dictionary order, and in
+these locales @samp{[a-dx-z]} is typically not equivalent to @samp{[abcdxyz]};
+it might be equivalent to @samp{[aBbCcDdxXyYz]}, for example.  To obtain
+the traditional interpretation of ranges in bracket expressions, you can
+force the use of the C locale by setting the @env{LC_COLLATE} or
+@env{LC_ALL} environment variable to the value @samp{C}.
+
+Within @samp{[} and @samp{]}, @var{character classes} can be specified
+using the syntax
+@code{[:}@var{class}@code{:]}, where @var{class} is one of the
+following classes defined in the @sc{posix} 1003.2 standard:
+@example
+alnum   alpha   ascii   blank   cntrl   digit   graph   lower
+print   punct   space   upper   word    xdigit
+@end example
+@noindent
+A character class matches any character belonging to that class.
+The @code{word} character class matches letters, digits, and the character
+@samp{_}.
+
+Within @samp{[} and @samp{]}, an @var{equivalence class} can be
+specified using the syntax @code{[=}@var{c}@code{=]}, which
+matches all characters with the same collation weight (as defined
+by the current locale) as the character @var{c}.
+
+Within @samp{[} and @samp{]}, the syntax @code{[.}@var{symbol}@code{.]}
+matches the collating symbol @var{symbol}.
+@end table
+
+If the @code{extglob} shell option is enabled using the @code{shopt}
+builtin, several extended pattern matching operators are recognized.
+In the following description, a @var{pattern-list} is a list of one
+or more patterns separated by a @samp{|}.
+Composite patterns may be formed using one or more of the following
+sub-patterns:
+
+@table @code
+@item ?(@var{pattern-list})
+Matches zero or one occurrence of the given patterns.
+
+@item *(@var{pattern-list})
+Matches zero or more occurrences of the given patterns.
+
+@item +(@var{pattern-list})
+Matches one or more occurrences of the given patterns.
+
+@item @@(@var{pattern-list})
+Matches exactly one of the given patterns.
+
+@item !(@var{pattern-list})
+Matches anything except one of the given patterns.
+@end table
+
+@node Quote Removal
+@subsection Quote Removal
+
+After the preceding expansions, all unquoted occurrences of the
+characters @samp{\}, @samp{'}, and @samp{"} that did not
+result from one of the above expansions are removed.
+
+@node Redirections
+@section Redirections
+@cindex redirection
+
+Before a command is executed, its input and output
+may be @var{redirected}
+using a special notation interpreted by the shell.
+Redirection may also be used to open and close files for the
+current shell execution environment.  The following redirection
+operators may precede or appear anywhere within a
+simple command or may follow a command.
+Redirections are processed in the order they appear, from
+left to right.
+
+In the following descriptions, if the file descriptor number is
+omitted, and the first character of the redirection operator is
+@samp{<}, the redirection refers to the standard input (file
+descriptor 0).  If the first character of the redirection operator
+is @samp{>}, the redirection refers to the standard output (file
+descriptor 1).
+
+The word following the redirection operator in the following
+descriptions, unless otherwise noted, is subjected to brace expansion,
+tilde expansion, parameter expansion, command substitution, arithmetic
+expansion, quote removal, filename expansion, and word splitting.
+If it expands to more than one word, Bash reports an error.
+
+Note that the order of redirections is significant.  For example,
+the command
+@example
+ls > @var{dirlist} 2>&1
+@end example
+@noindent
+directs both standard output (file descriptor 1) and standard error
+(file descriptor 2) to the file @var{dirlist}, while the command
+@example
+ls 2>&1 > @var{dirlist}
+@end example
+@noindent
+directs only the standard output to file @var{dirlist},
+because the standard error was duplicated as standard output
+before the standard output was redirected to @var{dirlist}.
+
+Bash handles several filenames specially when they are used in
+redirections, as described in the following table:
+
+@table @code
+@item /dev/fd/@var{fd}
+If @var{fd} is a valid integer, file descriptor @var{fd} is duplicated.
+
+@item /dev/stdin
+File descriptor 0 is duplicated.
+
+@item /dev/stdout
+File descriptor 1 is duplicated.
+
+@item /dev/stderr
+File descriptor 2 is duplicated.
+
+@item /dev/tcp/@var{host}/@var{port}
+If @var{host} is a valid hostname or Internet address, and @var{port}
+is an integer port number or service name, Bash attempts to open a TCP
+connection to the corresponding socket.
+
+@item /dev/udp/@var{host}/@var{port}
+If @var{host} is a valid hostname or Internet address, and @var{port}
+is an integer port number or service name, Bash attempts to open a UDP
+connection to the corresponding socket.
+
+@end table
+
+A failure to open or create a file causes the redirection to fail.
+
+@subsection Redirecting Input
+Redirection of input causes the file whose name results from
+the expansion of @var{word}
+to be opened for reading on file descriptor @code{n},
+or the standard input (file descriptor 0) if @code{n}
+is not specified.
+
+The general format for redirecting input is:
+@example
+[@var{n}]<@var{word}
+@end example
+
+@subsection Redirecting Output
+Redirection of output causes the file whose name results from
+the expansion of @var{word}
+to be opened for writing on file descriptor @var{n},
+or the standard output (file descriptor 1) if @var{n}
+is not specified.  If the file does not exist it is created;
+if it does exist it is truncated to zero size.
+
+The general format for redirecting output is:
+@example
+[@var{n}]>[|]@var{word}
+@end example
+
+If the redirection operator is @samp{>}, and the @code{noclobber}
+option to the @code{set} builtin has been enabled, the redirection
+will fail if the file whose name results from the expansion of
+@var{word} exists and is a regular file.
+If the redirection operator is @samp{>|}, or the redirection operator is
+@samp{>} and the @code{noclobber} option is not enabled, the redirection
+is attempted even if the file named by @var{word} exists.
+
+@subsection Appending Redirected Output
+Redirection of output in this fashion
+causes the file whose name results from
+the expansion of @var{word}
+to be opened for appending on file descriptor @var{n},
+or the standard output (file descriptor 1) if @var{n}
+is not specified.  If the file does not exist it is created.
+
+The general format for appending output is:
+@example
+[@var{n}]>>@var{word}
+@end example
+
+@subsection Redirecting Standard Output and Standard Error
+Bash allows both the
+standard output (file descriptor 1) and
+the standard error output (file descriptor 2)
+to be redirected to the file whose name is the
+expansion of @var{word} with this construct.
+
+There are two formats for redirecting standard output and
+standard error:
+@example
+&>@var{word}
+@end example
+@noindent
+and
+@example
+>&@var{word}
+@end example
+@noindent
+Of the two forms, the first is preferred.
+This is semantically equivalent to
+@example
+>@var{word} 2>&1
+@end example
+
+@subsection Here Documents
+This type of redirection instructs the shell to read input from the
+current source until a line containing only @var{word}
+(with no trailing blanks) is seen.  All of
+the lines read up to that point are then used as the standard
+input for a command.
+
+The format of here-documents is:
+@example
+<<[@minus{}]@var{word}
+        @var{here-document}
+@var{delimiter}
+@end example
+
+No parameter expansion, command substitution, arithmetic expansion,
+or filename expansion is performed on
+@var{word}.  If any characters in @var{word} are quoted, the
+@var{delimiter} is the result of quote removal on @var{word},
+and the lines in the here-document are not expanded.
+If @var{word} is unquoted,
+all lines of the here-document are subjected to parameter expansion,
+command substitution, and arithmetic expansion.  In the latter
+case, the character sequence @code{\newline} is ignored, and @samp{\}
+must be used to quote the characters
+@samp{\}, @samp{$}, and @samp{`}.
+
+If the redirection operator is @samp{<<-},
+then all leading tab characters are stripped from input lines and the
+line containing @var{delimiter}.
+This allows here-documents within shell scripts to be indented in a
+natural fashion.
+
+@subsection Here Strings
+A variant of here documents, the format is:
+@example
+<<< @var{word}
+@end example
+
+The @var{word} is expanded and supplied to the command on its standard
+input.
+
+@subsection Duplicating File Descriptors
+The redirection operator
+@example
+[@var{n}]<&@var{word}
+@end example
+@noindent
+is used to duplicate input file descriptors.
+If @var{word}
+expands to one or more digits, the file descriptor denoted by @var{n}
+is made to be a copy of that file descriptor.
+If the digits in @var{word} do not specify a file descriptor open for
+input, a redirection error occurs.
+If @var{word}
+evaluates to @samp{-}, file descriptor @var{n} is closed.  If
+@var{n} is not specified, the standard input (file descriptor 0) is used.
+
+The operator
+@example
+[@var{n}]>&@var{word}
+@end example
+@noindent
+is used similarly to duplicate output file descriptors.  If
+@var{n} is not specified, the standard output (file descriptor 1) is used.
+If the digits in @var{word} do not specify a file descriptor open for
+output, a redirection error occurs.
+As a special case, if @var{n} is omitted, and @var{word} does not
+expand to one or more digits, the standard output and standard
+error are redirected as described previously.
+
+@subsection Moving File Descriptors
+The redirection operator
+@example
+[@var{n}]<&@var{digit}-
+@end example
+@noindent
+moves the file descriptor @var{digit} to file descriptor @var{n},
+or the standard input (file descriptor 0) if @var{n} is not specified.
+@var{digit} is closed after being duplicated to @var{n}.
+
+Similarly, the redirection operator
+@example
+[@var{n}]>&@var{digit}-
+@end example
+@noindent
+moves the file descriptor @var{digit} to file descriptor @var{n},
+or the standard output (file descriptor 1) if @var{n} is not specified.
+
+@subsection Opening File Descriptors for Reading and Writing
+The redirection operator
+@example
+[@var{n}]<>@var{word}
+@end example
+@noindent
+causes the file whose name is the expansion of @var{word}
+to be opened for both reading and writing on file descriptor
+@var{n}, or on file descriptor 0 if @var{n}
+is not specified.  If the file does not exist, it is created.
+
+@node Executing Commands
+@section Executing Commands
+
+@menu
+* Simple Command Expansion::   How Bash expands simple commands before
+                               executing them.
+
+* Command Search and Execution::       How Bash finds commands and runs them.
+
+* Command Execution Environment::      The environment in which Bash
+                                       executes commands that are not
+                                       shell builtins.
+
+* Environment::                The environment given to a command.
+
+* Exit Status::                The status returned by commands and how Bash
+                       interprets it.
+
+* Signals::            What happens when Bash or a command it runs
+                       receives a signal.
+
+@end menu
+
+@node Simple Command Expansion
+@subsection Simple Command Expansion
+@cindex command expansion
+
+When a simple command is executed, the shell performs the following
+expansions, assignments, and redirections, from left to right.
+
+@enumerate
+@item
+The words that the parser has marked as variable assignments (those
+preceding the command name) and redirections are saved for later
+processing.
+
+@item
+The words that are not variable assignments or redirections are
+expanded (@pxref{Shell Expansions}).
+If any words remain after expansion, the first word
+is taken to be the name of the command and the remaining words are
+the arguments.
+
+@item
+Redirections are performed as described above (@pxref{Redirections}).
+
+@item
+The text after the @samp{=} in each variable assignment undergoes tilde
+expansion, parameter expansion, command substitution, arithmetic expansion,
+and quote removal before being assigned to the variable.
+@end enumerate
+
+If no command name results, the variable assignments affect the current
+shell environment.  Otherwise, the variables are added to the environment
+of the executed command and do not affect the current shell environment.
+If any of the assignments attempts to assign a value to a readonly variable,
+an error occurs, and the command exits with a non-zero status.
+
+If no command name results, redirections are performed, but do not
+affect the current shell environment.  A redirection error causes the
+command to exit with a non-zero status.
+
+If there is a command name left after expansion, execution proceeds as
+described below.  Otherwise, the command exits.  If one of the expansions
+contained a command substitution, the exit status of the command is
+the exit status of the last command substitution performed.  If there
+were no command substitutions, the command exits with a status of zero.
+
+@node Command Search and Execution
+@subsection Command Search and Execution
+@cindex command execution
+@cindex command search
+
+After a command has been split into words, if it results in a
+simple command and an optional list of arguments, the following
+actions are taken.
+
+@enumerate
+@item
+If the command name contains no slashes, the shell attempts to
+locate it.  If there exists a shell function by that name, that
+function is invoked as described in @ref{Shell Functions}.
+
+@item
+If the name does not match a function, the shell searches for
+it in the list of shell builtins.  If a match is found, that
+builtin is invoked.
+
+@item
+If the name is neither a shell function nor a builtin,
+and contains no slashes, Bash searches each element of
+@env{$PATH} for a directory containing an executable file
+by that name.  Bash uses a hash table to remember the full
+pathnames of executable files to avoid multiple @env{PATH} searches
+(see the description of @code{hash} in @ref{Bourne Shell Builtins}).
+A full search of the directories in @env{$PATH}
+is performed only if the command is not found in the hash table.
+If the search is unsuccessful, the shell prints an error
+message and returns an exit status of 127.
+
+@item
+If the search is successful, or if the command name contains
+one or more slashes, the shell executes the named program in
+a separate execution environment.
+Argument 0 is set to the name given, and the remaining arguments
+to the command are set to the arguments supplied, if any.
+
+@item
+If this execution fails because the file is not in executable
+format, and the file is not a directory, it is assumed to be a
+@var{shell script} and the shell executes it as described in
+@ref{Shell Scripts}.
+
+@item
+If the command was not begun asynchronously, the shell waits for
+the command to complete and collects its exit status.
+
+@end enumerate
+
+@node Command Execution Environment
+@subsection Command Execution Environment
+@cindex execution environment
+
+The shell has an @var{execution environment}, which consists of the
+following:
+
+@itemize @bullet
+@item
+open files inherited by the shell at invocation, as modified by
+redirections supplied to the @code{exec} builtin
+
+@item
+the current working directory as set by @code{cd}, @code{pushd}, or
+@code{popd}, or inherited by the shell at invocation
+
+@item
+the file creation mode mask as set by @code{umask} or inherited from
+the shell's parent
+
+@item
+current traps set by @code{trap}
+
+@item
+shell parameters that are set by variable assignment or with @code{set}
+or inherited from the shell's parent in the environment
+
+@item
+shell functions defined during execution or inherited from the shell's
+parent in the environment
+
+@item
+options enabled at invocation (either by default or with command-line
+arguments) or by @code{set}
+
+@item
+options enabled by @code{shopt}
+
+@item
+shell aliases defined with @code{alias} (@pxref{Aliases})
+
+@item
+various process @sc{id}s, including those of background jobs
+(@pxref{Lists}), the value of @code{$$}, and the value of
+@env{$PPID}
+
+@end itemize
+
+When a simple command other than a builtin or shell function
+is to be executed, it
+is invoked in a separate execution environment that consists of
+the following.  Unless otherwise noted, the values are inherited
+from the shell.
+
+@itemize @bullet
+@item
+the shell's open files, plus any modifications and additions specified
+by redirections to the command
+
+@item
+the current working directory
+
+@item
+the file creation mode mask
+
+@item
+shell variables and functions marked for export, along with variables
+exported for the command, passed in the environment (@pxref{Environment})
+
+@item
+traps caught by the shell are reset to the values inherited from the
+shell's parent, and traps ignored by the shell are ignored
+
+@end itemize
+
+A command invoked in this separate environment cannot affect the
+shell's execution environment. 
+
+Command substitution and asynchronous commands are invoked in a
+subshell environment that is a duplicate of the shell environment,
+except that traps caught by the shell are reset to the values
+that the shell inherited from its parent at invocation.  Builtin
+commands that are invoked as part of a pipeline are also executed
+in a subshell environment.  Changes made to the subshell environment
+cannot affect the shell's execution environment.
+
+If a command is followed by a @samp{&} and job control is not active, the
+default standard input for the command is the empty file @file{/dev/null}.
+Otherwise, the invoked command inherits the file descriptors of the calling
+shell as modified by redirections.
+
+@node Environment
+@subsection Environment
+@cindex environment
+
+When a program is invoked it is given an array of strings
+called the @var{environment}.
+This is a list of name-value pairs, of the form @code{name=value}.
+
+Bash provides several ways to manipulate the environment.
+On invocation, the shell scans its own environment and
+creates a parameter for each name found, automatically marking
+it for @var{export}
+to child processes.  Executed commands inherit the environment.
+The @code{export} and @samp{declare -x}
+commands allow parameters and functions to be added to and
+deleted from the environment.  If the value of a parameter
+in the environment is modified, the new value becomes part
+of the environment, replacing the old.  The environment
+inherited by any executed command consists of the shell's
+initial environment, whose values may be modified in the shell,
+less any pairs removed by the @code{unset} and @samp{export -n}
+commands, plus any additions via the @code{export} and
+@samp{declare -x} commands.
+
+The environment for any simple command
+or function may be augmented temporarily by prefixing it with
+parameter assignments, as described in @ref{Shell Parameters}.
+These assignment statements affect only the environment seen
+by that command.
+
+If the @option{-k} option is set (@pxref{The Set Builtin}), then all
+parameter assignments are placed in the environment for a command,
+not just those that precede the command name.
+
+When Bash invokes an external command, the variable @samp{$_}
+is set to the full path name of the command and passed to that
+command in its environment.
+
+@node Exit Status
+@subsection Exit Status
+@cindex exit status
+
+For the shell's purposes, a command which exits with a
+zero exit status has succeeded.
+A non-zero exit status indicates failure.
+This seemingly counter-intuitive scheme is used so there
+is one well-defined way to indicate success and a variety of
+ways to indicate various failure modes.
+When a command terminates on a fatal signal whose number is @var{N},
+Bash uses the value 128+@var{N} as the exit status.
+
+If a command is not found, the child process created to
+execute it returns a status of 127.  If a command is found  
+but is not executable, the return status is 126.
+
+If a command fails because of an error during expansion or redirection,
+the exit status is greater than zero.
+
+The exit status is used by the Bash conditional commands
+(@pxref{Conditional Constructs}) and some of the list
+constructs (@pxref{Lists}).
+
+All of the Bash builtins return an exit status of zero if they succeed
+and a non-zero status on failure, so they may be used by the
+conditional and list constructs.
+All builtins return an exit status of 2 to indicate incorrect usage.
+
+@node Signals
+@subsection Signals
+@cindex signal handling
+
+When Bash is interactive, in the absence of any traps, it ignores
+@code{SIGTERM} (so that @samp{kill 0} does not kill an interactive shell),
+and @code{SIGINT}
+is caught and handled (so that the @code{wait} builtin is interruptible).
+When Bash receives a @code{SIGINT}, it breaks out of any executing loops.
+In all cases, Bash ignores @code{SIGQUIT}.
+If job control is in effect (@pxref{Job Control}), Bash
+ignores @code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}.
+
+Commands started by Bash have signal handlers set to the
+values inherited by the shell from its parent.
+When job control is not in effect, asynchronous commands
+ignore @code{SIGINT} and @code{SIGQUIT} as well.
+Commands run as a result of
+command substitution ignore the keyboard-generated job control signals
+@code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}.
+
+The shell exits by default upon receipt of a @code{SIGHUP}.
+Before exiting, an interactive shell resends the @code{SIGHUP} to
+all jobs, running or stopped.
+Stopped jobs are sent @code{SIGCONT} to ensure that they receive
+the @code{SIGHUP}.
+To prevent the shell from sending the @code{SIGHUP} signal to a
+particular job, it should be removed
+from the jobs table with the @code{disown}
+builtin (@pxref{Job Control Builtins}) or marked
+to not receive @code{SIGHUP} using @code{disown -h}.
+
+If the  @code{huponexit} shell option has been set with @code{shopt}
+(@pxref{Bash Builtins}), Bash sends a @code{SIGHUP} to all jobs when
+an interactive login shell exits.
+
+When Bash receives a signal for which a trap has been set while waiting
+for a command to complete, the trap will not be executed until the
+command completes. 
+When Bash is waiting for an asynchronous
+command via the @code{wait} builtin, the reception of a signal for
+which a trap has been set will cause the @code{wait} builtin to return
+immediately with an exit status greater than 128, immediately after
+which the trap is executed.
+
+@node Shell Scripts
+@section Shell Scripts
+@cindex shell script
+
+A shell script is a text file containing shell commands.  When such
+a file is used as the first non-option argument when invoking Bash,
+and neither the @option{-c} nor @option{-s} option is supplied
+(@pxref{Invoking Bash}), 
+Bash reads and executes commands from the file, then exits.  This
+mode of operation creates a non-interactive shell.  The shell first
+searches for the file in the current directory, and looks in the
+directories in @env{$PATH} if not found there.
+
+When Bash runs
+a shell script, it sets the special parameter @code{0} to the name
+of the file, rather than the name of the shell, and the positional
+parameters are set to the remaining arguments, if any are given.
+If no additional arguments are supplied, the positional parameters
+are unset.
+
+A shell script may be made executable by using the @code{chmod} command
+to turn on the execute bit.  When Bash finds such a file while
+searching the @env{$PATH} for a command, it spawns a subshell to
+execute it.  In other words, executing
+@example
+filename @var{arguments}
+@end example
+@noindent
+is equivalent to executing
+@example
+bash filename @var{arguments}
+@end example
+
+@noindent
+if @code{filename} is an executable shell script.
+This subshell reinitializes itself, so that the effect is as if a
+new shell had been invoked to interpret the script, with the
+exception that the locations of commands remembered by the parent
+(see the description of @code{hash} in @ref{Bourne Shell Builtins})
+are retained by the child.
+
+Most versions of Unix make this a part of the operating system's command
+execution mechanism.  If the first line of a script begins with
+the two characters @samp{#!}, the remainder of the line specifies
+an interpreter for the program.
+Thus, you can specify Bash, @code{awk}, Perl, or some other
+interpreter and write the rest of the script file in that language.
+
+The arguments to the interpreter
+consist of a single optional argument following the interpreter
+name on the first line of the script file, followed by the name of
+the script file, followed by the rest of the arguments.  Bash
+will perform this action on operating systems that do not handle it
+themselves.  Note that some older versions of Unix limit the interpreter
+name and argument to a maximum of 32 characters.
+
+Bash scripts often begin with @code{#! /bin/bash} (assuming that
+Bash has been installed in @file{/bin}), since this ensures that
+Bash will be used to interpret the script, even if it is executed
+under another shell.
+
+@node Shell Builtin Commands
+@chapter Shell Builtin Commands
+
+@menu
+* Bourne Shell Builtins::      Builtin commands inherited from the Bourne
+                               Shell.
+* Bash Builtins::              Table of builtins specific to Bash.
+* The Set Builtin::            This builtin is so overloaded it
+                               deserves its own section.
+* Special Builtins::           Builtin commands classified specially by
+                               POSIX.2.
+@end menu
+
+Builtin commands are contained within the shell itself.
+When the name of a builtin command is used as the first word of
+a simple command (@pxref{Simple Commands}), the shell executes
+the command directly, without invoking another program.
+Builtin commands are necessary to implement functionality impossible
+or inconvenient to obtain with separate utilities.
+
+This section briefly the builtins which Bash inherits from
+the Bourne Shell, as well as the builtin commands which are unique
+to or have been extended in Bash.
+
+Several builtin commands are described in other chapters:  builtin
+commands which provide the Bash interface to the job control
+facilities (@pxref{Job Control Builtins}), the directory stack
+(@pxref{Directory Stack Builtins}), the command history
+(@pxref{Bash History Builtins}), and the programmable completion
+facilities (@pxref{Programmable Completion Builtins}).
+
+Many of the builtins have been extended by @sc{posix} or Bash.
+
+@node Bourne Shell Builtins
+@section Bourne Shell Builtins
+
+The following shell builtin commands are inherited from the Bourne Shell.
+These commands are implemented as specified by the @sc{posix} 1003.2 standard.
+
+@table @code
+@item :    @r{(a colon)}
+@btindex :
+@example
+: [@var{arguments}]
+@end example
+Do nothing beyond expanding @var{arguments} and performing redirections.
+The return status is zero.
+
+@item .    @r{(a period)}
+@btindex .
+@example
+. @var{filename} [@var{arguments}]
+@end example
+Read and execute commands from the @var{filename} argument in the
+current shell context.  If @var{filename} does not contain a slash,
+the @env{PATH} variable is used to find @var{filename}.
+When Bash is not in @sc{posix} mode, the current directory is searched
+if @var{filename} is not found in @env{$PATH}.
+If any @var{arguments} are supplied, they become the positional
+parameters when @var{filename} is executed.  Otherwise the positional
+parameters are unchanged.
+The return status is the exit status of the last command executed, or
+zero if no commands are executed.  If @var{filename} is not found, or
+cannot be read, the return status is non-zero.
+This builtin is equivalent to @code{source}.
+
+@item break
+@btindex break
+@example
+break [@var{n}]
+@end example
+Exit from a @code{for}, @code{while}, @code{until}, or @code{select} loop.
+If @var{n} is supplied, the @var{n}th enclosing loop is exited.
+@var{n} must be greater than or equal to 1.
+The return status is zero unless @var{n} is not greater than or equal to 1.
+
+@item cd
+@btindex cd
+@example
+cd [-L|-P] [@var{directory}]
+@end example
+Change the current working directory to @var{directory}.  If @var{directory}
+is not given, the value of the @env{HOME} shell variable is used.  If the
+shell variable @env{CDPATH} exists, it is used as a search path.  If
+@var{directory} begins with a slash, @env{CDPATH} is not used.
+The @option{-P} option means
+to not follow symbolic links; symbolic links are followed by default
+or with the @option{-L} option.
+If @var{directory} is @samp{-}, it is equivalent to @env{$OLDPWD}.
+The return status is zero if the directory is successfully changed,
+non-zero otherwise.
+
+@item continue
+@btindex continue
+@example
+continue [@var{n}]
+@end example
+Resume the next iteration of an enclosing @code{for}, @code{while},
+@code{until}, or @code{select} loop.
+If @var{n} is supplied, the execution of the @var{n}th enclosing loop
+is resumed.
+@var{n} must be greater than or equal to 1.
+The return status is zero unless @var{n} is not greater than or equal to 1.
+
+@item eval
+@btindex eval
+@example
+eval [@var{arguments}]
+@end example
+The arguments are concatenated together into a single command, which is
+then read and executed, and its exit status returned as the exit status
+of @code{eval}.
+If there are no arguments or only empty arguments, the return status is
+zero.
+
+@item exec
+@btindex exec
+@example
+exec [-cl] [-a @var{name}] [@var{command} [@var{arguments}]]
+@end example
+If @var{command}
+is supplied, it replaces the shell without creating a new process.
+If the @option{-l} option is supplied, the shell places a dash at the
+beginning of the zeroth arg passed to @var{command}.
+This is what the @code{login} program does.
+The @option{-c} option causes @var{command} to be executed with an empty
+environment.
+If @option{-a} is supplied, the shell passes @var{name} as the zeroth
+argument to @var{command}.
+If no @var{command} is specified, redirections may be used to affect
+the current shell environment.  If there are no redirection errors, the
+return status is zero; otherwise the return status is non-zero.
+
+@item exit
+@btindex exit
+@example
+exit [@var{n}]
+@end example
+Exit the shell, returning a status of @var{n} to the shell's parent.
+If @var{n} is omitted, the exit status is that of the last command executed.
+Any trap on @code{EXIT} is executed before the shell terminates.
+
+@item export
+@btindex export
+@example
+export [-fn] [-p] [@var{name}[=@var{value}]]
+@end example
+Mark each @var{name} to be passed to child processes
+in the environment.  If the @option{-f} option is supplied, the @var{name}s
+refer to shell functions; otherwise the names refer to shell variables.
+The @option{-n} option means to no longer mark each @var{name} for export.
+If no @var{names} are supplied, or if the @option{-p} option is given, a
+list of exported names is displayed.
+The @option{-p} option displays output in a form that may be reused as input.
+If a variable name is followed by =@var{value}, the value of
+the variable is set to @var{value}.
+
+The return status is zero unless an invalid option is supplied, one of
+the names is not a valid shell variable name, or @option{-f} is supplied
+with a name that is not a shell function.
+
+@item getopts
+@btindex getopts
+@example
+getopts @var{optstring} @var{name} [@var{args}]
+@end example
+@code{getopts} is used by shell scripts to parse positional parameters.
+@var{optstring} contains the option characters to be recognized; if a
+character is followed by a colon, the option is expected to have an
+argument, which should be separated from it by white space.
+The colon (@samp{:}) and question mark (@samp{?}) may not be
+used as option characters.
+Each time it is invoked, @code{getopts}
+places the next option in the shell variable @var{name}, initializing
+@var{name} if it does not exist,
+and the index of the next argument to be processed into the
+variable @env{OPTIND}.
+@env{OPTIND} is initialized to 1 each time the shell or a shell script
+is invoked.
+When an option requires an argument,
+@code{getopts} places that argument into the variable @env{OPTARG}.
+The shell does not reset @env{OPTIND} automatically; it must be manually
+reset between multiple calls to @code{getopts} within the same shell
+invocation if a new set of parameters is to be used.
+
+When the end of options is encountered, @code{getopts} exits with a
+return value greater than zero.
+@env{OPTIND} is set to the index of the first non-option argument,
+and @code{name} is set to @samp{?}.
+
+@code{getopts}
+normally parses the positional parameters, but if more arguments are
+given in @var{args}, @code{getopts} parses those instead.
+
+@code{getopts} can report errors in two ways.  If the first character of
+@var{optstring} is a colon, @var{silent}
+error reporting is used.  In normal operation diagnostic messages
+are printed when invalid options or missing option arguments are
+encountered.
+If the variable @env{OPTERR}
+is set to 0, no error messages will be displayed, even if the first
+character of @code{optstring} is not a colon.
+
+If an invalid option is seen,
+@code{getopts} places @samp{?} into @var{name} and, if not silent,
+prints an error message and unsets @env{OPTARG}.
+If @code{getopts} is silent, the option character found is placed in
+@env{OPTARG} and no diagnostic message is printed.
+
+If a required argument is not found, and @code{getopts}
+is not silent, a question mark (@samp{?}) is placed in @var{name},
+@code{OPTARG} is unset, and a diagnostic message is printed.
+If @code{getopts} is silent, then a colon (@samp{:}) is placed in
+@var{name} and @env{OPTARG} is set to the option character found.
+
+@item hash
+@btindex hash
+@example
+hash [-'r] [-p @var{filename}] [-dt] [@var{name}]
+@end example
+Remember the full pathnames of commands specified as @var{name} arguments,
+so they need not be searched for on subsequent invocations.
+The commands are found by searching through the directories listed in
+@env{$PATH}.
+The @option{-p} option inhibits the path search, and @var{filename} is
+used as the location of @var{name}.
+The @option{-r} option causes the shell to forget all remembered locations.
+The @option{-d} option causes the shell to forget the remembered location
+of each @var{name}.
+If the @option{-t} option is supplied, the full pathname to which each
+@var{name} corresponds is printed.  If multiple @var{name} arguments are
+supplied with @option{-t} the @var{name} is printed before the hashed
+full pathname.
+The @option{-l} option causes output to be displayed in a format
+that may be reused as input.
+If no arguments are given, or if only @option{-l} is supplied,
+information about remembered commands is printed.
+The return status is zero unless a @var{name} is not found or an invalid
+option is supplied.
+
+@item pwd
+@btindex pwd
+@example
+pwd [-LP]
+@end example
+Print the absolute pathname of the current working directory.
+If the @option{-P} option is supplied, the pathname printed will not
+contain symbolic links.
+If the @option{-L} option is supplied, the pathname printed may contain
+symbolic links.
+The return status is zero unless an error is encountered while
+determining the name of the current directory or an invalid option
+is supplied.
+
+@item readonly
+@btindex readonly
+@example
+readonly [-apf] [@var{name}[=@var{value}]] @dots{}
+@end example
+Mark each @var{name} as readonly.
+The values of these names may not be changed by subsequent assignment.
+If the @option{-f} option is supplied, each @var{name} refers to a shell
+function.
+The @option{-a} option means each @var{name} refers to an array variable.
+If no @var{name} arguments are given, or if the @option{-p}
+option is supplied, a list of all readonly names is printed.
+The @option{-p} option causes output to be displayed in a format that
+may be reused as input.
+If a variable name is followed by =@var{value}, the value of
+the variable is set to @var{value}.
+The return status is zero unless an invalid option is supplied, one of
+the @var{name} arguments is not a valid shell variable or function name,
+or the @option{-f} option is supplied with a name that is not a shell function.
+
+@item return
+@btindex return
+@example
+return [@var{n}]
+@end example
+Cause a shell function to exit with the return value @var{n}.
+If @var{n} is not supplied, the return value is the exit status of the
+last command executed in the function.
+This may also be used to terminate execution of a script being executed
+with the @code{.} (or @code{source}) builtin, returning either @var{n} or
+the exit status of the last command executed within the script as the exit
+status of the script.
+Any command associated with the @code{RETURN} trap is executed
+before execution resumes after the function or script.
+The return status is non-zero if @code{return} is used outside a function
+and not during the execution of a script by @code{.} or @code{source}.
+
+@item shift
+@btindex shift
+@example
+shift [@var{n}]
+@end example
+Shift the positional parameters to the left by @var{n}.
+The positional parameters from @var{n}+1 @dots{} @code{$#} are
+renamed to @code{$1} @dots{} @code{$#}-@var{n}+1.
+Parameters represented by the numbers @code{$#} to @var{n}+1 are unset.
+@var{n} must be a non-negative number less than or equal to @code{$#}.
+If @var{n} is zero or greater than @code{$#}, the positional parameters
+are not changed.
+If @var{n} is not supplied, it is assumed to be 1.
+The return status is zero unless @var{n} is greater than @code{$#} or
+less than zero, non-zero otherwise.
+
+@item test
+@itemx [
+@btindex test
+@btindex [
+Evaluate a conditional expression @var{expr}.
+Each operator and operand must be a separate argument.
+Expressions are composed of the primaries described below in
+@ref{Bash Conditional Expressions}.
+
+When the @code{[} form is used, the last argument to the command must
+be a @code{]}.
+
+Expressions may be combined using the following operators, listed in
+decreasing order of precedence.
+
+@table @code
+@item ! @var{expr}
+True if @var{expr} is false.
+
+@item ( @var{expr} )
+Returns the value of @var{expr}.
+This may be used to override the normal precedence of operators.
+
+@item @var{expr1} -a @var{expr2}
+True if both @var{expr1} and @var{expr2} are true.
+
+@item @var{expr1} -o @var{expr2}
+True if either @var{expr1} or @var{expr2} is true.
+@end table
+
+The @code{test} and @code{[} builtins evaluate conditional
+expressions using a set of rules based on the number of arguments.
+
+@table @asis
+@item 0 arguments
+The expression is false.
+
+@item 1 argument
+The expression is true if and only if the argument is not null.
+
+@item 2 arguments
+If the first argument is @samp{!}, the expression is true if and
+only if the second argument is null.
+If the first argument is one of the unary conditional operators
+(@pxref{Bash Conditional Expressions}), the expression
+is true if the unary test is true.
+If the first argument is not a valid unary operator, the expression is
+false.
+
+@item 3 arguments
+If the second argument is one of the binary conditional
+operators (@pxref{Bash Conditional Expressions}), the
+result of the expression is the result of the binary test using the
+first and third arguments as operands.
+If the first argument is @samp{!}, the value is the negation of
+the two-argument test using the second and third arguments.
+If the first argument is exactly @samp{(} and the third argument is
+exactly @samp{)}, the result is the one-argument test of the second
+argument.
+Otherwise, the expression is false.
+The @samp{-a} and @samp{-o} operators are considered binary operators
+in this case.  
+
+@item 4 arguments
+If the first argument is @samp{!}, the result is the negation of
+the three-argument expression composed of the remaining arguments.
+Otherwise, the expression is parsed and evaluated according to 
+precedence using the rules listed above.
+
+@item 5 or more arguments
+The expression is parsed and evaluated according to precedence
+using the rules listed above.
+@end table
+
+@item times
+@btindex times
+@example
+times
+@end example
+Print out the user and system times used by the shell and its children.
+The return status is zero.
+
+@item trap
+@btindex trap
+@example
+trap [-lp] [@var{arg}] [@var{sigspec} @dots{}]
+@end example
+The commands in @var{arg} are to be read and executed when the
+shell receives signal @var{sigspec}.  If @var{arg} is absent or
+equal to @samp{-}, all specified signals are reset to the values
+they had when the shell was started.
+If @var{arg} is the null string, then the signal specified by
+each @var{sigspec} is ignored by the shell and commands it invokes.
+If @var{arg} is not present and @option{-p} has been supplied,
+the shell displays the trap commands associated with each @var{sigspec}.
+If no arguments are supplied, or
+only @option{-p} is given, @code{trap} prints the list of commands
+associated with each signal number in a form that may be reused as
+shell input.
+The @option{-l} option causes the shell to print a list of signal names
+and their corresponding numbers.
+
+Each @var{sigspec} is either a signal name such as @code{SIGINT} (with
+or without the @code{SIG} prefix) or a signal number.
+If a @var{sigspec}
+is @code{0} or @code{EXIT}, @var{arg} is executed when the shell exits.
+If a @var{sigspec} is @code{DEBUG}, the command @var{arg} is executed
+before every simple command, @code{for} command, @code{case} command,
+@code{select} command, every arithmetic @code{for} command, and before
+the first command executes in a shell function.
+Refer to the description of the @code{extglob} option to the
+@code{shopt} builtin (@pxref{Bash Builtins}) for details of its
+effect on the @code{DEBUG} trap.
+If a @var{sigspec} is @code{ERR}, the command @var{arg} 
+is executed whenever a simple command has a non-zero exit status.
+The @code{ERR} trap is not executed if the failed command is part of the
+command list immediately following an @code{until} or @code{while} keyword,
+part of the test in an @code{if} statement,
+part of a @code{&&} or @code{||} list, or if the command's return
+status is being inverted using @code{!}.
+If a @var{sigspec} is @code{RETURN}, the command @var{arg} is executed
+each time a shell function or a script executed with the @code{.} or
+@code{source} builtins finishes executing.
+
+Signals ignored upon entry to the shell cannot be trapped or reset.
+Trapped signals are reset to their original values in a child  
+process when it is created.
+
+The return status is zero unless a @var{sigspec} does not specify a
+valid signal.
+
+@item umask
+@btindex umask
+@example
+umask [-p] [-S] [@var{mode}]
+@end example
+Set the shell process's file creation mask to @var{mode}.  If
+@var{mode} begins with a digit, it is interpreted as an octal number;
+if not, it is interpreted as a symbolic mode mask similar
+to that accepted by the @code{chmod} command.  If @var{mode} is
+omitted, the current value of the mask is printed.  If the @option{-S}
+option is supplied without a @var{mode} argument, the mask is printed
+in a symbolic format.
+If the  @option{-p} option is supplied, and @var{mode}
+is omitted, the output is in a form that may be reused as input.
+The return status is zero if the mode is successfully changed or if
+no @var{mode} argument is supplied, and non-zero otherwise.
+
+Note that when the mode is interpreted as an octal number, each number
+of the umask is subtracted from @code{7}.  Thus, a umask of @code{022}
+results in permissions of @code{755}.
+
+@item unset
+@btindex unset
+@example
+unset [-fv] [@var{name}]
+@end example
+Each variable or function @var{name} is removed.
+If no options are supplied, or the @option{-v} option is given, each
+@var{name} refers to a shell variable. 
+If the @option{-f} option is given, the @var{name}s refer to shell
+functions, and the function definition is removed.
+Readonly variables and functions may not be unset.
+The return status is zero unless a @var{name} is readonly.
+@end table
+
+@node Bash Builtins
+@section Bash Builtin Commands
+
+This section describes builtin commands which are unique to
+or have been extended in Bash.
+Some of these commands are specified in the @sc{posix} 1003.2 standard.
+
+@table @code
+
+@item alias
+@btindex alias
+@example
+alias [@code{-p}] [@var{name}[=@var{value}] @dots{}]
+@end example
+
+Without arguments or with the @option{-p} option, @code{alias} prints
+the list of aliases on the standard output in a form that allows
+them to be reused as input.
+If arguments are supplied, an alias is defined for each @var{name}
+whose @var{value} is given.  If no @var{value} is given, the name
+and value of the alias is printed.
+Aliases are described in @ref{Aliases}.
+
+@item bind
+@btindex bind
+@example
+bind [-m @var{keymap}] [-lpsvPSV]
+bind [-m @var{keymap}] [-q @var{function}] [-u @var{function}] [-r @var{keyseq}]
+bind [-m @var{keymap}] -f @var{filename}
+bind [-m @var{keymap}] -x @var{keyseq:shell-command}
+bind [-m @var{keymap}] @var{keyseq:function-name}
+bind @var{readline-command}
+@end example
+
+Display current Readline (@pxref{Command Line Editing})
+key and function bindings,
+bind a key sequence to a Readline function or macro,
+or set a Readline variable.
+Each non-option argument is a command as it would appear in a
+a Readline initialization file (@pxref{Readline Init File}),
+but each binding or command must be passed as a separate argument;  e.g.,
+@samp{"\C-x\C-r":re-read-init-file}.
+Options, if supplied, have the following meanings:
+
+@table @code
+@item -m @var{keymap}
+Use @var{keymap} as the keymap to be affected by
+the subsequent bindings.  Acceptable @var{keymap}
+names are
+@code{emacs},
+@code{emacs-standard},
+@code{emacs-meta},
+@code{emacs-ctlx},
+@code{vi},
+@code{vi-move},
+@code{vi-command}, and
+@code{vi-insert}.
+@code{vi} is equivalent to @code{vi-command};
+@code{emacs} is equivalent to @code{emacs-standard}.
+
+@item -l
+List the names of all Readline functions.
+
+@item -p
+Display Readline function names and bindings in such a way that they
+can be used as input or in a Readline initialization file.
+
+@item -P
+List current Readline function names and bindings.
+
+@item -v
+Display Readline variable names and values in such a way that they
+can be used as input or in a Readline initialization file.
+
+@item -V
+List current Readline variable names and values.
+
+@item -s
+Display Readline key sequences bound to macros and the strings they output
+in such a way that they can be used as input or in a Readline
+initialization file.
+
+@item -S
+Display Readline key sequences bound to macros and the strings they output.
+
+@item -f @var{filename}
+Read key bindings from @var{filename}.
+
+@item -q @var{function}
+Query about which keys invoke the named @var{function}.
+
+@item -u @var{function}
+Unbind all keys bound to the named @var{function}.
+
+@item -r @var{keyseq}
+Remove any current binding for @var{keyseq}.
+
+@item -x @var{keyseq:shell-command}
+Cause @var{shell-command} to be executed whenever @var{keyseq} is
+entered.
+
+@end table
+
+@noindent
+The return status is zero unless an invalid option is supplied or an
+error occurs.
+
+@item builtin
+@btindex builtin
+@example
+builtin [@var{shell-builtin} [@var{args}]]
+@end example
+Run a shell builtin, passing it @var{args}, and return its exit status.
+This is useful when defining a shell function with the same
+name as a shell builtin, retaining the functionality of the builtin within
+the function.
+The return status is non-zero if @var{shell-builtin} is not a shell
+builtin command.
+
+@item caller
+@btindex caller
+@example
+caller [@var{expr}]
+@end example
+Returns the context of any active subroutine call (a shell function or
+a script executed with the @code{.} or @code{source} builtins.
+
+Without @var{expr}, @code{caller} displays the line number and source
+filename of the current subroutine call.
+If a non-negative integer is supplied as @var{expr}, @code{caller} 
+displays the line number, subroutine name, and source file corresponding
+to that position in the current execution call stack.  This extra
+information may be used, for example, to print a stack trace.  The
+current frame is frame 0.
+
+The return value is 0 unless the shell is not executing a subroutine
+call or @var{expr} does not correspond to a valid position in the
+call stack.
+
+@item command
+@btindex command
+@example
+command [-pVv] @var{command} [@var{arguments} @dots{}]
+@end example
+Runs @var{command} with @var{arguments} ignoring any shell function
+named @var{command}.
+Only shell builtin commands or commands found by searching the
+@env{PATH} are executed.
+If there is a shell function named @code{ls}, running @samp{command ls}
+within the function will execute the external command @code{ls}
+instead of calling the function recursively.
+The @option{-p} option means to use a default value for @env{PATH}
+that is guaranteed to find all of the standard utilities.
+The return status in this case is 127 if @var{command} cannot be
+found or an error occurred, and the exit status of @var{command}
+otherwise.
+
+If either the @option{-V} or @option{-v} option is supplied, a
+description of @var{command} is printed.  The @option{-v} option
+causes a single word indicating the command or file name used to
+invoke @var{command} to be displayed; the @option{-V} option produces
+a more verbose description.  In this case, the return status is
+zero if @var{command} is found, and non-zero if not.
+
+@item declare
+@btindex declare
+@example
+declare [-afFirtx] [-p] [@var{name}[=@var{value}] @dots{}]
+@end example
+
+Declare variables and give them attributes.  If no @var{name}s
+are given, then display the values of variables instead. 
+
+The @option{-p} option will display the attributes and values of each
+@var{name}.
+When @option{-p} is used, additional options are ignored.
+The @option{-F} option inhibits the display of function definitions;
+only the function name and attributes are printed.
+If the @code{extdebug} shell option is enabled using @code{shopt}
+(@pxref{Bash Builtins}), the source file name and line number where
+the function is defined are displayed as well.
+@option{-F} implies @option{-f}.
+The following options can be used to restrict output to variables with
+the specified attributes or to give variables attributes:
+
+@table @code
+@item -a
+Each @var{name} is an array variable (@pxref{Arrays}).
+
+@item -f
+Use function names only.
+
+@item -i
+The variable is to be treated as
+an integer; arithmetic evaluation (@pxref{Shell Arithmetic}) is
+performed when the variable is assigned a value.
+
+@item -r
+Make @var{name}s readonly.  These names cannot then be assigned values
+by subsequent assignment statements or unset.
+
+@item -t
+Give each @var{name} the @code{trace} attribute.
+Traced functions inherit the @code{DEBUG} trap from the calling shell.
+The trace attribute has no special meaning for variables.
+
+@item -x
+Mark each @var{name} for export to subsequent commands via
+the environment.
+@end table
+
+Using @samp{+} instead of @samp{-} turns off the attribute instead.
+When used in a function, @code{declare} makes each @var{name} local,
+as with the @code{local} command.  If a variable name is followed by
+=@var{value}, the value of the variable is set to @var{value}.
+
+The return status is zero unless an invalid option is encountered,
+an attempt is made to define a function using @samp{-f foo=bar},
+an attempt is made to assign a value to a readonly variable,
+an attempt is made to assign a value to an array variable without
+using the compound assignment syntax (@pxref{Arrays}),
+one of the @var{names} is not a valid shell variable name,
+an attempt is made to turn off readonly status for a readonly variable,
+an attempt is made to turn off array status for an array variable,
+or an attempt is made to display a non-existent function with @option{-f}.
+
+@item echo
+@btindex echo
+@example
+echo [-neE] [@var{arg} @dots{}]
+@end example
+Output the @var{arg}s, separated by spaces, terminated with a
+newline.
+The return status is always 0.
+If @option{-n} is specified, the trailing newline is suppressed.
+If the @option{-e} option is given, interpretation of the following
+backslash-escaped characters is enabled.
+The @option{-E} option disables the interpretation of these escape characters,
+even on systems where they are interpreted by default.
+The @code{xpg_echo} shell option may be used to
+dynamically determine whether or not @code{echo} expands these
+escape characters by default.
+@code{echo} interprets the following escape sequences:
+@table @code
+@item \a
+alert (bell)
+@item \b
+backspace
+@item \c
+suppress trailing newline
+@item \e
+escape
+@item \f
+form feed
+@item \n
+new line
+@item \r
+carriage return
+@item \t 
+horizontal tab
+@item \v
+vertical tab
+@item \\
+backslash
+@item \0@var{nnn}
+the eight-bit character whose value is the octal value @var{nnn}
+(zero to three octal digits)
+@item \@var{nnn}
+the eight-bit character whose value is the octal value @var{nnn}
+(one to three octal digits)
+@item \x@var{HH}
+the eight-bit character whose value is the hexadecimal value @var{HH}
+(one or two hex digits)
+@end table
+
+@item enable
+@btindex enable
+@example
+enable [-n] [-p] [-f @var{filename}] [-ads] [@var{name} @dots{}]
+@end example
+Enable and disable builtin shell commands.
+Disabling a builtin allows a disk command which has the same name
+as a shell builtin to be executed without specifying a full pathname,
+even though the shell normally searches for builtins before disk commands.
+If @option{-n} is used, the @var{name}s become disabled.  Otherwise
+@var{name}s are enabled.  For example, to use the @code{test} binary
+found via @env{$PATH} instead of the shell builtin version, type
+@samp{enable -n test}.
+
+If the @option{-p} option is supplied, or no @var{name} arguments appear,
+a list of shell builtins is printed.  With no other arguments, the list
+consists of all enabled shell builtins.
+The @option{-a} option means to list
+each builtin with an indication of whether or not it is enabled. 
+
+The @option{-f} option means to load the new builtin command @var{name}
+from shared object @var{filename}, on systems that support dynamic loading.
+The @option{-d} option will delete a builtin loaded with @option{-f}.
+
+If there are no options, a list of the shell builtins is displayed.
+The @option{-s} option restricts @code{enable} to the @sc{posix} special
+builtins.  If @option{-s} is used with @option{-f}, the new builtin becomes
+a special builtin (@pxref{Special Builtins}).
+
+The return status is zero unless a @var{name} is not a shell builtin
+or there is an error loading a new builtin from a shared object.
+
+@item help
+@btindex help
+@example
+help [-s] [@var{pattern}]
+@end example
+Display helpful information about builtin commands.
+If @var{pattern} is specified, @code{help} gives detailed help
+on all commands matching @var{pattern}, otherwise a list of
+the builtins is printed.
+The @option{-s} option restricts the information displayed to a short
+usage synopsis.
+The return status is zero unless no command matches @var{pattern}.
+
+@item let
+@btindex let
+@example
+let @var{expression} [@var{expression}]
+@end example
+The @code{let} builtin allows arithmetic to be performed on shell
+variables.  Each @var{expression} is evaluated according to the
+rules given below in @ref{Shell Arithmetic}.  If the
+last @var{expression} evaluates to 0, @code{let} returns 1;
+otherwise 0 is returned.
+
+@item local
+@btindex local
+@example
+local [@var{option}] @var{name}[=@var{value}] @dots{}
+@end example
+For each argument, a local variable named @var{name} is created,
+and assigned @var{value}.
+The @var{option} can be any of the options accepted by @code{declare}.
+@code{local} can only be used within a function; it makes the variable
+@var{name} have a visible scope restricted to that function and its
+children.  The return status is zero unless @code{local} is used outside
+a function, an invalid @var{name} is supplied, or @var{name} is a
+readonly variable.
+
+@item logout
+@btindex logout
+@example
+logout [@var{n}]
+@end example
+Exit a login shell, returning a status of @var{n} to the shell's
+parent.
+
+@item printf
+@btindex printf
+@example
+@code{printf} @var{format} [@var{arguments}]
+@end example
+Write the formatted @var{arguments} to the standard output under the
+control of the @var{format}.
+The @var{format} is a character string which contains three types of objects:
+plain characters, which are simply copied to standard output, character
+escape sequences, which are converted and copied to the standard output, and
+format specifications, each of which causes printing of the next successive
+@var{argument}.
+In addition to the standard @code{printf(1)} formats, @samp{%b} causes
+@code{printf} to expand backslash escape sequences in the corresponding
+@var{argument}, and @samp{%q} causes @code{printf} to output the
+corresponding @var{argument} in a format that can be reused as shell input.
+
+The @var{format} is reused as necessary to consume all of the @var{arguments}.
+If the @var{format} requires more @var{arguments} than are supplied, the
+extra format specifications behave as if a zero value or null string, as
+appropriate, had been supplied.  The return value is zero on success,
+non-zero on failure.
+
+@item read
+@btindex read
+@example
+read [-ers] [-a @var{aname}] [-d @var{delim}] [-n @var{nchars}] [-p @var{prompt}] [-t @var{timeout}] [-u @var{fd}] [@var{name} @dots{}]
+@end example
+One line is read from the standard input, or from the file descriptor
+@var{fd} supplied as an argument to the @option{-u} option, and the first word
+is assigned to the first @var{name}, the second word to the second @var{name},
+and so on, with leftover words and their intervening separators assigned
+to the last @var{name}.
+If there are fewer words read from the input stream than names,
+the remaining names are assigned empty values.
+The characters in the value of the @env{IFS} variable
+are used to split the line into words.
+The backslash character @samp{\} may be used to remove any special
+meaning for the next character read and for line continuation.
+If no names are supplied, the line read is assigned to the
+variable @env{REPLY}.
+The return code is zero, unless end-of-file is encountered, @code{read}
+times out, or an invalid file descriptor is supplied as the argument to
+@option{-u}.
+Options, if supplied, have the following meanings:
+
+@table @code
+@item -a @var{aname}
+The words are assigned to sequential indices of the array variable
+@var{aname}, starting at 0.
+All elements are removed from @var{aname} before the assignment.
+Other @var{name} arguments are ignored.
+
+@item -d @var{delim}
+The first character of @var{delim} is used to terminate the input line,
+rather than newline.
+
+@item -e
+Readline (@pxref{Command Line Editing}) is used to obtain the line.
+
+@item -n @var{nchars}
+@code{read} returns after reading @var{nchars} characters rather than
+waiting for a complete line of input.
+
+@item -p @var{prompt}
+Display @var{prompt}, without a trailing newline, before attempting
+to read any input.
+The prompt is displayed only if input is coming from a terminal.
+
+@item -r
+If this option is given, backslash does not act as an escape character.
+The backslash is considered to be part of the line.
+In particular, a backslash-newline pair may not be used as a line
+continuation.
+
+@item -s
+Silent mode.  If input is coming from a terminal, characters are
+not echoed.
+
+@item -t @var{timeout}
+Cause @code{read} to time out and return failure if a complete line of
+input is not read within @var{timeout} seconds.
+This option has no effect if @code{read} is not reading input from the
+terminal or a pipe.
+
+@item -u @var{fd}
+Read input from file descriptor @var{fd}.
+
+@end table
+
+@item shopt
+@btindex shopt
+@example
+shopt [-pqsu] [-o] [@var{optname} @dots{}]
+@end example
+Toggle the values of variables controlling optional shell behavior.
+With no options, or with the @option{-p} option, a list of all settable
+options is displayed, with an indication of whether or not each is set.
+The @option{-p} option causes output to be displayed in a form that
+may be reused as input.
+Other options have the following meanings:
+
+@table @code
+@item -s
+Enable (set) each @var{optname}.
+
+@item -u
+Disable (unset) each @var{optname}.
+
+@item -q
+Suppresses normal output; the return status
+indicates whether the @var{optname} is set or unset.
+If multiple @var{optname} arguments are given with @option{-q},
+the return status is zero if all @var{optnames} are enabled;
+non-zero otherwise.
+
+@item -o
+Restricts the values of
+@var{optname} to be those defined for the @option{-o} option to the
+@code{set} builtin (@pxref{The Set Builtin}).
+@end table
+
+If either @option{-s} or @option{-u}
+is used with no @var{optname} arguments, the display is limited to
+those options which are set or unset, respectively.
+
+Unless otherwise noted, the @code{shopt} options are disabled (off)
+by default.
+
+The return status when listing options is zero if all @var{optnames}
+are enabled, non-zero otherwise.  When setting or unsetting options,
+the return status is zero unless an @var{optname} is not a valid shell
+option.
+
+The list of @code{shopt} options is:
+@table @code
+@item cdable_vars
+If this is set, an argument to the @code{cd}
+builtin command that
+is not a directory is assumed to be the name of a variable whose
+value is the directory to change to.
+
+@item cdspell
+If set, minor errors in the spelling of a directory component in a
+@code{cd} command will be corrected.
+The errors checked for are transposed characters,
+a missing character, and a character too many.
+If a correction is found, the corrected path is printed,
+and the command proceeds.
+This option is only used by interactive shells.
+
+@item checkhash
+If this is set, Bash checks that a command found in the hash
+table exists before trying to execute it.  If a hashed command no
+longer exists, a normal path search is performed.
+
+@item checkwinsize
+If set, Bash checks the window size after each command
+and, if necessary, updates the values of    
+@env{LINES} and @env{COLUMNS}.
+
+@item cmdhist
+If set, Bash
+attempts to save all lines of a multiple-line
+command in the same history entry.  This allows
+easy re-editing of multi-line commands.
+
+@item dotglob
+If set, Bash includes filenames beginning with a `.' in
+the results of filename expansion.
+
+@item execfail
+If this is set, a non-interactive shell will not exit if
+it cannot execute the file specified as an argument to the @code{exec}
+builtin command.  An interactive shell does not exit if @code{exec}
+fails.
+
+@item expand_aliases
+If set, aliases are expanded as described below under Aliases,
+@ref{Aliases}.
+This option is enabled by default for interactive shells.
+
+@item extdebug
+If set, behavior intended for use by debuggers is enabled:
+
+@enumerate
+@item
+The @option{-F} option to the @code{declare} builtin (@pxref{Bash Builtins})
+displays the source file name and line number corresponding to each function
+name supplied as an argument.
+
+@item
+If the command run by the @code{DEBUG} trap returns a non-zero value, the
+next command is skipped and not executed.
+
+@item
+If the command run by the @code{DEBUG} trap returns a value of 2, and the
+shell is executing in a subroutine (a shell function or a shell script
+executed by the @code{.} or @code{source} builtins), a call to
+@code{return} is simulated.
+@end enumerate
+
+@item extglob
+If set, the extended pattern matching features described above
+(@pxref{Pattern Matching}) are enabled.
+
+@item extquote
+If set, @code{$'@var{string}'} and @code{$"@var{string}"} quoting is  
+performed within @code{$@{@var{parameter}@}} expansions                     
+enclosed in double quotes.  This option is enabled by default. 
+
+@item histappend
+If set, the history list is appended to the file named by the value
+of the @env{HISTFILE}
+variable when the shell exits, rather than overwriting the file.
+
+@item histreedit
+If set, and Readline
+is being used, a user is given the opportunity to re-edit a
+failed history substitution.
+
+@item histverify
+If set, and Readline
+is being used, the results of history substitution are not immediately
+passed to the shell parser.  Instead, the resulting line is loaded into
+the Readline editing buffer, allowing further modification.
+
+@item hostcomplete
+If set, and Readline is being used, Bash will attempt to perform
+hostname completion when a word containing a @samp{@@} is being
+completed (@pxref{Commands For Completion}).  This option is enabled
+by default.
+
+@item huponexit
+If set, Bash will send @code{SIGHUP} to all jobs when an interactive
+login shell exits (@pxref{Signals}).
+
+@item interactive_comments
+Allow a word beginning with @samp{#}
+to cause that word and all remaining characters on that
+line to be ignored in an interactive shell.
+This option is enabled by default.
+
+@item lithist
+If enabled, and the @code{cmdhist}
+option is enabled, multi-line commands are saved to the history with
+embedded newlines rather than using semicolon separators where possible.
+
+@item login_shell
+The shell sets this option if it is started as a login shell
+(@pxref{Invoking Bash}).
+The value may not be changed.
+
+@item mailwarn
+If set, and a file that Bash is checking for mail has been  
+accessed since the last time it was checked, the message
+@code{"The mail in @var{mailfile} has been read"} is displayed.
+
+@item no_empty_cmd_completion
+If set, and Readline is being used, Bash will not attempt to search
+the @env{PATH} for possible completions when completion is attempted
+on an empty line.
+
+@item nocaseglob
+If set, Bash matches filenames in a case-insensitive fashion when
+performing filename expansion.
+
+@item nullglob
+If set, Bash allows filename patterns which match no
+files to expand to a null string, rather than themselves.
+
+@item progcomp
+If set, the programmable completion facilities
+(@pxref{Programmable Completion}) are enabled.
+This option is enabled by default.
+
+@item promptvars
+If set, prompt strings undergo variable and parameter expansion after
+being expanded (@pxref{Printing a Prompt}).
+This option is enabled by default.
+
+@item restricted_shell
+The shell sets this option if it is started in restricted mode
+(@pxref{The Restricted Shell}).
+The value may not be changed.
+This is not reset when the startup files are executed, allowing
+the startup files to discover whether or not a shell is restricted.
+
+@item shift_verbose
+If this is set, the @code{shift}
+builtin prints an error message when the shift count exceeds the
+number of positional parameters.
+
+@item sourcepath
+If set, the @code{source} builtin uses the value of @env{PATH}
+to find the directory containing the file supplied as an argument.
+This option is enabled by default.
+
+@item xpg_echo
+If set, the @code{echo} builtin expands backslash-escape sequences
+by default.
+
+@end table
+
+@noindent
+The return status when listing options is zero if all @var{optnames}
+are enabled, non-zero otherwise.
+When setting or unsetting options, the return status is zero unless an
+@var{optname} is not a valid shell option.
+
+@item source
+@btindex source
+@example
+source @var{filename}
+@end example
+A synonym for @code{.} (@pxref{Bourne Shell Builtins}).
+
+@item type
+@btindex type
+@example
+type [-afptP] [@var{name} @dots{}]
+@end example
+For each @var{name}, indicate how it would be interpreted if used as a
+command name.
+
+If the @option{-t} option is used, @code{type} prints a single word
+which is one of @samp{alias}, @samp{function}, @samp{builtin},
+@samp{file} or @samp{keyword},
+if @var{name} is an alias, shell function, shell builtin,
+disk file, or shell reserved word, respectively.
+If the @var{name} is not found, then nothing is printed, and
+@code{type} returns a failure status.
+
+If the @option{-p} option is used, @code{type} either returns the name
+of the disk file that would be executed, or nothing if @option{-t}
+would not return @samp{file}.
+
+The @option{-P} option forces a path search for each @var{name}, even if
+@option{-t} would not return @samp{file}.
+
+If a command is hashed, @option{-p} and @option{-P} print the hashed value,
+not necessarily the file that appears first in @code{$PATH}.
+
+If the @option{-a} option is used, @code{type} returns all of the places
+that contain an executable named @var{file}.
+This includes aliases and functions, if and only if the @option{-p} option
+is not also used.
+
+If the @option{-f} option is used, @code{type} does not attempt to find
+shell functions, as with the @code{command} builtin.
+
+The return status is zero if any of the @var{names} are found, non-zero
+if none are found.
+
+@item typeset
+@btindex typeset
+@example
+typeset [-afFrxi] [-p] [@var{name}[=@var{value}] @dots{}]
+@end example
+The @code{typeset} command is supplied for compatibility with the Korn
+shell; however, it has been deprecated in favor of the @code{declare}
+builtin command.
+
+@item ulimit
+@btindex ulimit
+@example
+ulimit [-acdflmnpstuvSH] [@var{limit}]
+@end example
+@code{ulimit} provides control over the resources available to processes
+started by the shell, on systems that allow such control.  If an
+option is given, it is interpreted as follows:
+@table @code
+@item -S
+Change and report the soft limit associated with a resource.
+
+@item -H
+Change and report the hard limit associated with a resource.
+
+@item -a
+All current limits are reported.
+
+@item -c
+The maximum size of core files created.
+
+@item -d
+The maximum size of a process's data segment.
+
+@item -f
+The maximum size of files created by the shell.
+
+@item -l
+The maximum size that may be locked into memory.
+
+@item -m
+The maximum resident set size.
+
+@item -n
+The maximum number of open file descriptors.
+
+@item -p
+The pipe buffer size.
+
+@item -s
+The maximum stack size.
+
+@item -t
+The maximum amount of cpu time in seconds.
+
+@item -u
+The maximum number of processes available to a single user.
+
+@item -v
+The maximum amount of virtual memory available to the process.
+
+@end table
+
+If @var{limit} is given, it is the new value of the specified resource;
+the special @var{limit} values @code{hard}, @code{soft}, and
+@code{unlimited} stand for the current hard limit, the current soft limit,
+and no limit, respectively.
+Otherwise, the current value of the soft limit for the specified resource
+is printed, unless the @option{-H} option is supplied.
+When setting new limits, if neither @option{-H} nor @option{-S} is supplied,
+both the hard and soft limits are set.
+If no option is given, then @option{-f} is assumed.  Values are in 1024-byte
+increments, except for @option{-t}, which is in seconds, @option{-p},
+which is in units of 512-byte blocks, and @option{-n} and @option{-u}, which
+are unscaled values.
+
+The return status is zero unless an invalid option or argument is supplied,
+or an error occurs while setting a new limit.
+
+@item unalias
+@btindex unalias
+@example
+unalias [-a] [@var{name} @dots{} ]
+@end example
+
+Remove each @var{name} from the list of aliases.  If @option{-a} is
+supplied, all aliases are removed.
+Aliases are described in @ref{Aliases}.
+
+@end table
+
+@node The Set Builtin
+@section The Set Builtin
+
+This builtin is so complicated that it deserves its own section.
+
+@table @code
+@item set
+@btindex set
+@example
+set [--abefhkmnptuvxBCHP] [-o @var{option}] [@var{argument} @dots{}]
+@end example
+
+If no options or arguments are supplied, @code{set} displays the names
+and values of all shell variables and functions, sorted according to the
+current locale, in a format that may be reused as input.
+
+When options are supplied, they set or unset shell attributes.
+Options, if specified, have the following meanings:
+
+@table @code
+@item -a
+Mark variables and function which are modified or created for export
+to the environment of subsequent commands.
+
+@item -b
+Cause the status of terminated background jobs to be reported
+immediately, rather than before printing the next primary prompt.
+
+@item -e
+Exit immediately if a simple command (@pxref{Simple Commands}) exits
+with a non-zero status, unless the command that fails is part of the
+command list immediately following a @code{while} or @code{until}
+keyword, part of the test in an @code{if} statement,
+part of a @code{&&} or @code{||} list, or if the command's return
+status is being inverted using @code{!}.
+A trap on @code{ERR}, if set, is executed before the shell exits.
+
+@item -f
+Disable file name generation (globbing).
+
+@item -h
+Locate and remember (hash) commands as they are looked up for execution.
+This option is enabled by default.
+
+@item -k
+All arguments in the form of assignment statements are placed
+in the environment for a command, not just those that precede
+the command name.
+
+@item -m
+Job control is enabled (@pxref{Job Control}).
+
+@item -n
+Read commands but do not execute them; this may be used to check a
+script for syntax errors.
+This option is ignored by interactive shells.
+
+@item -o @var{option-name}
+
+Set the option corresponding to @var{option-name}:
+
+@table @code
+@item allexport
+Same as @code{-a}.
+
+@item braceexpand
+Same as @code{-B}.
+
+@item emacs
+Use an @code{emacs}-style line editing interface (@pxref{Command Line Editing}).
+
+@item errexit
+Same as @code{-e}.
+
+@item errtrace
+Same as @code{-E}.
+
+@item functrace
+Same as @code{-T}.
+
+@item hashall
+Same as @code{-h}.
+
+@item histexpand
+Same as @code{-H}.
+
+@item history
+Enable command history, as described in @ref{Bash History Facilities}.
+This option is on by default in interactive shells.
+
+@item ignoreeof
+An interactive shell will not exit upon reading EOF.
+
+@item keyword
+Same as @code{-k}.
+
+@item monitor
+Same as @code{-m}.
+
+@item noclobber
+Same as @code{-C}.
+
+@item noexec
+Same as @code{-n}.
+
+@item noglob
+Same as @code{-f}.
+
+@item nolog
+Currently ignored.
+
+@item notify
+Same as @code{-b}.
+
+@item nounset
+Same as @code{-u}.
+
+@item onecmd
+Same as @code{-t}.
+
+@item physical
+Same as @code{-P}.
+
+@item posix
+Change the behavior of Bash where the default operation differs
+from the @sc{posix} 1003.2 standard to match the standard
+(@pxref{Bash POSIX Mode}).
+This is intended to make Bash behave as a strict superset of that
+standard.
+
+@item privileged
+Same as @code{-p}.
+
+@item verbose
+Same as @code{-v}.
+
+@item vi
+Use a @code{vi}-style line editing interface.
+
+@item xtrace
+Same as @code{-x}.
+@end table
+
+@item -p
+Turn on privileged mode.
+In this mode, the @env{$BASH_ENV} and @env{$ENV} files are not
+processed, shell functions are not inherited from the environment,
+and the @env{SHELLOPTS} variable, if it appears in the environment,
+is ignored.
+If the shell is started with the effective user (group) id not equal to the
+real user (group) id, and the @code{-p} option is not supplied, these actions
+are taken and the effective user id is set to the real user id.
+If the @code{-p} option is supplied at startup, the effective user id is
+not reset.
+Turning this option off causes the effective user
+and group ids to be set to the real user and group ids.
+
+@item -t
+Exit after reading and executing one command.
+
+@item -u
+Treat unset variables as an error when performing parameter expansion.
+An error message will be written to the standard error, and a non-interactive
+shell will exit.
+
+@item -v
+Print shell input lines as they are read.
+
+@item -x
+Print a trace of simple commands, \fBfor\fP commands, \fBcase\fP
+commands, \fBselect\fP commands, and arithmetic \fBfor\fP commands
+and their arguments or associated word lists after they are
+expanded and before they are executed.  The value of the @env{PS4}
+variable is expanded and the resultant value is printed before
+the command and its expanded arguments.
+
+@item -B
+The shell will perform brace expansion (@pxref{Brace Expansion}).
+This option is on by default.
+
+@item -C
+Prevent output redirection using @samp{>}, @samp{>&}, and @samp{<>}
+from overwriting existing files.
+
+@item -E
+If set, any trap on @code{ERR} is inherited by shell functions, command
+substitutions, and commands executed in a subshell environment.
+The @code{ERR} trap is normally not inherited in such cases.
+
+@item -H
+Enable @samp{!} style history substitution (@pxref{History Interaction}).
+This option is on by default for interactive shells.
+
+@item -P
+If set, do not follow symbolic links when performing commands such as
+@code{cd} which change the current directory.  The physical directory
+is used instead.  By default, Bash follows
+the logical chain of directories when performing commands
+which change the current directory.
+
+For example, if @file{/usr/sys} is a symbolic link to @file{/usr/local/sys}
+then:
+@example
+$ cd /usr/sys; echo $PWD
+/usr/sys
+$ cd ..; pwd
+/usr
+@end example
+
+@noindent
+If @code{set -P} is on, then:
+@example
+$ cd /usr/sys; echo $PWD
+/usr/local/sys
+$ cd ..; pwd
+/usr/local
+@end example
+
+@item -T
+If set, any trap on @code{DEBUG} is inherited by shell functions, command
+substitutions, and commands executed in a subshell environment.
+The @code{DEBUG} trap is normally not inherited in such cases.
+
+@item --
+If no arguments follow this option, then the positional parameters are
+unset.  Otherwise, the positional parameters are set to the
+@var{arguments}, even if some of them begin with a @samp{-}.
+
+@item -
+Signal the end of options, cause all remaining @var{arguments}
+to be assigned to the positional parameters.  The @option{-x}
+and @option{-v}  options are turned off.
+If there are no arguments, the positional parameters remain unchanged.
+@end table
+
+Using @samp{+} rather than @samp{-} causes these options to be
+turned off.  The options can also be used upon invocation of the
+shell.  The current set of options may be found in @code{$-}.
+
+The remaining N @var{arguments} are positional parameters and are
+assigned, in order, to @code{$1}, @code{$2}, @dots{}  @code{$N}.
+The special parameter @code{#} is set to N.
+
+The return status is always zero unless an invalid option is supplied.
+@end table
+
+@node Special Builtins
+@section Special Builtins
+@cindex special builtin
+
+For historical reasons, the @sc{posix} 1003.2 standard has classified
+several builtin commands as @emph{special}.
+When Bash is executing in @sc{posix} mode, the special builtins
+differ from other builtin commands in three respects:
+
+@enumerate
+@item
+Special builtins are found before shell functions during command lookup.
+
+@item
+If a special builtin returns an error status, a non-interactive shell exits.
+
+@item
+Assignment statements preceding the command stay in effect in the shell
+environment after the command completes.
+@end enumerate
+
+When Bash is not executing in @sc{posix} mode, these builtins behave no
+differently than the rest of the Bash builtin commands.
+The Bash @sc{posix} mode is described in @ref{Bash POSIX Mode}. 
+
+These are the @sc{posix} special builtins:
+@example
+@w{break : . continue eval exec exit export readonly return set}
+@w{shift trap unset}
+@end example
+
+@node Shell Variables
+@chapter Shell Variables
+
+@menu
+* Bourne Shell Variables::     Variables which Bash uses in the same way
+                               as the Bourne Shell.
+* Bash Variables::             List of variables that exist in Bash.
+@end menu
+
+This chapter describes the shell variables that Bash uses.
+Bash automatically assigns default values to a number of variables.
+
+@node Bourne Shell Variables
+@section Bourne Shell Variables
+
+Bash uses certain shell variables in the same way as the Bourne shell.
+In some cases, Bash assigns a default value to the variable.
+
+@vtable @code
+
+@item CDPATH
+A colon-separated list of directories used as a search path for
+the @code{cd} builtin command.
+
+@item HOME
+The current user's home directory; the default for the @code{cd} builtin
+command.
+The value of this variable is also used by tilde expansion
+(@pxref{Tilde Expansion}).
+
+@item IFS
+A list of characters that separate fields; used when the shell splits
+words as part of expansion.
+
+@item MAIL
+If this parameter is set to a filename and the @env{MAILPATH} variable
+is not set, Bash informs the user of the arrival of mail in
+the specified file.
+
+@item MAILPATH
+A colon-separated list of filenames which the shell periodically checks
+for new mail.
+Each list entry can specify the message that is printed when new mail
+arrives in the mail file by separating the file name from the message with
+a @samp{?}.
+When used in the text of the message, @code{$_} expands to the name of
+the current mail file.
+
+@item OPTARG
+The value of the last option argument processed by the @code{getopts} builtin.
+
+@item OPTIND
+The index of the last option argument processed by the @code{getopts} builtin.
+
+@item PATH
+A colon-separated list of directories in which the shell looks for
+commands.
+A zero-length (null) directory name in the value of @code{PATH} indicates the
+current directory.
+A null directory name may appear as two adjacent colons, or as an initial
+or trailing colon.
+
+
+@item PS1
+The primary prompt string.  The default value is @samp{\s-\v\$ }.
+@xref{Printing a Prompt}, for the complete list of escape
+sequences that are expanded before @env{PS1} is displayed.
+
+@item PS2
+The secondary prompt string.  The default value is @samp{> }.
+
+@end vtable
+
+@node Bash Variables
+@section Bash Variables
+
+These variables are set or used by Bash, but other shells
+do not normally treat them specially.
+
+A few variables used by Bash are described in different chapters:
+variables for controlling the job control facilities
+(@pxref{Job Control Variables}).
+
+@vtable @code
+
+@item BASH
+The full pathname used to execute the current instance of Bash.
+
+@item BASH_ARGC
+An array variable whose values are the number of parameters in each
+frame of the current bash execution call stack.  The number of
+parameters to the current subroutine (shell function or script executed
+with @code{.} or @code{source}) is at the top of the stack.  When a
+subroutine is executed, the number of parameters passed is pushed onto
+@code{BASH_ARGC}.
+
+@item BASH_ARGV
+An array variable containing all of the parameters in the current bash
+execution call stack.  The final parameter of the last subroutine call
+is at the top of the stack; the first parameter of the initial call is
+at the bottom.  When a subroutine is executed, the parameters supplied
+are pushed onto @code{BASH_ARGV}.
+
+@item BASH_COMMAND
+The command currently being executed or about to be executed, unless the
+shell is executing a command as the result of a trap,
+in which case it is the command executing at the time of the trap.
+
+@item BASH_ENV
+If this variable is set when Bash is invoked to execute a shell
+script, its value is expanded and used as the name of a startup file
+to read before executing the script.  @xref{Bash Startup Files}.
+
+@item BASH_EXECUTION_STRING
+The command argument to the @option{-c} invocation option.
+
+@item BASH_LINENO
+An array variable whose members are the line numbers in source files
+corresponding to each member of @var{FUNCNAME}.
+@code{$@{BASH_LINENO[$i]@}} is the line number in the source file where
+@code{$@{FUNCNAME[$i + 1]@}} was called.
+The corresponding source file name is @code{$@{BASH_SOURCE[$i + 1]@}}.
+Use @code{LINENO} to obtain the current line number.
+
+@item BASH_SOURCE
+An array variable whose members are the source filenames corresponding
+to the elements in the @code{FUNCNAME} array variable.
+
+@item BASH_SUBSHELL
+Incremented by one each time a subshell or subshell environment is spawned.
+The initial value is 0.
+
+@item BASH_VERSINFO
+A readonly array variable (@pxref{Arrays})
+whose members hold version information for this instance of Bash.
+The values assigned to the array members are as follows:
+
+@table @code
+
+@item BASH_VERSINFO[0]
+The major version number (the @var{release}).
+
+@item BASH_VERSINFO[1]
+The minor version number (the @var{version}).
+
+@item BASH_VERSINFO[2]
+The patch level.
+
+@item BASH_VERSINFO[3]
+The build version.
+
+@item BASH_VERSINFO[4]
+The release status (e.g., @var{beta1}).
+
+@item BASH_VERSINFO[5]
+The value of @env{MACHTYPE}.
+
+@end table
+
+@item BASH_VERSION
+The version number of the current instance of Bash.
+
+@item COLUMNS
+Used by the @code{select} builtin command to determine the terminal width
+when printing selection lists.  Automatically set upon receipt of a
+@code{SIGWINCH}.
+
+@item COMP_CWORD
+An index into @env{$@{COMP_WORDS@}} of the word containing the current
+cursor position.
+This variable is available only in shell functions invoked by the
+programmable completion facilities (@pxref{Programmable Completion}).
+
+@item COMP_LINE
+The current command line.
+This variable is available only in shell functions and external
+commands invoked by the
+programmable completion facilities (@pxref{Programmable Completion}).
+
+@item COMP_POINT
+The index of the current cursor position relative to the beginning of
+the current command.
+If the current cursor position is at the end of the current command,
+the value of this variable is equal to @code{$@{#COMP_LINE@}}.
+This variable is available only in shell functions and external
+commands invoked by the
+programmable completion facilities (@pxref{Programmable Completion}).
+
+@item COMP_WORDBREAKS
+The set of characters that the Readline library treats as word
+separators when performing word completion.
+If @code{COMP_WORDBREAKS} is unset, it loses its special properties,
+even if it is subsequently reset.
+
+@item COMP_WORDS
+An array variable consisting of the individual
+words in the current command line.
+This variable is available only in shell functions invoked by the
+programmable completion facilities (@pxref{Programmable Completion}).
+
+@item COMPREPLY
+An array variable from which Bash reads the possible completions
+generated by a shell function invoked by the programmable completion
+facility (@pxref{Programmable Completion}).
+
+@item DIRSTACK
+An array variable containing the current contents of the directory stack.
+Directories appear in the stack in the order they are displayed by the
+@code{dirs} builtin.
+Assigning to members of this array variable may be used to modify
+directories already in the stack, but the @code{pushd} and @code{popd}
+builtins must be used to add and remove directories.
+Assignment to this variable will not change the current directory.
+If @env{DIRSTACK} is unset, it loses its special properties, even if
+it is subsequently reset.
+
+@item EMACS
+If Bash finds this variable in the environment when the shell
+starts with value @samp{t}, it assumes that the shell is running in an
+emacs shell buffer and disables line editing.
+
+@item EUID
+The numeric effective user id of the current user.  This variable
+is readonly.
+
+@item FCEDIT
+The editor used as a default by the @option{-e} option to the @code{fc}
+builtin command.
+
+@item FIGNORE
+A colon-separated list of suffixes to ignore when performing
+filename completion.
+A file name whose suffix matches one of the entries in 
+@env{FIGNORE}
+is excluded from the list of matched file names.  A sample
+value is @samp{.o:~}
+
+@item FUNCNAME
+An array variable containing the names of all shell functions
+currently in the execution call stack.
+The element with index 0 is the name of any currently-executing
+shell function.
+The bottom-most element is "main".
+This variable exists only when a shell function is executing.
+Assignments to @env{FUNCNAME} have no effect and return an error status.
+If @env{FUNCNAME} is unset, it loses its special properties, even if
+it is subsequently reset.
+
+@item GLOBIGNORE
+A colon-separated list of patterns defining the set of filenames to
+be ignored by filename expansion.
+If a filename matched by a filename expansion pattern also matches one
+of the patterns in @env{GLOBIGNORE}, it is removed from the list
+of matches.
+
+@item GROUPS
+An array variable containing the list of groups of which the current    
+user is a member.
+Assignments to @env{GROUPS} have no effect and return an error status.
+If @env{GROUPS} is unset, it loses its special properties, even if it is
+subsequently reset.
+
+@item histchars
+Up to three characters which control history expansion, quick
+substitution, and tokenization (@pxref{History Interaction}).
+The first character is the
+@var{history expansion} character, that is, the character which signifies the
+start of a history expansion, normally @samp{!}.  The second character is the
+character which signifies `quick substitution' when seen as the first
+character on a line, normally @samp{^}.  The optional third character is the
+character which indicates that the remainder of the line is a comment when
+found as the first character of a word, usually @samp{#}.  The history
+comment character causes history substitution to be skipped for the
+remaining words on the line.  It does not necessarily cause the shell
+parser to treat the rest of the line as a comment.
+
+@item HISTCMD
+The history number, or index in the history list, of the current
+command.  If @env{HISTCMD} is unset, it loses its special properties,
+even if it is subsequently reset.
+
+@item HISTCONTROL
+A colon-separated list of values controlling how commands are saved on
+the history list.
+If the list of values includes @samp{ignorespace}, lines which begin
+with a space character are not saved in the history list.
+A value of @samp{ignoredups} causes lines which match the previous
+history entry to not be saved.
+A value of @samp{ignoreboth} is shorthand for
+@samp{ignorespace} and @samp{ignoredups}.
+A value of @samp{erasedups} causes all previous lines matching the
+current line to be removed from the history list before that line
+is saved.
+Any value not in the above list is ignored.
+If @env{HISTCONTROL} is unset, or does not include a valid value, 
+all lines read by the shell parser are saved on the history list, 
+subject to the value of @env{HISTIGNORE}.
+The second and subsequent lines of a multi-line compound command are
+not tested, and are added to the history regardless of the value of
+@env{HISTCONTROL}.
+
+@item HISTFILE
+The name of the file to which the command history is saved.  The
+default value is @file{~/.bash_history}.
+
+@item HISTFILESIZE
+The maximum number of lines contained in the history file.  When this
+variable is assigned a value, the history file is truncated, if
+necessary, to contain no more than that number of lines.
+The history file is also truncated to this size after
+writing it when an interactive shell exits.
+The default value is 500.
+
+@item HISTIGNORE
+A colon-separated list of patterns used to decide which command
+lines should be saved on the history list.  Each pattern is
+anchored at the beginning of the line and must match the complete
+line (no implicit @samp{*} is appended).  Each pattern is tested
+against the line after the checks specified by @env{HISTCONTROL}
+are applied.  In addition to the normal shell pattern matching
+characters, @samp{&} matches the previous history line.  @samp{&}
+may be escaped using a backslash; the backslash is removed
+before attempting a match. 
+The second and subsequent lines of a multi-line compound command are
+not tested, and are added to the history regardless of the value of
+@env{HISTIGNORE}.
+
+@env{HISTIGNORE} subsumes the function of @env{HISTCONTROL}.  A
+pattern of @samp{&} is identical to @code{ignoredups}, and a
+pattern of @samp{[ ]*} is identical to @code{ignorespace}. 
+Combining these two patterns, separating them with a colon,
+provides the functionality of @code{ignoreboth}. 
+
+@item HISTSIZE
+The maximum number of commands to remember on the history list.
+The default value is 500.
+
+@item HOSTFILE
+Contains the name of a file in the same format as @file{/etc/hosts} that
+should be read when the shell needs to complete a hostname.
+The list of possible hostname completions may be changed while the shell
+is running;
+the next time hostname completion is attempted after the
+value is changed, Bash adds the contents of the new file to the
+existing list.
+If @env{HOSTFILE} is set, but has no value, Bash attempts to read 
+@file{/etc/hosts} to obtain the list of possible hostname completions.
+When @env{HOSTFILE} is unset, the hostname list is cleared.
+
+@item HOSTNAME
+The name of the current host.
+
+@item HOSTTYPE
+A string describing the machine Bash is running on.
+
+@item IGNOREEOF
+Controls the action of the shell on receipt of an @code{EOF} character
+as the sole input.  If set, the value denotes the number
+of consecutive @code{EOF} characters that can be read as the
+first character on an input line
+before the shell will exit.  If the variable exists but does not
+have a numeric value (or has no value) then the default is 10.
+If the variable does not exist, then @code{EOF} signifies the end of 
+input to the shell.  This is only in effect for interactive shells.
+
+@item INPUTRC
+The name of the Readline initialization file, overriding the default
+of @file{~/.inputrc}.
+
+@item LANG  
+Used to determine the locale category for any category not specifically
+selected with a variable starting with @code{LC_}.
+
+@item LC_ALL
+This variable overrides the value of @env{LANG} and any other
+@code{LC_} variable specifying a locale category.
+
+@item LC_COLLATE
+This variable determines the collation order used when sorting the
+results of filename expansion, and
+determines the behavior of range expressions, equivalence classes,
+and collating sequences within filename expansion and pattern matching
+(@pxref{Filename Expansion}).
+
+@item LC_CTYPE
+This variable determines the interpretation of characters and the
+behavior of character classes within filename expansion and pattern
+matching (@pxref{Filename Expansion}).
+
+@item LC_MESSAGES
+This variable determines the locale used to translate double-quoted
+strings preceded by a @samp{$} (@pxref{Locale Translation}).
+
+@item LC_NUMERIC
+This variable determines the locale category used for number formatting.
+
+@item LINENO
+The line number in the script or shell function currently executing.
+
+@item LINES
+Used by the @code{select} builtin command to determine the column length
+for printing selection lists.  Automatically set upon receipt of a
+@code{SIGWINCH}.
+
+@item MACHTYPE
+A string that fully describes the system type on which Bash
+is executing, in the standard @sc{gnu} @var{cpu-company-system} format.
+
+@item MAILCHECK
+How often (in seconds) that the shell should check for mail in the
+files specified in the @env{MAILPATH} or @env{MAIL} variables.
+The default is 60 seconds.  When it is time to check
+for mail, the shell does so before displaying the primary prompt.
+If this variable is unset, or set to a value that is not a number
+greater than or equal to zero, the shell disables mail checking.
+
+@item OLDPWD
+The previous working directory as set by the @code{cd} builtin.
+
+@item OPTERR
+If set to the value 1, Bash displays error messages
+generated by the @code{getopts} builtin command.
+
+@item OSTYPE
+A string describing the operating system Bash is running on.
+
+@item PIPESTATUS
+An array variable (@pxref{Arrays})
+containing a list of exit status values from the processes
+in the most-recently-executed foreground pipeline (which may
+contain only a single command).
+
+@item POSIXLY_CORRECT
+If this variable is in the environment when @code{bash} starts, the shell
+enters @sc{posix} mode (@pxref{Bash POSIX Mode}) before reading the
+startup files, as if the @option{--posix} invocation option had been supplied.
+If it is set while the shell is running, @code{bash} enables @sc{posix} mode,
+as if the command
+@example
+@code{set -o posix}
+@end example
+@noindent
+had been executed.  
+
+@item PPID
+The process @sc{id} of the shell's parent process.  This variable
+is readonly.
+
+@item PROMPT_COMMAND
+If set, the value is interpreted as a command to execute
+before the printing of each primary prompt (@env{$PS1}).
+
+@item PS3
+The value of this variable is used as the prompt for the
+@code{select} command.  If this variable is not set, the
+@code{select} command prompts with @samp{#? }
+
+@item PS4
+The value is the prompt printed before the command line is echoed
+when the @option{-x} option is set (@pxref{The Set Builtin}).
+The first character of @env{PS4} is replicated multiple times, as
+necessary, to indicate multiple levels of indirection.
+The default is @samp{+ }.
+
+@item PWD
+The current working directory as set by the @code{cd} builtin.
+
+@item RANDOM
+Each time this parameter is referenced, a random integer
+between 0 and 32767 is generated.  Assigning a value to this
+variable seeds the random number generator.
+
+@item REPLY
+The default variable for the @code{read} builtin.
+
+@item SECONDS
+This variable expands to the number of seconds since the
+shell was started.  Assignment to this variable resets
+the count to the value assigned, and the expanded value
+becomes the value assigned plus the number of seconds
+since the assignment.
+
+@item SHELLOPTS
+A colon-separated list of enabled shell options.  Each word in
+the list is a valid argument for the @option{-o} option to the
+@code{set} builtin command (@pxref{The Set Builtin}).
+The options appearing in @env{SHELLOPTS} are those reported
+as @samp{on} by @samp{set -o}.
+If this variable is in the environment when Bash
+starts up, each shell option in the list will be enabled before
+reading any startup files.  This variable is readonly.
+
+@item SHLVL
+Incremented by one each time a new instance of Bash is started.  This is
+intended to be a count of how deeply your Bash shells are nested.
+
+@item TIMEFORMAT
+The value of this parameter is used as a format string specifying
+how the timing information for pipelines prefixed with the @code{time}
+reserved word should be displayed.
+The @samp{%} character introduces an
+escape sequence that is expanded to a time value or other
+information.
+The escape sequences and their meanings are as
+follows; the braces denote optional portions. 
+
+@table @code
+
+@item %%
+A literal @samp{%}.
+
+@item %[@var{p}][l]R
+The elapsed time in seconds. 
+
+@item %[@var{p}][l]U
+The number of CPU seconds spent in user mode. 
+
+@item %[@var{p}][l]S
+The number of CPU seconds spent in system mode. 
+
+@item %P
+The CPU percentage, computed as (%U + %S) / %R. 
+@end table
+
+The optional @var{p} is a digit specifying the precision, the number of
+fractional digits after a decimal point.
+A value of 0 causes no decimal point or fraction to be output.
+At most three places after the decimal point may be specified; values
+of @var{p} greater than 3 are changed to 3.
+If @var{p} is not specified, the value 3 is used. 
+
+The optional @code{l} specifies a longer format, including minutes, of
+the form @var{MM}m@var{SS}.@var{FF}s.
+The value of @var{p} determines whether or not the fraction is included. 
+
+If this variable is not set, Bash acts as if it had the value
+@example
+@code{$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'}
+@end example
+If the value is null, no timing information is displayed.
+A trailing newline is added when the format string is displayed.
+
+@item TMOUT
+If set to a value greater than zero, @code{TMOUT} is treated as the
+default timeout for the @code{read} builtin (@pxref{Bash Builtins}).
+The @code{select} command (@pxref{Conditional Constructs}) terminates
+if input does not arrive after @code{TMOUT} seconds when input is coming
+from a terminal.
+
+In an interative shell, the value is interpreted as
+the number of seconds to wait for input after issuing the primary
+prompt when the shell is interactive.
+Bash terminates after that number of seconds if input does
+not arrive.
+
+@item UID
+The numeric real user id of the current user.  This variable is readonly.
+
+@end vtable
+
+@node Bash Features
+@chapter Bash Features
+
+This section describes features unique to Bash.
+
+@menu
+* Invoking Bash::              Command line options that you can give
+                               to Bash.
+* Bash Startup Files::         When and how Bash executes scripts.
+* Interactive Shells::         What an interactive shell is.
+* Bash Conditional Expressions::       Primitives used in composing expressions for
+                               the @code{test} builtin.
+* Shell Arithmetic::           Arithmetic on shell variables.
+* Aliases::                    Substituting one command for another.
+* Arrays::                     Array Variables.
+* The Directory Stack::                History of visited directories.
+* Printing a Prompt::          Controlling the PS1 string.
+* The Restricted Shell::       A more controlled mode of shell execution.
+* Bash POSIX Mode::            Making Bash behave more closely to what
+                               the POSIX standard specifies.
+@end menu
+
+@node Invoking Bash
+@section Invoking Bash
+
+@example
+bash [long-opt] [-ir] [-abefhkmnptuvxdBCDHP] [-o @var{option}] [-O @var{shopt_option}] [@var{argument} @dots{}]
+bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o @var{option}] [-O @var{shopt_option}] -c @var{string} [@var{argument} @dots{}]
+bash [long-opt] -s [-abefhkmnptuvxdBCDHP] [-o @var{option}] [-O @var{shopt_option}] [@var{argument} @dots{}]
+@end example
+
+In addition to the single-character shell command-line options
+(@pxref{The Set Builtin}), there are several multi-character
+options that you can use.  These options must appear on the command
+line before the single-character options to be recognized. 
+
+@table @code
+@item --debugger
+Arrange for the debugger profile to be executed before the shell
+starts.  Turns on extended debugging mode (see @ref{Bash Builtins}
+for a description of the @code{extdebug} option to the @code{shopt}
+builtin) and shell function tracing
+(see @ref{The Set Builtin} for a description of the @code{-o functrace}
+option).
+
+@item --dump-po-strings
+A list of all double-quoted strings preceded by @samp{$}
+is printed on the standard ouput
+in the @sc{gnu} @code{gettext} PO (portable object) file format.
+Equivalent to @option{-D} except for the output format.
+
+@item --dump-strings
+Equivalent to @option{-D}.
+
+@item --help
+Display a usage message on standard output and exit sucessfully.
+
+@item --init-file @var{filename}
+@itemx --rcfile @var{filename}
+Execute commands from @var{filename} (instead of @file{~/.bashrc})
+in an interactive shell.
+
+@item --login
+Equivalent to @option{-l}.
+
+@item --noediting
+Do not use the @sc{gnu} Readline library (@pxref{Command Line Editing})
+to read  command lines when the shell is interactive.
+
+@item --noprofile
+Don't load the system-wide startup file @file{/etc/profile}
+or any of the personal initialization files
+@file{~/.bash_profile}, @file{~/.bash_login}, or @file{~/.profile}
+when Bash is invoked as a login shell.
+
+@item --norc
+Don't read the @file{~/.bashrc} initialization file in an
+interactive shell.  This is on by default if the shell is
+invoked as @code{sh}.
+
+@item --posix
+Change the behavior of Bash where the default operation differs
+from the @sc{posix} 1003.2 standard to match the standard.  This
+is intended to make Bash behave as a strict superset of that
+standard.  @xref{Bash POSIX Mode}, for a description of the Bash
+@sc{posix} mode.
+
+@item --restricted
+Make the shell a restricted shell (@pxref{The Restricted Shell}).
+
+@item --verbose
+Equivalent to @option{-v}.  Print shell input lines as they're read.
+
+@item --version
+Show version information for this instance of
+Bash on the standard output and exit successfully.
+
+@end table
+
+There are several single-character options that may be supplied at
+invocation which are not available with the @code{set} builtin.
+
+@table @code
+@item -c @var{string}
+Read and execute commands from @var{string} after processing the
+options, then exit.  Any remaining arguments are assigned to the
+positional parameters, starting with @code{$0}.
+
+@item -i
+Force the shell to run interactively.  Interactive shells are
+described in @ref{Interactive Shells}.
+
+@item -l
+Make this shell act as if it had been directly invoked by login.
+When the shell is interactive, this is equivalent to starting a
+login shell with @samp{exec -l bash}.
+When the shell is not interactive, the login shell startup files will
+be executed.
+@samp{exec bash -l} or @samp{exec bash --login}
+will replace the current shell with a Bash login shell.
+@xref{Bash Startup Files}, for a description of the special behavior
+of a login shell.
+
+@item -r
+Make the shell a restricted shell (@pxref{The Restricted Shell}).
+
+@item -s
+If this option is present, or if no arguments remain after option
+processing, then commands are read from the standard input.
+This option allows the positional parameters to be set
+when invoking an interactive shell.
+
+@item -D
+A list of all double-quoted strings preceded by @samp{$}
+is printed on the standard ouput.
+These are the strings that
+are subject to language translation when the current locale
+is not @code{C} or @code{POSIX} (@pxref{Locale Translation}).
+This implies the @option{-n} option; no commands will be executed.
+
+@item [-+]O [@var{shopt_option}]
+@var{shopt_option} is one of the shell options accepted by the
+@code{shopt} builtin (@pxref{Shell Builtin Commands}).
+If @var{shopt_option} is present, @option{-O} sets the value of that option;
+@option{+O} unsets it.  
+If @var{shopt_option} is not supplied, the names and values of the shell
+options accepted by @code{shopt} are printed on the standard output.
+If the invocation option is @option{+O}, the output is displayed in a format
+that may be reused as input.
+
+@item --
+A @code{--} signals the end of options and disables further option
+processing.
+Any arguments after the @code{--} are treated as filenames and arguments.
+
+@end table
+
+@cindex login shell
+A @emph{login} shell is one whose first character of argument zero is
+@samp{-}, or one invoked with the @option{--login} option.
+
+@cindex interactive shell
+An @emph{interactive} shell is one started without non-option arguments,
+unless @option{-s} is specified,
+without specifying the @option{-c} option, and whose input and output are both
+connected to terminals (as determined by @code{isatty(3)}), or one
+started with the @option{-i} option.  @xref{Interactive Shells}, for more
+information.
+
+If arguments remain after option processing, and neither the
+@option{-c} nor the @option{-s}
+option has been supplied, the first argument is assumed to
+be the name of a file containing shell commands (@pxref{Shell Scripts}).
+When Bash is invoked in this fashion, @code{$0}
+is set to the name of the file, and the positional parameters
+are set to the remaining arguments.
+Bash reads and executes commands from this file, then exits.   
+Bash's exit status is the exit status of the last command executed
+in the script.  If no commands are executed, the exit status is 0.
+
+@node Bash Startup Files
+@section Bash Startup Files
+@cindex startup files
+
+This section describs how Bash executes its startup files.
+If any of the files exist but cannot be read, Bash reports an error.
+Tildes are expanded in file names as described above under
+Tilde Expansion (@pxref{Tilde Expansion}).
+
+Interactive shells are described in @ref{Interactive Shells}.
+
+@subsubheading Invoked as an interactive login shell, or with @option{--login}
+
+When Bash is invoked as an interactive login shell, or as a
+non-interactive shell with the @option{--login} option, it first reads and
+executes commands from the file @file{/etc/profile}, if that file exists.
+After reading that file, it looks for @file{~/.bash_profile},
+@file{~/.bash_login}, and @file{~/.profile}, in that order, and reads
+and executes commands from the first one that exists and is readable.
+The @option{--noprofile} option may be used when the shell is started to
+inhibit this behavior.
+
+When a login shell exits, Bash reads and executes commands from
+the file @file{~/.bash_logout}, if it exists.
+
+@subsubheading Invoked as an interactive non-login shell
+
+When an interactive shell that is not a login shell is started, Bash
+reads and executes commands from @file{~/.bashrc}, if that file exists.
+This may be inhibited by using the @option{--norc} option.
+The @option{--rcfile @var{file}} option will force Bash to read and
+execute commands from @var{file} instead of @file{~/.bashrc}.
+
+So, typically, your @file{~/.bash_profile} contains the line
+@example
+@code{if [ -f ~/.bashrc ]; then . ~/.bashrc; fi}
+@end example
+@noindent
+after (or before) any login-specific initializations.
+
+@subsubheading Invoked non-interactively
+
+When Bash is started non-interactively, to run a shell script,
+for example, it looks for the variable @env{BASH_ENV} in the environment,
+expands its value if it appears there, and uses the expanded value as
+the name of a file to read and execute.  Bash behaves as if the
+following command were executed:
+@example
+@code{if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi}
+@end example
+@noindent
+but the value of the @env{PATH} variable is not used to search for the
+file name.
+
+As noted above, if a non-interactive shell is invoked with the
+@option{--login} option, Bash attempts to read and execute commands from the
+login shell startup files. 
+
+@subsubheading Invoked with name @code{sh}
+
+If Bash is invoked with the name @code{sh}, it tries to mimic the
+startup behavior of historical versions of @code{sh} as closely as
+possible, while conforming to the @sc{posix} standard as well.
+
+When invoked as an interactive login shell, or as a non-interactive
+shell with the @option{--login} option, it first attempts to read
+and execute commands from @file{/etc/profile} and @file{~/.profile}, in
+that order.
+The @option{--noprofile} option may be used to inhibit this behavior.
+When invoked as an interactive shell with the name @code{sh}, Bash
+looks for the variable @env{ENV}, expands its value if it is defined,
+and uses the expanded value as the name of a file to read and execute.
+Since a shell invoked as @code{sh} does not attempt to read and execute
+commands from any other startup files, the @option{--rcfile} option has
+no effect.
+A non-interactive shell invoked with the name @code{sh} does not attempt
+to read any other startup files.
+
+When invoked as @code{sh}, Bash enters @sc{posix} mode after
+the startup files are read.
+
+@subsubheading Invoked in @sc{posix} mode
+
+When Bash is started in @sc{posix} mode, as with the
+@option{--posix} command line option, it follows the @sc{posix} standard
+for startup files.
+In this mode, interactive shells expand the @env{ENV} variable
+and commands are read and executed from the file whose name is the
+expanded value.
+No other startup files are read.
+
+@subsubheading Invoked by remote shell daemon
+
+Bash attempts to determine when it is being run by the remote shell
+daemon, usually @code{rshd}.  If Bash determines it is being run by
+rshd, it reads and executes commands from @file{~/.bashrc}, if that
+file exists and is readable.
+It will not do this if invoked as @code{sh}.
+The @option{--norc} option may be used to inhibit this behavior, and the
+@option{--rcfile} option may be used to force another file to be read, but
+@code{rshd} does not generally invoke the shell with those options or
+allow them to be specified.
+
+@subsubheading Invoked with unequal effective and real @sc{uid/gid}s
+
+If Bash is started with the effective user (group) id not equal to the
+real user (group) id, and the @code{-p} option is not supplied, no startup
+files are read, shell functions are not inherited from the environment,
+the @env{SHELLOPTS} variable, if it appears in the environment, is ignored,
+and the effective user id is set to the real user id.
+If the @code{-p} option is supplied at invocation, the startup behavior is
+the same, but the effective user id is not reset.
+
+@node Interactive Shells
+@section Interactive Shells
+@cindex interactive shell
+@cindex shell, interactive
+
+@menu
+* What is an Interactive Shell?::      What determines whether a shell is Interactive.
+* Is this Shell Interactive?:: How to tell if a shell is interactive.
+* Interactive Shell Behavior:: What changes in a interactive shell?
+@end menu
+
+@node What is an Interactive Shell?
+@subsection What is an Interactive Shell?
+
+An interactive shell
+is one started without non-option arguments, unless @option{-s} is
+specified, without specifiying the @option{-c} option, and
+whose input and output are both
+connected to terminals (as determined by @code{isatty(3)}),
+or one started with the @option{-i} option.
+
+An interactive shell generally reads from and writes to a user's
+terminal.
+
+The @option{-s} invocation option may be used to set the positional parameters
+when an interactive shell is started.
+
+@node Is this Shell Interactive?
+@subsection Is this Shell Interactive?
+
+To determine within a startup script whether or not Bash is
+running interactively,
+test the value of the @samp{-} special parameter.
+It contains @code{i} when the shell is interactive.  For example:
+
+@example
+case "$-" in
+*i*)   echo This shell is interactive ;;
+*)     echo This shell is not interactive ;;
+esac
+@end example
+
+Alternatively, startup scripts may examine the variable
+@env{PS1}; it is unset in non-interactive shells, and set in
+interactive shells.  Thus:
+
+@example
+if [ -z "$PS1" ]; then
+        echo This shell is not interactive
+else
+        echo This shell is interactive
+fi
+@end example
+
+@node Interactive Shell Behavior
+@subsection Interactive Shell Behavior
+
+When the shell is running interactively, it changes its behavior in
+several ways.
+
+@enumerate
+@item
+Startup files are read and executed as described in @ref{Bash Startup Files}.
+
+@item
+Job Control (@pxref{Job Control}) is enabled by default.  When job
+control is in effect, Bash ignores the keyboard-generated job control
+signals @code{SIGTTIN}, @code{SIGTTOU}, and @code{SIGTSTP}.
+
+@item
+Bash expands and displays @env{PS1} before reading the first line
+of a command, and expands and displays @env{PS2} before reading the
+second and subsequent lines of a multi-line command.
+
+@item
+Bash executes the value of the @env{PROMPT_COMMAND} variable as a command
+before printing the primary prompt, @env{$PS1}
+(@pxref{Bash Variables}).
+
+@item
+Readline (@pxref{Command Line Editing}) is used to read commands from
+the user's terminal.
+
+@item
+Bash inspects the value of the @code{ignoreeof} option to @code{set -o}
+instead of exiting immediately when it receives an @code{EOF} on its
+standard input when reading a command (@pxref{The Set Builtin}).
+
+@item
+Command history (@pxref{Bash History Facilities})
+and history expansion (@pxref{History Interaction})
+are enabled by default.
+Bash will save the command history to the file named by @env{$HISTFILE}
+when an interactive shell exits.
+
+@item
+Alias expansion (@pxref{Aliases}) is performed by default.
+
+@item
+In the absence of any traps, Bash ignores @code{SIGTERM}
+(@pxref{Signals}).
+
+@item
+In the absence of any traps, @code{SIGINT} is caught and handled
+((@pxref{Signals}).
+@code{SIGINT} will interrupt some shell builtins.
+
+@item
+An interactive login shell sends a @code{SIGHUP} to all jobs on exit
+if the @code{hupoxexit} shell option has been enabled (@pxref{Signals}).
+
+@item
+The @option{-n} invocation option is ignored, and @samp{set -n} has
+no effect (@pxref{The Set Builtin}).
+
+@item
+Bash will check for mail periodically, depending on the values of the
+@env{MAIL}, @env{MAILPATH}, and @env{MAILCHECK} shell variables
+(@pxref{Bash Variables}).
+
+@item
+Expansion errors due to references to unbound shell variables after
+@samp{set -u} has been enabled will not cause the shell to exit
+(@pxref{The Set Builtin}).
+
+@item
+The shell will not exit on expansion errors caused by @var{var} being unset
+or null in @code{$@{@var{var}:?@var{word}@}} expansions
+(@pxref{Shell Parameter Expansion}).
+
+@item
+Redirection errors encountered by shell builtins will not cause the
+shell to exit.
+
+@item
+When running in @sc{posix} mode, a special builtin returning an error
+status will not cause the shell to exit (@pxref{Bash POSIX Mode}).
+@item
+A failed @code{exec} will not cause the shell to exit
+(@pxref{Bourne Shell Builtins}).
+
+@item
+Parser syntax errors will not cause the shell to exit.
+
+@item
+Simple spelling correction for directory arguments to the @code{cd}
+builtin is enabled by default (see the description of the @code{cdspell}
+option to the @code{shopt} builtin in @ref{Bash Builtins}).
+
+@item
+The shell will check the value of the @env{TMOUT} variable and exit
+if a command is not read within the specified number of seconds after
+printing @env{$PS1} (@pxref{Bash Variables}).
+
+@end enumerate
+
+@node Bash Conditional Expressions
+@section Bash Conditional Expressions
+@cindex expressions, conditional
+
+Conditional expressions are used by the @code{[[} compound command
+and the @code{test} and @code{[} builtin commands.
+
+Expressions may be unary or binary.
+Unary expressions are often used to examine the status of a file.
+There are string operators and numeric comparison operators as well.
+If the @var{file} argument to one of the primaries is of the form
+@file{/dev/fd/@var{N}}, then file descriptor @var{N} is checked.
+If the @var{file} argument to one of the primaries is one of
+@file{/dev/stdin}, @file{/dev/stdout}, or @file{/dev/stderr}, file
+descriptor 0, 1, or 2, respectively, is checked.
+
+@table @code
+@item -a @var{file}
+True if @var{file} exists.
+
+@item -b @var{file}
+True if @var{file} exists and is a block special file.
+
+@item -c @var{file}
+True if @var{file} exists and is a character special file.
+
+@item -d @var{file}
+True if @var{file} exists and is a directory.
+
+@item -e @var{file}
+True if @var{file} exists.
+
+@item -f @var{file}
+True if @var{file} exists and is a regular file.
+
+@item -g @var{file}
+True if @var{file} exists and its set-group-id bit is set.
+
+@item -h @var{file}
+True if @var{file} exists and is a symbolic link.
+
+@item -k @var{file}
+True if @var{file} exists and its "sticky" bit is set.
+
+@item -p @var{file}
+True if @var{file} exists and is a named pipe (FIFO).
+
+@item -r @var{file}
+True if @var{file} exists and is readable.
+
+@item -s @var{file}
+True if @var{file} exists and has a size greater than zero.
+
+@item -t @var{fd}
+True if file descriptor @var{fd} is open and refers to a terminal.
+
+@item -u @var{file}
+True if @var{file} exists and its set-user-id bit is set.
+
+@item -w @var{file}
+True if @var{file} exists and is writable.
+
+@item -x @var{file}
+True if @var{file} exists and is executable.
+
+@item -O @var{file}
+True if @var{file} exists and is owned by the effective user id.
+
+@item -G @var{file}
+True if @var{file} exists and is owned by the effective group id.
+
+@item -L @var{file}
+True if @var{file} exists and is a symbolic link.
+
+@item -S @var{file}
+True if @var{file} exists and is a socket.
+
+@item -N @var{file}
+True if @var{file} exists and has been modified since it was last read.
+
+@item @var{file1} -nt @var{file2}
+True if @var{file1} is newer (according to modification date)
+than @var{file2}, or if @var{file1} exists and @var{file2} does not.
+
+@item @var{file1} -ot @var{file2}
+True if @var{file1} is older than @var{file2},
+or if @var{file2} exists and @var{file1} does not.
+
+@item @var{file1} -ef @var{file2}
+True if @var{file1} and @var{file2} refer to the same device and
+inode numbers.
+
+@item -o @var{optname}
+True if shell option @var{optname} is enabled.
+The list of options appears in the description of the @option{-o}
+option to the @code{set} builtin (@pxref{The Set Builtin}).
+
+@item -z @var{string}
+True if the length of @var{string} is zero.
+
+@item -n @var{string}
+@itemx @var{string}
+True if the length of @var{string} is non-zero.
+
+@item @var{string1} == @var{string2}
+True if the strings are equal.
+@samp{=} may be used in place of @samp{==} for strict @sc{posix} compliance.
+
+@item @var{string1} != @var{string2}
+True if the strings are not equal.
+
+@item @var{string1} < @var{string2}
+True if @var{string1} sorts before @var{string2} lexicographically
+in the current locale.
+
+@item @var{string1} > @var{string2}
+True if @var{string1} sorts after @var{string2} lexicographically
+in the current locale.
+
+@item @var{arg1} OP @var{arg2}
+@code{OP} is one of 
+@samp{-eq}, @samp{-ne}, @samp{-lt}, @samp{-le}, @samp{-gt}, or @samp{-ge}.
+These arithmetic binary operators return true if @var{arg1}
+is equal to, not equal to, less than, less than or equal to,
+greater than, or greater than or equal to @var{arg2},
+respectively.  @var{Arg1} and @var{arg2}
+may be positive or negative integers.
+
+@end table
+
+@node Shell Arithmetic
+@section Shell Arithmetic
+@cindex arithmetic, shell
+@cindex shell arithmetic
+@cindex expressions, arithmetic
+@cindex evaluation, arithmetic
+@cindex arithmetic evaluation
+
+The shell allows arithmetic expressions to be evaluated, as one of
+the shell expansions or by the @code{let} and the @option{-i} option
+to the @code{declare} builtins.
+
+Evaluation is done in fixed-width integers with no check for overflow,
+though division by 0 is trapped and flagged as an error.
+The operators and their precedence, associativity, and values
+are the same as in the C language.
+The following list of operators is grouped into levels of
+equal-precedence operators.
+The levels are listed in order of decreasing precedence. 
+
+@table @code
+
+@item @var{id}++ @var{id}--
+variable post-increment and post-decrement 
+
+@item ++@var{id} --@var{id}
+variable pre-increment and pre-decrement
+
+@item - +
+unary minus and plus
+
+@item ! ~
+logical and bitwise negation
+
+@item **
+exponentiation
+
+@item * / %
+multiplication, division, remainder
+
+@item + -
+addition, subtraction
+
+@item << >>
+left and right bitwise shifts
+
+@item <= >= < >
+comparison
+
+@item == !=
+equality and inequality
+
+@item &
+bitwise AND
+
+@item ^
+bitwise exclusive OR
+
+@item |
+bitwise OR
+
+@item &&
+logical AND
+
+@item ||
+logical OR
+
+@item expr ? expr : expr
+conditional operator
+
+@item = *= /= %= += -= <<= >>= &= ^= |=
+assignment
+
+@item expr1 , expr2
+comma
+@end table
+
+Shell variables are allowed as operands; parameter expansion is
+performed before the expression is evaluated. 
+Within an expression, shell variables may also be referenced by name
+without using the parameter expansion syntax.
+A shell variable that is null or unset evaluates to 0 when referenced
+by name without using the parameter expansion syntax.
+The value of a variable is evaluated as an arithmetic expression
+when it is referenced, or when a variable which has been given the  
+@var{integer} attribute using @samp{declare -i} is assigned a value.
+A null value evaluates to 0.
+A shell variable need not have its integer attribute turned on
+to be used in an expression.
+
+Constants with a leading 0 are interpreted as octal numbers.
+A leading @samp{0x} or @samp{0X} denotes hexadecimal.  Otherwise,
+numbers take the form [@var{base}@code{#}]@var{n}, where @var{base}
+is a decimal number between 2 and 64 representing the arithmetic
+base, and @var{n} is a number in that base.  If @var{base}@code{#} is
+omitted, then base 10 is used.
+The digits greater than 9 are represented by the lowercase letters,
+the uppercase letters, @samp{@@}, and @samp{_}, in that order.
+If @var{base} is less than or equal to 36, lowercase and uppercase
+letters may be used interchangably to represent numbers between 10
+and 35.
+
+Operators are evaluated in order of precedence.  Sub-expressions in
+parentheses are evaluated first and may override the precedence
+rules above.
+
+@node Aliases
+@section Aliases
+@cindex alias expansion
+
+@var{Aliases} allow a string to be substituted for a word when it is used
+as the first word of a simple command.
+The shell maintains a list of aliases that may be set and unset with
+the @code{alias} and @code{unalias} builtin commands.
+
+The first word of each simple command, if unquoted, is checked to see
+if it has an alias.
+If so, that word is replaced by the text of the alias.
+The alias name and the replacement text may contain any valid
+shell input, including shell metacharacters, with the exception
+that the alias name may not contain @samp{=}.
+The first word of the replacement text is tested for
+aliases, but a word that is identical to an alias being expanded
+is not expanded a second time.  This means that one may alias
+@code{ls} to @code{"ls -F"},
+for instance, and Bash does not try to recursively expand the
+replacement text. If the last character of the alias value is a
+space or tab character, then the next command word following the
+alias is also checked for alias expansion.
+
+Aliases are created and listed with the @code{alias}
+command, and removed with the @code{unalias} command.
+
+There is no mechanism for using arguments in the replacement text,
+as in @code{csh}.
+If arguments are needed, a shell function should be used
+(@pxref{Shell Functions}).
+
+Aliases are not expanded when the shell is not interactive,
+unless the @code{expand_aliases} shell option is set using
+@code{shopt} (@pxref{Bash Builtins}).
+
+The rules concerning the definition and use of aliases are
+somewhat confusing.  Bash
+always reads at least one complete line
+of input before executing any
+of the commands on that line.  Aliases are expanded when a
+command is read, not when it is executed.  Therefore, an
+alias definition appearing on the same line as another
+command does not take effect until the next line of input is read.
+The commands following the alias definition
+on that line are not affected by the new alias.
+This behavior is also an issue when functions are executed.
+Aliases are expanded when a function definition is read,
+not when the function is executed, because a function definition
+is itself a compound command.  As a consequence, aliases
+defined in a function are not available until after that
+function is executed.  To be safe, always put
+alias definitions on a separate line, and do not use @code{alias}
+in compound commands.
+
+For almost every purpose, shell functions are preferred over aliases.
+
+@node Arrays
+@section Arrays
+@cindex arrays
+
+Bash provides one-dimensional array variables.  Any variable may be used as
+an array; the @code{declare} builtin will explicitly declare an array.
+There is no maximum
+limit on the size of an array, nor any requirement that members
+be indexed or assigned contiguously.  Arrays are zero-based.
+
+An array is created automatically if any variable is assigned to using
+the syntax
+@example
+name[@var{subscript}]=@var{value}
+@end example
+
+@noindent
+The @var{subscript}
+is treated as an arithmetic expression that must evaluate to a number
+greater than or equal to zero.  To explicitly declare an array, use
+@example
+declare -a @var{name}
+@end example
+@noindent
+The syntax
+@example
+declare -a @var{name}[@var{subscript}]
+@end example
+@noindent
+is also accepted; the @var{subscript} is ignored.  Attributes may be
+specified for an array variable using the @code{declare} and
+@code{readonly} builtins.  Each attribute applies to all members of
+an array.
+
+Arrays are assigned to using compound assignments of the form
+@example
+name=(value@var{1} @dots{} value@var{n})
+@end example
+@noindent
+where each
+@var{value} is of the form @code{[[@var{subscript}]=]}@var{string}.  If
+the optional subscript is supplied, that index is assigned to;
+otherwise the index of the element assigned is the last index assigned
+to by the statement plus one.  Indexing starts at zero.
+This syntax is also accepted by the @code{declare}
+builtin.  Individual array elements may be assigned to using the
+@code{name[}@var{subscript}@code{]=}@var{value} syntax introduced above.
+
+Any element of an array may be referenced using
+@code{$@{name[}@var{subscript}@code{]@}}.
+The braces are required to avoid
+conflicts with the shell's filename expansion operators.  If the
+@var{subscript} is @samp{@@} or @samp{*}, the word expands to all members
+of the array @var{name}.  These subscripts differ only when the word
+appears within double quotes.  If the word is double-quoted,
+@code{$@{name[*]@}} expands to a single word with
+the value of each array member separated by the first character of the
+@env{IFS} variable, and @code{$@{name[@@]@}} expands each element of
+@var{name} to a separate word.  When there are no array members,
+@code{$@{name[@@]@}} expands to nothing.  This is analogous to the
+expansion of the special parameters @samp{@@} and @samp{*}. 
+@code{$@{#name[}@var{subscript}@code{]@}} expands to the length of
+@code{$@{name[}@var{subscript}@code{]@}}.
+If @var{subscript} is @samp{@@} or
+@samp{*}, the expansion is the number of elements in the array. 
+Referencing an array variable without a subscript is equivalent to
+referencing element zero. 
+
+The @code{unset} builtin is used to destroy arrays.
+@code{unset} @var{name}[@var{subscript}]
+destroys the array element at index @var{subscript}.
+@code{unset} @var{name}, where @var{name} is an array, removes the
+entire array. A subscript of @samp{*} or @samp{@@} also removes the
+entire array.
+
+The @code{declare}, @code{local}, and @code{readonly}
+builtins each accept a @option{-a}
+option to specify an array.  The @code{read}
+builtin accepts a @option{-a}
+option to assign a list of words read from the standard input
+to an array, and can read values from the standard input into
+individual array elements.  The @code{set} and @code{declare}
+builtins display array values in a way that allows them to be
+reused as input.
+
+@node The Directory Stack
+@section The Directory Stack
+@cindex directory stack
+
+@menu
+* Directory Stack Builtins::           Bash builtin commands to manipulate
+                                       the directory stack.
+@end menu
+
+The directory stack is a list of recently-visited directories.  The
+@code{pushd} builtin adds directories to the stack as it changes
+the current directory, and the @code{popd} builtin removes specified
+directories from the stack and changes the current directory to
+the directory removed.  The @code{dirs} builtin displays the contents
+of the directory stack.
+
+The contents of the directory stack are also visible
+as the value of the @env{DIRSTACK} shell variable.
+
+@node Directory Stack Builtins
+@subsection Directory Stack Builtins
+
+@table @code
+
+@item dirs
+@btindex dirs
+@example
+dirs [+@var{N} | -@var{N}] [-clpv]
+@end example
+Display the list of currently remembered directories.  Directories
+are added to the list with the @code{pushd} command; the
+@code{popd} command removes directories from the list.
+@table @code
+@item +@var{N}
+Displays the @var{N}th directory (counting from the left of the
+list printed by @code{dirs} when invoked without options), starting
+with zero.
+@item -@var{N}
+Displays the @var{N}th directory (counting from the right of the
+list printed by @code{dirs} when invoked without options), starting
+with zero.
+@item -c
+Clears the directory stack by deleting all of the elements.
+@item -l
+Produces a longer listing; the default listing format uses a 
+tilde to denote the home directory.
+@item -p
+Causes @code{dirs} to print the directory stack with one entry per
+line.
+@item -v
+Causes @code{dirs} to print the directory stack with one entry per
+line, prefixing each entry with its index in the stack.
+@end table
+
+@item popd
+@btindex popd
+@example
+popd [+@var{N} | -@var{N}] [-n]
+@end example
+
+Remove the top entry from the directory stack, and @code{cd}
+to the new top directory.
+When no arguments are given, @code{popd}
+removes the top directory from the stack and
+performs a @code{cd} to the new top directory.  The
+elements are numbered from 0 starting at the first directory listed with
+@code{dirs}; i.e., @code{popd} is equivalent to @code{popd +0}.
+@table @code
+@item +@var{N}
+Removes the @var{N}th directory (counting from the left of the
+list printed by @code{dirs}), starting with zero.
+@item -@var{N}
+Removes the @var{N}th directory (counting from the right of the
+list printed by @code{dirs}), starting with zero.
+@item -n
+Suppresses the normal change of directory when removing directories
+from the stack, so that only the stack is manipulated.
+@end table
+
+@btindex pushd
+@item pushd
+@example
+pushd [@var{dir} | @var{+N} | @var{-N}] [-n]
+@end example
+
+Save the current directory on the top of the directory stack
+and then @code{cd} to @var{dir}.
+With no arguments, @code{pushd} exchanges the top two directories.
+
+@table @code
+@item +@var{N}
+Brings the @var{N}th directory (counting from the left of the
+list printed by @code{dirs}, starting with zero) to the top of
+the list by rotating the stack.
+@item -@var{N}
+Brings the @var{N}th directory (counting from the right of the
+list printed by @code{dirs}, starting with zero) to the top of
+the list by rotating the stack.
+@item -n
+Suppresses the normal change of directory when adding directories
+to the stack, so that only the stack is manipulated.
+@item @var{dir}
+Makes the current working directory be the top of the stack, and then
+executes the equivalent of `@code{cd} @var{dir}'.
+@code{cd}s to @var{dir}.
+@end table
+
+@end table
+
+@node Printing a Prompt
+@section Controlling the Prompt
+@cindex prompting
+
+The value of the variable @env{PROMPT_COMMAND} is examined just before
+Bash prints each primary prompt.  If @env{PROMPT_COMMAND} is set and
+has a non-null value, then the
+value is executed just as if it had been typed on the command line.
+
+In addition, the following table describes the special characters which
+can appear in the prompt variables:
+
+@table @code
+@item \a
+A bell character.
+@item \d
+The date, in "Weekday Month Date" format (e.g., "Tue May 26").
+@item \D@{@var{format}@}
+The @var{format} is passed to @code{strftime}(3) and the result is inserted
+into the prompt string; an empty @var{format} results in a locale-specific
+time representation.  The braces are required.
+@item \e
+An escape character.
+@item \h
+The hostname, up to the first `.'.
+@item \H
+The hostname.
+@item \j
+The number of jobs currently managed by the shell.
+@item \l
+The basename of the shell's terminal device name.
+@item \n
+A newline.
+@item \r
+A carriage return.
+@item \s
+The name of the shell, the basename of @code{$0} (the portion
+following the final slash).
+@item \t
+The time, in 24-hour HH:MM:SS format.
+@item \T
+The time, in 12-hour HH:MM:SS format.
+@item \@@
+The time, in 12-hour am/pm format.
+@item \A
+The time, in 24-hour HH:MM format.
+@item \u
+The username of the current user.
+@item \v
+The version of Bash (e.g., 2.00)          
+@item \V
+The release of Bash, version + patchlevel (e.g., 2.00.0)
+@item \w
+The current working directory.
+@item \W
+The basename of @env{$PWD}.
+@item \!
+The history number of this command.
+@item \#
+The command number of this command.
+@item \$
+If the effective uid is 0, @code{#}, otherwise @code{$}.
+@item \@var{nnn}
+The character whose ASCII code is the octal value @var{nnn}.
+@item \\
+A backslash.
+@item \[
+Begin a sequence of non-printing characters.  This could be used to
+embed a terminal control sequence into the prompt.
+@item \]
+End a sequence of non-printing characters.
+@end table
+
+The command number and the history number are usually different:
+the history number of a command is its position in the history
+list, which may include commands restored from the history file
+(@pxref{Bash History Facilities}), while the command number is
+the position in the sequence of commands executed during the current
+shell session.
+
+After the string is decoded, it is expanded via
+parameter expansion, command substitution, arithmetic
+expansion, and quote removal, subject to the value of the
+@code{promptvars} shell option (@pxref{Bash Builtins}).
+
+@node The Restricted Shell
+@section The Restricted Shell
+@cindex restricted shell
+
+If Bash is started with the name @code{rbash}, or the
+@option{--restricted}
+or
+@option{-r}
+option is supplied at invocation, the shell becomes restricted.
+A restricted shell is used to
+set up an environment more controlled than the standard shell.
+A restricted shell behaves identically to @code{bash}
+with the exception that the following are disallowed or not performed:
+
+@itemize @bullet
+@item
+Changing directories with the @code{cd} builtin.
+@item
+Setting or unsetting the values of the @env{SHELL}, @env{PATH},
+@env{ENV}, or @env{BASH_ENV} variables.
+@item
+Specifying command names containing slashes.
+@item
+Specifying a filename containing a slash as an argument to the @code{.}
+builtin command.
+@item
+Specifying a filename containing a slash as an argument to the @option{-p}
+option to the @code{hash} builtin command.
+@item
+Importing function definitions from the shell environment at startup.
+@item
+Parsing the value of @env{SHELLOPTS} from the shell environment at startup.
+@item
+Redirecting output using the @samp{>}, @samp{>|}, @samp{<>}, @samp{>&},
+@samp{&>}, and @samp{>>} redirection operators.
+@item
+Using the @code{exec} builtin to replace the shell with another command.
+@item
+Adding or deleting builtin commands with the
+@option{-f} and @option{-d} options to the @code{enable} builtin.
+@item
+Using the @code{enable} builtin command to enable disabled shell builtins.
+@item
+Specifying the @option{-p} option to the @code{command} builtin.
+@item
+Turning off restricted mode with @samp{set +r} or @samp{set +o restricted}.
+@end itemize
+
+These restrictions are enforced after any startup files are read.
+
+When a command that is found to be a shell script is executed
+(@pxref{Shell Scripts}), @code{rbash} turns off any restrictions in
+the shell spawned to execute the script.
+
+@node Bash POSIX Mode
+@section Bash POSIX Mode
+@cindex POSIX Mode
+
+Starting Bash with the @option{--posix} command-line option or executing
+@samp{set -o posix} while Bash is running will cause Bash to conform more
+closely to the @sc{posix} 1003.2 standard by changing the behavior to
+match that specified by @sc{posix} in areas where the Bash default differs.
+
+When invoked as @code{sh}, Bash enters @sc{posix} mode after reading the
+startup files.
+
+The following list is what's changed when `@sc{posix} mode' is in effect:
+
+@enumerate
+@item
+When a command in the hash table no longer exists, Bash will re-search
+@env{$PATH} to find the new location.  This is also available with
+@samp{shopt -s checkhash}.
+
+@item
+The message printed by the job control code and builtins when a job
+exits with a non-zero status is `Done(status)'.
+
+@item
+The message printed by the job control code and builtins when a job
+is stopped is `Stopped(@var{signame})', where @var{signame} is, for
+example, @code{SIGTSTP}.
+
+@item
+Reserved words may not be aliased.
+
+@item
+The @sc{posix} 1003.2 @env{PS1} and @env{PS2} expansions of @samp{!} to
+the history number and @samp{!!} to @samp{!} are enabled,
+and parameter expansion is performed on the values of @env{PS1} and
+@env{PS2} regardless of the setting of the @code{promptvars} option.
+
+@item
+Interactive comments are enabled by default.  (Bash has them on by
+default anyway.)
+
+@item
+The @sc{posix} 1003.2 startup files are executed (@env{$ENV}) rather than
+the normal Bash files.
+
+@item
+Tilde expansion is only performed on assignments preceding a command
+name, rather than on all assignment statements on the line.
+
+@item
+The default history file is @file{~/.sh_history} (this is the
+default value of @env{$HISTFILE}).
+
+@item
+The output of @samp{kill -l} prints all the signal names on a single line,
+separated by spaces.
+
+@item
+Non-interactive shells exit if @var{filename} in @code{.} @var{filename}
+is not found.
+
+@item
+Non-interactive shells exit if a syntax error in an arithmetic expansion
+results in an invalid expression.
+
+@item
+Redirection operators do not perform filename expansion on the word
+in the redirection unless the shell is interactive.
+
+@item
+Redirection operators do not perform word splitting on the word in the
+redirection.
+
+@item
+Function names must be valid shell @code{name}s.  That is, they may not
+contain characters other than letters, digits, and underscores, and
+may not start with a digit.  Declaring a function with an invalid name
+causes a fatal syntax error in non-interactive shells.
+
+@item
+@sc{posix} 1003.2 `special' builtins are found before shell functions
+during command lookup.
+
+@item
+If a @sc{posix} 1003.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.
+
+@item
+If the @code{cd} builtin finds a directory to change to
+using @env{$CDPATH}, the
+value it assigns to the @env{PWD} variable does not contain any
+symbolic links, as if @samp{cd -P} had been executed.
+
+@item
+If @env{CDPATH} is set, the @code{cd} builtin will not implicitly
+append the current directory to it.  This means that @code{cd} will
+fail if no valid directory name can be constructed from
+any of the entries in @env{$CDPATH}, even if the a directory with
+the same name as the name given as an argument to @code{cd} exists
+in the current directory.
+
+@item
+A non-interactive shell exits with an error status if a variable
+assignment error occurs when no command name follows the assignment
+statements.
+A variable assignment error occurs, for example, when trying to assign
+a value to a readonly variable.
+
+@item
+A non-interactive shell exits with an error status if the iteration
+variable in a @code{for} statement or the selection variable in a
+@code{select} statement is a readonly variable.
+
+@item
+Process substitution is not available.
+
+@item
+Assignment statements preceding @sc{posix} 1003.2 special builtins
+persist in the shell environment after the builtin completes.
+
+@item
+Assignment statements preceding shell function calls persist in the
+shell environment after the function returns, as if a @sc{posix}
+special builtin command had been executed.
+
+@item
+The @code{export} and @code{readonly} builtin commands display their
+output in the format required by @sc{posix} 1003.2.
+
+@item
+The @code{trap} builtin displays signal names without the leading
+@code{SIG}.
+
+@item
+The @code{.} and @code{source} builtins do not search the current directory
+for the filename argument if it is not found by searching @env{PATH}.
+
+@item
+Subshells spawned to execute command substitutions inherit the value of
+the @option{-e} option from the parent shell.  When not in @sc{posix} mode,
+Bash clears the @option{-e} option in such subshells.
+
+@item
+Alias expansion is always enabled, even in non-interactive shells.
+
+@item
+When the @code{set} builtin is invoked without options, it does not display
+shell function names and definitions.
+
+@item
+When the @code{set} builtin is invoked without options, it displays
+variable values without quotes, unless they contain shell metacharacters,
+even if the result contains nonprinting characters.
+
+@item
+When the @code{cd} builtin is invoked in @var{logical} mode, and the pathname
+constructed from @code{$PWD} and the directory name supplied as an argument
+does not refer to an existing directory, @code{cd} will fail instead of
+falling back to @var{physical} mode.
+@end enumerate
+
+There is other @sc{posix} 1003.2 behavior that Bash does not implement.
+Specifically:
+
+@enumerate
+@item
+Assignment statements affect the execution environment of all
+builtins, not just special ones.
+
+@item
+When a subshell is created to execute a shell script with execute permission,
+but without a leading @samp{#!}, Bash sets @code{$0} to the full pathname of
+the script as found by searching @code{$PATH}, rather than the command as
+typed by the user.
+
+@item
+When using @samp{.} to source a shell script found in @code{$PATH}, bash
+checks execute permission bits rather than read permission bits, just as
+if it were searching for a command.
+
+@end enumerate
+
+@node Job Control
+@chapter Job Control
+
+This chapter discusses what job control is, how it works, and how
+Bash allows you to access its facilities.
+
+@menu
+* Job Control Basics::         How job control works.
+* Job Control Builtins::       Bash builtin commands used to interact
+                               with job control.
+* Job Control Variables::      Variables Bash uses to customize job
+                               control.
+@end menu
+
+@node Job Control Basics
+@section Job Control Basics
+@cindex job control
+@cindex foreground
+@cindex background
+@cindex suspending jobs
+
+Job control
+refers to the ability to selectively stop (suspend)
+the execution of processes and continue (resume)
+their execution at a later point.  A user typically employs
+this facility via an interactive interface supplied jointly
+by the system's terminal driver and Bash.
+
+The shell associates a @var{job} with each pipeline.  It keeps a
+table of currently executing jobs, which may be listed with the
+@code{jobs} command.  When Bash starts a job
+asynchronously, it prints a line that looks
+like:
+@example
+[1] 25647
+@end example
+@noindent
+indicating that this job is job number 1 and that the process @sc{id}
+of the last process in the pipeline associated with this job is
+25647.  All of the processes in a single pipeline are members of
+the same job.  Bash uses the @var{job} abstraction as the
+basis for job control. 
+
+To facilitate the implementation of the user interface to job
+control, the operating system maintains the notion of a current terminal
+process group @sc{id}.  Members of this process group (processes whose
+process group @sc{id} is equal to the current terminal process group
+@sc{id}) receive keyboard-generated signals such as @code{SIGINT}. 
+These processes are said to be in the foreground.  Background
+processes are those whose process group @sc{id} differs from the
+terminal's; such processes are immune to keyboard-generated
+signals.  Only foreground processes are allowed to read from or
+write to the terminal.  Background processes which attempt to
+read from (write to) the terminal are sent a @code{SIGTTIN}
+(@code{SIGTTOU}) signal by the terminal driver, which, unless
+caught, suspends the process. 
+
+If the operating system on which Bash is running supports
+job control, Bash contains facilities to use it.  Typing the
+@var{suspend} character (typically @samp{^Z}, Control-Z) while a
+process is running causes that process to be stopped and returns
+control to Bash.  Typing the @var{delayed suspend} character
+(typically @samp{^Y}, Control-Y) causes the process to be stopped
+when it attempts to read input from the terminal, and control to
+be returned to Bash.  The user then manipulates the state of
+this job, using the @code{bg} command to continue it in the
+background, the @code{fg} command to continue it in the
+foreground, or the @code{kill} command to kill it.  A @samp{^Z}
+takes effect immediately, and has the additional side effect of
+causing pending output and typeahead to be discarded. 
+
+There are a number of ways to refer to a job in the shell.  The
+character @samp{%} introduces a job name.
+
+Job number @code{n} may be referred to as @samp{%n}.
+The symbols @samp{%%} and
+@samp{%+} refer to the shell's notion of the current job, which
+is the last job stopped while it was in the foreground or started
+in the background.  The
+previous job may be referenced using @samp{%-}.  In output
+pertaining to jobs (e.g., the output of the @code{jobs} command),
+the current job is always flagged with a @samp{+}, and the
+previous job with a @samp{-}. 
+
+A job may also be referred to
+using a prefix of the name used to start it, or using a substring
+that appears in its command line.  For example, @samp{%ce} refers
+to a stopped @code{ce} job. Using @samp{%?ce}, on the
+other hand, refers to any job containing the string @samp{ce} in
+its command line.  If the prefix or substring matches more than one job,
+Bash reports an error.
+
+Simply naming a job can be used to bring it into the foreground:
+@samp{%1} is a synonym for @samp{fg %1}, bringing job 1 from the
+background into the foreground.  Similarly, @samp{%1 &} resumes
+job 1 in the background, equivalent to @samp{bg %1}
+
+The shell learns immediately whenever a job changes state. 
+Normally, Bash waits until it is about to print a prompt
+before reporting changes in a job's status so as to not interrupt
+any other output.
+If the @option{-b} option to the @code{set} builtin is enabled,
+Bash reports such changes immediately (@pxref{The Set Builtin}).
+Any trap on @code{SIGCHLD} is executed for each child process
+that exits.
+
+If an attempt to exit Bash is while jobs are stopped, the
+shell prints a message warning that there are stopped jobs.
+The @code{jobs} command may then be used to inspect their status.
+If a second attempt to exit is made without an intervening command,
+Bash does not print another warning, and the stopped jobs are terminated.
+
+@node Job Control Builtins
+@section Job Control Builtins
+
+@table @code
+
+@item bg
+@btindex bg
+@example
+bg [@var{jobspec}]
+@end example
+Resume the suspended job @var{jobspec} in the background, as if it
+had been started with @samp{&}.
+If @var{jobspec} is not supplied, the current job is used.
+The return status is zero unless it is run when job control is not
+enabled, or, when run with job control enabled, if @var{jobspec} was
+not found or @var{jobspec} specifies a job that was started without
+job control.
+
+@item fg
+@btindex fg
+@example
+fg [@var{jobspec}]
+@end example
+Resume the job @var{jobspec} in the foreground and make it the current job.
+If @var{jobspec} is not supplied, the current job is used.
+The return status is that of the command placed into the foreground,
+or non-zero if run when job control is disabled or, when run with
+job control enabled, @var{jobspec} does not specify a valid job or
+@var{jobspec} specifies a job that was started without job control.
+
+@item jobs
+@btindex jobs
+@example
+jobs [-lnprs] [@var{jobspec}]
+jobs -x @var{command} [@var{arguments}]
+@end example
+
+The first form lists the active jobs.  The options have the
+following meanings:
+
+@table @code
+@item -l
+List process @sc{id}s in addition to the normal information.
+
+@item -n
+Display information only about jobs that have changed status since
+the user was last notified of their status.
+
+@item -p
+List only the process @sc{id} of the job's process group leader.
+
+@item -r
+Restrict output to running jobs.
+
+@item -s
+Restrict output to stopped jobs.
+@end table
+
+If @var{jobspec} is given,
+output is restricted to information about that job. 
+If @var{jobspec} is not supplied, the status of all jobs is
+listed.
+
+If the @option{-x} option is supplied, @code{jobs} replaces any
+@var{jobspec} found in @var{command} or @var{arguments} with the
+corresponding process group @sc{id}, and executes @var{command},
+passing it @var{argument}s, returning its exit status. 
+
+@item kill
+@btindex kill
+@example
+kill [-s @var{sigspec}] [-n @var{signum}] [-@var{sigspec}] @var{jobspec} or @var{pid}
+kill -l [@var{exit_status}]
+@end example
+Send a signal specified by @var{sigspec} or @var{signum} to the process
+named by job specification @var{jobspec} or process @sc{id} @var{pid}.
+@var{sigspec} is either a signal name such as @code{SIGINT} (with or without
+the @code{SIG} prefix) or a signal number; @var{signum} is a signal number.
+If @var{sigspec} and @var{signum} are not present, @code{SIGTERM} is used.
+The @option{-l} option lists the signal names.
+If any arguments are supplied when @option{-l} is given, the names of the
+signals corresponding to the arguments are listed, and the return status
+is zero.
+@var{exit_status} is a number specifying a signal number or the exit
+status of a process terminated by a signal.
+The return status is zero if at least one signal was successfully sent,
+or non-zero if an error occurs or an invalid option is encountered.
+
+@item wait
+@btindex wait
+@example
+wait [@var{jobspec} or @var{pid}]
+@end example
+Wait until the child process specified by process @sc{id} @var{pid} or job
+specification @var{jobspec} exits and return the exit status of the last
+command waited for.
+If a job spec is given, all processes in the job are waited for.
+If no arguments are given, all currently active child processes are
+waited for, and the return status is zero.
+If neither @var{jobspec} nor @var{pid} specifies an active child process
+of the shell, the return status is 127.
+
+@item disown
+@btindex disown
+@example
+disown [-ar] [-h] [@var{jobspec} @dots{}]
+@end example
+Without options, each @var{jobspec} is removed from the table of
+active jobs.
+If the @option{-h} option is given, the job is not removed from the table,
+but is marked so that @code{SIGHUP} is not sent to the job if the shell
+receives a @code{SIGHUP}.
+If @var{jobspec} is not present, and neither the @option{-a} nor @option{-r}
+option is supplied, the current job is used.
+If no @var{jobspec} is supplied, the @option{-a} option means to remove or
+mark all jobs; the @option{-r} option without a @var{jobspec}
+argument restricts operation to running jobs.
+
+@item suspend
+@btindex suspend
+@example
+suspend [-f]
+@end example
+Suspend the execution of this shell until it receives a
+@code{SIGCONT} signal.  The @option{-f} option means to suspend
+even if the shell is a login shell.
+
+@end table
+
+When job control is not active, the @code{kill} and @code{wait}
+builtins do not accept @var{jobspec} arguments.  They must be
+supplied process @sc{id}s.
+
+@node Job Control Variables
+@section Job Control Variables
+
+@vtable @code
+
+@item auto_resume
+This variable controls how the shell interacts with the user and
+job control.  If this variable exists then single word simple
+commands without redirections are treated as candidates for resumption
+of an existing job.  There is no ambiguity allowed; if there is
+more than one job beginning with the string typed, then
+the most recently accessed job will be selected.
+The name of a stopped job, in this context, is the command line
+used to start it.  If this variable is set to the value @samp{exact},
+the string supplied must match the name of a stopped job exactly;
+if set to @samp{substring},
+the string supplied needs to match a substring of the name of a
+stopped job.  The @samp{substring} value provides functionality
+analogous to the @samp{%?} job @sc{id} (@pxref{Job Control Basics}).
+If set to any other value, the supplied string must
+be a prefix of a stopped job's name; this provides functionality
+analogous to the @samp{%} job @sc{id}.
+
+@end vtable
+
+@set readline-appendix
+@set history-appendix
+@cindex Readline, how to use
+@include rluser.texi
+@cindex History, how to use
+@include hsuser.texi
+@clear readline-appendix
+@clear history-appendix
+
+@node Installing Bash
+@chapter Installing Bash
+
+This chapter provides basic instructions for installing Bash on
+the various supported platforms.  The distribution supports the
+@sc{gnu} operating systems, nearly every version of Unix, and several
+non-Unix systems such as BeOS and Interix.
+Other independent ports exist for
+@sc{ms-dos}, @sc{os/2}, Windows @sc{95/98}, and Windows @sc{nt}.
+
+@menu
+* Basic Installation:: Installation instructions.
+
+* Compilers and Options::      How to set special options for various
+                               systems.
+
+* Compiling For Multiple Architectures::       How to compile Bash for more
+                                               than one kind of system from
+                                               the same source tree.
+
+* Installation Names:: How to set the various paths used by the installation.
+
+* Specifying the System Type:: How to configure Bash for a particular system.
+
+* Sharing Defaults::   How to share default configuration values among GNU
+                       programs.
+
+* Operation Controls:: Options recognized by the configuration program.
+
+* Optional Features::  How to enable and disable optional features when
+                       building Bash.
+@end menu
+
+@node Basic Installation
+@section Basic Installation
+@cindex installation
+@cindex configuration
+@cindex Bash installation
+@cindex Bash configuration
+
+These are installation instructions for Bash.
+
+The simplest way to compile Bash is:
+
+@enumerate
+@item
+@code{cd} to the directory containing the source code and type
+@samp{./configure} to configure Bash for your system.  If you're
+using @code{csh} on an old version of System V, you might need to
+type @samp{sh ./configure} instead to prevent @code{csh} from trying
+to execute @code{configure} itself.
+
+Running @code{configure} takes some time.
+While running, it prints messages telling which features it is
+checking for.
+
+@item
+Type @samp{make} to compile Bash and build the @code{bashbug} bug
+reporting script.
+
+@item
+Optionally, type @samp{make tests} to run the Bash test suite.
+
+@item
+Type @samp{make install} to install @code{bash} and @code{bashbug}.
+This will also install the manual pages and Info file.
+
+@end enumerate
+
+The @code{configure} shell script attempts to guess correct
+values for various system-dependent variables used during
+compilation.  It uses those values to create a @file{Makefile} in
+each directory of the package (the top directory, the
+@file{builtins}, @file{doc}, and @file{support} directories,
+each directory under @file{lib}, and several others).  It also creates a
+@file{config.h} file containing system-dependent definitions. 
+Finally, it creates a shell script named @code{config.status} that you
+can run in the future to recreate the current configuration, a
+file @file{config.cache} that saves the results of its tests to
+speed up reconfiguring, and a file @file{config.log} containing
+compiler output (useful mainly for debugging @code{configure}). 
+If at some point
+@file{config.cache} contains results you don't want to keep, you
+may remove or edit it. 
+
+To find out more about the options and arguments that the
+@code{configure} script understands, type 
+
+@example
+bash-2.04$ ./configure --help
+@end example
+
+@noindent
+at the Bash prompt in your Bash source directory.
+
+If you need to do unusual things to compile Bash, please
+try to figure out how @code{configure} could check whether or not
+to do them, and mail diffs or instructions to
+@email{bash-maintainers@@gnu.org} so they can be
+considered for the next release.
+
+The file @file{configure.in} is used to create @code{configure}
+by a program called Autoconf.  You only need
+@file{configure.in} if you want to change it or regenerate
+@code{configure} using a newer version of Autoconf.  If
+you do this, make sure you are using Autoconf version 2.50 or
+newer.
+
+You can remove the program binaries and object files from the
+source code directory by typing @samp{make clean}.  To also remove the
+files that @code{configure} created (so you can compile Bash for
+a different kind of computer), type @samp{make distclean}.
+
+@node Compilers and Options
+@section Compilers and Options
+
+Some systems require unusual options for compilation or linking
+that the @code{configure} script does not know about.  You can
+give @code{configure} initial values for variables by setting
+them in the environment.  Using a Bourne-compatible shell, you
+can do that on the command line like this:
+
+@example
+CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+@end example
+
+On systems that have the @code{env} program, you can do it like this:
+
+@example
+env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+@end example
+
+The configuration process uses GCC to build Bash if it
+is available.
+
+@node Compiling For Multiple Architectures
+@section Compiling For Multiple Architectures
+
+You can compile Bash for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of @code{make} that
+supports the @code{VPATH} variable, such as GNU @code{make}.
+@code{cd} to the
+directory where you want the object files and executables to go and run
+the @code{configure} script from the source directory.  You may need to
+supply the @option{--srcdir=PATH} argument to tell @code{configure} where the
+source files are.  @code{configure} automatically checks for the
+source code in the directory that @code{configure} is in and in `..'.
+
+If you have to use a @code{make} that does not supports the @code{VPATH}
+variable, you can compile Bash for one architecture at a
+time in the source code directory.  After you have installed
+Bash for one architecture, use @samp{make distclean} before
+reconfiguring for another architecture.
+
+Alternatively, if your system supports symbolic links, you can use the
+@file{support/mkclone} script to create a build tree which has
+symbolic links back to each file in the source directory.  Here's an
+example that creates a build directory in the current directory from a
+source directory @file{/usr/gnu/src/bash-2.0}:
+
+@example
+bash /usr/gnu/src/bash-2.0/support/mkclone -s /usr/gnu/src/bash-2.0 .
+@end example
+
+@noindent
+The @code{mkclone} script requires Bash, so you must have already built
+Bash for at least one architecture before you can create build
+directories for other architectures.
+
+@node Installation Names
+@section Installation Names
+
+By default, @samp{make install} will install into
+@file{/usr/local/bin}, @file{/usr/local/man}, etc.  You can
+specify an installation prefix other than @file{/usr/local} by
+giving @code{configure} the option @option{--prefix=@var{PATH}},
+or by specifying a value for the @code{DESTDIR} @samp{make}
+variable when running @samp{make install}.
+
+You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. 
+If you give @code{configure} the option
+@option{--exec-prefix=@var{PATH}}, @samp{make install} will use
+@var{PATH} as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix. 
+
+@node Specifying the System Type
+@section Specifying the System Type
+
+There may be some features @code{configure} can not figure out
+automatically, but need to determine by the type of host Bash
+will run on.  Usually @code{configure} can figure that
+out, but if it prints a message saying it can not guess the host
+type, give it the @option{--host=TYPE} option.  @samp{TYPE} can
+either be a short name for the system type, such as @samp{sun4},
+or a canonical name with three fields: @samp{CPU-COMPANY-SYSTEM}
+(e.g., @samp{i386-unknown-freebsd4.2}).
+
+See the file @file{support/config.sub} for the possible
+values of each field. 
+
+@node Sharing Defaults
+@section Sharing Defaults
+
+If you want to set default values for @code{configure} scripts to
+share, you can create a site shell script called
+@code{config.site} that gives default values for variables like
+@code{CC}, @code{cache_file}, and @code{prefix}.  @code{configure}
+looks for @file{PREFIX/share/config.site} if it exists, then
+@file{PREFIX/etc/config.site} if it exists.  Or, you can set the
+@code{CONFIG_SITE} environment variable to the location of the site
+script.  A warning: the Bash @code{configure} looks for a site script,
+but not all @code{configure} scripts do.
+
+@node Operation Controls
+@section Operation Controls
+
+@code{configure} recognizes the following options to control how it
+operates.
+
+@table @code
+
+@item --cache-file=@var{file}
+Use and save the results of the tests in
+@var{file} instead of @file{./config.cache}.  Set @var{file} to
+@file{/dev/null} to disable caching, for debugging
+@code{configure}. 
+
+@item --help
+Print a summary of the options to @code{configure}, and exit.
+
+@item --quiet
+@itemx --silent
+@itemx -q
+Do not print messages saying which checks are being made.
+
+@item --srcdir=@var{dir}
+Look for the Bash source code in directory @var{dir}.  Usually
+@code{configure} can determine that directory automatically.
+
+@item --version
+Print the version of Autoconf used to generate the @code{configure}
+script, and exit.
+@end table
+
+@code{configure} also accepts some other, not widely used, boilerplate
+options.  @samp{configure --help} prints the complete list.
+
+@node Optional Features
+@section Optional Features
+
+The Bash @code{configure} has a number of @option{--enable-@var{feature}}
+options, where @var{feature} indicates an optional part of Bash.
+There are also several @option{--with-@var{package}} options,
+where @var{package} is something like @samp{bash-malloc} or @samp{purify}.
+To turn off the default use of a package, use
+@option{--without-@var{package}}.  To configure Bash without a feature
+that is enabled by default, use @option{--disable-@var{feature}}.
+
+Here is a complete list of the @option{--enable-} and
+@option{--with-} options that the Bash @code{configure} recognizes. 
+
+@table @code
+@item --with-afs
+Define if you are using the Andrew File System from Transarc.
+
+@item --with-bash-malloc
+Use the Bash version of
+@code{malloc} in @file{lib/malloc/malloc.c}.  This is not the same
+@code{malloc} that appears in @sc{gnu} libc, but an older version
+derived from the 4.2 @sc{bsd} @code{malloc}.  This @code{malloc} is
+very fast, but wastes some space on each allocation.
+This option is enabled by default.
+The @file{NOTES} file contains a list of systems for
+which this should be turned off, and @code{configure} disables this
+option automatically for a number of systems.
+
+@item --with-curses
+Use the curses library instead of the termcap library.  This should
+be supplied if your system has an inadequate or incomplete termcap
+database.
+
+@item --with-gnu-malloc
+A synonym for @code{--with-bash-malloc}.
+
+@item --with-installed-readline[=@var{PREFIX}]
+Define this to make Bash link with a locally-installed version of Readline
+rather than the version in @file{lib/readline}.  This works only with
+Readline 4.3 and later versions.  If @var{PREFIX} is @code{yes} or not
+supplied, @code{configure} uses the values of the make variables
+@code{includedir} and @code{libdir}, which are subdirectories of @code{prefix}
+by default, to find the installed version of Readline if it is not in
+the standard system include and library directories.
+If @var{PREFIX} is @code{no}, Bash links with the version in
+@file{lib/readline}.
+If @var{PREFIX} is set to any other value, @code{configure} treats it as
+a directory pathname and looks for
+the installed version of Readline in subdirectories of that directory
+(include files in @var{PREFIX}/@code{include} and the library in
+@var{PREFIX}/@code{lib}).
+
+@item --with-purify
+Define this to use the Purify memory allocation checker from Rational
+Software.
+
+@item --enable-minimal-config
+This produces a shell with minimal features, close to the historical
+Bourne shell.
+@end table
+
+There are several @option{--enable-} options that alter how Bash is
+compiled and linked, rather than changing run-time features.
+
+@table @code
+@item --enable-largefile
+Enable support for @uref{http://www.sas.com/standards/large_file/x_open.20Mar96.html,
+large files} if the operating system requires special compiler options
+to build programs which can access large files.  This is enabled by
+default, if the operating system provides large file support.
+
+@item --enable-profiling
+This builds a Bash binary that produces profiling information to be
+processed by @code{gprof} each time it is executed.
+
+@item --enable-static-link
+This causes Bash to be linked statically, if @code{gcc} is being used.
+This could be used to build a version to use as root's shell.
+@end table
+
+The @samp{minimal-config} option can be used to disable all of
+the following options, but it is processed first, so individual
+options may be enabled using @samp{enable-@var{feature}}. 
+
+All of the following options except for @samp{disabled-builtins} and
+@samp{xpg-echo-default} are
+enabled by default, unless the operating system does not provide the
+necessary support.
+
+@table @code
+@item --enable-alias
+Allow alias expansion and include the @code{alias} and @code{unalias}
+builtins (@pxref{Aliases}).
+
+@item --enable-arith-for-command
+Include support for the alternate form of the @code{for} command
+that behaves like the C language @code{for} statement
+(@pxref{Looping Constructs}).
+
+@item --enable-array-variables
+Include support for one-dimensional array shell variables
+(@pxref{Arrays}).
+
+@item --enable-bang-history
+Include support for @code{csh}-like history substitution
+(@pxref{History Interaction}).
+
+@item --enable-brace-expansion
+Include @code{csh}-like brace expansion
+( @code{b@{a,b@}c} @expansion{} @code{bac bbc} ).
+See @ref{Brace Expansion}, for a complete description.
+
+@item --enable-command-timing
+Include support for recognizing @code{time} as a reserved word and for
+displaying timing statistics for the pipeline following @code{time}
+(@pxref{Pipelines}).
+This allows pipelines as well as shell builtins and functions to be timed.
+
+@item --enable-cond-command
+Include support for the @code{[[} conditional command
+(@pxref{Conditional Constructs}).
+
+@item --enable-directory-stack
+Include support for a @code{csh}-like directory stack and the
+@code{pushd}, @code{popd}, and @code{dirs} builtins
+(@pxref{The Directory Stack}).
+
+@item --enable-disabled-builtins
+Allow builtin commands to be invoked via @samp{builtin xxx}
+even after @code{xxx} has been disabled using @samp{enable -n xxx}.
+See @ref{Bash Builtins}, for details of the @code{builtin} and
+@code{enable} builtin commands.
+
+@item --enable-dparen-arithmetic
+Include support for the @code{((@dots{}))} command
+(@pxref{Conditional Constructs}).
+
+@item --enable-extended-glob
+Include support for the extended pattern matching features described
+above under @ref{Pattern Matching}.
+
+@item --enable-help-builtin
+Include the @code{help} builtin, which displays help on shell builtins and
+variables (@pxref{Bash Builtins}).
+
+@item --enable-history
+Include command history and the @code{fc} and @code{history}
+builtin commands (@pxref{Bash History Facilities}).
+
+@item --enable-job-control
+This enables the job control features (@pxref{Job Control}),
+if the operating system supports them.
+
+@item --enable-multibyte
+This enables support for multibyte characters if the operating
+system provides the necessary support.
+
+@item --enable-net-redirections
+This enables the special handling of filenames of the form
+@code{/dev/tcp/@var{host}/@var{port}} and
+@code{/dev/udp/@var{host}/@var{port}}
+when used in redirections (@pxref{Redirections}).
+
+@item --enable-process-substitution
+This enables process substitution (@pxref{Process Substitution}) if
+the operating system provides the necessary support.
+
+@item --enable-prompt-string-decoding
+Turn on the interpretation of a number of backslash-escaped characters
+in the @env{$PS1}, @env{$PS2}, @env{$PS3}, and @env{$PS4} prompt
+strings.  See @ref{Printing a Prompt}, for a complete list of prompt
+string escape sequences.
+
+@item --enable-progcomp
+Enable the programmable completion facilities
+(@pxref{Programmable Completion}).
+If Readline is not enabled, this option has no effect.
+
+@item --enable-readline
+Include support for command-line editing and history with the Bash
+version of the Readline library (@pxref{Command Line Editing}).
+
+@item --enable-restricted
+Include support for a @dfn{restricted shell}.  If this is enabled, Bash,
+when called as @code{rbash}, enters a restricted mode.  See
+@ref{The Restricted Shell}, for a description of restricted mode.
+
+@item --enable-select
+Include the @code{select} builtin, which allows the generation of simple
+menus (@pxref{Conditional Constructs}).
+
+@item --enable-usg-echo-default
+A synonym for @code{--enable-xpg-echo-default}.
+
+@item --enable-xpg-echo-default
+Make the @code{echo} builtin expand backslash-escaped characters by default,
+without requiring the @option{-e} option.
+This sets the default value of the @code{xpg_echo} shell option to @code{on},
+which makes the Bash @code{echo} behave more like the version specified in
+the Single Unix Specification, version 2.
+@xref{Bash Builtins}, for a description of the escape sequences that
+@code{echo} recognizes.
+
+@end table
+
+The file @file{config-top.h} contains C Preprocessor
+@samp{#define} statements for options which are not settable from
+@code{configure}.
+Some of these are not meant to be changed; beware of the consequences if
+you do.
+Read the comments associated with each definition for more
+information about its effect.
+
+@node Reporting Bugs
+@appendix Reporting Bugs
+
+Please report all bugs you find in Bash.
+But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of Bash.
+The latest version of Bash is always available for FTP from
+@uref{ftp://ftp.gnu.org/pub/bash/}.
+
+Once you have determined that a bug actually exists, use the
+@code{bashbug} command to submit a bug report.
+If you have a fix, you are encouraged to mail that as well!
+Suggestions and `philosophical' bug reports may be mailed
+to @email{bug-bash@@gnu.org} or posted to the Usenet
+newsgroup @code{gnu.bash.bug}.
+
+All bug reports should include:
+@itemize @bullet
+@item
+The version number of Bash.
+@item
+The hardware and operating system.
+@item
+The compiler used to compile Bash.
+@item
+A description of the bug behaviour.
+@item
+A short script or `recipe' which exercises the bug and may be used
+to reproduce it.
+@end itemize
+
+@noindent
+@code{bashbug} inserts the first three items automatically into
+the template it provides for filing a bug report.
+
+Please send all reports concerning this manual to
+@email{chet@@po.CWRU.Edu}.
+
+@node Major Differences From The Bourne Shell
+@appendix Major Differences From The Bourne Shell
+
+Bash implements essentially the same grammar, parameter and
+variable expansion, redirection, and quoting as the Bourne Shell. 
+Bash uses the @sc{posix} 1003.2 standard as the specification of
+how these features are to be implemented.  There are some
+differences between the traditional Bourne shell and Bash; this
+section quickly details the differences of significance.  A
+number of these differences are explained in greater depth in
+previous sections.
+This section uses the version of @code{sh} included in SVR4.2 as
+the baseline reference.
+
+@itemize @bullet
+
+@item
+Bash is @sc{posix}-conformant, even where the @sc{posix} specification
+differs from traditional @code{sh} behavior (@pxref{Bash POSIX Mode}).
+
+@item
+Bash has multi-character invocation options (@pxref{Invoking Bash}).
+
+@item
+Bash has command-line editing (@pxref{Command Line Editing}) and
+the @code{bind} builtin.
+
+@item
+Bash provides a programmable word completion mechanism
+(@pxref{Programmable Completion}), and two builtin commands,
+@code{complete} and @code{compgen}, to manipulate it.
+
+@item
+Bash has command history (@pxref{Bash History Facilities}) and the
+@code{history} and @code{fc} builtins to manipulate it.
+
+@item
+Bash implements @code{csh}-like history expansion
+(@pxref{History Interaction}).
+
+@item
+Bash has one-dimensional array variables (@pxref{Arrays}), and the
+appropriate variable expansions and assignment syntax to use them.
+Several of the Bash builtins take options to act on arrays.
+Bash provides a number of built-in array variables.
+
+@item
+The @code{$'@dots{}'} quoting syntax, which expands ANSI-C
+backslash-escaped characters in the text between the single quotes,
+is supported (@pxref{ANSI-C Quoting}).
+
+@item
+Bash supports the @code{$"@dots{}"} quoting syntax to do
+locale-specific translation of the characters between the double
+quotes.  The @option{-D}, @option{--dump-strings}, and @option{--dump-po-strings}
+invocation options list the translatable strings found in a script
+(@pxref{Locale Translation}).
+
+@item
+Bash implements the @code{!} keyword to negate the return value of
+a pipeline (@pxref{Pipelines}).
+Very useful when an @code{if} statement needs to act only if a test fails.
+
+@item
+Bash has the @code{time} reserved word and command timing (@pxref{Pipelines}).
+The display of the timing statistics may be controlled with the
+@env{TIMEFORMAT} variable.
+
+@item
+Bash implements the @code{for (( @var{expr1} ; @var{expr2} ; @var{expr3} ))}
+arithmetic for command, similar to the C language (@pxref{Looping Constructs}).
+
+@item
+Bash includes the @code{select} compound command, which allows the
+generation of simple menus (@pxref{Conditional Constructs}).
+
+@item
+Bash includes the @code{[[} compound command, which makes conditional
+testing part of the shell grammar (@pxref{Conditional Constructs}).
+
+@item
+Bash includes brace expansion (@pxref{Brace Expansion}) and tilde
+expansion (@pxref{Tilde Expansion}).
+
+@item
+Bash implements command aliases and the @code{alias} and @code{unalias}
+builtins (@pxref{Aliases}).
+
+@item
+Bash provides shell arithmetic, the @code{((} compound command
+(@pxref{Conditional Constructs}),
+and arithmetic expansion (@pxref{Shell Arithmetic}).
+
+@item
+Variables present in the shell's initial environment are automatically
+exported to child processes.  The Bourne shell does not normally do
+this unless the variables are explicitly marked using the @code{export}
+command.
+
+@item
+Bash includes the @sc{posix} pattern removal @samp{%}, @samp{#}, @samp{%%}
+and @samp{##} expansions to remove leading or trailing substrings from
+variable values (@pxref{Shell Parameter Expansion}).
+
+@item
+The expansion @code{$@{#xx@}}, which returns the length of @code{$@{xx@}},
+is supported (@pxref{Shell Parameter Expansion}).
+
+@item
+The expansion @code{$@{var:}@var{offset}@code{[:}@var{length}@code{]@}},
+which expands to the substring of @code{var}'s value of length
+@var{length}, beginning at @var{offset}, is present
+(@pxref{Shell Parameter Expansion}).
+
+@item
+The expansion
+@code{$@{var/[/]}@var{pattern}@code{[/}@var{replacement}@code{]@}},
+which matches @var{pattern} and replaces it with @var{replacement} in
+the value of @code{var}, is available (@pxref{Shell Parameter Expansion}).
+
+@item
+The expansion @code{$@{!@var{prefix@}*}} expansion, which expands to
+the names of all shell variables whose names begin with @var{prefix},
+is available (@pxref{Shell Parameter Expansion}).
+
+@item
+Bash has @var{indirect} variable expansion using @code{$@{!word@}}
+(@pxref{Shell Parameter Expansion}).
+
+@item
+Bash can expand positional parameters beyond @code{$9} using
+@code{$@{@var{num}@}}.
+
+@item
+The @sc{posix} @code{$()} form of command substitution
+is implemented (@pxref{Command Substitution}),
+and preferred to the Bourne shell's @code{``} (which
+is also implemented for backwards compatibility).
+
+@item
+Bash has process substitution (@pxref{Process Substitution}).
+
+@item
+Bash automatically assigns variables that provide information about the
+current user (@env{UID}, @env{EUID}, and @env{GROUPS}), the current host
+(@env{HOSTTYPE}, @env{OSTYPE}, @env{MACHTYPE}, and @env{HOSTNAME}),
+and the instance of Bash that is running (@env{BASH},
+@env{BASH_VERSION}, and @env{BASH_VERSINFO}).  @xref{Bash Variables},
+for details.
+
+@item
+The @env{IFS} variable is used to split only the results of expansion,
+not all words (@pxref{Word Splitting}).
+This closes a longstanding shell security hole.
+
+@item
+Bash implements the full set of @sc{posix} 1003.2 filename expansion operators,
+including @var{character classes}, @var{equivalence classes}, and
+@var{collating symbols} (@pxref{Filename Expansion}).
+
+@item
+Bash implements extended pattern matching features when the @code{extglob}
+shell option is enabled (@pxref{Pattern Matching}).
+
+@item
+It is possible to have a variable and a function with the same name;
+@code{sh} does not separate the two name spaces.
+
+@item
+Bash functions are permitted to have local variables using the
+@code{local} builtin, and thus useful recursive functions may be written
+(@pxref{Bash Builtins}).
+
+@item
+Variable assignments preceding commands affect only that command, even
+builtins and functions (@pxref{Environment}).
+In @code{sh}, all variable assignments 
+preceding commands are global unless the command is executed from the
+file system.
+
+@item
+Bash performs filename expansion on filenames specified as operands
+to input and output redirection operators (@pxref{Redirections}).
+
+@item
+Bash contains the @samp{<>} redirection operator, allowing a file to be
+opened for both reading and writing, and the @samp{&>} redirection
+operator, for directing standard output and standard error to the same
+file (@pxref{Redirections}).
+
+@item
+Bash treats a number of filenames specially when they are
+used in redirection operators (@pxref{Redirections}).
+
+@item
+Bash can open network connections to arbitrary machines and services
+with the redirection operators (@pxref{Redirections}).
+
+@item
+The @code{noclobber} option is available to avoid overwriting existing
+files with output redirection (@pxref{The Set Builtin}).
+The @samp{>|} redirection operator may be used to override @code{noclobber}.
+
+@item
+The Bash @code{cd} and @code{pwd} builtins (@pxref{Bourne Shell Builtins})
+each take @option{-L} and @option{-P} options to switch between logical and
+physical modes.
+
+@item
+Bash allows a function to override a builtin with the same name, and provides
+access to that builtin's functionality within the function via the
+@code{builtin} and @code{command} builtins (@pxref{Bash Builtins}).
+
+@item
+The @code{command} builtin allows selective disabling of functions
+when command lookup is performed (@pxref{Bash Builtins}).
+
+@item
+Individual builtins may be enabled or disabled using the @code{enable}
+builtin (@pxref{Bash Builtins}).
+
+@item
+The Bash @code{exec} builtin takes additional options that allow users
+to control the contents of the environment passed to the executed
+command, and what the zeroth argument to the command is to be
+(@pxref{Bourne Shell Builtins}).
+
+@item
+Shell functions may be exported to children via the environment
+using @code{export -f} (@pxref{Shell Functions}).
+
+@item
+The Bash @code{export}, @code{readonly}, and @code{declare} builtins can
+take a @option{-f} option to act on shell functions, a @option{-p} option to
+display variables with various attributes set in a format that can be
+used as shell input, a @option{-n} option to remove various variable
+attributes, and @samp{name=value} arguments to set variable attributes
+and values simultaneously.
+
+@item
+The Bash @code{hash} builtin allows a name to be associated with
+an arbitrary filename, even when that filename cannot be found by
+searching the @env{$PATH}, using @samp{hash -p}
+(@pxref{Bourne Shell Builtins}).
+
+@item
+Bash includes a @code{help} builtin for quick reference to shell
+facilities (@pxref{Bash Builtins}).
+
+@item
+The @code{printf} builtin is available to display formatted output
+(@pxref{Bash Builtins}).
+
+@item
+The Bash @code{read} builtin (@pxref{Bash Builtins})
+will read a line ending in @samp{\} with
+the @option{-r} option, and will use the @env{REPLY} variable as a
+default if no non-option arguments are supplied.
+The Bash @code{read} builtin
+also accepts a prompt string with the @option{-p} option and will use
+Readline to obtain the line when given the @option{-e} option.
+The @code{read} builtin also has additional options to control input:
+the @option{-s} option will turn off echoing of input characters as
+they are read, the @option{-t} option will allow @code{read} to time out
+if input does not arrive within a specified number of seconds, the
+@option{-n} option will allow reading only a specified number of
+characters rather than a full line, and the @option{-d} option will read
+until a particular character rather than newline.
+
+@item
+The @code{return} builtin may be used to abort execution of scripts
+executed with the @code{.} or @code{source} builtins
+(@pxref{Bourne Shell Builtins}).
+
+@item
+Bash includes the @code{shopt} builtin, for finer control of shell
+optional capabilities (@pxref{Bash Builtins}), and allows these options
+to be set and unset at shell invocation (@pxref{Invoking Bash}).
+
+@item
+Bash has much more optional behavior controllable with the @code{set}
+builtin (@pxref{The Set Builtin}).
+
+@item
+The @code{test} builtin (@pxref{Bourne Shell Builtins})
+is slightly different, as it implements the @sc{posix} algorithm,
+which specifies the behavior based on the number of arguments.
+
+@item
+The @code{trap} builtin (@pxref{Bourne Shell Builtins}) allows a
+@code{DEBUG} pseudo-signal specification, similar to @code{EXIT}.
+Commands specified with a @code{DEBUG} trap are executed before every
+simple command, @code{for} command, @code{case} command,
+@code{select} command, every arithmetic @code{for} command, and before
+the first command executes in a shell function.
+The @code{DEBUG} trap is not inherited by shell functions unless the
+function has been given the @code{trace} attribute or the
+@code{functrace} option has been enabled using the @code{shopt} builtin.
+The @code{extdebug} shell option has additional effects on the
+@code{DEBUG} trap.
+
+The @code{trap} builtin (@pxref{Bourne Shell Builtins}) allows an
+@code{ERR} pseudo-signal specification, similar to @code{EXIT} and @code{DEBUG}.
+Commands specified with an @code{ERR} trap are executed after a simple
+command fails, with a few exceptions.
+The @code{ERR} trap is not inherited by shell functions unless the
+@code{-o errtrace} option to the @code{set} builtin is enabled.
+
+The @code{trap} builtin (@pxref{Bourne Shell Builtins}) allows a
+@code{RETURN} pseudo-signal specification, similar to
+@code{EXIT} and @code{DEBUG}.
+Commands specified with an @code{RETURN} trap are executed before
+execution resumes after a shell function or a shell script executed with
+@code{.} or @code{source} returns.
+The @code{RETURN} trap is not inherited by shell functions.
+
+@item
+The Bash @code{type} builtin is more extensive and gives more information
+about the names it finds (@pxref{Bash Builtins}).
+
+@item
+The Bash @code{umask} builtin permits a @option{-p} option to cause
+the output to be displayed in the form of a @code{umask} command
+that may be reused as input (@pxref{Bourne Shell Builtins}).
+
+@item
+Bash implements a @code{csh}-like directory stack, and provides the
+@code{pushd}, @code{popd}, and @code{dirs} builtins to manipulate it
+(@pxref{The Directory Stack}).
+Bash also makes the directory stack visible as the value of the
+@env{DIRSTACK} shell variable.
+
+@item
+Bash interprets special backslash-escaped characters in the prompt
+strings when interactive (@pxref{Printing a Prompt}).
+
+@item
+The Bash restricted mode is more useful (@pxref{The Restricted Shell});
+the SVR4.2 shell restricted mode is too limited.
+
+@item
+The @code{disown} builtin can remove a job from the internal shell
+job table (@pxref{Job Control Builtins}) or suppress the sending
+of @code{SIGHUP} to a job when the shell exits as the result of a
+@code{SIGHUP}.
+
+@item
+The SVR4.2 shell has two privilege-related builtins
+(@code{mldmode} and @code{priv}) not present in Bash.
+
+@item
+Bash does not have the @code{stop} or @code{newgrp} builtins.
+
+@item
+Bash does not use the @env{SHACCT} variable or perform shell accounting.
+
+@item
+The SVR4.2 @code{sh} uses a @env{TIMEOUT} variable like Bash uses
+@env{TMOUT}.
+
+@end itemize
+
+@noindent
+More features unique to Bash may be found in @ref{Bash Features}.
+
+
+@appendixsec Implementation Differences From The SVR4.2 Shell
+
+Since Bash is a completely new implementation, it does not suffer from
+many of the limitations of the SVR4.2 shell.  For instance:
+
+@itemize @bullet
+
+@item
+Bash does not fork a subshell when redirecting into or out of
+a shell control structure such as  an @code{if} or @code{while}
+statement.
+
+@item
+Bash does not allow unbalanced quotes.  The SVR4.2 shell will silently
+insert a needed closing quote at @code{EOF} under certain circumstances.
+This can be the cause of some hard-to-find errors.
+
+@item
+The SVR4.2 shell uses a baroque memory management scheme based on
+trapping @code{SIGSEGV}.  If the shell is started from a process with
+@code{SIGSEGV} blocked (e.g., by using the @code{system()} C library
+function call), it misbehaves badly.
+
+@item
+In a questionable attempt at security, the SVR4.2 shell,
+when invoked without the @option{-p} option, will alter its real
+and effective @sc{uid} and @sc{gid} if they are less than some
+magic threshold value, commonly 100.
+This can lead to unexpected results.
+
+@item
+The SVR4.2 shell does not allow users to trap @code{SIGSEGV},
+@code{SIGALRM}, or @code{SIGCHLD}.
+
+@item
+The SVR4.2 shell does not allow the @env{IFS}, @env{MAILCHECK},
+@env{PATH}, @env{PS1}, or @env{PS2} variables to be unset.
+
+@item
+The SVR4.2 shell treats @samp{^} as the undocumented equivalent of
+@samp{|}.
+
+@item
+Bash allows multiple option arguments when it is invoked (@code{-x -v});
+the SVR4.2 shell allows only one option argument (@code{-xv}).  In
+fact, some versions of the shell dump core if the second argument begins
+with a @samp{-}.
+
+@item
+The SVR4.2 shell exits a script if any builtin fails; Bash exits
+a script only if one of the @sc{posix} 1003.2 special builtins fails, and
+only for certain failures, as enumerated in the @sc{posix} 1003.2 standard.
+
+@item 
+The SVR4.2 shell behaves differently when invoked as @code{jsh}
+(it turns on job control).
+@end itemize
+
+@node Copying This Manual
+@appendix Copying This Manual
+
+@menu
+* GNU Free Documentation License::      License for copying this manual.
+@end menu
+
+@include fdl.texi
+
+@node Builtin Index
+@unnumbered Index of Shell Builtin Commands
+@printindex bt
+
+@node Reserved Word Index
+@unnumbered Index of Shell Reserved Words
+@printindex rw
+
+@node Variable Index
+@unnumbered Parameter and Variable Index
+@printindex vr
+
+@node Function Index
+@unnumbered Function Index
+@printindex fn
+
+@node Concept Index
+@unnumbered Concept Index
+@printindex cp
+
+@bye
diff --git a/doc/bashref.toc b/doc/bashref.toc
new file mode 100644 (file)
index 0000000..f9ef988
--- /dev/null
@@ -0,0 +1,134 @@
+\chapentry{Introduction}{1}{1}
+\secentry{What is Bash?}{1}{1}{1}
+\secentry{What is a shell?}{1}{2}{1}
+\chapentry{Definitions}{2}{3}
+\chapentry{Basic Shell Features}{3}{5}
+\secentry{Shell Syntax}{3}{1}{5}
+\subsecentry{Shell Operation}{3}{1}{1}{5}
+\subsecentry{Quoting}{3}{1}{2}{5}
+\subsubsecentry{Escape Character}{3}{1}{2}{1}{6}
+\subsubsecentry{Single Quotes}{3}{1}{2}{2}{6}
+\subsubsecentry{Double Quotes}{3}{1}{2}{3}{6}
+\subsubsecentry{ANSI-C Quoting}{3}{1}{2}{4}{6}
+\subsubsecentry{Locale-Specific Translation}{3}{1}{2}{5}{7}
+\subsecentry{Comments}{3}{1}{3}{7}
+\secentry{Shell Commands}{3}{2}{7}
+\subsecentry{Simple Commands}{3}{2}{1}{8}
+\subsecentry{Pipelines}{3}{2}{2}{8}
+\subsecentry{Lists of Commands}{3}{2}{3}{8}
+\subsecentry{Compound Commands}{3}{2}{4}{9}
+\subsubsecentry{Looping Constructs}{3}{2}{4}{1}{9}
+\subsubsecentry{Conditional Constructs}{3}{2}{4}{2}{10}
+\subsubsecentry{Grouping Commands}{3}{2}{4}{3}{13}
+\secentry{Shell Functions}{3}{3}{13}
+\secentry{Shell Parameters}{3}{4}{14}
+\subsecentry{Positional Parameters}{3}{4}{1}{15}
+\subsecentry{Special Parameters}{3}{4}{2}{15}
+\secentry{Shell Expansions}{3}{5}{16}
+\subsecentry{Brace Expansion}{3}{5}{1}{17}
+\subsecentry{Tilde Expansion}{3}{5}{2}{17}
+\subsecentry{Shell Parameter Expansion}{3}{5}{3}{18}
+\subsecentry{Command Substitution}{3}{5}{4}{21}
+\subsecentry{Arithmetic Expansion}{3}{5}{5}{21}
+\subsecentry{Process Substitution}{3}{5}{6}{21}
+\subsecentry{Word Splitting}{3}{5}{7}{22}
+\subsecentry{Filename Expansion}{3}{5}{8}{22}
+\subsubsecentry{Pattern Matching}{3}{5}{8}{1}{23}
+\subsecentry{Quote Removal}{3}{5}{9}{24}
+\secentry{Redirections}{3}{6}{24}
+\subsecentry{Redirecting Input}{3}{6}{1}{25}
+\subsecentry{Redirecting Output}{3}{6}{2}{25}
+\subsecentry{Appending Redirected Output}{3}{6}{3}{26}
+\subsecentry{Redirecting Standard Output and Standard Error}{3}{6}{4}{26}
+\subsecentry{Here Documents}{3}{6}{5}{26}
+\subsecentry{Here Strings}{3}{6}{6}{26}
+\subsecentry{Duplicating File Descriptors}{3}{6}{7}{27}
+\subsecentry{Moving File Descriptors}{3}{6}{8}{27}
+\subsecentry{Opening File Descriptors for Reading and Writing}{3}{6}{9}{27}
+\secentry{Executing Commands}{3}{7}{27}
+\subsecentry{Simple Command Expansion}{3}{7}{1}{27}
+\subsecentry{Command Search and Execution}{3}{7}{2}{28}
+\subsecentry{Command Execution Environment}{3}{7}{3}{29}
+\subsecentry{Environment}{3}{7}{4}{30}
+\subsecentry{Exit Status}{3}{7}{5}{30}
+\subsecentry{Signals}{3}{7}{6}{31}
+\secentry{Shell Scripts}{3}{8}{31}
+\chapentry{Shell Builtin Commands}{4}{33}
+\secentry{Bourne Shell Builtins}{4}{1}{33}
+\secentry{Bash Builtin Commands}{4}{2}{39}
+\secentry{The Set Builtin}{4}{3}{50}
+\secentry{Special Builtins}{4}{4}{53}
+\chapentry{Shell Variables}{5}{55}
+\secentry{Bourne Shell Variables}{5}{1}{55}
+\secentry{Bash Variables}{5}{2}{55}
+\chapentry{Bash Features}{6}{63}
+\secentry{Invoking Bash}{6}{1}{63}
+\secentry{Bash Startup Files}{6}{2}{65}
+\secentry{Interactive Shells}{6}{3}{67}
+\subsecentry{What is an Interactive Shell?}{6}{3}{1}{67}
+\subsecentry{Is this Shell Interactive?}{6}{3}{2}{67}
+\subsecentry{Interactive Shell Behavior}{6}{3}{3}{67}
+\secentry{Bash Conditional Expressions}{6}{4}{68}
+\secentry{Shell Arithmetic}{6}{5}{70}
+\secentry{Aliases}{6}{6}{71}
+\secentry{Arrays}{6}{7}{72}
+\secentry{The Directory Stack}{6}{8}{73}
+\subsecentry{Directory Stack Builtins}{6}{8}{1}{73}
+\secentry{Controlling the Prompt}{6}{9}{74}
+\secentry{The Restricted Shell}{6}{10}{76}
+\secentry{Bash POSIX Mode}{6}{11}{76}
+\chapentry{Job Control}{7}{79}
+\secentry{Job Control Basics}{7}{1}{79}
+\secentry{Job Control Builtins}{7}{2}{80}
+\secentry{Job Control Variables}{7}{3}{81}
+\chapentry{Command Line Editing}{8}{83}
+\secentry{Introduction to Line Editing}{8}{1}{83}
+\secentry{Readline Interaction}{8}{2}{83}
+\subsecentry{Readline Bare Essentials}{8}{2}{1}{83}
+\subsecentry{Readline Movement Commands}{8}{2}{2}{84}
+\subsecentry{Readline Killing Commands}{8}{2}{3}{84}
+\subsecentry{Readline Arguments}{8}{2}{4}{85}
+\subsecentry{Searching for Commands in the History}{8}{2}{5}{85}
+\secentry{Readline Init File}{8}{3}{86}
+\subsecentry{Readline Init File Syntax}{8}{3}{1}{86}
+\subsecentry{Conditional Init Constructs}{8}{3}{2}{91}
+\subsecentry{Sample Init File}{8}{3}{3}{92}
+\secentry{Bindable Readline Commands}{8}{4}{95}
+\subsecentry{Commands For Moving}{8}{4}{1}{95}
+\subsecentry{Commands For Manipulating The History}{8}{4}{2}{95}
+\subsecentry{Commands For Changing Text}{8}{4}{3}{96}
+\subsecentry{Killing And Yanking}{8}{4}{4}{98}
+\subsecentry{Specifying Numeric Arguments}{8}{4}{5}{98}
+\subsecentry{Letting Readline Type For You}{8}{4}{6}{99}
+\subsecentry{Keyboard Macros}{8}{4}{7}{100}
+\subsecentry{Some Miscellaneous Commands}{8}{4}{8}{101}
+\secentry{Readline vi Mode}{8}{5}{103}
+\secentry{Programmable Completion}{8}{6}{103}
+\secentry{Programmable Completion Builtins}{8}{7}{105}
+\chapentry{Using History Interactively}{9}{109}
+\secentry{Bash History Facilities}{9}{1}{109}
+\secentry{Bash History Builtins}{9}{2}{109}
+\secentry{History Expansion}{9}{3}{111}
+\subsecentry{Event Designators}{9}{3}{1}{111}
+\subsecentry{Word Designators}{9}{3}{2}{112}
+\subsecentry{Modifiers}{9}{3}{3}{113}
+\chapentry{Installing Bash}{10}{115}
+\secentry{Basic Installation}{10}{1}{115}
+\secentry{Compilers and Options}{10}{2}{115}
+\secentry{Compiling For Multiple Architectures}{10}{3}{116}
+\secentry{Installation Names}{10}{4}{116}
+\secentry{Specifying the System Type}{10}{5}{116}
+\secentry{Sharing Defaults}{10}{6}{117}
+\secentry{Operation Controls}{10}{7}{117}
+\secentry{Optional Features}{10}{8}{117}
+\appendixentry{Reporting Bugs}{A}{123}
+\appendixentry{Major Differences From The Bourne Shell}{B}{125}
+\secentry{Implementation Differences From The SVR4.2 Shell}{B}{1}{129}
+\appendixentry{Copying This Manual}{C}{131}
+\secentry{GNU Free Documentation License}{C}{1}{131}
+\subsecentry{ADDENDUM: How to use this License for your documents}{C}{1}{1}{137}
+\unnumbchapentry{Index of Shell Builtin Commands}{10}{139}
+\unnumbchapentry{Index of Shell Reserved Words}{10}{141}
+\unnumbchapentry{Parameter and Variable Index}{10}{143}
+\unnumbchapentry{Function Index}{10}{145}
+\unnumbchapentry{Concept Index}{10}{147}
diff --git a/doc/bashref.tp b/doc/bashref.tp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/doc/bashref.vr b/doc/bashref.vr
new file mode 100644 (file)
index 0000000..3beb9ee
--- /dev/null
@@ -0,0 +1,113 @@
+\entry{LC_MESSAGES}{7}{\code {LC_MESSAGES}}
+\entry{TEXTDOMAIN}{7}{\code {TEXTDOMAIN}}
+\entry{TEXTDOMAINDIR}{7}{\code {TEXTDOMAINDIR}}
+\entry{*}{15}{\code {*}}
+\entry{@}{15}{\code {@}}
+\entry{#}{16}{\code {#}}
+\entry{?}{16}{\code {?}}
+\entry{-}{16}{\code {-}}
+\entry{$}{16}{\code {$}}
+\entry{!}{16}{\code {!}}
+\entry{0}{16}{\code {0}}
+\entry{_}{16}{\code {_}}
+\entry{CDPATH}{55}{\code {CDPATH}}
+\entry{HOME}{55}{\code {HOME}}
+\entry{IFS}{55}{\code {IFS}}
+\entry{MAIL}{55}{\code {MAIL}}
+\entry{MAILPATH}{55}{\code {MAILPATH}}
+\entry{OPTARG}{55}{\code {OPTARG}}
+\entry{OPTIND}{55}{\code {OPTIND}}
+\entry{PATH}{55}{\code {PATH}}
+\entry{PS1}{55}{\code {PS1}}
+\entry{PS2}{55}{\code {PS2}}
+\entry{BASH}{55}{\code {BASH}}
+\entry{BASH_ARGC}{56}{\code {BASH_ARGC}}
+\entry{BASH_ARGV}{56}{\code {BASH_ARGV}}
+\entry{BASH_COMMAND}{56}{\code {BASH_COMMAND}}
+\entry{BASH_ENV}{56}{\code {BASH_ENV}}
+\entry{BASH_EXECUTION_STRING}{56}{\code {BASH_EXECUTION_STRING}}
+\entry{BASH_LINENO}{56}{\code {BASH_LINENO}}
+\entry{BASH_REMATCH}{56}{\code {BASH_REMATCH}}
+\entry{BASH_SOURCE}{56}{\code {BASH_SOURCE}}
+\entry{BASH_SUBSHELL}{56}{\code {BASH_SUBSHELL}}
+\entry{BASH_VERSINFO}{56}{\code {BASH_VERSINFO}}
+\entry{BASH_VERSION}{57}{\code {BASH_VERSION}}
+\entry{COLUMNS}{57}{\code {COLUMNS}}
+\entry{COMP_CWORD}{57}{\code {COMP_CWORD}}
+\entry{COMP_LINE}{57}{\code {COMP_LINE}}
+\entry{COMP_POINT}{57}{\code {COMP_POINT}}
+\entry{COMP_WORDBREAKS}{57}{\code {COMP_WORDBREAKS}}
+\entry{COMP_WORDS}{57}{\code {COMP_WORDS}}
+\entry{COMPREPLY}{58}{\code {COMPREPLY}}
+\entry{DIRSTACK}{58}{\code {DIRSTACK}}
+\entry{EMACS}{58}{\code {EMACS}}
+\entry{EUID}{58}{\code {EUID}}
+\entry{FCEDIT}{58}{\code {FCEDIT}}
+\entry{FIGNORE}{58}{\code {FIGNORE}}
+\entry{FUNCNAME}{58}{\code {FUNCNAME}}
+\entry{GLOBIGNORE}{58}{\code {GLOBIGNORE}}
+\entry{GROUPS}{58}{\code {GROUPS}}
+\entry{histchars}{58}{\code {histchars}}
+\entry{HISTCMD}{59}{\code {HISTCMD}}
+\entry{HISTCONTROL}{59}{\code {HISTCONTROL}}
+\entry{HISTFILE}{59}{\code {HISTFILE}}
+\entry{HISTFILESIZE}{59}{\code {HISTFILESIZE}}
+\entry{HISTIGNORE}{59}{\code {HISTIGNORE}}
+\entry{HISTSIZE}{59}{\code {HISTSIZE}}
+\entry{HISTTIMEFORMAT}{59}{\code {HISTTIMEFORMAT}}
+\entry{HOSTFILE}{59}{\code {HOSTFILE}}
+\entry{HOSTNAME}{60}{\code {HOSTNAME}}
+\entry{HOSTTYPE}{60}{\code {HOSTTYPE}}
+\entry{IGNOREEOF}{60}{\code {IGNOREEOF}}
+\entry{INPUTRC}{60}{\code {INPUTRC}}
+\entry{LANG}{60}{\code {LANG}}
+\entry{LC_ALL}{60}{\code {LC_ALL}}
+\entry{LC_COLLATE}{60}{\code {LC_COLLATE}}
+\entry{LC_CTYPE}{60}{\code {LC_CTYPE}}
+\entry{LC_MESSAGES}{60}{\code {LC_MESSAGES}}
+\entry{LC_NUMERIC}{60}{\code {LC_NUMERIC}}
+\entry{LINENO}{60}{\code {LINENO}}
+\entry{LINES}{60}{\code {LINES}}
+\entry{MACHTYPE}{60}{\code {MACHTYPE}}
+\entry{MAILCHECK}{61}{\code {MAILCHECK}}
+\entry{OLDPWD}{61}{\code {OLDPWD}}
+\entry{OPTERR}{61}{\code {OPTERR}}
+\entry{OSTYPE}{61}{\code {OSTYPE}}
+\entry{PIPESTATUS}{61}{\code {PIPESTATUS}}
+\entry{POSIXLY_CORRECT}{61}{\code {POSIXLY_CORRECT}}
+\entry{PPID}{61}{\code {PPID}}
+\entry{PROMPT_COMMAND}{61}{\code {PROMPT_COMMAND}}
+\entry{PS3}{61}{\code {PS3}}
+\entry{PS4}{61}{\code {PS4}}
+\entry{PWD}{61}{\code {PWD}}
+\entry{RANDOM}{61}{\code {RANDOM}}
+\entry{REPLY}{61}{\code {REPLY}}
+\entry{SECONDS}{61}{\code {SECONDS}}
+\entry{SHELLOPTS}{62}{\code {SHELLOPTS}}
+\entry{SHLVL}{62}{\code {SHLVL}}
+\entry{TIMEFORMAT}{62}{\code {TIMEFORMAT}}
+\entry{TMOUT}{62}{\code {TMOUT}}
+\entry{UID}{62}{\code {UID}}
+\entry{auto_resume}{82}{\code {auto_resume}}
+\entry{bell-style}{87}{\code {bell-style}}
+\entry{comment-begin}{87}{\code {comment-begin}}
+\entry{completion-query-items}{87}{\code {completion-query-items}}
+\entry{convert-meta}{87}{\code {convert-meta}}
+\entry{disable-completion}{87}{\code {disable-completion}}
+\entry{editing-mode}{88}{\code {editing-mode}}
+\entry{enable-keypad}{88}{\code {enable-keypad}}
+\entry{expand-tilde}{88}{\code {expand-tilde}}
+\entry{history-preserve-point}{88}{\code {history-preserve-point}}
+\entry{horizontal-scroll-mode}{88}{\code {horizontal-scroll-mode}}
+\entry{input-meta}{88}{\code {input-meta}}
+\entry{meta-flag}{88}{\code {meta-flag}}
+\entry{isearch-terminators}{88}{\code {isearch-terminators}}
+\entry{keymap}{88}{\code {keymap}}
+\entry{mark-modified-lines}{89}{\code {mark-modified-lines}}
+\entry{mark-symlinked-directories}{89}{\code {mark-symlinked-directories}}
+\entry{match-hidden-files}{89}{\code {match-hidden-files}}
+\entry{output-meta}{89}{\code {output-meta}}
+\entry{page-completions}{89}{\code {page-completions}}
+\entry{show-all-if-ambiguous}{89}{\code {show-all-if-ambiguous}}
+\entry{show-all-if-unmodified}{89}{\code {show-all-if-unmodified}}
+\entry{visible-stats}{89}{\code {visible-stats}}
diff --git a/doc/bashref.vrs b/doc/bashref.vrs
new file mode 100644 (file)
index 0000000..e2bc04c
--- /dev/null
@@ -0,0 +1,140 @@
+\initial {!}
+\entry {\code {!}}{16}
+\initial {#}
+\entry {\code {#}}{16}
+\initial {$}
+\entry {\code {$}}{16}
+\initial {*}
+\entry {\code {*}}{15}
+\initial {-}
+\entry {\code {-}}{16}
+\initial {?}
+\entry {\code {?}}{16}
+\initial {@}
+\entry {\code {@}}{15}
+\initial {_}
+\entry {\code {_}}{16}
+\initial {0}
+\entry {\code {0}}{16}
+\initial {A}
+\entry {\code {auto_resume}}{82}
+\initial {B}
+\entry {\code {BASH}}{55}
+\entry {\code {BASH_ARGC}}{56}
+\entry {\code {BASH_ARGV}}{56}
+\entry {\code {BASH_COMMAND}}{56}
+\entry {\code {BASH_ENV}}{56}
+\entry {\code {BASH_EXECUTION_STRING}}{56}
+\entry {\code {BASH_LINENO}}{56}
+\entry {\code {BASH_REMATCH}}{56}
+\entry {\code {BASH_SOURCE}}{56}
+\entry {\code {BASH_SUBSHELL}}{56}
+\entry {\code {BASH_VERSINFO}}{56}
+\entry {\code {BASH_VERSION}}{57}
+\entry {\code {bell-style}}{87}
+\initial {C}
+\entry {\code {CDPATH}}{55}
+\entry {\code {COLUMNS}}{57}
+\entry {\code {comment-begin}}{87}
+\entry {\code {COMP_CWORD}}{57}
+\entry {\code {COMP_LINE}}{57}
+\entry {\code {COMP_POINT}}{57}
+\entry {\code {COMP_WORDBREAKS}}{57}
+\entry {\code {COMP_WORDS}}{57}
+\entry {\code {completion-query-items}}{87}
+\entry {\code {COMPREPLY}}{58}
+\entry {\code {convert-meta}}{87}
+\initial {D}
+\entry {\code {DIRSTACK}}{58}
+\entry {\code {disable-completion}}{87}
+\initial {E}
+\entry {\code {editing-mode}}{88}
+\entry {\code {EMACS}}{58}
+\entry {\code {enable-keypad}}{88}
+\entry {\code {EUID}}{58}
+\entry {\code {expand-tilde}}{88}
+\initial {F}
+\entry {\code {FCEDIT}}{58}
+\entry {\code {FIGNORE}}{58}
+\entry {\code {FUNCNAME}}{58}
+\initial {G}
+\entry {\code {GLOBIGNORE}}{58}
+\entry {\code {GROUPS}}{58}
+\initial {H}
+\entry {\code {histchars}}{58}
+\entry {\code {HISTCMD}}{59}
+\entry {\code {HISTCONTROL}}{59}
+\entry {\code {HISTFILE}}{59}
+\entry {\code {HISTFILESIZE}}{59}
+\entry {\code {HISTIGNORE}}{59}
+\entry {\code {history-preserve-point}}{88}
+\entry {\code {HISTSIZE}}{59}
+\entry {\code {HISTTIMEFORMAT}}{59}
+\entry {\code {HOME}}{55}
+\entry {\code {horizontal-scroll-mode}}{88}
+\entry {\code {HOSTFILE}}{59}
+\entry {\code {HOSTNAME}}{60}
+\entry {\code {HOSTTYPE}}{60}
+\initial {I}
+\entry {\code {IFS}}{55}
+\entry {\code {IGNOREEOF}}{60}
+\entry {\code {input-meta}}{88}
+\entry {\code {INPUTRC}}{60}
+\entry {\code {isearch-terminators}}{88}
+\initial {K}
+\entry {\code {keymap}}{88}
+\initial {L}
+\entry {\code {LANG}}{60}
+\entry {\code {LC_ALL}}{60}
+\entry {\code {LC_COLLATE}}{60}
+\entry {\code {LC_CTYPE}}{60}
+\entry {\code {LC_MESSAGES}}{7, 60}
+\entry {\code {LC_NUMERIC}}{60}
+\entry {\code {LINENO}}{60}
+\entry {\code {LINES}}{60}
+\initial {M}
+\entry {\code {MACHTYPE}}{60}
+\entry {\code {MAIL}}{55}
+\entry {\code {MAILCHECK}}{61}
+\entry {\code {MAILPATH}}{55}
+\entry {\code {mark-modified-lines}}{89}
+\entry {\code {mark-symlinked-directories}}{89}
+\entry {\code {match-hidden-files}}{89}
+\entry {\code {meta-flag}}{88}
+\initial {O}
+\entry {\code {OLDPWD}}{61}
+\entry {\code {OPTARG}}{55}
+\entry {\code {OPTERR}}{61}
+\entry {\code {OPTIND}}{55}
+\entry {\code {OSTYPE}}{61}
+\entry {\code {output-meta}}{89}
+\initial {P}
+\entry {\code {page-completions}}{89}
+\entry {\code {PATH}}{55}
+\entry {\code {PIPESTATUS}}{61}
+\entry {\code {POSIXLY_CORRECT}}{61}
+\entry {\code {PPID}}{61}
+\entry {\code {PROMPT_COMMAND}}{61}
+\entry {\code {PS1}}{55}
+\entry {\code {PS2}}{55}
+\entry {\code {PS3}}{61}
+\entry {\code {PS4}}{61}
+\entry {\code {PWD}}{61}
+\initial {R}
+\entry {\code {RANDOM}}{61}
+\entry {\code {REPLY}}{61}
+\initial {S}
+\entry {\code {SECONDS}}{61}
+\entry {\code {SHELLOPTS}}{62}
+\entry {\code {SHLVL}}{62}
+\entry {\code {show-all-if-ambiguous}}{89}
+\entry {\code {show-all-if-unmodified}}{89}
+\initial {T}
+\entry {\code {TEXTDOMAIN}}{7}
+\entry {\code {TEXTDOMAINDIR}}{7}
+\entry {\code {TIMEFORMAT}}{62}
+\entry {\code {TMOUT}}{62}
+\initial {U}
+\entry {\code {UID}}{62}
+\initial {V}
+\entry {\code {visible-stats}}{89}
diff --git a/doc/builtins.0 b/doc/builtins.0
new file mode 100644 (file)
index 0000000..cd928cb
--- /dev/null
@@ -0,0 +1,1377 @@
+BASH_BUILTINS(1)                                              BASH_BUILTINS(1)
+
+
+
+N\bNA\bAM\bME\bE
+       bash,  :,  ., [, alias, bg, bind, break, builtin, cd, command, compgen,
+       complete, continue, declare, dirs, disown, echo,  enable,  eval,  exec,
+       exit,  export,  fc,  fg, getopts, hash, help, history, jobs, kill, let,
+       local, logout, popd, printf, pushd, pwd, read, readonly,  return,  set,
+       shift,  shopt,  source,  suspend,  test,  times,  trap,  type, typeset,
+       ulimit, umask, unalias, unset,  wait  -  bash  built-in  commands,  see
+       b\bba\bas\bsh\bh(1)
+
+B\bBA\bAS\bSH\bH B\bBU\bUI\bIL\bLT\bTI\bIN\bN C\bCO\bOM\bMM\bMA\bAN\bND\bDS\bS
+       Unless otherwise noted, each builtin command documented in this section
+       as accepting options preceded by -\b- accepts -\b--\b- to signify the end of the
+       options.
+       :\b: [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+              No  effect;  the command does nothing beyond expanding _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs
+              and performing any specified redirections.  A zero exit code  is
+              returned.
+
+        .\b.  _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+       s\bso\bou\bur\brc\bce\be _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+              Read  and  execute  commands  from _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be in the current shell
+              environment and return the exit status of the last command  exe-
+              cuted from _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be.  If _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be does not contain a slash, file
+              names in P\bPA\bAT\bTH\bH are used to find the  directory  containing  _\bf_\bi_\bl_\be_\b-
+              _\bn_\ba_\bm_\be.   The  file  searched  for in P\bPA\bAT\bTH\bH need not be executable.
+              When b\bba\bas\bsh\bh is  not  in  _\bp_\bo_\bs_\bi_\bx  _\bm_\bo_\bd_\be,  the  current  directory  is
+              searched  if no file is found in P\bPA\bAT\bTH\bH.  If the s\bso\bou\bur\brc\bce\bep\bpa\bat\bth\bh option
+              to the s\bsh\bho\bop\bpt\bt builtin command is turned  off,  the  P\bPA\bAT\bTH\bH  is  not
+              searched.   If any _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs are supplied, they become the posi-
+              tional parameters when  _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be  is  executed.   Otherwise  the
+              positional  parameters  are unchanged.  The return status is the
+              status of the last command exited within the  script  (0  if  no
+              commands  are  executed),  and false if _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be is not found or
+              cannot be read.
+
+       a\bal\bli\bia\bas\bs [-\b-p\bp] [_\bn_\ba_\bm_\be[=_\bv_\ba_\bl_\bu_\be] ...]
+              A\bAl\bli\bia\bas\bs with no arguments or with the -\b-p\bp option prints the list of
+              aliases  in  the form a\bal\bli\bia\bas\bs _\bn_\ba_\bm_\be=_\bv_\ba_\bl_\bu_\be on standard output.  When
+              arguments are supplied, an alias is defined for each _\bn_\ba_\bm_\be  whose
+              _\bv_\ba_\bl_\bu_\be is given.  A trailing space in  _\bv_\ba_\bl_\bu_\be causes the next word
+              to be checked for alias substitution when the alias is expanded.
+              For  each  _\bn_\ba_\bm_\be  in the argument list for which no _\bv_\ba_\bl_\bu_\be is sup-
+              plied, the name and  value  of  the  alias  is  printed.   A\bAl\bli\bia\bas\bs
+              returns  true unless a _\bn_\ba_\bm_\be is given for which no alias has been
+              defined.
+
+       b\bbg\bg [_\bj_\bo_\bb_\bs_\bp_\be_\bc]
+              Resume the suspended job _\bj_\bo_\bb_\bs_\bp_\be_\bc in the background, as if it had
+              been  started  with  &\b&.   If _\bj_\bo_\bb_\bs_\bp_\be_\bc is not present, the shell's
+              notion of the _\bc_\bu_\br_\br_\be_\bn_\bt _\bj_\bo_\bb is used.  b\bbg\bg _\bj_\bo_\bb_\bs_\bp_\be_\bc returns 0  unless
+              run  when  job control is disabled or, when run with job control
+              enabled, if _\bj_\bo_\bb_\bs_\bp_\be_\bc was not found or started  without  job  con-
+              trol.
+
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] [-\b-l\blp\bps\bsv\bvP\bPS\bSV\bV]
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] [-\b-q\bq _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn] [-\b-u\bu _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn] [-\b-r\br _\bk_\be_\by_\bs_\be_\bq]
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] -\b-f\bf _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] -\b-x\bx _\bk_\be_\by_\bs_\be_\bq:_\bs_\bh_\be_\bl_\bl_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd
+       b\bbi\bin\bnd\bd [-\b-m\bm _\bk_\be_\by_\bm_\ba_\bp] _\bk_\be_\by_\bs_\be_\bq:_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be
+       b\bbi\bin\bnd\bd _\br_\be_\ba_\bd_\bl_\bi_\bn_\be_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd
+              Display  current  r\bre\bea\bad\bdl\bli\bin\bne\be key and function bindings, bind a key
+              sequence to a r\bre\bea\bad\bdl\bli\bin\bne\be function or  macro,  or  set  a  r\bre\bea\bad\bdl\bli\bin\bne\be
+              variable.   Each  non-option  argument  is a command as it would
+              appear in _\b._\bi_\bn_\bp_\bu_\bt_\br_\bc, but each binding or command must  be  passed
+              as  a  separate argument; e.g., '"\C-x\C-r": re-read-init-file'.
+              Options, if supplied, have the following meanings:
+              -\b-m\bm _\bk_\be_\by_\bm_\ba_\bp
+                     Use _\bk_\be_\by_\bm_\ba_\bp as the keymap to be affected by the subsequent
+                     bindings.  Acceptable _\bk_\be_\by_\bm_\ba_\bp names are _\be_\bm_\ba_\bc_\bs_\b, _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\b-
+                     _\bd_\ba_\br_\bd_\b, _\be_\bm_\ba_\bc_\bs_\b-_\bm_\be_\bt_\ba_\b, _\be_\bm_\ba_\bc_\bs_\b-_\bc_\bt_\bl_\bx_\b,  _\bv_\bi_\b,  _\bv_\bi_\b-_\bm_\bo_\bv_\be_\b,  _\bv_\bi_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd,
+                     and  _\bv_\bi_\b-_\bi_\bn_\bs_\be_\br_\bt.  _\bv_\bi is equivalent to _\bv_\bi_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd; _\be_\bm_\ba_\bc_\bs is
+                     equivalent to _\be_\bm_\ba_\bc_\bs_\b-_\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd.
+              -\b-l\bl     List the names of all r\bre\bea\bad\bdl\bli\bin\bne\be functions.
+              -\b-p\bp     Display r\bre\bea\bad\bdl\bli\bin\bne\be function names and bindings  in  such  a
+                     way that they can be re-read.
+              -\b-P\bP     List current r\bre\bea\bad\bdl\bli\bin\bne\be function names and bindings.
+              -\b-v\bv     Display  r\bre\bea\bad\bdl\bli\bin\bne\be variable names and values in such a way
+                     that they can be re-read.
+              -\b-V\bV     List current r\bre\bea\bad\bdl\bli\bin\bne\be variable names and values.
+              -\b-s\bs     Display r\bre\bea\bad\bdl\bli\bin\bne\be key sequences bound to  macros  and  the
+                     strings  they  output  in such a way that they can be re-
+                     read.
+              -\b-S\bS     Display r\bre\bea\bad\bdl\bli\bin\bne\be key sequences bound to  macros  and  the
+                     strings they output.
+              -\b-f\bf _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be
+                     Read key bindings from _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be.
+              -\b-q\bq _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn
+                     Query about which keys invoke the named _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn.
+              -\b-u\bu _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn
+                     Unbind all keys bound to the named _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn.
+              -\b-r\br _\bk_\be_\by_\bs_\be_\bq
+                     Remove any current binding for _\bk_\be_\by_\bs_\be_\bq.
+              -\b-x\bx _\bk_\be_\by_\bs_\be_\bq:\b:_\bs_\bh_\be_\bl_\bl_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd
+                     Cause  _\bs_\bh_\be_\bl_\bl_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd  to  be  executed whenever _\bk_\be_\by_\bs_\be_\bq is
+                     entered.
+
+              The return value is 0 unless an unrecognized option is given  or
+              an error occurred.
+
+       b\bbr\bre\bea\bak\bk [_\bn]
+              Exit  from  within a f\bfo\bor\br, w\bwh\bhi\bil\ble\be, u\bun\bnt\bti\bil\bl, or s\bse\bel\ble\bec\bct\bt loop.  If _\bn is
+              specified, break _\bn levels.  _\bn must be >= 1.   If  _\bn  is  greater
+              than  the  number  of  enclosing  loops, all enclosing loops are
+              exited.  The return value is 0 unless the shell is not executing
+              a loop when b\bbr\bre\bea\bak\bk is executed.
+
+       b\bbu\bui\bil\blt\bti\bin\bn _\bs_\bh_\be_\bl_\bl_\b-_\bb_\bu_\bi_\bl_\bt_\bi_\bn [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+              Execute  the  specified shell builtin, passing it _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs, and
+              return its exit status.  This is useful when defining a function
+              whose  name  is the same as a shell builtin, retaining the func-
+              tionality of the builtin within the function.  The c\bcd\bd builtin is
+              commonly  redefined  this  way.   The  return status is false if
+              _\bs_\bh_\be_\bl_\bl_\b-_\bb_\bu_\bi_\bl_\bt_\bi_\bn is not a shell builtin command.
+
+       c\bcd\bd [-\b-L\bL|\b|-\b-P\bP] [_\bd_\bi_\br]
+              Change the current directory to _\bd_\bi_\br.  The variable H\bHO\bOM\bME\bE  is  the
+              default  _\bd_\bi_\br.   The  variable C\bCD\bDP\bPA\bAT\bTH\bH defines the search path for
+              the directory containing _\bd_\bi_\br.  Alternative  directory  names  in
+              C\bCD\bDP\bPA\bAT\bTH\bH  are  separated by a colon (:).  A null directory name in
+              C\bCD\bDP\bPA\bAT\bTH\bH is the same as the current directory,  i.e.,  ``.\b.''.   If
+              _\bd_\bi_\br  begins  with  a  slash (/), then C\bCD\bDP\bPA\bAT\bTH\bH is not used. The -\b-P\bP
+              option says to use the physical directory structure  instead  of
+              following  symbolic  links  (see  also  the -\b-P\bP option to the s\bse\bet\bt
+              builtin command); the -\b-L\bL option forces symbolic links to be fol-
+              lowed.   An  argument  of -\b- is equivalent to $\b$O\bOL\bLD\bDP\bPW\bWD\bD.  If a non-
+              empty directory name from C\bCD\bDP\bPA\bAT\bTH\bH is used, or if -\b- is  the  first
+              argument,  and  the directory change is successful, the absolute
+              pathname of the new working directory is written to the standard
+              output.   The return value is true if the directory was success-
+              fully changed; false otherwise.
+
+       c\bca\bal\bll\ble\ber\br [_\be_\bx_\bp_\br]
+              Returns the context of any active subroutine call (a shell func-
+              tion  or a script executed with the .\b. or s\bso\bou\bur\brc\bce\be builtins.  With-
+              out _\be_\bx_\bp_\br, c\bca\bal\bll\ble\ber\br displays the line number and source filename of
+              the  current subroutine call.  If a non-negative integer is sup-
+              plied as _\be_\bx_\bp_\br, c\bca\bal\bll\ble\ber\br displays the line number, subroutine name,
+              and  source  file  corresponding to that position in the current
+              execution call stack.  This extra information may be  used,  for
+              example,  to print a stack trace.  The current frame is frame 0.
+              The return value is 0 unless the shell is not executing  a  sub-
+              routine  call or _\be_\bx_\bp_\br does not correspond to a valid position in
+              the call stack.
+
+       c\bco\bom\bmm\bma\ban\bnd\bd [-\b-p\bpV\bVv\bv] _\bc_\bo_\bm_\bm_\ba_\bn_\bd [_\ba_\br_\bg ...]
+              Run _\bc_\bo_\bm_\bm_\ba_\bn_\bd with _\ba_\br_\bg_\bs  suppressing  the  normal  shell  function
+              lookup.  Only builtin commands or commands found in the P\bPA\bAT\bTH\bH are
+              executed.  If the -\b-p\bp option is given, the search for _\bc_\bo_\bm_\bm_\ba_\bn_\bd  is
+              performed  using  a default value for P\bPA\bAT\bTH\bH that is guaranteed to
+              find all of the standard utilities.  If  either  the  -\b-V\bV  or  -\b-v\bv
+              option is supplied, a description of _\bc_\bo_\bm_\bm_\ba_\bn_\bd is printed.  The -\b-v\bv
+              option causes a single word indicating the command or file  name
+              used to invoke _\bc_\bo_\bm_\bm_\ba_\bn_\bd to be displayed; the -\b-V\bV option produces a
+              more verbose description.  If the -\b-V\bV or -\b-v\bv option  is  supplied,
+              the  exit  status  is  0 if _\bc_\bo_\bm_\bm_\ba_\bn_\bd was found, and 1 if not.  If
+              neither option is supplied and an error occurred or _\bc_\bo_\bm_\bm_\ba_\bn_\bd can-
+              not  be found, the exit status is 127.  Otherwise, the exit sta-
+              tus of the c\bco\bom\bmm\bma\ban\bnd\bd builtin is the exit status of _\bc_\bo_\bm_\bm_\ba_\bn_\bd.
+
+       c\bco\bom\bmp\bpg\bge\ben\bn [_\bo_\bp_\bt_\bi_\bo_\bn] [_\bw_\bo_\br_\bd]
+              Generate possible completion matches for _\bw_\bo_\br_\bd according  to  the
+              _\bo_\bp_\bt_\bi_\bo_\bns,  which  may  be  any  option  accepted  by the c\bco\bom\bmp\bpl\ble\bet\bte\be
+              builtin with the exception of -\b-p\bp and -\b-r\br, and write  the  matches
+              to  the  standard  output.  When using the -\b-F\bF or -\b-C\bC options, the
+              various shell  variables  set  by  the  programmable  completion
+              facilities, while available, will not have useful values.
+
+              The  matches  will  be  generated in the same way as if the pro-
+              grammable completion code had generated  them  directly  from  a
+              completion specification with the same flags.  If _\bw_\bo_\br_\bd is speci-
+              fied, only those completions matching _\bw_\bo_\br_\bd will be displayed.
+
+              The return value is true unless an invalid option  is  supplied,
+              or no matches were generated.
+
+       c\bco\bom\bmp\bpl\ble\bet\bte\be  [-\b-a\bab\bbc\bcd\bde\bef\bfg\bgj\bjk\bks\bsu\buv\bv] [-\b-o\bo _\bc_\bo_\bm_\bp_\b-_\bo_\bp_\bt_\bi_\bo_\bn] [-\b-A\bA _\ba_\bc_\bt_\bi_\bo_\bn] [-\b-G\bG _\bg_\bl_\bo_\bb_\bp_\ba_\bt] [-\b-W\bW
+       _\bw_\bo_\br_\bd_\bl_\bi_\bs_\bt] [-\b-P\bP _\bp_\br_\be_\bf_\bi_\bx] [-\b-S\bS _\bs_\bu_\bf_\bf_\bi_\bx]
+              [-\b-X\bX _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt] [-\b-F\bF _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn] [-\b-C\bC _\bc_\bo_\bm_\bm_\ba_\bn_\bd] _\bn_\ba_\bm_\be [_\bn_\ba_\bm_\be _\b._\b._\b.]
+       c\bco\bom\bmp\bpl\ble\bet\bte\be -\b-p\bpr\br [_\bn_\ba_\bm_\be ...]
+              Specify  how arguments to each _\bn_\ba_\bm_\be should be completed.  If the
+              -\b-p\bp option is supplied, or if no options are  supplied,  existing
+              completion  specifications are printed in a way that allows them
+              to be reused as input.  The -\b-r\br option removes a completion spec-
+              ification  for each _\bn_\ba_\bm_\be, or, if no _\bn_\ba_\bm_\bes are supplied, all com-
+              pletion specifications.
+
+              The process of applying  these  completion  specifications  when
+              word  completion  is  attempted  is  described  above under P\bPr\bro\bo-\b-
+              g\bgr\bra\bam\bmm\bma\bab\bbl\ble\be C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn.
+
+              Other options, if specified, have the following  meanings.   The
+              arguments  to the -\b-G\bG, -\b-W\bW, and -\b-X\bX options (and, if necessary, the
+              -\b-P\bP and -\b-S\bS options) should be quoted to protect them from  expan-
+              sion before the c\bco\bom\bmp\bpl\ble\bet\bte\be builtin is invoked.
+              -\b-o\bo _\bc_\bo_\bm_\bp_\b-_\bo_\bp_\bt_\bi_\bo_\bn
+                      The  _\bc_\bo_\bm_\bp_\b-_\bo_\bp_\bt_\bi_\bo_\bn  controls  several aspects of the comp-
+                      spec's behavior beyond the simple generation of  comple-
+                      tions.  _\bc_\bo_\bm_\bp_\b-_\bo_\bp_\bt_\bi_\bo_\bn may be one of:
+                      b\bba\bas\bsh\bhd\bde\bef\bfa\bau\bul\blt\bt
+                              Perform the rest of the default b\bba\bas\bsh\bh completions
+                              if the compspec generates no matches.
+                      d\bde\bef\bfa\bau\bul\blt\bt Use readline's default  filename  completion  if
+                              the compspec generates no matches.
+                      d\bdi\bir\brn\bna\bam\bme\bes\bs
+                              Perform  directory  name completion if the comp-
+                              spec generates no matches.
+                      f\bfi\bil\ble\ben\bna\bam\bme\bes\bs
+                              Tell readline that the compspec generates  file-
+                              names,  so  it can perform any filename-specific
+                              processing (like adding  a  slash  to  directory
+                              names or suppressing trailing spaces).  Intended
+                              to be used with shell functions.
+                      n\bno\bos\bsp\bpa\bac\bce\be Tell  readline  not  to  append  a  space   (the
+                              default)  to  words  completed at the end of the
+                              line.
+              -\b-A\bA _\ba_\bc_\bt_\bi_\bo_\bn
+                      The _\ba_\bc_\bt_\bi_\bo_\bn may be one of the  following  to  generate  a
+                      list of possible completions:
+                      a\bal\bli\bia\bas\bs   Alias names.  May also be specified as -\b-a\ba.
+                      a\bar\brr\bra\bay\byv\bva\bar\br
+                              Array variable names.
+                      b\bbi\bin\bnd\bdi\bin\bng\bg R\bRe\bea\bad\bdl\bli\bin\bne\be key binding names.
+                      b\bbu\bui\bil\blt\bti\bin\bn Names  of  shell  builtin commands.  May also be
+                              specified as -\b-b\bb.
+                      c\bco\bom\bmm\bma\ban\bnd\bd Command names.  May also be specified as -\b-c\bc.
+                      d\bdi\bir\bre\bec\bct\bto\bor\bry\by
+                              Directory names.  May also be specified as -\b-d\bd.
+                      d\bdi\bis\bsa\bab\bbl\ble\bed\bd
+                              Names of disabled shell builtins.
+                      e\ben\bna\bab\bbl\ble\bed\bd Names of enabled shell builtins.
+                      e\bex\bxp\bpo\bor\brt\bt  Names of exported shell variables.  May also  be
+                              specified as -\b-e\be.
+                      f\bfi\bil\ble\be    File names.  May also be specified as -\b-f\bf.
+                      f\bfu\bun\bnc\bct\bti\bio\bon\bn
+                              Names of shell functions.
+                      g\bgr\bro\bou\bup\bp   Group names.  May also be specified as -\b-g\bg.
+                      h\bhe\bel\blp\bpt\bto\bop\bpi\bic\bc
+                              Help topics as accepted by the h\bhe\bel\blp\bp builtin.
+                      h\bho\bos\bst\btn\bna\bam\bme\be
+                              Hostnames,  as  taken from the file specified by
+                              the H\bHO\bOS\bST\bTF\bFI\bIL\bLE\bE shell variable.
+                      j\bjo\bob\bb     Job names, if job control is active.   May  also
+                              be specified as -\b-j\bj.
+                      k\bke\bey\byw\bwo\bor\brd\bd Shell  reserved words.  May also be specified as
+                              -\b-k\bk.
+                      r\bru\bun\bnn\bni\bin\bng\bg Names of running jobs, if job control is active.
+                      s\bse\ber\brv\bvi\bic\bce\be Service names.  May also be specified as -\b-s\bs.
+                      s\bse\bet\bto\bop\bpt\bt  Valid  arguments  for  the  -\b-o\bo option to the s\bse\bet\bt
+                              builtin.
+                      s\bsh\bho\bop\bpt\bt   Shell option names  as  accepted  by  the  s\bsh\bho\bop\bpt\bt
+                              builtin.
+                      s\bsi\big\bgn\bna\bal\bl  Signal names.
+                      s\bst\bto\bop\bpp\bpe\bed\bd Names of stopped jobs, if job control is active.
+                      u\bus\bse\ber\br    User names.  May also be specified as -\b-u\bu.
+                      v\bva\bar\bri\bia\bab\bbl\ble\be
+                              Names of all shell variables.  May also be spec-
+                              ified as -\b-v\bv.
+              -\b-G\bG _\bg_\bl_\bo_\bb_\bp_\ba_\bt
+                      The  filename  expansion  pattern _\bg_\bl_\bo_\bb_\bp_\ba_\bt is expanded to
+                      generate the possible completions.
+              -\b-W\bW _\bw_\bo_\br_\bd_\bl_\bi_\bs_\bt
+                      The _\bw_\bo_\br_\bd_\bl_\bi_\bs_\bt is split using the characters  in  the  I\bIF\bFS\bS
+                      special  variable as delimiters, and each resultant word
+                      is expanded.  The possible completions are  the  members
+                      of  the  resultant  list which match the word being com-
+                      pleted.
+              -\b-C\bC _\bc_\bo_\bm_\bm_\ba_\bn_\bd
+                      _\bc_\bo_\bm_\bm_\ba_\bn_\bd is executed in a subshell environment,  and  its
+                      output is used as the possible completions.
+              -\b-F\bF _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn
+                      The  shell  function _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn is executed in the current
+                      shell environment.  When it finishes, the possible  com-
+                      pletions  are  retrieved from the value of the C\bCO\bOM\bMP\bPR\bRE\bEP\bPL\bLY\bY
+                      array variable.
+              -\b-X\bX _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt
+                      _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt is a pattern as used for  filename  expansion.
+                      It is applied to the list of possible completions gener-
+                      ated by the preceding options and  arguments,  and  each
+                      completion  matching _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt is removed from the list.
+                      A leading !\b! in _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt negates the  pattern;  in  this
+                      case,  any completion not matching _\bf_\bi_\bl_\bt_\be_\br_\bp_\ba_\bt is removed.
+              -\b-P\bP _\bp_\br_\be_\bf_\bi_\bx
+                      _\bp_\br_\be_\bf_\bi_\bx is added at the beginning of each  possible  com-
+                      pletion after all other options have been applied.
+              -\b-S\bS _\bs_\bu_\bf_\bf_\bi_\bx
+                      _\bs_\bu_\bf_\bf_\bi_\bx is appended to each possible completion after all
+                      other options have been applied.
+
+              The return value is true unless an invalid option  is  supplied,
+              an  option  other than -\b-p\bp or -\b-r\br is supplied without a _\bn_\ba_\bm_\be argu-
+              ment, an attempt is made to remove  a  completion  specification
+              for a _\bn_\ba_\bm_\be for which no specification exists, or an error occurs
+              adding a completion specification.
+
+       c\bco\bon\bnt\bti\bin\bnu\bue\be [_\bn]
+              Resume the next iteration of the enclosing f\bfo\bor\br, w\bwh\bhi\bil\ble\be, u\bun\bnt\bti\bil\bl, or
+              s\bse\bel\ble\bec\bct\bt  loop.   If  _\bn  is specified, resume at the _\bnth enclosing
+              loop.  _\bn must be >= 1.  If _\bn  is  greater  than  the  number  of
+              enclosing  loops,  the  last  enclosing  loop (the ``top-level''
+              loop) is resumed.  The return value is 0 unless the shell is not
+              executing a loop when c\bco\bon\bnt\bti\bin\bnu\bue\be is executed.
+
+       d\bde\bec\bcl\bla\bar\bre\be [-\b-a\baf\bfF\bFi\bir\brt\btx\bx] [-\b-p\bp] [_\bn_\ba_\bm_\be[=_\bv_\ba_\bl_\bu_\be] ...]
+       t\bty\byp\bpe\bes\bse\bet\bt [-\b-a\baf\bfF\bFi\bir\brt\btx\bx] [-\b-p\bp] [_\bn_\ba_\bm_\be[=_\bv_\ba_\bl_\bu_\be] ...]
+              Declare  variables and/or give them attributes.  If no _\bn_\ba_\bm_\bes are
+              given then display the values of variables.  The -\b-p\bp option  will
+              display  the  attributes  and  values  of each _\bn_\ba_\bm_\be.  When -\b-p\bp is
+              used, additional options are ignored.  The  -\b-F\bF  option  inhibits
+              the  display of function definitions; only the function name and
+              attributes are printed.  If the e\bex\bxt\btd\bde\beb\bbu\bug\bg shell option is enabled
+              using  s\bsh\bho\bop\bpt\bt,  the  source  file  name and line number where the
+              function is defined  are  displayed  as  well.   The  -\b-F\bF  option
+              implies  -\b-f\bf.  The following options can be used to restrict out-
+              put to variables with the specified attribute or to  give  vari-
+              ables attributes:
+              -\b-a\ba     Each _\bn_\ba_\bm_\be is an array variable (see A\bAr\brr\bra\bay\bys\bs above).
+              -\b-f\bf     Use function names only.
+              -\b-i\bi     The variable is treated as an integer; arithmetic evalua-
+                     tion (see A\bAR\bRI\bIT\bTH\bHM\bME\bET\bTI\bIC\bC E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN )\b) is performed  when  the
+                     variable is assigned a value.
+              -\b-r\br     Make _\bn_\ba_\bm_\bes readonly.  These names cannot then be assigned
+                     values by subsequent assignment statements or unset.
+              -\b-t\bt     Give each _\bn_\ba_\bm_\be the  _\bt_\br_\ba_\bc_\be  attribute.   Traced  functions
+                     inherit the D\bDE\bEB\bBU\bUG\bG trap from the calling shell.  The trace
+                     attribute has no special meaning for variables.
+              -\b-x\bx     Mark _\bn_\ba_\bm_\bes for export  to  subsequent  commands  via  the
+                     environment.
+
+              Using  `+'  instead of `-' turns off the attribute instead, with
+              the exception that +\b+a\ba may not be used to destroy an array  vari-
+              able.   When  used in a function, makes each _\bn_\ba_\bm_\be local, as with
+              the l\blo\boc\bca\bal\bl command.  If a variable name is  followed  by  =_\bv_\ba_\bl_\bu_\be,
+              the  value of the variable is set to _\bv_\ba_\bl_\bu_\be.  The return value is
+              0 unless an invalid option is encountered, an attempt is made to
+              define  a  function  using ``-f foo=bar'', an attempt is made to
+              assign a value to a readonly variable, an  attempt  is  made  to
+              assign  a  value to an array variable without using the compound
+              assignment syntax (see A\bAr\brr\bra\bay\bys\bs above), one of the _\bn_\ba_\bm_\be_\bs is not  a
+              valid  shell variable name, an attempt is made to turn off read-
+              only status for a readonly variable, an attempt is made to  turn
+              off array status for an array variable, or an attempt is made to
+              display a non-existent function with -\b-f\bf.
+
+       d\bdi\bir\brs\bs [\b[-\b-c\bcl\blp\bpv\bv]\b] [\b[+\b+_\bn]\b] [\b[-\b-_\bn]\b]
+              Without options,  displays  the  list  of  currently  remembered
+              directories.   The  default  display  is  on  a single line with
+              directory names separated by spaces.  Directories are  added  to
+              the  list  with  the  p\bpu\bus\bsh\bhd\bd  command;  the  p\bpo\bop\bpd\bd command removes
+              entries from the list.
+              +\b+_\bn     Displays the _\bnth entry counting from the left of the list
+                     shown by d\bdi\bir\brs\bs when invoked without options, starting with
+                     zero.
+              -\b-_\bn     Displays the _\bnth entry counting from  the  right  of  the
+                     list shown by d\bdi\bir\brs\bs when invoked without options, starting
+                     with zero.
+              -\b-c\bc     Clears  the  directory  stack  by  deleting  all  of  the
+                     entries.
+              -\b-l\bl     Produces  a  longer  listing;  the default listing format
+                     uses a tilde to denote the home directory.
+              -\b-p\bp     Print the directory stack with one entry per line.
+              -\b-v\bv     Print the directory stack with one entry per  line,  pre-
+                     fixing each entry with its index in the stack.
+
+              The  return value is 0 unless an invalid option is supplied or _\bn
+              indexes beyond the end of the directory stack.
+
+       d\bdi\bis\bso\bow\bwn\bn [-\b-a\bar\br] [-\b-h\bh] [_\bj_\bo_\bb_\bs_\bp_\be_\bc ...]
+              Without options, each _\bj_\bo_\bb_\bs_\bp_\be_\bc  is  removed  from  the  table  of
+              active  jobs.   If  the  -\b-h\bh option is given, each _\bj_\bo_\bb_\bs_\bp_\be_\bc is not
+              removed from the table, but is marked so that S\bSI\bIG\bGH\bHU\bUP\bP is not sent
+              to  the  job  if  the shell receives a S\bSI\bIG\bGH\bHU\bUP\bP.  If no _\bj_\bo_\bb_\bs_\bp_\be_\bc is
+              present, and neither the -\b-a\ba nor the -\b-r\br option is  supplied,  the
+              _\bc_\bu_\br_\br_\be_\bn_\bt  _\bj_\bo_\bb  is used.  If no _\bj_\bo_\bb_\bs_\bp_\be_\bc is supplied, the -\b-a\ba option
+              means to remove or mark all jobs; the -\b-r\br option without  a  _\bj_\bo_\bb_\b-
+              _\bs_\bp_\be_\bc  argument  restricts operation to running jobs.  The return
+              value is 0 unless a _\bj_\bo_\bb_\bs_\bp_\be_\bc does not specify a valid job.
+
+       e\bec\bch\bho\bo [-\b-n\bne\beE\bE] [_\ba_\br_\bg ...]
+              Output the _\ba_\br_\bgs, separated by spaces,  followed  by  a  newline.
+              The return status is always 0.  If -\b-n\bn is specified, the trailing
+              newline is suppressed.  If the -\b-e\be option is  given,  interpreta-
+              tion  of  the following backslash-escaped characters is enabled.
+              The -\b-E\bE option disables the interpretation of these escape  char-
+              acters,  even  on systems where they are interpreted by default.
+              The x\bxp\bpg\bg_\b_e\bec\bch\bho\bo shell option may be used to  dynamically  determine
+              whether  or not e\bec\bch\bho\bo expands these escape characters by default.
+              e\bec\bch\bho\bo does not interpret -\b--\b- to mean the  end  of  options.   e\bec\bch\bho\bo
+              interprets the following escape sequences:
+              \\b\a\ba     alert (bell)
+              \\b\b\bb     backspace
+              \\b\c\bc     suppress trailing newline
+              \\b\e\be     an escape character
+              \\b\f\bf     form feed
+              \\b\n\bn     new line
+              \\b\r\br     carriage return
+              \\b\t\bt     horizontal tab
+              \\b\v\bv     vertical tab
+              \\b\\\b\     backslash
+              \\b\0\b0_\bn_\bn_\bn  the  eight-bit  character  whose value is the octal value
+                     _\bn_\bn_\bn (zero to three octal digits)
+              \\b\_\bn_\bn_\bn   the eight-bit character whose value is  the  octal  value
+                     _\bn_\bn_\bn (one to three octal digits)
+              \\b\x\bx_\bH_\bH   the  eight-bit  character  whose value is the hexadecimal
+                     value _\bH_\bH (one or two hex digits)
+
+       e\ben\bna\bab\bbl\ble\be [-\b-a\bad\bdn\bnp\bps\bs] [-\b-f\bf _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be] [_\bn_\ba_\bm_\be ...]
+              Enable and disable builtin shell commands.  Disabling a  builtin
+              allows a disk command which has the same name as a shell builtin
+              to be executed without specifying a full pathname,  even  though
+              the  shell  normally searches for builtins before disk commands.
+              If -\b-n\bn is used, each  _\bn_\ba_\bm_\be  is  disabled;  otherwise,  _\bn_\ba_\bm_\be_\bs  are
+              enabled.  For example, to use the t\bte\bes\bst\bt binary found via the P\bPA\bAT\bTH\bH
+              instead of the shell builtin version, run  ``enable  -n  test''.
+              The  -\b-f\bf  option  means to load the new builtin command _\bn_\ba_\bm_\be from
+              shared object _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be, on systems that support dynamic loading.
+              The  -\b-d\bd  option will delete a builtin previously loaded with -\b-f\bf.
+              If no _\bn_\ba_\bm_\be arguments are given, or if the -\b-p\bp option is supplied,
+              a list of shell builtins is printed.  With no other option argu-
+              ments, the list consists of all enabled shell builtins.   If  -\b-n\bn
+              is  supplied, only disabled builtins are printed.  If -\b-a\ba is sup-
+              plied, the list printed includes all builtins, with  an  indica-
+              tion  of whether or not each is enabled.  If -\b-s\bs is supplied, the
+              output is restricted to the POSIX _\bs_\bp_\be_\bc_\bi_\ba_\bl builtins.  The  return
+              value  is  0 unless a _\bn_\ba_\bm_\be is not a shell builtin or there is an
+              error loading a new builtin from a shared object.
+
+       e\bev\bva\bal\bl [_\ba_\br_\bg ...]
+              The _\ba_\br_\bgs are read and concatenated together into a  single  com-
+              mand.   This command is then read and executed by the shell, and
+              its exit status is returned as the value of e\bev\bva\bal\bl.  If there  are
+              no _\ba_\br_\bg_\bs, or only null arguments, e\bev\bva\bal\bl returns 0.
+
+       e\bex\bxe\bec\bc [-\b-c\bcl\bl] [-\b-a\ba _\bn_\ba_\bm_\be] [_\bc_\bo_\bm_\bm_\ba_\bn_\bd [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]]
+              If  _\bc_\bo_\bm_\bm_\ba_\bn_\bd is specified, it replaces the shell.  No new process
+              is created.  The _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs become the arguments to _\bc_\bo_\bm_\bm_\ba_\bn_\bd.   If
+              the -\b-l\bl option is supplied, the shell places a dash at the begin-
+              ning of the zeroth arg passed to _\bc_\bo_\bm_\bm_\ba_\bn_\bd.  This is what _\bl_\bo_\bg_\bi_\bn(1)
+              does.  The -\b-c\bc option causes _\bc_\bo_\bm_\bm_\ba_\bn_\bd to be executed with an empty
+              environment.  If -\b-a\ba is supplied, the shell passes  _\bn_\ba_\bm_\be  as  the
+              zeroth  argument  to the executed command.  If _\bc_\bo_\bm_\bm_\ba_\bn_\bd cannot be
+              executed for some reason, a non-interactive shell exits,  unless
+              the  shell  option e\bex\bxe\bec\bcf\bfa\bai\bil\bl is enabled, in which case it returns
+              failure.  An interactive shell returns failure if the file  can-
+              not  be executed.  If _\bc_\bo_\bm_\bm_\ba_\bn_\bd is not specified, any redirections
+              take effect in the current shell, and the return  status  is  0.
+              If there is a redirection error, the return status is 1.
+
+       e\bex\bxi\bit\bt [_\bn]
+              Cause  the  shell  to exit with a status of _\bn.  If _\bn is omitted,
+              the exit status is that of the last command executed.  A trap on
+              E\bEX\bXI\bIT\bT is executed before the shell terminates.
+
+       e\bex\bxp\bpo\bor\brt\bt [-\b-f\bfn\bn] [_\bn_\ba_\bm_\be[=_\bw_\bo_\br_\bd]] ...
+       e\bex\bxp\bpo\bor\brt\bt -\b-p\bp
+              The  supplied _\bn_\ba_\bm_\be_\bs are marked for automatic export to the envi-
+              ronment of subsequently executed commands.  If the -\b-f\bf option  is
+              given,  the _\bn_\ba_\bm_\be_\bs refer to functions.  If no _\bn_\ba_\bm_\be_\bs are given, or
+              if the -\b-p\bp option is supplied, a  list  of  all  names  that  are
+              exported  in  this  shell  is printed.  The -\b-n\bn option causes the
+              export property to be removed from each  _\bn_\ba_\bm_\be.   If  a  variable
+              name  is  followed by =_\bw_\bo_\br_\bd, the value of the variable is set to
+              _\bw_\bo_\br_\bd.  e\bex\bxp\bpo\bor\brt\bt returns an exit status  of  0  unless  an  invalid
+              option  is  encountered,  one  of the _\bn_\ba_\bm_\be_\bs is not a valid shell
+              variable name, or -\b-f\bf is supplied with a _\bn_\ba_\bm_\be that is not a func-
+              tion.
+
+       f\bfc\bc [-\b-e\be _\be_\bn_\ba_\bm_\be] [-\b-n\bnl\blr\br] [_\bf_\bi_\br_\bs_\bt] [_\bl_\ba_\bs_\bt]
+       f\bfc\bc -\b-s\bs [_\bp_\ba_\bt=_\br_\be_\bp] [_\bc_\bm_\bd]
+              Fix  Command.  In the first form, a range of commands from _\bf_\bi_\br_\bs_\bt
+              to _\bl_\ba_\bs_\bt is selected from the history list.  _\bF_\bi_\br_\bs_\bt and  _\bl_\ba_\bs_\bt  may
+              be  specified  as a string (to locate the last command beginning
+              with that string) or as a number  (an  index  into  the  history
+              list,  where  a  negative  number  is used as an offset from the
+              current command number).  If _\bl_\ba_\bs_\bt is not specified it is set  to
+              the  current  command  for listing (so that ``fc -l -10'' prints
+              the last 10 commands) and to _\bf_\bi_\br_\bs_\bt otherwise.  If _\bf_\bi_\br_\bs_\bt  is  not
+              specified  it is set to the previous command for editing and -16
+              for listing.
+
+              The -\b-n\bn option suppresses the command numbers when listing.   The
+              -\b-r\br  option reverses the order of the commands.  If the -\b-l\bl option
+              is given, the commands are listed on  standard  output.   Other-
+              wise,  the editor given by _\be_\bn_\ba_\bm_\be is invoked on a file containing
+              those commands.  If _\be_\bn_\ba_\bm_\be is not given, the value of the  F\bFC\bCE\bED\bDI\bIT\bT
+              variable  is used, and the value of E\bED\bDI\bIT\bTO\bOR\bR if F\bFC\bCE\bED\bDI\bIT\bT is not set.
+              If neither variable is set, is used.  When editing is  complete,
+              the edited commands are echoed and executed.
+
+              In  the  second form, _\bc_\bo_\bm_\bm_\ba_\bn_\bd is re-executed after each instance
+              of _\bp_\ba_\bt is replaced by _\br_\be_\bp.  A useful alias to use with  this  is
+              ``r="fc  -s"'',  so  that  typing ``r cc'' runs the last command
+              beginning with ``cc'' and typing ``r'' re-executes the last com-
+              mand.
+
+              If  the  first  form  is  used,  the return value is 0 unless an
+              invalid option is encountered or _\bf_\bi_\br_\bs_\bt or _\bl_\ba_\bs_\bt  specify  history
+              lines  out  of  range.  If the -\b-e\be option is supplied, the return
+              value is the value of the last command executed or failure if an
+              error occurs with the temporary file of commands.  If the second
+              form is used, the return status is that of the  command  re-exe-
+              cuted,  unless  _\bc_\bm_\bd  does  not  specify a valid history line, in
+              which case f\bfc\bc returns failure.
+
+       f\bfg\bg [_\bj_\bo_\bb_\bs_\bp_\be_\bc]
+              Resume _\bj_\bo_\bb_\bs_\bp_\be_\bc in the foreground, and make it the  current  job.
+              If _\bj_\bo_\bb_\bs_\bp_\be_\bc is not present, the shell's notion of the _\bc_\bu_\br_\br_\be_\bn_\bt _\bj_\bo_\bb
+              is used.  The return value is that of the  command  placed  into
+              the  foreground,  or failure if run when job control is disabled
+              or, when run with job control enabled, if _\bj_\bo_\bb_\bs_\bp_\be_\bc does not spec-
+              ify  a  valid  job  or  _\bj_\bo_\bb_\bs_\bp_\be_\bc specifies a job that was started
+              without job control.
+
+       g\bge\bet\bto\bop\bpt\bts\bs _\bo_\bp_\bt_\bs_\bt_\br_\bi_\bn_\bg _\bn_\ba_\bm_\be [_\ba_\br_\bg_\bs]
+              g\bge\bet\bto\bop\bpt\bts\bs is used by shell procedures to parse positional  parame-
+              ters.   _\bo_\bp_\bt_\bs_\bt_\br_\bi_\bn_\bg  contains  the  option characters to be recog-
+              nized; if a character is followed by  a  colon,  the  option  is
+              expected  to have an argument, which should be separated from it
+              by white space.  The colon and question mark characters may  not
+              be  used as option characters.  Each time it is invoked, g\bge\bet\bto\bop\bpt\bts\bs
+              places the next option in the shell variable _\bn_\ba_\bm_\be,  initializing
+              _\bn_\ba_\bm_\be if it does not exist, and the index of the next argument to
+              be processed into the variable O\bOP\bPT\bTI\bIN\bND\bD.  O\bOP\bPT\bTI\bIN\bND\bD is initialized to
+              1  each  time  the  shell or a shell script is invoked.  When an
+              option requires an argument, g\bge\bet\bto\bop\bpt\bts\bs places that  argument  into
+              the  variable O\bOP\bPT\bTA\bAR\bRG\bG.  The shell does not reset O\bOP\bPT\bTI\bIN\bND\bD automati-
+              cally; it must be  manually  reset  between  multiple  calls  to
+              g\bge\bet\bto\bop\bpt\bts\bs within the same shell invocation if a new set of parame-
+              ters is to be used.
+
+              When the end of options is encountered,  g\bge\bet\bto\bop\bpt\bts\bs  exits  with  a
+              return  value  greater than zero.  O\bOP\bPT\bTI\bIN\bND\bD is set to the index of
+              the first non-option argument, and n\bna\bam\bme\be is set to ?.
+
+              g\bge\bet\bto\bop\bpt\bts\bs normally parses the positional parameters, but  if  more
+              arguments are given in _\ba_\br_\bg_\bs, g\bge\bet\bto\bop\bpt\bts\bs parses those instead.
+
+              g\bge\bet\bto\bop\bpt\bts\bs  can  report errors in two ways.  If the first character
+              of _\bo_\bp_\bt_\bs_\bt_\br_\bi_\bn_\bg is a colon, _\bs_\bi_\bl_\be_\bn_\bt error  reporting  is  used.   In
+              normal  operation  diagnostic  messages are printed when invalid
+              options or missing option arguments  are  encountered.   If  the
+              variable  O\bOP\bPT\bTE\bER\bRR\bR  is  set  to  0, no error messages will be dis-
+              played, even if the first character of _\bo_\bp_\bt_\bs_\bt_\br_\bi_\bn_\bg is not a colon.
+
+              If an invalid option is seen, g\bge\bet\bto\bop\bpt\bts\bs places ? into _\bn_\ba_\bm_\be and, if
+              not silent, prints an  error  message  and  unsets  O\bOP\bPT\bTA\bAR\bRG\bG.   If
+              g\bge\bet\bto\bop\bpt\bts\bs  is  silent,  the  option  character  found is placed in
+              O\bOP\bPT\bTA\bAR\bRG\bG and no diagnostic message is printed.
+
+              If a required argument is not found, and g\bge\bet\bto\bop\bpt\bts\bs is not  silent,
+              a  question  mark  (?\b?) is placed in _\bn_\ba_\bm_\be, O\bOP\bPT\bTA\bAR\bRG\bG is unset, and a
+              diagnostic message is printed.  If g\bge\bet\bto\bop\bpt\bts\bs  is  silent,  then  a
+              colon  (:\b:)  is  placed  in  _\bn_\ba_\bm_\be and O\bOP\bPT\bTA\bAR\bRG\bG is set to the option
+              character found.
+
+              g\bge\bet\bto\bop\bpt\bts\bs returns true if an option, specified or unspecified,  is
+              found.  It returns false if the end of options is encountered or
+              an error occurs.
+
+       h\bha\bas\bsh\bh [-\b-l\blr\br] [-\b-p\bp _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be] [-\b-d\bdt\bt] [_\bn_\ba_\bm_\be]
+              For each _\bn_\ba_\bm_\be, the full file name of the command  is  determined
+              by searching the directories in $\b$P\bPA\bAT\bTH\bH and remembered.  If the -\b-p\bp
+              option is supplied, no path search is performed, and _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be is
+              used as the full file name of the command.  The -\b-r\br option causes
+              the shell to forget all remembered  locations.   The  -\b-d\bd  option
+              causes the shell to forget the remembered location of each _\bn_\ba_\bm_\be.
+              If the -\b-t\bt option is supplied, the full pathname  to  which  each
+              _\bn_\ba_\bm_\be  corresponds  is  printed.   If multiple _\bn_\ba_\bm_\be arguments are
+              supplied with -\b-t\bt, the _\bn_\ba_\bm_\be is printed  before  the  hashed  full
+              pathname.  The -\b-l\bl option causes output to be displayed in a for-
+              mat that may be reused as input.  If no arguments are given,  or
+              if only -\b-l\bl is supplied, information about remembered commands is
+              printed.  The return status is true unless a _\bn_\ba_\bm_\be is  not  found
+              or an invalid option is supplied.
+
+       h\bhe\bel\blp\bp [-\b-s\bs] [_\bp_\ba_\bt_\bt_\be_\br_\bn]
+              Display  helpful information about builtin commands.  If _\bp_\ba_\bt_\bt_\be_\br_\bn
+              is specified, h\bhe\bel\blp\bp gives detailed help on all commands  matching
+              _\bp_\ba_\bt_\bt_\be_\br_\bn;  otherwise  help for all the builtins and shell control
+              structures is printed.  The -\b-s\bs option restricts the  information
+              displayed  to  a  short  usage synopsis.  The return status is 0
+              unless no command matches _\bp_\ba_\bt_\bt_\be_\br_\bn.
+
+       h\bhi\bis\bst\bto\bor\bry\by [\b[_\bn]\b]
+       h\bhi\bis\bst\bto\bor\bry\by -\b-c\bc
+       h\bhi\bis\bst\bto\bor\bry\by -\b-d\bd _\bo_\bf_\bf_\bs_\be_\bt
+       h\bhi\bis\bst\bto\bor\bry\by -\b-a\ban\bnr\brw\bw [_\bf_\bi_\bl_\be_\bn_\ba_\bm_\be]
+       h\bhi\bis\bst\bto\bor\bry\by -\b-p\bp _\ba_\br_\bg [_\ba_\br_\bg _\b._\b._\b.]
+       h\bhi\bis\bst\bto\bor\bry\by -\b-s\bs _\ba_\br_\bg [_\ba_\br_\bg _\b._\b._\b.]
+              With no options, display the command history list with line num-
+              bers.  Lines listed with a *\b* have been modified.  An argument of
+              _\bn lists only the last _\bn lines.  If the shell variable  H\bHI\bIS\bST\bTT\bTI\bIM\bME\bE-\b-
+              F\bFO\bOR\bRM\bMA\bAT\bT  is  set  and not null, it is used as a format string for
+              _\bs_\bt_\br_\bf_\bt_\bi_\bm_\be(3) to display the time stamp associated with each  dis-
+              played  history  entry.  No intervening blank is printed between
+              the formatted time stamp and the history line.  If  _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be  is
+              supplied,  it  is  used as the name of the history file; if not,
+              the value of H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE is used.  Options, if supplied,  have  the
+              following meanings:
+              -\b-c\bc     Clear the history list by deleting all the entries.
+              -\b-d\bd _\bo_\bf_\bf_\bs_\be_\bt
+                     Delete the history entry at position _\bo_\bf_\bf_\bs_\be_\bt.
+              -\b-a\ba     Append  the  ``new'' history lines (history lines entered
+                     since the beginning of the current b\bba\bas\bsh\bh session)  to  the
+                     history file.
+              -\b-n\bn     Read  the history lines not already read from the history
+                     file into the current  history  list.   These  are  lines
+                     appended  to  the history file since the beginning of the
+                     current b\bba\bas\bsh\bh session.
+              -\b-r\br     Read the contents of the history file and use them as the
+                     current history.
+              -\b-w\bw     Write  the current history to the history file, overwrit-
+                     ing the history file's contents.
+              -\b-p\bp     Perform history substitution on the  following  _\ba_\br_\bg_\bs  and
+                     display  the  result  on  the  standard output.  Does not
+                     store the results in the history list.  Each _\ba_\br_\bg must  be
+                     quoted to disable normal history expansion.
+              -\b-s\bs     Store  the  _\ba_\br_\bg_\bs  in  the history list as a single entry.
+                     The last command in the history list  is  removed  before
+                     the _\ba_\br_\bg_\bs are added.
+
+              If the H\bHI\bIS\bST\bTT\bTI\bIM\bME\bEF\bFO\bOR\bRM\bMA\bAT\bT is set, the time stamp information associ-
+              ated with each history entry is written  to  the  history  file.
+              The  return  value is 0 unless an invalid option is encountered,
+              an error occurs while reading or writing the  history  file,  an
+              invalid  _\bo_\bf_\bf_\bs_\be_\bt is supplied as an argument to -\b-d\bd, or the history
+              expansion supplied as an argument to -\b-p\bp fails.
+
+       j\bjo\bob\bbs\bs [-\b-l\bln\bnp\bpr\brs\bs] [ _\bj_\bo_\bb_\bs_\bp_\be_\bc ... ]
+       j\bjo\bob\bbs\bs -\b-x\bx _\bc_\bo_\bm_\bm_\ba_\bn_\bd [ _\ba_\br_\bg_\bs ... ]
+              The first form lists the active jobs.  The options have the fol-
+              lowing meanings:
+              -\b-l\bl     List process IDs in addition to the normal information.
+              -\b-p\bp     List  only  the  process  ID  of  the job's process group
+                     leader.
+              -\b-n\bn     Display information only about  jobs  that  have  changed
+                     status  since the user was last notified of their status.
+              -\b-r\br     Restrict output to running jobs.
+              -\b-s\bs     Restrict output to stopped jobs.
+
+              If _\bj_\bo_\bb_\bs_\bp_\be_\bc is given, output is restricted to  information  about
+              that  job.   The  return status is 0 unless an invalid option is
+              encountered or an invalid _\bj_\bo_\bb_\bs_\bp_\be_\bc is supplied.
+
+              If the -\b-x\bx option is supplied, j\bjo\bob\bbs\bs replaces any _\bj_\bo_\bb_\bs_\bp_\be_\bc found in
+              _\bc_\bo_\bm_\bm_\ba_\bn_\bd  or  _\ba_\br_\bg_\bs  with  the corresponding process group ID, and
+              executes _\bc_\bo_\bm_\bm_\ba_\bn_\bd passing it _\ba_\br_\bg_\bs, returning its exit status.
+
+       k\bki\bil\bll\bl [-\b-s\bs _\bs_\bi_\bg_\bs_\bp_\be_\bc | -\b-n\bn _\bs_\bi_\bg_\bn_\bu_\bm | -\b-_\bs_\bi_\bg_\bs_\bp_\be_\bc] [_\bp_\bi_\bd | _\bj_\bo_\bb_\bs_\bp_\be_\bc] ...
+       k\bki\bil\bll\bl -\b-l\bl [_\bs_\bi_\bg_\bs_\bp_\be_\bc | _\be_\bx_\bi_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs]
+              Send the signal named by _\bs_\bi_\bg_\bs_\bp_\be_\bc  or  _\bs_\bi_\bg_\bn_\bu_\bm  to  the  processes
+              named  by  _\bp_\bi_\bd or _\bj_\bo_\bb_\bs_\bp_\be_\bc.  _\bs_\bi_\bg_\bs_\bp_\be_\bc is either a signal name such
+              as S\bSI\bIG\bGK\bKI\bIL\bLL\bL or a signal number; _\bs_\bi_\bg_\bn_\bu_\bm is a  signal  number.   If
+              _\bs_\bi_\bg_\bs_\bp_\be_\bc  is a signal name, the name may be given with or without
+              the S\bSI\bIG\bG prefix.  If _\bs_\bi_\bg_\bs_\bp_\be_\bc is  not  present,  then  S\bSI\bIG\bGT\bTE\bER\bRM\bM  is
+              assumed.   An  argument  of  -\b-l\bl  lists the signal names.  If any
+              arguments are supplied when -\b-l\bl is given, the names of  the  sig-
+              nals  corresponding  to the arguments are listed, and the return
+              status is 0.  The _\be_\bx_\bi_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs argument to -\b-l\bl is a number  speci-
+              fying  either  a  signal  number or the exit status of a process
+              terminated by a signal.  k\bki\bil\bll\bl returns true if at least one  sig-
+              nal  was  successfully  sent,  or false if an error occurs or an
+              invalid option is encountered.
+
+       l\ble\bet\bt _\ba_\br_\bg [_\ba_\br_\bg ...]
+              Each _\ba_\br_\bg is an arithmetic expression to be evaluated (see A\bAR\bRI\bIT\bTH\bH-\b-
+              M\bME\bET\bTI\bIC\bC  E\bEV\bVA\bAL\bLU\bUA\bAT\bTI\bIO\bON\bN).  If the last _\ba_\br_\bg evaluates to 0, l\ble\bet\bt returns
+              1; 0 is returned otherwise.
+
+       l\blo\boc\bca\bal\bl [_\bo_\bp_\bt_\bi_\bo_\bn] [_\bn_\ba_\bm_\be[=_\bv_\ba_\bl_\bu_\be] ...]
+              For each argument, a local variable named _\bn_\ba_\bm_\be is  created,  and
+              assigned  _\bv_\ba_\bl_\bu_\be.   The _\bo_\bp_\bt_\bi_\bo_\bn can be any of the options accepted
+              by d\bde\bec\bcl\bla\bar\bre\be.  When l\blo\boc\bca\bal\bl is used within a function, it causes the
+              variable  _\bn_\ba_\bm_\be  to have a visible scope restricted to that func-
+              tion and its children.  With no operands, l\blo\boc\bca\bal\bl writes a list of
+              local  variables  to the standard output.  It is an error to use
+              l\blo\boc\bca\bal\bl when not within a function.  The return status is 0 unless
+              l\blo\boc\bca\bal\bl  is  used outside a function, an invalid _\bn_\ba_\bm_\be is supplied,
+              or _\bn_\ba_\bm_\be is a readonly variable.
+
+       l\blo\bog\bgo\bou\but\bt Exit a login shell.
+
+       p\bpo\bop\bpd\bd [-n\bn] [+_\bn] [-_\bn]
+              Removes entries from the directory stack.   With  no  arguments,
+              removes  the  top directory from the stack, and performs a c\bcd\bd to
+              the new top directory.  Arguments, if supplied, have the follow-
+              ing meanings:
+              +\b+_\bn     Removes  the _\bnth entry counting from the left of the list
+                     shown by d\bdi\bir\brs\bs, starting with zero.  For  example:  ``popd
+                     +0'' removes the first directory, ``popd +1'' the second.
+              -\b-_\bn     Removes the _\bnth entry counting from the right of the list
+                     shown  by  d\bdi\bir\brs\bs, starting with zero.  For example: ``popd
+                     -0'' removes the last directory, ``popd -1'' the next  to
+                     last.
+              -\b-n\bn     Suppresses  the  normal change of directory when removing
+                     directories from the stack, so that  only  the  stack  is
+                     manipulated.
+
+              If  the p\bpo\bop\bpd\bd command is successful, a d\bdi\bir\brs\bs is performed as well,
+              and the return status is 0.  p\bpo\bop\bpd\bd returns false  if  an  invalid
+              option is encountered, the directory stack is empty, a non-exis-
+              tent directory stack entry is specified, or the directory change
+              fails.
+
+       p\bpr\bri\bin\bnt\btf\bf _\bf_\bo_\br_\bm_\ba_\bt [_\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs]
+              Write  the  formatted _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs to the standard output under the
+              control of the _\bf_\bo_\br_\bm_\ba_\bt.  The _\bf_\bo_\br_\bm_\ba_\bt is a character  string  which
+              contains  three  types  of  objects: plain characters, which are
+              simply copied to standard output,  character  escape  sequences,
+              which  are converted and copied to the standard output, and for-
+              mat specifications, each of which causes printing  of  the  next
+              successive _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt.  In addition to the standard _\bp_\br_\bi_\bn_\bt_\bf(1) for-
+              mats, %\b%b\bb causes p\bpr\bri\bin\bnt\btf\bf to expand backslash escape  sequences  in
+              the  corresponding  _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt  (except that \\b\c\bc terminates output,
+              backslashes in \\b\'\b', \\b\"\b", and \\b\?\b? are not removed, and octal escapes
+              beginning  with \\b\0\b0 may contain up to four digits), and %\b%q\bq causes
+              p\bpr\bri\bin\bnt\btf\bf to output the corresponding _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt in a format that can
+              be reused as shell input.
+
+              The  _\bf_\bo_\br_\bm_\ba_\bt  is  reused as necessary to consume all of the _\ba_\br_\bg_\bu_\b-
+              _\bm_\be_\bn_\bt_\bs.  If the _\bf_\bo_\br_\bm_\ba_\bt requires more _\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs than are supplied,
+              the  extra  format  specifications  behave as if a zero value or
+              null string, as appropriate,  had  been  supplied.   The  return
+              value is zero on success, non-zero on failure.
+
+       p\bpu\bus\bsh\bhd\bd [-\b-n\bn] [_\bd_\bi_\br]
+       p\bpu\bus\bsh\bhd\bd [-\b-n\bn] [+_\bn] [-_\bn]
+              Adds  a  directory to the top of the directory stack, or rotates
+              the stack, making the new top of the stack the  current  working
+              directory.  With no arguments, exchanges the top two directories
+              and returns 0, unless the directory stack is empty.   Arguments,
+              if supplied, have the following meanings:
+              +\b+_\bn     Rotates  the  stack  so  that the _\bnth directory (counting
+                     from the left of the list shown by  d\bdi\bir\brs\bs,  starting  with
+                     zero) is at the top.
+              -\b-_\bn     Rotates  the  stack  so  that the _\bnth directory (counting
+                     from the right of the list shown by d\bdi\bir\brs\bs,  starting  with
+                     zero) is at the top.
+              -\b-n\bn     Suppresses  the  normal  change  of directory when adding
+                     directories to the stack,  so  that  only  the  stack  is
+                     manipulated.
+              _\bd_\bi_\br    Adds _\bd_\bi_\br to the directory stack at the top, making it the
+                     new current working directory.
+
+              If the p\bpu\bus\bsh\bhd\bd command is successful, a d\bdi\bir\brs\bs is performed as well.
+              If  the first form is used, p\bpu\bus\bsh\bhd\bd returns 0 unless the cd to _\bd_\bi_\br
+              fails.  With the second form, p\bpu\bus\bsh\bhd\bd returns 0 unless the  direc-
+              tory  stack  is empty, a non-existent directory stack element is
+              specified, or the directory change to the specified new  current
+              directory fails.
+
+       p\bpw\bwd\bd [-\b-L\bLP\bP]
+              Print  the  absolute  pathname of the current working directory.
+              The pathname printed contains no symbolic links if the -\b-P\bP option
+              is supplied or the -\b-o\bo p\bph\bhy\bys\bsi\bic\bca\bal\bl option to the s\bse\bet\bt builtin command
+              is enabled.  If the -\b-L\bL option is used, the pathname printed  may
+              contain  symbolic links.  The return status is 0 unless an error
+              occurs while reading the name of the  current  directory  or  an
+              invalid option is supplied.
+
+       r\bre\bea\bad\bd [-\b-e\ber\brs\bs] [-\b-u\bu _\bf_\bd] [-\b-t\bt _\bt_\bi_\bm_\be_\bo_\bu_\bt] [-\b-a\ba _\ba_\bn_\ba_\bm_\be] [-\b-p\bp _\bp_\br_\bo_\bm_\bp_\bt] [-\b-n\bn _\bn_\bc_\bh_\ba_\br_\bs] [-\b-d\bd
+       _\bd_\be_\bl_\bi_\bm] [_\bn_\ba_\bm_\be ...]
+              One  line  is  read  from  the  standard input, or from the file
+              descriptor _\bf_\bd supplied as an argument to the -\b-u\bu option, and  the
+              first word is assigned to the first _\bn_\ba_\bm_\be, the second word to the
+              second  _\bn_\ba_\bm_\be,  and  so  on,  with  leftover  words   and   their
+              intervening  separators assigned to the last _\bn_\ba_\bm_\be.  If there are
+              fewer words read from the input stream than names, the remaining
+              names are assigned empty values.  The characters in I\bIF\bFS\bS are used
+              to split the line into words.  The backslash character  (\\b\)  may
+              be  used  to  remove  any special meaning for the next character
+              read and for line continuation.  Options, if supplied, have  the
+              following meanings:
+              -\b-a\ba _\ba_\bn_\ba_\bm_\be
+                     The words are assigned to sequential indices of the array
+                     variable _\ba_\bn_\ba_\bm_\be, starting at 0.  _\ba_\bn_\ba_\bm_\be is unset before any
+                     new  values  are  assigned.   Other  _\bn_\ba_\bm_\be  arguments  are
+                     ignored.
+              -\b-d\bd _\bd_\be_\bl_\bi_\bm
+                     The first character of _\bd_\be_\bl_\bi_\bm is  used  to  terminate  the
+                     input line, rather than newline.
+              -\b-e\be     If the standard input is coming from a terminal, r\bre\bea\bad\bdl\bli\bin\bne\be
+                     (see R\bRE\bEA\bAD\bDL\bLI\bIN\bNE\bE above) is used to obtain the line.
+              -\b-n\bn _\bn_\bc_\bh_\ba_\br_\bs
+                     r\bre\bea\bad\bd returns after reading _\bn_\bc_\bh_\ba_\br_\bs characters rather  than
+                     waiting for a complete line of input.
+              -\b-p\bp _\bp_\br_\bo_\bm_\bp_\bt
+                     Display _\bp_\br_\bo_\bm_\bp_\bt on standard error, without a trailing new-
+                     line, before attempting to read any input.  The prompt is
+                     displayed only if input is coming from a terminal.
+              -\b-r\br     Backslash does not act as an escape character.  The back-
+                     slash is considered to be part of the line.  In  particu-
+                     lar,  a  backslash-newline pair may not be used as a line
+                     continuation.
+              -\b-s\bs     Silent mode.  If input is coming from a terminal, charac-
+                     ters are not echoed.
+              -\b-t\bt _\bt_\bi_\bm_\be_\bo_\bu_\bt
+                     Cause  r\bre\bea\bad\bd  to time out and return failure if a complete
+                     line of input is not read within _\bt_\bi_\bm_\be_\bo_\bu_\bt  seconds.   This
+                     option  has  no  effect if r\bre\bea\bad\bd is not reading input from
+                     the terminal or a pipe.
+              -\b-u\bu _\bf_\bd  Read input from file descriptor _\bf_\bd.
+
+              If no _\bn_\ba_\bm_\be_\bs are supplied, the line read is assigned to the vari-
+              able  R\bRE\bEP\bPL\bLY\bY.   The  return  code  is zero, unless end-of-file is
+              encountered, r\bre\bea\bad\bd times out, or an invalid  file  descriptor  is
+              supplied as the argument to -\b-u\bu.
+
+       r\bre\bea\bad\bdo\bon\bnl\bly\by [-\b-a\bap\bpf\bf] [_\bn_\ba_\bm_\be[=_\bw_\bo_\br_\bd] ...]
+              The  given  _\bn_\ba_\bm_\be_\bs are marked readonly; the values of these _\bn_\ba_\bm_\be_\bs
+              may not be changed by subsequent assignment.  If the  -\b-f\bf  option
+              is  supplied,  the  functions  corresponding to the _\bn_\ba_\bm_\be_\bs are so
+              marked.  The -\b-a\ba option restricts the variables to arrays.  If no
+              _\bn_\ba_\bm_\be  arguments  are  given,  or if the -\b-p\bp option is supplied, a
+              list of all readonly names is printed.   The  -\b-p\bp  option  causes
+              output  to be displayed in a format that may be reused as input.
+              If a variable name is followed by =_\bw_\bo_\br_\bd, the value of the  vari-
+              able  is  set to _\bw_\bo_\br_\bd.  The return status is 0 unless an invalid
+              option is encountered, one of the _\bn_\ba_\bm_\be_\bs is  not  a  valid  shell
+              variable name, or -\b-f\bf is supplied with a _\bn_\ba_\bm_\be that is not a func-
+              tion.
+
+       r\bre\bet\btu\bur\brn\bn [_\bn]
+              Causes a function to exit with the return value specified by  _\bn.
+              If  _\bn  is omitted, the return status is that of the last command
+              executed in the function body.  If used outside a function,  but
+              during  execution  of  a  script  by the .\b.  (s\bso\bou\bur\brc\bce\be) command, it
+              causes the shell to stop executing that script and return either
+              _\bn  or  the  exit  status of the last command executed within the
+              script as the exit status of the  script.   If  used  outside  a
+              function  and  not during execution of a script by .\b., the return
+              status is false.  Any command associated with the R\bRE\bET\bTU\bUR\bRN\bN trap is
+              executed  before execution resumes after the function or script.
+
+       s\bse\bet\bt [-\b--\b-a\bab\bbe\bef\bfh\bhk\bkm\bmn\bnp\bpt\btu\buv\bvx\bxB\bBC\bCH\bHP\bP] [-\b-o\bo _\bo_\bp_\bt_\bi_\bo_\bn] [_\ba_\br_\bg ...]
+              Without options, the name and value of each shell  variable  are
+              displayed  in  a format that can be reused as input.  The output
+              is sorted according to the current  locale.   When  options  are
+              specified,  they  set  or unset shell attributes.  Any arguments
+              remaining after the options are processed are treated as  values
+              for the positional parameters and are assigned, in order, to $\b$1\b1,
+              $\b$2\b2, .\b..\b..\b.  $\b$_\bn.  Options, if specified, have  the  following  mean-
+              ings:
+              -\b-a\ba      Automatically  mark  variables  and  functions which are
+                      modified or created for export  to  the  environment  of
+                      subsequent commands.
+              -\b-b\bb      Report  the status of terminated background jobs immedi-
+                      ately, rather than before the next primary prompt.  This
+                      is effective only when job control is enabled.
+              -\b-e\be      Exit  immediately if a _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd (see S\bSH\bHE\bEL\bLL\bL G\bGR\bRA\bAM\bMM\bMA\bAR\bR
+                      above) exits with a non-zero status.  The shell does not
+                      exit  if  the  command that fails is part of the command
+                      list immediately following a  w\bwh\bhi\bil\ble\be  or  u\bun\bnt\bti\bil\bl  keyword,
+                      part  of the test in an _\bi_\bf statement, part of a &\b&&\b& or |\b||\b|
+                      list, or if the command's return value is being inverted
+                      via  !\b!.   A  trap on E\bER\bRR\bR, if set, is executed before the
+                      shell exits.
+              -\b-f\bf      Disable pathname expansion.
+              -\b-h\bh      Remember the location of commands as they are looked  up
+                      for execution.  This is enabled by default.
+              -\b-k\bk      All  arguments  in the form of assignment statements are
+                      placed in the environment for a command, not just  those
+                      that precede the command name.
+              -\b-m\bm      Monitor  mode.   Job control is enabled.  This option is
+                      on by default for interactive  shells  on  systems  that
+                      support  it  (see  J\bJO\bOB\bB  C\bCO\bON\bNT\bTR\bRO\bOL\bL above).  Background pro-
+                      cesses run in a separate process group and a  line  con-
+                      taining  their exit status is printed upon their comple-
+                      tion.
+              -\b-n\bn      Read commands but do not execute them.  This may be used
+                      to  check  a  shell  script  for syntax errors.  This is
+                      ignored by interactive shells.
+              -\b-o\bo _\bo_\bp_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be
+                      The _\bo_\bp_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be can be one of the following:
+                      a\bal\bll\ble\bex\bxp\bpo\bor\brt\bt
+                              Same as -\b-a\ba.
+                      b\bbr\bra\bac\bce\bee\bex\bxp\bpa\ban\bnd\bd
+                              Same as -\b-B\bB.
+                      e\bem\bma\bac\bcs\bs   Use an emacs-style command line  editing  inter-
+                              face.  This is enabled by default when the shell
+                              is interactive, unless the shell is started with
+                              the -\b--\b-n\bno\boe\bed\bdi\bit\bti\bin\bng\bg option.
+                      e\ber\brr\brt\btr\bra\bac\bce\be
+                              Same as -\b-E\bE.
+                      f\bfu\bun\bnc\bct\btr\bra\bac\bce\be
+                              Same as -\b-T\bT.
+                      e\ber\brr\bre\bex\bxi\bit\bt Same as -\b-e\be.
+                      h\bha\bas\bsh\bha\bal\bll\bl Same as -\b-h\bh.
+                      h\bhi\bis\bst\bte\bex\bxp\bpa\ban\bnd\bd
+                              Same as -\b-H\bH.
+                      h\bhi\bis\bst\bto\bor\bry\by Enable command history, as described above under
+                              H\bHI\bIS\bST\bTO\bOR\bRY\bY.  This option is on by default in inter-
+                              active shells.
+                      i\big\bgn\bno\bor\bre\bee\beo\bof\bf
+                              The   effect   is   as   if  the  shell  command
+                              ``IGNOREEOF=10'' had been  executed  (see  S\bSh\bhe\bel\bll\bl
+                              V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs above).
+                      k\bke\bey\byw\bwo\bor\brd\bd Same as -\b-k\bk.
+                      m\bmo\bon\bni\bit\bto\bor\br Same as -\b-m\bm.
+                      n\bno\boc\bcl\blo\bob\bbb\bbe\ber\br
+                              Same as -\b-C\bC.
+                      n\bno\boe\bex\bxe\bec\bc  Same as -\b-n\bn.
+                      n\bno\bog\bgl\blo\bob\bb  Same as -\b-f\bf.  n\bno\bol\blo\bog\bg Currently ignored.
+                      n\bno\bot\bti\bif\bfy\by  Same as -\b-b\bb.
+                      n\bno\bou\bun\bns\bse\bet\bt Same as -\b-u\bu.
+                      o\bon\bne\bec\bcm\bmd\bd  Same as -\b-t\bt.
+                      p\bph\bhy\bys\bsi\bic\bca\bal\bl
+                              Same as -\b-P\bP.
+                      p\bpi\bip\bpe\bef\bfa\bai\bil\bl
+                              If  set,  the  return value of a pipeline is the
+                              value of the last (rightmost)  command  to  exit
+                              with  a non-zero status, or zero if all commands
+                              in the pipeline exit successfully.  This  option
+                              is disabled by default.
+                      p\bpo\bos\bsi\bix\bx   Change  the  behavior  of b\bba\bas\bsh\bh where the default
+                              operation differs from the POSIX 1003.2 standard
+                              to match the standard (_\b`_\bp_\bo_\bs_\bi_\bx _\bm_\bo_\bd_\be).
+                      p\bpr\bri\biv\bvi\bil\ble\beg\bge\bed\bd
+                              Same as -\b-p\bp.
+                      v\bve\ber\brb\bbo\bos\bse\be Same as -\b-v\bv.
+                      v\bvi\bi      Use a vi-style command line editing interface.
+                      x\bxt\btr\bra\bac\bce\be  Same as -\b-x\bx.
+                      If -\b-o\bo is supplied with no _\bo_\bp_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be, the values of the
+                      current options are printed.  If +\b+o\bo is supplied with  no
+                      _\bo_\bp_\bt_\bi_\bo_\bn_\b-_\bn_\ba_\bm_\be,  a  series  of s\bse\bet\bt commands to recreate the
+                      current option settings is  displayed  on  the  standard
+                      output.
+              -\b-p\bp      Turn  on  _\bp_\br_\bi_\bv_\bi_\bl_\be_\bg_\be_\bd  mode.   In this mode, the $\b$E\bEN\bNV\bV and
+                      $\b$B\bBA\bAS\bSH\bH_\b_E\bEN\bNV\bV files are not processed, shell  functions  are
+                      not  inherited  from  the environment, and the S\bSH\bHE\bEL\bLL\bLO\bOP\bPT\bTS\bS
+                      variable, if it appears in the environment, is  ignored.
+                      If  the shell is started with the effective user (group)
+                      id not equal to the real user (group)  id,  and  the  -\b-p\bp
+                      option  is not supplied, these actions are taken and the
+                      effective user id is set to the real user id.  If the -\b-p\bp
+                      option  is supplied at startup, the effective user id is
+                      not reset.  Turning this option off causes the effective
+                      user  and group ids to be set to the real user and group
+                      ids.
+              -\b-t\bt      Exit after reading and executing one command.
+              -\b-u\bu      Treat unset variables as an error when performing param-
+                      eter  expansion.   If expansion is attempted on an unset
+                      variable, the shell prints an error message, and, if not
+                      interactive, exits with a non-zero status.
+              -\b-v\bv      Print shell input lines as they are read.
+              -\b-x\bx      After  expanding  each _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd, f\bfo\bor\br command, c\bca\bas\bse\be
+                      command, s\bse\bel\ble\bec\bct\bt command, or arithmetic f\bfo\bor\br command, dis-
+                      play  the expanded value of P\bPS\bS4\b4, followed by the command
+                      and its expanded arguments or associated word list.
+              -\b-B\bB      The shell performs brace expansion (see B\bBr\bra\bac\bce\be  E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn
+                      above).  This is on by default.
+              -\b-C\bC      If  set,  b\bba\bas\bsh\bh  does not overwrite an existing file with
+                      the >\b>, >\b>&\b&, and <\b<>\b> redirection operators.   This  may  be
+                      overridden when creating output files by using the redi-
+                      rection operator >\b>|\b| instead of >\b>.
+              -\b-E\bE      If set, any trap on E\bER\bRR\bR is inherited by shell functions,
+                      command  substitutions,  and commands executed in a sub-
+                      shell environment.  The E\bER\bRR\bR trap is normally not  inher-
+                      ited in such cases.
+              -\b-H\bH      Enable !\b!  style history substitution.  This option is on
+                      by default when the shell is interactive.
+              -\b-P\bP      If set, the shell does not follow  symbolic  links  when
+                      executing  commands  such  as c\bcd\bd that change the current
+                      working  directory.   It  uses  the  physical  directory
+                      structure instead.  By default, b\bba\bas\bsh\bh follows the logical
+                      chain of  directories  when  performing  commands  which
+                      change the current directory.
+              -\b-T\bT      If  set,  any  trap on D\bDE\bEB\bBU\bUG\bG is inherited by shell func-
+                      tions, command substitutions, and commands executed in a
+                      subshell  environment.   The  D\bDE\bEB\bBU\bUG\bG trap is normally not
+                      inherited in such cases.
+              -\b--\b-      If no arguments follow this option, then the  positional
+                      parameters are unset.  Otherwise, the positional parame-
+                      ters are set to the _\ba_\br_\bgs, even if  some  of  them  begin
+                      with a -\b-.
+              -\b-       Signal  the  end of options, cause all remaining _\ba_\br_\bgs to
+                      be assigned to the positional parameters.  The -\b-x\bx and -\b-v\bv
+                      options are turned off.  If there are no _\ba_\br_\bgs, the posi-
+                      tional parameters remain unchanged.
+
+              The options are off by default unless otherwise noted.  Using  +
+              rather  than  -  causes  these  options  to  be turned off.  The
+              options can also be specified as arguments to an  invocation  of
+              the  shell.  The current set of options may be found in $\b$-\b-.  The
+              return status  is  always  true  unless  an  invalid  option  is
+              encountered.
+
+       s\bsh\bhi\bif\bft\bt [_\bn]
+              The  positional  parameters  from _\bn+1 ... are renamed to $\b$1\b1 .\b..\b..\b..\b.
+              Parameters represented by the numbers  $\b$#\b#  down  to  $\b$#\b#-_\bn+1  are
+              unset.   _\bn  must  be a non-negative number less than or equal to
+              $\b$#\b#.  If _\bn is 0, no parameters are changed.  If _\bn is  not  given,
+              it  is assumed to be 1.  If _\bn is greater than $\b$#\b#, the positional
+              parameters are not changed.  The return status is  greater  than
+              zero if _\bn is greater than $\b$#\b# or less than zero; otherwise 0.
+
+       s\bsh\bho\bop\bpt\bt [-\b-p\bpq\bqs\bsu\bu] [-\b-o\bo] [_\bo_\bp_\bt_\bn_\ba_\bm_\be ...]
+              Toggle the values of variables controlling optional shell behav-
+              ior.  With no options, or with the -\b-p\bp option, a list of all set-
+              table options is displayed, with an indication of whether or not
+              each is set.  The -\b-p\bp option causes output to be displayed  in  a
+              form  that  may be reused as input.  Other options have the fol-
+              lowing meanings:
+              -\b-s\bs     Enable (set) each _\bo_\bp_\bt_\bn_\ba_\bm_\be.
+              -\b-u\bu     Disable (unset) each _\bo_\bp_\bt_\bn_\ba_\bm_\be.
+              -\b-q\bq     Suppresses normal output (quiet mode); the return  status
+                     indicates whether the _\bo_\bp_\bt_\bn_\ba_\bm_\be is set or unset.  If multi-
+                     ple _\bo_\bp_\bt_\bn_\ba_\bm_\be arguments are given with -\b-q\bq, the return  sta-
+                     tus  is zero if all _\bo_\bp_\bt_\bn_\ba_\bm_\be_\bs are enabled; non-zero other-
+                     wise.
+              -\b-o\bo     Restricts the values of _\bo_\bp_\bt_\bn_\ba_\bm_\be to be those  defined  for
+                     the -\b-o\bo option to the s\bse\bet\bt builtin.
+
+              If  either  -\b-s\bs or -\b-u\bu is used with no _\bo_\bp_\bt_\bn_\ba_\bm_\be arguments, the dis-
+              play is limited to those options which are set or unset, respec-
+              tively.   Unless otherwise noted, the s\bsh\bho\bop\bpt\bt options are disabled
+              (unset) by default.
+
+              The return status when listing options is zero if  all  _\bo_\bp_\bt_\bn_\ba_\bm_\be_\bs
+              are  enabled,  non-zero  otherwise.   When  setting or unsetting
+              options, the return status is zero unless an _\bo_\bp_\bt_\bn_\ba_\bm_\be  is  not  a
+              valid shell option.
+
+              The list of s\bsh\bho\bop\bpt\bt options is:
+
+              c\bcd\bda\bab\bbl\ble\be_\b_v\bva\bar\brs\bs
+                      If  set,  an  argument to the c\bcd\bd builtin command that is
+                      not a directory is assumed to be the name of a  variable
+                      whose value is the directory to change to.
+              c\bcd\bds\bsp\bpe\bel\bll\bl If set, minor errors in the spelling of a directory com-
+                      ponent in a c\bcd\bd command will be  corrected.   The  errors
+                      checked for are transposed characters, a missing charac-
+                      ter, and one character too many.   If  a  correction  is
+                      found,  the corrected file name is printed, and the com-
+                      mand proceeds.  This option is only used by  interactive
+                      shells.
+              c\bch\bhe\bec\bck\bkh\bha\bas\bsh\bh
+                      If set, b\bba\bas\bsh\bh checks that a command found in the hash ta-
+                      ble exists before trying to execute  it.   If  a  hashed
+                      command  no  longer exists, a normal path search is per-
+                      formed.
+              c\bch\bhe\bec\bck\bkw\bwi\bin\bns\bsi\biz\bze\be
+                      If set, b\bba\bas\bsh\bh checks the window size after  each  command
+                      and,  if  necessary,  updates  the  values  of L\bLI\bIN\bNE\bES\bS and
+                      C\bCO\bOL\bLU\bUM\bMN\bNS\bS.
+              c\bcm\bmd\bdh\bhi\bis\bst\bt If set, b\bba\bas\bsh\bh attempts to save all lines of  a  multiple-
+                      line  command  in  the  same history entry.  This allows
+                      easy re-editing of multi-line commands.
+              d\bdo\bot\btg\bgl\blo\bob\bb If set, b\bba\bas\bsh\bh includes filenames beginning with a `.'  in
+                      the results of pathname expansion.
+              e\bex\bxe\bec\bcf\bfa\bai\bil\bl
+                      If set, a non-interactive shell will not exit if it can-
+                      not execute the file specified as  an  argument  to  the
+                      e\bex\bxe\bec\bc  builtin  command.   An  interactive shell does not
+                      exit if e\bex\bxe\bec\bc fails.
+              e\bex\bxp\bpa\ban\bnd\bd_\b_a\bal\bli\bia\bas\bse\bes\bs
+                      If set, aliases are expanded as  described  above  under
+                      A\bAL\bLI\bIA\bAS\bSE\bES\bS.    This   option  is  enabled  by  default  for
+                      interactive shells.
+              e\bex\bxt\btd\bde\beb\bbu\bug\bg
+                      If set,  behavior  intended  for  use  by  debuggers  is
+                      enabled:
+                      1\b1.\b.     The -\b-F\bF option to the d\bde\bec\bcl\bla\bar\bre\be builtin displays the
+                             source file name and line number corresponding to
+                             each function name supplied as an argument.
+                      2\b2.\b.     If  the  command  run by the D\bDE\bEB\bBU\bUG\bG trap returns a
+                             non-zero value, the next command is  skipped  and
+                             not executed.
+                      3\b3.\b.     If  the  command  run by the D\bDE\bEB\bBU\bUG\bG trap returns a
+                             value of 2, and the shell is executing in a  sub-
+                             routine  (a shell function or a shell script exe-
+                             cuted by the .\b. or s\bso\bou\bur\brc\bce\be  builtins),  a  call  to
+                             r\bre\bet\btu\bur\brn\bn is simulated.
+              e\bex\bxt\btg\bgl\blo\bob\bb If set, the extended pattern matching features described
+                      above under P\bPa\bat\bth\bhn\bna\bam\bme\be E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn are enabled.
+              e\bex\bxt\btq\bqu\buo\bot\bte\be
+                      If set, $\b$'_\bs_\bt_\br_\bi_\bn_\bg' and  $\b$"_\bs_\bt_\br_\bi_\bn_\bg"  quoting  is  performed
+                      within   $\b${\b{_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br}\b}   expansions  enclosed  in  double
+                      quotes.  This option is enabled by default.
+              f\bfa\bai\bil\blg\bgl\blo\bob\bb
+                      If set, patterns which fail to  match  filenames  during
+                      pathname expansion result in an expansion error.
+              f\bfo\bor\brc\bce\be_\b_f\bfi\big\bgn\bno\bor\bre\be
+                      If  set,  the  suffixes  specified  by the F\bFI\bIG\bGN\bNO\bOR\bRE\bE shell
+                      variable cause words to be ignored when performing  word
+                      completion even if the ignored words are the only possi-
+                      ble  completions.   See  S\bSH\bHE\bEL\bLL\bL  V\bVA\bAR\bRI\bIA\bAB\bBL\bLE\bES\bS  above  for  a
+                      description  of  F\bFI\bIG\bGN\bNO\bOR\bRE\bE.   This  option  is  enabled by
+                      default.
+              g\bgn\bnu\bu_\b_e\ber\brr\brf\bfm\bmt\bt
+                      If set, shell error messages are written in the standard
+                      GNU error message format.
+              h\bhi\bis\bst\bta\bap\bpp\bpe\ben\bnd\bd
+                      If  set,  the history list is appended to the file named
+                      by the value of the H\bHI\bIS\bST\bTF\bFI\bIL\bLE\bE  variable  when  the  shell
+                      exits, rather than overwriting the file.
+              h\bhi\bis\bst\btr\bre\bee\bed\bdi\bit\bt
+                      If  set, and r\bre\bea\bad\bdl\bli\bin\bne\be is being used, a user is given the
+                      opportunity to re-edit a failed history substitution.
+              h\bhi\bis\bst\btv\bve\ber\bri\bif\bfy\by
+                      If set, and r\bre\bea\bad\bdl\bli\bin\bne\be is being used, the results of  his-
+                      tory  substitution  are  not  immediately  passed to the
+                      shell parser.  Instead, the  resulting  line  is  loaded
+                      into the r\bre\bea\bad\bdl\bli\bin\bne\be editing buffer, allowing further modi-
+                      fication.
+              h\bho\bos\bst\btc\bco\bom\bmp\bpl\ble\bet\bte\be
+                      If set, and r\bre\bea\bad\bdl\bli\bin\bne\be is being used, b\bba\bas\bsh\bh will attempt to
+                      perform  hostname  completion when a word containing a @\b@
+                      is  being  completed  (see  C\bCo\bom\bmp\bpl\ble\bet\bti\bin\bng\bg  under   R\bRE\bEA\bAD\bDL\bLI\bIN\bNE\bE
+                      above).  This is enabled by default.
+              h\bhu\bup\bpo\bon\bne\bex\bxi\bit\bt
+                      If set, b\bba\bas\bsh\bh will send S\bSI\bIG\bGH\bHU\bUP\bP to all jobs when an inter-
+                      active login shell exits.
+              i\bin\bnt\bte\ber\bra\bac\bct\bti\biv\bve\be_\b_c\bco\bom\bmm\bme\ben\bnt\bts\bs
+                      If set, allow a word beginning with #\b# to cause that word
+                      and  all remaining characters on that line to be ignored
+                      in an interactive  shell  (see  C\bCO\bOM\bMM\bME\bEN\bNT\bTS\bS  above).   This
+                      option is enabled by default.
+              l\bli\bit\bth\bhi\bis\bst\bt If  set,  and  the c\bcm\bmd\bdh\bhi\bis\bst\bt option is enabled, multi-line
+                      commands are saved to the history with embedded newlines
+                      rather than using semicolon separators where possible.
+              l\blo\bog\bgi\bin\bn_\b_s\bsh\bhe\bel\bll\bl
+                      The  shell  sets this option if it is started as a login
+                      shell (see I\bIN\bNV\bVO\bOC\bCA\bAT\bTI\bIO\bON\bN above).   The  value  may  not  be
+                      changed.
+              m\bma\bai\bil\blw\bwa\bar\brn\bn
+                      If  set,  and  a file that b\bba\bas\bsh\bh is checking for mail has
+                      been accessed since the last time it  was  checked,  the
+                      message  ``The  mail in _\bm_\ba_\bi_\bl_\bf_\bi_\bl_\be has been read'' is dis-
+                      played.
+              n\bno\bo_\b_e\bem\bmp\bpt\bty\by_\b_c\bcm\bmd\bd_\b_c\bco\bom\bmp\bpl\ble\bet\bti\bio\bon\bn
+                      If set, and  r\bre\bea\bad\bdl\bli\bin\bne\be  is  being  used,  b\bba\bas\bsh\bh  will  not
+                      attempt to search the P\bPA\bAT\bTH\bH for possible completions when
+                      completion is attempted on an empty line.
+              n\bno\boc\bca\bas\bse\beg\bgl\blo\bob\bb
+                      If set, b\bba\bas\bsh\bh matches  filenames  in  a  case-insensitive
+                      fashion when performing pathname expansion (see P\bPa\bat\bth\bhn\bna\bam\bme\be
+                      E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn above).
+              n\bnu\bul\bll\blg\bgl\blo\bob\bb
+                      If set, b\bba\bas\bsh\bh allows patterns which match no  files  (see
+                      P\bPa\bat\bth\bhn\bna\bam\bme\be  E\bEx\bxp\bpa\ban\bns\bsi\bio\bon\bn  above)  to expand to a null string,
+                      rather than themselves.
+              p\bpr\bro\bog\bgc\bco\bom\bmp\bp
+                      If set, the programmable completion facilities (see P\bPr\bro\bo-\b-
+                      g\bgr\bra\bam\bmm\bma\bab\bbl\ble\be C\bCo\bom\bmp\bpl\ble\bet\bti\bio\bon\bn above) are enabled.  This option is
+                      enabled by default.
+              p\bpr\bro\bom\bmp\bpt\btv\bva\bar\brs\bs
+                      If set, prompt strings undergo parameter expansion, com-
+                      mand   substitution,  arithmetic  expansion,  and  quote
+                      removal after being expanded as described  in  P\bPR\bRO\bOM\bMP\bPT\bTI\bIN\bNG\bG
+                      above.  This option is enabled by default.
+              r\bre\bes\bst\btr\bri\bic\bct\bte\bed\bd_\b_s\bsh\bhe\bel\bll\bl
+                      The   shell  sets  this  option  if  it  is  started  in
+                      restricted mode (see R\bRE\bES\bST\bTR\bRI\bIC\bCT\bTE\bED\bD S\bSH\bHE\bEL\bLL\bL below).  The value
+                      may  not be changed.  This is not reset when the startup
+                      files are executed, allowing the startup files  to  dis-
+                      cover whether or not a shell is restricted.
+              s\bsh\bhi\bif\bft\bt_\b_v\bve\ber\brb\bbo\bos\bse\be
+                      If  set,  the s\bsh\bhi\bif\bft\bt builtin prints an error message when
+                      the shift count exceeds the number of positional parame-
+                      ters.
+              s\bso\bou\bur\brc\bce\bep\bpa\bat\bth\bh
+                      If set, the s\bso\bou\bur\brc\bce\be (.\b.) builtin uses the value of P\bPA\bAT\bTH\bH to
+                      find the directory containing the file  supplied  as  an
+                      argument.  This option is enabled by default.
+              x\bxp\bpg\bg_\b_e\bec\bch\bho\bo
+                      If   set,  the  e\bec\bch\bho\bo  builtin  expands  backslash-escape
+                      sequences by default.
+       s\bsu\bus\bsp\bpe\ben\bnd\bd [-\b-f\bf]
+              Suspend the execution of this shell until it receives a  S\bSI\bIG\bGC\bCO\bON\bNT\bT
+              signal.   The  -\b-f\bf option says not to complain if this is a login
+              shell; just suspend anyway.  The return status is 0  unless  the
+              shell is a login shell and -\b-f\bf is not supplied, or if job control
+              is not enabled.
+       t\bte\bes\bst\bt _\be_\bx_\bp_\br
+       [\b[ _\be_\bx_\bp_\br ]\b]
+              Return a status of 0 or 1 depending on  the  evaluation  of  the
+              conditional  expression _\be_\bx_\bp_\br.  Each operator and operand must be
+              a separate argument.  Expressions are composed of the  primaries
+              described above under C\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNA\bAL\bL E\bEX\bXP\bPR\bRE\bES\bSS\bSI\bIO\bON\bNS\bS.
+
+              Expressions  may  be  combined  using  the  following operators,
+              listed in decreasing order of precedence.
+              !\b! _\be_\bx_\bp_\br True if _\be_\bx_\bp_\br is false.
+              (\b( _\be_\bx_\bp_\br )\b)
+                     Returns the value of _\be_\bx_\bp_\br.  This may be used to  override
+                     the normal precedence of operators.
+              _\be_\bx_\bp_\br_\b1 -a\ba _\be_\bx_\bp_\br_\b2
+                     True if both _\be_\bx_\bp_\br_\b1 and _\be_\bx_\bp_\br_\b2 are true.
+              _\be_\bx_\bp_\br_\b1 -o\bo _\be_\bx_\bp_\br_\b2
+                     True if either _\be_\bx_\bp_\br_\b1 or _\be_\bx_\bp_\br_\b2 is true.
+
+              t\bte\bes\bst\bt and [\b[ evaluate conditional expressions using a set of rules
+              based on the number of arguments.
+
+              0 arguments
+                     The expression is false.
+              1 argument
+                     The expression is true if and only if the argument is not
+                     null.
+              2 arguments
+                     If the first argument is !\b!, the expression is true if and
+                     only if the second argument is null.  If the first  argu-
+                     ment  is  one  of  the unary conditional operators listed
+                     above under C\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNA\bAL\bL E\bEX\bXP\bPR\bRE\bES\bSS\bSI\bIO\bON\bNS\bS,  the  expression  is
+                     true if the unary test is true.  If the first argument is
+                     not a valid unary conditional operator, the expression is
+                     false.
+              3 arguments
+                     If  the  second argument is one of the binary conditional
+                     operators listed above under C\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNA\bAL\bL E\bEX\bXP\bPR\bRE\bES\bSS\bSI\bIO\bON\bNS\bS, the
+                     result of the expression is the result of the binary test
+                     using the first and third arguments as operands.  If  the
+                     first  argument  is  !\b!,  the value is the negation of the
+                     two-argument test using the second and  third  arguments.
+                     If the first argument is exactly (\b( and the third argument
+                     is exactly )\b), the result is the one-argument test of  the
+                     second  argument.   Otherwise,  the  expression is false.
+                     The -\b-a\ba and -\b-o\bo operators are considered  binary  operators
+                     in this case.
+              4 arguments
+                     If the first argument is !\b!, the result is the negation of
+                     the three-argument expression composed of  the  remaining
+                     arguments.  Otherwise, the expression is parsed and eval-
+                     uated according to  precedence  using  the  rules  listed
+                     above.
+              5 or more arguments
+                     The  expression  is  parsed  and  evaluated  according to
+                     precedence using the rules listed above.
+
+       t\bti\bim\bme\bes\bs  Print the accumulated user and system times for  the  shell  and
+              for processes run from the shell.  The return status is 0.
+
+       t\btr\bra\bap\bp [-\b-l\blp\bp] [_\ba_\br_\bg] [_\bs_\bi_\bg_\bs_\bp_\be_\bc ...]
+              The  command  _\ba_\br_\bg  is  to  be  read  and executed when the shell
+              receives signal(s) _\bs_\bi_\bg_\bs_\bp_\be_\bc.  If _\ba_\br_\bg is absent or -\b-,  all  speci-
+              fied signals are reset to their original values (the values they
+              had upon entrance to the shell).  If _\ba_\br_\bg is the null string  the
+              signal  specified by each _\bs_\bi_\bg_\bs_\bp_\be_\bc is ignored by the shell and by
+              the commands it invokes.  If _\ba_\br_\bg is not present and -\b-p\bp has  been
+              supplied,  then  the  trap commands associated with each _\bs_\bi_\bg_\bs_\bp_\be_\bc
+              are displayed.  If no arguments are supplied or if  only  -\b-p\bp  is
+              given,  t\btr\bra\bap\bp  prints  the  list of commands associated with each
+              signal number.  The -\b-l\bl option causes the shell to print  a  list
+              of  signal  names and their corresponding numbers.  Each _\bs_\bi_\bg_\bs_\bp_\be_\bc
+              is either a signal name defined in <_\bs_\bi_\bg_\bn_\ba_\bl_\b._\bh>, or a signal  num-
+              ber.   If  a  _\bs_\bi_\bg_\bs_\bp_\be_\bc is E\bEX\bXI\bIT\bT (0) the command _\ba_\br_\bg is executed on
+              exit from the shell.  If a _\bs_\bi_\bg_\bs_\bp_\be_\bc is D\bDE\bEB\bBU\bUG\bG, the command _\ba_\br_\bg  is
+              executed before every _\bs_\bi_\bm_\bp_\bl_\be _\bc_\bo_\bm_\bm_\ba_\bn_\bd, _\bf_\bo_\br command, _\bc_\ba_\bs_\be command,
+              _\bs_\be_\bl_\be_\bc_\bt command, every arithmetic _\bf_\bo_\br  command,  and  before  the
+              first  command  executes  in a shell function (see S\bSH\bHE\bEL\bLL\bL G\bGR\bRA\bAM\bMM\bMA\bAR\bR
+              above).  Refer to the description of the e\bex\bxt\btg\bgl\blo\bob\bb option  to  the
+              s\bsh\bho\bop\bpt\bt builtin for details of its effect on the D\bDE\bEB\bBU\bUG\bG trap.  If a
+              _\bs_\bi_\bg_\bs_\bp_\be_\bc is E\bER\bRR\bR, the command _\ba_\br_\bg is executed  whenever  a  simple
+              command  has  a  non-zero  exit status, subject to the following
+              conditions.  The E\bER\bRR\bR trap is not executed if the failed  command
+              is  part  of  the  command list immediately following a w\bwh\bhi\bil\ble\be or
+              u\bun\bnt\bti\bil\bl keyword, part of the test in an _\bi_\bf statement, part of a &\b&&\b&
+              or  |\b||\b|  list, or if the command's return value is being inverted
+              via !\b!.  These are the same  conditions  obeyed  by  the  e\ber\brr\bre\bex\bxi\bit\bt
+              option.   If  a  _\bs_\bi_\bg_\bs_\bp_\be_\bc  is R\bRE\bET\bTU\bUR\bRN\bN, the command _\ba_\br_\bg is executed
+              each time a shell function or a script executed with  the  .\b.  or
+              s\bso\bou\bur\brc\bce\be  builtins finishes executing.  Signals ignored upon entry
+              to the shell cannot be trapped or reset.   Trapped  signals  are
+              reset  to  their  original  values in a child process when it is
+              created.  The return status is false if any _\bs_\bi_\bg_\bs_\bp_\be_\bc is  invalid;
+              otherwise t\btr\bra\bap\bp returns true.
+
+       t\bty\byp\bpe\be [-\b-a\baf\bft\btp\bpP\bP] _\bn_\ba_\bm_\be [_\bn_\ba_\bm_\be ...]
+              With  no options, indicate how each _\bn_\ba_\bm_\be would be interpreted if
+              used as a command name.  If the -\b-t\bt option is used, t\bty\byp\bpe\be prints a
+              string  which  is  one  of _\ba_\bl_\bi_\ba_\bs, _\bk_\be_\by_\bw_\bo_\br_\bd, _\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn, _\bb_\bu_\bi_\bl_\bt_\bi_\bn, or
+              _\bf_\bi_\bl_\be if  _\bn_\ba_\bm_\be  is  an  alias,  shell  reserved  word,  function,
+              builtin,  or disk file, respectively.  If the _\bn_\ba_\bm_\be is not found,
+              then nothing  is  printed,  and  an  exit  status  of  false  is
+              returned.   If  the  -\b-p\bp  option is used, t\bty\byp\bpe\be either returns the
+              name of the disk file that would be executed if _\bn_\ba_\bm_\be were speci-
+              fied as a command name, or nothing if ``type -t name'' would not
+              return _\bf_\bi_\bl_\be.  The -\b-P\bP option forces a P\bPA\bAT\bTH\bH search for each  _\bn_\ba_\bm_\be,
+              even if ``type -t name'' would not return _\bf_\bi_\bl_\be.  If a command is
+              hashed, -\b-p\bp and -\b-P\bP print the hashed value,  not  necessarily  the
+              file that appears first in P\bPA\bAT\bTH\bH.  If the -\b-a\ba option is used, t\bty\byp\bpe\be
+              prints all of the places that contain an executable named  _\bn_\ba_\bm_\be.
+              This  includes  aliases  and  functions,  if  and only if the -\b-p\bp
+              option is not also used.  The table of hashed  commands  is  not
+              consulted  when  using -\b-a\ba.  The -\b-f\bf option suppresses shell func-
+              tion lookup, as with the c\bco\bom\bmm\bma\ban\bnd\bd builtin.  t\bty\byp\bpe\be returns true  if
+              any of the arguments are found, false if none are found.
+
+       u\bul\bli\bim\bmi\bit\bt [-\b-S\bSH\bHa\bac\bcd\bdf\bfl\blm\bmn\bnp\bps\bst\btu\buv\bv [_\bl_\bi_\bm_\bi_\bt]]
+              Provides  control  over the resources available to the shell and
+              to processes started by it, on systems that allow such  control.
+              The -\b-H\bH and -\b-S\bS options specify that the hard or soft limit is set
+              for the given resource.  A hard limit cannot be  increased  once
+              it  is set; a soft limit may be increased up to the value of the
+              hard limit.  If neither -\b-H\bH nor -\b-S\bS is specified,  both  the  soft
+              and  hard limits are set.  The value of _\bl_\bi_\bm_\bi_\bt can be a number in
+              the unit specified for the resource or one of the special values
+              h\bha\bar\brd\bd,  s\bso\bof\bft\bt,  or  u\bun\bnl\bli\bim\bmi\bit\bte\bed\bd,  which  stand  for the current hard
+              limit, the current soft limit, and no limit,  respectively.   If
+              _\bl_\bi_\bm_\bi_\bt  is  omitted,  the  current value of the soft limit of the
+              resource is printed, unless the -\b-H\bH option is given.   When  more
+              than  one  resource  is  specified,  the limit name and unit are
+              printed before the value.  Other options are interpreted as fol-
+              lows:
+              -\b-a\ba     All current limits are reported
+              -\b-c\bc     The maximum size of core files created
+              -\b-d\bd     The maximum size of a process's data segment
+              -\b-f\bf     The maximum size of files created by the shell
+              -\b-l\bl     The maximum size that may be locked into memory
+              -\b-m\bm     The maximum resident set size
+              -\b-n\bn     The maximum number of open file descriptors (most systems
+                     do not allow this value to be set)
+              -\b-p\bp     The pipe size in 512-byte blocks (this may not be set)
+              -\b-s\bs     The maximum stack size
+              -\b-t\bt     The maximum amount of cpu time in seconds
+              -\b-u\bu     The maximum number of processes  available  to  a  single
+                     user
+              -\b-v\bv     The  maximum  amount  of  virtual memory available to the
+                     shell
+
+              If _\bl_\bi_\bm_\bi_\bt is given, it is the new value of the specified resource
+              (the -\b-a\ba option is display only).  If no option is given, then -\b-f\bf
+              is assumed.  Values are in 1024-byte increments, except for  -\b-t\bt,
+              which  is  in seconds, -\b-p\bp, which is in units of 512-byte blocks,
+              and -\b-n\bn and -\b-u\bu, which are unscaled values.  The return status  is
+              0  unless an invalid option or argument is supplied, or an error
+              occurs while setting a new limit.
+
+       u\bum\bma\bas\bsk\bk [-\b-p\bp] [-\b-S\bS] [_\bm_\bo_\bd_\be]
+              The user file-creation mask is set to _\bm_\bo_\bd_\be.  If _\bm_\bo_\bd_\be begins with
+              a  digit,  it is interpreted as an octal number; otherwise it is
+              interpreted as a symbolic mode mask similar to that accepted  by
+              _\bc_\bh_\bm_\bo_\bd(1).   If _\bm_\bo_\bd_\be is omitted, the current value of the mask is
+              printed.  The -\b-S\bS option causes the mask to be  printed  in  sym-
+              bolic  form;  the  default output is an octal number.  If the -\b-p\bp
+              option is supplied, and _\bm_\bo_\bd_\be is omitted, the output is in a form
+              that may be reused as input.  The return status is 0 if the mode
+              was successfully changed or if no _\bm_\bo_\bd_\be  argument  was  supplied,
+              and false otherwise.
+
+       u\bun\bna\bal\bli\bia\bas\bs [-a\ba] [_\bn_\ba_\bm_\be ...]
+              Remove  each  _\bn_\ba_\bm_\be  from  the list of defined aliases.  If -\b-a\ba is
+              supplied, all alias definitions are removed.  The  return  value
+              is true unless a supplied _\bn_\ba_\bm_\be is not a defined alias.
+
+       u\bun\bns\bse\bet\bt [-f\bfv\bv] [_\bn_\ba_\bm_\be ...]
+              For  each  _\bn_\ba_\bm_\be,  remove the corresponding variable or function.
+              If no options are supplied, or the -\b-v\bv option is given, each _\bn_\ba_\bm_\be
+              refers  to  a  shell  variable.   Read-only variables may not be
+              unset.  If -\b-f\bf is specifed, each _\bn_\ba_\bm_\be refers to a shell function,
+              and  the function definition is removed.  Each unset variable or
+              function is removed from the environment  passed  to  subsequent
+              commands.  If any of R\bRA\bAN\bND\bDO\bOM\bM, S\bSE\bEC\bCO\bON\bND\bDS\bS, L\bLI\bIN\bNE\bEN\bNO\bO, H\bHI\bIS\bST\bTC\bCM\bMD\bD, F\bFU\bUN\bNC\bCN\bNA\bAM\bME\bE,
+              G\bGR\bRO\bOU\bUP\bPS\bS, or D\bDI\bIR\bRS\bST\bTA\bAC\bCK\bK are unset, they lose their  special  proper-
+              ties,  even  if they are subsequently reset.  The exit status is
+              true unless a _\bn_\ba_\bm_\be is readonly.
+
+       w\bwa\bai\bit\bt [_\bn]
+              Wait for the specified process and return its  termination  sta-
+              tus.   _\bn  may  be  a process ID or a job specification; if a job
+              spec is given, all processes in that job's pipeline  are  waited
+              for.   If  _\bn  is not given, all currently active child processes
+              are waited for, and the return status is zero.  If _\bn specifies a
+              non-existent  process  or job, the return status is 127.  Other-
+              wise, the return status is the exit status of the  last  process
+              or job waited for.
+
+S\bSE\bEE\bE A\bAL\bLS\bSO\bO
+       bash(1), sh(1)
+
+
+
+GNU Bash-2.05a                 2001 November 27               BASH_BUILTINS(1)
diff --git a/doc/builtins.ps b/doc/builtins.ps
new file mode 100644 (file)
index 0000000..a687507
--- /dev/null
@@ -0,0 +1,2323 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.18.1
+%%CreationDate: Thu Nov 13 09:47:38 2003
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%+ font Times-Italic
+%%+ font Symbol
+%%+ font Courier
+%%+ font Palatino-Roman
+%%+ font Palatino-Italic
+%%+ font Palatino-Bold
+%%DocumentSuppliedResources: procset grops 1.18 1
+%%Pages: 19
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.18 1
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/Fr{
+setrgbcolor fill
+}bind def
+/Fk{
+setcmykcolor fill
+}bind def
+/Fg{
+setgray fill
+}bind def
+/FL/fill load def
+/LW/setlinewidth load def
+/Cr/setrgbcolor load def
+/Ck/setcmykcolor load def
+/Cg/setgray load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Symbol
+%%IncludeResource: font Courier
+%%IncludeResource: font Palatino-Roman
+%%IncludeResource: font Palatino-Italic
+%%IncludeResource: font Palatino-Bold
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Palatino-Bold@0 ENC0/Palatino-Bold RE/Palatino-Italic@0 ENC0
+/Palatino-Italic RE/Palatino-Roman@0 ENC0/Palatino-Roman RE/Courier@0
+ENC0/Courier RE/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0
+/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10.95
+/Times-Bold@0 SF -.219(NA)72 84 S(ME).219 E F0 .957
+(bash, :, ., [, alias, bg, bind, break, b)108 96 R .957
+(uiltin, cd, command, compgen, complete, continue, declare, dirs, dis-)
+-.2 F -.25(ow)108 108 S .908(n, echo, enable, e).25 F -.25(va)-.25 G
+.908(l, e).25 F -.15(xe)-.15 G .908(c, e).15 F .908(xit, e)-.15 F .908
+(xport, fc, fg, getopts, hash, help, history)-.15 F 3.408(,j)-.65 G .909
+(obs, kill, let, local, logout,)-3.408 F 1.236
+(popd, printf, pushd, pwd, read, readonly)108 120 R 3.735(,r)-.65 G
+1.235
+(eturn, set, shift, shopt, source, suspend, test, times, trap, type,)
+-3.735 F(typeset, ulimit, umask, unalias, unset, w)108 132 Q
+(ait \255 bash b)-.1 E(uilt-in commands, see)-.2 E/F2 10/Times-Bold@0 SF
+(bash)2.5 E F0(\(1\))A F1 -.329(BA)72 148.8 S(SH B).329 E(UIL)-.11 E
+(TIN COMMANDS)-1.007 E F0 .062(Unless otherwise noted, each b)108 160.8
+R .062(uiltin command documented in this section as accepting options p\
+receded by)-.2 F F2<ad>108 172.8 Q F0(accepts)2.5 E F2<adad>2.5 E F0
+(to signify the end of the options.)2.5 E F2(:)108 190.8 Q F0([)2.5 E/F3
+10/Times-Italic@0 SF(ar)A(guments)-.37 E F0(])A .452(No ef)144 202.8 R
+.452(fect; the command does nothing be)-.25 F .452(yond e)-.15 F
+(xpanding)-.15 E F3(ar)3.282 E(guments)-.37 E F0 .451(and performing an)
+3.221 F 2.951(ys)-.15 G(peci\214ed)-2.951 E 2.5(redirections. A)144
+214.8 R(zero e)2.5 E(xit code is returned.)-.15 E F2(.)110.5 231.6 Q F3
+(\214lename)6.666 E F0([)2.5 E F3(ar)A(guments)-.37 E F0(])A F2(sour)108
+243.6 Q(ce)-.18 E F3(\214lename)2.5 E F0([)2.5 E F3(ar)A(guments)-.37 E
+F0(])A 1.02(Read and e)144 255.6 R -.15(xe)-.15 G 1.02
+(cute commands from).15 F F3(\214lename)5.43 E F0 1.02
+(in the current shell en)3.7 F 1.02(vironment and return the e)-.4 F
+(xit)-.15 E 1.68(status of the last command e)144 267.6 R -.15(xe)-.15 G
+1.68(cuted from).15 F F3(\214lename)4.18 E F0 6.68(.I).18 G(f)-6.68 E F3
+(\214lename)6.09 E F0 1.68(does not contain a slash, \214le)4.36 F .608
+(names in)144 279.6 R/F4 9/Times-Bold@0 SF -.666(PA)3.108 G(TH)-.189 E
+F0 .608(are used to \214nd the directory containing)2.858 F F3
+(\214lename)3.108 E F0 5.608(.T).18 G .608(he \214le searched for in)
+-5.608 F F4 -.666(PA)3.108 G(TH)-.189 E F0 .833(need not be e)144 291.6
+R -.15(xe)-.15 G 3.333(cutable. When).15 F F2(bash)3.333 E F0 .832
+(is not in)3.333 F F3 .832(posix mode)3.332 F F0 3.332(,t)C .832
+(he current directory is searched if no)-3.332 F .981
+(\214le is found in)144 303.6 R F4 -.666(PA)3.481 G(TH)-.189 E/F5 9
+/Times-Roman@0 SF(.)A F0 .981(If the)5.481 F F2(sour)3.481 E(cepath)-.18
+E F0 .981(option to the)3.481 F F2(shopt)3.481 E F0 -.2(bu)3.481 G .981
+(iltin command is turned of).2 F .982(f, the)-.25 F F4 -.666(PA)144
+315.6 S(TH)-.189 E F0 .112(is not searched.)2.363 F .112(If an)5.112 F
+(y)-.15 E F3(ar)2.612 E(guments)-.37 E F0 .112(are supplied, the)2.612 F
+2.612(yb)-.15 G .112(ecome the positional parameters when)-2.612 F F3
+(\214lename)144 327.6 Q F0 .341(is e)2.841 F -.15(xe)-.15 G 2.841
+(cuted. Otherwise).15 F .341(the positional parameters are unchanged.)
+2.841 F .342(The return status is the)5.342 F .716
+(status of the last command e)144 339.6 R .716
+(xited within the script \(0 if no commands are e)-.15 F -.15(xe)-.15 G
+.716(cuted\), and f).15 F .715(alse if)-.1 F F3(\214lename)145.91 351.6
+Q F0(is not found or cannot be read.)2.68 E F2(alias)108 368.4 Q F0([)
+2.5 E F2<ad70>A F0 2.5(][)C F3(name)-2.5 E F0([=)A F3(value)A F0 2.5(].)
+C(..])-2.5 E F2(Alias)144 380.4 Q F0 2.724(with no ar)5.224 F 2.724
+(guments or with the)-.18 F F2<ad70>5.224 E F0 2.724
+(option prints the list of aliases in the form)5.224 F F2(alias)5.225 E
+F3(name)144 392.4 Q F0(=)A F3(value)A F0 .58(on standard output.)3.08 F
+.58(When ar)5.58 F .58
+(guments are supplied, an alias is de\214ned for each)-.18 F F3(name)
+3.08 E F0(whose)144 404.4 Q F3(value)2.895 E F0 .395(is gi)2.895 F -.15
+(ve)-.25 G 2.895(n. A).15 F .395(trailing space in)2.895 F F3(value)
+5.395 E F0 .395(causes the ne)2.895 F .395(xt w)-.15 F .395
+(ord to be check)-.1 F .395(ed for alias sub-)-.1 F .054
+(stitution when the alias is e)144 416.4 R 2.554(xpanded. F)-.15 F .054
+(or each)-.15 F F3(name)2.554 E F0 .054(in the ar)2.554 F .054
+(gument list for which no)-.18 F F3(value)2.554 E F0 .053(is sup-)2.553
+F 1.313(plied, the name and v)144 428.4 R 1.314
+(alue of the alias is printed.)-.25 F F2(Alias)6.314 E F0 1.314
+(returns true unless a)3.814 F F3(name)3.814 E F0 1.314(is gi)3.814 F
+-.15(ve)-.25 G 3.814(nf).15 G(or)-3.814 E
+(which no alias has been de\214ned.)144 440.4 Q F2(bg)108 457.2 Q F0([)
+2.5 E F3(jobspec)A F0(])A .357(Resume the suspended job)144 469.2 R F3
+(jobspec)2.857 E F0 .356
+(in the background, as if it had been started with)2.857 F F2(&)2.856 E
+F0 5.356(.I)C(f)-5.356 E F3(jobspec)2.856 E F0 .472
+(is not present, the shell')144 481.2 R 2.973(sn)-.55 G .473
+(otion of the)-2.973 F F3(curr)2.973 E .473(ent job)-.37 F F0 .473
+(is used.)2.973 F F2(bg)5.473 E F3(jobspec)4.713 E F0 .473
+(returns 0 unless run when)3.283 F .663(job control is disabled or)144
+493.2 R 3.163(,w)-.4 G .663(hen run with job control enabled, if)-3.163
+F F3(jobspec)3.163 E F0 -.1(wa)3.163 G 3.163(sn).1 G .663
+(ot found or started)-3.163 F(without job control.)144 505.2 Q F2(bind)
+108 522 Q F0([)2.5 E F2<ad6d>A F3 -.1(ke)2.5 G(ymap)-.2 E F0 2.5(][)C F2
+(\255lpsvPSV)-2.5 E F0(])A F2(bind)108 534 Q F0([)2.5 E F2<ad6d>A F3 -.1
+(ke)2.5 G(ymap)-.2 E F0 2.5(][)C F2<ad71>-2.5 E F3(function)2.5 E F0 2.5
+(][)C F2<ad75>-2.5 E F3(function)2.5 E F0 2.5(][)C F2<ad72>-2.5 E F3 -.1
+(ke)2.5 G(yseq)-.2 E F0(])A F2(bind)108 546 Q F0([)2.5 E F2<ad6d>A F3
+-.1(ke)2.5 G(ymap)-.2 E F0(])A F2<ad66>2.5 E F3(\214lename)2.5 E F2
+(bind)108 558 Q F0([)2.5 E F2<ad6d>A F3 -.1(ke)2.5 G(ymap)-.2 E F0(])A
+F2<ad78>2.5 E F3 -.1(ke)2.5 G(yseq)-.2 E F0(:)A F3(shell\255command)A F2
+(bind)108 570 Q F0([)2.5 E F2<ad6d>A F3 -.1(ke)2.5 G(ymap)-.2 E F0(])A
+F3 -.1(ke)2.5 G(yseq)-.2 E F0(:)A F3(function\255name)A F2(bind)108 582
+Q F3 -.37(re)2.5 G(adline\255command).37 E F0 .238(Display current)144
+594 R F2 -.18(re)2.738 G(adline).18 E F0 -.1(ke)2.738 G 2.738(ya)-.05 G
+.239(nd function bindings, bind a k)-2.738 F .539 -.15(ey s)-.1 H .239
+(equence to a).15 F F2 -.18(re)2.739 G(adline).18 E F0 .239(function or)
+2.739 F .476(macro, or set a)144 606 R F2 -.18(re)2.976 G(adline).18 E
+F0 -.25(va)2.976 G 2.976(riable. Each).25 F .476(non-option ar)2.976 F
+.475(gument is a command as it w)-.18 F .475(ould appear in)-.1 F F3
+(.inputr)144 618 Q(c)-.37 E F0 2.983(,b).31 G .484
+(ut each binding or command must be passed as a separate ar)-3.183 F
+.484(gument; e.g., '"\\C\255x\\C\255r":)-.18 F 2.5
+(re\255read\255init\255\214le'. Options,)144 630 R(if supplied, ha)2.5 E
+.3 -.15(ve t)-.2 H(he follo).15 E(wing meanings:)-.25 E F2<ad6d>144 642
+Q F3 -.1(ke)2.5 G(ymap)-.2 E F0(Use)180 654 Q F3 -.1(ke)5.159 G(ymap)-.2
+E F0 2.659(as the k)5.349 F -.15(ey)-.1 G 2.658(map to be af).15 F 2.658
+(fected by the subsequent bindings.)-.25 F(Acceptable)7.658 E F3 -.1(ke)
+180 666 S(ymap)-.2 E F0 3.192(names are)5.882 F F3 3.192
+(emacs, emacs\255standar)5.692 F 3.193
+(d, emacs\255meta, emacs\255ctlx, vi, vi\255mo)-.37 F(ve)-.1 E(,)-.1 E
+(vi\255command)180 678 Q F0 4.43(,a)C(nd)-4.43 E F3(vi\255insert)4.429 E
+F0(.).68 E F3(vi)6.929 E F0 1.929(is equi)4.429 F -.25(va)-.25 G 1.929
+(lent to).25 F F3(vi\255command)4.429 E F0(;)A F3(emacs)4.429 E F0 1.929
+(is equi)4.429 F -.25(va)-.25 G 1.929(lent to).25 F F3(emacs\255standar)
+180 690 Q(d)-.37 E F0(.)A F2<ad6c>144 702 Q F0(List the names of all)
+27.52 E F2 -.18(re)2.5 G(adline).18 E F0(functions.)2.5 E F2<ad70>144
+714 Q F0(Display)24.74 E F2 -.18(re)2.5 G(adline).18 E F0
+(function names and bindings in such a w)2.5 E(ay that the)-.1 E 2.5(yc)
+-.15 G(an be re-read.)-2.5 E(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E
+-.15(ve)-.15 G(mber 27).15 E(1)190.545 E 0 Cg EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Times-Bold@0 SF<ad50>144 84 Q F0(List current)24.19 E F1 -.18(re)2.5 G
+(adline).18 E F0(function names and bindings.)2.5 E F1<ad76>144 96 Q F0
+(Display)25.3 E F1 -.18(re)2.5 G(adline).18 E F0 -.25(va)2.5 G
+(riable names and v).25 E(alues in such a w)-.25 E(ay that the)-.1 E 2.5
+(yc)-.15 G(an be re-read.)-2.5 E F1<ad56>144 108 Q F0(List current)23.08
+E F1 -.18(re)2.5 G(adline).18 E F0 -.25(va)2.5 G(riable names and v).25
+E(alues.)-.25 E F1<ad73>144 120 Q F0(Display)26.41 E F1 -.18(re)3.655 G
+(adline).18 E F0 -.1(ke)3.655 G 3.655(ys)-.05 G 1.155
+(equences bound to macros and the strings the)-3.655 F 3.655(yo)-.15 G
+1.155(utput in such a)-3.655 F -.1(wa)180 132 S 2.5(yt).1 G(hat the)-2.5
+E 2.5(yc)-.15 G(an be re-read.)-2.5 E F1<ad53>144 144 Q F0(Display)24.74
+E F1 -.18(re)2.5 G(adline).18 E F0 -.1(ke)2.5 G 2.5(ys)-.05 G
+(equences bound to macros and the strings the)-2.5 E 2.5(yo)-.15 G
+(utput.)-2.5 E F1<ad66>144 156 Q/F2 10/Times-Italic@0 SF(\214lename)2.5
+E F0(Read k)180 168 Q .3 -.15(ey b)-.1 H(indings from).15 E F2
+(\214lename)2.5 E F0(.)A F1<ad71>144 180 Q F2(function)2.5 E F0
+(Query about which k)180 192 Q -.15(ey)-.1 G 2.5(si).15 G -1.9 -.4(nv o)
+-2.5 H .2 -.1(ke t).4 H(he named).1 E F2(function)2.5 E F0(.)A F1<ad75>
+144 204 Q F2(function)2.5 E F0(Unbind all k)180 216 Q -.15(ey)-.1 G 2.5
+(sb).15 G(ound to the named)-2.5 E F2(function)2.5 E F0(.)A F1<ad72>144
+228 Q F2 -.1(ke)2.5 G(yseq)-.2 E F0(Remo)180 240 Q .3 -.15(ve a)-.15 H
+.3 -.15(ny c).15 H(urrent binding for).15 E F2 -.1(ke)2.5 G(yseq)-.2 E
+F0(.)A F1<ad78>144 252 Q F2 -.1(ke)2.5 G(yseq)-.2 E F1(:)A F2
+(shell\255command)A F0(Cause)180 264 Q F2(shell\255command)2.5 E F0
+(to be e)2.5 E -.15(xe)-.15 G(cuted whene).15 E -.15(ve)-.25 G(r).15 E
+F2 -.1(ke)2.5 G(yseq)-.2 E F0(is entered.)2.5 E(The return v)144 280.8 Q
+(alue is 0 unless an unrecognized option is gi)-.25 E -.15(ve)-.25 G 2.5
+(no).15 G 2.5(ra)-2.5 G 2.5(ne)-2.5 G(rror occurred.)-2.5 E F1(br)108
+297.6 Q(eak)-.18 E F0([)2.5 E F2(n)A F0(])A .055(Exit from within a)144
+309.6 R F1 -.25(fo)2.555 G(r).25 E F0(,)A F1(while)2.555 E F0(,)A F1
+(until)2.555 E F0 2.555(,o)C(r)-2.555 E F1(select)2.555 E F0 2.555
+(loop. If)2.555 F F2(n)2.555 E F0 .055(is speci\214ed, break)2.555 F F2
+(n)2.555 E F0(le)2.555 E -.15(ve)-.25 G(ls.).15 E F2(n)5.414 E F0 .054
+(must be)2.794 F/F3 10/Symbol SF<b3>2.554 E F0(1.)2.554 E(If)144 321.6 Q
+F2(n)3.074 E F0 .215(is greater than the number of enclosing loops, all\
+ enclosing loops are e)2.954 F 2.715(xited. The)-.15 F .215(return v)
+2.715 F(alue)-.25 E(is 0 unless the shell is not e)144 333.6 Q -.15(xe)
+-.15 G(cuting a loop when).15 E F1(br)2.5 E(eak)-.18 E F0(is e)2.5 E
+-.15(xe)-.15 G(cuted.).15 E F1 -.2(bu)108 350.4 S(iltin).2 E F2
+(shell\255b)2.5 E(uiltin)-.2 E F0([)2.5 E F2(ar)A(guments)-.37 E F0(])A
+(Ex)144 362.4 Q .793(ecute the speci\214ed shell b)-.15 F .793
+(uiltin, passing it)-.2 F F2(ar)3.293 E(guments)-.37 E F0 3.293(,a).27 G
+.793(nd return its e)-3.293 F .792(xit status.)-.15 F .792
+(This is useful)5.792 F .615
+(when de\214ning a function whose name is the same as a shell b)144
+374.4 R .616(uiltin, retaining the functionality of)-.2 F .57(the b)144
+386.4 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(is f)144 398.4 Q(alse if)-.1
+E F2(shell\255b)2.84 E(uiltin)-.2 E F0(is not a shell b)2.74 E
+(uiltin command.)-.2 E F1(cd)108 415.2 Q F0([)2.5 E F1(\255L|-P)A F0 2.5
+(][)C F2(dir)-2.5 E F0(])A .21(Change the current directory to)144 427.2
+R F2(dir)2.71 E F0 5.21(.T)C .21(he v)-5.21 F(ariable)-.25 E/F4 9
+/Times-Bold@0 SF(HOME)2.71 E F0 .21(is the def)2.46 F(ault)-.1 E F2(dir)
+2.71 E F0 5.21(.T).73 G .21(he v)-5.21 F(ariable)-.25 E F4(CDP)2.71 E
+-.855(AT)-.666 G(H).855 E F0 .777
+(de\214nes the search path for the directory containing)144 439.2 R F2
+(dir)3.276 E F0 5.776(.A).73 G(lternati)-5.776 E 1.076 -.15(ve d)-.25 H
+.776(irectory names in).15 F F4(CDP)3.276 E -.855(AT)-.666 G(H).855 E F0
+.764(are separated by a colon \(:\).)144 451.2 R 3.264(An)5.764 G .764
+(ull directory name in)-3.264 F F4(CDP)3.264 E -.855(AT)-.666 G(H).855 E
+F0 .764(is the same as the current direc-)3.014 F(tory)144 463.2 Q 2.974
+(,i)-.65 G .474(.e., `)-2.974 F(`)-.74 E F1(.)A F0 -.74('')C 5.474(.I)
+.74 G(f)-5.474 E F2(dir)3.324 E F0(be)3.704 E .474
+(gins with a slash \(/\), then)-.15 F F4(CDP)2.974 E -.855(AT)-.666 G(H)
+.855 E F0 .473(is not used. The)2.724 F F1<ad50>2.973 E F0 .473
+(option says to use)2.973 F .579(the ph)144 475.2 R .579
+(ysical directory structure instead of follo)-.05 F .579
+(wing symbolic links \(see also the)-.25 F F1<ad50>3.08 E F0 .58
+(option to the)3.08 F F1(set)144 487.2 Q F0 -.2(bu)3.384 G .884
+(iltin command\); the).2 F F1<ad4c>3.384 E F0 .884
+(option forces symbolic links to be follo)3.384 F 3.384(wed. An)-.25 F
+(ar)3.383 E .883(gument of)-.18 F F1<ad>3.383 E F0(is)3.383 E(equi)144
+499.2 Q -.25(va)-.25 G .062(lent to).25 F F4($OLDPWD)2.562 E/F5 9
+/Times-Roman@0 SF(.)A F0 .062(If a non-empty directory name from)4.562 F
+F1(CDP)2.562 E -.95(AT)-.74 G(H).95 E F0 .063(is used, or if)2.562 F F1
+<ad>2.563 E F0 .063(is the \214rst)2.563 F(ar)144 511.2 Q .116(gument, \
+and the directory change is successful, the absolute pathname of the ne)
+-.18 F 2.615(ww)-.25 G .115(orking direc-)-2.715 F 1.164
+(tory is written to the standard output.)144 523.2 R 1.164(The return v)
+6.164 F 1.165(alue is true if the directory w)-.25 F 1.165
+(as successfully)-.1 F(changed; f)144 535.2 Q(alse otherwise.)-.1 E F1
+(caller)108 552 Q F0([)2.5 E F2 -.2(ex)C(pr).2 E F0(])A .254
+(Returns the conte)144 564 R .254(xt of an)-.15 F 2.754(ya)-.15 G(cti)
+-2.754 E .554 -.15(ve s)-.25 H .254
+(ubroutine call \(a shell function or a script e).15 F -.15(xe)-.15 G
+.254(cuted with the).15 F F1(.)2.753 E F0(or)2.753 E F1(sour)144 576 Q
+(ce)-.18 E F0 -.2(bu)3.062 G 3.062(iltins. W).2 F(ithout)-.4 E F2 -.2
+(ex)3.062 G(pr).2 E F0(,)A F1(caller)3.062 E F0 .562
+(displays the line number and source \214lename of the current)3.062 F
+.254(subroutine call.)144 588 R .254(If a non-ne)5.254 F -.05(ga)-.15 G
+(ti).05 E .554 -.15(ve i)-.25 H(nte).15 E .253(ger is supplied as)-.15 F
+F2 -.2(ex)2.753 G(pr).2 E F0(,)A F1(caller)2.753 E F0 .253
+(displays the line number)2.753 F 2.753(,s)-.4 G(ub-)-2.753 E 1.327(rou\
+tine name, and source \214le corresponding to that position in the curr\
+ent e)144 600 R -.15(xe)-.15 G 1.328(cution call stack.).15 F .001
+(This e)144 612 R .001(xtra information may be used, for e)-.15 F .001
+(xample, to print a stack trace.)-.15 F(The current frame is frame)5 E
+3.019(0. The)144 624 R .519(return v)3.019 F .519
+(alue is 0 unless the shell is not e)-.25 F -.15(xe)-.15 G .52
+(cuting a subroutine call or).15 F F2 -.2(ex)3.02 G(pr).2 E F0 .52
+(does not corre-)3.02 F(spond to a v)144 636 Q
+(alid position in the call stack.)-.25 E F1(command)108 652.8 Q F0([)2.5
+E F1(\255pVv)A F0(])A F2(command)2.5 E F0([)2.5 E F2(ar)A(g)-.37 E F0
+(...])2.5 E(Run)144 664.8 Q F2(command)2.957 E F0(with)3.527 E F2(ar)
+3.087 E(gs)-.37 E F0 .257
+(suppressing the normal shell function lookup. Only b)3.027 F .257
+(uiltin commands or)-.2 F .501(commands found in the)144 676.8 R F4
+-.666(PA)3.001 G(TH)-.189 E F0 .502(are e)2.751 F -.15(xe)-.15 G 3.002
+(cuted. If).15 F(the)3.002 E F1<ad70>3.002 E F0 .502(option is gi)3.002
+F -.15(ve)-.25 G .502(n, the search for).15 F F2(command)3.202 E F0(is)
+3.772 E .232(performed using a def)144 688.8 R .231(ault v)-.1 F .231
+(alue for)-.25 F F1 -.74(PA)2.731 G(TH)-.21 E F0 .231
+(that is guaranteed to \214nd all of the standard utilities.)2.731 F(If)
+5.231 E .174(either the)144 700.8 R F1<ad56>2.674 E F0(or)2.674 E F1
+<ad76>2.674 E F0 .175(option is supplied, a description of)2.674 F F2
+(command)2.875 E F0 .175(is printed.)3.445 F(The)5.175 E F1<ad76>2.675 E
+F0 .175(option causes)2.675 F 3.11(as)144 712.8 S .61(ingle w)-3.11 F
+.61(ord indicating the command or \214le name used to in)-.1 F -.2(vo)
+-.4 G -.1(ke).2 G F2(command)3.41 E F0 .61(to be displayed; the)3.88 F
+F1<ad56>144 724.8 Q F0 .249(option produces a more v)2.749 F .249
+(erbose description.)-.15 F .249(If the)5.249 F F1<ad56>2.749 E F0(or)
+2.749 E F1<ad76>2.75 E F0 .25(option is supplied, the e)2.75 F .25
+(xit status)-.15 F(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)
+-.15 G(mber 27).15 E(2)190.545 E 0 Cg EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E 1.005
+(is 0 if)144 84 R/F1 10/Times-Italic@0 SF(command)3.705 E F0 -.1(wa)
+4.275 G 3.505(sf).1 G 1.005(ound, and 1 if not.)-3.505 F 1.004
+(If neither option is supplied and an error occurred or)6.005 F F1
+(command)144.2 96 Q F0 1.598(cannot be found, the e)4.868 F 1.599
+(xit status is 127.)-.15 F 1.599(Otherwise, the e)6.599 F 1.599
+(xit status of the)-.15 F/F2 10/Times-Bold@0 SF(command)4.099 E F0 -.2
+(bu)144 108 S(iltin is the e).2 E(xit status of)-.15 E F1(command)2.5 E
+F0(.).77 E F2(compgen)108 124.8 Q F0([)2.5 E F1(option)A F0 2.5(][)C F1
+(wor)-2.5 E(d)-.37 E F0(])A .013
+(Generate possible completion matches for)144 136.8 R F1(wor)2.513 E(d)
+-.37 E F0 .013(according to the)2.513 F F1(option)2.513 E F0 .013
+(s, which may be an)B 2.512(yo)-.15 G(ption)-2.512 E .981
+(accepted by the)144 148.8 R F2(complete)3.481 E F0 -.2(bu)3.481 G .981
+(iltin with the e).2 F .981(xception of)-.15 F F2<ad70>3.481 E F0(and)
+3.481 E F2<ad72>3.481 E F0 3.481(,a)C .982(nd write the matches to the)
+-3.481 F 1.415(standard output.)144 160.8 R 1.415(When using the)6.415 F
+F2<ad46>3.915 E F0(or)3.915 E F2<ad43>3.915 E F0 1.415(options, the v)
+3.915 F 1.415(arious shell v)-.25 F 1.415(ariables set by the pro-)-.25
+F(grammable completion f)144 172.8 Q(acilities, while a)-.1 E -.25(va)
+-.2 G(ilable, will not ha).25 E .3 -.15(ve u)-.2 H(seful v).15 E(alues.)
+-.25 E .352(The matches will be generated in the same w)144 196.8 R .352
+(ay as if the programmable completion code had gen-)-.1 F .02(erated th\
+em directly from a completion speci\214cation with the same \215ags.)144
+208.8 R(If)5.02 E F1(wor)2.52 E(d)-.37 E F0 .02(is speci\214ed, only)
+2.52 F(those completions matching)144 220.8 Q F1(wor)2.5 E(d)-.37 E F0
+(will be displayed.)2.5 E(The return v)144 244.8 Q
+(alue is true unless an in)-.25 E -.25(va)-.4 G
+(lid option is supplied, or no matches were generated.).25 E F2
+(complete)108 261.6 Q F0([)2.786 E F2(\255abcdefgjksuv)A F0 2.786(][)C
+F2<ad6f>-2.786 E F1(comp-option)2.786 E F0 2.786(][)C F2<ad41>-2.786 E
+F1(action)2.786 E F0 2.786(][)C F2<ad47>-2.786 E F1(globpat)2.786 E F0
+2.786(][)C F2<ad57>-2.786 E F1(wor)2.786 E(dlist)-.37 E F0 2.786(][)C F2
+<ad50>-2.786 E F1(pr)2.786 E(e\214x)-.37 E F0 2.787(][)C F2<ad53>-2.787
+E F1(suf-)2.787 E<8c78>108 273.6 Q F0(])A([)144 285.6 Q F2<ad58>A F1
+(\214lterpat)2.5 E F0 2.5(][)C F2<ad46>-2.5 E F1(function)2.5 E F0 2.5
+(][)C F2<ad43>-2.5 E F1(command)2.5 E F0(])A F1(name)2.5 E F0([)2.5 E F1
+(name ...)A F0(])A F2(complete \255pr)108 297.6 Q F0([)2.5 E F1(name)A
+F0(...])2.5 E .633(Specify ho)144 309.6 R 3.133(wa)-.25 G -.18(rg)-3.133
+G .633(uments to each).18 F F1(name)3.133 E F0 .633
+(should be completed.)3.133 F .634(If the)5.634 F F2<ad70>3.134 E F0
+.634(option is supplied, or if no)3.134 F .14(options are supplied, e)
+144 321.6 R .139(xisting completion speci\214cations are printed in a w)
+-.15 F .139(ay that allo)-.1 F .139(ws them to be)-.25 F .31
+(reused as input.)144 333.6 R(The)5.31 E F2<ad72>2.81 E F0 .31
+(option remo)2.81 F -.15(ve)-.15 G 2.81(sac).15 G .31
+(ompletion speci\214cation for each)-2.81 F F1(name)2.81 E F0 2.81(,o)C
+1.11 -.4(r, i)-2.81 H 2.81(fn).4 G(o)-2.81 E F1(name)2.81 E F0(s)A
+(are supplied, all completion speci\214cations.)144 345.6 Q 1.438
+(The process of applying these completion speci\214cations when w)144
+369.6 R 1.437(ord completion is attempted is)-.1 F(described abo)144
+381.6 Q .3 -.15(ve u)-.15 H(nder).15 E F2(Pr)2.5 E
+(ogrammable Completion)-.18 E F0(.)A .555
+(Other options, if speci\214ed, ha)144 405.6 R .855 -.15(ve t)-.2 H .555
+(he follo).15 F .555(wing meanings.)-.25 F .555(The ar)5.555 F .555
+(guments to the)-.18 F F2<ad47>3.056 E F0(,)A F2<ad57>3.056 E F0 3.056
+(,a)C(nd)-3.056 E F2<ad58>3.056 E F0 .723(options \(and, if necessary)
+144 417.6 R 3.223(,t)-.65 G(he)-3.223 E F2<ad50>3.223 E F0(and)3.223 E
+F2<ad53>3.223 E F0 .722
+(options\) should be quoted to protect them from e)3.223 F(xpan-)-.15 E
+(sion before the)144 429.6 Q F2(complete)2.5 E F0 -.2(bu)2.5 G
+(iltin is in).2 E -.2(vo)-.4 G -.1(ke).2 G(d.).1 E F2<ad6f>144 441.6 Q
+F1(comp-option)2.5 E F0(The)184 453.6 Q F1(comp-option)2.79 E F0 .291
+(controls se)2.791 F -.15(ve)-.25 G .291(ral aspects of the compspec')
+.15 F 2.791(sb)-.55 G(eha)-2.791 E .291(vior be)-.2 F .291
+(yond the simple)-.15 F(generation of completions.)184 465.6 Q F1
+(comp-option)5 E F0(may be one of:)2.5 E F2(bashdefault)184 477.6 Q F0
+.281(Perform the rest of the def)224 489.6 R(ault)-.1 E F2(bash)2.781 E
+F0 .281(completions if the compspec generates no)2.781 F(matches.)224
+501.6 Q F2(default)184 513.6 Q F0 2.875(Use readline')10 F 5.375(sd)-.55
+G(ef)-5.375 E 2.876
+(ault \214lename completion if the compspec generates no)-.1 F(matches.)
+224 525.6 Q F2(dir)184 537.6 Q(names)-.15 E F0(Perform directory name c\
+ompletion if the compspec generates no matches.)224 549.6 Q F2
+(\214lenames)184 561.6 Q F0 -.7(Te)224 573.6 S .137(ll readline that th\
+e compspec generates \214lenames, so it can perform an).7 F 2.636<798c>
+-.15 G(le-)-2.636 E .496(name\255speci\214c processing \(lik)224 585.6 R
+2.996(ea)-.1 G .496(dding a slash to directory names or suppress-)-2.996
+F(ing trailing spaces\).)224 597.6 Q
+(Intended to be used with shell functions.)5 E F2(nospace)184 609.6 Q F0
+-.7(Te)6.11 G .22(ll readline not to append a space \(the def).7 F .22
+(ault\) to w)-.1 F .22(ords completed at the end)-.1 F(of the line.)224
+621.6 Q F2<ad41>144 633.6 Q F1(action)2.5 E F0(The)184 645.6 Q F1
+(action)2.5 E F0(may be one of the follo)2.5 E
+(wing to generate a list of possible completions:)-.25 E F2(alias)184
+657.6 Q F0(Alias names.)20.55 E(May also be speci\214ed as)5 E F2<ad61>
+2.5 E F0(.)A F2(arrayv)184 669.6 Q(ar)-.1 E F0(Array v)224 681.6 Q
+(ariable names.)-.25 E F2 4.7(binding Readline)184 693.6 R F0 -.1(ke)2.5
+G 2.5(yb)-.05 G(inding names.)-2.5 E F2 -.2(bu)184 705.6 S(iltin).2 E F0
+(Names of shell b)11.85 E(uiltin commands.)-.2 E
+(May also be speci\214ed as)5 E F2<ad62>2.5 E F0(.)A(GNU Bash-2.05a)72
+768 Q(2001 No)126.115 E -.15(ve)-.15 G(mber 27).15 E(3)190.545 E 0 Cg EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Times-Bold@0 SF(command)184 84 Q F0(Command names.)224 96 Q
+(May also be speci\214ed as)5 E F1<ad63>2.5 E F0(.)A F1(dir)184 108 Q
+(ectory)-.18 E F0(Directory names.)224 120 Q(May also be speci\214ed as)
+5 E F1<ad64>2.5 E F0(.)A F1(disabled)184 132 Q F0
+(Names of disabled shell b)224 144 Q(uiltins.)-.2 E F1(enabled)184 156 Q
+F0(Names of enabled shell b)6.66 E(uiltins.)-.2 E F1(export)184 168 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 F1(\214le)184 180 Q
+F0(File names.)27.22 E(May also be speci\214ed as)5 E F1<ad66>2.5 E F0
+(.)A F1(function)184 192 Q F0(Names of shell functions.)224 204 Q F1(gr)
+184 216 Q(oup)-.18 E F0(Group names.)14.62 E(May also be speci\214ed as)
+5 E F1<ad67>2.5 E F0(.)A F1(helptopic)184 228 Q F0
+(Help topics as accepted by the)224 240 Q F1(help)2.5 E F0 -.2(bu)2.5 G
+(iltin.).2 E F1(hostname)184 252 Q F0(Hostnames, as tak)224 264 Q
+(en from the \214le speci\214ed by the)-.1 E/F2 9/Times-Bold@0 SF
+(HOSTFILE)2.5 E F0(shell v)2.25 E(ariable.)-.25 E F1(job)184 276 Q F0
+(Job names, if job control is acti)26.11 E -.15(ve)-.25 G 5(.M).15 G
+(ay also be speci\214ed as)-5 E F1<ad6a>2.5 E F0(.)A F1 -.1(ke)184 288 S
+(yw).1 E(ord)-.1 E F0(Shell reserv)224 300 Q(ed w)-.15 E 2.5(ords. May)
+-.1 F(also be speci\214ed as)2.5 E F1<ad6b>2.5 E F0(.)A F1(running)184
+312 Q F0(Names of running jobs, if job control is acti)5.54 E -.15(ve)
+-.25 G(.).15 E F1(ser)184 324 Q(vice)-.1 E F0(Service names.)10.67 E
+(May also be speci\214ed as)5 E F1<ad73>2.5 E F0(.)A F1(setopt)184 336 Q
+F0 -1.11(Va)14.45 G(lid ar)1.11 E(guments for the)-.18 E F1<ad6f>2.5 E
+F0(option to the)2.5 E F1(set)2.5 E F0 -.2(bu)2.5 G(iltin.).2 E F1
+(shopt)184 348 Q F0(Shell option names as accepted by the)16.66 E F1
+(shopt)2.5 E F0 -.2(bu)2.5 G(iltin.).2 E F1(signal)184 360 Q F0
+(Signal names.)14.99 E F1(stopped)184 372 Q F0
+(Names of stopped jobs, if job control is acti)6.66 E -.15(ve)-.25 G(.)
+.15 E F1(user)184 384 Q F0(User names.)21.67 E
+(May also be speci\214ed as)5 E F1<ad75>2.5 E F0(.)A F1 -.1(va)184 396 S
+(riable).1 E F0(Names of all shell v)5.1 E 2.5(ariables. May)-.25 F
+(also be speci\214ed as)2.5 E F1<ad76>2.5 E F0(.)A F1<ad47>144 408 Q/F3
+10/Times-Italic@0 SF(globpat)2.5 E F0 1.41(The \214lename e)184 420 R
+1.411(xpansion pattern)-.15 F F3(globpat)3.911 E F0 1.411(is e)3.911 F
+1.411(xpanded to generate the possible comple-)-.15 F(tions.)184 432 Q
+F1<ad57>144 444 Q F3(wor)2.5 E(dlist)-.37 E F0(The)184 456 Q F3(wor)3.64
+E(dlist)-.37 E F0 1.14(is split using the characters in the)3.64 F F2
+(IFS)3.64 E F0 1.139(special v)3.39 F 1.139(ariable as delimiters, and)
+-.25 F 2.007(each resultant w)184 468 R 2.007(ord is e)-.1 F 4.507
+(xpanded. The)-.15 F 2.008(possible completions are the members of the)
+4.507 F(resultant list which match the w)184 480 Q(ord being completed.)
+-.1 E F1<ad43>144 492 Q F3(command)2.5 E(command)184 504 Q F0 1.056
+(is e)3.556 F -.15(xe)-.15 G 1.056(cuted in a subshell en).15 F 1.056
+(vironment, and its output is used as the possible)-.4 F(completions.)
+184 516 Q F1<ad46>144 528 Q F3(function)2.5 E F0 1.18
+(The shell function)184 540 R F3(function)3.68 E F0 1.181(is e)3.681 F
+-.15(xe)-.15 G 1.181(cuted in the current shell en).15 F 3.681
+(vironment. When)-.4 F 1.181(it \214n-)3.681 F .932
+(ishes, the possible completions are retrie)184 552 R -.15(ve)-.25 G
+3.432(df).15 G .932(rom the v)-3.432 F .932(alue of the)-.25 F F2
+(COMPREPL)3.431 E(Y)-.828 E F0(array)3.181 E -.25(va)184 564 S(riable.)
+.25 E F1<ad58>144 576 Q F3(\214lterpat)2.5 E(\214lterpat)184 588 Q F0
+.733(is a pattern as used for \214lename e)3.233 F 3.233(xpansion. It)
+-.15 F .733(is applied to the list of possible)3.233 F 1.596
+(completions generated by the preceding options and ar)184 600 R 1.596
+(guments, and each completion)-.18 F(matching)184 612 Q F3(\214lterpat)
+3.204 E F0 .704(is remo)3.204 F -.15(ve)-.15 G 3.204(df).15 G .704
+(rom the list.)-3.204 F 3.204(Al)5.704 G(eading)-3.204 E F1(!)3.204 E F0
+(in)3.204 E F3(\214lterpat)3.205 E F0(ne)3.205 E -.05(ga)-.15 G .705
+(tes the pattern;).05 F(in this case, an)184 624 Q 2.5(yc)-.15 G
+(ompletion not matching)-2.5 E F3(\214lterpat)2.5 E F0(is remo)2.5 E
+-.15(ve)-.15 G(d.).15 E F1<ad50>144 636 Q F3(pr)2.5 E(e\214x)-.37 E(pr)
+184 648 Q(e\214x)-.37 E F0 .535(is added at the be)3.035 F .534
+(ginning of each possible completion after all other options ha)-.15 F
+-.15(ve)-.2 G(been applied.)184 660 Q F1<ad53>144 672 Q F3(suf)2.5 E
+2.81(\214x suf)-.18 F<8c78>-.18 E F0
+(is appended to each possible completion after all other options ha)2.5
+E .3 -.15(ve b)-.2 H(een applied.).15 E .466(The return v)144 688.8 R
+.466(alue is true unless an in)-.25 F -.25(va)-.4 G .466
+(lid option is supplied, an option other than).25 F F1<ad70>2.967 E F0
+(or)2.967 E F1<ad72>2.967 E F0 .467(is sup-)2.967 F 1.362
+(plied without a)144 700.8 R F3(name)3.862 E F0(ar)3.862 E 1.361
+(gument, an attempt is made to remo)-.18 F 1.661 -.15(ve a c)-.15 H
+1.361(ompletion speci\214cation for a).15 F F3(name)144 712.8 Q F0
+(for which no speci\214cation e)2.5 E
+(xists, or an error occurs adding a completion speci\214cation.)-.15 E
+(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)-.15 G(mber 27).15 E
+(4)190.545 E 0 Cg EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Times-Bold@0 SF(continue)108 84 Q F0([)2.5 E/F2 10/Times-Italic@0 SF(n)
+A F0(])A 1.753(Resume the ne)144 96 R 1.753
+(xt iteration of the enclosing)-.15 F F1 -.25(fo)4.254 G(r).25 E F0(,)A
+F1(while)4.254 E F0(,)A F1(until)4.254 E F0 4.254(,o)C(r)-4.254 E F1
+(select)4.254 E F0 4.254(loop. If)4.254 F F2(n)4.614 E F0 1.754
+(is speci\214ed,)4.494 F 1.209(resume at the)144 108 R F2(n)3.709 E F0
+1.209(th enclosing loop.)B F2(n)6.569 E F0 1.209(must be)3.949 F/F3 10
+/Symbol SF<b3>3.709 E F0 3.709(1. If)3.709 F F2(n)4.069 E F0 1.209
+(is greater than the number of enclosing)3.949 F .667
+(loops, the last enclosing loop \(the `)144 120 R(`top-le)-.74 E -.15
+(ve)-.25 G(l').15 E 3.167('l)-.74 G .667(oop\) is resumed.)-3.167 F .668
+(The return v)5.668 F .668(alue is 0 unless the)-.25 F(shell is not e)
+144 132 Q -.15(xe)-.15 G(cuting a loop when).15 E F1(continue)2.5 E F0
+(is e)2.5 E -.15(xe)-.15 G(cuted.).15 E F1(declar)108 148.8 Q(e)-.18 E
+F0([)2.5 E F1(\255afFirtx)A F0 2.5(][)C F1<ad70>-2.5 E F0 2.5(][)C F2
+(name)-2.5 E F0([=)A F2(value)A F0 2.5(].)C(..])-2.5 E F1(typeset)108
+160.8 Q F0([)2.5 E F1(\255afFirtx)A F0 2.5(][)C F1<ad70>-2.5 E F0 2.5
+(][)C F2(name)-2.5 E F0([=)A F2(value)A F0 2.5(].)C(..])-2.5 E 1.265
+(Declare v)144 172.8 R 1.265(ariables and/or gi)-.25 F 1.565 -.15(ve t)
+-.25 H 1.265(hem attrib).15 F 3.765(utes. If)-.2 F(no)3.765 E F2(name)
+3.765 E F0 3.765(sa)C 1.265(re gi)-3.765 F -.15(ve)-.25 G 3.764(nt).15 G
+1.264(hen display the v)-3.764 F 1.264(alues of)-.25 F -.25(va)144 184.8
+S 3.326(riables. The).25 F F1<ad70>3.326 E F0 .826
+(option will display the attrib)3.326 F .826(utes and v)-.2 F .826
+(alues of each)-.25 F F2(name)3.326 E F0 5.827(.W).18 G(hen)-5.827 E F1
+<ad70>3.327 E F0 .827(is used,)3.327 F .22
+(additional options are ignored.)144 196.8 R(The)5.22 E F1<ad46>2.72 E
+F0 .22(option inhibits the display of function de\214nitions; only the)
+2.72 F .466(function name and attrib)144 208.8 R .466(utes are printed.)
+-.2 F .466(If the)5.466 F F1(extdeb)2.966 E(ug)-.2 E F0 .466
+(shell option is enabled using)2.966 F F1(shopt)2.966 E F0 2.966(,t)C
+(he)-2.966 E 1.308(source \214le name and line number where the functio\
+n is de\214ned are displayed as well.)144 220.8 R(The)6.308 E F1<ad46>
+3.808 E F0 .19(option implies)144 232.8 R F1<ad66>2.69 E F0 5.19(.T)C
+.19(he follo)-5.19 F .191
+(wing options can be used to restrict output to v)-.25 F .191
+(ariables with the speci-)-.25 F(\214ed attrib)144 244.8 Q(ute or to gi)
+-.2 E .3 -.15(ve v)-.25 H(ariables attrib)-.1 E(utes:)-.2 E F1<ad61>144
+256.8 Q F0(Each)25.3 E F2(name)2.5 E F0(is an array v)2.5 E
+(ariable \(see)-.25 E F1(Arrays)2.5 E F0(abo)2.5 E -.15(ve)-.15 G(\).)
+.15 E F1<ad66>144 268.8 Q F0(Use function names only)26.97 E(.)-.65 E F1
+<ad69>144 280.8 Q F0 .558(The v)27.52 F .558
+(ariable is treated as an inte)-.25 F .558(ger; arithmetic e)-.15 F -.25
+(va)-.25 G .558(luation \(see).25 F/F4 9/Times-Bold@0 SF .557
+(ARITHMETIC EV)3.058 F(ALU)-1.215 E(A-)-.54 E(TION \))180 292.8 Q F0
+(is performed when the v)2.25 E(ariable is assigned a v)-.25 E(alue.)
+-.25 E F1<ad72>144 304.8 Q F0(Mak)25.86 E(e)-.1 E F2(name)5.046 E F0
+5.046(sr)C(eadonly)-5.046 E 7.546(.T)-.65 G 2.546
+(hese names cannot then be assigned v)-7.546 F 2.547
+(alues by subsequent)-.25 F(assignment statements or unset.)180 316.8 Q
+F1<ad74>144 328.8 Q F0(Gi)26.97 E 1.231 -.15(ve e)-.25 H(ach).15 E F2
+(name)3.431 E F0(the)3.431 E F2(tr)3.431 E(ace)-.15 E F0(attrib)3.431 E
+3.431(ute. T)-.2 F .931(raced functions inherit the)-.35 F F1(DEB)3.431
+E(UG)-.1 E F0 .93(trap from the)3.43 F(calling shell.)180 340.8 Q
+(The trace attrib)5 E(ute has no special meaning for v)-.2 E(ariables.)
+-.25 E F1<ad78>144 352.8 Q F0(Mark)25.3 E F2(name)2.5 E F0 2.5(sf)C
+(or e)-2.5 E(xport to subsequent commands via the en)-.15 E(vironment.)
+-.4 E .336(Using `+' instead of `\255' turns of)144 369.6 R 2.837(ft)
+-.25 G .337(he attrib)-2.837 F .337(ute instead, with the e)-.2 F .337
+(xception that)-.15 F F1(+a)2.837 E F0 .337(may not be used)2.837 F .793
+(to destro)144 381.6 R 3.293(ya)-.1 G 3.293(na)-3.293 G .793(rray v)
+-3.293 F 3.293(ariable. When)-.25 F .793(used in a function, mak)3.293 F
+.793(es each)-.1 F F2(name)3.293 E F0 .793(local, as with the)3.293 F F1
+(local)3.292 E F0 2.842(command. If)144 393.6 R 2.842(av)2.842 G .342
+(ariable name is follo)-3.092 F .342(wed by =)-.25 F F2(value)A F0 2.842
+(,t)C .342(he v)-2.842 F .342(alue of the v)-.25 F .343
+(ariable is set to)-.25 F F2(value)2.843 E F0 5.343(.T)C(he)-5.343 E
+.801(return v)144 405.6 R .801(alue is 0 unless an in)-.25 F -.25(va)-.4
+G .8
+(lid option is encountered, an attempt is made to de\214ne a function)
+.25 F(using)144 417.6 Q/F5 10/Courier@0 SF 1.038(\255f foo=bar)3.538 F
+F0 3.538(,a)C 3.538(na)-3.538 G 1.038(ttempt is made to assign a v)
+-3.538 F 1.038(alue to a readonly v)-.25 F 1.039(ariable, an attempt is)
+-.25 F .974(made to assign a v)144 429.6 R .974(alue to an array v)-.25
+F .974(ariable without using the compound assignment syntax \(see)-.25 F
+F1(Arrays)144 441.6 Q F0(abo)2.86 E -.15(ve)-.15 G .36(\), one of the)
+.15 F F2(names)2.86 E F0 .36(is not a v)2.86 F .36(alid shell v)-.25 F
+.36(ariable name, an attempt is made to turn of)-.25 F(f)-.25 E .057
+(readonly status for a readonly v)144 453.6 R .057
+(ariable, an attempt is made to turn of)-.25 F 2.556(fa)-.25 G .056
+(rray status for an array v)-2.556 F(ari-)-.25 E
+(able, or an attempt is made to display a non-e)144 465.6 Q
+(xistent function with)-.15 E F1<ad66>2.5 E F0(.)A F1
+(dirs [\255clpv] [+)108 482.4 Q F2(n)A F1 2.5(][)C<ad>-2.5 E F2(n)A F1
+(])A F0 -.4(Wi)144 494.4 S .328
+(thout options, displays the list of currently remembered directories.)
+.4 F .329(The def)5.329 F .329(ault display is on a)-.1 F 1.238
+(single line with directory names separated by spaces.)144 506.4 R 1.238
+(Directories are added to the list with the)6.238 F F1(pushd)144 518.4 Q
+F0(command; the)2.5 E F1(popd)2.5 E F0(command remo)2.5 E -.15(ve)-.15 G
+2.5(se).15 G(ntries from the list.)-2.5 E F1(+)144 530.4 Q F2(n)A F0
+1.564(Displays the)25.3 F F2(n)4.064 E F0 1.565
+(th entry counting from the left of the list sho)B 1.565(wn by)-.25 F F1
+(dirs)4.065 E F0 1.565(when in)4.065 F -.2(vo)-.4 G -.1(ke).2 G(d).1 E
+(without options, starting with zero.)180 542.4 Q F1<ad>144 554.4 Q F2
+(n)A F0 1.194(Displays the)25.3 F F2(n)3.694 E F0 1.194
+(th entry counting from the right of the list sho)B 1.194(wn by)-.25 F
+F1(dirs)3.694 E F0 1.194(when in)3.694 F -.2(vo)-.4 G -.1(ke).2 G(d).1 E
+(without options, starting with zero.)180 566.4 Q F1<ad63>144 578.4 Q F0
+(Clears the directory stack by deleting all of the entries.)25.86 E F1
+<ad6c>144 590.4 Q F0 .324(Produces a longer listing; the def)27.52 F
+.324(ault listing format uses a tilde to denote the home direc-)-.1 F
+(tory)180 602.4 Q(.)-.65 E F1<ad70>144 614.4 Q F0
+(Print the directory stack with one entry per line.)24.74 E F1<ad76>144
+626.4 Q F0 .273(Print the directory stack with one entry per line, pre\
+\214xing each entry with its inde)25.3 F 2.772(xi)-.15 G 2.772(nt)-2.772
+G(he)-2.772 E(stack.)180 638.4 Q .257(The return v)144 655.2 R .258
+(alue is 0 unless an in)-.25 F -.25(va)-.4 G .258
+(lid option is supplied or).25 F F2(n)2.758 E F0(inde)2.758 E -.15(xe)
+-.15 G 2.758(sb).15 G -.15(ey)-2.758 G .258(ond the end of the direc-)
+.15 F(tory stack.)144 667.2 Q F1(diso)108 684 Q(wn)-.1 E F0([)2.5 E F1
+(\255ar)A F0 2.5(][)C F1<ad68>-2.5 E F0 2.5(][)C F2(jobspec)-2.5 E F0
+(...])2.5 E -.4(Wi)144 696 S .331(thout options, each).4 F F2(jobspec)
+4.571 E F0 .331(is remo)3.141 F -.15(ve)-.15 G 2.831(df).15 G .331
+(rom the table of acti)-2.831 F .63 -.15(ve j)-.25 H 2.83(obs. If).15 F
+(the)2.83 E F1<ad68>2.83 E F0 .33(option is gi)2.83 F -.15(ve)-.25 G(n,)
+.15 E(each)144 708 Q F2(jobspec)4.52 E F0 .28(is not remo)3.09 F -.15
+(ve)-.15 G 2.78(df).15 G .28(rom the table, b)-2.78 F .28(ut is mark)-.2
+F .28(ed so that)-.1 F F4(SIGHUP)2.78 E F0 .281
+(is not sent to the job if)2.53 F 1.332(the shell recei)144 720 R -.15
+(ve)-.25 G 3.832(sa).15 G F4(SIGHUP)A/F6 9/Times-Roman@0 SF(.)A F0 1.332
+(If no)5.832 F F2(jobspec)5.572 E F0 1.332(is present, and neither the)
+4.142 F F1<ad61>3.832 E F0 1.332(nor the)3.832 F F1<ad72>3.832 E F0
+1.331(option is)3.831 F(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15
+(ve)-.15 G(mber 27).15 E(5)190.545 E 0 Cg EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E 1.228
+(supplied, the)144 84 R/F1 10/Times-Italic@0 SF(curr)3.728 E 1.228
+(ent job)-.37 F F0 1.229(is used.)3.729 F 1.229(If no)6.229 F F1
+(jobspec)5.469 E F0 1.229(is supplied, the)4.039 F/F2 10/Times-Bold@0 SF
+<ad61>3.729 E F0 1.229(option means to remo)3.729 F 1.529 -.15(ve o)-.15
+H(r).15 E .657(mark all jobs; the)144 96 R F2<ad72>3.157 E F0 .657
+(option without a)3.157 F F1(jobspec)4.897 E F0(ar)3.467 E .656
+(gument restricts operation to running jobs.)-.18 F(The)5.656 E
+(return v)144 108 Q(alue is 0 unless a)-.25 E F1(jobspec)4.24 E F0
+(does not specify a v)2.81 E(alid job)-.25 E(.)-.4 E F2(echo)108 124.8 Q
+F0([)2.5 E F2(\255neE)A F0 2.5(][)C F1(ar)-2.5 E(g)-.37 E F0(...])2.5 E
+.394(Output the)144 136.8 R F1(ar)2.894 E(g)-.37 E F0 .394
+(s, separated by spaces, follo)B .395(wed by a ne)-.25 F 2.895
+(wline. The)-.25 F .395(return status is al)2.895 F -.1(wa)-.1 G .395
+(ys 0.).1 F(If)5.395 E F2<ad6e>2.895 E F0 .549
+(is speci\214ed, the trailing ne)144 148.8 R .548(wline is suppressed.)
+-.25 F .548(If the)5.548 F F2<ad65>3.048 E F0 .548(option is gi)3.048 F
+-.15(ve)-.25 G .548(n, interpretation of the fol-).15 F(lo)144 160.8 Q
+.052(wing backslash-escaped characters is enabled.)-.25 F(The)5.052 E F2
+<ad45>2.552 E F0 .053(option disables the interpretation of these)2.553
+F 1.503(escape characters, e)144 172.8 R -.15(ve)-.25 G 4.003(no).15 G
+4.003(ns)-4.003 G 1.502(ystems where the)-4.003 F 4.002(ya)-.15 G 1.502
+(re interpreted by def)-4.002 F 4.002(ault. The)-.1 F F2(xpg_echo)4.002
+E F0(shell)4.002 E .009
+(option may be used to dynamically determine whether or not)144 184.8 R
+F2(echo)2.509 E F0 -.15(ex)2.51 G .01(pands these escape characters).15
+F .66(by def)144 196.8 R(ault.)-.1 E F2(echo)5.66 E F0 .66
+(does not interpret)3.16 F F2<adad>3.16 E F0 .659
+(to mean the end of options.)3.159 F F2(echo)5.659 E F0 .659
+(interprets the follo)3.159 F(wing)-.25 E(escape sequences:)144 208.8 Q
+F2(\\a)144 220.8 Q F0(alert \(bell\))28.22 E F2(\\b)144 232.8 Q F0
+(backspace)27.66 E F2(\\c)144 244.8 Q F0(suppress trailing ne)28.78 E
+(wline)-.25 E F2(\\e)144 256.8 Q F0(an escape character)28.78 E F2(\\f)
+144 268.8 Q F0(form feed)29.89 E F2(\\n)144 280.8 Q F0(ne)27.66 E 2.5
+(wl)-.25 G(ine)-2.5 E F2(\\r)144 292.8 Q F0(carriage return)28.78 E F2
+(\\t)144 304.8 Q F0(horizontal tab)29.89 E F2(\\v)144 316.8 Q F0 -.15
+(ve)28.22 G(rtical tab).15 E F2(\\\\)144 328.8 Q F0(backslash)30.44 E F2
+(\\0)144 340.8 Q F1(nnn)A F0(the eight-bit character whose v)13.22 E
+(alue is the octal v)-.25 E(alue)-.25 E F1(nnn)2.5 E F0
+(\(zero to three octal digits\))2.5 E F2(\\)144 352.8 Q F1(nnn)A F0
+(the eight-bit character whose v)18.22 E(alue is the octal v)-.25 E
+(alue)-.25 E F1(nnn)2.5 E F0(\(one to three octal digits\))2.5 E F2(\\x)
+144 364.8 Q F1(HH)A F0(the eight-bit character whose v)13.78 E
+(alue is the he)-.25 E(xadecimal v)-.15 E(alue)-.25 E F1(HH)2.5 E F0
+(\(one or tw)2.5 E 2.5(oh)-.1 G .3 -.15(ex d)-2.5 H(igits\)).15 E F2
+(enable)108 381.6 Q F0([)2.5 E F2(\255adnps)A F0 2.5(][)C F2<ad66>-2.5 E
+F1(\214lename)2.5 E F0 2.5(][)C F1(name)-2.5 E F0(...])2.5 E .277
+(Enable and disable b)144 393.6 R .278(uiltin shell commands.)-.2 F .278
+(Disabling a b)5.278 F .278(uiltin allo)-.2 F .278
+(ws a disk command which has)-.25 F .834(the same name as a shell b)144
+405.6 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.333
+(nt).15 G(hough)-3.333 E .989(the shell normally searches for b)144
+417.6 R .989(uiltins before disk commands.)-.2 F(If)5.989 E F2<ad6e>
+3.489 E F0 .99(is used, each)3.49 F F1(name)3.49 E F0 .99(is dis-)3.49 F
+1.582(abled; otherwise,)144 429.6 R F1(names)4.082 E F0 1.582
+(are enabled.)4.082 F -.15(Fo)6.582 G 4.082(re).15 G 1.582
+(xample, to use the)-4.232 F F2(test)4.082 E F0 1.582
+(binary found via the)4.082 F/F3 9/Times-Bold@0 SF -.666(PA)4.081 G(TH)
+-.189 E F0 .08(instead of the shell b)144 441.6 R .08(uiltin v)-.2 F .08
+(ersion, run)-.15 F/F4 10/Courier@0 SF .081(enable -n test)2.58 F F0
+5.081(.T)C(he)-5.081 E F2<ad66>2.581 E F0 .081
+(option means to load the ne)2.581 F(w)-.25 E -.2(bu)144 453.6 S 1.525
+(iltin command).2 F F1(name)4.385 E F0 1.524(from shared object)4.204 F
+F1(\214lename)4.024 E F0 4.024(,o).18 G 4.024(ns)-4.024 G 1.524
+(ystems that support dynamic loading.)-4.024 F(The)144 465.6 Q F2<ad64>
+2.866 E F0 .366(option will delete a b)2.866 F .366(uiltin pre)-.2 F
+.366(viously loaded with)-.25 F F2<ad66>2.867 E F0 5.367(.I)C 2.867(fn)
+-5.367 G(o)-2.867 E F1(name)2.867 E F0(ar)2.867 E .367(guments are gi)
+-.18 F -.15(ve)-.25 G .367(n, or).15 F .399(if the)144 477.6 R F2<ad70>
+2.899 E F0 .399(option is supplied, a list of shell b)2.899 F .399
+(uiltins is printed.)-.2 F -.4(Wi)5.399 G .399(th no other option ar).4
+F .398(guments, the)-.18 F .098(list consists of all enabled shell b)144
+489.6 R 2.598(uiltins. If)-.2 F F2<ad6e>2.598 E F0 .098
+(is supplied, only disabled b)2.598 F .099(uiltins are printed.)-.2 F
+(If)5.099 E F2<ad61>2.599 E F0 1.917
+(is supplied, the list printed includes all b)144 501.6 R 1.916
+(uiltins, with an indication of whether or not each is)-.2 F 2.878
+(enabled. If)144 513.6 R F2<ad73>2.878 E F0 .379
+(is supplied, the output is restricted to the POSIX)2.878 F F1(special)
+2.879 E F0 -.2(bu)2.879 G 2.879(iltins. The).2 F .379(return v)2.879 F
+(alue)-.25 E .995(is 0 unless a)144 525.6 R F1(name)3.855 E F0 .994
+(is not a shell b)3.675 F .994(uiltin or there is an error loading a ne)
+-.2 F 3.494(wb)-.25 G .994(uiltin from a shared)-3.694 F(object.)144
+537.6 Q F2 -2.3 -.15(ev a)108 554.4 T(l).15 E F0([)2.5 E F1(ar)A(g)-.37
+E F0(...])2.5 E(The)144 566.4 Q F1(ar)3.17 E(g)-.37 E F0 3.17(sa)C .671
+(re read and concatenated together into a single command.)-3.17 F .671
+(This command is then read)5.671 F .495(and e)144 578.4 R -.15(xe)-.15 G
+.495(cuted by the shell, and its e).15 F .495
+(xit status is returned as the v)-.15 F .495(alue of)-.25 F F2 -2.3 -.15
+(ev a)2.995 H(l).15 E F0 5.495(.I)C 2.995(ft)-5.495 G .495(here are no)
+-2.995 F F1(ar)2.995 E(gs)-.37 E F0(,).27 E(or only null ar)144 590.4 Q
+(guments,)-.18 E F2 -2.3 -.15(ev a)2.5 H(l).15 E F0(returns 0.)2.5 E F2
+(exec)108 607.2 Q F0([)2.5 E F2(\255cl)A F0 2.5(][)C F2<ad61>-2.5 E F1
+(name)2.5 E F0 2.5(][)C F1(command)-2.5 E F0([)2.5 E F1(ar)A(guments)
+-.37 E F0(]])A(If)144 619.2 Q F1(command)3.005 E F0 .305
+(is speci\214ed, it replaces the shell.)3.575 F .305(No ne)5.305 F 2.805
+(wp)-.25 G .306(rocess is created.)-2.805 F(The)5.306 E F1(ar)3.136 E
+(guments)-.37 E F0(become)3.076 E .177(the ar)144 631.2 R .177
+(guments to)-.18 F F1(command)2.676 E F0 5.176(.I)C 2.676(ft)-5.176 G
+(he)-2.676 E F2<ad6c>2.676 E F0 .176
+(option is supplied, the shell places a dash at the be)2.676 F .176
+(ginning of)-.15 F .159(the zeroth ar)144 643.2 R 2.659(gp)-.18 G .159
+(assed to)-2.659 F F1(command)2.659 E F0 5.159(.T).77 G .159
+(his is what)-5.159 F F1(lo)2.659 E(gin)-.1 E F0 .159(\(1\) does.).24 F
+(The)5.16 E F2<ad63>2.66 E F0 .16(option causes)2.66 F F1(command)2.86 E
+F0(to)3.43 E 1.196(be e)144 655.2 R -.15(xe)-.15 G 1.196
+(cuted with an empty en).15 F 3.696(vironment. If)-.4 F F2<ad61>3.696 E
+F0 1.196(is supplied, the shell passes)3.696 F F1(name)4.055 E F0 1.195
+(as the zeroth)3.875 F(ar)144 667.2 Q .02(gument to the e)-.18 F -.15
+(xe)-.15 G .02(cuted command.).15 F(If)5.02 E F1(command)2.72 E F0 .02
+(cannot be e)3.29 F -.15(xe)-.15 G .02
+(cuted for some reason, a non-inter).15 F(-)-.2 E(acti)144 679.2 Q 1.067
+-.15(ve s)-.25 H .767(hell e).15 F .767(xits, unless the shell option)
+-.15 F F2(execfail)3.266 E F0 .766
+(is enabled, in which case it returns f)3.266 F 3.266(ailure. An)-.1 F
+(interacti)144 691.2 Q 1.518 -.15(ve s)-.25 H 1.218(hell returns f).15 F
+1.219(ailure if the \214le cannot be e)-.1 F -.15(xe)-.15 G 3.719
+(cuted. If).15 F F1(command)3.919 E F0 1.219(is not speci\214ed, an)
+4.489 F(y)-.15 E .134(redirections tak)144 703.2 R 2.634(ee)-.1 G -.25
+(ff)-2.634 G .134(ect in the current shell, and the return status is 0.)
+.25 F .134(If there is a redirection error)5.134 F(,)-.4 E
+(the return status is 1.)144 715.2 Q(GNU Bash-2.05a)72 768 Q(2001 No)
+126.115 E -.15(ve)-.15 G(mber 27).15 E(6)190.545 E 0 Cg EP
+%%Page: 7 7
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Times-Bold@0 SF(exit)108 84 Q F0([)2.5 E/F2 10/Times-Italic@0 SF(n)A F0
+6.29(]C)C .095(ause the shell to e)-6.29 F .095(xit with a status of)
+-.15 F F2(n)2.595 E F0 5.095(.I)C(f)-5.095 E F2(n)2.955 E F0 .096
+(is omitted, the e)2.835 F .096(xit status is that of the last command)
+-.15 F -.15(exe)144 96 S 2.5(cuted. A).15 F(trap on)2.5 E/F3 9
+/Times-Bold@0 SF(EXIT)2.5 E F0(is e)2.25 E -.15(xe)-.15 G
+(cuted before the shell terminates.).15 E F1(export)108 112.8 Q F0([)2.5
+E F1(\255fn)A F0 2.5(][).833 G F2(name)-2.5 E F0([=)A F2(wor)A(d)-.37 E
+F0(]] ...)A F1(export \255p)108 124.8 Q F0 .257(The supplied)144 136.8 R
+F2(names)3.117 E F0 .257(are mark)3.027 F .257(ed for automatic e)-.1 F
+.257(xport to the en)-.15 F .257(vironment of subsequently e)-.4 F -.15
+(xe)-.15 G(cuted).15 E 2.626(commands. If)144 148.8 R(the)2.626 E F1
+<ad66>2.626 E F0 .127(option is gi)2.627 F -.15(ve)-.25 G .127(n, the)
+.15 F F2(names)2.987 E F0 .127(refer to functions.)2.897 F .127(If no)
+5.127 F F2(names)2.987 E F0 .127(are gi)2.897 F -.15(ve)-.25 G .127
+(n, or if the).15 F F1<ad70>144 160.8 Q F0 .66
+(option is supplied, a list of all names that are e)3.16 F .659
+(xported in this shell is printed.)-.15 F(The)5.659 E F1<ad6e>3.159 E F0
+(option)3.159 E 1.586(causes the e)144 172.8 R 1.586
+(xport property to be remo)-.15 F -.15(ve)-.15 G 4.086(df).15 G 1.586
+(rom each)-4.086 F F2(name)4.086 E F0 6.586(.I)C 4.086(fav)-6.586 G
+1.587(ariable name is follo)-4.336 F 1.587(wed by)-.25 F(=)144 184.8 Q
+F2(wor)A(d)-.37 E F0 2.804(,t)C .304(he v)-2.804 F .304(alue of the v)
+-.25 F .304(ariable is set to)-.25 F F2(wor)2.804 E(d)-.37 E F0(.)A F1
+(export)5.304 E F0 .304(returns an e)2.804 F .303
+(xit status of 0 unless an in)-.15 F -.25(va)-.4 G(lid).25 E .293
+(option is encountered, one of the)144 196.8 R F2(names)2.793 E F0 .293
+(is not a v)2.793 F .293(alid shell v)-.25 F .293(ariable name, or)-.25
+F F1<ad66>2.793 E F0 .294(is supplied with a)2.793 F F2(name)144.36
+208.8 Q F0(that is not a function.)2.68 E F1(fc)108 225.6 Q F0([)2.5 E
+F1<ad65>A F2(ename)2.5 E F0 2.5(][)C F1(\255nlr)-2.5 E F0 2.5(][)C F2
+<8c72>-2.5 E(st)-.1 E F0 2.5(][)C F2(last)-2.5 E F0(])A F1(fc \255s)108
+237.6 Q F0([)2.5 E F2(pat)A F0(=)A F2 -.37(re)C(p).37 E F0 2.5(][)C F2
+(cmd)-2.5 E F0(])A .478(Fix Command.)144 249.6 R .478
+(In the \214rst form, a range of commands from)5.478 F F2<8c72>4.888 E
+(st)-.1 E F0(to)3.658 E F2(last)3.068 E F0 .477
+(is selected from the his-)3.658 F .881(tory list.)144 261.6 R F2 -.45
+(Fi)5.881 G -.1(rs).45 G(t).1 E F0(and)4.061 E F2(last)3.471 E F0 .882
+(may be speci\214ed as a string \(to locate the last command be)4.062 F
+.882(ginning with)-.15 F .797(that string\) or as a number \(an inde)144
+273.6 R 3.297(xi)-.15 G .797(nto the history list, where a ne)-3.297 F
+-.05(ga)-.15 G(ti).05 E 1.097 -.15(ve n)-.25 H .796(umber is used as an)
+.15 F(of)144 285.6 Q .276(fset from the current command number\).)-.25 F
+(If)5.276 E F2(last)2.866 E F0 .277
+(is not speci\214ed it is set to the current command)3.456 F .093
+(for listing \(so that)144 297.6 R/F4 10/Courier@0 SF .092
+(fc \255l \25510)2.592 F F0 .092(prints the last 10 commands\) and to)
+2.592 F F2<8c72>4.502 E(st)-.1 E F0 2.592(otherwise. If)3.272 F F2<8c72>
+4.502 E(st)-.1 E F0 .092(is not)3.272 F
+(speci\214ed it is set to the pre)144 309.6 Q
+(vious command for editing and \25516 for listing.)-.25 E(The)144 333.6
+Q F1<ad6e>2.522 E F0 .022
+(option suppresses the command numbers when listing.)2.522 F(The)5.022 E
+F1<ad72>2.522 E F0 .022(option re)2.522 F -.15(ve)-.25 G .022
+(rses the order of).15 F .438(the commands.)144 345.6 R .438(If the)
+5.438 F F1<ad6c>2.938 E F0 .438(option is gi)2.938 F -.15(ve)-.25 G .438
+(n, the commands are listed on standard output.).15 F(Otherwise,)5.438 E
+.334(the editor gi)144 357.6 R -.15(ve)-.25 G 2.834(nb).15 G(y)-2.834 E
+F2(ename)3.024 E F0 .335(is in)3.014 F -.2(vo)-.4 G -.1(ke).2 G 2.835
+(do).1 G 2.835(na\214)-2.835 G .335(le containing those commands.)-2.835
+F(If)5.335 E F2(ename)3.025 E F0 .335(is not gi)3.015 F -.15(ve)-.25 G
+(n,).15 E .631(the v)144 369.6 R .631(alue of the)-.25 F F3(FCEDIT)3.131
+E F0 -.25(va)2.881 G .631(riable is used, and the v).25 F .631(alue of)
+-.25 F F3(EDIT)3.131 E(OR)-.162 E F0(if)2.881 E F3(FCEDIT)3.13 E F0 .63
+(is not set.)2.88 F .63(If nei-)5.63 F 1.884(ther v)144 381.6 R 1.884
+(ariable is set, is used.)-.25 F 1.884
+(When editing is complete, the edited commands are echoed and)6.884 F
+-.15(exe)144 393.6 S(cuted.).15 E .04(In the second form,)144 417.6 R F2
+(command)2.54 E F0 .04(is re-e)2.54 F -.15(xe)-.15 G .039
+(cuted after each instance of).15 F F2(pat)2.539 E F0 .039
+(is replaced by)2.539 F F2 -.37(re)2.539 G(p).37 E F0 5.039(.A)C(useful)
+-2.5 E .406(alias to use with this is)144 429.6 R F4 .406(r='fc \255s')
+2.906 F F0 2.906(,s)C 2.906(ot)-2.906 G .406(hat typing)-2.906 F F4
+6.406(rc)2.906 G(c)-6.406 E F0 .406(runs the last command be)2.906 F
+.407(ginning with)-.15 F F4(cc)144 441.6 Q F0(and typing)2.5 E F4(r)2.5
+E F0(re-e)2.5 E -.15(xe)-.15 G(cutes the last command.).15 E .142
+(If the \214rst form is used, the return v)144 465.6 R .142
+(alue is 0 unless an in)-.25 F -.25(va)-.4 G .142
+(lid option is encountered or).25 F F2<8c72>4.552 E(st)-.1 E F0(or)3.322
+E F2(last)2.732 E F0 .454(specify history lines out of range.)144 477.6
+R .454(If the)5.454 F F1<ad65>2.954 E F0 .454
+(option is supplied, the return v)2.954 F .455(alue is the v)-.25 F .455
+(alue of the)-.25 F .788(last command e)144 489.6 R -.15(xe)-.15 G .788
+(cuted or f).15 F .787
+(ailure if an error occurs with the temporary \214le of commands.)-.1 F
+.787(If the)5.787 F 1.135
+(second form is used, the return status is that of the command re-e)144
+501.6 R -.15(xe)-.15 G 1.136(cuted, unless).15 F F2(cmd)3.836 E F0 1.136
+(does not)4.406 F(specify a v)144 513.6 Q
+(alid history line, in which case)-.25 E F1(fc)2.5 E F0(returns f)2.5 E
+(ailure.)-.1 E F1(fg)108 530.4 Q F0([)2.5 E F2(jobspec)A F0(])A(Resume)
+144 542.4 Q F2(jobspec)5.654 E F0 1.413(in the fore)4.224 F 1.413
+(ground, and mak)-.15 F 3.913(ei)-.1 G 3.913(tt)-3.913 G 1.413
+(he current job)-3.913 F 6.413(.I)-.4 G(f)-6.413 E F2(jobspec)5.653 E F0
+1.413(is not present, the)4.223 F(shell')144 554.4 Q 3.116(sn)-.55 G
+.616(otion of the)-3.116 F F2(curr)3.116 E .616(ent job)-.37 F F0 .617
+(is used.)3.116 F .617(The return v)5.617 F .617
+(alue is that of the command placed into the)-.25 F(fore)144 566.4 Q
+.363(ground, or f)-.15 F .363
+(ailure if run when job control is disabled or)-.1 F 2.862(,w)-.4 G .362
+(hen run with job control enabled, if)-2.862 F F2(jobspec)145.74 578.4 Q
+F0 .004(does not specify a v)2.814 F .004(alid job or)-.25 F F2(jobspec)
+4.244 E F0 .004(speci\214es a job that w)2.814 F .004
+(as started without job control.)-.1 F F1(getopts)108 595.2 Q F2
+(optstring name)2.5 E F0([)2.5 E F2(ar)A(gs)-.37 E F0(])A F1(getopts)144
+607.2 Q F0 .793
+(is used by shell procedures to parse positional parameters.)3.294 F F2
+(optstring)6.023 E F0 .793(contains the option)3.513 F .149
+(characters to be recognized; if a character is follo)144 619.2 R .15
+(wed by a colon, the option is e)-.25 F .15(xpected to ha)-.15 F .45
+-.15(ve a)-.2 H(n).15 E(ar)144 631.2 Q .579
+(gument, which should be separated from it by white space.)-.18 F .578
+(The colon and question mark char)5.579 F(-)-.2 E 1.665
+(acters may not be used as option characters.)144 643.2 R 1.665
+(Each time it is in)6.665 F -.2(vo)-.4 G -.1(ke).2 G(d,).1 E F1(getopts)
+4.165 E F0 1.665(places the ne)4.165 F(xt)-.15 E .797
+(option in the shell v)144 655.2 R(ariable)-.25 E F2(name)3.297 E F0
+3.297(,i).18 G(nitializing)-3.297 E F2(name)3.657 E F0 .797
+(if it does not e)3.477 F .796(xist, and the inde)-.15 F 3.296(xo)-.15 G
+3.296(ft)-3.296 G .796(he ne)-3.296 F(xt)-.15 E(ar)144 667.2 Q .085
+(gument to be processed into the v)-.18 F(ariable)-.25 E F3(OPTIND)2.585
+E/F5 9/Times-Roman@0 SF(.)A F3(OPTIND)4.585 E F0 .085
+(is initialized to 1 each time the shell)2.335 F .846
+(or a shell script is in)144 679.2 R -.2(vo)-.4 G -.1(ke).2 G 3.345
+(d. When).1 F .845(an option requires an ar)3.345 F(gument,)-.18 E F1
+(getopts)3.345 E F0 .845(places that ar)3.345 F(gument)-.18 E .803
+(into the v)144 691.2 R(ariable)-.25 E F3(OPT)3.303 E(ARG)-.81 E F5(.)A
+F0 .803(The shell does not reset)5.303 F F3(OPTIND)3.303 E F0 .804
+(automatically; it must be manually)3.054 F .294
+(reset between multiple calls to)144 703.2 R F1(getopts)2.793 E F0 .293
+(within the same shell in)2.793 F -.2(vo)-.4 G .293(cation if a ne).2 F
+2.793(ws)-.25 G .293(et of parameters)-2.793 F(is to be used.)144 715.2
+Q(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)-.15 G(mber 27).15 E
+(7)190.545 E 0 Cg EP
+%%Page: 8 8
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E 2.043
+(When the end of options is encountered,)144 84 R/F1 10/Times-Bold@0 SF
+(getopts)4.543 E F0 -.15(ex)4.543 G 2.043(its with a return v).15 F
+2.044(alue greater than zero.)-.25 F F1(OPTIND)144 96 Q F0
+(is set to the inde)2.5 E 2.5(xo)-.15 G 2.5(ft)-2.5 G
+(he \214rst non-option ar)-2.5 E(gument, and)-.18 E F1(name)2.5 E F0
+(is set to ?.)2.5 E F1(getopts)144 120 Q F0 2.393
+(normally parses the positional parameters, b)4.893 F 2.392
+(ut if more ar)-.2 F 2.392(guments are gi)-.18 F -.15(ve)-.25 G 4.892
+(ni).15 G(n)-4.892 E/F2 10/Times-Italic@0 SF(ar)4.892 E(gs)-.37 E F0(,)
+.27 E F1(getopts)144 132 Q F0(parses those instead.)2.5 E F1(getopts)144
+156 Q F0 1.165(can report errors in tw)3.665 F 3.665(ow)-.1 G 3.665
+(ays. If)-3.765 F 1.165(the \214rst character of)3.665 F F2(optstring)
+3.895 E F0 1.166(is a colon,)3.886 F F2(silent)4.006 E F0(error)4.346 E
+1.264(reporting is used.)144 168 R 1.263
+(In normal operation diagnostic messages are printed when in)6.263 F
+-.25(va)-.4 G 1.263(lid options or).25 F .393(missing option ar)144 180
+R .393(guments are encountered.)-.18 F .394(If the v)5.394 F(ariable)
+-.25 E/F3 9/Times-Bold@0 SF(OPTERR)2.894 E F0 .394
+(is set to 0, no error messages)2.644 F(will be displayed, e)144 192 Q
+-.15(ve)-.25 G 2.5(ni).15 G 2.5(ft)-2.5 G(he \214rst character of)-2.5 E
+F2(optstring)2.73 E F0(is not a colon.)2.72 E .667(If an in)144 216 R
+-.25(va)-.4 G .667(lid option is seen,).25 F F1(getopts)3.167 E F0 .667
+(places ? into)3.167 F F2(name)3.527 E F0 .666
+(and, if not silent, prints an error message)3.347 F .399(and unsets)144
+228 R F3(OPT)2.899 E(ARG)-.81 E/F4 9/Times-Roman@0 SF(.)A F0(If)4.899 E
+F1(getopts)2.899 E F0 .399
+(is silent, the option character found is placed in)2.899 F F3(OPT)2.899
+E(ARG)-.81 E F0 .4(and no)2.65 F(diagnostic message is printed.)144 240
+Q 1.242(If a required ar)144 264 R 1.242(gument is not found, and)-.18 F
+F1(getopts)3.741 E F0 1.241(is not silent, a question mark \()3.741 F F1
+(?).833 E F0 3.741(\)i).833 G 3.741(sp)-3.741 G 1.241(laced in)-3.741 F
+F2(name)144 276 Q F0(,).18 E F3(OPT)2.734 E(ARG)-.81 E F0 .234
+(is unset, and a diagnostic message is printed.)2.484 F(If)5.234 E F1
+(getopts)2.734 E F0 .235(is silent, then a colon \()2.734 F F1(:).833 E
+F0(\)).833 E(is placed in)144 288 Q F2(name)2.86 E F0(and)2.68 E F3(OPT)
+2.5 E(ARG)-.81 E F0(is set to the option character found.)2.25 E F1
+(getopts)144 312 Q F0 .902
+(returns true if an option, speci\214ed or unspeci\214ed, is found.)
+3.402 F .902(It returns f)5.902 F .901(alse if the end of)-.1 F
+(options is encountered or an error occurs.)144 324 Q F1(hash)108 340.8
+Q F0([)2.5 E F1(\255lr)A F0 2.5(][)C F1<ad70>-2.5 E F2(\214lename)2.5 E
+F0 2.5(][)C F1(\255dt)-2.5 E F0 2.5(][)C F2(name)-2.5 E F0(])A -.15(Fo)
+144 352.8 S 3.554(re).15 G(ach)-3.554 E F2(name)3.554 E F0 3.554(,t).18
+G 1.054(he full \214le name of the command is determined by searching t\
+he directories in)-3.554 F F1($P)144 364.8 Q -.95(AT)-.74 G(H).95 E F0
+.35(and remembered.)2.85 F .35(If the)5.35 F F1<ad70>2.85 E F0 .349
+(option is supplied, no path search is performed, and)2.849 F F2
+(\214lename)4.759 E F0 .452
+(is used as the full \214le name of the command.)144 376.8 R(The)5.452 E
+F1<ad72>2.952 E F0 .452(option causes the shell to for)2.952 F .453
+(get all remem-)-.18 F .593(bered locations.)144 388.8 R(The)5.593 E F1
+<ad64>3.093 E F0 .593(option causes the shell to for)3.093 F .592
+(get the remembered location of each)-.18 F F2(name)3.092 E F0(.)A .02
+(If the)144 400.8 R F1<ad74>2.52 E F0 .02
+(option is supplied, the full pathname to which each)2.52 F F2(name)
+2.521 E F0 .021(corresponds is printed.)2.521 F .021(If multi-)5.021 F
+(ple)144 412.8 Q F2(name)3.704 E F0(ar)3.704 E 1.204
+(guments are supplied with)-.18 F F1<ad74>3.703 E F0 3.703(,t)C(he)
+-3.703 E F2(name)3.703 E F0 1.203
+(is printed before the hashed full pathname.)3.703 F(The)144 424.8 Q F1
+<ad6c>3.215 E F0 .715(option causes output to be displayed in a format \
+that may be reused as input.)3.215 F .716(If no ar)5.716 F(gu-)-.18 E
+1.184(ments are gi)144 436.8 R -.15(ve)-.25 G 1.184(n, or if only).15 F
+F1<ad6c>3.684 E F0 1.183
+(is supplied, information about remembered commands is printed.)3.684 F
+(The return status is true unless a)144 448.8 Q F2(name)2.86 E F0
+(is not found or an in)2.68 E -.25(va)-.4 G(lid option is supplied.).25
+E F1(help)108 465.6 Q F0([)2.5 E F1<ad73>A F0 2.5(][)C F2(pattern)-2.5 E
+F0(])A .866(Display helpful information about b)144 477.6 R .867
+(uiltin commands.)-.2 F(If)5.867 E F2(pattern)4.617 E F0 .867
+(is speci\214ed,)3.607 F F1(help)3.367 E F0(gi)3.367 E -.15(ve)-.25 G
+3.367(sd).15 G(etailed)-3.367 E .307(help on all commands matching)144
+489.6 R F2(pattern)2.807 E F0 2.807(;o).24 G .307
+(therwise help for all the b)-2.807 F .306
+(uiltins and shell control struc-)-.2 F .596(tures is printed.)144 501.6
+R(The)5.596 E F1<ad73>3.096 E F0 .596
+(option restricts the information displayed to a short usage synopsis.)
+3.096 F(The)5.596 E(return status is 0 unless no command matches)144
+513.6 Q F2(pattern)2.5 E F0(.).24 E F1(history [)108 530.4 Q F2(n)A F1
+(])A(history \255c)108 542.4 Q(history \255d)108 554.4 Q F2(of)2.5 E
+(fset)-.18 E F1(history \255anrw)108 566.4 Q F0([)2.5 E F2(\214lename)A
+F0(])A F1(history \255p)108 578.4 Q F2(ar)2.5 E(g)-.37 E F0([)2.5 E F2
+(ar)A 2.5(g.)-.37 G(..)-2.5 E F0(])A F1(history \255s)108 590.4 Q F2(ar)
+2.5 E(g)-.37 E F0([)2.5 E F2(ar)A 2.5(g.)-.37 G(..)-2.5 E F0(])A -.4(Wi)
+144 602.4 S .752
+(th no options, display the command history list with line numbers.).4 F
+.752(Lines listed with a)5.752 F F1(*)3.251 E F0(ha)3.251 E -.15(ve)-.2
+G 1.23(been modi\214ed.)144 614.4 R 1.23(An ar)6.23 F 1.23(gument of)
+-.18 F F2(n)4.09 E F0 1.231(lists only the last)3.97 F F2(n)4.091 E F0
+3.731(lines. If)3.971 F 1.231(the shell v)3.731 F(ariable)-.25 E F1
+(HISTTIME-)3.731 E(FORMA)144 626.4 Q(T)-.95 E F0 .25
+(is set and not null, it is used as a format string for)2.75 F F2
+(strftime)2.749 E F0 .249(\(3\) to display the time stamp)B .378
+(associated with each displayed history entry)144 638.4 R 5.378(.N)-.65
+G 2.878(oi)-5.378 G(nterv)-2.878 E .379
+(ening blank is printed between the format-)-.15 F .815
+(ted time stamp and the history line.)144 650.4 R(If)5.814 E F2
+(\214lename)3.314 E F0 .814
+(is supplied, it is used as the name of the history)3.314 F
+(\214le; if not, the v)144 662.4 Q(alue of)-.25 E F3(HISTFILE)2.5 E F0
+(is used.)2.25 E(Options, if supplied, ha)5 E .3 -.15(ve t)-.2 H
+(he follo).15 E(wing meanings:)-.25 E F1<ad63>144 674.4 Q F0
+(Clear the history list by deleting all the entries.)25.86 E F1<ad64>144
+686.4 Q F2(of)2.5 E(fset)-.18 E F0(Delete the history entry at position)
+180 698.4 Q F2(of)2.5 E(fset)-.18 E F0(.)A F1<ad61>144 710.4 Q F0 .598
+(Append the `)25.3 F(`ne)-.74 E(w')-.25 E 3.098('h)-.74 G .598
+(istory lines \(history lines entered since the be)-3.098 F .599
+(ginning of the current)-.15 F F1(bash)180 722.4 Q F0
+(session\) to the history \214le.)2.5 E(GNU Bash-2.05a)72 768 Q(2001 No)
+126.115 E -.15(ve)-.15 G(mber 27).15 E(8)190.545 E 0 Cg EP
+%%Page: 9 9
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Times-Bold@0 SF<ad6e>144 84 Q F0 .854(Read the history lines not alrea\
+dy read from the history \214le into the current history list.)24.74 F
+.772(These are lines appended to the history \214le since the be)180 96
+R .773(ginning of the current)-.15 F F1(bash)3.273 E F0(ses-)3.273 E
+(sion.)180 108 Q F1<ad72>144 120 Q F0(Read the contents of the history \
+\214le and use them as the current history)25.86 E(.)-.65 E F1<ad77>144
+132 Q F0(Write the current history to the history \214le, o)23.08 E -.15
+(ve)-.15 G(rwriting the history \214le').15 E 2.5(sc)-.55 G(ontents.)
+-2.5 E F1<ad70>144 144 Q F0 .626
+(Perform history substitution on the follo)24.74 F(wing)-.25 E/F2 10
+/Times-Italic@0 SF(ar)3.125 E(gs)-.37 E F0 .625
+(and display the result on the standard)3.125 F 2.975(output. Does)180
+156 R .475(not store the results in the history list.)2.975 F(Each)5.475
+E F2(ar)2.975 E(g)-.37 E F0 .475(must be quoted to disable)2.975 F
+(normal history e)180 168 Q(xpansion.)-.15 E F1<ad73>144 180 Q F0 .363
+(Store the)26.41 F F2(ar)3.193 E(gs)-.37 E F0 .363
+(in the history list as a single entry)3.133 F 5.363(.T)-.65 G .362
+(he last command in the history list is)-5.363 F(remo)180 192 Q -.15(ve)
+-.15 G 2.5(db).15 G(efore the)-2.5 E F2(ar)2.83 E(gs)-.37 E F0
+(are added.)2.77 E .28(If the)144 208.8 R F1(HISTTIMEFORMA)2.78 E(T)-.95
+E F0 .28
+(is set, the time stamp information associated with each history entry)
+2.78 F .216(is written to the history \214le.)144 220.8 R .216
+(The return v)5.216 F .216(alue is 0 unless an in)-.25 F -.25(va)-.4 G
+.216(lid option is encountered, an error).25 F .422
+(occurs while reading or writing the history \214le, an in)144 232.8 R
+-.25(va)-.4 G(lid).25 E F2(of)2.922 E(fset)-.18 E F0 .422
+(is supplied as an ar)2.922 F .422(gument to)-.18 F F1<ad64>2.922 E F0
+(,)A(or the history e)144 244.8 Q(xpansion supplied as an ar)-.15 E
+(gument to)-.18 E F1<ad70>2.5 E F0 -.1(fa)2.5 G(ils.).1 E F1(jobs)108
+261.6 Q F0([)2.5 E F1(\255lnprs)A F0 2.5(][)C F2(jobspec)A F0(... ])2.5
+E F1(jobs \255x)108 273.6 Q F2(command)2.5 E F0([)2.5 E F2(ar)2.5 E(gs)
+-.37 E F0(... ])2.5 E(The \214rst form lists the acti)144 285.6 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 F1<ad6c>144 297.6 Q F0
+(List process IDs in addition to the normal information.)27.52 E F1
+<ad70>144 309.6 Q F0(List only the process ID of the job')24.74 E 2.5
+(sp)-.55 G(rocess group leader)-2.5 E(.)-.55 E F1<ad6e>144 321.6 Q F0
+.194(Display information only about jobs that ha)24.74 F .494 -.15(ve c)
+-.2 H .193(hanged status since the user w).15 F .193(as last noti-)-.1 F
+(\214ed of their status.)180 333.6 Q F1<ad72>144 345.6 Q F0
+(Restrict output to running jobs.)25.86 E F1<ad73>144 357.6 Q F0
+(Restrict output to stopped jobs.)26.41 E(If)144 374.4 Q F2(jobspec)
+4.553 E F0 .313(is gi)3.123 F -.15(ve)-.25 G .313
+(n, output is restricted to information about that job).15 F 5.314(.T)
+-.4 G .314(he return status is 0 unless)-5.314 F(an in)144 386.4 Q -.25
+(va)-.4 G(lid option is encountered or an in).25 E -.25(va)-.4 G(lid).25
+E F2(jobspec)4.24 E F0(is supplied.)2.81 E .395(If the)144 403.2 R F1
+<ad78>2.895 E F0 .394(option is supplied,)2.894 F F1(jobs)2.894 E F0
+.394(replaces an)2.894 F(y)-.15 E F2(jobspec)4.634 E F0 .394(found in)
+3.204 F F2(command)3.094 E F0(or)3.664 E F2(ar)3.224 E(gs)-.37 E F0 .394
+(with the corre-)3.164 F(sponding process group ID, and e)144 415.2 Q
+-.15(xe)-.15 G(cutes).15 E F2(command)2.7 E F0(passing it)3.27 E F2(ar)
+2.5 E(gs)-.37 E F0 2.5(,r).27 G(eturning its e)-2.5 E(xit status.)-.15 E
+F1(kill)108 432 Q F0([)2.5 E F1<ad73>A F2(sigspec)2.5 E F0(|)2.5 E F1
+<ad6e>2.5 E F2(signum)2.5 E F0(|)2.5 E F1<ad>2.5 E F2(sigspec)A F0 2.5
+(][)C F2(pid)-2.5 E F0(|)2.5 E F2(jobspec)2.5 E F0 2.5(].)C(..)-2.5 E F1
+(kill \255l)108 444 Q F0([)2.5 E F2(sigspec)A F0(|)2.5 E F2 -.2(ex)2.5 G
+(it_status).2 E F0(])A .119(Send the signal named by)144 456 R F2
+(sigspec)2.959 E F0(or)2.929 E F2(signum)2.959 E F0 .119
+(to the processes named by)2.939 F F2(pid)3.87 E F0(or)3.39 E F2
+(jobspec)2.62 E F0(.).31 E F2(sigspec)5.46 E F0(is)2.93 E .048
+(either a signal name such as)144 468 R/F3 9/Times-Bold@0 SF(SIGKILL)
+2.548 E F0 .047(or a signal number;)2.298 F F2(signum)2.887 E F0 .047
+(is a signal number)2.867 F 5.047(.I)-.55 G(f)-5.047 E F2(sigspec)2.887
+E F0(is)2.857 E 3.394(as)144 480 S .894(ignal name, the name may be gi)
+-3.394 F -.15(ve)-.25 G 3.394(nw).15 G .894(ith or without the)-3.394 F
+F3(SIG)3.394 E F0 3.394(pre\214x. If)3.144 F F2(sigspec)3.734 E F0 .894
+(is not present,)3.704 F(then)144 492 Q F3(SIGTERM)3.073 E F0 .572
+(is assumed.)2.822 F .572(An ar)5.572 F .572(gument of)-.18 F F1<ad6c>
+3.072 E F0 .572(lists the signal names.)3.072 F .572(If an)5.572 F 3.072
+(ya)-.15 G -.18(rg)-3.072 G .572(uments are sup-).18 F .267(plied when)
+144 504 R F1<ad6c>2.767 E F0 .267(is gi)2.767 F -.15(ve)-.25 G .267
+(n, the names of the signals corresponding to the ar).15 F .267
+(guments are listed, and the)-.18 F .288(return status is 0.)144 516 R
+(The)5.288 E F2 -.2(ex)2.788 G(it_status).2 E F0(ar)2.788 E .288
+(gument to)-.18 F F1<ad6c>2.788 E F0 .287
+(is a number specifying either a signal number or)2.788 F .551(the e)144
+528 R .551(xit status of a process terminated by a signal.)-.15 F F1
+(kill)5.551 E F0 .551(returns true if at least one signal w)3.051 F .552
+(as suc-)-.1 F(cessfully sent, or f)144 540 Q
+(alse if an error occurs or an in)-.1 E -.25(va)-.4 G
+(lid option is encountered.).25 E F1(let)108 556.8 Q F2(ar)2.5 E(g)-.37
+E F0([)2.5 E F2(ar)A(g)-.37 E F0(...])2.5 E(Each)144 568.8 Q F2(ar)3.965
+E(g)-.37 E F0 1.135(is an arithmetic e)3.855 F 1.134(xpression to be e)
+-.15 F -.25(va)-.25 G 1.134(luated \(see).25 F F3 1.134(ARITHMETIC EV)
+3.634 F(ALU)-1.215 E -.855(AT)-.54 G(ION).855 E/F4 9/Times-Roman@0 SF
+(\).)A F0 1.134(If the)5.634 F(last)144 580.8 Q F2(ar)2.83 E(g)-.37 E F0
+-.25(eva)2.72 G(luates to 0,).25 E F1(let)2.5 E F0
+(returns 1; 0 is returned otherwise.)2.5 E F1(local)108 597.6 Q F0([)2.5
+E F2(option)A F0 2.5(][)C F2(name)-2.5 E F0([=)A F2(value)A F0 2.5(].)C
+(..])-2.5 E -.15(Fo)144 609.6 S 2.56(re).15 G .06(ach ar)-2.56 F .06
+(gument, a local v)-.18 F .06(ariable named)-.25 F F2(name)2.92 E F0 .06
+(is created, and assigned)2.74 F F2(value)2.56 E F0 5.06(.T).18 G(he)
+-5.06 E F2(option)2.56 E F0 .06(can be)2.56 F(an)144 621.6 Q 3.153(yo)
+-.15 G 3.153(ft)-3.153 G .653(he options accepted by)-3.153 F F1(declar)
+3.153 E(e)-.18 E F0 5.652(.W)C(hen)-5.652 E F1(local)3.152 E F0 .652
+(is used within a function, it causes the v)3.152 F(ari-)-.25 E(able)144
+633.6 Q F2(name)3.72 E F0 .86(to ha)3.54 F 1.16 -.15(ve a v)-.2 H .861
+(isible scope restricted to that function and its children.).15 F -.4
+(Wi)5.861 G .861(th no operands,).4 F F1(local)144 645.6 Q F0 1.165
+(writes a list of local v)3.665 F 1.165
+(ariables to the standard output.)-.25 F 1.165(It is an error to use)
+6.165 F F1(local)3.664 E F0 1.164(when not)3.664 F .232
+(within a function.)144 657.6 R .233(The return status is 0 unless)5.232
+F F1(local)2.733 E F0 .233(is used outside a function, an in)2.733 F
+-.25(va)-.4 G(lid).25 E F2(name)3.093 E F0(is)2.913 E(supplied, or)144
+669.6 Q F2(name)2.5 E F0(is a readonly v)2.5 E(ariable.)-.25 E F1
+(logout)108 686.4 Q F0(Exit a login shell.)9.33 E F1(popd)108 703.2 Q F0
+<5bad>2.5 E F1(n)A F0 2.5(][)C(+)-2.5 E F2(n)A F0 2.5(][)C<ad>-2.5 E F2
+(n)A F0(])A(Remo)144 715.2 Q -.15(ve)-.15 G 2.8(se).15 G .3
+(ntries from the directory stack.)-2.8 F -.4(Wi)5.299 G .299(th no ar).4
+F .299(guments, remo)-.18 F -.15(ve)-.15 G 2.799(st).15 G .299
+(he top directory from the)-2.799 F 1.478(stack, and performs a)144
+727.2 R F1(cd)3.978 E F0 1.479(to the ne)3.978 F 3.979(wt)-.25 G 1.479
+(op directory)-3.979 F 6.479(.A)-.65 G -.18(rg)-6.479 G 1.479
+(uments, if supplied, ha).18 F 1.779 -.15(ve t)-.2 H 1.479(he follo).15
+F(wing)-.25 E(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)-.15 G
+(mber 27).15 E(9)190.545 E 0 Cg EP
+%%Page: 10 10
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E(meanings:)
+144 84 Q/F1 10/Times-Bold@0 SF(+)144 96 Q/F2 10/Times-Italic@0 SF(n)A F0
+(Remo)25.3 E -.15(ve)-.15 G 2.64(st).15 G(he)-2.64 E F2(n)2.64 E F0 .14
+(th entry counting from the left of the list sho)B .14(wn by)-.25 F F1
+(dirs)2.64 E F0 2.64(,s)C .14(tarting with zero.)-2.64 F -.15(Fo)180 108
+S 2.5(re).15 G(xample:)-2.65 E/F3 10/Courier@0 SF(popd +0)2.5 E F0(remo)
+2.5 E -.15(ve)-.15 G 2.5(st).15 G(he \214rst directory)-2.5 E(,)-.65 E
+F3(popd +1)2.5 E F0(the second.)2.5 E F1<ad>144 120 Q F2(n)A F0(Remo)
+25.3 E -.15(ve)-.15 G 3.759(st).15 G(he)-3.759 E F2(n)3.759 E F0 1.259
+(th entry counting from the right of the list sho)B 1.26(wn by)-.25 F F1
+(dirs)3.76 E F0 3.76(,s)C 1.26(tarting with)-3.76 F 2.5(zero. F)180 132
+R(or e)-.15 E(xample:)-.15 E F3(popd -0)2.5 E F0(remo)2.5 E -.15(ve)-.15
+G 2.5(st).15 G(he last directory)-2.5 E(,)-.65 E F3(popd -1)2.5 E F0
+(the ne)2.5 E(xt to last.)-.15 E F1<ad6e>144 144 Q F0 .551
+(Suppresses the normal change of directory when remo)24.74 F .551
+(ving directories from the stack, so)-.15 F
+(that only the stack is manipulated.)180 156 Q .643(If the)144 172.8 R
+F1(popd)3.143 E F0 .643(command is successful, a)3.143 F F1(dirs)3.143 E
+F0 .644(is performed as well, and the return status is 0.)3.143 F F1
+(popd)5.644 E F0 .416(returns f)144 184.8 R .416(alse if an in)-.1 F
+-.25(va)-.4 G .415
+(lid option is encountered, the directory stack is empty).25 F 2.915
+(,an)-.65 G(on-e)-2.915 E .415(xistent direc-)-.15 F
+(tory stack entry is speci\214ed, or the directory change f)144 196.8 Q
+(ails.)-.1 E F1(printf)108 213.6 Q F2(format)2.5 E F0([)2.5 E F2(ar)A
+(guments)-.37 E F0(])A .372(Write the formatted)144 225.6 R F2(ar)2.872
+E(guments)-.37 E F0 .372
+(to the standard output under the control of the)2.872 F F2(format)2.872
+E F0 5.372(.T)C(he)-5.372 E F2(format)2.872 E F0 1.804(is a character s\
+tring which contains three types of objects: plain characters, which ar\
+e simply)144 237.6 R .158
+(copied to standard output, character escape sequences, which are con)
+144 249.6 R -.15(ve)-.4 G .159(rted and copied to the stan-).15 F .499(\
+dard output, and format speci\214cations, each of which causes printing\
+ of the ne)144 261.6 R .499(xt successi)-.15 F -.15(ve)-.25 G F2(ar)
+3.149 E(gu-)-.37 E(ment)144 273.6 Q F0 5.423(.I)C 2.923(na)-5.423 G .423
+(ddition to the standard)-2.923 F F2(printf)2.923 E F0 .424
+(\(1\) formats,)B F1(%b)2.924 E F0(causes)2.924 E F1(printf)2.924 E F0
+.424(to e)2.924 F .424(xpand backslash escape)-.15 F .934
+(sequences in the corresponding)144 285.6 R F2(ar)3.434 E(gument)-.37 E
+F0(\(e)3.434 E .934(xcept that)-.15 F F1(\\c)3.434 E F0 .934
+(terminates output, backslashes in)3.434 F F1(\\')3.433 E F0(,)A F1(\\")
+3.433 E F0(,)A(and)144 297.6 Q F1(\\?)3.421 E F0 .921(are not remo)3.421
+F -.15(ve)-.15 G .922(d, and octal escapes be).15 F .922(ginning with)
+-.15 F F1(\\0)3.422 E F0 .922(may contain up to four digits\), and)3.422
+F F1(%q)144 309.6 Q F0(causes)3.631 E F1(printf)3.631 E F0 1.131
+(to output the corresponding)3.631 F F2(ar)3.631 E(gument)-.37 E F0 1.13
+(in a format that can be reused as shell)3.631 F(input.)144 321.6 Q(The)
+144 345.6 Q F2(format)3.423 E F0 .923
+(is reused as necessary to consume all of the)3.423 F F2(ar)3.423 E
+(guments)-.37 E F0 5.923(.I)C 3.423(ft)-5.923 G(he)-3.423 E F2(format)
+3.423 E F0 .924(requires more)3.424 F F2(ar)144 357.6 Q(guments)-.37 E
+F0 .033(than are supplied, the e)2.534 F .033
+(xtra format speci\214cations beha)-.15 F .333 -.15(ve a)-.2 H 2.533(si)
+.15 G 2.533(faz)-2.533 G .033(ero v)-2.533 F .033(alue or null string,)
+-.25 F(as appropriate, had been supplied.)144 369.6 Q(The return v)5 E
+(alue is zero on success, non-zero on f)-.25 E(ailure.)-.1 E F1(pushd)
+108 386.4 Q F0([)2.5 E F1<ad6e>A F0 2.5(][)C F2(dir)-2.5 E F0(])A F1
+(pushd)108 398.4 Q F0([)2.5 E F1<ad6e>A F0 2.5(][)C(+)-2.5 E F2(n)A F0
+2.5(][)C<ad>-2.5 E F2(n)A F0(])A .639(Adds a directory to the top of th\
+e directory stack, or rotates the stack, making the ne)144 410.4 R 3.14
+(wt)-.25 G .64(op of the)-3.14 F 1.316(stack the current w)144 422.4 R
+1.316(orking directory)-.1 F 6.316(.W)-.65 G 1.315(ith no ar)-6.716 F
+1.315(guments, e)-.18 F 1.315(xchanges the top tw)-.15 F 3.815(od)-.1 G
+1.315(irectories and)-3.815 F .871
+(returns 0, unless the directory stack is empty)144 434.4 R 5.871(.A)
+-.65 G -.18(rg)-5.871 G .872(uments, if supplied, ha).18 F 1.172 -.15
+(ve t)-.2 H .872(he follo).15 F .872(wing mean-)-.25 F(ings:)144 446.4 Q
+F1(+)144 458.4 Q F2(n)A F0 1.268(Rotates the stack so that the)25.3 F F2
+(n)3.768 E F0 1.267
+(th directory \(counting from the left of the list sho)B 1.267(wn by)
+-.25 F F1(dirs)180 470.4 Q F0 2.5(,s)C
+(tarting with zero\) is at the top.)-2.5 E F1<ad>144 482.4 Q F2(n)A F0
+.92(Rotates the stack so that the)25.3 F F2(n)3.42 E F0 .92
+(th directory \(counting from the right of the list sho)B .92(wn by)-.25
+F F1(dirs)180 494.4 Q F0 2.5(,s)C(tarting with zero\) is at the top.)
+-2.5 E F1<ad6e>144 506.4 Q F0 .902(Suppresses the normal change of dire\
+ctory when adding directories to the stack, so that)24.74 F
+(only the stack is manipulated.)180 518.4 Q F2(dir)144.35 530.4 Q F0
+(Adds)23.98 E F2(dir)2.85 E F0
+(to the directory stack at the top, making it the ne)3.23 E 2.5(wc)-.25
+G(urrent w)-2.5 E(orking directory)-.1 E(.)-.65 E .488(If the)144 547.2
+R F1(pushd)2.988 E F0 .488(command is successful, a)2.988 F F1(dirs)
+2.988 E F0 .488(is performed as well.)2.988 F .489
+(If the \214rst form is used,)5.488 F F1(pushd)2.989 E F0 1.04
+(returns 0 unless the cd to)144 559.2 R F2(dir)3.89 E F0 -.1(fa)4.27 G
+3.539(ils. W).1 F 1.039(ith the second form,)-.4 F F1(pushd)3.539 E F0
+1.039(returns 0 unless the directory)3.539 F .846(stack is empty)144
+571.2 R 3.346(,an)-.65 G(on-e)-3.346 E .847(xistent directory stack ele\
+ment is speci\214ed, or the directory change to the)-.15 F
+(speci\214ed ne)144 583.2 Q 2.5(wc)-.25 G(urrent directory f)-2.5 E
+(ails.)-.1 E F1(pwd)108 600 Q F0([)2.5 E F1(\255LP)A F0(])A .845
+(Print the absolute pathname of the current w)144 612 R .845
+(orking directory)-.1 F 5.844(.T)-.65 G .844
+(he pathname printed contains no)-5.844 F .181(symbolic links if the)144
+624 R F1<ad50>2.681 E F0 .181(option is supplied or the)2.681 F F1 .181
+(\255o ph)2.681 F(ysical)-.15 E F0 .181(option to the)2.681 F F1(set)
+2.681 E F0 -.2(bu)2.681 G .182(iltin command is).2 F 3.264(enabled. If)
+144 636 R(the)3.264 E F1<ad4c>3.264 E F0 .763
+(option is used, the pathname printed may contain symbolic links.)3.264
+F .763(The return)5.763 F 1.36(status is 0 unless an error occurs while\
+ reading the name of the current directory or an in)144 648 R -.25(va)
+-.4 G(lid).25 E(option is supplied.)144 660 Q F1 -.18(re)108 676.8 S(ad)
+.18 E F0([)2.5 E F1(\255ers)A F0 2.5(][)C F1<ad75>-2.5 E F2(fd)2.5 E F0
+2.5(][)C F1<ad74>-2.5 E F2(timeout)2.5 E F0 2.5(][)C F1<ad61>-2.5 E F2
+(aname)2.5 E F0 2.5(][)C F1<ad70>-2.5 E F2(pr)2.5 E(ompt)-.45 E F0 2.5
+(][)C F1<ad6e>-2.5 E F2(nc)2.5 E(har)-.15 E(s)-.1 E F0 2.5(][)C F1<ad64>
+-2.5 E F2(delim)2.5 E F0 2.5(][)C F2(name)-2.5 E F0(...])2.5 E .516(One\
+ line is read from the standard input, or from the \214le descriptor)144
+688.8 R F2(fd)3.016 E F0 .516(supplied as an ar)3.016 F .516(gument to)
+-.18 F(the)144 700.8 Q F1<ad75>2.538 E F0 .038
+(option, and the \214rst w)2.538 F .038(ord is assigned to the \214rst)
+-.1 F F2(name)2.539 E F0 2.539(,t).18 G .039(he second w)-2.539 F .039
+(ord to the second)-.1 F F2(name)2.539 E F0(,).18 E .42
+(and so on, with lefto)144 712.8 R -.15(ve)-.15 G 2.92(rw).15 G .42
+(ords and their interv)-3.02 F .42
+(ening separators assigned to the last)-.15 F F2(name)2.92 E F0 5.42(.I)
+.18 G 2.92(ft)-5.42 G(here)-2.92 E .54(are fe)144 724.8 R .54(wer w)-.25
+F .541(ords read from the input stream than names, the remaining names \
+are assigned empty)-.1 F(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15
+(ve)-.15 G(mber 27).15 E(10)185.545 E 0 Cg EP
+%%Page: 11 11
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E -.25(va)144
+84 S 2.511(lues. The).25 F .011(characters in)2.511 F/F1 9/Times-Bold@0
+SF(IFS)2.511 E F0 .011(are used to split the line into w)2.261 F 2.511
+(ords. The)-.1 F .011(backslash character \()2.511 F/F2 10/Times-Bold@0
+SF(\\)A F0 2.51(\)m)C(ay)-2.51 E 1.89(be used to remo)144 96 R 2.19 -.15
+(ve a)-.15 H 2.19 -.15(ny s).15 H 1.891(pecial meaning for the ne).15 F
+1.891(xt character read and for line continuation.)-.15 F
+(Options, if supplied, ha)144 108 Q .3 -.15(ve t)-.2 H(he follo).15 E
+(wing meanings:)-.25 E F2<ad61>144 120 Q/F3 10/Times-Italic@0 SF(aname)
+2.5 E F0 1.05(The w)180 132 R 1.049
+(ords are assigned to sequential indices of the array v)-.1 F(ariable)
+-.25 E F3(aname)3.549 E F0 3.549(,s).18 G 1.049(tarting at 0.)-3.549 F
+F3(aname)180.33 144 Q F0(is unset before an)2.68 E 2.5(yn)-.15 G .5 -.25
+(ew va)-2.5 H(lues are assigned.).25 E(Other)5 E F3(name)2.5 E F0(ar)2.5
+E(guments are ignored.)-.18 E F2<ad64>144 156 Q F3(delim)2.5 E F0
+(The \214rst character of)180 168 Q F3(delim)2.5 E F0
+(is used to terminate the input line, rather than ne)2.5 E(wline.)-.25 E
+F2<ad65>144 180 Q F0 .372
+(If the standard input is coming from a terminal,)25.86 F F2 -.18(re)
+2.873 G(adline).18 E F0(\(see)2.873 E F1(READLINE)2.873 E F0(abo)2.623 E
+-.15(ve)-.15 G 2.873(\)i).15 G 2.873(su)-2.873 G(sed)-2.873 E
+(to obtain the line.)180 192 Q F2<ad6e>144 204 Q F3(nc)2.5 E(har)-.15 E
+(s)-.1 E F2 -.18(re)180 216 S(ad).18 E F0 1.395(returns after reading)
+3.895 F F3(nc)3.895 E(har)-.15 E(s)-.1 E F0 1.395
+(characters rather than w)3.895 F 1.394(aiting for a complete line of)
+-.1 F(input.)180 228 Q F2<ad70>144 240 Q F3(pr)2.5 E(ompt)-.45 E F0
+(Display)180 252 Q F3(pr)3.66 E(ompt)-.45 E F0 1.161(on standard error)
+3.66 F 3.661(,w)-.4 G 1.161(ithout a trailing ne)-3.661 F 1.161
+(wline, before attempting to read)-.25 F(an)180 264 Q 2.5(yi)-.15 G 2.5
+(nput. The)-2.5 F
+(prompt is displayed only if input is coming from a terminal.)2.5 E F2
+<ad72>144 276 Q F0 .544(Backslash does not act as an escape character)
+25.86 F 5.543(.T)-.55 G .543(he backslash is considered to be part of)
+-5.543 F(the line.)180 288 Q(In particular)5 E 2.5(,ab)-.4 G
+(ackslash-ne)-2.5 E(wline pair may not be used as a line continuation.)
+-.25 E F2<ad73>144 300 Q F0(Silent mode.)26.41 E
+(If input is coming from a terminal, characters are not echoed.)5 E F2
+<ad74>144 312 Q F3(timeout)2.5 E F0(Cause)180 324 Q F2 -.18(re)3.548 G
+(ad).18 E F0 1.048(to time out and return f)3.548 F 1.048
+(ailure if a complete line of input is not read within)-.1 F F3(timeout)
+180 336 Q F0 2.92(seconds. This)2.92 F .42(option has no ef)2.92 F .42
+(fect if)-.25 F F2 -.18(re)2.92 G(ad).18 E F0 .42
+(is not reading input from the terminal)2.92 F(or a pipe.)180 348 Q F2
+<ad75>144 360 Q F3(fd)2.5 E/F4 10/Palatino-Roman@0 SF(Read input fr)
+14.46 E(om \214le descriptor)-.18 E/F5 10/Palatino-Italic@0 SF(fd)2.5 E
+F4(.)A .335(If no)144 376.8 R F5(names)3.095 E F4(ar)2.895 E 2.835(es)
+-.18 G .335(upplied, the line r)-2.835 F .336
+(ead is assigned to the variable)-.18 F/F6 9/Palatino-Bold@0 SF(REPL)
+2.836 E(Y)-.828 E/F7 9/Palatino-Roman@0 SF(.)A F4 .336(The r)4.836 F
+.336(eturn code)-.18 F 1.058(is zer)144 388.8 R 1.058
+(o, unless end-of-\214le is encounter)-.18 F(ed,)-.18 E/F8 10
+/Palatino-Bold@0 SF(read)3.558 E F4 1.058
+(times out, or an invalid \214le descriptor is)3.558 F
+(supplied as the ar)144 400.8 Q(gument to)-.18 E F8<ad75>2.5 E F4(.)A F8
+(readonly)108 417.6 Q F4([)2.5 E F8(\255apf)A F4 2.5(][)C F5(name)-2.5 E
+F4([=)A F5(word)A F4 2.5(].)C(..])-2.5 E .587(The given)144 429.6 R F5
+(names)3.087 E F4(ar)3.087 E 3.087(em)-.18 G .587(arked r)-3.087 F .587
+(eadonly; the values of these)-.18 F F5(names)3.347 E F4 .588
+(may not be changed by)3.148 F .833(subsequent assignment.)144 441.6 R
+.833(If the)5.833 F F8<ad66>3.333 E F4 .832
+(option is supplied, the functions corr)3.333 F .832(esponding to the)
+-.18 F F5(names)144 453.6 Q F4(ar)3.809 E 3.809(es)-.18 G 3.809(om)
+-3.809 G 3.809(arked. The)-3.809 F F8<ad61>3.809 E F4 1.309(option r)
+3.809 F 1.309(estricts the variables to arrays.)-.18 F 1.31(If no)6.31 F
+F5(name)4.07 E F4(ar)4.16 E(gu-)-.18 E 1.058(ments ar)144 465.6 R 3.557
+(eg)-.18 G 1.057(iven, or if the)-3.557 F F8<ad70>3.557 E F4 1.057
+(option is supplied, a list of all r)3.557 F 1.057
+(eadonly names is printed.)-.18 F(The)144 477.6 Q F8<ad70>2.577 E F4
+.077(option causes output to be displayed in a format that may be r)
+2.577 F .078(eused as input.)-.18 F .078(If a)5.078 F .903
+(variable name is followed by =)144 489.6 R F5(word)A F4 3.403(,t)C .902
+(he value of the variable is set to)-3.403 F F5(word)3.402 E F4 5.902
+(.T)C .902(he r)-5.902 F(eturn)-.18 E .997
+(status is 0 unless an invalid option is encounter)144 501.6 R .998
+(ed, one of the)-.18 F F5(names)3.758 E F4 .998(is not a valid shell)
+3.558 F(variable name, or)144 513.6 Q F8<ad66>2.5 E F4
+(is supplied with a)2.5 E F5(name)2.76 E F4(that is not a function.)2.85
+E F8(return)108 530.4 Q F4([)2.5 E F5(n)A F4(])A .563
+(Causes a function to exit with the r)144 542.4 R .563
+(eturn value speci\214ed by)-.18 F F5(n)3.063 E F4 5.563(.I).08 G(f)
+-5.563 E F5(n)3.323 E F4 .563(is omitted, the r)3.143 F(eturn)-.18 E
+.544(status is that of the last command executed in the function body)
+144 554.4 R 5.545(.I)-1.11 G 3.045(fu)-5.545 G .545(sed outside a func-)
+-3.045 F 1.148(tion, but during execution of a script by the)144 566.4 R
+F8(.)3.648 E F4(\()6.148 E F8(source)A F4 3.648(\)c)C 1.148
+(ommand, it causes the shell to)-3.648 F .63
+(stop executing that script and r)144 578.4 R .63(eturn either)-.18 F F5
+(n)3.391 E F4 .631(or the exit status of the last command exe-)3.211 F
+.541(cuted within the script as the exit status of the script.)144 590.4
+R .54(If used outside a function and not)5.54 F .037
+(during execution of a script by)144 602.4 R F8(.)2.538 E F4 2.538(,t)
+.833 G .038(he r)-2.538 F .038(eturn status is false.)-.18 F .038
+(Any command associated with)5.038 F(the)144 614.4 Q F8(RETURN)2.5 E F4
+(trap is executed befor)2.5 E 2.5(ee)-.18 G(xecution r)-2.5 E
+(esumes after the function or script.)-.18 E F8(set)108 631.2 Q F4([)2.5
+E F8(\255\255abefhkmnptuvxBCHP)A F4 2.5(][)C F8<ad6f>-2.5 E F5(option)
+2.5 E F4 2.5(][)C F5(ar)-2.5 E(g)-.18 E F4(...])2.5 E -.55(Wi)144 643.2
+S .246(thout options, the name and value of each shell variable ar).55 F
+2.745(ed)-.18 G .245(isplayed in a format that)-2.745 F 2.183(can be r)
+144 655.2 R 2.183(eused as input.)-.18 F 2.184
+(The output is sorted accor)7.183 F 2.184(ding to the curr)-.18 F 2.184
+(ent locale.)-.18 F(When)7.184 E 1.006(options ar)144 667.2 R 3.506(es)
+-.18 G 1.006(peci\214ed, they set or unset shell attributes.)-3.506 F
+1.006(Any ar)6.006 F 1.005(guments r)-.18 F 1.005(emaining after)-.18 F
+1.981(the options ar)144 679.2 R 4.481(ep)-.18 G -.18(ro)-4.481 G 1.981
+(cessed ar).18 F 4.481(et)-.18 G -.18(re)-4.481 G 1.982
+(ated as values for the positional parameters and ar).18 F(e)-.18 E
+(assigned, in or)144 691.2 Q(der)-.18 E 2.5(,t)-.74 G(o)-2.5 E F8($1)2.5
+E F4(,)A F8($2)2.5 E F4(,)A F8 2.5(... $)2.5 F F5(n)A F4 5(.O)C
+(ptions, if speci\214ed, have the following meanings:)-5 E F8<ad61>144
+703.2 Q F4 1.063(Automatically mark variables and functions which ar)
+28.94 F 3.563(em)-.18 G 1.063(odi\214ed or cr)-3.563 F 1.063(eated for)
+-.18 F(export to the envir)184 715.2 Q(onment of subsequent commands.)
+-.18 E F0(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)-.15 G
+(mber 27).15 E(11)185.545 E 0 Cg EP
+%%Page: 12 12
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Palatino-Bold@0 SF<ad62>144 84 Q/F2 10/Palatino-Roman@0 SF .096
+(Report the status of terminated backgr)27.83 F .096
+(ound jobs immediately)-.18 F 2.596(,r)-1.11 G .096(ather than befor)
+-2.596 F(e)-.18 E(the next primary pr)184 96 Q 2.5(ompt. This)-.18 F
+(is ef)2.5 E(fective only when job contr)-.18 E(ol is enabled.)-.18 E F1
+<ad65>144 108 Q F2 .179(Exit immediately if a)28.94 F/F3 10
+/Palatino-Italic@0 SF .178(simple command)2.679 F F2(\(see)2.678 E/F4 9
+/Palatino-Bold@0 SF .178(SHELL GRAMMAR)2.678 F F2 .178
+(above\) exits with a)2.428 F(non-zer)184 120 Q 3.232(os)-.18 G 3.232
+(tatus. The)-3.232 F .733
+(shell does not exit if the command that fails is part of the)3.232 F
+.696(command list immediately following a)184 132 R F1(while)3.196 E F2
+(or)3.196 E F1(until)3.196 E F2(keywor)3.196 E .696(d, part of the test)
+-.18 F .98(in an)184 144 R F3(if)3.64 E F2 .98(statement, part of a)5.33
+F F1(&&)3.48 E F2(or)3.481 E/F5 10/Symbol SF<efef>3.481 E F2 .981
+(list, or if the command's r)3.481 F .981(eturn value is)-.18 F
+(being inverted via)184 156 Q F1(!)2.5 E F2 5(.A)C(trap on)-2.5 E F1
+(ERR)2.5 E F2 2.5(,i)C 2.5(fs)-2.5 G(et, is executed befor)-2.5 E 2.5
+(et)-.18 G(he shell exits.)-2.5 E F1<ad66>144 168 Q F2
+(Disable pathname expansion.)30.05 E F1<ad68>144 180 Q F2 .592
+(Remember the location of commands as they ar)27.83 F 3.092(el)-.18 G
+.591(ooked up for execution.)-3.092 F(This)5.591 E
+(is enabled by default.)184 192 Q F1<ad6b>144 204 Q F2 .934(All ar)27.83
+F .934(guments in the form of assignment statements ar)-.18 F 3.434(ep)
+-.18 G .935(laced in the envir)-3.434 F(on-)-.18 E
+(ment for a command, not just those that pr)184 216 Q
+(ecede the command name.)-.18 E F1<ad6d>144 228 Q F2 .711(Monitor mode.)
+25.05 F .711(Job contr)5.711 F .711(ol is enabled.)-.18 F .711
+(This option is on by default for interac-)5.711 F 1.164
+(tive shells on systems that support it \(see)184 240 R F4 1.165
+(JOB CONTROL)3.665 F F2 3.665(above\). Backgr)3.415 F(ound)-.18 E(pr)184
+252 Q .54(ocesses r)-.18 F .54(un in a separate pr)-.08 F .539(ocess gr)
+-.18 F .539(oup and a line containing their exit status)-.18 F
+(is printed upon their completion.)184 264 Q F1<ad6e>144 276 Q F2 1.313
+(Read commands but do not execute them.)27.83 F 1.313
+(This may be used to check a shell)6.313 F(script for syntax err)184 288
+Q 2.5(ors. This)-.18 F(is ignor)2.5 E(ed by interactive shells.)-.18 E
+F1<ad6f>144 300 Q F3(option\255name)2.5 E F2(The)184 312 Q F3
+(option\255name)2.5 E F2(can be one of the following:)2.5 E F1
+(allexport)184 324 Q F2(Same as)224 336 Q F1<ad61>2.5 E F2(.)A F1
+(braceexpand)184 348 Q F2(Same as)224 360 Q F1<ad42>2.5 E F2(.)A F1
+(emacs)184 372 Q F2 .412
+(Use an emacs-style command line editing interface.)12.23 F .412
+(This is enabled by)5.412 F .358(default when the shell is interactive,\
+ unless the shell is started with the)224 384 R F1(\255\255noediting)224
+396 Q F2(option.)2.5 E F1(errtrace)184 408 Q F2(Same as)5.56 E F1<ad45>
+2.5 E F2(.)A F1(functrace)184 420 Q F2(Same as)224 432 Q F1<ad54>2.5 E
+F2(.)A F1(errexit)184 444 Q F2(Same as)10.56 E F1<ad65>2.5 E F2(.)A F1
+(hashall)184 456 Q F2(Same as)6.68 E F1<ad68>2.5 E F2(.)A F1(histexpand)
+184 468 Q F2(Same as)224 480 Q F1<ad48>2.5 E F2(.)A F1(history)184 492 Q
+F2 2.271(Enable command history)7.78 F 4.771(,a)-1.11 G 4.771(sd)-4.771
+G 2.271(escribed above under)-4.771 F F4(HISTOR)4.771 E(Y)-.495 E/F6 9
+/Palatino-Roman@0 SF(.)A F2(This)6.77 E
+(option is on by default in interactive shells.)224 504 Q F1(ignoreeof)
+184 516 Q F2 1.673(The ef)224 528 R 1.673
+(fect is as if the shell command)-.18 F/F7 10/Courier@0 SF(IGNOREEOF=10)
+4.174 E F2 1.674(had been exe-)4.174 F(cuted \(see)224 540 Q F1(Shell V)
+2.5 E(ariables)-1.11 E F2(above\).)2.5 E F1(keyword)184 552 Q F2
+(Same as)224 564 Q F1<ad6b>2.5 E F2(.)A F1(monitor)184 576 Q F2(Same as)
+224 588 Q F1<ad6d>2.5 E F2(.)A F1(noclobber)184 600 Q F2(Same as)224 612
+Q F1<ad43>2.5 E F2(.)A F1(noexec)184 624 Q F2(Same as)8.89 E F1<ad6e>2.5
+E F2(.)A F1(noglob)184 636 Q F2(Same as)7.77 E F1<ad66>2.5 E F2(.)A F1
+(nolog)5 E F2(Curr)2.5 E(ently ignor)-.18 E(ed.)-.18 E F1(notify)184 648
+Q F2(Same as)12.22 E F1<ad62>2.5 E F2(.)A F1(nounset)184 660 Q F2
+(Same as)224 672 Q F1<ad75>2.5 E F2(.)A F1(onecmd)184 684 Q F2(Same as)
+224 696 Q F1<ad74>2.5 E F2(.)A F0(GNU Bash-2.05a)72 768 Q(2001 No)
+126.115 E -.15(ve)-.15 G(mber 27).15 E(12)185.545 E 0 Cg EP
+%%Page: 13 13
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Palatino-Bold@0 SF(physical)184 84 Q/F2 10/Palatino-Roman@0 SF(Same as)
+224 96 Q F1<ad50>2.5 E F2(.)A F1(pipefail)184 108 Q F2 .735
+(If set, the r)224 120 R .734
+(eturn value of a pipeline is the value of the last \(rightmost\))-.18 F
+.31(command to exit with a non-zer)224 132 R 2.811(os)-.18 G .311
+(tatus, or zer)-2.811 F 2.811(oi)-.18 G 2.811(fa)-2.811 G .311
+(ll commands in the)-2.811 F(pipeline exit successfully)224 144 Q 5(.T)
+-1.11 G(his option is disabled by default.)-5 E F1(posix)184 156 Q F2
+.815(Change the behavior of)15.56 F F1(bash)3.315 E F2(wher)3.315 E
+3.315(et)-.18 G .815(he default operation dif)-3.315 F .815(fers fr)-.18
+F(om)-.18 E(the POSIX 1003.2 standar)224 168 Q 2.5(dt)-.18 G 2.5(om)-2.5
+G(atch the standar)-2.5 E 2.5(d\()-.18 G/F3 10/Palatino-Italic@0 SF
+(`posix mode)-2.5 E F2(\).)A F1(privileged)184 180 Q F2(Same as)224 192
+Q F1<ad70>2.5 E F2(.)A F1(verbose)184 204 Q F2(Same as)224 216 Q F1
+<ad76>2.5 E F2(.)A F1(vi)184 228 Q F2
+(Use a vi-style command line editing interface.)31.11 E F1(xtrace)184
+240 Q F2(Same as)13.34 E F1<ad78>2.5 E F2(.)A(If)184 258 Q F1<ad6f>4.63
+E F2 2.131(is supplied with no)4.63 F F3(option\255name)4.631 E F2 4.631
+(,t)C 2.131(he values of the curr)-4.631 F 2.131(ent options ar)-.18 F
+(e)-.18 E 4.412(printed. If)184 270 R F1(+o)4.412 E F2 1.912
+(is supplied with no)4.412 F F3(option\255name)4.412 E F2 4.411(,as)C
+1.911(eries of)-4.411 F F1(set)4.411 E F2 1.911(commands to)4.411 F -.18
+(re)184 282 S(cr).18 E(eate the curr)-.18 E
+(ent option settings is displayed on the standar)-.18 E 2.5(do)-.18 G
+(utput.)-2.5 E F1<ad70>144 294 Q F2 -.9(Tu)27.83 G .853(rn on).9 F F3
+(privileged)3.923 E F2 3.353(mode. In)3.683 F .853(this mode, the)3.353
+F/F4 9/Palatino-Bold@0 SF($ENV)3.353 E F2(and)3.103 E F4($BASH_ENV)3.354
+E F2 .854(\214les ar)3.104 F 3.354(en)-.18 G(ot)-3.354 E(pr)184 306 Q
+2.873(ocessed, shell functions ar)-.18 F 5.373(en)-.18 G 2.873
+(ot inherited fr)-5.373 F 2.873(om the envir)-.18 F 2.873
+(onment, and the)-.18 F F4(SHELLOPTS)184 318 Q F2 .548
+(variable, if it appears in the envir)2.798 F .548(onment, is ignor)-.18
+F 3.049(ed. If)-.18 F .549(the shell is)3.049 F 1.115
+(started with the ef)184 330 R 1.115(fective user \(gr)-.18 F 1.115
+(oup\) id not equal to the r)-.18 F 1.115(eal user \(gr)-.18 F 1.115
+(oup\) id,)-.18 F .497(and the)184 342 R F1<ad70>2.997 E F2 .498
+(option is not supplied, these actions ar)2.998 F 2.998(et)-.18 G .498
+(aken and the ef)-2.998 F .498(fective user)-.18 F .685
+(id is set to the r)184 354 R .685(eal user id.)-.18 F .685(If the)5.685
+F F1<ad70>3.185 E F2 .684(option is supplied at startup, the ef)3.185 F
+(fective)-.18 E .752(user id is not r)184 366 R 3.252(eset. T)-.18 F
+.752(urning this option of)-.9 F 3.252(fc)-.18 G .752(auses the ef)
+-3.252 F .753(fective user and gr)-.18 F(oup)-.18 E
+(ids to be set to the r)184 378 Q(eal user and gr)-.18 E(oup ids.)-.18 E
+F1<ad74>144 390 Q F2(Exit after r)30.61 E
+(eading and executing one command.)-.18 E F1<ad75>144 402 Q F2 -.88 -.9
+(Tr e)27.83 H 2.498(at unset variables as an err).9 F 2.498
+(or when performing parameter expansion.)-.18 F(If)7.498 E .869
+(expansion is attempted on an unset variable, the shell prints an err)
+184 414 R .87(or message,)-.18 F
+(and, if not interactive, exits with a non-zer)184 426 Q 2.5(os)-.18 G
+(tatus.)-2.5 E F1<ad76>144 438 Q F2(Print shell input lines as they ar)
+28.38 E 2.5(er)-.18 G(ead.)-2.68 E F1<ad78>144 450 Q F2 2.637
+(After expanding each)28.94 F F3 2.637(simple command)5.137 F F2(,)A F1
+(for)5.137 E F2(command,)5.137 E F1(case)5.136 E F2(command,)5.136 E F1
+(select)5.136 E F2 .954(command, or arithmetic)184 462 R F1(for)3.454 E
+F2 .955(command, display the expanded value of)3.455 F F4(PS4)3.455 E/F5
+9/Palatino-Roman@0 SF(,)A F2(fol-)3.205 E
+(lowed by the command and its expanded ar)184 474 Q
+(guments or associated wor)-.18 E 2.5(dl)-.18 G(ist.)-2.5 E F1<ad42>144
+486 Q F2 .484(The shell performs brace expansion \(see)27.27 F F1 .484
+(Brace Expansion)2.984 F F2 2.984(above\). This)2.984 F .484(is on by)
+2.984 F(default.)184 498 Q F1<ad43>144 510 Q F2 .077(If set,)26.72 F F1
+(bash)2.577 E F2 .077(does not overwrite an existing \214le with the)
+2.577 F F1(>)2.578 E F2(,)A F1(>&)2.578 E F2 2.578(,a)C(nd)-2.578 E F1
+(<>)2.578 E F2 -.18(re)2.578 G(dir).18 E(ection)-.18 E 2.645
+(operators. This)184 522 R .145(may be overridden when cr)2.645 F .145
+(eating output \214les by using the r)-.18 F(edi-)-.18 E -.18(re)184 534
+S(ction operator).18 E F1(>|)2.5 E F2(instead of)2.5 E F1(>)2.5 E F2(.)A
+F1<ad45>144 546 Q F2 .901(If set, any trap on)27.83 F F1(ERR)3.402 E F2
+.902(is inherited by shell functions, command substitutions,)3.402 F .75
+(and commands executed in a subshell envir)184 558 R 3.25(onment. The)
+-.18 F F1(ERR)3.25 E F2 .75(trap is normally)3.25 F
+(not inherited in such cases.)184 570 Q F1<ad48>144 582 Q F2(Enable)
+25.61 E F1(!)2.515 E F2 .015(style history substitution.)5.015 F .016
+(This option is on by default when the shell is)5.016 F(interactive.)184
+594 Q F1<ad50>144 606 Q F2 .693(If set, the shell does not follow symbo\
+lic links when executing commands such)27.83 F(as)184 618 Q F1(cd)3.569
+E F2 1.069(that change the curr)3.569 F 1.069(ent working dir)-.18 F
+(ectory)-.18 E 6.069(.I)-1.11 G 3.569(tu)-6.069 G 1.07
+(ses the physical dir)-3.569 F(ectory)-.18 E(str)184 630 Q(uctur)-.08 E
+2.912(ei)-.18 G 2.912(nstead. By)-2.912 F(default,)2.912 E F1(bash)2.912
+E F2 .412(follows the logical chain of dir)2.912 F .411(ectories when)
+-.18 F(performing commands which change the curr)184 642 Q(ent dir)-.18
+E(ectory)-.18 E(.)-1.11 E F1<ad54>144 654 Q F2 1.25(If set, any trap on)
+27.27 F F1(DEBUG)3.751 E F2 1.251
+(is inherited by shell functions, command substitu-)3.751 F .712
+(tions, and commands executed in a subshell envir)184 666 R 3.212
+(onment. The)-.18 F F1(DEBUG)3.212 E F2 .711(trap is)3.211 F
+(normally not inherited in such cases.)184 678 Q F1<adad>144 690 Q F2
+1.781(If no ar)27.88 F 1.782
+(guments follow this option, then the positional parameters ar)-.18 F
+4.282(eu)-.18 G(nset.)-4.282 E 1.303
+(Otherwise, the positional parameters ar)184 702 R 3.803(es)-.18 G 1.303
+(et to the)-3.803 F F3(ar)3.803 E(g)-.18 E F2 1.303
+(s, even if some of them)B(begin with a)184 714 Q F1<ad>2.5 E F2(.)A F0
+(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)-.15 G(mber 27).15 E
+(13)185.545 E 0 Cg EP
+%%Page: 14 14
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Palatino-Bold@0 SF<ad>144 84 Q/F2 10/Palatino-Roman@0 SF 1.295
+(Signal the end of options, cause all r)33.94 F(emaining)-.18 E/F3 10
+/Palatino-Italic@0 SF(ar)3.796 E(g)-.18 E F2 3.796(st)C 3.796(ob)-3.796
+G 3.796(ea)-3.796 G 1.296(ssigned to the posi-)-3.796 F .042
+(tional parameters.)184 96 R(The)5.042 E F1<ad78>2.542 E F2(and)2.542 E
+F1<ad76>2.542 E F2 .041(options ar)2.541 F 2.541(et)-.18 G .041
+(urned of)-2.541 F 2.541(f. If)-.18 F(ther)2.541 E 2.541(ea)-.18 G .401
+-.18(re n)-2.541 H(o).18 E F3(ar)2.541 E(g)-.18 E F2 .041(s, the)B
+(positional parameters r)184 108 Q(emain unchanged.)-.18 E .12
+(The options ar)144 124.8 R 2.62(eo)-.18 G .48 -.18(ff b)-2.62 H 2.62
+(yd).18 G .121(efault unless otherwise noted.)-2.62 F .121
+(Using + rather than \255 causes these)5.121 F .278
+(options to be turned of)144 136.8 R 2.778(f. The)-.18 F .277
+(options can also be speci\214ed as ar)2.777 F .277
+(guments to an invocation)-.18 F .722(of the shell.)144 148.8 R .723
+(The curr)5.723 F .723(ent set of options may be found in)-.18 F F1
+<24ad>3.223 E F2 5.723(.T)C .723(he r)-5.723 F .723
+(eturn status is always)-.18 F(tr)144 160.8 Q
+(ue unless an invalid option is encounter)-.08 E(ed.)-.18 E F1(shift)108
+177.6 Q F2([)2.5 E F3(n)A F2(])A .807(The positional parameters fr)144
+189.6 R(om)-.18 E F3(n)3.306 E F2 .806(+1 ... ar)B 3.306(er)-.18 G .806
+(enamed to)-3.486 F F1 .806($1 ....)3.306 F F2 .806(Parameters r)5.806 F
+(epr)-.18 E .806(esented by)-.18 F .055(the numbers)144 201.6 R F1($#)
+2.555 E F2 .055(down to)2.555 F F1($#)2.555 E F2<ad>A F3(n)A F2 .055
+(+1 ar)B 2.555(eu)-.18 G(nset.)-2.555 E F3(n)5.315 E F2 .055
+(must be a non-negative number less than or)2.635 F .495(equal to)144
+213.6 R F1($#)2.995 E F2 5.495(.I)C(f)-5.495 E F3(n)3.255 E F2 .494
+(is 0, no parameters ar)3.075 F 2.994(ec)-.18 G 2.994(hanged. If)-2.994
+F F3(n)3.254 E F2 .494(is not given, it is assumed to be 1.)3.074 F(If)
+144 225.6 Q F3(n)4.052 E F2 1.292(is gr)3.872 F 1.292(eater than)-.18 F
+F1($#)3.792 E F2 3.792(,t)C 1.292(he positional parameters ar)-3.792 F
+3.792(en)-.18 G 1.292(ot changed.)-3.792 F 1.292(The r)6.292 F 1.292
+(eturn status is)-.18 F(gr)144 237.6 Q(eater than zer)-.18 E 2.5(oi)-.18
+G(f)-2.5 E F3(n)2.76 E F2(is gr)2.58 E(eater than)-.18 E F1($#)2.5 E F2
+(or less than zer)2.5 E(o; otherwise 0.)-.18 E F1(shopt)108 254.4 Q F2
+([)2.5 E F1(\255pqsu)A F2 2.5(][)C F1<ad6f>-2.5 E F2 2.5(][)C F3
+(optname)-2.5 E F2(...])2.5 E -.92(To)144 266.4 S 1.523
+(ggle the values of variables contr).92 F 1.522
+(olling optional shell behavior)-.18 F 6.522(.W)-.74 G 1.522
+(ith no options, or)-7.072 F 2.531(with the)144 278.4 R F1<ad70>5.031 E
+F2 2.531(option, a list of all settable options is displayed, with an i\
+ndication of)5.031 F .962(whether or not each is set.)144 290.4 R(The)
+5.962 E F1<ad70>3.462 E F2 .962
+(option causes output to be displayed in a form that)3.462 F(may be r)
+144 302.4 Q(eused as input.)-.18 E
+(Other options have the following meanings:)5 E F1<ad73>144 314.4 Q F2
+(Enable \(set\) each)25.5 E F3(optname)2.5 E F2(.)A F1<ad75>144 326.4 Q
+F2(Disable \(unset\) each)23.83 E F3(optname)2.5 E F2(.)A F1<ad71>144
+338.4 Q F2(Suppr)23.83 E .903(esses normal output \(quiet mode\); the r)
+-.18 F .903(eturn status indicates whether the)-.18 F F3(optname)180
+350.4 Q F2 1.679(is set or unset.)4.179 F 1.679(If multiple)6.679 F F3
+(optname)4.178 E F2(ar)4.178 E 1.678(guments ar)-.18 F 4.178(eg)-.18 G
+1.678(iven with)-4.178 F F1<ad71>4.178 E F2 4.178(,t)C(he)-4.178 E -.18
+(re)180 362.4 S(turn status is zer).18 E 2.5(oi)-.18 G 2.5(fa)-2.5 G(ll)
+-2.5 E F3(optnames)2.5 E F2(ar)2.5 E 2.5(ee)-.18 G(nabled; non-zer)-2.5
+E 2.5(oo)-.18 G(therwise.)-2.5 E F1<ad6f>144 374.4 Q F2 1.348
+(Restricts the values of)24.38 F F3(optname)3.848 E F2 1.348
+(to be those de\214ned for the)3.848 F F1<ad6f>3.848 E F2 1.348
+(option to the)3.848 F F1(set)3.848 E F2(builtin.)180 386.4 Q 1.86
+(If either)144 403.2 R F1<ad73>4.36 E F2(or)4.36 E F1<ad75>4.36 E F2
+1.86(is used with no)4.36 F F3(optname)4.36 E F2(ar)4.36 E 1.86
+(guments, the display is limited to those)-.18 F 1.061(options which ar)
+144 415.2 R 3.561(es)-.18 G 1.062(et or unset, r)-3.561 F(espectively)
+-.18 E 6.062(.U)-1.11 G 1.062(nless otherwise noted, the)-6.062 F F1
+(shopt)3.562 E F2(options)3.562 E(ar)144 427.2 Q 2.5(ed)-.18 G
+(isabled \(unset\) by default.)-2.5 E .473(The r)144 444 R .473
+(eturn status when listing options is zer)-.18 F 2.973(oi)-.18 G 2.973
+(fa)-2.973 G(ll)-2.973 E F3(optnames)2.973 E F2(ar)2.973 E 2.973(ee)-.18
+G .472(nabled, non-zer)-2.973 F 2.972(oo)-.18 G(ther)-2.972 E(-)-.18 E
+2.601(wise. When)144 456 R .101(setting or unsetting options, the r)
+2.601 F .101(eturn status is zer)-.18 F 2.602(ou)-.18 G .102(nless an)
+-2.602 F F3(optname)2.602 E F2 .102(is not)2.602 F 2.5(av)144 468 S
+(alid shell option.)-2.5 E(The list of)144 484.8 Q F1(shopt)2.5 E F2
+(options is:)2.5 E F1(cdable_vars)144 502.8 Q F2 .364(If set, an ar)184
+514.8 R .364(gument to the)-.18 F F1(cd)2.864 E F2 .364
+(builtin command that is not a dir)2.864 F .364(ectory is assumed)-.18 F
+(to be the name of a variable whose value is the dir)184 526.8 Q
+(ectory to change to.)-.18 E F1(cdspell)144 538.8 Q F2 1.137
+(If set, minor err)7.24 F 1.138(ors in the spelling of a dir)-.18 F
+1.138(ectory component in a)-.18 F F1(cd)3.638 E F2(command)3.638 E
+1.289(will be corr)184 550.8 R 3.788(ected. The)-.18 F(err)3.788 E 1.288
+(ors checked for ar)-.18 F 3.788(et)-.18 G 1.288
+(ransposed characters, a missing)-3.788 F(character)184 562.8 Q 2.74(,a)
+-.74 G .24(nd one character too many)-2.74 F 5.241(.I)-1.11 G 2.741(fac)
+-5.241 G(orr)-2.741 E .241(ection is found, the corr)-.18 F .241
+(ected \214le)-.18 F .431(name is printed, and the command pr)184 574.8
+R 2.931(oceeds. This)-.18 F .43(option is only used by inter)2.931 F(-)
+-.18 E(active shells.)184 586.8 Q F1(checkhash)144 598.8 Q F2 .762
+(If set,)184 610.8 R F1(bash)3.262 E F2 .763
+(checks that a command found in the hash table exists befor)3.263 F
+3.263(et)-.18 G(rying)-3.263 E .023(to execute it.)184 622.8 R .023
+(If a hashed command no longer exists, a normal path sear)5.023 F .022
+(ch is per)-.18 F(-)-.18 E(formed.)184 634.8 Q F1(checkwinsize)144 646.8
+Q F2 2.584(If set,)184 658.8 R F1(bash)5.084 E F2 2.584
+(checks the window size after each command and, if necessary)5.084 F(,)
+-1.11 E(updates the values of)184 670.8 Q/F4 9/Palatino-Bold@0 SF(LINES)
+2.5 E F2(and)2.25 E F4(COLUMNS)2.5 E/F5 9/Palatino-Roman@0 SF(.)A F1
+(cmdhist)144 682.8 Q F2 1.298(If set,)184 694.8 R F1(bash)3.798 E F2
+1.297(attempts to save all lines of a multiple-line command in the same)
+3.797 F(history entry)184 706.8 Q 5(.T)-1.11 G(his allows easy r)-5 E
+(e-editing of multi-line commands.)-.18 E F0(GNU Bash-2.05a)72 768 Q
+(2001 No)126.115 E -.15(ve)-.15 G(mber 27).15 E(14)185.545 E 0 Cg EP
+%%Page: 15 15
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Palatino-Bold@0 SF(dotglob)144 84 Q/F2 10/Palatino-Roman@0 SF 1.338
+(If set,)184 96 R F1(bash)3.838 E F2 1.338
+(includes \214lenames beginning with a `.' in the r)3.838 F 1.339
+(esults of pathname)-.18 F(expansion.)184 108 Q F1(execfail)144 120 Q F2
+.315(If set, a non-interactive shell will not exit if it cannot execute\
+ the \214le speci\214ed as)5.01 F .783(an ar)184 132 R .783
+(gument to the)-.18 F F1(exec)3.283 E F2 .783(builtin command.)3.283 F
+.783(An interactive shell does not exit if)5.783 F F1(exec)184 144 Q F2
+(fails.)2.5 E F1(expand_aliases)144 156 Q F2 1.159(If set, aliases ar)
+184 168 R 3.659(ee)-.18 G 1.159(xpanded as described above under)-3.659
+F/F3 9/Palatino-Bold@0 SF(ALIASES)3.659 E/F4 9/Palatino-Roman@0 SF(.)A
+F2 1.159(This option is)5.659 F
+(enabled by default for interactive shells.)184 180 Q F1(extdebug)144
+192 Q F2(If set, behavior intended for use by debuggers is enabled:)184
+204 Q F1(1.)184 216 Q F2(The)28.5 E F1<ad46>3.607 E F2 1.107
+(option to the)3.607 F F1(declare)3.607 E F2 1.108
+(builtin displays the sour)3.607 F 1.108(ce \214le name and)-.18 F .624
+(line number corr)220 228 R .624
+(esponding to each function name supplied as an ar)-.18 F(gu-)-.18 E
+(ment.)220 240 Q F1(2.)184 252 Q F2 .98(If the command r)28.5 F .98
+(un by the)-.08 F F1(DEBUG)3.48 E F2 .98(trap r)3.48 F .98
+(eturns a non-zer)-.18 F 3.48(ov)-.18 G .98(alue, the)-3.48 F
+(next command is skipped and not executed.)220 264 Q F1(3.)184 276 Q F2
+1.107(If the command r)28.5 F 1.107(un by the)-.08 F F1(DEBUG)3.607 E F2
+1.106(trap r)3.606 F 1.106(eturns a value of 2, and the)-.18 F .87
+(shell is executing in a subr)220 288 R .871
+(outine \(a shell function or a shell script exe-)-.18 F(cuted by the)
+220 300 Q F1(.)2.5 E F2(or)2.5 E F1(source)2.5 E F2
+(builtins\), a call to)2.5 E F1(return)2.5 E F2(is simulated.)2.5 E F1
+(extglob)144 312 Q F2 .432(If set, the extended pattern matching featur)
+6.11 F .432(es described above under)-.18 F F1(Pathname)2.932 E
+(Expansion)184 324 Q F2(ar)2.5 E 2.5(ee)-.18 G(nabled.)-2.5 E F1
+(extquote)144 336 Q F2 .143(If set,)184 348 R F1($)2.643 E F2(')A/F5 10
+/Palatino-Italic@0 SF(string)A F2 2.643('a)C(nd)-2.643 E F1($)2.643 E F2
+(")A F5(string)A F2 2.643("q)C .143(uoting is performed within)-2.643 F
+F1(${)2.643 E F5(parameter)A F1(})A F2(expansions)2.643 E
+(enclosed in double quotes.)184 360 Q
+(This option is enabled by default.)5 E F1(failglob)144 372 Q F2 .507(I\
+f set, patterns which fail to match \214lenames during pathname expansi\
+on r)184 384 R(esult)-.18 E(in an expansion err)184 396 Q(or)-.18 E(.)
+-.74 E F1(force_\214gnore)144 408 Q F2 1.118(If set, the suf)184 420 R
+1.118(\214xes speci\214ed by the)-.18 F F1(FIGNORE)3.618 E F2 1.119
+(shell variable cause wor)3.619 F 1.119(ds to be)-.18 F(ignor)184 432 Q
+1.291(ed when performing wor)-.18 F 3.791(dc)-.18 G 1.291
+(ompletion even if the ignor)-3.791 F 1.291(ed wor)-.18 F 1.291(ds ar)
+-.18 F 3.79(et)-.18 G(he)-3.79 E 1.7(only possible completions.)184 444
+R(See)6.7 E F3 1.7(SHELL V)4.2 F(ARIABLES)-1.161 E F2 1.701
+(above for a description of)3.95 F F1(FIGNORE)184 456 Q F2 5(.T)C
+(his option is enabled by default.)-5 E F1(gnu_errfmt)144 468 Q F2 .843
+(If set, shell err)184 480 R .843(or messages ar)-.18 F 3.342(ew)-.18 G
+.842(ritten in the standar)-3.342 F 3.342(dG)-.18 G .842(NU err)-3.342 F
+.842(or message for)-.18 F(-)-.18 E(mat.)184 492 Q F1(histappend)144 504
+Q F2 1.127(If set, the history list is appended to the \214le named by \
+the value of the)184 516 R F1(HIST)3.627 E(-)-.92 E(FILE)184 528 Q F2
+(variable when the shell exits, rather than overwriting the \214le.)2.5
+E F1(histreedit)144 540 Q F2 1.381(If set, and)184 552 R F1(readline)
+3.881 E F2 1.381(is being used, a user is given the opportunity to r)
+3.881 F 1.38(e-edit a)-.18 F(failed history substitution.)184 564 Q F1
+(histverify)144 576 Q F2 2.133(If set, and)184 588 R F1(readline)4.633 E
+F2 2.133(is being used, the r)4.633 F 2.133
+(esults of history substitution ar)-.18 F 4.634(en)-.18 G(ot)-4.634 E
+.383(immediately passed to the shell parser)184 600 R 5.383(.I)-.74 G
+.382(nstead, the r)-5.383 F .382(esulting line is loaded into)-.18 F
+(the)184 612 Q F1(readline)2.5 E F2(editing buf)2.5 E(fer)-.18 E 2.5(,a)
+-.74 G(llowing further modi\214cation.)-2.5 E F1(hostcomplete)144 624 Q
+F2 .647(If set, and)184 636 R F1(readline)3.147 E F2 .648
+(is being used,)3.147 F F1(bash)3.148 E F2 .648
+(will attempt to perform hostname com-)3.148 F .44(pletion when a wor)
+184 648 R 2.939(dc)-.18 G .439(ontaining a)-2.939 F F1(@)2.939 E F2 .439
+(is being completed \(see)2.939 F F1(Completing)2.939 E F2(under)2.939 E
+F3(READLINE)184 660 Q F2 2.5(above\). This)2.25 F
+(is enabled by default.)2.5 E F1(huponexit)144 672 Q F2(If set,)184 684
+Q F1(bash)2.5 E F2(will send)2.5 E F3(SIGHUP)2.5 E F2
+(to all jobs when an interactive login shell exits.)2.25 E F1
+(interactive_comments)144 696 Q F2 .26(If set, allow a wor)184 708 R
+2.76(db)-.18 G .26(eginning with)-2.76 F F1(#)2.76 E F2 .26
+(to cause that wor)2.76 F 2.76(da)-.18 G .26(nd all r)-2.76 F .26
+(emaining char)-.18 F(-)-.18 E .512(acters on that line to be ignor)184
+720 R .512(ed in an interactive shell \(see)-.18 F F3(COMMENTS)3.012 E
+F2(above\).)2.762 E F0(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15
+(ve)-.15 G(mber 27).15 E(15)185.545 E 0 Cg EP
+%%Page: 16 16
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Palatino-Roman@0 SF(This option is enabled by default.)184 84 Q/F2 10
+/Palatino-Bold@0 SF(lithist)144 96 Q F1 .513(If set, and the)12.8 F F2
+(cmdhist)3.013 E F1 .513(option is enabled, multi-line commands ar)3.013
+F 3.013(es)-.18 G .513(aved to the)-3.013 F .643(history with embedded \
+newlines rather than using semicolon separators wher)184 108 R(e)-.18 E
+(possible.)184 120 Q F2(login_shell)144 132 Q F1 2.454
+(The shell sets this option if it is started as a login shell \(see)184
+144 R/F3 9/Palatino-Bold@0 SF(INVOCA)4.954 E(TION)-.828 E F1 2.5
+(above\). The)184 156 R(value may not be changed.)2.5 E F2(mailwarn)144
+168 Q F1 .965(If set, and a \214le that)184 180 R F2(bash)3.465 E F1
+.964(is checking for mail has been accessed since the last)3.464 F 1.647
+(time it was checked, the message `)184 192 R 1.647(`The mail in)-.37 F
+/F4 10/Palatino-Italic@0 SF(mail\214le)4.147 E F1 1.647(has been r)4.147
+F(ead')-.18 E 4.148('i)-.37 G 4.148(sd)-4.148 G(is-)-4.148 E(played.)184
+204 Q F2(no_empty_cmd_completion)144 216 Q F1 .572(If set, and)184 228 R
+F2(readline)3.072 E F1 .572(is being used,)3.072 F F2(bash)3.072 E F1
+.572(will not attempt to sear)3.072 F .572(ch the)-.18 F F2 -.74(PA)
+3.072 G(TH)-.18 E F1(for)3.072 E
+(possible completions when completion is attempted on an empty line.)184
+240 Q F2(nocaseglob)144 252 Q F1 1.548(If set,)184 264 R F2(bash)4.048 E
+F1 1.548
+(matches \214lenames in a case\255insensitive fashion when performing)
+4.048 F(pathname expansion \(see)184 276 Q F2(Pathname Expansion)2.5 E
+F1(above\).)2.5 E F2(nullglob)144 288 Q F1 2.34(If set,)184 300 R F2
+(bash)4.84 E F1 2.34(allows patterns which match no \214les \(see)4.84 F
+F2 2.34(Pathname Expansion)4.84 F F1
+(above\) to expand to a null string, rather than themselves.)184 312 Q
+F2(progcomp)144 324 Q F1 1.198(If set, the pr)184 336 R 1.199
+(ogrammable completion facilities \(see)-.18 F F2 1.199
+(Programmable Completion)3.699 F F1(above\) ar)184 348 Q 2.5(ee)-.18 G
+2.5(nabled. This)-2.5 F(option is enabled by default.)2.5 E F2
+(promptvars)144 360 Q F1 2.553(If set, pr)184 372 R 2.553
+(ompt strings under)-.18 F 2.552
+(go parameter expansion, command substitution,)-.18 F 1.007
+(arithmetic expansion, and quote r)184 384 R 1.007
+(emoval after being expanded as described in)-.18 F F3(PROMPTING)184 396
+Q F1 2.5(above. This)2.25 F(option is enabled by default.)2.5 E F2
+(restricted_shell)144 408 Q F1 1.743
+(The shell sets this option if it is started in r)184 420 R 1.742
+(estricted mode \(see)-.18 F F3(RESTRICTED)4.242 E(SHELL)184 432 Q F1
+4.862(below\). The)4.612 F 2.362(value may not be changed.)4.862 F 2.362
+(This is not r)7.362 F 2.362(eset when the)-.18 F .294
+(startup \214les ar)184 444 R 2.794(ee)-.18 G .294
+(xecuted, allowing the startup \214les to discover whether or not a)
+-2.794 F(shell is r)184 456 Q(estricted.)-.18 E F2(shift_verbose)144 468
+Q F1 .527(If set, the)184 480 R F2(shift)3.028 E F1 .528
+(builtin prints an err)3.028 F .528
+(or message when the shift count exceeds the)-.18 F
+(number of positional parameters.)184 492 Q F2(sourcepath)144 504 Q F1
+.515(If set, the)184 516 R F2(source)3.015 E F1(\()3.014 E F2(.)A F1
+3.014(\)b)C .514(uiltin uses the value of)-3.014 F F3 -.666(PA)3.014 G
+(TH)-.162 E F1 .514(to \214nd the dir)2.764 F .514(ectory contain-)-.18
+F(ing the \214le supplied as an ar)184 528 Q 2.5(gument. This)-.18 F
+(option is enabled by default.)2.5 E F2(xpg_echo)144 540 Q F1
+(If set, the)184 552 Q F2(echo)2.5 E F1
+(builtin expands backslash-escape sequences by default.)2.5 E F2
+(suspend)108 564 Q F1([)2.5 E F2<ad66>A F1(])A .048
+(Suspend the execution of this shell until it r)144 576 R .048
+(eceives a)-.18 F F3(SIGCONT)2.548 E F1 2.548(signal. The)2.298 F F2
+<ad66>2.548 E F1 .048(option says)2.548 F .327
+(not to complain if this is a login shell; just suspend anyway)144 588 R
+5.327(.T)-1.11 G .327(he r)-5.327 F .327(eturn status is 0 unless)-.18 F
+(the shell is a login shell and)144 600 Q F2<ad66>2.5 E F1
+(is not supplied, or if job contr)2.5 E(ol is not enabled.)-.18 E F2
+(test)108 612 Q F4(expr)2.5 E F2([)108 624 Q F4(expr)2.5 E F2(])2.5 E F1
+.544(Return a status of 0 or 1 depending on the evaluation of the condi\
+tional expr)6.56 F(ession)-.18 E F4(expr)3.044 E F1(.).45 E .789
+(Each operator and operand must be a separate ar)144 636 R 3.288
+(gument. Expr)-.18 F .788(essions ar)-.18 F 3.288(ec)-.18 G .788
+(omposed of)-3.288 F(the primaries described above under)144 648 Q F3
+(CONDITIONAL EXPRESSIONS)2.5 E/F5 9/Palatino-Roman@0 SF(.)A F1(Expr)144
+666 Q .054
+(essions may be combined using the following operators, listed in decr)
+-.18 F .055(easing or)-.18 F .055(der of)-.18 F(pr)144 678 Q(ecedence.)
+-.18 E F2(!)144 690 Q F4(expr)2.5 E F1 -.78 -.9(Tr u)12.94 H 2.5(ei).9 G
+(f)-2.5 E F4(expr)2.85 E F1(is false.)2.95 E F2(\()144 702 Q F4(expr)2.5
+E F2(\))2.5 E F1 .847(Returns the value of)6.56 F F4(expr)3.347 E F1
+5.847(.T)C .847(his may be used to override the normal pr)-5.847 F
+(ecedence)-.18 E(of operators.)180 714 Q F0(GNU Bash-2.05a)72 768 Q
+(2001 No)126.115 E -.15(ve)-.15 G(mber 27).15 E(16)185.545 E 0 Cg EP
+%%Page: 17 17
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Palatino-Italic@0 SF(expr1)144 84 Q/F2 10/Palatino-Roman@0 SF<ad>2.5 E
+/F3 10/Palatino-Bold@0 SF(a)A F1(expr2)2.5 E F2 -.78 -.9(Tr u)180 96 T
+2.5(ei).9 G 2.5(fb)-2.5 G(oth)-2.5 E F1(expr1)2.85 E F2(and)2.5 E F1
+(expr2)2.85 E F2(ar)2.5 E 2.5(et)-.18 G -.08(ru)-2.5 G(e.).08 E F1
+(expr1)144 108 Q F2<ad>2.5 E F3(o)A F1(expr2)2.5 E F2 -.78 -.9(Tr u)180
+120 T 2.5(ei).9 G 2.5(fe)-2.5 G(ither)-2.5 E F1(expr1)2.85 E F2(or)2.5 E
+F1(expr2)2.85 E F2(is tr)2.5 E(ue.)-.08 E F3(test)144 136.8 Q F2(and)
+3.576 E F3([)3.576 E F2 1.076(evaluate conditional expr)3.576 F 1.076
+(essions using a set of r)-.18 F 1.076(ules based on the number of)-.08
+F(ar)144 148.8 Q(guments.)-.18 E 2.5(0a)144 166.8 S -.18(rg)-2.5 G
+(uments).18 E(The expr)180 178.8 Q(ession is false.)-.18 E 2.5(1a)144
+190.8 S -.18(rg)-2.5 G(ument).18 E(The expr)180 202.8 Q(ession is tr)
+-.18 E(ue if and only if the ar)-.08 E(gument is not null.)-.18 E 2.5
+(2a)144 214.8 S -.18(rg)-2.5 G(uments).18 E .209(If the \214rst ar)180
+226.8 R .208(gument is)-.18 F F3(!)2.708 E F2 2.708(,t)C .208(he expr)
+-2.708 F .208(ession is tr)-.18 F .208(ue if and only if the second ar)
+-.08 F(gument)-.18 E 2.143(is null.)180 238.8 R 2.144(If the \214rst ar)
+7.143 F 2.144(gument is one of the unary conditional operators listed)
+-.18 F 1.402(above under)180 250.8 R/F4 9/Palatino-Bold@0 SF 1.401
+(CONDITIONAL EXPRESSIONS)3.901 F/F5 9/Palatino-Roman@0 SF(,)A F2 1.401
+(the expr)3.651 F 1.401(ession is tr)-.18 F 1.401(ue if the unary)-.08 F
+1.355(test is tr)180 262.8 R 3.855(ue. If)-.08 F 1.356(the \214rst ar)
+3.855 F 1.356(gument is not a valid unary conditional operator)-.18 F
+3.856(,t)-.74 G(he)-3.856 E(expr)180 274.8 Q(ession is false.)-.18 E 2.5
+(3a)144 286.8 S -.18(rg)-2.5 G(uments).18 E 1.5(If the second ar)180
+298.8 R 1.499
+(gument is one of the binary conditional operators listed above)-.18 F
+(under)180 310.8 Q F4 .64(CONDITIONAL EXPRESSIONS)3.14 F F5(,)A F2 .64
+(the r)2.89 F .64(esult of the expr)-.18 F .64(ession is the r)-.18 F
+.641(esult of)-.18 F .529(the binary test using the \214rst and thir)180
+322.8 R 3.029(da)-.18 G -.18(rg)-3.029 G .528(uments as operands.).18 F
+.528(If the \214rst ar)5.528 F(gu-)-.18 E .106(ment is)180 334.8 R F3(!)
+2.606 E F2 2.606(,t)C .107(he value is the negation of the two-ar)-2.606
+F .107(gument test using the second and)-.18 F(thir)180 346.8 Q 4.633
+(da)-.18 G -.18(rg)-4.633 G 4.633(uments. If).18 F 2.133(the \214rst ar)
+4.633 F 2.132(gument is exactly)-.18 F F3(\()4.632 E F2 2.132
+(and the thir)4.632 F 4.632(da)-.18 G -.18(rg)-4.632 G 2.132(ument is)
+.18 F(exactly)180 358.8 Q F3(\))2.925 E F2 2.925(,t)C .426(he r)-2.925 F
+.426(esult is the one-ar)-.18 F .426(gument test of the second ar)-.18 F
+2.926(gument. Otherwise,)-.18 F .43(the expr)180 370.8 R .43
+(ession is false.)-.18 F(The)5.43 E F3<ad61>2.93 E F2(and)2.93 E F3
+<ad6f>2.93 E F2 .43(operators ar)2.93 F 2.93(ec)-.18 G(onsider)-2.93 E
+.43(ed binary operators)-.18 F(in this case.)180 382.8 Q 2.5(4a)144
+394.8 S -.18(rg)-2.5 G(uments).18 E .668(If the \214rst ar)180 406.8 R
+.668(gument is)-.18 F F3(!)3.168 E F2 3.168(,t)C .669(he r)-3.168 F .669
+(esult is the negation of the thr)-.18 F(ee-ar)-.18 E .669(gument expr)
+-.18 F(es-)-.18 E .409(sion composed of the r)180 418.8 R .409
+(emaining ar)-.18 F 2.909(guments. Otherwise,)-.18 F .409(the expr)2.909
+F .409(ession is parsed)-.18 F(and evaluated accor)180 430.8 Q
+(ding to pr)-.18 E(ecedence using the r)-.18 E(ules listed above.)-.08 E
+2.5(5o)144 442.8 S 2.5(rm)-2.5 G(or)-2.5 E 2.5(ea)-.18 G -.18(rg)-2.5 G
+(uments).18 E .781(The expr)180 454.8 R .782
+(ession is parsed and evaluated accor)-.18 F .782(ding to pr)-.18 F .782
+(ecedence using the r)-.18 F(ules)-.08 E(listed above.)180 466.8 Q F3
+(times)108 483.6 Q F2 .334
+(Print the accumulated user and system times for the shell and for pr)
+11.01 F .334(ocesses r)-.18 F .334(un fr)-.08 F .334(om the)-.18 F 2.5
+(shell. The)144 495.6 R -.18(re)2.5 G(turn status is 0.).18 E F3(trap)
+108 512.4 Q F2([)2.5 E F3(\255lp)A F2 2.5(][)C F1(ar)-2.5 E(g)-.18 E F2
+2.5(][)C F1(sigspec)-2.5 E F2(...])2.5 E .563(The command)144 524.4 R F1
+(ar)3.523 E(g)-.18 E F2 .563(is to be r)3.543 F .563
+(ead and executed when the shell r)-.18 F .564(eceives signal\(s\))-.18
+F F1(sigspec)3.064 E F2 5.564(.I).32 G(f)-5.564 E F1(ar)144.46 536.4 Q
+(g)-.18 E F2 .942(is absent or)3.922 F F3<ad>3.442 E F2 3.441(,a)C .941
+(ll speci\214ed signals ar)-3.441 F 3.441(er)-.18 G .941
+(eset to their original values \(the values they)-3.621 F 1.892
+(had upon entrance to the shell\).)144 548.4 R(If)6.892 E F1(ar)4.852 E
+(g)-.18 E F2 1.893(is the null string the signal speci\214ed by each)
+4.872 F F1(sigspec)144.41 560.4 Q F2 .515(is ignor)3.335 F .514
+(ed by the shell and by the commands it invokes.)-.18 F(If)5.514 E F1
+(ar)3.474 E(g)-.18 E F2 .514(is not pr)3.494 F .514(esent and)-.18 F F3
+<ad70>144 572.4 Q F2 2.161
+(has been supplied, then the trap commands associated with each)4.66 F
+F1(sigspec)5.071 E F2(ar)4.981 E 4.661(ed)-.18 G(is-)-4.661 E 3.428
+(played. If)144 584.4 R .927(no ar)3.427 F .927(guments ar)-.18 F 3.427
+(es)-.18 G .927(upplied or if only)-3.427 F F3<ad70>3.427 E F2 .927
+(is given,)3.427 F F3(trap)3.427 E F2 .927(prints the list of com-)3.427
+F .646(mands associated with each signal number)144 596.4 R 5.647(.T)
+-.74 G(he)-5.647 E F3<ad6c>3.147 E F2 .647
+(option causes the shell to print a list)3.147 F 1.095
+(of signal names and their corr)144 608.4 R 1.095(esponding numbers.)
+-.18 F(Each)6.095 E F1(sigspec)4.005 E F2 1.094(is either a signal name)
+3.914 F .369(de\214ned in <)144 620.4 R F1(signal.h)A F2 .369
+(>, or a signal number)B 5.37(.I)-.74 G 2.87(fa)-5.37 G F1(sigspec).41 E
+F2(is)3.19 E F4(EXIT)2.87 E F2 .37(\(0\) the command)2.62 F F1(ar)3.33 E
+(g)-.18 E F2 .37(is exe-)3.35 F .801(cuted on exit fr)144 632.4 R .8
+(om the shell.)-.18 F .8(If a)5.8 F F1(sigspec)3.71 E F2(is)3.62 E F4
+(DEBUG)3.3 E F5(,)A F2 .8(the command)3.05 F F1(ar)3.76 E(g)-.18 E F2 .8
+(is executed befor)3.78 F(e)-.18 E(every)144 644.4 Q F1 .439
+(simple command)2.939 F F2(,)A F1(for)2.939 E F2(command,)2.939 E F1
+(case)2.939 E F2(command,)2.939 E F1(select)2.939 E F2 .439
+(command, every arithmetic)2.939 F F1(for)2.94 E F2 .592
+(command, and befor)144 656.4 R 3.092(et)-.18 G .592
+(he \214rst command executes in a shell function \(see)-3.092 F F4 .591
+(SHELL GRAM-)3.091 F(MAR)144 668.4 Q F2 2.534(above\). Refer)2.284 F
+.034(to the description of the)2.534 F F3(extglob)2.535 E F2 .035
+(option to the)2.535 F F3(shopt)2.535 E F2 .035(builtin for details)
+2.535 F .547(of its ef)144 680.4 R .547(fect on the)-.18 F F3(DEBUG)
+3.046 E F2 3.046(trap. If)3.046 F(a)3.046 E F1(sigspec)3.456 E F2(is)
+3.366 E F4(ERR)3.046 E F5(,)A F2 .546(the command)2.796 F F1(ar)3.506 E
+(g)-.18 E F2 .546(is executed when-)3.526 F 1.03
+(ever a simple command has a non\255zer)144 692.4 R 3.531(oe)-.18 G
+1.031(xit status, subject to the following conditions.)-3.531 F(The)144
+704.4 Q F4(ERR)3.034 E F2 .533(trap is not executed if the failed comma\
+nd is part of the command list immedi-)2.784 F .222(ately following a)
+144 716.4 R F3(while)2.722 E F2(or)2.722 E F3(until)2.722 E F2(keywor)
+2.722 E .222(d, part of the test in an)-.18 F F1(if)2.882 E F2 .223
+(statement, part of a)4.572 F F3(&&)2.723 E F2(or)144 728.4 Q/F6 10
+/Symbol SF<efef>3.613 E F2 1.113(list, or if the command's r)3.613 F
+1.113(eturn value is being inverted via)-.18 F F3(!)3.613 E F2 6.113(.T)
+C 1.113(hese ar)-6.113 F 3.613(et)-.18 G 1.112(he same)-3.613 F F0
+(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)-.15 G(mber 27).15 E
+(17)185.545 E 0 Cg EP
+%%Page: 18 18
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Palatino-Roman@0 SF .316(conditions obeyed by the)144 84 R/F2 10
+/Palatino-Bold@0 SF(errexit)2.816 E F1 2.816(option. If)2.816 F(a)2.816
+E/F3 10/Palatino-Italic@0 SF(sigspec)3.226 E F1(is)3.136 E/F4 9
+/Palatino-Bold@0 SF(RETURN)2.816 E/F5 9/Palatino-Roman@0 SF(,)A F1 .316
+(the command)2.566 F F3(ar)3.277 E(g)-.18 E F1 .317(is exe-)3.297 F .448
+(cuted each time a shell function or a script executed with the)144 96 R
+F2(.)2.948 E F1(or)2.948 E F2(source)2.948 E F1 .448
+(builtins \214nishes)2.948 F 3.427(executing. Signals)144 108 R(ignor)
+3.427 E .928(ed upon entry to the shell cannot be trapped or r)-.18 F
+3.428(eset. T)-.18 F(rapped)-.9 E .615(signals ar)144 120 R 3.115(er)
+-.18 G .615(eset to their original values in a child pr)-3.295 F .615
+(ocess when it is cr)-.18 F 3.115(eated. The)-.18 F -.18(re)3.115 G
+(turn).18 E(status is false if any)144 132 Q F3(sigspec)2.91 E F1
+(is invalid; otherwise)2.82 E F2(trap)2.5 E F1 -.18(re)2.5 G(turns tr)
+.18 E(ue.)-.08 E F2(type)108 148.8 Q F1([)2.5 E F2(\255aftpP)A F1(])A F3
+(name)2.5 E F1([)2.5 E F3(name)A F1(...])2.5 E -.55(Wi)144 160.8 S 1.475
+(th no options, indicate how each).55 F F3(name)4.236 E F1 1.476
+(would be interpr)4.326 F 1.476(eted if used as a command)-.18 F 2.726
+(name. If)144 172.8 R(the)2.726 E F2<ad74>2.726 E F1 .226
+(option is used,)2.726 F F2(type)2.725 E F1 .225
+(prints a string which is one of)2.725 F F3(alias)2.725 E F1(,).06 E F3
+(keyword)2.725 E F1(,).33 E F3(function)2.725 E F1(,).08 E F3(builtin)
+144 184.8 Q F1 2.555(,o).08 G(r)-2.555 E F3(\214le)4.675 E F1(if)2.905 E
+F3(name)2.815 E F1 .056(is an alias, shell r)2.905 F .056(eserved wor)
+-.18 F .056(d, function, builtin, or disk \214le, r)-.18 F(espec-)-.18 E
+(tively)144 196.8 Q 6.635(.I)-1.11 G 4.135(ft)-6.635 G(he)-4.135 E F3
+(name)4.395 E F1 1.635
+(is not found, then nothing is printed, and an exit status of false is)
+4.485 F -.18(re)144 208.8 S 2.522(turned. If).18 F(the)2.523 E F2<ad70>
+2.523 E F1 .023(option is used,)2.523 F F2(type)2.523 E F1 .023
+(either r)2.523 F .023(eturns the name of the disk \214le that would)
+-.18 F 1.086(be executed if)144 220.8 R F3(name)3.846 E F1(wer)3.936 E
+3.586(es)-.18 G 1.086(peci\214ed as a command name, or nothing if)-3.586
+F/F6 10/Courier@0 SF 1.086(type -t name)3.586 F F1 .015(would not r)144
+232.8 R(eturn)-.18 E F3(\214le)2.515 E F1 5.015(.T).35 G(he)-5.015 E F2
+<ad50>2.515 E F1 .015(option for)2.515 F .015(ces a)-.18 F F4 -.666(PA)
+2.515 G(TH)-.162 E F1(sear)2.266 E .016(ch for each)-.18 F F3(name)2.516
+E F1 2.516(,e)C .016(ven if)-2.516 F F6 .016(type -t)2.516 F(name)144
+244.8 Q F1 .645(would not r)3.145 F(eturn)-.18 E F3(\214le)3.145 E F1
+5.645(.I).35 G 3.145(fac)-5.645 G .645(ommand is hashed,)-3.145 F F2
+<ad70>3.145 E F1(and)3.145 E F2<ad50>3.145 E F1 .645
+(print the hashed value,)3.145 F .41
+(not necessarily the \214le that appears \214rst in)144 256.8 R F4 -.666
+(PA)2.911 G(TH)-.162 E F5(.)A F1 .411(If the)4.911 F F2<ad61>2.911 E F1
+.411(option is used,)2.911 F F2(type)2.911 E F1 .411(prints all)2.911 F
+.164(of the places that contain an executable named)144 268.8 R F3(name)
+2.664 E F1 5.164(.T).35 G .164(his includes aliases and functions,)
+-5.164 F .73(if and only if the)144 280.8 R F2<ad70>3.23 E F1 .73
+(option is not also used.)3.23 F .73
+(The table of hashed commands is not con-)5.73 F .498(sulted when using)
+144 292.8 R F2<ad61>2.998 E F1 5.498(.T)C(he)-5.498 E F2<ad66>2.998 E F1
+.498(option suppr)2.998 F .498(esses shell function lookup, as with the)
+-.18 F F2(com-)2.997 E(mand)144 304.8 Q F1(builtin.)4.557 E F2(type)
+7.057 E F1 -.18(re)4.557 G 2.057(turns tr).18 F 2.057
+(ue if any of the ar)-.08 F 2.057(guments ar)-.18 F 4.558(ef)-.18 G
+2.058(ound, false if none ar)-4.558 F(e)-.18 E(found.)144 316.8 Q F2
+(ulimit)108 333.6 Q F1([)2.5 E F2(\255SHacd\215mnpstuv)A F1([)2.5 E F3
+(limit)A F1(]])A(Pr)144 345.6 Q .062(ovides contr)-.18 F .062
+(ol over the r)-.18 F(esour)-.18 E .061
+(ces available to the shell and to pr)-.18 F .061
+(ocesses started by it, on)-.18 F 1.496(systems that allow such contr)
+144 357.6 R 3.996(ol. The)-.18 F F2<ad48>3.997 E F1(and)3.997 E F2<ad53>
+3.997 E F1 1.497(options specify that the har)3.997 F 3.997(do)-.18 G
+3.997(rs)-3.997 G(oft)-3.997 E .884(limit is set for the given r)144
+369.6 R(esour)-.18 E 3.384(ce. A)-.18 F(har)3.384 E 3.384(dl)-.18 G .884
+(imit cannot be incr)-3.384 F .884(eased once it is set; a soft)-.18 F
+.088(limit may be incr)144 381.6 R .088
+(eased up to the value of the har)-.18 F 2.588(dl)-.18 G 2.588(imit. If)
+-2.588 F(neither)2.589 E F2<ad48>2.589 E F1(nor)2.589 E F2<ad53>2.589 E
+F1 .089(is speci\214ed,)2.589 F .163(both the soft and har)144 393.6 R
+2.663(dl)-.18 G .163(imits ar)-2.663 F 2.663(es)-.18 G 2.663(et. The)
+-2.663 F .163(value of)2.663 F F3(limit)2.803 E F1 .162
+(can be a number in the unit speci-)2.933 F .175(\214ed for the r)144
+405.6 R(esour)-.18 E .175(ce or one of the special values)-.18 F F2
+(hard)2.676 E F1(,)A F2(soft)2.676 E F1 2.676(,o)C(r)-2.676 E F2
+(unlimited)2.676 E F1 2.676(,w)C .176(hich stand for)-2.676 F .243
+(the curr)144 417.6 R .243(ent har)-.18 F 2.743(dl)-.18 G .243
+(imit, the curr)-2.743 F .243(ent soft limit, and no limit, r)-.18 F
+(espectively)-.18 E 5.242(.I)-1.11 G(f)-5.242 E F3(limit)2.882 E F1 .242
+(is omitted,)3.012 F .081(the curr)144 429.6 R .081
+(ent value of the soft limit of the r)-.18 F(esour)-.18 E .081
+(ce is printed, unless the)-.18 F F2<ad48>2.581 E F1 .082
+(option is given.)2.582 F .33(When mor)144 441.6 R 2.83(et)-.18 G .33
+(han one r)-2.83 F(esour)-.18 E .329
+(ce is speci\214ed, the limit name and unit ar)-.18 F 2.829(ep)-.18 G
+.329(rinted befor)-2.829 F 2.829(et)-.18 G(he)-2.829 E 2.5(value. Other)
+144 453.6 R(options ar)2.5 E 2.5(ei)-.18 G(nterpr)-2.5 E
+(eted as follows:)-.18 E F2<ad61>144 465.6 Q F1(All curr)24.94 E
+(ent limits ar)-.18 E 2.5(er)-.18 G(eported)-2.68 E F2<ad63>144 477.6 Q
+F1(The maximum size of cor)25.5 E 2.5<658c>-.18 G(les cr)-2.5 E(eated)
+-.18 E F2<ad64>144 489.6 Q F1(The maximum size of a pr)23.83 E
+(ocess's data segment)-.18 E F2<ad66>144 501.6 Q F1
+(The maximum size of \214les cr)26.05 E(eated by the shell)-.18 E F2
+<ad6c>144 513.6 Q F1(The maximum size that may be locked into memory)
+26.61 E F2<ad6d>144 525.6 Q F1(The maximum r)21.05 E(esident set size)
+-.18 E F2<ad6e>144 537.6 Q F1 .958(The maximum number of open \214le de\
+scriptors \(most systems do not allow this)23.83 F(value to be set\))180
+549.6 Q F2<ad70>144 561.6 Q F1
+(The pipe size in 512-byte blocks \(this may not be set\))23.83 E F2
+<ad73>144 573.6 Q F1(The maximum stack size)25.5 E F2<ad74>144 585.6 Q
+F1(The maximum amount of cpu time in seconds)26.61 E F2<ad75>144 597.6 Q
+F1(The maximum number of pr)23.83 E(ocesses available to a single user)
+-.18 E F2<ad76>144 609.6 Q F1
+(The maximum amount of virtual memory available to the shell)24.38 E(If)
+144 626.4 Q F3(limit)4.151 E F1 1.511
+(is given, it is the new value of the speci\214ed r)4.281 F(esour)-.18 E
+1.51(ce \(the)-.18 F F2<ad61>4.01 E F1 1.51(option is display)4.01 F
+4.315(only\). If)144 638.4 R 1.815(no option is given, then)4.315 F F2
+<ad66>4.315 E F1 1.815(is assumed.)4.315 F -.92(Va)6.815 G 1.815
+(lues ar).92 F 4.315(ei)-.18 G 4.315(n1)-4.315 G 1.815(024-byte incr)
+-4.315 F(ements,)-.18 E .973(except for)144 650.4 R F2<ad74>3.473 E F1
+3.473(,w)C .973(hich is in seconds,)-3.473 F F2<ad70>3.473 E F1 3.473
+(,w)C .973(hich is in units of 512-byte blocks, and)-3.473 F F2<ad6e>
+3.473 E F1(and)3.472 E F2<ad75>144 662.4 Q F1 3.517(,w)C 1.017(hich ar)
+-3.517 F 3.517(eu)-.18 G 1.017(nscaled values.)-3.517 F 1.017(The r)
+6.017 F 1.018(eturn status is 0 unless an invalid option or ar)-.18 F
+(gu-)-.18 E(ment is supplied, or an err)144 674.4 Q
+(or occurs while setting a new limit.)-.18 E F2(umask)108 691.2 Q F1([)
+2.5 E F2<ad70>A F1 2.5(][)C F2<ad53>-2.5 E F1 2.5(][)C F3(mode)-2.5 E F1
+(])A .536(The user \214le-cr)144 703.2 R .536(eation mask is set to)-.18
+F F3(mode)3.035 E F1 5.535(.I).35 G(f)-5.535 E F3(mode)3.295 E F1 .535
+(begins with a digit, it is interpr)3.385 F .535(eted as)-.18 F 1.826
+(an octal number; otherwise it is interpr)144 715.2 R 1.827
+(eted as a symbolic mode mask similar to that)-.18 F .951(accepted by)
+144 727.2 R F3(chmod)3.451 E F1 3.451(\(1\). If).33 F F3(mode)3.711 E F1
+.951(is omitted, the curr)3.801 F .95(ent value of the mask is printed.)
+-.18 F(The)5.95 E F0(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)
+-.15 G(mber 27).15 E(18)185.545 E 0 Cg EP
+%%Page: 19 19
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF -.35(BA)72 48 S(SH_B).35 E(UIL)-.1 E 290.48
+(TINS\(1\) B)-.92 F(ASH_B)-.35 E(UIL)-.1 E(TINS\(1\))-.92 E/F1 10
+/Palatino-Bold@0 SF<ad53>144 84 Q/F2 10/Palatino-Roman@0 SF .607(option\
+ causes the mask to be printed in symbolic form; the default output is \
+an octal)3.106 F(number)144 96 Q 6.02(.I)-.74 G 3.52(ft)-6.02 G(he)-3.52
+E F1<ad70>3.52 E F2 1.02(option is supplied, and)3.52 F/F3 10
+/Palatino-Italic@0 SF(mode)3.78 E F2 1.02
+(is omitted, the output is in a form that)3.87 F .236(may be r)144 108 R
+.236(eused as input.)-.18 F .236(The r)5.236 F .237
+(eturn status is 0 if the mode was successfully changed or if)-.18 F(no)
+144 120 Q F3(mode)2.5 E F2(ar)2.5 E
+(gument was supplied, and false otherwise.)-.18 E F1(unalias)108 136.8 Q
+F2<5bad>2.5 E F1(a)A F2 2.5(][)C F3(name)-2.5 E F2(...])2.5 E .719
+(Remove each)144 148.8 R F3(name)3.219 E F2(fr)3.219 E .719
+(om the list of de\214ned aliases.)-.18 F(If)5.719 E F1<ad61>3.219 E F2
+.718(is supplied, all alias de\214nitions)3.218 F(ar)144 160.8 Q 2.5(er)
+-.18 G 2.5(emoved. The)-2.68 F -.18(re)2.5 G(turn value is tr).18 E
+(ue unless a supplied)-.08 E F3(name)2.76 E F2
+(is not a de\214ned alias.)2.85 E F1(unset)108 177.6 Q F2<5bad>2.5 E F1
+(fv)A F2 2.5(][)C F3(name)-2.5 E F2(...])2.5 E 1.61(For each)144 189.6 R
+F3(name)4.11 E F2 4.11(,r).35 G 1.61(emove the corr)-4.29 F 1.61
+(esponding variable or function.)-.18 F 1.61(If no options ar)6.61 F
+4.11(es)-.18 G(up-)-4.11 E .474(plied, or the)144 201.6 R F1<ad76>2.974
+E F2 .473(option is given, each)2.974 F F3(name)3.233 E F2 -.18(re)3.323
+G .473(fers to a shell variable.).18 F .473(Read-only variables)5.473 F
+.48(may not be unset.)144 213.6 R(If)5.48 E F1<ad66>2.98 E F2 .48
+(is specifed, each)2.98 F F3(name)3.24 E F2 -.18(re)3.33 G .48
+(fers to a shell function, and the function).18 F .405
+(de\214nition is r)144 225.6 R 2.905(emoved. Each)-.18 F .405
+(unset variable or function is r)2.905 F .405(emoved fr)-.18 F .405
+(om the envir)-.18 F(onment)-.18 E 1.474(passed to subsequent commands.)
+144 237.6 R 1.475(If any of)6.475 F/F4 9/Palatino-Bold@0 SF(RANDOM)3.975
+E/F5 9/Palatino-Roman@0 SF(,)A F4(SECONDS)3.725 E F5(,)A F4(LINENO)3.725
+E F5(,)A F4(HISTCMD)3.725 E F5(,)A F4(FUNCNAME)144 249.6 Q F5(,)A F4
+(GROUPS)2.804 E F5(,)A F2(or)2.803 E F4(DIRST)3.053 E(ACK)-.828 E F2(ar)
+2.803 E 3.053(eu)-.18 G .553(nset, they lose their special pr)-3.053 F
+.553(operties, even if)-.18 F(they ar)144 261.6 Q 2.5(es)-.18 G
+(ubsequently r)-2.5 E 2.5(eset. The)-.18 F(exit status is tr)2.5 E
+(ue unless a)-.08 E F3(name)2.76 E F2(is r)2.85 E(eadonly)-.18 E(.)-1.11
+E F1(wait)108 278.4 Q F2([)2.5 E F3(n)A F2(])A -.92(Wa)144 290.4 S .298
+(it for the speci\214ed pr).92 F .298(ocess and r)-.18 F .298
+(eturn its termination status.)-.18 F F3(n)5.558 E F2 .298(may be a pr)
+2.878 F .299(ocess ID or)-.18 F 2.799(aj)144 302.4 S .298
+(ob speci\214cation; if a job spec is given, all pr)-2.799 F .298
+(ocesses in that job's pipeline ar)-.18 F 2.798(ew)-.18 G .298
+(aited for)-2.798 F(.)-.74 E(If)144 314.4 Q F3(n)2.78 E F2 .02
+(is not given, all curr)2.6 F .02(ently active child pr)-.18 F .02
+(ocesses ar)-.18 F 2.52(ew)-.18 G .02(aited for)-2.52 F 2.52(,a)-.74 G
+.02(nd the r)-2.52 F .02(eturn status is)-.18 F(zer)144 326.4 Q 3.138
+(o. If)-.18 F F3(n)3.398 E F2 .638(speci\214es a non-existent pr)3.218 F
+.637(ocess or job, the r)-.18 F .637(eturn status is 127.)-.18 F .637
+(Otherwise, the)5.637 F -.18(re)144 338.4 S
+(turn status is the exit status of the last pr).18 E
+(ocess or job waited for)-.18 E(.)-.74 E/F6 10.95/Palatino-Bold@0 SF
+(SEE ALSO)72 355.2 Q F2(bash\(1\), sh\(1\))108 367.2 Q F0
+(GNU Bash-2.05a)72 768 Q(2001 No)126.115 E -.15(ve)-.15 G(mber 27).15 E
+(19)185.545 E 0 Cg EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/faq.headers.mail b/doc/faq.headers.mail
new file mode 100644 (file)
index 0000000..384e8bd
--- /dev/null
@@ -0,0 +1,5 @@
+From: chet@po.cwru.edu (Chet Ramey)
+To: bug-bash@gnu.org
+Subject: BASH Frequently-Asked Questions (FAQ version 3.26)
+Reply-To: chet@po.cwru.edu
+
diff --git a/doc/faq.headers.news b/doc/faq.headers.news
new file mode 100644 (file)
index 0000000..8f3ea62
--- /dev/null
@@ -0,0 +1,9 @@
+Newsgroups: comp.unix.shell,comp.unix.questions
+Distribution: world
+From: chet@po.cwru.edu (Chet Ramey)
+Subject: BASH Frequently-Asked Questions (FAQ version 3.26)
+Organization: Case Western Reserve University
+Summary: A's to Q's about BASH, the Bourne-Again SHell
+Reply-To: chet@po.cwru.edu
+Followup-To: poster
+
diff --git a/doc/faq.headers.news2 b/doc/faq.headers.news2
new file mode 100644 (file)
index 0000000..b7ea5de
--- /dev/null
@@ -0,0 +1,9 @@
+Newsgroups: comp.unix.shell,comp.unix.questions,comp.answers,news.answers
+From: chet@po.cwru.edu (Chet Ramey)
+Subject: [gnu.bash.bug] BASH Frequently-Asked Questions (FAQ version 3.26)
+Organization: Case Western Reserve University
+Summary: A's to Q's about BASH, the Bourne-Again SHell
+Reply-To: chet@po.cwru.edu
+Followup-To: poster
+Approved: news-answers-request@MIT.EDU
+
diff --git a/doc/faq.mail b/doc/faq.mail
new file mode 100644 (file)
index 0000000..9053bc7
--- /dev/null
@@ -0,0 +1,1785 @@
+From: chet@po.cwru.edu (Chet Ramey)
+To: bug-bash@gnu.org
+Subject: BASH Frequently-Asked Questions (FAQ version 3.26)
+Reply-To: chet@po.cwru.edu
+
+Archive-name: unix-faq/shell/bash
+Posting-Frequency: monthly
+Submitted-By: chet@po.cwru.edu (Chet Ramey)
+Last-Modified: Mon Aug 18 13:59:33 EDT 2003
+FAQ-Version: 3.26
+Bash-Version: 2.05b
+URL: ftp://ftp.cwru.edu/pub/bash/FAQ
+Maintainer: chet@po.cwru.edu (Chet Ramey)
+
+This is the Bash FAQ, version 3.26, 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 Shell and Utilities 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?
+E12) Why don't negative offsets in substring expansion work like I expect?
+
+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 Shell and Utilities 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 was originally developed by
+IEEE Working Group 1003.2 (POSIX.2).  Today it has been merged with
+the original 1003.1 Working Group and is maintained by the Austin
+Group (a joint working group of the IEEE, The Open Group and
+ISO/IEC SC22/WG15).  Today the Shell and Utilities are a volume
+within the set of documents that make up IEEE Std 1003.1-2001, and
+thus now the former POSIX.2 (from 1992) is now part of the current
+POSIX.1 standard (POSIX 1003.1-2001). 
+
+The Shell and Utilities volume concentrates on the command
+interpreter interface and utility programs commonly executed from
+the command line or by other programs.  The standard is freely
+available on the web at http://www.UNIX-systems.org/version3/ . 
+Work continues at the Austin Group on maintenance issues; see
+http://www.opengroup.org/austin/ to join the discussions. 
+
+Bash is concerned with the aspects of the shell's behavior defined
+by the POSIX Shell and Utilities volume.  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 not
+devoted to the shell which are commonly (and in some cases must
+be) implemented as builtin commands, such as `read' and `test'. 
+POSIX 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 latest version of the POSIX Shell and Utilities standard is
+available (now updated to the 2003 Edition incorporating the
+Technical Corrigendum 1), as part of the Single UNIX Specification
+Version 3 at
+
+http://www.UNIX-systems.org/version3/
+
+A10)  What is the bash `posix mode'?
+
+Although bash is an implementation of the POSIX 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'.
+
+E12) Why don't negative offsets in substring expansion work like I expect?
+
+When substring expansion of the form ${param:offset[:length} is used,
+an `offset' that evaluates to a number less than zero counts back from
+the end of the expanded value of $param.
+
+When a negative `offset' begins with a minus sign, however, unexpected things
+can happen.  Consider
+
+       a=12345678
+       echo ${a:-4}
+
+intending to print the last four characters of $a.  The problem is that
+${param:-word} already has a well-defined meaning: expand to word if the
+expanded value of param is unset or null, and $param otherwise.
+
+To use negative offsets that begin with a minus sign, separate the
+minus sign and the colon with a space.
+
+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 2003.  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.
diff --git a/doc/faq.news b/doc/faq.news
new file mode 100644 (file)
index 0000000..f5b278b
--- /dev/null
@@ -0,0 +1,1789 @@
+Newsgroups: comp.unix.shell,comp.unix.questions
+Distribution: world
+From: chet@po.cwru.edu (Chet Ramey)
+Subject: BASH Frequently-Asked Questions (FAQ version 3.26)
+Organization: Case Western Reserve University
+Summary: A's to Q's about BASH, the Bourne-Again SHell
+Reply-To: chet@po.cwru.edu
+Followup-To: poster
+
+Archive-name: unix-faq/shell/bash
+Posting-Frequency: monthly
+Submitted-By: chet@po.cwru.edu (Chet Ramey)
+Last-Modified: Mon Aug 18 13:59:33 EDT 2003
+FAQ-Version: 3.26
+Bash-Version: 2.05b
+URL: ftp://ftp.cwru.edu/pub/bash/FAQ
+Maintainer: chet@po.cwru.edu (Chet Ramey)
+
+This is the Bash FAQ, version 3.26, 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 Shell and Utilities 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?
+E12) Why don't negative offsets in substring expansion work like I expect?
+
+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 Shell and Utilities 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 was originally developed by
+IEEE Working Group 1003.2 (POSIX.2).  Today it has been merged with
+the original 1003.1 Working Group and is maintained by the Austin
+Group (a joint working group of the IEEE, The Open Group and
+ISO/IEC SC22/WG15).  Today the Shell and Utilities are a volume
+within the set of documents that make up IEEE Std 1003.1-2001, and
+thus now the former POSIX.2 (from 1992) is now part of the current
+POSIX.1 standard (POSIX 1003.1-2001). 
+
+The Shell and Utilities volume concentrates on the command
+interpreter interface and utility programs commonly executed from
+the command line or by other programs.  The standard is freely
+available on the web at http://www.UNIX-systems.org/version3/ . 
+Work continues at the Austin Group on maintenance issues; see
+http://www.opengroup.org/austin/ to join the discussions. 
+
+Bash is concerned with the aspects of the shell's behavior defined
+by the POSIX Shell and Utilities volume.  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 not
+devoted to the shell which are commonly (and in some cases must
+be) implemented as builtin commands, such as `read' and `test'. 
+POSIX 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 latest version of the POSIX Shell and Utilities standard is
+available (now updated to the 2003 Edition incorporating the
+Technical Corrigendum 1), as part of the Single UNIX Specification
+Version 3 at
+
+http://www.UNIX-systems.org/version3/
+
+A10)  What is the bash `posix mode'?
+
+Although bash is an implementation of the POSIX 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'.
+
+E12) Why don't negative offsets in substring expansion work like I expect?
+
+When substring expansion of the form ${param:offset[:length} is used,
+an `offset' that evaluates to a number less than zero counts back from
+the end of the expanded value of $param.
+
+When a negative `offset' begins with a minus sign, however, unexpected things
+can happen.  Consider
+
+       a=12345678
+       echo ${a:-4}
+
+intending to print the last four characters of $a.  The problem is that
+${param:-word} already has a well-defined meaning: expand to word if the
+expanded value of param is unset or null, and $param otherwise.
+
+To use negative offsets that begin with a minus sign, separate the
+minus sign and the colon with a space.
+
+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 2003.  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.
diff --git a/doc/faq.news2 b/doc/faq.news2
new file mode 100644 (file)
index 0000000..71b8a86
--- /dev/null
@@ -0,0 +1,1789 @@
+Newsgroups: comp.unix.shell,comp.unix.questions,comp.answers,news.answers
+From: chet@po.cwru.edu (Chet Ramey)
+Subject: [gnu.bash.bug] BASH Frequently-Asked Questions (FAQ version 3.26)
+Organization: Case Western Reserve University
+Summary: A's to Q's about BASH, the Bourne-Again SHell
+Reply-To: chet@po.cwru.edu
+Followup-To: poster
+Approved: news-answers-request@MIT.EDU
+
+Archive-name: unix-faq/shell/bash
+Posting-Frequency: monthly
+Submitted-By: chet@po.cwru.edu (Chet Ramey)
+Last-Modified: Mon Aug 18 13:59:33 EDT 2003
+FAQ-Version: 3.26
+Bash-Version: 2.05b
+URL: ftp://ftp.cwru.edu/pub/bash/FAQ
+Maintainer: chet@po.cwru.edu (Chet Ramey)
+
+This is the Bash FAQ, version 3.26, 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 Shell and Utilities 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?
+E12) Why don't negative offsets in substring expansion work like I expect?
+
+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 Shell and Utilities 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 was originally developed by
+IEEE Working Group 1003.2 (POSIX.2).  Today it has been merged with
+the original 1003.1 Working Group and is maintained by the Austin
+Group (a joint working group of the IEEE, The Open Group and
+ISO/IEC SC22/WG15).  Today the Shell and Utilities are a volume
+within the set of documents that make up IEEE Std 1003.1-2001, and
+thus now the former POSIX.2 (from 1992) is now part of the current
+POSIX.1 standard (POSIX 1003.1-2001). 
+
+The Shell and Utilities volume concentrates on the command
+interpreter interface and utility programs commonly executed from
+the command line or by other programs.  The standard is freely
+available on the web at http://www.UNIX-systems.org/version3/ . 
+Work continues at the Austin Group on maintenance issues; see
+http://www.opengroup.org/austin/ to join the discussions. 
+
+Bash is concerned with the aspects of the shell's behavior defined
+by the POSIX Shell and Utilities volume.  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 not
+devoted to the shell which are commonly (and in some cases must
+be) implemented as builtin commands, such as `read' and `test'. 
+POSIX 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 latest version of the POSIX Shell and Utilities standard is
+available (now updated to the 2003 Edition incorporating the
+Technical Corrigendum 1), as part of the Single UNIX Specification
+Version 3 at
+
+http://www.UNIX-systems.org/version3/
+
+A10)  What is the bash `posix mode'?
+
+Although bash is an implementation of the POSIX 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'.
+
+E12) Why don't negative offsets in substring expansion work like I expect?
+
+When substring expansion of the form ${param:offset[:length} is used,
+an `offset' that evaluates to a number less than zero counts back from
+the end of the expanded value of $param.
+
+When a negative `offset' begins with a minus sign, however, unexpected things
+can happen.  Consider
+
+       a=12345678
+       echo ${a:-4}
+
+intending to print the last four characters of $a.  The problem is that
+${param:-word} already has a well-defined meaning: expand to word if the
+expanded value of param is unset or null, and $param otherwise.
+
+To use negative offsets that begin with a minus sign, separate the
+minus sign and the colon with a space.
+
+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 2003.  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.
diff --git a/doc/faq.version b/doc/faq.version
new file mode 100644 (file)
index 0000000..4291708
--- /dev/null
@@ -0,0 +1,9 @@
+Archive-name: unix-faq/shell/bash
+Posting-Frequency: monthly
+Submitted-By: chet@po.cwru.edu (Chet Ramey)
+Last-Modified: Mon Aug 18 13:59:33 EDT 2003
+FAQ-Version: 3.26
+Bash-Version: 2.05b
+URL: ftp://ftp.cwru.edu/pub/bash/FAQ
+Maintainer: chet@po.cwru.edu (Chet Ramey)
+
diff --git a/doc/mkfaqvers b/doc/mkfaqvers
new file mode 100755 (executable)
index 0000000..84bd0d0
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+DATE=`date`
+VERS=`sed -n 's:^.*Bash FAQ, version \([^,]*\),.*$:\1:p' < FAQ`
+BVERS=` sed -n 's:^.*Bash version \(.*\)\.$:\1:p' < FAQ`
+
+sed -e "s!@VERSION@!$VERS!" -e "s!@UPDATED@!$DATE!" -e "s!@BASH_VERSION@!$BVERS!" < $1
+echo ""
diff --git a/doc/mkinstall b/doc/mkinstall
new file mode 100755 (executable)
index 0000000..5af3a70
--- /dev/null
@@ -0,0 +1,43 @@
+#! /bin/sh
+#
+# mkinstall - make the INSTALL file from the `Installing Bash' node of the
+#            texinfo manual
+#
+
+NODE="Installing Bash"
+SUBNODE="Basic Installation"
+TEXI=bashref.texi
+TMPINFO=temp.info
+TMPOUT=INSTALL.tmp
+
+OUT=${1:-INSTALL}
+
+trap 'rm -f $TMPOUT $TMPINFO $OUT; trap '' 0; exit 1' 1 2 3 6 15
+trap 'rm -f $TMPOUT $TMPINFO' 0
+
+# create an info file without paragraph indentation
+makeinfo --no-split -I../lib/readline/doc --paragraph-indent 0 -o $TMPINFO $TEXI
+
+# write out the text from the `Installing Bash' node to INSTALL.tmp
+info --file $TMPINFO --node "$NODE" --subnodes --output $TMPOUT
+
+# remove the info traversal information and the initial menu, and squeeze
+# out multiple consecutive blank lines like `cat -s'
+awk 'BEGIN { printline = 0; newlines = 0; }
+
+/^File: '$TMPINFO'/    { next; }
+
+/^'"$SUBNODE"'/        { printline = 1; }
+
+/^$/                   { if (printline) newlines = 1; next; }
+
+/$/                    { if (printline) {
+                               if (newlines) {
+                                       printf "\n";
+                                       newlines = 0;
+                               }
+                               print $0;
+                         }
+                       }' < $TMPOUT > $OUT
+
+exit 0
diff --git a/doc/mkposix b/doc/mkposix
new file mode 100755 (executable)
index 0000000..7b6a58f
--- /dev/null
@@ -0,0 +1,25 @@
+#! /bin/sh
+#
+# mkposix - make the POSIX.NOTES file from the `Bash POSIX Mode' node
+#          of the texinfo manual
+#
+
+NODE="Bash POSIX Mode"
+TEXI=bashref.texi
+TMPINFO=temp.info
+TMPOUT=POSIX.tmp
+
+OUT=${1:-POSIX}
+
+trap 'rm -f $TMPOUT $TMPINFO $OUT; trap '' 0; exit 1' 1 2 3 6 15
+trap 'rm -f $TMPOUT $TMPINFO' 0
+
+# create an info file without paragraph indentation
+makeinfo --no-split -I../lib/readline/doc --paragraph-indent 0 -o $TMPINFO $TEXI
+
+# write out the text from the `Bash POSIX Mode' node to $TMPOUT
+info --file $TMPINFO --node "$NODE" --subnodes --output $TMPOUT
+
+sed 1,2d < $TMPOUT > $OUT
+
+exit 0
diff --git a/doc/mkrbash b/doc/mkrbash
new file mode 100755 (executable)
index 0000000..4304e63
--- /dev/null
@@ -0,0 +1,25 @@
+#! /bin/sh
+#
+# mkrbash - make the RBASH file from the `The Restricted Shell' node
+#          of the texinfo manual
+#
+
+NODE="The Restricted Shell"
+TEXI=bashref.texi
+TMPINFO=temp.info
+TMPOUT=RBASH.tmp
+
+OUT=${1:-RBASH}
+
+trap 'rm -f $TMPOUT $TMPINFO $OUT; trap '' 0; exit 1' 1 2 3 6 15
+trap 'rm -f $TMPOUT $TMPINFO' 0
+
+# create an info file without paragraph indentation
+makeinfo --no-split -I../lib/readline/doc --paragraph-indent 0 -o $TMPINFO $TEXI
+
+# write out the text from the `The Restricted Shell' node to $TMPOUT
+info --file $TMPINFO --node "$NODE" --subnodes --output $TMPOUT
+
+sed 1,2d < $TMPOUT > $OUT
+
+exit 0
diff --git a/doc/newbash.texi b/doc/newbash.texi
new file mode 100644 (file)
index 0000000..4757c8d
--- /dev/null
@@ -0,0 +1,127 @@
+1\input texinfo @c -*- texinfo -*-
+@c %**start of header
+@setfilename bash.info
+@settitle GNU Bourne Again SHell
+@setchapternewpage odd
+@c %**end of header
+
+@c DON'T RUN FINALOUT YET UNTIL FINAL STAGES
+@ignore
+@iftex
+@finalout
+@end iftex
+@end ignore
+
+@ifinfo
+This file documents the GNU Bourne Again SHell.
+
+Copyright @copyright{} 1992 Free Software Foundation, Inc.
+@end ifinfo
+
+@titlepage
+@sp 10
+@center @titlefont{GNU Bash, the Bourne Again SHell}
+@center Unproofed Draft
+@sp 10
+@center Brian Fox, Chet Ramey
+@center @today{}
+
+@page
+This document describes GNU Bash, a Bourne shell compatible
+command language interpreter which executes commands read from the
+standard input or from a file.
+
+Published by the Free Software Foundation @*
+675 Massachusetts Avenue, @*
+Cambridge, MA 02139 USA
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1992 Free Software Foundation, Inc.
+@end titlepage
+
+@ifinfo
+This document describes GNU Bash, a Bourne shell compatible
+command language interpreter which executes commands read from the
+standard input or from a file.
+
+Published by the Free Software Foundation @*
+675 Massachusetts Avenue, @*
+Cambridge, MA 02139 USA
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+@end ignore
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end ifinfo
+
+I   Tutorial
+    i   Describe what Bash does.
+       1) What a shell is for.
+       2) How Bash is different from other shells.
+
+    ii  Superficial description of how the shell works.
+       1) Parts of a command.
+          a) Command words.
+          b) Command separators.
+          c) Redirection words.
+
+    iii Hands on Experience.
+       1) Starting a shell.
+          a) startup files.
+          b) switching from Csh.
+             Using alias.conv
+
+       2) The Environment.
+          a) Description of "environment".
+          b) Some important environment variables.
+          c) Other common environment variables.
+
+       3) Issuing command lines.
+          a) Example
+II  Reference
+    i   Shell Syntax
+       1) Parts of "speech".
+          a) Command Words.
+          b) Command Seprators.
+          c) Redirection Words.
+
+       2) Quoting Syntax.
+       3) Common Idioms.
+
+    ii  Guide by feature.
+       1) Builtins.
+       2) Variables.
+    ii  Guide by task.
+
+III Indices
+    i 
diff --git a/doc/old-faq.html b/doc/old-faq.html
new file mode 100644 (file)
index 0000000..a069ca2
--- /dev/null
@@ -0,0 +1,778 @@
+From J.J.Troup@dcsun7.comp.brad.ac.uk Tue Jul  9 11:54:33 1996
+Flags: 10
+Return-Path: J.J.Troup@dcsun7.comp.brad.ac.uk
+Received: from babar.INS.CWRU.Edu (root@babar.INS.CWRU.Edu [129.22.8.213]) by odin.INS.CWRU.Edu with ESMTP (8.6.12+cwru/CWRU-2.2-ins)
+       id LAA05781; Tue, 9 Jul 1996 11:54:32 -0400 (from J.J.Troup@dcsun7.comp.brad.ac.uk for <chet@odin.INS.CWRU.Edu>)
+Received: from dcsun7.comp.brad.ac.uk (dcsun7.comp.brad.ac.uk [143.53.28.202]) by babar.INS.CWRU.Edu with ESMTP (8.6.13+cwru/CWRU-2.4)
+       id LAA12069; Tue, 9 Jul 1996 11:54:03 -0400 (from J.J.Troup@dcsun7.comp.brad.ac.uk for <chet@po.CWRU.Edu>)
+Received: from dcsun4.comp.brad.ac.uk (jjtroup@dcsun4.comp.brad.ac.uk [143.53.28.201]) by dcsun7.comp.brad.ac.uk (8.7.5/8.7.3) with ESMTP id QAA29654 for <chet@po.CWRU.Edu>; Tue, 9 Jul 1996 16:54:06 +0100 (BST)
+Received: (from jjtroup@localhost) by dcsun4.comp.brad.ac.uk (8.7.5/8.7.3) id QAA22933; Tue, 9 Jul 1996 16:53:52 +0100 (BST)
+Date: Tue, 9 Jul 1996 16:53:52 +0100 (BST)
+Message-Id: <199607091553.QAA22933@dcsun4.comp.brad.ac.uk>
+From: JJ TROUP <J.J.Troup@comp.brad.ac.uk>
+To: chet@po.CWRU.Edu
+Subject: Re: Bash FAQ in HTML?
+In-Reply-To: <9607091537.AA05105.SM@odin.INS.CWRU.Edu>
+References: <199607091532.QAA22766@dcsun4.comp.brad.ac.uk>
+       <9607091537.AA05105.SM@odin.INS.CWRU.Edu>
+
+Chet Ramey writes:
+
+> >   Is there a HTML version of the Bash FAQ? If not do you want one?  I
+> > have converted it to HTML and if there isn't already a HTML-ised FAQ,
+> > I wondered if you wanted one?
+> 
+> Sure, send it along.  Thanks.
+
+  Here it is.  It is (with the exception of the <CENTER></CENTER> tags
+at the beginning) clean HTML 2.0.  Although there were a couple of
+places which really warranted tables, I opted for <PRE> instead as
+there is still no text based browser that I know of which fully
+supports tables.
+  If you like it, I would be happy to update as and when the FAQ
+is. If there are bits you don't like please do tell me.  If you don't
+like it at all, that's cool too... :)
+
+
+Regards
+
+Cajun
+
+-------------------------------------------------------------
+              http://www.brad.ac.uk/~jjtroup/
+-------------------------------------------------------------
+
+--++Begin Include++--
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<HTML>
+<HEAD>
+<TITLE>The Bash FAQ</TITLE>
+<LINK REV=MADE HREF="mailto:chet@po.cwru.edu">
+</HEAD>
+<BODY> 
+<CENTER><H1>Bash FAQ</H1></CENTER>
+
+<P>
+This is the Bash FAQ, version 1.5, for Bash version 1.14.6.
+<P>
+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.
+<P>
+Another good source of basic information about shells is the collection of FAQ articles periodically posted to comp.unix.shell.
+<P>
+Questions and comments concerning this document should be sent to <A HREF="mailto:chet@po.cwru.edu">chet@po.cwru.edu</A>.
+<P>
+<H2>Contents:</H2>
+<P>
+<OL>
+<LI><A HREF="bash-faq.html#1">What is it?</A><BR>
+<LI><A HREF="bash-faq.html#2">What's the latest version?</A><BR>
+<LI><A HREF="bash-faq.html#3">Where can I get it?</A><BR>
+<LI><A HREF="bash-faq.html#4">What's the `Posix 1003.2 standard'?</A><BR>
+<LI><A HREF="bash-faq.html#5">On what machines will bash run?</A><BR>
+<LI><A HREF="bash-faq.html#6">How does bash differ from sh, the Bourne shell?</A><BR>
+<LI><A HREF="bash-faq.html#7">How does bash differ from the Korn shell, version ksh88?</A><BR>
+<LI><A HREF="bash-faq.html#8">What is the bash `posix mode'?</A><BR>
+<LI><A HREF="bash-faq.html#9">How can I build bash with gcc?</A><BR>
+<LI><A HREF="bash-faq.html#10">Why does bash run a different version of `command' than `which command' says it will?</A><BR>
+<LI><A HREF="bash-faq.html#11">How can I make my csh aliases work when I convert to bash?</A><BR>
+<LI><A HREF="bash-faq.html#12">Now that I've converted from ksh to bash, are there equivalents to ksh features like autoloaded functions and the `whence' command?</A><BR>
+<LI><A HREF="bash-faq.html#13">Why is the bash builtin `test' slightly different from /bin/test?</A><BR>
+<LI><A HREF="bash-faq.html#14">Why does bash sometimes say `Broken pipe'?</A><BR>
+<LI><A HREF="bash-faq.html#15">How can I get bash to read and display eight-bit characters?</A><BR>
+<LI><A HREF="bash-faq.html#16">Why can't I use command line editing in my `cmdtool'?</A><BR>
+<LI><A HREF="bash-faq.html#17">How do I write a function `x' to replace builtin command `x', but still invoke the command from within the function?</A><BR>
+<LI><A HREF="bash-faq.html#18">When I have terminal escape sequences in my prompt, why does bash wrap lines at the wrong column?</A><BR>
+<LI><A HREF="bash-faq.html#19">I built bash on Solaris 2.  Why do globbing expansions and filename completion chop off the first few characters of each filename?</A><BR>
+<LI><A HREF="bash-faq.html#20">Why doesn't bash treat brace expansions exactly like csh?</A><BR>
+<LI><A HREF="bash-faq.html#21">Why does bash dump core after I interrupt username completion or `~user' tilde expansion on a machine running NIS?</A><BR>
+<LI><A HREF="bash-faq.html#22">I'm running SVR4.2.  Why is the line erased every time I type `@'?</A><BR>
+<LI><A HREF="bash-faq.html#23">How can I find the value of a shell variable whose name is the value of another shell variable?</A><BR>
+<LI><A HREF="bash-faq.html#24">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?</A><BR>
+<LI><A HREF="bash-faq.html#25">I just changed my shell to bash, and now I can't FTP into my machine. Why not?</A><BR>
+<LI><A HREF="bash-faq.html#26">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?</A><BR>
+<LI><A HREF="bash-faq.html#27">Why doesn't bash have csh variable modifiers?</A><BR>
+<LI><A HREF="bash-faq.html#28">Why does bash report syntax errors when my C News scripts use a redirection before a subshell command?</A><BR>
+<LI><A HREF="bash-faq.html#29">How can I pipe standard output and standard error from one command to another, like csh does with `|&'?</A><BR>
+<LI><A HREF="bash-faq.html#30">How do I report bugs in bash, and where should I look for fixes and advice?</A><BR>
+<LI><A HREF="bash-faq.html#31">What kind of bash documentation is there?</A><BR>
+<LI><A HREF="bash-faq.html#32">What's coming in future versions?</A><BR>
+<LI><A HREF="bash-faq.html#33">What's on the bash `wish list'?</A><BR>
+<LI><A HREF="bash-faq.html#34">When will the next release appear?</A><BR>
+</OL>
+
+<H3><A NAME="1">1)  What is it?</A></H3>
+
+<P>
+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.
+<P>
+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.
+<P>
+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.
+
+<H3><A NAME="2">2)  What's the latest version?</A></H3>
+
+<P>
+The latest version is 1.14.6, first made available on December 19, 1995.
+
+<H3><A NAME="3">3)  Where can I get it?</A></H3>
+
+<P>
+Bash is the GNU project's shell, and so is available from the master GNU archive site, prep.ai.mit.edu, and its mirrors.  The latest version is also available for FTP from slc2.ins.cwru.edu, the maintainer's machine.  The following URLs tell how to get version 1.14.6:
+<P>
+
+<UL>
+<LI><A HREF="ftp://prep.ai.mit.edu/pub/gnu/bash-1.14.6.tar.gz">ftp://prep.ai.mit.edu/pub/gnu/bash-1.14.6.tar.gz</A>
+<LI><A HREF="ftp://slc2.ins.cwru.edu/pub/dist/bash-1.14.6.tar.gz">ftp://slc2.ins.cwru.edu/pub/dist/bash-1.14.6.tar.gz</A>
+</UL>
+
+<H3><A NAME="4">4)  What's the `Posix 1003.2 standard'?</A></H3>
+
+<P>
+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. 
+<P>
+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. 
+<P>
+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. 
+<P>
+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.
+
+<H3><A NAME="5">5)  On what machines will bash run?</A></H3>
+
+<P>
+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 `make'.  The build process will attempt to discover the version of UNIX you have and tailor itself accordingly, using a combination of saved definitions in the file `machines.h' and a file `sysdefs.h' created by inspecting the environment for various things. 
+<P>
+More information appears in the file `INSTALL' in the distribution.
+
+<H3><A NAME="6">6)  How does bash differ from sh, the Bourne shell?</A></H3>
+
+<P>
+This is a non-comprehensive list of features that differentiate bash
+from the SVR4 shell.  The bash manual page explains these completely.
+<P>
+
+<H4>Things bash has that sh does not:</H4>
+
+<UL>
+<LI>long invocation options
+<LI>`!' reserved word to invert pipeline return value
+<LI>the select compound command
+<LI>the $(...) form of command substitution
+<LI>the ${#param} parameter value length operator
+<LI>expansions to perform substring removal (${p%[%]w}, ${p#[#]w})
+<LI>variables: BASH, BASH_VERSION, UID, EUID, REPLY, PPID, PWD, OLDPWD, SHLVL, RANDOM, SECONDS, LINENO, HISTCMD, HOSTTYPE, OSTYPE, ENV, MAIL_WARNING, PS3, PS4, HISTSIZE, HISTFILE, HISTFILESIZE, PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC, HISTCONTROL, command_oriented_history, allow_null_glob_expansion, glob_dot_filenames, histchars, nolinks, auto_resume, HOSTFILE, noclobber, TMOUT, no_exit_on_failed_exec, cdable_vars, notify, OPTERR
+<LI>redirections: &lt;&gt;, &amp;&gt;, &gt;|
+<LI>prompt string special char translation and variable expansion
+<LI>auto-export of modified values of variables in initial environment
+<LI>command search finds functions before builtins
+<LI>bash return builtin will exit a file sourced with `.'
+<LI>builtins: cd -, exec -, echo -e/-E, export -n/-f/-p/name=value, pwd -P, read -r, readonly -f, trap -l, ulimit -n/-p/-u, set -b/-m/-o option/-p/-l/-d/-C/-H/-P, unset -f/-v, umask -S, type -all/-path/-type, suspend -f, kill -s
+<LI>bash reads ~/.bashrc for interactive shells, $ENV for non-interactive
+<LI>bash restricted shell mode is more extensive
+<LI>bash allows functions and variables with the same name
+<LI>brace expansion
+<LI>tilde expansion
+<LI>arithmetic expansion and `let' builtin
+<LI>process substitution
+<LI>aliases and alias/unalias builtins
+<LI>local variables in functions and `local' builtin
+<LI>readline and command-line editing
+<LI>history and history/fc builtins
+<LI>csh-like history expansion
+<LI>other new bash builtins: bind, command, builtin, declare/typeset, dirs, enable, fc, help, history, logout, popd, pushd
+<LI>exported functions
+<LI>filename generation when using output redirection (command &gt;a*)
+</UL>
+
+<H4>Things sh has that bash does not:</H4>
+
+<UL>
+<LI>uses variable SHACCT to do shell accounting
+<LI>includes `stop' builtin (bash can use alias stop='kill -s STOP')
+<LI>`newgrp' builtin
+<LI>turns on job control if called as `jsh'
+<LI>ulimit attempts to set both soft &amp; hard limits if -S/-H not given
+</UL>
+
+<H4>New things in the SVR4.2 sh:</H4>
+
+<UL>
+<LI>internationalization: $LANG, $LC_CTYPE, $LC_MESSAGES, setlocale, etc.
+<LI>$TIMEOUT (like bash $TMOUT)
+<LI>new builtins: mldmode, priv
+<LI>`read' builtin has -r
+<LI>kill -s is present
+</UL>
+  
+<H4>Implementation differences:</H4>
+
+<UL>
+<LI>redirection to/from compound commands causes sh to create a subshell
+<LI>bash does not allow unbalanced quotes; sh silently inserts them at EOF
+<LI>bash does not mess with signal 11
+<LI>sh sets (euid, egid) to (uid, gid) if -p not supplied and uid &lt; 100
+<LI>bash splits only the results of expansions on IFS
+<LI>sh does not allow MAILCHECK to be unset (?)
+<LI>sh does not allow traps on SIGALRM or SIGCHLD
+</UL>
+
+<H3><A NAME="7">7)  How does bash differ from the Korn shell, version ksh88?</A></H3>
+
+<H4>Things bash has or uses that ksh88 does not:</H4>
+
+<UL>
+<LI>long invocation options
+<LI>`!' reserved word
+<LI>posix mode and posix conformance
+<LI>command hashing
+<LI>tilde expansion for assignment statements that look like $PATH
+<LI>process substitution with named pipes if /dev/fd is not available
+<LI>variables: BASH, BASH_VERSION, UID, EUID, SHLVL, HISTCMD, HOSTTYPE, OSTYPE, MAIL_WARNING, HISTFILESIZE, OPTERR, PROMPT_COMMAND, IGNOREEOF, FIGNORE, INPUTRC, HISTCONTROL, notify, command_oriented_history, glob_dot_filenames, allow_null_glob_expansion, histchars, nolinks, HOSTFILE, noclobber, auto_resume, no_exit_on_failed_exec, cdable_vars
+<LI>prompt expansion with backslash escapes and command substitution
+<LI>redirection: &amp;&gt; (stdout and stderr)
+<LI>more extensive and extensible editing and completion
+<LI>builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable, exec -, fc -s, export -n/-f/-p, hash, help, history, jobs -x, kill -s, local, logout, popd, pushd, readonly -n/-f/-p, set -o braceexpand/-o histexpand/-o interactive-comments/-o notify/-o physical/-o posix/-l/-d/-C/-b/-H/-P, suspend, trap -l, type, ulimit -u, umask -S
+<LI>$[...] synonym for $((...))
+<LI>`!' csh-style history expansion
+</UL>
+
+<H4>Things ksh88 has or uses that bash does not:</H4>
+
+<UL>
+<LI>new version of test: [[...]]
+<LI>((...)) equivalent to let "..."
+<LI>time keyword to let pipelines be timed
+<LI>tracked aliases
+<LI>$(&lt;file)        
+<LI>one-dimensional arrays and appropriate expansions
+<LI>variables: ERRNO, FPATH, COLUMNS, LINES, EDITOR, VISUAL
+<LI>extended pattern matching with egrep-style pattern lists
+<LI>co-processes (|&amp;, &gt;&amp;p, &lt;&amp;p)
+<LI>weirdly-scoped functions
+<LI>typeset +f to list all function names without definitions
+<LI>text of command history kept in a file, not memory
+<LI>builtins: alias -x, cd old new, fc -e -, newgrp, print, read -p/-s/u/var?prompt, set -A/-o gmacs/-o keyword/-o bgnice/-o markdirs/-o nolog/-o trackall/-o viraw/-s, typeset -H/-L/-R/-A/-ft/-fu/-fx/-l/-u/-t, whence
+</UL>
+  
+<H4>Implementation differences:</H4>
+
+<UL>
+<LI>ksh runs last command of a pipeline in parent shell context
+<LI>ksh ulimit sets hard and soft limits by default
+<LI>bash has brace expansion by default
+<LI>bash has fixed startup file for all interactive shells; ksh reads $ENV
+<LI>bash has exported functions
+<LI>bash command search finds functions before builtins
+</UL>
+  
+<H3><A NAME="8">8)  What is the bash `posix mode'?</A></H3>
+
+<P>
+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.
+<P>
+Posix mode is entered by starting bash with the -posix option or executing `set -o posix' after bash is running.
+<P>
+The specific aspects of bash which change when posix mode is active are listed in the file CWRU/POSIX.NOTES in the bash distribution. 
+
+<H3><A NAME="9">9) How can I build bash with gcc?</A></H3>
+
+<P>
+Type
+<BR>
+<PRE>
+       make CC=gcc CPPNAME='$(CC) -E'
+</PRE>
+
+<H3><A NAME="10">10) Why does bash run a different version of `command' than `which command' says it will?</A></H3>
+
+<P>
+`which' is actually a csh script that assumes you're running csh. It 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. 
+
+<H3><A NAME="11">11) How can I make my csh aliases work when I convert to bash?</A></H3>
+
+<P>
+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/alias-conv.sh.  Here is how you use it:
+<P>  
+Start csh in the normal way for you.  (e.g., `csh')
+<P>
+Pipe the output of `alias' through `alias-conv.sh', saving the results into `bash_aliases':
+<BR>
+<PRE>
+       alias | alias-conv.sh &gt;bash_aliases
+</PRE>
+<P>
+Edit `bash_aliases', carefully reading through any created functions.  You will need to change the names of csh specific variables (like $cwd) to the bash equivalents (like $PWD).  You will also need to remove recursive references to commands which are defined as functions.  For example, the csh alias:
+<BR>
+<PRE>
+       alias cd 'cd \!*;echo $cwd'
+</PRE>
+<P>
+is converted to the bash function:
+<BR>
+<PRE>
+       cd () 
+       { 
+               cd $*;
+               echo $cwd
+       }
+</PRE>
+<P>
+This function contains a self-pointing reference to `cd', which should be changed to use the `builtin' version.  It also uses the csh variable `$cwd' which has an equivalent in bash.  You should also change $* to "$@" to correctly process directory names with embedded spaces.  Precede the recursive reference with the word `builtin', change the name of the variable to the one bash uses, and quote it to avoid any unwanted expansion:
+<BR>
+<PRE>
+       cd () { builtin cd "$@"; echo "$PWD"; }
+</PRE>
+<P>
+Merge the edited file into your ~/.bashrc.
+
+<H3><A NAME="12">12) Now that I've converted from ksh to bash, are there equivalents to ksh features like autoloaded functions and the `whence' command?</A></H3>
+
+<P>
+There are features in ksh-88 that do not have direct bash equivalents. Most, however, can be emulated with very little trouble.
+<BR>
+<PRE>
+ksh-88 feature         Bash equivalent
+--------------         ---------------
+[[...]]                        can usually use [...]; minor differences
+compiled-in aliases    set up aliases in .bashrc; some ksh aliases are
+                       bash builtins (hash, history, type)
+$(&lt;file)            $(cat file)
+arrays                 no good subsitute yet
+((...))                        let "..."
+time                   use external command; GNU time is particularly useful
+                       use time bash -c '...' for complicated constructs
+extended patterns      no good substitute
+coprocesses            named pipe pairs (one for read, one for write)
+typeset +f             declare -f |
+                            sed -n 's:^declare -[a-z]* \([^ ]*\).*$:\1:p'
+cd, print, whence      function subsitutes in examples/functions/kshenv
+autoloaded functions   examples/functions/autoload is the same as typeset -fu
+read var?prompt                [ -t 0 ] &amp;&amp; echo -n prompt &gt;&amp;2; read var
+</PRE>
+
+<H3><A NAME="13">13) Why is the bash builtin `test' slightly different from /bin/test?</A></H3>
+
+<P>
+The specific example used here is [ ! x -o x ], which is false.
+<P>
+Bash's builtin `test' implements the Posix.2 spec, which can be summarized as follows (the wording is due to David Korn):
+<P>
+Here is the set of rules for processing test arguments.
+<BR>
+<PRE>
+    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
+           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).
+</PRE>
+<P>
+The operators -a and -o are considered binary operators for the purpose of the 3 Arg case.
+<P>
+As you can see, the test becomes (not (x or x)), which is false.
+
+<H3><A NAME="14">14) Why does bash sometimes say `Broken pipe'?</A></H3>
+
+<P>
+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:
+<BR>
+<PRE>
+      ps -aux | head
+</PRE>
+<P>
+`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. 
+
+<H3><A NAME="15">15) How can I get bash to read and display eight-bit characters?</A></H3>
+
+<P>
+This is a process requiring several steps.
+<P>
+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'.
+<P>
+Once you have set up an eight-bit path, you must tell the kernel and tty driver to leave the eigth bit of characters alone when processing keyboard input.  Use `stty' to do this:
+<BR>
+<PRE>
+       stty cs8 -istrip -parenb
+</PRE>
+<P>
+For old BSD-style systems, you can use
+<BR>
+<PRE>
+        stty pass8
+</PRE>
+<P>
+You may also need
+<BR>
+<PRE>
+       stty even odd
+</PRE>
+<P>
+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':
+<BR>
+<PRE>
+       bash$ bind 'set convert-meta off'
+       bash$ bind 'set meta-flag on'
+       bash$ bind 'set output-meta on'
+</PRE>
+<P>
+The `set' commands between the single quotes may also be placed in ~/.inputrc.
+
+<H3><A NAME="16">16) Why can't I use command line editing in my `cmdtool'?</A></H3>
+
+<P>
+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.
+<P>
+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. 
+<P>
+`xterm' is a better choice, and gets along with bash much more smoothly.
+<P>
+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.
+<BR>
+<PRE>
+TERMCAP='Mu|sun-cmd:am:bs:km:pt:li#34:co#80:cl=^L:ce=\E[K:cd=\E[J:rs=\E[s:'
+</PRE>
+<P>
+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.
+
+<H3><A NAME="17">17) How do I write a function `x' to replace builtin command `x', but still invoke the command from within the function?</A></H3>
+
+<P>
+This is what the `command' and `builtin' builtins are for.  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. 
+<P>
+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:
+<BR>
+<PRE>
+       cd()
+       {
+               builtin cd "$@" &amp;&amp; xtitle "$HOST: $PWD"
+       }
+</PRE>
+<P>
+This could also be written using `command' instead of `builtin'; the version above is marginally more efficient. 
+
+<H3><A NAME="18">18) When I have terminal escape sequences in my prompt, why does bash wrap lines at the wrong column?</A></H3>
+
+<P>
+Bash 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.
+<P>
+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. 
+<P>
+Use the \[ escape to begin a sequence of non-printing characters, and the \] escape to signal the end of such a sequence. 
+
+<H3><A NAME="19">19) I built bash on Solaris 2.  Why do globbing expansions and filename completion chop off the first few characters of each filename?</A></H3>
+
+<P>
+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. 
+<P>
+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').
+<P>
+Make sure you've got /usr/ccs/bin ahead of /usr/ucb in your $PATH when 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.
+<P>
+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.
+
+<H3><A NAME="20">20) Why doesn't bash treat brace expansions exactly like csh?</A></H3>
+
+<P>
+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. 
+<P>
+Bash, ksh, zsh, and pd-ksh all implement brace expansion this way. 
+
+<H3><A NAME="21">21) Why does bash dump core after I interrupt username completion or `~user' tilde expansion on a machine running NIS?</A></H3>
+
+<P>
+This is a famous and long-standing bug in the SunOS YP (sorry, NIS) client library, which is part of libc.
+<P>
+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. 
+<P>
+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. 
+<P>
+The traditional Unix mallocs allow memory to be freed multiple times; that's probably why this has never been fixed.  You can probably stop it by adding an #undef USE_GNU_MALLOC to the appropriate machine description in machines.h. 
+
+<H3><A NAME="22">22) I'm running SVR4.2.  Why is the line erased every time I type `@'?</A></H3>
+
+<P>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
+<BR>
+<PRE>
+       stty kill ^U
+</PRE>
+<P>
+where the `^' and `U' can be two separate characters.
+
+<H3><A NAME="23">23) How can I find the value of a shell variable whose name is the value of another shell variable?</A></H3>
+
+<P>
+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.
+<P>
+For example, this expression prints the value of the last positional parameter:
+<BR>
+<PRE>
+       eval echo \"\$\{$#\}\"
+</PRE>
+<P>
+The expansion of the quoted portions of this expression will be deferred until `eval' runs, while the `$#' will be expanded before `eval' is executed. 
+
+<H3><A NAME="24">24) 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?</A></H3>
+
+<P>
+This has to do with the parent-child relationship between Unix processes. 
+<P>
+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. 
+<P>
+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:
+<BR>
+<PRE>
+       grep ^gnu /usr/lib/news/active | wc -l | read ngroup
+</PRE>
+<P>
+can be converted into
+<BR>
+<PRE>
+       ngroup=$(grep ^gnu /usr/lib/news/active | wc -l)
+</PRE>
+<P>
+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.
+<P>
+Say /usr/local/bin/ipaddr is the following shell script:
+<BR>
+<PRE>
+#! /bin/sh
+host `hostname` | awk '/address/ {print $NF}'
+</PRE>
+<P>
+Instead of using
+<BR>
+<PRE>
+       /usr/local/bin/ipaddr | read A B C D
+</PRE>
+<P>
+to break the local machine's IP address into separate octets, use
+<BR>
+<PRE>
+       OIFS="$IFS"
+       IFS=.
+       set -- $(/usr/local/bin/ipaddr)
+       IFS="$OIFS"
+       A="$1" B="$2" C="$3" D="$4"
+</PRE>
+<P>
+Beware, however, that this will change the shell's positional parameters.  If you need them, you should save them before doing this.
+<P>
+This is the general approach -- in most cases you will not need to set $IFS to a different value.
+
+<H3><A NAME="25">25) I just changed my shell to bash, and now I can't FTP into my machine. Why not?</A></H3>
+
+<P>
+You must add the full pathname to bash to the file /etc/shells. Many versions of ftpd use this file to prohibit `special' users such as `uucp' and `news' from using FTP. 
+
+<H3><A NAME="26">26) 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?</A></H3>
+
+<P>
+This is the behavior of echo on most Unix System V machines.
+<P>
+The bash builtin `echo' is modelled 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. 
+<P>
+There is a compile-time option that will make bash behave like the System V echo and interpret things like \t by default.  Change config.h so that DEFAULT_ECHO_TO_USG is defined, remove builtins/libbuiltins.a and builtins/echo.o, and rebuild.
+
+<H3><A NAME="27">27) Why doesn't bash have csh variable modifiers?</A></H3>
+
+<P>
+Posix has specified a more powerful, albeit somewhat more confusing, mechanism cribbed from ksh, and bash implements it.
+
+<DL>
+<DT>${parameter%word}
+<DD>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.
+<PRE>
+        x=file.c
+        echo ${x%.c}.o
+        --&gt;file.o
+</PRE>
+<BR>
+     
+<DT>${parameter%%word}
+<DD>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.
+<PRE>
+        x=posix/src/std
+        echo ${x%%/*}
+        --&gt;posix
+</PRE>
+<BR>
+     
+<DT>${parameter#word}
+<DD>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.
+<PRE>
+        x=$HOME/src/cmd
+        echo ${x#$HOME}
+        --&gt;/src/cmd
+</PRE>
+<BR>
+
+<DT>${parameter##word}
+<DD>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.
+<BR>
+<PRE>
+        x=/one/two/three
+        echo ${x##*/}
+        --&gt;three
+</PRE>
+<BR>
+</DL>
+<P>
+Given
+<BR>
+<PRE>
+        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
+</PRE>
+
+<H3><A NAME="28">28) Why does bash report syntax errors when my C News scripts use a redirection before a subshell command?</A></H3>
+
+<P>
+The actual command in question is something like
+<BR>
+<PRE>
+       &lt; file ( command )
+</PRE>
+<P>
+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.
+<P>
+The file CWRU/sh-redir-hack in the 1.14.6 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.
+
+<H3><A NAME="29">29) How can I pipe standard output and standard error from one command to another, like csh does with `|&amp;'?</A></H3>
+
+<P>
+Use
+<BR>
+<PRE>
+       command 2&gt;&amp;1 | command2
+</PRE>
+<P>
+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.
+
+<H3><A NAME="30">30) How do I report bugs in bash, and where should I look for fixes and advice?</A></H3>
+
+<P>
+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.
+<P>
+`bashbug' sends its reports to <A HREF="mailto:bug-bash@prep.ai.mit.edu">bug-bash@prep.ai.mit.edu</A>, which is a large mailing list gatewayed to the usenet newsgroup <A HREF="news:gnu.bash.bug">gnu.bash.bug</A>. 
+<P>
+Bug fixes, answers to questions, and announcements of new releases are all posted to <A HREF="news:gnu.bash.bug">gnu.bash.bug</A>.  Discussions concerning bash features and problems also take place there.
+<P>
+To reach the bash maintainers directly, send mail to <A HREF="mailto:bash-maintainers@prep.ai.mit.edu">bash-maintainers@prep.ai.mit.edu</A>.
+
+<H3><A NAME="31">31) What kind of bash documentation is there?</A></H3>
+
+<P>First, look in the documentation directory in the bash distribution. It should contain the following files:
+<P>
+
+<UL>
+<LI>bash.1 - an extensive, thorough Unix-style manual page
+<LI>builtins.1 - a manual page covering just bash builtin commands
+<LI>features.texi - a Gnu-style info file overview
+<LI>FAQ        - this file
+<LI>article.ms - text of an article written for The Linux Journal
+<LI>readline.3 - a man page describing readline
+</UL>
+
+<P>
+Postscript files created from the above source are also present in the distribution.
+<P>
+There is additional documentation available for <A HREF="ftp://slc2.ins.cwru.edu/pub/bash/">anonymous FTP from host slc2.ins.cwru.edu</A> in the `pub/bash' directory.
+<P>
+Cameron Newham has written a book on bash, published by O'Reilly and Associates.  The title is ``Learning the Bash Shell''.  The ISBN number s 1-56592-147-X.  Look for it in fine bookstores near you.
+
+<H3><A NAME="32">32) What's coming in future versions?</A></H3>
+
+<P>
+There will be no new features in future releases of version 1.14.
+<P>
+The next major release, bash-2.0, will contain extensive changes and new features.  Here's a short list:
+<P>
+
+<UL>
+<LI>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
+<LI>new expansions to do ANSI-C string expansion, locale-specific string translation, substring extraction, pattern replacement, and indirect variable expansion
+<LI>new builtins: `disown' and `shopt'
+<LI>new variables: HISTIGNORE, SHELLOPTS, PIPESTATUS, DIRSTACK, GLOBIGNORE
+<LI>special handling of many unused or redundant variables removed (e.g., $notify, $glob_dot_filenames, $no_exit_on_failed_exec)
+<LI>dynamic loading of new builtin commands; many loadable examples provided
+<LI>new prompt expansions: \e, \n, \H, \T, \@, \v, \V
+<LI>history and aliases available in shell scripts
+<LI>new readline variables: enable-keypad, mark-directories, input-meta, visible-stats
+<LI>new readline commands to manipulate the mark and operate on the region
+<LI>new readline emacs mode commands and bindings for ksh-88 compatibility
+<LI>updated and extended builtins
+<LI>new DEBUG trap
+<LI>expanded (and now documented) restricted shell mode
+<LI>the `time' reserved word to time pipelines, shell builtins, and shell functions
+</UL>
+
+<H4>implementation stuff:</H4>
+
+<UL>
+<LI>autoconf-based configuration
+<LI>nearly all of the bugs reported since version 1.14 have been fixed
+<LI>most builtins converted to use builtin `getopt' for consistency
+<LI>most builtins use -p option to display output in a reusable form (for consistency)
+<LI>grammar tighter and smaller (66 reduce-reduce conflicts gone)
+<LI>lots of code now smaller and faster
+<LI>test suite greatly expanded
+</UL>
+
+<H3><A NAME="33">33) What's on the bash `wish list' for future versions?</A></H3>
+
+<UL>
+<LI>Programmable completion a la zsh
+<LI>menu completion a la tcsh
+<LI>the ksh egrep-style extended pattern matching operators
+<LI>associative arrays (not really all that hard)
+<LI>breaking some of the shell functionality into embeddable libraries
+<LI>better internationalization using GNU `gettext'
+<LI>an option to use external files for the long `help' text
+<LI>a bash debugger
+</UL>
+
+<P>
+Much of this will not be in bash-2.0.
+
+<H3><A NAME="34">34) When will the next release appear?</A></H3>
+
+<P>
+Version 1.14.6 will probably be the last release for version 1.14.
+<P>
+The next version will appear sometime in 1996.  Never make predictions.
+<P>
+
+<HR>
+<BR>
+
+This document is Copyright 1995, 1996 by Chester Ramey.
+<P>
+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.
+<P>
+--
+<BR>
+``The lyf so short, the craft so long to lerne.'' - Chaucer
+<BR>
+Chet Ramey, Case Western Reserve University - Internet: <A HREF="mailto:chet@po.cwru.edu">chet@po.CWRU.Edu</A>
+
+</BODY>
+</HTML>
+
+
+
+--++ End Include ++--
+
diff --git a/doc/oldbash.texi b/doc/oldbash.texi
new file mode 100644 (file)
index 0000000..b8e9a86
--- /dev/null
@@ -0,0 +1,9291 @@
+\input texinfo @c -*- texinfo -*-
+@c %**start of header
+@setfilename bash.info
+@settitle GNU Bourne Again SHell
+@setchapternewpage odd
+@c %**end of header
+
+@ignore
+**EXPLANATION OF COMMENTS IN FILE**
+All comments, which start with @c, are by Julie Sussman
+(jems@zurich.ai.mit.edu).
+If a comment has someone else's name or initials in it, it is still
+by me (Julie), but is a note on something that person told me.
+@end ignore
+
+@ignore
+**TO DO**
+Update all nodes
+Update all menus for Info.  They don't match current manual.
+Fix the cross references -- too many have abbreviated node names.
+Fix/redo/complete the indexing.
+  Separate index for commands, vars, etc. (separate from concepts)
+Use group/end group around examples to prevent bad page breaks.
+@end ignore
+
+@ignore
+JEFF KELLEM'S MISC. COMMENTS
+* add a glossary
+* below are some additions/changes that are being considered for final
+  1.06 release -- there are probably others; these are off the top of my
+  head 
+  * check on `-' arg to cd to swap $PWD and $OLDPWD
+  * `+' option to `set' to list all var names w/o their values (`set +')
+  * `set --' will unset the positional params if no other args are given ?
+  * -r option to read
+  * -p flag of jobs to list PIDs only (posix.2a)
+  * job_spec args to jobs (posix.2a)
+  * shell error msgs may now have `bash: ' as a prefix  (will have to chk
+    if Brian decided to bless it)
+@end ignore
+
+@c DON'T RUN FINALOUT YET UNTIL FINAL STAGES
+@ignore
+@iftex
+@finalout
+@end iftex
+@end ignore
+
+@ifinfo
+This file documents the GNU Bourne Again SHell.
+
+Copyright @copyright{} 1989, 1990 Free Software Foundation, Inc.
+@end ifinfo
+
+@titlepage
+@sp 10
+@center @titlefont{Bourne Again SHell}
+@center Unproofed Draft
+@sp 10
+@center Brian Fox, Diane Barlow Close,
+@center Julie Sussman, Chet Ramey,
+@center Richard Stallman
+@center @today{}
+
+@page
+This document describes GNU Bash, a Bourne shell compatible command
+language interpreter which executes commands read from standard input
+or from a file.
+
+Published by the Free Software Foundation @*
+675 Massachusetts Avenue, @*
+Cambridge, MA 02139 USA
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+@end titlepage
+
+@node Top, Thanks, (dir), (dir)
+@unnumbered Preface
+
+This manual introduces the GNU Bourne Again SHell (BASH) and explains
+its role in the operating system.  This manual does not explain the
+fundamentals of using operating system commands such as @code{ls},
+@code{cd}, and others, nor does it explain how to log into your system.
+
+BASH is a command language interpreter that executes commands read from
+the standard input or from a file.  BASH is compatible with the Bourne
+shell (@code{sh}), and also incorporates useful features of the Korn
+shell (@code{ksh}) and the C shell (@code{csh}).  The intention is that
+BASH be a superset of the desirable features found in other shells.
+
+BASH is POSIX compliant.
+
+If you read this manual sequentially, you'll find it leads you through
+the concepts of a shell from its simple beginnings to more complex
+shell features.  If you are familiar with your machine's operating
+system and have some experience with shells, then this manual makes a
+handy reference.
+@c A nice goal would be to make the above paragraph come true
+
+@menu
+* Thanks::           Acknowledgement of those who made it possible.
+
+* License::          GNU licensing information.
+
+* Introduction::     Introduction to shells.
+
+* I/O::              Redirection.  Pipes.
+
+* Line::             Command line syntax.
+
+* File Names::   How the shell interprets your input before
+                     it arrives at other commands.  Wildcard 
+                     characters.
+
+* Job Control::      Controlling when commands are run.
+
+* Editing::          Editing lines that you type, and how to
+                     get at previously typed lines.
+
+* History::          History substitution.
+
+* Aliases::          Substitution of command words.
+
+* Functions::        How to generalize a group of related
+                     commands.
+
+* Programming::      An overview of programming using BASH.
+
+* Scripts::          Writing shell programs with BASH.
+
+* Variables::        Shell variables.
+
+* Environment::      Discovering your shell's environment.
+
+* Conditionals::     Programming using conditional statements.
+
+* Looping::          Programming using looping statements.
+
+* Built-in::         Description of commands that are built into
+                     the shell.
+
+* Install::          Installing BASH.
+
+* Invoke::           Invoking BASH.  Details on signal control in BASH.
+                     Customizing BASH prompts.
+
+* Start-up::         A sample start-up files for BASH.
+
+* Advanced Scripts:: Samples of writing more advanced shell scripts.
+
+* Tools::            Related and useful operating system commands.
+
+* Authors::          Who's responsible for all this.
+
+* Concept Index::    Index of shell concepts.
+
+@end menu
+
+@node Thanks,  , Top, Top
+@unnumberedsec Acknowledgements
+
+Many people need to be thanked for their assistance in producing this
+manual.  Brian and Diane would like to thank Chet Ramey for his
+production of the BASH man page.  It made the job of writing this
+manual infinitely easier.
+
+Robert Chassell gave helpful comments on the drafts of this manual. 
+Allan Painter contributed beginning-user examples.  Bennett Todd
+and Bill Trost contributed very useful samples of shell scripts.  Many
+thanks to all those who submitted scripts for consideration.  It
+was difficult to choose only two for inclusion in this manual; all were
+of very high quality and usefulness.
+
+@node License, Introduction, Top, Top
+@unnumbered License
+
+@node Introduction, Typing Commands, License, Top
+@chapter Introduction to Shells
+@c This chapter needs to be rewritten/replaced
+@ignore
+Some topics:
+ built-in cmds, other cmds, use in examples and doc in manual
+@end ignore
+
+The shell is a program that the operating system automatically starts
+up when you log in, so that the system can understand your commands. 
+@cindex shell, what is a
+@cindex BASH, what is
+@cindex Bourne Again SHell, what is
+
+Here is a brief listing of some of the things that the Bourne Again SHell
+(BASH) provides:
+
+@itemize @bullet
+@item
+a built-in language for writing shell programs
+
+@item
+compatibility with shell programs written for the Bourne shell
+
+@item
+Emacs and vi style command editing
+
+@item
+process and job control
+
+@item
+command aliases
+
+@item
+shell @emph{functions}
+
+@item
+completion of file names, user names, and variable names
+@c  "and other types of completion"  ?? such as what??
+@end itemize
+
+@menu
+* Interpretation::   The Shell as a Command Interpreter.
+
+* Language::         The Shell as a Programming Language.
+
+@end menu
+
+@node Interpretation, Language, Introduction, Introduction
+@section The Shell as a Command Interpreter
+
+When you log on to your system a shell is automatically started for you. 
+Think of the shell as a layer of software between you and the operating
+system's internal workings, as shown below:
+@cindex command interpreter
+@cindex shell, as a command interpreter
+
+@example
+@var{commands} (@r{typed by you}) <------> @var{shell} <-------> @var{operating system}
+@end example
+
+@noindent
+The shell interacts with you, the user, to interpret your commands and
+tell the operating system to take appropriate action.  The shell stays
+with you until you log out.
+
+The input and execution of a simple shell command involves the following
+steps:
+
+@enumerate
+@item
+The shell displays a prompt (@samp{bash$}, unless you have
+specified a different prompt) and waits for you to type a command.
+
+@item
+You type a command line, ending with a carriage return.
+
+@item
+The shell analyzes that command line, and extracts the command name
+and arguments.  Here is a template for a simple shell command, with
+the optional parts between square brackets, @samp{@r{[}@dots{}@r{]}}:
+
+@example
+@var{command} @r{[}@var{arguments}@r{]} @r{[}&@r{]} @key{RET}@refill
+@end example
+
+@noindent
+A simple command line consists of a sequence of words
+separated by blanks (a blank is a space or a tab).  The first word of
+the command line specifies the name of the command to be executed, and the
+remaining words are passed as arguments to that command.
+
+@item
+The shell tries to locate the specified command as a program in the
+directories specified in your path.
+
+@item
+If the shell can't find the command program you requested, it gives you
+an error message and provides a new prompt.
+
+If the shell is successful in locating the requested program, it tells
+the operating system to execute that program using the rest of the
+command line as arguments for that program.
+
+@item
+If you did not end your command line with @samp{&}, the program is run
+in the @dfn{foreground}.  When the program is
+finished, the operating system returns control to the shell and the
+shell gives you another prompt.
+
+If you ended your command line with @samp{&}, the program is run in the
+@dfn{background}.While the program is executing the shell waits.
+The shell doesn't wait for the operating system to
+finish running the program; rather, the shell immediately gives you a prompt so
+you can continue typing commands.  (Running a program in the background
+is useful if the program takes a long time to execute and doesn't need
+supervision.)
+
+@item
+At the new prompt you type in the next command line to be processed
+and run.  These steps are repeated until you log out.
+@end enumerate
+
+@node Language,  , Interpretation, Introduction
+@section The Shell as a Programming Language
+
+BASH has its own built-in, interpreted programming language.
+@cindex shell, as a programming language
+@cindex programming language, features
+
+Some of the programming features available to you are:
+
+@itemize @bullet
+@item
+storage of values in variables
+
+@item
+conditional execution statements
+
+@item
+user-defined functions
+
+@item
+looping and other ways of executing commands repeatedly
+@end itemize
+
+@node Notation
+@section Notation
+
+To indicate special keys or key combinations, this documentation
+uses the following notations:
+@c also explain RET, CTL, DEL, etc.
+
+@table @kbd
+@item C-k
+The text @kbd{C-k} is read as ``Control-K'' and describes the character
+produced when you hold the Control key (@key{CTL}) down and strike the @kbd{k} key.
+
+@item M-k
+The text @kbd{M-k} is read as ``Meta-K'' and describes the character
+produced in either of two ways:
+@itemize @bullet
+Either hold the @key{META} key (if you have one) down and strike the @kbd{k} key
+
+or type @key{ESC} @i{first} and then type @kbd{k}.
+@end itemize
+Either process is known as @dfn{metafying} the @kbd{k} key.
+
+@item M-C-k
+The text @kbd{M-C-k} is read as ``Meta-Control-k'' and describes the
+character produced by metafying @kbd{C-k} (see @kbd{C-k} and @kbd{M-k}
+just above).
+@end table
+
+@node  Typing Commands, I/O, Introduction, Top
+@chapter Typing Commands
+
+@c !! forgot to cover case sensitivity!
+
+This chapter deals with the mechanics of typing commands.
+
+Normally, to give a command you type a line and end it with a newline
+character (usually referred to as @key{RET} in this documentation).
+
+In the following example, BASH displayed its prompt (@samp{bash$ }),
+we typed the command @samp{who} (terminated by a @key{RET}, which is
+not explictly shown in the example), the output of @code{who} (a listing
+of users logged into the system) was displayed, and BASH displayed
+another prompt.
+
+@example
+bash$ who
+glassw   ttyq0   Apr 15 15:09   (worker-8)
+glassw   ttyq1   Apr 15 20:50   (worker-7)
+cqc      ttyq2   Apr 15 18:15   (worker-9)
+zvona    ttyq5   Apr 15 14:13   (nico)
+painter  ttyd0   Apr 15 21:00
+stf      ttyh4   Apr 15 11:58
+sandiway ttyh9   Apr 13 23:05
+pwu      ttyhc   Apr 15 15:19
+bash$
+@end example
+
+The following sections explain more about typing commands, including how
+to correct mistakes as you type a command and how to type a command that
+is too long to fit on one line.
+
+@node Typeahead
+@section Typeahead
+
+Your typing is echoed (displayed on the screen) as you type.
+If you start to type a command before the prompt is displayed,
+your typeahead, which echoes immediately, appears before the
+prompt.  It may even be mixed up with output from the command
+that was executing when you typed it.
+In order that you can see the actual command you have
+typed, BASH redisplays your typeahead after the prompt.
+Don't worry -- though some characters appear on your screen twice,
+BASH has kept only one copy of them.
+
+The following shows the appearance of my screen when I
+typed @samp{date} to find out the current date and time,
+then typed @samp{who} to find out who was logged in.
+I didn't wait for @code{date}'s output before I started to type,
+so the @samp{wh} from @samp{who} appears in that output.
+The next prompt is followed by a redisplay of the @samp{wh}
+I already typed, followed by the final @samp{o}.
+
+@example
+bash$ date
+whFri Jan 04 13:47:49 EST 1991
+bash$ who
+gjs        console      Dec 19 15:53
+wisdom     pty/ttyu0    Dec 27 16:11
+jems       pty/ttyu1    Jan  4 10:56
+bash$
+@end example
+
+@node Editing, Continuation, Typing Commands, Typing Commands
+@section Editing the Command Line
+
+@cindex editing command lines, basic
+
+To correct an error in the line you are typing, you can type @key{DEL}
+repeatedly to delete one character at a time until you are back to the
+spot that needs fixing, then continue typing.  Or you can type @kbd{C-u}
+to delete the whole current line and start over.
+
+However, it is also possible to move the cursor to the place you want to
+change and correct the error without deleting and retyping everything
+you've typed after the error.
+
+You can edit the current line as long as you have not typed the
+@key{RET} that terminates it.
+
+Using the editing keys described below, you move the cursor to the
+place that needs correction and delete or insert the text of the
+correction.  Then, when you are satisfied with the line, you simply
+press @key{RET}.  The cursor doesn't have to be at the end of the line
+when you press @key{RET}; the entire line will be accepted in any case.
+
+As you type text into the line, you'll notice that characters to the
+right of the cursor get pushed over to make room for the
+characters you are typing.  Likewise, when you delete a character
+behind the cursor, characters to the right of the cursor get pulled
+back to fill in the blank space created by the removal of those
+characters.
+
+The rest of this section describes basic command-line editing.
+@xref{Readline Commands}, for a list of all the editing commands.
+
+If you are an Emacs user, you may already be familiar with most of the
+editing keys described below: All but @kbd{C-u} are the same ones used
+in Emacs.
+
+Note: If you don't like any of the editing keys, you can change them
+to be whatever you want (@pxref{Customizing Readline}).
+
+@heading Moving the Cursor
+
+Here are the basic ways to move the cursor within the line you are typing:
+
+@table @kbd
+@item C-b
+Move cursor back (left) one character.
+
+@item C-f
+Move cursor forward (right) one character.
+
+@item M-b
+Move cursor backward (left) one word.
+
+@item M-f
+Move cursor forward (right) one word.
+
+@item C-a
+Move cursor to the start of the line.
+
+@item C-e
+Move cursor to the end of the line.
+@end table
+
+Notice that @kbd{C-f} moves forward a character, while @kbd{M-f}
+moves forward a word.  It is usually the case that Control keystrokes
+act on characters, while Meta keystrokes act on words.
+
+@heading Deleting Text
+
+Here are the basic ways to delete text once you have positioned the cursor:
+
+@table @kbd
+@item C-d
+Delete the character underneath the cursor.
+
+@item @key{DEL}
+Delete the character to the left of the cursor.
+
+@item C-k
+Kill the text from the current cursor position to the end of the line.
+
+@item C-u
+Kill the text from the beginning of the line to the current cursor position.
+(Note that if the cursor is at the end of the line, this kills the whole line.)
+@end table
+@c maybe add M-d, M-DEL (corresponding to C-d, DEL)
+
+@heading Inserting Text
+
+To insert text into the line, just position the cursor and type
+the text as you normally do at the end of a line.
+No special keystroke is needed to indicate that you want to insert.
+
+@heading Clearing the Display
+
+If the screen is cluttered, you may wish to:
+
+@table @kbd
+@item C-l
+Clear the screen, reprinting the current line at the top.
+@end table
+
+@node Typos
+@subsection Failing to Correct a Command Line
+
+If you notice an error while typing a command, it is better to
+fix it (or delete the command and start over) than to let the command
+execute as is, especially if the command contains any punctuation
+characters (many of which have special meaning to the shell).
+Although many sorts of errors will result in perfectly harmless
+(and sometimes even comprehensible) error messages, other erroneous
+commands may do things you didn't intend or give you error messages that only
+a shell wizard can understand.
+For example, if you accidentally hit @samp{*} while typing a file
+name in a command to delete a file, you may end up deleting more
+than one file (@pxref{File Names}).
+
+@node History Use
+@section Repeating Earlier Commands
+
+You can sometimes save typing by retrieving an earlier command.
+You can reexecute the command as is, or you can edit it before
+executing it.
+This is particularly useful if a command gets an error.
+Instead of retyping it with the error corrected, you can
+retrieve the command and just fix the erroneous part.
+
+If you are an Emacs user, you may recognize the following commands
+as the same ones that move to the previous or next line
+or to the beginning or end of an Emacs buffer.
+Think of BASH as maintaining an Emacs buffer of your command
+lines, in which you can see only one line at a time.
+Each time you end a line (by typing @key{RET}), BASH adds
+that line to the end of the buffer and positions its cursor
+at the start of the next line.
+
+@xref{History List}, for a more complete description of what
+commands BASH remembers in its history list.
+
+The rest of this section describes the basic commands for accessing
+previous command lines.
+@xref{History Commands}, for the complete set of commands.
+@c note: the stored line contains the result of history substitutions.
+@c If you typed a ! history reference, the resulting cmd is stored.
+@c because: history subst is before shell sees input
+
+@c Following edited from readline chapter -- may need to change that to
+@c match this.
+
+@table @kbd
+@item C-p
+Get the previous line from the history list.
+(Opposite of @kbd{C-n}.)
+The line is displayed after the prompt as if you had just typed it.
+
+@item C-n
+Get the next line from the history list.
+(Opposite of @kbd{C-p}.)
+The line is displayed after the prompt as if you had just typed it.
+
+@item M-<
+Get the oldest line in the history list.
+(Opposite of @kbd{M->}.)
+The line is displayed after the prompt as if you had just typed it.
+
+@item M->
+Get the most recent line in the history list.
+(Opposite of @kbd{M-<}.)
+This is the line you are typing at the current prompt.
+Unless you type something after the prompt, this line is blank.
+@end table
+
+If you're a BASH novice, it is probably best to start by using
+just @kbd{C-p} and @kbd{C-n}.
+Type @kbd{C-p} repeatedly to move back as far as you want.
+If you overshoot, use @kbd{C-n} to go forward again.
+
+@node Continuation,  , Editing, Typing Commands
+@section Continuing a Command on the Next Line
+
+If you don't have room on the line to finish typing your command,
+type a backslash, @samp{\}, then @key{RET}.
+A @samp{\} at the @emph{end} of a command
+line tells the shell that the command hasn't ended, but is to be
+continued on the next line.
+The shell will give you a secondary prompt (different from the ordinary
+prompt, so you can tell that this is a continuation line), and you can
+continue typing the rest of the command.
+In this way, you can continue a command over any number of lines.
+The command is not executed until the final @key{RET} (that is, a @key{RET}
+not preceded by a @samp{\}) is typed.
+@c But: expansion/substitution take place after each RET -- e.g. !, *, ...
+@c rms: ! is during input processing by history library, * is done by shell
+@c bfox: ! done on each line
+@c   can avoid \ if know what's incomplete
+@c   e.g. things in quotes
+@c   usually only use \ for shell script, don't need interactively
+@c   a) usually type shorter cmds, b) line will wrap
+@c consider moving this? or recommending really for scripts and describing
+@c the default long-line wraparound (with pointer to inputrc for
+@c changing it)
+@cindex long commands
+@cindex continuing command lines
+@cindex command lines, continuing
+@cindex commands longer than 1 line
+
+@c lousy example
+For example, both of the following commands concatenate the files
+@file{file1} through @file{file6} together into a single file
+@file{file1to6}.  In the first sequence, the command is split into two
+lines by ending the first line with a @samp{\}.  BASH prints a secondary
+prompt (@samp{bash>}, unless you have specified a different prompt) to
+signal that it awaits further input for the current command.
+
+@example
+bash$ cat file1 file2 file3 \@key{RET}
+bash>file4 file5 file6 > file1to6@key{RET}
+bash$
+@end example
+
+@noindent
+is equivalent to:
+
+@example
+bash$ cat file1 file2 file3 file4 file5 file6 > file1to6@key{RET}
+bash$
+@end example
+
+Warning:
+@itemize @bullet
+@item
+The @samp{\} must be the last thing on the line that is to be
+continued.  If you accidentally type a space after the @samp{\}, your
+screen will not look any different, but the command line will be
+terminated by the @key{RET} rather than continued.
+
+@item
+The multiple command lines are simply concatenated, with no
+space inserted.  If a space is needed between the last thing you type
+on one line and the first thing you type on the next line, you must
+be sure to include the space yourself (either before the @samp{\}
+that ends the first line or at the start of the next line).
+@end itemize
+
+@heading Editing Earlier Lines
+
+Command-editing (@pxref{Editing}) only works on the current line.
+If you notice while typing a continuation line that you need to correct
+an earlier line of the command, you will need to abort the command
+entry and start over (though you needn't retype everything, if you
+follow the instructions below):
+
+@enumerate
+@item
+To avoid losing the line you are in the midst of typing, end it with
+@kbd{\@key{RET}}.
+
+@item
+Type @kbd{C-c} to abort command entry and get back to the top level of
+BASH.
+
+@item
+The lines you typed but never executed were nonetheless stored
+in the command history list.  Use @kbd{C-p} (@pxref{History Use})
+to retrieve the lines of your multi-line command one at a time.
+Type @key{RET} after each correct line, but when you come to the bad
+line, edit it before typing @key{RET}.
+@end enumerate
+
+@node I/O, File Names, Typing Commands, Top
+@chapter Redirecting Input and Output (Basic)
+
+@cindex redirecting input and output
+You may want to send a program's output to a printer instead
+of to your screen.  Or you may want to use a data file for
+input, instead of typing input at your keyboard.
+
+@cindex redirection operators, versus command arguments
+Many commands
+allow input files and output files to be specified as arguments.
+For commands that don't take such arguments (or whose arguments you
+don't remember), you can use redirection operators, as
+explained in this chapter, to @dfn{redirect} input or output to come
+from or go to a file.
+You can also redirect input or output to come from or go to another
+program, by using @dfn{pipes}.
+
+Redirection is performed by the shell, not by individual command programs.
+The action of the command itself is unchanged by redirection; in
+general, commands are unaware that their input or output has been redirected.
+The command reads its input and writes its output as usual, and that
+input and output automatically come from and go to whatever places the shell has set up.
+This is accomplished as follows.
+
+@cindex standard input
+@cindex standard output
+@cindex standard error
+Most programs that read from or write to the terminal actually
+read their input from an imaginary place called
+@dfn{standard input}, write their ordinary output to an imaginary
+place called @dfn{standard output}, and write their error messages
+to an imaginary place called @dfn{standard error}.
+Before the shell runs the program in a command, it hooks up the
+standard input, standard output, and standard error to real places,
+such as your terminal, a file, or another program's input or output.
+
+The following sections tell you how to specify how these standard
+input and outputs should be hooked up.
+
+@c add a diagram showing standard I/O as sockets with things plugged in?
+
+@heading Redirection versus file arguments
+
+@cindex redirection operators, versus command arguments
+Consult the documentation of the specific command you wish to use to
+see whether you have to use redirection operators in order to make it
+use files.
+File Names as
+arguments are often preferable to redirection operators because they enable
+the command to know the name of the file it is reading.  (A command can
+know its arguments, but is not aware of redirection.)  Also,
+some commands (such as @code{sort})
+can read more than one input file when the files are
+specified as arguments, whereas redirection can only specify a single input
+file.
+@c If file args to cmd are preferable, isn't it bad to use such cmds as
+@c redirection examples?
+@ignore
+rms: better examples: cat, compress
+compress file
+ replaces file with file.Z  and deletes original file
+ option to not delete file
+ If want to redirect output, must redirect input too.
+    compress < f1 > f2
+ Because if there's an arg (file name), compress
+ opens the arg file itself, so redirection is useless.
+ With no arg, it uses streams it's given (by < and >)
+@end ignore
+
+For example, here are two ways to sort the file @file{unsorted}
+to produce the file @file{sorted-file}.
+The first command gives the file names as arguments, with @samp{-o}
+flagging the output file name.
+The second command uses @samp{<} to redirect the input and @samp{>}
+to redirect the output.
+
+@example
+bash$ sort -o sorted-file unsorted
+
+bash$ sort < unsorted > sorted-file
+@end example
+
+@noindent
+However, if you want to combine two input files @file{unsorted-1}
+and @file{unsorted-2} into one sorted output file, you'll have
+to give the input files as arguments, because only one input file
+could be supplied by redirection.  You still have a choice of how to
+specify the output file.
+
+@example
+bash$ sort -o sorted-file unsorted-1 unsorted-2
+
+bash$ sort unsorted-1 unsorted-2 > sorted-file
+@end example
+
+@menu
+* Redirection::        How to redirect standard input and standard
+                       output.
+
+* Other Redirections:: Redirecting standard input and standard output
+                       simultaneously.  Redirecting background
+                       processes.  Redirecting standard error.
+
+* Pipes::              Connecting commands together.
+
+@end menu
+
+@node Redirection, Here-documents, I/O, I/O
+@section Basic Redirection to Files
+
+@c posix 3.7  n op word
+@c  op is:  <  >  >|  >>  <<  <&  >&  <>
+@c  special cases for <&-, >&-, <<-
+
+@cindex redirection operators
+@cindex standard input, redirecting
+@cindex standard output, redirecting
+@cindex standard error, redirecting
+This section shows the basic method for redirecting the standard input,
+standard output, and standard error to files.
+@xref{Advanced Redirection}, for more complicated forms of redirection.
+@c may want appendix that has 1 unified table of operators
+
+In general, a simple redirection of input or output to a file looks like this:
+@c rms: redir op can be among or before args (even before cmd?) [see posix]
+
+@ignore
+@c They were each shown with args, but it's probably better to consider
+@c those as part of the command.  E.g. it was:
+@var{command} @r{[}@var{arguments}@r{]} > @var{file}
+@end ignore
+@example
+@var{command} @var{redirection-operator} @var{file}
+@end example
+@c show syntax for more than 1 redir op in a cmd??
+
+@noindent
+The @var{file} is the file or device you want to use,
+@c note: "file" includes "devices" (such as printers).  Explain somewhere?
+@c Nice thing in Unix is devices are simply files in directory /dev
+and the @var{redirection-operator} is @samp{<} for input; @samp{>}, @samp{>|},
+or @samp{>>} for output; or @samp{>&} for output and error.
+Spaces surrounding the operator are optional, but it is a good idea
+to leave a space before the operator.
+(Otherwise you might accidentally specify one of the redirections
+with a file descriptor -- @ref{Advanced Redirection}.)
+@c Space needed after arg if it is a # and could look like file-descr.
+@c rms: spaces optional around the REDIRECTION, but required to avoid ambig.
+
+@ignore
+In this section, with no file descriptor before operator (i.e. file
+descriptor defaulted) and file name required after each operator, the
+operators are as follows:
+ >  >|  >>  <  posix
+ >&            bash extension (from csh)
+               (posix doesn't define >& with file name)
+Anything involving a file descriptor or no file name is considered advanced.
+@end ignore
+
+@table @code
+@item >
+@itemx >|
+@itemx >>
+instruct the shell to send the command's standard
+output to the specified @var{file} instead of to your terminal.
+@cindex @code{>} operator, redirecting output
+@cindex @code{>>} operator, redirecting output
+
+@c copy of following itemize is in advanced chapter
+@itemize @bullet
+@item
+If @var{file} doesn't yet exist, it is created.
+
+@item
+If @var{file} already exists:
+@itemize @bullet
+@item
+With @samp{>} and @samp{>|}, @var{file} is erased before the
+first output is written to it.  Be careful:
+If a file of the same name already exists,
+its contents are deleted before your command's output is
+written to that file.
+If you don't want @samp{>} to erase existing files, set the
+shell's @code{noclobber} variable; then
+@samp{>} with an existing file will generate an error message and leave
+the file alone.  (But note that @samp{>|} will clobber existing files
+regardless of the setting of the @code{noclobber} variable.)
+@c Note: alternative 'set -o noclobber...' for noclobber var -- where
+@c should cover this? which is preferable?
+
+@item
+With @samp{>>}, the output is appended to the end of an existing @var{file}.
+@end itemize
+@end itemize
+
+Note that @samp{>}, @samp{>|} and @samp{>>} redirect only the standard
+output; error messages printed by @var{command}, which go to standard
+error, still appear on the terminal and not in the file @var{file}.  To
+redirect error messages along with other output, see @samp{>&}, below.
+
+Here's an example of output redirection:
+
+@example
+bash$ who
+glassw   ttyq0   Apr 15 15:09   (worker-8)
+glassw   ttyq1   Apr 15 20:50   (worker-7)
+cqc      ttyq2   Apr 15 18:15   (worker-9)
+zvona    ttyq5   Apr 15 14:13   (nico)
+painter  ttyd0   Apr 15 21:00
+stf      ttyh4   Apr 15 11:58
+sandiway ttyh9   Apr 13 23:05
+pwu      ttyhc   Apr 15 15:19
+bash$ who > users-file
+bash$
+@end example
+
+@noindent
+The command @code{who} prints onto standard output a list of
+the users currently logged into a computer system.
+The simple command @samp{who}
+prints onto your screen (the default standard output).  The
+command @samp{who > users-file} redirects @code{who}'s
+standard output to
+the file @file{users-file}, so that the output of the @code{who}
+command goes into @file{users-file}
+instead of appearing on the screen.@refill
+
+The following command sequence creates a file containing the current
+date followed by the list of users currently logged onto the system:
+
+@example
+bash$ date > date-who-file
+bash$ who >> date-who-file
+bash$ cat date-who-file
+Sat Aug 04 11:27:05 EDT 1990
+glassw   ttyq0   Apr 15 15:09   (worker-8)
+cqc      ttyq2   Apr 15 18:15   (worker-9)
+zvona    ttyq5   Apr 15 14:13   (nico)
+painter  ttyd0   Apr 15 21:00
+stf      ttyh4   Apr 15 11:58
+pwu      ttyhc   Apr 15 15:19
+bash$
+@end example
+
+@noindent
+The command @code{date} prints the system date on standard output.
+In this example, the output of @code{date} becomes the first line of the file
+@file{date-who-file} created with the @samp{>} redirection operator.
+The output of the @code{who} command is @emph{appended} to the file
+@file{date-who-file}, because we used the @samp{>>} redirection
+operator.  @code{cat} simply shows the file's contents on the terminal.@refill
+
+@item &>
+@itemx >&
+both instruct the shell to send the command's
+standard output @emph{and} standard error to the file @var{file},
+instead of to your terminal.  Both ordinary output and any error
+messages are written to @var{file}, interspersed, in the order they
+are generated.  Of the two forms, the second (@code{>&}) is preferred,
+because it conforms to the convention that output redirection operators start
+with @samp{>}.
+@cindex @code{>&} operator, redirecting output
+@cindex @code{&>} operator, redirecting output
+
+As with @samp{>}, @var{file} is erased before the first output is written to
+it.  Be careful:
+If a file of the same name already exists, its contents are deleted
+before your command's output is written to that file.
+If you don't want @samp{>&} to erase existing files, set the
+shell's @code{noclobber} variable; then
+@samp{>&} with an existing file will generate an error message and leave
+the file alone.
+@c no appending version of >& analogous to >>  --  suggested it to bfox
+
+The example at the end of this section shows how to redirect
+standard error and standard output to different places.
+
+@item <
+instructs the shell to get the command's standard input from the
+specified file @var{file} instead of from your terminal.
+@cindex @code{<} operator, redirecting input
+
+Here's an example of this type of redirection:
+
+@example
+bash$ wc < date-who-file
+     7     39     244
+bash$
+@end example
+
+@noindent
+The command @code{wc} counts the number of lines, words, and
+characters it reads from standard input.  Using the standard input
+redirection operator, @samp{<}, we made @code{wc} read a file as its
+standard input.  In this example, @code{wc} prints the line, word, and
+character counts for the file @file{date-who-file} that was created in the
+example for @samp{>>} above using the @code{date} and @code{who} commands.
+
+Actually, redirection was not necessary for the above command,
+since @code{wc} accepts the name of an input file as an argument:
+
+@example
+bash$ wc date-who-file
+     7     39     244
+bash$
+@end example
+@end table
+
+@cindex redirection operators, using more than one
+More than one redirection operator can appear in a command.
+Here's an example that redirects both standard input and standard output:
+
+@example
+bash$ sort < users-file > sorted-list
+@end example
+
+@noindent
+This example reads the input for the command @code{sort} from the file
+@file{users-file} and writes the sorted output to the file
+@file{sorted-list}.  Any error messages are still written to the
+default standard error, which is your terminal screen.
+
+You cannot redirect a single I/O stream to more than one file:
+If you specify more than one redirection of the same I/O stream,
+only the rightmost takes effect.
+(The shell evaluates redirection operators in the order encountered, from
+left to right.)  For example, the output of @code{sort} in the following
+goes only to @file{out-file}, not to @file{sorted-list}.
+@example
+bash$ sort < users-file > sorted-list > out-file
+@end example
+
+In the next example, the output of @code{sort} goes to @file{out-file}
+and the error messages go to @file{error-file}.  The @samp{>&} redirects
+both standard output and standard error, then the @samp{>} redirects
+standard output to @file{out-file}, overriding the @samp{>&}.
+@example
+bash$ sort < users-file >& error-file > out-file
+@end example
+
+
+@node Pipes, Pipes, Other Redirections, I/O
+@section Pipes -- ``Mix-and-Match'' Commands
+@c  pipes are what connect processes, pipeline is whole thing
+@c    check terminology throughout
+
+@cindex pipe
+@cindex pipeline
+@cindex pipes
+@cindex @code{|}, use in piping
+@cindex intermedate file, using pipe to avoid
+@cindex combining commands with pipes
+@cindex connecting commands together with pipes
+
+@c a picture of boxes piped together would be nice
+One of the shell's most powerful features is the way it lets you ``mix
+and match'' commands.  By feeding the output of one command into another
+command, you can get a combination of behaviors that no predefined
+command provides.
+
+A @dfn{pipe} connects the standard output of one command to the standard
+input of another.
+This has the same effect as redirecting the standard output of the first
+command to a file, then redirecting the standard input of the second
+command to come from that file; but the pipe does this with a single
+command, and stores no intermediate files on disk.
+@c also: separate processes means output produced before 1st cmd finishes
+
+For example, let's say you want to see an alphabetical list of the
+users logged into the system.
+There is no command that does this, but there is a command
+@code{who} that produces a list of the logged-in users and
+a command @code{sort} that sorts its input lines.
+By piping these commands together
+(making the output of @code{who} become the input to @code{sort}),
+you can get the desired sorted list:
+@c contrast with   who > file; sort < file
+
+@ignore
+@c the raw data before sorted
+@example
+bash$ who
+
+glassw   ttyq0   Apr 15 15:09   (worker-8)
+glassw   ttyq1   Apr 15 20:50   (worker-7)
+cqc      ttyq2   Apr 15 18:15   (worker-9)
+zvona    ttyq5   Apr 15 14:13   (nico)
+painter  ttyd0   Apr 15 21:00
+stf      ttyh4   Apr 15 11:58
+sandiway ttyh9   Apr 13 23:05
+pwu      ttyhc   Apr 15 15:19
+@end example
+@end ignore
+@example
+bash$ who | sort
+
+cqc      ttyq2   Apr 15 18:15   (worker-9)
+glassw   ttyq0   Apr 15 15:09   (worker-8)
+glassw   ttyq1   Apr 15 20:50   (worker-7)
+painter  ttyd0   Apr 15 21:00
+pwu      ttyhc   Apr 15 15:19
+sandiway ttyh9   Apr 13 23:05
+stf      ttyh4   Apr 15 11:58
+zvona    ttyq5   Apr 15 14:13   (nico)
+bash$
+@end example
+
+@heading Viewing Output by the Screenful 
+
+@cindex @code{more}, with pipes
+@cindex pipe, used to view output by the screenful
+An extremely important use for pipes is to view the output of a command
+one screenful at a time, by piping the command's output into the
+@code{more} command.
+
+Let's say you want to see a detailed listing
+of a directory that contains a large number of files.  If you just
+type @samp{ls -l}, the listing will scroll by faster than you can read it.
+But if you use a pipe to attach the standard
+output of @samp{ls -l} to the standard input of the @code{more}
+command, you can page through the directory listing at your leisure:
+
+@example
+bash$ ls -l | more
+@end example
+
+@node How to pipe
+@subsection How to Pipe Commands
+
+@cindex pipeline, general format
+To pipe the output of one command into the input of another, place a
+vertical bar, @kbd{|}, between them.  The general format for a
+@dfn{pipeline} is:
+
+@example
+@var{command} | @var{command2} @r{[}| @dots{} @r{]}
+@end example
+
+@noindent
+That is, any number of commands are given, separated by vertical bars,
+@kbd{|}.
+The standard output of @var{command1} is connected to the standard
+input of @var{command2}, and so on.
+
+In order for a pipeline to work, the first command in the pipeline
+must generate output to the standard output,
+the last command must accept input from the standard input, and
+any intermediate commands must both read from standard input
+and write to standard output.
+
+@c rms: "filter" terminology good to know, standard terminology
+@c   for program designed to be used in a pipeline.
+@c  Many  unix cmds designed so CAN be used as filter (i.e.they use
+@c   standard input and standard output)
+Commands used between pipe operators are called @dfn{filters}.  They
+accept input from the standard input and generate output to
+the standard output.
+Examples of commands that can be used as filters
+include @code{sort} (which sorts its input lines) and
+@code{pr} (which formats text for printing).
+
+@menu
+* tee::  Using the @code{tee} command to preserve the
+         contents of intermediate files.
+@end menu
+
+@node tee, tee, Pipes, Pipes
+@subsection Saving Intermediate Pipeline Data with @code{tee}
+
+@cindex pipeline, @code{tee} in
+@cindex @code{tee} command for pipelines
+@cindex pipeline, saving intermediate data
+Normally, any data generated by commands in a pipeline exists only
+momentarily within the pipeline, because the output of each command
+simply flows into the next command.
+
+The command in the following example outputs the five lines of
+the file @file{list-files} that come first alphabetically:
+
+@example
+bash$ sort list-files | head -5
+@end example
+
+@noindent
+This works as follows:
+The command @code{sort list-files} sorts the file, sending the sorted
+data to the command @code{head -5}, which outputs the first five
+lines in its input.  The sorted data is discarded.
+
+If you want to preserve the sorted data, you could first @code{sort} the
+original data into a new file, then look at the @code{head} of that file:
+
+@example
+bash$ sort list-files > sort-saved
+bash$ head -5 < sort-saved
+@end example
+
+@c pipe vs. redirection -- any pros or cons?
+
+On some systems,
+there is also a way to preserved the sorted data while using a pipeline.
+To preserve intermediate pipeline data, such as the sorted data
+in the above example, insert the @code{tee} command into your pipeline.
+(Note: @code{tee} is not built into BASH.  It comes with GNU, and may
+or may not exist on other operating systems.)
+@c bfox says: tee doesn't belong here (no non-shell cmds do)
+@c   including tee vs. including ps:
+@c      ps comes with unix, behavior varies from system to system
+@c      not all systems have tee -- though gnu will
+@c jems thinks tee should be kept here
+The @code{tee} command takes a file name as its argument and does two things:
+@itemize @bullet
+@item
+It copies its standard input to the standard output.
+
+@item
+It copies its standard input into the specified file.
+If the file doesn't exist, @code{tee} creates it.
+If the file already exists, @code{tee} overwrites it,
+unless you give @code{tee} the @code{-a} option, in which case
+it appends to the file.
+@c If tee arg omitted: It's a NOP: no err msg, no tee output
+@c bfox: reason is so following will ``work'' even if var has no value
+@c    cmd 1 | tee $var | cmd2
+@end itemize
+
+@noindent
+(The name @code{tee} stands for the T shape of a pipe used in plumbing
+to split the flow into two parts.)
+
+Thus @code{tee} can be used to copy the data passing through a pipeline
+into a file for later use.  For example, we can insert a @code{tee} into
+the pipeline shown above:
+
+@example
+bash$ sort list-files | tee sort-saved | head -5
+@end example
+
+@noindent
+Now the output of @code{sort} is sent to the @code{tee} command, which
+stores the sorted data in a file called
+@file{sort-saved} and also passes that data on to the next
+program in the pipeline, @code{head}
+@c diagram of example would be nice
+@c  list_files -> sort -> sorted data -> head -> lines on terminal
+@c  where sort and wc are in boxes
+
+@node Pipes and redirection
+@subsection Redirection in Pipelines
+
+You may redirect the standard input of the first command in a pipeline
+and the standard output and standard error of the last command in a pipeline
+by using redirection operators (@pxref{Redirection}) in those commands.
+
+The following example sorts the file @code{list-files}
+(given to @code{sort} on its standard input by redirection with @code{<}),
+gives the sorted output to @code{head}
+(by connecting the standard output of @code{sort} to the standard input
+of @code{head} with a pipe, @code{|}),
+and stores the first five lines of the sorted output in the file @file{5lines}
+(by redirecting the standard output of @code{head} to that file with @code{>}):
+@example
+bash$ sort < list-files | head -5 > 5lines
+@end example
+
+
+@node Pipeline processes
+@subsection Processes in a Pipeline
+
+@c new concepts: process, exit status
+
+Each command in a pipeline is run as a separate process.
+That is, the commands run simultaneously, in parallel.
+
+The shell waits for all commands in the pipeline to terminate before
+returning control to you.
+
+The exit status of the pipeline is the exit status of the last command.
+
+@node File Names, Customization, I/O, Top
+@chapter File Names: Shorthands and Special Characters
+@c need better title
+@c need intro to material in chapter
+
+@c new topic for bash 1.07 will go here:  filename expansion
+@c   'foo{a,b}' ==> 'fooa foob'
+
+@node Wildcards
+@section Wildcards
+
+@c Wildcards also show up in Case statement patterns
+@c rms: right to think of wildcards as being for file names
+@c    (case statement is strange additional use)
+
+The shell allows you to specify sets of file names using @dfn{filename
+patterns} containing @dfn{wildcard characters}, so that you don't have
+to type all of the file names directly.
+@cindex file names, wildcards in
+@cindex wildcard characters in file names
+
+For example, if you want information about the five files in the
+current directory that end with @samp{.c}, you don't have to type
+the five file names:
+
+@example
+ls -l foo.c bar.c fred.c card.c game2.c
+@end example
+
+@noindent
+Instead you can type:
+
+@example
+ls -l *.c
+@end example
+
+@noindent
+The shell interprets the filename pattern @samp{*.c} as matching all
+existing file names ending in @samp{.c}.  The character @samp{*}, which
+can match almost any substring of a file name, is
+called a wildcard character.
+@xref{Wildcard Constructs}, for an explanation of @samp{*} and the other
+wildcard constructs.
+
+A single pattern may contain more than one wildcard.
+For example, @samp{*.c*} would match all file names that contain
+@samp{.c}.
+
+@c document 'set -o noglob...' for disabling wildcards -- disables all
+@c of them?
+
+@node Wildcard Constructs
+@subsection Wildcard Constructs
+
+Here are the wildcard constructs and their meanings:
+
+@table @code
+@item *
+The asterisk matches any sequence of zero or more characters, except
+that it does not match a period at the beginning of a file name.
+(If you want @samp{*} to include initial periods, set the variable
+@code{glob_dot_filenames}.)
+
+For example: @samp{foo*} matches any file name whose first three
+characters are @samp{foo}, including the name @file{foo} itself;
+@samp{*foo} matches any file name not starting with @samp{.} whose last
+three characters are @samp{foo}, including the name @file{foo} itself;
+and @samp{.*foo} matches any file name starting with @samp{.} whose last
+three characters are @samp{foo}, including the name @file{.foo} itself;
+@c Beware! .* can behave unexpectedly
+@c  ls .* expands to ls . .. .emacs (and so on)
+@c  but ls . and ls .. list those directories!
+@c by contrast, *. behaves as expected (* can't match initial .)
+
+@item ?
+The question mark matches any single character, except
+that it does not match a period at the beginning of a file name.
+(If you want @samp{?} to match initial periods, set the variable
+@code{glob_dot_filenames}.)
+
+For example, @samp{foo?} matches any four-character file name
+whose first three characters are @samp{foo}.  (Note that @samp{foo?}
+does not match @samp{foo} because @samp{foo} has only three characters.)
+
+@item [@var{char-set}]
+This @dfn{character set} matches any @emph{one} character specified by
+the @var{char-set}.
+Like a @samp{?}, a character set matches a single character.  Unlike the
+@samp{?}, the character set is selective about which characters it will match.
+
+The @var{char-set} consists of a sequence of any number of characters
+and/or any number of ranges of characters.
+The character set matches any of the single characters listed or any of
+the characters included in the specified ranges.
+
+For example, @samp{[123abcdq]} will match any one character from
+the set @samp{123abcdq};
+@samp{[1-3a-dq]} matches exactly the same characters, but it uses
+hyphens to indicate the ranges of characters from @samp{1} to @samp{3}
+(inclusive) and from @samp{a} to @samp{d}.
+
+Thus, @samp{foo[12]} matches @samp{foo1} and @samp{foo2} and nothing else;
+@samp{foo[a-z]} matches any four-character file name whose
+first three characters are @samp{foo} and whose fourth
+character is any lower-case letter; and
+@samp{foo[a-z12]} matches any four-character file name whose
+first three characters are @samp{foo} and whose fourth
+character is @samp{1}, @samp{2}, or any lower-case letter.
+
+@c KELLEM added ^ item (as synonym for !)
+@item [^@var{char-set}]
+This matches any @emph{one} character @emph{not} included in the given
+@var{char-set}, where the @var{char-set} is as specified above for
+the @code{[@var{char-set}]} case.
+For example, @samp{foo[^a-z12]} matches any four-character file name whose
+first three characters are @samp{foo} and whose last character is not
+@samp{1}, @samp{2}, or a lower-case letter.
+
+@item [!@var{char-set}]
+This is the same as @code{[^@var{char-set}]} if history substitution
+is disabled.
+Otherwise the @samp{!} invokes history substitution (@pxref{History}).
+@c 12/90, Bash 1.06.25:  'ls b[!a]*' --> 'a]*: Event not found'
+@c   in particular, ! does history subst and [, ]*, are not interpreted here
+@c   because ! done before shell sees line
+@c  Tried quoting the ! -- ls fo[\!a] -- but it just said fo[!a] not found.
+@c    (didn't find my file 'foo')
+@c  Works with history disabled
+@end table
+
+@node Wildcard implementation
+@subsection How Wildcards Work
+
+Each command word that contains a wildcard character is @dfn{expanded},
+which means it is replaced by a sequence of words, one for each
+file that matches the pattern.
+If @samp{*.c} in the command @samp{ls -l *.c} expands to
+@samp{foo.c bar.c fred.c card.c game2.c},
+the @code{ls} command sees these five file names as its arguments;
+it never sees the @samp{*.c}.
+
+Normally, a filename pattern that doesn't match any files is left in the
+command as is (it expands to itself).  For example, @samp{*.foo} is left
+as is if there are no files ending in @samp{.foo}, so in the following
+example the @code{ls} command gets @samp{*.foo} as its argument
+and reports that there is no such file (which is what you want to know).
+
+@example
+bash$ ls -l *.foo
+*.foo not found
+bash$
+@end example
+
+@noindent
+If for some reason you don't like this behavior, you can set the
+variable @code{allow_null_glob_expansion}.  When that variable is set, a
+pattern that doesn't match anything is removed from the command (expands
+to a null file name).  In the above example, the @samp{*.foo} would
+disappear, and @code{ls} would get no arguments, so it would report
+on all files in the current directory.
+
+Warning: A command word containing a wildcard construct is expanded
+to a sequence of file names @emph{whether or not you intended it to be
+a file name}.  At the time the expansion takes place, the system does
+not know or care whether it makes sense to treat the word as a file name.
+
+@node echo, Quotation, File Names, File Names
+@section Using @code{echo} to Preview Wildcard Expansion
+
+If you are going to use wildcards for something dangerous, like deleting
+a group of files, it is a good idea to be sure you know what files the
+pattern will match.
+
+@cindex @code{echo} command
+@cindex command lines, previewing
+To find out how wildcard characters will be expanded without actually
+executing your command, use the @code{echo} command to preview the
+expansion of a filename pattern.  The @code{echo} command
+simply displays its arguments fully expanded, with
+any pattern that doesn't match anything left as is
+(or deleted, if you have set @code{allow_null_glob_expansion} --
+@ref{Wildcard implementation}).
+@c rms: expand = replacing text with other text (!, *, ...)
+@c   interp may be part of expand,
+@c    e.g. substituting result of cmd into enclosing cmd
+@c  NB: $(...) is new version of `.  Nice because it nests
+
+For example,
+
+@example
+bash$ echo rm *.log *.foo
+rm bash.log *.foo
+bash$
+@end example
+@noindent
+shows that if I ask to delete (with the @code{rm} command) all files
+ending in @samp{.log} or @samp{.foo}, I will be deleting only
+@file{bash.log}.
+The pattern@samp{*.log} was expanded to the single file name that matched, namely
+@samp{bash.log}, and @samp{*.foo} was not expanded because it did not
+match any existing file names.
+
+@c what is echo for besides wildcards & variable substitution?
+@c   rms: in shell scripts to print output
+@c   Not so good for ! expansion:
+@c I tried 'echo !n' where n is a command #
+@c It echoed with the ! expanded, namely it display 'echo ...'
+@c Then it went on to execute that last 'echo ...' ???
+@c Ah: the 'echoing' of the expansion is just the normal ! expansion,
+@c not the execution of the 'echo !n' command.  First the shell displays
+@c the expanded command, then it executes it.  So echo is a confusing
+@c way to preview ! expansion.
+
+@node Wildcard Quotation
+@section File Names Containing Special Characters
+
+@cindex wildcards, quoting
+@cindex quoting, special characters in file names
+
+Normally, file names are made up of ``ordinary'' characters --
+alphanumeric characters (letters and numbers), periods (@samp{.}), and a
+few other characters (such as @samp{_} or @samp{~}) that have no special
+meaning to the shell.  For example: the file containing this documentation is
+named @file{bash.texinfo}; a backup version of this file saved for me by
+Emacs is called @file{bash.texinfo.~1~}; and the file in which BASH
+keeps track of commands I have issued (@pxref{History List}) is called
+@file{.bash_history}.
+
+If a file name contains a `special'' character -- a character that
+has special meaning to BASH, you must @dfn{quote} it to prevent
+BASH from giving the character its special interpretation.
+In particular, you must quote the following characters if you need
+to include them in a file name:
+
+@example
+  !  |  &  ;  <  >  (  )  $  `  '  "  \  *  ?  [  ]  #
+@end example
+@c above is all special chars?  what about : { }  (others?)
+@c  rms: colon not special, braces are
+@c  bfox: should quote the braces in file ames
+@c I tried it 1/31/91:  foo} was not special, foo{ gave message about
+@c   missing } but then went on to process foo{
+@c bfox: braces recognized as special only if separated from surrounding text
+@c   bourne:if not delimited, brace is regular char
+@c bfox 2/8/91
+@c   New bash feature (stole from csh): foo{a,b} ==> fooa foob
+@c   Will fix to not treat { as brace expansion unless see a comma
+
+@xref{Quotation}, for information on how to quote.
+
+@node Tilde
+@section Tilde Expansion
+
+You can avoid having to type long directory pathnames by using a
+shorthand for your home directory (and even other users' home
+directories) and for the directory you were last connected to.
+All of these directory abbreviations start with @kbd{~}.
+
+You may also see this home-directory shorthand in program output.
+For example, when you ask Emacs to find a file,
+it uses @kbd{~} instead of spelling out your home directory
+in the default pathname in the file-name prompt.
+
+@cindex expansion, tilde
+@cindex tilde expansion
+@c  terminology: tilde substitution vs. tilde expansion (title)
+@c  bfox: usually =, but sometimes a precedence issue
+When a tilde character (@kbd{~}) appears at the beginning of a word
+in a command, it is treated as follows:
+
+@table @code
+@item ~
+@itemx ~/@dots{}
+Tilde alone (or followed by a slash) is replaced by the value of the
+variable @code{HOME}, or by your home directory if @code{HOME} is unset.
+
+@item ~@var{login-name}
+@itemx ~@var{login-name}/@dots{}
+Tilde followed by someone's login name is replaced by that person's home
+directory.
+
+@item ~+
+@itemx ~+/@dots{}
+Tilde followed by a plus sign is replaced by the value of the variable
+@code{PWD}, which is the directory you are connected to.
+(Thus @samp{~+} is the same as @samp{.}.)
+@c ? where are ., .. etc covered? Operating system rather than shell?
+
+@item ~-
+@itemx ~-/@dots{}
+Tilde followed by a minus sign is replaced by the value of the variable
+@code{OLDPWD}, which is the directory you were previously connected to.
+@end table
+@c ? what happens if there is stuff other than / after the ~+ or the ~-
+
+In the following example, I change directories and copy a file
+from the first directory to the second:
+@example
+bash$ cd /top/next/a-subdirectory
+bash$ cp ~-/file-to-copy .
+bash$
+@end example
+
+Note for advanced users:
+The above @samp{~} constructs can
+also be used in pathnames that are stored in variables.
+For example, you can use pathnames
+with tildes in the @code{PATH}, @code{MAILPATH}, and @code{CDPATH} variables.
+In such variables, any pathname (not just the first) can start with
+@samp{~}.  That is, @samp{~} can appear after a @samp{:}, which
+separates pathnames.
+
+@node History List
+@chapter The Command History List
+
+BASH maintains a list of the commands you have given it most recently,
+so that you can reuse earlier commands or just review what you did.
+
+This section explains what is actually remembered and how you can
+influence that by changing the values of shell variables.
+The following sections explain how to make use of the command history.
+@xref{Basic Variable Mechanics}, for general information on shell variables.
+
+@cindex history list, size of
+@cindex history list, changing size of
+The length of the history list is controlled by the @code{HISTSIZE}
+shell variable.  By default, the value of this
+variable is 500; that is, the shell saves the last 500 command lines.
+You can make the length of the history list bigger or smaller by
+changing the value of the @code{HISTSIZE} variable.  A value of zero means
+no lines are saved.
+
+In this example, we check the value of @code{HISTSIZE} and find that
+it has the default value of 500, then we reduce the value to 128:
+
+@example
+bash$ echo $HISTSIZE
+500
+bash$ HISTSIZE=128
+bash$
+@end example
+
+The command history does not start out empty whenever you log in.
+Rather, commands are saved from session to session.  Old commands
+are erased from the list only when the length of the list exceeds
+@code{HISTSIZE}.
+
+The way BASH remembers commands between sessions is to store them
+in a file.
+By default, the file is @file{~/.bash_history} in your login directory.
+You can change this file name, if you want, by setting the
+@code{HISTFILE} variable.
+
+Normally, all commands are remembered in the history list.
+You can stop the recording of command lines beginning with a space
+or of consecutive identical command lines by setting the
+@code{history_control} variable, which is not set by default.
+@table @code
+@item history_control=ignorespace
+stops lines beginning with a space from being recorded.
+
+@item history_control=ignoredups
+stops a line identical to the last one in the history list from being recorded.
+@end table
+@noindent
+(Sorry, but there is to way to stop both kinds of command recording at once.)
+
+To see the history list, use the @code{history} command (@pxref{History}).
+You could also look at the file in which BASH saves history,
+but that is normally updated only when you exit from BASH, so it
+will contain the history as of the end of your last session
+rather than the current history.
+
+To reuse earlier commands (or portions of earlier commands),
+use Emacs-style keystrokes (@pxref{History Use}) or
+history substitution (@pxref{History}).
+
+@node Customization, Job Control, File Names, Top
+@chapter Customizing Shell Behavior
+
+@cindex customizing shell behavior
+@cindex controlling shell behavior
+@cindex changing shell behavior
+You can control some aspects of the shell's behavior, by changing
+values (such as how often the shell checks whether you have new mail)
+or by enabling or disabling features (such as whether
+@samp{!} invokes history substitution -- if you don't know what that is,
+you should probably disable it).
+
+Many parts of this manual include information on how to customize
+the behavior being described.
+This chapter covers some basic customizations that don't fit naturally
+into other topics or that are especially recommended for BASH novices.
+@c what to include here?
+@c Decision: Only include customization that doesn't fit in another
+@c chapter.  Customization of particular features will be in those
+@c chapters -- e.g. history vars with history stuff
+
+To try out a customization command, you can simply type it
+and see if you like the changed behavior.
+But you should not waste time retyping your favorite customization
+commands each time you log in.
+Instead, the commands you always want in effect should be put into a
+startup file that BASH automatically executes whenever you log in
+(@pxref{Login script}).
+
+@node Variables
+@section Shell Variables
+
+@cindex variables, controlling shell behavior
+@cindex shell variables, to control behavior
+
+One way to affect shell behavior is to set @dfn{variables} used by the
+shell.
+
+@xref{Basic Variables}, for documentation of some of the more basic
+variables.  Other variables are covered where appropriate throughout
+this manual.
+@c how should those sections help you manipulate the vars?
+@c   repeat the how-to info?  point to {Variable Mechanics}?
+@xref{Shell Vars}, for documentation
+of all the variables set or used by the shell.
+
+Some of the mechanics of manipulating shell variables are given here
+(@pxref{Basic Variable Mechanics}).
+@xref{Variable Mechanics}, for more complete information.
+
+@node Basic Variable Mechanics
+@subsection Manipulating Shell Variables
+
+To find out the value of a variable, type @samp{echo $@var{name}}, where
+@var{name} is the variable of interest.  (Be sure to include the @samp{$}; if
+you omit it, @code{echo} just repeats the @var{name} itself.)
+
+To change the value of a variable, type @samp{@var{name}=@var{new-value}},
+where @var{name} is the variable you want to change and @var{new-value} is
+the new value you want it to have.  Don't leave any blank space around the
+@kbd{=}.
+
+@emph{Warning:} Be careful to type variable names exactly as they are shown
+here, matching uppercase and lowercase letter exactly.  If you type a name
+wrong before an @samp{=}, you will either change the wrong variable or create
+a new variable; if you type a name wrong after @samp{echo $}, you will examine
+the wrong variable.
+
+In the following example, we ask for the value of the @code{MAILCHECK}
+variable, which is 600, then change it to 0 and verify our change.
+@example
+bash$ echo $MAILCHECK
+600
+bash$ MAILCHECK=0
+bash$ echo $MAILCHECK
+0
+bash$
+@end example
+
+
+@node Basic Variables
+@subsection Basic Shell Variables
+
+This section documents some basic shell variables whose values you might want
+to change.  For example, if you use more than one computer, you might want to
+change the shell prompt to be the name of the computer you are using instead
+of @samp{bash$ }.  @xref{Shell Vars}, for documentation of all the variables
+set or used by the shell.
+
+@c include any other vars?
+@c recommend (point to) other vars?  noclobber (for safety)
+
+@heading Directories
+
+@table @code
+@item HOME
+This holds the default argument for the @code{cd} command.  @code{HOME} is set
+to your login directory when you log in, so that a simple @samp{cd} command
+will return you to your login directory at any time.
+
+For example, I may want to frequently return to the directory where
+I work on GNU projects:
+@example
+bash$ HOME=/usr/jems/gnu
+bash$
+@end example
+
+@noindent
+Now a simple @samp{cd} command will return me to @code{/usr/jems/gnu} instead
+of to @code{/usr/jems}.
+
+@item PATH
+This is the search path the shell uses when looking for program files
+referenced in commands.  It holds a sequence of directory names separated by
+colons, to be searched from left to right.
+
+For example:
+
+@example
+/usr/gnu/bin:/usr/local/bin:.:/usr/ucb:/bin:/usr/bin/X11:/usr/bin
+@end example
+
+@c simplify or explain the PATH example
+@c :.: is especially opaque
+
+@end table
+
+@heading Mail
+
+@table @code
+@item MAILCHECK
+This specifies the amount of time that must pass before the shell will check
+whether your mail file (the file named by the @code{MAIL} variable) has
+changed.  The default is 60 seconds (1 minute).  An interval of 0 causes the
+shell to look for mail before printing each prompt.
+
+For example,
+
+@example
+MAILCHECK=600
+@end example
+
+@noindent
+causes the shell to check for mail before printing a prompt if 600 seconds
+have passed since the last check.
+@end table
+
+@heading Prompts
+
+@cindex customizing your prompt
+@cindex prompt, customizing
+When executing interactively, BASH displays the primary prompt (stored in the
+variable @code{PS1}) when it is ready to read a command, and the secondary
+prompt (stored in the variable @code{PS2}) when it needs more input to
+complete a command.
+
+@table @code
+@item  PS1
+This is the primary prompt string.  By default it is @samp{bash$ }.
+(Actually, the value in PS1 is @samp{bash\$ }, which prints as @samp{bash$ }
+unless you are a superuser.)
+
+The following example sets the primary prompt string to be your login name,
+followed by an @samp{@@} and the name of the computer, followed by a dollar
+sign and a space (for example, @samp{jems@@zurich$ }).  The variable value is
+enclosed in quotes (either double quotes, as shown here, or single quotes) so
+that it can include a space.  The special codes @samp{\u} and @samp{\h} for
+the user name and host name, as well as other codes useful in prompts, are
+explained below.
+@c ? apparently \u etc. must be within double quotes, otherwise they are
+@c used literally -- 1.06, 2/22/91
+
+@example
+PS1="\u@@\h$ "
+@c same as "$(whoami)@@$(hostname)$ "
+@c better example would be host & directory?
+@c single quotes -- deferred eval of $ things till expanded
+@c double quotes: $ things eval'ed when ps1 assigned (bfox)
+@c should use single if $ things in prompt should change -- e.g. your pwd
+@c  not relevant to \ methods below, since they're special to prompts,
+@c  not expanded as more fundamental mechanism
+@end example
+
+@item PS2
+This is the secondary prompt string, which is printed whenever bash needs more
+input to complete a command.
+@c what's an example of needing more input?  when does it happen?
+@c whenever syntax demands more -- e.g. 'if' statement without
+@c the closing 'fi'
+@c Also, the secondary prompt is printed after some errors. (which?)
+
+By default it is @samp{bash>}. 
+For example, we can change the secondary prompt string to @samp{more>}:
+
+@example
+PS2="more>"
+@end example
+
+Note that the secondary prompt, unlike the primary prompt, normally doesn't
+end in a space.  A space might fool you into thinking the lines of a
+multi-line command were automatically separated by a space, whereas they are
+actually run together exactly as typed (@pxref{Continuation}).
+@end table
+
+The values of @code{PS1} and @code{PS2} can contain special character
+sequences beginning with @samp{\} that are decoded as follows.  (That is, the
+@samp{\} and the following character are replaced by what they stand for when
+the prompt is printed.)
+
+@table @code
+@item \t
+The time.
+
+@item \d
+The date.
+
+@item \n
+Carriage return and line feed (@sc{CRLF}).
+@c notation/terminology: call it newline?
+
+@item \w
+The full pathname of the current working directory (the value of the variable
+@code{PWD}).
+
+@itemx \W
+The last element of the current working directory (the last directory in the
+value of the variable @code{PWD}).
+
+@item \u
+Your username.
+
+@item \h
+Your machine's hostname.
+
+@item \#
+The command number of this command (consecutively numbered since login,
+starting with 1).
+
+@item \!
+The history number of this command (the position of this command in the
+history list -- @ref{History List}).
+
+@item \\
+A backslash.  Since @samp{\} in a prompt normally isn't printed, but rather
+gives the next character a special meaning, if you want a @samp{\} in your
+prompt you must put @samp{\\} in the prompt string.
+
+@c next is too obscure for ordinary user
+@item \s
+The name of the shell (the basename of the positional parameter @code{$0}).
+@c basename = last element of path name  - normally bash
+@c $0 is name of prog you're running
+@c  if execute shell script foo directly (typing name of executable file),
+@c   inside foo, $0 is foo
+
+@c next is too obscure for ordinary user
+@item \$
+@samp{$} unless you are the superuser, in which case it is @samp{#}.
+@c actual criterion is: if the effective user @sc{id} is 0
+@c bfox: when log in, get a non-0 uid:  if su to become root, get eff uid=0
+
+@c next is too obscure for ordinary user
+@item \@var{nnn}
+The character that has the given octal code.
+@end table
+
+For example, if for some reason you did
+@example
+PS1="\d \t\n\u@@\h\n\w \#$ "
+@end example
+you would have a ridiculously long, multiline prompt, consisting of:
+@enumerate
+@item
+the date and time (separated by a space);
+
+@item
+your user name and host name (separated by an @samp{@@});
+
+@item
+your working directory, a space, the number of this command
+(numbered from 1 since you logged in), a @samp{$}, and a space.
+@end enumerate
+
+@example
+bash$ PS1="\d \t\n\u@@\h\n\w \#$ "
+Sat Feb  9 14:03:58
+jems@@zohar
+~/gnu 4$ who
+jems       pty/ttyu0    Feb  9 11:38
+gjs        pty/ttyu1    Feb  8 15:16
+Sat Feb  9 14:04:01
+jems@@zohar
+~/gnu 4$ 
+@end example
+
+@c following needs explaining -- is this about what happens
+@c   at prompt-printing time after \'s are processed?
+@noindent
+Note for advanced users:
+
+After the prompt string is decoded, it is expanded via parameter expansion
+and command substitution unless the variable @code{NO_PROMPT_VARS} is set, 
+
+@node set
+@section The @code{set} Command
+
+You can use the shell's built-in @code{set} command to turn shell options on
+and off (@pxref{Built-in}).  Here are some option settings you might want to
+use:
+
+@c recommend any other features for beginners?
+@c   'set -u' (or set -o nounseft...) to make unset vars different from null vars
+@c  2/8/91,bfox: 'set -o' is now for options, not history.
+@c    plain 'set -o' gives list of options
+
+@table @code
+@c following set is according to bfox -- must try it
+@item set -o histexpand off
+disables history substitution (@pxref{History}).
+If you don't know what history substitution is, it is a good idea to
+disable it.
+
+@end table
+
+@c anything else besides set from builtin chapter?  enable?
+
+@node Job Control, Combining commands, Customization, Top
+@chapter Background and Foreground Processes
+
+This chapter explains how to run commands in the @dfn{background},
+so that you can do more than one thing at a time, and how to
+interrupt commands that are running.
+
+First we present a short scenario that illustrates most of
+the facilities covered in this chapter.  The rest of the chapter
+provides full explanations of these facilities.
+
+@c ideas for following scenario:
+@c bfox often does:
+@c   start ftp, c-z it, bg, stops when needs tty input, fg, talk to it
+@c   find (see other example)
+@c **need output lines in following scenario, where marked by **
+@example
+bash$ monthly-accounting
+C-z
+bash$ bg
+**is job & proc # printed here as for & ?
+bash$ make >& log &
+[1] 18432
+bash$ emacs
+@c another good example would be 'mail'
+C-z
+bash$ jobs
+**show both background jobs running & suspended foreground job
+bash$ fg
+@dots{}
+bash$ **a done notice for one of the background jobs
+bash$ wait
+**done notice for other background job
+bash$
+@end example
+@c bfox: silly to WAIT for 1 job.  Should just FG it, and will get
+@c   prompt when it finishes.  Not all systems have job control. (Have
+@c   backgrounding, but can't interact with the bg job except to  send
+@c   it kill it.)  GNU does.  But Bash could run on a system V machine,
+@c   no job control.  Wait useful when no job control
+@c bfox: can log out & bg jobs keep going!
+@c   downplay wait -- don't expect users to use it
+@c users only need fg, bg, %, auto_resume
+@c Fix whole chapter to separate out what have with/without job control
+@c INTTERUPT IS NOT THE SAME AS STOP
+
+In this example, we gave the command @samp{monthly-accounting}, which started
+our @code{monthly-accounting} program (in the foreground).  We didn't want to
+sit there waiting for it to finish, so we interrupted it (@kbd{C-z}) and
+continued it running (@code{bg}) in the background.
+@c Beware: if we didn't have the foresight to redirect output originally
+@c it's too late now
+We then started a program compilation (@code{make@dots{}}) in the background
+(@code{&}).  While those background jobs ran, we started up @code{emacs}.
+After a while we wanted to see how the background jobs were coming along, so
+we interrupted the foreground job (@kbd{C-z}) and asked about our jobs.  The
+@code{jobs} command reported on our two background jobs and also told us about
+our suspended @code{emacs} job.  We resumed the @code{emacs} program
+(@code{fg}).  When we exited from @code{emacs}, BASH reported that our
+@code{make} job had finished.  We decided to wait for the
+@code{monthly-accounting} job to finish also (@code{wait}).
+
+
+@node Start job
+@section Starting a Job
+
+@cindex foreground
+Commands such as those shown in most of our examples are run in the
+@dfn{foreground}.  That is, the command runs and you do not get another BASH
+prompt (and the opportunity to run another command) until it finishes.  This
+is appropriate for short or interactive tasks.
+
+@cindex background
+If a program will be running a long time and does not require supervision or
+input from the terminal, it may be best run in the @dfn{background}.  This
+leaves your terminal free for other tasks.
+
+@node Background
+@subsection Starting a Background Job
+
+@cindex background processes
+@cindex background, placing things in the
+@cindex background (&)
+@cindex command lines, putting in the background
+
+To run a command in the background, place an ampersand, @samp{&}, at the end
+of the command line.  For example, the following command runs @code{make}
+(which recompiles a program as specified by a data base in the current
+directory) in the background (@samp{&}), redirecting @code{make}'s standard
+output and error messages to the file @file{log}:
+
+@example
+bash$ make >& log &
+@end example
+
+@cindex background job's standard input and output
+In this example, the command does not read from the standard input, so we had
+no reason to redirect standard input.  If a background command uses its
+standard input, you should normally redirect it, because the command cannot
+read from the terminal (which you are using for other things).  If a
+background task needs input from the standard input and you have not
+redirected the standard input:
+@c new concept: job control -- what is it?  Not defined in this manual
+@itemize @bullet
+@item
+On a system with job control (such as GNU), the background task is suspended
+if it needs input from the standard input.  You can then bring the task to the
+foreground (@pxref{Resuming}) and type the input.
+@c add an xref?
+
+@item
+On a system without job control (such as @sc{System V}), the background task
+is given a null string if it needs input from the standard input.
+@end itemize
+
+You should usually redirect the background command's standard output as well
+(as shown in the above example), unless you want the output to be interspersed
+with your other work on the terminal.  If your background task sends output to
+the standard output and you did not redirect the standard output, this output
+appears on your terminal, @emph{even if you are running another program}.
+
+When you run a background command, the shell prints out its job number and the
+@sc{pid} of the last process in the pipeline (@pxref{Numbers}).  In the
+following example, BASH assigns our background command a job number of 1.  It
+assigns a @sc{pid} of 18449 to the last process in the pipeline, @samp{wc >
+count-file}.
+
+@example
+bash$ ls -l | wc > count-file &
+[1] 18449
+bash$
+@end example
+
+@node notify
+@subsection Notification of Background Job Termination
+
+@cindex background, the @code{notify} variable
+@cindex @code{notify} variable, for background jobs
+
+When a background job is finished, BASH reports its job number, the word
+@samp{Done}, and the command line itself:
+
+@example
+[1]+  Done              ls -l | wc >count-file 
+@end example
+
+@noindent
+
+@c also reports when a job becomes suspended (by a signal)
+Normally the shell reports on jobs only when it issues a prompt, so it doesn't
+interrupt what you are doing.  If you wish to be told of changes in job status
+immediately (not just when you get the next shell prompt), set the
+@code{notify} variable, as follows:
+
+@example
+bash$ notify=
+@end example
+@c create a var = set a var;  how uncreate it if change your mind?  
+
+@node wait
+@subsection Waiting for Background Jobs to Terminate
+
+@cindex background, the @code{wait} command
+@cindex @code{wait} command
+If you want to wait for some or all of your background jobs to finish before
+issuing any more commands, you can save yourself the trouble of keeping track
+of the termination notices (@pxref{notify}) or repeatedly typing the
+@code{jobs} command (@pxref{Jobs command}) by using the @code{wait} command to
+wait for the background jobs to finish.
+
+@table @code
+@item wait
+@itemx wait @var{job_spec}
+@c next item added by KELLEM
+@itemx wait @var{pid}
+The @code{wait} command waits for active background processes to finish.  It
+suspends operation of your terminal until the specified background job
+(@var{job_spec}) or background process (@var{pid}) is finished.  If no job or
+process is specified, @code{wait} waits for all currently active jobs to
+finish.
+@c presumably wait finishes immediately if the job is suspended
+
+@var{job_spec} is any job specification 
+and @var{pid} is a @sc{pid} (@pxref{Numbers}).
+
+Let's assume that you want to start three lengthy jobs running concurrently
+and then want to wait for all three jobs to finish before continuing.  Here's
+how you'd do it:
+
+@c bfox: searches starting with / for files named core
+@c   & prints to standard out  (whole path name)
+@example
+bash$ find / -name core -print >& core_list &
+[1] 2240
+bash$ grep "Experience" /home/* >& exper_list &
+[2] 2241
+bash$ ls -lR / >& dir_list &
+[3] 2242
+bash$ wait
+[1]   Done                find / -name resume -print >& resume_list
+[2]-  Done                grep "Experience" /home/* >& exper_list
+[3]+  Done                ls -lR / >& dir_list
+bash$
+@end example
+
+@noindent
+In this example, three long jobs are performed simultaneously: each job is
+performed in background by the @code{&} operator at the end of the command.
+Notice that each job has its standard output and standard error redirected to
+a file with the @code{>&} operator so that the jobs do not write output or
+error messages to the screen while they are running in the background.  The
+@code{wait} command waits for all three commands to finish before allowing
+BASH to continue.
+@end table
+
+@menu
+* Numbers::    Job numbers and process identification
+               numbers.
+
+* Stopping::   Stopping and suspending jobs.
+
+* Job Specs::  Stopping, restarting, and otherwise
+               modifying the state of a job.
+
+* fg::         Resuming stopped or suspended jobs.
+
+* bg::         Placing stopped jobs in the background.
+
+* kill::       Terminating Processes.
+
+* nice::       Running processes at a low priority
+               using the @code{nice} command.
+
+* nohup::      Preventing jobs from stopping using 
+               the @code{nohup} command.
+@end menu
+
+@node Numbers, Stopping, Job Control, Job Control
+@section Jobs, Processes, and their Identifiers
+
+Each pipeline run by the shell is considered a separate @dfn{job}.  (A
+pipeline is a set of commands joined by pipes (@pxref{Pipes}), or a command
+without pipes -- which can be though of as the simplest possible pipeline,
+with only 1 command and 0 pipes.)  Each command in the pipeline is run in its
+own process (that is, they run simultaneously).  Hence a job consists of one
+or more processes.
+
+There are a number of commands that act on jobs or processes.  (For example,
+there are commands to suspend a job or kill a process.)  If you give a command
+for a job (for example, killing the job), this applies to all the processes in
+the job.  If you give a command for a process, only that process is affected.
+
+To specify the desired job or process in a command, you may need to refer to
+it by number.
+
+@itemize @bullet
+@item
+Every process has an identifying number, called a @dfn{@sc{pid}} (@sc{p}rocess
+@sc{id}entifier).  @sc{pid}s, which are assigned by the operating system, are
+unique throughout the entire system: No two processes, even belonging to
+different users, can have the same @sc{pid} at the same time.
+
+@item
+Jobs are identified by small @dfn{job numbers}, which are assigned by BASH.
+Unlike @sc{pid}s, these are not unique throughout the system: Any number of
+users may have a job 1 at a given time.  However, at any moment, all your jobs
+have numbers that are different from each other, which is all you need to
+uniquely identify them in commands.
+@end itemize
+
+When you run a background command, the shell prints out its job number and the
+@sc{pid} of the last process in the pipeline (@pxref{Background}).  In
+addition, you can find out these numbers by using the @code{jobs} command or
+the @code{ps} command (@pxref{Jobs command}).
+
+To refer to a process in a command, use its @sc{pid}.  To refer to a job in a
+command, use a @dfn{job specification} having one of the following forms:
+
+@c Unclear whether to include % as part of job spec.
+@c %... can be cmd by self
+@c Cmd with job spec as arg may allow omit % if no other arg.
+@c (1) job spec starts w %, bt sometimes can leave it out if want to
+@c e.g. in fg or bg:  fg 4 = fg %4
+@c  or
+@c (2) job spec has no %, sometimes precede with %
+@c RMS prefers view (1)
+
+@table @code
+@item %@var{number}
+refers to the job whose number is @var{number}.  For example, @samp{%1} refers
+to job number 1.
+
+@c bfox: both %strings require unambiguous match, and look in whole job list
+@item %@var{string}
+refers to the job whose command line (the command that started the job) starts
+with @var{string}.  For example, @samp{%emacs} refers to an @code{emacs} job.
+If there is more than one job whose name begins with the string, you'll be
+given an error message.
+
+@item %?@var{string}
+refers to the job whose command line (the command that started the job)
+contains @var{string}.  For example, @samp{%?mac} may refer to an @code{emacs}
+job.  If there is more than one job whose name contains the string, you'll be
+given an error message.
+
+@item %
+@itemx %+
+@itemx %%
+all refer to the current job (the last job stopped or placed in the
+background, @pxref{current job}).
+
+@item %-
+refers to the previous job (the second-to-last job stopped or placed in the
+background, @pxref{current job}).
+@c 1/7/91, 1.06 -- there was only 1 stopped job -- %- got it (same as %+)
+@end table
+
+Note that a job specification starts with a @samp{%} character.  In certain
+contexts, however, where it is clear that a job is being referred to, it is
+possible to omit the @samp{%}.
+@c I didn't show any examples where could omit it -- e.g. fg cmd
+
+@node Jobs command
+@section Finding Out Out What Jobs and Processes You Have
+
+To find out what stopped (suspended) and background jobs you have, you can use
+the @code{jobs} command.  The following example shows that we have three
+suspended jobs.
+
+@c must fix following examples so all based on same set of jobs
+
+@example
+bash$ jobs
+[1]   Stopped    rn
+[2]-  Stopped    vi file
+[3]+  Stopped    emacs file2
+bash$
+@end example
+
+Use the @code{-l} flag with @code{jobs} to see the jobs' processes as well:
+
+@example
+bash$ jobs -l
+[1]+ 18448 Done         ls -l
+     18449              | wc >count-file 
+bash$ 
+@end example
+
+@cindex @code{ps} command
+@cindex monitoring active processes
+@cindex processes, monitoring
+@cindex background, monitoring processes
+@c define 'active'?
+The @code{ps} command reports more detail about your active processes than
+@code{jobs} does, but it treats the processes as individuals and doesn't group
+them into jobs.  When typed without options, @code{ps} gives you the following
+information. (Note that @code{ps} is not built into BASH, so its output is
+different from system to system; however, the basics remain the same.)
+
+@table @code
+@item PID
+The process identification number.
+
+@item TTY
+The terminal from which the process was started.
+
+@item TIME
+The amount of computer time the process has used so far.
+
+@item COMMAND
+The name of the process.
+@end table
+
+Here's an example of the output of @code{ps}:
+
+@example
+bash$ jobs
+[1]+  Stopped             emacs
+bash$ ps
+  PID TTY      TIME COMMAND
+ 2249 ttyp0    0:00 ps
+ 2184 ttyp0    0:00 emacs
+ 2170 ttyp0    0:00 bash
+bash$
+@end example
+
+@noindent
+This @code{ps} command shows that we have three processes: the @code{ps}
+process itself, an @code{emacs} process (which we presumably suspended
+earlier), and the @code{bash} process itself.  (@code{ps}, unlike @code{jobs},
+reports on foreground as well as background processes.)  BASH has assigned job
+number 1 and process number 2184 to @code{emacs}.
+
+@xref{ps, , @code{ps}, utilities, The GNU Utilities Manual},
+for more information.
+
+@node current job
+@subsection Current Job and Previous Job
+
+The @samp{+} and @samp{-} in the output of @code{jobs} identify the ``current
+job'' and ``previous job'' respectively.  The job most recently stopped
+(suspended) or put in the background is called the @dfn{current job}.
+@c last sentence unclear
+@c In particular, why is a Done job marked + ?  bfox: May fix later
+@c  Current job concept is useless for it, since you can't act on it
+@c  Remains + until it's reported to you and removed from list
+It is marked with a plus sign, @samp{+}, in the jobs listing.  The
+second-to-last job stopped or put in the background is called the
+@dfn{previous job}.  It is marked with a minus sign, @samp{-}, in the jobs
+listing.  When the current job is terminates or is moved to the foreground,
+the previous job becomes the new current job.
+
+The concept of ``current job'' is used for defaulting arguments
+to the @code{fg} and @code{bg} commands (@pxref{Resuming}).
+
+@c need examples
+
+@node Stopping, Job Specs, Numbers, Job Control
+@section Interrupting a Job
+
+@c How kill a stopped job?
+@c bfox: kill job-spec (shell continues & signals the process -- you
+@c   don't have to continue it yourself)
+@c   Shell tells op sys start process, processes can communicate by signals
+@c   Kill exists as ordinary disk-file cmd
+@c   Shell has separate built-in kill cmd so can do jobs, which are
+@c   shell (not op sys) concept.
+@c   If program doesn't disable TERM, it will definitely kill you
+@c rms: program handles signal if wants, otherwise unix does it
+@c   kill -9  (9=SIGKILL) is signal no one can ask to handle, thus kills anything
+
+@c confusion in this section between Job, Process, Program
+@c confused terminology: stop, kill, suspend
+@c rms: stop=suspend, terminate=kill (gone)
+
+@node Interrupt foreground
+@subsection Interrupting the Foreground Job
+
+@cindex stopping jobs
+@cindex jobs, stopping
+@cindex suspending jobs
+@cindex jobs, suspending
+
+You may want to abort the program you are currently running (in the
+foreground), or you may want to interrupt it temporarily in order to do
+something else.
+
+The following keys stop the foreground job, placing it in a type of
+``suspended animation'' so that it can be resumed if desired
+(@pxref{Resuming}).
+
+@c none of these interrupts worked while running vi under bash
+@c rms: interactive editors turn things off
+@table @code
+@item @kbd{C-z}
+This stops (suspends) the foreground job immediately.
+@c but SIGTSTP says programs may ignore C-z? (bfox: can ignore if enabled)
+
+@item @kbd{C-y}
+This is similar to @kbd{C-z} except it causes the process to be stopped
+(suspended) only when that process attempts to read input from the terminal.
+@c KELLEM: note that C-y (by default in readline lib) is bound to `yank'
+@c  thus fine when readline not running
+@c bfox: normally type C-y ahead of time (if at prompt, you would type C-z)
+@c  op sys buffers it & prepares to send signal later
+@c same true of C-z (op sys cmd, not bash)
+@end table
+
+@noindent
+Note for advanced users:
+@kbd{C-z} and @kbd{C-y} will not suspend the shell itself.
+@c Does this belong here?  There's lots of other stuff it won't suspend, too.
+To suspend a shell, such as one started with the @code{su} command,
+use the @code{suspend} command (@pxref{Built-in}).
+
+The following keys kill the foreground job.
+The job cannot be resumed.
+
+@table @code
+@item @kbd{C-c}
+This kills the foreground job immediately.
+
+@item @kbd{C-\}
+This kills the foreground job immediately and it is much harsher than @kbd{C-c}.
+@c  harsher in what way - just core dump? is core dump the purpose of C-\ ?
+@c bfox: C-c is SIGINT, which usually kills
+@c   but C-\ is SIGKILL, which can't be ignored
+This method usually produces a core (memory) dump for later analysis.
+@c why 'usually'?    bfox: core dump happens if not disabled with ulimit
+@c  by setting core dump size to 0
+@c  He normally has dumps disabled, enables to reproduce a bug
+@c  rms: if program  handles signal, it may not produce dump -- otherwise produced
+@c what is the core dump useful for?  rms: debugging
+@end table
+
+All of the above keystrokes can be reassigned to other keys,
+by using @code{stty}.
+@c need ref for stty
+We are just covering the most common keyboard methods of stopping jobs.
+Your operating system manual will tell you about other
+keyboard interrupts and how to remap your keyboard.
+
+No matter which method you use (except @kbd{C-c}), the shell tells you 
+when your program, or job, has been ``Stopped'', and prints another prompt.
+@c really does it for C-\ but not C-c ?
+@c be clearer what shell tells you
+
+@node kill, nice, bg, Job Control
+@subsection Interrupting a Background Job
+
+@cindex stopping jobs
+@cindex jobs, stopping
+@cindex suspending jobs
+@cindex jobs, suspending
+@cindex background, stopping jobs
+@cindex background, suspending jobs
+@cindex background, terminating processes
+@cindex processes, terminating
+@cindex terminating processes or jobs
+
+You cannot use the keyboard interrupts (@pxref{Interrupt foreground})
+to interrupt a background job, since background jobs do not listen to
+the terminal.
+
+To suspend or terminate a background job, you can do either of the following:
+@itemize @bullet
+@item
+Use the @code{kill} command (described below).
+
+@item
+Move the job to the foreground (@pxref{fg<>bg}) then use one of the
+keyboard interrupts for foreground jobs (@pxref{Interrupt foreground}).
+@end itemize
+
+@cindex @code{kill} command
+@cindex background, the kill command and
+@cindex jobs, the kill command and
+@cindex signals, for the @code{kill} command
+
+@c new concept: signal
+@table @code
+@item kill @r{[}-@var{sigspec}@r{]} @var{pid}
+@itemx kill @r{[}-@var{sigspec}@r{]} @var{job_spec}
+Send the process identified by @var{pid} or all processes in the
+job identified by @var{job_spec}
+the terminate signal,
+@c  SIGTERM
+or the signal specified by @var{sigspec}, if given.
+@var{pid} is a process identification number and
+@var{job_spec} is a job specification (@pxref{Numbers}).
+Signals are specified either by number or by name, as explained below.
+@c where are the numbers defined? document here? (appendix)
+
+@item kill -l
+This lists all the possible signal names (and numbers).
+It does not affect any jobs or processes.
+@end table
+
+Here's a summary of the most common and useful signals.
+In the @code{kill} command, you can use any of the following:
+@itemize @bullet
+@item
+the name shown  -- e.g. @code{SIGKILL}
+
+@item
+the part of the name after @samp{SIG} -- e.g. @code{KILL}
+
+@item
+the lowercase version of the part of the name after @samp{SIG} -- e.g.
+@code{kill}
+@end itemize
+
+
+@c compare to appendix -- don't  want same table in both places
+@table @code
+@item SIGHUP
+This is a gentle signal you can send to processes that you want to
+kill when you want to allow them to clean up after themselves (for
+example, delete temporary files, kill subprocesses, etc.).  It is a
+good practice to try to kill jobs with this signal first, before trying
+any of the harsher signals.  Some programs see this signal as a request
+for them to re-initialize some internal state or re-read a startup file,
+so this signal is not always used strictly for killing a process.
+
+@item SIGINT
+This is the signal generated (normally) by @kbd{C-c} on the keyboard.
+This signal will kill most processes, although a program may choose to
+ignore @code{SIGINT}.  @code{SIGINT} also allows a process to clean up
+after itself before dying.
+@c how differs from SIGHUP?  rms: SIGHUP means terminal is disconnected.
+@c  prog might die from hup but not c-c
+
+@item SIGQUIT
+This is the signal generated (normally) by @kbd{C-\} on the keyboard. 
+@c normally = if not remapped
+@code{SIGQUIT} is identical to @code{SIGINT} except that it requests that the
+operating system produce a diagnostics file called a @dfn{core dump},
+which is placed into a file named @file{core}.
+This can be useful for debugging.
+
+@item SIGTERM
+@code{SIGTERM} is similar to @code{SIGINT} except that it is normally produced by a
+program and not from the @kbd{C-c} on the keyboard.  Note that
+some programs treat @code{SIGTERM} differently from @code{SIGINT}.
+
+@item SIGKILL
+@code{SIGKILL} is the harshest ``kill'' signal.  It kills a process
+without warning
+and without allowing the process to clean up after
+itself.
+@c rms: i.e. doesn't signal process, just kills it
+@code{SIGKILL} should be used as a last resort, if
+@code{SIGHUP}, @code{SIGTERM}, @code{SIGINT}, and @code{SIGQUIT} don't
+work.
+
+@item SIGTSTP
+@code{SIGTSTP} is the signal sent (normally) by the @kbd{C-z} key on the
+keyboard.
+@c normally = modulo remapping
+Some programs may ignore this signal.  This signal does not
+kill the process but instead @emph{stops} the process, putting the
+program into a suspended state.
+
+@item SIGSTOP
+@code{SIGSTOP} is identical to @code{SIGTSTP} except it is not generated from
+the keyboard by @kbd{C-z}; it is must be sent with @code{kill} or from within
+a program.
+
+@item SIGCONT
+@code{SIGCONT} causes a @emph{stopped} process to continue running.  A stopped
+process is sent this signal by BASH when the @code{fg} and @code{bg}
+commands are used.
+@end table
+
+The following example terminates a @code{tip} process that has
+been stopped earlier:
+@c tip is for: communicate over serial port to log into another machine
+@c replace example -- don't use tip or HUP (HUP normally due to hangup, not sent by you)
+@c rms: normally do kill, or kill -stop, or kill -kill
+@c bfox: either kind of name can be lower case
+@c replace example
+
+@example
+bash$ jobs -l
+[1]+ 29854 Stopped        tip
+bash$ kill -HUP 29854
+[1]+ Hangup               tip
+bash$ jobs
+bash$
+@end example
+
+@noindent
+For a @code{tip} process, it is especially useful to use the @code{-HUP}
+signal so that @code{tip} cleans up the @sc{UUCP} lock files that it leaves
+around.
+
+
+@node Stopped jobs
+@subsection Logging Out With Stopped Jobs
+
+@cindex logging off, with stopped jobs
+@cindex jobs, logging off with stopped
+@cindex stopped jobs, logging off with
+If you have stopped jobs that you have forgotten about and you try to
+log off, you will be given a warning that you have ``Stopped jobs'' and
+will not be allowed to log off.  If you continue to try to log off, you
+will eventually be successful, but the operating system will kill
+(terminate) all your stopped jobs.
+@c what if you have running (background) jobs?
+@c ? bfox: they just keep silently running ?
+@c  csh sends hup to children when logs up, bash currently doesn't
+@c  might change it -- if so, add nohup biltin
+
+It is much better to bring the stopped jobs to the foreground
+(@pxref{Resuming}) and terminate them properly, so that can clean up
+after themselves (save files, etc.).
+
+You can also prevent jobs from being killed
+when you log off by using the @code{nohup} command (@pxref{nohup}).
+
+@node Resuming
+@section Resuming a Suspended Job
+
+A job that has been suspended (@pxref{Stopping}) can be resumed.
+That is, you can make it continue from where it left off.
+The resumed job can be run either in the foreground or in the
+background, regardless of whether it was foreground or background
+when it was interrupted.
+
+The following methods of resuming jobs are described more fully below:
+@itemize @bullet
+@item
+To resume a suspended job in the foreground, use the @code{fg} command
+or just type a job specification (@pxref{Numbers}).
+
+@item
+If you set the @code{auto_resume} variable, typing a command
+may resume a suspended job instead of starting a new one.
+
+@item
+To resume a suspended job in the background, use the @code{bg} command
+or just type a job specification (@pxref{Numbers}) followed by an
+ampersand (@samp{&}).@refill
+@end itemize
+
+@table @code
+@item fg
+@itemx fg @var{job_spec}
+@itemx @var{job_spec}
+Bring the specified job into the foreground, and resume running it.  If
+@var{job_spec} isn't specified, @code{fg} acts on the current job
+(@code{%}).
+
+The following example resumes the current job in the foreground:
+
+@example
+bash$ fg
+@end example
+
+The following example resumes a stopped @code{du} process in the foreground:
+
+@example
+bash$ %du
+@end example
+
+
+@item bg
+@itemx bg @var{job_spec}
+@itemx @var{job_spec} &
+Place the specified job in the background, and resume running it as if
+it had been started with @samp{&}.  If @var{job_spec} is omitted,
+@code{bg} acts on the current job (@code{%}).@refill
+
+@example
+bash$ find / -name resume -print >& resume_list 
+C-z
+[1]+  Stopped   find / -name resume -print >& resume_list
+bash$ bg
+find / -name resume -print >& resume_list &
+bash$
+@end example
+
+@noindent
+Here we started the @code{find} command in the foreground but then
+stopped it (with @kbd{C-z}) and placed it in the background when we got
+tired of waiting for the command to finish.
+
+The following example places job 2 in the background:
+
+@example
+bash$ jobs
+[1]-  Stopped   find / -name resume -print >& resume_list
+[2]+  Stopped   ls -R / >& dir_list
+bash$ %2 &
+ls -R / >& dir_list &
+bash$
+@end example
+
+@c 12/90, bash 1.06.25: bug: 'exact' has no effect - never need whole name
+@item auto_resume=
+@itemx auto_resume=exact
+If you create the @code{auto_resume} variable (e.g. by typing
+@samp{auto_resume=}), then if you type a command that matches
+a suspended job's command,
+@c match of cmd word
+@c bfox: auto_resume is for 1-word commands
+@c   must be 'simple word' -- e.g. \emacs is new
+@c bfox: to specifically talk about 1st wd of cmd, call it ``command word''
+the suspended job is resumed instead of a new job being started.
+If the value of @code{auto_resume} is @code{exact}
+(you set @samp{auto_resume=exact}), then you must
+type the entire job name; if the value is anything else,
+then only part of job name is enough to resume it.
+@c fix: job name = command word
+If there is more than one job
+with such a name, the job with the highest number is resumed.
+
+For example, assume that you have a stopped Emacs job:
+
+@example
+bash$ jobs
+[1]+  Stopped             emacs -f rmail
+@end example
+
+@itemize @bullet
+@item
+If you have not set @code{auto_resume}, then the command
+
+@example
+bash$ emacs
+@end example
+
+@noindent
+will start another Emacs job, and the old job will remain suspended.
+
+@item
+If you have set @code{auto_resume}, the above @samp{emacs} command
+will resume the stopped Emacs job.
+
+@item
+If you have set @code{auto_resume} to anything but @code{exact}, an
+abbreviated command (such as @samp{ema}) will also resume the stopped
+Emacs job.
+@end itemize
+@end table
+
+@node fg<>bg
+@section Moving a Job Between Foreground and Background
+
+To move the job that is running in the foreground to the background,
+suspend the job (@pxref{Stopping})
+and then resume it in the background (@pxref{Resuming}).
+
+To make a job that is running in the background be the foreground job,
+pretend the job has been suspended (though there is no need to
+actually suspend it) and ``resume'' it using any method of resuming jobs
+in the foreground (@pxref{Resuming}).
+
+@c BFOX: Flush NICE from manual
+@c KELLEM: nice is NOT a builtin -- description below looks like it's from csh
+@c  /bin/nice usage is typically: nice [-number] command (both BSD and SysV)
+@c  note the `-' before number .. what's GNU nice going to do?
+@c rms: may be in posix 2 or 2a
+@ignore
+@node nice, nohup, kill, Job Control
+@section Running Processes at a Low Priority Using @code{nice}
+
+@cindex jobs, the @code{nice} command
+@cindex background, the @code{nice} command
+@cindex @code{nice} command, for lower priority
+@cindex jobs, running at low priority
+@cindex background, running processes at a low priority
+The @code{nice} command causes a background process to be run at a 
+low priority.  The operating system runs any commands specified by
+@code{nice} when the machine has nothing else to do (it runs those 
+commands less often than normal).  This way, commands that normally 
+consume large amounts of system resources, slowing the system
+considerably, are run in stages that don't slow the system down quite
+as much.  Of course, a program that is run at a lower priority takes
+longer to finish, but it doesn't interfere with more important
+programs, either.
+
+The format of the @code{nice} command is:
+
+@example
+nice @r{[}@var{number}@r{]} @var{command-line}
+@end example
+
+@noindent
+where @var{command-line} is the command line you want to place at a
+lower priority.
+If present, the @samp{@var{number}} option causes @code{nice} to
+increment the priority by the amount given, up to a limit of 20.  The
+higher the value given, the lower the command's scheduled priority. 
+The default value for @var{number} is 10.@refill
+
+@c need example: maybe 'nice make -k hairy-program >& log' (rms)
+
+@menu
+* exception::  Using @code{nice} to force processes to run
+               at a higher priority than normal.
+@end menu
+
+@cindex @code{nice} command, using for higher priority
+@c what's a super-user? = root
+Note for advanced users:
+The super-user may give commands a higher priority than normal by using
+a negative @var{number}, for example @samp{-5}.
+@end ignore
+
+@c comments by KELLEM
+@c should `nohup' description be here?  machine specific
+@c maybe should just note that way nohup works is machine dependent
+@node nohup,  , nice, Job Control
+@section Preventing Jobs From Stopping Using @code{nohup}
+
+@c ? stop = be killed = be terminated?
+The @code{nohup} command prevents commands from stopping, or being
+killed, when you log out.
+Normally when you log off your system, any
+commands or processes that are running in the background are
+terminated.
+@c ? aren't suspended processes terminated too?
+@c what happens if you suspend a process started with nohup, then resume
+@c   it?  is it still nohup?
+The @code{nohup} command prevents hangup signals
+(@code{SIGHUP}, normally generated when you log off),
+interrupt signals (@code{SIGINT}, normally generated by @kbd{C-c}),
+and quit signals (@code{SIGQUIT}, normally generated by @kbd{C-\})
+from terminating your program.@refill
+@c ? any other signals disabled?
+
+@cindex @code{nohup} command
+@cindex jobs, the nohup command
+@cindex background, the nohup command
+@cindex preventing job suspension/stopping when logging out
+@cindex logging out, preventing job suspension/stopping
+The format of the @code{nohup} command is:
+
+@example
+nohup @var{command-line}
+@end example
+
+@noindent
+where @var{command-line} is the command you don't want interrupted.
+Any output the @var{command-line} produces is
+put into a file called @file{nohup.out} in your current directory.
+@c ? i.e. output to standard output?
+(If this file cannot be written to your current directory, @code{nohup}
+places it in your home directory.)
+
+@c ?
+THIS DESCRIPTION IS MACHINE SPECIFIC, UNLESS WE HAVE A GNU NOHUP (bfox).
+@c i.e. nohup may not change priority
+@c point of nohup: keep running after hang up
+
+The @code{nohup} command increments the priority by 5.
+(@xref{nice}, for an explanation of priority.).  Make sure that you
+invoke @code{nohup} from the shell prompt with @samp{&}, so that it
+won't respond to interrupt signals, or take input from the next user.
+@c format above should thus show with & ?
+@c ? if it's not given with &, how can you log out?
+@c what next user?
+@c  rms: it still has association with tty#, might respond to c-c etc.
+
+
+@node Combining commands, Editing, Job Control, Top
+@chapter Combining Several Commands on One Line
+
+@node Sequential cmds, Parallel cmds, Combining commands, Combining commands
+@section Sequential Commands
+
+There are several ways to type several commands in one command line,
+such that the commands are executed one after another.
+You can either make the sequence execute unconditionally,
+as if you had typed the commands one after another at the shell prompt;
+or you can make execution of the sequence stop early depending
+on the outcome of one of the commands, as if you had typed the commands
+one at a time and decided whether to continue as you went along.
+
+To do this, give a command of the form
+@example
+@var{command} @r{[}@var{separator} @var{command}@r{]}
+@end example
+That is, give any number of commands with an appropriate separator
+between each pair, as defined in the following:
+
+@table @code
+@item ;
+allows you to put
+several commands on the same line, to be executed sequentially.
+Separate each command from the next with a semicolon, @samp{;}.
+@cindex @code{;}, sequential command sequence
+
+No command in the sequence is executed until you end the line (press
+@key{RET}).
+Then the commands are executed in order, from left to right,
+as if you had typed each separately and waited for it to finish
+before typing the next.
+@cindex separating commands
+@cindex command line, separating commands on a
+
+For example:
+
+@example
+bash$ cp test test-old; du > test; ls -l test*
+@end example
+
+@item &&
+indicates conditional execution of commands in the sequence.
+@samp{&&} means @sc{and}; the trailing commands are executed only if the
+preceding commands are executed successfully.@refill
+@cindex @code{&&}, conditional command sequence
+@cindex joining commands
+@cindex commands, joining
+@cindex pipelines, joining
+@cindex pipelines, conditional execution of
+@cindex commands, conditional execution of
+
+For example, if there is no file named @file{garbage.test},
+then an attempt to list directory information for such a file
+(@samp{ls -l@dots{}}) and an attempt to view its contents (@samp{cat@dots{}})
+will both fail:
+
+@example
+bash$ ls -l garbage.test ;  cat garbage.test
+garbage.test not found
+cat: cannot open garbage.test
+bash$
+@end example
+
+But if @samp{&&} instead of @samp{;} joins the two commands,
+the second command is performed only if the
+first command is successful.  Since the file @file{garbage.test} doesn't exist,
+we get the error message associated with @code{ls} and @code{cat} isn't run:
+
+@example
+bash$ ls -l garbage.test && cat garbage.test
+garbage.test not found
+bash$
+@end example
+
+@item ||
+indicates conditional execution of commands in the sequence.
+@samp{||} means @sc{or}; the remaining commands are executed only if the
+preceding commands are @emph{not} executed successfully.@refill
+@cindex @code{||}, conditional command sequence
+@cindex joining commands
+@cindex commands, joining
+@cindex pipelines, joining
+@cindex pipelines, conditional execution of
+@cindex commands, conditional execution of
+
+For example:
+
+@example
+bash$ cat garbage.test || cat junk.test
+cat: cannot open garbage.test
+This is the contents of junk.test.
+@end example
+
+@noindent
+The first @code{cat} failed to find @file{garbage.test}, so the second
+@code{cat} was performed.
+
+@end table
+
+@node Parallel cmds, Combination precedence, Sequential cmds, Combining commands
+@section Simultaneous Commands
+
+There are two ways to type several commands in one command line,
+such that the commands are executed simultaneously, in separate
+processes.
+You can specify either independent commands or commands whose
+inputs and outputs are linked together.
+
+To do this, give a command of the form
+@example
+@var{command} @r{[}@var{separator} @var{command}@r{]}
+@end example
+That is, give any number of commands with an appropriate separator
+between each pair, as defined in the following:
+
+@table @code
+@item |
+joins commands together into a pipeline.
+The standard output of each command is redirected (connected) to the
+standard input of the next command in the sequence.
+@xref{Pipes}.
+
+@item &
+causes each command to run in the background.
+The commands are executed simultaneously in the background,
+as if you had typed each one separately, terminated with @kbd{&}.
+@xref{Job Control}.
+
+Note: @samp{&} actually terminates commands rather than separating
+them.  This is a difference from the other command combiners in
+this chapter.  Thus be sure to put a @samp{&} after the last command
+as well as between commands, or the last command will @emph{not} run
+in the background.
+
+@end table
+
+@node Combination precedence,  , Parallel cmds, Combining commands
+@section Mixtures of Sequential and Simultaneous Commands
+
+Any or all of the command separators described in this chapter
+(@samp{;}, @samp{&&}, @samp{||}, @samp{|}, @samp{&})
+can be used in a single command.
+
+The order of precedence (from highest to lowest) is
+@table @code
+@item |
+pipeline
+
+@item && @r{and} ||
+``and'' and ``or'', equal precedence, processed from left to right
+
+@item ; @r{and} &
+sequential and background, equal precedence, processed from left to right
+@end table
+
+However, if you have a mixture of operators, you should usually group
+the subcommands with parentheses or braces (@pxref{Grouping}), rather
+than assume you know how the command will be interpreted.
+@c rms: for mixtures of operators, tell them to group with ()
+
+@node Editing, History, Combining commands, Top
+@chapter Command Line Editing
+
+@menu
+* Readline Intro::    An introduction to editing command lines
+                      using @code{readline}.
+
+* Syntax::            The basic editing commands.
+
+* Customizing::       Customizing @code{readline} to use other
+                      key bindings.  Includes a complete list of
+                      all commands used in editing.
+
+* vi mode::     Editing using other modes, including a 
+                      @code{vi} editing mode.
+@end menu
+
+@cindex @code{readline} library
+@cindex command lines, editing
+@cindex editing command lines
+@cindex Emacs, command lines and
+BASH provides powerful facilities for editing the command line
+you are currently typing, so as to minimize the amount of typing
+needed to fix mistakes.
+It also includes facilities to save typing by giving you access to
+earlier commands and by completing things (such as file names) that you have
+not finished typing.
+
+The command-entry features described here are not specially programmed
+into BASH.
+Rather, they are provided by the @code{readline} library, which is used by a
+number of other GNU programs besides BASH.
+This means that you can use the same typing and editing facilities
+with a variety of programs.
+
+By default, @code{readline} has Emacs-like key bindings.
+That is, most features that Emacs also has (such as moving the cursor
+over words or characters) are invoked by the same keystrokes as
+in Emacs.
+@xref{Customizing Readline}, for how to change any key bindings you
+don't like and customize other aspects of @code{readline}'s behavior.
+
+@menu
+* Movement::                Moving about the line.
+* History Commands::        Using previous lines.
+* Text::                    Commands for changing text.
+* Buffer::                  Commands for killing and yanking.
+* Numeric Arguments::       Specifying numeric arguments and
+                            repeat counts.
+* Completion::              Getting @code{readline} to do the
+                            typing for you.
+* Miscellaneous::           Other miscellaneous commands.
+@end menu
+
+@node Readline Commands
+@section @code{readline} Commands
+
+The following sections list all the functions provided by @code{readline}.
+Each entry consists of
+@itemize @bullet
+@item the function name
+You do not need the function name unless you want to change the key
+binding (@pxref{Customizing Readline}).
+
+@item the default key binding (in parentheses)
+This is the key you press to invoke the function.
+If no key binding is shown, then you can't use the function
+unless you bind it to a key (@pxref{Customizing Readline}).
+
+@item a short description of what the function does
+@end itemize
+
+@cindex command editing, advanced
+@cindex editing commands, advanced
+@cindex @code{readline} editing commands, advanced
+
+@node Movement, History Commands, Customizing, Customizing
+@subsection Moving the Cursor
+
+Here are the @code{readline} cursor movement commands:
+
+@cindex @code{readline} library, cursor movement commands
+@cindex cursor movement commands in the @code{readline} library
+@table @asis
+@item beginning-of-line (@kbd{C-a})
+Move to the start of the current line.
+
+@item end-of-line (@kbd{C-e})
+Move to the end of the line.
+
+@item forward-char (@kbd{C-f})
+Move forward (right) one character.
+
+@item backward-char (@kbd{C-b})
+Move backward (left) one character.
+
+@item forward-word (@kbd{M-f})
+Move forward (right) one word.
+
+@item backward-word (@kbd{M-b})
+Move backward (left) one word.
+@end table
+
+@node Text, Buffer, History Commands, Customizing
+@subsection Changing the Command Text
+
+@c new term: 'cursor point'
+@c numeric &/or negative args mentioned but never explained
+
+@cindex @code{readline} library, commands to change text
+@cindex changing text commands in the @code{readline} library
+Here are the @code{readline} commands for text manipulation:
+
+@table @asis
+@item quoted-insert (@kbd{C-q}, @kbd{C-v})
+Add the next character that you type to the line verbatim.  This allows
+you to insert a control character, for example,
+and not have it act as an editing key.
+For example, if you want to search for a @kbd{C-l} in a file,
+you can type the @kbd{C-l} argument to the @code{grep} command
+by typing @kbd{C-q C-l}.
+
+@item tab-insert (@kbd{M-TAB})
+Insert a tab character.
+(A @kbd{TAB} character itself normally invokes completion
+rather than being inserted into the command line -- @pxref{Completion}.)
+
+@item self-insert (a, b, A, 1, !, ...)
+Insert the typed characters verbatim.
+All printing characters except @kbd{TAB} and newline
+@c ? @kbd{RET}  ?
+(i.e., all non-control, non-meta characters)
+@c source: bfox
+are inserted as typed.
+
+@item transpose-chars (@kbd{C-t})
+Interchange the character before the cursor with the character
+at the cursor and position the cursor after both characters.  If the
+cursor point is at the end of the line, then transpose the two
+characters before the cursor point.  Negative arguments are invalid.
+
+@item transpose-words (@kbd{M-t})
+Interchange the word before the cursor with the word
+at the cursor and position the cursor after both words.
+
+@item upcase-word (@kbd{M-u})
+Change the current (or following) word to uppercase and put the cursor
+after the word.  When given with a
+negative argument, the previous word is changed to uppercase, but the
+cursor point is not moved.
+
+@item downcase-word (@kbd{M-l})
+Change the current (or following) word to lowercase and put the cursor
+after the word.  When given with a
+negative argument, the previous word is changed to lowercase, but the
+cursor point is not moved.
+
+@item capitalize-word (@kbd{M-c})
+Capitalize the current (or following) word and put the cursor 
+after the word.  When given with a negative
+argument, the previous word is capitalized, but the cursor point is not
+moved.
+@end table
+
+@node Buffer, Numeric Arguments, Text, Customizing
+@subsection Deleting and Restoring Text
+
+@cindex readline library, killing commands
+@cindex killing commands in the readline library
+@cindex readline library, yanking commands
+@cindex yanking commands in the readline library
+@cindex readline library, buffer commands
+@cindex buffer commands in the readline library
+Here are the @code{readline} commands involved in deleting text and
+restoring previously deleted text.
+
+In the following table, the term @dfn{kill} means to delete text from a
+line, but save that text in a buffer for later retrieval. 
+Usually you retrieve killed text by @dfn{yanking} it back into the
+line.  The term @dfn{yank} means to retrieve text from a buffer and
+insert it at the cursor in the current line.
+Text that is @dfn{deleted} rather than killed is not saved and
+cannot be yanked back.
+
+@table @asis
+@item delete-char (@kbd{C-d})
+Delete the character under the cursor.
+Note: If the cursor is at the
+beginning of the line, there are no characters in the line, and the
+last character typed was not @kbd{C-d}, then @kbd{C-d} means
+end-of-file return @sc{eof}, and BASH exits.
+@c bfox: bash exits (logs you out)!! ignoreeof can protect you from this
+
+@item backward-delete-char (@key{DEL})
+Delete the character behind the cursor.  A numeric argument given with
+this command causes the characters to be killed instead of deleted.
+
+@item kill-word (@kbd{M-d})
+Kill the text from the current cursor position to the end of the
+current word or, if between words, to the end of the next word.
+
+@item backward-kill-word (@kbd{M-DEL})
+Kill the text from the current cursor position to the start of the
+current word or, if between words, to the start of the previous word.
+@c bfox: words delimited by
+@c  when doing completion  space tab nl " \ ` ' @ $ > < =
+@c  in word movement/deletion  non-alphanumeric
+
+@item kill-line (@kbd{C-k})
+Kill the text from the current cursor position to the end of the line.
+
+@item backward-kill-line ()
+Kill backward to the beginning of the line.  That is, kill the text from
+the beginning of the line to the current cursor position.  This is
+normally not bound to a key.  (See @code{unix-line-discard}, which is bound to
+@kbd{C-u}.)
+
+@item unix-line-discard (@kbd{C-u})
+Kill backward to the beginning of the line.
+This is identical to backward-kill-line.
+
+@item unix-word-rubout (@kbd{C-w})
+Kill the text from the current cursor position to the previous
+whitespace.  This is different from @kbd{M-DEL} because the word
+boundaries are different.
+
+@item yank (@kbd{C-y})
+Restore the most recently killed text back into the line at the cursor.
+
+@item yank-pop (@kbd{M-y})
+Restore the next to most recently killed text back into the line at the
+cursor.  You can do this only if the prior command was @kbd{C-y} or
+@kbd{M-y}.
+@end table
+
+@node History Commands, Text, Movement, Customizing
+@subsection Manipulating the Command History
+
+@cindex readline library, history commands
+@cindex history commands in the readline library
+Here are the @code{readline} commands for manipulating the
+command history (@pxref{History List}).
+
+@table @asis
+@item accept-line (@key{RET}, newline character)
+Accept the line regardless of where the cursor is.  If this line is not
+empty, add it to the history list.  If this line was a history line,
+then restore the history line to its original state.
+@c bfox: editing a cmd line retrieved from history
+@c   if execute it, becomes new history line
+@c   if edit it but move back to new line, old line stays edited, marked
+@c     with * in history list -- can undo to restore it
+
+@item previous-history (@kbd{C-p})
+Move up through the history list.
+
+@item next-history (@kbd{C-n})
+Move down through the history list.
+
+@item beginning-of-history (@kbd{M-<})
+Move to the oldest line in the history list.
+
+@item end-of-history (@kbd{M->})
+Move to the most recent line in the history list.
+
+@c must explain searches -- how to abort, when it's executed (RET), etc.
+@c   How get the found line for editing?
+@c  string is inside `', cursor at matching spot, RET executes, or just
+@c  start editing it -- it becomes current command
+@item reverse-search-history (@kbd{C-r})
+Search backward starting at the current line and moving up through the
+history as necessary.  This is an incremental search.
+
+@item forward-search-history (@kbd{C-s})
+Search forward starting at the current line and moving down through the
+the history.  This is an incremental search.
+@end table
+
+@node Numeric Arguments, Completion, Buffer, Customizing
+@subsection Specifying Numeric Arguments
+
+@cindex readline library, specifying numeric arguments
+@cindex numeric arguments, specifying in the readline library
+Here is how you specify numeric arguments in @code{readline}:
+
+@c explain what args are for, where can use them
+
+@table @asis
+@item digit-argument (@kbd{M-0}, @kbd{M-1}, ... @kbd{M--})
+Add this digit to the argument already accumulating, or start a new
+argument.  @kbd{M--} (meta-minus) starts a negative argument.
+
+@item universal-argument ()
+This lets you type numeric argument digits without metafying.
+To start a negative argument use the minus key.
+@c use minus when? after the ^U (or whatever bound to)
+A minus sign alone, with no other digits following, means @minus{}1.
+
+This is normally not bound to a key.
+
+Assume you have bound @kbd{C-u} to universal-argument.  Then
+@kbd{C-u} followed by a character that is neither a digit nor a minus
+sign means ``multiply the next argument by 4''.  @kbd{C-u C-u} means
+multiply the next argument by 16.
+@c possible to reword without mentioning C-u ?
+@c  probably not, if unbound commands are inaccessible
+@end table
+
+@node Completion, Miscellaneous, Numeric Arguments, Customizing
+@subsection Completion:  Letting @code{readline} Type For You
+
+@cindex readline library, completion commands
+@cindex readline library, shortcut commands
+@cindex completion commands in the readline library
+@cindex shortcut commands in the readline library
+
+You can save typing by asking for completion of the word you are in the
+midst of typing.  The system can complete partially-typed file names,
+command names, variable names, user names, and host names.  You can
+either specify the type of completion you would like to perform on the
+text before the cursor, or you can let the system guess what kind of
+name is being typed and complete it accordingly.
+
+@table @asis
+@item complete (@key{TAB})
+Try to complete the text before the cursor
+
+In particular,
+@c source: bfox
+@itemize @bullet
+@item variable
+
+If the word before the cursor starts with @samp{$},
+try to complete it as a variable name.
+
+@item user
+
+If the word before the cursor starts with @samp{~},
+try to complete it as a user name.
+
+@item host
+
+If the word before the cursor starts with @samp{@@},
+try to complete it as a host name.
+
+@item command
+
+If the word before the cursor is the first word in
+the command line, try to complete it as a command name.
+@c e.g. ema<TAB>-->emacs
+
+@item file
+
+If none of the above cases apply,
+try to complete the word before the cursor as a file name.
+@end itemize
+
+@item possible-completions (@kbd{M-?})
+List the possible completions of the text before the cursor.
+See above for what kind of completion is assumed.
+
+@c JEMS: tested 1/7/91 -- not all worked (bfox says fixed)
+@item complete-variable (@kbd{M-$})
+@itemx possible-variable-completions (@kbd{C-x $})
+@itemx complete-username (@kbd{M-~})
+@itemx possible-username-completions (@kbd{C-x ~})
+@itemx complete-hostname (@kbd{M-@@})
+@itemx possible-hostname-completions (@kbd{C-x @@})
+@itemx complete-command (@kbd{M-!})
+@itemx possible-command-completions (@kbd{C-x !})
+@itemx complete-filename (@kbd{M-/})
+@itemx possible-filename-completions (@kbd{C-x /})
+@c rewrite
+Each of these specify the type of completion you would like to perform
+on the text before the cursor, whether it be filename, username,
+hostname, variable name, or hostname completion, respectively.  These
+BASH-specific @code{readline} commands do not depend on a prefix
+character; though, if one is there, such as the dollar sign, @samp{$},
+at the beginning of variable names, the commands will still work.@refill
+
+The @code{possible-@dots{}-completions} commands are similar in
+functionality to the @code{possible-completions} command.
+
+Note that the specific completion commands are specific to BASH and are
+@emph{not} defined in the @code{readline} library.
+@end table
+
+@node Miscellaneous,  , Completion, Customizing
+@subsection Some Miscellaneous Commands
+
+@cindex readline library, miscellaneous commands
+@cindex miscellaneous commands in the readline library
+
+@table @asis
+
+@item clear-screen (@kbd{C-l})
+Clear the screen, leaving the current line at the top of the screen.
+
+@item abort (@kbd{C-g})
+Sounds the warning bell and stops whatever was happening when you typed
+these keystrokes.
+For example, @kbd{C-g} can be used to abort entry of a numeric
+argument (@pxref{Numeric Arguments}) or a search through command
+history (@pxref{History Commands}).
+
+@item do-uppercase-version (@kbd{M-a}, @kbd{M-b}, ...)
+Run the command that is bound to the named, but uppercase, command.
+@c bfox: M-a can be bound differently from M-A
+@c   normally, M-a looks up & runs M-A
+@c  if you rebind it, they're different
+@c  **be careful in .inputrc to bind correct case
+@c    is current doc of .inputrc wrong??
+
+@item prefix-meta (@kbd{@key{ESC}})
+@emph{Metafy} the next character that you type.  This is for
+people without a @key{META} key.  @kbd{@key{ESC} f} is equivalent to
+@kbd{M-f}.
+
+@c I have no idea what the 'last thing' is.
+@c empirically: successive C-- (note: I typed hyphen, not underscore) insert
+@c   sucessive deletions or delete a whole contiguous set of insertion (typein)
+@c bfox: consecutive insertions up to n is 1 thing
+@item undo (@kbd{C-_})
+This is the incremental undo.  Undo the last thing that you did.
+@c last thing in current cmd?
+You can undo all the way back to an empty line.
+@c bfox: history has edits saved, so can undo them too
+
+@item revert-line (@kbd{M-r})
+Undo all changes made to this line.  This is like typing the ``undo''
+command enough times to get back to the beginning of your corrections
+for that line.
+@end table
+
+@node Customizing Readline, vi mode, Syntax, Editing
+@section Customizing @code{readline}
+
+@c ? to define/explain:  home directory, ~/ (= home dir?)
+
+You can customize programs that use @code{readline} by putting commands
+in a @code{readline} initialization file,
+named @file{.inputrc}, in your home directory.
+When a program (such as BASH) that uses the @code{readline} library
+starts up, it checks the file @file{~/.inputrc} to set up its key bindings
+and other parameters to your liking.
+@c KELLEM's comments follow
+@c footnote{Currently, both @code{gdb} and @code{bash} use the
+@c @code{readline} library.  Future interactive GNU Project programs
+@c will also incorporate the @code{readline} library.}
+
+You can also force the initialization file to be reread
+(for example, if you modify it and want to use your modifications
+in BASH without logging out and logging in again)
+by typing @kbd{C-x C-r} (the default key binding for 
+@code{readline}'s @samp{re-read-init-file} function.
+@c ?? re-read-init-file not documented above
+@cindex @file{.inputrc} file, re-reading the
+@cindex re-reading the @file{.inputrc} file
+
+Three kinds of lines can appear in this initialization file:
+@itemize bullet
+@item comment
+
+A line starting with @samp{#} is a comment.
+
+@item key binding
+
+@xref{Readline Key Bindings}.
+
+@item variable setting
+
+@xref{vi mode}.
+@xref{Readline Variables}.
+@end itemize
+
+@node Readline Key Bindings
+@subsection Key Bindings
+
+@cindex readline library, customizing
+@cindex editing commands, customizing
+@cindex customizing readline library commands
+Although the @code{readline} library comes with a set of Emacs-like key
+bindings, it is possible that you would like to use different keys.
+
+To bind a @code{readline} function to a key, place a line of the form
+
+@example
+@var{key-name}: @var{readline-function}
+@end example
+
+@noindent
+or
+
+@example
+@var{key-name}: @var{readline-function} @var{comment}
+@end example
+
+@noindent
+in the @file{~/.inputrc} file.  
+@xref{Readline Commands}, for the function names and their default key bindings.
+Any text after the @var{readline-function} is considered to be a
+comment and is ignored.
+Key names are explained below.
+
+For example,
+
+@example
+C-u:   universal-argument
+@end example
+
+@noindent
+or
+
+@example
+C-u:   universal-argument  used to be unix-line-discard
+@end example
+
+@noindent
+binds @kbd{C-u} (which is initially bound to @code{unix-line-discard})
+to @code{universal-argument} (which is not bound to any key by default).
+
+
+@heading Key Names 
+
+@c needs rewriting
+For the key name, you can use the name of the key combination,
+such as @kbd{C-f}.  The various ``words'' you can use to describe keys
+are:
+
+@table @key
+@item Control-@kbd{k}
+@itemx C-@kbd{k}
+Holding down the control key and pressing the @kbd{k} key.
+
+@item Meta-@kbd{k}
+@itemx M-@kbd{k}
+Holding down the meta key and pressing the @kbd{k} key.
+@xref{Notation}, for alternative ways of metafying a key.
+
+@item Rubout
+@itemx DEL
+The delete key.
+
+@item Escape
+@item ESC
+The escape key, or @kbd{Control-[}.
+
+@itemx RETURN
+The enter (or return) key.
+
+@item Space
+@itemx SPC
+The space bar.
+
+@item LFD
+@itemx NEWLINE
+The @kbd{Control-j} key.
+
+@item TAB
+The tab key.
+@end table
+
+@heading Key Sequences
+
+You can also specify an arbitrary key sequence instead of a single key:
+
+@example
+@var{key-sequence}: @var{readline-function} @var{comment}
+@end example
+
+To do so, surround the sequence in double quotes.
+@c example
+
+@c rewrite
+If you want to use the @key{C-} or @key{M-}
+specifications inside double quotes, you need to precede it with a
+backslash (@samp{\}).  You can also specify the escape character with
+@samp{\e}.  Note that you cannot use the ``words'' listed above, only:
+
+@example
+"\C-k"
+"\M-k"
+"\e"
+@end example
+
+@heading Macros
+
+You can bind a key (or key sequence) to a key sequence instead of
+to a named function.
+@c rewrite
+To do so, instead of a function name,
+give the key sequence in double quotes.
+Keys in this sequence are named as explained above
+under ``Key Sequences''
+
+@c example
+@c format, with comment
+
+@node vi mode,  , Customizing, Editing
+@subsection @code{vi} mode in @code{readline}
+
+@cindex readline library, VI commands
+@cindex VI commands in the readline library
+@c KELLEM wants to change @code{vi} to @sc{vi} in this section
+The @code{readline} library does not have a full set of @code{vi}
+editing functions, but it does contain enough to allow simple editing of
+a line.
+
+To switch interactively between Emacs and @code{vi} 
+editing modes, use the command @kbd{M-C-j} (toggle-editing-mode).
+@c why not listed in fns above? -- add it there
+@c bfox: vi: start in insert mode
+@c   get into cmd mode by doing ESC; then M-C-j
+@c   press ESC till beeps, then M-C-j
+@c  beware of accidentally getting into vi mode!
+To enter the @code{vi}-like editing mode directly,
+without starting in Emacs mode, place the command:
+
+@example
+@code{set editing-mode vi}
+@end example
+
+@noindent
+in your @file{~/.inputrc} file.
+
+@c what about 'set -o vi...' (vs. 'set -o emacs...')
+
+When you enter a line in @code{vi} mode, you are already placed in
+``insertion'' mode, as if you had typed an @samp{i}.  Pressing @key{ESC}
+switches you into ``edit'' mode, where you can edit the text of the line
+with the standard @code{vi} keys.  Since @code{vi} is not an
+officially supported Free Software Foundation product, we won't explain
+the key bindings here.
+@c reference?
+@c KELLEM: probably should, at least, give a list of key/function list for vi
+@c mode.. maybe as an appendix?
+
+
+@node Readline Variables
+@subsection Other @code{readline} Variables
+
+@c KELLEM supplied most of this section's content
+
+In addition to @code{editing-mode} (@pxref{vi mode}),
+there are a number of
+other variables that can be set in @file{~/.inputrc} to
+affect @code{readline}'s behavior.
+
+To set a variable, put a line of the form
+
+@example
+set @var{readline-variable-name} @var{setting}
+@end example
+
+@noindent
+in the initialization file.
+
+The current @code{readline} variables are:
+
+@table @code
+@item editing-mode
+specifies the default editing mode for the
+@code{readline} library.  You can specify either emacs-style or vi-style
+default key bindings.  The default is emacs-style key bindings.
+The meaningful settings of @var{editing-mode} are:
+@table @code
+@item emacs
+
+@item vi
+@xref{vi mode}, for more information.
+@end table
+
+@item horizontal-scroll-mode
+determines how to display lines longer than the width of your display.
+The meaningful settings of @var{horizontal-scroll-mode} are:
+@table @code
+@item Off
+If @code{horizontal-scroll-mode} is set to @code{Off}
+(actually, any value other than @code{On} is treated as @code{Off}), lines are
+``wrapped'' when they extend beyond the width of the display.
+Such a line takes more than one line on the screen,
+but it still counts as a single line.
+(For example, @kbd{C-a} still goes to the very beginning.)
+
+@item On
+If @code{horizontal-scroll-mode} is set to @samp{On}, the
+line is shifted to the left about a third of the display's width when
+the cursor extends beyond the right side of the display.
+That is, the input line is scrolled between the two edges of the
+screen so that the current part is visible, though other parts may not be.
+@c test this
+@end table
+
+@noindent
+The default value of @code{horizontal-scroll-mode} is @code{Off}.
+
+@item mark-modified-lines
+specifies whether or not to ``mark''
+modified history lines with an asterisk, @samp{*}.
+The meaningful settings of @code{mark-modified-lines} are:
+@table @code
+@item Off
+Modified history lines are not marked.
+
+@item On
+Modified history lines are marked.
+@end table
+The default value of @code{mark-modified-lines} is @code{Off}.
+
+@end table
+
+
+@c next sec added by KELLEM
+@node Inputrc File,  , Other Scripts, Start-up
+@subsection A Sample @file{~/.inputrc} file
+
+@cindex inputrc file, customizing readline
+@cindex inputrc file
+@cindex customizing readline library, sample
+@cindex readline library, sample customization file
+@cindex editing commands, sample customization file
+
+Here's an example of a simple @code{readline}
+customization file, @file{~/.inputrc}:
+
+@example
+# -*- text -*-
+# File: ~/.inputrc
+# This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing programs
+# include Camera, Bash, and Gdb.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# Set various bindings for emacs_mode.
+
+Meta-Rubout:   backward-kill-word  Stuff after the function name ignored
+#Control-u:    universal-argument
+
+# Note that the order of the words doesn't matter.
+Meta-Control-r:        revert-line
+Control-Meta-u: revert-line
+C-Meta-T:      transpose-words
+M-C-k:         transpose-chars
+"\C-x\C-?":    backward-kill-line
+
+# This line is bad syntax. It should have the M- before the C-.
+# But it works.
+"\C-\M-f":     forward-word            
+
+# Here is a macro definition.  You can tell because the right-hand
+# side is in quotes.
+#"\C-xr":      "\C-a\C-kemacs -f rmail\C-j\C-y"
+
+# Bind the arrow keys. (good for sun and vt220, vt100, etc.. )
+"\e[A":                previous-history
+"\e[B":                next-history
+"\e[D":                backward-char
+"\e[C":                forward-char
+
+# help key macro
+"\e[28~":      "\C-a\C-khelp | less\C-j\C-y"   VT220 help key
+"\e[3~":       delete-char                     VT220 remove key
+# C-r is reverse-search-history
+"\e[1~":       "\C-r"                          VT220 find key
+
+# Select the mode.
+set editing-mode emacs
+set horizontal-scroll-mode On
+@end example
+@ignore
+@c alternative for arrow keys
+"\M-[A":  previous-history
+"\M-[B":  next-history
+"\M-[C":  forward-char
+"\M-[D":  backward-char
+@end ignore
+
+
+@node History, Line, Editing, Top
+@chapter History Substitution
+
+@cindex history library
+
+BASH provides facilities to remember commands and let you reuse them.
+
+The command-history features described here are not specially programmed
+into BASH.
+Rather, they are provided by the history library, which is used by a
+number of other GNU programs besides BASH.
+(In general, programs that use @code{readline} also use history.)
+This means that you can use the same history facilities
+with a variety of programs.
+
+The history library maintains a list of recent command lines, or
+@dfn{events}.
+@cindex event, in command history
+It provides you
+with functions for remembering lines on a history list,
+searching through the list for a line containing an arbitrary text
+string, and referencing any line on the list directly.  In addition, a
+history expansion function is available which allows you to easily use
+those command lines again as is, or with some modifications, with very
+little additional typing.
+
+@cindex history library, using readline library instead
+@cindex readline library, using instead of history library
+If you find using the history library too difficult, you can use the
+readline library instead (@pxref{Editing}).  The readline library
+includes history manipulation by default,
+@c by default?  is it ever not there?
+and has the added advantage of Emacs-style command line editing.
+@c any reason to use ! ever?
+
+@menu
+* Using History::    Using history substitution.
+
+* Events::           How to specify which history line to use.
+
+* Words::            Selecting words from an event.
+
+* Modifiers::        Modifying previous events.
+
+* History Size::     Changing the number of history lines saved.
+
+* History Shortcuts:: History substitution shortcuts.
+
+* History Protection:: History substitution delimiters.
+
+@end menu
+
+
+@node Using History, Events, History, History
+@section How to Use History Substitution
+
+If you type the command @code{history} on a line by itself, you are
+presented with a list of events stored in the history list.  For
+example:
+
+@cindex history library, how to use the
+@example
+bash$ history
+
+     1   cd News
+     2   ls
+     3   ls -l
+     4   more tobob.doc
+     5   mail bob
+     6   rm tobob.doc
+     7   ls
+     8   cat memo 
+     9   history
+@end example
+
+@noindent
+The events are numbered from the oldest command typed (in this case,
+number 1) to the latest command typed (in this case, number 9).
+
+You can re-execute any event in a history list.  First you have to
+determine which line from the previous history to use, then you need to
+select portions of that line for inclusion in the current one.
+
+The line selected from the previous history is called the @dfn{event},
+and the portions of that line that are acted upon are called
+@dfn{words}.  The line is broken into words in the same fashion that
+the BASH shell does, so that text surrounded by quotes is considered to
+be one word (@pxref{Quotation}).
+
+@node Events, Words, Using History, History
+@section Determining Which History Line to Use
+
+@cindex history library, events in
+@cindex events, history library and
+@cindex history, determining events
+@c why called substitution?
+By far the most common use of this @dfn{history substitution} is simply
+to reuse an entire line.  One way this can be done is to enter a
+line which consists of @samp{!} followed immediately by enough
+characters to uniquely identify the beginning of the line you want to
+reuse.  For example, @samp{!cat} re-runs the last @code{cat}
+process (@samp{cat memo}) in the above history list:
+
+@example
+bash$ !cat
+cat memo
+This is a memo.
+bash$
+@end example
+
+@cindex command lines, reusing
+@cindex reusing command lines
+@cindex history, reusing command lines
+Another way to reuse a line is to follow the @samp{!} with a number,
+which specifies which line in the history list to use.  For example, to
+reuse @samp{cat memo} we could have typed:
+
+@example
+bash$ !8
+cat memo
+This is a memo.
+bash$
+@end example
+
+A third way is to type @samp{!?@var{string}}, which says to look
+backwards through the history for the first line which contains
+@var{string}.  Here's yet another way of re-using @samp{cat memo}:
+
+@example
+bash$ !?memo
+cat memo
+This is a memo.
+bash$
+@end example
+
+@cindex events, referring to
+@cindex history, referring to events
+As we have just demonstrated, there are several ways to refer to an
+event:  you can use its relative position in the history list,
+@c relative position not demonstrated above?
+its absolute position in the history list, or any text the event may
+contain.  Here is a table summarizing the various ways to refer to an
+event:
+
+@table @code
+@item !!
+refers to the previous command.
+
+@item !@var{n}
+refers to an event by its absolute position in the history
+list.  It refers to command line number @var{n}, where 
+@var{n} is the line number shown by the @code{history} command.
+
+@item !-@var{n}
+refers to an event by its relative position in the history
+list.  It refers to the command line @var{n} before the current line.
+
+For example:
+
+@example
+bash$ echo a
+a
+bash$ echo b
+b
+bash$ !-2
+echo a
+a
+bash$
+@end example
+
+@noindent
+@samp{!-2} may be used to re-run the command prior to the last command
+entered.  Successive usage of @samp{!-2} may be used to cycle the last
+two commands.  In fact, the last @var{n} commands may be cycled through
+repeatedly by using @samp{!-@var{n}}.
+
+@item !@var{string}
+refers to the most recent command @emph{beginning} with @var{string}.
+
+@item !?@var{string}
+@itemx !?@var{string}?
+refers to
+the most recent command containing @var{string}.  The closing
+@samp{?} is optional, and is necessary only when you need to separate
+the event designator from additional text.
+@c explain need to separate
+
+Here's an example.  Given the following two commands, entered in this
+order:
+
+@example
+bash$ cp /etc/motd ~
+bash$ rcp /etc/motd unsuspecting:/etc/motd
+@end example
+
+@noindent
+@samp{!cp} matches the first command, while @samp{!?cp} matches the
+second command.
+
+@item !#
+@itemx !:#
+both refer to the current line so far.  For example:
+
+@example
+bash$ echo foo !#
+echo foo echo foo
+foo echo foo
+bash$
+@end example
+@end table
+
+No matter which way you choose to refer to an event, the shell searches
+its history list from the most recent event to the least recent event,
+until it finds a match for your request.  If your request is too
+ambiguous,
+@c what ambiguity is possible?  all are numbers or refer to most recent
+or if no such event exists, you are given an error message.
+
+Whenever the shell sees the special character
+@samp{!} in a command line, it checks the history list and makes the
+appropriate substitution.  There are some exceptions:  if @samp{!} is
+followed by a @key{SPC}, @key{TAB}, @key{RET}, @samp{=} or @samp{(}, or
+preceded by @samp{<} or @samp{|}, history substitution does not take
+place.
+@c should samp's in above be kbd's?  should key's be wrapped in kbd's?
+@c why are those contexts exceptional?  what DOES happen?
+@c why not also preceding b [, for filename patterns?
+
+@node Words, Modifiers, Events, History
+@section Words Within Events
+
+@cindex history, words in
+@cindex history, selecting words
+@cindex words, selecting from history
+It is possible to select and use only portions of an event.  You can
+select any word, or series of words, from an event.  Several words
+surrounded by quotes are considered to be one word.
+@c single quotes? double quotes?
+
+The words of an event line are numbered from left to right, with the
+first word (the command name) being 0.  For example:
+
+@example
+bash$ echo one two three four five
+@end example
+
+@noindent
+In this example, word 0 is @code{echo}, and word 5 is @code{five}.
+
+To specify a particular word from a previous event, follow the event
+specification with a colon, @samp{:}, and a designator for the desired
+word, or words, from that event.  The word designators are:
+@c must define 'event spec' above
+
+@table @code
+@item 0
+The number 0 represents the first word, which is almost always the
+command name.
+
+@item @var{n}
+This matches the @var{n}'th word.
+
+@item ^
+This is a special notation representing the first argument (that is,
+word 1).
+
+@item $
+This is a special notation representing the last argument.
+
+@item %
+This represents the word matched by the most recent pattern search,
+@code{?@var{string}@r{[}?@r{]}}.
+
+@item @var{x}-@var{y}
+This matches a range of words.
+@c inclusive
+
+@item -@var{y}
+This is equivalent to the range @code{0-@var{y}}.
+
+@item *
+This matches all the words after word 0, up to and including the last
+word.  This is similar to matching the range @code{^-$}, except
+@code{*} can match 0 or more words, while @code{^-$} must match 1 or
+more words.
+
+@item @var{x}*
+This is equivalent to the range @code{@var{x}-$}.
+
+@item @var{x}-
+This is equivalent to the range @code{@var{x}-($-1)}.
+@c what's that useful for?  looks bizarre
+@end table
+
+The @samp{:} that separates the event specification from the word
+designator can be omitted if the word designator begins with a @kbd{^},
+@kbd{$}, @kbd{*} or @kbd{%}.
+@c but not - ?
+When referring to the immediately
+preceding command, you can omit the line identifier if you want.
+Therefore, @samp{!:2} refers to word 2 in the previous command line.@refill
+
+Note that @samp{!} alone on a line means nothing in terms of history
+expansion.  Also, if an event contains more than one command line
+separated by semicolons, the semicolons count as words too.
+
+Here are several examples using the various word designators in the
+above table:
+
+@example
+bash$ mkdir /nfs/cwjcc/fs2/src/Gnu/src/bash/1.06
+bash$ mv bash.tar.Z !$
+mv /nfs/cwjcc/fs2/src/Gnu/src/bash/1.06
+bash$ cd !$
+cd /nfs/cwjcc/fs2/src/Gnu/src/bash/1.06
+@end example
+@c should the mv response include bash.tar.Z ??
+
+@noindent
+This example uses the shorthand for the last word on a command line to
+avoid typing in a lengthy path name more than once.
+@c show equivalent & explain that !=prev cmd, $=last wd
+
+@c need a REAL example
+@example
+bash$ echo a
+a
+bash$ !! b
+echo a b
+a b
+bash$ !! c
+echo a b c
+a b c
+bash$ echo !*
+echo a b c
+a b c
+@end example
+@c above, shows expanded cmd before does it.
+@c not all examples do, but all should
+
+@noindent
+This example demonstrates how you can build up a command line
+with successive applications of the @samp{!!} notation.  You then use
+the @samp{!*} expansion to make use of all arguments accumulated so
+far.
+
+@example
+bash$ cc -o prog -g a.c b.c c.c
+bash$ cmd=!:0 output=!:2 optimize=!:3 files="!:4-$"
+@end example
+@c what's cc, what's cmd= ?
+
+@noindent
+@c explain
+This shows one possible use of the history facilities to break up
+command lines into individual elements.  After the second command, the
+individual portions of the command may be reused, perhaps to print the
+source files just compiled with @samp{lpr $files}.
+
+@node Modifiers, History Size History, Words, History
+@section Modifying Previous Events
+
+@cindex history, modifying previous events
+@cindex events, modifying previous
+@cindex modifying previous events
+Sometimes you don't want to re-execute an event exactly.
+Perhaps you
+mis-typed a file name, or want to substitute a new pathname, or a
+different argument.  Whatever the reason, you can modify an event, or
+any word of an event, by following that event with a colon, @samp{:},
+and a modifier.
+
+Here is a list of modifiers and their explanations:
+
+@c terminology to explain: pathname, head, filename extension, basename, tail
+@table @code
+@item h
+This removes the last element of a pathname, leaving the only the @emph{head}.
+
+@item r
+This removes a filename extension, or trailing suffix
+@samp{.@var{xxx}}, leaving only the @emph{root}.
+
+@item e
+This removes all @emph{but} the filename @emph{extension}, or trailing suffix
+@samp{.@var{xxx}}.
+
+@item t
+This removes all of the leading pathname components, leaving only the
+@emph{tail}.
+
+@item s/@var{string1}/@var{string2}
+This @emph{substitutes} the value of @var{string2} for @var{string1} the
+first time it appears.  If the @code{g} flag is given as well, the
+changes take place globally; that is, all occurrences of @var{string1}
+are replaced with @var{string2}.
+
+@item p
+This @emph{prints} the new command but does not execute it.  This
+allows you to preview the effects of modifiers safely.
+
+@c s and gs added by KELLEM
+@item s/@var{this}/@var{that}
+substitutes the first occurrence of @var{this} with @var{that} on
+the specified history line.
+
+@item gs/@var{this}/@var{that}
+globally substitutes @var{this} with @var{that} on the specified
+history line.
+@end table
+
+The modification is applied only to the first applicable word
+on the line.  If there are two or more occurrences on that line, the
+subsequent occurrences are not changed.  If no word on the line is
+applicable, then you get an error message.
+
+Here are some examples of reusing command lines with slight
+modification:
+
+@example
+bash$ diff -c2 old/shell.c shell.c > shell.diffs
+bash$ !!:gs/shell/builtins
+diff -c2 old/builtins.c builtins.c > builtins.diffs
+@end example
+
+@noindent
+This example demonstrates the use of the substitution mechanism to
+re-run a command.  This example may be used repeatedly to create
+``diffs'' of a number of changed files without retyping the lengthy
+command each time.
+
+@example
+bash$ echo /a/b/c/d
+bash$ head="!:1:h" tail="!:1:t"
+bash$ echo $head $tail
+/a/b/c d
+@end example
+@c what's the = ? variable setting?
+
+@noindent
+This shows a possible use for the filename splitting facilities.
+
+@example
+bash$ edit file.c
+bash$ f="!:1:r" ; echo making $@{f@}.o ; make $@{f@}.o ; unset f
+@end example
+
+@noindent
+This is a rather clumsy way to remake an object file from a
+just-modified source file.  While this example shows the use of the
+history library, there are easier ways to remake an object file.  For
+example you can encapsulate the @code{echo} and @code{make} into a
+function, like this:
+
+@c ?
+@example
+bash$ type make_o
+make_o is a function
+make_o ()
+@{
+     echo making $@{1@}.o
+     make $@{1@}.o
+@}
+bash$ edit file.c
+bash$ make_o !:1:r
+make_o file
+@end example
+
+@node History Shortcuts, History Protection, History Size History, History
+@section Shortcuts
+
+@cindex command lines, making changes to
+@cindex command lines, history library and
+A @samp{^} at the beginning of a command line is a special way to
+designate that you want to make changes, or corrections, to the
+previous command line.  In this case, @samp{^} is equivalent to
+@samp{!:s^}, and provides a convenient and special shorthand for making
+substitutions to the (immediately) preceding event.  The syntax for
+this substitution is:
+
+@example
+^@var{old}^@var{new}
+@end example
+
+@noindent
+The @var{old} characters between the two @samp{^} are replaced by the
+@var{new} characters following the second @samp{^}.  For example:
+
+@example
+bash$ mroe parse.y
+bash: mroe: command not found
+bash$ ^mroe^more
+@end example
+
+@noindent
+The first command contained a spelling error, resulting in an unknown
+command.  Using the quick substitution feature, we can rerun the
+command with the correct spelling substituted.
+
+@node History Protection,  , History Shortcuts, History
+@section Delimiters
+
+You can delimit a history substitution from the characters that follow
+it by surrounding that substitution with @samp{@{}and @samp{@}}.  For
+example:
+
+@example
+bash$ make flags.o
+          @r{[} errors compiling flags.c @r{]}
+bash$ edit @{!$:r@}.c
+@end example
+@c explain: !... means last arg basename, namely 'flags'
+
+@noindent
+In the above example, we attempt to use the @code{make} command to
+create @file{flags.o} from @file{flags.c}.  There are errors in
+@file{flags.c}, so history substitution is used to create the name of
+the source file so that it can be edited.
+
+@c can't understand next paragraph -- what makes the {} a NOP?
+@c also, if braces not needed here, need better example.
+While braces are not strictly necessary in this example, note that the
+braces are not treated specially by the history substitution mechanism
+in any way.  This works because brace expansion is enabled on our
+version of BASH.  @emph{If brace expansion is not enabled, enclosing a
+history substitution in braces will cause those braces to be retained.}
+
+@node Quotation,  , echo, File Names
+@chapter Preventing Shell Interpretation of Special Characters
+
+@c Is quoting for other parts of commands too, or just for wildcards?
+@c (Current chapter separated from old wildcard chapter)
+@c sounds more general
+
+@cindex command lines, quoting
+@cindex quoting
+There are times when you want the shell to treat special characters as
+regular characters, and not expand or interpret them.
+@c what does 'interpreted' mean?  different from 'expanded'?
+To do this,
+you must @dfn{quote} the special character by preceding the character
+with a @samp{\} or by surrounding the character (or part of
+the argument containing it) with single or double quotes.
+@c justification?  isn't it bad & very rare to have file names with
+@c special chars in them?
+
+@table @code
+@item \
+The backslash, @samp{\},
+forces the character that follows it to have its literal
+meaning, suppressing any special interpretation in the shell.
+Exception: A
+backslash followed by a newline character signifies a continuation of
+a shell command line onto the following line (@pxref{Continuation}).
+@c newline=RET ?
+  
+Note that the backslash protects a single character, not a string
+of characters.
+
+For example, @samp{rm bad*name} deletes all files whose names start with
+@samp{bad} and end with @samp{name}, whereas @samp{rm bad\*name} deletes
+only the file named @file{bad*name}.  The @samp{\} prevents the shell
+from interpreting the @samp{*} as a wildcard.
+
+You can protect the backslash itself from being interpreted by the
+shell by preceding it with another backslash.
+@c example
+
+@item '@dots{}'
+Single quotes turn off the special meanings of @emph{every} character
+between them.  All these characters are taken literally.  This allows
+you to include blank characters in a string.  For example:
+@c huh? why are blanks interesting?  how relate to file names?
+@c '...' equivalent to \ in front of every char?
+
+@c what does example have to do with wildcards?
+@c what are such strings for?
+@example
+'This $#?!!# sentence is taken literally.'
+@end example
+@c example with > 1 wildcard instead?  e.g. rm bad?*name vs.
+@c  rm bad'?*'name = rm 'bad?*name'
+
+Note that even the backslash character is treated literally between
+single quotes.  Therefore, there is no way to include single quotes
+themselves in the string.
+@c explain or remove
+
+@item "@dots{}"
+Double quotes turn off the special meanings of every character between
+them @emph{except} @samp{$}, @samp{'}, and @samp{\}.  The characters
+@samp{$} and @samp{'} retain their special meanings within double
+quotes.  When surrounded by double quotes, the backslash, @samp{\},
+retains its special meaning only when followed by @samp{$}, @samp{`},
+@samp{"}, @samp{\}, or the newline character.
+@c whole "" section has no clear relation to filename wildcards
+
+For example:
+
+@c example not related to file names
+@example
+"The value of test is $test."
+@end example
+
+You can protect a double quotation mark from being interpreted by the
+shell by preceding it with the backslash character, as in @samp{\"}.
+A double quote may be quoted within double quotes by preceding it
+with a backslash.
+
+Warning: the special parameters @samp{$*} and @samp{$@@} have special
+meanings when inside double quotes (@pxref{Predefined}).
+@end table
+
+@c following par: need examples of why/when need such chars quoted
+You should quote any special character if you
+do not want the shell to use that character's special meaning. 
+Therefore quote all redirection operators, wildcard characters,
+command-line characters, quote characters, and grouping characters if
+they are to represent themselves.  In particular, the following
+characters should be quoted if they are to represent themselves:
+@cindex quote, when to
+
+@example
+  !  |  &  ;  <  >  (  )  $  `  '  "  \  *  ?  [  ]  #
+@end example
+@c above is all special chars?  what about : { }  (others?)
+
+@noindent
+In addition, you should always quote the space, tab, and newline
+characters if they are not to be interpreted by the shell.  You can
+use single or double quotes around an entire argument or word, or
+around just part of one.  For example:
+
+@example
+make CC="cc -O"
+@end example
+@noindent
+shows how to specify @samp{cc -O} as the compilation command.
+
+@node Advanced Redirection
+@chapter Redirecting Input and Output (Advanced)
+
+@node Other Redirections, Pipes, Here-documents, I/O
+@section Redirection Using File Descriptors
+
+@cindex redirection operators, with file descriptors
+@cindex file descriptors
+@cindex standard input, redirecting
+@cindex standard output, redirecting
+@cindex standard error, redirecting
+@cindex redirecting input and output
+The basic redirection operations (@pxref{Redirection})
+are actually special cases of a more general mechanism for
+affecting the input and output files used by programs.
+
+Programs actually do their input and output in terms of @dfn{file
+descriptors} (non-negative integers) that are associated with files or
+devices.
+@c bfox: file descr is index to array of file info
+For example, a program might read from file descriptor 3 and
+write to file descriptors 6 and 8.
+The redirection operators are a means of associating open files with
+file descriptors, so that such a program will use the desired files.
+
+In order for the shell to be able to set up command input and output
+in simple, general ways -- hooking commands together with pipes
+(@pxref{Pipes}) or redirecting input and output to files as shown
+earlier (@pxref{Redirection}) -- certain conventions have been
+established for file descriptors.  Descriptors 0, 1, and 2
+are generally used as follows:
+
+@table @asis
+@item 0
+is called @dfn{standard input}.
+Programs usually read their input from standard input.
+@cindex standard input, file descriptor 0
+
+@item 1
+is called @dfn{standard output}.
+Programs usually write their output to standard output.
+@cindex standard output, file descriptor 1
+
+@item 2
+is called @dfn{standard error}.
+Programs usually write their error messages to standard error.
+@cindex standard error, file descriptor 2
+@end table
+
+Other file descriptors have no standard meaning.
+
+You can redirect any file descriptors you like, but
+not all redirections make sense.  In particular, redirecting a file descriptor
+number that the program doesn't use will have no effect.
+
+In general, a redirection using file descriptors looks like this:
+@ignore
+@c they were each shown with args, but it's probably better to consider
+@c those as part of the command.  E.g. it was:
+@var{command} @r{[}@var{arguments}@r{]} @r{[}@var{n}@r{]}> @var{m}
+@end ignore
+@example
+@var{command} @r{[}@var{n}@r{]}@var{redirection-operator} @var{m}
+@exdent @r{or}
+@var{command} @r{[}@var{n}@r{]}@var{redirection-operator} @var{file}
+@end example
+
+@noindent
+where @var{n} (which is optional) and @var{m} are file descriptors,
+@var{file} is a file,
+and the @var{redirection-operator} is as described below.
+
+Warning:
+If @var{n} is supplied, there must not be any space between it
+and the operator.
+
+If the file descriptor @var{n} is omitted and the first character of
+the redirection operator is @samp{<}, @var{n} defaults to the
+standard input (file descriptor 0).  If @var{n} is
+omitted and the first character of the redirection operator is
+@samp{>}, the @var{n} defaults to the standard output (file
+descriptor 1).
+
+@table @code
+@item @var{n}> @var{file}
+@itemx @var{n}>| @var{file}
+@itemx @var{n}>> @var{file}
+open @var{file} for output on file descriptor @var{n}.
+@var{n} defaults to 1 (standard output).
+Thus the operators @samp{>}, @samp{>|}, and @samp{>>} described earlier,
+which redirect standard output, are equivalent to @samp{1>}, @samp{1>|},
+and @samp{1>>} respectively.
+@cindex @code{>} operator, with file descriptor
+@cindex @code{>|} operator, with file descriptor
+@cindex @code{>>} operator, with file descriptor
+
+@c following itemize is exact copy from basic chapter
+@itemize @bullet
+@item
+If @var{file} doesn't yet exist, it is created.
+
+@item
+If @var{file} already exists:
+@itemize @bullet
+@item
+With @samp{>} and @samp{>|}, @var{file} is erased before the
+first output is written to it.  Be careful:
+If a file of the same name already exists,
+its contents are deleted before your command's output is
+written to that file.
+If you don't want @samp{>} to erase existing files, set the
+shell's @code{noclobber} variable; then
+@samp{>} with an existing file will generate an error message and leave
+the file alone.  (But note that @samp{>|} will clobber existing files
+regardless of the setting of the @code{noclobber} variable.)
+
+@item
+With @samp{>>}, the output is appended to the end of an existing @var{file}.
+@end itemize
+@end itemize
+
+For example:
+
+@example
+bash$ find / -name resume -print 2> /dev/null
+@end example
+
+@noindent
+This command looks for and prints the pathnames of all files
+named @file{resume} by traversing all directories under the @file{/}
+directory.  When @code{find} encounters permission problems (for
+example, directories it does not have permission to read) it prints an
+error message on standard error.  The above redirection @samp{2>
+/dev/null} forces all these error messages to be written to the special
+file @file{/dev/null}, which simply discards these messages so that
+only the requested @file{resume} files are printed on standard output. 
+This saves you from wading through pages of uninteresting error messages
+from @code{find}.
+@c rewrite in terms of utility for redirecting just error w/o output
+
+@item @var{n}< @var{file}
+opens @var{file} for input on file descriptor @var{n}.
+@var{n} defaults to 0 (standard input).
+Thus the operator @samp{<} described earlier, which redirects standard
+input, is equivalent to @samp{0<}.
+@cindex @code{<} operator with file descriptor
+@c what if n=1 or 2(output)?
+@c I tried 'who 1< foo' . Got err msg if foo not exist, no err msg but
+@c    also no output if foo existed (foo left untouched)
+@c bfox: probably who wrote to 1, but it was open for read, not write,
+@c   but who didn't check for errors on write
+
+@cindex redirection operators, reading and writing
+@item @var{n}<> @var{file}
+opens @var{file} for both reading and writing on file descriptor @var{n}.
+@var{n} defaults to 0 (standard input).
+@cindex @code{<>} operator, redirecting input and output
+
+As with @samp{>} (above), an existing @var{file} is erased before the
+first output is written to it unless the shell's @code{noclobber}
+variable is set (in which case @samp{<>} with an existing file will
+generate an error message and leave the file alone.)
+
+@item @var{n}>& @var{m}
+makes the file descriptor @var{n} be a copy of the file descriptor @var{m}.
+@var{n} defaults to 1 (standard output).
+@c  no requirement that n and/or m be output descriptors?
+@c  n=0(input)  seems harmless
+@c what if m=0(input)?  1>&0 seems to be NOP w no msg
+@c   e.g. date 0<foo 1>&0 sends output (1) to tty, not to foo
+@cindex @code{>&} operator with file descriptor
+
+Thus the redirection @samp{>&@var{file}} described earlier, which
+redirects standard output and standard error to the @var{file},
+is equivalent to @samp{>@var{file} 2>&1}.
+
+For example :
+
+@example
+bash$ make >make.log 2>&1
+@end example
+
+@noindent
+@code{make} produces output both on the standard output (as it executes
+commands) and on the standard error (in the case that a file didn't
+compile correctly, etc.).
+The first redirection operator on the line says to send output for
+the standard output into a file called @file{make.log}.
+The second redirection causes
+output to file descriptor 2 (the standard error) to be output wherever
+the output from file descriptor 1 is going (the standard output).  
+Thus, both the standard error and standard output are written to
+@file{make.log}.  (There is a shorthand for
+redirecting both the standard output and the standard error to a single file.
+@xref{Redirection}, @samp{>&@var{file}}.)
+
+@item @var{n}<& @var{m}
+makes the file descriptor @var{n} be a copy of the file descriptor @var{m}.
+@var{n} defaults to 0 (standard input).
+(Note that @code{@var{n}<& @var{m}} and @code{@var{n}>& @var{m}} behave
+identically except when @var{n} is omitted, in which case they have
+different defaults.)
+@cindex @code{<&} operator with file descriptor
+
+@c note: (bfox) >&- same as <&-, only diff is default value of n
+@item @r{[}@var{n}@r{]}>&-
+closes the file descriptor @var{n}.
+@var{n} defaults to 1 (standard output).
+@c bfox: closes file &  removes association of file w. n
+
+@item @r{[}@var{n}@r{]}<&-
+closes the file descriptor @var{n}.
+@var{n} defaults to 0 (standard input).
+(Note that @code{@r{[}@var{n}@r{]}<&-} and @code{@r{[}@var{n}@r{]}>&-}
+behave identically except when @var{n} is omitted, in which case they
+have different defaults.)
+
+@end table
+
+@heading Multiple Redirections
+
+More than one redirection operator can appear in a command.
+@cindex redirection operators, using multiple
+@emph{The order in which redirections are specified is important.} The
+shell evaluates redirection operators in the order encountered, from
+left to right.  A file descriptor specified with an earlier
+redirection operator can be used by a subsequent redirection.  For
+example:
+
+@c strange example: plain >& does it without file descriptors
+@example
+ls > error-list 2>&1
+@end example
+
+@noindent
+redirects first the standard output (@code{>})
+and then the standard error (@code{2>&1}) to the
+file @file{error-list}, while the command:
+
+@c strange example: plain > does it without file descriptors
+@example
+ls 2>&1 > error-list
+@end example
+
+@noindent
+redirects only the standard output to the file @file{error-list}.  The
+first redirection operator @code{2>&1}
+makes the standard error (2) be a copy of the
+standard output (1) @emph{before} the standard output is redirected to
+@file{error-list} with @code{>}.
+
+@heading Redirection in Pipelines
+
+Each command in a pipeline may
+include redirection operators.  These redirections are performed after
+the pipes that link the commands are created.
+That is, first the standard input and standard output of each command
+in the pipeline are set up as specified by the pipes, then any
+redirections specified in the commands are performed.
+Thus such a redirection can access the standard input and output set up
+by the pipeline.  For example, @samp{2>&1} in the first command in
+a pipeline makes that command's standard error be the same as its standard
+output, hence sends the command's error messages along with its ordinary
+output to the second command in the pipeline.
+
+@node Here-documents, Other Redirections, Redirection, I/O
+@section Redirection to Shell Scripts
+
+@c what are << and <<- for? shellscripts?  probably not a good idea at
+@c tty, so examples with prompts are poor.
+@c  bfox: also good in functions
+@c Posix p.172 calls it 'here-document' in 'shell input file'
+@c add Intro here to explain it.
+@c bfox: say it is traditionally called here-document
+In general, such a redirection of input looks like this:
+
+@ignore
+@c they were each shown with args, but it's probably better to consider
+@c those as part of the command.  E.g. it was:
+@var{command} @r{[}@var{arguments}@r{]} << @var{word}
+@end ignore
+@example
+@var{command} @var{redirection-operator} @var{word}
+@end example
+
+@noindent
+where the @var{redirection-operator} is as follows,
+and spaces surrounding it are optional:
+
+@table @code
+@item <<
+instructs the shell to read input for @var{command}
+from the same place as the shell is reading commands from.
+The shell reads lines
+until a line containing only the given @var{word} (with no trailing blanks) is
+seen.  All of the lines read up to that point are considered the input
+for the @var{command}.
+@cindex @code{<<} operator
+For example:
+
+@c example was CAT << foo, but sort seems more interesting.
+@c Need a real example.
+@example
+bash$ sort << foo
+hip
+hip foo
+hooray
+and
+foo
+and
+hip
+hip foo
+hooray
+bash$
+@end example
+
+@noindent
+The four lines after @samp{sort << foo} became the input to the
+@code{sort} command.  The fifth line, containing @samp{foo} on a line by
+itself, marked the end of the input.  (Note that the @samp{foo} in the
+second input line did not end the input because the line contained other
+text as well.)  The four lines after the end of the input are
+the output of the @code{sort}, namely the input lines in alphabetical order.
+
+@item <<-
+@samp{<<-} is like @samp{<<}, except that leading tab characters are
+stripped from each line of input as it is read.
+@c how justify version that strips tabs - bfox: for formatting?
+@cindex @code{<<-} operator
+@end table
+
+@c Posix says can have more than one <<, <<- in command.
+@c cover that?  True of any other redirection operators?
+
+
+@node Grouping
+@chapter Grouping Commands
+
+@c placeholder for stuff to rewrite completely
+@c new concept: subshell, shell environment, [non]interactive shell
+
+@table @code
+@item @{ @var{list}; @}
+
+@c what is format of the list?
+Curly braces are used to group commands.  The list of commands is
+executed in the current shell environment.  The curly braces
+must either begin a line, follow a @samp{;}, or be surrounded with
+whitespace for the shell to recognize them as grouping commands.  For
+example:
+@cindex commands, grouping
+@cindex grouping commands, using @{ @}
+
+@example
+bash$ foo=bar
+bash$ @{ ls -l ; echo "Listing finished."; echo $foo @} >listing
+@end example
+
+@noindent
+lists the files in the current directory, outputs ``Listing finished.'',
+and outputs ``bar'', all of which is redirected into the file
+@file{listing}.  Unlike the following example, the grouping commands do
+not start a subshell, so the current shell's variables are available for
+use.
+
+@item (@var{list})
+@c what is format of the list?
+The list of commands is executed in a subshell.  Variable assignments
+and built-in commands that affect the shell's environment do not remain
+in effect after the command finishes.
+@cindex grouping commands, using ( )
+@cindex commands, grouping
+
+The fact that commands within parentheses are executed within a
+subshell means that the parent shell is unaffected by shell
+side-effects of those commands.  Changes in shell state caused by
+commands executed in a @emph{subshell} do not affect the parent shell. 
+
+
+Let's illustrate:
+@c silly example -- the cd in the subshell is useless
+
+@example
+bash$ pwd
+/home/alan/work
+bash$ (cd ..)
+bash$ pwd
+/home/alan/work
+bash$ cd ..
+bash$ pwd
+/home/alan
+bash$ 
+@end example
+
+@noindent
+In this example, the current working directory is
+@file{/home/alan/work} as shown by the output of the @code{pwd}
+command.  The command @code{(cd ..)} executes in a @emph{subshell} so
+that it does not change the current directory of the parent shell and
+the user remains in the original directory, @file{/home/work/alan}.
+
+However, when the command @code{cd ..} is executed in the parent shell
+(that is, it is executed without being surrounded by parentheses) the
+parent shell's current working directory is changed to
+@file{/home/alan}.
+@end table
+
+
+@node Aliases, Functions, Line, Top
+@chapter Aliases
+
+@cindex alias
+@cindex shorthand, command names
+@cindex command name shorthand
+Aliases are a way to rename, redefine, or otherwise rearrange commands
+to your liking.  An alias is created using the following syntax (note
+that there cannot be any spaces before or after the @samp{=} sign):
+
+@example
+alias @var{name}=@var{expansion}
+@end example
+
+@noindent
+The @var{name} is the command-name shorthand you want to enter at the
+shell prompt.  The @var{expansion} is the command that
+the @var{name} will stand for.  For example:
+
+@example
+alias more=less
+@end example
+
+@noindent
+causes the program @code{less} to be substituted for the operating
+system's @code{more} program every time the word @samp{more} is typed. 
+@c next sec says: any time typed as command part (1st part) of cmd
+
+@c ? I don't understand this text & example
+@c  see kellem's example below
+If the last character of the value for the alias,
+@var{expansion}, is a blank, then the word following the alias
+will also
+@c ? also = in addition to the cmd part of the line?
+be checked for substitution.  For example:@refill
+
+@example
+alias time='time '
+@end example
+
+@noindent
+allows you to time a command for which you have defined an alias. With
+this alias you can time what you would be running if you typed the
+expanded version as a command.
+
+For example, let's say you defined an alias @samp{alias more=less}. 
+Normally, if you type @samp{time more}, @file{more} is
+timed.  However, if the @samp{time} alias has been previously defined,
+typing @samp{time more} times @file{less}, which is
+what you want.  The alias @code{more} is expanded, and its value
+(@code{less}) is substituted as the program to time.
+
+If the value for the alias, @var{expansion}, contains spaces,
+tabs, or metacharacters,
+@c ? metachar means M-... ?  What's reason to include metas, not C- etc.?
+you must enclose that definition in quotes
+to avoid misinterpretation by the shell.  For example,
+let's say that you use the command-option sequence @samp{ls -la} at
+lot.  You can assign this command to the alias @code{la} to
+make typing quicker and easier:
+
+@example
+alias la='ls -la'
+@end example
+
+@noindent
+Now you can type @samp{la} instead of @samp{ls -la} when listing files.
+
+@c KELLEM: you can make aliases for arbitrary text,
+@c that is all an alias really is (a text substitution).  can be useful for
+@c bash$ alias foo=some.host.somewhere
+@c bash$ alias rlogin="rlogin "
+@c bash$ rlogin foo
+@c   is same as `rlogin some.host.somewhere'
+
+@cindex aliases, listing
+To get a list of all the currently defined aliases, simply type the
+@code{alias} command with no arguments.  A list of aliases in the form
+@samp{@var{name}=@var{value}} is displayed on the standard output.  If
+you want to know if a specific shorthand name has any aliases, you can
+type:@refill
+
+@example
+alias @var{name}
+@end example
+
+@noindent
+This tells you if any aliases exist for that specific @var{name}.
+
+@cindex aliases, the shell and
+Aliases are local to the shell in which they were declared.  This means
+that aliases can't be used within shell scripts @emph{unless those
+aliases were declared in that script}.  This means that the alias
+command has to be executed in the shell script before the command which
+references that alias is read.  
+It also means that aliases disappear when their shell is terminated. 
+@emph{BASH aliases cannot be exported to another shell.}  To get BASH
+to remember an alias permanently, you have to enter that alias in your
+login file (@pxref{Start-up}).
+
+@menu
+* Advanced Aliasing::  Creating aliases for complex commands.
+
+* Remove::             Removing aliases.
+@end menu
+
+@node Advanced Aliasing, Remove, Aliases, Aliases
+@section Creating Aliases For Complex Commands
+
+@cindex aliases, complex
+@cindex aliases, string substitution and
+@cindex string substitution and aliases
+While you can use simple string substitution with aliases, note that
+the @code{alias} command is limited to expanding only the first word in
+a command.  Using pipes, @samp{|}, semicolons, @samp{;},
+@samp{&&} (@sc{and}) and @samp{||} (@sc{or}), it is possible to have more
+than one command sequence per command line.
+@c ? terminology problem is killing us here -- command meaning either
+@c prog to run or simple cmd with args or compound command
+In this case, you can have
+more than one alias on the command line, but you can still only have
+one alias per command.  For example, let's create two more
+aliases:@refill
+
+@example
+bash$ alias listdir='ls'
+bash$ alias linecount='wc -l'
+@end example
+
+@noindent
+and combine those aliases on one command line:
+
+@example
+bash$ listdir | linecount
+@end example
+
+@noindent
+The @code{alias} command expands @code{listdir} to @code{ls} and
+@code{linecount} to @code{wc -l} because @code{listdir} and
+@code{linecount} begin @emph{separate} commands.@refill
+
+@cindex aliases, versus functions
+@cindex aliases, using functions instead of
+@cindex functions, versus aliases
+@cindex functions, using instead of aliases
+If you need more complicated expansion in a command line, use a shell
+function (@pxref{Functions}).  In particular, there is no mechanism in
+BASH for using arguments in the replacement text of aliases.  If
+arguments are needed, a shell function should be used instead of an alias.
+
+@cindex aliases, multiple commands and
+@cindex multiple commands, aliases and
+You can also make aliases that represent multiple commands.  For
+example, you can create an alias that goes to a directory of your
+choice (@code{cd}), lists what is in that directory in long form
+(@code{ls}), and shows you the
+total disk space used by that directory (@code{du}):
+
+@c KELLEM: dashes are not allowed in POSIX.2 draft 10 in aliases (not a valid
+@c shell identifier), I believe.  'course, the dashes are fine with me. :-)
+@example
+alias m-use='cd /usr/spool/mail; ls -la; du'
+@end example
+
+@noindent
+To use this alias, just type @code{m-use}.
+
+@c ref for keywords?  Is there a list of keywords somewhere?
+Lastly, you can alias keywords.  For example, if you would rather end
+the @code{do} part of a loop command (@pxref{Conditionals and Loops})
+with @code{od} than with the normal @code{done}, you can
+
+@example
+bash$ alias od=done
+bash$ for i in 1 2 3
+> do
+> echo $i
+> od
+1
+2
+3
+@end example
+
+@node Remove,  , Advanced Aliasing, Aliases
+@section Removing Aliases
+
+@cindex aliases, removing
+@cindex removing aliases
+@cindex @code{unalias} command
+@cindex aliases, the @code{unalias} command
+To get rid of aliases, use the @code{unalias} command.  This command
+looks like this:
+
+@example
+unalias @var{name1} @var{name2} @dots{} @var{nameN}@refill
+@end example
+
+@noindent
+The @code{unalias} command removes all the named aliases from the list
+of defined aliases.  For example:
+
+@example
+unalias m-use
+@end example
+
+@noindent
+removes the @code{m-use} alias, if present.
+
+@node Variables, Environment, Scripts, Top
+@chapter Shell Variables
+
+@c need new introduction
+
+@c bfox: home etc.: bash tries to get from env, if not there, creates
+@c  * etc. are really predefined
+@c 5 kinds of vars: 
+@c  inherit or create (e.g. home)
+@c  predefined (*, @, ...)
+@c  magic vars -- auto_resume, noclobber -- control shell's internal operation
+@c  user vars
+@c  dynamic vars -- seconds, etc.
+
+@c to coordinate -- what is explained here vs. customization chapter re
+@c  how to set/unset a var, see its value, etc.
+
+@cindex variables, what are
+@cindex shell variables
+@cindex shell variables, types of
+
+@node Variable Mechanics
+@section Mechanics of Named Variables
+
+Shell behavior that depends on a variable may depend on:
+
+@itemize
+@item
+the value of the variable
+
+@item
+whether the variable exists (is set), independent of what value it has
+@end itemize
+
+Thus, in order to configure a shell variable to get the effect you want,
+you may need to know:
+
+@itemize
+@item
+how to tell whether a variable exists (is set)
+
+@item
+how to create (set) a variable
+
+@item
+how to unset a variable (make it cease to exist)
+
+@item
+how to find out the value of a variable
+
+@item
+how to change the value of a variable
+@end itemize
+
+To find out the value of a variable, type
+@samp{echo $@var{name}}, where @var{name} is the variable of interest.
+(Be sure to include the @samp{$}:  If you omit it, @code{echo} just
+repeats the @var{name} itself.)
+@itemize
+@item
+If something is printed, that is the value of the variable.
+
+@item
+If nothing is printed, then either the variable exists and has a null
+(invisible) value, or the variable does not exist.
+@end itemize
+
+@noindent
+More generally, to get the value stored in a variable, precede the variable's
+name by a dollar sign, @samp{$}.
+@c explain what 'more generally' is
+
+To set a variable (create a new variable or change the value of
+an existing variable), type
+@samp{@var{name}=@var{new-value}},
+where @var{name} is the variable you want to set and
+@var{new-value} is the value you want it to have.
+Don't leave any blank space around the @kbd{=}.
+If you just want to create the variable, and don't need to give it any
+particular value, you can simply omit the @var{new-value}
+and type @samp{@var{name}=}.
+
+The name of a shell variable must start with a letter or an underscore
+and it can contain only letters, digits, and underscores.
+Uppercase and lowercase letters are not equivalent in names.
+Be careful to type variable names correctly:
+If you type a name wrong before an @samp{=}, you will either change
+the wrong variable or create a new variable.
+
+To include whitespace (spaces, tabs, or newline characters) in a
+variable's value, either quote the value with @code{"@dots{}"} or
+@code{'@dots{}'}, or precede each whitespace character with a backslash,
+@samp{\} (@pxref{Quotation}).
+
+@c bfox: this stuff is done at assignment time
+@c Value undergoes tilde expansion, parameter and variable expansion,
+@c command substitution and quote removal.
+
+To get rid of a variable, type @samp{unset @var{name}},
+where @var{name} is the variable of interest.
+
+To find out whether a variable exists, you can do any of the following:
+@itemize
+@item
+Type @samp{set} to get a listing of all your shell variables in
+alphabetical order, and see if the variable is in the list.
+
+@item
+Type @samp{set | grep @var{name}=}.
+If the variable @var{name} exists, its name (and value, if non-null) will be given;
+otherwise there will be no output.
+
+@item
+Type @samp{set -u}
+@c substitute new equivalent: something like
+@c  set -o nounset
+to tell the shell to make @code{echo} of an unset
+(nonexistent) variable give an error message.
+From then on, @samp{echo $@var{name}} will be different for nonexistent
+variables than for variables with null values.
+@end itemize
+
+Warning: @code{set} and @samp{unset} are not inverse commands:
+Although @code{unset} unsets shell variables, @code{set} does not set
+them.
+
+@node Variable Examples, Positional, Variables, Variables
+@subsection Examples with Named Variables
+
+@c need more examples
+@c may integrate with parent section (mechanics)
+
+Here are some examples of user-defined variables:
+
+@example
+bash$ test=This\ is\ a\ test
+bash$ test_2="This is also a test"
+bash$ test_3='Yet another test'
+bash$ echo $test
+This is a test
+bash$ echo $test_3
+Yet another test
+@end example
+
+To prevent @samp{$} from meaning ``evaluate the following variable,''
+precede the @samp{$} with a backslash, @samp{\}, or enclose @samp{$} and
+the reference in single quotes.
+@c note: not double quotes
+@c explain diff between single & double quotes
+For example:
+
+@example
+bash$ echo \$test
+$test
+bash$ echo '$test'
+$test
+bash$ echo $test
+This is a test
+@end example
+
+@node Positional, Predefined, User-definable, Variables
+@section Positional Parameters
+
+@cindex positional parameters
+A program, shell function, or shell script needs a way to refer to
+arguments passed to it on the command line that invoked it.  The shell
+provides for this by means of special variables called @dfn{positional
+parameters}.
+
+The name of a positional parameter is a positive integer.
+
+The value of a positional parameter is whatever the shell assigns
+it from a command line, or whatever you assign it with
+@code{set} or @code{shift} (described below).
+
+To evaluate a positional parameter, precede its
+name by a dollar sign, @samp{$}, just as you would a named variable.
+But if the parameter name is longer than a single digit, you must
+enclose it in braces.  For example, you'd type
+@kbd{$@{10@}} to refer to the value of parameter @samp{10}.
+
+When you give a command, the arguments are put into consecutive
+positional parameters starting with @code{1}.
+
+For example, assume we have a script named @code{args}
+that simply echoes its first two arguments to the standard output.
+That is, the script contains just the command
+@samp{echo $1 $2}.  Then @code{args} behaves as follows:
+
+@example
+bash$ args 1 3
+1 3
+bash$ args hi there
+hi there
+bash$ args hi there everybody
+hi there
+bash$ 
+@end example
+
+@xref{Predefined}, for information about the parameter @code{0},
+which holds the name of the current command,
+the parameters @code{*} and @code{@@}, which refer to all
+the positional parameters at once, and the parameter @samp{#},
+which holds the number of positional parameters (the current
+number of arguments).
+
+The @code{set} command can be used to assign new values to positional
+parameters.  The command
+
+@example
+set @var{values}
+@end example
+
+@noindent
+assigns the given @var{values} to consecutive positional parameters 
+starting with @code{1}.  For example, if we augment the above
+@code{args} script to be
+
+@example
+echo $1 $2
+set new message
+echo $1 $2
+@end example
+
+@noindent
+then it will modify its positional parameters, replacing the
+command-line arguments with @code{new} and @code{message}, and will behave
+as follows:
+
+@example
+bash$ args hi there everybody
+hi there
+new message
+bash$
+@end example
+
+
+The @code{shift} command moves each positional parameter's value
+into the parameter to its left.
+The value of @code{2} is moved into @code{1}, the value of @code{3}
+is moved into @code{2}, and so on.
+The last parameter becomes null.
+
+@c bfox: used to determine whether any args left on line -- example?
+This is useful, for example, in a recursive shell function,
+to ``cdr down'' the list of arguments.
+
+@code{shift} can also take a numeric argument:
+@example
+shift @var{n}
+@end example
+
+@noindent
+This causes the positional parameters to be shifted left
+@var{n} positions instead of just 1 position.
+The value of parameter @var{n+1} is moved into @code{1}, and so on.
+
+For example, if we modify the above @code{args} script to be
+
+@example
+echo $1 $2
+shift 2
+echo $1 $2
+@end example
+
+@noindent
+then it will behave as follows:
+
+@example
+bash$ args hi there everybody else
+hi there
+everybody else
+bash$
+@end example
+
+BASH itself also has positional parameters, which you can @code{set},
+@code{shift}, and examine.
+The positional parameters seen by a command are distinct from
+those of the invoking shell.
+In this example, we set the shell's first three positional parameters
+and see that they are unaffected by execution of the @code{args}
+command defined above, which uses @samp{echo $1 $2} to echo its first two arguments.
+
+@example
+bash$ set one two three
+bash$ echo $1 $2
+one two
+bash$ args hi you
+hi you
+bash$ echo $1 $2
+one two
+bash$ 
+@end example
+
+The @code{set} command is the easiest way to break a multi-word string
+into elements that can be referenced individually.  This can be useful
+in conjunction with command substitution (@pxref{Command Subs}).  For
+example, we can set the positional parameters to the words in the output
+of the @code{date} command as follows:
+
+@example
+bash$ set $(date)
+bash$ echo $1 $2 $3 $4 $5 $6
+Fri Feb 22 18:13:14 EST 1991
+@end example
+
+@node Predefined, Command Subs, Positional, Variables
+@section Predefined Shell Variables
+@c 'predefined shell vars' sound to me like ordinary vars that are defined
+@c by the shell (e.g. HOME)
+@c bfox: not standard terminology -- can change
+
+@cindex shell variables, predefined
+@cindex variables, predefined shell
+The predefined shell variables are set by the shell.
+You cannot assign them values, but
+you can reference their values by prefacing their names by @samp{$}. 
+The predefined shell variables are:
+
+@table @code
+@item ?
+contains the exit status returned by the command that was last run in
+the foreground.
+
+@item !
+contains the process identification number of the last background
+command.
+
+@item $
+contains the process identification number of the current shell.
+
+@item #
+contains the current number of positional parameters (@pxref{Positional}).
+
+@item -
+contains shell options.
+@c bfox: echo $- gives the options you invoked bash with (as modified by
+@c set) [some subset of options -- due to new -o option]
+
+@item 0
+(zero) contains the name of the command being executed.
+
+@item *
+@itemx @@
+contain a list of the positional parameters.
+
+@c bfox:
+@code{*} and @code{@@} are equivalent unless they appear
+inside double quotes.
+@samp{$*} @samp{$@@} are both equivalent to @samp{$1 $2 ... $@var{n}},
+where @var{n} is the last positional parameter.
+But @code{"$*"} is equivalent to @samp{"$1 $2 $3 @dots{}"}
+and @code{"$@@"} is equivalent to @code{"$1" "$2" "$3" @dots{}}.
+In other words, @code{"$*"} expands to a single word, whereas
+@code{"$@@"} expands to separate words.
+
+@c replace example
+@c bfox will suppply example with FOR command
+@example
+bash$ cat a
+this is a file named a
+bash$ cat b
+this is a file named b
+bash$ cat c1
+/bin/cat "$*"
+bash$ cat c2
+/bin/cat "$@@"
+bash$ c1 a b
+a b: No such file or directory
+bash$ c2 a b
+this is a file named a
+this is a file named b
+@end example
+
+@noindent
+This example shows the use of two scripts: @code{c1}, which tries to execute
+@file{/bin/cat} on the expansion of @samp{$*}, and @code{c2}, which executes
+@file{/bin/cat} on the expansion of @samp{$@@}.  When invoked with more
+than one argument, @code{c1} attempts to run @code{cat} on the file whose name
+is the concatenation all its arguments -- not what you would expect.  
+On the other hand, @code{c2} uses @samp{$@@} and behaves correctly.
+@end table
+
+The following example sets the positional parameters to
+the output of the @code{date} command and shows that that output
+consists of 6 words:
+
+@example
+bash$ echo $#
+0
+bash$ set $(date)
+bash$ echo $#
+6
+bash$ echo $*
+Sat Aug 4 22:19:05 EDT 1990
+@end example
+
+Here's an obscure script using predefined parameters:
+
+@example
+#
+# 2, 3, 4, 5 -- print in the number of columns defined by the
+# name of the script.  Adapted from Kernighan and Pike.
+#
+/bin/pr -$(basename $0) -t -l1 "$@@"
+@end example
+
+@noindent
+This file prints its input in as many columns as specified by its
+name -- if invoked as "2", it prints its input in two columns.
+
+@node Parameter Subs, Arithmetic Evaluation, Command Subs, Variables
+@section Variable Substitution
+
+@c Posix has excellent description of this, with table comparing the
+@c different substitutions.  Plagiarize it.
+
+The simplest case of @dfn{variable substitution} is the simple
+@code{$@var{name}} construct, in which the value of the variable
+@var{name} is substituted for @code{$@var{name}}.
+More complicated constructs let you specify what should happen
+if the named variable is unset or if its value is null.
+
+@cindex parameter substitution
+@cindex substitution, of parameter values
+BASH's parameter substitution facility lets you test and conditionally set the
+value of parameters and shell variables.
+@c what's param vs. shell var 
+Braces allow a variable to be
+tested to see if it is defined and is not the null string.  This is
+important as sometimes the value of an expression depends on whether or
+not a variable has been defined.  If the colon in the following 
+expansions is omitted, BASH only tests that the parameter is
+unset; it does not test to see that it's unset or null.
+
+The substitutions allowed are:
+
+@c fix up items below to make differences clear by using a single
+@c example throughout
+@table @code
+@item $@{@var{variable}@}
+The value of @var{variable} is substituted.  The braces are required
+when @var{variable} is a positional parameter with more than one digit,
+or when @var{variable} is followed by a character that isn't part of
+its name.
+@c e.g. ${v}e -- why should that happen?
+
+@item $@{@var{variable}:-@var{string}@}
+If the named @var{variable} exists, then the expression has
+the value of the variable, otherwise it has the value @var{string}. 
+For example:
+
+@example
+echo $@{timenow-$(date)@}
+@end example
+
+@noindent
+This echoes the current time, as stored in the variable @code{timenow}. 
+If @code{timenow} isn't set, the @code{date} command is run to generate
+it.
+@c clarify -- date generates time, doesn't set timenow var
+
+@item $@{@var{variable}:=@var{string}@}
+If the named @var{variable} exists, then the expression has
+the value of the variable, otherwise it has the value of @var{string}
+@emph{and} @var{string} is assigned to @var{variable}.  For example:
+
+@example
+bash$ echo $A
+
+bash$ echo $@{A=123@}
+123
+bash$ echo $A
+123
+@end example
+
+@noindent
+The first line of this example shows that @samp{A} is unset.
+@c actually, nset or null
+The second line assigns the value of 123 to @samp{A}.  Then the value of
+@samp{$A} is substituted, so @samp{A} retains the value 123.
+@c last sentence unclear
+
+This form does not work with positional parameters (@pxref{Positional})
+or special parameters (@pxref{Predefined}).
+@c what doesn't work?  just this := case? unlikely
+
+@item $@{@var{variable}:+@var{string}@}
+If the named @var{variable} exists, then it has
+@c has --> gets?
+the value of @var{string}, otherwise it has no value.
+@c ? otherwise not created?
+For example:
+
+@example
+if [ "$@{var+set@}" = "set" ] ; then
+     echo '$var' is set
+fi
+@end example
+
+@noindent
+This example shows a simple method to test whether or not a shell
+variable is set.  If @code{var} has a value, then the expansion has the
+value @code{set}, and you can test on that fact.
+@c expansion?  test?
+
+@item $@{@var{variable}:?@var{text}@}
+If the named @var{variable} exists, then the expression has
+the value of the variable, otherwise the message @var{text} is printed. 
+For example:
+
+@example
+: $@{REQUIRED?"REQUIRED must be set"@}
+@end example
+@c example messed up?  colon in wrong place?
+
+@noindent
+This statement echoes @samp{REQUIRED must be set} if @code{REQUIRED} is not set. 
+This can be used to inform the user that further execution of the
+current script is not possible.  If you don't make this part of an
+interactive script, the shell exits after printing the
+message.
+@c ???
+If there is no @var{text} following the @samp{?}, BASH prints a standard
+message.
+
+@item $@{#@var{variable}@}
+The length in characters of the value of @var{variable} is substituted. 
+@c next sentence ???
+If @var{variable} is @samp{*} or @samp{@@}, the length substituted is
+the length of @samp{*} expanded within double quotes.
+
+@item $@{@var{variable}#@var{string}@}
+@itemx $@{@var{variable}##@var{string}@}
+@c ???
+The @var{string} is expanded to produce a pattern just like pathname
+expansion.  If the pattern matches the beginning of the value of
+@var{variable}, then the expansion is the value of @var{variable} with
+the shortest matching pattern deleted (the @samp{#} case) or the
+longest matching pattern deleted (the @samp{##} case).
+
+@item $@{@var{variable}%@var{string}@}
+@itemx $@{@var{variable}%%@var{string}@}
+@c ???
+The @var{string} is expanded to produce a pattern like pathname
+expansion.@c ???
+If the pattern matches
+@c matches ???
+a trailing portion of the value of
+@var{variable}, then the expansion is the value of @var{variable} with
+the shortest matching pattern deleted (the @samp{%} case) or the longest
+matching pattern deleted (the @samp{%%} case).
+@end table
+
+
+@node Functions, Programming, Aliases, Top
+@chapter Shell Functions
+
+@cindex functions
+@c need to say what functions are for
+A shell function stores a series of commands for execution at a later
+time, similar to a shell script.  Functions are executed in
+the current shell; no new process is created to interpret them.
+
+@node Function Definition
+@section Defining a Function
+
+@c fix: fn def is a cmd, can go anywhere
+Function definitions can be entered from the command line or declared in
+your login file (@pxref{Start-up}).
+The shell doesn't save functions when you log off.  To make
+function definitions ``permanent'' you must enter them in your login file
+(@pxref{Start-up}).
+To declare a function use either of the following equivalent forms:
+@cindex functions, format of
+
+@c ? what's the format of the list?  what's a legal name? same as var
+@c names except fn name can contain dash in addition to what var name can have
+
+@example
+function @var{fname} () @{ @var{commands} @}
+
+@r{or}
+
+@var{fname} () @{ @var{commands} @}
+@end example
+
+@noindent
+It makes no difference which form you use.  Both create a simple
+command invoked by @var{fname} which executes the given @var{commands}.
+
+@cindex functions, recursive
+@cindex recursive functions
+A function can be recursive; that is, it can call itself.  No limit is
+imposed on the number of recursive calls that can be made.  However,
+make sure you put in checks to avoid infinite recursion, as you would
+in any programming language.
+
+@node Function Arguments
+@subsection Function Arguments
+
+@cindex functions, positional parameters and
+@cindex positional parameters, functions and
+Arguments present on the command line along with @var{fname} are passed
+to the function as positional parameters during its execution
+(@pxref{Positional}).  The special parameter @code{#} is updated to
+reflect the change.  Positional parameter @code{0} is unchanged.  When the
+function finishes, the values of the positional parameters and the
+special parameter @code{#} are restored to the values they had before
+the function was executed.
+
+Here's an example of a function, using the first syntax:
+
+@c ? how about a simpler, more basic example?
+@example
+function xtitle()
+@{
+   if [ "$DISPLAY" ] ; then
+   echo -n -e "\033]2;$*\007";
+   echo -n -e "\033]1;$*\007";
+   fi
+@}
+@end example
+
+@noindent
+@c ?
+If BASH is executing in an xterm window,
+@c what's an xterm window?
+this function makes its arguments
+@c whose args? the fn?
+be the string displayed in an xterm title bar.
+
+@c use same example both times (above & here)
+Here's an example of a function, using the second syntax:
+
+@c ? another mysterious example
+@example
+cd()
+@{
+     builtin cd "$@@" &&
+     xtitle $HOST: $PWD
+@}
+@end example
+
+@noindent
+This redefines the @code{cd} built-in command to allow setting the
+title of an xterm window to the host name and current directory.
+
+@cindex functions, the shell and
+@cindex functions, execution of a
+@cindex functions, making permanent
+@c ? call vs. execute vs. interpret (call is defined in next section)
+Shell functions can be executed only in the same shell that
+is used to call that function.  The shell does not fork a copy of
+itself
+@c ? fork a copy?? and isn't subshell for a script optional?
+to interpret the function, like it would with a script.
+
+@menu
+* Listing::   Listing available functions.
+* Calling::   Calling functions.
+* Export::    Exporting functions.
+* Local::     Local variables within functions.
+* Return::    Returning from function calls.
+@end menu
+
+@node Local, Return, Export, Functions
+@subsection Local Variables
+
+@cindex local variables, functions and
+@cindex @code{local} command
+@cindex functions, local variables and
+@cindex functions, @code{local} command and
+Bash supports the use of local variables within a function. 
+A local variable shadows the value of a previously defined variable
+(local or not) with the same name.
+
+Local variables differ from other variables in only one way: when the
+function that defined the variable exits, the local variable goes away,
+and any previously defined variable with the same name becomes visible
+again.  
+
+There is no way to have changes made to a local variable affect the
+value of any previous variable with the same name.  Local variables
+have to be exported to be available to programs invoked by that
+function, and to their children, too.
+@c children not explained
+
+Local variables are created with the @code{declare} or @code{local}
+commands (@pxref{Built-in}):
+
+@table @code
+@c KELLEM added i (frxi)
+@item declare @r{[}-+frxi@r{]} @r{[}@var{name}@r{[}=@var{value}@r{]}@r{]}
+This command declares variables and gives them attributes.  If no
+@var{name} is given, then a listing of the values of variables is
+displayed, instead.  
+
+The @samp{-f} option causes @code{declare} to use function names only. 
+@c ? only as opposed to what?
+The @samp{-r} option causes @code{declare} to make @var{name} readonly. 
+@c ? what's readonly?
+The @samp{-x} option causes @code{declare} to make @var{name} export
+only.
+@c ? what's export only?
+@samp{+} and @samp{-} turn on and off, respectively, the options.
+@c ? on/off unclear
+
+When @code{declare} is used in a function, it makes @var{name} local,
+the same as the @code{local} command.
+
+@example
+bash$ type z
+z is a function
+z ()
+@{
+    declare a=2;
+    echo in z, a = $a;
+@}
+bash$ a=3
+bash$ z
+in z, a = 2
+bash$ echo $a
+3
+@end example
+
+@noindent
+The instance of the variable @code{a} in the function @code{z} is
+private to @code{z}; the value of @code{a} in the shell
+(set by @samp{a=3)} does not
+affect it and is not affected by it (as shown by the final @samp{echo $a}).
+
+@item local @var{name}@r{[}=@var{value}@r{]}
+This creates a local variable called @var{name}, and gives it a value
+of @var{value}.  The @code{local} command can be used only within a
+function; it causes the variable @var{name} to be restricted to that
+function and its children.
+@c ? what children?
+
+@example
+bash$ type z
+z is a function
+z ()
+@{
+    local pid=$$;
+@c ? what's $$
+    echo This function is executed in shell $pid;
+@}
+bash$ echo $pid
+
+bash$ z
+This function is executed in shell 252
+bash$ echo $pid
+
+bash$
+@end example
+
+@noindent
+The variable @code{pid} is private to function @code{z}; the calling
+shell has no such variable.
+@c echo above doesn't tell us there's no such var, just that either
+@c there's no such var or there's such a var with a null value
+
+@end table
+
+Here is the declaration of a function that uses a local version of the
+@code{PATH} variable, and executes all of its arguments using a
+@code{PATH} which contains only @file{/bin}:
+
+@example
+using_bin () @{
+  local PATH=/bin
+  eval $*
+@}
+@end example
+
+@noindent
+A useful call to this function might look like:
+
+@example
+using_bin "rm *.texinfo; cp ../*.texinfo ."
+@end example
+@c ? what are the quotes for?  to have just 1 arg?  why not do w 2 args?
+
+@node Return,  , Local, Functions
+@subsection Returning From Functions
+
+@cindex functions, return status
+@cindex @code{return} command
+@cindex functions, @code{return} command and
+A function exits if an error occurs, if a @code{return} statement is
+executed, or after executing the last command.
+
+Here is the syntax of the return command:
+
+@example
+return @r{[}@var{n}@r{]}
+@end example
+
+@noindent
+@c ? return status (= return value ?) not defined -- = exit status?
+This causes a function to exit with the return value specified by
+@var{n}, if present.  If @var{n} is omitted, the return status is that
+of the last command.
+
+Here's an example:
+
+@example
+true()
+@{
+    return 0
+@}
+false()
+@{
+    return 1
+@}
+@end example
+
+@noindent
+These are replacements for the commands of the same name, and will
+execute much faster. 
+@c ? what true/false cmds?  documented?  what are they for? Why is this faster?
+
+@node Calling, Export, Listing, Functions
+@section Calling Functions
+
+@cindex functions, calling
+To use a function you must @dfn{call} it.  This works the same way as
+calling (and using) any program.  Here is the syntax used to call a
+function:
+
+@example
+@var{fname} @r{[} @var{args} @r{]}
+@end example
+
+@noindent
+This calls the function named @var{fname}, and provides it with
+optional command-line arguments, @var{args}.  Here's an example:
+
+@example
+bash$ f /usr/spool/mail/close
+@end example
+
+@noindent
+This calls the function @code{f} with the name of a system mailbox as
+its argument.  In the body of the function, @samp{$1} is replaced with
+@file{/usr/spool/mail/close}.
+
+@cindex functions, operating system commands and
+@cindex operating system commands and functions
+@cindex functions, the @code{command} command and
+@cindex @code{command} command
+If you have a function with the same name as an operating system
+command, you can do one of two things to be able to run that operating
+system command instead of your function.  You can call the command using its full pathname, or
+you can use the @code{command} command (@pxref{Built-in}):
+
+@example
+command @r{[}@var{command} @r{[}@var{args}@r{]}@r{]}
+@end example
+
+@noindent
+This causes the shell to run the command named in @var{command} with
+the arguments specified by @var{args}, ignoring shell
+functions.  For example, if you have a shell function called @code{ls},
+and you want to run the operating system's @code{ls} command instead,
+you'd have to say @samp{command ls}.
+
+@node Listing, Calling, Functions, Functions
+@section Listing Available Functions
+
+@cindex functions, listing
+You can get a list of all the currently defined functions using the
+@samp{-f} option of the @code{declare} command (@pxref{Built-in}).  The
+text of the functions, as well as the function names, is included in
+the listing.  For example:
+
+@example
+bash$ declare -f
+declare -f f ()
+@{
+    grep "^From:" $@{1-$MAIL@};
+@}
+declare -f popd ()
+@{
+    builtin popd "$@@";
+    xtitle $HOST: $PWD;
+@}
+declare -f pushd ()
+@{
+    builtin pushd "$@@";
+    xtitle $HOST: $PWD;
+@}
+declare -f cd ()
+@{
+    builtin cd "$@@";
+    xtitle $HOST: $PWD;
+@}
+declare -f xtitle ()
+@{
+    echo -n -e "\033]2;$*\007";
+    echo -n -e "\033]1;$*\007";
+@}
+@end example
+
+@noindent
+This lists the names of the functions together with their definitions.
+
+
+
+@node Environment, Conditionals, Variables, Top
+@chapter The Shell Environment
+@c should precede or merge with shell var chapter?
+
+@c ? documentation of export and declare is very inconsistent, over the
+@c parts of this chapter and the built-in command appendix.
+@c  What are they supposed to do?  In particular, is it supposed to be
+@c  the case that:
+@c  export   =   declare (or maybe declare -x)
+@c  export -f =  declare -f (or maybe declare -fx)
+@c Is export intended to replace declare ?
+
+@c cover 'set -o allexport...' somewhere in this chapter
+
+@cindex environment
+@cindex shell environment
+@c ? program environment vs. shell environment
+When a program is invoked it is given an array of strings called the
+@dfn{environment}.  The shell @dfn{environment} is the set of all
+shared and exported
+@c ? shared = exported?
+shell variables and functions.  By typing
+@code{declare -x}, or the @code{export} command by itself, you can see
+a list of all exported variables.  This is a list of name-value pairs,
+of the form @samp{@var{name}=@var{value}}:
+
+@example
+bash$ export
+declare -x HOME=/usr/chet
+declare -x SHELL=/bin/bash
+declare -x TERM=xterm
+declare -x USER=chet
+declare -x PATH=/usr/local/bin/gnu:/usr/local/bin:/usr/ucb:/bin:/usr/bin
+declare -x HOSTTYPE=IBMRT
+declare -x MAILCHECK=60
+declare -x BASH=/bin/bash
+declare -x HISTFILE=/usr/chet/.history
+declare -x HISTSIZE=500
+declare -x LOGNAME=chet
+declare -x TZ=EST5EDT
+declare -x MAIL=/usr/chet/mbox
+declare -x HOST=arrakis
+declare -x EDITOR=/usr/local/bin/ce
+declare -x VISUAL=/usr/local/bin/ce
+declare -x PAGER=/usr/local/bin/more
+declare -x DISPLAY=unix:0.0
+@end example
+
+A process can access and use any environment variables and functions
+that exist in that process's environment.
+@c ? access AND use?
+C programs have a @code{getenv()} function available for this purpose.
+@c sudden switch from 'commands' (scripts, etc.) to C progs
+
+The shell allows you to manipulate the environment in several ways.  On
+invocation,
+@c clarify 'invocation' -- maybe ``when it starts up, the shell scans...''
+the shell scans its own environment and creates a parameter
+@c ? parameter?
+for each name found, automatically marking it for export to child
+processes.
+@c ? marking paramater? marking name?
+
+Generally, this ``basic'' environment consists of (at least) the
+@code{HOME}, @code{PATH} and @code{TERM} variables.  These tell the
+shell what your home directory is, the search paths you use most often,
+and what terminal you want to emulate, respectively.  Other variables
+are used to customize your environment to make it more
+useful to you.
+
+Executed commands inherit this environment.
+@c ? what environment?
+@c ? explain inherit.  different from share? use?
+If the value of a parameter
+@c ? parameter
+in the environment is modified,
+@c ? modified by the command that's executed?
+the new value becomes part of the environment, replacing the old.
+@c ? doesn't subshell  have COPY of env?
+
+@c ???
+Therefore, the environment inherited by any executed command consists
+of the shell's initial environment, whose values may be modified in the
+shell, less any values removed by the @code{unset} command, plus any
+additions via the @code{export} and @code{declare} commands.
+
+@c ??? child processs?  subshells?
+Remember that exported variables can only be exported to child
+processes.  If you want to make a variable accessible to all subshells,
+be sure to define and export it in your login shell.
+
+The environment for any simple command or function can be augmented
+temporarily by prefixing the command with parameter assignments.
+@c ? parameter = shell variable ?
+These assignment statements affect only the environment seen by that command.
+
+@example
+bash$ foo=bar printenv foo
+bar
+bash$ printenv foo
+bash$
+@end example
+
+@c ???
+If @samp{set -k}
+@c substitute new 'set -o ...' version of above
+is used (@pxref{Built-in}), then all parameter
+assignments are placed in the environment for a command, not just those
+that precede the command name.
+
+@node Shared Variables,  , Arithmetic Evaluation, Variables
+@section Shared Variables
+@c ? shared = exported?
+
+@cindex shared variables
+@cindex local variables
+@cindex variables, local
+@cindex variable, shared
+@cindex shell variables, local
+@cindex shell variables, shared
+Normally shell variables are @dfn{local} variables.  That is, these
+variables are known only to the shell that created them.  When you
+start a new shell (@pxref{Install}), the new shell doesn't know about
+any of the old shell's variables.  Each shell's variables are known
+only (are local) to itself.
+
+Sometimes, however, we want a new shell to recognize the old
+shell's variables.  You can accomplish this using the @code{export}
+command (@pxref{Built-in}):
+
+@table @code
+@item export @var{names}
+exports the value of named variables @var{names} to a subshell.
+@c what subshell?
+Exported variables can only be exported
+to child processes and @emph{not} back to parent processes.
+@c to every child created from now on?
+@c explain child & parent somehwere
+
+@item export -n @var{names}
+removes the export property from the named variables, @var{names}.
+@c i.e. no longer exported?
+
+@item export
+lists the variables that are already exported.
+@c ? relationship to declare -x ?
+@end table
+
+The @code{export} command actually gives only a @emph{copy} of the
+original variable to the new subshell.  When the subshell dies, so does
+the value of the variable @emph{copy}; the original variable value
+remains untouched.
+@c key is probably that changes to var in subshell don't affect value
+@c seen by parent shell ?
+
+@node Export, Local, Calling, Functions
+@section Exporting Functions
+
+@cindex functions, exporting
+@cindex @code{declare} command
+@cindex functions, @code{declare} command and
+@cindex @code{export} command
+@cindex functions, @code{export} command and
+Normally, functions are unset
+@c ? unset?
+when the shell executes a shell script. 
+You can get around this problem by exporting your functions to the
+environment (@pxref{Environment}).  Exported functions are available to
+any invocation of the shell, including any shell scripts.  There are
+two ways you can export functions:  use the @samp{-f} option of the
+@code{export} command or use the @samp{-xf} option of the
+@code{declare} command (@pxref{Built-in}).  Here's how they work:@refill
+@c ? why synonymous commands?
+@c  confusing:  export -f fn = declare -xf fn, export -f = declare ??
+
+@table @code
+@item export -f @var{fname}
+exports the function named @var{fname} to the environment.  More
+than one function name can be listed for export.
+@item export -f
+lists the currently exported functions.
+
+@noindent
+For example:
+
+@c ? what is 'type'
+@example
+bash$ type fn
+fn is a function
+fn ()
+@{
+    grep "^From:" $@{1-$MAIL@};
+@}
+bash$ export -f fn
+bash$ export -f
+declare -xf fn ()
+@{
+    grep "^From:" $@{1-$MAIL@};
+@}
+@end example
+
+@item declare -xf @var{fname}
+exports the function named @var{fname} to the environment.  More
+than one function name can be listed for export.
+@item declare -xf
+lists the currently exported functions.
+@c ? is it declare -xf or declare -x?  example below confused
+
+@noindent
+For example:
+
+@example
+bash$ type fn
+fn is a function
+fn ()
+@{
+    grep "^From:" $@{1-$MAIL@};
+@}
+bash$ declare -x fn
+bash$ declare -xf
+declare -xf fn ()
+@{
+    grep "^From:" $@{1-$MAIL@};
+@}
+@end example
+
+@noindent
+The first @code{declare} statement marks the function @code{fn} for
+export to the environment.
+@c ? marks for export = exports (above) ?
+The second statement lists all exported
+functions; in this case @code{fn} is the only one.@refill
+
+@end table
+
+@node Substitution
+@chapter Command Substitution and Arithmetic Evaluation
+
+@node Command Subs, Parameter Subs, Predefined, Variables
+@section Command Substitution
+
+@cindex command substitution
+@cindex substitution, of command values
+A command enclosed in backquotes,
+@samp{`@var{command}`}, is replaced by the output it
+produces.  This is called @dfn{command substitution}.
+
+For example:
+
+@example
+bash$ echo I am logged in as `whoami`
+I am logged in as jems
+bash$
+@end example
+
+@noindent
+Inside single quotes, a backslash retains its literal meaning, except when followed by
+a @samp{$}, @samp{`}, or a @samp{\}.
+@c ? what happens in those cases?  why just those cases?
+
+
+@c preferred syntax should be first, other mentioned as historical
+You can also perform command substitution using the
+@samp{$(@var{command})} syntax.
+This is the preferred syntax for command substitution.
+When this form of command substitution
+is used, none of the characters between the parentheses are treated
+specially; all characters are considered to make up the command. 
+Here's an example:@refill
+
+@c candidate for world's worst example?
+@example
+kill -1 $(cat /etc/named.pid)
+@end example
+
+@noindent
+This sends a hangup signal (@code{SIGHUP}) to the process whose process
+@sc{id} is in the file @file{/etc/named.pid}.
+
+Note that the command substitution operation replaces any linefeed
+characters in the command's output with space characters.
+@c ? linefeed = newline?
+The shell also deletes trailing newlines.
+@c what's word splitting?  path name expansion?
+Note, also, that word
+splitting and path name expansion are not performed on the resulting
+command if the substitution appears within double quotes.
+@c ??? what substitutiont? what resulting command?
+
+Command substitutions may be nested.  (When nesting using the
+@samp{`@var{command}`} form, protect the inner backquotes with
+backslashes to prevent shell misinterpretation.)
+
+Command substitution is useful in assigning variables.  Use it when you
+want the output of a command to be the value of a variable.  For
+example:
+
+@example
+x=$(pwd)
+@end example
+
+@noindent
+This assigns @code{x} the value of your current working directory.  This
+example isn't really useful because shell has built-in command
+(@code{cd}) for performing this action.
+@c ? huh?  cd doesn't assign x
+Here's a more useful example:
+
+@example
+i=$(expr $i + 1)
+@end example
+@c ? what's expr?
+
+@noindent
+This increments a number if @var{i} is a number.  This is useful in
+shell scripts for creating loops.
+
+Here's another example:
+
+@example
+name=$(basename $i)
+@end example
+
+@noindent
+This removes all the path information from @var{$i} and gives you a
+pure file name.
+
+A common use of command substitution's linefeed-to-spaces translation
+is keeping lists of items on separate lines of a file, and then using
+@code{cat} inside of back-quotes to produce word lists for the
+@code{for} command (@pxref{for}).
+In the following example, the @code{cat} command is used to write the
+contents of file @file{namelist} to the output:@refill
+
+@example
+bash$ cat namelist
+joe
+sam
+mary
+ezekiel
+bash$ echo `cat namelist`
+joe sam mary ezekiel
+@end example
+
+Here's an example using the file
+@file{namelist} from above:@refill
+
+@example
+bash$ for i in `cat namelist`
+bash> do
+bash> echo "Hi there, $i."
+bash> done
+Hi there, joe.
+Hi there, sam.
+Hi there, mary.
+Hi there, ezekiel.
+@end example
+
+@c KELLEM added this skeletal section
+@c this section assumes that $[..] arithmetic evaluation is included in
+@c 1.06 -- it's from posix and should be included
+@node Arithmetic Evaluation, Shared Variables, Parameter Subs, Variables
+@section Arithmetic Evaluation
+
+@c this section should probably be reworded a little, but it's a start
+@cindex arithmetic evaluation
+@cindex arithmetic expressions
+@cindex expressions, arithmetic
+@cindex evaluating arithmetic expressions
+@cindex math expressions
+You can evaluate arithmetic expressions in BASH.  The syntax for
+arithmetic evaluation is @samp{$[@var{expression}]}.  The
+@var{expression} is treated as if it were within double quotes, but a
+double quote inside the brackets is not treated specially.  All tokens
+in the @var{expression} undergo parameter expansion, command
+substitution, and quote removal.  Arithmetic evaluations may be
+nested.@refill
+
+The evaluation of expressions is done in long integers with no check for
+overflow, though division by 0 is trapped and flagged as an error.  The
+following list of operators is grouped into levels of equal precedence
+operators.  The levels are listed in order of decreasing precedence.
+
+@table @code
+@item -
+unary minus
+@item !
+logical @sc{not}
+@item * / %
+multiplication, division, remainder (modulus)
+@item + -
+addition, substraction
+@item <= >= < >
+comparison operators
+@item == !=
+equality, inequality
+@item =
+assignment
+@end table
+
+Shell variables are allowed as operands; parameter expansion is
+performed before the expression is evaluated.  The value of a parameter
+is coerced to a long integer within an expression.  Operators are
+evaluated in order of precedence.  Subexpressions in parentheses are
+evaluated first and may override the precedence rules above.  Operators
+of equal precedence are evaluated from left to right.
+
+You may also specify arithmetic evaluation with the @code{let} builtin
+command.  @xref{Built-in, let, Builtin Commands}, for more
+information.@refill
+
+@node Scripts, Variables, Programming, Top
+@chapter Shell Scripts
+
+@cindex shell scripts
+@cindex scripts
+A shell script is a collection of operating system commands,
+comments, and shell programming-language constructs grouped together in
+a file.
+
+Shell scripts can be composed of fixed commands requiring no arguments,
+and run without interruption.  Scripts can also be composed of commands
+that require user input.  If this is the case, the script can obtain
+that input either by prompting or by arguments included on the command
+line used to invoke the script.  Scripts can also use pipes and
+redirection both internally and externally.
+@c ? what does last sentence mean?
+@c  guess: internal = redir ops in cmds in script, external = i/o of
+@c  script redirected by command invoking script
+
+@cindex script, how to execute a
+You can run shell scripts in a number of ways.  You can type the
+@code{bash} command followed by the script file name, or you can turn the
+script into an actual command using the @code{chmod} command
+(@pxref{chmod, , @code{chmod}, utilities, The GNU Utilities Manual}),
+and execute that new command by typing the script's file name.  Both of
+the ways of executing a script create a new shell process.
+@c ? last sentence false?  surely bash foo runs foo in a fresh bash,
+@c   (actually, I don't see it doc'ed like this)
+@c   but foo creates a foo (non-shell) process
+@c must explain shell process above, & current/new process below
+
+To execute a program without creating a new process you can use the
+@code{.} command or the @code{source} command (@pxref{Built-in}).  These
+execute a shell script as part of the current process.  Each line in the
+script is acted upon as if you had typed it, excepting that the shell's
+notion of interactiveness is turned off.
+
+The @code{exec} command
+(@pxref{exec, , @code{exec}, utilities, The GNU Utilities Manual}),
+also executes programs in
+place of the current process, but @code{exec} never returns control to
+the original program.
+
+@cindex script, steps in writing a
+To summarize, here's one of the easiest ways of writing and executing a
+shell script:
+@c it's not a summary, it's new info
+@c  (above, needed exec, ., or source -- chmod case wasn't clear
+
+@enumerate
+@item
+Create a file that contains the commands you want to execute.  For
+example, a series of commands that you execute frequently and are tired
+of repeatedly typing.
+
+@item
+Change the file access mode so the file can be run like a program
+rather than be treated like a data file.  For example, @code{chmod +rx
+@var{file}}, where @var{file} represents the name of your script.  The
+@samp{+rx} option allows all users to read and execute this file.
+@c ? why do all users?  for just me, do +x ?
+
+@item 
+Type the name of the file to execute the commands in the shell script.
+@end enumerate
+
+@cindex script, sample of
+Here's an example of a simple shell script:
+
+@example
+#Display the date, time, username and current directory.
+echo "The current date and time is:"
+date
+echo " "
+echo "You are `whoami` \n"     #print username.
+echo "Your current directory is `pwd`."  #print current directory.
+@end example
+
+@noindent
+This script prints the current date, time, username and working
+directory for the user who invokes it.  The first line of this script
+is a comment, identified by the pound sign @samp{#} that begins it.
+Comment statements don't get executed; use them to
+document your shell script.
+Notice that comments don't have to be placed on a line by themselves. 
+When a word begins with a @samp{#} sign, it causes the rest of that
+line to be interpreted as a comment, and not executed.
+Note: @samp{#} works only in a noninteractive shell.
+@c new concept: [non]interactive shell
+@cindex command lines, comments in
+@cindex comments
+@cindex scripts, comments in
+@cindex non-interactive shells, comments in
+
+The backquotes around the @code{whoami} and @code{pwd} commands shows
+the use of command substitution (@pxref{Command Subs}).  Basically
+@c ? basically
+the shell replaces the command (including the backquotes) with the
+output of that command.  The @samp{\n} tells @code{echo} to add an extra
+carriage return to the end of the line.
+
+@xref{Advanced Scripts}, for more advanced examples of writing scripts.
+
+
+@node Conditionals and Loops, Built-in, Environment, Top
+@chapter Conditionals and Loops
+
+@c Intro not related to rest of chapter.
+@c Rest of chapter isn't about shell use of exit status.
+
+@cindex conditional statements
+BASH has some built-in decision-making and looping statements.  Most of these
+statements base their decisions on the @dfn{exit}, or @dfn{return},
+status of specified processes.  An exit status is simply a flag that
+indicates the success or failure of an executed command.
+@c what's a flag?  a value?
+Exit status flags are returned to the parent process when a child
+process stops executing (for any reason).
+
+For example, suppose we wish to look at the contents of a file using
+the @code{cat} command.  If the specified file cannot be found, it
+certainly can't be looked at and the attempt to execute @code{cat} is
+looked upon as unsuccessful by the shell.  Therefore the exit status is
+returned as ``unsuccessful''.
+This status can be tested by the shell and used to make decisions about
+what actions to take next.  An exit status of zero means that the
+command was executed successfully.  An exit status of non-zero means
+that the command was unsuccessful.
+
+@menu
+* if::       The @code{if} statement.
+
+* case::     The @code{case} statement.
+
+* for::      The @code{for} statement.
+
+* while::    The @code{while} statement.
+
+* until::    The @code{until} statement.
+
+* break & continue::   The @code{break} statement and the
+                       @code{continue} statement.
+@end menu
+
+@node if, case, Conditionals, Conditionals
+@section The @code{if} Statement
+
+The syntax of the @code{if} statement is:
+
+@example
+if @var{condition}
+then 
+    @var{commands}
+@r{[}elif @var{condition}
+then 
+    @var{commands}@r{]}
+@dots{}
+@r{[}else 
+    @var{commands}@r{]}
+fi
+@end example
+@noindent
+where the brackets and the dots indicate that the @code{else} part is optional
+and that there can be any number (including none) of @code{elif} parts.
+
+If the commands contained in the first @var{condition} are successfully
+executed, then the commands contained in the first @var{commands} are
+executed.
+The optional @code{elif} parts allow you to specify
+conditions to test (and corresponding commands to execute if
+successful) if previous conditions were not successful.
+The optional @code{else} part allows you to specify
+commands to execute if none of the @var{condition}s are successful.
+After the appropriate @var{condition}s are tested
+and any appropriate @var{commands} are
+executed, control goes to the statement following the @code{fi}.
+
+Here's an example:
+@c replace system example by user example
+
+@example
+# check to see that we've got sufficient files to bring the
+# system up multi-user
+for i in /bin/login /etc/getty /etc/passwd ; do
+@c what's the next obscure line???
+    if [ ! -s $@{i@} ]; then
+     echo "$@{i@}: not present @dots{} Can't come up to multi-user mode."
+>/dev/console
+     /bin/kill 1
+    fi
+done
+@end example
+
+@noindent
+This is code to execute at the end of the system startup script.  It
+checks that the necessary files are present to bring the system up to a
+multiuser state, and shuts the system down if the files are not
+present.
+
+Here's another example:
+
+@example
+if [ -f /etc/license ] ; then
+    PATH=~/bin.vax-ultrix:$PATH
+elif [ -f /hp-ux ] ; then
+    PATH=~/bin.hp-ux:$PATH
+elif [ -x /bin/arch ] ; then
+    if [ $(/bin/arch) = "sun3" ] ; then
+        PATH=~/bin.sun3:$PATH
+    else
+        PATH=~/bin.sparc:$PATH
+    fi
+else
+    PATH=~/bin.ibm032:$PATH
+fi
+@end example
+
+@noindent
+This code tacks a machine-specific binary directory onto the
+front of the @code{PATH} variable.  Only one of the @code{then} bodies is executed,
+depending upon the machine being used.@refill
+
+If you don't want to put the parts of an @code{if} statement
+on separate lines as shown in the syntax, you don't have to.
+But if you move one of the keywords (@code{then}, @code{elif},
+@code{else}, or @code{fi}) onto the same line as the preceding
+@var{condition} or @var{commands}, you must put
+a semicolon before it.
+In other words, each
+@var{condition} or @var{commands} must be followed by a newline
+or a @samp{;}.
+@c is it allowable to always end with ;, even if newline next?
+
+For example:
+
+@c what is the [...] ?
+@c The condition here, with =, is not a case of 'successful execution'
+@c as discussed above.  Rather, it's a comparison.  Confusion of
+@c concepts: exit status used as t/f for tests
+@example
+if [ "X$PS1" = "X" ]; then exit ; else echo "interactive shell" ;
+fi@refill
+@end example
+
+@noindent
+This echoes ``interactive shell'' if BASH is executing interactively. 
+The variable @code{PS1} is set only if the shell is interactive.
+
+
+@node case, for, if, Conditionals
+@section The @code{case} Statement
+
+The syntax of the @code{case} statement is:
+
+@example
+case @var{string} in
+     @var{pattern_1a} | @var{pattern_1b} | @var{pattern_1c})
+            @var{commands1}
+            ;;
+     @var{pattern_2})
+            @var{commands2}
+            ;;
+     @dots{}
+esac
+@end example
+
+This statement tries to match a string, @var{string}, to various
+@var{patterns}.  If it finds a match, it
+executes the corresponding pattern's commands.  When execution is
+complete, control is transferred to the statement following the
+@code{esac}.
+Each pattern in a list is separated
+from the next by @samp{|}.  Patterns can contain the
+file-matching wildcards @samp{*}, @samp{?}, or @samp{[ @dots{} ]}
+(@pxref{File Names}).  A pattern list is ended with a closing
+parenthesis (note that there is no matching open parenthesis).@refill
+@c so in this case wildcards aren't just for files
+
+You don't have to separate all the parts of the @code{case} statement
+on separate lines as shown above.
+Any of the newlines can be omitted.
+
+@c put an example case statement here instead of a template
+@example
+case @var{string} in @var{pattern1a} @r{[}| @var{pattern1b} @dots{}@r{]}) @var{commands} @r{[};; @dots{}@r{]};; esac @refill
+@end example
+
+Here's an example:
+
+@c example redefines builtin cd, while also using it?
+@c example is teco-like gibberish -- replace &/or explain
+@c Want simpler example here -- use this example in customization
+@c section for people to copy if they like the behavior.
+@example
+cd()
+@{
+     builtin cd "$@@" &&
+     case "$1" in
+     '')
+          PS1='$ '
+          ;;
+     ..|*/..)
+          PS1="$@{PWD##*/@}$ "
+          ;;
+     */*)
+          PS1=$@{$1##*/@}$ "
+          ;;
+     *)
+          PS1="$1$ "
+          ;;
+     esac
+@}
+@end example
+
+@noindent
+This sets your prompt to contain the name of the current directory,
+with all path information stripped.
+@c example to explain above sentence
+This can be used as a
+way to reset your primary prompt when you change directories.  If you 
+are in your home directory, via a @code{cd} with no arguments,
+@code{PS1} will contain no directory information at all.
+@c need example of behavior after doing it:
+@c  bash$ cd me
+@c  me$
+
+
+@node for, while, case, Conditionals
+@section The @code{for} Statement
+
+The @code{for} statement executes a sequence of commands once for each
+value in a list of items.
+
+The format of the @code{for} statement is:
+
+@example
+for @var{name} @r{[}in @var{list}@r{]}
+do
+    @var{commands}
+done
+@end example
+
+For each element in @var{list}, @var{name} is set to that
+element and the @var{commands} are executed. 
+When you omit the optional @samp{in @var{list}}, it
+defaults to @samp{in "$@@"}, so that the loop is executed once for
+each of the command line parameters.
+
+Here's an example:
+
+@example
+for host
+do
+     echo $host:
+     rsh $host w
+done
+@end example
+
+@noindent
+This defines a script that runs the @code{w} command remotely on each
+host named as an argument.
+@c need example of using the script
+
+Here's an example using the @samp{in @var{list}} option:
+
+@example
+for file in $(echo *.c)
+do
+     touch $file
+done
+@end example
+
+@noindent
+This updates the timestamp of each file ending in @samp{.c} in the
+current directory.  This is useful for preparing for a rebuild of a
+software system.
+
+The @code{do} and @code{done} mark the beginning and the
+end, respectively, of the loop.  When the @var{list} is
+used up, control is passed to the statement following the @code{done}.
+
+If you don't want to put the parts of a @code{for} statement
+on separate lines as shown in the syntax, you don't have to.
+But if you move one of the keywords (@code{do} or @code{done})
+onto the same line as the preceding
+@var{name}, @var{list}, or @var{commands}, you must put
+a semicolon before it.
+@c is it allowable to always end with ;, even if newline next?
+
+@node while, until, for, Conditionals
+@section @code{while} and @code{until} Loops
+
+The format of a @code{while} or @code{until} loop is:
+
+@example
+while @var{condition}
+@r{[}do
+      @var{commands}@r{]}
+done
+@end example
+@noindent
+or
+@example
+until @var{condition}
+@r{[}do
+      @var{commands}@r{]}
+done
+@end example
+
+In a @code{while} loop, the @var{commands} are
+repeatedly executed as long as the @var{condition} executes
+successfully (returns an exit status of zero).
+Before each pass through the loop, @var{condition} is executed.  If
+@var{condition} returns zero, @var{commands} is executed.  Usually
+@var{commands} affects the @var{condition} execution in some way so
+that it will eventually return non-zero.  Otherwise you end up with an
+infinite loop.
+When the @var{condition} is unsuccessful in executing, control
+jumps to the statement following the @code{done}.
+
+In an @code{until} loop, the @var{commands} are
+repeatedly executed as long as the @var{condition} fails
+execution (returns an exit status of non-zero).
+Before each pass through the loop, @var{condition} is executed.
+If @var{condition} returns non-zero, @var{commands} is executed. 
+Usually @var{commands} affects the @var{condition} execution in some
+way so that it will eventually return zero.  Otherwise you end up with
+an infinite loop.
+When the @var{condition} is successful in executing, control is
+returned to the statement following the @code{done}.
+
+The following example tests the output of the @code{who} command once
+each minute until it finds that a user named @samp{chet} has logged in.
+@c explain example -- what are who, grep, sleep
+
+@example
+until who | grep chet
+do
+     sleep 60
+done
+@end example
+
+If you don't want to put the parts of a @code{while} or @code{until} statement
+on separate lines as shown in the syntax, you don't have to.
+But if you move one of the keywords (@code{do}
+or @code{done}) onto the same line as the preceding
+@var{condition} or @var{commands}, you must put
+a semicolon before it.
+In other words, the
+@var{condition} and @var{commands} must each be followed by a newline
+or a @samp{;}.
+@c is it allowable to always end with ;, even if newline next?
+
+The @samp{do @var{commands}} is optional.  Sometimes just
+testing the @var{condition} is enough.  For example, here's an
+inefficient way of reading the last line of a file:
+@c what do you mean by reading?  who sees it? where does it go?
+@c if it's inefficient, isn't it a bad example?
+
+@c explain: what's exec?  what's read?
+@example
+exec < file
+while read variable ; done
+@end example
+
+@noindent
+The return status of @code{read} is 0 (successful) unless the
+end-of-file (@sc{eof}) is
+encountered.  When the @sc{eof} is encountered, the condition is met and the
+usefulness of the statement is finished.  No @samp{do @var{commands}} section is needed.
+
+@node break & continue,  , until, Conditionals
+@section The @code{break} and @code{continue} Statements
+
+@cindex loops, interrupting
+@cindex interrupting loops
+You can interrupt a @code{for}, @code{while}, or @code{until} loop
+using a @code{break} or a @code{continue} statement:
+
+@table @code
+@item break @r{[}@var{n}@r{]}
+
+The @code{break} statement stops the execution of the loop and passes
+control to the statement following the @code{done} that marks the end of
+the loop.
+If @var{n} is specified, it tells the shell to break at the @var{n}th
+level of the enclosing loop.
+@c explain nth level -- nested loops?
+
+Here's an example:
+
+@c what is the : in the while?
+@c what are echo, read, [], lpr
+@example
+while :
+do
+     echo -n "Enter name of file to print [q to quit]: "
+     read fn
+     if [ "$fn" = "q" ] ; then
+          break
+     fi
+     lpr $fn
+done
+@end example
+
+@noindent
+This prompts for names of files and prints them, until a @samp{q} is
+encountered.
+
+@item continue @r{[}@var{n}@r{]}
+
+The @code{continue} statement transfers control to the loop's
+@code{done} statement, which continues execution of the loop.  If
+@var{n} is specified, it tells the shell to resume computation at the
+@var{n}th enclosing loop.
+@c explain nth level -- nested loops?
+
+Here's an example:
+
+@c what's [], -d
+@example
+for dir in $(cat dirlist)
+do
+     if [ -d $dir ] ; then
+          continue
+     fi
+     mkdir $dir
+done
+@end example
+@c weird example.  Why wouldn't you write it as
+@c  'if NOT exists then @c mkdir'
+@c  without a Continue?
+
+
+@noindent
+This reads a file containing the names of a list of directories to
+create, and creates each one if it does not already exist.
+@end table
+
+@node Built-in, Shell Vars, Conditionals, Top
+@appendix Built-in Shell Commands
+
+@cindex built-in commands, list of
+Some of the commands you may want to run are already part of the shell. 
+Because of this, no new processes are started in order to run these
+built-in commands.  Therefore, these built-in commands use less time
+than those that aren't built-in.
+
+The following is a list of the built-in commands.  Some of these
+commands are explained in more detail earlier in this manual.
+@c shouldn't all of these be in the manual?
+@c This is then just alphabetical summary
+You are directed to read the appropriate chapter if you need more information
+than is provided here:
+@c be sure all descriptions here match those earlier
+
+@table @code
+@item :
+This command can only expand arguments and perform redirections
+and nothing else.  It is the shell's ``do nothing'' command.  It is
+not, however, a useless command.  Since the shell is able to scan and
+parse the line that follows the colon, this command can be adapted for
+many uses.
+
+It can be used as a valid option for a program's conditional statement,
+or it can be used to create an infinite (until interrupted) loop. 
+Here's an example:
+
+@example
+# wait for a file to be created, chewing up lots of CPU time
+# usage: waitfor filename
+#
+while [ ! -f "$1" ] ; do
+      :
+done
+@end example
+
+You can also use the colon to create comment lines, instead of using
+the @samp{#} character (@pxref{Scripts}, for more information).
+@c other part of doc said # is for noninteractive shell, : for interactive
+@ignore
+The @samp{:} command can be adapted to create comment lines in an
+interactive shell (@pxref{Built-in}).
+@cindex command lines, comments in
+@cindex comments
+@cindex interactive shells, comments in
+@cindex colon (@code{:}) command
+@iftex
+@cindex : command
+@end iftex
+@c Can't do @cindex : (: is not valid in index/menu in Info mode)
+@c from Bob Chassell:  A colon cannot be part of an index
+@c entry because a colon is used by Info as the marker between the item
+@c name and the node name in the index.
+@end ignore
+For example:
+
+@example
+bash$ echo A bad example > junk
+bash$ cat junk
+A bad example
+bash$ : this is a comment about > junk
+bash$ cat junk
+bash$
+@end example
+
+@noindent
+First we create the file called @file{junk}, entering a simple message
+into that file.  Then we create a comment about our file using the
+@samp{:} statement and insert a redirection operator into the sentence. 
+Normally we'd expect the shell to ignore anything that follows a
+comment character.  However, the shell is able to parse and interpret
+the contents of the line following a colon.
+Therefore, the above @samp{:} statement, when scanned by the shell,
+causes the file @file{junk} to be opened for output, which removes its
+prior contents (@pxref{Redirection}).
+@c what happens to rest of : line?
+
+So be careful when using the @samp{:} statement.  It can be useful when
+used properly; but it can also be dangerous in careless hands.
+@c ??? what's an example of proper, useful use?
+Don't insert any characters that can be expanded by the shell into a
+@samp{:} comment line.
+@c ??? what's this expansion stuff above?
+It's safest to protect the comment following @samp{:} with single quotes
+so that it won't be interpreted by the shell.
+@c ??? single quotes are new concept
+Make sure that there's a space between the colon and the opening single
+quote, though, or the shell could mistake what follows for a command:
+@c space/command stuff not explained
+
+@example
+bash$ : 'This is a good way to make a comment.'
+bash$ :'This is bad.'
+:This is bad.:  command not found.
+@end example
+@c why not just use # ?? because not valid in interactive shell?
+
+@item . @var{file}
+@itemx source @var{file}
+Both commands are used to execute shell programs, without creating a
+separate child process.  The named file is read and executed in the
+current shell environment and control is returned to the current shell. 
+Since these commands do not create a subshell they can be used to
+change the value of a shell variable in the current shell.
+
+@var{file} must have a fully qualified path name in order to be
+executed.  The @code{PATH} variable is searched for the location of the
+named file, otherwise the current directory is searched if no file is
+found in @code{PATH}.
+
+Redirection of input and output and other command line arguments are
+not permitted when using these commands.
+
+@item alias @r{[}@var{name}@r{[}=@var{value}@r{]} @dots{}@r{]}
+An alias is defined for each @var{name} whose @var{value} is given. 
+@xref{Aliases}, for more information.  A trailing space in @var{value}
+causes the next word to be checked for alias substitution.  If a
+@var{name} (without the @samp{=@var{value}} part) is given for which no alias has been defined an error
+message is printed.
+
+The @code{alias} command, with no arguments, prints the 
+list of aliases in the form @samp{@var{name}=@var{value}} 
+on the standard output.
+
+@item bg @r{[}@var{job_spec}@r{]}
+This causes the shell to place the specified job, @var{job_spec}, in
+the background, as if it had been started with @samp{&}.  @xref{Resuming},
+for more information.  If @var{job_spec} is not present, the shell's
+notion of the current job is used.
+
+@item break @r{[}@var{n}@r{]}
+This command exits from an existing @code{for}, @code{while}, or
+@code{until} loop.  If @var{n} is specified, it tells the shell to
+break at the @var{n}th level of the enclosing loop.  @var{n}
+must be greater than or equal to 1.  If @var{n} is greater than the
+number of the enclosing loops, all enclosing loops are exited.
+
+@item builtin @r{[}@var{shell-builtin} @r{[}@var{arguments}@r{]}@r{]}
+This is used to execute a built-in shell command, passing it
+@var{arguments}.  This is useful when you wish to rename a
+built-in shell command to be a function, but need the functionality of
+the built-in command within the function itself.  (The built-in @code{cd} 
+command is commonly redefined this way.)
+
+@item cd @r{[}@var{dir}@r{]}
+This command tells the shell to change the current directory to the one
+specified by @var{dir}.  The variable @code{HOME} contains the default
+value of @var{dir}.
+
+The variable @code{CDPATH} defines the search path for the directory
+containing @var{dir}.  @xref{Predefined}, for more information. 
+Alternative directory names are separated by a colon, @samp{:}.
+
+A null directory name is considered to be the same as the current
+directory.  If @var{dir} begins with a forward slash, @samp{/},
+then the search path contained in @code{CDPATH} is not used.
+
+@item command @r{[}@var{command} @r{[}@var{arguments}@r{]}@r{]}
+This causes the shell to run the [external] command named in @var{command} with
+the arguments specified by @var{arguments}, ignoring all
+other shell functions.@refill
+
+For example, if you have a shell function called @code{ls}, and you
+want to call the command @code{ls} as well, you can say @samp{command ls}.
+
+@item continue @r{[}@var{n}@r{]}
+This command tells the shell to resume the next iteration of the
+enclosing @code{for}, @code{while}, or @code{until} loop at the
+@var{n}th enclosing loop (if @var{n} is specified).  @var{n}
+must be greater than or equal to 1.  If @var{n} is greater than the
+number of enclosing loops, the last enclosing loop (the ``top-level''
+loop) is resumed.
+
+@c KELLEM added i (frxi)
+@item declare @r{[}-+frxi@r{]} @r{[}@var{name}@r{[}=@var{value}@r{]}@r{]}
+This command declares variables and gives them attributes.  If no
+@var{name} is given, then a listing of the values of variables is
+displayed instead.
+
+@table @code
+@item -f
+Use function names only.
+
+@item -r
+Make @var{name} readonly.  These names cannot be assigned
+values by subsequent assignment statements.
+
+@item -x
+Make @var{name} export to subsequent commands via the environment.
+
+@c KELLEM added -i:
+@c the -i is here if $[..] arithmetic evaluation is put into 1.06
+@c it's a posix thing
+@item -i
+Treat @var{name} as an integer; arithmetic evaluation
+(@pxref{Arithmetic Evaluation}) will be performed when the variable is
+assigned a value.
+@end table
+
+Using @samp{+} instead of @samp{-} turns off the attribute.  
+
+When @code{declare} is used in a function, it makes @var{name} local,
+the same as the @code{local} command (@pxref{Functions}).
+
+@item dirs
+This displays the list of currently remembered directories. 
+Directories are added to the list with the @code{pushd} command; you
+can get back up through the list with the @code{popd} command.
+
+@item echo @r{[}-ne@r{]} @r{[}arguments@r{]}
+This displays a prompt or a message on the standard output.  It outputs
+the @var{arguments}, if supplied, separated by spaces.  If the
+@samp{-n} option is specified, the trailing newline character is suppressed.@refill
+
+If the @samp{-e} option is given, interpretation of the following
+backslash-escaped characters is turned on:
+
+@table @code
+@c KELLEM added \a:
+@c   \a is a ksh-88 thing and should be included in 1.06 as far as I know
+@item \a
+Alert/bell.
+@item \b
+Backspace.
+
+@item \c
+Suppress trailing newline.
+
+@item \f
+Form feed.
+
+@item \n
+New line.
+
+@item \r
+Carriage return.
+
+@item \t
+Horizontal tab.
+
+@item \v
+Vertical tab.
+
+@item \@var{NNN}
+The character whose @sc{ascii} code is @var{NNN} (octal).
+
+@item \\
+Backslash.
+@end table
+
+@item enable @r{[}-n@r{]} @r{[}@var{names}@r{]}
+This command enables and disables built-in shell commands.  This allows
+you to use an operating system command which has the same name as a
+built-in shell command.
+
+If the @samp{-n} option is used, the named commands, @var{names},
+become disabled.  Otherwise the named commands are enabled.
+
+For example, to use the @code{test} command found in your path instead
+of the built-in shell version, you type @samp{enable -n test}.
+
+@item eval @r{[}@var{arguments}@r{]}
+The @var{arguments} are read and concatenated together into a single
+command.  This ``new'' command is then read and executed by the shell.
+
+@item exec @r{[}@r{[}-@r{]}@var{command} @r{[}@var{arguments}@r{]} @r{]}
+If @var{command} is specified, it is executed, replacing this shell,
+without creating a new process.  The @var{arguments} become arguments
+to @var{command}.
+
+If the first argument is @samp{-}, the shell places a dash in the
+zeroth argument passed to @var{command} (exactly what a login does).
+
+If the @var{command} can't be executed the shell exits, unless the
+shell variable @code{no_exit_on_failed_exec} exists.
+
+If @var{command} is not specified, any redirections present
+take effect in the current shell.
+
+@item exit @r{[}@var{n}@r{]}
+@itemx bye @r{[}@var{n}@r{]}
+This causes the shell to exit with the status specified by @var{n}.  If
+@var{n} is omitted, the exit status is that of the last command
+executed.  A trap on the shell variable @code{EXIT} is executed before
+the shell terminates.
+
+@item export @r{[}-nf@r{]} @r{[}@var{name}@r{[}=@var{word}@r{]}@r{]}
+The @code{export} command exports the value of named variables (or
+functions if the @samp{-f} option is specified), @var{name}, to a
+subshell.
+
+If no variable names are given, @code{export} displays a list of all
+the variables that are already exported.  The @samp{-n} option causes
+the shell to remove the export property from the named variables.
+
+@item fg @r{[}@var{job_spec}@r{]}
+This places the specified job, @var{job_spec}, in the foreground, and
+makes it the current job.  @xref{Resuming}, for more information.  If
+@var{job_spec} is not present, the shell's notion of the current job is
+used.
+
+@item function @var{name} () @r{[} @var{commands} ; @r{]}
+@itemx @var{name} () @r{[} @var{commands} ; @r{]}
+This creates a simple command invoked by @var{name} which executes the
+named @var{commands} (@pxref{Functions}).  Arguments on the
+command line along with @var{name} are passed to the function as
+@samp{$0 @dots{} $@var{n}} (@pxref{Positional}).
+
+@item hash @r{[}-r@r{]} @r{[}@var{name}@r{]}
+For each variable name, @var{name}, the full pathname of the command is
+determined and remembered.  The @samp{-r} option causes the shell to
+forget all remembered locations.  With no arguments, @code{hash}
+presents information about remembered commands.
+
+@c The 'help' sources should be used to augment/check this doc and vice versa
+@c I suspect this doc may have come from those sources
+@item help @r{[}@var{pattern}@r{]}
+This command displays helpful information about built-in commands.  If
+a pattern is specified,
+@c ? same pattern wildcards as for filenames?
+@code{help} gives detailed help on all commands
+matching @var{pattern}, otherwise a list of the built-ins is printed.
+If @var{pattern} contains only alphanumeric characters (no wildcard
+characters, such as @samp{?} and @samp{*}), then a pattern of
+@samp{pattern*} if assumed.  Therefore, the command @samp{help pw} will
+produce help on the @code{pwd} command.
+@c note: must enclose pattern in quotes if contains wildcards, else
+@c  expanded to filenames before help sees it
+
+@item history @r{[}@var{n}@r{]}
+@itemx history -rw @r{[}@var{file}@r{]}
+@itemx history -s @var{arguments}
+The first command displays the history list with line numbers.  Lines listed
+with a @samp{*} have been modified.  If a number @var{n} is specified, only
+the last @var{n} lines of the history list are displayed.  
+
+The @samp{-w} option means causes the current history file to be
+written out.  The @samp{-r} option causes the current history file to
+be read, instead.  If a file name, @var{file}, is given, then that file
+is used as a history list.  If no file name is given, BASH checks to see
+if the variable @code{HISTFILE} is set.  The file @file{~/.bash_history} 
+is used as the history file if the variable @code{HISTFILE} is not set.
+@xref{History}, for more information.
+
+The @samp{-s} option performs history substitution on the named
+arguments.
+
+@item jobs @r{[}-l@r{]}
+This lists the active jobs.  The @samp{-l} option causes the list of
+process identification numbers to be listed in addition to the normal
+information.  @xref{Job Control}, for more information.
+
+@item kill @r{[}-@var{sigspec}@r{]} @var{pid}
+@itemx kill @r{[}-@var{sigspec}@r{]} @var{job_spec}
+@itemx kill -l
+This sends the processes named by @var{pid} or @var{job_spec} the
+terminate signal, or the signal specified by @var{sigspec}, if
+present.  Signals are specified either by number or by name. 
+@c where are the numbers defined? documented?
+
+The @samp{-l} option lists the signal names that can be sent.  Typing
+@code{kill} alone does nothing.  @xref{kill}, for more information.
+
+@c KELLEM added next item (let)
+@c `let' is for arith. eval. -- from posix, check if really in final
+@c release version of 1.06
+@item let @var{expression} @r{[}@var{expression} @dots{}@r{]}
+Each @var{expression} is an arithmetic expression to be evaluated
+(@pxref{Arithmetic Evaluation}).  If the last @var{expression} evaluates
+to 0, @code{let} returns 1; otherwise 0 is returned.@refill
+
+@item local @var{name}@r{[}=@var{value}@r{]}
+This creates a local variable called @var{name}, and gives it a value
+of @var{value}.
+
+When the @code{local} command is used within a function it causes the
+variable @var{name} to be restricted to that function and its children. 
+Otherwise it is equivalent to creating normal variables, as if the
+@code{local} command had been omitted.
+
+When used without options, @code{local} gives a list of local variables
+on the standard output.
+
+@item logout
+This exits a login shell.
+
+@item popd @r{[}+-@var{n}@r{]}
+This removes entries from the directory stack.  With no arguments, it
+removes the top directory from the stack, and changes directories
+(@code{cd}) to the new top directory.
+
+The @samp{+@var{n}} option removes the @var{n}th entry (counting from
+the left of the list shown by the @code{dirs} command), starting with
+zero.  For example:  @code{popd +0} removes the first directory, while
+@code{popd +1} removes the second.
+
+The @samp{-@var{n}} option removes the @var{n}th entry (counting from the
+right of the list shown by the @code{dirs} command), starting with
+zero.  For example:  @code{popd -0} removes the last directory, while
+@code{popd -1} removes the next to last.
+
+You can see the directory stack with the @code{dirs} command.
+
+If the variable @var{pushd_silent} is not set, and the @code{popd}
+command        was successful, a @code{dirs} will be performed too.
+
+@item pushd @r{[}@var{dir}@r{]}
+@itemx pushd @r{[}+-@var{n}@r{]}
+This adds a directory to the top of the directory stack, or rotates the
+stack, making the new top of the stack the current working directory. 
+With no arguments, it exchanges the top two directories.
+
+The @samp{+@var{n}} option rotates the stack so that the @var{n}th
+directory (counting from the left of the list shown by the @code{dirs}
+command) is at the top.
+
+The @samp{-@var{n}} option rotates the stack so that the @var{n}th
+directory (counting from the right of the list shown by the @code{dirs}
+command) is at the top.
+
+The @samp{@var{dir}} option adds the directory named by @var{dir} to
+the directory stack at the top, making it the new current working
+directory.
+
+You can see the directory stack using the @code{dirs} command.
+
+If the variable @var{pushd_silent} is not set, and the @code{pushd}
+command was successful, a @code{dirs} will be performed too.
+
+@item read @r{[}@var{names}@r{]}
+This reads values from the standard input into various shell
+variables.  One line is read from the standard input, and the first
+word is assigned to the first named variable in @var{names}, the second
+word to the second named variable, and so on, with leftover words
+assigned to the last named variable.
+
+Only the characters in @code{IFS} are recognized as word delimiters
+(@pxref{Predefined}).
+
+@item readonly @r{[}-f@r{]}@r{[}@var{names}@r{]}
+The given @var{names} are marked readonly and the values of these
+various @var{names} may not be changed by subsequent assignments.  
+If the @samp{-f} option is given, the functions corresponding to the
+@var{names} are marked instead.  If no arguments are given, a list of
+all read-only names is printed.
+
+@item return @r{[}@var{n}@r{]}
+This causes a function to exit with the return value specified by
+@var{n}.  If @var{n} is omitted, the return status is that of the last
+command executed in the function body.
+
+@c ? what about set with no args -- prints list of vars
+@item set @r{[}-aefhkntuvxldo@r{]} @r{[}@var{arguments}@r{]}
+The @code{set} command sets options for the shell:
+
+@table @code
+@item a
+This marks variables which are modified or created for export.
+
+@item e
+This tells a non-interactive shell to exit immediately if a command
+exits with a non-zero status.
+
+@item f
+This disables path name expansion.
+
+@item h
+This tells the shell to locate and remember function commands as those
+functions are defined.  Normally, function commands are looked up when
+the function is executed.
+
+@item k
+This tells the shell to place all keyword arguments in the
+command's environment.  Normally only those that precede the command
+name are placed in the environment for a command.
+
+@item n
+This tells the shell to read commands but not execute them.  This
+may be used to check a shell script for syntax errors, for example. 
+This option is ignored in interactive shells.
+
+@item t
+This tells the shell to exit after reading and executing one command.
+
+@item u
+This tells the shell to treat unset variables as an error when
+performing substitutions.  If a substitution is attempted on an unset
+variable, the shell prints an error message.  If the shell is
+non-interactive, it then exits with a non-zero status.
+
+@item v
+This prints shell input lines as they are read.
+
+@item x
+This prints the value of @code{PS4} followed by commands and their
+arguments as they are executed.
+
+@item l
+This saves and restores the bindings of the @var{name} in a @code{for}
+command (@pxref{for}).
+
+@item d
+This disables 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.
+
+@c `o' option changed
+@c writeup supplied by KELLEM for new o and for `H', replacing the old `o' option.
+@c ? really true that H is here?  that both h and H exist and are different?!?
+@c that not all the one-letter options have -o named equivalents?
+@item H
+This enables the @samp{!} style history substitution (@pxref{History}).
+This option is on by default.@refill
+
+@item o @r{[}@var{option-name}@r{]}
+The @var{option-name} can be one of the following:
+@table @code
+@item allexport
+Same as @samp{-a}.
+@item braceexpand
+The shell will enable curly brace expansion (SEE BRACE EXPANSION).  This
+is on by default.
+@item emacs
+Use an emacs-style command line editing interface
+@item errexit
+Same as @samp{-e}.
+@item histexpand
+Same as @samp{-H}.
+@item ignoreeof
+The effect is as if the shell command @samp{ignoreeof=10} had been
+executed (@pxref{Shell Vars, ignoreeof, Shell Variables}).
+@item monitor
+Same as @samp{-m}.
+@c ? no -m doc'ed above
+@item noclobber
+The effect is as if the shell command @samp{noclobber=} had been
+executed (@pxref{Shell Vars, noclobber, Shell Variables}).
+@item noexec
+Same as @samp{-n}.
+@item noglob
+Same as @samp{-f}.
+@item nohash
+Same as @samp{-d}.
+@item notify
+The effect is as if the shell command @samp{notify=} had been executed
+(@pxref{Shell Vars, notify, Shell Variables}).
+@item nounset
+Same as @samp{-u}.
+@item verbose
+Same as @samp{-v}.
+@item vi
+Use a @sc{vi}-style command line editing interface.
+@item xtrace
+Same as @samp{-x}.
+@end table
+
+If no @var{option-name} is supplied, the values of the current options
+are printed.
+@end table
+
+@c KELLEM interchanged - and + below (so that - is on)
+You can turn these options on and off by preceding the option letter
+with @samp{-} for on, and @samp{+} for off.  You can also set these
+options on the command line that invokes the shell.  For example:
+
+@example
+bash$ bash -v
+@end example
+
+@noindent
+The special shell variable, @samp{$-} lists the currently defined shell
+options.
+
+You can also use the @code{set} command to assign values to positional
+parameters (@pxref{Parameter Subs}):
+
+@example
+set test junk
+@end example
+
+@noindent
+sets the positional parameter @samp{$1} to test and @samp{$2} to junk. 
+The @var{arguments} are passed as positional parameters @samp{$1} to
+@samp{$N}.
+
+If you type the @code{set} command alone, with no arguments, you get a
+list of all the currently defined shell variables (@pxref{Variables}).  
+
+@item shift @r{[}@var{n}@r{]}
+This causes the positional parameters from @samp{$@var{n}+1} on up to
+be renamed to @samp{$1}, @samp{$2}, and so on.  If
+@var{n} is not given, it is assumed to be 1.
+
+@item suspend @r{[}-f@r{]}
+This suspends the execution of this shell until it receives a
+``resume'' (@code{SIGCONT}) signal.  The @samp{-f} option, if specified,
+prevents messages about this being a login shell (if it is) and causes
+the shell to be suspended quietly anyway.
+
+@item test @r{[}@var{expr}@r{]}
+@itemx [@var{expr}]
+These test for various conditions named in @var{expr}.  They return a
+status of of 0 (true) or 1 (false) depending on the evaluation of
+@var{expr}.
+
+Expressions can be unary or binary.  Unary expressions are often used
+to examine the status of a file.  You can have string operators and
+numeric comparison operators too.
+
+File operators:
+
+@table @code
+@item -b @var{file}
+This tests that the file @var{file} exists and is a block special file.
+
+@item -c @var{file}
+This tests that the file @var{file} exists and is a character special
+file.
+
+@item -d @var{file}
+This tests that the file @var{file} exists and is a directory.
+
+@item -f @var{file}
+This tests that the file @var{file} exists and is not a directory
+(tests that it is a plain file).
+
+@item -g @var{file}
+This tests that the file @var{file} exists and has the set-group-ID bit
+set.
+
+@item -k @var{file}
+This tests that the file @var{file} exists and has its ``sticky'' bit
+set.
+
+@item -L @var{file}
+This tests that the file @var{file} exists and is a symbolic link.
+
+@item -p @var{file}
+This tests that the file @var{file} exists and is a named pipe.
+
+@item -r @var{file}
+This tests that the file @var{file} is readable by you.
+
+@item -s @var{file}
+This tests that the file @var{file} exists and is not empty (has a
+non-zero size).
+
+@item -S @var{file}
+This tests that the file @var{file} exists and is a socket.
+
+@item -t @r{[}@var{FD}@r{]}
+This tests to see if file descriptor @var{FD} is opened on a terminal.
+If @var{FD} is omitted, it defaults to 1 (the standard output).@refill
+
+@item -u @var{file}
+This tests that the file @var{file} exists and has the set-user-ID bit
+set.
+
+@item -w @var{file}
+This tests that the file @var{file} exists and is writable by you.
+
+@item -x @var{file}
+This test that the file @var{file} exists and is executable by you.
+
+@item -O @var{file}
+This tests that the file @var{file} exists and is, effectively, owned
+by you.
+
+@item -G @var{file}
+This tests that the file @var{file} exists and is owned by the
+effective group @sc{id}.
+
+@item @var{file1} -nt @var{file2}
+This tests that the files @var{file1} and @var{file2} exist and that
+@var{file1} is newer than @var{file2} (according to modification date).
+
+@item @var{file1} -ot @var{file2}
+This tests that the files @var{file1} and @var{file2} exist and that
+@var{file1} is older than @var{file2} (according to modification date).
+
+@item @var{file1} -ef @var{file2}
+This tests that the files @var{file} and @var{file2} exist and that
+they have the same device and inode numbers.
+@end table
+
+String operators:
+@c what strings?  variables? variable values?
+
+@table @code
+@item -z @var{string}
+This tests that @var{string} exists and is empty (of zero length).
+
+@item -l @var{string}
+When this is used as an operand to any of the binary arithmetic 
+operators it returns the length of @var{string}.
+
+@item -n @var{string}
+@itemx @var{string}
+This tests that @var{string} exists and is not empty (has a non-zero
+size).
+
+@item @var{string1} = @var{string2}
+This tests that @var{string1} and @var{string2} exist and are equal.
+
+@item @var{string1} != @var{string2}
+This tests that @var{string1} and @var{string2} exist are not equal.
+@end table
+
+Other operators:
+
+@table @code
+@item ! @var{expr}
+This tests that @var{expr} exists and is false.
+
+@item @var{expr1} -a @var{expr2}
+This tests that @var{expr1} and @var{expr2} exist and are both true.
+
+@item @var{expr1} -o @var{expr2}
+This tests that @var{expr1} and @var{expr2} exist and that at least
+one of them is true.
+
+@item @var{argument1} @var{op} @var{argument2}
+@var{op} represents one of the arithmetic binary operators @code{-eq}
+(equals), @code{-ne} (not equals), @code{-lt} (less than), @code{-le}
+(less than or equal to), @code{-gt} (greater than), or @code{-ge}
+(greater than or equal to).
+
+This tests to see if @var{argument1} and @var{argument2} exist and
+also tests if @var{argument1} is equal, not equal, less than, less
+than or equal to, greater than, or greater than or equal to
+@var{argument2}, depending upon the operator used.
+@end table
+
+@item times
+This prints the accumulated user and system times for the shell and 
+for processes started from the shell.
+
+@item trap @r{[}-l@r{]} @r{[}@var{arguments}@r{]} @r{[}@var{sigspec}@r{]}
+The command named by @var{arguments} is to be read and executed when
+the shell receives the signal(s) specified by @var{sigspec}.  
+@var{sigspec} is either a signal name in <signal.h>, or a signal
+number.  The @code{trap} command with no arguments prints the list of
+commands associated with each signal number.  The @samp{-l} option
+causes the shell to print a list of signal names and their
+corresponding numbers.
+
+If @var{arguments} is absent, all specified signals are reset to
+their original values.  If @var{arguments} is the null string, the
+signal is ignored by the shell and by the commands it invokes.  
+
+If @var{sigspec} is @code{EXIT} (0), the command @var{arguments} is
+executed upon exit from the shell.
+
+@item type @r{[}-all@r{]} @r{[}-type | -path@r{]} @r{[}@var{names}@r{]}
+@c KELLEM: might also allow `-a',`-t', & `-p' as synonyms in 1.06
+@c if so, should document here
+This allows you to test to see how each named item, @var{name}, would
+be interpreted if used as a command name.
+@c this item really screwy.  command has ``names'',  description has ``name''
+
+If the @samp{-type} option is used, it returns a single word, either
+@samp{alias}, @samp{function}, @samp{builtin}, or @samp{file}, if
+@var{name} is an alias, shell function, shell builtin, or disk file,
+respectively.  If the name is not found, nothing is printed.
+
+If the @samp{-path} option is used, @code{type} returns either the name
+of the disk file that would be executed, or nothing if @samp{-type}
+doesn't return a value of @samp{file}.
+
+If the @samp{-all} option is used, it displays all of the
+interpretations of @var{names}.  This includes aliases and functions, if
+and only if the @samp{-path} option is not also used.@refill
+
+@item ulimit @r{[}-cdfmst @r{[}@var{limit}@r{]}@r{]}
+@code{ulimit} provides control over the resources available to processes
+started by the shell, on systems that allow such control.  If an
+option is given, it is interpreted as follows:
+
+@table @code
+@item -c
+refers to the maximum size of core (memory dump) files created.
+
+@item -d
+refers to the maximum size of a process's data segment.
+
+@item -f
+refers to the maximum size of files created by the shell.
+
+@item -m
+refers to the maximum resident set size.
+
+@item -s
+refers to the maximum stack size.
+
+@item -t
+refers to the maximum amount of cpu time, in seconds.
+@end table
+
+If @var{limit} is given, it represents the new value of the specified
+resource.  Otherwise, the current value of the specified resource is
+printed.
+
+If no options are given, the @samp{-f} is assumed to be active.  Values
+are in 1k increments, except for @samp{-t}, which is in seconds.
+
+@item umask @r{[}@var{nnn}@r{]}
+This sets the user file-creation mask to the octal number @var{nnn}. 
+If @var{nnn} is omitted, the current value of the mask is printed.
+
+@item unalias @r{[}@var{names}@r{]}
+This removes the named alias(es), @var{names}, from the list of defined
+aliases.
+
+@item unset @r{[}-f@r{]} @r{[}@var{names}@r{]}
+This removes the corresponding variable or function specified by
+@var{names}.  If the @samp{-f} option is given, then functions are
+removed.
+
+The predefined variables @code{PATH}, @code{IFS}, @code{PPID}, 
+@code{PS1}, @code{PS2}, @code{UID}, and @code{EUID} cannot
+be unset (@pxref{Shell Vars}).
+
+@item wait @r{[}n@r{]}
+This asks the shell to wait for the specified process, @var{n}, and
+report its termination status.  @var{n} can be a process @sc{id} or a
+job specification.  If a job specification is given, all processes
+in that job's pipeline are waited for.
+
+If @var{n} is not given, all currently active child processes are
+waited for, and the return code is zero.  @xref{wait}, for more
+information.
+@end table
+
+@node Shell Vars, Install, Built-in, Top
+@appendix Variables Set or Used by the Shell
+
+@c be clearer for each var, who sets it, who uses it
+
+@cindex variables, set or used by the shell
+@cindex shell variables, set or used by the shell
+The following variables are set by the shell.
+@xref{Variable Mechanics}, for information on shell variables.
+
+@c terminology needing defs or refs:
+@c  parent, working directory, user ID, effective user ID, full
+@c  pathname, instance of BASH, search path, internal field separators,
+@c  shell script, password file, system spool directory, primary prompt
+@c  string, secondary prompt string, execution trace, decoded prompt
+@c  string, exapnsion, end-of-file characters, exit, pathname
+@c  expansion, history expansion, tokenization, symbolic links, logical
+@c  chain of directories, complete a hostname, directory stack
+
+@c what is difference between IS and EXPANDS TO?
+@c ? I think almost every 'expands to' here should be 'is'
+@table @code
+@item PPID
+This is the @sc{pid} (process id) of the shell's parent.
+
+@item PWD
+This is the current working directory.
+(It's called @code{PWD} because it is the directory name the @code{pwd}
+command would report.)
+It is updated when you change directories with the @code{cd} command.
+
+@item OLDPWD
+This is the previous working directory.
+When you change directories with the @code{cd} command,
+the directory you move to goes into @code{PWD} and the directory
+you move from goes into @code{OLDPWD}.
+
+@item REPLY
+This is set by the @code{read} built-in command (@pxref{Built-in}) when
+no arguments are supplied.
+
+@item UID
+This expands to the user @sc{id} of the current user.
+
+@item EUID
+This expands to the effective user @sc{id} of the current user.
+
+@item BASH
+This expands to the full pathname used to invoke this instance of BASH.
+
+@item BASH_VERSION
+This expands to the version number of this instance of BASH.
+
+@item SHLVL
+This is incremented by one each time an instance of BASH is started.
+
+@c KELLEM: the following variables are from posix.2 and should be in bash
+@c these include RANDOM, SECONDS, and LINENO [not in 1.06.25]
+@item RANDOM
+Each time this variable is referenced, a random integer is generated.
+The sequence of random numbers may be initialized by assigning a value
+to @code{RANDOM}.  If @code{RANDOM} is unset, it will lose its special
+properties, even if it is subsequently reset.@refill
+
+@item SECONDS
+Each time this variable is referenced, the number of seconds since shell
+invocation is returned.  If a value is assigned to @code{SECONDS}, the
+value returned upon subsequent references is the number of seconds since
+the assignment plus the value assigned.  If @code{SECONDS} is unset, it
+will lose its special properties, even if it is subsequently reset.
+
+@item LINENO
+Each time this variable is referenced, the shell substitutes a decimal
+number representing the current sequential line number (starting with 1)
+within a script or function.  When not in a script or function, the
+value substituted is not guaranteed to be meaningful.  When in a
+function, the value is not the number of the source line that the
+command appears on (that information has been lost by the time the
+function is executed), but is an approximation of the number of commands
+executed in the current function.  If @code{LINENO} is unset, it will
+lose its special properties, even if it is subsequently reset.
+@end table
+
+The following variables are used by the shell.  In some cases, as noted
+below, BASH assigns these variables default values:
+
+@table @code
+@item HOME
+This represents the default argument for the @code{cd} command.  (That
+is, the command @samp{cd} with no arguments will connect to this
+directory.)  It is usually your login directory.  For example:
+
+@example
+HOME=/usr/home/close
+@end example
+
+@noindent
+@code{HOME} is automatically set to your login directory when you log in.
+
+@item PATH
+This is the search path to use when the shell looks for program files
+referenced in commands.  Separate directory names using colons.  Here's
+an example:
+@c explain
+
+@example
+/usr/gnu/bin:/usr/local/bin:.:/usr/ucb:/bin:/usr/bin/X11:/usr/bin
+@end example
+
+@item CDPATH
+This is the search path for the @code{cd} command.  Separate directory
+names using colons.  Here's an example:
+
+@example
+CDPATH=.:~:/usr/src
+@end example
+
+@item IFS
+This defines the internal field separators.   These are the characters
+that separate words.
+@c what words? where?
+It has a default value of space, tab, and newline characters.  Here's an
+example:
+
+@example
+IFS=':'
+@end example
+
+@noindent
+This allows you to read the password file as separate fields.
+
+@item ENV
+If this parameter is set when BASH is executing a shell script, its
+value is interpreted as a file name containing commands to initialize
+the shell (like @file{.bashrc} for interactive shells).
+
+@item MAIL
+This is the file name to use as your mailbox.  If this file is non-zero
+in length and has been modified since the last time the shell checked
+the file, the shell displays the message ``@code{you have mail}''.  You
+control how often the shell checks this file by setting the @code{MAILCHECK}
+variable.
+
+Here's an example using the @code{MAIL} variable:
+
+@example
+MAIL=/usr/homes/close/mbox
+@end example
+
+@noindent
+This causes the shell to check for mail in @file{/usr/homes/close/mbox}
+rather than the system spool directory.
+
+@item MAILCHECK
+This specifies the amount of time that must pass before the shell will
+check the file named by the @code{MAIL} variable to see if it has changed.  The
+default is 60 seconds (1 minute).  An interval of 0 causes the shell
+to look for mail before printing each prompt.
+
+For example,
+
+@example
+MAILCHECK=600
+@end example
+
+@noindent
+causes the shell to check for mail before printing a prompt if 600
+seconds have passed since the last check.
+
+@item MAILPATH
+@c how relates to MAIL variable? what if both set?
+This specifies multiple mailboxes for the shell to check.  It is the
+path the shell uses to check the named files for modifications (receipt
+of mail).  To distinguish which file has received mail, you can follow
+each file name with a @samp{%} and some unique text which is printed
+when mail is received.  Separate file names with colons.  Here's an
+example:
+
+@example
+MAILPATH='/usr/homes/close/mbox?"You have mail":~/shell-mail?"$_ has
+mail!"'
+@end example
+
+@noindent
+This causes the shell to print ``You have mail'' whenever it detects a
+change in the modification time of the file
+@file{/usr/homes/close/mbox}.  Additionally, the file
+@file{/usr/homes/close/shell-mail} is also checked, and the message
+``/usr/homes/close/shell-mail has mail!'' is printed whenever a change
+is detected in its modification time.@refill
+
+@c KELLEM added MAIL_WARNING
+@item MAIL_WARNING
+If this variable is set and one of the specified mail boxes has been
+accessed since the last time BASH checked, then the message ``The mail
+in <mailfile> has been read!'' is printed.@refill
+
+@item  PS1
+This is the primary prompt string.  By default it is @samp{bash\$ }.
+Here's an example:
+
+@example
+PS1="$(whoami)@@$(hostname)$ "
+@end example
+
+@noindent
+This sets the primary prompt string to be the login name of the current
+user, followed by the name of the computer, followed by a dollar sign.
+
+@item PS2
+This is the secondary prompt string.  By default it is @samp{bash>}. 
+For example,
+
+@example
+PS2='more> '
+@end example
+
+@noindent
+sets the secondary prompt string to @samp{more> }.  This is printed
+whenever bash needs more input to complete a command.
+@c elaborate on when needs more input?
+
+@item PS4
+This is the prompt string printed before each command BASH displays
+during an execution trace.  By default, it is @samp{+}.
+
+@item NO_PROMPT_VARS
+If this is set, the decoded prompt string does not undergo further
+expansion.
+
+@item HISTSIZE
+This is the number of commands to remember in the command history list
+(@pxref{History}).  Its default value is 500.
+
+@item HISTFILE
+This is the name of the file in which the command history list is saved
+(@pxref{History}).
+@c apparently: saved over sessions; history of current session not
+@c  there yet if you look (e.g. with emacs or cat)
+
+@item PROMPT_COMMAND
+If this is set, the value is executed as a command prior to issuing
+each primary prompt.
+
+@c bfox: if a shell is running disconnected from tty, every read from
+@c   tty gives it eof -- this way it goes away after n tries
+@item IGNOREEOF
+@itemx ignoreeof
+This controls the action of the shell on receipt of an end-of-file
+character as the sole input.  If set, the value is the number of
+consecutive end-of-file characters typed before bash will exit.
+
+If the variable exists but does not have a numeric value, or has no
+value, the default value is 10.  If it does not exist, an end-of-file
+signifies the end of input to the shell.  This is only in effect for
+interactive shells.
+
+@item HOSTTYPE
+This is automatically set to a string that uniquely describes the type
+of machine on which BASH is executing.  The default is
+system-dependent.
+@c example...
+
+@c KELLEM, adding TMOUT: TMOUT is from posix.2a, I believe
+@item TMOUT
+If this is set to a value greater than zero, the value is interpreted as
+the number of seconds to wait for input after issuing the primary
+prompt.  BASH will terminate after waiting for the number of seconds.
+
+@item notify
+If this is set, BASH will report terminated background jobs
+immediately, rather than waiting until printing the next primary prompt
+(@pxref{notify}).
+
+@item history_control
+@c tested 12/26, ok
+If this is set to a value of @code{ignorespace}, lines that begin with a
+space won't be entered in the history list.
+
+If this is set to a value of @code{ignoredups}, lines that match the last
+line entered in the history list won't be recorded.
+
+If this is unset, or set to any other value than those above, all
+lines read by the shell are saved in the history list.
+
+@item glob_dot_filenames
+If this is set, BASH includes file names beginning with a @samp{.} in
+the results of pathname expansion.
+
+@item allow_null_glob_expansion
+Normally, a filename pattern that doesn't match any files is left in the
+command as is (expands to itself) .  For example, @samp{*.foo} is left
+as is if there are no files ending in @samp{.foo}.
+If @code{allow_null_glob_expansion} is set, however, a pattern that doesn't
+match anything is removed from the command (expands to a null file name).
+@c example?
+
+@c must doc in appropriate parts of manual
+@item histchars
+This represents the two characters which control history expansion and
+tokenization.  The first character is the history expansion character;
+that is, the character which signals the start of a history expansion
+(normally @samp{!}).
+
+The second character is the character which signifies that the
+remainder of the line is a comment, when found as the first character
+of a word.
+@c ? default histchars was empty in 1.06, 2/13/91
+@c I tried setting it, and ! stopped being special but the new chars
+@c didn't seem to do anything.
+
+@item nolinks
+If this is set, the shell doesn't follow symbolic links when doing
+commands that change the current working directory.  By default, BASH
+follows the logical chain of directories when performing commands such
+as @code{cd}.
+
+@item hostname_completion_file
+This contains the name of a file, in the same format as
+@file{/etc/hosts}, that should be read when the shell needs to
+complete a hostname.  You can change the file name interactively; the
+next time you want to complete a hostname BASH adds the contents of the
+new file to the already existing database.@refill
+@c really telling user to modify a public file?!?
+
+@item noclobber
+If this is set, BASH will not overwrite an existing file with the
+@samp{>}, @samp{>&}, and @samp{<>} redirection operators.
+@c KELLEM: <> opens a file descriptor for reading and writing. from posix
+Such an attempt to overwrite a file will generate an error message.
+You can override this via the @samp{>|} redirection operator.  The @samp{>>}
+(append) redirection operator will still work on existing files because
+it only appends to the file and doesn't erase the file's current contents.
+  
+@item auto_resume
+This variable determines whether a command may restart a suspended job
+rather than starting a new one.
+@xref{Resuming}, for more information.
+
+@item no_exit_on_failed_exec
+If this variable exists, the shell doesn't exit if it can't execute the
+file specified in an @code{exec} command (@pxref{Built-in}).
+
+@item cdable_vars
+If this is set, an argument to the @code{cd} built-in command that is
+not a directory is assumed to be the name of a variable whose value
+represents the directory to which you would like to @code{cd}.
+
+@item pushd_silent
+If this is set, the @code{pushd} and @code{popd} built-in commands will
+not print the current directory stack after successful execution.
+@end table
+
+@node Install, Invoke, Shell Vars, Top
+@appendix Installing BASH
+
+This appendix tells how to install BASH on a machine.
+If BASH is already on your machine, or you are not the person installing
+it, ignore this appendix.
+
+@cindex installing BASH
+@cindex BASH, installation
+To install BASH you simply type @kbd{make}. @c really?
+The BASH @file{Makefile} @c really a file name?
+tries to dynamically figure out what kind of machine and operating
+system you are using.  It makes an educated guess based on the
+information it finds.
+
+During the @code{make} process, a message is displayed describing what
+machine and operating system has been chosen for you.  This information
+is also saved in the file @file{.machine} so you can look at it later.
+
+Therefore, for most machines, simply follow this simple checklist to
+install BASH:
+
+@enumerate
+@item
+Type @kbd{make}.
+
+@item
+Wait for the compilation to finish.
+
+@item 
+Type @kbd{./bash} to see if the compile worked.
+@c how can you tell if it worked?
+
+@item
+Type @kbd{cp ./bash /usr/gnu/bin/bash} (or wherever you keep GNU
+binaries) to copy BASH to your binaries directory.
+@end enumerate
+
+@menu
+* Problems::  What to do if BASH doesn't install quite so easily.
+
+* Files::     Files used in the @code{make} process.
+
+* Porting::   Porting BASH to a new machine.
+
+* Bugs::      What to do if you Discover Bugs in BASH.
+
+@end menu
+
+@node Problems, Files, Install, Install
+@appendixsec What if it Doesn't Install so Easily?
+
+@cindex installation, problems with
+@cindex BASH, installation problems
+Sometimes BASH gets confused and will make the wrong assumptions about
+your machine or operating system.  If the displayed information (also
+found in @file{.machine}) is incorrect, you will have to edit the file
+@file{machines.h} and provide the appropriate information so that BASH
+can be installed correctly.  The complete instructions for doing this
+are located in the @file{machines.h} file.
+
+@c what font should UNKNOWN_MACHINE be?
+However, if BASH says that your machine type is an @sc{UNKNOWN_MACHINE},
+or BASH thought it knew something about your machine but was wrong,
+then reading the next few sections could be of use to you
+@xref{Files}, and @ref{Porting}, for more information).
+
+@node Files, Porting, Problems, Install
+@appendixsec Files Used in the @code{make} Process.
+
+@cindex installation, files used in
+@cindex BASH, files used in installation of
+The following files are used during the installation of BASH, in the
+@code{make} process:
+
+@table @code
+@item Makefile
+This is responsible for making the actual @file{Makefile} that is used
+to create Bash.  It runs the C preprocessor (usually located in
+@file{/lib/cpp}) on the file @file{cpp-Makefile}, producing the output
+file @file{bash-Makefile}.
+
+@item cpp-Makefile
+This is a file of C comments and text.  It contains
+@code{ifdefs} that control what files get compiled and which flags
+are passed to the various C files comprising BASH.  It includes a file
+called @file{machines.h}.
+
+@item machines.h
+This file contains the basic compilation parameters for all of the
+machines to which BASH has been ported.  This file consists of a series
+of conditional blocks, one per machine type.
+
+These conditional blocks are depend upon the unique identifier that
+@file{cpp} has predefined for this machine.  In some cases, additional
+information can be passed from @file{Makefile}.  It is possible to pass
+information such as whether or not a particular file is available on
+this system, and so on.
+
+@item bash-Makefile
+This is the output from the initial stage of @code{make}.  It is a
+stripped down version of @file{cpp-Makefile} which is tailor-made for
+your machine and operating system.  All subsequent @code{makes} use
+this file.
+@end table
+
+@node Porting, Bugs, Files, Install
+@appendixsec What if You Have to Port to a New Machine?
+
+@cindex installation, porting to a new machine
+@cindex BASH, porting to a new machine
+@cindex porting BASH to a new machine
+To port BASH to a previously unsupported
+machine, you need to create a block in @file{machines.h}
+that is conditional based on a unique identifier present in your
+version of the C preprocessor.
+
+If you don't know what that symbol is, you might try the following
+simple test:
+
+@example
+bash$ echo "main () @{ @}" > foo.c
+bash$ cc -v foo.c
+@end example
+
+@noindent
+The first command puts a small C program into the file @file{foo.c},
+and the second program compiles that program.
+The @code{-v} option ???. @c what does it do?
+
+@noindent
+Look for something of the form @code{-D}@var{machine} in the output of
+@code{cc}, where @var{machine} is an identifier for your machine.  If
+your machine's C preprocessor doesn't have a unique identifier, you will
+have to define the identifier in @file{Makefile} manually.
+
+Let's say you have a machine from Yoyodyne Industries, called the YoYo. 
+It runs a version of @sc{bsd}, so it is reasonably compatible.
+@c compatible with what?
+However, the
+@file{cpp} file on this YoYo machine doesn't define any unique identifiers. 
+You should change the @file{Makefile} line for @code{CPPFLAGS} to:
+
+@example
+CPPFLAGS = -P -DYoYo
+@end example
+
+@noindent
+Then, in @file{machines.h}, make a copy of the block for
+@code{UNKNOWN_MACHINE}, and change the conditional to:@refill
+
+@example
+#if defined (YoYo)
+@end example
+
+@noindent
+Inside the YoYo block, define @samp{M_MACHINE="YoYo"} and
+@samp{M_OS=BSD}.  You also modify the existing defines to match your
+machine's software.
+
+If BASH still won't compile, perhaps because of missing code that is
+required for your YoYo machine, you will have to write that code and
+place it within a conditional block based on YoYo.
+
+Most machines aren't that difficult; simply redefining a few of the
+default values is sufficient.  If you do run across a difficult machine,
+please send all fixes and changes to bash-maintainers@@ai.mit.edu in the
+form of context diffs:
+
+@example
+diff -c orig-machines.h machines.h >machines.diffs
+@end example
+
+@noindent
+Please include information about which version of the shell you have.
+
+@node Bugs,  , Porting, Install
+@appendixsec Reporting Bugs
+
+@cindex BASH, reporting bugs
+If you find a bug in BASH, you should report it.  But first you should
+make sure that it really is a bug and that it appears in the latest
+version of BASH that is available.
+@c how can you find out if it is the latest BASH?
+
+Once you have ascertained that a bug really exists, you are welcome to
+mail in a bug report.  If you have a fix, please mail that too!
+
+Suggestions and ``philosophical'' bug reports should be mailed to
+bug-bash@@ai.mit.edu.  Genuine bug reports should be mailed to the same
+place, or to bash-maintainers@@ai.mit.edu.
+
+@emph{All} bug reports should include:
+
+@itemize @bullet
+@item
+The version number of BASH.
+@c how find it out?
+
+@item
+The hardware and operating system used.
+
+@item
+The compiler used to compile BASH.
+
+@item
+A description of the bug's behavior.
+
+@item
+A short script or ``recipe'' which demonstrates the bug.
+@end itemize
+
+Without this information, it is generally not possible to successfully
+debug BASH.  Usually, without this information, the bug won't manifest
+itself!
+
+Discussion and questions about BASH in general (including questions
+about this documentation) can be sent to bug-maintainers@@ai.mit.edu. 
+
+@node Invoke, Start-up, Install, Top
+@appendix Invoking BASH
+@c bad title -- more is covered
+
+@cindex invoking BASH
+@cindex BASH, invoking
+@c intro material might be useful elsewhere
+The operating system starts a shell for you when you log in. 
+
+This shell operates interactively; that is, it prompts you for commands
+and processes those commands.  Logging off the system ends this login
+shell.
+
+@cindex shell, interactive
+@cindex shell, login
+@cindex shell, non-interactive
+A login shell is one that's been started with the @samp{-login} flag,
+or one whose first character of argument 0 is a @samp{-}.
+@c I don't understand the last sntence
+An
+interactive shell is one that has been started with the
+@samp{-i} flag, or one whose standard input and standard output are
+both connected to terminals.
+
+A shell doesn't always have to be interactive.  For example, if you use
+a sequence of commands frequently, you can save time typing by storing
+those commands in a file
+@c ? is that the def of a shell script?
+and direct the shell to execute this command
+file when you need it.  When this command file is executed a new
+non-interactive shell
+is started to read and execute the commands in that file.
+@c not necessarily new shell
+
+You can tell if a shell is interactive or not by examining the contents
+of the variable @code{PS1}.  It is unset in non-interactive shells, and set in
+interactive ones.
+@c Why/when do you want to tell? If you're typing at the shell, you
+@c already know it is interactive.  If you're writing a file to be
+@c executed by a noninteractive shell, that file knows it's noninteractive.
+
+@menu
+* Invoke Order::     What files are invokes upon login, logout
+                     and starting non-interactive and non-login
+                     shells.
+
+* Invoke Options::   Options that modify the shell invocation
+                     process.
+
+* Signals::          How BASH handles signals as an interactive
+                     shell.
+
+* Tilde::            How BASH handles tilde expansion.
+
+* Splitting::        How BASH handles word splitting and pathname
+                     expansion.
+@end menu
+
+@node Invoke Order, Invoke Options, Invoke, Invoke
+@appendixsec Automatic Script Execution
+
+@cindex invoking BASH, file order when
+@cindex shell, login file order
+@cindex shell, logout file order
+Upon starting a login shell, the system
+@c ? the system? or bash?
+looks for a file containing
+system-wide start-up instructions for BASH and reads and executes it. 
+Usually these instructions are in a file called @file{/etc/profile}.
+
+Next the system looks for start-up instructions for your account and
+reads and executes it.   These instructions are found in one of the
+following files; the system searches for the following files, in order,
+and reads and executes the first one it finds:
+
+@table @file
+@item ~/.bash_profile
+
+@item ~/.bash_login
+
+@item ~/.profile
+@end table
+
+@noindent
+Since the chosen file contains start-up instructions for @emph{your}
+account, you can modify and ``personalize'' this file if you want. 
+@xref{Start-up}, for an example of this type of file
+(@file{~/.bash_profile}).  If BASH can't find any of these files,
+BASH starts with a default environment; no error message is given.
+
+When exiting a login shell, BASH reads and executes the file
+@file{~/.bash_logout}, if it exists.
+@c bash IS the login shell that is exiting
+@xref{Start-up}, for an example of this type of file.
+
+@cindex shell, interactive file order
+@c what causes non-login interacive shell to start up?
+Upon starting a non-login, interactive shell, BASH
+@c bash IS that shell
+reads and executes the
+file @file{~/.bashrc} if it exists.
+@c ? mnemonic for 'rc'
+@xref{Start-up}, for an example of this type of file.
+
+@cindex shell, non-interactive file order
+@c what causes non-interacive shell to start up?
+Upon starting a non-interactive shell, BASH
+@c bash IS that shell
+checks to see if the
+environment variable
+@c ? env var = shell var ?
+@code{ENV} is non-null, and reads and executes the
+file named by that variable.
+
+@node Invoke Options, Signals, Invoke Order, Invoke
+@appendixsec Options That Modify the Shell Invocation Process
+
+To invoke BASH you can type:
+@c why? you have one already
+
+@c text below says options come before -...
+@example
+bash @r{[}-acefhiknstuvx@r{]} @r{[}@var{options}@r{]}
+@end example
+
+@noindent
+where @var{options} represents one of the multi-character options
+described a bit later in this section.  BASH interprets the following
+single-character options when it is invoked:
+
+@cindex invoking BASH, options
+@cindex shell, invocation options
+@c compare to 'set' options. maybe combine doc
+@c listed here as
+@table @code
+@item a
+Automatically mark variables which are modified or created for export.
+
+@c how does string combine with other single-char options?
+@item c @var{string}
+Commands are read from @var{string}.
+
+@item e
+Exit immediately if a command exits with a nonzero status.
+
+@item f
+Disable pathname generation.
+
+@item h
+Locate and remember function commands as functions are defined.
+
+@item i
+This makes the shell interactive.
+
+@item k
+Place all keyword arguments for a command in the environment for that
+command (not just those arguments that precede the command name).
+
+@item n
+Read commands but don't execute them.
+
+@item s
+If this option is present, or if no arguments remain after option
+processing, commands are read from the standard input.  (This option
+allows the positional parameters to be set when invoking an interactive
+shell.)
+
+@item t
+Exit after reading and executing one command.
+
+@item u
+Treat unset variables as an error when performing parameter expansion.
+
+@item v
+Print shell input lines as they are read.
+
+@item x
+After expanding each command, display the value of @code{PS4} followed
+by the command and its expanded arguments.
+@end table
+
+BASH also interprets a number of multi-character options.  These
+options must appear on the command line @emph{before} the single-character
+options in order to be recognized.  These options are:@refill
+
+@table @code
+
+@item -norc
+Do not load the personal initialization file @file{~/.bashrc}.  This is
+the default if the shell name is @code{sh}.
+@c ???
+
+@item -noprofile
+Do not read either @file{/etc/profile} or @file{~/.bash_profile}, if
+this is a login shell.
+@c what about the other profiles?  ~/.bash_login, ~/.profile
+
+@item -rcfile @var{file}
+Execute commands from @var{file} instead of from the standard personal
+initialization file @file{~/.bashrc}.
+
+@item -version
+Show the version number of this instance of BASH when starting.
+@c this instance = the bash starting up?
+
+@item -quiet
+Do not be verbose when starting up (do not show the shell version or
+any other information).
+
+@item -login
+Make BASH act as if it had been invoked by @code{login}.
+
+@item -nobraceexpansion
+Do not perform curly brace expansion (@pxref{Grouping}).
+
+@item -nolineediting
+Do not use the readline library to read command lines if this shell is
+interactive.
+@end table
+
+If arguments remain after option processing,
+@c no args shown in syntax above
+and neither the
+@samp{-c} nor the @samp{-s} option has been supplied,
+@c s not explained well -- didn't show use of an arg
+then the first
+argument is assumed to be the name of a file containing shell commands. 
+If BASH is invoked in this fashion, the variable @code{0} is set to the name of the
+file, and the positional parameters are set to the remaining arguments. 
+BASH reads and executes commands from this file, then exits.
+
+@node Signals, Prompt, Invoke Options, Invoke
+@appendixsec How BASH Handles Signals
+
+@cindex BASH, signal handling in
+@cindex signals, how BASH handles
+@cindex signal handling
+@c how relates to signals in process chapter?
+
+@c below:explain job control, synchronous job, inherited, command
+@c substitution, kernel, process group id
+
+When BASH is interactive, it ignores @code{SIGTERM}.  This means that
+@samp{kill 0} will not kill an interactive shell.  Also, @code{SIGINT}
+is caught and ignored, so that @code{wait} is interruptible.
+
+In all cases, BASH ignores @code{SIGQUIT}.
+
+If job control is in effect, bash ignores @code{SIGTTIN},
+@code{SIGTTOU}, and @code{SIGTSTP}.  Synchronous jobs started by BASH
+have signals set to the values inherited by the shell from its parent. 
+Background jobs (jobs started with @samp{&}) ignore @code{SIGINT} and
+@code{SIGQUIT}.
+
+Commands run as a result of command substitution ignore the
+keyboard-generated job control signals @code{SIGTTIN}, @code{SIGTTOU},
+and @code{SIGTSTP}.
+
+Here's a description of the signals listed above:
+
+@table @code
+@item SIGINT
+This is the signal generated (normally) by @kbd{C-c} on the keyboard. 
+This signal will kill most processes, although a program may choose to
+ignore @code{SIGINT}.  @code{SIGINT} also allows a process to clean up after itself
+before dying.
+
+@item SIGQUIT
+This is the signal generated (normally) by @kbd{C-\} on the keyboard. 
+@code{SIGQUIT} is identical to @code{SIGINT} except that it requests that the
+operating system produce a diagnostics file (called a @dfn{core dump}
+which is placed into a file named @file{core}).
+
+@item SIGTERM
+@code{SIGTERM} is similar to @code{SIGINT} except that it is normally produced by a
+software program and not from the @kbd{C-c} on the keyboard.  Note that
+some programs treat @code{SIGTERM} differently from @code{SIGINT}.
+
+@item SIGTSTP
+@code{SIGTSTP} is the signal sent (normally) by the @kbd{C-z} key on the
+keyboard.  Some programs may ignore this signal.  This signal does not
+kill the process but instead @emph{stops} the process, putting the
+program into a suspended state.
+
+@item SIGTTIN
+The kernel sends the signal @code{SIGTTIN} to a job/process group that is not
+in the foreground (that is, the process group's process group @sc{id} is not
+equal to the terminal's foreground process group @sc{id}) and attempts to
+read from the terminal.
+
+@item SIGTTOU
+The kernel sends the signal @code{SIGTTOU} to a job/process group that is not
+in the foreground and attempts to write to the terminal if, and only
+if, the terminal has the @sc{tostop} bit set in its local flags word (you
+can set this bit with @samp{stty tostop}).
+@c tostop: code or sc?
+@c what's tostop?  local flags word?
+@end table
+
+@c what is this topic really?  sections removed from another appendix
+@node Command Processing
+@appendix Command Processing
+
+@node Splitting,  , Tilde, Invoke
+@appendixsec Word Splitting and Pathname Expansion
+
+@c purpose of section -- what is effect of splitting? why do we care?
+
+@cindex word splitting
+@cindex splitting, words
+@c ???
+The shell scans the results of parameter expansion and command
+substitution that did not occur within double quotes for word
+splitting.
+
+The shell treats each character of the variable @code{IFS} as a delimiter, and
+splits the results of the other expansions
+@c other than what?
+into words on these
+characters.  The default value of @code{IFS} is exactly
+@samp{<space><TAB><newline>}.
+@c SPCTAB ... how notate?
+  @xref{Shell Vars}, for more information
+on how to change the value of @code{IFS}.
+
+If @code{IFS} is unset or null, no splitting is done.  Otherwise, each occurrence
+of an @code{IFS} character is treated as a delimiter.
+
+Explicit null arguments (@samp{""} or @samp{''} -- i.e., single or
+double quotes with nothing between them) are retained. 
+Implicit null arguments, resulting from the expansion of parameters
+that have no values,
+@c no value -- unset?  null value?
+are removed.  If no expansion occurs, then no splitting is performed.
+
+@cindex expansion, pathname
+@cindex pathname expansion
+After word splitting, BASH scans each word for the special characters
+@samp{*}, @samp{?}, and @samp{[@dots{}]}, unless the @samp{-f} option is
+present.  If one of these characters appears, then the word is regarded
+as a pattern, and replaced with an alphabetically sorted list of
+pathnames matching the pattern.  @xref{File Names}, for more
+information on these special characters.
+
+If no matching pathnames are found, and the shell variable
+@code{allow_null_glob_expansion} is unset, the word is left unchanged
+(@pxref{Shell Vars}).  If the variable is set, the word is removed if
+no matches are found.
+
+@c paragraph unclear
+When a pattern is used for pathname generation, the character @samp{.}
+(at the start of a name or immediately following a slash) must be
+matched explicitly, unless the shell variable @code{glob_dot_filenames}
+is set (@pxref{Shell Vars}).  The slash character must always be
+matched explicitly.  In other cases, the @samp{.} character is not
+treated specially.
+
+@node Start-up, Advanced Scripts, Invoke, Top
+@appendix Sample Script Files
+
+@c some redundancy between invocation appendix and this one re login files
+When you first log in, a shell process is started that establishes the
+environment for your session (@pxref{Invoke Order}).  A system-wide
+login script assigns default values to environment variables creating a
+basic, default environment (@pxref{Environment}). 
+(A login script is simply a file that contains commands that customize
+the environment.)
+
+@cindex start-up files, sample
+@cindex login file samples
+This default environment can be quite restrictive.  BASH uses various
+local login scripts to allow you to change and ``personalize'' the
+default environment (@pxref{Invoke Order}).  If a local login scripts
+exists, it is executed by the shell before you get a shell prompt,
+customizing your environment for you.
+
+@menu
+* Login Script::   Sample of a login script.
+
+* Logout Script::  Sample of a logout script.
+
+* Other Scripts::  Sample of a non-login, interactive shell
+                   script.
+
+@end menu
+
+@node Login Script, Logout Script, Start-up, Start-up
+@appendixsec Login Scripts
+@c some redundancy between invocation appendix and this one re login files
+@cindex login script
+A local login script allows you to change the default environment to
+fit your needs.  If you have one it resides in your home directory. 
+Note that names for this script begin with a dot (@samp{.}), so the
+file remains hidden when performing a standard directory listing
+(@code{ls}).  You have to type @code{ls -a} to see if you have any
+local login scripts.  If you do, it will be called one of the following
+names:
+
+@c if you don't have one, can create one -- how know what put in it?
+@c Be clear it's done after system file, so needn't duplicate what's there
+@table @file
+@item ~/.bash_profile
+
+@item ~/.bash_login
+
+@item ~/.profile
+@end table
+
+Since this file contains start-up instructions for @emph{your} account,
+you can modify this file to create an environment
+specific to your needs.  Here is an example of a BASH start-up file for
+login shells, @file{~/.bash_profile}:
+@c need to explain sample scripts
+
+@cindex login script, sample of
+@cindex script, sample of a login
+@example
+# File: /usr/gnu/lib/Bash_profile
+
+# Startup file for bash login shells.
+#
+default_dir=/usr/gnu/lib/
+
+@c how can your login shell be noninteractive?
+# Test to see if this is an interactive shell.
+if [ "$PS1" ]; then
+  PS1='\u@@\h(\#)\$ '@c KELLEM added \ before $
+  ignoreeof=3
+fi
+
+LOGIN_SHELL=true
+
+# If the user has her own init file, then use that one, else use
+# the canonical one.
+@c why in separate rc file instead of right here?
+if [ -f ~/.bashrc ]; then
+  source ~/.bashrc
+else if [ -f $@{default_dir@}Bashrc ]; then
+  source $@{default_dir@}Bashrc;
+  fi
+fi
+@end example
+
+@node Logout Script, Other Scripts, Login Script, Start-up
+@appendixsec Logout Scripts
+
+A logout script allows you to automate a variety of tasks like starting
+background processes with a @code{nohup} option, running file clean-up
+routines, or simply displaying a logout message when you log out.  If a
+@file{.bash_logout} file exits in your home directory, it is executed
+automatically when you log out.
+@c nohup not illustrated in sample script
+
+The logout script can contain any commands that you might type at the
+shell prompt.  However, a logout script is most useful when used to
+display information about the session just ending and to run background
+commands after you log out. 
+
+Here's an example of a simple BASH logout file, @file{~/.bash_logout}:
+
+@cindex logout script
+@cindex logout script, sample of
+@cindex script, sample of a logout
+@example
+# File: /usr/close/.bash_logout
+# BASH log off file
+
+# First clear the screen.
+clear
+
+# Clean up my files.
+echo "cleaning things up now"
+rm *.o
+
+# Print a logout message.
+echo `whoami` "logged out on" `date`
+
+# Then say goodbye.
+echo "Au revoir"
+@end example
+
+@node Other Scripts, Inputrc File, Logout Script, Start-up
+@appendixsec Non-login, Interactive Scripts
+@c what about noninteracive scripts?
+
+All login scripts are run when you first log in.
+@c all ??
+In addition, login
+scripts that end in @samp{rc} are executed each time your current shell
+creates a subshell.
+@c ? what are the possible rc script names?
+@c ?when does it run a subshell?
+Here's an example of a BASH start-up file for
+non-login, interactive shells, @file{~/.bashrc}:
+@cindex interactive non-login script
+@cindex interactive non-login script, sample of
+@cindex script, sample of an interactive non-login
+
+@example
+# File: /usr/gnu/lib/Bashrc
+# Bourne Again SHell init file.
+#
+# Files you make look like rw-rw-r
+umask 002
+
+# Don't make useless coredump files.  If you want a coredump,
+# say "ulimit -c unlimited" and then cause a segmentation fault.
+ulimit -c 0
+
+# Sometimes, there are lots of places that one can find tex
+# inputs.
+export TEXINPUTS=.:$HOME/bin:/usr/lib/tex/inputs:/usr/local/lib/tex/inputs
+
+# Where's the Gnu stuff at?
+GNU=/usr/gnu/bin
+X11=/usr/bin/X11
+
+UTIL_PATH=$GNU:$X11
+STANDARD_PATH=/usr/local/bin:/usr/ucb:/bin:/usr/bin:/usr/etc:/etc:/usr/games
+if [ "$HOSTTYPE" = "sony" ]; then STANDARD_PATH=$STANDARD_PATH:/usr/sony/bin; fi
+
+if [ -d $HOME/bin/$HOSTTYPE ]; then
+  MY_PATH=$HOME/bin/$HOSTTYPE
+fi
+
+if [ -d $HOME/bin ]; then
+  MY_PATH=$MY_PATH:$HOME/bin
+fi
+
+PATH=.:$MY_PATH:$UTIL_PATH:$STANDARD_PATH
+
+@c section claims to be about interactive script -- why need to test?
+# If running interactively, then:
+if [ "$PS1" ]; then
+
+  # Here are a couple of functions to make csh user's lives easier.
+  setenv () @{
+    export $1="$2"
+  @}
+
+  unsetenv () @{
+    unset $*
+  @}
+
+  # Here are a couple of functions that make *my* life easier.
+  showme () @{
+    local files=$(type -all -path $1)
+    if [ "$files" ]; then ls -l $files; else echo "No such file."; fi
+  @}
+
+  # Set ignoreeof if you don't want EOF as the sole input to the shell to
+  # immediately signal a quit condition.  This only happens at the start
+  # of a line if the line is empty, and you haven't just deleted a character
+  # with C-d.  I turn this on in ~/.bash_profile so that only login shells
+  # have the right to be obnoxious.
+  # ignoreeof=
+
+  # Set auto_resume if you want TWENEX style behavior for command names.
+  auto_resume=
+
+  # Set notify if you want to be asynchronously notified about background
+  # job completion.
+  notify=
+
+  # Make it so that failed `exec' commands don't flush this shell.
+  no_exit_on_failed_exec=
+
+@c section claims to be about non-login script
+  if [ ! "$LOGIN_SHELL" ]; then
+    PS1="\u@@\h\$ "
+  fi
+
+  HISTSIZE=256
+  MAILCHECK=60
+
+  # A couple of default aliases.
+  alias j='jobs -l'
+  alias po=popd
+  alias pu=pushd
+  alias ls='ls -F'
+
+HOST=$(hostname | sed -e 's/\.*//')
+
+xtitle () @{ echo -n -e "\033]l$*\033" @}
+
+  if [ -f ~/.bash_aliases ]; then
+    source ~/.bash_aliases
+  fi
+fi
+@end example
+
+
+@node Advanced Scripts, Tools, Start-up, Top
+@appendix Writing and Debugging Scripts
+
+@cindex debugging shell scripts
+@cindex scripts, debugging
+@cindex shell scripts, debugging
+When writing scripts, it's always possible that mistypings and other
+errors can occur.  In complicated scripts
+errors may be difficult to track down and fix.
+
+The shell can make things simpler though, with its debugging options,
+like @samp{-v} and @samp{-x}.  All can be invoked by command arguments
+to BASH or through the @code{set} command (@pxref{Built-in}).  For
+example, @code{bash -v} or @code{set -v}.
+@c substitute new 'set -o ...' version of above
+
+The @samp{-v} option sets the shell to verbose mode.  This causes
+command lines to be displayed as they are read.
+@c read in general? or just from a script (file)?
+This is useful for
+finding syntax errors.  You can use this option in conjunction with
+the @samp{-n} option,
+@c substitute new 'set -o ...' version of above
+which prevents the execution of commands. 
+However, note that saying @code{set -n} makes a terminal useless until
+an end-of-file is typed.
+@c ? how do you type eof?
+
+The @samp{-x} option displays each command as it is executed, following
+all substitutions.
+@c substitutions such as ...
+This lets you see what is going on as the shell
+program runs.
+@c ? program = script?
+It shows you what the shell did to your command line as
+a result of all the substitutions that took place.  This is useful to
+see if your command lines do what you wanted them to do.
+
+In long shell scripts you can get lots of unwanted and unnecessary
+debugging information from the shell when the 
+@samp{-x} option is used.  You can reduce the amount of output by
+turning this option on (@code{set -x})
+@c substitute new 'set -o ...' version of above
+where you need it and turning it off (@code{set +x}) when you don't.@refill
+@c you mean put 'set '  in the script itslf?
+
+Adding @code{echo} statements to the shell script also helps when
+debugging.  It's like having @code{print} statments in a program.
+
+You can even check for unset shell variables with the @samp{-u} option. 
+When you use this option, attempts to substitute variables that have not
+been set causes an error message and execution is stopped.
+
+@c KELLEM: the next sentence sounds incorrect, will have to verify
+@c All options can be turned off by saying @code{set -}.
+The current setting of the shell options is available as @samp{$-}.
+
+@menu
+* More Scripts::   Advanced sample scripts.
+@end menu
+
+@node More Scripts,  , Advanced Scripts, Advanced Scripts
+@appendixsec More Examples of Shell Scripts
+
+@cindex shell scripts, advanced examples of
+@cindex scripts, advanced examples of
+Here's an example of a more advanced shell script.
+@c more advanced than what?
+This script tells you which file will be executed when you
+use the command you give it as an argument.  It uses @code{sed} to
+split your path, inserting dots in place of null strings to preserve
+the shell semantics.  It tests each directory on your path for an
+executable file whose name is the same as the argument you gave to the
+script.  If it finds one, it tells you what it is and exits with a
+successful status.  If no executable files are found, the script exits
+with a failure status.
+
+@example
+#
+# which -- find out which command in $PATH is executed
+#
+# adapted from Kernighan and Pike
+#
+opath=$PATH
+PATH=/usr/ucb:/bin:/usr/bin
+
+case $# in
+    0)
+     echo "usage: $0 command" 1>&2
+     exit 1
+     ;;
+    *)
+     ;;
+esac
+
+@c !!! my god!!!!  teco**(teco**2)
+for i in $(echo $opath | sed 's/^:/.:/
+                     s/::/:.:/g
+                     s/$:/:./
+                     s/:/ /g')
+do
+     if [ -x $i/$1 ] ; then
+          echo $i/$1
+          exit 0
+     fi
+done
+exit 1
+@end example
+
+
+Here's another example, submitted by Bennett Todd
+(bet@@orion.mc.duke.edu).  It forces the commands run as the arguments
+to the script to die after some timeout. This is handy for debugging
+full-screen programs (like Emacs) that, if they get hung, wedge the
+terminal fatally.
+
+@example
+#!/bin/sh
+# Launch a sleeping killer-offer
+
+progname=`basename $0`
+timeout=10
+signal=TERM
+
+while test $# -gt 2 -a `expr "x$1" : "x-."` -gt 0
+do
+     case "x$1"
+     in
+          x-t) shift; timeout=$1; shift;;
+          x-s) shift;  signal=$1; shift;;
+     esac
+done
+
+if test $# -lt 1
+then
+     echo "syntax: $0 [-t timeout] [-s signal] command" 1>&2
+     exit 1
+fi
+
+(sleep $timeout; kill -$signal $$) &
+exec "$@@"
+@end example
+
+Finally, here's one more example of a shell script, submitted by Bill
+Trost (trost@@reed.bitnet).  It creates an extended version of the
+shell's @code{pushd} & @code{popd} commands.  It's slower than the
+built-ins, but also adds a couple of features to @code{pushd}: negative
+numeric arguments (given a dirstack of size 3, @code{pushd +2} is
+equivalent to @code{pushd -1}), and named references.  With a named
+reference, a command of the form @code{pushd +xterm} will rotate the
+directory stack to the first directory whose final component is
+@file{xterm}.  It uses the @samp{#} variable construct, and lots of
+@code{sets} and @code{shifts}.
+
+@example
+# A shell-level version of pushd and popd.  A bit slower, a bit
+# cleverer.  I added a feature, which is best described by
+# example.
+# Suppose you have the directory stack consisting of /tmp,
+# /local/src/X11r4/mit/clients/xterm, and ~/prj/term (/tmp at the
+# top).  If you type "pushd +xterm", you'll end up in the first
+# directory whose name end with "xterm".
+
+# This is a complete rewrite of a similar function posted to
+# gnu.bash.bug by Martin Tomes <mt00@@eurotherm.co.uk>.  I've done
+# a little benchmarking, and this version's pushd appears to be 
+# gobs faster; this is probably due to my use of the case 
+# construct instead of if/elif/fi.  The if construct (at least in
+# Bourne shell) has historically been very slow.  Then again,
+# popd was just as fast...?
+# The alternative explanation is that his frequent use of the
+# "cut" and "expr" commands slowed things down.
+
+# This program expects the "seq" command to give a sequence of
+# numbers from $1 to $2.  I have a "seq" function which is
+# usually very fast.
+
+dirs () @{ echo $PWD $DIRS @}
+
+pushd () @{
+  case "$1" in
+    "")
+        # Swap first two.
+        local here=$PWD
+        set $DIRS
+        cd "$1"
+        shift
+        DIRS="$here $*"
+        ;;
+    +[0-9]*)
+        local save i=$@{1#+@}
+        set $PWD $DIRS
+        for i in `seq 1 $i`; do
+          [ "$1" = "" ] && @{ set $PWD $DIRS ; save= @}
+          save="$save $1"
+          shift
+        done
+        [ "$1" = "" ] || @{
+          cd $1
+          shift
+          DIRS="$* $save"
+        @}
+        ;;
+    [-][0-9]*)
+        local dest=$@{1#-@}
+        set $PWD $DIRS
+        pushd +`expr $# -  \\( $dest % $# \\)`
+        ;;
+    +?*)
+        # Feature: pushd +foo will push to directory whose
+        # basename is "foo".
+        local wrap i goal=$@{1#+@} found=false
+        set $PWD $DIRS
+        for i; do
+          [ $@{i##*/@} = "$goal" ] && @{
+            cd $i
+            shift
+            DIRS="$* $wrap"
+            found=true
+            break
+          @}
+          wrap="$wrap $i"
+          shift
+        done
+        $found || @{
+          echo $@{goal@}: Directory not on stack. 1>&2
+          return 1
+        @}
+        ;;
+    *)
+        [ ! -d $1 ] && @{
+          echo "$1": No such file or directory 1>&2
+          return 1
+        @}
+        DIRS="$PWD $DIRS"
+        cd $1
+        ;;
+  esac
+  true $@{pushd_silent:-`dirs`@}
+@}
+
+popd () @{
+  [ -z "$DIRS" ] && @{
+    echo popd: Directory stack empty 1>&2
+    return 1
+  @}
+  case "$1" in
+    "")
+        set $DIRS
+        cd $1
+        shift
+        DIRS="$*"
+        ;;
+    +*)
+        count=$1
+        set $DIRS
+        # Hack until builtin test works correctly with unary +
+        /bin/[ $count -gt $# ] && @{
+          echo popd: Directory stack not that deep 1>&2
+          return 1
+        @}
+        DIRS="`echo $DIRS | awk '@{ $'$count' = \"\"; print @}'`"
+        ;;
+    *)
+        echo 'popd: usage: popd [ +n ]' 1>&2
+        return 1
+        ;;
+  esac
+  true $@{pushd_silent:-`dirs`@}
+@}
+@end example
+
+
+@node Tools, Authors, Advanced Scripts, Top
+@appendix Useful Operating System Programs
+
+This is the section that will include useful and related operating
+system commands (NOT built-ins) to use with the shell and shell
+procedures.
+
+If you think that various utilities and commands used to support shell
+programming belong in the shell programming manual, then go ahead and
+add them yourself.  Personally, I feel that there is no good determiner
+of whether a utility belongs in the shell programming manual or whether
+it belongs in the GNU operating system manual.
+
+@c following note by JEMS
+@c maybe should include  those used in examples
+@c (e.g. ls, rm cat, who, sort, date, more, wc, ...)
+
+@node Authors, Concept Index, Tools, Top
+@appendix Who and Where to Write
+
+@c main topic is acknowledgments, not who to write
+
+@cindex authors
+This manual is a combined effort of a number of people.  Diane Barlow
+Close (close@@lunch.wpd.sgi.com) wrote the original draft.  Julie
+Sussman (jems@@altdorf.lcs.mit.edu) did the majority of reorganization
+and the second draft.  Without her help, this manual would probably
+still be waiting to be written.  Brian Fox (bfox@@ai.mit.edu) produced
+the third draft, and provided technical advice for Diane and Julie.
+
+Chet Ramey (chet@@cwns1.ins.cwru.edu) provided many examples for this
+manual and wrote the BASH man page.
+
+Richard Stallman (rms@@ai.mit.edu) provided editing and polishing of
+the finished product.
+
+Others who provided assistance of varying degrees are mentioned in the
+acknowledgement section (@pxref{Thanks}).
+
+Errors concerning this documentation should be sent to
+bug-bash-manual@@ai.mit.edu.  @xref{Bugs}, for information on where to
+send bug reports for BASH itself.@refill
+
+@node Concept Index,  , Authors, Top
+@unnumbered Concept Index
+
+@printindex cp
+
+@summarycontents
+@contents
+@bye
diff --git a/doc/rbash.0 b/doc/rbash.0
new file mode 100644 (file)
index 0000000..f53687c
--- /dev/null
@@ -0,0 +1,60 @@
+RBASH(1)                                                              RBASH(1)
+
+
+
+N\bNA\bAM\bME\bE
+       rbash - restricted bash, see b\bba\bas\bsh\bh(1)
+
+R\bRE\bES\bST\bTR\bRI\bIC\bCT\bTE\bED\bD S\bSH\bHE\bEL\bLL\bL
+       If b\bba\bas\bsh\bh is started with the name r\brb\bba\bas\bsh\bh, or the -\b-r\br option is supplied at
+       invocation, the shell becomes restricted.  A restricted shell  is  used
+       to  set  up an environment more controlled than the standard shell.  It
+       behaves identically to b\bba\bas\bsh\bh with the exception that the  following  are
+       disallowed or not performed:
+
+       +\bo      changing directories with c\bcd\bd
+
+       +\bo      setting or unsetting the values of S\bSH\bHE\bEL\bLL\bL, P\bPA\bAT\bTH\bH, E\bEN\bNV\bV, or B\bBA\bAS\bSH\bH_\b_E\bEN\bNV\bV
+
+       +\bo      specifying command names containing /\b/
+
+       +\bo      specifying a file name containing a /\b/ as an argument  to  the  .\b.
+              builtin command
+
+       +\bo      Specifying  a  filename containing a slash as an argument to the
+              -\b-p\bp option to the h\bha\bas\bsh\bh builtin command
+
+       +\bo      importing function definitions from  the  shell  environment  at
+              startup
+
+       +\bo      parsing  the  value  of  S\bSH\bHE\bEL\bLL\bLO\bOP\bPT\bTS\bS from the shell environment at
+              startup
+
+       +\bo      redirecting output using the >, >|, <>, >&, &>, and >>  redirec-
+              tion operators
+
+       +\bo      using the e\bex\bxe\bec\bc builtin command to replace the shell with another
+              command
+
+       +\bo      adding or deleting builtin commands with the -\b-f\bf and  -\b-d\bd  options
+              to the e\ben\bna\bab\bbl\ble\be builtin command
+
+       +\bo      Using  the  e\ben\bna\bab\bbl\ble\be  builtin  command  to  enable  disabled shell
+              builtins
+
+       +\bo      specifying the -\b-p\bp option to the c\bco\bom\bmm\bma\ban\bnd\bd builtin command
+
+       +\bo      turning off restricted mode with s\bse\bet\bt +\b+r\br or s\bse\bet\bt +\b+o\bo r\bre\bes\bst\btr\bri\bic\bct\bte\bed\bd.
+
+       These restrictions are enforced after any startup files are read.
+
+       When a command that is found to be a shell script is executed (see C\bCO\bOM\bM-\b-
+       M\bMA\bAN\bND\bD  E\bEX\bXE\bEC\bCU\bUT\bTI\bIO\bON\bN  above),  r\brb\bba\bas\bsh\bh turns off any restrictions in the shell
+       spawned to execute the script.
+
+S\bSE\bEE\bE A\bAL\bLS\bSO\bO
+       bash(1)
+
+
+
+GNU                               1999 Nov 29                         RBASH(1)
diff --git a/doc/rbash.ps b/doc/rbash.ps
new file mode 100644 (file)
index 0000000..861e9db
--- /dev/null
@@ -0,0 +1,265 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.18.1
+%%CreationDate: Thu Nov 13 09:47:38 2003
+%%DocumentNeededResources: font Times-Roman
+%%+ font Times-Bold
+%%DocumentSuppliedResources: procset grops 1.18 1
+%%Pages: 1
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.18 1
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/MANUAL{
+statusdict begin/manualfeed true store end
+}bind def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/Fr{
+setrgbcolor fill
+}bind def
+/Fk{
+setcmykcolor fill
+}bind def
+/Fg{
+setgray fill
+}bind def
+/FL/fill load def
+/LW/setlinewidth load def
+/Cr/setrgbcolor load def
+/Ck/setcmykcolor load def
+/Cg/setgray load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Times-Bold
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
+def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
+/scaron/zcaron/Ydieresis/trademark/quotesingle/Euro/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
+/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
+/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
+/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
+/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
+/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
+/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
+/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
+/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
+/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
+/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
+/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
+/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
+/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
+/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
+/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
+/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
+/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
+/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
+/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
+/Times-Bold@0 ENC0/Times-Bold RE/Times-Roman@0 ENC0/Times-Roman RE
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF(RB)72 48 Q 376.2(ASH\(1\) RB)-.35 F(ASH\(1\))
+-.35 E/F1 10.95/Times-Bold@0 SF -.219(NA)72 84 S(ME).219 E F0
+(rbash \255 restricted bash, see)108 96 Q/F2 10/Times-Bold@0 SF(bash)2.5
+E F0(\(1\))A F1(RESTRICTED SHELL)72 112.8 Q F0(If)108 124.8 Q F2(bash)
+4.397 E F0 1.897(is started with the name)4.397 F F2(rbash)4.397 E F0
+4.397(,o)C 4.397(rt)-4.397 G(he)-4.397 E F2<ad72>4.397 E F0 1.896
+(option is supplied at in)4.397 F -.2(vo)-.4 G 1.896
+(cation, the shell becomes).2 F 3.445(restricted. A)108 136.8 R .945
+(restricted shell is used to set up an en)3.445 F .946
+(vironment more controlled than the standard shell.)-.4 F(It)5.946 E
+(beha)108 148.8 Q -.15(ve)-.2 G 2.5(si).15 G(dentically to)-2.5 E F2
+(bash)2.5 E F0(with the e)2.5 E(xception that the follo)-.15 E
+(wing are disallo)-.25 E(wed or not performed:)-.25 E 32.5<8363>108
+165.6 S(hanging directories with)-32.5 E F2(cd)2.5 E F0 32.5<8373>108
+182.4 S(etting or unsetting the v)-32.5 E(alues of)-.25 E F2(SHELL)2.5 E
+F0(,)A F2 -.74(PA)2.5 G(TH)-.21 E F0(,)A F2(ENV)2.5 E F0 2.5(,o)C(r)-2.5
+E F2 -.3(BA)2.5 G(SH_ENV).3 E F0 32.5<8373>108 199.2 S
+(pecifying command names containing)-32.5 E F2(/)2.5 E F0 32.5<8373>108
+216 S(pecifying a \214le name containing a)-32.5 E F2(/)2.5 E F0
+(as an ar)2.5 E(gument to the)-.18 E F2(.)2.5 E F0 -.2(bu)5 G
+(iltin command).2 E 32.5<8353>108 232.8 S .351
+(pecifying a \214lename containing a slash as an ar)-32.5 F .351
+(gument to the)-.18 F F2<ad70>2.851 E F0 .351(option to the)2.851 F F2
+(hash)2.851 E F0 -.2(bu)2.851 G .351(iltin com-).2 F(mand)144 244.8 Q
+32.5<8369>108 261.6 S(mporting function de\214nitions from the shell en)
+-32.5 E(vironment at startup)-.4 E 32.5<8370>108 278.4 S(arsing the v)
+-32.5 E(alue of)-.25 E F2(SHELLOPTS)2.5 E F0(from the shell en)2.5 E
+(vironment at startup)-.4 E 32.5<8372>108 295.2 S(edirecting output usi\
+ng the >, >|, <>, >&, &>, and >> redirection operators)-32.5 E 32.5
+<8375>108 312 S(sing the)-32.5 E F2(exec)2.5 E F0 -.2(bu)2.5 G
+(iltin command to replace the shell with another command).2 E 32.5<8361>
+108 328.8 S(dding or deleting b)-32.5 E(uiltin commands with the)-.2 E
+F2<ad66>2.5 E F0(and)2.5 E F2<ad64>2.5 E F0(options to the)2.5 E F2
+(enable)2.5 E F0 -.2(bu)2.5 G(iltin command).2 E 32.5<8355>108 345.6 S
+(sing the)-32.5 E F2(enable)2.5 E F0 -.2(bu)2.5 G
+(iltin command to enable disabled shell b).2 E(uiltins)-.2 E 32.5<8373>
+108 362.4 S(pecifying the)-32.5 E F2<ad70>2.5 E F0(option to the)2.5 E
+F2(command)2.5 E F0 -.2(bu)2.5 G(iltin command).2 E 32.5<8374>108 379.2
+S(urning of)-32.5 E 2.5(fr)-.25 G(estricted mode with)-2.5 E F2(set +r)
+2.5 E F0(or)2.5 E F2(set +o r)2.5 E(estricted)-.18 E F0(.)A
+(These restrictions are enforced after an)108 396 Q 2.5(ys)-.15 G
+(tartup \214les are read.)-2.5 E 1.566
+(When a command that is found to be a shell script is e)108 412.8 R -.15
+(xe)-.15 G 1.567(cuted \(see).15 F/F3 9/Times-Bold@0 SF 1.567
+(COMMAND EXECUTION)4.067 F F0(abo)3.817 E -.15(ve)-.15 G(\),).15 E F2
+(rbash)108 424.8 Q F0(turns of)2.5 E 2.5(fa)-.25 G .3 -.15(ny r)-2.5 H
+(estrictions in the shell spa).15 E(wned to e)-.15 E -.15(xe)-.15 G
+(cute the script.).15 E F1(SEE ALSO)72 441.6 Q F0(bash\(1\))108 453.6 Q
+183.805(GNU 1999)72 768 R(No)2.5 E 2.5(v2)-.15 G 202.965(91)-2.5 G 0 Cg
+EP
+%%Trailer
+end
+%%EOF
diff --git a/doc/rose94.pdf b/doc/rose94.pdf
new file mode 100644 (file)
index 0000000..f5ce80d
Binary files /dev/null and b/doc/rose94.pdf differ
diff --git a/doc/rose94.ps b/doc/rose94.ps
new file mode 100644 (file)
index 0000000..1fff283
--- /dev/null
@@ -0,0 +1,1581 @@
+%!PS-Adobe-3.0
+%%Creator: groff version 1.08
+%%DocumentNeededResources: font Times-Bold
+%%+ font Times-Italic
+%%+ font Times-Roman
+%%+ font Courier
+%%+ font Symbol
+%%DocumentSuppliedResources: procset grops 1.08 0
+%%Pages: 13
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset grops 1.08 0
+/setpacking where{
+pop
+currentpacking
+true setpacking
+}if
+/grops 120 dict dup begin
+/SC 32 def
+/A/show load def
+/B{0 SC 3 -1 roll widthshow}bind def
+/C{0 exch ashow}bind def
+/D{0 exch 0 SC 5 2 roll awidthshow}bind def
+/E{0 rmoveto show}bind def
+/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
+/G{0 rmoveto 0 exch ashow}bind def
+/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/I{0 exch rmoveto show}bind def
+/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
+/K{0 exch rmoveto 0 exch ashow}bind def
+/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/M{rmoveto show}bind def
+/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
+/O{rmoveto 0 exch ashow}bind def
+/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/Q{moveto show}bind def
+/R{moveto 0 SC 3 -1 roll widthshow}bind def
+/S{moveto 0 exch ashow}bind def
+/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
+/SF{
+findfont exch
+[exch dup 0 exch 0 exch neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/MF{
+findfont
+[5 2 roll
+0 3 1 roll 
+neg 0 0]makefont
+dup setfont
+[exch/setfont cvx]cvx bind def
+}bind def
+/level0 0 def
+/RES 0 def
+/PL 0 def
+/LS 0 def
+/PLG{
+gsave newpath clippath pathbbox grestore
+exch pop add exch pop
+}bind def
+/BP{
+/level0 save def
+1 setlinecap
+1 setlinejoin
+72 RES div dup scale
+LS{
+90 rotate
+}{
+0 PL translate
+}ifelse
+1 -1 scale
+}bind def
+/EP{
+level0 restore
+showpage
+}bind def
+/DA{
+newpath arcn stroke
+}bind def
+/SN{
+transform
+.25 sub exch .25 sub exch
+round .25 add exch round .25 add exch
+itransform
+}bind def
+/DL{
+SN
+moveto
+SN
+lineto stroke
+}bind def
+/DC{
+newpath 0 360 arc closepath
+}bind def
+/TM matrix def
+/DE{
+TM currentmatrix pop
+translate scale newpath 0 0 .5 0 360 arc closepath
+TM setmatrix
+}bind def
+/RC/rcurveto load def
+/RL/rlineto load def
+/ST/stroke load def
+/MT/moveto load def
+/CL/closepath load def
+/FL{
+currentgray exch setgray fill setgray
+}bind def
+/BL/fill load def
+/LW/setlinewidth load def
+/RE{
+findfont
+dup maxlength 1 index/FontName known not{1 add}if dict begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+/Encoding exch def
+dup/FontName exch def
+currentdict end definefont pop
+}bind def
+/DEFS 0 def
+/EBEGIN{
+moveto
+DEFS begin
+}bind def
+/EEND/end load def
+/CNT 0 def
+/level1 0 def
+/PBEGIN{
+/level1 save def
+translate
+div 3 1 roll div exch scale
+neg exch neg exch translate
+0 setgray
+0 setlinecap
+1 setlinewidth
+0 setlinejoin
+10 setmiterlimit
+[]0 setdash
+/setstrokeadjust where{
+pop
+false setstrokeadjust
+}if
+/setoverprint where{
+pop
+false setoverprint
+}if
+newpath
+/CNT countdictstack def
+userdict begin
+/showpage{}def
+}bind def
+/PEND{
+clear
+countdictstack CNT sub{end}repeat
+level1 restore
+}bind def
+end def
+/setpacking where{
+pop
+setpacking
+}if
+%%EndResource
+%%IncludeResource: font Times-Bold
+%%IncludeResource: font Times-Italic
+%%IncludeResource: font Times-Roman
+%%IncludeResource: font Courier
+%%IncludeResource: font Symbol
+grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL
+792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron
+/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
+/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space
+/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft
+/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four
+/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C
+/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash
+/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q
+/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase
+/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger
+/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
+/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
+/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar
+/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus
+/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu
+/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright
+/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde
+/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute
+/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
+/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls
+/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute
+/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve
+/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex
+/udieresis/yacute/thorn/ydieresis]def/Courier@0 ENC0/Courier RE/Times-Roman@0
+ENC0/Times-Roman RE/Times-Italic@0 ENC0/Times-Italic RE/Times-Bold@0 ENC0
+/Times-Bold RE
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 12/Times-Bold@0 SF(Bash, the Bour)210.99 123 Q(ne\255Again Shell)-.18 E/F1
+10/Times-Italic@0 SF(Chet Rame)263.85 147 Q(y)-.3 E(Case W)221.72 159 Q
+(estern Reserve Univer)-.92 E(sity)-.1 E -.15(ch)250.425 171 S(et@po.cwru.edu)
+.15 E(ABSTRA)264.535 213 Q(CT)-.3 E/F2 10/Times-Roman@0 SF .019(An o)133 237 R
+-.15(ve)-.15 G(rvie).15 E 2.519(wo)-.25 G 2.519(f/)191.918 237 S .018
+(bin/sh\255compatible shells is presented, as well as an introduction to)
+200.547 237 R .128(the POSIX.2 shell and tools standard.)108 249 R .128
+(These serv)5.128 F 2.628(ea)-.15 G 2.628(sa)318.562 249 S 2.628(ni)329.52 249
+S .128(ntroduction to bash.)339.928 249 R 2.628(Ac)5.128 G(ompar)439.32 249 Q
+(-)-.2 E .188(ison of bash to sh and ksh is presented, as well as a discussion\
+ of features unique to bash.)108 261 R(Finally)108 273 Q 3.178(,s)-.65 G .678
+(ome of the changes and ne)145.258 273 R 3.178(wf)-.25 G .678
+(eatures to appear in the ne)268.486 273 R .678(xt bash release will be)-.15 F
+(discussed.)108 285 Q/F3 10/Times-Bold@0 SF 2.5(1. Intr)72 321 R(oduction)-.18
+E(Bash)97 336.6 Q F2 .904(is the shell, or command language interpreter)3.404 F
+3.404(,t)-.4 G .904(hat will appear in the GNU operating system.)316.032 336.6
+R .782(The name is an acron)72 348.6 R .782(ym for the `)-.15 F(`Bourne\255Ag)
+-.74 E .782(ain SHell')-.05 F .782(', a pun on Ste)-.74 F 1.082 -.15(ve B)-.25
+H .783(ourne, the author of the direct).15 F .212(ancestor of the current)72
+360.6 R/F4 9/Times-Roman@0 SF(UNIX)2.712 E F2 2.712<8773>C(hell)199.131 360.6 Q
+F1(/bin/sh)2.712 E F2 2.712(,w)C .212(hich appeared in the Se)256.505 360.6 R
+-.15(ve)-.25 G .211(nth Edition Bell Labs Research v).15 F(er)-.15 E(-)-.2 E
+(sion of)72 372.6 Q F4(UNIX)2.5 E F2([1].).833 E .191(Bash is an)97 388.2 R F3
+(sh)2.691 E F2 .192
+(\255compatible shell that incorporates useful features from the K)B .192
+(orn shell \()-.35 F F3(ksh)A F2 .833(\)[)C .192(2] and the)-.833 F 2.767(Cs)72
+400.2 S .267(hell \()85.327 400.2 R F3(csh)A F2 .833(\)[)C .267
+(3], described later in this article.)-.833 F .266
+(It is ultimately intended to be a conformant implementation)5.267 F 1.965
+(of the IEEE POSIX Shell and T)72 412.2 R 1.966(ools speci\214cation \(IEEE W)
+-.8 F 1.966(orking Group 1003.2\).)-.8 F 1.966(It of)6.966 F 1.966
+(fers functional)-.25 F(impro)72 424.2 Q -.15(ve)-.15 G(ments o).15 E -.15(ve)
+-.15 G 2.5(rs).15 G 2.5(hf)155.28 424.2 S(or both interacti)166.11 424.2 Q .3
+-.15(ve a)-.25 H(nd programming use.).15 E .802
+(While the GNU operating system will most lik)97 439.8 R .801(ely include a v)
+-.1 F .801(ersion of the Berk)-.15 F(ele)-.1 E 3.301(ys)-.15 G .801
+(hell csh, bash)448.238 439.8 R .108(will be the def)72 451.8 R .108
+(ault shell.)-.1 F(Lik)5.108 E 2.608(eo)-.1 G .108(ther GNU softw)199.658 451.8
+R .108(are, bash is quite portable.)-.1 F .109(It currently runs on nearly e)
+5.109 F -.15(ve)-.25 G(ry).15 E -.15(ve)72 463.8 S .367(rsion of).15 F F4(UNIX)
+2.867 E F2 .367(and a fe)2.867 F 2.867(wo)-.25 G .367
+(ther operating systems \255 an independently-supported port e)187.933 463.8 R
+.366(xists for OS/2, and)-.15 F .706(there are rumors of ports to DOS and W)72
+475.8 R(indo)-.4 E .706(ws NT)-.25 F 5.706(.P)-.74 G .706(orts to)295.97 475.8
+R F4(UNIX)3.206 E F2(-lik)A 3.206(es)-.1 G .706(ystems such as QNX and Minix)
+372.979 475.8 R(are part of the distrib)72 487.8 Q(ution.)-.2 E .51
+(The original author of bash w)97 503.4 R .51(as Brian F)-.1 F .509
+(ox, an emplo)-.15 F .509(yee of the Free Softw)-.1 F .509(are F)-.1 F 3.009
+(oundation. The)-.15 F(cur)3.009 E(-)-.2 E(rent de)72 515.4 Q -.15(ve)-.25 G
+(loper and maintainer is Chet Rame).15 E 1.3 -.65(y, a v)-.15 H(olunteer who w)
+.45 E(orks at Case W)-.1 E(estern Reserv)-.8 E 2.5(eU)-.15 G(ni)458.91 515.4 Q
+-.15(ve)-.25 G(rsity).15 E(.)-.65 E F3 2.5(2. What)72 539.4 R(is a shell?)2.5 E
+F2 1.241(At its base, a shell is simply a macro processor that e)97 555 R -.15
+(xe)-.15 G 1.242(cutes commands.).15 F(A)6.242 E F4(UNIX)3.742 E F2 1.242
+(shell is both a)3.742 F .189(command interpreter)72 567 R 2.688(,w)-.4 G .188
+(hich pro)167.787 567 R .188(vides the user interf)-.15 F .188
+(ace to the rich set of)-.1 F F4(UNIX)2.688 E F2 .188
+(utilities, and a programming)2.688 F .751(language, allo)72 579 R .752
+(wing these utilitites to be combined.)-.25 F .752
+(The shell reads commands either from a terminal or a)5.752 F 2.52
+(\214le. Files)72 591 R .019
+(containing commands can be created, and become commands themselv)2.52 F 2.519
+(es. These)-.15 F(ne)2.519 E 2.519(wc)-.25 G(ommands)465.11 591 Q(ha)72 603 Q
+.395 -.15(ve t)-.2 H .095(he same status as system commands in directories lik)
+.15 F(e)-.1 E F3(/bin)2.595 E F2 2.595(,a)C(llo)342.575 603 Q .096
+(wing users or groups to establish cus-)-.25 F(tom en)72 615 Q(vironments.)-.4
+E F3 2.5(2.1. Command)72 639 R(Inter)2.5 E(pr)-.1 E(eter)-.18 E F2 2.926(As)97
+654.6 S .426(hell allo)111.036 654.6 R .426(ws e)-.25 F -.15(xe)-.15 G .426
+(cution of).15 F F4(UNIX)2.926 E F2 .426
+(commands, both synchronously and asynchronously)2.926 F 5.425(.T)-.65 G(he)
+460.165 654.6 Q F1 -.37(re)2.925 G(dir).37 E(ec-)-.37 E(tion)72 666.6 Q F2 .334
+(constructs permit \214ne-grained control of the input and output of those com\
+mands, and the shell allo)2.833 F(ws)-.25 E .559(control o)72 678.6 R -.15(ve)
+-.15 G 3.058(rt).15 G .558(he contents of their en)126.697 678.6 R(vironment.)
+-.4 E F4(UNIX)5.558 E F2 .558(shells also pro)3.058 F .558
+(vide a small set of b)-.15 F .558(uilt-in commands)-.2 F(\()72 690.6 Q F1 -.2
+(bu)C(iltins).2 E F2 4.611(\)i)C 2.112
+(mplementing functionality impossible \(e.g.,)115.861 690.6 R F3(cd)4.612 E F2
+(,)A F3(br)4.612 E(eak)-.18 E F2(,)A F3(continue)4.612 E F2 4.612(,a)C(nd)
+399.074 690.6 Q F3(exec)4.612 E F2 4.612(\)o)C 4.612(ri)444.948 690.6 S(ncon)
+455.67 690.6 Q -.15(ve)-.4 G(nient).15 E .32 LW 76 700.6 72 700.6 DL 80 700.6
+76 700.6 DL 84 700.6 80 700.6 DL 88 700.6 84 700.6 DL 92 700.6 88 700.6 DL 96
+700.6 92 700.6 DL 100 700.6 96 700.6 DL 104 700.6 100 700.6 DL 108 700.6 104
+700.6 DL 112 700.6 108 700.6 DL 116 700.6 112 700.6 DL 120 700.6 116 700.6 DL
+124 700.6 120 700.6 DL 128 700.6 124 700.6 DL 132 700.6 128 700.6 DL 136 700.6
+132 700.6 DL 140 700.6 136 700.6 DL 144 700.6 140 700.6 DL/F5 8/Times-Roman@0
+SF 2<8755>72 710.6 S(NIX is a trademark of X/OPEN)83.776 710.6 Q EP
+%%Page: 2 2
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-2-)279.67 48 S(\()72 84 Q/F1 10/Times-Bold@0 SF
+(history)A F0(,)A F1(getopts)3.505 E F0(,)A F1(kill)3.505 E F0 3.505(,o)C(r)
+172.795 84 Q F1(pwd)3.505 E F0 3.505(,f)C 1.005(or e)207.305 84 R 1.005
+(xample\) to obtain via separate utilities.)-.15 F 1.005
+(Shells may be used interac-)6.005 F(ti)72 96 Q -.15(ve)-.25 G
+(ly or non-interacti).15 E -.15(ve)-.25 G 2.5(ly: the).15 F 2.5(ya)-.15 G
+(ccept input typed from the k)207.42 96 Q -.15(ey)-.1 G
+(board or from a \214le.).15 E F1 2.5(2.2. Pr)72 120 R(ogramming Language)-.18
+E F0 .501(While e)97 135.6 R -.15(xe)-.15 G .501
+(cuting commands is essential, most of the po).15 F .501(wer \(and comple)-.25
+F .502(xity\) of shells is due to their)-.15 F .05
+(embedded programming languages.)72 147.6 R(Lik)5.049 E 2.549(ea)-.1 G .349
+-.15(ny h)245.398 147.6 T(igh-le).15 E -.15(ve)-.25 G 2.549(ll).15 G .049
+(anguage, the shell pro)303.276 147.6 R .049(vides v)-.15 F .049
+(ariables, \215o)-.25 F 2.549(wc)-.25 G(ontrol)480.11 147.6 Q
+(constructs, quoting, and functions.)72 159.6 Q .475
+(The basic syntactic element is a)97 175.2 R/F2 10/Times-Italic@0 SF .475
+(simple command)2.975 F F0 5.475(.A)C .475
+(simple command consists of an optional set of)315.405 175.2 R -.25(va)72 187.2
+S .525(riable assignments, a command w).25 F .525
+(ord, and an optional list of ar)-.1 F 3.024(guments. Operators)-.18 F .524
+(to redirect input and)3.024 F(output may appear an)72 199.2 Q
+(ywhere in a simple command.)-.15 E(Some e)5 E(xamples are:)-.15 E/F3 10
+/Courier@0 SF(who)97 211.2 Q(trn -e -S1 -N)97 223.2 Q(ls -l /bin > binfiles)97
+235.2 Q(make > make.out 2>make.errs)97 247.2 Q F0 2.518(Ap)97 262.8 S .018
+(ipeline is a sequence of tw)111.738 262.8 R 2.518(oo)-.1 G 2.518(rm)230.056
+262.8 S .018(ore commands separated by the character)243.684 262.8 R/F4 10
+/Symbol SF<ef>2.519 E F0 5.019(.T)C .019(he standard output)430.082 262.8 R
+(of the \214rst command is connected to the standard input of the second.)72
+274.8 Q(Examples of pipelines include:)5 E F3(who | wc -l)97 286.8 Q
+(ls -l | sort +3nr)97 298.8 Q F0 .578
+(Simple commands and pipelines may be combined into)97 314.4 R F2(lists)3.078 E
+F0 5.578(.A)C .578(list is a sequence of pipelines sepa-)360.002 314.4 R .289
+(rated by one of)72 326.4 R F1(;)2.789 E F0(,)A F1(&)2.789 E F0(,)A F1(&&)2.789
+E F0 2.789(,o)C(r)185.103 326.4 Q F4<efef>2.789 E F0 2.789(,a)C .289
+(nd optionally terminated by)210.831 326.4 R F1(;)2.789 E F0(,)A F1(&)2.789 E
+F0 2.789(,o)C 2.789(ran)352.555 326.4 S -.25(ew)370.903 326.4 S 2.789
+(line. Commands).25 F .289(separated by)2.789 F F1(;)72 338.4 Q F0 .336(are e)
+2.836 F -.15(xe)-.15 G .336(cuted sequentially; the shell w).15 F .335
+(aits for each to complete in turn.)-.1 F .335(If a command is terminated by)
+5.335 F F1(&)2.835 E F0(,)A .007(the shell e)72 350.4 R -.15(xe)-.15 G .007
+(cutes it in the).15 F F2(bac)2.507 E(kgr)-.2 E(ound)-.45 E F0 2.508(,a)1.666 G
+.008(nd does not w)236.076 350.4 R .008(ait for it to \214nish.)-.1 F .008
+(If tw)5.008 F 2.508(oc)-.1 G .008(ommands are separated by)397.616 350.4 R F1
+(&&)72 362.4 Q F0 3.008(,t)C .508(he second command e)96.948 362.4 R -.15(xe)
+-.15 G .508(cutes only if the \214rst command succeeds.).15 F 3.007(As)5.508 G
+.507(eparator of)383.575 362.4 R F4<efef>3.007 E F0 .507(causes the sec-)3.007
+F(ond command to e)72 374.4 Q -.15(xe)-.15 G(cute only if the \214rst f).15 E
+2.5(ails. Some)-.1 F -.15(ex)2.5 G(amples are:).15 E F3(who ; date)97 386.4 Q
+(cd /usr/src || exit 1)97 398.4 Q(cd "$@" && xtitle $HOST: $PWD)97 410.4 Q F0
+1.36(The shell programming language pro)97 426 R 1.361(vides a v)-.15 F 1.361
+(ariety of \215o)-.25 F 3.861(wc)-.25 G 1.361(ontrol structures.)353.276 426 R
+(The)6.361 E F1 -.25(fo)3.861 G(r).25 E F0(command)3.861 E(allo)72 438 Q .654
+(ws a list of commands to be e)-.25 F -.15(xe)-.15 G .654
+(cuted once for each w).15 F .654(ord in a w)-.1 F .654(ord list.)-.1 F(The)
+5.654 E F1(case)3.154 E F0 .654(command allo)3.154 F .654(ws a)-.25 F .627
+(list to be e)72 450 R -.15(xe)-.15 G .628(cuted if a w).15 F .628
+(ord matches a speci\214ed pattern.)-.1 F(The)5.628 E F1(while)3.128 E F0(and)
+3.128 E F1(until)3.128 E F0 .628(commands e)3.128 F -.15(xe)-.15 G .628
+(cute a list of).15 F 1.559
+(commands as long as a guard command completes successfully or f)72 462 R 1.559
+(ails, respecti)-.1 F -.15(ve)-.25 G(ly).15 E 6.559(.T)-.65 G(he)440.892 462 Q
+F1(if)4.059 E F0(command)4.059 E(allo)72 474 Q(ws e)-.25 E -.15(xe)-.15 G
+(cution of dif).15 E(ferent command lists depending on the e)-.25 E
+(xit status of a guard command.)-.15 E(A)97 489.6 Q F2 .385(shell function)
+2.885 F F0 .385(associates a list of commands with a name.)2.885 F .386
+(Each time the name is used as a simple)5.385 F .938(command, the list is e)72
+501.6 R -.15(xe)-.15 G 3.438(cuted. This).15 F -.15(exe)3.438 G .938
+(cution tak).15 F .938(es place in the current shell conte)-.1 F .937
+(xt; no ne)-.15 F 3.437(wp)-.25 G .937(rocess is)468.903 501.6 R 2.5
+(created. Functions)72 513.6 R(may ha)2.5 E .3 -.15(ve t)-.2 H(heir o).15 E
+(wn ar)-.25 E(gument lists and local v)-.18 E(ariables, and may be recursi)-.25
+E -.15(ve)-.25 G(.).15 E .722(The shell language pro)97 529.2 R .722(vides v)
+-.15 F .722(ariables, which may be both set and referenced.)-.25 F 3.222(An)
+5.722 G .722(umber of special)435.906 529.2 R 1.02
+(parameters are present, such as)72 541.2 R F1($@)3.519 E F0 3.519(,w)C 1.019
+(hich returns the shell')231.257 541.2 R 3.519(sp)-.55 G 1.019
+(ositional parameters \(command-line ar)333.103 541.2 R(gu-)-.18 E(ments\),)72
+553.2 Q F1($?)2.906 E F0 2.906(,t)C .406(he e)122.812 553.2 R .406
+(xit status of the pre)-.15 F .406(vious command, and)-.25 F F1($$)2.906 E F0
+2.906(,t)C .406(he shell')322.436 553.2 R 2.906(sp)-.55 G .406(rocess I.D.)
+368.248 553.2 R .407(In addition to pro)5.406 F(vid-)-.15 E .129
+(ing special parameters and user)72 565.2 R .129(-de\214ned v)-.2 F .129
+(ariables, the shell permits the v)-.25 F .128(alues of certain v)-.25 F .128
+(ariables to control)-.25 F .16(its beha)72 577.2 R(vior)-.2 E 5.16(.S)-.55 G
+.16(ome of these v)131.57 577.2 R .16(ariables include)-.25 F F1(IFS)2.661 E F0
+2.661(,w)C .161(hich controls ho)284.202 577.2 R 2.661(wt)-.25 G .161
+(he shell splits w)361.375 577.2 R(ords,)-.1 E F1 -.74(PA)2.661 G(TH)-.21 E F0
+2.661(,w)C(hich)486.78 577.2 Q .392
+(tells the shell where to look for commands, and)72 589.2 R F1(PS1)2.892 E F0
+2.892(,w)C .392(hose v)297.01 589.2 R .392
+(alue is the string the shell uses to prompt for)-.25 F 3.371(commands. There)
+72 601.2 R .871(are a fe)3.371 F 3.371(wv)-.25 G .871(ariables whose v)196.645
+601.2 R .871(alues are set by the shell and normally only referenced by)-.25 F
+(users;)72 613.2 Q F1(PWD)3.663 E F0 3.663(,w)C 1.163(hose v)135.706 613.2 R
+1.163(alue is the pathname of the shell')-.25 F 3.662(sc)-.55 G 1.162(urrent w)
+313.068 613.2 R 1.162(orking directory)-.1 F 3.662(,i)-.65 G 3.662(so)421.894
+613.2 S 1.162(ne such v)434.446 613.2 R(ariable.)-.25 E -1.11(Va)72 625.2 S
+.008(riables can be used in nearly an)1.11 F 2.509(ys)-.15 G .009(hell conte)
+219.37 625.2 R .009(xt and are particularly v)-.15 F .009
+(aluable when used with control struc-)-.25 F(tures.)72 637.2 Q .583
+(There are se)97 652.8 R -.15(ve)-.25 G .583(ral shell).15 F F2 -.2(ex)3.083 G
+(pansions).2 E F0 5.583(.A)C -.25(va)254.298 652.8 S(riable).25 E F2(name)3.083
+E F0 .583(is e)3.083 F .582(xpanded to its v)-.15 F .582(alue using ${)-.25 F
+F2(name)A F0 .582(}, where)B 1.387(the braces are optional.)72 664.8 R 1.387
+(There are a number of parameter e)6.387 F 1.388(xpansions a)-.15 F -.25(va)-.2
+G 3.888(ilable. F).25 F 1.388(or e)-.15 F 1.388(xample, there are)-.15 F(${)72
+676.8 Q F2(name)A F0<3aad>A F2(wor)A(d)-.37 E F0 .891(}, which e)B .891
+(xpands to)-.15 F F2(wor)3.391 E(d)-.37 E F0(if)3.391 E F2(name)3.391 E F0 .891
+(is unset or null, and the in)3.391 F -.15(ve)-.4 G .89(rse ${).15 F F2(name)A
+F0(:+)A F2(wor)A(d)-.37 E F0 .89(}, which)B -.15(ex)72 688.8 S 1.203(pands to)
+.15 F F2(wor)3.703 E(d)-.37 E F0(if)3.703 E F2(name)3.703 E F0 1.203
+(is set and not null.)3.703 F F2 1.203(Command substitution)6.203 F F0(allo)
+3.703 E 1.204(ws the output of a command to)-.25 F .918
+(replace the command name.)72 700.8 R .918(The syntax is `)5.918 F F2(command)A
+F0(`.)A F2(Command)5.918 E F0 .918(is e)3.418 F -.15(xe)-.15 G .918
+(cuted and it and the backquotes).15 F .299
+(are replaced by its output, with trailing ne)72 712.8 R .299(wlines remo)-.25
+F -.15(ve)-.15 G(d.).15 E F2 -.8(Pa)5.299 G .299(thname e).8 F(xpansion)-.2 E
+F0 .299(is a w)2.799 F .299(ay to e)-.1 F .299(xpand a w)-.15 F(ord)-.1 E 1.586
+(to a set of \214lenames.)72 724.8 R -.8(Wo)6.586 G 1.586(rds are re).8 F -.05
+(ga)-.15 G 1.586(rded as patterns, in which the characters).05 F F1(*)4.086 E
+F0(,)A F1(?)4.086 E F0 4.085(,a)C(nd)432.115 724.8 Q F1([)4.085 E F0(ha)4.085 E
+1.885 -.15(ve s)-.2 H(pecial).15 E EP
+%%Page: 3 3
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-3-)279.67 48 S 2.845(meaning. W)72 84 R .346(ords\
+ containing these special characters are replaced with a sorted list of matchi\
+ng pathnames.)-.8 F(If a w)72 96 Q
+(ord generates no matches, it is left unchanged.)-.1 E/F1 10/Times-Italic@0 SF
+(Quoting)97 111.6 Q F0 .85(is used to remo)3.35 F 1.15 -.15(ve t)-.15 H .85
+(he special meaning of characters or w).15 F 3.35(ords. It)-.1 F .85
+(can disable special treat-)3.35 F .314
+(ment for shell operators or other special characters, pre)72 123.6 R -.15(ve)
+-.25 G .315(nt reserv).15 F .315(ed w)-.15 F .315
+(ords from being recognized as such,)-.1 F .683(and inhibit v)72 135.6 R .683
+(ariable e)-.25 F 3.183(xpansion. The)-.15 F .683
+(shell has three quoting mechanisms:)3.183 F 3.183(ab)5.683 G .683
+(ackslash preserv)387.413 135.6 R .682(es the literal)-.15 F -.25(va)72 147.6 S
+.417(lue of the ne).25 F .417(xt character)-.15 F 2.917(,ap)-.4 G .417
+(air of single quotes preserv)196.712 147.6 R .417(es the literal v)-.15 F .418
+(alue of each character between the)-.25 F 1.426
+(quotes, and a pair of double quotes preserv)72 159.6 R 1.425
+(es the literal meaning of enclosed characters while allo)-.15 F(wing)-.25 E
+(some e)72 171.6 Q(xpansions.)-.15 E 1.054(Some of the commands b)97 187.2 R
+1.054(uilt into the shell are part of the programming language.)-.2 F(The)6.055
+E/F2 10/Times-Bold@0 SF(br)3.555 E(eak)-.18 E F0(and)3.555 E F2(continue)72
+199.2 Q F0 1.175(commands control loop e)3.675 F -.15(xe)-.15 G 1.175
+(cution as in the C language.).15 F(The)6.175 E F2 -2.3 -.15(ev a)3.675 H(l).15
+E F0 -.2(bu)3.675 G 1.174(iltin allo).2 F 1.174(ws a string to be)-.25 F .204
+(parsed and e)72 211.2 R -.15(xe)-.15 G .204(cuted as a command.).15 F F2 -.65
+(Wa)5.205 G(it).65 E F0 .205
+(tells the shell to pause until the processes speci\214ed as ar)2.705 F
+(guments)-.18 E(ha)72 223.2 Q .3 -.15(ve ex)-.2 H(ited.).15 E F2 2.5
+(2.3. Interacti)72 247.2 R .2 -.1(ve F)-.1 H(eatur)-.15 E(es)-.18 E F0 .51
+(Shells ha)97 262.8 R .81 -.15(ve b)-.2 H -.15(eg).15 G .51(un of).15 F .51
+(fering features geared speci\214cally for interacti)-.25 F .81 -.15(ve u)-.25
+H .51(se rather than to augment the).15 F .76(programming language.)72 274.8 R
+.761(These interacti)5.76 F 1.061 -.15(ve f)-.25 H .761
+(eatures include job control, command line editing, history and).15 F(aliases.)
+72 286.8 Q .626(Job control is a f)97 302.4 R .626(acility pro)-.1 F .626
+(vided jointly by the shell and the)-.15 F/F3 9/Times-Roman@0 SF(UNIX)3.125 E
+F0 -.1(ke)3.125 G .625(rnel that allo).1 F .625(ws users to selec-)-.25 F(ti)72
+314.4 Q -.15(ve)-.25 G .344
+(ly stop \(suspend\) and restart \(resume\) processes.).15 F .345
+(Each pipeline e)5.345 F -.15(xe)-.15 G .345
+(cuted by the shell is referred to as a).15 F F1(job)72 326.4 Q F0 2.989(.J)C
+.488(obs may be suspended and restarted in either the fore)94.159 326.4 R .488
+(ground, where the)-.15 F 2.988(yh)-.15 G -2.25 -.2(av e)397.148 326.4 T .488
+(access to the terminal,)3.188 F .833(or background, where the)72 338.4 R 3.333
+(ya)-.15 G .834(re isolated and cannot read from the terminal.)189.312 338.4 R
+-.8(Ty)5.834 G .834(ping the).8 F F1(suspend)3.334 E F0(character)5 E .459(whi\
+le a process is running stops that process and returns control to the shell.)72
+350.4 R .459(Once a job is suspended, the)5.459 F .392
+(user manipulates the job')72 362.4 R 2.892(ss)-.55 G .392(tate, using)184.118
+362.4 R F2(bg)2.892 E F0 .393(to continue it in the background,)2.892 F F2(fg)
+2.893 E F0 .393(to return it to the fore)2.893 F(ground)-.15 E .891(and a)72
+374.4 R -.1(wa)-.15 G .891(it its completion, or).1 F F2(kill)3.391 E F0 .891
+(to send it a signal.)3.391 F(The)5.89 E F2(jobs)3.39 E F0 .89
+(command lists the status of jobs, and)3.39 F F2(wait)3.39 E F0 .407
+(will pause the shell until a speci\214ed job terminates.)72 386.4 R .407
+(The shell pro)5.407 F .407(vides a number of w)-.15 F .407
+(ays to refer to a job,)-.1 F(and will notify the user whene)72 398.4 Q -.15
+(ve)-.25 G 2.5(rab).15 G(ackground job terminates.)220.18 398.4 Q -.4(Wi)97 414
+S .956(th the adv).4 F .956(ent of more po)-.15 F .956
+(werful terminals and terminal emulators, more sophisticated interaction)-.25 F
+.253(than that pro)72 426 R .253(vided by the)-.15 F F3(UNIX)2.753 E F0 -.1(ke)
+2.754 G .254(rnel terminal dri).1 F -.15(ve)-.25 G 2.754(ri).15 G 2.754(sp)
+293.592 426 S 2.754(ossible. Some)305.236 426 R .254(shells of)2.754 F .254
+(fer command line editing,)-.25 F 1.141
+(which permits a user to edit lines of input using f)72 438 R(amiliar)-.1 E F1
+(emacs)3.64 E F0(or)3.64 E F1(vi)3.64 E F0 1.14
+(-style commands before submitting)B .02(them to the shell.)72 450 R .02
+(Editors allo)5.02 F 2.52(wc)-.25 G .02(orrections to be made without ha)206.31
+450 R .021(ving to erase back to the point of error)-.2 F 2.521(,o)-.4 G(r)
+500.67 450 Q .135(start the line ane)72 462 R 3.935 -.65(w. C)-.25 H .135
+(ommand line editors run the g).65 F .135(amut from a small \214x)-.05 F .134
+(ed set of commands and k)-.15 F .434 -.15(ey b)-.1 H(ind-).15 E
+(ings to input f)72 474 Q(acilities which allo)-.1 E 2.5(wa)-.25 G
+(rbitrary actions to be bound to a k)217.2 474 Q .3 -.15(ey o)-.1 H 2.5(rk).15
+G .3 -.15(ey s)379.88 474 T(equence.).15 E .145(Modern shells also k)97 489.6 R
+.145(eep a history)-.1 F 2.645(,w)-.65 G .146
+(hich is the list of commands a user has typed.)243.49 489.6 R .146(Shell f)
+5.146 F .146(acilities are)-.1 F -.2(av)72 501.6 S .368(ailable to recall pre)
+-.05 F .367(vious commands and use portions of old commands when composing ne)
+-.25 F 2.867(wo)-.25 G 2.867(nes. The)467.253 501.6 R 1.456
+(command history can be sa)72 513.6 R -.15(ve)-.2 G 3.957(dt).15 G 3.957
+(oa\214)207.522 513.6 S 1.457
+(le and read back in at shell startup, so it persists across sessions.)230.436
+513.6 R .675(Shells which pro)72 525.6 R .675
+(vide both command editing and history generally ha)-.15 F .974 -.15(ve e)-.2 H
+.674(diting commands to interacti).15 F -.15(ve)-.25 G(ly).15 E(step forw)72
+537.6 Q(ard and backw)-.1 E(ard through the history list.)-.1 E .013
+(Aliases allo)97 553.2 R -5.012 2.513(wa s)-.25 H .014
+(tring to be substituted for a command name.)164.28 553.2 R(The)5.014 E 2.514
+(yc)-.15 G .014(an be used to create a mnemonic)373.396 553.2 R .568(for a)72
+565.2 R F3(UNIX)3.068 E F0 .568(command name \()3.068 F/F4 10/Courier@0 SF .568
+(alias del=rm)B F0 .568(\), to e)B .567(xpand a single w)-.15 F .567
+(ord to a comple)-.1 F 3.067(xc)-.15 G .567(ommand \()432.603 565.2 R F4(alias)
+A .255(news='xterm -g 80x45 -title trn -e trn -e -S1 -N &')72 577.2 R F0 .255
+(\), or to ensure that a command)B(is in)72 589.2 Q -.2(vo)-.4 G -.1(ke).2 G
+2.5(dw).1 G(ith a basic set of options \()122.41 589.2 Q F4
+(alias ls="/bin/ls -F")A F0(\).)A F2 2.5(3. The)72 613.2 R
+(POSIX Shell Standard)2.5 E F1(POSIX)97 628.8 Q F0 .239
+(is a name originally coined by Richard Stallman for a f)4.405 F .239
+(amily of open system standards based)-.1 F(on)72 640.8 Q F3(UNIX)3.239 E F0
+5.739(.T)C .74(here are a number of aspects of)122.079 640.8 R F3(UNIX)3.24 E
+F0 .74(under consideration for standardization, from the basic)3.24 F .192
+(system services at the system call and C library le)72 652.8 R -.15(ve)-.25 G
+2.692(lt).15 G 2.692(oa)290.16 652.8 S .191
+(pplications and tools to system administration and)302.292 652.8 R 2.5
+(management. Each)72 664.8 R(area of standardization is assigned to a w)2.5 E
+(orking group in the 1003 series.)-.1 E 3.602(The POSIX Shell and T)97 680.4 R
+3.602(ools standard has been de)-.8 F -.15(ve)-.25 G 3.603(loped by IEEE W).15
+F 3.603(orking Group 1003.2)-.8 F -1.667(\(POSIX.2\) [4].)72 692.4 R 2.799
+(It concentrates on the command interpreter interf)7.799 F 2.799
+(ace and utility programs commonly)-.1 F -.15(exe)72 704.4 S 2.345
+(cuted from the command line or by other programs.).15 F 2.345(An initial v)
+7.345 F 2.345(ersion of the standard has been)-.15 F(appro)72 716.4 Q -.15(ve)
+-.15 G 2.915(da).15 G .414(nd published by the IEEE, and w)116.265 716.4 R .414
+(ork is currently underw)-.1 F .414(ay to update it.)-.1 F .414
+(There are four primary)5.414 F(areas of w)72 728.4 Q
+(ork in the 1003.2 standard:)-.1 E EP
+%%Page: 4 4
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-4-)279.67 48 S 21.5<8341>72 84 S .835
+(spects of the shell')104.22 84 R 3.335(ss)-.55 G .835
+(yntax and command language.)192 84 R 3.335(An)5.835 G .835(umber of special b)
+338.095 84 R .835(uiltins such as)-.2 F/F1 10/Times-Bold@0 SF(cd)3.335 E F0
+(and)3.335 E F1(exec)97 96 Q F0 .545(are being speci\214ed as part of the shel\
+l, since their functionality usually cannot be implemented)3.046 F
+(by a separate e)97 108 Q -.15(xe)-.15 G(cutable;).15 E 21.5<8341>72 123.6 S
+.73(set of utilities to be called by shell scripts and applications.)107.45
+123.6 R .731(Examples are programs lik)5.731 F(e)-.1 E/F2 10/Times-Italic@0 SF
+2.397(sed, tr)3.231 F(,)-1.11 E F0(and)97 135.6 Q F2(awk.)2.853 E F0 .352
+(Utilities commonly implemented as shell b)4.519 F .352
+(uiltins are described in this section, such as)-.2 F F1(test)2.852 E F0(and)97
+147.6 Q F1(kill)3.422 E F0 5.922(.A)C 3.422(ne)144.404 147.6 S .922
+(xpansion of this section')157.116 147.6 R 3.423(ss)-.55 G .923
+(cope, termed the User Portability Extension, or UPE, has)268.586 147.6 R
+(standardized interacti)97 159.6 Q .3 -.15(ve p)-.25 H(rograms such as).15 E F2
+(vi)2.5 E F0(and)4.166 E F2(mailx;)2.5 E F0 21.5<8341>72 175.2 S .926
+(group of functional interf)107.646 175.2 R .926(aces to services pro)-.1 F
+.926(vided by the shell, such as the traditional)-.15 F F2(system)3.425 E F0(C)
+5.091 E .507(library function.)97 187.2 R .507
+(There are functions to perform shell w)5.507 F .508(ord e)-.1 F .508
+(xpansions, perform \214lename e)-.15 F(xpansion)-.15 E(\()97 199.2 Q F2
+(globbing)A F0 .58(\), obtain v)B .58
+(alues of POSIX.2 system con\214guration v)-.25 F .58(ariables, retrie)-.25 F
+.88 -.15(ve v)-.25 H .58(alues of en)-.1 F(vironment)-.4 E -.25(va)97 211.2 S
+(riables \().25 E F2 -.1(ge)C(ten).1 E(v\(\))-.4 E F0(\), and other services;)
+.833 E 21.5<8341>72 226.8 S(suite of `)106.72 226.8 Q(`de)-.74 E -.15(ve)-.25 G
+(lopment').15 E 2.5('u)-.74 G(tilities such as)209.54 226.8 Q F2(c89)2.5 E F0
+(\(the POSIX.2 v)4.166 E(ersion of)-.15 E F2(cc)2.5 E F0(\), and)A F2(yacc.)2.5
+E F0 .483(Bash is concerned with the aspects of the shell')97 242.4 R 2.983(sb)
+-.55 G(eha)301.597 242.4 Q .484(vior de\214ned by POSIX.2.)-.2 F .484
+(The shell command)5.484 F 1.439
+(language has of course been standardized, including the basic \215o)72 254.4 R
+3.938(wc)-.25 G 1.438(ontrol and program e)359.688 254.4 R -.15(xe)-.15 G 1.438
+(cution con-).15 F 1.145(structs, I/O redirection and pipelining, ar)72 266.4 R
+1.145(gument handling, v)-.18 F 1.145(ariable e)-.25 F 1.146
+(xpansion, and quoting.)-.15 F(The)6.146 E F2(special)3.646 E F0 -.2(bu)72
+278.4 S .676(iltins, which must be implemented as part of the shell to pro).2 F
+.676(vide the desired functionality)-.15 F 3.176(,a)-.65 G .676(re speci\214ed)
+457.504 278.4 R .7(as being part of the shell; e)72 290.4 R .7
+(xamples of these are)-.15 F F1 -2.3 -.15(ev a)3.201 H(l).15 E F0(and)3.201 E
+F1(export)3.201 E F0 5.701(.O)C .701(ther utilities appear in the sections of)
+352.034 290.4 R .256(POSIX.2 not de)72 302.4 R -.2(vo)-.25 G .256(ted to the s\
+hell which are commonly \(and in some cases must be\) implemented as b).2 F
+(uiltin)-.2 E(commands, such as)72 314.4 Q F1 -.18(re)2.5 G(ad).18 E F0(and)2.5
+E F1(test)2.5 E F0(.)A .972(POSIX.2 also speci\214es aspects of the shell')97
+330 R 3.473(si)-.55 G(nteracti)286.016 330 Q 1.273 -.15(ve b)-.25 H(eha).15 E
+.973(vior as part of the UPE, including job)-.2 F .233
+(control, command line editing, and history)72 342 R 5.233(.I)-.65 G .233
+(nterestingly enough, only)253.849 342 R F2(vi)2.733 E F0 .233
+(-style line editing commands ha)B -.15(ve)-.2 G(been standardized;)72 354 Q F2
+(emacs)2.5 E F0(editing commands were left out due to objections.)2.5 E .148
+(There were certain areas in which POSIX.2 felt standardization w)97 369.6 R
+.149(as necessary)-.1 F 2.649(,b)-.65 G .149(ut no e)420.643 369.6 R .149
+(xisting imple-)-.15 F 1.598(mentation pro)72 381.6 R 1.598
+(vided the proper beha)-.15 F(vior)-.2 E 6.598(.T)-.55 G 1.598(he w)251.56
+381.6 R 1.597(orking group in)-.1 F -.15(ve)-.4 G 1.597
+(nted and standardized functionality in).15 F .228(these areas.)72 393.6 R(The)
+5.228 E F1(command)2.728 E F0 -.2(bu)2.728 G .228(iltin w).2 F .228(as in)-.1 F
+-.15(ve)-.4 G .228(nted so that shell functions could be written to replace b)
+.15 F(uiltins;)-.2 E 1.663(it mak)72 405.6 R 1.663
+(es the capabilities of the b)-.1 F 1.663(uiltin a)-.2 F -.25(va)-.2 G 1.663
+(ilable to the function.).25 F 1.663(The reserv)6.663 F 1.663(ed w)-.15 F 1.663
+(ord `)-.1 F(`!')-.74 E 4.163('w)-.74 G 1.663(as added to)455.685 405.6 R(ne)72
+417.6 Q -.05(ga)-.15 G .915(te the return v).05 F .915
+(alue of a command or pipeline; it w)-.25 F .916(as nearly impossible to e)-.1
+F .916(xpress `)-.15 F .916(`if not x')-.74 F 3.416('c)-.74 G(leanly)479.56
+417.6 Q .904(using the sh language.)72 429.6 R .904(There e)5.904 F .904
+(xist multiple incompatible implementations of the)-.15 F F1(test)3.403 E F0
+-.2(bu)3.403 G .903(iltin, which tests).2 F .28
+(\214les for type and other attrib)72 441.6 R .281
+(utes and performs arithmetic and string comparisons.)-.2 F .281
+(POSIX considered none)5.281 F .868(of these correct, so the standard beha)72
+453.6 R .868(vior w)-.2 F .868(as speci\214ed in terms of the number of ar)-.1
+F .867(guments to the com-)-.18 F 3.803(mand. POSIX.2)72 465.6 R 1.303
+(dictates e)3.803 F 1.303(xactly what will happen when four or fe)-.15 F 1.303
+(wer ar)-.25 F 1.303(guments are gi)-.18 F -.15(ve)-.25 G 3.803(nt).15 G(o)
+459.462 465.6 Q F1(test)3.804 E F0 3.804(,a)C(nd)494 465.6 Q(lea)72 477.6 Q
+-.15(ve)-.2 G 4.531(st).15 G 2.031(he beha)103.951 477.6 R 2.031
+(vior unde\214ned when more ar)-.2 F 2.031(guments are supplied.)-.18 F 2.03
+(Bash uses the POSIX.2 algorithm,)7.031 F(which w)72 489.6 Q(as concei)-.1 E
+-.15(ve)-.25 G 2.5(db).15 G 2.5(yD)164.53 489.6 S -.2(av)179.25 489.6 S(id K).2
+E(orn.)-.35 E 1.128
+(While POSIX.2 includes much of what the shell has traditionally pro)97 505.2 R
+1.129(vided, some important things)-.15 F(ha)72 517.2 Q .58 -.15(ve b)-.2 H .28
+(een omitted as being `).15 F(`be)-.74 E .28(yond its scope.)-.15 F 4.26 -.74
+('' T)-.7 H .28(here is, for instance, no mention of a dif).74 F .28
+(ference between)-.25 F(a)72 529.2 Q F2(lo)3.354 E(gin)-.1 E F0 .854
+(shell and an)5.02 F 3.354(yo)-.15 G .854(ther interacti)167.956 529.2 R 1.154
+-.15(ve s)-.25 H .854(hell \(since POSIX.2 does not specify a login program\).)
+.15 F .855(No \214x)5.855 F(ed)-.15 E
+(startup \214les are de\214ned, either \255 the standard does not mention)72
+541.2 Q F2(.pr)2.5 E(o\214le)-.45 E F0(.)1.666 E F1 2.5(4. Shell)72 565.2 R
+(Comparison)2.5 E F0 .693(This section compares features of bash, sh, and ksh \
+\(the three shells closest to POSIX compliance\).)97 580.8 R .245(Since ksh an\
+d bash are supersets of sh, the features common to all three are co)72 592.8 R
+-.15(ve)-.15 G .245(red \214rst.).15 F .245(Some of the fea-)5.245 F 1.198
+(tures bash and ksh contain which are not in sh will be discussed.)72 604.8 R
+(Ne)6.198 E 1.198(xt, features unique to bash will be)-.15 F 2.866(listed. The)
+72 616.8 R .366(\214rst three sections pro)2.866 F .366(vide a progressi)-.15 F
+-.15(ve)-.25 G .366(ly more detailed o).15 F -.15(ve)-.15 G(rvie).15 E 2.866
+(wo)-.25 G 2.866(fb)395.706 616.8 S 2.866(ash. Finally)406.902 616.8 R 2.866
+(,f)-.65 G .366(eatures of)464.484 616.8 R(ksh-88 \(the currently-a)72 628.8 Q
+-.25(va)-.2 G(ilable v).25 E(ersion\) not in sh or bash will be presented.)-.15
+E F1 2.5(4.1. Common)72 652.8 R -.25(Fe)2.5 G(atur).25 E(es)-.18 E F0 .021
+(All three shells ha)97 668.4 R .321 -.15(ve t)-.2 H .021
+(he same basic feature set, which is essentially that pro).15 F .02
+(vided by sh and described)-.15 F 1.026(in an)72 680.4 R 3.526(ys)-.15 G 3.526
+(hm)105.012 680.4 S 1.027
+(anual page. Bash and ksh are both sh supersets, and so all three pro)121.318
+680.4 R 1.027(vide the command inter)-.15 F(-)-.2 E .714
+(preter and programming language described earlier)72 692.4 R 3.214(.T)-.55 G
+.714(he shell grammar)291.506 692.4 R 3.214(,s)-.4 G .714(yntax, \215o)371.568
+692.4 R 3.214(wc)-.25 G .714(ontrol, redirections,)424.686 692.4 R(and b)72
+704.4 Q(uiltins implemented by the Bourne shell are the baseline for subsequen\
+t discussion.)-.2 E EP
+%%Page: 5 5
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-5-)279.67 48 S/F1 10/Times-Bold@0 SF 2.5(4.2. F)72
+84 R(eatur)-.25 E(es in bash and ksh)-.18 E F0 .458(Ksh and bash ha)97 99.6 R
+.758 -.15(ve s)-.2 H -2.15 -.25(ev e).15 H .459(ral features in common be).25 F
+.459(yond this base le)-.15 F -.15(ve)-.25 G 2.959(lo).15 G 2.959(ff)387.814
+99.6 S(unctionality)397.433 99.6 Q 5.459(.S)-.65 G .459(ome of this)458.082
+99.6 R(is due to the POSIX.2 standard.)72 111.6 Q(Other functions ha)5 E .3
+-.15(ve b)-.2 H(een implemented in bash using ksh as a guide.).15 E F1 2.5
+(4.2.1. V)72 135.6 R(ariables and V)-.92 E(ariable Expansion)-.92 E F0 .097
+(Bash and ksh ha)97 151.2 R .396 -.15(ve a)-.2 H .096(ugmented v).15 F .096
+(ariable e)-.25 F 2.596(xpansion. Arithmetic)-.15 F .096(substitution allo)
+2.596 F .096(ws an e)-.25 F .096(xpression to be)-.15 F -.25(eva)72 163.2 S .6
+(luated and the result substituted.).25 F .6(Shell v)5.6 F .6
+(ariables may be used as operands, and the result of an e)-.25 F(xpres-)-.15 E
+.41(sion may be assigned to a v)72 175.2 R 2.91(ariable. Nearly)-.25 F .41
+(all of the operators from the C language are a)2.91 F -.25(va)-.2 G .41
+(ilable, with the).25 F(same precedence rules:)72 187.2 Q/F2 10/Courier@0 SF 6
+($e)97 205.2 S(cho $\(\(3 + 5 * 32\)\))115 205.2 Q(163)97 217.2 Q F0 -1.11(Va)
+72 238.8 S 1.445(riables may be declared as)1.11 F/F3 10/Times-Italic@0 SF
+(inte)3.945 E -.1(ge)-.4 G(r).1 E F0 3.945(,w)1.666 G 1.446
+(hich causes arithmetic e)240.956 238.8 R -.25(va)-.25 G 1.446
+(luation to be performed on the v).25 F(alue)-.25 E(whene)72 250.8 Q -.15(ve)
+-.25 G 2.5(rt).15 G(he)115.75 250.8 Q 2.5(ya)-.15 G(re assigned to.)136.98
+250.8 Q .483(There are ne)97 266.4 R 2.983(we)-.25 G .483
+(xpansions to obtain the length of a v)162.179 266.4 R(ariable')-.25 E 2.982
+(sv)-.55 G .482(alue and to remo)352.19 266.4 R .782 -.15(ve s)-.15 H .482
+(ubstrings match-).15 F .063(ing speci\214ed patterns from the be)72 278.4 R
+.063(ginning and end of v)-.15 F .063(ariable v)-.25 F 2.563(alues. A)-.25 F
+(ne)2.563 E 2.563(wf)-.25 G .064(orm of command substitution,)383.249 278.4 R
+F1($\()72 290.4 Q F3(list)A F1(\))A F0 2.5(,i)C 2.5(sm)103.67 290.4 S
+(uch easier to nest than `)117.84 290.4 Q F3(list)A F0 2.5(`a)C
+(nd has simpli\214ed quoting rules.)235.04 290.4 Q .082(There are ne)97 306 R
+2.582(wv)-.25 G .082(ariables to control the shell')161.436 306 R 2.581(sb)-.55
+G(eha)284.333 306 Q(vior)-.2 E 2.581(,a)-.4 G .081(nd additional v)323.244 306
+R .081(ariables set or interpreted spe-)-.25 F 1.038(cially by the shell.)72
+318 R F1(RANDOM)6.038 E F0(and)3.538 E F1(SECONDS)3.538 E F0(are)3.539 E F3
+(dynamic)3.539 E F0 -.25(va)3.539 G 3.539(riables: their).25 F -.25(va)3.539 G
+1.039(lues are generated afresh).25 F 1.022(each time the)72 330 R 3.522(ya)
+-.15 G 1.022(re referenced.)140.176 330 R F1(RANDOM)6.022 E F0 1.021
+(returns a dif)3.521 F 1.021(ferent random number each time it is referenced,)
+-.25 F(and)72 342 Q F1(SECONDS)3.138 E F0 .638
+(returns the number of seconds since the shell w)3.138 F .638
+(as started or the v)-.1 F .639(ariable w)-.25 F .639(as assigned to,)-.1 F
+1.448(plus an)72 354 R 3.948(yv)-.15 G 1.448(alue assigned.)115.606 354 R F1
+(PWD)6.448 E F0(and)3.948 E F1(OLDPWD)3.947 E F0 1.447
+(are set to the current and pre)3.947 F 1.447(vious w)-.25 F 1.447
+(orking directories,)-.1 F(respecti)72 366 Q -.15(ve)-.25 G(ly).15 E(.)-.65 E
+F1(TMOUT)5.604 E F0 .604(controls ho)3.104 F 3.104(wl)-.25 G .604
+(ong the shell will w)226.436 366 R .604(ait at a prompt for input.)-.1 F(If)
+5.604 E F1(TMOUT)3.104 E F0 .605(is set to a)3.105 F -.25(va)72 378 S 1.168
+(lue greater than zero, the shell e).25 F 1.168(xits after w)-.15 F 1.168
+(aiting that man)-.1 F 3.668(ys)-.15 G 1.167(econds for input.)337.478 378 R F1
+(REPL)6.167 E(Y)-.92 E F0 1.167(is the def)3.667 F(ault)-.1 E -.25(va)72 390 S
+.991(riable for the).25 F F1 -.18(re)3.491 G(ad).18 E F0 -.2(bu)3.491 G .991
+(iltin; if no v).2 F .992(ariable names are supplied as ar)-.25 F .992
+(guments, the line read is assigned to)-.18 F F1(REPL)72 402 Q(Y)-.92 E F0(.)A
+F1 2.5(4.2.2. New)72 426 R(and Modi\214ed Builtins)2.5 E F0 .652(Both shells e)
+97 441.6 R .651(xpand the basic sh set of b)-.15 F .651(uiltin commands.)-.2 F
+F1(Let)5.651 E F0(pro)3.151 E .651(vides a w)-.15 F .651
+(ay to perform arithmetic)-.1 F 2.767(on shell v)72 453.6 R 5.268
+(ariables. Shell)-.25 F 2.768(programmers use)5.268 F F1(typeset)5.268 E F0
+2.768(\(bash includes)5.268 F F1(declar)5.268 E(e)-.18 E F0 2.768(as a synon)
+5.268 F 2.768(ym\) to assign)-.15 F(attrib)72 465.6 Q .295(utes such as)-.2 F
+F3 -.2(ex)2.795 G(port).2 E F0(and)4.461 E F3 -.37(re)2.795 G(adonly).37 E F0
+.295(to v)4.461 F(ariables.)-.25 E F1(Getopts)5.295 E F0 .294
+(is used by shell scripts to parse script options)2.795 F .962(and ar)72 477.6
+R 3.462(guments. The)-.18 F F1(set)3.462 E F0 .962(command has a ne)3.462 F
+3.462(wo)-.25 G(ption)266.446 477.6 Q F1<ad6f>3.463 E F0 .963(which tak)3.463 F
+.963(es option names as ar)-.1 F 3.463(guments. Option)-.18 F 1.28
+(names are synon)72 489.6 R 1.28(yms for the other set options \(e.g.,)-.15 F
+F1<ad66>3.78 E F0(and)3.78 E F1 1.28(\255o noglob)3.78 F F0 3.78(\)o)C 3.78(rp)
+375.97 489.6 S(ro)388.08 489.6 Q 1.28(vide ne)-.15 F 3.78(wf)-.25 G 1.28
+(unctionality \()440.78 489.6 R F1(-o)A(notify)72 501.6 Q F0 3.348(,f)C .849
+(or e)106.178 501.6 R 3.349(xample\). The)-.15 F F1 -.18(re)3.349 G(ad).18 E F0
+-.2(bu)3.349 G .849(iltin tak).2 F .849(es a ne)-.1 F(w)-.25 E F1<ad72>3.349 E
+F0 .849(option to specify that a line ending in a backslash)3.349 F
+(should not be continued.)72 513.6 Q F1 2.5(4.2.3. T)72 537.6 R(ilde Expansion)
+-.18 E F0 -.35(Ti)97 553.2 S .252(lde e).35 F .251
+(xpansion is a feature adopted from the C shell.)-.15 F 2.751(At)5.251 G .251
+(ilde character at the be)331.172 553.2 R .251(ginning of a w)-.15 F .251
+(ord is)-.1 F -.15(ex)72 565.2 S(panded to either).15 E F1($HOME)2.5 E F0
+(or the home directory of another user)2.5 E 2.5(,d)-.4 G
+(epending on what follo)345.84 565.2 Q(ws the tilde.)-.25 E F1 2.5
+(4.2.4. Interacti)72 589.2 R .2 -.1(ve I)-.1 H(mpr).1 E -.1(ove)-.18 G(ments).1
+E F0 .789(The most noticable impro)97 604.8 R -.15(ve)-.15 G .789(ments o).15 F
+-.15(ve)-.15 G 3.289(rs).15 G 3.289(ha)263.385 604.8 S .789
+(re geared for interacti)276.114 604.8 R 1.089 -.15(ve u)-.25 H 3.29(se. Ksh)
+.15 F .79(and bash pro)3.29 F .79(vide job)-.15 F .882(control in a v)72 616.8
+R .882(ery similar f)-.15 F .882
+(ashion, with the same options to enable and disable it \()-.1 F F1 .881
+(set -o monitor)B F0 3.381(\)a)C .881(nd the)478.399 616.8 R(same b)72 628.8 Q
+(uiltin commands to manipulate jobs \()-.2 E F1(jobs/fg/bg/kill/wait)A F0(\).)A
+.866(Command line editing, with emacs and vi-style k)97 644.4 R 1.166 -.15
+(ey b)-.1 H .866(indings, is a).15 F -.25(va)-.2 G .866(ilable in both shells.)
+.25 F .866(The Bash)5.866 F F3 -.37(re)72 656.4 S(adline).37 E F0 1.578
+(library is considerably more sophisticated than the ksh editing library:)5.744
+F 1.577(it allo)6.577 F 1.577(ws arbitrary k)-.25 F -.15(ey)-.1 G 1.867
+(bindings, macros, a per)72 668.4 R 1.868(-user customization \214le \()-.2 F
+F3(~/.inputr)A(c)-.37 E F0 1.868(\), a number of v)B 1.868
+(ariables to further customize)-.25 F(beha)72 680.4 Q(vior)-.2 E 3.538(,a)-.4 G
+1.038(nd a much lar)116.868 680.4 R 1.038
+(ger set of bindable editing commands.)-.18 F 1.037
+(The ksh editing library pro)6.037 F 1.037(vides a small)-.15 F<8c78>72 692.4 Q
+(ed command set and only clumsy macros.)-.15 E .706(Both shells of)97 708 R
+.706(fer access to the command history)-.25 F 5.706(.T)-.65 G .706
+(he in-line editing options ha)307.278 708 R 1.006 -.15(ve d)-.2 H(ef).15 E
+.706(ault k)-.1 F 1.006 -.15(ey b)-.1 H(ind-).15 E .624
+(ings to access the history list.)72 720 R(The)5.624 E F1(fc)3.124 E F0 .624
+(command is pro)3.124 F .624(vided to re-e)-.15 F -.15(xe)-.15 G .623(cute pre)
+.15 F .623(vious commands and display)-.25 F EP
+%%Page: 6 6
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-6-)279.67 48 S(the contents of the history list.)
+72 84 Q/F1 10/Times-Bold@0 SF 2.5(4.2.5. Miscellaneous)72 108 R
+(Changes and Impr)2.5 E -.1(ov)-.18 G(ments).1 E F0 .707(Other impro)97 123.6 R
+-.15(ve)-.15 G .707(ments include aliases, the).15 F F1(select)3.207 E F0 .708
+(shell language construct, which supports the genera-)3.207 F 1.298
+(tion and presentation of simple menus, and e)72 135.6 R 1.298
+(xtensions to the)-.15 F F1(export)3.798 E F0(and)3.798 E F1 -.18(re)3.798 G
+(adonly).18 E F0 -.2(bu)3.798 G 1.298(iltins which allo).2 F(w)-.25 E -.25(va)
+72 147.6 S .017(riables to be assigned v).25 F .017
+(alues at the same time the attrib)-.25 F .017(utes are set.)-.2 F -.8(Wo)5.018
+G .018(rd splitting has changed:).8 F .018(if tw)5.018 F 2.518(oo)-.1 G(r)
+500.67 147.6 Q .158(more adjacent w)72 159.6 R .157
+(ord splitting characters occur)-.1 F 2.657(,b)-.4 G .157
+(ash and ksh will generate null \214elds; sh mak)264.893 159.6 R .157
+(es runs of mul-)-.1 F .339
+(tiple \214eld separator charactors the same as a single separator)72 171.6 R
+5.339(.B)-.55 G .34(ash and ksh split only the results of e)330.89 171.6 R
+(xpan-)-.15 E(sion, rather than e)72 183.6 Q -.15(ve)-.25 G(ry w).15 E
+(ord as sh does, closing a long-standing shell security hole.)-.1 E 1.234
+(Shell functions in bash and ksh may ha)97 199.2 R 1.534 -.15(ve l)-.2 H 1.234
+(ocal v).15 F 3.734(ariables. V)-.25 F 1.234(ariables declared with)-1.11 F F1
+(typeset)3.734 E F0 1.234(\(or the)3.734 F .001(bash synon)72 211.2 R(ym,)-.15
+E F1(local)2.501 E F0 .001(\), ha)B .301 -.15(ve a s)-.2 H .001
+(cope restricted to the function and its descendents, and may shado).15 F 2.502
+(wv)-.25 G(ariables)472.9 211.2 Q(de\214ned by the in)72 223.2 Q -.2(vo)-.4 G
+(king shell.).2 E(Local v)5 E(ariables are remo)-.25 E -.15(ve)-.15 G 2.5(dw)
+.15 G(hen a function completes.)317.75 223.2 Q F1 2.5(4.3. F)72 247.2 R(eatur)
+-.25 E(es Unique to bash)-.18 E F0(Naturally)97 262.8 Q 2.895(,b)-.65 G .395
+(ash includes features not in sh or ksh.)144.515 262.8 R .395
+(This section discusses some of the features which)5.395 F(mak)72 274.8 Q 2.986
+(eb)-.1 G .486(ash unique.)101.546 274.8 R .486(Most of them pro)5.486 F .486
+(vide impro)-.15 F -.15(ve)-.15 G 2.986(di).15 G(nteracti)288.098 274.8 Q .787
+-.15(ve u)-.25 H .487(se, b).15 F .487(ut a fe)-.2 F 2.987(wp)-.25 G .487
+(rogramming impro)394.653 274.8 R -.15(ve)-.15 G(ments).15 E
+(are present as well.)72 286.8 Q
+(Full descriptions of these features can be found in the bash documentation.)5
+E F1 2.5(4.3.1. Startup)72 310.8 R(Files)2.5 E F0 .281(Bash e)97 326.4 R -.15
+(xe)-.15 G .281(cutes startup \214les dif).15 F .281
+(ferently than other shells.)-.25 F .281(The bash beha)5.281 F .28
+(vior is a compromise between)-.2 F .116
+(the csh principle of startup \214les with \214x)72 338.4 R .116(ed names e)
+-.15 F -.15(xe)-.15 G .116(cuted for each shell and the sh `).15 F
+(`minimalist')-.74 E 2.616('b)-.74 G(eha)472.26 338.4 Q(vior)-.2 E(.)-.55 E
+2.956(An interacti)72 350.4 R 3.256 -.15(ve i)-.25 H 2.956
+(nstance of bash started as a login shell reads and e).15 F -.15(xe)-.15 G
+(cutes).15 E/F2 10/Times-Italic@0 SF(~/.bash_pr)5.455 E(o\214le)-.45 E F0 2.955
+(\(the \214le)7.121 F F2(.bash_pr)72 362.4 Q(o\214le)-.45 E F0 .835
+(in the user')5 F 3.335(sh)-.55 G .835(ome directory\), if it e)187.385 362.4 R
+3.335(xists. An)-.15 F(interacti)3.335 E 1.135 -.15(ve n)-.25 H .835
+(on-login shell reads and e).15 F -.15(xe)-.15 G(cutes).15 E F2(~/.bashr)72
+374.4 Q(c)-.37 E F0 5.538(.A)1.666 G(non-interacti)127.422 374.4 Q .838 -.15
+(ve s)-.25 H .538(hell \(one be).15 F .538(gun to e)-.15 F -.15(xe)-.15 G .538
+(cute a shell script, for e).15 F .537(xample\) reads no \214x)-.15 F .537
+(ed startup)-.15 F .139(\214le, b)72 386.4 R .139(ut uses the v)-.2 F .139
+(alue of the v)-.25 F(ariable)-.25 E F1(ENV)2.639 E F0 2.639(,i)C 2.639(fs)
+253.361 386.4 S .139(et, as the name of a startup \214le.)263.22 386.4 R .139
+(The ksh practice of reading)5.139 F F1($ENV)72 398.4 Q F0 .69(for e)3.19 F
+-.15(ve)-.25 G .69(ry shell, with the accompan).15 F .689(ying dif)-.15 F .689
+(\214culty of de\214ning the proper v)-.25 F .689(ariables and functions for)
+-.25 F(interacti)72 410.4 Q .946 -.15(ve a)-.25 H .646(nd non-interacti).15 F
+.946 -.15(ve s)-.25 H .646(hells or ha).15 F .646
+(ving the \214le read only for interacti)-.2 F .946 -.15(ve s)-.25 H .646
+(hells, w).15 F .646(as considered too)-.1 F(comple)72 422.4 Q(x.)-.15 E F1 2.5
+(4.3.2. New)72 446.4 R(Builtin Commands)2.5 E F0 1.119(There are a fe)97 462 R
+3.619(wb)-.25 G 1.118(uiltins which are ne)170.986 462 R 3.618(wo)-.25 G 3.618
+(rh)268.528 462 S -2.25 -.2(av e)280.476 462 T 1.118(been e)3.818 F 1.118
+(xtended in bash.)-.15 F(The)6.118 E F1(enable)3.618 E F0 -.2(bu)3.618 G 1.118
+(iltin allo).2 F(ws)-.25 E -.2(bu)72 474 S .736
+(iltin commands to be turned on and of).2 F 3.236(fa)-.25 G(rbitrarily)250.198
+474 Q 5.736(.T)-.65 G 3.237(ou)298.644 474 S .737(se the v)311.881 474 R .737
+(ersion of)-.15 F F2(ec)3.237 E(ho)-.15 E F0 .737(found in a user')4.903 F
+3.237(ss)-.55 G(earch)482.35 474 Q .013(path rather than the bash b)72 486 R
+(uiltin,)-.2 E/F3 10/Courier@0 SF .013(enable -n echo)2.513 F F0(suf)2.513 E
+2.513(\214ces. The)-.25 F F1(help)2.513 E F0 -.2(bu)2.513 G .013(iltin pro).2 F
+.013(vides quick synopses of)-.15 F 1.382(the shell f)72 498 R 1.382
+(acilities without requiring access to a manual page.)-.1 F F1(Builtin)6.382 E
+F0 1.383(is similar to)3.882 F F1(command)3.883 E F0 1.383(in that it)3.883 F
+.342(bypasses shell functions and directly e)72 510 R -.15(xe)-.15 G .342
+(cutes b).15 F .342(uiltin commands.)-.2 F .342
+(Access to a csh-style stack of directories)5.342 F .072(is pro)72 522 R .073
+(vided via the)-.15 F F1(pushd)2.573 E F0(,)A F1(popd)2.573 E F0 2.573(,a)C(nd)
+211.197 522 Q F1(dirs)2.573 E F0 -.2(bu)2.573 G(iltins.).2 E F1(Pushd)5.073 E
+F0(and)2.573 E F1(popd)2.573 E F0 .073(insert and remo)2.573 F .373 -.15(ve d)
+-.15 H .073(irectories from the).15 F .094(stack, respecti)72 534 R -.15(ve)
+-.25 G(ly).15 E 2.594(,a)-.65 G(nd)154.448 534 Q F1(dirs)2.594 E F0 .094
+(lists the stack contents.The)2.594 F F1(suspend)2.594 E F0 .094
+(command will stop the shell process when)2.594 F 1.329(job control is acti)72
+546 R -.15(ve)-.25 G 3.829(;m).15 G 1.329(ost other shells do not allo)169.136
+546 R 3.829(wt)-.25 G(hemselv)294.64 546 Q 1.33(es to be stopped lik)-.15 F
+3.83(et)-.1 G(hat.)421.31 546 Q F1 -.74(Ty)6.33 G(pe,).74 E F0 1.33(the bash)
+3.83 F(answer to)72 558 Q F1(which)2.5 E F0(and)2.5 E F1(whence,)2.5 E F0(sho)
+2.5 E(ws what will happen when a w)-.25 E(ord is typed as a command:)-.1 E F3 6
+($t)97 576 S(ype export)115 576 Q(export is a shell builtin)97 588 Q 6($t)97
+600 S(ype -t export)115 600 Q(builtin)97 612 Q 6($t)97 624 S(ype bash)115 624 Q
+(bash is /bin/bash)97 636 Q 6($t)97 648 S(ype cd)115 648 Q(cd is a function)97
+660 Q(cd \(\))97 672 Q({)97 684 Q(builtin cd "$@" && xtitle $HOST: $PWD)121 696
+Q(})97 708 Q EP
+%%Page: 7 7
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-7-)279.67 48 S -1.11(Va)72 84 S .682
+(rious modes tell what a command w)1.11 F .681(ord is \(reserv)-.1 F .681(ed w)
+-.15 F .681(ord, alias, function, b)-.1 F .681(uiltin, or \214le\) or which v)
+-.2 F(er)-.15 E(-)-.2 E 1.15(sion of a command will be e)72 96 R -.15(xe)-.15 G
+1.15(cuted based on a user').15 F 3.65(ss)-.55 G 1.15(earch path.)305.7 96 R
+1.15(Some of this functionality has been)6.15 F
+(adopted by POSIX.2 and folded into the)72 108 Q/F1 10/Times-Bold@0 SF(command)
+2.5 E F0(utility)2.5 E(.)-.65 E F1 2.5(4.3.3. Editing)72 132 R(and Completion)
+2.5 E F0 .682(One area in which bash shines is command line editing.)97 147.6 R
+.682(Bash uses the)5.682 F/F2 10/Times-Italic@0 SF -.37(re)3.182 G(adline).37 E
+F0 .682(library to read and)4.848 F .102(edit lines when interacti)72 159.6 R
+-.15(ve)-.25 G 5.102(.R).15 G .103(eadline is a po)191.438 159.6 R .103
+(werful and \215e)-.25 F .103(xible input f)-.15 F .103
+(acility that a user can con\214gure to his)-.1 F 2.506(tastes. It)72 171.6 R
+(allo)2.506 E .006(ws lines to be edited using either emacs or vi commands, wh\
+ere those commands are appropri-)-.25 F 2.994(ate. The)72 183.6 R .494
+(full capability of emacs is not present \255 there is no w)2.994 F .495
+(ay to e)-.1 F -.15(xe)-.15 G .495(cute a named command with M-x,).15 F .222
+(for instance \255 b)72 195.6 R .222(ut the e)-.2 F .222
+(xisting commands are more than adequate.)-.15 F .221
+(The vi mode is compliant with the com-)5.222 F
+(mand line editing standardized by POSIX.2.)72 207.6 Q 1.69
+(Readline is fully customizable.)97 223.2 R 1.691
+(In addition to the basic commands and k)6.69 F 1.991 -.15(ey b)-.1 H 1.691
+(indings, the library).15 F(allo)72 235.2 Q .83
+(ws users to de\214ne additional k)-.25 F 1.13 -.15(ey b)-.1 H .83
+(indings using a startup \214le.).15 F(The)5.83 E F2(inputr)3.329 E(c)-.37 E F0
+.829(\214le, which def)4.995 F .829(aults to the)-.1 F(\214le)72 247.2 Q F2
+(~/.inputr)4.287 E(c)-.37 E F0 4.287(,i)1.666 G 4.287(sr)137.43 247.2 S 1.788(\
+ead each time readline initializes, permitting users to maintain a consistent \
+interf)148.937 247.2 R(ace)-.1 E .547(across a set of programs.)72 259.2 R .546
+(Readline includes an e)5.546 F .546(xtensible interf)-.15 F .546
+(ace, so each program using the library can)-.1 F .23(add its o)72 271.2 R .23
+(wn bindable commands and program-speci\214c k)-.25 F .531 -.15(ey b)-.1 H
+2.731(indings. Bash).15 F .231(uses this f)2.731 F .231
+(acility to add bindings)-.1 F(that perform history e)72 283.2 Q
+(xpansion or shell w)-.15 E(ord e)-.1 E(xpansions on the current input line.)
+-.15 E .707(Readline interprets a number of v)97 298.8 R .706
+(ariables which further tune its beha)-.25 F(vior)-.2 E 5.706(.V)-.55 G .706
+(ariables e)408.432 298.8 R .706(xist to control)-.15 F .157
+(whether or not eight-bit characters are directly read as input or con)72 310.8
+R -.15(ve)-.4 G .158(rted to meta-pre\214x).15 F .158(ed k)-.15 F .458 -.15
+(ey s)-.1 H .158(equences \(a).15 F(meta-pre\214x)72 322.8 Q 1.575(ed k)-.15 F
+1.875 -.15(ey s)-.1 H 1.575
+(equence consists of the character with the eighth bit zeroed, preceded by the)
+.15 F F2(meta-)4.074 E(pr)72 334.8 Q(e\214x)-.37 E F0(character)4.45 E 2.784
+(,u)-.4 G .284(sually escape, which selects an alternate k)145.374 334.8 R -.15
+(ey)-.1 G .285(map\), to decide whether to output characters).15 F .485
+(with the eighth bit set directly or as a meta-pre\214x)72 346.8 R .485(ed k)
+-.15 F .784 -.15(ey s)-.1 H .484(equence, whether or not to wrap to a ne).15 F
+2.984(ws)-.25 G(creen)482.35 346.8 Q .157
+(line when a line being edited is longer than the screen width, the k)72 358.8
+R -.15(ey)-.1 G .158(map to which subsequent k).15 F .458 -.15(ey b)-.1 H
+(indings).15 E .531(should apply)72 370.8 R 3.031(,o)-.65 G 3.031(re)133.802
+370.8 S -.15(ve)144.353 370.8 S 3.031(nw).15 G .531
+(hat happens when readline w)168.894 370.8 R .531(ants to ring the terminal')
+-.1 F 3.03(sb)-.55 G 3.03(ell. All)399.37 370.8 R .53(of these v)3.03 F
+(ariables)-.25 E(can be set in the inputrc \214le.)72 382.8 Q .284
+(The startup \214le understands a set of C preprocessor)97 398.4 R(-lik)-.2 E
+2.785(ec)-.1 G .285(onditional constructs which allo)329.49 398.4 R 2.785(wv)
+-.25 G(ariables)472.9 398.4 Q .12(or k)72 410.4 R .42 -.15(ey b)-.1 H .119(ind\
+ings to be assigned based on the application using readline, the terminal curr\
+ently being used, or).15 F .316(the editing mode.)72 422.4 R .317
+(Users can add program-speci\214c bindings to mak)5.317 F 2.817(et)-.1 G .317
+(heir li)352.808 422.4 R -.15(ve)-.25 G 2.817(se).15 G 2.817(asier: here)
+396.922 422.4 R .317(are bindings to)2.817 F(edit the v)72 434.4 Q(alue of)-.25
+E F1 -.74(PA)2.5 G(TH)-.21 E F0(and double-quote the current or pre)2.5 E
+(vious w)-.25 E(ord:)-.1 E/F3 10/Courier@0 SF 6(#M)97 452.4 S
+(acros that are convenient for shell interaction)115 452.4 Q($if Bash)97 464.4
+Q 6(#e)97 476.4 S(dit the path)115 476.4 Q
+("\\C-xp": "PATH=${PATH}\\e\\C-e\\C-a\\ef\\C-f")97 488.4 Q 6(#p)97 500.4 S
+(repare to type a quoted word -- insert open and close double quotes)115 500.4
+Q 6(#a)97 512.4 S(nd move to just after the open quote)115 512.4 Q
+("\\C-x\\"": "\\"\\"\\C-b")97 524.4 Q 6(#Q)97 536.4 S
+(uote the current or previous word)115 536.4 Q("\\C-xq": "\\eb\\"\\ef\\"")97
+548.4 Q($endif)97 560.4 Q F0 .322(There is a readline command to re-read the \
+\214le, so users can edit the \214le, change some bindings, and be)72 582 R
+(gin)-.15 E(to use them almost immediately)72 594 Q(.)-.65 E .851
+(Bash implements the)97 609.6 R F1(bind)3.351 E F0 -.2(bu)3.351 G .851
+(iltin for more dyamic control of readline than the startup \214le permits.).2
+F F1(Bind)72 621.6 Q F0 .167(is used in se)2.667 F -.15(ve)-.25 G .167(ral w)
+.15 F 2.667(ays. In)-.1 F F2(list)2.667 E F0 .167
+(mode, it can display the current k)4.333 F .466 -.15(ey b)-.1 H .166
+(indings, list all the readline edit-).15 F .149(ing directi)72 633.6 R -.15
+(ve)-.25 G 2.649(sa).15 G -.25(va)132.798 633.6 S .149
+(ilable for binding, list which k).25 F -.15(ey)-.1 G 2.649(si).15 G -1.9 -.4
+(nv o)282.352 633.6 T .349 -.1(ke a g).4 H -2.15 -.25(iv e).1 H 2.65(nd).25 G
+(irecti)345.3 633.6 Q -.15(ve)-.25 G 2.65(,o).15 G 2.65(ro)385.04 633.6 S .15
+(utput the current set of k)396.02 633.6 R -.15(ey)-.1 G .526(bindings in a fo\
+rmat that can be incorporated directly into an inputrc \214le.)72 645.6 R(In)
+5.526 E F2(batc)3.026 E(h)-.15 E F0 .526(mode, it reads a series)4.692 F .71
+(of k)72 657.6 R 1.01 -.15(ey b)-.1 H .71
+(indings directly from a \214le and passes them to readline.).15 F .71
+(In its most common usage,)5.71 F F1(bind)3.21 E F0(tak)3.21 E .71(es a)-.1 F
+.534(single string and passes it directly to readline, which interprets the li\
+ne as if it had just been read from the)72 669.6 R(inputrc \214le.)72 681.6 Q
+(Both k)5 E .3 -.15(ey b)-.1 H(indings and v).15 E
+(ariable assignments can appear in the string gi)-.25 E -.15(ve)-.25 G 2.5(nt)
+.15 G(o)424.4 681.6 Q F1(bind)2.5 E F0(.)A .401(The readline library also pro)
+97 697.2 R .402(vides an interf)-.15 F .402(ace for)-.1 F F2(wor)2.902 E 2.902
+(dc)-.37 G(ompletion)328.546 697.2 Q F0 5.402(.W)C .402(hen the)385.888 697.2 R
+F2(completion)2.902 E F0(character)4.568 E 1.261(\(usually T)72 709.2 R 1.261
+(AB\) is typed, readline looks at the w)-.93 F 1.26
+(ord currently being entered and computes the set of \214le-)-.1 F .523
+(names of which the current w)72 721.2 R .523(ord is a v)-.1 F .523
+(alid pre\214x.)-.25 F .524
+(If there is only one possible completion, the rest of the)5.523 F EP
+%%Page: 8 8
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-8-)279.67 48 S .358
+(characters are inserted directly)72 84 R 2.858(,o)-.65 G .358(therwise the co\
+mmon pre\214x of the set of \214lenames is added to the current)205.232 84 R
+-.1(wo)72 96 S 3.199(rd. A).1 F .699(second T)3.199 F .699(AB character entere\
+d immediately after a non-unique completion causes readline to list)-.93 F
+1.814(the possible completions; there is an option to ha)72 108 R 2.113 -.15
+(ve t)-.2 H 1.813(he list displayed immediately).15 F 6.813(.R)-.65 G 1.813
+(eadline pro)436.517 108 R(vides)-.15 E .482
+(hooks so that applications can pro)72 120 R .482
+(vide speci\214c types of completion before the def)-.15 F .483
+(ault \214lename completion)-.1 F .132(is attempted.)72 132 R .132
+(This is quite \215e)5.132 F .132(xible, though it is not completely user)-.15
+F 2.632(-programmable. Bash,)-.2 F .132(for e)2.632 F .132(xample, can)-.15 F
+.37(complete \214lenames, command names \(including aliases, b)72 144 R .37
+(uiltins, shell reserv)-.2 F .37(ed w)-.15 F .37(ords, shell functions, and)-.1
+F -.15(exe)72 156 S .424(cutables found in the \214le system\), shell v).15 F
+.424(ariables, usernames, and hostnames.)-.25 F .423
+(It uses a set of heuristics)5.424 F(that, while not perfect, is generally qui\
+te good at determining what type of completion to attempt.)72 168 Q/F1 10
+/Times-Bold@0 SF 2.5(4.3.4. History)72 192 R F0 .255
+(Access to the list of commands pre)97 207.6 R .255(viously entered \(the)-.25
+F/F2 10/Times-Italic@0 SF .255(command history)2.755 F F0 2.756(\)i)C 2.756(sp)
+399.236 207.6 S(ro)410.882 207.6 Q .256(vided jointly by bash)-.15 F .095
+(and the readline library)72 219.6 R 5.094(.B)-.65 G .094(ash pro)178.928 219.6
+R .094(vides v)-.15 F .094(ariables \()-.25 F F1(HISTFILE)A F0(,)A F1(HISTSIZE)
+2.594 E F0 2.594(,a)C(nd)382.068 219.6 Q F1(HISTCONTR)2.594 E(OL)-.3 E F0 2.594
+(\)a)C .094(nd the)479.186 219.6 R F1(history)72 231.6 Q F0(and)2.825 E F1(fc)
+2.825 E F0 -.2(bu)2.825 G .325(iltins to manipulate the history list.).2 F .325
+(The v)5.325 F .325(alue of)-.25 F F1(HISTFILE)2.825 E F0 .326
+(specifes the \214le where bash)2.826 F .128(writes the command history on e)72
+243.6 R .128(xit and reads it on startup.)-.15 F F1(HISTSIZE)5.128 E F0 .128
+(is used to limit the number of com-)2.628 F .346(mands sa)72 255.6 R -.15(ve)
+-.2 G 2.846(di).15 G 2.846(nt)129.002 255.6 S .346(he history)139.628 255.6 R
+(.)-.65 E F1(HISTCONTR)5.346 E(OL)-.3 E F0(pro)2.846 E .346
+(vides a crude form of control o)-.15 F -.15(ve)-.15 G 2.846(rw).15 G .346
+(hich commands are)425.548 255.6 R(sa)72 267.6 Q -.15(ve)-.2 G 2.905(do).15 G
+2.905(nt)102.325 267.6 S .405(he history list: a v)113.01 267.6 R .405(alue of)
+-.25 F F2(ignor)2.905 E(espace)-.37 E F0 .405(means to not sa)4.571 F .705 -.15
+(ve c)-.2 H .405(ommands which be).15 F .405(gin with a space; a)-.15 F -.25
+(va)72 279.6 S .339(lue of).25 F F2(ignor)2.839 E(edups)-.37 E F0 .339
+(means to not sa)4.505 F .64 -.15(ve c)-.2 H .34
+(ommands identical to the last command sa).15 F -.15(ve)-.2 G(d.).15 E F1
+(HISTCONTR)5.34 E(OL)-.3 E F0 -.1(wa)72 291.6 S 3.15(sn).1 G(amed)95.6 291.6 Q
+F1(history_contr)3.15 E(ol)-.18 E F0 .65(in earlier v)3.15 F .649
+(ersions of bash; the old name is still accepted for backw)-.15 F .649
+(ards com-)-.1 F(patibility)72 303.6 Q 5.723(.T)-.65 G(he)121.803 303.6 Q F1
+(history)3.223 E F0 .724(command can read or write \214les containing the hist\
+ory list and display the current)3.223 F .895(list contents.)72 315.6 R(The)
+5.895 E F1(fc)3.395 E F0 -.2(bu)3.395 G .895
+(iltin, adopted from POSIX.2 and the K).2 F .894(orn Shell, allo)-.35 F .894
+(ws display and re-e)-.25 F -.15(xe)-.15 G(cution,).15 E .461
+(with optional editing, of commands from the history list.)72 327.6 R .462
+(The readline library of)5.462 F .462(fers a set of commands to)-.25 F .657(se\
+arch the history list for a portion of the current input line or a string type\
+d by the user)72 339.6 R 5.657(.F)-.55 G(inally)445.836 339.6 Q 3.157(,t)-.65 G
+(he)476.403 339.6 Q F2(his-)3.157 E(tory)72 351.6 Q F0(library)4.196 E 2.53(,g)
+-.65 G .03(enerally incorporated directly into the readline library)128.346
+351.6 R 2.53(,i)-.65 G .03(mplements a f)350.636 351.6 R .031
+(acility for history recall,)-.1 F -.15(ex)72 363.6 S .594(pansion, and re-e)
+.15 F -.15(xe)-.15 G .594(cution of pre).15 F .594(vious commands v)-.25 F .594
+(ery similar to csh \(`)-.15 F .593(`bang history')-.74 F .593
+(', so called because)-.74 F(the e)72 375.6 Q
+(xclamation point introduces a history substitution\):)-.15 E/F3 10/Courier@0
+SF 6($e)97 393.6 S(cho a b c d e)115 393.6 Q 6(abcde)97 405.6 S 6($!)97 417.6 S
+6(!fghi)115 417.6 S(echo a b c d e f g h i)97 429.6 Q 6(abcdefghi)97 441.6 S 6
+($!)97 453.6 S(-2)115 453.6 Q(echo a b c d e)97 465.6 Q 6(abcde)97 477.6 S 6
+($e)97 489.6 S(cho !-2:1-4)115 489.6 Q(echo a b c d)97 501.6 Q 6(abcd)97 513.6
+S F0 1.456(The command history is only sa)72 535.2 R -.15(ve)-.2 G 3.957(dw).15
+G 1.457(hen the shell is interacti)232.599 535.2 R -.15(ve)-.25 G 3.957(,s).15
+G 3.957(oi)352.804 535.2 S 3.957(ti)364.541 535.2 S 3.957(sn)374.058 535.2 S
+1.457(ot a)386.905 535.2 R -.25(va)-.2 G 1.457(ilable for use by shell).25 F
+(scripts.)72 547.2 Q F1 2.5(4.3.5. New)72 571.2 R(Shell V)2.5 E(ariables)-.92 E
+F0 .701(There are a number of con)97 586.8 R -.15(ve)-.4 G .701(nience v).15 F
+.701(ariables that bash interprets to mak)-.25 F 3.2(el)-.1 G .7(ife easier)
+402.76 586.8 R 5.7(.T)-.55 G .7(hese include)453.59 586.8 R F1(FIGNORE)72 598.8
+Q F0 3.973(,w)C 1.473(hich is a set of \214lename suf)132.363 598.8 R<8c78>-.25
+E 1.474(es identifying \214les to e)-.15 F 1.474
+(xclude when completing \214lenames;)-.15 F F1(HOSTTYPE)72 610.8 Q F0 3.03(,w)C
+.53(hich is automatically set to a string describing the type of hardw)139.21
+610.8 R .53(are on which bash is cur)-.1 F(-)-.2 E .76(rently e)72 622.8 R -.15
+(xe)-.15 G(cuting;).15 E F1(OSTYPE)3.26 E F0 3.26(,t)C 3.26(ow)191.76 622.8 S
+.76(hich bash assigns a v)207.24 622.8 R .761(alue that identi\214es the v)-.25
+F .761(ersion of)-.15 F/F4 9/Times-Roman@0 SF(UNIX)3.261 E F0(it')3.261 E 3.261
+(sr)-.55 G(unning)476.22 622.8 Q 1.354
+(on \(great for putting architecture-speci\214c binary directories into the)72
+634.8 R F1 -.74(PA)3.854 G(TH)-.21 E F0 1.354(\); and)B F1(IGNOREEOF)3.854 E F0
+3.854(,w)C(hose)485.67 634.8 Q -.25(va)72 646.8 S .062
+(lue indicates the number of consecuti).25 F .362 -.15(ve E)-.25 H .062
+(OF characters that an interacti).15 F .362 -.15(ve s)-.25 H .062
+(hell will read before e).15 F .062(xiting \255)-.15 F .114(an easy w)72 658.8
+R .113(ay to k)-.1 F .113(eep yourself from being logged out accidentally)-.1 F
+5.113(.T)-.65 G(he)344.285 658.8 Q F1(auto_r)2.613 E(esume)-.18 E F0 -.25(va)
+2.613 G .113(riable alters the w).25 F(ay)-.1 E .409
+(the shell treats simple command names: if job control is acti)72 670.8 R -.15
+(ve)-.25 G 2.909(,a).15 G .409(nd this v)335.516 670.8 R .409
+(ariable is set, single-w)-.25 F .409(ord simple)-.1 F .17(commands without re\
+directions cause the shell to \214rst look for a suspended job with that name \
+before start-)72 682.8 R(ing a ne)72 694.8 Q 2.5(wp)-.25 G(rocess.)118.13 694.8
+Q EP
+%%Page: 9 9
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-9-)279.67 48 S/F1 10/Times-Bold@0 SF 2.5
+(4.3.6. Brace)72 84 R(Expansion)2.5 E F0 .653(Since sh of)97 99.6 R .653
+(fers no con)-.25 F -.15(ve)-.4 G .653(nient w).15 F .653
+(ay to generate arbitrary strings that share a common pre\214x or suf)-.1 F
+<8c78>-.25 E 1.893(\(pathname e)72 111.6 R 1.893
+(xpansion requires that the \214lenames e)-.15 F 1.892(xist\), bash implements)
+-.15 F/F2 10/Times-Italic@0 SF(br)4.392 E 1.892(ace e)-.15 F(xpansion)-.2 E F0
+4.392(,ac)C(apability)469 111.6 Q(pick)72 123.6 Q .496(ed up from csh.)-.1 F
+.496(Brace e)5.496 F .496(xpansion is similar to pathname e)-.15 F .496
+(xpansion, b)-.15 F .497(ut the strings generated need not)-.2 F 1.107
+(correspond to e)72 135.6 R 1.107(xisting \214les.)-.15 F 3.607(Ab)6.107 G
+1.107(race e)207.655 135.6 R 1.107(xpression consists of an optional)-.15 F F2
+(pr)3.606 E(eamble)-.37 E F0 3.606(,f)1.666 G(ollo)419.286 135.6 Q 1.106
+(wed by a pair of)-.25 F 2.809
+(braces enclosing a series of comma-separated strings, and an optional)72 147.6
+R F2(postamble)5.31 E F0 7.81(.T)1.666 G 2.81(he preamble is)440.06 147.6 R(pr\
+epended to each string within the braces, and the postamble is then appended t\
+o each resulting string:)72 159.6 Q/F3 10/Courier@0 SF 6($e)97 177.6 S
+(cho a{d,c,b}e)115 177.6 Q(ade ace abe)97 189.6 Q F1 2.5(4.3.7. Pr)72 219.6 R
+(ompt Customization)-.18 E F0 .077(One of the more popular interacti)97 235.2 R
+.376 -.15(ve f)-.25 H .076(eatures that bash pro).15 F .076
+(vides is the ability to customize the prompt.)-.15 F(Both)72 247.2 Q F1(PS1)
+3.305 E F0(and)3.305 E F1(PS2,)3.305 E F0 .805
+(the primary and secondary prompts, are e)3.305 F .805
+(xpanded before being displayed.)-.15 F -.15(Pa)5.805 G(rameter).15 E .324
+(and v)72 259.2 R .324(ariable e)-.25 F .324
+(xpansion is performed when the prompt string is e)-.15 F .323
+(xpanded, so the v)-.15 F .323(alue of an)-.25 F 2.823(ys)-.15 G .323(hell v)
+454.217 259.2 R(ariable)-.25 E .728(can be put into the prompt \(e.g.,)72 271.2
+R F1($SHL)3.228 E(VL)-.92 E F0 3.228(,w)C .728(hich indicates ho)258.564 271.2
+R 3.228(wd)-.25 G .729(eeply the current shell is nested\).)342.988 271.2 R
+(Bash)5.729 E 1.895
+(specially interprets characters in the prompt string preceded by a backslash.)
+72 283.2 R 1.895(Some of these backslash)6.895 F .874
+(escapes are replaced with the current time, the date, the current w)72 295.2 R
+.874(orking directory)-.1 F 3.374(,t)-.65 G .874(he username, and the)416.958
+295.2 R .781(command number or history number of the command being entered.)72
+307.2 R .78(There is e)5.781 F -.15(ve)-.25 G 3.28(nab).15 G .78
+(ackslash escape to)429.13 307.2 R .007
+(cause the shell to change its prompt when running as root after an)72 319.2 R
+F2(su)2.507 E F0 5.007(.B)C .008(efore printing each primary prompt,)360.388
+319.2 R .27(bash e)72 331.2 R .27(xpands the v)-.15 F(ariable)-.25 E F1(PR)2.77
+E(OMPT_COMMAND)-.3 E F0 .269(and, if it has a v)2.77 F .269(alue, e)-.25 F -.15
+(xe)-.15 G .269(cutes the e).15 F .269(xpanded v)-.15 F .269(alue as a)-.25 F
+.04(command, allo)72 343.2 R .041(wing additional prompt customization.)-.25 F
+-.15(Fo)5.041 G 2.541(re).15 G .041
+(xample, this assignment causes the current user)311.964 343.2 R(,)-.4 E .99
+(the current host, the time, the last component of the current w)72 355.2 R
+.989(orking directory)-.1 F 3.489(,t)-.65 G .989(he le)402.954 355.2 R -.15(ve)
+-.25 G 3.489(lo).15 G 3.489(fs)443.412 355.2 S .989(hell nesting,)454.121 355.2
+R(and the history number of the current command to be embedded into the primar\
+y prompt:)72 367.2 Q F3 6($P)97 385.2 S
+(S1='\\u@\\h [\\t] \\W\($SHLVL:\\!\)\\$ ')115 385.2 Q
+(chet@odin [21:03:44] documentation\(2:636\)$ cd ..)97 397.2 Q
+(chet@odin [21:03:54] src\(2:637\)$)97 409.2 Q F0 .619
+(The string being assigned is surrounded by single quotes so that if it is e)72
+430.8 R(xported,)-.15 E F1(SHL)3.119 E(VL)-.92 E F0 .619(will be updated)3.119
+F(by a child shell:)72 442.8 Q F3
+(chet@odin [21:13:35] src\(2:638\)$ export PS1)97 460.8 Q
+(chet@odin [21:17:40] src\(2:639\)$ bash)97 472.8 Q
+(chet@odin [21:17:46] src\(3:696\)$)97 484.8 Q F0(The)72 506.4 Q F1(\\$)2.5 E
+F0(escape is displayed as `)2.5 E(`)-.74 E F1($)A F0 1.48 -.74('' w)D
+(hen running as a normal user).74 E 2.5(,b)-.4 G(ut as `)342.08 506.4 Q(`)-.74
+E F1(#)A F0 1.48 -.74('' w)D(hen running as root.).74 E F1 2.5(4.3.8. POSIX)72
+530.4 R(Mode)2.5 E F0 .46(Although bash is intended to be POSIX.2 compliant, t\
+here are areas in which the def)97 546 R .46(ault beha)-.1 F .46(vior is)-.2 F
+1.168(not compatible with the standard.)72 558 R -.15(Fo)6.169 G 3.669(ru).15 G
+1.169(sers who wish to operate in a strict POSIX.2 en)238.85 558 R 1.169
+(vironment, bash)-.4 F .61(implements a)72 570 R F2 .61(POSIX mode)3.11 F F0
+5.61(.W)C .61(hen this mode is acti)199.42 570 R -.15(ve)-.25 G 3.109(,b).15 G
+.609(ash modi\214es its def)303.727 570 R .609(ault operation where it dif)-.1
+F(fers)-.25 E .066(from POSIX.2 to match the standard.)72 582 R .067
+(POSIX mode is entered when bash is started with the)5.066 F F1 .067(-o posix)
+2.567 F F0(option)2.567 E .382(or when)72 594 R F1 .382(set -o posix)2.882 F F0
+.381(is e)2.881 F -.15(xe)-.15 G 2.881(cuted. F).15 F .381
+(or compatibility with other GNU softw)-.15 F .381
+(are that attempts to be POSIX.2)-.1 F 5.752
+(compliant, bash also enters POSIX mode if either of the v)72 606 R(ariables)
+-.25 E F1(POSIX_PED)8.253 E(ANTIC)-.35 E F0(or)8.253 E F1(POSIXL)72 618 Q
+(Y_CORRECT)-.92 E F0 1.179(is set when bash is started or assigned a v)3.679 F
+1.178(alue during e)-.25 F -.15(xe)-.15 G 3.678(cution. When).15 F 1.178
+(bash is)3.678 F .218(started in POSIX mode, for e)72 630 R .218(xample, the)
+-.15 F F1(kill)2.718 E F0 -.2(bu)2.718 G(iltin').2 E(s)-.55 E F1<ad6c>2.718 E
+F0 .218(option beha)2.718 F -.15(ve)-.2 G 2.718(sd).15 G(if)370.166 630 Q .219
+(ferently: it lists the names of all)-.25 F 1.084(signals on a single line sep\
+arated by spaces, rather than listing the signal names and their corresponding)
+72 642 R(numbers.)72 654 Q .865(Some of the def)97 669.6 R .865(ault bash beha)
+-.1 F .865(vior dif)-.2 F .865
+(fers from other shells as a result of the POSIX standard.)-.25 F -.15(Fo)5.866
+G(r).15 E 1.16(instance, bash includes the)72 681.6 R F1(!)3.66 E F0(reserv)
+6.16 E 1.16(ed w)-.15 F 1.16(ord to ne)-.1 F -.05(ga)-.15 G 1.16
+(te the return status of a pipeline because it has been).05 F
+(de\214ned by POSIX.2.)72 693.6 Q
+(Neither sh nor ksh has implemented that feature.)5 E EP
+%%Page: 10 10
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-1)277.17 48 S 2.5(0-)288 48 S/F1 10/Times-Bold@0
+SF 2.5(4.4. F)72 84 R(eatur)-.25 E(es Unique to ksh)-.18 E F0 .177
+(Ksh includes a number of features not in the currently-released v)97 99.6 R
+.178(ersion of bash, v)-.15 F .178(ersion 1.14.)-.15 F(Unless)5.178 E .822
+(noted, none of these features is in the POSIX.2 standard.)72 111.6 R .821
+(Where appropriate the equi)5.821 F -.25(va)-.25 G .821(lent bash features).25
+F(are noted.)72 123.6 Q F1 2.5(4.4.1. The)72 147.6 R(ksh Language)2.5 E F0
+2.955(An)97 163.2 S .955 -.25(ew c)112.175 163.2 T .455(ompound command folds)
+.25 F F1(test)2.955 E F0 .456(into the ksh language, delimited by the reserv)
+2.955 F .456(ed w)-.15 F(ords)-.1 E F1([[)2.956 E F0(and)2.956 E F1(]])72 175.2
+Q F0 5.726(.T)C .726(he syntax is identical to)92.996 175.2 R F1(test)3.225 E
+F0 .725(with a fe)3.225 F 3.225(wc)-.25 G .725
+(hanges: for instance, instead of)262.855 175.2 R F1<ad61>3.225 E F0(and)3.225
+E F1<ad6f>3.225 E F0(,)A F1(&&)3.225 E F0(and)3.225 E/F2 10/Symbol SF<efef>
+3.225 E F0(are)3.225 E 3.32(used. The)72 187.2 R -.1(wo)3.32 G .82(rds between)
+.1 F F1([[)3.32 E F0(and)3.32 E F1(]])3.32 E F0 .82(are not processed for w)
+3.32 F .82(ord splitting or \214lename generation.)-.1 F .82(The ne)5.82 F(w)
+-.25 E .926
+(command does pattern matching as well as string comparison, a la the)72 199.2
+R F1(case)3.425 E F0 3.425(command. This)3.425 F(ne)3.425 E 3.425(wc)-.25 G
+(ontrol)480.11 199.2 Q .165(structure does ha)72 211.2 R .465 -.15(ve t)-.2 H
+.165(he adv).15 F .166(antage of reducing common ar)-.25 F .166
+(gument problems encountered using test \(e.g.)-.18 F F1(test)2.666 E
+("$string")72 223.2 Q F0 2.928(,w)C(here)125.748 223.2 Q F1($string)2.928 E F0
+-.15(ex)2.928 G .428(pands to).15 F F1<ad66>2.928 E F0 .428(\), b)B .428
+(ut at the cost of bloating the language.)-.2 F .427(The POSIX.2 test algo-)
+5.427 F 2.752(rithm that bash uses, along with some programmer care, alle)72
+235.2 R 2.752(viates those problems in a backw)-.25 F(ards-)-.1 E .854
+(compatible w)72 247.2 R .853(ay with no additions to the language.)-.1 F .853
+(The one capability of)5.853 F F1 .853([[ ]])3.353 F F0 .853(not a)3.353 F -.25
+(va)-.2 G .853(ilable in bash is its).25 F(ability to test whether an indi)72
+259.2 Q(vidual)-.25 E F1(set \255o)2.5 E F0(option is turned on or of)2.5 E(f.)
+-.25 E .339(Other parts of the ksh language are not common to bash.)97 274.8 R
+(The)5.34 E F1(\(\(...\)\))2.84 E F0(operator)5.34 E 2.84(,e)-.4 G(qui)419.33
+274.8 Q -.25(va)-.25 G .34(lent to).25 F F1 .34(let "...")2.84 F F0(,)A .197
+(is unique to ksh, as are the concept of co-processes and the)72 286.8 R F1
+(time)2.697 E F0 -.1(ke)2.696 G(yw)-.05 E .196
+(ord to time commands and pipelines.)-.1 F F1 2.5(4.4.2. Functions)72 310.8 R
+(and Aliases)2.5 E F0 1.022(The K)97 326.4 R 1.022(orn shell has)-.35 F/F3 10
+/Times-Italic@0 SF(autoloaded)3.522 E F0 3.522(functions. A)3.522 F 1.022
+(function mark)3.522 F 1.022(ed as)-.1 F F3(autoload)3.522 E F0 1.022
+(is not de\214ned until it is)5.188 F 1.042(\214rst e)72 338.4 R -.15(xe)-.15 G
+3.542(cuted. When).15 F 1.042(such a function is e)3.542 F -.15(xe)-.15 G 1.042
+(cuted, a search is made through the directories in).15 F F1(FP)3.541 E -.95
+(AT)-.74 G(H).95 E F0(\(a)3.541 E .27
+(colon-separated list of directories similar to)72 350.4 R F1 -.74(PA)2.77 G
+(TH)-.21 E F0 2.77(\)f)C .27(or a \214le with the same name as the function.)
+285.78 350.4 R .27(That \214le)5.27 F .548(is then read in as with the)72 362.4
+R F1(.)3.881 E F0 .547(command; presumably the function is de\214ned therein.)
+3.047 F .547(There is a pair of shell)5.547 F .886
+(functions included in the bash distrib)72 374.4 R .886(ution \()-.2 F F3 -.2
+(ex)C(amples/functions/autoload).2 E F0 5.886(\)t)C .886(hat pro)378.35 374.4 R
+.886(vide much of this func-)-.15 F
+(tionality without changing the shell itself.)72 386.4 Q .116
+(Ksh functions are scoped in such a w)97 402 R .116(ay that the en)-.1 F .116
+(vironment in which the)-.4 F 2.616(ya)-.15 G .116(re e)405.144 402 R -.15(xe)
+-.15 G .115(cuted is closer to a).15 F .827(shell script en)72 414 R 3.327
+(vironment. Bash)-.4 F .827(uses the POSIX.2 scoping rules, which mak)3.327 F
+3.327(et)-.1 G .827(he function e)392.517 414 R -.15(xe)-.15 G .828(cution en)
+.15 F(vi-)-.4 E 1.2(ronment an e)72 426 R 1.2(xact cop)-.15 F 3.7(yo)-.1 G 3.7
+(ft)174.86 426 S 1.199(he shell en)184.67 426 R 1.199
+(vironment with the replacement of the shell')-.4 F 3.699(sp)-.55 G 1.199
+(ositional paramters)426.421 426 R(with the function ar)72 438 Q 2.5
+(guments. K)-.18 F
+(orn shell functions do not share options or traps with the in)-.35 E -.2(vo)
+-.4 G(king shell.).2 E .451(Ksh has)97 453.6 R F3(tr)2.951 E(ac)-.15 E -.1(ke)
+-.2 G(d).1 E F0 .452(aliases, which alias a command name to its full pathname.)
+2.952 F .452(Bash has true command)5.452 F(hashing.)72 465.6 Q F1 2.5
+(4.4.3. Arrays)72 489.6 R F0 .246
+(Arrays are an aspect of ksh that has no real bash equi)97 505.2 R -.25(va)-.25
+G 2.746(lent. The).25 F 2.746(ya)-.15 G .246(re easy to create and manipulate:)
+371.42 505.2 R 1.637
+(an array is created automatically by using subscript assignment \()72 517.2 R
+F1(name)A F0([)A F3(inde)A(x)-.2 E F0(]=)A F1 -.1(va)C(lue).1 E F0 1.637
+(\), and an)B 4.137(yv)-.15 G(ariable)476.79 517.2 Q 1.967
+(may be referred to as an array)72 529.2 R 6.967(.K)-.65 G 1.967(sh arrays, ho)
+219.229 529.2 R(we)-.25 E -.15(ve)-.25 G 2.767 -.4(r, h).15 H -2.25 -.2(av e).4
+H(se)4.667 E -.15(ve)-.25 G 1.967(ral anno).15 F 1.967(ying limitations: the)
+-.1 F 4.466(ym)-.15 G 1.966(ay be)480.654 529.2 R(inde)72 541.2 Q -.15(xe)-.15
+G 3.498(do).15 G .998(nly up to 512 or 1024 elements, depending on ho)111.858
+541.2 R 3.498(wt)-.25 G .999(he shell is compiled, and there is only the)
+330.188 541.2 R(clumsy)72 553.2 Q F1 .223(set -A)2.723 F F0 .223
+(to assign a list of v)2.723 F .223(alues sequentially)-.25 F 5.223(.D)-.65 G
+.223(espite these limits, arrays are useful, if underutilized)293.31 553.2 R
+(by shell programmers.)72 565.2 Q F1 2.5(4.4.4. Builtin)72 589.2 R(Commands)2.5
+E F0 .112(Some of the b)97 604.8 R .112(uiltin commands ha)-.2 F .412 -.15
+(ve b)-.2 H .112(een e).15 F .112(xtended or are ne)-.15 F 2.612(wi)-.25 G
+2.613(nk)351.402 604.8 S 2.613(sh. The)364.015 604.8 R F1(print)2.613 E F0 -.2
+(bu)2.613 G .113(iltin w).2 F .113(as included)-.1 F .242(to w)72 616.8 R .242
+(ork around the incompatibilities and limitations of)-.1 F F1(echo)2.741 E F0
+5.241(.T)C(he)328.234 616.8 Q F1(whence)2.741 E F0 .241(command tells what w)
+2.741 F .241(ould hap-)-.1 F .418(pen if each ar)72 628.8 R .418
+(gument were typed as a command name.)-.18 F(The)5.418 E F1(cd)2.919 E F0 -.2
+(bu)2.919 G .419(iltin has been e).2 F .419(xtended to tak)-.15 F 2.919(eu)-.1
+G 2.919(pt)470.482 628.8 S 2.919(ot)481.181 628.8 S -.1(wo)491.88 628.8 S(ar)72
+640.8 Q 1.425(guments: if tw)-.18 F 3.925(oa)-.1 G -.18(rg)153.485 640.8 S
+1.424(uments are supplied, the second is substituted for the \214rst in the cu\
+rrent directory).18 F 2.294
+(name and the shell changes to the resultant directory name.)72 652.8 R 2.295
+(The ksh)7.294 F F1(trap)4.795 E F0 -.2(bu)4.795 G 2.295(iltin accepts).2 F F1
+(ERR)4.795 E F0(and)4.795 E F1(DEB)72 664.8 Q(UG)-.1 E F0 .15(as trap names.)
+2.65 F(The)5.15 E F1(ERR)2.65 E F0 .15(trap is e)2.65 F -.15(xe)-.15 G .15
+(cuted when a command f).15 F(ails;)-.1 E F1(DEB)2.65 E(UG)-.1 E F0 .15(is e)
+2.65 F -.15(xe)-.15 G .15(cuted after e).15 F -.15(ve)-.25 G(ry).15 E
+(simple command.)72 676.8 Q .05(The bash distrib)97 692.4 R .05
+(ution includes shell functions that implement)-.2 F F1(print)2.55 E F0(and)
+2.55 E F1(whence)2.55 E F0 .05(and the e)2.55 F .05(xtensions to)-.15 F F1(cd)
+72 704.4 Q F0(.)A EP
+%%Page: 11 11
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-1)277.17 48 S 2.5(1-)288 48 S/F1 10/Times-Bold@0
+SF 2.5(4.4.5. Expansion)72 84 R F0 .282(The ksh \214lename generation \()97
+99.6 R/F2 10/Times-Italic@0 SF(globbing)A F0 2.782(\)f)C .282(acilities ha)
+262.45 99.6 R .581 -.15(ve b)-.2 H .281(een e).15 F .281(xtended be)-.15 F .281
+(yond their bash and sh coun-)-.15 F 3.68(terparts. In)72 111.6 R 1.181
+(this area, ksh can be thought of as)3.681 F F2 -.4(eg)3.681 G -.37(re).4 G(p)
+.37 E F0 1.181(to the bash)5.347 F F2(gr)3.681 E(ep)-.37 E F0 6.181(.K)1.666 G
+1.181(sh globbing of)382.406 111.6 R 1.181(fers things lik)-.25 F(e)-.1 E 1.018
+(alternation, the ability to match zero or more instances of a pattern, and th\
+e ability to match e)72 123.6 R 1.018(xactly one)-.15 F(occurrence of an)72
+135.6 Q 2.5(yo)-.15 G 2.5(fal)150.98 135.6 S(ist of patterns.)166.53 135.6 Q F1
+2.5(4.4.6. Startup)72 159.6 R(Files)2.5 E F0 .977(Ksh and bash e)97 175.2 R
+-.15(xe)-.15 G .977(cute startup \214les dif).15 F(ferently)-.25 E 5.977(.K)
+-.65 G .977(sh e)297.879 175.2 R(xpands)-.15 E F1(ENV)3.478 E F0 .978
+(and sources the \214le it names for)3.478 F -2.15 -.25(ev e)72 187.2 T 1.85
+(ry shell.).25 F 1.85(Bash sources)6.85 F F1($ENV)4.35 E F0 1.85
+(only in non-interacti)4.35 F 2.15 -.15(ve s)-.25 H 1.85(hells; interacti).15 F
+2.15 -.15(ve s)-.25 H 1.85(hells source \214x).15 F 1.85(ed \214les, as)-.15 F
+-.15(ex)72 199.2 S 1.285(plained in the pre).15 F 1.285(vious section.)-.25 F
+1.285(The POSIX standard has speci\214ed the ksh beha)6.285 F(vior)-.2 E 3.785
+(,s)-.4 G 3.785(ob)441.545 199.2 S 1.285(ash acts the)455.33 199.2 R
+(same as ksh if started with the)72 211.2 Q F1(\255posix)2.5 E F0(or)2.5 E F1
+(\255o posix)2.5 E F0(options.)2.5 E F1 2.5(4.4.7. History)72 235.2 R F0
+(Finally)97 250.8 Q 3.372(,t)-.65 G .872(he ksh history implementation dif)
+133.342 250.8 R .871(fers slightly from bash.)-.25 F .871
+(Each instance of bash k)5.871 F .871(eeps the)-.1 F .633
+(history list in memory and of)72 262.8 R .633(fers options to the)-.25 F F1
+(history)3.133 E F0 -.2(bu)3.133 G .634
+(iltin to write the list to or read it from a named).2 F 3.216(\214le. Ksh)72
+274.8 R -.1(ke)3.216 G .716
+(eps the history in a \214le, which it accesses each time a command is sa).1 F
+-.15(ve)-.2 G 3.215(dt).15 G 3.215(oo)426.445 274.8 S 3.215(rr)439.66 274.8 S
+(etrie)449.535 274.8 Q -.15(ve)-.25 G 3.215(df).15 G(rom)487.89 274.8 Q .338
+(the history)72 286.8 R 5.338(.K)-.65 G .338
+(sh history \214les may be shared among dif)129.246 286.8 R .338
+(ferent concurrent instances of ksh, which could be a)-.25 F
+(bene\214t to the user)72 298.8 Q(.)-.55 E F1 2.5(5. F)72 322.8 R(eatur)-.25 E
+(es in Bash-2.0)-.18 E F0 .657(The ne)97 338.4 R .657
+(xt release of bash, 2.0, will be a major o)-.15 F -.15(ve)-.15 G 3.157
+(rhaul. It).15 F .656(will include man)3.157 F 3.156(yn)-.15 G 1.156 -.25(ew f)
+419.532 338.4 T .656(eatures, for both).25 F .705(programming and interacti)72
+350.4 R 1.005 -.15(ve u)-.25 H 3.205(se. Redundant).15 F -.15(ex)3.205 G .705
+(isting functions will be remo).15 F -.15(ve)-.15 G 3.206(d. There).15 F .706
+(are se)3.206 F -.15(ve)-.25 G .706(ral cases).15 F 1.34(where bash treats a v)
+72 362.4 R 1.34(ariable specially to enable functionality a)-.25 F -.25(va)-.2
+G 1.34(ilable another w).25 F 1.34(ay \()-.1 F F1($nolinks)A F0(vs.)3.84 E F1
+1.34(set -o)3.84 F(ph)72 374.4 Q(ysical)-.15 E F0 2.5(,f)C(or e)115.19 374.4 Q
+(xample\); the special treatment of the v)-.15 E(ariable name will be remo)-.25
+E -.15(ve)-.15 G(d.).15 E F1 2.5(5.1. Arrays)72 398.4 R F0 .546(Bash-2.0 will \
+include arrays which are a superset of those in ksh, with the size limitations\
+ remo)97 414 R -.15(ve)-.15 G(d.).15 E(The)72 426 Q F1(declar)3.086 E(e)-.18 E
+F0(,)A F1 -.18(re)3.086 G(adonly).18 E F0 3.086(,a)C(nd)174.768 426 Q F1
+(export)3.086 E F0 -.2(bu)3.086 G .586
+(iltins will accept options to specify arrays, and the).2 F F1 -.18(re)3.085 G
+(ad).18 E F0 -.2(bu)3.085 G .585(iltin will).2 F(ha)72 438 Q .81 -.15(ve a)-.2
+H 3.01(no).15 G .51(ption to read a list of w)110.99 438 R .51
+(ords and assign them directly to an array)-.1 F 5.51(.T)-.65 G .51
+(here will also be a ne)386.23 438 R 3.01(wa)-.25 G(rray)487.9 438 Q F2 .262
+(compound assignment)72 450 R F0 .262(syntax a)2.762 F -.25(va)-.2 G .262
+(ilable for assignment statements and the).25 F F1(declar)2.761 E(e)-.18 E F0
+-.2(bu)2.761 G 2.761(iltin. This).2 F(ne)2.761 E 2.761(ws)-.25 G(yntax)481.78
+450 Q .441(has the form)72 462 R F2(name)2.941 E F0(=\()A F2(value1)A F0(...)
+2.941 E F2(valueN)2.941 E F0 .441(\), where each)B F2(value)2.942 E F0 .442
+(has the form [)4.608 F F2(subscript)A F0(]=)A F2(string)A F0 5.442(.O)C .442
+(nly the)449.776 462 R F2(string)2.942 E F0 1.395(is required.)72 474 R 1.395
+(If the optional brack)6.395 F 1.395(ets and)-.1 F F2(subscript)3.894 E F0
+1.394(are included, that inde)3.894 F 3.894(xi)-.15 G 3.894(sa)388.714 474 S
+1.394(ssigned to, otherwise the)400.938 474 R(inde)72 486 Q 3.656(xo)-.15 G
+3.656(ft)102.726 486 S 1.156(he element assigned is the last inde)112.492 486 R
+3.657(xa)-.15 G 1.157(ssigned to by the statement plus one.)272.917 486 R(Inde)
+6.157 E 1.157(xing starts at)-.15 F 2.73(zero. The)72 498 R .23
+(same syntax is accepted by)2.73 F F1(declar)2.73 E(e)-.18 E F0 5.229(.I)C(ndi)
+269.159 498 Q .229(vidual array elements may be assigned to using the ksh)-.25
+F F2(name)72 510 Q F0([)A F2(subscript)A F0(]=)A F2(value)A F0(.)A F1 2.5
+(5.2. Dynamic)72 534 R(Loading)2.5 E F0 .348(On systems that support the)97
+549.6 R F2(dlopen)2.848 E F0 .349(\(3\) library function, bash-2.0 will allo)B
+2.849(wn)-.25 G .849 -.25(ew b)407.504 549.6 T .349(uiltins to be loaded).05 F
+.049(into a running shell from a shared object \214le.)72 561.6 R .049(The ne)
+5.049 F 2.549(wb)-.25 G .049(uiltins will ha)298.999 561.6 R .348 -.15(ve a)-.2
+H .048(ccess to the rest of the shell f).15 F(acil-)-.1 E .649(ities, b)72
+573.6 R .649(ut programmers will be subject to a fe)-.2 F 3.149(ws)-.25 G .649
+(tructural rules.)269.591 573.6 R .65(This will be pro)5.65 F .65
+(vided via a ne)-.15 F 3.15(wo)-.25 G .65(ption to)472.51 573.6 R F1(enable)72
+585.6 Q F0(.)A F1 2.5(5.3. Builtins)72 609.6 R F0 .889(Some of the e)97 625.2 R
+.889(xisting b)-.15 F .889(uiltins will change in bash-2.0.)-.2 F .888(As pre)
+5.888 F .888(viously noted,)-.25 F F1(declar)3.388 E(e)-.18 E F0(,)A F1(export)
+3.388 E F0(,)A F1 -.18(re)3.388 G(ad-).18 E(only)72 637.2 Q F0 2.873(,a)C(nd)
+100.153 637.2 Q F1 -.18(re)2.873 G(ad).18 E F0 .373(will accept ne)2.873 F
+2.873(wo)-.25 G .374(ptions to specify arrays.)206.288 637.2 R(The)5.374 E F1
+(jobs)2.874 E F0 -.2(bu)2.874 G .374(iltin will be able to list only stopped).2
+F .323(or running jobs.)72 649.2 R(The)5.322 E F1(enable)2.822 E F0 .322
+(command will tak)2.822 F 2.822(ean)-.1 G -.25(ew)282.84 649.2 S F1<ad73>3.072
+E F0 .322(option to restrict its actions to the POSIX.2)2.822 F F2(spe-)2.822 E
+(cial)72 661.2 Q F0 -.2(bu)3.14 G(iltins.).2 E F1(Kill)5.64 E F0 .64
+(will be able to list signal numbers corresponding to indi)3.14 F .64
+(vidual signal names.)-.25 F .64(The read-)5.64 F .703(line library interf)72
+673.2 R(ace,)-.1 E F1(bind)3.203 E F0 3.203(,w)C .703(ill ha)193.032 673.2 R
+1.003 -.15(ve a)-.2 H 3.203(no).15 G .703(ption to remo)243.951 673.2 R 1.003
+-.15(ve t)-.15 H .703(he binding for an).15 F 3.203(yk)-.15 G 1.002 -.15(ey s)
+398.032 673.2 T .702(equence \(which is not).15 F
+(the same as binding it to self-insert\).)72 685.2 Q .494(There will be tw)97
+700.8 R 2.994(on)-.1 G .994 -.25(ew b)177.196 700.8 T .495
+(uiltin commands in bash-2.0.).05 F(The)5.495 E F1(diso)2.995 E(wn)-.1 E F0
+.495(command will remo)2.995 F .795 -.15(ve j)-.15 H .495(obs from).15 F(bash')
+72 712.8 Q 3.445(si)-.55 G .945(nternal jobs table when job control is acti)
+103.225 712.8 R -.15(ve)-.25 G 5.945(.A).15 G(diso)303.25 712.8 Q .944
+(wned job will not be listed by the jobs com-)-.25 F .666(mand, nor will its e)
+72 724.8 R .666(xit status be reported.)-.15 F(Diso)5.667 E .667
+(wned jobs will not be sent a)-.25 F F1(SIGHUP)3.167 E F0 .667
+(when an interacti)3.167 F -.15(ve)-.25 G EP
+%%Page: 12 12
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-1)277.17 48 S 2.5(2-)288 48 S .688(shell e)72 84 R
+3.187(xits. Most)-.15 F .687(of the shell')3.187 F 3.187(so)-.55 G .687
+(ptional or)205.423 84 R/F1 10/Times-Italic@0 SF(to)3.187 E -.1(gg)-.1 G(led).1
+E F0 .687(functionality will be folded into the ne)3.187 F(w)-.25 E/F2 10
+/Times-Bold@0 SF(shopt)3.187 E F0 -.2(bu)3.187 G(iltin.).2 E(Man)72 96 Q 3.714
+(yo)-.15 G 3.714(ft)103.894 96 S 1.214(he v)113.718 96 R 1.214
+(ariables which alter the shell')-.25 F 3.714(sb)-.55 G(eha)266.282 96 Q 1.214
+(vior when set \(re)-.2 F -.05(ga)-.15 G 1.214(rdless of their v).05 F 1.215
+(alue\) will be made)-.25 F 6(options settable with)72 108 R F2(shopt)8.5 E F0
+11(.E)C 6(xamples of such v)218.23 108 R 6(ariables include)-.25 F F2(allo)8.5
+E(w_null_glob_expansion)-.1 E F0(,)A F2(glob_dot_\214lenames)72 120 Q F0 2.5
+(,a)C(nd)163.67 120 Q F2(MAIL_W)2.5 E(ARNING)-1.2 E F0(.)A F2 2.5(5.4. V)72 144
+R(ariables and V)-.92 E(ariable Expansion)-.92 E F0 .047
+(Bash-2.0 will implement se)97 159.6 R -.15(ve)-.25 G .048(ral ne).15 F 2.548
+(wv)-.25 G .048(ariable e)252.988 159.6 R 2.548(xpansions. These)-.15 F .048
+(will answer se)2.548 F -.15(ve)-.25 G .048(ral of the most per).15 F(-)-.2 E
+.213(sistant requests for ne)72 171.6 R 2.713(wf)-.25 G 2.713(eatures. It)
+172.582 171.6 R .213(will be possible to `)2.713 F .212(`indirectly reference')
+-.74 F 2.712('av)-.74 G .212(ariable with an e)398.534 171.6 R(xpansion,)-.15 E
+(lik)72 183.6 Q 3.01(eu)-.1 G(sing)94.91 183.6 Q/F3 10/Courier@0 SF .51
+(eval \\$${name})3.01 F F0 .51(to reference a v)3.01 F .51(ariable named by)
+-.25 F F3(${name})3.01 E F0 5.51(.E)C .51(xpansions will be a)394.32 183.6 R
+-.25(va)-.2 G(ilable).25 E .462(to retrie)72 195.6 R .762 -.15(ve s)-.25 H .462
+(ubstrings of v).15 F .461(ariables in an)-.25 F F1(awk)2.961 E F0(-lik)A 2.961
+(em)-.1 G .461(anner: starting at a speci\214c inde)277.692 195.6 R .461
+(x, retrie)-.15 F .461(ving some num-)-.25 F .941
+(ber of characters or the rest of the string.)72 207.6 R .941
+(It will be possible to retrie)5.941 F 1.241 -.15(ve s)-.25 H .941
+(equences of array elements lik).15 F(e)-.1 E .354(this, too.)72 219.6 R .354
+(It w)5.354 F .354(ould be nice to ha)-.1 F .654 -.15(ve a w)-.2 H .354
+(ay to replace portions of a v).05 F .353
+(ariable matching a pattern the same w)-.25 F(ay)-.1 E(leading or trailing sub\
+strings are presently stripped; that capability may be a)72 231.6 Q -.25(va)-.2
+G(ilable.).25 E .453(Another ne)97 247.2 R 2.953(we)-.25 G .453
+(xpansion will pro)156.376 247.2 R .453(vide a w)-.15 F .454
+(ay to create strings containing arbitrary characters, which is)-.1 F(incon)72
+259.2 Q -.15(ve)-.4 G 1.636(nient in the current v).15 F 4.136(ersion. W)-.15 F
+1.635(ords of the form $')-.8 F F1(string)A F0 4.135('w)C 1.635(ill e)355.145
+259.2 R 1.635(xpand to)-.15 F F1(string)4.135 E F0 1.635(with backslash-)4.135
+F 1.231(escaped characters in)72 271.2 R F1(string)3.731 E F0 1.231
+(replaced as speci\214ed by the ANSI C standard.)3.731 F 1.232
+(As with other single-quoted)6.232 F
+(shell strings, the only character that may not appear in)72 283.2 Q F1(string)
+2.5 E F0(is a single quote.)2.5 E 1.436(The shell v)97 298.8 R 1.436
+(ariables will change also.)-.25 F 3.936(An)6.436 G 1.936 -.25(ew va)272.052
+298.8 T(riable).25 E F2(HISTIGNORE)3.936 E F0 1.435(will supersede)3.936 F F2
+(HISTCON-)3.935 E(TR)72 310.8 Q(OL)-.3 E F0(.)A F2(HISTIGNORE)5.327 E F0 .327
+(is the history analogy of)2.827 F F2(FIGNORE)2.828 E F0 2.828(:ac)C .328
+(olon-separated list of patterns specifying)339.938 310.8 R 1.082
+(commands to omit from the history list.)72 322.8 R 1.081
+(The special pattern '&' will match the pre)6.081 F 1.081
+(vious history line, to)-.25 F(pro)72 334.8 Q 1.568(vide the)-.15 F F2
+(HISTCONTR)4.068 E(OL)-.3 E F1(ignor)4.068 E(edups)-.37 E F0(beha)5.734 E(vior)
+-.2 E 6.568(.M)-.55 G(an)303.546 334.8 Q 4.069(yv)-.15 G 1.569
+(ariables which modify the shell')326.655 334.8 R 4.069(sb)-.55 G(eha)474.21
+334.8 Q(vior)-.2 E .395(will lose their special meaning.)72 346.8 R -1.11(Va)
+5.395 G .395(riables such as)1.11 F F2(notify)2.895 E F0(and)2.895 E F2(noclob)
+2.895 E(ber)-.1 E F0 .395(which pro)2.895 F .395(vide functionality a)-.15 F
+-.25(va)-.2 G(il-).25 E .931
+(able via other mechanisms will no longer be treated specially)72 358.8 R 5.931
+(.O)-.65 G .931(ther v)340.06 358.8 R .932(ariables will be folded into)-.25 F
+F2(shopt)3.432 E F0(.)A(The)72 370.8 Q F2(history_contr)5.519 E(ol)-.18 E F0
+(and)5.519 E F2(hostname_completion_\214le)5.519 E F0 -.25(va)5.519 G 3.019
+(riables, superseded by).25 F F2(HISTCONTR)5.518 E(OL)-.3 E F0(and)5.518 E F2
+(HOSTFILE)72 382.8 Q F0(respecti)2.5 E -.15(ve)-.25 G(ly).15 E 2.5(,w)-.65 G
+(ill be remo)185.12 382.8 Q -.15(ve)-.15 G(d.).15 E F2 2.5(5.5. Readline)72
+406.8 R F0(Naturally)97 422.4 Q 2.94(,t)-.65 G .44(here will be impro)142.34
+422.4 R -.15(ve)-.15 G .441(ments to readline as well.).15 F .441
+(All of the POSIX.2)5.441 F F1(vi)2.941 E F0 .441(-mode editing com-)B .33
+(mands will be implemented; missing commands lik)72 434.4 R 2.829(e`)-.1 G .329
+(m' to sa)290.599 434.4 R .629 -.15(ve t)-.2 H .329
+(he current cursor position \().15 F F1(mark)A F0 2.829(\)a)C .329(nd the)
+478.951 434.4 R .36(`@' command for macro e)72 446.4 R .36(xpansion will be a)
+-.15 F -.25(va)-.2 G 2.861(ilable. The).25 F .361
+(ability to set the mark and e)2.861 F .361(xchange the current)-.15 F .764
+(cursor position \()72 458.4 R F1(point)A F0 3.264(\)a)C .764
+(nd mark will be added to the readline emacs mode as well.)170.672 458.4 R .763
+(Since there are com-)5.764 F .196
+(mands to set the mark, commands to manipulate the re)72 470.4 R .197
+(gion \(the characters between the point and the mark\))-.15 F .111(will be a)
+72 482.4 R -.25(va)-.2 G 2.611(ilable. Commands).25 F(ha)2.611 E .411 -.15
+(ve b)-.2 H .11
+(een added to the readline emacs mode for more complete ksh compati-).15 F
+(bility)72 494.4 Q 2.5(,s)-.65 G(uch as the C-])101.36 494.4 Q F1(c)A F0
+(character search command.)2.5 E F2 2.5(5.6. Con\214guration)72 518.4 R F0 .318
+(Bash w)97 534 R .318
+(as the \214rst GNU program to completely autocon\214gure.)-.1 F .319
+(Its autocon\214guration mechanism pre-)5.319 F(dates)72 546 Q F1(autoconf)4.07
+E F0 4.07(,t)C 1.569
+(he current GNU con\214guration program, and needs updating.)140.97 546 R 1.569
+(Bash-2.0 may include an)6.569 F .603
+(autoconf-based con\214guration script, if necessary ne)72 558 R 3.103(wf)-.25
+G .603(unctionality can be added to autoconf, or its limita-)294.476 558 R
+(tions bypassed.)72 570 Q F2 2.5(5.7. Miscellaneous)72 594 R F0 1.632
+(The POSIX mode will be impro)97 609.6 R -.15(ve)-.15 G 4.131(di).15 G 4.131
+(nb)254.26 609.6 S 1.631(ash-2.0; it will pro)268.391 609.6 R 1.631
+(vide a more complete superset of the)-.15 F(POSIX standard.)72 621.6 Q -.15
+(Fo)5 G 2.5(rt).15 G(he \214rst time, bash will recognize the e)163.79 621.6 Q
+(xistance of the POSIX.2)-.15 E F1(special)2.5 E F0 -.2(bu)2.5 G(iltins.).2 E
+2.627(An)97 637.2 S .627 -.25(ew t)111.847 637.2 T .127(rap v).25 F(alue,)-.25
+E F2(DEB)2.627 E(UG)-.1 E F0 2.627(,w)C .128(ill be present, as in ksh.)218.405
+637.2 R .128(Commands speci\214ed with a)5.128 F F2(DEB)2.628 E(UG)-.1 E F0
+.128(trap will)2.628 F 1.908(be e)72 649.2 R -.15(xe)-.15 G 1.908
+(cuted after e).15 F -.15(ve)-.25 G 1.908(ry simple command.).15 F 1.908
+(Since this mak)6.908 F 1.908(es shell script deb)-.1 F 1.908
+(uggers possible, I hope to)-.2 F(include a bash deb)72 661.2 Q
+(ugger in the bash-2.0 release.)-.2 E F2 2.5(6. A)72 685.2 R -.1(va)-1 G
+(ilability).1 E F0 5.997(The current v)97 700.8 R 5.997(ersion of bash is a)
+-.15 F -.25(va)-.2 G 5.998(ilable for anon).25 F 5.998
+(ymous FTP from prep.ai.mit.edu as)-.15 F F1(/pub/gnu/bash-1.14.2.tar)72 712.8
+Q(.gz)-1.11 E F0(.)1.666 E EP
+%%Page: 13 13
+%%BeginPageSetup
+BP
+%%EndPageSetup
+/F0 10/Times-Roman@0 SF 2.5(-1)277.17 48 S 2.5(3-)288 48 S/F1 10/Times-Bold@0
+SF 2.5(7. Conclusion)72 84 R F0 .755(This paper has presented an o)97 99.6 R
+-.15(ve)-.15 G(rvie).15 E 3.255(wo)-.25 G 3.255(fb)259.27 99.6 S .755
+(ash, compared its features with those of other shells, and)270.855 99.6 R
+(hinted at features in the ne)72 111.6 Q(xt release, bash-2.0.)-.15 E .483
+(Bash is a solid replacement for sh.)97 127.2 R .483(It is suf)5.483 F .483
+(\214ciently portable to run on nearly e)-.25 F -.15(ve)-.25 G .484(ry v).15 F
+.484(ersion of)-.15 F/F2 9/Times-Roman@0 SF(UNIX)2.984 E F0 .514
+(from 4.3 BSD to SVR4.2, and se)72 139.2 R -.15(ve)-.25 G(ral).15 E F2(UNIX)
+3.013 E F0 -.1(wo)3.013 G(rkalik).1 E .513(es, and rob)-.1 F .513
+(ust enough to replace sh on most of those)-.2 F .771(systems, It is v)72 151.2
+R .771(ery close to POSIX.2-conformant in POSIX mode, and is getting f)-.15 F
+(aster)-.1 E 5.771(.I)-.55 G 3.272(ti)436.684 151.2 S 3.272(sn)445.516 151.2 S
+.772(ot, unfortu-)457.678 151.2 R(nately)72 163.2 Q 2.663(,g)-.65 G .163
+(etting smaller)105.953 163.2 R 2.663(,b)-.4 G .163(ut there are man)170.399
+163.2 R 2.663(yo)-.15 G .163(ptional features.)248.101 163.2 R .163(It is v)
+5.163 F .162(ery easy to b)-.15 F .162(uild a small subset to use as)-.2 F 2.5
+(ad)72 175.2 S(irect replacement for /bin/sh.)83.94 175.2 Q .909
+(Bash has thousands of users w)97 190.8 R .909(orldwide, all of whom ha)-.1 F
+1.209 -.15(ve h)-.2 H .91(elped to mak).15 F 3.41(ei)-.1 G 3.41(tb)409.34 190.8
+S(etter)420.53 190.8 Q 5.91(.A)-.55 G .91(nother testa-)453.38 190.8 R
+(ment to the bene\214ts of free softw)72 202.8 Q(are.)-.1 E F1 2.5(8. Refer)72
+226.8 R(ences)-.18 E F0 .432([1] S. R. Bourne, `)72 242.4 R .432(`UNIX T)-.74 F
+.432(ime-Sharing System:)-.35 F .431(The UNIX Shell')5.431 F(',)-.74 E/F3 10
+/Times-Italic@0 SF .431(Bell System T)2.931 F(ec)-.92 E .431(hnical J)-.15 F
+(ournal)-.25 E F0 2.931(,5)C(7\(6\),)484.84 242.4 Q
+(July-August, 1978, pp. 1971-1990.)72 254.4 Q .736([2] Morris Bolsk)72 270 R
+3.237(ya)-.15 G .737(nd Da)153.22 270 R .737(vid K)-.2 F(orn,)-.35 E F3 .737
+(The K)3.237 F .737(ornShell Command and Pr)-.4 F -.1(og)-.45 G -.15(ra).1 G
+.737(mming Langua).15 F -.1(ge)-.1 G F0 3.237(,P).1 G .737(rentice Hall,)
+453.833 270 R(1989.)72 282 Q .142([3] Bill Jo)72 297.6 R 1.442 -.65(y, A)-.1 H
+2.642(nI).65 G .141(ntroduction to the C Shell,)140.428 297.6 R F3 .141
+(UNIX User')2.641 F 2.641(sS)-.4 G .141(upplementary Documents)309.346 297.6 R
+F0 2.641(,U)C(ni)424.328 297.6 Q -.15(ve)-.25 G .141(rsity of Califor).15 F(-)
+-.2 E(nia at Berk)72 309.6 Q(ele)-.1 E 1.3 -.65(y, 1)-.15 H(986.).65 E .283
+([4] IEEE,)72 325.2 R F3 .283(IEEE Standar)2.783 F 2.783(df)-.37 G .283
+(or Information T)179.692 325.2 R(ec)-.92 E(hnolo)-.15 E .283(gy -- P)-.1 F
+.283(ortable Oper)-.8 F .283(ating System Interface \(POSIX\) P)-.15 F(art)-.8
+E(2: Shell and Utilities)72 337.2 Q F0 2.5(,1)C(992.)165.06 337.2 Q F1 2.5
+(9. A)72 361.2 R(uthor Inf)-.5 E(ormation)-.25 E F0 .937(Chet Rame)97 376.8 R
+3.437(yi)-.15 G 3.437(sas)153.724 376.8 S(oftw)172.818 376.8 Q .936
+(are engineer w)-.1 F .936(orking at Case W)-.1 F .936(estern Reserv)-.8 F
+3.436(eU)-.15 G(ni)393.43 376.8 Q -.15(ve)-.25 G(rsity).15 E 5.936(.H)-.65 G
+3.436(eh)443.036 376.8 S .936(as a B.S. in)455.912 376.8 R .072
+(Computer Engineering and an M.S. in Computer Science, both from CWR)72 388.8 R
+2.573(U. He)-.4 F .073(has been w)2.573 F .073(orking on bash)-.1 F
+(for six years, and the primary maintainer for one.)72 400.8 Q EP
+%%Trailer
+end
+%%EOF
deleted file mode 100644 (file)
index 555a07707ab51cfc96be6d28d837654fbf287915..0000000000000000000000000000000000000000
+++ /dev/null
-% texinfo.tex -- TeX macros to handle Texinfo files.
-%
-% Load plain if necessary, i.e., if running under initex.
-\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
-%
-\def\texinfoversion{2003-02-03.16}
-%
-% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
-% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
-%
-% This texinfo.tex file 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 texinfo.tex file 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 texinfo.tex file; see the file COPYING.  If not, write
-% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-% Boston, MA 02111-1307, USA.
-%
-% In other words, you are welcome to use, share and improve this program.
-% You are forbidden to forbid anyone else to use, share and improve
-% what you give them.   Help stamp out software-hoarding!
-%
-% Please try the latest version of texinfo.tex before submitting bug
-% reports; you can get the latest version from:
-%   ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
-%     (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
-%   ftp://tug.org/tex/texinfo.tex
-%     (and all CTAN mirrors, see http://www.ctan.org),
-%   and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
-% 
-% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
-% 
-% The texinfo.tex in any given Texinfo distribution could well be out
-% of date, so if that's what you're using, please check.
-% 
-% Send bug reports to bug-texinfo@gnu.org.  Please include including a
-% complete document in each bug report with which we can reproduce the
-% problem.  Patches are, of course, greatly appreciated.
-%
-% To process a Texinfo manual with TeX, it's most reliable to use the
-% texi2dvi shell script that comes with the distribution.  For a simple
-% manual foo.texi, however, you can get away with this:
-%   tex foo.texi
-%   texindex foo.??
-%   tex foo.texi
-%   tex foo.texi
-%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
-% The extra TeX runs get the cross-reference information correct.
-% Sometimes one run after texindex suffices, and sometimes you need more
-% than two; texi2dvi does it as many times as necessary.
-% 
-% It is possible to adapt texinfo.tex for other languages, to some
-% extent.  You can get the existing language-specific files from the
-% full Texinfo distribution.
-
-\message{Loading texinfo [version \texinfoversion]:}
-
-% If in a .fmt file, print the version number
-% and turn on active characters that we couldn't do earlier because
-% they might have appeared in the input file name.
-\everyjob{\message{[Texinfo version \texinfoversion]}%
-  \catcode`+=\active \catcode`\_=\active}
-
-\message{Basics,}
-\chardef\other=12
-
-% We never want plain's outer \+ definition in Texinfo.
-% For @tex, we can use \tabalign.
-\let\+ = \relax
-
-% Save some parts of plain tex whose names we will redefine.
-\let\ptexb=\b
-\let\ptexbullet=\bullet
-\let\ptexc=\c
-\let\ptexcomma=\,
-\let\ptexdot=\.
-\let\ptexdots=\dots
-\let\ptexend=\end
-\let\ptexequiv=\equiv
-\let\ptexexclam=\!
-\let\ptexgtr=>
-\let\ptexhat=^
-\let\ptexi=\i
-\let\ptexlbrace=\{
-\let\ptexless=<
-\let\ptexplus=+
-\let\ptexrbrace=\}
-\let\ptexstar=\*
-\let\ptext=\t
-
-% If this character appears in an error message or help string, it
-% starts a new line in the output.
-\newlinechar = `^^J
-
-% Set up fixed words for English if not already set.
-\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
-\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
-\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
-\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
-\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
-\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
-\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
-\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
-\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
-\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
-\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
-\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
-\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
-\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
-\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
-\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
-\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
-\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
-\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
-%
-\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
-\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
-\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
-\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
-\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
-\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
-\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
-\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
-\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
-\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
-\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
-\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
-%
-\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
-\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
-\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
-\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
-\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
-\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
-\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
-
-% In some macros, we cannot use the `\? notation---the left quote is
-% in some cases the escape char.
-\chardef\colonChar = `\:
-\chardef\commaChar = `\,
-\chardef\dotChar   = `\.
-\chardef\equalChar = `\=
-\chardef\exclamChar= `\!
-\chardef\questChar = `\?
-\chardef\semiChar  = `\;
-\chardef\spaceChar = `\ %
-\chardef\underChar = `\_
-
-% Ignore a token.
-%
-\def\gobble#1{}
-
-% True if #1 is the empty string, i.e., called like `\ifempty{}'.
-%
-\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
-\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
-
-% Hyphenation fixes.
-\hyphenation{ap-pen-dix}
-\hyphenation{mini-buf-fer mini-buf-fers}
-\hyphenation{eshell}
-\hyphenation{white-space}
-
-% Margin to add to right of even pages, to left of odd pages.
-\newdimen\bindingoffset
-\newdimen\normaloffset
-\newdimen\pagewidth \newdimen\pageheight
-
-% Sometimes it is convenient to have everything in the transcript file
-% and nothing on the terminal.  We don't just call \tracingall here,
-% since that produces some useless output on the terminal.  We also make
-% some effort to order the tracing commands to reduce output in the log
-% file; cf. trace.sty in LaTeX.
-%
-\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
-\def\loggingall{%
-  \tracingstats2
-  \tracingpages1
-  \tracinglostchars2  % 2 gives us more in etex
-  \tracingparagraphs1
-  \tracingoutput1
-  \tracingmacros2
-  \tracingrestores1
-  \showboxbreadth\maxdimen \showboxdepth\maxdimen
-  \ifx\eTeXversion\undefined\else % etex gives us more logging
-    \tracingscantokens1
-    \tracingifs1
-    \tracinggroups1
-    \tracingnesting2
-    \tracingassigns1
-  \fi
-  \tracingcommands3  % 3 gives us more in etex
-  \errorcontextlines\maxdimen
-}%
-
-% add check for \lastpenalty to plain's definitions.  If the last thing
-% we did was a \nobreak, we don't want to insert more space.
-% 
-\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
-  \removelastskip\penalty-50\smallskip\fi\fi}
-\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
-  \removelastskip\penalty-100\medskip\fi\fi}
-\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
-  \removelastskip\penalty-200\bigskip\fi\fi}
-
-% For @cropmarks command.
-% Do @cropmarks to get crop marks.
-%
-\newif\ifcropmarks
-\let\cropmarks = \cropmarkstrue
-%
-% Dimensions to add cropmarks at corners.
-% Added by P. A. MacKay, 12 Nov. 1986
-%
-\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
-\newdimen\cornerlong  \cornerlong=1pc
-\newdimen\cornerthick \cornerthick=.3pt
-\newdimen\topandbottommargin \topandbottommargin=.75in
-
-% Main output routine.
-\chardef\PAGE = 255
-\output = {\onepageout{\pagecontents\PAGE}}
-
-\newbox\headlinebox
-\newbox\footlinebox
-
-% \onepageout takes a vbox as an argument.  Note that \pagecontents
-% does insertions, but you have to call it yourself.
-\def\onepageout#1{%
-  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
-  %
-  \ifodd\pageno  \advance\hoffset by \bindingoffset
-  \else \advance\hoffset by -\bindingoffset\fi
-  %
-  % Do this outside of the \shipout so @code etc. will be expanded in
-  % the headline as they should be, not taken literally (outputting ''code).
-  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
-  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
-  %
-  {%
-    % Have to do this stuff outside the \shipout because we want it to
-    % take effect in \write's, yet the group defined by the \vbox ends
-    % before the \shipout runs.
-    %
-    \escapechar = `\\     % use backslash in output files.
-    \indexdummies         % don't expand commands in the output.
-    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
-                   % the page break happens to be in the middle of an example.
-    \shipout\vbox{%
-      % Do this early so pdf references go to the beginning of the page.
-      \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
-      %
-      \ifcropmarks \vbox to \outervsize\bgroup
-        \hsize = \outerhsize
-        \vskip-\topandbottommargin
-        \vtop to0pt{%
-          \line{\ewtop\hfil\ewtop}%
-          \nointerlineskip
-          \line{%
-            \vbox{\moveleft\cornerthick\nstop}%
-            \hfill
-            \vbox{\moveright\cornerthick\nstop}%
-          }%
-          \vss}%
-        \vskip\topandbottommargin
-        \line\bgroup
-          \hfil % center the page within the outer (page) hsize.
-          \ifodd\pageno\hskip\bindingoffset\fi
-          \vbox\bgroup
-      \fi
-      %
-      \unvbox\headlinebox
-      \pagebody{#1}%
-      \ifdim\ht\footlinebox > 0pt
-        % Only leave this space if the footline is nonempty.
-        % (We lessened \vsize for it in \oddfootingxxx.)
-        % The \baselineskip=24pt in plain's \makefootline has no effect.
-        \vskip 2\baselineskip
-        \unvbox\footlinebox
-      \fi
-      %
-      \ifcropmarks
-          \egroup % end of \vbox\bgroup
-        \hfil\egroup % end of (centering) \line\bgroup
-        \vskip\topandbottommargin plus1fill minus1fill
-        \boxmaxdepth = \cornerthick
-        \vbox to0pt{\vss
-          \line{%
-            \vbox{\moveleft\cornerthick\nsbot}%
-            \hfill
-            \vbox{\moveright\cornerthick\nsbot}%
-          }%
-          \nointerlineskip
-          \line{\ewbot\hfil\ewbot}%
-        }%
-      \egroup % \vbox from first cropmarks clause
-      \fi
-    }% end of \shipout\vbox
-  }% end of group with \normalturnoffactive
-  \advancepageno
-  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
-}
-
-\newinsert\margin \dimen\margin=\maxdimen
-
-\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
-{\catcode`\@ =11
-\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
-% marginal hacks, juha@viisa.uucp (Juha Takala)
-\ifvoid\margin\else % marginal info is present
-  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
-\dimen@=\dp#1 \unvbox#1
-\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
-\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
-}
-
-% Here are the rules for the cropmarks.  Note that they are
-% offset so that the space between them is truly \outerhsize or \outervsize
-% (P. A. MacKay, 12 November, 1986)
-%
-\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
-\def\nstop{\vbox
-  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
-\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
-\def\nsbot{\vbox
-  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
-
-% Parse an argument, then pass it to #1.  The argument is the rest of
-% the input line (except we remove a trailing comment).  #1 should be a
-% macro which expects an ordinary undelimited TeX argument.
-%
-\def\parsearg#1{%
-  \let\next = #1%
-  \begingroup
-    \obeylines
-    \futurelet\temp\parseargx
-}
-
-% If the next token is an obeyed space (from an @example environment or
-% the like), remove it and recurse.  Otherwise, we're done.
-\def\parseargx{%
-  % \obeyedspace is defined far below, after the definition of \sepspaces.
-  \ifx\obeyedspace\temp
-    \expandafter\parseargdiscardspace
-  \else
-    \expandafter\parseargline
-  \fi
-}
-
-% Remove a single space (as the delimiter token to the macro call).
-{\obeyspaces %
- \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
-
-{\obeylines %
-  \gdef\parseargline#1^^M{%
-    \endgroup % End of the group started in \parsearg.
-    %
-    % First remove any @c comment, then any @comment.
-    % Result of each macro is put in \toks0.
-    \argremovec #1\c\relax %
-    \expandafter\argremovecomment \the\toks0 \comment\relax %
-    %
-    % Call the caller's macro, saved as \next in \parsearg.
-    \expandafter\next\expandafter{\the\toks0}%
-  }%
-}
-
-% Since all \c{,omment} does is throw away the argument, we can let TeX
-% do that for us.  The \relax here is matched by the \relax in the call
-% in \parseargline; it could be more or less anything, its purpose is
-% just to delimit the argument to the \c.
-\def\argremovec#1\c#2\relax{\toks0 = {#1}}
-\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
-
-% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
-%    @end itemize  @c foo
-% will have two active spaces as part of the argument with the
-% `itemize'.  Here we remove all active spaces from #1, and assign the
-% result to \toks0.
-%
-% This loses if there are any *other* active characters besides spaces
-% in the argument -- _ ^ +, for example -- since they get expanded.
-% Fortunately, Texinfo does not define any such commands.  (If it ever
-% does, the catcode of the characters in questionwill have to be changed
-% here.)  But this means we cannot call \removeactivespaces as part of
-% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
-% that \parsearg gets might well have any character at all in it.
-%
-\def\removeactivespaces#1{%
-  \begingroup
-    \ignoreactivespaces
-    \edef\temp{#1}%
-    \global\toks0 = \expandafter{\temp}%
-  \endgroup
-}
-
-% Change the active space to expand to nothing.
-%
-\begingroup
-  \obeyspaces
-  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
-\endgroup
-
-
-\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
-
-%% These are used to keep @begin/@end levels from running away
-%% Call \inENV within environments (after a \begingroup)
-\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
-\def\ENVcheck{%
-\ifENV\errmessage{Still within an environment; press RETURN to continue}
-\endgroup\fi} % This is not perfect, but it should reduce lossage
-
-% @begin foo  is the same as @foo, for now.
-\newhelp\EMsimple{Press RETURN to continue.}
-
-\outer\def\begin{\parsearg\beginxxx}
-
-\def\beginxxx #1{%
-\expandafter\ifx\csname #1\endcsname\relax
-{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
-\csname #1\endcsname\fi}
-
-% @end foo executes the definition of \Efoo.
-%
-\def\end{\parsearg\endxxx}
-\def\endxxx #1{%
-  \removeactivespaces{#1}%
-  \edef\endthing{\the\toks0}%
-  %
-  \expandafter\ifx\csname E\endthing\endcsname\relax
-    \expandafter\ifx\csname \endthing\endcsname\relax
-      % There's no \foo, i.e., no ``environment'' foo.
-      \errhelp = \EMsimple
-      \errmessage{Undefined command `@end \endthing'}%
-    \else
-      \unmatchedenderror\endthing
-    \fi
-  \else
-    % Everything's ok; the right environment has been started.
-    \csname E\endthing\endcsname
-  \fi
-}
-
-% There is an environment #1, but it hasn't been started.  Give an error.
-%
-\def\unmatchedenderror#1{%
-  \errhelp = \EMsimple
-  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
-}
-
-% Define the control sequence \E#1 to give an unmatched @end error.
-%
-\def\defineunmatchedend#1{%
-  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
-}
-
-
-%% Simple single-character @ commands
-
-% @@ prints an @
-% Kludge this until the fonts are right (grr).
-\def\@{{\tt\char64}}
-
-% This is turned off because it was never documented
-% and you can use @w{...} around a quote to suppress ligatures.
-%% Define @` and @' to be the same as ` and '
-%% but suppressing ligatures.
-%\def\`{{`}}
-%\def\'{{'}}
-
-% Used to generate quoted braces.
-\def\mylbrace {{\tt\char123}}
-\def\myrbrace {{\tt\char125}}
-\let\{=\mylbrace
-\let\}=\myrbrace
-\begingroup
-  % Definitions to produce \{ and \} commands for indices,
-  % and @{ and @} for the aux file.
-  \catcode`\{ = \other \catcode`\} = \other
-  \catcode`\[ = 1 \catcode`\] = 2
-  \catcode`\! = 0 \catcode`\\ = \other
-  !gdef!lbracecmd[\{]%
-  !gdef!rbracecmd[\}]%
-  !gdef!lbraceatcmd[@{]%
-  !gdef!rbraceatcmd[@}]%
-!endgroup
-
-% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
-% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
-\let\, = \c
-\let\dotaccent = \.
-\def\ringaccent#1{{\accent23 #1}}
-\let\tieaccent = \t
-\let\ubaraccent = \b
-\let\udotaccent = \d
-
-% Other special characters: @questiondown @exclamdown
-% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
-\def\questiondown{?`}
-\def\exclamdown{!`}
-
-% Dotless i and dotless j, used for accents.
-\def\imacro{i}
-\def\jmacro{j}
-\def\dotless#1{%
-  \def\temp{#1}%
-  \ifx\temp\imacro \ptexi
-  \else\ifx\temp\jmacro \j
-  \else \errmessage{@dotless can be used only with i or j}%
-  \fi\fi
-}
-
-% Be sure we're in horizontal mode when doing a tie, since we make space
-% equivalent to this in @example-like environments. Otherwise, a space
-% at the beginning of a line will start with \penalty -- and
-% since \penalty is valid in vertical mode, we'd end up putting the
-% penalty on the vertical list instead of in the new paragraph.
-{\catcode`@ = 11
- % Avoid using \@M directly, because that causes trouble
- % if the definition is written into an index file.
- \global\let\tiepenalty = \@M
- \gdef\tie{\leavevmode\penalty\tiepenalty\ }
-}
-
-% @: forces normal size whitespace following.
-\def\:{\spacefactor=1000 }
-
-% @* forces a line break.
-\def\*{\hfil\break\hbox{}\ignorespaces}
-
-% @. is an end-of-sentence period.
-\def\.{.\spacefactor=3000 }
-
-% @! is an end-of-sentence bang.
-\def\!{!\spacefactor=3000 }
-
-% @? is an end-of-sentence query.
-\def\?{?\spacefactor=3000 }
-
-% @w prevents a word break.  Without the \leavevmode, @w at the
-% beginning of a paragraph, when TeX is still in vertical mode, would
-% produce a whole line of output instead of starting the paragraph.
-\def\w#1{\leavevmode\hbox{#1}}
-
-% @group ... @end group forces ... to be all on one page, by enclosing
-% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
-% to keep its height that of a normal line.  According to the rules for
-% \topskip (p.114 of the TeXbook), the glue inserted is
-% max (\topskip - \ht (first item), 0).  If that height is large,
-% therefore, no glue is inserted, and the space between the headline and
-% the text is small, which looks bad.
-%
-% Another complication is that the group might be very large.  This can
-% cause the glue on the previous page to be unduly stretched, because it
-% does not have much material.  In this case, it's better to add an
-% explicit \vfill so that the extra space is at the bottom.  The
-% threshold for doing this is if the group is more than \vfilllimit
-% percent of a page (\vfilllimit can be changed inside of @tex).
-% 
-\newbox\groupbox
-\def\vfilllimit{0.7}
-%
-\def\group{\begingroup
-  \ifnum\catcode13=\active \else
-    \errhelp = \groupinvalidhelp
-    \errmessage{@group invalid in context where filling is enabled}%
-  \fi
-  %
-  % The \vtop we start below produces a box with normal height and large
-  % depth; thus, TeX puts \baselineskip glue before it, and (when the
-  % next line of text is done) \lineskip glue after it.  (See p.82 of
-  % the TeXbook.)  Thus, space below is not quite equal to space
-  % above.  But it's pretty close.
-  \def\Egroup{%
-    \egroup           % End the \vtop.
-    % \dimen0 is the vertical size of the group's box.
-    \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
-    % \dimen2 is how much space is left on the page (more or less).
-    \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
-    % if the group doesn't fit on the current page, and it's a big big
-    % group, force a page break.
-    \ifdim \dimen0 > \dimen2
-      \ifdim \pagetotal < \vfilllimit\pageheight
-        \page
-      \fi
-    \fi
-    \copy\groupbox
-    \endgroup         % End the \group.
-  }%
-  %
-  \setbox\groupbox = \vtop\bgroup
-    % We have to put a strut on the last line in case the @group is in
-    % the midst of an example, rather than completely enclosing it.
-    % Otherwise, the interline space between the last line of the group
-    % and the first line afterwards is too small.  But we can't put the
-    % strut in \Egroup, since there it would be on a line by itself.
-    % Hence this just inserts a strut at the beginning of each line.
-    \everypar = {\strut}%
-    %
-    % Since we have a strut on every line, we don't need any of TeX's
-    % normal interline spacing.
-    \offinterlineskip
-    %
-    % OK, but now we have to do something about blank
-    % lines in the input in @example-like environments, which normally
-    % just turn into \lisppar, which will insert no space now that we've
-    % turned off the interline space.  Simplest is to make them be an
-    % empty paragraph.
-    \ifx\par\lisppar
-      \edef\par{\leavevmode \par}%
-      %
-      % Reset ^^M's definition to new definition of \par.
-      \obeylines
-    \fi
-    %
-    % Do @comment since we are called inside an environment such as
-    % @example, where each end-of-line in the input causes an
-    % end-of-line in the output.  We don't want the end-of-line after
-    % the `@group' to put extra space in the output.  Since @group
-    % should appear on a line by itself (according to the Texinfo
-    % manual), we don't worry about eating any user text.
-    \comment
-}
-%
-% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
-% message, so this ends up printing `@group can only ...'.
-%
-\newhelp\groupinvalidhelp{%
-group can only be used in environments such as @example,^^J%
-where each line of input produces a line of output.}
-
-% @need space-in-mils
-% forces a page break if there is not space-in-mils remaining.
-
-\newdimen\mil  \mil=0.001in
-
-\def\need{\parsearg\needx}
-
-% Old definition--didn't work.
-%\def\needx #1{\par %
-%% This method tries to make TeX break the page naturally
-%% if the depth of the box does not fit.
-%{\baselineskip=0pt%
-%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
-%\prevdepth=-1000pt
-%}}
-
-\def\needx#1{%
-  % Ensure vertical mode, so we don't make a big box in the middle of a
-  % paragraph.
-  \par
-  %
-  % If the @need value is less than one line space, it's useless.
-  \dimen0 = #1\mil
-  \dimen2 = \ht\strutbox
-  \advance\dimen2 by \dp\strutbox
-  \ifdim\dimen0 > \dimen2
-    %
-    % Do a \strut just to make the height of this box be normal, so the
-    % normal leading is inserted relative to the preceding line.
-    % And a page break here is fine.
-    \vtop to #1\mil{\strut\vfil}%
-    %
-    % TeX does not even consider page breaks if a penalty added to the
-    % main vertical list is 10000 or more.  But in order to see if the
-    % empty box we just added fits on the page, we must make it consider
-    % page breaks.  On the other hand, we don't want to actually break the
-    % page after the empty box.  So we use a penalty of 9999.
-    %
-    % There is an extremely small chance that TeX will actually break the
-    % page at this \penalty, if there are no other feasible breakpoints in
-    % sight.  (If the user is using lots of big @group commands, which
-    % almost-but-not-quite fill up a page, TeX will have a hard time doing
-    % good page breaking, for example.)  However, I could not construct an
-    % example where a page broke at this \penalty; if it happens in a real
-    % document, then we can reconsider our strategy.
-    \penalty9999
-    %
-    % Back up by the size of the box, whether we did a page break or not.
-    \kern -#1\mil
-    %
-    % Do not allow a page break right after this kern.
-    \nobreak
-  \fi
-}
-
-% @br   forces paragraph break
-
-\let\br = \par
-
-% @dots{} output an ellipsis using the current font.
-% We do .5em per period so that it has the same spacing in a typewriter
-% font as three actual period characters.
-%
-\def\dots{%
-  \leavevmode
-  \hbox to 1.5em{%
-    \hskip 0pt plus 0.25fil minus 0.25fil
-    .\hss.\hss.%
-    \hskip 0pt plus 0.5fil minus 0.5fil
-  }%
-}
-
-% @enddots{} is an end-of-sentence ellipsis.
-%
-\def\enddots{%
-  \leavevmode
-  \hbox to 2em{%
-    \hskip 0pt plus 0.25fil minus 0.25fil
-    .\hss.\hss.\hss.%
-    \hskip 0pt plus 0.5fil minus 0.5fil
-  }%
-  \spacefactor=3000
-}
-
-
-% @page    forces the start of a new page
-%
-\def\page{\par\vfill\supereject}
-
-% @exdent text....
-% outputs text on separate line in roman font, starting at standard page margin
-
-% This records the amount of indent in the innermost environment.
-% That's how much \exdent should take out.
-\newskip\exdentamount
-
-% This defn is used inside fill environments such as @defun.
-\def\exdent{\parsearg\exdentyyy}
-\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
-
-% This defn is used inside nofill environments such as @example.
-\def\nofillexdent{\parsearg\nofillexdentyyy}
-\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
-\leftline{\hskip\leftskip{\rm#1}}}}
-
-% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
-% paragraph.  For more general purposes, use the \margin insertion
-% class.  WHICH is `l' or `r'.
-%
-\newskip\inmarginspacing \inmarginspacing=1cm
-\def\strutdepth{\dp\strutbox}
-%
-\def\doinmargin#1#2{\strut\vadjust{%
-  \nobreak
-  \kern-\strutdepth
-  \vtop to \strutdepth{%
-    \baselineskip=\strutdepth
-    \vss
-    % if you have multiple lines of stuff to put here, you'll need to
-    % make the vbox yourself of the appropriate size.
-    \ifx#1l%
-      \llap{\ignorespaces #2\hskip\inmarginspacing}%
-    \else
-      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
-    \fi
-    \null
-  }%
-}}
-\def\inleftmargin{\doinmargin l}
-\def\inrightmargin{\doinmargin r}
-%
-% @inmargin{TEXT [, RIGHT-TEXT]}
-% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
-% else use TEXT for both).
-% 
-\def\inmargin#1{\parseinmargin #1,,\finish}
-\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
-  \setbox0 = \hbox{\ignorespaces #2}% 
-  \ifdim\wd0 > 0pt
-    \def\lefttext{#1}%  have both texts
-    \def\righttext{#2}%
-  \else
-    \def\lefttext{#1}%  have only one text
-    \def\righttext{#1}%
-  \fi
-  %
-  \ifodd\pageno
-    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
-  \else
-    \def\temp{\inleftmargin\lefttext}%
-  \fi
-  \temp
-}
-
-% @include file    insert text of that file as input.
-% Allow normal characters that  we make active in the argument (a file name).
-\def\include{\begingroup
-  \catcode`\\=\other
-  \catcode`~=\other
-  \catcode`^=\other
-  \catcode`_=\other
-  \catcode`|=\other
-  \catcode`<=\other
-  \catcode`>=\other
-  \catcode`+=\other
-  \parsearg\includezzz}
-% Restore active chars for included file.
-\def\includezzz#1{\endgroup\begingroup
-  % Read the included file in a group so nested @include's work.
-  \def\thisfile{#1}%
-  \let\value=\expandablevalue
-  \input\thisfile
-\endgroup}
-
-\def\thisfile{}
-
-% @center line
-% outputs that line, centered.
-%
-\def\center{\parsearg\docenter}
-\def\docenter#1{{%
-  \ifhmode \hfil\break \fi
-  \advance\hsize by -\leftskip
-  \advance\hsize by -\rightskip
-  \line{\hfil \ignorespaces#1\unskip \hfil}%
-  \ifhmode \break \fi
-}}
-
-% @sp n   outputs n lines of vertical space
-
-\def\sp{\parsearg\spxxx}
-\def\spxxx #1{\vskip #1\baselineskip}
-
-% @comment ...line which is ignored...
-% @c is the same as @comment
-% @ignore ... @end ignore  is another way to write a comment
-
-\def\comment{\begingroup \catcode`\^^M=\other%
-\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
-\commentxxx}
-{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
-
-\let\c=\comment
-
-% @paragraphindent NCHARS
-% We'll use ems for NCHARS, close enough.
-% We cannot implement @paragraphindent asis, though.
-% 
-\def\asisword{asis} % no translation, these are keywords
-\def\noneword{none}
-%
-\def\paragraphindent{\parsearg\doparagraphindent}
-\def\doparagraphindent#1{%
-  \def\temp{#1}%
-  \ifx\temp\asisword
-  \else
-    \ifx\temp\noneword
-      \defaultparindent = 0pt
-    \else
-      \defaultparindent = #1em
-    \fi
-  \fi
-  \parindent = \defaultparindent
-}
-
-% @exampleindent NCHARS
-% We'll use ems for NCHARS like @paragraphindent.
-% It seems @exampleindent asis isn't necessary, but
-% I preserve it to make it similar to @paragraphindent.
-\def\exampleindent{\parsearg\doexampleindent}
-\def\doexampleindent#1{%
-  \def\temp{#1}%
-  \ifx\temp\asisword
-  \else
-    \ifx\temp\noneword
-      \lispnarrowing = 0pt
-    \else
-      \lispnarrowing = #1em
-    \fi
-  \fi
-}
-
-% @asis just yields its argument.  Used with @table, for example.
-%
-\def\asis#1{#1}
-
-% @math outputs its argument in math mode.
-% We don't use $'s directly in the definition of \math because we need
-% to set catcodes according to plain TeX first, to allow for subscripts,
-% superscripts, special math chars, etc.
-% 
-\let\implicitmath = $%$ font-lock fix
-%
-% One complication: _ usually means subscripts, but it could also mean
-% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
-% _ within @math be active (mathcode "8000), and distinguish by seeing
-% if the current family is \slfam, which is what @var uses.
-% 
-{\catcode\underChar = \active
-\gdef\mathunderscore{%
-  \catcode\underChar=\active
-  \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
-}}
-%
-% Another complication: we want \\ (and @\) to output a \ character.
-% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
-% this is not advertised and we don't care.  Texinfo does not
-% otherwise define @\.
-% 
-% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
-\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
-%
-\def\math{%
-  \tex
-  \mathcode`\_="8000 \mathunderscore
-  \let\\ = \mathbackslash
-  \mathactive
-  \implicitmath\finishmath}
-\def\finishmath#1{#1\implicitmath\Etex}
-
-% Some active characters (such as <) are spaced differently in math.
-% We have to reset their definitions in case the @math was an
-% argument to a command which set the catcodes (such as @item or @section).
-% 
-{
-  \catcode`^ = \active
-  \catcode`< = \active
-  \catcode`> = \active
-  \catcode`+ = \active
-  \gdef\mathactive{%
-    \let^ = \ptexhat
-    \let< = \ptexless
-    \let> = \ptexgtr
-    \let+ = \ptexplus
-  }
-}
-
-% @bullet and @minus need the same treatment as @math, just above.
-\def\bullet{\implicitmath\ptexbullet\implicitmath}
-\def\minus{\implicitmath-\implicitmath}
-
-% @refill is a no-op.
-\let\refill=\relax
-
-% If working on a large document in chapters, it is convenient to
-% be able to disable indexing, cross-referencing, and contents, for test runs.
-% This is done with @novalidate (before @setfilename).
-%
-\newif\iflinks \linkstrue % by default we want the aux files.
-\let\novalidate = \linksfalse
-
-% @setfilename is done at the beginning of every texinfo file.
-% So open here the files we need to have open while reading the input.
-% This makes it possible to make a .fmt file for texinfo.
-\def\setfilename{%
-   \iflinks
-     \readauxfile
-   \fi % \openindices needs to do some work in any case.
-   \openindices
-   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
-   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
-   %
-   % If texinfo.cnf is present on the system, read it.
-   % Useful for site-wide @afourpaper, etc.
-   % Just to be on the safe side, close the input stream before the \input.
-   \openin 1 texinfo.cnf
-   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
-   \closein1
-   \temp
-   %
-   \comment % Ignore the actual filename.
-}
-
-% Called from \setfilename.
-%
-\def\openindices{%
-  \newindex{cp}%
-  \newcodeindex{fn}%
-  \newcodeindex{vr}%
-  \newcodeindex{tp}%
-  \newcodeindex{ky}%
-  \newcodeindex{pg}%
-}
-
-% @bye.
-\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
-
-
-\message{pdf,}
-% adobe `portable' document format
-\newcount\tempnum
-\newcount\lnkcount
-\newtoks\filename
-\newcount\filenamelength
-\newcount\pgn
-\newtoks\toksA
-\newtoks\toksB
-\newtoks\toksC
-\newtoks\toksD
-\newbox\boxA
-\newcount\countA
-\newif\ifpdf
-\newif\ifpdfmakepagedest
-
-\ifx\pdfoutput\undefined
-  \pdffalse
-  \let\pdfmkdest = \gobble
-  \let\pdfurl = \gobble
-  \let\endlink = \relax
-  \let\linkcolor = \relax
-  \let\pdfmakeoutlines = \relax
-\else
-  \pdftrue
-  \pdfoutput = 1
-  \input pdfcolor
-  \def\dopdfimage#1#2#3{%
-    \def\imagewidth{#2}%
-    \def\imageheight{#3}%
-    % without \immediate, pdftex seg faults when the same image is
-    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
-    \ifnum\pdftexversion < 14
-      \immediate\pdfimage
-    \else
-      \immediate\pdfximage
-    \fi
-      \ifx\empty\imagewidth\else width \imagewidth \fi
-      \ifx\empty\imageheight\else height \imageheight \fi
-      \ifnum\pdftexversion<13
-         #1.pdf%
-       \else
-         {#1.pdf}%
-       \fi
-    \ifnum\pdftexversion < 14 \else
-      \pdfrefximage \pdflastximage
-    \fi}
-  \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
-  \def\pdfmkpgn#1{#1}
-  \let\linkcolor = \Blue  % was Cyan, but that seems light?
-  \def\endlink{\Black\pdfendlink}
-  % Adding outlines to PDF; macros for calculating structure of outlines
-  % come from Petr Olsak
-  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
-    \else \csname#1\endcsname \fi}
-  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
-    \advance\tempnum by1
-    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
-  \def\pdfmakeoutlines{{%
-    \openin 1 \jobname.toc
-    \ifeof 1\else\begingroup
-      \closein 1 
-      % Thanh's hack / proper braces in bookmarks  
-      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
-      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
-      %
-      \def\chapentry ##1##2##3{}
-      \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
-      \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
-      \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
-      \let\appendixentry = \chapentry
-      \let\unnumbchapentry = \chapentry
-      \let\unnumbsecentry = \secentry
-      \let\unnumbsubsecentry = \subsecentry
-      \let\unnumbsubsubsecentry = \subsubsecentry
-      \input \jobname.toc
-      \def\chapentry ##1##2##3{%
-        \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
-      \def\secentry ##1##2##3##4{%
-        \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
-      \def\subsecentry ##1##2##3##4##5{%
-        \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
-      \def\subsubsecentry ##1##2##3##4##5##6{%
-        \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
-      \let\appendixentry = \chapentry
-      \let\unnumbchapentry = \chapentry
-      \let\unnumbsecentry = \secentry
-      \let\unnumbsubsecentry = \subsecentry
-      \let\unnumbsubsubsecentry = \subsubsecentry
-      %
-      % Make special characters normal for writing to the pdf file.
-      % 
-      \indexnofonts
-      \let\tt=\relax
-      \turnoffactive
-      \input \jobname.toc
-    \endgroup\fi
-  }}
-  \def\makelinks #1,{%
-    \def\params{#1}\def\E{END}%
-    \ifx\params\E
-      \let\nextmakelinks=\relax
-    \else
-      \let\nextmakelinks=\makelinks
-      \ifnum\lnkcount>0,\fi
-      \picknum{#1}%
-      \startlink attr{/Border [0 0 0]} 
-        goto name{\pdfmkpgn{\the\pgn}}%
-      \linkcolor #1%
-      \advance\lnkcount by 1%
-      \endlink
-    \fi
-    \nextmakelinks
-  }
-  \def\picknum#1{\expandafter\pn#1}
-  \def\pn#1{%
-    \def\p{#1}%
-    \ifx\p\lbrace
-      \let\nextpn=\ppn
-    \else
-      \let\nextpn=\ppnn
-      \def\first{#1}
-    \fi
-    \nextpn
-  }
-  \def\ppn#1{\pgn=#1\gobble}
-  \def\ppnn{\pgn=\first}
-  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
-  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
-  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
-    \ifx\PP\D\let\nextsp\relax
-    \else\let\nextsp\skipspaces
-      \ifx\p\space\else\addtokens{\filename}{\PP}%
-        \advance\filenamelength by 1
-      \fi
-    \fi
-    \nextsp}
-  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
-  \ifnum\pdftexversion < 14
-    \let \startlink \pdfannotlink
-  \else
-    \let \startlink \pdfstartlink
-  \fi
-  \def\pdfurl#1{%
-    \begingroup
-      \normalturnoffactive\def\@{@}%
-      \let\value=\expandablevalue
-      \leavevmode\Red
-      \startlink attr{/Border [0 0 0]}%
-        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
-        % #1
-    \endgroup}
-  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
-  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
-  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
-  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
-  \def\maketoks{%
-    \expandafter\poptoks\the\toksA|ENDTOKS|
-    \ifx\first0\adn0
-    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
-    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
-    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 
-    \else
-      \ifnum0=\countA\else\makelink\fi
-      \ifx\first.\let\next=\done\else
-        \let\next=\maketoks
-        \addtokens{\toksB}{\the\toksD}
-        \ifx\first,\addtokens{\toksB}{\space}\fi
-      \fi
-    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
-    \next}
-  \def\makelink{\addtokens{\toksB}%
-    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
-  \def\pdflink#1{%
-    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
-    \linkcolor #1\endlink}
-  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
-\fi % \ifx\pdfoutput
-
-
-\message{fonts,}
-% Font-change commands.
-
-% Texinfo sort of supports the sans serif font style, which plain TeX does not.
-% So we set up a \sf analogous to plain's \rm, etc.
-\newfam\sffam
-\def\sf{\fam=\sffam \tensf}
-\let\li = \sf % Sometimes we call it \li, not \sf.
-
-% We don't need math for this one.
-\def\ttsl{\tenttsl}
-
-% Default leading.
-\newdimen\textleading  \textleading = 13.2pt
-
-% Set the baselineskip to #1, and the lineskip and strut size
-% correspondingly.  There is no deep meaning behind these magic numbers
-% used as factors; they just match (closely enough) what Knuth defined.
-%
-\def\lineskipfactor{.08333}
-\def\strutheightpercent{.70833}
-\def\strutdepthpercent {.29167}
-%
-\def\setleading#1{%
-  \normalbaselineskip = #1\relax
-  \normallineskip = \lineskipfactor\normalbaselineskip
-  \normalbaselines
-  \setbox\strutbox =\hbox{%
-    \vrule width0pt height\strutheightpercent\baselineskip
-                    depth \strutdepthpercent \baselineskip
-  }%
-}
-
-% Set the font macro #1 to the font named #2, adding on the
-% specified font prefix (normally `cm').
-% #3 is the font's design size, #4 is a scale factor
-\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
-
-% Use cm as the default font prefix.
-% To specify the font prefix, you must define \fontprefix
-% before you read in texinfo.tex.
-\ifx\fontprefix\undefined
-\def\fontprefix{cm}
-\fi
-% Support font families that don't use the same naming scheme as CM.
-\def\rmshape{r}
-\def\rmbshape{bx}               %where the normal face is bold
-\def\bfshape{b}
-\def\bxshape{bx}
-\def\ttshape{tt}
-\def\ttbshape{tt}
-\def\ttslshape{sltt}
-\def\itshape{ti}
-\def\itbshape{bxti}
-\def\slshape{sl}
-\def\slbshape{bxsl}
-\def\sfshape{ss}
-\def\sfbshape{ss}
-\def\scshape{csc}
-\def\scbshape{csc}
-
-\newcount\mainmagstep
-\ifx\bigger\relax
-  % not really supported.
-  \mainmagstep=\magstep1
-  \setfont\textrm\rmshape{12}{1000}
-  \setfont\texttt\ttshape{12}{1000}
-\else
-  \mainmagstep=\magstephalf
-  \setfont\textrm\rmshape{10}{\mainmagstep}
-  \setfont\texttt\ttshape{10}{\mainmagstep}
-\fi
-% Instead of cmb10, you may want to use cmbx10.
-% cmbx10 is a prettier font on its own, but cmb10
-% looks better when embedded in a line with cmr10
-% (in Bob's opinion).
-\setfont\textbf\bfshape{10}{\mainmagstep}
-\setfont\textit\itshape{10}{\mainmagstep}
-\setfont\textsl\slshape{10}{\mainmagstep}
-\setfont\textsf\sfshape{10}{\mainmagstep}
-\setfont\textsc\scshape{10}{\mainmagstep}
-\setfont\textttsl\ttslshape{10}{\mainmagstep}
-\font\texti=cmmi10 scaled \mainmagstep
-\font\textsy=cmsy10 scaled \mainmagstep
-
-% A few fonts for @defun, etc.
-\setfont\defbf\bxshape{10}{\magstep1} %was 1314
-\setfont\deftt\ttshape{10}{\magstep1}
-\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
-
-% Fonts for indices, footnotes, small examples (9pt).
-\setfont\smallrm\rmshape{9}{1000}
-\setfont\smalltt\ttshape{9}{1000}
-\setfont\smallbf\bfshape{10}{900}
-\setfont\smallit\itshape{9}{1000}
-\setfont\smallsl\slshape{9}{1000}
-\setfont\smallsf\sfshape{9}{1000}
-\setfont\smallsc\scshape{10}{900}
-\setfont\smallttsl\ttslshape{10}{900}
-\font\smalli=cmmi9
-\font\smallsy=cmsy9
-
-% Fonts for small examples (8pt).
-\setfont\smallerrm\rmshape{8}{1000}
-\setfont\smallertt\ttshape{8}{1000}
-\setfont\smallerbf\bfshape{10}{800}
-\setfont\smallerit\itshape{8}{1000}
-\setfont\smallersl\slshape{8}{1000}
-\setfont\smallersf\sfshape{8}{1000}
-\setfont\smallersc\scshape{10}{800}
-\setfont\smallerttsl\ttslshape{10}{800}
-\font\smalleri=cmmi8
-\font\smallersy=cmsy8
-
-% Fonts for title page:
-\setfont\titlerm\rmbshape{12}{\magstep3}
-\setfont\titleit\itbshape{10}{\magstep4}
-\setfont\titlesl\slbshape{10}{\magstep4}
-\setfont\titlett\ttbshape{12}{\magstep3}
-\setfont\titlettsl\ttslshape{10}{\magstep4}
-\setfont\titlesf\sfbshape{17}{\magstep1}
-\let\titlebf=\titlerm
-\setfont\titlesc\scbshape{10}{\magstep4}
-\font\titlei=cmmi12 scaled \magstep3
-\font\titlesy=cmsy10 scaled \magstep4
-\def\authorrm{\secrm}
-\def\authortt{\sectt}
-
-% Chapter (and unnumbered) fonts (17.28pt).
-\setfont\chaprm\rmbshape{12}{\magstep2}
-\setfont\chapit\itbshape{10}{\magstep3}
-\setfont\chapsl\slbshape{10}{\magstep3}
-\setfont\chaptt\ttbshape{12}{\magstep2}
-\setfont\chapttsl\ttslshape{10}{\magstep3}
-\setfont\chapsf\sfbshape{17}{1000}
-\let\chapbf=\chaprm
-\setfont\chapsc\scbshape{10}{\magstep3}
-\font\chapi=cmmi12 scaled \magstep2
-\font\chapsy=cmsy10 scaled \magstep3
-
-% Section fonts (14.4pt).
-\setfont\secrm\rmbshape{12}{\magstep1}
-\setfont\secit\itbshape{10}{\magstep2}
-\setfont\secsl\slbshape{10}{\magstep2}
-\setfont\sectt\ttbshape{12}{\magstep1}
-\setfont\secttsl\ttslshape{10}{\magstep2}
-\setfont\secsf\sfbshape{12}{\magstep1}
-\let\secbf\secrm
-\setfont\secsc\scbshape{10}{\magstep2}
-\font\seci=cmmi12 scaled \magstep1
-\font\secsy=cmsy10 scaled \magstep2
-
-% Subsection fonts (13.15pt).
-\setfont\ssecrm\rmbshape{12}{\magstephalf}
-\setfont\ssecit\itbshape{10}{1315}
-\setfont\ssecsl\slbshape{10}{1315}
-\setfont\ssectt\ttbshape{12}{\magstephalf}
-\setfont\ssecttsl\ttslshape{10}{1315}
-\setfont\ssecsf\sfbshape{12}{\magstephalf}
-\let\ssecbf\ssecrm
-\setfont\ssecsc\scbshape{10}{\magstep1}
-\font\sseci=cmmi12 scaled \magstephalf
-\font\ssecsy=cmsy10 scaled 1315
-% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
-% but that is not a standard magnification.
-
-% In order for the font changes to affect most math symbols and letters,
-% we have to define the \textfont of the standard families.  Since
-% texinfo doesn't allow for producing subscripts and superscripts except
-% in the main text, we don't bother to reset \scriptfont and
-% \scriptscriptfont (which would also require loading a lot more fonts).
-%
-\def\resetmathfonts{%
-  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
-  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
-  \textfont\ttfam=\tentt \textfont\sffam=\tensf
-}
-
-% The font-changing commands redefine the meanings of \tenSTYLE, instead
-% of just \STYLE.  We do this so that font changes will continue to work
-% in math mode, where it is the current \fam that is relevant in most
-% cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
-% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
-% redefine \bf itself.
-\def\textfonts{%
-  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
-  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
-  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
-  \resetmathfonts \setleading{\textleading}}
-\def\titlefonts{%
-  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
-  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
-  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
-  \let\tenttsl=\titlettsl
-  \resetmathfonts \setleading{25pt}}
-\def\titlefont#1{{\titlefonts\rm #1}}
-\def\chapfonts{%
-  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
-  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
-  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
-  \resetmathfonts \setleading{19pt}}
-\def\secfonts{%
-  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
-  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
-  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
-  \resetmathfonts \setleading{16pt}}
-\def\subsecfonts{%
-  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
-  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
-  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
-  \resetmathfonts \setleading{15pt}}
-\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
-\def\smallfonts{%
-  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
-  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
-  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
-  \let\tenttsl=\smallttsl
-  \resetmathfonts \setleading{10.5pt}}
-\def\smallerfonts{%
-  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
-  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
-  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
-  \let\tenttsl=\smallerttsl
-  \resetmathfonts \setleading{9.5pt}}
-
-% Set the fonts to use with the @small... environments.
-\let\smallexamplefonts = \smallfonts
-
-% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
-% can fit this many characters:
-%   8.5x11=86   smallbook=72  a4=90  a5=69
-% If we use \smallerfonts (8pt), then we can fit this many characters:
-%   8.5x11=90+  smallbook=80  a4=90+  a5=77
-% For me, subjectively, the few extra characters that fit aren't worth
-% the additional smallness of 8pt.  So I'm making the default 9pt.
-% 
-% By the way, for comparison, here's what fits with @example (10pt):
-%   8.5x11=71  smallbook=60  a4=75  a5=58
-% 
-% I wish we used A4 paper on this side of the Atlantic.
-% 
-% --karl, 24jan03.
-
-
-% Set up the default fonts, so we can use them for creating boxes.
-%
-\textfonts
-
-% Define these so they can be easily changed for other fonts.
-\def\angleleft{$\langle$}
-\def\angleright{$\rangle$}
-
-% Count depth in font-changes, for error checks
-\newcount\fontdepth \fontdepth=0
-
-% Fonts for short table of contents.
-\setfont\shortcontrm\rmshape{12}{1000}
-\setfont\shortcontbf\bxshape{12}{1000}
-\setfont\shortcontsl\slshape{12}{1000}
-\setfont\shortconttt\ttshape{12}{1000}
-
-%% Add scribe-like font environments, plus @l for inline lisp (usually sans
-%% serif) and @ii for TeX italic
-
-% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
-% unless the following character is such as not to need one.
-\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
-\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
-\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
-
-\let\i=\smartitalic
-\let\var=\smartslanted
-\let\dfn=\smartslanted
-\let\emph=\smartitalic
-\let\cite=\smartslanted
-
-\def\b#1{{\bf #1}}
-\let\strong=\b
-
-% We can't just use \exhyphenpenalty, because that only has effect at
-% the end of a paragraph.  Restore normal hyphenation at the end of the
-% group within which \nohyphenation is presumably called.
-%
-\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
-\def\restorehyphenation{\hyphenchar\font = `- }
-
-% Set sfcode to normal for the chars that usually have another value.
-% Can't use plain's \frenchspacing because it uses the `\x notation, and
-% sometimes \x has an active definition that messes things up.
-% 
-\catcode`@=11
-  \def\frenchspacing{%
-    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
-    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
-  }
-\catcode`@=\other
-
-\def\t#1{%
-  {\tt \rawbackslash \frenchspacing #1}%
-  \null
-}
-\let\ttfont=\t
-\def\samp#1{`\tclose{#1}'\null}
-\setfont\keyrm\rmshape{8}{1000}
-\font\keysy=cmsy9
-\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
-  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
-    \vbox{\hrule\kern-0.4pt
-     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
-    \kern-0.4pt\hrule}%
-  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
-% The old definition, with no lozenge:
-%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
-\def\ctrl #1{{\tt \rawbackslash \hat}#1}
-
-% @file, @option are the same as @samp.
-\let\file=\samp
-\let\option=\samp
-
-% @code is a modification of @t,
-% which makes spaces the same size as normal in the surrounding text.
-\def\tclose#1{%
-  {%
-    % Change normal interword space to be same as for the current font.
-    \spaceskip = \fontdimen2\font
-    %
-    % Switch to typewriter.
-    \tt
-    %
-    % But `\ ' produces the large typewriter interword space.
-    \def\ {{\spaceskip = 0pt{} }}%
-    %
-    % Turn off hyphenation.
-    \nohyphenation
-    %
-    \rawbackslash
-    \frenchspacing
-    #1%
-  }%
-  \null
-}
-
-% We *must* turn on hyphenation at `-' and `_' in \code.
-% Otherwise, it is too hard to avoid overfull hboxes
-% in the Emacs manual, the Library manual, etc.
-
-% Unfortunately, TeX uses one parameter (\hyphenchar) to control
-% both hyphenation at - and hyphenation within words.
-% We must therefore turn them both off (\tclose does that)
-% and arrange explicitly to hyphenate at a dash.
-%  -- rms.
-{
-  \catcode`\-=\active
-  \catcode`\_=\active
-  %
-  \global\def\code{\begingroup
-    \catcode`\-=\active \let-\codedash
-    \catcode`\_=\active \let_\codeunder
-    \codex
-  }
-  %
-  % If we end up with any active - characters when handling the index,
-  % just treat them as a normal -.
-  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
-}
-
-\def\realdash{-}
-\def\codedash{-\discretionary{}{}{}}
-\def\codeunder{%
-  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
-  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
-  % will therefore expand the active definition of _, which is us
-  % (inside @code that is), therefore an endless loop.
-  \ifusingtt{\ifmmode
-               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
-             \else\normalunderscore \fi
-             \discretionary{}{}{}}%
-            {\_}%
-}
-\def\codex #1{\tclose{#1}\endgroup}
-
-% @kbd is like @code, except that if the argument is just one @key command,
-% then @kbd has no effect.
-
-% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
-%   `example' (@kbd uses ttsl only inside of @example and friends),
-%   or `code' (@kbd uses normal tty font always).
-\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
-\def\kbdinputstylexxx#1{%
-  \def\arg{#1}%
-  \ifx\arg\worddistinct
-    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
-  \else\ifx\arg\wordexample
-    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
-  \else\ifx\arg\wordcode
-    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
-  \else
-    \errhelp = \EMsimple
-    \errmessage{Unknown @kbdinputstyle `\arg'}%
-  \fi\fi\fi
-}
-\def\worddistinct{distinct}
-\def\wordexample{example}
-\def\wordcode{code}
-
-% Default is `distinct.'
-\kbdinputstyle distinct
-
-\def\xkey{\key}
-\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
-\ifx\one\xkey\ifx\threex\three \key{#2}%
-\else{\tclose{\kbdfont\look}}\fi
-\else{\tclose{\kbdfont\look}}\fi}
-
-% For @url, @env, @command quotes seem unnecessary, so use \code.
-\let\url=\code
-\let\env=\code
-\let\command=\code
-
-% @uref (abbreviation for `urlref') takes an optional (comma-separated)
-% second argument specifying the text to display and an optional third
-% arg as text to display instead of (rather than in addition to) the url
-% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
-% a hypertex \special here.
-%
-\def\uref#1{\douref #1,,,\finish}
-\def\douref#1,#2,#3,#4\finish{\begingroup
-  \unsepspaces
-  \pdfurl{#1}%
-  \setbox0 = \hbox{\ignorespaces #3}%
-  \ifdim\wd0 > 0pt
-    \unhbox0 % third arg given, show only that
-  \else
-    \setbox0 = \hbox{\ignorespaces #2}%
-    \ifdim\wd0 > 0pt
-      \ifpdf
-        \unhbox0             % PDF: 2nd arg given, show only it
-      \else
-        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
-      \fi
-    \else
-      \code{#1}% only url given, so show it
-    \fi
-  \fi
-  \endlink
-\endgroup}
-
-% rms does not like angle brackets --karl, 17may97.
-% So now @email is just like @uref, unless we are pdf.
-% 
-%\def\email#1{\angleleft{\tt #1}\angleright}
-\ifpdf
-  \def\email#1{\doemail#1,,\finish}
-  \def\doemail#1,#2,#3\finish{\begingroup
-    \unsepspaces
-    \pdfurl{mailto:#1}%
-    \setbox0 = \hbox{\ignorespaces #2}%
-    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
-    \endlink
-  \endgroup}
-\else
-  \let\email=\uref
-\fi
-
-% Check if we are currently using a typewriter font.  Since all the
-% Computer Modern typewriter fonts have zero interword stretch (and
-% shrink), and it is reasonable to expect all typewriter fonts to have
-% this property, we can check that font parameter.
-%
-\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
-
-% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
-% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
-%
-\def\dmn#1{\thinspace #1}
-
-\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
-
-% @l was never documented to mean ``switch to the Lisp font'',
-% and it is not used as such in any manual I can find.  We need it for
-% Polish suppressed-l.  --karl, 22sep96.
-%\def\l#1{{\li #1}\null}
-
-% Explicit font changes: @r, @sc, undocumented @ii.
-\def\r#1{{\rm #1}}              % roman font
-\def\sc#1{{\smallcaps#1}}       % smallcaps font
-\def\ii#1{{\it #1}}             % italic font
-
-% @acronym downcases the argument and prints in smallcaps.
-\def\acronym#1{{\smallcaps \lowercase{#1}}}
-
-% @pounds{} is a sterling sign.
-\def\pounds{{\it\$}}
-
-
-\message{page headings,}
-
-\newskip\titlepagetopglue \titlepagetopglue = 1.5in
-\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
-
-% First the title page.  Must do @settitle before @titlepage.
-\newif\ifseenauthor
-\newif\iffinishedtitlepage
-
-% Do an implicit @contents or @shortcontents after @end titlepage if the
-% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
-%
-\newif\ifsetcontentsaftertitlepage
- \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
-\newif\ifsetshortcontentsaftertitlepage
- \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
-
-\def\shorttitlepage{\parsearg\shorttitlepagezzz}
-\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
-        \endgroup\page\hbox{}\page}
-
-\def\titlepage{\begingroup \parindent=0pt \textfonts
-   \let\subtitlerm=\tenrm
-   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
-   %
-   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
-                   \let\tt=\authortt}%
-   %
-   % Leave some space at the very top of the page.
-   \vglue\titlepagetopglue
-   %
-   % Now you can print the title using @title.
-   \def\title{\parsearg\titlezzz}%
-   \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
-                    % print a rule at the page bottom also.
-                    \finishedtitlepagefalse
-                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
-   % No rule at page bottom unless we print one at the top with @title.
-   \finishedtitlepagetrue
-   %
-   % Now you can put text using @subtitle.
-   \def\subtitle{\parsearg\subtitlezzz}%
-   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
-   %
-   % @author should come last, but may come many times.
-   \def\author{\parsearg\authorzzz}%
-   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
-      {\authorfont \leftline{##1}}}%
-   %
-   % Most title ``pages'' are actually two pages long, with space
-   % at the top of the second.  We don't want the ragged left on the second.
-   \let\oldpage = \page
-   \def\page{%
-      \iffinishedtitlepage\else
-         \finishtitlepage
-      \fi
-      \oldpage
-      \let\page = \oldpage
-      \hbox{}}%
-%   \def\page{\oldpage \hbox{}}
-}
-
-\def\Etitlepage{%
-   \iffinishedtitlepage\else
-      \finishtitlepage
-   \fi
-   % It is important to do the page break before ending the group,
-   % because the headline and footline are only empty inside the group.
-   % If we use the new definition of \page, we always get a blank page
-   % after the title page, which we certainly don't want.
-   \oldpage
-   \endgroup
-   %
-   % Need this before the \...aftertitlepage checks so that if they are
-   % in effect the toc pages will come out with page numbers.
-   \HEADINGSon
-   %
-   % If they want short, they certainly want long too.
-   \ifsetshortcontentsaftertitlepage
-     \shortcontents
-     \contents
-     \global\let\shortcontents = \relax
-     \global\let\contents = \relax
-   \fi
-   %
-   \ifsetcontentsaftertitlepage
-     \contents
-     \global\let\contents = \relax
-     \global\let\shortcontents = \relax
-   \fi
-}
-
-\def\finishtitlepage{%
-   \vskip4pt \hrule height 2pt width \hsize
-   \vskip\titlepagebottomglue
-   \finishedtitlepagetrue
-}
-
-%%% Set up page headings and footings.
-
-\let\thispage=\folio
-
-\newtoks\evenheadline    % headline on even pages
-\newtoks\oddheadline     % headline on odd pages
-\newtoks\evenfootline    % footline on even pages
-\newtoks\oddfootline     % footline on odd pages
-
-% Now make Tex use those variables
-\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
-                            \else \the\evenheadline \fi}}
-\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
-                            \else \the\evenfootline \fi}\HEADINGShook}
-\let\HEADINGShook=\relax
-
-% Commands to set those variables.
-% For example, this is what  @headings on  does
-% @evenheading @thistitle|@thispage|@thischapter
-% @oddheading @thischapter|@thispage|@thistitle
-% @evenfooting @thisfile||
-% @oddfooting ||@thisfile
-
-\def\evenheading{\parsearg\evenheadingxxx}
-\def\oddheading{\parsearg\oddheadingxxx}
-\def\everyheading{\parsearg\everyheadingxxx}
-
-\def\evenfooting{\parsearg\evenfootingxxx}
-\def\oddfooting{\parsearg\oddfootingxxx}
-\def\everyfooting{\parsearg\everyfootingxxx}
-
-{\catcode`\@=0 %
-
-\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
-\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
-\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
-\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
-
-\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
-\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
-\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
-
-\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
-\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
-  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
-  %
-  % Leave some space for the footline.  Hopefully ok to assume
-  % @evenfooting will not be used by itself.
-  \global\advance\pageheight by -\baselineskip
-  \global\advance\vsize by -\baselineskip
-}
-
-\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
-%
-}% unbind the catcode of @.
-
-% @headings double      turns headings on for double-sided printing.
-% @headings single      turns headings on for single-sided printing.
-% @headings off         turns them off.
-% @headings on          same as @headings double, retained for compatibility.
-% @headings after       turns on double-sided headings after this page.
-% @headings doubleafter turns on double-sided headings after this page.
-% @headings singleafter turns on single-sided headings after this page.
-% By default, they are off at the start of a document,
-% and turned `on' after @end titlepage.
-
-\def\headings #1 {\csname HEADINGS#1\endcsname}
-
-\def\HEADINGSoff{
-\global\evenheadline={\hfil} \global\evenfootline={\hfil}
-\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
-\HEADINGSoff
-% When we turn headings on, set the page number to 1.
-% For double-sided printing, put current file name in lower left corner,
-% chapter name on inside top of right hand pages, document
-% title on inside top of left hand pages, and page numbers on outside top
-% edge of all pages.
-\def\HEADINGSdouble{
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-\let\contentsalignmacro = \chappager
-
-% For single-sided printing, chapter title goes across top left of page,
-% page number on top right.
-\def\HEADINGSsingle{
-\global\pageno=1
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-\def\HEADINGSon{\HEADINGSdouble}
-
-\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
-\let\HEADINGSdoubleafter=\HEADINGSafter
-\def\HEADINGSdoublex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\folio\hfil\thistitle}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chapoddpage
-}
-
-\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
-\def\HEADINGSsinglex{%
-\global\evenfootline={\hfil}
-\global\oddfootline={\hfil}
-\global\evenheadline={\line{\thischapter\hfil\folio}}
-\global\oddheadline={\line{\thischapter\hfil\folio}}
-\global\let\contentsalignmacro = \chappager
-}
-
-% Subroutines used in generating headings
-% This produces Day Month Year style of output.
-% Only define if not already defined, in case a txi-??.tex file has set
-% up a different format (e.g., txi-cs.tex does this).
-\ifx\today\undefined
-\def\today{%
-  \number\day\space
-  \ifcase\month
-  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
-  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
-  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
-  \fi
-  \space\number\year}
-\fi
-
-% @settitle line...  specifies the title of the document, for headings.
-% It generates no output of its own.
-\def\thistitle{\putwordNoTitle}
-\def\settitle{\parsearg\settitlezzz}
-\def\settitlezzz #1{\gdef\thistitle{#1}}
-
-
-\message{tables,}
-% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
-
-% default indentation of table text
-\newdimen\tableindent \tableindent=.8in
-% default indentation of @itemize and @enumerate text
-\newdimen\itemindent  \itemindent=.3in
-% margin between end of table item and start of table text.
-\newdimen\itemmargin  \itemmargin=.1in
-
-% used internally for \itemindent minus \itemmargin
-\newdimen\itemmax
-
-% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
-% these defs.
-% They also define \itemindex
-% to index the item name in whatever manner is desired (perhaps none).
-
-\newif\ifitemxneedsnegativevskip
-
-\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
-
-\def\internalBitem{\smallbreak \parsearg\itemzzz}
-\def\internalBitemx{\itemxpar \parsearg\itemzzz}
-
-\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
-\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
-
-\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
-\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
-
-\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
-                 \itemzzz {#1}}
-
-\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
-                 \itemzzz {#1}}
-
-\def\itemzzz #1{\begingroup %
-  \advance\hsize by -\rightskip
-  \advance\hsize by -\tableindent
-  \setbox0=\hbox{\itemfont{#1}}%
-  \itemindex{#1}%
-  \nobreak % This prevents a break before @itemx.
-  %
-  % If the item text does not fit in the space we have, put it on a line
-  % by itself, and do not allow a page break either before or after that
-  % line.  We do not start a paragraph here because then if the next
-  % command is, e.g., @kindex, the whatsit would get put into the
-  % horizontal list on a line by itself, resulting in extra blank space.
-  \ifdim \wd0>\itemmax
-    %
-    % Make this a paragraph so we get the \parskip glue and wrapping,
-    % but leave it ragged-right.
-    \begingroup
-      \advance\leftskip by-\tableindent
-      \advance\hsize by\tableindent
-      \advance\rightskip by0pt plus1fil
-      \leavevmode\unhbox0\par
-    \endgroup
-    %
-    % We're going to be starting a paragraph, but we don't want the
-    % \parskip glue -- logically it's part of the @item we just started.
-    \nobreak \vskip-\parskip
-    %
-    % Stop a page break at the \parskip glue coming up.  (Unfortunately
-    % we can't prevent a possible page break at the following
-    % \baselineskip glue.)  However, if what follows is an environment
-    % such as @example, there will be no \parskip glue; then
-    % the negative vskip we just would cause the example and the item to
-    % crash together.  So we use this bizarre value of 10001 as a signal
-    % to \aboveenvbreak to insert \parskip glue after all.
-    % (Possibly there are other commands that could be followed by
-    % @example which need the same treatment, but not section titles; or
-    % maybe section titles are the only special case and they should be
-    % penalty 10001...)
-    \penalty 10001
-    \endgroup
-    \itemxneedsnegativevskipfalse
-  \else
-    % The item text fits into the space.  Start a paragraph, so that the
-    % following text (if any) will end up on the same line.
-    \noindent
-    % Do this with kerns and \unhbox so that if there is a footnote in
-    % the item text, it can migrate to the main vertical list and
-    % eventually be printed.
-    \nobreak\kern-\tableindent
-    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
-    \unhbox0
-    \nobreak\kern\dimen0
-    \endgroup
-    \itemxneedsnegativevskiptrue
-  \fi
-}
-
-\def\item{\errmessage{@item while not in a table}}
-\def\itemx{\errmessage{@itemx while not in a table}}
-\def\kitem{\errmessage{@kitem while not in a table}}
-\def\kitemx{\errmessage{@kitemx while not in a table}}
-\def\xitem{\errmessage{@xitem while not in a table}}
-\def\xitemx{\errmessage{@xitemx while not in a table}}
-
-% Contains a kludge to get @end[description] to work.
-\def\description{\tablez{\dontindex}{1}{}{}{}{}}
-
-% @table, @ftable, @vtable.
-\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
-{\obeylines\obeyspaces%
-\gdef\tablex #1^^M{%
-\tabley\dontindex#1        \endtabley}}
-
-\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
-{\obeylines\obeyspaces%
-\gdef\ftablex #1^^M{%
-\tabley\fnitemindex#1        \endtabley
-\def\Eftable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
-{\obeylines\obeyspaces%
-\gdef\vtablex #1^^M{%
-\tabley\vritemindex#1        \endtabley
-\def\Evtable{\endgraf\afterenvbreak\endgroup}%
-\let\Etable=\relax}}
-
-\def\dontindex #1{}
-\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
-\def\vritemindex #1{\doind {vr}{\code{#1}}}%
-
-{\obeyspaces %
-\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
-\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
-
-\def\tablez #1#2#3#4#5#6{%
-\aboveenvbreak %
-\begingroup %
-\def\Edescription{\Etable}% Necessary kludge.
-\let\itemindex=#1%
-\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
-\ifnum 0#4>0 \tableindent=#4\mil \fi %
-\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
-\def\itemfont{#2}%
-\itemmax=\tableindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \tableindent %
-\exdentamount=\tableindent
-\parindent = 0pt
-\parskip = \smallskipamount
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def\Etable{\endgraf\afterenvbreak\endgroup}%
-\let\item = \internalBitem %
-\let\itemx = \internalBitemx %
-\let\kitem = \internalBkitem %
-\let\kitemx = \internalBkitemx %
-\let\xitem = \internalBxitem %
-\let\xitemx = \internalBxitemx %
-}
-
-% This is the counter used by @enumerate, which is really @itemize
-
-\newcount \itemno
-
-\def\itemize{\parsearg\itemizezzz}
-
-\def\itemizezzz #1{%
-  \begingroup % ended by the @end itemize
-  \itemizey {#1}{\Eitemize}
-}
-
-\def\itemizey #1#2{%
-\aboveenvbreak %
-\itemmax=\itemindent %
-\advance \itemmax by -\itemmargin %
-\advance \leftskip by \itemindent %
-\exdentamount=\itemindent
-\parindent = 0pt %
-\parskip = \smallskipamount %
-\ifdim \parskip=0pt \parskip=2pt \fi%
-\def#2{\endgraf\afterenvbreak\endgroup}%
-\def\itemcontents{#1}%
-\let\item=\itemizeitem}
-
-% \splitoff TOKENS\endmark defines \first to be the first token in
-% TOKENS, and \rest to be the remainder.
-%
-\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
-
-% Allow an optional argument of an uppercase letter, lowercase letter,
-% or number, to specify the first label in the enumerated list.  No
-% argument is the same as `1'.
-%
-\def\enumerate{\parsearg\enumeratezzz}
-\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
-\def\enumeratey #1 #2\endenumeratey{%
-  \begingroup % ended by the @end enumerate
-  %
-  % If we were given no argument, pretend we were given `1'.
-  \def\thearg{#1}%
-  \ifx\thearg\empty \def\thearg{1}\fi
-  %
-  % Detect if the argument is a single token.  If so, it might be a
-  % letter.  Otherwise, the only valid thing it can be is a number.
-  % (We will always have one token, because of the test we just made.
-  % This is a good thing, since \splitoff doesn't work given nothing at
-  % all -- the first parameter is undelimited.)
-  \expandafter\splitoff\thearg\endmark
-  \ifx\rest\empty
-    % Only one token in the argument.  It could still be anything.
-    % A ``lowercase letter'' is one whose \lccode is nonzero.
-    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
-    %   not equal to itself.
-    % Otherwise, we assume it's a number.
-    %
-    % We need the \relax at the end of the \ifnum lines to stop TeX from
-    % continuing to look for a <number>.
-    %
-    \ifnum\lccode\expandafter`\thearg=0\relax
-      \numericenumerate % a number (we hope)
-    \else
-      % It's a letter.
-      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
-        \lowercaseenumerate % lowercase letter
-      \else
-        \uppercaseenumerate % uppercase letter
-      \fi
-    \fi
-  \else
-    % Multiple tokens in the argument.  We hope it's a number.
-    \numericenumerate
-  \fi
-}
-
-% An @enumerate whose labels are integers.  The starting integer is
-% given in \thearg.
-%
-\def\numericenumerate{%
-  \itemno = \thearg
-  \startenumeration{\the\itemno}%
-}
-
-% The starting (lowercase) letter is in \thearg.
-\def\lowercaseenumerate{%
-  \itemno = \expandafter`\thearg
-  \startenumeration{%
-    % Be sure we're not beyond the end of the alphabet.
-    \ifnum\itemno=0
-      \errmessage{No more lowercase letters in @enumerate; get a bigger
-                  alphabet}%
-    \fi
-    \char\lccode\itemno
-  }%
-}
-
-% The starting (uppercase) letter is in \thearg.
-\def\uppercaseenumerate{%
-  \itemno = \expandafter`\thearg
-  \startenumeration{%
-    % Be sure we're not beyond the end of the alphabet.
-    \ifnum\itemno=0
-      \errmessage{No more uppercase letters in @enumerate; get a bigger
-                  alphabet}
-    \fi
-    \char\uccode\itemno
-  }%
-}
-
-% Call itemizey, adding a period to the first argument and supplying the
-% common last two arguments.  Also subtract one from the initial value in
-% \itemno, since @item increments \itemno.
-%
-\def\startenumeration#1{%
-  \advance\itemno by -1
-  \itemizey{#1.}\Eenumerate\flushcr
-}
-
-% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
-% to @enumerate.
-%
-\def\alphaenumerate{\enumerate{a}}
-\def\capsenumerate{\enumerate{A}}
-\def\Ealphaenumerate{\Eenumerate}
-\def\Ecapsenumerate{\Eenumerate}
-
-% Definition of @item while inside @itemize.
-
-\def\itemizeitem{%
-\advance\itemno by 1
-{\let\par=\endgraf \smallbreak}%
-\ifhmode \errmessage{In hmode at itemizeitem}\fi
-{\parskip=0in \hskip 0pt
-\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
-\vadjust{\penalty 1200}}%
-\flushcr}
-
-% @multitable macros
-% Amy Hendrickson, 8/18/94, 3/6/96
-%
-% @multitable ... @end multitable will make as many columns as desired.
-% Contents of each column will wrap at width given in preamble.  Width
-% can be specified either with sample text given in a template line,
-% or in percent of \hsize, the current width of text on page.
-
-% Table can continue over pages but will only break between lines.
-
-% To make preamble:
-%
-% Either define widths of columns in terms of percent of \hsize:
-%   @multitable @columnfractions .25 .3 .45
-%   @item ...
-%
-%   Numbers following @columnfractions are the percent of the total
-%   current hsize to be used for each column. You may use as many
-%   columns as desired.
-
-
-% Or use a template:
-%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-%   @item ...
-%   using the widest term desired in each column.
-%
-% For those who want to use more than one line's worth of words in
-% the preamble, break the line within one argument and it
-% will parse correctly, i.e.,
-%
-%     @multitable {Column 1 template} {Column 2 template} {Column 3
-%      template}
-% Not:
-%     @multitable {Column 1 template} {Column 2 template}
-%      {Column 3 template}
-
-% Each new table line starts with @item, each subsequent new column
-% starts with @tab. Empty columns may be produced by supplying @tab's
-% with nothing between them for as many times as empty columns are needed,
-% ie, @tab@tab@tab will produce two empty columns.
-
-% @item, @tab, @multitable or @end multitable do not need to be on their
-% own lines, but it will not hurt if they are.
-
-% Sample multitable:
-
-%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
-%   @item first col stuff @tab second col stuff @tab third col
-%   @item
-%   first col stuff
-%   @tab
-%   second col stuff
-%   @tab
-%   third col
-%   @item first col stuff @tab second col stuff
-%   @tab Many paragraphs of text may be used in any column.
-%
-%         They will wrap at the width determined by the template.
-%   @item@tab@tab This will be in third column.
-%   @end multitable
-
-% Default dimensions may be reset by user.
-% @multitableparskip is vertical space between paragraphs in table.
-% @multitableparindent is paragraph indent in table.
-% @multitablecolmargin is horizontal space to be left between columns.
-% @multitablelinespace is space to leave between table items, baseline
-%                                                            to baseline.
-%   0pt means it depends on current normal line spacing.
-%
-\newskip\multitableparskip
-\newskip\multitableparindent
-\newdimen\multitablecolspace
-\newskip\multitablelinespace
-\multitableparskip=0pt
-\multitableparindent=6pt
-\multitablecolspace=12pt
-\multitablelinespace=0pt
-
-% Macros used to set up halign preamble:
-%
-\let\endsetuptable\relax
-\def\xendsetuptable{\endsetuptable}
-\let\columnfractions\relax
-\def\xcolumnfractions{\columnfractions}
-\newif\ifsetpercent
-
-% #1 is the part of the @columnfraction before the decimal point, which
-% is presumably either 0 or the empty string (but we don't check, we
-% just throw it away).  #2 is the decimal part, which we use as the
-% percent of \hsize for this column.
-\def\pickupwholefraction#1.#2 {%
-  \global\advance\colcount by 1
-  \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
-  \setuptable
-}
-
-\newcount\colcount
-\def\setuptable#1{%
-  \def\firstarg{#1}%
-  \ifx\firstarg\xendsetuptable
-    \let\go = \relax
-  \else
-    \ifx\firstarg\xcolumnfractions
-      \global\setpercenttrue
-    \else
-      \ifsetpercent
-         \let\go\pickupwholefraction
-      \else
-         \global\advance\colcount by 1
-         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
-                   % separator; typically that is always in the input, anyway.
-         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
-      \fi
-    \fi
-    \ifx\go\pickupwholefraction
-      % Put the argument back for the \pickupwholefraction call, so
-      % we'll always have a period there to be parsed.
-      \def\go{\pickupwholefraction#1}%
-    \else
-      \let\go = \setuptable
-    \fi%
-  \fi
-  \go
-}
-
-% @multitable ... @end multitable definitions:
-%
-\def\multitable{\parsearg\dotable}
-\def\dotable#1{\bgroup
-  \vskip\parskip
-  \let\item=\crcrwithfootnotes
-  % A \tab used to include \hskip1sp.  But then the space in a template
-  % line is not enough.  That is bad.  So let's go back to just & until
-  % we encounter the problem it was intended to solve again.  --karl,
-  % nathan@acm.org, 20apr99.
-  \let\tab=&%
-  \let\startfootins=\startsavedfootnote
-  \tolerance=9500
-  \hbadness=9500
-  \setmultitablespacing
-  \parskip=\multitableparskip
-  \parindent=\multitableparindent
-  \overfullrule=0pt
-  \global\colcount=0
-  \def\Emultitable{%
-    \global\setpercentfalse
-    \crcrwithfootnotes\crcr
-    \egroup\egroup
-  }%
-  %
-  % To parse everything between @multitable and @item:
-  \setuptable#1 \endsetuptable
-  %
-  % \everycr will reset column counter, \colcount, at the end of
-  % each line. Every column entry will cause \colcount to advance by one.
-  % The table preamble
-  % looks at the current \colcount to find the correct column width.
-  \everycr{\noalign{%
-  %
-  % \filbreak%% keeps underfull box messages off when table breaks over pages.
-  % Maybe so, but it also creates really weird page breaks when the table
-  % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
-  % manifests itself, so it can be fixed for real --karl.
-    \global\colcount=0\relax}}%
-  %
-  % This preamble sets up a generic column definition, which will
-  % be used as many times as user calls for columns.
-  % \vtop will set a single line and will also let text wrap and
-  % continue for many paragraphs if desired.
-  \halign\bgroup&\global\advance\colcount by 1\relax
-    \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
-  %
-  % In order to keep entries from bumping into each other
-  % we will add a \leftskip of \multitablecolspace to all columns after
-  % the first one.
-  %
-  % If a template has been used, we will add \multitablecolspace
-  % to the width of each template entry.
-  %
-  % If the user has set preamble in terms of percent of \hsize we will
-  % use that dimension as the width of the column, and the \leftskip
-  % will keep entries from bumping into each other.  Table will start at
-  % left margin and final column will justify at right margin.
-  %
-  % Make sure we don't inherit \rightskip from the outer environment.
-  \rightskip=0pt
-  \ifnum\colcount=1
-    % The first column will be indented with the surrounding text.
-    \advance\hsize by\leftskip
-  \else
-    \ifsetpercent \else
-      % If user has not set preamble in terms of percent of \hsize
-      % we will advance \hsize by \multitablecolspace.
-      \advance\hsize by \multitablecolspace
-    \fi
-   % In either case we will make \leftskip=\multitablecolspace:
-  \leftskip=\multitablecolspace
-  \fi
-  % Ignoring space at the beginning and end avoids an occasional spurious
-  % blank line, when TeX decides to break the line at the space before the
-  % box from the multistrut, so the strut ends up on a line by itself.
-  % For example:
-  % @multitable @columnfractions .11 .89
-  % @item @code{#}
-  % @tab Legal holiday which is valid in major parts of the whole country.
-  % Is automatically provided with highlighting sequences respectively marking
-  % characters.
-  \noindent\ignorespaces##\unskip\multistrut}\cr
-}
-
-\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
-% If so, do nothing. If not, give it an appropriate dimension based on
-% current baselineskip.
-\ifdim\multitablelinespace=0pt
-\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
-\global\advance\multitablelinespace by-\ht0
-%% strut to put in table in case some entry doesn't have descenders,
-%% to keep lines equally spaced
-\let\multistrut = \strut
-\else
-%% FIXME: what is \box0 supposed to be?
-\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
-width0pt\relax} \fi
-%% Test to see if parskip is larger than space between lines of
-%% table. If not, do nothing.
-%%        If so, set to same dimension as multitablelinespace.
-\ifdim\multitableparskip>\multitablelinespace
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
-                                      %% than skip between lines in the table.
-\fi%
-\ifdim\multitableparskip=0pt
-\global\multitableparskip=\multitablelinespace
-\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
-                                      %% than skip between lines in the table.
-\fi}
-
-% In case a @footnote appears inside an alignment, save the footnote
-% text to a box and make the \insert when a row of the table is
-% finished.  Otherwise, the insertion is lost, it never migrates to the
-% main vertical list.  --kasal, 22jan03.
-%
-\newbox\savedfootnotes
-%
-% \dotable \let's \startfootins to this, so that \dofootnote will call
-% it instead of starting the insertion right away.
-\def\startsavedfootnote{%
-  \global\setbox\savedfootnotes = \vbox\bgroup
-    \unvbox\savedfootnotes
-}
-\def\crcrwithfootnotes{%
-  \crcr
-  \ifvoid\savedfootnotes \else
-    \noalign{\insert\footins{\box\savedfootnotes}}%
-  \fi
-}
-
-\message{conditionals,}
-% Prevent errors for section commands.
-% Used in @ignore and in failing conditionals.
-\def\ignoresections{%
-  \let\chapter=\relax
-  \let\unnumbered=\relax
-  \let\top=\relax
-  \let\unnumberedsec=\relax
-  \let\unnumberedsection=\relax
-  \let\unnumberedsubsec=\relax
-  \let\unnumberedsubsection=\relax
-  \let\unnumberedsubsubsec=\relax
-  \let\unnumberedsubsubsection=\relax
-  \let\section=\relax
-  \let\subsec=\relax
-  \let\subsubsec=\relax
-  \let\subsection=\relax
-  \let\subsubsection=\relax
-  \let\appendix=\relax
-  \let\appendixsec=\relax
-  \let\appendixsection=\relax
-  \let\appendixsubsec=\relax
-  \let\appendixsubsection=\relax
-  \let\appendixsubsubsec=\relax
-  \let\appendixsubsubsection=\relax
-  \let\contents=\relax
-  \let\smallbook=\relax
-  \let\titlepage=\relax
-}
-
-% Used in nested conditionals, where we have to parse the Texinfo source
-% and so want to turn off most commands, in case they are used
-% incorrectly.
-%
-% We use \empty instead of \relax for the @def... commands, so that \end
-% doesn't throw an error.  For instance:
-% @ignore
-% @deffn ...
-% @end deffn
-% @end ignore
-% 
-% The @end deffn is going to get expanded, because we're trying to allow
-% nested conditionals.  But we don't want to expand the actual @deffn,
-% since it might be syntactically correct and intended to be ignored.
-% Since \end checks for \relax, using \empty does not cause an error.
-% 
-\def\ignoremorecommands{%
-  \let\defcodeindex = \relax
-  \let\defcv = \empty
-  \let\defcvx = \empty
-  \let\Edefcv = \empty
-  \let\deffn = \empty
-  \let\deffnx = \empty
-  \let\Edeffn = \empty
-  \let\defindex = \relax
-  \let\defivar = \empty
-  \let\defivarx = \empty
-  \let\Edefivar = \empty
-  \let\defmac = \empty
-  \let\defmacx = \empty
-  \let\Edefmac = \empty
-  \let\defmethod = \empty
-  \let\defmethodx = \empty
-  \let\Edefmethod = \empty
-  \let\defop = \empty
-  \let\defopx = \empty
-  \let\Edefop = \empty
-  \let\defopt = \empty
-  \let\defoptx = \empty
-  \let\Edefopt = \empty
-  \let\defspec = \empty
-  \let\defspecx = \empty
-  \let\Edefspec = \empty
-  \let\deftp = \empty
-  \let\deftpx = \empty
-  \let\Edeftp = \empty
-  \let\deftypefn = \empty
-  \let\deftypefnx = \empty
-  \let\Edeftypefn = \empty
-  \let\deftypefun = \empty
-  \let\deftypefunx = \empty
-  \let\Edeftypefun = \empty
-  \let\deftypeivar = \empty
-  \let\deftypeivarx = \empty
-  \let\Edeftypeivar = \empty
-  \let\deftypemethod = \empty
-  \let\deftypemethodx = \empty
-  \let\Edeftypemethod = \empty
-  \let\deftypeop = \empty
-  \let\deftypeopx = \empty
-  \let\Edeftypeop = \empty
-  \let\deftypevar = \empty
-  \let\deftypevarx = \empty
-  \let\Edeftypevar = \empty
-  \let\deftypevr = \empty
-  \let\deftypevrx = \empty
-  \let\Edeftypevr = \empty
-  \let\defun = \empty
-  \let\defunx = \empty
-  \let\Edefun = \empty
-  \let\defvar = \empty
-  \let\defvarx = \empty
-  \let\Edefvar = \empty
-  \let\defvr = \empty
-  \let\defvrx = \empty
-  \let\Edefvr = \empty
-  \let\clear = \relax
-  \let\down = \relax
-  \let\evenfooting = \relax
-  \let\evenheading = \relax
-  \let\everyfooting = \relax
-  \let\everyheading = \relax
-  \let\headings = \relax
-  \let\include = \relax
-  \let\item = \relax
-  \let\lowersections = \relax
-  \let\oddfooting = \relax
-  \let\oddheading = \relax
-  \let\printindex = \relax
-  \let\pxref = \relax
-  \let\raisesections = \relax
-  \let\ref = \relax
-  \let\set = \relax
-  \let\setchapternewpage = \relax
-  \let\setchapterstyle = \relax
-  \let\settitle = \relax
-  \let\up = \relax
-  \let\verbatiminclude = \relax
-  \let\xref = \relax
-}
-
-% Ignore @ignore, @ifhtml, @ifinfo, and the like.
-%
-\def\direntry{\doignore{direntry}}
-\def\documentdescriptionword{documentdescription}
-\def\documentdescription{\doignore{documentdescription}}
-\def\html{\doignore{html}}
-\def\ifhtml{\doignore{ifhtml}}
-\def\ifinfo{\doignore{ifinfo}}
-\def\ifnottex{\doignore{ifnottex}}
-\def\ifplaintext{\doignore{ifplaintext}}
-\def\ifxml{\doignore{ifxml}}
-\def\ignore{\doignore{ignore}}
-\def\menu{\doignore{menu}}
-\def\xml{\doignore{xml}}
-
-% @dircategory CATEGORY  -- specify a category of the dir file
-% which this file should belong to.  Ignore this in TeX.
-\let\dircategory = \comment
-
-% Ignore text until a line `@end #1'.
-%
-\def\doignore#1{\begingroup
-  % Don't complain about control sequences we have declared \outer.
-  \ignoresections
-  %
-  % Define a command to swallow text until we reach `@end #1'.
-  % This @ is a catcode 12 token (that is the normal catcode of @ in
-  % this texinfo.tex file).  We change the catcode of @ below to match.
-  \long\def\doignoretext##1@end #1{\enddoignore}%
-  %
-  % Make sure that spaces turn into tokens that match what \doignoretext wants.
-  \catcode\spaceChar = 10
-  %
-  % Ignore braces, too, so mismatched braces don't cause trouble.
-  \catcode`\{ = 9
-  \catcode`\} = 9
-  %
-  % We must not have @c interpreted as a control sequence.
-  \catcode`\@ = 12
-  %
-  \def\ignoreword{#1}%
-  \ifx\ignoreword\documentdescriptionword
-    % The c kludge breaks documentdescription, since
-    % `documentdescription' contains a `c'.  Means not everything will
-    % be ignored inside @documentdescription, but oh well...
-  \else
-    % Make the letter c a comment character so that the rest of the line
-    % will be ignored. This way, the document can have (for example)
-    %   @c @end ifinfo
-    % and the @end ifinfo will be properly ignored.
-    % (We've just changed @ to catcode 12.)
-    \catcode`\c = 14
-  \fi
-  %
-  % And now expand the command defined above.
-  \doignoretext
-}
-
-% What we do to finish off ignored text.
-%
-\def\enddoignore{\endgroup\ignorespaces}%
-
-\newif\ifwarnedobs\warnedobsfalse
-\def\obstexwarn{%
-  \ifwarnedobs\relax\else
-  % We need to warn folks that they may have trouble with TeX 3.0.
-  % This uses \immediate\write16 rather than \message to get newlines.
-    \immediate\write16{}
-    \immediate\write16{WARNING: for users of Unix TeX 3.0!}
-    \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
-    \immediate\write16{If you are running another version of TeX, relax.}
-    \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
-    \immediate\write16{  Then upgrade your TeX installation if you can.}
-    \immediate\write16{  (See ftp://ftp.gnu.org/non-gnu/TeX.README.)}
-    \immediate\write16{If you are stuck with version 3.0, run the}
-    \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
-    \immediate\write16{  to use a workaround.}
-    \immediate\write16{}
-    \global\warnedobstrue
-    \fi
-}
-
-% **In TeX 3.0, setting text in \nullfont hangs tex.  For a
-% workaround (which requires the file ``dummy.tfm'' to be installed),
-% uncomment the following line:
-%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
-
-% Ignore text, except that we keep track of conditional commands for
-% purposes of nesting, up to an `@end #1' command.
-%
-\def\nestedignore#1{%
-  \obstexwarn
-  % We must actually expand the ignored text to look for the @end
-  % command, so that nested ignore constructs work.  Thus, we put the
-  % text into a \vbox and then do nothing with the result.  To minimize
-  % the chance of memory overflow, we follow the approach outlined on
-  % page 401 of the TeXbook.
-  %
-  \setbox0 = \vbox\bgroup
-    % Don't complain about control sequences we have declared \outer.
-    \ignoresections
-    %
-    % Define `@end #1' to end the box, which will in turn undefine the
-    % @end command again.
-    \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
-    %
-    % We are going to be parsing Texinfo commands.  Most cause no
-    % trouble when they are used incorrectly, but some commands do
-    % complicated argument parsing or otherwise get confused, so we
-    % undefine them.
-    %
-    % We can't do anything about stray @-signs, unfortunately;
-    % they'll produce `undefined control sequence' errors.
-    \ignoremorecommands
-    %
-    % Set the current font to be \nullfont, a TeX primitive, and define
-    % all the font commands to also use \nullfont.  We don't use
-    % dummy.tfm, as suggested in the TeXbook, because some sites
-    % might not have that installed.  Therefore, math mode will still
-    % produce output, but that should be an extremely small amount of
-    % stuff compared to the main input.
-    %
-    \nullfont
-    \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
-    \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
-    \let\tensf=\nullfont
-    % Similarly for index fonts.
-    \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
-    \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
-    \let\smallsf=\nullfont
-    % Similarly for smallexample fonts.
-    \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
-    \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
-    \let\smallersf=\nullfont
-    %
-    % Don't complain when characters are missing from the fonts.
-    \tracinglostchars = 0
-    %
-    % Don't bother to do space factor calculations.
-    \frenchspacing
-    %
-    % Don't report underfull hboxes.
-    \hbadness = 10000
-    %
-    % Do minimal line-breaking.
-    \pretolerance = 10000
-    %
-    % Do not execute instructions in @tex.
-    \def\tex{\doignore{tex}}%
-    % Do not execute macro definitions.
-    % `c' is a comment character, so the word `macro' will get cut off.
-    \def\macro{\doignore{ma}}%
-}
-
-% @set VAR sets the variable VAR to an empty value.
-% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
-%
-% Since we want to separate VAR from REST-OF-LINE (which might be
-% empty), we can't just use \parsearg; we have to insert a space of our
-% own to delimit the rest of the line, and then take it out again if we
-% didn't need it.  Make sure the catcode of space is correct to avoid
-% losing inside @example, for instance.
-%
-\def\set{\begingroup\catcode` =10
-  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
-  \parsearg\setxxx}
-\def\setxxx#1{\setyyy#1 \endsetyyy}
-\def\setyyy#1 #2\endsetyyy{%
-  \def\temp{#2}%
-  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
-  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
-  \fi
-  \endgroup
-}
-% Can't use \xdef to pre-expand #2 and save some time, since \temp or
-% \next or other control sequences that we've defined might get us into
-% an infinite loop. Consider `@set foo @cite{bar}'.
-\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
-
-% @clear VAR clears (i.e., unsets) the variable VAR.
-%
-\def\clear{\parsearg\clearxxx}
-\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
-
-% @value{foo} gets the text saved in variable foo.
-{
-  \catcode`\_ = \active
-  %
-  % We might end up with active _ or - characters in the argument if
-  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
-  % such active characters to their normal equivalents.
-  \gdef\value{\begingroup
-    \catcode`\-=\other \catcode`\_=\other
-    \indexbreaks \let_\normalunderscore
-    \valuexxx}
-}
-\def\valuexxx#1{\expandablevalue{#1}\endgroup}
-
-% We have this subroutine so that we can handle at least some @value's
-% properly in indexes (we \let\value to this in \indexdummies).  Ones
-% whose names contain - or _ still won't work, but we can't do anything
-% about that.  The command has to be fully expandable (if the variable
-% is set), since the result winds up in the index file.  This means that
-% if the variable's value contains other Texinfo commands, it's almost
-% certain it will fail (although perhaps we could fix that with
-% sufficient work to do a one-level expansion on the result, instead of
-% complete).
-%
-\def\expandablevalue#1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    {[No value for ``#1'']}%
-    \message{Variable `#1', used in @value, is not set.}%
-  \else
-    \csname SET#1\endcsname
-  \fi
-}
-
-% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
-% with @set.
-%
-\def\ifset{\parsearg\doifset}
-\def\doifset#1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    \let\next=\ifsetfail
-  \else
-    \let\next=\ifsetsucceed
-  \fi
-  \next
-}
-\def\ifsetsucceed{\conditionalsucceed{ifset}}
-\def\ifsetfail{\nestedignore{ifset}}
-\defineunmatchedend{ifset}
-
-% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
-% defined with @set, or has been undefined with @clear.
-%
-\def\ifclear{\parsearg\doifclear}
-\def\doifclear#1{%
-  \expandafter\ifx\csname SET#1\endcsname\relax
-    \let\next=\ifclearsucceed
-  \else
-    \let\next=\ifclearfail
-  \fi
-  \next
-}
-\def\ifclearsucceed{\conditionalsucceed{ifclear}}
-\def\ifclearfail{\nestedignore{ifclear}}
-\defineunmatchedend{ifclear}
-
-% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
-% read the text following, through the first @end iftex (etc.).  Make
-% `@end iftex' (etc.) valid only after an @iftex.
-%
-\def\iftex{\conditionalsucceed{iftex}}
-\def\ifnothtml{\conditionalsucceed{ifnothtml}}
-\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
-\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
-\defineunmatchedend{iftex}
-\defineunmatchedend{ifnothtml}
-\defineunmatchedend{ifnotinfo}
-\defineunmatchedend{ifnotplaintext}
-
-% True conditional.  Since \set globally defines its variables, we can
-% just start and end a group (to keep the @end definition undefined at
-% the outer level).
-%
-\def\conditionalsucceed#1{\begingroup
-  \expandafter\def\csname E#1\endcsname{\endgroup}%
-}
-
-% @defininfoenclose.
-\let\definfoenclose=\comment
-
-
-\message{indexing,}
-% Index generation facilities
-
-% Define \newwrite to be identical to plain tex's \newwrite
-% except not \outer, so it can be used within \newindex.
-{\catcode`\@=11
-\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
-
-% \newindex {foo} defines an index named foo.
-% It automatically defines \fooindex such that
-% \fooindex ...rest of line... puts an entry in the index foo.
-% It also defines \fooindfile to be the number of the output channel for
-% the file that accumulates this index.  The file's extension is foo.
-% The name of an index should be no more than 2 characters long
-% for the sake of vms.
-%
-\def\newindex#1{%
-  \iflinks
-    \expandafter\newwrite \csname#1indfile\endcsname
-    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
-  \fi
-  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
-    \noexpand\doindex{#1}}
-}
-
-% @defindex foo  ==  \newindex{foo}
-%
-\def\defindex{\parsearg\newindex}
-
-% Define @defcodeindex, like @defindex except put all entries in @code.
-%
-\def\defcodeindex{\parsearg\newcodeindex}
-%
-\def\newcodeindex#1{%
-  \iflinks
-    \expandafter\newwrite \csname#1indfile\endcsname
-    \openout \csname#1indfile\endcsname \jobname.#1
-  \fi
-  \expandafter\xdef\csname#1index\endcsname{%
-    \noexpand\docodeindex{#1}}%
-}
-
-
-% @synindex foo bar    makes index foo feed into index bar.
-% Do this instead of @defindex foo if you don't want it as a separate index.
-% 
-% @syncodeindex foo bar   similar, but put all entries made for index foo
-% inside @code.
-% 
-\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
-\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
-
-% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
-% #3 the target index (bar).
-\def\dosynindex#1#2#3{%
-  % Only do \closeout if we haven't already done it, else we'll end up
-  % closing the target index.
-  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
-    % The \closeout helps reduce unnecessary open files; the limit on the
-    % Acorn RISC OS is a mere 16 files.
-    \expandafter\closeout\csname#2indfile\endcsname
-    \expandafter\let\csname\donesynindex#2\endcsname = 1
-  \fi
-  % redefine \fooindfile:
-  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
-  \expandafter\let\csname#2indfile\endcsname=\temp
-  % redefine \fooindex:
-  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
-}
-
-% Define \doindex, the driver for all \fooindex macros.
-% Argument #1 is generated by the calling \fooindex macro,
-%  and it is "foo", the name of the index.
-
-% \doindex just uses \parsearg; it calls \doind for the actual work.
-% This is because \doind is more useful to call from other macros.
-
-% There is also \dosubind {index}{topic}{subtopic}
-% which makes an entry in a two-level index such as the operation index.
-
-\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
-\def\singleindexer #1{\doind{\indexname}{#1}}
-
-% like the previous two, but they put @code around the argument.
-\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
-\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
-
-% Take care of Texinfo commands that can appear in an index entry.
-% Since there are some commands we want to expand, and others we don't,
-% we have to laboriously prevent expansion for those that we don't.
-% 
-\def\indexdummies{%
-  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
-  \def\ {\realbackslash\space }%
-  % Need these in case \tex is in effect and \{ is a \delimiter again.
-  % But can't use \lbracecmd and \rbracecmd because texindex assumes
-  % braces and backslashes are used only as delimiters.  
-  \let\{ = \mylbrace
-  \let\} = \myrbrace
-  %
-  % \definedummyword defines \#1 as \realbackslash #1\space, thus
-  % effectively preventing its expansion.  This is used only for control
-  % words, not control letters, because the \space would be incorrect
-  % for control characters, but is needed to separate the control word
-  % from whatever follows.
-  % 
-  % For control letters, we have \definedummyletter, which omits the
-  % space.
-  % 
-  % These can be used both for control words that take an argument and
-  % those that do not.  If it is followed by {arg} in the input, then
-  % that will dutifully get written to the index (or wherever).
-  % 
-  \def\definedummyword##1{%
-    \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
-  }%
-  \def\definedummyletter##1{%
-    \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
-  }%
-  %
-  % Do the redefinitions.
-  \commondummies
-}
-
-% For the aux file, @ is the escape character.  So we want to redefine
-% everything using @ instead of \realbackslash.  When everything uses 
-% @, this will be simpler.
-% 
-\def\atdummies{%
-  \def\@{@@}%
-  \def\ {@ }%
-  \let\{ = \lbraceatcmd
-  \let\} = \rbraceatcmd
-  %
-  % (See comments in \indexdummies.)
-  \def\definedummyword##1{%
-    \expandafter\def\csname ##1\endcsname{@##1\space}%
-  }%
-  \def\definedummyletter##1{%
-    \expandafter\def\csname ##1\endcsname{@##1}%
-  }%
-  %
-  % Do the redefinitions.
-  \commondummies
-}
-
-% Called from \indexdummies and \atdummies.  \definedummyword and
-% \definedummyletter must be defined first.
-% 
-\def\commondummies{%
-  %
-  \normalturnoffactive
-  %
-  % Control letters and accents.
-  \definedummyletter{_}%
-  \definedummyletter{,}%
-  \definedummyletter{"}%
-  \definedummyletter{`}%
-  \definedummyletter{'}%
-  \definedummyletter{^}%
-  \definedummyletter{~}%
-  \definedummyletter{=}%
-  \definedummyword{u}%
-  \definedummyword{v}%
-  \definedummyword{H}%
-  \definedummyword{dotaccent}%
-  \definedummyword{ringaccent}%
-  \definedummyword{tieaccent}%
-  \definedummyword{ubaraccent}%
-  \definedummyword{udotaccent}%
-  \definedummyword{dotless}%
-  %
-  % Other non-English letters.
-  \definedummyword{AA}%
-  \definedummyword{AE}%
-  \definedummyword{L}%
-  \definedummyword{OE}%
-  \definedummyword{O}%
-  \definedummyword{aa}%
-  \definedummyword{ae}%
-  \definedummyword{l}%
-  \definedummyword{oe}%
-  \definedummyword{o}%
-  \definedummyword{ss}%
-  %
-  % Although these internal commands shouldn't show up, sometimes they do.
-  \definedummyword{bf}%
-  \definedummyword{gtr}%
-  \definedummyword{hat}%
-  \definedummyword{less}%
-  \definedummyword{sf}%
-  \definedummyword{sl}%
-  \definedummyword{tclose}%
-  \definedummyword{tt}%
-  %
-  % Texinfo font commands.
-  \definedummyword{b}%
-  \definedummyword{i}%
-  \definedummyword{r}%
-  \definedummyword{sc}%
-  \definedummyword{t}%
-  %
-  \definedummyword{TeX}%
-  \definedummyword{acronym}%
-  \definedummyword{cite}%
-  \definedummyword{code}%
-  \definedummyword{command}%
-  \definedummyword{dfn}%
-  \definedummyword{dots}%
-  \definedummyword{emph}%
-  \definedummyword{env}%
-  \definedummyword{file}%
-  \definedummyword{kbd}%
-  \definedummyword{key}%
-  \definedummyword{math}%
-  \definedummyword{option}%
-  \definedummyword{samp}%
-  \definedummyword{strong}%
-  \definedummyword{uref}%
-  \definedummyword{url}%
-  \definedummyword{var}%
-  \definedummyword{w}%
-  %
-  % Assorted special characters.
-  \definedummyword{bullet}%
-  \definedummyword{copyright}%
-  \definedummyword{dots}%
-  \definedummyword{enddots}%
-  \definedummyword{equiv}%
-  \definedummyword{error}%
-  \definedummyword{expansion}%
-  \definedummyword{minus}%
-  \definedummyword{pounds}%
-  \definedummyword{point}%
-  \definedummyword{print}%
-  \definedummyword{result}%
-  %
-  % Handle some cases of @value -- where the variable name does not
-  % contain - or _, and the value does not contain any
-  % (non-fully-expandable) commands.
-  \let\value = \expandablevalue
-  %
-  % Normal spaces, not active ones.
-  \unsepspaces
-  %
-  % No macro expansion.
-  \turnoffmacros
-}
-
-% If an index command is used in an @example environment, any spaces
-% therein should become regular spaces in the raw index file, not the
-% expansion of \tie (\leavevmode \penalty \@M \ ).
-{\obeyspaces
- \gdef\unsepspaces{\obeyspaces\let =\space}}
-
-
-% \indexnofonts is used when outputting the strings to sort the index
-% by, and when constructing control sequence names.  It eliminates all
-% control sequences and just writes whatever the best ASCII sort string
-% would be for a given command (usually its argument).
-%
-\def\indexdummytex{TeX}
-\def\indexdummydots{...}
-%
-\def\indexnofonts{%
-  \def\ { }%
-  \def\@{@}%
-  % how to handle braces?
-  \def\_{\normalunderscore}%
-  %
-  \let\,=\asis
-  \let\"=\asis
-  \let\`=\asis
-  \let\'=\asis
-  \let\^=\asis
-  \let\~=\asis
-  \let\==\asis
-  \let\u=\asis
-  \let\v=\asis
-  \let\H=\asis
-  \let\dotaccent=\asis
-  \let\ringaccent=\asis
-  \let\tieaccent=\asis
-  \let\ubaraccent=\asis
-  \let\udotaccent=\asis
-  \let\dotless=\asis
-  %
-  % Other non-English letters.
-  \def\AA{AA}%
-  \def\AE{AE}%
-  \def\L{L}%
-  \def\OE{OE}%
-  \def\O{O}%
-  \def\aa{aa}%
-  \def\ae{ae}%
-  \def\l{l}%
-  \def\oe{oe}%
-  \def\o{o}%
-  \def\ss{ss}%
-  \def\exclamdown{!}%
-  \def\questiondown{?}%
-  %
-  % Don't no-op \tt, since it isn't a user-level command
-  % and is used in the definitions of the active chars like <, >, |, etc.
-  % Likewise with the other plain tex font commands.
-  %\let\tt=\asis
-  %
-  % Texinfo font commands.
-  \let\b=\asis
-  \let\i=\asis
-  \let\r=\asis
-  \let\sc=\asis
-  \let\t=\asis
-  %
-  \let\TeX=\indexdummytex
-  \let\acronym=\asis
-  \let\cite=\asis
-  \let\code=\asis
-  \let\command=\asis
-  \let\dfn=\asis
-  \let\dots=\indexdummydots
-  \let\emph=\asis
-  \let\env=\asis
-  \let\file=\asis
-  \let\kbd=\asis
-  \let\key=\asis
-  \let\math=\asis
-  \let\option=\asis
-  \let\samp=\asis
-  \let\strong=\asis
-  \let\uref=\asis
-  \let\url=\asis
-  \let\var=\asis
-  \let\w=\asis
-}
-
-\let\indexbackslash=0  %overridden during \printindex.
-\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
-
-% For \ifx comparisons.
-\def\emptymacro{\empty}
-
-% Most index entries go through here, but \dosubind is the general case.
-%
-\def\doind#1#2{\dosubind{#1}{#2}\empty}
-
-% Workhorse for all \fooindexes.
-% #1 is name of index, #2 is stuff to put there, #3 is subentry --
-% \empty if called from \doind, as we usually are.  The main exception
-% is with defuns, which call us directly.
-%
-\def\dosubind#1#2#3{%
-  % Put the index entry in the margin if desired.
-  \ifx\SETmarginindex\relax\else
-    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
-  \fi
-  {%
-    \count255=\lastpenalty
-    {%
-      \indexdummies % Must do this here, since \bf, etc expand at this stage
-      \escapechar=`\\
-      {%
-        \let\folio = 0% We will expand all macros now EXCEPT \folio.
-        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
-        % so it will be output as is; and it will print as backslash.
-        %
-        % The main index entry text.
-        \toks0 = {#2}%
-        %
-        % If third arg is present, precede it with space in sort key.
-        \def\thirdarg{#3}%
-        \ifx\thirdarg\emptymacro \else
-           % If the third (subentry) arg is present, add it to the index
-           % line to write.
-          \toks0 = \expandafter{\the\toks0 \space #3}%
-        \fi
-        %
-        % Process the index entry with all font commands turned off, to
-        % get the string to sort by.
-        {\indexnofonts
-         \edef\temp{\the\toks0}% need full expansion
-         \xdef\indexsorttmp{\temp}%
-        }%
-        %
-        % Set up the complete index entry, with both the sort key and
-        % the original text, including any font commands.  We write
-        % three arguments to \entry to the .?? file (four in the
-        % subentry case), texindex reduces to two when writing the .??s
-        % sorted result.
-        \edef\temp{%
-          \write\csname#1indfile\endcsname{%
-            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
-        }%
-        %
-        % If a skip is the last thing on the list now, preserve it
-        % by backing up by \lastskip, doing the \write, then inserting
-        % the skip again.  Otherwise, the whatsit generated by the
-        % \write will make \lastskip zero.  The result is that sequences
-        % like this:
-        % @end defun
-        % @tindex whatever
-        % @defun ...
-        % will have extra space inserted, because the \medbreak in the
-        % start of the @defun won't see the skip inserted by the @end of
-        % the previous defun.
-        %
-        % But don't do any of this if we're not in vertical mode.  We
-        % don't want to do a \vskip and prematurely end a paragraph.
-        %
-        % Avoid page breaks due to these extra skips, too.
-        %
-        \iflinks
-          \ifvmode
-            \skip0 = \lastskip
-            \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi
-          \fi
-          %
-          \temp % do the write
-          %
-          \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
-        \fi
-      }%
-    }%
-    \penalty\count255
-  }%
-}
-
-% The index entry written in the file actually looks like
-%  \entry {sortstring}{page}{topic}
-% or
-%  \entry {sortstring}{page}{topic}{subtopic}
-% The texindex program reads in these files and writes files
-% containing these kinds of lines:
-%  \initial {c}
-%     before the first topic whose initial is c
-%  \entry {topic}{pagelist}
-%     for a topic that is used without subtopics
-%  \primary {topic}
-%     for the beginning of a topic that is used with subtopics
-%  \secondary {subtopic}{pagelist}
-%     for each subtopic.
-
-% Define the user-accessible indexing commands
-% @findex, @vindex, @kindex, @cindex.
-
-\def\findex {\fnindex}
-\def\kindex {\kyindex}
-\def\cindex {\cpindex}
-\def\vindex {\vrindex}
-\def\tindex {\tpindex}
-\def\pindex {\pgindex}
-
-\def\cindexsub {\begingroup\obeylines\cindexsub}
-{\obeylines %
-\gdef\cindexsub "#1" #2^^M{\endgroup %
-\dosubind{cp}{#2}{#1}}}
-
-% Define the macros used in formatting output of the sorted index material.
-
-% @printindex causes a particular index (the ??s file) to get printed.
-% It does not print any chapter heading (usually an @unnumbered).
-%
-\def\printindex{\parsearg\doprintindex}
-\def\doprintindex#1{\begingroup
-  \dobreak \chapheadingskip{10000}%
-  %
-  \smallfonts \rm
-  \tolerance = 9500
-  \indexbreaks
-  %
-  % See if the index file exists and is nonempty.
-  % Change catcode of @ here so that if the index file contains
-  % \initial {@}
-  % as its first line, TeX doesn't complain about mismatched braces
-  % (because it thinks @} is a control sequence).
-  \catcode`\@ = 11
-  \openin 1 \jobname.#1s
-  \ifeof 1
-    % \enddoublecolumns gets confused if there is no text in the index,
-    % and it loses the chapter title and the aux file entries for the
-    % index.  The easiest way to prevent this problem is to make sure
-    % there is some text.
-    \putwordIndexNonexistent
-  \else
-    %
-    % If the index file exists but is empty, then \openin leaves \ifeof
-    % false.  We have to make TeX try to read something from the file, so
-    % it can discover if there is anything in it.
-    \read 1 to \temp
-    \ifeof 1
-      \putwordIndexIsEmpty
-    \else
-      % Index files are almost Texinfo source, but we use \ as the escape
-      % character.  It would be better to use @, but that's too big a change
-      % to make right now.
-      \def\indexbackslash{\rawbackslashxx}%
-      \catcode`\\ = 0
-      \escapechar = `\\
-      \begindoublecolumns
-      \input \jobname.#1s
-      \enddoublecolumns
-    \fi
-  \fi
-  \closein 1
-\endgroup}
-
-% These macros are used by the sorted index file itself.
-% Change them to control the appearance of the index.
-
-\def\initial#1{{%
-  % Some minor font changes for the special characters.
-  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
-  %
-  % Remove any glue we may have, we'll be inserting our own.
-  \removelastskip
-  %
-  % We like breaks before the index initials, so insert a bonus.
-  \penalty -300
-  %
-  % Typeset the initial.  Making this add up to a whole number of
-  % baselineskips increases the chance of the dots lining up from column
-  % to column.  It still won't often be perfect, because of the stretch
-  % we need before each entry, but it's better.
-  %
-  % No shrink because it confuses \balancecolumns.
-  \vskip 1.67\baselineskip plus .5\baselineskip
-  \leftline{\secbf #1}%
-  \vskip .33\baselineskip plus .1\baselineskip
-  %
-  % Do our best not to break after the initial.
-  \nobreak
-}}
-
-% This typesets a paragraph consisting of #1, dot leaders, and then #2
-% flush to the right margin.  It is used for index and table of contents
-% entries.  The paragraph is indented by \leftskip.
-%
-\def\entry#1#2{\begingroup
-  %
-  % Start a new paragraph if necessary, so our assignments below can't
-  % affect previous text.
-  \par
-  %
-  % Do not fill out the last line with white space.
-  \parfillskip = 0in
-  %
-  % No extra space above this paragraph.
-  \parskip = 0in
-  %
-  % Do not prefer a separate line ending with a hyphen to fewer lines.
-  \finalhyphendemerits = 0
-  %
-  % \hangindent is only relevant when the entry text and page number
-  % don't both fit on one line.  In that case, bob suggests starting the
-  % dots pretty far over on the line.  Unfortunately, a large
-  % indentation looks wrong when the entry text itself is broken across
-  % lines.  So we use a small indentation and put up with long leaders.
-  %
-  % \hangafter is reset to 1 (which is the value we want) at the start
-  % of each paragraph, so we need not do anything with that.
-  \hangindent = 2em
-  %
-  % When the entry text needs to be broken, just fill out the first line
-  % with blank space.
-  \rightskip = 0pt plus1fil
-  %
-  % A bit of stretch before each entry for the benefit of balancing columns.
-  \vskip 0pt plus1pt
-  %
-  % Start a ``paragraph'' for the index entry so the line breaking
-  % parameters we've set above will have an effect.
-  \noindent
-  %
-  % Insert the text of the index entry.  TeX will do line-breaking on it.
-  #1%
-  % The following is kludged to not output a line of dots in the index if
-  % there are no page numbers.  The next person who breaks this will be
-  % cursed by a Unix daemon.
-  \def\tempa{{\rm }}%
-  \def\tempb{#2}%
-  \edef\tempc{\tempa}%
-  \edef\tempd{\tempb}%
-  \ifx\tempc\tempd\ \else%
-    %
-    % If we must, put the page number on a line of its own, and fill out
-    % this line with blank space.  (The \hfil is overwhelmed with the
-    % fill leaders glue in \indexdotfill if the page number does fit.)
-    \hfil\penalty50
-    \null\nobreak\indexdotfill % Have leaders before the page number.
-    %
-    % The `\ ' here is removed by the implicit \unskip that TeX does as
-    % part of (the primitive) \par.  Without it, a spurious underfull
-    % \hbox ensues.
-    \ifpdf
-      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
-    \else
-      \ #2% The page number ends the paragraph.
-    \fi
-  \fi%
-  \par
-\endgroup}
-
-% Like \dotfill except takes at least 1 em.
-\def\indexdotfill{\cleaders
-  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
-
-\def\primary #1{\line{#1\hfil}}
-
-\newskip\secondaryindent \secondaryindent=0.5cm
-\def\secondary#1#2{{%
-  \parfillskip=0in
-  \parskip=0in
-  \hangindent=1in
-  \hangafter=1
-  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
-  \ifpdf
-    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
-  \else
-    #2
-  \fi
-  \par
-}}
-
-% Define two-column mode, which we use to typeset indexes.
-% Adapted from the TeXbook, page 416, which is to say,
-% the manmac.tex format used to print the TeXbook itself.
-\catcode`\@=11
-
-\newbox\partialpage
-\newdimen\doublecolumnhsize
-
-\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
-  % Grab any single-column material above us.
-  \output = {%
-    %
-    % Here is a possibility not foreseen in manmac: if we accumulate a
-    % whole lot of material, we might end up calling this \output
-    % routine twice in a row (see the doublecol-lose test, which is
-    % essentially a couple of indexes with @setchapternewpage off).  In
-    % that case we just ship out what is in \partialpage with the normal
-    % output routine.  Generally, \partialpage will be empty when this
-    % runs and this will be a no-op.  See the indexspread.tex test case.
-    \ifvoid\partialpage \else
-      \onepageout{\pagecontents\partialpage}%
-    \fi
-    %
-    \global\setbox\partialpage = \vbox{%
-      % Unvbox the main output page.
-      \unvbox\PAGE
-      \kern-\topskip \kern\baselineskip
-    }%
-  }%
-  \eject % run that output routine to set \partialpage
-  %
-  % Use the double-column output routine for subsequent pages.
-  \output = {\doublecolumnout}%
-  %
-  % Change the page size parameters.  We could do this once outside this
-  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
-  % format, but then we repeat the same computation.  Repeating a couple
-  % of assignments once per index is clearly meaningless for the
-  % execution time, so we may as well do it in one place.
-  %
-  % First we halve the line length, less a little for the gutter between
-  % the columns.  We compute the gutter based on the line length, so it
-  % changes automatically with the paper format.  The magic constant
-  % below is chosen so that the gutter has the same value (well, +-<1pt)
-  % as it did when we hard-coded it.
-  %
-  % We put the result in a separate register, \doublecolumhsize, so we
-  % can restore it in \pagesofar, after \hsize itself has (potentially)
-  % been clobbered.
-  %
-  \doublecolumnhsize = \hsize
-    \advance\doublecolumnhsize by -.04154\hsize
-    \divide\doublecolumnhsize by 2
-  \hsize = \doublecolumnhsize
-  %
-  % Double the \vsize as well.  (We don't need a separate register here,
-  % since nobody clobbers \vsize.)
-  \vsize = 2\vsize
-}
-
-% The double-column output routine for all double-column pages except
-% the last.
-%
-\def\doublecolumnout{%
-  \splittopskip=\topskip \splitmaxdepth=\maxdepth
-  % Get the available space for the double columns -- the normal
-  % (undoubled) page height minus any material left over from the
-  % previous page.
-  \dimen@ = \vsize
-  \divide\dimen@ by 2
-  \advance\dimen@ by -\ht\partialpage
-  %
-  % box0 will be the left-hand column, box2 the right.
-  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
-  \onepageout\pagesofar
-  \unvbox255
-  \penalty\outputpenalty
-}
-%
-% Re-output the contents of the output page -- any previous material,
-% followed by the two boxes we just split, in box0 and box2.
-\def\pagesofar{%
-  \unvbox\partialpage
-  %
-  \hsize = \doublecolumnhsize
-  \wd0=\hsize \wd2=\hsize
-  \hbox to\pagewidth{\box0\hfil\box2}%
-}
-% 
-% All done with double columns.
-\def\enddoublecolumns{%
-  \output = {%
-    % Split the last of the double-column material.  Leave it on the
-    % current page, no automatic page break.
-    \balancecolumns
-    %
-    % If we end up splitting too much material for the current page,
-    % though, there will be another page break right after this \output
-    % invocation ends.  Having called \balancecolumns once, we do not
-    % want to call it again.  Therefore, reset \output to its normal
-    % definition right away.  (We hope \balancecolumns will never be
-    % called on to balance too much material, but if it is, this makes
-    % the output somewhat more palatable.)
-    \global\output = {\onepageout{\pagecontents\PAGE}}%
-  }%
-  \eject
-  \endgroup % started in \begindoublecolumns
-  %
-  % \pagegoal was set to the doubled \vsize above, since we restarted
-  % the current page.  We're now back to normal single-column
-  % typesetting, so reset \pagegoal to the normal \vsize (after the
-  % \endgroup where \vsize got restored).
-  \pagegoal = \vsize
-}
-%
-% Called at the end of the double column material.
-\def\balancecolumns{%
-  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
-  \dimen@ = \ht0
-  \advance\dimen@ by \topskip
-  \advance\dimen@ by-\baselineskip
-  \divide\dimen@ by 2 % target to split to
-  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
-  \splittopskip = \topskip
-  % Loop until we get a decent breakpoint.
-  {%
-    \vbadness = 10000
-    \loop
-      \global\setbox3 = \copy0
-      \global\setbox1 = \vsplit3 to \dimen@
-    \ifdim\ht3>\dimen@
-      \global\advance\dimen@ by 1pt
-    \repeat
-  }%
-  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
-  \setbox0=\vbox to\dimen@{\unvbox1}%
-  \setbox2=\vbox to\dimen@{\unvbox3}%
-  %
-  \pagesofar
-}
-\catcode`\@ = \other
-
-
-\message{sectioning,}
-% Chapters, sections, etc.
-
-\newcount\chapno
-\newcount\secno        \secno=0
-\newcount\subsecno     \subsecno=0
-\newcount\subsubsecno  \subsubsecno=0
-
-% This counter is funny since it counts through charcodes of letters A, B, ...
-\newcount\appendixno  \appendixno = `\@
-% \def\appendixletter{\char\the\appendixno}
-% We do the following for the sake of pdftex, which needs the actual
-% letter in the expansion, not just typeset.
-\def\appendixletter{%
-  \ifnum\appendixno=`A A%
-  \else\ifnum\appendixno=`B B%
-  \else\ifnum\appendixno=`C C%
-  \else\ifnum\appendixno=`D D%
-  \else\ifnum\appendixno=`E E%
-  \else\ifnum\appendixno=`F F%
-  \else\ifnum\appendixno=`G G%
-  \else\ifnum\appendixno=`H H%
-  \else\ifnum\appendixno=`I I%
-  \else\ifnum\appendixno=`J J%
-  \else\ifnum\appendixno=`K K%
-  \else\ifnum\appendixno=`L L%
-  \else\ifnum\appendixno=`M M%
-  \else\ifnum\appendixno=`N N%
-  \else\ifnum\appendixno=`O O%
-  \else\ifnum\appendixno=`P P%
-  \else\ifnum\appendixno=`Q Q%
-  \else\ifnum\appendixno=`R R%
-  \else\ifnum\appendixno=`S S%
-  \else\ifnum\appendixno=`T T%
-  \else\ifnum\appendixno=`U U%
-  \else\ifnum\appendixno=`V V%
-  \else\ifnum\appendixno=`W W%
-  \else\ifnum\appendixno=`X X%
-  \else\ifnum\appendixno=`Y Y%
-  \else\ifnum\appendixno=`Z Z%
-  % The \the is necessary, despite appearances, because \appendixletter is
-  % expanded while writing the .toc file.  \char\appendixno is not
-  % expandable, thus it is written literally, thus all appendixes come out
-  % with the same letter (or @) in the toc without it.
-  \else\char\the\appendixno
-  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
-  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
-
-% Each @chapter defines this as the name of the chapter.
-% page headings and footings can use it.  @section does likewise.
-\def\thischapter{}
-\def\thissection{}
-
-\newcount\absseclevel % used to calculate proper heading level
-\newcount\secbase\secbase=0 % @raise/lowersections modify this count
-
-% @raisesections: treat @section as chapter, @subsection as section, etc.
-\def\raisesections{\global\advance\secbase by -1}
-\let\up=\raisesections % original BFox name
-
-% @lowersections: treat @chapter as section, @section as subsection, etc.
-\def\lowersections{\global\advance\secbase by 1}
-\let\down=\lowersections % original BFox name
-
-% Choose a numbered-heading macro
-% #1 is heading level if unmodified by @raisesections or @lowersections
-% #2 is text for heading
-\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \chapterzzz{#2}
-\or
-  \seczzz{#2}
-\or
-  \numberedsubseczzz{#2}
-\or
-  \numberedsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \chapterzzz{#2}
-  \else
-    \numberedsubsubseczzz{#2}
-  \fi
-\fi
-}
-
-% like \numhead, but chooses appendix heading levels
-\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \appendixzzz{#2}
-\or
-  \appendixsectionzzz{#2}
-\or
-  \appendixsubseczzz{#2}
-\or
-  \appendixsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \appendixzzz{#2}
-  \else
-    \appendixsubsubseczzz{#2}
-  \fi
-\fi
-}
-
-% like \numhead, but chooses numberless heading levels
-\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
-\ifcase\absseclevel
-  \unnumberedzzz{#2}
-\or
-  \unnumberedseczzz{#2}
-\or
-  \unnumberedsubseczzz{#2}
-\or
-  \unnumberedsubsubseczzz{#2}
-\else
-  \ifnum \absseclevel<0
-    \unnumberedzzz{#2}
-  \else
-    \unnumberedsubsubseczzz{#2}
-  \fi
-\fi
-}
-
-% @chapter, @appendix, @unnumbered.
-\def\thischaptername{No Chapter Title}
-\outer\def\chapter{\parsearg\chapteryyy}
-\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
-\def\chapterzzz #1{%
-  \secno=0 \subsecno=0 \subsubsecno=0
-  \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
-  \chapmacro {#1}{\the\chapno}%
-  \gdef\thissection{#1}%
-  \gdef\thischaptername{#1}%
-  % We don't substitute the actual chapter name into \thischapter
-  % because we don't want its macros evaluated now.
-  \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
-  \writetocentry{chap}{#1}{{\the\chapno}}
-  \donoderef
-  \global\let\section = \numberedsec
-  \global\let\subsection = \numberedsubsec
-  \global\let\subsubsection = \numberedsubsubsec
-}
-
-% we use \chapno to avoid indenting back
-\def\appendixbox#1{%
-  \setbox0 = \hbox{\putwordAppendix{} \the\chapno}%
-  \hbox to \wd0{#1\hss}}
-
-\outer\def\appendix{\parsearg\appendixyyy}
-\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
-\def\appendixzzz #1{%
-  \secno=0 \subsecno=0 \subsubsecno=0
-  \global\advance \appendixno by 1
-  \message{\putwordAppendix\space \appendixletter}%
-  \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}%
-  \gdef\thissection{#1}%
-  \gdef\thischaptername{#1}%
-  \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
-  \writetocentry{appendix}{#1}{{\appendixletter}}
-  \appendixnoderef
-  \global\let\section = \appendixsec
-  \global\let\subsection = \appendixsubsec
-  \global\let\subsubsection = \appendixsubsubsec
-}
-
-% @centerchap is like @unnumbered, but the heading is centered.
-\outer\def\centerchap{\parsearg\centerchapyyy}
-\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
-
-% @top is like @unnumbered.
-\outer\def\top{\parsearg\unnumberedyyy}
-
-\outer\def\unnumbered{\parsearg\unnumberedyyy}
-\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
-\def\unnumberedzzz #1{%
-  \secno=0 \subsecno=0 \subsubsecno=0
-  %
-  % This used to be simply \message{#1}, but TeX fully expands the
-  % argument to \message.  Therefore, if #1 contained @-commands, TeX
-  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
-  % expanded @cite (which turns out to cause errors because \cite is meant
-  % to be executed, not expanded).
-  %
-  % Anyway, we don't want the fully-expanded definition of @cite to appear
-  % as a result of the \message, we just want `@cite' itself.  We use
-  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
-  % simply yielding the contents of <toks register>.  (We also do this for
-  % the toc entries.)
-  \toks0 = {#1}\message{(\the\toks0)}%
-  %
-  \unnumbchapmacro {#1}%
-  \gdef\thischapter{#1}\gdef\thissection{#1}%
-  \writetocentry{unnumbchap}{#1}{{\the\chapno}}
-  \unnumbnoderef
-  \global\let\section = \unnumberedsec
-  \global\let\subsection = \unnumberedsubsec
-  \global\let\subsubsection = \unnumberedsubsubsec
-}
-
-% Sections.
-\outer\def\numberedsec{\parsearg\secyyy}
-\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
-\def\seczzz #1{%
-  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-  \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
-  \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}}
-  \donoderef
-  \nobreak
-}
-
-\outer\def\appendixsection{\parsearg\appendixsecyyy}
-\outer\def\appendixsec{\parsearg\appendixsecyyy}
-\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
-\def\appendixsectionzzz #1{%
-  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
-  \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
-  \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}}
-  \appendixnoderef
-  \nobreak
-}
-
-\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
-\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
-\def\unnumberedseczzz #1{%
-  \plainsecheading {#1}\gdef\thissection{#1}%
-  \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}}
-  \unnumbnoderef
-  \nobreak
-}
-
-% Subsections.
-\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
-\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
-\def\numberedsubseczzz #1{%
-  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-  \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
-  \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
-  \donoderef
-  \nobreak
-}
-
-\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
-\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
-\def\appendixsubseczzz #1{%
-  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
-  \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
-  \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}}
-  \appendixnoderef
-  \nobreak
-}
-
-\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
-\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
-\def\unnumberedsubseczzz #1{%
-  \plainsubsecheading {#1}\gdef\thissection{#1}%
-  \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
-  \unnumbnoderef
-  \nobreak
-}
-
-% Subsubsections.
-\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
-\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
-\def\numberedsubsubseczzz #1{%
-  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-  \subsubsecheading {#1}
-    {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-  \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
-  \donoderef
-  \nobreak
-}
-
-\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
-\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
-\def\appendixsubsubseczzz #1{%
-  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
-  \subsubsecheading {#1}
-    {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
-  \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
-  \appendixnoderef
-  \nobreak
-}
-
-\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
-\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
-\def\unnumberedsubsubseczzz #1{%
-  \plainsubsubsecheading {#1}\gdef\thissection{#1}%
-  \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
-  \unnumbnoderef
-  \nobreak
-}
-
-% These are variants which are not "outer", so they can appear in @ifinfo.
-% Actually, they should now be obsolete; ordinary section commands should work.
-\def\infotop{\parsearg\unnumberedzzz}
-\def\infounnumbered{\parsearg\unnumberedzzz}
-\def\infounnumberedsec{\parsearg\unnumberedseczzz}
-\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
-\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
-
-\def\infoappendix{\parsearg\appendixzzz}
-\def\infoappendixsec{\parsearg\appendixseczzz}
-\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
-\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
-
-\def\infochapter{\parsearg\chapterzzz}
-\def\infosection{\parsearg\sectionzzz}
-\def\infosubsection{\parsearg\subsectionzzz}
-\def\infosubsubsection{\parsearg\subsubsectionzzz}
-
-% These macros control what the section commands do, according
-% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
-% Define them by default for a numbered chapter.
-\global\let\section = \numberedsec
-\global\let\subsection = \numberedsubsec
-\global\let\subsubsection = \numberedsubsubsec
-
-% Define @majorheading, @heading and @subheading
-
-% NOTE on use of \vbox for chapter headings, section headings, and such:
-%       1) We use \vbox rather than the earlier \line to permit
-%          overlong headings to fold.
-%       2) \hyphenpenalty is set to 10000 because hyphenation in a
-%          heading is obnoxious; this forbids it.
-%       3) Likewise, headings look best if no \parindent is used, and
-%          if justification is not attempted.  Hence \raggedright.
-
-
-\def\majorheading{\parsearg\majorheadingzzz}
-\def\majorheadingzzz #1{%
-  {\advance\chapheadingskip by 10pt \chapbreak }%
-  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                    \parindent=0pt\raggedright
-                    \rm #1\hfill}}\bigskip \par\penalty 200}
-
-\def\chapheading{\parsearg\chapheadingzzz}
-\def\chapheadingzzz #1{\chapbreak %
-  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                    \parindent=0pt\raggedright
-                    \rm #1\hfill}}\bigskip \par\penalty 200}
-
-% @heading, @subheading, @subsubheading.
-\def\heading{\parsearg\plainsecheading}
-\def\subheading{\parsearg\plainsubsecheading}
-\def\subsubheading{\parsearg\plainsubsubsecheading}
-
-% These macros generate a chapter, section, etc. heading only
-% (including whitespace, linebreaking, etc. around it),
-% given all the information in convenient, parsed form.
-
-%%% Args are the skip and penalty (usually negative)
-\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
-
-\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
-
-%%% Define plain chapter starts, and page on/off switching for it
-% Parameter controlling skip before chapter headings (if needed)
-
-\newskip\chapheadingskip
-
-\def\chapbreak{\dobreak \chapheadingskip {-4000}}
-\def\chappager{\par\vfill\supereject}
-\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
-
-\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
-
-\def\CHAPPAGoff{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chapbreak
-\global\let\pagealignmacro=\chappager}
-
-\def\CHAPPAGon{%
-\global\let\contentsalignmacro = \chappager
-\global\let\pchapsepmacro=\chappager
-\global\let\pagealignmacro=\chappager
-\global\def\HEADINGSon{\HEADINGSsingle}}
-
-\def\CHAPPAGodd{
-\global\let\contentsalignmacro = \chapoddpage
-\global\let\pchapsepmacro=\chapoddpage
-\global\let\pagealignmacro=\chapoddpage
-\global\def\HEADINGSon{\HEADINGSdouble}}
-
-\CHAPPAGon
-
-\def\CHAPFplain{
-\global\let\chapmacro=\chfplain
-\global\let\unnumbchapmacro=\unnchfplain
-\global\let\centerchapmacro=\centerchfplain}
-
-% Plain chapter opening.
-% #1 is the text, #2 the chapter number or empty if unnumbered.
-\def\chfplain#1#2{%
-  \pchapsepmacro
-  {%
-    \chapfonts \rm
-    \def\chapnum{#2}%
-    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
-    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
-          \hangindent = \wd0 \centerparametersmaybe
-          \unhbox0 #1\par}%
-  }%
-  \nobreak\bigskip % no page break after a chapter title
-  \nobreak
-}
-
-% Plain opening for unnumbered.
-\def\unnchfplain#1{\chfplain{#1}{}}
-
-% @centerchap -- centered and unnumbered.
-\let\centerparametersmaybe = \relax
-\def\centerchfplain#1{{%
-  \def\centerparametersmaybe{%
-    \advance\rightskip by 3\rightskip
-    \leftskip = \rightskip
-    \parfillskip = 0pt
-  }%
-  \chfplain{#1}{}%
-}}
-
-\CHAPFplain % The default
-
-\def\unnchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                       \parindent=0pt\raggedright
-                       \rm #1\hfill}}\bigskip \par\nobreak
-}
-
-\def\chfopen #1#2{\chapoddpage {\chapfonts
-\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
-\par\penalty 5000 %
-}
-
-\def\centerchfopen #1{%
-\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                       \parindent=0pt
-                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
-}
-
-\def\CHAPFopen{
-\global\let\chapmacro=\chfopen
-\global\let\unnumbchapmacro=\unnchfopen
-\global\let\centerchapmacro=\centerchfopen}
-
-
-% Section titles.
-\newskip\secheadingskip
-\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
-\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
-\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
-
-% Subsection titles.
-\newskip \subsecheadingskip
-\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
-\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
-\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
-
-% Subsubsection titles.
-\let\subsubsecheadingskip = \subsecheadingskip
-\let\subsubsecheadingbreak = \subsecheadingbreak
-\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
-\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
-
-
-% Print any size section title.
-%
-% #1 is the section type (sec/subsec/subsubsec), #2 is the section
-% number (maybe empty), #3 the text.
-\def\sectionheading#1#2#3{%
-  {%
-    \expandafter\advance\csname #1headingskip\endcsname by \parskip
-    \csname #1headingbreak\endcsname
-  }%
-  {%
-    % Switch to the right set of fonts.
-    \csname #1fonts\endcsname \rm
-    %
-    % Only insert the separating space if we have a section number.
-    \def\secnum{#2}%
-    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
-    %
-    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
-          \hangindent = \wd0 % zero if no section number
-          \unhbox0 #3}%
-  }%
-  % Add extra space after the heading -- either a line space or a
-  % paragraph space, whichever is more.  (Some people like to set
-  % \parskip to large values for some reason.)  Don't allow stretch, though.
-  \nobreak
-  \ifdim\parskip>\normalbaselineskip
-    \kern\parskip
-  \else
-    \kern\normalbaselineskip
-  \fi
-  \nobreak
-}
-
-
-\message{toc,}
-% Table of contents.
-\newwrite\tocfile
-
-% Write an entry to the toc file, opening it if necessary.
-% Called from @chapter, etc.  We supply {\folio} at the end of the
-% argument, which will end up as the last argument to the \...entry macro.
-%
-% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}}
-% We open the .toc file for writing here instead of at @setfilename (or
-% any other fixed time) so that @contents can be anywhere in the document.
-%
-\newif\iftocfileopened
-\def\writetocentry#1#2#3{%
-  \iftocfileopened\else
-    \immediate\openout\tocfile = \jobname.toc
-    \global\tocfileopenedtrue
-  \fi
-  %
-  \iflinks
-    \toks0 = {#2}%
-    \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}%
-    \temp
-  \fi
-  %
-  % Tell \shipout to create a page destination if we're doing pdf, which
-  % will be the target of the links in the table of contents.  We can't
-  % just do it on every page because the title pages are numbered 1 and
-  % 2 (the page numbers aren't printed), and so are the first two pages
-  % of the document.  Thus, we'd have two destinations named `1', and
-  % two named `2'.
-  \ifpdf \pdfmakepagedesttrue \fi
-}
-
-\newskip\contentsrightmargin \contentsrightmargin=1in
-\newcount\savepageno
-\newcount\lastnegativepageno \lastnegativepageno = -1
-
-% Finish up the main text and prepare to read what we've written
-% to \tocfile.
-%
-\def\startcontents#1{%
-   % If @setchapternewpage on, and @headings double, the contents should
-   % start on an odd page, unlike chapters.  Thus, we maintain
-   % \contentsalignmacro in parallel with \pagealignmacro.
-   % From: Torbjorn Granlund <tege@matematik.su.se>
-   \contentsalignmacro
-   \immediate\closeout\tocfile
-   %
-   % Don't need to put `Contents' or `Short Contents' in the headline.
-   % It is abundantly clear what they are.
-   \unnumbchapmacro{#1}\def\thischapter{}%
-   \savepageno = \pageno
-   \begingroup                  % Set up to handle contents files properly.
-      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
-      % We can't do this, because then an actual ^ in a section
-      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
-      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
-      \raggedbottom             % Worry more about breakpoints than the bottom.
-      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
-      %
-      % Roman numerals for page numbers.
-      \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
-}
-
-
-% Normal (long) toc.
-\def\contents{%
-   \startcontents{\putwordTOC}%
-     \openin 1 \jobname.toc
-     \ifeof 1 \else
-       \closein 1
-       \input \jobname.toc
-     \fi
-     \vfill \eject
-     \contentsalignmacro % in case @setchapternewpage odd is in effect
-     \pdfmakeoutlines
-   \endgroup
-   \lastnegativepageno = \pageno
-   \global\pageno = \savepageno
-}
-
-% And just the chapters.
-\def\summarycontents{%
-   \startcontents{\putwordShortTOC}%
-      %
-      \let\chapentry = \shortchapentry
-      \let\appendixentry = \shortappendixentry
-      \let\unnumbchapentry = \shortunnumberedentry
-      % We want a true roman here for the page numbers.
-      \secfonts
-      \let\rm=\shortcontrm \let\bf=\shortcontbf
-      \let\sl=\shortcontsl \let\tt=\shortconttt
-      \rm
-      \hyphenpenalty = 10000
-      \advance\baselineskip by 1pt % Open it up a little.
-      \def\secentry ##1##2##3##4{}
-      \def\subsecentry ##1##2##3##4##5{}
-      \def\subsubsecentry ##1##2##3##4##5##6{}
-      \let\unnumbsecentry = \secentry
-      \let\unnumbsubsecentry = \subsecentry
-      \let\unnumbsubsubsecentry = \subsubsecentry
-      \openin 1 \jobname.toc
-      \ifeof 1 \else
-        \closein 1
-        \input \jobname.toc
-      \fi
-     \vfill \eject
-     \contentsalignmacro % in case @setchapternewpage odd is in effect
-   \endgroup
-   \lastnegativepageno = \pageno
-   \global\pageno = \savepageno
-}
-\let\shortcontents = \summarycontents
-
-\ifpdf
-  \pdfcatalog{/PageMode /UseOutlines}%
-\fi
-
-% These macros generate individual entries in the table of contents.
-% The first argument is the chapter or section name.
-% The last argument is the page number.
-% The arguments in between are the chapter number, section number, ...
-
-% Chapters, in the main contents.
-\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
-%
-% Chapters, in the short toc.
-% See comments in \dochapentry re vbox and related settings.
-\def\shortchapentry#1#2#3{%
-  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
-}
-
-% Appendices, in the main contents.
-\def\appendixentry#1#2#3{%
-  \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}}
-%
-% Appendices, in the short toc.
-\let\shortappendixentry = \shortchapentry
-
-% Typeset the label for a chapter or appendix for the short contents.
-% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
-% We could simplify the code here by writing out an \appendixentry
-% command in the toc file for appendices, instead of using \chapentry
-% for both, but it doesn't seem worth it.
-%
-\newdimen\shortappendixwidth
-%
-\def\shortchaplabel#1{%
-  % This space should be enough, since a single number is .5em, and the
-  % widest letter (M) is 1em, at least in the Computer Modern fonts.
-  % But use \hss just in case.
-  % (This space doesn't include the extra space that gets added after
-  % the label; that gets put in by \shortchapentry above.)
-  \dimen0 = 1em
-  \hbox to \dimen0{#1\hss}%
-}
-
-% Unnumbered chapters.
-\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}}
-\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}}
-
-% Sections.
-\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
-\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}}
-
-% Subsections.
-\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
-\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}}
-
-% And subsubsections.
-\def\subsubsecentry#1#2#3#4#5#6{%
-  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
-\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}}
-
-% This parameter controls the indentation of the various levels.
-\newdimen\tocindent \tocindent = 3pc
-
-% Now for the actual typesetting. In all these, #1 is the text and #2 is the
-% page number.
-%
-% If the toc has to be broken over pages, we want it to be at chapters
-% if at all possible; hence the \penalty.
-\def\dochapentry#1#2{%
-   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
-   \begingroup
-     \chapentryfonts
-     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-   \endgroup
-   \nobreak\vskip .25\baselineskip plus.1\baselineskip
-}
-
-\def\dosecentry#1#2{\begingroup
-  \secentryfonts \leftskip=\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsecentry#1#2{\begingroup
-  \subsecentryfonts \leftskip=2\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-\def\dosubsubsecentry#1#2{\begingroup
-  \subsubsecentryfonts \leftskip=3\tocindent
-  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
-\endgroup}
-
-% Final typesetting of a toc entry; we use the same \entry macro as for
-% the index entries, but we want to suppress hyphenation here.  (We
-% can't do that in the \entry macro, since index entries might consist
-% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
-\def\tocentry#1#2{\begingroup
-  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
-  % Do not use \turnoffactive in these arguments.  Since the toc is
-  % typeset in cmr, characters such as _ would come out wrong; we
-  % have to do the usual translation tricks.
-  \entry{#1}{#2}%
-\endgroup}
-
-% Space between chapter (or whatever) number and the title.
-\def\labelspace{\hskip1em \relax}
-
-\def\dopageno#1{{\rm #1}}
-\def\doshortpageno#1{{\rm #1}}
-
-\def\chapentryfonts{\secfonts \rm}
-\def\secentryfonts{\textfonts}
-\let\subsecentryfonts = \textfonts
-\let\subsubsecentryfonts = \textfonts
-
-
-\message{environments,}
-% @foo ... @end foo.
-
-% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
-% 
-% Since these characters are used in examples, it should be an even number of
-% \tt widths. Each \tt character is 1en, so two makes it 1em.
-%
-\def\point{$\star$}
-\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
-\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
-\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
-\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
-
-% The @error{} command.
-% Adapted from the TeXbook's \boxit.
-% 
-\newbox\errorbox
-%
-{\tentt \global\dimen0 = 3em}% Width of the box.
-\dimen2 = .55pt % Thickness of rules
-% The text. (`r' is open on the right, `e' somewhat less so on the left.)
-\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
-%
-\global\setbox\errorbox=\hbox to \dimen0{\hfil
-   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
-   \advance\hsize by -2\dimen2 % Rules.
-   \vbox{
-      \hrule height\dimen2
-      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
-         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
-         \kern3pt\vrule width\dimen2}% Space to right.
-      \hrule height\dimen2}
-    \hfil}
-%
-\def\error{\leavevmode\lower.7ex\copy\errorbox}
-
-% @tex ... @end tex    escapes into raw Tex temporarily.
-% One exception: @ is still an escape character, so that @end tex works.
-% But \@ or @@ will get a plain tex @ character.
-
-\def\tex{\begingroup
-  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
-  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
-  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
-  \catcode `\%=14
-  \catcode `\+=\other
-  \catcode `\"=\other
-  \catcode `\==\other
-  \catcode `\|=\other
-  \catcode `\<=\other
-  \catcode `\>=\other
-  \escapechar=`\\
-  %
-  \let\b=\ptexb
-  \let\bullet=\ptexbullet
-  \let\c=\ptexc
-  \let\,=\ptexcomma
-  \let\.=\ptexdot
-  \let\dots=\ptexdots
-  \let\equiv=\ptexequiv
-  \let\!=\ptexexclam
-  \let\i=\ptexi
-  \let\{=\ptexlbrace
-  \let\+=\tabalign
-  \let\}=\ptexrbrace
-  \let\*=\ptexstar
-  \let\t=\ptext
-  %
-  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
-  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
-  \def\@{@}%
-\let\Etex=\endgroup}
-
-% Define @lisp ... @end lisp.
-% @lisp does a \begingroup so it can rebind things,
-% including the definition of @end lisp (which normally is erroneous).
-
-% Amount to narrow the margins by for @lisp.
-\newskip\lispnarrowing \lispnarrowing=0.4in
-
-% This is the definition that ^^M gets inside @lisp, @example, and other
-% such environments.  \null is better than a space, since it doesn't
-% have any width.
-\def\lisppar{\null\endgraf}
-
-% Make each space character in the input produce a normal interword
-% space in the output.  Don't allow a line break at this space, as this
-% is used only in environments like @example, where each line of input
-% should produce a line of output anyway.
-%
-{\obeyspaces %
-\gdef\sepspaces{\obeyspaces\let =\tie}}
-
-% Define \obeyedspace to be our active space, whatever it is.  This is
-% for use in \parsearg.
-{\sepspaces%
-\global\let\obeyedspace= }
-
-% This space is always present above and below environments.
-\newskip\envskipamount \envskipamount = 0pt
-
-% Make spacing and below environment symmetrical.  We use \parskip here
-% to help in doing that, since in @example-like environments \parskip
-% is reset to zero; thus the \afterenvbreak inserts no space -- but the
-% start of the next paragraph will insert \parskip.
-%
-\def\aboveenvbreak{{%
-  % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
-  \ifnum \lastpenalty=10000 \else
-    \advance\envskipamount by \parskip
-    \endgraf
-    \ifdim\lastskip<\envskipamount
-      \removelastskip
-      % it's not a good place to break if the last penalty was \nobreak
-      % or better ...
-      \ifnum\lastpenalty>10000 \else \penalty-50 \fi
-      \vskip\envskipamount
-    \fi
-  \fi
-}}
-
-\let\afterenvbreak = \aboveenvbreak
-
-% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
-\let\nonarrowing=\relax
-
-% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
-% environment contents.
-\font\circle=lcircle10
-\newdimen\circthick
-\newdimen\cartouter\newdimen\cartinner
-\newskip\normbskip\newskip\normpskip\newskip\normlskip
-\circthick=\fontdimen8\circle
-%
-\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
-\def\ctr{{\hskip 6pt\circle\char'010}}
-\def\cbl{{\circle\char'012\hskip -6pt}}
-\def\cbr{{\hskip 6pt\circle\char'011}}
-\def\carttop{\hbox to \cartouter{\hskip\lskip
-        \ctl\leaders\hrule height\circthick\hfil\ctr
-        \hskip\rskip}}
-\def\cartbot{\hbox to \cartouter{\hskip\lskip
-        \cbl\leaders\hrule height\circthick\hfil\cbr
-        \hskip\rskip}}
-%
-\newskip\lskip\newskip\rskip
-
-\def\cartouche{%
-\par  % can't be in the midst of a paragraph.
-\begingroup
-        \lskip=\leftskip \rskip=\rightskip
-        \leftskip=0pt\rightskip=0pt %we want these *outside*.
-        \cartinner=\hsize \advance\cartinner by-\lskip
-                          \advance\cartinner by-\rskip
-        \cartouter=\hsize
-        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
-%                                    side, and for 6pt waste from
-%                                    each corner char, and rule thickness
-        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
-        % Flag to tell @lisp, etc., not to narrow margin.
-        \let\nonarrowing=\comment
-        \vbox\bgroup
-                \baselineskip=0pt\parskip=0pt\lineskip=0pt
-                \carttop
-                \hbox\bgroup
-                        \hskip\lskip
-                        \vrule\kern3pt
-                        \vbox\bgroup
-                                \hsize=\cartinner
-                                \kern3pt
-                                \begingroup
-                                        \baselineskip=\normbskip
-                                        \lineskip=\normlskip
-                                        \parskip=\normpskip
-                                        \vskip -\parskip
-\def\Ecartouche{%
-                                \endgroup
-                                \kern3pt
-                        \egroup
-                        \kern3pt\vrule
-                        \hskip\rskip
-                \egroup
-                \cartbot
-        \egroup
-\endgroup
-}}
-
-
-% This macro is called at the beginning of all the @example variants,
-% inside a group.
-\def\nonfillstart{%
-  \aboveenvbreak
-  \inENV % This group ends at the end of the body
-  \hfuzz = 12pt % Don't be fussy
-  \sepspaces % Make spaces be word-separators rather than space tokens.
-  \let\par = \lisppar % don't ignore blank lines
-  \obeylines % each line of input is a line of output
-  \parskip = 0pt
-  \parindent = 0pt
-  \emergencystretch = 0pt % don't try to avoid overfull boxes
-  % @cartouche defines \nonarrowing to inhibit narrowing
-  % at next level down.
-  \ifx\nonarrowing\relax
-    \advance \leftskip by \lispnarrowing
-    \exdentamount=\lispnarrowing
-    \let\exdent=\nofillexdent
-    \let\nonarrowing=\relax
-  \fi
-}
-
-% Define the \E... control sequence only if we are inside the particular
-% environment, so the error checking in \end will work.
-%
-% To end an @example-like environment, we first end the paragraph (via
-% \afterenvbreak's vertical glue), and then the group.  That way we keep
-% the zero \parskip that the environments set -- \parskip glue will be
-% inserted at the beginning of the next paragraph in the document, after
-% the environment.
-%
-\def\nonfillfinish{\afterenvbreak\endgroup}
-
-% @lisp: indented, narrowed, typewriter font.
-\def\lisp{\begingroup
-  \nonfillstart
-  \let\Elisp = \nonfillfinish
-  \tt
-  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
-  \gobble       % eat return
-}
-
-% @example: Same as @lisp.
-\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
-
-% @smallexample and @smalllisp: use smaller fonts.
-% Originally contributed by Pavel@xerox.
-\def\smalllisp{\begingroup
-  \def\Esmalllisp{\nonfillfinish\endgroup}%
-  \def\Esmallexample{\nonfillfinish\endgroup}%
-  \smallexamplefonts
-  \lisp
-}
-\let\smallexample = \smalllisp
-
-
-% @display: same as @lisp except keep current font.
-%
-\def\display{\begingroup
-  \nonfillstart
-  \let\Edisplay = \nonfillfinish
-  \gobble
-}
-%
-% @smalldisplay: @display plus smaller fonts.
-%
-\def\smalldisplay{\begingroup
-  \def\Esmalldisplay{\nonfillfinish\endgroup}%
-  \smallexamplefonts \rm
-  \display
-}
-
-% @format: same as @display except don't narrow margins.
-%
-\def\format{\begingroup
-  \let\nonarrowing = t
-  \nonfillstart
-  \let\Eformat = \nonfillfinish
-  \gobble
-}
-%
-% @smallformat: @format plus smaller fonts.
-%
-\def\smallformat{\begingroup
-  \def\Esmallformat{\nonfillfinish\endgroup}%
-  \smallexamplefonts \rm
-  \format
-}
-
-% @flushleft (same as @format).
-%
-\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
-
-% @flushright.
-%
-\def\flushright{\begingroup
-  \let\nonarrowing = t
-  \nonfillstart
-  \let\Eflushright = \nonfillfinish
-  \advance\leftskip by 0pt plus 1fill
-  \gobble
-}
-
-
-% @quotation does normal linebreaking (hence we can't use \nonfillstart)
-% and narrows the margins.
-%
-\def\quotation{%
-  \begingroup\inENV %This group ends at the end of the @quotation body
-  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
-  \parindent=0pt
-  % We have retained a nonzero parskip for the environment, since we're
-  % doing normal filling. So to avoid extra space below the environment...
-  \def\Equotation{\parskip = 0pt \nonfillfinish}%
-  %
-  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
-  \ifx\nonarrowing\relax
-    \advance\leftskip by \lispnarrowing
-    \advance\rightskip by \lispnarrowing
-    \exdentamount = \lispnarrowing
-    \let\nonarrowing = \relax
-  \fi
-}
-
-
-% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
-% If we want to allow any <char> as delimiter, 
-% we need the curly braces so that makeinfo sees the @verb command, eg:
-% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
-%
-% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
-%
-% [Knuth] p.344; only we need to do the other characters Texinfo sets
-% active too.  Otherwise, they get lost as the first character on a
-% verbatim line.
-\def\dospecials{%
-  \do\ \do\\\do\{\do\}\do\$\do\&%
-  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
-  \do\<\do\>\do\|\do\@\do+\do\"%
-}
-%
-% [Knuth] p. 380
-\def\uncatcodespecials{%
-  \def\do##1{\catcode`##1=12}\dospecials}
-%
-% [Knuth] pp. 380,381,391
-% Disable Spanish ligatures ?` and !` of \tt font
-\begingroup
-  \catcode`\`=\active\gdef`{\relax\lq}
-\endgroup
-%
-% Setup for the @verb command.
-%
-% Eight spaces for a tab
-\begingroup
-  \catcode`\^^I=\active
-  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
-\endgroup
-%
-\def\setupverb{%
-  \tt  % easiest (and conventionally used) font for verbatim
-  \def\par{\leavevmode\endgraf}%
-  \catcode`\`=\active
-  \tabeightspaces
-  % Respect line breaks,
-  % print special symbols as themselves, and
-  % make each space count
-  % must do in this order:
-  \obeylines \uncatcodespecials \sepspaces
-}
-
-% Setup for the @verbatim environment
-%
-% Real tab expansion
-\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
-%
-\def\starttabbox{\setbox0=\hbox\bgroup}
-\begingroup
-  \catcode`\^^I=\active
-  \gdef\tabexpand{%
-    \catcode`\^^I=\active
-    \def^^I{\leavevmode\egroup
-      \dimen0=\wd0 % the width so far, or since the previous tab
-      \divide\dimen0 by\tabw
-      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
-      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
-      \wd0=\dimen0 \box0 \starttabbox
-    }%
-  }
-\endgroup
-\def\setupverbatim{%
-  % Easiest (and conventionally used) font for verbatim
-  \tt
-  \def\par{\leavevmode\egroup\box0\endgraf}%
-  \catcode`\`=\active
-  \tabexpand
-  % Respect line breaks,
-  % print special symbols as themselves, and
-  % make each space count
-  % must do in this order:
-  \obeylines \uncatcodespecials \sepspaces
-  \everypar{\starttabbox}%
-}
-
-% Do the @verb magic: verbatim text is quoted by unique 
-% delimiter characters.  Before first delimiter expect a 
-% right brace, after last delimiter expect closing brace:
-%
-%    \def\doverb'{'<char>#1<char>'}'{#1}
-%
-% [Knuth] p. 382; only eat outer {}
-\begingroup
-  \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
-  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
-\endgroup
-%
-\def\verb{\begingroup\setupverb\doverb}
-%
-%
-% Do the @verbatim magic: define the macro \doverbatim so that
-% the (first) argument ends when '@end verbatim' is reached, ie:
-%
-%     \def\doverbatim#1@end verbatim{#1}
-%
-% For Texinfo it's a lot easier than for LaTeX, 
-% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
-% we need not redefine '\', '{' and '}'.
-%
-% Inspired by LaTeX's verbatim command set [latex.ltx]
-%% Include LaTeX hack for completeness -- never know
-%% \begingroup
-%% \catcode`|=0 \catcode`[=1
-%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
-%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
-%% #1|endgroup|def|Everbatim[]|end[verbatim]]
-%% |endgroup
-%
-\begingroup
-  \catcode`\ =\active
-  \obeylines %
-  % ignore everything up to the first ^^M, that's the newline at the end
-  % of the @verbatim input line itself.  Otherwise we get an extra blank
-  % line in the output.
-  \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
-\endgroup
-%
-\def\verbatim{%
-  \def\Everbatim{\nonfillfinish\endgroup}%
-  \begingroup
-    \nonfillstart
-    \advance\leftskip by -\defbodyindent
-    \begingroup\setupverbatim\doverbatim
-}
-
-% @verbatiminclude FILE - insert text of file in verbatim environment.
-%
-% Allow normal characters that we make active in the argument (a file name).
-\def\verbatiminclude{%
-  \begingroup
-    \catcode`\\=\other
-    \catcode`~=\other
-    \catcode`^=\other
-    \catcode`_=\other
-    \catcode`|=\other
-    \catcode`<=\other
-    \catcode`>=\other
-    \catcode`+=\other
-    \parsearg\doverbatiminclude
-}
-\def\setupverbatiminclude{%
-  \begingroup
-    \nonfillstart
-    \advance\leftskip by -\defbodyindent
-    \begingroup\setupverbatim
-}
-%
-\def\doverbatiminclude#1{%
-     % Restore active chars for included file.
-  \endgroup
-  \begingroup
-    \let\value=\expandablevalue
-    \def\thisfile{#1}%
-    \expandafter\expandafter\setupverbatiminclude\input\thisfile
-  \endgroup
-  \nonfillfinish
-  \endgroup
-}
-
-% @copying ... @end copying.
-% Save the text away for @insertcopying later.  Many commands won't be
-% allowed in this context, but that's ok.
-% 
-% We save the uninterpreted tokens, rather than creating a box.
-% Saving the text in a box would be much easier, but then all the
-% typesetting commands (@smallbook, font changes, etc.) have to be done
-% beforehand -- and a) we want @copying to be done first in the source
-% file; b) letting users define the frontmatter in as flexible order as
-% possible is very desirable.
-% 
-\def\copying{\begingroup
-  % Define a command to swallow text until we reach `@end copying'.
-  % \ is the escape char in this texinfo.tex file, so it is the
-  % delimiter for the command; @ will be the escape char when we read
-  % it, but that doesn't matter.
-  \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
-  %
-  % We must preserve ^^M's in the input file; see \insertcopying below.
-  \catcode`\^^M = \active
-  \docopying
-}
-
-% What we do to finish off the copying text.
-%
-\def\enddocopying{\endgroup\ignorespaces}
-
-% @insertcopying.  Here we must play games with ^^M's.  On the one hand,
-% we need them to delimit commands such as `@end quotation', so they
-% must be active.  On the other hand, we certainly don't want every
-% end-of-line to be a \par, as would happen with the normal active
-% definition of ^^M.  On the third hand, two ^^M's in a row should still
-% generate a \par.
-% 
-% Our approach is to make ^^M insert a space and a penalty1 normally;
-% then it can also check if \lastpenalty=1.  If it does, then manually
-% do \par.
-% 
-% This messes up the normal definitions of @c[omment], so we redefine
-% it.  Similarly for @ignore.  (These commands are used in the gcc
-% manual for man page generation.)
-% 
-% Seems pretty fragile, most line-oriented commands will presumably
-% fail, but for the limited use of getting the copying text (which
-% should be quite simple) inserted, we can hope it's ok.
-%
-{\catcode`\^^M=\active %
-\gdef\insertcopying{\begingroup %
-  \parindent = 0pt  % looks wrong on title page
-  \def^^M{%
-    \ifnum \lastpenalty=1 %
-      \par %
-    \else %
-      \space \penalty 1 %
-    \fi %
-  }%
-  %
-  % Fix @c[omment] for catcode 13 ^^M's.
-  \def\c##1^^M{\ignorespaces}%
-  \let\comment = \c %
-  %
-  % Don't bother jumping through all the hoops that \doignore does, it
-  % would be very hard since the catcodes are already set.
-  \long\def\ignore##1\end ignore{\ignorespaces}%
-  %
-  \copyingtext %
-\endgroup}%
-}
-
-\message{defuns,}
-% @defun etc.
-
-% Allow user to change definition object font (\df) internally
-\def\setdeffont#1 {\csname DEF#1\endcsname}
-
-\newskip\defbodyindent \defbodyindent=.4in
-\newskip\defargsindent \defargsindent=50pt
-\newskip\deflastargmargin \deflastargmargin=18pt
-
-\newcount\parencount
-
-% We want ()&[] to print specially on the defun line.
-% 
-\def\activeparens{%
-  \catcode`\(=\active \catcode`\)=\active
-  \catcode`\&=\active
-  \catcode`\[=\active \catcode`\]=\active
-}
-
-% Make control sequences which act like normal parenthesis chars.
-\let\lparen = ( \let\rparen = )
-
-{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
-
-% Be sure that we always have a definition for `(', etc.  For example,
-% if the fn name has parens in it, \boldbrax will not be in effect yet,
-% so TeX would otherwise complain about undefined control sequence.
-\global\let(=\lparen \global\let)=\rparen
-\global\let[=\lbrack \global\let]=\rbrack
-
-\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
-\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
-% This is used to turn on special parens
-% but make & act ordinary (given that it's active).
-\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
-
-% Definitions of (, ) and & used in args for functions.
-% This is the definition of ( outside of all parentheses.
-\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
-  \global\advance\parencount by 1
-}
-%
-% This is the definition of ( when already inside a level of parens.
-\gdef\opnested{\char`\(\global\advance\parencount by 1 }
-%
-\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
-  % also in that case restore the outer-level definition of (.
-  \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
-  \global\advance \parencount by -1 }
-% If we encounter &foo, then turn on ()-hacking afterwards
-\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
-%
-\gdef\normalparens{\boldbrax\let&=\ampnr}
-} % End of definition inside \activeparens
-%% These parens (in \boldbrax) actually are a little bolder than the
-%% contained text.  This is especially needed for [ and ]
-\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
-\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
-\let\ampnr = \&
-\def\lbrb{{\bf\char`\[}}
-\def\rbrb{{\bf\char`\]}}
-
-% Active &'s sneak into the index arguments, so make sure it's defined.
-{
-  \catcode`& = \active
-  \global\let& = \ampnr
-}
-
-% \defname, which formats the name of the @def (not the args).
-% #1 is the function name.
-% #2 is the type of definition, such as "Function".
-%
-\def\defname#1#2{%
-  % How we'll output the type name.  Putting it in brackets helps
-  % distinguish it from the body text that may end up on the next line
-  % just below it.
-  \ifempty{#2}%
-    \def\defnametype{}%
-  \else
-    \def\defnametype{[\rm #2]}%
-  \fi
-  %
-  % Get the values of \leftskip and \rightskip as they were outside the @def...
-  \dimen2=\leftskip
-  \advance\dimen2 by -\defbodyindent
-  %
-  % Figure out values for the paragraph shape.
-  \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
-  \dimen0=\hsize \advance \dimen0 by -\wd0  % compute size for first line
-  \dimen1=\hsize \advance \dimen1 by -\defargsindent  % size for continuations
-  \parshape 2 0in \dimen0 \defargsindent \dimen1
-  %
-  % Output arg 2 ("Function" or some such) but stuck inside a box of
-  % width 0 so it does not interfere with linebreaking.
-  \noindent
-  %
-  {% Adjust \hsize to exclude the ambient margins,
-   % so that \rightline will obey them.
-   \advance \hsize by -\dimen2
-   \dimen3 = 0pt  % was -1.25pc
-   \rlap{\rightline{\defnametype\kern\dimen3}}%
-  }%
-  %
-  % Allow all lines to be underfull without complaint:
-  \tolerance=10000 \hbadness=10000
-  \advance\leftskip by -\defbodyindent
-  \exdentamount=\defbodyindent
-  {\df #1}\enskip        % output function name
-  % \defunargs will be called next to output the arguments, if any.
-}
-
-% Common pieces to start any @def...
-% #1 is the \E... control sequence to end the definition (which we define).
-% #2 is the \...x control sequence (which our caller defines).
-% #3 is the control sequence to process the header, such as \defunheader.
-% 
-\def\parsebodycommon#1#2#3{%
-  \begingroup\inENV
-  % If there are two @def commands in a row, we'll have a \nobreak,
-  % which is there to keep the function description together with its
-  % header.  But if there's nothing but headers, we want to allow a
-  % break after all.  Check for penalty 10002 (inserted by
-  % \defargscommonending) instead of 10000, since the sectioning
-  % commands insert a \penalty10000, and we don't want to allow a break
-  % between a section heading and a defun.
-  \ifnum\lastpenalty=10002 \penalty0 \fi
-  \medbreak
-  %
-  % Define the \E... end token that this defining construct specifies
-  % so that it will exit this group.
-  \def#1{\endgraf\endgroup\medbreak}%
-  %
-  \parindent=0in
-  \advance\leftskip by \defbodyindent
-  \exdentamount=\defbodyindent
-}
-
-% Common part of the \...x definitions.
-% 
-\def\defxbodycommon{%
-  % As with \parsebodycommon above, allow line break if we have multiple
-  % x headers in a row.  It's not a great place, though.
-  \ifnum\lastpenalty=10000 \penalty1000 \fi
-  %
-  \begingroup\obeylines
-}
-
-% Process body of @defun, @deffn, @defmac, etc.
-%
-\def\defparsebody#1#2#3{%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2{\defxbodycommon \activeparens \spacesplit#3}%
-  \catcode\equalChar=\active
-  \begingroup\obeylines\activeparens
-  \spacesplit#3%
-}
-
-% #1, #2, #3 are the common arguments (see \parsebodycommon above).
-% #4, delimited by the space, is the class name.
-%
-\def\defmethparsebody#1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
-  \begingroup\obeylines\activeparens
-  % The \empty here prevents misinterpretation of a construct such as
-  %   @deffn {whatever} {Enharmonic comma}
-  % See comments at \deftpparsebody, although in our case we don't have
-  % to remove the \empty afterwards, since it is empty.
-  \spacesplit{#3{#4}}\empty
-}
-
-% Used for @deftypemethod and @deftypeivar.
-% #1, #2, #3 are the common arguments (see \defparsebody).
-% #4, delimited by a space, is the class name.
-% #5 is the method's return type.
-%
-\def\deftypemethparsebody#1#2#3#4 #5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#4}{#5}}%
-}
-
-% Used for @deftypeop.  The change from \deftypemethparsebody is an
-% extra argument at the beginning which is the `category', instead of it
-% being the hardwired string `Method' or `Instance Variable'.  We have
-% to account for this both in the \...x definition and in parsing the
-% input at hand.  Thus also need a control sequence (passed as #5) for
-% the \E... definition to assign the category name to.
-% 
-\def\deftypeopparsebody#1#2#3#4#5 #6 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 ##3 {\def#4{##1}%
-    \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#5}{#6}}%
-}
-
-% For @defop.
-\def\defopparsebody #1#2#3#4#5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\def#4{##1}%
-    \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
-  \begingroup\obeylines\activeparens
-  \spacesplit{#3{#5}}%
-}
-
-% These parsing functions are similar to the preceding ones
-% except that they do not make parens into active characters.
-% These are used for "variables" since they have no arguments.
-%
-\def\defvarparsebody #1#2#3{%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2{\defxbodycommon \spacesplit#3}%
-  \catcode\equalChar=\active
-  \begingroup\obeylines
-  \spacesplit#3%
-}
-
-% @defopvar.
-\def\defopvarparsebody #1#2#3#4#5 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 ##2 {\def#4{##1}%
-    \defxbodycommon \spacesplit{#3{##2}}}%
-  \begingroup\obeylines
-  \spacesplit{#3{#5}}%
-}
-
-\def\defvrparsebody#1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
-  \begingroup\obeylines
-  \spacesplit{#3{#4}}%
-}
-
-% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
-% type is just `struct', because we lose the braces in `{struct
-% termios}' when \spacesplit reads its undelimited argument.  Sigh.
-% \let\deftpparsebody=\defvrparsebody
-%
-% So, to get around this, we put \empty in with the type name.  That
-% way, TeX won't find exactly `{...}' as an undelimited argument, and
-% won't strip off the braces.
-%
-\def\deftpparsebody #1#2#3#4 {%
-  \parsebodycommon{#1}{#2}{#3}%
-  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
-  \begingroup\obeylines
-  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
-}
-
-% Fine, but then we have to eventually remove the \empty *and* the
-% braces (if any).  That's what this does.
-%
-\def\removeemptybraces\empty#1\relax{#1}
-
-% After \spacesplit has done its work, this is called -- #1 is the final
-% thing to call, #2 the type name (which starts with \empty), and #3
-% (which might be empty) the arguments.
-%
-\def\parsetpheaderline#1#2#3{%
-  #1{\removeemptybraces#2\relax}{#3}%
-}%
-
-% Split up #2 (the rest of the input line) at the first space token.
-% call #1 with two arguments:
-%  the first is all of #2 before the space token,
-%  the second is all of #2 after that space token.
-% If #2 contains no space token, all of it is passed as the first arg
-% and the second is passed as empty.
-%
-{\obeylines %
- \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
- \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
-   \ifx\relax #3%
-     #1{#2}{}%
-   \else %
-     #1{#2}{#3#4}%
-   \fi}%
-}
-
-% Define @defun.
-
-% This is called to end the arguments processing for all the @def... commands.
-%
-\def\defargscommonending{%
-  \interlinepenalty = 10000
-  \advance\rightskip by 0pt plus 1fil
-  \endgraf
-  \nobreak\vskip -\parskip
-  \penalty 10002  % signal to \parsebodycommon.
-}
-
-% This expands the args and terminates the paragraph they comprise.
-% 
-\def\defunargs#1{\functionparens \sl
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-% Set the font temporarily and use \font in case \setfont made \tensl a macro.
-{\tensl\hyphenchar\font=0}%
-#1%
-{\tensl\hyphenchar\font=45}%
-\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
-  \defargscommonending
-}
-
-\def\deftypefunargs #1{%
-% Expand, preventing hyphenation at `-' chars.
-% Note that groups don't affect changes in \hyphenchar.
-% Use \boldbraxnoamp, not \functionparens, so that & is not special.
-\boldbraxnoamp
-\tclose{#1}% avoid \code because of side effects on active chars
-  \defargscommonending
-}
-
-% Do complete processing of one @defun or @defunx line already parsed.
-
-% @deffn Command forward-char nchars
-
-\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
-
-\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
-\catcode\equalChar=\other % Turn off change made in \defparsebody
-}
-
-% @defun == @deffn Function
-
-\def\defun{\defparsebody\Edefun\defunx\defunheader}
-
-\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDeffunc}%
-\defunargs {#2}\endgroup %
-\catcode\equalChar=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefun int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
-
-% #1 is the data type.  #2 is the name and args.
-\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
-% #1 is the data type, #2 the name, #3 the args.
-\def\deftypefunheaderx #1#2 #3\relax{%
-\doind {fn}{\code{#2}}% Make entry in function index
-\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
-\deftypefunargs {#3}\endgroup %
-\catcode\equalChar=\other % Turn off change made in \defparsebody
-}
-
-% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
-
-\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
-
-% \defheaderxcond#1\relax$.$
-% puts #1 in @code, followed by a space, but does nothing if #1 is null.
-\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
-
-% #1 is the classification.  #2 is the data type.  #3 is the name and args.
-\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
-% #1 is the classification, #2 the data type, #3 the name, #4 the args.
-\def\deftypefnheaderx #1#2#3 #4\relax{%
-\doind {fn}{\code{#3}}% Make entry in function index
-\begingroup
-\normalparens % notably, turn off `&' magic, which prevents
-%               at least some C++ text from working
-\defname {\defheaderxcond#2\relax$.$#3}{#1}%
-\deftypefunargs {#4}\endgroup %
-\catcode\equalChar=\other % Turn off change made in \defparsebody
-}
-
-% @defmac == @deffn Macro
-
-\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
-
-\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDefmac}%
-\defunargs {#2}\endgroup %
-\catcode\equalChar=\other % Turn off change made in \defparsebody
-}
-
-% @defspec == @deffn Special Form
-
-\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
-
-\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
-\begingroup\defname {#1}{\putwordDefspec}%
-\defunargs {#2}\endgroup %
-\catcode\equalChar=\other % Turn off change made in \defparsebody
-}
-
-% @defop CATEGORY CLASS OPERATION ARG...
-%
-\def\defop #1 {\def\defoptype{#1}%
-\defopparsebody\Edefop\defopx\defopheader\defoptype}
-%
-\def\defopheader#1#2#3{%
-  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
-  \begingroup
-    \defname{#2}{\defoptype\ \putwordon\ #1}%
-    \defunargs{#3}%
-  \endgroup
-}
-
-% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
-%
-\def\deftypeop #1 {\def\deftypeopcategory{#1}%
-  \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
-                       \deftypeopcategory}
-%
-% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
-\def\deftypeopheader#1#2#3#4{%
-  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
-  \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}
-            {\deftypeopcategory\ \putwordon\ \code{#1}}%
-    \deftypefunargs{#4}%
-  \endgroup
-}
-
-% @deftypemethod CLASS TYPE METHOD ARG...
-%
-\def\deftypemethod{%
-  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
-%
-% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
-\def\deftypemethodheader#1#2#3#4{%
-  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
-  \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
-    \deftypefunargs{#4}%
-  \endgroup
-}
-
-% @deftypeivar CLASS TYPE VARNAME
-%
-\def\deftypeivar{%
-  \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
-%
-% #1 is the class name, #2 the data type, #3 the variable name.
-\def\deftypeivarheader#1#2#3{%
-  \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
-  \begingroup
-    \defname{\defheaderxcond#2\relax$.$#3}
-            {\putwordInstanceVariableof\ \code{#1}}%
-    \defvarargs{#3}%
-  \endgroup
-}
-
-% @defmethod == @defop Method
-%
-\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
-%
-% #1 is the class name, #2 the method name, #3 the args.
-\def\defmethodheader#1#2#3{%
-  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
-  \begingroup
-    \defname{#2}{\putwordMethodon\ \code{#1}}%
-    \defunargs{#3}%
-  \endgroup
-}
-
-% @defcv {Class Option} foo-class foo-flag
-
-\def\defcv #1 {\def\defcvtype{#1}%
-\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
-
-\def\defcvarheader #1#2#3{%
-  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
-  \begingroup
-    \defname{#2}{\defcvtype\ \putwordof\ #1}%
-    \defvarargs{#3}%
-  \endgroup
-}
-
-% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
-%
-\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
-%
-\def\defivarheader#1#2#3{%
-  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
-  \begingroup
-    \defname{#2}{\putwordInstanceVariableof\ #1}%
-    \defvarargs{#3}%
-  \endgroup
-}
-
-% @defvar
-% First, define the processing that is wanted for arguments of @defvar.
-% This is actually simple: just print them in roman.
-% This must expand the args and terminate the paragraph they make up
-\def\defvarargs #1{\normalparens #1%
-  \defargscommonending
-}
-
-% @defvr Counter foo-count
-
-\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
-
-\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
-\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
-
-% @defvar == @defvr Variable
-
-\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
-
-\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{\putwordDefvar}%
-\defvarargs {#2}\endgroup %
-}
-
-% @defopt == @defvr {User Option}
-
-\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
-
-\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
-\begingroup\defname {#1}{\putwordDefopt}%
-\defvarargs {#2}\endgroup %
-}
-
-% @deftypevar int foobar
-
-\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
-
-% #1 is the data type.  #2 is the name, perhaps followed by text that
-% is actually part of the data type, which should not be put into the index.
-\def\deftypevarheader #1#2{%
-\dovarind#2 \relax% Make entry in variables index
-\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
-  \defargscommonending
-\endgroup}
-\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
-
-% @deftypevr {Global Flag} int enable
-
-\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
-
-\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
-\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
-  \defargscommonending
-\endgroup}
-
-% Now define @deftp
-% Args are printed in bold, a slight difference from @defvar.
-
-\def\deftpargs #1{\bf \defvarargs{#1}}
-
-% @deftp Class window height width ...
-
-\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
-
-\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
-\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
-
-% These definitions are used if you use @defunx (etc.)
-% anywhere other than immediately after a @defun or @defunx.
-% 
-\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
-\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
-\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
-\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
-\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
-\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
-\def\defopx#1 {\errmessage{@defopx in invalid context}}
-\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
-\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
-\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
-\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
-\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
-\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
-\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
-\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
-\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
-\def\defunx#1 {\errmessage{@defunx in invalid context}}
-\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
-\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
-
-
-\message{macros,}
-% @macro.
-
-% To do this right we need a feature of e-TeX, \scantokens,
-% which we arrange to emulate with a temporary file in ordinary TeX.
-\ifx\eTeXversion\undefined
- \newwrite\macscribble
- \def\scanmacro#1{%
-   \begingroup \newlinechar`\^^M
-   % Undo catcode changes of \startcontents and \doprintindex
-   \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
-   % Append \endinput to make sure that TeX does not see the ending newline.
-   \toks0={#1\endinput}%
-   \immediate\openout\macscribble=\jobname.tmp
-   \immediate\write\macscribble{\the\toks0}%
-   \immediate\closeout\macscribble
-   \let\xeatspaces\eatspaces
-   \input \jobname.tmp
-   \endgroup
-}
-\else
-\def\scanmacro#1{%
-\begingroup \newlinechar`\^^M
-% Undo catcode changes of \startcontents and \doprintindex
-\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
-\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
-\fi
-
-\newcount\paramno   % Count of parameters
-\newtoks\macname    % Macro name
-\newif\ifrecursive  % Is it recursive?
-\def\macrolist{}    % List of all defined macros in the form
-                    % \do\macro1\do\macro2...
-
-% Utility routines.
-% Thisdoes \let #1 = #2, except with \csnames.
-\def\cslet#1#2{%
-\expandafter\expandafter
-\expandafter\let
-\expandafter\expandafter
-\csname#1\endcsname
-\csname#2\endcsname}
-
-% Trim leading and trailing spaces off a string.
-% Concepts from aro-bend problem 15 (see CTAN).
-{\catcode`\@=11
-\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
-\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
-\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
-\def\unbrace#1{#1}
-\unbrace{\gdef\trim@@@ #1 } #2@{#1}
-}
-
-% Trim a single trailing ^^M off a string.
-{\catcode`\^^M=\other \catcode`\Q=3%
-\gdef\eatcr #1{\eatcra #1Q^^MQ}%
-\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
-\gdef\eatcrb#1Q#2Q{#1}%
-}
-
-% Macro bodies are absorbed as an argument in a context where
-% all characters are catcode 10, 11 or 12, except \ which is active
-% (as in normal texinfo). It is necessary to change the definition of \.
-
-% It's necessary to have hard CRs when the macro is executed. This is
-% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
-% body, and then making it the \newlinechar in \scanmacro.
-
-\def\macrobodyctxt{%
-  \catcode`\~=\other
-  \catcode`\^=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\+=\other
-  \catcode`\{=\other
-  \catcode`\}=\other
-  \catcode`\@=\other
-  \catcode`\^^M=\other
-  \usembodybackslash}
-
-\def\macroargctxt{%
-  \catcode`\~=\other
-  \catcode`\^=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\+=\other
-  \catcode`\@=\other
-  \catcode`\\=\other}
-
-% \mbodybackslash is the definition of \ in @macro bodies.
-% It maps \foo\ => \csname macarg.foo\endcsname => #N
-% where N is the macro parameter number.
-% We define \csname macarg.\endcsname to be \realbackslash, so
-% \\ in macro replacement text gets you a backslash.
-
-{\catcode`@=0 @catcode`@\=@active
- @gdef@usembodybackslash{@let\=@mbodybackslash}
- @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
-}
-\expandafter\def\csname macarg.\endcsname{\realbackslash}
-
-\def\macro{\recursivefalse\parsearg\macroxxx}
-\def\rmacro{\recursivetrue\parsearg\macroxxx}
-
-\def\macroxxx#1{%
-  \getargs{#1}%           now \macname is the macname and \argl the arglist
-  \ifx\argl\empty       % no arguments
-     \paramno=0%
-  \else
-     \expandafter\parsemargdef \argl;%
-  \fi
-  \if1\csname ismacro.\the\macname\endcsname
-     \message{Warning: redefining \the\macname}%
-  \else
-     \expandafter\ifx\csname \the\macname\endcsname \relax
-     \else \errmessage{Macro name \the\macname\space already defined}\fi
-     \global\cslet{macsave.\the\macname}{\the\macname}%
-     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
-     % Add the macroname to \macrolist
-     \toks0 = \expandafter{\macrolist\do}%
-     \xdef\macrolist{\the\toks0
-       \expandafter\noexpand\csname\the\macname\endcsname}%
-  \fi
-  \begingroup \macrobodyctxt
-  \ifrecursive \expandafter\parsermacbody
-  \else \expandafter\parsemacbody
-  \fi}
-
-\def\unmacro{\parsearg\dounmacro}
-\def\dounmacro#1{%
-  \if1\csname ismacro.#1\endcsname
-    \global\cslet{#1}{macsave.#1}%
-    \global\expandafter\let \csname ismacro.#1\endcsname=0%
-    % Remove the macro name from \macrolist:
-    \begingroup
-      \expandafter\let\csname#1\endcsname \relax
-      \let\do\unmacrodo
-      \xdef\macrolist{\macrolist}%
-    \endgroup
-  \else
-    \errmessage{Macro #1 not defined}%
-  \fi
-}
-
-% Called by \do from \dounmacro on each macro.  The idea is to omit any
-% macro definitions that have been changed to \relax.
-% 
-\def\unmacrodo#1{%
-  \ifx#1\relax
-    % remove this
-  \else
-    \noexpand\do \noexpand #1%
-  \fi
-}
-
-% This makes use of the obscure feature that if the last token of a
-% <parameter list> is #, then the preceding argument is delimited by
-% an opening brace, and that opening brace is not consumed.
-\def\getargs#1{\getargsxxx#1{}}
-\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
-\def\getmacname #1 #2\relax{\macname={#1}}
-\def\getmacargs#1{\def\argl{#1}}
-
-% Parse the optional {params} list.  Set up \paramno and \paramlist
-% so \defmacro knows what to do.  Define \macarg.blah for each blah
-% in the params list, to be ##N where N is the position in that list.
-% That gets used by \mbodybackslash (above).
-
-% We need to get `macro parameter char #' into several definitions.
-% The technique used is stolen from LaTeX:  let \hash be something
-% unexpandable, insert that wherever you need a #, and then redefine
-% it to # just before using the token list produced.
-%
-% The same technique is used to protect \eatspaces till just before
-% the macro is used.
-
-\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
-        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
-\def\parsemargdefxxx#1,{%
-  \if#1;\let\next=\relax
-  \else \let\next=\parsemargdefxxx
-    \advance\paramno by 1%
-    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
-        {\xeatspaces{\hash\the\paramno}}%
-    \edef\paramlist{\paramlist\hash\the\paramno,}%
-  \fi\next}
-
-% These two commands read recursive and nonrecursive macro bodies.
-% (They're different since rec and nonrec macros end differently.)
-
-\long\def\parsemacbody#1@end macro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-\long\def\parsermacbody#1@end rmacro%
-{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
-
-% This defines the macro itself. There are six cases: recursive and
-% nonrecursive macros of zero, one, and many arguments.
-% Much magic with \expandafter here.
-% \xdef is used so that macro definitions will survive the file
-% they're defined in; @include reads the file inside a group.
-\def\defmacro{%
-  \let\hash=##% convert placeholders to macro parameter chars
-  \ifrecursive
-    \ifcase\paramno
-    % 0
-      \expandafter\xdef\csname\the\macname\endcsname{%
-        \noexpand\scanmacro{\temp}}%
-    \or % 1
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
-         \noexpand\braceorline
-         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
-      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
-         \egroup\noexpand\scanmacro{\temp}}%
-    \else % many
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
-         \noexpand\csname\the\macname xx\endcsname}%
-      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
-          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
-      \expandafter\expandafter
-      \expandafter\xdef
-      \expandafter\expandafter
-        \csname\the\macname xxx\endcsname
-          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
-    \fi
-  \else
-    \ifcase\paramno
-    % 0
-      \expandafter\xdef\csname\the\macname\endcsname{%
-        \noexpand\norecurse{\the\macname}%
-        \noexpand\scanmacro{\temp}\egroup}%
-    \or % 1
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
-         \noexpand\braceorline
-         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
-      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
-        \egroup
-        \noexpand\norecurse{\the\macname}%
-        \noexpand\scanmacro{\temp}\egroup}%
-    \else % many
-      \expandafter\xdef\csname\the\macname\endcsname{%
-         \bgroup\noexpand\macroargctxt
-         \expandafter\noexpand\csname\the\macname xx\endcsname}%
-      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
-          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
-      \expandafter\expandafter
-      \expandafter\xdef
-      \expandafter\expandafter
-      \csname\the\macname xxx\endcsname
-      \paramlist{%
-          \egroup
-          \noexpand\norecurse{\the\macname}%
-          \noexpand\scanmacro{\temp}\egroup}%
-    \fi
-  \fi}
-
-\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
-
-% \braceorline decides whether the next nonwhitespace character is a
-% {.  If so it reads up to the closing }, if not, it reads the whole
-% line.  Whatever was read is then fed to the next control sequence
-% as an argument (by \parsebrace or \parsearg)
-\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
-\def\braceorlinexxx{%
-  \ifx\nchar\bgroup\else
-    \expandafter\parsearg
-  \fi \next}
-
-% We mant to disable all macros during \shipout so that they are not
-% expanded by \write.
-\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
-  \edef\next{\macrolist}\expandafter\endgroup\next}
-
-
-% @alias.
-% We need some trickery to remove the optional spaces around the equal
-% sign.  Just make them active and then expand them all to nothing.
-\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
-\def\aliasxxx #1{\aliasyyy#1\relax}
-\def\aliasyyy #1=#2\relax{\ignoreactivespaces
-\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
-           \expandafter\noexpand\csname#2\endcsname}%
-\expandafter\endgroup\next}
-
-
-\message{cross references,}
-% @xref etc.
-
-\newwrite\auxfile
-
-\newif\ifhavexrefs    % True if xref values are known.
-\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
-
-% @inforef is relatively simple.
-\def\inforef #1{\inforefzzz #1,,,,**}
-\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
-  node \samp{\ignorespaces#1{}}}
-
-% @node's job is to define \lastnode.
-\def\node{\ENVcheck\parsearg\nodezzz}
-\def\nodezzz#1{\nodexxx [#1,]}
-\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
-\let\nwnode=\node
-\let\lastnode=\relax
-
-% The sectioning commands (@chapter, etc.) call these.
-\def\donoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}%
-      {Ysectionnumberandtype}%
-    \global\let\lastnode=\relax
-  \fi
-}
-\def\unnumbnoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
-    \global\let\lastnode=\relax
-  \fi
-}
-\def\appendixnoderef{%
-  \ifx\lastnode\relax\else
-    \expandafter\expandafter\expandafter\setref{\lastnode}%
-      {Yappendixletterandtype}%
-    \global\let\lastnode=\relax
-  \fi
-}
-
-
-% @anchor{NAME} -- define xref target at arbitrary point.
-%
-\newcount\savesfregister
-\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
-\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
-\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
-
-% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
-% anchor), namely NAME-title (the corresponding @chapter/etc. name),
-% NAME-pg (the page number), and NAME-snt (section number and type).
-% Called from \foonoderef.
-% 
-% We have to set \indexdummies so commands such as @code in a section
-% title aren't expanded.  It would be nicer not to expand the titles in
-% the first place, but there's so many layers that that is hard to do.
-%
-% Likewise, use \turnoffactive so that punctuation chars such as underscore
-% and backslash work in node names.
-% 
-\def\setref#1#2{{%
-  \atdummies
-  \pdfmkdest{#1}%
-  %
-  \turnoffactive
-  \dosetq{#1-title}{Ytitle}%
-  \dosetq{#1-pg}{Ypagenumber}%
-  \dosetq{#1-snt}{#2}%
-}}
-
-% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
-% the node name, #2 the name of the Info cross-reference, #3 the printed
-% node name, #4 the name of the Info file, #5 the name of the printed
-% manual.  All but the node name can be omitted.
-%
-\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
-\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
-\def\ref#1{\xrefX[#1,,,,,,,]}
-\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
-  \unsepspaces
-  \def\printedmanual{\ignorespaces #5}%
-  \def\printednodename{\ignorespaces #3}%
-  \setbox1=\hbox{\printedmanual}%
-  \setbox0=\hbox{\printednodename}%
-  \ifdim \wd0 = 0pt
-    % No printed node name was explicitly given.
-    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
-      % Use the node name inside the square brackets.
-      \def\printednodename{\ignorespaces #1}%
-    \else
-      % Use the actual chapter/section title appear inside
-      % the square brackets.  Use the real section title if we have it.
-      \ifdim \wd1 > 0pt
-        % It is in another manual, so we don't have it.
-        \def\printednodename{\ignorespaces #1}%
-      \else
-        \ifhavexrefs
-          % We know the real title if we have the xref values.
-          \def\printednodename{\refx{#1-title}{}}%
-        \else
-          % Otherwise just copy the Info node name.
-          \def\printednodename{\ignorespaces #1}%
-        \fi%
-      \fi
-    \fi
-  \fi
-  %
-  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
-  % insert empty discretionaries after hyphens, which means that it will
-  % not find a line break at a hyphen in a node names.  Since some manuals
-  % are best written with fairly long node names, containing hyphens, this
-  % is a loss.  Therefore, we give the text of the node name again, so it
-  % is as if TeX is seeing it for the first time.
-  \ifpdf
-    \leavevmode
-    \getfilename{#4}%
-    {\turnoffactive \otherbackslash
-     \ifnum\filenamelength>0
-       \startlink attr{/Border [0 0 0]}%
-         goto file{\the\filename.pdf} name{#1}%
-     \else
-       \startlink attr{/Border [0 0 0]}%
-         goto name{#1}%
-     \fi
-    }%
-    \linkcolor
-  \fi
-  %
-  \ifdim \wd1 > 0pt
-    \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
-  \else
-    % _ (for example) has to be the character _ for the purposes of the
-    % control sequence corresponding to the node, but it has to expand
-    % into the usual \leavevmode...\vrule stuff for purposes of
-    % printing. So we \turnoffactive for the \refx-snt, back on for the
-    % printing, back off for the \refx-pg.
-    {\turnoffactive \otherbackslash
-     % Only output a following space if the -snt ref is nonempty; for
-     % @unnumbered and @anchor, it won't be.
-     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
-     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
-    }%
-    % [mynode],
-    [\printednodename],\space
-    % page 3
-    \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
-  \fi
-  \endlink
-\endgroup}
-
-% \dosetq is called from \setref to do the actual \write (\iflinks).
-%
-\def\dosetq#1#2{%
-  {\let\folio=0%
-   \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
-   \iflinks \next \fi
-  }%
-}
-
-% \internalsetq{foo}{page} expands into
-%   CHARACTERS @xrdef{foo}{...expansion of \page...}
-\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
-
-% Things to be expanded by \internalsetq.
-% 
-\def\Ypagenumber{\folio}
-\def\Ytitle{\thissection}
-\def\Ynothing{}
-\def\Ysectionnumberandtype{%
-  \ifnum\secno=0
-    \putwordChapter@tie \the\chapno
-  \else \ifnum\subsecno=0
-    \putwordSection@tie \the\chapno.\the\secno
-  \else \ifnum\subsubsecno=0
-    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
-  \else
-    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
-  \fi\fi\fi
-}
-
-\def\Yappendixletterandtype{%
-  \ifnum\secno=0
-     \putwordAppendix@tie @char\the\appendixno{}%
-  \else \ifnum\subsecno=0
-     \putwordSection@tie @char\the\appendixno.\the\secno
-  \else \ifnum\subsubsecno=0
-    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
-  \else
-    \putwordSection@tie
-      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
-  \fi\fi\fi
-}
-
-% Use TeX 3.0's \inputlineno to get the line number, for better error
-% messages, but if we're using an old version of TeX, don't do anything.
-%
-\ifx\inputlineno\thisisundefined
-  \let\linenumber = \empty % Pre-3.0.
-\else
-  \def\linenumber{\the\inputlineno:\space}
-\fi
-
-% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
-% If its value is nonempty, SUFFIX is output afterward.
-%
-\def\refx#1#2{%
-  {%
-    \indexnofonts
-    \otherbackslash
-    \expandafter\global\expandafter\let\expandafter\thisrefX
-      \csname X#1\endcsname
-  }%
-  \ifx\thisrefX\relax
-    % If not defined, say something at least.
-    \angleleft un\-de\-fined\angleright
-    \iflinks
-      \ifhavexrefs
-        \message{\linenumber Undefined cross reference `#1'.}%
-      \else
-        \ifwarnedxrefs\else
-          \global\warnedxrefstrue
-          \message{Cross reference values unknown; you must run TeX again.}%
-        \fi
-      \fi
-    \fi
-  \else
-    % It's defined, so just use it.
-    \thisrefX
-  \fi
-  #2% Output the suffix in any case.
-}
-
-% This is the macro invoked by entries in the aux file.
-%
-\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
-
-% Read the last existing aux file, if any.  No error if none exists.
-\def\readauxfile{\begingroup
-  \catcode`\^^@=\other
-  \catcode`\^^A=\other
-  \catcode`\^^B=\other
-  \catcode`\^^C=\other
-  \catcode`\^^D=\other
-  \catcode`\^^E=\other
-  \catcode`\^^F=\other
-  \catcode`\^^G=\other
-  \catcode`\^^H=\other
-  \catcode`\^^K=\other
-  \catcode`\^^L=\other
-  \catcode`\^^N=\other
-  \catcode`\^^P=\other
-  \catcode`\^^Q=\other
-  \catcode`\^^R=\other
-  \catcode`\^^S=\other
-  \catcode`\^^T=\other
-  \catcode`\^^U=\other
-  \catcode`\^^V=\other
-  \catcode`\^^W=\other
-  \catcode`\^^X=\other
-  \catcode`\^^Z=\other
-  \catcode`\^^[=\other
-  \catcode`\^^\=\other
-  \catcode`\^^]=\other
-  \catcode`\^^^=\other
-  \catcode`\^^_=\other
-  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
-  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
-  % supported in the main text, it doesn't seem desirable.  Furthermore,
-  % that is not enough: for node names that actually contain a ^
-  % character, we would end up writing a line like this: 'xrdef {'hat
-  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
-  % argument, and \hat is not an expandable control sequence.  It could
-  % all be worked out, but why?  Either we support ^^ or we don't.
-  %
-  % The other change necessary for this was to define \auxhat:
-  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
-  % and then to call \auxhat in \setq.
-  %
-  \catcode`\^=\other
-  %
-  % Special characters.  Should be turned off anyway, but...
-  \catcode`\~=\other
-  \catcode`\[=\other
-  \catcode`\]=\other
-  \catcode`\"=\other
-  \catcode`\_=\other
-  \catcode`\|=\other
-  \catcode`\<=\other
-  \catcode`\>=\other
-  \catcode`\$=\other
-  \catcode`\#=\other
-  \catcode`\&=\other
-  \catcode`\%=\other
-  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
-  %
-  % Make the characters 128-255 be printing characters
-  {%
-    \count 1=128
-    \def\loop{%
-      \catcode\count 1=\other
-      \advance\count 1 by 1
-      \ifnum \count 1<256 \loop \fi
-    }%
-  }%
-  %
-  % Turn off \ as an escape so we do not lose on
-  % entries which were dumped with control sequences in their names.
-  % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
-  % Reference to such entries still does not work the way one would wish,
-  % but at least they do not bomb out when the aux file is read in.
-  \catcode`\\=\other
-  %
-  % @ is our escape character in .aux files.
-  \catcode`\{=1
-  \catcode`\}=2
-  \catcode`\@=0
-  %
-  \openin 1 \jobname.aux
-  \ifeof 1 \else
-    \closein 1
-    \input \jobname.aux
-    \global\havexrefstrue
-    \global\warnedobstrue
-  \fi
-  % Open the new aux file.  TeX will close it automatically at exit.
-  \openout\auxfile=\jobname.aux
-\endgroup}
-
-
-% Footnotes.
-
-\newcount \footnoteno
-
-% The trailing space in the following definition for supereject is
-% vital for proper filling; pages come out unaligned when you do a
-% pagealignmacro call if that space before the closing brace is
-% removed. (Generally, numeric constants should always be followed by a
-% space to prevent strange expansion errors.)
-\def\supereject{\par\penalty -20000\footnoteno =0 }
-
-% @footnotestyle is meaningful for info output only.
-\let\footnotestyle=\comment
-
-\let\ptexfootnote=\footnote
-
-{\catcode `\@=11
-%
-% Auto-number footnotes.  Otherwise like plain.
-\gdef\footnote{%
-  \global\advance\footnoteno by \@ne
-  \edef\thisfootno{$^{\the\footnoteno}$}%
-  %
-  % In case the footnote comes at the end of a sentence, preserve the
-  % extra spacing after we do the footnote number.
-  \let\@sf\empty
-  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
-  %
-  % Remove inadvertent blank space before typesetting the footnote number.
-  \unskip
-  \thisfootno\@sf
-  \dofootnote
-}%
-
-% Don't bother with the trickery in plain.tex to not require the
-% footnote text as a parameter.  Our footnotes don't need to be so general.
-%
-% Oh yes, they do; otherwise, @ifset and anything else that uses
-% \parseargline fail inside footnotes because the tokens are fixed when
-% the footnote is read.  --karl, 16nov96.
-%
-% The start of the footnote looks usually like this:
-\gdef\startfootins{\insert\footins\bgroup}
-%
-% ... but this macro is redefined inside @multitable.
-%
-\gdef\dofootnote{%
-  \startfootins
-  % We want to typeset this text as a normal paragraph, even if the
-  % footnote reference occurs in (for example) a display environment.
-  % So reset some parameters.
-  \hsize=\pagewidth
-  \interlinepenalty\interfootnotelinepenalty
-  \splittopskip\ht\strutbox % top baseline for broken footnotes
-  \splitmaxdepth\dp\strutbox
-  \floatingpenalty\@MM
-  \leftskip\z@skip
-  \rightskip\z@skip
-  \spaceskip\z@skip
-  \xspaceskip\z@skip
-  \parindent\defaultparindent
-  %
-  \smallfonts \rm
-  %
-  % Because we use hanging indentation in footnotes, a @noindent appears
-  % to exdent this text, so make it be a no-op.  makeinfo does not use
-  % hanging indentation so @noindent can still be needed within footnote
-  % text after an @example or the like (not that this is good style).
-  \let\noindent = \relax
-  %
-  % Hang the footnote text off the number.  Use \everypar in case the
-  % footnote extends for more than one paragraph.
-  \everypar = {\hang}%
-  \textindent{\thisfootno}%
-  %
-  % Don't crash into the line above the footnote text.  Since this
-  % expands into a box, it must come within the paragraph, lest it
-  % provide a place where TeX can split the footnote.
-  \footstrut
-  \futurelet\next\fo@t
-}
-}%end \catcode `\@=11
-
-% @| inserts a changebar to the left of the current line.  It should
-% surround any changed text.  This approach does *not* work if the
-% change spans more than two lines of output.  To handle that, we would
-% have adopt a much more difficult approach (putting marks into the main
-% vertical list for the beginning and end of each change).
-%
-\def\|{%
-  % \vadjust can only be used in horizontal mode.
-  \leavevmode
-  %
-  % Append this vertical mode material after the current line in the output.
-  \vadjust{%
-    % We want to insert a rule with the height and depth of the current
-    % leading; that is exactly what \strutbox is supposed to record.
-    \vskip-\baselineskip
-    %
-    % \vadjust-items are inserted at the left edge of the type.  So
-    % the \llap here moves out into the left-hand margin.
-    \llap{%
-      %
-      % For a thicker or thinner bar, change the `1pt'.
-      \vrule height\baselineskip width1pt
-      %
-      % This is the space between the bar and the text.
-      \hskip 12pt
-    }%
-  }%
-}
-
-% For a final copy, take out the rectangles
-% that mark overfull boxes (in case you have decided
-% that the text looks ok even though it passes the margin).
-%
-\def\finalout{\overfullrule=0pt}
-
-% @image.  We use the macros from epsf.tex to support this.
-% If epsf.tex is not installed and @image is used, we complain.
-%
-% Check for and read epsf.tex up front.  If we read it only at @image
-% time, we might be inside a group, and then its definitions would get
-% undone and the next image would fail.
-\openin 1 = epsf.tex
-\ifeof 1 \else
-  \closein 1
-  % Do not bother showing banner with epsf.tex v2.7k (available in
-  % doc/epsf.tex and on ctan).
-  \def\epsfannounce{\toks0 = }%
-  \input epsf.tex
-\fi
-%
-% We will only complain once about lack of epsf.tex.
-\newif\ifwarnednoepsf
-\newhelp\noepsfhelp{epsf.tex must be installed for images to
-  work.  It is also included in the Texinfo distribution, or you can get
-  it from ftp://tug.org/tex/epsf.tex.}
-%
-\def\image#1{%
-  \ifx\epsfbox\undefined
-    \ifwarnednoepsf \else
-      \errhelp = \noepsfhelp
-      \errmessage{epsf.tex not found, images will be ignored}%
-      \global\warnednoepsftrue
-    \fi
-  \else
-    \imagexxx #1,,,,,\finish
-  \fi
-}
-%
-% Arguments to @image:
-% #1 is (mandatory) image filename; we tack on .eps extension.
-% #2 is (optional) width, #3 is (optional) height.
-% #4 is (ignored optional) html alt text.
-% #5 is (ignored optional) extension.
-% #6 is just the usual extra ignored arg for parsing this stuff.
-\newif\ifimagevmode
-\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
-  \catcode`\^^M = 5     % in case we're inside an example
-  \normalturnoffactive  % allow _ et al. in names
-  % If the image is by itself, center it.
-  \ifvmode
-    \imagevmodetrue
-    \nobreak\bigskip
-    % Usually we'll have text after the image which will insert
-    % \parskip glue, so insert it here too to equalize the space
-    % above and below. 
-    \nobreak\vskip\parskip
-    \nobreak
-    \line\bgroup\hss
-  \fi
-  %
-  % Output the image.
-  \ifpdf
-    \dopdfimage{#1}{#2}{#3}%
-  \else
-    % \epsfbox itself resets \epsf?size at each figure.
-    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
-    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
-    \epsfbox{#1.eps}%
-  \fi
-  %
-  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
-\endgroup}
-
-
-\message{localization,}
-% and i18n.
-
-% @documentlanguage is usually given very early, just after
-% @setfilename.  If done too late, it may not override everything
-% properly.  Single argument is the language abbreviation.
-% It would be nice if we could set up a hyphenation file here.
-%
-\def\documentlanguage{\parsearg\dodocumentlanguage}
-\def\dodocumentlanguage#1{%
-  \tex % read txi-??.tex file in plain TeX.
-  % Read the file if it exists.
-  \openin 1 txi-#1.tex
-  \ifeof1
-    \errhelp = \nolanghelp
-    \errmessage{Cannot read language file txi-#1.tex}%
-    \let\temp = \relax
-  \else
-    \def\temp{\input txi-#1.tex }%
-  \fi
-  \temp
-  \endgroup
-}
-\newhelp\nolanghelp{The given language definition file cannot be found or
-is empty.  Maybe you need to install it?  In the current directory
-should work if nowhere else does.}
-
-
-% @documentencoding should change something in TeX eventually, most
-% likely, but for now just recognize it.
-\let\documentencoding = \comment
-
-
-% Page size parameters.
-%
-\newdimen\defaultparindent \defaultparindent = 15pt
-
-\chapheadingskip = 15pt plus 4pt minus 2pt
-\secheadingskip = 12pt plus 3pt minus 2pt
-\subsecheadingskip = 9pt plus 2pt minus 2pt
-
-% Prevent underfull vbox error messages.
-\vbadness = 10000
-
-% Don't be so finicky about underfull hboxes, either.
-\hbadness = 2000
-
-% Following George Bush, just get rid of widows and orphans.
-\widowpenalty=10000
-\clubpenalty=10000
-
-% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
-% using an old version of TeX, don't do anything.  We want the amount of
-% stretch added to depend on the line length, hence the dependence on
-% \hsize.  We call this whenever the paper size is set.
-%
-\def\setemergencystretch{%
-  \ifx\emergencystretch\thisisundefined
-    % Allow us to assign to \emergencystretch anyway.
-    \def\emergencystretch{\dimen0}%
-  \else
-    \emergencystretch = .15\hsize
-  \fi
-}
-
-% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
-% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
-% physical page width.
-% 
-% We also call \setleading{\textleading}, so the caller should define
-% \textleading.  The caller should also set \parskip.
-%
-\def\internalpagesizes#1#2#3#4#5#6#7#8{%
-  \voffset = #3\relax
-  \topskip = #6\relax
-  \splittopskip = \topskip
-  %
-  \vsize = #1\relax
-  \advance\vsize by \topskip
-  \outervsize = \vsize
-  \advance\outervsize by 2\topandbottommargin
-  \pageheight = \vsize
-  %
-  \hsize = #2\relax
-  \outerhsize = \hsize
-  \advance\outerhsize by 0.5in
-  \pagewidth = \hsize
-  %
-  \normaloffset = #4\relax
-  \bindingoffset = #5\relax
-  %
-  \ifpdf
-    \pdfpageheight #7\relax
-    \pdfpagewidth #8\relax
-  \fi
-  %
-  \setleading{\textleading}
-  %
-  \parindent = \defaultparindent
-  \setemergencystretch
-}
-
-% @letterpaper (the default).
-\def\letterpaper{{\globaldefs = 1
-  \parskip = 3pt plus 2pt minus 1pt
-  \textleading = 13.2pt
-  %
-  % If page is nothing but text, make it come out even.
-  \internalpagesizes{46\baselineskip}{6in}%
-                    {\voffset}{.25in}%
-                    {\bindingoffset}{36pt}%
-                    {11in}{8.5in}%
-}}
-
-% Use @smallbook to reset parameters for 7x9.5 (or so) format.
-\def\smallbook{{\globaldefs = 1
-  \parskip = 2pt plus 1pt
-  \textleading = 12pt
-  %
-  \internalpagesizes{7.5in}{5in}%
-                    {\voffset}{.25in}%
-                    {\bindingoffset}{16pt}%
-                    {9.25in}{7in}%
-  %
-  \lispnarrowing = 0.3in
-  \tolerance = 700
-  \hfuzz = 1pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = .5cm
-}}
-
-% Use @afourpaper to print on European A4 paper.
-\def\afourpaper{{\globaldefs = 1
-  \parskip = 3pt plus 2pt minus 1pt
-  \textleading = 13.2pt
-  %
-  % Double-side printing via postscript on Laserjet 4050 
-  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
-  % To change the settings for a different printer or situation, adjust
-  % \normaloffset until the front-side and back-side texts align.  Then
-  % do the same for \bindingoffset.  You can set these for testing in
-  % your texinfo source file like this:
-  % @tex
-  % \global\normaloffset = -6mm
-  % \global\bindingoffset = 10mm
-  % @end tex
-  \internalpagesizes{51\baselineskip}{160mm}
-                    {\voffset}{\hoffset}%
-                    {\bindingoffset}{44pt}%
-                    {297mm}{210mm}%
-  %
-  \tolerance = 700
-  \hfuzz = 1pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = 5mm
-}}
-
-% Use @afivepaper to print on European A5 paper.
-% From romildo@urano.iceb.ufop.br, 2 July 2000.
-% He also recommends making @example and @lisp be small.
-\def\afivepaper{{\globaldefs = 1
-  \parskip = 2pt plus 1pt minus 0.1pt
-  \textleading = 12.5pt
-  %
-  \internalpagesizes{160mm}{120mm}%
-                    {\voffset}{\hoffset}%
-                    {\bindingoffset}{8pt}%
-                    {210mm}{148mm}%
-  %
-  \lispnarrowing = 0.2in
-  \tolerance = 800
-  \hfuzz = 1.2pt
-  \contentsrightmargin = 0pt
-  \defbodyindent = 2mm
-  \tableindent = 12mm
-}}
-
-% A specific text layout, 24x15cm overall, intended for A4 paper.  
-\def\afourlatex{{\globaldefs = 1
-  \afourpaper
-  \internalpagesizes{237mm}{150mm}%
-                    {\voffset}{4.6mm}%
-                    {\bindingoffset}{7mm}%
-                    {297mm}{210mm}%
-  %
-  % Must explicitly reset to 0 because we call \afourpaper.
-  \globaldefs = 0
-}}
-
-% Use @afourwide to print on A4 paper in landscape format.
-\def\afourwide{{\globaldefs = 1
-  \afourpaper
-  \internalpagesizes{241mm}{165mm}%
-                    {\voffset}{-2.95mm}%
-                    {\bindingoffset}{7mm}%
-                    {297mm}{210mm}%
-  \globaldefs = 0
-}}
-
-% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
-% Perhaps we should allow setting the margins, \topskip, \parskip,
-% and/or leading, also. Or perhaps we should compute them somehow.
-%
-\def\pagesizes{\parsearg\pagesizesxxx}
-\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
-\def\pagesizesyyy#1,#2,#3\finish{{%
-  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
-  \globaldefs = 1
-  %
-  \parskip = 3pt plus 2pt minus 1pt
-  \setleading{\textleading}%
-  %
-  \dimen0 = #1
-  \advance\dimen0 by \voffset
-  %
-  \dimen2 = \hsize
-  \advance\dimen2 by \normaloffset
-  %
-  \internalpagesizes{#1}{\hsize}%
-                    {\voffset}{\normaloffset}%
-                    {\bindingoffset}{44pt}%
-                    {\dimen0}{\dimen2}%
-}}
-
-% Set default to letter.
-%
-\letterpaper
-
-
-\message{and turning on texinfo input format.}
-
-% Define macros to output various characters with catcode for normal text.
-\catcode`\"=\other
-\catcode`\~=\other
-\catcode`\^=\other
-\catcode`\_=\other
-\catcode`\|=\other
-\catcode`\<=\other
-\catcode`\>=\other
-\catcode`\+=\other
-\catcode`\$=\other
-\def\normaldoublequote{"}
-\def\normaltilde{~}
-\def\normalcaret{^}
-\def\normalunderscore{_}
-\def\normalverticalbar{|}
-\def\normalless{<}
-\def\normalgreater{>}
-\def\normalplus{+}
-\def\normaldollar{$}%$ font-lock fix
-
-% This macro is used to make a character print one way in ttfont
-% where it can probably just be output, and another way in other fonts,
-% where something hairier probably needs to be done.
-%
-% #1 is what to print if we are indeed using \tt; #2 is what to print
-% otherwise.  Since all the Computer Modern typewriter fonts have zero
-% interword stretch (and shrink), and it is reasonable to expect all
-% typewriter fonts to have this, we can check that font parameter.
-%
-\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
-
-% Same as above, but check for italic font.  Actually this also catches
-% non-italic slanted fonts since it is impossible to distinguish them from
-% italic fonts.  But since this is only used by $ and it uses \sl anyway
-% this is not a problem.
-\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
-
-% Turn off all special characters except @
-% (and those which the user can use as if they were ordinary).
-% Most of these we simply print from the \tt font, but for some, we can
-% use math or other variants that look better in normal text.
-
-\catcode`\"=\active
-\def\activedoublequote{{\tt\char34}}
-\let"=\activedoublequote
-\catcode`\~=\active
-\def~{{\tt\char126}}
-\chardef\hat=`\^
-\catcode`\^=\active
-\def^{{\tt \hat}}
-
-\catcode`\_=\active
-\def_{\ifusingtt\normalunderscore\_}
-% Subroutine for the previous macro.
-\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
-
-\catcode`\|=\active
-\def|{{\tt\char124}}
-\chardef \less=`\<
-\catcode`\<=\active
-\def<{{\tt \less}}
-\chardef \gtr=`\>
-\catcode`\>=\active
-\def>{{\tt \gtr}}
-\catcode`\+=\active
-\def+{{\tt \char 43}}
-\catcode`\$=\active
-\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
-
-% Set up an active definition for =, but don't enable it most of the time.
-{\catcode`\==\active
-\global\def={{\tt \char 61}}}
-
-\catcode`+=\active
-\catcode`\_=\active
-
-% If a .fmt file is being used, characters that might appear in a file
-% name cannot be active until we have parsed the command line.
-% So turn them off again, and have \everyjob (or @setfilename) turn them on.
-% \otherifyactive is called near the end of this file.
-\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
-
-\catcode`\@=0
-
-% \rawbackslashxx outputs one backslash character in current font,
-% as in \char`\\.
-\global\chardef\rawbackslashxx=`\\
-
-% \rawbackslash defines an active \ to do \rawbackslashxx.
-% \otherbackslash defines an active \ to be a literal `\' character with
-% catcode other.
-{\catcode`\\=\active
- @gdef@rawbackslash{@let\=@rawbackslashxx}
- @gdef@otherbackslash{@let\=@realbackslash}
-}
-
-% \realbackslash is an actual character `\' with catcode other.
-{\catcode`\\=\other @gdef@realbackslash{\}}
-
-% \normalbackslash outputs one backslash in fixed width font.
-\def\normalbackslash{{\tt\rawbackslashxx}}
-
-\catcode`\\=\active
-
-% Used sometimes to turn off (effectively) the active characters
-% even after parsing them.
-@def@turnoffactive{%
-  @let"=@normaldoublequote
-  @let\=@realbackslash
-  @let~=@normaltilde
-  @let^=@normalcaret
-  @let_=@normalunderscore
-  @let|=@normalverticalbar
-  @let<=@normalless
-  @let>=@normalgreater
-  @let+=@normalplus
-  @let$=@normaldollar %$ font-lock fix
-}
-
-% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
-% the literal character `\'.  (Thus, \ is not expandable when this is in
-% effect.)
-% 
-@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
-
-% Make _ and + \other characters, temporarily.
-% This is canceled by @fixbackslash.
-@otherifyactive
-
-% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
-% That is what \eatinput is for; after that, the `\' should revert to printing
-% a backslash.
-%
-@gdef@eatinput input texinfo{@fixbackslash}
-@global@let\ = @eatinput
-
-% On the other hand, perhaps the file did not have a `\input texinfo'. Then
-% the first `\{ in the file would cause an error. This macro tries to fix
-% that, assuming it is called before the first `\' could plausibly occur.
-% Also back turn on active characters that might appear in the input
-% file name, in case not using a pre-dumped format.
-%
-@gdef@fixbackslash{%
-  @ifx\@eatinput @let\ = @normalbackslash @fi
-  @catcode`+=@active
-  @catcode`@_=@active
-}
-
-% Say @foo, not \foo, in error messages.
-@escapechar = `@@
-
-% These look ok in all fonts, so just make them not special.  
-@catcode`@& = @other
-@catcode`@# = @other
-@catcode`@% = @other
-
-@c Set initial fonts.
-@textfonts
-@rm
-
-
-@c Local variables:
-@c eval: (add-hook 'write-file-hooks 'time-stamp)
-@c page-delimiter: "^\\\\message"
-@c time-stamp-start: "def\\\\texinfoversion{"
-@c time-stamp-format: "%:y-%02m-%02d.%02H"
-@c time-stamp-end: "}"
-@c End:
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..1d74826dec13617304217d222ff558ca91920cb5
--- /dev/null
@@ -0,0 +1 @@
+texinfo.tex.20030205
\ No newline at end of file
diff --git a/doc/texinfo.tex.20030205 b/doc/texinfo.tex.20030205
new file mode 100644 (file)
index 0000000..555a077
--- /dev/null
@@ -0,0 +1,6688 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2003-02-03.16}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+%
+% This texinfo.tex file 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 texinfo.tex file 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 texinfo.tex file; see the file COPYING.  If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% In other words, you are welcome to use, share and improve this program.
+% You are forbidden to forbid anyone else to use, share and improve
+% what you give them.   Help stamp out software-hoarding!
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
+%     (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
+%   ftp://tug.org/tex/texinfo.tex
+%     (and all CTAN mirrors, see http://www.ctan.org),
+%   and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
+% 
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+% 
+% The texinfo.tex in any given Texinfo distribution could well be out
+% of date, so if that's what you're using, please check.
+% 
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+% 
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's outer \+ definition in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some parts of plain tex whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar   = `\.
+\chardef\equalChar = `\=
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar  = `\;
+\chardef\spaceChar = `\ %
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% True if #1 is the empty string, i.e., called like `\ifempty{}'.
+%
+\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
+\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
+
+% Hyphenation fixes.
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+\hyphenation{white-space}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines\maxdimen
+}%
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+% 
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+  %
+  {%
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \escapechar = `\\     % use backslash in output files.
+    \indexdummies         % don't expand commands in the output.
+    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
+                   % the page break happens to be in the middle of an example.
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
+      %
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
+      \fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingxxx.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 2\baselineskip
+        \unvbox\footlinebox
+      \fi
+      %
+      \ifcropmarks
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
+        }%
+      \egroup % \vbox from first cropmarks clause
+      \fi
+    }% end of \shipout\vbox
+  }% end of group with \normalturnoffactive
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg#1{%
+  \let\next = #1%
+  \begingroup
+    \obeylines
+    \futurelet\temp\parseargx
+}
+
+% If the next token is an obeyed space (from an @example environment or
+% the like), remove it and recurse.  Otherwise, we're done.
+\def\parseargx{%
+  % \obeyedspace is defined far below, after the definition of \sepspaces.
+  \ifx\obeyedspace\temp
+    \expandafter\parseargdiscardspace
+  \else
+    \expandafter\parseargline
+  \fi
+}
+
+% Remove a single space (as the delimiter token to the macro call).
+{\obeyspaces %
+ \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    %
+    % First remove any @c comment, then any @comment.
+    % Result of each macro is put in \toks0.
+    \argremovec #1\c\relax %
+    \expandafter\argremovecomment \the\toks0 \comment\relax %
+    %
+    % Call the caller's macro, saved as \next in \parsearg.
+    \expandafter\next\expandafter{\the\toks0}%
+  }%
+}
+
+% Since all \c{,omment} does is throw away the argument, we can let TeX
+% do that for us.  The \relax here is matched by the \relax in the call
+% in \parseargline; it could be more or less anything, its purpose is
+% just to delimit the argument to the \c.
+\def\argremovec#1\c#2\relax{\toks0 = {#1}}
+\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
+
+% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+%    @end itemize  @c foo
+% will have two active spaces as part of the argument with the
+% `itemize'.  Here we remove all active spaces from #1, and assign the
+% result to \toks0.
+%
+% This loses if there are any *other* active characters besides spaces
+% in the argument -- _ ^ +, for example -- since they get expanded.
+% Fortunately, Texinfo does not define any such commands.  (If it ever
+% does, the catcode of the characters in questionwill have to be changed
+% here.)  But this means we cannot call \removeactivespaces as part of
+% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
+% that \parsearg gets might well have any character at all in it.
+%
+\def\removeactivespaces#1{%
+  \begingroup
+    \ignoreactivespaces
+    \edef\temp{#1}%
+    \global\toks0 = \expandafter{\temp}%
+  \endgroup
+}
+
+% Change the active space to expand to nothing.
+%
+\begingroup
+  \obeyspaces
+  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
+\endgroup
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment; press RETURN to continue}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo  is the same as @foo, for now.
+\newhelp\EMsimple{Press RETURN to continue.}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+% @end foo executes the definition of \Efoo.
+%
+\def\end{\parsearg\endxxx}
+\def\endxxx #1{%
+  \removeactivespaces{#1}%
+  \edef\endthing{\the\toks0}%
+  %
+  \expandafter\ifx\csname E\endthing\endcsname\relax
+    \expandafter\ifx\csname \endthing\endcsname\relax
+      % There's no \foo, i.e., no ``environment'' foo.
+      \errhelp = \EMsimple
+      \errmessage{Undefined command `@end \endthing'}%
+    \else
+      \unmatchedenderror\endthing
+    \fi
+  \else
+    % Everything's ok; the right environment has been started.
+    \csname E\endthing\endcsname
+  \fi
+}
+
+% There is an environment #1, but it hasn't been started.  Give an error.
+%
+\def\unmatchedenderror#1{%
+  \errhelp = \EMsimple
+  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+}
+
+% Define the control sequence \E#1 to give an unmatched @end error.
+%
+\def\defineunmatchedend#1{%
+  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux file.
+  \catcode`\{ = \other \catcode`\} = \other
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ptexi
+  \else\ifx\temp\jmacro \j
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+% 
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\def\group{\begingroup
+  \ifnum\catcode13=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  %
+  % The \vtop we start below produces a box with normal height and large
+  % depth; thus, TeX puts \baselineskip glue before it, and (when the
+  % next line of text is done) \lineskip glue after it.  (See p.82 of
+  % the TeXbook.)  Thus, space below is not quite equal to space
+  % above.  But it's pretty close.
+  \def\Egroup{%
+    \egroup           % End the \vtop.
+    % \dimen0 is the vertical size of the group's box.
+    \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+    % \dimen2 is how much space is left on the page (more or less).
+    \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+    % if the group doesn't fit on the current page, and it's a big big
+    % group, force a page break.
+    \ifdim \dimen0 > \dimen2
+      \ifdim \pagetotal < \vfilllimit\pageheight
+        \page
+      \fi
+    \fi
+    \copy\groupbox
+    \endgroup         % End the \group.
+  }%
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % We have to put a strut on the last line in case the @group is in
+    % the midst of an example, rather than completely enclosing it.
+    % Otherwise, the interline space between the last line of the group
+    % and the first line afterwards is too small.  But we can't put the
+    % strut in \Egroup, since there it would be on a line by itself.
+    % Hence this just inserts a strut at the beginning of each line.
+    \everypar = {\strut}%
+    %
+    % Since we have a strut on every line, we don't need any of TeX's
+    % normal interline spacing.
+    \offinterlineskip
+    %
+    % OK, but now we have to do something about blank
+    % lines in the input in @example-like environments, which normally
+    % just turn into \lisppar, which will insert no space now that we've
+    % turned off the interline space.  Simplest is to make them be an
+    % empty paragraph.
+    \ifx\par\lisppar
+      \edef\par{\leavevmode \par}%
+      %
+      % Reset ^^M's definition to new definition of \par.
+      \obeylines
+    \fi
+    %
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break
+
+\let\br = \par
+
+% @dots{} output an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+  \leavevmode
+  \hbox to 1.5em{%
+    \hskip 0pt plus 0.25fil minus 0.25fil
+    .\hss.\hss.%
+    \hskip 0pt plus 0.5fil minus 0.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \leavevmode
+  \hbox to 2em{%
+    \hskip 0pt plus 0.25fil minus 0.25fil
+    .\hss.\hss.\hss.%
+    \hskip 0pt plus 0.5fil minus 0.5fil
+  }%
+  \spacefactor=3000
+}
+
+
+% @page    forces the start of a new page
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+% 
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}% 
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include file    insert text of that file as input.
+% Allow normal characters that  we make active in the argument (a file name).
+\def\include{\begingroup
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \parsearg\includezzz}
+% Restore active chars for included file.
+\def\includezzz#1{\endgroup\begingroup
+  % Read the included file in a group so nested @include's work.
+  \def\thisfile{#1}%
+  \let\value=\expandablevalue
+  \input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\def\center{\parsearg\docenter}
+\def\docenter#1{{%
+  \ifhmode \hfil\break \fi
+  \advance\hsize by -\leftskip
+  \advance\hsize by -\rightskip
+  \line{\hfil \ignorespaces#1\unskip \hfil}%
+  \ifhmode \break \fi
+}}
+
+% @sp n   outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% We cannot implement @paragraphindent asis, though.
+% 
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\def\paragraphindent{\parsearg\doparagraphindent}
+\def\doparagraphindent#1{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\def\exampleindent{\parsearg\doexampleindent}
+\def\doexampleindent#1{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+% We don't use $'s directly in the definition of \math because we need
+% to set catcodes according to plain TeX first, to allow for subscripts,
+% superscripts, special math chars, etc.
+% 
+\let\implicitmath = $%$ font-lock fix
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ within @math be active (mathcode "8000), and distinguish by seeing
+% if the current family is \slfam, which is what @var uses.
+% 
+{\catcode\underChar = \active
+\gdef\mathunderscore{%
+  \catcode\underChar=\active
+  \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+}}
+%
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care.  Texinfo does not
+% otherwise define @\.
+% 
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \tex
+  \mathcode`\_="8000 \mathunderscore
+  \let\\ = \mathbackslash
+  \mathactive
+  \implicitmath\finishmath}
+\def\finishmath#1{#1\implicitmath\Etex}
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an
+% argument to a command which set the catcodes (such as @item or @section).
+% 
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \iflinks
+     \readauxfile
+   \fi % \openindices needs to do some work in any case.
+   \openindices
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   % Just to be on the safe side, close the input stream before the \input.
+   \openin 1 texinfo.cnf
+   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+   \closein1
+   \temp
+   %
+   \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+  \newindex{cp}%
+  \newcodeindex{fn}%
+  \newcodeindex{vr}%
+  \newcodeindex{tp}%
+  \newcodeindex{ky}%
+  \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+\ifx\pdfoutput\undefined
+  \pdffalse
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\linkcolor = \relax
+  \let\pdfmakeoutlines = \relax
+\else
+  \pdftrue
+  \pdfoutput = 1
+  \input pdfcolor
+  \def\dopdfimage#1#2#3{%
+    \def\imagewidth{#2}%
+    \def\imageheight{#3}%
+    % without \immediate, pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifx\empty\imagewidth\else width \imagewidth \fi
+      \ifx\empty\imageheight\else height \imageheight \fi
+      \ifnum\pdftexversion<13
+         #1.pdf%
+       \else
+         {#1.pdf}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
+  \def\pdfmkpgn#1{#1}
+  \let\linkcolor = \Blue  % was Cyan, but that seems light?
+  \def\endlink{\Black\pdfendlink}
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  \def\pdfmakeoutlines{{%
+    \openin 1 \jobname.toc
+    \ifeof 1\else\begingroup
+      \closein 1 
+      % Thanh's hack / proper braces in bookmarks  
+      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+      %
+      \def\chapentry ##1##2##3{}
+      \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
+      \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
+      \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
+      \let\appendixentry = \chapentry
+      \let\unnumbchapentry = \chapentry
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      \input \jobname.toc
+      \def\chapentry ##1##2##3{%
+        \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
+      \def\secentry ##1##2##3##4{%
+        \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
+      \def\subsecentry ##1##2##3##4##5{%
+        \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
+      \def\subsubsecentry ##1##2##3##4##5##6{%
+        \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
+      \let\appendixentry = \chapentry
+      \let\unnumbchapentry = \chapentry
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      %
+      % Make special characters normal for writing to the pdf file.
+      % 
+      \indexnofonts
+      \let\tt=\relax
+      \turnoffactive
+      \input \jobname.toc
+    \endgroup\fi
+  }}
+  \def\makelinks #1,{%
+    \def\params{#1}\def\E{END}%
+    \ifx\params\E
+      \let\nextmakelinks=\relax
+    \else
+      \let\nextmakelinks=\makelinks
+      \ifnum\lnkcount>0,\fi
+      \picknum{#1}%
+      \startlink attr{/Border [0 0 0]} 
+        goto name{\pdfmkpgn{\the\pgn}}%
+      \linkcolor #1%
+      \advance\lnkcount by 1%
+      \endlink
+    \fi
+    \nextmakelinks
+  }
+  \def\picknum#1{\expandafter\pn#1}
+  \def\pn#1{%
+    \def\p{#1}%
+    \ifx\p\lbrace
+      \let\nextpn=\ppn
+    \else
+      \let\nextpn=\ppnn
+      \def\first{#1}
+    \fi
+    \nextpn
+  }
+  \def\ppn#1{\pgn=#1\gobble}
+  \def\ppnn{\pgn=\first}
+  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \ifx\p\space\else\addtokens{\filename}{\PP}%
+        \advance\filenamelength by 1
+      \fi
+    \fi
+    \nextsp}
+  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  \def\pdfurl#1{%
+    \begingroup
+      \normalturnoffactive\def\@{@}%
+      \let\value=\expandablevalue
+      \leavevmode\Red
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+        % #1
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \linkcolor #1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+% Font-change commands.
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this one.
+\def\ttsl{\tenttsl}
+
+% Default leading.
+\newdimen\textleading  \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+  \normalbaselineskip = #1\relax
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+\newcount\mainmagstep
+\ifx\bigger\relax
+  % not really supported.
+  \mainmagstep=\magstep1
+  \setfont\textrm\rmshape{12}{1000}
+  \setfont\texttt\ttshape{12}{1000}
+\else
+  \mainmagstep=\magstephalf
+  \setfont\textrm\rmshape{10}{\mainmagstep}
+  \setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+% Instead of cmb10, you may want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10
+% (in Bob's opinion).
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+\setfont\deftt\ttshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page:
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{\magstep1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+  \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
+% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
+% redefine \bf itself.
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+  \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+  \let\tenttsl=\titlettsl
+  \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+  \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+  \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\def\smallfonts{%
+  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+  \let\tenttsl=\smallttsl
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+  \let\tenttsl=\smallerttsl
+  \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \smallerfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+% 
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+% 
+% I wish we used A4 paper on this side of the Atlantic.
+% 
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+\let\cite=\smartslanted
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+% 
+\catcode`@=11
+  \def\frenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+  }
+\catcode`@=\other
+
+\def\t#1{%
+  {\tt \rawbackslash \frenchspacing #1}%
+  \null
+}
+\let\ttfont=\t
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+    \vbox{\hrule\kern-0.4pt
+     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+    \kern-0.4pt\hrule}%
+  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \frenchspacing
+    #1%
+  }%
+  \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+%  -- rms.
+{
+  \catcode`\-=\active
+  \catcode`\_=\active
+  %
+  \global\def\code{\begingroup
+    \catcode`\-=\active \let-\codedash
+    \catcode`\_=\active \let_\codeunder
+    \codex
+  }
+  %
+  % If we end up with any active - characters when handling the index,
+  % just treat them as a normal -.
+  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
+\def\kbdinputstylexxx#1{%
+  \def\arg{#1}%
+  \ifx\arg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\arg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\arg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle `\arg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @url, @env, @command quotes seem unnecessary, so use \code.
+\let\url=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \code{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+% 
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @acronym downcases the argument and prints in smallcaps.
+\def\acronym#1{{\smallcaps \lowercase{#1}}}
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\def\shorttitlepage{\parsearg\shorttitlepagezzz}
+\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+        \endgroup\page\hbox{}\page}
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+   \let\subtitlerm=\tenrm
+   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+   %
+   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+                   \let\tt=\authortt}%
+   %
+   % Leave some space at the very top of the page.
+   \vglue\titlepagetopglue
+   %
+   % Now you can print the title using @title.
+   \def\title{\parsearg\titlezzz}%
+   \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
+                    % print a rule at the page bottom also.
+                    \finishedtitlepagefalse
+                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+   % No rule at page bottom unless we print one at the top with @title.
+   \finishedtitlepagetrue
+   %
+   % Now you can put text using @subtitle.
+   \def\subtitle{\parsearg\subtitlezzz}%
+   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+   %
+   % @author should come last, but may come many times.
+   \def\author{\parsearg\authorzzz}%
+   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+      {\authorfont \leftline{##1}}}%
+   %
+   % Most title ``pages'' are actually two pages long, with space
+   % at the top of the second.  We don't want the ragged left on the second.
+   \let\oldpage = \page
+   \def\page{%
+      \iffinishedtitlepage\else
+         \finishtitlepage
+      \fi
+      \oldpage
+      \let\page = \oldpage
+      \hbox{}}%
+%   \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+   \iffinishedtitlepage\else
+      \finishtitlepage
+   \fi
+   % It is important to do the page break before ending the group,
+   % because the headline and footline are only empty inside the group.
+   % If we use the new definition of \page, we always get a blank page
+   % after the title page, which we certainly don't want.
+   \oldpage
+   \endgroup
+   %
+   % Need this before the \...aftertitlepage checks so that if they are
+   % in effect the toc pages will come out with page numbers.
+   \HEADINGSon
+   %
+   % If they want short, they certainly want long too.
+   \ifsetshortcontentsaftertitlepage
+     \shortcontents
+     \contents
+     \global\let\shortcontents = \relax
+     \global\let\contents = \relax
+   \fi
+   %
+   \ifsetcontentsaftertitlepage
+     \contents
+     \global\let\contents = \relax
+     \global\let\shortcontents = \relax
+   \fi
+}
+
+\def\finishtitlepage{%
+   \vskip4pt \hrule height 2pt width \hsize
+   \vskip\titlepagebottomglue
+   \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -\baselineskip
+  \global\advance\vsize by -\baselineskip
+}
+
+\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+%
+}% unbind the catcode of @.
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+                 \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+                 \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemfont{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  (Unfortunately
+    % we can't prevent a possible page break at the following
+    % \baselineskip glue.)  However, if what follows is an environment
+    % such as @example, there will be no \parskip glue; then
+    % the negative vskip we just would cause the example and the item to
+    % crash together.  So we use this bizarre value of 10001 as a signal
+    % to \aboveenvbreak to insert \parskip glue after all.
+    % (Possibly there are other commands that could be followed by
+    % @example which need the same treatment, but not section titles; or
+    % maybe section titles are the only special case and they should be
+    % penalty 10001...)
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+% Contains a kludge to get @end[description] to work.
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+% @table, @ftable, @vtable.
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1        \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1        \endtabley
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1        \endtabley
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Necessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+  \begingroup % ended by the @end itemize
+  \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\afterenvbreak\endgroup}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  \begingroup % ended by the @end enumerate
+  %
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{In hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+%
+% For those who want to use more than one line's worth of words in
+% the preamble, break the line within one argument and it
+% will parse correctly, i.e.,
+%
+%     @multitable {Column 1 template} {Column 2 template} {Column 3
+%      template}
+% Not:
+%     @multitable {Column 1 template} {Column 2 template}
+%      {Column 3 template}
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multitable or @end multitable do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the part of the @columnfraction before the decimal point, which
+% is presumably either 0 or the empty string (but we don't check, we
+% just throw it away).  #2 is the decimal part, which we use as the
+% percent of \hsize for this column.
+\def\pickupwholefraction#1.#2 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% @multitable ... @end multitable definitions:
+%
+\def\multitable{\parsearg\dotable}
+\def\dotable#1{\bgroup
+  \vskip\parskip
+  \let\item=\crcrwithfootnotes
+  % A \tab used to include \hskip1sp.  But then the space in a template
+  % line is not enough.  That is bad.  So let's go back to just & until
+  % we encounter the problem it was intended to solve again.  --karl,
+  % nathan@acm.org, 20apr99.
+  \let\tab=&%
+  \let\startfootins=\startsavedfootnote
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  \def\Emultitable{%
+    \global\setpercentfalse
+    \crcrwithfootnotes\crcr
+    \egroup\egroup
+  }%
+  %
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % \everycr will reset column counter, \colcount, at the end of
+  % each line. Every column entry will cause \colcount to advance by one.
+  % The table preamble
+  % looks at the current \colcount to find the correct column width.
+  \everycr{\noalign{%
+  %
+  % \filbreak%% keeps underfull box messages off when table breaks over pages.
+  % Maybe so, but it also creates really weird page breaks when the table
+  % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
+  % manifests itself, so it can be fixed for real --karl.
+    \global\colcount=0\relax}}%
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup&\global\advance\colcount by 1\relax
+    \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+  %
+  % In order to keep entries from bumping into each other
+  % we will add a \leftskip of \multitablecolspace to all columns after
+  % the first one.
+  %
+  % If a template has been used, we will add \multitablecolspace
+  % to the width of each template entry.
+  %
+  % If the user has set preamble in terms of percent of \hsize we will
+  % use that dimension as the width of the column, and the \leftskip
+  % will keep entries from bumping into each other.  Table will start at
+  % left margin and final column will justify at right margin.
+  %
+  % Make sure we don't inherit \rightskip from the outer environment.
+  \rightskip=0pt
+  \ifnum\colcount=1
+    % The first column will be indented with the surrounding text.
+    \advance\hsize by\leftskip
+  \else
+    \ifsetpercent \else
+      % If user has not set preamble in terms of percent of \hsize
+      % we will advance \hsize by \multitablecolspace.
+      \advance\hsize by \multitablecolspace
+    \fi
+   % In either case we will make \leftskip=\multitablecolspace:
+  \leftskip=\multitablecolspace
+  \fi
+  % Ignoring space at the beginning and end avoids an occasional spurious
+  % blank line, when TeX decides to break the line at the space before the
+  % box from the multistrut, so the strut ends up on a line by itself.
+  % For example:
+  % @multitable @columnfractions .11 .89
+  % @item @code{#}
+  % @tab Legal holiday which is valid in major parts of the whole country.
+  % Is automatically provided with highlighting sequences respectively marking
+  % characters.
+  \noindent\ignorespaces##\unskip\multistrut}\cr
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+\else
+%% FIXME: what is \box0 supposed to be?
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi}
+
+% In case a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is
+% finished.  Otherwise, the insertion is lost, it never migrates to the
+% main vertical list.  --kasal, 22jan03.
+%
+\newbox\savedfootnotes
+%
+% \dotable \let's \startfootins to this, so that \dofootnote will call
+% it instead of starting the insertion right away.
+\def\startsavedfootnote{%
+  \global\setbox\savedfootnotes = \vbox\bgroup
+    \unvbox\savedfootnotes
+}
+\def\crcrwithfootnotes{%
+  \crcr
+  \ifvoid\savedfootnotes \else
+    \noalign{\insert\footins{\box\savedfootnotes}}%
+  \fi
+}
+
+\message{conditionals,}
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+  \let\chapter=\relax
+  \let\unnumbered=\relax
+  \let\top=\relax
+  \let\unnumberedsec=\relax
+  \let\unnumberedsection=\relax
+  \let\unnumberedsubsec=\relax
+  \let\unnumberedsubsection=\relax
+  \let\unnumberedsubsubsec=\relax
+  \let\unnumberedsubsubsection=\relax
+  \let\section=\relax
+  \let\subsec=\relax
+  \let\subsubsec=\relax
+  \let\subsection=\relax
+  \let\subsubsection=\relax
+  \let\appendix=\relax
+  \let\appendixsec=\relax
+  \let\appendixsection=\relax
+  \let\appendixsubsec=\relax
+  \let\appendixsubsection=\relax
+  \let\appendixsubsubsec=\relax
+  \let\appendixsubsubsection=\relax
+  \let\contents=\relax
+  \let\smallbook=\relax
+  \let\titlepage=\relax
+}
+
+% Used in nested conditionals, where we have to parse the Texinfo source
+% and so want to turn off most commands, in case they are used
+% incorrectly.
+%
+% We use \empty instead of \relax for the @def... commands, so that \end
+% doesn't throw an error.  For instance:
+% @ignore
+% @deffn ...
+% @end deffn
+% @end ignore
+% 
+% The @end deffn is going to get expanded, because we're trying to allow
+% nested conditionals.  But we don't want to expand the actual @deffn,
+% since it might be syntactically correct and intended to be ignored.
+% Since \end checks for \relax, using \empty does not cause an error.
+% 
+\def\ignoremorecommands{%
+  \let\defcodeindex = \relax
+  \let\defcv = \empty
+  \let\defcvx = \empty
+  \let\Edefcv = \empty
+  \let\deffn = \empty
+  \let\deffnx = \empty
+  \let\Edeffn = \empty
+  \let\defindex = \relax
+  \let\defivar = \empty
+  \let\defivarx = \empty
+  \let\Edefivar = \empty
+  \let\defmac = \empty
+  \let\defmacx = \empty
+  \let\Edefmac = \empty
+  \let\defmethod = \empty
+  \let\defmethodx = \empty
+  \let\Edefmethod = \empty
+  \let\defop = \empty
+  \let\defopx = \empty
+  \let\Edefop = \empty
+  \let\defopt = \empty
+  \let\defoptx = \empty
+  \let\Edefopt = \empty
+  \let\defspec = \empty
+  \let\defspecx = \empty
+  \let\Edefspec = \empty
+  \let\deftp = \empty
+  \let\deftpx = \empty
+  \let\Edeftp = \empty
+  \let\deftypefn = \empty
+  \let\deftypefnx = \empty
+  \let\Edeftypefn = \empty
+  \let\deftypefun = \empty
+  \let\deftypefunx = \empty
+  \let\Edeftypefun = \empty
+  \let\deftypeivar = \empty
+  \let\deftypeivarx = \empty
+  \let\Edeftypeivar = \empty
+  \let\deftypemethod = \empty
+  \let\deftypemethodx = \empty
+  \let\Edeftypemethod = \empty
+  \let\deftypeop = \empty
+  \let\deftypeopx = \empty
+  \let\Edeftypeop = \empty
+  \let\deftypevar = \empty
+  \let\deftypevarx = \empty
+  \let\Edeftypevar = \empty
+  \let\deftypevr = \empty
+  \let\deftypevrx = \empty
+  \let\Edeftypevr = \empty
+  \let\defun = \empty
+  \let\defunx = \empty
+  \let\Edefun = \empty
+  \let\defvar = \empty
+  \let\defvarx = \empty
+  \let\Edefvar = \empty
+  \let\defvr = \empty
+  \let\defvrx = \empty
+  \let\Edefvr = \empty
+  \let\clear = \relax
+  \let\down = \relax
+  \let\evenfooting = \relax
+  \let\evenheading = \relax
+  \let\everyfooting = \relax
+  \let\everyheading = \relax
+  \let\headings = \relax
+  \let\include = \relax
+  \let\item = \relax
+  \let\lowersections = \relax
+  \let\oddfooting = \relax
+  \let\oddheading = \relax
+  \let\printindex = \relax
+  \let\pxref = \relax
+  \let\raisesections = \relax
+  \let\ref = \relax
+  \let\set = \relax
+  \let\setchapternewpage = \relax
+  \let\setchapterstyle = \relax
+  \let\settitle = \relax
+  \let\up = \relax
+  \let\verbatiminclude = \relax
+  \let\xref = \relax
+}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescriptionword{documentdescription}
+\def\documentdescription{\doignore{documentdescription}}
+\def\html{\doignore{html}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory = \comment
+
+% Ignore text until a line `@end #1'.
+%
+\def\doignore#1{\begingroup
+  % Don't complain about control sequences we have declared \outer.
+  \ignoresections
+  %
+  % Define a command to swallow text until we reach `@end #1'.
+  % This @ is a catcode 12 token (that is the normal catcode of @ in
+  % this texinfo.tex file).  We change the catcode of @ below to match.
+  \long\def\doignoretext##1@end #1{\enddoignore}%
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \catcode\spaceChar = 10
+  %
+  % Ignore braces, too, so mismatched braces don't cause trouble.
+  \catcode`\{ = 9
+  \catcode`\} = 9
+  %
+  % We must not have @c interpreted as a control sequence.
+  \catcode`\@ = 12
+  %
+  \def\ignoreword{#1}%
+  \ifx\ignoreword\documentdescriptionword
+    % The c kludge breaks documentdescription, since
+    % `documentdescription' contains a `c'.  Means not everything will
+    % be ignored inside @documentdescription, but oh well...
+  \else
+    % Make the letter c a comment character so that the rest of the line
+    % will be ignored. This way, the document can have (for example)
+    %   @c @end ifinfo
+    % and the @end ifinfo will be properly ignored.
+    % (We've just changed @ to catcode 12.)
+    \catcode`\c = 14
+  \fi
+  %
+  % And now expand the command defined above.
+  \doignoretext
+}
+
+% What we do to finish off ignored text.
+%
+\def\enddoignore{\endgroup\ignorespaces}%
+
+\newif\ifwarnedobs\warnedobsfalse
+\def\obstexwarn{%
+  \ifwarnedobs\relax\else
+  % We need to warn folks that they may have trouble with TeX 3.0.
+  % This uses \immediate\write16 rather than \message to get newlines.
+    \immediate\write16{}
+    \immediate\write16{WARNING: for users of Unix TeX 3.0!}
+    \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+    \immediate\write16{If you are running another version of TeX, relax.}
+    \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
+    \immediate\write16{  Then upgrade your TeX installation if you can.}
+    \immediate\write16{  (See ftp://ftp.gnu.org/non-gnu/TeX.README.)}
+    \immediate\write16{If you are stuck with version 3.0, run the}
+    \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
+    \immediate\write16{  to use a workaround.}
+    \immediate\write16{}
+    \global\warnedobstrue
+    \fi
+}
+
+% **In TeX 3.0, setting text in \nullfont hangs tex.  For a
+% workaround (which requires the file ``dummy.tfm'' to be installed),
+% uncomment the following line:
+%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+
+% Ignore text, except that we keep track of conditional commands for
+% purposes of nesting, up to an `@end #1' command.
+%
+\def\nestedignore#1{%
+  \obstexwarn
+  % We must actually expand the ignored text to look for the @end
+  % command, so that nested ignore constructs work.  Thus, we put the
+  % text into a \vbox and then do nothing with the result.  To minimize
+  % the chance of memory overflow, we follow the approach outlined on
+  % page 401 of the TeXbook.
+  %
+  \setbox0 = \vbox\bgroup
+    % Don't complain about control sequences we have declared \outer.
+    \ignoresections
+    %
+    % Define `@end #1' to end the box, which will in turn undefine the
+    % @end command again.
+    \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+    %
+    % We are going to be parsing Texinfo commands.  Most cause no
+    % trouble when they are used incorrectly, but some commands do
+    % complicated argument parsing or otherwise get confused, so we
+    % undefine them.
+    %
+    % We can't do anything about stray @-signs, unfortunately;
+    % they'll produce `undefined control sequence' errors.
+    \ignoremorecommands
+    %
+    % Set the current font to be \nullfont, a TeX primitive, and define
+    % all the font commands to also use \nullfont.  We don't use
+    % dummy.tfm, as suggested in the TeXbook, because some sites
+    % might not have that installed.  Therefore, math mode will still
+    % produce output, but that should be an extremely small amount of
+    % stuff compared to the main input.
+    %
+    \nullfont
+    \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
+    \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
+    \let\tensf=\nullfont
+    % Similarly for index fonts.
+    \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
+    \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
+    \let\smallsf=\nullfont
+    % Similarly for smallexample fonts.
+    \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
+    \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
+    \let\smallersf=\nullfont
+    %
+    % Don't complain when characters are missing from the fonts.
+    \tracinglostchars = 0
+    %
+    % Don't bother to do space factor calculations.
+    \frenchspacing
+    %
+    % Don't report underfull hboxes.
+    \hbadness = 10000
+    %
+    % Do minimal line-breaking.
+    \pretolerance = 10000
+    %
+    % Do not execute instructions in @tex.
+    \def\tex{\doignore{tex}}%
+    % Do not execute macro definitions.
+    % `c' is a comment character, so the word `macro' will get cut off.
+    \def\macro{\doignore{ma}}%
+}
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.  Make sure the catcode of space is correct to avoid
+% losing inside @example, for instance.
+%
+\def\set{\begingroup\catcode` =10
+  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+  \parsearg\setxxx}
+\def\setxxx#1{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  \def\temp{#2}%
+  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+  \fi
+  \endgroup
+}
+% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+% \next or other control sequences that we've defined might get us into
+% an infinite loop. Consider `@set foo @cite{bar}'.
+\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+
+% @value{foo} gets the text saved in variable foo.
+{
+  \catcode`\_ = \active
+  %
+  % We might end up with active _ or - characters in the argument if
+  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
+  % such active characters to their normal equivalents.
+  \gdef\value{\begingroup
+    \catcode`\-=\other \catcode`\_=\other
+    \indexbreaks \let_\normalunderscore
+    \valuexxx}
+}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we \let\value to this in \indexdummies).  Ones
+% whose names contain - or _ still won't work, but we can't do anything
+% about that.  The command has to be fully expandable (if the variable
+% is set), since the result winds up in the index file.  This means that
+% if the variable's value contains other Texinfo commands, it's almost
+% certain it will fail (although perhaps we could fix that with
+% sufficient work to do a one-level expansion on the result, instead of
+% complete).
+%
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\doifset}
+\def\doifset#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \let\next=\ifsetfail
+  \else
+    \let\next=\ifsetsucceed
+  \fi
+  \next
+}
+\def\ifsetsucceed{\conditionalsucceed{ifset}}
+\def\ifsetfail{\nestedignore{ifset}}
+\defineunmatchedend{ifset}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+\def\ifclear{\parsearg\doifclear}
+\def\doifclear#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \let\next=\ifclearsucceed
+  \else
+    \let\next=\ifclearfail
+  \fi
+  \next
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\nestedignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
+% read the text following, through the first @end iftex (etc.).  Make
+% `@end iftex' (etc.) valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\def\ifnothtml{\conditionalsucceed{ifnothtml}}
+\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
+\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
+\defineunmatchedend{iftex}
+\defineunmatchedend{ifnothtml}
+\defineunmatchedend{ifnotinfo}
+\defineunmatchedend{ifnotplaintext}
+
+% True conditional.  Since \set globally defines its variables, we can
+% just start and end a group (to keep the @end definition undefined at
+% the outer level).
+%
+\def\conditionalsucceed#1{\begingroup
+  \expandafter\def\csname E#1\endcsname{\endgroup}%
+}
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+% 
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+% 
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  % Only do \closeout if we haven't already done it, else we'll end up
+  % closing the target index.
+  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+    % The \closeout helps reduce unnecessary open files; the limit on the
+    % Acorn RISC OS is a mere 16 files.
+    \expandafter\closeout\csname#2indfile\endcsname
+    \expandafter\let\csname\donesynindex#2\endcsname = 1
+  \fi
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+% 
+\def\indexdummies{%
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.  
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % \definedummyword defines \#1 as \realbackslash #1\space, thus
+  % effectively preventing its expansion.  This is used only for control
+  % words, not control letters, because the \space would be incorrect
+  % for control characters, but is needed to separate the control word
+  % from whatever follows.
+  % 
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  % 
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  % 
+  \def\definedummyword##1{%
+    \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+  }%
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+  }%
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux file, @ is the escape character.  So we want to redefine
+% everything using @ instead of \realbackslash.  When everything uses 
+% @, this will be simpler.
+% 
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % (See comments in \indexdummies.)
+  \def\definedummyword##1{%
+    \expandafter\def\csname ##1\endcsname{@##1\space}%
+  }%
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{@##1}%
+  }%
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% Called from \indexdummies and \atdummies.  \definedummyword and
+% \definedummyletter must be defined first.
+% 
+\def\commondummies{%
+  %
+  \normalturnoffactive
+  %
+  % Control letters and accents.
+  \definedummyletter{_}%
+  \definedummyletter{,}%
+  \definedummyletter{"}%
+  \definedummyletter{`}%
+  \definedummyletter{'}%
+  \definedummyletter{^}%
+  \definedummyletter{~}%
+  \definedummyletter{=}%
+  \definedummyword{u}%
+  \definedummyword{v}%
+  \definedummyword{H}%
+  \definedummyword{dotaccent}%
+  \definedummyword{ringaccent}%
+  \definedummyword{tieaccent}%
+  \definedummyword{ubaraccent}%
+  \definedummyword{udotaccent}%
+  \definedummyword{dotless}%
+  %
+  % Other non-English letters.
+  \definedummyword{AA}%
+  \definedummyword{AE}%
+  \definedummyword{L}%
+  \definedummyword{OE}%
+  \definedummyword{O}%
+  \definedummyword{aa}%
+  \definedummyword{ae}%
+  \definedummyword{l}%
+  \definedummyword{oe}%
+  \definedummyword{o}%
+  \definedummyword{ss}%
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword{bf}%
+  \definedummyword{gtr}%
+  \definedummyword{hat}%
+  \definedummyword{less}%
+  \definedummyword{sf}%
+  \definedummyword{sl}%
+  \definedummyword{tclose}%
+  \definedummyword{tt}%
+  %
+  % Texinfo font commands.
+  \definedummyword{b}%
+  \definedummyword{i}%
+  \definedummyword{r}%
+  \definedummyword{sc}%
+  \definedummyword{t}%
+  %
+  \definedummyword{TeX}%
+  \definedummyword{acronym}%
+  \definedummyword{cite}%
+  \definedummyword{code}%
+  \definedummyword{command}%
+  \definedummyword{dfn}%
+  \definedummyword{dots}%
+  \definedummyword{emph}%
+  \definedummyword{env}%
+  \definedummyword{file}%
+  \definedummyword{kbd}%
+  \definedummyword{key}%
+  \definedummyword{math}%
+  \definedummyword{option}%
+  \definedummyword{samp}%
+  \definedummyword{strong}%
+  \definedummyword{uref}%
+  \definedummyword{url}%
+  \definedummyword{var}%
+  \definedummyword{w}%
+  %
+  % Assorted special characters.
+  \definedummyword{bullet}%
+  \definedummyword{copyright}%
+  \definedummyword{dots}%
+  \definedummyword{enddots}%
+  \definedummyword{equiv}%
+  \definedummyword{error}%
+  \definedummyword{expansion}%
+  \definedummyword{minus}%
+  \definedummyword{pounds}%
+  \definedummyword{point}%
+  \definedummyword{print}%
+  \definedummyword{result}%
+  %
+  % Handle some cases of @value -- where the variable name does not
+  % contain - or _, and the value does not contain any
+  % (non-fully-expandable) commands.
+  \let\value = \expandablevalue
+  %
+  % Normal spaces, not active ones.
+  \unsepspaces
+  %
+  % No macro expansion.
+  \turnoffmacros
+}
+
+% If an index command is used in an @example environment, any spaces
+% therein should become regular spaces in the raw index file, not the
+% expansion of \tie (\leavevmode \penalty \@M \ ).
+{\obeyspaces
+ \gdef\unsepspaces{\obeyspaces\let =\space}}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+%
+\def\indexnofonts{%
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  \let\,=\asis
+  \let\"=\asis
+  \let\`=\asis
+  \let\'=\asis
+  \let\^=\asis
+  \let\~=\asis
+  \let\==\asis
+  \let\u=\asis
+  \let\v=\asis
+  \let\H=\asis
+  \let\dotaccent=\asis
+  \let\ringaccent=\asis
+  \let\tieaccent=\asis
+  \let\ubaraccent=\asis
+  \let\udotaccent=\asis
+  \let\dotless=\asis
+  %
+  % Other non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  % Texinfo font commands.
+  \let\b=\asis
+  \let\i=\asis
+  \let\r=\asis
+  \let\sc=\asis
+  \let\t=\asis
+  %
+  \let\TeX=\indexdummytex
+  \let\acronym=\asis
+  \let\cite=\asis
+  \let\code=\asis
+  \let\command=\asis
+  \let\dfn=\asis
+  \let\dots=\indexdummydots
+  \let\emph=\asis
+  \let\env=\asis
+  \let\file=\asis
+  \let\kbd=\asis
+  \let\key=\asis
+  \let\math=\asis
+  \let\option=\asis
+  \let\samp=\asis
+  \let\strong=\asis
+  \let\uref=\asis
+  \let\url=\asis
+  \let\var=\asis
+  \let\w=\asis
+}
+
+\let\indexbackslash=0  %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% For \ifx comparisons.
+\def\emptymacro{\empty}
+
+% Most index entries go through here, but \dosubind is the general case.
+%
+\def\doind#1#2{\dosubind{#1}{#2}\empty}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% \empty if called from \doind, as we usually are.  The main exception
+% is with defuns, which call us directly.
+%
+\def\dosubind#1#2#3{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+  \fi
+  {%
+    \count255=\lastpenalty
+    {%
+      \indexdummies % Must do this here, since \bf, etc expand at this stage
+      \escapechar=`\\
+      {%
+        \let\folio = 0% We will expand all macros now EXCEPT \folio.
+        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+        % so it will be output as is; and it will print as backslash.
+        %
+        % The main index entry text.
+        \toks0 = {#2}%
+        %
+        % If third arg is present, precede it with space in sort key.
+        \def\thirdarg{#3}%
+        \ifx\thirdarg\emptymacro \else
+           % If the third (subentry) arg is present, add it to the index
+           % line to write.
+          \toks0 = \expandafter{\the\toks0 \space #3}%
+        \fi
+        %
+        % Process the index entry with all font commands turned off, to
+        % get the string to sort by.
+        {\indexnofonts
+         \edef\temp{\the\toks0}% need full expansion
+         \xdef\indexsorttmp{\temp}%
+        }%
+        %
+        % Set up the complete index entry, with both the sort key and
+        % the original text, including any font commands.  We write
+        % three arguments to \entry to the .?? file (four in the
+        % subentry case), texindex reduces to two when writing the .??s
+        % sorted result.
+        \edef\temp{%
+          \write\csname#1indfile\endcsname{%
+            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+        }%
+        %
+        % If a skip is the last thing on the list now, preserve it
+        % by backing up by \lastskip, doing the \write, then inserting
+        % the skip again.  Otherwise, the whatsit generated by the
+        % \write will make \lastskip zero.  The result is that sequences
+        % like this:
+        % @end defun
+        % @tindex whatever
+        % @defun ...
+        % will have extra space inserted, because the \medbreak in the
+        % start of the @defun won't see the skip inserted by the @end of
+        % the previous defun.
+        %
+        % But don't do any of this if we're not in vertical mode.  We
+        % don't want to do a \vskip and prematurely end a paragraph.
+        %
+        % Avoid page breaks due to these extra skips, too.
+        %
+        \iflinks
+          \ifvmode
+            \skip0 = \lastskip
+            \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi
+          \fi
+          %
+          \temp % do the write
+          %
+          \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
+        \fi
+      }%
+    }%
+    \penalty\count255
+  }%
+}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\def\printindex{\parsearg\doprintindex}
+\def\doprintindex#1{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \indexbreaks
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 11
+  \openin 1 \jobname.#1s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+  \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\rawbackslashxx}%
+      \catcode`\\ = 0
+      \escapechar = `\\
+      \begindoublecolumns
+      \input \jobname.#1s
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+  % Some minor font changes for the special characters.
+  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+  %
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  \penalty -300
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus .5\baselineskip
+  \leftline{\secbf #1}%
+  \vskip .33\baselineskip plus .1\baselineskip
+  %
+  % Do our best not to break after the initial.
+  \nobreak
+}}
+
+% This typesets a paragraph consisting of #1, dot leaders, and then #2
+% flush to the right margin.  It is used for index and table of contents
+% entries.  The paragraph is indented by \leftskip.
+%
+\def\entry#1#2{\begingroup
+  %
+  % Start a new paragraph if necessary, so our assignments below can't
+  % affect previous text.
+  \par
+  %
+  % Do not fill out the last line with white space.
+  \parfillskip = 0in
+  %
+  % No extra space above this paragraph.
+  \parskip = 0in
+  %
+  % Do not prefer a separate line ending with a hyphen to fewer lines.
+  \finalhyphendemerits = 0
+  %
+  % \hangindent is only relevant when the entry text and page number
+  % don't both fit on one line.  In that case, bob suggests starting the
+  % dots pretty far over on the line.  Unfortunately, a large
+  % indentation looks wrong when the entry text itself is broken across
+  % lines.  So we use a small indentation and put up with long leaders.
+  %
+  % \hangafter is reset to 1 (which is the value we want) at the start
+  % of each paragraph, so we need not do anything with that.
+  \hangindent = 2em
+  %
+  % When the entry text needs to be broken, just fill out the first line
+  % with blank space.
+  \rightskip = 0pt plus1fil
+  %
+  % A bit of stretch before each entry for the benefit of balancing columns.
+  \vskip 0pt plus1pt
+  %
+  % Start a ``paragraph'' for the index entry so the line breaking
+  % parameters we've set above will have an effect.
+  \noindent
+  %
+  % Insert the text of the index entry.  TeX will do line-breaking on it.
+  #1%
+  % The following is kludged to not output a line of dots in the index if
+  % there are no page numbers.  The next person who breaks this will be
+  % cursed by a Unix daemon.
+  \def\tempa{{\rm }}%
+  \def\tempb{#2}%
+  \edef\tempc{\tempa}%
+  \edef\tempd{\tempb}%
+  \ifx\tempc\tempd\ \else%
+    %
+    % If we must, put the page number on a line of its own, and fill out
+    % this line with blank space.  (The \hfil is overwhelmed with the
+    % fill leaders glue in \indexdotfill if the page number does fit.)
+    \hfil\penalty50
+    \null\nobreak\indexdotfill % Have leaders before the page number.
+    %
+    % The `\ ' here is removed by the implicit \unskip that TeX does as
+    % part of (the primitive) \par.  Without it, a spurious underfull
+    % \hbox ensues.
+    \ifpdf
+      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+    \else
+      \ #2% The page number ends the paragraph.
+    \fi
+  \fi%
+  \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    #2
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % Grab any single-column material above us.
+  \output = {%
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.  (We don't need a separate register here,
+  % since nobody clobbers \vsize.)
+  \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  \advance\dimen@ by -\ht\partialpage
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\pagewidth{\box0\hfil\box2}%
+}
+% 
+% All done with double columns.
+\def\enddoublecolumns{%
+  \output = {%
+    % Split the last of the double-column material.  Leave it on the
+    % current page, no automatic page break.
+    \balancecolumns
+    %
+    % If we end up splitting too much material for the current page,
+    % though, there will be another page break right after this \output
+    % invocation ends.  Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.  (We hope \balancecolumns will never be
+    % called on to balance too much material, but if it is, this makes
+    % the output somewhat more palatable.)
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+  }%
+  \eject
+  \endgroup % started in \begindoublecolumns
+  %
+  % \pagegoal was set to the doubled \vsize above, since we restarted
+  % the current page.  We're now back to normal single-column
+  % typesetting, so reset \pagegoal to the normal \vsize (after the
+  % \endgroup where \vsize got restored).
+  \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2 % target to split to
+  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {%
+    \vbadness = 10000
+    \loop
+      \global\setbox3 = \copy0
+      \global\setbox1 = \vsplit3 to \dimen@
+    \ifdim\ht3>\dimen@
+      \global\advance\dimen@ by 1pt
+    \repeat
+  }%
+  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  %
+  \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+% \def\appendixletter{\char\the\appendixno}
+% We do the following for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it.  @section does likewise.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \chapterzzz{#2}
+\or
+  \seczzz{#2}
+\or
+  \numberedsubseczzz{#2}
+\or
+  \numberedsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \chapterzzz{#2}
+  \else
+    \numberedsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \appendixzzz{#2}
+\or
+  \appendixsectionzzz{#2}
+\or
+  \appendixsubseczzz{#2}
+\or
+  \appendixsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \appendixzzz{#2}
+  \else
+    \appendixsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \unnumberedzzz{#2}
+\or
+  \unnumberedseczzz{#2}
+\or
+  \unnumberedsubseczzz{#2}
+\or
+  \unnumberedsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \unnumberedzzz{#2}
+  \else
+    \unnumberedsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+% @chapter, @appendix, @unnumbered.
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
+  \chapmacro {#1}{\the\chapno}%
+  \gdef\thissection{#1}%
+  \gdef\thischaptername{#1}%
+  % We don't substitute the actual chapter name into \thischapter
+  % because we don't want its macros evaluated now.
+  \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+  \writetocentry{chap}{#1}{{\the\chapno}}
+  \donoderef
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+% we use \chapno to avoid indenting back
+\def\appendixbox#1{%
+  \setbox0 = \hbox{\putwordAppendix{} \the\chapno}%
+  \hbox to \wd0{#1\hss}}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  \global\advance \appendixno by 1
+  \message{\putwordAppendix\space \appendixletter}%
+  \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}%
+  \gdef\thissection{#1}%
+  \gdef\thischaptername{#1}%
+  \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+  \writetocentry{appendix}{#1}{{\appendixletter}}
+  \appendixnoderef
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\def\centerchap{\parsearg\centerchapyyy}
+\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+
+% @top is like @unnumbered.
+\outer\def\top{\parsearg\unnumberedyyy}
+
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}\message{(\the\toks0)}%
+  %
+  \unnumbchapmacro {#1}%
+  \gdef\thischapter{#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbchap}{#1}{{\the\chapno}}
+  \unnumbnoderef
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% Sections.
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz #1{%
+  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+  \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+  \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz #1{%
+  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+  \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+  \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz #1{%
+  \plainsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% Subsections.
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz #1{%
+  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+  \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+  \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz #1{%
+  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+  \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+  \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz #1{%
+  \plainsubsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% Subsubsections.
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz #1{%
+  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+  \subsubsecheading {#1}
+    {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+  \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz #1{%
+  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+  \subsubsecheading {#1}
+    {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+  \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz #1{%
+  \plainsubsubsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+%       1) We use \vbox rather than the earlier \line to permit
+%          overlong headings to fold.
+%       2) \hyphenpenalty is set to 10000 because hyphenation in a
+%          heading is obnoxious; this forbids it.
+%       3) Likewise, headings look best if no \parindent is used, and
+%          if justification is not attempted.  Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}\bigskip \par\penalty 200}
+
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\plainsecheading}
+\def\subheading{\parsearg\plainsubsecheading}
+\def\subsubheading{\parsearg\plainsubsubsecheading}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain
+\global\let\centerchapmacro=\centerchfplain}
+
+% Plain chapter opening.
+% #1 is the text, #2 the chapter number or empty if unnumbered.
+\def\chfplain#1#2{%
+  \pchapsepmacro
+  {%
+    \chapfonts \rm
+    \def\chapnum{#2}%
+    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% Plain opening for unnumbered.
+\def\unnchfplain#1{\chfplain{#1}{}}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+  \def\centerparametersmaybe{%
+    \advance\rightskip by 3\rightskip
+    \leftskip = \rightskip
+    \parfillskip = 0pt
+  }%
+  \chfplain{#1}{}%
+}}
+
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}\bigskip \par\nobreak
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt
+                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen
+\global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
+\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+
+% Subsection titles.
+\newskip \subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
+\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+
+% Subsubsection titles.
+\let\subsubsecheadingskip = \subsecheadingskip
+\let\subsubsecheadingbreak = \subsecheadingbreak
+\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
+\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
+
+
+% Print any size section title.
+%
+% #1 is the section type (sec/subsec/subsubsec), #2 is the section
+% number (maybe empty), #3 the text.
+\def\sectionheading#1#2#3{%
+  {%
+    \expandafter\advance\csname #1headingskip\endcsname by \parskip
+    \csname #1headingbreak\endcsname
+  }%
+  {%
+    % Switch to the right set of fonts.
+    \csname #1fonts\endcsname \rm
+    %
+    % Only insert the separating space if we have a section number.
+    \def\secnum{#2}%
+    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+    %
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 % zero if no section number
+          \unhbox0 #3}%
+  }%
+  % Add extra space after the heading -- either a line space or a
+  % paragraph space, whichever is more.  (Some people like to set
+  % \parskip to large values for some reason.)  Don't allow stretch, though.
+  \nobreak
+  \ifdim\parskip>\normalbaselineskip
+    \kern\parskip
+  \else
+    \kern\normalbaselineskip
+  \fi
+  \nobreak
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.  We supply {\folio} at the end of the
+% argument, which will end up as the last argument to the \...entry macro.
+%
+% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}}
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+%
+\newif\iftocfileopened
+\def\writetocentry#1#2#3{%
+  \iftocfileopened\else
+    \immediate\openout\tocfile = \jobname.toc
+    \global\tocfileopenedtrue
+  \fi
+  %
+  \iflinks
+    \toks0 = {#2}%
+    \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}%
+    \temp
+  \fi
+  %
+  % Tell \shipout to create a page destination if we're doing pdf, which
+  % will be the target of the links in the table of contents.  We can't
+  % just do it on every page because the title pages are numbered 1 and
+  % 2 (the page numbers aren't printed), and so are the first two pages
+  % of the document.  Thus, we'd have two destinations named `1', and
+  % two named `2'.
+  \ifpdf \pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Finish up the main text and prepare to read what we've written
+% to \tocfile.
+%
+\def\startcontents#1{%
+   % If @setchapternewpage on, and @headings double, the contents should
+   % start on an odd page, unlike chapters.  Thus, we maintain
+   % \contentsalignmacro in parallel with \pagealignmacro.
+   % From: Torbjorn Granlund <tege@matematik.su.se>
+   \contentsalignmacro
+   \immediate\closeout\tocfile
+   %
+   % Don't need to put `Contents' or `Short Contents' in the headline.
+   % It is abundantly clear what they are.
+   \unnumbchapmacro{#1}\def\thischapter{}%
+   \savepageno = \pageno
+   \begingroup                  % Set up to handle contents files properly.
+      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
+      % We can't do this, because then an actual ^ in a section
+      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
+      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+      \raggedbottom             % Worry more about breakpoints than the bottom.
+      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+      %
+      % Roman numerals for page numbers.
+      \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+   \startcontents{\putwordTOC}%
+     \openin 1 \jobname.toc
+     \ifeof 1 \else
+       \closein 1
+       \input \jobname.toc
+     \fi
+     \vfill \eject
+     \contentsalignmacro % in case @setchapternewpage odd is in effect
+     \pdfmakeoutlines
+   \endgroup
+   \lastnegativepageno = \pageno
+   \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+   \startcontents{\putwordShortTOC}%
+      %
+      \let\chapentry = \shortchapentry
+      \let\appendixentry = \shortappendixentry
+      \let\unnumbchapentry = \shortunnumberedentry
+      % We want a true roman here for the page numbers.
+      \secfonts
+      \let\rm=\shortcontrm \let\bf=\shortcontbf
+      \let\sl=\shortcontsl \let\tt=\shortconttt
+      \rm
+      \hyphenpenalty = 10000
+      \advance\baselineskip by 1pt % Open it up a little.
+      \def\secentry ##1##2##3##4{}
+      \def\subsecentry ##1##2##3##4##5{}
+      \def\subsubsecentry ##1##2##3##4##5##6{}
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      \openin 1 \jobname.toc
+      \ifeof 1 \else
+        \closein 1
+        \input \jobname.toc
+      \fi
+     \vfill \eject
+     \contentsalignmacro % in case @setchapternewpage odd is in effect
+   \endgroup
+   \lastnegativepageno = \pageno
+   \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+\ifpdf
+  \pdfcatalog{/PageMode /UseOutlines}%
+\fi
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+}
+
+% Appendices, in the main contents.
+\def\appendixentry#1#2#3{%
+  \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}}
+%
+% Appendices, in the short toc.
+\let\shortappendixentry = \shortchapentry
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
+% We could simplify the code here by writing out an \appendixentry
+% command in the toc file for appendices, instead of using \chapentry
+% for both, but it doesn't seem worth it.
+%
+\newdimen\shortappendixwidth
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  \dimen0 = 1em
+  \hbox to \dimen0{#1\hss}%
+}
+
+% Unnumbered chapters.
+\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}}
+\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}}
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% Final typesetting of a toc entry; we use the same \entry macro as for
+% the index entries, but we want to suppress hyphenation here.  (We
+% can't do that in the \entry macro, since index entries might consist
+% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+\def\tocentry#1#2{\begingroup
+  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+  % Do not use \turnoffactive in these arguments.  Since the toc is
+  % typeset in cmr, characters such as _ would come out wrong; we
+  % have to do the usual translation tricks.
+  \entry{#1}{#2}%
+\endgroup}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+% 
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+% 
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex    escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\==\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \escapechar=`\\
+  %
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\*=\ptexstar
+  \let\t=\ptext
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @end lisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% Make each space character in the input produce a normal interword
+% space in the output.  Don't allow a line break at this space, as this
+% is used only in environments like @example, where each line of input
+% should produce a line of output anyway.
+%
+{\obeyspaces %
+\gdef\sepspaces{\obeyspaces\let =\tie}}
+
+% Define \obeyedspace to be our active space, whatever it is.  This is
+% for use in \parsearg.
+{\sepspaces%
+\global\let\obeyedspace= }
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty>10000 \else \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\def\cartouche{%
+\par  % can't be in the midst of a paragraph.
+\begingroup
+        \lskip=\leftskip \rskip=\rightskip
+        \leftskip=0pt\rightskip=0pt %we want these *outside*.
+        \cartinner=\hsize \advance\cartinner by-\lskip
+                          \advance\cartinner by-\rskip
+        \cartouter=\hsize
+        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+%                                    side, and for 6pt waste from
+%                                    each corner char, and rule thickness
+        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+        % Flag to tell @lisp, etc., not to narrow margin.
+        \let\nonarrowing=\comment
+        \vbox\bgroup
+                \baselineskip=0pt\parskip=0pt\lineskip=0pt
+                \carttop
+                \hbox\bgroup
+                        \hskip\lskip
+                        \vrule\kern3pt
+                        \vbox\bgroup
+                                \hsize=\cartinner
+                                \kern3pt
+                                \begingroup
+                                        \baselineskip=\normbskip
+                                        \lineskip=\normlskip
+                                        \parskip=\normpskip
+                                        \vskip -\parskip
+\def\Ecartouche{%
+                                \endgroup
+                                \kern3pt
+                        \egroup
+                        \kern3pt\vrule
+                        \hskip\rskip
+                \egroup
+                \cartbot
+        \egroup
+\endgroup
+}}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+  \aboveenvbreak
+  \inENV % This group ends at the end of the body
+  \hfuzz = 12pt % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  \parindent = 0pt
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  % @cartouche defines \nonarrowing to inhibit narrowing
+  % at next level down.
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+    \let\exdent=\nofillexdent
+    \let\nonarrowing=\relax
+  \fi
+}
+
+% Define the \E... control sequence only if we are inside the particular
+% environment, so the error checking in \end will work.
+%
+% To end an @example-like environment, we first end the paragraph (via
+% \afterenvbreak's vertical glue), and then the group.  That way we keep
+% the zero \parskip that the environments set -- \parskip glue will be
+% inserted at the beginning of the next paragraph in the document, after
+% the environment.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}
+
+% @lisp: indented, narrowed, typewriter font.
+\def\lisp{\begingroup
+  \nonfillstart
+  \let\Elisp = \nonfillfinish
+  \tt
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble       % eat return
+}
+
+% @example: Same as @lisp.
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+\def\smalllisp{\begingroup
+  \def\Esmalllisp{\nonfillfinish\endgroup}%
+  \def\Esmallexample{\nonfillfinish\endgroup}%
+  \smallexamplefonts
+  \lisp
+}
+\let\smallexample = \smalllisp
+
+
+% @display: same as @lisp except keep current font.
+%
+\def\display{\begingroup
+  \nonfillstart
+  \let\Edisplay = \nonfillfinish
+  \gobble
+}
+%
+% @smalldisplay: @display plus smaller fonts.
+%
+\def\smalldisplay{\begingroup
+  \def\Esmalldisplay{\nonfillfinish\endgroup}%
+  \smallexamplefonts \rm
+  \display
+}
+
+% @format: same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eformat = \nonfillfinish
+  \gobble
+}
+%
+% @smallformat: @format plus smaller fonts.
+%
+\def\smallformat{\begingroup
+  \def\Esmallformat{\nonfillfinish\endgroup}%
+  \smallexamplefonts \rm
+  \format
+}
+
+% @flushleft (same as @format).
+%
+\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushright.
+%
+\def\flushright{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eflushright = \nonfillfinish
+  \advance\leftskip by 0pt plus 1fill
+  \gobble
+}
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\def\quotation{%
+  \begingroup\inENV %This group ends at the end of the @quotation body
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  % We have retained a nonzero parskip for the environment, since we're
+  % doing normal filling. So to avoid extra space below the environment...
+  \def\Equotation{\parskip = 0pt \nonfillfinish}%
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \advance\rightskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+    \let\nonarrowing = \relax
+  \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter, 
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=12}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+  \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \catcode`\`=\active
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen0=\wd0 % the width so far, or since the previous tab
+      \divide\dimen0 by\tabw
+      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
+      \wd0=\dimen0 \box0 \starttabbox
+    }%
+  }
+\endgroup
+\def\setupverbatim{%
+  % Easiest (and conventionally used) font for verbatim
+  \tt
+  \def\par{\leavevmode\egroup\box0\endgraf}%
+  \catcode`\`=\active
+  \tabexpand
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique 
+% delimiter characters.  Before first delimiter expect a 
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX, 
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%% Include LaTeX hack for completeness -- never know
+%% \begingroup
+%% \catcode`|=0 \catcode`[=1
+%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
+%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
+%% #1|endgroup|def|Everbatim[]|end[verbatim]]
+%% |endgroup
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
+\endgroup
+%
+\def\verbatim{%
+  \def\Everbatim{\nonfillfinish\endgroup}%
+  \begingroup
+    \nonfillstart
+    \advance\leftskip by -\defbodyindent
+    \begingroup\setupverbatim\doverbatim
+}
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+% Allow normal characters that we make active in the argument (a file name).
+\def\verbatiminclude{%
+  \begingroup
+    \catcode`\\=\other
+    \catcode`~=\other
+    \catcode`^=\other
+    \catcode`_=\other
+    \catcode`|=\other
+    \catcode`<=\other
+    \catcode`>=\other
+    \catcode`+=\other
+    \parsearg\doverbatiminclude
+}
+\def\setupverbatiminclude{%
+  \begingroup
+    \nonfillstart
+    \advance\leftskip by -\defbodyindent
+    \begingroup\setupverbatim
+}
+%
+\def\doverbatiminclude#1{%
+     % Restore active chars for included file.
+  \endgroup
+  \begingroup
+    \let\value=\expandablevalue
+    \def\thisfile{#1}%
+    \expandafter\expandafter\setupverbatiminclude\input\thisfile
+  \endgroup
+  \nonfillfinish
+  \endgroup
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.  Many commands won't be
+% allowed in this context, but that's ok.
+% 
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+% 
+\def\copying{\begingroup
+  % Define a command to swallow text until we reach `@end copying'.
+  % \ is the escape char in this texinfo.tex file, so it is the
+  % delimiter for the command; @ will be the escape char when we read
+  % it, but that doesn't matter.
+  \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
+  %
+  % We must preserve ^^M's in the input file; see \insertcopying below.
+  \catcode`\^^M = \active
+  \docopying
+}
+
+% What we do to finish off the copying text.
+%
+\def\enddocopying{\endgroup\ignorespaces}
+
+% @insertcopying.  Here we must play games with ^^M's.  On the one hand,
+% we need them to delimit commands such as `@end quotation', so they
+% must be active.  On the other hand, we certainly don't want every
+% end-of-line to be a \par, as would happen with the normal active
+% definition of ^^M.  On the third hand, two ^^M's in a row should still
+% generate a \par.
+% 
+% Our approach is to make ^^M insert a space and a penalty1 normally;
+% then it can also check if \lastpenalty=1.  If it does, then manually
+% do \par.
+% 
+% This messes up the normal definitions of @c[omment], so we redefine
+% it.  Similarly for @ignore.  (These commands are used in the gcc
+% manual for man page generation.)
+% 
+% Seems pretty fragile, most line-oriented commands will presumably
+% fail, but for the limited use of getting the copying text (which
+% should be quite simple) inserted, we can hope it's ok.
+%
+{\catcode`\^^M=\active %
+\gdef\insertcopying{\begingroup %
+  \parindent = 0pt  % looks wrong on title page
+  \def^^M{%
+    \ifnum \lastpenalty=1 %
+      \par %
+    \else %
+      \space \penalty 1 %
+    \fi %
+  }%
+  %
+  % Fix @c[omment] for catcode 13 ^^M's.
+  \def\c##1^^M{\ignorespaces}%
+  \let\comment = \c %
+  %
+  % Don't bother jumping through all the hoops that \doignore does, it
+  % would be very hard since the catcodes are already set.
+  \long\def\ignore##1\end ignore{\ignorespaces}%
+  %
+  \copyingtext %
+\endgroup}%
+}
+
+\message{defuns,}
+% @defun etc.
+
+% Allow user to change definition object font (\df) internally
+\def\setdeffont#1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+
+% We want ()&[] to print specially on the defun line.
+% 
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\&=\active
+  \catcode`\[=\active \catcode`\]=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+\global\let(=\lparen \global\let)=\rparen
+\global\let[=\lbrack \global\let]=\rbrack
+
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
+  \global\advance\parencount by 1
+}
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+  % also in that case restore the outer-level definition of (.
+  \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+  \global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text.  This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
+\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
+\let\ampnr = \&
+\def\lbrb{{\bf\char`\[}}
+\def\rbrb{{\bf\char`\]}}
+
+% Active &'s sneak into the index arguments, so make sure it's defined.
+{
+  \catcode`& = \active
+  \global\let& = \ampnr
+}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the function name.
+% #2 is the type of definition, such as "Function".
+%
+\def\defname#1#2{%
+  % How we'll output the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \ifempty{#2}%
+    \def\defnametype{}%
+  \else
+    \def\defnametype{[\rm #2]}%
+  \fi
+  %
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \dimen2=\leftskip
+  \advance\dimen2 by -\defbodyindent
+  %
+  % Figure out values for the paragraph shape.
+  \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
+  \dimen0=\hsize \advance \dimen0 by -\wd0  % compute size for first line
+  \dimen1=\hsize \advance \dimen1 by -\defargsindent  % size for continuations
+  \parshape 2 0in \dimen0 \defargsindent \dimen1
+  %
+  % Output arg 2 ("Function" or some such) but stuck inside a box of
+  % width 0 so it does not interfere with linebreaking.
+  \noindent
+  %
+  {% Adjust \hsize to exclude the ambient margins,
+   % so that \rightline will obey them.
+   \advance \hsize by -\dimen2
+   \dimen3 = 0pt  % was -1.25pc
+   \rlap{\rightline{\defnametype\kern\dimen3}}%
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \advance\leftskip by -\defbodyindent
+  \exdentamount=\defbodyindent
+  {\df #1}\enskip        % output function name
+  % \defunargs will be called next to output the arguments, if any.
+}
+
+% Common pieces to start any @def...
+% #1 is the \E... control sequence to end the definition (which we define).
+% #2 is the \...x control sequence (which our caller defines).
+% #3 is the control sequence to process the header, such as \defunheader.
+% 
+\def\parsebodycommon#1#2#3{%
+  \begingroup\inENV
+  % If there are two @def commands in a row, we'll have a \nobreak,
+  % which is there to keep the function description together with its
+  % header.  But if there's nothing but headers, we want to allow a
+  % break after all.  Check for penalty 10002 (inserted by
+  % \defargscommonending) instead of 10000, since the sectioning
+  % commands insert a \penalty10000, and we don't want to allow a break
+  % between a section heading and a defun.
+  \ifnum\lastpenalty=10002 \penalty0 \fi
+  \medbreak
+  %
+  % Define the \E... end token that this defining construct specifies
+  % so that it will exit this group.
+  \def#1{\endgraf\endgroup\medbreak}%
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+% Common part of the \...x definitions.
+% 
+\def\defxbodycommon{%
+  % As with \parsebodycommon above, allow line break if we have multiple
+  % x headers in a row.  It's not a great place, though.
+  \ifnum\lastpenalty=10000 \penalty1000 \fi
+  %
+  \begingroup\obeylines
+}
+
+% Process body of @defun, @deffn, @defmac, etc.
+%
+\def\defparsebody#1#2#3{%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2{\defxbodycommon \activeparens \spacesplit#3}%
+  \catcode\equalChar=\active
+  \begingroup\obeylines\activeparens
+  \spacesplit#3%
+}
+
+% #1, #2, #3 are the common arguments (see \parsebodycommon above).
+% #4, delimited by the space, is the class name.
+%
+\def\defmethparsebody#1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
+  \begingroup\obeylines\activeparens
+  % The \empty here prevents misinterpretation of a construct such as
+  %   @deffn {whatever} {Enharmonic comma}
+  % See comments at \deftpparsebody, although in our case we don't have
+  % to remove the \empty afterwards, since it is empty.
+  \spacesplit{#3{#4}}\empty
+}
+
+% Used for @deftypemethod and @deftypeivar.
+% #1, #2, #3 are the common arguments (see \defparsebody).
+% #4, delimited by a space, is the class name.
+% #5 is the method's return type.
+%
+\def\deftypemethparsebody#1#2#3#4 #5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#4}{#5}}%
+}
+
+% Used for @deftypeop.  The change from \deftypemethparsebody is an
+% extra argument at the beginning which is the `category', instead of it
+% being the hardwired string `Method' or `Instance Variable'.  We have
+% to account for this both in the \...x definition and in parsing the
+% input at hand.  Thus also need a control sequence (passed as #5) for
+% the \E... definition to assign the category name to.
+% 
+\def\deftypeopparsebody#1#2#3#4#5 #6 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 ##3 {\def#4{##1}%
+    \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#5}{#6}}%
+}
+
+% For @defop.
+\def\defopparsebody #1#2#3#4#5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\def#4{##1}%
+    \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#5}}%
+}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+%
+\def\defvarparsebody #1#2#3{%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2{\defxbodycommon \spacesplit#3}%
+  \catcode\equalChar=\active
+  \begingroup\obeylines
+  \spacesplit#3%
+}
+
+% @defopvar.
+\def\defopvarparsebody #1#2#3#4#5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\def#4{##1}%
+    \defxbodycommon \spacesplit{#3{##2}}}%
+  \begingroup\obeylines
+  \spacesplit{#3{#5}}%
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+  \begingroup\obeylines
+  \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument.  Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name.  That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+  \begingroup\obeylines
+  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any).  That's what this does.
+%
+\def\removeemptybraces\empty#1\relax{#1}
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+%
+\def\parsetpheaderline#1#2#3{%
+  #1{\removeemptybraces#2\relax}{#3}%
+}%
+
+% Split up #2 (the rest of the input line) at the first space token.
+% call #1 with two arguments:
+%  the first is all of #2 before the space token,
+%  the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+%
+{\obeylines %
+ \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
+ \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
+   \ifx\relax #3%
+     #1{#2}{}%
+   \else %
+     #1{#2}{#3#4}%
+   \fi}%
+}
+
+% Define @defun.
+
+% This is called to end the arguments processing for all the @def... commands.
+%
+\def\defargscommonending{%
+  \interlinepenalty = 10000
+  \advance\rightskip by 0pt plus 1fil
+  \endgraf
+  \nobreak\vskip -\parskip
+  \penalty 10002  % signal to \parsebodycommon.
+}
+
+% This expands the args and terminates the paragraph they comprise.
+% 
+\def\defunargs#1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Set the font temporarily and use \font in case \setfont made \tensl a macro.
+{\tensl\hyphenchar\font=0}%
+#1%
+{\tensl\hyphenchar\font=45}%
+\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+  \defargscommonending
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\tclose{#1}% avoid \code because of side effects on active chars
+  \defargscommonending
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDeffunc}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type.  #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
+\deftypefunargs {#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% \defheaderxcond#1\relax$.$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
+
+% #1 is the classification.  #2 is the data type.  #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+%               at least some C++ text from working
+\defname {\defheaderxcond#2\relax$.$#3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefmac}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefspec}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defop CATEGORY CLASS OPERATION ARG...
+%
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+%
+\def\defopheader#1#2#3{%
+  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
+  \begingroup
+    \defname{#2}{\defoptype\ \putwordon\ #1}%
+    \defunargs{#3}%
+  \endgroup
+}
+
+% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
+%
+\def\deftypeop #1 {\def\deftypeopcategory{#1}%
+  \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
+                       \deftypeopcategory}
+%
+% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
+\def\deftypeopheader#1#2#3#4{%
+  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}
+            {\deftypeopcategory\ \putwordon\ \code{#1}}%
+    \deftypefunargs{#4}%
+  \endgroup
+}
+
+% @deftypemethod CLASS TYPE METHOD ARG...
+%
+\def\deftypemethod{%
+  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+%
+% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
+\def\deftypemethodheader#1#2#3#4{%
+  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
+    \deftypefunargs{#4}%
+  \endgroup
+}
+
+% @deftypeivar CLASS TYPE VARNAME
+%
+\def\deftypeivar{%
+  \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
+%
+% #1 is the class name, #2 the data type, #3 the variable name.
+\def\deftypeivarheader#1#2#3{%
+  \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}
+            {\putwordInstanceVariableof\ \code{#1}}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defmethod == @defop Method
+%
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+%
+% #1 is the class name, #2 the method name, #3 the args.
+\def\defmethodheader#1#2#3{%
+  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{#2}{\putwordMethodon\ \code{#1}}%
+    \defunargs{#3}%
+  \endgroup
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
+  \begingroup
+    \defname{#2}{\defcvtype\ \putwordof\ #1}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
+%
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+%
+\def\defivarheader#1#2#3{%
+  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
+  \begingroup
+    \defname{#2}{\putwordInstanceVariableof\ #1}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defvar
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+  \defargscommonending
+}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefvar}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefopt}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type.  #2 is the name, perhaps followed by text that
+% is actually part of the data type, which should not be put into the index.
+\def\deftypevarheader #1#2{%
+\dovarind#2 \relax% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
+  \defargscommonending
+\endgroup}
+\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
+  \defargscommonending
+\endgroup}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% These definitions are used if you use @defunx (etc.)
+% anywhere other than immediately after a @defun or @defunx.
+% 
+\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
+\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
+\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
+\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
+\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\defopx#1 {\errmessage{@defopx in invalid context}}
+\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
+\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
+\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
+\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
+\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
+\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
+\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
+\def\defunx#1 {\errmessage{@defunx in invalid context}}
+\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
+\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scanmacro#1{%
+   \begingroup \newlinechar`\^^M
+   % Undo catcode changes of \startcontents and \doprintindex
+   \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+   % Append \endinput to make sure that TeX does not see the ending newline.
+   \toks0={#1\endinput}%
+   \immediate\openout\macscribble=\jobname.tmp
+   \immediate\write\macscribble{\the\toks0}%
+   \immediate\closeout\macscribble
+   \let\xeatspaces\eatspaces
+   \input \jobname.tmp
+   \endgroup
+}
+\else
+\def\scanmacro#1{%
+\begingroup \newlinechar`\^^M
+% Undo catcode changes of \startcontents and \doprintindex
+\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
+\fi
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+\def\macrolist{}    % List of all defined macros in the form
+                    % \do\macro1\do\macro2...
+
+% Utility routines.
+% Thisdoes \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\macrobodyctxt{%
+  \catcode`\~=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\+=\other
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\@=\other
+  \catcode`\^^M=\other
+  \usembodybackslash}
+
+\def\macroargctxt{%
+  \catcode`\~=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\+=\other
+  \catcode`\@=\other
+  \catcode`\\=\other}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}%           now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0%
+  \else
+     \expandafter\parsemargdef \argl;%
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     % Add the macroname to \macrolist
+     \toks0 = \expandafter{\macrolist\do}%
+     \xdef\macrolist{\the\toks0
+       \expandafter\noexpand\csname\the\macname\endcsname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\def\unmacro{\parsearg\dounmacro}
+\def\dounmacro#1{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\do\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+% 
+\def\unmacrodo#1{%
+  \ifx#1\relax
+    % remove this
+  \else
+    \noexpand\do \noexpand #1%
+  \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list.  Set up \paramno and \paramlist
+% so \defmacro knows what to do.  Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX:  let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1%
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifrecursive
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\scanmacro{\temp}}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+         \egroup\noexpand\scanmacro{\temp}}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname xxx\endcsname
+          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+    \fi
+  \else
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+        \egroup
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \expandafter\noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+      \csname\the\macname xxx\endcsname
+      \paramlist{%
+          \egroup
+          \noexpand\norecurse{\the\macname}%
+          \noexpand\scanmacro{\temp}\egroup}%
+    \fi
+  \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {.  If so it reads up to the closing }, if not, it reads the whole
+% line.  Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup\else
+    \expandafter\parsearg
+  \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+  \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Just make them active and then expand them all to nothing.
+\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{\ignoreactivespaces
+\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
+           \expandafter\noexpand\csname#2\endcsname}%
+\expandafter\endgroup\next}
+
+
+\message{cross references,}
+% @xref etc.
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's job is to define \lastnode.
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\relax
+
+% The sectioning commands (@chapter, etc.) call these.
+\def\donoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}%
+      {Ysectionnumberandtype}%
+    \global\let\lastnode=\relax
+  \fi
+}
+\def\unnumbnoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
+    \global\let\lastnode=\relax
+  \fi
+}
+\def\appendixnoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}%
+      {Yappendixletterandtype}%
+    \global\let\lastnode=\relax
+  \fi
+}
+
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), namely NAME-title (the corresponding @chapter/etc. name),
+% NAME-pg (the page number), and NAME-snt (section number and type).
+% Called from \foonoderef.
+% 
+% We have to set \indexdummies so commands such as @code in a section
+% title aren't expanded.  It would be nicer not to expand the titles in
+% the first place, but there's so many layers that that is hard to do.
+%
+% Likewise, use \turnoffactive so that punctuation chars such as underscore
+% and backslash work in node names.
+% 
+\def\setref#1#2{{%
+  \atdummies
+  \pdfmkdest{#1}%
+  %
+  \turnoffactive
+  \dosetq{#1-title}{Ytitle}%
+  \dosetq{#1-pg}{Ypagenumber}%
+  \dosetq{#1-snt}{#2}%
+}}
+
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  \def\printedmanual{\ignorespaces #5}%
+  \def\printednodename{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual}%
+  \setbox0=\hbox{\printednodename}%
+  \ifdim \wd0 = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+      % Use the node name inside the square brackets.
+      \def\printednodename{\ignorespaces #1}%
+    \else
+      % Use the actual chapter/section title appear inside
+      % the square brackets.  Use the real section title if we have it.
+      \ifdim \wd1 > 0pt
+        % It is in another manual, so we don't have it.
+        \def\printednodename{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We know the real title if we have the xref values.
+          \def\printednodename{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printednodename{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+  % insert empty discretionaries after hyphens, which means that it will
+  % not find a line break at a hyphen in a node names.  Since some manuals
+  % are best written with fairly long node names, containing hyphens, this
+  % is a loss.  Therefore, we give the text of the node name again, so it
+  % is as if TeX is seeing it for the first time.
+  \ifpdf
+    \leavevmode
+    \getfilename{#4}%
+    {\turnoffactive \otherbackslash
+     \ifnum\filenamelength>0
+       \startlink attr{/Border [0 0 0]}%
+         goto file{\the\filename.pdf} name{#1}%
+     \else
+       \startlink attr{/Border [0 0 0]}%
+         goto name{#1}%
+     \fi
+    }%
+    \linkcolor
+  \fi
+  %
+  \ifdim \wd1 > 0pt
+    \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+  \else
+    % _ (for example) has to be the character _ for the purposes of the
+    % control sequence corresponding to the node, but it has to expand
+    % into the usual \leavevmode...\vrule stuff for purposes of
+    % printing. So we \turnoffactive for the \refx-snt, back on for the
+    % printing, back off for the \refx-pg.
+    {\turnoffactive \otherbackslash
+     % Only output a following space if the -snt ref is nonempty; for
+     % @unnumbered and @anchor, it won't be.
+     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+    }%
+    % [mynode],
+    [\printednodename],\space
+    % page 3
+    \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+  \fi
+  \endlink
+\endgroup}
+
+% \dosetq is called from \setref to do the actual \write (\iflinks).
+%
+\def\dosetq#1#2{%
+  {\let\folio=0%
+   \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
+   \iflinks \next \fi
+  }%
+}
+
+% \internalsetq{foo}{page} expands into
+%   CHARACTERS @xrdef{foo}{...expansion of \page...}
+\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq.
+% 
+\def\Ypagenumber{\folio}
+\def\Ytitle{\thissection}
+\def\Ynothing{}
+\def\Ysectionnumberandtype{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+\def\Yappendixletterandtype{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname X#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        \message{\linenumber Undefined cross reference `#1'.}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.
+%
+\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
+
+% Read the last existing aux file, if any.  No error if none exists.
+\def\readauxfile{\begingroup
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % Make the characters 128-255 be printing characters
+  {%
+    \count 1=128
+    \def\loop{%
+      \catcode\count 1=\other
+      \advance\count 1 by 1
+      \ifnum \count 1<256 \loop \fi
+    }%
+  }%
+  %
+  % Turn off \ as an escape so we do not lose on
+  % entries which were dumped with control sequences in their names.
+  % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
+  % Reference to such entries still does not work the way one would wish,
+  % but at least they do not bomb out when the aux file is read in.
+  \catcode`\\=\other
+  %
+  % @ is our escape character in .aux files.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+  %
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \closein 1
+    \input \jobname.aux
+    \global\havexrefstrue
+    \global\warnedobstrue
+  \fi
+  % Open the new aux file.  TeX will close it automatically at exit.
+  \openout\auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset and anything else that uses
+% \parseargline fail inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+% The start of the footnote looks usually like this:
+\gdef\startfootins{\insert\footins\bgroup}
+%
+% ... but this macro is redefined inside @multitable.
+%
+\gdef\dofootnote{%
+  \startfootins
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\pagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  \closein 1
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\undefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+    \nobreak\bigskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below. 
+    \nobreak\vskip\parskip
+    \nobreak
+    \line\bgroup\hss
+  \fi
+  %
+  % Output the image.
+  \ifpdf
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    % \epsfbox itself resets \epsf?size at each figure.
+    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+    \epsfbox{#1.eps}%
+  \fi
+  %
+  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
+\endgroup}
+
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename.  If done too late, it may not override everything
+% properly.  Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\def\documentlanguage{\parsearg\dodocumentlanguage}
+\def\dodocumentlanguage#1{%
+  \tex % read txi-??.tex file in plain TeX.
+  % Read the file if it exists.
+  \openin 1 txi-#1.tex
+  \ifeof1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+    \let\temp = \relax
+  \else
+    \def\temp{\input txi-#1.tex }%
+  \fi
+  \temp
+  \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+% 
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \pageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \pagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{46\baselineskip}{6in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050 
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{51\baselineskip}{160mm}
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.  
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\def\pagesizes{\parsearg\pagesizesxxx}
+\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \rawbackslashxx outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\rawbackslashxx=`\\
+
+% \rawbackslash defines an active \ to do \rawbackslashxx.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@rawbackslashxx}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+  @let"=@normaldoublequote
+  @let\=@realbackslash
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.  (Thus, \ is not expandable when this is in
+% effect.)
+% 
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @normalbackslash @fi
+  @catcode`+=@active
+  @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.  
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+@c Set initial fonts.
+@textfonts
+@rm
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
index 84b4ce6..31a1d68 100644 (file)
@@ -4,7 +4,7 @@ Copyright (C) 1988-2003 Free Software Foundation, Inc.
 
 @set EDITION 3.0
 @set VERSION 3.0-alpha
-@set UPDATED 12 September 2003
-@set UPDATED-MONTH September 2003
+@set UPDATED 13 November 2003
+@set UPDATED-MONTH November 2003
 
-@set LASTCHANGE Fri Sep 12 18:21:15 EDT 2003
+@set LASTCHANGE Thu Nov 13 09:47:04 EST 2003
diff --git a/error.c b/error.c
index ee9ce96..edb0e2e 100644 (file)
--- a/error.c
+++ b/error.c
@@ -1,5 +1,5 @@
 /* error.c -- Functions for handling errors. */
-/* Copyright (C) 1993 Free Software Foundation, Inc.
+/* Copyright (C) 1993-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -40,6 +40,8 @@ extern int errno;
 #endif /* !errno */
 
 #include "bashansi.h"
+#include "bashintl.h"
+
 #include "shell.h"
 #include "flags.h"
 #include "input.h"
@@ -58,6 +60,10 @@ extern pid_t shell_pgrp;
 extern int give_terminal_to __P((pid_t, int));
 #endif /* JOB_CONTROL */
 
+#if defined (ARRAY_VARS)
+extern char *bash_badsub_errmsg;
+#endif
+
 static void error_prolog __P((int));
 
 /* The current maintainer of the shell.  You change this in the
@@ -156,7 +162,7 @@ programming_error (format, va_alist)
   if (remember_on_history)
     {
       h = last_history_line ();
-      fprintf (stderr, "last command: %s\n", h ? h : "(null)");
+      fprintf (stderr, _("last command: %s\n"), h ? h : "(null)");
     }
 #endif
 
@@ -164,7 +170,7 @@ programming_error (format, va_alist)
   fprintf (stderr, "Report this to %s\n", the_current_maintainer);
 #endif
 
-  fprintf (stderr, "Stopping myself...");
+  fprintf (stderr, _("Aborting..."));
   fflush (stderr);
 
   abort ();
@@ -194,7 +200,7 @@ report_error (format, va_alist)
 
   va_end (args);
   if (exit_immediately_on_error)
-    sh_exit (1);
+    exit_shell (1);
 }
 
 void
@@ -251,7 +257,7 @@ internal_warning (format, va_alist)
 {
   va_list args;
 
-  fprintf (stderr, "%s: warning: ", get_name_for_error ());
+  fprintf (stderr, _("%s: warning: "), get_name_for_error ());
 
   SH_VA_START (args, format);
 
@@ -325,7 +331,7 @@ parser_error (lineno, format, va_alist)
   va_end (args);
 
   if (exit_immediately_on_error)
-    sh_exit (2);
+    exit_shell (2);
 }
 
 #ifdef DEBUG
@@ -396,10 +402,10 @@ trace (format, va_alist)
 
 
 static char *cmd_error_table[] = {
-       "unknown command error",        /* CMDERR_DEFAULT */
-       "bad command type",             /* CMDERR_BADTYPE */
-       "bad connector",                /* CMDERR_BADCONN */
-       "bad jump",                     /* CMDERR_BADJUMP */
+       N_("unknown command error"),    /* CMDERR_DEFAULT */
+       N_("bad command type"),         /* CMDERR_BADTYPE */
+       N_("bad connector"),            /* CMDERR_BADCONN */
+       N_("bad jump"),                 /* CMDERR_BADJUMP */
        0
 };
 
@@ -411,7 +417,7 @@ command_error (func, code, e, flags)
   if (code > CMDERR_LAST)
     code = CMDERR_DEFAULT;
 
-  programming_error ("%s: %s: %d", func, cmd_error_table[code], e);
+  programming_error ("%s: %s: %d", func, _(cmd_error_table[code]), e);
 }
 
 char *
@@ -421,7 +427,7 @@ command_errstr (code)
   if (code > CMDERR_LAST)
     code = CMDERR_DEFAULT;
 
-  return (cmd_error_table[code]);
+  return (_(cmd_error_table[code]));
 }
 
 #ifdef ARRAY_VARS
@@ -429,7 +435,7 @@ void
 err_badarraysub (s)
      const char *s;
 {
-  report_error ("%s: bad array subscript", s);
+  report_error ("%s: %s", s, _(bash_badsub_errmsg));
 }
 #endif
 
@@ -437,12 +443,12 @@ void
 err_unboundvar (s)
      const char *s;
 {
-  report_error ("%s: unbound variable", s);
+  report_error (_("%s: unbound variable"), s);
 }
 
 void
 err_readonly (s)
      const char *s;
 {
-  report_error ("%s: readonly variable", s);
+  report_error (_("%s: readonly variable"), s);
 }
diff --git a/eval.c b/eval.c
index 288993d..cb4d85a 100644 (file)
--- a/eval.c
+++ b/eval.c
@@ -30,6 +30,8 @@
 #include "bashansi.h"
 #include <stdio.h>
 
+#include "bashintl.h"
+
 #include "shell.h"
 #include "flags.h"
 #include "trap.h"
@@ -170,7 +172,7 @@ static sighandler
 alrm_catcher(i)
      int i;
 {
-  printf ("\007timed out waiting for input: auto-logout\n");
+  printf (_("\007timed out waiting for input: auto-logout\n"));
   bash_logout ();      /* run ~/.bash_logout if this is a login shell */
   jump_to_top_level (EXITPROG);
   SIGRETURN (0);
diff --git a/examples/bashdb/bashdb.vaughan b/examples/bashdb/bashdb.vaughan
new file mode 100644 (file)
index 0000000..6a24973
--- /dev/null
@@ -0,0 +1,561 @@
+#! /bin/bash
+# bashdb - Bash shell debugger
+#
+# Adapted from an idea in O'Reilly's `Learning the Korn Shell'
+# Copyright (C) 1993-1994 O'Reilly and Associates, Inc.
+# Copyright (C) 1998, 1999, 2001 Gary V. Vaughan <gvv@techie.com>>
+#
+# 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 of the License, 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-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# NOTE:
+#
+# This program requires bash 2.x.
+# If bash 2.x is installed as "bash2", you can invoke  bashdb like this:
+#
+#   DEBUG_SHELL=/bin/bash2 /bin/bash2 bashdb script.sh
+
+# TODO:
+#
+# break [regexp]
+# cond [break] [condition]
+# tbreak [regexp|+lines]
+# restart
+# Variable watchpoints
+# Output colourization
+# History with csh ^ substitution? Or write a readline frontend?
+# Instrument shell functions with the _steptrap in $_potbelliedpig
+# Instrument `source' and `.' files in $_potbelliedpig
+# be cleverer about lines we allow breakpoints to be set on
+# break [function_name]
+
+
+echo 'Bash Debugger version 1.2.4'
+
+export _dbname=$(echo "X$0"|sed -e 's,^X,,' -e 's,^.*/,,')
+
+if test $# -lt 1; then
+  echo "$_dbname: Usage: $_dbname <filename>" >&2
+  exit 1
+fi
+
+_guineapig=$1
+
+if test ! -r $1; then
+  echo "$_dbname: Cannot read file '$_guineapig'." >&2
+  exit 1
+fi
+
+shift
+
+__debug=${TMPDIR-/tmp}/bashdb.$$
+sed -e '/^# bashdb - Bash shell debugger/,/^# -- DO NOT DELETE THIS LINE -- /d' "$0" > $__debug
+cat $_guineapig >> $__debug
+exec ${DEBUG_SHELL-bash} $__debug $_guineapig "$@"
+
+exit 1
+
+# -- DO NOT DELETE THIS LINE -- The program depends on it
+
+#bashdb preamble
+# $1 name of the original guinea pig script
+
+__debug=$0
+_guineapig=$1
+
+shift
+
+function _steptrap
+{
+  local i=0
+  
+  _curline=$1
+
+  if [ -n "$_disps" ]
+  then
+    while (( $i < ${#_disps[@]} ))
+    do
+      if [ -n "${_disps[$i]}" ]
+      then
+        _msg "${_disps[$i]}: \c"
+        eval _msg ${_disps[$i]}
+      fi
+      let i=$i+1
+    done
+  fi
+
+  if (( $_trace )); then
+    _showline $_curline
+  fi
+  
+  if (( $_steps >= 0 )); then
+    let _steps="$_steps - 1"
+  fi
+
+  if _at_linenumbp ; then
+    _msg "Reached breakpoint at line $_curline"
+    _showline $_curline
+    _cmdloop
+  elif [ -n "$_brcond" ] && eval $_brcond; then
+    _msg "Break condition $_brcond true at line $_curline"
+    _showline $_curline
+    _cmdloop
+  elif (( $_steps == 0 && $_curline > 1)); then
+    # Assuming a real script will have the "#! /bin/sh" at line 1,
+    # assume that when $_curline == 1 we are inside backticks.
+    if (( ! $_trace )); then
+      _msg "Stopped at line $_curline"
+      _showline $_curline
+    fi
+    _cmdloop
+  fi
+}
+
+function _setbp
+{
+  local i f line
+
+  if [ -z "$1" ]
+  then
+    _listbp
+  elif [ $(echo $1 | grep '^\+*[1-9][0-9]*') ]
+  then
+    case $1 in
+    +*)
+      let f="$1 + `expr $1 : '+*\([1-9][0-9]*\)'`"
+      ;;
+    *)
+      let f=$1
+      ;;
+    esac
+
+    # find the next valid line
+    line="${_lines[$f]}"
+    while _invalidbreakp $f
+    do
+      let f="$f + 1"
+      line="${_lines[$f]}"
+    done
+
+    if (( $f != $1 ))
+    then
+      _msg "Line $1 is not a valid breakpoint"
+    fi
+
+    if [ -n "${_lines[$f]}" ]
+    then
+      _linebp=($(echo $( (for i in ${_linebp[*]} $1; do
+      echo $i; done) | sort -n) ))
+      _msg "Breakpoint set at line $f"
+    else
+      _msg "Breakpoints can only be set on executable lines"
+    fi
+  else
+    _msg "Please specify a numeric line number"
+  fi
+}
+
+function _listbp
+{
+  local i
+  
+  if [ -n "$_linebp" ]
+  then
+    _msg "Breakpoints:"
+    for i in ${_linebp[*]}; do
+      _showline $i
+    done
+  else
+    _msg "No breakpoints have been set"
+  fi
+}
+
+function _clearbp
+{
+  local i
+  if [ -z "$1" ]; then
+    read -e -p "Delete all breakpoints? "
+    case $REPLY in
+    y*)
+      unset _linebp[*]
+      _msg "All breakpoints have been cleared"
+      ;;
+    esac
+  elif [ $(echo $1 | grep '^[0-9]*') ]; then
+    _linebp=($(echo $(for i in ${_linebp[*]}; do
+              if (( $1 != $i )); then echo $1;  fi; done) ))
+    _msg "Breakpoint cleared at line $1"
+  else
+    _msg "Please specify a numeric line number"
+  fi
+}
+
+function _setbc
+{
+  if [ -n "$*" ]
+  then
+    _brcond=$args
+    _msg "Break when true: $_brcond"
+  else
+    _brcond=
+    _msg "Break condition cleared"
+  fi
+}
+
+function _setdisp
+{
+  if [ -z "$1" ]
+  then
+    _listdisp
+  else
+    _disps[${#_disps[@]}]="$1"
+    if (( ${#_disps[@]} < 10 ))
+    then
+      _msg " ${#_disps[@]}: $1"
+    else
+      _msg "${#_disps[@]}: $1"
+    fi
+  fi
+}
+
+function _listdisp
+{
+  local i=0 j
+  
+  if [ -n "$_disps" ]
+  then
+    while (( $i < ${#_disps[@]} ))
+    do
+      let j=$i+1
+    if (( ${#_disps[@]} < 10 ))
+    then
+      _msg " $j: ${_disps[$i]}"
+    else
+      _msg "$j: ${_disps[$i]}"
+    fi
+      let i=$j
+    done
+  else
+    _msg "No displays have been set"
+  fi
+}
+
+function _cleardisp
+{
+  if (( $# < 1 ))
+  then
+    read -e -p "Delete all display expressions? "
+    case $REPLY in
+    y*)
+      unset _disps[*]
+      _msg "All breakpoints have been cleared"
+      ;;
+    esac
+  elif [ $(echo $1 | grep '^[0-9]*') ]
+  then
+    unset _disps[$1]
+    _msg "Display $i has been cleared"
+  else
+    _listdisp
+    _msg "Please specify a numeric display number"
+  fi
+}   
+
+function _cmdloop
+{
+  local cmd args
+
+  while read -e -p "bashdb> " cmd args; do
+    test -n "$cmd" || { set $_lastcmd; cmd=$1; shift; args=$*; }
+    if [ -n "$cmd" ]
+    then
+      case $cmd in
+       b|br|bre|brea|break)
+         _setbp $args
+         _lastcmd="break $args"
+         ;;
+       co|con)
+         _msg "ambiguous command: '$cmd', condition, continue?"
+         ;;
+       cond|condi|condit|conditi|conditio|condition)
+         _setbc $args
+         _lastcmd="condition $args"
+         ;;
+       c|cont|conti|contin|continu|continue)
+         _lastcmd="continue"
+         return
+         ;;
+       d)
+         _msg "ambiguous command: '$cmd', delete, display?"
+         ;;
+       de|del|dele|delet|delete)
+         _clearbp $args
+         _lastcmd="delete $args"
+         ;;
+       di|dis|disp|displ|displa|display)
+         _setdisp $args
+         _lastcmd="display $args"
+         ;;
+       \?|h|he|hel|help)
+         _menu
+         _lastcmd="help"
+         ;;
+       l|li|lis|list)
+         _displayscript $args
+         # _lastcmd is set in the _displayscript function
+         ;;
+       p|pr|pri|prin|print)
+         _examine $args
+         _lastcmd="print $args"
+         ;;
+       q|qu|qui|quit)
+         exit
+         ;;
+       s|st|ste|step|n|ne|nex|next)
+         let _steps=${args:-1}
+         _lastcmd="next $args"
+         return
+         ;;
+       t|tr|tra|trac|trace)
+         _xtrace
+         ;;
+       u|un|und|undi|undis|undisp|undispl|undispla|undisplay)
+         _cleardisp $args
+         _lastcmd="undisplay $args"
+         ;;
+       !*)
+         eval ${cmd#!} $args
+         _lastcmd="$cmd $args"
+         ;;
+       *)
+         _msg "Invalid command: '$cmd'"
+         ;;
+      esac
+    fi
+  done
+}
+
+function _at_linenumbp
+{
+  local i=0
+
+  if [ "$_linebp" ]
+  then
+    while (( $i < ${#_linebp[@]} )); do
+      if (( ${_linebp[$i]} == $_curline )); then
+       return 0
+      fi
+      let i=$i+1
+    done
+  fi
+
+  return 1
+}
+
+function _invalidbreakp
+{
+  local line=${_lines[$1]}
+
+  if test -z "$line" \
+      || expr "$line" : '[ \t]*#.*' > /dev/null \
+      || expr "$line" : '[ \t]*;;[ \t]*$' > /dev/null \
+      || expr "$line" : '[ \t]*[^)]*)[ \t]*$' > /dev/null \
+      || expr "$line" : '[ \t]*;;[ \t]*#.**$' > /dev/null \
+      || expr "$line" : '[ \t]*[^)]*)[ \t]*;;[ \t]*$' > /dev/null \
+      || expr "$line" : '[ \t]*[^)]*)[ \t]*;;*[ \t]*#.*$' > /dev/null
+  then
+    return 0
+  fi
+
+  return 1
+}
+
+function _examine
+{
+  if [ -n "$*" ]
+  then
+    _msg "$args: \c"
+    eval _msg $args
+  else
+    _msg "Nothing to print"
+  fi
+}
+
+function _displayscript
+{
+  local i j start end bp cl
+
+  if (( $# == 1 ))
+  then
+    if test $1 = "%"
+    then
+      let start=1
+      let end=${#_lines[@]}
+    else
+      let start=$1-5
+      let end=$1+5
+    fi
+  elif (( $# > 1 ))
+  then
+    if test $1 = "^"
+    then
+      let start=1
+    else
+      let start=$1
+    fi
+
+    if test $2 = "\$"
+    then
+      let end=${#_lines[@]}
+    else
+      let end=$2
+    fi
+  else
+    let start=$_curline-5
+    let end=$_curline+5
+  fi
+
+  if (( $start < 1 ))
+  then
+    start=1
+  fi
+  if (( $end > ${#_lines[@]} ))
+  then
+    end=${#_lines[@]}
+  fi
+
+  let cl=$end-$start
+  if (( $cl > ${LINES-24} ))
+  then
+    pager=${PAGER-more}
+  else
+    pager=cat
+  fi
+  
+  i=$start
+  ( while (( $i <= $end )); do
+      _showline $i
+      let i=$i+1
+    done ) 2>&1 | $pager
+
+  # calculate the next block of lines
+  let start=$end+1
+  let end=$start+11
+  if (( $end > ${#_lines[@]} ))
+  then
+    end=${#_lines[@]}
+  fi
+
+  _lastcmd="list $start $end"
+}
+
+function _xtrace
+{
+  let _trace="! $_trace"
+  if (( $_trace )); then
+    _msg "Execution trace on"
+  else
+    _msg "Execution trace off"
+  fi
+}
+       
+function _msg
+{
+  echo -e "$@" >&2
+}
+
+function _showline
+{
+  local i=0 bp=' ' line=$1
+   
+  while (( $i < ${#_linebp[@]} ))
+  do
+    if [ ${_linebp[$i]} ] && (( ${_linebp[$i]} == $line ))
+    then
+      bp='*'
+    fi
+    let i=$i+1
+  done
+
+  if  (( $_curline == $line )); then
+    cl=">"
+  else
+    cl=" "
+  fi
+
+  if (( $line < 100 )); then
+    _msg "$_guineapig:$line   $bp $cl${_lines[$line]}"
+  elif (( $line < 10 )); then
+    _msg "$_guineapig:$line  $bp $cl${_lines[$line]}"
+  elif (( $line > 0 )); then
+    _msg "$_guineapig:$line $bp $cl${_lines[$line]}"
+  fi
+}
+
+function _cleanup
+{
+  rm -f $__debug $_potbelliedpig 2> /dev/null
+}
+
+function _menu
+{
+  _msg 'bashdb commands:
+       break N         set breakpoint at line N
+       break           list breakpoints & break condition
+       condition foo   set break condition to foo
+       condition       clear break condition
+       delete N        clear breakpoint at line N
+       delete          clear all breakpoints
+       display EXP     evaluate and display EXP for each debug step
+       display         show a list of display expressions
+       undisplay N     remove display expression N
+       list N M        display all lines of script between N and M
+       list N          display 5 lines of script either side of line N
+       list            display 5 lines if script either side of current line
+       continue        continue execution upto next breakpoint
+       next [N]        execute [N] statements (default 1)
+       print expr      prints the value of an expression
+       trace           toggle execution trace on/off
+       help            print this menu
+       ! string        passes string to a shell
+       quit            quit'
+}
+
+
+_linebp=
+let _trace=0
+let _i=1
+
+# Be careful about quoted newlines
+_potbelliedpig=${TMPDIR-/tmp}/$_guineapig.$$
+sed 's,\\$,\\\\,' $_guineapig > $_potbelliedpig
+
+_msg "Reading source from file: $_guineapig"
+while read; do
+  _lines[$_i]=$REPLY
+  let _i=$_i+1
+done < $_potbelliedpig
+
+trap _cleanup EXIT
+# Assuming a real script will have the "#! /bin/sh" at line 1,
+# don't stop at line 1 on the first run
+let _steps=2
+LINENO=-2
+trap '_steptrap $LINENO' DEBUG
+:
diff --git a/examples/complete/complete-tests b/examples/complete/complete-tests
new file mode 100644 (file)
index 0000000..50146a7
--- /dev/null
@@ -0,0 +1,50 @@
+# from zsh, just for testing
+complete -A stopped -P '%' bg
+complete -j -P '%' fg jobs disown
+# this is wrong at this point
+complete -j -P '%' -W '$(ps -x | tail +2 | cut -c1-5)' wait
+complete -c type
+complete -a unalias
+complete -v getopts read unset 
+complete -v -S '=' declare export local readonly typeset
+complete -f -- . source
+complete -A shopt shopt
+complete -e printenv
+
+complete -A helptopic help
+
+complete -c nohup exec nice eval
+complete -c -k time
+
+complete -A signal trap kill
+
+complete -f chown ln more cat
+complete -d mkdir rmdir
+
+complete -f -X '!*.+(gz|tgz)' gunzip gzcat zcat zmore
+complete -f -X '!*.Z' uncompress zmore zcat
+complete -f gzip
+
+complete -d cd pushd popd
+
+complete -A hostname rsh telnet rlogin ftp
+
+complete -u su
+complete -W '"${GROUPS[@]}"' newgrp
+complete -g groupdel groupmod
+
+complete -f -X '!*.+(ps|PS)' gs gv ghostview
+complete -f -X '!*.dvi' dvips xdvi
+complete -f -X '!*.pdf' acroread
+
+complete -f -X '!*.texi*' makeinfo texi2dvi texi2html
+
+complete -c gdb make
+
+complete -p gs
+complete -p
+
+complete -r xdvi
+complete -r notthere
+complete -r
+complete
diff --git a/examples/functions/sqroot b/examples/functions/sqroot
new file mode 100644 (file)
index 0000000..79715cb
--- /dev/null
@@ -0,0 +1,21 @@
+#From: Syamala Rao Tadigadapa <stadigad@us.oracle.com>
+#Subject: Re: Division in ksh(getting the exact number) Please HELP
+#Date: Mon, 25 Oct 1999 15:05:08 -0700
+#Message-ID: <3814D414.7B896084@us.oracle.com>
+
+#Here is how to calculate the (integer part of the) square root
+#of a number in a much cleaner way.
+
+sqroot()
+{
+       let arg=$1
+       let root=arg
+       while :
+       do
+               newroot=$(( (root+arg/root)/2 ))
+               (( newroot == root )) && { echo $root; return; }
+               let root=newroot
+       done
+}
+
+sqroot "$@"
diff --git a/examples/loadables/TODO b/examples/loadables/TODO
new file mode 100644 (file)
index 0000000..b498bdb
--- /dev/null
@@ -0,0 +1,4 @@
+cmp
+wc
+mkfifo
+paste
diff --git a/examples/loadables/bsdos.glue.c b/examples/loadables/bsdos.glue.c
new file mode 100644 (file)
index 0000000..9df731b
--- /dev/null
@@ -0,0 +1,191 @@
+#include <stdio.h>
+#include <limits.h>
+#include <locale.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdarg.h>
+#include "bashansi.h"
+#include "shell.h"
+#include "builtins.h"
+#include "stdc.h"
+#include "common.h"
+#include "bashgetopt.h"
+
+char *this_command_name = (char *)NULL;
+
+void
+builtin_error (const char *format, ...)
+{
+  va_list args;
+  char *name;
+
+  name = get_name_for_error ();
+  fprintf (stderr, "%s: ", name);
+
+  if (this_command_name && *this_command_name)
+    fprintf (stderr, "%s: ", this_command_name);
+
+  va_start (args, format);
+
+  vfprintf (stderr, format, args);
+  va_end (args);
+  fprintf (stderr, "\n");
+}
+
+int
+no_options(list)
+WORD_LIST *list;
+{
+  reset_internal_getopt ();
+  if (internal_getopt (list, "") != -1)
+    {
+      builtin_usage ();
+      return (1);
+    }
+  return (0);
+}
+
+int
+legal_number (string, result)
+     char *string;
+     long *result;
+{
+  long value;
+  char *ep;
+
+  if (result)
+    *result = 0;
+
+  value = strtol (string, &ep, 10);
+
+  /* If *string is not '\0' but *ep is '\0' on return, the entire string
+     is valid. */
+  if (string && *string && *ep == '\0')
+    {
+      if (result)
+        *result = value;
+      /* The SunOS4 implementation of strtol() will happily ignore
+         overflow conditions, so this cannot do overflow correctly
+         on those systems. */
+      return 1;
+    }
+    
+  return (0);
+}
+
+/* Return the number of elements in LIST, a generic list. */
+int
+list_length (list)
+     GENERIC_LIST *list;
+{
+  register int i;
+
+  for (i = 0; list; list = list->next, i++);
+  return (i);
+}
+
+GENERIC_LIST *
+reverse_list (list)
+     GENERIC_LIST *list;
+{
+  register GENERIC_LIST *next, *prev;
+
+  for (prev = (GENERIC_LIST *)NULL; list; )
+    {
+      next = list->next;
+      list->next = prev;
+      prev = list;
+      list = next;
+    }
+  return (prev);
+}
+
+WORD_DESC *
+make_bare_word (string)
+     char *string;
+{
+  WORD_DESC *temp;
+
+  temp = (WORD_DESC *)xmalloc (sizeof (WORD_DESC));
+  if (*string)
+    temp->word = savestring (string);
+  else
+    {
+      temp->word = xmalloc (1);
+      temp->word[0] = '\0';
+    }
+
+  temp->flags = 0;
+  return (temp);
+}
+WORD_LIST *
+make_word_list (word, link)
+     WORD_DESC *word;
+     WORD_LIST *link;
+{
+  WORD_LIST *temp;
+
+  temp = (WORD_LIST *)xmalloc (sizeof (WORD_LIST));
+  temp->word = word;
+  temp->next = link;
+  return (temp);
+}
+
+void
+builtin_usage()
+{
+  if (this_command_name && *this_command_name)
+    fprintf (stderr, "%s: usage: %s args\n", this_command_name, this_command_name);
+  fflush (stderr);
+}
+
+char *
+xmalloc(s)
+     size_t s;
+{
+  return (malloc (s));
+}
+
+WORD_LIST *
+argv_to_word_list (array, copy, starting_index)
+     char **array;
+     int copy, starting_index;
+{
+  WORD_LIST *list;
+  WORD_DESC *w;
+  int i, count;
+
+  if (array == 0 || array[0] == 0)
+    return (WORD_LIST *)NULL;
+
+  for (count = 0; array[count]; count++)
+    ;
+
+  for (i = starting_index, list = (WORD_LIST *)NULL; i < count; i++)
+    {
+      w = make_bare_word (copy ? "" : array[i]);
+      if (copy)
+        {
+          free (w->word);
+          w->word = array[i];
+        }
+      list = make_word_list (w, list);
+    }
+  return (REVERSE_LIST(list, WORD_LIST *));
+}
+
+/* Convert a WORD_LIST into a C-style argv.  Return the number of elements
+   in the list in *IP, if IP is non-null.  A convenience function for
+   loadable builtins; also used by `test'. */
+char **
+make_builtin_argv (list, ip)
+     WORD_LIST *list;
+     int *ip;
+{
+  char **argv;
+
+  argv = strvec_from_word_list (list, 0, 1, ip);
+  argv[0] = this_command_name;
+  return argv;
+}
+                
index b633629..c1682ed 100644 (file)
@@ -247,10 +247,17 @@ struct stat *st;
        struct passwd   *pw;
        struct group    *gr;
        char    *owner;
+       int     ma, mi, d;
+
+       ma = major (st->st_rdev);
+       mi = minor (st->st_rdev);
+#if defined (makedev)
+       d = makedev (ma, mi);
+#else
+       d = st->st_rdev & 0xFF;
+#endif
+       printf("Device (major/minor): %d (%d/%d)\n", d, ma, mi);
 
-       printf("Device (major/minor): %d (%d/%d)\n", (int) (st->st_dev & 0xFF),
-                                                    (int) major (st->st_dev),
-                                                    (int) minor (st->st_dev));
        printf("Inode: %d\n", (int) st->st_ino);
        printf("Mode: (%o) ", (int) st->st_mode);
        printmode((int) st->st_mode);
diff --git a/examples/loadables/perl/Makefile b/examples/loadables/perl/Makefile
new file mode 120000 (symlink)
index 0000000..c6ebd74
--- /dev/null
@@ -0,0 +1 @@
+/usr/local/build/chet/bash/bash-current/examples/loadables/perl/Makefile
\ No newline at end of file
diff --git a/examples/loadables/pushd.def b/examples/loadables/pushd.def
new file mode 100644 (file)
index 0000000..87300dc
--- /dev/null
@@ -0,0 +1,611 @@
+This file is pushd.def, from which is created pushd.c.  It implements the
+builtins "pushd", "popd", and "dirs" 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 pushd.c
+
+$BUILTIN pushd
+$FUNCTION pushd_builtin
+$DEPENDS_ON PUSHD_AND_POPD
+$SHORT_DOC pushd [dir | +N | -N] [-n]
+Adds a directory to the top of the directory stack, or rotates
+the stack, making the new top of the stack the current working
+directory.  With no arguments, exchanges the top two directories.
+
++N     Rotates the stack so that the Nth directory (counting
+       from the left of the list shown by `dirs', starting with
+       zero) is at the top.
+
+-N     Rotates the stack so that the Nth directory (counting
+       from the right of the list shown by `dirs', starting with
+       zero) is at the top.
+
+-n     suppress the normal change of directory when adding directories
+       to the stack, so only the stack is manipulated.
+
+dir    adds DIR to the directory stack at the top, making it the
+       new current working directory.
+
+You can see the directory stack with the `dirs' command.
+$END
+
+$BUILTIN popd
+$FUNCTION popd_builtin
+$DEPENDS_ON PUSHD_AND_POPD
+$SHORT_DOC popd [+N | -N] [-n]
+Removes entries from the directory stack.  With no arguments,
+removes the top directory from the stack, and cd's to the new
+top directory.
+
++N     removes the Nth entry counting from the left of the list
+       shown by `dirs', starting with zero.  For example: `popd +0'
+       removes the first directory, `popd +1' the second.
+
+-N     removes the Nth entry counting from the right of the list
+       shown by `dirs', starting with zero.  For example: `popd -0'
+       removes the last directory, `popd -1' the next to last.
+
+-n     suppress the normal change of directory when removing directories
+       from the stack, so only the stack is manipulated.
+
+You can see the directory stack with the `dirs' command.
+$END
+
+$BUILTIN dirs
+$FUNCTION dirs_builtin
+$DEPENDS_ON PUSHD_AND_POPD
+$SHORT_DOC dirs [-clpv] [+N] [-N]
+Display the list of currently remembered directories.  Directories
+find their way onto the list with the `pushd' command; you can get
+back up through the list with the `popd' command.
+
+The -l flag specifies that `dirs' should not print shorthand versions
+of directories which are relative to your home directory.  This means
+that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag
+causes `dirs' to print the directory stack with one entry per line,
+prepending the directory name with its position in the stack.  The -p
+flag does the same thing, but the stack position is not prepended.
+The -c flag clears the directory stack by deleting all of the elements.
+
++N     displays the Nth entry counting from the left of the list shown by
+       dirs when invoked without options, starting with zero.
+
+-N     displays the Nth entry counting from the right of the list shown by
+       dirs when invoked without options, starting with zero.
+$END
+
+#include <config.h>
+
+#if defined (PUSHD_AND_POPD)
+#include <stdio.h>
+#include <sys/param.h>
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#include "../bashansi.h"
+
+#include <errno.h>
+
+#include <tilde/tilde.h>
+
+#include "../shell.h"
+#include "../maxpath.h"
+#include "common.h"
+#include "builtext.h"
+
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+static char *m_badarg = "%s: bad argument";
+
+/* The list of remembered directories. */
+static char **pushd_directory_list = (char **)NULL;
+
+/* Number of existing slots in this list. */
+static int directory_list_size;
+
+/* Offset to the end of the list. */
+static int directory_list_offset;
+
+static void pushd_error ();
+static void clear_directory_stack ();
+static int cd_to_string ();
+static int change_to_temp ();
+static int get_dirstack_index ();
+static void add_dirstack_element ();
+
+#define NOCD           0x01
+#define ROTATE         0x02
+#define LONGFORM       0x04
+#define CLEARSTAK      0x08
+
+int
+pushd_builtin (list)
+     WORD_LIST *list;
+{
+  char *temp, *current_directory, *top;
+  int j, flags;
+  long num;
+  char direction;
+
+  /* If there is no argument list then switch current and
+     top of list. */
+  if (list == 0)
+    {
+      if (directory_list_offset == 0)
+       {
+         builtin_error ("no other directory");
+         return (EXECUTION_FAILURE);
+       }
+
+      current_directory = get_working_directory ("pushd");
+      if (current_directory == 0)
+       return (EXECUTION_FAILURE);
+
+      j = directory_list_offset - 1;
+      temp = pushd_directory_list[j];
+      pushd_directory_list[j] = current_directory;
+      j = change_to_temp (temp);
+      free (temp);
+      return j;
+    }
+
+  for (flags = 0; list; list = list->next)
+    {
+      if (ISOPTION (list->word->word, 'n'))
+       {
+         flags |= NOCD;
+       }
+      else if (ISOPTION (list->word->word, '-'))
+        {
+          list = list->next;
+          break;
+        }
+      else if (list->word->word[0] == '-' && list->word->word[1] == '\0')
+       /* Let `pushd -' work like it used to. */
+       break;
+      else if (((direction = list->word->word[0]) == '+') || direction == '-')
+       {
+         if (legal_number (list->word->word + 1, &num) == 0)
+           {
+             builtin_error (m_badarg, list->word->word);
+             builtin_usage ();
+             return (EXECUTION_FAILURE);
+           }
+
+         if (direction == '-')
+           num = directory_list_offset - num;
+
+         if (num > directory_list_offset || num < 0)
+           {
+             pushd_error (directory_list_offset, list->word->word);
+             return (EXECUTION_FAILURE);
+           }
+         flags |= ROTATE;
+       }
+      else if (*list->word->word == '-')
+       {
+         bad_option (list->word->word);
+         builtin_usage ();
+         return (EXECUTION_FAILURE);
+       }
+      else
+       break;
+    }
+
+  if (flags & ROTATE)
+    {
+      /* Rotate the stack num times.  Remember, the current
+        directory acts like it is part of the stack. */
+      temp = get_working_directory ("pushd");
+
+      if (num == 0)
+       {
+         j = ((flags & NOCD) == 0) ? change_to_temp (temp) : EXECUTION_SUCCESS;
+         free (temp);
+         return j;
+       }
+
+      do
+       {
+         top = pushd_directory_list[directory_list_offset - 1];
+
+         for (j = directory_list_offset - 2; j > -1; j--)
+           pushd_directory_list[j + 1] = pushd_directory_list[j];
+
+         pushd_directory_list[j + 1] = temp;
+
+         temp = top;
+         num--;
+       }
+      while (num);
+
+      j = ((flags & NOCD) == 0) ? change_to_temp (temp) : EXECUTION_SUCCESS;
+      free (temp);
+      return j;
+    }
+
+  if (list == 0)
+    return (EXECUTION_SUCCESS);
+
+  /* Change to the directory in list->word->word.  Save the current
+     directory on the top of the stack. */
+  current_directory = get_working_directory ("pushd");
+  if (current_directory == 0)
+    return (EXECUTION_FAILURE);
+
+  j = ((flags & NOCD) == 0) ? cd_builtin (list) : EXECUTION_SUCCESS;
+  if (j == EXECUTION_SUCCESS)
+    {
+      add_dirstack_element ((flags & NOCD) ? savestring (list->word->word) : current_directory);
+      dirs_builtin ((WORD_LIST *)NULL);
+      if (flags & NOCD)
+       free (current_directory);
+      return (EXECUTION_SUCCESS);
+    }
+  else
+    {
+      free (current_directory);
+      return (EXECUTION_FAILURE);
+    }
+}
+
+/* Pop the directory stack, and then change to the new top of the stack.
+   If LIST is non-null it should consist of a word +N or -N, which says
+   what element to delete from the stack.  The default is the top one. */
+int
+popd_builtin (list)
+     WORD_LIST *list;
+{
+  register int i;
+  long which;
+  int flags;
+  char direction;
+  char *which_word;
+
+  which_word = (char *)NULL;
+  for (flags = 0, which = 0L, direction = '+'; list; list = list->next)
+    {
+      if (ISOPTION (list->word->word, 'n'))
+        {
+          flags |= NOCD;
+        }
+      else if (ISOPTION (list->word->word, '-'))
+        {
+          list = list->next;
+          break;
+        }
+      else if (((direction = list->word->word[0]) == '+') || direction == '-')
+       {
+         if (legal_number (list->word->word + 1, &which) == 0)
+           {
+             builtin_error (m_badarg, list->word->word);
+             builtin_usage ();
+             return (EXECUTION_FAILURE);
+           }
+         which_word = list->word->word;
+       }
+      else if (*list->word->word == '-')
+       {
+         bad_option (list->word->word);
+         builtin_usage ();
+         return (EXECUTION_FAILURE);
+       }
+      else
+       break;
+    }
+
+  if (which > directory_list_offset || (directory_list_offset == 0 && which == 0))
+    {
+      pushd_error (directory_list_offset, which_word ? which_word : "");
+      return (EXECUTION_FAILURE);
+    }
+
+  /* Handle case of no specification, or top of stack specification. */
+  if ((direction == '+' && which == 0) ||
+      (direction == '-' && which == directory_list_offset))
+    {
+      i = ((flags & NOCD) == 0) ? cd_to_string (pushd_directory_list[directory_list_offset - 1])
+                               : EXECUTION_SUCCESS;
+      if (i != EXECUTION_SUCCESS)
+       return (i);
+      free (pushd_directory_list[--directory_list_offset]);
+    }
+  else
+    {
+      /* Since an offset other than the top directory was specified,
+        remove that directory from the list and shift the remainder
+        of the list into place. */
+      i = (direction == '+') ? directory_list_offset - which : which;
+      free (pushd_directory_list[i]);
+      directory_list_offset--;
+
+      /* Shift the remainder of the list into place. */
+      for (; i < directory_list_offset; i++)
+       pushd_directory_list[i] = pushd_directory_list[i + 1];
+    }
+
+  dirs_builtin ((WORD_LIST *)NULL);
+  return (EXECUTION_SUCCESS);
+}
+
+/* Print the current list of directories on the directory stack. */
+int
+dirs_builtin (list)
+     WORD_LIST *list;
+{
+  int flags, desired_index, index_flag, vflag;
+  long i;
+  char *temp, *w;
+
+  for (flags = vflag = index_flag = 0, desired_index = -1, w = ""; list; list = list->next)
+    {
+      if (ISOPTION (list->word->word, 'l'))
+       {
+         flags |= LONGFORM;
+       }
+      else if (ISOPTION (list->word->word, 'c'))
+       {
+         flags |= CLEARSTAK;
+       }
+      else if (ISOPTION (list->word->word, 'v'))
+       {
+         vflag |= 2;
+       }
+      else if (ISOPTION (list->word->word, 'p'))
+       {
+         vflag |= 1;
+       }
+      else if (ISOPTION (list->word->word, '-'))
+        {
+          list = list->next;
+          break;
+        }
+      else if (*list->word->word == '+' || *list->word->word == '-')
+        {
+          int sign;
+          if (legal_number (w = list->word->word + 1, &i) == 0)
+           {
+             builtin_error (m_badarg, list->word->word);
+             builtin_usage ();
+             return (EXECUTION_FAILURE);
+           }
+         sign = (*list->word->word == '+') ? 1 : -1;
+         desired_index = get_dirstack_index (i, sign, &index_flag);
+       }
+      else
+       {
+         bad_option (list->word->word);
+         builtin_usage ();
+         return (EXECUTION_FAILURE);
+       }
+    }
+
+  if (flags & CLEARSTAK)
+    {
+      clear_directory_stack ();
+      return (EXECUTION_SUCCESS);
+    }
+
+  if (index_flag && (desired_index < 0 || desired_index > directory_list_offset))
+    {
+      pushd_error (directory_list_offset, w);
+      return (EXECUTION_FAILURE);
+    }
+
+#define DIRSTACK_FORMAT(temp) \
+  (flags & LONGFORM) ? temp : polite_directory_format (temp)
+
+  /* The first directory printed is always the current working directory. */
+  if (index_flag == 0 || (index_flag == 1 && desired_index == 0))
+    {
+      temp = get_working_directory ("dirs");
+      if (temp == 0)
+       temp = savestring ("<no current directory>");
+      if (vflag & 2)
+       printf ("%2d  %s", 0, DIRSTACK_FORMAT (temp));
+      else
+       printf ("%s", DIRSTACK_FORMAT (temp));
+      free (temp);
+      if (index_flag)
+       {
+         putchar ('\n');
+         return EXECUTION_SUCCESS;
+       }
+    }
+
+#define DIRSTACK_ENTRY(i) \
+  (flags & LONGFORM) ? pushd_directory_list[i] \
+                    : polite_directory_format (pushd_directory_list[i])
+
+  /* Now print the requested directory stack entries. */
+  if (index_flag)
+    {
+      if (vflag & 2)
+       printf ("%2d  %s", directory_list_offset - desired_index,
+                          DIRSTACK_ENTRY (desired_index));
+      else
+       printf ("%s", DIRSTACK_ENTRY (desired_index));
+    }
+  else
+    for (i = directory_list_offset - 1; i >= 0; i--)
+      if (vflag >= 2)
+       printf ("\n%2d  %s", directory_list_offset - (int)i, DIRSTACK_ENTRY (i));
+      else
+       printf ("%s%s", (vflag & 1) ? "\n" : " ", DIRSTACK_ENTRY (i));
+
+  putchar ('\n');
+  fflush (stdout);
+  return (EXECUTION_SUCCESS);
+}
+
+static void
+pushd_error (offset, arg)
+     int offset;
+     char *arg;
+{
+  if (offset == 0)
+    builtin_error ("directory stack empty");
+  else if (arg)
+    builtin_error ("%s: bad directory stack index", arg);
+  else
+    builtin_error ("bad directory stack index");
+}
+
+static void
+clear_directory_stack ()
+{
+  register int i;
+
+  for (i = 0; i < directory_list_offset; i++)
+    free (pushd_directory_list[i]);
+  directory_list_offset = 0;
+}
+
+/* Switch to the directory in NAME.  This uses the cd_builtin to do the work,
+   so if the result is EXECUTION_FAILURE then an error message has already
+   been printed. */
+static int
+cd_to_string (name)
+     char *name;
+{
+  WORD_LIST *tlist;
+  int result;
+
+  tlist = make_word_list (make_word (name), NULL);
+  result = cd_builtin (tlist);
+  dispose_words (tlist);
+  return (result);
+}
+
+static int
+change_to_temp (temp)
+     char *temp;
+{
+  int tt;
+
+  tt = temp ? cd_to_string (temp) : EXECUTION_FAILURE;
+
+  if (tt == EXECUTION_SUCCESS)
+    dirs_builtin ((WORD_LIST *)NULL);
+
+  return (tt);
+}
+
+static void
+add_dirstack_element (dir)
+     char *dir;
+{
+  int j;
+
+  if (directory_list_offset == directory_list_size)
+    {
+      j = (directory_list_size += 10) * sizeof (char *);
+      pushd_directory_list = (char **)xrealloc (pushd_directory_list, j);
+    }
+  pushd_directory_list[directory_list_offset++] = dir;
+}
+
+static int
+get_dirstack_index (ind, sign, indexp)
+     int ind, sign, *indexp;
+{
+  if (indexp)
+    *indexp = sign > 0 ? 1 : 2;
+
+  /* dirs +0 prints the current working directory. */
+  /* dirs -0 prints last element in directory stack */
+  if (ind == 0 && sign > 0)
+    return 0;
+  else if (ind == directory_list_offset)
+    {
+      if (indexp)
+       *indexp = sign > 0 ? 2 : 1;
+      return 0;
+    }
+  else
+    return (sign > 0 ? directory_list_offset - ind : ind);
+}
+
+char *
+get_dirstack_element (ind, sign)
+     int ind, sign;
+{
+  int i;
+
+  i = get_dirstack_index (ind, sign, (int *)NULL);
+  return (i < 0 || i > directory_list_offset) ? (char *)NULL
+                                             : pushd_directory_list[i];
+}
+
+void
+set_dirstack_element (ind, sign, value)
+     int ind, sign;
+     char *value;
+{
+  int i;
+
+  i = get_dirstack_index (ind, sign, (int *)NULL);
+  if (ind == 0 || i < 0 || i > directory_list_offset)
+    return;
+  free (pushd_directory_list[i]);
+  pushd_directory_list[i] = savestring (value);
+}
+
+WORD_LIST *
+get_directory_stack ()
+{
+  register int i;
+  WORD_LIST *ret;
+  char *d, *t;
+
+  for (ret = (WORD_LIST *)NULL, i = 0; i < directory_list_offset; i++)
+    {
+      d = polite_directory_format (pushd_directory_list[i]);
+      ret = make_word_list (make_word (d), ret);
+    }
+  /* Now the current directory. */
+  d = get_working_directory ("dirstack");
+  i = 0;       /* sentinel to decide whether or not to free d */
+  if (d == 0)
+    d = ".";
+  else
+    {
+      t = polite_directory_format (d);
+      /* polite_directory_format sometimes returns its argument unchanged.
+        If it does not, we can free d right away.  If it does, we need to
+        mark d to be deleted later. */
+      if (t != d)
+       {
+         free (d);
+         d = t;
+       }
+      else /* t == d, so d is what we want */
+       i = 1;
+    }
+  ret = make_word_list (make_word (d), ret);
+  if (i)
+    free (d);
+  return ret;  /* was (REVERSE_LIST (ret, (WORD_LIST *)); */
+}
+#endif /* PUSHD_AND_POPD */
diff --git a/examples/loadables/pushd.inc b/examples/loadables/pushd.inc
new file mode 100644 (file)
index 0000000..768dae1
--- /dev/null
@@ -0,0 +1,90 @@
+static char *dirs_doc[] = {
+  "Display the list of currently remembered directories.  Directories",
+  "find their way onto the list with the `pushd' command; you can get",
+  "back up through the list with the `popd' command.",
+  "",
+  "The -l flag specifies that `dirs' should not print shorthand versions",
+  "of directories which are relative to your home directory.  This means",
+  "that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag",
+  "causes `dirs' to print the directory stack with one entry per line,",
+  "prepending the directory name with its position in the stack.  The -p",
+  "flag does the same thing, but the stack position is not prepended.",
+  "The -c flag clears the directory stack by deleting all of the elements.",
+  "",
+  "+N   displays the Nth entry counting from the left of the list shown by",
+  "     dirs when invoked without options, starting with zero.",
+  "",
+  "-N   displays the Nth entry counting from the right of the list shown by",
+  "     dirs when invoked without options, starting with zero.",
+  (char *)NULL
+};
+
+static char *pushd_doc[] = {
+  "Adds a directory to the top of the directory stack, or rotates",
+  "the stack, making the new top of the stack the current working",
+  "directory.  With no arguments, exchanges the top two directories.",
+  "",
+  "+N   Rotates the stack so that the Nth directory (counting",
+  "     from the left of the list shown by `dirs', starting with"
+  "     zero) is at the top.",
+  "",
+  "-N   Rotates the stack so that the Nth directory (counting",
+  "     from the right of the list shown by `dirs', starting with"
+  "     zero) is at the top.",
+  "",
+  "-n   suppress the normal change of directory when adding directories",
+  "     to the stack, so only the stack is manipulated.",
+  "",
+  "dir  adds DIR to the directory stack at the top, making it the",
+  "     new current working directory.",
+  "",
+  "You can see the directory stack with the `dirs' command.",
+  (char *)NULL
+};
+
+static char *popd_doc[] = {
+  "Removes entries from the directory stack.  With no arguments,",
+  "removes the top directory from the stack, and cd's to the new",
+  "top directory.",
+  "",
+  "+N   removes the Nth entry counting from the left of the list",
+  "     shown by `dirs', starting with zero.  For example: `popd +0'",
+  "     removes the first directory, `popd +1' the second.",   
+  "",
+  "-N   removes the Nth entry counting from the right of the list",
+  "     shown by `dirs', starting with zero.  For example: `popd -0'",
+  "     removes the last directory, `popd -1' the next to last.",
+  "",
+  "-n   suppress the normal change of directory when removing directories",
+  "     from the stack, so only the stack is manipulated.",
+  "",
+  "You can see the directory stack with the `dirs' command.",
+  (char *)NULL
+};
+
+struct builtin pushd_struct = {
+       "pushd",
+       pushd_builtin,
+       BUILTIN_ENABLED,
+       pushd_doc,
+       "pushd [+N | -N] [-n] [dir]",
+       0
+};
+
+struct builtin popd_struct = {
+       "popd",
+       popd_builtin,
+       BUILTIN_ENABLED,
+       popd_doc,
+       "popd [+N | -N] [-n]",
+       0
+};
+
+struct builtin dirs_struct = {
+       "dirs",
+       dirs_builtin,
+       BUILTIN_ENABLED,
+       dirs_doc,
+       "dirs [-clpv] [+N] [-N]",
+       0
+};
diff --git a/examples/loadables/sprintf.c b/examples/loadables/sprintf.c
new file mode 100644 (file)
index 0000000..b8cb824
--- /dev/null
@@ -0,0 +1,514 @@
+/*
+ * Copyright (c) 1989, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if !defined(BUILTIN) && !defined(SHELL)
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright (c) 1989, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n";
+#endif /* not lint */
+#endif
+
+#ifndef lint
+static char sccsid[] = "@(#)printf.c   8.1 (Berkeley) 7/20/93";
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+
+#include "bashansi.h"
+#include "shell.h"
+#include "builtins.h"
+#include "stdc.h"
+
+#if !defined (errno)
+extern int errno;
+#endif
+
+static char    sbuf[1024];
+static int     sblen;
+
+/* Gee, I wish sprintf could be reliably counted upon to return the
+   number of characters written :-( */
+#define PF(f, func) \
+do { \
+       if (fieldwidth) \
+               if (precision) \
+                       sprintf(sbuf, f, fieldwidth, precision, func); \
+               else \
+                       sprintf(sbuf, f, fieldwidth, func); \
+       else if (precision) \
+               sprintf(sbuf, f, precision, func); \
+       else \
+               sprintf(sbuf, f, func); \
+       spaddstr (sbuf, strlen (sbuf)); \
+} while (0)
+
+static int      asciicode __P((void));
+static void     escape __P((char *));
+static int      getchr __P((void));
+static double   getdouble __P((void));
+static int      getint __P((int *));
+static int      getlong __P((long *));
+static char    *getstr __P((void));
+static char    *mklong __P((char *, int));
+static void     usage __P((void));
+
+static char **gargv;
+
+static char *outstr;
+static int outsize;
+static int outind;
+
+int sprintf_builtin ();
+static int sprintf_main ();
+static void spaddstr ();
+
+extern char *this_command_name;
+extern char *single_quote ();
+extern char **make_builtin_argv ();
+
+static char *sprintf_doc[] = {
+  "sprintf formats and outputs its arguments, after the second, under control",
+  "of the format and assigns the result to the variable named by its first",
+  "argument. The format is a character string which contains three types",
+  "of objects: plain characters, which are simply copied to the output string,",
+  "character escape sequences which are converted and copied to the output",
+  "string, and format specifications, each of which causes printing of the",
+  "next successive argument.  In addition to the standard sprintf(3) formats,",
+  "%b means to expand escapes in the corresponding argument, and %q means",
+  "to quote the argument in a way that can be reused as shell input.  Each",
+  "one of the format specifications must not expand to more than 1024",
+  "characters, though there is no limit on the total size of the output",
+  "string.",
+  (char *)NULL
+};
+
+struct builtin sprintf_struct = {
+       "sprintf",
+       sprintf_builtin,
+       BUILTIN_ENABLED,
+       sprintf_doc,
+       "sprintf var format [arguments]",
+       (char *)0
+};
+
+int
+sprintf_builtin (list)
+     WORD_LIST *list;
+{
+  int c, r;
+  char **v, *varname;
+  WORD_LIST *l;
+  SHELL_VAR *var;
+
+  if (list == 0)
+    {
+      builtin_usage ();
+      return (EXECUTION_FAILURE);
+    }
+
+  varname = list->word->word;
+  list = list->next;
+
+  if (legal_identifier (varname) == 0)
+    {
+      builtin_error ("%s: not a legal variable name", varname);
+      return (EXECUTION_FAILURE);
+    }
+
+  outind = 0;
+  if (outstr == 0)
+    outstr = xmalloc (outsize = 64);
+  outstr[0] = '\0';
+
+  v = make_builtin_argv (list, &c);
+  r = sprintf_main (c, v);
+  free (v);
+
+  var = bind_variable (varname, outstr);
+  if (readonly_p (var))
+    {
+      builtin_error ("%s: readonly variable", varname);
+      return (EXECUTION_FAILURE);
+    }
+
+  return r;
+}
+
+static void
+spaddstr(str, len)
+     char *str;
+     int len;
+{
+  RESIZE_MALLOCED_BUFFER (outstr, outind, len, outsize, 64);
+  strcpy (outstr + outind, str);
+  outind += len;
+}
+
+static int
+sprintf_main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       extern int optind;
+       static char *skip1, *skip2;
+       int ch, end, fieldwidth, precision;
+       char convch, nextch, *format, *fmt, *start;
+
+       while ((ch = getopt(argc, argv, "")) != EOF)
+               switch (ch) {
+               case '?':
+               default:
+                       usage();
+                       return (1);
+               }
+       argc -= optind;
+       argv += optind;
+
+       if (argc < 1) {
+               usage();
+               return (1);
+       }
+
+       /*
+        * Basic algorithm is to scan the format string for conversion
+        * specifications -- once one is found, find out if the field
+        * width or precision is a '*'; if it is, gather up value.  Note,
+        * format strings are reused as necessary to use up the provided
+        * arguments, arguments of zero/null string are provided to use
+        * up the format string.
+        */
+       skip1 = "#-+ 0";
+       skip2 = "*0123456789";
+
+       escape(fmt = format = *argv);           /* backslash interpretation */
+       gargv = ++argv;
+       for (;;) {
+               end = 0;
+               /* find next format specification */
+next:          for (start = fmt;; ++fmt) {
+                       if (!*fmt) {
+                               /* avoid infinite loop */
+                               if (end == 1) {
+                                       warnx("missing format character",
+                                           NULL, NULL);
+                                       return (1);
+                               }
+                               end = 1;
+                               if (fmt > start)
+                                       (void)printf("%s", start);
+                               if (!*gargv)
+                                       return (0);
+                               fmt = format;
+                               goto next;
+                       }
+                       /* %% prints a % */
+                       if (*fmt == '%') {
+                               if (*++fmt != '%')
+                                       break;
+                               *fmt++ = '\0';
+                               (void)printf("%s", start);
+                               goto next;
+                       }
+               }
+
+               /* skip to field width */
+               for (; strchr(skip1, *fmt); ++fmt);
+               if (*fmt == '*') {
+                       if (getint(&fieldwidth))
+                               return (1);
+               } else
+                       fieldwidth = 0;
+
+               /* skip to possible '.', get following precision */
+               for (; strchr(skip2, *fmt); ++fmt);
+               if (*fmt == '.')
+                       ++fmt;
+               if (*fmt == '*') {
+                       if (getint(&precision))
+                               return (1);
+               } else
+                       precision = 0;
+
+               /* skip to conversion char */
+               for (; strchr(skip2, *fmt); ++fmt);
+               if (!*fmt) {
+                       warnx("missing format character", NULL, NULL);
+                       return (1);
+               }
+
+               convch = *fmt;
+               nextch = *++fmt;
+               *fmt = '\0';
+               switch(convch) {
+               case 'c': {
+                       char p;
+
+                       p = getchr();
+                       PF(start, p);
+                       break;
+               }
+               case 's': {
+                       char *p;
+
+                       p = getstr();
+                       PF(start, p);
+                       break;
+               }
+               case 'b': {             /* expand escapes in argument */
+                       char *p;
+
+                       p = getstr();
+                       escape(p);
+                       PF("%s", p);
+                       break;
+               }
+               case 'q': {             /* print with shell single quoting */
+                       char *p, *p2;
+
+                       p = getstr();
+                       p2 = single_quote(p);
+                       PF("%s", p2);
+                       free(p2);
+                       break;
+               }
+               case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': {
+                       long p;
+                       char *f;
+                       
+                       if ((f = mklong(start, convch)) == NULL)
+                               return (1);
+                       if (getlong(&p))
+                               return (1);
+                       PF(f, p);
+                       break;
+               }
+               case 'e': case 'E': case 'f': case 'g': case 'G': {
+                       double p;
+
+                       p = getdouble();
+                       PF(start, p);
+                       break;
+               }
+               default:
+                       warnx("illegal format character", NULL, NULL);
+                       return (1);
+               }
+               *fmt = nextch;
+       }
+       /* NOTREACHED */
+}
+
+static char *
+mklong(str, ch)
+       char *str;
+       int ch;
+{
+       static char copy[64];
+       int len;
+
+       len = strlen(str) + 2;
+       memmove(copy, str, len - 3);
+       copy[len - 3] = 'l';
+       copy[len - 2] = ch;
+       copy[len - 1] = '\0';
+       return (copy);
+}
+
+static void
+escape(fmt)
+       register char *fmt;
+{
+       register char *store;
+       register int value, c;
+
+       for (store = fmt; c = *fmt; ++fmt, ++store) {
+               if (c != '\\') {
+                       *store = c;
+                       continue;
+               }
+               switch (*++fmt) {
+               case '\0':              /* EOS, user error */
+                       *store = '\\';
+                       *++store = '\0';
+                       return;
+               case '\\':              /* backslash */
+               case '\'':              /* single quote */
+                       *store = *fmt;
+                       break;
+               case 'a':               /* bell/alert */
+                       *store = '\7';
+                       break;
+               case 'b':               /* backspace */
+                       *store = '\b';
+                       break;
+               case 'c':
+                       return;
+               case 'e':
+               case 'E':
+                       *store = '\033';
+                       break;
+               case 'f':               /* form-feed */
+                       *store = '\f';
+                       break;
+               case 'n':               /* newline */
+                       *store = '\n';
+                       break;
+               case 'r':               /* carriage-return */
+                       *store = '\r';
+                       break;
+               case 't':               /* horizontal tab */
+                       *store = '\t';
+                       break;
+               case 'v':               /* vertical tab */
+                       *store = '\13';
+                       break;
+                                       /* octal constant */
+               case '0': case '1': case '2': case '3':
+               case '4': case '5': case '6': case '7':
+                       for (c = 3, value = 0;
+                           c-- && *fmt >= '0' && *fmt <= '7'; ++fmt) {
+                               value <<= 3;
+                               value += *fmt - '0';
+                       }
+                       --fmt;
+                       *store = value;
+                       break;
+               default:
+                       *store = *fmt;
+                       break;
+               }
+       }
+       *store = '\0';
+}
+
+static int
+getchr()
+{
+       if (!*gargv)
+               return ('\0');
+       return ((int)**gargv++);
+}
+
+static char *
+getstr()
+{
+       if (!*gargv)
+               return ("");
+       return (*gargv++);
+}
+
+static char *Number = "+-.0123456789";
+static int
+getint(ip)
+       int *ip;
+{
+       long val;
+
+       if (getlong(&val))
+               return (1);
+       if (val > INT_MAX) {
+               warnx("%s: %s", *gargv, strerror(ERANGE));
+               return (1);
+       }
+       *ip = val;
+       return (0);
+}
+
+static int
+getlong(lp)
+       long *lp;
+{
+       long val;
+       char *ep;
+
+       if (!*gargv) {
+               *lp = 0;
+               return (0);
+       }
+       if (strchr(Number, **gargv)) {
+               errno = 0;
+               val = strtol(*gargv, &ep, 0);
+               if (*ep != '\0') {
+                       warnx("%s: illegal number", *gargv, NULL);
+                       return (1);
+               }
+               if (errno == ERANGE)
+                       if (val == LONG_MAX) {
+                               warnx("%s: %s", *gargv, strerror(ERANGE));
+                               return (1);
+                       }
+                       if (val == LONG_MIN) {
+                               warnx("%s: %s", *gargv, strerror(ERANGE));
+                               return (1);
+                       }
+                       
+               *lp = val;
+               ++gargv;
+               return (0);
+       }
+       *lp =  (long)asciicode();
+       return (0);
+}
+
+static double
+getdouble()
+{
+       if (!*gargv)
+               return ((double)0);
+       if (strchr(Number, **gargv))
+               return (atof(*gargv++));
+       return ((double)asciicode());
+}
+
+static int
+asciicode()
+{
+       register int ch;
+
+       ch = **gargv;
+       if (ch == '\'' || ch == '"')
+               ch = (*gargv)[1];
+       ++gargv;
+       return (ch);
+}
+
+static void
+usage()
+{
+       (void)fprintf(stderr, "usage: printf format [arg ...]\n");
+}
diff --git a/examples/loadables/xtitle.c b/examples/loadables/xtitle.c
new file mode 100644 (file)
index 0000000..244c8fa
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ * Originally from
+ *     http://www.excessus.demon.co.uk/misc-hacks/index.html#xtitle
+ */
+
+/*
+ * Made into a loadable builtin by chet@po.cwru.edu.
+ */
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <stdio.h>
+#ifdef HAVE_UNISTD_H
+#  include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <termios.h>
+
+#ifdef BASH_BUILTIN
+#include "shell.h"
+#include "builtins.h"
+#include "bashgetopt.h"
+#endif
+
+#ifdef BASH_BUILTIN
+int xtitle_builtin(WORD_LIST *list)
+#else
+int main(int argc, char *argv[])
+#endif
+{
+  int query = 0;
+  int fd;
+  int openned = 0;
+
+#ifdef BASH_BUILTIN
+  reset_internal_getopt();
+#endif
+  for (;;) {
+#ifdef BASH_BUILTIN
+    int i;
+    i = internal_getopt(list, "q");
+#else
+    int i = getopt(argc, argv, "q");
+#endif
+    if (i < 0)
+      break;
+    switch (i) {
+      case 'q':
+       query = 1;
+       break;
+      default:
+#ifdef BASH_BUILTIN
+       builtin_usage();
+#else
+       fprintf(stderr, "usage: xtitle [-q] [string]\n");
+#endif
+       return (1);
+    }
+  }
+
+#ifdef BASH_BUILTIN
+  if (!query && loptend == 0) {
+#else
+  if (!query && optind == argc) {
+#endif
+    fprintf(stderr, "xtitle: no string to set\n");
+    return (1);
+  }
+
+  {
+    char *t = getenv("TERM");
+    if (!t || strncmp(t, "xterm", 5))
+      return (0);
+  }
+
+  if (isatty(0))
+    fd = 0;
+  else {
+    fd = open("/dev/tty", O_RDWR);
+    if (fd < 0) {
+      fprintf(stderr, "xtitle: couldn't open terminal: %s", strerror(errno));
+      return (1);
+    }
+    openned = 1;
+  }
+
+  if (!query) {
+#ifdef BASH_BUILTIN
+    WORD_LIST *l = loptend;
+    char sp = ' ';
+    write(fd, "\33]0;", 4);
+    while (l) {
+      write(fd, l->word->word, strlen(l->word->word));
+      if (l->next)
+       write(fd, &sp, 1);
+      l = l->next;
+    }
+    write(fd, "\33\\", 2);
+#else
+    int i;
+    char sp = ' ';
+    write(fd, "\33]0;", 4);
+    for (i = optind; i < argc; i++) {
+      write(fd, argv[i], strlen(argv[i]));
+      if (i < argc - 1)
+       write(fd, &sp, 1);
+    }
+    write(fd, "\33\\", 2);
+#endif
+  } else {
+    struct termios o, n;
+    char hack;
+    int state = 0;
+
+    tcgetattr(fd, &o);
+    n = o;
+    n.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
+                  |INLCR|IGNCR|ICRNL|IXON);
+    n.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+    n.c_cflag &= ~(CSIZE|PARENB);
+    n.c_cflag |= CS8;
+    tcsetattr(fd, TCSAFLUSH, &n);
+    write(fd, "\33[21t", 5);
+
+    while (state != -1) {
+      if (read(fd, &hack, 1) < 1)
+       break;
+      switch (state) {
+       case 0:
+         if (hack == '\33') state = 1;
+         break;
+       case 1:
+         if (hack == ']') state = 2; else state = 0;
+         break;
+       case 2:
+         if (hack == 'l') state = 3; else state = 0;
+         break;
+       case 3:
+         if (hack == '\33') state = 4; else putchar(hack);
+         break;
+       case 4:
+         if (hack == '\\') { state = -1; putchar('\n'); }
+         else { putchar('\33'); putchar(hack); state = 3; }
+         break;
+      }
+    }
+
+    tcsetattr(fd, TCSAFLUSH, &o);
+  }
+
+  if (openned)
+    close(fd);
+
+  return (0);
+}
+
+
+#ifdef BASH_BUILTIN
+
+static char *xtitle_doc[] = {
+  "Either set or read the title of the current xterm window.  With the",
+  "-q option, writes the current xterm title to standard output.  Without",
+  "the -q option, sets the xterm title to be the arguments given,",
+  "separated by space characters.  [By Mark Wooding, mdw@nsict.org]",
+  0
+};
+
+struct builtin xtitle_struct = {
+  "xtitle",
+  xtitle_builtin,
+  BUILTIN_ENABLED,
+  xtitle_doc,
+  "xtitle [-q] [arguments]",
+  0
+};
+
+#endif
diff --git a/examples/obashdb/bashdb.x b/examples/obashdb/bashdb.x
new file mode 100644 (file)
index 0000000..3d0e961
--- /dev/null
@@ -0,0 +1,29 @@
+# kshdb - Korn Shell Debugger main file
+# adapted from 'Learning the Korn Shell' by Bill Rosenblatt (O'Reilly)
+# by Cigy Cyriac (cigy@felix.tulblr.unisys.com)
+# Main driver: constructs full script (with preamble) and runs it
+
+echo 'Bourne-Again Shell Debugger version 0.1'
+
+_pname=${0##*/}
+
+[ $# -eq 0 ] && {
+       echo "${_pname}: usage: ${_pname} <script_file>"
+       exit 1
+}
+
+_guineapig=$1
+
+[ -r $_guineapig ] || {
+       echo "${_pname}: cannot read $_guineapig." >&2
+       exit 1
+}
+shift
+
+_tmpdir=/tmp
+_libdir=.
+_dbgfile=$_tmpdir/bashdb$$             #temp file for script being debugged
+
+cat $_libdir/bashdb.pre $_guineapig > $_dbgfile
+exec $BASH -x $_dbgfile $_guineapig $_tmpdir $_libdir "$@"
+# end of bashdb
diff --git a/examples/scripts/adventure.sh.save1 b/examples/scripts/adventure.sh.save1
new file mode 100755 (executable)
index 0000000..4e22393
--- /dev/null
@@ -0,0 +1,549 @@
+#!/bin/bash
+#      ash -- "Adventure shell"
+#      last edit:      86/04/21        D A Gwyn
+#      SCCS ID:        @(#)ash.sh      1.4
+
+OPATH=$PATH
+
+ask()
+{
+       echo -n "$@" '[y/n] '
+       read ans
+
+       case "$ans" in
+       y*|Y*)
+               return 0
+               ;;
+       *)
+               return 1
+               ;;
+       esac
+}
+       
+CAT=${PAGER:-more}
+
+ash_inst()
+{
+       cat <<- EOF
+
+                       Instructions for the Adventure shell
+
+       Welcome to the Adventure shell!  In this exploration of the UNIX file
+       system, I will act as your eyes and hands.  As you move around, I will
+       describe whatever is visible and will carry out your commands.  The
+       general form of a command is
+               Verb Object Extra_stuff.
+       Most commands pay no attention to the "Extra_stuff", and many do not
+       need an "Object".  A typical command is
+               get all
+       which picks up all files in the current "room" (directory).  You can
+       find out what you are carrying by typing the command
+               inventory
+       The command "help" results in a full description of all commands that I
+       understand.  To quit the Adventure shell, type
+               quit
+
+       There are UNIX monsters lurking in the background.  These are also
+       known as "commands with arguments".
+
+       Good luck!
+       EOF
+}
+
+ash_help()
+{
+echo "I understand the following commands (synonyms in parentheses):"
+echo ""
+
+echo "change OBJECT to NEW_NAME       changes the name of the object"
+echo "clone OBJECT as NEW_NAME        duplicates the object"
+echo "drop OBJECTS                    leaves the objects in the room"
+echo "enter (go) PASSAGE              takes the labeled passage"
+echo "examine OBJECTS                 describes the objects in detail"
+echo "feed OBJECT to MONSTER          stuffs the object into a UNIX monster"
+echo "get (take) OBJECTS              picks up the specified objects"
+echo "gripe (bug)                     report a problem with the Adventure shell"
+echo "help                            prints this summary"
+echo "inventory (i)                   tells what you are carrying"
+echo "kill (destroy) OBJECTS          destroys the objects"
+echo "look (l)                        describes the room, including hidden objects"
+echo "open (read) OBJECT              shows the contents of an object"
+echo "quit (exit)                     leaves the Adventure shell"
+echo "resurrect OBJECTS               attempts to restore dead objects"
+echo "steal OBJECT from MONSTER       obtains the object from a UNIX monster"
+echo "throw OBJECT at daemon          feeds the object to the printer daemon"
+echo "up                              takes the overhead passage"
+echo "wake MONSTER                    awakens a UNIX monster"
+echo "where (w)                       tells you where you are"
+echo "xyzzy                           moves you to your home"
+}
+       
+MAINT=chet@ins.cwru.edu
+
+PATH=/usr/ucb:/bin:/usr/bin:/usr/local/bin:.
+export PATH
+
+trap 'echo Ouch!' 2 3
+#trap '' 18                    # disable Berkeley job control
+
+ash_lk(){ echo " $1 " | fgrep " $2 " >&- 2>&-; }
+ash_pr(){ echo $* | tr ' ' '\012' | pr -5 -t -w75 -l$[ ( $# + 4 ) / 5 ]; }
+ash_rm(){ echo " $1 " | sed -e "s/ $2 / /" -e 's/^ //' -e 's/ $//'; }
+
+# enable history, bang history expansion, and emacs editing
+set -o history
+set -o histexpand
+set -o emacs
+
+cd
+LIM=.limbo                     # $HOME/$LIM contains "destroyed" objects
+mkdir $LIM >&- 2>&-
+KNAP=.knapsack                 # $HOME/$KNAP contains objects being "carried"
+if [ ! -d $KNAP ]
+then   mkdir $KNAP >&- 2>&-
+       if [ $? = 0 ]
+       then    echo 'You found a discarded empty knapsack.'
+       else    echo 'You have no knapsack to carry things in.'
+               exit 1
+       fi
+else   echo 'One moment while I peek in your old knapsack...'
+fi
+
+kn=`echo \`ls -a $KNAP | sed -e '/^\.$/d' -e '/^\.\.$/d'\``
+
+if ask 'Welcome to the Adventure shell!  Do you need instructions?'
+then
+       ash_inst
+       echo -n 'Type a newline to continue: '
+       read
+fi
+
+wiz=false
+cha=false
+prev=$LIM
+while :
+do     room=`pwd`
+       if [ $room != $prev ]
+       then    if [ $room = $HOME ]
+               then    echo 'You are in your own home.'
+               else    echo "You have entered $room."
+               fi
+               exs=
+               obs=
+               hexs=
+               hobs=
+               f=false
+               for i in `ls -a`
+               do      case $i in
+                       .|..)   ;;
+                       .*)     if [ -f $i ]
+                               then    hobs="$hobs $i"
+                               elif [ -d $i ]
+                               then    hexs="$hexs $i"
+                               else    f=true
+                               fi
+                               ;;
+                       *)      if [ -f $i ]
+                               then    obs="$obs $i"
+                               elif [ -d $i ]
+                               then    exs="$exs $i"
+                               else    f=true
+                               fi
+                               ;;
+                       esac
+               done
+               if [ "$obs" ]
+               then    echo 'This room contains:'
+                       ash_pr $obs
+               else    echo 'The room looks empty.'
+               fi
+               if [ "$exs" ]
+               then    echo 'There are exits labeled:'
+                       ash_pr $exs
+                       echo 'as well as a passage overhead.'
+               else    echo 'There is a passage overhead.'
+               fi
+               if sh -c $f
+               then    echo 'There are shadowy figures in the corner.'
+               fi
+               prev=$room
+       fi
+
+       read -e -p '-advsh> ' verb obj x        # prompt is '-advsh> '
+       if [ $? != 0 ]
+       then    verb=quit               # EOF
+       fi
+
+       case $verb in
+       change)         if [ "$obj" ]
+                       then    if ash_lk "$obs $hobs" "$obj"
+                               then    set -- $x
+                                       case "$1" in
+                                       to)     if [ "$2" ]
+                                               then    if [ -f $2 ]
+                                                       then    echo "You must destroy $2 first."
+                                                               set --
+                                                       fi
+                                                       if [ "$2" ]
+                                                       then    if mv $obj $2 >&- 2>&-
+                                                               then    echo "The $obj shimmers and turns into $2."
+                                                                       obs=`ash_rm "$2 $obs" "$obj"`
+                                                               else    echo "There is a cloud of smoke but the $obj is unchanged."
+                                                               fi
+                                                       fi
+                                               else    echo 'To what?'
+                                               fi
+                                               ;;
+                                       *)      echo "Change $obj to what?"
+                                               ;;
+                                       esac
+                               else    if ash_lk "$kn" "$obj"
+                                       then    echo 'You must drop it first.'
+                                       else    echo "I see no $obj here."
+                                       fi
+                               fi
+                       else    echo 'Change what?'
+                       fi
+                       ;;
+       clone)          if [ "$obj" ]
+                       then    if ash_lk "$obs $hobs" "$obj"
+                               then    if [ ! -r $obj ]
+                                       then    echo "The $obj does not wish to be cloned."
+                                       else    set -- $x
+                                               case "$1" in
+                                               as)     if [ "$2" ]
+                                                       then    if [ -f $2 ]
+                                                               then    echo "You must destroy $2 first."
+                                                               else    if cp $obj $2 >&- 2>&-
+                                                                       then    echo "Poof!  When the smoke clears, you see the new $2."
+                                                                               obs="$obs $2"
+                                                                       else    echo 'You hear a dull thud but no clone appears.'
+                                                                       fi
+                                                               fi
+                                                       else    echo 'As what?'
+                                                       fi
+                                                       ;;
+                                               *)      echo "Clone $obj as what?"
+                                                       ;;
+                                               esac
+                                       fi
+                               else    if ash_lk "$kn" "$obj"
+                                       then    echo 'You must drop it first.'
+                                       else    echo "I see no $obj here."
+                                       fi
+                               fi
+                       else    echo 'Clone what?'
+                       fi
+                       ;;
+       drop)           if [ "$obj" ]
+                       then    for it in $obj $x
+                               do      if ash_lk "$kn" "$it"
+                                       then    if [ -w $it ]
+                                               then    echo "You must destroy $it first."
+                                               else    if mv $HOME/$KNAP/$it $it >&- 2>&-
+                                                       then    echo "$it: dropped."
+                                                               kn=`ash_rm "$kn" "$it"`
+                                                               obs=`echo $it $obs`
+                                                       else    echo "The $it is caught in your knapsack."
+                                                       fi
+                                               fi
+                                       else    echo "You're not carrying the $it!"
+                                       fi
+                               done
+                       else    echo 'Drop what?'
+                       fi
+                       ;;
+       enter|go)       if [ "$obj" ]
+                       then    if [ $obj != up ]
+                               then    if ash_lk "$exs $hexs" "$obj"
+                                       then    if [ -x $obj ]
+                                               then    if cd $obj
+                                                       then    echo 'You squeeze through the passage.'
+                                                       else    echo "You can't go that direction."
+                                                       fi
+                                               else    echo 'An invisible force blocks your way.'
+                                               fi
+                                       else    echo 'I see no such passage.'
+                                       fi
+                               else    if cd ..
+                                       then    echo 'You struggle upwards.'
+                                       else    echo "You can't reach that high."
+                                       fi
+                               fi
+                       else    echo 'Which passage?'
+                       fi
+                       ;;
+       examine)        if [ "$obj" ]
+                       then    if [ $obj = all ]
+                               then    $obj=`echo $obs $exs`
+                                       x=
+                               fi
+                               for it in $obj $x
+                               do      if ash_lk "$obs $hobs $exs $hexs" "$it"
+                                       then    echo "Upon close inspection of the $it, you see:"
+                                               ls -ld $it 2>&-
+                                               if [ $? != 0 ]
+                                               then    echo "-- when you look directly at the $it, it vanishes."
+                                               fi
+                                       else    if ash_lk "$kn" "$it"
+                                               then    echo 'You must drop it first.'
+                                               else    echo "I see no $it here."
+                                               fi
+                                       fi
+                               done
+                       else    echo 'Examine what?'
+                       fi
+                       ;;
+       feed)           if [ "$obj" ]
+                       then    if ash_lk "$obs $hobs" "$obj"
+                               then    set -- $x
+                                       case "$1" in
+                                       to)     if [ "$2" ]
+                                               then    shift
+                                                       if PATH=$OPATH $* <$obj 2>&-
+                                                       then    echo "The $1 monster devours your $obj."
+                                                               if rm -f $obj >&- 2>&-
+                                                               then    obs=`ash_rm "$obs" "$obj"`
+                                                               else    echo 'But he spits it back up.'
+                                                               fi
+                                                       else    echo "The $1 monster holds his nose in disdain."
+                                                       fi
+                                               else    echo 'To what?'
+                                               fi
+                                               ;;
+                                       *)      echo "Feed $obj to what?"
+                                               ;;
+                                       esac
+                               else    if ash_lk "$kn" "$obj"
+                                       then    echo 'You must drop it first.'
+                                       else    echo "I see no $obj here."
+                                       fi
+                               fi
+                       else    echo 'Feed what?'
+                       fi
+                       ;;
+       get|take)       if [ "$obj" ]
+                       then    if [ $obj = all ]
+                               then    obj="$obs"
+                                       x=
+                               fi
+                               for it in $obj $x
+                               do      if ash_lk "$obs $hobs" "$it"
+                                       then    if ash_lk "$kn" "$it"
+                                               then    echo 'You already have one.'
+                                               else    if mv $it $HOME/$KNAP/$it >&- 2>&-
+                                                       then    echo "$it: taken."
+                                                               kn="$it $kn"
+                                                               obs=`ash_rm "$obs" "$it"`
+                                                       else    echo "The $it is too heavy."
+                                                       fi
+                                               fi
+                                       else    echo "I see no $it here."
+                                       fi
+                               done
+                       else    echo 'Get what?'
+                       fi
+                       ;;
+       gripe|bug)      echo 'Please describe the problem and your situation at the time it failed.\nEnd the bug report with a line containing just a Ctrl-D.'
+                       cat | mail $MAINT -s 'ash bug'
+                       echo 'Thank you!'
+                       ;;
+       help)           ash_help
+                       ;;
+       inventory|i)    if [ "$kn" ]
+                       then    echo 'Your knapsack contains:'
+                               ash_pr $kn
+                       else    echo 'You are poverty-stricken.'
+                       fi
+                       ;;
+       kill|destroy)   if [ "$obj" ]
+                       then    if [ $obj = all ]
+                               then    x=
+                                       if ask "Do you really want to attempt to $verb them all?"
+                                       then    obj=`echo $obs`
+                                       else    echo 'Chicken!'
+                                               obj=
+                                       fi
+                               fi
+                               for it in $obj $x
+                               do      if ash_lk "$obs $hobs" "$it"
+                                       then    if mv $it $HOME/$LIM <&- >&- 2>&-
+                                               then    if [ $verb = kill ]
+                                                       then    echo "The $it cannot defend himself; he dies."
+                                                       else    echo "You have destroyed the $it; it vanishes."
+                                                       fi
+                                                       obs=`ash_rm "$obs" "$it"`
+                                               else    if [ $verb = kill ]
+                                                       then    echo "Your feeble blows are no match for the $it."
+                                                       else    echo "The $it is indestructible."
+                                                       fi
+                                               fi
+                                       else    if ash_lk "$kn" "$it"
+                                               then    echo "You must drop the $it first."
+                                                       found=false
+                                               else    echo "I see no $it here."
+                                               fi
+                                       fi
+                               done
+                       else    echo 'Kill what?'
+                       fi
+                       ;;
+       look|l)         obs=`echo $obs $hobs`
+                       hobs=
+                       if [ "$obs" ]
+                       then    echo 'The room contains:'
+                               ash_pr $obs
+                       else    echo 'The room is empty.'
+                       fi
+                       exs=`echo $exs $hexs`
+                       hexs=
+                       if [ "$exs" ]
+                       then    echo 'There are exits plainly labeled:'
+                               ash_pr $exs
+                               echo 'and a passage directly overhead.'
+                       else    echo 'The only exit is directly overhead.'
+                       fi
+                       ;;
+       magic)          if [ "$obj" = mode ]
+                       then    if sh -c $cha
+                               then    echo 'You had your chance and you blew it.'
+                               else    if ask 'Are you a wizard?'
+                                       then    echo -n 'Prove it!  Say the magic word: '
+                                               read obj
+                                               if [ "$obj" = armadillo ]
+                                               then    echo 'Yes, master!!'
+                                                       wiz=true
+                                               else    echo "Homie says: I don't think so"
+                                                       cha=true
+                                               fi
+                                       else    echo "I didn't think so."
+                                       fi
+                               fi
+                       else    echo 'Nice try.'
+                       fi
+                       ;;
+       open|read)      if [ "$obj" ]
+                       then    if ash_lk "$obs $hobs" "$obj"
+                               then    if [ -r $obj ]
+                                       then    if [ -s $obj ]
+                                               then    echo "Opening the $obj reveals:"
+                                                       $CAT < $obj
+                                                       if [ $? != 0 ]
+                                                       then    echo '-- oops, you lost the contents!'
+                                                       fi
+                                               else    echo "There is nothing inside the $obj."
+                                               fi
+                                       else    echo "You do not have the proper tools to open the $obj."
+                                       fi
+                               else    if ash_lk "$kn" "$obj"
+                                       then    echo 'You must drop it first.'
+                                               found=false
+                                       else    echo "I see no $obj here."
+                                       fi
+                               fi
+                       else    echo 'Open what?'
+                       fi
+                       ;;
+       quit|exit)      if ask 'Do you really want to quit now?'
+                       then    if [ "$kn" ]
+                               then    echo 'The contents of your knapsack will still be there next time.'
+                               fi
+                               rm -rf $HOME/$LIM
+                               echo 'See you later!'
+                               exit 0
+                       fi
+                       ;;
+       resurrect)      if [ "$obj" ]
+                       then    for it in $obj $x
+                               do      if ash_lk "$obs $hobs" "$it"
+                                       then    echo "The $it is already alive and well."
+                                       else    if mv $HOME/$LIM/$it $it <&- >&- 2>&-
+                                               then    echo "The $it staggers to his feet."
+                                                       obs=`echo $it $obs`
+                                               else    echo "There are sparks but no $it appears."
+                                               fi
+                                       fi
+                               done
+                       else    echo 'Resurrect what?'
+                       fi
+                       ;;
+       steal)          if [ "$obj" ]
+                       then    if ash_lk "$obs $hobs" "$obj"
+                               then    echo 'There is already one here.'
+                               else    set -- $x
+                                       case "$1" in
+                                       from)   if [ "$2" ]
+                                               then    shift
+                                                       if PATH=$OPATH $* >$obj 2>&-
+                                                       then    echo "The $1 monster drops the $obj."
+                                                               obs=`echo $obj $obs`
+                                                       else    echo "The $1 monster runs away as you approach."
+                                                               rm -f $obj >&- 2>&-
+                                                       fi
+                                               else    echo 'From what?'
+                                               fi
+                                               ;;
+                                       *)      echo "Steal $obj from what?"
+                                               ;;
+                                       esac
+                               fi
+                       else    echo 'Steal what?'
+                       fi
+                       ;;
+       throw)          if [ "$obj" ]
+                       then    if ash_lk "$obs $hobs" "$obj"
+                               then    set -- $x
+                                       case "$1" in
+                                       at)     case "$2" in
+                                               daemon) if sh -c "lpr -r $obj"
+                                                       then    echo "The daemon catches the $obj, turns it into paper,\nand leaves it in the basket."
+                                                               obs=`ash_rm "$obs" "$obj"`
+                                                       else    echo "The daemon is nowhere to be found."
+                                                       fi
+                                                       ;;
+                                               *)      echo 'At what?'
+                                                       ;;
+                                               esac
+                                               ;;
+                                       *)      echo "Throw $obj at what?"
+                                               ;;
+                                       esac
+                               else    if ash_lk "$kn" "$obj"
+                                       then    echo 'It is in your knapsack.'
+                                               found=false
+                                       else    echo "I see no $obj here."
+                                       fi
+                               fi
+                       else    echo 'Throw what?'
+                       fi
+                       ;;
+       u|up)           if cd ..
+                       then    echo 'You pull yourself up a level.'
+                       else    echo "You can't reach that high."
+                       fi
+                       ;;
+       wake)           if [ "$obj" ]
+                       then    echo "You awaken the $obj monster:"
+                               PATH=$OPATH $obj $x
+                               echo 'The monster slithers back into the darkness.'
+                       else    echo 'Wake what?'
+                       fi
+                       ;;
+       w|where)        echo "You are in $room."
+                       ;;
+       xyzzy)          if cd
+                       then    echo 'A strange feeling comes over you.'
+                       else    echo 'Your spell fizzles out.'
+                       fi
+                       ;;
+       *)              if [ "$verb" ]
+                       then    if sh -c $wiz
+                               then    PATH=$OPATH $verb $obj $x
+                               else    echo "I don't know how to \"$verb\"."
+                                       echo 'Type "help" for assistance.'
+                               fi
+                       else    echo 'Say something!'
+                       fi
+                       ;;
+       esac
+done
index db25636..09ae320 100644 (file)
@@ -57,6 +57,7 @@ extern int errno;
 #endif
 
 #include "bashansi.h"
+#include "bashintl.h"
 
 #include "memalloc.h"
 #include "shell.h"
@@ -462,7 +463,7 @@ async_redirect_stdin ()
       close (fd);
     }
   else if (fd < 0)
-    internal_error ("cannot redirect standard input from /dev/null: %s", strerror (errno));
+    internal_error (_("cannot redirect standard input from /dev/null: %s"), strerror (errno));
 }
 
 #define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)
@@ -1032,7 +1033,7 @@ print_formatted_time (fp, format, rs, rsf, us, usf, ss, ssf, cpu)
            len = mkfmt (ts, prec, lng, ss, ssf);
          else
            {
-             internal_error ("bad format character in time format: %c", *s);
+             internal_error (_("TIMEFORMAT: `%c': invalid format character"), *s);
              free (str);
              return;
            }
@@ -1582,7 +1583,7 @@ execute_for_command (for_command)
       if (posixly_correct && interactive_shell == 0)
        {
          last_command_exit_value = EX_USAGE;
-         jump_to_top_level (EXITPROG);
+         jump_to_top_level (ERREXIT);
        }
       return (EXECUTION_FAILURE);
     }
@@ -3181,14 +3182,15 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
   
   funcnest++;
 #if defined (ARRAY_VARS)
+  /* This is quite similar to the code in shell.c and elsewhere. */
   shell_fn = find_function_def (this_shell_function->name);
   sfile = shell_fn ? shell_fn->source_file : "";
-  /* This is quite similar to the code in shell.c and elsewhere. */
+  array_push (funcname_a, this_shell_function->name);
+
   array_push (bash_source_a, sfile);
   t = itos (executing_line_number ());
   array_push (bash_lineno_a, t);
   free (t);
-  array_push (funcname_a, this_shell_function->name);
 #endif
 
   /* The temporary environment for a function is supposed to apply to
@@ -3197,7 +3199,8 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
   remember_args (words->next, 1);
 
   /* Update BASH_ARGV and BASH_ARGC */
-  push_args (words->next);
+  if (debugging_mode)
+    push_args (words->next);
 
   /* Number of the line on which the function body starts. */
   line_number = function_line_number = tc->line;
@@ -3248,7 +3251,8 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
     }
 
   /* Restore BASH_ARGC and BASH_ARGV */
-  pop_args ();
+  if (debugging_mode)
+    pop_args ();
 
   if (subshell == 0)
     run_unwind_frame ("function_calling");
@@ -3256,8 +3260,8 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
   funcnest--;
 #if defined (ARRAY_VARS)
   array_pop (bash_source_a);
-  array_pop (bash_lineno_a);
   array_pop (funcname_a);
+  array_pop (bash_lineno_a);
 #endif
   
   if (variable_context == 0 || this_shell_function == 0)
@@ -3514,7 +3518,7 @@ execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
   command = (char *)NULL;
   if (restricted && xstrchr (pathname, '/'))
     {
-      internal_error ("%s: restricted: cannot specify `/' in command names",
+      internal_error (_("%s: restricted: cannot specify `/' in command names"),
                    pathname);
       last_command_exit_value = EXECUTION_FAILURE;
 
@@ -3602,7 +3606,7 @@ execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
 
       if (command == 0)
        {
-         internal_error ("%s: command not found", pathname);
+         internal_error (_("%s: command not found"), pathname);
          exit (EX_NOTFOUND);   /* Posix.2 says the exit status is 127 */
        }
 
@@ -3814,7 +3818,7 @@ shell_execve (command, args, env)
   if (i != ENOEXEC)
     {
       if ((stat (command, &finfo) == 0) && (S_ISDIR (finfo.st_mode)))
-       internal_error ("%s: is a directory", command);
+       internal_error (_("%s: is a directory"), command);
       else if (executable_file (command) == 0)
        {
          errno = i;
@@ -3832,7 +3836,7 @@ shell_execve (command, args, env)
 
              interp = getinterp (sample, sample_len, (int *)NULL);
              errno = i;
-             sys_error ("%s: %s: bad interpreter", command, interp ? interp : "");
+             sys_error (_("%s: %s: bad interpreter"), command, interp ? interp : "");
              FREE (interp);
              return (EX_NOEXEC);
            }
@@ -3869,7 +3873,7 @@ shell_execve (command, args, env)
 #endif
       if (check_binary_file (sample, sample_len))
        {
-         internal_error ("%s: cannot execute binary file", command);
+         internal_error (_("%s: cannot execute binary file"), command);
          return (EX_BINARY_FILE);
        }
     }
@@ -3933,7 +3937,7 @@ execute_intern_function (name, function)
       if (posixly_correct && interactive_shell == 0)
        {
          last_command_exit_value = EX_USAGE;
-         jump_to_top_level (EXITPROG);
+         jump_to_top_level (ERREXIT);
        }
       return (EXECUTION_FAILURE);
     }
@@ -3942,7 +3946,7 @@ execute_intern_function (name, function)
   if (var && (readonly_p (var) || noassign_p (var)))
     {
       if (readonly_p (var))
-       internal_error ("%s: readonly function", var->name);
+       internal_error (_("%s: readonly function"), var->name);
       return (EXECUTION_FAILURE);
     }
 
@@ -3977,6 +3981,13 @@ close_pipes (in, out)
     close (out);
 }
 
+static void
+dup_error (oldd, newd)
+     int oldd, newd;
+{
+  sys_error (_("cannot duplicate fd %d to fd %d"), oldd, newd);
+}
+
 /* Redirect input and output to be from and to the specified pipes.
    NO_PIPE and REDIRECT_BOTH are handled correctly. */
 static void
@@ -3986,7 +3997,7 @@ do_piping (pipe_in, pipe_out)
   if (pipe_in != NO_PIPE)
     {
       if (dup2 (pipe_in, 0) < 0)
-       sys_error ("cannot duplicate fd %d to fd 0", pipe_in);
+       dup_error (pipe_in, 0);
       if (pipe_in > 0)
        close (pipe_in);
     }
@@ -3995,14 +4006,14 @@ do_piping (pipe_in, pipe_out)
       if (pipe_out != REDIRECT_BOTH)
        {
          if (dup2 (pipe_out, 1) < 0)
-           sys_error ("cannot duplicate fd %d to fd 1", pipe_out);
+           dup_error (pipe_out, 1);
          if (pipe_out == 0 || pipe_out > 1)
            close (pipe_out);
        }
       else
        {
          if (dup2 (1, 2) < 0)
-           sys_error ("cannot duplicate fd 1 to fd 2");
+           dup_error (1, 2);
        }
     }
 }
diff --git a/expr.c b/expr.c
index ad431ba..5b6069b 100644 (file)
--- a/expr.c
+++ b/expr.c
@@ -1,6 +1,6 @@
 /* expr.c -- arithmetic expression evaluation. */
 
-/* Copyright (C) 1990-2002 Free Software Foundation, Inc.
+/* Copyright (C) 1990-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -78,6 +78,7 @@
 #endif
 
 #include "chartypes.h"
+#include "bashintl.h"
 
 #include "shell.h"
 
@@ -201,6 +202,10 @@ static int expr_stack_size;           /* Number of slots already allocated. */
 extern char *this_command_name;
 extern int unbound_vars_is_error;
 
+#if defined (ARRAY_VARS)
+extern char *bash_badsub_errmsg;
+#endif
+
 #define SAVETOK(X) \
   do { \
     (X)->curtok = curtok; \
@@ -231,7 +236,7 @@ pushexp ()
   EXPR_CONTEXT *context;
 
   if (expr_depth >= MAX_EXPR_RECURSION_LEVEL)
-    evalerror ("expression recursion level exceeded");
+    evalerror (_("expression recursion level exceeded"));
 
   if (expr_depth >= expr_stack_size)
     {
@@ -255,7 +260,7 @@ popexp ()
   EXPR_CONTEXT *context;
 
   if (expr_depth == 0)
-    evalerror ("recursion stack underflow");
+    evalerror (_("recursion stack underflow"));
 
   context = expr_stack[--expr_depth];
 
@@ -366,7 +371,7 @@ subexpr (expr)
   val = EXP_HIGHEST ();
 
   if (curtok != 0)
-    evalerror ("syntax error in expression");
+    evalerror (_("syntax error in expression"));
 
   FREE (tokstr);
   FREE (expression);
@@ -406,7 +411,7 @@ expassign ()
       special = curtok == OP_ASSIGN;
 
       if (lasttok != STR)
-       evalerror ("attempted assignment to non-variable");
+       evalerror (_("attempted assignment to non-variable"));
 
       if (special)
        {
@@ -427,12 +432,12 @@ expassign ()
              break;
            case DIV:
              if (value == 0)
-               evalerror ("division by 0");
+               evalerror (_("division by 0"));
              lvalue /= value;
              break;
            case MOD:
              if (value == 0)
-               evalerror ("division by 0");
+               evalerror (_("division by 0"));
              lvalue %= value;
              break;
            case PLUS:
@@ -458,7 +463,7 @@ expassign ()
              break;
            default:
              free (lhs);
-             evalerror ("bug: bad expassign token");
+             evalerror (_("bug: bad expassign token"));
              break;
            }
          value = lvalue;
@@ -488,7 +493,7 @@ expcond ()
     {
       readtok ();
       if (curtok == 0 || curtok == COL)
-       evalerror ("expression expected");
+       evalerror (_("expression expected"));
       if (cval == 0)
        {
          set_noeval = 1;
@@ -500,10 +505,10 @@ expcond ()
       if (set_noeval)
        noeval--;
       if (curtok != COL)
-       evalerror ("`:' expected for conditional expression");
+       evalerror (_("`:' expected for conditional expression"));
       readtok ();
       if (curtok == 0)
-       evalerror ("expression expected");
+       evalerror (_("expression expected"));
       set_noeval = 0;
       if (cval)
        {
@@ -742,7 +747,7 @@ exp2 ()
       val2 = exppower ();
 
       if (((op == DIV) || (op == MOD)) && (val2 == 0))
-       evalerror ("division by 0");
+       evalerror (_("division by 0"));
 
       if (op == MUL)
        val1 *= val2;
@@ -767,7 +772,7 @@ exppower ()
       if (val2 == 0)
        return (1);
       if (val2 < 0)
-       evalerror ("exponent less than 0");
+       evalerror (_("exponent less than 0"));
       for (c = 1; val2--; c *= val1)
        ;
       val1 = c;
@@ -811,7 +816,7 @@ exp0 ()
       readtok ();
       if (curtok != STR)
        /* readtok() catches this */
-       evalerror ("identifier expected after pre-increment or pre-decrement");
+       evalerror (_("identifier expected after pre-increment or pre-decrement"));
 
       v2 = tokval + ((stok == PREINC) ? 1 : -1);
       vincdec = itos (v2);
@@ -838,8 +843,8 @@ exp0 ()
       readtok ();
       val = EXP_HIGHEST ();
 
-      if (curtok != RPAR)
-       evalerror ("missing `)'");
+      if (curtok != RPAR) /* ( */
+       evalerror (_("missing `)'"));
 
       /* Skip over closing paren. */
       readtok ();
@@ -863,7 +868,7 @@ exp0 ()
       readtok ();
     }
   else
-    evalerror ("syntax error: operand expected");
+    evalerror (_("syntax error: operand expected"));
 
   return (val);
 }
@@ -976,7 +981,7 @@ readtok ()
              e = ']';
            }
          else
-           evalerror ("bad array subscript");
+           evalerror (bash_badsub_errmsg);
        }
 #endif /* ARRAY_VARS */
 
@@ -1138,11 +1143,11 @@ strlong (num)
       if (c == '#')
        {
          if (foundbase)
-           evalerror ("bad number");
+           evalerror (_("invalid number"));
 
          /* Illegal base specifications raise an evaluation error. */
          if (val < 2 || val > 64)
-           evalerror ("illegal arithmetic base");
+           evalerror (_("invalid arithmetic base"));
 
          base = val;
          val = 0;
@@ -1162,7 +1167,7 @@ strlong (num)
            c = 63;
 
          if (c >= base)
-           evalerror ("value too great for base");
+           evalerror (_("value too great for base"));
 
          val = (val * base) + c;
        }
index db42332..3799580 100644 (file)
--- a/externs.h
+++ b/externs.h
@@ -93,7 +93,7 @@ extern char **brace_expand __P((char *));
 extern int yyparse __P((void));
 extern int return_EOF __P((void));
 extern void reset_parser __P((void));
-extern WORD_LIST *parse_string_to_word_list __P((char *, const char *));
+extern WORD_LIST *parse_string_to_word_list __P((char *, int, const char *));
 
 extern void free_pushed_string_input __P((void));
 
index 1a83e8f..3754e2e 100644 (file)
--- a/general.c
+++ b/general.c
@@ -1,6 +1,6 @@
 /* general.c -- Stuff that is used by all files. */
 
-/* Copyright (C) 1987-2002 Free Software Foundation, Inc.
+/* Copyright (C) 1987-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -36,6 +36,8 @@
 #include "chartypes.h"
 #include <errno.h>
 
+#include "bashintl.h"
+
 #include "shell.h"
 #include <tilde/tilde.h>
 
@@ -55,7 +57,7 @@ static int unquoted_tilde_word __P((const char *));
 static void initialize_group_array __P((void));
 
 /* A standard error message to use when getcwd() returns NULL. */
-char *bash_getcwd_errstr = "getcwd: cannot access parent directories";
+char *bash_getcwd_errstr = N_("getcwd: cannot access parent directories");
 
 /* Do whatever is necessary to initialize `Posix mode'. */
 void
@@ -224,12 +226,12 @@ check_identifier (word, check_word)
 {
   if ((word->flags & (W_HASDOLLAR|W_QUOTED)) || all_digits (word->word))
     {
-      internal_error ("`%s': not a valid identifier", word->word);
+      internal_error (_("`%s': not a valid identifier"), word->word);
       return (0);
     }
   else if (check_word && legal_identifier (word->word) == 0)
     {
-      internal_error ("`%s': not a valid identifier", word->word);
+      internal_error (_("`%s': not a valid identifier"), word->word);
       return (0);
     }
   else
@@ -239,15 +241,20 @@ check_identifier (word, check_word)
 /* Returns non-zero if STRING is an assignment statement.  The returned value
    is the index of the `=' sign. */
 int
-assignment (string)
+assignment (string, flags)
      const char *string;
+     int flags;
 {
   register unsigned char c;
   register int newi, indx;
 
   c = string[indx = 0];
 
+#if defined (ARRAY_VARS)
+  if ((legal_variable_starter (c) == 0) && (flags && c != '[')) /* ] */
+#else
   if (legal_variable_starter (c) == 0)
+#endif
     return (0);
 
   while (c = string[indx])
index 71f787c..96e3503 100644 (file)
--- a/general.h
+++ b/general.h
@@ -277,7 +277,7 @@ extern int all_digits __P((char *));
 extern int legal_number __P((char *, intmax_t *));
 extern int legal_identifier __P((char *));
 extern int check_identifier __P((WORD_DESC *, int));
-extern int assignment __P((const char *));
+extern int assignment __P((const char *, int));
 
 extern int sh_unset_nodelay_mode __P((int));
 extern int sh_validfd __P((int));
diff --git a/include/gettext.h b/include/gettext.h
new file mode 100644 (file)
index 0000000..8b262f4
--- /dev/null
@@ -0,0 +1,69 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+   Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option.  */
+#if ENABLE_NLS
+
+/* Get declarations of GNU message catalog functions.  */
+# include <libintl.h>
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+   chokes if dcgettext is defined as a macro.  So include it now, to make
+   later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
+   as well because people using "gettext.h" will not include <libintl.h>,
+   and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+   is OK.  */
+#if defined(__sun)
+# include <locale.h>
+#endif
+
+/* Disabled NLS.
+   The casts to 'const char *' serve the purpose of producing warnings
+   for invalid uses of the value returned from these functions.
+   On pre-ANSI systems without 'const', the config.h file is supposed to
+   contain "#define const".  */
+# define gettext(Msgid) ((const char *) (Msgid))
+# define dgettext(Domainname, Msgid) ((const char *) (Msgid))
+# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid))
+# define ngettext(Msgid1, Msgid2, N) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+    ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2))
+# define textdomain(Domainname) ((const char *) (Domainname))
+# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
+# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset))
+
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+   extraction of messages, but does not call gettext().  The run-time
+   translation is done at a different place in the code.
+   The argument, String, should be a literal string.  Concatenated strings
+   and other string expressions won't work.
+   The macro's expansion is not parenthesized, so that it is suitable as
+   initializer for static 'char[]' or 'const char[]' variables.  */
+#define gettext_noop(String) String
+
+#endif /* _LIBGETTEXT_H */
diff --git a/include/memalloc.h.save b/include/memalloc.h.save
new file mode 100644 (file)
index 0000000..a1a2706
--- /dev/null
@@ -0,0 +1,58 @@
+/* memalloc.h -- consolidate code for including alloca.h or malloc.h and
+   defining alloca. */
+
+/* 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#if !defined (_MEMALLOC_H_)
+#  define _MEMALLOC_H_
+
+#if defined (sparc) && defined (sun) && !defined (HAVE_ALLOCA_H)
+#  define HAVE_ALLOCA_H
+#endif
+
+#if defined (__GNUC__) && !defined (HAVE_ALLOCA)
+#  define HAVE_ALLOCA
+#endif
+
+#if defined (HAVE_ALLOCA_H) && !defined (HAVE_ALLOCA)
+#  define HAVE_ALLOCA
+#endif /* HAVE_ALLOCA_H && !HAVE_ALLOCA */
+
+#if defined (__GNUC__) && !defined (C_ALLOCA)
+#  undef alloca
+#  define alloca __builtin_alloca
+#else /* !__GNUC__ || C_ALLOCA */
+#  if defined (HAVE_ALLOCA_H) && !defined (C_ALLOCA)
+#    if defined (IBMESA)
+#      include <malloc.h>
+#    else /* !IBMESA */
+#      include <alloca.h>
+#    endif /* !IBMESA */
+#  else  /* !HAVE_ALLOCA_H || C_ALLOCA */
+#    if defined (__hpux) && defined (__STDC__) && !defined (alloca)
+extern void *alloca ();
+#    else
+#      if !defined (alloca)
+extern char *alloca ();
+#      endif /* !alloca */
+#    endif /* !__hpux || !__STDC__ && !alloca */
+#  endif /* !HAVE_ALLOCA_H || C_ALLOCA */
+#endif /* !__GNUC__ || C_ALLOCA */
+
+#endif /* _MEMALLOC_H_ */
index b700504..f6e39b2 100644 (file)
@@ -172,6 +172,89 @@ extern char *xstrchr __P((const char *, int));
 #  define ADVANCE_CHAR_P(_str, _strsize)
 #endif  /* !HANDLE_MULTIBYTE */
 
+/* Back up one (possibly multi-byte) character in string _STR of length
+   _STRSIZE, starting at index _I.  STATE must have already been declared. */
+#if defined (HANDLE_MULTIBYTE)
+#  define BACKUP_CHAR(_str, _strsize, _i) \
+    do \
+      { \
+       if (MB_CUR_MAX > 1) \
+         { \
+           mbstate_t state_bak; \
+           size_t mblength; \
+           int _x, _p; /* _x == temp index into string, _p == prev index */ \
+\
+           _x = _p = 0; \
+           while (_x < (_i)) \
+             { \
+               state_bak = state; \
+               mblength = mbrlen ((_str) + (_x), (_strsize) - (_x), &state); \
+\
+               if (mblength == (size_t)-2 || mblength == (size_t)-1) \
+                 { \
+                   state = state_bak; \
+                   _x++; \
+                 } \
+               else if (mblength == 0) \
+                 _x++; \
+               else \
+                 { \
+                   _p = _x; /* _p == start of prev mbchar */ \
+                   _x += mblength; \
+                 } \
+             } \
+           (_i) = _p; \
+         } \
+       else \
+         (_i)--; \
+      } \
+    while (0)
+#else
+#  define BACKUP_CHAR(_str, _strsize, _i)      (_i)--
+#endif  /* !HANDLE_MULTIBYTE */
+
+/* Back up one (possibly multibyte) character in the string _BASE of length
+   _STRSIZE starting at _STR (_BASE <= _STR <= (_BASE + _STRSIZE) ).
+   SPECIAL: DO NOT assume that _STR will be decremented by 1 after this call. */
+#if defined (HANDLE_MULTIBYTE)
+#  define BACKUP_CHAR_P(_base, _strsize, _str) \
+    do \
+      { \
+       if (MB_CUR_MAX > 1) \
+         { \
+           mbstate_t state_bak; \
+           size_t mblength; \
+           char *_x, _p; /* _x == temp pointer into string, _p == prev pointer */ \
+\
+           _x = _p = _base; \
+           while (_x < (_str)) \
+             { \
+               state_bak = state; \
+               mblength = mbrlen (_x, (_strsize) - _x, &state); \
+\
+               if (mblength == (size_t)-2 || mblength == (size_t)-1) \
+                 { \
+                   state = state_bak; \
+                   _x++; \
+                 } \
+               else if (mblength == 0) \
+                 _x++; \
+               else \
+                 { \
+                   _p = _x; /* _p == start of prev mbchar */ \
+                   _x += mblength; \
+                 } \
+             } \
+           (_str) = _p; \
+         } \
+       else \
+         (_str)--; \
+      } \
+    while (0)
+#else
+#  define BACKUP_CHAR_P(_base, _strsize, _str) (_str)--
+#endif  /* !HANDLE_MULTIBYTE */
+
 /* Copy a single character from the string _SRC to the string _DST.
    _SRCEND is a pointer to the end of _SRC. */
 #if defined (HANDLE_MULTIBYTE)
diff --git a/input.c b/input.c
index 4dd319c..c4f335d 100644 (file)
--- a/input.c
+++ b/input.c
@@ -34,6 +34,8 @@
 #endif
 
 #include "bashansi.h"
+#include "bashintl.h"
+
 #include "command.h"
 #include "general.h"
 #include "input.h"
@@ -226,7 +228,7 @@ save_bash_input (fd, new_fd)
   if (nfd == -1)
     {
       if (fcntl (fd, F_GETFD, 0) == 0)
-       sys_error ("cannot allocate new file descriptor for bash input from fd %d", fd);
+       sys_error (_("cannot allocate new file descriptor for bash input from fd %d"), fd);
       return -1;
     }
 
@@ -234,7 +236,7 @@ save_bash_input (fd, new_fd)
     {
       /* What's this?  A stray buffer without an associated open file
         descriptor?  Free up the buffer and report the error. */
-      internal_error ("save_bash_input: buffer already exists for new fd %d", nfd);
+      internal_error (_("save_bash_input: buffer already exists for new fd %d"), nfd);
       free_buffered_stream (buffers[nfd]);
     }
 
diff --git a/jobs.c b/jobs.c
index b2a6b8b..eeb19ba 100644 (file)
--- a/jobs.c
+++ b/jobs.c
@@ -75,6 +75,7 @@
 #endif /* !STRUCT_WINSIZE_IN_SYS_IOCTL */
 
 #include "bashansi.h"
+#include "bashintl.h"
 #include "shell.h"
 #include "jobs.h"
 #include "flags.h"
@@ -689,7 +690,7 @@ delete_job (job_index, warn_stopped)
     return;
 
   if (warn_stopped && subshell_environment == 0 && STOPPED (job_index))
-    internal_warning ("deleting stopped job %d with process group %ld", job_index+1, (long)jobs[job_index]->pgrp);
+    internal_warning (_("deleting stopped job %d with process group %ld"), job_index+1, (long)jobs[job_index]->pgrp);
 
   temp = jobs[job_index];
   if (job_index == current_job || job_index == previous_job)
@@ -997,7 +998,7 @@ describe_pid (pid)
   if (job != NO_JOB)
     printf ("[%d] %ld\n", job + 1, (long)pid);
   else
-    programming_error ("describe_pid: %ld: no such pid", (long)pid);
+    programming_error (_("describe_pid: %ld: no such pid"), (long)pid);
 
   UNBLOCK_CHILD (oset);
 }
@@ -1357,22 +1358,19 @@ make_child (command, async_p)
             shells. */
          if (setpgid (mypid, pipeline_pgrp) < 0)
            sys_error ("child setpgid (%ld to %ld)", (long)mypid, (long)pipeline_pgrp);
-#if defined (PGRP_PIPE)
-         if (pipeline_pgrp == mypid)
-           {
-#endif
-             /* By convention (and assumption above), if
-                pipeline_pgrp == shell_pgrp, we are making a child for
-                command substitution.
-                In this case, we don't want to give the terminal to the
-                shell's process group (we could be in the middle of a
-                pipeline, for example). */
-             if (async_p == 0 && pipeline_pgrp != shell_pgrp)
-               give_terminal_to (pipeline_pgrp, 0);
+
+         /* By convention (and assumption above), if
+            pipeline_pgrp == shell_pgrp, we are making a child for
+            command substitution.
+            In this case, we don't want to give the terminal to the
+            shell's process group (we could be in the middle of a
+            pipeline, for example). */
+         if (async_p == 0 && pipeline_pgrp != shell_pgrp)
+           give_terminal_to (pipeline_pgrp, 0);
 
 #if defined (PGRP_PIPE)
-             pipe_read (pgrp_pipe);
-           }
+         if (pipeline_pgrp == mypid)
+           pipe_read (pgrp_pipe);
 #endif
        }
       else                     /* Without job control... */
@@ -1631,7 +1629,7 @@ wait_for_single_pid (pid)
 
   if (child == 0)
     {
-      internal_error ("wait: pid %ld is not a child of this shell", (long)pid);
+      internal_error (_("wait: pid %ld is not a child of this shell"), (long)pid);
       return (127);
     }
 
@@ -1814,7 +1812,7 @@ job_exit_signal (job)
        { \
          give_terminal_to (shell_pgrp, 0); \
          UNBLOCK_CHILD (oset); \
-         internal_error ("wait_for: No record of process %ld", (long)pid); \
+         internal_error (_("wait_for: No record of process %ld"), (long)pid); \
          restore_sigint_handler (); \
          return (termination_state = 127); \
        } \
@@ -2061,7 +2059,7 @@ wait_for_job (job)
 
   BLOCK_CHILD(set, oset);
   if (JOBSTATE (job) == JSTOPPED)
-    internal_warning ("wait_for_job: job %d is stopped", job+1);
+    internal_warning (_("wait_for_job: job %d is stopped"), job+1);
 
   pid = find_last_pid (job, 0);
   UNBLOCK_CHILD(oset);
@@ -2283,7 +2281,7 @@ start_job (job, foreground)
 
   if (DEADJOB (job))
     {
-      internal_error ("%s: job has terminated", this_command_name);
+      internal_error (_("%s: job has terminated"), this_command_name);
       UNBLOCK_CHILD (oset);
       return (-1);
     }
@@ -2292,7 +2290,7 @@ start_job (job, foreground)
 
   if (foreground == 0 && already_running)
     {
-      internal_error ("%s: job %%%d already in background", this_command_name, job + 1);
+      internal_error (_("%s: job %d already in background"), this_command_name, job + 1);
       UNBLOCK_CHILD (oset);
       return (-1);
     }
@@ -2912,7 +2910,6 @@ notify_of_job_status ()
                {
                  if (dir == 0)
                    dir = current_working_directory ();
-itrace("calling pretty_print_job: startup_state == %d, subshell_environment = %d", startup_state, subshell_environment);
                  pretty_print_job (job, JLIST_STANDARD, stderr);
                  if (dir && strcmp (dir, jobs[job]->wd) != 0)
                    fprintf (stderr,
@@ -3037,7 +3034,7 @@ initialize_job_control (force)
            }
        }
       if (job_control == 0)
-       internal_error ("no job control in this shell");
+       internal_error (_("no job control in this shell"));
     }
 
   if (shell_tty != fileno (stderr))
diff --git a/lib/doc-support/Makefile.in b/lib/doc-support/Makefile.in
new file mode 100644 (file)
index 0000000..41fbb48
--- /dev/null
@@ -0,0 +1,54 @@
+# simple makefile to create texindex
+#
+# 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.
+
+topdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = .:@srcdir@
+BUILD_DIR = @BUILD_DIR@
+
+CC = @CC@
+RM = rm
+
+SHELL = @MAKE_SHELL@
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@ @LOCAL_CFLAGS@
+LDFLAGS = @LDFLAGS@ @LOCAL_LDFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I. -I../.. -I$(topdir)
+
+CCFLAGS = $(CFLAGS) $(DEFS) $(CPPFLAGS) ${INCLUDES}
+
+.c.o:
+       $(RM) -f $@
+       $(CC) $(CCFLAGS) -c $<
+
+OBJECTS = texindex.o getopt.o getopt1.o
+SOURCES = texindex.c getopt.c getopt1.c
+
+all: texindex
+
+texindex: $(OBJECTS)
+       $(CC) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS)
+
+clean:
+       $(RM) $(OBJECTS) texindex
+
+distclean mostlyclean realclean maintainer-clean: clean
+       $(RM) Makefile
diff --git a/lib/doc-support/getopt.c b/lib/doc-support/getopt.c
new file mode 100644 (file)
index 0000000..c87eaa3
--- /dev/null
@@ -0,0 +1,731 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
+   before changing it!
+
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+       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, 59 Temple Place, Suite 330, Boston, MA 02111 USA.  */
+\f
+/* NOTE!!!  AIX requires this to be the first thing in the file.
+   Do not put ANYTHING before it!  */
+#if !defined (__GNUC__) && defined (_AIX)
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#if defined (HAVE_ALLOCA_H) || (defined(sparc) && (defined(sun) || (!defined(USG) && !defined(SVR4) && !defined(__svr4__))))
+#include <alloca.h>
+#else
+#ifndef _AIX
+char *alloca ();
+#endif
+#endif /* alloca.h */
+#endif /* not __GNUC__ */
+
+#if !__STDC__ && !defined(const) && IN_GCC
+#define const
+#endif
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.  */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#undef alloca
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+#include <stdlib.h>
+#else  /* Not GNU C library.  */
+#define        __alloca        alloca
+#endif /* GNU C library.  */
+
+/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
+   long-named option.  Because this is not POSIX.2 compliant, it is
+   being phased out.  */
+/* #define GETOPT_COMPAT */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg = 0;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* XXX 1003.2 says this must be 1 before any call.  */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return EOF with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+\f
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+#include <string.h>
+#define        my_index        strchr
+#define        my_bcopy(src, dst, n)   memcpy ((dst), (src), (n))
+#else
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+char *getenv ();
+
+static char *
+my_index (str, chr)
+     const char *str;
+     int chr;
+{
+  while (*str)
+    {
+      if (*str == chr)
+       return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+static void
+my_bcopy (from, to, size)
+     const char *from;
+     char *to;
+     int size;
+{
+  int i;
+  for (i = 0; i < size; i++)
+    to[i] = from[i];
+}
+#endif                         /* GNU C library.  */
+\f
+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+static void
+exchange (argv)
+     char **argv;
+{
+  int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *);
+  char **temp = (char **) __alloca (nonopts_size);
+
+  /* Interchange the two blocks of data in ARGV.  */
+
+  my_bcopy ((char *) &argv[first_nonopt], (char *) temp, nonopts_size);
+  my_bcopy ((char *) &argv[last_nonopt], (char *) &argv[first_nonopt],
+           (optind - last_nonopt) * sizeof (char *));
+  my_bcopy ((char *) temp,
+           (char *) &argv[first_nonopt + optind - last_nonopt],
+           nonopts_size);
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  first_nonopt += (optind - last_nonopt);
+  last_nonopt = optind;
+}
+\f
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns `EOF'.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+     const struct option *longopts;
+     int *longind;
+     int long_only;
+{
+  int option_index;
+
+  optarg = 0;
+
+  /* Initialize the internal data when the first call is made.
+     Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  if (optind == 0)
+    {
+      first_nonopt = last_nonopt = optind = 1;
+
+      nextchar = NULL;
+
+      /* Determine how to handle the ordering of options and nonoptions.  */
+
+      if (optstring[0] == '-')
+       {
+         ordering = RETURN_IN_ORDER;
+         ++optstring;
+       }
+      else if (optstring[0] == '+')
+       {
+         ordering = REQUIRE_ORDER;
+         ++optstring;
+       }
+      else if (getenv ("POSIXLY_CORRECT") != NULL)
+       ordering = REQUIRE_ORDER;
+      else
+       ordering = PERMUTE;
+    }
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      if (ordering == PERMUTE)
+       {
+         /* If we have just processed some options following some non-options,
+            exchange them so that the options come first.  */
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (last_nonopt != optind)
+           first_nonopt = optind;
+
+         /* Now skip any additional non-options
+            and extend the range of non-options previously skipped.  */
+
+         while (optind < argc
+                && (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+                && (longopts == NULL
+                    || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif                         /* GETOPT_COMPAT */
+                )
+           optind++;
+         last_nonopt = optind;
+       }
+
+      /* Special ARGV-element `--' means premature end of options.
+        Skip it like a null option,
+        then exchange with previous non-options as if it were an option,
+        then skip everything else like a non-option.  */
+
+      if (optind != argc && !strcmp (argv[optind], "--"))
+       {
+         optind++;
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (first_nonopt == last_nonopt)
+           first_nonopt = optind;
+         last_nonopt = argc;
+
+         optind = argc;
+       }
+
+      /* If we have done all the ARGV-elements, stop the scan
+        and back over any non-options that we skipped and permuted.  */
+
+      if (optind == argc)
+       {
+         /* Set the next-arg-index to point at the non-options
+            that we previously skipped, so the caller will digest them.  */
+         if (first_nonopt != last_nonopt)
+           optind = first_nonopt;
+         return EOF;
+       }
+
+      /* If we have come to a non-option and did not permute it,
+        either stop the scan or describe it to the caller and pass it by.  */
+
+      if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+         && (longopts == NULL
+             || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif                         /* GETOPT_COMPAT */
+         )
+       {
+         if (ordering == REQUIRE_ORDER)
+           return EOF;
+         optarg = argv[optind++];
+         return 1;
+       }
+
+      /* We have found another option-ARGV-element.
+        Start decoding its characters.  */
+
+      nextchar = (argv[optind] + 1
+                 + (longopts != NULL && argv[optind][1] == '-'));
+    }
+
+  if (longopts != NULL
+      && ((argv[optind][0] == '-'
+          && (argv[optind][1] == '-' || long_only))
+#ifdef GETOPT_COMPAT
+         || argv[optind][0] == '+'
+#endif                         /* GETOPT_COMPAT */
+         ))
+    {
+      const struct option *p;
+      char *s = nextchar;
+      int exact = 0;
+      int ambig = 0;
+      const struct option *pfound = NULL;
+      int indfound;
+
+      while (*s && *s != '=')
+       s++;
+
+      /* Test all options for either exact match or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name;
+          p++, option_index++)
+       if (!strncmp (p->name, nextchar, s - nextchar))
+         {
+           if (s - nextchar == strlen (p->name))
+             {
+               /* Exact match found.  */
+               pfound = p;
+               indfound = option_index;
+               exact = 1;
+               break;
+             }
+           else if (pfound == NULL)
+             {
+               /* First nonexact match found.  */
+               pfound = p;
+               indfound = option_index;
+             }
+           else
+             /* Second nonexact match found.  */
+             ambig = 1;
+         }
+
+      if (ambig && !exact)
+       {
+         if (opterr)
+           fprintf (stderr, "%s: option `%s' is ambiguous\n",
+                    argv[0], argv[optind]);
+         nextchar += strlen (nextchar);
+         optind++;
+         return '?';
+       }
+
+      if (pfound != NULL)
+       {
+         option_index = indfound;
+         optind++;
+         if (*s)
+           {
+             /* Don't test has_arg with >, because some C compilers don't
+                allow it to be used on enums.  */
+             if (pfound->has_arg)
+               optarg = s + 1;
+             else
+               {
+                 if (opterr)
+                   {
+                     if (argv[optind - 1][1] == '-')
+                       /* --option */
+                       fprintf (stderr,
+                                "%s: option `--%s' doesn't allow an argument\n",
+                                argv[0], pfound->name);
+                     else
+                       /* +option or -option */
+                       fprintf (stderr,
+                            "%s: option `%c%s' doesn't allow an argument\n",
+                            argv[0], argv[optind - 1][0], pfound->name);
+                   }
+                 nextchar += strlen (nextchar);
+                 return '?';
+               }
+           }
+         else if (pfound->has_arg == 1)
+           {
+             if (optind < argc)
+               optarg = argv[optind++];
+             else
+               {
+                 if (opterr)
+                   fprintf (stderr, "%s: option `%s' requires an argument\n",
+                            argv[0], argv[optind - 1]);
+                 nextchar += strlen (nextchar);
+                 return optstring[0] == ':' ? ':' : '?';
+               }
+           }
+         nextchar += strlen (nextchar);
+         if (longind != NULL)
+           *longind = option_index;
+         if (pfound->flag)
+           {
+             *(pfound->flag) = pfound->val;
+             return 0;
+           }
+         return pfound->val;
+       }
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+        or the option starts with '--' or is not a valid short
+        option, then it's an error.
+        Otherwise interpret it as a short option.  */
+      if (!long_only || argv[optind][1] == '-'
+#ifdef GETOPT_COMPAT
+         || argv[optind][0] == '+'
+#endif                         /* GETOPT_COMPAT */
+         || my_index (optstring, *nextchar) == NULL)
+       {
+         if (opterr)
+           {
+             if (argv[optind][1] == '-')
+               /* --option */
+               fprintf (stderr, "%s: unrecognized option `--%s'\n",
+                        argv[0], nextchar);
+             else
+               /* +option or -option */
+               fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+                        argv[0], argv[optind][0], nextchar);
+           }
+         nextchar = (char *) "";
+         optind++;
+         return '?';
+       }
+    }
+
+  /* Look at and handle the next option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++optind;
+
+    if (temp == NULL || c == ':')
+      {
+       if (opterr)
+         {
+#if 0
+           if (c < 040 || c >= 0177)
+             fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
+                      argv[0], c);
+           else
+             fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
+#else
+           /* 1003.2 specifies the format of this message.  */
+           fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+#endif
+         }
+       optopt = c;
+       return '?';
+      }
+    if (temp[1] == ':')
+      {
+       if (temp[2] == ':')
+         {
+           /* This is an option that accepts an argument optionally.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               optind++;
+             }
+           else
+             optarg = 0;
+           nextchar = NULL;
+         }
+       else
+         {
+           /* This is an option that requires an argument.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               /* If we end this ARGV-element by taking the rest as an arg,
+                  we must advance to the next element now.  */
+               optind++;
+             }
+           else if (optind == argc)
+             {
+               if (opterr)
+                 {
+#if 0
+                   fprintf (stderr, "%s: option `-%c' requires an argument\n",
+                            argv[0], c);
+#else
+                   /* 1003.2 specifies the format of this message.  */
+                   fprintf (stderr, "%s: option requires an argument -- %c\n",
+                            argv[0], c);
+#endif
+                 }
+               optopt = c;
+               if (optstring[0] == ':')
+                 c = ':';
+               else
+                 c = '?';
+             }
+           else
+             /* We already incremented `optind' once;
+                increment it again when taking next ARGV-elt as argument.  */
+             optarg = argv[optind++];
+           nextchar = NULL;
+         }
+      }
+    return c;
+  }
+}
+
+int
+getopt (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  return _getopt_internal (argc, argv, optstring,
+                          (const struct option *) 0,
+                          (int *) 0,
+                          0);
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__.  */
+\f
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == EOF)
+       break;
+
+      switch (c)
+       {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/lib/doc-support/getopt.h b/lib/doc-support/getopt.h
new file mode 100644 (file)
index 0000000..6a7ea95
--- /dev/null
@@ -0,0 +1,129 @@
+/* Declarations for getopt.
+   Copyright (C) 1989, 1990, 1991, 1992, 1993 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA.  */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if    __STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define        no_argument             0
+#define required_argument      1
+#define optional_argument      2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind,
+                            int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/lib/doc-support/getopt1.c b/lib/doc-support/getopt1.c
new file mode 100644 (file)
index 0000000..9d6be54
--- /dev/null
@@ -0,0 +1,176 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+       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, 59 Temple Place, Suite 330, Boston, MA 02111 USA.  */
+\f
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "getopt.h"
+
+#if !__STDC__ && !defined(const) && IN_GCC
+#define const
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#else
+char *getenv ();
+#endif
+
+#ifndef        NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* _LIBC or not __GNU_LIBRARY__.  */
+\f
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] =
+      {
+       {"add", 1, 0, 0},
+       {"append", 0, 0, 0},
+       {"delete", 1, 0, 0},
+       {"verbose", 0, 0, 0},
+       {"create", 0, 0, 0},
+       {"file", 1, 0, 0},
+       {0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+                      long_options, &option_index);
+      if (c == EOF)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         printf ("option %s", long_options[option_index].name);
+         if (optarg)
+           printf (" with arg %s", optarg);
+         printf ("\n");
+         break;
+
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case 'd':
+         printf ("option d with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/lib/doc-support/texindex.c b/lib/doc-support/texindex.c
new file mode 100644 (file)
index 0000000..2aabc23
--- /dev/null
@@ -0,0 +1,1666 @@
+/* Prepare TeX index dribble output into an actual index.
+
+   Version 1.45
+
+   Copyright (C) 1987, 1991, 1992 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. */
+\f
+
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include "getopt.h"
+#include "bashansi.h"
+
+#if !defined (errno)
+extern int errno;
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#else /* !HAVE_UNISTD_H */
+extern long lseek ();
+#endif /* !HAVE_UNISTD_H */
+
+extern char *mktemp ();
+
+#if !defined (HAVE_STRERROR)
+extern int sys_nerr;
+extern char *sys_errlist[];
+#endif
+
+#include <sys/types.h>
+
+#if defined (_AIX) || !defined (_POSIX_VERSION)
+#  include <sys/file.h>
+#endif
+
+#include <fcntl.h>
+
+#define TI_NO_ERROR 0
+#define TI_FATAL_ERROR 1
+
+#if !defined (SEEK_SET)
+#  define SEEK_SET 0
+#  define SEEK_CUR 1
+#  define SEEK_END 2
+#endif /* !SEEK_SET */
+
+/* When sorting in core, this structure describes one line
+   and the position and length of its first keyfield.  */
+struct lineinfo
+{
+  char *text;          /* The actual text of the line. */
+  union {
+    char *text;                /* The start of the key (for textual comparison). */
+    long number;       /* The numeric value (for numeric comparison). */
+  } key;
+  long keylen;         /* Length of KEY field. */
+};
+
+/* This structure describes a field to use as a sort key. */
+struct keyfield
+{
+  int startwords;      /* Number of words to skip. */
+  int startchars;      /* Number of additional chars to skip. */
+  int endwords;                /* Number of words to ignore at end. */
+  int endchars;                /* Ditto for characters of last word. */
+  char ignore_blanks;  /* Non-zero means ignore spaces and tabs. */
+  char fold_case;      /* Non-zero means case doesn't matter. */
+  char reverse;                /* Non-zero means compare in reverse order. */
+  char numeric;                /* Non-zeros means field is ASCII numeric. */
+  char positional;     /* Sort according to file position. */
+  char braced;         /* Count balanced-braced groupings as fields. */
+};
+
+/* Vector of keyfields to use. */
+struct keyfield keyfields[3];
+
+/* Number of keyfields stored in that vector.  */
+int num_keyfields = 3;
+
+/* Vector of input file names, terminated with a null pointer. */
+char **infiles;
+
+/* Vector of corresponding output file names, or NULL, meaning default it
+   (add an `s' to the end). */
+char **outfiles;
+
+/* Length of `infiles'. */
+int num_infiles;
+
+/* Pointer to the array of pointers to lines being sorted. */
+char **linearray;
+
+/* The allocated length of `linearray'. */
+long nlines;
+
+/* Directory to use for temporary files.  On Unix, it ends with a slash.  */
+char *tempdir;
+
+/* Start of filename to use for temporary files.  */
+char *tempbase;
+
+/* Number of last temporary file.  */
+int tempcount;
+
+/* Number of last temporary file already deleted.
+   Temporary files are deleted by `flush_tempfiles' in order of creation.  */
+int last_deleted_tempcount;
+
+/* During in-core sort, this points to the base of the data block
+   which contains all the lines of data.  */
+char *text_base;
+
+/* Additional command switches .*/
+
+/* Nonzero means do not delete tempfiles -- for debugging. */
+int keep_tempfiles;
+
+/* The name this program was run with. */
+char *program_name;
+
+/* Forward declarations of functions in this file. */
+
+void decode_command ();
+void sort_in_core ();
+void sort_offline ();
+char **parsefile ();
+char *find_field ();
+char *find_pos ();
+long find_value ();
+char *find_braced_pos ();
+char *find_braced_end ();
+void writelines ();
+int compare_field ();
+int compare_full ();
+long readline ();
+int merge_files ();
+int merge_direct ();
+void pfatal_with_name ();
+void fatal ();
+void error ();
+void *xmalloc (), *xrealloc ();
+char *concat ();
+char *maketempname ();
+void flush_tempfiles ();
+char *tempcopy ();
+\f
+#define MAX_IN_CORE_SORT 500000
+
+void
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int i;
+
+  tempcount = 0;
+  last_deleted_tempcount = 0;
+  program_name = argv[0];
+
+  /* Describe the kind of sorting to do. */
+  /* The first keyfield uses the first braced field and folds case. */
+  keyfields[0].braced = 1;
+  keyfields[0].fold_case = 1;
+  keyfields[0].endwords = -1;
+  keyfields[0].endchars = -1;
+
+  /* The second keyfield uses the second braced field, numerically. */
+  keyfields[1].braced = 1;
+  keyfields[1].numeric = 1;
+  keyfields[1].startwords = 1;
+  keyfields[1].endwords = -1;
+  keyfields[1].endchars = -1;
+
+  /* The third keyfield (which is ignored while discarding duplicates)
+     compares the whole line. */
+  keyfields[2].endwords = -1;
+  keyfields[2].endchars = -1;
+
+  decode_command (argc, argv);
+
+  tempbase = mktemp (concat ("txiXXXXXX", "", ""));
+
+  /* Process input files completely, one by one.  */
+
+  for (i = 0; i < num_infiles; i++)
+    {
+      int desc;
+      long ptr;
+      char *outfile;
+
+      desc = open (infiles[i], O_RDONLY, 0);
+      if (desc < 0)
+       pfatal_with_name (infiles[i]);
+      lseek (desc, 0L, SEEK_END);
+      ptr = lseek (desc, 0L, SEEK_CUR);
+
+      close (desc);
+
+      outfile = outfiles[i];
+      if (!outfile)
+       {
+         outfile = concat (infiles[i], "s", "");
+       }
+
+      if (ptr < MAX_IN_CORE_SORT)
+       /* Sort a small amount of data. */
+       sort_in_core (infiles[i], ptr, outfile);
+      else
+       sort_offline (infiles[i], ptr, outfile);
+    }
+
+  flush_tempfiles (tempcount);
+  exit (TI_NO_ERROR);
+}
+\f
+void
+usage ()
+{
+  fprintf (stderr, "\
+Usage: %s [-k] infile [-o outfile] ...\n", program_name);
+  exit (1);
+}
+
+/* Decode the command line arguments to set the parameter variables
+   and set up the vector of keyfields and the vector of input files. */
+
+void
+decode_command (argc, argv)
+     int argc;
+     char **argv;
+{
+  int optc;
+  char **ip;
+  char **op;
+
+  /* Store default values into parameter variables. */
+
+  tempdir = getenv ("TMPDIR");
+  if (tempdir == NULL)
+    tempdir = "/tmp/";
+  else
+    tempdir = concat (tempdir, "/", "");
+
+  keep_tempfiles = 0;
+
+  /* Allocate ARGC input files, which must be enough.  */
+
+  infiles = (char **) xmalloc (argc * sizeof (char *));
+  outfiles = (char **) xmalloc (argc * sizeof (char *));
+  ip = infiles;
+  op = outfiles;
+
+  while ((optc = getopt (argc, argv, "-ko:")) != EOF)
+    {
+      switch (optc)
+       {
+       case 1:         /* Non-option filename. */
+         *ip++ = optarg;
+         *op++ = NULL;
+         break;
+
+       case 'k':
+         keep_tempfiles = 1;
+         break;
+
+       case 'o':
+         if (op > outfiles)
+           *(op - 1) = optarg;
+         break;
+
+       default:
+         usage ();
+       }
+    }
+
+  /* Record number of keyfields and terminate list of filenames. */
+  num_infiles = ip - infiles;
+  *ip = 0;
+  if (num_infiles == 0)
+    usage ();
+}
+\f
+/* Return a name for a temporary file. */
+
+char *
+maketempname (count)
+     int count;
+{
+  char tempsuffix[10];
+  sprintf (tempsuffix, "%d", count);
+  return concat (tempdir, tempbase, tempsuffix);
+}
+
+/* Delete all temporary files up to TO_COUNT. */
+
+void
+flush_tempfiles (to_count)
+     int to_count;
+{
+  if (keep_tempfiles)
+    return;
+  while (last_deleted_tempcount < to_count)
+    unlink (maketempname (++last_deleted_tempcount));
+}
+
+/* Copy the input file open on IDESC into a temporary file
+   and return the temporary file name. */
+
+#define BUFSIZE 1024
+
+char *
+tempcopy (idesc)
+     int idesc;
+{
+  char *outfile = maketempname (++tempcount);
+  int odesc;
+  char buffer[BUFSIZE];
+
+  odesc = open (outfile, O_WRONLY | O_CREAT, 0666);
+
+  if (odesc < 0)
+    pfatal_with_name (outfile);
+
+  while (1)
+    {
+      int nread = read (idesc, buffer, BUFSIZE);
+      write (odesc, buffer, nread);
+      if (!nread)
+       break;
+    }
+
+  close (odesc);
+
+  return outfile;
+}
+\f
+/* Compare LINE1 and LINE2 according to the specified set of keyfields. */
+
+int
+compare_full (line1, line2)
+     char **line1, **line2;
+{
+  int i;
+
+  /* Compare using the first keyfield;
+     if that does not distinguish the lines, try the second keyfield;
+     and so on. */
+
+  for (i = 0; i < num_keyfields; i++)
+    {
+      long length1, length2;
+      char *start1 = find_field (&keyfields[i], *line1, &length1);
+      char *start2 = find_field (&keyfields[i], *line2, &length2);
+      int tem = compare_field (&keyfields[i], start1, length1, *line1 - text_base,
+                              start2, length2, *line2 - text_base);
+      if (tem)
+       {
+         if (keyfields[i].reverse)
+           return -tem;
+         return tem;
+       }
+    }
+
+  return 0;                    /* Lines match exactly. */
+}
+
+/* Compare LINE1 and LINE2, described by structures
+   in which the first keyfield is identified in advance.
+   For positional sorting, assumes that the order of the lines in core
+   reflects their nominal order.  */
+
+int
+compare_prepared (line1, line2)
+     struct lineinfo *line1, *line2;
+{
+  int i;
+  int tem;
+  char *text1, *text2;
+
+  /* Compare using the first keyfield, which has been found for us already. */
+  if (keyfields->positional)
+    {
+      if (line1->text - text_base > line2->text - text_base)
+       tem = 1;
+      else
+       tem = -1;
+    }
+  else if (keyfields->numeric)
+    tem = line1->key.number - line2->key.number;
+  else
+    tem = compare_field (keyfields, line1->key.text, line1->keylen, 0,
+                        line2->key.text, line2->keylen, 0);
+  if (tem)
+    {
+      if (keyfields->reverse)
+       return -tem;
+      return tem;
+    }
+
+  text1 = line1->text;
+  text2 = line2->text;
+
+  /* Compare using the second keyfield;
+     if that does not distinguish the lines, try the third keyfield;
+     and so on. */
+
+  for (i = 1; i < num_keyfields; i++)
+    {
+      long length1, length2;
+      char *start1 = find_field (&keyfields[i], text1, &length1);
+      char *start2 = find_field (&keyfields[i], text2, &length2);
+      int tem = compare_field (&keyfields[i], start1, length1, text1 - text_base,
+                              start2, length2, text2 - text_base);
+      if (tem)
+       {
+         if (keyfields[i].reverse)
+           return -tem;
+         return tem;
+       }
+    }
+
+  return 0;                    /* Lines match exactly. */
+}
+
+/* Like compare_full but more general.
+   You can pass any strings, and you can say how many keyfields to use.
+   POS1 and POS2 should indicate the nominal positional ordering of
+   the two lines in the input.  */
+
+int
+compare_general (str1, str2, pos1, pos2, use_keyfields)
+     char *str1, *str2;
+     long pos1, pos2;
+     int use_keyfields;
+{
+  int i;
+
+  /* Compare using the first keyfield;
+     if that does not distinguish the lines, try the second keyfield;
+     and so on. */
+
+  for (i = 0; i < use_keyfields; i++)
+    {
+      long length1, length2;
+      char *start1 = find_field (&keyfields[i], str1, &length1);
+      char *start2 = find_field (&keyfields[i], str2, &length2);
+      int tem = compare_field (&keyfields[i], start1, length1, pos1,
+                              start2, length2, pos2);
+      if (tem)
+       {
+         if (keyfields[i].reverse)
+           return -tem;
+         return tem;
+       }
+    }
+
+  return 0;                    /* Lines match exactly. */
+}
+
+/* Find the start and length of a field in STR according to KEYFIELD.
+   A pointer to the starting character is returned, and the length
+   is stored into the int that LENGTHPTR points to.  */
+
+char *
+find_field (keyfield, str, lengthptr)
+     struct keyfield *keyfield;
+     char *str;
+     long *lengthptr;
+{
+  char *start;
+  char *end;
+  char *(*fun) ();
+
+  if (keyfield->braced)
+    fun = find_braced_pos;
+  else
+    fun = find_pos;
+
+  start = (*fun) (str, keyfield->startwords, keyfield->startchars,
+                 keyfield->ignore_blanks);
+  if (keyfield->endwords < 0)
+    {
+      if (keyfield->braced)
+       end = find_braced_end (start);
+      else
+       {
+         end = start;
+         while (*end && *end != '\n')
+           end++;
+       }
+    }
+  else
+    {
+      end = (*fun) (str, keyfield->endwords, keyfield->endchars, 0);
+      if (end - str < start - str)
+       end = start;
+    }
+  *lengthptr = end - start;
+  return start;
+}
+
+/* Return a pointer to a specified place within STR,
+   skipping (from the beginning) WORDS words and then CHARS chars.
+   If IGNORE_BLANKS is nonzero, we skip all blanks
+   after finding the specified word.  */
+
+char *
+find_pos (str, words, chars, ignore_blanks)
+     char *str;
+     int words, chars;
+     int ignore_blanks;
+{
+  int i;
+  char *p = str;
+
+  for (i = 0; i < words; i++)
+    {
+      char c;
+      /* Find next bunch of nonblanks and skip them. */
+      while ((c = *p) == ' ' || c == '\t')
+       p++;
+      while ((c = *p) && c != '\n' && !(c == ' ' || c == '\t'))
+       p++;
+      if (!*p || *p == '\n')
+       return p;
+    }
+
+  while (*p == ' ' || *p == '\t')
+    p++;
+
+  for (i = 0; i < chars; i++)
+    {
+      if (!*p || *p == '\n')
+       break;
+      p++;
+    }
+  return p;
+}
+
+/* Like find_pos but assumes that each field is surrounded by braces
+   and that braces within fields are balanced. */
+
+char *
+find_braced_pos (str, words, chars, ignore_blanks)
+     char *str;
+     int words, chars;
+     int ignore_blanks;
+{
+  int i;
+  int bracelevel;
+  char *p = str;
+  char c;
+
+  for (i = 0; i < words; i++)
+    {
+      bracelevel = 1;
+      while ((c = *p++) != '{' && c != '\n' && c)
+       /* Do nothing. */ ;
+      if (c != '{')
+       return p - 1;
+      while (bracelevel)
+       {
+         c = *p++;
+         if (c == '{')
+           bracelevel++;
+         if (c == '}')
+           bracelevel--;
+         if (c == 0 || c == '\n')
+           return p - 1;
+       }
+    }
+
+  while ((c = *p++) != '{' && c != '\n' && c)
+    /* Do nothing. */ ;
+
+  if (c != '{')
+    return p - 1;
+
+  if (ignore_blanks)
+    while ((c = *p) == ' ' || c == '\t')
+      p++;
+
+  for (i = 0; i < chars; i++)
+    {
+      if (!*p || *p == '\n')
+       break;
+      p++;
+    }
+  return p;
+}
+
+/* Find the end of the balanced-brace field which starts at STR.
+   The position returned is just before the closing brace. */
+
+char *
+find_braced_end (str)
+     char *str;
+{
+  int bracelevel;
+  char *p = str;
+  char c;
+
+  bracelevel = 1;
+  while (bracelevel)
+    {
+      c = *p++;
+      if (c == '{')
+       bracelevel++;
+      if (c == '}')
+       bracelevel--;
+      if (c == 0 || c == '\n')
+       return p - 1;
+    }
+  return p - 1;
+}
+
+long
+find_value (start, length)
+     char *start;
+     long length;
+{
+  while (length != 0L)
+    {
+      if (isdigit (*start))
+       return atol (start);
+      length--;
+      start++;
+    }
+  return 0l;
+}
+
+/* Vector used to translate characters for comparison.
+   This is how we make all alphanumerics follow all else,
+   and ignore case in the first sorting.  */
+int char_order[256];
+
+void
+init_char_order ()
+{
+  int i;
+  for (i = 1; i < 256; i++)
+    char_order[i] = i;
+
+  for (i = '0'; i <= '9'; i++)
+    char_order[i] += 512;
+
+  for (i = 'a'; i <= 'z'; i++)
+    {
+      char_order[i] = 512 + i;
+      char_order[i + 'A' - 'a'] = 512 + i;
+    }
+}
+
+/* Compare two fields (each specified as a start pointer and a character count)
+   according to KEYFIELD.
+   The sign of the value reports the relation between the fields. */
+
+int
+compare_field (keyfield, start1, length1, pos1, start2, length2, pos2)
+     struct keyfield *keyfield;
+     char *start1;
+     long length1;
+     long pos1;
+     char *start2;
+     long length2;
+     long pos2;
+{
+  if (keyfields->positional)
+    {
+      if (pos1 > pos2)
+       return 1;
+      else
+       return -1;
+    }
+  if (keyfield->numeric)
+    {
+      long value = find_value (start1, length1) - find_value (start2, length2);
+      if (value > 0)
+       return 1;
+      if (value < 0)
+       return -1;
+      return 0;
+    }
+  else
+    {
+      char *p1 = start1;
+      char *p2 = start2;
+      char *e1 = start1 + length1;
+      char *e2 = start2 + length2;
+
+      while (1)
+       {
+         int c1, c2;
+
+         if (p1 == e1)
+           c1 = 0;
+         else
+           c1 = *p1++;
+         if (p2 == e2)
+           c2 = 0;
+         else
+           c2 = *p2++;
+
+         if (char_order[c1] != char_order[c2])
+           return char_order[c1] - char_order[c2];
+         if (!c1)
+           break;
+       }
+
+      /* Strings are equal except possibly for case.  */
+      p1 = start1;
+      p2 = start2;
+      while (1)
+       {
+         int c1, c2;
+
+         if (p1 == e1)
+           c1 = 0;
+         else
+           c1 = *p1++;
+         if (p2 == e2)
+           c2 = 0;
+         else
+           c2 = *p2++;
+
+         if (c1 != c2)
+           /* Reverse sign here so upper case comes out last.  */
+           return c2 - c1;
+         if (!c1)
+           break;
+       }
+
+      return 0;
+    }
+}
+\f
+/* A `struct linebuffer' is a structure which holds a line of text.
+   `readline' reads a line from a stream into a linebuffer
+   and works regardless of the length of the line.  */
+
+struct linebuffer
+{
+  long size;
+  char *buffer;
+};
+
+/* Initialize LINEBUFFER for use. */
+
+void
+initbuffer (linebuffer)
+     struct linebuffer *linebuffer;
+{
+  linebuffer->size = 200;
+  linebuffer->buffer = (char *) xmalloc (200);
+}
+
+/* Read a line of text from STREAM into LINEBUFFER.
+   Return the length of the line.  */
+
+long
+readline (linebuffer, stream)
+     struct linebuffer *linebuffer;
+     FILE *stream;
+{
+  char *buffer = linebuffer->buffer;
+  char *p = linebuffer->buffer;
+  char *end = p + linebuffer->size;
+
+  while (1)
+    {
+      int c = getc (stream);
+      if (p == end)
+       {
+         buffer = (char *) xrealloc (buffer, linebuffer->size *= 2);
+         p += buffer - linebuffer->buffer;
+         end += buffer - linebuffer->buffer;
+         linebuffer->buffer = buffer;
+       }
+      if (c < 0 || c == '\n')
+       {
+         *p = 0;
+         break;
+       }
+      *p++ = c;
+    }
+
+  return p - buffer;
+}
+\f
+/* Sort an input file too big to sort in core.  */
+
+void
+sort_offline (infile, nfiles, total, outfile)
+     char *infile;
+     int nfiles;
+     long total;
+     char *outfile;
+{
+  /* More than enough. */
+  int ntemps = 2 * (total + MAX_IN_CORE_SORT - 1) / MAX_IN_CORE_SORT;
+  char **tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
+  FILE *istream = fopen (infile, "r");
+  int i;
+  struct linebuffer lb;
+  long linelength;
+  int failure = 0;
+
+  initbuffer (&lb);
+
+  /* Read in one line of input data.  */
+
+  linelength = readline (&lb, istream);
+
+  if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
+    {
+      error ("%s: not a texinfo index file", infile);
+      return;
+    }
+
+  /* Split up the input into `ntemps' temporary files, or maybe fewer,
+     and put the new files' names into `tempfiles' */
+
+  for (i = 0; i < ntemps; i++)
+    {
+      char *outname = maketempname (++tempcount);
+      FILE *ostream = fopen (outname, "w");
+      long tempsize = 0;
+
+      if (!ostream)
+       pfatal_with_name (outname);
+      tempfiles[i] = outname;
+
+      /* Copy lines into this temp file as long as it does not make file
+        "too big" or until there are no more lines.  */
+
+      while (tempsize + linelength + 1 <= MAX_IN_CORE_SORT)
+       {
+         tempsize += linelength + 1;
+         fputs (lb.buffer, ostream);
+         putc ('\n', ostream);
+
+         /* Read another line of input data.  */
+
+         linelength = readline (&lb, istream);
+         if (!linelength && feof (istream))
+           break;
+
+         if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
+           {
+             error ("%s: not a texinfo index file", infile);
+             failure = 1;
+             goto fail;
+           }
+       }
+      fclose (ostream);
+      if (feof (istream))
+       break;
+    }
+
+  free (lb.buffer);
+
+fail:
+  /* Record number of temp files we actually needed.  */
+
+  ntemps = i;
+
+  /* Sort each tempfile into another tempfile.
+    Delete the first set of tempfiles and put the names of the second
+    into `tempfiles'. */
+
+  for (i = 0; i < ntemps; i++)
+    {
+      char *newtemp = maketempname (++tempcount);
+      sort_in_core (&tempfiles[i], MAX_IN_CORE_SORT, newtemp);
+      if (!keep_tempfiles)
+       unlink (tempfiles[i]);
+      tempfiles[i] = newtemp;
+    }
+
+  if (failure)
+    return;
+
+  /* Merge the tempfiles together and indexify. */
+
+  merge_files (tempfiles, ntemps, outfile);
+}
+\f
+/* Sort INFILE, whose size is TOTAL,
+   assuming that is small enough to be done in-core,
+   then indexify it and send the output to OUTFILE (or to stdout).  */
+
+void
+sort_in_core (infile, total, outfile)
+     char *infile;
+     long total;
+     char *outfile;
+{
+  char **nextline;
+  char *data = (char *) xmalloc (total + 1);
+  char *file_data;
+  long file_size;
+  int i;
+  FILE *ostream = stdout;
+  struct lineinfo *lineinfo;
+
+  /* Read the contents of the file into the moby array `data'. */
+
+  int desc = open (infile, O_RDONLY, 0);
+
+  if (desc < 0)
+    fatal ("failure reopening %s", infile);
+  for (file_size = 0;;)
+    {
+      i = read (desc, data + file_size, total - file_size);
+      if (i <= 0)
+       break;
+      file_size += i;
+    }
+  file_data = data;
+  data[file_size] = 0;
+
+  close (desc);
+
+  if (file_size > 0 && data[0] != '\\' && data[0] != '@')
+    {
+      error ("%s: not a texinfo index file", infile);
+      return;
+    }
+
+  init_char_order ();
+
+  /* Sort routines want to know this address. */
+
+  text_base = data;
+
+  /* Create the array of pointers to lines, with a default size
+     frequently enough.  */
+
+  nlines = total / 50;
+  if (!nlines)
+    nlines = 2;
+  linearray = (char **) xmalloc (nlines * sizeof (char *));
+
+  /* `nextline' points to the next free slot in this array.
+     `nlines' is the allocated size.  */
+
+  nextline = linearray;
+
+  /* Parse the input file's data, and make entries for the lines.  */
+
+  nextline = parsefile (infile, nextline, file_data, file_size);
+  if (nextline == 0)
+    {
+      error ("%s: not a texinfo index file", infile);
+      return;
+    }
+
+  /* Sort the lines. */
+
+  /* If we have enough space, find the first keyfield of each line in advance.
+     Make a `struct lineinfo' for each line, which records the keyfield
+     as well as the line, and sort them.  */
+
+  lineinfo = (struct lineinfo *) malloc ((nextline - linearray) * sizeof (struct lineinfo));
+
+  if (lineinfo)
+    {
+      struct lineinfo *lp;
+      char **p;
+
+      for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
+       {
+         lp->text = *p;
+         lp->key.text = find_field (keyfields, *p, &lp->keylen);
+         if (keyfields->numeric)
+           lp->key.number = find_value (lp->key.text, lp->keylen);
+       }
+
+      qsort (lineinfo, nextline - linearray, sizeof (struct lineinfo), compare_prepared);
+
+      for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
+       *p = lp->text;
+
+      free (lineinfo);
+    }
+  else
+    qsort (linearray, nextline - linearray, sizeof (char *), compare_full);
+
+  /* Open the output file. */
+
+  if (outfile)
+    {
+      ostream = fopen (outfile, "w");
+      if (!ostream)
+       pfatal_with_name (outfile);
+    }
+
+  writelines (linearray, nextline - linearray, ostream);
+  if (outfile)
+    fclose (ostream);
+
+  free (linearray);
+  free (data);
+}
+\f
+/* Parse an input string in core into lines.
+   DATA is the input string, and SIZE is its length.
+   Data goes in LINEARRAY starting at NEXTLINE.
+   The value returned is the first entry in LINEARRAY still unused.
+   Value 0 means input file contents are invalid.  */
+
+char **
+parsefile (filename, nextline, data, size)
+     char *filename;
+     char **nextline;
+     char *data;
+     long size;
+{
+  char *p, *end;
+  char **line = nextline;
+
+  p = data;
+  end = p + size;
+  *end = 0;
+
+  while (p != end)
+    {
+      if (p[0] != '\\' && p[0] != '@')
+       return 0;
+
+      *line = p;
+      while (*p && *p != '\n')
+       p++;
+      if (p != end)
+       p++;
+
+      line++;
+      if (line == linearray + nlines)
+       {
+         char **old = linearray;
+         linearray = (char **) xrealloc (linearray, sizeof (char *) * (nlines *= 4));
+         line += linearray - old;
+       }
+    }
+
+  return line;
+}
+\f
+/* Indexification is a filter applied to the sorted lines
+   as they are being written to the output file.
+   Multiple entries for the same name, with different page numbers,
+   get combined into a single entry with multiple page numbers.
+   The first braced field, which is used for sorting, is discarded.
+   However, its first character is examined, folded to lower case,
+   and if it is different from that in the previous line fed to us
+   a \initial line is written with one argument, the new initial.
+
+   If an entry has four braced fields, then the second and third
+   constitute primary and secondary names.
+   In this case, each change of primary name
+   generates a \primary line which contains only the primary name,
+   and in between these are \secondary lines which contain
+   just a secondary name and page numbers. */
+
+/* The last primary name we wrote a \primary entry for.
+   If only one level of indexing is being done, this is the last name seen. */
+char *lastprimary;
+/* Length of storage allocated for lastprimary. */
+int lastprimarylength;
+
+/* Similar, for the secondary name. */
+char *lastsecondary;
+int lastsecondarylength;
+
+/* Zero if we are not in the middle of writing an entry.
+   One if we have written the beginning of an entry but have not
+   yet written any page numbers into it.
+   Greater than one if we have written the beginning of an entry
+   plus at least one page number. */
+int pending;
+
+/* The initial (for sorting purposes) of the last primary entry written.
+   When this changes, a \initial {c} line is written */
+
+char *lastinitial;
+
+int lastinitiallength;
+
+/* When we need a string of length 1 for the value of lastinitial,
+   store it here.  */
+
+char lastinitial1[2];
+
+/* Initialize static storage for writing an index. */
+
+static void
+xbzero(s, n)
+     char *s;
+     int n;
+{
+  register char *p;
+  for (p = s; n--; )
+    *p++ = '\0';
+}
+
+void
+init_index ()
+{
+  pending = 0;
+  lastinitial = lastinitial1;
+  lastinitial1[0] = 0;
+  lastinitial1[1] = 0;
+  lastinitiallength = 0;
+  lastprimarylength = 100;
+  lastprimary = (char *) xmalloc (lastprimarylength + 1);
+  xbzero (lastprimary, lastprimarylength + 1);
+  lastsecondarylength = 100;
+  lastsecondary = (char *) xmalloc (lastsecondarylength + 1);
+  xbzero (lastsecondary, lastsecondarylength + 1);
+}
+
+/* Indexify.  Merge entries for the same name,
+   insert headers for each initial character, etc.  */
+
+void
+indexify (line, ostream)
+     char *line;
+     FILE *ostream;
+{
+  char *primary, *secondary, *pagenumber;
+  int primarylength, secondarylength = 0, pagelength;
+  int nosecondary;
+  int initiallength;
+  char *initial;
+  char initial1[2];
+  register char *p;
+
+  /* First, analyze the parts of the entry fed to us this time. */
+
+  p = find_braced_pos (line, 0, 0, 0);
+  if (*p == '{')
+    {
+      initial = p;
+      /* Get length of inner pair of braces starting at `p',
+        including that inner pair of braces.  */
+      initiallength = find_braced_end (p + 1) + 1 - p;
+    }
+  else
+    {
+      initial = initial1;
+      initial1[0] = *p;
+      initial1[1] = 0;
+      initiallength = 1;
+
+      if (initial1[0] >= 'a' && initial1[0] <= 'z')
+       initial1[0] -= 040;
+    }
+
+  pagenumber = find_braced_pos (line, 1, 0, 0);
+  pagelength = find_braced_end (pagenumber) - pagenumber;
+  if (pagelength == 0)
+    abort ();
+
+  primary = find_braced_pos (line, 2, 0, 0);
+  primarylength = find_braced_end (primary) - primary;
+
+  secondary = find_braced_pos (line, 3, 0, 0);
+  nosecondary = !*secondary;
+  if (!nosecondary)
+    secondarylength = find_braced_end (secondary) - secondary;
+
+  /* If the primary is different from before, make a new primary entry. */
+  if (strncmp (primary, lastprimary, primarylength))
+    {
+      /* Close off current secondary entry first, if one is open. */
+      if (pending)
+       {
+         fputs ("}\n", ostream);
+         pending = 0;
+       }
+
+      /* If this primary has a different initial, include an entry for
+        the initial. */
+      if (initiallength != lastinitiallength ||
+         strncmp (initial, lastinitial, initiallength))
+       {
+         fprintf (ostream, "\\initial {");
+         fwrite (initial, 1, initiallength, ostream);
+         fprintf (ostream, "}\n", initial);
+         if (initial == initial1)
+           {
+             lastinitial = lastinitial1;
+             *lastinitial1 = *initial1;
+           }
+         else
+           {
+             lastinitial = initial;
+           }
+         lastinitiallength = initiallength;
+       }
+
+      /* Make the entry for the primary.  */
+      if (nosecondary)
+       fputs ("\\entry {", ostream);
+      else
+       fputs ("\\primary {", ostream);
+      fwrite (primary, primarylength, 1, ostream);
+      if (nosecondary)
+       {
+         fputs ("}{", ostream);
+         pending = 1;
+       }
+      else
+       fputs ("}\n", ostream);
+
+      /* Record name of most recent primary. */
+      if (lastprimarylength < primarylength)
+       {
+         lastprimarylength = primarylength + 100;
+         lastprimary = (char *) xrealloc (lastprimary,
+                                          1 + lastprimarylength);
+       }
+      strncpy (lastprimary, primary, primarylength);
+      lastprimary[primarylength] = 0;
+
+      /* There is no current secondary within this primary, now. */
+      lastsecondary[0] = 0;
+    }
+
+  /* Should not have an entry with no subtopic following one with a subtopic. */
+
+  if (nosecondary && *lastsecondary)
+    error ("entry %s follows an entry with a secondary name", line);
+
+  /* Start a new secondary entry if necessary. */
+  if (!nosecondary && strncmp (secondary, lastsecondary, secondarylength))
+    {
+      if (pending)
+       {
+         fputs ("}\n", ostream);
+         pending = 0;
+       }
+
+      /* Write the entry for the secondary.  */
+      fputs ("\\secondary {", ostream);
+      fwrite (secondary, secondarylength, 1, ostream);
+      fputs ("}{", ostream);
+      pending = 1;
+
+      /* Record name of most recent secondary. */
+      if (lastsecondarylength < secondarylength)
+       {
+         lastsecondarylength = secondarylength + 100;
+         lastsecondary = (char *) xrealloc (lastsecondary,
+                                            1 + lastsecondarylength);
+       }
+      strncpy (lastsecondary, secondary, secondarylength);
+      lastsecondary[secondarylength] = 0;
+    }
+
+  /* Here to add one more page number to the current entry. */
+  if (pending++ != 1)
+    fputs (", ", ostream);     /* Punctuate first, if this is not the first. */
+  fwrite (pagenumber, pagelength, 1, ostream);
+}
+
+/* Close out any unfinished output entry. */
+
+void
+finish_index (ostream)
+     FILE *ostream;
+{
+  if (pending)
+    fputs ("}\n", ostream);
+  free (lastprimary);
+  free (lastsecondary);
+}
+\f
+/* Copy the lines in the sorted order.
+   Each line is copied out of the input file it was found in. */
+
+void
+writelines (linearray, nlines, ostream)
+     char **linearray;
+     int nlines;
+     FILE *ostream;
+{
+  char **stop_line = linearray + nlines;
+  char **next_line;
+
+  init_index ();
+
+  /* Output the text of the lines, and free the buffer space. */
+
+  for (next_line = linearray; next_line != stop_line; next_line++)
+    {
+      /* If -u was specified, output the line only if distinct from previous one.  */
+      if (next_line == linearray
+      /* Compare previous line with this one, using only the
+         explicitly specd keyfields. */
+         || compare_general (*(next_line - 1), *next_line, 0L, 0L, num_keyfields - 1))
+       {
+         char *p = *next_line;
+         char c;
+
+         while ((c = *p++) && c != '\n')
+           /* Do nothing. */ ;
+         *(p - 1) = 0;
+         indexify (*next_line, ostream);
+       }
+    }
+
+  finish_index (ostream);
+}
+\f
+/* Assume (and optionally verify) that each input file is sorted;
+   merge them and output the result.
+   Returns nonzero if any input file fails to be sorted.
+
+   This is the high-level interface that can handle an unlimited
+   number of files.  */
+
+#define MAX_DIRECT_MERGE 10
+
+int
+merge_files (infiles, nfiles, outfile)
+     char **infiles;
+     int nfiles;
+     char *outfile;
+{
+  char **tempfiles;
+  int ntemps;
+  int i;
+  int value = 0;
+  int start_tempcount = tempcount;
+
+  if (nfiles <= MAX_DIRECT_MERGE)
+    return merge_direct (infiles, nfiles, outfile);
+
+  /* Merge groups of MAX_DIRECT_MERGE input files at a time,
+     making a temporary file to hold each group's result.  */
+
+  ntemps = (nfiles + MAX_DIRECT_MERGE - 1) / MAX_DIRECT_MERGE;
+  tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
+  for (i = 0; i < ntemps; i++)
+    {
+      int nf = MAX_DIRECT_MERGE;
+      if (i + 1 == ntemps)
+       nf = nfiles - i * MAX_DIRECT_MERGE;
+      tempfiles[i] = maketempname (++tempcount);
+      value |= merge_direct (&infiles[i * MAX_DIRECT_MERGE], nf, tempfiles[i]);
+    }
+
+  /* All temporary files that existed before are no longer needed
+     since their contents have been merged into our new tempfiles.
+     So delete them.  */
+  flush_tempfiles (start_tempcount);
+
+  /* Now merge the temporary files we created.  */
+
+  merge_files (tempfiles, ntemps, outfile);
+
+  free (tempfiles);
+
+  return value;
+}
+\f
+/* Assume (and optionally verify) that each input file is sorted;
+   merge them and output the result.
+   Returns nonzero if any input file fails to be sorted.
+
+   This version of merging will not work if the number of
+   input files gets too high.  Higher level functions
+   use it only with a bounded number of input files.  */
+
+int
+merge_direct (infiles, nfiles, outfile)
+     char **infiles;
+     int nfiles;
+     char *outfile;
+{
+  struct linebuffer *lb1, *lb2;
+  struct linebuffer **thisline, **prevline;
+  FILE **streams;
+  int i;
+  int nleft;
+  int lossage = 0;
+  int *file_lossage;
+  struct linebuffer *prev_out = 0;
+  FILE *ostream = stdout;
+
+  if (outfile)
+    {
+      ostream = fopen (outfile, "w");
+    }
+  if (!ostream)
+    pfatal_with_name (outfile);
+
+  init_index ();
+
+  if (nfiles == 0)
+    {
+      if (outfile)
+       fclose (ostream);
+      return 0;
+    }
+
+  /* For each file, make two line buffers.
+     Also, for each file, there is an element of `thisline'
+     which points at any time to one of the file's two buffers,
+     and an element of `prevline' which points to the other buffer.
+     `thisline' is supposed to point to the next available line from the file,
+     while `prevline' holds the last file line used,
+     which is remembered so that we can verify that the file is properly sorted. */
+
+  /* lb1 and lb2 contain one buffer each per file. */
+  lb1 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
+  lb2 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
+
+  /* thisline[i] points to the linebuffer holding the next available line in file i,
+     or is zero if there are no lines left in that file.  */
+  thisline = (struct linebuffer **)
+    xmalloc (nfiles * sizeof (struct linebuffer *));
+  /* prevline[i] points to the linebuffer holding the last used line
+     from file i.  This is just for verifying that file i is properly
+     sorted.  */
+  prevline = (struct linebuffer **)
+    xmalloc (nfiles * sizeof (struct linebuffer *));
+  /* streams[i] holds the input stream for file i.  */
+  streams = (FILE **) xmalloc (nfiles * sizeof (FILE *));
+  /* file_lossage[i] is nonzero if we already know file i is not
+     properly sorted.  */
+  file_lossage = (int *) xmalloc (nfiles * sizeof (int));
+
+  /* Allocate and initialize all that storage. */
+
+  for (i = 0; i < nfiles; i++)
+    {
+      initbuffer (&lb1[i]);
+      initbuffer (&lb2[i]);
+      thisline[i] = &lb1[i];
+      prevline[i] = &lb2[i];
+      file_lossage[i] = 0;
+      streams[i] = fopen (infiles[i], "r");
+      if (!streams[i])
+       pfatal_with_name (infiles[i]);
+
+      readline (thisline[i], streams[i]);
+    }
+
+  /* Keep count of number of files not at eof. */
+  nleft = nfiles;
+
+  while (nleft)
+    {
+      struct linebuffer *best = 0;
+      struct linebuffer *exch;
+      int bestfile = -1;
+      int i;
+
+      /* Look at the next avail line of each file; choose the least one.  */
+
+      for (i = 0; i < nfiles; i++)
+       {
+         if (thisline[i] &&
+             (!best ||
+              0 < compare_general (best->buffer, thisline[i]->buffer,
+                                (long) bestfile, (long) i, num_keyfields)))
+           {
+             best = thisline[i];
+             bestfile = i;
+           }
+       }
+
+      /* Output that line, unless it matches the previous one and we
+        don't want duplicates. */
+
+      if (!(prev_out &&
+           !compare_general (prev_out->buffer,
+                             best->buffer, 0L, 1L, num_keyfields - 1)))
+       indexify (best->buffer, ostream);
+      prev_out = best;
+
+      /* Now make the line the previous of its file, and fetch a new
+        line from that file.  */
+
+      exch = prevline[bestfile];
+      prevline[bestfile] = thisline[bestfile];
+      thisline[bestfile] = exch;
+
+      while (1)
+       {
+         /* If the file has no more, mark it empty. */
+
+         if (feof (streams[bestfile]))
+           {
+             thisline[bestfile] = 0;
+             /* Update the number of files still not empty. */
+             nleft--;
+             break;
+           }
+         readline (thisline[bestfile], streams[bestfile]);
+         if (thisline[bestfile]->buffer[0] || !feof (streams[bestfile]))
+           break;
+       }
+    }
+
+  finish_index (ostream);
+
+  /* Free all storage and close all input streams. */
+
+  for (i = 0; i < nfiles; i++)
+    {
+      fclose (streams[i]);
+      free (lb1[i].buffer);
+      free (lb2[i].buffer);
+    }
+  free (file_lossage);
+  free (lb1);
+  free (lb2);
+  free (thisline);
+  free (prevline);
+  free (streams);
+
+  if (outfile)
+    fclose (ostream);
+
+  return lossage;
+}
+\f
+/* Print error message and exit.  */
+
+void
+fatal (s1, s2)
+     char *s1, *s2;
+{
+  error (s1, s2);
+  exit (TI_FATAL_ERROR);
+}
+
+/* Print error message.  S1 is printf control string, S2 is arg for it. */
+
+void
+error (s1, s2)
+     char *s1, *s2;
+{
+  printf ("%s: ", program_name);
+  printf (s1, s2);
+  printf ("\n");
+}
+
+#if !defined (HAVE_STRERROR)
+static char *
+strerror (n)
+     int n;
+{
+  static char ebuf[40];
+
+  if (n < sys_nerr)
+    return sys_errlist[n];
+  else
+    {
+      sprintf (ebuf, "Unknown error %d", n);
+      return ebuf;
+    }
+}
+#endif
+
+void
+perror_with_name (name)
+     char *name;
+{
+  char *s;
+
+  s = concat ("", strerror (errno), " for %s");
+  error (s, name);
+}
+
+void
+pfatal_with_name (name)
+     char *name;
+{
+  char *s;
+
+  s = concat ("", strerror (errno), " for %s");
+  fatal (s, name);
+}
+
+/* Return a newly-allocated string whose contents concatenate those of
+   S1, S2, S3.  */
+
+char *
+concat (s1, s2, s3)
+     char *s1, *s2, *s3;
+{
+  int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+  char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
+
+  strcpy (result, s1);
+  strcpy (result + len1, s2);
+  strcpy (result + len1 + len2, s3);
+  *(result + len1 + len2 + len3) = 0;
+
+  return result;
+}
+
+/* Just like malloc, but kills the program in case of fatal error. */
+void *
+xmalloc (nbytes)
+     int nbytes;
+{
+  void *temp = (void *) malloc (nbytes);
+
+  if (nbytes && temp == (void *)NULL)
+    memory_error ("xmalloc", nbytes);
+
+  return (temp);
+}
+
+/* Like realloc (), but barfs if there isn't enough memory. */
+void *
+xrealloc (pointer, nbytes)
+     void *pointer;
+     int nbytes;
+{
+  void *temp;
+
+  if (!pointer)
+    temp = (void *)xmalloc (nbytes);
+  else
+    temp = (void *)realloc (pointer, nbytes);
+
+  if (nbytes && !temp)
+    memory_error ("xrealloc", nbytes);
+
+  return (temp);
+}
+
+memory_error (callers_name, bytes_wanted)
+     char *callers_name;
+     int bytes_wanted;
+{
+  char printable_string[80];
+
+  sprintf (printable_string,
+          "Virtual memory exhausted in %s ()!  Needed %d bytes.",
+          callers_name, bytes_wanted);
+
+  error (printable_string, "");
+  abort ();
+}
diff --git a/lib/glob/ChangeLog b/lib/glob/ChangeLog
new file mode 100644 (file)
index 0000000..377f0c1
--- /dev/null
@@ -0,0 +1,13 @@
+Thu Oct 29 08:58:12 1992  Brian Fox  (bfox@cubit)
+
+       * glob.c (glob_filename): Fix tiny memory leak.  Rework some
+       comments.
+
+Mon Jul 20 10:57:36 1992  Brian Fox  (bfox@cubit)
+
+       * glob.c: (glob_filename) Change use of rindex () to strrchr ().
+
+Thu Jul  9 10:02:47 1992  Brian Fox  (bfox@cubit)
+
+       * fnmatch.c: (fnmatch) Only process `[' as the start of a bracket
+       expression if there is a closing `]' present in the string.
diff --git a/lib/intl/ChangeLog b/lib/intl/ChangeLog
new file mode 100644 (file)
index 0000000..eed2d21
--- /dev/null
@@ -0,0 +1,4 @@
+2003-05-22  GNU  <bug-gnu-gettext@gnu.org>
+
+       * Version 0.12.1 released.
+
diff --git a/lib/intl/Makefile.in b/lib/intl/Makefile.in
new file mode 100644 (file)
index 0000000..70bafc9
--- /dev/null
@@ -0,0 +1,463 @@
+# Makefile for directory with message catalog handling library of GNU gettext
+# Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = @BUILD_DIR@
+VPATH = $(srcdir)
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+transform = @program_transform_name@
+libdir = @libdir@
+includedir = @includedir@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/intl
+aliaspath = $(localedir)
+subdir = intl
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+mkinstalldirs = $(SHELL) $(MKINSTALLDIRS)
+
+l = @INTL_LIBTOOL_SUFFIX_PREFIX@
+
+AR = ar
+CC = @CC@
+LIBTOOL = @LIBTOOL@
+RANLIB = @RANLIB@
+YACC = @INTLBISON@ -y -d
+YFLAGS = --name-prefix=__gettext
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
+-DLIBDIR=\"$(prefix)/libdata\" -DIN_LIBINTL \
+-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \
+-Dset_relocation_prefix=libintl_set_relocation_prefix \
+-Drelocate=libintl_relocate \
+-DDEPENDS_ON_LIBICONV=1 @DEFS@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+HEADERS = \
+  gmo.h \
+  gettextP.h \
+  hash-string.h \
+  loadinfo.h \
+  plural-exp.h \
+  eval-plural.h \
+  localcharset.h \
+  relocatable.h \
+  os2compat.h \
+  libgnuintl.h.in
+SOURCES = \
+  bindtextdom.c \
+  dcgettext.c \
+  dgettext.c \
+  gettext.c \
+  finddomain.c \
+  loadmsgcat.c \
+  localealias.c \
+  textdomain.c \
+  l10nflist.c \
+  explodename.c \
+  dcigettext.c \
+  dcngettext.c \
+  dngettext.c \
+  ngettext.c \
+  plural.y \
+  plural-exp.c \
+  localcharset.c \
+  relocatable.c \
+  localename.c \
+  log.c \
+  osdep.c \
+  os2compat.c \
+  intl-compat.c
+OBJECTS = \
+  bindtextdom.$lo \
+  dcgettext.$lo \
+  dgettext.$lo \
+  gettext.$lo \
+  finddomain.$lo \
+  loadmsgcat.$lo \
+  localealias.$lo \
+  textdomain.$lo \
+  l10nflist.$lo \
+  explodename.$lo \
+  dcigettext.$lo \
+  dcngettext.$lo \
+  dngettext.$lo \
+  ngettext.$lo \
+  plural.$lo \
+  plural-exp.$lo \
+  localcharset.$lo \
+  relocatable.$lo \
+  localename.$lo \
+  log.$lo \
+  osdep.$lo \
+  intl-compat.$lo
+DISTFILES.common = Makefile.in \
+config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES)
+DISTFILES.generated = plural.c
+DISTFILES.normal = VERSION
+DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc \
+Makefile.vms libgnuintl.h.msvc-shared README.woe32 Makefile.msvc
+DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \
+COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h
+
+all: all-@USE_INCLUDED_LIBINTL@
+all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
+all-no: all-no-@BUILD_INCLUDED_LIBINTL@
+all-no-yes: libgnuintl.$la
+all-no-no:
+
+libintl.a libgnuintl.a: $(OBJECTS)
+       rm -f $@
+       $(AR) cru $@ $(OBJECTS)
+       $(RANLIB) $@
+
+libintl.la libgnuintl.la: $(OBJECTS)
+       $(LIBTOOL) --mode=link \
+         $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
+         $(OBJECTS) @LTLIBICONV@ $(LIBS) \
+         -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
+         -rpath $(libdir) \
+         -no-undefined
+
+# Libtool's library version information for libintl.
+# Before making a gettext release, the gettext maintainer must change this
+# according to the libtool documentation, section "Library interface versions".
+# Maintainers of other packages that include the intl directory must *not*
+# change these values.
+LTV_CURRENT=5
+LTV_REVISION=0
+LTV_AGE=3
+
+.SUFFIXES:
+.SUFFIXES: .c .y .o .lo .sin .sed
+
+.c.o:
+       $(COMPILE) $<
+
+.y.c:
+       $(YACC) $(YFLAGS) --output $@ $<
+       rm -f $*.h
+
+bindtextdom.lo: $(srcdir)/bindtextdom.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c
+dcgettext.lo: $(srcdir)/dcgettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c
+dgettext.lo: $(srcdir)/dgettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c
+gettext.lo: $(srcdir)/gettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c
+finddomain.lo: $(srcdir)/finddomain.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c
+loadmsgcat.lo: $(srcdir)/loadmsgcat.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c
+localealias.lo: $(srcdir)/localealias.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c
+textdomain.lo: $(srcdir)/textdomain.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c
+l10nflist.lo: $(srcdir)/l10nflist.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c
+explodename.lo: $(srcdir)/explodename.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c
+dcigettext.lo: $(srcdir)/dcigettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c
+dcngettext.lo: $(srcdir)/dcngettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c
+dngettext.lo: $(srcdir)/dngettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c
+ngettext.lo: $(srcdir)/ngettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c
+plural.lo: $(srcdir)/plural.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c
+plural-exp.lo: $(srcdir)/plural-exp.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c
+localcharset.lo: $(srcdir)/localcharset.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c
+relocatable.lo: $(srcdir)/relocatable.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c
+localename.lo: $(srcdir)/localename.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c
+log.lo: $(srcdir)/log.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c
+osdep.lo: $(srcdir)/osdep.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c
+intl-compat.lo: $(srcdir)/intl-compat.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c
+
+ref-add.sed: $(srcdir)/ref-add.sin
+       sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed
+       mv t-ref-add.sed ref-add.sed
+ref-del.sed: $(srcdir)/ref-del.sin
+       sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed
+       mv t-ref-del.sed ref-del.sed
+
+INCLUDES = -I. -I$(srcdir) -I${top_builddir} -I${top_srcdir}
+
+libgnuintl.h: $(srcdir)/libgnuintl.h.in
+       cp $(srcdir)/libgnuintl.h.in libgnuintl.h
+
+libintl.h: libgnuintl.h
+       cp libgnuintl.h libintl.h
+
+charset.alias: $(srcdir)/config.charset
+       $(SHELL) $(srcdir)/config.charset '@host@' > t-$@
+       mv t-$@ $@
+
+check: all
+
+# We must not install the libintl.h/libintl.a files if we are on a
+# system which has the GNU gettext() function in its C library or in a
+# separate library.
+# If you want to use the one which comes with this version of the
+# package, you have to use `configure --with-included-gettext'.
+install: install-exec install-data
+install-exec: all
+       if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+          && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+         $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \
+         $(LIBTOOL) --mode=install \
+           $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \
+         if test "@RELOCATABLE@" = yes; then \
+           dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \
+           if test -n "$dependencies"; then \
+             rm -f $(DESTDIR)$(libdir)/libintl.la; \
+           fi; \
+         fi; \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools" \
+          && test '@USE_INCLUDED_LIBINTL@' = no; then \
+         $(mkinstalldirs) $(DESTDIR)$(libdir); \
+         $(LIBTOOL) --mode=install \
+           $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \
+         rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+         $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+         $(LIBTOOL) --mode=uninstall \
+           rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \
+       else \
+         : ; \
+       fi
+       if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         $(mkinstalldirs) $(DESTDIR)$(localedir); \
+         test -f $(DESTDIR)$(localedir)/locale.alias \
+           && orig=$(DESTDIR)$(localedir)/locale.alias \
+           || orig=$(srcdir)/locale.alias; \
+         temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+         dest=$(DESTDIR)$(localedir)/locale.alias; \
+         sed -f ref-add.sed $$orig > $$temp; \
+         $(INSTALL_DATA) $$temp $$dest; \
+         rm -f $$temp; \
+       else \
+         : ; \
+       fi
+install-data: all
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+         $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
+         $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
+         dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \
+         for file in $$dists; do \
+           $(INSTALL_DATA) $(srcdir)/$$file \
+                           $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+         chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \
+         dists="$(DISTFILES.generated)"; \
+         for file in $$dists; do \
+           if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+           $(INSTALL_DATA) $$dir/$$file \
+                           $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+         dists="$(DISTFILES.obsolete)"; \
+         for file in $$dists; do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+
+install-strip: install
+
+installdirs:
+       if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+          && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools" \
+          && test '@USE_INCLUDED_LIBINTL@' = no; then \
+         $(mkinstalldirs) $(DESTDIR)$(libdir); \
+       else \
+         : ; \
+       fi
+       if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \
+         $(mkinstalldirs) $(DESTDIR)$(localedir); \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+       else \
+         : ; \
+       fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+       if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+          && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         rm -f $(DESTDIR)$(includedir)/libintl.h; \
+         $(LIBTOOL) --mode=uninstall \
+           rm -f $(DESTDIR)$(libdir)/libintl.$la; \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools" \
+          && test '@USE_INCLUDED_LIBINTL@' = no; then \
+         rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+       else \
+         : ; \
+       fi
+       if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         if test -f $(DESTDIR)$(prefix)/libdata/charset.alias; then \
+           temp=$(DESTDIR)$(prefix)/libdata/t-charset.alias; \
+           dest=$(DESTDIR)$(prefix)/libdata/charset.alias; \
+           sed -f ref-del.sed $$dest > $$temp; \
+           if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+             rm -f $$dest; \
+           else \
+             $(INSTALL_DATA) $$temp $$dest; \
+           fi; \
+           rm -f $$temp; \
+         fi; \
+         if test -f $(DESTDIR)$(localedir)/locale.alias; then \
+           temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+           dest=$(DESTDIR)$(localedir)/locale.alias; \
+           sed -f ref-del.sed $$dest > $$temp; \
+           if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+             rm -f $$dest; \
+           else \
+             $(INSTALL_DATA) $$temp $$dest; \
+           fi; \
+           rm -f $$temp; \
+         fi; \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+
+info dvi ps pdf html:
+
+$(OBJECTS): ${top_builddir}/config.h libgnuintl.h
+bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h
+dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h
+explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h
+dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h
+dcigettext.$lo: $(srcdir)/eval-plural.h
+localcharset.$lo: $(srcdir)/localcharset.h
+localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h
+
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES)
+       here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
+
+ctags: CTAGS
+
+CTAGS: $(HEADERS) $(SOURCES)
+       here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES)
+
+id: ID
+
+ID: $(HEADERS) $(SOURCES)
+       here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
+
+
+mostlyclean:
+       rm -f *.a *.la *.o *.obj *.lo core core.*
+       rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed
+       rm -f -r .libs _libs
+
+clean: mostlyclean
+
+distclean: clean
+       rm -f Makefile ID TAGS
+       if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \
+         rm -f ChangeLog.inst $(DISTFILES.normal); \
+       else \
+         : ; \
+       fi
+
+maintainer-clean: distclean
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+
+# GNU gettext needs not contain the file `VERSION' but contains some
+# other files which should not be distributed in other packages.
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: Makefile
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         : ; \
+       else \
+         if test "$(PACKAGE)" = "gettext-runtime"; then \
+           additional="$(DISTFILES.gettext)"; \
+         else \
+           additional="$(DISTFILES.normal)"; \
+         fi; \
+         $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
+         for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
+           if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+           cp -p $$dir/$$file $(distdir); \
+         done; \
+       fi
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       cd $(top_builddir) && $(SHELL) ./config.status
+# This would be more efficient, but doesn't work any more with autoconf-2.57,
+# when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used.
+#      cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/lib/intl/VERSION b/lib/intl/VERSION
new file mode 100644 (file)
index 0000000..1303183
--- /dev/null
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.12.1
diff --git a/lib/intl/bindtextdom.c b/lib/intl/bindtextdom.c
new file mode 100644 (file)
index 0000000..250f5e8
--- /dev/null
@@ -0,0 +1,374 @@
+/* Implementation of the bindtextdomain(3) function
+   Copyright (C) 1995-1998, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "gettextP.h"
+
+#ifdef _LIBC
+/* We have to handle multi-threaded applications.  */
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc.  */
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+   names than the internal variables in GNU libc, otherwise programs
+   using libintl.a cannot be linked statically.  */
+#if !defined _LIBC
+# define _nl_default_dirname libintl_nl_default_dirname
+# define _nl_domain_bindings libintl_nl_domain_bindings
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>.  */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Contains the default location of the message catalogs.  */
+extern const char _nl_default_dirname[];
+#ifdef _LIBC
+extern const char _nl_default_dirname_internal[] attribute_hidden;
+#else
+# define INTUSE(name) name
+#endif
+
+/* List with bindings of specific domains.  */
+extern struct binding *_nl_domain_bindings;
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define BINDTEXTDOMAIN __bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
+#else
+# define BINDTEXTDOMAIN libintl_bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset
+#endif
+
+/* Prototypes for local functions.  */
+static void set_binding_values PARAMS ((const char *domainname,
+                                       const char **dirnamep,
+                                       const char **codesetp));
+
+/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP
+   to be used for the DOMAINNAME message catalog.
+   If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
+   modified, only the current value is returned.
+   If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
+   modified nor returned.  */
+static void
+set_binding_values (domainname, dirnamep, codesetp)
+     const char *domainname;
+     const char **dirnamep;
+     const char **codesetp;
+{
+  struct binding *binding;
+  int modified;
+
+  /* Some sanity checks.  */
+  if (domainname == NULL || domainname[0] == '\0')
+    {
+      if (dirnamep)
+       *dirnamep = NULL;
+      if (codesetp)
+       *codesetp = NULL;
+      return;
+    }
+
+  __libc_rwlock_wrlock (_nl_state_lock);
+
+  modified = 0;
+
+  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+    {
+      int compare = strcmp (domainname, binding->domainname);
+      if (compare == 0)
+       /* We found it!  */
+       break;
+      if (compare < 0)
+       {
+         /* It is not in the list.  */
+         binding = NULL;
+         break;
+       }
+    }
+
+  if (binding != NULL)
+    {
+      if (dirnamep)
+       {
+         const char *dirname = *dirnamep;
+
+         if (dirname == NULL)
+           /* The current binding has be to returned.  */
+           *dirnamep = binding->dirname;
+         else
+           {
+             /* The domain is already bound.  If the new value and the old
+                one are equal we simply do nothing.  Otherwise replace the
+                old binding.  */
+             char *result = binding->dirname;
+             if (strcmp (dirname, result) != 0)
+               {
+                 if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0)
+                   result = (char *) INTUSE(_nl_default_dirname);
+                 else
+                   {
+#if defined _LIBC || defined HAVE_STRDUP
+                     result = strdup (dirname);
+#else
+                     size_t len = strlen (dirname) + 1;
+                     result = (char *) malloc (len);
+                     if (__builtin_expect (result != NULL, 1))
+                       memcpy (result, dirname, len);
+#endif
+                   }
+
+                 if (__builtin_expect (result != NULL, 1))
+                   {
+                     if (binding->dirname != INTUSE(_nl_default_dirname))
+                       free (binding->dirname);
+
+                     binding->dirname = result;
+                     modified = 1;
+                   }
+               }
+             *dirnamep = result;
+           }
+       }
+
+      if (codesetp)
+       {
+         const char *codeset = *codesetp;
+
+         if (codeset == NULL)
+           /* The current binding has be to returned.  */
+           *codesetp = binding->codeset;
+         else
+           {
+             /* The domain is already bound.  If the new value and the old
+                one are equal we simply do nothing.  Otherwise replace the
+                old binding.  */
+             char *result = binding->codeset;
+             if (result == NULL || strcmp (codeset, result) != 0)
+               {
+#if defined _LIBC || defined HAVE_STRDUP
+                 result = strdup (codeset);
+#else
+                 size_t len = strlen (codeset) + 1;
+                 result = (char *) malloc (len);
+                 if (__builtin_expect (result != NULL, 1))
+                   memcpy (result, codeset, len);
+#endif
+
+                 if (__builtin_expect (result != NULL, 1))
+                   {
+                     if (binding->codeset != NULL)
+                       free (binding->codeset);
+
+                     binding->codeset = result;
+                     binding->codeset_cntr++;
+                     modified = 1;
+                   }
+               }
+             *codesetp = result;
+           }
+       }
+    }
+  else if ((dirnamep == NULL || *dirnamep == NULL)
+          && (codesetp == NULL || *codesetp == NULL))
+    {
+      /* Simply return the default values.  */
+      if (dirnamep)
+       *dirnamep = INTUSE(_nl_default_dirname);
+      if (codesetp)
+       *codesetp = NULL;
+    }
+  else
+    {
+      /* We have to create a new binding.  */
+      size_t len = strlen (domainname) + 1;
+      struct binding *new_binding =
+       (struct binding *) malloc (offsetof (struct binding, domainname) + len);
+
+      if (__builtin_expect (new_binding == NULL, 0))
+       goto failed;
+
+      memcpy (new_binding->domainname, domainname, len);
+
+      if (dirnamep)
+       {
+         const char *dirname = *dirnamep;
+
+         if (dirname == NULL)
+           /* The default value.  */
+           dirname = INTUSE(_nl_default_dirname);
+         else
+           {
+             if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0)
+               dirname = INTUSE(_nl_default_dirname);
+             else
+               {
+                 char *result;
+#if defined _LIBC || defined HAVE_STRDUP
+                 result = strdup (dirname);
+                 if (__builtin_expect (result == NULL, 0))
+                   goto failed_dirname;
+#else
+                 size_t len = strlen (dirname) + 1;
+                 result = (char *) malloc (len);
+                 if (__builtin_expect (result == NULL, 0))
+                   goto failed_dirname;
+                 memcpy (result, dirname, len);
+#endif
+                 dirname = result;
+               }
+           }
+         *dirnamep = dirname;
+         new_binding->dirname = (char *) dirname;
+       }
+      else
+       /* The default value.  */
+       new_binding->dirname = (char *) INTUSE(_nl_default_dirname);
+
+      new_binding->codeset_cntr = 0;
+
+      if (codesetp)
+       {
+         const char *codeset = *codesetp;
+
+         if (codeset != NULL)
+           {
+             char *result;
+
+#if defined _LIBC || defined HAVE_STRDUP
+             result = strdup (codeset);
+             if (__builtin_expect (result == NULL, 0))
+               goto failed_codeset;
+#else
+             size_t len = strlen (codeset) + 1;
+             result = (char *) malloc (len);
+             if (__builtin_expect (result == NULL, 0))
+               goto failed_codeset;
+             memcpy (result, codeset, len);
+#endif
+             codeset = result;
+             new_binding->codeset_cntr++;
+           }
+         *codesetp = codeset;
+         new_binding->codeset = (char *) codeset;
+       }
+      else
+       new_binding->codeset = NULL;
+
+      /* Now enqueue it.  */
+      if (_nl_domain_bindings == NULL
+         || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+       {
+         new_binding->next = _nl_domain_bindings;
+         _nl_domain_bindings = new_binding;
+       }
+      else
+       {
+         binding = _nl_domain_bindings;
+         while (binding->next != NULL
+                && strcmp (domainname, binding->next->domainname) > 0)
+           binding = binding->next;
+
+         new_binding->next = binding->next;
+         binding->next = new_binding;
+       }
+
+      modified = 1;
+
+      /* Here we deal with memory allocation failures.  */
+      if (0)
+       {
+       failed_codeset:
+         if (new_binding->dirname != INTUSE(_nl_default_dirname))
+           free (new_binding->dirname);
+       failed_dirname:
+         free (new_binding);
+       failed:
+         if (dirnamep)
+           *dirnamep = NULL;
+         if (codesetp)
+           *codesetp = NULL;
+       }
+    }
+
+  /* If we modified any binding, we flush the caches.  */
+  if (modified)
+    ++_nl_msg_cat_cntr;
+
+  __libc_rwlock_unlock (_nl_state_lock);
+}
+
+/* Specify that the DOMAINNAME message catalog will be found
+   in DIRNAME rather than in the system locale data base.  */
+char *
+BINDTEXTDOMAIN (domainname, dirname)
+     const char *domainname;
+     const char *dirname;
+{
+  set_binding_values (domainname, &dirname, NULL);
+  return (char *) dirname;
+}
+
+/* Specify the character encoding in which the messages from the
+   DOMAINNAME message catalog will be returned.  */
+char *
+BIND_TEXTDOMAIN_CODESET (domainname, codeset)
+     const char *domainname;
+     const char *codeset;
+{
+  set_binding_values (domainname, NULL, &codeset);
+  return (char *) codeset;
+}
+
+#ifdef _LIBC
+/* Aliases for function names in GNU C Library.  */
+weak_alias (__bindtextdomain, bindtextdomain);
+weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset);
+#endif
diff --git a/lib/intl/config.charset b/lib/intl/config.charset
new file mode 100755 (executable)
index 0000000..32becec
--- /dev/null
@@ -0,0 +1,467 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+#   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+#   USA.
+#
+# The table consists of lines of the form
+#    ALIAS  CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+#       name                         used by which systems         a MIME name?
+#   ASCII, ANSI_X3.4-1968     glibc solaris freebsd
+#   ISO-8859-1                glibc aix hpux irix osf solaris freebsd   yes
+#   ISO-8859-2                glibc aix hpux irix osf solaris freebsd   yes
+#   ISO-8859-3                glibc solaris                             yes
+#   ISO-8859-4                osf solaris freebsd                       yes
+#   ISO-8859-5                glibc aix hpux irix osf solaris freebsd   yes
+#   ISO-8859-6                glibc aix hpux solaris                    yes
+#   ISO-8859-7                glibc aix hpux irix osf solaris           yes
+#   ISO-8859-8                glibc aix hpux osf solaris                yes
+#   ISO-8859-9                glibc aix hpux irix osf solaris           yes
+#   ISO-8859-13               glibc
+#   ISO-8859-14               glibc
+#   ISO-8859-15               glibc aix osf solaris freebsd
+#   KOI8-R                    glibc solaris freebsd                     yes
+#   KOI8-U                    glibc freebsd                             yes
+#   KOI8-T                    glibc
+#   CP437                     dos
+#   CP775                     dos
+#   CP850                     aix osf dos
+#   CP852                     dos
+#   CP855                     dos
+#   CP856                     aix
+#   CP857                     dos
+#   CP861                     dos
+#   CP862                     dos
+#   CP864                     dos
+#   CP865                     dos
+#   CP866                     freebsd dos
+#   CP869                     dos
+#   CP874                     woe32 dos
+#   CP922                     aix
+#   CP932                     aix woe32 dos
+#   CP943                     aix
+#   CP949                     osf woe32 dos
+#   CP950                     woe32 dos
+#   CP1046                    aix
+#   CP1124                    aix
+#   CP1125                    dos
+#   CP1129                    aix
+#   CP1250                    woe32
+#   CP1251                    glibc solaris woe32
+#   CP1252                    aix woe32
+#   CP1253                    woe32
+#   CP1254                    woe32
+#   CP1255                    glibc woe32
+#   CP1256                    woe32
+#   CP1257                    woe32
+#   GB2312                    glibc aix hpux irix solaris freebsd       yes
+#   EUC-JP                    glibc aix hpux irix osf solaris freebsd   yes
+#   EUC-KR                    glibc aix hpux irix osf solaris freebsd   yes
+#   EUC-TW                    glibc aix hpux irix osf solaris
+#   BIG5                      glibc aix hpux osf solaris freebsd        yes
+#   BIG5-HKSCS                glibc solaris
+#   GBK                       glibc aix osf solaris woe32 dos
+#   GB18030                   glibc solaris
+#   SHIFT_JIS                 hpux osf solaris freebsd                  yes
+#   JOHAB                     glibc solaris woe32
+#   TIS-620                   glibc aix hpux osf solaris
+#   VISCII                    glibc                                     yes
+#   TCVN5712-1                glibc
+#   GEORGIAN-PS               glibc
+#   HP-ROMAN8                 hpux
+#   HP-ARABIC8                hpux
+#   HP-GREEK8                 hpux
+#   HP-HEBREW8                hpux
+#   HP-TURKISH8               hpux
+#   HP-KANA8                  hpux
+#   DEC-KANJI                 osf
+#   DEC-HANYU                 osf
+#   UTF-8                     glibc aix hpux osf solaris                yes
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+    linux* | *-gnu*)
+       # With glibc-2.1 or newer, we don't need any canonicalization,
+       # because glibc has iconv and both glibc and libiconv support all
+       # GNU canonical names directly. Therefore, the Makefile does not
+       # need to install the alias file at all.
+       # The following applies only to glibc-2.0.x and older libcs.
+       echo "ISO_646.IRV:1983 ASCII"
+       ;;
+    aix*)
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-6 ISO-8859-6"
+       echo "ISO8859-7 ISO-8859-7"
+       echo "ISO8859-8 ISO-8859-8"
+       echo "ISO8859-9 ISO-8859-9"
+       echo "ISO8859-15 ISO-8859-15"
+       echo "IBM-850 CP850"
+       echo "IBM-856 CP856"
+       echo "IBM-921 ISO-8859-13"
+       echo "IBM-922 CP922"
+       echo "IBM-932 CP932"
+       echo "IBM-943 CP943"
+       echo "IBM-1046 CP1046"
+       echo "IBM-1124 CP1124"
+       echo "IBM-1129 CP1129"
+       echo "IBM-1252 CP1252"
+       echo "IBM-eucCN GB2312"
+       echo "IBM-eucJP EUC-JP"
+       echo "IBM-eucKR EUC-KR"
+       echo "IBM-eucTW EUC-TW"
+       echo "big5 BIG5"
+       echo "GBK GBK"
+       echo "TIS-620 TIS-620"
+       echo "UTF-8 UTF-8"
+       ;;
+    hpux*)
+       echo "iso88591 ISO-8859-1"
+       echo "iso88592 ISO-8859-2"
+       echo "iso88595 ISO-8859-5"
+       echo "iso88596 ISO-8859-6"
+       echo "iso88597 ISO-8859-7"
+       echo "iso88598 ISO-8859-8"
+       echo "iso88599 ISO-8859-9"
+       echo "iso885915 ISO-8859-15"
+       echo "roman8 HP-ROMAN8"
+       echo "arabic8 HP-ARABIC8"
+       echo "greek8 HP-GREEK8"
+       echo "hebrew8 HP-HEBREW8"
+       echo "turkish8 HP-TURKISH8"
+       echo "kana8 HP-KANA8"
+       echo "tis620 TIS-620"
+       echo "big5 BIG5"
+       echo "eucJP EUC-JP"
+       echo "eucKR EUC-KR"
+       echo "eucTW EUC-TW"
+       echo "hp15CN GB2312"
+       #echo "ccdc ?" # what is this?
+       echo "SJIS SHIFT_JIS"
+       echo "utf8 UTF-8"
+       ;;
+    irix*)
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-7 ISO-8859-7"
+       echo "ISO8859-9 ISO-8859-9"
+       echo "eucCN GB2312"
+       echo "eucJP EUC-JP"
+       echo "eucKR EUC-KR"
+       echo "eucTW EUC-TW"
+       ;;
+    osf*)
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-4 ISO-8859-4"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-7 ISO-8859-7"
+       echo "ISO8859-8 ISO-8859-8"
+       echo "ISO8859-9 ISO-8859-9"
+       echo "ISO8859-15 ISO-8859-15"
+       echo "cp850 CP850"
+       echo "big5 BIG5"
+       echo "dechanyu DEC-HANYU"
+       echo "dechanzi GB2312"
+       echo "deckanji DEC-KANJI"
+       echo "deckorean EUC-KR"
+       echo "eucJP EUC-JP"
+       echo "eucKR EUC-KR"
+       echo "eucTW EUC-TW"
+       echo "GBK GBK"
+       echo "KSC5601 CP949"
+       echo "sdeckanji EUC-JP"
+       echo "SJIS SHIFT_JIS"
+       echo "TACTIS TIS-620"
+       echo "UTF-8 UTF-8"
+       ;;
+    solaris*)
+       echo "646 ASCII"
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-3 ISO-8859-3"
+       echo "ISO8859-4 ISO-8859-4"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-6 ISO-8859-6"
+       echo "ISO8859-7 ISO-8859-7"
+       echo "ISO8859-8 ISO-8859-8"
+       echo "ISO8859-9 ISO-8859-9"
+       echo "ISO8859-15 ISO-8859-15"
+       echo "koi8-r KOI8-R"
+       echo "ansi-1251 CP1251"
+       echo "BIG5 BIG5"
+       echo "Big5-HKSCS BIG5-HKSCS"
+       echo "gb2312 GB2312"
+       echo "GBK GBK"
+       echo "GB18030 GB18030"
+       echo "cns11643 EUC-TW"
+       echo "5601 EUC-KR"
+       echo "ko_KR.johap92 JOHAB"
+       echo "eucJP EUC-JP"
+       echo "PCK SHIFT_JIS"
+       echo "TIS620.2533 TIS-620"
+       #echo "sun_eu_greek ?" # what is this?
+       echo "UTF-8 UTF-8"
+       ;;
+    freebsd* | os2*)
+       # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+       # localcharset.c falls back to using the full locale name
+       # from the environment variables.
+       # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+       # reuse FreeBSD's locale data for OS/2.
+       echo "C ASCII"
+       echo "US-ASCII ASCII"
+       for l in la_LN lt_LN; do
+         echo "$l.ASCII ASCII"
+       done
+       for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+                fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+                lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+         echo "$l.ISO_8859-1 ISO-8859-1"
+         echo "$l.DIS_8859-15 ISO-8859-15"
+       done
+       for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+         echo "$l.ISO_8859-2 ISO-8859-2"
+       done
+       for l in la_LN lt_LT; do
+         echo "$l.ISO_8859-4 ISO-8859-4"
+       done
+       for l in ru_RU ru_SU; do
+         echo "$l.KOI8-R KOI8-R"
+         echo "$l.ISO_8859-5 ISO-8859-5"
+         echo "$l.CP866 CP866"
+       done
+       echo "uk_UA.KOI8-U KOI8-U"
+       echo "zh_TW.BIG5 BIG5"
+       echo "zh_TW.Big5 BIG5"
+       echo "zh_CN.EUC GB2312"
+       echo "ja_JP.EUC EUC-JP"
+       echo "ja_JP.SJIS SHIFT_JIS"
+       echo "ja_JP.Shift_JIS SHIFT_JIS"
+       echo "ko_KR.EUC EUC-KR"
+       ;;
+    netbsd*)
+       echo "646 ASCII"
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-4 ISO-8859-4"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-15 ISO-8859-15"
+       echo "eucCN GB2312"
+       echo "eucJP EUC-JP"
+       echo "eucKR EUC-KR"
+       echo "eucTW EUC-TW"
+       echo "BIG5 BIG5"
+       echo "SJIS SHIFT_JIS"
+       ;;
+    beos*)
+       # BeOS has a single locale, and it has UTF-8 encoding.
+       echo "* UTF-8"
+       ;;
+    msdosdjgpp*)
+       # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+       # localcharset.c falls back to using the full locale name
+       # from the environment variables.
+       echo "#"
+       echo "# The encodings given here may not all be correct."
+       echo "# If you find that the encoding given for your language and"
+       echo "# country is not the one your DOS machine actually uses, just"
+       echo "# correct it in this file, and send a mail to"
+       echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>"
+       echo "# and Bruno Haible <bruno@clisp.org>."
+       echo "#"
+       echo "C ASCII"
+       # ISO-8859-1 languages
+       echo "ca CP850"
+       echo "ca_ES CP850"
+       echo "da CP865"    # not CP850 ??
+       echo "da_DK CP865" # not CP850 ??
+       echo "de CP850"
+       echo "de_AT CP850"
+       echo "de_CH CP850"
+       echo "de_DE CP850"
+       echo "en CP850"
+       echo "en_AU CP850" # not CP437 ??
+       echo "en_CA CP850"
+       echo "en_GB CP850"
+       echo "en_NZ CP437"
+       echo "en_US CP437"
+       echo "en_ZA CP850" # not CP437 ??
+       echo "es CP850"
+       echo "es_AR CP850"
+       echo "es_BO CP850"
+       echo "es_CL CP850"
+       echo "es_CO CP850"
+       echo "es_CR CP850"
+       echo "es_CU CP850"
+       echo "es_DO CP850"
+       echo "es_EC CP850"
+       echo "es_ES CP850"
+       echo "es_GT CP850"
+       echo "es_HN CP850"
+       echo "es_MX CP850"
+       echo "es_NI CP850"
+       echo "es_PA CP850"
+       echo "es_PY CP850"
+       echo "es_PE CP850"
+       echo "es_SV CP850"
+       echo "es_UY CP850"
+       echo "es_VE CP850"
+       echo "et CP850"
+       echo "et_EE CP850"
+       echo "eu CP850"
+       echo "eu_ES CP850"
+       echo "fi CP850"
+       echo "fi_FI CP850"
+       echo "fr CP850"
+       echo "fr_BE CP850"
+       echo "fr_CA CP850"
+       echo "fr_CH CP850"
+       echo "fr_FR CP850"
+       echo "ga CP850"
+       echo "ga_IE CP850"
+       echo "gd CP850"
+       echo "gd_GB CP850"
+       echo "gl CP850"
+       echo "gl_ES CP850"
+       echo "id CP850"    # not CP437 ??
+       echo "id_ID CP850" # not CP437 ??
+       echo "is CP861"    # not CP850 ??
+       echo "is_IS CP861" # not CP850 ??
+       echo "it CP850"
+       echo "it_CH CP850"
+       echo "it_IT CP850"
+       echo "lt CP775"
+       echo "lt_LT CP775"
+       echo "lv CP775"
+       echo "lv_LV CP775"
+       echo "nb CP865"    # not CP850 ??
+       echo "nb_NO CP865" # not CP850 ??
+       echo "nl CP850"
+       echo "nl_BE CP850"
+       echo "nl_NL CP850"
+       echo "nn CP865"    # not CP850 ??
+       echo "nn_NO CP865" # not CP850 ??
+       echo "no CP865"    # not CP850 ??
+       echo "no_NO CP865" # not CP850 ??
+       echo "pt CP850"
+       echo "pt_BR CP850"
+       echo "pt_PT CP850"
+       echo "sv CP850"
+       echo "sv_SE CP850"
+       # ISO-8859-2 languages
+       echo "cs CP852"
+       echo "cs_CZ CP852"
+       echo "hr CP852"
+       echo "hr_HR CP852"
+       echo "hu CP852"
+       echo "hu_HU CP852"
+       echo "pl CP852"
+       echo "pl_PL CP852"
+       echo "ro CP852"
+       echo "ro_RO CP852"
+       echo "sk CP852"
+       echo "sk_SK CP852"
+       echo "sl CP852"
+       echo "sl_SI CP852"
+       echo "sq CP852"
+       echo "sq_AL CP852"
+       echo "sr CP852"    # CP852 or CP866 or CP855 ??
+       echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+       # ISO-8859-3 languages
+       echo "mt CP850"
+       echo "mt_MT CP850"
+       # ISO-8859-5 languages
+       echo "be CP866"
+       echo "be_BE CP866"
+       echo "bg CP866"    # not CP855 ??
+       echo "bg_BG CP866" # not CP855 ??
+       echo "mk CP866"    # not CP855 ??
+       echo "mk_MK CP866" # not CP855 ??
+       echo "ru CP866"
+       echo "ru_RU CP866"
+       echo "uk CP1125"
+       echo "uk_UA CP1125"
+       # ISO-8859-6 languages
+       echo "ar CP864"
+       echo "ar_AE CP864"
+       echo "ar_DZ CP864"
+       echo "ar_EG CP864"
+       echo "ar_IQ CP864"
+       echo "ar_IR CP864"
+       echo "ar_JO CP864"
+       echo "ar_KW CP864"
+       echo "ar_MA CP864"
+       echo "ar_OM CP864"
+       echo "ar_QA CP864"
+       echo "ar_SA CP864"
+       echo "ar_SY CP864"
+       # ISO-8859-7 languages
+       echo "el CP869"
+       echo "el_GR CP869"
+       # ISO-8859-8 languages
+       echo "he CP862"
+       echo "he_IL CP862"
+       # ISO-8859-9 languages
+       echo "tr CP857"
+       echo "tr_TR CP857"
+       # Japanese
+       echo "ja CP932"
+       echo "ja_JP CP932"
+       # Chinese
+       echo "zh_CN GBK"
+       echo "zh_TW CP950" # not CP938 ??
+       # Korean
+       echo "kr CP949"    # not CP934 ??
+       echo "kr_KR CP949" # not CP934 ??
+       # Thai
+       echo "th CP874"
+       echo "th_TH CP874"
+       # Other
+       echo "eo CP850"
+       echo "eo_EO CP850"
+       ;;
+esac
diff --git a/lib/intl/dcgettext.c b/lib/intl/dcgettext.c
new file mode 100644 (file)
index 0000000..ca6a1c8
--- /dev/null
@@ -0,0 +1,59 @@
+/* Implementation of the dcgettext(3) function.
+   Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCGETTEXT __dcgettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCGETTEXT libintl_dcgettext
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+char *
+DCGETTEXT (domainname, msgid, category)
+     const char *domainname;
+     const char *msgid;
+     int category;
+{
+  return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+INTDEF(__dcgettext)
+weak_alias (__dcgettext, dcgettext);
+#endif
diff --git a/lib/intl/dcigettext.c b/lib/intl/dcigettext.c
new file mode 100644 (file)
index 0000000..f6edb95
--- /dev/null
@@ -0,0 +1,1238 @@
+/* Implementation of the internal dcigettext function.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE   1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include <locale.h>
+
+#ifdef _LIBC
+  /* Guess whether integer division by zero raises signal SIGFPE.
+     Set to 1 only if you know for sure.  In case of doubt, set to 0.  */
+# if defined __alpha__ || defined __arm__ || defined __i386__ \
+     || defined __m68k__ || defined __s390__
+#  define INTDIV0_RAISES_SIGFPE 1
+# else
+#  define INTDIV0_RAISES_SIGFPE 0
+# endif
+#endif
+#if !INTDIV0_RAISES_SIGFPE
+# include <signal.h>
+#endif
+
+#if defined HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+
+#include "gettextP.h"
+#include "plural-exp.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "hash-string.h"
+
+/* Thread safetyness.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc.  */
+# define __libc_lock_define_initialized(CLASS, NAME)
+# define __libc_lock_lock(NAME)
+# define __libc_lock_unlock(NAME)
+# define __libc_rwlock_define_initialized(CLASS, NAME)
+# define __libc_rwlock_rdlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* Alignment of types.  */
+#if defined __GNUC__ && __GNUC__ >= 2
+# define alignof(TYPE) __alignof__ (TYPE)
+#else
+# define alignof(TYPE) \
+    ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+   names than the internal variables in GNU libc, otherwise programs
+   using libintl.a cannot be linked statically.  */
+#if !defined _LIBC
+# define _nl_default_default_domain libintl_nl_default_default_domain
+# define _nl_current_default_domain libintl_nl_current_default_domain
+# define _nl_default_dirname libintl_nl_default_dirname
+# define _nl_domain_bindings libintl_nl_domain_bindings
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>.  */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define getcwd __getcwd
+# ifndef stpcpy
+#  define stpcpy __stpcpy
+# endif
+# define tfind __tfind
+#else
+# if !defined HAVE_GETCWD
+char *getwd ();
+#  define getcwd(buf, max) getwd (buf)
+# else
+char *getcwd ();
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+# ifndef HAVE_MEMPCPY
+static void *mempcpy PARAMS ((void *dest, const void *src, size_t n));
+# endif
+#endif
+
+/* Amount to increase buffer size by in each try.  */
+#define PATH_INCR 32
+
+/* The following is from pathmax.h.  */
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+   PATH_MAX but might cause redefinition warnings when sys/param.h is
+   later included (as on MORE/BSD 4.3).  */
+#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__)
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined PATH_MAX && defined _PC_PATH_MAX
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been.  */
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
+                        it may be concatenated to a directory pathname.
+   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+    (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+#endif
+
+/* This is the type used for the search tree where known translations
+   are stored.  */
+struct known_translation_t
+{
+  /* Domain in which to search.  */
+  char *domainname;
+
+  /* The category.  */
+  int category;
+
+  /* State of the catalog counter at the point the string was found.  */
+  int counter;
+
+  /* Catalog where the string was found.  */
+  struct loaded_l10nfile *domain;
+
+  /* And finally the translation.  */
+  const char *translation;
+  size_t translation_length;
+
+  /* Pointer to the string in question.  */
+  char msgid[ZERO];
+};
+
+/* Root of the search tree with known translations.  We can use this
+   only if the system provides the `tsearch' function family.  */
+#if defined HAVE_TSEARCH || defined _LIBC
+# include <search.h>
+
+static void *root;
+
+# ifdef _LIBC
+#  define tsearch __tsearch
+# endif
+
+/* Function to compare two entries in the table of known translations.  */
+static int transcmp PARAMS ((const void *p1, const void *p2));
+static int
+transcmp (p1, p2)
+     const void *p1;
+     const void *p2;
+{
+  const struct known_translation_t *s1;
+  const struct known_translation_t *s2;
+  int result;
+
+  s1 = (const struct known_translation_t *) p1;
+  s2 = (const struct known_translation_t *) p2;
+
+  result = strcmp (s1->msgid, s2->msgid);
+  if (result == 0)
+    {
+      result = strcmp (s1->domainname, s2->domainname);
+      if (result == 0)
+       /* We compare the category last (though this is the cheapest
+          operation) since it is hopefully always the same (namely
+          LC_MESSAGES).  */
+       result = s1->category - s2->category;
+    }
+
+  return result;
+}
+#endif
+
+#ifndef INTVARDEF
+# define INTVARDEF(name)
+#endif
+#ifndef INTUSE
+# define INTUSE(name) name
+#endif
+
+/* Name of the default domain used for gettext(3) prior any call to
+   textdomain(3).  The default value for this is "messages".  */
+const char _nl_default_default_domain[] attribute_hidden = "messages";
+
+/* Value used as the default domain for gettext(3).  */
+const char *_nl_current_default_domain attribute_hidden
+     = _nl_default_default_domain;
+
+/* Contains the default location of the message catalogs.  */
+#if defined __EMX__
+extern const char _nl_default_dirname[];
+#else
+const char _nl_default_dirname[] = LOCALEDIR;
+INTVARDEF (_nl_default_dirname)
+#endif
+
+/* List with bindings of specific domains created by bindtextdomain()
+   calls.  */
+struct binding *_nl_domain_bindings;
+
+/* Prototypes for local functions.  */
+static char *plural_lookup PARAMS ((struct loaded_l10nfile *domain,
+                                   unsigned long int n,
+                                   const char *translation,
+                                   size_t translation_len))
+     internal_function;
+static const char *guess_category_value PARAMS ((int category,
+                                                const char *categoryname))
+     internal_function;
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# define category_to_name(category)    _nl_category_names[category]
+#else
+static const char *category_to_name PARAMS ((int category)) internal_function;
+#endif
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done.  */
+# define freea(p) /* nothing */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+  void *address;
+  struct block_list *next;
+};
+# define ADD_BLOCK(list, addr)                                               \
+  do {                                                                       \
+    struct block_list *newp = (struct block_list *) malloc (sizeof (*newp));  \
+    /* If we cannot get a free block we cannot add the new element to        \
+       the list.  */                                                         \
+    if (newp != NULL) {                                                              \
+      newp->address = (addr);                                                \
+      newp->next = (list);                                                   \
+      (list) = newp;                                                         \
+    }                                                                        \
+  } while (0)
+# define FREE_BLOCKS(list)                                                   \
+  do {                                                                       \
+    while (list != NULL) {                                                   \
+      struct block_list *old = list;                                         \
+      list = list->next;                                                     \
+      free (old->address);                                                   \
+      free (old);                                                            \
+    }                                                                        \
+  } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+# define freea(p) free (p)
+#endif /* have alloca */
+
+
+#ifdef _LIBC
+/* List of blocks allocated for translations.  */
+typedef struct transmem_list
+{
+  struct transmem_list *next;
+  char data[ZERO];
+} transmem_block_t;
+static struct transmem_list *transmem_list;
+#else
+typedef unsigned char transmem_block_t;
+#endif
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCIGETTEXT __dcigettext
+#else
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+#ifdef _LIBC
+__libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden)
+#endif
+
+/* Checking whether the binaries runs SUID must be done and glibc provides
+   easier methods therefore we make a difference here.  */
+#ifdef _LIBC
+# define ENABLE_SECURE __libc_enable_secure
+# define DETERMINE_SECURE
+#else
+# ifndef HAVE_GETUID
+#  define getuid() 0
+# endif
+# ifndef HAVE_GETGID
+#  define getgid() 0
+# endif
+# ifndef HAVE_GETEUID
+#  define geteuid() getuid()
+# endif
+# ifndef HAVE_GETEGID
+#  define getegid() getgid()
+# endif
+static int enable_secure;
+# define ENABLE_SECURE (enable_secure == 1)
+# define DETERMINE_SECURE \
+  if (enable_secure == 0)                                                    \
+    {                                                                        \
+      if (getuid () != geteuid () || getgid () != getegid ())                \
+       enable_secure = 1;                                                    \
+      else                                                                   \
+       enable_secure = -1;                                                   \
+    }
+#endif
+
+/* Get the function to evaluate the plural expression.  */
+#include "eval-plural.h"
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+   CATEGORY locale and, if PLURAL is nonzero, search over string
+   depending on the plural form determined by N.  */
+char *
+DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
+     const char *domainname;
+     const char *msgid1;
+     const char *msgid2;
+     int plural;
+     unsigned long int n;
+     int category;
+{
+#ifndef HAVE_ALLOCA
+  struct block_list *block_list = NULL;
+#endif
+  struct loaded_l10nfile *domain;
+  struct binding *binding;
+  const char *categoryname;
+  const char *categoryvalue;
+  char *dirname, *xdomainname;
+  char *single_locale;
+  char *retval;
+  size_t retlen;
+  int saved_errno;
+#if defined HAVE_TSEARCH || defined _LIBC
+  struct known_translation_t *search;
+  struct known_translation_t **foundp = NULL;
+  size_t msgid_len;
+#endif
+  size_t domainname_len;
+
+  /* If no real MSGID is given return NULL.  */
+  if (msgid1 == NULL)
+    return NULL;
+
+#ifdef _LIBC
+  if (category < 0 || category >= __LC_LAST || category == LC_ALL)
+    /* Bogus.  */
+    return (plural == 0
+           ? (char *) msgid1
+           /* Use the Germanic plural rule.  */
+           : n == 1 ? (char *) msgid1 : (char *) msgid2);
+#endif
+
+  __libc_rwlock_rdlock (_nl_state_lock);
+
+  /* If DOMAINNAME is NULL, we are interested in the default domain.  If
+     CATEGORY is not LC_MESSAGES this might not make much sense but the
+     definition left this undefined.  */
+  if (domainname == NULL)
+    domainname = _nl_current_default_domain;
+
+  /* OS/2 specific: backward compatibility with older libintl versions  */
+#ifdef LC_MESSAGES_COMPAT
+  if (category == LC_MESSAGES_COMPAT)
+    category = LC_MESSAGES;
+#endif
+
+#if defined HAVE_TSEARCH || defined _LIBC
+  msgid_len = strlen (msgid1) + 1;
+
+  /* Try to find the translation among those which we found at
+     some time.  */
+  search = (struct known_translation_t *)
+          alloca (offsetof (struct known_translation_t, msgid) + msgid_len);
+  memcpy (search->msgid, msgid1, msgid_len);
+  search->domainname = (char *) domainname;
+  search->category = category;
+
+  foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
+  freea (search);
+  if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
+    {
+      /* Now deal with plural.  */
+      if (plural)
+       retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation,
+                               (*foundp)->translation_length);
+      else
+       retval = (char *) (*foundp)->translation;
+
+      __libc_rwlock_unlock (_nl_state_lock);
+      return retval;
+    }
+#endif
+
+  /* Preserve the `errno' value.  */
+  saved_errno = errno;
+
+  /* See whether this is a SUID binary or not.  */
+  DETERMINE_SECURE;
+
+  /* First find matching binding.  */
+  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+    {
+      int compare = strcmp (domainname, binding->domainname);
+      if (compare == 0)
+       /* We found it!  */
+       break;
+      if (compare < 0)
+       {
+         /* It is not in the list.  */
+         binding = NULL;
+         break;
+       }
+    }
+
+  if (binding == NULL)
+    dirname = (char *) INTUSE(_nl_default_dirname);
+  else if (IS_ABSOLUTE_PATH (binding->dirname))
+    dirname = binding->dirname;
+  else
+    {
+      /* We have a relative path.  Make it absolute now.  */
+      size_t dirname_len = strlen (binding->dirname) + 1;
+      size_t path_max;
+      char *ret;
+
+      path_max = (unsigned int) PATH_MAX;
+      path_max += 2;           /* The getcwd docs say to do this.  */
+
+      for (;;)
+       {
+         dirname = (char *) alloca (path_max + dirname_len);
+         ADD_BLOCK (block_list, dirname);
+
+         __set_errno (0);
+         ret = getcwd (dirname, path_max);
+         if (ret != NULL || errno != ERANGE)
+           break;
+
+         path_max += path_max / 2;
+         path_max += PATH_INCR;
+       }
+
+      if (ret == NULL)
+       /* We cannot get the current working directory.  Don't signal an
+          error but simply return the default string.  */
+       goto return_untranslated;
+
+      stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
+    }
+
+  /* Now determine the symbolic name of CATEGORY and its value.  */
+  categoryname = category_to_name (category);
+  categoryvalue = guess_category_value (category, categoryname);
+
+  domainname_len = strlen (domainname);
+  xdomainname = (char *) alloca (strlen (categoryname)
+                                + domainname_len + 5);
+  ADD_BLOCK (block_list, xdomainname);
+
+  stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+                 domainname, domainname_len),
+         ".mo");
+
+  /* Creating working area.  */
+  single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+  ADD_BLOCK (block_list, single_locale);
+
+
+  /* Search for the given string.  This is a loop because we perhaps
+     got an ordered list of languages to consider for the translation.  */
+  while (1)
+    {
+      /* Make CATEGORYVALUE point to the next element of the list.  */
+      while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+       ++categoryvalue;
+      if (categoryvalue[0] == '\0')
+       {
+         /* The whole contents of CATEGORYVALUE has been searched but
+            no valid entry has been found.  We solve this situation
+            by implicitly appending a "C" entry, i.e. no translation
+            will take place.  */
+         single_locale[0] = 'C';
+         single_locale[1] = '\0';
+       }
+      else
+       {
+         char *cp = single_locale;
+         while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+           *cp++ = *categoryvalue++;
+         *cp = '\0';
+
+         /* When this is a SUID binary we must not allow accessing files
+            outside the dedicated directories.  */
+         if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale))
+           /* Ingore this entry.  */
+           continue;
+       }
+
+      /* If the current locale value is C (or POSIX) we don't load a
+        domain.  Return the MSGID.  */
+      if (strcmp (single_locale, "C") == 0
+         || strcmp (single_locale, "POSIX") == 0)
+       break;
+
+      /* Find structure describing the message catalog matching the
+        DOMAINNAME and CATEGORY.  */
+      domain = _nl_find_domain (dirname, single_locale, xdomainname, binding);
+
+      if (domain != NULL)
+       {
+         retval = _nl_find_msg (domain, binding, msgid1, &retlen);
+
+         if (retval == NULL)
+           {
+             int cnt;
+
+             for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+               {
+                 retval = _nl_find_msg (domain->successor[cnt], binding,
+                                        msgid1, &retlen);
+
+                 if (retval != NULL)
+                   {
+                     domain = domain->successor[cnt];
+                     break;
+                   }
+               }
+           }
+
+         if (retval != NULL)
+           {
+             /* Found the translation of MSGID1 in domain DOMAIN:
+                starting at RETVAL, RETLEN bytes.  */
+             FREE_BLOCKS (block_list);
+#if defined HAVE_TSEARCH || defined _LIBC
+             if (foundp == NULL)
+               {
+                 /* Create a new entry and add it to the search tree.  */
+                 struct known_translation_t *newp;
+
+                 newp = (struct known_translation_t *)
+                   malloc (offsetof (struct known_translation_t, msgid)
+                           + msgid_len + domainname_len + 1);
+                 if (newp != NULL)
+                   {
+                     newp->domainname =
+                       mempcpy (newp->msgid, msgid1, msgid_len);
+                     memcpy (newp->domainname, domainname, domainname_len + 1);
+                     newp->category = category;
+                     newp->counter = _nl_msg_cat_cntr;
+                     newp->domain = domain;
+                     newp->translation = retval;
+                     newp->translation_length = retlen;
+
+                     /* Insert the entry in the search tree.  */
+                     foundp = (struct known_translation_t **)
+                       tsearch (newp, &root, transcmp);
+                     if (foundp == NULL
+                         || __builtin_expect (*foundp != newp, 0))
+                       /* The insert failed.  */
+                       free (newp);
+                   }
+               }
+             else
+               {
+                 /* We can update the existing entry.  */
+                 (*foundp)->counter = _nl_msg_cat_cntr;
+                 (*foundp)->domain = domain;
+                 (*foundp)->translation = retval;
+                 (*foundp)->translation_length = retlen;
+               }
+#endif
+             __set_errno (saved_errno);
+
+             /* Now deal with plural.  */
+             if (plural)
+               retval = plural_lookup (domain, n, retval, retlen);
+
+             __libc_rwlock_unlock (_nl_state_lock);
+             return retval;
+           }
+       }
+    }
+
+ return_untranslated:
+  /* Return the untranslated MSGID.  */
+  FREE_BLOCKS (block_list);
+  __libc_rwlock_unlock (_nl_state_lock);
+#ifndef _LIBC
+  if (!ENABLE_SECURE)
+    {
+      extern void _nl_log_untranslated PARAMS ((const char *logfilename,
+                                               const char *domainname,
+                                               const char *msgid1,
+                                               const char *msgid2,
+                                               int plural));
+      const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED");
+
+      if (logfilename != NULL && logfilename[0] != '\0')
+       _nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural);
+    }
+#endif
+  __set_errno (saved_errno);
+  return (plural == 0
+         ? (char *) msgid1
+         /* Use the Germanic plural rule.  */
+         : n == 1 ? (char *) msgid1 : (char *) msgid2);
+}
+
+
+char *
+internal_function
+_nl_find_msg (domain_file, domainbinding, msgid, lengthp)
+     struct loaded_l10nfile *domain_file;
+     struct binding *domainbinding;
+     const char *msgid;
+     size_t *lengthp;
+{
+  struct loaded_domain *domain;
+  nls_uint32 nstrings;
+  size_t act;
+  char *result;
+  size_t resultlen;
+
+  if (domain_file->decided == 0)
+    _nl_load_domain (domain_file, domainbinding);
+
+  if (domain_file->data == NULL)
+    return NULL;
+
+  domain = (struct loaded_domain *) domain_file->data;
+
+  nstrings = domain->nstrings;
+
+  /* Locate the MSGID and its translation.  */
+  if (domain->hash_tab != NULL)
+    {
+      /* Use the hashing table.  */
+      nls_uint32 len = strlen (msgid);
+      nls_uint32 hash_val = hash_string (msgid);
+      nls_uint32 idx = hash_val % domain->hash_size;
+      nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+
+      while (1)
+       {
+         nls_uint32 nstr =
+           W (domain->must_swap_hash_tab, domain->hash_tab[idx]);
+
+         if (nstr == 0)
+           /* Hash table entry is empty.  */
+           return NULL;
+
+         nstr--;
+
+         /* Compare msgid with the original string at index nstr.
+            We compare the lengths with >=, not ==, because plural entries
+            are represented by strings with an embedded NUL.  */
+         if (nstr < nstrings
+             ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len
+               && (strcmp (msgid,
+                           domain->data + W (domain->must_swap,
+                                             domain->orig_tab[nstr].offset))
+                   == 0)
+             : domain->orig_sysdep_tab[nstr - nstrings].length > len
+               && (strcmp (msgid,
+                           domain->orig_sysdep_tab[nstr - nstrings].pointer)
+                   == 0))
+           {
+             act = nstr;
+             goto found;
+           }
+
+         if (idx >= domain->hash_size - incr)
+           idx -= domain->hash_size - incr;
+         else
+           idx += incr;
+       }
+      /* NOTREACHED */
+    }
+  else
+    {
+      /* Try the default method:  binary search in the sorted array of
+        messages.  */
+      size_t top, bottom;
+
+      bottom = 0;
+      top = nstrings;
+      while (bottom < top)
+       {
+         int cmp_val;
+
+         act = (bottom + top) / 2;
+         cmp_val = strcmp (msgid, (domain->data
+                                   + W (domain->must_swap,
+                                        domain->orig_tab[act].offset)));
+         if (cmp_val < 0)
+           top = act;
+         else if (cmp_val > 0)
+           bottom = act + 1;
+         else
+           goto found;
+       }
+      /* No translation was found.  */
+      return NULL;
+    }
+
+ found:
+  /* The translation was found at index ACT.  If we have to convert the
+     string to use a different character set, this is the time.  */
+  if (act < nstrings)
+    {
+      result = (char *)
+       (domain->data + W (domain->must_swap, domain->trans_tab[act].offset));
+      resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
+    }
+  else
+    {
+      result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer;
+      resultlen = domain->trans_sysdep_tab[act - nstrings].length;
+    }
+
+#if defined _LIBC || HAVE_ICONV
+  if (domain->codeset_cntr
+      != (domainbinding != NULL ? domainbinding->codeset_cntr : 0))
+    {
+      /* The domain's codeset has changed through bind_textdomain_codeset()
+        since the message catalog was initialized or last accessed.  We
+        have to reinitialize the converter.  */
+      _nl_free_domain_conv (domain);
+      _nl_init_domain_conv (domain_file, domain, domainbinding);
+    }
+
+  if (
+# ifdef _LIBC
+      domain->conv != (__gconv_t) -1
+# else
+#  if HAVE_ICONV
+      domain->conv != (iconv_t) -1
+#  endif
+# endif
+      )
+    {
+      /* We are supposed to do a conversion.  First allocate an
+        appropriate table with the same structure as the table
+        of translations in the file, where we can put the pointers
+        to the converted strings in.
+        There is a slight complication with plural entries.  They
+        are represented by consecutive NUL terminated strings.  We
+        handle this case by converting RESULTLEN bytes, including
+        NULs.  */
+
+      if (domain->conv_tab == NULL
+         && ((domain->conv_tab =
+                (char **) calloc (nstrings + domain->n_sysdep_strings,
+                                  sizeof (char *)))
+             == NULL))
+       /* Mark that we didn't succeed allocating a table.  */
+       domain->conv_tab = (char **) -1;
+
+      if (__builtin_expect (domain->conv_tab == (char **) -1, 0))
+       /* Nothing we can do, no more memory.  */
+       goto converted;
+
+      if (domain->conv_tab[act] == NULL)
+       {
+         /* We haven't used this string so far, so it is not
+            translated yet.  Do this now.  */
+         /* We use a bit more efficient memory handling.
+            We allocate always larger blocks which get used over
+            time.  This is faster than many small allocations.   */
+         __libc_lock_define_initialized (static, lock)
+# define INITIAL_BLOCK_SIZE    4080
+         static unsigned char *freemem;
+         static size_t freemem_size;
+
+         const unsigned char *inbuf;
+         unsigned char *outbuf;
+         int malloc_count;
+# ifndef _LIBC
+         transmem_block_t *transmem_list = NULL;
+# endif
+
+         __libc_lock_lock (lock);
+
+         inbuf = (const unsigned char *) result;
+         outbuf = freemem + sizeof (size_t);
+
+         malloc_count = 0;
+         while (1)
+           {
+             transmem_block_t *newmem;
+# ifdef _LIBC
+             size_t non_reversible;
+             int res;
+
+             if (freemem_size < sizeof (size_t))
+               goto resize_freemem;
+
+             res = __gconv (domain->conv,
+                            &inbuf, inbuf + resultlen,
+                            &outbuf,
+                            outbuf + freemem_size - sizeof (size_t),
+                            &non_reversible);
+
+             if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT)
+               break;
+
+             if (res != __GCONV_FULL_OUTPUT)
+               {
+                 __libc_lock_unlock (lock);
+                 goto converted;
+               }
+
+             inbuf = result;
+# else
+#  if HAVE_ICONV
+             const char *inptr = (const char *) inbuf;
+             size_t inleft = resultlen;
+             char *outptr = (char *) outbuf;
+             size_t outleft;
+
+             if (freemem_size < sizeof (size_t))
+               goto resize_freemem;
+
+             outleft = freemem_size - sizeof (size_t);
+             if (iconv (domain->conv,
+                        (ICONV_CONST char **) &inptr, &inleft,
+                        &outptr, &outleft)
+                 != (size_t) (-1))
+               {
+                 outbuf = (unsigned char *) outptr;
+                 break;
+               }
+             if (errno != E2BIG)
+               {
+                 __libc_lock_unlock (lock);
+                 goto converted;
+               }
+#  endif
+# endif
+
+           resize_freemem:
+             /* We must allocate a new buffer or resize the old one.  */
+             if (malloc_count > 0)
+               {
+                 ++malloc_count;
+                 freemem_size = malloc_count * INITIAL_BLOCK_SIZE;
+                 newmem = (transmem_block_t *) realloc (transmem_list,
+                                                        freemem_size);
+# ifdef _LIBC
+                 if (newmem != NULL)
+                   transmem_list = transmem_list->next;
+                 else
+                   {
+                     struct transmem_list *old = transmem_list;
+
+                     transmem_list = transmem_list->next;
+                     free (old);
+                   }
+# endif
+               }
+             else
+               {
+                 malloc_count = 1;
+                 freemem_size = INITIAL_BLOCK_SIZE;
+                 newmem = (transmem_block_t *) malloc (freemem_size);
+               }
+             if (__builtin_expect (newmem == NULL, 0))
+               {
+                 freemem = NULL;
+                 freemem_size = 0;
+                 __libc_lock_unlock (lock);
+                 goto converted;
+               }
+
+# ifdef _LIBC
+             /* Add the block to the list of blocks we have to free
+                 at some point.  */
+             newmem->next = transmem_list;
+             transmem_list = newmem;
+
+             freemem = newmem->data;
+             freemem_size -= offsetof (struct transmem_list, data);
+# else
+             transmem_list = newmem;
+             freemem = newmem;
+# endif
+
+             outbuf = freemem + sizeof (size_t);
+           }
+
+         /* We have now in our buffer a converted string.  Put this
+            into the table of conversions.  */
+         *(size_t *) freemem = outbuf - freemem - sizeof (size_t);
+         domain->conv_tab[act] = (char *) freemem;
+         /* Shrink freemem, but keep it aligned.  */
+         freemem_size -= outbuf - freemem;
+         freemem = outbuf;
+         freemem += freemem_size & (alignof (size_t) - 1);
+         freemem_size = freemem_size & ~ (alignof (size_t) - 1);
+
+         __libc_lock_unlock (lock);
+       }
+
+      /* Now domain->conv_tab[act] contains the translation of all
+        the plural variants.  */
+      result = domain->conv_tab[act] + sizeof (size_t);
+      resultlen = *(size_t *) domain->conv_tab[act];
+    }
+
+ converted:
+  /* The result string is converted.  */
+
+#endif /* _LIBC || HAVE_ICONV */
+
+  *lengthp = resultlen;
+  return result;
+}
+
+
+/* Look up a plural variant.  */
+static char *
+internal_function
+plural_lookup (domain, n, translation, translation_len)
+     struct loaded_l10nfile *domain;
+     unsigned long int n;
+     const char *translation;
+     size_t translation_len;
+{
+  struct loaded_domain *domaindata = (struct loaded_domain *) domain->data;
+  unsigned long int index;
+  const char *p;
+
+  index = plural_eval (domaindata->plural, n);
+  if (index >= domaindata->nplurals)
+    /* This should never happen.  It means the plural expression and the
+       given maximum value do not match.  */
+    index = 0;
+
+  /* Skip INDEX strings at TRANSLATION.  */
+  p = translation;
+  while (index-- > 0)
+    {
+#ifdef _LIBC
+      p = __rawmemchr (p, '\0');
+#else
+      p = strchr (p, '\0');
+#endif
+      /* And skip over the NUL byte.  */
+      p++;
+
+      if (p >= translation + translation_len)
+       /* This should never happen.  It means the plural expression
+          evaluated to a value larger than the number of variants
+          available for MSGID1.  */
+       return (char *) translation;
+    }
+  return (char *) p;
+}
+
+#ifndef _LIBC
+/* Return string representation of locale CATEGORY.  */
+static const char *
+internal_function
+category_to_name (category)
+     int category;
+{
+  const char *retval;
+
+  switch (category)
+  {
+#ifdef LC_COLLATE
+  case LC_COLLATE:
+    retval = "LC_COLLATE";
+    break;
+#endif
+#ifdef LC_CTYPE
+  case LC_CTYPE:
+    retval = "LC_CTYPE";
+    break;
+#endif
+#ifdef LC_MONETARY
+  case LC_MONETARY:
+    retval = "LC_MONETARY";
+    break;
+#endif
+#ifdef LC_NUMERIC
+  case LC_NUMERIC:
+    retval = "LC_NUMERIC";
+    break;
+#endif
+#ifdef LC_TIME
+  case LC_TIME:
+    retval = "LC_TIME";
+    break;
+#endif
+#ifdef LC_MESSAGES
+  case LC_MESSAGES:
+    retval = "LC_MESSAGES";
+    break;
+#endif
+#ifdef LC_RESPONSE
+  case LC_RESPONSE:
+    retval = "LC_RESPONSE";
+    break;
+#endif
+#ifdef LC_ALL
+  case LC_ALL:
+    /* This might not make sense but is perhaps better than any other
+       value.  */
+    retval = "LC_ALL";
+    break;
+#endif
+  default:
+    /* If you have a better idea for a default value let me know.  */
+    retval = "LC_XXX";
+  }
+
+  return retval;
+}
+#endif
+
+/* Guess value of current locale from value of the environment variables.  */
+static const char *
+internal_function
+guess_category_value (category, categoryname)
+     int category;
+     const char *categoryname;
+{
+  const char *language;
+  const char *retval;
+
+  /* The highest priority value is the `LANGUAGE' environment
+     variable.  But we don't use the value if the currently selected
+     locale is the C locale.  This is a GNU extension.  */
+  language = getenv ("LANGUAGE");
+  if (language != NULL && language[0] == '\0')
+    language = NULL;
+
+  /* We have to proceed with the POSIX methods of looking to `LC_ALL',
+     `LC_xxx', and `LANG'.  On some systems this can be done by the
+     `setlocale' function itself.  */
+#ifdef _LIBC
+  retval = __current_locale_name (category);
+#else
+  retval = _nl_locale_name (category, categoryname);
+#endif
+
+  /* Ignore LANGUAGE if the locale is set to "C" because
+     1. "C" locale usually uses the ASCII encoding, and most international
+       messages use non-ASCII characters. These characters get displayed
+       as question marks (if using glibc's iconv()) or as invalid 8-bit
+       characters (because other iconv()s refuse to convert most non-ASCII
+       characters to ASCII). In any case, the output is ugly.
+     2. The precise output of some programs in the "C" locale is specified
+       by POSIX and should not depend on environment variables like
+       "LANGUAGE".  We allow such programs to use gettext().  */
+  return language != NULL && strcmp (retval, "C") != 0 ? language : retval;
+}
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+     char *dest;
+     const char *src;
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
+
+#if !_LIBC && !HAVE_MEMPCPY
+static void *
+mempcpy (dest, src, n)
+     void *dest;
+     const void *src;
+     size_t n;
+{
+  return (void *) ((char *) memcpy (dest, src, n) + n);
+}
+#endif
+
+
+#ifdef _LIBC
+/* If we want to free all resources we have to do some work at
+   program's end.  */
+libc_freeres_fn (free_mem)
+{
+  void *old;
+
+  while (_nl_domain_bindings != NULL)
+    {
+      struct binding *oldp = _nl_domain_bindings;
+      _nl_domain_bindings = _nl_domain_bindings->next;
+      if (oldp->dirname != INTUSE(_nl_default_dirname))
+       /* Yes, this is a pointer comparison.  */
+       free (oldp->dirname);
+      free (oldp->codeset);
+      free (oldp);
+    }
+
+  if (_nl_current_default_domain != _nl_default_default_domain)
+    /* Yes, again a pointer comparison.  */
+    free ((char *) _nl_current_default_domain);
+
+  /* Remove the search tree with the known translations.  */
+  __tdestroy (root, free);
+  root = NULL;
+
+  while (transmem_list != NULL)
+    {
+      old = transmem_list;
+      transmem_list = transmem_list->next;
+      free (old);
+    }
+}
+#endif
diff --git a/lib/intl/dcngettext.c b/lib/intl/dcngettext.c
new file mode 100644 (file)
index 0000000..3a3404e
--- /dev/null
@@ -0,0 +1,60 @@
+/* Implementation of the dcngettext(3) function.
+   Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCNGETTEXT __dcngettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCNGETTEXT libintl_dcngettext
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+char *
+DCNGETTEXT (domainname, msgid1, msgid2, n, category)
+     const char *domainname;
+     const char *msgid1;
+     const char *msgid2;
+     unsigned long int n;
+     int category;
+{
+  return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dcngettext, dcngettext);
+#endif
diff --git a/lib/intl/dgettext.c b/lib/intl/dgettext.c
new file mode 100644 (file)
index 0000000..cf5b403
--- /dev/null
@@ -0,0 +1,59 @@
+/* Implementation of the dgettext(3) function.
+   Copyright (C) 1995-1997, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <locale.h>
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DGETTEXT __dgettext
+# define DCGETTEXT INTUSE(__dcgettext)
+#else
+# define DGETTEXT libintl_dgettext
+# define DCGETTEXT libintl_dcgettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+   LC_MESSAGES locale.  */
+char *
+DGETTEXT (domainname, msgid)
+     const char *domainname;
+     const char *msgid;
+{
+  return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dgettext, dgettext);
+#endif
diff --git a/lib/intl/dngettext.c b/lib/intl/dngettext.c
new file mode 100644 (file)
index 0000000..67fd030
--- /dev/null
@@ -0,0 +1,61 @@
+/* Implementation of the dngettext(3) function.
+   Copyright (C) 1995-1997, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <locale.h>
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DNGETTEXT __dngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define DNGETTEXT libintl_dngettext
+# define DCNGETTEXT libintl_dcngettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+   LC_MESSAGES locale and skip message according to the plural form.  */
+char *
+DNGETTEXT (domainname, msgid1, msgid2, n)
+     const char *domainname;
+     const char *msgid1;
+     const char *msgid2;
+     unsigned long int n;
+{
+  return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dngettext, dngettext);
+#endif
diff --git a/lib/intl/eval-plural.h b/lib/intl/eval-plural.h
new file mode 100644 (file)
index 0000000..19c7ca6
--- /dev/null
@@ -0,0 +1,114 @@
+/* Plural expression evaluation.
+   Copyright (C) 2000-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef STATIC
+#define STATIC static
+#endif
+
+/* Evaluate the plural expression and return an index value.  */
+STATIC unsigned long int plural_eval PARAMS ((struct expression *pexp,
+                                             unsigned long int n))
+     internal_function;
+
+STATIC
+unsigned long int
+internal_function
+plural_eval (pexp, n)
+     struct expression *pexp;
+     unsigned long int n;
+{
+  switch (pexp->nargs)
+    {
+    case 0:
+      switch (pexp->operation)
+       {
+       case var:
+         return n;
+       case num:
+         return pexp->val.num;
+       default:
+         break;
+       }
+      /* NOTREACHED */
+      break;
+    case 1:
+      {
+       /* pexp->operation must be lnot.  */
+       unsigned long int arg = plural_eval (pexp->val.args[0], n);
+       return ! arg;
+      }
+    case 2:
+      {
+       unsigned long int leftarg = plural_eval (pexp->val.args[0], n);
+       if (pexp->operation == lor)
+         return leftarg || plural_eval (pexp->val.args[1], n);
+       else if (pexp->operation == land)
+         return leftarg && plural_eval (pexp->val.args[1], n);
+       else
+         {
+           unsigned long int rightarg = plural_eval (pexp->val.args[1], n);
+
+           switch (pexp->operation)
+             {
+             case mult:
+               return leftarg * rightarg;
+             case divide:
+#if !INTDIV0_RAISES_SIGFPE
+               if (rightarg == 0)
+                 raise (SIGFPE);
+#endif
+               return leftarg / rightarg;
+             case module:
+#if !INTDIV0_RAISES_SIGFPE
+               if (rightarg == 0)
+                 raise (SIGFPE);
+#endif
+               return leftarg % rightarg;
+             case plus:
+               return leftarg + rightarg;
+             case minus:
+               return leftarg - rightarg;
+             case less_than:
+               return leftarg < rightarg;
+             case greater_than:
+               return leftarg > rightarg;
+             case less_or_equal:
+               return leftarg <= rightarg;
+             case greater_or_equal:
+               return leftarg >= rightarg;
+             case equal:
+               return leftarg == rightarg;
+             case not_equal:
+               return leftarg != rightarg;
+             default:
+               break;
+             }
+         }
+       /* NOTREACHED */
+       break;
+      }
+    case 3:
+      {
+       /* pexp->operation must be qmop.  */
+       unsigned long int boolarg = plural_eval (pexp->val.args[0], n);
+       return plural_eval (pexp->val.args[boolarg ? 1 : 2], n);
+      }
+    }
+  /* NOTREACHED */
+  return 0;
+}
diff --git a/lib/intl/explodename.c b/lib/intl/explodename.c
new file mode 100644 (file)
index 0000000..2985064
--- /dev/null
@@ -0,0 +1,192 @@
+/* Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+char *
+_nl_find_language (name)
+     const char *name;
+{
+  while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
+        && name[0] != '+' && name[0] != ',')
+    ++name;
+
+  return (char *) name;
+}
+
+
+int
+_nl_explode_name (name, language, modifier, territory, codeset,
+                 normalized_codeset, special, sponsor, revision)
+     char *name;
+     const char **language;
+     const char **modifier;
+     const char **territory;
+     const char **codeset;
+     const char **normalized_codeset;
+     const char **special;
+     const char **sponsor;
+     const char **revision;
+{
+  enum { undecided, xpg, cen } syntax;
+  char *cp;
+  int mask;
+
+  *modifier = NULL;
+  *territory = NULL;
+  *codeset = NULL;
+  *normalized_codeset = NULL;
+  *special = NULL;
+  *sponsor = NULL;
+  *revision = NULL;
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_' and `@' if
+     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
+  mask = 0;
+  syntax = undecided;
+  *language = cp = name;
+  cp = _nl_find_language (*language);
+
+  if (*language == cp)
+    /* This does not make sense: language has to be specified.  Use
+       this entry as it is without exploding.  Perhaps it is an alias.  */
+    cp = strchr (*language, '\0');
+  else if (cp[0] == '_')
+    {
+      /* Next is the territory.  */
+      cp[0] = '\0';
+      *territory = ++cp;
+
+      while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
+            && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
+       ++cp;
+
+      mask |= TERRITORY;
+
+      if (cp[0] == '.')
+       {
+         /* Next is the codeset.  */
+         syntax = xpg;
+         cp[0] = '\0';
+         *codeset = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != '@')
+           ++cp;
+
+         mask |= XPG_CODESET;
+
+         if (*codeset != cp && (*codeset)[0] != '\0')
+           {
+             *normalized_codeset = _nl_normalize_codeset (*codeset,
+                                                          cp - *codeset);
+             if (strcmp (*codeset, *normalized_codeset) == 0)
+               free ((char *) *normalized_codeset);
+             else
+               mask |= XPG_NORM_CODESET;
+           }
+       }
+    }
+
+  if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
+    {
+      /* Next is the modifier.  */
+      syntax = cp[0] == '@' ? xpg : cen;
+      cp[0] = '\0';
+      *modifier = ++cp;
+
+      while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
+            && cp[0] != ',' && cp[0] != '_')
+       ++cp;
+
+      mask |= XPG_MODIFIER | CEN_AUDIENCE;
+    }
+
+  if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
+    {
+      syntax = cen;
+
+      if (cp[0] == '+')
+       {
+         /* Next is special application (CEN syntax).  */
+         cp[0] = '\0';
+         *special = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
+           ++cp;
+
+         mask |= CEN_SPECIAL;
+       }
+
+      if (cp[0] == ',')
+       {
+         /* Next is sponsor (CEN syntax).  */
+         cp[0] = '\0';
+         *sponsor = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != '_')
+           ++cp;
+
+         mask |= CEN_SPONSOR;
+       }
+
+      if (cp[0] == '_')
+       {
+         /* Next is revision (CEN syntax).  */
+         cp[0] = '\0';
+         *revision = ++cp;
+
+         mask |= CEN_REVISION;
+       }
+    }
+
+  /* For CEN syntax values it might be important to have the
+     separator character in the file name, not for XPG syntax.  */
+  if (syntax == xpg)
+    {
+      if (*territory != NULL && (*territory)[0] == '\0')
+       mask &= ~TERRITORY;
+
+      if (*codeset != NULL && (*codeset)[0] == '\0')
+       mask &= ~XPG_CODESET;
+
+      if (*modifier != NULL && (*modifier)[0] == '\0')
+       mask &= ~XPG_MODIFIER;
+    }
+
+  return mask;
+}
diff --git a/lib/intl/finddomain.c b/lib/intl/finddomain.c
new file mode 100644 (file)
index 0000000..d242764
--- /dev/null
@@ -0,0 +1,195 @@
+/* Handle list of needed message catalogs
+   Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@gnu.org>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+/* List of already loaded domains.  */
+static struct loaded_l10nfile *_nl_loaded_domains;
+
+
+/* Return a data structure describing the message catalog described by
+   the DOMAINNAME and CATEGORY parameters with respect to the currently
+   established bindings.  */
+struct loaded_l10nfile *
+internal_function
+_nl_find_domain (dirname, locale, domainname, domainbinding)
+     const char *dirname;
+     char *locale;
+     const char *domainname;
+     struct binding *domainbinding;
+{
+  struct loaded_l10nfile *retval;
+  const char *language;
+  const char *modifier;
+  const char *territory;
+  const char *codeset;
+  const char *normalized_codeset;
+  const char *special;
+  const char *sponsor;
+  const char *revision;
+  const char *alias_value;
+  int mask;
+
+  /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+
+               language[_territory[.codeset]][@modifier]
+
+     and six parts for the CEN syntax:
+
+       language[_territory][+audience][+special][,[sponsor][_revision]]
+
+     Beside the first part all of them are allowed to be missing.  If
+     the full specified locale is not found, the less specific one are
+     looked for.  The various parts will be stripped off according to
+     the following order:
+               (1) revision
+               (2) sponsor
+               (3) special
+               (4) codeset
+               (5) normalized codeset
+               (6) territory
+               (7) audience/modifier
+   */
+
+  /* If we have already tested for this locale entry there has to
+     be one data set in the list of loaded domains.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+                              strlen (dirname) + 1, 0, locale, NULL, NULL,
+                              NULL, NULL, NULL, NULL, NULL, domainname, 0);
+  if (retval != NULL)
+    {
+      /* We know something about this locale.  */
+      int cnt;
+
+      if (retval->decided == 0)
+       _nl_load_domain (retval, domainbinding);
+
+      if (retval->data != NULL)
+       return retval;
+
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+       {
+         if (retval->successor[cnt]->decided == 0)
+           _nl_load_domain (retval->successor[cnt], domainbinding);
+
+         if (retval->successor[cnt]->data != NULL)
+           break;
+       }
+      return cnt >= 0 ? retval : NULL;
+      /* NOTREACHED */
+    }
+
+  /* See whether the locale value is an alias.  If yes its value
+     *overwrites* the alias name.  No test for the original value is
+     done.  */
+  alias_value = _nl_expand_alias (locale);
+  if (alias_value != NULL)
+    {
+#if defined _LIBC || defined HAVE_STRDUP
+      locale = strdup (alias_value);
+      if (locale == NULL)
+       return NULL;
+#else
+      size_t len = strlen (alias_value) + 1;
+      locale = (char *) malloc (len);
+      if (locale == NULL)
+       return NULL;
+
+      memcpy (locale, alias_value, len);
+#endif
+    }
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_' and `@' if
+     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
+  mask = _nl_explode_name (locale, &language, &modifier, &territory,
+                          &codeset, &normalized_codeset, &special,
+                          &sponsor, &revision);
+
+  /* Create all possible locale entries which might be interested in
+     generalization.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+                              strlen (dirname) + 1, mask, language, territory,
+                              codeset, normalized_codeset, modifier, special,
+                              sponsor, revision, domainname, 1);
+  if (retval == NULL)
+    /* This means we are out of core.  */
+    return NULL;
+
+  if (retval->decided == 0)
+    _nl_load_domain (retval, domainbinding);
+  if (retval->data == NULL)
+    {
+      int cnt;
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+       {
+         if (retval->successor[cnt]->decided == 0)
+           _nl_load_domain (retval->successor[cnt], domainbinding);
+         if (retval->successor[cnt]->data != NULL)
+           break;
+       }
+    }
+
+  /* The room for an alias was dynamically allocated.  Free it now.  */
+  if (alias_value != NULL)
+    free (locale);
+
+  /* The space for normalized_codeset is dynamically allocated.  Free it.  */
+  if (mask & XPG_NORM_CODESET)
+    free ((void *) normalized_codeset);
+
+  return retval;
+}
+
+
+#ifdef _LIBC
+libc_freeres_fn (free_mem)
+{
+  struct loaded_l10nfile *runp = _nl_loaded_domains;
+
+  while (runp != NULL)
+    {
+      struct loaded_l10nfile *here = runp;
+      if (runp->data != NULL)
+       _nl_unload_domain ((struct loaded_domain *) runp->data);
+      runp = runp->next;
+      free ((char *) here->filename);
+      free (here);
+    }
+}
+#endif
diff --git a/lib/intl/gettext.c b/lib/intl/gettext.c
new file mode 100644 (file)
index 0000000..43d689f
--- /dev/null
@@ -0,0 +1,64 @@
+/* Implementation of gettext(3) function.
+   Copyright (C) 1995, 1997, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h>           /* Just for NULL.  */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define GETTEXT __gettext
+# define DCGETTEXT INTUSE(__dcgettext)
+#else
+# define GETTEXT libintl_gettext
+# define DCGETTEXT libintl_dcgettext
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+char *
+GETTEXT (msgid)
+     const char *msgid;
+{
+  return DCGETTEXT (NULL, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__gettext, gettext);
+#endif
diff --git a/lib/intl/gettextP.h b/lib/intl/gettextP.h
new file mode 100644 (file)
index 0000000..f1748a3
--- /dev/null
@@ -0,0 +1,224 @@
+/* Header describing internals of libintl library.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _GETTEXTP_H
+#define _GETTEXTP_H
+
+#include <stddef.h>            /* Get size_t.  */
+
+#ifdef _LIBC
+# include "../iconv/gconv_int.h"
+#else
+# if HAVE_ICONV
+#  include <iconv.h>
+# endif
+#endif
+
+#include "loadinfo.h"
+
+#include "gmo.h"               /* Get nls_uint32.  */
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES
+#  define PARAMS(args) args
+# else
+#  define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+   almost always true or almost always false.  */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#ifndef W
+# define W(flag, data) ((flag) ? SWAP (data) : (data))
+#endif
+
+
+#ifdef _LIBC
+# include <byteswap.h>
+# define SWAP(i) bswap_32 (i)
+#else
+static inline nls_uint32
+SWAP (i)
+     nls_uint32 i;
+{
+  return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+#endif
+
+
+/* In-memory representation of system dependent string.  */
+struct sysdep_string_desc
+{
+  /* Length of addressed string, including the trailing NUL.  */
+  size_t length;
+  /* Pointer to addressed string.  */
+  const char *pointer;
+};
+
+/* The representation of an opened message catalog.  */
+struct loaded_domain
+{
+  /* Pointer to memory containing the .mo file.  */
+  const char *data;
+  /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed.  */
+  int use_mmap;
+  /* Size of mmap()ed memory.  */
+  size_t mmap_size;
+  /* 1 if the .mo file uses a different endianness than this machine.  */
+  int must_swap;
+  /* Pointer to additional malloc()ed memory.  */
+  void *malloced;
+
+  /* Number of static strings pairs.  */
+  nls_uint32 nstrings;
+  /* Pointer to descriptors of original strings in the file.  */
+  const struct string_desc *orig_tab;
+  /* Pointer to descriptors of translated strings in the file.  */
+  const struct string_desc *trans_tab;
+
+  /* Number of system dependent strings pairs.  */
+  nls_uint32 n_sysdep_strings;
+  /* Pointer to descriptors of original sysdep strings.  */
+  const struct sysdep_string_desc *orig_sysdep_tab;
+  /* Pointer to descriptors of translated sysdep strings.  */
+  const struct sysdep_string_desc *trans_sysdep_tab;
+
+  /* Size of hash table.  */
+  nls_uint32 hash_size;
+  /* Pointer to hash table.  */
+  const nls_uint32 *hash_tab;
+  /* 1 if the hash table uses a different endianness than this machine.  */
+  int must_swap_hash_tab;
+
+  int codeset_cntr;
+#ifdef _LIBC
+  __gconv_t conv;
+#else
+# if HAVE_ICONV
+  iconv_t conv;
+# endif
+#endif
+  char **conv_tab;
+
+  struct expression *plural;
+  unsigned long int nplurals;
+};
+
+/* We want to allocate a string at the end of the struct.  But ISO C
+   doesn't allow zero sized arrays.  */
+#ifdef __GNUC__
+# define ZERO 0
+#else
+# define ZERO 1
+#endif
+
+/* A set of settings bound to a message domain.  Used to store settings
+   from bindtextdomain() and bind_textdomain_codeset().  */
+struct binding
+{
+  struct binding *next;
+  char *dirname;
+  int codeset_cntr;    /* Incremented each time codeset changes.  */
+  char *codeset;
+  char domainname[ZERO];
+};
+
+/* A counter which is incremented each time some previous translations
+   become invalid.
+   This variable is part of the external ABI of the GNU libintl.  */
+extern int _nl_msg_cat_cntr;
+
+#ifndef _LIBC
+const char *_nl_locale_name PARAMS ((int category, const char *categoryname));
+#endif
+
+struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
+                                                char *__locale,
+                                                const char *__domainname,
+                                             struct binding *__domainbinding))
+     internal_function;
+void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain,
+                             struct binding *__domainbinding))
+     internal_function;
+void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
+     internal_function;
+const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_file,
+                                         struct loaded_domain *__domain,
+                                         struct binding *__domainbinding))
+     internal_function;
+void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain))
+     internal_function;
+
+char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file,
+                           struct binding *domainbinding,
+                           const char *msgid, size_t *lengthp))
+     internal_function;
+
+#ifdef _LIBC
+extern char *__gettext PARAMS ((const char *__msgid));
+extern char *__dgettext PARAMS ((const char *__domainname,
+                                const char *__msgid));
+extern char *__dcgettext PARAMS ((const char *__domainname,
+                                 const char *__msgid, int __category));
+extern char *__ngettext PARAMS ((const char *__msgid1, const char *__msgid2,
+                                unsigned long int __n));
+extern char *__dngettext PARAMS ((const char *__domainname,
+                                 const char *__msgid1, const char *__msgid2,
+                                 unsigned long int n));
+extern char *__dcngettext PARAMS ((const char *__domainname,
+                                  const char *__msgid1, const char *__msgid2,
+                                  unsigned long int __n, int __category));
+extern char *__dcigettext PARAMS ((const char *__domainname,
+                                  const char *__msgid1, const char *__msgid2,
+                                  int __plural, unsigned long int __n,
+                                  int __category));
+extern char *__textdomain PARAMS ((const char *__domainname));
+extern char *__bindtextdomain PARAMS ((const char *__domainname,
+                                      const char *__dirname));
+extern char *__bind_textdomain_codeset PARAMS ((const char *__domainname,
+                                               const char *__codeset));
+#else
+/* Declare the exported libintl_* functions, in a way that allows us to
+   call them under their real name.  */
+# define _INTL_REDIRECT_MACROS
+# include "libgnuintl.h"
+extern char *libintl_dcigettext PARAMS ((const char *__domainname,
+                                        const char *__msgid1,
+                                        const char *__msgid2,
+                                        int __plural, unsigned long int __n,
+                                        int __category));
+#endif
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettextP.h  */
diff --git a/lib/intl/gmo.h b/lib/intl/gmo.h
new file mode 100644 (file)
index 0000000..d1fe4d6
--- /dev/null
@@ -0,0 +1,148 @@
+/* Description of GNU message catalog format: general file layout.
+   Copyright (C) 1995, 1997, 2000-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _GETTEXT_H
+#define _GETTEXT_H 1
+
+#include <limits.h>
+
+/* @@ end of prolog @@ */
+
+/* The magic number of the GNU message catalog format.  */
+#define _MAGIC 0x950412de
+#define _MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format.  */
+#define MO_REVISION_NUMBER 0
+
+/* The following contortions are an attempt to use the C preprocessor
+   to determine an unsigned integral type that is 32 bits wide.  An
+   alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+   as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
+   when cross-compiling.  */
+
+#if __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+   This should be valid for all systems GNU cares about because
+   that doesn't include 16-bit systems, and only modern systems
+   (that certainly have <limits.h>) have 64+-bit integral types.  */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+typedef unsigned nls_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+typedef unsigned short nls_uint32;
+# else
+#  if ULONG_MAX == UINT_MAX_32_BITS
+typedef unsigned long nls_uint32;
+#  else
+  /* The following line is intended to throw an error.  Using #error is
+     not portable enough.  */
+  "Cannot determine unsigned 32-bit data type."
+#  endif
+# endif
+#endif
+
+
+/* Header for binary .mo file format.  */
+struct mo_file_header
+{
+  /* The magic number.  */
+  nls_uint32 magic;
+  /* The revision number of the file format.  */
+  nls_uint32 revision;
+
+  /* The following are only used in .mo files with major revision 0.  */
+
+  /* The number of strings pairs.  */
+  nls_uint32 nstrings;
+  /* Offset of table with start offsets of original strings.  */
+  nls_uint32 orig_tab_offset;
+  /* Offset of table with start offsets of translated strings.  */
+  nls_uint32 trans_tab_offset;
+  /* Size of hash table.  */
+  nls_uint32 hash_tab_size;
+  /* Offset of first hash table entry.  */
+  nls_uint32 hash_tab_offset;
+
+  /* The following are only used in .mo files with minor revision >= 1.  */
+
+  /* The number of system dependent segments.  */
+  nls_uint32 n_sysdep_segments;
+  /* Offset of table describing system dependent segments.  */
+  nls_uint32 sysdep_segments_offset;
+  /* The number of system dependent strings pairs.  */
+  nls_uint32 n_sysdep_strings;
+  /* Offset of table with start offsets of original sysdep strings.  */
+  nls_uint32 orig_sysdep_tab_offset;
+  /* Offset of table with start offsets of translated sysdep strings.  */
+  nls_uint32 trans_sysdep_tab_offset;
+};
+
+/* Descriptor for static string contained in the binary .mo file.  */
+struct string_desc
+{
+  /* Length of addressed string, not including the trailing NUL.  */
+  nls_uint32 length;
+  /* Offset of string in file.  */
+  nls_uint32 offset;
+};
+
+/* The following are only used in .mo files with minor revision >= 1.  */
+
+/* Descriptor for system dependent string segment.  */
+struct sysdep_segment
+{
+  /* Length of addressed string, including the trailing NUL.  */
+  nls_uint32 length;
+  /* Offset of string in file.  */
+  nls_uint32 offset;
+};
+
+/* Descriptor for system dependent string.  */
+struct sysdep_string
+{
+  /* Offset of static string segments in file.  */
+  nls_uint32 offset;
+  /* Alternating sequence of static and system dependent segments.
+     The last segment is a static segment, including the trailing NUL.  */
+  struct segment_pair
+  {
+    /* Size of static segment.  */
+    nls_uint32 segsize;
+    /* Reference to system dependent string segment, or ~0 at the end.  */
+    nls_uint32 sysdepref;
+  } segments[1];
+};
+
+/* Marker for the end of the segments[] array.  This has the value 0xFFFFFFFF,
+   regardless whether 'int' is 16 bit, 32 bit, or 64 bit.  */
+#define SEGMENTS_END ((nls_uint32) ~0)
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettext.h  */
diff --git a/lib/intl/hash-string.h b/lib/intl/hash-string.h
new file mode 100644 (file)
index 0000000..b267a87
--- /dev/null
@@ -0,0 +1,59 @@
+/* Description of GNU message catalog format: string hashing function.
+   Copyright (C) 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES
+#  define PARAMS(Args) Args
+# else
+#  define PARAMS(Args) ()
+# endif
+#endif
+
+/* We assume to have `unsigned long int' value with at least 32 bits.  */
+#define HASHWORDBITS 32
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+   1986, 1987 Bell Telephone Laboratories, Inc.]  */
+static unsigned long int hash_string PARAMS ((const char *__str_param));
+
+static inline unsigned long int
+hash_string (str_param)
+     const char *str_param;
+{
+  unsigned long int hval, g;
+  const char *str = str_param;
+
+  /* Compute the hash value for the given string.  */
+  hval = 0;
+  while (*str != '\0')
+    {
+      hval <<= 4;
+      hval += (unsigned long int) *str++;
+      g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+      if (g != 0)
+       {
+         hval ^= g >> (HASHWORDBITS - 8);
+         hval ^= g;
+       }
+    }
+  return hval;
+}
diff --git a/lib/intl/intl-compat.c b/lib/intl/intl-compat.c
new file mode 100644 (file)
index 0000000..36b7af0
--- /dev/null
@@ -0,0 +1,151 @@
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+   Library.
+   Copyright (C) 1995, 2000-2003 Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+/* This file redirects the gettext functions (without prefix) to those
+   defined in the included GNU libintl library (with "libintl_" prefix).
+   It is compiled into libintl in order to make the AM_GNU_GETTEXT test
+   of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which
+   has the redirections primarily in the <libintl.h> include file.
+   It is also compiled into libgnuintl so that libgnuintl.so can be used
+   as LD_PRELOADable library on glibc systems, to provide the extra
+   features that the functions in the libc don't have (namely, logging).  */
+
+
+#undef gettext
+#undef dgettext
+#undef dcgettext
+#undef ngettext
+#undef dngettext
+#undef dcngettext
+#undef textdomain
+#undef bindtextdomain
+#undef bind_textdomain_codeset
+
+
+/* When building a DLL, we must export some functions.  Note that because
+   the functions are only defined for binary backward compatibility, we
+   don't need to use __declspec(dllimport) in any case.  */
+#if defined _MSC_VER && BUILDING_DLL
+# define DLL_EXPORTED __declspec(dllexport)
+#else
+# define DLL_EXPORTED
+#endif
+
+
+DLL_EXPORTED
+char *
+gettext (msgid)
+     const char *msgid;
+{
+  return libintl_gettext (msgid);
+}
+
+
+DLL_EXPORTED
+char *
+dgettext (domainname, msgid)
+     const char *domainname;
+     const char *msgid;
+{
+  return libintl_dgettext (domainname, msgid);
+}
+
+
+DLL_EXPORTED
+char *
+dcgettext (domainname, msgid, category)
+     const char *domainname;
+     const char *msgid;
+     int category;
+{
+  return libintl_dcgettext (domainname, msgid, category);
+}
+
+
+DLL_EXPORTED
+char *
+ngettext (msgid1, msgid2, n)
+     const char *msgid1;
+     const char *msgid2;
+     unsigned long int n;
+{
+  return libintl_ngettext (msgid1, msgid2, n);
+}
+
+
+DLL_EXPORTED
+char *
+dngettext (domainname, msgid1, msgid2, n)
+     const char *domainname;
+     const char *msgid1;
+     const char *msgid2;
+     unsigned long int n;
+{
+  return libintl_dngettext (domainname, msgid1, msgid2, n);
+}
+
+
+DLL_EXPORTED
+char *
+dcngettext (domainname, msgid1, msgid2, n, category)
+     const char *domainname;
+     const char *msgid1;
+     const char *msgid2;
+     unsigned long int n;
+     int category;
+{
+  return libintl_dcngettext (domainname, msgid1, msgid2, n, category);
+}
+
+
+DLL_EXPORTED
+char *
+textdomain (domainname)
+     const char *domainname;
+{
+  return libintl_textdomain (domainname);
+}
+
+
+DLL_EXPORTED
+char *
+bindtextdomain (domainname, dirname)
+     const char *domainname;
+     const char *dirname;
+{
+  return libintl_bindtextdomain (domainname, dirname);
+}
+
+
+DLL_EXPORTED
+char *
+bind_textdomain_codeset (domainname, codeset)
+     const char *domainname;
+     const char *codeset;
+{
+  return libintl_bind_textdomain_codeset (domainname, codeset);
+}
diff --git a/lib/intl/l10nflist.c b/lib/intl/l10nflist.c
new file mode 100644 (file)
index 0000000..ec8713f
--- /dev/null
@@ -0,0 +1,453 @@
+/* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for stpcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE   1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# ifndef stpcpy
+#  define stpcpy(dest, src) __stpcpy(dest, src)
+# endif
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
+                        it may be concatenated to a directory pathname.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+#endif
+
+/* Define function which are usually not available.  */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
+/* Returns the number of strings in ARGZ.  */
+static size_t argz_count__ PARAMS ((const char *argz, size_t len));
+
+static size_t
+argz_count__ (argz, len)
+     const char *argz;
+     size_t len;
+{
+  size_t count = 0;
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len + 1;
+      len -= part_len + 1;
+      count++;
+    }
+  return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#else
+# ifdef _LIBC
+#  define __argz_count(argz, len) INTUSE(__argz_count) (argz, len)
+# endif
+#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+   except the last into the character SEP.  */
+static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
+
+static void
+argz_stringify__ (argz, len, sep)
+     char *argz;
+     size_t len;
+     int sep;
+{
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len;
+      len -= part_len + 1;
+      if (len > 0)
+       *argz++ = sep;
+    }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#else
+# ifdef _LIBC
+#  define __argz_stringify(argz, len, sep) \
+  INTUSE(__argz_stringify) (argz, len, sep)
+# endif
+#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
+static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
+                                 const char *entry));
+
+static char *
+argz_next__ (argz, argz_len, entry)
+     char *argz;
+     size_t argz_len;
+     const char *entry;
+{
+  if (entry)
+    {
+      if (entry < argz + argz_len)
+        entry = strchr (entry, '\0') + 1;
+
+      return entry >= argz + argz_len ? NULL : (char *) entry;
+    }
+  else
+    if (argz_len > 0)
+      return argz;
+    else
+      return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
+
+
+/* Return number of bits set in X.  */
+static int pop PARAMS ((int x));
+
+static inline int
+pop (x)
+     int x;
+{
+  /* We assume that no more than 16 bits are used.  */
+  x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+  x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+  x = ((x >> 4) + x) & 0x0f0f;
+  x = ((x >> 8) + x) & 0xff;
+
+  return x;
+}
+
+\f
+struct loaded_l10nfile *
+_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
+                   territory, codeset, normalized_codeset, modifier, special,
+                   sponsor, revision, filename, do_allocate)
+     struct loaded_l10nfile **l10nfile_list;
+     const char *dirlist;
+     size_t dirlist_len;
+     int mask;
+     const char *language;
+     const char *territory;
+     const char *codeset;
+     const char *normalized_codeset;
+     const char *modifier;
+     const char *special;
+     const char *sponsor;
+     const char *revision;
+     const char *filename;
+     int do_allocate;
+{
+  char *abs_filename;
+  struct loaded_l10nfile **lastp;
+  struct loaded_l10nfile *retval;
+  char *cp;
+  size_t dirlist_count;
+  size_t entries;
+  int cnt;
+
+  /* If LANGUAGE contains an absolute directory specification, we ignore
+     DIRLIST.  */
+  if (IS_ABSOLUTE_PATH (language))
+    dirlist_len = 0;
+
+  /* Allocate room for the full file name.  */
+  abs_filename = (char *) malloc (dirlist_len
+                                 + strlen (language)
+                                 + ((mask & TERRITORY) != 0
+                                    ? strlen (territory) + 1 : 0)
+                                 + ((mask & XPG_CODESET) != 0
+                                    ? strlen (codeset) + 1 : 0)
+                                 + ((mask & XPG_NORM_CODESET) != 0
+                                    ? strlen (normalized_codeset) + 1 : 0)
+                                 + (((mask & XPG_MODIFIER) != 0
+                                     || (mask & CEN_AUDIENCE) != 0)
+                                    ? strlen (modifier) + 1 : 0)
+                                 + ((mask & CEN_SPECIAL) != 0
+                                    ? strlen (special) + 1 : 0)
+                                 + (((mask & CEN_SPONSOR) != 0
+                                     || (mask & CEN_REVISION) != 0)
+                                    ? (1 + ((mask & CEN_SPONSOR) != 0
+                                            ? strlen (sponsor) : 0)
+                                       + ((mask & CEN_REVISION) != 0
+                                          ? strlen (revision) + 1 : 0)) : 0)
+                                 + 1 + strlen (filename) + 1);
+
+  if (abs_filename == NULL)
+    return NULL;
+
+  /* Construct file name.  */
+  cp = abs_filename;
+  if (dirlist_len > 0)
+    {
+      memcpy (cp, dirlist, dirlist_len);
+      __argz_stringify (cp, dirlist_len, PATH_SEPARATOR);
+      cp += dirlist_len;
+      cp[-1] = '/';
+    }
+
+  cp = stpcpy (cp, language);
+
+  if ((mask & TERRITORY) != 0)
+    {
+      *cp++ = '_';
+      cp = stpcpy (cp, territory);
+    }
+  if ((mask & XPG_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, codeset);
+    }
+  if ((mask & XPG_NORM_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, normalized_codeset);
+    }
+  if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
+    {
+      /* This component can be part of both syntaces but has different
+        leading characters.  For CEN we use `+', else `@'.  */
+      *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+      cp = stpcpy (cp, modifier);
+    }
+  if ((mask & CEN_SPECIAL) != 0)
+    {
+      *cp++ = '+';
+      cp = stpcpy (cp, special);
+    }
+  if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
+    {
+      *cp++ = ',';
+      if ((mask & CEN_SPONSOR) != 0)
+       cp = stpcpy (cp, sponsor);
+      if ((mask & CEN_REVISION) != 0)
+       {
+         *cp++ = '_';
+         cp = stpcpy (cp, revision);
+       }
+    }
+
+  *cp++ = '/';
+  stpcpy (cp, filename);
+
+  /* Look in list of already loaded domains whether it is already
+     available.  */
+  lastp = l10nfile_list;
+  for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+    if (retval->filename != NULL)
+      {
+       int compare = strcmp (retval->filename, abs_filename);
+       if (compare == 0)
+         /* We found it!  */
+         break;
+       if (compare < 0)
+         {
+           /* It's not in the list.  */
+           retval = NULL;
+           break;
+         }
+
+       lastp = &retval->next;
+      }
+
+  if (retval != NULL || do_allocate == 0)
+    {
+      free (abs_filename);
+      return retval;
+    }
+
+  dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1);
+
+  /* Allocate a new loaded_l10nfile.  */
+  retval =
+    (struct loaded_l10nfile *)
+    malloc (sizeof (*retval)
+           + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0))
+              * sizeof (struct loaded_l10nfile *)));
+  if (retval == NULL)
+    return NULL;
+
+  retval->filename = abs_filename;
+
+  /* We set retval->data to NULL here; it is filled in later.
+     Setting retval->decided to 1 here means that retval does not
+     correspond to a real file (dirlist_count > 1) or is not worth
+     looking up (if an unnormalized codeset was specified).  */
+  retval->decided = (dirlist_count > 1
+                    || ((mask & XPG_CODESET) != 0
+                        && (mask & XPG_NORM_CODESET) != 0));
+  retval->data = NULL;
+
+  retval->next = *lastp;
+  *lastp = retval;
+
+  entries = 0;
+  /* Recurse to fill the inheritance list of RETVAL.
+     If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL
+     entry does not correspond to a real file; retval->filename contains
+     colons.  In this case we loop across all elements of DIRLIST and
+     across all bit patterns dominated by MASK.
+     If the DIRLIST is a single directory or entirely redundant (i.e.
+     DIRLIST_COUNT == 1), we loop across all bit patterns dominated by
+     MASK, excluding MASK itself.
+     In either case, we loop down from MASK to 0.  This has the effect
+     that the extra bits in the locale name are dropped in this order:
+     first the modifier, then the territory, then the codeset, then the
+     normalized_codeset.  */
+  for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt)
+    if ((cnt & ~mask) == 0
+       && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
+       && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
+      {
+       if (dirlist_count > 1)
+         {
+           /* Iterate over all elements of the DIRLIST.  */
+           char *dir = NULL;
+
+           while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+                  != NULL)
+             retval->successor[entries++]
+               = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1,
+                                     cnt, language, territory, codeset,
+                                     normalized_codeset, modifier, special,
+                                     sponsor, revision, filename, 1);
+         }
+       else
+         retval->successor[entries++]
+           = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,
+                                 cnt, language, territory, codeset,
+                                 normalized_codeset, modifier, special,
+                                 sponsor, revision, filename, 1);
+      }
+  retval->successor[entries] = NULL;
+
+  return retval;
+}
+\f
+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  The return value is dynamically allocated and has to be
+   freed by the caller.  */
+const char *
+_nl_normalize_codeset (codeset, name_len)
+     const char *codeset;
+     size_t name_len;
+{
+  int len = 0;
+  int only_digit = 1;
+  char *retval;
+  char *wp;
+  size_t cnt;
+
+  for (cnt = 0; cnt < name_len; ++cnt)
+    if (isalnum ((unsigned char) codeset[cnt]))
+      {
+       ++len;
+
+       if (isalpha ((unsigned char) codeset[cnt]))
+         only_digit = 0;
+      }
+
+  retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+  if (retval != NULL)
+    {
+      if (only_digit)
+       wp = stpcpy (retval, "iso");
+      else
+       wp = retval;
+
+      for (cnt = 0; cnt < name_len; ++cnt)
+       if (isalpha ((unsigned char) codeset[cnt]))
+         *wp++ = tolower ((unsigned char) codeset[cnt]);
+       else if (isdigit ((unsigned char) codeset[cnt]))
+         *wp++ = codeset[cnt];
+
+      *wp = '\0';
+    }
+
+  return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+     char *dest;
+     const char *src;
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
diff --git a/lib/intl/libgnuintl.h.in b/lib/intl/libgnuintl.h.in
new file mode 100644 (file)
index 0000000..f596cfc
--- /dev/null
@@ -0,0 +1,309 @@
+/* Message catalogs for internationalization.
+   Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _LIBINTL_H
+#define _LIBINTL_H     1
+
+#include <locale.h>
+
+/* The LC_MESSAGES locale category is the category used by the functions
+   gettext() and dgettext().  It is specified in POSIX, but not in ANSI C.
+   On systems that don't define it, use an arbitrary value instead.
+   On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5)
+   then includes <libintl.h> (i.e. this file!) and then only defines
+   LC_MESSAGES.  To avoid a redefinition warning, don't define LC_MESSAGES
+   in this case.  */
+#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
+# define LC_MESSAGES 1729
+#endif
+
+/* We define an additional symbol to signal that we use the GNU
+   implementation of gettext.  */
+#define __USE_GNU_GETTEXT 1
+
+/* Provide information about the supported file formats.  Returns the
+   maximum minor revision number supported for a given major revision.  */
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \
+  ((major) == 0 ? 1 : -1)
+
+/* Resolve a platform specific conflict on DJGPP.  GNU gettext takes
+   precedence over _conio_gettext.  */
+#ifdef __DJGPP__
+# undef gettext
+#endif
+
+/* Use _INTL_PARAMS, not PARAMS, in order to avoid clashes with identifiers
+   used by programs.  Similarly, test __PROTOTYPES, not PROTOTYPES.  */
+#ifndef _INTL_PARAMS
+# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES
+#  define _INTL_PARAMS(args) args
+# else
+#  define _INTL_PARAMS(args) ()
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* We redirect the functions to those prefixed with "libintl_".  This is
+   necessary, because some systems define gettext/textdomain/... in the C
+   library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer).
+   If we used the unprefixed names, there would be cases where the
+   definition in the C library would override the one in the libintl.so
+   shared library.  Recall that on ELF systems, the symbols are looked
+   up in the following order:
+     1. in the executable,
+     2. in the shared libraries specified on the link command line, in order,
+     3. in the dependencies of the shared libraries specified on the link
+        command line,
+     4. in the dlopen()ed shared libraries, in the order in which they were
+        dlopen()ed.
+   The definition in the C library would override the one in libintl.so if
+   either
+     * -lc is given on the link command line and -lintl isn't, or
+     * -lc is given on the link command line before -lintl, or
+     * libintl.so is a dependency of a dlopen()ed shared library but not
+       linked to the executable at link time.
+   Since Solaris gettext() behaves differently than GNU gettext(), this
+   would be unacceptable.
+
+   The redirection happens by default through macros in C, so that &gettext
+   is independent of the compilation unit, but through inline functions in
+   C++, in order not to interfere with the name mangling of class fields or
+   class methods called 'gettext'.  */
+
+/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS.
+   If he doesn't, we choose the method.  A third possible method is
+   _INTL_REDIRECT_ASM, supported only by GCC.  */
+#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS)
+# if __GNUC__ >= 2 && !defined __APPLE_CC__ && (defined __STDC__ || defined __cplusplus)
+#  define _INTL_REDIRECT_ASM
+# else
+#  ifdef __cplusplus
+#   define _INTL_REDIRECT_INLINE
+#  else
+#   define _INTL_REDIRECT_MACROS
+#  endif
+# endif
+#endif
+/* Auxiliary macros.  */
+#ifdef _INTL_REDIRECT_ASM
+# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname))
+# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring
+# define _INTL_STRINGIFY(prefix) #prefix
+#else
+# define _INTL_ASM(cname)
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_gettext (const char *__msgid);
+static inline char *gettext (const char *__msgid)
+{
+  return libintl_gettext (__msgid);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define gettext libintl_gettext
+#endif
+extern char *gettext _INTL_PARAMS ((const char *__msgid))
+       _INTL_ASM (libintl_gettext);
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+   LC_MESSAGES locale.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dgettext (const char *__domainname, const char *__msgid);
+static inline char *dgettext (const char *__domainname, const char *__msgid)
+{
+  return libintl_dgettext (__domainname, __msgid);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dgettext libintl_dgettext
+#endif
+extern char *dgettext _INTL_PARAMS ((const char *__domainname,
+                                    const char *__msgid))
+       _INTL_ASM (libintl_dgettext);
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
+                               int __category);
+static inline char *dcgettext (const char *__domainname, const char *__msgid,
+                              int __category)
+{
+  return libintl_dcgettext (__domainname, __msgid, __category);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dcgettext libintl_dcgettext
+#endif
+extern char *dcgettext _INTL_PARAMS ((const char *__domainname,
+                                     const char *__msgid,
+                                     int __category))
+       _INTL_ASM (libintl_dcgettext);
+#endif
+
+
+/* Similar to `gettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
+                              unsigned long int __n);
+static inline char *ngettext (const char *__msgid1, const char *__msgid2,
+                             unsigned long int __n)
+{
+  return libintl_ngettext (__msgid1, __msgid2, __n);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define ngettext libintl_ngettext
+#endif
+extern char *ngettext _INTL_PARAMS ((const char *__msgid1,
+                                    const char *__msgid2,
+                                    unsigned long int __n))
+       _INTL_ASM (libintl_ngettext);
+#endif
+
+/* Similar to `dgettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
+                               const char *__msgid2, unsigned long int __n);
+static inline char *dngettext (const char *__domainname, const char *__msgid1,
+                              const char *__msgid2, unsigned long int __n)
+{
+  return libintl_dngettext (__domainname, __msgid1, __msgid2, __n);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dngettext libintl_dngettext
+#endif
+extern char *dngettext _INTL_PARAMS ((const char *__domainname,
+                                     const char *__msgid1,
+                                     const char *__msgid2,
+                                     unsigned long int __n))
+       _INTL_ASM (libintl_dngettext);
+#endif
+
+/* Similar to `dcgettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dcngettext (const char *__domainname,
+                                const char *__msgid1, const char *__msgid2,
+                                unsigned long int __n, int __category);
+static inline char *dcngettext (const char *__domainname,
+                               const char *__msgid1, const char *__msgid2,
+                               unsigned long int __n, int __category)
+{
+  return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dcngettext libintl_dcngettext
+#endif
+extern char *dcngettext _INTL_PARAMS ((const char *__domainname,
+                                      const char *__msgid1,
+                                      const char *__msgid2,
+                                      unsigned long int __n,
+                                      int __category))
+       _INTL_ASM (libintl_dcngettext);
+#endif
+
+
+/* Set the current default message catalog to DOMAINNAME.
+   If DOMAINNAME is null, return the current default.
+   If DOMAINNAME is "", reset to the default of "messages".  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_textdomain (const char *__domainname);
+static inline char *textdomain (const char *__domainname)
+{
+  return libintl_textdomain (__domainname);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define textdomain libintl_textdomain
+#endif
+extern char *textdomain _INTL_PARAMS ((const char *__domainname))
+       _INTL_ASM (libintl_textdomain);
+#endif
+
+/* Specify that the DOMAINNAME message catalog will be found
+   in DIRNAME rather than in the system locale data base.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_bindtextdomain (const char *__domainname,
+                                    const char *__dirname);
+static inline char *bindtextdomain (const char *__domainname,
+                                   const char *__dirname)
+{
+  return libintl_bindtextdomain (__domainname, __dirname);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define bindtextdomain libintl_bindtextdomain
+#endif
+extern char *bindtextdomain _INTL_PARAMS ((const char *__domainname,
+                                          const char *__dirname))
+       _INTL_ASM (libintl_bindtextdomain);
+#endif
+
+/* Specify the character encoding in which the messages from the
+   DOMAINNAME message catalog will be returned.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_bind_textdomain_codeset (const char *__domainname,
+                                             const char *__codeset);
+static inline char *bind_textdomain_codeset (const char *__domainname,
+                                            const char *__codeset)
+{
+  return libintl_bind_textdomain_codeset (__domainname, __codeset);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define bind_textdomain_codeset libintl_bind_textdomain_codeset
+#endif
+extern char *bind_textdomain_codeset _INTL_PARAMS ((const char *__domainname,
+                                                   const char *__codeset))
+       _INTL_ASM (libintl_bind_textdomain_codeset);
+#endif
+
+
+/* Support for relocatable packages.  */
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+#define libintl_set_relocation_prefix libintl_set_relocation_prefix
+extern void
+       libintl_set_relocation_prefix _INTL_PARAMS ((const char *orig_prefix,
+                                                   const char *curr_prefix));
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* libintl.h */
diff --git a/lib/intl/loadinfo.h b/lib/intl/loadinfo.h
new file mode 100644 (file)
index 0000000..1d3ba61
--- /dev/null
@@ -0,0 +1,156 @@
+/* Copyright (C) 1996-1999, 2000-2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _LOADINFO_H
+#define _LOADINFO_H    1
+
+/* Declarations of locale dependent catalog lookup functions.
+   Implemented in
+
+     localealias.c    Possibly replace a locale name by another.
+     explodename.c    Split a locale name into its various fields.
+     l10nflist.c      Generate a list of filenames of possible message catalogs.
+     finddomain.c     Find and open the relevant message catalogs.
+
+   The main function _nl_find_domain() in finddomain.c is declared
+   in gettextP.h.
+ */
+
+#ifndef PARAMS
+# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES
+#  define PARAMS(args) args
+# else
+#  define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+   almost always true or almost always false.  */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+/* Separator in PATH like lists of pathnames.  */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+  /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* Encoding of locale name parts.  */
+#define CEN_REVISION           1
+#define CEN_SPONSOR            2
+#define CEN_SPECIAL            4
+#define XPG_NORM_CODESET       8
+#define XPG_CODESET            16
+#define TERRITORY              32
+#define CEN_AUDIENCE           64
+#define XPG_MODIFIER           128
+
+#define CEN_SPECIFIC   (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
+#define XPG_SPECIFIC   (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
+
+
+struct loaded_l10nfile
+{
+  const char *filename;
+  int decided;
+
+  const void *data;
+
+  struct loaded_l10nfile *next;
+  struct loaded_l10nfile *successor[1];
+};
+
+
+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  The return value is dynamically allocated and has to be
+   freed by the caller.  */
+extern const char *_nl_normalize_codeset PARAMS ((const char *codeset,
+                                                 size_t name_len));
+
+/* Lookup a locale dependent file.
+   *L10NFILE_LIST denotes a pool of lookup results of locale dependent
+   files of the same kind, sorted in decreasing order of ->filename.
+   DIRLIST and DIRLIST_LEN are an argz list of directories in which to
+   look, containing at least one directory (i.e. DIRLIST_LEN > 0).
+   MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER,
+   SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as
+   produced by _nl_explode_name().  FILENAME is the filename suffix.
+   The return value is the lookup result, either found in *L10NFILE_LIST,
+   or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL.
+   If the return value is non-NULL, it is added to *L10NFILE_LIST, and
+   its ->next field denotes the chaining inside *L10NFILE_LIST, and
+   furthermore its ->successor[] field contains a list of other lookup
+   results from which this lookup result inherits.  */
+extern struct loaded_l10nfile *
+_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
+                           const char *dirlist, size_t dirlist_len, int mask,
+                           const char *language, const char *territory,
+                           const char *codeset,
+                           const char *normalized_codeset,
+                           const char *modifier, const char *special,
+                           const char *sponsor, const char *revision,
+                           const char *filename, int do_allocate));
+
+/* Lookup the real locale name for a locale alias NAME, or NULL if
+   NAME is not a locale alias (but possibly a real locale name).
+   The return value is statically allocated and must not be freed.  */
+extern const char *_nl_expand_alias PARAMS ((const char *name));
+
+/* Split a locale name NAME into its pieces: language, modifier,
+   territory, codeset, special, sponsor, revision.
+   NAME gets destructively modified: NUL bytes are inserted here and
+   there.  *LANGUAGE gets assigned NAME.  Each of *MODIFIER, *TERRITORY,
+   *CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a
+   pointer into the old NAME string, or NULL.  *NORMALIZED_CODESET
+   gets assigned the expanded *CODESET, if it is different from *CODESET;
+   this one is dynamically allocated and has to be freed by the caller.
+   The return value is a bitmask, where each bit corresponds to one
+   filled-in value:
+     XPG_MODIFIER, CEN_AUDIENCE  for *MODIFIER,
+     TERRITORY                   for *TERRITORY,
+     XPG_CODESET                 for *CODESET,
+     XPG_NORM_CODESET            for *NORMALIZED_CODESET,
+     CEN_SPECIAL                 for *SPECIAL,
+     CEN_SPONSOR                 for *SPONSOR,
+     CEN_REVISION                for *REVISION.
+ */
+extern int _nl_explode_name PARAMS ((char *name, const char **language,
+                                    const char **modifier,
+                                    const char **territory,
+                                    const char **codeset,
+                                    const char **normalized_codeset,
+                                    const char **special,
+                                    const char **sponsor,
+                                    const char **revision));
+
+/* Split a locale name NAME into a leading language part and all the
+   rest.  Return a pointer to the first character after the language,
+   i.e. to the first byte of the rest.  */
+extern char *_nl_find_language PARAMS ((const char *name));
+
+#endif /* loadinfo.h */
diff --git a/lib/intl/loadmsgcat.c b/lib/intl/loadmsgcat.c
new file mode 100644 (file)
index 0000000..8509bd3
--- /dev/null
@@ -0,0 +1,1322 @@
+/* Load needed message catalogs.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef __GNUC__
+# undef  alloca
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#ifdef _LIBC
+# include <langinfo.h>
+# include <locale.h>
+#endif
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+    || (defined _LIBC && defined _POSIX_MAPPED_FILES)
+# include <sys/mman.h>
+# undef HAVE_MMAP
+# define HAVE_MMAP     1
+#else
+# undef HAVE_MMAP
+#endif
+
+#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC
+# include <stdint.h>
+#endif
+#if defined HAVE_INTTYPES_H || defined _LIBC
+# include <inttypes.h>
+#endif
+
+#include "gmo.h"
+#include "gettextP.h"
+#include "hash-string.h"
+#include "plural-exp.h"
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+#endif
+
+/* Provide fallback values for macros that ought to be defined in <inttypes.h>.
+   Note that our fallback values need not be literal strings, because we don't
+   use them with preprocessor string concatenation.  */
+#if !defined PRId8 || PRI_MACROS_BROKEN
+# undef PRId8
+# define PRId8 "d"
+#endif
+#if !defined PRIi8 || PRI_MACROS_BROKEN
+# undef PRIi8
+# define PRIi8 "i"
+#endif
+#if !defined PRIo8 || PRI_MACROS_BROKEN
+# undef PRIo8
+# define PRIo8 "o"
+#endif
+#if !defined PRIu8 || PRI_MACROS_BROKEN
+# undef PRIu8
+# define PRIu8 "u"
+#endif
+#if !defined PRIx8 || PRI_MACROS_BROKEN
+# undef PRIx8
+# define PRIx8 "x"
+#endif
+#if !defined PRIX8 || PRI_MACROS_BROKEN
+# undef PRIX8
+# define PRIX8 "X"
+#endif
+#if !defined PRId16 || PRI_MACROS_BROKEN
+# undef PRId16
+# define PRId16 "d"
+#endif
+#if !defined PRIi16 || PRI_MACROS_BROKEN
+# undef PRIi16
+# define PRIi16 "i"
+#endif
+#if !defined PRIo16 || PRI_MACROS_BROKEN
+# undef PRIo16
+# define PRIo16 "o"
+#endif
+#if !defined PRIu16 || PRI_MACROS_BROKEN
+# undef PRIu16
+# define PRIu16 "u"
+#endif
+#if !defined PRIx16 || PRI_MACROS_BROKEN
+# undef PRIx16
+# define PRIx16 "x"
+#endif
+#if !defined PRIX16 || PRI_MACROS_BROKEN
+# undef PRIX16
+# define PRIX16 "X"
+#endif
+#if !defined PRId32 || PRI_MACROS_BROKEN
+# undef PRId32
+# define PRId32 "d"
+#endif
+#if !defined PRIi32 || PRI_MACROS_BROKEN
+# undef PRIi32
+# define PRIi32 "i"
+#endif
+#if !defined PRIo32 || PRI_MACROS_BROKEN
+# undef PRIo32
+# define PRIo32 "o"
+#endif
+#if !defined PRIu32 || PRI_MACROS_BROKEN
+# undef PRIu32
+# define PRIu32 "u"
+#endif
+#if !defined PRIx32 || PRI_MACROS_BROKEN
+# undef PRIx32
+# define PRIx32 "x"
+#endif
+#if !defined PRIX32 || PRI_MACROS_BROKEN
+# undef PRIX32
+# define PRIX32 "X"
+#endif
+#if !defined PRId64 || PRI_MACROS_BROKEN
+# undef PRId64
+# define PRId64 (sizeof (long) == 8 ? "ld" : "lld")
+#endif
+#if !defined PRIi64 || PRI_MACROS_BROKEN
+# undef PRIi64
+# define PRIi64 (sizeof (long) == 8 ? "li" : "lli")
+#endif
+#if !defined PRIo64 || PRI_MACROS_BROKEN
+# undef PRIo64
+# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo")
+#endif
+#if !defined PRIu64 || PRI_MACROS_BROKEN
+# undef PRIu64
+# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu")
+#endif
+#if !defined PRIx64 || PRI_MACROS_BROKEN
+# undef PRIx64
+# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx")
+#endif
+#if !defined PRIX64 || PRI_MACROS_BROKEN
+# undef PRIX64
+# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX")
+#endif
+#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN
+# undef PRIdLEAST8
+# define PRIdLEAST8 "d"
+#endif
+#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN
+# undef PRIiLEAST8
+# define PRIiLEAST8 "i"
+#endif
+#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN
+# undef PRIoLEAST8
+# define PRIoLEAST8 "o"
+#endif
+#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN
+# undef PRIuLEAST8
+# define PRIuLEAST8 "u"
+#endif
+#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN
+# undef PRIxLEAST8
+# define PRIxLEAST8 "x"
+#endif
+#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN
+# undef PRIXLEAST8
+# define PRIXLEAST8 "X"
+#endif
+#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN
+# undef PRIdLEAST16
+# define PRIdLEAST16 "d"
+#endif
+#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN
+# undef PRIiLEAST16
+# define PRIiLEAST16 "i"
+#endif
+#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN
+# undef PRIoLEAST16
+# define PRIoLEAST16 "o"
+#endif
+#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN
+# undef PRIuLEAST16
+# define PRIuLEAST16 "u"
+#endif
+#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN
+# undef PRIxLEAST16
+# define PRIxLEAST16 "x"
+#endif
+#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN
+# undef PRIXLEAST16
+# define PRIXLEAST16 "X"
+#endif
+#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN
+# undef PRIdLEAST32
+# define PRIdLEAST32 "d"
+#endif
+#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN
+# undef PRIiLEAST32
+# define PRIiLEAST32 "i"
+#endif
+#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN
+# undef PRIoLEAST32
+# define PRIoLEAST32 "o"
+#endif
+#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN
+# undef PRIuLEAST32
+# define PRIuLEAST32 "u"
+#endif
+#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN
+# undef PRIxLEAST32
+# define PRIxLEAST32 "x"
+#endif
+#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN
+# undef PRIXLEAST32
+# define PRIXLEAST32 "X"
+#endif
+#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN
+# undef PRIdLEAST64
+# define PRIdLEAST64 PRId64
+#endif
+#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN
+# undef PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+#endif
+#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN
+# undef PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+#endif
+#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN
+# undef PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+#endif
+#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN
+# undef PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+#endif
+#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN
+# undef PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+#endif
+#if !defined PRIdFAST8 || PRI_MACROS_BROKEN
+# undef PRIdFAST8
+# define PRIdFAST8 "d"
+#endif
+#if !defined PRIiFAST8 || PRI_MACROS_BROKEN
+# undef PRIiFAST8
+# define PRIiFAST8 "i"
+#endif
+#if !defined PRIoFAST8 || PRI_MACROS_BROKEN
+# undef PRIoFAST8
+# define PRIoFAST8 "o"
+#endif
+#if !defined PRIuFAST8 || PRI_MACROS_BROKEN
+# undef PRIuFAST8
+# define PRIuFAST8 "u"
+#endif
+#if !defined PRIxFAST8 || PRI_MACROS_BROKEN
+# undef PRIxFAST8
+# define PRIxFAST8 "x"
+#endif
+#if !defined PRIXFAST8 || PRI_MACROS_BROKEN
+# undef PRIXFAST8
+# define PRIXFAST8 "X"
+#endif
+#if !defined PRIdFAST16 || PRI_MACROS_BROKEN
+# undef PRIdFAST16
+# define PRIdFAST16 "d"
+#endif
+#if !defined PRIiFAST16 || PRI_MACROS_BROKEN
+# undef PRIiFAST16
+# define PRIiFAST16 "i"
+#endif
+#if !defined PRIoFAST16 || PRI_MACROS_BROKEN
+# undef PRIoFAST16
+# define PRIoFAST16 "o"
+#endif
+#if !defined PRIuFAST16 || PRI_MACROS_BROKEN
+# undef PRIuFAST16
+# define PRIuFAST16 "u"
+#endif
+#if !defined PRIxFAST16 || PRI_MACROS_BROKEN
+# undef PRIxFAST16
+# define PRIxFAST16 "x"
+#endif
+#if !defined PRIXFAST16 || PRI_MACROS_BROKEN
+# undef PRIXFAST16
+# define PRIXFAST16 "X"
+#endif
+#if !defined PRIdFAST32 || PRI_MACROS_BROKEN
+# undef PRIdFAST32
+# define PRIdFAST32 "d"
+#endif
+#if !defined PRIiFAST32 || PRI_MACROS_BROKEN
+# undef PRIiFAST32
+# define PRIiFAST32 "i"
+#endif
+#if !defined PRIoFAST32 || PRI_MACROS_BROKEN
+# undef PRIoFAST32
+# define PRIoFAST32 "o"
+#endif
+#if !defined PRIuFAST32 || PRI_MACROS_BROKEN
+# undef PRIuFAST32
+# define PRIuFAST32 "u"
+#endif
+#if !defined PRIxFAST32 || PRI_MACROS_BROKEN
+# undef PRIxFAST32
+# define PRIxFAST32 "x"
+#endif
+#if !defined PRIXFAST32 || PRI_MACROS_BROKEN
+# undef PRIXFAST32
+# define PRIXFAST32 "X"
+#endif
+#if !defined PRIdFAST64 || PRI_MACROS_BROKEN
+# undef PRIdFAST64
+# define PRIdFAST64 PRId64
+#endif
+#if !defined PRIiFAST64 || PRI_MACROS_BROKEN
+# undef PRIiFAST64
+# define PRIiFAST64 PRIi64
+#endif
+#if !defined PRIoFAST64 || PRI_MACROS_BROKEN
+# undef PRIoFAST64
+# define PRIoFAST64 PRIo64
+#endif
+#if !defined PRIuFAST64 || PRI_MACROS_BROKEN
+# undef PRIuFAST64
+# define PRIuFAST64 PRIu64
+#endif
+#if !defined PRIxFAST64 || PRI_MACROS_BROKEN
+# undef PRIxFAST64
+# define PRIxFAST64 PRIx64
+#endif
+#if !defined PRIXFAST64 || PRI_MACROS_BROKEN
+# undef PRIXFAST64
+# define PRIXFAST64 PRIX64
+#endif
+#if !defined PRIdMAX || PRI_MACROS_BROKEN
+# undef PRIdMAX
+# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld")
+#endif
+#if !defined PRIiMAX || PRI_MACROS_BROKEN
+# undef PRIiMAX
+# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli")
+#endif
+#if !defined PRIoMAX || PRI_MACROS_BROKEN
+# undef PRIoMAX
+# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo")
+#endif
+#if !defined PRIuMAX || PRI_MACROS_BROKEN
+# undef PRIuMAX
+# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu")
+#endif
+#if !defined PRIxMAX || PRI_MACROS_BROKEN
+# undef PRIxMAX
+# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx")
+#endif
+#if !defined PRIXMAX || PRI_MACROS_BROKEN
+# undef PRIXMAX
+# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX")
+#endif
+#if !defined PRIdPTR || PRI_MACROS_BROKEN
+# undef PRIdPTR
+# define PRIdPTR \
+  (sizeof (void *) == sizeof (long) ? "ld" : \
+   sizeof (void *) == sizeof (int) ? "d" : \
+   "lld")
+#endif
+#if !defined PRIiPTR || PRI_MACROS_BROKEN
+# undef PRIiPTR
+# define PRIiPTR \
+  (sizeof (void *) == sizeof (long) ? "li" : \
+   sizeof (void *) == sizeof (int) ? "i" : \
+   "lli")
+#endif
+#if !defined PRIoPTR || PRI_MACROS_BROKEN
+# undef PRIoPTR
+# define PRIoPTR \
+  (sizeof (void *) == sizeof (long) ? "lo" : \
+   sizeof (void *) == sizeof (int) ? "o" : \
+   "llo")
+#endif
+#if !defined PRIuPTR || PRI_MACROS_BROKEN
+# undef PRIuPTR
+# define PRIuPTR \
+  (sizeof (void *) == sizeof (long) ? "lu" : \
+   sizeof (void *) == sizeof (int) ? "u" : \
+   "llu")
+#endif
+#if !defined PRIxPTR || PRI_MACROS_BROKEN
+# undef PRIxPTR
+# define PRIxPTR \
+  (sizeof (void *) == sizeof (long) ? "lx" : \
+   sizeof (void *) == sizeof (int) ? "x" : \
+   "llx")
+#endif
+#if !defined PRIXPTR || PRI_MACROS_BROKEN
+# undef PRIXPTR
+# define PRIXPTR \
+  (sizeof (void *) == sizeof (long) ? "lX" : \
+   sizeof (void *) == sizeof (int) ? "X" : \
+   "llX")
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ISO C functions.  This is required by the standard
+   because some ISO C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define open   __open
+# define close  __close
+# define read   __read
+# define mmap   __mmap
+# define munmap __munmap
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+   O_BINARY is usually declared in <fcntl.h>. */
+#if !defined O_BINARY && defined _O_BINARY
+  /* For MSC-compatible compilers.  */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+#ifdef __BEOS__
+  /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect.  */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+/* On reasonable systems, binary I/O is the default.  */
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+
+/* Prototypes for local functions.  Needed to ensure compiler checking of
+   function argument counts despite of K&R C function definition syntax.  */
+static const char *get_sysdep_segment_value PARAMS ((const char *name));
+
+
+/* We need a sign, whether a new catalog was loaded, which can be associated
+   with all translations.  This is important if the translations are
+   cached by one of GCC's features.  */
+int _nl_msg_cat_cntr;
+
+
+/* Expand a system dependent string segment.  Return NULL if unsupported.  */
+static const char *
+get_sysdep_segment_value (name)
+     const char *name;
+{
+  /* Test for an ISO C 99 section 7.8.1 format string directive.
+     Syntax:
+     P R I { d | i | o | u | x | X }
+     { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR }  */
+  /* We don't use a table of 14 times 6 'const char *' strings here, because
+     data relocations cost startup time.  */
+  if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I')
+    {
+      if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u'
+         || name[3] == 'x' || name[3] == 'X')
+       {
+         if (name[4] == '8' && name[5] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRId8;
+             if (name[3] == 'i')
+               return PRIi8;
+             if (name[3] == 'o')
+               return PRIo8;
+             if (name[3] == 'u')
+               return PRIu8;
+             if (name[3] == 'x')
+               return PRIx8;
+             if (name[3] == 'X')
+               return PRIX8;
+             abort ();
+           }
+         if (name[4] == '1' && name[5] == '6' && name[6] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRId16;
+             if (name[3] == 'i')
+               return PRIi16;
+             if (name[3] == 'o')
+               return PRIo16;
+             if (name[3] == 'u')
+               return PRIu16;
+             if (name[3] == 'x')
+               return PRIx16;
+             if (name[3] == 'X')
+               return PRIX16;
+             abort ();
+           }
+         if (name[4] == '3' && name[5] == '2' && name[6] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRId32;
+             if (name[3] == 'i')
+               return PRIi32;
+             if (name[3] == 'o')
+               return PRIo32;
+             if (name[3] == 'u')
+               return PRIu32;
+             if (name[3] == 'x')
+               return PRIx32;
+             if (name[3] == 'X')
+               return PRIX32;
+             abort ();
+           }
+         if (name[4] == '6' && name[5] == '4' && name[6] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRId64;
+             if (name[3] == 'i')
+               return PRIi64;
+             if (name[3] == 'o')
+               return PRIo64;
+             if (name[3] == 'u')
+               return PRIu64;
+             if (name[3] == 'x')
+               return PRIx64;
+             if (name[3] == 'X')
+               return PRIX64;
+             abort ();
+           }
+         if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A'
+             && name[7] == 'S' && name[8] == 'T')
+           {
+             if (name[9] == '8' && name[10] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdLEAST8;
+                 if (name[3] == 'i')
+                   return PRIiLEAST8;
+                 if (name[3] == 'o')
+                   return PRIoLEAST8;
+                 if (name[3] == 'u')
+                   return PRIuLEAST8;
+                 if (name[3] == 'x')
+                   return PRIxLEAST8;
+                 if (name[3] == 'X')
+                   return PRIXLEAST8;
+                 abort ();
+               }
+             if (name[9] == '1' && name[10] == '6' && name[11] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdLEAST16;
+                 if (name[3] == 'i')
+                   return PRIiLEAST16;
+                 if (name[3] == 'o')
+                   return PRIoLEAST16;
+                 if (name[3] == 'u')
+                   return PRIuLEAST16;
+                 if (name[3] == 'x')
+                   return PRIxLEAST16;
+                 if (name[3] == 'X')
+                   return PRIXLEAST16;
+                 abort ();
+               }
+             if (name[9] == '3' && name[10] == '2' && name[11] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdLEAST32;
+                 if (name[3] == 'i')
+                   return PRIiLEAST32;
+                 if (name[3] == 'o')
+                   return PRIoLEAST32;
+                 if (name[3] == 'u')
+                   return PRIuLEAST32;
+                 if (name[3] == 'x')
+                   return PRIxLEAST32;
+                 if (name[3] == 'X')
+                   return PRIXLEAST32;
+                 abort ();
+               }
+             if (name[9] == '6' && name[10] == '4' && name[11] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdLEAST64;
+                 if (name[3] == 'i')
+                   return PRIiLEAST64;
+                 if (name[3] == 'o')
+                   return PRIoLEAST64;
+                 if (name[3] == 'u')
+                   return PRIuLEAST64;
+                 if (name[3] == 'x')
+                   return PRIxLEAST64;
+                 if (name[3] == 'X')
+                   return PRIXLEAST64;
+                 abort ();
+               }
+           }
+         if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S'
+             && name[7] == 'T')
+           {
+             if (name[8] == '8' && name[9] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdFAST8;
+                 if (name[3] == 'i')
+                   return PRIiFAST8;
+                 if (name[3] == 'o')
+                   return PRIoFAST8;
+                 if (name[3] == 'u')
+                   return PRIuFAST8;
+                 if (name[3] == 'x')
+                   return PRIxFAST8;
+                 if (name[3] == 'X')
+                   return PRIXFAST8;
+                 abort ();
+               }
+             if (name[8] == '1' && name[9] == '6' && name[10] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdFAST16;
+                 if (name[3] == 'i')
+                   return PRIiFAST16;
+                 if (name[3] == 'o')
+                   return PRIoFAST16;
+                 if (name[3] == 'u')
+                   return PRIuFAST16;
+                 if (name[3] == 'x')
+                   return PRIxFAST16;
+                 if (name[3] == 'X')
+                   return PRIXFAST16;
+                 abort ();
+               }
+             if (name[8] == '3' && name[9] == '2' && name[10] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdFAST32;
+                 if (name[3] == 'i')
+                   return PRIiFAST32;
+                 if (name[3] == 'o')
+                   return PRIoFAST32;
+                 if (name[3] == 'u')
+                   return PRIuFAST32;
+                 if (name[3] == 'x')
+                   return PRIxFAST32;
+                 if (name[3] == 'X')
+                   return PRIXFAST32;
+                 abort ();
+               }
+             if (name[8] == '6' && name[9] == '4' && name[10] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdFAST64;
+                 if (name[3] == 'i')
+                   return PRIiFAST64;
+                 if (name[3] == 'o')
+                   return PRIoFAST64;
+                 if (name[3] == 'u')
+                   return PRIuFAST64;
+                 if (name[3] == 'x')
+                   return PRIxFAST64;
+                 if (name[3] == 'X')
+                   return PRIXFAST64;
+                 abort ();
+               }
+           }
+         if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X'
+             && name[7] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRIdMAX;
+             if (name[3] == 'i')
+               return PRIiMAX;
+             if (name[3] == 'o')
+               return PRIoMAX;
+             if (name[3] == 'u')
+               return PRIuMAX;
+             if (name[3] == 'x')
+               return PRIxMAX;
+             if (name[3] == 'X')
+               return PRIXMAX;
+             abort ();
+           }
+         if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R'
+             && name[7] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRIdPTR;
+             if (name[3] == 'i')
+               return PRIiPTR;
+             if (name[3] == 'o')
+               return PRIoPTR;
+             if (name[3] == 'u')
+               return PRIuPTR;
+             if (name[3] == 'x')
+               return PRIxPTR;
+             if (name[3] == 'X')
+               return PRIXPTR;
+             abort ();
+           }
+       }
+    }
+  /* Other system dependent strings are not valid.  */
+  return NULL;
+}
+
+/* Initialize the codeset dependent parts of an opened message catalog.
+   Return the header entry.  */
+const char *
+internal_function
+_nl_init_domain_conv (domain_file, domain, domainbinding)
+     struct loaded_l10nfile *domain_file;
+     struct loaded_domain *domain;
+     struct binding *domainbinding;
+{
+  /* Find out about the character set the file is encoded with.
+     This can be found (in textual form) in the entry "".  If this
+     entry does not exist or if this does not contain the `charset='
+     information, we will assume the charset matches the one the
+     current locale and we don't have to perform any conversion.  */
+  char *nullentry;
+  size_t nullentrylen;
+
+  /* Preinitialize fields, to avoid recursion during _nl_find_msg.  */
+  domain->codeset_cntr =
+    (domainbinding != NULL ? domainbinding->codeset_cntr : 0);
+#ifdef _LIBC
+  domain->conv = (__gconv_t) -1;
+#else
+# if HAVE_ICONV
+  domain->conv = (iconv_t) -1;
+# endif
+#endif
+  domain->conv_tab = NULL;
+
+  /* Get the header entry.  */
+  nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen);
+
+  if (nullentry != NULL)
+    {
+#if defined _LIBC || HAVE_ICONV
+      const char *charsetstr;
+
+      charsetstr = strstr (nullentry, "charset=");
+      if (charsetstr != NULL)
+       {
+         size_t len;
+         char *charset;
+         const char *outcharset;
+
+         charsetstr += strlen ("charset=");
+         len = strcspn (charsetstr, " \t\n");
+
+         charset = (char *) alloca (len + 1);
+# if defined _LIBC || HAVE_MEMPCPY
+         *((char *) mempcpy (charset, charsetstr, len)) = '\0';
+# else
+         memcpy (charset, charsetstr, len);
+         charset[len] = '\0';
+# endif
+
+         /* The output charset should normally be determined by the
+            locale.  But sometimes the locale is not used or not correctly
+            set up, so we provide a possibility for the user to override
+            this.  Moreover, the value specified through
+            bind_textdomain_codeset overrides both.  */
+         if (domainbinding != NULL && domainbinding->codeset != NULL)
+           outcharset = domainbinding->codeset;
+         else
+           {
+             outcharset = getenv ("OUTPUT_CHARSET");
+             if (outcharset == NULL || outcharset[0] == '\0')
+               {
+# ifdef _LIBC
+                 outcharset = _NL_CURRENT (LC_CTYPE, CODESET);
+# else
+#  if HAVE_ICONV
+                 extern const char *locale_charset PARAMS ((void));
+                 outcharset = locale_charset ();
+#  endif
+# endif
+               }
+           }
+
+# ifdef _LIBC
+         /* We always want to use transliteration.  */
+         outcharset = norm_add_slashes (outcharset, "TRANSLIT");
+         charset = norm_add_slashes (charset, NULL);
+         if (__gconv_open (outcharset, charset, &domain->conv,
+                           GCONV_AVOID_NOCONV)
+             != __GCONV_OK)
+           domain->conv = (__gconv_t) -1;
+# else
+#  if HAVE_ICONV
+         /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+            we want to use transliteration.  */
+#   if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \
+       || _LIBICONV_VERSION >= 0x0105
+         if (strchr (outcharset, '/') == NULL)
+           {
+             char *tmp;
+
+             len = strlen (outcharset);
+             tmp = (char *) alloca (len + 10 + 1);
+             memcpy (tmp, outcharset, len);
+             memcpy (tmp + len, "//TRANSLIT", 10 + 1);
+             outcharset = tmp;
+
+             domain->conv = iconv_open (outcharset, charset);
+
+             freea (outcharset);
+           }
+         else
+#   endif
+           domain->conv = iconv_open (outcharset, charset);
+#  endif
+# endif
+
+         freea (charset);
+       }
+#endif /* _LIBC || HAVE_ICONV */
+    }
+
+  return nullentry;
+}
+
+/* Frees the codeset dependent parts of an opened message catalog.  */
+void
+internal_function
+_nl_free_domain_conv (domain)
+     struct loaded_domain *domain;
+{
+  if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1)
+    free (domain->conv_tab);
+
+#ifdef _LIBC
+  if (domain->conv != (__gconv_t) -1)
+    __gconv_close (domain->conv);
+#else
+# if HAVE_ICONV
+  if (domain->conv != (iconv_t) -1)
+    iconv_close (domain->conv);
+# endif
+#endif
+}
+
+/* Load the message catalogs specified by FILENAME.  If it is no valid
+   message catalog do nothing.  */
+void
+internal_function
+_nl_load_domain (domain_file, domainbinding)
+     struct loaded_l10nfile *domain_file;
+     struct binding *domainbinding;
+{
+  int fd;
+  size_t size;
+#ifdef _LIBC
+  struct stat64 st;
+#else
+  struct stat st;
+#endif
+  struct mo_file_header *data = (struct mo_file_header *) -1;
+  int use_mmap = 0;
+  struct loaded_domain *domain;
+  int revision;
+  const char *nullentry;
+
+  domain_file->decided = 1;
+  domain_file->data = NULL;
+
+  /* Note that it would be useless to store domainbinding in domain_file
+     because domainbinding might be == NULL now but != NULL later (after
+     a call to bind_textdomain_codeset).  */
+
+  /* If the record does not represent a valid locale the FILENAME
+     might be NULL.  This can happen when according to the given
+     specification the locale file name is different for XPG and CEN
+     syntax.  */
+  if (domain_file->filename == NULL)
+    return;
+
+  /* Try to open the addressed file.  */
+  fd = open (domain_file->filename, O_RDONLY | O_BINARY);
+  if (fd == -1)
+    return;
+
+  /* We must know about the size of the file.  */
+  if (
+#ifdef _LIBC
+      __builtin_expect (fstat64 (fd, &st) != 0, 0)
+#else
+      __builtin_expect (fstat (fd, &st) != 0, 0)
+#endif
+      || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
+      || __builtin_expect (size < sizeof (struct mo_file_header), 0))
+    {
+      /* Something went wrong.  */
+      close (fd);
+      return;
+    }
+
+#ifdef HAVE_MMAP
+  /* Now we are ready to load the file.  If mmap() is available we try
+     this first.  If not available or it failed we try to load it.  */
+  data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+                                        MAP_PRIVATE, fd, 0);
+
+  if (__builtin_expect (data != (struct mo_file_header *) -1, 1))
+    {
+      /* mmap() call was successful.  */
+      close (fd);
+      use_mmap = 1;
+    }
+#endif
+
+  /* If the data is not yet available (i.e. mmap'ed) we try to load
+     it manually.  */
+  if (data == (struct mo_file_header *) -1)
+    {
+      size_t to_read;
+      char *read_ptr;
+
+      data = (struct mo_file_header *) malloc (size);
+      if (data == NULL)
+       return;
+
+      to_read = size;
+      read_ptr = (char *) data;
+      do
+       {
+         long int nb = (long int) read (fd, read_ptr, to_read);
+         if (nb <= 0)
+           {
+#ifdef EINTR
+             if (nb == -1 && errno == EINTR)
+               continue;
+#endif
+             close (fd);
+             return;
+           }
+         read_ptr += nb;
+         to_read -= nb;
+       }
+      while (to_read > 0);
+
+      close (fd);
+    }
+
+  /* Using the magic number we can test whether it really is a message
+     catalog file.  */
+  if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
+                       0))
+    {
+      /* The magic number is wrong: not a message catalog file.  */
+#ifdef HAVE_MMAP
+      if (use_mmap)
+       munmap ((caddr_t) data, size);
+      else
+#endif
+       free (data);
+      return;
+    }
+
+  domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+  if (domain == NULL)
+    return;
+  domain_file->data = domain;
+
+  domain->data = (char *) data;
+  domain->use_mmap = use_mmap;
+  domain->mmap_size = size;
+  domain->must_swap = data->magic != _MAGIC;
+  domain->malloced = NULL;
+
+  /* Fill in the information about the available tables.  */
+  revision = W (domain->must_swap, data->revision);
+  /* We support only the major revision 0.  */
+  switch (revision >> 16)
+    {
+    case 0:
+      domain->nstrings = W (domain->must_swap, data->nstrings);
+      domain->orig_tab = (const struct string_desc *)
+       ((char *) data + W (domain->must_swap, data->orig_tab_offset));
+      domain->trans_tab = (const struct string_desc *)
+       ((char *) data + W (domain->must_swap, data->trans_tab_offset));
+      domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+      domain->hash_tab =
+       (domain->hash_size > 2
+        ? (const nls_uint32 *)
+          ((char *) data + W (domain->must_swap, data->hash_tab_offset))
+        : NULL);
+      domain->must_swap_hash_tab = domain->must_swap;
+
+      /* Now dispatch on the minor revision.  */
+      switch (revision & 0xffff)
+       {
+       case 0:
+         domain->n_sysdep_strings = 0;
+         domain->orig_sysdep_tab = NULL;
+         domain->trans_sysdep_tab = NULL;
+         break;
+       case 1:
+       default:
+         {
+           nls_uint32 n_sysdep_strings;
+
+           if (domain->hash_tab == NULL)
+             /* This is invalid.  These minor revisions need a hash table.  */
+             goto invalid;
+
+           n_sysdep_strings =
+             W (domain->must_swap, data->n_sysdep_strings);
+           if (n_sysdep_strings > 0)
+             {
+               nls_uint32 n_sysdep_segments;
+               const struct sysdep_segment *sysdep_segments;
+               const char **sysdep_segment_values;
+               const nls_uint32 *orig_sysdep_tab;
+               const nls_uint32 *trans_sysdep_tab;
+               size_t memneed;
+               char *mem;
+               struct sysdep_string_desc *inmem_orig_sysdep_tab;
+               struct sysdep_string_desc *inmem_trans_sysdep_tab;
+               nls_uint32 *inmem_hash_tab;
+               unsigned int i;
+
+               /* Get the values of the system dependent segments.  */
+               n_sysdep_segments =
+                 W (domain->must_swap, data->n_sysdep_segments);
+               sysdep_segments = (const struct sysdep_segment *)
+                 ((char *) data
+                  + W (domain->must_swap, data->sysdep_segments_offset));
+               sysdep_segment_values =
+                 alloca (n_sysdep_segments * sizeof (const char *));
+               for (i = 0; i < n_sysdep_segments; i++)
+                 {
+                   const char *name =
+                     (char *) data
+                     + W (domain->must_swap, sysdep_segments[i].offset);
+                   nls_uint32 namelen =
+                     W (domain->must_swap, sysdep_segments[i].length);
+
+                   if (!(namelen > 0 && name[namelen - 1] == '\0'))
+                     {
+                       freea (sysdep_segment_values);
+                       goto invalid;
+                     }
+
+                   sysdep_segment_values[i] = get_sysdep_segment_value (name);
+                 }
+
+               orig_sysdep_tab = (const nls_uint32 *)
+                 ((char *) data
+                  + W (domain->must_swap, data->orig_sysdep_tab_offset));
+               trans_sysdep_tab = (const nls_uint32 *)
+                 ((char *) data
+                  + W (domain->must_swap, data->trans_sysdep_tab_offset));
+
+               /* Compute the amount of additional memory needed for the
+                  system dependent strings and the augmented hash table.  */
+               memneed = 2 * n_sysdep_strings
+                         * sizeof (struct sysdep_string_desc)
+                         + domain->hash_size * sizeof (nls_uint32);
+               for (i = 0; i < 2 * n_sysdep_strings; i++)
+                 {
+                   const struct sysdep_string *sysdep_string =
+                     (const struct sysdep_string *)
+                     ((char *) data
+                      + W (domain->must_swap,
+                           i < n_sysdep_strings
+                           ? orig_sysdep_tab[i]
+                           : trans_sysdep_tab[i - n_sysdep_strings]));
+                   size_t need = 0;
+                   const struct segment_pair *p = sysdep_string->segments;
+
+                   if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END)
+                     for (p = sysdep_string->segments;; p++)
+                       {
+                         nls_uint32 sysdepref;
+
+                         need += W (domain->must_swap, p->segsize);
+
+                         sysdepref = W (domain->must_swap, p->sysdepref);
+                         if (sysdepref == SEGMENTS_END)
+                           break;
+
+                         if (sysdepref >= n_sysdep_segments)
+                           {
+                             /* Invalid.  */
+                             freea (sysdep_segment_values);
+                             goto invalid;
+                           }
+
+                         need += strlen (sysdep_segment_values[sysdepref]);
+                       }
+
+                   memneed += need;
+                 }
+
+               /* Allocate additional memory.  */
+               mem = (char *) malloc (memneed);
+               if (mem == NULL)
+                 goto invalid;
+
+               domain->malloced = mem;
+               inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem;
+               mem += n_sysdep_strings * sizeof (struct sysdep_string_desc);
+               inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem;
+               mem += n_sysdep_strings * sizeof (struct sysdep_string_desc);
+               inmem_hash_tab = (nls_uint32 *) mem;
+               mem += domain->hash_size * sizeof (nls_uint32);
+
+               /* Compute the system dependent strings.  */
+               for (i = 0; i < 2 * n_sysdep_strings; i++)
+                 {
+                   const struct sysdep_string *sysdep_string =
+                     (const struct sysdep_string *)
+                     ((char *) data
+                      + W (domain->must_swap,
+                           i < n_sysdep_strings
+                           ? orig_sysdep_tab[i]
+                           : trans_sysdep_tab[i - n_sysdep_strings]));
+                   const char *static_segments =
+                     (char *) data
+                     + W (domain->must_swap, sysdep_string->offset);
+                   const struct segment_pair *p = sysdep_string->segments;
+
+                   /* Concatenate the segments, and fill
+                      inmem_orig_sysdep_tab[i] (for i < n_sysdep_strings) and
+                      inmem_trans_sysdep_tab[i-n_sysdep_strings] (for
+                      i >= n_sysdep_strings).  */
+
+                   if (W (domain->must_swap, p->sysdepref) == SEGMENTS_END)
+                     {
+                       /* Only one static segment.  */
+                       inmem_orig_sysdep_tab[i].length =
+                         W (domain->must_swap, p->segsize);
+                       inmem_orig_sysdep_tab[i].pointer = static_segments;
+                     }
+                   else
+                     {
+                       inmem_orig_sysdep_tab[i].pointer = mem;
+
+                       for (p = sysdep_string->segments;; p++)
+                         {
+                           nls_uint32 segsize =
+                             W (domain->must_swap, p->segsize);
+                           nls_uint32 sysdepref =
+                             W (domain->must_swap, p->sysdepref);
+                           size_t n;
+
+                           if (segsize > 0)
+                             {
+                               memcpy (mem, static_segments, segsize);
+                               mem += segsize;
+                               static_segments += segsize;
+                             }
+
+                           if (sysdepref == SEGMENTS_END)
+                             break;
+
+                           n = strlen (sysdep_segment_values[sysdepref]);
+                           memcpy (mem, sysdep_segment_values[sysdepref], n);
+                           mem += n;
+                         }
+
+                       inmem_orig_sysdep_tab[i].length =
+                         mem - inmem_orig_sysdep_tab[i].pointer;
+                     }
+                 }
+
+               /* Compute the augmented hash table.  */
+               for (i = 0; i < domain->hash_size; i++)
+                 inmem_hash_tab[i] =
+                   W (domain->must_swap_hash_tab, domain->hash_tab[i]);
+               for (i = 0; i < n_sysdep_strings; i++)
+                 {
+                   const char *msgid = inmem_orig_sysdep_tab[i].pointer;
+                   nls_uint32 hash_val = hash_string (msgid);
+                   nls_uint32 idx = hash_val % domain->hash_size;
+                   nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+
+                   for (;;)
+                     {
+                       if (inmem_hash_tab[idx] == 0)
+                         {
+                           /* Hash table entry is empty.  Use it.  */
+                           inmem_hash_tab[idx] = 1 + domain->nstrings + i;
+                           break;
+                         }
+
+                       if (idx >= domain->hash_size - incr)
+                         idx -= domain->hash_size - incr;
+                       else
+                         idx += incr;
+                     }
+                 }
+
+               freea (sysdep_segment_values);
+
+               domain->n_sysdep_strings = n_sysdep_strings;
+               domain->orig_sysdep_tab = inmem_orig_sysdep_tab;
+               domain->trans_sysdep_tab = inmem_trans_sysdep_tab;
+
+               domain->hash_tab = inmem_hash_tab;
+               domain->must_swap_hash_tab = 0;
+             }
+           else
+             {
+               domain->n_sysdep_strings = 0;
+               domain->orig_sysdep_tab = NULL;
+               domain->trans_sysdep_tab = NULL;
+             }
+         }
+         break;
+       }
+      break;
+    default:
+      /* This is an invalid revision.  */
+    invalid:
+      /* This is an invalid .mo file.  */
+      if (domain->malloced)
+       free (domain->malloced);
+#ifdef HAVE_MMAP
+      if (use_mmap)
+       munmap ((caddr_t) data, size);
+      else
+#endif
+       free (data);
+      free (domain);
+      domain_file->data = NULL;
+      return;
+    }
+
+  /* Now initialize the character set converter from the character set
+     the file is encoded with (found in the header entry) to the domain's
+     specified character set or the locale's character set.  */
+  nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding);
+
+  /* Also look for a plural specification.  */
+  EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
+}
+
+
+#ifdef _LIBC
+void
+internal_function
+_nl_unload_domain (domain)
+     struct loaded_domain *domain;
+{
+  if (domain->plural != &__gettext_germanic_plural)
+    __gettext_free_exp (domain->plural);
+
+  _nl_free_domain_conv (domain);
+
+  if (domain->malloced)
+    free (domain->malloced);
+
+# ifdef _POSIX_MAPPED_FILES
+  if (domain->use_mmap)
+    munmap ((caddr_t) domain->data, domain->mmap_size);
+  else
+# endif        /* _POSIX_MAPPED_FILES */
+    free ((void *) domain->data);
+
+  free (domain);
+}
+#endif
diff --git a/lib/intl/localcharset.c b/lib/intl/localcharset.c
new file mode 100644 (file)
index 0000000..d04d053
--- /dev/null
@@ -0,0 +1,398 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification.  */
+#include "localcharset.h"
+
+#if HAVE_STDDEF_H
+# include <stddef.h>
+#endif
+
+#include <stdio.h>
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# undef WIN32   /* avoid warning on mingw32 */
+# define WIN32
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS.  */
+# define OS2
+#endif
+
+#if !defined WIN32
+# if HAVE_LANGINFO_CODESET
+#  include <langinfo.h>
+# else
+#  if HAVE_SETLOCALE
+#   include <locale.h>
+#  endif
+# endif
+#elif defined WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#ifdef HAVE_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+   possible multithread problem in the function get_charset_aliases. If we
+   are running in a threaded environment, and if two threads initialize
+   'charset_aliases' simultaneously, both will produce the same value,
+   and everything will be ok if the two assignments to 'charset_aliases'
+   are atomic. But I don't know what will happen if the two assignments mix.  */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+   read, else NULL.  Its format is:
+   ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0'  */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file.  */
+static const char *
+get_charset_aliases ()
+{
+  const char *cp;
+
+  cp = charset_aliases;
+  if (cp == NULL)
+    {
+#if !(defined VMS || defined WIN32)
+      FILE *fp;
+      const char *dir = relocate (LIBDIR);
+      const char *base = "charset.alias";
+      char *file_name;
+
+      /* Concatenate dir and base into freshly allocated file_name.  */
+      {
+       size_t dir_len = strlen (dir);
+       size_t base_len = strlen (base);
+       int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+       file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+       if (file_name != NULL)
+         {
+           memcpy (file_name, dir, dir_len);
+           if (add_slash)
+             file_name[dir_len] = DIRECTORY_SEPARATOR;
+           memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+         }
+      }
+
+      if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
+       /* Out of memory or file not found, treat it as empty.  */
+       cp = "";
+      else
+       {
+         /* Parse the file's contents.  */
+         int c;
+         char buf1[50+1];
+         char buf2[50+1];
+         char *res_ptr = NULL;
+         size_t res_size = 0;
+         size_t l1, l2;
+
+         for (;;)
+           {
+             c = getc (fp);
+             if (c == EOF)
+               break;
+             if (c == '\n' || c == ' ' || c == '\t')
+               continue;
+             if (c == '#')
+               {
+                 /* Skip comment, to end of line.  */
+                 do
+                   c = getc (fp);
+                 while (!(c == EOF || c == '\n'));
+                 if (c == EOF)
+                   break;
+                 continue;
+               }
+             ungetc (c, fp);
+             if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+               break;
+             l1 = strlen (buf1);
+             l2 = strlen (buf2);
+             if (res_size == 0)
+               {
+                 res_size = l1 + 1 + l2 + 1;
+                 res_ptr = (char *) malloc (res_size + 1);
+               }
+             else
+               {
+                 res_size += l1 + 1 + l2 + 1;
+                 res_ptr = (char *) realloc (res_ptr, res_size + 1);
+               }
+             if (res_ptr == NULL)
+               {
+                 /* Out of memory. */
+                 res_size = 0;
+                 break;
+               }
+             strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+             strcpy (res_ptr + res_size - (l2 + 1), buf2);
+           }
+         fclose (fp);
+         if (res_size == 0)
+           cp = "";
+         else
+           {
+             *(res_ptr + res_size) = '\0';
+             cp = res_ptr;
+           }
+       }
+
+      if (file_name != NULL)
+       free (file_name);
+
+#else
+
+# if defined VMS
+      /* To avoid the troubles of an extra file charset.alias_vms in the
+        sources of many GNU packages, simply inline the aliases here.  */
+      /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+        "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+        section 10.7 "Handling Different Character Sets".  */
+      cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+          "ISO8859-2" "\0" "ISO-8859-2" "\0"
+          "ISO8859-5" "\0" "ISO-8859-5" "\0"
+          "ISO8859-7" "\0" "ISO-8859-7" "\0"
+          "ISO8859-8" "\0" "ISO-8859-8" "\0"
+          "ISO8859-9" "\0" "ISO-8859-9" "\0"
+          /* Japanese */
+          "eucJP" "\0" "EUC-JP" "\0"
+          "SJIS" "\0" "SHIFT_JIS" "\0"
+          "DECKANJI" "\0" "DEC-KANJI" "\0"
+          "SDECKANJI" "\0" "EUC-JP" "\0"
+          /* Chinese */
+          "eucTW" "\0" "EUC-TW" "\0"
+          "DECHANYU" "\0" "DEC-HANYU" "\0"
+          "DECHANZI" "\0" "GB2312" "\0"
+          /* Korean */
+          "DECKOREAN" "\0" "EUC-KR" "\0";
+# endif
+
+# if defined WIN32
+      /* To avoid the troubles of installing a separate file in the same
+        directory as the DLL and of retrieving the DLL's directory at
+        runtime, simply inline the aliases here.  */
+
+      cp = "CP936" "\0" "GBK" "\0"
+          "CP1361" "\0" "JOHAB" "\0"
+          "CP20127" "\0" "ASCII" "\0"
+          "CP20866" "\0" "KOI8-R" "\0"
+          "CP21866" "\0" "KOI8-RU" "\0"
+          "CP28591" "\0" "ISO-8859-1" "\0"
+          "CP28592" "\0" "ISO-8859-2" "\0"
+          "CP28593" "\0" "ISO-8859-3" "\0"
+          "CP28594" "\0" "ISO-8859-4" "\0"
+          "CP28595" "\0" "ISO-8859-5" "\0"
+          "CP28596" "\0" "ISO-8859-6" "\0"
+          "CP28597" "\0" "ISO-8859-7" "\0"
+          "CP28598" "\0" "ISO-8859-8" "\0"
+          "CP28599" "\0" "ISO-8859-9" "\0"
+          "CP28605" "\0" "ISO-8859-15" "\0";
+# endif
+#endif
+
+      charset_aliases = cp;
+    }
+
+  return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+   into one of the canonical names listed in config.charset.
+   The result must not be freed; it is statically allocated.
+   If the canonical name cannot be determined, the result is a non-canonical
+   name.  */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset ()
+{
+  const char *codeset;
+  const char *aliases;
+
+#if !(defined WIN32 || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+  /* Most systems support nl_langinfo (CODESET) nowadays.  */
+  codeset = nl_langinfo (CODESET);
+
+# else
+
+  /* On old systems which lack it, use setlocale or getenv.  */
+  const char *locale = NULL;
+
+  /* But most old systems don't have a complete set of locales.  Some
+     (like SunOS 4 or DJGPP) have only the C locale.  Therefore we don't
+     use setlocale here; it would return "C" when it doesn't support the
+     locale name the user has set.  */
+#  if HAVE_SETLOCALE && 0
+  locale = setlocale (LC_CTYPE, NULL);
+#  endif
+  if (locale == NULL || locale[0] == '\0')
+    {
+      locale = getenv ("LC_ALL");
+      if (locale == NULL || locale[0] == '\0')
+       {
+         locale = getenv ("LC_CTYPE");
+         if (locale == NULL || locale[0] == '\0')
+           locale = getenv ("LANG");
+       }
+    }
+
+  /* On some old systems, one used to set locale = "iso8859_1". On others,
+     you set it to "language_COUNTRY.charset". In any case, we resolve it
+     through the charset.alias file.  */
+  codeset = locale;
+
+# endif
+
+#elif defined WIN32
+
+  static char buf[2 + 10 + 1];
+
+  /* Woe32 has a function returning the locale's codepage as a number.  */
+  sprintf (buf, "CP%u", GetACP ());
+  codeset = buf;
+
+#elif defined OS2
+
+  const char *locale;
+  static char buf[2 + 10 + 1];
+  ULONG cp[3];
+  ULONG cplen;
+
+  /* Allow user to override the codeset, as set in the operating system,
+     with standard language environment variables.  */
+  locale = getenv ("LC_ALL");
+  if (locale == NULL || locale[0] == '\0')
+    {
+      locale = getenv ("LC_CTYPE");
+      if (locale == NULL || locale[0] == '\0')
+       locale = getenv ("LANG");
+    }
+  if (locale != NULL && locale[0] != '\0')
+    {
+      /* If the locale name contains an encoding after the dot, return it.  */
+      const char *dot = strchr (locale, '.');
+
+      if (dot != NULL)
+       {
+         const char *modifier;
+
+         dot++;
+         /* Look for the possible @... trailer and remove it, if any.  */
+         modifier = strchr (dot, '@');
+         if (modifier == NULL)
+           return dot;
+         if (modifier - dot < sizeof (buf))
+           {
+             memcpy (buf, dot, modifier - dot);
+             buf [modifier - dot] = '\0';
+             return buf;
+           }
+       }
+
+      /* Resolve through the charset.alias file.  */
+      codeset = locale;
+    }
+  else
+    {
+      /* OS/2 has a function returning the locale's codepage as a number.  */
+      if (DosQueryCp (sizeof (cp), cp, &cplen))
+       codeset = "";
+      else
+       {
+         sprintf (buf, "CP%u", cp[0]);
+         codeset = buf;
+       }
+    }
+
+#endif
+
+  if (codeset == NULL)
+    /* The canonical name cannot be determined.  */
+    codeset = "";
+
+  /* Resolve alias. */
+  for (aliases = get_charset_aliases ();
+       *aliases != '\0';
+       aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+    if (strcmp (codeset, aliases) == 0
+       || (aliases[0] == '*' && aliases[1] == '\0'))
+      {
+       codeset = aliases + strlen (aliases) + 1;
+       break;
+      }
+
+  /* Don't return an empty string.  GNU libc and GNU libiconv interpret
+     the empty string as denoting "the locale's character encoding",
+     thus GNU libiconv would call this function a second time.  */
+  if (codeset[0] == '\0')
+    codeset = "ASCII";
+
+  return codeset;
+}
diff --git a/lib/intl/localcharset.h b/lib/intl/localcharset.h
new file mode 100644 (file)
index 0000000..3b137e7
--- /dev/null
@@ -0,0 +1,42 @@
+/* Determine a canonical name for the current locale's character encoding.
+   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+   This file is part of the GNU CHARSET Library.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+   into one of the canonical names listed in config.charset.
+   The result must not be freed; it is statically allocated.
+   If the canonical name cannot be determined, the result is a non-canonical
+   name.  */
+extern const char * locale_charset (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/lib/intl/locale.alias b/lib/intl/locale.alias
new file mode 100644 (file)
index 0000000..bd7b9b3
--- /dev/null
@@ -0,0 +1,78 @@
+# Locale name alias data base.
+# Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+
+# The format of this file is the same as for the corresponding file of
+# the X Window System, which normally can be found in
+#      /usr/lib/X11/locale/locale.alias
+# A single line contains two fields: an alias and a substitution value.
+# All entries are case independent.
+
+# Note: This file is far from being complete.  If you have a value for
+# your own site which you think might be useful for others too, share
+# it with the rest of us.  Send it using the `glibcbug' script to
+# bugs@gnu.org.
+
+# Packages using this file: 
+
+bokmal         no_NO.ISO-8859-1
+bokmål         no_NO.ISO-8859-1
+catalan                ca_ES.ISO-8859-1
+croatian       hr_HR.ISO-8859-2
+czech          cs_CZ.ISO-8859-2
+danish          da_DK.ISO-8859-1
+dansk          da_DK.ISO-8859-1
+deutsch                de_DE.ISO-8859-1
+dutch          nl_NL.ISO-8859-1
+eesti          et_EE.ISO-8859-1
+estonian       et_EE.ISO-8859-1
+finnish         fi_FI.ISO-8859-1
+français       fr_FR.ISO-8859-1
+french         fr_FR.ISO-8859-1
+galego         gl_ES.ISO-8859-1
+galician       gl_ES.ISO-8859-1
+german         de_DE.ISO-8859-1
+greek           el_GR.ISO-8859-7
+hebrew          he_IL.ISO-8859-8
+hrvatski       hr_HR.ISO-8859-2
+hungarian       hu_HU.ISO-8859-2
+icelandic       is_IS.ISO-8859-1
+italian         it_IT.ISO-8859-1
+japanese       ja_JP.eucJP
+japanese.euc   ja_JP.eucJP
+ja_JP          ja_JP.eucJP
+ja_JP.ujis     ja_JP.eucJP
+japanese.sjis  ja_JP.SJIS
+korean         ko_KR.eucKR
+korean.euc     ko_KR.eucKR
+ko_KR          ko_KR.eucKR
+lithuanian      lt_LT.ISO-8859-13
+nb_NO          no_NO.ISO-8859-1
+nb_NO.ISO-8859-1 no_NO.ISO-8859-1
+norwegian       no_NO.ISO-8859-1
+nynorsk                nn_NO.ISO-8859-1
+polish          pl_PL.ISO-8859-2
+portuguese      pt_PT.ISO-8859-1
+romanian        ro_RO.ISO-8859-2
+russian         ru_RU.ISO-8859-5
+slovak          sk_SK.ISO-8859-2
+slovene         sl_SI.ISO-8859-2
+slovenian       sl_SI.ISO-8859-2
+spanish         es_ES.ISO-8859-1
+swedish         sv_SE.ISO-8859-1
+thai           th_TH.TIS-620
+turkish         tr_TR.ISO-8859-9
diff --git a/lib/intl/localealias.c b/lib/intl/localealias.c
new file mode 100644 (file)
index 0000000..7c4ce58
--- /dev/null
@@ -0,0 +1,419 @@
+/* Handle aliases for locale names.
+   Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#if defined _LIBC || defined HAVE___FSETLOCKING
+# include <stdio_ext.h>
+#endif
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# undef alloca
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettextP.h"
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define strcasecmp __strcasecmp
+
+# ifndef mempcpy
+#  define mempcpy __mempcpy
+# endif
+# define HAVE_MEMPCPY  1
+# define HAVE___FSETLOCKING    1
+
+/* We need locking here since we can be called from different places.  */
+# include <bits/libc-lock.h>
+
+__libc_lock_define_initialized (static, lock);
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Some optimizations for glibc.  */
+#ifdef _LIBC
+# define FEOF(fp)              feof_unlocked (fp)
+# define FGETS(buf, n, fp)     fgets_unlocked (buf, n, fp)
+#else
+# define FEOF(fp)              feof (fp)
+# define FGETS(buf, n, fp)     fgets (buf, n, fp)
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED
+# undef fgets
+# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
+#endif
+#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED
+# undef feof
+# define feof(s) feof_unlocked (s)
+#endif
+
+
+struct alias_map
+{
+  const char *alias;
+  const char *value;
+};
+
+
+#ifndef _LIBC
+# define libc_freeres_ptr(decl) decl
+#endif
+
+libc_freeres_ptr (static char *string_space);
+static size_t string_space_act;
+static size_t string_space_max;
+libc_freeres_ptr (static struct alias_map *map);
+static size_t nmap;
+static size_t maxmap;
+
+
+/* Prototypes for local functions.  */
+static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
+     internal_function;
+static int extend_alias_table PARAMS ((void));
+static int alias_compare PARAMS ((const struct alias_map *map1,
+                                 const struct alias_map *map2));
+
+
+const char *
+_nl_expand_alias (name)
+    const char *name;
+{
+  static const char *locale_alias_path;
+  struct alias_map *retval;
+  const char *result = NULL;
+  size_t added;
+
+#ifdef _LIBC
+  __libc_lock_lock (lock);
+#endif
+
+  if (locale_alias_path == NULL)
+    locale_alias_path = LOCALE_ALIAS_PATH;
+
+  do
+    {
+      struct alias_map item;
+
+      item.alias = name;
+
+      if (nmap > 0)
+       retval = (struct alias_map *) bsearch (&item, map, nmap,
+                                              sizeof (struct alias_map),
+                                              (int (*) PARAMS ((const void *,
+                                                                const void *))
+                                               ) alias_compare);
+      else
+       retval = NULL;
+
+      /* We really found an alias.  Return the value.  */
+      if (retval != NULL)
+       {
+         result = retval->value;
+         break;
+       }
+
+      /* Perhaps we can find another alias file.  */
+      added = 0;
+      while (added == 0 && locale_alias_path[0] != '\0')
+       {
+         const char *start;
+
+         while (locale_alias_path[0] == PATH_SEPARATOR)
+           ++locale_alias_path;
+         start = locale_alias_path;
+
+         while (locale_alias_path[0] != '\0'
+                && locale_alias_path[0] != PATH_SEPARATOR)
+           ++locale_alias_path;
+
+         if (start < locale_alias_path)
+           added = read_alias_file (start, locale_alias_path - start);
+       }
+    }
+  while (added != 0);
+
+#ifdef _LIBC
+  __libc_lock_unlock (lock);
+#endif
+
+  return result;
+}
+
+
+static size_t
+internal_function
+read_alias_file (fname, fname_len)
+     const char *fname;
+     int fname_len;
+{
+  FILE *fp;
+  char *full_fname;
+  size_t added;
+  static const char aliasfile[] = "/locale.alias";
+
+  full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+#ifdef HAVE_MEMPCPY
+  mempcpy (mempcpy (full_fname, fname, fname_len),
+          aliasfile, sizeof aliasfile);
+#else
+  memcpy (full_fname, fname, fname_len);
+  memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+#endif
+
+  fp = fopen (relocate (full_fname), "r");
+  freea (full_fname);
+  if (fp == NULL)
+    return 0;
+
+#ifdef HAVE___FSETLOCKING
+  /* No threads present.  */
+  __fsetlocking (fp, FSETLOCKING_BYCALLER);
+#endif
+
+  added = 0;
+  while (!FEOF (fp))
+    {
+      /* It is a reasonable approach to use a fix buffer here because
+        a) we are only interested in the first two fields
+        b) these fields must be usable as file names and so must not
+           be that long
+        We avoid a multi-kilobyte buffer here since this would use up
+        stack space which we might not have if the program ran out of
+        memory.  */
+      char buf[400];
+      char *alias;
+      char *value;
+      char *cp;
+
+      if (FGETS (buf, sizeof buf, fp) == NULL)
+       /* EOF reached.  */
+       break;
+
+      cp = buf;
+      /* Ignore leading white space.  */
+      while (isspace ((unsigned char) cp[0]))
+       ++cp;
+
+      /* A leading '#' signals a comment line.  */
+      if (cp[0] != '\0' && cp[0] != '#')
+       {
+         alias = cp++;
+         while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+           ++cp;
+         /* Terminate alias name.  */
+         if (cp[0] != '\0')
+           *cp++ = '\0';
+
+         /* Now look for the beginning of the value.  */
+         while (isspace ((unsigned char) cp[0]))
+           ++cp;
+
+         if (cp[0] != '\0')
+           {
+             size_t alias_len;
+             size_t value_len;
+
+             value = cp++;
+             while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+               ++cp;
+             /* Terminate value.  */
+             if (cp[0] == '\n')
+               {
+                 /* This has to be done to make the following test
+                    for the end of line possible.  We are looking for
+                    the terminating '\n' which do not overwrite here.  */
+                 *cp++ = '\0';
+                 *cp = '\n';
+               }
+             else if (cp[0] != '\0')
+               *cp++ = '\0';
+
+             if (nmap >= maxmap)
+               if (__builtin_expect (extend_alias_table (), 0))
+                 return added;
+
+             alias_len = strlen (alias) + 1;
+             value_len = strlen (value) + 1;
+
+             if (string_space_act + alias_len + value_len > string_space_max)
+               {
+                 /* Increase size of memory pool.  */
+                 size_t new_size = (string_space_max
+                                    + (alias_len + value_len > 1024
+                                       ? alias_len + value_len : 1024));
+                 char *new_pool = (char *) realloc (string_space, new_size);
+                 if (new_pool == NULL)
+                   return added;
+
+                 if (__builtin_expect (string_space != new_pool, 0))
+                   {
+                     size_t i;
+
+                     for (i = 0; i < nmap; i++)
+                       {
+                         map[i].alias += new_pool - string_space;
+                         map[i].value += new_pool - string_space;
+                       }
+                   }
+
+                 string_space = new_pool;
+                 string_space_max = new_size;
+               }
+
+             map[nmap].alias = memcpy (&string_space[string_space_act],
+                                       alias, alias_len);
+             string_space_act += alias_len;
+
+             map[nmap].value = memcpy (&string_space[string_space_act],
+                                       value, value_len);
+             string_space_act += value_len;
+
+             ++nmap;
+             ++added;
+           }
+       }
+
+      /* Possibly not the whole line fits into the buffer.  Ignore
+        the rest of the line.  */
+      while (strchr (buf, '\n') == NULL)
+       if (FGETS (buf, sizeof buf, fp) == NULL)
+         /* Make sure the inner loop will be left.  The outer loop
+            will exit at the `feof' test.  */
+         break;
+    }
+
+  /* Should we test for ferror()?  I think we have to silently ignore
+     errors.  --drepper  */
+  fclose (fp);
+
+  if (added > 0)
+    qsort (map, nmap, sizeof (struct alias_map),
+          (int (*) PARAMS ((const void *, const void *))) alias_compare);
+
+  return added;
+}
+
+
+static int
+extend_alias_table ()
+{
+  size_t new_size;
+  struct alias_map *new_map;
+
+  new_size = maxmap == 0 ? 100 : 2 * maxmap;
+  new_map = (struct alias_map *) realloc (map, (new_size
+                                               * sizeof (struct alias_map)));
+  if (new_map == NULL)
+    /* Simply don't extend: we don't have any more core.  */
+    return -1;
+
+  map = new_map;
+  maxmap = new_size;
+  return 0;
+}
+
+
+static int
+alias_compare (map1, map2)
+     const struct alias_map *map1;
+     const struct alias_map *map2;
+{
+#if defined _LIBC || defined HAVE_STRCASECMP
+  return strcasecmp (map1->alias, map2->alias);
+#else
+  const unsigned char *p1 = (const unsigned char *) map1->alias;
+  const unsigned char *p2 = (const unsigned char *) map2->alias;
+  unsigned char c1, c2;
+
+  if (p1 == p2)
+    return 0;
+
+  do
+    {
+      /* I know this seems to be odd but the tolower() function in
+        some systems libc cannot handle nonalpha characters.  */
+      c1 = isupper (*p1) ? tolower (*p1) : *p1;
+      c2 = isupper (*p2) ? tolower (*p2) : *p2;
+      if (c1 == '\0')
+       break;
+      ++p1;
+      ++p2;
+    }
+  while (c1 == c2);
+
+  return c1 - c2;
+#endif
+}
diff --git a/lib/intl/localename.c b/lib/intl/localename.c
new file mode 100644 (file)
index 0000000..faacecd
--- /dev/null
@@ -0,0 +1,772 @@
+/* Determine the current selected locale.
+   Copyright (C) 1995-1999, 2000-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* Written by Ulrich Drepper <drepper@gnu.org>, 1995.  */
+/* Win32 code written by Tor Lillqvist <tml@iki.fi>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <locale.h>
+
+#if defined _WIN32 || defined __WIN32__
+# undef WIN32   /* avoid warning on mingw32 */
+# define WIN32
+#endif
+
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* Mingw headers don't have latest language and sublanguage codes.  */
+# ifndef LANG_AFRIKAANS
+# define LANG_AFRIKAANS 0x36
+# endif
+# ifndef LANG_ALBANIAN
+# define LANG_ALBANIAN 0x1c
+# endif
+# ifndef LANG_ARABIC
+# define LANG_ARABIC 0x01
+# endif
+# ifndef LANG_ARMENIAN
+# define LANG_ARMENIAN 0x2b
+# endif
+# ifndef LANG_ASSAMESE
+# define LANG_ASSAMESE 0x4d
+# endif
+# ifndef LANG_AZERI
+# define LANG_AZERI 0x2c
+# endif
+# ifndef LANG_BASQUE
+# define LANG_BASQUE 0x2d
+# endif
+# ifndef LANG_BELARUSIAN
+# define LANG_BELARUSIAN 0x23
+# endif
+# ifndef LANG_BENGALI
+# define LANG_BENGALI 0x45
+# endif
+# ifndef LANG_CATALAN
+# define LANG_CATALAN 0x03
+# endif
+# ifndef LANG_DIVEHI
+# define LANG_DIVEHI 0x65
+# endif
+# ifndef LANG_ESTONIAN
+# define LANG_ESTONIAN 0x25
+# endif
+# ifndef LANG_FAEROESE
+# define LANG_FAEROESE 0x38
+# endif
+# ifndef LANG_FARSI
+# define LANG_FARSI 0x29
+# endif
+# ifndef LANG_GALICIAN
+# define LANG_GALICIAN 0x56
+# endif
+# ifndef LANG_GEORGIAN
+# define LANG_GEORGIAN 0x37
+# endif
+# ifndef LANG_GUJARATI
+# define LANG_GUJARATI 0x47
+# endif
+# ifndef LANG_HEBREW
+# define LANG_HEBREW 0x0d
+# endif
+# ifndef LANG_HINDI
+# define LANG_HINDI 0x39
+# endif
+# ifndef LANG_INDONESIAN
+# define LANG_INDONESIAN 0x21
+# endif
+# ifndef LANG_KANNADA
+# define LANG_KANNADA 0x4b
+# endif
+# ifndef LANG_KASHMIRI
+# define LANG_KASHMIRI 0x60
+# endif
+# ifndef LANG_KAZAK
+# define LANG_KAZAK 0x3f
+# endif
+# ifndef LANG_KONKANI
+# define LANG_KONKANI 0x57
+# endif
+# ifndef LANG_KYRGYZ
+# define LANG_KYRGYZ 0x40
+# endif
+# ifndef LANG_LATVIAN
+# define LANG_LATVIAN 0x26
+# endif
+# ifndef LANG_LITHUANIAN
+# define LANG_LITHUANIAN 0x27
+# endif
+# ifndef LANG_MACEDONIAN
+# define LANG_MACEDONIAN 0x2f
+# endif
+# ifndef LANG_MALAY
+# define LANG_MALAY 0x3e
+# endif
+# ifndef LANG_MALAYALAM
+# define LANG_MALAYALAM 0x4c
+# endif
+# ifndef LANG_MANIPURI
+# define LANG_MANIPURI 0x58
+# endif
+# ifndef LANG_MARATHI
+# define LANG_MARATHI 0x4e
+# endif
+# ifndef LANG_MONGOLIAN
+# define LANG_MONGOLIAN 0x50
+# endif
+# ifndef LANG_NEPALI
+# define LANG_NEPALI 0x61
+# endif
+# ifndef LANG_ORIYA
+# define LANG_ORIYA 0x48
+# endif
+# ifndef LANG_PUNJABI
+# define LANG_PUNJABI 0x46
+# endif
+# ifndef LANG_SANSKRIT
+# define LANG_SANSKRIT 0x4f
+# endif
+# ifndef LANG_SERBIAN
+# define LANG_SERBIAN 0x1a
+# endif
+# ifndef LANG_SINDHI
+# define LANG_SINDHI 0x59
+# endif
+# ifndef LANG_SLOVAK
+# define LANG_SLOVAK 0x1b
+# endif
+# ifndef LANG_SORBIAN
+# define LANG_SORBIAN 0x2e
+# endif
+# ifndef LANG_SWAHILI
+# define LANG_SWAHILI 0x41
+# endif
+# ifndef LANG_SYRIAC
+# define LANG_SYRIAC 0x5a
+# endif
+# ifndef LANG_TAMIL
+# define LANG_TAMIL 0x49
+# endif
+# ifndef LANG_TATAR
+# define LANG_TATAR 0x44
+# endif
+# ifndef LANG_TELUGU
+# define LANG_TELUGU 0x4a
+# endif
+# ifndef LANG_THAI
+# define LANG_THAI 0x1e
+# endif
+# ifndef LANG_UKRAINIAN
+# define LANG_UKRAINIAN 0x22
+# endif
+# ifndef LANG_URDU
+# define LANG_URDU 0x20
+# endif
+# ifndef LANG_UZBEK
+# define LANG_UZBEK 0x43
+# endif
+# ifndef LANG_VIETNAMESE
+# define LANG_VIETNAMESE 0x2a
+# endif
+# ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_IRAQ
+# define SUBLANG_ARABIC_IRAQ 0x02
+# endif
+# ifndef SUBLANG_ARABIC_EGYPT
+# define SUBLANG_ARABIC_EGYPT 0x03
+# endif
+# ifndef SUBLANG_ARABIC_LIBYA
+# define SUBLANG_ARABIC_LIBYA 0x04
+# endif
+# ifndef SUBLANG_ARABIC_ALGERIA
+# define SUBLANG_ARABIC_ALGERIA 0x05
+# endif
+# ifndef SUBLANG_ARABIC_MOROCCO
+# define SUBLANG_ARABIC_MOROCCO 0x06
+# endif
+# ifndef SUBLANG_ARABIC_TUNISIA
+# define SUBLANG_ARABIC_TUNISIA 0x07
+# endif
+# ifndef SUBLANG_ARABIC_OMAN
+# define SUBLANG_ARABIC_OMAN 0x08
+# endif
+# ifndef SUBLANG_ARABIC_YEMEN
+# define SUBLANG_ARABIC_YEMEN 0x09
+# endif
+# ifndef SUBLANG_ARABIC_SYRIA
+# define SUBLANG_ARABIC_SYRIA 0x0a
+# endif
+# ifndef SUBLANG_ARABIC_JORDAN
+# define SUBLANG_ARABIC_JORDAN 0x0b
+# endif
+# ifndef SUBLANG_ARABIC_LEBANON
+# define SUBLANG_ARABIC_LEBANON 0x0c
+# endif
+# ifndef SUBLANG_ARABIC_KUWAIT
+# define SUBLANG_ARABIC_KUWAIT 0x0d
+# endif
+# ifndef SUBLANG_ARABIC_UAE
+# define SUBLANG_ARABIC_UAE 0x0e
+# endif
+# ifndef SUBLANG_ARABIC_BAHRAIN
+# define SUBLANG_ARABIC_BAHRAIN 0x0f
+# endif
+# ifndef SUBLANG_ARABIC_QATAR
+# define SUBLANG_ARABIC_QATAR 0x10
+# endif
+# ifndef SUBLANG_AZERI_LATIN
+# define SUBLANG_AZERI_LATIN 0x01
+# endif
+# ifndef SUBLANG_AZERI_CYRILLIC
+# define SUBLANG_AZERI_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_CHINESE_MACAU
+# define SUBLANG_CHINESE_MACAU 0x05
+# endif
+# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
+# endif
+# ifndef SUBLANG_ENGLISH_JAMAICA
+# define SUBLANG_ENGLISH_JAMAICA 0x08
+# endif
+# ifndef SUBLANG_ENGLISH_CARIBBEAN
+# define SUBLANG_ENGLISH_CARIBBEAN 0x09
+# endif
+# ifndef SUBLANG_ENGLISH_BELIZE
+# define SUBLANG_ENGLISH_BELIZE 0x0a
+# endif
+# ifndef SUBLANG_ENGLISH_TRINIDAD
+# define SUBLANG_ENGLISH_TRINIDAD 0x0b
+# endif
+# ifndef SUBLANG_ENGLISH_ZIMBABWE
+# define SUBLANG_ENGLISH_ZIMBABWE 0x0c
+# endif
+# ifndef SUBLANG_ENGLISH_PHILIPPINES
+# define SUBLANG_ENGLISH_PHILIPPINES 0x0d
+# endif
+# ifndef SUBLANG_FRENCH_LUXEMBOURG
+# define SUBLANG_FRENCH_LUXEMBOURG 0x05
+# endif
+# ifndef SUBLANG_FRENCH_MONACO
+# define SUBLANG_FRENCH_MONACO 0x06
+# endif
+# ifndef SUBLANG_GERMAN_LUXEMBOURG
+# define SUBLANG_GERMAN_LUXEMBOURG 0x04
+# endif
+# ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
+# endif
+# ifndef SUBLANG_KASHMIRI_INDIA
+# define SUBLANG_KASHMIRI_INDIA 0x02
+# endif
+# ifndef SUBLANG_MALAY_MALAYSIA
+# define SUBLANG_MALAY_MALAYSIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+# endif
+# ifndef SUBLANG_NEPALI_INDIA
+# define SUBLANG_NEPALI_INDIA 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_LATIN
+# define SUBLANG_SERBIAN_LATIN 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_CYRILLIC
+# define SUBLANG_SERBIAN_CYRILLIC 0x03
+# endif
+# ifndef SUBLANG_SPANISH_GUATEMALA
+# define SUBLANG_SPANISH_GUATEMALA 0x04
+# endif
+# ifndef SUBLANG_SPANISH_COSTA_RICA
+# define SUBLANG_SPANISH_COSTA_RICA 0x05
+# endif
+# ifndef SUBLANG_SPANISH_PANAMA
+# define SUBLANG_SPANISH_PANAMA 0x06
+# endif
+# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+# endif
+# ifndef SUBLANG_SPANISH_VENEZUELA
+# define SUBLANG_SPANISH_VENEZUELA 0x08
+# endif
+# ifndef SUBLANG_SPANISH_COLOMBIA
+# define SUBLANG_SPANISH_COLOMBIA 0x09
+# endif
+# ifndef SUBLANG_SPANISH_PERU
+# define SUBLANG_SPANISH_PERU 0x0a
+# endif
+# ifndef SUBLANG_SPANISH_ARGENTINA
+# define SUBLANG_SPANISH_ARGENTINA 0x0b
+# endif
+# ifndef SUBLANG_SPANISH_ECUADOR
+# define SUBLANG_SPANISH_ECUADOR 0x0c
+# endif
+# ifndef SUBLANG_SPANISH_CHILE
+# define SUBLANG_SPANISH_CHILE 0x0d
+# endif
+# ifndef SUBLANG_SPANISH_URUGUAY
+# define SUBLANG_SPANISH_URUGUAY 0x0e
+# endif
+# ifndef SUBLANG_SPANISH_PARAGUAY
+# define SUBLANG_SPANISH_PARAGUAY 0x0f
+# endif
+# ifndef SUBLANG_SPANISH_BOLIVIA
+# define SUBLANG_SPANISH_BOLIVIA 0x10
+# endif
+# ifndef SUBLANG_SPANISH_EL_SALVADOR
+# define SUBLANG_SPANISH_EL_SALVADOR 0x11
+# endif
+# ifndef SUBLANG_SPANISH_HONDURAS
+# define SUBLANG_SPANISH_HONDURAS 0x12
+# endif
+# ifndef SUBLANG_SPANISH_NICARAGUA
+# define SUBLANG_SPANISH_NICARAGUA 0x13
+# endif
+# ifndef SUBLANG_SPANISH_PUERTO_RICO
+# define SUBLANG_SPANISH_PUERTO_RICO 0x14
+# endif
+# ifndef SUBLANG_SWEDISH_FINLAND
+# define SUBLANG_SWEDISH_FINLAND 0x02
+# endif
+# ifndef SUBLANG_URDU_PAKISTAN
+# define SUBLANG_URDU_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_URDU_INDIA
+# define SUBLANG_URDU_INDIA 0x02
+# endif
+# ifndef SUBLANG_UZBEK_LATIN
+# define SUBLANG_UZBEK_LATIN 0x01
+# endif
+# ifndef SUBLANG_UZBEK_CYRILLIC
+# define SUBLANG_UZBEK_CYRILLIC 0x02
+# endif
+#endif
+
+/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+   "Directs 'setlocale()' to query 'category' and return the current
+    setting of 'local'."
+   However it does not specify the exact format.  Neither do SUSV2 and
+   ISO C 99.  So we can use this feature only on selected systems (e.g.
+   those using GNU C Library).  */
+#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2)
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Determine the current locale's name, and canonicalize it into XPG syntax
+     language[_territory[.codeset]][@modifier]
+   The codeset part in the result is not reliable; the locale_charset()
+   should be used for codeset information instead.
+   The result must not be freed; it is statically allocated.  */
+
+const char *
+_nl_locale_name (category, categoryname)
+     int category;
+     const char *categoryname;
+{
+  const char *retval;
+
+#ifndef WIN32
+
+  /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+     On some systems this can be done by the 'setlocale' function itself.  */
+# if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+  retval = setlocale (category, NULL);
+# else
+  /* Setting of LC_ALL overwrites all other.  */
+  retval = getenv ("LC_ALL");
+  if (retval == NULL || retval[0] == '\0')
+    {
+      /* Next comes the name of the desired category.  */
+      retval = getenv (categoryname);
+      if (retval == NULL || retval[0] == '\0')
+       {
+         /* Last possibility is the LANG environment variable.  */
+         retval = getenv ("LANG");
+         if (retval == NULL || retval[0] == '\0')
+           /* We use C as the default domain.  POSIX says this is
+              implementation defined.  */
+           retval = "C";
+       }
+    }
+# endif
+
+  return retval;
+
+#else /* WIN32 */
+
+  /* Return an XPG style locale name language[_territory][@modifier].
+     Don't even bother determining the codeset; it's not useful in this
+     context, because message catalogs are not specific to a single
+     codeset.  */
+
+  LCID lcid;
+  LANGID langid;
+  int primary, sub;
+
+  /* Let the user override the system settings through environment
+     variables, as on POSIX systems.  */
+  retval = getenv ("LC_ALL");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+  retval = getenv (categoryname);
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+  retval = getenv ("LANG");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+
+  /* Use native Win32 API locale ID.  */
+  lcid = GetThreadLocale ();
+
+  /* Strip off the sorting rules, keep only the language part.  */
+  langid = LANGIDFROMLCID (lcid);
+
+  /* Split into language and territory part.  */
+  primary = PRIMARYLANGID (langid);
+  sub = SUBLANGID (langid);
+
+  /* Dispatch on language.
+     See also http://www.unicode.org/unicode/onlinedat/languages.html .
+     For details about languages, see http://www.ethnologue.com/ .  */
+  switch (primary)
+    {
+    case LANG_AFRIKAANS: return "af_ZA";
+    case LANG_ALBANIAN: return "sq_AL";
+    case 0x5e: /* AMHARIC */ return "am_ET";
+    case LANG_ARABIC:
+      switch (sub)
+       {
+       case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
+       case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
+       case SUBLANG_ARABIC_EGYPT: return "ar_EG";
+       case SUBLANG_ARABIC_LIBYA: return "ar_LY";
+       case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
+       case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
+       case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
+       case SUBLANG_ARABIC_OMAN: return "ar_OM";
+       case SUBLANG_ARABIC_YEMEN: return "ar_YE";
+       case SUBLANG_ARABIC_SYRIA: return "ar_SY";
+       case SUBLANG_ARABIC_JORDAN: return "ar_JO";
+       case SUBLANG_ARABIC_LEBANON: return "ar_LB";
+       case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
+       case SUBLANG_ARABIC_UAE: return "ar_AE";
+       case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
+       case SUBLANG_ARABIC_QATAR: return "ar_QA";
+       }
+      return "ar";
+    case LANG_ARMENIAN: return "hy_AM";
+    case LANG_ASSAMESE: return "as_IN";
+    case LANG_AZERI:
+      switch (sub)
+       {
+       /* FIXME: Adjust this when Azerbaijani locales appear on Unix.  */
+       case SUBLANG_AZERI_LATIN: return "az_AZ@latin";
+       case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic";
+       }
+      return "az";
+    case LANG_BASQUE:
+      return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR".  */
+    case LANG_BELARUSIAN: return "be_BY";
+    case LANG_BENGALI: return "bn_IN";
+    case LANG_BULGARIAN: return "bg_BG";
+    case 0x55: /* BURMESE */ return "my_MM";
+    case 0x53: /* CAMBODIAN */ return "km_KH";
+    case LANG_CATALAN: return "ca_ES";
+    case 0x5c: /* CHEROKEE */ return "chr_US";
+    case LANG_CHINESE:
+      switch (sub)
+       {
+       case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW";
+       case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN";
+       case SUBLANG_CHINESE_HONGKONG: return "zh_HK";
+       case SUBLANG_CHINESE_SINGAPORE: return "zh_SG";
+       case SUBLANG_CHINESE_MACAU: return "zh_MO";
+       }
+      return "zh";
+    case LANG_CROATIAN:                /* LANG_CROATIAN == LANG_SERBIAN
+                                * What used to be called Serbo-Croatian
+                                * should really now be two separate
+                                * languages because of political reasons.
+                                * (Says tml, who knows nothing about Serbian
+                                * or Croatian.)
+                                * (I can feel those flames coming already.)
+                                */
+      switch (sub)
+       {
+       case SUBLANG_DEFAULT: return "hr_HR";
+       case SUBLANG_SERBIAN_LATIN: return "sr_YU";
+       case SUBLANG_SERBIAN_CYRILLIC: return "sr_YU@cyrillic";
+       }
+      return "hr";
+    case LANG_CZECH: return "cs_CZ";
+    case LANG_DANISH: return "da_DK";
+    case LANG_DIVEHI: return "div_MV";
+    case LANG_DUTCH:
+      switch (sub)
+       {
+       case SUBLANG_DUTCH: return "nl_NL";
+       case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
+       }
+      return "nl";
+    case 0x66: /* EDO */ return "bin_NG";
+    case LANG_ENGLISH:
+      switch (sub)
+       {
+       /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
+        * English was the language spoken in England.
+        * Oh well.
+        */
+       case SUBLANG_ENGLISH_US: return "en_US";
+       case SUBLANG_ENGLISH_UK: return "en_GB";
+       case SUBLANG_ENGLISH_AUS: return "en_AU";
+       case SUBLANG_ENGLISH_CAN: return "en_CA";
+       case SUBLANG_ENGLISH_NZ: return "en_NZ";
+       case SUBLANG_ENGLISH_EIRE: return "en_IE";
+       case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
+       case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
+       case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
+       case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
+       case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
+       case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
+       case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
+       }
+      return "en";
+    case LANG_ESTONIAN: return "et_EE";
+    case LANG_FAEROESE: return "fo_FO";
+    case LANG_FARSI: return "fa_IR";
+    case LANG_FINNISH: return "fi_FI";
+    case LANG_FRENCH:
+      switch (sub)
+       {
+       case SUBLANG_FRENCH: return "fr_FR";
+       case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
+       case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
+       case SUBLANG_FRENCH_SWISS: return "fr_CH";
+       case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
+       case SUBLANG_FRENCH_MONACO: return "fr_MC";
+       }
+      return "fr";
+    case 0x62: /* FRISIAN */ return "fy_NL";
+    case 0x67: /* FULFULDE */ return "ful_NG";
+    case 0x3c: /* GAELIC */
+      switch (sub)
+       {
+       case 0x01: /* SCOTTISH */ return "gd_GB";
+       case 0x02: /* IRISH */ return "ga_IE";
+       }
+      return "C";
+    case LANG_GALICIAN: return "gl_ES";
+    case LANG_GEORGIAN: return "ka_GE";
+    case LANG_GERMAN:
+      switch (sub)
+       {
+       case SUBLANG_GERMAN: return "de_DE";
+       case SUBLANG_GERMAN_SWISS: return "de_CH";
+       case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
+       case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
+       case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
+       }
+      return "de";
+    case LANG_GREEK: return "el_GR";
+    case 0x74: /* GUARANI */ return "gn_PY";
+    case LANG_GUJARATI: return "gu_IN";
+    case 0x68: /* HAUSA */ return "ha_NG";
+    case 0x75: /* HAWAIIAN */
+      /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
+        or Hawaii Creole English ("cpe_US", 600000 speakers)?  */
+      return "cpe_US";
+    case LANG_HEBREW: return "he_IL";
+    case LANG_HINDI: return "hi_IN";
+    case LANG_HUNGARIAN: return "hu_HU";
+    case 0x69: /* IBIBIO */ return "nic_NG";
+    case LANG_ICELANDIC: return "is_IS";
+    case 0x70: /* IGBO */ return "ibo_NG";
+    case LANG_INDONESIAN: return "id_ID";
+    case 0x5d: /* INUKTITUT */ return "iu_CA";
+    case LANG_ITALIAN:
+      switch (sub)
+       {
+       case SUBLANG_ITALIAN: return "it_IT";
+       case SUBLANG_ITALIAN_SWISS: return "it_CH";
+       }
+      return "it";
+    case LANG_JAPANESE: return "ja_JP";
+    case LANG_KANNADA: return "kn_IN";
+    case 0x71: /* KANURI */ return "kau_NG";
+    case LANG_KASHMIRI:
+      switch (sub)
+       {
+       case SUBLANG_DEFAULT: return "ks_PK";
+       case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
+       }
+      return "ks";
+    case LANG_KAZAK: return "kk_KZ";
+    case LANG_KONKANI:
+      /* FIXME: Adjust this when such locales appear on Unix.  */
+      return "kok_IN";
+    case LANG_KOREAN: return "ko_KR";
+    case LANG_KYRGYZ: return "ky_KG";
+    case 0x54: /* LAO */ return "lo_LA";
+    case 0x76: /* LATIN */ return "la_VA";
+    case LANG_LATVIAN: return "lv_LV";
+    case LANG_LITHUANIAN: return "lt_LT";
+    case LANG_MACEDONIAN: return "mk_MK";
+    case LANG_MALAY:
+      switch (sub)
+       {
+       case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
+       case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
+       }
+      return "ms";
+    case LANG_MALAYALAM: return "ml_IN";
+    case 0x3a: /* MALTESE */ return "mt_MT";
+    case LANG_MANIPURI:
+      /* FIXME: Adjust this when such locales appear on Unix.  */
+      return "mni_IN";
+    case LANG_MARATHI: return "mr_IN";
+    case LANG_MONGOLIAN:
+      return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN".  */
+    case LANG_NEPALI:
+      switch (sub)
+       {
+       case SUBLANG_DEFAULT: return "ne_NP";
+       case SUBLANG_NEPALI_INDIA: return "ne_IN";
+       }
+      return "ne";
+    case LANG_NORWEGIAN:
+      switch (sub)
+       {
+       case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO";
+       case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
+       }
+      return "no";
+    case LANG_ORIYA: return "or_IN";
+    case 0x72: /* OROMO */ return "om_ET";
+    case 0x79: /* PAPIAMENTU */ return "pap_AN";
+    case 0x63: /* PASHTO */
+      return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF".  */
+    case LANG_POLISH: return "pl_PL";
+    case LANG_PORTUGUESE:
+      switch (sub)
+       {
+       case SUBLANG_PORTUGUESE: return "pt_PT";
+       /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
+          Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
+       case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
+       }
+      return "pt";
+    case LANG_PUNJABI: return "pa_IN";
+    case 0x17: /* RHAETO-ROMANCE */ return "rm_CH";
+    case LANG_ROMANIAN: return "ro_RO";
+    case LANG_RUSSIAN:
+      return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA".  */
+    case 0x3b: /* SAMI */ return "se_NO";
+    case LANG_SANSKRIT: return "sa_IN";
+    case LANG_SINDHI: return "sd";
+    case 0x5b: /* SINHALESE */ return "si_LK";
+    case LANG_SLOVAK: return "sk_SK";
+    case LANG_SLOVENIAN: return "sl_SI";
+    case 0x77: /* SOMALI */ return "so_SO";
+    case LANG_SORBIAN:
+      /* FIXME: Adjust this when such locales appear on Unix.  */
+      return "wen_DE";
+    case LANG_SPANISH:
+      switch (sub)
+       {
+       case SUBLANG_SPANISH: return "es_ES";
+       case SUBLANG_SPANISH_MEXICAN: return "es_MX";
+       case SUBLANG_SPANISH_MODERN:
+         return "es_ES@modern";        /* not seen on Unix */
+       case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
+       case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
+       case SUBLANG_SPANISH_PANAMA: return "es_PA";
+       case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
+       case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
+       case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
+       case SUBLANG_SPANISH_PERU: return "es_PE";
+       case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
+       case SUBLANG_SPANISH_ECUADOR: return "es_EC";
+       case SUBLANG_SPANISH_CHILE: return "es_CL";
+       case SUBLANG_SPANISH_URUGUAY: return "es_UY";
+       case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
+       case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
+       case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
+       case SUBLANG_SPANISH_HONDURAS: return "es_HN";
+       case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
+       case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
+       }
+      return "es";
+    case 0x30: /* SUTU */ return "bnt_TZ";
+    case LANG_SWAHILI: return "sw_KE";
+    case LANG_SWEDISH:
+      switch (sub)
+       {
+       case SUBLANG_DEFAULT: return "sv_SE";
+       case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
+       }
+      return "sv";
+    case LANG_SYRIAC: return "syr_TR"; /* An extinct language.  */
+    case 0x64: /* TAGALOG */ return "tl_PH";
+    case 0x28: /* TAJIK */ return "tg_TJ";
+    case 0x5f: /* TAMAZIGHT */ return "ber_MA";
+    case LANG_TAMIL:
+      return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG".  */
+    case LANG_TATAR: return "tt_RU";
+    case LANG_TELUGU: return "te_IN";
+    case LANG_THAI: return "th_TH";
+    case 0x51: /* TIBETAN */ return "bo_CN";
+    case 0x73: /* TIGRINYA */ return "ti_ET";
+    case 0x31: /* TSONGA */ return "ts_ZA";
+    case LANG_TURKISH: return "tr_TR";
+    case 0x42: /* TURKMEN */ return "tk_TM";
+    case LANG_UKRAINIAN: return "uk_UA";
+    case LANG_URDU:
+      switch (sub)
+       {
+       case SUBLANG_URDU_PAKISTAN: return "ur_PK";
+       case SUBLANG_URDU_INDIA: return "ur_IN";
+       }
+      return "ur";
+    case LANG_UZBEK:
+      switch (sub)
+       {
+       /* FIXME: Adjust this when Uzbek locales appear on Unix.  */
+       case SUBLANG_UZBEK_LATIN: return "uz_UZ@latin";
+       case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic";
+       }
+      return "uz";
+    case 0x33: /* VENDA */ return "ven_ZA";
+    case LANG_VIETNAMESE: return "vi_VN";
+    case 0x52: /* WELSH */ return "cy_GB";
+    case 0x34: /* XHOSA */ return "xh_ZA";
+    case 0x78: /* YI */ return "sit_CN";
+    case 0x3d: /* YIDDISH */ return "yi_IL";
+    case 0x6a: /* YORUBA */ return "yo_NG";
+    case 0x35: /* ZULU */ return "zu_ZA";
+    default: return "C";
+    }
+
+#endif
+}
diff --git a/lib/intl/log.c b/lib/intl/log.c
new file mode 100644 (file)
index 0000000..9c84791
--- /dev/null
@@ -0,0 +1,104 @@
+/* Log file output.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Print an ASCII string with quotes and escape sequences where needed.  */
+static void
+print_escaped (stream, str)
+     FILE *stream;
+     const char *str;
+{
+  putc ('"', stream);
+  for (; *str != '\0'; str++)
+    if (*str == '\n')
+      {
+       fputs ("\\n\"", stream);
+       if (str[1] == '\0')
+         return;
+       fputs ("\n\"", stream);
+      }
+    else
+      {
+       if (*str == '"' || *str == '\\')
+         putc ('\\', stream);
+       putc (*str, stream);
+      }
+  putc ('"', stream);
+}
+
+/* Add to the log file an entry denoting a failed translation.  */
+void
+_nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural)
+     const char *logfilename;
+     const char *domainname;
+     const char *msgid1;
+     const char *msgid2;
+     int plural;
+{
+  static char *last_logfilename = NULL;
+  static FILE *last_logfile = NULL;
+  FILE *logfile;
+
+  /* Can we reuse the last opened logfile?  */
+  if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0)
+    {
+      /* Close the last used logfile.  */
+      if (last_logfilename != NULL)
+       {
+         if (last_logfile != NULL)
+           {
+             fclose (last_logfile);
+             last_logfile = NULL;
+           }
+         free (last_logfilename);
+         last_logfilename = NULL;
+       }
+      /* Open the logfile.  */
+      last_logfilename = (char *) malloc (strlen (logfilename) + 1);
+      if (last_logfilename == NULL)
+       return;
+      strcpy (last_logfilename, logfilename);
+      last_logfile = fopen (logfilename, "a");
+      if (last_logfile == NULL)
+       return;
+    }
+  logfile = last_logfile;
+
+  fprintf (logfile, "domain ");
+  print_escaped (logfile, domainname);
+  fprintf (logfile, "\nmsgid ");
+  print_escaped (logfile, msgid1);
+  if (plural)
+    {
+      fprintf (logfile, "\nmsgid_plural ");
+      print_escaped (logfile, msgid2);
+      fprintf (logfile, "\nmsgstr[0] \"\"\n");
+    }
+  else
+    fprintf (logfile, "\nmsgstr \"\"\n");
+  putc ('\n', logfile);
+}
diff --git a/lib/intl/ngettext.c b/lib/intl/ngettext.c
new file mode 100644 (file)
index 0000000..17a27f4
--- /dev/null
@@ -0,0 +1,68 @@
+/* Implementation of ngettext(3) function.
+   Copyright (C) 1995, 1997, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h>           /* Just for NULL.  */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+#include <locale.h>
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define NGETTEXT __ngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define NGETTEXT libintl_ngettext
+# define DCNGETTEXT libintl_dcngettext
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+char *
+NGETTEXT (msgid1, msgid2, n)
+     const char *msgid1;
+     const char *msgid2;
+     unsigned long int n;
+{
+  return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__ngettext, ngettext);
+#endif
diff --git a/lib/intl/os2compat.c b/lib/intl/os2compat.c
new file mode 100644 (file)
index 0000000..c8dc33e
--- /dev/null
@@ -0,0 +1,98 @@
+/* OS/2 compatibility functions.
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#define OS2_AWARE
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+
+/* A version of getenv() that works from DLLs */
+extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue);
+
+char *
+_nl_getenv (const char *name)
+{
+  unsigned char *value;
+  if (DosScanEnv (name, &value))
+    return NULL;
+  else
+    return value;
+}
+
+/* A fixed size buffer.  */
+char libintl_nl_default_dirname[MAXPATHLEN+1];
+
+char *_nlos2_libdir = NULL;
+char *_nlos2_localealiaspath = NULL;
+char *_nlos2_localedir = NULL;
+
+static __attribute__((constructor)) void
+nlos2_initialize ()
+{
+  char *root = getenv ("UNIXROOT");
+  char *gnulocaledir = getenv ("GNULOCALEDIR");
+
+  _nlos2_libdir = gnulocaledir;
+  if (!_nlos2_libdir)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1);
+          memcpy (_nlos2_libdir, root, sl);
+          memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1);
+        }
+      else
+        _nlos2_libdir = LIBDIR;
+    }
+
+  _nlos2_localealiaspath = gnulocaledir;
+  if (!_nlos2_localealiaspath)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1);
+          memcpy (_nlos2_localealiaspath, root, sl);
+          memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1);
+        }
+     else
+        _nlos2_localealiaspath = LOCALE_ALIAS_PATH;
+    }
+
+  _nlos2_localedir = gnulocaledir;
+  if (!_nlos2_localedir)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1);
+          memcpy (_nlos2_localedir, root, sl);
+          memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1);
+        }
+      else
+        _nlos2_localedir = LOCALEDIR;
+    }
+
+  if (strlen (_nlos2_localedir) <= MAXPATHLEN)
+    strcpy (libintl_nl_default_dirname, _nlos2_localedir);
+}
diff --git a/lib/intl/os2compat.h b/lib/intl/os2compat.h
new file mode 100644 (file)
index 0000000..4f74e8c
--- /dev/null
@@ -0,0 +1,46 @@
+/* OS/2 compatibility defines.
+   This file is intended to be included from config.h
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* When included from os2compat.h we need all the original definitions */
+#ifndef OS2_AWARE
+
+#undef LIBDIR
+#define LIBDIR                 _nlos2_libdir
+extern char *_nlos2_libdir;
+
+#undef LOCALEDIR
+#define LOCALEDIR              _nlos2_localedir
+extern char *_nlos2_localedir;
+
+#undef LOCALE_ALIAS_PATH
+#define LOCALE_ALIAS_PATH      _nlos2_localealiaspath
+extern char *_nlos2_localealiaspath;
+
+#endif
+
+#undef HAVE_STRCASECMP
+#define HAVE_STRCASECMP 1
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+
+/* We have our own getenv() which works even if library is compiled as DLL */
+#define getenv _nl_getenv
+
+/* Older versions of gettext used -1 as the value of LC_MESSAGES */
+#define LC_MESSAGES_COMPAT (-1)
diff --git a/lib/intl/osdep.c b/lib/intl/osdep.c
new file mode 100644 (file)
index 0000000..b372598
--- /dev/null
@@ -0,0 +1,24 @@
+/* OS dependent parts of libintl.
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#if defined __EMX__
+# include "os2compat.c"
+#else
+/* Avoid AIX compiler warning.  */
+typedef int dummy;
+#endif
diff --git a/lib/intl/plural-exp.c b/lib/intl/plural-exp.c
new file mode 100644 (file)
index 0000000..c937c01
--- /dev/null
@@ -0,0 +1,156 @@
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "plural-exp.h"
+
+#if (defined __GNUC__ && !defined __APPLE_CC__) \
+    || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+
+/* These structs are the constant expression for the germanic plural
+   form determination.  It represents the expression  "n != 1".  */
+static const struct expression plvar =
+{
+  .nargs = 0,
+  .operation = var,
+};
+static const struct expression plone =
+{
+  .nargs = 0,
+  .operation = num,
+  .val =
+  {
+    .num = 1
+  }
+};
+struct expression GERMANIC_PLURAL =
+{
+  .nargs = 2,
+  .operation = not_equal,
+  .val =
+  {
+    .args =
+    {
+      [0] = (struct expression *) &plvar,
+      [1] = (struct expression *) &plone
+    }
+  }
+};
+
+# define INIT_GERMANIC_PLURAL()
+
+#else
+
+/* For compilers without support for ISO C 99 struct/union initializers:
+   Initialization at run-time.  */
+
+static struct expression plvar;
+static struct expression plone;
+struct expression GERMANIC_PLURAL;
+
+static void
+init_germanic_plural ()
+{
+  if (plone.val.num == 0)
+    {
+      plvar.nargs = 0;
+      plvar.operation = var;
+
+      plone.nargs = 0;
+      plone.operation = num;
+      plone.val.num = 1;
+
+      GERMANIC_PLURAL.nargs = 2;
+      GERMANIC_PLURAL.operation = not_equal;
+      GERMANIC_PLURAL.val.args[0] = &plvar;
+      GERMANIC_PLURAL.val.args[1] = &plone;
+    }
+}
+
+# define INIT_GERMANIC_PLURAL() init_germanic_plural ()
+
+#endif
+
+void
+internal_function
+EXTRACT_PLURAL_EXPRESSION (nullentry, pluralp, npluralsp)
+     const char *nullentry;
+     struct expression **pluralp;
+     unsigned long int *npluralsp;
+{
+  if (nullentry != NULL)
+    {
+      const char *plural;
+      const char *nplurals;
+
+      plural = strstr (nullentry, "plural=");
+      nplurals = strstr (nullentry, "nplurals=");
+      if (plural == NULL || nplurals == NULL)
+       goto no_plural;
+      else
+       {
+         char *endp;
+         unsigned long int n;
+         struct parse_args args;
+
+         /* First get the number.  */
+         nplurals += 9;
+         while (*nplurals != '\0' && isspace ((unsigned char) *nplurals))
+           ++nplurals;
+         if (!(*nplurals >= '0' && *nplurals <= '9'))
+           goto no_plural;
+#if defined HAVE_STRTOUL || defined _LIBC
+         n = strtoul (nplurals, &endp, 10);
+#else
+         for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++)
+           n = n * 10 + (*endp - '0');
+#endif
+         if (nplurals == endp)
+           goto no_plural;
+         *npluralsp = n;
+
+         /* Due to the restrictions bison imposes onto the interface of the
+            scanner function we have to put the input string and the result
+            passed up from the parser into the same structure which address
+            is passed down to the parser.  */
+         plural += 7;
+         args.cp = plural;
+         if (PLURAL_PARSE (&args) != 0)
+           goto no_plural;
+         *pluralp = args.res;
+       }
+    }
+  else
+    {
+      /* By default we are using the Germanic form: singular form only
+         for `one', the plural form otherwise.  Yes, this is also what
+         English is using since English is a Germanic language.  */
+    no_plural:
+      INIT_GERMANIC_PLURAL ();
+      *pluralp = &GERMANIC_PLURAL;
+      *npluralsp = 2;
+    }
+}
diff --git a/lib/intl/plural-exp.h b/lib/intl/plural-exp.h
new file mode 100644 (file)
index 0000000..9e5d165
--- /dev/null
@@ -0,0 +1,126 @@
+/* Expression parsing and evaluation for plural form selection.
+   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _PLURAL_EXP_H
+#define _PLURAL_EXP_H
+
+#ifndef PARAMS
+# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES
+#  define PARAMS(args) args
+# else
+#  define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+
+/* This is the representation of the expressions to determine the
+   plural form.  */
+struct expression
+{
+  int nargs;                   /* Number of arguments.  */
+  enum operator
+  {
+    /* Without arguments:  */
+    var,                       /* The variable "n".  */
+    num,                       /* Decimal number.  */
+    /* Unary operators:  */
+    lnot,                      /* Logical NOT.  */
+    /* Binary operators:  */
+    mult,                      /* Multiplication.  */
+    divide,                    /* Division.  */
+    module,                    /* Modulo operation.  */
+    plus,                      /* Addition.  */
+    minus,                     /* Subtraction.  */
+    less_than,                 /* Comparison.  */
+    greater_than,              /* Comparison.  */
+    less_or_equal,             /* Comparison.  */
+    greater_or_equal,          /* Comparison.  */
+    equal,                     /* Comparison for equality.  */
+    not_equal,                 /* Comparison for inequality.  */
+    land,                      /* Logical AND.  */
+    lor,                       /* Logical OR.  */
+    /* Ternary operators:  */
+    qmop                       /* Question mark operator.  */
+  } operation;
+  union
+  {
+    unsigned long int num;     /* Number value for `num'.  */
+    struct expression *args[3];        /* Up to three arguments.  */
+  } val;
+};
+
+/* This is the data structure to pass information to the parser and get
+   the result in a thread-safe way.  */
+struct parse_args
+{
+  const char *cp;
+  struct expression *res;
+};
+
+
+/* Names for the libintl functions are a problem.  This source code is used
+   1. in the GNU C Library library,
+   2. in the GNU libintl library,
+   3. in the GNU gettext tools.
+   The function names in each situation must be different, to allow for
+   binary incompatible changes in 'struct expression'.  Furthermore,
+   1. in the GNU C Library library, the names have a __ prefix,
+   2.+3. in the GNU libintl library and in the GNU gettext tools, the names
+         must follow ANSI C and not start with __.
+   So we have to distinguish the three cases.  */
+#ifdef _LIBC
+# define FREE_EXPRESSION __gettext_free_exp
+# define PLURAL_PARSE __gettextparse
+# define GERMANIC_PLURAL __gettext_germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural
+#elif defined (IN_LIBINTL)
+# define FREE_EXPRESSION libintl_gettext_free_exp
+# define PLURAL_PARSE libintl_gettextparse
+# define GERMANIC_PLURAL libintl_gettext_germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural
+#else
+# define FREE_EXPRESSION free_plural_expression
+# define PLURAL_PARSE parse_plural_expression
+# define GERMANIC_PLURAL germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression
+#endif
+
+extern void FREE_EXPRESSION PARAMS ((struct expression *exp))
+     internal_function;
+extern int PLURAL_PARSE PARAMS ((void *arg));
+extern struct expression GERMANIC_PLURAL attribute_hidden;
+extern void EXTRACT_PLURAL_EXPRESSION PARAMS ((const char *nullentry,
+                                              struct expression **pluralp,
+                                              unsigned long int *npluralsp))
+     internal_function;
+
+#if !defined (_LIBC) && !defined (IN_LIBINTL)
+extern unsigned long int plural_eval PARAMS ((struct expression *pexp,
+                                             unsigned long int n));
+#endif
+
+#endif /* _PLURAL_EXP_H */
diff --git a/lib/intl/plural.c b/lib/intl/plural.c
new file mode 100644 (file)
index 0000000..3a4fa20
--- /dev/null
@@ -0,0 +1,1518 @@
+/* A Bison parser, made from plural.y
+   by GNU bison 1.35.  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse __gettextparse
+#define yylex __gettextlex
+#define yyerror __gettexterror
+#define yylval __gettextlval
+#define yychar __gettextchar
+#define yydebug __gettextdebug
+#define yynerrs __gettextnerrs
+# define       EQUOP2  257
+# define       CMPOP2  258
+# define       ADDOP2  259
+# define       MULOP2  260
+# define       NUMBER  261
+
+#line 1 "plural.y"
+
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* The bison generated parser uses alloca.  AIX 3 forces us to put this
+   declaration at the beginning of the file.  The declaration in bison's
+   skeleton file comes too late.  This must come before <config.h>
+   because <config.h> may include arbitrary system headers.  */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "plural-exp.h"
+
+/* The main function generated by the parser is called __gettextparse,
+   but we want it to be called PLURAL_PARSE.  */
+#ifndef _LIBC
+# define __gettextparse PLURAL_PARSE
+#endif
+
+#define YYLEX_PARAM    &((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM  arg
+
+#line 49 "plural.y"
+#ifndef YYSTYPE
+typedef union {
+  unsigned long int num;
+  enum operator op;
+  struct expression *exp;
+} yystype;
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+#line 55 "plural.y"
+
+/* Prototypes for local functions.  */
+static struct expression *new_exp PARAMS ((int nargs, enum operator op,
+                                          struct expression * const *args));
+static inline struct expression *new_exp_0 PARAMS ((enum operator op));
+static inline struct expression *new_exp_1 PARAMS ((enum operator op,
+                                                  struct expression *right));
+static struct expression *new_exp_2 PARAMS ((enum operator op,
+                                            struct expression *left,
+                                            struct expression *right));
+static inline struct expression *new_exp_3 PARAMS ((enum operator op,
+                                                  struct expression *bexp,
+                                                  struct expression *tbranch,
+                                                  struct expression *fbranch));
+static int yylex PARAMS ((YYSTYPE *lval, const char **pexp));
+static void yyerror PARAMS ((const char *str));
+
+/* Allocation of expressions.  */
+
+static struct expression *
+new_exp (nargs, op, args)
+     int nargs;
+     enum operator op;
+     struct expression * const *args;
+{
+  int i;
+  struct expression *newp;
+
+  /* If any of the argument could not be malloc'ed, just return NULL.  */
+  for (i = nargs - 1; i >= 0; i--)
+    if (args[i] == NULL)
+      goto fail;
+
+  /* Allocate a new expression.  */
+  newp = (struct expression *) malloc (sizeof (*newp));
+  if (newp != NULL)
+    {
+      newp->nargs = nargs;
+      newp->operation = op;
+      for (i = nargs - 1; i >= 0; i--)
+       newp->val.args[i] = args[i];
+      return newp;
+    }
+
+ fail:
+  for (i = nargs - 1; i >= 0; i--)
+    FREE_EXPRESSION (args[i]);
+
+  return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (op)
+     enum operator op;
+{
+  return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (op, right)
+     enum operator op;
+     struct expression *right;
+{
+  struct expression *args[1];
+
+  args[0] = right;
+  return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (op, left, right)
+     enum operator op;
+     struct expression *left;
+     struct expression *right;
+{
+  struct expression *args[2];
+
+  args[0] = left;
+  args[1] = right;
+  return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (op, bexp, tbranch, fbranch)
+     enum operator op;
+     struct expression *bexp;
+     struct expression *tbranch;
+     struct expression *fbranch;
+{
+  struct expression *args[3];
+
+  args[0] = bexp;
+  args[1] = tbranch;
+  args[2] = fbranch;
+  return new_exp (3, op, args);
+}
+
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+
+
+#define        YYFINAL         27
+#define        YYFLAG          -32768
+#define        YYNTBASE        16
+
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
+#define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18)
+
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
+static const char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    10,     2,     2,     2,     2,     5,     2,
+      14,    15,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    12,     2,
+       2,     2,     2,     3,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      13,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     4,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     6,     7,     8,
+       9,    11
+};
+
+#if YYDEBUG
+static const short yyprhs[] =
+{
+       0,     0,     2,     8,    12,    16,    20,    24,    28,    32,
+      35,    37,    39
+};
+static const short yyrhs[] =
+{
+      17,     0,    17,     3,    17,    12,    17,     0,    17,     4,
+      17,     0,    17,     5,    17,     0,    17,     6,    17,     0,
+      17,     7,    17,     0,    17,     8,    17,     0,    17,     9,
+      17,     0,    10,    17,     0,    13,     0,    11,     0,    14,
+      17,    15,     0
+};
+
+#endif
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const short yyrline[] =
+{
+       0,   174,   182,   186,   190,   194,   198,   202,   206,   210,
+     214,   218,   223
+};
+#endif
+
+
+#if (YYDEBUG) || defined YYERROR_VERBOSE
+
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
+static const char *const yytname[] =
+{
+  "$", "error", "$undefined.", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2", 
+  "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'", 
+  "start", "exp", 0
+};
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const short yyr1[] =
+{
+       0,    16,    17,    17,    17,    17,    17,    17,    17,    17,
+      17,    17,    17
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const short yyr2[] =
+{
+       0,     1,     5,     3,     3,     3,     3,     3,     3,     2,
+       1,     1,     3
+};
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+   doesn't specify something else to do.  Zero means the default is an
+   error. */
+static const short yydefact[] =
+{
+       0,     0,    11,    10,     0,     1,     9,     0,     0,     0,
+       0,     0,     0,     0,     0,    12,     0,     3,     4,     5,
+       6,     7,     8,     0,     2,     0,     0,     0
+};
+
+static const short yydefgoto[] =
+{
+      25,     5
+};
+
+static const short yypact[] =
+{
+      -9,    -9,-32768,-32768,    -9,    34,-32768,    11,    -9,    -9,
+      -9,    -9,    -9,    -9,    -9,-32768,    24,    39,    43,    16,
+      26,    -3,-32768,    -9,    34,    21,    53,-32768
+};
+
+static const short yypgoto[] =
+{
+  -32768,    -1
+};
+
+
+#define        YYLAST          53
+
+
+static const short yytable[] =
+{
+       6,     1,     2,     7,     3,     4,    14,    16,    17,    18,
+      19,    20,    21,    22,     8,     9,    10,    11,    12,    13,
+      14,    26,    24,    12,    13,    14,    15,     8,     9,    10,
+      11,    12,    13,    14,    13,    14,    23,     8,     9,    10,
+      11,    12,    13,    14,    10,    11,    12,    13,    14,    11,
+      12,    13,    14,    27
+};
+
+static const short yycheck[] =
+{
+       1,    10,    11,     4,    13,    14,     9,     8,     9,    10,
+      11,    12,    13,    14,     3,     4,     5,     6,     7,     8,
+       9,     0,    23,     7,     8,     9,    15,     3,     4,     5,
+       6,     7,     8,     9,     8,     9,    12,     3,     4,     5,
+       6,     7,     8,     9,     5,     6,     7,     8,     9,     6,
+       7,     8,     9,     0
+};
+#define YYPURE 1
+
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/local/share/bison/bison.simple"
+
+/* Skeleton output parser for bison,
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 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-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser when
+   the %semantic_parser declaration is not specified in the grammar.
+   It was written by Richard Stallman by simplifying the hairy parser
+   used when %semantic_parser is specified.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+# if YYLSP_NEEDED
+  YYLTYPE yyls;
+# endif
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# if YYLSP_NEEDED
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \
+      + 2 * YYSTACK_GAP_MAX)
+# else
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAX)
+# endif
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];            \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
+#endif
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT        goto yyabortlab
+#define YYERROR                goto yyerrlab1
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL         goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).
+
+   When YYLLOC_DEFAULT is run, CURRENT is set the location of the
+   first token.  By default, to implement support for ranges, extend
+   its range to the last symbol.  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)               \
+   Current.last_line   = Rhs[N].last_line;     \
+   Current.last_column = Rhs[N].last_column;
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#if YYPURE
+# if YYLSP_NEEDED
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, &yylloc, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval, &yylloc)
+#  endif
+# else /* !YYLSP_NEEDED */
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval)
+#  endif
+# endif /* !YYLSP_NEEDED */
+#else /* !YYPURE */
+# define YYLEX                 yylex ()
+#endif /* !YYPURE */
+
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+\f
+#ifdef YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+#endif
+\f
+#line 315 "/usr/local/share/bison/bison.simple"
+
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
+   variables are global, or local to YYPARSE.  */
+
+#define YY_DECL_NON_LSP_VARIABLES                      \
+/* The lookahead symbol.  */                           \
+int yychar;                                            \
+                                                       \
+/* The semantic value of the lookahead symbol. */      \
+YYSTYPE yylval;                                                \
+                                                       \
+/* Number of parse errors so far.  */                  \
+int yynerrs;
+
+#if YYLSP_NEEDED
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES                      \
+                                               \
+/* Location data for the lookahead symbol.  */ \
+YYLTYPE yylloc;
+#else
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES
+#endif
+
+
+/* If nonreentrant, generate the variables here. */
+
+#if !YYPURE
+YY_DECL_VARIABLES
+#endif  /* !YYPURE */
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  /* If reentrant, generate the variables here. */
+#if YYPURE
+  YY_DECL_VARIABLES
+#endif  /* !YYPURE */
+
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack. */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+#if YYLSP_NEEDED
+  /* The location stack.  */
+  YYLTYPE yylsa[YYINITDEPTH];
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+#endif
+
+#if YYLSP_NEEDED
+# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+# define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+#if YYLSP_NEEDED
+  YYLTYPE yyloc;
+#endif
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule. */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+#if YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  */
+# if YYLSP_NEEDED
+       YYLTYPE *yyls1 = yyls;
+       /* This used to be a conditional around just the two extra args,
+          but that might be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yyls1, yysize * sizeof (*yylsp),
+                   &yystacksize);
+       yyls = yyls1;
+# else
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yystacksize);
+# endif
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+# if YYLSP_NEEDED
+       YYSTACK_RELOCATE (yyls);
+# endif
+# undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+#if YYLSP_NEEDED
+      yylsp = yyls + yysize - 1;
+#endif
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)             /* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+#if YYDEBUG
+     /* We have to keep this `#if YYDEBUG', since we use variables
+       which are defined only if `YYDEBUG' is set.  */
+      if (yydebug)
+       {
+         YYFPRINTF (stderr, "Next token is %d (%s",
+                    yychar, yytname[yychar1]);
+         /* Give the individual parser a way to print the precise
+            meaning of a token, for further debugging info.  */
+# ifdef YYPRINT
+         YYPRINT (stderr, yychar, yylval);
+# endif
+         YYFPRINTF (stderr, ")\n");
+       }
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to the semantic value of
+     the lookahead token.  This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+#if YYLSP_NEEDED
+  /* Similarly for the default location.  Let the user run additional
+     commands if for instance locations are ranges.  */
+  yyloc = yylsp[1-yylen];
+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
+#endif
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+  switch (yyn) {
+
+case 1:
+#line 175 "plural.y"
+{
+           if (yyvsp[0].exp == NULL)
+             YYABORT;
+           ((struct parse_args *) arg)->res = yyvsp[0].exp;
+         }
+    break;
+case 2:
+#line 183 "plural.y"
+{
+           yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 3:
+#line 187 "plural.y"
+{
+           yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 4:
+#line 191 "plural.y"
+{
+           yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 5:
+#line 195 "plural.y"
+{
+           yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 6:
+#line 199 "plural.y"
+{
+           yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 7:
+#line 203 "plural.y"
+{
+           yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 8:
+#line 207 "plural.y"
+{
+           yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 9:
+#line 211 "plural.y"
+{
+           yyval.exp = new_exp_1 (lnot, yyvsp[0].exp);
+         }
+    break;
+case 10:
+#line 215 "plural.y"
+{
+           yyval.exp = new_exp_0 (var);
+         }
+    break;
+case 11:
+#line 219 "plural.y"
+{
+           if ((yyval.exp = new_exp_0 (num)) != NULL)
+             yyval.exp->val.num = yyvsp[0].num;
+         }
+    break;
+case 12:
+#line 224 "plural.y"
+{
+           yyval.exp = yyvsp[-1].exp;
+         }
+    break;
+}
+
+#line 705 "/usr/local/share/bison/bison.simple"
+
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#if YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+#if YYLSP_NEEDED
+  *++yylsp = yyloc;
+#endif
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* defined (YYERROR_VERBOSE) */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*--------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action |
+`--------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+       YYABORT;
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;             /* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+
+/*-------------------------------------------------------------------.
+| yyerrdefault -- current state does not do anything special for the |
+| error token.                                                       |
+`-------------------------------------------------------------------*/
+yyerrdefault:
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+
+  /* If its default is to accept any token, ok.  Otherwise pop it.  */
+  yyn = yydefact[yystate];
+  if (yyn)
+    goto yydefault;
+#endif
+
+
+/*---------------------------------------------------------------.
+| yyerrpop -- pop the current state because it cannot handle the |
+| error token                                                    |
+`---------------------------------------------------------------*/
+yyerrpop:
+  if (yyssp == yyss)
+    YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#if YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "Error: state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+/*--------------.
+| yyerrhandle.  |
+`--------------*/
+yyerrhandle:
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+/*---------------------------------------------.
+| yyoverflowab -- parser overflow comes here.  |
+`---------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+#line 229 "plural.y"
+
+
+void
+internal_function
+FREE_EXPRESSION (exp)
+     struct expression *exp;
+{
+  if (exp == NULL)
+    return;
+
+  /* Handle the recursive case.  */
+  switch (exp->nargs)
+    {
+    case 3:
+      FREE_EXPRESSION (exp->val.args[2]);
+      /* FALLTHROUGH */
+    case 2:
+      FREE_EXPRESSION (exp->val.args[1]);
+      /* FALLTHROUGH */
+    case 1:
+      FREE_EXPRESSION (exp->val.args[0]);
+      /* FALLTHROUGH */
+    default:
+      break;
+    }
+
+  free (exp);
+}
+
+
+static int
+yylex (lval, pexp)
+     YYSTYPE *lval;
+     const char **pexp;
+{
+  const char *exp = *pexp;
+  int result;
+
+  while (1)
+    {
+      if (exp[0] == '\0')
+       {
+         *pexp = exp;
+         return YYEOF;
+       }
+
+      if (exp[0] != ' ' && exp[0] != '\t')
+       break;
+
+      ++exp;
+    }
+
+  result = *exp++;
+  switch (result)
+    {
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+      {
+       unsigned long int n = result - '0';
+       while (exp[0] >= '0' && exp[0] <= '9')
+         {
+           n *= 10;
+           n += exp[0] - '0';
+           ++exp;
+         }
+       lval->num = n;
+       result = NUMBER;
+      }
+      break;
+
+    case '=':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = equal;
+         result = EQUOP2;
+       }
+      else
+       result = YYERRCODE;
+      break;
+
+    case '!':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = not_equal;
+         result = EQUOP2;
+       }
+      break;
+
+    case '&':
+    case '|':
+      if (exp[0] == result)
+       ++exp;
+      else
+       result = YYERRCODE;
+      break;
+
+    case '<':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = less_or_equal;
+       }
+      else
+       lval->op = less_than;
+      result = CMPOP2;
+      break;
+
+    case '>':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = greater_or_equal;
+       }
+      else
+       lval->op = greater_than;
+      result = CMPOP2;
+      break;
+
+    case '*':
+      lval->op = mult;
+      result = MULOP2;
+      break;
+
+    case '/':
+      lval->op = divide;
+      result = MULOP2;
+      break;
+
+    case '%':
+      lval->op = module;
+      result = MULOP2;
+      break;
+
+    case '+':
+      lval->op = plus;
+      result = ADDOP2;
+      break;
+
+    case '-':
+      lval->op = minus;
+      result = ADDOP2;
+      break;
+
+    case 'n':
+    case '?':
+    case ':':
+    case '(':
+    case ')':
+      /* Nothing, just return the character.  */
+      break;
+
+    case ';':
+    case '\n':
+    case '\0':
+      /* Be safe and let the user call this function again.  */
+      --exp;
+      result = YYEOF;
+      break;
+
+    default:
+      result = YYERRCODE;
+#if YYDEBUG != 0
+      --exp;
+#endif
+      break;
+    }
+
+  *pexp = exp;
+
+  return result;
+}
+
+
+static void
+yyerror (str)
+     const char *str;
+{
+  /* Do nothing.  We don't print error messages here.  */
+}
diff --git a/lib/intl/plural.y b/lib/intl/plural.y
new file mode 100644 (file)
index 0000000..616b7c1
--- /dev/null
@@ -0,0 +1,409 @@
+%{
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+/* The bison generated parser uses alloca.  AIX 3 forces us to put this
+   declaration at the beginning of the file.  The declaration in bison's
+   skeleton file comes too late.  This must come before <config.h>
+   because <config.h> may include arbitrary system headers.  */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "plural-exp.h"
+
+/* The main function generated by the parser is called __gettextparse,
+   but we want it to be called PLURAL_PARSE.  */
+#ifndef _LIBC
+# define __gettextparse PLURAL_PARSE
+#endif
+
+#define YYLEX_PARAM    &((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM  arg
+%}
+%pure_parser
+%expect 7
+
+%union {
+  unsigned long int num;
+  enum operator op;
+  struct expression *exp;
+}
+
+%{
+/* Prototypes for local functions.  */
+static struct expression *new_exp PARAMS ((int nargs, enum operator op,
+                                          struct expression * const *args));
+static inline struct expression *new_exp_0 PARAMS ((enum operator op));
+static inline struct expression *new_exp_1 PARAMS ((enum operator op,
+                                                  struct expression *right));
+static struct expression *new_exp_2 PARAMS ((enum operator op,
+                                            struct expression *left,
+                                            struct expression *right));
+static inline struct expression *new_exp_3 PARAMS ((enum operator op,
+                                                  struct expression *bexp,
+                                                  struct expression *tbranch,
+                                                  struct expression *fbranch));
+static int yylex PARAMS ((YYSTYPE *lval, const char **pexp));
+static void yyerror PARAMS ((const char *str));
+
+/* Allocation of expressions.  */
+
+static struct expression *
+new_exp (nargs, op, args)
+     int nargs;
+     enum operator op;
+     struct expression * const *args;
+{
+  int i;
+  struct expression *newp;
+
+  /* If any of the argument could not be malloc'ed, just return NULL.  */
+  for (i = nargs - 1; i >= 0; i--)
+    if (args[i] == NULL)
+      goto fail;
+
+  /* Allocate a new expression.  */
+  newp = (struct expression *) malloc (sizeof (*newp));
+  if (newp != NULL)
+    {
+      newp->nargs = nargs;
+      newp->operation = op;
+      for (i = nargs - 1; i >= 0; i--)
+       newp->val.args[i] = args[i];
+      return newp;
+    }
+
+ fail:
+  for (i = nargs - 1; i >= 0; i--)
+    FREE_EXPRESSION (args[i]);
+
+  return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (op)
+     enum operator op;
+{
+  return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (op, right)
+     enum operator op;
+     struct expression *right;
+{
+  struct expression *args[1];
+
+  args[0] = right;
+  return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (op, left, right)
+     enum operator op;
+     struct expression *left;
+     struct expression *right;
+{
+  struct expression *args[2];
+
+  args[0] = left;
+  args[1] = right;
+  return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (op, bexp, tbranch, fbranch)
+     enum operator op;
+     struct expression *bexp;
+     struct expression *tbranch;
+     struct expression *fbranch;
+{
+  struct expression *args[3];
+
+  args[0] = bexp;
+  args[1] = tbranch;
+  args[2] = fbranch;
+  return new_exp (3, op, args);
+}
+
+%}
+
+/* This declares that all operators have the same associativity and the
+   precedence order as in C.  See [Harbison, Steele: C, A Reference Manual].
+   There is no unary minus and no bitwise operators.
+   Operators with the same syntactic behaviour have been merged into a single
+   token, to save space in the array generated by bison.  */
+%right '?'             /*   ?          */
+%left '|'              /*   ||         */
+%left '&'              /*   &&         */
+%left EQUOP2           /*   == !=      */
+%left CMPOP2           /*   < > <= >=  */
+%left ADDOP2           /*   + -        */
+%left MULOP2           /*   * / %      */
+%right '!'             /*   !          */
+
+%token <op> EQUOP2 CMPOP2 ADDOP2 MULOP2
+%token <num> NUMBER
+%type <exp> exp
+
+%%
+
+start:   exp
+         {
+           if ($1 == NULL)
+             YYABORT;
+           ((struct parse_args *) arg)->res = $1;
+         }
+       ;
+
+exp:     exp '?' exp ':' exp
+         {
+           $$ = new_exp_3 (qmop, $1, $3, $5);
+         }
+       | exp '|' exp
+         {
+           $$ = new_exp_2 (lor, $1, $3);
+         }
+       | exp '&' exp
+         {
+           $$ = new_exp_2 (land, $1, $3);
+         }
+       | exp EQUOP2 exp
+         {
+           $$ = new_exp_2 ($2, $1, $3);
+         }
+       | exp CMPOP2 exp
+         {
+           $$ = new_exp_2 ($2, $1, $3);
+         }
+       | exp ADDOP2 exp
+         {
+           $$ = new_exp_2 ($2, $1, $3);
+         }
+       | exp MULOP2 exp
+         {
+           $$ = new_exp_2 ($2, $1, $3);
+         }
+       | '!' exp
+         {
+           $$ = new_exp_1 (lnot, $2);
+         }
+       | 'n'
+         {
+           $$ = new_exp_0 (var);
+         }
+       | NUMBER
+         {
+           if (($$ = new_exp_0 (num)) != NULL)
+             $$->val.num = $1;
+         }
+       | '(' exp ')'
+         {
+           $$ = $2;
+         }
+       ;
+
+%%
+
+void
+internal_function
+FREE_EXPRESSION (exp)
+     struct expression *exp;
+{
+  if (exp == NULL)
+    return;
+
+  /* Handle the recursive case.  */
+  switch (exp->nargs)
+    {
+    case 3:
+      FREE_EXPRESSION (exp->val.args[2]);
+      /* FALLTHROUGH */
+    case 2:
+      FREE_EXPRESSION (exp->val.args[1]);
+      /* FALLTHROUGH */
+    case 1:
+      FREE_EXPRESSION (exp->val.args[0]);
+      /* FALLTHROUGH */
+    default:
+      break;
+    }
+
+  free (exp);
+}
+
+
+static int
+yylex (lval, pexp)
+     YYSTYPE *lval;
+     const char **pexp;
+{
+  const char *exp = *pexp;
+  int result;
+
+  while (1)
+    {
+      if (exp[0] == '\0')
+       {
+         *pexp = exp;
+         return YYEOF;
+       }
+
+      if (exp[0] != ' ' && exp[0] != '\t')
+       break;
+
+      ++exp;
+    }
+
+  result = *exp++;
+  switch (result)
+    {
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+      {
+       unsigned long int n = result - '0';
+       while (exp[0] >= '0' && exp[0] <= '9')
+         {
+           n *= 10;
+           n += exp[0] - '0';
+           ++exp;
+         }
+       lval->num = n;
+       result = NUMBER;
+      }
+      break;
+
+    case '=':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = equal;
+         result = EQUOP2;
+       }
+      else
+       result = YYERRCODE;
+      break;
+
+    case '!':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = not_equal;
+         result = EQUOP2;
+       }
+      break;
+
+    case '&':
+    case '|':
+      if (exp[0] == result)
+       ++exp;
+      else
+       result = YYERRCODE;
+      break;
+
+    case '<':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = less_or_equal;
+       }
+      else
+       lval->op = less_than;
+      result = CMPOP2;
+      break;
+
+    case '>':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = greater_or_equal;
+       }
+      else
+       lval->op = greater_than;
+      result = CMPOP2;
+      break;
+
+    case '*':
+      lval->op = mult;
+      result = MULOP2;
+      break;
+
+    case '/':
+      lval->op = divide;
+      result = MULOP2;
+      break;
+
+    case '%':
+      lval->op = module;
+      result = MULOP2;
+      break;
+
+    case '+':
+      lval->op = plus;
+      result = ADDOP2;
+      break;
+
+    case '-':
+      lval->op = minus;
+      result = ADDOP2;
+      break;
+
+    case 'n':
+    case '?':
+    case ':':
+    case '(':
+    case ')':
+      /* Nothing, just return the character.  */
+      break;
+
+    case ';':
+    case '\n':
+    case '\0':
+      /* Be safe and let the user call this function again.  */
+      --exp;
+      result = YYEOF;
+      break;
+
+    default:
+      result = YYERRCODE;
+#if YYDEBUG != 0
+      --exp;
+#endif
+      break;
+    }
+
+  *pexp = exp;
+
+  return result;
+}
+
+
+static void
+yyerror (str)
+     const char *str;
+{
+  /* Do nothing.  We don't print error messages here.  */
+}
diff --git a/lib/intl/ref-add.sin b/lib/intl/ref-add.sin
new file mode 100644 (file)
index 0000000..167374e
--- /dev/null
@@ -0,0 +1,31 @@
+# Add this package to a list of references stored in a text file.
+#
+#   Copyright (C) 2000 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+#   USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+  s/# Packages using this file://
+  ta
+  :a
+  s/ @PACKAGE@ / @PACKAGE@ /
+  tb
+  s/ $/ @PACKAGE@ /
+  :b
+  s/^/# Packages using this file:/
+}
diff --git a/lib/intl/ref-del.sin b/lib/intl/ref-del.sin
new file mode 100644 (file)
index 0000000..613cf37
--- /dev/null
@@ -0,0 +1,26 @@
+# Remove this package from a list of references stored in a text file.
+#
+#   Copyright (C) 2000 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+#   USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+  s/# Packages using this file://
+  s/ @PACKAGE@ / /
+  s/^/# Packages using this file:/
+}
diff --git a/lib/intl/relocatable.c b/lib/intl/relocatable.c
new file mode 100644 (file)
index 0000000..16f79a5
--- /dev/null
@@ -0,0 +1,439 @@
+/* Provide relocatable packages.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+
+/* Tell glibc's <stdio.h> to provide a prototype for getline().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE   1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* Specification.  */
+#include "relocatable.h"
+
+#if ENABLE_RELOCATABLE
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef NO_XMALLOC
+# define xmalloc malloc
+#else
+# include "xmalloc.h"
+#endif
+
+#if DEPENDS_ON_LIBCHARSET
+# include <libcharset.h>
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV
+# include <iconv.h>
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS
+# include <libintl.h>
+#endif
+
+/* Faked cheap 'bool'.  */
+#undef bool
+#undef false
+#undef true
+#define bool int
+#define false 0
+#define true 1
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_PATH_WITH_DIR(P) \
+    (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILESYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILESYSTEM_PREFIX_LEN(P) 0
+#endif
+
+/* Original installation prefix.  */
+static char *orig_prefix;
+static size_t orig_prefix_len;
+/* Current installation prefix.  */
+static char *curr_prefix;
+static size_t curr_prefix_len;
+/* These prefixes do not end in a slash.  Anything that will be concatenated
+   to them must start with a slash.  */
+
+/* Sets the original and the current installation prefix of this module.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+static void
+set_this_relocation_prefix (const char *orig_prefix_arg,
+                           const char *curr_prefix_arg)
+{
+  if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
+      /* Optimization: if orig_prefix and curr_prefix are equal, the
+        relocation is a nop.  */
+      && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
+    {
+      /* Duplicate the argument strings.  */
+      char *memory;
+
+      orig_prefix_len = strlen (orig_prefix_arg);
+      curr_prefix_len = strlen (curr_prefix_arg);
+      memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+      if (memory != NULL)
+#endif
+       {
+         memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+         orig_prefix = memory;
+         memory += orig_prefix_len + 1;
+         memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+         curr_prefix = memory;
+         return;
+       }
+    }
+  orig_prefix = NULL;
+  curr_prefix = NULL;
+  /* Don't worry about wasted memory here - this function is usually only
+     called once.  */
+}
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+void
+set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg)
+{
+  set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+
+  /* Now notify all dependent libraries.  */
+#if DEPENDS_ON_LIBCHARSET
+  libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109
+  libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix
+  libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+}
+
+/* Convenience function:
+   Computes the current installation prefix, based on the original
+   installation prefix, the original installation directory of a particular
+   file, and the current pathname of this file.  Returns NULL upon failure.  */
+#ifdef IN_LIBRARY
+#define compute_curr_prefix local_compute_curr_prefix
+static
+#endif
+const char *
+compute_curr_prefix (const char *orig_installprefix,
+                    const char *orig_installdir,
+                    const char *curr_pathname)
+{
+  const char *curr_installdir;
+  const char *rel_installdir;
+
+  if (curr_pathname == NULL)
+    return NULL;
+
+  /* Determine the relative installation directory, relative to the prefix.
+     This is simply the difference between orig_installprefix and
+     orig_installdir.  */
+  if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix))
+      != 0)
+    /* Shouldn't happen - nothing should be installed outside $(prefix).  */
+    return NULL;
+  rel_installdir = orig_installdir + strlen (orig_installprefix);
+
+  /* Determine the current installation directory.  */
+  {
+    const char *p_base = curr_pathname + FILESYSTEM_PREFIX_LEN (curr_pathname);
+    const char *p = curr_pathname + strlen (curr_pathname);
+    char *q;
+
+    while (p > p_base)
+      {
+       p--;
+       if (ISSLASH (*p))
+         break;
+      }
+
+    q = (char *) xmalloc (p - curr_pathname + 1);
+#ifdef NO_XMALLOC
+    if (q == NULL)
+      return NULL;
+#endif
+    memcpy (q, curr_pathname, p - curr_pathname);
+    q[p - curr_pathname] = '\0';
+    curr_installdir = q;
+  }
+
+  /* Compute the current installation prefix by removing the trailing
+     rel_installdir from it.  */
+  {
+    const char *rp = rel_installdir + strlen (rel_installdir);
+    const char *cp = curr_installdir + strlen (curr_installdir);
+    const char *cp_base =
+      curr_installdir + FILESYSTEM_PREFIX_LEN (curr_installdir);
+
+    while (rp > rel_installdir && cp > cp_base)
+      {
+       bool same = false;
+       const char *rpi = rp;
+       const char *cpi = cp;
+
+       while (rpi > rel_installdir && cpi > cp_base)
+         {
+           rpi--;
+           cpi--;
+           if (ISSLASH (*rpi) || ISSLASH (*cpi))
+             {
+               if (ISSLASH (*rpi) && ISSLASH (*cpi))
+                 same = true;
+               break;
+             }
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+           /* Win32, OS/2, DOS - case insignificant filesystem */
+           if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+               != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+             break;
+#else
+           if (*rpi != *cpi)
+             break;
+#endif
+         }
+       if (!same)
+         break;
+       /* The last pathname component was the same.  opi and cpi now point
+          to the slash before it.  */
+       rp = rpi;
+       cp = cpi;
+      }
+
+    if (rp > rel_installdir)
+      /* Unexpected: The curr_installdir does not end with rel_installdir.  */
+      return NULL;
+
+    {
+      size_t curr_prefix_len = cp - curr_installdir;
+      char *curr_prefix;
+
+      curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+      if (curr_prefix == NULL)
+       return NULL;
+#endif
+      memcpy (curr_prefix, curr_installdir, curr_prefix_len);
+      curr_prefix[curr_prefix_len] = '\0';
+
+      return curr_prefix;
+    }
+  }
+}
+
+#if defined PIC && defined INSTALLDIR
+
+/* Full pathname of shared library, or NULL.  */
+static char *shared_library_fullname;
+
+#if defined _WIN32 || defined __WIN32__
+
+/* Determine the full pathname of the shared library when it is loaded.  */
+
+BOOL WINAPI
+DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
+{
+  (void) reserved;
+
+  if (event == DLL_PROCESS_ATTACH)
+    {
+      /* The DLL is being loaded into an application's address range.  */
+      static char location[MAX_PATH];
+
+      if (!GetModuleFileName (module_handle, location, sizeof (location)))
+       /* Shouldn't happen.  */
+       return FALSE;
+
+      if (!IS_PATH_WITH_DIR (location))
+       /* Shouldn't happen.  */
+       return FALSE;
+
+      shared_library_fullname = strdup (location);
+    }
+
+  return TRUE;
+}
+
+#else /* Unix */
+
+static void
+find_shared_library_fullname ()
+{
+#ifdef __linux__
+  FILE *fp;
+
+  /* Open the current process' maps file.  It describes one VMA per line.  */
+  fp = fopen ("/proc/self/maps", "r");
+  if (fp)
+    {
+      unsigned long address = (unsigned long) &find_shared_library_fullname;
+      for (;;)
+       {
+         unsigned long start, end;
+         int c;
+
+         if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+           break;
+         if (address >= start && address <= end - 1)
+           {
+             /* Found it.  Now see if this line contains a filename.  */
+             while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+               continue;
+             if (c == '/')
+               {
+                 size_t size;
+                 int len;
+
+                 ungetc (c, fp);
+                 shared_library_fullname = NULL; size = 0;
+                 len = getline (&shared_library_fullname, &size, fp);
+                 if (len >= 0)
+                   {
+                     /* Success: filled shared_library_fullname.  */
+                     if (len > 0 && shared_library_fullname[len - 1] == '\n')
+                       shared_library_fullname[len - 1] = '\0';
+                   }
+               }
+             break;
+           }
+         while (c = getc (fp), c != EOF && c != '\n')
+           continue;
+       }
+      fclose (fp);
+    }
+#endif
+}
+
+#endif /* WIN32 / Unix */
+
+/* Return the full pathname of the current shared library.
+   Return NULL if unknown.
+   Guaranteed to work only on Linux and Woe32.  */
+static char *
+get_shared_library_fullname ()
+{
+#if !(defined _WIN32 || defined __WIN32__)
+  static bool tried_find_shared_library_fullname;
+  if (!tried_find_shared_library_fullname)
+    {
+      find_shared_library_fullname ();
+      tried_find_shared_library_fullname = true;
+    }
+#endif
+  return shared_library_fullname;
+}
+
+#endif /* PIC */
+
+/* Returns the pathname, relocated according to the current installation
+   directory.  */
+const char *
+relocate (const char *pathname)
+{
+#if defined PIC && defined INSTALLDIR
+  static int initialized;
+
+  /* Initialization code for a shared library.  */
+  if (!initialized)
+    {
+      /* At this point, orig_prefix and curr_prefix likely have already been
+        set through the main program's set_program_name_and_installdir
+        function.  This is sufficient in the case that the library has
+        initially been installed in the same orig_prefix.  But we can do
+        better, to also cover the cases that 1. it has been installed
+        in a different prefix before being moved to orig_prefix and (later)
+        to curr_prefix, 2. unlike the program, it has not moved away from
+        orig_prefix.  */
+      const char *orig_installprefix = INSTALLPREFIX;
+      const char *orig_installdir = INSTALLDIR;
+      const char *curr_prefix_better;
+
+      curr_prefix_better =
+       compute_curr_prefix (orig_installprefix, orig_installdir,
+                            get_shared_library_fullname ());
+      if (curr_prefix_better == NULL)
+       curr_prefix_better = curr_prefix;
+
+      set_relocation_prefix (orig_installprefix, curr_prefix_better);
+
+      initialized = 1;
+    }
+#endif
+
+  /* Note: It is not necessary to perform case insensitive comparison here,
+     even for DOS-like filesystems, because the pathname argument was
+     typically created from the same Makefile variable as orig_prefix came
+     from.  */
+  if (orig_prefix != NULL && curr_prefix != NULL
+      && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
+    {
+      if (pathname[orig_prefix_len] == '\0')
+       /* pathname equals orig_prefix.  */
+       return curr_prefix;
+      if (ISSLASH (pathname[orig_prefix_len]))
+       {
+         /* pathname starts with orig_prefix.  */
+         const char *pathname_tail = &pathname[orig_prefix_len];
+         char *result =
+           (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+
+#ifdef NO_XMALLOC
+         if (result != NULL)
+#endif
+           {
+             memcpy (result, curr_prefix, curr_prefix_len);
+             strcpy (result + curr_prefix_len, pathname_tail);
+             return result;
+           }
+       }
+    }
+  /* Nothing to relocate.  */
+  return pathname;
+}
+
+#endif
diff --git a/lib/intl/relocatable.h b/lib/intl/relocatable.h
new file mode 100644 (file)
index 0000000..d141200
--- /dev/null
@@ -0,0 +1,67 @@
+/* Provide relocatable packages.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifndef _RELOCATABLE_H
+#define _RELOCATABLE_H
+
+/* This can be enabled through the configure --enable-relocatable option.  */
+#if ENABLE_RELOCATABLE
+
+/* When building a DLL, we must export some functions.  Note that because
+   this is a private .h file, we don't need to use __declspec(dllimport)
+   in any case.  */
+#if defined _MSC_VER && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport)
+#else
+# define RELOCATABLE_DLL_EXPORTED
+#endif
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+extern RELOCATABLE_DLL_EXPORTED void
+       set_relocation_prefix (const char *orig_prefix,
+                             const char *curr_prefix);
+
+/* Returns the pathname, relocated according to the current installation
+   directory.  */
+extern const char * relocate (const char *pathname);
+
+/* Memory management: relocate() leaks memory, because it has to construct
+   a fresh pathname.  If this is a problem because your program calls
+   relocate() frequently, think about caching the result.  */
+
+/* Convenience function:
+   Computes the current installation prefix, based on the original
+   installation prefix, the original installation directory of a particular
+   file, and the current pathname of this file.  Returns NULL upon failure.  */
+extern const char * compute_curr_prefix (const char *orig_installprefix,
+                                        const char *orig_installdir,
+                                        const char *curr_pathname);
+
+#else
+
+/* By default, we use the hardwired pathnames.  */
+#define relocate(pathname) (pathname)
+
+#endif
+
+#endif /* _RELOCATABLE_H */
diff --git a/lib/intl/textdomain.c b/lib/intl/textdomain.c
new file mode 100644 (file)
index 0000000..f259c69
--- /dev/null
@@ -0,0 +1,142 @@
+/* Implementation of the textdomain(3) function.
+   Copyright (C) 1995-1998, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "gettextP.h"
+
+#ifdef _LIBC
+/* We have to handle multi-threaded applications.  */
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc.  */
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+   names than the internal variables in GNU libc, otherwise programs
+   using libintl.a cannot be linked statically.  */
+#if !defined _LIBC
+# define _nl_default_default_domain libintl_nl_default_default_domain
+# define _nl_current_default_domain libintl_nl_current_default_domain
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Name of the default text domain.  */
+extern const char _nl_default_default_domain[] attribute_hidden;
+
+/* Default text domain in which entries for gettext(3) are to be found.  */
+extern const char *_nl_current_default_domain attribute_hidden;
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define TEXTDOMAIN __textdomain
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
+#else
+# define TEXTDOMAIN libintl_textdomain
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
+
+/* Set the current default message catalog to DOMAINNAME.
+   If DOMAINNAME is null, return the current default.
+   If DOMAINNAME is "", reset to the default of "messages".  */
+char *
+TEXTDOMAIN (domainname)
+     const char *domainname;
+{
+  char *new_domain;
+  char *old_domain;
+
+  /* A NULL pointer requests the current setting.  */
+  if (domainname == NULL)
+    return (char *) _nl_current_default_domain;
+
+  __libc_rwlock_wrlock (_nl_state_lock);
+
+  old_domain = (char *) _nl_current_default_domain;
+
+  /* If domain name is the null string set to default domain "messages".  */
+  if (domainname[0] == '\0'
+      || strcmp (domainname, _nl_default_default_domain) == 0)
+    {
+      _nl_current_default_domain = _nl_default_default_domain;
+      new_domain = (char *) _nl_current_default_domain;
+    }
+  else if (strcmp (domainname, old_domain) == 0)
+    /* This can happen and people will use it to signal that some
+       environment variable changed.  */
+    new_domain = old_domain;
+  else
+    {
+      /* If the following malloc fails `_nl_current_default_domain'
+        will be NULL.  This value will be returned and so signals we
+        are out of core.  */
+#if defined _LIBC || defined HAVE_STRDUP
+      new_domain = strdup (domainname);
+#else
+      size_t len = strlen (domainname) + 1;
+      new_domain = (char *) malloc (len);
+      if (new_domain != NULL)
+       memcpy (new_domain, domainname, len);
+#endif
+
+      if (new_domain != NULL)
+       _nl_current_default_domain = new_domain;
+    }
+
+  /* We use this possibility to signal a change of the loaded catalogs
+     since this is most likely the case and there is no other easy we
+     to do it.  Do it only when the call was successful.  */
+  if (new_domain != NULL)
+    {
+      ++_nl_msg_cat_cntr;
+
+      if (old_domain != new_domain && old_domain != _nl_default_default_domain)
+       free (old_domain);
+    }
+
+  __libc_rwlock_unlock (_nl_state_lock);
+
+  return new_domain;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__textdomain, textdomain);
+#endif
index 91549c9..0fc3618 100644 (file)
@@ -116,6 +116,12 @@ trace.o: ${srcdir}/imalloc.h
 table.o: ${srcdir}/imalloc.h ${srcdir}/table.h
 watch.o: ${srcdir}/imalloc.h ${srcdir}/watch.h
 
+malloc.o: ${topdir}/bashintl.h ${BASHINCDIR}/gettext.h
+stats.o: ${topdir}/bashintl.h ${BASHINCDIR}/gettext.h
+trace.o: ${topdir}/bashintl.h ${BASHINCDIR}/gettext.h
+table.o: ${topdir}/bashintl.h ${BASHINCDIR}/gettext.h
+watch.o: ${topdir}/bashintl.h ${BASHINCDIR}/gettext.h
+
 # Rules for deficient makes, like SunOS and Solaris
 stub.o: stub.c
 malloc.o: malloc.c
diff --git a/lib/malloc/OLD/gmalloc.c b/lib/malloc/OLD/gmalloc.c
new file mode 100644 (file)
index 0000000..c21d447
--- /dev/null
@@ -0,0 +1,1486 @@
+/* The malloc headers and source files from the C library follow here.  */
+
+/* Declarations for `malloc' and friends.
+   Copyright 1990, 91, 92, 93, 95, 96 Free Software Foundation, Inc.
+                 Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+ot, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+/* XXX NOTES:
+    1. Augment the mstats struct so we can see how many blocks for fragments
+       and how many blocks for large requests were allocated.
+*/
+
+/* CHANGES:
+    1. Reorganized the source for my benefit.
+    2. Integrated the range-checking code by default.
+    3.  free(0) no longer dumps core.
+    4.  Extended the statistics.
+    5.  Fixed a couple of places where the stats were not kept correctly.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else
+#  include <strings.h>
+#endif
+
+#if defined (HAVE_LIMITS_H)
+#  include <limits.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
+#  include <unistd.h>
+#endif
+
+#if defined (HAVE_STDDEF_H)
+#  include <stddef.h>
+#endif
+#include <errno.h>
+
+#if defined (RCHECK) && !defined (botch)
+#  include <stdio.h>
+#  define STDIO_H_INCLUDED
+#endif
+
+#include "stdc.h"
+
+#ifndef errno
+extern int errno;
+#endif
+
+/* Need an autoconf test for this. */
+#if __STDC__
+#  undef  genptr_t
+#  define genptr_t     void *
+#else
+#  undef  genptr_t
+#  define genptr_t     char *
+#endif /* !__STDC__ */
+
+#if !defined (HAVE_MEMSET)
+#  define      memset(s, zero, n)      bzero ((s), (n))
+#endif
+#if !defined (HAVE_MEMCPY)
+#  define      memcpy(d, s, n)         bcopy ((s), (d), (n))
+#endif
+
+/* Cope with systems lacking `memmove'.    */
+#if !defined (HAVE_MEMMOVE) && !defined (memmove)
+static void malloc_safe_bcopy __P ((genptr_t, genptr_t, size_t));
+#  define memmove(to, from, size)      malloc_safe_bcopy ((from), (to), (size))
+#endif
+
+#ifndef        NULL
+#define        NULL    0
+#endif
+
+#ifndef min
+#define min(A, B) ((A) < (B) ? (A) : (B))
+#endif
+
+/* Return values for `mprobe': these are the kinds of inconsistencies that
+   `mcheck' enables detection of.  */
+enum mcheck_status
+  {
+    MCHECK_DISABLED = -1,      /* Consistency checking is not turned on.  */
+    MCHECK_OK,                 /* Block is fine.  */
+    MCHECK_FREE,               /* Block freed twice.  */
+    MCHECK_HEAD,               /* Memory before the block was clobbered.  */
+    MCHECK_TAIL                        /* Memory after the block was clobbered.  */
+  };
+
+/* Statistics available to the user.  */
+struct mstats
+  {
+    size_t bytes_total; /* Total size of the heap. */
+    size_t chunks_used; /* Chunks allocated by the user. */
+    size_t bytes_used; /* Byte total of user-allocated chunks. */
+    size_t chunks_free; /* Chunks in the free list. */
+    size_t bytes_free; /* Byte total of chunks in the free list. */
+    int nmalloc;       /* Total number of calls to malloc. */
+    int nfree;         /* Total number of calls to free. */
+    int nrealloc;      /* Total number of calls to realloc. */
+    int nsbrk;         /* Total number of calls to sbrk. */
+    size_t tsbrk;      /* Total number of bytes allocated via sbrk. */
+    int negsbrk;       /* Total number of calls to sbrk with a negative arg */
+    size_t tnegsbrk;   /* Total number of bytes returned to the kernel. */
+  };
+
+#ifdef RCHECK
+/* Arbitrary magical numbers.  */
+#define MAGICWORD      0xfedabeeb
+#define MAGICFREE      0xd8675309
+#define MAGICBYTE      ((char) 0xd7)
+#define MALLOCFLOOD    ((char) 0x93)
+#define FREEFLOOD      ((char) 0x95)
+
+struct hdr
+  {
+    size_t size;               /* Exact size requested by user.  */
+    u_bits32_t magic;          /* Magic number to check header integrity.  */
+  };
+#endif /* RCHECK */
+
+/* Functions exported by this library. */
+/* Allocate SIZE bytes of memory.  */
+extern genptr_t malloc __P ((size_t __size));
+
+/* Re-allocate the previously allocated block
+   in genptr_t, making the new block SIZE bytes long.  */
+extern genptr_t realloc __P ((genptr_t __ptr, size_t __size));
+
+/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0.  */
+extern genptr_t calloc __P ((size_t __nmemb, size_t __size));
+
+/* Free a block allocated by `malloc', `realloc' or `calloc'.  */
+extern void free __P ((genptr_t __ptr));
+
+/* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
+extern genptr_t memalign __P ((size_t __alignment, size_t __size));
+
+/* Pick up the current statistics. */
+extern struct mstats mstats __P ((void));
+
+#ifdef RCHECK
+extern enum mcheck_status mprobe __P((genptr_t ptr));
+#endif
+
+/* End of exported functions. */
+
+/* The allocator divides the heap into blocks of fixed size; large
+   requests receive one or more whole blocks, and small requests
+   receive a fragment of a block.  Fragment sizes are powers of two,
+   and all fragments of a block are the same size.  When all the
+   fragments in a block have been freed, the block itself is freed.  */
+#define BLOCKLOG       12
+#define BLOCKSIZE      4096            /* 1 << BLOCKLOG */
+#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
+
+/* Determine the amount of memory spanned by the initial heap table
+   (not an absolute limit).  */
+#define HEAP           4194304         /* 1 << 22 */
+
+/* Number of contiguous free blocks allowed to build up at the end of
+   memory before they will be returned to the system.  */
+#define FINAL_FREE_BLOCKS      8
+
+/* Data structure giving per-block information.  */
+typedef union
+  {
+    /* Heap information for a busy block.  */
+    struct
+      {
+       /* Zero for a large (multiblock) object, or positive giving the
+          logarithm to the base two of the fragment size.  */
+       int type;
+       union
+         {
+           struct
+             {
+               size_t nfree; /* Free frags in a fragmented block.  */
+               size_t first; /* First free fragment of the block.  */
+             } frag;
+           /* For a large object, in its first block, this has the number
+              of blocks in the object.  In the other blocks, this has a
+              negative number which says how far back the first block is.  */
+           ptrdiff_t size;
+         } info;
+      } busy;
+    /* Heap information for a free block (that may be the first of a
+       free cluster).  */
+    struct
+      {
+       size_t size;    /* Size (in blocks) of a free cluster.  */
+       size_t next;    /* Index of next free cluster.  */
+       size_t prev;    /* Index of previous free cluster.  */
+      } free;
+  } malloc_info;
+
+/* Pointer to first block of the heap.  */
+static char *_heapbase;
+
+/* Table indexed by block number giving per-block information.  */
+static malloc_info *_heapinfo;
+
+/* Address to block number and vice versa.  */
+#define BLOCK(A)       (((char *) (A) - _heapbase) / BLOCKSIZE + 1)
+#define ADDRESS(B)     ((genptr_t) (((B) - 1) * BLOCKSIZE + _heapbase))
+
+/* Number of info entries.  */
+static size_t heapsize;
+
+/* Current search index for the heap table.  */
+static size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+static size_t _heaplimit;
+
+/* Doubly linked lists of free fragments.  */
+struct list
+  {
+    struct list *next;
+    struct list *prev;
+  };
+
+/* Free list headers for each fragment size.  */
+static struct list _fraghead[BLOCKLOG];
+
+/* List of blocks allocated with `memalign'.  */
+struct alignlist
+  {
+    struct alignlist *next;
+    genptr_t aligned;          /* The address that memaligned returned.  */
+    genptr_t exact;            /* The address that malloc returned.  */
+  };
+
+/* List of blocks allocated by memalign.  */
+static struct alignlist *_aligned_blocks = NULL;
+
+/* Internal versions of `malloc', `realloc', and `free'
+   used when these functions need to call each other. */
+static genptr_t imalloc __P ((size_t __size));
+static genptr_t irealloc __P ((genptr_t __ptr, size_t __size));
+static void ifree __P ((genptr_t __ptr));
+
+/* Given an address in the middle of a malloc'd object,
+   return the address of the beginning of the object.  */
+static genptr_t malloc_find_object_address __P ((genptr_t __ptr));
+
+/* Underlying allocation function; successive calls should
+   return contiguous pieces of memory.  */
+static genptr_t default_morecore __P ((ptrdiff_t __size));
+
+/* Number of extra blocks to get each time we ask for more core.
+   This reduces the frequency of calling `default_morecore'.  */
+static size_t malloc_extra_blocks;
+
+/* Nonzero if `malloc' has been called and done its initialization.  */
+static int malloc_initialized;
+/* Function called to initialize malloc data structures.  */
+static int malloc_initialize __P ((void));
+
+#ifdef RCHECK
+static void zmemset __P((genptr_t, int, size_t));
+static enum mcheck_status checkhdr __P((const struct hdr *));
+static void mabort __P((enum mcheck_status));
+#endif
+
+/* Instrumentation.  */
+static size_t chunks_used;
+static size_t bytes_used;
+static size_t chunks_free;
+static size_t bytes_free;
+static int nmalloc, nfree, nrealloc;
+static int nsbrk;
+static size_t tsbrk;
+static int negsbrk;
+static size_t tnegsbrk;
+
+/* Aligned allocation.  */
+static genptr_t
+align (size)
+     size_t size;
+{
+  genptr_t result;
+  unsigned long int adj;
+
+  result = default_morecore (size);
+  adj = (unsigned long int) ((unsigned long int) ((char *) result -
+                                                 (char *) NULL)) % BLOCKSIZE;
+  if (adj != 0)
+    {
+      genptr_t new;
+      adj = BLOCKSIZE - adj;
+      new = default_morecore (adj);
+      result = (char *) result + adj;
+    }
+
+  return result;
+}
+
+/* Get SIZE bytes, if we can get them starting at END.
+   Return the address of the space we got.
+   If we cannot get space at END, fail and return -1.  */
+static genptr_t
+get_contiguous_space (size, position)
+     ptrdiff_t size;
+     genptr_t position;
+{
+  genptr_t before;
+  genptr_t after;
+
+  before = default_morecore (0);
+  /* If we can tell in advance that the break is at the wrong place,
+     fail now.  */
+  if (before != position)
+    return 0;
+
+  /* Allocate SIZE bytes and get the address of them.  */
+  after = default_morecore (size);
+  if (!after)
+    return 0;
+
+  /* It was not contiguous--reject it.  */
+  if (after != position)
+    {
+      default_morecore (- size);
+      return 0;
+    }
+
+  return after;
+}
+
+/* This is called when `_heapinfo' and `heapsize' have just
+   been set to describe a new info table.  Set up the table
+   to describe itself and account for it in the statistics.  */
+inline static void
+register_heapinfo ()
+{
+  size_t block, blocks;
+
+  block = BLOCK (_heapinfo);
+  blocks = BLOCKIFY (heapsize * sizeof (malloc_info));
+
+  /* Account for the _heapinfo block itself in the statistics.  */
+  bytes_used += blocks * BLOCKSIZE;
+  ++chunks_used;
+
+  /* Describe the heapinfo block itself in the heapinfo.  */
+  _heapinfo[block].busy.type = 0;
+  _heapinfo[block].busy.info.size = blocks;
+  /* Leave back-pointers for malloc_find_address.  */
+  while (--blocks > 0)
+    _heapinfo[block + blocks].busy.info.size = -blocks;
+}
+
+/* Set everything up and remember that we have.  */
+static int
+malloc_initialize ()
+{
+  if (malloc_initialized)
+    return 0;
+
+  heapsize = HEAP / BLOCKSIZE;
+  _heapinfo = (malloc_info *) align (heapsize * sizeof (malloc_info));
+  if (_heapinfo == NULL)
+    return 0;
+  memset (_heapinfo, 0, heapsize * sizeof (malloc_info));
+  _heapinfo[0].free.size = 0;
+  _heapinfo[0].free.next = _heapinfo[0].free.prev = 0;
+  _heapindex = 0;
+  _heapbase = (char *) _heapinfo;
+  _heaplimit = BLOCK (_heapbase + heapsize * sizeof (malloc_info));
+
+  register_heapinfo ();
+
+  malloc_initialized = 1;
+  return 1;
+}
+
+/* Allocate INCREMENT more bytes of data space,
+   and return the start of data space, or NULL on errors.
+   If INCREMENT is negative, shrink data space.  */
+static genptr_t
+default_morecore (increment)
+     ptrdiff_t increment;
+{
+  genptr_t result;
+
+  nsbrk++;
+  tsbrk += increment;
+  if (increment < 0)
+    {
+      negsbrk++;
+      tnegsbrk += -increment;
+    }
+  result = (genptr_t) sbrk (increment);
+  if ((long)result == -1L)
+    return NULL;
+  return result;
+}
+
+static int morecore_recursing;
+
+/* Get neatly aligned memory, initializing or
+   growing the heap info table as necessary. */
+static genptr_t
+morecore (size)
+     size_t size;
+{
+  genptr_t result;
+  malloc_info *newinfo, *oldinfo;
+  size_t newsize;
+
+  if (morecore_recursing)
+    /* Avoid recursion.  The caller will know how to handle a null return.  */
+    return NULL;
+
+  result = align (size);
+  if (result == NULL)
+    return NULL;
+
+  /* Check if we need to grow the info table.  */
+  if ((size_t) BLOCK ((char *) result + size) > heapsize)
+    {
+      /* Calculate the new _heapinfo table size.  We do not account for the
+        added blocks in the table itself, as we hope to place them in
+        existing free space, which is already covered by part of the
+        existing table.  */
+      newsize = heapsize;
+      do
+       newsize <<= 1;
+      while ((size_t) BLOCK ((char *) result + size) > newsize);
+
+      /* We must not reuse existing core for the new info table when called
+        from realloc in the case of growing a large block, because the
+        block being grown is momentarily marked as free.  In this case
+        _heaplimit is zero so we know not to reuse space for internal
+        allocation.  */
+      if (_heaplimit != 0)
+       {
+         /* First try to allocate the new info table in core we already
+            have, in the usual way using realloc.  If realloc cannot
+            extend it in place or relocate it to existing sufficient core,
+            we will get called again, and the code above will notice the
+            `morecore_recursing' flag and return null.  */
+         int save = errno;     /* Don't want to clobber errno with ENOMEM.  */
+         morecore_recursing = 1;
+         newinfo = (malloc_info *) irealloc (_heapinfo, newsize * sizeof (malloc_info));
+         morecore_recursing = 0;
+         if (newinfo == NULL)
+           errno = save;
+         else
+           {
+             /* We found some space in core, and realloc has put the old
+                table's blocks on the free list.  Now zero the new part
+                of the table and install the new table location.  */
+             memset (&newinfo[heapsize], 0, (newsize - heapsize) * sizeof (malloc_info));
+             _heapinfo = newinfo;
+             heapsize = newsize;
+             goto got_heap;
+           }
+       }
+
+      /* Allocate new space for the malloc info table.  */
+      while (1)
+       {
+         newinfo = (malloc_info *) align (newsize * sizeof (malloc_info));
+
+         /* Did it fail?  */
+         if (newinfo == NULL)
+           {
+             default_morecore (-size);
+             return NULL;
+           }
+
+         /* Is it big enough to record status for its own space?
+            If so, we win.  */
+         if ((size_t) BLOCK ((char *) newinfo + newsize * sizeof (malloc_info)) < newsize)
+           break;
+
+         /* Must try again.  First give back most of what we just got.  */
+         default_morecore (- newsize * sizeof (malloc_info));
+         newsize *= 2;
+       }
+
+      /* Copy the old table to the beginning of the new,
+        and zero the rest of the new table.  */
+      memcpy (newinfo, _heapinfo, heapsize * sizeof (malloc_info));
+      memset (&newinfo[heapsize], 0, (newsize - heapsize) * sizeof (malloc_info));
+      oldinfo = _heapinfo;
+      _heapinfo = newinfo;
+      heapsize = newsize;
+
+      register_heapinfo ();
+
+      /* Reset _heaplimit so ifree never decides
+        it can relocate or resize the info table.  */
+      _heaplimit = 0;
+      ifree (oldinfo);
+
+      /* The new heap limit includes the new table just allocated.  */
+      _heaplimit = BLOCK ((char *) newinfo + heapsize * sizeof (malloc_info));
+      return result;
+    }
+
+ got_heap:
+  _heaplimit = BLOCK ((char *) result + size);
+  return result;
+}
+
+/* Allocate memory from the heap.  */
+static genptr_t
+imalloc (size)
+     size_t size;
+{
+  genptr_t result;
+  size_t block, blocks, lastblocks, start;
+  register size_t i;
+  struct list *next;
+
+  /* ANSI C allows `malloc (0)' to either return NULL, or to return a
+     valid address you can realloc and free (though not dereference).
+
+     It turns out that some extant code (sunrpc, at least Ultrix's version)
+     expects `malloc (0)' to return non-NULL and breaks otherwise.
+     Be compatible.  */
+
+#if 0
+  if (size == 0)
+    return NULL;
+#endif
+
+  if (size < sizeof (struct list))
+    size = sizeof (struct list);
+
+#ifdef SUNOS_LOCALTIME_BUG
+  if (size < 16)
+    size = 16;
+#endif
+
+  /* Determine the allocation policy based on the request size.  */
+  if (size <= BLOCKSIZE / 2)
+    {
+      /* Small allocation to receive a fragment of a block.
+        Determine the logarithm to base two of the fragment size. */
+      register size_t log = 1;
+      --size;
+      while ((size /= 2) != 0)
+       ++log;
+
+      /* Look in the fragment lists for a
+        free fragment of the desired size. */
+      next = _fraghead[log].next;
+      if (next != NULL)
+       {
+         /* There are free fragments of this size.
+            Pop a fragment out of the fragment list and return it.
+            Update the block's nfree and first counters. */
+         result = (genptr_t) next;
+         next->prev->next = next->next;
+         if (next->next != NULL)
+           next->next->prev = next->prev;
+         block = BLOCK (result);
+         if (--_heapinfo[block].busy.info.frag.nfree != 0)
+           _heapinfo[block].busy.info.frag.first = (unsigned long int)
+             ((unsigned long int) ((char *) next->next - (char *) NULL)
+              % BLOCKSIZE) >> log;
+
+         /* Update the statistics.  */
+         ++chunks_used;
+         bytes_used += 1 << log;
+         --chunks_free;
+         bytes_free -= 1 << log;
+       }
+      else
+       {
+         /* No free fragments of the desired size, so get a new block
+            and break it into fragments, returning the first.  */
+         result = imalloc (BLOCKSIZE);
+         if (result == NULL)
+           return NULL;
+
+         /* Link all fragments but the first into the free list.  */
+         next = (struct list *) ((char *) result + (1 << log));
+         next->next = NULL;
+         next->prev = &_fraghead[log];
+         _fraghead[log].next = next;
+
+         for (i = 2; i < (size_t) (BLOCKSIZE >> log); ++i)
+           {
+             next = (struct list *) ((char *) result + (i << log));
+             next->next = _fraghead[log].next;
+             next->prev = &_fraghead[log];
+             next->prev->next = next;
+             next->next->prev = next;
+           }
+
+         /* Initialize the nfree and first counters for this block.  */
+         block = BLOCK (result);
+         _heapinfo[block].busy.type = log;
+         _heapinfo[block].busy.info.frag.nfree = i - 1;
+         _heapinfo[block].busy.info.frag.first = i - 1;
+
+         chunks_free += (BLOCKSIZE >> log) - 1;
+         bytes_free += BLOCKSIZE - (1 << log);
+         bytes_used -= BLOCKSIZE - (1 << log);
+       }
+    }
+  else
+    {
+      /* Large allocation to receive one or more blocks.
+        Search the free list in a circle starting at the last place visited.
+        If we loop completely around without finding a large enough
+        space we will have to get more memory from the system.  */
+      blocks = BLOCKIFY (size);
+      start = block = _heapindex;
+      while (_heapinfo[block].free.size < blocks)
+       {
+         block = _heapinfo[block].free.next;
+         if (block == start)
+           {
+             /* Need to get more from the system.  Get a little extra.  */
+             size_t wantblocks = blocks + malloc_extra_blocks;
+             block = _heapinfo[0].free.prev;
+             lastblocks = _heapinfo[block].free.size;
+             /* Check to see if the new core will be contiguous with the
+                final free block; if so we don't need to get as much.  */
+             if (_heaplimit != 0 && block + lastblocks == _heaplimit &&
+                 /* We can't do this if we will have to make the heap info
+                    table bigger to accomodate the new space.  */
+                 block + wantblocks <= heapsize &&
+                 get_contiguous_space ((wantblocks - lastblocks) * BLOCKSIZE,
+                                       ADDRESS (block + lastblocks)))
+               {
+                 /* We got it contiguously.  Which block we are extending
+                    (the `final free block' referred to above) might have
+                    changed, if it got combined with a freed info table.  */
+                 block = _heapinfo[0].free.prev;
+                 _heapinfo[block].free.size += (wantblocks - lastblocks);
+                 bytes_free += (wantblocks - lastblocks) * BLOCKSIZE;
+                 _heaplimit += wantblocks - lastblocks;
+                 continue;
+               }
+             result = morecore (wantblocks * BLOCKSIZE);
+             if (result == NULL)
+               return NULL;
+             block = BLOCK (result);
+             /* Put the new block at the end of the free list.  */
+             _heapinfo[block].free.size = wantblocks;
+             _heapinfo[block].free.prev = _heapinfo[0].free.prev;
+             _heapinfo[block].free.next = 0;
+             _heapinfo[0].free.prev = block;
+             _heapinfo[_heapinfo[block].free.prev].free.next = block;
+             ++chunks_free;
+             bytes_free += wantblocks * BLOCKSIZE;
+             /* Now loop to use some of that block for this allocation.  */
+           }
+       }
+
+      /* At this point we have found a suitable free list entry.
+        Figure out how to remove what we need from the list. */
+      result = ADDRESS (block);
+      if (_heapinfo[block].free.size > blocks)
+       {
+         /* The block we found has a bit left over,
+            so relink the tail end back into the free list. */
+         _heapinfo[block + blocks].free.size
+           = _heapinfo[block].free.size - blocks;
+         _heapinfo[block + blocks].free.next
+           = _heapinfo[block].free.next;
+         _heapinfo[block + blocks].free.prev
+           = _heapinfo[block].free.prev;
+         _heapinfo[_heapinfo[block].free.prev].free.next
+           = _heapinfo[_heapinfo[block].free.next].free.prev
+           = _heapindex = block + blocks;
+       }
+      else
+       {
+         /* The block exactly matches our requirements,
+            so just remove it from the list. */
+         _heapinfo[_heapinfo[block].free.next].free.prev
+           = _heapinfo[block].free.prev;
+         _heapinfo[_heapinfo[block].free.prev].free.next
+           = _heapindex = _heapinfo[block].free.next;
+         --chunks_free;
+       }
+
+      _heapinfo[block].busy.type = 0;
+      _heapinfo[block].busy.info.size = blocks;
+      ++chunks_used;
+      bytes_used += blocks * BLOCKSIZE;
+      bytes_free -= blocks * BLOCKSIZE;
+
+      /* Mark all the blocks of the object just allocated except for the
+        first with a negative number so you can find the first block by
+        adding that adjustment.  */
+      while (--blocks > 0)
+       _heapinfo[block + blocks].busy.info.size = -blocks;
+    }
+
+  return result;
+}
+
+genptr_t
+malloc (size)
+     size_t size;
+{
+#ifdef RCHECK
+  struct hdr *hdr;
+#endif
+
+  nmalloc++;
+
+  if (malloc_initialized == 0 && malloc_initialize () == 0)
+    return NULL;
+
+#ifdef RCHECK
+  hdr = (struct hdr *) imalloc (sizeof (struct hdr) + size + 1);
+  if (hdr == NULL)
+    return NULL;
+
+  hdr->size = size;
+  hdr->magic = MAGICWORD;
+  ((char *) &hdr[1])[size] = MAGICBYTE;
+  zmemset ((genptr_t) (hdr + 1), MALLOCFLOOD, size);
+  return (genptr_t) (hdr + 1);
+#else
+  return (imalloc (size));
+#endif
+}
+
+/* Free a block of memory allocated by `malloc'. */
+
+/* Return memory to the heap. */
+static void
+ifree (ptr)
+     genptr_t ptr;
+{
+  int type;
+  size_t block, blocks;
+  register size_t i;
+  struct list *prev, *next;
+  genptr_t curbrk;
+  size_t lesscore_threshold;
+  register struct alignlist *l;
+
+  if (ptr == NULL)
+    return;
+
+  /* Threshold of free space at which we will return some to the system.  */
+  lesscore_threshold = FINAL_FREE_BLOCKS + 2 * malloc_extra_blocks;
+
+  for (l = _aligned_blocks; l != NULL; l = l->next)
+    if (l->aligned == ptr)
+      {
+       l->aligned = NULL;      /* Mark the slot in the list as free.  */
+       ptr = l->exact;
+       break;
+      }
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Get as many statistics as early as we can.  */
+      --chunks_used;
+      bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE;
+      bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE;
+
+      /* Find the free cluster previous to this one in the free list.
+        Start searching at the last block referenced; this may benefit
+        programs with locality of allocation.  */
+      i = _heapindex;
+      if (i > block)
+       while (i > block)
+         i = _heapinfo[i].free.prev;
+      else
+       {
+         do
+           i = _heapinfo[i].free.next;
+         while (i > 0 && i < block);
+         i = _heapinfo[i].free.prev;
+       }
+
+      /* Determine how to link this block into the free list.  */
+      if (block == i + _heapinfo[i].free.size)
+       {
+         /* Coalesce this block with its predecessor.  */
+         _heapinfo[i].free.size += _heapinfo[block].busy.info.size;
+         block = i;
+       }
+      else
+       {
+         /* Really link this block back into the free list.  */
+         _heapinfo[block].free.size = _heapinfo[block].busy.info.size;
+         _heapinfo[block].free.next = _heapinfo[i].free.next;
+         _heapinfo[block].free.prev = i;
+         _heapinfo[i].free.next = block;
+         _heapinfo[_heapinfo[block].free.next].free.prev = block;
+         ++chunks_free;
+       }
+
+      /* Now that the block is linked in, see if we can coalesce it
+        with its successor (by deleting its successor from the list
+        and adding in its size).  */
+      if (block + _heapinfo[block].free.size == _heapinfo[block].free.next)
+       {
+         _heapinfo[block].free.size
+           += _heapinfo[_heapinfo[block].free.next].free.size;
+         _heapinfo[block].free.next
+           = _heapinfo[_heapinfo[block].free.next].free.next;
+         _heapinfo[_heapinfo[block].free.next].free.prev = block;
+         --chunks_free;
+       }
+
+      /* How many trailing free blocks are there now?  */
+      blocks = _heapinfo[block].free.size;
+
+      /* Where is the current end of accessible core?  */
+      curbrk = default_morecore (0);
+
+      if (_heaplimit != 0 && curbrk == ADDRESS (_heaplimit))
+       {
+         /* The end of the malloc heap is at the end of accessible core.
+            It's possible that moving _heapinfo will allow us to
+            return some space to the system.  */
+
+         size_t info_block = BLOCK (_heapinfo);
+         size_t info_blocks = _heapinfo[info_block].busy.info.size;
+         size_t prev_block = _heapinfo[block].free.prev;
+         size_t prev_blocks = _heapinfo[prev_block].free.size;
+         size_t next_block = _heapinfo[block].free.next;
+         size_t next_blocks = _heapinfo[next_block].free.size;
+
+         if (/* Win if this block being freed is last in core, the info table
+                is just before it, the previous free block is just before the
+                info table, and the two free blocks together form a useful
+                amount to return to the system.  */
+             (block + blocks == _heaplimit &&
+              info_block + info_blocks == block &&
+              prev_block != 0 && prev_block + prev_blocks == info_block &&
+              blocks + prev_blocks >= lesscore_threshold) ||
+             /* Nope, not the case.  We can also win if this block being
+                freed is just before the info table, and the table extends
+                to the end of core or is followed only by a free block,
+                and the total free space is worth returning to the system.  */
+             (block + blocks == info_block &&
+              ((info_block + info_blocks == _heaplimit &&
+                blocks >= lesscore_threshold) ||
+               (info_block + info_blocks == next_block &&
+                next_block + next_blocks == _heaplimit &&
+                blocks + next_blocks >= lesscore_threshold)))
+             )
+           {
+             malloc_info *newinfo;
+             size_t oldlimit = _heaplimit;
+
+             /* Free the old info table, clearing _heaplimit to avoid
+                recursion into this code.  We don't want to return the
+                table's blocks to the system before we have copied them to
+                the new location.  */
+             _heaplimit = 0;
+             ifree (_heapinfo);
+             _heaplimit = oldlimit;
+
+             /* Tell malloc to search from the beginning of the heap for
+                free blocks, so it doesn't reuse the ones just freed.  */
+             _heapindex = 0;
+
+             /* Allocate new space for the info table and move its data.  */
+             newinfo = (malloc_info *) imalloc (info_blocks
+                                                         * BLOCKSIZE);
+             memmove (newinfo, _heapinfo, info_blocks * BLOCKSIZE);
+             _heapinfo = newinfo;
+
+             /* We should now have coalesced the free block with the
+                blocks freed from the old info table.  Examine the entire
+                trailing free block to decide below whether to return some
+                to the system.  */
+             block = _heapinfo[0].free.prev;
+             blocks = _heapinfo[block].free.size;
+           }
+
+         /* Now see if we can return stuff to the system.  */
+         if (block + blocks == _heaplimit && blocks >= lesscore_threshold)
+           {
+             register size_t bytes = blocks * BLOCKSIZE;
+             _heaplimit -= blocks;
+             default_morecore (-bytes);
+             _heapinfo[_heapinfo[block].free.prev].free.next
+               = _heapinfo[block].free.next;
+             _heapinfo[_heapinfo[block].free.next].free.prev
+               = _heapinfo[block].free.prev;
+             block = _heapinfo[block].free.prev;
+             --chunks_free;
+             bytes_free -= bytes;
+           }
+       }
+
+      /* Set the next search to begin at this block.  */
+      _heapindex = block;
+      break;
+
+    default:
+      /* Do some of the statistics.  */
+      --chunks_used;
+      bytes_used -= 1 << type;
+      ++chunks_free;
+      bytes_free += 1 << type;
+
+      /* Get the address of the first free fragment in this block.  */
+      prev = (struct list *) ((char *) ADDRESS (block) +
+                             (_heapinfo[block].busy.info.frag.first << type));
+
+      if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1)
+       {
+         /* If all fragments of this block are free, remove them
+            from the fragment list and free the whole block.  */
+         next = prev;
+         for (i = 1; i < (size_t) (BLOCKSIZE >> type); ++i)
+           next = next->next;
+         prev->prev->next = next;
+         if (next != NULL)
+           next->prev = prev->prev;
+         _heapinfo[block].busy.type = 0;
+         _heapinfo[block].busy.info.size = 1;
+
+         /* Keep the statistics accurate.  */
+         ++chunks_used;
+         bytes_used += BLOCKSIZE;
+         chunks_free -= BLOCKSIZE >> type;
+         bytes_free -= BLOCKSIZE;
+
+         ifree (ADDRESS (block));
+       }
+      else if (_heapinfo[block].busy.info.frag.nfree != 0)
+       {
+         /* If some fragments of this block are free, link this
+            fragment into the fragment list after the first free
+            fragment of this block. */
+         next = (struct list *) ptr;
+         next->next = prev->next;
+         next->prev = prev;
+         prev->next = next;
+         if (next->next != NULL)
+           next->next->prev = next;
+         ++_heapinfo[block].busy.info.frag.nfree;
+       }
+      else
+       {
+         /* No fragments of this block are free, so link this
+            fragment into the fragment list and announce that
+            it is the first free fragment of this block. */
+         prev = (struct list *) ptr;
+         _heapinfo[block].busy.info.frag.nfree = 1;
+         _heapinfo[block].busy.info.frag.first = (unsigned long int)
+           ((unsigned long int) ((char *) ptr - (char *) NULL)
+            % BLOCKSIZE >> type);
+         prev->next = _fraghead[type].next;
+         prev->prev = &_fraghead[type];
+         prev->prev->next = prev;
+         if (prev->next != NULL)
+           prev->next->prev = prev;
+       }
+      break;
+    }
+}
+
+/* Return memory to the heap.  */
+void
+free (ptr)
+     genptr_t ptr;
+{
+#ifdef RCHECK
+  struct hdr *hdr;
+#endif
+
+  nfree++;
+
+  if (ptr == 0)
+    return;
+
+#ifdef RCHECK
+  hdr = ((struct hdr *) ptr) - 1;
+  checkhdr (hdr);
+  hdr->magic = MAGICFREE;
+  zmemset (ptr, FREEFLOOD, hdr->size);
+  ifree (hdr);
+#else
+  ifree (ptr);
+#endif
+}
+
+/* Change the size of a block allocated by `malloc'. */
+
+#ifndef HAVE_MEMMOVE
+/* Snarfed directly from Emacs src/dispnew.c:
+   XXX Should use system bcopy if it handles overlap.  */
+
+/* Like bcopy except never gets confused by overlap.  */
+
+static void
+malloc_safe_bcopy (afrom, ato, size)
+     genptr_t afrom;
+     genptr_t ato;
+     size_t size;
+{
+  char *from, *to;
+
+  from = afrom;
+  to = ato;
+  if (size <= 0 || from == to)
+    return;
+
+  /* If the source and destination don't overlap, then bcopy can
+     handle it.  If they do overlap, but the destination is lower in
+     memory than the source, we'll assume bcopy can handle that.  */
+  if (to < from || from + size <= to)
+    bcopy (from, to, size);
+
+  /* Otherwise, we'll copy from the end.  */
+  else
+    {
+      register char *endf = from + size;
+      register char *endt = to + size;
+
+      /* If TO - FROM is large, then we should break the copy into
+        nonoverlapping chunks of TO - FROM bytes each.  However, if
+        TO - FROM is small, then the bcopy function call overhead
+        makes this not worth it.  The crossover point could be about
+        anywhere.  Since I don't think the obvious copy loop is too
+        bad, I'm trying to err in its favor.  */
+      if (to - from < 64)
+       {
+         do
+           *--endt = *--endf;
+         while (endf != from);
+       }
+      else
+       {
+         for (;;)
+           {
+             endt -= (to - from);
+             endf -= (to - from);
+
+             if (endt < to)
+               break;
+
+             bcopy (endf, endt, to - from);
+           }
+
+         /* If SIZE wasn't a multiple of TO - FROM, there will be a
+            little left over.  The amount left over is
+            (endt + (to - from)) - to, which is endt - from.  */
+         bcopy (from, to, endt - from);
+       }
+    }
+}
+#endif /* !HAVE_MEMMOVE */
+
+/* Resize the given region to the new size, returning a pointer
+   to the (possibly moved) region.  This is optimized for speed;
+   some benchmarks seem to indicate that greater compactness is
+   achieved by unconditionally allocating and copying to a
+   new region.  This module has incestuous knowledge of the
+   internals of both free and malloc. */
+static genptr_t
+irealloc (ptr, size)
+     genptr_t ptr;
+     size_t size;
+{
+  genptr_t result;
+  int type;
+  size_t block, blocks, oldlimit;
+
+  if (size == 0)
+    {
+      ifree (ptr);
+      return imalloc (0);
+    }
+  else if (ptr == NULL)
+    return imalloc (size);
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Maybe reallocate a large block to a small fragment.  */
+      if (size <= BLOCKSIZE / 2)
+       {
+         result = imalloc (size);
+         if (result != NULL)
+           {
+             memcpy (result, ptr, size);
+             ifree (ptr);
+             return result;
+           }
+       }
+
+      /* The new size is a large allocation as well;
+        see if we can hold it in place. */
+      blocks = BLOCKIFY (size);
+      if (blocks < _heapinfo[block].busy.info.size)
+       {
+         /* The new size is smaller; return
+            excess memory to the free list. */
+         _heapinfo[block + blocks].busy.type = 0;
+         _heapinfo[block + blocks].busy.info.size
+           = _heapinfo[block].busy.info.size - blocks;
+         _heapinfo[block].busy.info.size = blocks;
+         /* We have just created a new chunk by splitting a chunk in two.
+            Now we will free this chunk; increment the statistics counter
+            so it doesn't become wrong when ifree decrements it.  */
+         ++chunks_used;
+         ifree (ADDRESS (block + blocks));
+         result = ptr;
+       }
+      else if (blocks == _heapinfo[block].busy.info.size)
+       /* No size change necessary.  */
+       result = ptr;
+      else
+       {
+         /* Won't fit, so allocate a new region that will.
+            Free the old region first in case there is sufficient
+            adjacent free space to grow without moving. */
+         blocks = _heapinfo[block].busy.info.size;
+         /* Prevent free from actually returning memory to the system.  */
+         oldlimit = _heaplimit;
+         _heaplimit = 0;
+         ifree (ptr);
+         result = imalloc (size);
+         if (_heaplimit == 0)
+           _heaplimit = oldlimit;
+         if (result == NULL)
+           {
+             /* Now we're really in trouble.  We have to unfree
+                the thing we just freed.  Unfortunately it might
+                have been coalesced with its neighbors.  */
+             if (_heapindex == block)
+               (void) imalloc (blocks * BLOCKSIZE);
+             else
+               {
+                 genptr_t previous;
+                 previous  = imalloc ((block - _heapindex) * BLOCKSIZE);
+                 (void) imalloc (blocks * BLOCKSIZE);
+                 ifree (previous);
+               }
+             return NULL;
+           }
+         if (ptr != result)
+           memmove (result, ptr, blocks * BLOCKSIZE);
+       }
+      break;
+
+    default:
+      /* Old size is a fragment; type is logarithm
+        to base two of the fragment size.  */
+      if (size > (size_t) (1 << (type - 1)) &&
+         size <= (size_t) (1 << type))
+       /* The new size is the same kind of fragment.  */
+       result = ptr;
+      else
+       {
+         /* The new size is different; allocate a new space,
+            and copy the lesser of the new size and the old. */
+         result = imalloc (size);
+         if (result == NULL)
+           return NULL;
+         memcpy (result, ptr, min (size, (size_t) 1 << type));
+         ifree (ptr);
+       }
+      break;
+    }
+
+  return result;
+}
+
+genptr_t
+realloc (ptr, size)
+     genptr_t ptr;
+     size_t size;
+{
+#ifdef RCHECK
+  struct hdr *hdr;
+  size_t osize;
+#endif
+
+  if (malloc_initialized == 0 && malloc_initialize () == 0)
+    return NULL;
+
+  nrealloc++;
+
+#ifdef RCHECK
+  hdr = ((struct hdr *) ptr) - 1;
+  osize = hdr->size;
+
+  checkhdr (hdr);
+  if (size < osize)
+    zmemset ((char *) ptr + size, FREEFLOOD, osize - size);
+  hdr = (struct hdr *) irealloc ((genptr_t) hdr, sizeof (struct hdr) + size + 1);
+  if (hdr == NULL)
+    return NULL;
+
+  hdr->size = size;
+  hdr->magic = MAGICWORD;
+  ((char *) &hdr[1])[size] = MAGICBYTE;
+  if (size > osize)
+    zmemset ((char *) (hdr + 1) + osize, MALLOCFLOOD, size - osize);
+  return (genptr_t) (hdr + 1);
+#else
+  return (irealloc (ptr, size));
+#endif
+}
+
+/* Allocate an array of NMEMB elements each SIZE bytes long.
+   The entire array is initialized to zeros.  */
+genptr_t
+calloc (nmemb, size)
+     register size_t nmemb;
+     register size_t size;
+{
+  register genptr_t result;
+
+  result = malloc (nmemb * size);
+  if (result != NULL)
+    (void) memset (result, 0, nmemb * size);
+
+  return result;
+}
+
+/* Define the `cfree' alias for `free'.  */
+void
+cfree (ptr)
+     genptr_t ptr;
+{
+  free (ptr);
+}
+
+genptr_t
+memalign (alignment, size)
+     size_t alignment;
+     size_t size;
+{
+  genptr_t result;
+  unsigned long int adj, lastadj;
+
+  /* Allocate a block with enough extra space to pad the block with up to
+     (ALIGNMENT - 1) bytes if necessary.  */
+  result = malloc (size + alignment - 1);
+  if (result == NULL)
+    return NULL;
+
+  /* Figure out how much we will need to pad this particular block
+     to achieve the required alignment.  */
+  adj = (unsigned long int) ((char *) result - (char *) NULL) % alignment;
+
+  do
+    {
+      /* Reallocate the block with only as much excess as it needs.  */
+      free (result);
+      result = malloc (adj + size);
+      if (result == NULL)      /* Impossible unless interrupted.  */
+       return NULL;
+
+      lastadj = adj;
+      adj = (unsigned long int) ((char *) result - (char *) NULL) % alignment;
+      /* It's conceivable we might have been so unlucky as to get a
+        different block with weaker alignment.  If so, this block is too
+        short to contain SIZE after alignment correction.  So we must
+        try again and get another block, slightly larger.  */
+    } while (adj > lastadj);
+
+  if (adj != 0)
+    {
+      /* Record this block in the list of aligned blocks, so that `free'
+        can identify the pointer it is passed, which will be in the middle
+        of an allocated block.  */
+
+      struct alignlist *l;
+      for (l = _aligned_blocks; l != NULL; l = l->next)
+       if (l->aligned == NULL)
+         /* This slot is free.  Use it.  */
+         break;
+      if (l == NULL)
+       {
+         l = (struct alignlist *) imalloc (sizeof (struct alignlist));
+         if (l == NULL)
+           {
+             free (result);
+             return NULL;
+           }
+         l->next = _aligned_blocks;
+         _aligned_blocks = l;
+       }
+      l->exact = result;
+      result = l->aligned = (char *) result + alignment - adj;
+    }
+
+  return result;
+}
+
+/* On some ANSI C systems, some libc functions call _malloc, _free
+   and _realloc.  Make them use the GNU functions.  */
+
+genptr_t
+_malloc (size)
+     size_t size;
+{
+  return malloc (size);
+}
+
+void
+_free (ptr)
+     genptr_t ptr;
+{
+  free (ptr);
+}
+
+genptr_t
+_realloc (ptr, size)
+     genptr_t ptr;
+     size_t size;
+{
+  return realloc (ptr, size);
+}
+
+struct mstats
+mstats ()
+{
+  struct mstats result;
+         
+  result.bytes_total = (char *) default_morecore (0) - _heapbase;
+  result.chunks_used = chunks_used;
+  result.bytes_used = bytes_used;
+  result.chunks_free = chunks_free;
+  result.bytes_free = bytes_free;
+  result.nmalloc = nmalloc;
+  result.nrealloc = nrealloc;
+  result.nfree = nfree;
+  result.nsbrk = nsbrk;
+  result.tsbrk = tsbrk;
+  result.negsbrk = negsbrk;
+  result.tnegsbrk = tnegsbrk;
+
+  return result;
+}
+
+#ifdef RCHECK
+/* Standard debugging hooks for `malloc'. */
+
+static void
+zmemset (ptr, val, size)
+     genptr_t ptr;
+     int val;
+     size_t size;
+{
+  char *cp = ptr;
+
+  while (size--)
+    *cp++ = val;
+}
+
+static enum mcheck_status
+checkhdr (hdr)
+     const struct hdr *hdr;
+{
+  enum mcheck_status status;
+
+  switch (hdr->magic)
+    {
+    default:
+      status = MCHECK_HEAD;
+      break;
+    case MAGICFREE:
+      status = MCHECK_FREE;
+      break;
+    case MAGICWORD:
+      if (((char *) &hdr[1])[hdr->size] != MAGICBYTE)
+       status = MCHECK_TAIL;
+      else
+       status = MCHECK_OK;
+      break;
+    }
+  if (status != MCHECK_OK)
+    mabort (status);
+  return status;
+}
+
+#ifndef botch
+botch (msg)
+     char *msg;
+{
+  fprintf (stderr, "mcheck: %s\n", msg);
+  fflush (stderr);
+  abort ();
+}
+#endif
+
+static void
+mabort (status)
+     enum mcheck_status status;
+{
+  const char *msg;
+
+  switch (status)
+    {
+    case MCHECK_OK:
+      msg = "memory is consistent, library is buggy";
+      break;
+    case MCHECK_HEAD:
+      msg = "memory clobbered before allocated block";
+      break;
+    case MCHECK_TAIL:
+      msg = "memory clobbered past end of allocated block";
+      break;
+    case MCHECK_FREE:
+      msg = "block freed twice";
+      break;
+    default:
+      msg = "bogus mcheck_status, library is buggy";
+      break;
+    }
+
+  botch (msg);
+}
+
+enum mcheck_status
+mprobe (ptr)
+     genptr_t ptr;
+{
+  return checkhdr ((struct hdr *)ptr);
+}
+
+#ifndef STDIO_H_INCLUDED
+#  include <stdio.h>
+#endif
+
+void
+print_malloc_stats (s)
+     char *s;
+{
+  struct mstats ms;
+
+  ms = mstats ();
+  fprintf (stderr, "Memory allocation statistics: %s\n", s ? s : "");
+  fprintf (stderr, "\nTotal chunks in use: %d, total chunks free: %d\n",
+          ms.chunks_used, ms.chunks_free);
+  fprintf (stderr, "Total bytes in use: %u, total bytes free: %u\n",
+          ms.bytes_used, ms.bytes_free);
+  fprintf (stderr, "Total bytes (from heapbase): %d\n", ms.bytes_total);
+  fprintf (stderr, "Total mallocs: %d, total frees: %d, total reallocs: %d\n",
+          ms.nmalloc, ms.nfree, ms.nrealloc);
+  fprintf (stderr, "Total sbrks: %d, total bytes via sbrk: %d\n",
+          ms.nsbrk, ms.tsbrk);
+  fprintf (stderr, "Total negative sbrks: %d, total bytes returned to kernel: %d\n",
+          ms.negsbrk, ms.tnegsbrk);
+}
+#endif /* RCHECK */
diff --git a/lib/malloc/OLD/ogmalloc.c b/lib/malloc/OLD/ogmalloc.c
new file mode 100644 (file)
index 0000000..6b3600a
--- /dev/null
@@ -0,0 +1,1579 @@
+/* DO NOT EDIT THIS FILE -- it is automagically generated.  -*- C -*- */
+
+#define _MALLOC_INTERNAL
+
+/* The malloc headers and source files from the C library follow here.  */
+
+/* Declarations for `malloc' and friends.
+   Copyright 1990, 91, 92, 93, 95, 96 Free Software Foundation, Inc.
+                 Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef _MALLOC_H
+
+#define _MALLOC_H      1
+
+#ifdef _MALLOC_INTERNAL
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if    defined(_LIBC) || defined(STDC_HEADERS) || defined(USG)
+#include <string.h>
+#else
+#ifndef memset
+#define        memset(s, zero, n)      bzero ((s), (n))
+#endif
+#ifndef memcpy
+#define        memcpy(d, s, n)         bcopy ((s), (d), (n))
+#endif
+#endif
+
+#if    defined (__GNU_LIBRARY__) || (defined (__STDC__) && __STDC__)
+#include <limits.h>
+#else
+#ifndef CHAR_BIT
+#define        CHAR_BIT        8
+#endif
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#endif /* _MALLOC_INTERNAL.  */
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
+#undef __P
+#define        __P(args)       args
+#undef __ptr_t
+#define        __ptr_t         void *
+#else /* Not C++ or ANSI C.  */
+#undef __P
+#define        __P(args)       ()
+#undef const
+#define        const
+#undef __ptr_t
+#define        __ptr_t         char *
+#endif /* C++ or ANSI C.  */
+
+#if defined (__STDC__) && __STDC__
+#include <stddef.h>
+#define        __malloc_size_t         size_t
+#define        __malloc_ptrdiff_t      ptrdiff_t
+#else
+#define        __malloc_size_t         unsigned int
+#define        __malloc_ptrdiff_t      int
+#endif
+
+#ifndef        NULL
+#define        NULL    0
+#endif
+
+
+/* Allocate SIZE bytes of memory.  */
+extern __ptr_t malloc __P ((__malloc_size_t __size));
+/* Re-allocate the previously allocated block
+   in __ptr_t, making the new block SIZE bytes long.  */
+extern __ptr_t realloc __P ((__ptr_t __ptr, __malloc_size_t __size));
+/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0.  */
+extern __ptr_t calloc __P ((__malloc_size_t __nmemb, __malloc_size_t __size));
+/* Free a block allocated by `malloc', `realloc' or `calloc'.  */
+extern void free __P ((__ptr_t __ptr));
+
+/* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
+#if ! (defined (_MALLOC_INTERNAL) && __DJGPP__ - 0 == 1) /* Avoid conflict.  */
+extern __ptr_t memalign __P ((__malloc_size_t __alignment,
+                             __malloc_size_t __size));
+#endif
+
+/* Allocate SIZE bytes on a page boundary.  */
+#if ! (defined (_MALLOC_INTERNAL) && defined (emacs)) /* Avoid conflict.  */
+extern __ptr_t valloc __P ((__malloc_size_t __size));
+#endif
+
+
+#ifdef _MALLOC_INTERNAL
+
+/* The allocator divides the heap into blocks of fixed size; large
+   requests receive one or more whole blocks, and small requests
+   receive a fragment of a block.  Fragment sizes are powers of two,
+   and all fragments of a block are the same size.  When all the
+   fragments in a block have been freed, the block itself is freed.  */
+#define INT_BIT                (CHAR_BIT * sizeof(int))
+#define BLOCKLOG       (INT_BIT > 16 ? 12 : 9)
+#define BLOCKSIZE      (1 << BLOCKLOG)
+#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
+
+/* Determine the amount of memory spanned by the initial heap table
+   (not an absolute limit).  */
+#define HEAP           (INT_BIT > 16 ? 4194304 : 65536)
+
+/* Number of contiguous free blocks allowed to build up at the end of
+   memory before they will be returned to the system.  */
+#define FINAL_FREE_BLOCKS      8
+
+/* Data structure giving per-block information.  */
+typedef union
+  {
+    /* Heap information for a busy block.  */
+    struct
+      {
+       /* Zero for a large (multiblock) object, or positive giving the
+          logarithm to the base two of the fragment size.  */
+       int type;
+       union
+         {
+           struct
+             {
+               __malloc_size_t nfree; /* Free frags in a fragmented block.  */
+               __malloc_size_t first; /* First free fragment of the block.  */
+             } frag;
+           /* For a large object, in its first block, this has the number
+              of blocks in the object.  In the other blocks, this has a
+              negative number which says how far back the first block is.  */
+           __malloc_ptrdiff_t size;
+         } info;
+      } busy;
+    /* Heap information for a free block
+       (that may be the first of a free cluster).  */
+    struct
+      {
+       __malloc_size_t size;   /* Size (in blocks) of a free cluster.  */
+       __malloc_size_t next;   /* Index of next free cluster.  */
+       __malloc_size_t prev;   /* Index of previous free cluster.  */
+      } free;
+  } malloc_info;
+
+/* Pointer to first block of the heap.  */
+extern char *_heapbase;
+
+/* Table indexed by block number giving per-block information.  */
+extern malloc_info *_heapinfo;
+
+/* Address to block number and vice versa.  */
+#define BLOCK(A)       (((char *) (A) - _heapbase) / BLOCKSIZE + 1)
+#define ADDRESS(B)     ((__ptr_t) (((B) - 1) * BLOCKSIZE + _heapbase))
+
+/* Current search index for the heap table.  */
+extern __malloc_size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+extern __malloc_size_t _heaplimit;
+
+/* Doubly linked lists of free fragments.  */
+struct list
+  {
+    struct list *next;
+    struct list *prev;
+  };
+
+/* Free list headers for each fragment size.  */
+extern struct list _fraghead[];
+
+/* List of blocks allocated with `memalign' (or `valloc').  */
+struct alignlist
+  {
+    struct alignlist *next;
+    __ptr_t aligned;           /* The address that memaligned returned.  */
+    __ptr_t exact;             /* The address that malloc returned.  */
+  };
+extern struct alignlist *_aligned_blocks;
+
+/* Instrumentation.  */
+extern __malloc_size_t _chunks_used;
+extern __malloc_size_t _bytes_used;
+extern __malloc_size_t _chunks_free;
+extern __malloc_size_t _bytes_free;
+
+/* Internal versions of `malloc', `realloc', and `free'
+   used when these functions need to call each other.
+   They are the same but don't call the hooks.  */
+extern __ptr_t _malloc_internal __P ((__malloc_size_t __size));
+extern __ptr_t _realloc_internal __P ((__ptr_t __ptr, __malloc_size_t __size));
+extern void _free_internal __P ((__ptr_t __ptr));
+
+#endif /* _MALLOC_INTERNAL.  */
+
+/* Given an address in the middle of a malloc'd object,
+   return the address of the beginning of the object.  */
+extern __ptr_t malloc_find_object_address __P ((__ptr_t __ptr));
+
+/* Underlying allocation function; successive calls should
+   return contiguous pieces of memory.  */
+extern __ptr_t (*__morecore) __P ((__malloc_ptrdiff_t __size));
+
+/* Default value of `__morecore'.  */
+extern __ptr_t __default_morecore __P ((__malloc_ptrdiff_t __size));
+
+/* If not NULL, this function is called after each time
+   `__morecore' is called to increase the data size.  */
+extern void (*__after_morecore_hook) __P ((void));
+
+/* Number of extra blocks to get each time we ask for more core.
+   This reduces the frequency of calling `(*__morecore)'.  */
+extern __malloc_size_t __malloc_extra_blocks;
+
+/* Nonzero if `malloc' has been called and done its initialization.  */
+extern int __malloc_initialized;
+/* Function called to initialize malloc data structures.  */
+extern int __malloc_initialize __P ((void));
+
+/* Hooks for debugging versions.  */
+extern void (*__malloc_initialize_hook) __P ((void));
+extern void (*__free_hook) __P ((__ptr_t __ptr));
+extern __ptr_t (*__malloc_hook) __P ((__malloc_size_t __size));
+extern __ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, __malloc_size_t __size));
+extern __ptr_t (*__memalign_hook) __P ((__malloc_size_t __size,
+                                       __malloc_size_t __alignment));
+
+/* Return values for `mprobe': these are the kinds of inconsistencies that
+   `mcheck' enables detection of.  */
+enum mcheck_status
+  {
+    MCHECK_DISABLED = -1,      /* Consistency checking is not turned on.  */
+    MCHECK_OK,                 /* Block is fine.  */
+    MCHECK_FREE,               /* Block freed twice.  */
+    MCHECK_HEAD,               /* Memory before the block was clobbered.  */
+    MCHECK_TAIL                        /* Memory after the block was clobbered.  */
+  };
+
+/* Activate a standard collection of debugging hooks.  This must be called
+   before `malloc' is ever called.  ABORTFUNC is called with an error code
+   (see enum above) when an inconsistency is detected.  If ABORTFUNC is
+   null, the standard function prints on stderr and then calls `abort'.  */
+extern int mcheck __P ((void (*__abortfunc) __P ((enum mcheck_status))));
+
+/* Check for aberrations in a particular malloc'd block.  You must have
+   called `mcheck' already.  These are the same checks that `mcheck' does
+   when you free or reallocate a block.  */
+extern enum mcheck_status mprobe __P ((__ptr_t __ptr));
+
+/* Activate a standard collection of tracing hooks.  */
+extern void mtrace __P ((void));
+extern void muntrace __P ((void));
+
+/* Statistics available to the user.  */
+struct mstats
+  {
+    __malloc_size_t bytes_total; /* Total size of the heap. */
+    __malloc_size_t chunks_used; /* Chunks allocated by the user. */
+    __malloc_size_t bytes_used;        /* Byte total of user-allocated chunks. */
+    __malloc_size_t chunks_free; /* Chunks in the free list. */
+    __malloc_size_t bytes_free;        /* Byte total of chunks in the free list. */
+  };
+
+/* Pick up the current statistics. */
+extern struct mstats mstats __P ((void));
+
+/* Call WARNFUN with a warning message when memory usage is high.  */
+extern void memory_warnings __P ((__ptr_t __start,
+                                 void (*__warnfun) __P ((const char *))));
+
+
+/* Relocating allocator.  */
+
+/* Allocate SIZE bytes, and store the address in *HANDLEPTR.  */
+extern __ptr_t r_alloc __P ((__ptr_t *__handleptr, __malloc_size_t __size));
+
+/* Free the storage allocated in HANDLEPTR.  */
+extern void r_alloc_free __P ((__ptr_t *__handleptr));
+
+/* Adjust the block at HANDLEPTR to be SIZE bytes long.  */
+extern __ptr_t r_re_alloc __P ((__ptr_t *__handleptr, __malloc_size_t __size));
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* malloc.h  */
+/* Memory allocator `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+                 Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef        _MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+#include <errno.h>
+
+/* How to really get more memory.  */
+__ptr_t (*__morecore) __P ((ptrdiff_t __size)) = __default_morecore;
+
+/* Debugging hook for `malloc'.  */
+__ptr_t (*__malloc_hook) __P ((__malloc_size_t __size));
+
+/* Pointer to the base of the first block.  */
+char *_heapbase;
+
+/* Block information table.  Allocated with align/__free (not malloc/free).  */
+malloc_info *_heapinfo;
+
+/* Number of info entries.  */
+static __malloc_size_t heapsize;
+
+/* Search index in the info table.  */
+__malloc_size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+__malloc_size_t _heaplimit;
+
+/* Free lists for each fragment size.  */
+struct list _fraghead[BLOCKLOG];
+
+/* Instrumentation.  */
+__malloc_size_t _chunks_used;
+__malloc_size_t _bytes_used;
+__malloc_size_t _chunks_free;
+__malloc_size_t _bytes_free;
+
+/* Are you experienced?  */
+int __malloc_initialized;
+
+__malloc_size_t __malloc_extra_blocks;
+
+void (*__malloc_initialize_hook) __P ((void));
+void (*__after_morecore_hook) __P ((void));
+
+
+/* Aligned allocation.  */
+static __ptr_t align __P ((__malloc_size_t));
+static __ptr_t
+align (size)
+     __malloc_size_t size;
+{
+  __ptr_t result;
+  unsigned long int adj;
+
+  result = (*__morecore) (size);
+  adj = (unsigned long int) ((unsigned long int) ((char *) result -
+                                                 (char *) NULL)) % BLOCKSIZE;
+  if (adj != 0)
+    {
+      __ptr_t new;
+      adj = BLOCKSIZE - adj;
+      new = (*__morecore) (adj);
+      result = (char *) result + adj;
+    }
+
+  if (__after_morecore_hook)
+    (*__after_morecore_hook) ();
+
+  return result;
+}
+
+/* Get SIZE bytes, if we can get them starting at END.
+   Return the address of the space we got.
+   If we cannot get space at END, fail and return -1.  */
+static __ptr_t get_contiguous_space __P ((__malloc_ptrdiff_t, __ptr_t));
+static __ptr_t
+get_contiguous_space (size, position)
+     __malloc_ptrdiff_t size;
+     __ptr_t position;
+{
+  __ptr_t before;
+  __ptr_t after;
+
+  before = (*__morecore) (0);
+  /* If we can tell in advance that the break is at the wrong place,
+     fail now.  */
+  if (before != position)
+    return 0;
+
+  /* Allocate SIZE bytes and get the address of them.  */
+  after = (*__morecore) (size);
+  if (!after)
+    return 0;
+
+  /* It was not contiguous--reject it.  */
+  if (after != position)
+    {
+      (*__morecore) (- size);
+      return 0;
+    }
+
+  return after;
+}
+
+
+/* This is called when `_heapinfo' and `heapsize' have just
+   been set to describe a new info table.  Set up the table
+   to describe itself and account for it in the statistics.  */
+static void register_heapinfo __P ((void));
+#ifdef __GNUC__
+__inline__
+#endif
+static void
+register_heapinfo ()
+{
+  __malloc_size_t block, blocks;
+
+  block = BLOCK (_heapinfo);
+  blocks = BLOCKIFY (heapsize * sizeof (malloc_info));
+
+  /* Account for the _heapinfo block itself in the statistics.  */
+  _bytes_used += blocks * BLOCKSIZE;
+  ++_chunks_used;
+
+  /* Describe the heapinfo block itself in the heapinfo.  */
+  _heapinfo[block].busy.type = 0;
+  _heapinfo[block].busy.info.size = blocks;
+  /* Leave back-pointers for malloc_find_address.  */
+  while (--blocks > 0)
+    _heapinfo[block + blocks].busy.info.size = -blocks;
+}
+
+/* Set everything up and remember that we have.  */
+int
+__malloc_initialize ()
+{
+  if (__malloc_initialized)
+    return 0;
+
+  if (__malloc_initialize_hook)
+    (*__malloc_initialize_hook) ();
+
+  heapsize = HEAP / BLOCKSIZE;
+  _heapinfo = (malloc_info *) align (heapsize * sizeof (malloc_info));
+  if (_heapinfo == NULL)
+    return 0;
+  memset (_heapinfo, 0, heapsize * sizeof (malloc_info));
+  _heapinfo[0].free.size = 0;
+  _heapinfo[0].free.next = _heapinfo[0].free.prev = 0;
+  _heapindex = 0;
+  _heapbase = (char *) _heapinfo;
+  _heaplimit = BLOCK (_heapbase + heapsize * sizeof (malloc_info));
+
+  register_heapinfo ();
+
+  __malloc_initialized = 1;
+  return 1;
+}
+
+static int morecore_recursing;
+
+/* Get neatly aligned memory, initializing or
+   growing the heap info table as necessary. */
+static __ptr_t morecore __P ((__malloc_size_t));
+static __ptr_t
+morecore (size)
+     __malloc_size_t size;
+{
+  __ptr_t result;
+  malloc_info *newinfo, *oldinfo;
+  __malloc_size_t newsize;
+
+  if (morecore_recursing)
+    /* Avoid recursion.  The caller will know how to handle a null return.  */
+    return NULL;
+
+  result = align (size);
+  if (result == NULL)
+    return NULL;
+
+  /* Check if we need to grow the info table.  */
+  if ((__malloc_size_t) BLOCK ((char *) result + size) > heapsize)
+    {
+      /* Calculate the new _heapinfo table size.  We do not account for the
+        added blocks in the table itself, as we hope to place them in
+        existing free space, which is already covered by part of the
+        existing table.  */
+      newsize = heapsize;
+      do
+       newsize *= 2;
+      while ((__malloc_size_t) BLOCK ((char *) result + size) > newsize);
+
+      /* We must not reuse existing core for the new info table when called
+        from realloc in the case of growing a large block, because the
+        block being grown is momentarily marked as free.  In this case
+        _heaplimit is zero so we know not to reuse space for internal
+        allocation.  */
+      if (_heaplimit != 0)
+       {
+         /* First try to allocate the new info table in core we already
+            have, in the usual way using realloc.  If realloc cannot
+            extend it in place or relocate it to existing sufficient core,
+            we will get called again, and the code above will notice the
+            `morecore_recursing' flag and return null.  */
+         int save = errno;     /* Don't want to clobber errno with ENOMEM.  */
+         morecore_recursing = 1;
+         newinfo = (malloc_info *) _realloc_internal
+           (_heapinfo, newsize * sizeof (malloc_info));
+         morecore_recursing = 0;
+         if (newinfo == NULL)
+           errno = save;
+         else
+           {
+             /* We found some space in core, and realloc has put the old
+                table's blocks on the free list.  Now zero the new part
+                of the table and install the new table location.  */
+             memset (&newinfo[heapsize], 0,
+                     (newsize - heapsize) * sizeof (malloc_info));
+             _heapinfo = newinfo;
+             heapsize = newsize;
+             goto got_heap;
+           }
+       }
+
+      /* Allocate new space for the malloc info table.  */
+      while (1)
+       {
+         newinfo = (malloc_info *) align (newsize * sizeof (malloc_info));
+
+         /* Did it fail?  */
+         if (newinfo == NULL)
+           {
+             (*__morecore) (-size);
+             return NULL;
+           }
+
+         /* Is it big enough to record status for its own space?
+            If so, we win.  */
+         if ((__malloc_size_t) BLOCK ((char *) newinfo
+                                      + newsize * sizeof (malloc_info))
+             < newsize)
+           break;
+
+         /* Must try again.  First give back most of what we just got.  */
+         (*__morecore) (- newsize * sizeof (malloc_info));
+         newsize *= 2;
+       }
+
+      /* Copy the old table to the beginning of the new,
+        and zero the rest of the new table.  */
+      memcpy (newinfo, _heapinfo, heapsize * sizeof (malloc_info));
+      memset (&newinfo[heapsize], 0,
+             (newsize - heapsize) * sizeof (malloc_info));
+      oldinfo = _heapinfo;
+      _heapinfo = newinfo;
+      heapsize = newsize;
+
+      register_heapinfo ();
+
+      /* Reset _heaplimit so _free_internal never decides
+        it can relocate or resize the info table.  */
+      _heaplimit = 0;
+      _free_internal (oldinfo);
+
+      /* The new heap limit includes the new table just allocated.  */
+      _heaplimit = BLOCK ((char *) newinfo + heapsize * sizeof (malloc_info));
+      return result;
+    }
+
+ got_heap:
+  _heaplimit = BLOCK ((char *) result + size);
+  return result;
+}
+
+/* Allocate memory from the heap.  */
+__ptr_t
+_malloc_internal (size)
+     __malloc_size_t size;
+{
+  __ptr_t result;
+  __malloc_size_t block, blocks, lastblocks, start;
+  register __malloc_size_t i;
+  struct list *next;
+
+  /* ANSI C allows `malloc (0)' to either return NULL, or to return a
+     valid address you can realloc and free (though not dereference).
+
+     It turns out that some extant code (sunrpc, at least Ultrix's version)
+     expects `malloc (0)' to return non-NULL and breaks otherwise.
+     Be compatible.  */
+
+#if    0
+  if (size == 0)
+    return NULL;
+#endif
+
+  if (size < sizeof (struct list))
+    size = sizeof (struct list);
+
+#ifdef SUNOS_LOCALTIME_BUG
+  if (size < 16)
+    size = 16;
+#endif
+
+  /* Determine the allocation policy based on the request size.  */
+  if (size <= BLOCKSIZE / 2)
+    {
+      /* Small allocation to receive a fragment of a block.
+        Determine the logarithm to base two of the fragment size. */
+      register __malloc_size_t log = 1;
+      --size;
+      while ((size /= 2) != 0)
+       ++log;
+
+      /* Look in the fragment lists for a
+        free fragment of the desired size. */
+      next = _fraghead[log].next;
+      if (next != NULL)
+       {
+         /* There are free fragments of this size.
+            Pop a fragment out of the fragment list and return it.
+            Update the block's nfree and first counters. */
+         result = (__ptr_t) next;
+         next->prev->next = next->next;
+         if (next->next != NULL)
+           next->next->prev = next->prev;
+         block = BLOCK (result);
+         if (--_heapinfo[block].busy.info.frag.nfree != 0)
+           _heapinfo[block].busy.info.frag.first = (unsigned long int)
+             ((unsigned long int) ((char *) next->next - (char *) NULL)
+              % BLOCKSIZE) >> log;
+
+         /* Update the statistics.  */
+         ++_chunks_used;
+         _bytes_used += 1 << log;
+         --_chunks_free;
+         _bytes_free -= 1 << log;
+       }
+      else
+       {
+         /* No free fragments of the desired size, so get a new block
+            and break it into fragments, returning the first.  */
+         result = malloc (BLOCKSIZE);
+         if (result == NULL)
+           return NULL;
+
+         /* Link all fragments but the first into the free list.  */
+         next = (struct list *) ((char *) result + (1 << log));
+         next->next = NULL;
+         next->prev = &_fraghead[log];
+         _fraghead[log].next = next;
+
+         for (i = 2; i < (__malloc_size_t) (BLOCKSIZE >> log); ++i)
+           {
+             next = (struct list *) ((char *) result + (i << log));
+             next->next = _fraghead[log].next;
+             next->prev = &_fraghead[log];
+             next->prev->next = next;
+             next->next->prev = next;
+           }
+
+         /* Initialize the nfree and first counters for this block.  */
+         block = BLOCK (result);
+         _heapinfo[block].busy.type = log;
+         _heapinfo[block].busy.info.frag.nfree = i - 1;
+         _heapinfo[block].busy.info.frag.first = i - 1;
+
+         _chunks_free += (BLOCKSIZE >> log) - 1;
+         _bytes_free += BLOCKSIZE - (1 << log);
+         _bytes_used -= BLOCKSIZE - (1 << log);
+       }
+    }
+  else
+    {
+      /* Large allocation to receive one or more blocks.
+        Search the free list in a circle starting at the last place visited.
+        If we loop completely around without finding a large enough
+        space we will have to get more memory from the system.  */
+      blocks = BLOCKIFY (size);
+      start = block = _heapindex;
+      while (_heapinfo[block].free.size < blocks)
+       {
+         block = _heapinfo[block].free.next;
+         if (block == start)
+           {
+             /* Need to get more from the system.  Get a little extra.  */
+             __malloc_size_t wantblocks = blocks + __malloc_extra_blocks;
+             block = _heapinfo[0].free.prev;
+             lastblocks = _heapinfo[block].free.size;
+             /* Check to see if the new core will be contiguous with the
+                final free block; if so we don't need to get as much.  */
+             if (_heaplimit != 0 && block + lastblocks == _heaplimit &&
+                 /* We can't do this if we will have to make the heap info
+                     table bigger to accomodate the new space.  */
+                 block + wantblocks <= heapsize &&
+                 get_contiguous_space ((wantblocks - lastblocks) * BLOCKSIZE,
+                                       ADDRESS (block + lastblocks)))
+               {
+                 /* We got it contiguously.  Which block we are extending
+                    (the `final free block' referred to above) might have
+                    changed, if it got combined with a freed info table.  */
+                 block = _heapinfo[0].free.prev;
+                 _heapinfo[block].free.size += (wantblocks - lastblocks);
+                 _bytes_free += (wantblocks - lastblocks) * BLOCKSIZE;
+                 _heaplimit += wantblocks - lastblocks;
+                 continue;
+               }
+             result = morecore (wantblocks * BLOCKSIZE);
+             if (result == NULL)
+               return NULL;
+             block = BLOCK (result);
+             /* Put the new block at the end of the free list.  */
+             _heapinfo[block].free.size = wantblocks;
+             _heapinfo[block].free.prev = _heapinfo[0].free.prev;
+             _heapinfo[block].free.next = 0;
+             _heapinfo[0].free.prev = block;
+             _heapinfo[_heapinfo[block].free.prev].free.next = block;
+             ++_chunks_free;
+             /* Now loop to use some of that block for this allocation.  */
+           }
+       }
+
+      /* At this point we have found a suitable free list entry.
+        Figure out how to remove what we need from the list. */
+      result = ADDRESS (block);
+      if (_heapinfo[block].free.size > blocks)
+       {
+         /* The block we found has a bit left over,
+            so relink the tail end back into the free list. */
+         _heapinfo[block + blocks].free.size
+           = _heapinfo[block].free.size - blocks;
+         _heapinfo[block + blocks].free.next
+           = _heapinfo[block].free.next;
+         _heapinfo[block + blocks].free.prev
+           = _heapinfo[block].free.prev;
+         _heapinfo[_heapinfo[block].free.prev].free.next
+           = _heapinfo[_heapinfo[block].free.next].free.prev
+           = _heapindex = block + blocks;
+       }
+      else
+       {
+         /* The block exactly matches our requirements,
+            so just remove it from the list. */
+         _heapinfo[_heapinfo[block].free.next].free.prev
+           = _heapinfo[block].free.prev;
+         _heapinfo[_heapinfo[block].free.prev].free.next
+           = _heapindex = _heapinfo[block].free.next;
+         --_chunks_free;
+       }
+
+      _heapinfo[block].busy.type = 0;
+      _heapinfo[block].busy.info.size = blocks;
+      ++_chunks_used;
+      _bytes_used += blocks * BLOCKSIZE;
+      _bytes_free -= blocks * BLOCKSIZE;
+
+      /* Mark all the blocks of the object just allocated except for the
+        first with a negative number so you can find the first block by
+        adding that adjustment.  */
+      while (--blocks > 0)
+       _heapinfo[block + blocks].busy.info.size = -blocks;
+    }
+
+  return result;
+}
+
+__ptr_t
+malloc (size)
+     __malloc_size_t size;
+{
+  if (!__malloc_initialized && !__malloc_initialize ())
+    return NULL;
+
+  return (__malloc_hook != NULL ? *__malloc_hook : _malloc_internal) (size);
+}
+\f
+#ifndef _LIBC
+
+/* On some ANSI C systems, some libc functions call _malloc, _free
+   and _realloc.  Make them use the GNU functions.  */
+
+__ptr_t
+_malloc (size)
+     __malloc_size_t size;
+{
+  return malloc (size);
+}
+
+void
+_free (ptr)
+     __ptr_t ptr;
+{
+  free (ptr);
+}
+
+__ptr_t
+_realloc (ptr, size)
+     __ptr_t ptr;
+     __malloc_size_t size;
+{
+  return realloc (ptr, size);
+}
+
+#endif
+/* Free a block of memory allocated by `malloc'.
+   Copyright 1990, 1991, 1992, 1994, 1995 Free Software Foundation, Inc.
+                 Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef        _MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+
+/* Cope with systems lacking `memmove'.    */
+#ifndef memmove
+#if  (defined (MEMMOVE_MISSING) || \
+      !defined(_LIBC) && !defined(STDC_HEADERS) && !defined(USG))
+#ifdef emacs
+#undef __malloc_safe_bcopy
+#define __malloc_safe_bcopy safe_bcopy
+#endif
+/* This function is defined in realloc.c.  */
+extern void __malloc_safe_bcopy __P ((__ptr_t, __ptr_t, __malloc_size_t));
+#define memmove(to, from, size)        __malloc_safe_bcopy ((from), (to), (size))
+#endif
+#endif
+
+
+/* Debugging hook for free.  */
+void (*__free_hook) __P ((__ptr_t __ptr));
+
+/* List of blocks allocated by memalign.  */
+struct alignlist *_aligned_blocks = NULL;
+
+/* Return memory to the heap.
+   Like `free' but don't call a __free_hook if there is one.  */
+void
+_free_internal (ptr)
+     __ptr_t ptr;
+{
+  int type;
+  __malloc_size_t block, blocks;
+  register __malloc_size_t i;
+  struct list *prev, *next;
+  __ptr_t curbrk;
+  const __malloc_size_t lesscore_threshold
+    /* Threshold of free space at which we will return some to the system.  */
+    = FINAL_FREE_BLOCKS + 2 * __malloc_extra_blocks;
+
+  register struct alignlist *l;
+
+  if (ptr == NULL)
+    return;
+
+  for (l = _aligned_blocks; l != NULL; l = l->next)
+    if (l->aligned == ptr)
+      {
+       l->aligned = NULL;      /* Mark the slot in the list as free.  */
+       ptr = l->exact;
+       break;
+      }
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Get as many statistics as early as we can.  */
+      --_chunks_used;
+      _bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE;
+      _bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE;
+
+      /* Find the free cluster previous to this one in the free list.
+        Start searching at the last block referenced; this may benefit
+        programs with locality of allocation.  */
+      i = _heapindex;
+      if (i > block)
+       while (i > block)
+         i = _heapinfo[i].free.prev;
+      else
+       {
+         do
+           i = _heapinfo[i].free.next;
+         while (i > 0 && i < block);
+         i = _heapinfo[i].free.prev;
+       }
+
+      /* Determine how to link this block into the free list.  */
+      if (block == i + _heapinfo[i].free.size)
+       {
+         /* Coalesce this block with its predecessor.  */
+         _heapinfo[i].free.size += _heapinfo[block].busy.info.size;
+         block = i;
+       }
+      else
+       {
+         /* Really link this block back into the free list.  */
+         _heapinfo[block].free.size = _heapinfo[block].busy.info.size;
+         _heapinfo[block].free.next = _heapinfo[i].free.next;
+         _heapinfo[block].free.prev = i;
+         _heapinfo[i].free.next = block;
+         _heapinfo[_heapinfo[block].free.next].free.prev = block;
+         ++_chunks_free;
+       }
+
+      /* Now that the block is linked in, see if we can coalesce it
+        with its successor (by deleting its successor from the list
+        and adding in its size).  */
+      if (block + _heapinfo[block].free.size == _heapinfo[block].free.next)
+       {
+         _heapinfo[block].free.size
+           += _heapinfo[_heapinfo[block].free.next].free.size;
+         _heapinfo[block].free.next
+           = _heapinfo[_heapinfo[block].free.next].free.next;
+         _heapinfo[_heapinfo[block].free.next].free.prev = block;
+         --_chunks_free;
+       }
+
+      /* How many trailing free blocks are there now?  */
+      blocks = _heapinfo[block].free.size;
+
+      /* Where is the current end of accessible core?  */
+      curbrk = (*__morecore) (0);
+
+      if (_heaplimit != 0 && curbrk == ADDRESS (_heaplimit))
+       {
+         /* The end of the malloc heap is at the end of accessible core.
+            It's possible that moving _heapinfo will allow us to
+            return some space to the system.  */
+
+         __malloc_size_t info_block = BLOCK (_heapinfo);
+         __malloc_size_t info_blocks = _heapinfo[info_block].busy.info.size;
+         __malloc_size_t prev_block = _heapinfo[block].free.prev;
+         __malloc_size_t prev_blocks = _heapinfo[prev_block].free.size;
+         __malloc_size_t next_block = _heapinfo[block].free.next;
+         __malloc_size_t next_blocks = _heapinfo[next_block].free.size;
+
+         if (/* Win if this block being freed is last in core, the info table
+                is just before it, the previous free block is just before the
+                info table, and the two free blocks together form a useful
+                amount to return to the system.  */
+             (block + blocks == _heaplimit &&
+              info_block + info_blocks == block &&
+              prev_block != 0 && prev_block + prev_blocks == info_block &&
+              blocks + prev_blocks >= lesscore_threshold) ||
+             /* Nope, not the case.  We can also win if this block being
+                freed is just before the info table, and the table extends
+                to the end of core or is followed only by a free block,
+                and the total free space is worth returning to the system.  */
+             (block + blocks == info_block &&
+              ((info_block + info_blocks == _heaplimit &&
+                blocks >= lesscore_threshold) ||
+               (info_block + info_blocks == next_block &&
+                next_block + next_blocks == _heaplimit &&
+                blocks + next_blocks >= lesscore_threshold)))
+             )
+           {
+             malloc_info *newinfo;
+             __malloc_size_t oldlimit = _heaplimit;
+
+             /* Free the old info table, clearing _heaplimit to avoid
+                recursion into this code.  We don't want to return the
+                table's blocks to the system before we have copied them to
+                the new location.  */
+             _heaplimit = 0;
+             _free_internal (_heapinfo);
+             _heaplimit = oldlimit;
+
+             /* Tell malloc to search from the beginning of the heap for
+                free blocks, so it doesn't reuse the ones just freed.  */
+             _heapindex = 0;
+
+             /* Allocate new space for the info table and move its data.  */
+             newinfo = (malloc_info *) _malloc_internal (info_blocks
+                                                         * BLOCKSIZE);
+             memmove (newinfo, _heapinfo, info_blocks * BLOCKSIZE);
+             _heapinfo = newinfo;
+
+             /* We should now have coalesced the free block with the
+                blocks freed from the old info table.  Examine the entire
+                trailing free block to decide below whether to return some
+                to the system.  */
+             block = _heapinfo[0].free.prev;
+             blocks = _heapinfo[block].free.size;
+           }
+
+         /* Now see if we can return stuff to the system.  */
+         if (block + blocks == _heaplimit && blocks >= lesscore_threshold)
+           {
+             register __malloc_size_t bytes = blocks * BLOCKSIZE;
+             _heaplimit -= blocks;
+             (*__morecore) (-bytes);
+             _heapinfo[_heapinfo[block].free.prev].free.next
+               = _heapinfo[block].free.next;
+             _heapinfo[_heapinfo[block].free.next].free.prev
+               = _heapinfo[block].free.prev;
+             block = _heapinfo[block].free.prev;
+             --_chunks_free;
+             _bytes_free -= bytes;
+           }
+       }
+
+      /* Set the next search to begin at this block.  */
+      _heapindex = block;
+      break;
+
+    default:
+      /* Do some of the statistics.  */
+      --_chunks_used;
+      _bytes_used -= 1 << type;
+      ++_chunks_free;
+      _bytes_free += 1 << type;
+
+      /* Get the address of the first free fragment in this block.  */
+      prev = (struct list *) ((char *) ADDRESS (block) +
+                             (_heapinfo[block].busy.info.frag.first << type));
+
+      if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1)
+       {
+         /* If all fragments of this block are free, remove them
+            from the fragment list and free the whole block.  */
+         next = prev;
+         for (i = 1; i < (__malloc_size_t) (BLOCKSIZE >> type); ++i)
+           next = next->next;
+         prev->prev->next = next;
+         if (next != NULL)
+           next->prev = prev->prev;
+         _heapinfo[block].busy.type = 0;
+         _heapinfo[block].busy.info.size = 1;
+
+         /* Keep the statistics accurate.  */
+         ++_chunks_used;
+         _bytes_used += BLOCKSIZE;
+         _chunks_free -= BLOCKSIZE >> type;
+         _bytes_free -= BLOCKSIZE;
+
+         free (ADDRESS (block));
+       }
+      else if (_heapinfo[block].busy.info.frag.nfree != 0)
+       {
+         /* If some fragments of this block are free, link this
+            fragment into the fragment list after the first free
+            fragment of this block. */
+         next = (struct list *) ptr;
+         next->next = prev->next;
+         next->prev = prev;
+         prev->next = next;
+         if (next->next != NULL)
+           next->next->prev = next;
+         ++_heapinfo[block].busy.info.frag.nfree;
+       }
+      else
+       {
+         /* No fragments of this block are free, so link this
+            fragment into the fragment list and announce that
+            it is the first free fragment of this block. */
+         prev = (struct list *) ptr;
+         _heapinfo[block].busy.info.frag.nfree = 1;
+         _heapinfo[block].busy.info.frag.first = (unsigned long int)
+           ((unsigned long int) ((char *) ptr - (char *) NULL)
+            % BLOCKSIZE >> type);
+         prev->next = _fraghead[type].next;
+         prev->prev = &_fraghead[type];
+         prev->prev->next = prev;
+         if (prev->next != NULL)
+           prev->next->prev = prev;
+       }
+      break;
+    }
+}
+
+/* Return memory to the heap.  */
+void
+free (ptr)
+     __ptr_t ptr;
+{
+  if (__free_hook != NULL)
+    (*__free_hook) (ptr);
+  else
+    _free_internal (ptr);
+}
+
+/* Define the `cfree' alias for `free'.  */
+#ifdef weak_alias
+weak_alias (free, cfree)
+#else
+void
+cfree (ptr)
+     __ptr_t ptr;
+{
+  free (ptr);
+}
+#endif
+/* Change the size of a block allocated by `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+                    Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef        _MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+
+
+/* Cope with systems lacking `memmove'.    */
+#if  (defined (MEMMOVE_MISSING) || \
+      !defined(_LIBC) && !defined(STDC_HEADERS) && !defined(USG))
+
+#ifdef emacs
+#undef __malloc_safe_bcopy
+#define __malloc_safe_bcopy safe_bcopy
+#else
+
+/* Snarfed directly from Emacs src/dispnew.c:
+   XXX Should use system bcopy if it handles overlap.  */
+
+/* Like bcopy except never gets confused by overlap.  */
+
+void
+__malloc_safe_bcopy (afrom, ato, size)
+     __ptr_t afrom;
+     __ptr_t ato;
+     __malloc_size_t size;
+{
+  char *from = afrom, *to = ato;
+
+  if (size <= 0 || from == to)
+    return;
+
+  /* If the source and destination don't overlap, then bcopy can
+     handle it.  If they do overlap, but the destination is lower in
+     memory than the source, we'll assume bcopy can handle that.  */
+  if (to < from || from + size <= to)
+    bcopy (from, to, size);
+
+  /* Otherwise, we'll copy from the end.  */
+  else
+    {
+      register char *endf = from + size;
+      register char *endt = to + size;
+
+      /* If TO - FROM is large, then we should break the copy into
+        nonoverlapping chunks of TO - FROM bytes each.  However, if
+        TO - FROM is small, then the bcopy function call overhead
+        makes this not worth it.  The crossover point could be about
+        anywhere.  Since I don't think the obvious copy loop is too
+        bad, I'm trying to err in its favor.  */
+      if (to - from < 64)
+       {
+         do
+           *--endt = *--endf;
+         while (endf != from);
+       }
+      else
+       {
+         for (;;)
+           {
+             endt -= (to - from);
+             endf -= (to - from);
+
+             if (endt < to)
+               break;
+
+             bcopy (endf, endt, to - from);
+           }
+
+         /* If SIZE wasn't a multiple of TO - FROM, there will be a
+            little left over.  The amount left over is
+            (endt + (to - from)) - to, which is endt - from.  */
+         bcopy (from, to, endt - from);
+       }
+    }
+}
+#endif /* emacs */
+
+#ifndef memmove
+extern void __malloc_safe_bcopy __P ((__ptr_t, __ptr_t, __malloc_size_t));
+#define memmove(to, from, size) __malloc_safe_bcopy ((from), (to), (size))
+#endif
+
+#endif
+
+
+#define min(A, B) ((A) < (B) ? (A) : (B))
+
+/* Debugging hook for realloc.  */
+__ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, __malloc_size_t __size));
+
+/* Resize the given region to the new size, returning a pointer
+   to the (possibly moved) region.  This is optimized for speed;
+   some benchmarks seem to indicate that greater compactness is
+   achieved by unconditionally allocating and copying to a
+   new region.  This module has incestuous knowledge of the
+   internals of both free and malloc. */
+__ptr_t
+_realloc_internal (ptr, size)
+     __ptr_t ptr;
+     __malloc_size_t size;
+{
+  __ptr_t result;
+  int type;
+  __malloc_size_t block, blocks, oldlimit;
+
+  if (size == 0)
+    {
+      _free_internal (ptr);
+      return _malloc_internal (0);
+    }
+  else if (ptr == NULL)
+    return _malloc_internal (size);
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Maybe reallocate a large block to a small fragment.  */
+      if (size <= BLOCKSIZE / 2)
+       {
+         result = _malloc_internal (size);
+         if (result != NULL)
+           {
+             memcpy (result, ptr, size);
+             _free_internal (ptr);
+             return result;
+           }
+       }
+
+      /* The new size is a large allocation as well;
+        see if we can hold it in place. */
+      blocks = BLOCKIFY (size);
+      if (blocks < _heapinfo[block].busy.info.size)
+       {
+         /* The new size is smaller; return
+            excess memory to the free list. */
+         _heapinfo[block + blocks].busy.type = 0;
+         _heapinfo[block + blocks].busy.info.size
+           = _heapinfo[block].busy.info.size - blocks;
+         _heapinfo[block].busy.info.size = blocks;
+         /* We have just created a new chunk by splitting a chunk in two.
+            Now we will free this chunk; increment the statistics counter
+            so it doesn't become wrong when _free_internal decrements it.  */
+         ++_chunks_used;
+         _free_internal (ADDRESS (block + blocks));
+         result = ptr;
+       }
+      else if (blocks == _heapinfo[block].busy.info.size)
+       /* No size change necessary.  */
+       result = ptr;
+      else
+       {
+         /* Won't fit, so allocate a new region that will.
+            Free the old region first in case there is sufficient
+            adjacent free space to grow without moving. */
+         blocks = _heapinfo[block].busy.info.size;
+         /* Prevent free from actually returning memory to the system.  */
+         oldlimit = _heaplimit;
+         _heaplimit = 0;
+         _free_internal (ptr);
+         result = _malloc_internal (size);
+         if (_heaplimit == 0)
+           _heaplimit = oldlimit;
+         if (result == NULL)
+           {
+             /* Now we're really in trouble.  We have to unfree
+                the thing we just freed.  Unfortunately it might
+                have been coalesced with its neighbors.  */
+             if (_heapindex == block)
+               (void) _malloc_internal (blocks * BLOCKSIZE);
+             else
+               {
+                 __ptr_t previous
+                   = _malloc_internal ((block - _heapindex) * BLOCKSIZE);
+                 (void) _malloc_internal (blocks * BLOCKSIZE);
+                 _free_internal (previous);
+               }
+             return NULL;
+           }
+         if (ptr != result)
+           memmove (result, ptr, blocks * BLOCKSIZE);
+       }
+      break;
+
+    default:
+      /* Old size is a fragment; type is logarithm
+        to base two of the fragment size.  */
+      if (size > (__malloc_size_t) (1 << (type - 1)) &&
+         size <= (__malloc_size_t) (1 << type))
+       /* The new size is the same kind of fragment.  */
+       result = ptr;
+      else
+       {
+         /* The new size is different; allocate a new space,
+            and copy the lesser of the new size and the old. */
+         result = _malloc_internal (size);
+         if (result == NULL)
+           return NULL;
+         memcpy (result, ptr, min (size, (__malloc_size_t) 1 << type));
+         _free_internal (ptr);
+       }
+      break;
+    }
+
+  return result;
+}
+
+__ptr_t
+realloc (ptr, size)
+     __ptr_t ptr;
+     __malloc_size_t size;
+{
+  if (!__malloc_initialized && !__malloc_initialize ())
+    return NULL;
+
+  return (__realloc_hook != NULL ? *__realloc_hook : _realloc_internal)
+    (ptr, size);
+}
+/* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef        _MALLOC_INTERNAL
+#define        _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+/* Allocate an array of NMEMB elements each SIZE bytes long.
+   The entire array is initialized to zeros.  */
+__ptr_t
+calloc (nmemb, size)
+     register __malloc_size_t nmemb;
+     register __malloc_size_t size;
+{
+  register __ptr_t result = malloc (nmemb * size);
+
+  if (result != NULL)
+    (void) memset (result, 0, nmemb * size);
+
+  return result;
+}
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library 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.
+
+The GNU C Library 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 the GNU C Library; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.  */
+
+#ifndef        _MALLOC_INTERNAL
+#define        _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+#ifndef        __GNU_LIBRARY__
+#define        __sbrk  sbrk
+#endif
+
+#ifdef __GNU_LIBRARY__
+/* It is best not to declare this and cast its result on foreign operating
+   systems with potentially hostile include files.  */
+
+#include <stddef.h>
+extern __ptr_t __sbrk __P ((ptrdiff_t increment));
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+/* Allocate INCREMENT more bytes of data space,
+   and return the start of data space, or NULL on errors.
+   If INCREMENT is negative, shrink data space.  */
+__ptr_t
+__default_morecore (increment)
+     __malloc_ptrdiff_t increment;
+{
+  __ptr_t result = (__ptr_t) __sbrk (increment);
+  if (result == (__ptr_t) -1)
+    return NULL;
+  return result;
+}
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library 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
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111 USA.  */
+
+#ifndef        _MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+#if __DJGPP__ - 0 == 1
+
+/* There is some problem with memalign in DJGPP v1 and we are supposed
+   to omit it.  Noone told me why, they just told me to do it.  */
+
+#else
+
+__ptr_t (*__memalign_hook) __P ((size_t __size, size_t __alignment));
+
+__ptr_t
+memalign (alignment, size)
+     __malloc_size_t alignment;
+     __malloc_size_t size;
+{
+  __ptr_t result;
+  unsigned long int adj, lastadj;
+
+  if (__memalign_hook)
+    return (*__memalign_hook) (alignment, size);
+
+  /* Allocate a block with enough extra space to pad the block with up to
+     (ALIGNMENT - 1) bytes if necessary.  */
+  result = malloc (size + alignment - 1);
+  if (result == NULL)
+    return NULL;
+
+  /* Figure out how much we will need to pad this particular block
+     to achieve the required alignment.  */
+  adj = (unsigned long int) ((char *) result - (char *) NULL) % alignment;
+
+  do
+    {
+      /* Reallocate the block with only as much excess as it needs.  */
+      free (result);
+      result = malloc (adj + size);
+      if (result == NULL)      /* Impossible unless interrupted.  */
+       return NULL;
+
+      lastadj = adj;
+      adj = (unsigned long int) ((char *) result - (char *) NULL) % alignment;
+      /* It's conceivable we might have been so unlucky as to get a
+        different block with weaker alignment.  If so, this block is too
+        short to contain SIZE after alignment correction.  So we must
+        try again and get another block, slightly larger.  */
+    } while (adj > lastadj);
+
+  if (adj != 0)
+    {
+      /* Record this block in the list of aligned blocks, so that `free'
+        can identify the pointer it is passed, which will be in the middle
+        of an allocated block.  */
+
+      struct alignlist *l;
+      for (l = _aligned_blocks; l != NULL; l = l->next)
+       if (l->aligned == NULL)
+         /* This slot is free.  Use it.  */
+         break;
+      if (l == NULL)
+       {
+         l = (struct alignlist *) malloc (sizeof (struct alignlist));
+         if (l == NULL)
+           {
+             free (result);
+             return NULL;
+           }
+         l->next = _aligned_blocks;
+         _aligned_blocks = l;
+       }
+      l->exact = result;
+      result = l->aligned = (char *) result + alignment - adj;
+    }
+
+  return result;
+}
+
+#endif /* Not DJGPP v1 */
diff --git a/lib/malloc/OLD/old-nmalloc.c b/lib/malloc/OLD/old-nmalloc.c
new file mode 100644 (file)
index 0000000..4d08c44
--- /dev/null
@@ -0,0 +1,890 @@
+/* malloc.c - dynamic memory allocation for bash. */
+
+/*  Copyright (C) 1985, 1987, 1997 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.
+
+In other words, you are welcome to use, share and improve this program.
+You are forbidden to forbid anyone else to use, share and improve
+what you give them.   Help stamp out software-hoarding!  */
+
+/*
+ * @(#)nmalloc.c 1 (Caltech) 2/21/82
+ *
+ *     U of M Modified: 20 Jun 1983 ACT: strange hacks for Emacs
+ *
+ *     Nov 1983, Mike@BRL, Added support for 4.1C/4.2 BSD.
+ *
+ * This is a very fast storage allocator.  It allocates blocks of a small 
+ * number of different sizes, and keeps free lists of each size.  Blocks
+ * that don't exactly fit are passed up to the next larger size.  In this 
+ * implementation, the available sizes are (2^n)-4 (or -16) bytes long.
+ * This is designed for use in a program that uses vast quantities of
+ * memory, but bombs when it runs out.  To make it a little better, it
+ * warns the user when he starts to get near the end.
+ *
+ * June 84, ACT: modified rcheck code to check the range given to malloc,
+ * rather than the range determined by the 2-power used.
+ *
+ * Jan 85, RMS: calls malloc_warning to issue warning on nearly full.
+ * No longer Emacs-specific; can serve as all-purpose malloc for GNU.
+ * You should call malloc_init to reinitialize after loading dumped Emacs.
+ * Call malloc_stats to get info on memory stats if MALLOC_STATS turned on.
+ * realloc knows how to return same block given, just changing its size,
+ * if the power of 2 is correct.
+ */
+#define MALLOC_STATS           /* for the time being */
+
+/*
+ * nextf[i] is the pointer to the next free block of size 2^(i+3).  The
+ * smallest allocatable block is 8 bytes.  The overhead information will
+ * go in the first int of the block, and the returned pointer will point
+ * to the second.
+ */
+
+/* XXX For the time being, until an autoconf test is created (ce has one) */
+#define bits32_t               int
+#define u_bits32_t     unsigned int
+
+/* Define this to have free() write 0xcf into memory as it's freed, to
+   uncover callers that refer to freed memory. */
+/* SCO 3.2v4 getcwd and possibly other libc routines fail with MEMSCRAMBLE */
+#if !defined (NO_MEMSCRAMBLE)
+#  define MEMSCRAMBLE
+#endif
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif /* HAVE_CONFIG_H */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+/* Determine which kind of system this is.  */
+#if defined (SHELL)
+#  include "bashtypes.h"
+#else
+#  include <sys/types.h>
+#endif
+#include <signal.h>
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else
+#  include <strings.h>
+#endif
+
+#if defined (MALLOC_STATS) || !defined (botch)
+#  include <stdio.h>
+#endif /* MALLOC_STATS || !botch */
+
+/* Define getpagesize () if the system does not.  */
+#ifndef HAVE_GETPAGESIZE
+#  include "getpagesize.h"
+#endif
+
+#if __GNUC__ > 1
+#  define FASTCOPY(s, d, n)  __builtin_memcpy (d, s, n)
+#else /* !__GNUC__ */
+#  if !defined (HAVE_BCOPY)
+#    if !defined (HAVE_MEMMOVE)
+#      define FASTCOPY(s, d, n)  memcpy (d, s, n)
+#    else
+#      define FASTCOPY(s, d, n)  memmove (d, s, n)
+#    endif /* !HAVE_MEMMOVE */
+#  else /* HAVE_BCOPY */
+#    define FASTCOPY(s, d, n)  bcopy (s, d, n)
+#  endif /* HAVE_BCOPY */
+#endif /* !__GNUC__ */
+
+#if !defined (NULL)
+#  define NULL 0
+#endif
+
+#define NBUCKETS       30
+
+#define ISALLOC ((char) 0xf7)  /* magic byte that implies allocation */
+#define ISFREE ((char) 0x54)   /* magic byte that implies free block */
+                               /* this is for error checking only */
+#define ISMEMALIGN ((char) 0xd6)  /* Stored before the value returned by
+                                    memalign, with the rest of the word
+                                    being the distance to the true
+                                    beginning of the block.  */
+
+#if !defined (SBRK_DECLARED)
+extern char *sbrk ();
+#endif /* !SBRK_DECLARED */
+
+#ifdef MALLOC_STATS
+/*
+ * NMALLOC[i] is the difference between the number of mallocs and frees
+ * for a given block size.  TMALLOC[i] is the total number of mallocs for
+ * a given block size.  NMORECORE[i] is the total number of calls to
+ * morecore(i).  NMAL and NFRE are counts of the number of calls to malloc()
+ * and free(), respectively.  NREALLOC is the total number of calls to
+ * realloc(); NRCOPY is the number of times realloc() had to allocate new
+ * memory and copy to it.  NRECURSE is a count of the number of recursive
+ * calls to malloc() for the same bucket size, which can be caused by calls
+ * to malloc() from a signal handler.  NSBRK is the number of calls to sbrk()
+ * (whether by morecore() or for alignment); TSBRK is the total number of
+ * bytes requested from the kernel with sbrk().  BYTESUSED is the total
+ * number of bytes consumed by blocks currently in used; BYTESFREE is the
+ * total number of bytes currently on all of the free lists.  NBSPLIT is
+ * the number of times a larger block was split to satisfy a smaller request.
+ * NBCOALESCE is the number of times two adjacent smaller blocks off the free
+ * list were combined to satisfy a larger request.
+ */
+struct _malstats {
+  int nmalloc[NBUCKETS];
+  int tmalloc[NBUCKETS];
+  int nmorecore[NBUCKETS];
+  int nmal;
+  int nfre;
+  int nrealloc;
+  int nrcopy;
+  int nrecurse;
+  int nsbrk;
+  bits32_t tsbrk;
+  bits32_t bytesused;
+  bits32_t bytesfree;
+  int nbsplit;
+  int nbcoalesce;
+};
+
+static struct _malstats _mstats;
+
+/* Return statistics describing allocation of blocks of size BLOCKSIZE.
+   NFREE is the number of free blocks for this allocation size.  NUSED
+   is the number of blocks in use.  NMAL is the number of requests for
+   blocks of size BLOCKSIZE.  NMORECORE is the number of times we had
+   to call MORECORE to repopulate the free list for this bucket. */
+struct bucket_stats {
+  u_bits32_t blocksize;
+  int nfree;
+  int nused;
+  int nmal;
+  int nmorecore;
+};
+#endif /* MALLOC_STATS */
+
+/* We have a flag indicating whether memory is allocated, an index in
+   nextf[], a size field, and a sentinel value to determine whether or
+   not a caller wrote before the start of allocated memory; to realloc()
+   memory we either copy mh_nbytes or just change mh_nbytes if there is
+   enough room in the block for the new size.  Range checking is always
+   done. */
+struct mhead {
+  char     mh_alloc;   /* ISALLOC or ISFREE */         /* 1 */
+  char     mh_index;   /* index in nextf[] */          /* 1 */
+/* Remainder are valid only when block is allocated */
+  u_bits32_t mh_nbytes;  /* # of bytes allocated */    /* 4 */
+  u_bits16_t mh_magic2;/* should be == MAGIC2 */       /* 2 */
+};
+
+/* Access free-list pointer of a block.
+   It is stored at block + sizeof (char *).
+   This is not a field in the mhead structure
+   because we want sizeof (struct mhead)
+   to describe the overhead for when the block is in use,
+   and we do not want the free-list pointer to count in that.  */
+
+#define CHAIN(a) \
+  (*(struct mhead **) (sizeof (char *) + (char *) (a)))
+
+#if defined (botch)
+extern void botch ();
+#else
+static void
+botch (s)
+     char *s;
+{
+  fprintf (stderr, "\r\nmalloc: assertion botched: %s\r\n", s);
+  (void)fflush (stderr);
+  abort ();
+}
+#endif /* !botch */
+
+#if !defined (__STRING)
+#  if defined (__STDC__)
+#    define __STRING(x) #x
+#  else
+#    define __STRING(x) "x"
+#  endif
+#endif /* !__STRING */
+
+/* To implement range checking, we write magic values in at the beginning
+   and end of each allocated block, and make sure they are undisturbed
+   whenever a free or a realloc occurs. */
+
+/* Written in each of the 4 bytes following the block's real space */
+#define MAGIC1 0x55
+/* Written in the 2 bytes before the block's real space */
+#define MAGIC2 0x5555
+#define ASSERT(p) do { if (!(p)) botch(__STRING(p)); } while (0)
+#define MSLOP  4               /* 4 bytes extra for MAGIC1s */
+
+/* Minimum and maximum bucket indices for block splitting (and to bound
+   the search for a block to split). */
+#define SPLIT_MIN      3
+#define SPLIT_MID      9
+#define SPLIT_MAX      12
+
+/* Minimum and maximum bucket indices for block coalescing. */
+#define COMBINE_MIN    6
+#define COMBINE_MAX    (pagebucket - 1)
+
+#define MIN_COMBINE_FREE       4
+
+/* nextf[i] is free list of blocks of size 2**(i + 3)  */
+
+static struct mhead *nextf[NBUCKETS];
+
+/* busy[i] is nonzero while allocation of block size i is in progress.  */
+
+static char busy[NBUCKETS];
+
+static int pagesz;     /* system page size. */
+static int pagebucket; /* bucket for requests a page in size */
+
+#if 0
+/* Coalesce two adjacent free blocks off the free list for size NU - 1,
+   as long as there are at least MIN_COMBINE_FREE free blocks and we
+   can find two adjacent free blocks.  nextf[NU -1] is assumed to not
+   be busy; the caller (morecore()) checks for this. */
+static void
+bcoalesce (nu)
+     register int nu;
+{
+  register struct mhead *mp, *mp1, *mp2;
+  register int nfree, nbuck;
+  unsigned long siz;
+
+  nbuck = nu - 1;
+  if (nextf[nbuck] == 0)
+    return;
+
+  nfree = 1;
+  mp1 = nextf[nbuck];
+  mp = CHAIN (mp1);
+  mp2 = (struct mhead *)0;
+  while (CHAIN (mp))
+    {
+      mp2 = mp1;
+      mp1 = mp;
+      mp = CHAIN (mp);
+      nfree++;
+      /* We may not want to run all the way through the free list here;
+        if we do not, we need to check a threshold value here and break
+        if nfree exceeds it. */
+    }
+  if (nfree < MIN_COMBINE_FREE)
+    return;
+  /* OK, now we have mp1 pointing to the block we want to add to nextf[NU].
+     CHAIN(mp2) must equal mp1.  Check that mp1 and mp are adjacent. */
+  if (CHAIN(mp2) != mp1)
+    botch ("bcoalesce: CHAIN(mp2) != mp1");
+  siz = 1 << (nbuck + 3);
+  if (CHAIN (mp1) != (struct mhead *)((char *)mp1 + siz))
+    return;    /* not adjacent */
+
+#ifdef MALLOC_STATS
+  _mstats.nbcoalesce++;
+#endif
+
+  /* Since they are adjacent, remove them from the free list */
+  CHAIN (mp2) = CHAIN (mp);
+
+  /* And add the combined two blocks to nextf[NU]. */
+  mp1->mh_alloc = ISFREE;
+  mp1->mh_index = nu;
+  CHAIN (mp1) = nextf[nu];
+  nextf[nu] = mp1;
+}
+#endif
+
+/* Split a block at index > NU (but less than SPLIT_MAX) into a set of
+   blocks of the correct size, and attach them to nextf[NU].  nextf[NU]
+   is assumed to be empty.  Must be called with signals blocked (e.g.,
+   by morecore()). */
+static void
+bsplit (nu)
+     register int nu;
+{
+  register struct mhead *mp;
+  int nbuck, nblks;
+  unsigned long siz;
+
+  if (nu >= SPLIT_MID)
+    {
+      for (nbuck = SPLIT_MAX; nbuck > nu; nbuck--)
+       {
+         if (busy[nbuck] || nextf[nbuck] == 0)
+           continue;
+         break;
+       }
+    }
+  else
+    {
+      for (nbuck = nu + 1; nbuck <= SPLIT_MAX; nbuck++)
+       {
+         if (busy[nbuck] || nextf[nbuck] == 0)
+           continue;
+         break;
+       }
+    }
+
+  if (nbuck > SPLIT_MAX || nbuck <= nu)
+    return;
+
+  /* XXX might want to split only if nextf[nbuck] has >= 2 blocks free
+     and nbuck is below some threshold. */
+
+#ifdef MALLOC_STATS
+  _mstats.nbsplit++;
+#endif
+
+  /* Figure out how many blocks we'll get. */
+  siz = (1 << (nu + 3));
+  nblks = (1 << (nbuck + 3)) / siz;
+
+  /* Remove the block from the chain of larger blocks. */
+  mp = nextf[nbuck];
+  nextf[nbuck] = CHAIN (mp);
+
+  /* Split the block and put it on the requested chain. */
+  nextf[nu] = mp;
+  while (1)
+    {
+      mp->mh_alloc = ISFREE;
+      mp->mh_index = nu;
+      if (--nblks <= 0) break;
+      CHAIN (mp) = (struct mhead *)((char *)mp + siz);
+      mp = (struct mhead *)((char *)mp + siz);
+    }
+  CHAIN (mp) = 0;
+}
+
+static void
+morecore (nu)                  /* ask system for more memory */
+     register int nu;          /* size index to get more of  */
+{
+  register struct mhead *mp;
+  register int nblks;
+  register long siz;
+  long sbrk_amt;               /* amount to get via sbrk() */
+
+  /* Block all signals in case we are executed from a signal handler. */
+#if defined (HAVE_BSD_SIGNALS)
+  int oldmask;
+  oldmask = sigsetmask (-1);
+#else
+#  if defined (HAVE_POSIX_SIGNALS)
+  sigset_t set, oset;
+  sigfillset (&set);
+  sigemptyset (&oset);
+  sigprocmask (SIG_BLOCK, &set, &oset);
+#  endif /* HAVE_POSIX_SIGNALS */
+#endif /* HAVE_BSD_SIGNALS */
+
+  siz = 1 << (nu + 3); /* size of desired block for nextf[nu] */
+
+  if (siz < 0)
+    return;            /* oops */
+
+#ifdef MALLOC_STATS
+  _mstats.nmorecore[nu]++;
+#endif
+
+  /* Try to split a larger block here, if we're within the range of sizes
+     to split. */
+  if (nu >= SPLIT_MIN && nu < SPLIT_MAX)
+    {
+      bsplit (nu);
+      if (nextf[nu] != 0)
+       goto morecore_done;
+    }
+
+#if 0
+  /* Try to coalesce two adjacent blocks from the free list on nextf[nu - 1],
+     if we can, and we're withing the range of the block coalescing limits. */
+  if (nu >= COMBINE_MIN && nu < COMBINE_MAX && busy[nu - 1] == 0 && nextf[nu - 1])
+    {
+      bcoalesce (nu);
+      if (nextf[nu] != 0)
+        goto morecore_done;
+    }
+#endif
+
+  /* Take at least a page, and figure out how many blocks of the requested
+     size we're getting. */
+  if (siz <= pagesz)
+    {
+      sbrk_amt = pagesz;
+      nblks = sbrk_amt / siz;
+    }
+  else
+    {
+      /* We always want to request an integral multiple of the page size
+        from the kernel, so let's compute whether or not `siz' is such
+        an amount.  If it is, we can just request it.  If not, we want
+        the smallest integral multiple of pagesize that is larger than
+        `siz' and will satisfy the request. */
+      sbrk_amt = siz % pagesz;
+      if (sbrk_amt == 0)
+       sbrk_amt = siz;
+      else
+       sbrk_amt = siz + pagesz - sbrk_amt;
+      nblks = 1;
+    }
+
+#ifdef MALLOC_STATS
+  _mstats.nsbrk++;
+  _mstats.tsbrk += sbrk_amt;
+#endif
+
+  mp = (struct mhead *) sbrk (sbrk_amt);
+
+  /* Totally out of memory. */
+  if ((long)mp == -1)
+    return;
+
+  /* shouldn't happen, but just in case */
+  if ((long)mp & 7)
+    {
+      mp = (struct mhead *) (((long)mp + 8) & ~7);
+      nblks--;
+    }
+
+  /* save new header and link the nblks blocks together */
+  nextf[nu] = mp;
+  while (1)
+    {
+      mp->mh_alloc = ISFREE;
+      mp->mh_index = nu;
+      if (--nblks <= 0) break;
+      CHAIN (mp) = (struct mhead *)((char *)mp + siz);
+      mp = (struct mhead *)((char *)mp + siz);
+    }
+  CHAIN (mp) = 0;
+
+morecore_done:
+#if defined (HAVE_BSD_SIGNALS)
+  sigsetmask (oldmask);
+#else
+#  if defined (HAVE_POSIX_SIGNALS)
+  sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
+#  endif
+#endif /* HAVE_BSD_SIGNALS */
+}
+
+#if defined (MEMSCRAMBLE) || !defined (NO_CALLOC)
+static char *
+zmemset (s, c, n)
+     char *s;
+     int c;
+     register int n;
+{
+  register char *sp;
+
+  sp = s;
+  while (--n >= 0)
+    *sp++ = c;
+  return (s);
+}
+#endif /* MEMSCRAMBLE || !NO_CALLOC */
+
+static void
+malloc_debug_dummy ()
+{
+  ;
+}
+
+char *
+malloc (n)             /* get a block */
+     size_t n;
+{
+  register struct mhead *p;
+  register long nbytes;
+  register int nunits;
+
+  /* Get the system page size and align break pointer so everything will
+     be page-aligned.  The page size must be at least 1K -- anything
+     smaller is increased. */
+  if (pagesz == 0)
+    {
+      register long sbrk_needed;
+
+      pagesz = getpagesize ();
+      if (pagesz < 1024)
+        pagesz = 1024;
+      /* OK, how much do we need to allocate to make things page-aligned?
+         This partial page is wasted space.  Once we figure out how much
+         to advance the break pointer, go ahead and do it. */
+      sbrk_needed = pagesz - ((long)sbrk (0) & (pagesz - 1));  /* sbrk(0) % pagesz */
+      if (sbrk_needed < 0)
+        sbrk_needed += pagesz;
+      /* Now allocate the wasted space. */
+      if (sbrk_needed)
+        {
+#ifdef MALLOC_STATS
+         _mstats.nsbrk++;
+         _mstats.tsbrk += sbrk_needed;
+#endif
+          if ((long)sbrk (sbrk_needed) == -1)
+            return (NULL);
+        }
+      nunits = 0;
+      nbytes = 8;
+      while (pagesz > nbytes)
+        {
+          nbytes <<= 1;
+          nunits++;
+        }
+      pagebucket = nunits;
+    }
+  /* Figure out how many bytes are required, rounding up to the nearest
+     multiple of 4, then figure out which nextf[] area to use.  Try to
+     be smart about where to start searching -- if the number of bytes
+     needed is greater than the page size, we can start at pagebucket. */
+  nbytes = (n + sizeof *p + MSLOP + 3) & ~3;
+  nunits = 0;
+  if (nbytes <= (pagesz >> 1))
+    {
+      register unsigned int shiftr;
+
+      shiftr = (nbytes - 1) >> 2;      /* == (nbytes - 1) / 4 */
+      while (shiftr >>= 1)             /* == (nbytes - 1) / {8,16,32,...} */
+       nunits++;
+    }
+  else
+    {
+      register u_bits32_t amt;
+
+      nunits = pagebucket;
+      amt = pagesz;
+      while (nbytes > amt)
+        {
+          amt <<= 1;
+          nunits++;
+        }
+    }
+
+  /* In case this is reentrant use of malloc from signal handler,
+     pick a block size that no other malloc level is currently
+     trying to allocate.  That's the easiest harmless way not to
+     interfere with the other level of execution.  */
+#ifdef MALLOC_STATS
+  if (busy[nunits]) _mstats.nrecurse++;
+#endif
+  while (busy[nunits]) nunits++;
+  busy[nunits] = 1;
+
+  /* If there are no blocks of the appropriate size, go get some */
+  if (nextf[nunits] == 0)
+    morecore (nunits);
+
+  /* Get one block off the list, and set the new list head */
+  if ((p = nextf[nunits]) == NULL)
+    {
+      busy[nunits] = 0;
+      return NULL;
+    }
+  nextf[nunits] = CHAIN (p);
+  busy[nunits] = 0;
+
+  /* Check for free block clobbered */
+  /* If not for this check, we would gobble a clobbered free chain ptr
+     and bomb out on the NEXT allocate of this size block */
+  if (p->mh_alloc != ISFREE || p->mh_index != nunits)
+    botch ("malloc: block on free list clobbered");
+
+  /* Fill in the info, and if range checking, set up the magic numbers */
+  p->mh_alloc = ISALLOC;
+  p->mh_nbytes = n;
+  p->mh_magic2 = MAGIC2;
+  {
+    register char  *m = (char *) (p + 1) + n;
+
+    *m++ = MAGIC1, *m++ = MAGIC1, *m++ = MAGIC1, *m = MAGIC1;
+  }
+
+#ifdef MEMSCRAMBLE
+  zmemset ((char *)(p + 1), 0xdf, n);  /* scramble previous contents */
+#endif
+#ifdef MALLOC_STATS
+  _mstats.nmalloc[nunits]++;
+  _mstats.tmalloc[nunits]++;
+  _mstats.nmal++;
+#endif /* MALLOC_STATS */
+  return (char *) (p + 1);
+}
+
+void
+free (mem)
+     char *mem;
+{
+  register struct mhead *p;
+  register char *ap;
+  register int nunits;
+
+  if ((ap = mem) == 0)
+    return;
+
+  p = (struct mhead *) ap - 1;
+
+  if (p->mh_alloc == ISMEMALIGN)
+    {
+      ap -= p->mh_nbytes;
+      p = (struct mhead *) ap - 1;
+    }
+
+  if (p->mh_alloc != ISALLOC)
+    {
+      if (p->mh_alloc == ISFREE)
+       botch ("free: called with already freed block argument");
+      else
+       botch ("free: called with unallocated block argument");
+    }
+
+  ASSERT (p->mh_magic2 == MAGIC2);
+  ap += p->mh_nbytes;
+  ASSERT (*ap++ == MAGIC1); ASSERT (*ap++ == MAGIC1);
+  ASSERT (*ap++ == MAGIC1); ASSERT (*ap   == MAGIC1);
+
+#ifdef MEMSCRAMBLE
+  zmemset (mem, 0xcf, p->mh_nbytes);
+#endif
+
+  nunits = p->mh_index;
+
+  ASSERT (nunits < NBUCKETS);
+  p->mh_alloc = ISFREE;
+
+  /* Protect against signal handlers calling malloc.  */
+  busy[nunits] = 1;
+  /* Put this block on the free list.  */
+  CHAIN (p) = nextf[nunits];
+  nextf[nunits] = p;
+  busy[nunits] = 0;
+
+#ifdef MALLOC_STATS
+  _mstats.nmalloc[nunits]--;
+  _mstats.nfre++;
+#endif /* MALLOC_STATS */
+}
+
+char *
+realloc (mem, n)
+     char *mem;
+     register size_t n;
+{
+  register struct mhead *p;
+  register u_bits32_t tocopy;
+  register unsigned int nbytes;
+  register int nunits;
+  register char *m;
+
+#ifdef MALLOC_STATS
+  _mstats.nrealloc++;
+#endif
+
+  if (n == 0)
+    {
+      free (mem);
+      return (NULL);
+    }
+  if ((p = (struct mhead *) mem) == 0)
+    return malloc (n);
+  p--;
+  nunits = p->mh_index;
+  ASSERT (p->mh_alloc == ISALLOC);
+  ASSERT (p->mh_magic2 == MAGIC2);
+
+  m = mem + (tocopy = p->mh_nbytes);
+  ASSERT (*m++ == MAGIC1); ASSERT (*m++ == MAGIC1);
+  ASSERT (*m++ == MAGIC1); ASSERT (*m   == MAGIC1);
+
+  /* See if desired size rounds to same power of 2 as actual size. */
+  nbytes = (n + sizeof *p + MSLOP + 7) & ~7;
+
+  /* If ok, use the same block, just marking its size as changed.  */
+  if (nbytes > (4 << nunits) && nbytes <= (8 << nunits))
+    {
+      m = mem + tocopy;
+      *m++ = 0;  *m++ = 0;  *m++ = 0;  *m++ = 0;
+      p->mh_nbytes = n;
+      m = mem + n;
+      *m++ = MAGIC1;  *m++ = MAGIC1;  *m++ = MAGIC1;  *m++ = MAGIC1;
+      return mem;
+    }
+
+#ifdef MALLOC_STATS
+  _mstats.nrcopy++;
+#endif
+
+  if (n < tocopy)
+    tocopy = n;
+
+  if ((m = malloc (n)) == 0)
+    return 0;
+  FASTCOPY (mem, m, tocopy);
+  free (mem);
+  return m;
+}
+
+char *
+memalign (alignment, size)
+     unsigned int alignment;
+     size_t size;
+{
+  register char *ptr;
+  register char *aligned;
+  register struct mhead *p;
+
+  ptr = malloc (size + alignment);
+
+  if (ptr == 0)
+    return 0;
+  /* If entire block has the desired alignment, just accept it.  */
+  if (((int) ptr & (alignment - 1)) == 0)
+    return ptr;
+  /* Otherwise, get address of byte in the block that has that alignment.  */
+  aligned = (char *) (((int) ptr + alignment - 1) & -alignment);
+
+  /* Store a suitable indication of how to free the block,
+     so that free can find the true beginning of it.  */
+  p = (struct mhead *) aligned - 1;
+  p->mh_nbytes = aligned - ptr;
+  p->mh_alloc = ISMEMALIGN;
+  return aligned;
+}
+
+#if !defined (HPUX)
+/* This runs into trouble with getpagesize on HPUX, and Multimax machines.
+   Patching out seems cleaner than the ugly fix needed.  */
+#if defined (__STDC__)
+void *
+#else
+char *
+#endif
+valloc (size)
+     size_t size;
+{
+  return memalign (getpagesize (), size);
+}
+#endif /* !HPUX */
+
+#ifndef NO_CALLOC
+char *
+calloc (n, s)
+     size_t n, s;
+{
+  size_t total;
+  char *result;
+
+  total = n * s;
+  result = malloc (total);
+  if (result)
+    zmemset (result, 0, total);
+  return result;  
+}
+
+void
+cfree (p)
+     char *p;
+{
+  free (p);
+}
+#endif /* !NO_CALLOC */
+
+#ifdef MALLOC_STATS
+
+struct bucket_stats
+malloc_bucket_stats (size)
+     int size;
+{
+  struct bucket_stats v;
+  register struct mhead *p;
+
+  v.nfree = 0;
+
+  if (size < 0 || size >= NBUCKETS)
+    {
+      v.blocksize = 0;
+      v.nused = v.nmal = 0;
+      return v;
+    }
+
+  v.blocksize = 1 << (size + 3);
+  v.nused = _mstats.nmalloc[size];
+  v.nmal = _mstats.tmalloc[size];
+  v.nmorecore = _mstats.nmorecore[size];
+
+  for (p = nextf[size]; p; p = CHAIN (p))
+    v.nfree++;
+
+  return v;
+}
+
+/* Return a copy of _MSTATS, with two additional fields filled in:
+   BYTESFREE is the total number of bytes on free lists.  BYTESUSED
+   is the total number of bytes in use.  These two fields are fairly
+   expensive to compute, so we do it only when asked to. */
+struct _malstats
+malloc_stats ()
+{
+  struct _malstats result;
+  struct bucket_stats v;
+  register int i;
+
+  result = _mstats;
+  result.bytesused = result.bytesfree = 0;
+  for (i = 0; i < NBUCKETS; i++)
+    {
+      v = malloc_bucket_stats (i);
+      result.bytesfree += v.nfree * v.blocksize;
+      result.bytesused += v.nused * v.blocksize;
+    }
+  return (result);
+}
+
+void
+print_malloc_stats (s)
+     char *s;
+{
+  register int i;
+  int totused, totfree;
+  struct bucket_stats v;
+
+  fprintf (stderr, "Memory allocation statistics: %s\n\tsize\tfree\tin use\ttotal\tmorecore\n", s ? s : "");
+  for (i = totused = totfree = 0; i < NBUCKETS; i++)
+    {
+      v = malloc_bucket_stats (i);
+      fprintf (stderr, "%12lu\t%4d\t%6d\t%5d\t%8d\n", v.blocksize, v.nfree, v.nused, v.nmal, v.nmorecore);
+      totfree += v.nfree * v.blocksize;
+      totused += v.nused * v.blocksize;
+    }
+  fprintf (stderr, "\nTotal bytes in use: %d, total bytes free: %d\n",
+          totused, totfree);
+  fprintf (stderr, "Total mallocs: %d, total frees: %d, total reallocs: %d (%d copies)\n",
+          _mstats.nmal, _mstats.nfre, _mstats.nrealloc, _mstats.nrcopy);
+  fprintf (stderr, "Total sbrks: %d, total bytes via sbrk: %d\n",
+          _mstats.nsbrk, _mstats.tsbrk);
+  fprintf (stderr, "Total blocks split: %d, total block coalesces: %d\n",
+          _mstats.nbsplit, _mstats.nbcoalesce);
+}
+#endif /* MALLOC_STATS */
diff --git a/lib/malloc/OLD/omalloc.c b/lib/malloc/OLD/omalloc.c
new file mode 100644 (file)
index 0000000..413faeb
--- /dev/null
@@ -0,0 +1,759 @@
+/* dynamic memory allocation for GNU. */
+
+/*  Copyright (C) 1985, 1987 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.
+
+In other words, you are welcome to use, share and improve this program.
+You are forbidden to forbid anyone else to use, share and improve
+what you give them.   Help stamp out software-hoarding!  */
+
+/*
+ * @(#)nmalloc.c 1 (Caltech) 2/21/82
+ *
+ *     U of M Modified: 20 Jun 1983 ACT: strange hacks for Emacs
+ *
+ *     Nov 1983, Mike@BRL, Added support for 4.1C/4.2 BSD.
+ *
+ * This is a very fast storage allocator.  It allocates blocks of a small 
+ * number of different sizes, and keeps free lists of each size.  Blocks
+ * that don't exactly fit are passed up to the next larger size.  In this 
+ * implementation, the available sizes are (2^n)-4 (or -16) bytes long.
+ * This is designed for use in a program that uses vast quantities of
+ * memory, but bombs when it runs out.  To make it a little better, it
+ * warns the user when he starts to get near the end.
+ *
+ * June 84, ACT: modified rcheck code to check the range given to malloc,
+ * rather than the range determined by the 2-power used.
+ *
+ * Jan 85, RMS: calls malloc_warning to issue warning on nearly full.
+ * No longer Emacs-specific; can serve as all-purpose malloc for GNU.
+ * You should call malloc_init to reinitialize after loading dumped Emacs.
+ * Call malloc_stats to get info on memory stats if MSTATS turned on.
+ * realloc knows how to return same block given, just changing its size,
+ * if the power of 2 is correct.
+ */
+
+/*
+ * nextf[i] is the pointer to the next free block of size 2^(i+3).  The
+ * smallest allocatable block is 8 bytes.  The overhead information will
+ * go in the first int of the block, and the returned pointer will point
+ * to the second.
+ *
+#ifdef MSTATS
+ * nmalloc[i] is the difference between the number of mallocs and frees
+ * for a given block size.
+#endif
+ */
+
+/* Define this to have free() write 0xcf into memory as it's freed, to
+   uncover callers that refer to freed memory. */
+/* SCO 3.2v4 getcwd and possibly other libc routines fail with MEMSCRAMBLE */
+#if !defined (NO_MEMSCRAMBLE)
+#  define MEMSCRAMBLE
+#endif
+
+#if defined (emacs) || defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif /* emacs */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+/* Determine which kind of system this is.  */
+#if defined (SHELL)
+#  include "bashtypes.h"
+#else
+#  include <sys/types.h>
+#endif
+#include <signal.h>
+
+/* Define getpagesize () if the system does not.  */
+#ifndef HAVE_GETPAGESIZE
+#  include "getpagesize.h"
+#endif
+
+#if defined (HAVE_RESOURCE)
+#  include <sys/time.h>
+#  include <sys/resource.h>
+#endif /* HAVE_RESOURCE */
+
+/* Check for the needed symbols.  If they aren't present, this
+   system's <sys/resource.h> isn't very useful to us. */
+#if !defined (RLIMIT_DATA)
+#  undef HAVE_RESOURCE
+#endif
+
+#if __GNUC__ > 1
+#  define FASTCOPY(s, d, n)  __builtin_memcpy (d, s, n)
+#else /* !__GNUC__ */
+#  if !defined (HAVE_BCOPY)
+#    if !defined (HAVE_MEMMOVE)
+#      define FASTCOPY(s, d, n)  memcpy (d, s, n)
+#    else
+#      define FASTCOPY(s, d, n)  memmove (d, s, n)
+#    endif /* !HAVE_MEMMOVE */
+#  else /* HAVE_BCOPY */
+#    define FASTCOPY(s, d, n)  bcopy (s, d, n)
+#  endif /* HAVE_BCOPY */
+#endif /* !__GNUC__ */
+
+#if !defined (NULL)
+#  define NULL 0
+#endif
+
+#define start_of_data() &etext
+
+#define ISALLOC ((char) 0xf7)  /* magic byte that implies allocation */
+#define ISFREE ((char) 0x54)   /* magic byte that implies free block */
+                               /* this is for error checking only */
+#define ISMEMALIGN ((char) 0xd6)  /* Stored before the value returned by
+                                    memalign, with the rest of the word
+                                    being the distance to the true
+                                    beginning of the block.  */
+extern char etext;
+
+#if !defined (SBRK_DECLARED)
+extern char *sbrk ();
+#endif /* !SBRK_DECLARED */
+
+/* These two are for user programs to look at, when they are interested.  */
+unsigned int malloc_sbrk_used;       /* amount of data space used now */
+unsigned int malloc_sbrk_unused;     /* amount more we can have */
+
+/* start of data space; can be changed by calling init_malloc */
+static char *data_space_start;
+
+static void get_lim_data ();
+
+#ifdef MSTATS
+static int nmalloc[30];
+static int nmal, nfre;
+#endif /* MSTATS */
+
+/* If range checking is not turned on, all we have is a flag indicating
+   whether memory is allocated, an index in nextf[], and a size field; to
+   realloc() memory we copy either size bytes or 1<<(index+3) bytes depending
+   on whether the former can hold the exact size (given the value of
+   'index').  If range checking is on, we always need to know how much space
+   is allocated, so the 'size' field is never used. */
+
+struct mhead {
+       char     mh_alloc;      /* ISALLOC or ISFREE */
+       char     mh_index;      /* index in nextf[] */
+/* Remainder are valid only when block is allocated */
+       unsigned short mh_size; /* size, if < 0x10000 */
+#ifdef RCHECK
+       unsigned int mh_nbytes; /* number of bytes allocated */
+       int      mh_magic4;     /* should be == MAGIC4 */
+#endif /* RCHECK */
+};
+
+/* Access free-list pointer of a block.
+  It is stored at block + 4.
+  This is not a field in the mhead structure
+  because we want sizeof (struct mhead)
+  to describe the overhead for when the block is in use,
+  and we do not want the free-list pointer to count in that.  */
+
+#define CHAIN(a) \
+  (*(struct mhead **) (sizeof (char *) + (char *) (a)))
+
+#ifdef RCHECK
+#  include <stdio.h>
+#  if !defined (botch)
+#    define botch(x) abort ()
+#  else
+extern void botch();
+#  endif /* botch */
+
+#  if !defined (__STRING)
+#    if defined (__STDC__)
+#      define __STRING(x) #x
+#    else
+#      define __STRING(x) "x"
+#    endif
+#  endif
+
+  /* To implement range checking, we write magic values in at the beginning
+     and end of each allocated block, and make sure they are undisturbed
+     whenever a free or a realloc occurs. */
+
+  /* Written in each of the 4 bytes following the block's real space */
+#  define MAGIC1 0x55
+  /* Written in the 4 bytes before the block's real space */
+#  define MAGIC4 0x55555555
+#  define ASSERT(p) if (!(p)) botch(__STRING(p)); else
+#  define EXTRA  4             /* 4 bytes extra for MAGIC1s */
+#else /* !RCHECK */
+#  define ASSERT(p)
+#  define EXTRA  0
+#endif /* RCHECK */
+
+/* nextf[i] is free list of blocks of size 2**(i + 3)  */
+
+static struct mhead *nextf[30];
+
+/* busy[i] is nonzero while allocation of block size i is in progress.  */
+
+static char busy[30];
+
+/* Number of bytes of writable memory we can expect to be able to get */
+static unsigned int lim_data;
+
+/* Level number of warnings already issued.
+  0 -- no warnings issued.
+  1 -- 75% warning already issued.
+  2 -- 85% warning already issued.
+*/
+static int warnlevel;
+
+/* Function to call to issue a warning;
+   0 means don't issue them.  */
+static void (*warnfunction) ();
+
+/* nonzero once initial bunch of free blocks made */
+static int gotpool;
+
+char *_malloc_base;
+
+static void getpool ();
+
+/* Cause reinitialization based on job parameters;
+  also declare where the end of pure storage is. */
+void
+malloc_init (start, warnfun)
+     char *start;
+     void (*warnfun) ();
+{
+  if (start)
+    data_space_start = start;
+  lim_data = 0;
+  warnlevel = 0;
+  warnfunction = warnfun;
+}
+
+/* Return the maximum size to which MEM can be realloc'd
+   without actually requiring copying.  */
+
+int
+malloc_usable_size (mem)
+     char *mem;
+{
+  int blocksize = 8 << (((struct mhead *) mem) - 1) -> mh_index;
+
+  return blocksize - sizeof (struct mhead) - EXTRA;
+}
+
+static void
+morecore (nu)                  /* ask system for more memory */
+     register int nu;          /* size index to get more of  */
+{
+  register char *cp;
+  register int nblks;
+  register unsigned int siz;
+
+  /* Block all signals in case we are executed from a signal handler. */
+#if defined (HAVE_BSD_SIGNALS)
+  int oldmask;
+  oldmask = sigsetmask (-1);
+#else
+#  if defined (HAVE_POSIX_SIGNALS)
+  sigset_t set, oset;
+  sigfillset (&set);
+  sigemptyset (&oset);
+  sigprocmask (SIG_BLOCK, &set, &oset);
+#  endif /* HAVE_POSIX_SIGNALS */
+#endif /* HAVE_BSD_SIGNALS */
+
+  if (!data_space_start)
+    {
+      data_space_start = start_of_data ();
+    }
+
+  if (lim_data == 0)
+    get_lim_data ();
+
+ /* On initial startup, get two blocks of each size up to 1k bytes */
+  if (!gotpool)
+    { getpool (); getpool (); gotpool = 1; }
+
+  /* Find current end of memory and issue warning if getting near max */
+
+  cp = sbrk (0);
+  siz = cp - data_space_start;
+  malloc_sbrk_used = siz;
+  malloc_sbrk_unused = lim_data - siz;
+
+  if (warnfunction)
+    switch (warnlevel)
+      {
+      case 0: 
+       if (siz > (lim_data / 4) * 3)
+         {
+           warnlevel++;
+           (*warnfunction) ("Warning: past 75% of memory limit");
+         }
+       break;
+      case 1: 
+       if (siz > (lim_data / 20) * 17)
+         {
+           warnlevel++;
+           (*warnfunction) ("Warning: past 85% of memory limit");
+         }
+       break;
+      case 2: 
+       if (siz > (lim_data / 20) * 19)
+         {
+           warnlevel++;
+           (*warnfunction) ("Warning: past 95% of memory limit");
+         }
+       break;
+      }
+
+  if ((int) cp & 0x3ff)        /* land on 1K boundaries */
+    sbrk (1024 - ((int) cp & 0x3ff));
+
+ /* Take at least 2k, and figure out how many blocks of the desired size
+    we're about to get */
+  nblks = 1;
+  if ((siz = nu) < 8)
+    nblks = 1 << ((siz = 8) - nu);
+
+  if ((cp = sbrk (1 << (siz + 3))) == (char *) -1)
+    return;                    /* no more room! */
+
+  if ((int) cp & 7)
+    {          /* shouldn't happen, but just in case */
+      cp = (char *) (((int) cp + 8) & ~7);
+      nblks--;
+    }
+
+ /* save new header and link the nblks blocks together */
+  nextf[nu] = (struct mhead *) cp;
+  siz = 1 << (nu + 3);
+  while (1)
+    {
+      ((struct mhead *) cp) -> mh_alloc = ISFREE;
+      ((struct mhead *) cp) -> mh_index = nu;
+      if (--nblks <= 0) break;
+      CHAIN ((struct mhead *) cp) = (struct mhead *) (cp + siz);
+      cp += siz;
+    }
+  CHAIN ((struct mhead *) cp) = 0;
+
+#if defined (HAVE_BSD_SIGNALS)
+  sigsetmask (oldmask);
+#else
+#  if defined (HAVE_POSIX_SIGNALS)
+  sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
+#  endif
+#endif /* HAVE_BSD_SIGNALS */
+}
+
+static void
+getpool ()
+{
+  register int nu;
+  register char *cp = sbrk (0);
+
+  if ((int) cp & 0x3ff)        /* land on 1K boundaries */
+    sbrk (1024 - ((int) cp & 0x3ff));
+
+  /* Record address of start of space allocated by malloc.  */
+  if (_malloc_base == 0)
+    _malloc_base = cp;
+
+  /* Get 2k of storage */
+
+  cp = sbrk (04000);
+  if (cp == (char *) -1)
+    return;
+
+  /* Divide it into an initial 8-word block
+     plus one block of size 2**nu for nu = 3 ... 10.  */
+
+  CHAIN (cp) = nextf[0];
+  nextf[0] = (struct mhead *) cp;
+  ((struct mhead *) cp) -> mh_alloc = ISFREE;
+  ((struct mhead *) cp) -> mh_index = 0;
+  cp += 8;
+
+  for (nu = 0; nu < 7; nu++)
+    {
+      CHAIN (cp) = nextf[nu];
+      nextf[nu] = (struct mhead *) cp;
+      ((struct mhead *) cp) -> mh_alloc = ISFREE;
+      ((struct mhead *) cp) -> mh_index = nu;
+      cp += 8 << nu;
+    }
+}
+
+#if defined (MEMSCRAMBLE) || !defined (NO_CALLOC)
+static char *
+zmemset (s, c, n)
+     char *s;
+     int c;
+     register int n;
+{
+  register char *sp;
+
+  sp = s;
+  while (--n >= 0)
+    *sp++ = c;
+  return (s);
+}
+#endif /* MEMSCRAMBLE || !NO_CALLOC */
+
+char *
+malloc (n)             /* get a block */
+     unsigned int n;
+{
+  register struct mhead *p;
+  register unsigned int nbytes;
+  register int nunits = 0;
+
+  /* Figure out how many bytes are required, rounding up to the nearest
+     multiple of 4, then figure out which nextf[] area to use */
+  nbytes = (n + sizeof *p + EXTRA + 3) & ~3;
+  {
+    register unsigned int   shiftr = (nbytes - 1) >> 2;
+
+    while (shiftr >>= 1)
+      nunits++;
+  }
+
+  /* In case this is reentrant use of malloc from signal handler,
+     pick a block size that no other malloc level is currently
+     trying to allocate.  That's the easiest harmless way not to
+     interfere with the other level of execution.  */
+  while (busy[nunits]) nunits++;
+  busy[nunits] = 1;
+
+  /* If there are no blocks of the appropriate size, go get some */
+  /* COULD SPLIT UP A LARGER BLOCK HERE ... ACT */
+  if (nextf[nunits] == 0)
+    morecore (nunits);
+
+  /* Get one block off the list, and set the new list head */
+  if ((p = nextf[nunits]) == 0)
+    {
+      busy[nunits] = 0;
+      return 0;
+    }
+  nextf[nunits] = CHAIN (p);
+  busy[nunits] = 0;
+
+  /* Check for free block clobbered */
+  /* If not for this check, we would gobble a clobbered free chain ptr */
+  /* and bomb out on the NEXT allocate of this size block */
+  if (p -> mh_alloc != ISFREE || p -> mh_index != nunits)
+#ifdef RCHECK
+    botch ("block on free list clobbered");
+#else /* not RCHECK */
+    abort ();
+#endif /* not RCHECK */
+
+  /* Fill in the info, and if range checking, set up the magic numbers */
+  p -> mh_alloc = ISALLOC;
+#ifdef RCHECK
+  p -> mh_nbytes = n;
+  p -> mh_magic4 = MAGIC4;
+  {
+    register char  *m = (char *) (p + 1) + n;
+
+    *m++ = MAGIC1, *m++ = MAGIC1, *m++ = MAGIC1, *m = MAGIC1;
+  }
+#else /* not RCHECK */
+  p -> mh_size = n;
+#endif /* not RCHECK */
+#ifdef MEMSCRAMBLE
+  zmemset ((char *)(p + 1), 0xdf, n);  /* scramble previous contents */
+#endif
+#ifdef MSTATS
+  nmalloc[nunits]++;
+  nmal++;
+#endif /* MSTATS */
+  return (char *) (p + 1);
+}
+
+void
+free (mem)
+     char *mem;
+{
+  register struct mhead *p;
+  {
+    register char *ap = mem;
+
+    if (ap == 0)
+      return;
+
+    p = (struct mhead *) ap - 1;
+
+    if (p -> mh_alloc == ISMEMALIGN)
+      {
+#ifdef RCHECK
+       ap -= p->mh_nbytes;
+#else
+       ap -= p->mh_size;       /* XXX */
+#endif
+       p = (struct mhead *) ap - 1;
+      }
+
+#ifndef RCHECK
+    if (p -> mh_alloc != ISALLOC)
+      abort ();
+
+#else /* RCHECK */
+    if (p -> mh_alloc != ISALLOC)
+      {
+       if (p -> mh_alloc == ISFREE)
+         botch ("free: Called with already freed block argument\n");
+       else
+         botch ("free: Called with unallocated block argument\n");
+      }
+
+    ASSERT (p -> mh_magic4 == MAGIC4);
+    ap += p -> mh_nbytes;
+    ASSERT (*ap++ == MAGIC1); ASSERT (*ap++ == MAGIC1);
+    ASSERT (*ap++ == MAGIC1); ASSERT (*ap   == MAGIC1);
+#endif /* RCHECK */
+  }
+#ifdef MEMSCRAMBLE
+  {
+    register int n;
+    
+#ifdef RCHECK
+    n = p->mh_nbytes;
+#else /* not RCHECK */
+    n = p->mh_size;
+#endif /* not RCHECK */
+    zmemset (mem, 0xcf, n);
+  }
+#endif
+  {
+    register int nunits = p -> mh_index;
+
+    ASSERT (nunits <= 29);
+    p -> mh_alloc = ISFREE;
+
+    /* Protect against signal handlers calling malloc.  */
+    busy[nunits] = 1;
+    /* Put this block on the free list.  */
+    CHAIN (p) = nextf[nunits];
+    nextf[nunits] = p;
+    busy[nunits] = 0;
+
+#ifdef MSTATS
+    nmalloc[nunits]--;
+    nfre++;
+#endif /* MSTATS */
+  }
+}
+
+char *
+realloc (mem, n)
+     char *mem;
+     register unsigned int n;
+{
+  register struct mhead *p;
+  register unsigned int tocopy;
+  register unsigned int nbytes;
+  register int nunits;
+
+  if ((p = (struct mhead *) mem) == 0)
+    return malloc (n);
+  p--;
+  nunits = p -> mh_index;
+  ASSERT (p -> mh_alloc == ISALLOC);
+#ifdef RCHECK
+  ASSERT (p -> mh_magic4 == MAGIC4);
+  {
+    register char *m = mem + (tocopy = p -> mh_nbytes);
+    ASSERT (*m++ == MAGIC1); ASSERT (*m++ == MAGIC1);
+    ASSERT (*m++ == MAGIC1); ASSERT (*m   == MAGIC1);
+  }
+#else /* not RCHECK */
+  if (p -> mh_index >= 13)
+    tocopy = (1 << (p -> mh_index + 3)) - sizeof *p;
+  else
+    tocopy = p -> mh_size;
+#endif /* not RCHECK */
+
+  /* See if desired size rounds to same power of 2 as actual size. */
+  nbytes = (n + sizeof *p + EXTRA + 7) & ~7;
+
+  /* If ok, use the same block, just marking its size as changed.  */
+  if (nbytes > (4 << nunits) && nbytes <= (8 << nunits))
+    {
+#ifdef RCHECK
+      register char *m = mem + tocopy;
+      *m++ = 0;  *m++ = 0;  *m++ = 0;  *m++ = 0;
+      p-> mh_nbytes = n;
+      m = mem + n;
+      *m++ = MAGIC1;  *m++ = MAGIC1;  *m++ = MAGIC1;  *m++ = MAGIC1;
+#else /* not RCHECK */
+      p -> mh_size = n;
+#endif /* not RCHECK */
+      return mem;
+    }
+
+  if (n < tocopy)
+    tocopy = n;
+  {
+    register char *new;
+
+    if ((new = malloc (n)) == 0)
+      return 0;
+    FASTCOPY (mem, new, tocopy);
+    free (mem);
+    return new;
+  }
+}
+
+char *
+memalign (alignment, size)
+     unsigned int alignment, size;
+{
+  register char *ptr;
+  register char *aligned;
+  register struct mhead *p;
+
+  ptr = malloc (size + alignment);
+
+  if (ptr == 0)
+    return 0;
+  /* If entire block has the desired alignment, just accept it.  */
+  if (((int) ptr & (alignment - 1)) == 0)
+    return ptr;
+  /* Otherwise, get address of byte in the block that has that alignment.  */
+  aligned = (char *) (((int) ptr + alignment - 1) & -alignment);
+
+  /* Store a suitable indication of how to free the block,
+     so that free can find the true beginning of it.  */
+  p = (struct mhead *) aligned - 1;
+  p -> mh_size = aligned - ptr;
+  p -> mh_alloc = ISMEMALIGN;
+  return aligned;
+}
+
+#if !defined (HPUX)
+/* This runs into trouble with getpagesize on HPUX, and Multimax machines.
+   Patching out seems cleaner than the ugly fix needed.  */
+#if defined (__STDC__)
+void *
+#else
+char *
+#endif
+valloc (size)
+     size_t size;
+{
+  return memalign (getpagesize (), size);
+}
+#endif /* !HPUX */
+
+#ifndef NO_CALLOC
+char *
+calloc (n, s)
+     size_t n, s;
+{
+  size_t total;
+  char *result;
+
+  total = n * s;
+  result = malloc (total);
+  if (result)
+    zmemset (result, 0, total);
+  return result;  
+}
+
+void
+cfree (p)
+     char *p;
+{
+  free (p);
+}
+#endif /* !NO_CALLOC */
+
+#ifdef MSTATS
+/* Return statistics describing allocation of blocks of size 2**n. */
+
+struct mstats_value
+  {
+    int blocksize;
+    int nfree;
+    int nused;
+  };
+
+struct mstats_value
+malloc_stats (size)
+     int size;
+{
+  struct mstats_value v;
+  register int i;
+  register struct mhead *p;
+
+  v.nfree = 0;
+
+  if (size < 0 || size >= 30)
+    {
+      v.blocksize = 0;
+      v.nused = 0;
+      return v;
+    }
+
+  v.blocksize = 1 << (size + 3);
+  v.nused = nmalloc[size];
+
+  for (p = nextf[size]; p; p = CHAIN (p))
+    v.nfree++;
+
+  return v;
+}
+#endif /* MSTATS */
+
+/*
+ *     This function returns the total number of bytes that the process
+ *     will be allowed to allocate via the sbrk(2) system call.  On
+ *     BSD systems this is the total space allocatable to stack and
+ *     data.  On USG systems this is the data space only.
+ */
+
+#if !defined (HAVE_RESOURCE)
+extern long ulimit ();
+
+static void
+get_lim_data ()
+{    
+  lim_data = ulimit (3, 0);
+  lim_data -= (long) data_space_start;
+}
+
+#else /* HAVE_RESOURCE */
+static void
+get_lim_data ()
+{
+  struct rlimit XXrlimit;
+
+  getrlimit (RLIMIT_DATA, &XXrlimit);
+#ifdef RLIM_INFINITY
+  lim_data = XXrlimit.rlim_cur & RLIM_INFINITY; /* soft limit */
+#else
+  lim_data = XXrlimit.rlim_cur;        /* soft limit */
+#endif
+}
+
+#endif /* HAVE_RESOURCE */
index 0bc5ef9..835f5da 100644 (file)
@@ -1,5 +1,5 @@
 /* Emulation of getpagesize() for systems that need it.
-   Copyright (C) 1991 Free Software Foundation, Inc.
+   Copyright (C) 1991-2003 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
index 3920ce9..72ba65a 100644 (file)
@@ -1,6 +1,6 @@
 /* imalloc.h -- internal malloc definitions shared by source files. */
 
-/* Copyright (C) 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -159,4 +159,10 @@ do {                                                                       \
     memcpy ((dest), (src), (nbytes))                                   \
 } while(0)
 
+#if defined (SHELL)
+#  include "bashintl.h"
+#else
+#  define _(x) x
+#endif
+
 #endif /* _IMALLOC_H */
index 4871b71..60cbfab 100644 (file)
@@ -1,6 +1,6 @@
 /* malloc.c - dynamic memory allocation for bash. */
 
-/*  Copyright (C) 1985, 1987, 1997 Free Software Foundation, Inc.
+/*  Copyright (C) 1985-2003 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
@@ -295,7 +295,7 @@ botch (s, file, line)
      const char *file;
      int line;
 {
-  fprintf (stderr, "malloc: failed assertion: %s\n", s);
+  fprintf (stderr, _("malloc: failed assertion: %s\n"), s);
   (void)fflush (stderr);
   abort ();
 }
@@ -311,7 +311,7 @@ xbotch (mem, e, s, file, line)
      const char *file;
      int line;
 {
-  fprintf (stderr, "\r\nmalloc: %s:%d: assertion botched\r\n",
+  fprintf (stderr, _("\r\nmalloc: %s:%d: assertion botched\r\n"),
                        file ? file : "unknown", line);
 #ifdef MALLOC_REGISTER
   if (mem != NULL && malloc_register)
@@ -737,7 +737,7 @@ internal_malloc (n, file, line, flags)              /* get a block */
   /* If not for this check, we would gobble a clobbered free chain ptr
      and bomb out on the NEXT allocate of this size block */
   if (p->mh_alloc != ISFREE || p->mh_index != nunits)
-    xbotch ((PTR_T)(p+1), 0, "malloc: block on free list clobbered", file, line);
+    xbotch ((PTR_T)(p+1), 0, _("malloc: block on free list clobbered"), file, line);
 
   /* Fill in the info, and set up the magic numbers for range checking. */
   p->mh_alloc = ISALLOC;
@@ -814,10 +814,10 @@ internal_free (mem, file, line, flags)
     {
       if (p->mh_alloc == ISFREE)
        xbotch (mem, ERR_DUPFREE,
-               "free: called with already freed block argument", file, line);
+               _("free: called with already freed block argument"), file, line);
       else
        xbotch (mem, ERR_UNALLOC,
-               "free: called with unallocated block argument", file, line);
+               _("free: called with unallocated block argument"), file, line);
     }
 
   ASSERT (p->mh_magic2 == MAGIC2);
@@ -836,13 +836,13 @@ internal_free (mem, file, line, flags)
 
   if (IN_BUCKET(nbytes, nunits) == 0)
     xbotch (mem, ERR_UNDERFLOW,
-           "free: underflow detected; mh_nbytes out of range", file, line);
+           _("free: underflow detected; mh_nbytes out of range"), file, line);
 
   ap += p->mh_nbytes;
   z = mg.s;
   *z++ = *ap++, *z++ = *ap++, *z++ = *ap++, *z++ = *ap++;  
   if (mg.i != p->mh_nbytes)
-    xbotch (mem, ERR_ASSERT_FAILED, "free: start and end chunk sizes differ", file, line);
+    xbotch (mem, ERR_ASSERT_FAILED, _("free: start and end chunk sizes differ"), file, line);
 
 #if 1
   if (nunits >= LESSCORE_MIN && ((char *)p + binsize(nunits) == memtop))
@@ -939,7 +939,7 @@ internal_realloc (mem, n, file, line, flags)
 
   if (p->mh_alloc != ISALLOC)
     xbotch (mem, ERR_UNALLOC,
-           "realloc: called with unallocated block argument", file, line);
+           _("realloc: called with unallocated block argument"), file, line);
 
   ASSERT (p->mh_magic2 == MAGIC2);
   nbytes = ALLOCATED_BYTES(p->mh_nbytes);
@@ -954,13 +954,13 @@ internal_realloc (mem, n, file, line, flags)
      original number of bytes requested. */
   if (IN_BUCKET(nbytes, nunits) == 0)
     xbotch (mem, ERR_UNDERFLOW,
-           "realloc: underflow detected; mh_nbytes out of range", file, line);
+           _("realloc: underflow detected; mh_nbytes out of range"), file, line);
 
   m = (char *)mem + (tocopy = p->mh_nbytes);
   z = mg.s;
   *z++ = *m++, *z++ = *m++, *z++ = *m++, *z++ = *m++;
   if (mg.i != p->mh_nbytes)
-    xbotch (mem, ERR_ASSERT_FAILED, "realloc: start and end chunk sizes differ", file, line);
+    xbotch (mem, ERR_ASSERT_FAILED, _("realloc: start and end chunk sizes differ"), file, line);
 
 #ifdef MALLOC_WATCH
   if (_malloc_nwatch > 0)
diff --git a/lib/malloc/malloc.c.bad b/lib/malloc/malloc.c.bad
new file mode 100644 (file)
index 0000000..b530d8d
--- /dev/null
@@ -0,0 +1,1216 @@
+/* malloc.c - dynamic memory allocation for bash. */
+
+/*  Copyright (C) 1985, 1987, 1997 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.
+
+In other words, you are welcome to use, share and improve this program.
+You are forbidden to forbid anyone else to use, share and improve
+what you give them.   Help stamp out software-hoarding!  */
+
+/*
+ * @(#)nmalloc.c 1 (Caltech) 2/21/82
+ *
+ *     U of M Modified: 20 Jun 1983 ACT: strange hacks for Emacs
+ *
+ *     Nov 1983, Mike@BRL, Added support for 4.1C/4.2 BSD.
+ *
+ * This is a very fast storage allocator.  It allocates blocks of a small 
+ * number of different sizes, and keeps free lists of each size.  Blocks
+ * that don't exactly fit are passed up to the next larger size.  In this 
+ * implementation, the available sizes are (2^n)-4 (or -16) bytes long.
+ * This is designed for use in a program that uses vast quantities of
+ * memory, but bombs when it runs out.  To make it a little better, it
+ * warns the user when he starts to get near the end.
+ *
+ * June 84, ACT: modified rcheck code to check the range given to malloc,
+ * rather than the range determined by the 2-power used.
+ *
+ * Jan 85, RMS: calls malloc_warning to issue warning on nearly full.
+ * No longer Emacs-specific; can serve as all-purpose malloc for GNU.
+ * You should call malloc_init to reinitialize after loading dumped Emacs.
+ * Call malloc_stats to get info on memory stats if MALLOC_STATS turned on.
+ * realloc knows how to return same block given, just changing its size,
+ * if the power of 2 is correct.
+ */
+
+/*
+ * nextf[i] is the pointer to the next free block of size 2^(i+3).  The
+ * smallest allocatable block is 8 bytes.  The overhead information will
+ * go in the first int of the block, and the returned pointer will point
+ * to the second.
+ */
+
+/* Define MEMSCRAMBLE to have free() write 0xcf into memory as it's freed, to
+   uncover callers that refer to freed memory, and to have malloc() write 0xdf
+   into memory as it's allocated to avoid referring to previous contents. */
+
+/* SCO 3.2v4 getcwd and possibly other libc routines fail with MEMSCRAMBLE;
+   handled by configure. */
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif /* HAVE_CONFIG_H */
+
+#if defined (SHELL)
+#  include "bashtypes.h"
+#  include "stdc.h"
+#else
+#  include <sys/types.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+/* Determine which kind of system this is.  */
+#include <signal.h>
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else
+#  include <strings.h>
+#endif
+
+#include <stdio.h>
+
+/* Define getpagesize () if the system does not.  */
+#ifndef HAVE_GETPAGESIZE
+#  include "getpagesize.h"
+#endif
+
+#include "imalloc.h"
+#ifdef MALLOC_STATS
+#  include "mstats.h"
+#endif
+#ifdef MALLOC_REGISTER
+#  include "table.h"
+#endif
+#ifdef MALLOC_WATCH
+#  include "watch.h"
+#endif
+
+/* System-specific omissions. */
+#ifdef HPUX
+#  define NO_VALLOC
+#endif
+
+#define NBUCKETS       30
+
+#define ISALLOC ((char) 0xf7)  /* magic byte that implies allocation */
+#define ISFREE ((char) 0x54)   /* magic byte that implies free block */
+                               /* this is for error checking only */
+#define ISMEMALIGN ((char) 0xd6)  /* Stored before the value returned by
+                                    memalign, with the rest of the word
+                                    being the distance to the true
+                                    beginning of the block.  */
+
+
+/* We have a flag indicating whether memory is allocated, an index in
+   nextf[], a size field, and a sentinel value to determine whether or
+   not a caller wrote before the start of allocated memory; to realloc()
+   memory we either copy mh_nbytes or just change mh_nbytes if there is
+   enough room in the block for the new size.  Range checking is always
+   done. */
+union mhead {
+  bits64_t mh_align;                                           /* 8 */
+  struct {
+    char mi_alloc;             /* ISALLOC or ISFREE */         /* 1 */
+    char mi_index;             /* index in nextf[] */          /* 1 */
+    /* Remainder are valid only when block is allocated */
+    u_bits16_t mi_magic2;      /* should be == MAGIC2 */       /* 2 */
+    u_bits32_t mi_nbytes;      /* # of bytes allocated */      /* 4 */
+  } minfo;
+};
+#define mh_alloc       minfo.mi_alloc
+#define mh_index       minfo.mi_index
+#define mh_nbytes      minfo.mi_nbytes
+#define mh_magic2      minfo.mi_magic2
+
+#define MOVERHEAD      sizeof(union mhead)
+#define MALIGN_MASK    7       /* one less than desired alignment */
+
+/* Access free-list pointer of a block.
+   It is stored at block + sizeof (char *).
+   This is not a field in the minfo structure member of union mhead
+   because we want sizeof (union mhead)
+   to describe the overhead for when the block is in use,
+   and we do not want the free-list pointer to count in that.  */
+
+#define CHAIN(a) \
+  (*(union mhead **) (sizeof (char *) + (char *) (a)))
+
+/* To implement range checking, we write magic values in at the beginning
+   and end of each allocated block, and make sure they are undisturbed
+   whenever a free or a realloc occurs. */
+
+/* Written in the 2 bytes before the block's real space (-4 bytes) */
+#define MAGIC2 0x5555
+#define MSLOP  4               /* 4 bytes extra for u_bits32_t size */
+
+/* How many bytes are actually allocated for a request of size N --
+   rounded up to nearest multiple of 8 after accounting for malloc
+   overhead. */
+#define ALLOCATED_BYTES(n) \
+       (((n) + MOVERHEAD + MSLOP + MALIGN_MASK) & ~MALIGN_MASK)
+
+#define ASSERT(p) \
+  do \
+    { \
+      if (!(p)) xbotch((PTR_T)0, ERR_ASSERT_FAILED, __STRING(p), file, line); \
+    } \
+  while (0)
+
+/* Minimum and maximum bucket indices for block splitting (and to bound
+   the search for a block to split). */
+#define SPLIT_MIN      2       /* XXX - was 3 */
+#define SPLIT_MID      11
+#define SPLIT_MAX      14
+
+/* Minimum and maximum bucket indices for block coalescing. */
+#define COMBINE_MIN    2
+#define COMBINE_MAX    (pagebucket - 1)        /* XXX */
+
+#define LESSCORE_MIN   10
+#define LESSCORE_FRC   13
+
+#define STARTBUCK      1
+
+/* Flags for the internal functions. */
+#define MALLOC_WRAPPER 0x01    /* wrapper function */
+#define MALLOC_INTERNAL        0x02    /* internal function calling another */
+#define MALLOC_NOTRACE 0x04    /* don't trace this allocation or free */
+#define MALLOC_NOREG   0x08    /* don't register this allocation or free */
+
+/* Future use. */
+#define ERR_DUPFREE            0x01
+#define ERR_UNALLOC            0x02
+#define ERR_UNDERFLOW          0x04    
+#define ERR_ASSERT_FAILED      0x08
+
+/* Evaluates to true if NB is appropriate for bucket NU.  NB is adjusted
+   appropriately by the caller to account for malloc overhead.  This only
+   checks that the recorded size is not too big for the bucket.  We
+   can't check whether or not it's in between NU and NU-1 because we
+   might have encountered a busy bucket when allocating and moved up to
+   the next size. */
+#define IN_BUCKET(nb, nu)      ((nb) <= binsizes[(nu)])
+
+/* Use this when we want to be sure that NB is in bucket NU. */
+#define RIGHT_BUCKET(nb, nu) \
+       (((nb) > binsizes[(nu)-1]) && ((nb) <= binsizes[(nu)]))
+
+/* nextf[i] is free list of blocks of size 2**(i + 3)  */
+
+static union mhead *nextf[NBUCKETS];
+
+/* busy[i] is nonzero while allocation of block size i is in progress.  */
+
+static char busy[NBUCKETS];
+
+static int pagesz;     /* system page size. */
+static int pagebucket; /* bucket for requests a page in size */
+static int maxbuck;    /* highest bucket receiving allocation request. */
+
+static char *memtop;   /* top of heap */
+
+static unsigned long binsizes[NBUCKETS] = {
+       8UL, 16UL, 32UL, 64UL, 128UL, 256UL, 512UL, 1024UL, 2048UL, 4096UL,
+       8192UL, 16384UL, 32768UL, 65536UL, 131072UL, 262144UL, 524288UL,
+       1048576UL, 2097152UL, 4194304UL, 8388608UL, 16777216UL, 33554432UL,
+       67108864UL, 134217728UL, 268435456UL, 536870912UL, 1073741824UL,
+       2147483648UL, 4294967296UL-1
+};
+
+/* binsizes[x] == (1 << ((x) + 3)) */
+#define binsize(x)     binsizes[(x)]
+
+/* Declarations for internal functions */
+static PTR_T internal_malloc __P((size_t, const char *, int, int));
+static PTR_T internal_realloc __P((PTR_T, size_t, const char *, int, int));
+static void internal_free __P((PTR_T, const char *, int, int));
+static PTR_T internal_memalign __P((unsigned int, size_t, const char *, int, int));
+#ifndef NO_CALLOC
+static PTR_T internal_calloc __P((size_t, size_t, const char *, int, int));
+static void internal_cfree __P((PTR_T, const char *, int, int));
+#endif
+#ifndef NO_VALLOC
+static PTR_T internal_valloc __P((size_t, const char *, int, int));
+#endif
+
+#if defined (botch)
+extern void botch ();
+#else
+static void botch __P((const char *, const char *, int));
+#endif
+static void xbotch __P((PTR_T, int, const char *, const char *, int));
+
+#if !HAVE_DECL_SBRK
+extern char *sbrk ();
+#endif /* !HAVE_DECL_SBRK */
+
+#ifdef SHELL
+extern int interrupt_immediately;
+extern int signal_is_trapped __P((int));
+#endif
+
+#ifdef MALLOC_STATS
+struct _malstats _mstats;
+#endif /* MALLOC_STATS */
+
+/* Debugging variables available to applications. */
+int malloc_flags = 0;  /* future use */
+int malloc_trace = 0;  /* trace allocations and frees to stderr */
+int malloc_register = 0;       /* future use */
+
+#ifdef MALLOC_TRACE
+char _malloc_trace_buckets[NBUCKETS];
+
+/* These should really go into a header file. */
+extern void mtrace_alloc __P((const char *, PTR_T, size_t, const char *, int));
+extern void mtrace_free __P((PTR_T, int, const char *, int));
+#endif
+
+#if !defined (botch)
+static void
+botch (s, file, line)
+{
+  fprintf (stderr, "malloc: failed assertion: %s\n", s);
+  (void)fflush (stderr);
+  abort ();
+}
+#endif
+
+/* print the file and line number that caused the assertion failure and
+   call botch() to do whatever the application wants with the information */
+static void
+xbotch (mem, e, s, file, line)
+     PTR_T mem;
+     int e;
+     const char *s;
+     const char *file;
+     int line;
+{
+  fprintf (stderr, "\r\nmalloc: %s:%d: assertion botched\r\n",
+                       file ? file : "unknown", line);
+#ifdef MALLOC_REGISTER
+  if (mem != NULL && malloc_register)
+    mregister_describe_mem (mem, stderr);
+#endif
+  (void)fflush (stderr);
+  botch(s, file, line);
+}
+
+/* Coalesce two adjacent free blocks off the free list for size NU - 1,
+   as long as we can find two adjacent free blocks.  nextf[NU -1] is
+   assumed to not be busy; the caller (morecore()) checks for this. */
+static void
+bcoalesce (nu)
+     register int nu;
+{
+  register union mhead *mp, *mp1, *mp2;
+  register int nbuck;
+  unsigned long siz;
+
+  nbuck = nu - 1;
+  if (nextf[nbuck] == 0)
+    return;
+
+  siz = binsize (nbuck);
+
+  mp2 = mp1 = nextf[nbuck];
+  mp = CHAIN (mp1);
+  while (mp && mp != (union mhead *)((char *)mp1 + siz))
+    {
+      mp2 = mp1;
+      mp1 = mp;
+      mp = CHAIN (mp);
+    }
+  if (mp == 0)
+    return;
+
+  /* OK, now we have mp1 pointing to the block we want to add to nextf[NU].
+     CHAIN(mp2) must equal mp1.  Check that mp1 and mp are adjacent. */
+  if (mp2 != mp1 && CHAIN(mp2) != mp1)
+    xbotch ((PTR_T)0, 0, "bcoalesce: CHAIN(mp2) != mp1", (char *)NULL, 0);
+
+#ifdef MALLOC_DEBUG
+  if (CHAIN (mp1) != (union mhead *)((char *)mp1 + siz))
+    return;    /* not adjacent */
+#endif
+
+#ifdef MALLOC_STATS
+  _mstats.tbcoalesce++;
+  _mstats.ncoalesce[nbuck]++;
+#endif
+
+  /* Since they are adjacent, remove them from the free list */
+  if (mp1 == nextf[nbuck])
+    nextf[nbuck] = CHAIN (mp);
+  else
+    CHAIN (mp2) = CHAIN (mp);
+
+  /* And add the combined two blocks to nextf[NU]. */
+  mp1->mh_alloc = ISFREE;
+  mp1->mh_index = nu;
+  CHAIN (mp1) = nextf[nu];
+  nextf[nu] = mp1;
+}
+
+/* Split a block at index > NU (but less than SPLIT_MAX) into a set of
+   blocks of the correct size, and attach them to nextf[NU].  nextf[NU]
+   is assumed to be empty.  Must be called with signals blocked (e.g.,
+   by morecore()). */
+static void
+bsplit (nu)
+     register int nu;
+{
+  register union mhead *mp;
+  int nbuck, nblks, split_max;
+  unsigned long siz;
+
+  split_max = (maxbuck > SPLIT_MAX) ? maxbuck : SPLIT_MAX;
+
+  if (nu >= SPLIT_MID)
+    {
+      for (nbuck = split_max; nbuck > nu; nbuck--)
+       {
+         if (busy[nbuck] || nextf[nbuck] == 0)
+           continue;
+         break;
+       }
+    }
+  else
+    {
+      for (nbuck = nu + 1; nbuck <= split_max; nbuck++)
+       {
+         if (busy[nbuck] || nextf[nbuck] == 0)
+           continue;
+         break;
+       }
+    }
+
+  if (nbuck > split_max || nbuck <= nu)
+    return;
+
+  /* XXX might want to split only if nextf[nbuck] has >= 2 blocks free
+     and nbuck is below some threshold. */
+
+#ifdef MALLOC_STATS
+  _mstats.tbsplit++;
+  _mstats.nsplit[nbuck]++;
+#endif
+
+  /* Figure out how many blocks we'll get. */
+  siz = binsize (nu);
+  nblks = binsize (nbuck) / siz;
+
+  /* Remove the block from the chain of larger blocks. */
+  mp = nextf[nbuck];
+  nextf[nbuck] = CHAIN (mp);
+
+  /* Split the block and put it on the requested chain. */
+  nextf[nu] = mp;
+  while (1)
+    {
+      mp->mh_alloc = ISFREE;
+      mp->mh_index = nu;
+      if (--nblks <= 0) break;
+      CHAIN (mp) = (union mhead *)((char *)mp + siz);
+      mp = (union mhead *)((char *)mp + siz);
+    }
+  CHAIN (mp) = 0;
+}
+
+static void
+block_signals (setp, osetp)
+     sigset_t *setp, *osetp;
+{
+#ifdef HAVE_POSIX_SIGNALS
+  sigfillset (setp);
+  sigemptyset (osetp);
+  sigprocmask (SIG_BLOCK, setp, osetp);
+#else
+#  if defined (HAVE_BSD_SIGNALS)
+  *osetp = sigsetmask (-1);
+#  endif
+#endif
+}
+
+static void
+unblock_signals (setp, osetp)
+     sigset_t *setp, *osetp;
+{
+#ifdef HAVE_POSIX_SIGNALS
+  sigprocmask (SIG_SETMASK, osetp, (sigset_t *)NULL);
+#else
+#  if defined (HAVE_BSD_SIGNALS)
+  sigsetmask (*osetp);
+#  endif
+#endif
+}
+
+/* Return some memory to the system by reducing the break.  This is only
+   called with NU > pagebucket, so we're always assured of giving back
+   more than one page of memory. */  
+static void
+lesscore (nu)                  /* give system back some memory */
+     register int nu;          /* size index we're discarding  */
+{
+  long siz;
+
+  siz = binsize (nu);
+  /* Should check for errors here, I guess. */
+  sbrk (-siz);
+  memtop -= siz;
+
+#ifdef MALLOC_STATS
+  _mstats.nsbrk++;
+  _mstats.tsbrk -= siz;
+  _mstats.nlesscore[nu]++;
+#endif
+}
+  
+static void
+morecore (nu)                  /* ask system for more memory */
+     register int nu;          /* size index to get more of  */
+{
+  register union mhead *mp;
+  register int nblks;
+  register long siz;
+  long sbrk_amt;               /* amount to get via sbrk() */
+  sigset_t set, oset;
+  int blocked_sigs;
+
+  /* Block all signals in case we are executed from a signal handler. */
+  blocked_sigs = 0;
+#ifdef SHELL
+  if (interrupt_immediately || signal_is_trapped (SIGINT) || signal_is_trapped (SIGCHLD))
+#endif
+    {
+      block_signals (&set, &oset);
+      blocked_sigs = 1;
+    }
+
+  siz = binsize (nu);  /* size of desired block for nextf[nu] */
+
+  if (siz < 0)
+    goto morecore_done;                /* oops */
+
+#ifdef MALLOC_STATS
+  _mstats.nmorecore[nu]++;
+#endif
+
+  /* Try to split a larger block here, if we're within the range of sizes
+     to split. */
+  if (nu >= SPLIT_MIN)
+    {
+      bsplit (nu);
+      if (nextf[nu] != 0)
+       goto morecore_done;
+    }
+
+  /* Try to coalesce two adjacent blocks from the free list on nextf[nu - 1],
+     if we can, and we're withing the range of the block coalescing limits. */
+  if (nu >= COMBINE_MIN && nu < COMBINE_MAX && busy[nu - 1] == 0 && nextf[nu - 1])
+    {
+      bcoalesce (nu);
+      if (nextf[nu] != 0)
+       goto morecore_done;
+    }
+
+  /* Take at least a page, and figure out how many blocks of the requested
+     size we're getting. */
+  if (siz <= pagesz)
+    {
+      sbrk_amt = pagesz;
+      nblks = sbrk_amt / siz;
+    }
+  else
+    {
+      /* We always want to request an integral multiple of the page size
+        from the kernel, so let's compute whether or not `siz' is such
+        an amount.  If it is, we can just request it.  If not, we want
+        the smallest integral multiple of pagesize that is larger than
+        `siz' and will satisfy the request. */
+      sbrk_amt = siz & (pagesz - 1);
+      if (sbrk_amt == 0)
+       sbrk_amt = siz;
+      else
+       sbrk_amt = siz + pagesz - sbrk_amt;
+      nblks = 1;
+    }
+
+#ifdef MALLOC_STATS
+  _mstats.nsbrk++;
+  _mstats.tsbrk += sbrk_amt;
+#endif
+
+  mp = (union mhead *) sbrk (sbrk_amt);
+
+  /* Totally out of memory. */
+  if ((long)mp == -1)
+    goto morecore_done;
+
+  memtop += sbrk_amt;
+
+  /* shouldn't happen, but just in case -- require 8-byte alignment */
+  if ((long)mp & MALIGN_MASK)
+    {
+      mp = (union mhead *) (((long)mp + MALIGN_MASK) & ~MALIGN_MASK);
+      nblks--;
+    }
+
+  /* save new header and link the nblks blocks together */
+  nextf[nu] = mp;
+  while (1)
+    {
+      mp->mh_alloc = ISFREE;
+      mp->mh_index = nu;
+      if (--nblks <= 0) break;
+      CHAIN (mp) = (union mhead *)((char *)mp + siz);
+      mp = (union mhead *)((char *)mp + siz);
+    }
+  CHAIN (mp) = 0;
+
+morecore_done:
+  if (blocked_sigs)
+    unblock_signals (&set, &oset);
+}
+
+static void
+malloc_debug_dummy ()
+{
+  write (1, "malloc_debug_dummy\n", 19);
+}
+
+#define PREPOP_BIN     2
+#define PREPOP_SIZE    32
+
+static int
+pagealign ()
+{
+  register long nbytes;
+  register int nunits;
+  register union mhead *mp;
+  long sbrk_needed;
+  char *curbrk;
+
+  pagesz = getpagesize ();
+  if (pagesz < 1024)
+    pagesz = 1024;
+
+  /* OK, how much do we need to allocate to make things page-aligned?
+     Some of this partial page will be wasted space, but we'll use as
+     much as we can.  Once we figure out how much to advance the break
+     pointer, go ahead and do it. */
+  memtop = curbrk = sbrk (0);
+  sbrk_needed = pagesz - ((long)curbrk & (pagesz - 1));        /* sbrk(0) % pagesz */
+  if (sbrk_needed < 0)
+    sbrk_needed += pagesz;
+
+  /* Now allocate the wasted space. */
+  if (sbrk_needed)
+    {
+#ifdef MALLOC_STATS
+      _mstats.nsbrk++;
+      _mstats.tsbrk += sbrk_needed;
+#endif
+      curbrk = sbrk (sbrk_needed);
+      if ((long)curbrk == -1)
+       return -1;
+#if 0
+      memtop += sbrk_needed;
+
+      /* Take the memory which would otherwise be wasted and populate the most
+        popular bin (2 == 32 bytes) with it.  Add whatever we need to curbrk
+        to make things 32-byte aligned, compute how many 32-byte chunks we're
+        going to get, and set up the bin. */
+      curbrk += sbrk_needed & (PREPOP_SIZE - 1);
+      sbrk_needed -= sbrk_needed & (PREPOP_SIZE - 1);
+      nunits = sbrk_needed / PREPOP_SIZE;
+
+      mp = (union mhead *)curbrk;
+
+      nextf[PREPOP_BIN] = mp;
+      while (1)
+       {
+         mp->mh_alloc = ISFREE;
+         mp->mh_index = PREPOP_BIN;
+         if (--nunits <= 0) break;
+         CHAIN(mp) = (union mhead *)((char *)mp + PREPOP_SIZE);
+         mp = (union mhead *)((char *)mp + PREPOP_SIZE);
+       }
+      CHAIN(mp) = 0;
+#endif
+    }
+
+  /* compute which bin corresponds to the page size. */
+  for (nunits = 7; nunits < NBUCKETS; nunits++)
+    if (pagesz <= binsize(nunits))
+      break;
+  pagebucket = nunits;
+
+  return 0;
+}
+    
+static PTR_T
+internal_malloc (n, file, line, flags)         /* get a block */
+     size_t n;
+     const char *file;
+     int line, flags;
+{
+  register union mhead *p;
+  register int nunits;
+  register char *m;
+  long nbytes;  
+
+  /* Get the system page size and align break pointer so future sbrks will
+     be page-aligned.  The page size must be at least 1K -- anything
+     smaller is increased. */
+  if (pagesz == 0)
+    if (pagealign () < 0)
+      return ((PTR_T)NULL);
+  /* Figure out how many bytes are required, rounding up to the nearest
+     multiple of 8, then figure out which nextf[] area to use.  Try to
+     be smart about where to start searching -- if the number of bytes
+     needed is greater than the page size, we can start at pagebucket. */
+  nbytes = ALLOCATED_BYTES(n);
+  nunits = (nbytes <= (pagesz >> 1)) ? STARTBUCK : pagebucket;
+  for ( ; nunits < NBUCKETS; nunits++)
+    if (nbytes <= binsize(nunits))
+      break;
+
+  /* Silently reject too-large requests. */
+  if (nunits >= NBUCKETS)
+    return ((PTR_T) NULL);
+
+  /* In case this is reentrant use of malloc from signal handler,
+     pick a block size that no other malloc level is currently
+     trying to allocate.  That's the easiest harmless way not to
+     interfere with the other level of execution.  */
+#ifdef MALLOC_STATS
+  if (busy[nunits]) _mstats.nrecurse++;
+#endif
+  while (busy[nunits]) nunits++;
+  busy[nunits] = 1;
+
+  if (nunits > maxbuck)
+    maxbuck = nunits;
+
+  /* If there are no blocks of the appropriate size, go get some */
+  if (nextf[nunits] == 0)
+    morecore (nunits);
+
+  /* Get one block off the list, and set the new list head */
+  if ((p = nextf[nunits]) == NULL)
+    {
+      busy[nunits] = 0;
+      return NULL;
+    }
+  nextf[nunits] = CHAIN (p);
+  busy[nunits] = 0;
+
+  /* Check for free block clobbered */
+  /* If not for this check, we would gobble a clobbered free chain ptr
+     and bomb out on the NEXT allocate of this size block */
+  if (p->mh_alloc != ISFREE || p->mh_index != nunits)
+    xbotch ((PTR_T)(p+1), 0, "malloc: block on free list clobbered", file, line);
+
+  /* Fill in the info, and set up the magic numbers for range checking. */
+  p->mh_alloc = ISALLOC;
+  p->mh_magic2 = MAGIC2;
+  p->mh_nbytes = n;
+
+  /* End guard */
+  m = (char *) (p + 1) + n;
+  *(u_bits32_t *)m = n;                /* unaligned access on sparc? */
+
+#ifdef MEMSCRAMBLE
+  m = (char *)(p+1);
+  MALLOC_MEMSET (m, 0xdf, n);  /* scramble previous contents */
+#endif
+#ifdef MALLOC_STATS
+  _mstats.nmalloc[nunits]++;
+  _mstats.tmalloc[nunits]++;
+  _mstats.nmal++;
+  _mstats.bytesreq += n;
+#endif /* MALLOC_STATS */
+
+#ifdef MALLOC_TRACE
+  if (malloc_trace && (flags & MALLOC_NOTRACE) == 0)
+    mtrace_alloc ("malloc", p + 1, n, file, line);
+  else if (_malloc_trace_buckets[nunits])
+    mtrace_alloc ("malloc", p + 1, n, file, line);
+#endif
+
+#ifdef MALLOC_REGISTER
+  if (malloc_register && (flags & MALLOC_NOREG) == 0)
+    mregister_alloc ("malloc", p + 1, n, file, line);
+#endif
+
+#ifdef MALLOC_WATCH
+  if (_malloc_nwatch > 0)
+    _malloc_ckwatch (p + 1, file, line, W_ALLOC, n);
+#endif
+
+  return (PTR_T) (p + 1);
+}
+
+static void
+internal_free (mem, file, line, flags)
+     PTR_T mem;
+     const char *file;
+     int line, flags;
+{
+  register union mhead *p;
+  register char *ap;
+  register int nunits;
+  register unsigned int nbytes;
+  int ubytes;          /* caller-requested size */
+
+  if ((ap = (char *)mem) == 0)
+    return;
+
+  p = (union mhead *) ap - 1;
+
+  if (p->mh_alloc == ISMEMALIGN)
+    {
+      ap -= p->mh_nbytes;
+      p = (union mhead *) ap - 1;
+    }
+
+#if defined (MALLOC_TRACE) || defined (MALLOC_REGISTER)
+  if (malloc_trace || malloc_register)
+    ubytes = p->mh_nbytes;
+#endif
+
+  if (p->mh_alloc != ISALLOC)
+    {
+      if (p->mh_alloc == ISFREE)
+       xbotch (mem, ERR_DUPFREE,
+               "free: called with already freed block argument", file, line);
+      else
+       xbotch (mem, ERR_UNALLOC,
+               "free: called with unallocated block argument", file, line);
+    }
+
+  ASSERT (p->mh_magic2 == MAGIC2);
+
+  nunits = p->mh_index;
+  nbytes = ALLOCATED_BYTES(p->mh_nbytes);
+  /* Since the sizeof(u_bits32_t) bytes before the memory handed to the user
+     are now used for the number of bytes allocated, a simple check of
+     mh_magic2 is no longer sufficient to catch things like p[-1] = 'x'.
+     We sanity-check the value of mh_nbytes against the size of the blocks
+     in the appropriate bucket before we use it.  This can still cause problems
+     and obscure errors if mh_nbytes is wrong but still within range; the
+     checks against the size recorded at the end of the chunk will probably
+     fail then.  Using MALLOC_REGISTER will help here, since it saves the
+     original number of bytes requested. */
+
+  if (IN_BUCKET(nbytes, nunits) == 0)
+    xbotch (mem, ERR_UNDERFLOW,
+           "free: underflow detected; mh_nbytes out of range", file, line);
+
+  ap += p->mh_nbytes;
+  if (*(u_bits32_t *)ap != p->mh_nbytes)
+    xbotch (mem, ERR_ASSERT_FAILED, "free: start and end chunk sizes differ", file, line);
+
+#if 1
+  if (nunits >= LESSCORE_MIN && ((char *)p + binsize(nunits) == memtop))
+#else
+  if (((char *)p + binsize(nunits) == memtop) && nunits >= LESSCORE_MIN)
+#endif
+    {
+      /* If above LESSCORE_FRC, give back unconditionally.  This should be set
+        high enough to be infrequently encountered.  If between LESSCORE_MIN
+        and LESSCORE_FRC, call lesscore if the bucket is marked as busy (in
+        which case we would punt below and leak memory) or if there's already
+        a block on the free list. */
+      if ((nunits >= LESSCORE_FRC) || busy[nunits] || nextf[nunits] != 0)
+       {
+         lesscore (nunits);
+         /* keeps the tracing and registering code in one place */
+         goto free_return;
+       }
+    }
+
+#ifdef MEMSCRAMBLE
+  MALLOC_MEMSET (mem, 0xcf, p->mh_nbytes);
+#endif
+
+  ASSERT (nunits < NBUCKETS);
+  p->mh_alloc = ISFREE;
+
+  if (busy[nunits] == 1)
+    return;    /* this is bogus, but at least it won't corrupt the chains */
+
+  /* Protect against signal handlers calling malloc.  */
+  busy[nunits] = 1;
+  /* Put this block on the free list.  */
+  CHAIN (p) = nextf[nunits];
+  nextf[nunits] = p;
+  busy[nunits] = 0;
+
+free_return:
+
+#ifdef MALLOC_STATS
+  _mstats.nmalloc[nunits]--;
+  _mstats.nfre++;
+#endif /* MALLOC_STATS */
+
+#ifdef MALLOC_TRACE
+  if (malloc_trace && (flags & MALLOC_NOTRACE) == 0)
+    mtrace_free (mem, ubytes, file, line);
+  else if (_malloc_trace_buckets[nunits])
+    mtrace_free (mem, ubytes, file, line);
+#endif
+
+#ifdef MALLOC_REGISTER
+  if (malloc_register && (flags & MALLOC_NOREG) == 0)
+    mregister_free (mem, ubytes, file, line);
+#endif
+
+#ifdef MALLOC_WATCH
+  if (_malloc_nwatch > 0)
+    _malloc_ckwatch (mem, file, line, W_FREE, ubytes);
+#endif
+
+}
+
+static PTR_T
+internal_realloc (mem, n, file, line, flags)
+     PTR_T mem;
+     register size_t n;
+     const char *file;
+     int line, flags;
+{
+  register union mhead *p;
+  register u_bits32_t tocopy;
+  register unsigned int nbytes;
+  register int nunits;
+  register char *m;
+
+#ifdef MALLOC_STATS
+  _mstats.nrealloc++;
+#endif
+
+  if (n == 0)
+    {
+      internal_free (mem, file, line, MALLOC_INTERNAL);
+      return (NULL);
+    }
+  if ((p = (union mhead *) mem) == 0)
+    return internal_malloc (n, file, line, MALLOC_INTERNAL);
+
+  p--;
+  nunits = p->mh_index;
+  ASSERT (nunits < NBUCKETS);
+
+  if (p->mh_alloc != ISALLOC)
+    xbotch (mem, ERR_UNALLOC,
+           "realloc: called with unallocated block argument", file, line);
+
+  ASSERT (p->mh_magic2 == MAGIC2);
+  nbytes = ALLOCATED_BYTES(p->mh_nbytes);
+  /* Since the sizeof(u_bits32_t) bytes before the memory handed to the user
+     are now used for the number of bytes allocated, a simple check of
+     mh_magic2 is no longer sufficient to catch things like p[-1] = 'x'.
+     We sanity-check the value of mh_nbytes against the size of the blocks
+     in the appropriate bucket before we use it.  This can still cause problems
+     and obscure errors if mh_nbytes is wrong but still within range; the
+     checks against the size recorded at the end of the chunk will probably
+     fail then.  Using MALLOC_REGISTER will help here, since it saves the
+     original number of bytes requested. */
+  if (IN_BUCKET(nbytes, nunits) == 0)
+    xbotch (mem, ERR_UNDERFLOW,
+           "realloc: underflow detected; mh_nbytes out of range", file, line);
+
+  m = (char *)mem + (tocopy = p->mh_nbytes);
+  if (*(u_bits32_t *)m != p->mh_nbytes)
+    xbotch (mem, ERR_ASSERT_FAILED, "realloc: start and end chunk sizes differ", file, line);
+
+#ifdef MALLOC_WATCH
+  if (_malloc_nwatch > 0)
+    _malloc_ckwatch (p + 1, file, line, W_REALLOC, n);
+#endif
+#ifdef MALLOC_STATS
+  _mstats.bytesreq += (n < tocopy) ? 0 : n - tocopy;
+#endif
+
+  /* See if desired size rounds to same power of 2 as actual size. */
+  nbytes = ALLOCATED_BYTES(n);
+
+  /* If ok, use the same block, just marking its size as changed.  */
+  if (RIGHT_BUCKET(nbytes, nunits))
+    {
+      *m++ = 0;  *m++ = 0;  *m++ = 0;  *m++ = 0;
+      m = (char *)mem + (p->mh_nbytes = n);
+      *(u_bits32_t *)m = p->mh_nbytes;
+      return mem;
+    }
+
+  if (n < tocopy)
+    tocopy = n;
+
+#ifdef MALLOC_STATS
+  _mstats.nrcopy++;
+#endif
+
+  if ((m = internal_malloc (n, file, line, MALLOC_INTERNAL|MALLOC_NOTRACE|MALLOC_NOREG)) == 0)
+    return 0;
+  FASTCOPY (mem, m, tocopy);
+  internal_free (mem, file, line, MALLOC_INTERNAL);
+
+#ifdef MALLOC_TRACE
+  if (malloc_trace && (flags & MALLOC_NOTRACE) == 0)
+    mtrace_alloc ("realloc", m, n, file, line);
+  else if (_malloc_trace_buckets[nunits])
+    mtrace_alloc ("realloc", m, n, file, line);
+#endif
+
+#ifdef MALLOC_REGISTER
+  if (malloc_register && (flags & MALLOC_NOREG) == 0)
+    mregister_alloc ("realloc", m, n, file, line);
+#endif
+
+#ifdef MALLOC_WATCH
+  if (_malloc_nwatch > 0)
+    _malloc_ckwatch (m, file, line, W_RESIZED, n);
+#endif
+
+  return m;
+}
+
+static PTR_T
+internal_memalign (alignment, size, file, line, flags)
+     unsigned int alignment;
+     size_t size;
+     const char *file;
+     int line, flags;
+{
+  register char *ptr;
+  register char *aligned;
+  register union mhead *p;
+
+  ptr = internal_malloc (size + alignment, file, line, MALLOC_INTERNAL);
+
+  if (ptr == 0)
+    return 0;
+  /* If entire block has the desired alignment, just accept it.  */
+  if (((long) ptr & (alignment - 1)) == 0)
+    return ptr;
+  /* Otherwise, get address of byte in the block that has that alignment.  */
+#if 0
+  aligned = (char *) (((long) ptr + alignment - 1) & -alignment);
+#else
+  aligned = (char *) (((long) ptr + alignment - 1) & (~alignment + 1));
+#endif
+
+  /* Store a suitable indication of how to free the block,
+     so that free can find the true beginning of it.  */
+  p = (union mhead *) aligned - 1;
+  p->mh_nbytes = aligned - ptr;
+  p->mh_alloc = ISMEMALIGN;
+
+  return aligned;
+}
+
+#if !defined (NO_VALLOC)
+/* This runs into trouble with getpagesize on HPUX, and Multimax machines.
+   Patching out seems cleaner than the ugly fix needed.  */
+static PTR_T
+internal_valloc (size, file, line, flags)
+     size_t size;
+     const char *file;
+     int line, flags;
+{
+  return internal_memalign (getpagesize (), size, file, line, flags|MALLOC_INTERNAL);
+}
+#endif /* !NO_VALLOC */
+
+#ifndef NO_CALLOC
+static PTR_T
+internal_calloc (n, s, file, line, flags)
+     size_t n, s;
+     const char *file;
+     int line, flags;
+{
+  size_t total;
+  PTR_T result;
+
+  total = n * s;
+  result = internal_malloc (total, file, line, flags|MALLOC_INTERNAL);
+  if (result)
+    memset (result, 0, total);
+  return result;  
+}
+
+static void
+internal_cfree (p, file, line, flags)
+     PTR_T p;
+     const char *file;
+     int line, flags;
+{
+  internal_free (p, file, line, flags|MALLOC_INTERNAL);
+}
+#endif /* !NO_CALLOC */
+
+#ifdef MALLOC_STATS
+int
+malloc_free_blocks (size)
+     int size;
+{
+  int nfree;
+  register union mhead *p;
+
+  nfree = 0;
+  for (p = nextf[size]; p; p = CHAIN (p))
+    nfree++;
+
+  return nfree;
+}
+#endif
+
+#if defined (MALLOC_WRAPFUNCS)
+PTR_T
+sh_malloc (bytes, file, line)
+     size_t bytes;
+     const char *file;
+     int line;
+{
+  return internal_malloc (bytes, file, line, MALLOC_WRAPPER);
+}
+
+PTR_T
+sh_realloc (ptr, size, file, line)
+     PTR_T ptr;
+     size_t size;
+     const char *file;
+     int line;
+{
+  return internal_realloc (ptr, size, file, line, MALLOC_WRAPPER);
+}
+
+void
+sh_free (mem, file, line)
+     PTR_T mem;
+     const char *file;
+     int line;
+{
+  internal_free (mem, file, line, MALLOC_WRAPPER);
+}
+
+PTR_T
+sh_memalign (alignment, size, file, line)
+     unsigned int alignment;
+     size_t size;
+     const char *file;
+     int line;
+{
+  return internal_memalign (alignment, size, file, line, MALLOC_WRAPPER);
+}
+
+#ifndef NO_CALLOC
+PTR_T
+sh_calloc (n, s, file, line)
+     size_t n, s;
+     const char *file;
+     int line;
+{
+  return internal_calloc (n, s, file, line, MALLOC_WRAPPER);
+}
+
+void
+sh_cfree (mem, file, line)
+     PTR_T mem;
+     const char *file;
+     int line;
+{
+  internal_cfree (mem, file, line, MALLOC_WRAPPER);
+}
+#endif
+
+#ifndef NO_VALLOC
+PTR_T
+sh_valloc (size, file, line)
+     size_t size;
+     const char *file;
+     int line;
+{
+  return internal_valloc (size, file, line, MALLOC_WRAPPER);
+}
+#endif /* !NO_VALLOC */
+
+#endif /* MALLOC_WRAPFUNCS */
+
+/* Externally-available functions that call their internal counterparts. */
+
+PTR_T
+malloc (size)
+     size_t size;
+{
+  return internal_malloc (size, (char *)NULL, 0, 0);
+}
+
+PTR_T
+realloc (mem, nbytes)
+     PTR_T mem;
+     size_t nbytes;
+{
+  return internal_realloc (mem, nbytes, (char *)NULL, 0, 0);
+}
+
+void
+free (mem)
+     PTR_T mem;
+{
+  internal_free (mem,  (char *)NULL, 0, 0);
+}
+
+PTR_T
+memalign (alignment, size)
+     unsigned int alignment;
+     size_t size;
+{
+  return internal_memalign (alignment, size, (char *)NULL, 0, 0);
+}
+
+#ifndef NO_VALLOC
+PTR_T
+valloc (size)
+     size_t size;
+{
+  return internal_valloc (size, (char *)NULL, 0, 0);
+}
+#endif
+
+#ifndef NO_CALLOC
+PTR_T
+calloc (n, s)
+     size_t n, s;
+{
+  return internal_calloc (n, s, (char *)NULL, 0, 0);
+}
+
+void
+cfree (mem)
+     PTR_T mem;
+{
+  internal_cfree (mem, (char *)NULL, 0, 0);
+}
+#endif
diff --git a/lib/malloc/malloc.c.save b/lib/malloc/malloc.c.save
new file mode 100644 (file)
index 0000000..39846ec
--- /dev/null
@@ -0,0 +1,1213 @@
+/* malloc.c - dynamic memory allocation for bash. */
+
+/*  Copyright (C) 1985, 1987, 1997 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.
+
+In other words, you are welcome to use, share and improve this program.
+You are forbidden to forbid anyone else to use, share and improve
+what you give them.   Help stamp out software-hoarding!  */
+
+/*
+ * @(#)nmalloc.c 1 (Caltech) 2/21/82
+ *
+ *     U of M Modified: 20 Jun 1983 ACT: strange hacks for Emacs
+ *
+ *     Nov 1983, Mike@BRL, Added support for 4.1C/4.2 BSD.
+ *
+ * This is a very fast storage allocator.  It allocates blocks of a small 
+ * number of different sizes, and keeps free lists of each size.  Blocks
+ * that don't exactly fit are passed up to the next larger size.  In this 
+ * implementation, the available sizes are (2^n)-4 (or -16) bytes long.
+ * This is designed for use in a program that uses vast quantities of
+ * memory, but bombs when it runs out.  To make it a little better, it
+ * warns the user when he starts to get near the end.
+ *
+ * June 84, ACT: modified rcheck code to check the range given to malloc,
+ * rather than the range determined by the 2-power used.
+ *
+ * Jan 85, RMS: calls malloc_warning to issue warning on nearly full.
+ * No longer Emacs-specific; can serve as all-purpose malloc for GNU.
+ * You should call malloc_init to reinitialize after loading dumped Emacs.
+ * Call malloc_stats to get info on memory stats if MALLOC_STATS turned on.
+ * realloc knows how to return same block given, just changing its size,
+ * if the power of 2 is correct.
+ */
+
+/*
+ * nextf[i] is the pointer to the next free block of size 2^(i+3).  The
+ * smallest allocatable block is 8 bytes.  The overhead information will
+ * go in the first int of the block, and the returned pointer will point
+ * to the second.
+ */
+
+/* Define MEMSCRAMBLE to have free() write 0xcf into memory as it's freed, to
+   uncover callers that refer to freed memory, and to have malloc() write 0xdf
+   into memory as it's allocated to avoid referring to previous contents. */
+
+/* SCO 3.2v4 getcwd and possibly other libc routines fail with MEMSCRAMBLE;
+   handled by configure. */
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif /* HAVE_CONFIG_H */
+
+#if defined (SHELL)
+#  include "bashtypes.h"
+#  include "stdc.h"
+#else
+#  include <sys/types.h>
+#endif
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+/* Determine which kind of system this is.  */
+#include <signal.h>
+
+#if defined (HAVE_STRING_H)
+#  include <string.h>
+#else
+#  include <strings.h>
+#endif
+
+#include <stdio.h>
+
+/* Define getpagesize () if the system does not.  */
+#ifndef HAVE_GETPAGESIZE
+#  include "getpagesize.h"
+#endif
+
+#include "imalloc.h"
+#ifdef MALLOC_STATS
+#  include "mstats.h"
+#endif
+#ifdef MALLOC_REGISTER
+#  include "table.h"
+#endif
+#ifdef MALLOC_WATCH
+#  include "watch.h"
+#endif
+
+/* System-specific omissions. */
+#ifdef HPUX
+#  define NO_VALLOC
+#endif
+
+#define NBUCKETS       30
+
+#define ISALLOC ((char) 0xf7)  /* magic byte that implies allocation */
+#define ISFREE ((char) 0x54)   /* magic byte that implies free block */
+                               /* this is for error checking only */
+#define ISMEMALIGN ((char) 0xd6)  /* Stored before the value returned by
+                                    memalign, with the rest of the word
+                                    being the distance to the true
+                                    beginning of the block.  */
+
+
+/* We have a flag indicating whether memory is allocated, an index in
+   nextf[], a size field, and a sentinel value to determine whether or
+   not a caller wrote before the start of allocated memory; to realloc()
+   memory we either copy mh_nbytes or just change mh_nbytes if there is
+   enough room in the block for the new size.  Range checking is always
+   done. */
+union mhead {
+  bits64_t mh_align;                                           /* 8 */
+  struct {
+    char mi_alloc;             /* ISALLOC or ISFREE */         /* 1 */
+    char mi_index;             /* index in nextf[] */          /* 1 */
+    /* Remainder are valid only when block is allocated */
+    u_bits16_t mi_magic2;      /* should be == MAGIC2 */       /* 2 */
+    u_bits32_t mi_nbytes;      /* # of bytes allocated */      /* 4 */
+  } minfo;
+};
+#define mh_alloc       minfo.mi_alloc
+#define mh_index       minfo.mi_index
+#define mh_nbytes      minfo.mi_nbytes
+#define mh_magic2      minfo.mi_magic2
+
+#define MOVERHEAD      sizeof(union mhead)
+#define MALIGN_MASK    7       /* one less than desired alignment */
+
+/* Access free-list pointer of a block.
+   It is stored at block + sizeof (char *).
+   This is not a field in the minfo structure member of union mhead
+   because we want sizeof (union mhead)
+   to describe the overhead for when the block is in use,
+   and we do not want the free-list pointer to count in that.  */
+
+#define CHAIN(a) \
+  (*(union mhead **) (sizeof (char *) + (char *) (a)))
+
+/* To implement range checking, we write magic values in at the beginning
+   and end of each allocated block, and make sure they are undisturbed
+   whenever a free or a realloc occurs. */
+
+/* Written in the 2 bytes before the block's real space (-4 bytes) */
+#define MAGIC2 0x5555
+#define MSLOP  4               /* 4 bytes extra for u_bits32_t size */
+
+/* How many bytes are actually allocated for a request of size N --
+   rounded up to nearest multiple of 8 after accounting for malloc
+   overhead. */
+#define ALLOCATED_BYTES(n) \
+       (((n) + MOVERHEAD + MSLOP + MALIGN_MASK) & ~MALIGN_MASK)
+
+#define ASSERT(p) \
+  do \
+    { \
+      if (!(p)) xbotch((PTR_T)0, ERR_ASSERT_FAILED, __STRING(p), file, line); \
+    } \
+  while (0)
+
+/* Minimum and maximum bucket indices for block splitting (and to bound
+   the search for a block to split). */
+#define SPLIT_MIN      2       /* XXX - was 3 */
+#define SPLIT_MID      11
+#define SPLIT_MAX      14
+
+/* Minimum and maximum bucket indices for block coalescing. */
+#define COMBINE_MIN    2
+#define COMBINE_MAX    (pagebucket - 1)        /* XXX */
+
+#define LESSCORE_MIN   10
+#define LESSCORE_FRC   13
+
+#define STARTBUCK      1
+
+/* Flags for the internal functions. */
+#define MALLOC_WRAPPER 0x01    /* wrapper function */
+#define MALLOC_INTERNAL        0x02    /* internal function calling another */
+#define MALLOC_NOTRACE 0x04    /* don't trace this allocation or free */
+#define MALLOC_NOREG   0x08    /* don't register this allocation or free */
+
+/* Future use. */
+#define ERR_DUPFREE            0x01
+#define ERR_UNALLOC            0x02
+#define ERR_UNDERFLOW          0x04    
+#define ERR_ASSERT_FAILED      0x08
+
+/* Evaluates to true if NB is appropriate for bucket NU.  NB is adjusted
+   appropriately by the caller to account for malloc overhead.  This only
+   checks that the recorded size is not too big for the bucket.  We
+   can't check whether or not it's in between NU and NU-1 because we
+   might have encountered a busy bucket when allocating and moved up to
+   the next size. */
+#define IN_BUCKET(nb, nu)      ((nb) <= binsizes[(nu)])
+
+/* Use this when we want to be sure that NB is in bucket NU. */
+#define RIGHT_BUCKET(nb, nu) \
+       (((nb) > binsizes[(nu)-1]) && ((nb) <= binsizes[(nu)]))
+
+/* nextf[i] is free list of blocks of size 2**(i + 3)  */
+
+static union mhead *nextf[NBUCKETS];
+
+/* busy[i] is nonzero while allocation of block size i is in progress.  */
+
+static char busy[NBUCKETS];
+
+static int pagesz;     /* system page size. */
+static int pagebucket; /* bucket for requests a page in size */
+static int maxbuck;    /* highest bucket receiving allocation request. */
+
+static char *memtop;   /* top of heap */
+
+static unsigned long binsizes[NBUCKETS] = {
+       8UL, 16UL, 32UL, 64UL, 128UL, 256UL, 512UL, 1024UL, 2048UL, 4096UL,
+       8192UL, 16384UL, 32768UL, 65536UL, 131072UL, 262144UL, 524288UL,
+       1048576UL, 2097152UL, 4194304UL, 8388608UL, 16777216UL, 33554432UL,
+       67108864UL, 134217728UL, 268435456UL, 536870912UL, 1073741824UL,
+       2147483648UL, 4294967296UL-1
+};
+
+/* binsizes[x] == (1 << ((x) + 3)) */
+#define binsize(x)     binsizes[(x)]
+
+/* Declarations for internal functions */
+static PTR_T internal_malloc __P((size_t, const char *, int, int));
+static PTR_T internal_realloc __P((PTR_T, size_t, const char *, int, int));
+static void internal_free __P((PTR_T, const char *, int, int));
+static PTR_T internal_memalign __P((unsigned int, size_t, const char *, int, int));
+#ifndef NO_CALLOC
+static PTR_T internal_calloc __P((size_t, size_t, const char *, int, int));
+static void internal_cfree __P((PTR_T, const char *, int, int));
+#endif
+#ifndef NO_VALLOC
+static PTR_T internal_valloc __P((size_t, const char *, int, int));
+#endif
+
+#if defined (botch)
+extern void botch ();
+#else
+static void botch __P((const char *, const char *, int));
+#endif
+static void xbotch __P((PTR_T, int, const char *, const char *, int));
+
+#if !HAVE_DECL_SBRK
+extern char *sbrk ();
+#endif /* !HAVE_DECL_SBRK */
+
+#ifdef SHELL
+extern int interrupt_immediately;
+extern int signal_is_trapped __P((int));
+#endif
+
+#ifdef MALLOC_STATS
+struct _malstats _mstats;
+#endif /* MALLOC_STATS */
+
+/* Debugging variables available to applications. */
+int malloc_flags = 0;  /* future use */
+int malloc_trace = 0;  /* trace allocations and frees to stderr */
+int malloc_register = 0;       /* future use */
+
+#ifdef MALLOC_TRACE
+char _malloc_trace_buckets[NBUCKETS];
+
+/* These should really go into a header file. */
+extern void mtrace_alloc __P((const char *, PTR_T, size_t, const char *, int));
+extern void mtrace_free __P((PTR_T, int, const char *, int));
+#endif
+
+#if !defined (botch)
+static void
+botch (s, file, line)
+{
+  fprintf (stderr, "malloc: failed assertion: %s\n", s);
+  (void)fflush (stderr);
+  abort ();
+}
+#endif
+
+/* print the file and line number that caused the assertion failure and
+   call botch() to do whatever the application wants with the information */
+static void
+xbotch (mem, e, s, file, line)
+     PTR_T mem;
+     int e;
+     const char *s;
+     const char *file;
+     int line;
+{
+  fprintf (stderr, "\r\nmalloc: %s:%d: assertion botched\r\n",
+                       file ? file : "unknown", line);
+#ifdef MALLOC_REGISTER
+  if (mem != NULL && malloc_register)
+    mregister_describe_mem (mem, stderr);
+#endif
+  (void)fflush (stderr);
+  botch(s, file, line);
+}
+
+/* Coalesce two adjacent free blocks off the free list for size NU - 1,
+   as long as we can find two adjacent free blocks.  nextf[NU -1] is
+   assumed to not be busy; the caller (morecore()) checks for this. */
+static void
+bcoalesce (nu)
+     register int nu;
+{
+  register union mhead *mp, *mp1, *mp2;
+  register int nbuck;
+  unsigned long siz;
+
+  nbuck = nu - 1;
+  if (nextf[nbuck] == 0)
+    return;
+
+  siz = binsize (nbuck);
+
+  mp2 = mp1 = nextf[nbuck];
+  mp = CHAIN (mp1);
+  while (mp && mp != (union mhead *)((char *)mp1 + siz))
+    {
+      mp2 = mp1;
+      mp1 = mp;
+      mp = CHAIN (mp);
+    }
+  if (mp == 0)
+    return;
+
+  /* OK, now we have mp1 pointing to the block we want to add to nextf[NU].
+     CHAIN(mp2) must equal mp1.  Check that mp1 and mp are adjacent. */
+  if (mp2 != mp1 && CHAIN(mp2) != mp1)
+    xbotch ((PTR_T)0, 0, "bcoalesce: CHAIN(mp2) != mp1", (char *)NULL, 0);
+
+#ifdef MALLOC_DEBUG
+  if (CHAIN (mp1) != (union mhead *)((char *)mp1 + siz))
+    return;    /* not adjacent */
+#endif
+
+#ifdef MALLOC_STATS
+  _mstats.tbcoalesce++;
+  _mstats.ncoalesce[nbuck]++;
+#endif
+
+  /* Since they are adjacent, remove them from the free list */
+  if (mp1 == nextf[nbuck])
+    nextf[nbuck] = CHAIN (mp);
+  else
+    CHAIN (mp2) = CHAIN (mp);
+
+  /* And add the combined two blocks to nextf[NU]. */
+  mp1->mh_alloc = ISFREE;
+  mp1->mh_index = nu;
+  CHAIN (mp1) = nextf[nu];
+  nextf[nu] = mp1;
+}
+
+/* Split a block at index > NU (but less than SPLIT_MAX) into a set of
+   blocks of the correct size, and attach them to nextf[NU].  nextf[NU]
+   is assumed to be empty.  Must be called with signals blocked (e.g.,
+   by morecore()). */
+static void
+bsplit (nu)
+     register int nu;
+{
+  register union mhead *mp;
+  int nbuck, nblks, split_max;
+  unsigned long siz;
+
+  split_max = (maxbuck > SPLIT_MAX) ? maxbuck : SPLIT_MAX;
+
+  if (nu >= SPLIT_MID)
+    {
+      for (nbuck = split_max; nbuck > nu; nbuck--)
+       {
+         if (busy[nbuck] || nextf[nbuck] == 0)
+           continue;
+         break;
+       }
+    }
+  else
+    {
+      for (nbuck = nu + 1; nbuck <= split_max; nbuck++)
+       {
+         if (busy[nbuck] || nextf[nbuck] == 0)
+           continue;
+         break;
+       }
+    }
+
+  if (nbuck > split_max || nbuck <= nu)
+    return;
+
+  /* XXX might want to split only if nextf[nbuck] has >= 2 blocks free
+     and nbuck is below some threshold. */
+
+#ifdef MALLOC_STATS
+  _mstats.tbsplit++;
+  _mstats.nsplit[nbuck]++;
+#endif
+
+  /* Figure out how many blocks we'll get. */
+  siz = binsize (nu);
+  nblks = binsize (nbuck) / siz;
+
+  /* Remove the block from the chain of larger blocks. */
+  mp = nextf[nbuck];
+  nextf[nbuck] = CHAIN (mp);
+
+  /* Split the block and put it on the requested chain. */
+  nextf[nu] = mp;
+  while (1)
+    {
+      mp->mh_alloc = ISFREE;
+      mp->mh_index = nu;
+      if (--nblks <= 0) break;
+      CHAIN (mp) = (union mhead *)((char *)mp + siz);
+      mp = (union mhead *)((char *)mp + siz);
+    }
+  CHAIN (mp) = 0;
+}
+
+static void
+block_signals (setp, osetp)
+     sigset_t *setp, *osetp;
+{
+#ifdef HAVE_POSIX_SIGNALS
+  sigfillset (setp);
+  sigemptyset (osetp);
+  sigprocmask (SIG_BLOCK, setp, osetp);
+#else
+#  if defined (HAVE_BSD_SIGNALS)
+  *osetp = sigsetmask (-1);
+#  endif
+#endif
+}
+
+static void
+unblock_signals (setp, osetp)
+     sigset_t *setp, *osetp;
+{
+#ifdef HAVE_POSIX_SIGNALS
+  sigprocmask (SIG_SETMASK, osetp, (sigset_t *)NULL);
+#else
+#  if defined (HAVE_BSD_SIGNALS)
+  sigsetmask (*osetp);
+#  endif
+#endif
+}
+
+/* Return some memory to the system by reducing the break.  This is only
+   called with NU > pagebucket, so we're always assured of giving back
+   more than one page of memory. */  
+static void
+lesscore (nu)                  /* give system back some memory */
+     register int nu;          /* size index we're discarding  */
+{
+  long siz;
+
+  siz = binsize (nu);
+  /* Should check for errors here, I guess. */
+  sbrk (-siz);
+  memtop -= siz;
+
+#ifdef MALLOC_STATS
+  _mstats.nsbrk++;
+  _mstats.tsbrk -= siz;
+  _mstats.nlesscore[nu]++;
+#endif
+}
+  
+static void
+morecore (nu)                  /* ask system for more memory */
+     register int nu;          /* size index to get more of  */
+{
+  register union mhead *mp;
+  register int nblks;
+  register long siz;
+  long sbrk_amt;               /* amount to get via sbrk() */
+  sigset_t set, oset;
+  int blocked_sigs;
+
+  /* Block all signals in case we are executed from a signal handler. */
+  blocked_sigs = 0;
+#ifdef SHELL
+  if (interrupt_immediately || signal_is_trapped (SIGINT) || signal_is_trapped (SIGCHLD))
+#endif
+    {
+      block_signals (&set, &oset);
+      blocked_sigs = 1;
+    }
+
+  siz = binsize (nu);  /* size of desired block for nextf[nu] */
+
+  if (siz < 0)
+    goto morecore_done;                /* oops */
+
+#ifdef MALLOC_STATS
+  _mstats.nmorecore[nu]++;
+#endif
+
+  /* Try to split a larger block here, if we're within the range of sizes
+     to split. */
+  if (nu >= SPLIT_MIN)
+    {
+      bsplit (nu);
+      if (nextf[nu] != 0)
+       goto morecore_done;
+    }
+
+  /* Try to coalesce two adjacent blocks from the free list on nextf[nu - 1],
+     if we can, and we're withing the range of the block coalescing limits. */
+  if (nu >= COMBINE_MIN && nu < COMBINE_MAX && busy[nu - 1] == 0 && nextf[nu - 1])
+    {
+      bcoalesce (nu);
+      if (nextf[nu] != 0)
+       goto morecore_done;
+    }
+
+  /* Take at least a page, and figure out how many blocks of the requested
+     size we're getting. */
+  if (siz <= pagesz)
+    {
+      sbrk_amt = pagesz;
+      nblks = sbrk_amt / siz;
+    }
+  else
+    {
+      /* We always want to request an integral multiple of the page size
+        from the kernel, so let's compute whether or not `siz' is such
+        an amount.  If it is, we can just request it.  If not, we want
+        the smallest integral multiple of pagesize that is larger than
+        `siz' and will satisfy the request. */
+      sbrk_amt = siz & (pagesz - 1);
+      if (sbrk_amt == 0)
+       sbrk_amt = siz;
+      else
+       sbrk_amt = siz + pagesz - sbrk_amt;
+      nblks = 1;
+    }
+
+#ifdef MALLOC_STATS
+  _mstats.nsbrk++;
+  _mstats.tsbrk += sbrk_amt;
+#endif
+
+  mp = (union mhead *) sbrk (sbrk_amt);
+
+  /* Totally out of memory. */
+  if ((long)mp == -1)
+    goto morecore_done;
+
+  memtop += sbrk_amt;
+
+  /* shouldn't happen, but just in case -- require 8-byte alignment */
+  if ((long)mp & MALIGN_MASK)
+    {
+      mp = (union mhead *) (((long)mp + MALIGN_MASK) & ~MALIGN_MASK);
+      nblks--;
+    }
+
+  /* save new header and link the nblks blocks together */
+  nextf[nu] = mp;
+  while (1)
+    {
+      mp->mh_alloc = ISFREE;
+      mp->mh_index = nu;
+      if (--nblks <= 0) break;
+      CHAIN (mp) = (union mhead *)((char *)mp + siz);
+      mp = (union mhead *)((char *)mp + siz);
+    }
+  CHAIN (mp) = 0;
+
+morecore_done:
+  if (blocked_sigs)
+    unblock_signals (&set, &oset);
+}
+
+static void
+malloc_debug_dummy ()
+{
+  write (1, "malloc_debug_dummy\n", 19);
+}
+
+#define PREPOP_BIN     2
+#define PREPOP_SIZE    32
+
+static int
+pagealign ()
+{
+  register long nbytes;
+  register int nunits;
+  register union mhead *mp;
+  long sbrk_needed;
+  char *curbrk;
+
+  pagesz = getpagesize ();
+  if (pagesz < 1024)
+    pagesz = 1024;
+
+  /* OK, how much do we need to allocate to make things page-aligned?
+     Some of this partial page will be wasted space, but we'll use as
+     much as we can.  Once we figure out how much to advance the break
+     pointer, go ahead and do it. */
+  memtop = curbrk = sbrk (0);
+  sbrk_needed = pagesz - ((long)curbrk & (pagesz - 1));        /* sbrk(0) % pagesz */
+  if (sbrk_needed < 0)
+    sbrk_needed += pagesz;
+
+  /* Now allocate the wasted space. */
+  if (sbrk_needed)
+    {
+#ifdef MALLOC_STATS
+      _mstats.nsbrk++;
+      _mstats.tsbrk += sbrk_needed;
+#endif
+      curbrk = sbrk (sbrk_needed);
+      if ((long)curbrk == -1)
+       return -1;
+      memtop += sbrk_needed;
+
+      /* Take the memory which would otherwise be wasted and populate the most
+        popular bin (2 == 32 bytes) with it.  Add whatever we need to curbrk
+        to make things 32-byte aligned, compute how many 32-byte chunks we're
+        going to get, and set up the bin. */
+      curbrk += sbrk_needed & (PREPOP_SIZE - 1);
+      sbrk_needed -= sbrk_needed & (PREPOP_SIZE - 1);
+      nunits = sbrk_needed / PREPOP_SIZE;
+
+      mp = (union mhead *)curbrk;
+
+      nextf[PREPOP_BIN] = mp;
+      while (1)
+       {
+         mp->mh_alloc = ISFREE;
+         mp->mh_index = PREPOP_BIN;
+         if (--nunits <= 0) break;
+         CHAIN(mp) = (union mhead *)((char *)mp + PREPOP_SIZE);
+         mp = (union mhead *)((char *)mp + PREPOP_SIZE);
+       }
+      CHAIN(mp) = 0;
+    }
+
+  /* compute which bin corresponds to the page size. */
+  for (nunits = 7; nunits < NBUCKETS; nunits++)
+    if (pagesz <= binsize(nunits))
+      break;
+  pagebucket = nunits;
+
+  return 0;
+}
+    
+static PTR_T
+internal_malloc (n, file, line, flags)         /* get a block */
+     size_t n;
+     const char *file;
+     int line, flags;
+{
+  register union mhead *p;
+  register int nunits;
+  register char *m;
+  long nbytes;  
+
+  /* Get the system page size and align break pointer so future sbrks will
+     be page-aligned.  The page size must be at least 1K -- anything
+     smaller is increased. */
+  if (pagesz == 0)
+    if (pagealign () < 0)
+      return ((PTR_T)NULL);
+  /* Figure out how many bytes are required, rounding up to the nearest
+     multiple of 8, then figure out which nextf[] area to use.  Try to
+     be smart about where to start searching -- if the number of bytes
+     needed is greater than the page size, we can start at pagebucket. */
+  nbytes = ALLOCATED_BYTES(n);
+  nunits = (nbytes <= (pagesz >> 1)) ? STARTBUCK : pagebucket;
+  for ( ; nunits < NBUCKETS; nunits++)
+    if (nbytes <= binsize(nunits))
+      break;
+
+  /* Silently reject too-large requests. */
+  if (nunits >= NBUCKETS)
+    return ((PTR_T) NULL);
+
+  /* In case this is reentrant use of malloc from signal handler,
+     pick a block size that no other malloc level is currently
+     trying to allocate.  That's the easiest harmless way not to
+     interfere with the other level of execution.  */
+#ifdef MALLOC_STATS
+  if (busy[nunits]) _mstats.nrecurse++;
+#endif
+  while (busy[nunits]) nunits++;
+  busy[nunits] = 1;
+
+  if (nunits > maxbuck)
+    maxbuck = nunits;
+
+  /* If there are no blocks of the appropriate size, go get some */
+  if (nextf[nunits] == 0)
+    morecore (nunits);
+
+  /* Get one block off the list, and set the new list head */
+  if ((p = nextf[nunits]) == NULL)
+    {
+      busy[nunits] = 0;
+      return NULL;
+    }
+  nextf[nunits] = CHAIN (p);
+  busy[nunits] = 0;
+
+  /* Check for free block clobbered */
+  /* If not for this check, we would gobble a clobbered free chain ptr
+     and bomb out on the NEXT allocate of this size block */
+  if (p->mh_alloc != ISFREE || p->mh_index != nunits)
+    xbotch ((PTR_T)(p+1), 0, "malloc: block on free list clobbered", file, line);
+
+  /* Fill in the info, and set up the magic numbers for range checking. */
+  p->mh_alloc = ISALLOC;
+  p->mh_magic2 = MAGIC2;
+  p->mh_nbytes = n;
+
+  /* End guard */
+  m = (char *) (p + 1) + n;
+  *(u_bits32_t *)m = n;
+
+#ifdef MEMSCRAMBLE
+  MALLOC_MEMSET ((char *)(p + 1), 0xdf, n);    /* scramble previous contents */
+#endif
+#ifdef MALLOC_STATS
+  _mstats.nmalloc[nunits]++;
+  _mstats.tmalloc[nunits]++;
+  _mstats.nmal++;
+  _mstats.bytesreq += n;
+#endif /* MALLOC_STATS */
+
+#ifdef MALLOC_TRACE
+  if (malloc_trace && (flags & MALLOC_NOTRACE) == 0)
+    mtrace_alloc ("malloc", p + 1, n, file, line);
+  else if (_malloc_trace_buckets[nunits])
+    mtrace_alloc ("malloc", p + 1, n, file, line);
+#endif
+
+#ifdef MALLOC_REGISTER
+  if (malloc_register && (flags & MALLOC_NOREG) == 0)
+    mregister_alloc ("malloc", p + 1, n, file, line);
+#endif
+
+#ifdef MALLOC_WATCH
+  if (_malloc_nwatch > 0)
+    _malloc_ckwatch (p + 1, file, line, W_ALLOC, n);
+#endif
+
+  return (PTR_T) (p + 1);
+}
+
+static void
+internal_free (mem, file, line, flags)
+     PTR_T mem;
+     const char *file;
+     int line, flags;
+{
+  register union mhead *p;
+  register char *ap;
+  register int nunits;
+  register unsigned int nbytes;
+  int ubytes;          /* caller-requested size */
+
+  if ((ap = (char *)mem) == 0)
+    return;
+
+  p = (union mhead *) ap - 1;
+
+  if (p->mh_alloc == ISMEMALIGN)
+    {
+      ap -= p->mh_nbytes;
+      p = (union mhead *) ap - 1;
+    }
+
+#if defined (MALLOC_TRACE) || defined (MALLOC_REGISTER)
+  if (malloc_trace || malloc_register)
+    ubytes = p->mh_nbytes;
+#endif
+
+  if (p->mh_alloc != ISALLOC)
+    {
+      if (p->mh_alloc == ISFREE)
+       xbotch (mem, ERR_DUPFREE,
+               "free: called with already freed block argument", file, line);
+      else
+       xbotch (mem, ERR_UNALLOC,
+               "free: called with unallocated block argument", file, line);
+    }
+
+  ASSERT (p->mh_magic2 == MAGIC2);
+
+  nunits = p->mh_index;
+  nbytes = ALLOCATED_BYTES(p->mh_nbytes);
+  /* Since the sizeof(u_bits32_t) bytes before the memory handed to the user
+     are now used for the number of bytes allocated, a simple check of
+     mh_magic2 is no longer sufficient to catch things like p[-1] = 'x'.
+     We sanity-check the value of mh_nbytes against the size of the blocks
+     in the appropriate bucket before we use it.  This can still cause problems
+     and obscure errors if mh_nbytes is wrong but still within range; the
+     checks against the size recorded at the end of the chunk will probably
+     fail then.  Using MALLOC_REGISTER will help here, since it saves the
+     original number of bytes requested. */
+
+  if (IN_BUCKET(nbytes, nunits) == 0)
+    xbotch (mem, ERR_UNDERFLOW,
+           "free: underflow detected; mh_nbytes out of range", file, line);
+
+  ap += p->mh_nbytes;
+  if (*(u_bits32_t *)ap != p->mh_nbytes)
+    xbotch (mem, ERR_ASSERT_FAILED, "free: start and end chunk sizes differ", file, line);
+
+#if 1
+  if (nunits >= LESSCORE_MIN && ((char *)p + binsize(nunits) == memtop))
+#else
+  if (((char *)p + binsize(nunits) == memtop) && nunits >= LESSCORE_MIN)
+#endif
+    {
+      /* If above LESSCORE_FRC, give back unconditionally.  This should be set
+        high enough to be infrequently encountered.  If between LESSCORE_MIN
+        and LESSCORE_FRC, call lesscore if the bucket is marked as busy (in
+        which case we would punt below and leak memory) or if there's already
+        a block on the free list. */
+      if ((nunits >= LESSCORE_FRC) || busy[nunits] || nextf[nunits] != 0)
+       {
+         lesscore (nunits);
+         /* keeps the tracing and registering code in one place */
+         goto free_return;
+       }
+    }
+
+#ifdef MEMSCRAMBLE
+  MALLOC_MEMSET (mem, 0xcf, p->mh_nbytes);
+#endif
+
+  ASSERT (nunits < NBUCKETS);
+  p->mh_alloc = ISFREE;
+
+  if (busy[nunits] == 1)
+    return;    /* this is bogus, but at least it won't corrupt the chains */
+
+  /* Protect against signal handlers calling malloc.  */
+  busy[nunits] = 1;
+  /* Put this block on the free list.  */
+  CHAIN (p) = nextf[nunits];
+  nextf[nunits] = p;
+  busy[nunits] = 0;
+
+free_return:
+
+#ifdef MALLOC_STATS
+  _mstats.nmalloc[nunits]--;
+  _mstats.nfre++;
+#endif /* MALLOC_STATS */
+
+#ifdef MALLOC_TRACE
+  if (malloc_trace && (flags & MALLOC_NOTRACE) == 0)
+    mtrace_free (mem, ubytes, file, line);
+  else if (_malloc_trace_buckets[nunits])
+    mtrace_free (mem, ubytes, file, line);
+#endif
+
+#ifdef MALLOC_REGISTER
+  if (malloc_register && (flags & MALLOC_NOREG) == 0)
+    mregister_free (mem, ubytes, file, line);
+#endif
+
+#ifdef MALLOC_WATCH
+  if (_malloc_nwatch > 0)
+    _malloc_ckwatch (mem, file, line, W_FREE, ubytes);
+#endif
+
+}
+
+static PTR_T
+internal_realloc (mem, n, file, line, flags)
+     PTR_T mem;
+     register size_t n;
+     const char *file;
+     int line, flags;
+{
+  register union mhead *p;
+  register u_bits32_t tocopy;
+  register unsigned int nbytes;
+  register int nunits;
+  register char *m;
+
+#ifdef MALLOC_STATS
+  _mstats.nrealloc++;
+#endif
+
+  if (n == 0)
+    {
+      internal_free (mem, file, line, MALLOC_INTERNAL);
+      return (NULL);
+    }
+  if ((p = (union mhead *) mem) == 0)
+    return internal_malloc (n, file, line, MALLOC_INTERNAL);
+
+  p--;
+  nunits = p->mh_index;
+  ASSERT (nunits < NBUCKETS);
+
+  if (p->mh_alloc != ISALLOC)
+    xbotch (mem, ERR_UNALLOC,
+           "realloc: called with unallocated block argument", file, line);
+
+  ASSERT (p->mh_magic2 == MAGIC2);
+  nbytes = ALLOCATED_BYTES(p->mh_nbytes);
+  /* Since the sizeof(u_bits32_t) bytes before the memory handed to the user
+     are now used for the number of bytes allocated, a simple check of
+     mh_magic2 is no longer sufficient to catch things like p[-1] = 'x'.
+     We sanity-check the value of mh_nbytes against the size of the blocks
+     in the appropriate bucket before we use it.  This can still cause problems
+     and obscure errors if mh_nbytes is wrong but still within range; the
+     checks against the size recorded at the end of the chunk will probably
+     fail then.  Using MALLOC_REGISTER will help here, since it saves the
+     original number of bytes requested. */
+  if (IN_BUCKET(nbytes, nunits) == 0)
+    xbotch (mem, ERR_UNDERFLOW,
+           "realloc: underflow detected; mh_nbytes out of range", file, line);
+
+  m = (char *)mem + (tocopy = p->mh_nbytes);
+  if (*(u_bits32_t *)m != p->mh_nbytes)
+    xbotch (mem, ERR_ASSERT_FAILED, "realloc: start and end chunk sizes differ", file, line);
+
+#ifdef MALLOC_WATCH
+  if (_malloc_nwatch > 0)
+    _malloc_ckwatch (p + 1, file, line, W_REALLOC, n);
+#endif
+#ifdef MALLOC_STATS
+  _mstats.bytesreq += (n < tocopy) ? 0 : n - tocopy;
+#endif
+
+  /* See if desired size rounds to same power of 2 as actual size. */
+  nbytes = ALLOCATED_BYTES(n);
+
+  /* If ok, use the same block, just marking its size as changed.  */
+  if (RIGHT_BUCKET(nbytes, nunits))
+    {
+      *m++ = 0;  *m++ = 0;  *m++ = 0;  *m++ = 0;
+      m = (char *)mem + (p->mh_nbytes = n);
+      *(u_bits32_t *)m = p->mh_nbytes;
+      return mem;
+    }
+
+  if (n < tocopy)
+    tocopy = n;
+
+#ifdef MALLOC_STATS
+  _mstats.nrcopy++;
+#endif
+
+  if ((m = internal_malloc (n, file, line, MALLOC_INTERNAL|MALLOC_NOTRACE|MALLOC_NOREG)) == 0)
+    return 0;
+  FASTCOPY (mem, m, tocopy);
+  internal_free (mem, file, line, MALLOC_INTERNAL);
+
+#ifdef MALLOC_TRACE
+  if (malloc_trace && (flags & MALLOC_NOTRACE) == 0)
+    mtrace_alloc ("realloc", m, n, file, line);
+  else if (_malloc_trace_buckets[nunits])
+    mtrace_alloc ("realloc", m, n, file, line);
+#endif
+
+#ifdef MALLOC_REGISTER
+  if (malloc_register && (flags & MALLOC_NOREG) == 0)
+    mregister_alloc ("realloc", m, n, file, line);
+#endif
+
+#ifdef MALLOC_WATCH
+  if (_malloc_nwatch > 0)
+    _malloc_ckwatch (m, file, line, W_RESIZED, n);
+#endif
+
+  return m;
+}
+
+static PTR_T
+internal_memalign (alignment, size, file, line, flags)
+     unsigned int alignment;
+     size_t size;
+     const char *file;
+     int line, flags;
+{
+  register char *ptr;
+  register char *aligned;
+  register union mhead *p;
+
+  ptr = internal_malloc (size + alignment, file, line, MALLOC_INTERNAL);
+
+  if (ptr == 0)
+    return 0;
+  /* If entire block has the desired alignment, just accept it.  */
+  if (((long) ptr & (alignment - 1)) == 0)
+    return ptr;
+  /* Otherwise, get address of byte in the block that has that alignment.  */
+#if 0
+  aligned = (char *) (((long) ptr + alignment - 1) & -alignment);
+#else
+  aligned = (char *) (((long) ptr + alignment - 1) & (~alignment + 1));
+#endif
+
+  /* Store a suitable indication of how to free the block,
+     so that free can find the true beginning of it.  */
+  p = (union mhead *) aligned - 1;
+  p->mh_nbytes = aligned - ptr;
+  p->mh_alloc = ISMEMALIGN;
+
+  return aligned;
+}
+
+#if !defined (NO_VALLOC)
+/* This runs into trouble with getpagesize on HPUX, and Multimax machines.
+   Patching out seems cleaner than the ugly fix needed.  */
+static PTR_T
+internal_valloc (size, file, line, flags)
+     size_t size;
+     const char *file;
+     int line, flags;
+{
+  return internal_memalign (getpagesize (), size, file, line, flags|MALLOC_INTERNAL);
+}
+#endif /* !NO_VALLOC */
+
+#ifndef NO_CALLOC
+static PTR_T
+internal_calloc (n, s, file, line, flags)
+     size_t n, s;
+     const char *file;
+     int line, flags;
+{
+  size_t total;
+  PTR_T result;
+
+  total = n * s;
+  result = internal_malloc (total, file, line, flags|MALLOC_INTERNAL);
+  if (result)
+    memset (result, 0, total);
+  return result;  
+}
+
+static void
+internal_cfree (p, file, line, flags)
+     PTR_T p;
+     const char *file;
+     int line, flags;
+{
+  internal_free (p, file, line, flags|MALLOC_INTERNAL);
+}
+#endif /* !NO_CALLOC */
+
+#ifdef MALLOC_STATS
+int
+malloc_free_blocks (size)
+     int size;
+{
+  int nfree;
+  register union mhead *p;
+
+  nfree = 0;
+  for (p = nextf[size]; p; p = CHAIN (p))
+    nfree++;
+
+  return nfree;
+}
+#endif
+
+#if defined (MALLOC_WRAPFUNCS)
+PTR_T
+sh_malloc (bytes, file, line)
+     size_t bytes;
+     const char *file;
+     int line;
+{
+  return internal_malloc (bytes, file, line, MALLOC_WRAPPER);
+}
+
+PTR_T
+sh_realloc (ptr, size, file, line)
+     PTR_T ptr;
+     size_t size;
+     const char *file;
+     int line;
+{
+  return internal_realloc (ptr, size, file, line, MALLOC_WRAPPER);
+}
+
+void
+sh_free (mem, file, line)
+     PTR_T mem;
+     const char *file;
+     int line;
+{
+  internal_free (mem, file, line, MALLOC_WRAPPER);
+}
+
+PTR_T
+sh_memalign (alignment, size, file, line)
+     unsigned int alignment;
+     size_t size;
+     const char *file;
+     int line;
+{
+  return internal_memalign (alignment, size, file, line, MALLOC_WRAPPER);
+}
+
+#ifndef NO_CALLOC
+PTR_T
+sh_calloc (n, s, file, line)
+     size_t n, s;
+     const char *file;
+     int line;
+{
+  return internal_calloc (n, s, file, line, MALLOC_WRAPPER);
+}
+
+void
+sh_cfree (mem, file, line)
+     PTR_T mem;
+     const char *file;
+     int line;
+{
+  internal_cfree (mem, file, line, MALLOC_WRAPPER);
+}
+#endif
+
+#ifndef NO_VALLOC
+PTR_T
+sh_valloc (size, file, line)
+     size_t size;
+     const char *file;
+     int line;
+{
+  return internal_valloc (size, file, line, MALLOC_WRAPPER);
+}
+#endif /* !NO_VALLOC */
+
+#endif /* MALLOC_WRAPFUNCS */
+
+/* Externally-available functions that call their internal counterparts. */
+
+PTR_T
+malloc (size)
+     size_t size;
+{
+  return internal_malloc (size, (char *)NULL, 0, 0);
+}
+
+PTR_T
+realloc (mem, nbytes)
+     PTR_T mem;
+     size_t nbytes;
+{
+  return internal_realloc (mem, nbytes, (char *)NULL, 0, 0);
+}
+
+void
+free (mem)
+     PTR_T mem;
+{
+  internal_free (mem,  (char *)NULL, 0, 0);
+}
+
+PTR_T
+memalign (alignment, size)
+     unsigned int alignment;
+     size_t size;
+{
+  return internal_memalign (alignment, size, (char *)NULL, 0, 0);
+}
+
+#ifndef NO_VALLOC
+PTR_T
+valloc (size)
+     size_t size;
+{
+  return internal_valloc (size, (char *)NULL, 0, 0);
+}
+#endif
+
+#ifndef NO_CALLOC
+PTR_T
+calloc (n, s)
+     size_t n, s;
+{
+  return internal_calloc (n, s, (char *)NULL, 0, 0);
+}
+
+void
+cfree (mem)
+     PTR_T mem;
+{
+  internal_cfree (mem, (char *)NULL, 0, 0);
+}
+#endif
diff --git a/lib/malloc/memtest.c b/lib/malloc/memtest.c
new file mode 100644 (file)
index 0000000..38bd3d5
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * malloc test program.
+ *
+ * to build:
+ *     make x.o
+ *     gcc -g -o x x.o xmalloc.o lib/malloc/libmalloc.a
+ */
+
+/* Copyright (C) 2002-2003 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#define USING_BASH_MALLOC
+#define HAVE_STRINGIZE
+
+#include "xmalloc.h"
+
+int interrupt_immediately = 0;
+
+static char    xp[64];
+
+main(int c, char **v)
+{
+       char    *p;
+
+       malloc_set_register(1);
+
+#if 0
+       free (xp);      /* free unallocated memory */
+#endif
+
+#if 0
+       p = xrealloc(xp, 128);
+#endif
+
+#if 0
+       /*
+        * request an amount so that the bucket changes when the malloc
+        * overhead is added to the requested size.  This had better
+        * succeed.
+        */
+       p = xmalloc(25);
+       p[0] = 'a';
+       p[1] = '\0';
+       free(p);        /* sanity check on underflow checks in free() */
+#endif
+
+#if 0
+       p = xmalloc(28);
+       /* This works for little-endian machines like i386. */
+       p[-4] = '\7';   /* underflow */
+       p = xrealloc(p, 128);   /* realloc corrupted memory */
+#endif
+
+#if 0
+       p = xmalloc(28);
+       /* This works for little-endian machines like i386. */
+       p[-4] = '\7';   /* underflow */
+       free(p);
+#endif
+
+#if 0
+       p = xmalloc(2);
+       free(p);
+       free(p);        /* duplicate free */
+#endif
+
+#if 0
+       p = xmalloc(32);
+       free(p);
+       p = xrealloc(p, 128);   /* realloc freed mem */
+#endif
+
+#if 0
+       p = xmalloc(64);
+       p[64] = '\0';
+       p = xrealloc(p, 128);   /* overflow */
+#endif
+
+#if 0
+       p = xmalloc(64);
+       p[64] = '\0';
+       free(p);                /* overflow */
+#endif
+
+#if 0
+       p = xmalloc(64);
+       p[-1] = 'a';
+       free (p);               /* underflow */
+#endif
+
+#if 0
+       p = xmalloc(64);
+       p[-1] = 'a';
+       p = xrealloc(p, 129);   /* underflow */
+#endif
+
+       mregister_dump_table();
+       exit(0);
+}
+
+void
+fatal_error(const char *format, ...)
+{
+       va_list args;
+
+       fprintf(stderr, "malloc-test: ");
+       va_start(args, format);
+       vfprintf(stderr, format, args);
+       fprintf(stderr, "\n");
+       va_end(args);
+       exit(2);
+}
+
+void
+programming_error(const char *format, ...)
+{
+       va_list args;
+
+       fprintf(stderr, "malloc-test: ");
+       va_start(args, format);
+       vfprintf(stderr, format, args);
+       fprintf(stderr, "\n");
+       va_end(args);
+
+       abort();
+}
+
+int
+signal_is_trapped(int n)
+{
+       return 0;
+}
index d237635..3153744 100644 (file)
@@ -1,6 +1,6 @@
 /* mstats.h - definitions for malloc statistics */
 
-/*  Copyright (C) 2001 Free Software Foundation, Inc.
+/*  Copyright (C) 2001-2003 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
index 85cb5ce..812bb41 100644 (file)
@@ -1,6 +1,6 @@
 /* Functions (currently) for use by the shell to do malloc debugging and
    tracking. */
-/* Copyright (C) 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2003 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
@@ -53,6 +53,7 @@ extern PTR_T sh_valloc __P((size_t, const char *, int));
 /* trace.c */
 extern int malloc_set_trace __P((int));
 extern void malloc_set_tracefp ();     /* full prototype requires stdio.h */
+extern void malloc_set_tracefn __P((char *, char *));
 
 /* table.c */
 extern void mregister_dump_table __P((void));
index 52b23ae..18c3cef 100644 (file)
@@ -1,6 +1,6 @@
 /* stats.c - malloc statistics */
 
-/*  Copyright (C) 2001 Free Software Foundation, Inc.
+/*  Copyright (C) 2001-2003 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
@@ -35,6 +35,8 @@ extern int malloc_free_blocks __P((int));
 
 extern struct _malstats _mstats;
 
+extern FILE *_imalloc_fopen __P((char *, char *, char *, char *, size_t));
+
 struct bucket_stats
 malloc_bucket_stats (size)
      int size;
@@ -129,14 +131,37 @@ fprint_malloc_stats (s, fp)
   _print_malloc_stats (s, fp);
 }
 
-#define TRACEROOT "/var/tmp/maltrace/trace."
-static char mallbuf[1024];
+#define TRACEROOT "/var/tmp/maltrace/stats."
 
 void
 trace_malloc_stats (s, fn)
      char *s, *fn;
 {
+  FILE *fp;
   char defname[sizeof (TRACEROOT) + 64];
+  static char mallbuf[1024];
+
+  fp = _imalloc_fopen (s, fn, TRACEROOT, defname, sizeof (defname));
+  if (fp)
+    {
+      setvbuf (fp, mallbuf, _IOFBF, sizeof (mallbuf));
+      _print_malloc_stats (s, fp);
+      fflush(fp);
+      fclose(fp);
+    }
+}
+
+#endif /* MALLOC_STATS */
+
+#if defined (MALLOC_STATS) || defined (MALLOC_TRACE)
+FILE *
+_imalloc_fopen (s, fn, def, defbuf, defsiz)
+     char *s;
+     char *fn;
+     char *def;
+     char *defbuf;
+     size_t defsiz;
+{
   char fname[1024];
   long l;
   FILE *fp;
@@ -144,8 +169,8 @@ trace_malloc_stats (s, fn)
   l = (long)getpid ();
   if (fn == 0)
     {
-      sprintf (defname, "%s%ld", TRACEROOT, l);  
-      fp = fopen(defname, "w");
+      sprintf (defbuf, "%s%ld", def, l);
+      fp = fopen(defbuf, "w");
     }
   else
     {
@@ -171,14 +196,7 @@ trace_malloc_stats (s, fn)
       *p = '\0';
       fp = fopen (fname, "w");
     }
-        
-  if (fp)
-    {
-      setvbuf (fp, mallbuf, _IOFBF, sizeof (mallbuf));
-      _print_malloc_stats (s, fp);
-      fflush(fp);
-      fclose(fp);
-    }
-}
 
-#endif /* MALLOC_STATS */
+  return fp;
+}
+#endif /* MALLOC_STATS || MALLOC_TRACE */
index 94693d8..770e3f9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993-2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
index 051b573..ee37b3a 100644 (file)
@@ -1,6 +1,6 @@
 /* table.c - bookkeeping functions for allocated memory */
 
-/* Copyright (C) 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -172,14 +172,14 @@ mregister_alloc (tag, mem, size, file, line)
   if (tentry == 0)
     {
       /* oops.  table is full.  punt. */
-      fprintf (stderr, "register_alloc: alloc table is full with FIND_ALLOC?\n");
+      fprintf (stderr, _("register_alloc: alloc table is full with FIND_ALLOC?\n"));
       return;
     }
   
   if (tentry->flags & MT_ALLOC)
     {
       /* oops.  bad bookkeeping. ignore for now */
-      fprintf (stderr, "register_alloc: %p already in table as allocated?\n", mem);
+      fprintf (stderr, _("register_alloc: %p already in table as allocated?\n"), mem);
     }
 
   tentry->mem = mem;
@@ -215,7 +215,7 @@ mregister_free (mem, size, file, line)
   if (tentry->flags & MT_FREE)
     {
       /* oops.  bad bookkeeping. ignore for now */
-      fprintf (stderr, "register_free: %p already in table as free?\n", mem);
+      fprintf (stderr, _("register_free: %p already in table as free?\n"), mem);
     }
        
   tentry->flags = MT_FREE;
index 9b2cddd..0d22376 100644 (file)
@@ -1,6 +1,6 @@
 /* table.h - definitions for tables for keeping track of allocated memory */
 
-/*  Copyright (C) 2001 Free Software Foundation, Inc.
+/*  Copyright (C) 2001-2003 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
index ddd62f0..9dc34df 100644 (file)
@@ -1,6 +1,6 @@
 /* trace.c - tracing functions for malloc */
 
-/* Copyright (C) 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -29,6 +29,8 @@ extern int malloc_trace;
 
 static int _mtrace_verbose = 0;
 
+extern FILE *_imalloc_fopen __P((char *, char *, char *, char *, size_t));
+
 #ifdef MALLOC_TRACE
 
 FILE *_mtrace_fp = NULL;
@@ -101,3 +103,20 @@ malloc_trace_bin (n)
   _malloc_trace_buckets[n] = 1;
 #endif
 }
+
+#define TRACEROOT "/var/tmp/maltrace/trace."
+
+void
+malloc_set_tracefn (s, fn)
+     char *s;
+     char *fn;
+{
+#ifdef MALLOC_TRACE
+  FILE *fp;
+  char defname[sizeof (TRACEROOT) + 64];
+
+  fp = _imalloc_fopen (s, fn, TRACEROOT, defname, sizeof (defname));
+  if (fp)
+    malloc_set_tracefp (fp);
+#endif
+}
index 6594a3f..11ab744 100644 (file)
@@ -1,6 +1,6 @@
 /* watch.c - watchpoint functions for malloc */
 
-/* Copyright (C) 2001 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Bash, the Bourne Again SHell.
 
@@ -43,17 +43,17 @@ watch_warn (addr, file, line, type, data)
   char *tag;
 
   if (type == W_ALLOC)
-    tag = "allocated";
+    tag = _("allocated");
   else if (type == W_FREE)
-    tag = "freed";
+    tag = _("freed");
   else if (type == W_REALLOC)
-    tag = "requesting resize";
+    tag = _("requesting resize");
   else if (type == W_RESIZED)
-    tag = "just resized";
+    tag = _("just resized");
   else
-    tag = "bug: unknown operation";
+    tag = _("bug: unknown operation");
 
-  fprintf (stderr, "malloc: watch alert: %p %s ", addr, tag);
+  fprintf (stderr, _("malloc: watch alert: %p %s "), addr, tag);
   if (data != (unsigned long)-1)
     fprintf (stderr, "(size %lu) ", data);
   fprintf (stderr, "from '%s:%d'\n", file ? file : "unknown", line);
index d66d80e..757bbd2 100644 (file)
@@ -1,6 +1,6 @@
 /* watch.h - definitions for tables for keeping track of allocated memory */
 
-/*  Copyright (C) 2001 Free Software Foundation, Inc.
+/*  Copyright (C) 2001-2003 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
index b037222..ab7c91a 100644 (file)
@@ -1,6 +1,6 @@
 /* xmalloc.c -- safe versions of malloc and realloc */
 
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2003 Free Software Foundation, Inc.
 
    This file is part of GNU Readline, a library for reading lines
    of text with interactive input and history editing.
diff --git a/lib/posixheaders.old/ansi_stdlib.h b/lib/posixheaders.old/ansi_stdlib.h
new file mode 100644 (file)
index 0000000..52339da
--- /dev/null
@@ -0,0 +1,41 @@
+/* ansi_stdlib.h -- An ANSI Standard stdlib.h. */
+/* A minimal stdlib.h containing extern declarations for those functions
+   that bash uses. */
+
+/* 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 (_STDLIB_H_)
+#define        _STDLIB_H_ 1
+
+/* String conversion functions. */
+extern int atoi ();
+extern long int atol ();
+
+/* Memory allocation functions. */
+extern char *malloc ();
+extern char *realloc ();
+extern void free ();
+
+/* Other miscellaneous functions. */
+extern void abort ();
+extern void exit ();
+extern char *getenv ();
+extern void qsort ();
+
+#endif /* _STDLIB_H  */
diff --git a/lib/posixheaders.old/filecntl.h b/lib/posixheaders.old/filecntl.h
new file mode 100644 (file)
index 0000000..cf5054d
--- /dev/null
@@ -0,0 +1,45 @@
+/* filecntl.h - Definitions to set file descriptors to close-on-exec. */
+
+/* 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 (_FILECNTL_H_)
+#define _FILECNTL_H_
+
+#include <fcntl.h>
+
+/* Definitions to set file descriptors to close-on-exec, the Posix way. */
+#if !defined (FD_CLOEXEC)
+#define FD_CLOEXEC     1
+#endif
+
+#define FD_NCLOEXEC    0
+
+#define SET_CLOSE_ON_EXEC(fd)  (fcntl ((fd), F_SETFD, FD_CLOEXEC))
+#define SET_OPEN_ON_EXEC(fd)   (fcntl ((fd), F_SETFD, FD_NCLOEXEC))
+
+/* How to open a file in non-blocking mode, the Posix.1 way. */
+#if !defined (O_NONBLOCK)
+#  if defined (O_NDELAY)
+#    define O_NONBLOCK O_NDELAY
+#  else
+#    define O_NONBLOCK 0
+#  endif
+#endif
+
+#endif /* ! _FILECNTL_H_ */
diff --git a/lib/posixheaders.old/memalloc.h b/lib/posixheaders.old/memalloc.h
new file mode 100644 (file)
index 0000000..c68961f
--- /dev/null
@@ -0,0 +1,58 @@
+/* memalloc.h -- consolidate code for including alloca.h or malloc.h and
+   defining alloca. */
+
+/* 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 (_MEMALLOC_H_)
+#  define _MEMALLOC_H_
+
+#if defined (sparc) && defined (sun) && !defined (HAVE_ALLOCA_H)
+#  define HAVE_ALLOCA_H
+#endif
+
+#if defined (__GNUC__) && !defined (HAVE_ALLOCA)
+#  define HAVE_ALLOCA
+#endif
+
+#if defined (HAVE_ALLOCA_H) && !defined (HAVE_ALLOCA)
+#  define HAVE_ALLOCA
+#endif /* HAVE_ALLOCA_H && !HAVE_ALLOCA */
+
+#if defined (__GNUC__) && !defined (C_ALLOCA)
+#  undef alloca
+#  define alloca __builtin_alloca
+#else /* !__GNUC__ || C_ALLOCA */
+#  if defined (HAVE_ALLOCA_H) && !defined (C_ALLOCA)
+#    if defined (IBMESA)
+#      include <malloc.h>
+#    else /* !IBMESA */
+#      include <alloca.h>
+#    endif /* !IBMESA */
+#  else  /* !HAVE_ALLOCA_H || C_ALLOCA */
+#    if defined (__hpux) && defined (__STDC__) && !defined (alloca)
+extern void *alloca ();
+#    else
+#      if !defined (alloca)
+extern char *alloca ();
+#      endif /* !alloca */
+#    endif /* !__hpux || !__STDC__ && !alloca */
+#  endif /* !HAVE_ALLOCA_H || C_ALLOCA */
+#endif /* !__GNUC__ || C_ALLOCA */
+
+#endif /* _MEMALLOC_H_ */
diff --git a/lib/posixheaders.old/posixdir.h b/lib/posixheaders.old/posixdir.h
new file mode 100644 (file)
index 0000000..7480a93
--- /dev/null
@@ -0,0 +1,49 @@
+/* posixdir.h -- Posix directory reading includes and defines. */
+
+/* Copyright (C) 1987,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. */
+
+/* This file should be included instead of <dirent.h> or <sys/dir.h>. */
+
+#if !defined (_POSIXDIR_H_)
+#define _POSIXDIR_H_
+
+#if defined (HAVE_DIRENT_H)
+#  include <dirent.h>
+#  define D_NAMLEN(d)   (strlen ((d)->d_name))
+#else
+#  if defined (HAVE_SYS_NDIR_H)
+#    include <sys/ndir.h>
+#  endif
+#  if defined (HAVE_SYS_DIR_H)
+#    include <sys/dir.h>
+#  endif
+#  if defined (HAVE_NDIR_H)
+#    include <ndir.h>
+#  endif
+#  if !defined (dirent)
+#    define dirent direct
+#  endif /* !dirent */
+#  define D_NAMLEN(d)   ((d)->d_namlen)
+#endif /* !HAVE_DIRENT_H */
+
+#if defined (STRUCT_DIRENT_HAS_D_INO) && !defined (STRUCT_DIRENT_HAS_D_FILENO)
+#  define d_fileno d_ino
+#endif
+
+#endif /* !_POSIXDIR_H_ */
diff --git a/lib/posixheaders.old/posixjmp.h b/lib/posixheaders.old/posixjmp.h
new file mode 100644 (file)
index 0000000..1347cc0
--- /dev/null
@@ -0,0 +1,22 @@
+/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */
+
+#ifndef _POSIXJMP_H_
+#define _POSIXJMP_H_
+
+#include <setjmp.h>
+
+/* This *must* be included *after* config.h */
+
+#if defined (HAVE_POSIX_SIGSETJMP)
+#  define procenv_t    sigjmp_buf
+#  if !defined (__OPENNT)
+#    undef setjmp
+#    define setjmp(x)  sigsetjmp((x), 1)
+#    undef longjmp
+#    define longjmp(x, n)      siglongjmp((x), (n))
+#  endif /* !__OPENNT */
+#else
+#  define procenv_t    jmp_buf
+#endif
+
+#endif /* _POSIXJMP_H_ */
diff --git a/lib/posixheaders.old/posixstat.h b/lib/posixheaders.old/posixstat.h
new file mode 100644 (file)
index 0000000..bfce8c0
--- /dev/null
@@ -0,0 +1,142 @@
+/* posixstat.h -- Posix stat(2) definitions for systems that
+   don't have them. */
+
+/* Copyright (C) 1987,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. */
+
+/* This file should be included instead of <sys/stat.h>.
+   It relies on the local sys/stat.h to work though. */
+#if !defined (_POSIXSTAT_H_)
+#define _POSIXSTAT_H_
+
+#include <sys/stat.h>
+
+#if defined (STAT_MACROS_BROKEN)
+#  undef S_ISBLK
+#  undef S_ISCHR
+#  undef S_ISDIR
+#  undef S_ISFIFO
+#  undef S_ISREG
+#  undef S_ISLNK
+#endif /* STAT_MACROS_BROKEN */
+
+/* These are guaranteed to work only on isc386 */
+#if !defined (S_IFDIR) && !defined (S_ISDIR)
+#  define S_IFDIR 0040000
+#endif /* !S_IFDIR && !S_ISDIR */
+#if !defined (S_IFMT)
+#  define S_IFMT  0170000
+#endif /* !S_IFMT */
+
+/* Posix 1003.1 5.6.1.1 <sys/stat.h> file types */
+
+/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but
+   do not provide the S_IS* macros that Posix requires. */
+
+#if defined (_S_IFMT) && !defined (S_IFMT)
+#define S_IFMT _S_IFMT
+#endif
+#if defined (_S_IFIFO) && !defined (S_IFIFO)
+#define S_IFIFO _S_IFIFO
+#endif
+#if defined (_S_IFCHR) && !defined (S_IFCHR)
+#define S_IFCHR _S_IFCHR
+#endif
+#if defined (_S_IFDIR) && !defined (S_IFDIR)
+#define S_IFDIR _S_IFDIR
+#endif
+#if defined (_S_IFBLK) && !defined (S_IFBLK)
+#define S_IFBLK _S_IFBLK
+#endif
+#if defined (_S_IFREG) && !defined (S_IFREG)
+#define S_IFREG _S_IFREG
+#endif
+#if defined (_S_IFLNK) && !defined (S_IFLNK)
+#define S_IFLNK _S_IFLNK
+#endif
+#if defined (_S_IFSOCK) && !defined (S_IFSOCK)
+#define S_IFSOCK _S_IFSOCK
+#endif
+
+/* Test for each symbol individually and define the ones necessary (some
+   systems claiming Posix compatibility define some but not all). */
+
+#if defined (S_IFBLK) && !defined (S_ISBLK)
+#define        S_ISBLK(m)      (((m)&S_IFMT) == S_IFBLK)       /* block device */
+#endif
+
+#if defined (S_IFCHR) && !defined (S_ISCHR)
+#define        S_ISCHR(m)      (((m)&S_IFMT) == S_IFCHR)       /* character device */
+#endif
+
+#if defined (S_IFDIR) && !defined (S_ISDIR)
+#define        S_ISDIR(m)      (((m)&S_IFMT) == S_IFDIR)       /* directory */
+#endif
+
+#if defined (S_IFREG) && !defined (S_ISREG)
+#define        S_ISREG(m)      (((m)&S_IFMT) == S_IFREG)       /* file */
+#endif
+
+#if defined (S_IFIFO) && !defined (S_ISFIFO)
+#define        S_ISFIFO(m)     (((m)&S_IFMT) == S_IFIFO)       /* fifo - named pipe */
+#endif
+
+#if defined (S_IFLNK) && !defined (S_ISLNK)
+#define        S_ISLNK(m)      (((m)&S_IFMT) == S_IFLNK)       /* symbolic link */
+#endif
+
+#if defined (S_IFSOCK) && !defined (S_ISSOCK)
+#define        S_ISSOCK(m)     (((m)&S_IFMT) == S_IFSOCK)      /* socket */
+#endif
+
+/*
+ * POSIX 1003.1 5.6.1.2 <sys/stat.h> File Modes
+ */
+
+#if !defined (S_IRWXU)
+#  if !defined (S_IREAD)
+#    define S_IREAD    00400
+#    define S_IWRITE   00200
+#    define S_IEXEC    00100
+#  endif /* S_IREAD */
+
+#  if !defined (S_IRUSR)
+#    define S_IRUSR    S_IREAD                 /* read, owner */
+#    define S_IWUSR    S_IWRITE                /* write, owner */
+#    define S_IXUSR    S_IEXEC                 /* execute, owner */
+
+#    define S_IRGRP    (S_IREAD  >> 3)         /* read, group */
+#    define S_IWGRP    (S_IWRITE >> 3)         /* write, group */
+#    define S_IXGRP    (S_IEXEC  >> 3)         /* execute, group */
+
+#    define S_IROTH    (S_IREAD  >> 6)         /* read, other */
+#    define S_IWOTH    (S_IWRITE >> 6)         /* write, other */
+#    define S_IXOTH    (S_IEXEC  >> 6)         /* execute, other */
+#  endif /* !S_IRUSR */
+
+#  define S_IRWXU      (S_IRUSR | S_IWUSR | S_IXUSR)
+#  define S_IRWXG      (S_IRGRP | S_IWGRP | S_IXGRP)
+#  define S_IRWXO      (S_IROTH | S_IWOTH | S_IXOTH)
+#endif /* !S_IRWXU */
+
+/* These are non-standard, but are used in builtins.c$symbolic_umask() */
+#define S_IRUGO                (S_IRUSR | S_IRGRP | S_IROTH)
+#define S_IWUGO                (S_IWUSR | S_IWGRP | S_IWOTH)
+#define S_IXUGO                (S_IXUSR | S_IXGRP | S_IXOTH)
+
+#endif /* _POSIXSTAT_H_ */
diff --git a/lib/posixheaders.old/stdc.h b/lib/posixheaders.old/stdc.h
new file mode 100644 (file)
index 0000000..f1590c6
--- /dev/null
@@ -0,0 +1,79 @@
+/* stdc.h -- macros to make source compile on both ANSI C and K&R C
+   compilers. */
+
+/* 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 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. */
+
+#if !defined (_STDC_H_)
+#define _STDC_H_
+
+/* Adapted from BSD /usr/include/sys/cdefs.h. */
+
+/* A function can be defined using prototypes and compile on both ANSI C
+   and traditional C compilers with something like this:
+       extern char *func __P((char *, char *, int)); */
+
+#if defined (__STDC__)
+
+#  if !defined (__P)
+#    define __P(protos) protos
+#  endif
+#  define __STRING(x) #x
+
+#  if !defined (__GNUC__)
+#    define inline
+#  endif
+
+#else /* !__STDC__ */
+
+#  if !defined (__P)
+#    define __P(protos) ()
+#  endif
+#  define __STRING(x) "x"
+
+#if defined (__GNUC__)         /* gcc with -traditional */
+#  if !defined (const)
+#    define const  __const
+#  endif
+#  if !defined (inline)
+#    define inline __inline
+#  endif
+#  if !defined (signed)
+#    define signed __signed
+#  endif
+#  if !defined (volatile)
+#    define volatile __volatile
+#  endif
+#else /* !__GNUC__ */
+#  if !defined (const)
+#    define const
+#  endif
+#  if !defined (inline)
+#    define inline
+#  endif
+#  if !defined (signed)
+#    define signed
+#  endif
+#  if !defined (volatile)
+#    define volatile
+#  endif
+#endif /* !__GNUC__ */
+
+#endif /* !__STDC__ */
+
+#endif /* !_STDC_H_ */
diff --git a/lib/readline/-i b/lib/readline/-i
new file mode 100644 (file)
index 0000000..e69de29
index ce91f46..a118304 100644 (file)
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
 
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
 srcdir = @srcdir@
 VPATH = .:@srcdir@
 topdir = @top_srcdir@
diff --git a/lib/readline/NEW/xxx-autocomplete b/lib/readline/NEW/xxx-autocomplete
new file mode 100644 (file)
index 0000000..fdc2ad0
--- /dev/null
@@ -0,0 +1,39 @@
+#if defined (READLINE_AUTOCOMPLETE)
+/* Return the list of completions for the text between START and END.
+   FOUND_QUOTE is non-zero if we're completing a quoted word; if so,
+   QUOTE_CHAR is the delimiter.  If NONTRIVIAL_P is nonzero, it gets
+   set to a flag saying whether or not the completion added anything
+   to the word.  Not part of rl_complete_internal because it's too
+   hard to separate functions without postprocess_matches possibly being
+   called twice; here to support the autocompletion code. */
+char **
+_rl_generate_completions (start, end, found_quote, quote_char, nontrivial_p)
+     int start, end, found_quote, quote_char, *nontrivial_p;
+{
+  rl_compentry_func_t *our_func;
+  char *text;
+  char **matches;
+
+  our_func = rl_completion_entry_function
+               ? rl_completion_entry_function
+               : rl_filename_completion_function;
+  text = rl_copy_text (start, end);
+  matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
+
+  /* *nontrivial_p is set if the common prefix adds something to the word
+     being completed. */
+  if (nontrivial_p)
+    *nontrivial_p = matches && strcmp (text, matches[0]) != 0;
+
+  free (text);
+
+  /* Postprocess the matches */
+  if (matches == 0)
+    return (char **)0;
+
+  if (postprocess_matches (&matches, rl_filename_completion_desired) == 0)
+    return (char **)0;
+
+  return 0;
+}
+#endif
deleted file mode 100644 (file)
index db13cd234bdf216accbe666718f5e63dab4001cc..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* ansi_stdlib.h -- An ANSI Standard stdlib.h. */
-/* A minimal stdlib.h containing extern declarations for those functions
-   that bash uses. */
-
-/* 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
-
-#if !defined (_STDLIB_H_)
-#define        _STDLIB_H_ 1
-
-/* String conversion functions. */
-extern int atoi ();
-
-extern double atof ();
-extern double strtod ();
-
-/* Memory allocation functions. */
-/* Generic pointer type. */
-#ifndef PTR_T
-
-#if defined (__STDC__)
-#  define PTR_T        void *
-#else
-#  define PTR_T char *
-#endif
-
-#endif /* PTR_T */
-
-extern PTR_T malloc ();
-extern PTR_T realloc ();
-extern void free ();
-
-/* Other miscellaneous functions. */
-extern void abort ();
-extern void exit ();
-extern char *getenv ();
-extern void qsort ();
-
-#endif /* _STDLIB_H  */
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..0bfba502e97d9f3f73c577192867bb42f4023c26
--- /dev/null
@@ -0,0 +1 @@
+../../include/ansi_stdlib.h
\ No newline at end of file
index d72d246..c14b757 100644 (file)
@@ -288,6 +288,19 @@ int rl_completion_suppress_append = 0;
    default is a space. */
 int rl_completion_append_character = ' ';
 
+/* If non-zero, the completion functions don't append any closing quote.
+   This is set to 0 by rl_complete_internal and may be changed by an
+   application-specific completion function. */
+int rl_completion_suppress_quote = 0;
+
+/* Set to any quote character readline thinks it finds before any application
+   completion function is called. */
+int rl_completion_quote_character;
+
+/* Set to a non-zero value if readline found quoting anywhere in the word to
+   be completed; set before any application completion function is called. */
+int rl_completion_found_quote;
+
 /* If non-zero, a slash will be appended to completed filenames that are
    symbolic links to directory names, subject to the value of the
    mark-directories variable (which is user-settable).  This exists so
@@ -382,7 +395,7 @@ set_completion_defaults (what_to_do)
   rl_filename_completion_desired = 0;
   rl_filename_quoting_desired = 1;
   rl_completion_type = what_to_do;
-  rl_completion_suppress_append = 0;
+  rl_completion_suppress_append = rl_completion_suppress_quote = 0;
 
   /* The completion entry function may optionally change this. */
   rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs;
@@ -891,6 +904,9 @@ gen_completion_matches (text, start, end, our_func, found_quote, quote_char)
 {
   char **matches, *temp;
 
+  rl_completion_found_quote = found_quote;
+  rl_completion_quote_character = quote_char;
+
   /* If the user wants to TRY to complete, but then wants to give
      up and use the default completion function, they set the
      variable rl_attempted_completion_function. */
@@ -1443,7 +1459,8 @@ append_to_match (text, delimiter, quote_char, nontrivial_match)
   struct stat finfo;
 
   temp_string_index = 0;
-  if (quote_char && rl_point && rl_line_buffer[rl_point - 1] != quote_char)
+  if (quote_char && rl_point && rl_completion_suppress_quote == 0 &&
+      rl_line_buffer[rl_point - 1] != quote_char)
     temp_string[temp_string_index++] = quote_char;
 
   if (delimiter)
@@ -1575,7 +1592,6 @@ rl_complete_internal (what_to_do)
   our_func = rl_completion_entry_function
                ? rl_completion_entry_function
                : rl_filename_completion_function;
-
   /* We now look backwards for the start of a filename/variable word. */
   end = rl_point;
   found_quote = delimiter = 0;
index c1cd954..0052e41 100644 (file)
@@ -867,7 +867,7 @@ rl_redisplay ()
 #endif
              _rl_output_some_chars (local_prompt, nleft);
              if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
-               _rl_last_c_pos = _rl_col_width(local_prompt, 0, nleft);
+               _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft);
              else
                _rl_last_c_pos = nleft;
            }
@@ -1126,25 +1126,36 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
 #if defined (HANDLE_MULTIBYTE)
   if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
     {
-      memset (&ps_new, 0, sizeof(mbstate_t));
-      memset (&ps_old, 0, sizeof(mbstate_t));
-
-      if (omax == nmax && STREQN (new, old, omax))
+      /* See if the old line is a subset of the new line, so that the
+        only change is adding characters. */
+      temp = (omax < nmax) ? omax : nmax;
+      if (memcmp (old, new, temp) == 0)
        {
-         ofd = old + omax;
-         nfd = new + nmax;
+         ofd = old + temp;
+         nfd = new + temp;
        }
       else
-       {
-         new_offset = old_offset = 0;
-         for (ofd = old, nfd = new;
-              (ofd - old < omax) && *ofd &&
-               _rl_compare_chars(old, old_offset, &ps_old, new, new_offset, &ps_new); )
+       {      
+         memset (&ps_new, 0, sizeof(mbstate_t));
+         memset (&ps_old, 0, sizeof(mbstate_t));
+
+         if (omax == nmax && STREQN (new, old, omax))
            {
-             old_offset = _rl_find_next_mbchar (old, old_offset, 1, MB_FIND_ANY);
-             new_offset = _rl_find_next_mbchar (new, new_offset, 1, MB_FIND_ANY);
-             ofd = old + old_offset;
-             nfd = new + new_offset;
+             ofd = old + omax;
+             nfd = new + nmax;
+           }
+         else
+           {
+             new_offset = old_offset = 0;
+             for (ofd = old, nfd = new;
+                   (ofd - old < omax) && *ofd &&
+                   _rl_compare_chars(old, old_offset, &ps_old, new, new_offset, &ps_new); )
+               {
+                 old_offset = _rl_find_next_mbchar (old, old_offset, 1, MB_FIND_ANY);
+                 new_offset = _rl_find_next_mbchar (new, new_offset, 1, MB_FIND_ANY);
+                 ofd = old + old_offset;
+                 nfd = new + new_offset;
+               }
            }
        }
     }
@@ -1358,7 +1369,11 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
          if ((temp - lendiff) > 0)
            {
              _rl_output_some_chars (nfd + lendiff, temp - lendiff);
-#if 0
+#if 1
+            /* XXX -- this bears closer inspection.  Fixes a redisplay bug
+               reported against bash-3.0-alpha by Andreas Schwab involving
+               multibyte characters and prompt strings with invisible
+               characters, but was previously disabled. */
              _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-col_lendiff);
 #else
              _rl_last_c_pos += _rl_col_width (nfd+lendiff, 0, temp-lendiff);
@@ -2166,7 +2181,7 @@ _rl_col_width (str, start, end)
          memset (&ps, 0, sizeof (mbstate_t));
        }
       else if (MB_NULLWCH (tmp))
-        break;         /* Found '\0' */
+       break;          /* Found '\0' */
       else
        {
          point += tmp;
@@ -2198,7 +2213,7 @@ _rl_col_width (str, start, end)
          memset (&ps, 0, sizeof (mbstate_t));
        }
       else if (MB_NULLWCH (tmp))
-        break;                 /* Found '\0' */
+       break;                  /* Found '\0' */
       else
        {
          point += tmp;
diff --git a/lib/readline/doc/Makefile.in b/lib/readline/doc/Makefile.in
new file mode 100644 (file)
index 0000000..68b7278
--- /dev/null
@@ -0,0 +1,144 @@
+# Derived by hand from the generated readline-src/doc/Makefile
+# This makefile for Readline library documentation is in -*- text -*- mode.
+# Emacs likes it that way.
+
+# Copyright (C) 1996-2002 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.
+
+topdir = .
+srcdir = .
+VPATH = .
+
+prefix = /usr/local
+infodir = ${prefix}/info
+
+mandir = ${prefix}/man
+manpfx = man
+
+man1ext = 1
+man1dir = $(mandir)/$(manpfx)$(man1ext)
+man3ext = 3
+man3dir = $(mandir)/$(manpfx)$(man3ext)
+
+SHELL = /bin/sh
+RM = rm -f
+
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+
+BUILD_DIR = .
+TEXINPUTDIR = $(srcdir)
+
+MAKEINFO    = LANGUAGE= makeinfo
+TEXI2DVI    = $(srcdir)/texi2dvi
+TEXI2HTML   = $(srcdir)/texi2html
+QUIETPS     = #set this to -q to shut up dvips
+PSDPI       = 600
+DVIPS       = dvips -D ${PSDPI} $(QUIETPS) -o $@     # tricky
+
+RLSRC = $(srcdir)/rlman.texi $(srcdir)/rluser.texi \
+       $(srcdir)/rltech.texi $(srcdir)/version.texi \
+       $(srcdir)/rluserman.texi
+HISTSRC = $(srcdir)/history.texi $(srcdir)/hsuser.texi \
+         $(srcdir)/hstech.texi $(srcdir)/version.texi
+
+# This should be a program that converts troff to an ascii-readable format
+NROFF       = groff -Tascii
+
+# This should be a program that converts troff to postscript
+GROFF       = groff
+
+DVIOBJ = readline.dvi history.dvi rluserman.dvi
+INFOOBJ = readline.info history.info rluserman.info
+PSOBJ = readline.ps history.ps rluserman.ps
+HTMLOBJ = readline.html history.html rluserman.html
+
+INTERMEDIATE_OBJ = rlman.dvi
+
+CREATED_DOCS = $(DVIOBJ) $(INFOOBJ) $(PSOBJ) $(HTMLOBJ)
+
+.SUFFIXES:      .ps .txt .dvi
+
+all: info dvi html ps 
+nodvi: info html
+
+readline.dvi: $(RLSRC)
+       TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rlman.texi
+       mv rlman.dvi readline.dvi
+
+readline.info: $(RLSRC)
+       $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rlman.texi
+
+rluserman.dvi: $(RLSRC)
+       TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/rluserman.texi
+
+rluserman.info: $(RLSRC)
+       $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/rluserman.texi
+
+history.dvi: ${HISTSRC}
+       TEXINPUTS=.:$(TEXINPUTDIR):$$TEXINPUTS $(TEXI2DVI) $(srcdir)/history.texi
+
+history.info: ${HISTSRC}
+       $(MAKEINFO) --no-split -I $(TEXINPUTDIR) -o $@ $(srcdir)/history.texi
+
+readline.ps:   readline.dvi
+       $(RM) $@
+       $(DVIPS) readline.dvi
+
+rluserman.ps:  rluserman.dvi
+       $(RM) $@
+       $(DVIPS) rluserman.dvi
+
+history.ps:    history.dvi
+       $(RM) $@
+       $(DVIPS) history.dvi
+
+readline.html: ${RLSRC}
+       $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/rlman.texi
+       sed -e 's:rlman.html:readline.html:' rlman.html > readline.html
+       $(RM) rlman.html
+
+rluserman.html:        ${RLSRC}
+       $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/rluserman.texi
+
+history.html:  ${HISTSRC}
+       $(TEXI2HTML) -menu -monolithic -I $(TEXINPUTDIR) $(srcdir)/history.texi
+
+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 *.bt *.bts *.o core *.core
+
+distclean: clean
+       $(RM) $(CREATED_DOCS)
+       $(RM) $(INTERMEDIATE_OBJ)
+       $(RM) Makefile
+
+mostlyclean: clean
+
+maintainer-clean: clean
+       $(RM) $(CREATED_DOCS)
+       $(RM) $(INTERMEDIATE_OBJ)
+       $(RM) Makefile
+
+install:
+       @echo "This documentation should not be installed."
+
+uninstall:
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
deleted file mode 100644 (file)
index 47ead9f095e0c01590b11adaa8b647c7a3415adb..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,452 +0,0 @@
-
-@node GNU Free Documentation License
-@appendixsec GNU Free Documentation License
-
-@cindex FDL, GNU Free Documentation License
-@center Version 1.2, November 2002
-
-@display
-Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-@end display
-
-@enumerate 0
-@item
-PREAMBLE
-
-The purpose of this License is to make a manual, textbook, or other
-functional and useful document @dfn{free} in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-
-This License is a kind of ``copyleft'', which means that derivative
-works of the document must themselves be free in the same sense.  It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-
-We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does.  But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book.  We recommend this License
-principally for works whose purpose is instruction or reference.
-
-@item
-APPLICABILITY AND DEFINITIONS
-
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License.  Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein.  The ``Document'', below,
-refers to any such manual or work.  Any member of the public is a
-licensee, and is addressed as ``you''.  You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-
-A ``Modified Version'' of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-
-A ``Secondary Section'' is a named appendix or a front-matter section
-of the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document's overall
-subject (or to related matters) and contains nothing that could fall
-directly within that overall subject.  (Thus, if the Document is in
-part a textbook of mathematics, a Secondary Section may not explain
-any mathematics.)  The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-
-The ``Invariant Sections'' are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License.  If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant.  The Document may contain zero
-Invariant Sections.  If the Document does not identify any Invariant
-Sections then there are none.
-
-The ``Cover Texts'' are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License.  A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-
-A ``Transparent'' copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters.  A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text.  A copy that is not ``Transparent'' is called ``Opaque''.
-
-Examples of suitable formats for Transparent copies include plain
-@sc{ascii} without markup, Texinfo input format, La@TeX{} input
-format, @acronym{SGML} or @acronym{XML} using a publicly available
-@acronym{DTD}, and standard-conforming simple @acronym{HTML},
-PostScript or @acronym{PDF} designed for human modification.  Examples
-of transparent image formats include @acronym{PNG}, @acronym{XCF} and
-@acronym{JPG}.  Opaque formats include proprietary formats that can be
-read and edited only by proprietary word processors, @acronym{SGML} or
-@acronym{XML} for which the @acronym{DTD} and/or processing tools are
-not generally available, and the machine-generated @acronym{HTML},
-PostScript or @acronym{PDF} produced by some word processors for
-output purposes only.
-
-The ``Title Page'' means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page.  For works in
-formats which do not have any title page as such, ``Title Page'' means
-the text near the most prominent appearance of the work's title,
-preceding the beginning of the body of the text.
-
-A section ``Entitled XYZ'' means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language.  (Here XYZ stands for a
-specific section name mentioned below, such as ``Acknowledgements'',
-``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
-of such a section when you modify the Document means that it remains a
-section ``Entitled XYZ'' according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document.  These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
-@item
-VERBATIM COPYING
-
-You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License.  You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute.  However, you may accept
-compensation in exchange for copies.  If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-
-You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-
-@item
-COPYING IN QUANTITY
-
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover.  Both covers must also clearly and legibly identify
-you as the publisher of these copies.  The front cover must present
-the full title with all words of the title equally prominent and
-visible.  You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-
-If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-
-If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-
-It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-
-@item
-MODIFICATIONS
-
-You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it.  In addition, you must do these things in the Modified Version:
-
-@enumerate A
-@item
-Use in the Title Page (and on the covers, if any) a title distinct
-from that of the Document, and from those of previous versions
-(which should, if there were any, be listed in the History section
-of the Document).  You may use the same title as a previous version
-if the original publisher of that version gives permission.
-
-@item
-List on the Title Page, as authors, one or more persons or entities
-responsible for authorship of the modifications in the Modified
-Version, together with at least five of the principal authors of the
-Document (all of its principal authors, if it has fewer than five),
-unless they release you from this requirement.
-
-@item
-State on the Title page the name of the publisher of the
-Modified Version, as the publisher.
-
-@item
-Preserve all the copyright notices of the Document.
-
-@item
-Add an appropriate copyright notice for your modifications
-adjacent to the other copyright notices.
-
-@item
-Include, immediately after the copyright notices, a license notice
-giving the public permission to use the Modified Version under the
-terms of this License, in the form shown in the Addendum below.
-
-@item
-Preserve in that license notice the full lists of Invariant Sections
-and required Cover Texts given in the Document's license notice.
-
-@item
-Include an unaltered copy of this License.
-
-@item
-Preserve the section Entitled ``History'', Preserve its Title, and add
-to it an item stating at least the title, year, new authors, and
-publisher of the Modified Version as given on the Title Page.  If
-there is no section Entitled ``History'' in the Document, create one
-stating the title, year, authors, and publisher of the Document as
-given on its Title Page, then add an item describing the Modified
-Version as stated in the previous sentence.
-
-@item
-Preserve the network location, if any, given in the Document for
-public access to a Transparent copy of the Document, and likewise
-the network locations given in the Document for previous versions
-it was based on.  These may be placed in the ``History'' section.
-You may omit a network location for a work that was published at
-least four years before the Document itself, or if the original
-publisher of the version it refers to gives permission.
-
-@item
-For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
-the Title of the section, and preserve in the section all the
-substance and tone of each of the contributor acknowledgements and/or
-dedications given therein.
-
-@item
-Preserve all the Invariant Sections of the Document,
-unaltered in their text and in their titles.  Section numbers
-or the equivalent are not considered part of the section titles.
-
-@item
-Delete any section Entitled ``Endorsements''.  Such a section
-may not be included in the Modified Version.
-
-@item
-Do not retitle any existing section to be Entitled ``Endorsements'' or
-to conflict in title with any Invariant Section.
-
-@item
-Preserve any Warranty Disclaimers.
-@end enumerate
-
-If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant.  To do this, add their titles to the
-list of Invariant Sections in the Modified Version's license notice.
-These titles must be distinct from any other section titles.
-
-You may add a section Entitled ``Endorsements'', provided it contains
-nothing but endorsements of your Modified Version by various
-parties---for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-
-You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version.  Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity.  If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-
-The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-
-@item
-COMBINING DOCUMENTS
-
-You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-
-The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy.  If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-
-In the combination, you must combine any sections Entitled ``History''
-in the various original documents, forming one section Entitled
-``History''; likewise combine any sections Entitled ``Acknowledgements'',
-and any sections Entitled ``Dedications''.  You must delete all
-sections Entitled ``Endorsements.''
-
-@item
-COLLECTIONS OF DOCUMENTS
-
-You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-
-You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-
-@item
-AGGREGATION WITH INDEPENDENT WORKS
-
-A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an ``aggregate'' if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-
-If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-
-@item
-TRANSLATION
-
-Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections.  You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers.  In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled ``Acknowledgements'',
-``Dedications'', or ``History'', the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-
-@item
-TERMINATION
-
-You may not copy, modify, sublicense, or distribute the Document except
-as expressly provided for under this License.  Any other attempt to
-copy, modify, sublicense or distribute the Document is void, and will
-automatically terminate your rights under this License.  However,
-parties who have received copies, or rights, from you under this
-License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-@item
-FUTURE REVISIONS OF THIS LICENSE
-
-The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation License from time to time.  Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns.  See
-@uref{http://www.gnu.org/copyleft/}.
-
-Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License ``or any later version'' applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation.  If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation.
-@end enumerate
-
-@page
-@appendixsubsec ADDENDUM: How to use this License for your documents
-
-To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-
-@smallexample
-@group
-  Copyright (C)  @var{year}  @var{your name}.
-  Permission is granted to copy, distribute and/or modify this document
-  under the terms of the GNU Free Documentation License, Version 1.2
-  or any later version published by the Free Software Foundation;
-  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
-  A copy of the license is included in the section entitled ``GNU
-  Free Documentation License''.
-@end group
-@end smallexample
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the ``with...Texts.'' line with this:
-
-@smallexample
-@group
-    with the Invariant Sections being @var{list their titles}, with
-    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
-    being @var{list}.
-@end group
-@end smallexample
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-
-If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
-
-@c Local Variables:
-@c ispell-local-pdict: "ispell-dict"
-@c End:
-
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..68e5eb548f5a9ae3260efa7e16b211f3cea1bcf3
--- /dev/null
@@ -0,0 +1 @@
+../../../doc/fdl.texi
\ No newline at end of file
diff --git a/lib/readline/doc/history.3 b/lib/readline/doc/history.3
new file mode 100644 (file)
index 0000000..3ade839
--- /dev/null
@@ -0,0 +1,663 @@
+.\"
+.\" MAN PAGE COMMENTS to
+.\"
+.\"    Chet Ramey
+.\"    Information Network Services
+.\"    Case Western Reserve University
+.\"    chet@ins.CWRU.Edu
+.\"
+.\"    Last Change: Thu Jul 31 08:46:08 EDT 2003
+.\"
+.TH HISTORY 3 "2003 July 31" "GNU History 5.0"
+.\"
+.\" File Name macro.  This used to be `.PN', for Path Name,
+.\" but Sun doesn't seem to like that very much.
+.\"
+.de FN
+\fI\|\\$1\|\fP
+..
+.ds lp \fR\|(\fP
+.ds rp \fR\|)\fP
+.\" FnN return-value fun-name N arguments
+.de Fn1
+\fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3\fP\\*(rp
+.br
+..
+.de Fn2
+.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4\fP\\*(rp
+.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4\fP\\*(rp
+.br
+..
+.de Fn3
+.if t \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3,\|\\$4,\|\\$5\fP\|\\*(rp
+.if n \fI\\$1\fP \fB\\$2\fP \\*(lp\fI\\$3, \\$4, \\$5\fP\\*(rp
+.br
+..
+.de Vb
+\fI\\$1\fP \fB\\$2\fP
+.br
+..
+.SH NAME
+history \- GNU History Library
+.SH COPYRIGHT
+.if t The GNU History Library is Copyright \(co 1989-2002 by the Free Software Foundation, Inc.
+.if n The GNU History Library is Copyright (C) 1989-2002 by the Free Software Foundation, Inc.
+.SH DESCRIPTION
+Many programs read input from the user a line at a time.  The GNU
+History library is able to keep track of those lines, associate arbitrary
+data with each line, and utilize information from previous lines in
+composing new ones. 
+.PP
+.SH "HISTORY EXPANSION"
+.PP
+The history library supports a history expansion feature that
+is identical to the history expansion in
+.BR bash.
+This section describes what syntax features are available.
+.PP
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+.PP
+History expansion is usually performed immediately after a complete line
+is read.
+It takes place in two parts.
+The first is to determine which line from the history list
+to use during substitution.
+The second is to select portions of that line for inclusion into
+the current one.
+The line selected from the history is the \fIevent\fP,
+and the portions of that line that are acted upon are \fIwords\fP.
+Various \fImodifiers\fP are available to manipulate the selected words.
+The line is broken into words in the same fashion as \fBbash\fP
+does when reading input,
+so that several words that would otherwise be separated 
+are considered one word when surrounded by quotes (see the
+description of \fBhistory_tokenize()\fP below).
+History expansions are introduced by the appearance of the
+history expansion character, which is \^\fB!\fP\^ by default.
+Only backslash (\^\fB\e\fP\^) and single quotes can quote
+the history expansion character.
+.SS Event Designators
+.PP
+An event designator is a reference to a command line entry in the
+history list.
+.PP
+.PD 0
+.TP
+.B !
+Start a history substitution, except when followed by a
+.BR blank ,
+newline, = or (.
+.TP
+.B !\fIn\fR
+Refer to command line
+.IR n .
+.TP
+.B !\-\fIn\fR
+Refer to the current command line minus
+.IR n .
+.TP
+.B !!
+Refer to the previous command.  This is a synonym for `!\-1'.
+.TP
+.B !\fIstring\fR
+Refer to the most recent command starting with 
+.IR string .
+.TP
+.B !?\fIstring\fR\fB[?]\fR
+Refer to the most recent command containing
+.IR string .
+The trailing \fB?\fP may be omitted if
+.I string
+is followed immediately by a newline.
+.TP
+.B \d\s+2^\s-2\u\fIstring1\fP\d\s+2^\s-2\u\fIstring2\fP\d\s+2^\s-2\u
+Quick substitution.  Repeat the last command, replacing
+.I string1
+with
+.IR string2 .
+Equivalent to
+``!!:s/\fIstring1\fP/\fIstring2\fP/''
+(see \fBModifiers\fP below).
+.TP
+.B !#
+The entire command line typed so far.
+.PD
+.SS Word Designators
+.PP
+Word designators are used to select desired words from the event.
+A 
+.B :
+separates the event specification from the word designator.
+It may be omitted if the word designator begins with a
+.BR ^ ,
+.BR $ ,
+.BR * ,
+.BR \- ,
+or
+.BR % .
+Words are numbered from the beginning of the line,
+with the first word being denoted by 0 (zero).
+Words are inserted into the current line separated by single spaces.
+.PP
+.PD 0
+.TP
+.B 0 (zero)
+The zeroth word.  For the shell, this is the command
+word.
+.TP
+.I n
+The \fIn\fRth word.
+.TP
+.B ^
+The first argument.  That is, word 1.
+.TP
+.B $
+The last argument.
+.TP
+.B %
+The word matched by the most recent `?\fIstring\fR?' search.
+.TP
+.I x\fB\-\fPy
+A range of words; `\-\fIy\fR' abbreviates `0\-\fIy\fR'.
+.TP
+.B *
+All of the words but the zeroth.  This is a synonym
+for `\fI1\-$\fP'.  It is not an error to use
+.B *
+if there is just one
+word in the event; the empty string is returned in that case.
+.TP
+.B x*
+Abbreviates \fIx\-$\fP.
+.TP
+.B x\-
+Abbreviates \fIx\-$\fP like \fBx*\fP, but omits the last word.
+.PD
+.PP
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+.SS Modifiers
+.PP
+After the optional word designator, there may appear a sequence of
+one or more of the following modifiers, each preceded by a `:'.
+.PP
+.PD 0
+.PP
+.TP
+.B h
+Remove a trailing file name component, leaving only the head.
+.TP
+.B t
+Remove all leading file name components, leaving the tail.
+.TP
+.B r
+Remove a trailing suffix of the form \fI.xxx\fP, leaving the
+basename.
+.TP
+.B e
+Remove all but the trailing suffix.
+.TP
+.B p
+Print the new command but do not execute it.
+.TP
+.B q
+Quote the substituted words, escaping further substitutions.
+.TP
+.B x
+Quote the substituted words as with
+.BR q ,
+but break into words at
+.B blanks
+and newlines.
+.TP
+.B s/\fIold\fP/\fInew\fP/
+Substitute
+.I new
+for the first occurrence of
+.I old
+in the event line.  Any delimiter can be used in place of /.  The
+final delimiter is optional if it is the last character of the
+event line.  The delimiter may be quoted in
+.I old
+and
+.I new
+with a single backslash.  If & appears in
+.IR new ,
+it is replaced by
+.IR old .
+A single backslash will quote the &.  If
+.I old
+is null, it is set to the last
+.I old
+substituted, or, if no previous history substitutions took place,
+the last
+.I string
+in a
+.B !?\fIstring\fR\fB[?]\fR
+search.
+.TP
+.B &
+Repeat the previous substitution.
+.TP
+.B g
+Cause changes to be applied over the entire event line.  This is
+used in conjunction with `\fB:s\fP' (e.g., `\fB:gs/\fIold\fP/\fInew\fP/\fR')
+or `\fB:&\fP'.  If used with
+`\fB:s\fP', any delimiter can be used
+in place of /, and the final delimiter is optional
+if it is the last character of the event line.
+An \fBa\fP may be used as a synonym for \fBg\fP.
+.TP
+.B G
+Apply the following `\fBs\fP' modifier once to each word in the event line.
+.PD
+.SH "PROGRAMMING WITH HISTORY FUNCTIONS"
+This section describes how to use the History library in other programs.
+.SS Introduction to History
+.PP
+The programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly.  In addition, a history \fIexpansion\fP function
+is available which provides for a consistent user interface across
+different programs.
+.PP
+The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands.  The basic history manipulation commands are
+identical to
+the history substitution provided by \fBbash\fP.
+.PP
+If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+.PP
+Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file
+.FN <readline/history.h>
+in any file that uses the
+History library's features.  It supplies extern declarations for all
+of the library's public functions and variables, and declares all of
+the public data structures.
+
+.SS History Storage
+.PP
+The history list is an array of history entries.  A history entry is
+declared as follows:
+.PP
+.Vb "typedef void *" histdata_t;
+.PP
+.nf
+typedef struct _hist_entry {
+  char *line;
+  char *timestamp;
+  histdata_t data;
+} HIST_ENTRY;
+.fi
+.PP
+The history list itself might therefore be declared as
+.PP
+.Vb "HIST_ENTRY **" the_history_list;
+.PP
+The state of the History library is encapsulated into a single structure:
+.PP
+.nf
+/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state {
+  HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+  int offset;           /* The location pointer within this array. */
+  int length;           /* Number of elements within this array. */
+  int size;             /* Number of slots allocated to this array. */
+  int flags;
+} HISTORY_STATE;
+.fi
+.PP
+If the flags member includes \fBHS_STIFLED\fP, the history has been
+stifled.
+.SH "History Functions"
+.PP
+This section describes the calling sequence for the various functions
+exported by the GNU History library.
+.SS Initializing History and State Management
+This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+
+.Fn1 void using_history void
+Begin a session in which the history functions might be used.  This
+initializes the interactive variables.
+
+.Fn1 "HISTORY_STATE *" history_get_history_state void
+Return a structure describing the current state of the input history.
+
+.Fn1 void history_set_history_state "HISTORY_STATE *state"
+Set the state of the history list according to \fIstate\fP.
+
+.SS History List Management
+
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+.Fn1 void add_history "const char *string"
+Place \fIstring\fP at the end of the history list.  The associated data
+field (if any) is set to \fBNULL\fP.
+
+.Fn1 void add_history_time "const char *string"
+Change the time stamp associated with the most recent history entry to
+\fIstring\fP.
+
+.Fn1 "HIST_ENTRY *" remove_history "int which"
+Remove history entry at offset \fIwhich\fP from the history.  The
+removed element is returned so you can free the line, data,
+and containing structure.
+
+.Fn1 "histdata_t" free_history_entry "HIST_ENTRY *histent"
+Free the history entry \fIhistent\fP and any history library private
+data associated with it.  Returns the application-specific data
+so the caller can dispose of it.
+
+.Fn3 "HIST_ENTRY *" replace_history_entry "int which" "const char *line" "histdata_t data"
+Make the history entry at offset \fIwhich\fP have \fIline\fP and \fIdata\fP.
+This returns the old entry so the caller can dispose of any
+application-specific data.  In the case
+of an invalid \fIwhich\fP, a \fBNULL\fP pointer is returned.
+
+.Fn1 void clear_history "void"
+Clear the history list by deleting all the entries.
+
+.Fn1 void stifle_history "int max"
+Stifle the history list, remembering only the last \fImax\fP entries.
+
+.Fn1 int unstifle_history "void"
+Stop stifling the history.  This returns the previously-set
+maximum number of history entries (as set by \fBstifle_history()\fP).
+history was stifled.  The value is positive if the history was
+stifled, negative if it wasn't.
+
+.Fn1 int history_is_stifled "void"
+Returns non-zero if the history is stifled, zero if it is not.
+
+.SS Information About the History List
+
+These functions return information about the entire history list or
+individual list entries.
+
+.Fn1 "HIST_ENTRY **" history_list "void"
+Return a \fBNULL\fP terminated array of \fIHIST_ENTRY *\fP which is the
+current input history.  Element 0 of this list is the beginning of time.
+If there is no history, return \fBNULL\fP.
+
+.Fn1 int where_history "void"
+Returns the offset of the current history element.
+
+.Fn1 "HIST_ENTRY *" current_history "void"
+Return the history entry at the current position, as determined by
+\fBwhere_history()\fP.  If there is no entry there, return a \fBNULL\fP
+pointer.
+
+.Fn1 "HIST_ENTRY *" history_get "int offset"
+Return the history entry at position \fIoffset\fP, starting from
+\fBhistory_base\fP.
+If there is no entry there, or if \fIoffset\fP
+is greater than the history length, return a \fBNULL\fP pointer.
+
+.Fn1 "time_t" history_get_time "HIST_ENTRY *"
+Return the time stamp associated with the history entry passed as the argument.
+
+.Fn1 int history_total_bytes "void"
+Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+
+.SS Moving Around the History List
+
+These functions allow the current index into the history list to be
+set or changed.
+
+.Fn1 int history_set_pos "int pos"
+Set the current history offset to \fIpos\fP, an absolute index
+into the list.
+Returns 1 on success, 0 if \fIpos\fP is less than zero or greater
+than the number of history entries.
+
+.Fn1 "HIST_ENTRY *" previous_history "void"
+Back up the current history offset to the previous history entry, and
+return a pointer to that entry.  If there is no previous entry, return
+a \fBNULL\fP pointer.
+
+.Fn1 "HIST_ENTRY *" next_history "void"
+Move the current history offset forward to the next history entry, and
+return the a pointer to that entry.  If there is no next entry, return
+a \fBNULL\fP pointer.
+
+.SS Searching the History List
+
+These functions allow searching of the history list for entries containing
+a specific string.  Searching may be performed both forward and backward
+from the current history position.  The search may be \fIanchored\fP,
+meaning that the string must match at the beginning of the history entry.
+
+.Fn2 int history_search "const char *string" "int direction"
+Search the history for \fIstring\fP, starting at the current history offset.
+If \fIdirection\fP is less than 0, then the search is through
+previous entries, otherwise through subsequent entries.
+If \fIstring\fP is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+\fIstring\fP was found.  Otherwise, nothing is changed, and a -1 is
+returned.
+
+.Fn2 int history_search_prefix "const char *string" "int direction"
+Search the history for \fIstring\fP, starting at the current history
+offset.  The search is anchored: matching lines must begin with
+\fIstring\fP.  If \fIdirection\fP is less than 0, then the search is
+through previous entries, otherwise through subsequent entries.
+If \fIstring\fP is found, then the
+current history index is set to that entry, and the return value is 0. 
+Otherwise, nothing is changed, and a -1 is returned. 
+
+.Fn3 int history_search_pos "const char *string" "int direction" "int pos"
+Search for \fIstring\fP in the history list, starting at \fIpos\fP, an
+absolute index into the list.  If \fIdirection\fP is negative, the search
+proceeds backward from \fIpos\fP, otherwise forward.  Returns the absolute
+index of the history element where \fIstring\fP was found, or -1 otherwise.
+
+.SS Managing the History File
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+.Fn1 int read_history "const char *filename"
+Add the contents of \fIfilename\fP to the history list, a line at a time.
+If \fIfilename\fP is \fBNULL\fP, then read from \fI~/.history\fP.
+Returns 0 if successful, or \fBerrno\fP if not.
+
+.Fn3 int read_history_range "const char *filename" "int from" "int to"
+Read a range of lines from \fIfilename\fP, adding them to the history list.
+Start reading at line \fIfrom\fP and end at \fIto\fP.
+If \fIfrom\fP is zero, start at the beginning.  If \fIto\fP is less than
+\fIfrom\fP, then read until the end of the file.  If \fIfilename\fP is
+\fBNULL\fP, then read from \fI~/.history\fP.  Returns 0 if successful,
+or \fBerrno\fP if not.
+
+.Fn1 int write_history "const char *filename"
+Write the current history to \fIfilename\fP, overwriting \fIfilename\fP
+if necessary.
+If \fIfilename\fP is \fBNULL\fP, then write the history list to \fI~/.history\fP.
+Returns 0 on success, or \fBerrno\fP on a read or write error.
+
+
+.Fn2 int append_history "int nelements" "const char *filename"
+Append the last \fInelements\fP of the history list to \fIfilename\fP.
+If \fIfilename\fP is \fBNULL\fP, then append to \fI~/.history\fP.
+Returns 0 on success, or \fBerrno\fP on a read or write error.
+
+.Fn2 int history_truncate_file "const char *filename" "int nlines"
+Truncate the history file \fIfilename\fP, leaving only the last
+\fInlines\fP lines.
+If \fIfilename\fP is \fBNULL\fP, then \fI~/.history\fP is truncated.
+Returns 0 on success, or \fBerrno\fP on failure.
+
+.SS History Expansion
+
+These functions implement history expansion.
+
+.Fn2 int history_expand "char *string" "char **output"
+Expand \fIstring\fP, placing the result into \fIoutput\fP, a pointer
+to a string.  Returns:
+.RS
+.PD 0
+.TP
+0
+If no expansions took place (or, if the only change in
+the text was the removal of escape characters preceding the history expansion
+character);
+.TP
+1
+if expansions did take place;
+.TP
+-1
+if there was an error in expansion;
+.TP
+2
+if the returned line should be displayed, but not executed,
+as with the \fB:p\fP modifier.
+.PD
+.RE
+If an error ocurred in expansion, then \fIoutput\fP contains a descriptive
+error message.
+
+.Fn3 "char *" get_history_event "const char *string" "int *cindex" "int qchar"
+Returns the text of the history event beginning at \fIstring\fP +
+\fI*cindex\fP.  \fI*cindex\fP is modified to point to after the event
+specifier.  At function entry, \fIcindex\fP points to the index into
+\fIstring\fP where the history event specification begins.  \fIqchar\fP
+is a character that is allowed to end the event specification in addition
+to the ``normal'' terminating characters.
+
+.Fn1 "char **" history_tokenize "const char *string"
+Return an array of tokens parsed out of \fIstring\fP, much as the
+shell might.
+The tokens are split on the characters in the
+\fBhistory_word_delimiters\fP variable,
+and shell quoting conventions are obeyed.
+
+.Fn3 "char *" history_arg_extract "int first" "int last" "const char *string"
+Extract a string segment consisting of the \fIfirst\fP through \fIlast\fP
+arguments present in \fIstring\fP.  Arguments are split using
+\fBhistory_tokenize()\fP.
+
+.SS History Variables
+
+This section describes the externally-visible variables exported by
+the GNU History Library.
+
+.Vb int history_base
+The logical offset of the first entry in the history list.
+
+.Vb int history_length
+The number of entries currently stored in the history list.
+
+.Vb int history_max_entries
+The maximum number of history entries.  This must be changed using
+\fBstifle_history()\fP.
+
+.Vb int history_write_timestamps
+If non-zero, timestamps are written to the history file, so they can be
+preserved between sessions.  The default value is 0, meaning that
+timestamps are not saved.
+
+.Vb char history_expansion_char
+The character that introduces a history event.  The default is \fB!\fP.
+Setting this to 0 inhibits history expansion.
+
+.Vb char history_subst_char
+The character that invokes word substitution if found at the start of
+a line.  The default is \fB^\fP.
+
+.Vb char history_comment_char
+During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+
+.Vb "char *" history_word_delimiters
+The characters that separate tokens for \fBhistory_tokenize()\fP.
+The default value is \fB"\ \et\en()<>;&|"\fP.
+
+.Vb "char *" history_no_expand_chars
+The list of characters which inhibit history expansion if found immediately
+following \fBhistory_expansion_char\fP.  The default is space, tab, newline,
+\fB\er\fP, and \fB=\fP.
+
+.Vb "char *" history_search_delimiter_chars
+The list of additional characters which can delimit a history search
+string, in addition to space, tab, \fI:\fP and \fI?\fP in the case of
+a substring search.  The default is empty.
+
+.Vb int history_quotes_inhibit_expansion
+If non-zero, single-quoted words are not scanned for the history expansion
+character.  The default value is 0.
+
+.Vb "rl_linebuf_func_t *" history_inhibit_expansion_function
+This should be set to the address of a function that takes two arguments:
+a \fBchar *\fP (\fIstring\fP)
+and an \fBint\fP index into that string (\fIi\fP).
+It should return a non-zero value if the history expansion starting at
+\fIstring[i]\fP should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like \fBbash\fP that use the history
+expansion character for additional purposes.
+By default, this variable is set to \fBNULL\fP.
+.SH FILES
+.PD 0 
+.TP
+.FN ~/.history
+Default filename for reading and writing saved history
+.PD
+.SH "SEE ALSO"
+.PD 0
+.TP
+\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIbash\fP(1)
+.TP
+\fIreadline\fP(3)
+.PD
+.SH AUTHORS
+Brian Fox, Free Software Foundation
+.br
+bfox@gnu.org
+.PP
+Chet Ramey, Case Western Reserve University
+.br
+chet@ins.CWRU.Edu
+.SH BUG REPORTS
+If you find a bug in the
+.B history
+library, you should report it.  But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of the
+.B history
+library that you have.
+.PP
+Once you have determined that a bug actually exists, mail a
+bug report to \fIbug\-readline\fP@\fIgnu.org\fP.
+If you have a fix, you are welcome to mail that
+as well!  Suggestions and `philosophical' bug reports may be mailed
+to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet
+newsgroup
+.BR gnu.bash.bug .
+.PP
+Comments and bug reports concerning
+this manual page should be directed to
+.IR chet@ins.CWRU.Edu .
diff --git a/lib/readline/doc/history.aux b/lib/readline/doc/history.aux
new file mode 100644 (file)
index 0000000..c5ee3cb
--- /dev/null
@@ -0,0 +1,66 @@
+@xrdef{Using History Interactively-title}{Using History Interactively}
+@xrdef{Using History Interactively-pg}{1}
+@xrdef{Using History Interactively-snt}{Chapter@tie 1}
+@xrdef{History Interaction-title}{History Expansion}
+@xrdef{History Interaction-pg}{1}
+@xrdef{History Interaction-snt}{Section@tie 1.1}
+@xrdef{Event Designators-title}{Event Designators}
+@xrdef{Event Designators-pg}{1}
+@xrdef{Event Designators-snt}{Section@tie 1.1.1}
+@xrdef{Word Designators-title}{Word Designators}
+@xrdef{Word Designators-pg}{2}
+@xrdef{Word Designators-snt}{Section@tie 1.1.2}
+@xrdef{Modifiers-title}{Modifiers}
+@xrdef{Modifiers-pg}{2}
+@xrdef{Modifiers-snt}{Section@tie 1.1.3}
+@xrdef{Programming with GNU History-title}{Programming with GNU History}
+@xrdef{Programming with GNU History-pg}{5}
+@xrdef{Programming with GNU History-snt}{Chapter@tie 2}
+@xrdef{Introduction to History-title}{Introduction to History}
+@xrdef{Introduction to History-pg}{5}
+@xrdef{Introduction to History-snt}{Section@tie 2.1}
+@xrdef{History Storage-title}{History Storage}
+@xrdef{History Storage-pg}{5}
+@xrdef{History Storage-snt}{Section@tie 2.2}
+@xrdef{History Functions-title}{History Functions}
+@xrdef{History Functions-pg}{6}
+@xrdef{History Functions-snt}{Section@tie 2.3}
+@xrdef{Initializing History and State Management-title}{Initializing History and State Management}
+@xrdef{Initializing History and State Management-pg}{6}
+@xrdef{Initializing History and State Management-snt}{Section@tie 2.3.1}
+@xrdef{History List Management-title}{History List Management}
+@xrdef{History List Management-pg}{6}
+@xrdef{History List Management-snt}{Section@tie 2.3.2}
+@xrdef{Information About the History List-title}{Information About the History List}
+@xrdef{Information About the History List-pg}{7}
+@xrdef{Information About the History List-snt}{Section@tie 2.3.3}
+@xrdef{Moving Around the History List-title}{Moving Around the History List}
+@xrdef{Moving Around the History List-pg}{8}
+@xrdef{Moving Around the History List-snt}{Section@tie 2.3.4}
+@xrdef{Searching the History List-title}{Searching the History List}
+@xrdef{Searching the History List-pg}{8}
+@xrdef{Searching the History List-snt}{Section@tie 2.3.5}
+@xrdef{Managing the History File-title}{Managing the History File}
+@xrdef{Managing the History File-pg}{8}
+@xrdef{Managing the History File-snt}{Section@tie 2.3.6}
+@xrdef{History Expansion-title}{History Expansion}
+@xrdef{History Expansion-pg}{9}
+@xrdef{History Expansion-snt}{Section@tie 2.3.7}
+@xrdef{History Variables-title}{History Variables}
+@xrdef{History Variables-pg}{10}
+@xrdef{History Variables-snt}{Section@tie 2.4}
+@xrdef{History Programming Example-title}{History Programming Example}
+@xrdef{History Programming Example-pg}{11}
+@xrdef{History Programming Example-snt}{Section@tie 2.5}
+@xrdef{Copying This Manual-title}{Copying This Manual}
+@xrdef{Copying This Manual-pg}{13}
+@xrdef{Copying This Manual-snt}{Appendix@tie @char65{}}
+@xrdef{GNU Free Documentation License-title}{GNU Free Documentation License}
+@xrdef{GNU Free Documentation License-pg}{13}
+@xrdef{GNU Free Documentation License-snt}{Section@tie @char65.1}
+@xrdef{Concept Index-title}{Concept Index}
+@xrdef{Concept Index-pg}{21}
+@xrdef{Concept Index-snt}{Appendix@tie @char66{}}
+@xrdef{Function and Variable Index-title}{Function and Variable Index}
+@xrdef{Function and Variable Index-pg}{23}
+@xrdef{Function and Variable Index-snt}{Appendix@tie @char67{}}
diff --git a/lib/readline/doc/history.bt b/lib/readline/doc/history.bt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/history.cp b/lib/readline/doc/history.cp
new file mode 100644 (file)
index 0000000..6d950d8
--- /dev/null
@@ -0,0 +1,6 @@
+\entry{history expansion}{1}{history expansion}
+\entry{event designators}{1}{event designators}
+\entry{history events}{1}{history events}
+\entry{History Searching}{8}{History Searching}
+\entry{anchored search}{8}{anchored search}
+\entry{FDL, GNU Free Documentation License}{13}{FDL, GNU Free Documentation License}
diff --git a/lib/readline/doc/history.cps b/lib/readline/doc/history.cps
new file mode 100644 (file)
index 0000000..58f3c38
--- /dev/null
@@ -0,0 +1,10 @@
+\initial {A}
+\entry {anchored search}{8}
+\initial {E}
+\entry {event designators}{1}
+\initial {F}
+\entry {FDL, GNU Free Documentation License}{13}
+\initial {H}
+\entry {history events}{1}
+\entry {history expansion}{1}
+\entry {History Searching}{8}
diff --git a/lib/readline/doc/history.dvi b/lib/readline/doc/history.dvi
new file mode 100644 (file)
index 0000000..b8fcb0d
Binary files /dev/null and b/lib/readline/doc/history.dvi differ
diff --git a/lib/readline/doc/history.fn b/lib/readline/doc/history.fn
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/history.html b/lib/readline/doc/history.html
new file mode 100644 (file)
index 0000000..5da3c58
--- /dev/null
@@ -0,0 +1,2270 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on September, 22  2003 by texi2html 1.64 -->
+<!-- 
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+-->
+<HEAD>
+<TITLE>GNU History Library: </TITLE>
+
+<META NAME="description" CONTENT="GNU History Library: ">
+<META NAME="keywords" CONTENT="GNU History Library: ">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_Top"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>GNU History Library</H1></P><P>
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC1">1. Using History Interactively</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU History User's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC6">2. Programming with GNU History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU History Programmer's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC19">A. Copying This Manual</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC22">B. Concept Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of concepts described in this manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC23">C. Function and Variable Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of externally visible functions
+                                 and variables.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<HR SIZE=1>
+<A NAME="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<A NAME="Using History Interactively"></A>
+<H1> 1. Using History Interactively </H1>
+<!--docid::SEC1::-->
+<P>
+
+This chapter describes how to use the GNU History Library interactively,
+from a user's standpoint.  It should be considered a user's guide.  For
+information on using the GNU History Library in your own programs,
+see section <A HREF="history.html#SEC6">2. Programming with GNU History</A>.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC2">1.1 History Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What it feels like using History as a user.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="History Interaction"></A>
+<HR SIZE="6">
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.1 History Expansion </H2>
+<!--docid::SEC2::-->
+<P>
+
+The History library provides a history expansion feature that is similar
+to the history expansion provided by <CODE>csh</CODE>.  This section
+describes the syntax used to manipulate the history information.
+</P><P>
+
+History expansions introduce words from the history list into
+the input stream, making it easy to repeat commands, insert the
+arguments to a previous command into the current input line, or
+fix errors in previous commands quickly.
+</P><P>
+
+History expansion takes place in two parts.  The first is to determine
+which line from the history list should be used during substitution.
+The second is to select portions of that line for inclusion into the
+current one.  The line selected from the history is called the
+<EM>event</EM>, and the portions of that line that are acted upon are
+called <EM>words</EM>.  Various <EM>modifiers</EM> are available to manipulate
+the selected words.  The line is broken into words in the same fashion
+that Bash does, so that several words
+surrounded by quotes are considered one word.
+History expansions are introduced by the appearance of the
+history expansion character, which is <SAMP>`!'</SAMP> by default.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC3">1.1.1 Event Designators</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to specify which history line to use.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC4">1.1.2 Word Designators</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Specifying which words are of interest.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC5">1.1.3 Modifiers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Modifying the results of substitution.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Event Designators"></A>
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.1.1 Event Designators </H3>
+<!--docid::SEC3::-->
+<P>
+
+An event designator is a reference to a command line entry in the
+history list.
+<A NAME="IDX1"></A>
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>!</CODE>
+<DD>Start a history substitution, except when followed by a space, tab,
+the end of the line, or <SAMP>`='</SAMP>.
+<P>
+
+<DT><CODE>!<VAR>n</VAR></CODE>
+<DD>Refer to command line <VAR>n</VAR>.
+<P>
+
+<DT><CODE>!-<VAR>n</VAR></CODE>
+<DD>Refer to the command <VAR>n</VAR> lines back.
+<P>
+
+<DT><CODE>!!</CODE>
+<DD>Refer to the previous command.  This is a synonym for <SAMP>`!-1'</SAMP>.
+<P>
+
+<DT><CODE>!<VAR>string</VAR></CODE>
+<DD>Refer to the most recent command starting with <VAR>string</VAR>.
+<P>
+
+<DT><CODE>!?<VAR>string</VAR>[?]</CODE>
+<DD>Refer to the most recent command containing <VAR>string</VAR>.  The trailing
+<SAMP>`?'</SAMP> may be omitted if the <VAR>string</VAR> is followed immediately by
+a newline.
+<P>
+
+<DT><CODE>^<VAR>string1</VAR>^<VAR>string2</VAR>^</CODE>
+<DD>Quick Substitution.  Repeat the last command, replacing <VAR>string1</VAR>
+with <VAR>string2</VAR>.  Equivalent to
+<CODE>!!:s/<VAR>string1</VAR>/<VAR>string2</VAR>/</CODE>.
+<P>
+
+<DT><CODE>!#</CODE>
+<DD>The entire command line typed so far.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Word Designators"></A>
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC5"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.1.2 Word Designators </H3>
+<!--docid::SEC4::-->
+<P>
+
+Word designators are used to select desired words from the event.
+A <SAMP>`:'</SAMP> separates the event specification from the word designator.  It
+may be omitted if the word designator begins with a <SAMP>`^'</SAMP>, <SAMP>`$'</SAMP>,
+<SAMP>`*'</SAMP>, <SAMP>`-'</SAMP>, or <SAMP>`%'</SAMP>.  Words are numbered from the beginning
+of the line, with the first word being denoted by 0 (zero).  Words are
+inserted into the current line separated by single spaces.
+</P><P>
+
+For example,
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>!!</CODE>
+<DD>designates the preceding command.  When you type this, the preceding
+command is repeated in toto.
+<P>
+
+<DT><CODE>!!:$</CODE>
+<DD>designates the last argument of the preceding command.  This may be
+shortened to <CODE>!$</CODE>.
+<P>
+
+<DT><CODE>!fi:2</CODE>
+<DD>designates the second argument of the most recent command starting with
+the letters <CODE>fi</CODE>.
+</DL>
+<P>
+
+Here are the word designators:
+<DL COMPACT>
+
+<DT><CODE>0 (zero)</CODE>
+<DD>The <CODE>0</CODE>th word.  For many applications, this is the command word.
+<P>
+
+<DT><CODE><VAR>n</VAR></CODE>
+<DD>The <VAR>n</VAR>th word.
+<P>
+
+<DT><CODE>^</CODE>
+<DD>The first argument; that is, word 1.
+<P>
+
+<DT><CODE>$</CODE>
+<DD>The last argument.
+<P>
+
+<DT><CODE>%</CODE>
+<DD>The word matched by the most recent <SAMP>`?<VAR>string</VAR>?'</SAMP> search.
+<P>
+
+<DT><CODE><VAR>x</VAR>-<VAR>y</VAR></CODE>
+<DD>A range of words; <SAMP>`-<VAR>y</VAR>'</SAMP> abbreviates <SAMP>`0-<VAR>y</VAR>'</SAMP>.
+<P>
+
+<DT><CODE>*</CODE>
+<DD>All of the words, except the <CODE>0</CODE>th.  This is a synonym for <SAMP>`1-$'</SAMP>.
+It is not an error to use <SAMP>`*'</SAMP> if there is just one word in the event;
+the empty string is returned in that case.
+<P>
+
+<DT><CODE><VAR>x</VAR>*</CODE>
+<DD>Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP>
+<P>
+
+<DT><CODE><VAR>x</VAR>-</CODE>
+<DD>Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP> like <SAMP>`<VAR>x</VAR>*'</SAMP>, but omits the last word.
+<P>
+
+</DL>
+<P>
+
+If a word designator is supplied without an event specification, the
+previous command is used as the event.
+</P><P>
+
+<A NAME="Modifiers"></A>
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC2"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.1.3 Modifiers </H3>
+<!--docid::SEC5::-->
+<P>
+
+After the optional word designator, you can add a sequence of one or more
+of the following modifiers, each preceded by a <SAMP>`:'</SAMP>.
+</P><P>
+
+<DL COMPACT>
+
+<DT><CODE>h</CODE>
+<DD>Remove a trailing pathname component, leaving only the head.
+<P>
+
+<DT><CODE>t</CODE>
+<DD>Remove all leading  pathname  components, leaving the tail.
+<P>
+
+<DT><CODE>r</CODE>
+<DD>Remove a trailing suffix of the form <SAMP>`.<VAR>suffix</VAR>'</SAMP>, leaving
+the basename.
+<P>
+
+<DT><CODE>e</CODE>
+<DD>Remove all but the trailing suffix.
+<P>
+
+<DT><CODE>p</CODE>
+<DD>Print the new command but do not execute it.
+<P>
+
+<DT><CODE>s/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>
+<DD>Substitute <VAR>new</VAR> for the first occurrence of <VAR>old</VAR> in the
+event line.  Any delimiter may be used in place of <SAMP>`/'</SAMP>.
+The delimiter may be quoted in <VAR>old</VAR> and <VAR>new</VAR>
+with a single backslash.  If <SAMP>`&#38;'</SAMP> appears in <VAR>new</VAR>,
+it is replaced by <VAR>old</VAR>.  A single backslash will quote
+the <SAMP>`&#38;'</SAMP>.  The final delimiter is optional if it is the last
+character on the input line.
+<P>
+
+<DT><CODE>&#38;</CODE>
+<DD>Repeat the previous substitution.
+<P>
+
+<DT><CODE>g</CODE>
+<DD><DT><CODE>a</CODE>
+<DD>Cause changes to be applied over the entire event line.  Used in
+conjunction with <SAMP>`s'</SAMP>, as in <CODE>gs/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>,
+or with <SAMP>`&#38;'</SAMP>.
+<P>
+
+<DT><CODE>G</CODE>
+<DD>Apply the following <SAMP>`s'</SAMP> modifier once to each word in the event.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Programming with GNU History"></A>
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 2. Programming with GNU History </H1>
+<!--docid::SEC6::-->
+<P>
+
+This chapter describes how to interface programs that you write
+with the GNU History Library.
+It should be considered a technical guide.
+For information on the interactive use of GNU History, see section <A HREF="history.html#SEC1">1. Using History Interactively</A>.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC7">2.1 Introduction to History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">What is the GNU History library for?</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC8">2.2 History Storage</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How information is stored.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC9">2.3 History Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions that you can use.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC17">2.4 History Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables that control behaviour.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC18">2.5 History Programming Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Example of using the GNU History Library.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Introduction to History"></A>
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.1 Introduction to History </H2>
+<!--docid::SEC7::-->
+<P>
+
+Many programs read input from the user a line at a time.  The GNU
+History library is able to keep track of those lines, associate arbitrary
+data with each line, and utilize information from previous lines in
+composing new ones. 
+</P><P>
+
+The programmer using the History library has available functions
+for remembering lines on a history list, associating arbitrary data
+with a line, removing lines from the list, searching through the list
+for a line containing an arbitrary text string, and referencing any line
+in the list directly.  In addition, a history <EM>expansion</EM> function
+is available which provides for a consistent user interface across
+different programs.
+</P><P>
+
+The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands.  The basic history manipulation commands are similar to
+the history substitution provided by <CODE>csh</CODE>.
+</P><P>
+
+If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+</P><P>
+
+Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file <CODE>&#60;readline/history.h&#62;</CODE> in any file that uses the
+History library's features.  It supplies extern declarations for all
+of the library's public functions and variables, and declares all of
+the public data structures.
+</P><P>
+
+<A NAME="History Storage"></A>
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.2 History Storage </H2>
+<!--docid::SEC8::-->
+<P>
+
+The history list is an array of history entries.  A history entry is
+declared as follows:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>typedef void *histdata_t;
+
+typedef struct _hist_entry {
+  char *line;
+  char *timestamp;
+  histdata_t data;
+} HIST_ENTRY;
+</pre></td></tr></table></P><P>
+
+The history list itself might therefore be declared as
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>HIST_ENTRY **the_history_list;
+</pre></td></tr></table></P><P>
+
+The state of the History library is encapsulated into a single structure:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>/*
+ * A structure used to pass around the current state of the history.
+ */
+typedef struct _hist_state {
+  HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+  int offset;           /* The location pointer within this array. */
+  int length;           /* Number of elements within this array. */
+  int size;             /* Number of slots allocated to this array. */
+  int flags;
+} HISTORY_STATE;
+</pre></td></tr></table></P><P>
+
+If the flags member includes <CODE>HS_STIFLED</CODE>, the history has been
+stifled.
+</P><P>
+
+<A NAME="History Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.3 History Functions </H2>
+<!--docid::SEC9::-->
+<P>
+
+This section describes the calling sequence for the various functions
+exported by the GNU History library.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to call when you
+                                               want to use history in a
+                                               program.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions used to manage the list
+                                       of history entries.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions returning information about
+                                       the history list.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC13">2.3.4 Moving Around the History List</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions used to change the position
+                                       in the history list.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to search the history list
+                                       for entries containing a string.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions that read and write a file
+                                       containing the history list.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to perform csh-like history
+                                       expansion.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Initializing History and State Management"></A>
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.1 Initializing History and State Management </H3>
+<!--docid::SEC10::-->
+<P>
+
+This section describes functions used to initialize and manage
+the state of the History library when you want to use the history
+functions in your program.
+</P><P>
+
+<A NAME="IDX2"></A>
+<DL>
+<DT><U>Function:</U> void <B>using_history</B> <I>(void)</I>
+<DD>Begin a session in which the history functions might be used.  This
+initializes the interactive variables.
+</DL>
+</P><P>
+
+<A NAME="IDX3"></A>
+<DL>
+<DT><U>Function:</U> HISTORY_STATE * <B>history_get_history_state</B> <I>(void)</I>
+<DD>Return a structure describing the current state of the input history.
+</DL>
+</P><P>
+
+<A NAME="IDX4"></A>
+<DL>
+<DT><U>Function:</U> void <B>history_set_history_state</B> <I>(HISTORY_STATE *state)</I>
+<DD>Set the state of the history list according to <VAR>state</VAR>.
+</DL>
+</P><P>
+
+<A NAME="History List Management"></A>
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC12"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.2 History List Management </H3>
+<!--docid::SEC11::-->
+<P>
+
+These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+</P><P>
+
+<A NAME="IDX5"></A>
+<DL>
+<DT><U>Function:</U> void <B>add_history</B> <I>(const char *string)</I>
+<DD>Place <VAR>string</VAR> at the end of the history list.  The associated data
+field (if any) is set to <CODE>NULL</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX6"></A>
+<DL>
+<DT><U>Function:</U> void <B>add_history_time</B> <I>(const char *string)</I>
+<DD>Change the time stamp associated with the most recent history entry to
+<VAR>string</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX7"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>remove_history</B> <I>(int which)</I>
+<DD>Remove history entry at offset <VAR>which</VAR> from the history.  The
+removed element is returned so you can free the line, data,
+and containing structure.
+</DL>
+</P><P>
+
+<A NAME="IDX8"></A>
+<DL>
+<DT><U>Function:</U> histdata_t <B>free_history_entry</B> <I>(HIST_ENTRY *histent)</I>
+<DD>Free the history entry <VAR>histent</VAR> and any history library private
+data associated with it.  Returns the application-specific data
+so the caller can dispose of it.
+</DL>
+</P><P>
+
+<A NAME="IDX9"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>replace_history_entry</B> <I>(int which, const char *line, histdata_t data)</I>
+<DD>Make the history entry at offset <VAR>which</VAR> have <VAR>line</VAR> and <VAR>data</VAR>.
+This returns the old entry so the caller can dispose of any
+application-specific data.  In the case
+of an invalid <VAR>which</VAR>, a <CODE>NULL</CODE> pointer is returned.
+</DL>
+</P><P>
+
+<A NAME="IDX10"></A>
+<DL>
+<DT><U>Function:</U> void <B>clear_history</B> <I>(void)</I>
+<DD>Clear the history list by deleting all the entries.
+</DL>
+</P><P>
+
+<A NAME="IDX11"></A>
+<DL>
+<DT><U>Function:</U> void <B>stifle_history</B> <I>(int max)</I>
+<DD>Stifle the history list, remembering only the last <VAR>max</VAR> entries.
+</DL>
+</P><P>
+
+<A NAME="IDX12"></A>
+<DL>
+<DT><U>Function:</U> int <B>unstifle_history</B> <I>(void)</I>
+<DD>Stop stifling the history.  This returns the previously-set
+maximum number of history entries (as set by <CODE>stifle_history()</CODE>).
+The value is positive if the history was
+stifled, negative if it wasn't.
+</DL>
+</P><P>
+
+<A NAME="IDX13"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_is_stifled</B> <I>(void)</I>
+<DD>Returns non-zero if the history is stifled, zero if it is not.
+</DL>
+</P><P>
+
+<A NAME="Information About the History List"></A>
+<HR SIZE="6">
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.3 Information About the History List </H3>
+<!--docid::SEC12::-->
+<P>
+
+These functions return information about the entire history list or
+individual list entries.
+</P><P>
+
+<A NAME="IDX14"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY ** <B>history_list</B> <I>(void)</I>
+<DD>Return a <CODE>NULL</CODE> terminated array of <CODE>HIST_ENTRY *</CODE> which is the
+current input history.  Element 0 of this list is the beginning of time.
+If there is no history, return <CODE>NULL</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX15"></A>
+<DL>
+<DT><U>Function:</U> int <B>where_history</B> <I>(void)</I>
+<DD>Returns the offset of the current history element.
+</DL>
+</P><P>
+
+<A NAME="IDX16"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>current_history</B> <I>(void)</I>
+<DD>Return the history entry at the current position, as determined by
+<CODE>where_history()</CODE>.  If there is no entry there, return a <CODE>NULL</CODE>
+pointer.
+</DL>
+</P><P>
+
+<A NAME="IDX17"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>history_get</B> <I>(int offset)</I>
+<DD>Return the history entry at position <VAR>offset</VAR>, starting from
+<CODE>history_base</CODE> (see section <A HREF="history.html#SEC17">2.4 History Variables</A>).
+If there is no entry there, or if <VAR>offset</VAR>
+is greater than the history length, return a <CODE>NULL</CODE> pointer.
+</DL>
+</P><P>
+
+<A NAME="IDX18"></A>
+<DL>
+<DT><U>Function:</U> time_t <B>history_get_time</B> <I>(HIST_ENTRY *entry)</I>
+<DD>Return the time stamp associated with the history entry <VAR>entry</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX19"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_total_bytes</B> <I>(void)</I>
+<DD>Return the number of bytes that the primary history entries are using.
+This function returns the sum of the lengths of all the lines in the
+history.
+</DL>
+</P><P>
+
+<A NAME="Moving Around the History List"></A>
+<HR SIZE="6">
+<A NAME="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC14"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.4 Moving Around the History List </H3>
+<!--docid::SEC13::-->
+<P>
+
+These functions allow the current index into the history list to be
+set or changed.
+</P><P>
+
+<A NAME="IDX20"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_set_pos</B> <I>(int pos)</I>
+<DD>Set the current history offset to <VAR>pos</VAR>, an absolute index
+into the list.
+Returns 1 on success, 0 if <VAR>pos</VAR> is less than zero or greater
+than the number of history entries.
+</DL>
+</P><P>
+
+<A NAME="IDX21"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>previous_history</B> <I>(void)</I>
+<DD>Back up the current history offset to the previous history entry, and
+return a pointer to that entry.  If there is no previous entry, return
+a <CODE>NULL</CODE> pointer.
+</DL>
+</P><P>
+
+<A NAME="IDX22"></A>
+<DL>
+<DT><U>Function:</U> HIST_ENTRY * <B>next_history</B> <I>(void)</I>
+<DD>Move the current history offset forward to the next history entry, and
+return the a pointer to that entry.  If there is no next entry, return
+a <CODE>NULL</CODE> pointer.
+</DL>
+</P><P>
+
+<A NAME="Searching the History List"></A>
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC15"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.5 Searching the History List </H3>
+<!--docid::SEC14::-->
+<P>
+
+These functions allow searching of the history list for entries containing
+a specific string.  Searching may be performed both forward and backward
+from the current history position.  The search may be <EM>anchored</EM>,
+meaning that the string must match at the beginning of the history entry.
+<A NAME="IDX23"></A>
+</P><P>
+
+<A NAME="IDX24"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_search</B> <I>(const char *string, int direction)</I>
+<DD>Search the history for <VAR>string</VAR>, starting at the current history offset.
+If <VAR>direction</VAR> is less than 0, then the search is through
+previous entries, otherwise through subsequent entries.
+If <VAR>string</VAR> is found, then
+the current history index is set to that history entry, and the value
+returned is the offset in the line of the entry where
+<VAR>string</VAR> was found.  Otherwise, nothing is changed, and a -1 is
+returned.
+</DL>
+</P><P>
+
+<A NAME="IDX25"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_search_prefix</B> <I>(const char *string, int direction)</I>
+<DD>Search the history for <VAR>string</VAR>, starting at the current history
+offset.  The search is anchored: matching lines must begin with
+<VAR>string</VAR>.  If <VAR>direction</VAR> is less than 0, then the search is
+through previous entries, otherwise through subsequent entries.
+If <VAR>string</VAR> is found, then the
+current history index is set to that entry, and the return value is 0. 
+Otherwise, nothing is changed, and a -1 is returned. 
+</DL>
+</P><P>
+
+<A NAME="IDX26"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_search_pos</B> <I>(const char *string, int direction, int pos)</I>
+<DD>Search for <VAR>string</VAR> in the history list, starting at <VAR>pos</VAR>, an
+absolute index into the list.  If <VAR>direction</VAR> is negative, the search
+proceeds backward from <VAR>pos</VAR>, otherwise forward.  Returns the absolute
+index of the history element where <VAR>string</VAR> was found, or -1 otherwise.
+</DL>
+</P><P>
+
+<A NAME="Managing the History File"></A>
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC16"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.6 Managing the History File </H3>
+<!--docid::SEC15::-->
+<P>
+
+The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+</P><P>
+
+<A NAME="IDX27"></A>
+<DL>
+<DT><U>Function:</U> int <B>read_history</B> <I>(const char *filename)</I>
+<DD>Add the contents of <VAR>filename</VAR> to the history list, a line at a time.
+If <VAR>filename</VAR> is <CODE>NULL</CODE>, then read from <TT>`~/.history'</TT>.
+Returns 0 if successful, or <CODE>errno</CODE> if not.
+</DL>
+</P><P>
+
+<A NAME="IDX28"></A>
+<DL>
+<DT><U>Function:</U> int <B>read_history_range</B> <I>(const char *filename, int from, int to)</I>
+<DD>Read a range of lines from <VAR>filename</VAR>, adding them to the history list.
+Start reading at line <VAR>from</VAR> and end at <VAR>to</VAR>.
+If <VAR>from</VAR> is zero, start at the beginning.  If <VAR>to</VAR> is less than
+<VAR>from</VAR>, then read until the end of the file.  If <VAR>filename</VAR> is
+<CODE>NULL</CODE>, then read from <TT>`~/.history'</TT>.  Returns 0 if successful,
+or <CODE>errno</CODE> if not.
+</DL>
+</P><P>
+
+<A NAME="IDX29"></A>
+<DL>
+<DT><U>Function:</U> int <B>write_history</B> <I>(const char *filename)</I>
+<DD>Write the current history to <VAR>filename</VAR>, overwriting <VAR>filename</VAR>
+if necessary.
+If <VAR>filename</VAR> is <CODE>NULL</CODE>, then write the history list to
+<TT>`~/.history'</TT>.
+Returns 0 on success, or <CODE>errno</CODE> on a read or write error.
+</DL>
+</P><P>
+
+<A NAME="IDX30"></A>
+<DL>
+<DT><U>Function:</U> int <B>append_history</B> <I>(int nelements, const char *filename)</I>
+<DD>Append the last <VAR>nelements</VAR> of the history list to <VAR>filename</VAR>.
+If <VAR>filename</VAR> is <CODE>NULL</CODE>, then append to <TT>`~/.history'</TT>.
+Returns 0 on success, or <CODE>errno</CODE> on a read or write error.
+</DL>
+</P><P>
+
+<A NAME="IDX31"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_truncate_file</B> <I>(const char *filename, int nlines)</I>
+<DD>Truncate the history file <VAR>filename</VAR>, leaving only the last
+<VAR>nlines</VAR> lines.
+If <VAR>filename</VAR> is <CODE>NULL</CODE>, then <TT>`~/.history'</TT> is truncated.
+Returns 0 on success, or <CODE>errno</CODE> on failure.
+</DL>
+</P><P>
+
+<A NAME="History Expansion"></A>
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.3.7 History Expansion </H3>
+<!--docid::SEC16::-->
+<P>
+
+These functions implement history expansion.
+</P><P>
+
+<A NAME="IDX32"></A>
+<DL>
+<DT><U>Function:</U> int <B>history_expand</B> <I>(char *string, char **output)</I>
+<DD>Expand <VAR>string</VAR>, placing the result into <VAR>output</VAR>, a pointer
+to a string (see section <A HREF="history.html#SEC2">1.1 History Expansion</A>).  Returns:
+<DL COMPACT>
+<DT><CODE>0</CODE>
+<DD>If no expansions took place (or, if the only change in
+the text was the removal of escape characters preceding the history expansion
+character);
+<DT><CODE>1</CODE>
+<DD>if expansions did take place;
+<DT><CODE>-1</CODE>
+<DD>if there was an error in expansion;
+<DT><CODE>2</CODE>
+<DD>if the returned line should be displayed, but not executed,
+as with the <CODE>:p</CODE> modifier (see section <A HREF="history.html#SEC5">1.1.3 Modifiers</A>).
+</DL>
+<P>
+
+If an error ocurred in expansion, then <VAR>output</VAR> contains a descriptive
+error message.
+</DL>
+</P><P>
+
+<A NAME="IDX33"></A>
+<DL>
+<DT><U>Function:</U> char * <B>get_history_event</B> <I>(const char *string, int *cindex, int qchar)</I>
+<DD>Returns the text of the history event beginning at <VAR>string</VAR> +
+<VAR>*cindex</VAR>.  <VAR>*cindex</VAR> is modified to point to after the event
+specifier.  At function entry, <VAR>cindex</VAR> points to the index into
+<VAR>string</VAR> where the history event specification begins.  <VAR>qchar</VAR>
+is a character that is allowed to end the event specification in addition
+to the "normal" terminating characters.
+</DL>
+</P><P>
+
+<A NAME="IDX34"></A>
+<DL>
+<DT><U>Function:</U> char ** <B>history_tokenize</B> <I>(const char *string)</I>
+<DD>Return an array of tokens parsed out of <VAR>string</VAR>, much as the
+shell might.  The tokens are split on the characters in the
+<VAR>history_word_delimiters</VAR> variable,
+and shell quoting conventions are obeyed.
+</DL>
+</P><P>
+
+<A NAME="IDX35"></A>
+<DL>
+<DT><U>Function:</U> char * <B>history_arg_extract</B> <I>(int first, int last, const char *string)</I>
+<DD>Extract a string segment consisting of the <VAR>first</VAR> through <VAR>last</VAR>
+arguments present in <VAR>string</VAR>.  Arguments are split using
+<CODE>history_tokenize</CODE>.
+</DL>
+</P><P>
+
+<A NAME="History Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC18"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.4 History Variables </H2>
+<!--docid::SEC17::-->
+<P>
+
+This section describes the externally-visible variables exported by
+the GNU History Library.
+</P><P>
+
+<A NAME="IDX36"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_base</B>
+<DD>The logical offset of the first entry in the history list.
+</DL>
+</P><P>
+
+<A NAME="IDX37"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_length</B>
+<DD>The number of entries currently stored in the history list.
+</DL>
+</P><P>
+
+<A NAME="IDX38"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_max_entries</B>
+<DD>The maximum number of history entries.  This must be changed using
+<CODE>stifle_history()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX39"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_write_timestamps</B>
+<DD>If non-zero, timestamps are written to the history file, so they can be
+preserved between sessions.  The default value is 0, meaning that
+timestamps are not saved.
+</DL>
+</P><P>
+
+<A NAME="IDX40"></A>
+<DL>
+<DT><U>Variable:</U> char <B>history_expansion_char</B>
+<DD>The character that introduces a history event.  The default is <SAMP>`!'</SAMP>.
+Setting this to 0 inhibits history expansion.
+</DL>
+</P><P>
+
+<A NAME="IDX41"></A>
+<DL>
+<DT><U>Variable:</U> char <B>history_subst_char</B>
+<DD>The character that invokes word substitution if found at the start of
+a line.  The default is <SAMP>`^'</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX42"></A>
+<DL>
+<DT><U>Variable:</U> char <B>history_comment_char</B>
+<DD>During tokenization, if this character is seen as the first character
+of a word, then it and all subsequent characters up to a newline are
+ignored, suppressing history expansion for the remainder of the line.
+This is disabled by default.
+</DL>
+</P><P>
+
+<A NAME="IDX43"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>history_word_delimiters</B>
+<DD>The characters that separate tokens for <CODE>history_tokenize()</CODE>.
+The default value is <CODE>" \t\n()<>;&|"</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX44"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>history_search_delimiter_chars</B>
+<DD>The list of additional characters which can delimit a history search
+string, in addition to space, TAB, <SAMP>`:'</SAMP> and <SAMP>`?'</SAMP> in the case of
+a substring search.  The default is empty.
+</DL>
+</P><P>
+
+<A NAME="IDX45"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>history_no_expand_chars</B>
+<DD>The list of characters which inhibit history expansion if found immediately
+following <VAR>history_expansion_char</VAR>.  The default is space, tab, newline,
+carriage return, and <SAMP>`='</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX46"></A>
+<DL>
+<DT><U>Variable:</U> int <B>history_quotes_inhibit_expansion</B>
+<DD>If non-zero, single-quoted words are not scanned for the history expansion
+character.  The default value is 0.
+</DL>
+</P><P>
+
+<A NAME="IDX47"></A>
+<DL>
+<DT><U>Variable:</U> rl_linebuf_func_t * <B>history_inhibit_expansion_function</B>
+<DD>This should be set to the address of a function that takes two arguments:
+a <CODE>char *</CODE> (<VAR>string</VAR>)
+and an <CODE>int</CODE> index into that string (<VAR>i</VAR>).
+It should return a non-zero value if the history expansion starting at
+<VAR>string[i]</VAR> should not be performed; zero if the expansion should
+be done.
+It is intended for use by applications like Bash that use the history
+expansion character for additional purposes.
+By default, this variable is set to <CODE>NULL</CODE>.
+</DL>
+</P><P>
+
+<A NAME="History Programming Example"></A>
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.5 History Programming Example </H2>
+<!--docid::SEC18::-->
+<P>
+
+The following program demonstrates simple use of the GNU History Library.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>#include &#60;stdio.h&#62;
+#include &#60;readline/history.h&#62;
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char line[1024], *t;
+  int len, done = 0;
+
+  line[0] = 0;
+
+  using_history ();
+  while (!done)
+    {
+      printf ("history$ ");
+      fflush (stdout);
+      t = fgets (line, sizeof (line) - 1, stdin);
+      if (t &#38;&#38; *t)
+        {
+          len = strlen (t);
+          if (t[len - 1] == '\n')
+            t[len - 1] = '\0';
+        }
+
+      if (!t)
+        strcpy (line, "quit");
+
+      if (line[0])
+        {
+          char *expansion;
+          int result;
+
+          result = history_expand (line, &#38;expansion);
+          if (result)
+            fprintf (stderr, "%s\n", expansion);
+
+          if (result &#60; 0 || result == 2)
+            {
+              free (expansion);
+              continue;
+            }
+
+          add_history (expansion);
+          strncpy (line, expansion, sizeof (line) - 1);
+          free (expansion);
+        }
+
+      if (strcmp (line, "quit") == 0)
+        done = 1;
+      else if (strcmp (line, "save") == 0)
+        write_history ("history_file");
+      else if (strcmp (line, "read") == 0)
+        read_history ("history_file");
+      else if (strcmp (line, "list") == 0)
+        {
+          register HIST_ENTRY **the_list;
+          register int i;
+
+          the_list = history_list ();
+          if (the_list)
+            for (i = 0; the_list[i]; i++)
+              printf ("%d: %s\n", i + history_base, the_list[i]-&#62;line);
+        }
+      else if (strncmp (line, "delete", 6) == 0)
+        {
+          int which;
+          if ((sscanf (line + 6, "%d", &#38;which)) == 1)
+            {
+              HIST_ENTRY *entry = remove_history (which);
+              if (!entry)
+                fprintf (stderr, "No such entry %d\n", which);
+              else
+                {
+                  free (entry-&#62;line);
+                  free (entry);
+                }
+            }
+          else
+            {
+              fprintf (stderr, "non-numeric arg given to `delete'\n");
+            }
+        }
+    }
+}
+</FONT></pre></td></tr></table></P><P>
+
+<A NAME="Copying This Manual"></A>
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC6"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> A. Copying This Manual </H1>
+<!--docid::SEC19::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="history.html#SEC20">A.1 GNU Free Documentation License</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">License for copying this manual.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="GNU Free Documentation License"></A>
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> A.1 GNU Free Documentation License </H2>
+<!--docid::SEC20::-->
+<P>
+
+<A NAME="IDX48"></A>
+<center>
+ Version 1.2, November 2002
+</center>
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></td></tr></table></P><P>
+
+<OL>
+<LI>
+PREAMBLE
+<P>
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document <EM>free</EM> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</P><P>
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</P><P>
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+</P><P>
+
+<LI>
+APPLICABILITY AND DEFINITIONS
+<P>
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</P><P>
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</P><P>
+
+A "Secondary Section" is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</P><P>
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+</P><P>
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</P><P>
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+</P><P>
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input
+format, <FONT SIZE="-1">SGML</FONT> or <FONT SIZE="-1">XML</FONT> using a publicly available
+<FONT SIZE="-1">DTD</FONT>, and standard-conforming simple <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> designed for human modification.  Examples
+of transparent image formats include <FONT SIZE="-1">PNG</FONT>, <FONT SIZE="-1">XCF</FONT> and
+<FONT SIZE="-1">JPG</FONT>.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <FONT SIZE="-1">SGML</FONT> or
+<FONT SIZE="-1">XML</FONT> for which the <FONT SIZE="-1">DTD</FONT> and/or processing tools are
+not generally available, and the machine-generated <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> produced by some word processors for
+output purposes only.
+</P><P>
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+</P><P>
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+</P><P>
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</P><P>
+
+<LI>
+VERBATIM COPYING
+<P>
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</P><P>
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</P><P>
+
+<LI>
+COPYING IN QUANTITY
+<P>
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</P><P>
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</P><P>
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</P><P>
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</P><P>
+
+<LI>
+MODIFICATIONS
+<P>
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+</P><P>
+
+<OL>
+<LI>
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+<P>
+
+<LI>
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+<P>
+
+<LI>
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+<P>
+
+<LI>
+Preserve all the copyright notices of the Document.
+<P>
+
+<LI>
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+<P>
+
+<LI>
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+<P>
+
+<LI>
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+<P>
+
+<LI>
+Include an unaltered copy of this License.
+<P>
+
+<LI>
+Preserve the section Entitled "History", Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled "History" in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+<P>
+
+<LI>
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the "History" section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+<P>
+
+<LI>
+For any section Entitled "Acknowledgements" or "Dedications", Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+<P>
+
+<LI>
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+<P>
+
+<LI>
+Delete any section Entitled "Endorsements".  Such a section
+may not be included in the Modified Version.
+<P>
+
+<LI>
+Do not retitle any existing section to be Entitled "Endorsements" or
+to conflict in title with any Invariant Section.
+<P>
+
+<LI>
+Preserve any Warranty Disclaimers.
+</OL>
+<P>
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+</P><P>
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</P><P>
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</P><P>
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</P><P>
+
+<LI>
+COMBINING DOCUMENTS
+<P>
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</P><P>
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</P><P>
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all
+sections Entitled "Endorsements."
+</P><P>
+
+<LI>
+COLLECTIONS OF DOCUMENTS
+<P>
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</P><P>
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</P><P>
+
+<LI>
+AGGREGATION WITH INDEPENDENT WORKS
+<P>
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</P><P>
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</P><P>
+
+<LI>
+TRANSLATION
+<P>
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</P><P>
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</P><P>
+
+<LI>
+TERMINATION
+<P>
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+</P><P>
+
+<LI>
+FUTURE REVISIONS OF THIS LICENSE
+<P>
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+</P><P>
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+</OL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC20"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> A.1.1 ADDENDUM: How to use this License for your documents </H3>
+<!--docid::SEC21::-->
+<P>
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>  Copyright (C)  <VAR>year</VAR>  <VAR>your name</VAR>.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>    with the Invariant Sections being <VAR>list their titles</VAR>, with
+    the Front-Cover Texts being <VAR>list</VAR>, and with the Back-Cover Texts
+    being <VAR>list</VAR>.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</P><P>
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</P><P>
+
+<A NAME="Concept Index"></A>
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> B. Concept Index </H1>
+<!--docid::SEC22::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="history.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX23">anchored search</A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#SEC3">event designators</A></TD><TD valign=top><A HREF="history.html#SEC3">1.1.1 Event Designators</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX48">FDL, GNU Free Documentation License</A></TD><TD valign=top><A HREF="history.html#SEC20">A.1 GNU Free Documentation License</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX1">history events</A></TD><TD valign=top><A HREF="history.html#SEC3">1.1.1 Event Designators</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#SEC2">history expansion</A></TD><TD valign=top><A HREF="history.html#SEC2">1.1 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#SEC14">History Searching</A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="history.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="history.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<A NAME="Function and Variable Index"></A>
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> C. Function and Variable Index </H1>
+<!--docid::SEC23::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="history.html#vr_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX5"><CODE>add_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX6"><CODE>add_history_time</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX30"><CODE>append_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX10"><CODE>clear_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX16"><CODE>current_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX8"><CODE>free_history_entry</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_G"></A>G</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX33"><CODE>get_history_event</CODE></A></TD><TD valign=top><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX35"><CODE>history_arg_extract</CODE></A></TD><TD valign=top><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX36"><CODE>history_base</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX42"><CODE>history_comment_char</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX32"><CODE>history_expand</CODE></A></TD><TD valign=top><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX40"><CODE>history_expansion_char</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX17"><CODE>history_get</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX3"><CODE>history_get_history_state</CODE></A></TD><TD valign=top><A HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX18"><CODE>history_get_time</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX47"><CODE>history_inhibit_expansion_function</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX13"><CODE>history_is_stifled</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX37"><CODE>history_length</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX14"><CODE>history_list</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX38"><CODE>history_max_entries</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX45"><CODE>history_no_expand_chars</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX46"><CODE>history_quotes_inhibit_expansion</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX24"><CODE>history_search</CODE></A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX44"><CODE>history_search_delimiter_chars</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX26"><CODE>history_search_pos</CODE></A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX25"><CODE>history_search_prefix</CODE></A></TD><TD valign=top><A HREF="history.html#SEC14">2.3.5 Searching the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX4"><CODE>history_set_history_state</CODE></A></TD><TD valign=top><A HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX20"><CODE>history_set_pos</CODE></A></TD><TD valign=top><A HREF="history.html#SEC13">2.3.4 Moving Around the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX41"><CODE>history_subst_char</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX34"><CODE>history_tokenize</CODE></A></TD><TD valign=top><A HREF="history.html#SEC16">2.3.7 History Expansion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX19"><CODE>history_total_bytes</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX31"><CODE>history_truncate_file</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX43"><CODE>history_word_delimiters</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX39"><CODE>history_write_timestamps</CODE></A></TD><TD valign=top><A HREF="history.html#SEC17">2.4 History Variables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX22"><CODE>next_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC13">2.3.4 Moving Around the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX21"><CODE>previous_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC13">2.3.4 Moving Around the History List</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX27"><CODE>read_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX28"><CODE>read_history_range</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX7"><CODE>remove_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX9"><CODE>replace_history_entry</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX11"><CODE>stifle_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX12"><CODE>unstifle_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC11">2.3.2 History List Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX2"><CODE>using_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_W"></A>W</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX15"><CODE>where_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC12">2.3.3 Information About the History List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="history.html#IDX29"><CODE>write_history</CODE></A></TD><TD valign=top><A HREF="history.html#SEC15">2.3.6 Managing the History File</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="history.html#vr_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="history.html#vr_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<HR SIZE="6">
+<A NAME="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Table of Contents</H1>
+<UL>
+<A NAME="TOC1" HREF="history.html#SEC1">1. Using History Interactively</A>
+<BR>
+<UL>
+<A NAME="TOC2" HREF="history.html#SEC2">1.1 History Expansion</A>
+<BR>
+<UL>
+<A NAME="TOC3" HREF="history.html#SEC3">1.1.1 Event Designators</A>
+<BR>
+<A NAME="TOC4" HREF="history.html#SEC4">1.1.2 Word Designators</A>
+<BR>
+<A NAME="TOC5" HREF="history.html#SEC5">1.1.3 Modifiers</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC6" HREF="history.html#SEC6">2. Programming with GNU History</A>
+<BR>
+<UL>
+<A NAME="TOC7" HREF="history.html#SEC7">2.1 Introduction to History</A>
+<BR>
+<A NAME="TOC8" HREF="history.html#SEC8">2.2 History Storage</A>
+<BR>
+<A NAME="TOC9" HREF="history.html#SEC9">2.3 History Functions</A>
+<BR>
+<UL>
+<A NAME="TOC10" HREF="history.html#SEC10">2.3.1 Initializing History and State Management</A>
+<BR>
+<A NAME="TOC11" HREF="history.html#SEC11">2.3.2 History List Management</A>
+<BR>
+<A NAME="TOC12" HREF="history.html#SEC12">2.3.3 Information About the History List</A>
+<BR>
+<A NAME="TOC13" HREF="history.html#SEC13">2.3.4 Moving Around the History List</A>
+<BR>
+<A NAME="TOC14" HREF="history.html#SEC14">2.3.5 Searching the History List</A>
+<BR>
+<A NAME="TOC15" HREF="history.html#SEC15">2.3.6 Managing the History File</A>
+<BR>
+<A NAME="TOC16" HREF="history.html#SEC16">2.3.7 History Expansion</A>
+<BR>
+</UL>
+<A NAME="TOC17" HREF="history.html#SEC17">2.4 History Variables</A>
+<BR>
+<A NAME="TOC18" HREF="history.html#SEC18">2.5 History Programming Example</A>
+<BR>
+</UL>
+<A NAME="TOC19" HREF="history.html#SEC19">A. Copying This Manual</A>
+<BR>
+<UL>
+<A NAME="TOC20" HREF="history.html#SEC20">A.1 GNU Free Documentation License</A>
+<BR>
+<UL>
+<A NAME="TOC21" HREF="history.html#SEC21">A.1.1 ADDENDUM: How to use this License for your documents</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC22" HREF="history.html#SEC22">B. Concept Index</A>
+<BR>
+<A NAME="TOC23" HREF="history.html#SEC23">C. Function and Variable Index</A>
+<BR>
+</UL>
+<HR SIZE=1>
+<A NAME="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="history.html#SEC1">1. Using History Interactively</A>
+<BR>
+<A NAME="TOC6" HREF="history.html#SEC6">2. Programming with GNU History</A>
+<BR>
+<A NAME="TOC19" HREF="history.html#SEC19">A. Copying This Manual</A>
+<BR>
+<A NAME="TOC22" HREF="history.html#SEC22">B. Concept Index</A>
+<BR>
+<A NAME="TOC23" HREF="history.html#SEC23">C. Function and Variable Index</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<A NAME="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC22">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="history.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>About this document</H1>
+This document was generated by <I>Chet Ramey</I> on <I>September, 22  2003</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+<P></P>  
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+previous or up-and-previous section 
+</TD>
+<TD>
+1.1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next or up-and-next section
+</TD>
+<TD>
+1.3
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+
+<HR SIZE=1>
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+by <I>Chet Ramey</I> on <I>September, 22  2003</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/lib/readline/doc/history.info b/lib/readline/doc/history.info
new file mode 100644 (file)
index 0000000..70bbb62
--- /dev/null
@@ -0,0 +1,1317 @@
+This is history.info, produced by makeinfo version 4.5 from
+./history.texi.
+
+This document describes the GNU History library (version 5.0, 19
+September 2003), a programming tool that provides a consistent user
+interface for recalling lines of previously typed input.
+
+   Copyright (C) 1988-2003 Free Software Foundation, Inc.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.1 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual," and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License."
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+   
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* History: (history).       The GNU history library API.
+END-INFO-DIR-ENTRY
+
+\1f
+File: history.info,  Node: Top,  Next: Using History Interactively,  Up: (dir)
+
+GNU History Library
+*******************
+
+   This document describes the GNU History library, a programming tool
+that provides a consistent user interface for recalling lines of
+previously typed input.
+
+* Menu:
+
+* Using History Interactively::          GNU History User's Manual.
+* Programming with GNU History::  GNU History Programmer's Manual.
+* Copying This Manual::                  Copying This Manual.
+* Concept Index::                Index of concepts described in this manual.
+* Function and Variable Index::          Index of externally visible functions
+                                 and variables.
+
+\1f
+File: history.info,  Node: Using History Interactively,  Next: Programming with GNU History,  Prev: Top,  Up: Top
+
+Using History Interactively
+***************************
+
+   This chapter describes how to use the GNU History Library
+interactively, from a user's standpoint.  It should be considered a
+user's guide.  For information on using the GNU History Library in your
+own programs, *note Programming with GNU History::.
+
+* Menu:
+
+* History Interaction::                What it feels like using History as a user.
+
+\1f
+File: history.info,  Node: History Interaction,  Up: Using History Interactively
+
+History Expansion
+=================
+
+   The History library provides a history expansion feature that is
+similar to the history expansion provided by `csh'.  This section
+describes the syntax used to manipulate the history information.
+
+   History expansions introduce words from the history list into the
+input stream, making it easy to repeat commands, insert the arguments
+to a previous command into the current input line, or fix errors in
+previous commands quickly.
+
+   History expansion takes place in two parts.  The first is to
+determine which line from the history list should be used during
+substitution.  The second is to select portions of that line for
+inclusion into the current one.  The line selected from the history is
+called the "event", and the portions of that line that are acted upon
+are called "words".  Various "modifiers" are available to manipulate
+the selected words.  The line is broken into words in the same fashion
+that Bash does, so that several words surrounded by quotes are
+considered one word.  History expansions are introduced by the
+appearance of the history expansion character, which is `!' by default.
+
+* Menu:
+
+* Event Designators::  How to specify which history line to use.
+* Word Designators::   Specifying which words are of interest.
+* Modifiers::          Modifying the results of substitution.
+
+\1f
+File: history.info,  Node: Event Designators,  Next: Word Designators,  Up: History Interaction
+
+Event Designators
+-----------------
+
+   An event designator is a reference to a command line entry in the
+history list.
+
+`!'
+     Start a history substitution, except when followed by a space, tab,
+     the end of the line, or `='.
+
+`!N'
+     Refer to command line N.
+
+`!-N'
+     Refer to the command N lines back.
+
+`!!'
+     Refer to the previous command.  This is a synonym for `!-1'.
+
+`!STRING'
+     Refer to the most recent command starting with STRING.
+
+`!?STRING[?]'
+     Refer to the most recent command containing STRING.  The trailing
+     `?' may be omitted if the STRING is followed immediately by a
+     newline.
+
+`^STRING1^STRING2^'
+     Quick Substitution.  Repeat the last command, replacing STRING1
+     with STRING2.  Equivalent to `!!:s/STRING1/STRING2/'.
+
+`!#'
+     The entire command line typed so far.
+
+
+\1f
+File: history.info,  Node: Word Designators,  Next: Modifiers,  Prev: Event Designators,  Up: History Interaction
+
+Word Designators
+----------------
+
+   Word designators are used to select desired words from the event.  A
+`:' separates the event specification from the word designator.  It may
+be omitted if the word designator begins with a `^', `$', `*', `-', or
+`%'.  Words are numbered from the beginning of the line, with the first
+word being denoted by 0 (zero).  Words are inserted into the current
+line separated by single spaces.
+
+   For example,
+
+`!!'
+     designates the preceding command.  When you type this, the
+     preceding command is repeated in toto.
+
+`!!:$'
+     designates the last argument of the preceding command.  This may be
+     shortened to `!$'.
+
+`!fi:2'
+     designates the second argument of the most recent command starting
+     with the letters `fi'.
+
+   Here are the word designators:
+
+`0 (zero)'
+     The `0'th word.  For many applications, this is the command word.
+
+`N'
+     The Nth word.
+
+`^'
+     The first argument; that is, word 1.
+
+`$'
+     The last argument.
+
+`%'
+     The word matched by the most recent `?STRING?' search.
+
+`X-Y'
+     A range of words; `-Y' abbreviates `0-Y'.
+
+`*'
+     All of the words, except the `0'th.  This is a synonym for `1-$'.
+     It is not an error to use `*' if there is just one word in the
+     event; the empty string is returned in that case.
+
+`X*'
+     Abbreviates `X-$'
+
+`X-'
+     Abbreviates `X-$' like `X*', but omits the last word.
+
+
+   If a word designator is supplied without an event specification, the
+previous command is used as the event.
+
+\1f
+File: history.info,  Node: Modifiers,  Prev: Word Designators,  Up: History Interaction
+
+Modifiers
+---------
+
+   After the optional word designator, you can add a sequence of one or
+more of the following modifiers, each preceded by a `:'.
+
+`h'
+     Remove a trailing pathname component, leaving only the head.
+
+`t'
+     Remove all leading  pathname  components, leaving the tail.
+
+`r'
+     Remove a trailing suffix of the form `.SUFFIX', leaving the
+     basename.
+
+`e'
+     Remove all but the trailing suffix.
+
+`p'
+     Print the new command but do not execute it.
+
+`s/OLD/NEW/'
+     Substitute NEW for the first occurrence of OLD in the event line.
+     Any delimiter may be used in place of `/'.  The delimiter may be
+     quoted in OLD and NEW with a single backslash.  If `&' appears in
+     NEW, it is replaced by OLD.  A single backslash will quote the
+     `&'.  The final delimiter is optional if it is the last character
+     on the input line.
+
+`&'
+     Repeat the previous substitution.
+
+`g'
+`a'
+     Cause changes to be applied over the entire event line.  Used in
+     conjunction with `s', as in `gs/OLD/NEW/', or with `&'.
+
+`G'
+     Apply the following `s' modifier once to each word in the event.
+
+
+\1f
+File: history.info,  Node: Programming with GNU History,  Next: Copying This Manual,  Prev: Using History Interactively,  Up: Top
+
+Programming with GNU History
+****************************
+
+   This chapter describes how to interface programs that you write with
+the GNU History Library.  It should be considered a technical guide.
+For information on the interactive use of GNU History, *note Using
+History Interactively::.
+
+* Menu:
+
+* Introduction to History::    What is the GNU History library for?
+* History Storage::            How information is stored.
+* History Functions::          Functions that you can use.
+* History Variables::          Variables that control behaviour.
+* History Programming Example::        Example of using the GNU History Library.
+
+\1f
+File: history.info,  Node: Introduction to History,  Next: History Storage,  Up: Programming with GNU History
+
+Introduction to History
+=======================
+
+   Many programs read input from the user a line at a time.  The GNU
+History library is able to keep track of those lines, associate
+arbitrary data with each line, and utilize information from previous
+lines in composing new ones.
+
+   The programmer using the History library has available functions for
+remembering lines on a history list, associating arbitrary data with a
+line, removing lines from the list, searching through the list for a
+line containing an arbitrary text string, and referencing any line in
+the list directly.  In addition, a history "expansion" function is
+available which provides for a consistent user interface across
+different programs.
+
+   The user using programs written with the History library has the
+benefit of a consistent user interface with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands.  The basic history manipulation commands are similar to
+the history substitution provided by `csh'.
+
+   If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of command line editing.
+
+   Before declaring any functions using any functionality the History
+library provides in other code, an application writer should include
+the file `<readline/history.h>' in any file that uses the History
+library's features.  It supplies extern declarations for all of the
+library's public functions and variables, and declares all of the
+public data structures.
+
+\1f
+File: history.info,  Node: History Storage,  Next: History Functions,  Prev: Introduction to History,  Up: Programming with GNU History
+
+History Storage
+===============
+
+   The history list is an array of history entries.  A history entry is
+declared as follows:
+
+     typedef void *histdata_t;
+     
+     typedef struct _hist_entry {
+       char *line;
+       char *timestamp;
+       histdata_t data;
+     } HIST_ENTRY;
+
+   The history list itself might therefore be declared as
+
+     HIST_ENTRY **the_history_list;
+
+   The state of the History library is encapsulated into a single
+structure:
+
+     /*
+      * A structure used to pass around the current state of the history.
+      */
+     typedef struct _hist_state {
+       HIST_ENTRY **entries; /* Pointer to the entries themselves. */
+       int offset;           /* The location pointer within this array. */
+       int length;           /* Number of elements within this array. */
+       int size;             /* Number of slots allocated to this array. */
+       int flags;
+     } HISTORY_STATE;
+
+   If the flags member includes `HS_STIFLED', the history has been
+stifled.
+
+\1f
+File: history.info,  Node: History Functions,  Next: History Variables,  Prev: History Storage,  Up: Programming with GNU History
+
+History Functions
+=================
+
+   This section describes the calling sequence for the various functions
+exported by the GNU History library.
+
+* Menu:
+
+* Initializing History and State Management::  Functions to call when you
+                                               want to use history in a
+                                               program.
+* History List Management::            Functions used to manage the list
+                                       of history entries.
+* Information About the History List:: Functions returning information about
+                                       the history list.
+* Moving Around the History List::     Functions used to change the position
+                                       in the history list.
+* Searching the History List::         Functions to search the history list
+                                       for entries containing a string.
+* Managing the History File::          Functions that read and write a file
+                                       containing the history list.
+* History Expansion::                  Functions to perform csh-like history
+                                       expansion.
+
+\1f
+File: history.info,  Node: Initializing History and State Management,  Next: History List Management,  Up: History Functions
+
+Initializing History and State Management
+-----------------------------------------
+
+   This section describes functions used to initialize and manage the
+state of the History library when you want to use the history functions
+in your program.
+
+ - Function: void using_history (void)
+     Begin a session in which the history functions might be used.  This
+     initializes the interactive variables.
+
+ - Function: HISTORY_STATE * history_get_history_state (void)
+     Return a structure describing the current state of the input
+     history.
+
+ - Function: void history_set_history_state (HISTORY_STATE *state)
+     Set the state of the history list according to STATE.
+
+\1f
+File: history.info,  Node: History List Management,  Next: Information About the History List,  Prev: Initializing History and State Management,  Up: History Functions
+
+History List Management
+-----------------------
+
+   These functions manage individual entries on the history list, or set
+parameters managing the list itself.
+
+ - Function: void add_history (const char *string)
+     Place STRING at the end of the history list.  The associated data
+     field (if any) is set to `NULL'.
+
+ - Function: void add_history_time (const char *string)
+     Change the time stamp associated with the most recent history
+     entry to STRING.
+
+ - Function: HIST_ENTRY * remove_history (int which)
+     Remove history entry at offset WHICH from the history.  The
+     removed element is returned so you can free the line, data, and
+     containing structure.
+
+ - Function: histdata_t free_history_entry (HIST_ENTRY *histent)
+     Free the history entry HISTENT and any history library private
+     data associated with it.  Returns the application-specific data so
+     the caller can dispose of it.
+
+ - Function: HIST_ENTRY * replace_history_entry (int which, const char
+          *line, histdata_t data)
+     Make the history entry at offset WHICH have LINE and DATA.  This
+     returns the old entry so the caller can dispose of any
+     application-specific data.  In the case of an invalid WHICH, a
+     `NULL' pointer is returned.
+
+ - Function: void clear_history (void)
+     Clear the history list by deleting all the entries.
+
+ - Function: void stifle_history (int max)
+     Stifle the history list, remembering only the last MAX entries.
+
+ - Function: int unstifle_history (void)
+     Stop stifling the history.  This returns the previously-set
+     maximum number of history entries (as set by `stifle_history()').
+     The value is positive if the history was stifled, negative if it
+     wasn't.
+
+ - Function: int history_is_stifled (void)
+     Returns non-zero if the history is stifled, zero if it is not.
+
+\1f
+File: history.info,  Node: Information About the History List,  Next: Moving Around the History List,  Prev: History List Management,  Up: History Functions
+
+Information About the History List
+----------------------------------
+
+   These functions return information about the entire history list or
+individual list entries.
+
+ - Function: HIST_ENTRY ** history_list (void)
+     Return a `NULL' terminated array of `HIST_ENTRY *' which is the
+     current input history.  Element 0 of this list is the beginning of
+     time.  If there is no history, return `NULL'.
+
+ - Function: int where_history (void)
+     Returns the offset of the current history element.
+
+ - Function: HIST_ENTRY * current_history (void)
+     Return the history entry at the current position, as determined by
+     `where_history()'.  If there is no entry there, return a `NULL'
+     pointer.
+
+ - Function: HIST_ENTRY * history_get (int offset)
+     Return the history entry at position OFFSET, starting from
+     `history_base' (*note History Variables::).  If there is no entry
+     there, or if OFFSET is greater than the history length, return a
+     `NULL' pointer.
+
+ - Function: time_t history_get_time (HIST_ENTRY *entry)
+     Return the time stamp associated with the history entry ENTRY.
+
+ - Function: int history_total_bytes (void)
+     Return the number of bytes that the primary history entries are
+     using.  This function returns the sum of the lengths of all the
+     lines in the history.
+
+\1f
+File: history.info,  Node: Moving Around the History List,  Next: Searching the History List,  Prev: Information About the History List,  Up: History Functions
+
+Moving Around the History List
+------------------------------
+
+   These functions allow the current index into the history list to be
+set or changed.
+
+ - Function: int history_set_pos (int pos)
+     Set the current history offset to POS, an absolute index into the
+     list.  Returns 1 on success, 0 if POS is less than zero or greater
+     than the number of history entries.
+
+ - Function: HIST_ENTRY * previous_history (void)
+     Back up the current history offset to the previous history entry,
+     and return a pointer to that entry.  If there is no previous
+     entry, return a `NULL' pointer.
+
+ - Function: HIST_ENTRY * next_history (void)
+     Move the current history offset forward to the next history entry,
+     and return the a pointer to that entry.  If there is no next
+     entry, return a `NULL' pointer.
+
+\1f
+File: history.info,  Node: Searching the History List,  Next: Managing the History File,  Prev: Moving Around the History List,  Up: History Functions
+
+Searching the History List
+--------------------------
+
+   These functions allow searching of the history list for entries
+containing a specific string.  Searching may be performed both forward
+and backward from the current history position.  The search may be
+"anchored", meaning that the string must match at the beginning of the
+history entry.
+
+ - Function: int history_search (const char *string, int direction)
+     Search the history for STRING, starting at the current history
+     offset.  If DIRECTION is less than 0, then the search is through
+     previous entries, otherwise through subsequent entries.  If STRING
+     is found, then the current history index is set to that history
+     entry, and the value returned is the offset in the line of the
+     entry where STRING was found.  Otherwise, nothing is changed, and
+     a -1 is returned.
+
+ - Function: int history_search_prefix (const char *string, int
+          direction)
+     Search the history for STRING, starting at the current history
+     offset.  The search is anchored: matching lines must begin with
+     STRING.  If DIRECTION is less than 0, then the search is through
+     previous entries, otherwise through subsequent entries.  If STRING
+     is found, then the current history index is set to that entry, and
+     the return value is 0.  Otherwise, nothing is changed, and a -1 is
+     returned.
+
+ - Function: int history_search_pos (const char *string, int direction,
+          int pos)
+     Search for STRING in the history list, starting at POS, an
+     absolute index into the list.  If DIRECTION is negative, the search
+     proceeds backward from POS, otherwise forward.  Returns the
+     absolute index of the history element where STRING was found, or
+     -1 otherwise.
+
+\1f
+File: history.info,  Node: Managing the History File,  Next: History Expansion,  Prev: Searching the History List,  Up: History Functions
+
+Managing the History File
+-------------------------
+
+   The History library can read the history from and write it to a file.
+This section documents the functions for managing a history file.
+
+ - Function: int read_history (const char *filename)
+     Add the contents of FILENAME to the history list, a line at a time.
+     If FILENAME is `NULL', then read from `~/.history'.  Returns 0 if
+     successful, or `errno' if not.
+
+ - Function: int read_history_range (const char *filename, int from,
+          int to)
+     Read a range of lines from FILENAME, adding them to the history
+     list.  Start reading at line FROM and end at TO.  If FROM is zero,
+     start at the beginning.  If TO is less than FROM, then read until
+     the end of the file.  If FILENAME is `NULL', then read from
+     `~/.history'.  Returns 0 if successful, or `errno' if not.
+
+ - Function: int write_history (const char *filename)
+     Write the current history to FILENAME, overwriting FILENAME if
+     necessary.  If FILENAME is `NULL', then write the history list to
+     `~/.history'.  Returns 0 on success, or `errno' on a read or write
+     error.
+
+ - Function: int append_history (int nelements, const char *filename)
+     Append the last NELEMENTS of the history list to FILENAME.  If
+     FILENAME is `NULL', then append to `~/.history'.  Returns 0 on
+     success, or `errno' on a read or write error.
+
+ - Function: int history_truncate_file (const char *filename, int
+          nlines)
+     Truncate the history file FILENAME, leaving only the last NLINES
+     lines.  If FILENAME is `NULL', then `~/.history' is truncated.
+     Returns 0 on success, or `errno' on failure.
+
+\1f
+File: history.info,  Node: History Expansion,  Prev: Managing the History File,  Up: History Functions
+
+History Expansion
+-----------------
+
+   These functions implement history expansion.
+
+ - Function: int history_expand (char *string, char **output)
+     Expand STRING, placing the result into OUTPUT, a pointer to a
+     string (*note History Interaction::).  Returns:
+    `0'
+          If no expansions took place (or, if the only change in the
+          text was the removal of escape characters preceding the
+          history expansion character);
+
+    `1'
+          if expansions did take place;
+
+    `-1'
+          if there was an error in expansion;
+
+    `2'
+          if the returned line should be displayed, but not executed,
+          as with the `:p' modifier (*note Modifiers::).
+
+     If an error ocurred in expansion, then OUTPUT contains a
+     descriptive error message.
+
+ - Function: char * get_history_event (const char *string, int *cindex,
+          int qchar)
+     Returns the text of the history event beginning at STRING +
+     *CINDEX.  *CINDEX is modified to point to after the event
+     specifier.  At function entry, CINDEX points to the index into
+     STRING where the history event specification begins.  QCHAR is a
+     character that is allowed to end the event specification in
+     addition to the "normal" terminating characters.
+
+ - Function: char ** history_tokenize (const char *string)
+     Return an array of tokens parsed out of STRING, much as the shell
+     might.  The tokens are split on the characters in the
+     HISTORY_WORD_DELIMITERS variable, and shell quoting conventions
+     are obeyed.
+
+ - Function: char * history_arg_extract (int first, int last, const
+          char *string)
+     Extract a string segment consisting of the FIRST through LAST
+     arguments present in STRING.  Arguments are split using
+     `history_tokenize'.
+
+\1f
+File: history.info,  Node: History Variables,  Next: History Programming Example,  Prev: History Functions,  Up: Programming with GNU History
+
+History Variables
+=================
+
+   This section describes the externally-visible variables exported by
+the GNU History Library.
+
+ - Variable: int history_base
+     The logical offset of the first entry in the history list.
+
+ - Variable: int history_length
+     The number of entries currently stored in the history list.
+
+ - Variable: int history_max_entries
+     The maximum number of history entries.  This must be changed using
+     `stifle_history()'.
+
+ - Variable: int history_write_timestamps
+     If non-zero, timestamps are written to the history file, so they
+     can be preserved between sessions.  The default value is 0,
+     meaning that timestamps are not saved.
+
+ - Variable: char history_expansion_char
+     The character that introduces a history event.  The default is `!'.
+     Setting this to 0 inhibits history expansion.
+
+ - Variable: char history_subst_char
+     The character that invokes word substitution if found at the start
+     of a line.  The default is `^'.
+
+ - Variable: char history_comment_char
+     During tokenization, if this character is seen as the first
+     character of a word, then it and all subsequent characters up to a
+     newline are ignored, suppressing history expansion for the
+     remainder of the line.  This is disabled by default.
+
+ - Variable: char * history_word_delimiters
+     The characters that separate tokens for `history_tokenize()'.  The
+     default value is `" \t\n()<>;&|"'.
+
+ - Variable: char * history_search_delimiter_chars
+     The list of additional characters which can delimit a history
+     search string, in addition to space, TAB, `:' and `?' in the case
+     of a substring search.  The default is empty.
+
+ - Variable: char * history_no_expand_chars
+     The list of characters which inhibit history expansion if found
+     immediately following HISTORY_EXPANSION_CHAR.  The default is
+     space, tab, newline, carriage return, and `='.
+
+ - Variable: int history_quotes_inhibit_expansion
+     If non-zero, single-quoted words are not scanned for the history
+     expansion character.  The default value is 0.
+
+ - Variable: rl_linebuf_func_t * history_inhibit_expansion_function
+     This should be set to the address of a function that takes two
+     arguments: a `char *' (STRING) and an `int' index into that string
+     (I).  It should return a non-zero value if the history expansion
+     starting at STRING[I] should not be performed; zero if the
+     expansion should be done.  It is intended for use by applications
+     like Bash that use the history expansion character for additional
+     purposes.  By default, this variable is set to `NULL'.
+
+\1f
+File: history.info,  Node: History Programming Example,  Prev: History Variables,  Up: Programming with GNU History
+
+History Programming Example
+===========================
+
+   The following program demonstrates simple use of the GNU History
+Library.
+
+     #include <stdio.h>
+     #include <readline/history.h>
+     
+     main (argc, argv)
+          int argc;
+          char **argv;
+     {
+       char line[1024], *t;
+       int len, done = 0;
+     
+       line[0] = 0;
+     
+       using_history ();
+       while (!done)
+         {
+           printf ("history$ ");
+           fflush (stdout);
+           t = fgets (line, sizeof (line) - 1, stdin);
+           if (t && *t)
+             {
+               len = strlen (t);
+               if (t[len - 1] == '\n')
+                 t[len - 1] = '\0';
+             }
+     
+           if (!t)
+             strcpy (line, "quit");
+     
+           if (line[0])
+             {
+               char *expansion;
+               int result;
+     
+               result = history_expand (line, &expansion);
+               if (result)
+                 fprintf (stderr, "%s\n", expansion);
+     
+               if (result < 0 || result == 2)
+                 {
+                   free (expansion);
+                   continue;
+                 }
+     
+               add_history (expansion);
+               strncpy (line, expansion, sizeof (line) - 1);
+               free (expansion);
+             }
+     
+           if (strcmp (line, "quit") == 0)
+             done = 1;
+           else if (strcmp (line, "save") == 0)
+             write_history ("history_file");
+           else if (strcmp (line, "read") == 0)
+             read_history ("history_file");
+           else if (strcmp (line, "list") == 0)
+             {
+               register HIST_ENTRY **the_list;
+               register int i;
+     
+               the_list = history_list ();
+               if (the_list)
+                 for (i = 0; the_list[i]; i++)
+                   printf ("%d: %s\n", i + history_base, the_list[i]->line);
+             }
+           else if (strncmp (line, "delete", 6) == 0)
+             {
+               int which;
+               if ((sscanf (line + 6, "%d", &which)) == 1)
+                 {
+                   HIST_ENTRY *entry = remove_history (which);
+                   if (!entry)
+                     fprintf (stderr, "No such entry %d\n", which);
+                   else
+                     {
+                       free (entry->line);
+                       free (entry);
+                     }
+                 }
+               else
+                 {
+                   fprintf (stderr, "non-numeric arg given to `delete'\n");
+                 }
+             }
+         }
+     }
+
+\1f
+File: history.info,  Node: Copying This Manual,  Next: Concept Index,  Prev: Programming with GNU History,  Up: Top
+
+Copying This Manual
+*******************
+
+* Menu:
+
+* GNU Free Documentation License::     License for copying this manual.
+
+\1f
+File: history.info,  Node: GNU Free Documentation License,  Up: Copying This Manual
+
+GNU Free Documentation License
+==============================
+
+                      Version 1.2, November 2002
+     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+     
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided for under this License.  Any other
+     attempt to copy, modify, sublicense or distribute the Document is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.
+
+ADDENDUM: How to use this License for your documents
+----------------------------------------------------
+
+   To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.2
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+       A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: history.info,  Node: Concept Index,  Next: Function and Variable Index,  Prev: Copying This Manual,  Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* anchored search:                       Searching the History List.
+* event designators:                     Event Designators.
+* FDL, GNU Free Documentation License:   GNU Free Documentation License.
+* history events:                        Event Designators.
+* history expansion:                     History Interaction.
+* History Searching:                     Searching the History List.
+
+\1f
+File: history.info,  Node: Function and Variable Index,  Prev: Concept Index,  Up: Top
+
+Function and Variable Index
+***************************
+
+* Menu:
+
+* add_history:                           History List Management.
+* add_history_time:                      History List Management.
+* append_history:                        Managing the History File.
+* clear_history:                         History List Management.
+* current_history:                       Information About the History List.
+* free_history_entry:                    History List Management.
+* get_history_event:                     History Expansion.
+* history_arg_extract:                   History Expansion.
+* history_base:                          History Variables.
+* history_comment_char:                  History Variables.
+* history_expand:                        History Expansion.
+* history_expansion_char:                History Variables.
+* history_get:                           Information About the History List.
+* history_get_history_state:             Initializing History and State Management.
+* history_get_time:                      Information About the History List.
+* history_inhibit_expansion_function:    History Variables.
+* history_is_stifled:                    History List Management.
+* history_length:                        History Variables.
+* history_list:                          Information About the History List.
+* history_max_entries:                   History Variables.
+* history_no_expand_chars:               History Variables.
+* history_quotes_inhibit_expansion:      History Variables.
+* history_search:                        Searching the History List.
+* history_search_delimiter_chars:        History Variables.
+* history_search_pos:                    Searching the History List.
+* history_search_prefix:                 Searching the History List.
+* history_set_history_state:             Initializing History and State Management.
+* history_set_pos:                       Moving Around the History List.
+* history_subst_char:                    History Variables.
+* history_tokenize:                      History Expansion.
+* history_total_bytes:                   Information About the History List.
+* history_truncate_file:                 Managing the History File.
+* history_word_delimiters:               History Variables.
+* history_write_timestamps:              History Variables.
+* next_history:                          Moving Around the History List.
+* previous_history:                      Moving Around the History List.
+* read_history:                          Managing the History File.
+* read_history_range:                    Managing the History File.
+* remove_history:                        History List Management.
+* replace_history_entry:                 History List Management.
+* stifle_history:                        History List Management.
+* unstifle_history:                      History List Management.
+* using_history:                         Initializing History and State Management.
+* where_history:                         Information About the History List.
+* write_history:                         Managing the History File.
+
+
+\1f
+Tag Table:
+Node: Top\7f1282
+Node: Using History Interactively\7f1910
+Node: History Interaction\7f2417
+Node: Event Designators\7f3836
+Node: Word Designators\7f4760
+Node: Modifiers\7f6390
+Node: Programming with GNU History\7f7608
+Node: Introduction to History\7f8339
+Node: History Storage\7f10024
+Node: History Functions\7f11159
+Node: Initializing History and State Management\7f12143
+Node: History List Management\7f12943
+Node: Information About the History List\7f14957
+Node: Moving Around the History List\7f16439
+Node: Searching the History List\7f17428
+Node: Managing the History File\7f19346
+Node: History Expansion\7f21152
+Node: History Variables\7f23047
+Node: History Programming Example\7f25836
+Node: Copying This Manual\7f28558
+Node: GNU Free Documentation License\7f28796
+Node: Concept Index\7f51189
+Node: Function and Variable Index\7f51739
+\1f
+End Tag Table
diff --git a/lib/readline/doc/history.ky b/lib/readline/doc/history.ky
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/history.log b/lib/readline/doc/history.log
new file mode 100644 (file)
index 0000000..8400c26
--- /dev/null
@@ -0,0 +1,172 @@
+This is TeX, Version 3.14159 (Web2C 7.3.1) (format=tex 2001.2.12)  22 SEP 2003 09:04
+**/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/history.
+texi
+
+(/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/history.t
+exi (texinfo.tex Loading texinfo [version 2003-02-03.16]: Basics,
+\bindingoffset=\dimen16
+\normaloffset=\dimen17
+\pagewidth=\dimen18
+\pageheight=\dimen19
+\outerhsize=\dimen20
+\outervsize=\dimen21
+\cornerlong=\dimen22
+\cornerthick=\dimen23
+\topandbottommargin=\dimen24
+\headlinebox=\box16
+\footlinebox=\box17
+\margin=\insert252
+\EMsimple=\toks12
+\groupbox=\box18
+\groupinvalidhelp=\toks13
+\mil=\dimen25
+\exdentamount=\skip18
+\inmarginspacing=\skip19
+ pdf,
+\tempnum=\count26
+\lnkcount=\count27
+\filename=\toks14
+\filenamelength=\count28
+\pgn=\count29
+\toksA=\toks15
+\toksB=\toks16
+\toksC=\toks17
+\toksD=\toks18
+\boxA=\box19
+\countA=\count30
+ fonts,
+\sffam=\fam8
+\textleading=\dimen26
+\mainmagstep=\count31
+\fontdepth=\count32
+
+page headings,
+\titlepagetopglue=\skip20
+\titlepagebottomglue=\skip21
+\evenheadline=\toks19
+\oddheadline=\toks20
+\evenfootline=\toks21
+\oddfootline=\toks22
+ tables,
+\tableindent=\dimen27
+\itemindent=\dimen28
+\itemmargin=\dimen29
+\itemmax=\dimen30
+\itemno=\count33
+\multitableparskip=\skip22
+\multitableparindent=\skip23
+\multitablecolspace=\dimen31
+\multitablelinespace=\skip24
+\colcount=\count34
+\savedfootnotes=\box20
+ conditionals, indexing,
+\secondaryindent=\skip25
+\partialpage=\box21
+\doublecolumnhsize=\dimen32
+ sectioning,
+\chapno=\count35
+\secno=\count36
+\subsecno=\count37
+\subsubsecno=\count38
+\appendixno=\count39
+\absseclevel=\count40
+\secbase=\count41
+\chapheadingskip=\skip26
+\secheadingskip=\skip27
+\subsecheadingskip=\skip28
+ toc,
+\tocfile=\write0
+\contentsrightmargin=\skip29
+\savepageno=\count42
+\lastnegativepageno=\count43
+\shortappendixwidth=\dimen33
+\tocindent=\dimen34
+ environments,
+\errorbox=\box22
+\lispnarrowing=\skip30
+\envskipamount=\skip31
+\circthick=\dimen35
+\cartouter=\dimen36
+\cartinner=\dimen37
+\normbskip=\skip32
+\normpskip=\skip33
+\normlskip=\skip34
+\lskip=\skip35
+\rskip=\skip36
+\tabw=\dimen38
+
+defuns,
+\defbodyindent=\skip37
+\defargsindent=\skip38
+\deflastargmargin=\skip39
+\parencount=\count44
+ macros,
+\macscribble=\write1
+\paramno=\count45
+\macname=\toks23
+ cross references,
+\auxfile=\write2
+\savesfregister=\count46
+\footnoteno=\count47
+
+(/usr/local/share/texmf/tex/plain/dvips/epsf.tex
+\epsffilein=\read0
+\epsfframemargin=\dimen39
+\epsfframethickness=\dimen40
+\epsfrsize=\dimen41
+\epsftmp=\dimen42
+\epsftsize=\dimen43
+\epsfxsize=\dimen44
+\epsfysize=\dimen45
+\pspoints=\dimen46
+\epsfnoopenhelp=\toks24
+)
+\noepsfhelp=\toks25
+ localization,
+\nolanghelp=\toks26
+\defaultparindent=\dimen47
+
+and turning on texinfo input format.) (history.aux)
+@cpindfile=@write3
+@fnindfile=@write4
+@vrindfile=@write5
+@tpindfile=@write6
+@kyindfile=@write7
+@pgindfile=@write8
+ (version.texi) [1
+\openout2 = `history.aux'.
+
+\openout3 = `history.cp'.
+
+\openout4 = `history.fn'.
+
+\openout5 = `history.vr'.
+
+\openout6 = `history.tp'.
+
+\openout7 = `history.ky'.
+
+\openout8 = `history.pg'.
+
+] [2]
+(history.toc) [-1] [-2] (hsuser.texi Chapter 1
+\openout0 = `history.toc'.
+
+@btindfile=@write9
+ [1
+\openout9 = `history.bt'.
+
+] [2]) (hstech.texi Chapter 2
+[3] [4] [5] [6] [7] [8] [9] [10] [11]) Appendix A [12] (fdl.texi [13] [14]
+[15] [16] [17] [18]) Appendix B [19] [20] (history.cps) Appendix C [21]
+[22] (history.vrs) [23] [24] ) 
+Here is how much of TeX's memory you used:
+ 1399 strings out of 13013
+ 16305 string characters out of 97233
+ 45527 words of memory out of 263001
+ 2271 multiletter control sequences out of 10000+0
+ 31953 words of font info for 111 fonts, out of 400000 for 1000
+ 19 hyphenation exceptions out of 1000
+ 15i,6n,17p,306b,649s stack positions out of 300i,100n,500p,50000b,4000s
+
+Output written on history.dvi (28 pages, 79868 bytes).
diff --git a/lib/readline/doc/history.pg b/lib/readline/doc/history.pg
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/history.ps b/lib/readline/doc/history.ps
new file mode 100644 (file)
index 0000000..71a748a
--- /dev/null
@@ -0,0 +1,2404 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
+%%Title: history.dvi
+%%Pages: 28
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 300 -o history.ps history.dvi
+%DVIPSParameters: dpi=300, compressed
+%DVIPSSource:  TeX output 2003.09.22:0904
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 300 300 (history.dvi)
+@start
+%DVIPSBitmapFont: Fa cmti9 9 1
+/Fa 1 47 df<1230127812F0126005047C830C>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmr9 9 34
+/Fb 34 122 df<126012F0A212701210A31220A21240A2040B7D830B>44
+D<EA07E0EA1C38EA381CEA300CEA700EEA6006A2EAE007AAEA6006A2EA700EEA300CEA38
+1CEA1C38EA07E010187F9713>48 D<12035AB4FC1207B3A2EA7FF80D187D9713>I<EA07
+E0EA1838EA201CEA601EEA700EEA201E1200131CA213381370EA07E0EA0038131C130E13
+0FA212E0A212C0EA400EEA601CEA1838EA07E010187F9713>51 D<EA01F8EA0704EA0C06
+EA180E123013001270126012E0EAE3E0EAE418EAE80CEAF00EEAE0061307A31260A2EA70
+06EA300EEA180CEA0C38EA07E010187F9713>54 D<1240EA7FFF13FEA2EA4004EA800813
+10A2EA00201340A21380120113005AA25A1206A2120EA5120410197E9813>I<EA07E0EA
+1818EA300CEA20061260A21270EA780CEA3E18EA1F30EA07C0EA03E0EA0CF8EA307CEA60
+1E130FEAC0071303A3EA6002EA2004EA1818EA07E010187F9713>I<EA07E0EA1C30EA30
+18EA700CEA600EEAE006A21307A31260EA700FEA3017EA1827EA07C7EA00071306130E13
+0C12701318EA6030EA3060EA0F8010187F9713>I<B57E380E00E01470808080A280A215
+80A81500A25C140E5CA2147814E0B51280191A7F991D>68 D<B512F8380E003814181408
+140C1404A3EB0100A35BEA0FFFEA0E037FA390C7FCA8EAFFE0161A7F9919>70
+D<EB3F023801C0C63803002E000E131E48130E14065A007813021270A200F090C7FCA590
+3801FFC03970000E00A2127812387EA27E000313163801C06638003F821A1A7E991E>I<
+39FFE1FFC0390E001C00AB380FFFFC380E001CAC39FFE1FFC01A1A7F991D>I<EAFFE000
+0EC7FCB01408A3141814101430147014F0B5FC151A7F9918>76 D<00FEEB7FC0000FEB0E
+001404EA0B80EA09C0A2EA08E01370A21338131CA2130E1307EB0384A2EB01C4EB00E4A2
+1474143CA2141C140C121C38FF80041A1A7F991D>78 D<EA0FC2EA1836EA200EEA600612
+C01302A3EAE0001270127EEA3FE0EA1FF8EA03FCEA007E130E130713031280A3EAC00213
+06EAE004EAD818EA87E0101A7E9915>83 D<39FFE07FC0390E000E001404B200065B1207
+6C5B6C6C5A3800E0C0013FC7FC1A1A7F991D>85 D<EA1FC0EA38707FEA101C1200A2EA03
+FCEA1E1C1238127012E01480A2133CEA705F381F8F0011107F8F13>97
+D<EA07F8EA1C1C1238EA700813005AA612701304EA3808EA1C18EA07E00E107F8F11>99
+D<133F1307A9EA03E7EA0C17EA180F487E127012E0A6126012706C5AEA1C373807C7E013
+1A7F9915>I<EA07C0EA1C30EA30181270EA600C12E0EAFFFCEAE000A41260EA7004EA38
+08EA1C18EA07E00E107F8F11>I<EA0FCF3818718038303000EA7038A4EA30306C5AEA2F
+C00060C7FCA21270EA3FF013FC6C7EEA600FEAC003A4EA6006EA381CEA07E011187F8F13
+>103 D<12FC121CA9137CEA1D87381E0380A2121CAB38FF9FF0141A809915>I<1218123C
+A212181200A612FC121CAE12FF081A80990A>I<38FC7C1F391D8E6380391E0781C0A200
+1C1301AB39FF9FE7F81D107F8F20>109 D<EAFC7CEA1D87381E0380A2121CAB38FF9FF0
+1410808F15>I<EA07E0EA1C38EA300CEA700EEA6006EAE007A6EA6006EA700EEA381CEA
+1C38EA07E010107F8F13>I<EAFCFCEA1D07381E0380381C01C0A2EB00E0A6EB01C01480
+381E0300EA1D06EA1CF890C7FCA6B47E1317808F15>I<EAFC78EA1D9CEA1E1C1308EA1C
+00ABEAFF800E10808F0F>114 D<EA1F20EA60E0EA402012C0A2EAF000127FEA3FC0EA1F
+E0EA00F0EA8070133012C01320EAF040EA8F800C107F8F0F>I<1208A41218A21238EAFF
+C0EA3800A81320A41218EA1C40EA07800B177F960F>I<38FC1F80EA1C03AB1307120CEA
+0E0B3803F3F01410808F15>I<38FF0F80383C0700EA1C061304A26C5AA26C5AA3EA03A0
+A2EA01C0A36C5A11107F8F14>I<38FE3F80383C1E00EA1C086C5AEA0F306C5A6C5A1201
+7F1203EA0270487E1208EA181CEA381E38FC3FC012107F8F14>120
+D<38FF0F80383C0700EA1C061304A26C5AA26C5AA3EA03A0A2EA01C0A36C5AA248C7FCA2
+12E112E212E4127811177F8F14>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmsltt10 9 13
+/Fc 13 122 df<EA0FE0EA1FF8EA381CEA100E1200A2EA03FEEA1FFCEA3C1C127012E0A2
+133C1378EA7FFFEA1F8F10107D8F14>97 D<EA01F0EA07F8EA0E0CEA1C0E1238EA7006A2
+EAFFFEA2EAE000A21270130CEA381CEA1FF8EA07F00F107D8F14>101
+D<121F7F0007C7FCA5133EEA0EFF380FC3801303120EA3381C0700A6EA380E38FF1FC0A2
+12177F9614>104 D<136013F013E013401300A4EA3FC0A21201A5EA0380A6EA0700EAFF
+F8A20D187C9714>I<EA1FE013F0EA00E0A6EA01C0A6EA0380A6EA0700EAFFFCA20E177D
+9614>108 D<383CE380383FFFC0EA1F7DEA1E79EA1C71A33838E380A63871C70038FDF7
+C0EAFCF312107F8F14>I<EA3E3E13FF380FC3801303120EA3381C0700A6EA380E38FF1F
+C0A212107F8F14>I<EA03F0EA07F8EA1E1CEA3C0E12381270A212E0A3131EEA701C1338
+EA7870EA3FE0EA0F800F107D8F14>I<381F87C0EB9FE0EA03B8EBE040EBC0005BA21207
+90C7FCA5120EEAFFF0A213107F8F14>114 D<EA03FAEA0FFEEA1C0E1230A2EA3800EA1F
+E0EA0FF8EA01FEEA000FEA600312701306EAF80CEAFFF8EA4FE010107E8F14>I<120612
+0EA4EAFFF8A2EA1C00A55AA313301338A21370EA1FE0EA0F800D157C9414>I<EAF83EA2
+EA380EA5EA701CA5133C1378EA3FFFEA1F9F10107D8F14>I<381FCFE0A238070380EB07
+00A2130EEA038EA2139CA213B8A2EA01B013F05BA25BA2485AA200E7C7FC12EE12FC1278
+13187F8F14>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmtt9 9 76
+/Fd 76 126 df<126012F0AD12601200A4126012F0A212600417789614>33
+D<EAC060EAE0E0A4EAC060A5EA40400B0B7C9614>I<EA071CA5B51280A27E380E3800A7
+387FFF80B5FCA2381C7000A511177F9614>I<13801201A2EA07E0EA1FF0EA39BCEA619C
+EAC18EA3EAE184EA7180127FEA1FE0EA0FF0EA01F8139C138EEA418612E1A3EA718CEA39
+B8EA1FF0EA0FC0EA0180A212000F1D7E9914>I<EA3806EA7C0E126CEAEE1CA25BA2126C
+EA7C70123812005BA2485AA3485AA248C7FC130E131FEA0E1BEB3B80A2121CA238381B00
+131FEA180E111D7F9914>I<1207487EEA18C0EA38E0A35B3839CF80138F381F1C00121E
+A2EA0E38121EEA37701267EAE3F05B38E1C38013E3EA63F3383F3F00EA1E1E11177F9614
+>I<126012F012F812781218A31230A2126012C01280050C789614>I<EA01801203EA0600
+5A121C121812385AA35AA91270A37E1218121C120C7EEA03801201091D799914>I<1280
+12C01260123012381218121C120EA31207A9120EA3121C121812381230126012C0128008
+1D7C9914>I<EA0380A3EA638CEAF39EEA7FFCEA3FF8EA0FE0A2EA3FF8EA7FFCEAF39EEA
+638CEA0380A30F107E9214>I<EA01C0A7B51280A33801C000A711117F9314>I<127012F8
+12FCA2127C120C1218123012E012C0060A798414>I<EAFFFEA30F037E8C14>I<127012F8
+A312700505798414>I<1306130EA2131CA21338A21370A213E0A2EA01C0A2EA0380A3EA
+0700A2120EA25AA25AA25AA25AA25A0F1D7E9914>I<EA07C0EA0FE0EA1C70EA3838EA30
+18EA701CA2EAE00EA9EA701CA2EA3838A2EA1C70EA0FE0EA07C00F177E9614>I<1203A2
+5A5A123F12F712471207AEEA7FF0A20C177C9614>I<EA0FC0EA1FF0EA3838EA701CEAE0
+0EA312401200131CA213381330137013E0EA01C0EA030012065AEA180E1230EA7FFEA20F
+177E9614>I<137813F8EA01B8A2EA0338A21206120E120C121C12381230127012E0B512
+80A238003800A548B4FCA211177F9614>52 D<EA01F0EA07F8EA0E1C121C1238EA300012
+70A25AEAE7C0EAEFF0EAF838EAF01C130CEAE00EA212601270130CEA381CEA1C38EA0FF0
+EA07C00F177E9614>54 D<127012F8A312701200A6127012F8A312700510798F14>58
+D<127012F8A312701200A6126012F012F8A2127812181230127012E012800515798F14>
+I<1306131E133E13F8EA01F0EA03C0EA0F80EA1F00123C12F85A7E123C121FEA0F80EA03
+C0EA01F0EA00F8133E131E13060F157E9514>I<B51280A27EC8FCA3387FFF80B5FCA211
+097F8F14>I<12C012F07E123E7EEA0780EA03E0EA01F0EA0078133E131E133E1378EA01
+F0EA03E0EA0780EA1F00123E12F85A12C00F157E9514>I<EA01C0487EA21360A2EA0770
+A4EA0630EA0E38A4487EEA1FFCA2EA1C1CA2487EA238FE3F80A211177F9614>65
+D<EAFFF013FCEA381E130E1307A4130E131EEA3FFCA2EA381E130E1307A5130E131EEAFF
+FC13F810177F9614>I<3801F180EA07FFEA0E1FEA1C071238EA7003A348C7FCA7387003
+80A338380700121CEA0E0EEA07FCEA01F011177F9614>I<EAFFE013F8EA383C7F130E7F
+A3EB0380A8EB0700A2130E131E5BEAFFF813E011177F9614>I<B5FCA2EA3807A490C7FC
+A21338A2EA3FF8A2EA3838A290C7FCA3EB0380A4B5FCA211177F9614>I<B51280A2EA38
+03A490C7FCA21338A2EA3FF8A2EA3838A290C7FCA7B4FCA211177F9614>I<EA03C6EA0F
+FEEA1C3EEA181E1238EA700EA21260EAE000A4137FA2130E12601270A2EA381E1218EA1C
+3EEA0FFEEA03CE10177F9614>I<38FE3F80A238380E00A8EA3FFEA2EA380EA938FE3F80
+A211177F9614>I<EAFFF8A2EA0700B3EAFFF8A20D177D9614>I<B4FCA21238AF1307A4B5
+FCA210177E9614>76 D<38FE3F80A2383E0E00123BA4138E1239A213CEA31238A213EE13
+6EA4133E12FEA211177F9614>78 D<EAFFF013FCEA381E130E1307A5130E131EEA3FFC13
+F0EA3800A812FEA210177F9614>80 D<EAFFE013F8EA383C131C7FA45B133CEA3FF85BEA
+38387FA51480EB1DC0A238FE0F80EB070012177F9614>82 D<EA0FCCEA1FFCEA307CEA60
+3CEAE01CA313001270127EEA3FE0EA0FF0EA01F8EA001C131E130E126012E0A2EAF01CEA
+F838EAFFF0EAC7E00F177E9614>I<387FFF80B5FCEAE1C3A43801C000AFEA0FF8A21117
+7F9614>I<38FE0FE0A238380380B0381C0700A2EA0E0EEA07FCEA01F01317809614>I<38
+FC1F80A238380E00A3EA3C1EEA1C1CA46C5AA4EA0630EA0770A3EA0360A213E0A26C5A11
+177F9614>I<38FC1F80A238380E00EA3C1EEA1C1CEA1E3CEA0E38A26C5AA2EA036013E0
+A26C5AA8EA07F0A211177F9614>89 D<EAFFE0A2EAE000B3A7EAFFE0A20B1D799914>91
+D<12C07EA21270A27EA27EA27EA27EA2EA0380A3EA01C0A2EA00E0A21370A21338A2131C
+A2130EA213060F1D7E9914>I<EAFFE0A21200B3A712FFA20B1D7F9914>I<EAFFFEA30F03
+7E7E14>95 D<1208121812301260A212C0A312F012F812781230050C799914>I<EA1FC0
+EA7FF0EA7078EA2018EA001CA2EA07FC121FEA3C1C127012E0A3EA707C383FFF80EA0F8F
+11107E8F14>I<12FCA2121CA513F8EA1DFEEA1F07EA1E03001C1380EB01C0A6EB038000
+1E1300EA1F0EEA1DFCEA0CF81217809614>I<EA03F8EA0FFEEA1C0EEA3804EA70001260
+12E0A412601270EA380EEA1C1EEA0FFCEA03F00F107E8F14>I<137EA2130EA5EA07CEEA
+0FFEEA1C3EEA301EEA700E12E0A61270EA301EEA383E381FEFC0EA07CF12177F9614>I<
+EA07E0EA0FF0EA1C38EA301CEA700CEAE00EA2EAFFFEA2EAE00012601270EA380EEA1C1E
+EA0FFCEA03F00F107E8F14>I<13FCEA01FEEA038EEA07041300A3EA7FFE12FFEA0700AC
+EAFFF8A20F177F9614>I<EA07CF381FFF80EA383B38301800EA701CA3EA3018EA3838EA
+3FF0EA37C00070C7FCA2EA3FF86C7E487EEA700F38E00380A438700700EA3C1EEA1FFCEA
+07F011197F8F14>I<12FCA2121CA51378EA1DFEEA1F86EA1E07121CAA38FF8FE0A21317
+809614>I<1206120FA21206C7FCA4B4FCA21207ACEAFFF8A20D187C9714>I<12FCA2121C
+A5EBFF80A2EB1C005B5B5BEA1DC0EA1FE0A2EA1E70EA1C38133C131C7F38FF1F80A21117
+809614>107 D<EAFF80A21203B3EAFFFEA20F177E9614>I<EAFB8EEAFFDF383CF380A2EA
+38E3AA38FEFBE013791310808F14>I<EAFC78EAFDFEEA1F86EA1E07121CAA38FF8FE0A2
+1310808F14>I<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6EA701CEA783CEA3C78EA1FF0
+EA07C00F107E8F14>I<EAFCF8EAFDFEEA1F07EA1E03001C1380EB01C0A6EB0380001E13
+00EA1F0EEA1DFCEA1CF890C7FCA6B47EA21218808F14>I<EA03E7EA0FF7EA1C1FEA300F
+1270487EA6EA700F1230EA1C3FEA0FF7EA07C7EA0007A6EB3FE0A213187F8F14>I<EAFE
+1FEB7F80EA0EE3380F810090C7FCA2120EA8EAFFF0A211107F8F14>I<EA0FD8EA3FF8EA
+603812C0A2EAF000EA7F80EA3FF0EA07F8EA001CEA600612E012F0EAF81CEAFFF8EACFE0
+0F107E8F14>I<1206120EA4EA7FFC12FFEA0E00A8130EA3131CEA07F8EA01F00F157F94
+14>I<EAFC3FA2EA1C07AB131F380FFFE0EA03E71310808F14>I<38FE3F80A2383C1E00EA
+1C1CA36C5AA3EA0630EA0770A36C5AA311107F8F14>I<38FE3F80A238700700EA380EA3
+EA39CEA3EA1B6C121AA3EA1E7CA2EA0E3811107F8F14>I<EA7E3FA2EA1E3CEA0E78EA07
+705B12036C5A12037FEA0770EA0E781338487E38FE3F80A211107F8F14>I<38FE3F80A2
+381C0E005BA2120E5BA212071330A2EA0370A25B1201A25BA3485A12730077C7FC127E12
+3C11187F8F14>I<EA3FFF5AEA700E131C1338EA007013E0EA01C0EA0380EA0700120EEA
+1C0712381270B5FCA210107F8F14>I<133E13FEEA01E0EA0380AAEA7F0012FE127FEA03
+80AAEA01E0EA00FE133E0F1D7E9914>I<12E0B3AB031D789914>I<127812FE120FEA0380
+AAEA01FCEA00FEEA01FCEA0380AAEA0F0012FE12780F1D7E9914>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmss10 10.95 2
+/Fe 2 42 df<13E0EA01C0EA0380120713005A121EA2121C123CA212381278A3127012F0
+AE12701278A31238123CA2121C121EA27E7E13801203EA01C0EA00E00B2E7CA112>40
+D<12E012707E123C121C121E7EA27E1380A2120313C0A3120113E0AE13C01203A3138012
+07A213005AA2121E121C123C12385A5A0B2E7EA112>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmbx10 12 27
+/Ff 27 123 df<EB07F8EB7FFC3801FC0E3803F01F48485AEA0FC0A3141E140C91C7FCA2
+ECFF80B6FCA2380FC01FB2397FF8FFF0A21C237FA220>12 D<90380FFF80137F3801FC1F
+3803F03FEA07E0EA0FC0141FA7B6FCA2380FC01FB2397FF8FFF0A21C237FA220>I<EA07
+FE381FFF80383F07E06D7E130180121E1200A2133FEA03FDEA1F81EA3E01127C12F8A4EA
+7C02EA7E0C391FF87F803807E03F19167E951C>97 D<B47EA2121FABEB87F0EBBFFCEBF0
+3EEBC01F9038800F8015C0140715E0A715C0A2140F15809038C01F00381E707E381C3FFC
+38180FE01B237EA220>I<EBFF80000713E0380F83F0EA1F03123E127E387C01E090C7FC
+12FCA6127C127EA2003E13186C1330380FC0603807FFC0C6130015167E9519>I<49B4FC
+A2EB003FAB13FE3807FFBF380FC1FF48C67E003E7F127E127CA212FCA7127C127E123E6C
+5B380F81FF3907FF3FE0EA01FC1B237EA220>I<13FE3807FF80380F83C0381E01E0383E
+00F0127E007C13F8147812FCB512F8A200FCC7FCA3127CA26C1318A26C1330380F80E038
+03FFC0C6130015167E951A>I<EB1F80EBFFE03801F1F0EA03E31207EA0FC3EBC1E0EBC0
+00A6EAFFFEA2EA0FC0B2EA7FFCA214237EA212>I<9038FE0F803903FF9FC0380F83E338
+1F01F3391E00F000003E7FA5001E5BEA1F01380F83E0380BFF80D808FEC7FC0018C8FCA2
+121C381FFFE014FC6C13FF7E001F1480397C001FC00078130F00F81307A3007CEB0F806C
+EB1F00381F807E6CB45A000113E01A217F951D>I<B47EA2121FABEB83F0EB8FFCEB987E
+EBA03EEBC03FA21380AE39FFF1FFE0A21B237DA220>I<121E123FEA7F80A4EA3F00121E
+C7FCA6EAFF80A2121FB2EAFFF0A20C247EA30F>I<B47EA2121FABECFF80A2EC3C001430
+14E0EB81C00183C7FC1386139E13BE13FFEBDF80EB8FC01307806D7E6D7E130080147E39
+FFE1FFC0A21A237EA21E>107 D<EAFF80A2121FB3ADEAFFF0A20C237EA20F>I<3AFF03F8
+03F890390FFE0FFE3A1F183F183F9039201F201F014001C01380A201801380AE3BFFF0FF
+F0FFF0A22C167D9531>I<38FF03F0EB0FFC381F187EEB203EEB403FA21380AE39FFF1FF
+E0A21B167D9520>I<13FF000713E0380F81F0381F00F8003E137C48133EA300FC133FA7
+007C133E007E137E003E137C6C13F8380F81F03807FFE0C6130018167E951D>I<38FF87
+F0EBBFFC381FF07EEBC01F9038800F8015C0A2EC07E0A715C0140FA2EC1F8001C01300EB
+F07EEBBFFCEB8FE00180C7FCA8EAFFF0A21B207E9520>I<EBFE033807FF07380FC1CF38
+1F00DF48137F007E7FA2127C12FCA7127EA2003E5B6C5BEA0FC13807FF3FEA00FC1300A8
+903801FFE0A21B207E951E>I<38FF0F80EB1FE0381F33F013631343A2EBC1E0EB8000AD
+EAFFF8A214167E9518>I<3807F980EA1FFFEA3807EA7003EAF001A26CC7FCB4FC13F8EA
+7FFE6C7E6C1380120738003FC0EAC007130312E0A200F0138038FC0F00EAEFFEEAC3F812
+167E9517>I<487EA41203A21207A2120F123FB5FCA2EA1F80ABEB8180A5380F830013C3
+EA07FEEA01F811207F9F16>I<38FF81FFA2381F803FAF5C5C380FC1BF3907FF3FE0EA01
+FC1B167D9520>I<39FFF01FE0A2391FC00700000F1306EBE00E0007130C13F000035BA2
+6C6C5AA26C6C5AA2EBFEE0EB7EC0137F6D5AA26DC7FCA2130EA21B167F951E>I<3AFFF3
+FF83FCA23A1F807C00E0D80FC014C08001E013010007017F1380A2D803F0EB0300ECCF83
+01F81387D801F913C61487D800FD13ECEBFF0315FC017F5BEB7E01013E5BEB3C00A20118
+136026167F9529>I<39FFF07FC0A2390FC01C006C6C5A6D5A00035B6C6C5A3800FD8013
+7F91C7FC7F6D7E497EEB37E0EB67F013C33801C1F8380380FC48487E000E137F39FF81FF
+E0A21B167F951E>I<39FFF01FE0A2391FC00700000F1306EBE00E0007130C13F000035B
+A26C6C5AA26C6C5AA2EBFEE0EB7EC0137F6D5AA26DC7FCA2130EA2130CA25B1278EAFC38
+13305BEA69C0EA7F80001FC8FC1B207F951E>I<387FFFF0A2387C07E038700FC0EA601F
+00E0138038C03F005B137EC65A1201485AEBF030EA07E0120FEBC070EA1F80003F1360EB
+00E0EA7E03B5FCA214167E9519>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmtt10 12 29
+/Fg 29 119 df<13E0A538F0E1E0EAFCE7387EEFC0381FFF00EA07FCEA01F0EA07FCEA1F
+FF387EEFC038FCE7E0EAF0E13800E000A513157D991A>42 D<1338137CA2136C13EEA313
+C6A2EA01C7A438038380A4380701C0A213FFA24813E0EA0E00A4481370387F01FC38FF83
+FE387F01FC171E7F9D1A>65 D<B512F8A3381C0038A51400A2130EA3EA1FFEA3EA1C0EA3
+90C7FCA3141CA5B512FCA3161E7E9D1A>69 D<38FF83FEA3381C0070AA381FFFF0A3381C
+0070AB38FF83FEA3171E7F9D1A>72 D<B51280A33801C000B3A6B51280A3111E7C9D1A>
+I<38FE03FE12FFA2381D8070A213C0121CA213E0A213601370A213301338A21318131CA2
+130C130EA21306A213071303A238FF81F0A21380171E7F9D1A>78
+D<EA0FFE383FFF804813C0EA7C07EA700100F013E0EAE000B1EAF001A2007013C0EA7C07
+EA7FFF6C1380380FFE00131E7D9D1A>I<EAFFFC13FF1480381C07C0EB01E0EB00F01470
+A414F0EB01E0EB07C0381FFF8014001480381C07C01301EB00E0A514E214E7A338FF807E
+A21438181E7F9D1A>82 D<3803F1C0EA0FFDEA3FFFEA7C0FEA700312E01301A390C7FC12
+701278123FEA1FF0EA07FE3800FF80EB0FC0EB01E013001470A2126012E0A214E0EAF001
+38FC03C0B5128000EF1300EAE3FC141E7D9D1A>I<387FFFFEB5FCA238E0380EA5000013
+00B33803FF80A3171E7F9D1A>I<38FF01FEA3381C00706C13E0A2380701C0A213830003
+138013C700011300A2EA00EEA2137CA21338AA48B4FCA3171E7F9D1A>89
+D<387FFFC0B512E0A26C13C013047D7E1A>95 D<EA1FF0EA3FFC487EEA780FEA30073800
+0380A2137FEA07FF121FEA3F83EA7803127012E0A3EA7007EA780F383FFFFCEA1FFDEA07
+F016157D941A>97 D<12FEA3120EA6133EEBFF80000F13E0EBC1F0EB8070EB0038120E14
+1CA7000F13381478EB80F0EBC1E0EBFFC0000E138038063E00161E7F9D1A>I<EBFF8000
+0313C0000F13E0EA1F01383C00C04813001270A25AA51270A2007813707E381F01F0380F
+FFE0000313C03800FE0014157D941A>I<EB1FC0A31301A6EA01F1EA07FDEA0FFFEA1E0F
+EA3C07EA7803EA700112E0A7EA7003A2EA3807EA3E0F381FFFFCEA07FDEA01F1161E7E9D
+1A>I<EA01F8EA07FF481380381E07C0EA3C01387800E01270481370A2B512F0A300E0C7
+FC1270A2007813707E381F01F0380FFFE0000313803800FE0014157D941A>I<EB07E0EB
+1FF0EB3FF8EB7878EBF030EBE000A4387FFFF0B5FCA23800E000AF383FFF804813C06C13
+80151E7F9D1A>I<12FEA3120EA6133EEBFF80000F13C013C1EB80E01300120EAC38FFE3
+FE13E713E3171E7F9D1A>104 D<EA01C0487EA36C5AC8FCA5EA7FE0A31200AF387FFF80
+B512C06C1380121F7C9E1A>I<EAFFE0A31200B3A6B512E0A3131E7D9D1A>108
+D<387CE0E038FFFBF8EA7FFF381F1F1CEA1E1EA2EA1C1CAC387F1F1F39FF9F9F80397F1F
+1F00191580941A>I<EAFE3EEBFF80B512C0EA0FC1EB80E01300120EAC38FFE3FE13E713
+E317157F941A>I<EA01F0EA07FCEA1FFF383E0F80EA3C07387803C0EA700138E000E0A6
+EAF001007013C0EA7803383C0780EA3E0F381FFF00EA07FCEA01F013157D941A>I<387F
+81F838FF8FFC387F9FFE3803FE1EEBF80CEBE000A25B5BAAEA7FFFB5FC7E17157F941A>
+114 D<3807FB80EA1FFF127FEA7807EAE003A30078C7FCEA7FC0EA1FFCEA07FE38003F80
+1307386001C012E0A2EAF00338FC0780B51200EAEFFEEAE3F812157C941A>I<487E1203
+A6387FFFE0B5FCA238038000AA1470A43801C1E013FF6C1380EB3F00141C7F9B1A>I<38
+FE0FE0A3EA0E00AD1301EA0F033807FFFE7EEA00FC17157F941A>I<387FC7FC00FF13FE
+007F13FC380E00E0A3380701C0A338038380A33801C700A3EA00EEA3137CA2133817157F
+941A>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmsltt10 10.95 17
+/Fh 17 122 df<13181338A2137813F81203120F137012041200A413E0A6EA01C0A6EA7F
+FE12FF127F0F1C7B9B18>49 D<EB3F80EBFFE0000313F03807C078EB003C000E131CA212
+1E120EC7FCA21438147814F0EB01E0EB03C0EB0780EB0F00133E5B13F0EA03E0485A380F
+0060003E1370387FFFE0B5FC7E161C7E9B18>I<EB07E0A31300A4EB01C0EA01F1EA07FD
+EA0FFFEA1E0FEA3C0738780380127012E0A4EB0700A25B5B6C5AEA787F383FFFC0381FEF
+E0380F87C0131C7C9B18>100 D<13F8EA07FE487E381F0780EA3C03387801C0127012E0
+A2B5FCA2148000E0C7FCA213033870078038780F00EA3FFE6C5AEA07F012147B9318>I<
+EB01F8EB07FC131FEB1E3CEB38181400A25B381FFFF05A7E38007000A25BA6485AA6EA7F
+FE12FF127F161C7E9B18>I<EB1E1F90387FFF8090B5FC3901E1E3003803C0E01380EA07
+00A3495AA238038780EA07FF49C7FCEA0E7890C8FCA26CB47E4813E0487F383C00784813
+3812705AA2147800705B387C03E0383FFFC0000F90C7FCEA03FC191F809318>I<131813
+3C137C133C131890C7FCA4EA0FF8121F120FEA0038A25BA65BA6EA7FFFB512806C130011
+1D7C9C18>105 D<EA0FFCA3EA001CA45BA65BA65BA6B5128014C01480121C7D9B18>108
+D<381F8F80383FBFE0381FFFF03803F07013E0EA07C013801300A4000E13E0A638FF87F8
+EBCFFCEB87F816147F9318>110 D<13FCEA03FF000F1380EA1F07383C03C0EA78010070
+13E0EAE000A4EB01C0A2EB0380EAF007EB0F00EA7C3EEA3FFC6C5AEA07E013147C9318>
+I<381FE1F8EBE7FCEBEFFE3800FE1EEBFC0C3801F8005B5B5BA3485AA6EAFFFC7F5B1714
+7E9318>114 D<EBFE603807FFE05AEA1F01121C003813C0EA3C00001F1300EA0FF8EA07
+FE3800FF801307383001C01270A238780380EA7C07B51200EAEFFEEA63F813147D9318>
+I<487E7FA3485A387FFFC0B5FC7E38038000A248C7FCA6120E5BEB0380A2EB07005BEA07
+FE5BEA01F012197C9818>I<387E07E0EAFE0FEA7E07EA0E00A2381C01C0A638380380A4
+1307131F383FFFE06C13F03807E3E014147D9318>I<38FF87F8138F1387383800E0EB01
+C0A3148013E3EA39F31233EB7700A212371376EA3666136EEA3C7CA2EA383815147C9318
+>119 D<381FE3FC13E713E33803C3C000011380EBE700EA00EE13FC137C1338137813FC
+EA01DCEA038E12071307120E38FF1FE0EB9FF0EB1FE016147E9318>I<380FF1FE381FF9
+FF380FF1FE3803807013C0000113E0A213C114C0A23800E380A2EBE700A213E6136E136C
+137C1378A21370A25BA2485A12F3EAF780B4C7FC5A1278181E7F9318>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmbx12 13.14 45
+/Fi 45 123 df<EB07FCEB3FFF9038FE0780D803F013C03807E00FA2EA0FC0A3EC030091
+C7FCA3EC7FE0B6FCA2380FC007B3A239FFFC7FFEA21F267FA522>12
+D<123C127E12FFA4127E123C08087C8711>46 D<131C133C13FC12FFA21200B3AA387FFF
+FCA216237CA21F>49 D<48B4FC000713C0381E07F0383803F8386001FC387C00FE12FE14
+FF147FA2127C003813FFC7FC14FEA2EB01FC14F8EB03F0EB07E01480EB0F00131E5B1370
+EBE003EA01C038038007380700061206380FFFFE5A5A4813FCB5FCA218237DA21F>I<48
+B4FC000713E0381E03F0383801F8003C13FC387E00FEA3123EEA1C01000013FCA2EB03F8
+EB07F0EB0FC03801FF00A2380007E0EB01F014F8EB00FC14FE14FFA21210127C12FEA214
+FEA2387C01FC007013F8383E07F0380FFFC00001130018237DA21F>I<14381478A214F8
+1301130313071306130C131C13381330136013E0EA01C01380EA03005A120E5A12185A12
+705AB612C0A2390001F800A790387FFFC0A21A237EA21F>I<0018130C001F137CEBFFF8
+14F014E014C01480EBFC000018C7FCA513FF001B13E0381F03F0381C00F8000813FCC712
+7EA3147FA2127812FCA3147E5A006013FC1270383801F8381E07E03807FFC03801FE0018
+237DA21F>I<EB1FC0EB7FF03801F0383803E00C3807803E000F137EEA1F005AA2007E13
+3C1400A338FE3FC0EB7FF0EB80F800FF13FCEB007C147E5A147FA4127EA4003E137E123F
+6C137C380F80F83807C1F03803FFC038007F0018237DA21F>I<1230123C003FB512C0A2
+15804814005C5C38600018A200E05B485B5CC6485AA249C7FC1306130EA25BA2133CA25B
+A213F8A41201A66C5A13601A257DA41F>I<123C127E12FFA4127E123C1200A8123C127E
+12FFA4127E123C08187C9711>58 D<141CA2143EA3147FA24A7EA39038019FC0A2903803
+1FE0140F01077FEB0607A2010C7F1403011C7FEB1801A2496C7EA2017FB5FCA29039E000
+7F8049133FA2484880151F00038190C7120FA2486E7ED8FFF090B51280A229257EA42E>
+65 D<B612E015FC3903F800FFED1FC0ED07E06F7E6F7E82150082A2167FA31780AA1700
+A316FEA24B5A5E4B5A4B5AED1FC0EDFF80B648C7FC15E029257EA42F>68
+D<B7FCA23903F8007FED0F8015071503A21501A3ED00C01406A21600A2140E141EEBFFFE
+A2EBF81E140E1406A21660A291C7FC16C0A415011503A2ED0F80153FB7FCA223257EA428
+>I<B612FEA23803F800151F8181A281A3ED01801403A292C7FCA25C5C90B5FCA2EBF80F
+8080A491C8FCAAB512F0A221257EA427>I<B500E0B512E0A23B03F80003F800AF90B6FC
+A29038F80003B0B500E0B512E0A22B257EA430>72 D<B512E0A23803F800B3AFB512E0A2
+13257EA417>I<B512F0A2D803F8C7FCB3A31503A31506A3150EA2151E153E157CEC03FC
+B6FCA220257EA425>76 D<D8FFF8EDFFF86D5C0003EEFE00017EEC037EA36D1406A26D6C
+130CA26D6C1318A26D6C1330A36D6C1360A26D6C13C0A2903900FC0180A291387E0300A3
+EC3F06A2EC1F8CA2EC0FD8A2EC07F0A36E5AEA07803CFFFC01C01FFFF8A235257EA43A>
+I<D8FFF8903807FFE07FD803FE9038003C006D14187F6D7E6D7E806D7E6D7E13036D7E6D
+7E80EC7F80EC3FC0141FEC0FE015F0EC07F8EC03FC1401EC00FE157F1698ED3FD8ED1FF8
+150F15071503A2150115001678486C1438D8FFFC1418A22B257EA430>I<01FF13800007
+13E3380F80F7381E001F48130F481307140312F81401A27E91C7FCB4FCEA7FE013FE383F
+FFE014F86C13FE00077F6C1480C67E010313C0EB003FEC0FE01407A200C01303A315C07E
+6C13076C14806CEB0F0038FFC03E38E3FFF838803FE01B257DA422>83
+D<B539E00FFFC0A2D803F8C7EA78001630B3A700015D7F00005D137C6D495A6D0107C7FC
+90380FE03E903803FFF89038007FC02A257EA42F>85 D<B53B81FFFE01FFF0A23D07F000
+1FC0000F007013066C6C010F5CA26F7E6C6C5EA26D496C1338000017304B7E017F01195C
+A291388030FE013F5E829139C0607F01011F5E03E0138190280FE0C03F83C7FCA29139F1
+801FC3010715C617E69139FB000FEE010315EC02FF14FC6D486D5AA24A130301005DA24A
+130102785CA202306D5A3C257FA43F>87 D<EA07FF001F13E0383E03F0383F00F880147E
+121EC7FCA3EB1FFE3803FE7EEA0FC0EA1F00123E127E5AA314BEEA7E01383F073E391FFE
+1FE03807F00F1B187E971E>97 D<EAFFC0A2120FACEBC1FCEBCFFF9038FC0FC09038F007
+E09038C003F0A2EC01F8A215FCA815F8A2EC03F013E09038F007E090381C1F80390E0FFF
+00380C03F81E267FA522>I<EB7FE03803FFF83807C07C381F80FC13005A007E13781400
+12FEA8127E127F6C130CEA1F80EBC0183807E0703803FFE038007F0016187E971B>I<EC
+FFC0A2140FAC137F3803FFCF380FE0FF381F803F383F000FA2127EA212FEA8127EA27E14
+1F381F803F380FC0EF3903FFCFFC3800FE0F1E267EA522>I<137F3803FFC03807C1F038
+0F80F8EA1F0048137C127E147E12FEA2B512FEA248C7FCA3127EA214067E6C130C380F80
+183807E0703803FFE038007F8017187E971C>I<EB1FC0EB7FF0EA01F83803E1F8120713
+C1380FC0F01400A7B5FCA2EA0FC0B3A2EAFFFEA215267EA513>I<3901FF07C00007EBDF
+E0380F83F1EA1F01393E00F800007E7FA6003E5B6C485A380F83E0EBFFC0001190C7FC00
+30C8FCA21238123C383FFFE06C13FC806C7F481480383C003F48EB0FC000F81307A4007C
+EB0F806CEB1F00381F807E3807FFF8C613C01B247E971F>I<EAFFC0A2120FAC14FE9038
+C3FF809038CE0FC013D89038D007E013E0A213C0AF39FFFC7FFEA21F267EA522>I<120F
+EA1F80EA3FC0A4EA1F80EA0F00C7FCA7EA7FC0A2120FB3A2EAFFF8A20D277EA611>I<EA
+FFC0A2120FB3B0EAFFFCA20E267EA511>108 D<26FF80FE137F903A83FF81FFC03B0F8E
+0FC707E0019813CC903A9007E803F001A013F0A201C013E0AF3BFFFC7FFE3FFFA230187E
+9733>I<38FF80FE903883FF80390F8E0FC0139890389007E013A0A213C0AF39FFFC7FFE
+A21F187E9722>I<EB7F803803FFF03807C0F8381F807E48487EA2007EEB1F80A200FE14
+C0A8007E1480A26CEB3F00A2381F807E6C6C5A3803FFF038007F801A187E971F>I<38FF
+C1FCEBCFFF390FFC1FC09038F007E001C013F0140315F8140115FCA8EC03F8A215F0EBE0
+079038F00FE09038DC1F809038CFFF00EBC3F801C0C7FCA9EAFFFCA21E237F9722>I<38
+FF83E0EB8FF8380F8C7CEB90FC13B013A01478EBE0005BAEEAFFFEA216187F9719>114
+D<3807F8C0EA1FFFEA3C07EA7001EAF000A300FC1300B47EEA7FFC7F383FFF80000F13C0
+120338001FE01303EAC001A212E014C0EAF00338FC078038EFFF00EAC3FC13187E9718>
+I<13C0A41201A312031207120F121FB512C0A2380FC000AC1460A63807E0C013E13801FF
+8038007E0013237FA218>I<39FFC07FE0A2000F1307B0140FA200071317EBE0673903FF
+C7FE38007F071F187E9722>I<39FFF80FF8A2390FC001C015803907E00300A26D5A0003
+1306EBF80E0001130C13FC00005B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21D
+187F9720>I<3BFFF9FFE0FF80A23B1FC03F001C00000F6D13181580D807E05CA29039F0
+3FC07000030137136015E02601F8635BA29038FCE3F1000001C15B15F990267F80FBC7FC
+A215FF90383F007EA2011E133CA3010C131829187F972C>I<39FFF83FF0A2390FC00F00
+3807E00E6C6C5A6D5A6C6C5A00001360EB7EC06D5AA2131F6D7E497E80EB33F81361EBE0
+FC3801C07E3803807F3907003F8048131F39FFC07FF8A21D187F9720>I<39FFF80FF8A2
+390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC00005B13FEEB7E30
+A26D5AA214E06D5AA26D5AA26DC7FCA21306A25B1230EA781CEAFC185B1370EA68E0EA7F
+C0001FC8FC1D237F9720>I<387FFFF8A2387C03F0EA700738600FE000E013C0EB1F80EA
+C03F1400137EEA00FE5B485A0003130C13F0EA07E0120FEBC01C381F8018003F1338387F
+0078387E01F8B5FCA216187E971B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmsl10 10.95 29
+/Fj 29 122 df<903803F07C90381E0DC69038380F0FEB701E01E0130EEC0C003801C01C
+A548485A007FB512C03903803800A448485AA6000E5BA648485A001E7F38FF8FFC20207E
+9F1B>11 D<EB03E0EB1C181338EB703C13E014383801C000A5485A387FFFF038038070A4
+380700E0A6380E01C0A6381C0380001E13C038FF0FF016207E9F19>I<13201360A43830
+61C0383C4380380E4E00EA0778EA01E0A2EA07B8EA1C9CEA708FEAE083EA0180A490C7FC
+12147AA117>42 D<13181338EA01F8EA0E701200A513E0A6EA01C0A6EA0380A6EA070013
+80EAFFFC0E1E7B9D17>49 D<EB3F80EBC1E038010070000213785AA2000F137C1380A2EB
+00781206C712F814F0EB01E014C0EB0380EB0700130E5B5B13605B485A38030020120600
+0813405A383FFFC0481380B5FC161E7E9D17>I<13FFEA01FE1380A5EA0300A61206A65A
+A65AA65AA65AA6B4FCA2102D7EA10D>91 D<13FFEA01FEEA0006A5130CA61318A61330A6
+1360A613C0A6EA0180A6EAFF00A2102D82A10D>93 D<EA07F8EA0C0CEA1E061307121C12
+00A313FFEA07C7EA1E07EA3C0E127800F01310A3131EEB2E2038784F40381F878014147D
+9317>97 D<13FEEA0383380E0780121C0038130090C7FC12785AA45AA37E5BEA70026C5A
+EA1C18EA07E011147D9314>99 D<1438EB01F8EB00781438A21470A614E013FCEA0382EA
+0601121CEA3C00383801C0127812F0A438E00380A412F0EA700738380F00381C37803807
+C7E015207D9F19>I<13F8EA070EEA0E07381C038012381278127012F0B5FC00F0C7FCA2
+5AA46C5AEA7002EA3004EA1C18EA07E011147D9314>I<EB07C0EB1C60EB30F01360EBE0
+E0EBC0001201A5485AEA3FFCEA0380A448C7FCA6120EA65A121EEAFFC014207F9F0E>I<
+140EEB3E11EBE1A33801C1C2380381E0EA07801301120FA3380703C01480EB8700EA04FC
+48C7FCA21218121CEA0FFF14C014E0381800F04813305A5AA3006013606C13C0381C0700
+EA07FC181F809417>I<13E0120712011200A2485AA6485AEB8F80EB90E013A0EBC06013
+80000713E01300A5380E01C0A6381C0380001E13C038FF8FF014207E9F19>I<EA01C0EA
+03E0A213C0EA0180C7FCA6EA0380121F12071203A2EA0700A6120EA65A121EEAFF800B1F
+7F9E0C>I<13E0120712011200A2EA01C0A6EA0380A6EA0700A6120EA65A121EEAFF800B
+207F9F0C>108 D<390387C07C391F9861863907A072073903C03403EB80380007EB7807
+EB0070A5000EEBE00EA64848485A001EEBE01E3AFFCFFCFFC022147E9326>I<38038F80
+381F90E0EA07A03803C0601380000713E01300A5380E01C0A6381C0380001E13C038FF8F
+F014147E9319>I<13FCEA0387380E0180381C00C04813E0A24813F012F0A438E001E0A2
+14C0130300F0138038700700EA380E6C5AEA07E014147D9317>I<EBE3E03807EC383801
+F01C6C487E140F48487E1580A53903800F00A2140E141E141C5C38074070EB61C0011FC7
+FC90C8FCA3120EA4121EEAFFC0191D809319>I<EBFC2038038260EA0702381E01E0123C
+003813C0127812F0A438E00380A212F0A21307127038380F00EA1C37EA07C7EA0007A313
+0EA4131EEBFFC0131D7D9318>I<EA038E381FB380EA07C71203EB8300EA078090C7FCA5
+120EA65A121EEAFFC011147E9312>I<EA01F9EA0607EA080312181301EA3802EA3C0012
+1F13F0EA07FCEA01FEEA001FEA40071303A212601306EAF004EAC818EA87E010147F9312
+>I<1380EA0100A35A5A5A121EEAFFF8EA0E00A45AA65A1310A41320A2EA1840EA0F800D
+1C7C9B12>I<381C0380EAFC1FEA3C07EA1C03A238380700A6EA700EA4131EA25BEA305E
+381F9F8011147B9319>I<38FF83F8381E00E0001C13C01480121E380E01005B13025B12
+075BA25BEA039013A013E05B5B120190C7FC15147C9318>I<39FF9FE1FC393C07807039
+1C030060148015401580EA0E0790380D81001309EB19C21311380F21C4EA0720EB40C814
+E8EB80F0A26C485A1460000213401E147C9321>I<381FF0FF3803C07800011370144038
+00E0C0EBE180EB73001376133CA2131C132E134E1387EA0107380203801204380C01C038
+3C03E038FE07FC18147F9318>I<390FF83F803901E00E00EBC00C140813E000005B1430
+14205C13705CA20171C7FC1339133A133E133C133813181310A25BA25BEA70C0EAF08000
+F1C8FC12E61278191D809318>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmcsc10 10.95 16
+/Fk 16 121 df<1318A2133CA3134EA213CF1387A238010380A2000313C0EA0201A23807
+FFE0EA0400A2481370A2001813380038137838FE01FF18177F961C>97
+D<EB7E083803819838070078000C1338001C13185A00781308127000F01300A700701308
+127812386C1310120C000713603803818038007E0015177E961B>99
+D<EAFFFE381C0780EB01C0EB00E01470A21438A2143CA71438A21478147014E0EB01C0EB
+038038FFFE0016177E961C>I<B512C0EA1C011300144014601420A213081400A21318EA
+1FF8EA1C181308A390C7FCA6EAFFC013177E9618>102 D<EB7E08380381983807007800
+0C1338001C13185A00781308127000F01300A5EB03FEEB00381270127812387E120C1207
+380380D838007F0817177E961D>I<38FF87FC381C00E0AAEA1FFFEA1C00AA38FF87FC16
+177E961C>I<EAFF80EA1C00B3A3EAFF8009177E960E>I<EA1FF0EA01C0B112E1A2EAC180
+EA4300123E0C177E9613>I<EAFFC0001CC7FCAD1440A314C0A2148013011307B5FC1217
+7E9617>108 D<00FCEB07F0001C1480A20016130BA200131313A338118023A23810C043
+A3EB6083A2EB3103A3131AA2130C123800FEEB1FF01C177E9622>I<38FC01FC381E0070
+14201217EA1380A2EA11C0EA10E0A213701338A2131C130E1307A2EB03A0EB01E0A21300
+1460123800FE132016177E961C>I<EAFFFCEA1C07EB03C0130114E0A414C01303EB0700
+EA1FFC001CC7FCAAB47E13177E9619>112 D<EA0FC4EA302CEA601CEA400CEAC004A3EA
+E0001270127FEA3FE0EA0FF8EA01FCEA001C130E13061280A3EAC004EAE008EAD810EA87
+E00F177E9615>115 D<387FFFFC3870381C00401304A200C0130600801302A300001300
+AE3803FF8017177F961B>I<38FF81FC381C00701420B0000C1340120E6C138038018300
+EA007C16177E961C>I<38FF80FE381F0070000E13606C1340EB80803803C100EA01C3EA
+00E213F4137813387F133E134E13C7EB8780380103C0EA0201380600E0000413F0000C13
+70003C137800FE13FF18177F961C>120 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmti10 10.95 1
+/Fl 1 47 df<127012F8A212F012E005057B840E>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmbxti10 14.4 1
+/Fm 1 47 df<120E123FEA7F80A212FFA21300127E123C0909798815>46
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmbx12 17.28 37
+/Fn 37 122 df<EB01C01303130F137FEA1FFFB5FC13BFEAE03F1200B3B1007FB512F0A3
+1C2E7AAD28>49 D<EB3FE03801FFFE0007EBFF80D80F8013C0391E003FE00038EB1FF000
+7CEB0FF8007EEB07FCB4FC018013FEA21403A2EA7F00003E1307C7FC15FCA2EC0FF8A215
+F0EC1FE015C0EC3F80EC7F00147E14F8495A495A495A49C7FC011E130E5B133849131E49
+131C485A48C7123C48B512FC5A5A5A4814F8B6FCA31F2E7CAD28>I<1578A215FCA34A7E
+A24A7EA24A7FA34A7FEC0E7F021E7FEC1C3FA202387F151F02787FEC700FA202E07F1507
+010180ECC003A249486C7EA201078191C7FC498191B6FCA24981011CC7123F013C810138
+141FA24981160F01F081491407A2484881486C1403B549B512FCA336317DB03D>65
+D<B712C016FC16FFD801FEC77FEE7FE0707E161F707EA2831607A4160FA25FA24C5A4C5A
+4C5A4B485ADB1FFEC7FC90B65AEEFF8049C7EA3FE0EE0FF0EE07FCA2707E83821880A718
+005E5F16074C5A4C5AEEFFF0B812C094C7FC16F831317DB039>I<913A03FF800180023F
+EBF00349B5EAFC0701079038003F0FD91FF8EB079FD93FC0EB01FFD9FF807F4848C8127F
+4848153F0007161F49150F485A001F1607A2485A1703127FA24992C7FCA212FFA9127FA2
+7FEF0380123FA26C7E1707000F17006C7E6D150E0003161E6C6C151C6C6C6C1478D93FC0
+5CD91FF8EB03E0D907FFEB3F800101D9FFFEC7FCD9003F13F80203138031317CB03A>I<
+B812E0A3C6903880007FEE0FF016031601A21600A21770A31738A21507A21700A35D5D5D
+91B5FCA3EC803F818181A592C8FCACB612C0A32D317EB033>70 D<DA03FF1303027FEBF0
+0749B5EAFC0F01079038007E1FD91FF0EB0FBFD97FC0EB03FF49487F4848C87E485A0007
+824848815B001F82A2484881A2127FA24992C7FC12FFAA0307B512F8127F7FDB00011300
+123FA26C7EA2120F7F6C7E12036C7E6C6C7E6D6C5BD91FF8497ED907FFEB3E3F01019038
+FFFC1F6D6CEBF00F0203EB800335317CB03F>I<B6D8807FB512C0A3C60180C7387FC000
+B391B7FCA30280C7127FB3A3B6D8807FB512C0A33A317EB03F>I<B61280A3C6EB8000B3
+B3A7B61280A319317EB01E>I<B500C00303B5FCA26E5DC61900D9EFF0150EA3D9E7F85D
+A2D9E3FC5DA2D9E1FE5DA2D9E0FF5DA26E6C495AA26E6C495AA36E6C495AA26E6C130EA2
+6E6C5BA26E6C5BA26E6C5BA26E6C5BA392387F81C0A292383FC380A2DB1FE7C7FCA2ED0F
+FEA26F5AA36F5A487EB526E001F090B6FCA26F5A48317EB04D>77
+D<B56C49B512C08080C66D90390003E0006E6E5AEBEFFC13E780EBE3FF01E17F01E07F6E
+7E143F816E7E6E7E6E7E14036E7E16806E13C0ED7FE0ED3FF0151F16F8ED0FFCED07FEED
+03FF6F13818117C1EE7FE1EE3FF1EE1FF9EE0FFD160717FF828282177F173FA2171F170F
+486C1507B500E014031701A23A317EB03F>I<B712E016FEEEFF80C6D9800013E0EE3FF0
+EE0FF8EE07FCA2EE03FEA217FFA717FEA2EE07FC17F8160FEE3FE0EEFFC091B6120016F8
+0280C8FCB3A2B67EA330317EB037>80 D<007FB8FCA39039C00FF801D87E00EC003F007C
+82007882A200708200F01780A3481603A5C792C7FCB3AA017FB6FCA331307DAF38>84
+D<B6D88003B51280A3C60180C73807C000715AB3AE137F4DC7FC80013F150EA26D6C5C6D
+6C5C6D6C5C6D6C495A903A00FF801FC0023FB55A020F49C8FC020013E039317EB03E>I<
+B500FC91B5FCA3000390C8EA03C06C17806E14076C170080017F150EA26E141E013F151C
+6E143C011F153880010F5D8001075DA26E130101035D6E13036D5D15806D4AC7FCA26F5A
+027F130EEDE01E023F131CEDF03C021F133815F8020F5BA2EDFCF002075B15FF6E5BA26E
+5BA26E90C8FCA3157EA2153CA238317EB03D>I<EBFFF0000313FF390F803F809038C00F
+E0486C6C7EA26E7ED80FC07FEA0780C7FCA414FF131FEBFFE33803FC03EA0FF0EA1FC012
+3FEA7F80A2EAFF00A31407A2387F800D393FC01DFE3A1FE078FFF03907FFE07FC6EB803F
+24207E9F27>97 D<EA01F812FFA3120F1207ADEC3FE0ECFFFC9038FBE07F9039FF001F80
+49EB0FC04914E049EB07F016F8A2ED03FCA316FEA816FCA3ED07F8A216F06DEB0FE06D14
+C001E7EB3F809039C3C0FE00903880FFF89038003FC027327EB12D>I<EB0FFF017F13C0
+3901FC01F03803F0033907E007F8120FEA1FC0003FEB03F0EC01E04848C7FCA312FFA812
+7FA36C6C131CA2001F14386C7E000714703903F001E03901FC07C039007FFF00EB0FF81E
+207D9F24>I<ED0FC0EC07FFA3EC007F153FADEB07F8EB3FFF9038FE07BF3903F801FF39
+07E0007F120F4848133F123FA2485AA312FFA8127FA36C7EA2121F6C6C137F000714FF26
+03F00313E03A01FC0F3FFE38007FFEEB0FF027327DB12D>I<EB0FFC90387FFF803901FC
+0FC03903F003E03907E001F0000F14F8391FC000FC003F14FEA24848137E157FA212FFA2
+90B6FCA20180C7FCA4127FA36C6C1307121F150E6C7E6C6C131C6C6C13783900FE03E090
+383FFFC0903807FE0020207E9F25>I<EB01FE90380FFF8090381FC3C090387F07E09038
+FE0FF0120113FC1203EC07E0EC018091C7FCA8B512FCA3D803FCC7FCB3A8387FFFF0A31C
+327EB119>I<90391FF007C09039FFFE3FE03A01F83F79F03907E00FC3000F14E19039C0
+07E0E0001FECF000A2003F80A5001F5CA2000F5CEBE00F00075C2603F83FC7FC3806FFFE
+380E1FF090C9FC121EA2121F7F90B57E6C14F015FC6C806C801680000F15C0003FC7127F
+007EEC1FE0007C140F00FC1407A4007EEC0FC0003E1580003F141FD80FC0EB7E003907F8
+03FC0001B512F0D8001F90C7FC242F7E9F28>I<EA01F812FFA3120F1207ADEC07F8EC3F
+FEEC783F02C013809039F9801FC0EBFB0001FE14E05BA35BB3B500C3B5FCA328327DB12D
+>I<EA03C0487E487E487EA46C5A6C5A6C5AC8FCA9EA01F8127FA31207B3A7B51280A311
+337DB217>I<EA01F812FFA3120F1207B3B3A6B512C0A312327DB117>108
+D<2703F007F8EB1FE000FFD93FFEEBFFF8913A783F01E0FC02C090388300FE280FF1801F
+C6137F2607F30013CC01F602F8148001FC5CA3495CB3B500C3B5380FFFFCA33E207D9F43
+>I<3903F007F800FFEB3FFEEC783F02C013803A0FF1801FC03807F30001F614E013FCA3
+5BB3B500C3B5FCA328207D9F2D>I<EB07FC90387FFFC03901FC07F03903F001F848486C
+7E4848137E001F147F003F158049133F007F15C0A300FF15E0A8007F15C0A36C6CEB7F80
+A2001F15006C6C13FE00075C3903F803F83901FE0FF039007FFFC0D907FCC7FC23207E9F
+28>I<3901F83FE000FFEBFFFC9038FBE07F9039FF003F80D80FFEEB1FC06C48EB0FE049
+14F0ED07F8A216FC1503A216FEA816FC1507A216F8A2ED0FF06D14E06DEB1FC06DEB3F80
+9039FBC0FE009038F8FFF8EC3FC091C8FCABB512C0A3272E7E9F2D>I<3803F03F00FFEB
+7FC09038F1C3E01487390FF30FF0EA07F6A29038FC07E0EC03C091C7FCA25BB2B512E0A3
+1C207E9F21>114 D<3801FF86000713FEEA1F00003C133E48131E140E12F8A36C90C7FC
+B47E13FC387FFFC06C13F0806C7F00077F00017FEA003F01001380143F0060131F00E013
+0FA27E15007E6C131E6C131C38FF807838F3FFF038C07F8019207D9F20>I<131CA5133C
+A3137CA213FC120112031207381FFFFEB5FCA2D803FCC7FCB0EC0380A71201EC0700EA00
+FEEB7F0EEB3FFCEB07F0192E7FAD1F>I<D801F8EB07E000FFEB03FFA3000FEB003F0007
+141FB3153FA20003147FA26C6CEBDFF03A00FE039FFF90387FFF1FEB0FFC28207D9F2D>
+I<B5EB1FFCA3D80FF8EB03C0000715806D1307000315007F0001140E7F6C5CA2EC803C01
+7F1338ECC078013F1370ECE0F0011F5B14F1010F5B14F9903807FB80A214FF6D90C7FCA2
+6D5AA26D5AA21478A226207E9F2B>I<B53A1FFFE03FF8A33C0FF000FE0007806D150300
+076EEB0700816D5D00039138FF800EA26C6C486D5A15DF01FF153C6C9039038FE038A2D9
+7F876D5A150702C714F0D93FCF6D5AECCE03D91FFEEBF9C09138FC01FD16FF010F5D4A7E
+A26D486DC7FCA20103147E4A133EA26D48131C35207E9F3A>I<3A7FFF807FFCA33A03FC
+000F006C6C131E6C6C5BEC803890387FC078013F5B90381FE1E090380FF3C0ECFF806D90
+C7FC6D5A13016D7E81815B903803DFE09038078FF08190380F07FC90381E03FEEB3C0149
+6C7E4914804848EB7FC00003EC3FE026FFFC01B5FCA328207F9F2B>I<B5EB1FFCA3D80F
+F8EB03C0000715806D1307000315007F0001140E7F6C5CA2EC803C017F1338ECC078013F
+1370ECE0F0011F5B14F1010F5B14F9903807FB80A214FF6D90C7FCA26D5AA26D5AA21478
+A21470A214F05C1301007C5BEAFE035C49C8FC5BEAFC1EEA787CEA3FF0EA0FC0262E7E9F
+2B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fo cmsy10 10.95 1
+/Fo 1 14 df<14FE903807FFC090381F01F0903878003C01E0130ED80180130348C7EA01
+800006EC00C0481560A2481530481518A248150CA4481506A90060150CA46C1518A26C15
+306C1560A26C15C06CEC01806C6CEB0300D800E0130E0178133C90381F01F0903807FFC0
+D900FEC7FC272B7DA02E>13 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fp cmbx12 14.4 48
+/Fp 48 122 df<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A2120612
+0E5A5A12100A157B8813>44 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>46
+D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277BA622>49
+D<EBFF80000713F04813FC381E03FE393800FF80007C133F00FE14C06C131F15E0140FA2
+127E003C131FC7FC15C0A2EC3F801500147E5C5C495A495AEB078049C7FC131E4913E013
+705B3901C001C0EA0380EA0600000FB5FC5A5A5AB61280A31B277DA622>I<EB7F803803
+FFF04813FC380F81FE381F007FEA3F80EC3F80A3121F1300C7EA7F00A2147E5C495AEB07
+F0EBFFC0A2EB01F8EB007E801580EC1FC0A215E0A2123C127EB4FCA215C0143F48148000
+7CEB7F00383F01FE6CB45A000713F0C613801B277DA622>I<140FA25C5C5C5C5BA2EB03
+BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12F0B612F8
+A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C5C14C091
+C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215E0A21218
+127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C613801B277DA6
+22>I<EC0780A24A7EA34A7EA24A7EA3EC77F8A2ECF7FC14E3A2903801C1FEA201037F14
+80A249486C7EA24980010E133FA2496D7EA2013FB57EA39039700007F8A201F080491303
+000181491301A2000381D8FFFE013F13FCA32E297EA833>65 D<B612F815FF16C03A03F8
+001FE0ED0FF0ED07F8150316FCA21501A3150316F8A2ED07F0150FED1FC0EDFF8090B5EA
+FE00EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216FFA616FE1501ED03FC1507ED1F
+F8B712E016C0EDFE0028297DA830>I<91387FE003903907FFFC07011FEBFF0F90397FF0
+0F9F9039FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA290
+C9FC5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F09039
+7FF007C0011FB512800107EBFE009038007FF028297CA831>I<B612FCEDFF8016E03A03
+FC001FF8ED03FCED00FE167FEE3F80EE1FC0A2EE0FE0A2EE07F0A417F8AA17F0A3EE0FE0
+A217C0161FEE3F80EE7F005EED03FCED1FF8B75A168003FCC7FC2D297EA834>I<B712E0
+A33903FC001FED07F01501A215001670A3913801C0781638A302031300A2140F90B5FCA3
+EBFC0F1403A20201130EA3161C91C7FCA3163C1638167816F815011503151FB712F0A327
+297EA82C>I<B712C0A33903FC003FED0FE015031501A21500A316F0913801C070A31600
+1403A2140F90B5FCA3EBFC0F1403A21401A491C8FCA9B512FCA324297EA82A>I<91387F
+E003903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F48488048488048
+4880485A82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E
+6C7E6C7E6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>I<B5
+D8F00FB5FCA3D803FCC7EA3FC0AF90B7FCA301FCC7123FB1B5D8F00FB5FCA330297EA835
+>I<B512F0A33803FC00B3B1B512F0A314297EA819>I<B512FCA3D803FCC8FCB3A3ED01C0
+A415031680A21507A2150FA2151F157F913801FF00B7FCA322297EA828>76
+D<D8FFFE92383FFF80A26D5D0003EFE000A2D9BF8014EFA2D99FC0EB01CFA2D98FE0EB03
+8FA3D987F0EB070FA2D983F8130EA2D981FC131CA3D980FE1338A2027F1370A291383F80
+E0A391381FC1C0A291380FE380A2913807F700A3EC03FEA26E5AA26E5AD8FFFE0203B512
+80A2157039297DA840>I<D8FFFCEC7FFF7F7F00036DEB01C080EBBFE0139F80EB8FF8EB
+87FCEB83FEEB81FF01801380147F15C0EC3FE0EC1FF0EC0FF8EC07FC140315FEEC01FF6E
+1381ED7FC1ED3FE1ED1FF1150F16F9ED07FDED03FF8181167FA2163F161F160F1607D8FF
+FE14031601A230297EA835>I<B612F815FF16C03A03FC003FE0ED07F0ED03F816FC1501
+16FEA716FC150316F8ED07F0ED3FE090B61280EDFE0001FCC8FCB0B512F0A327297EA82E
+>80 D<B612E015FE6F7E3A03FC003FE0ED0FF06F7E6F7E150182A65E4B5A1507ED0FE0ED
+3FC090B500FEC7FCA29039FC00FF80ED3FC06F7E6F7E6F7EA9170EA21503923801FC1CB5
+38F000FEEE7FF8EE0FE02F297EA832>82 D<9038FF80600003EBF0E0000F13F8381F80FD
+383F001F003E1307481303A200FC1301A214007EA26C140013C0EA7FFCEBFFE06C13F86C
+13FE80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E01303A46C14E0A26C
+13076C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA825>I<007FB71280
+A39039807F807FD87C00140F00781507A20070150300F016C0A2481501A5C791C7FCB3A4
+90B612C0A32A287EA72F>I<B500F0EBFFFEA3D803FCC7EA0380B3AA0001ED07007F0000
+150E137F6D143CD91FC05B90390FF003F06DB55A01001480DA1FFCC7FC2F297EA834>I<
+B500F0EB7FFFA3D803FEC7EA01C00001ED0380A26D14076C16006E5B017F140E80013F5C
+A26E133C011F14386E1378010F14708001075CA26D6C485AA2ECFE0301015CECFF076D91
+C7FC1587EC7F8EA215DEEC3FDC15FC6E5AA26E5AA36E5AA26E5AA230297FA833>I<B53C
+E07FFFE01FFFC0A32803FC0003FCC7EA7000A26D6D7E000160A26D6E13016C604B138002
+801503017F5F4B13C0D93FC0013F49C7FCA2913AE00E1FE00F011F160E17F09126F01C0F
+131E010F161C033C13F8902707F838075BA2037813FC902703FC70035BA2913AFEE001FE
+F001015E02FF14FF4B7E6D5EA26E486D5AA36EC76CC8FCA2023E80021E141EA242297FA8
+45>I<3803FF80000F13F0381F01FC383F80FE147F801580EA1F00C7FCA4EB3FFF3801FC
+3FEA0FE0EA1F80EA3F00127E5AA4145F007E13DF393F839FFC381FFE0F3803FC031E1B7E
+9A21>97 D<EAFFE0A3120FACEBE1FE9038EFFF809038FE07E09038F803F09038F001F890
+38E000FCA2157EA2157FA8157EA315FCA29038F001F89038F803F090389C0FE090380FFF
+80390E01FC00202A7EA925>I<EB3FF03801FFFC3803F03E380FC07FEA1F80EA3F00A248
+133E007E90C7FCA212FEA7127EA2127F6CEB03801380001FEB0700380FE00E3803F83C38
+01FFF838003FC0191B7E9A1E>I<EC7FF0A31407ACEB3F873801FFF73807F03F380FC00F
+381F8007EA3F00A2127EA312FEA8127EA27EA2381F800F380FC01F3907E07FFF3801FFE7
+38007F87202A7EA925>I<EB3FC03801FFF03803E07C380F803E001F7F130048EB0F8012
+7E15C0A200FE1307A2B6FCA248C8FCA3127EA2127F6CEB01C07E390F8003803907C00700
+3803F01E3800FFFCEB3FE01A1B7E9A1F>I<EB07F8EB3FFCEB7E3E3801FC7FEA03F813F0
+1207143E1400A7B512C0A33807F000B3A3387FFF80A3182A7EA915>I<9038FF80F00003
+EBE3F8390FC1FE1C391F007C7C48137E003EEB3E10007EEB3F00A6003E133E003F137E6C
+137C380FC1F8380BFFE00018138090C8FC1238A2123C383FFFF814FF6C14C06C14E06C14
+F0121F383C0007007CEB01F8481300A4007CEB01F0A2003FEB07E0390FC01F806CB51200
+38007FF01E287E9A22>I<EAFFE0A3120FAC147E9038E1FF809038E30FC001E413E0EBE8
+0701F813F013F0A213E0B039FFFE3FFFA3202A7DA925>I<1207EA0F80EA1FC0EA3FE0A3
+EA1FC0EA0F80EA0700C7FCA7EAFFE0A3120FB3A3EAFFFEA30F2B7EAA12>I<EAFFE0A312
+0FB3B2EAFFFEA30F2A7EA912>108 D<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1
+F8D80FC49038F101FC9039C803F20001D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0
+A3331B7D9A38>I<38FFC07E9038C1FF809038C30FC0D80FC413E0EBC80701D813F013D0
+A213E0B039FFFE3FFFA3201B7D9A25>I<EB3FE03801FFFC3803F07E390FC01F80391F80
+0FC0393F0007E0A2007EEB03F0A300FE14F8A8007E14F0A26CEB07E0A2391F800FC0390F
+C01F803907F07F003801FFFC38003FE01D1B7E9A22>I<38FFE1FE9038EFFF809038FE0F
+E0390FF803F09038F001F801E013FC140015FEA2157FA8157E15FEA215FC140101F013F8
+9038F807F09038FC0FE09038EFFF809038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<
+38FFC1F0EBC7FCEBC63E380FCC7F13D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>
+114 D<3803FE30380FFFF0EA3E03EA7800127000F01370A27E00FE1300EAFFE06CB4FC14
+C06C13E06C13F0000713F8C6FCEB07FC130000E0137C143C7E14387E6C137038FF01E038
+E7FFC000C11300161B7E9A1B>I<13E0A41201A31203A21207120F381FFFE0B5FCA2380F
+E000AD1470A73807F0E0000313C03801FF8038007F0014267FA51A>I<39FFE07FF0A300
+0F1307B2140FA2000713173903F067FF3801FFC738007F87201B7D9A25>I<39FFFC03FF
+A3390FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0E
+A2149EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B
+0FE00FE001C02607F007EB0380A201F8EBF00700031600EC0FF801FC5C0001150EEC1FFC
+2600FE1C5B15FE9039FF387E3C017F1438EC787F6D486C5A16F0ECE01F011F5CA26D486C
+5AA2EC800701075CA22E1B7F9A31>I<39FFFC1FFEA33907F003803803F8079038FC0F00
+3801FE1E00005BEB7F3814F86D5A6D5A130F806D7E130F497EEB3CFEEB38FFEB787F9038
+F03F803901E01FC0D803C013E0EB800F39FFF03FFFA3201B7F9A23>I<39FFFC03FFA339
+0FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA214
+9EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA25CA21307003890C7FCEA7C0FEAFE0E131E13
+1C5BEA74F0EA3FE0EA0F8020277F9A23>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fq cmtt10 10.95 73
+/Fq 73 127 df<127012F8B012701200A5127012F8A31270051C779B18>33
+D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<EA0306EA078FA6387FFFC0B5
+12E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E3C00A6EA0C18131C7E9B18>
+I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013C7A338F1C0001279123F
+6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC7001271EA79DEEA3FFEEA1F
+F8EA07E0EA01C0A3120011247D9F18>I<EA3803387C0780A2EAEE0F1400A25B131EA213
+3EEA7C3CA2EA387CEA0078A213F85B12015BA212035BA21207EB8380EB87C0120FEB0EE0
+A2121F121EA2123E383C07C0A23818038013247E9F18>I<EA01C0EA07E0487EEA0E7048
+7EA4EB73F813F313E3380FC1C0EBC38013831303381F0700EA3F87EA7B8EEA71CEEAE1FC
+12E0137CEB7870A2EA70FE387FFFE0EA3FC7380F03C0151C7F9B18>I<137013F0EA01E0
+EA03C0EA0780EA0F00121E121C5AA25AA45AA81270A47EA27E121E7EEA0780EA03C0EA01
+F0120013700C24799F18>40 D<126012F012787E7E7EEA07801203EA01C0A2EA00E0A413
+70A813E0A4EA01C0A2EA03801207EA0F00121E5A5A5A12600C247C9F18>I<EA01C0A4EA
+41C138F1C780EAFDDF387FFF00EA1FFCEA07F0A2EA1FFCEA7FFF38FDDF80EAF1C73841C1
+00EA01C0A411147D9718>I<136013F0A7387FFFC0B512E0A26C13C03800F000A7136013
+147E9718>I<121C123E127E127F123F121F1207120E121E127C12F81260080C788518>I<
+387FFFC0B512E0A26C13C013047E8F18>I<1230127812FCA2127812300606778518>I<13
+03EB0780A2130F14005B131EA2133E133C137C1378A213F85B12015B12035BA212075B12
+0F90C7FCA25A121E123E123CA2127C127812F85AA2126011247D9F18>I<EA01F0EA07FC
+487EEA1F1FEA1C0738380380007813C0EA7001A238E000E0A9EAF001007013C0A2EA7803
+00381380381C0700EA1F1FEA0FFE6C5AEA01F0131C7E9B18>I<EA01801203A21207120F
+123F12FF12FB12431203B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<EA03F0EA0FFEEA3FFF
+387C0F80387003C0EAE00138F000E0A21260C7FCA2EB01C0A21303EB0780EB0F00131E5B
+5B5B485AEA07C0485A381E00E05AEA7FFFB5FC7E131C7E9B18>I<1230127812FCA21278
+12301200A81230127812FCA2127812300614779318>58 D<1218123C127EA2123C121812
+00A81218123C127EA2123E121E120E121C123C127812F01260071A789318>I<14C0EB03
+E01307EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FCA2127F6C7EEA0FE06C
+7EEA01FC6C7EEB3F80EB1FC0EB07E01303EB00C013187E9918>I<387FFFC0B512E0A26C
+13C0C8FCA4387FFFC0B512E0A26C13C0130C7E9318>I<126012F87E127F6C7EEA0FE06C
+7EEA01FC6C7EEB3F80EB1FC0EB07E0A2EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048
+C7FC12FC5A126013187E9918>I<EA0FF0EA3FFC48B4FCEA700F38F00380A2EA60073800
+0F00133E5BEA01F05B485AA55BC8FCA5EA0380487EA36C5A111C7D9B18>I<137013F8A2
+13D8A2EA01DCA3138CEA038EA4EA0707A5380FFF80A3EA0E03381C01C0A3387F07F000FF
+13F8007F13F0151C7F9B18>65 D<EA7FF8EAFFFE6C7E381C0F80EB03C0A2EB01E01300A2
+14F01470A814F014E0A2130114C01303EB0F80387FFF00485AEA7FF8141C7F9B18>68
+D<B512F0A3381C0070A41400A2130EA3EA1FFEA3EA1C0EA390C7FCA21438A5B512F8A315
+1C7F9B18>I<B512F0A3381C0070A41400A2130EA3EA1FFEA3EA1C0EA390C7FCA7EAFFC0
+A3141C7E9B18>I<3801F1C0EA03FDEA0FFFEA1F0FEA1C03123813011270A290C7FC5AA5
+EB0FF0131F130F387001C0A213031238A2EA1C07EA1F0FEA0FFFEA03FDEA01F1141C7E9B
+18>I<387F07F038FF8FF8387F07F0381C01C0A9EA1FFFA3EA1C01AA387F07F038FF8FF8
+387F07F0151C7F9B18>I<EA7FFFB512806C1300EA01C0B3A4EA7FFFB512806C1300111C
+7D9B18>I<EAFFC0A3001CC7FCB114E0A5B5FCA3131C7E9B18>76
+D<387E07F038FF0FF8387F07F0381D81C0A313C1121CA213E1A313611371A213311339A3
+1319A2131D130DA3EA7F07EAFF87EA7F03151C7F9B18>78 D<EA0FFE383FFF804813C0EA
+7803EA700100F013E0EAE000B0EAF001007013C0EA7C07EA7FFF6C1380380FFE00131C7E
+9B18>I<EAFFFEEBFF8014C0EA1C03EB01E013001470A514E01301EB03C0EA1FFF1480EB
+FE00001CC7FCA8B47EA3141C7F9B18>I<EA7FF8EAFFFE6C7E381C0F80130314C01301A3
+13031480130F381FFF005BA2EA1C0F7FEB0380A5149CA3387F01F8EAFF81387F00F0161C
+7F9B18>82 D<3803F1C0EA1FFF5AEA7C0FEA7003EAE001A390C7FC12701278123FEA1FF0
+EA07FEC67EEB0F80EB03C01301EB00E0A2126012E0130100F013C038F80780B5FCEBFE00
+EAE7F8131C7E9B18>I<387FFFF8B5FCA238E07038A400001300B2EA07FFA3151C7F9B18>
+I<38FF83FEA3381C0070B36C13E0EA0F01380783C03803FF806C1300EA007C171C809B18
+>I<38FE03F8EAFF07EAFE03381C01C0EA1E03000E1380EA0F0700071300A2EA038EA2EA
+01DCA3EA00F8A21370A9EA01FC487E6C5A151C7F9B18>89 D<EAFFF8A3EAE000B3ACEAFF
+F8A30D24779F18>91 D<126012F0A27E1278127C123CA2123E121E121F7EA27F12077F12
+03A27F12017F12007F1378A2137C133C133E131EA2131F7F14801307A2EB030011247D9F
+18>I<EAFFF8A3EA0038B3ACEAFFF8A30D247F9F18>I<EA0180EA07C0EA1FF0EA7EFCEAF8
+3EEAE00E0F067C9B18>I<387FFFC0B512E0A26C13C013047E7F18>I<EA0FF0EA1FFC487E
+EA3C0FEA180738000380A213FF1207121FEA7F03127812E0A3EAF007EA780F383FFFF8EA
+1FFDEA07F015147E9318>97 D<127E12FE127E120EA5133EEBFF80000F13C0EBC1E01380
+EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E138038063E00151C809B18>I<
+EA01FEEA07FF001F1380EA3E073838030048C7FCA25AA61270EB01C01238EA3E03381FFF
+8000071300EA01FC12147D9318>I<EB1F80133F131F1303A5EA03E3EA0FFBEA1FFFEA3C
+1FEA380FEA7007130312E0A6EA7007A2EA380FEA3C1F381FFFF0380FFBF83803E3F0151C
+7E9B18>I<EA01F0EA07FCEA1FFEEA3E0F38380780EA7003A238E001C0A2B5FCA300E0C7
+FC1270EB01C01238EA3E07381FFF8000071300EA01F812147D9318>I<EB1F80EB7FC0EB
+FFE013E13801C0C01400A3387FFFC0B5FCA23801C000AEEA7FFFA3131C7F9B18>I<3801
+E1F03807FFF85A381E1E30381C0E00487EA5EA1C0EEA1E1EEA1FFC5BEA39E00038C7FC7E
+EA1FFEEBFFC04813E0387801F038700070481338A4007813F0EA7E03381FFFC06C138038
+01FC00151F7F9318>I<127E12FE127E120EA5133EEBFF80000F13C013C1EB80E0130012
+0EAB387FC7FC38FFE7FE387FC7FC171C809B18>I<EA0380EA07C0A3EA0380C7FCA4EA7F
+C012FF127F1201AEB5FCA3101D7C9C18>I<127E12FE127E120EA5EB3FF0A3EB0780EB0F
+00131E5B5B5BEA0FF87F139C130EEA0E0F7FEB038014C0387FC7F812FF127F151C7F9B18
+>107 D<EAFFC0A31201B3A4B51280A3111C7D9B18>I<38F9C1C038FFF7F013FF383E3E38
+EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E1714809318>I<EA7E3E38FEFF80007F13C0
+EA0FC1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC1714809318>I<EA01F0EA0FFE
+487E383E0F80EA3803387001C0A238E000E0A5EAF001007013C0EA7803383C0780EA3E0F
+381FFF006C5AEA01F013147E9318>I<EA7E3E38FEFF80007F13C0380FC1E01380EB0070
+120E1438A6000F1370A2EB80E013C1EBFFC0000E1380EB3E0090C7FCA7EA7FC0487E6C5A
+151E809318>I<3801F380EA07FBEA1FFFEA3E1FEA380FEA7007A2EAE003A6EA7007A2EA
+380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB3FF8EB1FF0151E7E9318>I<38FF
+0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FCA9EAFFFC7F5B14147E9318>I<EA
+07F7EA3FFF5AEA780FEAE007A3007CC7FCEA7FE0EA1FFCEA03FEEA001F38600780EAE003
+A212F038F80F00B5FC13FCEAE7F011147D9318>I<487E1203A4387FFFC0B5FCA2380380
+00A9144014E0A33801C1C013FF6C1380EB3E0013197F9818>I<387E07E0EAFE0FEA7E07
+EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC1714809318>I<387F8FF000FF13F800
+7F13F0381C01C0380E0380A338070700A3138FEA038EA3EA01DCA3EA00F8A2137015147F
+9318>I<38FF07F8138F1307383800E0A4381C01C0137113F9A213D9EA1DDD000D1380A3
+138DEA0F8FA23807070015147F9318>I<387F8FF0139F138F380F0700EA078EEA039EEA
+01DC13F81200137013F07FEA01DCEA039E138EEA0707000E1380387F8FF000FF13F8007F
+13F015147F9318>I<387F8FF000FF13F8007F13F0380E01C0EB0380A21207EB0700A2EA
+0387A2138EEA01CEA213CC120013DC1378A31370A313F05B1279EA7BC0EA7F806CC7FC12
+1E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB078038000F00131E5B13F8485AEA
+03C0485A380F0070121E5A5AB512F0A314147F9318>I<EB07E0131F137FEB780013E0AB
+1201EA7FC0485AA26C7EEA01E01200AB1378EB7FE0131F130713247E9F18>I<126012F0
+B3B012600424769F18>I<127CB4FC13C01203C67EAB7FEB7FC0EB3FE0A2EB7FC0EBF000
+5BABEA03C012FF90C7FC127C13247E9F18>I<EA060CEA1F1EEA3FBEEAFBF8EAF1F0EA60
+C00F067C9B18>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fr cmr10 10.95 81
+/Fr 81 125 df<90381F83E09038F06E303901C07878380380F8903800F03048EB7000A7
+B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA0701
+A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>I<EB3FE013E0EA01C1EA0381EA07
+00A8B5FCEA0700B2383FE7FC1620809F19>I<90381F81F89038F04F043901C07C063903
+80F80FEB00F05A0270C7FCA6B7FC3907007007B23A3FE3FE3FE02320809F26>I<EA7038
+EAF87CEAFC7EA2EA743AEA0402A3EA0804A2EA1008A2EA2010EA40200F0E7F9F17>34
+D<127012F812FCA212741204A31208A21210A212201240060E7C9F0D>39
+D<13401380EA01005A12061204120C5AA212381230A212701260A412E0AC1260A4127012
+30A212381218A27E120412067E7EEA008013400A2E7BA112>I<7E12407E12307E120812
+0C7EA212077EA213801201A413C0AC1380A412031300A25A1206A25A120812185A12205A
+5A0A2E7EA112>I<127012F012F8A212781208A31210A31220A21240050E7C840D>44
+D<EAFFF0A20C02808A0F>I<127012F8A3127005057C840D>I<144014C0EB0180A3EB0300
+A31306A25BA35BA35BA25BA35BA3485AA348C7FCA21206A35AA35AA25AA35AA35AA2122D
+7EA117>I<EA03F0EA0E1C487EEA1806EA380738700380A400F013C0AD00701380A3EA78
+0700381300EA1806EA1C0E6C5AEA03F0121F7E9D17>I<13801203120F12F31203B3A6EA
+07C0EA7FFE0F1E7C9D17>I<EA03F0EA0C1CEA100E487E00401380128000F013C0EAF803
+A3EA200712001480A2EB0F00130E5B5B5B13605B485A48C7FC000613405A5A00101380EA
+3FFF5AB5FC121E7E9D17>I<EA03F0EA0C1CEA100EEA200F007813801307A2EA380F1200
+1400A2131E131C1370EA07F0EA003C130E130FEB0780A214C0122012F8A300F013801240
+EB0F00EA200EEA183CEA07F0121F7E9D17>I<1306A2130EA2131E132EA2134E138EA2EA
+010E1202A212041208A212101220A2124012C0B512F038000E00A7EBFFE0141E7F9D17>
+I<EA1803EA1FFE5B5B13E00010C7FCA6EA11F0EA161CEA180EEA10071480EA0003A214C0
+A3127012F0A200E013801240EB0700EA20066C5AEA0838EA07E0121F7E9D17>I<137CEA
+0182EA0701380E0380EA0C0712183838030090C7FC12781270A2EAF1F0EAF21CEAF406EA
+F807EB0380A200F013C0A51270A214801238EB07001218EA0C0E6C5AEA01F0121F7E9D17
+>I<1240387FFFE014C0A23840008038800100A21302485AA25B5BA25BA21360A213E05B
+1201A41203A76C5A131F7E9D17>I<EA03F0EA0C0CEA1006EA3003382001801260A31270
+38780300123EEA3F06EA1FC8EA0FF0EA03F8487EEA0C7EEA103F38300F80EA6007EB01C0
+12C01300A31480EA600100201300EA1002EA0C0CEA03F0121F7E9D17>I<EA03F0EA0E18
+487E487E13071270EB038012F0A214C0A5EA7007A21238EA180BEA0E13EA03E338000380
+A3EB07001230EA7806130EEA700CEA2018EA1070EA0FC0121F7E9D17>I<127012F8A312
+701200AA127012F8A3127005147C930D>I<127012F8A312701200AA127012F012F8A212
+781208A31210A31220A21240051D7C930D>I<5B497EA3497EA3EB09E0A3EB10F0A3EB20
+78A3497EA2EBC03EEB801EA248B5FCEB000FA20002EB0780A348EB03C0A2120C001E14E0
+39FF801FFE1F207F9F22>65 D<B512E0380F0078141EA2801580A515005C141E147CEBFF
+F0EB007C141FEC0F80EC07C0140315E0A515C014071580EC0F00143EB512F01B1F7E9E20
+>I<90380FE0109038381C309038E002703803C00139078000F048C71270121E15305A15
+10127C127800F81400A91278007C1410123CA26C1420A27E6C6C13406C6C13803900E003
+00EB380CEB0FF01C217E9F21>I<B512F83807801EEC0780EC03C0EC01E0EC00F0157015
+78A2153CA3153EA8153CA2157C1578A215F0EC01E0EC03C0EC0780EC1E00B512F81F1F7F
+9E23>I<B61280380F000F14031401140015C01540A314401500A214C0130113FF130113
+001440A3EC0020A31540A315C01401EC0380140FB6FC1B1F7E9E1F>I<B6128038078007
+1401A2140015C01540A4EC2000A3146014E013FF138014601420A391C7FCA87FEAFFFE1A
+1F7F9E1E>I<90380FE02090387818609038E004E03803800238070001481300001E1460
+A25A1520127C127800F81400A7EC7FFCEC03E000781301127C123CA27EA27E7E38038002
+3900E00460903878182090380FE0001E217D9F24>I<39FFF07FF8390F000780AD90B5FC
+EB0007AF39FFF07FF81D1F7E9E22>I<EAFFF0EA0F00B3ABEAFFF00C1F7E9E10>I<3807FF
+C038003E00131EB3A3122012F8A3EAF01CEA403CEA6038EA1070EA0FC012207F9E17>I<
+39FFF007FC390F0003E0EC0180150014025C5C5C5C5C5C49C7FC5B497E130FEB13C0EB21
+E01341EB80F0EB0078A28080A280EC0780A2EC03C015E015F039FFF01FFE1F1F7E9E23>
+I<EAFFF8EA0F8090C7FCB21402A414061404A2140C141C147CB512FC171F7E9E1C>I<B4
+6CEB07FE000715C0A2D805C0130BA2D804E01313A301701323A26D1343A36D1383A29038
+0E0103A3EB0702A3EB0384A2EB01C8A3EB00F0A21460121FD8FFE0EB7FFE271F7F9E2A>
+I<B4EB0FF8390F8003E0EC0080EA0BC0EA09E0A2EA08F01378A27F7FA27FEB0780A2EB03
+C0EB01E0A2EB00F01478A2143C141EA2140F1407A214031401123E38FF80001D1F7E9E22
+>I<EB1FE0EB70383801C00E48487E39070003804814C0001EEB01E048EB00F0A2007C14
+F8A20078147800F8147CA900781478007C14F8A2003C14F0003E1301001E14E06CEB03C0
+6C148039038007003801E01E38007038EB1FE01E217E9F23>I<B512E0380F007C141E80
+EC0780A215C0A41580A2EC0F00141E147CEBFFE090C8FCAEEAFFF01A1F7E9E1F>I<EB1F
+E0EB70383801C00E48487E39070003804814C0001EEB01E0003E14F0003C1300007C14F8
+A20078147800F8147CA900781478007C14F8A2003C14F0383E0781391E0841E0390F1023
+C00007148039039017003801D01E3900783804EB1FF8EB001CEC0C0CEC0E1CEC0FF8A214
+0715F0EC01E01E297E9F23>I<B512E0380F80780007131E80EC0780A215C0A41580A2EC
+0F00141E1478EBFFE0EB80601438143C141C141EA3141FA315011581140F390FC0078239
+FFFC03C4C812F820207F9E22>I<3803F040380C0CC0EA1803EA3001EA6000A212E01440
+A36C13007E127CEA7F80EA3FF86CB4FC00071380C613C0EB1FE013031301EB00F014707E
+A46C136014E06C13C038F8018038C60300EA81FC14217E9F19>I<007FB512E038780F01
+0060EB006000401420A200C0143000801410A400001400B3497E3803FFFC1C1F7E9E21>
+I<39FFF00FF8390F0003E0EC0080B3A46CEB01001380120314026C6C5A6C6C5AEB3830EB
+0FC01D207E9E22>I<39FFF003FE391F8000F86CC7126015206C6C1340A36C6C1380A2EB
+E00100011400A23800F002A213F8EB7804A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA3
+6DC7FC1F207F9E22>I<3BFFF07FF81FF03B1F000FC007C06C903907800180170015C001
+805C00071502EC09E013C000035DEC19F01410D801E05CA2EC2078D800F05CA2EC403C01
+785CA2EC801E017C1460013C144090383D000F133F6D5CA2011E1307010E91C7FCA2010C
+7F010413022C207F9E2F>I<397FF81FF8390FE007C03907C0030000031302EBE0063801
+F00400005BEBF818EB78106D5AEB3E60EB1E406D5AA213076D7E497E1305EB08F0EB18F8
+EB1078EB207CEB603EEB401EEB801F3901000F801407000214C000061303001FEB07E039
+FFC01FFE1F1F7F9E22>I<39FFF001FF391F800078000F146012076D1340000314807F39
+01F001001200EBF802EB7C06EB3C04EB3E08131EEB1F10EB0FB0EB07A014E06D5AACEB3F
+FC201F7F9E22>I<387FFFFE387E003C127800701378006013F814F0384001E0130314C0
+EB07801200EB0F00131EA25B137C13785B1201EBE002EA03C0A2EA0780000F1306130000
+1E1304003E130C123C48133C14FCB5FC171F7E9E1C>I<12FFA212C0B3B3A512FFA2082D
+7CA10D>I<EA0804EA1008EA2010A2EA4020A2EA8040A3EAB85CEAFC7EA2EA7C3EEA381C
+0F0E7A9F17>I<12FFA21203B3B3A512FFA2082D80A10D>I<120812101220A21240A21280
+A312B812FCA2127C1238060E7D9F0D>96 D<EA1FE0EA3030EA7818131CEA300E1200A313
+FEEA0F8EEA1E0E1238127800F01310A3131E127838386720380F83C014147E9317>I<12
+1C12FC121CAA137CEA1D87381E0180EB00C0001C13E01470A21478A6147014F014E0001E
+13C0381A018038198700EA107C15207E9F19>I<EA01FCEA0706EA1C0F123813060078C7
+FC127012F0A61270127800381380A2381C0100EA0706EA01F811147F9314>I<EB01C013
+0F1301AAEA01F1EA070DEA0C03EA180112381278127012F0A61270A21238EA1803120CEA
+070D3801F1F815207F9F19>I<EA03F0EA0E1C487E487EA238700380A212F0B5FC00F0C7
+FCA41270A26C1380A2381C0100EA0706EA01F811147F9314>I<137CEA01C6EA030F1207
+EA0E061300A7EAFFF0EA0E00B2EA7FE01020809F0E>I<14E03803E330EA0E3CEA1C1C38
+380E00EA780FA5EA380E6C5AEA1E38EA33E00020C7FCA21230A2EA3FFE381FFF8014C038
+3001E038600070481330A4006013606C13C0381C03803803FC00141F7F9417>I<121C12
+FC121CAA137C1386EA1D03001E1380A2121CAE38FF8FF014207E9F19>I<1238127CA312
+38C7FCA6121C12FC121CB1EAFF80091F7F9E0C>I<13E0EA01F0A3EA00E01300A61370EA
+07F012001370B3A31260EAF06013C0EA6180EA3F000C28829E0E>I<121C12FC121CAAEB
+1FE0EB0780EB060013045B5B5B136013E0EA1DF0EA1E70EA1C38133C131C7F130F7F1480
+14C038FF9FF014207E9F18>I<121C12FC121CB3ABEAFF8009207F9F0C>I<391C3E03E039
+FCC30C30391D019018001EEBE01CA2001C13C0AE3AFF8FF8FF8021147E9326>I<EA1C7C
+EAFC86EA1D03001E1380A2121CAE38FF8FF014147E9319>I<EA01F8EA070E381C038038
+3801C0A2387000E0A200F013F0A6007013E0A2383801C0A2381C038038070E00EA01F814
+147F9317>I<EA1C7CEAFD87381E018014C0381C00E014F014701478A6147014F014E038
+1E01C0EB0380381D8700EA1C7C90C7FCA8B47E151D7E9319>I<3801F04038070CC0EA0E
+02EA1C03EA38011278127012F0A6127012781238EA1C03EA0C05EA0709EA01F1EA0001A8
+EB0FF8151D7F9318>I<EA1CF0EAFD18EA1E3CA21318EA1C00AEEAFFC00E147E9312>I<EA
+0FC8EA3038EA6018EAC008A3EAE000127CEA3FE0EA1FF0EA07F8EA003CEA800E130612C0
+A21304EAE00CEAD818EA87E00F147F9312>I<1202A31206A2120EA2123EEAFFF8EA0E00
+AB1304A5EA07081203EA01F00E1C7F9B12>I<381C0380EAFC1FEA1C03AE1307120CEA06
+1B3803E3F014147E9319>I<38FF83F8383E00E0001C13C06C1380A338070100A21383EA
+0382A2EA01C4A213E4EA00E8A21370A3132015147F9318>I<39FF9FE1FC393C07807039
+1C030060EC8020000E1440A214C0D80704138014E0A239038861001471A23801D032143A
+143E3800E01CA2EB6018EB40081E147F9321>I<38FF87F8381E03C0380E0180EB0300EA
+0702EA0384EA01C813D8EA00F01370137813F8139CEA010E1202EA060738040380000C13
+C0003C13E038FE07FC16147F9318>I<38FF83F8383E00E0001C13C06C1380A338070100
+A21383EA0382A2EA01C4A213E4EA00E8A21370A31320A25BA3EAF080A200F1C7FC126212
+3C151D7F9318>I<EA7FFFEA700E1260EA401C133813781370EA00E0120113C0EA038012
+071301120E121EEA1C03EA3802EA7006130EEAFFFE10147F9314>I<B812F82D01808C2E>
+124 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fs cmbx12 20.736 13
+/Fs 13 122 df<DB1FFC14C00203B5EAC001021FECF003027FECFC07903B01FFFC00FE0F
+010701C0EB1F9F4948C7EA07FFD93FF880494814004948157F485B4A153F4890C9121F48
+5A000F170F5B001F1707A2485A1803A2127FA24993C8FCA212FFAA041FB61280127FA27F
+DC0001EBC000123FA36C7EA26C7EA26C7E7E6C7F806C7F6D6C5CEB3FFCD90FFF5C6D01C0
+EB1FBF010101FCEBFF1F6D6CB5EAFE0F021FECF8030203ECE0009126001FFEC9FC413D7B
+BB4C>71 D<B6D8F803B612E0A426007FF0C70001EBC000B3A491B8FCA402F0C71201B3A7
+B6D8F803B612E0A4433B7CBA4C>I<B612FEA426007FF0C9FCB3ADEF03C0A517071880A3
+170FA3171FA2173F177F17FF5E04071300163FB9FCA4323B7DBA3A>76
+D<B500F00207B512E0808080D8007F92390007E0006E6F5A81017B7F81137901787F6E7E
+6E7E81141F6E7E6E7F6E7F82806E7F6F7E6F7E826F7E816F13806F13C017E06F13F081EE
+7FF8EE3FFC17FEEE1FFF827013837013C318E37013F382EF7FFBEF3FFFA283838383A283
+83187F183FA201FC161FB500FC150F18071803A2433B7CBA4C>78
+D<B600F80107B512E0A426007FF0C83807E000725AB3B3A3013F4C5AA280011F4CC7FCA2
+6D6C151E0107163E6E5D6D6C5D6D6D13019026007FE0EB0FE0DA3FFCEB7FC0020FB65A02
+034AC8FCDA007F13F003071380433C7DBA4A>85 D<EB3FFE48B512E0000714F8390FE007
+FC9038F001FE486C6C7E6F7E82153F6C48806C5A6C5AC8FCA491B5FC131F90387FF83F38
+03FF803807FC00EA0FF0485A123F485AA2485AA4157F6C7E15DF3A3FE0039FF03B1FF80F
+0FFFE03807FFFE0001497E39003FE0002B267DA52F>97 D<13FE12FFA412071203B04AB4
+FC021F13F0027F13FC9138FC03FE9039FFF000FF02C0EB3F8091C7EA1FC04915E0EE0FF0
+17F8A2EE07FCA317FEA917FCA3160F17F817F0161F6D15E06EEB3FC06EEB7F80D9F9E0EB
+FF009039F0FC07FE91387FFFF8D9E01F13E09026C003FEC7FC2F3C7DBB36>I<EA01E0EA
+07F8487EA2487EA46C5AA26C5AEA01E0C8FCAB13FE127FA412071203B3AAB512F0A4143D
+7DBC1A>105 D<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE0D807F8EB0FF0
+48486D7EA248486D7E003F81A248486D7EA400FF1680A9007F1600A36C6C495AA2001F5D
+6D1307000F5D6C6C495AD803FEEB3FE03A00FF80FF806DB5C7FC010F13F8010113C02926
+7DA530>111 D<3901FC03F000FFEB0FFC4AB4FC91383C3F80EC707F00079038E0FFC000
+035BEBFD80A201FFEB7F809138003F00151E92C7FC5BB3A3B512FCA422267DA528>114
+D<90383FF0383903FFFE7848EBFFF8381FC00F383F0003003E13005A157812FCA27E6C14
+0013C013FC387FFFF06C13FEECFF806C14C06C14E0000314F0C614F8011F13FCEB007FEC
+07FE0070130100F01300157E7EA27E157C6C14FC6C14F890388001F09038F00FE000F9B5
+12C0D8F07F130038C01FF81F267DA526>I<130FA55BA45BA25BA25B5A5A5A001FEBFFF0
+B6FCA3000190C7FCB3153CA86C14781480017F13F090383FC1E090381FFFC06D13809038
+01FE001E377EB626>I<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E806C5DA26E13
+7C017F14786E13F8013F5CECF001011F5CECF803010F5CA2ECFC0701075CECFE0F010391
+C7FC6E5A6D131E15BE6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5AA2140F92C8FC5C14
+1E0008133E007F133C147C38FF807814F8EB81F0EB83E06C485A387C1F80D83FFFC9FCEA
+1FFCEA07F02E377EA533>121 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 75 659 a Fs(GNU)33 b(History)f(Library)p 75 709
+1800 17 v 960 757 a Fr(Edition)16 b(5.0,)e(for)h Fq(History)f(Library)g
+Fr(V)l(ersion)i(5.0.)1559 811 y(Septem)o(b)q(er)g(2003)75
+2467 y Fp(Chet)22 b(Ramey)-6 b(,)23 b(Case)e(W)-6 b(estern)23
+b(Reserv)n(e)f(Univ)n(ersit)n(y)75 2534 y(Brian)h(F)-6
+b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6 b(oundation)p
+75 2570 1800 9 v eop
+%%Page: 2 2
+2 1 bop 75 1512 a Fr(This)22 b(do)q(cumen)o(t)h(describ)q(es)g(the)f
+(GNU)g(History)f(library)i(\(v)o(ersion)f(5.0,)g(19)f(Septem)o(b)q(er)i
+(2003\),)e(a)75 1567 y(programming)15 b(to)q(ol)h(that)g(pro)o(vides)g
+(a)g(consisten)o(t)g(user)g(in)o(terface)g(for)g(recalling)h(lines)h
+(of)e(previously)75 1621 y(t)o(yp)q(ed)g(input.)75 1689
+y(Cop)o(yrigh)o(t)301 1688 y(c)289 1689 y Fo(\015)e Fr(1988-2003)f(F)l
+(ree)i(Soft)o(w)o(are)f(F)l(oundation,)h(Inc.)75 1756
+y(P)o(ermission)i(is)f(gran)o(ted)g(to)f(mak)o(e)h(and)g(distribute)i
+(v)o(erbatim)d(copies)i(of)f(this)h(man)o(ual)f(pro)o(vided)h(the)75
+1811 y(cop)o(yrigh)o(t)e(notice)h(and)f(this)h(p)q(ermission)g(notice)g
+(are)f(preserv)o(ed)h(on)f(all)h(copies.)195 1878 y(P)o(ermission)i(is)
+g(gran)o(ted)f(to)g(cop)o(y)l(,)h(distribute)h(and/or)e(mo)q(dify)h
+(this)g(do)q(cumen)o(t)g(under)195 1933 y(the)h(terms)f(of)h(the)g(GNU)
+g(F)l(ree)g(Do)q(cumen)o(tation)g(License,)i(V)l(ersion)f(1.1)e(or)g
+(an)o(y)h(later)195 1988 y(v)o(ersion)14 b(published)i(b)o(y)e(the)g(F)
+l(ree)f(Soft)o(w)o(are)g(F)l(oundation;)h(with)g(no)f(In)o(v)m(arian)o
+(t)i(Sections,)195 2042 y(with)h(the)f(F)l(ron)o(t-Co)o(v)o(er)e(texts)
+i(b)q(eing)i(\\A)e(GNU)g(Man)o(ual,")g(and)g(with)h(the)f(Bac)o(k-Co)o
+(v)o(er)195 2097 y(T)l(exts)h(as)g(in)h(\(a\))e(b)q(elo)o(w.)24
+b(A)16 b(cop)o(y)g(of)g(the)g(license)i(is)f(included)i(in)e(the)f
+(section)h(en)o(titled)195 2152 y(\\GNU)e(F)l(ree)g(Do)q(cumen)o
+(tation)g(License.")195 2219 y(\(a\))j(The)h(FSF's)f(Bac)o(k-Co)o(v)o
+(er)g(T)l(ext)h(is:)28 b(\\Y)l(ou)19 b(ha)o(v)o(e)g(freedom)g(to)f(cop)
+o(y)h(and)g(mo)q(dify)195 2274 y(this)e(GNU)f(Man)o(ual,)g(lik)o(e)h
+(GNU)f(soft)o(w)o(are.)22 b(Copies)17 b(published)h(b)o(y)f(the)f(F)l
+(ree)g(Soft)o(w)o(are)195 2329 y(F)l(oundation)g(raise)f(funds)h(for)e
+(GNU)h(dev)o(elopmen)o(t.")75 2451 y(Published)i(b)o(y)f(the)f(F)l(ree)
+g(Soft)o(w)o(are)f(F)l(oundation)75 2506 y(59)h(T)l(emple)h(Place,)f
+(Suite)i(330,)75 2560 y(Boston,)d(MA)h(02111-1307)75
+2615 y(USA)p eop
+%%Page: -1 3
+-1 2 bop 1862 -58 a Fr(i)75 149 y Fn(T)-7 b(able)27 b(of)f(Con)n(ten)n
+(ts)75 320 y Fp(1)67 b(Using)22 b(History)h(In)n(teractiv)n(ely)9
+b Fm(.)k(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)
+31 b Fp(1)224 389 y Fr(1.1)45 b(History)15 b(Expansion)5
+b Fl(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)19 b Fr(1)374 444 y(1.1.1)44 b(Ev)o(en)o(t)14
+b(Designators)e Fl(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26
+b Fr(1)374 499 y(1.1.2)44 b(W)l(ord)15 b(Designators)5
+b Fl(.)h(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)19
+b Fr(1)374 553 y(1.1.3)44 b(Mo)q(di\014ers)t Fl(.)8 b(.)g(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)19
+b Fr(2)75 675 y Fp(2)67 b(Programming)23 b(with)g(GNU)f(History)16
+b Fm(.)10 b(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)38
+b Fp(5)224 743 y Fr(2.1)45 b(In)o(tro)q(duction)16 b(to)f(History)10
+b Fl(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)24
+b Fr(5)224 798 y(2.2)45 b(History)15 b(Storage)c Fl(.)d(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)26 b Fr(5)224 853 y(2.3)45 b(History)15 b(F)l(unctions)d
+Fl(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)26 b Fr(6)374 907 y(2.3.1)44 b(Initializing)18
+b(History)d(and)h(State)e(Managemen)o(t)g Fl(.)7 b(.)h(.)g(.)f(.)h(.)f
+(.)29 b Fr(6)374 962 y(2.3.2)44 b(History)15 b(List)h(Managemen)o(t)d
+Fl(.)7 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)29 b Fr(6)374 1017 y(2.3.3)44
+b(Information)15 b(Ab)q(out)g(the)h(History)f(List)c
+Fl(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26
+b Fr(7)374 1072 y(2.3.4)44 b(Mo)o(ving)15 b(Around)g(the)g(History)g
+(List)c Fl(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)25 b Fr(7)374 1127 y(2.3.5)44 b(Searc)o(hing)16
+b(the)f(History)g(List)7 b Fl(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22
+b Fr(8)374 1181 y(2.3.6)44 b(Managing)15 b(the)g(History)g(File)6
+b Fl(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)20 b Fr(8)374 1236 y(2.3.7)44
+b(History)15 b(Expansion)9 b Fl(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)24 b Fr(9)224 1291 y(2.4)45 b(History)15 b(V)l(ariables)6
+b Fl(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)21 b Fr(10)224 1346 y(2.5)45 b(History)15
+b(Programming)f(Example)7 b Fl(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22
+b Fr(11)75 1467 y Fp(App)r(endix)i(A)50 b(Cop)n(ying)23
+b(This)g(Man)n(ual)15 b Fm(.)c(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)37
+b Fp(13)224 1535 y Fr(A.1)45 b(GNU)15 b(F)l(ree)h(Do)q(cumen)o(tation)f
+(License)g Fl(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)28 b Fr(13)374 1590 y(A.1.1)44
+b(ADDENDUM:)14 b(Ho)o(w)g(to)h(use)h(this)f(License)i(for)e(y)o(our)465
+1645 y(do)q(cumen)o(ts)f Fl(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)29 b Fr(19)75
+1766 y Fp(App)r(endix)24 b(B)53 b(Concept)22 b(Index)8
+b Fm(.)k(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)
+g(.)31 b Fp(21)75 1901 y(App)r(endix)24 b(C)52 b(F)-6
+b(unction)25 b(and)e(V)-6 b(ariable)23 b(Index)6 b Fm(.)12
+b(.)e(.)g(.)h(.)29 b Fp(23)p eop
+%%Page: -2 4
+-2 3 bop 75 -58 a Fr(ii)1346 b(GNU)15 b(History)g(Library)p
+eop
+%%Page: 1 5
+1 4 bop 75 -58 a Fr(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o
+(ely)1007 b(1)75 149 y Fn(1)41 b(Using)26 b(History)h(In)n(teractiv)n
+(ely)137 281 y Fr(This)17 b(c)o(hapter)g(describ)q(es)h(ho)o(w)e(to)g
+(use)h(the)g Fk(gnu)f Fr(History)g(Library)h(in)o(teractiv)o(ely)l(,)h
+(from)e(a)g(user's)75 336 y(standp)q(oin)o(t.)38 b(It)21
+b(should)h(b)q(e)g(considered)g(a)f(user's)g(guide.)38
+b(F)l(or)21 b(information)g(on)g(using)h(the)f Fk(gnu)75
+391 y Fr(History)c(Library)h(in)h(y)o(our)e(o)o(wn)g(programs,)f(see)i
+(Chapter)f(2)h([Programming)e(with)i(GNU)f(History],)75
+445 y(page)e(5.)75 586 y Fp(1.1)33 b(History)22 b(Expansion)137
+713 y Fr(The)c(History)g(library)h(pro)o(vides)f(a)f(history)h
+(expansion)h(feature)e(that)h(is)g(similar)h(to)e(the)h(history)75
+768 y(expansion)12 b(pro)o(vided)g(b)o(y)f Fq(csh)p Fr(.)18
+b(This)11 b(section)h(describ)q(es)g(the)g(syn)o(tax)e(used)h(to)g
+(manipulate)h(the)f(history)75 823 y(information.)137
+895 y(History)k(expansions)h(in)o(tro)q(duce)h(w)o(ords)d(from)g(the)i
+(history)f(list)h(in)o(to)f(the)h(input)g(stream,)e(making)75
+949 y(it)h(easy)g(to)g(rep)q(eat)g(commands,)g(insert)h(the)f(argumen)o
+(ts)f(to)h(a)g(previous)h(command)f(in)o(to)g(the)g(curren)o(t)75
+1004 y(input)h(line,)h(or)d(\014x)i(errors)e(in)i(previous)g(commands)f
+(quic)o(kly)l(.)137 1076 y(History)j(expansion)i(tak)o(es)d(place)i(in)
+h(t)o(w)o(o)d(parts.)28 b(The)19 b(\014rst)f(is)g(to)g(determine)i
+(whic)o(h)f(line)h(from)75 1131 y(the)h(history)f(list)i(should)g(b)q
+(e)f(used)g(during)h(substitution.)37 b(The)21 b(second)g(is)g(to)f
+(select)i(p)q(ortions)e(of)75 1186 y(that)15 b(line)i(for)d(inclusion)k
+(in)o(to)d(the)h(curren)o(t)f(one.)20 b(The)c(line)g(selected)h(from)e
+(the)g(history)g(is)h(called)h(the)75 1241 y Fj(ev)o(en)o(t)p
+Fr(,)c(and)h(the)g(p)q(ortions)g(of)f(that)g(line)i(that)e(are)g(acted)
+h(up)q(on)g(are)f(called)j Fj(w)o(ords)p Fr(.)i(V)l(arious)c
+Fj(mo)q(di\014ers)75 1296 y Fr(are)i(a)o(v)m(ailable)i(to)e(manipulate)
+i(the)e(selected)i(w)o(ords.)23 b(The)17 b(line)h(is)f(brok)o(en)f(in)o
+(to)h(w)o(ords)e(in)j(the)e(same)75 1350 y(fashion)c(that)e(Bash)i(do)q
+(es,)g(so)f(that)g(sev)o(eral)g(w)o(ords)g(surrounded)h(b)o(y)f(quotes)
+h(are)f(considered)h(one)g(w)o(ord.)75 1405 y(History)18
+b(expansions)h(are)g(in)o(tro)q(duced)g(b)o(y)f(the)h(app)q(earance)g
+(of)f(the)g(history)h(expansion)g(c)o(haracter,)75 1460
+y(whic)o(h)d(is)g(`)p Fq(!)p Fr(')e(b)o(y)h(default.)75
+1582 y Fi(1.1.1)30 b(Ev)n(en)n(t)21 b(Designators)137
+1709 y Fr(An)16 b(ev)o(en)o(t)f(designator)g(is)g(a)g(reference)h(to)f
+(a)g(command)g(line)i(en)o(try)d(in)i(the)g(history)f(list.)75
+1795 y Fq(!)216 b Fr(Start)16 b(a)g(history)h(substitution,)g(except)h
+(when)f(follo)o(w)o(ed)g(b)o(y)f(a)h(space,)g(tab,)f(the)h(end)g(of)315
+1850 y(the)e(line,)i(or)d(`)p Fq(=)p Fr('.)75 1935 y
+Fq(!)p Fh(n)192 b Fr(Refer)15 b(to)f(command)h(line)i
+Fj(n)p Fr(.)75 2019 y Fq(!-)p Fh(n)168 b Fr(Refer)15
+b(to)f(the)i(command)f Fj(n)g Fr(lines)i(bac)o(k.)75
+2104 y Fq(!!)192 b Fr(Refer)15 b(to)f(the)i(previous)f(command.)20
+b(This)c(is)g(a)f(synon)o(ym)g(for)f(`)p Fq(!-1)p Fr('.)75
+2188 y Fq(!)p Fh(string)72 b Fr(Refer)15 b(to)f(the)i(most)e(recen)o(t)
+h(command)g(starting)g(with)g Fj(string)p Fr(.)75 2273
+y Fq(!?)p Fh(string)5 b Fq([?])315 2328 y Fr(Refer)16
+b(to)g(the)h(most)f(recen)o(t)h(command)g(con)o(taining)g
+Fj(string)p Fr(.)25 b(The)17 b(trailing)g(`)p Fq(?)p
+Fr(')f(ma)o(y)g(b)q(e)315 2382 y(omitted)f(if)h(the)f
+Fj(string)k Fr(is)d(follo)o(w)o(ed)f(immediately)i(b)o(y)e(a)g
+(newline.)75 2467 y Fq(^)p Fh(string1)5 b Fq(^)p Fh(string2)g
+Fq(^)315 2522 y Fr(Quic)o(k)17 b(Substitution.)23 b(Rep)q(eat)16
+b(the)g(last)f(command,)h(replacing)h Fj(string1)i Fr(with)e
+Fj(string2)p Fr(.)315 2577 y(Equiv)m(alen)o(t)g(to)d
+Fq(!!:s/)p Fh(string1)5 b Fq(/)p Fh(string2)g Fq(/)p
+Fr(.)75 2661 y Fq(!#)192 b Fr(The)15 b(en)o(tire)h(command)f(line)i(t)o
+(yp)q(ed)f(so)e(far.)p eop
+%%Page: 2 6
+2 5 bop 75 -58 a Fr(2)1347 b(GNU)15 b(History)g(Library)75
+149 y Fi(1.1.2)30 b(W)-5 b(ord)20 b(Designators)137 271
+y Fr(W)l(ord)d(designators)g(are)g(used)h(to)f(select)h(desired)h(w)o
+(ords)d(from)h(the)g(ev)o(en)o(t.)26 b(A)18 b(`)p Fq(:)p
+Fr(')e(separates)h(the)75 326 y(ev)o(en)o(t)j(sp)q(eci\014cation)h
+(from)e(the)h(w)o(ord)f(designator.)34 b(It)20 b(ma)o(y)f(b)q(e)h
+(omitted)g(if)g(the)g(w)o(ord)f(designator)75 381 y(b)q(egins)f(with)g
+(a)e(`)p Fq(^)p Fr(',)h(`)p Fq($)p Fr(',)f(`)p Fq(*)p
+Fr(',)g(`)p Fq(-)p Fr(',)g(or)h(`)p Fq(\045)p Fr('.)24
+b(W)l(ords)17 b(are)g(n)o(um)o(b)q(ered)g(from)g(the)g(b)q(eginning)i
+(of)e(the)g(line,)75 435 y(with)j(the)g(\014rst)f(w)o(ord)h(b)q(eing)h
+(denoted)f(b)o(y)g(0)f(\(zero\).)33 b(W)l(ords)20 b(are)f(inserted)i
+(in)o(to)f(the)g(curren)o(t)f(line)75 490 y(separated)c(b)o(y)g(single)
+i(spaces.)137 557 y(F)l(or)e(example,)75 636 y Fq(!!)192
+b Fr(designates)18 b(the)g(preceding)i(command.)28 b(When)18
+b(y)o(ou)g(t)o(yp)q(e)g(this,)h(the)f(preceding)h(com-)315
+691 y(mand)c(is)h(rep)q(eated)g(in)g(toto.)75 769 y Fq(!!:$)144
+b Fr(designates)12 b(the)f(last)g(argumen)o(t)f(of)h(the)g(preceding)i
+(command.)19 b(This)11 b(ma)o(y)g(b)q(e)h(shortened)315
+824 y(to)j Fq(!$)p Fr(.)75 903 y Fq(!fi:2)120 b Fr(designates)15
+b(the)g(second)g(argumen)o(t)f(of)g(the)h(most)f(recen)o(t)g(command)h
+(starting)f(with)h(the)315 958 y(letters)g Fq(fi)p Fr(.)137
+1037 y(Here)h(are)f(the)g(w)o(ord)f(designators:)75 1115
+y Fq(0)h(\(zero\))57 b Fr(The)15 b Fq(0)p Fr(th)g(w)o(ord.)20
+b(F)l(or)14 b(man)o(y)h(applications,)h(this)g(is)g(the)f(command)g(w)o
+(ord.)75 1194 y Fh(n)216 b Fr(The)15 b Fj(n)p Fr(th)h(w)o(ord.)75
+1273 y Fq(^)216 b Fr(The)15 b(\014rst)g(argumen)o(t;)f(that)h(is,)g(w)o
+(ord)g(1.)75 1352 y Fq($)216 b Fr(The)15 b(last)h(argumen)o(t.)75
+1431 y Fq(\045)216 b Fr(The)15 b(w)o(ord)g(matc)o(hed)g(b)o(y)g(the)g
+(most)g(recen)o(t)g(`)p Fq(?)p Fh(string)5 b Fq(?)p Fr(')14
+b(searc)o(h.)75 1509 y Fh(x)p Fq(-)p Fh(y)168 b Fr(A)15
+b(range)g(of)g(w)o(ords;)f(`)p Fq(-)p Fh(y)5 b Fr(')14
+b(abbreviates)i(`)p Fq(0-)p Fh(y)5 b Fr('.)75 1588 y
+Fq(*)216 b Fr(All)15 b(of)f(the)f(w)o(ords,)g(except)i(the)f
+Fq(0)p Fr(th.)19 b(This)14 b(is)h(a)e(synon)o(ym)h(for)f(`)p
+Fq(1-$)p Fr('.)18 b(It)c(is)g(not)g(an)g(error)315 1643
+y(to)g(use)h(`)p Fq(*)p Fr(')f(if)i(there)e(is)i(just)e(one)h(w)o(ord)f
+(in)i(the)f(ev)o(en)o(t;)f(the)h(empt)o(y)g(string)g(is)g(returned)g
+(in)315 1698 y(that)f(case.)75 1777 y Fh(x)5 b Fq(*)187
+b Fr(Abbreviates)16 b(`)p Fh(x)p Fq(-$)p Fr(')75 1855
+y Fh(x)p Fq(-)192 b Fr(Abbreviates)16 b(`)p Fh(x)p Fq(-$)p
+Fr(')e(lik)o(e)i(`)p Fh(x)5 b Fq(*)p Fr(',)14 b(but)i(omits)f(the)g
+(last)g(w)o(ord.)137 1934 y(If)i(a)g(w)o(ord)f(designator)h(is)h
+(supplied)h(without)e(an)g(ev)o(en)o(t)f(sp)q(eci\014cation,)j(the)e
+(previous)h(command)75 1989 y(is)e(used)f(as)g(the)h(ev)o(en)o(t.)75
+2100 y Fi(1.1.3)30 b(Mo)r(di\014ers)137 2221 y Fr(After)10
+b(the)h(optional)g(w)o(ord)e(designator,)i(y)o(ou)f(can)h(add)f(a)g
+(sequence)i(of)e(one)g(or)g(more)g(of)g(the)g(follo)o(wing)75
+2276 y(mo)q(di\014ers,)16 b(eac)o(h)f(preceded)i(b)o(y)e(a)g(`)p
+Fq(:)p Fr('.)75 2355 y Fq(h)216 b Fr(Remo)o(v)o(e)14
+b(a)h(trailing)h(pathname)f(comp)q(onen)o(t,)g(lea)o(ving)h(only)g(the)
+f(head.)75 2434 y Fq(t)216 b Fr(Remo)o(v)o(e)14 b(all)i(leading)h
+(pathname)e(comp)q(onen)o(ts,)g(lea)o(ving)h(the)f(tail.)75
+2512 y Fq(r)216 b Fr(Remo)o(v)o(e)14 b(a)h(trailing)h(su\016x)f(of)g
+(the)g(form)g(`)p Fq(.)p Fh(suffix)5 b Fr(',)13 b(lea)o(ving)j(the)g
+(basename.)75 2591 y Fq(e)216 b Fr(Remo)o(v)o(e)14 b(all)i(but)g(the)f
+(trailing)h(su\016x.)75 2670 y Fq(p)216 b Fr(Prin)o(t)15
+b(the)g(new)h(command)f(but)g(do)g(not)g(execute)h(it.)p
+eop
+%%Page: 3 7
+3 6 bop 75 -58 a Fr(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o
+(ely)1007 b(3)75 149 y Fq(s/)p Fh(old)5 b Fq(/)p Fh(new)g
+Fq(/)315 204 y Fr(Substitute)17 b Fj(new)j Fr(for)c(the)h(\014rst)e(o)q
+(ccurrence)j(of)e Fj(old)i Fr(in)f(the)g(ev)o(en)o(t)f(line.)25
+b(An)o(y)16 b(delimiter)315 259 y(ma)o(y)c(b)q(e)h(used)g(in)g(place)g
+(of)f(`)p Fq(/)p Fr('.)18 b(The)13 b(delimiter)h(ma)o(y)e(b)q(e)h
+(quoted)f(in)i Fj(old)g Fr(and)f Fj(new)k Fr(with)12
+b(a)315 314 y(single)j(bac)o(kslash.)20 b(If)15 b(`)p
+Fq(&)p Fr(')e(app)q(ears)h(in)h Fj(new)p Fr(,)f(it)g(is)h(replaced)g(b)
+o(y)f Fj(old)p Fr(.)20 b(A)14 b(single)i(bac)o(kslash)315
+369 y(will)j(quote)e(the)h(`)p Fq(&)p Fr('.)25 b(The)17
+b(\014nal)i(delimiter)g(is)f(optional)g(if)f(it)h(is)g(the)f(last)g(c)o
+(haracter)g(on)315 423 y(the)e(input)h(line.)75 503 y
+Fq(&)216 b Fr(Rep)q(eat)15 b(the)g(previous)h(substitution.)75
+583 y Fq(g)75 638 y(a)216 b Fr(Cause)19 b(c)o(hanges)h(to)e(b)q(e)i
+(applied)h(o)o(v)o(er)e(the)g(en)o(tire)h(ev)o(en)o(t)f(line.)34
+b(Used)20 b(in)g(conjunction)315 692 y(with)c(`)p Fq(s)p
+Fr(',)d(as)i(in)h Fq(gs/)p Fh(old)5 b Fq(/)p Fh(new)g
+Fq(/)p Fr(,)14 b(or)h(with)g(`)p Fq(&)p Fr('.)75 772
+y Fq(G)216 b Fr(Apply)16 b(the)g(follo)o(wing)g(`)p Fq(s)p
+Fr(')e(mo)q(di\014er)i(once)g(to)e(eac)o(h)h(w)o(ord)g(in)h(the)f(ev)o
+(en)o(t.)p eop
+%%Page: 4 8
+4 7 bop 75 -58 a Fr(4)1347 b(GNU)15 b(History)g(Library)p
+eop
+%%Page: 5 9
+5 8 bop 75 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)889 b(5)75 149 y Fn(2)41 b(Programming)28 b(with)e(GNU)i
+(History)137 262 y Fr(This)17 b(c)o(hapter)f(describ)q(es)i(ho)o(w)e
+(to)f(in)o(terface)i(programs)e(that)g(y)o(ou)h(write)g(with)h(the)f
+Fk(gnu)g Fr(History)75 317 y(Library)l(.)24 b(It)17 b(should)g(b)q(e)g
+(considered)h(a)e(tec)o(hnical)i(guide.)25 b(F)l(or)15
+b(information)i(on)f(the)h(in)o(teractiv)o(e)g(use)75
+372 y(of)e Fk(gnu)g Fr(History)l(,)g(see)g(Chapter)g(1)g([Using)g
+(History)g(In)o(teractiv)o(ely],)h(page)f(1.)75 498 y
+Fp(2.1)33 b(In)n(tro)r(duction)24 b(to)e(History)137
+619 y Fr(Man)o(y)11 b(programs)f(read)h(input)i(from)d(the)i(user)f(a)g
+(line)i(at)e(a)g(time.)19 b(The)12 b Fk(gnu)f Fr(History)g(library)h
+(is)g(able)75 674 y(to)i(k)o(eep)g(trac)o(k)g(of)g(those)g(lines,)i
+(asso)q(ciate)e(arbitrary)g(data)g(with)g(eac)o(h)h(line,)h(and)e
+(utilize)j(information)75 729 y(from)d(previous)i(lines)h(in)f(comp)q
+(osing)g(new)f(ones.)137 795 y(The)f(programmer)f(using)h(the)g
+(History)g(library)g(has)g(a)o(v)m(ailable)h(functions)g(for)e(remem)o
+(b)q(ering)h(lines)75 850 y(on)c(a)g(history)h(list,)g(asso)q(ciating)g
+(arbitrary)f(data)f(with)i(a)f(line,)j(remo)o(ving)d(lines)i(from)d
+(the)i(list,)h(searc)o(hing)75 905 y(through)17 b(the)h(list)g(for)f(a)
+h(line)h(con)o(taining)f(an)g(arbitrary)f(text)g(string,)h(and)g
+(referencing)h(an)o(y)e(line)i(in)75 960 y(the)c(list)i(directly)l(.)22
+b(In)16 b(addition,)g(a)f(history)g Fj(expansion)h Fr(function)h(is)e
+(a)o(v)m(ailable)i(whic)o(h)g(pro)o(vides)f(for)e(a)75
+1015 y(consisten)o(t)h(user)h(in)o(terface)f(across)g(di\013eren)o(t)g
+(programs.)137 1081 y(The)f(user)h(using)f(programs)f(written)h(with)g
+(the)g(History)g(library)h(has)f(the)g(b)q(ene\014t)h(of)e(a)h
+(consisten)o(t)75 1136 y(user)20 b(in)o(terface)f(with)h(a)f(set)h(of)f
+(w)o(ell-kno)o(wn)h(commands)g(for)e(manipulating)k(the)d(text)g(of)g
+(previous)75 1191 y(lines)c(and)f(using)h(that)e(text)g(in)i(new)f
+(commands.)19 b(The)14 b(basic)h(history)e(manipulation)j(commands)d
+(are)75 1245 y(similar)j(to)f(the)g(history)g(substitution)h(pro)o
+(vided)g(b)o(y)g Fq(csh)p Fr(.)137 1312 y(If)f(the)g(programmer)f
+(desires,)h(he)g(can)g(use)g(the)g(Readline)h(library)l(,)g(whic)o(h)f
+(includes)j(some)c(history)75 1367 y(manipulation)j(b)o(y)e(default,)g
+(and)h(has)f(the)g(added)h(adv)m(an)o(tage)f(of)f(command)h(line)i
+(editing.)137 1433 y(Before)i(declaring)i(an)o(y)d(functions)i(using)g
+(an)o(y)f(functionalit)o(y)h(the)f(History)g(library)h(pro)o(vides)f
+(in)75 1488 y(other)14 b(co)q(de,)h(an)f(application)i(writer)e(should)
+i(include)g(the)f(\014le)g Fq(<readline/history.h>)d
+Fr(in)j(an)o(y)f(\014le)75 1543 y(that)d(uses)h(the)h(History)e
+(library's)i(features.)18 b(It)12 b(supplies)i(extern)e(declarations)h
+(for)e(all)i(of)f(the)g(library's)75 1597 y(public)17
+b(functions)f(and)g(v)m(ariables,)g(and)f(declares)h(all)g(of)f(the)h
+(public)h(data)d(structures.)75 1724 y Fp(2.2)33 b(History)22
+b(Storage)137 1845 y Fr(The)16 b(history)f(list)h(is)g(an)f(arra)o(y)f
+(of)g(history)i(en)o(tries.)k(A)15 b(history)g(en)o(try)g(is)h
+(declared)g(as)f(follo)o(ws:)195 1911 y Fq(typedef)23
+b(void)g(*histdata_t;)195 2021 y(typedef)g(struct)g(_hist_entry)f({)243
+2076 y(char)h(*line;)243 2130 y(char)g(*timestamp;)243
+2185 y(histdata_t)f(data;)195 2240 y(})i(HIST_ENTRY;)137
+2306 y Fr(The)16 b(history)f(list)h(itself)g(migh)o(t)f(therefore)g(b)q
+(e)h(declared)g(as)195 2373 y Fq(HIST_ENTRY)22 b(**the_history_list;)
+137 2439 y Fr(The)16 b(state)e(of)h(the)g(History)g(library)h(is)g
+(encapsulated)g(in)o(to)f(a)g(single)i(structure:)195
+2506 y Fq(/*)219 2560 y(*)24 b(A)f(structure)g(used)g(to)h(pass)f
+(around)g(the)h(current)f(state)g(of)g(the)h(history.)219
+2615 y(*/)195 2670 y(typedef)f(struct)g(_hist_state)f({)p
+eop
+%%Page: 6 10
+6 9 bop 75 -58 a Fr(6)1347 b(GNU)15 b(History)g(Library)243
+149 y Fq(HIST_ENTRY)22 b(**entries;)h(/*)g(Pointer)g(to)h(the)f
+(entries)g(themselves.)g(*/)243 204 y(int)g(offset;)262
+b(/*)23 b(The)h(location)f(pointer)f(within)h(this)h(array.)f(*/)243
+259 y(int)g(length;)262 b(/*)23 b(Number)g(of)h(elements)f(within)g
+(this)g(array.)g(*/)243 314 y(int)g(size;)310 b(/*)23
+b(Number)g(of)h(slots)f(allocated)g(to)g(this)h(array.)f(*/)243
+369 y(int)g(flags;)195 423 y(})h(HISTORY_STATE;)137 493
+y Fr(If)16 b(the)f(\015ags)g(mem)o(b)q(er)g(includes)j
+Fq(HS_STIFLED)p Fr(,)13 b(the)i(history)h(has)f(b)q(een)h(sti\015ed.)75
+626 y Fp(2.3)33 b(History)22 b(F)-6 b(unctions)137 750
+y Fr(This)13 b(section)g(describ)q(es)h(the)e(calling)i(sequence)g(for)
+e(the)g(v)m(arious)h(functions)g(exp)q(orted)f(b)o(y)h(the)f
+Fk(gnu)75 805 y Fr(History)j(library)l(.)75 921 y Fi(2.3.1)30
+b(Initializing)20 b(History)h(and)f(State)g(Managemen)n(t)137
+1045 y Fr(This)e(section)g(describ)q(es)h(functions)f(used)g(to)e
+(initialize)21 b(and)c(manage)g(the)g(state)g(of)g(the)g(History)75
+1100 y(library)f(when)g(y)o(ou)f(w)o(an)o(t)f(to)g(use)i(the)f(history)
+g(functions)h(in)g(y)o(our)f(program.)1675 1196 y([F)l(unction])-1800
+b Fg(void)20 b Ff(using)p 334 1196 18 3 v 25 w(history)j
+Fe(\()p Fq(void)p Fe(\))195 1251 y Fr(Begin)e(a)f(session)g(in)h(whic)o
+(h)g(the)f(history)g(functions)g(migh)o(t)g(b)q(e)h(used.)34
+b(This)21 b(initializes)i(the)195 1306 y(in)o(teractiv)o(e)16
+b(v)m(ariables.)1675 1402 y([F)l(unction])-1800 b Fg(HISTORY_STATE)21
+b(*)e Ff(history)p 658 1402 V 26 w(get)p 761 1402 V 25
+w(history)p 961 1402 V 25 w(state)k Fe(\()p Fq(void)p
+Fe(\))195 1456 y Fr(Return)15 b(a)g(structure)g(describing)i(the)e
+(curren)o(t)g(state)f(of)h(the)g(input)i(history)l(.)1675
+1552 y([F)l(unction])-1800 b Fg(void)20 b Ff(history)p
+378 1552 V 25 w(set)p 474 1552 V 25 w(history)p 674 1552
+V 26 w(state)j Fe(\()p Fq(HISTORY_STATE)13 b(*state)p
+Fe(\))195 1607 y Fr(Set)i(the)h(state)e(of)h(the)g(history)g(list)h
+(according)g(to)e Fj(state)p Fr(.)75 1723 y Fi(2.3.2)30
+b(History)20 b(List)h(Managemen)n(t)137 1847 y Fr(These)11
+b(functions)h(manage)e(individual)k(en)o(tries)d(on)g(the)g(history)f
+(list,)i(or)f(set)f(parameters)g(managing)75 1902 y(the)15
+b(list)h(itself.)1675 1998 y([F)l(unction])-1800 b Fg(void)20
+b Ff(add)p 295 1998 V 24 w(history)j Fe(\()p Fq(const)14
+b(char)h(*string)p Fe(\))195 2053 y Fr(Place)h Fj(string)i
+Fr(at)d(the)g(end)h(of)e(the)h(history)g(list.)21 b(The)15
+b(asso)q(ciated)g(data)g(\014eld)h(\(if)f(an)o(y\))f(is)i(set)f(to)195
+2108 y Fq(NULL)p Fr(.)1675 2204 y([F)l(unction])-1800
+b Fg(void)20 b Ff(add)p 295 2204 V 24 w(history)p 494
+2204 V 26 w(time)j Fe(\()p Fq(const)14 b(char)g(*string)p
+Fe(\))195 2259 y Fr(Change)h(the)g(time)h(stamp)f(asso)q(ciated)g(with)
+h(the)f(most)f(recen)o(t)h(history)h(en)o(try)e(to)h
+Fj(string)p Fr(.)1675 2355 y([F)l(unction])-1800 b Fg(HIST_ENTRY)21
+b(*)e Ff(remo)n(v)n(e)p 585 2355 V 25 w(history)j Fe(\()p
+Fq(int)15 b(which)p Fe(\))195 2410 y Fr(Remo)o(v)o(e)22
+b(history)g(en)o(try)h(at)f(o\013set)g Fj(whic)o(h)h
+Fr(from)f(the)h(history)l(.)43 b(The)23 b(remo)o(v)o(ed)f(elemen)o(t)h
+(is)195 2464 y(returned)16 b(so)e(y)o(ou)h(can)h(free)f(the)g(line,)i
+(data,)d(and)h(con)o(taining)h(structure.)1675 2560 y([F)l(unction])
+-1800 b Fg(histdata_t)21 b Ff(free)p 454 2560 V 24 w(history)p
+653 2560 V 26 w(en)n(try)i Fe(\()p Fq(HIST_ENTRY)13 b(*histent)p
+Fe(\))195 2615 y Fr(F)l(ree)h(the)g(history)g(en)o(try)g
+Fj(histen)o(t)h Fr(and)f(an)o(y)g(history)g(library)h(priv)m(ate)f
+(data)g(asso)q(ciated)g(with)g(it.)195 2670 y(Returns)h(the)g
+(application-sp)q(eci\014)q(c)j(data)c(so)h(the)h(caller)g(can)f(disp)q
+(ose)i(of)d(it.)p eop
+%%Page: 7 11
+7 10 bop 75 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)889 b(7)1675 149 y([F)l(unction])-1800 b Fg(HIST_ENTRY)21
+b(*)e Ff(replace)p 581 149 18 3 v 26 w(history)p 782
+149 V 25 w(en)n(try)24 b Fe(\()p Fq(int)14 b(which,)h(const)f(char)283
+204 y(*line,)g(histdata_t)g(data)p Fe(\))195 259 y Fr(Mak)o(e)f(the)h
+(history)g(en)o(try)f(at)g(o\013set)g Fj(whic)o(h)i Fr(ha)o(v)o(e)e
+Fj(line)18 b Fr(and)c Fj(data)p Fr(.)19 b(This)14 b(returns)g(the)g
+(old)g(en)o(try)195 314 y(so)k(the)h(caller)g(can)g(disp)q(ose)h(of)e
+(an)o(y)g(application-sp)q(eci\014)q(c)j(data.)30 b(In)19
+b(the)g(case)f(of)g(an)h(in)o(v)m(alid)195 369 y Fj(whic)o(h)p
+Fr(,)d(a)f Fq(NULL)f Fr(p)q(oin)o(ter)i(is)g(returned.)1675
+479 y([F)l(unction])-1800 b Fg(void)20 b Ff(clear)p 321
+479 V 26 w(history)j Fe(\()p Fq(void)p Fe(\))195 533
+y Fr(Clear)15 b(the)h(history)f(list)h(b)o(y)f(deleting)i(all)f(the)f
+(en)o(tries.)1675 643 y([F)l(unction])-1800 b Fg(void)20
+b Ff(sti\015e)p 321 643 V 26 w(history)j Fe(\()p Fq(int)14
+b(max)p Fe(\))195 698 y Fr(Sti\015e)i(the)f(history)h(list,)f(remem)o
+(b)q(ering)h(only)g(the)f(last)g Fj(max)j Fr(en)o(tries.)1675
+808 y([F)l(unction])-1800 b Fg(int)20 b Ff(unsti\015e)p
+359 808 V 25 w(history)j Fe(\()p Fq(void)p Fe(\))195
+863 y Fr(Stop)14 b(sti\015ing)g(the)g(history)l(.)20
+b(This)14 b(returns)f(the)h(previously-set)h(maxim)o(um)f(n)o(um)o(b)q
+(er)g(of)f(history)195 918 y(en)o(tries)h(\(as)e(set)i(b)o(y)f
+Fq(stifle_history\(\))p Fr(\).)k(The)c(v)m(alue)i(is)f(p)q(ositiv)o(e)g
+(if)g(the)g(history)f(w)o(as)f(sti\015ed,)195 973 y(negativ)o(e)j(if)h
+(it)f(w)o(asn't.)1675 1083 y([F)l(unction])-1800 b Fg(int)20
+b Ff(history)p 352 1083 V 25 w(is)p 415 1083 V 26 w(sti\015ed)j
+Fe(\()p Fq(void)p Fe(\))195 1137 y Fr(Returns)15 b(non-zero)g(if)h(the)
+f(history)g(is)h(sti\015ed,)g(zero)f(if)g(it)h(is)g(not.)75
+1267 y Fi(2.3.3)30 b(Information)19 b(Ab)r(out)i(the)f(History)h(List)
+137 1398 y Fr(These)13 b(functions)h(return)f(information)g(ab)q(out)f
+(the)h(en)o(tire)h(history)e(list)i(or)e(individual)k(list)e(en)o
+(tries.)1675 1508 y([F)l(unction])-1800 b Fg(HIST_ENTRY)21
+b(**)e Ff(history)p 606 1508 V 25 w(list)25 b Fe(\()p
+Fq(void)p Fe(\))195 1563 y Fr(Return)15 b(a)g Fq(NULL)f
+Fr(terminated)i(arra)o(y)e(of)h Fq(HIST_ENTRY)f(*)h Fr(whic)o(h)h(is)f
+(the)h(curren)o(t)f(input)h(history)l(.)195 1618 y(Elemen)o(t)g(0)f(of)
+f(this)i(list)g(is)g(the)f(b)q(eginning)i(of)e(time.)20
+b(If)c(there)f(is)h(no)f(history)l(,)g(return)g Fq(NULL)p
+Fr(.)1675 1728 y([F)l(unction])-1800 b Fg(int)20 b Ff(where)p
+326 1728 V 25 w(history)j Fe(\()p Fq(void)p Fe(\))195
+1783 y Fr(Returns)15 b(the)g(o\013set)f(of)h(the)g(curren)o(t)g
+(history)g(elemen)o(t.)1675 1893 y([F)l(unction])-1800
+b Fg(HIST_ENTRY)21 b(*)e Ff(curren)n(t)p 588 1893 V 25
+w(history)k Fe(\()p Fq(void)p Fe(\))195 1948 y Fr(Return)12
+b(the)h(history)f(en)o(try)g(at)g(the)g(curren)o(t)h(p)q(osition,)g(as)
+f(determined)i(b)o(y)e Fq(where_history\(\))p Fr(.)195
+2002 y(If)j(there)h(is)f(no)h(en)o(try)e(there,)h(return)g(a)g
+Fq(NULL)g Fr(p)q(oin)o(ter.)1675 2112 y([F)l(unction])-1800
+b Fg(HIST_ENTRY)21 b(*)e Ff(history)p 580 2112 V 25 w(get)k
+Fe(\()p Fq(int)14 b(offset)p Fe(\))195 2167 y Fr(Return)20
+b(the)h(history)g(en)o(try)f(at)h(p)q(osition)g Fj(o\013set)p
+Fr(,)g(starting)f(from)g Fq(history_base)f Fr(\(see)i(Sec-)195
+2222 y(tion)15 b(2.4)f([History)g(V)l(ariables],)h(page)g(10\).)j(If)d
+(there)g(is)g(no)g(en)o(try)f(there,)h(or)f(if)h Fj(o\013set)g
+Fr(is)g(greater)195 2277 y(than)g(the)g(history)g(length,)h(return)f(a)
+g Fq(NULL)g Fr(p)q(oin)o(ter.)1675 2387 y([F)l(unction])-1800
+b Fg(time_t)20 b Ff(history)p 430 2387 V 25 w(get)p 532
+2387 V 26 w(time)j Fe(\()p Fq(HIST_ENTRY)13 b(*entry)p
+Fe(\))195 2442 y Fr(Return)i(the)g(time)h(stamp)e(asso)q(ciated)i(with)
+f(the)g(history)h(en)o(try)e Fj(en)o(try)p Fr(.)1675
+2552 y([F)l(unction])-1800 b Fg(int)20 b Ff(history)p
+352 2552 V 25 w(total)p 493 2552 V 26 w(b)n(ytes)j Fe(\()p
+Fq(void)p Fe(\))195 2606 y Fr(Return)13 b(the)h(n)o(um)o(b)q(er)g(of)g
+(b)o(ytes)f(that)g(the)h(primary)g(history)g(en)o(tries)g(are)g(using.)
+20 b(This)14 b(function)195 2661 y(returns)h(the)g(sum)h(of)e(the)i
+(lengths)f(of)g(all)h(the)g(lines)g(in)g(the)g(history)l(.)p
+eop
+%%Page: 8 12
+8 11 bop 75 -58 a Fr(8)1347 b(GNU)15 b(History)g(Library)75
+149 y Fi(2.3.4)30 b(Mo)n(ving)21 b(Around)f(the)h(History)g(List)137
+272 y Fr(These)16 b(functions)g(allo)o(w)f(the)g(curren)o(t)h(index)g
+(in)o(to)f(the)h(history)f(list)h(to)e(b)q(e)i(set)f(or)g(c)o(hanged.)
+1675 365 y([F)l(unction])-1800 b Fg(int)20 b Ff(history)p
+352 365 18 3 v 25 w(set)p 448 365 V 25 w(p)r(os)i Fe(\()p
+Fq(int)14 b(pos)p Fe(\))195 420 y Fr(Set)k(the)h(curren)o(t)f(history)g
+(o\013set)g(to)f Fj(p)q(os)p Fr(,)i(an)f(absolute)h(index)h(in)o(to)e
+(the)g(list.)30 b(Returns)18 b(1)g(on)195 474 y(success,)d(0)g(if)h
+Fj(p)q(os)h Fr(is)f(less)g(than)f(zero)g(or)g(greater)f(than)h(the)g(n)
+o(um)o(b)q(er)h(of)e(history)i(en)o(tries.)1675 567 y([F)l(unction])
+-1800 b Fg(HIST_ENTRY)21 b(*)e Ff(previous)p 616 567
+V 25 w(history)k Fe(\()p Fq(void)p Fe(\))195 622 y Fr(Bac)o(k)14
+b(up)h(the)g(curren)o(t)f(history)g(o\013set)g(to)f(the)i(previous)g
+(history)f(en)o(try)l(,)g(and)h(return)f(a)g(p)q(oin)o(ter)195
+677 y(to)h(that)f(en)o(try)l(.)20 b(If)15 b(there)g(is)h(no)f(previous)
+h(en)o(try)l(,)f(return)g(a)g Fq(NULL)g Fr(p)q(oin)o(ter.)1675
+770 y([F)l(unction])-1800 b Fg(HIST_ENTRY)21 b(*)e Ff(next)p
+515 770 V 26 w(history)j Fe(\()p Fq(void)p Fe(\))195
+825 y Fr(Mo)o(v)o(e)17 b(the)h(curren)o(t)f(history)h(o\013set)f(forw)o
+(ard)f(to)h(the)h(next)g(history)g(en)o(try)l(,)g(and)g(return)f(the)h
+(a)195 879 y(p)q(oin)o(ter)e(to)e(that)h(en)o(try)l(.)k(If)d(there)f
+(is)h(no)f(next)g(en)o(try)l(,)g(return)g(a)g Fq(NULL)g
+Fr(p)q(oin)o(ter.)75 992 y Fi(2.3.5)30 b(Searc)n(hing)21
+b(the)f(History)h(List)137 1115 y Fr(These)14 b(functions)g(allo)o(w)g
+(searc)o(hing)g(of)e(the)i(history)f(list)h(for)f(en)o(tries)h(con)o
+(taining)g(a)f(sp)q(eci\014c)i(string.)75 1170 y(Searc)o(hing)f(ma)o(y)
+g(b)q(e)g(p)q(erformed)g(b)q(oth)g(forw)o(ard)e(and)i(bac)o(kw)o(ard)f
+(from)g(the)h(curren)o(t)g(history)f(p)q(osition.)75
+1224 y(The)j(searc)o(h)f(ma)o(y)g(b)q(e)i Fj(anc)o(hored)p
+Fr(,)e(meaning)h(that)f(the)h(string)g(m)o(ust)f(matc)o(h)g(at)g(the)h
+(b)q(eginning)i(of)d(the)75 1279 y(history)g(en)o(try)l(.)1675
+1372 y([F)l(unction])-1800 b Fg(int)20 b Ff(history)p
+352 1372 V 25 w(searc)n(h)j Fe(\()p Fq(const)14 b(char)g(*string,)g
+(int)h(direction)p Fe(\))195 1427 y Fr(Searc)o(h)g(the)f(history)g(for)
+g Fj(string)p Fr(,)g(starting)g(at)g(the)h(curren)o(t)f(history)g
+(o\013set.)19 b(If)c Fj(direction)g Fr(is)g(less)195
+1482 y(than)20 b(0,)g(then)h(the)f(searc)o(h)f(is)i(through)f(previous)
+g(en)o(tries,)i(otherwise)e(through)f(subsequen)o(t)195
+1536 y(en)o(tries.)h(If)c Fj(string)j Fr(is)d(found,)f(then)g(the)h
+(curren)o(t)f(history)g(index)h(is)g(set)f(to)g(that)f(history)h(en)o
+(try)l(,)195 1591 y(and)i(the)g(v)m(alue)h(returned)f(is)g(the)g
+(o\013set)e(in)j(the)f(line)h(of)e(the)h(en)o(try)g(where)g
+Fj(string)j Fr(w)o(as)c(found.)195 1646 y(Otherwise,)g(nothing)f(is)h
+(c)o(hanged,)f(and)h(a)e(-1)h(is)h(returned.)1675 1739
+y([F)l(unction])-1800 b Fg(int)20 b Ff(history)p 352
+1739 V 25 w(searc)n(h)p 533 1739 V 25 w(pre\014x)i Fe(\()p
+Fq(const)15 b(char)f(*string,)g(int)h(direction)p Fe(\))195
+1794 y Fr(Searc)o(h)20 b(the)h(history)f(for)g Fj(string)p
+Fr(,)h(starting)e(at)h(the)g(curren)o(t)h(history)f(o\013set.)34
+b(The)20 b(searc)o(h)g(is)195 1849 y(anc)o(hored:)g(matc)o(hing)14
+b(lines)j(m)o(ust)d(b)q(egin)i(with)f Fj(string)p Fr(.)20
+b(If)15 b Fj(direction)h Fr(is)f(less)g(than)g(0,)f(then)h(the)195
+1903 y(searc)o(h)g(is)i(through)e(previous)h(en)o(tries,)g(otherwise)g
+(through)f(subsequen)o(t)h(en)o(tries.)22 b(If)16 b Fj(string)j
+Fr(is)195 1958 y(found,)e(then)g(the)f(curren)o(t)h(history)f(index)i
+(is)f(set)f(to)g(that)g(en)o(try)l(,)g(and)h(the)f(return)h(v)m(alue)h
+(is)f(0.)195 2013 y(Otherwise,)f(nothing)f(is)h(c)o(hanged,)f(and)h(a)e
+(-1)h(is)h(returned.)1675 2106 y([F)l(unction])-1800
+b Fg(int)20 b Ff(history)p 352 2106 V 25 w(searc)n(h)p
+533 2106 V 25 w(p)r(os)h Fe(\()p Fq(const)15 b(char)f(*string,)g(int)h
+(direction,)f(int)283 2161 y(pos)p Fe(\))195 2216 y Fr(Searc)o(h)j(for)
+g Fj(string)k Fr(in)d(the)f(history)g(list,)h(starting)e(at)h
+Fj(p)q(os)p Fr(,)g(an)g(absolute)h(index)g(in)o(to)f(the)h(list.)195
+2270 y(If)g Fj(direction)i Fr(is)e(negativ)o(e,)h(the)f(searc)o(h)g
+(pro)q(ceeds)g(bac)o(kw)o(ard)g(from)f Fj(p)q(os)p Fr(,)h(otherwise)h
+(forw)o(ard.)195 2325 y(Returns)j(the)g(absolute)g(index)h(of)f(the)g
+(history)g(elemen)o(t)h(where)f Fj(string)k Fr(w)o(as)21
+b(found,)j(or)d(-1)195 2380 y(otherwise.)75 2493 y Fi(2.3.6)30
+b(Managing)20 b(the)g(History)h(File)137 2615 y Fr(The)16
+b(History)g(library)h(can)e(read)h(the)g(history)g(from)f(and)h(write)g
+(it)g(to)f(a)h(\014le.)22 b(This)17 b(section)f(do)q(cu-)75
+2670 y(men)o(ts)f(the)g(functions)h(for)f(managing)g(a)g(history)g
+(\014le.)p eop
+%%Page: 9 13
+9 12 bop 75 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)889 b(9)1675 149 y([F)l(unction])-1800 b Fg(int)20
+b Ff(read)p 287 149 18 3 v 24 w(history)j Fe(\()p Fq(const)14
+b(char)h(*filename)p Fe(\))195 204 y Fr(Add)g(the)g(con)o(ten)o(ts)f
+(of)h Fj(\014lename)j Fr(to)c(the)h(history)g(list,)g(a)g(line)h(at)f
+(a)f(time.)20 b(If)15 b Fj(\014lename)k Fr(is)c Fq(NULL)p
+Fr(,)195 259 y(then)h(read)f(from)f(`)p Fq(~/.history)p
+Fr('.)k(Returns)d(0)f(if)i(successful,)g(or)f Fq(errno)f
+Fr(if)i(not.)1675 358 y([F)l(unction])-1800 b Fg(int)20
+b Ff(read)p 287 358 V 24 w(history)p 486 358 V 26 w(range)h
+Fe(\()p Fq(const)15 b(char)f(*filename,)g(int)h(from,)f(int)h(to)p
+Fe(\))195 413 y Fr(Read)f(a)f(range)h(of)f(lines)j(from)d
+Fj(\014lename)p Fr(,)i(adding)g(them)f(to)f(the)h(history)g(list.)20
+b(Start)13 b(reading)i(at)195 468 y(line)g Fj(from)d
+Fr(and)h(end)h(at)f Fj(to)p Fr(.)18 b(If)c Fj(from)e
+Fr(is)i(zero,)f(start)f(at)g(the)h(b)q(eginning.)22 b(If)13
+b Fj(to)i Fr(is)e(less)h(than)f Fj(from)p Fr(,)195 523
+y(then)i(read)g(un)o(til)i(the)e(end)g(of)g(the)g(\014le.)21
+b(If)15 b Fj(\014lename)k Fr(is)d Fq(NULL)p Fr(,)e(then)h(read)g(from)f
+(`)p Fq(~/.history)p Fr('.)195 577 y(Returns)h(0)g(if)g(successful,)h
+(or)f Fq(errno)g Fr(if)g(not.)1675 677 y([F)l(unction])-1800
+b Fg(int)20 b Ff(write)p 305 677 V 26 w(history)j Fe(\()p
+Fq(const)14 b(char)h(*filename)p Fe(\))195 732 y Fr(W)l(rite)j(the)f
+(curren)o(t)g(history)h(to)f Fj(\014lename)p Fr(,)h(o)o(v)o(erwriting)f
+Fj(\014lename)k Fr(if)d(necessary)l(.)27 b(If)18 b Fj(\014lename)195
+786 y Fr(is)f Fq(NULL)p Fr(,)e(then)h(write)h(the)f(history)g(list)h
+(to)e(`)p Fq(~/.history)p Fr('.)21 b(Returns)16 b(0)f(on)h(success,)h
+(or)f Fq(errno)195 841 y Fr(on)f(a)g(read)g(or)g(write)g(error.)1675
+940 y([F)l(unction])-1800 b Fg(int)20 b Ff(app)r(end)p
+361 940 V 24 w(history)j Fe(\()p Fq(int)14 b(nelements,)g(const)g(char)
+h(*filename)p Fe(\))195 995 y Fr(App)q(end)k(the)e(last)g
+Fj(nelemen)o(ts)k Fr(of)16 b(the)i(history)f(list)h(to)f
+Fj(\014lename)p Fr(.)27 b(If)18 b Fj(\014lename)j Fr(is)d
+Fq(NULL)p Fr(,)f(then)195 1050 y(app)q(end)f(to)f(`)p
+Fq(~/.history)p Fr('.)j(Returns)c(0)h(on)g(success,)h(or)e
+Fq(errno)h Fr(on)g(a)g(read)g(or)g(write)g(error.)1675
+1149 y([F)l(unction])-1800 b Fg(int)20 b Ff(history)p
+352 1149 V 25 w(truncate)p 588 1149 V 25 w(\014le)k Fe(\()p
+Fq(const)14 b(char)h(*filename,)f(int)g(nlines)p Fe(\))195
+1204 y Fr(T)l(runcate)19 b(the)h(history)f(\014le)h Fj(\014lename)p
+Fr(,)h(lea)o(ving)f(only)g(the)f(last)g Fj(nlines)k Fr(lines.)34
+b(If)20 b Fj(\014lename)i Fr(is)195 1259 y Fq(NULL)p
+Fr(,)14 b(then)i(`)p Fq(~/.history)p Fr(')d(is)j(truncated.)j(Returns)c
+(0)g(on)g(success,)h(or)e Fq(errno)h Fr(on)g(failure.)75
+1378 y Fi(2.3.7)30 b(History)20 b(Expansion)137 1504
+y Fr(These)c(functions)g(implemen)o(t)g(history)f(expansion.)1675
+1603 y([F)l(unction])-1800 b Fg(int)20 b Ff(history)p
+352 1603 V 25 w(expand)i Fe(\()p Fq(char)15 b(*string,)f(char)g
+(**output)p Fe(\))195 1658 y Fr(Expand)k Fj(string)p
+Fr(,)f(placing)h(the)g(result)f(in)o(to)g Fj(output)p
+Fr(,)h(a)e(p)q(oin)o(ter)i(to)f(a)g(string)g(\(see)g(Section)h(1.1)195
+1713 y([History)d(In)o(teraction],)f(page)h(1\).)20 b(Returns:)195
+1798 y Fq(0)216 b Fr(If)19 b(no)g(expansions)g(to)q(ok)f(place)i(\(or,)
+e(if)i(the)e(only)i(c)o(hange)e(in)i(the)f(text)f(w)o(as)g(the)435
+1852 y(remo)o(v)m(al)d(of)g(escap)q(e)h(c)o(haracters)e(preceding)i
+(the)f(history)g(expansion)h(c)o(haracter\);)195 1936
+y Fq(1)216 b Fr(if)16 b(expansions)g(did)g(tak)o(e)e(place;)195
+2019 y Fq(-1)192 b Fr(if)16 b(there)f(w)o(as)f(an)h(error)g(in)h
+(expansion;)195 2102 y Fq(2)216 b Fr(if)14 b(the)g(returned)g(line)i
+(should)f(b)q(e)f(displa)o(y)o(ed,)h(but)f(not)f(executed,)i(as)e(with)
+h(the)g Fq(:p)435 2157 y Fr(mo)q(di\014er)i(\(see)f(Section)h(1.1.3)e
+([Mo)q(di\014ers],)h(page)g(2\).)195 2242 y(If)g(an)h(error)e(o)q
+(curred)i(in)g(expansion,)f(then)h Fj(output)g Fr(con)o(tains)f(a)g
+(descriptiv)o(e)i(error)d(message.)1675 2341 y([F)l(unction])-1800
+b Fg(char)20 b(*)f Ff(get)p 325 2341 V 25 w(history)p
+525 2341 V 26 w(ev)n(en)n(t)24 b Fe(\()p Fq(const)14
+b(char)h(*string,)f(int)h(*cindex,)f(int)283 2396 y(qchar)p
+Fe(\))195 2451 y Fr(Returns)22 b(the)h(text)f(of)h(the)f(history)h(ev)o
+(en)o(t)g(b)q(eginning)h(at)f Fj(string)j Fq(+)d Fj(*cindex)p
+Fr(.)43 b Fj(*cindex)27 b Fr(is)195 2506 y(mo)q(di\014ed)16
+b(to)e(p)q(oin)o(t)h(to)f(after)g(the)h(ev)o(en)o(t)f(sp)q(eci\014er.)
+22 b(A)o(t)14 b(function)h(en)o(try)l(,)g Fj(cindex)k
+Fr(p)q(oin)o(ts)c(to)f(the)195 2560 y(index)19 b(in)o(to)f
+Fj(string)k Fr(where)c(the)g(history)g(ev)o(en)o(t)g(sp)q
+(eci\014cation)h(b)q(egins.)30 b Fj(qc)o(har)21 b Fr(is)d(a)g(c)o
+(haracter)195 2615 y(that)13 b(is)h(allo)o(w)o(ed)g(to)e(end)i(the)g
+(ev)o(en)o(t)f(sp)q(eci\014cation)j(in)e(addition)g(to)f(the)h
+(\\normal")f(terminating)195 2670 y(c)o(haracters.)p
+eop
+%%Page: 10 14
+10 13 bop 75 -58 a Fr(10)1324 b(GNU)15 b(History)g(Library)1675
+149 y([F)l(unction])-1800 b Fg(char)20 b(**)f Ff(history)p
+449 149 18 3 v 25 w(tok)n(enize)25 b Fe(\()p Fq(const)15
+b(char)f(*string)p Fe(\))195 204 y Fr(Return)h(an)g(arra)o(y)g(of)g
+(tok)o(ens)g(parsed)g(out)g(of)g Fj(string)p Fr(,)g(m)o(uc)o(h)h(as)f
+(the)g(shell)i(migh)o(t.)k(The)15 b(tok)o(ens)195 259
+y(are)g(split)h(on)g(the)f(c)o(haracters)f(in)i(the)g
+Fj(history)p 1003 259 14 2 v 20 w(w)o(ord)p 1121 259
+V 19 w(delimiters)j Fr(v)m(ariable,)d(and)g(shell)h(quoting)195
+314 y(con)o(v)o(en)o(tions)e(are)g(ob)q(ey)o(ed.)1675
+409 y([F)l(unction])-1800 b Fg(char)20 b(*)f Ff(history)p
+423 409 18 3 v 25 w(arg)p 529 409 V 25 w(extract)k Fe(\()p
+Fq(int)15 b(first,)f(int)h(last,)f(const)h(char)283 464
+y(*string)p Fe(\))195 518 y Fr(Extract)k(a)h(string)g(segmen)o(t)g
+(consisting)h(of)f(the)g Fj(\014rst)h Fr(through)f Fj(last)h
+Fr(argumen)o(ts)e(presen)o(t)h(in)195 573 y Fj(string)p
+Fr(.)g(Argumen)o(ts)15 b(are)f(split)j(using)f Fq(history_tokenize)p
+Fr(.)75 705 y Fp(2.4)33 b(History)22 b(V)-6 b(ariables)137
+829 y Fr(This)18 b(section)f(describ)q(es)i(the)e(externally-visible)k
+(v)m(ariables)d(exp)q(orted)f(b)o(y)g(the)g Fk(gnu)g
+Fr(History)g(Li-)75 884 y(brary)l(.)1685 979 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(history)p 352 979 V 25 w(base)195 1033
+y Fr(The)15 b(logical)i(o\013set)d(of)h(the)g(\014rst)g(en)o(try)g(in)h
+(the)f(history)g(list.)1685 1128 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(history)p 352 1128 V 25 w(length)195
+1183 y Fr(The)15 b(n)o(um)o(b)q(er)h(of)f(en)o(tries)g(curren)o(tly)h
+(stored)f(in)h(the)f(history)g(list.)1685 1278 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(history)p 352 1278 V 25 w(max)p 484
+1278 V 24 w(en)n(tries)195 1333 y Fr(The)j(maxim)o(um)g(n)o(um)o(b)q
+(er)g(of)g(history)g(en)o(tries.)43 b(This)24 b(m)o(ust)e(b)q(e)i(c)o
+(hanged)f(using)h Fq(stifle_)195 1388 y(history\(\))p
+Fr(.)1685 1483 y([V)l(ariable])-1799 b Fg(int)20 b Ff(history)p
+352 1483 V 25 w(write)p 505 1483 V 26 w(timestamps)195
+1538 y Fr(If)j(non-zero,)h(timestamps)e(are)g(written)g(to)g(the)g
+(history)g(\014le,)j(so)d(they)g(can)h(b)q(e)g(preserv)o(ed)195
+1592 y(b)q(et)o(w)o(een)16 b(sessions.)k(The)15 b(default)h(v)m(alue)g
+(is)g(0,)f(meaning)h(that)e(timestamps)h(are)g(not)g(sa)o(v)o(ed.)1685
+1687 y([V)l(ariable])-1799 b Fg(char)20 b Ff(history)p
+378 1687 V 25 w(expansion)p 650 1687 V 25 w(c)n(har)195
+1742 y Fr(The)e(c)o(haracter)f(that)g(in)o(tro)q(duces)h(a)f(history)h
+(ev)o(en)o(t.)27 b(The)18 b(default)g(is)g(`)p Fq(!)p
+Fr('.)26 b(Setting)18 b(this)g(to)f(0)195 1797 y(inhibits)g(history)f
+(expansion.)1685 1892 y([V)l(ariable])-1799 b Fg(char)20
+b Ff(history)p 378 1892 V 25 w(subst)p 535 1892 V 24
+w(c)n(har)195 1947 y Fr(The)h(c)o(haracter)e(that)h(in)o(v)o(ok)o(es)g
+(w)o(ord)g(substitution)h(if)g(found)f(at)g(the)h(start)e(of)h(a)g
+(line.)37 b(The)195 2001 y(default)16 b(is)f(`)p Fq(^)p
+Fr('.)1685 2096 y([V)l(ariable])-1799 b Fg(char)20 b
+Ff(history)p 378 2096 V 25 w(commen)n(t)p 633 2096 V
+24 w(c)n(har)195 2151 y Fr(During)f(tok)o(enization,)h(if)f(this)h(c)o
+(haracter)e(is)h(seen)h(as)e(the)h(\014rst)g(c)o(haracter)f(of)g(a)h(w)
+o(ord,)g(then)195 2206 y(it)j(and)g(all)g(subsequen)o(t)h(c)o
+(haracters)d(up)j(to)e(a)g(newline)i(are)f(ignored,)h(suppressing)g
+(history)195 2261 y(expansion)16 b(for)f(the)g(remainder)h(of)f(the)g
+(line.)21 b(This)16 b(is)g(disabled)h(b)o(y)e(default.)1685
+2356 y([V)l(ariable])-1799 b Fg(char)20 b(*)f Ff(history)p
+423 2356 V 25 w(w)n(ord)p 572 2356 V 25 w(delimiters)195
+2411 y Fr(The)14 b(c)o(haracters)f(that)g(separate)g(tok)o(ens)h(for)f
+Fq(history_tokenize\(\))p Fr(.)k(The)d(default)g(v)m(alue)h(is)f
+Fq(")195 2465 y(\\t\\n\(\)<>;&|")p Fr(.)1685 2560 y([V)l(ariable])-1799
+b Fg(char)20 b(*)f Ff(history)p 423 2560 V 25 w(searc)n(h)p
+604 2560 V 25 w(delimiter)p 853 2560 V 27 w(c)n(hars)195
+2615 y Fr(The)13 b(list)h(of)f(additional)h(c)o(haracters)e(whic)o(h)i
+(can)g(delimit)g(a)f(history)g(searc)o(h)g(string,)g(in)h(addition)195
+2670 y(to)h(space,)g(T)l(AB,)g(`)p Fq(:)p Fr(')f(and)h(`)p
+Fq(?)p Fr(')g(in)h(the)f(case)g(of)g(a)g(substring)g(searc)o(h.)20
+b(The)c(default)f(is)h(empt)o(y)l(.)p eop
+%%Page: 11 15
+11 14 bop 75 -58 a Fr(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(History)867 b(11)1685 149 y([V)l(ariable])-1799 b Fg(char)20
+b(*)f Ff(history)p 423 149 18 3 v 25 w(no)p 509 149 V
+25 w(expand)p 714 149 V 25 w(c)n(hars)195 204 y Fr(The)c(list)h(of)e(c)
+o(haracters)g(whic)o(h)i(inhibit)h(history)e(expansion)h(if)f(found)h
+(immediately)g(follo)o(wing)195 259 y Fj(history)p 336
+259 14 2 v 20 w(expansion)p 551 259 V 21 w(c)o(har)p
+Fr(.)k(The)15 b(default)h(is)f(space,)h(tab,)e(newline,)j(carriage)e
+(return,)f(and)i(`)p Fq(=)p Fr('.)1685 354 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(history)p 352 354 18 3 v 25 w(quotes)p
+539 354 V 25 w(inhibit)p 727 354 V 28 w(expansion)195
+409 y Fr(If)15 b(non-zero,)f(single-quoted)j(w)o(ords)c(are)i(not)f
+(scanned)h(for)f(the)h(history)g(expansion)g(c)o(haracter.)195
+463 y(The)g(default)h(v)m(alue)h(is)e(0.)1685 558 y([V)l(ariable])-1799
+b Fg(rl_linebuf_func_t)22 b(*)d Ff(history)p 763 558
+V 25 w(inhibit)p 951 558 V 28 w(expansion)p 1226 558
+V 25 w(function)195 613 y Fr(This)e(should)h(b)q(e)f(set)g(to)f(the)g
+(address)h(of)f(a)h(function)g(that)f(tak)o(es)g(t)o(w)o(o)f(argumen)o
+(ts:)22 b(a)17 b Fq(char)d(*)195 668 y Fr(\()p Fj(string)t
+Fr(\))e(and)i(an)f Fq(int)g Fr(index)i(in)o(to)e(that)f(string)i(\()p
+Fj(i)r Fr(\).)19 b(It)14 b(should)g(return)f(a)g(non-zero)h(v)m(alue)g
+(if)g(the)195 722 y(history)h(expansion)g(starting)f(at)g
+Fj(string[i])i Fr(should)g(not)e(b)q(e)h(p)q(erformed;)g(zero)f(if)h
+(the)g(expansion)195 777 y(should)i(b)q(e)g(done.)22
+b(It)16 b(is)h(in)o(tended)g(for)e(use)i(b)o(y)f(applications)h(lik)o
+(e)g(Bash)f(that)g(use)g(the)g(history)195 832 y(expansion)g(c)o
+(haracter)f(for)f(additional)j(purp)q(oses.)j(By)c(default,)f(this)h(v)
+m(ariable)g(is)g(set)f(to)f Fq(NULL)p Fr(.)75 964 y Fp(2.5)33
+b(History)22 b(Programming)h(Example)137 1087 y Fr(The)16
+b(follo)o(wing)g(program)e(demonstrates)g(simple)j(use)e(of)g(the)g
+Fk(gnu)g Fr(History)g(Library)l(.)195 1144 y Fd(#include)i(<stdio.h)o
+(>)195 1188 y(#include)g(<readlin)o(e/h)o(is)o(tor)o(y.h)o(>)195
+1275 y(main)h(\(argc,)f(argv\))293 1319 y(int)i(argc;)293
+1362 y(char)f(**argv;)195 1406 y({)234 1450 y(char)g(line[1024])o(,)f
+(*t;)234 1493 y(int)i(len,)f(done)g(=)h(0;)234 1580 y(line[0])e(=)i(0;)
+234 1667 y(using_hist)o(ory)d(\(\);)234 1711 y(while)i(\(!done\))273
+1755 y({)313 1798 y(printf)f(\("history)o($)g("\);)313
+1842 y(fflush)g(\(stdout\);)313 1885 y(t)i(=)g(fgets)f(\(line,)f
+(sizeof)g(\(line\))h(-)h(1,)g(stdin\);)313 1929 y(if)g(\(t)f(&&)h(*t\))
+352 1973 y({)391 2016 y(len)g(=)g(strlen)e(\(t\);)391
+2060 y(if)i(\(t[len)e(-)i(1])g(==)g('\\n'\))430 2103
+y(t[len)f(-)h(1])g(=)g('\\0';)352 2147 y(})313 2234 y(if)g(\(!t\))352
+2278 y(strcpy)e(\(line,)g("quit"\);)313 2365 y(if)i(\(line[0])o(\))352
+2408 y({)391 2452 y(char)f(*expansion)o(;)391 2496 y(int)h(result;)391
+2583 y(result)e(=)j(history_e)o(xp)o(and)c(\(line,)h(&expansion)o(\);)
+391 2626 y(if)i(\(result\))430 2670 y(fprintf)e(\(stderr,)g
+("\045s\\n",)g(expansion)o(\);)p eop
+%%Page: 12 16
+12 15 bop 75 -58 a Fr(12)1324 b(GNU)15 b(History)g(Library)391
+193 y Fd(if)k(\(result)e(<)i(0)g(||)g(result)e(==)i(2\))430
+237 y({)470 280 y(free)f(\(expansio)o(n\))o(;)470 324
+y(continue)o(;)430 367 y(})391 455 y(add_histor)o(y)e(\(expansion\))o
+(;)391 498 y(strncpy)h(\(line,)g(expansion,)f(sizeof)h(\(line\))h(-)h
+(1\);)391 542 y(free)f(\(expansion)o(\);)352 585 y(})313
+672 y(if)h(\(strcmp)d(\(line,)i("quit"\))f(==)h(0\))352
+716 y(done)g(=)h(1;)313 760 y(else)f(if)h(\(strcmp)d(\(line,)i
+("save"\))f(==)i(0\))352 803 y(write_his)o(tor)o(y)d(\("history_f)o(il)
+o(e"\))o(;)313 847 y(else)i(if)h(\(strcmp)d(\(line,)i("read"\))f(==)i
+(0\))352 890 y(read_hist)o(ory)d(\("history)o(_fi)o(le)o("\);)313
+934 y(else)i(if)h(\(strcmp)d(\(line,)i("list"\))f(==)i(0\))352
+978 y({)391 1021 y(register)e(HIST_ENTR)o(Y)f(**the_list;)391
+1065 y(register)h(int)h(i;)391 1152 y(the_list)f(=)i(history_l)o(ist)d
+(\(\);)391 1196 y(if)j(\(the_list)o(\))430 1239 y(for)g(\(i)g(=)g(0;)g
+(the_list[)o(i])o(;)e(i++\))470 1283 y(printf)g(\("\045d:)h(\045s\\n",)
+f(i)i(+)g(history_ba)o(se,)d(the_list[)o(i]-)o(>li)o(ne)o(\);)352
+1326 y(})313 1370 y(else)i(if)h(\(strncmp)d(\(line,)h("delete",)g(6\))h
+(==)h(0\))352 1413 y({)391 1457 y(int)g(which;)391 1501
+y(if)g(\(\(sscanf)d(\(line)i(+)h(6,)g("\045d",)f(&which\)\))e(==)j(1\))
+430 1544 y({)470 1588 y(HIST_ENT)o(RY)d(*entry)i(=)h(remove_hi)o(sto)o
+(ry)d(\(which\);)470 1631 y(if)i(\(!entry\))509 1675
+y(fprintf)f(\(stderr,)f("No)j(such)f(entry)f(\045d\\n",)h(which\);)470
+1719 y(else)509 1762 y({)548 1806 y(free)g(\(entry->li)o(ne)o(\);)548
+1849 y(free)g(\(entry\);)509 1893 y(})430 1936 y(})391
+1980 y(else)430 2024 y({)470 2067 y(fprintf)e(\(stderr,)h("non-numer)o
+(ic)f(arg)i(given)g(to)h(`delete'\\n)o("\))o(;)430 2111
+y(})352 2154 y(})273 2198 y(})195 2242 y(})p eop
+%%Page: 13 17
+13 16 bop 75 -58 a Fr(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(13)75 149 y Fn(App)r(endix)25 b(A)20 b(Cop)n(ying)26
+b(This)g(Man)n(ual)75 345 y Fp(A.1)33 b(GNU)21 b(F)-6
+b(ree)23 b(Do)r(cumen)n(tation)g(License)698 455 y Fr(V)l(ersion)16
+b(1.2,)e(No)o(v)o(em)o(b)q(er)h(2002)195 526 y(Cop)o(yrigh)o(t)421
+525 y(c)409 526 y Fo(\015)f Fr(2000,2001,200)o(2)e(F)l(ree)j(Soft)o(w)o
+(are)f(F)l(oundation,)h(Inc.)195 581 y(59)g(T)l(emple)h(Place,)f(Suite)
+i(330,)d(Boston,)g(MA)30 b(02111-1307,)12 b(USA)195 690
+y(Ev)o(ery)o(one)j(is)g(p)q(ermitted)h(to)f(cop)o(y)g(and)g(distribute)
+i(v)o(erbatim)e(copies)195 745 y(of)g(this)g(license)j(do)q(cumen)o(t,)
+d(but)g(c)o(hanging)h(it)f(is)h(not)f(allo)o(w)o(ed.)100
+816 y(0.)29 b(PREAMBLE)165 885 y(The)19 b(purp)q(ose)g(of)f(this)h
+(License)i(is)e(to)f(mak)o(e)g(a)g(man)o(ual,)h(textb)q(o)q(ok,)g(or)f
+(other)g(functional)i(and)165 940 y(useful)c(do)q(cumen)o(t)g
+Fj(free)h Fr(in)f(the)f(sense)h(of)f(freedom:)k(to)c(assure)g(ev)o(ery)
+o(one)f(the)i(e\013ectiv)o(e)f(freedom)165 995 y(to)g(cop)o(y)h(and)g
+(redistribute)h(it,)e(with)h(or)f(without)h(mo)q(difying)h(it,)f
+(either)g(commercially)h(or)f(non-)165 1050 y(commercially)l(.)28
+b(Secondarily)l(,)19 b(this)f(License)h(preserv)o(es)e(for)g(the)g
+(author)g(and)h(publisher)h(a)e(w)o(a)o(y)165 1104 y(to)g(get)h(credit)
+h(for)e(their)i(w)o(ork,)e(while)j(not)e(b)q(eing)h(considered)g(resp)q
+(onsible)h(for)e(mo)q(di\014cations)165 1159 y(made)d(b)o(y)g(others.)
+165 1228 y(This)d(License)i(is)e(a)f(kind)i(of)e(\\cop)o(yleft",)g
+(whic)o(h)i(means)e(that)g(deriv)m(ativ)o(e)i(w)o(orks)e(of)g(the)h(do)
+q(cumen)o(t)165 1283 y(m)o(ust)k(themselv)o(es)i(b)q(e)g(free)e(in)i
+(the)f(same)g(sense.)26 b(It)16 b(complemen)o(ts)i(the)f(GNU)g(General)
+g(Public)165 1338 y(License,)g(whic)o(h)f(is)f(a)g(cop)o(yleft)h
+(license)h(designed)f(for)f(free)g(soft)o(w)o(are.)165
+1407 y(W)l(e)g(ha)o(v)o(e)f(designed)i(this)g(License)g(in)g(order)e
+(to)g(use)h(it)g(for)g(man)o(uals)f(for)g(free)h(soft)o(w)o(are,)e(b)q
+(ecause)165 1462 y(free)21 b(soft)o(w)o(are)e(needs)j(free)f(do)q
+(cumen)o(tation:)32 b(a)21 b(free)g(program)f(should)i(come)f(with)h
+(man)o(uals)165 1517 y(pro)o(viding)15 b(the)g(same)f(freedoms)g(that)g
+(the)g(soft)o(w)o(are)f(do)q(es.)20 b(But)14 b(this)h(License)h(is)f
+(not)f(limited)j(to)165 1571 y(soft)o(w)o(are)d(man)o(uals;)h(it)g(can)
+h(b)q(e)g(used)g(for)e(an)o(y)h(textual)h(w)o(ork,)e(regardless)h(of)g
+(sub)s(ject)g(matter)f(or)165 1626 y(whether)i(it)g(is)g(published)i
+(as)e(a)f(prin)o(ted)i(b)q(o)q(ok.)k(W)l(e)16 b(recommend)g(this)g
+(License)i(principally)h(for)165 1681 y(w)o(orks)14 b(whose)h(purp)q
+(ose)h(is)g(instruction)g(or)f(reference.)100 1750 y(1.)29
+b(APPLICABILITY)17 b(AND)e(DEFINITIONS)165 1819 y(This)21
+b(License)g(applies)h(to)d(an)o(y)h(man)o(ual)g(or)f(other)h(w)o(ork,)g
+(in)h(an)o(y)e(medium,)j(that)d(con)o(tains)h(a)165 1874
+y(notice)h(placed)h(b)o(y)f(the)g(cop)o(yrigh)o(t)f(holder)i(sa)o(ying)
+f(it)g(can)g(b)q(e)g(distributed)h(under)g(the)f(terms)165
+1929 y(of)d(this)h(License.)33 b(Suc)o(h)19 b(a)g(notice)g(gran)o(ts)e
+(a)i(w)o(orld-wide,)h(ro)o(y)o(alt)o(y-free)e(license,)j(unlimited)g
+(in)165 1984 y(duration,)j(to)e(use)h(that)f(w)o(ork)g(under)h(the)g
+(conditions)h(stated)e(herein.)43 b(The)23 b(\\Do)q(cumen)o(t",)165
+2039 y(b)q(elo)o(w,)15 b(refers)f(to)f(an)o(y)h(suc)o(h)g(man)o(ual)h
+(or)e(w)o(ork.)19 b(An)o(y)14 b(mem)o(b)q(er)h(of)e(the)i(public)h(is)f
+(a)f(licensee,)i(and)165 2093 y(is)d(addressed)g(as)f(\\y)o(ou".)18
+b(Y)l(ou)13 b(accept)g(the)f(license)j(if)e(y)o(ou)f(cop)o(y)l(,)h(mo)q
+(dify)g(or)f(distribute)h(the)g(w)o(ork)165 2148 y(in)j(a)f(w)o(a)o(y)f
+(requiring)j(p)q(ermission)f(under)g(cop)o(yrigh)o(t)f(la)o(w.)165
+2217 y(A)i(\\Mo)q(di\014ed)h(V)l(ersion")f(of)f(the)h(Do)q(cumen)o(t)g
+(means)g(an)o(y)f(w)o(ork)g(con)o(taining)i(the)f(Do)q(cumen)o(t)f(or)
+165 2272 y(a)i(p)q(ortion)h(of)g(it,)g(either)h(copied)g(v)o(erbatim,)f
+(or)f(with)h(mo)q(di\014cations)h(and/or)e(translated)h(in)o(to)165
+2327 y(another)c(language.)165 2396 y(A)e(\\Secondary)g(Section")h(is)f
+(a)g(named)g(app)q(endix)i(or)d(a)h(fron)o(t-matter)e(section)i(of)g
+(the)g(Do)q(cumen)o(t)165 2451 y(that)d(deals)h(exclusiv)o(ely)i(with)e
+(the)g(relationship)h(of)f(the)f(publishers)j(or)d(authors)g(of)g(the)h
+(Do)q(cumen)o(t)165 2506 y(to)18 b(the)h(Do)q(cumen)o(t's)f(o)o(v)o
+(erall)h(sub)s(ject)f(\(or)g(to)g(related)h(matters\))e(and)i(con)o
+(tains)g(nothing)g(that)165 2560 y(could)i(fall)g(directly)h(within)f
+(that)e(o)o(v)o(erall)i(sub)s(ject.)34 b(\(Th)o(us,)21
+b(if)g(the)f(Do)q(cumen)o(t)g(is)h(in)g(part)e(a)165
+2615 y(textb)q(o)q(ok)12 b(of)f(mathematics,)h(a)f(Secondary)h(Section)
+h(ma)o(y)e(not)h(explain)h(an)o(y)f(mathematics.\))18
+b(The)165 2670 y(relationship)d(could)g(b)q(e)f(a)g(matter)e(of)i
+(historical)g(connection)h(with)f(the)g(sub)s(ject)f(or)h(with)g
+(related)p eop
+%%Page: 14 18
+14 17 bop 75 -58 a Fr(14)1324 b(GNU)15 b(History)g(Library)165
+149 y(matters,)i(or)g(of)g(legal,)i(commercial,)g(philosophical,)i
+(ethical)e(or)e(p)q(olitical)j(p)q(osition)f(regarding)165
+204 y(them.)165 275 y(The)13 b(\\In)o(v)m(arian)o(t)g(Sections")g(are)g
+(certain)g(Secondary)g(Sections)h(whose)f(titles)g(are)g(designated,)g
+(as)165 329 y(b)q(eing)i(those)e(of)g(In)o(v)m(arian)o(t)g(Sections,)h
+(in)h(the)e(notice)h(that)e(sa)o(ys)h(that)g(the)g(Do)q(cumen)o(t)g(is)
+h(released)165 384 y(under)h(this)f(License.)21 b(If)14
+b(a)g(section)g(do)q(es)g(not)g(\014t)f(the)h(ab)q(o)o(v)o(e)g
+(de\014nition)i(of)d(Secondary)h(then)g(it)g(is)165 439
+y(not)i(allo)o(w)o(ed)g(to)f(b)q(e)i(designated)g(as)e(In)o(v)m(arian)o
+(t.)22 b(The)17 b(Do)q(cumen)o(t)e(ma)o(y)h(con)o(tain)g(zero)g(In)o(v)
+m(arian)o(t)165 494 y(Sections.)k(If)12 b(the)h(Do)q(cumen)o(t)f(do)q
+(es)h(not)f(iden)o(tify)h(an)o(y)f(In)o(v)m(arian)o(t)h(Sections)g
+(then)g(there)f(are)g(none.)165 564 y(The)19 b(\\Co)o(v)o(er)e(T)l
+(exts")g(are)h(certain)h(short)f(passages)g(of)f(text)h(that)g(are)g
+(listed,)i(as)e(F)l(ron)o(t-Co)o(v)o(er)165 619 y(T)l(exts)12
+b(or)g(Bac)o(k-Co)o(v)o(er)g(T)l(exts,)g(in)i(the)e(notice)h(that)f(sa)
+o(ys)g(that)g(the)g(Do)q(cumen)o(t)h(is)g(released)g(under)165
+674 y(this)g(License.)21 b(A)13 b(F)l(ron)o(t-Co)o(v)o(er)e(T)l(ext)i
+(ma)o(y)f(b)q(e)i(at)e(most)g(5)h(w)o(ords,)f(and)h(a)g(Bac)o(k-Co)o(v)
+o(er)f(T)l(ext)h(ma)o(y)165 729 y(b)q(e)j(at)e(most)h(25)f(w)o(ords.)
+165 799 y(A)k(\\T)l(ransparen)o(t")e(cop)o(y)i(of)f(the)h(Do)q(cumen)o
+(t)g(means)f(a)h(mac)o(hine-readable)h(cop)o(y)l(,)f(represen)o(ted)165
+854 y(in)h(a)e(format)g(whose)g(sp)q(eci\014cation)j(is)f(a)o(v)m
+(ailable)g(to)e(the)h(general)h(public,)h(that)d(is)h(suitable)i(for)
+165 909 y(revising)d(the)f(do)q(cumen)o(t)g(straigh)o(tforw)o(ardly)f
+(with)h(generic)h(text)e(editors)h(or)f(\(for)g(images)h(com-)165
+964 y(p)q(osed)c(of)g(pixels\))h(generic)g(pain)o(t)f(programs)f(or)g
+(\(for)g(dra)o(wings\))h(some)f(widely)i(a)o(v)m(ailable)h(dra)o(wing)
+165 1018 y(editor,)h(and)f(that)g(is)h(suitable)h(for)e(input)h(to)f
+(text)g(formatters)f(or)h(for)g(automatic)g(translation)h(to)165
+1073 y(a)e(v)m(ariet)o(y)h(of)f(formats)f(suitable)i(for)f(input)i(to)d
+(text)h(formatters.)18 b(A)13 b(cop)o(y)h(made)f(in)h(an)g(otherwise)
+165 1128 y(T)l(ransparen)o(t)k(\014le)i(format)d(whose)i(markup,)g(or)g
+(absence)g(of)g(markup,)g(has)f(b)q(een)i(arranged)f(to)165
+1183 y(th)o(w)o(art)12 b(or)g(discourage)i(subsequen)o(t)g(mo)q
+(di\014cation)h(b)o(y)e(readers)g(is)h(not)f(T)l(ransparen)o(t.)18
+b(An)c(image)165 1238 y(format)i(is)i(not)e(T)l(ransparen)o(t)h(if)h
+(used)f(for)g(an)o(y)g(substan)o(tial)g(amoun)o(t)g(of)f(text.)26
+b(A)17 b(cop)o(y)g(that)f(is)165 1292 y(not)f(\\T)l(ransparen)o(t")f
+(is)i(called)g(\\Opaque".)165 1363 y(Examples)27 b(of)f(suitable)i
+(formats)d(for)h(T)l(ransparen)o(t)g(copies)h(include)i(plain)f
+Fk(asci)q(i)e Fr(without)165 1418 y(markup,)20 b(T)l(exinfo)h(input)g
+(format,)e(LaT)887 1427 y(E)913 1418 y(X)h(input)h(format,)e
+Fk(sgml)h Fr(or)f Fk(xml)h Fr(using)h(a)e(publicly)165
+1472 y(a)o(v)m(ailable)e Fk(dtd)p Fr(,)g(and)f(standard-conforming)f
+(simple)i Fk(html)p Fr(,)f(P)o(ostScript)f(or)h Fk(pdf)g
+Fr(designed)i(for)165 1527 y(h)o(uman)h(mo)q(di\014cation.)33
+b(Examples)19 b(of)g(transparen)o(t)f(image)h(formats)f(include)k
+Fk(png)p Fr(,)e Fk(x)o(cf)f Fr(and)165 1582 y Fk(jpg)p
+Fr(.)32 b(Opaque)20 b(formats)e(include)j(proprietary)e(formats)f(that)
+g(can)h(b)q(e)h(read)f(and)g(edited)h(only)165 1637 y(b)o(y)g
+(proprietary)f(w)o(ord)g(pro)q(cessors,)h Fk(sgml)g Fr(or)f
+Fk(xml)h Fr(for)f(whic)o(h)i(the)f Fk(dtd)g Fr(and/or)f(pro)q(cessing)
+165 1692 y(to)q(ols)c(are)h(not)f(generally)h(a)o(v)m(ailable,)h(and)f
+(the)f(mac)o(hine-generated)i Fk(html)p Fr(,)e(P)o(ostScript)g(or)g
+Fk(pdf)165 1746 y Fr(pro)q(duced)h(b)o(y)f(some)g(w)o(ord)g(pro)q
+(cessors)g(for)f(output)h(purp)q(oses)h(only)l(.)165
+1817 y(The)h(\\Title)h(P)o(age")e(means,)i(for)e(a)h(prin)o(ted)h(b)q
+(o)q(ok,)f(the)g(title)h(page)f(itself,)i(plus)f(suc)o(h)f(follo)o
+(wing)165 1872 y(pages)d(as)f(are)h(needed)h(to)e(hold,)i(legibly)l(,)g
+(the)f(material)g(this)h(License)g(requires)g(to)e(app)q(ear)h(in)h
+(the)165 1926 y(title)f(page.)19 b(F)l(or)13 b(w)o(orks)f(in)i(formats)
+e(whic)o(h)i(do)f(not)g(ha)o(v)o(e)g(an)o(y)g(title)h(page)f(as)g(suc)o
+(h,)h(\\Title)g(P)o(age")165 1981 y(means)h(the)h(text)e(near)i(the)f
+(most)g(prominen)o(t)g(app)q(earance)h(of)f(the)g(w)o(ork's)f(title,)i
+(preceding)h(the)165 2036 y(b)q(eginning)g(of)e(the)g(b)q(o)q(dy)h(of)f
+(the)g(text.)165 2106 y(A)g(section)g(\\En)o(titled)h(XYZ")e(means)h(a)
+g(named)g(subunit)h(of)e(the)h(Do)q(cumen)o(t)g(whose)g(title)g(either)
+165 2161 y(is)f(precisely)i(XYZ)e(or)f(con)o(tains)h(XYZ)g(in)h(paren)o
+(theses)f(follo)o(wing)g(text)g(that)f(translates)g(XYZ)h(in)165
+2216 y(another)e(language.)19 b(\(Here)13 b(XYZ)f(stands)g(for)g(a)g
+(sp)q(eci\014c)j(section)e(name)f(men)o(tioned)h(b)q(elo)o(w,)h(suc)o
+(h)165 2271 y(as)g(\\Ac)o(kno)o(wledgemen)o(ts",)f(\\Dedications",)i
+(\\Endorsemen)o(ts",)e(or)g(\\History".\))19 b(T)l(o)13
+b(\\Preserv)o(e)165 2326 y(the)k(Title")g(of)g(suc)o(h)g(a)f(section)i
+(when)f(y)o(ou)f(mo)q(dify)i(the)f(Do)q(cumen)o(t)f(means)h(that)f(it)h
+(remains)g(a)165 2380 y(section)f(\\En)o(titled)g(XYZ")e(according)i
+(to)f(this)g(de\014nition.)165 2451 y(The)f(Do)q(cumen)o(t)g(ma)o(y)f
+(include)j(W)l(arran)o(t)o(y)c(Disclaimers)j(next)f(to)g(the)g(notice)g
+(whic)o(h)h(states)e(that)165 2506 y(this)k(License)i(applies)g(to)d
+(the)h(Do)q(cumen)o(t.)25 b(These)17 b(W)l(arran)o(t)o(y)e(Disclaimers)
+k(are)d(considered)j(to)165 2560 y(b)q(e)g(included)j(b)o(y)d
+(reference)g(in)h(this)f(License,)i(but)e(only)g(as)g(regards)f
+(disclaiming)j(w)o(arran)o(ties:)165 2615 y(an)o(y)d(other)g
+(implication)j(that)d(these)g(W)l(arran)o(t)o(y)f(Disclaimers)j(ma)o(y)
+d(ha)o(v)o(e)h(is)h(v)o(oid)g(and)g(has)f(no)165 2670
+y(e\013ect)d(on)g(the)g(meaning)h(of)f(this)h(License.)p
+eop
+%%Page: 15 19
+15 18 bop 75 -58 a Fr(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(15)100 149 y(2.)29 b(VERBA)l(TIM)15 b(COPYING)165
+222 y(Y)l(ou)k(ma)o(y)g(cop)o(y)f(and)i(distribute)g(the)f(Do)q(cumen)o
+(t)g(in)h(an)o(y)f(medium,)h(either)g(commercially)g(or)165
+277 y(noncommercially)l(,)k(pro)o(vided)e(that)f(this)h(License,)i(the)
+d(cop)o(yrigh)o(t)g(notices,)i(and)f(the)f(license)165
+332 y(notice)e(sa)o(ying)e(this)i(License)g(applies)h(to)d(the)h(Do)q
+(cumen)o(t)g(are)f(repro)q(duced)i(in)g(all)g(copies,)g(and)165
+387 y(that)13 b(y)o(ou)g(add)g(no)g(other)g(conditions)i(whatso)q(ev)o
+(er)d(to)h(those)g(of)g(this)h(License.)21 b(Y)l(ou)13
+b(ma)o(y)g(not)g(use)165 442 y(tec)o(hnical)18 b(measures)e(to)g
+(obstruct)g(or)g(con)o(trol)g(the)g(reading)h(or)f(further)h(cop)o
+(ying)g(of)f(the)g(copies)165 496 y(y)o(ou)c(mak)o(e)g(or)f
+(distribute.)21 b(Ho)o(w)o(ev)o(er,)11 b(y)o(ou)h(ma)o(y)g(accept)g
+(comp)q(ensation)h(in)g(exc)o(hange)g(for)e(copies.)165
+551 y(If)16 b(y)o(ou)g(distribute)h(a)f(large)g(enough)h(n)o(um)o(b)q
+(er)f(of)g(copies)h(y)o(ou)f(m)o(ust)f(also)h(follo)o(w)h(the)f
+(conditions)165 606 y(in)g(section)g(3.)165 679 y(Y)l(ou)11
+b(ma)o(y)e(also)i(lend)g(copies,)h(under)f(the)g(same)f(conditions)h
+(stated)f(ab)q(o)o(v)o(e,)h(and)f(y)o(ou)g(ma)o(y)g(publicly)165
+734 y(displa)o(y)16 b(copies.)100 807 y(3.)29 b(COPYING)16
+b(IN)f(QUANTITY)165 880 y(If)e(y)o(ou)f(publish)j(prin)o(ted)e(copies)h
+(\(or)d(copies)j(in)f(media)h(that)d(commonly)i(ha)o(v)o(e)f(prin)o
+(ted)i(co)o(v)o(ers\))d(of)165 935 y(the)16 b(Do)q(cumen)o(t,)g(n)o(um)
+o(b)q(ering)g(more)g(than)g(100,)e(and)i(the)g(Do)q(cumen)o(t's)g
+(license)i(notice)e(requires)165 990 y(Co)o(v)o(er)g(T)l(exts,)h(y)o
+(ou)g(m)o(ust)g(enclose)h(the)f(copies)h(in)g(co)o(v)o(ers)f(that)f
+(carry)l(,)h(clearly)h(and)g(legibly)l(,)h(all)165 1044
+y(these)h(Co)o(v)o(er)e(T)l(exts:)29 b(F)l(ron)o(t-Co)o(v)o(er)18
+b(T)l(exts)h(on)g(the)h(fron)o(t)f(co)o(v)o(er,)g(and)h(Bac)o(k-Co)o(v)
+o(er)f(T)l(exts)g(on)165 1099 y(the)c(bac)o(k)f(co)o(v)o(er.)19
+b(Both)14 b(co)o(v)o(ers)g(m)o(ust)g(also)h(clearly)h(and)e(legibly)j
+(iden)o(tify)f(y)o(ou)e(as)g(the)h(publisher)165 1154
+y(of)i(these)g(copies.)27 b(The)17 b(fron)o(t)f(co)o(v)o(er)h(m)o(ust)f
+(presen)o(t)i(the)f(full)h(title)g(with)g(all)g(w)o(ords)e(of)h(the)g
+(title)165 1209 y(equally)g(prominen)o(t)f(and)f(visible.)23
+b(Y)l(ou)16 b(ma)o(y)e(add)i(other)f(material)g(on)h(the)f(co)o(v)o
+(ers)g(in)h(addition.)165 1264 y(Cop)o(ying)i(with)h(c)o(hanges)f
+(limited)i(to)d(the)h(co)o(v)o(ers,)g(as)g(long)g(as)g(they)g(preserv)o
+(e)g(the)g(title)h(of)f(the)165 1318 y(Do)q(cumen)o(t)g(and)h(satisfy)f
+(these)h(conditions,)h(can)f(b)q(e)g(treated)f(as)h(v)o(erbatim)f(cop)o
+(ying)h(in)g(other)165 1373 y(resp)q(ects.)165 1446 y(If)e(the)f
+(required)i(texts)d(for)h(either)h(co)o(v)o(er)f(are)g(to)q(o)g(v)o
+(oluminous)h(to)f(\014t)g(legibly)l(,)i(y)o(ou)e(should)i(put)165
+1501 y(the)f(\014rst)f(ones)g(listed)i(\(as)d(man)o(y)h(as)g(\014t)h
+(reasonably\))f(on)g(the)h(actual)g(co)o(v)o(er,)e(and)i(con)o(tin)o
+(ue)g(the)165 1556 y(rest)e(on)o(to)f(adjacen)o(t)h(pages.)165
+1629 y(If)f(y)o(ou)f(publish)j(or)d(distribute)h(Opaque)h(copies)f(of)f
+(the)h(Do)q(cumen)o(t)f(n)o(um)o(b)q(ering)i(more)e(than)g(100,)165
+1684 y(y)o(ou)h(m)o(ust)f(either)i(include)h(a)e(mac)o(hine-readable)i
+(T)l(ransparen)o(t)d(cop)o(y)h(along)g(with)g(eac)o(h)g(Opaque)165
+1738 y(cop)o(y)l(,)k(or)f(state)g(in)h(or)f(with)h(eac)o(h)f(Opaque)i
+(cop)o(y)e(a)g(computer-net)o(w)o(ork)g(lo)q(cation)h(from)f(whic)o(h)
+165 1793 y(the)12 b(general)h(net)o(w)o(ork-using)f(public)i(has)e
+(access)g(to)g(do)o(wnload)g(using)h(public-standard)h(net)o(w)o(ork)
+165 1848 y(proto)q(cols)19 b(a)g(complete)i(T)l(ransparen)o(t)d(cop)o
+(y)i(of)f(the)g(Do)q(cumen)o(t,)h(free)g(of)f(added)h(material.)33
+b(If)165 1903 y(y)o(ou)19 b(use)h(the)f(latter)g(option,)i(y)o(ou)e(m)o
+(ust)g(tak)o(e)f(reasonably)i(pruden)o(t)g(steps,)g(when)g(y)o(ou)f(b)q
+(egin)165 1958 y(distribution)i(of)d(Opaque)i(copies)g(in)g(quan)o(tit)
+o(y)l(,)g(to)e(ensure)i(that)e(this)i(T)l(ransparen)o(t)e(cop)o(y)h
+(will)165 2012 y(remain)d(th)o(us)e(accessible)j(at)e(the)g(stated)g
+(lo)q(cation)g(un)o(til)i(at)d(least)h(one)h(y)o(ear)e(after)g(the)i
+(last)f(time)165 2067 y(y)o(ou)j(distribute)i(an)e(Opaque)h(cop)o(y)f
+(\(directly)i(or)e(through)g(y)o(our)g(agen)o(ts)f(or)h(retailers\))h
+(of)f(that)165 2122 y(edition)f(to)d(the)h(public.)165
+2195 y(It)i(is)h(requested,)g(but)f(not)g(required,)i(that)d(y)o(ou)h
+(con)o(tact)g(the)g(authors)g(of)f(the)i(Do)q(cumen)o(t)f(w)o(ell)165
+2250 y(b)q(efore)e(redistributing)h(an)o(y)e(large)g(n)o(um)o(b)q(er)h
+(of)e(copies,)i(to)f(giv)o(e)h(them)f(a)g(c)o(hance)h(to)e(pro)o(vide)i
+(y)o(ou)165 2305 y(with)h(an)f(up)q(dated)h(v)o(ersion)f(of)g(the)g(Do)
+q(cumen)o(t.)100 2378 y(4.)29 b(MODIFICA)l(TIONS)165
+2451 y(Y)l(ou)13 b(ma)o(y)f(cop)o(y)h(and)g(distribute)h(a)e(Mo)q
+(di\014ed)i(V)l(ersion)g(of)e(the)h(Do)q(cumen)o(t)f(under)i(the)f
+(conditions)165 2506 y(of)d(sections)h(2)f(and)h(3)f(ab)q(o)o(v)o(e,)h
+(pro)o(vided)g(that)f(y)o(ou)g(release)h(the)g(Mo)q(di\014ed)h(V)l
+(ersion)f(under)g(precisely)165 2560 y(this)k(License,)h(with)f(the)f
+(Mo)q(di\014ed)i(V)l(ersion)f(\014lling)i(the)e(role)f(of)h(the)f(Do)q
+(cumen)o(t,)g(th)o(us)h(licensing)165 2615 y(distribution)k(and)e(mo)q
+(di\014cation)h(of)f(the)g(Mo)q(di\014ed)h(V)l(ersion)g(to)e(who)q(ev)o
+(er)h(p)q(ossesses)h(a)e(cop)o(y)h(of)165 2670 y(it.)j(In)c(addition,)g
+(y)o(ou)f(m)o(ust)f(do)h(these)h(things)g(in)g(the)f(Mo)q(di\014ed)h(V)
+l(ersion:)p eop
+%%Page: 16 20
+16 19 bop 75 -58 a Fr(16)1324 b(GNU)15 b(History)g(Library)178
+149 y(A.)30 b(Use)17 b(in)g(the)f(Title)h(P)o(age)f(\(and)g(on)h(the)f
+(co)o(v)o(ers,)g(if)g(an)o(y\))g(a)g(title)h(distinct)h(from)d(that)h
+(of)g(the)255 204 y(Do)q(cumen)o(t,)h(and)g(from)f(those)h(of)f
+(previous)i(v)o(ersions)f(\(whic)o(h)g(should,)h(if)g(there)f(w)o(ere)f
+(an)o(y)l(,)255 259 y(b)q(e)g(listed)h(in)g(the)f(History)f(section)h
+(of)f(the)h(Do)q(cumen)o(t\).)21 b(Y)l(ou)16 b(ma)o(y)f(use)h(the)g
+(same)f(title)h(as)255 314 y(a)f(previous)h(v)o(ersion)f(if)h(the)f
+(original)h(publisher)i(of)d(that)f(v)o(ersion)h(giv)o(es)h(p)q
+(ermission.)180 379 y(B.)30 b(List)16 b(on)f(the)g(Title)i(P)o(age,)d
+(as)h(authors,)f(one)h(or)g(more)g(p)q(ersons)g(or)g(en)o(tities)h
+(resp)q(onsible)i(for)255 434 y(authorship)c(of)e(the)h(mo)q
+(di\014cations)h(in)g(the)f(Mo)q(di\014ed)i(V)l(ersion,)f(together)e
+(with)h(at)g(least)g(\014v)o(e)255 488 y(of)f(the)g(principal)i
+(authors)d(of)h(the)g(Do)q(cumen)o(t)g(\(all)g(of)g(its)g(principal)i
+(authors,)e(if)g(it)g(has)g(few)o(er)255 543 y(than)j(\014v)o(e\),)g
+(unless)h(they)f(release)h(y)o(ou)f(from)f(this)i(requiremen)o(t.)180
+608 y(C.)29 b(State)15 b(on)g(the)h(Title)g(page)f(the)h(name)f(of)g
+(the)g(publisher)j(of)d(the)g(Mo)q(di\014ed)i(V)l(ersion,)f(as)f(the)
+255 663 y(publisher.)178 728 y(D.)29 b(Preserv)o(e)15
+b(all)h(the)f(cop)o(yrigh)o(t)g(notices)h(of)f(the)g(Do)q(cumen)o(t.)
+181 793 y(E.)30 b(Add)16 b(an)g(appropriate)g(cop)o(yrigh)o(t)f(notice)
+h(for)f(y)o(our)g(mo)q(di\014cations)i(adjacen)o(t)f(to)f(the)g(other)
+255 848 y(cop)o(yrigh)o(t)g(notices.)183 913 y(F.)29
+b(Include,)16 b(immediately)g(after)d(the)h(cop)o(yrigh)o(t)f(notices,)
+i(a)e(license)j(notice)f(giving)g(the)f(public)255 968
+y(p)q(ermission)g(to)d(use)i(the)f(Mo)q(di\014ed)i(V)l(ersion)f(under)g
+(the)f(terms)g(of)f(this)i(License,)h(in)f(the)g(form)255
+1023 y(sho)o(wn)i(in)h(the)f(Addendum)i(b)q(elo)o(w.)177
+1088 y(G.)29 b(Preserv)o(e)11 b(in)h(that)f(license)i(notice)g(the)e
+(full)i(lists)f(of)f(In)o(v)m(arian)o(t)h(Sections)g(and)f(required)i
+(Co)o(v)o(er)255 1143 y(T)l(exts)i(giv)o(en)h(in)g(the)f(Do)q(cumen)o
+(t's)g(license)i(notice.)178 1208 y(H.)30 b(Include)17
+b(an)e(unaltered)i(cop)o(y)e(of)f(this)i(License.)196
+1273 y(I.)30 b(Preserv)o(e)16 b(the)g(section)h(En)o(titled)g
+(\\History",)e(Preserv)o(e)g(its)i(Title,)f(and)h(add)f(to)f(it)i(an)f
+(item)255 1328 y(stating)e(at)f(least)h(the)g(title,)h(y)o(ear,)e(new)i
+(authors,)e(and)h(publisher)i(of)e(the)g(Mo)q(di\014ed)h(V)l(ersion)255
+1382 y(as)g(giv)o(en)h(on)g(the)g(Title)g(P)o(age.)21
+b(If)16 b(there)g(is)g(no)g(section)g(En)o(titled)g(\\History")f(in)i
+(the)f(Do)q(cu-)255 1437 y(men)o(t,)h(create)g(one)h(stating)f(the)g
+(title,)i(y)o(ear,)e(authors,)g(and)g(publisher)j(of)d(the)g(Do)q
+(cumen)o(t)255 1492 y(as)h(giv)o(en)g(on)g(its)g(Title)h(P)o(age,)f
+(then)h(add)f(an)g(item)g(describing)i(the)e(Mo)q(di\014ed)h(V)l
+(ersion)g(as)255 1547 y(stated)c(in)h(the)f(previous)h(sen)o(tence.)189
+1612 y(J.)30 b(Preserv)o(e)16 b(the)g(net)o(w)o(ork)f(lo)q(cation,)i
+(if)g(an)o(y)l(,)f(giv)o(en)h(in)g(the)f(Do)q(cumen)o(t)g(for)g(public)
+i(access)f(to)255 1667 y(a)e(T)l(ransparen)o(t)g(cop)o(y)h(of)f(the)g
+(Do)q(cumen)o(t,)h(and)f(lik)o(ewise)j(the)d(net)o(w)o(ork)g(lo)q
+(cations)h(giv)o(en)g(in)255 1721 y(the)g(Do)q(cumen)o(t)g(for)f
+(previous)h(v)o(ersions)g(it)g(w)o(as)f(based)i(on.)k(These)c(ma)o(y)e
+(b)q(e)h(placed)h(in)g(the)255 1776 y(\\History")12 b(section.)19
+b(Y)l(ou)13 b(ma)o(y)f(omit)g(a)g(net)o(w)o(ork)g(lo)q(cation)h(for)f
+(a)g(w)o(ork)g(that)g(w)o(as)f(published)255 1831 y(at)17
+b(least)h(four)g(y)o(ears)f(b)q(efore)h(the)g(Do)q(cumen)o(t)g(itself,)
+h(or)e(if)i(the)e(original)i(publisher)h(of)e(the)255
+1886 y(v)o(ersion)d(it)h(refers)f(to)f(giv)o(es)i(p)q(ermission.)177
+1951 y(K.)30 b(F)l(or)11 b(an)o(y)h(section)g(En)o(titled)h(\\Ac)o(kno)
+o(wledgemen)o(ts")f(or)f(\\Dedications",)h(Preserv)o(e)g(the)g(Title)
+255 2006 y(of)h(the)g(section,)h(and)f(preserv)o(e)h(in)g(the)f
+(section)h(all)g(the)g(substance)f(and)h(tone)f(of)g(eac)o(h)g(of)g
+(the)255 2060 y(con)o(tributor)i(ac)o(kno)o(wledgemen)o(ts)g(and/or)g
+(dedications)h(giv)o(en)g(therein.)184 2125 y(L.)30 b(Preserv)o(e)17
+b(all)i(the)f(In)o(v)m(arian)o(t)g(Sections)g(of)g(the)f(Do)q(cumen)o
+(t,)h(unaltered)h(in)f(their)h(text)e(and)255 2180 y(in)i(their)f
+(titles.)29 b(Section)19 b(n)o(um)o(b)q(ers)f(or)g(the)g(equiv)m(alen)o
+(t)h(are)f(not)g(considered)h(part)e(of)h(the)255 2235
+y(section)e(titles.)171 2300 y(M.)29 b(Delete)16 b(an)o(y)f(section)h
+(En)o(titled)g(\\Endorsemen)o(ts".)k(Suc)o(h)c(a)f(section)h(ma)o(y)e
+(not)h(b)q(e)h(included)255 2355 y(in)g(the)f(Mo)q(di\014ed)i(V)l
+(ersion.)178 2420 y(N.)30 b(Do)14 b(not)f(retitle)i(an)o(y)f(existing)h
+(section)g(to)f(b)q(e)g(En)o(titled)i(\\Endorsemen)o(ts")d(or)h(to)f
+(con\015ict)i(in)255 2475 y(title)h(with)f(an)o(y)g(In)o(v)m(arian)o(t)
+h(Section.)177 2540 y(O.)30 b(Preserv)o(e)15 b(an)o(y)g(W)l(arran)o(t)o
+(y)e(Disclaimers.)165 2615 y(If)k(the)g(Mo)q(di\014ed)h(V)l(ersion)f
+(includes)i(new)e(fron)o(t-matter)e(sections)i(or)f(app)q(endices)j
+(that)d(qualify)165 2670 y(as)e(Secondary)g(Sections)h(and)f(con)o
+(tain)g(no)g(material)g(copied)h(from)e(the)h(Do)q(cumen)o(t,)g(y)o(ou)
+f(ma)o(y)h(at)p eop
+%%Page: 17 21
+17 20 bop 75 -58 a Fr(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(17)165 149 y(y)o(our)16 b(option)g(designate)h(some)f(or)f
+(all)i(of)f(these)h(sections)f(as)g(in)o(v)m(arian)o(t.)24
+b(T)l(o)15 b(do)i(this,)f(add)g(their)165 204 y(titles)i(to)f(the)h
+(list)h(of)e(In)o(v)m(arian)o(t)h(Sections)h(in)f(the)g(Mo)q(di\014ed)h
+(V)l(ersion's)f(license)i(notice.)28 b(These)165 259
+y(titles)16 b(m)o(ust)f(b)q(e)g(distinct)i(from)d(an)o(y)h(other)g
+(section)h(titles.)165 325 y(Y)l(ou)21 b(ma)o(y)g(add)g(a)g(section)h
+(En)o(titled)g(\\Endorsemen)o(ts",)f(pro)o(vided)h(it)g(con)o(tains)f
+(nothing)h(but)165 380 y(endorsemen)o(ts)15 b(of)f(y)o(our)h(Mo)q
+(di\014ed)h(V)l(ersion)f(b)o(y)g(v)m(arious)g(parties|for)f(example,)i
+(statemen)o(ts)d(of)165 434 y(p)q(eer)h(review)g(or)g(that)e(the)i
+(text)f(has)h(b)q(een)g(appro)o(v)o(ed)g(b)o(y)f(an)h(organization)f
+(as)h(the)f(authoritativ)o(e)165 489 y(de\014nition)k(of)e(a)g
+(standard.)165 555 y(Y)l(ou)f(ma)o(y)g(add)g(a)g(passage)g(of)f(up)i
+(to)e(\014v)o(e)i(w)o(ords)e(as)h(a)g(F)l(ron)o(t-Co)o(v)o(er)e(T)l
+(ext,)i(and)g(a)g(passage)g(of)f(up)165 610 y(to)g(25)g(w)o(ords)g(as)g
+(a)g(Bac)o(k-Co)o(v)o(er)g(T)l(ext,)g(to)g(the)g(end)i(of)e(the)g(list)
+i(of)e(Co)o(v)o(er)f(T)l(exts)i(in)g(the)g(Mo)q(di\014ed)165
+665 y(V)l(ersion.)29 b(Only)19 b(one)f(passage)f(of)h(F)l(ron)o(t-Co)o
+(v)o(er)e(T)l(ext)i(and)g(one)g(of)f(Bac)o(k-Co)o(v)o(er)g(T)l(ext)h
+(ma)o(y)f(b)q(e)165 719 y(added)d(b)o(y)g(\(or)f(through)g(arrangemen)o
+(ts)g(made)h(b)o(y\))f(an)o(y)h(one)g(en)o(tit)o(y)l(.)19
+b(If)14 b(the)g(Do)q(cumen)o(t)g(already)165 774 y(includes)19
+b(a)e(co)o(v)o(er)f(text)h(for)f(the)h(same)g(co)o(v)o(er,)f
+(previously)i(added)g(b)o(y)f(y)o(ou)g(or)f(b)o(y)h(arrangemen)o(t)165
+829 y(made)h(b)o(y)f(the)h(same)f(en)o(tit)o(y)h(y)o(ou)f(are)g(acting)
+h(on)f(b)q(ehalf)i(of,)f(y)o(ou)f(ma)o(y)g(not)g(add)h(another;)g(but)
+165 884 y(y)o(ou)f(ma)o(y)f(replace)i(the)f(old)h(one,)f(on)g(explicit)
+i(p)q(ermission)f(from)f(the)g(previous)h(publisher)h(that)165
+938 y(added)d(the)f(old)h(one.)165 1004 y(The)d(author\(s\))e(and)i
+(publisher\(s\))h(of)f(the)g(Do)q(cumen)o(t)f(do)h(not)f(b)o(y)h(this)g
+(License)i(giv)o(e)e(p)q(ermission)165 1059 y(to)i(use)g(their)h(names)
+f(for)f(publicit)o(y)k(for)c(or)h(to)f(assert)h(or)f(imply)j
+(endorsemen)o(t)e(of)g(an)o(y)g(Mo)q(di\014ed)165 1114
+y(V)l(ersion.)100 1180 y(5.)29 b(COMBINING)16 b(DOCUMENTS)165
+1245 y(Y)l(ou)k(ma)o(y)e(com)o(bine)i(the)g(Do)q(cumen)o(t)f(with)h
+(other)f(do)q(cumen)o(ts)g(released)i(under)f(this)g(License,)165
+1300 y(under)g(the)f(terms)g(de\014ned)h(in)g(section)g(4)e(ab)q(o)o(v)
+o(e)h(for)g(mo)q(di\014ed)h(v)o(ersions,)g(pro)o(vided)g(that)e(y)o(ou)
+165 1355 y(include)d(in)e(the)g(com)o(bination)h(all)f(of)f(the)h(In)o
+(v)m(arian)o(t)g(Sections)h(of)e(all)h(of)g(the)f(original)i(do)q
+(cumen)o(ts,)165 1410 y(unmo)q(di\014ed,)h(and)f(list)g(them)f(all)i
+(as)e(In)o(v)m(arian)o(t)g(Sections)i(of)e(y)o(our)f(com)o(bined)j(w)o
+(ork)d(in)i(its)g(license)165 1465 y(notice,)h(and)h(that)e(y)o(ou)h
+(preserv)o(e)g(all)i(their)e(W)l(arran)o(t)o(y)f(Disclaimers.)165
+1530 y(The)h(com)o(bined)i(w)o(ork)d(need)i(only)f(con)o(tain)h(one)f
+(cop)o(y)g(of)g(this)g(License,)i(and)e(m)o(ultiple)i(iden)o(tical)165
+1585 y(In)o(v)m(arian)o(t)g(Sections)g(ma)o(y)e(b)q(e)i(replaced)h
+(with)e(a)g(single)i(cop)o(y)l(.)23 b(If)16 b(there)h(are)f(m)o
+(ultiple)i(In)o(v)m(arian)o(t)165 1640 y(Sections)c(with)g(the)f(same)g
+(name)h(but)f(di\013eren)o(t)h(con)o(ten)o(ts,)f(mak)o(e)g(the)g(title)
+h(of)f(eac)o(h)h(suc)o(h)f(section)165 1695 y(unique)19
+b(b)o(y)d(adding)i(at)f(the)g(end)g(of)g(it,)g(in)h(paren)o(theses,)f
+(the)g(name)g(of)g(the)g(original)h(author)e(or)165 1749
+y(publisher)f(of)d(that)g(section)h(if)g(kno)o(wn,)f(or)g(else)h(a)g
+(unique)h(n)o(um)o(b)q(er.)19 b(Mak)o(e)12 b(the)g(same)h(adjustmen)o
+(t)165 1804 y(to)f(the)g(section)h(titles)g(in)g(the)f(list)h(of)f(In)o
+(v)m(arian)o(t)g(Sections)h(in)g(the)g(license)h(notice)f(of)f(the)g
+(com)o(bined)165 1859 y(w)o(ork.)165 1925 y(In)21 b(the)g(com)o
+(bination,)h(y)o(ou)f(m)o(ust)f(com)o(bine)h(an)o(y)f(sections)i(En)o
+(titled)f(\\History")f(in)h(the)g(v)m(ari-)165 1980 y(ous)16
+b(original)h(do)q(cumen)o(ts,)f(forming)g(one)h(section)f(En)o(titled)h
+(\\History";)f(lik)o(ewise)h(com)o(bine)g(an)o(y)165
+2034 y(sections)f(En)o(titled)h(\\Ac)o(kno)o(wledgemen)o(ts",)f(and)g
+(an)o(y)f(sections)i(En)o(titled)f(\\Dedications".)23
+b(Y)l(ou)165 2089 y(m)o(ust)15 b(delete)h(all)g(sections)g(En)o(titled)
+g(\\Endorsemen)o(ts.")100 2155 y(6.)29 b(COLLECTIONS)17
+b(OF)e(DOCUMENTS)165 2221 y(Y)l(ou)h(ma)o(y)f(mak)o(e)h(a)f(collection)
+j(consisting)f(of)e(the)h(Do)q(cumen)o(t)g(and)g(other)g(do)q(cumen)o
+(ts)g(released)165 2275 y(under)22 b(this)g(License,)i(and)d(replace)h
+(the)f(individual)k(copies)d(of)f(this)g(License)i(in)f(the)f(v)m
+(arious)165 2330 y(do)q(cumen)o(ts)h(with)f(a)g(single)i(cop)o(y)e
+(that)f(is)i(included)i(in)e(the)f(collection,)k(pro)o(vided)d(that)e
+(y)o(ou)165 2385 y(follo)o(w)f(the)f(rules)i(of)e(this)h(License)h(for)
+e(v)o(erbatim)g(cop)o(ying)h(of)f(eac)o(h)h(of)f(the)h(do)q(cumen)o(ts)
+g(in)g(all)165 2440 y(other)c(resp)q(ects.)165 2506 y(Y)l(ou)h(ma)o(y)f
+(extract)g(a)g(single)i(do)q(cumen)o(t)f(from)f(suc)o(h)h(a)g
+(collection,)h(and)f(distribute)h(it)f(individu-)165
+2560 y(ally)i(under)h(this)f(License,)h(pro)o(vided)f(y)o(ou)f(insert)h
+(a)g(cop)o(y)f(of)g(this)h(License)h(in)o(to)f(the)f(extracted)165
+2615 y(do)q(cumen)o(t,)g(and)f(follo)o(w)g(this)h(License)h(in)f(all)h
+(other)d(resp)q(ects)i(regarding)g(v)o(erbatim)f(cop)o(ying)g(of)165
+2670 y(that)e(do)q(cumen)o(t.)p eop
+%%Page: 18 22
+18 21 bop 75 -58 a Fr(18)1324 b(GNU)15 b(History)g(Library)100
+149 y(7.)29 b(A)o(GGREGA)l(TION)14 b(WITH)i(INDEPENDENT)e(W)o(ORKS)165
+214 y(A)g(compilation)h(of)f(the)g(Do)q(cumen)o(t)g(or)f(its)i(deriv)m
+(ativ)o(es)g(with)f(other)g(separate)f(and)i(indep)q(enden)o(t)165
+269 y(do)q(cumen)o(ts)i(or)f(w)o(orks,)g(in)h(or)f(on)h(a)f(v)o(olume)h
+(of)f(a)h(storage)e(or)h(distribution)j(medium,)e(is)g(called)165
+324 y(an)e(\\aggregate")e(if)i(the)h(cop)o(yrigh)o(t)e(resulting)i
+(from)f(the)g(compilation)h(is)g(not)e(used)i(to)e(limit)j(the)165
+379 y(legal)d(righ)o(ts)f(of)g(the)g(compilation's)i(users)e(b)q(ey)o
+(ond)h(what)f(the)g(individual)j(w)o(orks)d(p)q(ermit.)20
+b(When)165 433 y(the)14 b(Do)q(cumen)o(t)g(is)g(included)i(an)e
+(aggregate,)e(this)j(License)g(do)q(es)f(not)g(apply)g(to)g(the)g
+(other)f(w)o(orks)165 488 y(in)j(the)f(aggregate)f(whic)o(h)i(are)f
+(not)g(themselv)o(es)h(deriv)m(ativ)o(e)g(w)o(orks)e(of)h(the)g(Do)q
+(cumen)o(t.)165 553 y(If)d(the)f(Co)o(v)o(er)f(T)l(ext)i(requiremen)o
+(t)g(of)f(section)h(3)f(is)h(applicable)h(to)e(these)h(copies)g(of)f
+(the)g(Do)q(cumen)o(t,)165 608 y(then)h(if)f(the)h(Do)q(cumen)o(t)f(is)
+g(less)h(than)f(one)h(half)f(of)g(the)g(en)o(tire)h(aggregate,)e(the)h
+(Do)q(cumen)o(t's)g(Co)o(v)o(er)165 663 y(T)l(exts)i(ma)o(y)g(b)q(e)h
+(placed)g(on)f(co)o(v)o(ers)g(that)f(brac)o(k)o(et)h(the)g(Do)q(cumen)o
+(t)g(within)i(the)e(aggregate,)f(or)h(the)165 717 y(electronic)19
+b(equiv)m(alen)o(t)g(of)e(co)o(v)o(ers)g(if)h(the)g(Do)q(cumen)o(t)f
+(is)h(in)g(electronic)h(form.)27 b(Otherwise)18 b(they)165
+772 y(m)o(ust)d(app)q(ear)g(on)g(prin)o(ted)h(co)o(v)o(ers)f(that)f
+(brac)o(k)o(et)h(the)g(whole)h(aggregate.)100 837 y(8.)29
+b(TRANSLA)l(TION)165 902 y(T)l(ranslation)20 b(is)h(considered)g(a)f
+(kind)h(of)e(mo)q(di\014cation,)j(so)e(y)o(ou)g(ma)o(y)f(distribute)i
+(translations)165 956 y(of)h(the)g(Do)q(cumen)o(t)g(under)h(the)f
+(terms)g(of)g(section)g(4.)41 b(Replacing)23 b(In)o(v)m(arian)o(t)g
+(Sections)g(with)165 1011 y(translations)g(requires)g(sp)q(ecial)i(p)q
+(ermission)f(from)e(their)h(cop)o(yrigh)o(t)f(holders,)j(but)e(y)o(ou)g
+(ma)o(y)165 1066 y(include)15 b(translations)d(of)g(some)g(or)f(all)i
+(In)o(v)m(arian)o(t)g(Sections)g(in)g(addition)h(to)d(the)h(original)i
+(v)o(ersions)165 1121 y(of)h(these)h(In)o(v)m(arian)o(t)g(Sections.)23
+b(Y)l(ou)15 b(ma)o(y)g(include)k(a)c(translation)h(of)f(this)h
+(License,)h(and)f(all)h(the)165 1176 y(license)23 b(notices)e(in)g(the)
+g(Do)q(cumen)o(t,)g(and)g(an)o(y)f(W)l(arran)o(t)o(y)f(Disclaimers,)k
+(pro)o(vided)e(that)f(y)o(ou)165 1230 y(also)g(include)i(the)e
+(original)i(English)f(v)o(ersion)f(of)g(this)g(License)i(and)e(the)g
+(original)h(v)o(ersions)f(of)165 1285 y(those)d(notices)g(and)h
+(disclaimers.)27 b(In)18 b(case)f(of)f(a)h(disagreemen)o(t)g(b)q(et)o
+(w)o(een)h(the)f(translation)g(and)165 1340 y(the)h(original)g(v)o
+(ersion)g(of)f(this)h(License)i(or)d(a)g(notice)h(or)f(disclaimer,)j
+(the)e(original)g(v)o(ersion)g(will)165 1395 y(prev)m(ail.)165
+1460 y(If)d(a)f(section)g(in)i(the)e(Do)q(cumen)o(t)g(is)h(En)o(titled)
+g(\\Ac)o(kno)o(wledgemen)o(ts",)f(\\Dedications",)h(or)e(\\His-)165
+1514 y(tory",)f(the)h(requiremen)o(t)h(\(section)f(4\))g(to)f(Preserv)o
+(e)h(its)h(Title)g(\(section)f(1\))g(will)i(t)o(ypically)f(require)165
+1569 y(c)o(hanging)i(the)f(actual)g(title.)100 1634 y(9.)29
+b(TERMINA)l(TION)165 1699 y(Y)l(ou)15 b(ma)o(y)f(not)h(cop)o(y)l(,)f
+(mo)q(dify)l(,)i(sublicense,)h(or)d(distribute)i(the)f(Do)q(cumen)o(t)g
+(except)h(as)e(expressly)165 1753 y(pro)o(vided)22 b(for)e(under)i
+(this)f(License.)39 b(An)o(y)21 b(other)f(attempt)g(to)g(cop)o(y)l(,)i
+(mo)q(dify)l(,)h(sublicense)g(or)165 1808 y(distribute)d(the)e(Do)q
+(cumen)o(t)g(is)h(v)o(oid,)g(and)f(will)i(automatically)f(terminate)f
+(y)o(our)g(righ)o(ts)g(under)165 1863 y(this)c(License.)22
+b(Ho)o(w)o(ev)o(er,)12 b(parties)i(who)g(ha)o(v)o(e)g(receiv)o(ed)h
+(copies,)f(or)g(righ)o(ts,)f(from)g(y)o(ou)h(under)h(this)165
+1918 y(License)20 b(will)g(not)e(ha)o(v)o(e)g(their)h(licenses)h
+(terminated)f(so)f(long)g(as)g(suc)o(h)h(parties)g(remain)f(in)i(full)
+165 1973 y(compliance.)77 2037 y(10.)29 b(FUTURE)14 b(REVISIONS)j(OF)e
+(THIS)h(LICENSE)165 2102 y(The)21 b(F)l(ree)g(Soft)o(w)o(are)e(F)l
+(oundation)i(ma)o(y)f(publish)j(new,)f(revised)g(v)o(ersions)f(of)f
+(the)h(GNU)g(F)l(ree)165 2157 y(Do)q(cumen)o(tation)16
+b(License)i(from)d(time)h(to)g(time.)22 b(Suc)o(h)17
+b(new)f(v)o(ersions)h(will)g(b)q(e)g(similar)g(in)g(spirit)165
+2212 y(to)g(the)g(presen)o(t)g(v)o(ersion,)h(but)f(ma)o(y)f(di\013er)i
+(in)g(detail)g(to)f(address)g(new)g(problems)h(or)f(concerns.)165
+2266 y(See)f Fq(http://www.gnu.org/copyle)o(ft/)p Fr(.)165
+2331 y(Eac)o(h)f(v)o(ersion)f(of)h(the)g(License)h(is)f(giv)o(en)g(a)g
+(distinguishing)i(v)o(ersion)e(n)o(um)o(b)q(er.)20 b(If)15
+b(the)g(Do)q(cumen)o(t)165 2386 y(sp)q(eci\014es)24 b(that)e(a)h
+(particular)g(n)o(um)o(b)q(ered)h(v)o(ersion)e(of)h(this)g(License)h
+(\\or)e(an)o(y)g(later)h(v)o(ersion")165 2441 y(applies)18
+b(to)d(it,)i(y)o(ou)f(ha)o(v)o(e)g(the)g(option)g(of)g(follo)o(wing)h
+(the)f(terms)g(and)g(conditions)i(either)f(of)f(that)165
+2496 y(sp)q(eci\014ed)21 b(v)o(ersion)e(or)g(of)f(an)o(y)h(later)g(v)o
+(ersion)g(that)f(has)h(b)q(een)h(published)i(\(not)c(as)g(a)h(draft\))f
+(b)o(y)165 2550 y(the)e(F)l(ree)h(Soft)o(w)o(are)e(F)l(oundation.)23
+b(If)17 b(the)g(Do)q(cumen)o(t)f(do)q(es)g(not)g(sp)q(ecify)i(a)e(v)o
+(ersion)h(n)o(um)o(b)q(er)f(of)165 2605 y(this)i(License,)h(y)o(ou)e
+(ma)o(y)f(c)o(ho)q(ose)i(an)o(y)e(v)o(ersion)i(ev)o(er)f(published)j
+(\(not)c(as)h(a)g(draft\))f(b)o(y)i(the)f(F)l(ree)165
+2660 y(Soft)o(w)o(are)d(F)l(oundation.)p eop
+%%Page: 19 23
+19 22 bop 75 -58 a Fr(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(19)75 149 y Fi(A.1.1)30 b(ADDENDUM:)22 b(Ho)n(w)f(to)f(use)
+h(this)f(License)h(for)f(y)n(our)h(do)r(cumen)n(ts)137
+271 y Fr(T)l(o)14 b(use)g(this)g(License)h(in)g(a)e(do)q(cumen)o(t)h(y)
+o(ou)f(ha)o(v)o(e)h(written,)f(include)j(a)d(cop)o(y)h(of)f(the)h
+(License)h(in)g(the)75 326 y(do)q(cumen)o(t)h(and)f(put)g(the)h(follo)o
+(wing)g(cop)o(yrigh)o(t)e(and)i(license)h(notices)f(just)f(after)f(the)
+h(title)h(page:)234 382 y Fd(Copyright)g(\(C\))38 b Fc(year)k(your)19
+b(name)p Fd(.)234 426 y(Permission)d(is)j(granted)e(to)i(copy,)e
+(distribute)f(and/or)h(modify)h(this)g(document)234 469
+y(under)g(the)g(terms)g(of)h(the)f(GNU)h(Free)f(Documenta)o(tio)o(n)e
+(License,)h(Version)g(1.2)234 513 y(or)i(any)g(later)e(version)g
+(published)f(by)j(the)g(Free)f(Software)e(Foundation)o(;)234
+557 y(with)i(no)h(Invariant)d(Sections,)g(no)j(Front-Cove)o(r)e(Texts,)
+g(and)h(no)h(Back-Cover)d(Texts.)234 600 y(A)j(copy)g(of)f(the)h
+(license)e(is)i(included)d(in)j(the)f(section)f(entitled)g(``GNU)234
+644 y(Free)h(Documentat)o(ion)e(License'')o(.)137 705
+y Fr(If)k(y)o(ou)g(ha)o(v)o(e)g(In)o(v)m(arian)o(t)g(Sections,)h(F)l
+(ron)o(t-Co)o(v)o(er)e(T)l(exts)g(and)h(Bac)o(k-Co)o(v)o(er)f(T)l
+(exts,)i(replace)g(the)75 760 y(\\with...T)l(exts.")d(line)f(with)f
+(this:)273 816 y Fd(with)j(the)f(Invariant)e(Sections)h(being)g
+Fc(list)h(their)g(titles)p Fd(,)f(with)273 860 y(the)i(Front-Cov)o(er)d
+(Texts)i(being)g Fc(list)p Fd(,)f(and)i(with)f(the)g(Back-Cover)e
+(Texts)273 903 y(being)i Fc(list)p Fd(.)137 964 y Fr(If)g(y)o(ou)f(ha)o
+(v)o(e)h(In)o(v)m(arian)o(t)g(Sections)g(without)g(Co)o(v)o(er)e(T)l
+(exts,)i(or)f(some)g(other)g(com)o(bination)i(of)e(the)75
+1019 y(three,)e(merge)g(those)g(t)o(w)o(o)f(alternativ)o(es)h(to)g
+(suit)g(the)g(situation.)137 1086 y(If)d(y)o(our)g(do)q(cumen)o(t)g
+(con)o(tains)g(non)o(trivial)h(examples)g(of)e(program)g(co)q(de,)i(w)o
+(e)f(recommend)g(releasing)75 1141 y(these)22 b(examples)g(in)g
+(parallel)i(under)e(y)o(our)f(c)o(hoice)h(of)f(free)h(soft)o(w)o(are)e
+(license,)k(suc)o(h)e(as)g(the)f(GNU)75 1196 y(General)16
+b(Public)h(License,)f(to)f(p)q(ermit)h(their)f(use)h(in)g(free)f(soft)o
+(w)o(are.)p eop
+%%Page: 20 24
+20 23 bop 75 -58 a Fr(20)1324 b(GNU)15 b(History)g(Library)p
+eop
+%%Page: 21 25
+21 24 bop 75 -58 a Fr(App)q(endix)17 b(B:)e(Concept)h(Index)1197
+b(21)75 149 y Fn(App)r(endix)25 b(B)f(Concept)j(Index)75
+319 y Fp(A)75 398 y Fb(anc)o(hored)14 b(searc)o(h)s Fa(.)8
+b(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)16
+b Fb(8)75 569 y Fp(E)75 648 y Fb(ev)o(en)o(t)d(designators)g
+Fa(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b
+Fb(1)1012 319 y Fp(F)1012 377 y Fb(FDL,)13 b(GNU)g(F)m(ree)g(Do)q
+(cumen)o(tation)i(License)6 b Fa(.)h(.)f(.)g(.)h(.)f(.)g(.)19
+b Fb(13)1012 502 y Fp(H)1012 561 y Fb(history)c(ev)o(en)o(ts)d
+Fa(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)24
+b Fb(1)1012 604 y(history)15 b(expansion)8 b Fa(.)g(.)e(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)21 b Fb(1)1012 648 y(History)14 b(Searc)o(hing)6
+b Fa(.)j(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19 b
+Fb(8)p eop
+%%Page: 22 26
+22 25 bop 75 -58 a Fr(22)1324 b(GNU)15 b(History)g(Library)p
+eop
+%%Page: 23 27
+23 26 bop 75 -58 a Fr(App)q(endix)17 b(C:)e(F)l(unction)h(and)f(V)l
+(ariable)i(Index)918 b(23)75 149 y Fn(App)r(endix)25
+b(C)e(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26 b(Index)75
+319 y Fp(A)75 377 y Fd(add_histor)o(y)8 b Fa(.)e(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Fb(6)75 421 y
+Fd(add_histor)o(y_)o(tim)o(e)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)20 b Fb(6)75 465 y Fd(append_his)o(to)o(ry)8 b Fa(.)s(.)f(.)f(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 b Fb(9)75 591 y Fp(C)75
+649 y Fd(clear_hist)o(or)o(y)6 b Fa(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)22 b Fb(7)75 693 y Fd(current_hi)o(st)o(ory)7
+b Fa(.)s(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)20 b
+Fb(7)75 819 y Fp(F)75 878 y Fd(free_histo)o(ry)o(_en)o(tr)o(y)6
+b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Fb(6)75 1004
+y Fp(G)75 1062 y Fd(get_histor)o(y_)o(eve)o(nt)5 b Fa(.)t(.)h(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)19 b Fb(9)75 1189 y Fp(H)75 1247
+y Fd(history_ar)o(g_)o(ext)o(ra)o(ct)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17
+b Fb(10)75 1291 y Fd(history_ba)o(se)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)22 b Fb(10)75 1334 y Fd(history_co)o(mm)o(ent)o
+(_c)o(har)s Fa(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(10)75 1378
+y Fd(history_ex)o(pa)o(nd)8 b Fa(.)s(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)21 b Fb(9)75 1422 y Fd(history_ex)o(pa)o(nsi)o(on)o(_ch)o
+(ar)8 b Fa(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)24 b Fb(10)75 1465 y Fd(history_ge)o(t)8
+b Fa(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)23
+b Fb(7)75 1509 y Fd(history_ge)o(t_)o(his)o(to)o(ry_)o(sta)o(te)6
+b Fa(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)22 b Fb(6)75 1553 y Fd(history_ge)o(t_)o(tim)o(e)7
+b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)20 b Fb(7)75
+1597 y Fd(history_in)o(hi)o(bit)o(_e)o(xpa)o(nsi)o(on)o(_fu)o(nc)o(tio)
+o(n)9 b Fa(.)d(.)g(.)g(.)g(.)g(.)h(.)24 b Fb(11)75 1640
+y Fd(history_is)o(_s)o(tif)o(le)o(d)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)18 b Fb(7)75 1684 y Fd(history_le)o(ng)o(th)8 b Fa(.)s(.)e(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(10)75 1728 y Fd(history_li)o(st)6
+b Fa(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23
+b Fb(7)75 1771 y Fd(history_ma)o(x_)o(ent)o(ri)o(es)t
+Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(10)75 1815 y Fd(history_no)o(_e)o
+(xpa)o(nd)o(_ch)o(ars)7 b Fa(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Fb(11)75 1859 y
+Fd(history_qu)o(ot)o(es_)o(in)o(hib)o(it_)o(ex)o(pan)o(si)o(on)t
+Fa(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17 b Fb(11)75
+1902 y Fd(history_se)o(ar)o(ch)8 b Fa(.)s(.)f(.)f(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)21 b Fb(8)75 1946 y Fd(history_se)o(ar)o(ch_)o(de)o
+(lim)o(ite)o(r_)o(cha)o(rs)5 b Fa(.)s(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)18 b Fb(10)75 1990 y Fd(history_se)o(ar)o(ch_)o(po)o(s)6
+b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)18 b Fb(8)1012 319
+y Fd(history_sea)o(rc)o(h_p)o(re)o(fix)s Fa(.)s(.)6 b(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)17
+b Fb(8)1012 363 y Fd(history_set)o(_h)o(ist)o(or)o(y_s)o(ta)o(te)6
+b Fa(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)23 b Fb(6)1012 406 y Fd(history_set)o(_p)o(os)7 b
+Fa(.)t(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 b Fb(8)1012
+450 y Fd(history_sub)o(st)o(_ch)o(ar)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+19 b Fb(10)1012 494 y Fd(history_tok)o(en)o(ize)6 b Fa(.)s(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)20 b Fb(10)1012 537 y Fd(history_tot)o(al)o(_by)o
+(te)o(s)5 b Fa(.)s(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 b Fb(7)1012
+581 y Fd(history_tru)o(nc)o(ate)o(_f)o(ile)s Fa(.)s(.)6
+b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)17 b Fb(9)1012 624 y Fd(history_wor)o(d_)o(del)o(im)o
+(ite)o(rs)7 b Fa(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)24 b Fb(10)1012 668 y Fd(history_wri)o(te)o(_ti)o
+(me)o(sta)o(mp)o(s)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Fb(10)1012 794 y Fp(N)1012
+852 y Fd(next_histor)o(y)7 b Fa(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)23 b Fb(8)1012 978 y Fp(P)1012 1036 y
+Fd(previous_hi)o(st)o(ory)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)20 b Fb(8)1012 1162 y Fp(R)1012 1220 y Fd(read_histor)o(y)7
+b Fa(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)23
+b Fb(9)1012 1264 y Fd(read_histor)o(y_)o(ran)o(ge)5 b
+Fa(.)s(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)19 b Fb(9)1012 1307
+y Fd(remove_hist)o(or)o(y)9 b Fa(.)s(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)22 b Fb(6)1012 1351 y Fd(replace_his)o(to)o(ry_)o(en)o(try)s
+Fa(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)17 b Fb(7)1012 1477 y Fp(S)1012
+1535 y Fd(stifle_hist)o(or)o(y)9 b Fa(.)s(.)d(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)22 b Fb(7)1012 1661 y Fp(U)1012 1719
+y Fd(unstifle_hi)o(st)o(ory)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)20 b Fb(7)1012 1762 y Fd(using_histo)o(ry)6 b Fa(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)22 b Fb(6)1012 1888
+y Fp(W)1012 1946 y Fd(where_histo)o(ry)6 b Fa(.)g(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)22 b Fb(7)1012 1990 y Fd(write_histo)o(ry)6
+b Fa(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)22
+b Fb(9)p eop
+%%Page: 24 28
+24 27 bop 75 -58 a Fr(24)1324 b(GNU)15 b(History)g(Library)p
+eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/lib/readline/doc/history.toc b/lib/readline/doc/history.toc
new file mode 100644 (file)
index 0000000..c87b11d
--- /dev/null
@@ -0,0 +1,23 @@
+\chapentry{Using History Interactively}{1}{1}
+\secentry{History Expansion}{1}{1}{1}
+\subsecentry{Event Designators}{1}{1}{1}{1}
+\subsecentry{Word Designators}{1}{1}{2}{1}
+\subsecentry{Modifiers}{1}{1}{3}{2}
+\chapentry{Programming with GNU History}{2}{5}
+\secentry{Introduction to History}{2}{1}{5}
+\secentry{History Storage}{2}{2}{5}
+\secentry{History Functions}{2}{3}{6}
+\subsecentry{Initializing History and State Management}{2}{3}{1}{6}
+\subsecentry{History List Management}{2}{3}{2}{6}
+\subsecentry{Information About the History List}{2}{3}{3}{7}
+\subsecentry{Moving Around the History List}{2}{3}{4}{7}
+\subsecentry{Searching the History List}{2}{3}{5}{8}
+\subsecentry{Managing the History File}{2}{3}{6}{8}
+\subsecentry{History Expansion}{2}{3}{7}{9}
+\secentry{History Variables}{2}{4}{10}
+\secentry{History Programming Example}{2}{5}{11}
+\appendixentry{Copying This Manual}{A}{13}
+\secentry{GNU Free Documentation License}{A}{1}{13}
+\subsecentry{ADDENDUM: How to use this License for your documents}{A}{1}{1}{19}
+\appendixentry{Concept Index}{B}{21}
+\appendixentry{Function and Variable Index}{C}{23}
diff --git a/lib/readline/doc/history.tp b/lib/readline/doc/history.tp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/history.vr b/lib/readline/doc/history.vr
new file mode 100644 (file)
index 0000000..bafc1d5
--- /dev/null
@@ -0,0 +1,45 @@
+\entry{using_history}{6}{\code {using_history}}
+\entry{history_get_history_state}{6}{\code {history_get_history_state}}
+\entry{history_set_history_state}{6}{\code {history_set_history_state}}
+\entry{add_history}{6}{\code {add_history}}
+\entry{add_history_time}{6}{\code {add_history_time}}
+\entry{remove_history}{6}{\code {remove_history}}
+\entry{free_history_entry}{6}{\code {free_history_entry}}
+\entry{replace_history_entry}{7}{\code {replace_history_entry}}
+\entry{clear_history}{7}{\code {clear_history}}
+\entry{stifle_history}{7}{\code {stifle_history}}
+\entry{unstifle_history}{7}{\code {unstifle_history}}
+\entry{history_is_stifled}{7}{\code {history_is_stifled}}
+\entry{history_list}{7}{\code {history_list}}
+\entry{where_history}{7}{\code {where_history}}
+\entry{current_history}{7}{\code {current_history}}
+\entry{history_get}{7}{\code {history_get}}
+\entry{history_get_time}{7}{\code {history_get_time}}
+\entry{history_total_bytes}{7}{\code {history_total_bytes}}
+\entry{history_set_pos}{8}{\code {history_set_pos}}
+\entry{previous_history}{8}{\code {previous_history}}
+\entry{next_history}{8}{\code {next_history}}
+\entry{history_search}{8}{\code {history_search}}
+\entry{history_search_prefix}{8}{\code {history_search_prefix}}
+\entry{history_search_pos}{8}{\code {history_search_pos}}
+\entry{read_history}{9}{\code {read_history}}
+\entry{read_history_range}{9}{\code {read_history_range}}
+\entry{write_history}{9}{\code {write_history}}
+\entry{append_history}{9}{\code {append_history}}
+\entry{history_truncate_file}{9}{\code {history_truncate_file}}
+\entry{history_expand}{9}{\code {history_expand}}
+\entry{get_history_event}{9}{\code {get_history_event}}
+\entry{history_tokenize}{10}{\code {history_tokenize}}
+\entry{history_arg_extract}{10}{\code {history_arg_extract}}
+\entry{history_base}{10}{\code {history_base}}
+\entry{history_length}{10}{\code {history_length}}
+\entry{history_max_entries}{10}{\code {history_max_entries}}
+\entry{history_write_timestamps}{10}{\code {history_write_timestamps}}
+\entry{history_expansion_char}{10}{\code {history_expansion_char}}
+\entry{history_subst_char}{10}{\code {history_subst_char}}
+\entry{history_comment_char}{10}{\code {history_comment_char}}
+\entry{history_word_delimiters}{10}{\code {history_word_delimiters}}
+\entry{history_search_delimiter_chars}{10}{\code {history_search_delimiter_chars}}
+\entry{history_no_expand_chars}{11}{\code {history_no_expand_chars}}
+\entry{history_quotes_inhibit_expansion}{11}{\code {history_quotes_inhibit_expansion}}
+\entry{history_inhibit_expansion_function}{11}{\code {history_inhibit_expansion_function}}
diff --git a/lib/readline/doc/history.vrs b/lib/readline/doc/history.vrs
new file mode 100644 (file)
index 0000000..9fa28d0
--- /dev/null
@@ -0,0 +1,56 @@
+\initial {A}
+\entry {\code {add_history}}{6}
+\entry {\code {add_history_time}}{6}
+\entry {\code {append_history}}{9}
+\initial {C}
+\entry {\code {clear_history}}{7}
+\entry {\code {current_history}}{7}
+\initial {F}
+\entry {\code {free_history_entry}}{6}
+\initial {G}
+\entry {\code {get_history_event}}{9}
+\initial {H}
+\entry {\code {history_arg_extract}}{10}
+\entry {\code {history_base}}{10}
+\entry {\code {history_comment_char}}{10}
+\entry {\code {history_expand}}{9}
+\entry {\code {history_expansion_char}}{10}
+\entry {\code {history_get}}{7}
+\entry {\code {history_get_history_state}}{6}
+\entry {\code {history_get_time}}{7}
+\entry {\code {history_inhibit_expansion_function}}{11}
+\entry {\code {history_is_stifled}}{7}
+\entry {\code {history_length}}{10}
+\entry {\code {history_list}}{7}
+\entry {\code {history_max_entries}}{10}
+\entry {\code {history_no_expand_chars}}{11}
+\entry {\code {history_quotes_inhibit_expansion}}{11}
+\entry {\code {history_search}}{8}
+\entry {\code {history_search_delimiter_chars}}{10}
+\entry {\code {history_search_pos}}{8}
+\entry {\code {history_search_prefix}}{8}
+\entry {\code {history_set_history_state}}{6}
+\entry {\code {history_set_pos}}{8}
+\entry {\code {history_subst_char}}{10}
+\entry {\code {history_tokenize}}{10}
+\entry {\code {history_total_bytes}}{7}
+\entry {\code {history_truncate_file}}{9}
+\entry {\code {history_word_delimiters}}{10}
+\entry {\code {history_write_timestamps}}{10}
+\initial {N}
+\entry {\code {next_history}}{8}
+\initial {P}
+\entry {\code {previous_history}}{8}
+\initial {R}
+\entry {\code {read_history}}{9}
+\entry {\code {read_history_range}}{9}
+\entry {\code {remove_history}}{6}
+\entry {\code {replace_history_entry}}{7}
+\initial {S}
+\entry {\code {stifle_history}}{7}
+\initial {U}
+\entry {\code {unstifle_history}}{7}
+\entry {\code {using_history}}{6}
+\initial {W}
+\entry {\code {where_history}}{7}
+\entry {\code {write_history}}{9}
diff --git a/lib/readline/doc/readline.3 b/lib/readline/doc/readline.3
new file mode 100644 (file)
index 0000000..6f0847a
--- /dev/null
@@ -0,0 +1,1282 @@
+.\"
+.\" MAN PAGE COMMENTS to
+.\"
+.\"    Chet Ramey
+.\"    Information Network Services
+.\"    Case Western Reserve University
+.\"    chet@ins.CWRU.Edu
+.\"
+.\"    Last Change: Mon Jun  9 17:37:22 EDT 2003
+.\"
+.TH READLINE 3 "2003 December 9" "GNU Readline 5.0"
+.\"
+.\" File Name macro.  This used to be `.PN', for Path Name,
+.\" but Sun doesn't seem to like that very much.
+.\"
+.de FN
+\fI\|\\$1\|\fP
+..
+.SH NAME
+readline \- get a line from a user with editing
+.SH SYNOPSIS
+.LP
+.nf
+.ft B
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+.ft
+.fi
+.LP
+.nf
+\fIchar *\fP
+.br
+\fBreadline\fP (\fIconst char *prompt\fP);
+.fi
+.SH COPYRIGHT
+.if n Readline is Copyright (C) 1989\-2002 by the Free Software Foundation, Inc.
+.if t Readline is Copyright \(co 1989\-2002 by the Free Software Foundation, Inc.
+.SH DESCRIPTION
+.LP
+.B readline
+will read a line from the terminal
+and return it, using
+.B prompt
+as a prompt.  If 
+.B prompt
+is \fBNULL\fP or the empty string, no prompt is issued.
+The line returned is allocated with
+.IR malloc (3);
+the caller must free it when finished.  The line returned
+has the final newline removed, so only the text of the line
+remains.
+.LP
+.B readline
+offers editing capabilities while the user is entering the
+line.
+By default, the line editing commands
+are similar to those of emacs.
+A vi\-style line editing interface is also available.
+.LP
+This manual page describes only the most basic use of \fBreadline\fP.
+Much more functionality is available; see
+\fIThe GNU Readline Library\fP and \fIThe GNU History Library\fP
+for additional information.
+.SH RETURN VALUE
+.LP
+.B readline
+returns the text of the line read.  A blank line
+returns the empty string.  If
+.B EOF
+is encountered while reading a line, and the line is empty,
+.B NULL
+is returned.  If an
+.B EOF
+is read with a non\-empty line, it is
+treated as a newline.
+.SH NOTATION
+.LP
+An emacs-style notation is used to denote
+keystrokes.  Control keys are denoted by C\-\fIkey\fR, e.g., C\-n
+means Control\-N.  Similarly, 
+.I meta
+keys are denoted by M\-\fIkey\fR, so M\-x means Meta\-X.  (On keyboards
+without a 
+.I meta
+key, M\-\fIx\fP means ESC \fIx\fP, i.e., press the Escape key
+then the
+.I x
+key.  This makes ESC the \fImeta prefix\fP.
+The combination M\-C\-\fIx\fP means ESC\-Control\-\fIx\fP,
+or press the Escape key
+then hold the Control key while pressing the
+.I x
+key.)
+.PP
+Readline commands may be given numeric
+.IR arguments ,
+which normally act as a repeat count.  Sometimes, however, it is the
+sign of the argument that is significant.  Passing a negative argument
+to a command that acts in the forward direction (e.g., \fBkill\-line\fP)
+causes that command to act in a backward direction.  Commands whose
+behavior with arguments deviates from this are noted.
+.PP
+When a command is described as \fIkilling\fP text, the text
+deleted is saved for possible future retrieval
+(\fIyanking\fP).  The killed text is saved in a
+\fIkill ring\fP.  Consecutive kills cause the text to be
+accumulated into one unit, which can be yanked all at once. 
+Commands which do not kill text separate the chunks of text
+on the kill ring.
+.SH INITIALIZATION FILE
+.LP
+Readline is customized by putting commands in an initialization
+file (the \fIinputrc\fP file).
+The name of this file is taken from the value of the
+.B INPUTRC
+environment variable.  If that variable is unset, the default is
+.IR ~/.inputrc .
+When a program which uses the readline library starts up, the
+init file is read, and the key bindings and variables are set.
+There are only a few basic constructs allowed in the
+readline init file.  Blank lines are ignored.
+Lines beginning with a \fB#\fP are comments.
+Lines beginning with a \fB$\fP indicate conditional constructs.
+Other lines denote key bindings and variable settings.
+Each program using this library may add its own commands
+and bindings.
+.PP
+For example, placing
+.RS
+.PP
+M\-Control\-u: universal\-argument
+.RE
+or
+.RS
+C\-Meta\-u: universal\-argument
+.RE
+.sp
+into the 
+.I inputrc
+would make M\-C\-u execute the readline command
+.IR universal\-argument .
+.PP
+The following symbolic character names are recognized while
+processing key bindings:
+.IR DEL ,
+.IR ESC ,
+.IR ESCAPE ,
+.IR LFD ,
+.IR NEWLINE ,
+.IR RET ,
+.IR RETURN ,
+.IR RUBOUT ,
+.IR SPACE ,
+.IR SPC ,
+and
+.IR TAB .
+.PP
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a \fImacro\fP).
+.PP
+.SS Key Bindings
+.PP
+The syntax for controlling key bindings in the
+.I inputrc
+file is simple.  All that is required is the name of the
+command or the text of a macro and a key sequence to which
+it should be bound. The name may be specified in one of two ways:
+as a symbolic key name, possibly with \fIMeta\-\fP or \fIControl\-\fP
+prefixes, or as a key sequence.
+.PP
+When using the form \fBkeyname\fP:\^\fIfunction-name\fP or \fImacro\fP,
+.I keyname
+is the name of a key spelled out in English.  For example:
+.sp
+.RS
+Control\-u: universal\-argument
+.br
+Meta\-Rubout: backward\-kill\-word
+.br
+Control\-o: "> output"
+.RE
+.LP
+In the above example,
+.I C\-u
+is bound to the function
+.BR universal\-argument ,
+.I M-DEL
+is bound to the function
+.BR backward\-kill\-word ,
+and
+.I C\-o
+is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+.if t \f(CW> output\fP
+.if n ``> output''
+into the line).
+.PP
+In the second form, \fB"keyseq"\fP:\^\fIfunction\-name\fP or \fImacro\fP,
+.B keyseq
+differs from
+.B keyname
+above in that strings denoting
+an entire key sequence may be specified by placing the sequence
+within double quotes.  Some GNU Emacs style key escapes can be
+used, as in the following example, but the symbolic character names
+are not recognized.
+.sp
+.RS
+"\eC\-u": universal\-argument
+.br
+"\eC\-x\eC\-r": re\-read\-init\-file
+.br
+"\ee[11~": "Function Key 1"
+.RE
+.PP
+In this example,
+.I C-u
+is again bound to the function
+.BR universal\-argument .
+.I "C-x C-r"
+is bound to the function
+.BR re\-read\-init\-file ,
+and 
+.I "ESC [ 1 1 ~"
+is bound to insert the text
+.if t \f(CWFunction Key 1\fP.
+.if n ``Function Key 1''.
+.PP
+The full set of GNU Emacs style escape sequences available when specifying
+key sequences is
+.RS
+.PD 0
+.TP
+.B \eC\-
+control prefix
+.TP
+.B \eM\-
+meta prefix
+.TP
+.B \ee
+an escape character
+.TP
+.B \e\e
+backslash
+.TP
+.B \e"
+literal ", a double quote
+.TP
+.B \e'
+literal ', a single quote
+.RE
+.PD
+.PP
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+.RS
+.PD 0
+.TP
+.B \ea
+alert (bell)
+.TP
+.B \eb
+backspace
+.TP
+.B \ed
+delete
+.TP
+.B \ef
+form feed
+.TP
+.B \en
+newline
+.TP
+.B \er
+carriage return
+.TP
+.B \et
+horizontal tab
+.TP
+.B \ev
+vertical tab
+.TP
+.B \e\fInnn\fP
+the eight-bit character whose value is the octal value \fInnn\fP
+(one to three digits)
+.TP
+.B \ex\fIHH\fP
+the eight-bit character whose value is the hexadecimal value \fIHH\fP
+(one or two hex digits)
+.RE
+.PD
+.PP
+When entering the text of a macro, single or double quotes should
+be used to indicate a macro definition.  Unquoted text
+is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including " and '.
+.PP
+.B Bash
+allows the current readline key bindings to be displayed or modified
+with the
+.B bind
+builtin command.  The editing mode may be switched during interactive
+use by using the
+.B \-o
+option to the
+.B set
+builtin command.  Other programs using this library provide
+similar mechanisms.  The
+.I inputrc
+file may be edited and re-read if a program does not provide
+any other means to incorporate new bindings.
+.SS Variables
+.PP
+Readline has variables that can be used to further customize its
+behavior.  A variable may be set in the
+.I inputrc
+file with a statement of the form
+.RS
+.PP
+\fBset\fP \fIvariable\-name\fP \fIvalue\fP
+.RE
+.PP
+Except where noted, readline variables can take the values
+.B On
+or
+.B Off
+(without regard to case).
+The variables and their default values are:
+.PP
+.PD 0
+.TP
+.B bell\-style (audible)
+Controls what happens when readline wants to ring the terminal bell.
+If set to \fBnone\fP, readline never rings the bell.  If set to
+\fBvisible\fP, readline uses a visible bell if one is available.
+If set to \fBaudible\fP, readline attempts to ring the terminal's bell.
+.TP
+.B comment\-begin (``#'')
+The string that is inserted in \fBvi\fP mode when the
+.B insert\-comment
+command is executed.
+This command is bound to
+.B M\-#
+in emacs mode and to
+.B #
+in vi command mode.
+.TP 
+.B completion\-ignore\-case (Off)
+If set to \fBOn\fP, readline performs filename matching and completion
+in a case\-insensitive fashion.
+.TP
+.B completion\-query\-items (100)
+This determines when the user is queried about viewing
+the number of possible completions
+generated by the \fBpossible\-completions\fP command.
+It may be set to any integer value greater than or equal to
+zero.  If the number of possible completions is greater than
+or equal to the value of this variable, the user is asked whether
+or not he wishes to view them; otherwise they are simply listed
+on the terminal.
+.TP
+.B convert\-meta (On)
+If set to \fBOn\fP, readline will convert characters with the
+eighth bit set to an ASCII key sequence
+by stripping the eighth bit and prefixing it with an
+escape character (in effect, using escape as the \fImeta prefix\fP).
+.TP
+.B disable\-completion (Off)
+If set to \fBOn\fP, readline will inhibit word completion.  Completion 
+characters will be inserted into the line as if they had been
+mapped to \fBself-insert\fP.
+.TP
+.B editing\-mode (emacs)
+Controls whether readline begins with a set of key bindings similar
+to emacs or vi.
+.B editing\-mode
+can be set to either
+.B emacs
+or
+.BR vi .
+.TP
+.B enable\-keypad (Off)
+When set to \fBOn\fP, readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.
+.TP
+.B expand\-tilde (Off)
+If set to \fBon\fP, tilde expansion is performed when readline
+attempts word completion.
+.TP
+.B history-preserve-point     
+If set to \fBon\fP, the history code attempts to place point at the 
+same location on each history line retrived with \fBprevious-history\fP 
+or \fBnext-history\fP.
+.TP
+.B horizontal\-scroll\-mode (Off)
+When set to \fBOn\fP, makes readline use a single line for display,
+scrolling the input horizontally on a single screen line when it
+becomes longer than the screen width rather than wrapping to a new line.
+.TP
+.B input\-meta (Off)
+If set to \fBOn\fP, readline will enable eight-bit input (that is,
+it will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support.  The name
+.B meta\-flag
+is a synonym for this variable.
+.TP
+.B isearch\-terminators (``C\-[ C\-J'')
+The string of characters that should terminate an incremental
+search without subsequently executing the character as a command.
+If this variable has not been given a value, the characters
+\fIESC\fP and \fIC\-J\fP will terminate an incremental search.
+.TP
+.B keymap (emacs)
+Set the current readline keymap.  The set of legal keymap names is
+\fIemacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,
+vi-command\fP, and
+.IR vi-insert .
+\fIvi\fP is equivalent to \fIvi-command\fP; \fIemacs\fP is
+equivalent to \fIemacs-standard\fP.  The default value is
+.IR emacs .
+The value of
+.B editing\-mode
+also affects the default keymap.
+.TP
+.B mark\-directories (On)
+If set to \fBOn\fP, completed directory names have a slash
+appended.
+.TP
+.B mark\-modified\-lines (Off)
+If set to \fBOn\fP, history lines that have been modified are displayed
+with a preceding asterisk (\fB*\fP).
+.TP
+.B mark\-symlinked\-directories (Off)
+If set to \fBOn\fP, completed names which are symbolic links to directories
+have a slash appended (subject to the value of
+\fBmark\-directories\fP).
+.TP
+.B match\-hidden\-files (On)
+This variable, when set to \fBOn\fP, causes readline to match files whose 
+names begin with a `.' (hidden files) when performing filename     
+completion, unless the leading `.' is     
+supplied by the user in the filename to be completed.
+.TP
+.B output\-meta (Off)
+If set to \fBOn\fP, readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.
+.TP
+.B page\-completions (On)
+If set to \fBOn\fP, readline uses an internal \fImore\fP-like pager
+to display a screenful of possible completions at a time.
+.TP
+.B print\-completions\-horizontally (Off)
+If set to \fBOn\fP, readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+.TP
+.B show\-all\-if\-ambiguous (Off)
+This alters the default behavior of the completion functions.  If
+set to
+.BR on ,
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+.TP
+.B show\-all\-if\-unmodified (Off)
+This alters the default behavior of the completion functions in
+a fashion similar to \fBshow\-all\-if\-ambiguous\fP.
+If set to
+.BR on , 
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share 
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+.TP
+.B visible\-stats (Off)
+If set to \fBOn\fP, a character denoting a file's type as reported  
+by \fIstat\fP(2) is appended to the filename when listing possible
+completions.
+.PD
+.SS Conditional Constructs
+.PP
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+.IP \fB$if\fP
+The 
+.B $if
+construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+.RS
+.IP \fBmode\fP
+The \fBmode=\fP form of the \fB$if\fP directive is used to test
+whether readline is in emacs or vi mode.
+This may be used in conjunction
+with the \fBset keymap\fP command, for instance, to set bindings in
+the \fIemacs-standard\fP and \fIemacs-ctlx\fP keymaps only if
+readline is starting out in emacs mode.
+.IP \fBterm\fP
+The \fBterm=\fP form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+.B =
+is tested against the full name of the terminal and the portion
+of the terminal name before the first \fB\-\fP.  This allows
+.I sun
+to match both
+.I sun
+and
+.IR sun\-cmd ,
+for instance.
+.IP \fBapplication\fP
+The \fBapplication\fP construct is used to include
+application-specific settings.  Each program using the readline
+library sets the \fIapplication name\fP, and an initialization
+file can test for a particular value.
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+.sp 1
+.RS
+.nf
+\fB$if\fP Bash
+# Quote the current or previous word
+"\eC-xq": "\eeb\e"\eef\e""
+\fB$endif\fP
+.fi
+.RE
+.RE
+.IP \fB$endif\fP
+This command, as seen in the previous example, terminates an
+\fB$if\fP command.
+.IP \fB$else\fP
+Commands in this branch of the \fB$if\fP directive are executed if
+the test fails.
+.IP \fB$include\fP
+This directive takes a single filename as an argument and reads commands
+and bindings from that file.  For example, the following directive
+would read \fI/etc/inputrc\fP:
+.sp 1
+.RS
+.nf
+\fB$include\fP \^ \fI/etc/inputrc\fP
+.fi 
+.RE
+.SH SEARCHING
+.PP
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes:
+.I incremental
+and
+.IR non-incremental .
+.PP
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+\fBC\-r\fP.  Typing \fBC\-s\fP searches forward through the history.
+The characters present in the value of the \fBisearch-terminators\fP
+variable are used to terminate an incremental search.
+If that variable has not been assigned a value the \fIEscape\fP and
+\fBC\-J\fP characters will terminate an incremental search.
+\fBC\-G\fP will abort an incremental search and restore the original
+line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+.PP
+To find other matching entries in the history list, type \fBC\-s\fP or
+\fBC\-r\fP as appropriate.
+This will search backward or forward in the history for the next
+line matching the search string typed so far.
+Any other key sequence bound to a readline command will terminate
+the search and execute that command.
+For instance, a newline will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+.PP
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+.SH EDITING COMMANDS
+.PP
+The following is a list of the names of the commands and the default
+key sequences to which they are bound.
+Command names without an accompanying key sequence are unbound by default.
+.PP
+In the following descriptions, \fIpoint\fP refers to the current cursor
+position, and \fImark\fP refers to a cursor position saved by the
+\fBset\-mark\fP command.
+The text between the point and mark is referred to as the \fIregion\fP.
+.SS Commands for Moving
+.PP
+.PD 0
+.TP
+.B beginning\-of\-line (C\-a)
+Move to the start of the current line.
+.TP
+.B end\-of\-line (C\-e)
+Move to the end of the line.
+.TP
+.B forward\-char (C\-f)
+Move forward a character.
+.TP
+.B backward\-char (C\-b)
+Move back a character.
+.TP
+.B forward\-word (M\-f)
+Move forward to the end of the next word.  Words are composed of
+alphanumeric characters (letters and digits).
+.TP
+.B backward\-word (M\-b)
+Move back to the start of the current or previous word.  Words are
+composed of alphanumeric characters (letters and digits).
+.TP
+.B clear\-screen (C\-l)
+Clear the screen leaving the current line at the top of the screen.
+With an argument, refresh the current line without clearing the
+screen.
+.TP
+.B redraw\-current\-line
+Refresh the current line.
+.PD
+.SS Commands for Manipulating the History
+.PP
+.PD 0
+.TP
+.B accept\-line (Newline, Return)
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+\fBadd_history()\fP.
+If the line is a modified history line, the history line is restored to its original state.
+.TP
+.B previous\-history (C\-p)
+Fetch the previous command from the history list, moving back in
+the list.
+.TP
+.B next\-history (C\-n)
+Fetch the next command from the history list, moving forward in the
+list.
+.TP
+.B beginning\-of\-history (M\-<)
+Move to the first line in the history.
+.TP
+.B end\-of\-history (M\->)
+Move to the end of the input history, i.e., the line currently being
+entered.
+.TP
+.B reverse\-search\-history (C\-r)
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+.TP
+.B forward\-search\-history (C\-s)
+Search forward starting at the current line and moving `down' through
+the history as necessary.  This is an incremental search.
+.TP
+.B non\-incremental\-reverse\-search\-history (M\-p)
+Search backward through the history starting at the current line
+using a non-incremental search for a string supplied by the user.
+.TP
+.B non\-incremental\-forward\-search\-history (M\-n)
+Search forward through the history using a non-incremental search
+for a string supplied by the user.
+.TP
+.B history\-search\-forward
+Search forward through the history for the string of characters
+between the start of the current line and the current cursor
+position (the \fIpoint\fP).
+This is a non-incremental search.
+.TP
+.B history\-search\-backward
+Search backward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+.TP
+.B yank\-nth\-arg (M\-C\-y)
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument
+.IR n ,
+insert the \fIn\fPth word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the \fIn\fPth word from the end of the previous command.
+.TP
+.B
+yank\-last\-arg (M\-.\^, M\-_\^)
+Insert the last argument to the previous command (the last word of
+the previous history entry).  With an argument,
+behave exactly like \fByank\-nth\-arg\fP.
+Successive calls to \fByank\-last\-arg\fP move back through the history
+list, inserting the last argument of each line in turn.
+.PD
+.SS Commands for Changing Text
+.PP
+.PD 0
+.TP
+.B delete\-char (C\-d)
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to \fBdelete\-char\fP, then return
+.SM
+.BR EOF .
+.TP
+.B backward\-delete\-char (Rubout)
+Delete the character behind the cursor.  When given a numeric argument,
+save the deleted text on the kill ring.
+.TP
+.B forward\-backward\-delete\-char   
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.
+.TP
+.B quoted\-insert (C\-q, C\-v)
+Add the next character that you type to the line verbatim.  This is
+how to insert characters like \fBC\-q\fP, for example.
+.TP
+.B tab\-insert (M-TAB)
+Insert a tab character.
+.TP
+.B self\-insert (a,\ b,\ A,\ 1,\ !,\ ...)
+Insert the character typed.
+.TP
+.B transpose\-chars (C\-t)
+Drag the character before point forward over the character at point,
+moving point forward as well.
+If point is at the end of the line, then this transposes
+the two characters before point.
+Negative arguments have no effect.
+.TP
+.B transpose\-words (M\-t)
+Drag the word before point past the word after point,
+moving point over that word as well.
+If point is at the end of the line, this transposes
+the last two words on the line.
+.TP
+.B upcase\-word (M\-u)
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move point.
+.TP
+.B downcase\-word (M\-l)
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move point.
+.TP
+.B capitalize\-word (M\-c)
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move point.
+.TP
+.B overwrite\-mode
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+\fBemacs\fP mode; \fBvi\fP mode does overwrite differently.
+Each call to \fIreadline()\fP starts in insert mode.
+In overwrite mode, characters bound to \fBself\-insert\fP replace   
+the text at point rather than pushing the text to the right.
+Characters bound to \fBbackward\-delete\-char\fP replace the character
+before point with a space.  By default, this command is unbound.
+.PD
+.SS Killing and Yanking
+.PP
+.PD 0
+.TP
+.B kill\-line (C\-k)
+Kill the text from point to the end of the line.
+.TP
+.B backward\-kill\-line (C\-x Rubout)
+Kill backward to the beginning of the line.
+.TP
+.B unix\-line\-discard (C\-u)
+Kill backward from point to the beginning of the line.
+The killed text is saved on the kill-ring.
+.\" There is no real difference between this and backward-kill-line
+.TP
+.B kill\-whole\-line
+Kill all characters on the current line, no matter where point is.
+.TP
+.B kill\-word  (M\-d)
+Kill from point the end of the current word, or if between
+words, to the end of the next word.  Word boundaries are the same as
+those used by \fBforward\-word\fP.
+.TP
+.B backward\-kill\-word (M\-Rubout)
+Kill the word behind point.
+Word boundaries are the same as those used by \fBbackward\-word\fP.
+.TP
+.B unix\-word\-rubout (C\-w)
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+.TP
+.B delete\-horizontal\-space (M\-\e)
+Delete all spaces and tabs around point.
+.TP
+.B kill\-region
+Kill the text between the point and \fImark\fP (saved cursor position).
+This text is referred to as the \fIregion\fP.
+.TP
+.B copy\-region\-as\-kill
+Copy the text in the region to the kill buffer.
+.TP
+.B copy\-backward\-word
+Copy the word before point to the kill buffer.
+The word boundaries are the same as \fBbackward\-word\fP.
+.TP
+.B copy\-forward\-word
+Copy the word following point to the kill buffer.
+The word boundaries are the same as \fBforward\-word\fP.
+.TP
+.B yank (C\-y)
+Yank the top of the kill ring into the buffer at point.
+.TP
+.B yank\-pop (M\-y)
+Rotate the kill ring, and yank the new top.  Only works following
+.B yank
+or
+.BR yank\-pop .
+.PD
+.SS Numeric Arguments
+.PP
+.PD 0
+.TP
+.B digit\-argument (M\-0, M\-1, ..., M\-\-)
+Add this digit to the argument already accumulating, or start a new
+argument.  M\-\- starts a negative argument.
+.TP
+.B universal\-argument
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing
+.B universal\-argument
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+.PD
+.SS Completing
+.PP
+.PD 0
+.TP
+.B complete (TAB)
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+.BR Bash ,
+for instance, attempts completion treating the text as a variable
+(if the text begins with \fB$\fP), username (if the text begins with
+\fB~\fP), hostname (if the text begins with \fB@\fP), or
+command (including aliases and functions) in turn.  If none
+of these produces a match, filename completion is attempted.
+.BR Gdb ,
+on the other hand,
+allows completion of program functions and variables, and
+only attempts filename completion under certain circumstances.
+.TP
+.B possible\-completions (M\-?)
+List the possible completions of the text before point.
+.TP
+.B insert\-completions (M\-*)
+Insert all completions of the text before point
+that would have been generated by
+\fBpossible\-completions\fP.
+.TP
+.B menu\-complete
+Similar to \fBcomplete\fP, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of \fBmenu\-complete\fP steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of \fBbell\-style\fP)
+and the original text is restored.
+An argument of \fIn\fP moves \fIn\fP positions forward in the list
+of matches; a negative argument may be used to move backward 
+through the list.
+This command is intended to be bound to \fBTAB\fP, but is unbound
+by default.
+.TP
+.B delete\-char\-or\-list
+Deletes the character under the cursor if not at the beginning or
+end of the line (like \fBdelete-char\fP).
+If at the end of the line, behaves identically to
+\fBpossible-completions\fP.
+.PD
+.SS Keyboard Macros
+.PP
+.PD 0
+.TP
+.B start\-kbd\-macro (C\-x (\^)
+Begin saving the characters typed into the current keyboard macro.
+.TP
+.B end\-kbd\-macro (C\-x )\^)
+Stop saving the characters typed into the current keyboard macro
+and store the definition.
+.TP
+.B call\-last\-kbd\-macro (C\-x e)
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+.PD
+.SS Miscellaneous
+.PP
+.PD 0
+.TP
+.B re\-read\-init\-file (C\-x C\-r)
+Read in the contents of the \fIinputrc\fP file, and incorporate
+any bindings or variable assignments found there.
+.TP
+.B abort (C\-g)
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+.BR bell\-style ).
+.TP
+.B do\-uppercase\-version (M\-a, M\-b, M\-\fIx\fP, ...)
+If the metafied character \fIx\fP is lowercase, run the command
+that is bound to the corresponding uppercase character.
+.TP
+.B prefix\-meta (ESC)
+Metafy the next character typed.
+.SM
+.B ESC
+.B f
+is equivalent to
+.BR Meta\-f .
+.TP
+.B undo (C\-_, C\-x C\-u)
+Incremental undo, separately remembered for each line.
+.TP
+.B revert\-line (M\-r)
+Undo all changes made to this line.  This is like executing the
+.B undo
+command enough times to return the line to its initial state.
+.TP
+.B tilde\-expand (M\-&)
+Perform tilde expansion on the current word.
+.TP
+.B set\-mark (C\-@, M\-<space>)
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+.TP
+.B exchange\-point\-and\-mark (C\-x C\-x)
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+.TP
+.B character\-search (C\-])
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+.TP
+.B character\-search\-backward (M\-C\-])
+A character is read and point is moved to the previous occurrence of that
+character.  A negative count searches for subsequent occurrences.
+.TP
+.B insert\-comment (M\-#)
+Without a numeric argument, the value of the readline
+.B comment\-begin
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value   
+of \fBcomment\-begin\fP, the value is inserted, otherwise             
+the characters in \fBcomment-begin\fP are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+The default value of
+.B comment\-begin
+makes the current line a shell comment.
+If a numeric argument causes the comment character to be removed, the line
+will be executed by the shell.
+.TP
+.B dump\-functions
+Print all of the functions and their key bindings to the
+readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-variables
+Print all of the settable variables and their values to the
+readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B dump\-macros
+Print all of the readline key sequences bound to macros and the
+strings they output.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an \fIinputrc\fP file.
+.TP
+.B emacs\-editing\-mode (C\-e)
+When in
+.B vi
+command mode, this causes a switch to
+.B emacs
+editing mode.
+.TP
+.B vi\-editing\-mode (M\-C\-j)
+When in
+.B emacs
+editing mode, this causes a switch to
+.B vi
+editing mode.
+.PD
+.SH DEFAULT KEY BINDINGS
+.LP
+The following is a list of the default emacs and vi bindings.
+Characters with the eighth bit set are written as M\-<character>, and
+are referred to as
+.I metafied
+characters.
+The printable ASCII characters not mentioned in the list of emacs
+standard bindings are bound to the
+.B self\-insert
+function, which just inserts the given character into the input line.
+In vi insertion mode, all characters not specifically mentioned are
+bound to
+.BR self\-insert .
+Characters assigned to signal generation by
+.IR stty (1)
+or the terminal driver, such as C-Z or C-C,
+retain that function.
+Upper and lower case metafied characters are bound to the same function in
+the emacs mode meta keymap.
+The remaining characters are unbound, which causes readline
+to ring the bell (subject to the setting of the
+.B bell\-style
+variable).
+.SS Emacs Mode
+.RS +.6i
+.nf
+.ta 2.5i
+.sp
+Emacs Standard bindings
+.sp
+"C-@"  set-mark
+"C-A"  beginning-of-line
+"C-B"  backward-char
+"C-D"  delete-char
+"C-E"  end-of-line
+"C-F"  forward-char
+"C-G"  abort
+"C-H"  backward-delete-char
+"C-I"  complete
+"C-J"  accept-line
+"C-K"  kill-line
+"C-L"  clear-screen
+"C-M"  accept-line
+"C-N"  next-history
+"C-P"  previous-history
+"C-Q"  quoted-insert
+"C-R"  reverse-search-history
+"C-S"  forward-search-history
+"C-T"  transpose-chars
+"C-U"  unix-line-discard
+"C-V"  quoted-insert
+"C-W"  unix-word-rubout
+"C-Y"  yank
+"C-]"  character-search
+"C-_"  undo
+"\^ " to "/"  self-insert
+"0"  to "9"  self-insert
+":"  to "~"  self-insert
+"C-?"  backward-delete-char
+.PP
+Emacs Meta bindings
+.sp
+"M-C-G"  abort
+"M-C-H"  backward-kill-word
+"M-C-I"  tab-insert
+"M-C-J"  vi-editing-mode
+"M-C-M"  vi-editing-mode
+"M-C-R"  revert-line
+"M-C-Y"  yank-nth-arg
+"M-C-["  complete
+"M-C-]"  character-search-backward
+"M-space"  set-mark
+"M-#"  insert-comment
+"M-&"  tilde-expand
+"M-*"  insert-completions
+"M--"  digit-argument
+"M-."  yank-last-arg
+"M-0"  digit-argument
+"M-1"  digit-argument
+"M-2"  digit-argument
+"M-3"  digit-argument
+"M-4"  digit-argument
+"M-5"  digit-argument
+"M-6"  digit-argument
+"M-7"  digit-argument
+"M-8"  digit-argument
+"M-9"  digit-argument
+"M-<"  beginning-of-history
+"M-="  possible-completions
+"M->"  end-of-history
+"M-?"  possible-completions
+"M-B"  backward-word
+"M-C"  capitalize-word
+"M-D"  kill-word
+"M-F"  forward-word
+"M-L"  downcase-word
+"M-N"  non-incremental-forward-search-history
+"M-P"  non-incremental-reverse-search-history
+"M-R"  revert-line
+"M-T"  transpose-words
+"M-U"  upcase-word
+"M-Y"  yank-pop
+"M-\e"  delete-horizontal-space
+"M-~"  tilde-expand
+"M-C-?"  backward-kill-word
+"M-_"  yank-last-arg
+.PP
+Emacs Control-X bindings
+.sp
+"C-XC-G"  abort
+"C-XC-R"  re-read-init-file
+"C-XC-U"  undo
+"C-XC-X"  exchange-point-and-mark
+"C-X("  start-kbd-macro
+"C-X)"  end-kbd-macro
+"C-XE"  call-last-kbd-macro
+"C-XC-?"  backward-kill-line
+.sp
+.RE
+.SS VI Mode bindings
+.RS +.6i
+.nf
+.ta 2.5i
+.sp
+.PP
+VI Insert Mode functions
+.sp
+"C-D"  vi-eof-maybe
+"C-H"  backward-delete-char
+"C-I"  complete
+"C-J"  accept-line
+"C-M"  accept-line
+"C-R"  reverse-search-history
+"C-S"  forward-search-history
+"C-T"  transpose-chars
+"C-U"  unix-line-discard
+"C-V"  quoted-insert
+"C-W"  unix-word-rubout
+"C-Y"  yank
+"C-["  vi-movement-mode
+"C-_"  undo
+"\^ " to "~"  self-insert
+"C-?"  backward-delete-char
+.PP
+VI Command Mode functions
+.sp
+"C-D"  vi-eof-maybe
+"C-E"  emacs-editing-mode
+"C-G"  abort
+"C-H"  backward-char
+"C-J"  accept-line
+"C-K"  kill-line
+"C-L"  clear-screen
+"C-M"  accept-line
+"C-N"  next-history
+"C-P"  previous-history
+"C-Q"  quoted-insert
+"C-R"  reverse-search-history
+"C-S"  forward-search-history
+"C-T"  transpose-chars
+"C-U"  unix-line-discard
+"C-V"  quoted-insert
+"C-W"  unix-word-rubout
+"C-Y"  yank
+"C-_"  vi-undo
+"\^ "  forward-char
+"#"  insert-comment
+"$"  end-of-line
+"%"  vi-match
+"&"  vi-tilde-expand
+"*"  vi-complete
+"+"  next-history
+","  vi-char-search
+"-"  previous-history
+"."  vi-redo
+"/"  vi-search
+"0"  beginning-of-line
+"1" to "9"  vi-arg-digit
+";"  vi-char-search
+"="  vi-complete
+"?"  vi-search
+"A"  vi-append-eol
+"B"  vi-prev-word
+"C"  vi-change-to
+"D"  vi-delete-to
+"E"  vi-end-word
+"F"  vi-char-search
+"G"  vi-fetch-history
+"I"  vi-insert-beg
+"N"  vi-search-again
+"P"  vi-put
+"R"  vi-replace
+"S"  vi-subst
+"T"  vi-char-search
+"U"  revert-line
+"W"  vi-next-word
+"X"  backward-delete-char
+"Y"  vi-yank-to
+"\e"  vi-complete
+"^"  vi-first-print
+"_"  vi-yank-arg
+"`"  vi-goto-mark
+"a"  vi-append-mode
+"b"  vi-prev-word
+"c"  vi-change-to
+"d"  vi-delete-to
+"e"  vi-end-word
+"f"  vi-char-search
+"h"  backward-char
+"i"  vi-insertion-mode
+"j"  next-history
+"k"  prev-history
+"l"  forward-char
+"m"  vi-set-mark
+"n"  vi-search-again
+"p"  vi-put
+"r"  vi-change-char
+"s"  vi-subst
+"t"  vi-char-search
+"u"  vi-undo
+"w"  vi-next-word
+"x"  vi-delete
+"y"  vi-yank-to
+"|"  vi-column
+"~"  vi-change-case
+.RE
+.SH "SEE ALSO"
+.PD 0
+.TP
+\fIThe Gnu Readline Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIThe Gnu History Library\fP, Brian Fox and Chet Ramey
+.TP
+\fIbash\fP(1)
+.PD
+.SH FILES
+.PD 0
+.TP
+.FN ~/.inputrc
+Individual \fBreadline\fP initialization file
+.PD
+.SH AUTHORS
+Brian Fox, Free Software Foundation
+.br
+bfox@gnu.org
+.PP
+Chet Ramey, Case Western Reserve University
+.br
+chet@ins.CWRU.Edu
+.SH BUG REPORTS
+If you find a bug in
+.B readline,
+you should report it.  But first, you should
+make sure that it really is a bug, and that it appears in the latest
+version of the
+.B readline
+library that you have.
+.PP
+Once you have determined that a bug actually exists, mail a
+bug report to \fIbug\-readline\fP@\fIgnu.org\fP.
+If you have a fix, you are welcome to mail that
+as well!  Suggestions and `philosophical' bug reports may be mailed
+to \fPbug-readline\fP@\fIgnu.org\fP or posted to the Usenet
+newsgroup
+.BR gnu.bash.bug .
+.PP
+Comments and bug reports concerning
+this manual page should be directed to
+.IR chet@ins.CWRU.Edu .
+.SH BUGS
+.PP
+It's too big and too slow.
diff --git a/lib/readline/doc/readline.dvi b/lib/readline/doc/readline.dvi
new file mode 100644 (file)
index 0000000..4b8e4f5
Binary files /dev/null and b/lib/readline/doc/readline.dvi differ
diff --git a/lib/readline/doc/readline.html b/lib/readline/doc/readline.html
new file mode 100644 (file)
index 0000000..1b96d95
--- /dev/null
@@ -0,0 +1,6595 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on September, 22  2003 by texi2html 1.64 -->
+<!-- 
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+-->
+<HEAD>
+<TITLE>GNU Readline Library: </TITLE>
+
+<META NAME="description" CONTENT="GNU Readline Library: ">
+<META NAME="keywords" CONTENT="GNU Readline Library: ">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_Top"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>GNU Readline Library</H1></P><P>
+
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs which
+provide a command line interface.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC1">1. Command Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU Readline User's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC23">2. Programming with GNU Readline</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU Readline Programmer's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC49">A. Copying This Manual</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Copying this manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC52">Concept Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of concepts described in this manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC53">Function and Variable Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Index of externally visible functions
+                                  and variables.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<HR SIZE=1>
+<A NAME="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<A NAME="Command Line Editing"></A>
+<H1> 1. Command Line Editing </H1>
+<!--docid::SEC1::-->
+<P>
+
+This chapter describes the basic features of the GNU
+command line editing interface.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC2">1.1 Introduction to Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Notation used in this text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC3">1.2 Readline Interaction</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The minimum set of commands for editing a line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC9">1.3 Readline Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Customizing Readline from a user's view.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC13">1.4 Bindable Readline Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A description of most of the Readline commands
+                               available for binding</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC22">1.5 Readline vi Mode</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A short description of how to make Readline
+                               behave like the vi editor.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Introduction and Notation"></A>
+<HR SIZE="6">
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.1 Introduction to Line Editing </H2>
+<!--docid::SEC2::-->
+<P>
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+</P><P>
+
+The text <KBD>C-k</KBD> is read as `Control-K' and describes the character
+produced when the <KBD>k</KBD> key is pressed while the Control key
+is depressed.
+</P><P>
+
+The text <KBD>M-k</KBD> is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <KBD>k</KBD>
+key is pressed.
+The Meta key is labeled <KBD>ALT</KBD> on many keyboards.
+On keyboards with two keys labeled <KBD>ALT</KBD> (usually to either side of
+the space bar), the <KBD>ALT</KBD> on the left side is generally set to
+work as a Meta key.
+The <KBD>ALT</KBD> key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+</P><P>
+
+If you do not have a Meta or <KBD>ALT</KBD> key, or another key working as
+a Meta key, the identical keystroke can be generated by typing <KBD>ESC</KBD>
+<EM>first</EM>, and then typing <KBD>k</KBD>.
+Either process is known as <EM>metafying</EM> the <KBD>k</KBD> key.
+</P><P>
+
+The text <KBD>M-C-k</KBD> is read as `Meta-Control-k' and describes the
+character produced by <EM>metafying</EM> <KBD>C-k</KBD>.
+</P><P>
+
+In addition, several keys have their own names.  Specifically,
+<KBD>DEL</KBD>, <KBD>ESC</KBD>, <KBD>LFD</KBD>, <KBD>SPC</KBD>, <KBD>RET</KBD>, and <KBD>TAB</KBD> all
+stand for themselves when seen in this text, or in an init file
+(see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+If your keyboard lacks a <KBD>LFD</KBD> key, typing <KBD>C-j</KBD> will
+produce the desired character.
+The <KBD>RET</KBD> key may be labeled <KBD>Return</KBD> or <KBD>Enter</KBD> on
+some keyboards.
+</P><P>
+
+<A NAME="Readline Interaction"></A>
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.2 Readline Interaction </H2>
+<!--docid::SEC3::-->
+<P>
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <KBD>RET</KBD>.  You do not have to be at the
+end of the line to press <KBD>RET</KBD>; the entire line is accepted
+regardless of the location of the cursor within the line.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC4">1.2.1 Readline Bare Essentials</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The least you need to know about Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC5">1.2.2 Readline Movement Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the input line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC6">1.2.3 Readline Killing Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to delete text, and how to get it back!</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC7">1.2.4 Readline Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Giving numeric arguments to commands.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC8">1.2.5 Searching for Commands in the History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Searching through previous lines.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Bare Essentials"></A>
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.1 Readline Bare Essentials </H3>
+<!--docid::SEC4::-->
+<P>
+
+In order to enter characters into the line, simply type them.  The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+</P><P>
+
+Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters.  In
+that case, you can type <KBD>C-b</KBD> to move the cursor to the left, and then
+correct your mistake.  Afterwards, you can move the cursor to the right
+with <KBD>C-f</KBD>.
+</P><P>
+
+When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are `pushed over' to make room for the text
+that you have inserted.  Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are `pulled back' to fill in the
+blank space created by the removal of the text.  A list of the bare
+essentials for editing the text of an input line follows.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-b</KBD>
+<DD>Move back one character.
+<DT><KBD>C-f</KBD>
+<DD>Move forward one character.
+<DT><KBD>DEL</KBD> or <KBD>Backspace</KBD>
+<DD>Delete the character to the left of the cursor.
+<DT><KBD>C-d</KBD>
+<DD>Delete the character underneath the cursor.
+<DT>Printing characters
+<DD>Insert the character into the line at the cursor.
+<DT><KBD>C-_</KBD> or <KBD>C-x C-u</KBD>
+<DD>Undo the last editing command.  You can undo all the way back to an
+empty line.
+</DL>
+<P>
+
+(Depending on your configuration, the <KBD>Backspace</KBD> key be set to
+delete the character to the left of the cursor and the <KBD>DEL</KBD> key set
+to delete the character underneath the cursor, like <KBD>C-d</KBD>, rather
+than the character to the left of the cursor.)
+</P><P>
+
+<A NAME="Readline Movement Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC6"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.2 Readline Movement Commands </H3>
+<!--docid::SEC5::-->
+<P>
+
+The above table describes the most basic keystrokes that you need
+in order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to <KBD>C-b</KBD>, <KBD>C-f</KBD>,
+<KBD>C-d</KBD>, and <KBD>DEL</KBD>.  Here are some commands for moving more rapidly
+about the line.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-a</KBD>
+<DD>Move to the start of the line.
+<DT><KBD>C-e</KBD>
+<DD>Move to the end of the line.
+<DT><KBD>M-f</KBD>
+<DD>Move forward a word, where a word is composed of letters and digits.
+<DT><KBD>M-b</KBD>
+<DD>Move backward a word.
+<DT><KBD>C-l</KBD>
+<DD>Clear the screen, reprinting the current line at the top.
+</DL>
+<P>
+
+Notice how <KBD>C-f</KBD> moves forward a character, while <KBD>M-f</KBD> moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+</P><P>
+
+<A NAME="Readline Killing Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC7"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.3 Readline Killing Commands </H3>
+<!--docid::SEC6::-->
+<P>
+
+<A NAME="IDX1"></A>
+<A NAME="IDX2"></A>
+</P><P>
+
+<EM>Killing</EM> text means to delete the text from the line, but to save
+it away for later use, usually by <EM>yanking</EM> (re-inserting)
+it back into the line.
+(`Cut' and `paste' are more recent jargon for `kill' and `yank'.)
+</P><P>
+
+If the description for a command says that it `kills' text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+</P><P>
+
+When you use a kill command, the text is saved in a <EM>kill-ring</EM>.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+<A NAME="IDX3"></A>
+</P><P>
+
+Here is the list of commands for killing text.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-k</KBD>
+<DD>Kill the text from the current cursor position to the end of the line.
+<P>
+
+<DT><KBD>M-d</KBD>
+<DD>Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by <KBD>M-f</KBD>.
+<P>
+
+<DT><KBD>M-<KBD>DEL</KBD></KBD>
+<DD>Kill from the cursor the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by <KBD>M-b</KBD>.
+<P>
+
+<DT><KBD>C-w</KBD>
+<DD>Kill from the cursor to the previous whitespace.  This is different than
+<KBD>M-<KBD>DEL</KBD></KBD> because the word boundaries differ.
+<P>
+
+</DL>
+<P>
+
+Here is how to <EM>yank</EM> the text back into the line.  Yanking
+means to copy the most-recently-killed text from the kill buffer.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-y</KBD>
+<DD>Yank the most recently killed text back into the buffer at the cursor.
+<P>
+
+<DT><KBD>M-y</KBD>
+<DD>Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <KBD>C-y</KBD> or <KBD>M-y</KBD>.
+</DL>
+<P>
+
+<A NAME="Readline Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC8"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.4 Readline Arguments </H3>
+<!--docid::SEC7::-->
+<P>
+
+You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the <I>sign</I> of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type <SAMP>`M-- C-k'</SAMP>.
+</P><P>
+
+The general way to pass numeric arguments to a command is to type meta
+digits before the command.  If the first `digit' typed is a minus
+sign (<SAMP>`-'</SAMP>), then the sign of the argument will be negative.  Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command.  For example, to give
+the <KBD>C-d</KBD> command an argument of 10, you could type <SAMP>`M-1 0 C-d'</SAMP>,
+which will delete the next ten characters on the input line.
+</P><P>
+
+<A NAME="Searching"></A>
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.5 Searching for Commands in the History </H3>
+<!--docid::SEC8::-->
+<P>
+
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes:  <EM>incremental</EM> and <EM>non-incremental</EM>.
+</P><P>
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+<KBD>C-r</KBD>.  Typing <KBD>C-s</KBD> searches forward through the history.
+The characters present in the value of the <CODE>isearch-terminators</CODE> variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the <KBD>ESC</KBD> and
+<KBD>C-J</KBD> characters will terminate an incremental search.
+<KBD>C-g</KBD> will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+</P><P>
+
+To find other matching entries in the history list, type <KBD>C-r</KBD> or
+<KBD>C-s</KBD> as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a <KBD>RET</KBD> will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+</P><P>
+
+Readline remembers the last incremental search string.  If two
+<KBD>C-r</KBD>s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+</P><P>
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+</P><P>
+
+<A NAME="Readline Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.3 Readline Init File </H2>
+<!--docid::SEC9::-->
+<P>
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an <EM>inputrc</EM> file, conventionally in his home directory.
+The name of this
+file is taken from the value of the environment variable <CODE>INPUTRC</CODE>.  If
+that variable is unset, the default is <TT>`~/.inputrc'</TT>.
+</P><P>
+
+When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+</P><P>
+
+In addition, the <CODE>C-x C-r</CODE> command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Syntax for the commands in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC11">1.3.2 Conditional Init Constructs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Conditional key bindings in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC12">1.3.3 Sample Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example inputrc file.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Init File Syntax"></A>
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.1 Readline Init File Syntax </H3>
+<!--docid::SEC10::-->
+<P>
+
+There are only a few basic constructs allowed in the
+Readline init file.  Blank lines are ignored.
+Lines beginning with a <SAMP>`#'</SAMP> are comments.
+Lines beginning with a <SAMP>`$'</SAMP> indicate conditional
+constructs (see section <A HREF="readline.html#SEC11">1.3.2 Conditional Init Constructs</A>).  Other lines
+denote variable settings and key bindings.
+</P><P>
+
+<DL COMPACT>
+<DT>Variable Settings
+<DD>You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the <CODE>set</CODE> command within the init file.
+The syntax is simple:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set <VAR>variable</VAR> <VAR>value</VAR>
+</pre></td></tr></table></P><P>
+
+Here, for example, is how to
+change from the default Emacs-like key binding to use
+<CODE>vi</CODE> line editing commands:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set editing-mode vi
+</pre></td></tr></table></P><P>
+
+Variable names and values, where appropriate, are recognized without regard
+to case. 
+</P><P>
+
+A great deal of run-time behavior is changeable with the following
+variables.
+</P><P>
+
+<A NAME="IDX4"></A>
+<DL COMPACT>
+
+<DT><CODE>bell-style</CODE>
+<DD><A NAME="IDX5"></A>
+Controls what happens when Readline wants to ring the terminal bell.
+If set to <SAMP>`none'</SAMP>, Readline never rings the bell.  If set to
+<SAMP>`visible'</SAMP>, Readline uses a visible bell if one is available.
+If set to <SAMP>`audible'</SAMP> (the default), Readline attempts to ring
+the terminal's bell.
+<P>
+
+<DT><CODE>comment-begin</CODE>
+<DD><A NAME="IDX6"></A>
+The string to insert at the beginning of the line when the
+<CODE>insert-comment</CODE> command is executed.  The default value
+is <CODE>"#"</CODE>.
+<P>
+
+<DT><CODE>completion-ignore-case</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>completion-query-items</CODE>
+<DD><A NAME="IDX7"></A>
+The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than this value,
+Readline will ask the user whether or not he wishes to view
+them; otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to 0.
+The default limit is <CODE>100</CODE>.
+<P>
+
+<DT><CODE>convert-meta</CODE>
+<DD><A NAME="IDX8"></A>
+If set to <SAMP>`on'</SAMP>, Readline will convert characters with the
+eighth bit set to an ASCII key sequence by stripping the eighth
+bit and prefixing an <KBD>ESC</KBD> character, converting them to a
+meta-prefixed key sequence.  The default value is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>disable-completion</CODE>
+<DD><A NAME="IDX9"></A>
+If set to <SAMP>`On'</SAMP>, Readline will inhibit word completion.
+Completion  characters will be inserted into the line as if they had
+been mapped to <CODE>self-insert</CODE>.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>editing-mode</CODE>
+<DD><A NAME="IDX10"></A>
+The <CODE>editing-mode</CODE> variable controls which default set of
+key bindings is used.  By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs.  This variable can be
+set to either <SAMP>`emacs'</SAMP> or <SAMP>`vi'</SAMP>.
+<P>
+
+<DT><CODE>enable-keypad</CODE>
+<DD><A NAME="IDX11"></A>
+When set to <SAMP>`on'</SAMP>, Readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>expand-tilde</CODE>
+<DD><A NAME="IDX12"></A>
+If set to <SAMP>`on'</SAMP>, tilde expansion is performed when Readline
+attempts word completion.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<A NAME="IDX13"></A>
+If set to <SAMP>`on'</SAMP>, the history code attempts to place point at the
+same location on each history line retrieved with <CODE>previous-history</CODE>
+or <CODE>next-history</CODE>.
+</P><P>
+
+<DT><CODE>horizontal-scroll-mode</CODE>
+<DD><A NAME="IDX14"></A>
+This variable can be set to either <SAMP>`on'</SAMP> or <SAMP>`off'</SAMP>.  Setting it
+to <SAMP>`on'</SAMP> means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.  By default,
+this variable is set to <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>input-meta</CODE>
+<DD><A NAME="IDX15"></A>
+<A NAME="IDX16"></A>
+If set to <SAMP>`on'</SAMP>, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support.  The
+default value is <SAMP>`off'</SAMP>.  The name <CODE>meta-flag</CODE> is a
+synonym for this variable.
+<P>
+
+<DT><CODE>isearch-terminators</CODE>
+<DD><A NAME="IDX17"></A>
+The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (see section <A HREF="readline.html#SEC8">1.2.5 Searching for Commands in the History</A>).
+If this variable has not been given a value, the characters <KBD>ESC</KBD> and
+<KBD>C-J</KBD> will terminate an incremental search.
+<P>
+
+<DT><CODE>keymap</CODE>
+<DD><A NAME="IDX18"></A>
+Sets Readline's idea of the current keymap for key binding commands.
+Acceptable <CODE>keymap</CODE> names are
+<CODE>emacs</CODE>,
+<CODE>emacs-standard</CODE>,
+<CODE>emacs-meta</CODE>,
+<CODE>emacs-ctlx</CODE>,
+<CODE>vi</CODE>,
+<CODE>vi-move</CODE>,
+<CODE>vi-command</CODE>, and
+<CODE>vi-insert</CODE>.
+<CODE>vi</CODE> is equivalent to <CODE>vi-command</CODE>; <CODE>emacs</CODE> is
+equivalent to <CODE>emacs-standard</CODE>.  The default value is <CODE>emacs</CODE>.
+The value of the <CODE>editing-mode</CODE> variable also affects the
+default keymap.
+<P>
+
+<DT><CODE>mark-directories</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, completed directory names have a slash
+appended.  The default is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>mark-modified-lines</CODE>
+<DD><A NAME="IDX19"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to display an
+asterisk (<SAMP>`*'</SAMP>) at the start of history lines which have been modified.
+This variable is <SAMP>`off'</SAMP> by default.
+<P>
+
+<DT><CODE>mark-symlinked-directories</CODE>
+<DD><A NAME="IDX20"></A>
+If set to <SAMP>`on'</SAMP>, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+<CODE>mark-directories</CODE>).
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>match-hidden-files</CODE>
+<DD><A NAME="IDX21"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to match files whose
+names begin with a <SAMP>`.'</SAMP> (hidden files) when performing filename
+completion, unless the leading <SAMP>`.'</SAMP> is
+supplied by the user in the filename to be completed.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>output-meta</CODE>
+<DD><A NAME="IDX22"></A>
+If set to <SAMP>`on'</SAMP>, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>page-completions</CODE>
+<DD><A NAME="IDX23"></A>
+If set to <SAMP>`on'</SAMP>, Readline uses an internal <CODE>more</CODE>-like pager
+to display a screenful of possible completions at a time.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>print-completions-horizontally</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-ambiguous</CODE>
+<DD><A NAME="IDX24"></A>
+This alters the default behavior of the completion functions.  If
+set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-unmodified</CODE>
+<DD><A NAME="IDX25"></A>
+This alters the default behavior of the completion functions in
+a fashion similar to <VAR>show-all-if-ambiguous</VAR>.
+If set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>visible-stats</CODE>
+<DD><A NAME="IDX26"></A>
+If set to <SAMP>`on'</SAMP>, a character denoting a file's type
+is appended to the filename when listing possible
+completions.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+</DL>
+<P>
+
+<DT>Key Bindings
+<DD>The syntax for controlling key bindings in the init file is
+simple.  First you need to find the name of the command that you
+want to change.  The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+<P>
+
+Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.  The name of the key
+can be expressed in different ways, depending on what you find most
+comfortable.
+</P><P>
+
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a <VAR>macro</VAR>).
+</P><P>
+
+<DL COMPACT>
+<DT><VAR>keyname</VAR>: <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyname</VAR> is the name of a key spelled out in English.  For example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "&#62; output"
+</pre></td></tr></table><P>
+
+In the above example, <KBD>C-u</KBD> is bound to the function
+<CODE>universal-argument</CODE>,
+<KBD>M-DEL</KBD> is bound to the function <CODE>backward-kill-word</CODE>, and
+<KBD>C-o</KBD> is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+<SAMP>`&#62; output'</SAMP> into the line).
+</P><P>
+
+A number of symbolic character names are recognized while
+processing this key binding syntax:
+<VAR>DEL</VAR>,
+<VAR>ESC</VAR>,
+<VAR>ESCAPE</VAR>,
+<VAR>LFD</VAR>,
+<VAR>NEWLINE</VAR>,
+<VAR>RET</VAR>,
+<VAR>RETURN</VAR>,
+<VAR>RUBOUT</VAR>,
+<VAR>SPACE</VAR>,
+<VAR>SPC</VAR>,
+and
+<VAR>TAB</VAR>.
+</P><P>
+
+<DT>"<VAR>keyseq</VAR>": <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyseq</VAR> differs from <VAR>keyname</VAR> above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes.  Some GNU Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+</pre></td></tr></table></P><P>
+
+In the above example, <KBD>C-u</KBD> is again bound to the function
+<CODE>universal-argument</CODE> (just as it was in the first example),
+<SAMP>`<KBD>C-x</KBD> <KBD>C-r</KBD>'</SAMP> is bound to the function <CODE>re-read-init-file</CODE>,
+and <SAMP>`<KBD>ESC</KBD> <KBD>[</KBD> <KBD>1</KBD> <KBD>1</KBD> <KBD>~</KBD>'</SAMP> is bound to insert
+the text <SAMP>`Function Key 1'</SAMP>.
+</P><P>
+
+</DL>
+<P>
+
+The following GNU Emacs style escape sequences are available when
+specifying key sequences:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE><KBD>\C-</KBD></CODE>
+<DD>control prefix
+<DT><CODE><KBD>\M-</KBD></CODE>
+<DD>meta prefix
+<DT><CODE><KBD>\e</KBD></CODE>
+<DD>an escape character
+<DT><CODE><KBD>\\</KBD></CODE>
+<DD>backslash
+<DT><CODE><KBD>\"</KBD></CODE>
+<DD><KBD>"</KBD>, a double quotation mark
+<DT><CODE><KBD>\'</KBD></CODE>
+<DD><KBD>'</KBD>, a single quote or apostrophe
+</DL>
+<P>
+
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>\a</CODE>
+<DD>alert (bell)
+<DT><CODE>\b</CODE>
+<DD>backspace
+<DT><CODE>\d</CODE>
+<DD>delete
+<DT><CODE>\f</CODE>
+<DD>form feed
+<DT><CODE>\n</CODE>
+<DD>newline
+<DT><CODE>\r</CODE>
+<DD>carriage return
+<DT><CODE>\t</CODE>
+<DD>horizontal tab
+<DT><CODE>\v</CODE>
+<DD>vertical tab
+<DT><CODE>\<VAR>nnn</VAR></CODE>
+<DD>the eight-bit character whose value is the octal value <VAR>nnn</VAR>
+(one to three digits)
+<DT><CODE>\x<VAR>HH</VAR></CODE>
+<DD>the eight-bit character whose value is the hexadecimal value <VAR>HH</VAR>
+(one or two hex digits)
+</DL>
+<P>
+
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including <SAMP>`"'</SAMP> and <SAMP>`''</SAMP>.
+For example, the following binding will make <SAMP>`<KBD>C-x</KBD> \'</SAMP>
+insert a single <SAMP>`\'</SAMP> into the line:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-x\\": "\\"
+</pre></td></tr></table></P><P>
+
+</DL>
+<P>
+
+<A NAME="Conditional Init Constructs"></A>
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC12"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.2 Conditional Init Constructs </H3>
+<!--docid::SEC11::-->
+<P>
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>$if</CODE>
+<DD>The <CODE>$if</CODE> construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+<P>
+
+<DL COMPACT>
+<DT><CODE>mode</CODE>
+<DD>The <CODE>mode=</CODE> form of the <CODE>$if</CODE> directive is used to test
+whether Readline is in <CODE>emacs</CODE> or <CODE>vi</CODE> mode.
+This may be used in conjunction
+with the <SAMP>`set keymap'</SAMP> command, for instance, to set bindings in
+the <CODE>emacs-standard</CODE> and <CODE>emacs-ctlx</CODE> keymaps only if
+Readline is starting out in <CODE>emacs</CODE> mode.
+<P>
+
+<DT><CODE>term</CODE>
+<DD>The <CODE>term=</CODE> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+<SAMP>`='</SAMP> is tested against both the full name of the terminal and
+the portion of the terminal name before the first <SAMP>`-'</SAMP>.  This
+allows <CODE>sun</CODE> to match both <CODE>sun</CODE> and <CODE>sun-cmd</CODE>,
+for instance.
+<P>
+
+<DT><CODE>application</CODE>
+<DD>The <VAR>application</VAR> construct is used to include
+application-specific settings.  Each program using the Readline
+library sets the <VAR>application name</VAR>, and you can test for
+a particular value. 
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+</pre></td></tr></table></DL>
+<P>
+
+<DT><CODE>$endif</CODE>
+<DD>This command, as seen in the previous example, terminates an
+<CODE>$if</CODE> command.
+<P>
+
+<DT><CODE>$else</CODE>
+<DD>Commands in this branch of the <CODE>$if</CODE> directive are executed if
+the test fails.
+<P>
+
+<DT><CODE>$include</CODE>
+<DD>This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from <TT>`/etc/inputrc'</TT>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$include /etc/inputrc
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Sample Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.3 Sample Init File </H3>
+<!--docid::SEC12::-->
+<P>
+
+Here is an example of an <VAR>inputrc</VAR> file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre># This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any systemwide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs 
+
+$if mode=emacs
+
+Meta-Control-h:        backward-kill-word      Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD":        backward-char
+#"\M-OC":        forward-char
+#"\M-OA":        previous-history
+#"\M-OB":        next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D":        backward-char
+"\M-[C":        forward-char
+"\M-[A":        previous-history
+"\M-[B":        next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD":       backward-char
+#"\M-\C-OC":       forward-char
+#"\M-\C-OA":       previous-history
+#"\M-\C-OB":       next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D":       backward-char
+#"\M-\C-[C":       forward-char
+#"\M-\C-[A":       previous-history
+#"\M-\C-[B":       next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding.  This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are more than 150 possible completions for
+# a word, ask the user if he wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+</pre></td></tr></table></P><P>
+
+<A NAME="Bindable Readline Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.4 Bindable Readline Commands </H2>
+<!--docid::SEC13::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC14">1.4.1 Commands For Moving</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting at previous lines.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for changing text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for killing and yanking.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Specifying numeric arguments, repeat counts.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting Readline to do the typing for you.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Saving and re-executing typed characters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Other miscellaneous commands.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+This section describes Readline commands that may be bound to key
+sequences.
+Command names without an accompanying key sequence are unbound by default.
+</P><P>
+
+In the following descriptions, <EM>point</EM> refers to the current cursor
+position, and <EM>mark</EM> refers to a cursor position saved by the
+<CODE>set-mark</CODE> command.
+The text between the point and mark is referred to as the <EM>region</EM>.
+</P><P>
+
+<A NAME="Commands For Moving"></A>
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.1 Commands For Moving </H3>
+<!--docid::SEC14::-->
+<DL COMPACT>
+<A NAME="IDX27"></A>
+<DT><CODE>beginning-of-line (C-a)</CODE>
+<DD><A NAME="IDX28"></A>
+Move to the start of the current line.
+<P>
+
+<A NAME="IDX29"></A>
+<DT><CODE>end-of-line (C-e)</CODE>
+<DD><A NAME="IDX30"></A>
+Move to the end of the line.
+<P>
+
+<A NAME="IDX31"></A>
+<DT><CODE>forward-char (C-f)</CODE>
+<DD><A NAME="IDX32"></A>
+Move forward a character.
+<P>
+
+<A NAME="IDX33"></A>
+<DT><CODE>backward-char (C-b)</CODE>
+<DD><A NAME="IDX34"></A>
+Move back a character.
+<P>
+
+<A NAME="IDX35"></A>
+<DT><CODE>forward-word (M-f)</CODE>
+<DD><A NAME="IDX36"></A>
+Move forward to the end of the next word.  Words are composed of
+letters and digits.
+<P>
+
+<A NAME="IDX37"></A>
+<DT><CODE>backward-word (M-b)</CODE>
+<DD><A NAME="IDX38"></A>
+Move back to the start of the current or previous word.  Words are
+composed of letters and digits.
+<P>
+
+<A NAME="IDX39"></A>
+<DT><CODE>clear-screen (C-l)</CODE>
+<DD><A NAME="IDX40"></A>
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+<P>
+
+<A NAME="IDX41"></A>
+<DT><CODE>redraw-current-line ()</CODE>
+<DD><A NAME="IDX42"></A>
+Refresh the current line.  By default, this is unbound.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For History"></A>
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC16"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.2 Commands For Manipulating The History </H3>
+<!--docid::SEC15::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX43"></A>
+<DT><CODE>accept-line (Newline or Return)</CODE>
+<DD><A NAME="IDX44"></A>
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+<CODE>add_history()</CODE>.
+If this line is a modified history line, the history line is restored
+to its original state.
+<P>
+
+<A NAME="IDX45"></A>
+<DT><CODE>previous-history (C-p)</CODE>
+<DD><A NAME="IDX46"></A>
+Move `back' through the history list, fetching the previous command.
+<P>
+
+<A NAME="IDX47"></A>
+<DT><CODE>next-history (C-n)</CODE>
+<DD><A NAME="IDX48"></A>
+Move `forward' through the history list, fetching the next command.
+<P>
+
+<A NAME="IDX49"></A>
+<DT><CODE>beginning-of-history (M-&#60;)</CODE>
+<DD><A NAME="IDX50"></A>
+Move to the first line in the history.
+<P>
+
+<A NAME="IDX51"></A>
+<DT><CODE>end-of-history (M-&#62;)</CODE>
+<DD><A NAME="IDX52"></A>
+Move to the end of the input history, i.e., the line currently
+being entered.
+<P>
+
+<A NAME="IDX53"></A>
+<DT><CODE>reverse-search-history (C-r)</CODE>
+<DD><A NAME="IDX54"></A>
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX55"></A>
+<DT><CODE>forward-search-history (C-s)</CODE>
+<DD><A NAME="IDX56"></A>
+Search forward starting at the current line and moving `down' through
+the the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX57"></A>
+<DT><CODE>non-incremental-reverse-search-history (M-p)</CODE>
+<DD><A NAME="IDX58"></A>
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX59"></A>
+<DT><CODE>non-incremental-forward-search-history (M-n)</CODE>
+<DD><A NAME="IDX60"></A>
+Search forward starting at the current line and moving `down'
+through the the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX61"></A>
+<DT><CODE>history-search-forward ()</CODE>
+<DD><A NAME="IDX62"></A>
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX63"></A>
+<DT><CODE>history-search-backward ()</CODE>
+<DD><A NAME="IDX64"></A>
+Search backward through the history for the string of characters
+between the start of the current line and the point.  This
+is a non-incremental search.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX65"></A>
+<DT><CODE>yank-nth-arg (M-C-y)</CODE>
+<DD><A NAME="IDX66"></A>
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument <VAR>n</VAR>,
+insert the <VAR>n</VAR>th word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the <VAR>n</VAR>th word from the end of the previous command.
+<P>
+
+<A NAME="IDX67"></A>
+<DT><CODE>yank-last-arg (M-. or M-_)</CODE>
+<DD><A NAME="IDX68"></A>
+Insert last argument to the previous command (the last word of the
+previous history entry).  With an
+argument, behave exactly like <CODE>yank-nth-arg</CODE>.
+Successive calls to <CODE>yank-last-arg</CODE> move back through the history
+list, inserting the last argument of each line in turn.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Text"></A>
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.3 Commands For Changing Text </H3>
+<!--docid::SEC16::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX69"></A>
+<DT><CODE>delete-char (C-d)</CODE>
+<DD><A NAME="IDX70"></A>
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to <CODE>delete-char</CODE>, then
+return EOF.
+<P>
+
+<A NAME="IDX71"></A>
+<DT><CODE>backward-delete-char (Rubout)</CODE>
+<DD><A NAME="IDX72"></A>
+Delete the character behind the cursor.  A numeric argument means
+to kill the characters instead of deleting them.
+<P>
+
+<A NAME="IDX73"></A>
+<DT><CODE>forward-backward-delete-char ()</CODE>
+<DD><A NAME="IDX74"></A>
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.  By default, this is not bound to a key.
+<P>
+
+<A NAME="IDX75"></A>
+<DT><CODE>quoted-insert (C-q or C-v)</CODE>
+<DD><A NAME="IDX76"></A>
+Add the next character typed to the line verbatim.  This is
+how to insert key sequences like <KBD>C-q</KBD>, for example.
+<P>
+
+<A NAME="IDX77"></A>
+<DT><CODE>tab-insert (M-<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX78"></A>
+Insert a tab character.
+<P>
+
+<A NAME="IDX79"></A>
+<DT><CODE>self-insert (a, b, A, 1, !, <small>...</small>)</CODE>
+<DD><A NAME="IDX80"></A>
+Insert yourself.
+<P>
+
+<A NAME="IDX81"></A>
+<DT><CODE>transpose-chars (C-t)</CODE>
+<DD><A NAME="IDX82"></A>
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well.  If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+<P>
+
+<A NAME="IDX83"></A>
+<DT><CODE>transpose-words (M-t)</CODE>
+<DD><A NAME="IDX84"></A>
+Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+<P>
+
+<A NAME="IDX85"></A>
+<DT><CODE>upcase-word (M-u)</CODE>
+<DD><A NAME="IDX86"></A>
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX87"></A>
+<DT><CODE>downcase-word (M-l)</CODE>
+<DD><A NAME="IDX88"></A>
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX89"></A>
+<DT><CODE>capitalize-word (M-c)</CODE>
+<DD><A NAME="IDX90"></A>
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX91"></A>
+<DT><CODE>overwrite-mode ()</CODE>
+<DD><A NAME="IDX92"></A>
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+<CODE>emacs</CODE> mode; <CODE>vi</CODE> mode does overwrite differently.
+Each call to <CODE>readline()</CODE> starts in insert mode.
+<P>
+
+In overwrite mode, characters bound to <CODE>self-insert</CODE> replace
+the text at point rather than pushing the text to the right.
+Characters bound to <CODE>backward-delete-char</CODE> replace the character
+before point with a space.
+</P><P>
+
+By default, this command is unbound.
+</P><P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Killing"></A>
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC18"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.4 Killing And Yanking </H3>
+<!--docid::SEC17::-->
+<P>
+
+<DL COMPACT>
+
+<A NAME="IDX93"></A>
+<DT><CODE>kill-line (C-k)</CODE>
+<DD><A NAME="IDX94"></A>
+Kill the text from point to the end of the line.
+<P>
+
+<A NAME="IDX95"></A>
+<DT><CODE>backward-kill-line (C-x Rubout)</CODE>
+<DD><A NAME="IDX96"></A>
+Kill backward to the beginning of the line.
+<P>
+
+<A NAME="IDX97"></A>
+<DT><CODE>unix-line-discard (C-u)</CODE>
+<DD><A NAME="IDX98"></A>
+Kill backward from the cursor to the beginning of the current line.
+<P>
+
+<A NAME="IDX99"></A>
+<DT><CODE>kill-whole-line ()</CODE>
+<DD><A NAME="IDX100"></A>
+Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+<P>
+
+<A NAME="IDX101"></A>
+<DT><CODE>kill-word (M-d)</CODE>
+<DD><A NAME="IDX102"></A>
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as <CODE>forward-word</CODE>.
+<P>
+
+<A NAME="IDX103"></A>
+<DT><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE>
+<DD><A NAME="IDX104"></A>
+Kill the word behind point.
+Word boundaries are the same as <CODE>backward-word</CODE>.
+<P>
+
+<A NAME="IDX105"></A>
+<DT><CODE>unix-word-rubout (C-w)</CODE>
+<DD><A NAME="IDX106"></A>
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+<P>
+
+<A NAME="IDX107"></A>
+<DT><CODE>delete-horizontal-space ()</CODE>
+<DD><A NAME="IDX108"></A>
+Delete all spaces and tabs around point.  By default, this is unbound.
+<P>
+
+<A NAME="IDX109"></A>
+<DT><CODE>kill-region ()</CODE>
+<DD><A NAME="IDX110"></A>
+Kill the text in the current region.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX111"></A>
+<DT><CODE>copy-region-as-kill ()</CODE>
+<DD><A NAME="IDX112"></A>
+Copy the text in the region to the kill buffer, so it can be yanked
+right away.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX113"></A>
+<DT><CODE>copy-backward-word ()</CODE>
+<DD><A NAME="IDX114"></A>
+Copy the word before point to the kill buffer.
+The word boundaries are the same as <CODE>backward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX115"></A>
+<DT><CODE>copy-forward-word ()</CODE>
+<DD><A NAME="IDX116"></A>
+Copy the word following point to the kill buffer.
+The word boundaries are the same as <CODE>forward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX117"></A>
+<DT><CODE>yank (C-y)</CODE>
+<DD><A NAME="IDX118"></A>
+Yank the top of the kill ring into the buffer at point.
+<P>
+
+<A NAME="IDX119"></A>
+<DT><CODE>yank-pop (M-y)</CODE>
+<DD><A NAME="IDX120"></A>
+Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <CODE>yank</CODE> or <CODE>yank-pop</CODE>.
+</DL>
+<P>
+
+<A NAME="Numeric Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.5 Specifying Numeric Arguments </H3>
+<!--docid::SEC18::-->
+<DL COMPACT>
+
+<A NAME="IDX121"></A>
+<DT><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, <small>...</small> <KBD>M--</KBD>)</CODE>
+<DD><A NAME="IDX122"></A>
+Add this digit to the argument already accumulating, or start a new
+argument.  <KBD>M--</KBD> starts a negative argument.
+<P>
+
+<A NAME="IDX123"></A>
+<DT><CODE>universal-argument ()</CODE>
+<DD><A NAME="IDX124"></A>
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing <CODE>universal-argument</CODE>
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+</DL>
+<P>
+
+<A NAME="Commands For Completion"></A>
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC20"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.6 Letting Readline Type For You </H3>
+<!--docid::SEC19::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX125"></A>
+<DT><CODE>complete (<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX126"></A>
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+The default is filename completion.
+<P>
+
+<A NAME="IDX127"></A>
+<DT><CODE>possible-completions (M-?)</CODE>
+<DD><A NAME="IDX128"></A>
+List the possible completions of the text before point.
+<P>
+
+<A NAME="IDX129"></A>
+<DT><CODE>insert-completions (M-*)</CODE>
+<DD><A NAME="IDX130"></A>
+Insert all completions of the text before point that would have
+been generated by <CODE>possible-completions</CODE>.
+<P>
+
+<A NAME="IDX131"></A>
+<DT><CODE>menu-complete ()</CODE>
+<DD><A NAME="IDX132"></A>
+Similar to <CODE>complete</CODE>, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of <CODE>menu-complete</CODE> steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of <CODE>bell-style</CODE>)
+and the original text is restored.
+An argument of <VAR>n</VAR> moves <VAR>n</VAR> positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to <KBD>TAB</KBD>, but is unbound
+by default.
+<P>
+
+<A NAME="IDX133"></A>
+<DT><CODE>delete-char-or-list ()</CODE>
+<DD><A NAME="IDX134"></A>
+Deletes the character under the cursor if not at the beginning or
+end of the line (like <CODE>delete-char</CODE>).
+If at the end of the line, behaves identically to
+<CODE>possible-completions</CODE>.
+This command is unbound by default.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Keyboard Macros"></A>
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.7 Keyboard Macros </H3>
+<!--docid::SEC20::-->
+<DL COMPACT>
+
+<A NAME="IDX135"></A>
+<DT><CODE>start-kbd-macro (C-x ()</CODE>
+<DD><A NAME="IDX136"></A>
+Begin saving the characters typed into the current keyboard macro.
+<P>
+
+<A NAME="IDX137"></A>
+<DT><CODE>end-kbd-macro (C-x ))</CODE>
+<DD><A NAME="IDX138"></A>
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+<P>
+
+<A NAME="IDX139"></A>
+<DT><CODE>call-last-kbd-macro (C-x e)</CODE>
+<DD><A NAME="IDX140"></A>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Miscellaneous Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.8 Some Miscellaneous Commands </H3>
+<!--docid::SEC21::-->
+<DL COMPACT>
+
+<A NAME="IDX141"></A>
+<DT><CODE>re-read-init-file (C-x C-r)</CODE>
+<DD><A NAME="IDX142"></A>
+Read in the contents of the <VAR>inputrc</VAR> file, and incorporate
+any bindings or variable assignments found there.
+<P>
+
+<A NAME="IDX143"></A>
+<DT><CODE>abort (C-g)</CODE>
+<DD><A NAME="IDX144"></A>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<CODE>bell-style</CODE>).
+<P>
+
+<A NAME="IDX145"></A>
+<DT><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, <small>...</small>)</CODE>
+<DD><A NAME="IDX146"></A>
+If the metafied character <VAR>x</VAR> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+<P>
+
+<A NAME="IDX147"></A>
+<DT><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE>
+<DD><A NAME="IDX148"></A>
+Metafy the next character typed.  This is for keyboards
+without a meta key.  Typing <SAMP>`<KBD>ESC</KBD> f'</SAMP> is equivalent to typing
+<KBD>M-f</KBD>.
+<P>
+
+<A NAME="IDX149"></A>
+<DT><CODE>undo (C-_ or C-x C-u)</CODE>
+<DD><A NAME="IDX150"></A>
+Incremental undo, separately remembered for each line.
+<P>
+
+<A NAME="IDX151"></A>
+<DT><CODE>revert-line (M-r)</CODE>
+<DD><A NAME="IDX152"></A>
+Undo all changes made to this line.  This is like executing the <CODE>undo</CODE>
+command enough times to get back to the beginning.
+<P>
+
+<A NAME="IDX153"></A>
+<DT><CODE>tilde-expand (M-~)</CODE>
+<DD><A NAME="IDX154"></A>
+Perform tilde expansion on the current word.
+<P>
+
+<A NAME="IDX155"></A>
+<DT><CODE>set-mark (C-@)</CODE>
+<DD><A NAME="IDX156"></A>
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+<P>
+
+<A NAME="IDX157"></A>
+<DT><CODE>exchange-point-and-mark (C-x C-x)</CODE>
+<DD><A NAME="IDX158"></A>
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+<P>
+
+<A NAME="IDX159"></A>
+<DT><CODE>character-search (C-])</CODE>
+<DD><A NAME="IDX160"></A>
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+<P>
+
+<A NAME="IDX161"></A>
+<DT><CODE>character-search-backward (M-C-])</CODE>
+<DD><A NAME="IDX162"></A>
+A character is read and point is moved to the previous occurrence
+of that character.  A negative count searches for subsequent
+occurrences.
+<P>
+
+<A NAME="IDX163"></A>
+<DT><CODE>insert-comment (M-#)</CODE>
+<DD><A NAME="IDX164"></A>
+Without a numeric argument, the value of the <CODE>comment-begin</CODE>
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value
+of <CODE>comment-begin</CODE>, the value is inserted, otherwise
+the characters in <CODE>comment-begin</CODE> are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+<P>
+
+<A NAME="IDX165"></A>
+<DT><CODE>dump-functions ()</CODE>
+<DD><A NAME="IDX166"></A>
+Print all of the functions and their key bindings to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX167"></A>
+<DT><CODE>dump-variables ()</CODE>
+<DD><A NAME="IDX168"></A>
+Print all of the settable variables and their values to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX169"></A>
+<DT><CODE>dump-macros ()</CODE>
+<DD><A NAME="IDX170"></A>
+Print all of the Readline key sequences bound to macros and the
+strings they output.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX171"></A>
+<DT><CODE>emacs-editing-mode (C-e)</CODE>
+<DD><A NAME="IDX172"></A>
+When in <CODE>vi</CODE> command mode, this causes a switch to <CODE>emacs</CODE>
+editing mode.
+<P>
+
+<A NAME="IDX173"></A>
+<DT><CODE>vi-editing-mode (M-C-j)</CODE>
+<DD><A NAME="IDX174"></A>
+When in <CODE>emacs</CODE> editing mode, this causes a switch to <CODE>vi</CODE>
+editing mode.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Readline vi Mode"></A>
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.5 Readline vi Mode </H2>
+<!--docid::SEC22::-->
+<P>
+
+While the Readline library does not have a full set of <CODE>vi</CODE>
+editing functions, it does contain enough to allow simple editing
+of the line.  The Readline <CODE>vi</CODE> mode behaves as specified in
+the POSIX 1003.2 standard.
+</P><P>
+
+In order to switch interactively between <CODE>emacs</CODE> and <CODE>vi</CODE>
+editing modes, use the command <KBD>M-C-j</KBD> (bound to emacs-editing-mode
+when in <CODE>vi</CODE> mode and to vi-editing-mode in <CODE>emacs</CODE> mode).
+The Readline default is <CODE>emacs</CODE> mode.
+</P><P>
+
+When you enter a line in <CODE>vi</CODE> mode, you are already placed in
+`insertion' mode, as if you had typed an <SAMP>`i'</SAMP>.  Pressing <KBD>ESC</KBD>
+switches you into `command' mode, where you can edit the text of the
+line with the standard <CODE>vi</CODE> movement keys, move to previous
+history lines with <SAMP>`k'</SAMP> and subsequent lines with <SAMP>`j'</SAMP>, and
+so forth.
+</P><P>
+
+This document describes the GNU Readline Library, a utility for aiding
+in the consitency of user interface across discrete programs that need
+to provide a command line interface.
+</P><P>
+
+Copyright (C) 1988-2002 Free Software Foundation, Inc.
+</P><P>
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+pare preserved on all copies.
+</P><P>
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+</P><P>
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+</P><P>
+
+<A NAME="Programming with GNU Readline"></A>
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC24"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 2. Programming with GNU Readline </H1>
+<!--docid::SEC23::-->
+<P>
+
+This chapter describes the interface between the GNU Readline Library and
+other programs.  If you are a programmer, and you wish to include the
+features found in GNU Readline
+such as completion, line editing, and interactive history manipulation
+in your own programs, this section is for you.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC24">2.1 Basic Behavior</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Using the default behavior of Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC25">2.2 Custom Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Adding your own functions to Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC28">2.3 Readline Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables accessible to custom
+                                       functions.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC29">2.4 Readline Convenience Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions which Readline supplies to
+                                       aid in writing your own custom
+                                       functions.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC43">2.5 Readline Signal Handling</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How Readline behaves when it receives signals.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC44">2.6 Custom Completers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Supplanting or supplementing Readline's
+                       completion functions.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Basic Behavior"></A>
+<HR SIZE="6">
+<A NAME="SEC24"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC25"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.1 Basic Behavior </H2>
+<!--docid::SEC24::-->
+<P>
+
+Many programs provide a command line interface, such as <CODE>mail</CODE>,
+<CODE>ftp</CODE>, and <CODE>sh</CODE>.  For such programs, the default behaviour of
+Readline is sufficient.  This section describes how to use Readline in
+the simplest way possible, perhaps to replace calls in your code to
+<CODE>gets()</CODE> or <CODE>fgets()</CODE>.
+</P><P>
+
+<A NAME="IDX175"></A>
+<A NAME="IDX176"></A>
+</P><P>
+
+The function <CODE>readline()</CODE> prints a prompt <VAR>prompt</VAR>
+and then reads and returns a single line of text from the user.
+If <VAR>prompt</VAR> is <CODE>NULL</CODE> or the empty string, no prompt is displayed.
+The line <CODE>readline</CODE> returns is allocated with <CODE>malloc()</CODE>;
+the caller should <CODE>free()</CODE> the line when it has finished with it.
+The declaration for <CODE>readline</CODE> in ANSI C is
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>char *readline (const char *<VAR>prompt</VAR>);</CODE>
+</pre></td></tr></table></P><P>
+
+So, one might say
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>char *line = readline ("Enter a line: ");</CODE>
+</pre></td></tr></table>in order to read a line of text from the user.
+The line returned has the final newline removed, so only the
+text remains.
+</P><P>
+
+If <CODE>readline</CODE> encounters an <CODE>EOF</CODE> while reading the line, and the
+line is empty at that point, then <CODE>(char *)NULL</CODE> is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+</P><P>
+
+If you want the user to be able to get at the line later, (with
+<KBD>C-p</KBD> for example), you must call <CODE>add_history()</CODE> to save the
+line away in a <EM>history</EM> list of such lines.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>add_history (line)</CODE>;
+</pre></td></tr></table></P><P>
+
+For full details on the GNU History Library, see the associated manual.
+</P><P>
+
+It is preferable to avoid saving empty lines on the history list, since
+users rarely have a burning need to reuse a blank line.  Here is
+a function which usefully replaces the standard <CODE>gets()</CODE> library
+function, and has the advantage of no static buffer to overflow:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it.
+   Returns NULL on EOF. */
+char *
+rl_gets ()
+{
+  /* If the buffer has already been allocated,
+     return the memory to the free pool. */
+  if (line_read)
+    {
+      free (line_read);
+      line_read = (char *)NULL;
+    }
+
+  /* Get a line from the user. */
+  line_read = readline ("");
+
+  /* If the line has any text in it,
+     save it on the history. */
+  if (line_read &#38;&#38; *line_read)
+    add_history (line_read);
+
+  return (line_read);
+}
+</pre></td></tr></table></P><P>
+
+This function gives the user the default behaviour of <KBD>TAB</KBD>
+completion: completion on file names.  If you do not want Readline to
+complete on filenames, you can change the binding of the <KBD>TAB</KBD> key
+with <CODE>rl_bind_key()</CODE>.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>int rl_bind_key (int <VAR>key</VAR>, rl_command_func_t *<VAR>function</VAR>);</CODE>
+</pre></td></tr></table></P><P>
+
+<CODE>rl_bind_key()</CODE> takes two arguments: <VAR>key</VAR> is the character that
+you want to bind, and <VAR>function</VAR> is the address of the function to
+call when <VAR>key</VAR> is pressed.  Binding <KBD>TAB</KBD> to <CODE>rl_insert()</CODE>
+makes <KBD>TAB</KBD> insert itself.
+<CODE>rl_bind_key()</CODE> returns non-zero if <VAR>key</VAR> is not a valid
+ASCII character code (between 0 and 255).
+</P><P>
+
+Thus, to disable the default <KBD>TAB</KBD> behavior, the following suffices:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>rl_bind_key ('\t', rl_insert);</CODE>
+</pre></td></tr></table></P><P>
+
+This code should be executed once at the start of your program; you
+might write a function called <CODE>initialize_readline()</CODE> which
+performs this and other desired initializations, such as installing
+custom completers (see section <A HREF="readline.html#SEC44">2.6 Custom Completers</A>).
+</P><P>
+
+<A NAME="Custom Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC25"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC24"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC26"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.2 Custom Functions </H2>
+<!--docid::SEC25::-->
+<P>
+
+Readline provides many functions for manipulating the text of
+the line, but it isn't possible to anticipate the needs of all
+programs.  This section describes the various functions and variables
+defined within the Readline library which allow a user program to add
+customized functionality to Readline.
+</P><P>
+
+Before declaring any functions that customize Readline's behavior, or
+using any functionality Readline provides in other code, an
+application writer should include the file <CODE>&#60;readline/readline.h&#62;</CODE>
+in any file that uses Readline's features.  Since some of the definitions
+in <CODE>readline.h</CODE> use the <CODE>stdio</CODE> library, the file
+<CODE>&#60;stdio.h&#62;</CODE> should be included before <CODE>readline.h</CODE>.
+</P><P>
+
+<CODE>readline.h</CODE> defines a C preprocessor variable that should
+be treated as an integer, <CODE>RL_READLINE_VERSION</CODE>, which may
+be used to conditionally compile application code depending on
+the installed Readline version.  The value is a hexadecimal
+encoding of the major and minor version numbers of the library,
+of the form 0x<VAR>MMmm</VAR>.  <VAR>MM</VAR> is the two-digit major
+version number; <VAR>mm</VAR> is the two-digit minor version number. 
+For Readline 4.2, for example, the value of
+<CODE>RL_READLINE_VERSION</CODE> would be <CODE>0x0402</CODE>. 
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC26">2.2.1 Readline Typedefs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">C declarations to make code readable.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC27">2.2.2 Writing a New Function</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables and calling conventions.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Typedefs"></A>
+<HR SIZE="6">
+<A NAME="SEC26"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC25"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC27"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC25"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.2.1 Readline Typedefs </H3>
+<!--docid::SEC26::-->
+<P>
+
+For readabilty, we declare a number of new object types, all pointers
+to functions.
+</P><P>
+
+The reason for declaring these new types is to make it easier to write
+code describing pointers to C functions with appropriately prototyped
+arguments and return values.
+</P><P>
+
+For instance, say we want to declare a variable <VAR>func</VAR> as a pointer
+to a function which takes two <CODE>int</CODE> arguments and returns an
+<CODE>int</CODE> (this is the type of all of the Readline bindable functions).
+Instead of the classic C declaration
+</P><P>
+
+<CODE>int (*func)();</CODE>
+</P><P>
+
+or the ANSI-C style declaration
+</P><P>
+
+<CODE>int (*func)(int, int);</CODE>
+</P><P>
+
+we may write
+</P><P>
+
+<CODE>rl_command_func_t *func;</CODE>
+</P><P>
+
+The full list of function pointer types available is
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>typedef int rl_command_func_t (int, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef char *rl_compentry_func_t (const char *, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef char **rl_completion_func_t (const char *, int, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef char *rl_quote_func_t (char *, int, char *);</CODE>
+<DD><P>
+
+<DT><CODE>typedef char *rl_dequote_func_t (char *, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_compignore_func_t (char **);</CODE>
+<DD><P>
+
+<DT><CODE>typedef void rl_compdisp_func_t (char **, int, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_hook_func_t (void);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_getc_func_t (FILE *);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_linebuf_func_t (char *, int);</CODE>
+<DD><P>
+
+<DT><CODE>typedef int rl_intfunc_t (int);</CODE>
+<DD><DT><CODE>#define rl_ivoidfunc_t rl_hook_func_t</CODE>
+<DD><DT><CODE>typedef int rl_icpfunc_t (char *);</CODE>
+<DD><DT><CODE>typedef int rl_icppfunc_t (char **);</CODE>
+<DD><P>
+
+<DT><CODE>typedef void rl_voidfunc_t (void);</CODE>
+<DD><DT><CODE>typedef void rl_vintfunc_t (int);</CODE>
+<DD><DT><CODE>typedef void rl_vcpfunc_t (char *);</CODE>
+<DD><DT><CODE>typedef void rl_vcppfunc_t (char **);</CODE>
+<DD><P>
+
+</DL>
+<P>
+
+<A NAME="Function Writing"></A>
+<HR SIZE="6">
+<A NAME="SEC27"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC26"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC25"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.2.2 Writing a New Function </H3>
+<!--docid::SEC27::-->
+<P>
+
+In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+</P><P>
+
+The calling sequence for a command <CODE>foo</CODE> looks like
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CODE>int foo (int count, int key)</CODE>
+</pre></td></tr></table></P><P>
+
+where <VAR>count</VAR> is the numeric argument (or 1 if defaulted) and
+<VAR>key</VAR> is the key that invoked this function.
+</P><P>
+
+It is completely up to the function as to what should be done with the
+numeric argument.  Some functions use it as a repeat count, some
+as a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example).  Some choose to
+ignore it.  In general, if a
+function uses the numeric argument as a repeat count, it should be able
+to do something useful with both negative and positive arguments.
+At the very least, it should be aware that it can be passed a
+negative argument.
+</P><P>
+
+A command function should return 0 if its action completes successfully,
+and a non-zero value if some error occurs.
+</P><P>
+
+<A NAME="Readline Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC28"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC27"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.3 Readline Variables </H2>
+<!--docid::SEC28::-->
+<P>
+
+These variables are available to function writers.
+</P><P>
+
+<A NAME="IDX177"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_line_buffer</B>
+<DD>This is the line gathered so far.  You are welcome to modify the
+contents of the line, but see <A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A>.  The
+function <CODE>rl_extend_line_buffer</CODE> is available to increase
+the memory allocated to <CODE>rl_line_buffer</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX178"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_point</B>
+<DD>The offset of the current cursor position in <CODE>rl_line_buffer</CODE>
+(the <EM>point</EM>).
+</DL>
+</P><P>
+
+<A NAME="IDX179"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_end</B>
+<DD>The number of characters present in <CODE>rl_line_buffer</CODE>.  When
+<CODE>rl_point</CODE> is at the end of the line, <CODE>rl_point</CODE> and
+<CODE>rl_end</CODE> are equal.
+</DL>
+</P><P>
+
+<A NAME="IDX180"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_mark</B>
+<DD>The <VAR>mark</VAR> (saved position) in the current line.  If set, the mark
+and point define a <EM>region</EM>.
+</DL>
+</P><P>
+
+<A NAME="IDX181"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_done</B>
+<DD>Setting this to a non-zero value causes Readline to return the current
+line immediately.
+</DL>
+</P><P>
+
+<A NAME="IDX182"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_num_chars_to_read</B>
+<DD>Setting this to a positive value before calling <CODE>readline()</CODE> causes
+Readline to return after accepting that many characters, rather
+than reading up to a character bound to <CODE>accept-line</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX183"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_pending_input</B>
+<DD>Setting this to a value makes it the next keystroke read.  This is a
+way to stuff a single character into the input stream.
+</DL>
+</P><P>
+
+<A NAME="IDX184"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_dispatching</B>
+<DD>Set to a non-zero value if a function is being called from a key binding;
+zero otherwise.  Application functions can test this to discover whether
+they were called directly or by Readline's dispatching mechanism.
+</DL>
+</P><P>
+
+<A NAME="IDX185"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_erase_empty_line</B>
+<DD>Setting this to a non-zero value causes Readline to completely erase
+the current line, including any prompt, any time a newline is typed as
+the only character on an otherwise-empty line.  The cursor is moved to
+the beginning of the newly-blank line.
+</DL>
+</P><P>
+
+<A NAME="IDX186"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_prompt</B>
+<DD>The prompt Readline uses.  This is set from the argument to
+<CODE>readline()</CODE>, and should not be assigned to directly.
+The <CODE>rl_set_prompt()</CODE> function (see section <A HREF="readline.html#SEC35">2.4.6 Redisplay</A>) may
+be used to modify the prompt string after calling <CODE>readline()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX187"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_already_prompted</B>
+<DD>If an application wishes to display the prompt itself, rather than have
+Readline do it the first time <CODE>readline()</CODE> is called, it should set
+this variable to a non-zero value after displaying the prompt.
+The prompt must also be passed as the argument to <CODE>readline()</CODE> so
+the redisplay functions can update the display properly.
+The calling application is responsible for managing the value; Readline
+never sets it.
+</DL>
+</P><P>
+
+<A NAME="IDX188"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_library_version</B>
+<DD>The version number of this revision of the library.
+</DL>
+</P><P>
+
+<A NAME="IDX189"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_readline_version</B>
+<DD>An integer encoding the current version of the library.  The encoding is
+of the form 0x<VAR>MMmm</VAR>, where <VAR>MM</VAR> is the two-digit major version
+number, and <VAR>mm</VAR> is the two-digit minor version number.
+For example, for Readline-4.2, <CODE>rl_readline_version</CODE> would have the
+value 0x0402.
+</DL>
+</P><P>
+
+<A NAME="IDX190"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_gnu_readline_p</B>
+<DD>Always set to 1, denoting that this is GNU readline rather than some
+emulation.
+</DL>
+</P><P>
+
+<A NAME="IDX191"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_terminal_name</B>
+<DD>The terminal type, used for initialization.  If not set by the application,
+Readline sets this to the value of the <CODE>TERM</CODE> environment variable
+the first time it is called.
+</DL>
+</P><P>
+
+<A NAME="IDX192"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_readline_name</B>
+<DD>This variable is set to a unique name by each application using Readline.
+The value allows conditional parsing of the inputrc file
+(see section <A HREF="readline.html#SEC11">1.3.2 Conditional Init Constructs</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX193"></A>
+<DL>
+<DT><U>Variable:</U> FILE * <B>rl_instream</B>
+<DD>The stdio stream from which Readline reads input.
+If <CODE>NULL</CODE>, Readline defaults to <VAR>stdin</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX194"></A>
+<DL>
+<DT><U>Variable:</U> FILE * <B>rl_outstream</B>
+<DD>The stdio stream to which Readline performs output.
+If <CODE>NULL</CODE>, Readline defaults to <VAR>stdout</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX195"></A>
+<DL>
+<DT><U>Variable:</U> rl_command_func_t * <B>rl_last_func</B>
+<DD>The address of the last command function Readline executed.  May be used to
+test whether or not a function is being executed twice in succession, for
+example.
+</DL>
+</P><P>
+
+<A NAME="IDX196"></A>
+<DL>
+<DT><U>Variable:</U> rl_hook_func_t * <B>rl_startup_hook</B>
+<DD>If non-zero, this is the address of a function to call just
+before <CODE>readline</CODE> prints the first prompt.
+</DL>
+</P><P>
+
+<A NAME="IDX197"></A>
+<DL>
+<DT><U>Variable:</U> rl_hook_func_t * <B>rl_pre_input_hook</B>
+<DD>If non-zero, this is the address of a function to call after
+the first prompt has been printed and just before <CODE>readline</CODE>
+starts reading input characters.
+</DL>
+</P><P>
+
+<A NAME="IDX198"></A>
+<DL>
+<DT><U>Variable:</U> rl_hook_func_t * <B>rl_event_hook</B>
+<DD>If non-zero, this is the address of a function to call periodically
+when Readline is waiting for terminal input.
+By default, this will be called at most ten times a second if there
+is no keyboard input.
+</DL>
+</P><P>
+
+<A NAME="IDX199"></A>
+<DL>
+<DT><U>Variable:</U> rl_getc_func_t * <B>rl_getc_function</B>
+<DD>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</CODE>, the default Readline character input function
+(see section <A HREF="readline.html#SEC37">2.4.8 Character Input</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX200"></A>
+<DL>
+<DT><U>Variable:</U> rl_voidfunc_t * <B>rl_redisplay_function</B>
+<DD>If non-zero, Readline will call indirectly through this pointer
+to update the display with the current contents of the editing buffer.
+By default, it is set to <CODE>rl_redisplay</CODE>, the default Readline
+redisplay function (see section <A HREF="readline.html#SEC35">2.4.6 Redisplay</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX201"></A>
+<DL>
+<DT><U>Variable:</U> rl_vintfunc_t * <B>rl_prep_term_function</B>
+<DD>If non-zero, Readline will call indirectly through this pointer
+to initialize the terminal.  The function takes a single argument, an
+<CODE>int</CODE> flag that says whether or not to use eight-bit characters.
+By default, this is set to <CODE>rl_prep_terminal</CODE>
+(see section <A HREF="readline.html#SEC38">2.4.9 Terminal Management</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX202"></A>
+<DL>
+<DT><U>Variable:</U> rl_voidfunc_t * <B>rl_deprep_term_function</B>
+<DD>If non-zero, Readline will call indirectly through this pointer
+to reset the terminal.  This function should undo the effects of
+<CODE>rl_prep_term_function</CODE>.
+By default, this is set to <CODE>rl_deprep_terminal</CODE>
+(see section <A HREF="readline.html#SEC38">2.4.9 Terminal Management</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX203"></A>
+<DL>
+<DT><U>Variable:</U> Keymap <B>rl_executing_keymap</B>
+<DD>This variable is set to the keymap (see section <A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A>) in which the
+currently executing readline function was found.
+</DL>
+</P><P>
+
+<A NAME="IDX204"></A>
+<DL>
+<DT><U>Variable:</U> Keymap <B>rl_binding_keymap</B>
+<DD>This variable is set to the keymap (see section <A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A>) in which the
+last key binding occurred.
+</DL>
+</P><P>
+
+<A NAME="IDX205"></A>
+<DL>
+<DT><U>Variable:</U> char * <B>rl_executing_macro</B>
+<DD>This variable is set to the text of any currently-executing macro.
+</DL>
+</P><P>
+
+<A NAME="IDX206"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_readline_state</B>
+<DD>A variable with bit values that encapsulate the current Readline state.
+A bit is set with the <CODE>RL_SETSTATE</CODE> macro, and unset with the
+<CODE>RL_UNSETSTATE</CODE> macro.  Use the <CODE>RL_ISSTATE</CODE> macro to test
+whether a particular state bit is set.  Current state bits include:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>RL_STATE_NONE</CODE>
+<DD>Readline has not yet been called, nor has it begun to intialize.
+<DT><CODE>RL_STATE_INITIALIZING</CODE>
+<DD>Readline is initializing its internal data structures.
+<DT><CODE>RL_STATE_INITIALIZED</CODE>
+<DD>Readline has completed its initialization.
+<DT><CODE>RL_STATE_TERMPREPPED</CODE>
+<DD>Readline has modified the terminal modes to do its own input and redisplay.
+<DT><CODE>RL_STATE_READCMD</CODE>
+<DD>Readline is reading a command from the keyboard.
+<DT><CODE>RL_STATE_METANEXT</CODE>
+<DD>Readline is reading more input after reading the meta-prefix character.
+<DT><CODE>RL_STATE_DISPATCHING</CODE>
+<DD>Readline is dispatching to a command.
+<DT><CODE>RL_STATE_MOREINPUT</CODE>
+<DD>Readline is reading more input while executing an editing command.
+<DT><CODE>RL_STATE_ISEARCH</CODE>
+<DD>Readline is performing an incremental history search.
+<DT><CODE>RL_STATE_NSEARCH</CODE>
+<DD>Readline is performing a non-incremental history search.
+<DT><CODE>RL_STATE_SEARCH</CODE>
+<DD>Readline is searching backward or forward through the history for a string.
+<DT><CODE>RL_STATE_NUMERICARG</CODE>
+<DD>Readline is reading a numeric argument.
+<DT><CODE>RL_STATE_MACROINPUT</CODE>
+<DD>Readline is currently getting its input from a previously-defined keyboard
+macro.
+<DT><CODE>RL_STATE_MACRODEF</CODE>
+<DD>Readline is currently reading characters defining a keyboard macro.
+<DT><CODE>RL_STATE_OVERWRITE</CODE>
+<DD>Readline is in overwrite mode.
+<DT><CODE>RL_STATE_COMPLETING</CODE>
+<DD>Readline is performing word completion.
+<DT><CODE>RL_STATE_SIGHANDLER</CODE>
+<DD>Readline is currently executing the readline signal handler.
+<DT><CODE>RL_STATE_UNDOING</CODE>
+<DD>Readline is performing an undo.
+<DT><CODE>RL_STATE_DONE</CODE>
+<DD>Readline has read a key sequence bound to <CODE>accept-line</CODE>
+and is about to return the line to the caller.
+</DL>
+<P>
+
+</DL>
+</P><P>
+
+<A NAME="IDX207"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_explicit_arg</B>
+<DD>Set to a non-zero value if an explicit numeric argument was specified by
+the user.  Only valid in a bindable command function.
+</DL>
+</P><P>
+
+<A NAME="IDX208"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_numeric_arg</B>
+<DD>Set to the value of any numeric argument explicitly specified by the user
+before executing the current Readline function.  Only valid in a bindable
+command function.
+</DL>
+</P><P>
+
+<A NAME="IDX209"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_editing_mode</B>
+<DD>Set to a value denoting Readline's current editing mode.  A value of
+<VAR>1</VAR> means Readline is currently in emacs mode; <VAR>0</VAR>
+means that vi mode is active.
+</DL>
+</P><P>
+
+<A NAME="Readline Convenience Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC29"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC28"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC30"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.4 Readline Convenience Functions </H2>
+<!--docid::SEC29::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC30">2.4.1 Naming a Function</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to give a function you write a name.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Making keymaps.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC32">2.4.3 Binding Keys</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Changing Keymaps.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Translate function names to
+                                               key sequences.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to make your functions undoable.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC35">2.4.6 Redisplay</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to control line display.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC36">2.4.7 Modifying Text</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to modify <CODE>rl_line_buffer</CODE>.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC37">2.4.8 Character Input</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to read keyboard input.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC38">2.4.9 Terminal Management</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions to manage terminal settings.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC39">2.4.10 Utility Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Generally useful functions and hooks.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions that don't fall into any category.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC41">2.4.12 Alternate Interface</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Using Readline in a `callback' fashion.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC42">2.4.13 A Readline Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example Readline function.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Function Naming"></A>
+<HR SIZE="6">
+<A NAME="SEC30"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.1 Naming a Function </H3>
+<!--docid::SEC30::-->
+<P>
+
+The user can dynamically change the bindings of keys while using
+Readline.  This is done by representing the function with a descriptive
+name.  The user is able to type the descriptive name when referring to
+the function.  Thus, in an init file, one might find
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Meta-Rubout:  backward-kill-word
+</pre></td></tr></table></P><P>
+
+This binds the keystroke <KBD>Meta-Rubout</KBD> to the function
+<EM>descriptively</EM> named <CODE>backward-kill-word</CODE>.  You, as the
+programmer, should bind the functions you write to descriptive names as
+well.  Readline provides a function for doing that:
+</P><P>
+
+<A NAME="IDX210"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_add_defun</B> <I>(const char *name, rl_command_func_t *function, int key)</I>
+<DD>Add <VAR>name</VAR> to the list of named functions.  Make <VAR>function</VAR> be
+the function that gets called.  If <VAR>key</VAR> is not -1, then bind it to
+<VAR>function</VAR> using <CODE>rl_bind_key()</CODE>.
+</DL>
+</P><P>
+
+Using this function alone is sufficient for most applications.
+It is the recommended way to add a few functions to the default
+functions that Readline has built in.
+If you need to do something other than adding a function to Readline,
+you may need to use the underlying functions described below.
+</P><P>
+
+<A NAME="Keymaps"></A>
+<HR SIZE="6">
+<A NAME="SEC31"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC30"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC32"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC32"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.2 Selecting a Keymap </H3>
+<!--docid::SEC31::-->
+<P>
+
+Key bindings take place on a <EM>keymap</EM>.  The keymap is the
+association between the keys that the user types and the functions that
+get run.  You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+</P><P>
+
+<A NAME="IDX211"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_make_bare_keymap</B> <I>(void)</I>
+<DD>Returns a new, empty keymap.  The space for the keymap is allocated with
+<CODE>malloc()</CODE>; the caller should free it by calling
+<CODE>rl_discard_keymap()</CODE> when done.
+</DL>
+</P><P>
+
+<A NAME="IDX212"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_copy_keymap</B> <I>(Keymap map)</I>
+<DD>Return a new keymap which is a copy of <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX213"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_make_keymap</B> <I>(void)</I>
+<DD>Return a new keymap with the printing characters bound to rl_insert,
+the lowercase Meta characters bound to run their equivalents, and
+the Meta digits bound to produce numeric arguments.
+</DL>
+</P><P>
+
+<A NAME="IDX214"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_discard_keymap</B> <I>(Keymap keymap)</I>
+<DD>Free the storage associated with <VAR>keymap</VAR>.
+</DL>
+</P><P>
+
+Readline has several internal keymaps.  These functions allow you to
+change which keymap is active.
+</P><P>
+
+<A NAME="IDX215"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_get_keymap</B> <I>(void)</I>
+<DD>Returns the currently active keymap.
+</DL>
+</P><P>
+
+<A NAME="IDX216"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_set_keymap</B> <I>(Keymap keymap)</I>
+<DD>Makes <VAR>keymap</VAR> the currently active keymap.
+</DL>
+</P><P>
+
+<A NAME="IDX217"></A>
+<DL>
+<DT><U>Function:</U> Keymap <B>rl_get_keymap_by_name</B> <I>(const char *name)</I>
+<DD>Return the keymap matching <VAR>name</VAR>.  <VAR>name</VAR> is one which would
+be supplied in a <CODE>set keymap</CODE> inputrc line (see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX218"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_get_keymap_name</B> <I>(Keymap keymap)</I>
+<DD>Return the name matching <VAR>keymap</VAR>.  <VAR>name</VAR> is one which would
+be supplied in a <CODE>set keymap</CODE> inputrc line (see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+</DL>
+</P><P>
+
+<A NAME="Binding Keys"></A>
+<HR SIZE="6">
+<A NAME="SEC32"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC33"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC33"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.3 Binding Keys </H3>
+<!--docid::SEC32::-->
+<P>
+
+Key sequences are associate with functions through the keymap.
+Readline has several internal keymaps: <CODE>emacs_standard_keymap</CODE>,
+<CODE>emacs_meta_keymap</CODE>, <CODE>emacs_ctlx_keymap</CODE>,
+<CODE>vi_movement_keymap</CODE>, and <CODE>vi_insertion_keymap</CODE>.
+<CODE>emacs_standard_keymap</CODE> is the default, and the examples in
+this manual assume that.
+</P><P>
+
+Since <CODE>readline()</CODE> installs a set of default key bindings the first
+time it is called, there is always the danger that a custom binding
+installed before the first call to <CODE>readline()</CODE> will be overridden.
+An alternate mechanism is to install custom key bindings in an
+initialization function assigned to the <CODE>rl_startup_hook</CODE> variable
+(see section <A HREF="readline.html#SEC28">2.3 Readline Variables</A>).
+</P><P>
+
+These functions manage key bindings.
+</P><P>
+
+<A NAME="IDX219"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key</B> <I>(int key, rl_command_func_t *function)</I>
+<DD>Binds <VAR>key</VAR> to <VAR>function</VAR> in the currently active keymap.
+Returns non-zero in the case of an invalid <VAR>key</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX220"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key_in_map</B> <I>(int key, rl_command_func_t *function, Keymap map)</I>
+<DD>Bind <VAR>key</VAR> to <VAR>function</VAR> in <VAR>map</VAR>.
+Returns non-zero in the case of an invalid <VAR>key</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX221"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key_if_unbound</B> <I>(int key, rl_command_func_t *function)</I>
+<DD>Binds <VAR>key</VAR> to <VAR>function</VAR> if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid <VAR>key</VAR> or if <VAR>key</VAR> is
+already bound.
+</DL>
+</P><P>
+
+<A NAME="IDX222"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_key_if_unbound_in_map</B> <I>(int key, rl_command_func_t *function, Keymap map)</I>
+<DD>Binds <VAR>key</VAR> to <VAR>function</VAR> if it is not already bound in <VAR>map</VAR>.
+Returns non-zero in the case of an invalid <VAR>key</VAR> or if <VAR>key</VAR> is
+already bound.
+</DL>
+</P><P>
+
+<A NAME="IDX223"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_key</B> <I>(int key)</I>
+<DD>Bind <VAR>key</VAR> to the null function in the currently active keymap.
+Returns non-zero in case of error.
+</DL>
+</P><P>
+
+<A NAME="IDX224"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_key_in_map</B> <I>(int key, Keymap map)</I>
+<DD>Bind <VAR>key</VAR> to the null function in <VAR>map</VAR>.
+Returns non-zero in case of error.
+</DL>
+</P><P>
+
+<A NAME="IDX225"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_function_in_map</B> <I>(rl_command_func_t *function, Keymap map)</I>
+<DD>Unbind all keys that execute <VAR>function</VAR> in <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX226"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_unbind_command_in_map</B> <I>(const char *command, Keymap map)</I>
+<DD>Unbind all keys that are bound to <VAR>command</VAR> in <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX227"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_keyseq</B> <I>(const char *keyseq, rl_command_func_t *function)</I>
+<DD>Bind the key sequence represented by the string <VAR>keyseq</VAR> to the function
+<VAR>function</VAR>, beginning in the current keymap.
+This makes new keymaps as necessary.
+The return value is non-zero if <VAR>keyseq</VAR> is invalid.
+</DL>
+</P><P>
+
+<A NAME="IDX228"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_keyseq_in_map</B> <I>(const char *keyseq, rl_command_func_t *function, Keymap map)</I>
+<DD>Bind the key sequence represented by the string <VAR>keyseq</VAR> to the function
+<VAR>function</VAR>.  This makes new keymaps as necessary.
+Initial bindings are performed in <VAR>map</VAR>.
+The return value is non-zero if <VAR>keyseq</VAR> is invalid.
+</DL>
+</P><P>
+
+<A NAME="IDX229"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_key</B> <I>(const char *keyseq, rl_command_func_t *function, Keymap map)</I>
+<DD>Equivalent to <CODE>rl_bind_keyseq_in_map</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX230"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_keyseq_if_unbound</B> <I>(const char *keyseq, rl_command_func_t *function)</I>
+<DD>Binds <VAR>keyseq</VAR> to <VAR>function</VAR> if it is not already bound in the
+currently active keymap.
+Returns non-zero in the case of an invalid <VAR>keyseq</VAR> or if <VAR>keyseq</VAR> is
+already bound.
+</DL>
+</P><P>
+
+<A NAME="IDX231"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_bind_keyseq_if_unbound_in_map</B> <I>(const char *keyseq, rl_command_func_t *function, Keymap map)</I>
+<DD>Binds <VAR>keyseq</VAR> to <VAR>function</VAR> if it is not already bound in <VAR>map</VAR>.
+Returns non-zero in the case of an invalid <VAR>keyseq</VAR> or if <VAR>keyseq</VAR> is
+already bound.
+</DL>
+</P><P>
+
+<A NAME="IDX232"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_generic_bind</B> <I>(int type, const char *keyseq, char *data, Keymap map)</I>
+<DD>Bind the key sequence represented by the string <VAR>keyseq</VAR> to the arbitrary
+pointer <VAR>data</VAR>.  <VAR>type</VAR> says what kind of data is pointed to by
+<VAR>data</VAR>; this can be a function (<CODE>ISFUNC</CODE>), a macro
+(<CODE>ISMACR</CODE>), or a keymap (<CODE>ISKMAP</CODE>).  This makes new keymaps as
+necessary.  The initial keymap in which to do bindings is <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX233"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_parse_and_bind</B> <I>(char *line)</I>
+<DD>Parse <VAR>line</VAR> as if it had been read from the <CODE>inputrc</CODE> file and
+perform any key bindings and variable assignments found
+(see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX234"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_read_init_file</B> <I>(const char *filename)</I>
+<DD>Read keybindings and variable assignments from <VAR>filename</VAR>
+(see section <A HREF="readline.html#SEC9">1.3 Readline Init File</A>).
+</DL>
+</P><P>
+
+<A NAME="Associating Function Names and Bindings"></A>
+<HR SIZE="6">
+<A NAME="SEC33"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC32"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC34"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC34"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.4 Associating Function Names and Bindings </H3>
+<!--docid::SEC33::-->
+<P>
+
+These functions allow you to find out what keys invoke named functions
+and the functions invoked by a particular key sequence.  You may also
+associate a new function name with an arbitrary function.
+</P><P>
+
+<A NAME="IDX235"></A>
+<DL>
+<DT><U>Function:</U> rl_command_func_t * <B>rl_named_function</B> <I>(const char *name)</I>
+<DD>Return the function with name <VAR>name</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX236"></A>
+<DL>
+<DT><U>Function:</U> rl_command_func_t * <B>rl_function_of_keyseq</B> <I>(const char *keyseq, Keymap map, int *type)</I>
+<DD>Return the function invoked by <VAR>keyseq</VAR> in keymap <VAR>map</VAR>.
+If <VAR>map</VAR> is <CODE>NULL</CODE>, the current keymap is used.  If <VAR>type</VAR> is
+not <CODE>NULL</CODE>, the type of the object is returned in the <CODE>int</CODE> variable
+it points to (one of <CODE>ISFUNC</CODE>, <CODE>ISKMAP</CODE>, or <CODE>ISMACR</CODE>).
+</DL>
+</P><P>
+
+<A NAME="IDX237"></A>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_invoking_keyseqs</B> <I>(rl_command_func_t *function)</I>
+<DD>Return an array of strings representing the key sequences used to
+invoke <VAR>function</VAR> in the current keymap.
+</DL>
+</P><P>
+
+<A NAME="IDX238"></A>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_invoking_keyseqs_in_map</B> <I>(rl_command_func_t *function, Keymap map)</I>
+<DD>Return an array of strings representing the key sequences used to
+invoke <VAR>function</VAR> in the keymap <VAR>map</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX239"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_function_dumper</B> <I>(int readable)</I>
+<DD>Print the readline function names and the key sequences currently
+bound to them to <CODE>rl_outstream</CODE>.  If <VAR>readable</VAR> is non-zero,
+the list is formatted in such a way that it can be made part of an
+<CODE>inputrc</CODE> file and re-read.
+</DL>
+</P><P>
+
+<A NAME="IDX240"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_list_funmap_names</B> <I>(void)</I>
+<DD>Print the names of all bindable Readline functions to <CODE>rl_outstream</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX241"></A>
+<DL>
+<DT><U>Function:</U> const char ** <B>rl_funmap_names</B> <I>(void)</I>
+<DD>Return a NULL terminated array of known function names.  The array is
+sorted.  The array itself is allocated, but not the strings inside.  You
+should <CODE>free()</CODE> the array when you are done, but not the pointers.
+</DL>
+</P><P>
+
+<A NAME="IDX242"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_add_funmap_entry</B> <I>(const char *name, rl_command_func_t *function)</I>
+<DD>Add <VAR>name</VAR> to the list of bindable Readline command names, and make
+<VAR>function</VAR> the function to be called when <VAR>name</VAR> is invoked.
+</DL>
+</P><P>
+
+<A NAME="Allowing Undoing"></A>
+<HR SIZE="6">
+<A NAME="SEC34"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC33"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC35"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC35"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.5 Allowing Undoing </H3>
+<!--docid::SEC34::-->
+<P>
+
+Supporting the undo command is a painless thing, and makes your
+functions much more useful.  It is certainly easy to try
+something if you know you can undo it.
+</P><P>
+
+If your function simply inserts text once, or deletes text once, and
+uses <CODE>rl_insert_text()</CODE> or <CODE>rl_delete_text()</CODE> to do it, then
+undoing is already done for you automatically.
+</P><P>
+
+If you do multiple insertions or multiple deletions, or any combination
+of these operations, you should group them together into one operation.
+This is done with <CODE>rl_begin_undo_group()</CODE> and
+<CODE>rl_end_undo_group()</CODE>.
+</P><P>
+
+The types of events that can be undone are:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; 
+</FONT></pre></td></tr></table></P><P>
+
+Notice that <CODE>UNDO_DELETE</CODE> means to insert some text, and
+<CODE>UNDO_INSERT</CODE> means to delete some text.  That is, the undo code
+tells what to undo, not how to undo it.  <CODE>UNDO_BEGIN</CODE> and
+<CODE>UNDO_END</CODE> are tags added by <CODE>rl_begin_undo_group()</CODE> and
+<CODE>rl_end_undo_group()</CODE>.
+</P><P>
+
+<A NAME="IDX243"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_begin_undo_group</B> <I>(void)</I>
+<DD>Begins saving undo information in a group construct.  The undo
+information usually comes from calls to <CODE>rl_insert_text()</CODE> and
+<CODE>rl_delete_text()</CODE>, but could be the result of calls to
+<CODE>rl_add_undo()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX244"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_end_undo_group</B> <I>(void)</I>
+<DD>Closes the current undo group started with <CODE>rl_begin_undo_group
+()</CODE>.  There should be one call to <CODE>rl_end_undo_group()</CODE>
+for each call to <CODE>rl_begin_undo_group()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX245"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_add_undo</B> <I>(enum undo_code what, int start, int end, char *text)</I>
+<DD>Remember how to undo an event (according to <VAR>what</VAR>).  The affected
+text runs from <VAR>start</VAR> to <VAR>end</VAR>, and encompasses <VAR>text</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX246"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_free_undo_list</B> <I>(void)</I>
+<DD>Free the existing undo list.
+</DL>
+</P><P>
+
+<A NAME="IDX247"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_do_undo</B> <I>(void)</I>
+<DD>Undo the first thing on the undo list.  Returns <CODE>0</CODE> if there was
+nothing to undo, non-zero if something was undone.
+</DL>
+</P><P>
+
+Finally, if you neither insert nor delete text, but directly modify the
+existing text (e.g., change its case), call <CODE>rl_modifying()</CODE>
+once, just before you modify the text.  You must supply the indices of
+the text range that you are going to modify.
+</P><P>
+
+<A NAME="IDX248"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_modifying</B> <I>(int start, int end)</I>
+<DD>Tell Readline to save the text between <VAR>start</VAR> and <VAR>end</VAR> as a
+single undo unit.  It is assumed that you will subsequently modify
+that text.
+</DL>
+</P><P>
+
+<A NAME="Redisplay"></A>
+<HR SIZE="6">
+<A NAME="SEC35"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC34"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC36"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC36"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.6 Redisplay </H3>
+<!--docid::SEC35::-->
+<P>
+
+<A NAME="IDX249"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_redisplay</B> <I>(void)</I>
+<DD>Change what's displayed on the screen to reflect the current contents
+of <CODE>rl_line_buffer</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX250"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_forced_update_display</B> <I>(void)</I>
+<DD>Force the line to be updated and redisplayed, whether or not
+Readline thinks the screen display is correct.
+</DL>
+</P><P>
+
+<A NAME="IDX251"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_on_new_line</B> <I>(void)</I>
+<DD>Tell the update functions that we have moved onto a new (empty) line,
+usually after ouputting a newline.
+</DL>
+</P><P>
+
+<A NAME="IDX252"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_on_new_line_with_prompt</B> <I>(void)</I>
+<DD>Tell the update functions that we have moved onto a new line, with
+<VAR>rl_prompt</VAR> already displayed.
+This could be used by applications that want to output the prompt string
+themselves, but still need Readline to know the prompt string length for
+redisplay.
+It should be used after setting <VAR>rl_already_prompted</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX253"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_reset_line_state</B> <I>(void)</I>
+<DD>Reset the display state to a clean state and redisplay the current line
+starting on a new line.
+</DL>
+</P><P>
+
+<A NAME="IDX254"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_crlf</B> <I>(void)</I>
+<DD>Move the cursor to the start of the next screen line.
+</DL>
+</P><P>
+
+<A NAME="IDX255"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_show_char</B> <I>(int c)</I>
+<DD>Display character <VAR>c</VAR> on <CODE>rl_outstream</CODE>.
+If Readline has not been set to display meta characters directly, this
+will convert meta characters to a meta-prefixed key sequence.
+This is intended for use by applications which wish to do their own
+redisplay.
+</DL>
+</P><P>
+
+<A NAME="IDX256"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_message</B> <I>(const char *, <small>...</small>)</I>
+<DD>The arguments are a format string as would be supplied to <CODE>printf</CODE>,
+possibly containing conversion specifications such as <SAMP>`%d'</SAMP>, and
+any additional arguments necessary to satisfy the conversion specifications.
+The resulting string is displayed in the <EM>echo area</EM>.  The echo area
+is also used to display numeric arguments and search strings.
+</DL>
+</P><P>
+
+<A NAME="IDX257"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_message</B> <I>(void)</I>
+<DD>Clear the message in the echo area.
+</DL>
+</P><P>
+
+<A NAME="IDX258"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_save_prompt</B> <I>(void)</I>
+<DD>Save the local Readline prompt display state in preparation for
+displaying a new message in the message area with <CODE>rl_message()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX259"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_restore_prompt</B> <I>(void)</I>
+<DD>Restore the local Readline prompt display state saved by the most
+recent call to <CODE>rl_save_prompt</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX260"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_expand_prompt</B> <I>(char *prompt)</I>
+<DD>Expand any special character sequences in <VAR>prompt</VAR> and set up the
+local Readline prompt redisplay variables.
+This function is called by <CODE>readline()</CODE>.  It may also be called to
+expand the primary prompt if the <CODE>rl_on_new_line_with_prompt()</CODE>
+function or <CODE>rl_already_prompted</CODE> variable is used.
+It returns the number of visible characters on the last line of the
+(possibly multi-line) prompt.
+</DL>
+</P><P>
+
+<A NAME="IDX261"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_prompt</B> <I>(const char *prompt)</I>
+<DD>Make Readline use <VAR>prompt</VAR> for subsequent redisplay.  This calls
+<CODE>rl_expand_prompt()</CODE> to expand the prompt and sets <CODE>rl_prompt</CODE>
+to the result.
+</DL>
+</P><P>
+
+<A NAME="Modifying Text"></A>
+<HR SIZE="6">
+<A NAME="SEC36"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC35"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC37"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC37"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.7 Modifying Text </H3>
+<!--docid::SEC36::-->
+<P>
+
+<A NAME="IDX262"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_insert_text</B> <I>(const char *text)</I>
+<DD>Insert <VAR>text</VAR> into the line at the current cursor position.
+Returns the number of characters inserted.
+</DL>
+</P><P>
+
+<A NAME="IDX263"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_delete_text</B> <I>(int start, int end)</I>
+<DD>Delete the text between <VAR>start</VAR> and <VAR>end</VAR> in the current line.
+Returns the number of characters deleted.
+</DL>
+</P><P>
+
+<A NAME="IDX264"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_copy_text</B> <I>(int start, int end)</I>
+<DD>Return a copy of the text between <VAR>start</VAR> and <VAR>end</VAR> in
+the current line.
+</DL>
+</P><P>
+
+<A NAME="IDX265"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_kill_text</B> <I>(int start, int end)</I>
+<DD>Copy the text between <VAR>start</VAR> and <VAR>end</VAR> in the current line
+to the kill ring, appending or prepending to the last kill if the
+last command was a kill command.  The text is deleted.
+If <VAR>start</VAR> is less than <VAR>end</VAR>,
+the text is appended, otherwise prepended.  If the last command was
+not a kill, a new kill ring slot is used.
+</DL>
+</P><P>
+
+<A NAME="IDX266"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_push_macro_input</B> <I>(char *macro)</I>
+<DD>Cause <VAR>macro</VAR> to be inserted into the line, as if it had been invoked
+by a key bound to a macro.  Not especially useful; use
+<CODE>rl_insert_text()</CODE> instead.
+</DL>
+</P><P>
+
+<A NAME="Character Input"></A>
+<HR SIZE="6">
+<A NAME="SEC37"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC36"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC38"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC38"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.8 Character Input </H3>
+<!--docid::SEC37::-->
+<P>
+
+<A NAME="IDX267"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_read_key</B> <I>(void)</I>
+<DD>Return the next character available from Readline's current input stream.
+This handles input inserted into
+the input stream via <VAR>rl_pending_input</VAR> (see section <A HREF="readline.html#SEC28">2.3 Readline Variables</A>)
+and <CODE>rl_stuff_char()</CODE>, macros, and characters read from the keyboard.
+While waiting for input, this function will call any function assigned to
+the <CODE>rl_event_hook</CODE> variable.
+</DL>
+</P><P>
+
+<A NAME="IDX268"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_getc</B> <I>(FILE *stream)</I>
+<DD>Return the next character available from <VAR>stream</VAR>, which is assumed to
+be the keyboard.
+</DL>
+</P><P>
+
+<A NAME="IDX269"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_stuff_char</B> <I>(int c)</I>
+<DD>Insert <VAR>c</VAR> into the Readline input stream.  It will be "read"
+before Readline attempts to read characters from the terminal with
+<CODE>rl_read_key()</CODE>.  Up to 512 characters may be pushed back.
+<CODE>rl_stuff_char</CODE> returns 1 if the character was successfully inserted;
+0 otherwise.
+</DL>
+</P><P>
+
+<A NAME="IDX270"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_execute_next</B> <I>(int c)</I>
+<DD>Make <VAR>c</VAR> be the next command to be executed when <CODE>rl_read_key()</CODE>
+is called.  This sets <VAR>rl_pending_input</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX271"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_pending_input</B> <I>(void)</I>
+<DD>Unset <VAR>rl_pending_input</VAR>, effectively negating the effect of any
+previous call to <CODE>rl_execute_next()</CODE>.  This works only if the
+pending input has not already been read with <CODE>rl_read_key()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX272"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_keyboard_input_timeout</B> <I>(int u)</I>
+<DD>While waiting for keyboard input in <CODE>rl_read_key()</CODE>, Readline will
+wait for <VAR>u</VAR> microseconds for input before calling any function
+assigned to <CODE>rl_event_hook</CODE>.  The default waiting period is
+one-tenth of a second.  Returns the old timeout value.
+</DL>
+</P><P>
+
+<A NAME="Terminal Management"></A>
+<HR SIZE="6">
+<A NAME="SEC38"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC37"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC39"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.9 Terminal Management </H3>
+<!--docid::SEC38::-->
+<P>
+
+<A NAME="IDX273"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_prep_terminal</B> <I>(int meta_flag)</I>
+<DD>Modify the terminal settings for Readline's use, so <CODE>readline()</CODE>
+can read a single character at a time from the keyboard.
+The <VAR>meta_flag</VAR> argument should be non-zero if Readline should
+read eight-bit input.
+</DL>
+</P><P>
+
+<A NAME="IDX274"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_deprep_terminal</B> <I>(void)</I>
+<DD>Undo the effects of <CODE>rl_prep_terminal()</CODE>, leaving the terminal in
+the state in which it was before the most recent call to
+<CODE>rl_prep_terminal()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX275"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_tty_set_default_bindings</B> <I>(Keymap kmap)</I>
+<DD>Read the operating system's terminal editing characters (as would be
+displayed by <CODE>stty</CODE>) to their Readline equivalents.
+The bindings are performed in <VAR>kmap</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX276"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_tty_unset_default_bindings</B> <I>(Keymap kmap)</I>
+<DD>Reset the bindings manipulated by <CODE>rl_tty_set_default_bindings</CODE> so
+that the terminal editing characters are bound to <CODE>rl_insert</CODE>.
+The bindings are performed in <VAR>kmap</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX277"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_reset_terminal</B> <I>(const char *terminal_name)</I>
+<DD>Reinitialize Readline's idea of the terminal settings using
+<VAR>terminal_name</VAR> as the terminal type (e.g., <CODE>vt100</CODE>).
+If <VAR>terminal_name</VAR> is <CODE>NULL</CODE>, the value of the <CODE>TERM</CODE>
+environment variable is used.
+</DL>
+</P><P>
+
+<A NAME="Utility Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC39"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC38"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC40"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.10 Utility Functions </H3>
+<!--docid::SEC39::-->
+<P>
+
+<A NAME="IDX278"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_replace_line</B> <I>(const char *text, int clear_undo)</I>
+<DD>Replace the contents of <CODE>rl_line_buffer</CODE> with <VAR>text</VAR>.
+The point and mark are preserved, if possible.
+If <VAR>clear_undo</VAR> is non-zero, the undo list associated with the
+current line is cleared.
+</DL>
+</P><P>
+
+<A NAME="IDX279"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_extend_line_buffer</B> <I>(int len)</I>
+<DD>Ensure that <CODE>rl_line_buffer</CODE> has enough space to hold <VAR>len</VAR>
+characters, possibly reallocating it if necessary.
+</DL>
+</P><P>
+
+<A NAME="IDX280"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_initialize</B> <I>(void)</I>
+<DD>Initialize or re-initialize Readline's internal state.
+It's not strictly necessary to call this; <CODE>readline()</CODE> calls it before
+reading any input.
+</DL>
+</P><P>
+
+<A NAME="IDX281"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_ding</B> <I>(void)</I>
+<DD>Ring the terminal bell, obeying the setting of <CODE>bell-style</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX282"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_alphabetic</B> <I>(int c)</I>
+<DD>Return 1 if <VAR>c</VAR> is an alphabetic character.
+</DL>
+</P><P>
+
+<A NAME="IDX283"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_display_match_list</B> <I>(char **matches, int len, int max)</I>
+<DD>A convenience function for displaying a list of strings in
+columnar format on Readline's output stream.  <CODE>matches</CODE> is the list
+of strings, in argv format, such as a list of completion matches.
+<CODE>len</CODE> is the number of strings in <CODE>matches</CODE>, and <CODE>max</CODE>
+is the length of the longest string in <CODE>matches</CODE>.  This function uses
+the setting of <CODE>print-completions-horizontally</CODE> to select how the
+matches are displayed (see section <A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A>).
+</DL>
+</P><P>
+
+The following are implemented as macros, defined in <CODE>chardefs.h</CODE>.
+Applications should refrain from using them.
+</P><P>
+
+<A NAME="IDX284"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_uppercase_p</B> <I>(int c)</I>
+<DD>Return 1 if <VAR>c</VAR> is an uppercase alphabetic character.
+</DL>
+</P><P>
+
+<A NAME="IDX285"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_lowercase_p</B> <I>(int c)</I>
+<DD>Return 1 if <VAR>c</VAR> is a lowercase alphabetic character.
+</DL>
+</P><P>
+
+<A NAME="IDX286"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_digit_p</B> <I>(int c)</I>
+<DD>Return 1 if <VAR>c</VAR> is a numeric character.
+</DL>
+</P><P>
+
+<A NAME="IDX287"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_to_upper</B> <I>(int c)</I>
+<DD>If <VAR>c</VAR> is a lowercase alphabetic character, return the corresponding
+uppercase character.
+</DL>
+</P><P>
+
+<A NAME="IDX288"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_to_lower</B> <I>(int c)</I>
+<DD>If <VAR>c</VAR> is an uppercase alphabetic character, return the corresponding
+lowercase character.
+</DL>
+</P><P>
+
+<A NAME="IDX289"></A>
+<DL>
+<DT><U>Function:</U> int <B>_rl_digit_value</B> <I>(int c)</I>
+<DD>If <VAR>c</VAR> is a number, return the value it represents.
+</DL>
+</P><P>
+
+<A NAME="Miscellaneous Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC40"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC39"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC41"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.11 Miscellaneous Functions </H3>
+<!--docid::SEC40::-->
+<P>
+
+<A NAME="IDX290"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_macro_bind</B> <I>(const char *keyseq, const char *macro, Keymap map)</I>
+<DD>Bind the key sequence <VAR>keyseq</VAR> to invoke the macro <VAR>macro</VAR>.
+The binding is performed in <VAR>map</VAR>.  When <VAR>keyseq</VAR> is invoked, the
+<VAR>macro</VAR> will be inserted into the line.  This function is deprecated;
+use <CODE>rl_generic_bind()</CODE> instead.
+</DL>
+</P><P>
+
+<A NAME="IDX291"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_macro_dumper</B> <I>(int readable)</I>
+<DD>Print the key sequences bound to macros and their values, using
+the current keymap, to <CODE>rl_outstream</CODE>.
+If <VAR>readable</VAR> is non-zero, the list is formatted in such a way
+that it can be made part of an <CODE>inputrc</CODE> file and re-read.
+</DL>
+</P><P>
+
+<A NAME="IDX292"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_variable_bind</B> <I>(const char *variable, const char *value)</I>
+<DD>Make the Readline variable <VAR>variable</VAR> have <VAR>value</VAR>.
+This behaves as if the readline command
+<SAMP>`set <VAR>variable</VAR> <VAR>value</VAR>'</SAMP> had been executed in an <CODE>inputrc</CODE>
+file (see section <A HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A>).
+</DL>
+</P><P>
+
+<A NAME="IDX293"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_variable_dumper</B> <I>(int readable)</I>
+<DD>Print the readline variable names and their current values
+to <CODE>rl_outstream</CODE>.
+If <VAR>readable</VAR> is non-zero, the list is formatted in such a way
+that it can be made part of an <CODE>inputrc</CODE> file and re-read.
+</DL>
+</P><P>
+
+<A NAME="IDX294"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_paren_blink_timeout</B> <I>(int u)</I>
+<DD>Set the time interval (in microseconds) that Readline waits when showing
+a balancing character when <CODE>blink-matching-paren</CODE> has been enabled.
+</DL>
+</P><P>
+
+<A NAME="IDX295"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_get_termcap</B> <I>(const char *cap)</I>
+<DD>Retrieve the string value of the termcap capability <VAR>cap</VAR>.
+Readline fetches the termcap entry for the current terminal name and
+uses those capabilities to move around the screen line and perform other
+terminal-specific operations, like erasing a line.  Readline does not
+use all of a terminal's capabilities, and this function will return
+values for only those capabilities Readline uses.
+</DL>
+</P><P>
+
+<A NAME="Alternate Interface"></A>
+<HR SIZE="6">
+<A NAME="SEC41"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC40"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC42"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.12 Alternate Interface </H3>
+<!--docid::SEC41::-->
+<P>
+
+An alternate interface is available to plain <CODE>readline()</CODE>.  Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to <CODE>select()</CODE>
+on various file descriptors.  To accomodate this need, readline can
+also be invoked as a `callback' function from an event loop.  There
+are functions available to make this easy.
+</P><P>
+
+<A NAME="IDX296"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_handler_install</B> <I>(const char *prompt, rl_vcpfunc_t *lhandler)</I>
+<DD>Set up the terminal for readline I/O and display the initial
+expanded value of <VAR>prompt</VAR>.  Save the value of <VAR>lhandler</VAR> to
+use as a function to call when a complete line of input has been entered.
+The function takes the text of the line as an argument.
+</DL>
+</P><P>
+
+<A NAME="IDX297"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_read_char</B> <I>(void)</I>
+<DD>Whenever an application determines that keyboard input is available, it
+should call <CODE>rl_callback_read_char()</CODE>, which will read the next
+character from the current input source.
+If that character completes the line, <CODE>rl_callback_read_char</CODE> will
+invoke the <VAR>lhandler</VAR> function saved by <CODE>rl_callback_handler_install</CODE>
+to process the line.
+Before calling the <VAR>lhandler</VAR> function, the terminal settings are
+reset to the values they had before calling
+<CODE>rl_callback_handler_install</CODE>.
+If the <VAR>lhandler</VAR> function returns,
+the terminal settings are modified for Readline's use again.
+<CODE>EOF</CODE> is  indicated by calling <VAR>lhandler</VAR> with a
+<CODE>NULL</CODE> line.
+</DL>
+</P><P>
+
+<A NAME="IDX298"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_callback_handler_remove</B> <I>(void)</I>
+<DD>Restore the terminal to its initial state and remove the line handler.
+This may be called from within a callback as well as independently.
+If the <VAR>lhandler</VAR> installed by <CODE>rl_callback_handler_install</CODE>
+does not exit the program, either this function or the function referred
+to by the value of <CODE>rl_deprep_term_function</CODE> should be called before
+the program exits to reset the terminal settings.
+</DL>
+</P><P>
+
+<A NAME="A Readline Example"></A>
+<HR SIZE="6">
+<A NAME="SEC42"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC41"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC31"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC29"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.4.13 A Readline Example </H3>
+<!--docid::SEC42::-->
+<P>
+
+Here is a function which changes lowercase characters to their uppercase
+equivalents, and uppercase characters to lowercase.  If
+this function was bound to <SAMP>`M-c'</SAMP>, then typing <SAMP>`M-c'</SAMP> would
+change the case of the character under point.  Typing <SAMP>`M-1 0 M-c'</SAMP>
+would change the case of the following 10 characters, leaving the cursor on
+the last character changed.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>/* Invert the case of the COUNT following characters. */
+int
+invert_case_line (count, key)
+     int count, key;
+{
+  register int start, end, i;
+
+  start = rl_point;
+
+  if (rl_point &#62;= rl_end)
+    return (0);
+
+  if (count &#60; 0)
+    {
+      direction = -1;
+      count = -count;
+    }
+  else
+    direction = 1;
+      
+  /* Find the end of the range to modify. */
+  end = start + (count * direction);
+
+  /* Force it to be within range. */
+  if (end &#62; rl_end)
+    end = rl_end;
+  else if (end &#60; 0)
+    end = 0;
+
+  if (start == end)
+    return (0);
+
+  if (start &#62; end)
+    {
+      int temp = start;
+      start = end;
+      end = temp;
+    }
+
+  /* Tell readline that we are modifying the line,
+     so it will save the undo information. */
+  rl_modifying (start, end);
+
+  for (i = start; i != end; i++)
+    {
+      if (_rl_uppercase_p (rl_line_buffer[i]))
+        rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+      else if (_rl_lowercase_p (rl_line_buffer[i]))
+        rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+    }
+  /* Move point to on top of the last character changed. */
+  rl_point = (direction == 1) ? end - 1 : start;
+  return (0);
+}
+</pre></td></tr></table></P><P>
+
+<A NAME="Readline Signal Handling"></A>
+<HR SIZE="6">
+<A NAME="SEC43"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC42"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.5 Readline Signal Handling </H2>
+<!--docid::SEC43::-->
+<P>
+
+Signals are asynchronous events sent to a process by the Unix kernel,
+sometimes on behalf of another process.  They are intended to indicate
+exceptional events, like a user pressing the interrupt key on his terminal,
+or a network connection being broken.  There is a class of signals that can
+be sent to the process currently reading input from the keyboard.  Since
+Readline changes the terminal attributes when it is called, it needs to
+perform special processing when such a signal is received in order to
+restore the terminal to a sane state, or provide application writers with
+functions to do so manually. 
+</P><P>
+
+Readline contains an internal signal handler that is installed for a
+number of signals (<CODE>SIGINT</CODE>, <CODE>SIGQUIT</CODE>, <CODE>SIGTERM</CODE>,
+<CODE>SIGALRM</CODE>, <CODE>SIGTSTP</CODE>, <CODE>SIGTTIN</CODE>, and <CODE>SIGTTOU</CODE>).
+When one of these signals is received, the signal handler
+will reset the terminal attributes to those that were in effect before
+<CODE>readline()</CODE> was called, reset the signal handling to what it was
+before <CODE>readline()</CODE> was called, and resend the signal to the calling
+application.
+If and when the calling application's signal handler returns, Readline
+will reinitialize the terminal and continue to accept input.
+When a <CODE>SIGINT</CODE> is received, the Readline signal handler performs
+some additional work, which will cause any partially-entered line to be
+aborted (see the description of <CODE>rl_free_line_state()</CODE> below).
+</P><P>
+
+There is an additional Readline signal handler, for <CODE>SIGWINCH</CODE>, which
+the kernel sends to a process whenever the terminal's size changes (for
+example, if a user resizes an <CODE>xterm</CODE>).  The Readline <CODE>SIGWINCH</CODE>
+handler updates Readline's internal screen size information, and then calls
+any <CODE>SIGWINCH</CODE> signal handler the calling application has installed. 
+Readline calls the application's <CODE>SIGWINCH</CODE> signal handler without
+resetting the terminal to its original state.  If the application's signal
+handler does more than update its idea of the terminal size and return (for
+example, a <CODE>longjmp</CODE> back to a main processing loop), it <EM>must</EM>
+call <CODE>rl_cleanup_after_signal()</CODE> (described below), to restore the
+terminal state. 
+</P><P>
+
+Readline provides two variables that allow application writers to
+control whether or not it will catch certain signals and act on them
+when they are received.  It is important that applications change the
+values of these variables only when calling <CODE>readline()</CODE>, not in
+a signal handler, so Readline's internal signal state is not corrupted.
+</P><P>
+
+<A NAME="IDX299"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_catch_signals</B>
+<DD>If this variable is non-zero, Readline will install signal handlers for
+<CODE>SIGINT</CODE>, <CODE>SIGQUIT</CODE>, <CODE>SIGTERM</CODE>, <CODE>SIGALRM</CODE>,
+<CODE>SIGTSTP</CODE>, <CODE>SIGTTIN</CODE>, and <CODE>SIGTTOU</CODE>.
+</P><P>
+
+The default value of <CODE>rl_catch_signals</CODE> is 1.
+</DL>
+</P><P>
+
+<A NAME="IDX300"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_catch_sigwinch</B>
+<DD>If this variable is non-zero, Readline will install a signal handler for
+<CODE>SIGWINCH</CODE>.
+</P><P>
+
+The default value of <CODE>rl_catch_sigwinch</CODE> is 1.
+</DL>
+</P><P>
+
+If an application does not wish to have Readline catch any signals, or
+to handle signals other than those Readline catches (<CODE>SIGHUP</CODE>,
+for example), 
+Readline provides convenience functions to do the necessary terminal
+and internal state cleanup upon receipt of a signal.
+</P><P>
+
+<A NAME="IDX301"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_cleanup_after_signal</B> <I>(void)</I>
+<DD>This function will reset the state of the terminal to what it was before
+<CODE>readline()</CODE> was called, and remove the Readline signal handlers for
+all signals, depending on the values of <CODE>rl_catch_signals</CODE> and
+<CODE>rl_catch_sigwinch</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX302"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_free_line_state</B> <I>(void)</I>
+<DD>This will free any partial state associated with the current input line
+(undo information, any partial history entry, any partially-entered
+keyboard macro, and any partially-entered numeric argument).  This
+should be called before <CODE>rl_cleanup_after_signal()</CODE>.  The
+Readline signal handler for <CODE>SIGINT</CODE> calls this to abort the
+current input line.
+</DL>
+</P><P>
+
+<A NAME="IDX303"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_reset_after_signal</B> <I>(void)</I>
+<DD>This will reinitialize the terminal and reinstall any Readline signal
+handlers, depending on the values of <CODE>rl_catch_signals</CODE> and
+<CODE>rl_catch_sigwinch</CODE>.
+</DL>
+</P><P>
+
+If an application does not wish Readline to catch <CODE>SIGWINCH</CODE>, it may
+call <CODE>rl_resize_terminal()</CODE> or <CODE>rl_set_screen_size()</CODE> to force
+Readline to update its idea of the terminal size when a <CODE>SIGWINCH</CODE>
+is received.
+</P><P>
+
+<A NAME="IDX304"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_resize_terminal</B> <I>(void)</I>
+<DD>Update Readline's internal screen size by reading values from the kernel.
+</DL>
+</P><P>
+
+<A NAME="IDX305"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_set_screen_size</B> <I>(int rows, int cols)</I>
+<DD>Set Readline's idea of the terminal size to <VAR>rows</VAR> rows and
+<VAR>cols</VAR> columns.
+</DL>
+</P><P>
+
+If an application does not want to install a <CODE>SIGWINCH</CODE> handler, but
+is still interested in the screen dimensions, Readline's idea of the screen
+size may be queried.
+</P><P>
+
+<A NAME="IDX306"></A>
+<DL>
+<DT><U>Function:</U> void <B>rl_get_screen_size</B> <I>(int *rows, int *cols)</I>
+<DD>Return Readline's idea of the terminal's size in the
+variables pointed to by the arguments.
+</DL>
+</P><P>
+
+The following functions install and remove Readline's signal handlers.
+</P><P>
+
+<A NAME="IDX307"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_set_signals</B> <I>(void)</I>
+<DD>Install Readline's signal handler for <CODE>SIGINT</CODE>, <CODE>SIGQUIT</CODE>,
+<CODE>SIGTERM</CODE>, <CODE>SIGALRM</CODE>, <CODE>SIGTSTP</CODE>, <CODE>SIGTTIN</CODE>,
+<CODE>SIGTTOU</CODE>, and <CODE>SIGWINCH</CODE>, depending on the values of
+<CODE>rl_catch_signals</CODE> and <CODE>rl_catch_sigwinch</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX308"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_clear_signals</B> <I>(void)</I>
+<DD>Remove all of the Readline signal handlers installed by
+<CODE>rl_set_signals()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="Custom Completers"></A>
+<HR SIZE="6">
+<A NAME="SEC44"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC43"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC45"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 2.6 Custom Completers </H2>
+<!--docid::SEC44::-->
+<P>
+
+Typically, a program that reads commands from the user has a way of
+disambiguating commands and data.  If your program is one of these, then
+it can provide completion for commands, data, or both.
+The following sections describe how your program and Readline
+cooperate to provide this service.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC45">2.6.1 How Completing Works</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The logic used to do completion.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC46">2.6.2 Completion Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Functions provided by Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC47">2.6.3 Completion Variables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Variables which control completion.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC48">2.6.4 A Short Completion Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example of writing completer subroutines.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="How Completing Works"></A>
+<HR SIZE="6">
+<A NAME="SEC45"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC46"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.6.1 How Completing Works </H3>
+<!--docid::SEC45::-->
+<P>
+
+In order to complete some text, the full list of possible completions
+must be available.  That is, it is not possible to accurately
+expand a partial word without knowing all of the possible words
+which make sense in that context.  The Readline library provides
+the user interface to completion, and two of the most common
+completion functions:  filename and username.  For completing other types
+of text, you must write your own completion function.  This section
+describes exactly what such functions must do, and provides an example.
+</P><P>
+
+There are three major functions used to perform completion:
+</P><P>
+
+<OL>
+<LI>
+The user-interface function <CODE>rl_complete()</CODE>.  This function is
+called with the same arguments as other bindable Readline functions:
+<VAR>count</VAR> and <VAR>invoking_key</VAR>.
+It isolates the word to be completed and calls
+<CODE>rl_completion_matches()</CODE> to generate a list of possible completions.
+It then either lists the possible completions, inserts the possible
+completions, or actually performs the
+completion, depending on which behavior is desired.
+<P>
+
+<LI>
+The internal function <CODE>rl_completion_matches()</CODE> uses an
+application-supplied <EM>generator</EM> function to generate the list of
+possible matches, and then returns the array of these matches.
+The caller should place the address of its generator function in
+<CODE>rl_completion_entry_function</CODE>.
+<P>
+
+<LI>
+The generator function is called repeatedly from
+<CODE>rl_completion_matches()</CODE>, returning a string each time.  The
+arguments to the generator function are <VAR>text</VAR> and <VAR>state</VAR>.
+<VAR>text</VAR> is the partial word to be completed.  <VAR>state</VAR> is zero the
+first time the function is called, allowing the generator to perform
+any necessary initialization, and a positive non-zero integer for
+each subsequent call.  The generator function returns
+<CODE>(char *)NULL</CODE> to inform <CODE>rl_completion_matches()</CODE> that there are
+no more possibilities left.  Usually the generator function computes the
+list of possible completions when <VAR>state</VAR> is zero, and returns them
+one at a time on subsequent calls.  Each string the generator function
+returns as a match must be allocated with <CODE>malloc()</CODE>; Readline
+frees the strings when it has finished with them.
+Such a generator function is referred to as an
+<EM>application-specific completion function</EM>.
+<P>
+
+</OL>
+<P>
+
+<A NAME="IDX309"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete</B> <I>(int ignore, int invoking_key)</I>
+<DD>Complete the word at or before point.  You have supplied the function
+that does the initial simple matching selection algorithm (see
+<CODE>rl_completion_matches()</CODE>).  The default is to do filename completion.
+</DL>
+</P><P>
+
+<A NAME="IDX310"></A>
+<DL>
+<DT><U>Variable:</U> rl_compentry_func_t * <B>rl_completion_entry_function</B>
+<DD>This is a pointer to the generator function for
+<CODE>rl_completion_matches()</CODE>.
+If the value of <CODE>rl_completion_entry_function</CODE> is
+<CODE>NULL</CODE> then the default filename generator
+function, <CODE>rl_filename_completion_function()</CODE>, is used.
+An <EM>application-specific completion function</EM> is a function whose
+address is assigned to <CODE>rl_completion_entry_function</CODE> and whose
+return values are used to  generate possible completions.
+</DL>
+</P><P>
+
+<A NAME="Completion Functions"></A>
+<HR SIZE="6">
+<A NAME="SEC46"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC45"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC47"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC47"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.6.2 Completion Functions </H3>
+<!--docid::SEC46::-->
+<P>
+
+Here is the complete list of callable completion functions present in
+Readline.
+</P><P>
+
+<A NAME="IDX311"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete_internal</B> <I>(int what_to_do)</I>
+<DD>Complete the word at or before point.  <VAR>what_to_do</VAR> says what to do
+with the completion.  A value of <SAMP>`?'</SAMP> means list the possible
+completions.  <SAMP>`TAB'</SAMP> means do standard completion.  <SAMP>`*'</SAMP> means
+insert all of the possible completions.  <SAMP>`!'</SAMP> means to display
+all of the possible completions, if there is more than one, as well as
+performing partial completion.  <SAMP>`@'</SAMP> is similar to <SAMP>`!'</SAMP>, but
+possible completions are not listed if the possible completions share
+a common prefix.
+</DL>
+</P><P>
+
+<A NAME="IDX312"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_complete</B> <I>(int ignore, int invoking_key)</I>
+<DD>Complete the word at or before point.  You have supplied the function
+that does the initial simple matching selection algorithm (see
+<CODE>rl_completion_matches()</CODE> and <CODE>rl_completion_entry_function</CODE>).
+The default is to do filename
+completion.  This calls <CODE>rl_complete_internal()</CODE> with an
+argument depending on <VAR>invoking_key</VAR>.
+</DL>
+</P><P>
+
+<A NAME="IDX313"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_possible_completions</B> <I>(int count, int invoking_key)</I>
+<DD>List the possible completions.  See description of <CODE>rl_complete
+()</CODE>.  This calls <CODE>rl_complete_internal()</CODE> with an argument of
+<SAMP>`?'</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX314"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_insert_completions</B> <I>(int count, int invoking_key)</I>
+<DD>Insert the list of possible completions into the line, deleting the
+partially-completed word.  See description of <CODE>rl_complete()</CODE>.
+This calls <CODE>rl_complete_internal()</CODE> with an argument of <SAMP>`*'</SAMP>.
+</DL>
+</P><P>
+
+<A NAME="IDX315"></A>
+<DL>
+<DT><U>Function:</U> int <B>rl_completion_mode</B> <I>(rl_command_func_t *cfunc)</I>
+<DD>Returns the apppriate value to pass to <CODE>rl_complete_internal()</CODE>
+depending on whether <VAR>cfunc</VAR> was called twice in succession and
+the values of the <CODE>show-all-if-ambiguous</CODE> and
+<CODE>show-all-if-unmodified</CODE> variables.
+Application-specific completion functions may use this function to present
+the same interface as <CODE>rl_complete()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX316"></A>
+<DL>
+<DT><U>Function:</U> char ** <B>rl_completion_matches</B> <I>(const char *text, rl_compentry_func_t *entry_func)</I>
+<DD>Returns an array of strings which is a list of completions for
+<VAR>text</VAR>.  If there are no completions, returns <CODE>NULL</CODE>.
+The first entry in the returned array is the substitution for <VAR>text</VAR>.
+The remaining entries are the possible completions.  The array is
+terminated with a <CODE>NULL</CODE> pointer.
+</P><P>
+
+<VAR>entry_func</VAR> is a function of two args, and returns a
+<CODE>char *</CODE>.  The first argument is <VAR>text</VAR>.  The second is a
+state argument; it is zero on the first call, and non-zero on subsequent
+calls.  <VAR>entry_func</VAR> returns a <CODE>NULL</CODE>  pointer to the caller
+when there are no more matches.
+</DL>
+</P><P>
+
+<A NAME="IDX317"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_filename_completion_function</B> <I>(const char *text, int state)</I>
+<DD>A generator function for filename completion in the general case.
+<VAR>text</VAR> is a partial filename.
+The Bash source is a useful reference for writing application-specific
+completion functions (the Bash completion functions call this and other
+Readline functions).
+</DL>
+</P><P>
+
+<A NAME="IDX318"></A>
+<DL>
+<DT><U>Function:</U> char * <B>rl_username_completion_function</B> <I>(const char *text, int state)</I>
+<DD>A completion generator for usernames.  <VAR>text</VAR> contains a partial
+username preceded by a random character (usually <SAMP>`~'</SAMP>).  As with all
+completion generators, <VAR>state</VAR> is zero on the first call and non-zero
+for subsequent calls.
+</DL>
+</P><P>
+
+<A NAME="Completion Variables"></A>
+<HR SIZE="6">
+<A NAME="SEC47"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC46"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC48"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC48"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.6.3 Completion Variables </H3>
+<!--docid::SEC47::-->
+<P>
+
+<A NAME="IDX319"></A>
+<DL>
+<DT><U>Variable:</U> rl_compentry_func_t * <B>rl_completion_entry_function</B>
+<DD>A pointer to the generator function for <CODE>rl_completion_matches()</CODE>.
+<CODE>NULL</CODE> means to use <CODE>rl_filename_completion_function()</CODE>,
+the default filename completer.
+</DL>
+</P><P>
+
+<A NAME="IDX320"></A>
+<DL>
+<DT><U>Variable:</U> rl_completion_func_t * <B>rl_attempted_completion_function</B>
+<DD>A pointer to an alternative function to create matches.
+The function is called with <VAR>text</VAR>, <VAR>start</VAR>, and <VAR>end</VAR>.
+<VAR>start</VAR> and <VAR>end</VAR> are indices in <CODE>rl_line_buffer</CODE> defining
+the boundaries of <VAR>text</VAR>, which is a character string.
+If this function exists and returns <CODE>NULL</CODE>, or if this variable is
+set to <CODE>NULL</CODE>, then <CODE>rl_complete()</CODE> will call the value of
+<CODE>rl_completion_entry_function</CODE> to generate matches, otherwise the
+array of strings returned will be used.
+If this function sets the <CODE>rl_attempted_completion_over</CODE>
+variable to a non-zero value, Readline will not perform its default
+completion even if this function returns no matches.
+</DL>
+</P><P>
+
+<A NAME="IDX321"></A>
+<DL>
+<DT><U>Variable:</U> rl_quote_func_t * <B>rl_filename_quoting_function</B>
+<DD>A pointer to a function that will quote a filename in an
+application-specific fashion.  This is called if filename completion is being
+attempted and one of the characters in <CODE>rl_filename_quote_characters</CODE>
+appears in a completed filename.  The function is called with
+<VAR>text</VAR>, <VAR>match_type</VAR>, and <VAR>quote_pointer</VAR>.  The <VAR>text</VAR>
+is the filename to be quoted.  The <VAR>match_type</VAR> is either
+<CODE>SINGLE_MATCH</CODE>, if there is only one completion match, or
+<CODE>MULT_MATCH</CODE>.  Some functions use this to decide whether or not to
+insert a closing quote character.  The <VAR>quote_pointer</VAR> is a pointer
+to any opening quote character the user typed.  Some functions choose
+to reset this character.
+</DL>
+</P><P>
+
+<A NAME="IDX322"></A>
+<DL>
+<DT><U>Variable:</U> rl_dequote_func_t * <B>rl_filename_dequoting_function</B>
+<DD>A pointer to a function that will remove application-specific quoting
+characters from a filename before completion is attempted, so those
+characters do not interfere with matching the text against names in
+the filesystem.  It is called with <VAR>text</VAR>, the text of the word
+to be dequoted, and <VAR>quote_char</VAR>, which is the quoting character 
+that delimits the filename (usually <SAMP>`''</SAMP> or <SAMP>`"'</SAMP>).  If
+<VAR>quote_char</VAR> is zero, the filename was not in an embedded string.
+</DL>
+</P><P>
+
+<A NAME="IDX323"></A>
+<DL>
+<DT><U>Variable:</U> rl_linebuf_func_t * <B>rl_char_is_quoted_p</B>
+<DD>A pointer to a function to call that determines whether or not a specific
+character in the line buffer is quoted, according to whatever quoting
+mechanism the program calling Readline uses.  The function is called with
+two arguments: <VAR>text</VAR>, the text of the line, and <VAR>index</VAR>, the
+index of the character in the line.  It is used to decide whether a
+character found in <CODE>rl_completer_word_break_characters</CODE> should be
+used to break words for the completer.
+</DL>
+</P><P>
+
+<A NAME="IDX324"></A>
+<DL>
+<DT><U>Variable:</U> rl_compignore_func_t * <B>rl_ignore_some_completions_function</B>
+<DD>This function, if defined, is called by the completer when real filename
+completion is done, after all the matching names have been generated.
+It is passed a <CODE>NULL</CODE> terminated array of matches.
+The first element (<CODE>matches[0]</CODE>) is the
+maximal substring common to all matches. This function can
+re-arrange the list of matches as required, but each element deleted
+from the array must be freed.
+</DL>
+</P><P>
+
+<A NAME="IDX325"></A>
+<DL>
+<DT><U>Variable:</U> rl_icppfunc_t * <B>rl_directory_completion_hook</B>
+<DD>This function, if defined, is allowed to modify the directory portion
+of filenames Readline completes.  It is called with the address of a
+string (the current directory name) as an argument, and may modify that string.
+If the string is replaced with a new string, the old value should be freed.
+Any modified directory name should have a trailing slash.
+The modified value will be displayed as part of the completion, replacing
+the directory portion of the pathname the user typed.
+It returns an integer that should be non-zero if the function modifies
+its directory argument.
+It could be used to expand symbolic links or shell variables in pathnames.
+</DL>
+</P><P>
+
+<A NAME="IDX326"></A>
+<DL>
+<DT><U>Variable:</U> rl_compdisp_func_t * <B>rl_completion_display_matches_hook</B>
+<DD>If non-zero, then this is the address of a function to call when
+completing a word would normally display the list of possible matches.
+This function is called in lieu of Readline displaying the list.
+It takes three arguments:
+(<CODE>char **</CODE><VAR>matches</VAR>, <CODE>int</CODE> <VAR>num_matches</VAR>, <CODE>int</CODE> <VAR>max_length</VAR>)
+where <VAR>matches</VAR> is the array of matching strings,
+<VAR>num_matches</VAR> is the number of strings in that array, and
+<VAR>max_length</VAR> is the length of the longest string in that array.
+Readline provides a convenience function, <CODE>rl_display_match_list</CODE>,
+that takes care of doing the display to Readline's output stream.  That
+function may be called from this hook.
+</DL>
+</P><P>
+
+<A NAME="IDX327"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_basic_word_break_characters</B>
+<DD>The basic list of characters that signal a break between words for the
+completer routine.  The default value of this variable is the characters
+which break words for completion in Bash:
+<CODE>" \t\n\"\\'`@$>&#60;=;|&#38;{("</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX328"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_basic_quote_characters</B>
+<DD>A list of quote characters which can cause a word break.
+</DL>
+</P><P>
+
+<A NAME="IDX329"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_completer_word_break_characters</B>
+<DD>The list of characters that signal a break between words for
+<CODE>rl_complete_internal()</CODE>.  The default list is the value of
+<CODE>rl_basic_word_break_characters</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX330"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_completer_quote_characters</B>
+<DD>A list of characters which can be used to quote a substring of the line.
+Completion occurs on the entire substring, and within the substring
+<CODE>rl_completer_word_break_characters</CODE> are treated as any other character,
+unless they also appear within this list.
+</DL>
+</P><P>
+
+<A NAME="IDX331"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_filename_quote_characters</B>
+<DD>A list of characters that cause a filename to be quoted by the completer
+when they appear in a completed filename.  The default is the null string.
+</DL>
+</P><P>
+
+<A NAME="IDX332"></A>
+<DL>
+<DT><U>Variable:</U> const char * <B>rl_special_prefixes</B>
+<DD>The list of characters that are word break characters, but should be
+left in <VAR>text</VAR> when it is passed to the completion function.
+Programs can use this to help determine what kind of completing to do.
+For instance, Bash sets this variable to "$@" so that it can complete
+shell variables and hostnames.
+</DL>
+</P><P>
+
+<A NAME="IDX333"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_query_items</B>
+<DD>Up to this many items will be displayed in response to a
+possible-completions call.  After that, we ask the user if she is sure
+she wants to see them all.  The default value is 100.
+</DL>
+</P><P>
+
+<A NAME="IDX334"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_append_character</B>
+<DD>When a single completion alternative matches at the end of the command
+line, this character is appended to the inserted completion text.  The
+default is a space character (<SAMP>` '</SAMP>).  Setting this to the null
+character (<SAMP>`\0'</SAMP>) prevents anything being appended automatically.
+This can be changed in application-specific completion functions to
+provide the "most sensible word separator character" according to
+an application-specific command line syntax specification.
+</DL>
+</P><P>
+
+<A NAME="IDX335"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_suppress_append</B>
+<DD>If non-zero, <VAR>rl_completion_append_character</VAR> is not appended to
+matches at the end of the command line, as described above.  It is
+set to 0 before any application-specific completion function is called,
+and may only be changed within such a function.
+</DL>
+</P><P>
+
+<A NAME="IDX336"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_mark_symlink_dirs</B>
+<DD>If non-zero, a slash will be appended to completed filenames that are
+symbolic links to directory names, subject to the value of the
+user-settable <VAR>mark-directories</VAR> variable.
+This variable exists so that application-specific completion functions
+can override the user's global preference (set via the
+<VAR>mark-symlinked-directories</VAR> Readline variable) if appropriate.
+This variable is set to the user's preference before any
+application-specific completion function is called, so unless that
+function modifies the value, the user's preferences are honored.
+</DL>
+</P><P>
+
+<A NAME="IDX337"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_ignore_completion_duplicates</B>
+<DD>If non-zero, then duplicates in the matches are removed.
+The default is 1.
+</DL>
+</P><P>
+
+<A NAME="IDX338"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_filename_completion_desired</B>
+<DD>Non-zero means that the results of the matches are to be treated as
+filenames.  This is <EM>always</EM> zero when completion is attempted,
+and can only be changed
+within an application-specific completion function.  If it is set to a
+non-zero value by such a function, directory names have a slash appended
+and Readline attempts to quote completed filenames if they contain any
+characters in <CODE>rl_filename_quote_characters</CODE> and
+<CODE>rl_filename_quoting_desired</CODE> is set to a non-zero value.
+</DL>
+</P><P>
+
+<A NAME="IDX339"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_filename_quoting_desired</B>
+<DD>Non-zero means that the results of the matches are to be quoted using
+double quotes (or an application-specific quoting mechanism) if the
+completed filename contains any characters in
+<CODE>rl_filename_quote_chars</CODE>.  This is <EM>always</EM> non-zero
+when completion is attempted, and can only be changed within an
+application-specific completion function.
+The quoting is effected via a call to the function pointed to
+by <CODE>rl_filename_quoting_function</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX340"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_attempted_completion_over</B>
+<DD>If an application-specific completion function assigned to
+<CODE>rl_attempted_completion_function</CODE> sets this variable to a non-zero
+value, Readline will not perform its default filename completion even
+if the application's completion function returns no matches.
+It should be set only by an application's completion function.
+</DL>
+</P><P>
+
+<A NAME="IDX341"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_completion_type</B>
+<DD>Set to a character describing the type of completion Readline is currently
+attempting; see the description of <CODE>rl_complete_internal()</CODE>
+(see section <A HREF="readline.html#SEC46">2.6.2 Completion Functions</A>) for the list of characters.
+This is set to the appropriate value before any application-specific
+completion function is called, allowing such functions to present
+the same interface as <CODE>rl_complete()</CODE>.
+</DL>
+</P><P>
+
+<A NAME="IDX342"></A>
+<DL>
+<DT><U>Variable:</U> int <B>rl_inhibit_completion</B>
+<DD>If this variable is non-zero, completion is inhibited.  The completion
+character will be inserted as any other bound to <CODE>self-insert</CODE>.
+</DL>
+</P><P>
+
+<A NAME="A Short Completion Example"></A>
+<HR SIZE="6">
+<A NAME="SEC48"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC47"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC44"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 2.6.4 A Short Completion Example </H3>
+<!--docid::SEC48::-->
+<P>
+
+Here is a small application demonstrating the use of the GNU Readline
+library.  It is called <CODE>fileman</CODE>, and the source code resides in
+<TT>`examples/fileman.c'</TT>.  This sample application provides
+completion of command names, line editing features, and access to the
+history list.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>/* fileman.c -- A tiny application which demonstrates how to use the
+   GNU Readline library.  This application interactively allows users
+   to manipulate files and their modes. */
+
+#include &#60;stdio.h&#62;
+#include &#60;sys/types.h&#62;
+#include &#60;sys/file.h&#62;
+#include &#60;sys/stat.h&#62;
+#include &#60;sys/errno.h&#62;
+
+#include &#60;readline/readline.h&#62;
+#include &#60;readline/history.h&#62;
+
+extern char *xmalloc ();
+
+/* The names of functions that actually do the manipulation. */
+int com_list __P((char *));
+int com_view __P((char *));
+int com_rename __P((char *));
+int com_stat __P((char *));
+int com_pwd __P((char *));
+int com_delete __P((char *));
+int com_help __P((char *));
+int com_cd __P((char *));
+int com_quit __P((char *));
+
+/* A structure which contains information on the commands this program
+   can understand. */
+
+typedef struct {
+  char *name;                  /* User printable name of the function. */
+  rl_icpfunc_t *func;          /* Function to call to do the job. */
+  char *doc;                   /* Documentation for this function.  */
+} COMMAND;
+
+COMMAND commands[] = {
+  { "cd", com_cd, "Change to directory DIR" },
+  { "delete", com_delete, "Delete FILE" },
+  { "help", com_help, "Display this text" },
+  { "?", com_help, "Synonym for `help'" },
+  { "list", com_list, "List files in DIR" },
+  { "ls", com_list, "Synonym for `list'" },
+  { "pwd", com_pwd, "Print the current working directory" },
+  { "quit", com_quit, "Quit using Fileman" },
+  { "rename", com_rename, "Rename FILE to NEWNAME" },
+  { "stat", com_stat, "Print out statistics on FILE" },
+  { "view", com_view, "View the contents of FILE" },
+  { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+};
+
+/* Forward declarations. */
+char *stripwhite ();
+COMMAND *find_command ();
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this means the user is done using this program. */
+int done;
+
+char *
+dupstr (s)
+     int s;
+{
+  char *r;
+
+  r = xmalloc (strlen (s) + 1);
+  strcpy (r, s);
+  return (r);
+}
+
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  char *line, *s;
+
+  progname = argv[0];
+
+  initialize_readline ();      /* Bind our completer. */
+
+  /* Loop reading and executing lines until the user quits. */
+  for ( ; done == 0; )
+    {
+      line = readline ("FileMan: ");
+
+      if (!line)
+        break;
+
+      /* Remove leading and trailing whitespace from the line.
+         Then, if there is anything left, add it to the history list
+         and execute it. */
+      s = stripwhite (line);
+
+      if (*s)
+        {
+          add_history (s);
+          execute_line (s);
+        }
+
+      free (line);
+    }
+  exit (0);
+}
+
+/* Execute a command line. */
+int
+execute_line (line)
+     char *line;
+{
+  register int i;
+  COMMAND *command;
+  char *word;
+
+  /* Isolate the command word. */
+  i = 0;
+  while (line[i] &#38;&#38; whitespace (line[i]))
+    i++;
+  word = line + i;
+
+  while (line[i] &#38;&#38; !whitespace (line[i]))
+    i++;
+
+  if (line[i])
+    line[i++] = '\0';
+
+  command = find_command (word);
+
+  if (!command)
+    {
+      fprintf (stderr, "%s: No such command for FileMan.\n", word);
+      return (-1);
+    }
+
+  /* Get argument to command, if any. */
+  while (whitespace (line[i]))
+    i++;
+
+  word = line + i;
+
+  /* Call the function. */
+  return ((*(command-&#62;func)) (word));
+}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+   command.  Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+     char *name;
+{
+  register int i;
+
+  for (i = 0; commands[i].name; i++)
+    if (strcmp (name, commands[i].name) == 0)
+      return (&#38;commands[i]);
+
+  return ((COMMAND *)NULL);
+}
+
+/* Strip whitespace from the start and end of STRING.  Return a pointer
+   into STRING. */
+char *
+stripwhite (string)
+     char *string;
+{
+  register char *s, *t;
+
+  for (s = string; whitespace (*s); s++)
+    ;
+    
+  if (*s == 0)
+    return (s);
+
+  t = s + strlen (s) - 1;
+  while (t &#62; s &#38;&#38; whitespace (*t))
+    t--;
+  *++t = '\0';
+
+  return s;
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                  Interface to Readline Completion                */
+/*                                                                  */
+/* **************************************************************** */
+
+char *command_generator __P((const char *, int));
+char **fileman_completion __P((const char *, int, int));
+
+/* Tell the GNU Readline library how to complete.  We want to try to
+   complete on command names if this is the first word in the line, or
+   on filenames if not. */
+initialize_readline ()
+{
+  /* Allow conditional parsing of the ~/.inputrc file. */
+  rl_readline_name = "FileMan";
+
+  /* Tell the completer that we want a crack first. */
+  rl_attempted_completion_function = fileman_completion;
+}
+
+/* Attempt to complete on the contents of TEXT.  START and END
+   bound the region of rl_line_buffer that contains the word to
+   complete.  TEXT is the word to complete.  We can use the entire
+   contents of rl_line_buffer in case we want to do some simple
+   parsing.  Returnthe array of matches, or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+     const char *text;
+     int start, end;
+{
+  char **matches;
+
+  matches = (char **)NULL;
+
+  /* If this word is at the start of the line, then it is a command
+     to complete.  Otherwise it is the name of a file in the current
+     directory. */
+  if (start == 0)
+    matches = rl_completion_matches (text, command_generator);
+
+  return (matches);
+}
+
+/* Generator function for command completion.  STATE lets us
+   know whether to start from scratch; without any state
+   (i.e. STATE == 0), then we start at the top of the list. */
+char *
+command_generator (text, state)
+     const char *text;
+     int state;
+{
+  static int list_index, len;
+  char *name;
+
+  /* If this is a new word to complete, initialize now.  This
+     includes saving the length of TEXT for efficiency, and
+     initializing the index variable to 0. */
+  if (!state)
+    {
+      list_index = 0;
+      len = strlen (text);
+    }
+
+  /* Return the next name which partially matches from the
+     command list. */
+  while (name = commands[list_index].name)
+    {
+      list_index++;
+
+      if (strncmp (name, text, len) == 0)
+        return (dupstr(name));
+    }
+
+  /* If no names matched, then return NULL. */
+  return ((char *)NULL);
+}
+
+/* **************************************************************** */
+/*                                                                  */
+/*                       FileMan Commands                           */
+/*                                                                  */
+/* **************************************************************** */
+
+/* String to pass to system ().  This is for the LIST, VIEW and RENAME
+   commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+     char *arg;
+{
+  if (!arg)
+    arg = "";
+
+  sprintf (syscom, "ls -FClg %s", arg);
+  return (system (syscom));
+}
+
+com_view (arg)
+     char *arg;
+{
+  if (!valid_argument ("view", arg))
+    return 1;
+
+  sprintf (syscom, "more %s", arg);
+  return (system (syscom));
+}
+
+com_rename (arg)
+     char *arg;
+{
+  too_dangerous ("rename");
+  return (1);
+}
+
+com_stat (arg)
+     char *arg;
+{
+  struct stat finfo;
+
+  if (!valid_argument ("stat", arg))
+    return (1);
+
+  if (stat (arg, &#38;finfo) == -1)
+    {
+      perror (arg);
+      return (1);
+    }
+
+  printf ("Statistics for `%s':\n", arg);
+
+  printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+          finfo.st_nlink,
+          (finfo.st_nlink == 1) ? "" : "s",
+          finfo.st_size,
+          (finfo.st_size == 1) ? "" : "s");
+  printf ("Inode Last Change at: %s", ctime (&#38;finfo.st_ctime));
+  printf ("      Last access at: %s", ctime (&#38;finfo.st_atime));
+  printf ("    Last modified at: %s", ctime (&#38;finfo.st_mtime));
+  return (0);
+}
+
+com_delete (arg)
+     char *arg;
+{
+  too_dangerous ("delete");
+  return (1);
+}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+   not present. */
+com_help (arg)
+     char *arg;
+{
+  register int i;
+  int printed = 0;
+
+  for (i = 0; commands[i].name; i++)
+    {
+      if (!*arg || (strcmp (arg, commands[i].name) == 0))
+        {
+          printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+          printed++;
+        }
+    }
+
+  if (!printed)
+    {
+      printf ("No commands match `%s'.  Possibilties are:\n", arg);
+
+      for (i = 0; commands[i].name; i++)
+        {
+          /* Print in six columns. */
+          if (printed == 6)
+            {
+              printed = 0;
+              printf ("\n");
+            }
+
+          printf ("%s\t", commands[i].name);
+          printed++;
+        }
+
+      if (printed)
+        printf ("\n");
+    }
+  return (0);
+}
+
+/* Change to the directory ARG. */
+com_cd (arg)
+     char *arg;
+{
+  if (chdir (arg) == -1)
+    {
+      perror (arg);
+      return 1;
+    }
+
+  com_pwd ("");
+  return (0);
+}
+
+/* Print out the current working directory. */
+com_pwd (ignore)
+     char *ignore;
+{
+  char dir[1024], *s;
+
+  s = getcwd (dir, sizeof(dir) - 1);
+  if (s == 0)
+    {
+      printf ("Error getting pwd: %s\n", dir);
+      return 1;
+    }
+
+  printf ("Current directory is %s\n", dir);
+  return 0;
+}
+
+/* The user wishes to quit using this program.  Just set DONE
+   non-zero. */
+com_quit (arg)
+     char *arg;
+{
+  done = 1;
+  return (0);
+}
+
+/* Function which tells you that you can't do this. */
+too_dangerous (caller)
+     char *caller;
+{
+  fprintf (stderr,
+           "%s: Too dangerous for me to distribute.\n"
+           caller);
+  fprintf (stderr, "Write it yourself.\n");
+}
+
+/* Return non-zero if ARG is a valid argument for CALLER,
+   else print an error message and return zero. */
+int
+valid_argument (caller, arg)
+     char *caller, *arg;
+{
+  if (!arg || !*arg)
+    {
+      fprintf (stderr, "%s: Argument required.\n", caller);
+      return (0);
+    }
+
+  return (1);
+}
+</FONT></pre></td></tr></table></P><P>
+
+<A NAME="Copying This Manual"></A>
+<HR SIZE="6">
+<A NAME="SEC49"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC48"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC50"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> A. Copying This Manual </H1>
+<!--docid::SEC49::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="readline.html#SEC50">A.1 GNU Free Documentation License</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">License for copying this manual.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="GNU Free Documentation License"></A>
+<HR SIZE="6">
+<A NAME="SEC50"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC51"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> A.1 GNU Free Documentation License </H2>
+<!--docid::SEC50::-->
+<P>
+
+<A NAME="IDX343"></A>
+<center>
+ Version 1.2, November 2002
+</center>
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></td></tr></table></P><P>
+
+<OL>
+<LI>
+PREAMBLE
+<P>
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document <EM>free</EM> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</P><P>
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</P><P>
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+</P><P>
+
+<LI>
+APPLICABILITY AND DEFINITIONS
+<P>
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</P><P>
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</P><P>
+
+A "Secondary Section" is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</P><P>
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+</P><P>
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</P><P>
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+</P><P>
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input
+format, <FONT SIZE="-1">SGML</FONT> or <FONT SIZE="-1">XML</FONT> using a publicly available
+<FONT SIZE="-1">DTD</FONT>, and standard-conforming simple <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> designed for human modification.  Examples
+of transparent image formats include <FONT SIZE="-1">PNG</FONT>, <FONT SIZE="-1">XCF</FONT> and
+<FONT SIZE="-1">JPG</FONT>.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <FONT SIZE="-1">SGML</FONT> or
+<FONT SIZE="-1">XML</FONT> for which the <FONT SIZE="-1">DTD</FONT> and/or processing tools are
+not generally available, and the machine-generated <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> produced by some word processors for
+output purposes only.
+</P><P>
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+</P><P>
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+</P><P>
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</P><P>
+
+<LI>
+VERBATIM COPYING
+<P>
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</P><P>
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</P><P>
+
+<LI>
+COPYING IN QUANTITY
+<P>
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</P><P>
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</P><P>
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</P><P>
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</P><P>
+
+<LI>
+MODIFICATIONS
+<P>
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+</P><P>
+
+<OL>
+<LI>
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+<P>
+
+<LI>
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+<P>
+
+<LI>
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+<P>
+
+<LI>
+Preserve all the copyright notices of the Document.
+<P>
+
+<LI>
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+<P>
+
+<LI>
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+<P>
+
+<LI>
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+<P>
+
+<LI>
+Include an unaltered copy of this License.
+<P>
+
+<LI>
+Preserve the section Entitled "History", Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled "History" in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+<P>
+
+<LI>
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the "History" section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+<P>
+
+<LI>
+For any section Entitled "Acknowledgements" or "Dedications", Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+<P>
+
+<LI>
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+<P>
+
+<LI>
+Delete any section Entitled "Endorsements".  Such a section
+may not be included in the Modified Version.
+<P>
+
+<LI>
+Do not retitle any existing section to be Entitled "Endorsements" or
+to conflict in title with any Invariant Section.
+<P>
+
+<LI>
+Preserve any Warranty Disclaimers.
+</OL>
+<P>
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+</P><P>
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</P><P>
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</P><P>
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</P><P>
+
+<LI>
+COMBINING DOCUMENTS
+<P>
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</P><P>
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</P><P>
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all
+sections Entitled "Endorsements."
+</P><P>
+
+<LI>
+COLLECTIONS OF DOCUMENTS
+<P>
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</P><P>
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</P><P>
+
+<LI>
+AGGREGATION WITH INDEPENDENT WORKS
+<P>
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</P><P>
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</P><P>
+
+<LI>
+TRANSLATION
+<P>
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</P><P>
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</P><P>
+
+<LI>
+TERMINATION
+<P>
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+</P><P>
+
+<LI>
+FUTURE REVISIONS OF THIS LICENSE
+<P>
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+</P><P>
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+</OL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC51"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC50"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC49"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC50"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> A.1.1 ADDENDUM: How to use this License for your documents </H3>
+<!--docid::SEC51::-->
+<P>
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>  Copyright (C)  <VAR>year</VAR>  <VAR>your name</VAR>.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>    with the Invariant Sections being <VAR>list their titles</VAR>, with
+    the Front-Cover Texts being <VAR>list</VAR>, and with the Back-Cover Texts
+    being <VAR>list</VAR>.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</P><P>
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</P><P>
+
+<A NAME="Concept Index"></A>
+<HR SIZE="6">
+<A NAME="SEC52"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC51"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC53"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Concept Index </H1>
+<!--docid::SEC52::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="readline.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC44">application-specific completion functions</A></TD><TD valign=top><A HREF="rlman.html#SEC44">2.6 Custom Completers</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC4">command editing</A></TD><TD valign=top><A HREF="rlman.html#SEC4">1.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC4">editing command lines</A></TD><TD valign=top><A HREF="rlman.html#SEC4">1.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX343">FDL, GNU Free Documentation License</A></TD><TD valign=top><A HREF="rlman.html#SEC50">A.1 GNU Free Documentation License</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC9">initialization file, readline</A></TD><TD valign=top><A HREF="rlman.html#SEC9">1.3 Readline Init File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC3">interaction, readline</A></TD><TD valign=top><A HREF="rlman.html#SEC3">1.2 Readline Interaction</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX3">kill ring</A></TD><TD valign=top><A HREF="rlman.html#SEC6">1.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX1">killing text</A></TD><TD valign=top><A HREF="rlman.html#SEC6">1.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#SEC4">notation, readline</A></TD><TD valign=top><A HREF="rlman.html#SEC4">1.2.1 Readline Bare Essentials</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX176">readline, function</A></TD><TD valign=top><A HREF="rlman.html#SEC24">2.1 Basic Behavior</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_V"></A>V</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX4">variables, readline</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_Y"></A>Y</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX2">yanking text</A></TD><TD valign=top><A HREF="rlman.html#SEC6">1.2.3 Readline Killing Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="readline.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="readline.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<A NAME="Function and Variable Index"></A>
+<HR SIZE="6">
+<A NAME="SEC53"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> Function and Variable Index </H1>
+<!--docid::SEC53::-->
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="readline.html#fn__" style="text-decoration:none"><b>_</b></A>
+ &nbsp; 
+<BR>
+<A HREF="readline.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn__"></A>_</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX286"><CODE>_rl_digit_p</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX289"><CODE>_rl_digit_value</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX285"><CODE>_rl_lowercase_p</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX288"><CODE>_rl_to_lower</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX287"><CODE>_rl_to_upper</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX284"><CODE>_rl_uppercase_p</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX143"><CODE>abort (C-g)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX144"><CODE>abort (C-g)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX43"><CODE>accept-line (Newline or Return)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX44"><CODE>accept-line (Newline or Return)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX33"><CODE>backward-char (C-b)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX34"><CODE>backward-char (C-b)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX71"><CODE>backward-delete-char (Rubout)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX72"><CODE>backward-delete-char (Rubout)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX95"><CODE>backward-kill-line (C-x Rubout)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX96"><CODE>backward-kill-line (C-x Rubout)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX103"><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX104"><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX37"><CODE>backward-word (M-b)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX38"><CODE>backward-word (M-b)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX49"><CODE>beginning-of-history (M-&#38;#60;)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX50"><CODE>beginning-of-history (M-&#38;#60;)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX27"><CODE>beginning-of-line (C-a)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX28"><CODE>beginning-of-line (C-a)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX5">bell-style</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX139"><CODE>call-last-kbd-macro (C-x e)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX140"><CODE>call-last-kbd-macro (C-x e)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX89"><CODE>capitalize-word (M-c)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX90"><CODE>capitalize-word (M-c)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX159"><CODE>character-search (C-])</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX160"><CODE>character-search (C-])</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX161"><CODE>character-search-backward (M-C-])</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX162"><CODE>character-search-backward (M-C-])</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX39"><CODE>clear-screen (C-l)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX40"><CODE>clear-screen (C-l)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX6">comment-begin</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX125"><CODE>complete (<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX126"><CODE>complete (<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX7">completion-query-items</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX8">convert-meta</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX113"><CODE>copy-backward-word ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX114"><CODE>copy-backward-word ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX115"><CODE>copy-forward-word ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX116"><CODE>copy-forward-word ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX111"><CODE>copy-region-as-kill ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX112"><CODE>copy-region-as-kill ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX69"><CODE>delete-char (C-d)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX70"><CODE>delete-char (C-d)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX133"><CODE>delete-char-or-list ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX134"><CODE>delete-char-or-list ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX107"><CODE>delete-horizontal-space ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX108"><CODE>delete-horizontal-space ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX121"><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, &#60;small&#62;...&#60;/small&#62; <KBD>M--</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX122"><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, &#60;small&#62;...&#60;/small&#62; <KBD>M--</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX9">disable-completion</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX145"><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX146"><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX87"><CODE>downcase-word (M-l)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX88"><CODE>downcase-word (M-l)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX165"><CODE>dump-functions ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX166"><CODE>dump-functions ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX169"><CODE>dump-macros ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX170"><CODE>dump-macros ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX167"><CODE>dump-variables ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX168"><CODE>dump-variables ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX10">editing-mode</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX171"><CODE>emacs-editing-mode (C-e)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX172"><CODE>emacs-editing-mode (C-e)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX11">enable-keypad</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX137"><CODE>end-kbd-macro (C-x ))</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX138"><CODE>end-kbd-macro (C-x ))</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX51"><CODE>end-of-history (M-&#38;#62;)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX52"><CODE>end-of-history (M-&#38;#62;)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX29"><CODE>end-of-line (C-e)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX30"><CODE>end-of-line (C-e)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX157"><CODE>exchange-point-and-mark (C-x C-x)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX158"><CODE>exchange-point-and-mark (C-x C-x)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX12">expand-tilde</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX73"><CODE>forward-backward-delete-char ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX74"><CODE>forward-backward-delete-char ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX31"><CODE>forward-char (C-f)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX32"><CODE>forward-char (C-f)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX55"><CODE>forward-search-history (C-s)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX56"><CODE>forward-search-history (C-s)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX35"><CODE>forward-word (M-f)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX36"><CODE>forward-word (M-f)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX13">history-preserve-point</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX63"><CODE>history-search-backward ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX64"><CODE>history-search-backward ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX61"><CODE>history-search-forward ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX62"><CODE>history-search-forward ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX14">horizontal-scroll-mode</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX15">input-meta</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX163"><CODE>insert-comment (M-#)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX164"><CODE>insert-comment (M-#)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX129"><CODE>insert-completions (M-*)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX130"><CODE>insert-completions (M-*)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX17">isearch-terminators</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX18">keymap</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX93"><CODE>kill-line (C-k)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX94"><CODE>kill-line (C-k)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX109"><CODE>kill-region ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX110"><CODE>kill-region ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX99"><CODE>kill-whole-line ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX100"><CODE>kill-whole-line ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX101"><CODE>kill-word (M-d)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX102"><CODE>kill-word (M-d)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_M"></A>M</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX19">mark-modified-lines</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX20">mark-symlinked-directories</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX21">match-hidden-files</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX131"><CODE>menu-complete ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX132"><CODE>menu-complete ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX16">meta-flag</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX47"><CODE>next-history (C-n)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX48"><CODE>next-history (C-n)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX59"><CODE>non-incremental-forward-search-history (M-n)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX60"><CODE>non-incremental-forward-search-history (M-n)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX57"><CODE>non-incremental-reverse-search-history (M-p)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX58"><CODE>non-incremental-reverse-search-history (M-p)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_O"></A>O</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX22">output-meta</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX91"><CODE>overwrite-mode ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX92"><CODE>overwrite-mode ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX23">page-completions</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX127"><CODE>possible-completions (M-?)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX128"><CODE>possible-completions (M-?)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX147"><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX148"><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX45"><CODE>previous-history (C-p)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX46"><CODE>previous-history (C-p)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Q"></A>Q</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX75"><CODE>quoted-insert (C-q or C-v)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX76"><CODE>quoted-insert (C-q or C-v)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX141"><CODE>re-read-init-file (C-x C-r)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX142"><CODE>re-read-init-file (C-x C-r)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX175"><CODE>readline</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC24">2.1 Basic Behavior</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX41"><CODE>redraw-current-line ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX42"><CODE>redraw-current-line ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC14">1.4.1 Commands For Moving</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX53"><CODE>reverse-search-history (C-r)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX54"><CODE>reverse-search-history (C-r)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX151"><CODE>revert-line (M-r)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX152"><CODE>revert-line (M-r)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX210"><CODE>rl_add_defun</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC30">2.4.1 Naming a Function</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX242"><CODE>rl_add_funmap_entry</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX245"><CODE>rl_add_undo</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX282"><CODE>rl_alphabetic</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX187">rl_already_prompted</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX320">rl_attempted_completion_function</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX340">rl_attempted_completion_over</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX328">rl_basic_quote_characters</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX327">rl_basic_word_break_characters</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX243"><CODE>rl_begin_undo_group</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX219"><CODE>rl_bind_key</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX221"><CODE>rl_bind_key_if_unbound</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX222"><CODE>rl_bind_key_if_unbound_in_map</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX220"><CODE>rl_bind_key_in_map</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX227"><CODE>rl_bind_keyseq</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX230"><CODE>rl_bind_keyseq_if_unbound</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX231"><CODE>rl_bind_keyseq_if_unbound_in_map</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX228"><CODE>rl_bind_keyseq_in_map</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX204">rl_binding_keymap</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX296"><CODE>rl_callback_handler_install</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC41">2.4.12 Alternate Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX298"><CODE>rl_callback_handler_remove</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC41">2.4.12 Alternate Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX297"><CODE>rl_callback_read_char</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC41">2.4.12 Alternate Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX299">rl_catch_signals</A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX300">rl_catch_sigwinch</A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX323">rl_char_is_quoted_p</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX301"><CODE>rl_cleanup_after_signal</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX257"><CODE>rl_clear_message</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX271"><CODE>rl_clear_pending_input</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX308"><CODE>rl_clear_signals</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX309"><CODE>rl_complete</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC45">2.6.1 How Completing Works</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX312"><CODE>rl_complete</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX311"><CODE>rl_complete_internal</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX330">rl_completer_quote_characters</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX329">rl_completer_word_break_characters</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX334">rl_completion_append_character</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX326">rl_completion_display_matches_hook</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX310">rl_completion_entry_function</A></TD><TD valign=top><A HREF="rlman.html#SEC45">2.6.1 How Completing Works</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX319">rl_completion_entry_function</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX336">rl_completion_mark_symlink_dirs</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX316"><CODE>rl_completion_matches</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX315"><CODE>rl_completion_mode</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX333">rl_completion_query_items</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX335">rl_completion_suppress_append</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX341">rl_completion_type</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX212"><CODE>rl_copy_keymap</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX264"><CODE>rl_copy_text</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX254"><CODE>rl_crlf</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX263"><CODE>rl_delete_text</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX202">rl_deprep_term_function</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX274"><CODE>rl_deprep_terminal</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX281"><CODE>rl_ding</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX325">rl_directory_completion_hook</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX214"><CODE>rl_discard_keymap</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX184">rl_dispatching</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX283"><CODE>rl_display_match_list</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX247"><CODE>rl_do_undo</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX181">rl_done</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX209">rl_editing_mode</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX179">rl_end</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX244"><CODE>rl_end_undo_group</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX185">rl_erase_empty_line</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX198">rl_event_hook</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX270"><CODE>rl_execute_next</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX203">rl_executing_keymap</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX205">rl_executing_macro</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX260"><CODE>rl_expand_prompt</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX207">rl_explicit_arg</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX279"><CODE>rl_extend_line_buffer</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX338">rl_filename_completion_desired</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX317"><CODE>rl_filename_completion_function</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX322">rl_filename_dequoting_function</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX331">rl_filename_quote_characters</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX339">rl_filename_quoting_desired</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX321">rl_filename_quoting_function</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX250"><CODE>rl_forced_update_display</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX302"><CODE>rl_free_line_state</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX246"><CODE>rl_free_undo_list</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX239"><CODE>rl_function_dumper</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX236"><CODE>rl_function_of_keyseq</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX241"><CODE>rl_funmap_names</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX232"><CODE>rl_generic_bind</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX215"><CODE>rl_get_keymap</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX217"><CODE>rl_get_keymap_by_name</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX218"><CODE>rl_get_keymap_name</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX306"><CODE>rl_get_screen_size</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX295"><CODE>rl_get_termcap</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX268"><CODE>rl_getc</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX199">rl_getc_function</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX190">rl_gnu_readline_p</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX337">rl_ignore_completion_duplicates</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX324">rl_ignore_some_completions_function</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX342">rl_inhibit_completion</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX280"><CODE>rl_initialize</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX314"><CODE>rl_insert_completions</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX262"><CODE>rl_insert_text</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX193">rl_instream</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX237"><CODE>rl_invoking_keyseqs</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX238"><CODE>rl_invoking_keyseqs_in_map</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX265"><CODE>rl_kill_text</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX195">rl_last_func</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX188">rl_library_version</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX177">rl_line_buffer</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX240"><CODE>rl_list_funmap_names</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX290"><CODE>rl_macro_bind</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX291"><CODE>rl_macro_dumper</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX211"><CODE>rl_make_bare_keymap</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX213"><CODE>rl_make_keymap</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX180">rl_mark</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX256"><CODE>rl_message</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX248"><CODE>rl_modifying</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC34">2.4.5 Allowing Undoing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX235"><CODE>rl_named_function</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC33">2.4.4 Associating Function Names and Bindings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX182">rl_num_chars_to_read</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX208">rl_numeric_arg</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX251"><CODE>rl_on_new_line</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX252"><CODE>rl_on_new_line_with_prompt</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX194">rl_outstream</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX233"><CODE>rl_parse_and_bind</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX183">rl_pending_input</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX178">rl_point</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX313"><CODE>rl_possible_completions</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX197">rl_pre_input_hook</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX201">rl_prep_term_function</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX273"><CODE>rl_prep_terminal</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX186">rl_prompt</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX266"><CODE>rl_push_macro_input</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC36">2.4.7 Modifying Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX234"><CODE>rl_read_init_file</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX267"><CODE>rl_read_key</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX192">rl_readline_name</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX206">rl_readline_state</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX189">rl_readline_version</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX249"><CODE>rl_redisplay</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX200">rl_redisplay_function</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX278"><CODE>rl_replace_line</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC39">2.4.10 Utility Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX303"><CODE>rl_reset_after_signal</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX253"><CODE>rl_reset_line_state</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX277"><CODE>rl_reset_terminal</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX304"><CODE>rl_resize_terminal</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX259"><CODE>rl_restore_prompt</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX258"><CODE>rl_save_prompt</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX229"><CODE>rl_set_key</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX272"><CODE>rl_set_keyboard_input_timeout</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX216"><CODE>rl_set_keymap</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC31">2.4.2 Selecting a Keymap</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX294"><CODE>rl_set_paren_blink_timeout</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX261"><CODE>rl_set_prompt</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX305"><CODE>rl_set_screen_size</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX307"><CODE>rl_set_signals</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC43">2.5 Readline Signal Handling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX255"><CODE>rl_show_char</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC35">2.4.6 Redisplay</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX332">rl_special_prefixes</A></TD><TD valign=top><A HREF="rlman.html#SEC47">2.6.3 Completion Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX196">rl_startup_hook</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX269"><CODE>rl_stuff_char</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC37">2.4.8 Character Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX191">rl_terminal_name</A></TD><TD valign=top><A HREF="rlman.html#SEC28">2.3 Readline Variables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX275"><CODE>rl_tty_set_default_bindings</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX276"><CODE>rl_tty_unset_default_bindings</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC38">2.4.9 Terminal Management</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX226"><CODE>rl_unbind_command_in_map</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX225"><CODE>rl_unbind_function_in_map</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX223"><CODE>rl_unbind_key</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX224"><CODE>rl_unbind_key_in_map</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC32">2.4.3 Binding Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX318"><CODE>rl_username_completion_function</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC46">2.6.2 Completion Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX292"><CODE>rl_variable_bind</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX293"><CODE>rl_variable_dumper</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC40">2.4.11 Miscellaneous Functions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX79"><CODE>self-insert (a, b, A, 1, !, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX80"><CODE>self-insert (a, b, A, 1, !, &#60;small&#62;...&#60;/small&#62;)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX155"><CODE>set-mark (C-@)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX156"><CODE>set-mark (C-@)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX24">show-all-if-ambiguous</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX25">show-all-if-unmodified</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX135"><CODE>start-kbd-macro (C-x ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX136"><CODE>start-kbd-macro (C-x ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC20">1.4.7 Keyboard Macros</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX77"><CODE>tab-insert (M-<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX78"><CODE>tab-insert (M-<KBD>TAB</KBD>)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX153"><CODE>tilde-expand (M-~)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX154"><CODE>tilde-expand (M-~)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX81"><CODE>transpose-chars (C-t)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX82"><CODE>transpose-chars (C-t)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX83"><CODE>transpose-words (M-t)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX84"><CODE>transpose-words (M-t)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX149"><CODE>undo (C-_ or C-x C-u)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX150"><CODE>undo (C-_ or C-x C-u)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX123"><CODE>universal-argument ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX124"><CODE>universal-argument ()</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX97"><CODE>unix-line-discard (C-u)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX98"><CODE>unix-line-discard (C-u)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX105"><CODE>unix-word-rubout (C-w)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX106"><CODE>unix-word-rubout (C-w)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX85"><CODE>upcase-word (M-u)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX86"><CODE>upcase-word (M-u)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC16">1.4.3 Commands For Changing Text</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_V"></A>V</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX173"><CODE>vi-editing-mode (M-C-j)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX174"><CODE>vi-editing-mode (M-C-j)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX26">visible-stats</A></TD><TD valign=top><A HREF="rlman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Y"></A>Y</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX117"><CODE>yank (C-y)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX118"><CODE>yank (C-y)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX67"><CODE>yank-last-arg (M-. or M-_)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX68"><CODE>yank-last-arg (M-. or M-_)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX65"><CODE>yank-nth-arg (M-C-y)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX66"><CODE>yank-nth-arg (M-C-y)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX119"><CODE>yank-pop (M-y)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="readline.html#IDX120"><CODE>yank-pop (M-y)</CODE></A></TD><TD valign=top><A HREF="rlman.html#SEC17">1.4.4 Killing And Yanking</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="readline.html#fn__" style="text-decoration:none"><b>_</b></A>
+ &nbsp; 
+<BR>
+<A HREF="readline.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp; 
+<A HREF="readline.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp; 
+</td></tr></table><br><P>
+
+<HR SIZE="6">
+<A NAME="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Table of Contents</H1>
+<UL>
+<A NAME="TOC1" HREF="readline.html#SEC1">1. Command Line Editing</A>
+<BR>
+<UL>
+<A NAME="TOC2" HREF="readline.html#SEC2">1.1 Introduction to Line Editing</A>
+<BR>
+<A NAME="TOC3" HREF="readline.html#SEC3">1.2 Readline Interaction</A>
+<BR>
+<UL>
+<A NAME="TOC4" HREF="readline.html#SEC4">1.2.1 Readline Bare Essentials</A>
+<BR>
+<A NAME="TOC5" HREF="readline.html#SEC5">1.2.2 Readline Movement Commands</A>
+<BR>
+<A NAME="TOC6" HREF="readline.html#SEC6">1.2.3 Readline Killing Commands</A>
+<BR>
+<A NAME="TOC7" HREF="readline.html#SEC7">1.2.4 Readline Arguments</A>
+<BR>
+<A NAME="TOC8" HREF="readline.html#SEC8">1.2.5 Searching for Commands in the History</A>
+<BR>
+</UL>
+<A NAME="TOC9" HREF="readline.html#SEC9">1.3 Readline Init File</A>
+<BR>
+<UL>
+<A NAME="TOC10" HREF="readline.html#SEC10">1.3.1 Readline Init File Syntax</A>
+<BR>
+<A NAME="TOC11" HREF="readline.html#SEC11">1.3.2 Conditional Init Constructs</A>
+<BR>
+<A NAME="TOC12" HREF="readline.html#SEC12">1.3.3 Sample Init File</A>
+<BR>
+</UL>
+<A NAME="TOC13" HREF="readline.html#SEC13">1.4 Bindable Readline Commands</A>
+<BR>
+<UL>
+<A NAME="TOC14" HREF="readline.html#SEC14">1.4.1 Commands For Moving</A>
+<BR>
+<A NAME="TOC15" HREF="readline.html#SEC15">1.4.2 Commands For Manipulating The History</A>
+<BR>
+<A NAME="TOC16" HREF="readline.html#SEC16">1.4.3 Commands For Changing Text</A>
+<BR>
+<A NAME="TOC17" HREF="readline.html#SEC17">1.4.4 Killing And Yanking</A>
+<BR>
+<A NAME="TOC18" HREF="readline.html#SEC18">1.4.5 Specifying Numeric Arguments</A>
+<BR>
+<A NAME="TOC19" HREF="readline.html#SEC19">1.4.6 Letting Readline Type For You</A>
+<BR>
+<A NAME="TOC20" HREF="readline.html#SEC20">1.4.7 Keyboard Macros</A>
+<BR>
+<A NAME="TOC21" HREF="readline.html#SEC21">1.4.8 Some Miscellaneous Commands</A>
+<BR>
+</UL>
+<A NAME="TOC22" HREF="readline.html#SEC22">1.5 Readline vi Mode</A>
+<BR>
+</UL>
+<A NAME="TOC23" HREF="readline.html#SEC23">2. Programming with GNU Readline</A>
+<BR>
+<UL>
+<A NAME="TOC24" HREF="readline.html#SEC24">2.1 Basic Behavior</A>
+<BR>
+<A NAME="TOC25" HREF="readline.html#SEC25">2.2 Custom Functions</A>
+<BR>
+<UL>
+<A NAME="TOC26" HREF="readline.html#SEC26">2.2.1 Readline Typedefs</A>
+<BR>
+<A NAME="TOC27" HREF="readline.html#SEC27">2.2.2 Writing a New Function</A>
+<BR>
+</UL>
+<A NAME="TOC28" HREF="readline.html#SEC28">2.3 Readline Variables</A>
+<BR>
+<A NAME="TOC29" HREF="readline.html#SEC29">2.4 Readline Convenience Functions</A>
+<BR>
+<UL>
+<A NAME="TOC30" HREF="readline.html#SEC30">2.4.1 Naming a Function</A>
+<BR>
+<A NAME="TOC31" HREF="readline.html#SEC31">2.4.2 Selecting a Keymap</A>
+<BR>
+<A NAME="TOC32" HREF="readline.html#SEC32">2.4.3 Binding Keys</A>
+<BR>
+<A NAME="TOC33" HREF="readline.html#SEC33">2.4.4 Associating Function Names and Bindings</A>
+<BR>
+<A NAME="TOC34" HREF="readline.html#SEC34">2.4.5 Allowing Undoing</A>
+<BR>
+<A NAME="TOC35" HREF="readline.html#SEC35">2.4.6 Redisplay</A>
+<BR>
+<A NAME="TOC36" HREF="readline.html#SEC36">2.4.7 Modifying Text</A>
+<BR>
+<A NAME="TOC37" HREF="readline.html#SEC37">2.4.8 Character Input</A>
+<BR>
+<A NAME="TOC38" HREF="readline.html#SEC38">2.4.9 Terminal Management</A>
+<BR>
+<A NAME="TOC39" HREF="readline.html#SEC39">2.4.10 Utility Functions</A>
+<BR>
+<A NAME="TOC40" HREF="readline.html#SEC40">2.4.11 Miscellaneous Functions</A>
+<BR>
+<A NAME="TOC41" HREF="readline.html#SEC41">2.4.12 Alternate Interface</A>
+<BR>
+<A NAME="TOC42" HREF="readline.html#SEC42">2.4.13 A Readline Example</A>
+<BR>
+</UL>
+<A NAME="TOC43" HREF="readline.html#SEC43">2.5 Readline Signal Handling</A>
+<BR>
+<A NAME="TOC44" HREF="readline.html#SEC44">2.6 Custom Completers</A>
+<BR>
+<UL>
+<A NAME="TOC45" HREF="readline.html#SEC45">2.6.1 How Completing Works</A>
+<BR>
+<A NAME="TOC46" HREF="readline.html#SEC46">2.6.2 Completion Functions</A>
+<BR>
+<A NAME="TOC47" HREF="readline.html#SEC47">2.6.3 Completion Variables</A>
+<BR>
+<A NAME="TOC48" HREF="readline.html#SEC48">2.6.4 A Short Completion Example</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC49" HREF="readline.html#SEC49">A. Copying This Manual</A>
+<BR>
+<UL>
+<A NAME="TOC50" HREF="readline.html#SEC50">A.1 GNU Free Documentation License</A>
+<BR>
+<UL>
+<A NAME="TOC51" HREF="readline.html#SEC51">A.1.1 ADDENDUM: How to use this License for your documents</A>
+<BR>
+</UL>
+</UL>
+<A NAME="TOC52" HREF="readline.html#SEC52">Concept Index</A>
+<BR>
+<A NAME="TOC53" HREF="readline.html#SEC53">Function and Variable Index</A>
+<BR>
+</UL>
+<HR SIZE=1>
+<A NAME="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="readline.html#SEC1">1. Command Line Editing</A>
+<BR>
+<A NAME="TOC23" HREF="readline.html#SEC23">2. Programming with GNU Readline</A>
+<BR>
+<A NAME="TOC49" HREF="readline.html#SEC49">A. Copying This Manual</A>
+<BR>
+<A NAME="TOC52" HREF="readline.html#SEC52">Concept Index</A>
+<BR>
+<A NAME="TOC53" HREF="readline.html#SEC53">Function and Variable Index</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<A NAME="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC52">Index</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="readline.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>About this document</H1>
+This document was generated by <I>Chet Ramey</I> on <I>September, 22  2003</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+<P></P>  
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+previous or up-and-previous section 
+</TD>
+<TD>
+1.1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next or up-and-next section
+</TD>
+<TD>
+1.3
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+
+<HR SIZE=1>
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+by <I>Chet Ramey</I> on <I>September, 22  2003</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/lib/readline/doc/readline.info b/lib/readline/doc/readline.info
new file mode 100644 (file)
index 0000000..264ebdf
--- /dev/null
@@ -0,0 +1,4167 @@
+This is readline.info, produced by makeinfo version 4.5 from
+./rlman.texi.
+
+This manual describes the GNU Readline Library (version 5.0, 19
+September 2003), a library which aids in the consistency of user
+interface across discrete programs which provide a command line
+interface.
+
+   Copyright (C) 1988-2003 Free Software Foundation, Inc.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.1 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual," and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License."
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+   
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* Readline: (readline).       The GNU readline library API.
+END-INFO-DIR-ENTRY
+
+\1f
+File: readline.info,  Node: Top,  Next: Command Line Editing,  Up: (dir)
+
+GNU Readline Library
+********************
+
+   This document describes the GNU Readline Library, a utility which
+aids in the consistency of user interface across discrete programs which
+provide a command line interface.
+
+* Menu:
+
+* Command Line Editing::          GNU Readline User's Manual.
+* Programming with GNU Readline::  GNU Readline Programmer's Manual.
+* Copying This Manual::                   Copying this manual.
+* Concept Index::                 Index of concepts described in this manual.
+* Function and Variable Index::           Index of externally visible functions
+                                  and variables.
+
+\1f
+File: readline.info,  Node: Command Line Editing,  Next: Programming with GNU Readline,  Prev: Top,  Up: Top
+
+Command Line Editing
+********************
+
+   This chapter describes the basic features of the GNU command line
+editing interface.
+
+* Menu:
+
+* Introduction and Notation::  Notation used in this text.
+* Readline Interaction::       The minimum set of commands for editing a line.
+* Readline Init File::         Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+                               available for binding
+* Readline vi Mode::           A short description of how to make Readline
+                               behave like the vi editor.
+
+\1f
+File: readline.info,  Node: Introduction and Notation,  Next: Readline Interaction,  Up: Command Line Editing
+
+Introduction to Line Editing
+============================
+
+   The following paragraphs describe the notation used to represent
+keystrokes.
+
+   The text `C-k' is read as `Control-K' and describes the character
+produced when the <k> key is pressed while the Control key is depressed.
+
+   The text `M-k' is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <k>
+key is pressed.  The Meta key is labeled <ALT> on many keyboards.  On
+keyboards with two keys labeled <ALT> (usually to either side of the
+space bar), the <ALT> on the left side is generally set to work as a
+Meta key.  The <ALT> key on the right may also be configured to work as
+a Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+   If you do not have a Meta or <ALT> key, or another key working as a
+Meta key, the identical keystroke can be generated by typing <ESC>
+_first_, and then typing <k>.  Either process is known as "metafying"
+the <k> key.
+
+   The text `M-C-k' is read as `Meta-Control-k' and describes the
+character produced by "metafying" `C-k'.
+
+   In addition, several keys have their own names.  Specifically,
+<DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves
+when seen in this text, or in an init file (*note Readline Init File::).
+If your keyboard lacks a <LFD> key, typing <C-j> will produce the
+desired character.  The <RET> key may be labeled <Return> or <Enter> on
+some keyboards.
+
+\1f
+File: readline.info,  Node: Readline Interaction,  Next: Readline Init File,  Prev: Introduction and Notation,  Up: Command Line Editing
+
+Readline Interaction
+====================
+
+   Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <RET>.  You do not have to be at the end of
+the line to press <RET>; the entire line is accepted regardless of the
+location of the cursor within the line.
+
+* Menu:
+
+* Readline Bare Essentials::   The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands::  How to delete text, and how to get it back!
+* Readline Arguments::         Giving numeric arguments to commands.
+* Searching::                  Searching through previous lines.
+
+\1f
+File: readline.info,  Node: Readline Bare Essentials,  Next: Readline Movement Commands,  Up: Readline Interaction
+
+Readline Bare Essentials
+------------------------
+
+   In order to enter characters into the line, simply type them.  The
+typed character appears where the cursor was, and then the cursor moves
+one space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+
+   Sometimes you may mistype a character, and not notice the error
+until you have typed several other characters.  In that case, you can
+type `C-b' to move the cursor to the left, and then correct your
+mistake.  Afterwards, you can move the cursor to the right with `C-f'.
+
+   When you add text in the middle of a line, you will notice that
+characters to the right of the cursor are `pushed over' to make room
+for the text that you have inserted.  Likewise, when you delete text
+behind the cursor, characters to the right of the cursor are `pulled
+back' to fill in the blank space created by the removal of the text.  A
+list of the bare essentials for editing the text of an input line
+follows.
+
+`C-b'
+     Move back one character.
+
+`C-f'
+     Move forward one character.
+
+<DEL> or <Backspace>
+     Delete the character to the left of the cursor.
+
+`C-d'
+     Delete the character underneath the cursor.
+
+Printing characters
+     Insert the character into the line at the cursor.
+
+`C-_' or `C-x C-u'
+     Undo the last editing command.  You can undo all the way back to an
+     empty line.
+
+(Depending on your configuration, the <Backspace> key be set to delete
+the character to the left of the cursor and the <DEL> key set to delete
+the character underneath the cursor, like `C-d', rather than the
+character to the left of the cursor.)
+
+\1f
+File: readline.info,  Node: Readline Movement Commands,  Next: Readline Killing Commands,  Prev: Readline Bare Essentials,  Up: Readline Interaction
+
+Readline Movement Commands
+--------------------------
+
+   The above table describes the most basic keystrokes that you need in
+order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to `C-b', `C-f', `C-d', and
+<DEL>.  Here are some commands for moving more rapidly about the line.
+
+`C-a'
+     Move to the start of the line.
+
+`C-e'
+     Move to the end of the line.
+
+`M-f'
+     Move forward a word, where a word is composed of letters and
+     digits.
+
+`M-b'
+     Move backward a word.
+
+`C-l'
+     Clear the screen, reprinting the current line at the top.
+
+   Notice how `C-f' moves forward a character, while `M-f' moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+
+\1f
+File: readline.info,  Node: Readline Killing Commands,  Next: Readline Arguments,  Prev: Readline Movement Commands,  Up: Readline Interaction
+
+Readline Killing Commands
+-------------------------
+
+   "Killing" text means to delete the text from the line, but to save
+it away for later use, usually by "yanking" (re-inserting) it back into
+the line.  (`Cut' and `paste' are more recent jargon for `kill' and
+`yank'.)
+
+   If the description for a command says that it `kills' text, then you
+can be sure that you can get the text back in a different (or the same)
+place later.
+
+   When you use a kill command, the text is saved in a "kill-ring".
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill ring is not line
+specific; the text that you killed on a previously typed line is
+available to be yanked back later, when you are typing another line.
+
+   Here is the list of commands for killing text.
+
+`C-k'
+     Kill the text from the current cursor position to the end of the
+     line.
+
+`M-d'
+     Kill from the cursor to the end of the current word, or, if between
+     words, to the end of the next word.  Word boundaries are the same
+     as those used by `M-f'.
+
+`M-<DEL>'
+     Kill from the cursor the start of the current word, or, if between
+     words, to the start of the previous word.  Word boundaries are the
+     same as those used by `M-b'.
+
+`C-w'
+     Kill from the cursor to the previous whitespace.  This is
+     different than `M-<DEL>' because the word boundaries differ.
+
+
+   Here is how to "yank" the text back into the line.  Yanking means to
+copy the most-recently-killed text from the kill buffer.
+
+`C-y'
+     Yank the most recently killed text back into the buffer at the
+     cursor.
+
+`M-y'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `C-y' or `M-y'.
+
+\1f
+File: readline.info,  Node: Readline Arguments,  Next: Searching,  Prev: Readline Killing Commands,  Up: Readline Interaction
+
+Readline Arguments
+------------------
+
+   You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the sign of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type `M-- C-k'.
+
+   The general way to pass numeric arguments to a command is to type
+meta digits before the command.  If the first `digit' typed is a minus
+sign (`-'), then the sign of the argument will be negative.  Once you
+have typed one meta digit to get the argument started, you can type the
+remainder of the digits, and then the command.  For example, to give
+the `C-d' command an argument of 10, you could type `M-1 0 C-d', which
+will delete the next ten characters on the input line.
+
+\1f
+File: readline.info,  Node: Searching,  Prev: Readline Arguments,  Up: Readline Interaction
+
+Searching for Commands in the History
+-------------------------------------
+
+   Readline provides commands for searching through the command history
+for lines containing a specified string.  There are two search modes:
+"incremental" and "non-incremental".
+
+   Incremental searches begin before the user has finished typing the
+search string.  As each character of the search string is typed,
+Readline displays the next entry from the history matching the string
+typed so far.  An incremental search requires only as many characters
+as needed to find the desired history entry.  To search backward in the
+history for a particular string, type `C-r'.  Typing `C-s' searches
+forward through the history.  The characters present in the value of
+the `isearch-terminators' variable are used to terminate an incremental
+search.  If that variable has not been assigned a value, the <ESC> and
+`C-J' characters will terminate an incremental search.  `C-g' will
+abort an incremental search and restore the original line.  When the
+search is terminated, the history entry containing the search string
+becomes the current line.
+
+   To find other matching entries in the history list, type `C-r' or
+`C-s' as appropriate.  This will search backward or forward in the
+history for the next entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate the
+search and execute that command.  For instance, a <RET> will terminate
+the search and accept the line, thereby executing the command from the
+history list.  A movement command will terminate the search, make the
+last line found the current line, and begin editing.
+
+   Readline remembers the last incremental search string.  If two
+`C-r's are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+
+   Non-incremental searches read the entire search string before
+starting to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+
+\1f
+File: readline.info,  Node: Readline Init File,  Next: Bindable Readline Commands,  Prev: Readline Interaction,  Up: Command Line Editing
+
+Readline Init File
+==================
+
+   Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.  Any user can customize programs that use Readline by
+putting commands in an "inputrc" file, conventionally in his home
+directory.  The name of this file is taken from the value of the
+environment variable `INPUTRC'.  If that variable is unset, the default
+is `~/.inputrc'.
+
+   When a program which uses the Readline library starts up, the init
+file is read, and the key bindings are set.
+
+   In addition, the `C-x C-r' command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+* Menu:
+
+* Readline Init File Syntax::  Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs::        Conditional key bindings in the inputrc file.
+
+* Sample Init File::           An example inputrc file.
+
+\1f
+File: readline.info,  Node: Readline Init File Syntax,  Next: Conditional Init Constructs,  Up: Readline Init File
+
+Readline Init File Syntax
+-------------------------
+
+   There are only a few basic constructs allowed in the Readline init
+file.  Blank lines are ignored.  Lines beginning with a `#' are
+comments.  Lines beginning with a `$' indicate conditional constructs
+(*note Conditional Init Constructs::).  Other lines denote variable
+settings and key bindings.
+
+Variable Settings
+     You can modify the run-time behavior of Readline by altering the
+     values of variables in Readline using the `set' command within the
+     init file.  The syntax is simple:
+
+          set VARIABLE VALUE
+
+     Here, for example, is how to change from the default Emacs-like
+     key binding to use `vi' line editing commands:
+
+          set editing-mode vi
+
+     Variable names and values, where appropriate, are recognized
+     without regard to case.
+
+     A great deal of run-time behavior is changeable with the following
+     variables.
+
+    `bell-style'
+          Controls what happens when Readline wants to ring the
+          terminal bell.  If set to `none', Readline never rings the
+          bell.  If set to `visible', Readline uses a visible bell if
+          one is available.  If set to `audible' (the default),
+          Readline attempts to ring the terminal's bell.
+
+    `comment-begin'
+          The string to insert at the beginning of the line when the
+          `insert-comment' command is executed.  The default value is
+          `"#"'.
+
+    `completion-ignore-case'
+          If set to `on', Readline performs filename matching and
+          completion in a case-insensitive fashion.  The default value
+          is `off'.
+
+    `completion-query-items'
+          The number of possible completions that determines when the
+          user is asked whether the list of possibilities should be
+          displayed.  If the number of possible completions is greater
+          than this value, Readline will ask the user whether or not he
+          wishes to view them; otherwise, they are simply listed.  This
+          variable must be set to an integer value greater than or
+          equal to 0.  The default limit is `100'.
+
+    `convert-meta'
+          If set to `on', Readline will convert characters with the
+          eighth bit set to an ASCII key sequence by stripping the
+          eighth bit and prefixing an <ESC> character, converting them
+          to a meta-prefixed key sequence.  The default value is `on'.
+
+    `disable-completion'
+          If set to `On', Readline will inhibit word completion.
+          Completion  characters will be inserted into the line as if
+          they had been mapped to `self-insert'.  The default is `off'.
+
+    `editing-mode'
+          The `editing-mode' variable controls which default set of key
+          bindings is used.  By default, Readline starts up in Emacs
+          editing mode, where the keystrokes are most similar to Emacs.
+          This variable can be set to either `emacs' or `vi'.
+
+    `enable-keypad'
+          When set to `on', Readline will try to enable the application
+          keypad when it is called.  Some systems need this to enable
+          the arrow keys.  The default is `off'.
+
+    `expand-tilde'
+          If set to `on', tilde expansion is performed when Readline
+          attempts word completion.  The default is `off'.
+
+          If set to `on', the history code attempts to place point at
+          the same location on each history line retrieved with
+          `previous-history' or `next-history'.
+
+    `horizontal-scroll-mode'
+          This variable can be set to either `on' or `off'.  Setting it
+          to `on' means that the text of the lines being edited will
+          scroll horizontally on a single screen line when they are
+          longer than the width of the screen, instead of wrapping onto
+          a new screen line.  By default, this variable is set to `off'.
+
+    `input-meta'
+          If set to `on', Readline will enable eight-bit input (it will
+          not clear the eighth bit in the characters it reads),
+          regardless of what the terminal claims it can support.  The
+          default value is `off'.  The name `meta-flag' is a synonym
+          for this variable.
+
+    `isearch-terminators'
+          The string of characters that should terminate an incremental
+          search without subsequently executing the character as a
+          command (*note Searching::).  If this variable has not been
+          given a value, the characters <ESC> and `C-J' will terminate
+          an incremental search.
+
+    `keymap'
+          Sets Readline's idea of the current keymap for key binding
+          commands.  Acceptable `keymap' names are `emacs',
+          `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move',
+          `vi-command', and `vi-insert'.  `vi' is equivalent to
+          `vi-command'; `emacs' is equivalent to `emacs-standard'.  The
+          default value is `emacs'.  The value of the `editing-mode'
+          variable also affects the default keymap.
+
+    `mark-directories'
+          If set to `on', completed directory names have a slash
+          appended.  The default is `on'.
+
+    `mark-modified-lines'
+          This variable, when set to `on', causes Readline to display an
+          asterisk (`*') at the start of history lines which have been
+          modified.  This variable is `off' by default.
+
+    `mark-symlinked-directories'
+          If set to `on', completed names which are symbolic links to
+          directories have a slash appended (subject to the value of
+          `mark-directories').  The default is `off'.
+
+    `match-hidden-files'
+          This variable, when set to `on', causes Readline to match
+          files whose names begin with a `.' (hidden files) when
+          performing filename completion, unless the leading `.' is
+          supplied by the user in the filename to be completed.  This
+          variable is `on' by default.
+
+    `output-meta'
+          If set to `on', Readline will display characters with the
+          eighth bit set directly rather than as a meta-prefixed escape
+          sequence.  The default is `off'.
+
+    `page-completions'
+          If set to `on', Readline uses an internal `more'-like pager
+          to display a screenful of possible completions at a time.
+          This variable is `on' by default.
+
+    `print-completions-horizontally'
+          If set to `on', Readline will display completions with matches
+          sorted horizontally in alphabetical order, rather than down
+          the screen.  The default is `off'.
+
+    `show-all-if-ambiguous'
+          This alters the default behavior of the completion functions.
+          If set to `on', words which have more than one possible
+          completion cause the matches to be listed immediately instead
+          of ringing the bell.  The default value is `off'.
+
+    `show-all-if-unmodified'
+          This alters the default behavior of the completion functions
+          in a fashion similar to SHOW-ALL-IF-AMBIGUOUS.  If set to
+          `on', words which have more than one possible completion
+          without any possible partial completion (the possible
+          completions don't share a common prefix) cause the matches to
+          be listed immediately instead of ringing the bell.  The
+          default value is `off'.
+
+    `visible-stats'
+          If set to `on', a character denoting a file's type is
+          appended to the filename when listing possible completions.
+          The default is `off'.
+
+
+Key Bindings
+     The syntax for controlling key bindings in the init file is
+     simple.  First you need to find the name of the command that you
+     want to change.  The following sections contain tables of the
+     command name, the default keybinding, if any, and a short
+     description of what the command does.
+
+     Once you know the name of the command, simply place on a line in
+     the init file the name of the key you wish to bind the command to,
+     a colon, and then the name of the command.  The name of the key
+     can be expressed in different ways, depending on what you find most
+     comfortable.
+
+     In addition to command names, readline allows keys to be bound to
+     a string that is inserted when the key is pressed (a MACRO).
+
+    KEYNAME: FUNCTION-NAME or MACRO
+          KEYNAME is the name of a key spelled out in English.  For
+          example:
+               Control-u: universal-argument
+               Meta-Rubout: backward-kill-word
+               Control-o: "> output"
+
+          In the above example, `C-u' is bound to the function
+          `universal-argument', `M-DEL' is bound to the function
+          `backward-kill-word', and `C-o' is bound to run the macro
+          expressed on the right hand side (that is, to insert the text
+          `> output' into the line).
+
+          A number of symbolic character names are recognized while
+          processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
+          NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.
+
+    "KEYSEQ": FUNCTION-NAME or MACRO
+          KEYSEQ differs from KEYNAME above in that strings denoting an
+          entire key sequence can be specified, by placing the key
+          sequence in double quotes.  Some GNU Emacs style key escapes
+          can be used, as in the following example, but the special
+          character names are not recognized.
+
+               "\C-u": universal-argument
+               "\C-x\C-r": re-read-init-file
+               "\e[11~": "Function Key 1"
+
+          In the above example, `C-u' is again bound to the function
+          `universal-argument' (just as it was in the first example),
+          `C-x C-r' is bound to the function `re-read-init-file', and
+          `<ESC> <[> <1> <1> <~>' is bound to insert the text `Function
+          Key 1'.
+
+
+     The following GNU Emacs style escape sequences are available when
+     specifying key sequences:
+
+    `\C-'
+          control prefix
+
+    `\M-'
+          meta prefix
+
+    `\e'
+          an escape character
+
+    `\\'
+          backslash
+
+    `\"'
+          <">, a double quotation mark
+
+    `\''
+          <'>, a single quote or apostrophe
+
+     In addition to the GNU Emacs style escape sequences, a second set
+     of backslash escapes is available:
+
+    `\a'
+          alert (bell)
+
+    `\b'
+          backspace
+
+    `\d'
+          delete
+
+    `\f'
+          form feed
+
+    `\n'
+          newline
+
+    `\r'
+          carriage return
+
+    `\t'
+          horizontal tab
+
+    `\v'
+          vertical tab
+
+    `\NNN'
+          the eight-bit character whose value is the octal value NNN
+          (one to three digits)
+
+    `\xHH'
+          the eight-bit character whose value is the hexadecimal value
+          HH (one or two hex digits)
+
+     When entering the text of a macro, single or double quotes must be
+     used to indicate a macro definition.  Unquoted text is assumed to
+     be a function name.  In the macro body, the backslash escapes
+     described above are expanded.  Backslash will quote any other
+     character in the macro text, including `"' and `''.  For example,
+     the following binding will make `C-x \' insert a single `\' into
+     the line:
+          "\C-x\\": "\\"
+
+
+\1f
+File: readline.info,  Node: Conditional Init Constructs,  Next: Sample Init File,  Prev: Readline Init File Syntax,  Up: Readline Init File
+
+Conditional Init Constructs
+---------------------------
+
+   Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key bindings
+and variable settings to be performed as the result of tests.  There
+are four parser directives used.
+
+`$if'
+     The `$if' construct allows bindings to be made based on the
+     editing mode, the terminal being used, or the application using
+     Readline.  The text of the test extends to the end of the line; no
+     characters are required to isolate it.
+
+    `mode'
+          The `mode=' form of the `$if' directive is used to test
+          whether Readline is in `emacs' or `vi' mode.  This may be
+          used in conjunction with the `set keymap' command, for
+          instance, to set bindings in the `emacs-standard' and
+          `emacs-ctlx' keymaps only if Readline is starting out in
+          `emacs' mode.
+
+    `term'
+          The `term=' form may be used to include terminal-specific key
+          bindings, perhaps to bind the key sequences output by the
+          terminal's function keys.  The word on the right side of the
+          `=' is tested against both the full name of the terminal and
+          the portion of the terminal name before the first `-'.  This
+          allows `sun' to match both `sun' and `sun-cmd', for instance.
+
+    `application'
+          The APPLICATION construct is used to include
+          application-specific settings.  Each program using the
+          Readline library sets the APPLICATION NAME, and you can test
+          for a particular value.  This could be used to bind key
+          sequences to functions useful for a specific program.  For
+          instance, the following command adds a key sequence that
+          quotes the current or previous word in Bash:
+               $if Bash
+               # Quote the current or previous word
+               "\C-xq": "\eb\"\ef\""
+               $endif
+
+`$endif'
+     This command, as seen in the previous example, terminates an `$if'
+     command.
+
+`$else'
+     Commands in this branch of the `$if' directive are executed if the
+     test fails.
+
+`$include'
+     This directive takes a single filename as an argument and reads
+     commands and bindings from that file.  For example, the following
+     directive reads from `/etc/inputrc':
+          $include /etc/inputrc
+
+\1f
+File: readline.info,  Node: Sample Init File,  Prev: Conditional Init Constructs,  Up: Readline Init File
+
+Sample Init File
+----------------
+
+   Here is an example of an INPUTRC file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+
+
+     # This file controls the behaviour of line input editing for
+     # programs that use the GNU Readline library.  Existing
+     # programs include FTP, Bash, and GDB.
+     #
+     # You can re-read the inputrc file with C-x C-r.
+     # Lines beginning with '#' are comments.
+     #
+     # First, include any systemwide bindings and variable
+     # assignments from /etc/Inputrc
+     $include /etc/Inputrc
+     
+     #
+     # Set various bindings for emacs mode.
+     
+     set editing-mode emacs
+     
+     $if mode=emacs
+     
+     Meta-Control-h:   backward-kill-word      Text after the function name is ignored
+     
+     #
+     # Arrow keys in keypad mode
+     #
+     #"\M-OD":        backward-char
+     #"\M-OC":        forward-char
+     #"\M-OA":        previous-history
+     #"\M-OB":        next-history
+     #
+     # Arrow keys in ANSI mode
+     #
+     "\M-[D":        backward-char
+     "\M-[C":        forward-char
+     "\M-[A":        previous-history
+     "\M-[B":        next-history
+     #
+     # Arrow keys in 8 bit keypad mode
+     #
+     #"\M-\C-OD":       backward-char
+     #"\M-\C-OC":       forward-char
+     #"\M-\C-OA":       previous-history
+     #"\M-\C-OB":       next-history
+     #
+     # Arrow keys in 8 bit ANSI mode
+     #
+     #"\M-\C-[D":       backward-char
+     #"\M-\C-[C":       forward-char
+     #"\M-\C-[A":       previous-history
+     #"\M-\C-[B":       next-history
+     
+     C-q: quoted-insert
+     
+     $endif
+     
+     # An old-style binding.  This happens to be the default.
+     TAB: complete
+     
+     # Macros that are convenient for shell interaction
+     $if Bash
+     # edit the path
+     "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+     # prepare to type a quoted word --
+     # insert open and close double quotes
+     # and move to just after the open quote
+     "\C-x\"": "\"\"\C-b"
+     # insert a backslash (testing backslash escapes
+     # in sequences and macros)
+     "\C-x\\": "\\"
+     # Quote the current or previous word
+     "\C-xq": "\eb\"\ef\""
+     # Add a binding to refresh the line, which is unbound
+     "\C-xr": redraw-current-line
+     # Edit variable on current line.
+     "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+     $endif
+     
+     # use a visible bell if one is available
+     set bell-style visible
+     
+     # don't strip characters to 7 bits when reading
+     set input-meta on
+     
+     # allow iso-latin1 characters to be inserted rather
+     # than converted to prefix-meta sequences
+     set convert-meta off
+     
+     # display characters with the eighth bit set directly
+     # rather than as meta-prefixed characters
+     set output-meta on
+     
+     # if there are more than 150 possible completions for
+     # a word, ask the user if he wants to see all of them
+     set completion-query-items 150
+     
+     # For FTP
+     $if Ftp
+     "\C-xg": "get \M-?"
+     "\C-xt": "put \M-?"
+     "\M-.": yank-last-arg
+     $endif
+
+\1f
+File: readline.info,  Node: Bindable Readline Commands,  Next: Readline vi Mode,  Prev: Readline Init File,  Up: Command Line Editing
+
+Bindable Readline Commands
+==========================
+
+* Menu:
+
+* Commands For Moving::                Moving about the line.
+* Commands For History::       Getting at previous lines.
+* Commands For Text::          Commands for changing text.
+* Commands For Killing::       Commands for killing and yanking.
+* Numeric Arguments::          Specifying numeric arguments, repeat counts.
+* Commands For Completion::    Getting Readline to do the typing for you.
+* Keyboard Macros::            Saving and re-executing typed characters
+* Miscellaneous Commands::     Other miscellaneous commands.
+
+   This section describes Readline commands that may be bound to key
+sequences.  Command names without an accompanying key sequence are
+unbound by default.
+
+   In the following descriptions, "point" refers to the current cursor
+position, and "mark" refers to a cursor position saved by the
+`set-mark' command.  The text between the point and mark is referred to
+as the "region".
+
+\1f
+File: readline.info,  Node: Commands For Moving,  Next: Commands For History,  Up: Bindable Readline Commands
+
+Commands For Moving
+-------------------
+
+`beginning-of-line (C-a)'
+     Move to the start of the current line.
+
+`end-of-line (C-e)'
+     Move to the end of the line.
+
+`forward-char (C-f)'
+     Move forward a character.
+
+`backward-char (C-b)'
+     Move back a character.
+
+`forward-word (M-f)'
+     Move forward to the end of the next word.  Words are composed of
+     letters and digits.
+
+`backward-word (M-b)'
+     Move back to the start of the current or previous word.  Words are
+     composed of letters and digits.
+
+`clear-screen (C-l)'
+     Clear the screen and redraw the current line, leaving the current
+     line at the top of the screen.
+
+`redraw-current-line ()'
+     Refresh the current line.  By default, this is unbound.
+
+
+\1f
+File: readline.info,  Node: Commands For History,  Next: Commands For Text,  Prev: Commands For Moving,  Up: Bindable Readline Commands
+
+Commands For Manipulating The History
+-------------------------------------
+
+`accept-line (Newline or Return)'
+     Accept the line regardless of where the cursor is.  If this line is
+     non-empty, it may be added to the history list for future recall
+     with `add_history()'.  If this line is a modified history line,
+     the history line is restored to its original state.
+
+`previous-history (C-p)'
+     Move `back' through the history list, fetching the previous
+     command.
+
+`next-history (C-n)'
+     Move `forward' through the history list, fetching the next command.
+
+`beginning-of-history (M-<)'
+     Move to the first line in the history.
+
+`end-of-history (M->)'
+     Move to the end of the input history, i.e., the line currently
+     being entered.
+
+`reverse-search-history (C-r)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary.  This is an incremental search.
+
+`forward-search-history (C-s)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary.  This is an incremental
+     search.
+
+`non-incremental-reverse-search-history (M-p)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`non-incremental-forward-search-history (M-n)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`history-search-forward ()'
+     Search forward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`history-search-backward ()'
+     Search backward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`yank-nth-arg (M-C-y)'
+     Insert the first argument to the previous command (usually the
+     second word on the previous line) at point.  With an argument N,
+     insert the Nth word from the previous command (the words in the
+     previous command begin with word 0).  A negative argument inserts
+     the Nth word from the end of the previous command.
+
+`yank-last-arg (M-. or M-_)'
+     Insert last argument to the previous command (the last word of the
+     previous history entry).  With an argument, behave exactly like
+     `yank-nth-arg'.  Successive calls to `yank-last-arg' move back
+     through the history list, inserting the last argument of each line
+     in turn.
+
+
+\1f
+File: readline.info,  Node: Commands For Text,  Next: Commands For Killing,  Prev: Commands For History,  Up: Bindable Readline Commands
+
+Commands For Changing Text
+--------------------------
+
+`delete-char (C-d)'
+     Delete the character at point.  If point is at the beginning of
+     the line, there are no characters in the line, and the last
+     character typed was not bound to `delete-char', then return EOF.
+
+`backward-delete-char (Rubout)'
+     Delete the character behind the cursor.  A numeric argument means
+     to kill the characters instead of deleting them.
+
+`forward-backward-delete-char ()'
+     Delete the character under the cursor, unless the cursor is at the
+     end of the line, in which case the character behind the cursor is
+     deleted.  By default, this is not bound to a key.
+
+`quoted-insert (C-q or C-v)'
+     Add the next character typed to the line verbatim.  This is how to
+     insert key sequences like `C-q', for example.
+
+`tab-insert (M-<TAB>)'
+     Insert a tab character.
+
+`self-insert (a, b, A, 1, !, ...)'
+     Insert yourself.
+
+`transpose-chars (C-t)'
+     Drag the character before the cursor forward over the character at
+     the cursor, moving the cursor forward as well.  If the insertion
+     point is at the end of the line, then this transposes the last two
+     characters of the line.  Negative arguments have no effect.
+
+`transpose-words (M-t)'
+     Drag the word before point past the word after point, moving point
+     past that word as well.  If the insertion point is at the end of
+     the line, this transposes the last two words on the line.
+
+`upcase-word (M-u)'
+     Uppercase the current (or following) word.  With a negative
+     argument, uppercase the previous word, but do not move the cursor.
+
+`downcase-word (M-l)'
+     Lowercase the current (or following) word.  With a negative
+     argument, lowercase the previous word, but do not move the cursor.
+
+`capitalize-word (M-c)'
+     Capitalize the current (or following) word.  With a negative
+     argument, capitalize the previous word, but do not move the cursor.
+
+`overwrite-mode ()'
+     Toggle overwrite mode.  With an explicit positive numeric argument,
+     switches to overwrite mode.  With an explicit non-positive numeric
+     argument, switches to insert mode.  This command affects only
+     `emacs' mode; `vi' mode does overwrite differently.  Each call to
+     `readline()' starts in insert mode.
+
+     In overwrite mode, characters bound to `self-insert' replace the
+     text at point rather than pushing the text to the right.
+     Characters bound to `backward-delete-char' replace the character
+     before point with a space.
+
+     By default, this command is unbound.
+
+
+\1f
+File: readline.info,  Node: Commands For Killing,  Next: Numeric Arguments,  Prev: Commands For Text,  Up: Bindable Readline Commands
+
+Killing And Yanking
+-------------------
+
+`kill-line (C-k)'
+     Kill the text from point to the end of the line.
+
+`backward-kill-line (C-x Rubout)'
+     Kill backward to the beginning of the line.
+
+`unix-line-discard (C-u)'
+     Kill backward from the cursor to the beginning of the current line.
+
+`kill-whole-line ()'
+     Kill all characters on the current line, no matter where point is.
+     By default, this is unbound.
+
+`kill-word (M-d)'
+     Kill from point to the end of the current word, or if between
+     words, to the end of the next word.  Word boundaries are the same
+     as `forward-word'.
+
+`backward-kill-word (M-<DEL>)'
+     Kill the word behind point.  Word boundaries are the same as
+     `backward-word'.
+
+`unix-word-rubout (C-w)'
+     Kill the word behind point, using white space as a word boundary.
+     The killed text is saved on the kill-ring.
+
+`delete-horizontal-space ()'
+     Delete all spaces and tabs around point.  By default, this is
+     unbound.
+
+`kill-region ()'
+     Kill the text in the current region.  By default, this command is
+     unbound.
+
+`copy-region-as-kill ()'
+     Copy the text in the region to the kill buffer, so it can be yanked
+     right away.  By default, this command is unbound.
+
+`copy-backward-word ()'
+     Copy the word before point to the kill buffer.  The word
+     boundaries are the same as `backward-word'.  By default, this
+     command is unbound.
+
+`copy-forward-word ()'
+     Copy the word following point to the kill buffer.  The word
+     boundaries are the same as `forward-word'.  By default, this
+     command is unbound.
+
+`yank (C-y)'
+     Yank the top of the kill ring into the buffer at point.
+
+`yank-pop (M-y)'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `yank' or `yank-pop'.
+
+\1f
+File: readline.info,  Node: Numeric Arguments,  Next: Commands For Completion,  Prev: Commands For Killing,  Up: Bindable Readline Commands
+
+Specifying Numeric Arguments
+----------------------------
+
+`digit-argument (M-0, M-1, ... M--)'
+     Add this digit to the argument already accumulating, or start a new
+     argument.  `M--' starts a negative argument.
+
+`universal-argument ()'
+     This is another way to specify an argument.  If this command is
+     followed by one or more digits, optionally with a leading minus
+     sign, those digits define the argument.  If the command is
+     followed by digits, executing `universal-argument' again ends the
+     numeric argument, but is otherwise ignored.  As a special case, if
+     this command is immediately followed by a character that is
+     neither a digit or minus sign, the argument count for the next
+     command is multiplied by four.  The argument count is initially
+     one, so executing this function the first time makes the argument
+     count four, a second time makes the argument count sixteen, and so
+     on.  By default, this is not bound to a key.
+
+\1f
+File: readline.info,  Node: Commands For Completion,  Next: Keyboard Macros,  Prev: Numeric Arguments,  Up: Bindable Readline Commands
+
+Letting Readline Type For You
+-----------------------------
+
+`complete (<TAB>)'
+     Attempt to perform completion on the text before point.  The
+     actual completion performed is application-specific.  The default
+     is filename completion.
+
+`possible-completions (M-?)'
+     List the possible completions of the text before point.
+
+`insert-completions (M-*)'
+     Insert all completions of the text before point that would have
+     been generated by `possible-completions'.
+
+`menu-complete ()'
+     Similar to `complete', but replaces the word to be completed with
+     a single match from the list of possible completions.  Repeated
+     execution of `menu-complete' steps through the list of possible
+     completions, inserting each match in turn.  At the end of the list
+     of completions, the bell is rung (subject to the setting of
+     `bell-style') and the original text is restored.  An argument of N
+     moves N positions forward in the list of matches; a negative
+     argument may be used to move backward through the list.  This
+     command is intended to be bound to <TAB>, but is unbound by
+     default.
+
+`delete-char-or-list ()'
+     Deletes the character under the cursor if not at the beginning or
+     end of the line (like `delete-char').  If at the end of the line,
+     behaves identically to `possible-completions'.  This command is
+     unbound by default.
+
+
+\1f
+File: readline.info,  Node: Keyboard Macros,  Next: Miscellaneous Commands,  Prev: Commands For Completion,  Up: Bindable Readline Commands
+
+Keyboard Macros
+---------------
+
+`start-kbd-macro (C-x ()'
+     Begin saving the characters typed into the current keyboard macro.
+
+`end-kbd-macro (C-x ))'
+     Stop saving the characters typed into the current keyboard macro
+     and save the definition.
+
+`call-last-kbd-macro (C-x e)'
+     Re-execute the last keyboard macro defined, by making the
+     characters in the macro appear as if typed at the keyboard.
+
+
+\1f
+File: readline.info,  Node: Miscellaneous Commands,  Prev: Keyboard Macros,  Up: Bindable Readline Commands
+
+Some Miscellaneous Commands
+---------------------------
+
+`re-read-init-file (C-x C-r)'
+     Read in the contents of the INPUTRC file, and incorporate any
+     bindings or variable assignments found there.
+
+`abort (C-g)'
+     Abort the current editing command and ring the terminal's bell
+     (subject to the setting of `bell-style').
+
+`do-uppercase-version (M-a, M-b, M-X, ...)'
+     If the metafied character X is lowercase, run the command that is
+     bound to the corresponding uppercase character.
+
+`prefix-meta (<ESC>)'
+     Metafy the next character typed.  This is for keyboards without a
+     meta key.  Typing `<ESC> f' is equivalent to typing `M-f'.
+
+`undo (C-_ or C-x C-u)'
+     Incremental undo, separately remembered for each line.
+
+`revert-line (M-r)'
+     Undo all changes made to this line.  This is like executing the
+     `undo' command enough times to get back to the beginning.
+
+`tilde-expand (M-~)'
+     Perform tilde expansion on the current word.
+
+`set-mark (C-@)'
+     Set the mark to the point.  If a numeric argument is supplied, the
+     mark is set to that position.
+
+`exchange-point-and-mark (C-x C-x)'
+     Swap the point with the mark.  The current cursor position is set
+     to the saved position, and the old cursor position is saved as the
+     mark.
+
+`character-search (C-])'
+     A character is read and point is moved to the next occurrence of
+     that character.  A negative count searches for previous
+     occurrences.
+
+`character-search-backward (M-C-])'
+     A character is read and point is moved to the previous occurrence
+     of that character.  A negative count searches for subsequent
+     occurrences.
+
+`insert-comment (M-#)'
+     Without a numeric argument, the value of the `comment-begin'
+     variable is inserted at the beginning of the current line.  If a
+     numeric argument is supplied, this command acts as a toggle:  if
+     the characters at the beginning of the line do not match the value
+     of `comment-begin', the value is inserted, otherwise the
+     characters in `comment-begin' are deleted from the beginning of
+     the line.  In either case, the line is accepted as if a newline
+     had been typed.
+
+`dump-functions ()'
+     Print all of the functions and their key bindings to the Readline
+     output stream.  If a numeric argument is supplied, the output is
+     formatted in such a way that it can be made part of an INPUTRC
+     file.  This command is unbound by default.
+
+`dump-variables ()'
+     Print all of the settable variables and their values to the
+     Readline output stream.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`dump-macros ()'
+     Print all of the Readline key sequences bound to macros and the
+     strings they output.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`emacs-editing-mode (C-e)'
+     When in `vi' command mode, this causes a switch to `emacs' editing
+     mode.
+
+`vi-editing-mode (M-C-j)'
+     When in `emacs' editing mode, this causes a switch to `vi' editing
+     mode.
+
+
+\1f
+File: readline.info,  Node: Readline vi Mode,  Prev: Bindable Readline Commands,  Up: Command Line Editing
+
+Readline vi Mode
+================
+
+   While the Readline library does not have a full set of `vi' editing
+functions, it does contain enough to allow simple editing of the line.
+The Readline `vi' mode behaves as specified in the POSIX 1003.2
+standard.
+
+   In order to switch interactively between `emacs' and `vi' editing
+modes, use the command `M-C-j' (bound to emacs-editing-mode when in
+`vi' mode and to vi-editing-mode in `emacs' mode).  The Readline
+default is `emacs' mode.
+
+   When you enter a line in `vi' mode, you are already placed in
+`insertion' mode, as if you had typed an `i'.  Pressing <ESC> switches
+you into `command' mode, where you can edit the text of the line with
+the standard `vi' movement keys, move to previous history lines with
+`k' and subsequent lines with `j', and so forth.
+
+   This document describes the GNU Readline Library, a utility for
+aiding in the consitency of user interface across discrete programs
+that need to provide a command line interface.
+
+   Copyright (C) 1988-2002 Free Software Foundation, Inc.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice pare
+preserved on all copies.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+   Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Foundation.
+
+\1f
+File: readline.info,  Node: Programming with GNU Readline,  Next: Copying This Manual,  Prev: Command Line Editing,  Up: Top
+
+Programming with GNU Readline
+*****************************
+
+   This chapter describes the interface between the GNU Readline
+Library and other programs.  If you are a programmer, and you wish to
+include the features found in GNU Readline such as completion, line
+editing, and interactive history manipulation in your own programs,
+this section is for you.
+
+* Menu:
+
+* Basic Behavior::     Using the default behavior of Readline.
+* Custom Functions::   Adding your own functions to Readline.
+* Readline Variables::                 Variables accessible to custom
+                                       functions.
+* Readline Convenience Functions::     Functions which Readline supplies to
+                                       aid in writing your own custom
+                                       functions.
+* Readline Signal Handling::   How Readline behaves when it receives signals.
+* Custom Completers::  Supplanting or supplementing Readline's
+                       completion functions.
+
+\1f
+File: readline.info,  Node: Basic Behavior,  Next: Custom Functions,  Up: Programming with GNU Readline
+
+Basic Behavior
+==============
+
+   Many programs provide a command line interface, such as `mail',
+`ftp', and `sh'.  For such programs, the default behaviour of Readline
+is sufficient.  This section describes how to use Readline in the
+simplest way possible, perhaps to replace calls in your code to
+`gets()' or `fgets()'.
+
+   The function `readline()' prints a prompt PROMPT and then reads and
+returns a single line of text from the user.  If PROMPT is `NULL' or
+the empty string, no prompt is displayed.  The line `readline' returns
+is allocated with `malloc()'; the caller should `free()' the line when
+it has finished with it.  The declaration for `readline' in ANSI C is
+
+     `char *readline (const char *PROMPT);'
+
+So, one might say
+     `char *line = readline ("Enter a line: ");'
+
+in order to read a line of text from the user.  The line returned has
+the final newline removed, so only the text remains.
+
+   If `readline' encounters an `EOF' while reading the line, and the
+line is empty at that point, then `(char *)NULL' is returned.
+Otherwise, the line is ended just as if a newline had been typed.
+
+   If you want the user to be able to get at the line later, (with
+<C-p> for example), you must call `add_history()' to save the line away
+in a "history" list of such lines.
+
+     `add_history (line)';
+
+For full details on the GNU History Library, see the associated manual.
+
+   It is preferable to avoid saving empty lines on the history list,
+since users rarely have a burning need to reuse a blank line.  Here is
+a function which usefully replaces the standard `gets()' library
+function, and has the advantage of no static buffer to overflow:
+
+     /* A static variable for holding the line. */
+     static char *line_read = (char *)NULL;
+     
+     /* Read a string, and return a pointer to it.
+        Returns NULL on EOF. */
+     char *
+     rl_gets ()
+     {
+       /* If the buffer has already been allocated,
+          return the memory to the free pool. */
+       if (line_read)
+         {
+           free (line_read);
+           line_read = (char *)NULL;
+         }
+     
+       /* Get a line from the user. */
+       line_read = readline ("");
+     
+       /* If the line has any text in it,
+          save it on the history. */
+       if (line_read && *line_read)
+         add_history (line_read);
+     
+       return (line_read);
+     }
+
+   This function gives the user the default behaviour of <TAB>
+completion: completion on file names.  If you do not want Readline to
+complete on filenames, you can change the binding of the <TAB> key with
+`rl_bind_key()'.
+
+     `int rl_bind_key (int KEY, rl_command_func_t *FUNCTION);'
+
+   `rl_bind_key()' takes two arguments: KEY is the character that you
+want to bind, and FUNCTION is the address of the function to call when
+KEY is pressed.  Binding <TAB> to `rl_insert()' makes <TAB> insert
+itself.  `rl_bind_key()' returns non-zero if KEY is not a valid ASCII
+character code (between 0 and 255).
+
+   Thus, to disable the default <TAB> behavior, the following suffices:
+     `rl_bind_key ('\t', rl_insert);'
+
+   This code should be executed once at the start of your program; you
+might write a function called `initialize_readline()' which performs
+this and other desired initializations, such as installing custom
+completers (*note Custom Completers::).
+
+\1f
+File: readline.info,  Node: Custom Functions,  Next: Readline Variables,  Prev: Basic Behavior,  Up: Programming with GNU Readline
+
+Custom Functions
+================
+
+   Readline provides many functions for manipulating the text of the
+line, but it isn't possible to anticipate the needs of all programs.
+This section describes the various functions and variables defined
+within the Readline library which allow a user program to add
+customized functionality to Readline.
+
+   Before declaring any functions that customize Readline's behavior, or
+using any functionality Readline provides in other code, an application
+writer should include the file `<readline/readline.h>' in any file that
+uses Readline's features.  Since some of the definitions in
+`readline.h' use the `stdio' library, the file `<stdio.h>' should be
+included before `readline.h'.
+
+   `readline.h' defines a C preprocessor variable that should be
+treated as an integer, `RL_READLINE_VERSION', which may be used to
+conditionally compile application code depending on the installed
+Readline version.  The value is a hexadecimal encoding of the major and
+minor version numbers of the library, of the form 0xMMMM.  MM is the
+two-digit major version number; MM is the two-digit minor version
+number.  For Readline 4.2, for example, the value of
+`RL_READLINE_VERSION' would be `0x0402'.
+
+* Menu:
+
+* Readline Typedefs::  C declarations to make code readable.
+* Function Writing::   Variables and calling conventions.
+
+\1f
+File: readline.info,  Node: Readline Typedefs,  Next: Function Writing,  Up: Custom Functions
+
+Readline Typedefs
+-----------------
+
+   For readabilty, we declare a number of new object types, all pointers
+to functions.
+
+   The reason for declaring these new types is to make it easier to
+write code describing pointers to C functions with appropriately
+prototyped arguments and return values.
+
+   For instance, say we want to declare a variable FUNC as a pointer to
+a function which takes two `int' arguments and returns an `int' (this
+is the type of all of the Readline bindable functions).  Instead of the
+classic C declaration
+
+   `int (*func)();'
+
+or the ANSI-C style declaration
+
+   `int (*func)(int, int);'
+
+we may write
+
+   `rl_command_func_t *func;'
+
+   The full list of function pointer types available is
+
+`typedef int rl_command_func_t (int, int);'
+
+`typedef char *rl_compentry_func_t (const char *, int);'
+
+`typedef char **rl_completion_func_t (const char *, int, int);'
+
+`typedef char *rl_quote_func_t (char *, int, char *);'
+
+`typedef char *rl_dequote_func_t (char *, int);'
+
+`typedef int rl_compignore_func_t (char **);'
+
+`typedef void rl_compdisp_func_t (char **, int, int);'
+
+`typedef int rl_hook_func_t (void);'
+
+`typedef int rl_getc_func_t (FILE *);'
+
+`typedef int rl_linebuf_func_t (char *, int);'
+
+`typedef int rl_intfunc_t (int);'
+
+`#define rl_ivoidfunc_t rl_hook_func_t'
+
+`typedef int rl_icpfunc_t (char *);'
+
+`typedef int rl_icppfunc_t (char **);'
+
+`typedef void rl_voidfunc_t (void);'
+
+`typedef void rl_vintfunc_t (int);'
+
+`typedef void rl_vcpfunc_t (char *);'
+
+`typedef void rl_vcppfunc_t (char **);'
+
+\1f
+File: readline.info,  Node: Function Writing,  Prev: Readline Typedefs,  Up: Custom Functions
+
+Writing a New Function
+----------------------
+
+   In order to write new functions for Readline, you need to know the
+calling conventions for keyboard-invoked functions, and the names of the
+variables that describe the current state of the line read so far.
+
+   The calling sequence for a command `foo' looks like
+
+     `int foo (int count, int key)'
+
+where COUNT is the numeric argument (or 1 if defaulted) and KEY is the
+key that invoked this function.
+
+   It is completely up to the function as to what should be done with
+the numeric argument.  Some functions use it as a repeat count, some as
+a flag, and others to choose alternate behavior (refreshing the current
+line as opposed to refreshing the screen, for example).  Some choose to
+ignore it.  In general, if a function uses the numeric argument as a
+repeat count, it should be able to do something useful with both
+negative and positive arguments.  At the very least, it should be aware
+that it can be passed a negative argument.
+
+   A command function should return 0 if its action completes
+successfully, and a non-zero value if some error occurs.
+
+\1f
+File: readline.info,  Node: Readline Variables,  Next: Readline Convenience Functions,  Prev: Custom Functions,  Up: Programming with GNU Readline
+
+Readline Variables
+==================
+
+   These variables are available to function writers.
+
+ - Variable: char * rl_line_buffer
+     This is the line gathered so far.  You are welcome to modify the
+     contents of the line, but see *Note Allowing Undoing::.  The
+     function `rl_extend_line_buffer' is available to increase the
+     memory allocated to `rl_line_buffer'.
+
+ - Variable: int rl_point
+     The offset of the current cursor position in `rl_line_buffer' (the
+     _point_).
+
+ - Variable: int rl_end
+     The number of characters present in `rl_line_buffer'.  When
+     `rl_point' is at the end of the line, `rl_point' and `rl_end' are
+     equal.
+
+ - Variable: int rl_mark
+     The MARK (saved position) in the current line.  If set, the mark
+     and point define a _region_.
+
+ - Variable: int rl_done
+     Setting this to a non-zero value causes Readline to return the
+     current line immediately.
+
+ - Variable: int rl_num_chars_to_read
+     Setting this to a positive value before calling `readline()' causes
+     Readline to return after accepting that many characters, rather
+     than reading up to a character bound to `accept-line'.
+
+ - Variable: int rl_pending_input
+     Setting this to a value makes it the next keystroke read.  This is
+     a way to stuff a single character into the input stream.
+
+ - Variable: int rl_dispatching
+     Set to a non-zero value if a function is being called from a key
+     binding; zero otherwise.  Application functions can test this to
+     discover whether they were called directly or by Readline's
+     dispatching mechanism.
+
+ - Variable: int rl_erase_empty_line
+     Setting this to a non-zero value causes Readline to completely
+     erase the current line, including any prompt, any time a newline
+     is typed as the only character on an otherwise-empty line.  The
+     cursor is moved to the beginning of the newly-blank line.
+
+ - Variable: char * rl_prompt
+     The prompt Readline uses.  This is set from the argument to
+     `readline()', and should not be assigned to directly.  The
+     `rl_set_prompt()' function (*note Redisplay::) may be used to
+     modify the prompt string after calling `readline()'.
+
+ - Variable: int rl_already_prompted
+     If an application wishes to display the prompt itself, rather than
+     have Readline do it the first time `readline()' is called, it
+     should set this variable to a non-zero value after displaying the
+     prompt.  The prompt must also be passed as the argument to
+     `readline()' so the redisplay functions can update the display
+     properly.  The calling application is responsible for managing the
+     value; Readline never sets it.
+
+ - Variable: const char * rl_library_version
+     The version number of this revision of the library.
+
+ - Variable: int rl_readline_version
+     An integer encoding the current version of the library.  The
+     encoding is of the form 0xMMMM, where MM is the two-digit major
+     version number, and MM is the two-digit minor version number.  For
+     example, for Readline-4.2, `rl_readline_version' would have the
+     value 0x0402.
+
+ - Variable: int rl_gnu_readline_p
+     Always set to 1, denoting that this is GNU readline rather than
+     some emulation.
+
+ - Variable: const char * rl_terminal_name
+     The terminal type, used for initialization.  If not set by the
+     application, Readline sets this to the value of the `TERM'
+     environment variable the first time it is called.
+
+ - Variable: const char * rl_readline_name
+     This variable is set to a unique name by each application using
+     Readline.  The value allows conditional parsing of the inputrc file
+     (*note Conditional Init Constructs::).
+
+ - Variable: FILE * rl_instream
+     The stdio stream from which Readline reads input.  If `NULL',
+     Readline defaults to STDIN.
+
+ - Variable: FILE * rl_outstream
+     The stdio stream to which Readline performs output.  If `NULL',
+     Readline defaults to STDOUT.
+
+ - Variable: rl_command_func_t * rl_last_func
+     The address of the last command function Readline executed.  May
+     be used to test whether or not a function is being executed twice
+     in succession, for example.
+
+ - Variable: rl_hook_func_t * rl_startup_hook
+     If non-zero, this is the address of a function to call just before
+     `readline' prints the first prompt.
+
+ - Variable: rl_hook_func_t * rl_pre_input_hook
+     If non-zero, this is the address of a function to call after the
+     first prompt has been printed and just before `readline' starts
+     reading input characters.
+
+ - Variable: rl_hook_func_t * rl_event_hook
+     If non-zero, this is the address of a function to call periodically
+     when Readline is waiting for terminal input.  By default, this
+     will be called at most ten times a second if there is no keyboard
+     input.
+
+ - Variable: rl_getc_func_t * rl_getc_function
+     If non-zero, Readline will call indirectly through this pointer to
+     get a character from the input stream.  By default, it is set to
+     `rl_getc', the default Readline character input function (*note
+     Character Input::).
+
+ - Variable: rl_voidfunc_t * rl_redisplay_function
+     If non-zero, Readline will call indirectly through this pointer to
+     update the display with the current contents of the editing buffer.
+     By default, it is set to `rl_redisplay', the default Readline
+     redisplay function (*note Redisplay::).
+
+ - Variable: rl_vintfunc_t * rl_prep_term_function
+     If non-zero, Readline will call indirectly through this pointer to
+     initialize the terminal.  The function takes a single argument, an
+     `int' flag that says whether or not to use eight-bit characters.
+     By default, this is set to `rl_prep_terminal' (*note Terminal
+     Management::).
+
+ - Variable: rl_voidfunc_t * rl_deprep_term_function
+     If non-zero, Readline will call indirectly through this pointer to
+     reset the terminal.  This function should undo the effects of
+     `rl_prep_term_function'.  By default, this is set to
+     `rl_deprep_terminal' (*note Terminal Management::).
+
+ - Variable: Keymap rl_executing_keymap
+     This variable is set to the keymap (*note Keymaps::) in which the
+     currently executing readline function was found.
+
+ - Variable: Keymap rl_binding_keymap
+     This variable is set to the keymap (*note Keymaps::) in which the
+     last key binding occurred.
+
+ - Variable: char * rl_executing_macro
+     This variable is set to the text of any currently-executing macro.
+
+ - Variable: int rl_readline_state
+     A variable with bit values that encapsulate the current Readline
+     state.  A bit is set with the `RL_SETSTATE' macro, and unset with
+     the `RL_UNSETSTATE' macro.  Use the `RL_ISSTATE' macro to test
+     whether a particular state bit is set.  Current state bits include:
+
+    `RL_STATE_NONE'
+          Readline has not yet been called, nor has it begun to
+          intialize.
+
+    `RL_STATE_INITIALIZING'
+          Readline is initializing its internal data structures.
+
+    `RL_STATE_INITIALIZED'
+          Readline has completed its initialization.
+
+    `RL_STATE_TERMPREPPED'
+          Readline has modified the terminal modes to do its own input
+          and redisplay.
+
+    `RL_STATE_READCMD'
+          Readline is reading a command from the keyboard.
+
+    `RL_STATE_METANEXT'
+          Readline is reading more input after reading the meta-prefix
+          character.
+
+    `RL_STATE_DISPATCHING'
+          Readline is dispatching to a command.
+
+    `RL_STATE_MOREINPUT'
+          Readline is reading more input while executing an editing
+          command.
+
+    `RL_STATE_ISEARCH'
+          Readline is performing an incremental history search.
+
+    `RL_STATE_NSEARCH'
+          Readline is performing a non-incremental history search.
+
+    `RL_STATE_SEARCH'
+          Readline is searching backward or forward through the history
+          for a string.
+
+    `RL_STATE_NUMERICARG'
+          Readline is reading a numeric argument.
+
+    `RL_STATE_MACROINPUT'
+          Readline is currently getting its input from a
+          previously-defined keyboard macro.
+
+    `RL_STATE_MACRODEF'
+          Readline is currently reading characters defining a keyboard
+          macro.
+
+    `RL_STATE_OVERWRITE'
+          Readline is in overwrite mode.
+
+    `RL_STATE_COMPLETING'
+          Readline is performing word completion.
+
+    `RL_STATE_SIGHANDLER'
+          Readline is currently executing the readline signal handler.
+
+    `RL_STATE_UNDOING'
+          Readline is performing an undo.
+
+    `RL_STATE_DONE'
+          Readline has read a key sequence bound to `accept-line' and
+          is about to return the line to the caller.
+
+
+ - Variable: int rl_explicit_arg
+     Set to a non-zero value if an explicit numeric argument was
+     specified by the user.  Only valid in a bindable command function.
+
+ - Variable: int rl_numeric_arg
+     Set to the value of any numeric argument explicitly specified by
+     the user before executing the current Readline function.  Only
+     valid in a bindable command function.
+
+ - Variable: int rl_editing_mode
+     Set to a value denoting Readline's current editing mode.  A value
+     of 1 means Readline is currently in emacs mode; 0 means that vi
+     mode is active.
+
+\1f
+File: readline.info,  Node: Readline Convenience Functions,  Next: Readline Signal Handling,  Prev: Readline Variables,  Up: Programming with GNU Readline
+
+Readline Convenience Functions
+==============================
+
+* Menu:
+
+* Function Naming::    How to give a function you write a name.
+* Keymaps::            Making keymaps.
+* Binding Keys::       Changing Keymaps.
+* Associating Function Names and Bindings::    Translate function names to
+                                               key sequences.
+* Allowing Undoing::   How to make your functions undoable.
+* Redisplay::          Functions to control line display.
+* Modifying Text::     Functions to modify `rl_line_buffer'.
+* Character Input::    Functions to read keyboard input.
+* Terminal Management::        Functions to manage terminal settings.
+* Utility Functions::  Generally useful functions and hooks.
+* Miscellaneous Functions::    Functions that don't fall into any category.
+* Alternate Interface::        Using Readline in a `callback' fashion.
+* A Readline Example::         An example Readline function.
+
+\1f
+File: readline.info,  Node: Function Naming,  Next: Keymaps,  Up: Readline Convenience Functions
+
+Naming a Function
+-----------------
+
+   The user can dynamically change the bindings of keys while using
+Readline.  This is done by representing the function with a descriptive
+name.  The user is able to type the descriptive name when referring to
+the function.  Thus, in an init file, one might find
+
+     Meta-Rubout:      backward-kill-word
+
+   This binds the keystroke <Meta-Rubout> to the function
+_descriptively_ named `backward-kill-word'.  You, as the programmer,
+should bind the functions you write to descriptive names as well.
+Readline provides a function for doing that:
+
+ - Function: int rl_add_defun (const char *name, rl_command_func_t
+          *function, int key)
+     Add NAME to the list of named functions.  Make FUNCTION be the
+     function that gets called.  If KEY is not -1, then bind it to
+     FUNCTION using `rl_bind_key()'.
+
+   Using this function alone is sufficient for most applications.  It
+is the recommended way to add a few functions to the default functions
+that Readline has built in.  If you need to do something other than
+adding a function to Readline, you may need to use the underlying
+functions described below.
+
+\1f
+File: readline.info,  Node: Keymaps,  Next: Binding Keys,  Prev: Function Naming,  Up: Readline Convenience Functions
+
+Selecting a Keymap
+------------------
+
+   Key bindings take place on a "keymap".  The keymap is the
+association between the keys that the user types and the functions that
+get run.  You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+
+ - Function: Keymap rl_make_bare_keymap (void)
+     Returns a new, empty keymap.  The space for the keymap is
+     allocated with `malloc()'; the caller should free it by calling
+     `rl_discard_keymap()' when done.
+
+ - Function: Keymap rl_copy_keymap (Keymap map)
+     Return a new keymap which is a copy of MAP.
+
+ - Function: Keymap rl_make_keymap (void)
+     Return a new keymap with the printing characters bound to
+     rl_insert, the lowercase Meta characters bound to run their
+     equivalents, and the Meta digits bound to produce numeric
+     arguments.
+
+ - Function: void rl_discard_keymap (Keymap keymap)
+     Free the storage associated with KEYMAP.
+
+   Readline has several internal keymaps.  These functions allow you to
+change which keymap is active.
+
+ - Function: Keymap rl_get_keymap (void)
+     Returns the currently active keymap.
+
+ - Function: void rl_set_keymap (Keymap keymap)
+     Makes KEYMAP the currently active keymap.
+
+ - Function: Keymap rl_get_keymap_by_name (const char *name)
+     Return the keymap matching NAME.  NAME is one which would be
+     supplied in a `set keymap' inputrc line (*note Readline Init
+     File::).
+
+ - Function: char * rl_get_keymap_name (Keymap keymap)
+     Return the name matching KEYMAP.  NAME is one which would be
+     supplied in a `set keymap' inputrc line (*note Readline Init
+     File::).
+
+\1f
+File: readline.info,  Node: Binding Keys,  Next: Associating Function Names and Bindings,  Prev: Keymaps,  Up: Readline Convenience Functions
+
+Binding Keys
+------------
+
+   Key sequences are associate with functions through the keymap.
+Readline has several internal keymaps: `emacs_standard_keymap',
+`emacs_meta_keymap', `emacs_ctlx_keymap', `vi_movement_keymap', and
+`vi_insertion_keymap'.  `emacs_standard_keymap' is the default, and the
+examples in this manual assume that.
+
+   Since `readline()' installs a set of default key bindings the first
+time it is called, there is always the danger that a custom binding
+installed before the first call to `readline()' will be overridden.  An
+alternate mechanism is to install custom key bindings in an
+initialization function assigned to the `rl_startup_hook' variable
+(*note Readline Variables::).
+
+   These functions manage key bindings.
+
+ - Function: int rl_bind_key (int key, rl_command_func_t *function)
+     Binds KEY to FUNCTION in the currently active keymap.  Returns
+     non-zero in the case of an invalid KEY.
+
+ - Function: int rl_bind_key_in_map (int key, rl_command_func_t
+          *function, Keymap map)
+     Bind KEY to FUNCTION in MAP.  Returns non-zero in the case of an
+     invalid KEY.
+
+ - Function: int rl_bind_key_if_unbound (int key, rl_command_func_t
+          *function)
+     Binds KEY to FUNCTION if it is not already bound in the currently
+     active keymap.  Returns non-zero in the case of an invalid KEY or
+     if KEY is already bound.
+
+ - Function: int rl_bind_key_if_unbound_in_map (int key,
+          rl_command_func_t *function, Keymap map)
+     Binds KEY to FUNCTION if it is not already bound in MAP.  Returns
+     non-zero in the case of an invalid KEY or if KEY is already bound.
+
+ - Function: int rl_unbind_key (int key)
+     Bind KEY to the null function in the currently active keymap.
+     Returns non-zero in case of error.
+
+ - Function: int rl_unbind_key_in_map (int key, Keymap map)
+     Bind KEY to the null function in MAP.  Returns non-zero in case of
+     error.
+
+ - Function: int rl_unbind_function_in_map (rl_command_func_t
+          *function, Keymap map)
+     Unbind all keys that execute FUNCTION in MAP.
+
+ - Function: int rl_unbind_command_in_map (const char *command, Keymap
+          map)
+     Unbind all keys that are bound to COMMAND in MAP.
+
+ - Function: int rl_bind_keyseq (const char *keyseq, rl_command_func_t
+          *function)
+     Bind the key sequence represented by the string KEYSEQ to the
+     function FUNCTION, beginning in the current keymap.  This makes
+     new keymaps as necessary.  The return value is non-zero if KEYSEQ
+     is invalid.
+
+ - Function: int rl_bind_keyseq_in_map (const char *keyseq,
+          rl_command_func_t *function, Keymap map)
+     Bind the key sequence represented by the string KEYSEQ to the
+     function FUNCTION.  This makes new keymaps as necessary.  Initial
+     bindings are performed in MAP.  The return value is non-zero if
+     KEYSEQ is invalid.
+
+ - Function: int rl_set_key (const char *keyseq, rl_command_func_t
+          *function, Keymap map)
+     Equivalent to `rl_bind_keyseq_in_map'.
+
+ - Function: int rl_bind_keyseq_if_unbound (const char *keyseq,
+          rl_command_func_t *function)
+     Binds KEYSEQ to FUNCTION if it is not already bound in the
+     currently active keymap.  Returns non-zero in the case of an
+     invalid KEYSEQ or if KEYSEQ is already bound.
+
+ - Function: int rl_bind_keyseq_if_unbound_in_map (const char *keyseq,
+          rl_command_func_t *function, Keymap map)
+     Binds KEYSEQ to FUNCTION if it is not already bound in MAP.
+     Returns non-zero in the case of an invalid KEYSEQ or if KEYSEQ is
+     already bound.
+
+ - Function: int rl_generic_bind (int type, const char *keyseq, char
+          *data, Keymap map)
+     Bind the key sequence represented by the string KEYSEQ to the
+     arbitrary pointer DATA.  TYPE says what kind of data is pointed to
+     by DATA; this can be a function (`ISFUNC'), a macro (`ISMACR'), or
+     a keymap (`ISKMAP').  This makes new keymaps as necessary.  The
+     initial keymap in which to do bindings is MAP.
+
+ - Function: int rl_parse_and_bind (char *line)
+     Parse LINE as if it had been read from the `inputrc' file and
+     perform any key bindings and variable assignments found (*note
+     Readline Init File::).
+
+ - Function: int rl_read_init_file (const char *filename)
+     Read keybindings and variable assignments from FILENAME (*note
+     Readline Init File::).
+
+\1f
+File: readline.info,  Node: Associating Function Names and Bindings,  Next: Allowing Undoing,  Prev: Binding Keys,  Up: Readline Convenience Functions
+
+Associating Function Names and Bindings
+---------------------------------------
+
+   These functions allow you to find out what keys invoke named
+functions and the functions invoked by a particular key sequence.  You
+may also associate a new function name with an arbitrary function.
+
+ - Function: rl_command_func_t * rl_named_function (const char *name)
+     Return the function with name NAME.
+
+ - Function: rl_command_func_t * rl_function_of_keyseq (const char
+          *keyseq, Keymap map, int *type)
+     Return the function invoked by KEYSEQ in keymap MAP.  If MAP is
+     `NULL', the current keymap is used.  If TYPE is not `NULL', the
+     type of the object is returned in the `int' variable it points to
+     (one of `ISFUNC', `ISKMAP', or `ISMACR').
+
+ - Function: char ** rl_invoking_keyseqs (rl_command_func_t *function)
+     Return an array of strings representing the key sequences used to
+     invoke FUNCTION in the current keymap.
+
+ - Function: char ** rl_invoking_keyseqs_in_map (rl_command_func_t
+          *function, Keymap map)
+     Return an array of strings representing the key sequences used to
+     invoke FUNCTION in the keymap MAP.
+
+ - Function: void rl_function_dumper (int readable)
+     Print the readline function names and the key sequences currently
+     bound to them to `rl_outstream'.  If READABLE is non-zero, the
+     list is formatted in such a way that it can be made part of an
+     `inputrc' file and re-read.
+
+ - Function: void rl_list_funmap_names (void)
+     Print the names of all bindable Readline functions to
+     `rl_outstream'.
+
+ - Function: const char ** rl_funmap_names (void)
+     Return a NULL terminated array of known function names.  The array
+     is sorted.  The array itself is allocated, but not the strings
+     inside.  You should `free()' the array when you are done, but not
+     the pointers.
+
+ - Function: int rl_add_funmap_entry (const char *name,
+          rl_command_func_t *function)
+     Add NAME to the list of bindable Readline command names, and make
+     FUNCTION the function to be called when NAME is invoked.
+
+\1f
+File: readline.info,  Node: Allowing Undoing,  Next: Redisplay,  Prev: Associating Function Names and Bindings,  Up: Readline Convenience Functions
+
+Allowing Undoing
+----------------
+
+   Supporting the undo command is a painless thing, and makes your
+functions much more useful.  It is certainly easy to try something if
+you know you can undo it.
+
+   If your function simply inserts text once, or deletes text once, and
+uses `rl_insert_text()' or `rl_delete_text()' to do it, then undoing is
+already done for you automatically.
+
+   If you do multiple insertions or multiple deletions, or any
+combination of these operations, you should group them together into
+one operation.  This is done with `rl_begin_undo_group()' and
+`rl_end_undo_group()'.
+
+   The types of events that can be undone are:
+
+     enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END };
+
+   Notice that `UNDO_DELETE' means to insert some text, and
+`UNDO_INSERT' means to delete some text.  That is, the undo code tells
+what to undo, not how to undo it.  `UNDO_BEGIN' and `UNDO_END' are tags
+added by `rl_begin_undo_group()' and `rl_end_undo_group()'.
+
+ - Function: int rl_begin_undo_group (void)
+     Begins saving undo information in a group construct.  The undo
+     information usually comes from calls to `rl_insert_text()' and
+     `rl_delete_text()', but could be the result of calls to
+     `rl_add_undo()'.
+
+ - Function: int rl_end_undo_group (void)
+     Closes the current undo group started with `rl_begin_undo_group
+     ()'.  There should be one call to `rl_end_undo_group()' for each
+     call to `rl_begin_undo_group()'.
+
+ - Function: void rl_add_undo (enum undo_code what, int start, int end,
+          char *text)
+     Remember how to undo an event (according to WHAT).  The affected
+     text runs from START to END, and encompasses TEXT.
+
+ - Function: void rl_free_undo_list (void)
+     Free the existing undo list.
+
+ - Function: int rl_do_undo (void)
+     Undo the first thing on the undo list.  Returns `0' if there was
+     nothing to undo, non-zero if something was undone.
+
+   Finally, if you neither insert nor delete text, but directly modify
+the existing text (e.g., change its case), call `rl_modifying()' once,
+just before you modify the text.  You must supply the indices of the
+text range that you are going to modify.
+
+ - Function: int rl_modifying (int start, int end)
+     Tell Readline to save the text between START and END as a single
+     undo unit.  It is assumed that you will subsequently modify that
+     text.
+
+\1f
+File: readline.info,  Node: Redisplay,  Next: Modifying Text,  Prev: Allowing Undoing,  Up: Readline Convenience Functions
+
+Redisplay
+---------
+
+ - Function: void rl_redisplay (void)
+     Change what's displayed on the screen to reflect the current
+     contents of `rl_line_buffer'.
+
+ - Function: int rl_forced_update_display (void)
+     Force the line to be updated and redisplayed, whether or not
+     Readline thinks the screen display is correct.
+
+ - Function: int rl_on_new_line (void)
+     Tell the update functions that we have moved onto a new (empty)
+     line, usually after ouputting a newline.
+
+ - Function: int rl_on_new_line_with_prompt (void)
+     Tell the update functions that we have moved onto a new line, with
+     RL_PROMPT already displayed.  This could be used by applications
+     that want to output the prompt string themselves, but still need
+     Readline to know the prompt string length for redisplay.  It
+     should be used after setting RL_ALREADY_PROMPTED.
+
+ - Function: int rl_reset_line_state (void)
+     Reset the display state to a clean state and redisplay the current
+     line starting on a new line.
+
+ - Function: int rl_crlf (void)
+     Move the cursor to the start of the next screen line.
+
+ - Function: int rl_show_char (int c)
+     Display character C on `rl_outstream'.  If Readline has not been
+     set to display meta characters directly, this will convert meta
+     characters to a meta-prefixed key sequence.  This is intended for
+     use by applications which wish to do their own redisplay.
+
+ - Function: int rl_message (const char *, ...)
+     The arguments are a format string as would be supplied to `printf',
+     possibly containing conversion specifications such as `%d', and
+     any additional arguments necessary to satisfy the conversion
+     specifications.  The resulting string is displayed in the "echo
+     area".  The echo area is also used to display numeric arguments
+     and search strings.
+
+ - Function: int rl_clear_message (void)
+     Clear the message in the echo area.
+
+ - Function: void rl_save_prompt (void)
+     Save the local Readline prompt display state in preparation for
+     displaying a new message in the message area with `rl_message()'.
+
+ - Function: void rl_restore_prompt (void)
+     Restore the local Readline prompt display state saved by the most
+     recent call to `rl_save_prompt'.
+
+ - Function: int rl_expand_prompt (char *prompt)
+     Expand any special character sequences in PROMPT and set up the
+     local Readline prompt redisplay variables.  This function is
+     called by `readline()'.  It may also be called to expand the
+     primary prompt if the `rl_on_new_line_with_prompt()' function or
+     `rl_already_prompted' variable is used.  It returns the number of
+     visible characters on the last line of the (possibly multi-line)
+     prompt.
+
+ - Function: int rl_set_prompt (const char *prompt)
+     Make Readline use PROMPT for subsequent redisplay.  This calls
+     `rl_expand_prompt()' to expand the prompt and sets `rl_prompt' to
+     the result.
+
+\1f
+File: readline.info,  Node: Modifying Text,  Next: Character Input,  Prev: Redisplay,  Up: Readline Convenience Functions
+
+Modifying Text
+--------------
+
+ - Function: int rl_insert_text (const char *text)
+     Insert TEXT into the line at the current cursor position.  Returns
+     the number of characters inserted.
+
+ - Function: int rl_delete_text (int start, int end)
+     Delete the text between START and END in the current line.
+     Returns the number of characters deleted.
+
+ - Function: char * rl_copy_text (int start, int end)
+     Return a copy of the text between START and END in the current
+     line.
+
+ - Function: int rl_kill_text (int start, int end)
+     Copy the text between START and END in the current line to the
+     kill ring, appending or prepending to the last kill if the last
+     command was a kill command.  The text is deleted.  If START is
+     less than END, the text is appended, otherwise prepended.  If the
+     last command was not a kill, a new kill ring slot is used.
+
+ - Function: int rl_push_macro_input (char *macro)
+     Cause MACRO to be inserted into the line, as if it had been invoked
+     by a key bound to a macro.  Not especially useful; use
+     `rl_insert_text()' instead.
+
+\1f
+File: readline.info,  Node: Character Input,  Next: Terminal Management,  Prev: Modifying Text,  Up: Readline Convenience Functions
+
+Character Input
+---------------
+
+ - Function: int rl_read_key (void)
+     Return the next character available from Readline's current input
+     stream.  This handles input inserted into the input stream via
+     RL_PENDING_INPUT (*note Readline Variables::) and
+     `rl_stuff_char()', macros, and characters read from the keyboard.
+     While waiting for input, this function will call any function
+     assigned to the `rl_event_hook' variable.
+
+ - Function: int rl_getc (FILE *stream)
+     Return the next character available from STREAM, which is assumed
+     to be the keyboard.
+
+ - Function: int rl_stuff_char (int c)
+     Insert C into the Readline input stream.  It will be "read" before
+     Readline attempts to read characters from the terminal with
+     `rl_read_key()'.  Up to 512 characters may be pushed back.
+     `rl_stuff_char' returns 1 if the character was successfully
+     inserted; 0 otherwise.
+
+ - Function: int rl_execute_next (int c)
+     Make C be the next command to be executed when `rl_read_key()' is
+     called.  This sets RL_PENDING_INPUT.
+
+ - Function: int rl_clear_pending_input (void)
+     Unset RL_PENDING_INPUT, effectively negating the effect of any
+     previous call to `rl_execute_next()'.  This works only if the
+     pending input has not already been read with `rl_read_key()'.
+
+ - Function: int rl_set_keyboard_input_timeout (int u)
+     While waiting for keyboard input in `rl_read_key()', Readline will
+     wait for U microseconds for input before calling any function
+     assigned to `rl_event_hook'.  The default waiting period is
+     one-tenth of a second.  Returns the old timeout value.
+
+\1f
+File: readline.info,  Node: Terminal Management,  Next: Utility Functions,  Prev: Character Input,  Up: Readline Convenience Functions
+
+Terminal Management
+-------------------
+
+ - Function: void rl_prep_terminal (int meta_flag)
+     Modify the terminal settings for Readline's use, so `readline()'
+     can read a single character at a time from the keyboard.  The
+     META_FLAG argument should be non-zero if Readline should read
+     eight-bit input.
+
+ - Function: void rl_deprep_terminal (void)
+     Undo the effects of `rl_prep_terminal()', leaving the terminal in
+     the state in which it was before the most recent call to
+     `rl_prep_terminal()'.
+
+ - Function: void rl_tty_set_default_bindings (Keymap kmap)
+     Read the operating system's terminal editing characters (as would
+     be displayed by `stty') to their Readline equivalents.  The
+     bindings are performed in KMAP.
+
+ - Function: void rl_tty_unset_default_bindings (Keymap kmap)
+     Reset the bindings manipulated by `rl_tty_set_default_bindings' so
+     that the terminal editing characters are bound to `rl_insert'.
+     The bindings are performed in KMAP.
+
+ - Function: int rl_reset_terminal (const char *terminal_name)
+     Reinitialize Readline's idea of the terminal settings using
+     TERMINAL_NAME as the terminal type (e.g., `vt100').  If
+     TERMINAL_NAME is `NULL', the value of the `TERM' environment
+     variable is used.
+
+\1f
+File: readline.info,  Node: Utility Functions,  Next: Miscellaneous Functions,  Prev: Terminal Management,  Up: Readline Convenience Functions
+
+Utility Functions
+-----------------
+
+ - Function: void rl_replace_line (const char *text, int clear_undo)
+     Replace the contents of `rl_line_buffer' with TEXT.  The point and
+     mark are preserved, if possible.  If CLEAR_UNDO is non-zero, the
+     undo list associated with the current line is cleared.
+
+ - Function: int rl_extend_line_buffer (int len)
+     Ensure that `rl_line_buffer' has enough space to hold LEN
+     characters, possibly reallocating it if necessary.
+
+ - Function: int rl_initialize (void)
+     Initialize or re-initialize Readline's internal state.  It's not
+     strictly necessary to call this; `readline()' calls it before
+     reading any input.
+
+ - Function: int rl_ding (void)
+     Ring the terminal bell, obeying the setting of `bell-style'.
+
+ - Function: int rl_alphabetic (int c)
+     Return 1 if C is an alphabetic character.
+
+ - Function: void rl_display_match_list (char **matches, int len, int
+          max)
+     A convenience function for displaying a list of strings in
+     columnar format on Readline's output stream.  `matches' is the list
+     of strings, in argv format, such as a list of completion matches.
+     `len' is the number of strings in `matches', and `max' is the
+     length of the longest string in `matches'.  This function uses the
+     setting of `print-completions-horizontally' to select how the
+     matches are displayed (*note Readline Init File Syntax::).
+
+   The following are implemented as macros, defined in `chardefs.h'.
+Applications should refrain from using them.
+
+ - Function: int _rl_uppercase_p (int c)
+     Return 1 if C is an uppercase alphabetic character.
+
+ - Function: int _rl_lowercase_p (int c)
+     Return 1 if C is a lowercase alphabetic character.
+
+ - Function: int _rl_digit_p (int c)
+     Return 1 if C is a numeric character.
+
+ - Function: int _rl_to_upper (int c)
+     If C is a lowercase alphabetic character, return the corresponding
+     uppercase character.
+
+ - Function: int _rl_to_lower (int c)
+     If C is an uppercase alphabetic character, return the corresponding
+     lowercase character.
+
+ - Function: int _rl_digit_value (int c)
+     If C is a number, return the value it represents.
+
+\1f
+File: readline.info,  Node: Miscellaneous Functions,  Next: Alternate Interface,  Prev: Utility Functions,  Up: Readline Convenience Functions
+
+Miscellaneous Functions
+-----------------------
+
+ - Function: int rl_macro_bind (const char *keyseq, const char *macro,
+          Keymap map)
+     Bind the key sequence KEYSEQ to invoke the macro MACRO.  The
+     binding is performed in MAP.  When KEYSEQ is invoked, the MACRO
+     will be inserted into the line.  This function is deprecated; use
+     `rl_generic_bind()' instead.
+
+ - Function: void rl_macro_dumper (int readable)
+     Print the key sequences bound to macros and their values, using
+     the current keymap, to `rl_outstream'.  If READABLE is non-zero,
+     the list is formatted in such a way that it can be made part of an
+     `inputrc' file and re-read.
+
+ - Function: int rl_variable_bind (const char *variable, const char
+          *value)
+     Make the Readline variable VARIABLE have VALUE.  This behaves as
+     if the readline command `set VARIABLE VALUE' had been executed in
+     an `inputrc' file (*note Readline Init File Syntax::).
+
+ - Function: void rl_variable_dumper (int readable)
+     Print the readline variable names and their current values to
+     `rl_outstream'.  If READABLE is non-zero, the list is formatted in
+     such a way that it can be made part of an `inputrc' file and
+     re-read.
+
+ - Function: int rl_set_paren_blink_timeout (int u)
+     Set the time interval (in microseconds) that Readline waits when
+     showing a balancing character when `blink-matching-paren' has been
+     enabled.
+
+ - Function: char * rl_get_termcap (const char *cap)
+     Retrieve the string value of the termcap capability CAP.  Readline
+     fetches the termcap entry for the current terminal name and uses
+     those capabilities to move around the screen line and perform other
+     terminal-specific operations, like erasing a line.  Readline does
+     not use all of a terminal's capabilities, and this function will
+     return values for only those capabilities Readline uses.
+
+\1f
+File: readline.info,  Node: Alternate Interface,  Next: A Readline Example,  Prev: Miscellaneous Functions,  Up: Readline Convenience Functions
+
+Alternate Interface
+-------------------
+
+   An alternate interface is available to plain `readline()'.  Some
+applications need to interleave keyboard I/O with file, device, or
+window system I/O, typically by using a main loop to `select()' on
+various file descriptors.  To accomodate this need, readline can also
+be invoked as a `callback' function from an event loop.  There are
+functions available to make this easy.
+
+ - Function: void rl_callback_handler_install (const char *prompt,
+          rl_vcpfunc_t *lhandler)
+     Set up the terminal for readline I/O and display the initial
+     expanded value of PROMPT.  Save the value of LHANDLER to use as a
+     function to call when a complete line of input has been entered.
+     The function takes the text of the line as an argument.
+
+ - Function: void rl_callback_read_char (void)
+     Whenever an application determines that keyboard input is
+     available, it should call `rl_callback_read_char()', which will
+     read the next character from the current input source.  If that
+     character completes the line, `rl_callback_read_char' will invoke
+     the LHANDLER function saved by `rl_callback_handler_install' to
+     process the line.  Before calling the LHANDLER function, the
+     terminal settings are reset to the values they had before calling
+     `rl_callback_handler_install'.  If the LHANDLER function returns,
+     the terminal settings are modified for Readline's use again.
+     `EOF' is  indicated by calling LHANDLER with a `NULL' line.
+
+ - Function: void rl_callback_handler_remove (void)
+     Restore the terminal to its initial state and remove the line
+     handler.  This may be called from within a callback as well as
+     independently.  If the LHANDLER installed by
+     `rl_callback_handler_install' does not exit the program, either
+     this function or the function referred to by the value of
+     `rl_deprep_term_function' should be called before the program
+     exits to reset the terminal settings.
+
+\1f
+File: readline.info,  Node: A Readline Example,  Prev: Alternate Interface,  Up: Readline Convenience Functions
+
+A Readline Example
+------------------
+
+   Here is a function which changes lowercase characters to their
+uppercase equivalents, and uppercase characters to lowercase.  If this
+function was bound to `M-c', then typing `M-c' would change the case of
+the character under point.  Typing `M-1 0 M-c' would change the case of
+the following 10 characters, leaving the cursor on the last character
+changed.
+
+     /* Invert the case of the COUNT following characters. */
+     int
+     invert_case_line (count, key)
+          int count, key;
+     {
+       register int start, end, i;
+     
+       start = rl_point;
+     
+       if (rl_point >= rl_end)
+         return (0);
+     
+       if (count < 0)
+         {
+           direction = -1;
+           count = -count;
+         }
+       else
+         direction = 1;
+     
+       /* Find the end of the range to modify. */
+       end = start + (count * direction);
+     
+       /* Force it to be within range. */
+       if (end > rl_end)
+         end = rl_end;
+       else if (end < 0)
+         end = 0;
+     
+       if (start == end)
+         return (0);
+     
+       if (start > end)
+         {
+           int temp = start;
+           start = end;
+           end = temp;
+         }
+     
+       /* Tell readline that we are modifying the line,
+          so it will save the undo information. */
+       rl_modifying (start, end);
+     
+       for (i = start; i != end; i++)
+         {
+           if (_rl_uppercase_p (rl_line_buffer[i]))
+             rl_line_buffer[i] = _rl_to_lower (rl_line_buffer[i]);
+           else if (_rl_lowercase_p (rl_line_buffer[i]))
+             rl_line_buffer[i] = _rl_to_upper (rl_line_buffer[i]);
+         }
+       /* Move point to on top of the last character changed. */
+       rl_point = (direction == 1) ? end - 1 : start;
+       return (0);
+     }
+
+\1f
+File: readline.info,  Node: Readline Signal Handling,  Next: Custom Completers,  Prev: Readline Convenience Functions,  Up: Programming with GNU Readline
+
+Readline Signal Handling
+========================
+
+   Signals are asynchronous events sent to a process by the Unix kernel,
+sometimes on behalf of another process.  They are intended to indicate
+exceptional events, like a user pressing the interrupt key on his
+terminal, or a network connection being broken.  There is a class of
+signals that can be sent to the process currently reading input from
+the keyboard.  Since Readline changes the terminal attributes when it
+is called, it needs to perform special processing when such a signal is
+received in order to restore the terminal to a sane state, or provide
+application writers with functions to do so manually.
+
+   Readline contains an internal signal handler that is installed for a
+number of signals (`SIGINT', `SIGQUIT', `SIGTERM', `SIGALRM',
+`SIGTSTP', `SIGTTIN', and `SIGTTOU').  When one of these signals is
+received, the signal handler will reset the terminal attributes to
+those that were in effect before `readline()' was called, reset the
+signal handling to what it was before `readline()' was called, and
+resend the signal to the calling application.  If and when the calling
+application's signal handler returns, Readline will reinitialize the
+terminal and continue to accept input.  When a `SIGINT' is received,
+the Readline signal handler performs some additional work, which will
+cause any partially-entered line to be aborted (see the description of
+`rl_free_line_state()' below).
+
+   There is an additional Readline signal handler, for `SIGWINCH', which
+the kernel sends to a process whenever the terminal's size changes (for
+example, if a user resizes an `xterm').  The Readline `SIGWINCH'
+handler updates Readline's internal screen size information, and then
+calls any `SIGWINCH' signal handler the calling application has
+installed.  Readline calls the application's `SIGWINCH' signal handler
+without resetting the terminal to its original state.  If the
+application's signal handler does more than update its idea of the
+terminal size and return (for example, a `longjmp' back to a main
+processing loop), it _must_ call `rl_cleanup_after_signal()' (described
+below), to restore the terminal state.
+
+   Readline provides two variables that allow application writers to
+control whether or not it will catch certain signals and act on them
+when they are received.  It is important that applications change the
+values of these variables only when calling `readline()', not in a
+signal handler, so Readline's internal signal state is not corrupted.
+
+ - Variable: int rl_catch_signals
+     If this variable is non-zero, Readline will install signal
+     handlers for `SIGINT', `SIGQUIT', `SIGTERM', `SIGALRM', `SIGTSTP',
+     `SIGTTIN', and `SIGTTOU'.
+
+     The default value of `rl_catch_signals' is 1.
+
+ - Variable: int rl_catch_sigwinch
+     If this variable is non-zero, Readline will install a signal
+     handler for `SIGWINCH'.
+
+     The default value of `rl_catch_sigwinch' is 1.
+
+   If an application does not wish to have Readline catch any signals,
+or to handle signals other than those Readline catches (`SIGHUP', for
+example), Readline provides convenience functions to do the necessary
+terminal and internal state cleanup upon receipt of a signal.
+
+ - Function: void rl_cleanup_after_signal (void)
+     This function will reset the state of the terminal to what it was
+     before `readline()' was called, and remove the Readline signal
+     handlers for all signals, depending on the values of
+     `rl_catch_signals' and `rl_catch_sigwinch'.
+
+ - Function: void rl_free_line_state (void)
+     This will free any partial state associated with the current input
+     line (undo information, any partial history entry, any
+     partially-entered keyboard macro, and any partially-entered
+     numeric argument).  This should be called before
+     `rl_cleanup_after_signal()'.  The Readline signal handler for
+     `SIGINT' calls this to abort the current input line.
+
+ - Function: void rl_reset_after_signal (void)
+     This will reinitialize the terminal and reinstall any Readline
+     signal handlers, depending on the values of `rl_catch_signals' and
+     `rl_catch_sigwinch'.
+
+   If an application does not wish Readline to catch `SIGWINCH', it may
+call `rl_resize_terminal()' or `rl_set_screen_size()' to force Readline
+to update its idea of the terminal size when a `SIGWINCH' is received.
+
+ - Function: void rl_resize_terminal (void)
+     Update Readline's internal screen size by reading values from the
+     kernel.
+
+ - Function: void rl_set_screen_size (int rows, int cols)
+     Set Readline's idea of the terminal size to ROWS rows and COLS
+     columns.
+
+   If an application does not want to install a `SIGWINCH' handler, but
+is still interested in the screen dimensions, Readline's idea of the
+screen size may be queried.
+
+ - Function: void rl_get_screen_size (int *rows, int *cols)
+     Return Readline's idea of the terminal's size in the variables
+     pointed to by the arguments.
+
+   The following functions install and remove Readline's signal
+handlers.
+
+ - Function: int rl_set_signals (void)
+     Install Readline's signal handler for `SIGINT', `SIGQUIT',
+     `SIGTERM', `SIGALRM', `SIGTSTP', `SIGTTIN', `SIGTTOU', and
+     `SIGWINCH', depending on the values of `rl_catch_signals' and
+     `rl_catch_sigwinch'.
+
+ - Function: int rl_clear_signals (void)
+     Remove all of the Readline signal handlers installed by
+     `rl_set_signals()'.
+
+\1f
+File: readline.info,  Node: Custom Completers,  Prev: Readline Signal Handling,  Up: Programming with GNU Readline
+
+Custom Completers
+=================
+
+   Typically, a program that reads commands from the user has a way of
+disambiguating commands and data.  If your program is one of these, then
+it can provide completion for commands, data, or both.  The following
+sections describe how your program and Readline cooperate to provide
+this service.
+
+* Menu:
+
+* How Completing Works::       The logic used to do completion.
+* Completion Functions::       Functions provided by Readline.
+* Completion Variables::       Variables which control completion.
+* A Short Completion Example:: An example of writing completer subroutines.
+
+\1f
+File: readline.info,  Node: How Completing Works,  Next: Completion Functions,  Up: Custom Completers
+
+How Completing Works
+--------------------
+
+   In order to complete some text, the full list of possible completions
+must be available.  That is, it is not possible to accurately expand a
+partial word without knowing all of the possible words which make sense
+in that context.  The Readline library provides the user interface to
+completion, and two of the most common completion functions:  filename
+and username.  For completing other types of text, you must write your
+own completion function.  This section describes exactly what such
+functions must do, and provides an example.
+
+   There are three major functions used to perform completion:
+
+  1. The user-interface function `rl_complete()'.  This function is
+     called with the same arguments as other bindable Readline
+     functions: COUNT and INVOKING_KEY.  It isolates the word to be
+     completed and calls `rl_completion_matches()' to generate a list
+     of possible completions.  It then either lists the possible
+     completions, inserts the possible completions, or actually
+     performs the completion, depending on which behavior is desired.
+
+  2. The internal function `rl_completion_matches()' uses an
+     application-supplied "generator" function to generate the list of
+     possible matches, and then returns the array of these matches.
+     The caller should place the address of its generator function in
+     `rl_completion_entry_function'.
+
+  3. The generator function is called repeatedly from
+     `rl_completion_matches()', returning a string each time.  The
+     arguments to the generator function are TEXT and STATE.  TEXT is
+     the partial word to be completed.  STATE is zero the first time
+     the function is called, allowing the generator to perform any
+     necessary initialization, and a positive non-zero integer for each
+     subsequent call.  The generator function returns `(char *)NULL' to
+     inform `rl_completion_matches()' that there are no more
+     possibilities left.  Usually the generator function computes the
+     list of possible completions when STATE is zero, and returns them
+     one at a time on subsequent calls.  Each string the generator
+     function returns as a match must be allocated with `malloc()';
+     Readline frees the strings when it has finished with them.  Such a
+     generator function is referred to as an "application-specific
+     completion function".
+
+
+ - Function: int rl_complete (int ignore, int invoking_key)
+     Complete the word at or before point.  You have supplied the
+     function that does the initial simple matching selection algorithm
+     (see `rl_completion_matches()').  The default is to do filename
+     completion.
+
+ - Variable: rl_compentry_func_t * rl_completion_entry_function
+     This is a pointer to the generator function for
+     `rl_completion_matches()'.  If the value of
+     `rl_completion_entry_function' is `NULL' then the default filename
+     generator function, `rl_filename_completion_function()', is used.
+     An "application-specific completion function" is a function whose
+     address is assigned to `rl_completion_entry_function' and whose
+     return values are used to  generate possible completions.
+
+\1f
+File: readline.info,  Node: Completion Functions,  Next: Completion Variables,  Prev: How Completing Works,  Up: Custom Completers
+
+Completion Functions
+--------------------
+
+   Here is the complete list of callable completion functions present in
+Readline.
+
+ - Function: int rl_complete_internal (int what_to_do)
+     Complete the word at or before point.  WHAT_TO_DO says what to do
+     with the completion.  A value of `?' means list the possible
+     completions.  `TAB' means do standard completion.  `*' means
+     insert all of the possible completions.  `!' means to display all
+     of the possible completions, if there is more than one, as well as
+     performing partial completion.  `@' is similar to `!', but
+     possible completions are not listed if the possible completions
+     share a common prefix.
+
+ - Function: int rl_complete (int ignore, int invoking_key)
+     Complete the word at or before point.  You have supplied the
+     function that does the initial simple matching selection algorithm
+     (see `rl_completion_matches()' and `rl_completion_entry_function').
+     The default is to do filename completion.  This calls
+     `rl_complete_internal()' with an argument depending on
+     INVOKING_KEY.
+
+ - Function: int rl_possible_completions (int count, int invoking_key)
+     List the possible completions.  See description of `rl_complete
+     ()'.  This calls `rl_complete_internal()' with an argument of `?'.
+
+ - Function: int rl_insert_completions (int count, int invoking_key)
+     Insert the list of possible completions into the line, deleting the
+     partially-completed word.  See description of `rl_complete()'.
+     This calls `rl_complete_internal()' with an argument of `*'.
+
+ - Function: int rl_completion_mode (rl_command_func_t *cfunc)
+     Returns the apppriate value to pass to `rl_complete_internal()'
+     depending on whether CFUNC was called twice in succession and the
+     values of the `show-all-if-ambiguous' and `show-all-if-unmodified'
+     variables.  Application-specific completion functions may use this
+     function to present the same interface as `rl_complete()'.
+
+ - Function: char ** rl_completion_matches (const char *text,
+          rl_compentry_func_t *entry_func)
+     Returns an array of strings which is a list of completions for
+     TEXT.  If there are no completions, returns `NULL'.  The first
+     entry in the returned array is the substitution for TEXT.  The
+     remaining entries are the possible completions.  The array is
+     terminated with a `NULL' pointer.
+
+     ENTRY_FUNC is a function of two args, and returns a `char *'.  The
+     first argument is TEXT.  The second is a state argument; it is
+     zero on the first call, and non-zero on subsequent calls.
+     ENTRY_FUNC returns a `NULL'  pointer to the caller when there are
+     no more matches.
+
+ - Function: char * rl_filename_completion_function (const char *text,
+          int state)
+     A generator function for filename completion in the general case.
+     TEXT is a partial filename.  The Bash source is a useful reference
+     for writing application-specific completion functions (the Bash
+     completion functions call this and other Readline functions).
+
+ - Function: char * rl_username_completion_function (const char *text,
+          int state)
+     A completion generator for usernames.  TEXT contains a partial
+     username preceded by a random character (usually `~').  As with all
+     completion generators, STATE is zero on the first call and non-zero
+     for subsequent calls.
+
+\1f
+File: readline.info,  Node: Completion Variables,  Next: A Short Completion Example,  Prev: Completion Functions,  Up: Custom Completers
+
+Completion Variables
+--------------------
+
+ - Variable: rl_compentry_func_t * rl_completion_entry_function
+     A pointer to the generator function for `rl_completion_matches()'.
+     `NULL' means to use `rl_filename_completion_function()', the
+     default filename completer.
+
+ - Variable: rl_completion_func_t * rl_attempted_completion_function
+     A pointer to an alternative function to create matches.  The
+     function is called with TEXT, START, and END.  START and END are
+     indices in `rl_line_buffer' defining the boundaries of TEXT, which
+     is a character string.  If this function exists and returns
+     `NULL', or if this variable is set to `NULL', then `rl_complete()'
+     will call the value of `rl_completion_entry_function' to generate
+     matches, otherwise the array of strings returned will be used.  If
+     this function sets the `rl_attempted_completion_over' variable to
+     a non-zero value, Readline will not perform its default completion
+     even if this function returns no matches.
+
+ - Variable: rl_quote_func_t * rl_filename_quoting_function
+     A pointer to a function that will quote a filename in an
+     application-specific fashion.  This is called if filename
+     completion is being attempted and one of the characters in
+     `rl_filename_quote_characters' appears in a completed filename.
+     The function is called with TEXT, MATCH_TYPE, and QUOTE_POINTER.
+     The TEXT is the filename to be quoted.  The MATCH_TYPE is either
+     `SINGLE_MATCH', if there is only one completion match, or
+     `MULT_MATCH'.  Some functions use this to decide whether or not to
+     insert a closing quote character.  The QUOTE_POINTER is a pointer
+     to any opening quote character the user typed.  Some functions
+     choose to reset this character.
+
+ - Variable: rl_dequote_func_t * rl_filename_dequoting_function
+     A pointer to a function that will remove application-specific
+     quoting characters from a filename before completion is attempted,
+     so those characters do not interfere with matching the text
+     against names in the filesystem.  It is called with TEXT, the text
+     of the word to be dequoted, and QUOTE_CHAR, which is the quoting
+     character that delimits the filename (usually `'' or `"').  If
+     QUOTE_CHAR is zero, the filename was not in an embedded string.
+
+ - Variable: rl_linebuf_func_t * rl_char_is_quoted_p
+     A pointer to a function to call that determines whether or not a
+     specific character in the line buffer is quoted, according to
+     whatever quoting mechanism the program calling Readline uses.  The
+     function is called with two arguments: TEXT, the text of the line,
+     and INDEX, the index of the character in the line.  It is used to
+     decide whether a character found in
+     `rl_completer_word_break_characters' should be used to break words
+     for the completer.
+
+ - Variable: rl_compignore_func_t * rl_ignore_some_completions_function
+     This function, if defined, is called by the completer when real
+     filename completion is done, after all the matching names have
+     been generated.  It is passed a `NULL' terminated array of matches.
+     The first element (`matches[0]') is the maximal substring common
+     to all matches. This function can re-arrange the list of matches
+     as required, but each element deleted from the array must be freed.
+
+ - Variable: rl_icppfunc_t * rl_directory_completion_hook
+     This function, if defined, is allowed to modify the directory
+     portion of filenames Readline completes.  It is called with the
+     address of a string (the current directory name) as an argument,
+     and may modify that string.  If the string is replaced with a new
+     string, the old value should be freed.  Any modified directory
+     name should have a trailing slash.  The modified value will be
+     displayed as part of the completion, replacing the directory
+     portion of the pathname the user typed.  It returns an integer
+     that should be non-zero if the function modifies its directory
+     argument.  It could be used to expand symbolic links or shell
+     variables in pathnames.
+
+ - Variable: rl_compdisp_func_t * rl_completion_display_matches_hook
+     If non-zero, then this is the address of a function to call when
+     completing a word would normally display the list of possible
+     matches.  This function is called in lieu of Readline displaying
+     the list.  It takes three arguments: (`char **'MATCHES, `int'
+     NUM_MATCHES, `int' MAX_LENGTH) where MATCHES is the array of
+     matching strings, NUM_MATCHES is the number of strings in that
+     array, and MAX_LENGTH is the length of the longest string in that
+     array.  Readline provides a convenience function,
+     `rl_display_match_list', that takes care of doing the display to
+     Readline's output stream.  That function may be called from this
+     hook.
+
+ - Variable: const char * rl_basic_word_break_characters
+     The basic list of characters that signal a break between words for
+     the completer routine.  The default value of this variable is the
+     characters which break words for completion in Bash: `"
+     \t\n\"\\'`@$><=;|&{("'.
+
+ - Variable: const char * rl_basic_quote_characters
+     A list of quote characters which can cause a word break.
+
+ - Variable: const char * rl_completer_word_break_characters
+     The list of characters that signal a break between words for
+     `rl_complete_internal()'.  The default list is the value of
+     `rl_basic_word_break_characters'.
+
+ - Variable: const char * rl_completer_quote_characters
+     A list of characters which can be used to quote a substring of the
+     line.  Completion occurs on the entire substring, and within the
+     substring `rl_completer_word_break_characters' are treated as any
+     other character, unless they also appear within this list.
+
+ - Variable: const char * rl_filename_quote_characters
+     A list of characters that cause a filename to be quoted by the
+     completer when they appear in a completed filename.  The default
+     is the null string.
+
+ - Variable: const char * rl_special_prefixes
+     The list of characters that are word break characters, but should
+     be left in TEXT when it is passed to the completion function.
+     Programs can use this to help determine what kind of completing to
+     do.  For instance, Bash sets this variable to "$@" so that it can
+     complete shell variables and hostnames.
+
+ - Variable: int rl_completion_query_items
+     Up to this many items will be displayed in response to a
+     possible-completions call.  After that, we ask the user if she is
+     sure she wants to see them all.  The default value is 100.
+
+ - Variable: int rl_completion_append_character
+     When a single completion alternative matches at the end of the
+     command line, this character is appended to the inserted
+     completion text.  The default is a space character (` ').  Setting
+     this to the null character (`\0') prevents anything being appended
+     automatically.  This can be changed in application-specific
+     completion functions to provide the "most sensible word separator
+     character" according to an application-specific command line
+     syntax specification.
+
+ - Variable: int rl_completion_suppress_append
+     If non-zero, RL_COMPLETION_APPEND_CHARACTER is not appended to
+     matches at the end of the command line, as described above.  It is
+     set to 0 before any application-specific completion function is
+     called, and may only be changed within such a function.
+
+ - Variable: int rl_completion_mark_symlink_dirs
+     If non-zero, a slash will be appended to completed filenames that
+     are symbolic links to directory names, subject to the value of the
+     user-settable MARK-DIRECTORIES variable.  This variable exists so
+     that application-specific completion functions can override the
+     user's global preference (set via the MARK-SYMLINKED-DIRECTORIES
+     Readline variable) if appropriate.  This variable is set to the
+     user's preference before any application-specific completion
+     function is called, so unless that function modifies the value,
+     the user's preferences are honored.
+
+ - Variable: int rl_ignore_completion_duplicates
+     If non-zero, then duplicates in the matches are removed.  The
+     default is 1.
+
+ - Variable: int rl_filename_completion_desired
+     Non-zero means that the results of the matches are to be treated as
+     filenames.  This is _always_ zero when completion is attempted,
+     and can only be changed within an application-specific completion
+     function.  If it is set to a non-zero value by such a function,
+     directory names have a slash appended and Readline attempts to
+     quote completed filenames if they contain any characters in
+     `rl_filename_quote_characters' and `rl_filename_quoting_desired'
+     is set to a non-zero value.
+
+ - Variable: int rl_filename_quoting_desired
+     Non-zero means that the results of the matches are to be quoted
+     using double quotes (or an application-specific quoting mechanism)
+     if the completed filename contains any characters in
+     `rl_filename_quote_chars'.  This is _always_ non-zero when
+     completion is attempted, and can only be changed within an
+     application-specific completion function.  The quoting is effected
+     via a call to the function pointed to by
+     `rl_filename_quoting_function'.
+
+ - Variable: int rl_attempted_completion_over
+     If an application-specific completion function assigned to
+     `rl_attempted_completion_function' sets this variable to a non-zero
+     value, Readline will not perform its default filename completion
+     even if the application's completion function returns no matches.
+     It should be set only by an application's completion function.
+
+ - Variable: int rl_completion_type
+     Set to a character describing the type of completion Readline is
+     currently attempting; see the description of
+     `rl_complete_internal()' (*note Completion Functions::) for the
+     list of characters.  This is set to the appropriate value before
+     any application-specific completion function is called, allowing
+     such functions to present the same interface as `rl_complete()'.
+
+ - Variable: int rl_inhibit_completion
+     If this variable is non-zero, completion is inhibited.  The
+     completion character will be inserted as any other bound to
+     `self-insert'.
+
+\1f
+File: readline.info,  Node: A Short Completion Example,  Prev: Completion Variables,  Up: Custom Completers
+
+A Short Completion Example
+--------------------------
+
+   Here is a small application demonstrating the use of the GNU Readline
+library.  It is called `fileman', and the source code resides in
+`examples/fileman.c'.  This sample application provides completion of
+command names, line editing features, and access to the history list.
+
+     /* fileman.c -- A tiny application which demonstrates how to use the
+        GNU Readline library.  This application interactively allows users
+        to manipulate files and their modes. */
+     
+     #include <stdio.h>
+     #include <sys/types.h>
+     #include <sys/file.h>
+     #include <sys/stat.h>
+     #include <sys/errno.h>
+     
+     #include <readline/readline.h>
+     #include <readline/history.h>
+     
+     extern char *xmalloc ();
+     
+     /* The names of functions that actually do the manipulation. */
+     int com_list __P((char *));
+     int com_view __P((char *));
+     int com_rename __P((char *));
+     int com_stat __P((char *));
+     int com_pwd __P((char *));
+     int com_delete __P((char *));
+     int com_help __P((char *));
+     int com_cd __P((char *));
+     int com_quit __P((char *));
+     
+     /* A structure which contains information on the commands this program
+        can understand. */
+     
+     typedef struct {
+       char *name;                     /* User printable name of the function. */
+       rl_icpfunc_t *func;             /* Function to call to do the job. */
+       char *doc;                      /* Documentation for this function.  */
+     } COMMAND;
+     
+     COMMAND commands[] = {
+       { "cd", com_cd, "Change to directory DIR" },
+       { "delete", com_delete, "Delete FILE" },
+       { "help", com_help, "Display this text" },
+       { "?", com_help, "Synonym for `help'" },
+       { "list", com_list, "List files in DIR" },
+       { "ls", com_list, "Synonym for `list'" },
+       { "pwd", com_pwd, "Print the current working directory" },
+       { "quit", com_quit, "Quit using Fileman" },
+       { "rename", com_rename, "Rename FILE to NEWNAME" },
+       { "stat", com_stat, "Print out statistics on FILE" },
+       { "view", com_view, "View the contents of FILE" },
+       { (char *)NULL, (rl_icpfunc_t *)NULL, (char *)NULL }
+     };
+     
+     /* Forward declarations. */
+     char *stripwhite ();
+     COMMAND *find_command ();
+     
+     /* The name of this program, as taken from argv[0]. */
+     char *progname;
+     
+     /* When non-zero, this means the user is done using this program. */
+     int done;
+     
+     char *
+     dupstr (s)
+          int s;
+     {
+       char *r;
+     
+       r = xmalloc (strlen (s) + 1);
+       strcpy (r, s);
+       return (r);
+     }
+     
+     main (argc, argv)
+          int argc;
+          char **argv;
+     {
+       char *line, *s;
+     
+       progname = argv[0];
+     
+       initialize_readline (); /* Bind our completer. */
+     
+       /* Loop reading and executing lines until the user quits. */
+       for ( ; done == 0; )
+         {
+           line = readline ("FileMan: ");
+     
+           if (!line)
+             break;
+     
+           /* Remove leading and trailing whitespace from the line.
+              Then, if there is anything left, add it to the history list
+              and execute it. */
+           s = stripwhite (line);
+     
+           if (*s)
+             {
+               add_history (s);
+               execute_line (s);
+             }
+     
+           free (line);
+         }
+       exit (0);
+     }
+     
+     /* Execute a command line. */
+     int
+     execute_line (line)
+          char *line;
+     {
+       register int i;
+       COMMAND *command;
+       char *word;
+     
+       /* Isolate the command word. */
+       i = 0;
+       while (line[i] && whitespace (line[i]))
+         i++;
+       word = line + i;
+     
+       while (line[i] && !whitespace (line[i]))
+         i++;
+     
+       if (line[i])
+         line[i++] = '\0';
+     
+       command = find_command (word);
+     
+       if (!command)
+         {
+           fprintf (stderr, "%s: No such command for FileMan.\n", word);
+           return (-1);
+         }
+     
+       /* Get argument to command, if any. */
+       while (whitespace (line[i]))
+         i++;
+     
+       word = line + i;
+     
+       /* Call the function. */
+       return ((*(command->func)) (word));
+     }
+     
+     /* Look up NAME as the name of a command, and return a pointer to that
+        command.  Return a NULL pointer if NAME isn't a command name. */
+     COMMAND *
+     find_command (name)
+          char *name;
+     {
+       register int i;
+     
+       for (i = 0; commands[i].name; i++)
+         if (strcmp (name, commands[i].name) == 0)
+           return (&commands[i]);
+     
+       return ((COMMAND *)NULL);
+     }
+     
+     /* Strip whitespace from the start and end of STRING.  Return a pointer
+        into STRING. */
+     char *
+     stripwhite (string)
+          char *string;
+     {
+       register char *s, *t;
+     
+       for (s = string; whitespace (*s); s++)
+         ;
+     
+       if (*s == 0)
+         return (s);
+     
+       t = s + strlen (s) - 1;
+       while (t > s && whitespace (*t))
+         t--;
+       *++t = '\0';
+     
+       return s;
+     }
+     
+     /* **************************************************************** */
+     /*                                                                  */
+     /*                  Interface to Readline Completion                */
+     /*                                                                  */
+     /* **************************************************************** */
+     
+     char *command_generator __P((const char *, int));
+     char **fileman_completion __P((const char *, int, int));
+     
+     /* Tell the GNU Readline library how to complete.  We want to try to
+        complete on command names if this is the first word in the line, or
+        on filenames if not. */
+     initialize_readline ()
+     {
+       /* Allow conditional parsing of the ~/.inputrc file. */
+       rl_readline_name = "FileMan";
+     
+       /* Tell the completer that we want a crack first. */
+       rl_attempted_completion_function = fileman_completion;
+     }
+     
+     /* Attempt to complete on the contents of TEXT.  START and END
+        bound the region of rl_line_buffer that contains the word to
+        complete.  TEXT is the word to complete.  We can use the entire
+        contents of rl_line_buffer in case we want to do some simple
+        parsing.  Returnthe array of matches, or NULL if there aren't any. */
+     char **
+     fileman_completion (text, start, end)
+          const char *text;
+          int start, end;
+     {
+       char **matches;
+     
+       matches = (char **)NULL;
+     
+       /* If this word is at the start of the line, then it is a command
+          to complete.  Otherwise it is the name of a file in the current
+          directory. */
+       if (start == 0)
+         matches = rl_completion_matches (text, command_generator);
+     
+       return (matches);
+     }
+     
+     /* Generator function for command completion.  STATE lets us
+        know whether to start from scratch; without any state
+        (i.e. STATE == 0), then we start at the top of the list. */
+     char *
+     command_generator (text, state)
+          const char *text;
+          int state;
+     {
+       static int list_index, len;
+       char *name;
+     
+       /* If this is a new word to complete, initialize now.  This
+          includes saving the length of TEXT for efficiency, and
+          initializing the index variable to 0. */
+       if (!state)
+         {
+           list_index = 0;
+           len = strlen (text);
+         }
+     
+       /* Return the next name which partially matches from the
+          command list. */
+       while (name = commands[list_index].name)
+         {
+           list_index++;
+     
+           if (strncmp (name, text, len) == 0)
+             return (dupstr(name));
+         }
+     
+       /* If no names matched, then return NULL. */
+       return ((char *)NULL);
+     }
+     
+     /* **************************************************************** */
+     /*                                                                  */
+     /*                       FileMan Commands                           */
+     /*                                                                  */
+     /* **************************************************************** */
+     
+     /* String to pass to system ().  This is for the LIST, VIEW and RENAME
+        commands. */
+     static char syscom[1024];
+     
+     /* List the file(s) named in arg. */
+     com_list (arg)
+          char *arg;
+     {
+       if (!arg)
+         arg = "";
+     
+       sprintf (syscom, "ls -FClg %s", arg);
+       return (system (syscom));
+     }
+     
+     com_view (arg)
+          char *arg;
+     {
+       if (!valid_argument ("view", arg))
+         return 1;
+     
+       sprintf (syscom, "more %s", arg);
+       return (system (syscom));
+     }
+     
+     com_rename (arg)
+          char *arg;
+     {
+       too_dangerous ("rename");
+       return (1);
+     }
+     
+     com_stat (arg)
+          char *arg;
+     {
+       struct stat finfo;
+     
+       if (!valid_argument ("stat", arg))
+         return (1);
+     
+       if (stat (arg, &finfo) == -1)
+         {
+           perror (arg);
+           return (1);
+         }
+     
+       printf ("Statistics for `%s':\n", arg);
+     
+       printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
+               finfo.st_nlink,
+               (finfo.st_nlink == 1) ? "" : "s",
+               finfo.st_size,
+               (finfo.st_size == 1) ? "" : "s");
+       printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
+       printf ("      Last access at: %s", ctime (&finfo.st_atime));
+       printf ("    Last modified at: %s", ctime (&finfo.st_mtime));
+       return (0);
+     }
+     
+     com_delete (arg)
+          char *arg;
+     {
+       too_dangerous ("delete");
+       return (1);
+     }
+     
+     /* Print out help for ARG, or for all of the commands if ARG is
+        not present. */
+     com_help (arg)
+          char *arg;
+     {
+       register int i;
+       int printed = 0;
+     
+       for (i = 0; commands[i].name; i++)
+         {
+           if (!*arg || (strcmp (arg, commands[i].name) == 0))
+             {
+               printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+               printed++;
+             }
+         }
+     
+       if (!printed)
+         {
+           printf ("No commands match `%s'.  Possibilties are:\n", arg);
+     
+           for (i = 0; commands[i].name; i++)
+             {
+               /* Print in six columns. */
+               if (printed == 6)
+                 {
+                   printed = 0;
+                   printf ("\n");
+                 }
+     
+               printf ("%s\t", commands[i].name);
+               printed++;
+             }
+     
+           if (printed)
+             printf ("\n");
+         }
+       return (0);
+     }
+     
+     /* Change to the directory ARG. */
+     com_cd (arg)
+          char *arg;
+     {
+       if (chdir (arg) == -1)
+         {
+           perror (arg);
+           return 1;
+         }
+     
+       com_pwd ("");
+       return (0);
+     }
+     
+     /* Print out the current working directory. */
+     com_pwd (ignore)
+          char *ignore;
+     {
+       char dir[1024], *s;
+     
+       s = getcwd (dir, sizeof(dir) - 1);
+       if (s == 0)
+         {
+           printf ("Error getting pwd: %s\n", dir);
+           return 1;
+         }
+     
+       printf ("Current directory is %s\n", dir);
+       return 0;
+     }
+     
+     /* The user wishes to quit using this program.  Just set DONE
+        non-zero. */
+     com_quit (arg)
+          char *arg;
+     {
+       done = 1;
+       return (0);
+     }
+     
+     /* Function which tells you that you can't do this. */
+     too_dangerous (caller)
+          char *caller;
+     {
+       fprintf (stderr,
+                "%s: Too dangerous for me to distribute.\n"
+                caller);
+       fprintf (stderr, "Write it yourself.\n");
+     }
+     
+     /* Return non-zero if ARG is a valid argument for CALLER,
+        else print an error message and return zero. */
+     int
+     valid_argument (caller, arg)
+          char *caller, *arg;
+     {
+       if (!arg || !*arg)
+         {
+           fprintf (stderr, "%s: Argument required.\n", caller);
+           return (0);
+         }
+     
+       return (1);
+     }
+
+\1f
+File: readline.info,  Node: Copying This Manual,  Next: Concept Index,  Prev: Programming with GNU Readline,  Up: Top
+
+Copying This Manual
+*******************
+
+* Menu:
+
+* GNU Free Documentation License::     License for copying this manual.
+
+\1f
+File: readline.info,  Node: GNU Free Documentation License,  Up: Copying This Manual
+
+GNU Free Documentation License
+==============================
+
+                      Version 1.2, November 2002
+     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+     
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided for under this License.  Any other
+     attempt to copy, modify, sublicense or distribute the Document is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.
+
+ADDENDUM: How to use this License for your documents
+----------------------------------------------------
+
+   To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.2
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+       A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+\1f
+File: readline.info,  Node: Concept Index,  Next: Function and Variable Index,  Prev: Copying This Manual,  Up: Top
+
+Concept Index
+*************
+
+* Menu:
+
+* application-specific completion functions: Custom Completers.
+* command editing:                       Readline Bare Essentials.
+* editing command lines:                 Readline Bare Essentials.
+* FDL, GNU Free Documentation License:   GNU Free Documentation License.
+* initialization file, readline:         Readline Init File.
+* interaction, readline:                 Readline Interaction.
+* kill ring:                             Readline Killing Commands.
+* killing text:                          Readline Killing Commands.
+* notation, readline:                    Readline Bare Essentials.
+* readline, function:                    Basic Behavior.
+* variables, readline:                   Readline Init File Syntax.
+* yanking text:                          Readline Killing Commands.
+
+\1f
+File: readline.info,  Node: Function and Variable Index,  Prev: Concept Index,  Up: Top
+
+Function and Variable Index
+***************************
+
+* Menu:
+
+* _rl_digit_p:                           Utility Functions.
+* _rl_digit_value:                       Utility Functions.
+* _rl_lowercase_p:                       Utility Functions.
+* _rl_to_lower:                          Utility Functions.
+* _rl_to_upper:                          Utility Functions.
+* _rl_uppercase_p:                       Utility Functions.
+* abort (C-g):                           Miscellaneous Commands.
+* accept-line (Newline or Return):       Commands For History.
+* backward-char (C-b):                   Commands For Moving.
+* backward-delete-char (Rubout):         Commands For Text.
+* backward-kill-line (C-x Rubout):       Commands For Killing.
+* backward-kill-word (M-<DEL>):          Commands For Killing.
+* backward-word (M-b):                   Commands For Moving.
+* beginning-of-history (M-<):            Commands For History.
+* beginning-of-line (C-a):               Commands For Moving.
+* bell-style:                            Readline Init File Syntax.
+* call-last-kbd-macro (C-x e):           Keyboard Macros.
+* capitalize-word (M-c):                 Commands For Text.
+* character-search (C-]):                Miscellaneous Commands.
+* character-search-backward (M-C-]):     Miscellaneous Commands.
+* clear-screen (C-l):                    Commands For Moving.
+* comment-begin:                         Readline Init File Syntax.
+* complete (<TAB>):                      Commands For Completion.
+* completion-query-items:                Readline Init File Syntax.
+* convert-meta:                          Readline Init File Syntax.
+* copy-backward-word ():                 Commands For Killing.
+* copy-forward-word ():                  Commands For Killing.
+* copy-region-as-kill ():                Commands For Killing.
+* delete-char (C-d):                     Commands For Text.
+* delete-char-or-list ():                Commands For Completion.
+* delete-horizontal-space ():            Commands For Killing.
+* digit-argument (M-0, M-1, ... M--):    Numeric Arguments.
+* disable-completion:                    Readline Init File Syntax.
+* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands.
+* downcase-word (M-l):                   Commands For Text.
+* dump-functions ():                     Miscellaneous Commands.
+* dump-macros ():                        Miscellaneous Commands.
+* dump-variables ():                     Miscellaneous Commands.
+* editing-mode:                          Readline Init File Syntax.
+* enable-keypad:                         Readline Init File Syntax.
+* end-kbd-macro (C-x )):                 Keyboard Macros.
+* end-of-history (M->):                  Commands For History.
+* end-of-line (C-e):                     Commands For Moving.
+* exchange-point-and-mark (C-x C-x):     Miscellaneous Commands.
+* expand-tilde:                          Readline Init File Syntax.
+* forward-backward-delete-char ():       Commands For Text.
+* forward-char (C-f):                    Commands For Moving.
+* forward-search-history (C-s):          Commands For History.
+* forward-word (M-f):                    Commands For Moving.
+* history-preserve-point:                Readline Init File Syntax.
+* history-search-backward ():            Commands For History.
+* history-search-forward ():             Commands For History.
+* horizontal-scroll-mode:                Readline Init File Syntax.
+* input-meta:                            Readline Init File Syntax.
+* insert-comment (M-#):                  Miscellaneous Commands.
+* insert-completions (M-*):              Commands For Completion.
+* isearch-terminators:                   Readline Init File Syntax.
+* keymap:                                Readline Init File Syntax.
+* kill-line (C-k):                       Commands For Killing.
+* kill-region ():                        Commands For Killing.
+* kill-whole-line ():                    Commands For Killing.
+* kill-word (M-d):                       Commands For Killing.
+* mark-modified-lines:                   Readline Init File Syntax.
+* mark-symlinked-directories:            Readline Init File Syntax.
+* match-hidden-files:                    Readline Init File Syntax.
+* menu-complete ():                      Commands For Completion.
+* meta-flag:                             Readline Init File Syntax.
+* next-history (C-n):                    Commands For History.
+* non-incremental-forward-search-history (M-n): Commands For History.
+* non-incremental-reverse-search-history (M-p): Commands For History.
+* output-meta:                           Readline Init File Syntax.
+* overwrite-mode ():                     Commands For Text.
+* page-completions:                      Readline Init File Syntax.
+* possible-completions (M-?):            Commands For Completion.
+* prefix-meta (<ESC>):                   Miscellaneous Commands.
+* previous-history (C-p):                Commands For History.
+* quoted-insert (C-q or C-v):            Commands For Text.
+* re-read-init-file (C-x C-r):           Miscellaneous Commands.
+* readline:                              Basic Behavior.
+* redraw-current-line ():                Commands For Moving.
+* reverse-search-history (C-r):          Commands For History.
+* revert-line (M-r):                     Miscellaneous Commands.
+* rl_add_defun:                          Function Naming.
+* rl_add_funmap_entry:                   Associating Function Names and Bindings.
+* rl_add_undo:                           Allowing Undoing.
+* rl_alphabetic:                         Utility Functions.
+* rl_already_prompted:                   Readline Variables.
+* rl_attempted_completion_function:      Completion Variables.
+* rl_attempted_completion_over:          Completion Variables.
+* rl_basic_quote_characters:             Completion Variables.
+* rl_basic_word_break_characters:        Completion Variables.
+* rl_begin_undo_group:                   Allowing Undoing.
+* rl_bind_key:                           Binding Keys.
+* rl_bind_key_if_unbound:                Binding Keys.
+* rl_bind_key_if_unbound_in_map:         Binding Keys.
+* rl_bind_key_in_map:                    Binding Keys.
+* rl_bind_keyseq:                        Binding Keys.
+* rl_bind_keyseq_if_unbound:             Binding Keys.
+* rl_bind_keyseq_if_unbound_in_map:      Binding Keys.
+* rl_bind_keyseq_in_map:                 Binding Keys.
+* rl_binding_keymap:                     Readline Variables.
+* rl_callback_handler_install:           Alternate Interface.
+* rl_callback_handler_remove:            Alternate Interface.
+* rl_callback_read_char:                 Alternate Interface.
+* rl_catch_signals:                      Readline Signal Handling.
+* rl_catch_sigwinch:                     Readline Signal Handling.
+* rl_char_is_quoted_p:                   Completion Variables.
+* rl_cleanup_after_signal:               Readline Signal Handling.
+* rl_clear_message:                      Redisplay.
+* rl_clear_pending_input:                Character Input.
+* rl_clear_signals:                      Readline Signal Handling.
+* rl_complete <1>:                       Completion Functions.
+* rl_complete:                           How Completing Works.
+* rl_complete_internal:                  Completion Functions.
+* rl_completer_quote_characters:         Completion Variables.
+* rl_completer_word_break_characters:    Completion Variables.
+* rl_completion_append_character:        Completion Variables.
+* rl_completion_display_matches_hook:    Completion Variables.
+* rl_completion_entry_function <1>:      How Completing Works.
+* rl_completion_entry_function:          Completion Variables.
+* rl_completion_mark_symlink_dirs:       Completion Variables.
+* rl_completion_matches:                 Completion Functions.
+* rl_completion_mode:                    Completion Functions.
+* rl_completion_query_items:             Completion Variables.
+* rl_completion_suppress_append:         Completion Variables.
+* rl_completion_type:                    Completion Variables.
+* rl_copy_keymap:                        Keymaps.
+* rl_copy_text:                          Modifying Text.
+* rl_crlf:                               Redisplay.
+* rl_delete_text:                        Modifying Text.
+* rl_deprep_term_function:               Readline Variables.
+* rl_deprep_terminal:                    Terminal Management.
+* rl_ding:                               Utility Functions.
+* rl_directory_completion_hook:          Completion Variables.
+* rl_discard_keymap:                     Keymaps.
+* rl_dispatching:                        Readline Variables.
+* rl_display_match_list:                 Utility Functions.
+* rl_do_undo:                            Allowing Undoing.
+* rl_done:                               Readline Variables.
+* rl_editing_mode:                       Readline Variables.
+* rl_end:                                Readline Variables.
+* rl_end_undo_group:                     Allowing Undoing.
+* rl_erase_empty_line:                   Readline Variables.
+* rl_event_hook:                         Readline Variables.
+* rl_execute_next:                       Character Input.
+* rl_executing_keymap:                   Readline Variables.
+* rl_executing_macro:                    Readline Variables.
+* rl_expand_prompt:                      Redisplay.
+* rl_explicit_arg:                       Readline Variables.
+* rl_extend_line_buffer:                 Utility Functions.
+* rl_filename_completion_desired:        Completion Variables.
+* rl_filename_completion_function:       Completion Functions.
+* rl_filename_dequoting_function:        Completion Variables.
+* rl_filename_quote_characters:          Completion Variables.
+* rl_filename_quoting_desired:           Completion Variables.
+* rl_filename_quoting_function:          Completion Variables.
+* rl_forced_update_display:              Redisplay.
+* rl_free_line_state:                    Readline Signal Handling.
+* rl_free_undo_list:                     Allowing Undoing.
+* rl_function_dumper:                    Associating Function Names and Bindings.
+* rl_function_of_keyseq:                 Associating Function Names and Bindings.
+* rl_funmap_names:                       Associating Function Names and Bindings.
+* rl_generic_bind:                       Binding Keys.
+* rl_get_keymap:                         Keymaps.
+* rl_get_keymap_by_name:                 Keymaps.
+* rl_get_keymap_name:                    Keymaps.
+* rl_get_screen_size:                    Readline Signal Handling.
+* rl_get_termcap:                        Miscellaneous Functions.
+* rl_getc:                               Character Input.
+* rl_getc_function:                      Readline Variables.
+* rl_gnu_readline_p:                     Readline Variables.
+* rl_ignore_completion_duplicates:       Completion Variables.
+* rl_ignore_some_completions_function:   Completion Variables.
+* rl_inhibit_completion:                 Completion Variables.
+* rl_initialize:                         Utility Functions.
+* rl_insert_completions:                 Completion Functions.
+* rl_insert_text:                        Modifying Text.
+* rl_instream:                           Readline Variables.
+* rl_invoking_keyseqs:                   Associating Function Names and Bindings.
+* rl_invoking_keyseqs_in_map:            Associating Function Names and Bindings.
+* rl_kill_text:                          Modifying Text.
+* rl_last_func:                          Readline Variables.
+* rl_library_version:                    Readline Variables.
+* rl_line_buffer:                        Readline Variables.
+* rl_list_funmap_names:                  Associating Function Names and Bindings.
+* rl_macro_bind:                         Miscellaneous Functions.
+* rl_macro_dumper:                       Miscellaneous Functions.
+* rl_make_bare_keymap:                   Keymaps.
+* rl_make_keymap:                        Keymaps.
+* rl_mark:                               Readline Variables.
+* rl_message:                            Redisplay.
+* rl_modifying:                          Allowing Undoing.
+* rl_named_function:                     Associating Function Names and Bindings.
+* rl_num_chars_to_read:                  Readline Variables.
+* rl_numeric_arg:                        Readline Variables.
+* rl_on_new_line:                        Redisplay.
+* rl_on_new_line_with_prompt:            Redisplay.
+* rl_outstream:                          Readline Variables.
+* rl_parse_and_bind:                     Binding Keys.
+* rl_pending_input:                      Readline Variables.
+* rl_point:                              Readline Variables.
+* rl_possible_completions:               Completion Functions.
+* rl_pre_input_hook:                     Readline Variables.
+* rl_prep_term_function:                 Readline Variables.
+* rl_prep_terminal:                      Terminal Management.
+* rl_prompt:                             Readline Variables.
+* rl_push_macro_input:                   Modifying Text.
+* rl_read_init_file:                     Binding Keys.
+* rl_read_key:                           Character Input.
+* rl_readline_name:                      Readline Variables.
+* rl_readline_state:                     Readline Variables.
+* rl_readline_version:                   Readline Variables.
+* rl_redisplay:                          Redisplay.
+* rl_redisplay_function:                 Readline Variables.
+* rl_replace_line:                       Utility Functions.
+* rl_reset_after_signal:                 Readline Signal Handling.
+* rl_reset_line_state:                   Redisplay.
+* rl_reset_terminal:                     Terminal Management.
+* rl_resize_terminal:                    Readline Signal Handling.
+* rl_restore_prompt:                     Redisplay.
+* rl_save_prompt:                        Redisplay.
+* rl_set_key:                            Binding Keys.
+* rl_set_keyboard_input_timeout:         Character Input.
+* rl_set_keymap:                         Keymaps.
+* rl_set_paren_blink_timeout:            Miscellaneous Functions.
+* rl_set_prompt:                         Redisplay.
+* rl_set_screen_size:                    Readline Signal Handling.
+* rl_set_signals:                        Readline Signal Handling.
+* rl_show_char:                          Redisplay.
+* rl_special_prefixes:                   Completion Variables.
+* rl_startup_hook:                       Readline Variables.
+* rl_stuff_char:                         Character Input.
+* rl_terminal_name:                      Readline Variables.
+* rl_tty_set_default_bindings:           Terminal Management.
+* rl_tty_unset_default_bindings:         Terminal Management.
+* rl_unbind_command_in_map:              Binding Keys.
+* rl_unbind_function_in_map:             Binding Keys.
+* rl_unbind_key:                         Binding Keys.
+* rl_unbind_key_in_map:                  Binding Keys.
+* rl_username_completion_function:       Completion Functions.
+* rl_variable_bind:                      Miscellaneous Functions.
+* rl_variable_dumper:                    Miscellaneous Functions.
+* self-insert (a, b, A, 1, !, ...):      Commands For Text.
+* set-mark (C-@):                        Miscellaneous Commands.
+* show-all-if-ambiguous:                 Readline Init File Syntax.
+* show-all-if-unmodified:                Readline Init File Syntax.
+* start-kbd-macro (C-x ():               Keyboard Macros.
+* transpose-chars (C-t):                 Commands For Text.
+* transpose-words (M-t):                 Commands For Text.
+* undo (C-_ or C-x C-u):                 Miscellaneous Commands.
+* universal-argument ():                 Numeric Arguments.
+* unix-line-discard (C-u):               Commands For Killing.
+* unix-word-rubout (C-w):                Commands For Killing.
+* upcase-word (M-u):                     Commands For Text.
+* visible-stats:                         Readline Init File Syntax.
+* yank (C-y):                            Commands For Killing.
+* yank-last-arg (M-. or M-_):            Commands For History.
+* yank-nth-arg (M-C-y):                  Commands For History.
+* yank-pop (M-y):                        Commands For Killing.
+
+
+\1f
+Tag Table:
+Node: Top\7f1298
+Node: Command Line Editing\7f1939
+Node: Introduction and Notation\7f2590
+Node: Readline Interaction\7f4208
+Node: Readline Bare Essentials\7f5395
+Node: Readline Movement Commands\7f7176
+Node: Readline Killing Commands\7f8133
+Node: Readline Arguments\7f10043
+Node: Searching\7f11079
+Node: Readline Init File\7f13222
+Node: Readline Init File Syntax\7f14283
+Node: Conditional Init Constructs\7f25646
+Node: Sample Init File\7f28171
+Node: Bindable Readline Commands\7f31355
+Node: Commands For Moving\7f32405
+Node: Commands For History\7f33255
+Node: Commands For Text\7f36114
+Node: Commands For Killing\7f38829
+Node: Numeric Arguments\7f40780
+Node: Commands For Completion\7f41908
+Node: Keyboard Macros\7f43441
+Node: Miscellaneous Commands\7f44001
+Node: Readline vi Mode\7f47351
+Node: Programming with GNU Readline\7f49169
+Node: Basic Behavior\7f50143
+Node: Custom Functions\7f53573
+Node: Readline Typedefs\7f55051
+Node: Function Writing\7f56681
+Node: Readline Variables\7f57889
+Node: Readline Convenience Functions\7f67312
+Node: Function Naming\7f68294
+Node: Keymaps\7f69546
+Node: Binding Keys\7f71302
+Node: Associating Function Names and Bindings\7f75824
+Node: Allowing Undoing\7f78069
+Node: Redisplay\7f80604
+Node: Modifying Text\7f83675
+Node: Character Input\7f84904
+Node: Terminal Management\7f86684
+Node: Utility Functions\7f88103
+Node: Miscellaneous Functions\7f90442
+Node: Alternate Interface\7f92506
+Node: A Readline Example\7f94651
+Node: Readline Signal Handling\7f96588
+Node: Custom Completers\7f102191
+Node: How Completing Works\7f102906
+Node: Completion Functions\7f106209
+Node: Completion Variables\7f109764
+Node: A Short Completion Example\7f120386
+Node: Copying This Manual\7f132939
+Node: GNU Free Documentation License\7f133179
+Node: Concept Index\7f155573
+Node: Function and Variable Index\7f156522
+\1f
+End Tag Table
diff --git a/lib/readline/doc/readline.ps b/lib/readline/doc/readline.ps
new file mode 100644 (file)
index 0000000..d371838
--- /dev/null
@@ -0,0 +1,5957 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
+%%Title: readline.dvi
+%%Pages: 72
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 300 -o readline.ps readline.dvi
+%DVIPSParameters: dpi=300, compressed
+%DVIPSSource:  TeX output 2003.09.22:0904
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 300 300 (readline.dvi)
+@start
+%DVIPSBitmapFont: Fa cmti9 9 1
+/Fa 1 47 df<1230127812F0126005047C830C>46 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmr9 9 45
+/Fb 45 123 df<13FEEA038138060180EA0E03381C010090C7FCA5B51280EA1C03AE38FF
+8FF0141A809915>12 D<EBFF80EA0383EA0603120E121CA6B5FCEA1C03AE38FF9FF0141A
+809915>I<126012F0A212701210A31220A21240A2040B7D830B>44
+D<EAFFC0A20A0280880D>I<EA07E0EA1C38EA381CEA300CEA700EEA6006A2EAE007AAEA
+6006A2EA700EEA300CEA381CEA1C38EA07E010187F9713>48 D<12035AB4FC1207B3A2EA
+7FF80D187D9713>I<EA0F80EA1060EA2030EA4038EA803CEAC01C12E01240EA003C1338
+A21370136013C0EA018013001202EA040412081210EA3008EA3FF8127F12FF0E187E9713
+>I<EA07E0EA1838EA201CEA601EEA700EEA201E1200131CA213381370EA07E0EA003813
+1C130E130FA212E0A212C0EA400EEA601CEA1838EA07E010187F9713>I<1318A2133813
+7813F813B8EA01381202A212041208121812101220124012C0B5FCEA0038A6EA03FF1018
+7F9713>I<EA3018EA3FF013E01380EA2000A5EA2FC0EA3060EA2030EA00381318131CA2
+124012E0A2EA8018EA40381330EA30E0EA0F800E187E9713>I<EA01F8EA0704EA0C06EA
+180E123013001270126012E0EAE3E0EAE418EAE80CEAF00EEAE0061307A31260A2EA7006
+EA300EEA180CEA0C38EA07E010187F9713>I<1240EA7FFF13FEA2EA4004EA80081310A2
+EA00201340A21380120113005AA25A1206A2120EA5120410197E9813>I<EA07E0EA1818
+EA300CEA20061260A21270EA780CEA3E18EA1F30EA07C0EA03E0EA0CF8EA307CEA601E13
+0FEAC0071303A3EA6002EA2004EA1818EA07E010187F9713>I<EA07E0EA1C30EA3018EA
+700CEA600EEAE006A21307A31260EA700FEA3017EA1827EA07C7EA00071306130E130C12
+701318EA6030EA3060EA0F8010187F9713>I<B57E380E00E01470808080A280A21580A8
+1500A25C140E5CA2147814E0B51280191A7F991D>68 D<B512F8380E003814181408140C
+1404A3EB0100A35BEA0FFFEA0E037FA390C7FCA8EAFFE0161A7F9919>70
+D<EB3F023801C0C63803002E000E131E48130E14065A007813021270A200F090C7FCA590
+3801FFC03970000E00A2127812387EA27E000313163801C06638003F821A1A7E991E>I<
+EAFFE0000EC7FCB01408A3141814101430147014F0B5FC151A7F9918>76
+D<00FEEB7FC0000FEB0E001404EA0B80EA09C0A2EA08E01370A21338131CA2130E1307EB
+0384A2EB01C4EB00E4A21474143CA2141C140C121C38FF80041A1A7F991D>78
+D<39FFE07FC0390E000E001404B200065B12076C5B6C6C5A3800E0C0013FC7FC1A1A7F99
+1D>85 D<EA1FC0EA38707FEA101C1200A2EA03FCEA1E1C1238127012E01480A2133CEA70
+5F381F8F0011107F8F13>97 D<12FC121CA913FCEA1D07381E0380381C01C0130014E0A6
+EB01C01480381E0300EA1906EA10F8131A809915>I<EA07F8EA1C1C1238EA700813005A
+A612701304EA3808EA1C18EA07E00E107F8F11>I<133F1307A9EA03E7EA0C17EA180F48
+7E127012E0A6126012706C5AEA1C373807C7E0131A7F9915>I<EA07C0EA1C30EA301812
+70EA600C12E0EAFFFCEAE000A41260EA7004EA3808EA1C18EA07E00E107F8F11>I<EA01
+F0EA0718EA0E38EA1C101300A6EAFFC0EA1C00AEEAFF800D1A80990C>I<EA0FCF381871
+8038303000EA7038A4EA30306C5AEA2FC00060C7FCA21270EA3FF013FC6C7EEA600FEAC0
+03A4EA6006EA381CEA07E011187F8F13>I<12FC121CA9137CEA1D87381E0380A2121CAB
+38FF9FF0141A809915>I<1218123CA212181200A612FC121CAE12FF081A80990A>I<12FC
+121CA9EB1FC0EB0F00130C5B13205B13E0121DEA1E70EA1C7813387F131E7F148038FF9F
+E0131A809914>107 D<12FC121CB3A6EAFF80091A80990A>I<38FC7C1F391D8E6380391E
+0781C0A2001C1301AB39FF9FE7F81D107F8F20>I<EAFC7CEA1D87381E0380A2121CAB38
+FF9FF01410808F15>I<EA07E0EA1C38EA300CEA700EEA6006EAE007A6EA6006EA700EEA
+381CEA1C38EA07E010107F8F13>I<EAFCFCEA1D07381E0380381C01C0A2EB00E0A6EB01
+C01480381E0300EA1D06EA1CF890C7FCA6B47E1317808F15>I<EA03E1EA0C13EA180BEA
+300FEA700712E0A61270A26C5AEA1C37EA07C7EA0007A6EB3FE013177F8F14>I<EAFC78
+EA1D9CEA1E1C1308EA1C00ABEAFF800E10808F0F>I<EA1F20EA60E0EA402012C0A2EAF0
+00127FEA3FC0EA1FE0EA00F0EA8070133012C01320EAF040EA8F800C107F8F0F>I<1208
+A41218A21238EAFFC0EA3800A81320A41218EA1C40EA07800B177F960F>I<38FC1F80EA
+1C03AB1307120CEA0E0B3803F3F01410808F15>I<38FF0F80383C0700EA1C061304A26C
+5AA26C5AA3EA03A0A2EA01C0A36C5A11107F8F14>I<39FE7F1F8039381C0700003C1306
+381C0C04130E380E16081317A238072310149013A33803C1A014E0380180C0A319107F8F
+1C>I<38FE3F80383C1E00EA1C086C5AEA0F306C5A6C5A12017F1203EA0270487E1208EA
+181CEA381E38FC3FC012107F8F14>I<38FF0F80383C0700EA1C061304A26C5AA26C5AA3
+EA03A0A2EA01C0A36C5AA248C7FCA212E112E212E4127811177F8F14>I<EAFFF8EAE070
+12C0EA80E0EA81C0A2EA0380EA0700A2EA0E04121CA2EA380812701338EAFFF80E107F8F
+11>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmsltt10 9 18
+/Fc 18 122 df<EAFFFC13FE13FC0F037C8C14>45 D<EA01E0EA07F8EA0E3CEA1C1CEA18
+0E12381270A312E0A4131CA31338A21370EA70E01271EA3F80EA1F000F177C9614>48
+D<134013E0EA01C01203120F123D12111201EA0380A6EA0700A6120EEAFFE0A20B177B96
+14>I<381F81F813C1380FC3E0EA0EC213C6A213CE13CC381CCDC013DD13D9A213F1A238
+38E3801303A53870070038FC0FC0A215177F9614>77 D<EA0FE0EA1FF8EA381CEA100E12
+00A2EA03FEEA1FFCEA3C1C127012E0A2133C1378EA7FFFEA1F8F10107D8F14>97
+D<EA01F0EA07F8EA0E0CEA1C0E1238EA7006A2EAFFFEA2EAE000A21270130CEA381CEA1F
+F8EA07F00F107D8F14>101 D<121F7F0007C7FCA5133EEA0EFF380FC3801303120EA338
+1C0700A6EA380E38FF1FC0A212177F9614>104 D<136013F013E013401300A4EA3FC0A2
+1201A5EA0380A6EA0700EAFFF8A20D187C9714>I<EA1FE013F0EA00E0A6EA01C0A6EA03
+80A6EA0700EAFFFCA20E177D9614>108 D<383CE380383FFFC0EA1F7DEA1E79EA1C71A3
+3838E380A63871C70038FDF7C0EAFCF312107F8F14>I<EA3E3E13FF380FC3801303120E
+A3381C0700A6EA380E38FF1FC0A212107F8F14>I<EA03F0EA07F8EA1E1CEA3C0E123812
+70A212E0A3131EEA701C1338EA7870EA3FE0EA0F800F107D8F14>I<381F87C0EB9FE0EA
+03B8EBE040EBC0005BA2120790C7FCA5120EEAFFF0A213107F8F14>114
+D<EA03FAEA0FFEEA1C0E1230A2EA3800EA1FE0EA0FF8EA01FEEA000FEA600312701306EA
+F80CEAFFF8EA4FE010107E8F14>I<1206120EA4EAFFF8A2EA1C00A55AA313301338A213
+70EA1FE0EA0F800D157C9414>I<EAF83EA2EA380EA5EA701CA5133C1378EA3FFFEA1F9F
+10107D8F14>I<383F1FC0A2380F1E006C5AEA03B813F06C5A5B7F1203EA0770120E487E
+123CEAFC7FA212107E8F14>120 D<381FCFE0A238070380EB0700A2130EEA038EA2139C
+A213B8A2EA01B013F05BA25BA2485AA200E7C7FC12EE12FC127813187F8F14>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmtt9 9 83
+/Fd 83 127 df<126012F0AD12601200A4126012F0A212600417789614>33
+D<EAC060EAE0E0A4EAC060A5EA40400B0B7C9614>I<EA071CA5B51280A27E380E3800A7
+387FFF80B5FCA2381C7000A511177F9614>I<EA3806EA7C0E126CEAEE1CA25BA2126CEA
+7C70123812005BA2485AA3485AA248C7FC130E131FEA0E1BEB3B80A2121CA238381B0013
+1FEA180E111D7F9914>37 D<1207487EEA18C0EA38E0A35B3839CF80138F381F1C00121E
+A2EA0E38121EEA37701267EAE3F05B38E1C38013E3EA63F3383F3F00EA1E1E11177F9614
+>I<126012F012F812781218A31230A2126012C01280050C789614>I<EA01801203EA0600
+5A121C121812385AA35AA91270A37E1218121C120C7EEA03801201091D799914>I<1280
+12C01260123012381218121C120EA31207A9120EA3121C121812381230126012C0128008
+1D7C9914>I<EA0380A3EA638CEAF39EEA7FFCEA3FF8EA0FE0A2EA3FF8EA7FFCEAF39EEA
+638CEA0380A30F107E9214>I<EA01C0A7B51280A33801C000A711117F9314>I<127012F8
+12FCA2127C120C1218123012E012C0060A798414>I<EAFFFEA30F037E8C14>I<127012F8
+A312700505798414>I<1306130EA2131CA21338A21370A213E0A2EA01C0A2EA0380A3EA
+0700A2120EA25AA25AA25AA25AA25A0F1D7E9914>I<EA07C0EA0FE0EA1C70EA3838EA30
+18EA701CA2EAE00EA9EA701CA2EA3838A2EA1C70EA0FE0EA07C00F177E9614>I<1203A2
+5A5A123F12F712471207AEEA7FF0A20C177C9614>I<EA0FC0EA1FF0EA3838EA701CEAE0
+0EA312401200131CA213381330137013E0EA01C0EA030012065AEA180E1230EA7FFEA20F
+177E9614>I<137813F8EA01B8A2EA0338A21206120E120C121C12381230127012E0B512
+80A238003800A548B4FCA211177F9614>52 D<EA01F0EA07F8EA0E1C121C1238EA300012
+70A25AEAE7C0EAEFF0EAF838EAF01C130CEAE00EA212601270130CEA381CEA1C38EA0FF0
+EA07C00F177E9614>54 D<127012F8A312701200A6127012F8A312700510798F14>58
+D<127012F8A312701200A6126012F012F8A2127812181230127012E012800515798F14>
+I<1306131E133E13F8EA01F0EA03C0EA0F80EA1F00123C12F85A7E123C121FEA0F80EA03
+C0EA01F0EA00F8133E131E13060F157E9514>I<B51280A27EC8FCA3387FFF80B5FCA211
+097F8F14>I<12C012F07E123E7EEA0780EA03E0EA01F0EA0078133E131E133E1378EA01
+F0EA03E0EA0780EA1F00123E12F85A12C00F157E9514>I<EA1FE0EA3FF8EA701CEAE00E
+A21240EA003C137013E0EA01C0EA0380A41300C7FCA41203EA0780A2EA03000F177E9614
+>I<EA01E0EA07F0EA0E38EA181CEA38FC1271EA731E1277EAEE0EA7EA771CEA7318EA71
+F0EA38E0EA1806EA0E1EEA07F8EA01F00F177E9614>I<EA01C0487EA21360A2EA0770A4
+EA0630EA0E38A4487EEA1FFCA2EA1C1CA2487EA238FE3F80A211177F9614>I<EAFFF013
+FCEA381E130E1307A4130E131EEA3FFCA2EA381E130E1307A5130E131EEAFFFC13F81017
+7F9614>I<3801F180EA07FFEA0E1FEA1C071238EA7003A348C7FCA738700380A3383807
+00121CEA0E0EEA07FCEA01F011177F9614>I<EAFFE013F8EA383C7F130E7FA3EB0380A8
+EB0700A2130E131E5BEAFFF813E011177F9614>I<B5FCA2EA3807A490C7FCA21338A2EA
+3FF8A2EA3838A290C7FCA3EB0380A4B5FCA211177F9614>I<B51280A2EA3803A490C7FC
+A21338A2EA3FF8A2EA3838A290C7FCA7B4FCA211177F9614>I<EA03C6EA0FFEEA1C3EEA
+181E1238EA700EA21260EAE000A4137FA2130E12601270A2EA381E1218EA1C3EEA0FFEEA
+03CE10177F9614>I<EAFFF8A2EA0700B3EAFFF8A20D177D9614>73
+D<EA07FCA2EA0070B012E0A2EAF0E0EA7FC0EA1F000E177D9614>I<B4FCA21238AF1307
+A4B5FCA210177E9614>76 D<38FC1F80A2007C1300EA7637A4EA7777A2EA7367A313E7EA
+71C7A2EA7007A638F80F80A211177F9614>I<38FE3F80A2383E0E00123BA4138E1239A2
+13CEA31238A213EE136EA4133E12FEA211177F9614>I<EA1FF0EA7FFCEA783CEA701CEA
+E00EAFEA701CEA783CEA7FFCEA1FF00F177E9614>I<EAFFF013FCEA381E130E1307A513
+0E131EEA3FFC13F0EA3800A812FEA210177F9614>I<EA1FF0EA7FFCEA783CEA701CEAE0
+0EADEAE38EEAE1CEEA71DCEA78FC127FEA1FF0EA00781338133C131C131E0F1C7E9614>
+I<EAFFE013F8EA383C131C7FA45B133CEA3FF85BEA38387FA51480EB1DC0A238FE0F80EB
+070012177F9614>I<EA0FCCEA1FFCEA307CEA603CEAE01CA313001270127EEA3FE0EA0F
+F0EA01F8EA001C131E130E126012E0A2EAF01CEAF838EAFFF0EAC7E00F177E9614>I<38
+7FFF80B5FCEAE1C3A43801C000AFEA0FF8A211177F9614>I<38FE0FE0A238380380B038
+1C0700A2EA0E0EEA07FCEA01F01317809614>I<38FC1F80A238380E00A3EA3C1EEA1C1C
+A46C5AA4EA0630EA0770A3EA0360A213E0A26C5A11177F9614>I<38FC1F80A238700700
+A7EA31C6EA33E6EA3BEE136EA5EA1B6CA2EA1A2CEA1E3CA311177F9614>I<EA7E3EA2EA
+1C3CEA1E38EA0E78EA0F7012075B12035B120112037FA2EA0770A2EA0E781338EA1C3C13
+1CEA3C1E38FE3F80A211177F9614>I<EAFFE0A2EAE000B3A7EAFFE0A20B1D799914>91
+D<12C07EA21270A27EA27EA27EA27EA2EA0380A3EA01C0A2EA00E0A21370A21338A2131C
+A2130EA213060F1D7E9914>I<EAFFE0A21200B3A712FFA20B1D7F9914>I<EAFFFEA30F03
+7E7E14>95 D<1208121812301260A212C0A312F012F812781230050C799914>I<EA1FC0
+EA7FF0EA7078EA2018EA001CA2EA07FC121FEA3C1C127012E0A3EA707C383FFF80EA0F8F
+11107E8F14>I<12FCA2121CA513F8EA1DFEEA1F07EA1E03001C1380EB01C0A6EB038000
+1E1300EA1F0EEA1DFCEA0CF81217809614>I<EA03F8EA0FFEEA1C0EEA3804EA70001260
+12E0A412601270EA380EEA1C1EEA0FFCEA03F00F107E8F14>I<137EA2130EA5EA07CEEA
+0FFEEA1C3EEA301EEA700E12E0A61270EA301EEA383E381FEFC0EA07CF12177F9614>I<
+EA07E0EA0FF0EA1C38EA301CEA700CEAE00EA2EAFFFEA2EAE00012601270EA380EEA1C1E
+EA0FFCEA03F00F107E8F14>I<13FCEA01FEEA038EEA07041300A3EA7FFE12FFEA0700AC
+EAFFF8A20F177F9614>I<EA07CF381FFF80EA383B38301800EA701CA3EA3018EA3838EA
+3FF0EA37C00070C7FCA2EA3FF86C7E487EEA700F38E00380A438700700EA3C1EEA1FFCEA
+07F011197F8F14>I<12FCA2121CA51378EA1DFEEA1F86EA1E07121CAA38FF8FE0A21317
+809614>I<1206120FA21206C7FCA4B4FCA21207ACEAFFF8A20D187C9714>I<136013F0A2
+13601300A4EA1FF0A2EA0070B2EA40E0EAE0C0EA7F80EA3F000C207E9714>I<12FCA212
+1CA5EBFF80A2EB1C005B5B5BEA1DC0EA1FE0A2EA1E70EA1C38133C131C7F38FF1F80A211
+17809614>I<EAFF80A21203B3EAFFFEA20F177E9614>I<EAFB8EEAFFDF383CF380A2EA38
+E3AA38FEFBE013791310808F14>I<EAFC78EAFDFEEA1F86EA1E07121CAA38FF8FE0A213
+10808F14>I<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6EA701CEA783CEA3C78EA1FF0EA
+07C00F107E8F14>I<EAFCF8EAFDFEEA1F07EA1E03001C1380EB01C0A6EB0380001E1300
+EA1F0EEA1DFCEA1CF890C7FCA6B47EA21218808F14>I<EA03E7EA0FF7EA1C1FEA300F12
+70487EA6EA700F1230EA1C3FEA0FF7EA07C7EA0007A6EB3FE0A213187F8F14>I<EAFE1F
+EB7F80EA0EE3380F810090C7FCA2120EA8EAFFF0A211107F8F14>I<EA0FD8EA3FF8EA60
+3812C0A2EAF000EA7F80EA3FF0EA07F8EA001CEA600612E012F0EAF81CEAFFF8EACFE00F
+107E8F14>I<1206120EA4EA7FFC12FFEA0E00A8130EA3131CEA07F8EA01F00F157F9414>
+I<EAFC3FA2EA1C07AB131F380FFFE0EA03E71310808F14>I<38FE3F80A2383C1E00EA1C
+1CA36C5AA3EA0630EA0770A36C5AA311107F8F14>I<38FE3F80A238700700EA380EA3EA
+39CEA3EA1B6C121AA3EA1E7CA2EA0E3811107F8F14>I<EA7E3FA2EA1E3CEA0E78EA0770
+5B12036C5A12037FEA0770EA0E781338487E38FE3F80A211107F8F14>I<38FE3F80A238
+1C0E005BA2120E5BA212071330A2EA0370A25B1201A25BA3485A12730077C7FC127E123C
+11187F8F14>I<EA3FFF5AEA700E131C1338EA007013E0EA01C0EA0380EA0700120EEA1C
+0712381270B5FCA210107F8F14>I<133E13FEEA01E0EA0380AAEA7F0012FE127FEA0380
+AAEA01E0EA00FE133E0F1D7E9914>I<12E0B3AB031D789914>I<127812FE120FEA0380AA
+EA01FCEA00FEEA01FCEA0380AAEA0F0012FE12780F1D7E9914>I<EA1C10EA3F38EAE7E0
+EA41C00D047D9614>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmss10 10.95 2
+/Fe 2 42 df<13E0EA01C0EA0380120713005A121EA2121C123CA212381278A3127012F0
+AE12701278A31238123CA2121C121EA27E7E13801203EA01C0EA00E00B2E7CA112>40
+D<12E012707E123C121C121E7EA27E1380A2120313C0A3120113E0AE13C01203A3138012
+07A213005AA2121E121C123C12385A5A0B2E7EA112>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmbx10 12 27
+/Ff 27 123 df<90380FF83F90397FFDFFC03A01FC1FE3E03903F03FC7EA07E0D80FC013
+87ED83C091381F8000A6B612FCA2390FC01F80B2397FF8FFF8A223237FA221>11
+D<EB07F8EB7FFC3801FC0E3803F01F48485AEA0FC0A3141E140C91C7FCA2ECFF80B6FCA2
+380FC01FB2397FF8FFF0A21C237FA220>I<EA07FE381FFF80383F07E06D7E130180121E
+1200A2133FEA03FDEA1F81EA3E01127C12F8A4EA7C02EA7E0C391FF87F803807E03F1916
+7E951C>97 D<B47EA2121FABEB87F0EBBFFCEBF03EEBC01F9038800F8015C0140715E0A7
+15C0A2140F15809038C01F00381E707E381C3FFC38180FE01B237EA220>I<EBFF800007
+13E0380F83F0EA1F03123E127E387C01E090C7FC12FCA6127C127EA2003E13186C133038
+0FC0603807FFC0C6130015167E9519>I<49B4FCA2EB003FAB13FE3807FFBF380FC1FF48
+C67E003E7F127E127CA212FCA7127C127E123E6C5B380F81FF3907FF3FE0EA01FC1B237E
+A220>I<13FE3807FF80380F83C0381E01E0383E00F0127E007C13F8147812FCB512F8A2
+00FCC7FCA3127CA26C1318A26C1330380F80E03803FFC0C6130015167E951A>I<EB1F80
+EBFFE03801F1F0EA03E31207EA0FC3EBC1E0EBC000A6EAFFFEA2EA0FC0B2EA7FFCA21423
+7EA212>I<9038FE0F803903FF9FC0380F83E3381F01F3391E00F000003E7FA5001E5BEA
+1F01380F83E0380BFF80D808FEC7FC0018C8FCA2121C381FFFE014FC6C13FF7E001F1480
+397C001FC00078130F00F81307A3007CEB0F806CEB1F00381F807E6CB45A000113E01A21
+7F951D>I<B47EA2121FABEB83F0EB8FFCEB987EEBA03EEBC03FA21380AE39FFF1FFE0A2
+1B237DA220>I<121E123FEA7F80A4EA3F00121EC7FCA6EAFF80A2121FB2EAFFF0A20C24
+7EA30F>I<B47EA2121FABECFF80A2EC3C00143014E0EB81C00183C7FC1386139E13BE13
+FFEBDF80EB8FC01307806D7E6D7E130080147E39FFE1FFC0A21A237EA21E>107
+D<EAFF80A2121FB3ADEAFFF0A20C237EA20F>I<3AFF03F803F890390FFE0FFE3A1F183F
+183F9039201F201F014001C01380A201801380AE3BFFF0FFF0FFF0A22C167D9531>I<38
+FF03F0EB0FFC381F187EEB203EEB403FA21380AE39FFF1FFE0A21B167D9520>I<13FF00
+0713E0380F81F0381F00F8003E137C48133EA300FC133FA7007C133E007E137E003E137C
+6C13F8380F81F03807FFE0C6130018167E951D>I<38FF87F0EBBFFC381FF07EEBC01F90
+38800F8015C0A2EC07E0A715C0140FA2EC1F8001C01300EBF07EEBBFFCEB8FE00180C7FC
+A8EAFFF0A21B207E9520>I<EBFE033807FF07380FC1CF381F00DF48137F007E7FA2127C
+12FCA7127EA2003E5B6C5BEA0FC13807FF3FEA00FC1300A8903801FFE0A21B207E951E>
+I<38FF0F80EB1FE0381F33F013631343A2EBC1E0EB8000ADEAFFF8A214167E9518>I<38
+07F980EA1FFFEA3807EA7003EAF001A26CC7FCB4FC13F8EA7FFE6C7E6C1380120738003F
+C0EAC007130312E0A200F0138038FC0F00EAEFFEEAC3F812167E9517>I<487EA41203A2
+1207A2120F123FB5FCA2EA1F80ABEB8180A5380F830013C3EA07FEEA01F811207F9F16>
+I<38FF81FFA2381F803FAF5C5C380FC1BF3907FF3FE0EA01FC1B167D9520>I<39FFF01F
+E0A2391FC00700000F1306EBE00E0007130C13F000035BA26C6C5AA26C6C5AA2EBFEE0EB
+7EC0137F6D5AA26DC7FCA2130EA21B167F951E>I<3AFFF3FF83FCA23A1F807C00E0D80F
+C014C08001E013010007017F1380A2D803F0EB0300ECCF8301F81387D801F913C61487D8
+00FD13ECEBFF0315FC017F5BEB7E01013E5BEB3C00A20118136026167F9529>I<39FFF0
+7FC0A2390FC01C006C6C5A6D5A00035B6C6C5A3800FD80137F91C7FC7F6D7E497EEB37E0
+EB67F013C33801C1F8380380FC48487E000E137F39FF81FFE0A21B167F951E>I<39FFF0
+1FE0A2391FC00700000F1306EBE00E0007130C13F000035BA26C6C5AA26C6C5AA2EBFEE0
+EB7EC0137F6D5AA26DC7FCA2130EA2130CA25B1278EAFC3813305BEA69C0EA7F80001FC8
+FC1B207F951E>I<387FFFF0A2387C07E038700FC0EA601F00E0138038C03F005B137EC6
+5A1201485AEBF030EA07E0120FEBC070EA1F80003F1360EB00E0EA7E03B5FCA214167E95
+19>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmtt10 12 29
+/Fg 29 122 df<13E0A538F0E1E0EAFCE7387EEFC0381FFF00EA07FCEA01F0EA07FCEA1F
+FF387EEFC038FCE7E0EAF0E13800E000A513157D991A>42 D<B512F8A3381C0038A51400
+A2130EA3EA1FFEA3EA1C0EA390C7FCA3141CA5B512FCA3161E7E9D1A>69
+D<387FFFFCB5FC7E380E001CA51400A2EB0380A3EA0FFFA3EA0E03A390C7FCA8EA7FE012
+FF127F161E7F9D1A>I<B51280A33801C000B3A6B51280A3111E7C9D1A>73
+D<387F03F838FF87FC387F03F8381C01E0EB03C01480EB07005B131E131C5B13785B7F12
+1DEA1FDC139C130EEA1E0F7F001C13801303EB01C0A2EB00E0A21470007F13FC38FF81FE
+387F00FC171E7F9D1A>75 D<EA7FE0487E6C5A000EC7FCB3141CA5387FFFFCB5FC7E161E
+7F9D1A>I<387FFFC0B512E0A26C13C013047D7E1A>95 D<EA1FF0EA3FFC487EEA780FEA
+300738000380A2137FEA07FF121FEA3F83EA7803127012E0A3EA7007EA780F383FFFFCEA
+1FFDEA07F016157D941A>97 D<12FEA3120EA6133EEBFF80000F13E0EBC1F0EB8070EB00
+38120E141CA7000F13381478EB80F0EBC1E0EBFFC0000E138038063E00161E7F9D1A>I<
+EBFF80000313C0000F13E0EA1F01383C00C04813001270A25AA51270A2007813707E381F
+01F0380FFFE0000313C03800FE0014157D941A>I<EB1FC0A31301A6EA01F1EA07FDEA0F
+FFEA1E0FEA3C07EA7803EA700112E0A7EA7003A2EA3807EA3E0F381FFFFCEA07FDEA01F1
+161E7E9D1A>I<EA01F8EA07FF481380381E07C0EA3C01387800E01270481370A2B512F0
+A300E0C7FC1270A2007813707E381F01F0380FFFE0000313803800FE0014157D941A>I<
+EB07E0EB1FF0EB3FF8EB7878EBF030EBE000A4387FFFF0B5FCA23800E000AF383FFF8048
+13C06C1380151E7F9D1A>I<3801F87C3807FFFE5A381E078C381C0380383801C0A5381C
+0380EA1E07381FFF005BEA39F80038C7FCA27E381FFF8014E04813F83878007C0070131C
+48130EA40070131C0078133C003E13F8381FFFF0000713C00001130017217F941A>I<12
+FEA3120EA6133EEBFF80000F13C013C1EB80E01300120EAC38FFE3FE13E713E3171E7F9D
+1A>I<EA01C0487EA36C5AC8FCA5EA7FE0A31200AF387FFF80B512C06C1380121F7C9E1A>
+I<12FEA3120EA6EB0FFCEB1FFEEB0FFCEB03C0EB0780EB0F00131E5B5B13FC120F13DE13
+8F380E07801303EB01C014E0EB00F038FFE3FE14FF14FE181E7F9D1A>107
+D<EAFFE0A31200B3A6B512E0A3131E7D9D1A>I<387CE0E038FFFBF8EA7FFF381F1F1CEA
+1E1EA2EA1C1CAC387F1F1F39FF9F9F80397F1F1F00191580941A>I<EAFE3EEBFF80B512
+C0EA0FC1EB80E01300120EAC38FFE3FE13E713E317157F941A>I<EA01F0EA07FCEA1FFF
+383E0F80EA3C07387803C0EA700138E000E0A6EAF001007013C0EA7803383C0780EA3E0F
+381FFF00EA07FCEA01F013157D941A>I<EAFE3EEBFF80B512E0380FC1F0EB8070EB0038
+120E141CA7000F13381478EB80F0EBC1E0EBFFC0000E1380EB3E0090C7FCA8EAFFE0A316
+207F941A>I<3801F8E0EA07FEEA0FFFEA1E07EA3C03EA78011270EAE000A613011270EA
+7803123CEA1E0FEA0FFFEA07FCEA01F0C7FCA8EB0FFEA317207E941A>I<387F81F838FF
+8FFC387F9FFE3803FE1EEBF80CEBE000A25B5BAAEA7FFFB5FC7E17157F941A>I<3807FB
+80EA1FFF127FEA7807EAE003A30078C7FCEA7FC0EA1FFCEA07FE38003F801307386001C0
+12E0A2EAF00338FC0780B51200EAEFFEEAE3F812157C941A>I<487E1203A6387FFFE0B5
+FCA238038000AA1470A43801C1E013FF6C1380EB3F00141C7F9B1A>I<38FE0FE0A3EA0E
+00AD1301EA0F033807FFFE7EEA00FC17157F941A>I<387FC7FC00FF13FE007F13FC380E
+00E0A3380701C0A338038380A33801C700A3EA00EEA3137CA2133817157F941A>I<387F
+C7FC00FF13FE007F13FC380E00E0A27EEB01C013811203EB8380EA01C3A2EBC700EA00E7
+A213E61366136E133CA31338A3137813701230EA78E01271EA7FC06C5A001EC7FC17207F
+941A>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmbx12 13.14 54
+/Fh 54 122 df<123C127E12FFA4127E123C08087C8711>46 D<EB7F803803FFF03807E1
+F8380F807C48487E48133F003E7F007E1480A400FE14C0AD007E1480A46CEB3F00A26C13
+3E6C6C5A3807E1F86CB45A38007F801A237EA21F>48 D<131C133C13FC12FFA21200B3AA
+387FFFFCA216237CA21F>I<48B4FC000713C0381E07F0383803F8386001FC387C00FE12
+FE14FF147FA2127C003813FFC7FC14FEA2EB01FC14F8EB03F0EB07E01480EB0F00131E5B
+1370EBE003EA01C038038007380700061206380FFFFE5A5A4813FCB5FCA218237DA21F>
+I<48B4FC000713E0381E03F0383801F8003C13FC387E00FEA3123EEA1C01000013FCA2EB
+03F8EB07F0EB0FC03801FF00A2380007E0EB01F014F8EB00FC14FE14FFA21210127C12FE
+A214FEA2387C01FC007013F8383E07F0380FFFC00001130018237DA21F>I<14381478A2
+14F81301130313071306130C131C13381330136013E0EA01C01380EA03005A120E5A1218
+5A12705AB612C0A2390001F800A790387FFFC0A21A237EA21F>I<0018130C001F137CEB
+FFF814F014E014C01480EBFC000018C7FCA513FF001B13E0381F03F0381C00F8000813FC
+C7127EA3147FA2127812FCA3147E5A006013FC1270383801F8381E07E03807FFC03801FE
+0018237DA21F>I<EB1FC0EB7FF03801F0383803E00C3807803E000F137EEA1F005AA200
+7E133C1400A338FE3FC0EB7FF0EB80F800FF13FCEB007C147E5A147FA4127EA4003E137E
+123F6C137C380F80F83807C1F03803FFC038007F0018237DA21F>I<1230123C003FB512
+C0A215804814005C5C38600018A200E05B485B5CC6485AA249C7FC1306130EA25BA2133C
+A25BA213F8A41201A66C5A13601A257DA41F>I<EBFF80000313E0380F01F8381C007C48
+133C141E1278A2127C127E387F803C13E0383FF878381FFDF0EBFFC07E000313E014F800
+0F13FCEA1E1F383C07FEEA7803EB00FF48133F141F140FA3140E1278141C6C1338381F80
+F03807FFE00001130018237DA21F>I<13FF000313C0380F83E0381F00F04813F8007E13
+7CA2147E12FEA3147FA4127E14FF123EEA3F01001F137FEA0FFEEA03FCC7FC147EA2123C
+007E13FCA214F814F0EA7C01383003E0381C0F80380FFF00EA03F818237DA21F>I<123C
+127E12FFA4127E123C1200A8123C127E12FFA4127E123C08187C9711>I<141CA2143EA3
+147FA24A7EA39038019FC0A29038031FE0140F01077FEB0607A2010C7F1403011C7FEB18
+01A2496C7EA2017FB5FCA29039E0007F8049133FA2484880151F00038190C7120FA2486E
+7ED8FFF090B51280A229257EA42E>65 D<B612E015FC3903F0007FED3F80ED1FC0ED0FE0
+A216F0A21507150FA216E0151F16C0ED7F80913801FE0090B512F815FF9039F0003FC0ED
+0FE0ED07F016F8150316FCA616F81507ED0FF0ED1FE0ED7FC0B7120015F826257EA42C>
+I<9138FF8008010FEBF01890393FC03C789039FE0006F8D801F813034848130148481300
+48481478121F48481438A2007F151890C8FCA2481500A97E16187F123FA26C6C1430120F
+6C6C14606C6C14C06C6CEB0180D800FEEB070090383FC01E90380FFFF8010013C025257D
+A42C>I<B612E015FC3903F800FFED1FC0ED07E06F7E6F7E82150082A2167FA31780AA17
+00A316FEA24B5A5E4B5A4B5AED1FC0EDFF80B648C7FC15E029257EA42F>I<B7FCA23903
+F8007FED0F8015071503A21501A3ED00C01406A21600A2140E141EEBFFFEA2EBF81E140E
+1406A21660A291C7FC16C0A415011503A2ED0F80153FB7FCA223257EA428>I<B612FEA2
+3803F800151F8181A281A3ED01801403A292C7FCA25C5C90B5FCA2EBF80F8080A491C8FC
+AAB512F0A221257EA427>I<B500E0B512E0A23B03F80003F800AF90B6FCA29038F80003
+B0B500E0B512E0A22B257EA430>72 D<B512E0A23803F800B3AFB512E0A213257EA417>
+I<B539E007FF80A2D803F8C7EA780016605E4B5A0307C7FC150E15185D5D5DEC03804AC8
+FC140E141F4A7E147FECDFC09038FB8FE09038FF0FF0EBFC07496C7E816E7E1400157F82
+153F6F7E6F7E8215076F7E82B539E03FFFC0A22A257EA430>75 D<B512F0A2D803F8C7FC
+B3A31503A31506A3150EA2151E153E157CEC03FCB6FCA220257EA425>I<D8FFF8EDFFF8
+6D5C0003EEFE00017EEC037EA36D1406A26D6C130CA26D6C1318A26D6C1330A36D6C1360
+A26D6C13C0A2903900FC0180A291387E0300A3EC3F06A2EC1F8CA2EC0FD8A2EC07F0A36E
+5AEA07803CFFFC01C01FFFF8A235257EA43A>I<D8FFF8903807FFE07FD803FE9038003C
+006D14187F6D7E6D7E806D7E6D7E13036D7E6D7E80EC7F80EC3FC0141FEC0FE015F0EC07
+F8EC03FC1401EC00FE157F1698ED3FD8ED1FF8150F15071503A2150115001678486C1438
+D8FFFC1418A22B257EA430>I<B67E15F83903F801FEEC007F6F7E6F7EA282A55EA24B5A
+4BC7FCEC01FE90B512F815C09038F803F06E7E6E7E157EA2157FA482A31760ED3FC017C0
+ED1FE1B539E00FFF80923801FE002B257EA42E>82 D<01FF1380000713E3380F80F7381E
+001F48130F481307140312F81401A27E91C7FCB4FCEA7FE013FE383FFFE014F86C13FE00
+077F6C1480C67E010313C0EB003FEC0FE01407A200C01303A315C07E6C13076C14806CEB
+0F0038FFC03E38E3FFF838803FE01B257DA422>I<007FB612F8A2397E00FE010078EC00
+780070153800601518A200E0151C160C5AA4C71400B3A390B512FEA226247EA32B>I<B5
+39E00FFFC0A2D803F8C7EA78001630B3A700015D7F00005D137C6D495A6D0107C7FC9038
+0FE03E903803FFF89038007FC02A257EA42F>I<B5398001FFE0A2D807F8C7EA1C000003
+1518A26D1438000115306D1470000015607F6D5C80013F495AA2ECC003011F91C7FC6E5A
+010F130614F001075BA26D6C5AA2ECFC3801011330ECFE700100136014FF6E5AA26E5AA3
+6EC8FCA2140EA22B257FA42E>I<B53B81FFFE01FFF0A23D07F0001FC0000F007013066C
+6C010F5CA26F7E6C6C5EA26D496C1338000017304B7E017F01195CA291388030FE013F5E
+829139C0607F01011F5E03E0138190280FE0C03F83C7FCA29139F1801FC3010715C617E6
+9139FB000FEE010315EC02FF14FC6D486D5AA24A130301005DA24A130102785CA202306D
+5A3C257FA43F>I<B539C001FFE0A2D807F8C7EA1C006C6C141816386C6C14306C6C5C16
+E06D6C5B6D6C485A1503D91FE090C7FC90380FF006150E903807F80C6D6C5A15386D6C5A
+903800FF6015E06E5A6E5AAE90380FFFFCA22B257FA42E>89 D<EA07FF001F13E0383E03
+F0383F00F880147E121EC7FCA3EB1FFE3803FE7EEA0FC0EA1F00123E127E5AA314BEEA7E
+01383F073E391FFE1FE03807F00F1B187E971E>97 D<EAFFC0A2120FACEBC1FCEBCFFF90
+38FC0FC09038F007E09038C003F0A2EC01F8A215FCA815F8A2EC03F013E09038F007E090
+381C1F80390E0FFF00380C03F81E267FA522>I<EB7FE03803FFF83807C07C381F80FC13
+005A007E1378140012FEA8127E127F6C130CEA1F80EBC0183807E0703803FFE038007F00
+16187E971B>I<ECFFC0A2140FAC137F3803FFCF380FE0FF381F803F383F000FA2127EA2
+12FEA8127EA27E141F381F803F380FC0EF3903FFCFFC3800FE0F1E267EA522>I<137F38
+03FFC03807C1F0380F80F8EA1F0048137C127E147E12FEA2B512FEA248C7FCA3127EA214
+067E6C130C380F80183807E0703803FFE038007F8017187E971C>I<EB1FC0EB7FF0EA01
+F83803E1F8120713C1380FC0F01400A7B5FCA2EA0FC0B3A2EAFFFEA215267EA513>I<39
+01FF07C00007EBDFE0380F83F1EA1F01393E00F800007E7FA6003E5B6C485A380F83E0EB
+FFC0001190C7FC0030C8FCA21238123C383FFFE06C13FC806C7F481480383C003F48EB0F
+C000F81307A4007CEB0F806CEB1F00381F807E3807FFF8C613C01B247E971F>I<EAFFC0
+A2120FAC14FE9038C3FF809038CE0FC013D89038D007E013E0A213C0AF39FFFC7FFEA21F
+267EA522>I<120FEA1F80EA3FC0A4EA1F80EA0F00C7FCA7EA7FC0A2120FB3A2EAFFF8A2
+0D277EA611>I<EAFFC0A2120FACEC1FF0A2EC0780EC0E005C14305CEBC1C0EBC38013C7
+13DFEBFFC0EBE7E0EBC3F0138180EB80FC147E80A2EC1F80EC0FC039FFF83FF8A21D267F
+A520>107 D<EAFFC0A2120FB3B0EAFFFCA20E267EA511>I<26FF80FE137F903A83FF81FF
+C03B0F8E0FC707E0019813CC903A9007E803F001A013F0A201C013E0AF3BFFFC7FFE3FFF
+A230187E9733>I<38FF80FE903883FF80390F8E0FC0139890389007E013A0A213C0AF39
+FFFC7FFEA21F187E9722>I<EB7F803803FFF03807C0F8381F807E48487EA2007EEB1F80
+A200FE14C0A8007E1480A26CEB3F00A2381F807E6C6C5A3803FFF038007F801A187E971F
+>I<38FFC1FCEBCFFF390FFC1FC09038F007E001C013F0140315F8140115FCA8EC03F8A2
+15F0EBE0079038F00FE09038DC1F809038CFFF00EBC3F801C0C7FCA9EAFFFCA21E237F97
+22>I<38FF83E0EB8FF8380F8C7CEB90FC13B013A01478EBE0005BAEEAFFFEA216187F97
+19>114 D<3807F8C0EA1FFFEA3C07EA7001EAF000A300FC1300B47EEA7FFC7F383FFF80
+000F13C0120338001FE01303EAC001A212E014C0EAF00338FC078038EFFF00EAC3FC1318
+7E9718>I<13C0A41201A312031207120F121FB512C0A2380FC000AC1460A63807E0C013
+E13801FF8038007E0013237FA218>I<39FFC07FE0A2000F1307B0140FA200071317EBE0
+673903FFC7FE38007F071F187E9722>I<39FFF80FF8A2390FC001C015803907E00300A2
+6D5A00031306EBF80E0001130C13FC00005B13FEEB7E30A26D5AA214E06D5AA26D5AA26D
+C7FCA21D187F9720>I<3BFFF9FFE0FF80A23B1FC03F001C00000F6D13181580D807E05C
+A29039F03FC07000030137136015E02601F8635BA29038FCE3F1000001C15B15F990267F
+80FBC7FCA215FF90383F007EA2011E133CA3010C131829187F972C>I<39FFF83FF0A239
+0FC00F003807E00E6C6C5A6D5A6C6C5A00001360EB7EC06D5AA2131F6D7E497E80EB33F8
+1361EBE0FC3801C07E3803807F3907003F8048131F39FFC07FF8A21D187F9720>I<39FF
+F80FF8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC00005B13
+FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FCA21306A25B1230EA781CEAFC185B1370EA
+68E0EA7FC0001FC8FC1D237F9720>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmsl10 10.95 48
+/Fi 48 122 df<EB03E0EB1C181338EB703C13E014383801C000A5485A387FFFF0380380
+70A4380700E0A6380E01C0A6381C0380001E13C038FF0FF016207E9F19>12
+D<EB03F4EB1C1CEB383C137013E01438EA01C0A538038070387FFFF038038070A4380700
+E0A6380E01C0A6381C0380001E13C038FF9FF016207E9F19>I<EAFFF0A20C027E8A0F>
+45 D<137EEA01C338030180000713C0EA0E0014E05AA2EA3C0112381278A538F003C0A5
+1480130712E01400A2130E1260EA701CEA3038EA3870EA0FC0131F7C9D17>48
+D<13181338EA01F8EA0E701200A513E0A6EA01C0A6EA0380A6EA07001380EAFFFC0E1E7B
+9D17>I<1408140C141C143CA2147C147E149EA2EB011EA21302801304A21308A2011013
+8014071320A2EB7FFF90384007C0EB8003A2EA0100A21202EC01E01206001F130339FF80
+1FFE1F207F9F22>65 D<0007B5FC3900F803C090387801E0EC00F04913F8A515F03801E0
+01EC03E015C0EC0F809038FFFE009038E00F803903C003C0EC01E015F0A21400A2485A14
+01A215E01403EC07C0390F000F80EC3E00B512F01D1F7E9E20>I<ECFE02903807018690
+381C004E0170133E49131E4848131C4848130C120748C7FC5A121E003E1408003C140012
+7CA45AA4127815101520A27E1540001C14806CEB01006C13023803800C3800E030EB3FC0
+1F217C9F21>I<0007B57E3900F801E0903878007081497F151E150E150FA348481480A6
+484814005DA3151E153E4848133C5DA25D4A5A4A5A260F000FC7FC143CB512F0211F7E9E
+23>I<0007B512FC3900F8007C0178131C150C5B1504A414043901E00800A31438EBFFF8
+EBE0383803C010A4EC00081510485AA21520A2156015C0380F00011407B612801E1F7E9E
+1F>I<0007B512F83900F800780178133815185B1508A53901E00800A314181438EBFFF8
+3803C0301410A491C7FC485AA648C8FC7FEAFFFC1D1F7E9E1E>I<3A07FF83FFC03A00F8
+007C000178133CA2495BA648485BA490B5FCEBE0004848485AA64848485AA64848485A01
+807F39FFF07FF8221F7E9E22>72 D<3807FF803800F8001378A25BA6485AA6485AA6485A
+A648C7FC7FEAFFF0111F7E9E10>I<3A07FF803FE03A00F8001F000178130C5D4913205D
+5D4AC7FC1402140848485A5C146014F013E1EBE4F83803C878EBD07CEBE03CEBC03E141E
+141F48487E81140781140381380F00016D487E39FFF00FFE231F7E9E23>75
+D<3807FFE0D800FCC7FC1378A25BA6485AA6485AA41580EC0100EA0780A25C1402140614
+0E380F001E147CB512FC191F7E9E1C>I<D807F8EC7FE00000ED7C00017814BCA2019C49
+5AA21502A2018E13041508D8010E5C1510A26D1320A215400002EC41E09038038081EC81
+01A21482A23A0401C403C0A214C8A2EB00F0000C13E04B5A001E01C07FD8FFC0EB7FFC2B
+1F7E9E2A>I<D807F8EB7FC0D8007CEB1F00150C015E1304019E5B138FA2EB8780A2EB83
+C0D801035BEB01E0A2EB00F0A2147800025C143CA2141EA2140F485CEC07C0A21403A214
+01000C5C001E1300B47E221F7E9E22>I<EB01FCEB0E0790383801C090387000E0484813
+F048481378485A153C48C7FC5A001E143E123E123C127CA448147CA3157815F81278EC01
+F0007C14E01403003C14C0001CEB0780001EEB0F006C131E380780383801C0E038007F80
+1F217C9F23>I<0007B5FC3900F803C090387800F015785B157CA41578484813F815F0EC
+01E0EC03C0EC0F00EBFFFCD803C0C7FCA6485AA648C8FC7FEAFFF81E1F7E9E1F>I<3807
+FFFE3900F8078090387801E0EC00F05B15F8A415F03801E00115E0EC03C0EC0780EC1E00
+EBFFF03803C03880141E140EA2140F48485AA51501D80F0013029038800F8239FFF8078C
+C7EA01F020207E9E22>82 D<EB1F82EB7066EBC01E3801800EEA030048130C0006130412
+0EA3000F1300A27FEA07F013FF6C13C06C13E038003FF0EB03F813001478143CA2004013
+38A3143000601370146000F013C038E8018038C60300EA81FC17217E9F19>I<003FB512
+F0383C078000301430126039400F0010A212C01280A3D8001E1300A65BA65BA65B7F383F
+FFE01C1F7A9E21>I<39FFF00FF8391F0003E06CEB01801400001EEB0100A6481302A648
+5BA600705BA25CA200785B1238001813C06C48C7FCEA0706EA01F81D20799E22>I<3BFF
+F07FF81FF03B1F000FC007C0001E903907800380001FED01006C1502140F5EEC17C00213
+5B142301805C000713435E14C3913883E0401481D981015B13C1D803C213E193C7FC13C4
+15F2EBC80015F4EA01F015F85B5D5B15605B000014402C207A9E2F>87
+D<EA07F8EA0C0CEA1E061307121C1200A313FFEA07C7EA1E07EA3C0E127800F01310A313
+1EEB2E2038784F40381F878014147D9317>97 D<1207123F120F7EA2120EA65A137CEA1D
+83381E0180001C13C0EB00E05A14F0A5387001E0A214C013031480EB0700EAE80EEACC38
+EA83E014207B9F19>I<13FEEA0383380E0780121C0038130090C7FC12785AA45AA37E5B
+EA70026C5AEA1C18EA07E011147D9314>I<1438EB01F8EB00781438A21470A614E013FC
+EA0382EA0601121CEA3C00383801C0127812F0A438E00380A412F0EA700738380F00381C
+37803807C7E015207D9F19>I<13F8EA070EEA0E07381C038012381278127012F0B5FC00
+F0C7FCA25AA46C5AEA7002EA3004EA1C18EA07E011147D9314>I<EB07C0EB1C60EB30F0
+1360EBE0E0EBC0001201A5485AEA3FFCEA0380A448C7FCA6120EA65A121EEAFFC014207F
+9F0E>I<140EEB3E11EBE1A33801C1C2380381E0EA07801301120FA3380703C01480EB87
+00EA04FC48C7FCA21218121CEA0FFF14C014E0381800F04813305A5AA3006013606C13C0
+381C0700EA07FC181F809417>I<13E0120712011200A2485AA6485AEB8F80EB90E013A0
+EBC0601380000713E01300A5380E01C0A6381C0380001E13C038FF8FF014207E9F19>I<
+EA01C0EA03E0A213C0EA0180C7FCA6EA0380121F12071203A2EA0700A6120EA65A121EEA
+FF800B1F7F9E0C>I<13E0120712011200A2485AA6485AEB81FCEB80F014C0EB81801400
+EA07045B13181338137C131C120E7FA2130F7F1480EA1C03381E07C038FF8FF016207E9F
+18>107 D<13E0120712011200A2EA01C0A6EA0380A6EA0700A6120EA65A121EEAFF800B
+207F9F0C>I<390387C07C391F9861863907A072073903C03403EB80380007EB7807EB00
+70A5000EEBE00EA64848485A001EEBE01E3AFFCFFCFFC022147E9326>I<38038F80381F
+90E0EA07A03803C0601380000713E01300A5380E01C0A6381C0380001E13C038FF8FF014
+147E9319>I<13FCEA0387380E0180381C00C04813E0A24813F012F0A438E001E0A214C0
+130300F0138038700700EA380E6C5AEA07E014147D9317>I<EBE3E03807EC383801F01C
+6C487E140F48487E1580A53903800F00A2140E141E141C5C38074070EB61C0011FC7FC90
+C8FCA3120EA4121EEAFFC0191D809319>I<EBFC2038038260EA0702381E01E0123C0038
+13C0127812F0A438E00380A212F0A21307127038380F00EA1C37EA07C7EA0007A3130EA4
+131EEBFFC0131D7D9318>I<EA038E381FB380EA07C71203EB8300EA078090C7FCA5120E
+A65A121EEAFFC011147E9312>I<EA01F9EA0607EA080312181301EA3802EA3C00121F13
+F0EA07FCEA01FEEA001FEA40071303A212601306EAF004EAC818EA87E010147F9312>I<
+1380EA0100A35A5A5A121EEAFFF8EA0E00A45AA65A1310A41320A2EA1840EA0F800D1C7C
+9B12>I<381C0380EAFC1FEA3C07EA1C03A238380700A6EA700EA4131EA25BEA305E381F
+9F8011147B9319>I<38FF83F8381E00E0001C13C01480121E380E01005B13025B12075B
+A25BEA039013A013E05B5B120190C7FC15147C9318>I<39FF9FE1FC393C078070391C03
+0060148015401580EA0E0790380D81001309EB19C21311380F21C4EA0720EB40C814E8EB
+80F0A26C485A1460000213401E147C9321>I<381FF0FF3803C0780001137014403800E0
+C0EBE180EB73001376133CA2131C132E134E1387EA0107380203801204380C01C0383C03
+E038FE07FC18147F9318>I<390FF83F803901E00E00EBC00C140813E000005B14301420
+5C13705CA20171C7FC1339133A133E133C133813181310A25BA25BEA70C0EAF08000F1C8
+FC12E61278191D809318>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmr8 8 29
+/Fj 29 118 df<126012F0A212701210A21220A21240A2040A7D960A>39
+D<EAFF80A2090280870C>45 D<1206120E12FE120EB1EAFFE00B157D9412>49
+D<13101338A3135CA3138EA3EA0107A238020380A33807FFC0EA0401A2380800E0A20018
+13F0123838FE03FE17177F961A>65 D<EAFFFE381C0380EB00E014601470A414E0EB01C0
+381FFF8014C0381C00E0147014301438A4147014E0EB01C0B5120015177F9619>I<EBFC
+1038038330380E00B0481370481330123000701310126012E01400A51410126012700030
+132012386C13406C138038038300EA00FC14177E9619>I<B5FC381C01C0EB00E0143014
+381418141C140C140EA7140C141CA2143814301460EB01C0B5120017177F961B>I<B512
+E0EA1C00146014201410A3EB0400A3130CEA1FFCEA1C0C13041408A2130014181410A214
+3014F0B5FC15177F9618>I<B512E0EA1C00146014201410A3EB0400A3130CEA1FFCEA1C
+0C1304A390C7FCA6EAFFC014177F9617>I<EAFFC0001CC7FCAD1420A31460A2144014C0
+1303B5FC13177F9616>76 D<00FEEB03F8001E14C000171305A338138009A23811C011A3
+3810E021A2EB7041A3EB3881A2EB1D01A2130EA2123839FE040FF81D177F9620>I<EAFF
+FE381C0380EB00C014601470A4146014C0EB0380381FFE00001CC7FCAAB47E14177F9618
+>80 D<EAFFFC381C0380EB00C014E01470A414E014C0EB0380381FFE00381C0780EB01C0
+EB00E0A514E1A2147238FF803C18177F961A>82 D<EA0FC4EA302CEA601CEA400CEAC004
+A3EAE0001270127FEA3FE0EA0FF8EA01FCEA001C130E13061280A3EAC004EAE008EAD810
+EA87E00F177E9614>I<387FFFF83860381800401308A200801304A300001300AF3803FF
+8016177F9619>I<12FCA212C0B3AB12FCA206217D980A>91 D<EA3FC0EA70601330EA20
+381200EA03F8EA1E3812301270EAE039A21379EA70FFEA1F1E100E7F8D12>97
+D<12F81238A8EA39F0EA3E0CEA380613077F1480A414005B1306EA361CEA21F011177F96
+14>I<EA07F0EA18381230EA7010EA600012E0A41260EA70081230EA1830EA07C00D0E7F
+8D10>I<EA0FC0EA1860EA3030EA7038EAE018EAFFF8EAE000A31260EA7008EA3010EA18
+30EA07C00D0E7F8D10>101 D<1203EA0780A2EA0300C7FCA5EA1F801203AF1243EAE300
+12E7127C091D82960B>106 D<12F81238A8133E13381330134013801239EA3FC0EA39E0
+123813F01378133CA2EAFE7F10177F9613>I<EAF8F8EA3B1CEA3C0E1238AA38FE3F8011
+0E7F8D14>110 D<EA07C0EA1830EA3018EA600CA2EAE00EA5EA701CEA3018EA1830EA07
+C00F0E7F8D12>I<EAF9F0EA3E1CEA380613077F1480A414005B130EEA3E1CEA39F00038
+C7FCA512FE11147F8D14>I<EAF9E0EA3A70123CEA38201300A9B4FC0C0E7F8D0E>114
+D<EA1F40EA60C0EAC040A2EAE000B4FCEA7F80EA1FC0EA01E0EA8060A212C0EAE0C0EA9F
+000B0E7F8D0E>I<1208A31218A21238EAFFC0EA3800A71340A4EA1C80EA0F000A147F93
+0E>I<EAF83EEA380EAA131EEA1C2E3807CF80110E7F8D14>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmsy9 9 2
+/Fk 2 106 df<13801201EA0300A31206A25AA35AA35AA25AA35AA21260A37EA27EA37E
+A37EA27EA3EA0180120009267D9B0F>104 D<12C0A21260A37EA27EA37EA37EA27EA3EA
+0180A2EA0300A31206A25AA35AA35AA25AA35AA209267E9B0F>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmsltt10 10.95 37
+/Fl 37 122 df<1206120FEA1F80120FA21203EA0700A25A120E123C127C12F01260090E
+769B18>39 D<387FFFC0B512E0A26C13C013047C8F18>45 D<133E13FF000313803807C3
+C0EA0F01000E13E0EA1C00123C003813F014705AA34813E0A4EB01C0A2130300F01380EA
+7007EB0F00EA781E6C5AEA1FF85BEA07C0141C7C9B18>48 D<13181338A2137813F81203
+120F137012041200A413E0A6EA01C0A6EA7FFE12FF127F0F1C7B9B18>I<EB3E18EBFFB8
+4813F8EA07C1EB8078EA0E00121E001C137048133014005AA35AA614C0EA7001A2130338
+380780383C0F00EA1FFE6C5AEA03F0151C7C9B18>67 D<3807FFC014E014F03801C0F814
+78143C141CEA0380141EA2140EA33807001CA4143C1438120E147014F0EB01E0EB03C013
+07387FFF8038FFFE00EA7FF8171C7F9B18>I<0007B5FC5A7E3801C007A3140638038000
+A2EB818014C0A213FF481380A21303A2140090C7FC120E140C141CA4387FFFF8B5FC7E18
+1C7F9B18>I<3907F87F80A33901C01C00A448485AA5EBFFF8485BA2EB0070A4000E5BA6
+387F87F8EAFF8FEA7F87191C7F9B18>72 D<EB1FF8EB3FFCEB1FF8EB01C0A4EB0380A6EB
+0700A6130EA2124012E06C5AEAE03CEAFFF86C5AEA1FC0161C7C9B18>74
+D<EA07FC487E6C5AEA01C0A4485AA648C7FCA6120E14301470A4B512E0A3141C7E9B18>
+76 D<3907E01F80000FEB3FC0000714803903B02E00146EA214CE380730DC1331149CA2
+1333141C000E5B13371336133E133C131848C65AA638FE03F800FF7F00FE5B1A1C7F9B18
+>I<126012F0A37E1278A3127C123CA3123E121EA3121F7EA313801207A313C01203A413
+E01201A313F0120013600C24789F18>92 D<387FFFC0B512E0A26C13C013047E7F18>95
+D<EA03FC48B4FC4813801303380601C01200A2137FEA07FF121FEA3F813878038012F012
+E0A21307EA701F387FFFF0EA3FFBEA0FE114147D9318>97 D<127EA3120EA45A137CEA1D
+FF001F13801383381E01C0123CEB00E01238A4387801C0A2EB0380A2EB0F00EA7C1FEAFF
+FCEAEFF8EA63E0131C7C9B18>I<13FF00031380000F13C0EA1F03383C018048C7FC1270
+5AA713033870078038780F00EA3FFE6C5AEA07F012147B9318>I<EB07E0A31300A4EB01
+C0EA01F1EA07FDEA0FFFEA1E0FEA3C0738780380127012E0A4EB0700A25B5B6C5AEA787F
+383FFFC0381FEFE0380F87C0131C7C9B18>I<13F8EA07FE487E381F0780EA3C03387801
+C0127012E0A2B5FCA2148000E0C7FCA213033870078038780F00EA3FFE6C5AEA07F01214
+7B9318>I<EB01F8EB07FC131FEB1E3CEB38181400A25B381FFFF05A7E38007000A25BA6
+485AA6EA7FFE12FF127F161C7E9B18>I<EB1E1F90387FFF8090B5FC3901E1E3003803C0
+E01380EA0700A3495AA238038780EA07FF49C7FCEA0E7890C8FCA26CB47E4813E0487F38
+3C007848133812705AA2147800705B387C03E0383FFFC0000F90C7FCEA03FC191F809318
+>I<1318133C137C133C131890C7FCA4EA0FF8121F120FEA0038A25BA65BA6EA7FFFB512
+806C1300111D7C9C18>105 D<14C0EB01E013031301EB00C01400A4EBFFC0A31301A2EB
+0380A6EB0700A6130EA65BA2EA6038EAF078B45A5BEA3F8013277F9C18>I<EA07E0120F
+12071200A4485AEBC7FEA3EBC1E0EBC3C038038780EB8F00139E13BC13FE13EEEA07CF13
+87EB0780130314C01301387FC7F838FFE7FC387FC7F8171C7F9B18>I<EA0FFCA3EA001C
+A45BA65BA65BA6B5128014C01480121C7D9B18>I<381F3C3CEBFEFE13FF3807CFCEEB8F
+8E380F0F0EA2EA0E0EA4381C1C1CA638FE3E3E38FF7F7F38FE3E3E1814809318>I<381F
+8F80383FBFE0381FFFF03803F07013E0EA07C013801300A4000E13E0A638FF87F8EBCFFC
+EB87F816147F9318>I<13FCEA03FF000F1380EA1F07383C03C0EA7801007013E0EAE000
+A4EB01C0A2EB0380EAF007EB0F00EA7C3EEA3FFC6C5AEA07E013147C9318>I<3807E3E0
+380FEFF83807FFFC3800FC1CEBF00EEA01E0140713C0A40003130EA2141CA21478EBE0F8
+3807FFE0EB7FC0EB1F0090C7FCA3120EA4EAFFC0A3181E819318>I<EBF8C0EA03FDEA0F
+FFEA1F0FEA3C0738780380127012E0A4EB0700A25BA26C5AEA787FEA3FFEEA1FEEEA078E
+EA000EA35BA43801FF80A3121E7C9318>I<381FE1F8EBE7FCEBEFFE3800FE1EEBFC0C38
+01F8005B5B5BA3485AA6EAFFFC7F5B17147E9318>I<EBFE603807FFE05AEA1F01121C00
+3813C0EA3C00001F1300EA0FF8EA07FE3800FF801307383001C01270A238780380EA7C07
+B51200EAEFFEEA63F813147D9318>I<487E7FA3485A387FFFC0B5FC7E38038000A248C7
+FCA6120E5BEB0380A2EB07005BEA07FE5BEA01F012197C9818>I<387E07E0EAFE0FEA7E
+07EA0E00A2381C01C0A638380380A41307131F383FFFE06C13F03807E3E014147D9318>
+I<387F8FF000FF13F8007F13F0381C0380A2EB0700121EEA0E0F130E131E131CA25BA26C
+5AA2136013E05B6C5A15147C9318>I<38FF87F8138F1387383800E0EB01C0A3148013E3
+EA39F31233EB7700A212371376EA3666136EEA3C7CA2EA383815147C9318>I<381FE3FC
+13E713E33803C3C000011380EBE700EA00EE13FC137C1338137813FCEA01DCEA038E1207
+1307120E38FF1FE0EB9FF0EB1FE016147E9318>I<380FF1FE381FF9FF380FF1FE380380
+7013C0000113E0A213C114C0A23800E380A2EBE700A213E6136E136C137C1378A21370A2
+5BA2485A12F3EAF780B4C7FC5A1278181E7F9318>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmcsc10 10.95 18
+/Fm 18 121 df<1318A2133CA3134EA213CF1387A238010380A2000313C0EA0201A23807
+FFE0EA0400A2481370A2001813380038137838FE01FF18177F961C>97
+D<EB7E083803819838070078000C1338001C13185A00781308127000F01300A700701308
+127812386C1310120C000713603803818038007E0015177E961B>99
+D<EAFFFE381C0780EB01C0EB00E01470A21438A2143CA71438A21478147014E0EB01C0EB
+038038FFFE0016177E961C>I<B512C0EA1C011300144014601420A213081400A21318EA
+1FF8EA1C1813081410A2130014301420A21460EB01E0B5FC14177E9619>I<B512C0EA1C
+011300144014601420A213081400A21318EA1FF8EA1C181308A390C7FCA6EAFFC013177E
+9618>I<EB7E083803819838070078000C1338001C13185A00781308127000F01300A5EB
+03FEEB00381270127812387E120C1207380380D838007F0817177E961D>I<38FF87FC38
+1C00E0AAEA1FFFEA1C00AA38FF87FC16177E961C>I<EAFF80EA1C00B3A3EAFF8009177E
+960E>I<EA1FF0EA01C0B112E1A2EAC180EA4300123E0C177E9613>I<EAFFC0001CC7FCAD
+1440A314C0A2148013011307B5FC12177E9617>108 D<00FCEB07F0001C1480A2001613
+0BA200131313A338118023A23810C043A3EB6083A2EB3103A3131AA2130C123800FEEB1F
+F01C177E9622>I<38FC01FC381E007014201217EA1380A2EA11C0EA10E0A213701338A2
+131C130E1307A2EB03A0EB01E0A213001460123800FE132016177E961C>I<13FE380383
+80380E00E0481370003C1378003813380078133C0070131C00F0131EA70070131C007813
+3C00381338003C1378001C13706C13E0380383803800FE0017177E961D>I<EAFFFCEA1C
+07EB03C0130114E0A414C01303EB0700EA1FFC001CC7FCAAB47E13177E9619>I<EA0FC4
+EA302CEA601CEA400CEAC004A3EAE0001270127FEA3FE0EA0FF8EA01FCEA001C130E1306
+1280A3EAC004EAE008EAD810EA87E00F177E9615>115 D<387FFFFC3870381C00401304
+A200C0130600801302A300001300AE3803FF8017177F961B>I<38FF81FC381C00701420
+B0000C1340120E6C138038018300EA007C16177E961C>I<38FF80FE381F0070000E1360
+6C1340EB80803803C100EA01C3EA00E213F4137813387F133E134E13C7EB8780380103C0
+EA0201380600E0000413F0000C1370003C137800FE13FF18177F961C>120
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmti10 10.95 20
+/Fn 20 122 df<EC3FE0ECE010903801803801031378A290380700301500A3130EA390B5
+12E0EB0E0090381C01C0A4EC03801338A3EC0700A2137801701310EC0E20A313609038E0
+0640EC038091C7FC5BA21201EA3180127948C8FC1262123C1D29829F1A>12
+D<127012F8A212F012E005057B840E>46 D<EBF180380389C038070780EA0E03121C123C
+383807001278A3EAF00EA31420EB1C40A2EA703C135C38308C80380F070013147C9317>
+97 D<137EEA01C138030080EA0E07121E001C1300003CC7FC5AA35AA45B12701302EA30
+0CEA1830EA07C011147C9315>99 D<1478EB03F8EB0070A414E0A4EB01C0A213F1EA0389
+38070780EA0E03121C123C383807001278A3EAF00EA31420EB1C40A2EA703C135C38308C
+80380F070015207C9F17>I<137CEA01C2EA0701120E121C123CEA3802EA780CEA7FF0EA
+78005AA4EA7001A21302EA380CEA1830EA07C010147C9315>I<EB3C60EBE2703801C1E0
+EA0380EA07005A380E01C0121EA3383C0380A4EB0700A2EA1C0F1317EA0C2EEA03CEEA00
+0EA25BA21230EA7838485AEA60E0EA3F80141D7E9315>103 D<13C0EA01E0A213C0C7FC
+A7120E12131223EA4380EA4700A21287120EA35AA3EA38401380A21270EA31001232121C
+0B1F7C9E0E>105 D<EA03C0121FEA0380A4EA0700A4120EA45AA45AA45AA3127112E2A4
+126412380A207C9F0C>108 D<391C0F80F0392630C318394740640C903880680EEB0070
+A2008E495A120EA34848485AA3ED70803A3803807100A215E115623970070064D8300313
+3821147C9325>I<381C0F80382630C0384740601380EB0070A2008E13E0120EA3381C01
+C0A3EB038400381388A2EB0708EB031000701330383001C016147C931A>I<137CEA01C3
+38030180000E13C0121E001C13E0123C1278A338F003C0A3EB07801400EA700F130EEA30
+18EA1870EA07C013147C9317>I<3801C1E0380262183804741C1378EB701EA2EA08E012
+00A33801C03CA3143838038078147014E0EBC1C038072380EB1E0090C7FCA2120EA45AA2
+B47E171D809317>I<EA1C1EEA266138278380EA47871307EB0300008EC7FC120EA35AA4
+5AA45A123011147C9313>114 D<13FCEA0302EA0601EA0C03130713061300EA0F8013F0
+EA07F8EA03FCEA003E130E1270EAF00CA2EAE008EA4010EA2060EA1F8010147D9313>I<
+EA018013C0EA0380A4EA0700A2EAFFF0EA0700120EA45AA45AA31320EA7040A21380A2EA
+3100121E0C1C7C9B0F>I<000E13C0001313E0382301C0EA4381EA4701A238870380120E
+A3381C0700A31410EB0E201218A2381C1E40EA0C263807C38014147C9318>I<380E0380
+EA1307002313C0EA4383EA4701130000871380120EA3381C0100A31302A25BA25BEA0E30
+EA03C012147C9315>I<000EEBC1C0001313E3392301C3E0384381C1384701C015603987
+038040120EA3391C070080A3EC0100A21306EB0F02000C5B380E13083803E1F01B147C93
+1E>I<000E13C0001313E0382301C0EA4381EA4701A238870380120EA3381C0700A4130E
+1218A2EA1C1EEA0C3CEA07DCEA001CA25B12F05BEAE060485AEA4380003EC7FC131D7C93
+16>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fo cmbxti10 14.4 1
+/Fo 1 47 df<120E123FEA7F80A212FFA21300127E123C0909798815>46
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fp cmbx12 17.28 37
+/Fp 37 122 df<EB01C01303130F137FEA1FFFB5FC13BFEAE03F1200B3B1007FB512F0A3
+1C2E7AAD28>49 D<EB3FE03801FFFE0007EBFF80D80F8013C0391E003FE00038EB1FF000
+7CEB0FF8007EEB07FCB4FC018013FEA21403A2EA7F00003E1307C7FC15FCA2EC0FF8A215
+F0EC1FE015C0EC3F80EC7F00147E14F8495A495A495A49C7FC011E130E5B133849131E49
+131C485A48C7123C48B512FC5A5A5A4814F8B6FCA31F2E7CAD28>I<1578A215FCA34A7E
+A24A7EA24A7FA34A7FEC0E7F021E7FEC1C3FA202387F151F02787FEC700FA202E07F1507
+010180ECC003A249486C7EA201078191C7FC498191B6FCA24981011CC7123F013C810138
+141FA24981160F01F081491407A2484881486C1403B549B512FCA336317DB03D>65
+D<913A03FF800180023FEBF00349B5EAFC0701079038003F0FD91FF8EB079FD93FC0EB01
+FFD9FF807F4848C8127F4848153F0007161F49150F485A001F1607A2485A1703127FA249
+92C7FCA212FFA9127FA27FEF0380123FA26C7E1707000F17006C7E6D150E0003161E6C6C
+151C6C6C6C1478D93FC05CD91FF8EB03E0D907FFEB3F800101D9FFFEC7FCD9003F13F802
+03138031317CB03A>67 D<B812F0A3C6903880003FEE07F816031600A21778A21738A317
+1C1507A31700A25D5D5D91B5FCA3EC803F818181A21707A392C7120EA4171EA2173CA217
+7C17FC16011607163FB812F8A330317EB035>69 D<B812E0A3C6903880007FEE0FF01603
+1601A21600A21770A31738A21507A21700A35D5D5D91B5FCA3EC803F818181A592C8FCAC
+B612C0A32D317EB033>I<DA03FF1303027FEBF00749B5EAFC0F01079038007E1FD91FF0
+EB0FBFD97FC0EB03FF49487F4848C87E485A0007824848815B001F82A2484881A2127FA2
+4992C7FC12FFAA0307B512F8127F7FDB00011300123FA26C7EA2120F7F6C7E12036C7E6C
+6C7E6D6C5BD91FF8497ED907FFEB3E3F01019038FFFC1F6D6CEBF00F0203EB800335317C
+B03F>I<B61280A3C6EB8000B3B3A7B61280A319317EB01E>73 D<B67EA3000190C9FCB3
+A9EE0380A416071700A25EA35E5E5E5E4B5A150FB7FCA329317DB030>76
+D<B500C00303B5FCA26E5DC61900D9EFF0150EA3D9E7F85DA2D9E3FC5DA2D9E1FE5DA2D9
+E0FF5DA26E6C495AA26E6C495AA36E6C495AA26E6C130EA26E6C5BA26E6C5BA26E6C5BA2
+6E6C5BA392387F81C0A292383FC380A2DB1FE7C7FCA2ED0FFEA26F5AA36F5A487EB526E0
+01F090B6FCA26F5A48317EB04D>I<B56C49B512C08080C66D90390003E0006E6E5AEBEF
+FC13E780EBE3FF01E17F01E07F6E7E143F816E7E6E7E6E7E14036E7E16806E13C0ED7FE0
+ED3FF0151F16F8ED0FFCED07FEED03FF6F13818117C1EE7FE1EE3FF1EE1FF9EE0FFD1607
+17FF828282177F173FA2171F170F486C1507B500E014031701A23A317EB03F>I<B712E0
+16FEEEFF80C6D9800013E0EE3FF0EE0FF8EE07FCA2EE03FEA217FFA717FEA2EE07FC17F8
+160FEE3FE0EEFFC091B6120016F80280C8FCB3A2B67EA330317EB037>80
+D<B77E16F816FEC690398003FF809238007FE0EE1FF0707EA283160783A65F160F5F4C5A
+4C5A4C5ADB03FFC8FC91B512F816E091388007F8ED01FC6F7E167F83707EA283A583A4F0
+038017F8161F1900706C5AB6398003FE0E933801FFFC9338001FF039317EB03C>82
+D<007FB8FCA39039C00FF801D87E00EC003F007C82007882A200708200F01780A3481603
+A5C792C7FCB3AA017FB6FCA331307DAF38>84 D<B6D88003B51280A3C60180C73807C000
+715AB3AE137F4DC7FC80013F150EA26D6C5C6D6C5C6D6C5C6D6C495A903A00FF801FC002
+3FB55A020F49C8FC020013E039317EB03E>I<B500FC91B5FCA3000390C8EA03C06C1780
+6E14076C170080017F150EA26E141E013F151C6E143C011F153880010F5D8001075DA26E
+130101035D6E13036D5D15806D4AC7FCA26F5A027F130EEDE01E023F131CEDF03C021F13
+3815F8020F5BA2EDFCF002075B15FF6E5BA26E5BA26E90C8FCA3157EA2153CA238317EB0
+3D>I<EBFFF0000313FF390F803F809038C00FE0486C6C7EA26E7ED80FC07FEA0780C7FC
+A414FF131FEBFFE33803FC03EA0FF0EA1FC0123FEA7F80A2EAFF00A31407A2387F800D39
+3FC01DFE3A1FE078FFF03907FFE07FC6EB803F24207E9F27>97 D<EA01F812FFA3120F12
+07ADEC3FE0ECFFFC9038FBE07F9039FF001F8049EB0FC04914E049EB07F016F8A2ED03FC
+A316FEA816FCA3ED07F8A216F06DEB0FE06D14C001E7EB3F809039C3C0FE00903880FFF8
+9038003FC027327EB12D>I<EB0FFF017F13C03901FC01F03803F0033907E007F8120FEA
+1FC0003FEB03F0EC01E04848C7FCA312FFA8127FA36C6C131CA2001F14386C7E00071470
+3903F001E03901FC07C039007FFF00EB0FF81E207D9F24>I<ED0FC0EC07FFA3EC007F15
+3FADEB07F8EB3FFF9038FE07BF3903F801FF3907E0007F120F4848133F123FA2485AA312
+FFA8127FA36C7EA2121F6C6C137F000714FF2603F00313E03A01FC0F3FFE38007FFEEB0F
+F027327DB12D>I<EB0FFC90387FFF803901FC0FC03903F003E03907E001F0000F14F839
+1FC000FC003F14FEA24848137E157FA212FFA290B6FCA20180C7FCA4127FA36C6C130712
+1F150E6C7E6C6C131C6C6C13783900FE03E090383FFFC0903807FE0020207E9F25>I<EB
+01FE90380FFF8090381FC3C090387F07E09038FE0FF0120113FC1203EC07E0EC018091C7
+FCA8B512FCA3D803FCC7FCB3A8387FFFF0A31C327EB119>I<90391FF007C09039FFFE3F
+E03A01F83F79F03907E00FC3000F14E19039C007E0E0001FECF000A2003F80A5001F5CA2
+000F5CEBE00F00075C2603F83FC7FC3806FFFE380E1FF090C9FC121EA2121F7F90B57E6C
+14F015FC6C806C801680000F15C0003FC7127F007EEC1FE0007C140F00FC1407A4007EEC
+0FC0003E1580003F141FD80FC0EB7E003907F803FC0001B512F0D8001F90C7FC242F7E9F
+28>I<EA01F812FFA3120F1207ADEC07F8EC3FFEEC783F02C013809039F9801FC0EBFB00
+01FE14E05BA35BB3B500C3B5FCA328327DB12D>I<EA03C0487E487E487EA46C5A6C5A6C
+5AC8FCA9EA01F8127FA31207B3A7B51280A311337DB217>I<EA01F812FFA3120F1207B3
+B3A6B512C0A312327DB117>108 D<2703F007F8EB1FE000FFD93FFEEBFFF8913A783F01
+E0FC02C090388300FE280FF1801FC6137F2607F30013CC01F602F8148001FC5CA3495CB3
+B500C3B5380FFFFCA33E207D9F43>I<3903F007F800FFEB3FFEEC783F02C013803A0FF1
+801FC03807F30001F614E013FCA35BB3B500C3B5FCA328207D9F2D>I<EB07FC90387FFF
+C03901FC07F03903F001F848486C7E4848137E001F147F003F158049133F007F15C0A300
+FF15E0A8007F15C0A36C6CEB7F80A2001F15006C6C13FE00075C3903F803F83901FE0FF0
+39007FFFC0D907FCC7FC23207E9F28>I<3901F83FE000FFEBFFFC9038FBE07F9039FF00
+3F80D80FFEEB1FC06C48EB0FE04914F0ED07F8A216FC1503A216FEA816FC1507A216F8A2
+ED0FF06D14E06DEB1FC06DEB3F809039FBC0FE009038F8FFF8EC3FC091C8FCABB512C0A3
+272E7E9F2D>I<3803F03F00FFEB7FC09038F1C3E01487390FF30FF0EA07F6A29038FC07
+E0EC03C091C7FCA25BB2B512E0A31C207E9F21>114 D<3801FF86000713FEEA1F00003C
+133E48131E140E12F8A36C90C7FCB47E13FC387FFFC06C13F0806C7F00077F00017FEA00
+3F01001380143F0060131F00E0130FA27E15007E6C131E6C131C38FF807838F3FFF038C0
+7F8019207D9F20>I<131CA5133CA3137CA213FC120112031207381FFFFEB5FCA2D803FC
+C7FCB0EC0380A71201EC0700EA00FEEB7F0EEB3FFCEB07F0192E7FAD1F>I<D801F8EB07
+E000FFEB03FFA3000FEB003F0007141FB3153FA20003147FA26C6CEBDFF03A00FE039FFF
+90387FFF1FEB0FFC28207D9F2D>I<B53A1FFFE03FF8A33C0FF000FE0007806D15030007
+6EEB0700816D5D00039138FF800EA26C6C486D5A15DF01FF153C6C9039038FE038A2D97F
+876D5A150702C714F0D93FCF6D5AECCE03D91FFEEBF9C09138FC01FD16FF010F5D4A7EA2
+6D486DC7FCA20103147E4A133EA26D48131C35207E9F3A>119 D<3A7FFF807FFCA33A03
+FC000F006C6C131E6C6C5BEC803890387FC078013F5B90381FE1E090380FF3C0ECFF806D
+90C7FC6D5A13016D7E81815B903803DFE09038078FF08190380F07FC90381E03FEEB3C01
+496C7E4914804848EB7FC00003EC3FE026FFFC01B5FCA328207F9F2B>I<B5EB1FFCA3D8
+0FF8EB03C0000715806D1307000315007F0001140E7F6C5CA2EC803C017F1338ECC07801
+3F1370ECE0F0011F5B14F1010F5B14F9903807FB80A214FF6D90C7FCA26D5AA26D5AA214
+78A21470A214F05C1301007C5BEAFE035C49C8FC5BEAFC1EEA787CEA3FF0EA0FC0262E7E
+9F2B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fq cmsy10 10.95 1
+/Fq 1 14 df<14FE903807FFC090381F01F0903878003C01E0130ED80180130348C7EA01
+800006EC00C0481560A2481530481518A248150CA4481506A90060150CA46C1518A26C15
+306C1560A26C15C06CEC01806C6CEB0300D800E0130E0178133C90381F01F0903807FFC0
+D900FEC7FC272B7DA02E>13 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fr cmbx12 14.4 53
+/Fr 53 122 df<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A2120612
+0E5A5A12100A157B8813>44 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>46
+D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277BA622>49
+D<EBFF80000713F04813FC381E03FE393800FF80007C133F00FE14C06C131F15E0140FA2
+127E003C131FC7FC15C0A2EC3F801500147E5C5C495A495AEB078049C7FC131E4913E013
+705B3901C001C0EA0380EA0600000FB5FC5A5A5AB61280A31B277DA622>I<EB7F803803
+FFF04813FC380F81FE381F007FEA3F80EC3F80A3121F1300C7EA7F00A2147E5C495AEB07
+F0EBFFC0A2EB01F8EB007E801580EC1FC0A215E0A2123C127EB4FCA215C0143F48148000
+7CEB7F00383F01FE6CB45A000713F0C613801B277DA622>I<140FA25C5C5C5C5BA2EB03
+BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12F0B612F8
+A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C5C14C091
+C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215E0A21218
+127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C613801B277DA6
+22>I<EB07F8EB3FFE90B5FC3901FC07803903F00FC03807C01FEA0F80121F130048EB0F
+8091C7FC127EA3EAFE02EB1FF0EB3FFCEB603EEB801F00FF14809038000FC0A24814E0A4
+127EA4123E003F14C07EEC1F80D80F8013003807E07E6CB45A6C5B38003FC01B277DA622
+>I<EC0780A24A7EA34A7EA24A7EA3EC77F8A2ECF7FC14E3A2903801C1FEA201037F1480
+A249486C7EA24980010E133FA2496D7EA2013FB57EA39039700007F8A201F08049130300
+0181491301A2000381D8FFFE013F13FCA32E297EA833>65 D<B612F815FF16C03A03F800
+1FE0ED0FF0ED07F8150316FCA21501A3150316F8A2ED07F0150FED1FC0EDFF8090B5EAFE
+00EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216FFA616FE1501ED03FC1507ED1FF8
+B712E016C0EDFE0028297DA830>I<91387FE003903907FFFC07011FEBFF0F90397FF00F
+9F9039FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA290C9
+FC5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F090397F
+F007C0011FB512800107EBFE009038007FF028297CA831>I<B612FCEDFF8016E03A03FC
+001FF8ED03FCED00FE167FEE3F80EE1FC0A2EE0FE0A2EE07F0A417F8AA17F0A3EE0FE0A2
+17C0161FEE3F80EE7F005EED03FCED1FF8B75A168003FCC7FC2D297EA834>I<B712E0A3
+3903FC001FED07F01501A215001670A3913801C0781638A302031300A2140F90B5FCA3EB
+FC0F1403A20201130EA3161C91C7FCA3163C1638167816F815011503151FB712F0A32729
+7EA82C>I<B712C0A33903FC003FED0FE015031501A21500A316F0913801C070A3160014
+03A2140F90B5FCA3EBFC0F1403A21401A491C8FCA9B512FCA324297EA82A>I<91387FE0
+03903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F4848804848804848
+80485A82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E6C
+7E6C7E6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>I<B5D8
+F00FB5FCA3D803FCC7EA3FC0AF90B7FCA301FCC7123FB1B5D8F00FB5FCA330297EA835>
+I<B512F0A33803FC00B3B1B512F0A314297EA819>I<B500F0EBFFFEA3D803FCC7EA0F00
+161E5E5E16E0ED03C04B5A4BC7FC151E5D15F04A5A4A5A1407140F4A7EEC7FF04A7EEBFD
+E79038FFC3FCEC83FE9038FE01FF497E6F7E826F7E151F6F7E8215076F7E6F7E8281EE7F
+80B539F00FFFFEA32F297EA835>75 D<B512FCA3D803FCC8FCB3A3ED01C0A415031680A2
+1507A2150FA2151F157F913801FF00B7FCA322297EA828>I<D8FFFE92383FFF80A26D5D
+0003EFE000A2D9BF8014EFA2D99FC0EB01CFA2D98FE0EB038FA3D987F0EB070FA2D983F8
+130EA2D981FC131CA3D980FE1338A2027F1370A291383F80E0A391381FC1C0A291380FE3
+80A2913807F700A3EC03FEA26E5AA26E5AD8FFFE0203B51280A2157039297DA840>I<D8
+FFFCEC7FFF7F7F00036DEB01C080EBBFE0139F80EB8FF8EB87FCEB83FEEB81FF01801380
+147F15C0EC3FE0EC1FF0EC0FF8EC07FC140315FEEC01FF6E1381ED7FC1ED3FE1ED1FF115
+0F16F9ED07FDED03FF8181167FA2163F161F160F1607D8FFFE14031601A230297EA835>
+I<ECFFC0010F13FC90383F807F9039FE001FC0D801F8EB07E048486D7E48486D7E000F81
+48486D7EA24848147FA2007F168090C8123FA34816C0AA6C16806D147FA2003F1600A26C
+6C14FEA26C6C495A6C6C495A6C6C495A6C6C495A6C6C495A90263FC0FFC7FC90380FFFFC
+010013C02A297CA833>I<B612F815FF16C03A03FC003FE0ED07F0ED03F816FC150116FE
+A716FC150316F8ED07F0ED3FE090B61280EDFE0001FCC8FCB0B512F0A327297EA82E>I<
+ECFFC0010F13FC90383FC0FF9039FE001FC048486D7ED803F0EB03F000078148486D7E48
+486D7EA24848147FA2007F1680A290C8123FA24816C0AA6C16806D147FA2003F1600A26C
+6C14FE143E3A0FE07F81FC00079038C1C1F83A03F18063F0D801F9EB67E0D800FFEB3FC0
+90263FC07FC7FC90380FFFFC01004913C0EC003C811601ED1F8316FF6F1380A21700816F
+5A6F5A6F5A2A357CA833>I<B612E015FE6F7E3A03FC003FE0ED0FF06F7E6F7E150182A6
+5E4B5A1507ED0FE0ED3FC090B500FEC7FCA29039FC00FF80ED3FC06F7E6F7E6F7EA9170E
+A21503923801FC1CB538F000FEEE7FF8EE0FE02F297EA832>I<9038FF80600003EBF0E0
+000F13F8381F80FD383F001F003E1307481303A200FC1301A214007EA26C140013C0EA7F
+FCEBFFE06C13F86C13FE80000714806C14C0C6FC010F13E0EB007FEC1FF0140F140700E0
+1303A46C14E0A26C13076C14C0B4EB0F80EBE03F39E3FFFE0000E15B38C01FF01C297CA8
+25>I<007FB71280A39039807F807FD87C00140F00781507A20070150300F016C0A24815
+01A5C791C7FCB3A490B612C0A32A287EA72F>I<B500F0EBFFFEA3D803FCC7EA0380B3AA
+0001ED07007F0000150E137F6D143CD91FC05B90390FF003F06DB55A01001480DA1FFCC7
+FC2F297EA834>I<B500F0EB7FFFA3D803FEC7EA01C00001ED0380A26D14076C16006E5B
+017F140E80013F5CA26E133C011F14386E1378010F14708001075CA26D6C485AA2ECFE03
+01015CECFF076D91C7FC1587EC7F8EA215DEEC3FDC15FC6E5AA26E5AA36E5AA26E5AA230
+297FA833>I<B53CE07FFFE01FFFC0A32803FC0003FCC7EA7000A26D6D7E000160A26D6E
+13016C604B138002801503017F5F4B13C0D93FC0013F49C7FCA2913AE00E1FE00F011F16
+0E17F09126F01C0F131E010F161C033C13F8902707F838075BA2037813FC902703FC7003
+5BA2913AFEE001FEF001015E02FF14FF4B7E6D5EA26E486D5AA36EC76CC8FCA2023E8002
+1E141EA242297FA845>I<B500F0EB3FFFA3D803FEC7EA03C06C6C15806C6DEB07005E6D
+6C130E6E5B013F143C6D6C13386E5B010F14F06D6C5B6E485A01031303D901FF5B0387C7
+FC6D138FEC7FCE15FC143F6E5A5D140FAE0103B512C0A330297FA833>89
+D<3803FF80000F13F0381F01FC383F80FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA
+0FE0EA1F80EA3F00127E5AA4145F007E13DF393F839FFC381FFE0F3803FC031E1B7E9A21
+>97 D<EAFFE0A3120FACEBE1FE9038EFFF809038FE07E09038F803F09038F001F89038E0
+00FCA2157EA2157FA8157EA315FCA29038F001F89038F803F090389C0FE090380FFF8039
+0E01FC00202A7EA925>I<EB3FF03801FFFC3803F03E380FC07FEA1F80EA3F00A248133E
+007E90C7FCA212FEA7127EA2127F6CEB03801380001FEB0700380FE00E3803F83C3801FF
+F838003FC0191B7E9A1E>I<EC7FF0A31407ACEB3F873801FFF73807F03F380FC00F381F
+8007EA3F00A2127EA312FEA8127EA27EA2381F800F380FC01F3907E07FFF3801FFE73800
+7F87202A7EA925>I<EB3FC03801FFF03803E07C380F803E001F7F130048EB0F80127E15
+C0A200FE1307A2B6FCA248C8FCA3127EA2127F6CEB01C07E390F8003803907C007003803
+F01E3800FFFCEB3FE01A1B7E9A1F>I<EB07F8EB3FFCEB7E3E3801FC7FEA03F813F01207
+143E1400A7B512C0A33807F000B3A3387FFF80A3182A7EA915>I<9038FF80F00003EBE3
+F8390FC1FE1C391F007C7C48137E003EEB3E10007EEB3F00A6003E133E003F137E6C137C
+380FC1F8380BFFE00018138090C8FC1238A2123C383FFFF814FF6C14C06C14E06C14F012
+1F383C0007007CEB01F8481300A4007CEB01F0A2003FEB07E0390FC01F806CB512003800
+7FF01E287E9A22>I<EAFFE0A3120FAC147E9038E1FF809038E30FC001E413E0EBE80701
+F813F013F0A213E0B039FFFE3FFFA3202A7DA925>I<1207EA0F80EA1FC0EA3FE0A3EA1F
+C0EA0F80EA0700C7FCA7EAFFE0A3120FB3A3EAFFFEA30F2B7EAA12>I<EAFFE0A3120FB3
+B2EAFFFEA30F2A7EA912>108 D<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1F8D8
+0FC49038F101FC9039C803F20001D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0A333
+1B7D9A38>I<38FFC07E9038C1FF809038C30FC0D80FC413E0EBC80701D813F013D0A213
+E0B039FFFE3FFFA3201B7D9A25>I<EB3FE03801FFFC3803F07E390FC01F80391F800FC0
+393F0007E0A2007EEB03F0A300FE14F8A8007E14F0A26CEB07E0A2391F800FC0390FC01F
+803907F07F003801FFFC38003FE01D1B7E9A22>I<38FFE1FE9038EFFF809038FE0FE039
+0FF803F09038F001F801E013FC140015FEA2157FA8157E15FEA215FC140101F013F89038
+F807F09038FC0FE09038EFFF809038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<38FF
+C1F0EBC7FCEBC63E380FCC7F13D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114
+D<3803FE30380FFFF0EA3E03EA7800127000F01370A27E00FE1300EAFFE06CB4FC14C06C
+13E06C13F0000713F8C6FCEB07FC130000E0137C143C7E14387E6C137038FF01E038E7FF
+C000C11300161B7E9A1B>I<13E0A41201A31203A21207120F381FFFE0B5FCA2380FE000
+AD1470A73807F0E0000313C03801FF8038007F0014267FA51A>I<39FFE07FF0A3000F13
+07B2140FA2000713173903F067FF3801FFC738007F87201B7D9A25>I<39FFFC03FFA339
+0FF000F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA214
+9EEB3F9C14FC6D5AA26D5AA36D5AA26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE0
+0FE001C02607F007EB0380A201F8EBF00700031600EC0FF801FC5C0001150EEC1FFC2600
+FE1C5B15FE9039FF387E3C017F1438EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2
+EC800701075CA22E1B7F9A31>I<39FFFC1FFEA33907F003803803F8079038FC0F003801
+FE1E00005BEB7F3814F86D5A6D5A130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F
+803901E01FC0D803C013E0EB800F39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF0
+00F0000714E07F0003EB01C0A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB
+3F9C14FC6D5AA26D5AA36D5AA26D5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5B
+EA74F0EA3FE0EA0F8020277F9A23>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fs cmtt10 10.95 89
+/Fs 89 127 df<127012F8B012701200A5127012F8A31270051C779B18>33
+D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<EA0306EA078FA6387FFFC0B5
+12E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E3C00A6EA0C18131C7E9B18>
+I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013C7A338F1C0001279123F
+6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC7001271EA79DEEA3FFEEA1F
+F8EA07E0EA01C0A3120011247D9F18>I<EA3803387C0780A2EAEE0F1400A25B131EA213
+3EEA7C3CA2EA387CEA0078A213F85B12015BA212035BA21207EB8380EB87C0120FEB0EE0
+A2121F121EA2123E383C07C0A23818038013247E9F18>I<EA01C0EA07E0487EEA0E7048
+7EA4EB73F813F313E3380FC1C0EBC38013831303381F0700EA3F87EA7B8EEA71CEEAE1FC
+12E0137CEB7870A2EA70FE387FFFE0EA3FC7380F03C0151C7F9B18>I<1238127CA2127E
+123E120EA3121CA2123812F812F012C0070E789B18>I<137013F0EA01E0EA03C0EA0780
+EA0F00121E121C5AA25AA45AA81270A47EA27E121E7EEA0780EA03C0EA01F0120013700C
+24799F18>I<126012F012787E7E7EEA07801203EA01C0A2EA00E0A41370A813E0A4EA01
+C0A2EA03801207EA0F00121E5A5A5A12600C247C9F18>I<EA01C0A4EA41C138F1C780EA
+FDDF387FFF00EA1FFCEA07F0A2EA1FFCEA7FFF38FDDF80EAF1C73841C100EA01C0A41114
+7D9718>I<136013F0A7387FFFC0B512E0A26C13C03800F000A7136013147E9718>I<121C
+123E127E127F123F121F1207120E121E127C12F81260080C788518>I<387FFFC0B512E0
+A26C13C013047E8F18>I<1230127812FCA2127812300606778518>I<1303EB0780A2130F
+14005B131EA2133E133C137C1378A213F85B12015B12035BA212075B120F90C7FCA25A12
+1E123E123CA2127C127812F85AA2126011247D9F18>I<EA01F0EA07FC487EEA1F1FEA1C
+0738380380007813C0EA7001A238E000E0A9EAF001007013C0A2EA780300381380381C07
+00EA1F1FEA0FFE6C5AEA01F0131C7E9B18>I<EA01801203A21207120F123F12FF12FB12
+431203B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<EA03F0EA0FFEEA3FFF387C0F80387003
+C0EAE00138F000E0A21260C7FCA2EB01C0A21303EB0780EB0F00131E5B5B5B485AEA07C0
+485A381E00E05AEA7FFFB5FC7E131C7E9B18>I<131F5B1377A213E7120113C7EA038712
+071307120E121E123C1238127812F0B512F8A338000700A6EB7FF0A3151C7F9B18>52
+D<383FFF80A30038C7FCA8EA3BF8EA3FFE7F383C0780383003C0EA0001EB00E0A2126012
+F0A238E001C0EA7003387C0F80383FFF00EA1FFCEA03F0131C7E9B18>I<12E0B512E0A2
+14C038E00380EB0700C65A131E131C5BA25B13F05BA2485AA3485AA448C7FCA7131D7E9C
+18>55 D<EA03F8EA0FFE487E383E0F80EA3803387001C0A438380380EA3C07381FFF00EA
+07FC487EEA1F1F383C0780387001C000F013E0EAE000A4387001C0EA7803383E0F80381F
+FF006C5AEA03F8131C7E9B18>I<1230127812FCA2127812301200A81230127812FCA212
+7812300614779318>58 D<1218123C127EA2123C12181200A81218123C127EA2123E121E
+120E121C123C127812F01260071A789318>I<14C0EB03E01307EB1FC0EB3F80EBFE0048
+5AEA07F0485AEA3F8048C7FC12FCA2127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB
+07E01303EB00C013187E9918>I<387FFFC0B512E0A26C13C0C8FCA4387FFFC0B512E0A2
+6C13C0130C7E9318>I<126012F87E127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB
+07E0A2EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FC5A126013187E9918>
+I<EA0FF0EA3FFC48B4FCEA700F38F00380A2EA600738000F00133E5BEA01F05B485AA55B
+C8FCA5EA0380487EA36C5A111C7D9B18>I<137CEA01FEEA07FF380F8780381E03C0EA3C
+1DEA387F3870FFE0EA71E313C112E1EAE380A638E1C1C0127113E33870FF8038387F00EA
+3C1C381E00E0EA0F833807FFC00001138038007E00131C7E9B18>I<137013F8A213D8A2
+EA01DCA3138CEA038EA4EA0707A5380FFF80A3EA0E03381C01C0A3387F07F000FF13F800
+7F13F0151C7F9B18>I<EA7FFCB5FC6C1380381C03C01301EB00E0A4130114C01307381F
+FF80140014C0EA1C03EB00E014F01470A414F014E01303387FFFC0B51280387FFE00141C
+7F9B18>I<EBF8E0EA03FEEA07FFEA0F07EA1E03EA3C01EA38005AA214005AA8127014E0
+A27E123C381E01C0EA0F073807FF803803FE00EA00F8131C7E9B18>I<EA7FF8EAFFFE6C
+7E381C0F80EB03C0A2EB01E01300A214F01470A814F014E0A2130114C01303EB0F80387F
+FF00485AEA7FF8141C7F9B18>I<B512F0A3381C0070A41400A2130EA3EA1FFEA3EA1C0E
+A390C7FCA21438A5B512F8A3151C7F9B18>I<B512F0A3381C0070A41400A2130EA3EA1F
+FEA3EA1C0EA390C7FCA7EAFFC0A3141C7E9B18>I<3801F1C0EA03FDEA0FFFEA1F0FEA1C
+03123813011270A290C7FC5AA5EB0FF0131F130F387001C0A213031238A2EA1C07EA1F0F
+EA0FFFEA03FDEA01F1141C7E9B18>I<387F07F038FF8FF8387F07F0381C01C0A9EA1FFF
+A3EA1C01AA387F07F038FF8FF8387F07F0151C7F9B18>I<EA7FFFB512806C1300EA01C0
+B3A4EA7FFFB512806C1300111C7D9B18>I<387F07F038FF87F8387F07F0381C03C0EB07
+801400130E131E5B13385B13F0121DA2EA1FB8A2131C121EEA1C0EA27FA2EB0380A2EB01
+C0387F03F038FF87F8387F03F0151C7F9B18>75 D<EAFFC0A3001CC7FCB114E0A5B5FCA3
+131C7E9B18>I<38FC01F8EAFE03A2383B06E0A4138EA2EA398CA213DCA3EA38D8A213F8
+1370A21300A638FE03F8A3151C7F9B18>I<387E07F038FF0FF8387F07F0381D81C0A313
+C1121CA213E1A313611371A213311339A31319A2131D130DA3EA7F07EAFF87EA7F03151C
+7F9B18>I<EA0FFE383FFF804813C0EA7803EA700100F013E0EAE000B0EAF001007013C0
+EA7C07EA7FFF6C1380380FFE00131C7E9B18>I<EAFFFEEBFF8014C0EA1C03EB01E01300
+1470A514E01301EB03C0EA1FFF1480EBFE00001CC7FCA8B47EA3141C7F9B18>I<EA0FFE
+383FFF804813C0EA7803EA700100F013E0EAE000AE1370A2EAF079387039C0EA783FEA7F
+FF6C1380380FFE00EA000FEB0780A2EB03C01301A213227E9B18>I<EA7FF8EAFFFE6C7E
+381C0F80130314C01301A313031480130F381FFF005BA2EA1C0F7FEB0380A5149CA3387F
+01F8EAFF81387F00F0161C7F9B18>I<3803F1C0EA1FFF5AEA7C0FEA7003EAE001A390C7
+FC12701278123FEA1FF0EA07FEC67EEB0F80EB03C01301EB00E0A2126012E0130100F013
+C038F80780B5FCEBFE00EAE7F8131C7E9B18>I<387FFFF8B5FCA238E07038A400001300
+B2EA07FFA3151C7F9B18>I<38FF83FEA3381C0070B36C13E0EA0F01380783C03803FF80
+6C1300EA007C171C809B18>I<38FE03F8EAFF07EAFE03383C01E0001C13C0A3EA1E0300
+0E1380A438070700A4EA038EA4EA018C13DCA3EA00D813F8A21370151C7F9B18>I<38FE
+03F8A338700070A36C13E0A513F8EA39FC13DCA2001913C0A3138CA2EA1D8DA31305000D
+1380EA0F07A2EA0E03151C7F9B18>I<387F0FE0139F130F380E0700120FEA070E138EEA
+039C13DCEA01F8A212005B137013F07F487E13DCEA039E138EEA070F7F000E1380130300
+1E13C0387F07F000FF13F8007F13F0151C7F9B18>I<38FE03F8EAFF07EAFE03381C01C0
+EA1E03000E1380EA0F0700071300A2EA038EA2EA01DCA3EA00F8A21370A9EA01FC487E6C
+5A151C7F9B18>I<383FFFE05AA2387001C01303EB07801400C65A131E131C133C5B1370
+13F0485A5B1203485A90C7FC5A001E13E0121C123C5A1270B5FCA3131C7E9B18>I<EAFF
+F8A3EAE000B3ACEAFFF8A30D24779F18>I<126012F0A27E1278127C123CA2123E121E12
+1F7EA27F12077F1203A27F12017F12007F1378A2137C133C133E131EA2131F7F14801307
+A2EB030011247D9F18>I<EAFFF8A3EA0038B3ACEAFFF8A30D247F9F18>I<387FFFC0B512
+E0A26C13C013047E7F18>95 D<1206121E123E12381270A212E0A312F812FC127CA21238
+070E789E18>I<EA0FF0EA1FFC487EEA3C0FEA180738000380A213FF1207121FEA7F0312
+7812E0A3EAF007EA780F383FFFF8EA1FFDEA07F015147E9318>I<127E12FE127E120EA5
+133EEBFF80000F13C0EBC1E01380EB0070120E1438A6000F1370A2EB80E013C1EBFFC000
+0E138038063E00151C809B18>I<EA01FEEA07FF001F1380EA3E073838030048C7FCA25A
+A61270EB01C01238EA3E03381FFF8000071300EA01FC12147D9318>I<EB1F80133F131F
+1303A5EA03E3EA0FFBEA1FFFEA3C1FEA380FEA7007130312E0A6EA7007A2EA380FEA3C1F
+381FFFF0380FFBF83803E3F0151C7E9B18>I<EA01F0EA07FCEA1FFEEA3E0F38380780EA
+7003A238E001C0A2B5FCA300E0C7FC1270EB01C01238EA3E07381FFF8000071300EA01F8
+12147D9318>I<EB1F80EB7FC0EBFFE013E13801C0C01400A3387FFFC0B5FCA23801C000
+AEEA7FFFA3131C7F9B18>I<3801E1F03807FFF85A381E1E30381C0E00487EA5EA1C0EEA
+1E1EEA1FFC5BEA39E00038C7FC7EEA1FFEEBFFC04813E0387801F038700070481338A400
+7813F0EA7E03381FFFC06C13803801FC00151F7F9318>I<127E12FE127E120EA5133EEB
+FF80000F13C013C1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC171C809B18>I<EA
+0380EA07C0A3EA0380C7FCA4EA7FC012FF127F1201AEB5FCA3101D7C9C18>I<1338137C
+A313381300A4EA0FFCA3EA001CB3A4EA6038EAF078EAFFF0EA7FE0EA3F800E277E9C18>
+I<127E12FE127E120EA5EB3FF0A3EB0780EB0F00131E5B5B5BEA0FF87F139C130EEA0E0F
+7FEB038014C0387FC7F812FF127F151C7F9B18>I<EAFFC0A31201B3A4B51280A3111C7D
+9B18>I<38F9C1C038FFF7F013FF383E3E38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E
+1714809318>I<EA7E3E38FEFF80007F13C0EA0FC1EB80E01300120EAB387FC7FC38FFE7
+FE387FC7FC1714809318>I<EA01F0EA0FFE487E383E0F80EA3803387001C0A238E000E0
+A5EAF001007013C0EA7803383C0780EA3E0F381FFF006C5AEA01F013147E9318>I<EA7E
+3E38FEFF80007F13C0380FC1E01380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0
+000E1380EB3E0090C7FCA7EA7FC0487E6C5A151E809318>I<3801F380EA07FBEA1FFFEA
+3E1FEA380FEA7007A2EAE003A6EA7007A2EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7
+EB1FF0EB3FF8EB1FF0151E7E9318>I<38FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005B
+A290C7FCA9EAFFFC7F5B14147E9318>I<EA07F7EA3FFF5AEA780FEAE007A3007CC7FCEA
+7FE0EA1FFCEA03FEEA001F38600780EAE003A212F038F80F00B5FC13FCEAE7F011147D93
+18>I<487E1203A4387FFFC0B5FCA238038000A9144014E0A33801C1C013FF6C1380EB3E
+0013197F9818>I<387E07E0EAFE0FEA7E07EA0E00AC1301EA0F033807FFFC6C13FE3801
+FCFC1714809318>I<387F8FF000FF13F8007F13F0381C01C0380E0380A338070700A313
+8FEA038EA3EA01DCA3EA00F8A2137015147F9318>I<38FF07F8138F1307383800E0A438
+1C01C0137113F9A213D9EA1DDD000D1380A3138DEA0F8FA23807070015147F9318>I<38
+7F8FF0139F138F380F0700EA078EEA039EEA01DC13F81200137013F07FEA01DCEA039E13
+8EEA0707000E1380387F8FF000FF13F8007F13F015147F9318>I<387F8FF000FF13F800
+7F13F0380E01C0EB0380A21207EB0700A2EA0387A2138EEA01CEA213CC120013DC1378A3
+1370A313F05B1279EA7BC0EA7F806CC7FC121E151E7F9318>I<383FFFF05AA2387001E0
+EB03C0EB078038000F00131E5B13F8485AEA03C0485A380F0070121E5A5AB512F0A31414
+7F9318>I<EB07E0131F137FEB780013E0AB1201EA7FC0485AA26C7EEA01E01200AB1378
+EB7FE0131F130713247E9F18>I<126012F0B3B012600424769F18>I<127CB4FC13C01203
+C67EAB7FEB7FC0EB3FE0A2EB7FC0EBF0005BABEA03C012FF90C7FC127C13247E9F18>I<
+EA060CEA1F1EEA3FBEEAFBF8EAF1F0EA60C00F067C9B18>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ft cmr10 10.95 82
+/Ft 82 125 df<90381F83E09038F06E303901C07878380380F8903800F03048EB7000A7
+B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA0701
+A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>I<EB3FE013E0EA01C1EA0381EA07
+00A8B5FCEA0700B2383FE7FC1620809F19>I<90381F81F89038F04F043901C07C063903
+80F80FEB00F05A0270C7FCA6B7FC3907007007B23A3FE3FE3FE02320809F26>I<EA7038
+EAF87CEAFC7EA2EA743AEA0402A3EA0804A2EA1008A2EA2010EA40200F0E7F9F17>34
+D<1340A2EA03F0EA0C4EEA10413820408012600040134038C041C01343A238E04180EB40
+001270127CEA3FC0EA1FF86C7EEA03FEEA007FEB4F801343EB41C0A2EAF040A312801480
+EA404100201300EA3042EA0C4CEA03F0EA0040A312257EA117>36
+D<127012F812FCA212741204A31208A21210A212201240060E7C9F0D>39
+D<13401380EA01005A12061204120C5AA212381230A212701260A412E0AC1260A4127012
+30A212381218A27E120412067E7EEA008013400A2E7BA112>I<7E12407E12307E120812
+0C7EA212077EA213801201A413C0AC1380A412031300A25A1206A25A120812185A12205A
+5A0A2E7EA112>I<127012F012F8A212781208A31210A31220A21240050E7C840D>44
+D<EAFFF0A20C02808A0F>I<127012F8A3127005057C840D>I<144014C0EB0180A3EB0300
+A31306A25BA35BA35BA25BA35BA3485AA348C7FCA21206A35AA35AA25AA35AA35AA2122D
+7EA117>I<EA03F0EA0E1C487EEA1806EA380738700380A400F013C0AD00701380A3EA78
+0700381300EA1806EA1C0E6C5AEA03F0121F7E9D17>I<13801203120F12F31203B3A6EA
+07C0EA7FFE0F1E7C9D17>I<EA03F0EA0C1CEA100E487E00401380128000F013C0EAF803
+A3EA200712001480A2EB0F00130E5B5B5B13605B485A48C7FC000613405A5A00101380EA
+3FFF5AB5FC121E7E9D17>I<EA03F0EA0C1CEA100EEA200F007813801307A2EA380F1200
+1400A2131E131C1370EA07F0EA003C130E130FEB0780A214C0122012F8A300F013801240
+EB0F00EA200EEA183CEA07F0121F7E9D17>I<1306A2130EA2131E132EA2134E138EA2EA
+010E1202A212041208A212101220A2124012C0B512F038000E00A7EBFFE0141E7F9D17>
+I<EA1803EA1FFE5B5B13E00010C7FCA6EA11F0EA161CEA180EEA10071480EA0003A214C0
+A3127012F0A200E013801240EB0700EA20066C5AEA0838EA07E0121F7E9D17>I<137CEA
+0182EA0701380E0380EA0C0712183838030090C7FC12781270A2EAF1F0EAF21CEAF406EA
+F807EB0380A200F013C0A51270A214801238EB07001218EA0C0E6C5AEA01F0121F7E9D17
+>I<1240387FFFE014C0A23840008038800100A21302485AA25B5BA25BA21360A213E05B
+1201A41203A76C5A131F7E9D17>I<EA03F0EA0C0CEA1006EA3003382001801260A31270
+38780300123EEA3F06EA1FC8EA0FF0EA03F8487EEA0C7EEA103F38300F80EA6007EB01C0
+12C01300A31480EA600100201300EA1002EA0C0CEA03F0121F7E9D17>I<EA03F0EA0E18
+487E487E13071270EB038012F0A214C0A5EA7007A21238EA180BEA0E13EA03E338000380
+A3EB07001230EA7806130EEA700CEA2018EA1070EA0FC0121F7E9D17>I<127012F8A312
+701200AA127012F8A3127005147C930D>I<127012F8A312701200AA127012F012F8A212
+781208A31210A31220A21240051D7C930D>I<5B497EA3497EA3EB09E0A3EB10F0A3EB20
+78A3497EA2EBC03EEB801EA248B5FCEB000FA20002EB0780A348EB03C0A2120C001E14E0
+39FF801FFE1F207F9F22>65 D<B512E0380F0078141EA2801580A515005C141E147CEBFF
+F0EB007C141FEC0F80EC07C0140315E0A515C014071580EC0F00143EB512F01B1F7E9E20
+>I<90380FE0109038381C309038E002703803C00139078000F048C71270121E15305A15
+10127C127800F81400A91278007C1410123CA26C1420A27E6C6C13406C6C13803900E003
+00EB380CEB0FF01C217E9F21>I<B512F83807801EEC0780EC03C0EC01E0EC00F0157015
+78A2153CA3153EA8153CA2157C1578A215F0EC01E0EC03C0EC0780EC1E00B512F81F1F7F
+9E23>I<B61280380F000F14031401140015C01540A314401500A214C0130113FF130113
+001440A3EC0020A31540A315C01401EC0380140FB6FC1B1F7E9E1F>I<B6128038078007
+1401A2140015C01540A4EC2000A3146014E013FF138014601420A391C7FCA87FEAFFFE1A
+1F7F9E1E>I<90380FE02090387818609038E004E03803800238070001481300001E1460
+A25A1520127C127800F81400A7EC7FFCEC03E000781301127C123CA27EA27E7E38038002
+3900E00460903878182090380FE0001E217D9F24>I<39FFF07FF8390F000780AD90B5FC
+EB0007AF39FFF07FF81D1F7E9E22>I<EAFFF0EA0F00B3ABEAFFF00C1F7E9E10>I<3807FF
+C038003E00131EB3A3122012F8A3EAF01CEA403CEA6038EA1070EA0FC012207F9E17>I<
+39FFF007FC390F0003E0EC0180150014025C5C5C5C5C5C49C7FC5B497E130FEB13C0EB21
+E01341EB80F0EB0078A28080A280EC0780A2EC03C015E015F039FFF01FFE1F1F7E9E23>
+I<EAFFF8EA0F8090C7FCB21402A414061404A2140C141C147CB512FC171F7E9E1C>I<B4
+6CEB07FE000715C0A2D805C0130BA2D804E01313A301701323A26D1343A36D1383A29038
+0E0103A3EB0702A3EB0384A2EB01C8A3EB00F0A21460121FD8FFE0EB7FFE271F7F9E2A>
+I<B4EB0FF8390F8003E0EC0080EA0BC0EA09E0A2EA08F01378A27F7FA27FEB0780A2EB03
+C0EB01E0A2EB00F01478A2143C141EA2140F1407A214031401123E38FF80001D1F7E9E22
+>I<EB1FE0EB70383801C00E48487E39070003804814C0001EEB01E048EB00F0A2007C14
+F8A20078147800F8147CA900781478007C14F8A2003C14F0003E1301001E14E06CEB03C0
+6C148039038007003801E01E38007038EB1FE01E217E9F23>I<B512E0380F007C141E80
+EC0780A215C0A41580A2EC0F00141E147CEBFFE090C8FCAEEAFFF01A1F7E9E1F>I<EB1F
+E0EB70383801C00E48487E39070003804814C0001EEB01E0003E14F0003C1300007C14F8
+A20078147800F8147CA900781478007C14F8A2003C14F0383E0781391E0841E0390F1023
+C00007148039039017003801D01E3900783804EB1FF8EB001CEC0C0CEC0E1CEC0FF8A214
+0715F0EC01E01E297E9F23>I<B512E0380F80780007131E80EC0780A215C0A41580A2EC
+0F00141E1478EBFFE0EB80601438143C141C141EA3141FA315011581140F390FC0078239
+FFFC03C4C812F820207F9E22>I<3803F040380C0CC0EA1803EA3001EA6000A212E01440
+A36C13007E127CEA7F80EA3FF86CB4FC00071380C613C0EB1FE013031301EB00F014707E
+A46C136014E06C13C038F8018038C60300EA81FC14217E9F19>I<007FB512E038780F01
+0060EB006000401420A200C0143000801410A400001400B3497E3803FFFC1C1F7E9E21>
+I<39FFF00FF8390F0003E0EC0080B3A46CEB01001380120314026C6C5A6C6C5AEB3830EB
+0FC01D207E9E22>I<39FFF003FE391F8000F86CC7126015206C6C1340A36C6C1380A2EB
+E00100011400A23800F002A213F8EB7804A26D5AA36D5AA2131F6D5AA2EB07C0A36D5AA3
+6DC7FC1F207F9E22>I<3BFFF07FF81FF03B1F000FC007C06C903907800180170015C001
+805C00071502EC09E013C000035DEC19F01410D801E05CA2EC2078D800F05CA2EC403C01
+785CA2EC801E017C1460013C144090383D000F133F6D5CA2011E1307010E91C7FCA2010C
+7F010413022C207F9E2F>I<397FF81FF8390FE007C03907C0030000031302EBE0063801
+F00400005BEBF818EB78106D5AEB3E60EB1E406D5AA213076D7E497E1305EB08F0EB18F8
+EB1078EB207CEB603EEB401EEB801F3901000F801407000214C000061303001FEB07E039
+FFC01FFE1F1F7F9E22>I<39FFF001FF391F800078000F146012076D1340000314807F39
+01F001001200EBF802EB7C06EB3C04EB3E08131EEB1F10EB0FB0EB07A014E06D5AACEB3F
+FC201F7F9E22>I<387FFFFE387E003C127800701378006013F814F0384001E0130314C0
+EB07801200EB0F00131EA25B137C13785B1201EBE002EA03C0A2EA0780000F1306130000
+1E1304003E130C123C48133C14FCB5FC171F7E9E1C>I<12FFA212C0B3B3A512FFA2082D
+7CA10D>I<EA0804EA1008EA2010A2EA4020A2EA8040A3EAB85CEAFC7EA2EA7C3EEA381C
+0F0E7A9F17>I<12FFA21203B3B3A512FFA2082D80A10D>I<120812101220A21240A21280
+A312B812FCA2127C1238060E7D9F0D>96 D<EA1FE0EA3030EA7818131CEA300E1200A313
+FEEA0F8EEA1E0E1238127800F01310A3131E127838386720380F83C014147E9317>I<12
+1C12FC121CAA137CEA1D87381E0180EB00C0001C13E01470A21478A6147014F014E0001E
+13C0381A018038198700EA107C15207E9F19>I<EA01FCEA0706EA1C0F123813060078C7
+FC127012F0A61270127800381380A2381C0100EA0706EA01F811147F9314>I<EB01C013
+0F1301AAEA01F1EA070DEA0C03EA180112381278127012F0A61270A21238EA1803120CEA
+070D3801F1F815207F9F19>I<EA03F0EA0E1C487E487EA238700380A212F0B5FC00F0C7
+FCA41270A26C1380A2381C0100EA0706EA01F811147F9314>I<137CEA01C6EA030F1207
+EA0E061300A7EAFFF0EA0E00B2EA7FE01020809F0E>I<14E03803E330EA0E3CEA1C1C38
+380E00EA780FA5EA380E6C5AEA1E38EA33E00020C7FCA21230A2EA3FFE381FFF8014C038
+3001E038600070481330A4006013606C13C0381C03803803FC00141F7F9417>I<121C12
+FC121CAA137C1386EA1D03001E1380A2121CAE38FF8FF014207E9F19>I<1238127CA312
+38C7FCA6121C12FC121CB1EAFF80091F7F9E0C>I<13E0EA01F0A3EA00E01300A61370EA
+07F012001370B3A31260EAF06013C0EA6180EA3F000C28829E0E>I<121C12FC121CAAEB
+1FE0EB0780EB060013045B5B5B136013E0EA1DF0EA1E70EA1C38133C131C7F130F7F1480
+14C038FF9FF014207E9F18>I<121C12FC121CB3ABEAFF8009207F9F0C>I<391C3E03E039
+FCC30C30391D019018001EEBE01CA2001C13C0AE3AFF8FF8FF8021147E9326>I<EA1C7C
+EAFC86EA1D03001E1380A2121CAE38FF8FF014147E9319>I<EA01F8EA070E381C038038
+3801C0A2387000E0A200F013F0A6007013E0A2383801C0A2381C038038070E00EA01F814
+147F9317>I<EA1C7CEAFD87381E018014C0381C00E014F014701478A6147014F014E038
+1E01C0EB0380381D8700EA1C7C90C7FCA8B47E151D7E9319>I<3801F04038070CC0EA0E
+02EA1C03EA38011278127012F0A6127012781238EA1C03EA0C05EA0709EA01F1EA0001A8
+EB0FF8151D7F9318>I<EA1CF0EAFD18EA1E3CA21318EA1C00AEEAFFC00E147E9312>I<EA
+0FC8EA3038EA6018EAC008A3EAE000127CEA3FE0EA1FF0EA07F8EA003CEA800E130612C0
+A21304EAE00CEAD818EA87E00F147F9312>I<1202A31206A2120EA2123EEAFFF8EA0E00
+AB1304A5EA07081203EA01F00E1C7F9B12>I<381C0380EAFC1FEA1C03AE1307120CEA06
+1B3803E3F014147E9319>I<38FF83F8383E00E0001C13C06C1380A338070100A21383EA
+0382A2EA01C4A213E4EA00E8A21370A3132015147F9318>I<39FF9FE1FC393C07807039
+1C030060EC8020000E1440A214C0D80704138014E0A239038861001471A23801D032143A
+143E3800E01CA2EB6018EB40081E147F9321>I<38FF87F8381E03C0380E0180EB0300EA
+0702EA0384EA01C813D8EA00F01370137813F8139CEA010E1202EA060738040380000C13
+C0003C13E038FE07FC16147F9318>I<38FF83F8383E00E0001C13C06C1380A338070100
+A21383EA0382A2EA01C4A213E4EA00E8A21370A31320A25BA3EAF080A200F1C7FC126212
+3C151D7F9318>I<EA7FFFEA700E1260EA401C133813781370EA00E0120113C0EA038012
+071301120E121EEA1C03EA3802EA7006130EEAFFFE10147F9314>I<B812F82D01808C2E>
+124 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fu cmbx12 20.736 14
+/Fu 14 122 df<DB1FFC14C00203B5EAC001021FECF003027FECFC07903B01FFFC00FE0F
+010701C0EB1F9F4948C7EA07FFD93FF880494814004948157F485B4A153F4890C9121F48
+5A000F170F5B001F1707A2485A1803A2127FA24993C8FCA212FFAA041FB61280127FA27F
+DC0001EBC000123FA36C7EA26C7EA26C7E7E6C7F806C7F6D6C5CEB3FFCD90FFF5C6D01C0
+EB1FBF010101FCEBFF1F6D6CB5EAFE0F021FECF8030203ECE0009126001FFEC9FC413D7B
+BB4C>71 D<B612FEA426007FF0C9FCB3ADEF03C0A517071880A3170FA3171FA2173F177F
+17FF5E04071300163FB9FCA4323B7DBA3A>76 D<B500F00207B512E0808080D8007F9239
+0007E0006E6F5A81017B7F81137901787F6E7E6E7E81141F6E7E6E7F6E7F82806E7F6F7E
+6F7E826F7E816F13806F13C017E06F13F081EE7FF8EE3FFC17FEEE1FFF827013837013C3
+18E37013F382EF7FFBEF3FFFA283838383A28383187F183FA201FC161FB500FC150F1807
+1803A2433B7CBA4C>78 D<B712F8EEFFC017F817FE3B007FF0001FFF040313C004007F71
+7E717EA284171FA284A660A2173F604D5A604C485A4C5BDC1FFEC8FC91B612F817C0A291
+39F0007FF0EE1FF8707E707E707E8482A284A584A5F101E0A27013F0A2F103C0EF7FF8B6
+00F890393FFC078094381FFE0F0507B51200050113FCCBEA1FF0433C7CBA48>82
+D<B600F80107B512E0A426007FF0C83807E000725AB3B3A3013F4C5AA280011F4CC7FCA2
+6D6C151E0107163E6E5D6D6C5D6D6D13019026007FE0EB0FE0DA3FFCEB7FC0020FB65A02
+034AC8FCDA007F13F003071380433C7DBA4A>85 D<EB3FFE48B512E0000714F8390FE007
+FC9038F001FE486C6C7E6F7E82153F6C48806C5A6C5AC8FCA491B5FC131F90387FF83F38
+03FF803807FC00EA0FF0485A123F485AA2485AA4157F6C7E15DF3A3FE0039FF03B1FF80F
+0FFFE03807FFFE0001497E39003FE0002B267DA52F>97 D<13FE12FFA412071203B04AB4
+FC021F13F0027F13FC9138FC03FE9039FFF000FF02C0EB3F8091C7EA1FC04915E0EE0FF0
+17F8A2EE07FCA317FEA917FCA3160F17F817F0161F6D15E06EEB3FC06EEB7F80D9F9E0EB
+FF009039F0FC07FE91387FFFF8D9E01F13E09026C003FEC7FC2F3C7DBB36>I<EE3F80ED
+3FFFA4150181B0ECFF80010F13F0013F13FC9038FFC03F3901FE000F4848130348487F48
+487F121F485AA2127F5BA312FFA9127FA36C7EA2121F6C6C5B6C6C5B00035CD801FE011F
+13C02700FF807E13FE90387FFFF8010F13E0010113002F3C7DBB36>100
+D<49B47E010F13F0017F13FC9038FF81FE3A03FE007F80D807F8133F4848EB1FC0ED0FE0
+485A003F15F01507485A16F8A212FFA290B6FCA301C0C8FCA4127FA36C7E1678121F7F00
+0F15F06C6C13016C6CEB03E06C6CEB0FC03A00FFC07F8090393FFFFE00010F13F8010013
+C025267DA52C>I<EA01E0EA07F8487EA2487EA46C5AA26C5AEA01E0C8FCAB13FE127FA4
+12071203B3AAB512F0A4143D7DBC1A>105 D<13FE12FFA412071203B3B3AEB512F8A415
+3C7DBB1A>108 D<D801FCEBFF8000FF010313F0020F7F91381E03FC91383801FE000701
+607F0003497E01FD15805C01FFC7FCA35BB3A4B5D8F83F13FEA42F267CA536>110
+D<3901FC03F000FFEB0FFC4AB4FC91383C3F80EC707F00079038E0FFC000035BEBFD80A2
+01FFEB7F809138003F00151E92C7FC5BB3A3B512FCA422267DA528>114
+D<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E806C5DA26E137C017F14786E13F801
+3F5CECF001011F5CECF803010F5CA2ECFC0701075CECFE0F010391C7FC6E5A6D131E15BE
+6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5AA2140F92C8FC5C141E0008133E007F133C
+147C38FF807814F8EB81F0EB83E06C485A387C1F80D83FFFC9FCEA1FFCEA07F02E377EA5
+33>121 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 75 659 a Fu(GNU)33 b(Readline)h(Library)p 75
+709 1800 17 v 936 757 a Ft(Edition)17 b(5.0,)c(for)i
+Fs(Readline)f(Library)g Ft(V)l(ersion)i(5.0.)1559 811
+y(Septem)o(b)q(er)g(2003)75 2467 y Fr(Chet)22 b(Ramey)-6
+b(,)23 b(Case)e(W)-6 b(estern)23 b(Reserv)n(e)f(Univ)n(ersit)n(y)75
+2534 y(Brian)h(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6
+b(oundation)p 75 2570 1800 9 v eop
+%%Page: 2 2
+2 1 bop 75 1512 a Ft(This)11 b(man)o(ual)g(describ)q(es)h(the)f(GNU)g
+(Readline)h(Library)f(\(v)o(ersion)f(5.0,)h(19)f(Septem)o(b)q(er)h
+(2003\),)f(a)g(library)75 1567 y(whic)o(h)20 b(aids)h(in)f(the)g
+(consistency)g(of)f(user)h(in)o(terface)g(across)f(discrete)h(programs)
+f(whic)o(h)h(pro)o(vide)g(a)75 1621 y(command)15 b(line)i(in)o
+(terface.)75 1689 y(Cop)o(yrigh)o(t)301 1688 y(c)289
+1689 y Fq(\015)d Ft(1988-2003)f(F)l(ree)i(Soft)o(w)o(are)f(F)l
+(oundation,)h(Inc.)75 1756 y(P)o(ermission)i(is)f(gran)o(ted)g(to)f
+(mak)o(e)h(and)g(distribute)i(v)o(erbatim)d(copies)i(of)f(this)h(man)o
+(ual)f(pro)o(vided)h(the)75 1811 y(cop)o(yrigh)o(t)e(notice)h(and)f
+(this)h(p)q(ermission)g(notice)g(are)f(preserv)o(ed)h(on)f(all)h
+(copies.)195 1878 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)l(,)
+h(distribute)h(and/or)e(mo)q(dify)h(this)g(do)q(cumen)o(t)g(under)195
+1933 y(the)h(terms)f(of)h(the)g(GNU)g(F)l(ree)g(Do)q(cumen)o(tation)g
+(License,)i(V)l(ersion)f(1.1)e(or)g(an)o(y)h(later)195
+1988 y(v)o(ersion)14 b(published)i(b)o(y)e(the)g(F)l(ree)f(Soft)o(w)o
+(are)g(F)l(oundation;)h(with)g(no)f(In)o(v)m(arian)o(t)i(Sections,)195
+2042 y(with)h(the)f(F)l(ron)o(t-Co)o(v)o(er)e(texts)i(b)q(eing)i(\\A)e
+(GNU)g(Man)o(ual,")g(and)g(with)h(the)f(Bac)o(k-Co)o(v)o(er)195
+2097 y(T)l(exts)h(as)g(in)h(\(a\))e(b)q(elo)o(w.)24 b(A)16
+b(cop)o(y)g(of)g(the)g(license)i(is)f(included)i(in)e(the)f(section)h
+(en)o(titled)195 2152 y(\\GNU)e(F)l(ree)g(Do)q(cumen)o(tation)g
+(License.")195 2219 y(\(a\))j(The)h(FSF's)f(Bac)o(k-Co)o(v)o(er)g(T)l
+(ext)h(is:)28 b(\\Y)l(ou)19 b(ha)o(v)o(e)g(freedom)g(to)f(cop)o(y)h
+(and)g(mo)q(dify)195 2274 y(this)e(GNU)f(Man)o(ual,)g(lik)o(e)h(GNU)f
+(soft)o(w)o(are.)22 b(Copies)17 b(published)h(b)o(y)f(the)f(F)l(ree)g
+(Soft)o(w)o(are)195 2329 y(F)l(oundation)g(raise)f(funds)h(for)e(GNU)h
+(dev)o(elopmen)o(t.")75 2451 y(Published)i(b)o(y)f(the)f(F)l(ree)g
+(Soft)o(w)o(are)f(F)l(oundation)75 2506 y(59)h(T)l(emple)h(Place,)f
+(Suite)i(330,)75 2560 y(Boston,)d(MA)h(02111-1307)75
+2615 y(USA)p eop
+%%Page: -1 3
+-1 2 bop 1862 -58 a Ft(i)75 149 y Fp(T)-7 b(able)27 b(of)f(Con)n(ten)n
+(ts)75 320 y Fr(1)67 b(Command)22 b(Line)i(Editing)d
+Fo(.)10 b(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)g(.)42 b Fr(1)224 389 y Ft(1.1)j(In)o(tro)q(duction)16
+b(to)f(Line)h(Editing)e Fn(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)27 b Ft(1)224 444 y(1.2)45 b(Readline)16 b(In)o(teraction)8
+b Fn(.)g(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)23 b Ft(1)374 499 y(1.2.1)44 b(Readline)16
+b(Bare)f(Essen)o(tials)f Fn(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Ft(1)374 553 y(1.2.2)44 b(Readline)16 b(Mo)o(v)o(emen)o(t)e(Commands)
+7 b Fn(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)21 b Ft(2)374 608 y(1.2.3)44 b(Readline)16 b(Killing)i(Commands)
+11 b Fn(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)25 b Ft(2)374 663 y(1.2.4)44 b(Readline)16
+b(Argumen)o(ts)c Fn(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27
+b Ft(3)374 718 y(1.2.5)44 b(Searc)o(hing)16 b(for)e(Commands)h(in)h
+(the)f(History)e Fn(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Ft(3)224 773 y(1.3)45 b(Readline)16 b(Init)h(File)e
+Fn(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)29 b Ft(4)374 827 y(1.3.1)44 b(Readline)16
+b(Init)g(File)h(Syn)o(tax)7 b Fn(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Ft(4)374 882 y(1.3.2)44 b(Conditional)16 b(Init)g(Constructs)5
+b Fn(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)19 b Ft(9)374 937 y(1.3.3)44 b(Sample)16
+b(Init)g(File)11 b Fn(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)26 b Ft(10)224 992 y(1.4)45 b(Bindable)17 b(Readline)g(Commands)6
+b Fn(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Ft(13)374
+1046 y(1.4.1)44 b(Commands)14 b(F)l(or)h(Mo)o(ving)e
+Fn(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Ft(13)374 1101 y(1.4.2)44
+b(Commands)14 b(F)l(or)h(Manipulating)i(The)e(History)9
+b Fn(.)e(.)h(.)f(.)h(.)f(.)h(.)24 b Ft(13)374 1156 y(1.4.3)44
+b(Commands)14 b(F)l(or)h(Changing)h(T)l(ext)e Fn(.)8
+b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30
+b Ft(14)374 1211 y(1.4.4)44 b(Killing)18 b(And)e(Y)l(anking)9
+b Fn(.)e(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24 b Ft(16)374
+1266 y(1.4.5)44 b(Sp)q(ecifying)17 b(Numeric)f(Argumen)o(ts)c
+Fn(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)27
+b Ft(17)374 1320 y(1.4.6)44 b(Letting)15 b(Readline)i(T)o(yp)q(e)e(F)l
+(or)g(Y)l(ou)10 b Fn(.)d(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)25 b Ft(17)374 1375 y(1.4.7)44 b(Keyb)q(oard)15
+b(Macros)6 b Fn(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21
+b Ft(17)374 1430 y(1.4.8)44 b(Some)15 b(Miscellaneous)i(Commands)7
+b Fn(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+22 b Ft(18)224 1485 y(1.5)45 b(Readline)16 b(vi)g(Mo)q(de)e
+Fn(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)28 b Ft(19)75 1606 y Fr(2)67 b(Programming)23
+b(with)g(GNU)f(Readline)12 b Fo(.)f(.)g(.)f(.)g(.)g(.)g(.)h(.)f(.)35
+b Fr(21)224 1675 y Ft(2.1)45 b(Basic)16 b(Beha)o(vior)8
+b Fn(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Ft(21)224 1729 y(2.2)45
+b(Custom)14 b(F)l(unctions)7 b Fn(.)i(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)22 b Ft(22)374
+1784 y(2.2.1)44 b(Readline)16 b(T)o(yp)q(edefs)9 b Fn(.)g(.)e(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)24 b Ft(22)374 1839 y(2.2.2)44
+b(W)l(riting)16 b(a)e(New)i(F)l(unction)6 b Fn(.)i(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+21 b Ft(23)224 1894 y(2.3)45 b(Readline)16 b(V)l(ariables)g
+Fn(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g
+(.)f(.)h(.)29 b Ft(24)224 1949 y(2.4)45 b(Readline)16
+b(Con)o(v)o(enience)h(F)l(unctions)7 b Fn(.)i(.)e(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+23 b Ft(28)374 2003 y(2.4.1)44 b(Naming)15 b(a)g(F)l(unction)e
+Fn(.)7 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 b Ft(28)374
+2058 y(2.4.2)44 b(Selecting)17 b(a)e(Keymap)6 b Fn(.)h(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)21 b Ft(28)374 2113 y(2.4.3)44 b(Binding)17
+b(Keys)5 b Fn(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)20 b Ft(29)374 2168 y(2.4.4)44 b(Asso)q(ciating)16
+b(F)l(unction)g(Names)f(and)g(Bindings)8 b Fn(.)h(.)f(.)f(.)h(.)f(.)h
+(.)23 b Ft(31)374 2222 y(2.4.5)44 b(Allo)o(wing)16 b(Undoing)f
+Fn(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b
+Ft(31)374 2277 y(2.4.6)44 b(Redispla)o(y)10 b Fn(.)e(.)g(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26
+b Ft(32)374 2332 y(2.4.7)44 b(Mo)q(difying)16 b(T)l(ext)7
+b Fn(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22
+b Ft(34)374 2387 y(2.4.8)44 b(Character)14 b(Input)c
+Fn(.)f(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)25
+b Ft(34)374 2442 y(2.4.9)44 b(T)l(erminal)16 b(Managemen)o(t)11
+b Fn(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Ft(35)374 2496 y(2.4.10)43
+b(Utilit)o(y)17 b(F)l(unctions)c Fn(.)7 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)28 b Ft(35)374 2551 y(2.4.11)43 b(Miscellaneous)18
+b(F)l(unctions)6 b Fn(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Ft(36)374
+2606 y(2.4.12)43 b(Alternate)16 b(In)o(terface)f Fn(.)7
+b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30 b Ft(37)374 2661
+y(2.4.13)43 b(A)16 b(Readline)g(Example)9 b Fn(.)f(.)f(.)h(.)f(.)h(.)g
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)24 b Ft(38)p eop
+%%Page: -2 4
+-2 3 bop 75 -58 a Ft(ii)1321 b(GNU)15 b(Readline)h(Library)224
+42 y(2.5)45 b(Readline)16 b(Signal)h(Handling)12 b Fn(.)c(.)g(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Ft(39)224 96
+y(2.6)45 b(Custom)14 b(Completers)f Fn(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)28 b Ft(41)374
+151 y(2.6.1)44 b(Ho)o(w)14 b(Completing)i(W)l(orks)10
+b Fn(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Ft(41)374 206 y(2.6.2)44
+b(Completion)16 b(F)l(unctions)6 b Fn(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+21 b Ft(42)374 261 y(2.6.3)44 b(Completion)16 b(V)l(ariables)c
+Fn(.)c(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 b Ft(43)374 315
+y(2.6.4)44 b(A)15 b(Short)g(Completion)h(Example)5 b
+Fn(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)20 b Ft(46)75 437 y Fr(App)r(endix)k(A)50 b(Cop)n(ying)23
+b(This)g(Man)n(ual)15 b Fo(.)c(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)37
+b Fr(55)224 505 y Ft(A.1)45 b(GNU)15 b(F)l(ree)h(Do)q(cumen)o(tation)f
+(License)g Fn(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)28 b Ft(55)374 560 y(A.1.1)44
+b(ADDENDUM:)14 b(Ho)o(w)g(to)h(use)h(this)f(License)i(for)e(y)o(our)465
+615 y(do)q(cumen)o(ts)f Fn(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)29 b Ft(61)75
+736 y Fr(Concept)22 b(Index)10 b Fo(.)i(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)h(.)f(.)33 b Fr(63)75 871 y(F)-6 b(unction)25
+b(and)d(V)-6 b(ariable)24 b(Index)9 b Fo(.)i(.)f(.)g(.)h(.)f(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)32 b Fr(65)p
+eop
+%%Page: 1 5
+1 4 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(1)75 149 y Fp(1)41 b(Command)28 b(Line)e(Editing)137
+255 y Ft(This)16 b(c)o(hapter)f(describ)q(es)i(the)e(basic)h(features)f
+(of)g(the)g Fm(gnu)g Ft(command)g(line)i(editing)f(in)o(terface.)75
+378 y Fr(1.1)33 b(In)n(tro)r(duction)24 b(to)e(Line)i(Editing)137
+497 y Ft(The)16 b(follo)o(wing)g(paragraphs)e(describ)q(e)j(the)e
+(notation)g(used)h(to)e(represen)o(t)i(k)o(eystrok)o(es.)137
+562 y(The)h(text)f Fl(C-k)h Ft(is)g(read)g(as)f(`Con)o(trol-K')g(and)h
+(describ)q(es)h(the)f(c)o(haracter)f(pro)q(duced)h(when)h(the)1831
+560 y Fk(h)p 1844 534 19 2 v 1844 562 a Fj(k)p 1844 570
+V 1860 560 a Fk(i)75 617 y Ft(k)o(ey)d(is)h(pressed)g(while)g(the)f
+(Con)o(trol)g(k)o(ey)g(is)h(depressed.)137 682 y(The)g(text)g
+Fl(M-k)f Ft(is)i(read)f(as)f(`Meta-K')g(and)h(describ)q(es)i(the)e(c)o
+(haracter)f(pro)q(duced)i(when)g(the)f(Meta)75 737 y(k)o(ey)e(\(if)g(y)
+o(ou)g(ha)o(v)o(e)g(one\))g(is)h(depressed,)g(and)f(the)930
+735 y Fk(h)p 942 709 V 942 737 a Fj(k)p 942 745 V 958
+735 a Fk(i)987 737 y Ft(k)o(ey)g(is)h(pressed.)20 b(The)15
+b(Meta)e(k)o(ey)h(is)h(lab)q(eled)1779 735 y Fk(h)p 1791
+709 72 2 v 1791 737 a Fj(AL)m(T)p 1791 745 V 1860 735
+a Fk(i)75 792 y Ft(on)e(man)o(y)g(k)o(eyb)q(oards.)19
+b(On)13 b(k)o(eyb)q(oards)g(with)h(t)o(w)o(o)e(k)o(eys)g(lab)q(eled)
+1213 790 y Fk(h)p 1225 764 V 1225 792 a Fj(AL)m(T)p 1225
+800 V 1294 790 a Fk(i)1322 792 y Ft(\(usually)i(to)e(either)i(side)g
+(of)f(the)75 847 y(space)j(bar\),)f(the)388 845 y Fk(h)p
+400 819 V 400 847 a Fj(AL)m(T)p 400 854 V 469 845 a Fk(i)499
+847 y Ft(on)h(the)g(left)g(side)g(is)g(generally)h(set)f(to)f(w)o(ork)g
+(as)g(a)g(Meta)g(k)o(ey)l(.)22 b(The)1697 845 y Fk(h)p
+1709 819 V 1709 847 a Fj(AL)m(T)p 1709 854 V 1778 845
+a Fk(i)1808 847 y Ft(k)o(ey)75 901 y(on)17 b(the)f(righ)o(t)h(ma)o(y)f
+(also)h(b)q(e)g(con\014gured)g(to)f(w)o(ork)g(as)g(a)h(Meta)f(k)o(ey)g
+(or)g(ma)o(y)g(b)q(e)i(con\014gured)f(as)f(some)75 956
+y(other)f(mo)q(di\014er,)h(suc)o(h)f(as)g(a)g(Comp)q(ose)g(k)o(ey)g
+(for)f(t)o(yping)i(accen)o(ted)f(c)o(haracters.)137 1021
+y(If)c(y)o(ou)g(do)g(not)f(ha)o(v)o(e)h(a)f(Meta)h(or)694
+1019 y Fk(h)p 706 993 V 706 1021 a Fj(AL)m(T)p 706 1029
+V 775 1019 a Fk(i)801 1021 y Ft(k)o(ey)l(,)g(or)g(another)f(k)o(ey)h(w)
+o(orking)f(as)h(a)f(Meta)h(k)o(ey)l(,)g(the)g(iden)o(tical)75
+1076 y(k)o(eystrok)o(e)f(can)i(b)q(e)g(generated)f(b)o(y)g(t)o(yping)
+809 1074 y Fk(h)p 822 1048 70 2 v 822 1076 a Fj(ESC)p
+822 1084 V 888 1074 a Fk(i)915 1076 y Fn(\014rst)p Ft(,)g(and)g(then)h
+(t)o(yping)1339 1074 y Fk(h)p 1351 1048 19 2 v 1351 1076
+a Fj(k)p 1351 1084 V 1368 1074 a Fk(i)1383 1076 y Ft(.)18
+b(Either)12 b(pro)q(cess)f(is)h(kno)o(wn)75 1131 y(as)j
+Fi(metafying)k Ft(the)425 1129 y Fk(h)p 437 1103 V 437
+1131 a Fj(k)p 437 1139 V 454 1129 a Fk(i)484 1131 y Ft(k)o(ey)l(.)137
+1196 y(The)i(text)e Fl(M-C-k)h Ft(is)h(read)f(as)f(`Meta-Con)o(trol-k')
+g(and)h(describ)q(es)i(the)e(c)o(haracter)g(pro)q(duced)h(b)o(y)75
+1251 y Fi(metafying)e Fl(C-k)p Ft(.)137 1316 y(In)g(addition,)h(sev)o
+(eral)f(k)o(eys)f(ha)o(v)o(e)g(their)h(o)o(wn)f(names.)30
+b(Sp)q(eci\014cally)l(,)1384 1314 y Fk(h)p 1396 1288
+73 2 v 1396 1316 a Fj(DEL)p 1396 1323 V 1467 1314 a Fk(i)1482
+1316 y Ft(,)1514 1314 y Fk(h)p 1526 1288 70 2 v 1526
+1316 a Fj(ESC)p 1526 1323 V 1593 1314 a Fk(i)1608 1316
+y Ft(,)1640 1314 y Fk(h)p 1652 1288 72 2 v 1652 1316
+a Fj(LFD)p 1652 1323 V 1722 1314 a Fk(i)1737 1316 y Ft(,)1768
+1314 y Fk(h)p 1780 1288 70 2 v 1780 1316 a Fj(SPC)p 1780
+1323 V 1847 1314 a Fk(i)1862 1316 y Ft(,)75 1369 y Fk(h)p
+87 1343 76 2 v 87 1371 a Fj(RET)p 87 1378 V 160 1369
+a Fk(i)175 1371 y Ft(,)23 b(and)306 1369 y Fk(h)p 318
+1343 74 2 v 318 1371 a Fj(T)m(AB)p 318 1378 V 390 1369
+a Fk(i)427 1371 y Ft(all)f(stand)g(for)f(themselv)o(es)h(when)h(seen)f
+(in)g(this)g(text,)h(or)e(in)i(an)e(init)i(\014le)g(\(see)75
+1425 y(Section)d(1.3)f([Readline)h(Init)g(File],)h(page)e(4\).)32
+b(If)19 b(y)o(our)g(k)o(eyb)q(oard)h(lac)o(ks)f(a)1444
+1423 y Fk(h)p 1456 1397 72 2 v 1456 1425 a Fj(LFD)p 1456
+1433 V 1526 1423 a Fk(i)1560 1425 y Ft(k)o(ey)l(,)h(t)o(yping)1802
+1423 y Fk(h)p 1814 1397 49 2 v 1814 1425 a Fj(C-j)p 1814
+1433 V 1860 1423 a Fk(i)75 1480 y Ft(will)c(pro)q(duce)g(the)f(desired)
+h(c)o(haracter.)j(The)874 1478 y Fk(h)p 886 1452 76 2
+v 886 1480 a Fj(RET)p 886 1488 V 959 1478 a Fk(i)989
+1480 y Ft(k)o(ey)c(ma)o(y)f(b)q(e)h(lab)q(eled)1385 1478
+y Fk(h)p 1397 1452 109 2 v 1397 1480 a Fj(Return)p 1397
+1488 V 1503 1478 a Fk(i)1533 1480 y Ft(or)1588 1478 y
+Fk(h)p 1600 1452 86 2 v 1600 1480 a Fj(En)o(ter)p 1600
+1488 V 1684 1478 a Fk(i)1714 1480 y Ft(on)f(some)75 1535
+y(k)o(eyb)q(oards.)75 1657 y Fr(1.2)33 b(Readline)23
+b(In)n(teraction)137 1777 y Ft(Often)13 b(during)h(an)e(in)o(teractiv)o
+(e)h(session)g(y)o(ou)g(t)o(yp)q(e)f(in)i(a)e(long)h(line)h(of)e(text,)
+h(only)g(to)f(notice)h(that)f(the)75 1832 y(\014rst)k(w)o(ord)f(on)h
+(the)h(line)h(is)e(missp)q(elled.)26 b(The)16 b(Readline)i(library)f
+(giv)o(es)f(y)o(ou)g(a)g(set)g(of)g(commands)g(for)75
+1886 y(manipulating)g(the)f(text)g(as)f(y)o(ou)h(t)o(yp)q(e)g(it)g(in,)
+g(allo)o(wing)h(y)o(ou)f(to)f(just)h(\014x)g(y)o(our)f(t)o(yp)q(o,)g
+(and)h(not)g(forcing)75 1941 y(y)o(ou)f(to)f(ret)o(yp)q(e)h(the)g(ma)s
+(jorit)o(y)f(of)h(the)g(line.)21 b(Using)15 b(these)f(editing)h
+(commands,)f(y)o(ou)g(mo)o(v)o(e)f(the)h(cursor)75 1996
+y(to)i(the)i(place)g(that)e(needs)i(correction,)g(and)f(delete)h(or)f
+(insert)g(the)h(text)e(of)h(the)g(corrections.)26 b(Then,)75
+2051 y(when)16 b(y)o(ou)f(are)h(satis\014ed)g(with)g(the)f(line,)i(y)o
+(ou)e(simply)i(press)1160 2049 y Fk(h)p 1172 2023 76
+2 v 1172 2051 a Fj(RET)p 1172 2059 V 1245 2049 a Fk(i)1260
+2051 y Ft(.)k(Y)l(ou)16 b(do)f(not)h(ha)o(v)o(e)f(to)g(b)q(e)h(at)f
+(the)75 2106 y(end)k(of)e(the)h(line)i(to)d(press)563
+2104 y Fk(h)p 575 2078 V 575 2106 a Fj(RET)p 575 2113
+V 648 2104 a Fk(i)663 2106 y Ft(;)i(the)f(en)o(tire)h(line)g(is)g
+(accepted)f(regardless)g(of)g(the)g(lo)q(cation)g(of)g(the)75
+2160 y(cursor)d(within)h(the)g(line.)75 2266 y Fh(1.2.1)30
+b(Readline)20 b(Bare)g(Essen)n(tials)137 2386 y Ft(In)12
+b(order)g(to)f(en)o(ter)g(c)o(haracters)g(in)o(to)g(the)h(line,)h
+(simply)g(t)o(yp)q(e)f(them.)18 b(The)12 b(t)o(yp)q(ed)g(c)o(haracter)f
+(app)q(ears)75 2441 y(where)16 b(the)h(cursor)f(w)o(as,)f(and)h(then)h
+(the)f(cursor)g(mo)o(v)o(es)g(one)g(space)g(to)g(the)g(righ)o(t.)23
+b(If)17 b(y)o(ou)f(mist)o(yp)q(e)g(a)75 2495 y(c)o(haracter,)e(y)o(ou)h
+(can)g(use)h(y)o(our)f(erase)g(c)o(haracter)f(to)h(bac)o(k)g(up)g(and)h
+(delete)g(the)f(mist)o(yp)q(ed)h(c)o(haracter.)137 2560
+y(Sometimes)g(y)o(ou)f(ma)o(y)g(mist)o(yp)q(e)h(a)f(c)o(haracter,)f
+(and)i(not)f(notice)h(the)f(error)g(un)o(til)i(y)o(ou)e(ha)o(v)o(e)g(t)
+o(yp)q(ed)75 2615 y(sev)o(eral)g(other)f(c)o(haracters.)19
+b(In)c(that)e(case,)i(y)o(ou)f(can)g(t)o(yp)q(e)h Fl(C-b)f
+Ft(to)g(mo)o(v)o(e)f(the)i(cursor)f(to)g(the)g(left,)h(and)75
+2670 y(then)h(correct)e(y)o(our)h(mistak)o(e.)20 b(Afterw)o(ards,)13
+b(y)o(ou)i(can)g(mo)o(v)o(e)g(the)g(cursor)g(to)g(the)g(righ)o(t)g
+(with)g Fl(C-f)p Ft(.)p eop
+%%Page: 2 6
+2 5 bop 75 -58 a Ft(2)1322 b(GNU)15 b(Readline)h(Library)137
+149 y(When)h(y)o(ou)f(add)g(text)g(in)h(the)g(middle)h(of)e(a)f(line,)j
+(y)o(ou)e(will)i(notice)f(that)f(c)o(haracters)f(to)h(the)g(righ)o(t)75
+204 y(of)e(the)g(cursor)g(are)g(`pushed)h(o)o(v)o(er')f(to)f(mak)o(e)h
+(ro)q(om)g(for)f(the)i(text)f(that)f(y)o(ou)h(ha)o(v)o(e)g(inserted.)21
+b(Lik)o(ewise,)75 259 y(when)e(y)o(ou)g(delete)h(text)e(b)q(ehind)j
+(the)e(cursor,)g(c)o(haracters)f(to)g(the)h(righ)o(t)f(of)g(the)h
+(cursor)g(are)f(`pulled)75 314 y(bac)o(k')11 b(to)g(\014ll)h(in)h(the)e
+(blank)h(space)g(created)f(b)o(y)h(the)f(remo)o(v)m(al)g(of)g(the)h
+(text.)18 b(A)11 b(list)h(of)f(the)h(bare)f(essen)o(tials)75
+369 y(for)k(editing)h(the)f(text)g(of)g(an)g(input)h(line)h(follo)o
+(ws.)75 446 y Fl(C-b)168 b Ft(Mo)o(v)o(e)14 b(bac)o(k)h(one)h(c)o
+(haracter.)75 524 y Fl(C-f)168 b Ft(Mo)o(v)o(e)14 b(forw)o(ard)g(one)h
+(c)o(haracter.)75 599 y Fk(h)p 87 573 73 2 v 87 601 a
+Fj(DEL)p 87 609 V 158 599 a Fk(i)188 601 y Ft(or)244
+599 y Fk(h)p 256 573 159 2 v 256 601 a Fj(Bac)o(kspace)p
+256 609 V 412 599 a Fk(i)315 656 y Ft(Delete)h(the)f(c)o(haracter)g(to)
+f(the)h(left)h(of)f(the)g(cursor.)75 734 y Fl(C-d)168
+b Ft(Delete)16 b(the)f(c)o(haracter)g(underneath)h(the)f(cursor.)75
+811 y(Prin)o(ting)h(c)o(haracters)315 866 y(Insert)f(the)h(c)o
+(haracter)e(in)o(to)h(the)h(line)h(at)d(the)h(cursor.)75
+944 y Fl(C-_)g Ft(or)f Fl(C-x)h(C-u)315 998 y Ft(Undo)i(the)g(last)f
+(editing)i(command.)25 b(Y)l(ou)17 b(can)g(undo)g(all)g(the)g(w)o(a)o
+(y)f(bac)o(k)h(to)f(an)g(empt)o(y)315 1053 y(line.)75
+1131 y(\(Dep)q(ending)i(on)f(y)o(our)g(con\014guration,)g(the)863
+1129 y Fk(h)p 875 1103 V 875 1131 a Fj(Bac)o(kspace)p
+875 1138 V 1032 1129 a Fk(i)1063 1131 y Ft(k)o(ey)g(b)q(e)h(set)f(to)f
+(delete)i(the)f(c)o(haracter)g(to)f(the)75 1186 y(left)h(of)f(the)h
+(cursor)f(and)g(the)596 1184 y Fk(h)p 608 1158 73 2 v
+608 1186 a Fj(DEL)p 608 1193 V 679 1184 a Fk(i)710 1186
+y Ft(k)o(ey)h(set)f(to)g(delete)h(the)g(c)o(haracter)f(underneath)h
+(the)g(cursor,)f(lik)o(e)75 1240 y Fl(C-d)p Ft(,)e(rather)h(than)g(the)
+g(c)o(haracter)g(to)f(the)i(left)f(of)g(the)g(cursor.\))75
+1349 y Fh(1.2.2)30 b(Readline)20 b(Mo)n(v)n(emen)n(t)i(Commands)137
+1470 y Ft(The)14 b(ab)q(o)o(v)o(e)e(table)i(describ)q(es)g(the)g(most)e
+(basic)i(k)o(eystrok)o(es)d(that)i(y)o(ou)g(need)h(in)f(order)g(to)g
+(do)g(editing)75 1525 y(of)f(the)h(input)h(line.)21 b(F)l(or)12
+b(y)o(our)g(con)o(v)o(enience,)i(man)o(y)f(other)f(commands)h(ha)o(v)o
+(e)f(b)q(een)i(added)f(in)h(addition)75 1580 y(to)h Fl(C-b)p
+Ft(,)h Fl(C-f)p Ft(,)f Fl(C-d)p Ft(,)g(and)522 1578 y
+Fk(h)p 534 1552 V 534 1580 a Fj(DEL)p 534 1587 V 605
+1578 a Fk(i)619 1580 y Ft(.)23 b(Here)16 b(are)g(some)f(commands)h(for)
+f(mo)o(ving)h(more)g(rapidly)h(ab)q(out)f(the)75 1635
+y(line.)75 1712 y Fl(C-a)168 b Ft(Mo)o(v)o(e)14 b(to)h(the)g(start)f
+(of)h(the)g(line.)75 1790 y Fl(C-e)168 b Ft(Mo)o(v)o(e)14
+b(to)h(the)g(end)h(of)f(the)g(line.)75 1867 y Fl(M-f)168
+b Ft(Mo)o(v)o(e)14 b(forw)o(ard)g(a)h(w)o(ord,)f(where)i(a)e(w)o(ord)h
+(is)h(comp)q(osed)f(of)g(letters)g(and)h(digits.)75 1945
+y Fl(M-b)168 b Ft(Mo)o(v)o(e)14 b(bac)o(kw)o(ard)h(a)g(w)o(ord.)75
+2022 y Fl(C-l)168 b Ft(Clear)15 b(the)h(screen,)f(reprin)o(ting)h(the)f
+(curren)o(t)g(line)i(at)e(the)g(top.)137 2100 y(Notice)e(ho)o(w)f
+Fl(C-f)g Ft(mo)o(v)o(es)f(forw)o(ard)g(a)h(c)o(haracter,)g(while)i
+Fl(M-f)e Ft(mo)o(v)o(es)f(forw)o(ard)g(a)h(w)o(ord.)18
+b(It)13 b(is)g(a)f(lo)q(ose)75 2155 y(con)o(v)o(en)o(tion)j(that)f(con)
+o(trol)h(k)o(eystrok)o(es)f(op)q(erate)h(on)f(c)o(haracters)h(while)h
+(meta)e(k)o(eystrok)o(es)g(op)q(erate)h(on)75 2210 y(w)o(ords.)75
+2318 y Fh(1.2.3)30 b(Readline)20 b(Killing)h(Commands)137
+2439 y Fi(Killing)26 b Ft(text)18 b(means)g(to)g(delete)i(the)f(text)f
+(from)g(the)h(line,)i(but)d(to)g(sa)o(v)o(e)g(it)h(a)o(w)o(a)o(y)e(for)
+h(later)h(use,)75 2494 y(usually)f(b)o(y)f Fi(y)o(anking)22
+b Ft(\(re-inserting\))17 b(it)g(bac)o(k)g(in)o(to)g(the)h(line.)27
+b(\(`Cut')15 b(and)j(`paste')e(are)g(more)h(recen)o(t)75
+2549 y(jargon)d(for)h(`kill')h(and)g(`y)o(ank'.\))137
+2615 y(If)g(the)f(description)h(for)f(a)g(command)g(sa)o(ys)f(that)h
+(it)g(`kills')h(text,)e(then)i(y)o(ou)f(can)g(b)q(e)h(sure)f(that)f(y)o
+(ou)75 2670 y(can)h(get)g(the)g(text)g(bac)o(k)g(in)h(a)f(di\013eren)o
+(t)g(\(or)g(the)g(same\))g(place)h(later.)p eop
+%%Page: 3 7
+3 6 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(3)137 149 y(When)12 b(y)o(ou)g(use)g(a)f(kill)i(command,)f(the)g
+(text)f(is)h(sa)o(v)o(ed)f(in)i(a)e Fi(kill-ring)p Ft(.)21
+b(An)o(y)12 b(n)o(um)o(b)q(er)g(of)f(consecutiv)o(e)75
+204 y(kills)17 b(sa)o(v)o(e)e(all)h(of)f(the)h(killed)i(text)d
+(together,)f(so)h(that)g(when)h(y)o(ou)f(y)o(ank)g(it)h(bac)o(k,)f(y)o
+(ou)g(get)g(it)h(all.)22 b(The)75 259 y(kill)c(ring)f(is)f(not)g(line)i
+(sp)q(eci\014c;)g(the)e(text)g(that)f(y)o(ou)h(killed)j(on)d(a)g
+(previously)h(t)o(yp)q(ed)g(line)h(is)e(a)o(v)m(ailable)75
+314 y(to)f(b)q(e)g(y)o(ank)o(ed)g(bac)o(k)h(later,)e(when)i(y)o(ou)f
+(are)g(t)o(yping)g(another)g(line.)137 380 y(Here)h(is)f(the)h(list)g
+(of)e(commands)h(for)g(killing)j(text.)75 458 y Fl(C-k)168
+b Ft(Kill)17 b(the)f(text)e(from)h(the)g(curren)o(t)g(cursor)g(p)q
+(osition)h(to)f(the)g(end)h(of)f(the)g(line.)75 536 y
+Fl(M-d)168 b Ft(Kill)15 b(from)e(the)g(cursor)g(to)f(the)i(end)g(of)e
+(the)i(curren)o(t)f(w)o(ord,)f(or,)h(if)g(b)q(et)o(w)o(een)h(w)o(ords,)
+e(to)h(the)315 591 y(end)j(of)f(the)g(next)g(w)o(ord.)k(W)l(ord)c(b)q
+(oundaries)i(are)e(the)g(same)g(as)g(those)f(used)i(b)o(y)f
+Fl(M-f)p Ft(.)75 669 y Fl(M-)123 667 y Fk(h)p 135 641
+73 2 v 135 669 a Fj(DEL)p 135 676 V 206 667 a Fk(i)315
+669 y Ft(Kill)i(from)e(the)g(cursor)g(the)h(start)e(of)h(the)g(curren)o
+(t)g(w)o(ord,)f(or,)h(if)g(b)q(et)o(w)o(een)h(w)o(ords,)e(to)h(the)315
+723 y(start)j(of)h(the)g(previous)h(w)o(ord.)31 b(W)l(ord)19
+b(b)q(oundaries)h(are)f(the)h(same)e(as)h(those)g(used)h(b)o(y)315
+778 y Fl(M-b)p Ft(.)75 856 y Fl(C-w)168 b Ft(Kill)18
+b(from)d(the)g(cursor)h(to)f(the)g(previous)i(whitespace.)22
+b(This)16 b(is)g(di\013eren)o(t)g(than)f Fl(M-)1777 854
+y Fk(h)p 1789 828 V 1789 856 a Fj(DEL)p 1789 864 V 1860
+854 a Fk(i)315 911 y Ft(b)q(ecause)h(the)f(w)o(ord)g(b)q(oundaries)h
+(di\013er.)137 989 y(Here)21 b(is)h(ho)o(w)e(to)g Fi(y)o(ank)j
+Ft(the)e(text)f(bac)o(k)h(in)o(to)g(the)f(line.)39 b(Y)l(anking)21
+b(means)g(to)f(cop)o(y)h(the)g(most-)75 1044 y(recen)o(tly-killed)d
+(text)d(from)f(the)i(kill)h(bu\013er.)75 1122 y Fl(C-y)168
+b Ft(Y)l(ank)15 b(the)h(most)e(recen)o(tly)i(killed)h(text)e(bac)o(k)g
+(in)o(to)g(the)h(bu\013er)f(at)f(the)i(cursor.)75 1200
+y Fl(M-y)168 b Ft(Rotate)16 b(the)h(kill-ring,)j(and)d(y)o(ank)g(the)h
+(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f(this)h(if)f(the)h(prior)
+315 1254 y(command)d(is)h Fl(C-y)f Ft(or)f Fl(M-y)p Ft(.)75
+1364 y Fh(1.2.4)30 b(Readline)20 b(Argumen)n(ts)137 1485
+y Ft(Y)l(ou)15 b(can)g(pass)f(n)o(umeric)i(argumen)o(ts)e(to)g
+(Readline)h(commands.)20 b(Sometimes)15 b(the)g(argumen)o(t)e(acts)75
+1540 y(as)20 b(a)f(rep)q(eat)i(coun)o(t,)f(other)g(times)g(it)h(is)f
+(the)g Fn(sign)j Ft(of)c(the)h(argumen)o(t)g(that)f(is)i(signi\014can)o
+(t.)35 b(If)20 b(y)o(ou)75 1594 y(pass)d(a)f(negativ)o(e)h(argumen)o(t)
+f(to)g(a)g(command)h(whic)o(h)h(normally)f(acts)f(in)i(a)e(forw)o(ard)g
+(direction,)i(that)75 1649 y(command)g(will)h(act)e(in)i(a)e(bac)o(kw)o
+(ard)g(direction.)28 b(F)l(or)17 b(example,)i(to)e(kill)j(text)d(bac)o
+(k)g(to)g(the)h(start)e(of)75 1704 y(the)f(line,)i(y)o(ou)e(migh)o(t)g
+(t)o(yp)q(e)g(`)p Fs(M--)f(C-k)p Ft('.)137 1770 y(The)h(general)f(w)o
+(a)o(y)f(to)h(pass)g(n)o(umeric)h(argumen)o(ts)e(to)g(a)h(command)g(is)
+h(to)e(t)o(yp)q(e)h(meta)g(digits)h(b)q(efore)75 1825
+y(the)h(command.)k(If)c(the)f(\014rst)g(`digit')h(t)o(yp)q(ed)f(is)h(a)
+g(min)o(us)g(sign)g(\(`)p Fs(-)p Ft('\),)d(then)j(the)f(sign)h(of)f
+(the)h(argumen)o(t)75 1880 y(will)21 b(b)q(e)f(negativ)o(e.)31
+b(Once)20 b(y)o(ou)f(ha)o(v)o(e)g(t)o(yp)q(ed)g(one)g(meta)g(digit)h
+(to)e(get)h(the)g(argumen)o(t)f(started,)h(y)o(ou)75
+1935 y(can)c(t)o(yp)q(e)f(the)h(remainder)g(of)f(the)g(digits,)h(and)g
+(then)g(the)f(command.)20 b(F)l(or)13 b(example,)i(to)f(giv)o(e)h(the)f
+Fl(C-d)75 1990 y Ft(command)19 b(an)f(argumen)o(t)g(of)g(10,)h(y)o(ou)f
+(could)i(t)o(yp)q(e)f(`)p Fs(M-1)14 b(0)h(C-d)p Ft(',)k(whic)o(h)g
+(will)h(delete)g(the)f(next)g(ten)75 2044 y(c)o(haracters)14
+b(on)i(the)f(input)h(line.)75 2154 y Fh(1.2.5)30 b(Searc)n(hing)21
+b(for)f(Commands)h(in)f(the)h(History)137 2275 y Ft(Readline)d(pro)o
+(vides)e(commands)g(for)g(searc)o(hing)g(through)g(the)g(command)g
+(history)g(for)g(lines)i(con-)75 2330 y(taining)e(a)f(sp)q(eci\014ed)i
+(string.)j(There)c(are)e(t)o(w)o(o)g(searc)o(h)h(mo)q(des:)20
+b Fi(incremen)o(tal)e Ft(and)e Fi(non-incremen)o(tal)p
+Ft(.)137 2396 y(Incremen)o(tal)e(searc)o(hes)f(b)q(egin)h(b)q(efore)f
+(the)g(user)g(has)g(\014nished)h(t)o(yping)f(the)g(searc)o(h)g(string.)
+19 b(As)13 b(eac)o(h)75 2451 y(c)o(haracter)k(of)g(the)h(searc)o(h)g
+(string)f(is)h(t)o(yp)q(ed,)h(Readline)g(displa)o(ys)f(the)g(next)g(en)
+o(try)f(from)g(the)h(history)75 2506 y(matc)o(hing)12
+b(the)g(string)g(t)o(yp)q(ed)g(so)g(far.)18 b(An)13 b(incremen)o(tal)g
+(searc)o(h)f(requires)g(only)h(as)f(man)o(y)f(c)o(haracters)g(as)75
+2560 y(needed)16 b(to)d(\014nd)j(the)e(desired)i(history)e(en)o(try)l
+(.)19 b(T)l(o)c(searc)o(h)f(bac)o(kw)o(ard)f(in)j(the)e(history)g(for)g
+(a)g(particular)75 2615 y(string,)g(t)o(yp)q(e)h Fl(C-r)p
+Ft(.)k(T)o(yping)d Fl(C-s)e Ft(searc)o(hes)h(forw)o(ard)e(through)h
+(the)h(history)l(.)20 b(The)15 b(c)o(haracters)f(presen)o(t)75
+2670 y(in)20 b(the)f(v)m(alue)h(of)f(the)g Fs(isearch-terminators)d
+Ft(v)m(ariable)k(are)f(used)h(to)e(terminate)h(an)g(incremen)o(tal)p
+eop
+%%Page: 4 8
+4 7 bop 75 -58 a Ft(4)1322 b(GNU)15 b(Readline)h(Library)75
+149 y(searc)o(h.)31 b(If)19 b(that)f(v)m(ariable)i(has)f(not)f(b)q(een)
+i(assigned)g(a)e(v)m(alue,)j(the)1289 147 y Fk(h)p 1301
+121 70 2 v 1301 149 a Fj(ESC)p 1301 157 V 1368 147 a
+Fk(i)1402 149 y Ft(and)e Fl(C-J)f Ft(c)o(haracters)g(will)75
+204 y(terminate)j(an)g(incremen)o(tal)i(searc)o(h.)37
+b Fl(C-g)21 b Ft(will)i(ab)q(ort)e(an)g(incremen)o(tal)h(searc)o(h)f
+(and)g(restore)g(the)75 259 y(original)16 b(line.)21
+b(When)15 b(the)f(searc)o(h)g(is)h(terminated,)g(the)f(history)h(en)o
+(try)f(con)o(taining)h(the)g(searc)o(h)f(string)75 314
+y(b)q(ecomes)i(the)f(curren)o(t)g(line.)137 384 y(T)l(o)g(\014nd)i
+(other)e(matc)o(hing)g(en)o(tries)h(in)h(the)e(history)h(list,)g(t)o
+(yp)q(e)f Fl(C-r)g Ft(or)g Fl(C-s)g Ft(as)h(appropriate.)k(This)75
+439 y(will)15 b(searc)o(h)e(bac)o(kw)o(ard)f(or)g(forw)o(ard)g(in)i
+(the)f(history)g(for)g(the)g(next)g(en)o(try)g(matc)o(hing)g(the)g
+(searc)o(h)g(string)75 494 y(t)o(yp)q(ed)19 b(so)g(far.)30
+b(An)o(y)19 b(other)f(k)o(ey)h(sequence)h(b)q(ound)g(to)e(a)h(Readline)
+h(command)e(will)j(terminate)e(the)75 549 y(searc)o(h)10
+b(and)h(execute)g(that)f(command.)18 b(F)l(or)10 b(instance,)i(a)1063
+547 y Fk(h)p 1076 521 76 2 v 1076 549 a Fj(RET)p 1076
+556 V 1149 547 a Fk(i)1174 549 y Ft(will)g(terminate)f(the)g(searc)o(h)
+f(and)h(accept)75 604 y(the)k(line,)h(thereb)o(y)f(executing)g(the)g
+(command)g(from)f(the)g(history)h(list.)20 b(A)15 b(mo)o(v)o(emen)o(t)f
+(command)g(will)75 658 y(terminate)h(the)g(searc)o(h,)g(mak)o(e)g(the)g
+(last)g(line)i(found)f(the)f(curren)o(t)g(line,)h(and)g(b)q(egin)g
+(editing.)137 729 y(Readline)j(remem)o(b)q(ers)e(the)h(last)f(incremen)
+o(tal)i(searc)o(h)e(string.)27 b(If)17 b(t)o(w)o(o)f
+Fl(C-r)p Ft(s)h(are)g(t)o(yp)q(ed)h(without)75 784 y(an)o(y)g(in)o
+(terv)o(ening)h(c)o(haracters)f(de\014ning)h(a)f(new)h(searc)o(h)f
+(string,)g(an)o(y)g(remem)o(b)q(ered)h(searc)o(h)f(string)g(is)75
+839 y(used.)137 909 y(Non-incremen)o(tal)25 b(searc)o(hes)e(read)h(the)
+f(en)o(tire)h(searc)o(h)f(string)g(b)q(efore)h(starting)f(to)f(searc)o
+(h)i(for)75 964 y(matc)o(hing)d(history)h(lines.)39 b(The)22
+b(searc)o(h)f(string)g(ma)o(y)g(b)q(e)h(t)o(yp)q(ed)f(b)o(y)h(the)f
+(user)h(or)e(b)q(e)i(part)f(of)g(the)75 1019 y(con)o(ten)o(ts)15
+b(of)f(the)i(curren)o(t)f(line.)75 1156 y Fr(1.3)33 b(Readline)23
+b(Init)h(File)137 1281 y Ft(Although)f(the)g(Readline)h(library)f
+(comes)g(with)g(a)f(set)g(of)g(Emacs-lik)o(e)i(k)o(eybindings)g
+(installed)75 1336 y(b)o(y)d(default,)h(it)f(is)h(p)q(ossible)g(to)e
+(use)i(a)e(di\013eren)o(t)h(set)g(of)f(k)o(eybindings.)39
+b(An)o(y)20 b(user)h(can)g(customize)75 1391 y(programs)15
+b(that)h(use)g(Readline)i(b)o(y)e(putting)g(commands)g(in)i(an)e
+Fi(inputrc)k Ft(\014le,)d(con)o(v)o(en)o(tionally)g(in)g(his)75
+1445 y(home)g(directory)l(.)24 b(The)17 b(name)g(of)f(this)h(\014le)g
+(is)g(tak)o(en)g(from)e(the)i(v)m(alue)h(of)e(the)h(en)o(vironmen)o(t)g
+(v)m(ariable)75 1500 y Fs(INPUTRC)p Ft(.)i(If)c(that)g(v)m(ariable)h
+(is)g(unset,)f(the)g(default)h(is)g(`)p Fs(~/.inputrc)p
+Ft('.)137 1571 y(When)f(a)g(program)f(whic)o(h)h(uses)g(the)g(Readline)
+h(library)g(starts)d(up,)i(the)g(init)h(\014le)g(is)f(read,)g(and)g
+(the)75 1626 y(k)o(ey)g(bindings)i(are)e(set.)137 1696
+y(In)f(addition,)h(the)e Fs(C-x)i(C-r)e Ft(command)g(re-reads)h(this)g
+(init)g(\014le,)h(th)o(us)e(incorp)q(orating)h(an)o(y)f(c)o(hanges)75
+1751 y(that)h(y)o(ou)h(migh)o(t)g(ha)o(v)o(e)g(made)g(to)g(it.)75
+1870 y Fh(1.3.1)30 b(Readline)20 b(Init)g(File)h(Syn)n(tax)137
+1995 y Ft(There)c(are)g(only)g(a)g(few)f(basic)i(constructs)e(allo)o(w)
+o(ed)i(in)f(the)g(Readline)h(init)g(\014le.)26 b(Blank)18
+b(lines)g(are)75 2050 y(ignored.)36 b(Lines)22 b(b)q(eginning)h(with)d
+(a)h(`)p Fs(#)p Ft(')e(are)h(commen)o(ts.)35 b(Lines)22
+b(b)q(eginning)h(with)e(a)f(`)p Fs($)p Ft(')f(indicate)75
+2105 y(conditional)c(constructs)f(\(see)g(Section)g(1.3.2)f
+([Conditional)h(Init)h(Constructs],)e(page)h(9\).)k(Other)c(lines)75
+2159 y(denote)h(v)m(ariable)i(settings)e(and)h(k)o(ey)f(bindings.)75
+2244 y(V)l(ariable)h(Settings)315 2299 y(Y)l(ou)k(can)h(mo)q(dify)g
+(the)f(run-time)h(b)q(eha)o(vior)g(of)e(Readline)j(b)o(y)e(altering)h
+(the)f(v)m(alues)h(of)315 2354 y(v)m(ariables)d(in)g(Readline)g(using)f
+(the)g Fs(set)g Ft(command)f(within)i(the)f(init)h(\014le.)26
+b(The)17 b(syn)o(tax)315 2408 y(is)f(simple:)435 2477
+y Fs(set)23 b Fl(variable)28 b(value)315 2546 y Ft(Here,)14
+b(for)f(example,)h(is)g(ho)o(w)f(to)g(c)o(hange)h(from)f(the)h(default)
+g(Emacs-lik)o(e)h(k)o(ey)e(binding)j(to)315 2601 y(use)g
+Fs(vi)e Ft(line)j(editing)g(commands:)435 2670 y Fs(set)23
+b(editing-mode)g(vi)p eop
+%%Page: 5 9
+5 8 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(5)315 149 y(V)l(ariable)19 b(names)e(and)h(v)m(alues,)h(where)e
+(appropriate,)h(are)f(recognized)i(without)e(regard)315
+204 y(to)e(case.)315 271 y(A)g(great)g(deal)g(of)g(run-time)h(b)q(eha)o
+(vior)g(is)g(c)o(hangeable)g(with)f(the)h(follo)o(wing)f(v)m(ariables.)
+315 348 y Fs(bell-style)555 403 y Ft(Con)o(trols)21 b(what)h(happ)q
+(ens)h(when)f(Readline)h(w)o(an)o(ts)e(to)g(ring)i(the)f(termi-)555
+458 y(nal)d(b)q(ell.)32 b(If)19 b(set)f(to)g(`)p Fs(none)p
+Ft(',)g(Readline)i(nev)o(er)f(rings)g(the)f(b)q(ell.)32
+b(If)19 b(set)g(to)555 513 y(`)p Fs(visible)p Ft(',)c(Readline)i(uses)g
+(a)f(visible)j(b)q(ell)g(if)e(one)f(is)h(a)o(v)m(ailable.)26
+b(If)16 b(set)h(to)555 568 y(`)p Fs(audible)p Ft(')g(\(the)h
+(default\),)i(Readline)g(attempts)e(to)g(ring)h(the)g(terminal's)555
+622 y(b)q(ell.)315 700 y Fs(comment-begin)555 755 y Ft(The)c(string)f
+(to)g(insert)i(at)d(the)i(b)q(eginning)i(of)d(the)h(line)h(when)f(the)g
+Fs(insert-)555 810 y(comment)f Ft(command)h(is)h(executed.)21
+b(The)15 b(default)h(v)m(alue)g(is)g Fs("#")p Ft(.)315
+888 y Fs(completion-ignore-case)555 943 y Ft(If)e(set)f(to)g(`)p
+Fs(on)p Ft(',)g(Readline)i(p)q(erforms)e(\014lename)i(matc)o(hing)f
+(and)g(completion)555 997 y(in)i(a)f(case-insensitiv)o(e)i(fashion.)k
+(The)15 b(default)h(v)m(alue)g(is)g(`)p Fs(off)p Ft('.)315
+1075 y Fs(completion-query-items)555 1130 y Ft(The)d(n)o(um)o(b)q(er)h
+(of)e(p)q(ossible)j(completions)g(that)d(determines)i(when)g(the)f
+(user)555 1185 y(is)i(ask)o(ed)g(whether)g(the)f(list)i(of)e(p)q
+(ossibilities)k(should)e(b)q(e)f(displa)o(y)o(ed.)21
+b(If)15 b(the)555 1240 y(n)o(um)o(b)q(er)f(of)f(p)q(ossible)i
+(completions)f(is)g(greater)f(than)g(this)h(v)m(alue,)h(Readline)555
+1294 y(will)g(ask)e(the)g(user)h(whether)f(or)g(not)g(he)g(wishes)h(to)
+f(view)h(them;)f(otherwise,)555 1349 y(they)f(are)g(simply)i(listed.)20
+b(This)13 b(v)m(ariable)g(m)o(ust)f(b)q(e)h(set)f(to)f(an)h(in)o(teger)
+h(v)m(alue)555 1404 y(greater)h(than)h(or)g(equal)h(to)f(0.)k(The)d
+(default)f(limit)i(is)f Fs(100)p Ft(.)315 1482 y Fs(convert-meta)555
+1537 y Ft(If)11 b(set)g(to)g(`)p Fs(on)p Ft(',)f(Readline)i(will)h(con)
+o(v)o(ert)d(c)o(haracters)h(with)g(the)g(eigh)o(th)h(bit)f(set)555
+1591 y(to)f(an)h Fm(asci)q(i)e Ft(k)o(ey)i(sequence)g(b)o(y)g
+(stripping)h(the)e(eigh)o(th)h(bit)h(and)e(pre\014xing)i(an)555
+1644 y Fk(h)p 567 1618 70 2 v 567 1646 a Fj(ESC)p 567
+1654 V 634 1644 a Fk(i)666 1646 y Ft(c)o(haracter,)k(con)o(v)o(erting)h
+(them)g(to)f(a)h(meta-pre\014xed)g(k)o(ey)g(sequence.)555
+1701 y(The)e(default)h(v)m(alue)h(is)e(`)p Fs(on)p Ft('.)315
+1779 y Fs(disable-completion)555 1834 y Ft(If)k(set)f(to)f(`)p
+Fs(On)p Ft(',)h(Readline)i(will)g(inhibit)g(w)o(ord)e(completion.)30
+b(Completion)555 1888 y(c)o(haracters)12 b(will)j(b)q(e)f(inserted)g
+(in)o(to)f(the)g(line)h(as)f(if)h(they)f(had)g(b)q(een)h(mapp)q(ed)555
+1943 y(to)h Fs(self-insert)p Ft(.)j(The)d(default)h(is)g(`)p
+Fs(off)p Ft('.)315 2021 y Fs(editing-mode)555 2076 y
+Ft(The)f Fs(editing-mode)d Ft(v)m(ariable)k(con)o(trols)e(whic)o(h)h
+(default)g(set)f(of)g(k)o(ey)g(bind-)555 2131 y(ings)f(is)g(used.)20
+b(By)12 b(default,)i(Readline)f(starts)f(up)h(in)g(Emacs)f(editing)i
+(mo)q(de,)555 2185 y(where)h(the)f(k)o(eystrok)o(es)g(are)g(most)g
+(similar)i(to)d(Emacs.)20 b(This)15 b(v)m(ariable)h(can)555
+2240 y(b)q(e)g(set)f(to)f(either)i(`)p Fs(emacs)p Ft(')e(or)h(`)p
+Fs(vi)p Ft('.)315 2318 y Fs(enable-keypad)555 2373 y
+Ft(When)d(set)f(to)h(`)p Fs(on)p Ft(',)e(Readline)j(will)h(try)d(to)g
+(enable)i(the)f(application)h(k)o(eypad)555 2428 y(when)h(it)f(is)h
+(called.)21 b(Some)13 b(systems)g(need)h(this)g(to)f(enable)h(the)g
+(arro)o(w)e(k)o(eys.)555 2483 y(The)j(default)h(is)g(`)p
+Fs(off)p Ft('.)315 2560 y Fs(expand-tilde)555 2615 y
+Ft(If)e(set)g(to)f(`)p Fs(on)p Ft(',)f(tilde)k(expansion)e(is)h(p)q
+(erformed)f(when)g(Readline)h(attempts)555 2670 y(w)o(ord)g
+(completion.)21 b(The)15 b(default)h(is)f(`)p Fs(off)p
+Ft('.)p eop
+%%Page: 6 10
+6 9 bop 75 -58 a Ft(6)1322 b(GNU)15 b(Readline)h(Library)555
+149 y(If)f(set)g(to)f(`)p Fs(on)p Ft(',)g(the)g(history)h(co)q(de)h
+(attempts)e(to)g(place)i(p)q(oin)o(t)f(at)f(the)h(same)555
+204 y(lo)q(cation)i(on)g(eac)o(h)g(history)g(line)h(retriev)o(ed)f
+(with)g Fs(previous-history)d Ft(or)555 259 y Fs(next-history)p
+Ft(.)315 348 y Fs(horizontal-scroll-mode)555 403 y Ft(This)19
+b(v)m(ariable)g(can)f(b)q(e)g(set)g(to)f(either)i(`)p
+Fs(on)p Ft(')e(or)g(`)p Fs(off)p Ft('.)27 b(Setting)19
+b(it)f(to)f(`)p Fs(on)p Ft(')555 458 y(means)c(that)f(the)i(text)e(of)h
+(the)g(lines)i(b)q(eing)f(edited)g(will)h(scroll)f(horizon)o(tally)555
+512 y(on)i(a)f(single)i(screen)g(line)g(when)g(they)f(are)f(longer)h
+(than)g(the)g(width)g(of)g(the)555 567 y(screen,)e(instead)f(of)g
+(wrapping)g(on)o(to)f(a)h(new)g(screen)h(line.)21 b(By)13
+b(default,)h(this)555 622 y(v)m(ariable)j(is)e(set)g(to)g(`)p
+Fs(off)p Ft('.)315 711 y Fs(input-meta)555 766 y Ft(If)h(set)f(to)g(`)p
+Fs(on)p Ft(',)f(Readline)j(will)h(enable)e(eigh)o(t-bit)h(input)f(\(it)
+g(will)h(not)e(clear)555 821 y(the)20 b(eigh)o(th)g(bit)g(in)h(the)f(c)
+o(haracters)f(it)h(reads\),)g(regardless)g(of)g(what)f(the)555
+875 y(terminal)i(claims)g(it)f(can)g(supp)q(ort.)34 b(The)20
+b(default)h(v)m(alue)g(is)g(`)p Fs(off)p Ft('.)33 b(The)555
+930 y(name)15 b Fs(meta-flag)f Ft(is)i(a)f(synon)o(ym)g(for)f(this)i(v)
+m(ariable.)315 1019 y Fs(isearch-terminators)555 1074
+y Ft(The)26 b(string)g(of)f(c)o(haracters)g(that)g(should)i(terminate)f
+(an)g(incremen)o(tal)555 1129 y(searc)o(h)12 b(without)h(subsequen)o
+(tly)g(executing)h(the)e(c)o(haracter)g(as)g(a)g(command)555
+1184 y(\(see)22 b(Section)h(1.2.5)e([Searc)o(hing],)j(page)e(3\).)40
+b(If)23 b(this)g(v)m(ariable)g(has)f(not)555 1238 y(b)q(een)17
+b(giv)o(en)f(a)g(v)m(alue,)g(the)g(c)o(haracters)1247
+1236 y Fk(h)p 1259 1210 70 2 v 1259 1238 a Fj(ESC)p 1259
+1246 V 1326 1236 a Fk(i)1357 1238 y Ft(and)g Fl(C-J)f
+Ft(will)i(terminate)f(an)555 1293 y(incremen)o(tal)g(searc)o(h.)315
+1382 y Fs(keymap)96 b Ft(Sets)19 b(Readline's)i(idea)f(of)f(the)g
+(curren)o(t)h(k)o(eymap)f(for)f(k)o(ey)i(binding)h(com-)555
+1437 y(mands.)41 b(Acceptable)23 b Fs(keymap)f Ft(names)g(are)f
+Fs(emacs)p Ft(,)i Fs(emacs-standard)p Ft(,)555 1492 y
+Fs(emacs-meta)p Ft(,)49 b Fs(emacs-ctlx)p Ft(,)g Fs(vi)p
+Ft(,)h Fs(vi-move)p Ft(,)f Fs(vi-command)p Ft(,)g(and)555
+1547 y Fs(vi-insert)p Ft(.)31 b Fs(vi)20 b Ft(is)g(equiv)m(alen)o(t)h
+(to)e Fs(vi-command)p Ft(;)g Fs(emacs)g Ft(is)h(equiv)m(alen)o(t)555
+1601 y(to)15 b Fs(emacs-standard)p Ft(.)20 b(The)d(default)f(v)m(alue)h
+(is)g Fs(emacs)p Ft(.)k(The)16 b(v)m(alue)h(of)f(the)555
+1656 y Fs(editing-mode)e Ft(v)m(ariable)i(also)f(a\013ects)g(the)g
+(default)h(k)o(eymap.)315 1745 y Fs(mark-directories)555
+1800 y Ft(If)j(set)g(to)g(`)p Fs(on)p Ft(',)f(completed)i(directory)g
+(names)f(ha)o(v)o(e)f(a)h(slash)h(app)q(ended.)555 1855
+y(The)15 b(default)h(is)g(`)p Fs(on)p Ft('.)315 1944
+y Fs(mark-modified-lines)555 1999 y Ft(This)j(v)m(ariable,)g(when)g
+(set)e(to)h(`)p Fs(on)p Ft(',)f(causes)h(Readline)h(to)e(displa)o(y)i
+(an)f(as-)555 2054 y(terisk)f(\(`)p Fs(*)p Ft('\))e(at)i(the)f(start)g
+(of)h(history)f(lines)j(whic)o(h)e(ha)o(v)o(e)g(b)q(een)h(mo)q
+(di\014ed.)555 2108 y(This)e(v)m(ariable)g(is)g(`)p Fs(off)p
+Ft(')e(b)o(y)h(default.)315 2197 y Fs(mark-symlinked-directories)555
+2252 y Ft(If)23 b(set)f(to)f(`)p Fs(on)p Ft(',)i(completed)g(names)g
+(whic)o(h)g(are)f(sym)o(b)q(olic)i(links)f(to)f(di-)555
+2307 y(rectories)h(ha)o(v)o(e)g(a)g(slash)g(app)q(ended)i(\(sub)s(ject)
+e(to)f(the)i(v)m(alue)g(of)f Fs(mark-)555 2362 y(directories)p
+Ft(\).)18 b(The)d(default)h(is)g(`)p Fs(off)p Ft('.)315
+2451 y Fs(match-hidden-files)555 2506 y Ft(This)c(v)m(ariable,)h(when)e
+(set)g(to)g(`)p Fs(on)p Ft(',)f(causes)h(Readline)i(to)d(matc)o(h)h
+(\014les)h(whose)555 2560 y(names)22 b(b)q(egin)h(with)g(a)e(`)p
+Fs(.)p Ft(')h(\(hidden)h(\014les\))g(when)f(p)q(erforming)h(\014lename)
+555 2615 y(completion,)g(unless)f(the)f(leading)h(`)p
+Fs(.)p Ft(')e(is)h(supplied)i(b)o(y)e(the)f(user)h(in)h(the)555
+2670 y(\014lename)16 b(to)f(b)q(e)h(completed.)21 b(This)15
+b(v)m(ariable)i(is)f(`)p Fs(on)p Ft(')e(b)o(y)h(default.)p
+eop
+%%Page: 7 11
+7 10 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(7)315 149 y Fs(output-meta)555 204 y Ft(If)18 b(set)f(to)g(`)p
+Fs(on)p Ft(',)g(Readline)i(will)h(displa)o(y)f(c)o(haracters)d(with)j
+(the)e(eigh)o(th)h(bit)555 259 y(set)g(directly)i(rather)d(than)h(as)g
+(a)g(meta-pre\014xed)h(escap)q(e)g(sequence.)30 b(The)555
+314 y(default)16 b(is)f(`)p Fs(off)p Ft('.)315 394 y
+Fs(page-completions)555 449 y Ft(If)i(set)g(to)f(`)p
+Fs(on)p Ft(',)g(Readline)i(uses)g(an)e(in)o(ternal)i
+Fs(more)p Ft(-lik)o(e)g(pager)f(to)f(displa)o(y)555 504
+y(a)g(screenful)h(of)f(p)q(ossible)i(completions)f(at)f(a)g(time.)23
+b(This)17 b(v)m(ariable)g(is)g(`)p Fs(on)p Ft(')555 559
+y(b)o(y)e(default.)315 639 y Fs(print-completions-horizont)o(ally)555
+694 y Ft(If)d(set)g(to)f(`)p Fs(on)p Ft(',)h(Readline)h(will)g(displa)o
+(y)h(completions)f(with)f(matc)o(hes)f(sorted)555 749
+y(horizon)o(tally)23 b(in)f(alphab)q(etical)i(order,)f(rather)e(than)g
+(do)o(wn)h(the)g(screen.)555 804 y(The)15 b(default)h(is)g(`)p
+Fs(off)p Ft('.)315 884 y Fs(show-all-if-ambiguous)555
+939 y Ft(This)g(alters)e(the)i(default)f(b)q(eha)o(vior)h(of)e(the)h
+(completion)h(functions.)21 b(If)15 b(set)555 994 y(to)e(`)p
+Fs(on)p Ft(',)g(w)o(ords)g(whic)o(h)h(ha)o(v)o(e)g(more)f(than)g(one)h
+(p)q(ossible)i(completion)f(cause)555 1049 y(the)20 b(matc)o(hes)f(to)f
+(b)q(e)j(listed)f(immediately)h(instead)f(of)f(ringing)i(the)e(b)q
+(ell.)555 1104 y(The)c(default)h(v)m(alue)h(is)e(`)p
+Fs(off)p Ft('.)315 1184 y Fs(show-all-if-unmodified)555
+1239 y Ft(This)20 b(alters)f(the)h(default)f(b)q(eha)o(vior)h(of)f(the)
+h(completion)g(functions)g(in)g(a)555 1294 y(fashion)13
+b(similar)h(to)e Fi(sho)o(w-all-if-am)o(biguous)p Ft(.)21
+b(If)13 b(set)f(to)g(`)p Fs(on)p Ft(',)g(w)o(ords)g(whic)o(h)555
+1348 y(ha)o(v)o(e)j(more)g(than)g(one)h(p)q(ossible)h(completion)f
+(without)g(an)o(y)f(p)q(ossible)i(par-)555 1403 y(tial)22
+b(completion)g(\(the)f(p)q(ossible)i(completions)f(don't)f(share)g(a)f
+(common)555 1458 y(pre\014x\))15 b(cause)h(the)f(matc)o(hes)g(to)f(b)q
+(e)i(listed)g(immediately)h(instead)f(of)e(ring-)555
+1513 y(ing)i(the)f(b)q(ell.)22 b(The)15 b(default)h(v)m(alue)g(is)g(`)p
+Fs(off)p Ft('.)315 1593 y Fs(visible-stats)555 1648 y
+Ft(If)g(set)g(to)f(`)p Fs(on)p Ft(',)g(a)h(c)o(haracter)f(denoting)h(a)
+g(\014le's)h(t)o(yp)q(e)f(is)g(app)q(ended)i(to)d(the)555
+1703 y(\014lename)h(when)g(listing)h(p)q(ossible)g(completions.)j(The)c
+(default)g(is)f(`)p Fs(off)p Ft('.)75 1784 y(Key)h(Bindings)315
+1838 y(The)21 b(syn)o(tax)f(for)h(con)o(trolling)h(k)o(ey)f(bindings)h
+(in)g(the)f(init)h(\014le)g(is)g(simple.)39 b(First)20
+b(y)o(ou)315 1893 y(need)15 b(to)e(\014nd)h(the)g(name)g(of)g(the)f
+(command)h(that)f(y)o(ou)h(w)o(an)o(t)f(to)g(c)o(hange.)19
+b(The)14 b(follo)o(wing)315 1948 y(sections)k(con)o(tain)h(tables)f(of)
+f(the)h(command)g(name,)g(the)g(default)h(k)o(eybinding,)h(if)e(an)o(y)
+l(,)315 2003 y(and)d(a)g(short)g(description)i(of)d(what)h(the)g
+(command)g(do)q(es.)315 2070 y(Once)k(y)o(ou)f(kno)o(w)f(the)h(name)g
+(of)g(the)g(command,)g(simply)h(place)g(on)f(a)f(line)j(in)f(the)f
+(init)315 2125 y(\014le)g(the)f(name)g(of)f(the)h(k)o(ey)g(y)o(ou)f
+(wish)i(to)e(bind)i(the)f(command)g(to,)f(a)g(colon,)i(and)f(then)315
+2180 y(the)f(name)g(of)g(the)g(command.)22 b(The)16 b(name)g(of)g(the)g
+(k)o(ey)f(can)i(b)q(e)f(expressed)h(in)g(di\013eren)o(t)315
+2235 y(w)o(a)o(ys,)d(dep)q(ending)j(on)e(what)g(y)o(ou)g(\014nd)h(most)
+e(comfortable.)315 2303 y(In)19 b(addition)g(to)e(command)h(names,)g
+(readline)i(allo)o(ws)e(k)o(eys)g(to)f(b)q(e)i(b)q(ound)g(to)e(a)h
+(string)315 2357 y(that)c(is)i(inserted)g(when)g(the)f(k)o(ey)g(is)h
+(pressed)g(\(a)e Fi(macro)r Ft(\).)315 2438 y Fi(k)o(eyname)s
+Ft(:)19 b Fi(function-name)g Ft(or)c Fi(macro)555 2493
+y(k)o(eyname)i Ft(is)e(the)f(name)h(of)f(a)g(k)o(ey)g(sp)q(elled)j(out)
+d(in)h(English.)21 b(F)l(or)13 b(example:)675 2560 y
+Fs(Control-u:)22 b(universal-argument)675 2615 y(Meta-Rubout:)g
+(backward-kill-word)675 2670 y(Control-o:)g(">)i(output")p
+eop
+%%Page: 8 12
+8 11 bop 75 -58 a Ft(8)1322 b(GNU)15 b(Readline)h(Library)555
+149 y(In)k(the)f(ab)q(o)o(v)o(e)g(example,)i Fl(C-u)e
+Ft(is)h(b)q(ound)g(to)f(the)g(function)h Fs(universal-)555
+204 y(argument)p Ft(,)e Fl(M-DEL)h Ft(is)g(b)q(ound)h(to)e(the)h
+(function)h Fs(backward-kill-word)p Ft(,)555 259 y(and)g
+Fl(C-o)f Ft(is)h(b)q(ound)g(to)f(run)h(the)f(macro)g(expressed)h(on)g
+(the)f(righ)o(t)h(hand)555 314 y(side)c(\(that)e(is,)i(to)e(insert)i
+(the)f(text)g(`)p Fs(>)f(output)p Ft(')g(in)o(to)i(the)f(line\).)555
+382 y(A)k(n)o(um)o(b)q(er)f(of)g(sym)o(b)q(olic)i(c)o(haracter)e(names)
+g(are)g(recognized)i(while)g(pro-)555 437 y(cessing)13
+b(this)f(k)o(ey)g(binding)h(syn)o(tax:)18 b Fi(DEL)p
+Ft(,)11 b Fi(ESC)p Ft(,)h Fi(ESCAPE)p Ft(,)f Fi(LFD)p
+Ft(,)g Fi(NEW-)555 492 y(LINE)p Ft(,)16 b Fi(RET)p Ft(,)e
+Fi(RETURN)p Ft(,)f Fi(R)o(UBOUT)p Ft(,)i Fi(SP)l(A)o(CE)p
+Ft(,)g Fi(SPC)p Ft(,)f(and)i Fi(T)l(AB)p Ft(.)315 573
+y Fs(")p Fi(k)o(eyseq)q Fs(")p Ft(:)k Fi(function-name)e
+Ft(or)d Fi(macro)555 628 y(k)o(eyseq)i Ft(di\013ers)e(from)g
+Fi(k)o(eyname)j Ft(ab)q(o)o(v)o(e)d(in)i(that)d(strings)i(denoting)g
+(an)f(en-)555 683 y(tire)i(k)o(ey)g(sequence)h(can)f(b)q(e)g(sp)q
+(eci\014ed,)i(b)o(y)e(placing)h(the)f(k)o(ey)g(sequence)h(in)555
+737 y(double)e(quotes.)j(Some)c Fm(gnu)g Ft(Emacs)f(st)o(yle)h(k)o(ey)g
+(escap)q(es)g(can)g(b)q(e)g(used,)g(as)555 792 y(in)j(the)f(follo)o
+(wing)g(example,)h(but)f(the)g(sp)q(ecial)i(c)o(haracter)d(names)h(are)
+f(not)555 847 y(recognized.)675 915 y Fs("\\C-u":)23
+b(universal-argument)675 970 y("\\C-x\\C-r":)f(re-read-init-file)675
+1025 y("\\e[11~":)h("Function)f(Key)i(1")555 1093 y Ft(In)33
+b(the)f(ab)q(o)o(v)o(e)g(example,)37 b Fl(C-u)32 b Ft(is)h(again)f(b)q
+(ound)h(to)f(the)g(function)555 1148 y Fs(universal-argument)19
+b Ft(\(just)j(as)f(it)h(w)o(as)f(in)i(the)f(\014rst)f(example\),)j(`)p
+Fl(C-x)555 1202 y(C-r)p Ft(')c(is)h(b)q(ound)g(to)f(the)h(function)g
+Fs(re-read-init-file)p Ft(,)f(and)g(`)1731 1200 y Fk(h)p
+1743 1174 70 2 v 1743 1202 a Fj(ESC)p 1743 1210 V 1810
+1200 a Fk(i)15 b(h)p 1852 1174 10 2 v 1852 1202 a Fj([)p
+1852 1211 V 1860 1200 a Fk(i)555 1255 y(h)p 567 1229
+18 2 v 567 1257 a Fj(1)p 567 1265 V 583 1255 a Fk(i)g(h)p
+625 1229 V 625 1257 a Fj(1)p 625 1265 V 640 1255 a Fk(i)g(h)p
+683 1229 24 2 v 683 1257 a Fs(~)p 683 1265 V 704 1255
+a Fk(i)719 1257 y Ft(')g(is)h(b)q(ound)g(to)e(insert)i(the)f(text)g(`)p
+Fs(Function)f(Key)g(1)p Ft('.)315 1339 y(The)h(follo)o(wing)h
+Fm(gnu)e Ft(Emacs)h(st)o(yle)g(escap)q(e)h(sequences)g(are)e(a)o(v)m
+(ailable)j(when)e(sp)q(ecifying)315 1393 y(k)o(ey)g(sequences:)315
+1475 y Fl(\\C-)168 b Ft(con)o(trol)15 b(pre\014x)315
+1556 y Fl(\\M-)168 b Ft(meta)15 b(pre\014x)315 1638 y
+Fl(\\e)192 b Ft(an)15 b(escap)q(e)h(c)o(haracter)315
+1719 y Fl(\\\\)192 b Ft(bac)o(kslash)315 1801 y Fl(\\)p
+Fs(")555 1799 y Fk(h)p 567 1773 V 567 1801 a Fs(")p 567
+1808 V 589 1799 a Fk(i)604 1801 y Ft(,)15 b(a)f(double)j(quotation)e
+(mark)315 1882 y Fl(\\')555 1880 y Fk(h)p 567 1854 10
+2 v 567 1882 a Fj(')p 567 1890 V 575 1880 a Fk(i)590
+1882 y Ft(,)g(a)f(single)j(quote)e(or)g(ap)q(ostrophe)315
+1964 y(In)f(addition)h(to)f(the)f Fm(gnu)h Ft(Emacs)g(st)o(yle)f(escap)
+q(e)i(sequences,)g(a)e(second)i(set)e(of)h(bac)o(kslash)315
+2018 y(escap)q(es)i(is)g(a)o(v)m(ailable:)315 2100 y
+Fs(\\a)192 b Ft(alert)15 b(\(b)q(ell\))315 2181 y Fs(\\b)192
+b Ft(bac)o(kspace)315 2263 y Fs(\\d)g Ft(delete)315 2344
+y Fs(\\f)g Ft(form)14 b(feed)315 2426 y Fs(\\n)192 b
+Ft(newline)315 2507 y Fs(\\r)g Ft(carriage)15 b(return)315
+2589 y Fs(\\t)192 b Ft(horizon)o(tal)16 b(tab)315 2670
+y Fs(\\v)192 b Ft(v)o(ertical)16 b(tab)p eop
+%%Page: 9 13
+9 12 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(9)315 149 y Fs(\\)p Fl(nnn)144 b Ft(the)17 b(eigh)o(t-bit)h(c)o
+(haracter)f(whose)g(v)m(alue)i(is)e(the)h(o)q(ctal)f(v)m(alue)i
+Fi(nnn)f Ft(\(one)f(to)555 204 y(three)e(digits\))315
+282 y Fs(\\x)p Fl(HH)144 b Ft(the)20 b(eigh)o(t-bit)g(c)o(haracter)f
+(whose)h(v)m(alue)h(is)f(the)g(hexadecimal)h(v)m(alue)g
+Fi(HH)555 337 y Ft(\(one)15 b(or)g(t)o(w)o(o)f(hex)h(digits\))315
+415 y(When)k(en)o(tering)g(the)g(text)f(of)g(a)h(macro,)f(single)i(or)e
+(double)i(quotes)f(m)o(ust)f(b)q(e)h(used)h(to)315 470
+y(indicate)12 b(a)f(macro)f(de\014nition.)20 b(Unquoted)11
+b(text)f(is)i(assumed)e(to)h(b)q(e)g(a)f(function)i(name.)18
+b(In)315 524 y(the)11 b(macro)f(b)q(o)q(dy)l(,)i(the)f(bac)o(kslash)g
+(escap)q(es)g(describ)q(ed)i(ab)q(o)o(v)o(e)d(are)g(expanded.)20
+b(Bac)o(kslash)315 579 y(will)i(quote)d(an)o(y)h(other)g(c)o(haracter)f
+(in)i(the)f(macro)f(text,)h(including)j(`)p Fs(")p Ft(')c(and)h(`)p
+Fs(')p Ft('.)34 b(F)l(or)315 634 y(example,)14 b(the)f(follo)o(wing)g
+(binding)i(will)g(mak)o(e)d(`)p Fl(C-x)i Fs(\\)p Ft(')f(insert)g(a)g
+(single)h(`)p Fs(\\)p Ft(')e(in)o(to)h(the)g(line:)435
+700 y Fs("\\C-x\\\\":)23 b("\\\\")75 810 y Fh(1.3.2)30
+b(Conditional)20 b(Init)g(Constructs)137 931 y Ft(Readline)f(implemen)o
+(ts)g(a)f(facilit)o(y)g(similar)h(in)g(spirit)f(to)f(the)h(conditional)
+h(compilation)g(features)75 986 y(of)e(the)g(C)g(prepro)q(cessor)g
+(whic)o(h)i(allo)o(ws)e(k)o(ey)g(bindings)i(and)f(v)m(ariable)g
+(settings)f(to)g(b)q(e)h(p)q(erformed)f(as)75 1040 y(the)e(result)h(of)
+f(tests.)k(There)c(are)g(four)g(parser)g(directiv)o(es)h(used.)75
+1118 y Fs($if)168 b Ft(The)16 b Fs($if)f Ft(construct)g(allo)o(ws)h
+(bindings)i(to)d(b)q(e)h(made)g(based)g(on)f(the)h(editing)h(mo)q(de,)f
+(the)315 1173 y(terminal)k(b)q(eing)g(used,)g(or)f(the)g(application)i
+(using)e(Readline.)33 b(The)19 b(text)g(of)f(the)i(test)315
+1228 y(extends)c(to)e(the)h(end)h(of)f(the)g(line;)i(no)e(c)o
+(haracters)f(are)h(required)i(to)d(isolate)i(it.)315
+1306 y Fs(mode)144 b Ft(The)11 b Fs(mode=)e Ft(form)h(of)g(the)h
+Fs($if)f Ft(directiv)o(e)h(is)g(used)g(to)f(test)g(whether)h(Readline)
+555 1361 y(is)k(in)h Fs(emacs)e Ft(or)g Fs(vi)g Ft(mo)q(de.)20
+b(This)c(ma)o(y)e(b)q(e)h(used)g(in)h(conjunction)g(with)f(the)555
+1415 y(`)p Fs(set)f(keymap)p Ft(')f(command,)g(for)h(instance,)g(to)f
+(set)h(bindings)h(in)g(the)f Fs(emacs-)555 1470 y(standard)d
+Ft(and)i Fs(emacs-ctlx)e Ft(k)o(eymaps)h(only)i(if)f(Readline)g(is)g
+(starting)f(out)555 1525 y(in)k Fs(emacs)f Ft(mo)q(de.)315
+1603 y Fs(term)144 b Ft(The)14 b Fs(term=)e Ft(form)h(ma)o(y)g(b)q(e)h
+(used)g(to)f(include)j(terminal-sp)q(eci\014c)g(k)o(ey)d(bind-)555
+1658 y(ings,)19 b(p)q(erhaps)g(to)e(bind)i(the)g(k)o(ey)e(sequences)j
+(output)e(b)o(y)g(the)g(terminal's)555 1712 y(function)13
+b(k)o(eys.)18 b(The)13 b(w)o(ord)e(on)h(the)g(righ)o(t)g(side)g(of)g
+(the)g(`)p Fs(=)p Ft(')f(is)h(tested)g(against)555 1767
+y(b)q(oth)j(the)g(full)i(name)e(of)f(the)h(terminal)h(and)f(the)g(p)q
+(ortion)h(of)e(the)h(terminal)555 1822 y(name)i(b)q(efore)g(the)g
+(\014rst)f(`)p Fs(-)p Ft('.)24 b(This)17 b(allo)o(ws)g
+Fs(sun)f Ft(to)g(matc)o(h)h(b)q(oth)f Fs(sun)h Ft(and)555
+1877 y Fs(sun-cmd)p Ft(,)d(for)g(instance.)315 1955 y
+Fs(application)555 2010 y Ft(The)d Fi(application)i Ft(construct)e(is)g
+(used)h(to)e(include)j(application-sp)q(eci)q(\014c)h(set-)555
+2064 y(tings.)19 b(Eac)o(h)12 b(program)f(using)j(the)e(Readline)i
+(library)f(sets)f(the)g Fi(application)555 2119 y(name)p
+Ft(,)g(and)g(y)o(ou)f(can)h(test)f(for)g(a)g(particular)h(v)m(alue.)20
+b(This)12 b(could)h(b)q(e)f(used)h(to)555 2174 y(bind)18
+b(k)o(ey)e(sequences)i(to)d(functions)j(useful)f(for)f(a)g(sp)q
+(eci\014c)i(program.)23 b(F)l(or)555 2229 y(instance,)17
+b(the)g(follo)o(wing)g(command)g(adds)f(a)g(k)o(ey)h(sequence)g(that)f
+(quotes)555 2283 y(the)f(curren)o(t)g(or)g(previous)h(w)o(ord)e(in)j
+(Bash:)675 2350 y Fs($if)23 b(Bash)675 2405 y(#)h(Quote)f(the)g
+(current)g(or)h(previous)f(word)675 2459 y("\\C-xq":)g
+("\\eb\\"\\ef\\"")675 2514 y($endif)75 2592 y($endif)96
+b Ft(This)16 b(command,)e(as)h(seen)h(in)g(the)f(previous)h(example,)g
+(terminates)f(an)g Fs($if)f Ft(command.)75 2670 y Fs($else)120
+b Ft(Commands)15 b(in)h(this)f(branc)o(h)h(of)e(the)i
+Fs($if)e Ft(directiv)o(e)j(are)e(executed)h(if)g(the)f(test)g(fails.)p
+eop
+%%Page: 10 14
+10 13 bop 75 -58 a Ft(10)1299 b(GNU)15 b(Readline)h(Library)75
+149 y Fs($include)48 b Ft(This)22 b(directiv)o(e)h(tak)o(es)e(a)h
+(single)h(\014lename)g(as)e(an)h(argumen)o(t)f(and)h(reads)f(commands)
+315 204 y(and)e(bindings)j(from)c(that)h(\014le.)33 b(F)l(or)19
+b(example,)i(the)e(follo)o(wing)h(directiv)o(e)h(reads)e(from)315
+259 y(`)p Fs(/etc/inputrc)p Ft(':)435 326 y Fs($include)k(/etc/inputrc)
+75 438 y Fh(1.3.3)30 b(Sample)20 b(Init)h(File)137 560
+y Ft(Here)16 b(is)g(an)f(example)h(of)f(an)g Fi(inputrc)k
+Ft(\014le.)i(This)16 b(illustrates)g(k)o(ey)f(binding,)i(v)m(ariable)f
+(assignmen)o(t,)75 615 y(and)f(conditional)i(syn)o(tax.)p
+eop
+%%Page: 11 15
+11 14 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(11)195 204 y Fs(#)24 b(This)f(file)g(controls)g(the)h(behaviour)e(of)
+i(line)f(input)g(editing)g(for)195 259 y(#)h(programs)e(that)i(use)f
+(the)h(GNU)f(Readline)g(library.)47 b(Existing)195 314
+y(#)24 b(programs)e(include)h(FTP,)h(Bash,)f(and)g(GDB.)195
+369 y(#)195 423 y(#)h(You)f(can)h(re-read)f(the)g(inputrc)g(file)g
+(with)h(C-x)f(C-r.)195 478 y(#)h(Lines)f(beginning)g(with)g('#')g(are)h
+(comments.)195 533 y(#)195 588 y(#)g(First,)f(include)g(any)g
+(systemwide)g(bindings)f(and)i(variable)195 643 y(#)g(assignments)e
+(from)h(/etc/Inputrc)195 697 y($include)g(/etc/Inputrc)195
+807 y(#)195 862 y(#)h(Set)f(various)g(bindings)g(for)g(emacs)g(mode.)
+195 971 y(set)g(editing-mode)g(emacs)195 1081 y($if)g(mode=emacs)195
+1191 y(Meta-Control-h:)46 b(backward-kill-word)21 b(Text)i(after)h(the)
+f(function)g(name)g(is)h(ignored)p 1986 1201 21 38 v
+195 1300 a(#)195 1355 y(#)g(Arrow)f(keys)g(in)h(keypad)f(mode)195
+1410 y(#)195 1465 y(#"\\M-OD":)190 b(backward-char)195
+1519 y(#"\\M-OC":)g(forward-char)195 1574 y(#"\\M-OA":)g
+(previous-history)195 1629 y(#"\\M-OB":)g(next-history)195
+1684 y(#)195 1738 y(#)24 b(Arrow)f(keys)g(in)h(ANSI)f(mode)195
+1793 y(#)195 1848 y("\\M-[D":)190 b(backward-char)195
+1903 y("\\M-[C":)g(forward-char)195 1958 y("\\M-[A":)g
+(previous-history)195 2012 y("\\M-[B":)g(next-history)195
+2067 y(#)195 2122 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(keypad)g(mode)
+195 2177 y(#)195 2232 y(#"\\M-\\C-OD":)165 b(backward-char)195
+2286 y(#"\\M-\\C-OC":)g(forward-char)195 2341 y(#"\\M-\\C-OA":)g
+(previous-history)195 2396 y(#"\\M-\\C-OB":)g(next-history)195
+2451 y(#)195 2506 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(ANSI)g(mode)
+195 2560 y(#)195 2615 y(#"\\M-\\C-[D":)165 b(backward-char)195
+2670 y(#"\\M-\\C-[C":)g(forward-char)p eop
+%%Page: 12 16
+12 15 bop 75 -58 a Ft(12)1299 b(GNU)15 b(Readline)h(Library)195
+149 y Fs(#"\\M-\\C-[A":)165 b(previous-history)195 204
+y(#"\\M-\\C-[B":)g(next-history)195 314 y(C-q:)23 b(quoted-insert)195
+423 y($endif)195 533 y(#)h(An)f(old-style)g(binding.)47
+b(This)23 b(happens)g(to)g(be)h(the)f(default.)195 588
+y(TAB:)g(complete)195 697 y(#)h(Macros)f(that)g(are)h(convenient)e(for)
+h(shell)h(interaction)195 752 y($if)f(Bash)195 807 y(#)h(edit)f(the)g
+(path)195 862 y("\\C-xp":)g("PATH=${PATH}\\e\\C-e\\C-a\\)o(ef\\C-f")195
+917 y(#)h(prepare)f(to)g(type)h(a)f(quoted)g(word)h(--)195
+971 y(#)g(insert)f(open)g(and)h(close)f(double)g(quotes)195
+1026 y(#)h(and)f(move)g(to)h(just)f(after)h(the)f(open)g(quote)195
+1081 y("\\C-x\\"":)g("\\"\\"\\C-b")195 1136 y(#)h(insert)f(a)g
+(backslash)g(\(testing)g(backslash)g(escapes)195 1191
+y(#)h(in)f(sequences)g(and)g(macros\))195 1245 y("\\C-x\\\\":)g("\\\\")
+195 1300 y(#)h(Quote)f(the)g(current)g(or)h(previous)f(word)195
+1355 y("\\C-xq":)g("\\eb\\"\\ef\\"")195 1410 y(#)h(Add)f(a)h(binding)f
+(to)g(refresh)g(the)h(line,)f(which)g(is)h(unbound)195
+1465 y("\\C-xr":)f(redraw-current-line)195 1519 y(#)h(Edit)f(variable)g
+(on)g(current)g(line.)195 1574 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-a\\C-y=)o(")195 1629 y($endif)195
+1738 y(#)i(use)f(a)h(visible)f(bell)g(if)h(one)f(is)h(available)195
+1793 y(set)f(bell-style)g(visible)195 1903 y(#)h(don't)f(strip)g
+(characters)g(to)g(7)h(bits)f(when)h(reading)195 1958
+y(set)f(input-meta)g(on)195 2067 y(#)h(allow)f(iso-latin1)f(characters)
+h(to)g(be)h(inserted)f(rather)195 2122 y(#)h(than)f(converted)g(to)g
+(prefix-meta)g(sequences)195 2177 y(set)g(convert-meta)g(off)195
+2286 y(#)h(display)f(characters)f(with)h(the)h(eighth)f(bit)g(set)h
+(directly)195 2341 y(#)g(rather)f(than)g(as)h(meta-prefixed)e
+(characters)195 2396 y(set)h(output-meta)g(on)195 2506
+y(#)h(if)f(there)g(are)h(more)f(than)h(150)f(possible)g(completions)f
+(for)195 2560 y(#)i(a)f(word,)h(ask)f(the)h(user)f(if)g(he)h(wants)f
+(to)h(see)f(all)h(of)f(them)195 2615 y(set)g(completion-query-items)e
+(150)p eop
+%%Page: 13 17
+13 16 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(13)195 149 y Fs(#)24 b(For)f(FTP)195 204 y($if)g(Ftp)195
+259 y("\\C-xg":)g("get)g(\\M-?")195 314 y("\\C-xt":)g("put)g(\\M-?")195
+369 y("\\M-.":)g(yank-last-arg)195 423 y($endif)75 549
+y Fr(1.4)33 b(Bindable)24 b(Readline)f(Commands)137 670
+y Ft(This)17 b(section)f(describ)q(es)h(Readline)g(commands)f(that)e
+(ma)o(y)h(b)q(e)i(b)q(ound)f(to)f(k)o(ey)h(sequences.)22
+b(Com-)75 725 y(mand)15 b(names)g(without)h(an)f(accompan)o(ying)g(k)o
+(ey)g(sequence)i(are)e(un)o(b)q(ound)h(b)o(y)f(default.)137
+791 y(In)f(the)f(follo)o(wing)h(descriptions,)h Fi(p)q(oin)o(t)f
+Ft(refers)f(to)g(the)g(curren)o(t)g(cursor)f(p)q(osition,)j(and)e
+Fi(mark)i Ft(refers)75 846 y(to)k(a)g(cursor)g(p)q(osition)h(sa)o(v)o
+(ed)f(b)o(y)h(the)f Fs(set-mark)g Ft(command.)32 b(The)20
+b(text)f(b)q(et)o(w)o(een)g(the)h(p)q(oin)o(t)g(and)75
+900 y(mark)15 b(is)g(referred)h(to)e(as)h(the)g Fi(region)p
+Ft(.)75 1009 y Fh(1.4.1)30 b(Commands)21 b(F)-5 b(or)19
+b(Mo)n(ving)75 1130 y Fs(beginning-of-line)13 b(\(C-a\))315
+1185 y Ft(Mo)o(v)o(e)h(to)h(the)g(start)f(of)h(the)g(curren)o(t)g
+(line.)75 1263 y Fs(end-of-line)f(\(C-e\))315 1317 y
+Ft(Mo)o(v)o(e)g(to)h(the)g(end)h(of)f(the)g(line.)75
+1395 y Fs(forward-char)f(\(C-f\))315 1450 y Ft(Mo)o(v)o(e)g(forw)o(ard)
+g(a)h(c)o(haracter.)75 1527 y Fs(backward-char)e(\(C-b\))315
+1582 y Ft(Mo)o(v)o(e)h(bac)o(k)h(a)g(c)o(haracter.)75
+1660 y Fs(forward-word)f(\(M-f\))315 1714 y Ft(Mo)o(v)o(e)g(forw)o(ard)
+g(to)g(the)i(end)g(of)e(the)h(next)h(w)o(ord.)j(W)l(ords)c(are)f(comp)q
+(osed)i(of)f(letters)g(and)315 1769 y(digits.)75 1847
+y Fs(backward-word)e(\(M-b\))315 1902 y Ft(Mo)o(v)o(e)j(bac)o(k)g(to)h
+(the)f(start)g(of)g(the)h(curren)o(t)g(or)f(previous)i(w)o(ord.)24
+b(W)l(ords)16 b(are)h(comp)q(osed)315 1956 y(of)e(letters)g(and)g
+(digits.)75 2034 y Fs(clear-screen)f(\(C-l\))315 2089
+y Ft(Clear)f(the)h(screen)g(and)f(redra)o(w)g(the)g(curren)o(t)g(line,)
+i(lea)o(ving)g(the)e(curren)o(t)g(line)i(at)e(the)g(top)315
+2143 y(of)i(the)g(screen.)75 2221 y Fs(redraw-current-line)e(\(\))315
+2276 y Ft(Refresh)i(the)g(curren)o(t)g(line.)22 b(By)15
+b(default,)h(this)f(is)h(un)o(b)q(ound.)75 2385 y Fh(1.4.2)30
+b(Commands)21 b(F)-5 b(or)19 b(Manipulating)i(The)f(History)75
+2506 y Fs(accept-line)14 b(\(Newline)g(or)h(Return\))315
+2560 y Ft(Accept)j(the)g(line)h(regardless)f(of)f(where)h(the)g(cursor)
+f(is.)27 b(If)18 b(this)g(line)h(is)g(non-empt)o(y)l(,)f(it)315
+2615 y(ma)o(y)d(b)q(e)i(added)f(to)g(the)g(history)g(list)g(for)g
+(future)g(recall)h(with)f Fs(add_history\(\))p Ft(.)k(If)d(this)315
+2670 y(line)g(is)f(a)e(mo)q(di\014ed)j(history)e(line,)i(the)e(history)
+g(line)i(is)f(restored)e(to)h(its)g(original)i(state.)p
+eop
+%%Page: 14 18
+14 17 bop 75 -58 a Ft(14)1299 b(GNU)15 b(Readline)h(Library)75
+149 y Fs(previous-history)d(\(C-p\))315 204 y Ft(Mo)o(v)o(e)h(`bac)o
+(k')h(through)f(the)i(history)f(list,)g(fetc)o(hing)h(the)f(previous)h
+(command.)75 293 y Fs(next-history)e(\(C-n\))315 348
+y Ft(Mo)o(v)o(e)g(`forw)o(ard')f(through)i(the)h(history)f(list,)g
+(fetc)o(hing)h(the)f(next)h(command.)75 437 y Fs(beginning-of-history)c
+(\(M-<\))315 492 y Ft(Mo)o(v)o(e)i(to)h(the)g(\014rst)g(line)i(in)f
+(the)f(history)l(.)75 580 y Fs(end-of-history)e(\(M->\))315
+635 y Ft(Mo)o(v)o(e)h(to)h(the)g(end)h(of)f(the)g(input)h(history)l(,)f
+(i.e.,)g(the)g(line)i(curren)o(tly)f(b)q(eing)g(en)o(tered.)75
+724 y Fs(reverse-search-history)c(\(C-r\))315 779 y Ft(Searc)o(h)k(bac)
+o(kw)o(ard)e(starting)h(at)g(the)h(curren)o(t)f(line)j(and)d(mo)o(ving)
+h(`up')f(through)g(the)h(his-)315 834 y(tory)e(as)h(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)75 923
+y Fs(forward-search-history)c(\(C-s\))315 977 y Ft(Searc)o(h)j(forw)o
+(ard)e(starting)h(at)h(the)f(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)
+o(wn')f(through)g(the)h(the)315 1032 y(history)g(as)g(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)75 1121
+y Fs(non-incremental-reverse-se)o(arch-hi)o(story)c(\(M-p\))315
+1176 y Ft(Searc)o(h)k(bac)o(kw)o(ard)e(starting)h(at)g(the)h(curren)o
+(t)f(line)j(and)d(mo)o(ving)h(`up')f(through)g(the)h(his-)315
+1231 y(tory)h(as)h(necessary)g(using)h(a)e(non-incremen)o(tal)j(searc)o
+(h)e(for)f(a)h(string)g(supplied)i(b)o(y)e(the)315 1285
+y(user.)75 1374 y Fs(non-incremental-forward-se)o(arch-hi)o(story)12
+b(\(M-n\))315 1429 y Ft(Searc)o(h)j(forw)o(ard)e(starting)h(at)h(the)f
+(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)o(wn')f(through)g(the)h(the)
+315 1484 y(history)e(as)g(necessary)h(using)g(a)f(non-incremen)o(tal)i
+(searc)o(h)e(for)g(a)g(string)g(supplied)j(b)o(y)d(the)315
+1539 y(user.)75 1627 y Fs(history-search-forward)f(\(\))315
+1682 y Ft(Searc)o(h)21 b(forw)o(ard)e(through)i(the)f(history)h(for)f
+(the)h(string)g(of)f(c)o(haracters)g(b)q(et)o(w)o(een)h(the)315
+1737 y(start)16 b(of)h(the)h(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o
+(t.)28 b(This)18 b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27
+b(By)315 1792 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75
+1881 y Fs(history-search-backward)c(\(\))315 1935 y Ft(Searc)o(h)18
+b(bac)o(kw)o(ard)e(through)h(the)h(history)f(for)g(the)g(string)h(of)f
+(c)o(haracters)f(b)q(et)o(w)o(een)i(the)315 1990 y(start)e(of)h(the)h
+(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o(t.)28 b(This)18
+b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27 b(By)315
+2045 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75
+2134 y Fs(yank-nth-arg)e(\(M-C-y\))315 2189 y Ft(Insert)f(the)g
+(\014rst)g(argumen)o(t)f(to)g(the)i(previous)f(command)g(\(usually)h
+(the)f(second)h(w)o(ord)e(on)315 2244 y(the)j(previous)h(line\))g(at)e
+(p)q(oin)o(t.)21 b(With)15 b(an)g(argumen)o(t)f Fi(n)p
+Ft(,)h(insert)g(the)g Fi(n)p Ft(th)g(w)o(ord)g(from)f(the)315
+2298 y(previous)g(command)g(\(the)f(w)o(ords)f(in)j(the)e(previous)i
+(command)e(b)q(egin)i(with)e(w)o(ord)g(0\).)19 b(A)315
+2353 y(negativ)o(e)13 b(argumen)o(t)f(inserts)h(the)g
+Fi(n)p Ft(th)g(w)o(ord)f(from)g(the)h(end)h(of)e(the)h(previous)g
+(command.)75 2442 y Fs(yank-last-arg)g(\(M-.)i(or)g(M-_\))315
+2497 y Ft(Insert)j(last)f(argumen)o(t)g(to)g(the)g(previous)i(command)e
+(\(the)g(last)h(w)o(ord)f(of)g(the)g(previous)315 2552
+y(history)e(en)o(try\).)20 b(With)15 b(an)g(argumen)o(t,)g(b)q(eha)o(v)
+o(e)g(exactly)h(lik)o(e)g Fs(yank-nth-arg)p Ft(.)j(Succes-)315
+2606 y(siv)o(e)f(calls)g(to)f Fs(yank-last-arg)e Ft(mo)o(v)o(e)i(bac)o
+(k)g(through)g(the)g(history)g(list,)i(inserting)f(the)315
+2661 y(last)d(argumen)o(t)g(of)f(eac)o(h)i(line)g(in)g(turn.)p
+eop
+%%Page: 15 19
+15 18 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(15)75 149 y Fh(1.4.3)30 b(Commands)21 b(F)-5 b(or)19
+b(Changing)i(T)-5 b(ext)75 273 y Fs(delete-char)14 b(\(C-d\))315
+328 y Ft(Delete)20 b(the)g(c)o(haracter)e(at)h(p)q(oin)o(t.)33
+b(If)20 b(p)q(oin)o(t)g(is)g(at)e(the)i(b)q(eginning)i(of)d(the)g
+(line,)j(there)315 383 y(are)c(no)h(c)o(haracters)e(in)j(the)e(line,)j
+(and)e(the)f(last)h(c)o(haracter)e(t)o(yp)q(ed)i(w)o(as)f(not)g(b)q
+(ound)i(to)315 438 y Fs(delete-char)p Ft(,)13 b(then)j(return)f
+Fm(eof)p Ft(.)75 521 y Fs(backward-delete-char)d(\(Rubout\))315
+576 y Ft(Delete)k(the)f(c)o(haracter)f(b)q(ehind)j(the)f(cursor.)j(A)c
+(n)o(umeric)h(argumen)o(t)e(means)i(to)e(kill)j(the)315
+631 y(c)o(haracters)d(instead)i(of)f(deleting)i(them.)75
+714 y Fs(forward-backward-delete-ch)o(ar)12 b(\(\))315
+769 y Ft(Delete)20 b(the)f(c)o(haracter)f(under)i(the)f(cursor,)h
+(unless)g(the)f(cursor)g(is)h(at)e(the)h(end)h(of)f(the)315
+824 y(line,)e(in)g(whic)o(h)g(case)e(the)h(c)o(haracter)g(b)q(ehind)h
+(the)f(cursor)g(is)g(deleted.)23 b(By)16 b(default,)h(this)315
+878 y(is)f(not)f(b)q(ound)h(to)e(a)h(k)o(ey)l(.)75 962
+y Fs(quoted-insert)e(\(C-q)i(or)g(C-v\))315 1017 y Ft(Add)j(the)f(next)
+g(c)o(haracter)g(t)o(yp)q(ed)g(to)f(the)i(line)g(v)o(erbatim.)26
+b(This)18 b(is)f(ho)o(w)g(to)g(insert)g(k)o(ey)315 1071
+y(sequences)f(lik)o(e)h Fl(C-q)p Ft(,)d(for)h(example.)75
+1155 y Fs(tab-insert)f(\(M-)401 1153 y Fk(h)p 412 1127
+74 2 v 412 1155 a Fj(T)m(AB)p 412 1162 V 484 1153 a Fk(i)499
+1155 y Fs(\))315 1210 y Ft(Insert)h(a)g(tab)g(c)o(haracter.)75
+1293 y Fs(self-insert)f(\(a,)g(b,)h(A,)g(1,)g(!,)g(...)o(\))315
+1348 y Ft(Insert)g(y)o(ourself.)75 1431 y Fs(transpose-chars)e(\(C-t\))
+315 1486 y Ft(Drag)i(the)h(c)o(haracter)f(b)q(efore)h(the)h(cursor)e
+(forw)o(ard)g(o)o(v)o(er)g(the)h(c)o(haracter)f(at)h(the)g(cursor,)315
+1541 y(mo)o(ving)i(the)f(cursor)h(forw)o(ard)e(as)i(w)o(ell.)28
+b(If)18 b(the)g(insertion)h(p)q(oin)o(t)f(is)g(at)f(the)h(end)h(of)e
+(the)315 1596 y(line,)c(then)e(this)h(transp)q(oses)e(the)h(last)g(t)o
+(w)o(o)f(c)o(haracters)g(of)h(the)g(line.)20 b(Negativ)o(e)11
+b(argumen)o(ts)315 1650 y(ha)o(v)o(e)k(no)g(e\013ect.)75
+1734 y Fs(transpose-words)e(\(M-t\))315 1789 y Ft(Drag)i(the)h(w)o(ord)
+g(b)q(efore)g(p)q(oin)o(t)h(past)f(the)g(w)o(ord)f(after)h(p)q(oin)o
+(t,)g(mo)o(ving)g(p)q(oin)o(t)h(past)f(that)315 1843
+y(w)o(ord)d(as)h(w)o(ell.)21 b(If)14 b(the)g(insertion)i(p)q(oin)o(t)e
+(is)h(at)f(the)g(end)h(of)e(the)i(line,)g(this)g(transp)q(oses)f(the)
+315 1898 y(last)h(t)o(w)o(o)f(w)o(ords)g(on)i(the)f(line.)75
+1981 y Fs(upcase-word)f(\(M-u\))315 2036 y Ft(Upp)q(ercase)j(the)f
+(curren)o(t)g(\(or)f(follo)o(wing\))h(w)o(ord.)22 b(With)16
+b(a)g(negativ)o(e)g(argumen)o(t,)f(upp)q(er-)315 2091
+y(case)g(the)g(previous)h(w)o(ord,)f(but)g(do)g(not)g(mo)o(v)o(e)f(the)
+i(cursor.)75 2174 y Fs(downcase-word)d(\(M-l\))315 2229
+y Ft(Lo)o(w)o(ercase)d(the)h(curren)o(t)g(\(or)f(follo)o(wing\))h(w)o
+(ord.)17 b(With)11 b(a)g(negativ)o(e)g(argumen)o(t,)f(lo)o(w)o(ercase)
+315 2284 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o(v)o(e)f
+(the)h(cursor.)75 2367 y Fs(capitalize-word)e(\(M-c\))315
+2422 y Ft(Capitalize)f(the)f(curren)o(t)f(\(or)g(follo)o(wing\))h(w)o
+(ord.)18 b(With)11 b(a)f(negativ)o(e)h(argumen)o(t,)f(capitalize)315
+2477 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o(v)o(e)f
+(the)h(cursor.)75 2560 y Fs(overwrite-mode)e(\(\))315
+2615 y Ft(T)l(oggle)j(o)o(v)o(erwrite)g(mo)q(de.)24 b(With)17
+b(an)f(explicit)j(p)q(ositiv)o(e)f(n)o(umeric)f(argumen)o(t,)f(switc)o
+(hes)315 2670 y(to)10 b(o)o(v)o(erwrite)g(mo)q(de.)19
+b(With)11 b(an)g(explicit)i(non-p)q(ositiv)o(e)f(n)o(umeric)g(argumen)o
+(t,)e(switc)o(hes)i(to)p eop
+%%Page: 16 20
+16 19 bop 75 -58 a Ft(16)1299 b(GNU)15 b(Readline)h(Library)315
+149 y(insert)g(mo)q(de.)k(This)c(command)f(a\013ects)g(only)h
+Fs(emacs)e Ft(mo)q(de;)h Fs(vi)g Ft(mo)q(de)h(do)q(es)g(o)o(v)o
+(erwrite)315 204 y(di\013eren)o(tly)l(.)21 b(Eac)o(h)15
+b(call)h(to)f Fs(readline\(\))f Ft(starts)f(in)k(insert)e(mo)q(de.)315
+271 y(In)g(o)o(v)o(erwrite)f(mo)q(de,)h(c)o(haracters)f(b)q(ound)h(to)f
+Fs(self-insert)f Ft(replace)j(the)e(text)h(at)e(p)q(oin)o(t)315
+326 y(rather)20 b(than)h(pushing)h(the)f(text)f(to)g(the)h(righ)o(t.)36
+b(Characters)20 b(b)q(ound)i(to)e Fs(backward-)315 381
+y(delete-char)14 b Ft(replace)i(the)f(c)o(haracter)g(b)q(efore)g(p)q
+(oin)o(t)h(with)f(a)g(space.)315 448 y(By)g(default,)h(this)f(command)g
+(is)h(un)o(b)q(ound.)75 559 y Fh(1.4.4)30 b(Killing)20
+b(And)h(Y)-5 b(anking)75 680 y Fs(kill-line)14 b(\(C-k\))315
+735 y Ft(Kill)j(the)f(text)e(from)h(p)q(oin)o(t)h(to)e(the)h(end)h(of)f
+(the)g(line.)75 814 y Fs(backward-kill-line)e(\(C-x)h(Rubout\))315
+869 y Ft(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g
+(line.)75 948 y Fs(unix-line-discard)e(\(C-u\))315 1003
+y Ft(Kill)k(bac)o(kw)o(ard)e(from)f(the)i(cursor)e(to)h(the)g(b)q
+(eginning)j(of)c(the)i(curren)o(t)f(line.)75 1082 y Fs(kill-whole-line)
+e(\(\))315 1137 y Ft(Kill)20 b(all)g(c)o(haracters)d(on)h(the)h(curren)
+o(t)f(line,)i(no)e(matter)g(where)g(p)q(oin)o(t)h(is.)29
+b(By)19 b(default,)315 1192 y(this)d(is)f(un)o(b)q(ound.)75
+1271 y Fs(kill-word)f(\(M-d\))315 1325 y Ft(Kill)j(from)d(p)q(oin)o(t)h
+(to)f(the)h(end)g(of)f(the)h(curren)o(t)g(w)o(ord,)e(or)i(if)g(b)q(et)o
+(w)o(een)g(w)o(ords,)e(to)i(the)f(end)315 1380 y(of)h(the)g(next)g(w)o
+(ord.)20 b(W)l(ord)14 b(b)q(oundaries)j(are)e(the)g(same)g(as)g
+Fs(forward-word)p Ft(.)75 1459 y Fs(backward-kill-word)e(\(M-)592
+1457 y Fk(h)p 603 1431 73 2 v 603 1459 a Fj(DEL)p 603
+1467 V 674 1457 a Fk(i)689 1459 y Fs(\))315 1514 y Ft(Kill)k(the)d(w)o
+(ord)g(b)q(ehind)i(p)q(oin)o(t.)21 b(W)l(ord)14 b(b)q(oundaries)h(are)f
+(the)h(same)f(as)g Fs(backward-word)p Ft(.)75 1593 y
+Fs(unix-word-rubout)f(\(C-w\))315 1648 y Ft(Kill)18 b(the)e(w)o(ord)f
+(b)q(ehind)j(p)q(oin)o(t,)e(using)h(white)f(space)g(as)g(a)f(w)o(ord)g
+(b)q(oundary)l(.)23 b(The)16 b(killed)315 1703 y(text)f(is)g(sa)o(v)o
+(ed)g(on)g(the)h(kill-ring.)75 1782 y Fs(delete-horizontal-space)c
+(\(\))315 1836 y Ft(Delete)k(all)g(spaces)f(and)h(tabs)e(around)i(p)q
+(oin)o(t.)k(By)15 b(default,)h(this)f(is)h(un)o(b)q(ound.)75
+1915 y Fs(kill-region)e(\(\))315 1970 y Ft(Kill)j(the)f(text)e(in)i
+(the)g(curren)o(t)f(region.)20 b(By)15 b(default,)h(this)f(command)g
+(is)h(un)o(b)q(ound.)75 2049 y Fs(copy-region-as-kill)d(\(\))315
+2104 y Ft(Cop)o(y)j(the)i(text)e(in)i(the)f(region)g(to)g(the)g(kill)h
+(bu\013er,)f(so)g(it)g(can)g(b)q(e)h(y)o(ank)o(ed)f(righ)o(t)g(a)o(w)o
+(a)o(y)l(.)315 2159 y(By)e(default,)h(this)f(command)g(is)h(un)o(b)q
+(ound.)75 2238 y Fs(copy-backward-word)d(\(\))315 2293
+y Ft(Cop)o(y)19 b(the)g(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(to)e(the)i
+(kill)h(bu\013er.)32 b(The)19 b(w)o(ord)g(b)q(oundaries)h(are)f(the)315
+2348 y(same)c(as)g Fs(backward-word)p Ft(.)j(By)d(default,)g(this)h
+(command)f(is)h(un)o(b)q(ound.)75 2427 y Fs(copy-forward-word)d(\(\))
+315 2481 y Ft(Cop)o(y)i(the)h(w)o(ord)e(follo)o(wing)j(p)q(oin)o(t)f
+(to)f(the)g(kill)j(bu\013er.)i(The)c(w)o(ord)f(b)q(oundaries)i(are)e
+(the)315 2536 y(same)g(as)g Fs(forward-word)p Ft(.)j(By)d(default,)h
+(this)f(command)g(is)h(un)o(b)q(ound.)75 2615 y Fs(yank)f(\(C-y\))315
+2670 y Ft(Y)l(ank)g(the)h(top)f(of)f(the)i(kill)h(ring)e(in)o(to)g(the)
+h(bu\013er)f(at)f(p)q(oin)o(t.)p eop
+%%Page: 17 21
+17 20 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(17)75 149 y Fs(yank-pop)14 b(\(M-y\))315 204 y Ft(Rotate)i(the)h
+(kill-ring,)j(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17
+b(can)h(only)g(do)f(this)h(if)f(the)h(prior)315 259 y(command)d(is)h
+Fs(yank)e Ft(or)h Fs(yank-pop)p Ft(.)75 382 y Fh(1.4.5)30
+b(Sp)r(ecifying)20 b(Numeric)h(Argumen)n(ts)75 507 y
+Fs(digit-argument)13 b(\()p Fl(M-0)p Fs(,)i Fl(M-1)p
+Fs(,)f(...)h Fl(M--)p Fs(\))315 562 y Ft(Add)f(this)g(digit)g(to)f(the)
+h(argumen)o(t)e(already)i(accum)o(ulating,)g(or)f(start)f(a)h(new)h
+(argumen)o(t.)315 616 y Fl(M--)h Ft(starts)f(a)h(negativ)o(e)g(argumen)
+o(t.)75 702 y Fs(universal-argument)e(\(\))315 756 y
+Ft(This)g(is)h(another)e(w)o(a)o(y)g(to)g(sp)q(ecify)i(an)f(argumen)o
+(t.)18 b(If)13 b(this)g(command)g(is)g(follo)o(w)o(ed)g(b)o(y)g(one)315
+811 y(or)h(more)h(digits,)g(optionally)h(with)f(a)g(leading)h(min)o(us)
+f(sign,)g(those)g(digits)g(de\014ne)h(the)f(ar-)315 866
+y(gumen)o(t.)k(If)c(the)g(command)f(is)h(follo)o(w)o(ed)g(b)o(y)g
+(digits,)g(executing)g Fs(universal-argument)315 921
+y Ft(again)h(ends)g(the)g(n)o(umeric)h(argumen)o(t,)e(but)h(is)h
+(otherwise)f(ignored.)22 b(As)16 b(a)g(sp)q(ecial)h(case,)315
+976 y(if)g(this)g(command)f(is)h(immediately)h(follo)o(w)o(ed)f(b)o(y)f
+(a)g(c)o(haracter)g(that)g(is)h(neither)g(a)f(digit)315
+1030 y(or)d(min)o(us)i(sign,)f(the)g(argumen)o(t)g(coun)o(t)f(for)h
+(the)g(next)g(command)g(is)g(m)o(ultiplied)j(b)o(y)d(four.)315
+1085 y(The)19 b(argumen)o(t)f(coun)o(t)g(is)h(initially)j(one,)d(so)f
+(executing)i(this)f(function)h(the)e(\014rst)h(time)315
+1140 y(mak)o(es)c(the)h(argumen)o(t)f(coun)o(t)h(four,)f(a)h(second)g
+(time)g(mak)o(es)g(the)g(argumen)o(t)f(coun)o(t)g(six-)315
+1195 y(teen,)g(and)g(so)g(on.)20 b(By)15 b(default,)h(this)f(is)h(not)f
+(b)q(ound)h(to)f(a)g(k)o(ey)l(.)75 1318 y Fh(1.4.6)30
+b(Letting)20 b(Readline)g(T)n(yp)r(e)h(F)-5 b(or)19 b(Y)-5
+b(ou)75 1443 y Fs(complete)14 b(\()305 1441 y Fk(h)p
+317 1414 74 2 v 317 1443 a Fj(T)m(AB)p 317 1450 V 389
+1441 a Fk(i)404 1443 y Fs(\))315 1497 y Ft(A)o(ttempt)c(to)h(p)q
+(erform)g(completion)i(on)e(the)g(text)g(b)q(efore)h(p)q(oin)o(t.)19
+b(The)11 b(actual)h(completion)315 1552 y(p)q(erformed)j(is)h
+(application-sp)q(eci\014)q(c.)23 b(The)15 b(default)h(is)g(\014lename)
+g(completion.)75 1637 y Fs(possible-completions)c(\(M-?\))315
+1692 y Ft(List)k(the)f(p)q(ossible)i(completions)f(of)f(the)g(text)g(b)
+q(efore)h(p)q(oin)o(t.)75 1777 y Fs(insert-completions)d(\(M-*\))315
+1832 y Ft(Insert)j(all)g(completions)g(of)f(the)g(text)g(b)q(efore)h(p)
+q(oin)o(t)f(that)g(w)o(ould)h(ha)o(v)o(e)f(b)q(een)h(generated)315
+1887 y(b)o(y)f Fs(possible-completions)p Ft(.)75 1972
+y Fs(menu-complete)e(\(\))315 2027 y Ft(Similar)g(to)f
+Fs(complete)p Ft(,)f(but)h(replaces)h(the)f(w)o(ord)f(to)g(b)q(e)i
+(completed)f(with)h(a)e(single)j(matc)o(h)315 2082 y(from)k(the)h(list)
+h(of)e(p)q(ossible)j(completions.)32 b(Rep)q(eated)19
+b(execution)h(of)f Fs(menu-complete)315 2136 y Ft(steps)h(through)g
+(the)g(list)h(of)f(p)q(ossible)i(completions,)g(inserting)f(eac)o(h)f
+(matc)o(h)f(in)i(turn.)315 2191 y(A)o(t)d(the)g(end)h(of)f(the)h(list)g
+(of)f(completions,)i(the)e(b)q(ell)j(is)d(rung)h(\(sub)s(ject)f(to)f
+(the)i(setting)315 2246 y(of)f Fs(bell-style)p Ft(\))e(and)i(the)g
+(original)h(text)f(is)g(restored.)28 b(An)19 b(argumen)o(t)e(of)g
+Fi(n)i Ft(mo)o(v)o(es)e Fi(n)315 2301 y Ft(p)q(ositions)h(forw)o(ard)e
+(in)j(the)e(list)h(of)f(matc)o(hes;)h(a)f(negativ)o(e)g(argumen)o(t)g
+(ma)o(y)g(b)q(e)h(used)g(to)315 2356 y(mo)o(v)o(e)g(bac)o(kw)o(ard)h
+(through)g(the)g(list.)32 b(This)20 b(command)f(is)h(in)o(tended)g(to)f
+(b)q(e)h(b)q(ound)g(to)315 2408 y Fk(h)p 327 2382 V 327
+2410 a Fj(T)m(AB)p 327 2418 V 399 2408 a Fk(i)414 2410
+y Ft(,)15 b(but)g(is)h(un)o(b)q(ound)g(b)o(y)f(default.)75
+2496 y Fs(delete-char-or-list)e(\(\))315 2550 y Ft(Deletes)h(the)f(c)o
+(haracter)g(under)h(the)g(cursor)f(if)h(not)f(at)g(the)g(b)q(eginning)j
+(or)d(end)h(of)f(the)g(line)315 2605 y(\(lik)o(e)i Fs(delete-char)p
+Ft(\).)j(If)d(at)f(the)h(end)g(of)f(the)g(line,)i(b)q(eha)o(v)o(es)f
+(iden)o(tically)i(to)d Fs(possible-)315 2660 y(completions)p
+Ft(.)k(This)e(command)f(is)h(un)o(b)q(ound)g(b)o(y)f(default.)p
+eop
+%%Page: 18 22
+18 21 bop 75 -58 a Ft(18)1299 b(GNU)15 b(Readline)h(Library)75
+149 y Fh(1.4.7)30 b(Keyb)r(oard)20 b(Macros)75 272 y
+Fs(start-kbd-macro)13 b(\(C-x)i(\(\))315 327 y Ft(Begin)h(sa)o(ving)f
+(the)h(c)o(haracters)e(t)o(yp)q(ed)i(in)o(to)f(the)g(curren)o(t)g(k)o
+(eyb)q(oard)g(macro.)75 409 y Fs(end-kbd-macro)e(\(C-x)i(\)\))315
+464 y Ft(Stop)f(sa)o(ving)f(the)h(c)o(haracters)f(t)o(yp)q(ed)h(in)o
+(to)f(the)h(curren)o(t)g(k)o(eyb)q(oard)f(macro)g(and)h(sa)o(v)o(e)f
+(the)315 519 y(de\014nition.)75 600 y Fs(call-last-kbd-macro)g(\(C-x)h
+(e\))315 655 y Ft(Re-execute)k(the)g(last)f(k)o(eyb)q(oard)h(macro)f
+(de\014ned,)i(b)o(y)e(making)h(the)g(c)o(haracters)e(in)j(the)315
+710 y(macro)14 b(app)q(ear)i(as)f(if)g(t)o(yp)q(ed)h(at)e(the)i(k)o
+(eyb)q(oard.)75 826 y Fh(1.4.8)30 b(Some)20 b(Miscellaneous)h(Commands)
+75 949 y Fs(re-read-init-file)13 b(\(C-x)h(C-r\))315
+1004 y Ft(Read)d(in)g(the)g(con)o(ten)o(ts)g(of)f(the)h
+Fi(inputrc)k Ft(\014le,)d(and)g(incorp)q(orate)f(an)o(y)f(bindings)j
+(or)e(v)m(ariable)315 1058 y(assignmen)o(ts)k(found)h(there.)75
+1140 y Fs(abort)e(\(C-g\))315 1195 y Ft(Ab)q(ort)f(the)g(curren)o(t)h
+(editing)g(command)f(and)h(ring)f(the)h(terminal's)f(b)q(ell)i(\(sub)s
+(ject)e(to)g(the)315 1250 y(setting)i(of)g Fs(bell-style)p
+Ft(\).)75 1331 y Fs(do-uppercase-version)d(\(M-a,)j(M-b,)f(M-)p
+Fl(x)p Fs(,)h(...\))315 1386 y Ft(If)f(the)g(meta\014ed)g(c)o(haracter)
+f Fi(x)k Ft(is)d(lo)o(w)o(ercase,)g(run)g(the)g(command)f(that)h(is)g
+(b)q(ound)h(to)e(the)315 1441 y(corresp)q(onding)j(upp)q(ercase)g(c)o
+(haracter.)75 1523 y Fs(prefix-meta)e(\()377 1521 y Fk(h)p
+389 1494 70 2 v 389 1523 a Fj(ESC)p 389 1530 V 456 1521
+a Fk(i)471 1523 y Fs(\))315 1577 y Ft(Metafy)k(the)h(next)g(c)o
+(haracter)f(t)o(yp)q(ed.)30 b(This)20 b(is)f(for)f(k)o(eyb)q(oards)h
+(without)g(a)f(meta)g(k)o(ey)l(.)315 1632 y(T)o(yping)e(`)485
+1630 y Fk(h)p 496 1604 V 496 1632 a Fj(ESC)p 496 1640
+V 563 1630 a Fk(i)593 1632 y Fs(f)p Ft(')f(is)h(equiv)m(alen)o(t)h(to)d
+(t)o(yping)i Fl(M-f)p Ft(.)75 1714 y Fs(undo)f(\(C-_)f(or)h(C-x)g
+(C-u\))315 1769 y Ft(Incremen)o(tal)h(undo,)f(separately)h(remem)o(b)q
+(ered)g(for)e(eac)o(h)h(line.)75 1850 y Fs(revert-line)f(\(M-r\))315
+1905 y Ft(Undo)j(all)g(c)o(hanges)g(made)f(to)g(this)h(line.)26
+b(This)17 b(is)g(lik)o(e)h(executing)f(the)g Fs(undo)f
+Ft(command)315 1960 y(enough)g(times)f(to)g(get)f(bac)o(k)h(to)g(the)g
+(b)q(eginning.)75 2041 y Fs(tilde-expand)f(\(M-~\))315
+2096 y Ft(P)o(erform)g(tilde)j(expansion)f(on)f(the)g(curren)o(t)g(w)o
+(ord.)75 2178 y Fs(set-mark)f(\(C-@\))315 2233 y Ft(Set)i(the)h(mark)f
+(to)f(the)i(p)q(oin)o(t.)24 b(If)17 b(a)f(n)o(umeric)h(argumen)o(t)f
+(is)g(supplied,)j(the)e(mark)e(is)i(set)315 2287 y(to)e(that)f(p)q
+(osition.)75 2369 y Fs(exchange-point-and-mark)e(\(C-x)j(C-x\))315
+2424 y Ft(Sw)o(ap)g(the)h(p)q(oin)o(t)g(with)g(the)g(mark.)k(The)c
+(curren)o(t)f(cursor)h(p)q(osition)g(is)g(set)g(to)f(the)g(sa)o(v)o(ed)
+315 2479 y(p)q(osition,)h(and)f(the)h(old)f(cursor)g(p)q(osition)h(is)g
+(sa)o(v)o(ed)f(as)g(the)g(mark.)75 2560 y Fs(character-search)e
+(\(C-]\))315 2615 y Ft(A)f(c)o(haracter)g(is)h(read)g(and)f(p)q(oin)o
+(t)h(is)g(mo)o(v)o(ed)f(to)g(the)g(next)h(o)q(ccurrence)g(of)f(that)g
+(c)o(haracter.)315 2670 y(A)j(negativ)o(e)h(coun)o(t)f(searc)o(hes)g
+(for)f(previous)i(o)q(ccurrences.)p eop
+%%Page: 19 23
+19 22 bop 75 -58 a Ft(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(19)75 149 y Fs(character-search-backward)12 b(\(M-C-]\))315
+204 y Ft(A)22 b(c)o(haracter)g(is)h(read)f(and)h(p)q(oin)o(t)g(is)g(mo)
+o(v)o(ed)f(to)g(the)g(previous)h(o)q(ccurrence)h(of)e(that)315
+259 y(c)o(haracter.)d(A)c(negativ)o(e)h(coun)o(t)f(searc)o(hes)g(for)f
+(subsequen)o(t)i(o)q(ccurrences.)75 339 y Fs(insert-comment)d(\(M-#\))
+315 394 y Ft(Without)18 b(a)f(n)o(umeric)i(argumen)o(t,)e(the)h(v)m
+(alue)h(of)f(the)f Fs(comment-begin)f Ft(v)m(ariable)k(is)e(in-)315
+448 y(serted)e(at)f(the)h(b)q(eginning)i(of)d(the)h(curren)o(t)g(line.)
+23 b(If)16 b(a)g(n)o(umeric)h(argumen)o(t)e(is)h(supplied,)315
+503 y(this)j(command)f(acts)g(as)f(a)h(toggle:)26 b(if)19
+b(the)f(c)o(haracters)g(at)f(the)i(b)q(eginning)h(of)e(the)g(line)315
+558 y(do)d(not)g(matc)o(h)g(the)g(v)m(alue)i(of)e Fs(comment-begin)p
+Ft(,)e(the)i(v)m(alue)i(is)f(inserted,)f(otherwise)h(the)315
+613 y(c)o(haracters)j(in)i Fs(comment-begin)d Ft(are)i(deleted)i(from)d
+(the)h(b)q(eginning)i(of)e(the)g(line.)36 b(In)315 667
+y(either)16 b(case,)f(the)g(line)i(is)f(accepted)f(as)g(if)h(a)f
+(newline)i(had)e(b)q(een)i(t)o(yp)q(ed.)75 747 y Fs(dump-functions)c
+(\(\))315 802 y Ft(Prin)o(t)g(all)h(of)f(the)g(functions)h(and)g(their)
+g(k)o(ey)f(bindings)i(to)d(the)i(Readline)g(output)f(stream.)315
+857 y(If)j(a)g(n)o(umeric)g(argumen)o(t)f(is)i(supplied,)h(the)e
+(output)f(is)i(formatted)d(in)j(suc)o(h)f(a)g(w)o(a)o(y)f(that)315
+912 y(it)g(can)h(b)q(e)g(made)f(part)f(of)h(an)g Fi(inputrc)k
+Ft(\014le.)i(This)16 b(command)f(is)h(un)o(b)q(ound)g(b)o(y)f(default.)
+75 991 y Fs(dump-variables)e(\(\))315 1046 y Ft(Prin)o(t)e(all)g(of)f
+(the)h(settable)g(v)m(ariables)h(and)f(their)g(v)m(alues)h(to)e(the)h
+(Readline)h(output)e(stream.)315 1101 y(If)16 b(a)g(n)o(umeric)g
+(argumen)o(t)f(is)i(supplied,)h(the)e(output)f(is)i(formatted)d(in)j
+(suc)o(h)f(a)g(w)o(a)o(y)f(that)315 1156 y(it)g(can)h(b)q(e)g(made)f
+(part)f(of)h(an)g Fi(inputrc)k Ft(\014le.)i(This)16 b(command)f(is)h
+(un)o(b)q(ound)g(b)o(y)f(default.)75 1235 y Fs(dump-macros)f(\(\))315
+1290 y Ft(Prin)o(t)j(all)h(of)e(the)h(Readline)h(k)o(ey)f(sequences)h
+(b)q(ound)g(to)e(macros)g(and)h(the)g(strings)g(they)315
+1345 y(output.)26 b(If)18 b(a)f(n)o(umeric)h(argumen)o(t)f(is)h
+(supplied,)i(the)d(output)g(is)h(formatted)e(in)j(suc)o(h)e(a)315
+1400 y(w)o(a)o(y)d(that)g(it)i(can)f(b)q(e)g(made)g(part)g(of)f(an)h
+Fi(inputrc)k Ft(\014le.)i(This)15 b(command)g(is)h(un)o(b)q(ound)g(b)o
+(y)315 1455 y(default.)75 1534 y Fs(emacs-editing-mode)d(\(C-e\))315
+1589 y Ft(When)j(in)g Fs(vi)e Ft(command)i(mo)q(de,)f(this)g(causes)h
+(a)f(switc)o(h)g(to)g Fs(emacs)f Ft(editing)j(mo)q(de.)75
+1669 y Fs(vi-editing-mode)c(\(M-C-j\))315 1724 y Ft(When)j(in)g
+Fs(emacs)e Ft(editing)j(mo)q(de,)e(this)g(causes)h(a)f(switc)o(h)g(to)g
+Fs(vi)f Ft(editing)j(mo)q(de.)75 1852 y Fr(1.5)33 b(Readline)23
+b(vi)h(Mo)r(de)137 1974 y Ft(While)13 b(the)f(Readline)i(library)e(do)q
+(es)g(not)g(ha)o(v)o(e)f(a)h(full)h(set)f(of)f Fs(vi)g
+Ft(editing)j(functions,)f(it)f(do)q(es)g(con)o(tain)75
+2029 y(enough)17 b(to)g(allo)o(w)g(simple)h(editing)h(of)d(the)i(line.)
+27 b(The)17 b(Readline)h Fs(vi)f Ft(mo)q(de)g(b)q(eha)o(v)o(es)g(as)g
+(sp)q(eci\014ed)i(in)75 2084 y(the)c Fm(posix)g Ft(1003.2)f(standard.)
+137 2151 y(In)h(order)g(to)f(switc)o(h)g(in)o(teractiv)o(ely)i(b)q(et)o
+(w)o(een)f Fs(emacs)e Ft(and)i Fs(vi)f Ft(editing)i(mo)q(des,)f(use)f
+(the)h(command)75 2206 y Fl(M-C-j)j Ft(\(b)q(ound)i(to)e
+(emacs-editing-mo)q(de)j(when)e(in)h Fs(vi)f Ft(mo)q(de)g(and)g(to)f
+(vi-editing-mo)q(de)k(in)e Fs(emacs)75 2261 y Ft(mo)q(de\).)g(The)15
+b(Readline)i(default)f(is)f Fs(emacs)g Ft(mo)q(de.)137
+2328 y(When)h(y)o(ou)e(en)o(ter)h(a)g(line)i(in)e Fs(vi)g
+Ft(mo)q(de,)g(y)o(ou)g(are)f(already)i(placed)g(in)g(`insertion')f(mo)q
+(de,)g(as)g(if)g(y)o(ou)75 2383 y(had)e(t)o(yp)q(ed)h(an)f(`)p
+Fs(i)p Ft('.)18 b(Pressing)608 2381 y Fk(h)p 620 2355
+70 2 v 620 2383 a Fj(ESC)p 620 2390 V 687 2381 a Fk(i)715
+2383 y Ft(switc)o(hes)13 b(y)o(ou)g(in)o(to)g(`command')f(mo)q(de,)i
+(where)f(y)o(ou)g(can)g(edit)h(the)75 2438 y(text)i(of)h(the)g(line)h
+(with)g(the)f(standard)f Fs(vi)h Ft(mo)o(v)o(emen)o(t)f(k)o(eys,)g(mo)o
+(v)o(e)g(to)h(previous)g(history)g(lines)i(with)75 2492
+y(`)p Fs(k)p Ft(')14 b(and)i(subsequen)o(t)f(lines)i(with)f(`)p
+Fs(j)p Ft(',)e(and)h(so)g(forth.)p eop
+%%Page: 20 24
+20 23 bop 75 -58 a Ft(20)1299 b(GNU)15 b(Readline)h(Library)p
+eop
+%%Page: 21 25
+21 24 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(21)75 149 y Fp(2)41 b(Programming)28
+b(with)e(GNU)i(Readline)137 264 y Ft(This)18 b(c)o(hapter)f(describ)q
+(es)h(the)f(in)o(terface)g(b)q(et)o(w)o(een)h(the)f Fm(gnu)g
+Ft(Readline)h(Library)f(and)g(other)g(pro-)75 318 y(grams.)h(If)11
+b(y)o(ou)g(are)g(a)g(programmer,)f(and)i(y)o(ou)f(wish)g(to)g(include)j
+(the)d(features)g(found)g(in)i Fm(gnu)e Ft(Readline)75
+373 y(suc)o(h)h(as)f(completion,)h(line)h(editing,)g(and)f(in)o
+(teractiv)o(e)g(history)f(manipulation)i(in)f(y)o(our)f(o)o(wn)g
+(programs,)75 428 y(this)16 b(section)f(is)h(for)f(y)o(ou.)75
+555 y Fr(2.1)33 b(Basic)22 b(Beha)n(vior)137 676 y Ft(Man)o(y)15
+b(programs)f(pro)o(vide)i(a)f(command)g(line)i(in)o(terface,)e(suc)o(h)
+h(as)f Fs(mail)p Ft(,)f Fs(ftp)p Ft(,)h(and)g Fs(sh)p
+Ft(.)20 b(F)l(or)15 b(suc)o(h)75 731 y(programs,)e(the)h(default)h(b)q
+(eha)o(viour)g(of)f(Readline)i(is)e(su\016cien)o(t.)21
+b(This)14 b(section)h(describ)q(es)h(ho)o(w)e(to)g(use)75
+786 y(Readline)k(in)h(the)e(simplest)h(w)o(a)o(y)e(p)q(ossible,)j(p)q
+(erhaps)f(to)f(replace)h(calls)g(in)g(y)o(our)f(co)q(de)h(to)e
+Fs(gets\(\))g Ft(or)75 841 y Fs(fgets\(\))p Ft(.)137
+907 y(The)h(function)g Fs(readline\(\))e Ft(prin)o(ts)h(a)g(prompt)g
+Fi(prompt)h Ft(and)f(then)h(reads)f(and)h(returns)f(a)g(single)75
+962 y(line)i(of)e(text)g(from)f(the)i(user.)23 b(If)17
+b Fi(prompt)g Ft(is)g Fs(NULL)e Ft(or)h(the)h(empt)o(y)f(string,)g(no)g
+(prompt)g(is)h(displa)o(y)o(ed.)75 1017 y(The)i(line)h
+Fs(readline)d Ft(returns)i(is)g(allo)q(cated)g(with)g
+Fs(malloc\(\))p Ft(;)g(the)g(caller)g(should)h Fs(free\(\))e
+Ft(the)g(line)75 1072 y(when)e(it)f(has)g(\014nished)i(with)f(it.)k
+(The)15 b(declaration)h(for)f Fs(readline)f Ft(in)i(ANSI)g(C)f(is)195
+1138 y Fs(char)23 b(*readline)g(\(const)g(char)g(*)p
+Fl(prompt)5 b Fs(\);)75 1205 y Ft(So,)15 b(one)g(migh)o(t)g(sa)o(y)195
+1272 y Fs(char)23 b(*line)g(=)h(readline)f(\("Enter)g(a)h(line:)f("\);)
+75 1338 y Ft(in)12 b(order)f(to)g(read)h(a)f(line)i(of)e(text)g(from)f
+(the)i(user.)19 b(The)11 b(line)j(returned)d(has)h(the)f(\014nal)h
+(newline)i(remo)o(v)o(ed,)75 1393 y(so)h(only)h(the)f(text)g(remains.)
+137 1460 y(If)21 b Fs(readline)e Ft(encoun)o(ters)h(an)g
+Fs(EOF)g Ft(while)i(reading)f(the)f(line,)j(and)d(the)h(line)g(is)g
+(empt)o(y)f(at)g(that)75 1515 y(p)q(oin)o(t,)15 b(then)g
+Fs(\(char)f(*\)NULL)g Ft(is)h(returned.)21 b(Otherwise,)15
+b(the)g(line)h(is)f(ended)h(just)e(as)h(if)g(a)f(newline)j(had)75
+1570 y(b)q(een)f(t)o(yp)q(ed.)137 1636 y(If)d(y)o(ou)g(w)o(an)o(t)f
+(the)h(user)g(to)f(b)q(e)i(able)g(to)e(get)g(at)h(the)g(line)h(later,)f
+(\(with)1325 1634 y Fk(h)p 1338 1608 57 2 v 1338 1636
+a Fj(C-p)p 1338 1644 V 1392 1634 a Fk(i)1420 1636 y Ft(for)f
+(example\),)i(y)o(ou)f(m)o(ust)75 1691 y(call)j Fs(add_history\(\))e
+Ft(to)g(sa)o(v)o(e)h(the)g(line)i(a)o(w)o(a)o(y)d(in)i(a)e
+Fi(history)19 b Ft(list)d(of)f(suc)o(h)h(lines.)195 1758
+y Fs(add_history)22 b(\(line\);)75 1824 y Ft(F)l(or)15
+b(full)h(details)g(on)f(the)h(GNU)f(History)g(Library)l(,)g(see)h(the)f
+(asso)q(ciated)g(man)o(ual.)137 1891 y(It)h(is)g(preferable)h(to)e(a)o
+(v)o(oid)g(sa)o(ving)h(empt)o(y)f(lines)i(on)f(the)g(history)f(list,)i
+(since)f(users)g(rarely)g(ha)o(v)o(e)f(a)75 1946 y(burning)h(need)g(to)
+e(reuse)h(a)g(blank)g(line.)22 b(Here)15 b(is)g(a)g(function)g(whic)o
+(h)h(usefully)h(replaces)e(the)g(standard)75 2001 y Fs(gets\(\))f
+Ft(library)i(function,)g(and)f(has)g(the)h(adv)m(an)o(tage)e(of)h(no)g
+(static)g(bu\013er)g(to)g(o)o(v)o(er\015o)o(w:)195 2067
+y Fs(/*)24 b(A)f(static)g(variable)g(for)h(holding)e(the)i(line.)f(*/)
+195 2122 y(static)g(char)g(*line_read)g(=)h(\(char)f(*\)NULL;)195
+2232 y(/*)h(Read)f(a)h(string,)f(and)g(return)g(a)h(pointer)f(to)g(it.)
+267 2286 y(Returns)f(NULL)i(on)f(EOF.)h(*/)195 2341 y(char)f(*)195
+2396 y(rl_gets)g(\(\))195 2451 y({)243 2506 y(/*)g(If)h(the)f(buffer)g
+(has)h(already)f(been)g(allocated,)314 2560 y(return)g(the)h(memory)f
+(to)g(the)h(free)f(pool.)g(*/)243 2615 y(if)g(\(line_read\))290
+2670 y({)p eop
+%%Page: 22 26
+22 25 bop 75 -58 a Ft(22)1299 b(GNU)15 b(Readline)h(Library)338
+149 y Fs(free)23 b(\(line_read\);)338 204 y(line_read)g(=)h(\(char)f
+(*\)NULL;)290 259 y(})243 369 y(/*)g(Get)h(a)f(line)h(from)f(the)h
+(user.)f(*/)243 423 y(line_read)f(=)i(readline)f(\(""\);)243
+533 y(/*)g(If)h(the)f(line)h(has)f(any)h(text)f(in)g(it,)314
+588 y(save)h(it)f(on)h(the)f(history.)g(*/)243 643 y(if)g(\(line_read)g
+(&&)g(*line_read\))290 697 y(add_history)g(\(line_read\);)243
+807 y(return)g(\(line_read\);)195 862 y(})137 927 y Ft(This)13
+b(function)f(giv)o(es)h(the)e(user)h(the)g(default)h(b)q(eha)o(viour)g
+(of)1169 925 y Fk(h)p 1181 899 74 2 v 1181 927 a Fj(T)m(AB)p
+1181 935 V 1253 925 a Fk(i)1280 927 y Ft(completion:)19
+b(completion)13 b(on)f(\014le)75 982 y(names.)20 b(If)c(y)o(ou)f(do)g
+(not)g(w)o(an)o(t)f(Readline)j(to)d(complete)j(on)e(\014lenames,)h(y)o
+(ou)f(can)g(c)o(hange)h(the)f(binding)75 1037 y(of)g(the)205
+1035 y Fk(h)p 217 1009 V 217 1037 a Fj(T)m(AB)p 217 1044
+V 289 1035 a Fk(i)319 1037 y Ft(k)o(ey)g(with)h Fs(rl_bind_key\(\))p
+Ft(.)195 1102 y Fs(int)23 b(rl_bind_key)g(\(int)g Fl(key)p
+Fs(,)g(rl_command_func_t)f(*)p Fl(function)5 b Fs(\);)137
+1168 y(rl_bind_key\(\))15 b Ft(tak)o(es)h(t)o(w)o(o)g(argumen)o(ts:)22
+b Fi(k)o(ey)e Ft(is)e(the)e(c)o(haracter)g(that)g(y)o(ou)h(w)o(an)o(t)f
+(to)g(bind,)i(and)75 1222 y Fi(function)h Ft(is)f(the)g(address)g(of)g
+(the)g(function)g(to)g(call)h(when)f Fi(k)o(ey)k Ft(is)c(pressed.)29
+b(Binding)1628 1220 y Fk(h)p 1641 1194 V 1641 1222 a
+Fj(T)m(AB)p 1641 1230 V 1712 1220 a Fk(i)1745 1222 y
+Ft(to)17 b Fs(rl_)75 1277 y(insert\(\))f Ft(mak)o(es)422
+1275 y Fk(h)p 434 1249 V 434 1277 a Fj(T)m(AB)p 434 1285
+V 506 1275 a Fk(i)539 1277 y Ft(insert)i(itself.)28 b
+Fs(rl_bind_key\(\))15 b Ft(returns)j(non-zero)g(if)g
+Fi(k)o(ey)j Ft(is)d(not)f(a)g(v)m(alid)75 1332 y(ASCI)q(I)f(c)o
+(haracter)f(co)q(de)h(\(b)q(et)o(w)o(een)f(0)g(and)g(255\).)137
+1398 y(Th)o(us,)g(to)g(disable)h(the)g(default)703 1396
+y Fk(h)p 716 1370 V 716 1398 a Fj(T)m(AB)p 716 1405 V
+787 1396 a Fk(i)817 1398 y Ft(b)q(eha)o(vior,)g(the)f(follo)o(wing)h
+(su\016ces:)195 1463 y Fs(rl_bind_key)22 b(\('\\t',)h(rl_insert\);)137
+1528 y Ft(This)14 b(co)q(de)g(should)g(b)q(e)g(executed)g(once)g(at)e
+(the)h(start)f(of)h(y)o(our)g(program;)f(y)o(ou)h(migh)o(t)g(write)g(a)
+g(func-)75 1583 y(tion)k(called)h Fs(initialize_readline\(\))13
+b Ft(whic)o(h)k(p)q(erforms)f(this)h(and)g(other)f(desired)h
+(initializations,)75 1638 y(suc)o(h)f(as)e(installing)k(custom)c
+(completers)i(\(see)f(Section)h(2.6)f([Custom)f(Completers],)g(page)h
+(41\).)75 1761 y Fr(2.2)33 b(Custom)21 b(F)-6 b(unctions)137
+1882 y Ft(Readline)14 b(pro)o(vides)f(man)o(y)e(functions)i(for)f
+(manipulating)i(the)e(text)g(of)g(the)g(line,)i(but)e(it)h(isn't)f(p)q
+(ossi-)75 1936 y(ble)i(to)f(an)o(ticipate)h(the)f(needs)h(of)f(all)h
+(programs.)k(This)13 b(section)h(describ)q(es)h(the)e(v)m(arious)h
+(functions)g(and)75 1991 y(v)m(ariables)g(de\014ned)h(within)f(the)f
+(Readline)i(library)e(whic)o(h)h(allo)o(w)g(a)e(user)h(program)f(to)h
+(add)g(customized)75 2046 y(functionalit)o(y)j(to)f(Readline.)137
+2111 y(Before)j(declaring)i(an)o(y)e(functions)h(that)f(customize)g
+(Readline's)h(b)q(eha)o(vior,)h(or)d(using)i(an)o(y)f(func-)75
+2166 y(tionalit)o(y)23 b(Readline)h(pro)o(vides)g(in)f(other)g(co)q
+(de,)h(an)f(application)i(writer)d(should)i(include)h(the)e(\014le)75
+2221 y Fs(<readline/readline.h>)14 b Ft(in)j(an)o(y)g(\014le)h(that)e
+(uses)h(Readline's)g(features.)24 b(Since)19 b(some)d(of)g(the)h
+(de\014-)75 2276 y(nitions)g(in)f Fs(readline.h)e Ft(use)i(the)g
+Fs(stdio)f Ft(library)l(,)h(the)g(\014le)g Fs(<stdio.h>)f
+Ft(should)h(b)q(e)g(included)j(b)q(efore)75 2331 y Fs(readline.h)p
+Ft(.)137 2396 y Fs(readline.h)14 b Ft(de\014nes)i(a)f(C)h(prepro)q
+(cessor)f(v)m(ariable)i(that)d(should)i(b)q(e)g(treated)f(as)g(an)g(in)
+o(teger,)g Fs(RL_)75 2451 y(READLINE_VERSION)p Ft(,)9
+b(whic)o(h)j(ma)o(y)f(b)q(e)g(used)h(to)e(conditionally)k(compile)e
+(application)h(co)q(de)f(dep)q(ending)75 2506 y(on)17
+b(the)h(installed)h(Readline)g(v)o(ersion.)27 b(The)18
+b(v)m(alue)h(is)f(a)f(hexadecimal)i(enco)q(ding)g(of)e(the)h(ma)s(jor)e
+(and)75 2560 y(minor)h(v)o(ersion)h(n)o(um)o(b)q(ers)f(of)g(the)g
+(library)l(,)h(of)f(the)g(form)f(0x)p Fi(MMmm)p Ft(.)25
+b Fi(MM)c Ft(is)c(the)h(t)o(w)o(o-digit)e(ma)s(jor)75
+2615 y(v)o(ersion)f(n)o(um)o(b)q(er;)f Fi(mm)h Ft(is)g(the)f(t)o(w)o
+(o-digit)g(minor)h(v)o(ersion)g(n)o(um)o(b)q(er.)20 b(F)l(or)14
+b(Readline)h(4.2,)f(for)f(example,)75 2670 y(the)i(v)m(alue)i(of)d
+Fs(RL_READLINE_VERSION)f Ft(w)o(ould)j(b)q(e)f Fs(0x0402)p
+Ft(.)p eop
+%%Page: 23 27
+23 26 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(23)75 149 y Fh(2.2.1)30 b(Readline)20
+b(T)n(yp)r(edefs)137 270 y Ft(F)l(or)15 b(readabilt)o(y)l(,)g(w)o(e)g
+(declare)i(a)d(n)o(um)o(b)q(er)i(of)f(new)g(ob)s(ject)g(t)o(yp)q(es,)g
+(all)h(p)q(oin)o(ters)f(to)g(functions.)137 336 y(The)j(reason)g(for)f
+(declaring)i(these)f(new)g(t)o(yp)q(es)g(is)h(to)e(mak)o(e)g(it)h
+(easier)h(to)e(write)h(co)q(de)g(describing)75 391 y(p)q(oin)o(ters)e
+(to)e(C)h(functions)h(with)g(appropriately)f(protot)o(yp)q(ed)g
+(argumen)o(ts)g(and)g(return)g(v)m(alues.)137 457 y(F)l(or)j(instance,)
+i(sa)o(y)e(w)o(e)g(w)o(an)o(t)f(to)h(declare)h(a)f(v)m(ariable)i
+Fi(func)i Ft(as)c(a)g(p)q(oin)o(ter)h(to)f(a)g(function)h(whic)o(h)75
+511 y(tak)o(es)12 b(t)o(w)o(o)g Fs(int)g Ft(argumen)o(ts)g(and)h
+(returns)g(an)g Fs(int)f Ft(\(this)h(is)g(the)g(t)o(yp)q(e)g(of)g(all)g
+(of)g(the)g(Readline)h(bindable)75 566 y(functions\).)20
+b(Instead)c(of)f(the)g(classic)h(C)f(declaration)137
+632 y Fs(int)g(\(*func\)\(\);)75 698 y Ft(or)g(the)g(ANSI-C)h(st)o(yle)
+f(declaration)137 764 y Fs(int)g(\(*func\)\(int,)f(int\);)75
+830 y Ft(w)o(e)h(ma)o(y)f(write)137 896 y Fs(rl_command_func_t)f
+(*func;)137 961 y Ft(The)j(full)g(list)g(of)f(function)h(p)q(oin)o(ter)
+g(t)o(yp)q(es)f(a)o(v)m(ailable)i(is)75 1038 y Fs(typedef)d(int)h
+(rl_command_func_t)e(\(int,)h(int\);)75 1093 y(typedef)g(char)h
+(*rl_compentry_func_t)d(\(const)j(char)f(*,)h(int\);)75
+1148 y(typedef)f(char)h(**rl_completion_func_t)d(\(const)i(char)h(*,)g
+(int,)f(int\);)75 1203 y(typedef)g(char)h(*rl_quote_func_t)e(\(char)h
+(*,)h(int,)g(char)f(*\);)75 1258 y(typedef)g(char)h(*rl_dequote_func_t)
+d(\(char)j(*,)g(int\);)75 1312 y(typedef)f(int)h(rl_compignore_func_t)d
+(\(char)j(**\);)75 1367 y(typedef)f(void)h(rl_compdisp_func_t)d(\(char)
+j(**,)g(int,)f(int\);)75 1422 y(typedef)g(int)h(rl_hook_func_t)e
+(\(void\);)75 1477 y(typedef)h(int)h(rl_getc_func_t)e(\(FILE)i(*\);)75
+1531 y(typedef)f(int)h(rl_linebuf_func_t)e(\(char)h(*,)h(int\);)75
+1586 y(typedef)f(int)h(rl_intfunc_t)e(\(int\);)75 1641
+y(#define)h(rl_ivoidfunc_t)f(rl_hook_func_t)75 1696 y(typedef)h(int)h
+(rl_icpfunc_t)e(\(char)i(*\);)75 1751 y(typedef)f(int)h(rl_icppfunc_t)e
+(\(char)i(**\);)75 1805 y(typedef)f(void)h(rl_voidfunc_t)e(\(void\);)75
+1860 y(typedef)h(void)h(rl_vintfunc_t)e(\(int\);)75 1915
+y(typedef)h(void)h(rl_vcpfunc_t)e(\(char)i(*\);)75 1970
+y(typedef)f(void)h(rl_vcppfunc_t)e(\(char)i(**\);)75
+2067 y Fh(2.2.2)30 b(W)-5 b(riting)20 b(a)h(New)f(F)-5
+b(unction)137 2187 y Ft(In)17 b(order)f(to)f(write)h(new)h(functions)g
+(for)e(Readline,)i(y)o(ou)f(need)h(to)e(kno)o(w)h(the)g(calling)i(con)o
+(v)o(en)o(tions)75 2242 y(for)g(k)o(eyb)q(oard-in)o(v)o(ok)o(ed)h
+(functions,)g(and)g(the)f(names)h(of)f(the)g(v)m(ariables)i(that)d
+(describ)q(e)k(the)d(curren)o(t)75 2297 y(state)c(of)h(the)g(line)i
+(read)e(so)g(far.)137 2363 y(The)h(calling)h(sequence)f(for)f(a)f
+(command)i Fs(foo)e Ft(lo)q(oks)i(lik)o(e)195 2429 y
+Fs(int)23 b(foo)h(\(int)f(count,)g(int)h(key\))75 2495
+y Ft(where)18 b Fi(coun)o(t)h Ft(is)f(the)g(n)o(umeric)h(argumen)o(t)e
+(\(or)h(1)f(if)i(defaulted\))f(and)g Fi(k)o(ey)k Ft(is)d(the)f(k)o(ey)g
+(that)f(in)o(v)o(ok)o(ed)75 2549 y(this)f(function.)137
+2615 y(It)c(is)g(completely)h(up)f(to)f(the)g(function)i(as)e(to)g
+(what)g(should)h(b)q(e)g(done)g(with)g(the)g(n)o(umeric)g(argumen)o(t.)
+75 2670 y(Some)20 b(functions)h(use)f(it)g(as)g(a)g(rep)q(eat)g(coun)o
+(t,)g(some)g(as)g(a)f(\015ag,)i(and)f(others)g(to)f(c)o(ho)q(ose)h
+(alternate)p eop
+%%Page: 24 28
+24 27 bop 75 -58 a Ft(24)1299 b(GNU)15 b(Readline)h(Library)75
+149 y(b)q(eha)o(vior)22 b(\(refreshing)g(the)g(curren)o(t)f(line)j(as)d
+(opp)q(osed)h(to)f(refreshing)i(the)e(screen,)j(for)d(example\).)75
+204 y(Some)c(c)o(ho)q(ose)f(to)g(ignore)h(it.)24 b(In)18
+b(general,)f(if)g(a)f(function)h(uses)g(the)g(n)o(umeric)h(argumen)o(t)
+d(as)i(a)f(rep)q(eat)75 259 y(coun)o(t,)e(it)g(should)h(b)q(e)f(able)h
+(to)e(do)h(something)h(useful)g(with)f(b)q(oth)g(negativ)o(e)g(and)g(p)
+q(ositiv)o(e)h(argumen)o(ts.)75 314 y(A)o(t)g(the)g(v)o(ery)g(least,)g
+(it)g(should)h(b)q(e)g(a)o(w)o(are)e(that)h(it)g(can)g(b)q(e)h(passed)g
+(a)f(negativ)o(e)g(argumen)o(t.)137 381 y(A)f(command)g(function)h
+(should)g(return)e(0)h(if)g(its)g(action)h(completes)f(successfully)l
+(,)i(and)e(a)g(non-zero)75 436 y(v)m(alue)i(if)g(some)f(error)f(o)q
+(ccurs.)75 565 y Fr(2.3)33 b(Readline)23 b(V)-6 b(ariables)137
+687 y Ft(These)16 b(v)m(ariables)g(are)f(a)o(v)m(ailable)i(to)e
+(function)h(writers.)1685 780 y([V)l(ariable])-1799 b
+Fg(char)20 b(*)f Ff(rl)p 287 780 18 3 v 26 w(line)p 401
+780 V 27 w(bu\013er)195 835 y Ft(This)d(is)g(the)g(line)h(gathered)f
+(so)f(far.)20 b(Y)l(ou)c(are)f(w)o(elcome)h(to)f(mo)q(dify)h(the)g(con)
+o(ten)o(ts)f(of)g(the)h(line,)195 889 y(but)i(see)g(Section)h(2.4.5)d
+([Allo)o(wing)i(Undoing],)h(page)e(32.)27 b(The)18 b(function)h
+Fs(rl_extend_line_)195 944 y(buffer)14 b Ft(is)i(a)o(v)m(ailable)h(to)d
+(increase)j(the)e(memory)f(allo)q(cated)j(to)d Fs(rl_line_buffer)p
+Ft(.)1685 1037 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p
+216 1037 V 25 w(p)r(oin)n(t)195 1091 y Ft(The)15 b(o\013set)g(of)f(the)
+i(curren)o(t)f(cursor)g(p)q(osition)h(in)g Fs(rl_line_buffer)d
+Ft(\(the)i Fn(p)n(oint)t Ft(\).)1685 1184 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 1184 V 25 w(end)195 1239 y
+Ft(The)14 b(n)o(um)o(b)q(er)g(of)g(c)o(haracters)f(presen)o(t)h(in)h
+Fs(rl_line_buffer)p Ft(.)i(When)e Fs(rl_point)e Ft(is)h(at)f(the)h(end)
+195 1293 y(of)h(the)g(line,)i Fs(rl_point)d Ft(and)h
+Fs(rl_end)f Ft(are)h(equal.)1685 1386 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 1386 V 25 w(mark)195 1441 y
+Ft(The)f Fi(mark)h Ft(\(sa)o(v)o(ed)e(p)q(osition\))h(in)g(the)g
+(curren)o(t)f(line.)31 b(If)19 b(set,)g(the)f(mark)g(and)h(p)q(oin)o(t)
+g(de\014ne)g(a)195 1495 y Fn(r)n(e)n(gion)p Ft(.)1685
+1588 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216
+1588 V 25 w(done)195 1643 y Ft(Setting)11 b(this)g(to)g(a)f(non-zero)h
+(v)m(alue)h(causes)f(Readline)h(to)f(return)f(the)h(curren)o(t)g(line)h
+(immediately)l(.)1685 1735 y([V)l(ariable])-1799 b Fg(int)20
+b Ff(rl)p 216 1735 V 25 w(n)n(um)p 352 1735 V 24 w(c)n(hars)p
+506 1735 V 25 w(to)p 582 1735 V 25 w(read)195 1790 y
+Ft(Setting)d(this)g(to)f(a)g(p)q(ositiv)o(e)h(v)m(alue)h(b)q(efore)f
+(calling)h Fs(readline\(\))d Ft(causes)h(Readline)i(to)e(return)195
+1845 y(after)h(accepting)i(that)e(man)o(y)g(c)o(haracters,)h(rather)f
+(than)h(reading)g(up)g(to)f(a)h(c)o(haracter)f(b)q(ound)195
+1899 y(to)e Fs(accept-line)p Ft(.)1685 1992 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 1992 V 25 w(p)r(ending)p 441
+1992 V 25 w(input)195 2047 y Ft(Setting)13 b(this)g(to)f(a)g(v)m(alue)i
+(mak)o(es)e(it)h(the)f(next)h(k)o(eystrok)o(e)f(read.)19
+b(This)13 b(is)g(a)f(w)o(a)o(y)g(to)f(stu\013)h(a)h(single)195
+2102 y(c)o(haracter)h(in)o(to)i(the)f(input)h(stream.)1685
+2194 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216
+2194 V 25 w(dispatc)n(hing)195 2249 y Ft(Set)12 b(to)g(a)f(non-zero)i
+(v)m(alue)g(if)g(a)f(function)h(is)f(b)q(eing)i(called)f(from)f(a)f(k)o
+(ey)h(binding;)j(zero)d(otherwise.)195 2304 y(Application)20
+b(functions)e(can)g(test)g(this)g(to)f(disco)o(v)o(er)h(whether)g(they)
+g(w)o(ere)g(called)h(directly)g(or)195 2358 y(b)o(y)c(Readline's)h
+(dispatc)o(hing)h(mec)o(hanism.)1685 2451 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 2451 V 25 w(erase)p 368 2451
+V 25 w(empt)n(y)p 550 2451 V 25 w(line)195 2506 y Ft(Setting)j(this)h
+(to)e(a)h(non-zero)g(v)m(alue)h(causes)f(Readline)i(to)d(completely)i
+(erase)f(the)g(curren)o(t)195 2560 y(line,)g(including)h(an)o(y)c
+(prompt,)h(an)o(y)g(time)g(a)f(newline)j(is)e(t)o(yp)q(ed)g(as)f(the)h
+(only)g(c)o(haracter)f(on)195 2615 y(an)e(otherwise-empt)o(y)g(line.)31
+b(The)18 b(cursor)g(is)h(mo)o(v)o(ed)e(to)h(the)g(b)q(eginning)i(of)e
+(the)g(newly-blank)195 2670 y(line.)p eop
+%%Page: 25 29
+25 28 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(25)1685 149 y([V)l(ariable])-1799 b Fg(char)20
+b(*)f Ff(rl)p 287 149 18 3 v 26 w(prompt)195 204 y Ft(The)13
+b(prompt)g(Readline)h(uses.)20 b(This)13 b(is)h(set)f(from)f(the)h
+(argumen)o(t)g(to)f Fs(readline\(\))p Ft(,)g(and)h(should)195
+259 y(not)g(b)q(e)h(assigned)g(to)f(directly)l(.)21 b(The)14
+b Fs(rl_set_prompt\(\))d Ft(function)j(\(see)g(Section)g(2.4.6)e
+([Redis-)195 314 y(pla)o(y],)j(page)g(32\))f(ma)o(y)h(b)q(e)g(used)h
+(to)f(mo)q(dify)h(the)f(prompt)g(string)g(after)f(calling)j
+Fs(readline\(\))p Ft(.)1685 399 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 399 V 25 w(already)p 424 399
+V 26 w(prompted)195 453 y Ft(If)e(an)g(application)i(wishes)f(to)f
+(displa)o(y)h(the)f(prompt)g(itself,)h(rather)f(than)g(ha)o(v)o(e)g
+(Readline)h(do)195 508 y(it)e(the)f(\014rst)g(time)h
+Fs(readline\(\))e Ft(is)i(called,)h(it)e(should)i(set)e(this)h(v)m
+(ariable)g(to)f(a)g(non-zero)h(v)m(alue)195 563 y(after)h(displa)o
+(ying)j(the)e(prompt.)31 b(The)19 b(prompt)g(m)o(ust)f(also)h(b)q(e)h
+(passed)f(as)f(the)h(argumen)o(t)g(to)195 618 y Fs(readline\(\))c
+Ft(so)h(the)h(redispla)o(y)g(functions)h(can)e(up)q(date)h(the)g
+(displa)o(y)h(prop)q(erly)l(.)24 b(The)17 b(calling)195
+672 y(application)g(is)f(resp)q(onsible)h(for)d(managing)h(the)h(v)m
+(alue;)g(Readline)g(nev)o(er)g(sets)e(it.)1685 757 y([V)l(ariable])
+-1799 b Fg(const)20 b(char)g(*)f Ff(rl)p 437 757 V 26
+w(library)p 631 757 V 26 w(v)n(ersion)195 812 y Ft(The)c(v)o(ersion)h
+(n)o(um)o(b)q(er)f(of)g(this)h(revision)g(of)f(the)g(library)l(.)1685
+897 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216 897
+V 25 w(readline)p 439 897 V 27 w(v)n(ersion)195 951 y
+Ft(An)d(in)o(teger)h(enco)q(ding)g(the)f(curren)o(t)g(v)o(ersion)g(of)g
+(the)g(library)l(.)27 b(The)17 b(enco)q(ding)h(is)g(of)f(the)g(form)195
+1006 y(0x)p Fi(MMmm)p Ft(,)g(where)i Fi(MM)j Ft(is)d(the)f(t)o(w)o
+(o-digit)g(ma)s(jor)f(v)o(ersion)i(n)o(um)o(b)q(er,)g(and)f
+Fi(mm)g Ft(is)h(the)f(t)o(w)o(o-)195 1061 y(digit)i(minor)e(v)o(ersion)
+h(n)o(um)o(b)q(er.)31 b(F)l(or)18 b(example,)i(for)e(Readline-4.2,)i
+Fs(rl_readline_version)195 1116 y Ft(w)o(ould)c(ha)o(v)o(e)e(the)i(v)m
+(alue)g(0x0402.)1685 1200 y([V)l(ariable])-1799 b Fg(int)20
+b Ff(rl)p 216 1200 V 25 w(gn)n(u)p 332 1200 V 25 w(readline)p
+555 1200 V 27 w(p)195 1255 y Ft(Alw)o(a)o(ys)15 b(set)g(to)f(1,)h
+(denoting)h(that)e(this)i(is)g Fm(gnu)f Ft(readline)h(rather)f(than)g
+(some)g(em)o(ulation.)1685 1340 y([V)l(ariable])-1799
+b Fg(const)20 b(char)g(*)f Ff(rl)p 437 1340 V 26 w(terminal)p
+674 1340 V 25 w(name)195 1395 y Ft(The)14 b(terminal)h(t)o(yp)q(e,)f
+(used)h(for)e(initialization.)23 b(If)14 b(not)f(set)h(b)o(y)g(the)g
+(application,)i(Readline)f(sets)195 1450 y(this)h(to)e(the)h(v)m(alue)i
+(of)e(the)g Fs(TERM)g Ft(en)o(vironmen)o(t)g(v)m(ariable)i(the)e
+(\014rst)g(time)g(it)h(is)f(called.)1685 1534 y([V)l(ariable])-1799
+b Fg(const)20 b(char)g(*)f Ff(rl)p 437 1534 V 26 w(readline)p
+661 1534 V 26 w(name)195 1589 y Ft(This)d(v)m(ariable)h(is)f(set)g(to)f
+(a)g(unique)i(name)f(b)o(y)f(eac)o(h)h(application)h(using)f(Readline.)
+23 b(The)16 b(v)m(alue)195 1644 y(allo)o(ws)e(conditional)i(parsing)e
+(of)g(the)g(inputrc)h(\014le)g(\(see)f(Section)h(1.3.2)d([Conditional)j
+(Init)g(Con-)195 1699 y(structs],)f(page)h(9\).)1685
+1783 y([V)l(ariable])-1799 b Fg(FILE)20 b(*)f Ff(rl)p
+287 1783 V 26 w(instream)195 1838 y Ft(The)i(stdio)f(stream)g(from)g
+(whic)o(h)h(Readline)h(reads)e(input.)37 b(If)21 b Fs(NULL)p
+Ft(,)g(Readline)h(defaults)f(to)195 1893 y Fi(stdin)p
+Ft(.)1685 1978 y([V)l(ariable])-1799 b Fg(FILE)20 b(*)f
+Ff(rl)p 287 1978 V 26 w(outstream)195 2032 y Ft(The)e(stdio)h(stream)e
+(to)h(whic)o(h)h(Readline)g(p)q(erforms)f(output.)26
+b(If)18 b Fs(NULL)p Ft(,)e(Readline)j(defaults)f(to)195
+2087 y Fi(stdout)p Ft(.)1685 2172 y([V)l(ariable])-1799
+b Fg(rl_command_func_t)22 b(*)d Ff(rl)p 627 2172 V 26
+w(last)p 741 2172 V 25 w(func)195 2227 y Ft(The)f(address)f(of)g(the)g
+(last)h(command)f(function)h(Readline)h(executed.)27
+b(Ma)o(y)17 b(b)q(e)h(used)g(to)f(test)195 2281 y(whether)e(or)g(not)g
+(a)g(function)h(is)f(b)q(eing)i(executed)f(t)o(wice)g(in)g(succession,)
+g(for)e(example.)1685 2366 y([V)l(ariable])-1799 b Fg(rl_hook_func_t)21
+b(*)e Ff(rl)p 548 2366 V 26 w(startup)p 757 2366 V 25
+w(ho)r(ok)195 2421 y Ft(If)e(non-zero,)h(this)g(is)f(the)h(address)f
+(of)f(a)h(function)h(to)f(call)h(just)f(b)q(efore)g Fs(readline)f
+Ft(prin)o(ts)i(the)195 2476 y(\014rst)d(prompt.)1685
+2560 y([V)l(ariable])-1799 b Fg(rl_hook_func_t)21 b(*)e
+Ff(rl)p 548 2560 V 26 w(pre)p 656 2560 V 25 w(input)p
+814 2560 V 26 w(ho)r(ok)195 2615 y Ft(If)f(non-zero,)g(this)g(is)h(the)
+f(address)f(of)h(a)f(function)i(to)e(call)i(after)e(the)h(\014rst)f
+(prompt)g(has)h(b)q(een)195 2670 y(prin)o(ted)e(and)f(just)g(b)q(efore)
+h Fs(readline)e Ft(starts)g(reading)h(input)i(c)o(haracters.)p
+eop
+%%Page: 26 30
+26 29 bop 75 -58 a Ft(26)1299 b(GNU)15 b(Readline)h(Library)1685
+149 y([V)l(ariable])-1799 b Fg(rl_hook_func_t)21 b(*)e
+Ff(rl)p 548 149 18 3 v 26 w(ev)n(en)n(t)p 706 149 V 27
+w(ho)r(ok)195 204 y Ft(If)i(non-zero,)g(this)g(is)g(the)f(address)g(of)
+g(a)g(function)h(to)f(call)i(p)q(erio)q(dically)h(when)e(Readline)g(is)
+195 259 y(w)o(aiting)15 b(for)f(terminal)h(input.)21
+b(By)14 b(default,)h(this)g(will)i(b)q(e)e(called)h(at)e(most)g(ten)g
+(times)h(a)f(second)195 314 y(if)i(there)f(is)h(no)f(k)o(eyb)q(oard)g
+(input.)1685 407 y([V)l(ariable])-1799 b Fg(rl_getc_func_t)21
+b(*)e Ff(rl)p 548 407 V 26 w(getc)p 676 407 V 26 w(function)195
+462 y Ft(If)c(non-zero,)h(Readline)g(will)h(call)f(indirectly)i
+(through)d(this)g(p)q(oin)o(ter)h(to)f(get)f(a)h(c)o(haracter)g(from)
+195 517 y(the)k(input)i(stream.)31 b(By)19 b(default,)h(it)g(is)g(set)f
+(to)f Fs(rl_getc)p Ft(,)h(the)g(default)h(Readline)h(c)o(haracter)195
+571 y(input)16 b(function)g(\(see)f(Section)h(2.4.8)e([Character)g
+(Input],)h(page)g(34\).)1685 665 y([V)l(ariable])-1799
+b Fg(rl_voidfunc_t)21 b(*)e Ff(rl)p 522 665 V 26 w(redispla)n(y)p
+771 665 V 27 w(function)195 719 y Ft(If)f(non-zero,)h(Readline)g(will)h
+(call)f(indirectly)h(through)e(this)g(p)q(oin)o(ter)h(to)e(up)q(date)i
+(the)f(displa)o(y)195 774 y(with)c(the)f(curren)o(t)h(con)o(ten)o(ts)f
+(of)g(the)g(editing)i(bu\013er.)k(By)14 b(default,)g(it)g(is)g(set)f
+(to)g Fs(rl_redisplay)p Ft(,)195 829 y(the)i(default)h(Readline)h
+(redispla)o(y)f(function)g(\(see)f(Section)h(2.4.6)e([Redispla)o(y],)h
+(page)g(32\).)1685 922 y([V)l(ariable])-1799 b Fg(rl_vintfunc_t)21
+b(*)e Ff(rl)p 522 922 V 26 w(prep)p 662 922 V 25 w(term)p
+808 922 V 24 w(function)195 977 y Ft(If)12 b(non-zero,)h(Readline)g
+(will)h(call)f(indirectly)h(through)e(this)g(p)q(oin)o(ter)h(to)e
+(initialize)k(the)e(terminal.)195 1032 y(The)19 b(function)g(tak)o(es)f
+(a)g(single)i(argumen)o(t,)e(an)h Fs(int)f Ft(\015ag)g(that)g(sa)o(ys)g
+(whether)g(or)h(not)f(to)g(use)195 1087 y(eigh)o(t-bit)g(c)o
+(haracters.)25 b(By)17 b(default,)h(this)f(is)h(set)e(to)h
+Fs(rl_prep_terminal)e Ft(\(see)i(Section)h(2.4.9)195
+1141 y([T)l(erminal)e(Managemen)o(t],)d(page)i(35\).)1685
+1234 y([V)l(ariable])-1799 b Fg(rl_voidfunc_t)21 b(*)e
+Ff(rl)p 522 1234 V 26 w(deprep)p 720 1234 V 25 w(term)p
+866 1234 V 24 w(function)195 1289 y Ft(If)g(non-zero,)g(Readline)g
+(will)h(call)g(indirectly)g(through)e(this)h(p)q(oin)o(ter)f(to)g
+(reset)g(the)h(terminal.)195 1344 y(This)f(function)g(should)h(undo)f
+(the)f(e\013ects)h(of)f Fs(rl_prep_term_function)p Ft(.)24
+b(By)17 b(default,)i(this)195 1399 y(is)d(set)f(to)f
+Fs(rl_deprep_terminal)f Ft(\(see)i(Section)h(2.4.9)e([T)l(erminal)i
+(Managemen)o(t],)d(page)i(35\).)1685 1492 y([V)l(ariable])-1799
+b Fg(Keymap)20 b Ff(rl)p 294 1492 V 26 w(executing)p
+557 1492 V 27 w(k)n(eymap)195 1547 y Ft(This)f(v)m(ariable)g(is)f(set)g
+(to)g(the)g(k)o(eymap)f(\(see)h(Section)h(2.4.2)e([Keymaps],)g(page)h
+(28\))f(in)i(whic)o(h)195 1602 y(the)c(curren)o(tly)h(executing)g
+(readline)h(function)f(w)o(as)f(found.)1685 1695 y([V)l(ariable])-1799
+b Fg(Keymap)20 b Ff(rl)p 294 1695 V 26 w(binding)p 507
+1695 V 26 w(k)n(eymap)195 1750 y Ft(This)f(v)m(ariable)g(is)f(set)g(to)
+g(the)g(k)o(eymap)f(\(see)h(Section)h(2.4.2)e([Keymaps],)g(page)h(28\))
+f(in)i(whic)o(h)195 1804 y(the)c(last)g(k)o(ey)g(binding)j(o)q
+(ccurred.)1685 1898 y([V)l(ariable])-1799 b Fg(char)20
+b(*)f Ff(rl)p 287 1898 V 26 w(executing)p 550 1898 V
+27 w(macro)195 1952 y Ft(This)d(v)m(ariable)g(is)g(set)f(to)g(the)g
+(text)g(of)f(an)o(y)h(curren)o(tly-executing)i(macro.)1685
+2046 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216
+2046 V 25 w(readline)p 439 2046 V 27 w(state)195 2100
+y Ft(A)d(v)m(ariable)i(with)e(bit)h(v)m(alues)h(that)d(encapsulate)i
+(the)g(curren)o(t)f(Readline)h(state.)25 b(A)18 b(bit)f(is)h(set)195
+2155 y(with)h(the)g Fs(RL_SETSTATE)f Ft(macro,)h(and)g(unset)g(with)g
+(the)g Fs(RL_UNSETSTATE)e Ft(macro.)31 b(Use)19 b(the)195
+2210 y Fs(RL_ISSTATE)e Ft(macro)h(to)g(test)g(whether)h(a)f(particular)
+i(state)d(bit)j(is)f(set.)30 b(Curren)o(t)18 b(state)g(bits)195
+2265 y(include:)195 2345 y Fs(RL_STATE_NONE)435 2400
+y Ft(Readline)e(has)g(not)e(y)o(et)h(b)q(een)h(called,)h(nor)e(has)g
+(it)g(b)q(egun)h(to)f(in)o(tialize.)195 2480 y Fs
+(RL_STATE_INITIALIZING)435 2535 y Ft(Readline)h(is)g(initializi)q(ng)i
+(its)d(in)o(ternal)h(data)f(structures.)195 2615 y Fs
+(RL_STATE_INITIALIZED)435 2670 y Ft(Readline)h(has)g(completed)g(its)f
+(initialization.)p eop
+%%Page: 27 31
+27 30 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(27)195 149 y Fs(RL_STATE_TERMPREPPED)435
+204 y Ft(Readline)16 b(has)e(mo)q(di\014ed)i(the)e(terminal)h(mo)q(des)
+g(to)e(do)i(its)f(o)o(wn)g(input)h(and)g(redis-)435 259
+y(pla)o(y)l(.)195 344 y Fs(RL_STATE_READCMD)435 398 y
+Ft(Readline)h(is)g(reading)g(a)f(command)g(from)f(the)i(k)o(eyb)q
+(oard.)195 483 y Fs(RL_STATE_METANEXT)435 538 y Ft(Readline)g(is)g
+(reading)g(more)f(input)h(after)e(reading)i(the)f(meta-pre\014x)h(c)o
+(haracter.)195 622 y Fs(RL_STATE_DISPATCHING)435 677
+y Ft(Readline)g(is)g(dispatc)o(hing)h(to)d(a)h(command.)195
+762 y Fs(RL_STATE_MOREINPUT)435 816 y Ft(Readline)h(is)g(reading)g
+(more)f(input)h(while)h(executing)f(an)f(editing)i(command.)195
+901 y Fs(RL_STATE_ISEARCH)435 956 y Ft(Readline)f(is)g(p)q(erforming)g
+(an)f(incremen)o(tal)h(history)f(searc)o(h.)195 1040
+y Fs(RL_STATE_NSEARCH)435 1095 y Ft(Readline)h(is)g(p)q(erforming)g(a)f
+(non-incremen)o(tal)h(history)g(searc)o(h.)195 1180 y
+Fs(RL_STATE_SEARCH)435 1234 y Ft(Readline)11 b(is)g(searc)o(hing)g(bac)
+o(kw)o(ard)e(or)h(forw)o(ard)f(through)h(the)g(history)g(for)f(a)h
+(string.)195 1319 y Fs(RL_STATE_NUMERICARG)435 1374 y
+Ft(Readline)16 b(is)g(reading)g(a)f(n)o(umeric)h(argumen)o(t.)195
+1458 y Fs(RL_STATE_MACROINPUT)435 1513 y Ft(Readline)d(is)g(curren)o
+(tly)g(getting)f(its)g(input)h(from)e(a)h(previously-de\014ned)j(k)o
+(eyb)q(oard)435 1568 y(macro.)195 1652 y Fs(RL_STATE_MACRODEF)435
+1707 y Ft(Readline)h(is)g(curren)o(tly)g(reading)g(c)o(haracters)e
+(de\014ning)j(a)e(k)o(eyb)q(oard)g(macro.)195 1792 y
+Fs(RL_STATE_OVERWRITE)435 1846 y Ft(Readline)h(is)g(in)g(o)o(v)o
+(erwrite)f(mo)q(de.)195 1931 y Fs(RL_STATE_COMPLETING)435
+1986 y Ft(Readline)h(is)g(p)q(erforming)g(w)o(ord)e(completion.)195
+2070 y Fs(RL_STATE_SIGHANDLER)435 2125 y Ft(Readline)i(is)g(curren)o
+(tly)g(executing)g(the)f(readline)i(signal)f(handler.)195
+2210 y Fs(RL_STATE_UNDOING)435 2264 y Ft(Readline)g(is)g(p)q(erforming)
+g(an)f(undo.)195 2349 y Fs(RL_STATE_DONE)435 2404 y Ft(Readline)g(has)f
+(read)g(a)f(k)o(ey)h(sequence)h(b)q(ound)g(to)e Fs(accept-line)f
+Ft(and)i(is)h(ab)q(out)f(to)435 2459 y(return)h(the)g(line)i(to)e(the)g
+(caller.)1685 2560 y([V)l(ariable])-1799 b Fg(int)20
+b Ff(rl)p 216 2560 18 3 v 25 w(explici)q(t)p 422 2560
+V 28 w(arg)195 2615 y Ft(Set)f(to)g(a)g(non-zero)h(v)m(alue)h(if)e(an)h
+(explicit)h(n)o(umeric)g(argumen)o(t)d(w)o(as)h(sp)q(eci\014ed)i(b)o(y)
+f(the)f(user.)195 2670 y(Only)d(v)m(alid)h(in)f(a)f(bindable)i(command)
+f(function.)p eop
+%%Page: 28 32
+28 31 bop 75 -58 a Ft(28)1299 b(GNU)15 b(Readline)h(Library)1685
+149 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216 149
+18 3 v 25 w(n)n(umeric)p 442 149 V 25 w(arg)195 204 y
+Ft(Set)j(to)f(the)g(v)m(alue)i(of)f(an)o(y)f(n)o(umeric)h(argumen)o(t)f
+(explicitly)k(sp)q(eci\014ed)f(b)o(y)d(the)h(user)g(b)q(efore)195
+259 y(executing)14 b(the)f(curren)o(t)g(Readline)h(function.)20
+b(Only)14 b(v)m(alid)h(in)f(a)f(bindable)i(command)d(function.)1685
+349 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216 349
+V 25 w(editing)p 412 349 V 27 w(mo)r(de)195 404 y Ft(Set)13
+b(to)f(a)g(v)m(alue)i(denoting)f(Readline's)g(curren)o(t)g(editing)h
+(mo)q(de.)19 b(A)12 b(v)m(alue)i(of)e Fi(1)k Ft(means)d(Readline)195
+458 y(is)j(curren)o(tly)f(in)h(emacs)g(mo)q(de;)f Fi(0)j
+Ft(means)d(that)g(vi)h(mo)q(de)f(is)h(activ)o(e.)75 585
+y Fr(2.4)33 b(Readline)23 b(Con)n(v)n(enience)g(F)-6
+b(unctions)75 749 y Fh(2.4.1)30 b(Naming)20 b(a)g(F)-5
+b(unction)137 871 y Ft(The)20 b(user)g(can)g(dynamically)i(c)o(hange)e
+(the)g(bindings)i(of)d(k)o(eys)h(while)h(using)g(Readline.)35
+b(This)20 b(is)75 925 y(done)f(b)o(y)f(represen)o(ting)h(the)g
+(function)g(with)g(a)f(descriptiv)o(e)i(name.)29 b(The)19
+b(user)f(is)h(able)h(to)d(t)o(yp)q(e)i(the)75 980 y(descriptiv)o(e)e
+(name)e(when)h(referring)f(to)g(the)g(function.)21 b(Th)o(us,)14
+b(in)i(an)f(init)i(\014le,)f(one)f(migh)o(t)g(\014nd)195
+1047 y Fs(Meta-Rubout:)46 b(backward-kill-word)137 1113
+y Ft(This)21 b(binds)g(the)f(k)o(eystrok)o(e)661 1111
+y Fk(h)p 673 1085 209 2 v 673 1113 a Fj(Meta-Rub)q(out)p
+673 1121 V 879 1111 a Fk(i)914 1113 y Ft(to)g(the)g(function)g
+Fn(descriptively)k Ft(named)c Fs(backward-)75 1168 y(kill-word)p
+Ft(.)29 b(Y)l(ou,)19 b(as)f(the)h(programmer,)f(should)i(bind)f(the)g
+(functions)h(y)o(ou)e(write)h(to)e(descriptiv)o(e)75
+1223 y(names)e(as)g(w)o(ell.)21 b(Readline)16 b(pro)o(vides)g(a)f
+(function)h(for)e(doing)i(that:)1675 1313 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 1313 18 3 v 25 w(add)p 333
+1313 V 25 w(defun)i Fe(\()p Fs(const)14 b(char)h(*name,)f
+(rl_command_func_t)f(*function,)283 1367 y(int)h(key)p
+Fe(\))195 1422 y Ft(Add)k Fi(name)i Ft(to)d(the)h(list)h(of)e(named)h
+(functions.)28 b(Mak)o(e)17 b Fi(function)h Ft(b)q(e)g(the)g(function)h
+(that)d(gets)195 1477 y(called.)21 b(If)16 b Fi(k)o(ey)j
+Ft(is)d(not)e(-1,)h(then)h(bind)g(it)g(to)e Fi(function)i
+Ft(using)g Fs(rl_bind_key\(\))p Ft(.)137 1567 y(Using)g(this)f
+(function)h(alone)g(is)f(su\016cien)o(t)h(for)f(most)f(applications.)21
+b(It)15 b(is)h(the)f(recommended)h(w)o(a)o(y)75 1622
+y(to)d(add)h(a)f(few)g(functions)h(to)f(the)h(default)g(functions)g
+(that)f(Readline)i(has)e(built)i(in.)20 b(If)14 b(y)o(ou)f(need)h(to)f
+(do)75 1676 y(something)k(other)g(than)f(adding)i(a)e(function)i(to)e
+(Readline,)i(y)o(ou)f(ma)o(y)f(need)i(to)e(use)h(the)g(underlying)75
+1731 y(functions)f(describ)q(ed)h(b)q(elo)o(w.)75 1841
+y Fh(2.4.2)30 b(Selecting)20 b(a)h(Keymap)137 1962 y
+Ft(Key)16 b(bindings)i(tak)o(e)c(place)j(on)e(a)g Fi(k)o(eymap)p
+Ft(.)21 b(The)15 b(k)o(eymap)h(is)f(the)h(asso)q(ciation)g(b)q(et)o(w)o
+(een)g(the)f(k)o(eys)75 2017 y(that)f(the)g(user)g(t)o(yp)q(es)g(and)h
+(the)f(functions)h(that)f(get)g(run.)19 b(Y)l(ou)c(can)f(mak)o(e)g(y)o
+(our)g(o)o(wn)f(k)o(eymaps,)h(cop)o(y)75 2072 y(existing)i(k)o(eymaps,)
+f(and)g(tell)h(Readline)h(whic)o(h)f(k)o(eymap)f(to)f(use.)1675
+2162 y([F)l(unction])-1800 b Fg(Keymap)20 b Ff(rl)p 294
+2162 V 26 w(mak)n(e)p 451 2162 V 24 w(bare)p 585 2162
+V 25 w(k)n(eymap)i Fe(\()p Fs(void)p Fe(\))195 2216 y
+Ft(Returns)12 b(a)f(new,)i(empt)o(y)f(k)o(eymap.)18 b(The)13
+b(space)f(for)f(the)i(k)o(eymap)e(is)i(allo)q(cated)g(with)f
+Fs(malloc\(\))p Ft(;)195 2271 y(the)j(caller)i(should)f(free)f(it)h(b)o
+(y)f(calling)i Fs(rl_discard_keymap\(\))12 b Ft(when)k(done.)1675
+2361 y([F)l(unction])-1800 b Fg(Keymap)20 b Ff(rl)p 294
+2361 V 26 w(cop)n(y)p 434 2361 V 25 w(k)n(eymap)j Fe(\()p
+Fs(Keymap)14 b(map)p Fe(\))195 2416 y Ft(Return)h(a)g(new)g(k)o(eymap)g
+(whic)o(h)h(is)g(a)f(cop)o(y)g(of)g Fi(map)p Ft(.)1675
+2506 y([F)l(unction])-1800 b Fg(Keymap)20 b Ff(rl)p 294
+2506 V 26 w(mak)n(e)p 451 2506 V 24 w(k)n(eymap)j Fe(\()p
+Fs(void)p Fe(\))195 2560 y Ft(Return)15 b(a)h(new)g(k)o(eymap)f(with)h
+(the)g(prin)o(ting)h(c)o(haracters)d(b)q(ound)j(to)e(rl)p
+1454 2560 14 2 v 21 w(insert,)g(the)h(lo)o(w)o(ercase)195
+2615 y(Meta)11 b(c)o(haracters)f(b)q(ound)i(to)f(run)h(their)f(equiv)m
+(alen)o(ts,)j(and)d(the)h(Meta)e(digits)i(b)q(ound)g(to)f(pro)q(duce)
+195 2670 y(n)o(umeric)16 b(argumen)o(ts.)p eop
+%%Page: 29 33
+29 32 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(29)1675 149 y([F)l(unction])-1800 b Fg(void)20
+b Ff(rl)p 242 149 18 3 v 25 w(discard)p 446 149 V 26
+w(k)n(eymap)i Fe(\()p Fs(Keymap)14 b(keymap)p Fe(\))195
+204 y Ft(F)l(ree)h(the)h(storage)d(asso)q(ciated)j(with)f
+Fi(k)o(eymap)p Ft(.)137 292 y(Readline)24 b(has)f(sev)o(eral)g(in)o
+(ternal)g(k)o(eymaps.)42 b(These)23 b(functions)g(allo)o(w)g(y)o(ou)f
+(to)g(c)o(hange)h(whic)o(h)75 347 y(k)o(eymap)15 b(is)h(activ)o(e.)1675
+435 y([F)l(unction])-1800 b Fg(Keymap)20 b Ff(rl)p 294
+435 V 26 w(get)p 397 435 V 25 w(k)n(eymap)i Fe(\()p Fs(void)p
+Fe(\))195 490 y Ft(Returns)15 b(the)g(curren)o(tly)h(activ)o(e)f(k)o
+(eymap.)1675 577 y([F)l(unction])-1800 b Fg(void)20 b
+Ff(rl)p 242 577 V 25 w(set)p 338 577 V 26 w(k)n(eymap)i
+Fe(\()p Fs(Keymap)14 b(keymap)p Fe(\))195 632 y Ft(Mak)o(es)g
+Fi(k)o(eymap)j Ft(the)e(curren)o(tly)h(activ)o(e)f(k)o(eymap.)1675
+720 y([F)l(unction])-1800 b Fg(Keymap)20 b Ff(rl)p 294
+720 V 26 w(get)p 397 720 V 25 w(k)n(eymap)p 615 720 V
+25 w(b)n(y)p 700 720 V 26 w(name)h Fe(\()p Fs(const)14
+b(char)h(*name)p Fe(\))195 775 y Ft(Return)h(the)h(k)o(eymap)f(matc)o
+(hing)h Fi(name)p Ft(.)24 b Fi(name)19 b Ft(is)e(one)g(whic)o(h)g(w)o
+(ould)g(b)q(e)h(supplied)h(in)e(a)f Fs(set)195 830 y(keymap)e
+Ft(inputrc)j(line)f(\(see)g(Section)g(1.3)e([Readline)i(Init)g(File],)g
+(page)f(4\).)1675 917 y([F)l(unction])-1800 b Fg(char)20
+b(*)f Ff(rl)p 287 917 V 26 w(get)p 390 917 V 25 w(k)n(eymap)p
+608 917 V 25 w(name)i Fe(\()p Fs(Keymap)14 b(keymap)p
+Fe(\))195 972 y Ft(Return)i(the)h(name)g(matc)o(hing)f
+Fi(k)o(eymap)p Ft(.)24 b Fi(name)19 b Ft(is)e(one)g(whic)o(h)g(w)o
+(ould)g(b)q(e)h(supplied)h(in)e(a)f Fs(set)195 1027 y(keymap)e
+Ft(inputrc)j(line)f(\(see)g(Section)g(1.3)e([Readline)i(Init)g(File],)g
+(page)f(4\).)75 1135 y Fh(2.4.3)30 b(Binding)20 b(Keys)137
+1255 y Ft(Key)13 b(sequences)g(are)e(asso)q(ciate)h(with)h(functions)f
+(through)g(the)g(k)o(eymap.)19 b(Readline)13 b(has)f(sev)o(eral)g(in-)
+75 1310 y(ternal)j(k)o(eymaps:)k Fs(emacs_standard_keymap)p
+Ft(,)11 b Fs(emacs_meta_keymap)p Ft(,)h Fs(emacs_ctlx_keymap)p
+Ft(,)g Fs(vi_)75 1365 y(movement_keymap)p Ft(,)20 b(and)i
+Fs(vi_insertion_keymap)p Ft(.)35 b Fs(emacs_standard_keymap)18
+b Ft(is)k(the)f(default,)75 1420 y(and)15 b(the)h(examples)g(in)g(this)
+f(man)o(ual)h(assume)f(that.)137 1486 y(Since)h Fs(readline\(\))c
+Ft(installs)j(a)f(set)f(of)h(default)g(k)o(ey)g(bindings)h(the)f
+(\014rst)g(time)g(it)g(is)g(called,)i(there)d(is)75 1540
+y(alw)o(a)o(ys)j(the)g(danger)g(that)g(a)g(custom)g(binding)i
+(installed)g(b)q(efore)f(the)f(\014rst)g(call)i(to)d
+Fs(readline\(\))g Ft(will)75 1595 y(b)q(e)f(o)o(v)o(erridden.)19
+b(An)13 b(alternate)g(mec)o(hanism)h(is)f(to)f(install)i(custom)f(k)o
+(ey)g(bindings)h(in)g(an)f(initialization)75 1650 y(function)19
+b(assigned)h(to)d(the)i Fs(rl_startup_hook)e Ft(v)m(ariable)j(\(see)e
+(Section)h(2.3)f([Readline)i(V)l(ariables],)75 1705 y(page)15
+b(24\).)137 1771 y(These)h(functions)g(manage)e(k)o(ey)i(bindings.)1675
+1858 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+1858 V 25 w(bind)p 352 1858 V 26 w(k)n(ey)k Fe(\()p Fs(int)14
+b(key,)h(rl_command_func_t)e(*function)p Fe(\))195 1913
+y Ft(Binds)18 b Fi(k)o(ey)i Ft(to)c Fi(function)h Ft(in)h(the)e(curren)
+o(tly)h(activ)o(e)g(k)o(eymap.)23 b(Returns)16 b(non-zero)h(in)g(the)g
+(case)195 1968 y(of)e(an)g(in)o(v)m(alid)i Fi(k)o(ey)p
+Ft(.)1675 2056 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p
+216 2056 V 25 w(bind)p 352 2056 V 26 w(k)n(ey)p 462 2056
+V 26 w(in)p 535 2056 V 26 w(map)h Fe(\()p Fs(int)15 b(key,)f
+(rl_command_func_t)f(*function,)283 2111 y(Keymap)h(map)p
+Fe(\))195 2166 y Ft(Bind)i Fi(k)o(ey)j Ft(to)c Fi(function)h
+Ft(in)g Fi(map)p Ft(.)k(Returns)14 b(non-zero)i(in)g(the)f(case)g(of)g
+(an)g(in)o(v)m(alid)j Fi(k)o(ey)p Ft(.)1675 2253 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 2253 V 25 w(bind)p 352 2253
+V 26 w(k)n(ey)p 462 2253 V 26 w(if)p 521 2253 V 26 w(un)n(b)r(ound)h
+Fe(\()p Fs(int)15 b(key,)f(rl_command_func_t)283 2308
+y(*function)p Fe(\))195 2363 y Ft(Binds)23 b Fi(k)o(ey)j
+Ft(to)21 b Fi(function)i Ft(if)g(it)f(is)g(not)g(already)g(b)q(ound)h
+(in)g(the)f(curren)o(tly)g(activ)o(e)h(k)o(eymap.)195
+2418 y(Returns)15 b(non-zero)g(in)h(the)g(case)f(of)f(an)i(in)o(v)m
+(alid)h Fi(k)o(ey)i Ft(or)c(if)g Fi(k)o(ey)k Ft(is)d(already)g(b)q
+(ound.)1675 2506 y([F)l(unction])-1800 b Fg(int)20 b
+Ff(rl)p 216 2506 V 25 w(bind)p 352 2506 V 26 w(k)n(ey)p
+462 2506 V 26 w(if)p 521 2506 V 26 w(un)n(b)r(ound)p
+768 2506 V 24 w(in)p 839 2506 V 26 w(map)h Fe(\()p Fs(int)14
+b(key,)283 2560 y(rl_command_func_t)e(*function,)i(Keymap)h(map)p
+Fe(\))195 2615 y Ft(Binds)g Fi(k)o(ey)i Ft(to)c Fi(function)i
+Ft(if)f(it)g(is)g(not)f(already)h(b)q(ound)h(in)f Fi(map)p
+Ft(.)20 b(Returns)13 b(non-zero)h(in)g(the)g(case)195
+2670 y(of)h(an)g(in)o(v)m(alid)i Fi(k)o(ey)i Ft(or)c(if)h
+Fi(k)o(ey)j Ft(is)c(already)h(b)q(ound.)p eop
+%%Page: 30 34
+30 33 bop 75 -58 a Ft(30)1299 b(GNU)15 b(Readline)h(Library)1675
+149 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 149
+18 3 v 25 w(un)n(bind)p 414 149 V 26 w(k)n(ey)k Fe(\()p
+Fs(int)14 b(key)p Fe(\))195 204 y Ft(Bind)19 b Fi(k)o(ey)j
+Ft(to)c(the)g(n)o(ull)i(function)f(in)g(the)f(curren)o(tly)g(activ)o(e)
+h(k)o(eymap.)28 b(Returns)18 b(non-zero)g(in)195 259
+y(case)d(of)g(error.)1675 347 y([F)l(unction])-1800 b
+Fg(int)20 b Ff(rl)p 216 347 V 25 w(un)n(bind)p 414 347
+V 26 w(k)n(ey)p 524 347 V 26 w(in)p 597 347 V 26 w(map)h
+Fe(\()p Fs(int)15 b(key,)f(Keymap)h(map)p Fe(\))195 401
+y Ft(Bind)h Fi(k)o(ey)j Ft(to)c(the)g(n)o(ull)i(function)f(in)g
+Fi(map)p Ft(.)k(Returns)14 b(non-zero)i(in)g(case)f(of)g(error.)1675
+489 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 489
+V 25 w(un)n(bind)p 414 489 V 26 w(function)p 645 489
+V 25 w(in)p 717 489 V 26 w(map)h Fe(\()p Fs(rl_command_func_t)13
+b(*function,)283 544 y(Keymap)h(map)p Fe(\))195 599 y
+Ft(Un)o(bind)j(all)f(k)o(eys)f(that)f(execute)i Fi(function)g
+Ft(in)g Fi(map)p Ft(.)1675 686 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 686 V 25 w(un)n(bind)p 414
+686 V 26 w(command)p 684 686 V 22 w(in)p 753 686 V 26
+w(map)h Fe(\()p Fs(const)14 b(char)h(*command,)f(Keymap)283
+741 y(map)p Fe(\))195 796 y Ft(Un)o(bind)j(all)f(k)o(eys)f(that)f(are)h
+(b)q(ound)h(to)f Fi(command)i Ft(in)f Fi(map)p Ft(.)1675
+884 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 884
+V 25 w(bind)p 352 884 V 26 w(k)n(eyseq)k Fe(\()p Fs(const)14
+b(char)h(*keyseq,)f(rl_command_func_t)283 938 y(*function)p
+Fe(\))195 993 y Ft(Bind)23 b(the)e(k)o(ey)h(sequence)h(represen)o(ted)f
+(b)o(y)f(the)h(string)f Fi(k)o(eyseq)i Ft(to)e(the)g(function)h
+Fi(function)p Ft(,)195 1048 y(b)q(eginning)16 b(in)f(the)f(curren)o(t)g
+(k)o(eymap.)20 b(This)14 b(mak)o(es)g(new)g(k)o(eymaps)g(as)g
+(necessary)l(.)20 b(The)14 b(return)195 1103 y(v)m(alue)i(is)g
+(non-zero)g(if)f Fi(k)o(eyseq)i Ft(is)e(in)o(v)m(alid.)1675
+1191 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+1191 V 25 w(bind)p 352 1191 V 26 w(k)n(eyseq)p 541 1191
+V 26 w(in)p 614 1191 V 26 w(map)h Fe(\()p Fs(const)15
+b(char)f(*keyseq,)283 1245 y(rl_command_func_t)e(*function,)i(Keymap)h
+(map)p Fe(\))195 1300 y Ft(Bind)f(the)e(k)o(ey)h(sequence)h(represen)o
+(ted)f(b)o(y)f(the)h(string)f Fi(k)o(eyseq)i Ft(to)e(the)g(function)i
+Fi(function)p Ft(.)19 b(This)195 1355 y(mak)o(es)14 b(new)h(k)o(eymaps)
+f(as)g(necessary)l(.)20 b(Initial)d(bindings)f(are)f(p)q(erformed)f(in)
+i Fi(map)p Ft(.)j(The)c(return)195 1410 y(v)m(alue)h(is)g(non-zero)g
+(if)f Fi(k)o(eyseq)i Ft(is)e(in)o(v)m(alid.)1675 1497
+y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 1497
+V 25 w(set)p 312 1497 V 26 w(k)n(ey)j Fe(\()p Fs(const)15
+b(char)f(*keyseq,)g(rl_command_func_t)f(*function,)283
+1552 y(Keymap)h(map)p Fe(\))195 1607 y Ft(Equiv)m(alen)o(t)j(to)d
+Fs(rl_bind_keyseq_in_map)p Ft(.)1675 1695 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 1695 V 25 w(bind)p 352 1695
+V 26 w(k)n(eyseq)p 541 1695 V 26 w(if)p 600 1695 V 26
+w(un)n(b)r(ound)h Fe(\()p Fs(const)14 b(char)h(*keyseq,)283
+1749 y(rl_command_func_t)d(*function)p Fe(\))195 1804
+y Ft(Binds)19 b Fi(k)o(eyseq)g Ft(to)e Fi(function)h
+Ft(if)h(it)f(is)g(not)f(already)h(b)q(ound)h(in)g(the)e(curren)o(tly)i
+(activ)o(e)f(k)o(eymap.)195 1859 y(Returns)d(non-zero)g(in)h(the)g
+(case)f(of)f(an)i(in)o(v)m(alid)h Fi(k)o(eyseq)f Ft(or)f(if)h
+Fi(k)o(eyseq)g Ft(is)g(already)f(b)q(ound.)1675 1947
+y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 1947
+V 25 w(bind)p 352 1947 V 26 w(k)n(eyseq)p 541 1947 V
+26 w(if)p 600 1947 V 26 w(un)n(b)r(ound)p 847 1947 V
+24 w(in)p 918 1947 V 26 w(map)h Fe(\()p Fs(const)14 b(char)h(*keyseq,)
+283 2001 y(rl_command_func_t)d(*function,)i(Keymap)h(map)p
+Fe(\))195 2056 y Ft(Binds)i Fi(k)o(eyseq)g Ft(to)f Fi(function)g
+Ft(if)h(it)f(is)h(not)e(already)h(b)q(ound)h(in)g Fi(map)p
+Ft(.)22 b(Returns)16 b(non-zero)g(in)h(the)195 2111 y(case)e(of)g(an)g
+(in)o(v)m(alid)j Fi(k)o(eyseq)e Ft(or)f(if)g Fi(k)o(eyseq)h
+Ft(is)g(already)g(b)q(ound.)1675 2199 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 2199 V 25 w(generic)p 418 2199
+V 26 w(bind)k Fe(\()p Fs(int)14 b(type,)g(const)h(char)f(*keyseq,)h
+(char)f(*data,)283 2254 y(Keymap)g(map)p Fe(\))195 2308
+y Ft(Bind)h(the)e(k)o(ey)h(sequence)h(represen)o(ted)e(b)o(y)h(the)g
+(string)f Fi(k)o(eyseq)i Ft(to)d(the)i(arbitrary)f(p)q(oin)o(ter)h
+Fi(data)p Ft(.)195 2363 y Fi(t)o(yp)q(e)j Ft(sa)o(ys)c(what)h(kind)h
+(of)f(data)g(is)g(p)q(oin)o(ted)i(to)d(b)o(y)h Fi(data)p
+Ft(;)g(this)h(can)f(b)q(e)h(a)f(function)h(\()p Fs(ISFUNC)p
+Ft(\),)d(a)195 2418 y(macro)i(\()p Fs(ISMACR)p Ft(\),)f(or)h(a)h(k)o
+(eymap)f(\()p Fs(ISKMAP)p Ft(\).)k(This)e(mak)o(es)e(new)h(k)o(eymaps)f
+(as)h(necessary)l(.)20 b(The)195 2473 y(initial)d(k)o(eymap)e(in)h
+(whic)o(h)g(to)f(do)g(bindings)i(is)f Fi(map)p Ft(.)1675
+2560 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+2560 V 25 w(parse)p 374 2560 V 25 w(and)p 491 2560 V
+24 w(bind)j Fe(\()p Fs(char)15 b(*line)p Fe(\))195 2615
+y Ft(P)o(arse)f Fi(line)19 b Ft(as)14 b(if)h(it)g(had)g(b)q(een)h(read)
+f(from)f(the)g Fs(inputrc)g Ft(\014le)i(and)f(p)q(erform)f(an)o(y)h(k)o
+(ey)f(bindings)195 2670 y(and)h(v)m(ariable)i(assignmen)o(ts)e(found)h
+(\(see)f(Section)h(1.3)e([Readline)i(Init)g(File],)g(page)f(4\).)p
+eop
+%%Page: 31 35
+31 34 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(31)1675 149 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 149 18 3 v 25 w(read)p 351 149 V 25 w(init)p
+460 149 V 27 w(\014le)k Fe(\()p Fs(const)14 b(char)h(*filename)p
+Fe(\))195 204 y Ft(Read)g(k)o(eybindings)j(and)e(v)m(ariable)h
+(assignmen)o(ts)f(from)f Fi(\014lename)k Ft(\(see)d(Section)g(1.3)f
+([Readline)195 259 y(Init)h(File],)g(page)f(4\).)75 396
+y Fh(2.4.4)30 b(Asso)r(ciating)20 b(F)-5 b(unction)20
+b(Names)h(and)f(Bindings)137 530 y Ft(These)11 b(functions)h(allo)o(w)e
+(y)o(ou)h(to)f(\014nd)h(out)f(what)g(k)o(eys)h(in)o(v)o(ok)o(e)f(named)
+h(functions)h(and)e(the)h(functions)75 585 y(in)o(v)o(ok)o(ed)j(b)o(y)g
+(a)f(particular)h(k)o(ey)g(sequence.)21 b(Y)l(ou)14 b(ma)o(y)f(also)g
+(asso)q(ciate)h(a)g(new)g(function)g(name)g(with)g(an)75
+640 y(arbitrary)h(function.)1675 757 y([F)l(unction])-1800
+b Fg(rl_command_func_t)22 b(*)d Ff(rl)p 627 757 V 26
+w(named)p 820 757 V 23 w(function)k Fe(\()p Fs(const)14
+b(char)h(*name)p Fe(\))195 811 y Ft(Return)g(the)g(function)h(with)g
+(name)f Fi(name)p Ft(.)1675 928 y([F)l(unction])-1800
+b Fg(rl_command_func_t)22 b(*)d Ff(rl)p 627 928 V 26
+w(function)p 858 928 V 25 w(of)p 930 928 V 24 w(k)n(eyseq)24
+b Fe(\()p Fs(const)15 b(char)f(*keyseq,)283 983 y(Keymap)g(map,)g(int)h
+(*type)p Fe(\))195 1038 y Ft(Return)h(the)g(function)h(in)o(v)o(ok)o
+(ed)g(b)o(y)f Fi(k)o(eyseq)h Ft(in)g(k)o(eymap)f Fi(map)p
+Ft(.)23 b(If)17 b Fi(map)g Ft(is)g Fs(NULL)p Ft(,)f(the)g(curren)o(t)
+195 1092 y(k)o(eymap)i(is)h(used.)31 b(If)18 b Fi(t)o(yp)q(e)j
+Ft(is)e(not)g Fs(NULL)p Ft(,)f(the)g(t)o(yp)q(e)h(of)f(the)h(ob)s(ject)
+f(is)h(returned)g(in)g(the)f Fs(int)195 1147 y Ft(v)m(ariable)f(it)e(p)
+q(oin)o(ts)h(to)e(\(one)h(of)g Fs(ISFUNC)p Ft(,)f Fs(ISKMAP)p
+Ft(,)g(or)h Fs(ISMACR)p Ft(\).)1675 1264 y([F)l(unction])-1800
+b Fg(char)20 b(**)f Ff(rl)p 313 1264 V 26 w(in)n(v)n(oking)p
+547 1264 V 27 w(k)n(eyseqs)24 b Fe(\()p Fs(rl_command_func_t)12
+b(*function)p Fe(\))195 1319 y Ft(Return)j(an)h(arra)o(y)e(of)h
+(strings)h(represen)o(ting)g(the)g(k)o(ey)f(sequences)i(used)f(to)f(in)
+o(v)o(ok)o(e)h Fi(function)g Ft(in)195 1374 y(the)f(curren)o(t)g(k)o
+(eymap.)1675 1490 y([F)l(unction])-1800 b Fg(char)20
+b(**)f Ff(rl)p 313 1490 V 26 w(in)n(v)n(oking)p 547 1490
+V 27 w(k)n(eyseqs)p 760 1490 V 26 w(in)p 833 1490 V 26
+w(map)i Fe(\()p Fs(rl_command_func_t)283 1545 y(*function,)13
+b(Keymap)i(map)p Fe(\))195 1600 y Ft(Return)g(an)h(arra)o(y)e(of)h
+(strings)h(represen)o(ting)g(the)g(k)o(ey)f(sequences)i(used)f(to)f(in)
+o(v)o(ok)o(e)h Fi(function)g Ft(in)195 1655 y(the)f(k)o(eymap)g
+Fi(map)p Ft(.)1675 1772 y([F)l(unction])-1800 b Fg(void)20
+b Ff(rl)p 242 1772 V 25 w(function)p 472 1772 V 26 w(dump)r(er)g
+Fe(\()p Fs(int)15 b(readable)p Fe(\))195 1826 y Ft(Prin)o(t)g(the)f
+(readline)j(function)e(names)g(and)f(the)h(k)o(ey)g(sequences)g(curren)
+o(tly)g(b)q(ound)h(to)e(them)h(to)195 1881 y Fs(rl_outstream)p
+Ft(.)j(If)c Fi(readable)j Ft(is)d(non-zero,)g(the)g(list)g(is)h
+(formatted)d(in)j(suc)o(h)f(a)f(w)o(a)o(y)g(that)g(it)h(can)195
+1936 y(b)q(e)i(made)f(part)g(of)f(an)i Fs(inputrc)e Ft(\014le)i(and)f
+(re-read.)1675 2053 y([F)l(unction])-1800 b Fg(void)20
+b Ff(rl)p 242 2053 V 25 w(list)p 342 2053 V 27 w(funmap)p
+560 2053 V 23 w(names)h Fe(\()p Fs(void)p Fe(\))195 2108
+y Ft(Prin)o(t)15 b(the)g(names)h(of)e(all)j(bindable)g(Readline)f
+(functions)g(to)f Fs(rl_outstream)p Ft(.)1675 2224 y([F)l(unction])
+-1800 b Fg(const)20 b(char)g(**)f Ff(rl)p 463 2224 V
+26 w(funmap)p 680 2224 V 22 w(names)i Fe(\()p Fs(void)p
+Fe(\))195 2279 y Ft(Return)13 b(a)f(NULL)i(terminated)g(arra)o(y)d(of)i
+(kno)o(wn)g(function)g(names.)20 b(The)13 b(arra)o(y)f(is)h(sorted.)19
+b(The)195 2334 y(arra)o(y)11 b(itself)j(is)f(allo)q(cated,)h(but)f(not)
+f(the)h(strings)f(inside.)21 b(Y)l(ou)13 b(should)h Fs(free\(\))d
+Ft(the)i(arra)o(y)e(when)195 2389 y(y)o(ou)k(are)g(done,)g(but)g(not)g
+(the)g(p)q(oin)o(ters.)1675 2506 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 2506 V 25 w(add)p 333 2506
+V 25 w(funmap)p 549 2506 V 23 w(en)n(try)j Fe(\()p Fs(const)14
+b(char)h(*name,)f(rl_command_func_t)283 2560 y(*function)p
+Fe(\))195 2615 y Ft(Add)j Fi(name)i Ft(to)d(the)g(list)h(of)f(bindable)
+j(Readline)f(command)e(names,)g(and)h(mak)o(e)f Fi(function)h
+Ft(the)195 2670 y(function)f(to)f(b)q(e)g(called)i(when)f
+Fi(name)i Ft(is)d(in)o(v)o(ok)o(ed.)p eop
+%%Page: 32 36
+32 35 bop 75 -58 a Ft(32)1299 b(GNU)15 b(Readline)h(Library)75
+149 y Fh(2.4.5)30 b(Allo)n(wing)21 b(Undoing)137 269
+y Ft(Supp)q(orting)14 b(the)g(undo)f(command)g(is)h(a)f(painless)h
+(thing,)g(and)f(mak)o(es)g(y)o(our)f(functions)i(m)o(uc)o(h)f(more)75
+324 y(useful.)21 b(It)15 b(is)h(certainly)g(easy)f(to)g(try)f
+(something)i(if)f(y)o(ou)g(kno)o(w)g(y)o(ou)g(can)g(undo)h(it.)137
+389 y(If)21 b(y)o(our)f(function)h(simply)h(inserts)f(text)e(once,)j
+(or)e(deletes)h(text)f(once,)i(and)f(uses)f Fs(rl_insert_)75
+444 y(text\(\))13 b Ft(or)h Fs(rl_delete_text\(\))d Ft(to)j(do)f(it,)h
+(then)h(undoing)g(is)f(already)g(done)h(for)e(y)o(ou)h(automatically)l
+(.)137 509 y(If)d(y)o(ou)f(do)g(m)o(ultiple)i(insertions)f(or)f(m)o
+(ultiple)i(deletions,)g(or)e(an)o(y)g(com)o(bination)h(of)f(these)g(op)
+q(erations,)75 564 y(y)o(ou)19 b(should)h(group)e(them)h(together)g(in)
+o(to)g(one)g(op)q(eration.)31 b(This)20 b(is)f(done)h(with)f
+Fs(rl_begin_undo_)75 619 y(group\(\))14 b Ft(and)i Fs
+(rl_end_undo_group\(\))p Ft(.)137 684 y(The)g(t)o(yp)q(es)f(of)g(ev)o
+(en)o(ts)g(that)f(can)h(b)q(e)h(undone)g(are:)195 738
+y Fd(enum)i(undo_code)e({)j(UNDO_DELETE)o(,)d(UNDO_INSERT)o(,)g
+(UNDO_BEGIN,)g(UNDO_END)g(};)137 803 y Ft(Notice)g(that)e
+Fs(UNDO_DELETE)g Ft(means)h(to)g(insert)g(some)g(text,)f(and)i
+Fs(UNDO_INSERT)d Ft(means)i(to)g(delete)75 858 y(some)e(text.)19
+b(That)14 b(is,)g(the)g(undo)g(co)q(de)g(tells)h(what)e(to)h(undo,)g
+(not)f(ho)o(w)g(to)g(undo)i(it.)k Fs(UNDO_BEGIN)13 b
+Ft(and)75 913 y Fs(UNDO_END)h Ft(are)h(tags)f(added)i(b)o(y)f
+Fs(rl_begin_undo_group\(\))d Ft(and)k Fs(rl_end_undo_group\(\))p
+Ft(.)1675 998 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p
+216 998 18 3 v 25 w(b)r(egin)p 377 998 V 26 w(undo)p
+528 998 V 24 w(group)h Fe(\()p Fs(void)p Fe(\))195 1053
+y Ft(Begins)16 b(sa)o(ving)g(undo)g(information)f(in)i(a)e(group)g
+(construct.)20 b(The)c(undo)g(information)g(usually)195
+1108 y(comes)21 b(from)f(calls)i(to)e Fs(rl_insert_text\(\))e
+Ft(and)j Fs(rl_delete_text\(\))p Ft(,)f(but)h(could)g(b)q(e)h(the)195
+1163 y(result)16 b(of)e(calls)j(to)d Fs(rl_add_undo\(\))p
+Ft(.)1675 1248 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p
+216 1248 V 25 w(end)p 331 1248 V 25 w(undo)p 481 1248
+V 25 w(group)h Fe(\()p Fs(void)p Fe(\))195 1303 y Ft(Closes)15
+b(the)f(curren)o(t)h(undo)g(group)f(started)g(with)g
+Fs(rl_begin_undo_group)f(\(\))p Ft(.)19 b(There)c(should)195
+1358 y(b)q(e)h(one)f(call)i(to)d Fs(rl_end_undo_group\(\))f
+Ft(for)h(eac)o(h)h(call)i(to)d Fs(rl_begin_undo_group\(\))p
+Ft(.)1675 1444 y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p
+242 1444 V 25 w(add)p 359 1444 V 25 w(undo)i Fe(\()p
+Fs(enum)14 b(undo_code)g(what,)h(int)f(start,)h(int)f(end,)h(char)283
+1499 y(*text)p Fe(\))195 1553 y Ft(Remem)o(b)q(er)i(ho)o(w)f(to)h(undo)
+g(an)g(ev)o(en)o(t)g(\(according)g(to)g Fi(what)q Ft(\).)24
+b(The)17 b(a\013ected)g(text)f(runs)i(from)195 1608 y
+Fi(start)d Ft(to)g Fi(end)p Ft(,)g(and)g(encompasses)h
+Fi(text)p Ft(.)1675 1694 y([F)l(unction])-1800 b Fg(void)20
+b Ff(rl)p 242 1694 V 25 w(free)p 361 1694 V 25 w(undo)p
+511 1694 V 25 w(list)k Fe(\()p Fs(void)p Fe(\))195 1749
+y Ft(F)l(ree)15 b(the)h(existing)g(undo)f(list.)1675
+1834 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+1834 V 25 w(do)p 302 1834 V 25 w(undo)i Fe(\()p Fs(void)p
+Fe(\))195 1889 y Ft(Undo)12 b(the)f(\014rst)g(thing)h(on)g(the)f(undo)h
+(list.)19 b(Returns)11 b Fs(0)h Ft(if)g(there)f(w)o(as)g(nothing)h(to)e
+(undo,)j(non-zero)195 1944 y(if)j(something)f(w)o(as)f(undone.)137
+2030 y(Finally)l(,)j(if)f(y)o(ou)f(neither)i(insert)f(nor)f(delete)i
+(text,)e(but)g(directly)i(mo)q(dify)f(the)g(existing)g(text)g(\(e.g.,)
+75 2085 y(c)o(hange)j(its)h(case\),)g(call)g Fs(rl_modifying\(\))e
+Ft(once,)i(just)f(b)q(efore)h(y)o(ou)f(mo)q(dify)h(the)f(text.)32
+b(Y)l(ou)20 b(m)o(ust)75 2139 y(supply)c(the)g(indices)h(of)e(the)g
+(text)g(range)g(that)f(y)o(ou)h(are)g(going)g(to)g(mo)q(dify)l(.)1675
+2225 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+2225 V 25 w(mo)r(difying)i Fe(\()p Fs(int)14 b(start,)h(int)f(end)p
+Fe(\))195 2280 y Ft(T)l(ell)22 b(Readline)f(to)e(sa)o(v)o(e)h(the)g
+(text)g(b)q(et)o(w)o(een)g Fi(start)g Ft(and)g Fi(end)j
+Ft(as)c(a)h(single)h(undo)g(unit.)35 b(It)20 b(is)195
+2335 y(assumed)15 b(that)g(y)o(ou)g(will)i(subsequen)o(tly)f(mo)q(dify)
+g(that)e(text.)75 2440 y Fh(2.4.6)30 b(Redispla)n(y)1675
+2560 y Ft([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p
+242 2560 V 25 w(redispla)n(y)25 b Fe(\()p Fs(void)p Fe(\))195
+2615 y Ft(Change)19 b(what's)f(displa)o(y)o(ed)i(on)f(the)g(screen)g
+(to)f(re\015ect)i(the)f(curren)o(t)f(con)o(ten)o(ts)h(of)f
+Fs(rl_line_)195 2670 y(buffer)p Ft(.)p eop
+%%Page: 33 37
+33 36 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(33)1675 149 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 149 18 3 v 25 w(forced)p 395 149 V 25 w(up)r(date)p
+594 149 V 24 w(displa)n(y)25 b Fe(\()p Fs(void)p Fe(\))195
+204 y Ft(F)l(orce)20 b(the)g(line)h(to)e(b)q(e)i(up)q(dated)f(and)g
+(redispla)o(y)o(ed,)i(whether)e(or)g(not)f(Readline)i(thinks)g(the)195
+259 y(screen)16 b(displa)o(y)g(is)g(correct.)1675 358
+y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 358 V
+25 w(on)p 302 358 V 25 w(new)p 426 358 V 26 w(line)k
+Fe(\()p Fs(void)p Fe(\))195 412 y Ft(T)l(ell)16 b(the)f(up)q(date)h
+(functions)g(that)e(w)o(e)g(ha)o(v)o(e)h(mo)o(v)o(ed)f(on)o(to)g(a)h
+(new)g(\(empt)o(y\))f(line,)i(usually)h(after)195 467
+y(ouputting)f(a)e(newline.)1675 566 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 566 V 25 w(on)p 302 566 V 25
+w(new)p 426 566 V 26 w(line)p 540 566 V 27 w(with)p 677
+566 V 26 w(prompt)h Fe(\()p Fs(void)p Fe(\))195 621 y
+Ft(T)l(ell)13 b(the)g(up)q(date)f(functions)h(that)e(w)o(e)h(ha)o(v)o
+(e)g(mo)o(v)o(ed)f(on)o(to)g(a)h(new)g(line,)i(with)f
+Fi(rl)p 1553 621 14 2 v 20 w(prompt)g Ft(already)195
+675 y(displa)o(y)o(ed.)21 b(This)15 b(could)g(b)q(e)g(used)g(b)o(y)f
+(applications)i(that)e(w)o(an)o(t)f(to)h(output)g(the)g(prompt)g
+(string)195 730 y(themselv)o(es,)g(but)g(still)h(need)g(Readline)g(to)e
+(kno)o(w)g(the)h(prompt)f(string)h(length)g(for)f(redispla)o(y)l(.)21
+b(It)195 785 y(should)16 b(b)q(e)g(used)g(after)e(setting)i
+Fi(rl)p 795 785 V 20 w(already)p 960 785 V 20 w(prompted)p
+Ft(.)1675 884 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p
+216 884 18 3 v 25 w(reset)p 362 884 V 25 w(line)p 475
+884 V 28 w(state)j Fe(\()p Fs(void)p Fe(\))195 938 y
+Ft(Reset)17 b(the)g(displa)o(y)i(state)d(to)h(a)g(clean)h(state)f(and)g
+(redispla)o(y)i(the)e(curren)o(t)g(line)i(starting)e(on)g(a)195
+993 y(new)e(line.)1675 1092 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 1092 V 25 w(crlf)j Fe(\()p Fs(void)p Fe(\))195
+1147 y Ft(Mo)o(v)o(e)14 b(the)h(cursor)g(to)g(the)g(start)f(of)h(the)g
+(next)g(screen)h(line.)1675 1245 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 1245 V 25 w(sho)n(w)p 364 1245
+V 25 w(c)n(har)j Fe(\()p Fs(int)15 b(c)p Fe(\))195 1300
+y Ft(Displa)o(y)i(c)o(haracter)e Fi(c)20 b Ft(on)c Fs(rl_outstream)p
+Ft(.)21 b(If)c(Readline)g(has)f(not)g(b)q(een)i(set)e(to)f(displa)o(y)j
+(meta)195 1355 y(c)o(haracters)12 b(directly)l(,)j(this)e(will)i(con)o
+(v)o(ert)d(meta)h(c)o(haracters)f(to)g(a)h(meta-pre\014xed)g(k)o(ey)g
+(sequence.)195 1410 y(This)j(is)f(in)o(tended)i(for)e(use)g(b)o(y)g
+(applications)i(whic)o(h)f(wish)g(to)f(do)g(their)g(o)o(wn)g(redispla)o
+(y)l(.)1675 1508 y([F)l(unction])-1800 b Fg(int)20 b
+Ff(rl)p 216 1508 V 25 w(message)h Fe(\()p Fs(const)14
+b(char)h(*,)g(...)o Fe(\))195 1563 y Ft(The)c(argumen)o(ts)e(are)h(a)g
+(format)f(string)h(as)g(w)o(ould)h(b)q(e)g(supplied)i(to)c
+Fs(printf)p Ft(,)h(p)q(ossibly)i(con)o(taining)195 1618
+y(con)o(v)o(ersion)22 b(sp)q(eci\014cations)i(suc)o(h)f(as)e(`)p
+Fs(\045d)p Ft(',)i(and)f(an)o(y)g(additional)h(argumen)o(ts)e
+(necessary)i(to)195 1673 y(satisfy)d(the)h(con)o(v)o(ersion)g(sp)q
+(eci\014cations.)38 b(The)21 b(resulting)h(string)e(is)i(displa)o(y)o
+(ed)g(in)f(the)g Fi(ec)o(ho)195 1728 y(area)p Ft(.)e(The)d(ec)o(ho)f
+(area)g(is)g(also)g(used)h(to)f(displa)o(y)h(n)o(umeric)g(argumen)o(ts)
+f(and)g(searc)o(h)g(strings.)1675 1826 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 1826 V 25 w(clear)p 359 1826
+V 27 w(message)g Fe(\()p Fs(void)p Fe(\))195 1881 y Ft(Clear)15
+b(the)h(message)e(in)i(the)g(ec)o(ho)f(area.)1675 1980
+y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p 242 1980
+V 25 w(sa)n(v)n(e)p 370 1980 V 26 w(prompt)h Fe(\()p
+Fs(void)p Fe(\))195 2034 y Ft(Sa)o(v)o(e)g(the)h(lo)q(cal)g(Readline)h
+(prompt)e(displa)o(y)i(state)e(in)h(preparation)f(for)g(displa)o(ying)j
+(a)d(new)195 2089 y(message)15 b(in)h(the)f(message)g(area)f(with)i
+Fs(rl_message\(\))p Ft(.)1675 2188 y([F)l(unction])-1800
+b Fg(void)20 b Ff(rl)p 242 2188 V 25 w(restore)p 441
+2188 V 25 w(prompt)g Fe(\()p Fs(void)p Fe(\))195 2243
+y Ft(Restore)g(the)i(lo)q(cal)g(Readline)h(prompt)e(displa)o(y)h(state)
+f(sa)o(v)o(ed)g(b)o(y)g(the)g(most)g(recen)o(t)g(call)i(to)195
+2297 y Fs(rl_save_prompt)p Ft(.)1675 2396 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 2396 V 25 w(expand)p 421 2396
+V 25 w(prompt)h Fe(\()p Fs(char)14 b(*prompt)p Fe(\))195
+2451 y Ft(Expand)22 b(an)o(y)f(sp)q(ecial)i(c)o(haracter)e(sequences)h
+(in)g Fi(prompt)g Ft(and)g(set)f(up)h(the)f(lo)q(cal)i(Readline)195
+2506 y(prompt)17 b(redispla)o(y)i(v)m(ariables.)30 b(This)18
+b(function)h(is)f(called)i(b)o(y)e Fs(readline\(\))p
+Ft(.)26 b(It)18 b(ma)o(y)f(also)h(b)q(e)195 2560 y(called)12
+b(to)e(expand)h(the)g(primary)g(prompt)f(if)h(the)f Fs
+(rl_on_new_line_with_prompt\(\))d Ft(function)195 2615
+y(or)12 b Fs(rl_already_prompted)e Ft(v)m(ariable)k(is)g(used.)19
+b(It)13 b(returns)g(the)f(n)o(um)o(b)q(er)i(of)e(visible)j(c)o
+(haracters)195 2670 y(on)g(the)g(last)h(line)g(of)f(the)g(\(p)q
+(ossibly)i(m)o(ulti-line\))g(prompt.)p eop
+%%Page: 34 38
+34 37 bop 75 -58 a Ft(34)1299 b(GNU)15 b(Readline)h(Library)1675
+149 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 149
+18 3 v 25 w(set)p 312 149 V 26 w(prompt)g Fe(\()p Fs(const)14
+b(char)h(*prompt)p Fe(\))195 204 y Ft(Mak)o(e)e(Readline)i(use)e
+Fi(prompt)h Ft(for)f(subsequen)o(t)h(redispla)o(y)l(.)21
+b(This)14 b(calls)g Fs(rl_expand_prompt\(\))195 259 y
+Ft(to)h(expand)g(the)h(prompt)e(and)i(sets)f Fs(rl_prompt)f
+Ft(to)g(the)h(result.)75 375 y Fh(2.4.7)30 b(Mo)r(difying)20
+b(T)-5 b(ext)1675 499 y Ft([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 499 V 25 w(insert)p 383 499 V 26 w(text)k
+Fe(\()p Fs(const)14 b(char)g(*text)p Fe(\))195 554 y
+Ft(Insert)i Fi(text)g Ft(in)o(to)g(the)g(line)h(at)f(the)g(curren)o(t)f
+(cursor)h(p)q(osition.)22 b(Returns)16 b(the)g(n)o(um)o(b)q(er)g(of)f
+(c)o(har-)195 608 y(acters)g(inserted.)1675 704 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 704 V 25 w(delete)p 388 704
+V 27 w(text)k Fe(\()p Fs(int)14 b(start,)h(int)g(end)p
+Fe(\))195 759 y Ft(Delete)k(the)g(text)g(b)q(et)o(w)o(een)g
+Fi(start)g Ft(and)g Fi(end)i Ft(in)f(the)f(curren)o(t)f(line.)33
+b(Returns)18 b(the)h(n)o(um)o(b)q(er)g(of)195 814 y(c)o(haracters)14
+b(deleted.)1675 910 y([F)l(unction])-1800 b Fg(char)20
+b(*)f Ff(rl)p 287 910 V 26 w(cop)n(y)p 427 910 V 25 w(text)24
+b Fe(\()p Fs(int)15 b(start,)f(int)h(end)p Fe(\))195
+965 y Ft(Return)g(a)g(cop)o(y)g(of)g(the)g(text)f(b)q(et)o(w)o(een)i
+Fi(start)f Ft(and)g Fi(end)j Ft(in)e(the)f(curren)o(t)g(line.)1675
+1060 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+1060 V 25 w(kill)p 316 1060 V 28 w(text)k Fe(\()p Fs(int)15
+b(start,)f(int)h(end)p Fe(\))195 1115 y Ft(Cop)o(y)i(the)g(text)f(b)q
+(et)o(w)o(een)i Fi(start)f Ft(and)g Fi(end)i Ft(in)f(the)f(curren)o(t)g
+(line)i(to)e(the)g(kill)i(ring,)e(app)q(ending)195 1170
+y(or)f(prep)q(ending)k(to)c(the)h(last)g(kill)i(if)e(the)g(last)g
+(command)g(w)o(as)f(a)h(kill)i(command.)25 b(The)17 b(text)f(is)195
+1225 y(deleted.)26 b(If)17 b Fi(start)g Ft(is)g(less)g(than)g
+Fi(end)p Ft(,)g(the)g(text)g(is)g(app)q(ended,)h(otherwise)f(prep)q
+(ended.)27 b(If)17 b(the)195 1280 y(last)e(command)g(w)o(as)g(not)f(a)h
+(kill,)i(a)e(new)g(kill)i(ring)f(slot)f(is)h(used.)1675
+1375 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+1375 V 25 w(push)p 360 1375 V 25 w(macro)p 540 1375 V
+23 w(input)j Fe(\()p Fs(char)15 b(*macro)p Fe(\))195
+1430 y Ft(Cause)f Fi(macro)i Ft(to)d(b)q(e)i(inserted)g(in)o(to)f(the)g
+(line,)i(as)e(if)g(it)h(had)f(b)q(een)h(in)o(v)o(ok)o(ed)g(b)o(y)f(a)g
+(k)o(ey)g(b)q(ound)h(to)195 1485 y(a)g(macro.)k(Not)c(esp)q(ecially)i
+(useful;)f(use)g Fs(rl_insert_text\(\))d Ft(instead.)75
+1601 y Fh(2.4.8)30 b(Character)21 b(Input)1675 1725 y
+Ft([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 1725
+V 25 w(read)p 351 1725 V 25 w(k)n(ey)k Fe(\()p Fs(void)p
+Fe(\))195 1780 y Ft(Return)14 b(the)h(next)g(c)o(haracter)f(a)o(v)m
+(ailable)i(from)e(Readline's)i(curren)o(t)f(input)g(stream.)k(This)d
+(han-)195 1834 y(dles)e(input)g(inserted)h(in)o(to)e(the)g(input)h
+(stream)f(via)g Fi(rl)p 1112 1834 14 2 v 21 w(p)q(ending)p
+1289 1834 V 22 w(input)i Ft(\(see)e(Section)h(2.3)f([Read-)195
+1889 y(line)21 b(V)l(ariables],)g(page)f(24\))f(and)h
+Fs(rl_stuff_char\(\))p Ft(,)e(macros,)h(and)h(c)o(haracters)f(read)h
+(from)195 1944 y(the)d(k)o(eyb)q(oard.)25 b(While)19
+b(w)o(aiting)e(for)f(input,)j(this)e(function)h(will)h(call)f(an)o(y)e
+(function)i(assigned)195 1999 y(to)d(the)g Fs(rl_event_hook)e
+Ft(v)m(ariable.)1675 2095 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 2095 18 3 v 25 w(getc)k Fe(\()p Fs(FILE)14
+b(*stream)p Fe(\))195 2149 y Ft(Return)c(the)h(next)g(c)o(haracter)f(a)
+o(v)m(ailable)i(from)e Fi(stream)p Ft(,)g(whic)o(h)i(is)f(assumed)f(to)
+g(b)q(e)i(the)e(k)o(eyb)q(oard.)1675 2245 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 2245 V 25 w(stu\013)p 351 2245
+V 26 w(c)n(har)i Fe(\()p Fs(int)15 b(c)p Fe(\))195 2300
+y Ft(Insert)i Fi(c)i Ft(in)o(to)d(the)h(Readline)h(input)f(stream.)23
+b(It)16 b(will)i(b)q(e)f Fs(")p Ft(read)p Fs(")g Ft(b)q(efore)f
+(Readline)i(attempts)195 2355 y(to)13 b(read)g(c)o(haracters)g(from)f
+(the)i(terminal)g(with)g Fs(rl_read_key\(\))p Ft(.)j(Up)d(to)f(512)f(c)
+o(haracters)h(ma)o(y)195 2410 y(b)q(e)j(pushed)g(bac)o(k.)k
+Fs(rl_stuff_char)14 b Ft(returns)h(1)g(if)h(the)f(c)o(haracter)g(w)o
+(as)f(successfully)j(inserted;)195 2465 y(0)e(otherwise.)1675
+2560 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+2560 V 25 w(execute)p 428 2560 V 27 w(next)j Fe(\()p
+Fs(int)15 b(c)p Fe(\))195 2615 y Ft(Mak)o(e)i Fi(c)k
+Ft(b)q(e)d(the)g(next)g(command)g(to)f(b)q(e)i(executed)f(when)h
+Fs(rl_read_key\(\))d Ft(is)i(called.)29 b(This)195 2670
+y(sets)15 b Fi(rl)p 317 2670 14 2 v 20 w(p)q(ending)p
+493 2670 V 22 w(input)p Ft(.)p eop
+%%Page: 35 39
+35 38 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(35)1675 149 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 149 18 3 v 25 w(clear)p 359 149 V 27 w(p)r(ending)p
+586 149 V 24 w(input)k Fe(\()p Fs(void)p Fe(\))195 204
+y Ft(Unset)d Fi(rl)p 364 204 14 2 v 20 w(p)q(ending)p
+540 204 V 22 w(input)p Ft(,)i(e\013ectiv)o(ely)f(negating)f(the)g
+(e\013ect)g(of)f(an)o(y)h(previous)g(call)h(to)e Fs(rl_)195
+259 y(execute_next\(\))p Ft(.)29 b(This)19 b(w)o(orks)f(only)h(if)h
+(the)e(p)q(ending)j(input)f(has)f(not)f(already)h(b)q(een)h(read)195
+314 y(with)c Fs(rl_read_key\(\))p Ft(.)1675 404 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 404 18 3 v 25 w(set)p 312 404
+V 26 w(k)n(eyb)r(oard)p 569 404 V 24 w(input)p 726 404
+V 26 w(timeout)j Fe(\()p Fs(int)14 b(u)p Fe(\))195 459
+y Ft(While)21 b(w)o(aiting)g(for)e(k)o(eyb)q(oard)h(input)h(in)g
+Fs(rl_read_key\(\))p Ft(,)e(Readline)i(will)h(w)o(ait)e(for)f
+Fi(u)h Ft(mi-)195 514 y(croseconds)h(for)e(input)j(b)q(efore)f(calling)
+h(an)o(y)e(function)h(assigned)g(to)f Fs(rl_event_hook)p
+Ft(.)34 b(The)195 569 y(default)16 b(w)o(aiting)f(p)q(erio)q(d)i(is)e
+(one-ten)o(th)h(of)e(a)h(second.)21 b(Returns)14 b(the)i(old)f(timeout)
+h(v)m(alue.)75 679 y Fh(2.4.9)30 b(T)-5 b(erminal)20
+b(Managemen)n(t)1675 800 y Ft([F)l(unction])-1800 b Fg(void)20
+b Ff(rl)p 242 800 V 25 w(prep)p 381 800 V 25 w(terminal)j
+Fe(\()p Fs(int)15 b(meta_flag)p Fe(\))195 855 y Ft(Mo)q(dify)22
+b(the)f(terminal)h(settings)f(for)g(Readline's)h(use,)h(so)d
+Fs(readline\(\))g Ft(can)i(read)f(a)g(single)195 910
+y(c)o(haracter)15 b(at)g(a)g(time)g(from)g(the)h(k)o(eyb)q(oard.)k(The)
+c Fi(meta)p 1189 910 14 2 v 19 w(\015ag)j Ft(argumen)o(t)c(should)i(b)q
+(e)f(non-zero)195 965 y(if)g(Readline)g(should)g(read)f(eigh)o(t-bit)i
+(input.)1675 1055 y([F)l(unction])-1800 b Fg(void)20
+b Ff(rl)p 242 1055 18 3 v 25 w(deprep)p 439 1055 V 25
+w(terminal)j Fe(\()p Fs(void)p Fe(\))195 1110 y Ft(Undo)16
+b(the)g(e\013ects)f(of)h Fs(rl_prep_terminal\(\))p Ft(,)d(lea)o(ving)k
+(the)e(terminal)i(in)g(the)e(state)g(in)i(whic)o(h)195
+1165 y(it)e(w)o(as)g(b)q(efore)g(the)h(most)e(recen)o(t)h(call)i(to)d
+Fs(rl_prep_terminal\(\))p Ft(.)1675 1255 y([F)l(unction])-1800
+b Fg(void)20 b Ff(rl)p 242 1255 V 25 w(tt)n(y)p 339 1255
+V 27 w(set)p 437 1255 V 25 w(default)p 635 1255 V 26
+w(bindings)j Fe(\()p Fs(Keymap)14 b(kmap)p Fe(\))195
+1310 y Ft(Read)k(the)h(op)q(erating)f(system's)g(terminal)h(editing)h
+(c)o(haracters)e(\(as)f(w)o(ould)i(b)q(e)g(displa)o(y)o(ed)h(b)o(y)195
+1365 y Fs(stty)p Ft(\))14 b(to)h(their)h(Readline)g(equiv)m(alen)o(ts.)
+22 b(The)15 b(bindings)i(are)e(p)q(erformed)g(in)h Fi(kmap)p
+Ft(.)1675 1455 y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p
+242 1455 V 25 w(tt)n(y)p 339 1455 V 27 w(unset)p 501
+1455 V 25 w(default)p 699 1455 V 25 w(bindings)k Fe(\()p
+Fs(Keymap)14 b(kmap)p Fe(\))195 1510 y Ft(Reset)h(the)h(bindings)i
+(manipulated)f(b)o(y)f Fs(rl_tty_set_default_bindings)c
+Ft(so)k(that)f(the)h(ter-)195 1564 y(minal)21 b(editing)g(c)o
+(haracters)e(are)h(b)q(ound)g(to)f Fs(rl_insert)p Ft(.)33
+b(The)20 b(bindings)i(are)d(p)q(erformed)h(in)195 1619
+y Fi(kmap)p Ft(.)1675 1710 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 1710 V 25 w(reset)p 362 1710 V 25 w(terminal)k
+Fe(\()p Fs(const)14 b(char)g(*terminal_name)p Fe(\))195
+1764 y Ft(Reinitialize)h(Readline's)d(idea)h(of)f(the)g(terminal)g
+(settings)g(using)h Fi(terminal)p 1488 1764 14 2 v 21
+w(name)h Ft(as)e(the)g(termi-)195 1819 y(nal)k(t)o(yp)q(e)g(\(e.g.,)f
+Fs(vt100)p Ft(\).)21 b(If)16 b Fi(terminal)p 876 1819
+V 21 w(name)i Ft(is)f Fs(NULL)p Ft(,)e(the)h(v)m(alue)h(of)e(the)h
+Fs(TERM)g Ft(en)o(vironmen)o(t)195 1874 y(v)m(ariable)h(is)e(used.)75
+1984 y Fh(2.4.10)29 b(Utilit)n(y)22 b(F)-5 b(unctions)1675
+2106 y Ft([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p
+242 2106 18 3 v 25 w(replace)p 443 2106 V 27 w(line)k
+Fe(\()p Fs(const)15 b(char)f(*text,)g(int)h(clear_undo)p
+Fe(\))195 2161 y Ft(Replace)20 b(the)g(con)o(ten)o(ts)f(of)g
+Fs(rl_line_buffer)f Ft(with)i Fi(text)p Ft(.)33 b(The)20
+b(p)q(oin)o(t)g(and)g(mark)f(are)h(pre-)195 2215 y(serv)o(ed,)13
+b(if)g(p)q(ossible.)21 b(If)13 b Fi(clear)p 711 2215
+14 2 v 21 w(undo)i Ft(is)e(non-zero,)h(the)e(undo)i(list)f(asso)q
+(ciated)g(with)g(the)g(curren)o(t)195 2270 y(line)k(is)f(cleared.)1675
+2360 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216
+2360 18 3 v 25 w(extend)p 409 2360 V 26 w(line)p 523
+2360 V 27 w(bu\013er)j Fe(\()p Fs(int)14 b(len)p Fe(\))195
+2415 y Ft(Ensure)h(that)g Fs(rl_line_buffer)e Ft(has)i(enough)g(space)h
+(to)e(hold)i Fi(len)g Ft(c)o(haracters,)e(p)q(ossibly)i(real-)195
+2470 y(lo)q(cating)g(it)f(if)h(necessary)l(.)1675 2560
+y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 2560
+V 25 w(initial)q(i)q(ze)26 b Fe(\()p Fs(void)p Fe(\))195
+2615 y Ft(Initialize)21 b(or)d(re-initialize)k(Readline's)d(in)o
+(ternal)h(state.)28 b(It's)18 b(not)g(strictly)h(necessary)g(to)f(call)
+195 2670 y(this;)d Fs(readline\(\))f Ft(calls)i(it)g(b)q(efore)f
+(reading)h(an)o(y)f(input.)p eop
+%%Page: 36 40
+36 39 bop 75 -58 a Ft(36)1299 b(GNU)15 b(Readline)h(Library)1675
+149 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 149
+18 3 v 25 w(ding)j Fe(\()p Fs(void)p Fe(\))195 204 y
+Ft(Ring)15 b(the)g(terminal)h(b)q(ell,)h(ob)q(eying)f(the)g(setting)f
+(of)g Fs(bell-style)p Ft(.)1675 305 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 305 V 25 w(alphab)r(etic)25
+b Fe(\()p Fs(int)14 b(c)p Fe(\))195 360 y Ft(Return)h(1)g(if)g
+Fi(c)j Ft(is)e(an)f(alphab)q(etic)i(c)o(haracter.)1675
+462 y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p 242
+462 V 25 w(displa)n(y)p 440 462 V 27 w(matc)n(h)p 621
+462 V 25 w(list)k Fe(\()p Fs(char)15 b(**matches,)e(int)i(len,)g(int)g
+(max)p Fe(\))195 516 y Ft(A)i(con)o(v)o(enience)i(function)f(for)f
+(displa)o(ying)i(a)e(list)h(of)e(strings)h(in)i(columnar)e(format)f(on)
+h(Read-)195 571 y(line's)h(output)f(stream.)23 b Fs(matches)16
+b Ft(is)h(the)g(list)h(of)e(strings,)h(in)g(argv)f(format,)g(suc)o(h)h
+(as)f(a)h(list)g(of)195 626 y(completion)c(matc)o(hes.)19
+b Fs(len)11 b Ft(is)i(the)f(n)o(um)o(b)q(er)h(of)e(strings)h(in)h
+Fs(matches)p Ft(,)f(and)g Fs(max)g Ft(is)g(the)h(length)f(of)195
+681 y(the)h(longest)g(string)g(in)h Fs(matches)p Ft(.)19
+b(This)13 b(function)h(uses)f(the)h(setting)f(of)f Fs
+(print-completions-)195 736 y(horizontally)k Ft(to)i(select)h(ho)o(w)e
+(the)i(matc)o(hes)e(are)h(displa)o(y)o(ed)h(\(see)g(Section)g(1.3.1)d
+([Readline)195 790 y(Init)g(File)g(Syn)o(tax],)e(page)h(4\).)137
+892 y(The)i(follo)o(wing)f(are)g(implemen)o(ted)i(as)e(macros,)f
+(de\014ned)i(in)g Fs(chardefs.h)p Ft(.)k(Applications)d(should)75
+946 y(refrain)d(from)g(using)h(them.)1675 1048 y([F)l(unction])-1800
+b Fg(int)p 177 1048 V 45 w Ff(rl)p 241 1048 V 25 w(upp)r(ercase)p
+516 1048 V 25 w(p)22 b Fe(\()p Fs(int)15 b(c)p Fe(\))195
+1102 y Ft(Return)g(1)g(if)g Fi(c)j Ft(is)e(an)f(upp)q(ercase)i(alphab)q
+(etic)f(c)o(haracter.)1675 1204 y([F)l(unction])-1800
+b Fg(int)p 177 1204 V 45 w Ff(rl)p 241 1204 V 25 w(lo)n(w)n(ercase)p
+499 1204 V 27 w(p)23 b Fe(\()p Fs(int)14 b(c)p Fe(\))195
+1258 y Ft(Return)h(1)g(if)g Fi(c)j Ft(is)e(a)f(lo)o(w)o(ercase)g
+(alphab)q(etic)i(c)o(haracter.)1675 1360 y([F)l(unction])-1800
+b Fg(int)p 177 1360 V 45 w Ff(rl)p 241 1360 V 25 w(digit)p
+379 1360 V 27 w(p)23 b Fe(\()p Fs(int)14 b(c)p Fe(\))195
+1414 y Ft(Return)h(1)g(if)g Fi(c)j Ft(is)e(a)f(n)o(umeric)h(c)o
+(haracter.)1675 1516 y([F)l(unction])-1800 b Fg(int)p
+177 1516 V 45 w Ff(rl)p 241 1516 V 25 w(to)p 317 1516
+V 26 w(upp)r(er)21 b Fe(\()p Fs(int)15 b(c)p Fe(\))195
+1571 y Ft(If)d Fi(c)j Ft(is)d(a)g(lo)o(w)o(ercase)f(alphab)q(etic)j(c)o
+(haracter,)d(return)h(the)g(corresp)q(onding)h(upp)q(ercase)g(c)o
+(haracter.)1675 1672 y([F)l(unction])-1800 b Fg(int)p
+177 1672 V 45 w Ff(rl)p 241 1672 V 25 w(to)p 317 1672
+V 26 w(lo)n(w)n(er)24 b Fe(\()p Fs(int)14 b(c)p Fe(\))195
+1727 y Ft(If)h Fi(c)i Ft(is)e(an)f(upp)q(ercase)i(alphab)q(etic)g(c)o
+(haracter,)e(return)g(the)h(corresp)q(onding)g(lo)o(w)o(ercase)f(c)o
+(harac-)195 1781 y(ter.)1675 1883 y([F)l(unction])-1800
+b Fg(int)p 177 1883 V 45 w Ff(rl)p 241 1883 V 25 w(digit)p
+379 1883 V 27 w(v)m(alue)24 b Fe(\()p Fs(int)14 b(c)p
+Fe(\))195 1937 y Ft(If)h Fi(c)k Ft(is)c(a)g(n)o(um)o(b)q(er,)g(return)g
+(the)h(v)m(alue)g(it)g(represen)o(ts.)75 2059 y Fh(2.4.11)29
+b(Miscellaneous)22 b(F)-5 b(unctions)1675 2185 y Ft([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 2185 V 25 w(macro)p 396 2185
+V 24 w(bind)j Fe(\()p Fs(const)14 b(char)h(*keyseq,)f(const)g(char)h
+(*macro,)f(Keymap)283 2240 y(map)p Fe(\))195 2295 y Ft(Bind)f(the)f(k)o
+(ey)f(sequence)i Fi(k)o(eyseq)g Ft(to)e(in)o(v)o(ok)o(e)g(the)h(macro)f
+Fi(macro)p Ft(.)18 b(The)12 b(binding)h(is)f(p)q(erformed)g(in)195
+2350 y Fi(map)p Ft(.)19 b(When)14 b Fi(k)o(eyseq)h Ft(is)f(in)o(v)o(ok)
+o(ed,)g(the)g Fi(macro)i Ft(will)f(b)q(e)f(inserted)h(in)o(to)f(the)g
+(line.)21 b(This)14 b(function)195 2404 y(is)i(deprecated;)f(use)h
+Fs(rl_generic_bind\(\))d Ft(instead.)1675 2506 y([F)l(unction])-1800
+b Fg(void)20 b Ff(rl)p 242 2506 V 25 w(macro)p 422 2506
+V 24 w(dump)r(er)g Fe(\()p Fs(int)15 b(readable)p Fe(\))195
+2560 y Ft(Prin)o(t)f(the)f(k)o(ey)h(sequences)g(b)q(ound)h(to)e(macros)
+g(and)g(their)h(v)m(alues,)h(using)f(the)g(curren)o(t)g(k)o(eymap,)195
+2615 y(to)h Fs(rl_outstream)p Ft(.)k(If)d Fi(readable)j
+Ft(is)d(non-zero,)g(the)g(list)g(is)g(formatted)f(in)h(suc)o(h)g(a)f(w)
+o(a)o(y)g(that)g(it)195 2670 y(can)g(b)q(e)h(made)f(part)g(of)g(an)g
+Fs(inputrc)f Ft(\014le)i(and)g(re-read.)p eop
+%%Page: 37 41
+37 40 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(37)1675 149 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 149 18 3 v 25 w(v)m(ariable)p 436 149 V
+27 w(bind)j Fe(\()p Fs(const)14 b(char)h(*variable,)e(const)i(char)f
+(*value)p Fe(\))195 204 y Ft(Mak)o(e)g(the)g(Readline)i(v)m(ariable)g
+Fi(v)m(ariable)i Ft(ha)o(v)o(e)d Fi(v)m(alue)p Ft(.)20
+b(This)c(b)q(eha)o(v)o(es)e(as)g(if)h(the)g(readline)h(com-)195
+259 y(mand)e(`)p Fs(set)h Fl(variable)k(value)5 b Ft(')14
+b(had)g(b)q(een)i(executed)f(in)h(an)e Fs(inputrc)f Ft(\014le)j(\(see)e
+(Section)i(1.3.1)195 314 y([Readline)g(Init)g(File)h(Syn)o(tax],)d
+(page)h(4\).)1675 403 y([F)l(unction])-1800 b Fg(void)20
+b Ff(rl)p 242 403 V 25 w(v)m(ariable)p 462 403 V 27 w(dump)r(er)g
+Fe(\()p Fs(int)15 b(readable)p Fe(\))195 458 y Ft(Prin)o(t)f(the)h
+(readline)h(v)m(ariable)f(names)g(and)f(their)h(curren)o(t)f(v)m(alues)
+i(to)d Fs(rl_outstream)p Ft(.)18 b(If)d Fi(read-)195
+513 y(able)20 b Ft(is)e(non-zero,)f(the)g(list)h(is)g(formatted)e(in)h
+(suc)o(h)h(a)e(w)o(a)o(y)g(that)h(it)g(can)g(b)q(e)h(made)f(part)f(of)h
+(an)195 568 y Fs(inputrc)d Ft(\014le)i(and)g(re-read.)1675
+657 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 657
+V 25 w(set)p 312 657 V 26 w(paren)p 480 657 V 24 w(blink)p
+628 657 V 27 w(timeout)j Fe(\()p Fs(int)14 b(u)p Fe(\))195
+712 y Ft(Set)f(the)f(time)h(in)o(terv)m(al)h(\(in)f(microseconds\))g
+(that)f(Readline)i(w)o(aits)e(when)h(sho)o(wing)f(a)h(balancing)195
+767 y(c)o(haracter)h(when)i Fs(blink-matching-paren)d
+Ft(has)i(b)q(een)h(enabled.)1675 856 y([F)l(unction])-1800
+b Fg(char)20 b(*)f Ff(rl)p 287 856 V 26 w(get)p 390 856
+V 25 w(termcap)j Fe(\()p Fs(const)14 b(char)h(*cap)p
+Fe(\))195 911 y Ft(Retriev)o(e)e(the)h(string)f(v)m(alue)i(of)e(the)h
+(termcap)f(capabilit)o(y)i Fi(cap)p Ft(.)k(Readline)c(fetc)o(hes)f(the)
+f(termcap)195 966 y(en)o(try)j(for)h(the)f(curren)o(t)h(terminal)h
+(name)e(and)h(uses)g(those)g(capabilities)i(to)d(mo)o(v)o(e)g(around)h
+(the)195 1020 y(screen)11 b(line)h(and)f(p)q(erform)f(other)g
+(terminal-sp)q(eci\014c)k(op)q(erations,)d(lik)o(e)h(erasing)e(a)h
+(line.)20 b(Readline)195 1075 y(do)q(es)e(not)f(use)h(all)g(of)f(a)g
+(terminal's)h(capabilities,)i(and)e(this)g(function)g(will)h(return)f
+(v)m(alues)h(for)195 1130 y(only)d(those)f(capabilities)i(Readline)g
+(uses.)75 1239 y Fh(2.4.12)29 b(Alternate)21 b(In)n(terface)137
+1361 y Ft(An)i(alternate)f(in)o(terface)h(is)g(a)o(v)m(ailable)h(to)d
+(plain)j Fs(readline\(\))p Ft(.)40 b(Some)22 b(applications)i(need)g
+(to)75 1415 y(in)o(terlea)o(v)o(e)15 b(k)o(eyb)q(oard)f(I/O)h(with)g
+(\014le,)h(device,)f(or)f(windo)o(w)h(system)f(I/O,)h(t)o(ypically)h(b)
+o(y)e(using)h(a)g(main)75 1470 y(lo)q(op)f(to)g Fs(select\(\))e
+Ft(on)i(v)m(arious)g(\014le)h(descriptors.)20 b(T)l(o)14
+b(accomo)q(date)f(this)h(need,)h(readline)g(can)f(also)g(b)q(e)75
+1525 y(in)o(v)o(ok)o(ed)i(as)f(a)g(`callbac)o(k')h(function)h(from)d
+(an)i(ev)o(en)o(t)f(lo)q(op.)22 b(There)16 b(are)f(functions)h(a)o(v)m
+(ailable)i(to)c(mak)o(e)75 1580 y(this)i(easy)l(.)1675
+1669 y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p 242
+1669 V 25 w(callbac)n(k)p 463 1669 V 29 w(handler)p 681
+1669 V 25 w(install)25 b Fe(\()p Fs(const)14 b(char)h(*prompt,)283
+1724 y(rl_vcpfunc_t)e(*lhandler)p Fe(\))195 1779 y Ft(Set)f(up)h(the)g
+(terminal)g(for)f(readline)i(I/O)f(and)f(displa)o(y)i(the)e(initial)j
+(expanded)e(v)m(alue)h(of)e Fi(prompt)p Ft(.)195 1834
+y(Sa)o(v)o(e)j(the)h(v)m(alue)h(of)f Fi(lhandler)21 b
+Ft(to)15 b(use)h(as)f(a)h(function)h(to)e(call)i(when)f(a)g(complete)g
+(line)i(of)d(input)195 1888 y(has)g(b)q(een)h(en)o(tered.)21
+b(The)15 b(function)h(tak)o(es)e(the)i(text)e(of)h(the)g(line)i(as)e
+(an)g(argumen)o(t.)1675 1978 y([F)l(unction])-1800 b
+Fg(void)20 b Ff(rl)p 242 1978 V 25 w(callbac)n(k)p 463
+1978 V 29 w(read)p 602 1978 V 24 w(c)n(har)j Fe(\()p
+Fs(void)p Fe(\))195 2033 y Ft(Whenev)o(er)17 b(an)g(application)h
+(determines)g(that)e(k)o(eyb)q(oard)h(input)h(is)f(a)o(v)m(ailable,)i
+(it)e(should)h(call)195 2087 y Fs(rl_callback_read_char\(\))p
+Ft(,)8 b(whic)o(h)k(will)g(read)f(the)g(next)g(c)o(haracter)f(from)g
+(the)h(curren)o(t)g(input)195 2142 y(source.)38 b(If)21
+b(that)g(c)o(haracter)f(completes)i(the)f(line,)j Fs
+(rl_callback_read_char)18 b Ft(will)23 b(in)o(v)o(ok)o(e)195
+2197 y(the)18 b Fi(lhandler)k Ft(function)d(sa)o(v)o(ed)e(b)o(y)h
+Fs(rl_callback_handler_insta)o(ll)d Ft(to)i(pro)q(cess)h(the)g(line.)
+195 2252 y(Before)13 b(calling)i(the)f Fi(lhandler)k
+Ft(function,)c(the)g(terminal)g(settings)f(are)g(reset)g(to)g(the)g(v)m
+(alues)i(they)195 2307 y(had)g(b)q(efore)g(calling)i
+Fs(rl_callback_handler_insta)o(ll)p Ft(.)g(If)e(the)g
+Fi(lhandler)20 b Ft(function)15 b(returns,)195 2361 y(the)d(terminal)i
+(settings)e(are)g(mo)q(di\014ed)i(for)d(Readline's)i(use)g(again.)19
+b Fs(EOF)12 b Ft(is)h(indicated)h(b)o(y)e(calling)195
+2416 y Fi(lhandler)20 b Ft(with)c(a)f Fs(NULL)f Ft(line.)1675
+2506 y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p 242
+2506 V 25 w(callbac)n(k)p 463 2506 V 29 w(handler)p 681
+2506 V 25 w(remo)n(v)n(e)i Fe(\()p Fs(void)p Fe(\))195
+2560 y Ft(Restore)c(the)g(terminal)i(to)d(its)i(initial)i(state)d(and)g
+(remo)o(v)o(e)g(the)h(line)h(handler.)31 b(This)19 b(ma)o(y)f(b)q(e)195
+2615 y(called)i(from)d(within)j(a)d(callbac)o(k)j(as)d(w)o(ell)i(as)f
+(indep)q(enden)o(tly)m(.)31 b(If)19 b(the)f Fi(lhandler)23
+b Ft(installed)d(b)o(y)195 2670 y Fs(rl_callback_handler_instal)o(l)d
+Ft(do)q(es)i(not)g(exit)h(the)g(program,)e(either)i(this)g(function)g
+(or)p eop
+%%Page: 38 42
+38 41 bop 75 -58 a Ft(38)1299 b(GNU)15 b(Readline)h(Library)195
+149 y(the)g(function)g(referred)g(to)f(b)o(y)h(the)g(v)m(alue)h(of)e
+Fs(rl_deprep_term_function)d Ft(should)17 b(b)q(e)f(called)195
+204 y(b)q(efore)f(the)h(program)e(exits)h(to)g(reset)g(the)g(terminal)h
+(settings.)75 330 y Fh(2.4.13)29 b(A)21 b(Readline)g(Example)137
+459 y Ft(Here)f(is)g(a)f(function)i(whic)o(h)f(c)o(hanges)f(lo)o(w)o
+(ercase)h(c)o(haracters)e(to)h(their)h(upp)q(ercase)h(equiv)m(alen)o
+(ts,)75 514 y(and)e(upp)q(ercase)i(c)o(haracters)d(to)h(lo)o(w)o
+(ercase.)31 b(If)20 b(this)f(function)h(w)o(as)f(b)q(ound)h(to)f(`)p
+Fs(M-c)p Ft(',)f(then)i(t)o(yping)75 568 y(`)p Fs(M-c)p
+Ft(')12 b(w)o(ould)h(c)o(hange)h(the)f(case)g(of)g(the)g(c)o(haracter)g
+(under)g(p)q(oin)o(t.)20 b(T)o(yping)14 b(`)p Fs(M-1)g(0)h(M-c)p
+Ft(')d(w)o(ould)i(c)o(hange)75 623 y(the)h(case)g(of)g(the)h(follo)o
+(wing)f(10)g(c)o(haracters,)f(lea)o(ving)i(the)f(cursor)g(on)g(the)h
+(last)f(c)o(haracter)f(c)o(hanged.)195 697 y Fs(/*)24
+b(Invert)f(the)g(case)g(of)h(the)f(COUNT)h(following)e(characters.)h
+(*/)195 752 y(int)195 807 y(invert_case_line)f(\(count,)h(key\))314
+862 y(int)h(count,)f(key;)195 917 y({)243 971 y(register)f(int)i
+(start,)f(end,)g(i;)243 1081 y(start)g(=)h(rl_point;)243
+1191 y(if)f(\(rl_point)g(>=)h(rl_end\))290 1245 y(return)f(\(0\);)243
+1355 y(if)g(\(count)g(<)h(0\))290 1410 y({)338 1465 y(direction)f(=)h
+(-1;)338 1519 y(count)f(=)h(-count;)290 1574 y(})243
+1629 y(else)290 1684 y(direction)f(=)h(1;)243 1793 y(/*)f(Find)h(the)f
+(end)h(of)f(the)h(range)f(to)g(modify.)g(*/)243 1848
+y(end)g(=)h(start)f(+)h(\(count)f(*)h(direction\);)243
+1958 y(/*)f(Force)g(it)h(to)g(be)f(within)g(range.)g(*/)243
+2012 y(if)g(\(end)h(>)f(rl_end\))290 2067 y(end)h(=)g(rl_end;)243
+2122 y(else)f(if)h(\(end)f(<)h(0\))290 2177 y(end)g(=)g(0;)243
+2286 y(if)f(\(start)g(==)h(end\))290 2341 y(return)f(\(0\);)243
+2451 y(if)g(\(start)g(>)h(end\))290 2506 y({)338 2560
+y(int)g(temp)f(=)h(start;)338 2615 y(start)f(=)h(end;)338
+2670 y(end)g(=)f(temp;)p eop
+%%Page: 39 43
+39 42 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(39)290 149 y Fs(})243 259 y(/*)23 b(Tell)h(readline)e
+(that)i(we)f(are)h(modifying)e(the)i(line,)314 314 y(so)g(it)f(will)h
+(save)f(the)h(undo)f(information.)f(*/)243 369 y(rl_modifying)g
+(\(start,)h(end\);)243 478 y(for)g(\(i)h(=)f(start;)h(i)f(!=)h(end;)f
+(i++\))290 533 y({)338 588 y(if)h(\(_rl_uppercase_p)d
+(\(rl_line_buffer[i]\)\))386 643 y(rl_line_buffer[i])g(=)j
+(_rl_to_lower)e(\(rl_line_buffer[i]\);)338 697 y(else)h(if)h
+(\(_rl_lowercase_p)e(\(rl_line_buffer[i]\)\))386 752
+y(rl_line_buffer[i])f(=)j(_rl_to_upper)e(\(rl_line_buffer[i]\);)290
+807 y(})243 862 y(/*)h(Move)h(point)f(to)g(on)h(top)f(of)h(the)f(last)h
+(character)e(changed.)h(*/)243 917 y(rl_point)f(=)i(\(direction)f(==)g
+(1\))h(?)g(end)f(-)h(1)g(:)f(start;)243 971 y(return)g(\(0\);)195
+1026 y(})75 1149 y Fr(2.5)33 b(Readline)23 b(Signal)h(Handling)137
+1269 y Ft(Signals)e(are)f(async)o(hronous)f(ev)o(en)o(ts)h(sen)o(t)f
+(to)h(a)f(pro)q(cess)h(b)o(y)g(the)g(Unix)h(k)o(ernel,)g(sometimes)f
+(on)75 1324 y(b)q(ehalf)g(of)e(another)h(pro)q(cess.)34
+b(They)20 b(are)g(in)o(tended)h(to)e(indicate)j(exceptional)f(ev)o(en)o
+(ts,)f(lik)o(e)h(a)f(user)75 1378 y(pressing)c(the)f(in)o(terrupt)g(k)o
+(ey)g(on)g(his)h(terminal,)f(or)g(a)f(net)o(w)o(ork)g(connection)i(b)q
+(eing)g(brok)o(en.)k(There)15 b(is)75 1433 y(a)e(class)g(of)g(signals)h
+(that)f(can)g(b)q(e)h(sen)o(t)f(to)f(the)i(pro)q(cess)f(curren)o(tly)h
+(reading)f(input)i(from)d(the)h(k)o(eyb)q(oard.)75 1488
+y(Since)i(Readline)f(c)o(hanges)g(the)f(terminal)h(attributes)f(when)h
+(it)g(is)g(called,)h(it)e(needs)h(to)f(p)q(erform)g(sp)q(ecial)75
+1543 y(pro)q(cessing)i(when)f(suc)o(h)g(a)g(signal)g(is)g(receiv)o(ed)h
+(in)g(order)f(to)f(restore)g(the)h(terminal)g(to)f(a)h(sane)g(state,)e
+(or)75 1598 y(pro)o(vide)k(application)h(writers)e(with)g(functions)h
+(to)f(do)g(so)g(man)o(ually)l(.)137 1663 y(Readline)22
+b(con)o(tains)e(an)g(in)o(ternal)h(signal)g(handler)g(that)f(is)h
+(installed)h(for)d(a)h(n)o(um)o(b)q(er)g(of)g(signals)75
+1718 y(\()p Fs(SIGINT)p Ft(,)h Fs(SIGQUIT)p Ft(,)g Fs(SIGTERM)p
+Ft(,)g Fs(SIGALRM)p Ft(,)g Fs(SIGTSTP)p Ft(,)g Fs(SIGTTIN)p
+Ft(,)h(and)f Fs(SIGTTOU)p Ft(\).)36 b(When)21 b(one)g(of)75
+1772 y(these)16 b(signals)h(is)f(receiv)o(ed,)h(the)f(signal)h(handler)
+f(will)i(reset)e(the)g(terminal)g(attributes)g(to)f(those)h(that)75
+1827 y(w)o(ere)d(in)i(e\013ect)e(b)q(efore)h Fs(readline\(\))e
+Ft(w)o(as)h(called,)i(reset)f(the)f(signal)i(handling)g(to)e(what)g(it)
+h(w)o(as)f(b)q(efore)75 1882 y Fs(readline\(\))21 b Ft(w)o(as)h
+(called,)j(and)e(resend)g(the)g(signal)g(to)f(the)h(calling)h
+(application.)44 b(If)23 b(and)f(when)75 1937 y(the)17
+b(calling)i(application's)f(signal)g(handler)g(returns,)f(Readline)h
+(will)h(reinitialize)h(the)d(terminal)h(and)75 1992 y(con)o(tin)o(ue)d
+(to)e(accept)i(input.)20 b(When)15 b(a)e Fs(SIGINT)h
+Ft(is)g(receiv)o(ed,)h(the)g(Readline)g(signal)g(handler)g(p)q(erforms)
+75 2046 y(some)k(additional)i(w)o(ork,)e(whic)o(h)h(will)h(cause)f(an)o
+(y)f(partially-en)o(tered)i(line)g(to)d(b)q(e)i(ab)q(orted)g(\(see)f
+(the)75 2101 y(description)e(of)d Fs(rl_free_line_state\(\))f
+Ft(b)q(elo)o(w\).)137 2166 y(There)g(is)f(an)g(additional)i(Readline)g
+(signal)f(handler,)g(for)f Fs(SIGWINCH)p Ft(,)f(whic)o(h)i(the)f(k)o
+(ernel)h(sends)g(to)e(a)75 2221 y(pro)q(cess)k(whenev)o(er)g(the)f
+(terminal's)h(size)g(c)o(hanges)f(\(for)g(example,)h(if)g(a)f(user)h
+(resizes)g(an)f Fs(xterm)p Ft(\).)19 b(The)75 2276 y(Readline)g
+Fs(SIGWINCH)e Ft(handler)i(up)q(dates)f(Readline's)h(in)o(ternal)f
+(screen)h(size)f(information,)h(and)f(then)75 2331 y(calls)g(an)o(y)f
+Fs(SIGWINCH)e Ft(signal)j(handler)g(the)f(calling)i(application)f(has)f
+(installed.)27 b(Readline)18 b(calls)g(the)75 2386 y(application's)h
+Fs(SIGWINCH)d Ft(signal)j(handler)f(without)g(resetting)g(the)f
+(terminal)i(to)e(its)g(original)i(state.)75 2440 y(If)d(the)g
+(application's)h(signal)g(handler)g(do)q(es)g(more)e(than)h(up)q(date)h
+(its)f(idea)h(of)e(the)h(terminal)h(size)g(and)75 2495
+y(return)e(\(for)f(example,)h(a)f Fs(longjmp)g Ft(bac)o(k)h(to)f(a)h
+(main)g(pro)q(cessing)g(lo)q(op\),)g(it)g Fn(must)20
+b Ft(call)c Fs(rl_cleanup_)75 2550 y(after_signal\(\))d
+Ft(\(describ)q(ed)k(b)q(elo)o(w\),)e(to)g(restore)f(the)h(terminal)h
+(state.)137 2615 y(Readline)g(pro)o(vides)f(t)o(w)o(o)e(v)m(ariables)i
+(that)f(allo)o(w)g(application)i(writers)e(to)g(con)o(trol)g(whether)h
+(or)e(not)75 2670 y(it)k(will)h(catc)o(h)e(certain)h(signals)h(and)f
+(act)f(on)g(them)h(when)g(they)f(are)h(receiv)o(ed.)25
+b(It)16 b(is)i(imp)q(ortan)o(t)e(that)p eop
+%%Page: 40 44
+40 43 bop 75 -58 a Ft(40)1299 b(GNU)15 b(Readline)h(Library)75
+149 y(applications)k(c)o(hange)e(the)h(v)m(alues)g(of)f(these)h(v)m
+(ariables)g(only)g(when)g(calling)h Fs(readline\(\))p
+Ft(,)d(not)h(in)h(a)75 204 y(signal)d(handler,)g(so)f(Readline's)h(in)o
+(ternal)g(signal)g(state)e(is)i(not)f(corrupted.)1685
+298 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216 298
+18 3 v 25 w(catc)n(h)p 371 298 V 27 w(signals)195 353
+y Ft(If)15 b(this)g(v)m(ariable)g(is)g(non-zero,)g(Readline)h(will)g
+(install)f(signal)h(handlers)f(for)f Fs(SIGINT)p Ft(,)f
+Fs(SIGQUIT)p Ft(,)195 408 y Fs(SIGTERM)p Ft(,)h Fs(SIGALRM)p
+Ft(,)g Fs(SIGTSTP)p Ft(,)f Fs(SIGTTIN)p Ft(,)h(and)i
+Fs(SIGTTOU)p Ft(.)195 476 y(The)f(default)h(v)m(alue)h(of)d
+Fs(rl_catch_signals)f Ft(is)j(1.)1685 569 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 569 V 25 w(catc)n(h)p 371 569
+V 27 w(sigwinc)n(h)195 624 y Ft(If)15 b(this)h(v)m(ariable)h(is)e
+(non-zero,)g(Readline)i(will)g(install)f(a)f(signal)h(handler)h(for)d
+Fs(SIGWINCH)p Ft(.)195 692 y(The)h(default)h(v)m(alue)h(of)d
+Fs(rl_catch_sigwinch)f Ft(is)j(1.)137 786 y(If)g(an)f(application)j(do)
+q(es)d(not)g(wish)i(to)d(ha)o(v)o(e)h(Readline)i(catc)o(h)f(an)o(y)f
+(signals,)h(or)f(to)f(handle)j(signals)75 841 y(other)i(than)g(those)g
+(Readline)i(catc)o(hes)e(\()p Fs(SIGHUP)p Ft(,)g(for)g(example\),)h
+(Readline)h(pro)o(vides)e(con)o(v)o(enience)75 895 y(functions)d(to)f
+(do)g(the)g(necessary)g(terminal)h(and)g(in)o(ternal)g(state)e(clean)o
+(up)i(up)q(on)g(receipt)g(of)f(a)g(signal.)1675 989 y([F)l(unction])
+-1800 b Fg(void)20 b Ff(rl)p 242 989 V 25 w(clean)n(up)p
+455 989 V 27 w(after)p 600 989 V 25 w(signal)j Fe(\()p
+Fs(void)p Fe(\))195 1044 y Ft(This)18 b(function)f(will)i(reset)e(the)g
+(state)f(of)g(the)h(terminal)h(to)e(what)h(it)g(w)o(as)f(b)q(efore)h
+Fs(readline\(\))195 1099 y Ft(w)o(as)d(called,)i(and)f(remo)o(v)o(e)f
+(the)g(Readline)i(signal)g(handlers)g(for)e(all)h(signals,)g(dep)q
+(ending)i(on)e(the)195 1153 y(v)m(alues)h(of)f Fs(rl_catch_signals)e
+Ft(and)i Fs(rl_catch_sigwinch)p Ft(.)1675 1247 y([F)l(unction])-1800
+b Fg(void)20 b Ff(rl)p 242 1247 V 25 w(free)p 361 1247
+V 25 w(line)p 474 1247 V 27 w(state)j Fe(\()p Fs(void)p
+Fe(\))195 1302 y Ft(This)d(will)h(free)f(an)o(y)f(partial)h(state)f
+(asso)q(ciated)h(with)g(the)g(curren)o(t)f(input)i(line)g(\(undo)f
+(infor-)195 1357 y(mation,)i(an)o(y)f(partial)h(history)f(en)o(try)l(,)
+h(an)o(y)f(partially-en)o(tered)i(k)o(eyb)q(oard)e(macro,)h(and)f(an)o
+(y)195 1411 y(partially-en)o(tered)k(n)o(umeric)g(argumen)o(t\).)45
+b(This)24 b(should)h(b)q(e)g(called)g(b)q(efore)g Fs(rl_cleanup_)195
+1466 y(after_signal\(\))p Ft(.)36 b(The)22 b(Readline)h(signal)f
+(handler)g(for)f Fs(SIGINT)f Ft(calls)j(this)e(to)g(ab)q(ort)g(the)195
+1521 y(curren)o(t)15 b(input)h(line.)1675 1615 y([F)l(unction])-1800
+b Fg(void)20 b Ff(rl)p 242 1615 V 25 w(reset)p 388 1615
+V 26 w(after)p 532 1615 V 24 w(signal)k Fe(\()p Fs(void)p
+Fe(\))195 1670 y Ft(This)15 b(will)h(reinitialize)h(the)d(terminal)h
+(and)g(reinstall)h(an)o(y)d(Readline)j(signal)f(handlers,)g(dep)q(end-)
+195 1724 y(ing)h(on)f(the)g(v)m(alues)i(of)d Fs(rl_catch_signals)f
+Ft(and)j Fs(rl_catch_sigwinch)p Ft(.)137 1818 y(If)k(an)g(application)h
+(do)q(es)f(not)g(wish)g(Readline)h(to)e(catc)o(h)g Fs(SIGWINCH)p
+Ft(,)h(it)g(ma)o(y)f(call)h Fs(rl_resize_)75 1873 y(terminal\(\))12
+b Ft(or)h Fs(rl_set_screen_size\(\))e Ft(to)i(force)g(Readline)i(to)e
+(up)q(date)h(its)g(idea)g(of)g(the)f(terminal)75 1928
+y(size)j(when)g(a)f Fs(SIGWINCH)f Ft(is)h(receiv)o(ed.)1675
+2021 y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p 242
+2021 V 25 w(resize)p 406 2021 V 27 w(terminal)j Fe(\()p
+Fs(void)p Fe(\))195 2076 y Ft(Up)q(date)16 b(Readline's)g(in)o(ternal)g
+(screen)f(size)i(b)o(y)e(reading)g(v)m(alues)i(from)d(the)i(k)o(ernel.)
+1675 2170 y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p
+242 2170 V 25 w(set)p 338 2170 V 26 w(screen)p 520 2170
+V 25 w(size)k Fe(\()p Fs(int)14 b(rows,)h(int)g(cols)p
+Fe(\))195 2225 y Ft(Set)g(Readline's)h(idea)g(of)f(the)g(terminal)h
+(size)g(to)f Fi(ro)o(ws)h Ft(ro)o(ws)e(and)i Fi(cols)h
+Ft(columns.)137 2318 y(If)g(an)g(application)h(do)q(es)f(not)f(w)o(an)o
+(t)g(to)g(install)i(a)f Fs(SIGWINCH)e Ft(handler,)j(but)f(is)g(still)h
+(in)o(terested)f(in)75 2373 y(the)e(screen)h(dimensions,)g(Readline's)h
+(idea)e(of)g(the)h(screen)f(size)h(ma)o(y)f(b)q(e)h(queried.)1675
+2467 y([F)l(unction])-1800 b Fg(void)20 b Ff(rl)p 242
+2467 V 25 w(get)p 344 2467 V 26 w(screen)p 526 2467 V
+25 w(size)k Fe(\()p Fs(int)14 b(*rows,)h(int)f(*cols)p
+Fe(\))195 2522 y Ft(Return)h(Readline's)h(idea)f(of)g(the)g(terminal's)
+g(size)h(in)g(the)f(v)m(ariables)i(p)q(oin)o(ted)f(to)e(b)o(y)h(the)g
+(argu-)195 2576 y(men)o(ts.)137 2670 y(The)h(follo)o(wing)g(functions)g
+(install)g(and)g(remo)o(v)o(e)e(Readline's)i(signal)g(handlers.)p
+eop
+%%Page: 41 45
+41 44 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(41)1675 149 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 149 18 3 v 25 w(set)p 312 149 V 26 w(signals)j
+Fe(\()p Fs(void)p Fe(\))195 204 y Ft(Install)c(Readline's)f(signal)h
+(handler)f(for)f Fs(SIGINT)p Ft(,)g Fs(SIGQUIT)p Ft(,)g
+Fs(SIGTERM)p Ft(,)g Fs(SIGALRM)p Ft(,)f Fs(SIGTSTP)p
+Ft(,)195 259 y Fs(SIGTTIN)p Ft(,)11 b Fs(SIGTTOU)p Ft(,)g(and)h
+Fs(SIGWINCH)p Ft(,)e(dep)q(ending)k(on)e(the)f(v)m(alues)i(of)e
+Fs(rl_catch_signals)f Ft(and)195 314 y Fs(rl_catch_sigwinch)p
+Ft(.)1675 410 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p
+216 410 V 25 w(clear)p 359 410 V 27 w(signals)j Fe(\()p
+Fs(void)p Fe(\))195 465 y Ft(Remo)o(v)o(e)14 b(all)i(of)f(the)g
+(Readline)i(signal)f(handlers)g(installed)h(b)o(y)e Fs
+(rl_set_signals\(\))p Ft(.)75 598 y Fr(2.6)33 b(Custom)21
+b(Completers)137 722 y Ft(T)o(ypically)l(,)e(a)d(program)f(that)h
+(reads)h(commands)f(from)g(the)h(user)f(has)h(a)f(w)o(a)o(y)g(of)g
+(disam)o(biguating)75 777 y(commands)i(and)f(data.)27
+b(If)18 b(y)o(our)f(program)g(is)h(one)g(of)f(these,)i(then)f(it)g(can)
+f(pro)o(vide)i(completion)g(for)75 832 y(commands,)14
+b(data,)g(or)g(b)q(oth.)20 b(The)15 b(follo)o(wing)g(sections)g
+(describ)q(e)h(ho)o(w)e(y)o(our)g(program)g(and)h(Readline)75
+886 y(co)q(op)q(erate)g(to)g(pro)o(vide)g(this)h(service.)75
+1002 y Fh(2.6.1)30 b(Ho)n(w)21 b(Completing)f(W)-5 b(orks)137
+1126 y Ft(In)18 b(order)f(to)f(complete)i(some)f(text,)g(the)g(full)i
+(list)e(of)g(p)q(ossible)i(completions)f(m)o(ust)f(b)q(e)h(a)o(v)m
+(ailable.)75 1181 y(That)e(is,)i(it)f(is)h(not)f(p)q(ossible)h(to)f
+(accurately)g(expand)h(a)e(partial)i(w)o(ord)e(without)h(kno)o(wing)g
+(all)h(of)f(the)75 1236 y(p)q(ossible)i(w)o(ords)e(whic)o(h)h(mak)o(e)f
+(sense)h(in)h(that)d(con)o(text.)26 b(The)18 b(Readline)h(library)f
+(pro)o(vides)g(the)g(user)75 1291 y(in)o(terface)f(to)f(completion,)i
+(and)e(t)o(w)o(o)g(of)g(the)h(most)f(common)g(completion)i(functions:)
+23 b(\014lename)18 b(and)75 1345 y(username.)h(F)l(or)10
+b(completing)i(other)e(t)o(yp)q(es)h(of)f(text,)h(y)o(ou)g(m)o(ust)f
+(write)h(y)o(our)f(o)o(wn)h(completion)g(function.)75
+1400 y(This)16 b(section)g(describ)q(es)g(exactly)g(what)f(suc)o(h)g
+(functions)h(m)o(ust)f(do,)f(and)i(pro)o(vides)f(an)h(example.)137
+1469 y(There)g(are)f(three)g(ma)s(jor)f(functions)i(used)f(to)g(p)q
+(erform)g(completion:)100 1538 y(1.)29 b(The)22 b(user-in)o(terface)g
+(function)h Fs(rl_complete\(\))p Ft(.)37 b(This)22 b(function)h(is)f
+(called)h(with)f(the)g(same)165 1593 y(argumen)o(ts)17
+b(as)g(other)h(bindable)i(Readline)f(functions:)26 b
+Fi(coun)o(t)18 b Ft(and)g Fi(in)o(v)o(oking)p 1553 1593
+14 2 v 21 w(k)o(ey)p Ft(.)28 b(It)18 b(isolates)165 1648
+y(the)h(w)o(ord)f(to)g(b)q(e)i(completed)f(and)g(calls)h
+Fs(rl_completion_matches\(\))c Ft(to)i(generate)g(a)h(list)g(of)165
+1703 y(p)q(ossible)e(completions.)22 b(It)16 b(then)g(either)g(lists)g
+(the)g(p)q(ossible)h(completions,)g(inserts)f(the)f(p)q(ossible)165
+1758 y(completions,)25 b(or)d(actually)i(p)q(erforms)e(the)g
+(completion,)k(dep)q(ending)e(on)f(whic)o(h)g(b)q(eha)o(vior)g(is)165
+1812 y(desired.)100 1881 y(2.)29 b(The)17 b(in)o(ternal)h(function)f
+Fs(rl_completion_matches\(\))d Ft(uses)j(an)g(application-supplie)q(d)j
+Fi(gener-)165 1935 y(ator)h Ft(function)e(to)f(generate)g(the)h(list)g
+(of)f(p)q(ossible)i(matc)o(hes,)f(and)f(then)h(returns)g(the)f(arra)o
+(y)f(of)165 1990 y(these)j(matc)o(hes.)32 b(The)20 b(caller)g(should)h
+(place)f(the)g(address)f(of)h(its)f(generator)g(function)h(in)g
+Fs(rl_)165 2045 y(completion_entry_function)p Ft(.)100
+2113 y(3.)29 b(The)12 b(generator)e(function)i(is)g(called)h(rep)q
+(eatedly)g(from)e Fs(rl_completion_matches\(\))p Ft(,)d(returning)165
+2168 y(a)16 b(string)g(eac)o(h)h(time.)24 b(The)17 b(argumen)o(ts)e(to)
+h(the)g(generator)g(function)h(are)f Fi(text)h Ft(and)g
+Fi(state)p Ft(.)22 b Fi(text)165 2223 y Ft(is)17 b(the)f(partial)g(w)o
+(ord)f(to)h(b)q(e)h(completed.)23 b Fi(state)18 b Ft(is)e(zero)g(the)g
+(\014rst)g(time)g(the)g(function)h(is)g(called,)165 2278
+y(allo)o(wing)23 b(the)f(generator)f(to)g(p)q(erform)h(an)o(y)g
+(necessary)g(initialization,)k(and)c(a)g(p)q(ositiv)o(e)h(non-)165
+2332 y(zero)14 b(in)o(teger)h(for)f(eac)o(h)h(subsequen)o(t)g(call.)21
+b(The)15 b(generator)e(function)j(returns)e Fs(\(char)h(*\)NULL)f
+Ft(to)165 2387 y(inform)19 b Fs(rl_completion_matches\(\))d
+Ft(that)i(there)h(are)g(no)g(more)g(p)q(ossibilities)j(left.)32
+b(Usually)165 2442 y(the)19 b(generator)g(function)h(computes)g(the)f
+(list)h(of)f(p)q(ossible)i(completions)g(when)e Fi(state)j
+Ft(is)d(zero,)165 2497 y(and)13 b(returns)g(them)f(one)h(at)f(a)h(time)
+g(on)g(subsequen)o(t)g(calls.)20 b(Eac)o(h)13 b(string)f(the)h
+(generator)f(function)165 2552 y(returns)k(as)f(a)h(matc)o(h)f(m)o(ust)
+h(b)q(e)g(allo)q(cated)h(with)g Fs(malloc\(\))p Ft(;)d(Readline)k
+(frees)e(the)g(strings)f(when)165 2606 y(it)i(has)g(\014nished)i(with)e
+(them.)25 b(Suc)o(h)18 b(a)e(generator)g(function)i(is)f(referred)g(to)
+g(as)f(an)h Fi(application-)165 2661 y(sp)q(eci\014c)g(completion)f
+(function)p Ft(.)p eop
+%%Page: 42 46
+42 45 bop 75 -58 a Ft(42)1299 b(GNU)15 b(Readline)h(Library)1675
+149 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p 216 149
+18 3 v 25 w(complete)j Fe(\()p Fs(int)15 b(ignore,)f(int)h
+(invoking_key)p Fe(\))195 204 y Ft(Complete)h(the)f(w)o(ord)g(at)f(or)h
+(b)q(efore)h(p)q(oin)o(t.)21 b(Y)l(ou)15 b(ha)o(v)o(e)g(supplied)j(the)
+d(function)i(that)d(do)q(es)i(the)195 259 y(initial)23
+b(simple)f(matc)o(hing)e(selection)i(algorithm)f(\(see)f
+Fs(rl_completion_matches\(\))p Ft(\).)33 b(The)195 314
+y(default)16 b(is)f(to)g(do)g(\014lename)h(completion.)1685
+406 y([V)l(ariable])-1799 b Fg(rl_compentry_func_t)22
+b(*)d Ff(rl)p 679 406 V 26 w(completion)p 979 406 V 26
+w(en)n(try)p 1137 406 V 25 w(function)195 460 y Ft(This)i(is)f(a)g(p)q
+(oin)o(ter)g(to)f(the)h(generator)g(function)g(for)g
+Fs(rl_completion_matches\(\))p Ft(.)31 b(If)20 b(the)195
+515 y(v)m(alue)13 b(of)f Fs(rl_completion_entry_fun)o(ction)d
+Ft(is)j Fs(NULL)f Ft(then)h(the)g(default)h(\014lename)g(generator)195
+570 y(function,)25 b Fs(rl_filename_completion_f)o(unction\()o(\))p
+Ft(,)c(is)i(used.)42 b(An)23 b Fi(application-sp)q(eci)q(\014c)195
+625 y(completion)12 b(function)f Ft(is)g(a)f(function)i(whose)e
+(address)h(is)g(assigned)g(to)f Fs(rl_completion_entry_)195
+680 y(function)k Ft(and)h(whose)h(return)f(v)m(alues)h(are)f(used)h(to)
+e(generate)h(p)q(ossible)i(completions.)75 791 y Fh(2.6.2)30
+b(Completion)20 b(F)-5 b(unctions)137 913 y Ft(Here)16
+b(is)f(the)h(complete)g(list)g(of)e(callable)k(completion)e(functions)g
+(presen)o(t)f(in)h(Readline.)1675 1005 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 1005 V 25 w(complete)p 465
+1005 V 26 w(in)n(ternal)k Fe(\()p Fs(int)15 b(what_to_do)p
+Fe(\))195 1060 y Ft(Complete)k(the)f(w)o(ord)g(at)f(or)h(b)q(efore)h(p)
+q(oin)o(t.)29 b Fi(what)p 1104 1060 14 2 v 20 w(to)p
+1165 1060 V 19 w(do)21 b Ft(sa)o(ys)c(what)h(to)g(do)g(with)h(the)f
+(com-)195 1115 y(pletion.)k(A)16 b(v)m(alue)h(of)e(`)p
+Fs(?)p Ft(')g(means)g(list)i(the)e(p)q(ossible)j(completions.)k(`)p
+Fs(TAB)p Ft(')14 b(means)i(do)f(standard)195 1170 y(completion.)22
+b(`)p Fs(*)p Ft(')15 b(means)g(insert)h(all)h(of)e(the)h(p)q(ossible)h
+(completions.)22 b(`)p Fs(!)p Ft(')15 b(means)g(to)g(displa)o(y)i(all)
+195 1224 y(of)g(the)g(p)q(ossible)i(completions,)f(if)g(there)f(is)h
+(more)f(than)g(one,)g(as)g(w)o(ell)h(as)f(p)q(erforming)h(partial)195
+1279 y(completion.)i(`)p Fs(@)p Ft(')13 b(is)h(similar)h(to)e(`)p
+Fs(!)p Ft(',)g(but)h(p)q(ossible)h(completions)g(are)e(not)g(listed)i
+(if)f(the)g(p)q(ossible)195 1334 y(completions)i(share)f(a)g(common)g
+(pre\014x.)1675 1426 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 1426 18 3 v 25 w(complete)j Fe(\()p Fs(int)15
+b(ignore,)f(int)h(invoking_key)p Fe(\))195 1481 y Ft(Complete)21
+b(the)g(w)o(ord)e(at)h(or)g(b)q(efore)h(p)q(oin)o(t.)37
+b(Y)l(ou)21 b(ha)o(v)o(e)f(supplied)j(the)d(function)i(that)e(do)q(es)
+195 1535 y(the)d(initial)h(simple)g(matc)o(hing)f(selection)h
+(algorithm)e(\(see)g Fs(rl_completion_matches\(\))e Ft(and)195
+1590 y Fs(rl_completion_entry_functi)o(on)p Ft(\).)25
+b(The)18 b(default)h(is)f(to)f(do)h(\014lename)h(completion.)29
+b(This)195 1645 y(calls)16 b Fs(rl_complete_internal\(\))c
+Ft(with)k(an)f(argumen)o(t)f(dep)q(ending)k(on)d Fi(in)o(v)o(oking)p
+1657 1645 14 2 v 21 w(k)o(ey)p Ft(.)1675 1737 y([F)l(unction])-1800
+b Fg(int)20 b Ff(rl)p 216 1737 18 3 v 25 w(p)r(ossible)p
+438 1737 V 26 w(completions)i Fe(\()p Fs(int)15 b(count,)f(int)h
+(invoking_key)p Fe(\))195 1792 y Ft(List)21 b(the)f(p)q(ossible)i
+(completions.)36 b(See)21 b(description)h(of)e Fs(rl_complete)13
+b(\(\))p Ft(.)35 b(This)21 b(calls)g Fs(rl_)195 1846
+y(complete_internal\(\))13 b Ft(with)i(an)g(argumen)o(t)g(of)f(`)p
+Fs(?)p Ft('.)1675 1938 y([F)l(unction])-1800 b Fg(int)20
+b Ff(rl)p 216 1938 V 25 w(insert)p 383 1938 V 26 w(completions)j
+Fe(\()p Fs(int)14 b(count,)g(int)h(invoking_key)p Fe(\))195
+1993 y Ft(Insert)i(the)g(list)h(of)e(p)q(ossible)j(completions)e(in)o
+(to)g(the)g(line,)i(deleting)f(the)f(partially-completed)195
+2048 y(w)o(ord.)k(See)c(description)g(of)e Fs(rl_complete\(\))p
+Ft(.)20 b(This)d(calls)g Fs(rl_complete_internal\(\))c
+Ft(with)195 2103 y(an)i(argumen)o(t)g(of)f(`)p Fs(*)p
+Ft('.)1675 2195 y([F)l(unction])-1800 b Fg(int)20 b Ff(rl)p
+216 2195 V 25 w(completion)p 515 2195 V 26 w(mo)r(de)h
+Fe(\()p Fs(rl_command_func_t)12 b(*cfunc)p Fe(\))195
+2249 y Ft(Returns)25 b(the)g(apppriate)h(v)m(alue)g(to)f(pass)g(to)f
+Fs(rl_complete_internal\(\))f Ft(dep)q(ending)k(on)195
+2304 y(whether)21 b Fi(cfunc)i Ft(w)o(as)d(called)i(t)o(wice)f(in)g
+(succession)h(and)e(the)h(v)m(alues)g(of)f(the)h Fs(show-all-if-)195
+2359 y(ambiguous)13 b Ft(and)g Fs(show-all-if-unmodified)e
+Ft(v)m(ariables.)21 b(Application-sp)q(eci)q(\014c)c(completion)195
+2414 y(functions)f(ma)o(y)e(use)i(this)g(function)g(to)e(presen)o(t)h
+(the)h(same)f(in)o(terface)g(as)g Fs(rl_complete\(\))p
+Ft(.)1675 2506 y([F)l(unction])-1800 b Fg(char)20 b(**)f
+Ff(rl)p 313 2506 V 26 w(completion)p 613 2506 V 26 w(matc)n(hes)j
+Fe(\()p Fs(const)14 b(char)g(*text,)283 2560 y(rl_compentry_func_t)e
+(*entry_func)p Fe(\))195 2615 y Ft(Returns)18 b(an)h(arra)o(y)f(of)g
+(strings)h(whic)o(h)h(is)g(a)e(list)i(of)e(completions)i(for)f
+Fi(text)p Ft(.)30 b(If)19 b(there)g(are)g(no)195 2670
+y(completions,)f(returns)g Fs(NULL)p Ft(.)25 b(The)17
+b(\014rst)g(en)o(try)g(in)h(the)f(returned)h(arra)o(y)e(is)i(the)f
+(substitution)p eop
+%%Page: 43 47
+43 46 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(43)195 149 y(for)13 b Fi(text)p Ft(.)18
+b(The)c(remaining)g(en)o(tries)f(are)g(the)h(p)q(ossible)g
+(completions.)21 b(The)13 b(arra)o(y)f(is)i(terminated)195
+204 y(with)i(a)e Fs(NULL)h Ft(p)q(oin)o(ter.)195 272
+y Fi(en)o(try)p 302 272 14 2 v 20 w(func)23 b Ft(is)d(a)f(function)i
+(of)e(t)o(w)o(o)g(args,)g(and)h(returns)g(a)f Fs(char)c(*)p
+Ft(.)33 b(The)20 b(\014rst)f(argumen)o(t)g(is)195 327
+y Fi(text)p Ft(.)32 b(The)19 b(second)h(is)g(a)f(state)f(argumen)o(t;)j
+(it)e(is)h(zero)f(on)g(the)h(\014rst)f(call,)i(and)e(non-zero)h(on)195
+381 y(subsequen)o(t)e(calls.)26 b Fi(en)o(try)p 661 381
+V 19 w(func)21 b Ft(returns)16 b(a)h Fs(NULL)f Ft(p)q(oin)o(ter)i(to)e
+(the)h(caller)h(when)f(there)g(are)g(no)195 436 y(more)e(matc)o(hes.)
+1675 529 y([F)l(unction])-1800 b Fg(char)20 b(*)f Ff(rl)p
+287 529 18 3 v 26 w(\014lename)p 521 529 V 25 w(completion)p
+820 529 V 25 w(function)k Fe(\()p Fs(const)14 b(char)h(*text,)f(int)283
+584 y(state)p Fe(\))195 639 y Ft(A)f(generator)f(function)h(for)g
+(\014lename)h(completion)f(in)h(the)f(general)g(case.)19
+b Fi(text)14 b Ft(is)f(a)g(partial)g(\014le-)195 693
+y(name.)18 b(The)11 b(Bash)g(source)g(is)g(a)g(useful)h(reference)f
+(for)f(writing)h(application-sp)q(eci)q(\014c)j(completion)195
+748 y(functions)i(\(the)f(Bash)g(completion)h(functions)g(call)h(this)e
+(and)h(other)f(Readline)h(functions\).)1675 841 y([F)l(unction])-1800
+b Fg(char)20 b(*)f Ff(rl)p 287 841 V 26 w(username)p
+553 841 V 23 w(completion)p 850 841 V 25 w(function)k
+Fe(\()p Fs(const)15 b(char)f(*text,)h(int)283 896 y(state)p
+Fe(\))195 951 y Ft(A)f(completion)i(generator)d(for)h(usernames.)19
+b Fi(text)c Ft(con)o(tains)f(a)g(partial)h(username)f(preceded)i(b)o(y)
+195 1006 y(a)f(random)g(c)o(haracter)f(\(usually)j(`)p
+Fs(~)p Ft('\).)i(As)c(with)g(all)i(completion)f(generators,)e
+Fi(state)j Ft(is)f(zero)f(on)195 1060 y(the)g(\014rst)g(call)h(and)g
+(non-zero)f(for)g(subsequen)o(t)h(calls.)75 1173 y Fh(2.6.3)30
+b(Completion)20 b(V)-5 b(ariables)1685 1295 y Ft([V)l(ariable])-1799
+b Fg(rl_compentry_func_t)22 b(*)d Ff(rl)p 679 1295 V
+26 w(completion)p 979 1295 V 26 w(en)n(try)p 1137 1295
+V 25 w(function)195 1350 y Ft(A)e(p)q(oin)o(ter)g(to)f(the)h(generator)
+f(function)h(for)f Fs(rl_completion_matches\(\))p Ft(.)22
+b Fs(NULL)16 b Ft(means)h(to)195 1405 y(use)f Fs
+(rl_filename_completion_)o(functio)o(n\(\))p Ft(,)c(the)j(default)h
+(\014lename)g(completer.)1685 1498 y([V)l(ariable])-1799
+b Fg(rl_completion_func_t)22 b(*)d Ff(rl)p 705 1498 V
+26 w(attempted)p 990 1498 V 25 w(completion)p 1289 1498
+V 26 w(function)195 1553 y Ft(A)e(p)q(oin)o(ter)h(to)f(an)g(alternativ)
+o(e)h(function)g(to)f(create)g(matc)o(hes.)26 b(The)18
+b(function)g(is)g(called)h(with)195 1608 y Fi(text)p
+Ft(,)11 b Fi(start)p Ft(,)g(and)h Fi(end)p Ft(.)19 b
+Fi(start)11 b Ft(and)h Fi(end)i Ft(are)d(indices)i(in)g
+Fs(rl_line_buffer)c Ft(de\014ning)k(the)f(b)q(ound-)195
+1662 y(aries)h(of)g Fi(text)p Ft(,)f(whic)o(h)i(is)g(a)e(c)o(haracter)h
+(string.)19 b(If)13 b(this)g(function)h(exists)g(and)f(returns)g
+Fs(NULL)p Ft(,)f(or)g(if)195 1717 y(this)f(v)m(ariable)i(is)e(set)g(to)
+f Fs(NULL)p Ft(,)h(then)g Fs(rl_complete\(\))e Ft(will)k(call)f(the)f
+(v)m(alue)h(of)f Fs(rl_completion_)195 1772 y(entry_function)h
+Ft(to)i(generate)g(matc)o(hes,)f(otherwise)i(the)f(arra)o(y)f(of)h
+(strings)g(returned)g(will)i(b)q(e)195 1827 y(used.)j(If)12
+b(this)f(function)h(sets)f(the)g Fs(rl_attempted_completion_over)d
+Ft(v)m(ariable)k(to)f(a)g(non-zero)195 1882 y(v)m(alue,)18
+b(Readline)h(will)f(not)f(p)q(erform)f(its)i(default)f(completion)h(ev)
+o(en)f(if)h(this)f(function)h(returns)195 1936 y(no)d(matc)o(hes.)1685
+2029 y([V)l(ariable])-1799 b Fg(rl_quote_func_t)21 b(*)f
+Ff(rl)p 575 2029 V 25 w(\014lename)p 808 2029 V 25 w(quoting)p
+1022 2029 V 26 w(function)195 2084 y Ft(A)c(p)q(oin)o(ter)h(to)f(a)g
+(function)h(that)e(will)j(quote)e(a)g(\014lename)i(in)f(an)f
+(application-sp)q(eci\014)q(c)j(fashion.)195 2139 y(This)h(is)g(called)
+i(if)e(\014lename)g(completion)h(is)f(b)q(eing)h(attempted)e(and)h(one)
+g(of)f(the)h(c)o(haracters)195 2194 y(in)d Fs
+(rl_filename_quote_characters)c Ft(app)q(ears)k(in)g(a)g(completed)g
+(\014lename.)25 b(The)17 b(function)195 2248 y(is)i(called)h(with)f
+Fi(text)p Ft(,)f Fi(matc)o(h)p 720 2248 14 2 v 20 w(t)o(yp)q(e)p
+Ft(,)g(and)h Fi(quote)p 1060 2248 V 20 w(p)q(oin)o(ter)p
+Ft(.)30 b(The)19 b Fi(text)g Ft(is)f(the)h(\014lename)h(to)d(b)q(e)195
+2303 y(quoted.)38 b(The)21 b Fi(matc)o(h)p 606 2303 V
+20 w(t)o(yp)q(e)i Ft(is)f(either)g Fs(SINGLE_MATCH)p
+Ft(,)e(if)i(there)f(is)h(only)g(one)f(completion)195
+2358 y(matc)o(h,)15 b(or)g Fs(MULT_MATCH)p Ft(.)20 b(Some)c(functions)g
+(use)g(this)g(to)f(decide)j(whether)e(or)f(not)g(to)g(insert)h(a)195
+2413 y(closing)11 b(quote)g(c)o(haracter.)17 b(The)11
+b Fi(quote)p 876 2413 V 20 w(p)q(oin)o(ter)j Ft(is)d(a)f(p)q(oin)o(ter)
+h(to)f(an)o(y)g(op)q(ening)h(quote)g(c)o(haracter)195
+2468 y(the)k(user)h(t)o(yp)q(ed.)k(Some)15 b(functions)h(c)o(ho)q(ose)f
+(to)g(reset)g(this)g(c)o(haracter.)1685 2560 y([V)l(ariable])-1799
+b Fg(rl_dequote_func_t)22 b(*)d Ff(rl)p 627 2560 18 3
+v 26 w(\014lename)p 861 2560 V 24 w(dequoting)p 1132
+2560 V 26 w(function)195 2615 y Ft(A)c(p)q(oin)o(ter)g(to)f(a)h
+(function)g(that)g(will)h(remo)o(v)o(e)e(application-sp)q(eci\014)q(c)k
+(quoting)d(c)o(haracters)f(from)195 2670 y(a)i(\014lename)h(b)q(efore)g
+(completion)g(is)g(attempted,)f(so)f(those)h(c)o(haracters)g(do)g(not)g
+(in)o(terfere)h(with)p eop
+%%Page: 44 48
+44 47 bop 75 -58 a Ft(44)1299 b(GNU)15 b(Readline)h(Library)195
+149 y(matc)o(hing)j(the)g(text)g(against)f(names)h(in)h(the)f
+(\014lesystem.)33 b(It)19 b(is)g(called)i(with)e Fi(text)p
+Ft(,)g(the)g(text)195 204 y(of)i(the)g(w)o(ord)f(to)h(b)q(e)g
+(dequoted,)i(and)e Fi(quote)p 1007 204 14 2 v 20 w(c)o(har)p
+Ft(,)h(whic)o(h)g(is)g(the)f(quoting)g(c)o(haracter)g(that)195
+259 y(delimits)d(the)e(\014lename)h(\(usually)g(`)p Fs(')p
+Ft(')e(or)h(`)p Fs(")p Ft('\).)21 b(If)c Fi(quote)p 1185
+259 V 19 w(c)o(har)i Ft(is)e(zero,)f(the)g(\014lename)h(w)o(as)e(not)
+195 314 y(in)h(an)f(em)o(b)q(edded)i(string.)1685 423
+y([V)l(ariable])-1799 b Fg(rl_linebuf_func_t)22 b(*)d
+Ff(rl)p 627 423 18 3 v 26 w(c)n(har)p 760 423 V 25 w(is)p
+823 423 V 26 w(quoted)p 1020 423 V 25 w(p)195 478 y Ft(A)f(p)q(oin)o
+(ter)h(to)f(a)g(function)h(to)f(call)i(that)d(determines)j(whether)e
+(or)g(not)g(a)g(sp)q(eci\014c)j(c)o(haracter)195 533
+y(in)d(the)f(line)i(bu\013er)e(is)h(quoted,)g(according)f(to)g(whatev)o
+(er)f(quoting)i(mec)o(hanism)g(the)f(program)195 588
+y(calling)d(Readline)g(uses.)19 b(The)13 b(function)g(is)g(called)h
+(with)f(t)o(w)o(o)e(argumen)o(ts:)17 b Fi(text)p Ft(,)12
+b(the)h(text)f(of)g(the)195 643 y(line,)17 b(and)e Fi(index)p
+Ft(,)i(the)e(index)i(of)e(the)g(c)o(haracter)g(in)h(the)g(line.)22
+b(It)15 b(is)h(used)g(to)f(decide)i(whether)e(a)195 697
+y(c)o(haracter)f(found)i(in)g Fs(rl_completer_word_break_)o(charact)o
+(ers)c Ft(should)k(b)q(e)g(used)g(to)e(break)195 752
+y(w)o(ords)g(for)h(the)g(completer.)1685 862 y([V)l(ariable])-1799
+b Fg(rl_compignore_func_t)22 b(*)d Ff(rl)p 705 862 V
+26 w(ignore)p 886 862 V 25 w(some)p 1038 862 V 24 w(completions)p
+1359 862 V 25 w(function)195 917 y Ft(This)g(function,)i(if)e
+(de\014ned,)i(is)e(called)h(b)o(y)f(the)g(completer)g(when)h(real)f
+(\014lename)h(completion)195 971 y(is)e(done,)f(after)f(all)i(the)f
+(matc)o(hing)g(names)g(ha)o(v)o(e)g(b)q(een)h(generated.)25
+b(It)17 b(is)h(passed)f(a)g Fs(NULL)f Ft(ter-)195 1026
+y(minated)g(arra)o(y)e(of)h(matc)o(hes.)20 b(The)c(\014rst)f(elemen)o
+(t)h(\()p Fs(matches[0])p Ft(\))d(is)j(the)g(maximal)g(substring)195
+1081 y(common)e(to)g(all)h(matc)o(hes.)k(This)c(function)g(can)g
+(re-arrange)f(the)g(list)h(of)f(matc)o(hes)g(as)g(required,)195
+1136 y(but)h(eac)o(h)h(elemen)o(t)g(deleted)g(from)f(the)g(arra)o(y)f
+(m)o(ust)g(b)q(e)i(freed.)1685 1245 y([V)l(ariable])-1799
+b Fg(rl_icppfunc_t)21 b(*)e Ff(rl)p 522 1245 V 26 w(directory)p
+775 1245 V 26 w(completion)p 1075 1245 V 26 w(ho)r(ok)195
+1300 y Ft(This)k(function,)i(if)e(de\014ned,)j(is)d(allo)o(w)o(ed)g(to)
+f(mo)q(dify)h(the)g(directory)g(p)q(ortion)g(of)f(\014lenames)195
+1355 y(Readline)e(completes.)29 b(It)19 b(is)f(called)i(with)f(the)f
+(address)h(of)e(a)h(string)h(\(the)f(curren)o(t)g(directory)195
+1410 y(name\))g(as)g(an)h(argumen)o(t,)f(and)h(ma)o(y)f(mo)q(dify)h
+(that)f(string.)30 b(If)19 b(the)f(string)h(is)g(replaced)h(with)195
+1465 y(a)g(new)g(string,)h(the)f(old)g(v)m(alue)h(should)g(b)q(e)g
+(freed.)34 b(An)o(y)20 b(mo)q(di\014ed)i(directory)e(name)g(should)195
+1519 y(ha)o(v)o(e)14 b(a)g(trailing)i(slash.)k(The)15
+b(mo)q(di\014ed)h(v)m(alue)g(will)g(b)q(e)f(displa)o(y)o(ed)h(as)e
+(part)g(of)h(the)f(completion,)195 1574 y(replacing)h(the)g(directory)f
+(p)q(ortion)g(of)g(the)g(pathname)g(the)h(user)f(t)o(yp)q(ed.)20
+b(It)14 b(returns)g(an)g(in)o(teger)195 1629 y(that)i(should)h(b)q(e)g
+(non-zero)g(if)g(the)g(function)g(mo)q(di\014es)h(its)e(directory)h
+(argumen)o(t.)23 b(It)17 b(could)g(b)q(e)195 1684 y(used)f(to)e(expand)
+i(sym)o(b)q(olic)h(links)f(or)f(shell)i(v)m(ariables)f(in)g(pathnames.)
+1685 1793 y([V)l(ariable])-1799 b Fg(rl_compdisp_func_t)22
+b(*)d Ff(rl)p 653 1793 V 26 w(completion)p 953 1793 V
+25 w(displa)n(y)p 1151 1793 V 27 w(matc)n(hes)p 1381
+1793 V 25 w(ho)r(ok)195 1848 y Ft(If)11 b(non-zero,)h(then)f(this)h(is)
+f(the)g(address)g(of)g(a)g(function)g(to)g(call)h(when)f(completing)i
+(a)d(w)o(ord)h(w)o(ould)195 1903 y(normally)h(displa)o(y)g(the)f(list)h
+(of)f(p)q(ossible)h(matc)o(hes.)18 b(This)12 b(function)g(is)g(called)g
+(in)g(lieu)h(of)e(Readline)195 1958 y(displa)o(ying)20
+b(the)f(list.)30 b(It)19 b(tak)o(es)f(three)g(argumen)o(ts:)26
+b(\()p Fs(char)14 b(**)p Fi(matc)o(hes)p Ft(,)19 b Fs(int)f
+Fi(n)o(um)p 1685 1958 14 2 v 20 w(matc)o(hes)p Ft(,)195
+2012 y Fs(int)13 b Fi(max)p 368 2012 V 19 w(length)p
+Ft(\))h(where)f Fi(matc)o(hes)i Ft(is)f(the)f(arra)o(y)f(of)h(matc)o
+(hing)g(strings,)g Fi(n)o(um)p 1575 2012 V 20 w(matc)o(hes)i
+Ft(is)f(the)195 2067 y(n)o(um)o(b)q(er)h(of)f(strings)g(in)i(that)e
+(arra)o(y)l(,)f(and)i Fi(max)p 1011 2067 V 19 w(length)g
+Ft(is)g(the)g(length)g(of)f(the)h(longest)g(string)f(in)195
+2122 y(that)f(arra)o(y)l(.)19 b(Readline)c(pro)o(vides)g(a)e(con)o(v)o
+(enience)j(function,)f Fs(rl_display_match_list)p Ft(,)c(that)195
+2177 y(tak)o(es)17 b(care)g(of)g(doing)h(the)f(displa)o(y)i(to)d
+(Readline's)j(output)e(stream.)26 b(That)16 b(function)j(ma)o(y)d(b)q
+(e)195 2232 y(called)h(from)d(this)i(ho)q(ok.)1685 2341
+y([V)l(ariable])-1799 b Fg(const)20 b(char)g(*)f Ff(rl)p
+437 2341 18 3 v 26 w(basic)p 586 2341 V 25 w(w)n(ord)p
+735 2341 V 25 w(break)p 900 2341 V 25 w(c)n(haracters)195
+2396 y Ft(The)j(basic)h(list)g(of)f(c)o(haracters)f(that)g(signal)i(a)f
+(break)g(b)q(et)o(w)o(een)g(w)o(ords)g(for)f(the)h(completer)195
+2451 y(routine.)30 b(The)19 b(default)g(v)m(alue)h(of)e(this)h(v)m
+(ariable)h(is)f(the)g(c)o(haracters)f(whic)o(h)h(break)g(w)o(ords)f
+(for)195 2506 y(completion)e(in)g(Bash:)k Fs(")15 b
+(\\t\\n\\"\\\\'`@$><=;|&{\(")p Ft(.)1685 2615 y([V)l(ariable])-1799
+b Fg(const)20 b(char)g(*)f Ff(rl)p 437 2615 V 26 w(basic)p
+586 2615 V 25 w(quote)p 750 2615 V 26 w(c)n(haracters)195
+2670 y Ft(A)c(list)h(of)f(quote)g(c)o(haracters)f(whic)o(h)i(can)g
+(cause)f(a)g(w)o(ord)g(break.)p eop
+%%Page: 45 49
+45 48 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(45)1685 149 y([V)l(ariable])-1799 b Fg(const)20
+b(char)g(*)f Ff(rl)p 437 149 18 3 v 26 w(completer)p
+711 149 V 25 w(w)n(ord)p 860 149 V 25 w(break)p 1025
+149 V 25 w(c)n(haracters)195 204 y Ft(The)33 b(list)g(of)f(c)o
+(haracters)g(that)f(signal)j(a)e(break)g(b)q(et)o(w)o(een)h(w)o(ords)f
+(for)g Fs(rl_complete_)195 259 y(internal\(\))p Ft(.)18
+b(The)e(default)g(list)g(is)f(the)h(v)m(alue)g(of)f Fs
+(rl_basic_word_break_chara)o(cters)p Ft(.)1685 355 y([V)l(ariable])
+-1799 b Fg(const)20 b(char)g(*)f Ff(rl)p 437 355 V 26
+w(completer)p 711 355 V 25 w(quote)p 875 355 V 25 w(c)n(haracters)195
+410 y Ft(A)e(list)h(of)e(c)o(haracters)g(whic)o(h)i(can)f(b)q(e)g(used)
+h(to)e(quote)h(a)f(substring)h(of)g(the)g(line.)26 b(Completion)195
+465 y(o)q(ccurs)13 b(on)h(the)f(en)o(tire)g(substring,)h(and)f(within)i
+(the)e(substring)g Fs(rl_completer_word_break_)195 519
+y(characters)j Ft(are)h(treated)g(as)h(an)o(y)f(other)g(c)o(haracter,)g
+(unless)i(they)e(also)h(app)q(ear)g(within)h(this)195
+574 y(list.)1685 670 y([V)l(ariable])-1799 b Fg(const)20
+b(char)g(*)f Ff(rl)p 437 670 V 26 w(\014lename)p 671
+670 V 24 w(quote)p 834 670 V 26 w(c)n(haracters)195 725
+y Ft(A)e(list)h(of)e(c)o(haracters)g(that)g(cause)h(a)g(\014lename)h
+(to)e(b)q(e)i(quoted)e(b)o(y)h(the)g(completer)h(when)f(they)195
+780 y(app)q(ear)e(in)h(a)f(completed)h(\014lename.)21
+b(The)16 b(default)g(is)f(the)h(n)o(ull)g(string.)1685
+875 y([V)l(ariable])-1799 b Fg(const)20 b(char)g(*)f
+Ff(rl)p 437 875 V 26 w(sp)r(ecial)p 629 875 V 26 w(pre\014xes)195
+930 y Ft(The)14 b(list)h(of)e(c)o(haracters)g(that)g(are)h(w)o(ord)f
+(break)h(c)o(haracters,)f(but)h(should)h(b)q(e)f(left)g(in)h
+Fi(text)f Ft(when)195 985 y(it)f(is)f(passed)h(to)f(the)g(completion)h
+(function.)20 b(Programs)11 b(can)h(use)h(this)g(to)f(help)h(determine)
+h(what)195 1040 y(kind)i(of)e(completing)i(to)e(do.)19
+b(F)l(or)14 b(instance,)i(Bash)e(sets)h(this)g(v)m(ariable)h(to)e
+Fs(")p Ft($)p Fs(@")g Ft(so)g(that)g(it)h(can)195 1095
+y(complete)h(shell)h(v)m(ariables)f(and)g(hostnames.)1685
+1191 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216
+1191 V 25 w(completion)p 515 1191 V 26 w(query)p 683
+1191 V 25 w(items)195 1245 y Ft(Up)e(to)g(this)g(man)o(y)g(items)g
+(will)i(b)q(e)f(displa)o(y)o(ed)g(in)g(resp)q(onse)g(to)e(a)h(p)q
+(ossible-completions)j(call.)195 1300 y(After)14 b(that,)f(w)o(e)h(ask)
+g(the)h(user)f(if)h(she)f(is)h(sure)g(she)f(w)o(an)o(ts)f(to)h(see)h
+(them)f(all.)20 b(The)15 b(default)g(v)m(alue)195 1355
+y(is)h(100.)1685 1451 y([V)l(ariable])-1799 b Fg(int)20
+b Ff(rl)p 216 1451 V 25 w(completion)p 515 1451 V 26
+w(app)r(end)p 725 1451 V 24 w(c)n(haracter)195 1506 y
+Ft(When)d(a)f(single)i(completion)g(alternativ)o(e)f(matc)o(hes)f(at)g
+(the)h(end)g(of)f(the)h(command)f(line,)j(this)195 1560
+y(c)o(haracter)10 b(is)h(app)q(ended)i(to)d(the)g(inserted)i
+(completion)g(text.)18 b(The)11 b(default)g(is)g(a)g(space)g(c)o
+(haracter)195 1615 y(\(`)j('\).)42 b(Setting)23 b(this)g(to)f(the)h(n)o
+(ull)h(c)o(haracter)e(\(`)p Fs(\\0)p Ft('\))f(prev)o(en)o(ts)i(an)o
+(ything)f(b)q(eing)i(app)q(ended)195 1670 y(automatically)l(.)32
+b(This)19 b(can)g(b)q(e)h(c)o(hanged)f(in)g(application-sp)q(eci)q
+(\014c)j(completion)e(functions)g(to)195 1725 y(pro)o(vide)g(the)g
+(\\most)f(sensible)j(w)o(ord)d(separator)g(c)o(haracter")g(according)h
+(to)f(an)h(application-)195 1780 y(sp)q(eci\014c)d(command)e(line)i
+(syn)o(tax)d(sp)q(eci\014cation.)1685 1875 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 1875 V 25 w(completion)p 515
+1875 V 26 w(suppress)p 756 1875 V 23 w(app)r(end)195
+1930 y Ft(If)d(non-zero,)g Fi(rl)p 474 1930 14 2 v 20
+w(completion)p 710 1930 V 21 w(app)q(end)p 875 1930 V
+22 w(c)o(haracter)i Ft(is)e(not)f(app)q(ended)i(to)e(matc)o(hes)h(at)f
+(the)g(end)195 1985 y(of)d(the)h(command)g(line,)h(as)f(describ)q(ed)h
+(ab)q(o)o(v)o(e.)k(It)14 b(is)h(set)e(to)g(0)h(b)q(efore)g(an)o(y)f
+(application-sp)q(eci)q(\014c)195 2040 y(completion)j(function)g(is)g
+(called,)g(and)g(ma)o(y)e(only)i(b)q(e)g(c)o(hanged)f(within)i(suc)o(h)
+e(a)g(function.)1685 2136 y([V)l(ariable])-1799 b Fg(int)20
+b Ff(rl)p 216 2136 18 3 v 25 w(completion)p 515 2136
+V 26 w(mark)p 672 2136 V 24 w(symlink)p 890 2136 V 25
+w(dirs)195 2191 y Ft(If)c(non-zero,)g(a)g(slash)g(will)i(b)q(e)e(app)q
+(ended)i(to)d(completed)i(\014lenames)g(that)e(are)g(sym)o(b)q(olic)j
+(links)195 2245 y(to)11 b(directory)i(names,)f(sub)s(ject)g(to)f(the)i
+(v)m(alue)g(of)f(the)g(user-settable)g Fi(mark-directories)j
+Ft(v)m(ariable.)195 2300 y(This)f(v)m(ariable)h(exists)f(so)g(that)f
+(application-sp)q(eci\014c)k(completion)e(functions)f(can)g(o)o(v)o
+(erride)g(the)195 2355 y(user's)21 b(global)h(preference)g(\(set)e(via)
+i(the)f Fi(mark-symlink)o(ed-directories)k Ft(Readline)e(v)m(ariable\))
+195 2410 y(if)c(appropriate.)31 b(This)19 b(v)m(ariable)h(is)g(set)e
+(to)g(the)h(user's)g(preference)h(b)q(efore)f(an)o(y)f(application-)195
+2465 y(sp)q(eci\014c)g(completion)f(function)f(is)h(called,)g(so)e
+(unless)i(that)e(function)i(mo)q(di\014es)g(the)f(v)m(alue,)h(the)195
+2519 y(user's)e(preferences)h(are)f(honored.)1685 2615
+y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216 2615
+V 25 w(ignore)p 396 2615 V 25 w(completion)p 695 2615
+V 26 w(duplicates)195 2670 y Ft(If)15 b(non-zero,)h(then)f(duplicates)i
+(in)f(the)f(matc)o(hes)g(are)g(remo)o(v)o(ed.)k(The)d(default)g(is)f
+(1.)p eop
+%%Page: 46 50
+46 49 bop 75 -58 a Ft(46)1299 b(GNU)15 b(Readline)h(Library)1685
+149 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216 149
+18 3 v 25 w(\014lename)p 449 149 V 25 w(completion)p
+748 149 V 26 w(desired)195 204 y Ft(Non-zero)c(means)g(that)f(the)h
+(results)g(of)g(the)g(matc)o(hes)f(are)h(to)f(b)q(e)i(treated)e(as)g
+(\014lenames.)23 b(This)195 259 y(is)d Fn(always)k Ft(zero)c(when)g
+(completion)h(is)g(attempted,)f(and)g(can)g(only)h(b)q(e)g(c)o(hanged)f
+(within)h(an)195 314 y(application-sp)q(eci\014)q(c)h(completion)f
+(function.)35 b(If)20 b(it)f(is)i(set)e(to)g(a)h(non-zero)g(v)m(alue)h
+(b)o(y)e(suc)o(h)h(a)195 369 y(function,)12 b(directory)g(names)f(ha)o
+(v)o(e)g(a)f(slash)i(app)q(ended)h(and)e(Readline)h(attempts)f(to)f
+(quote)h(com-)195 423 y(pleted)19 b(\014lenames)f(if)g(they)g(con)o
+(tain)g(an)o(y)f(c)o(haracters)f(in)j Fs(rl_filename_quote_charact)o
+(ers)195 478 y Ft(and)c Fs(rl_filename_quoting_desired)d
+Ft(is)k(set)f(to)f(a)h(non-zero)g(v)m(alue.)1685 570
+y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216 570 V
+25 w(\014lename)p 449 570 V 25 w(quoting)p 663 570 V
+26 w(desired)195 625 y Ft(Non-zero)14 b(means)g(that)f(the)i(results)f
+(of)g(the)g(matc)o(hes)f(are)h(to)f(b)q(e)i(quoted)f(using)h(double)g
+(quotes)195 680 y(\(or)20 b(an)i(application-sp)q(eci\014c)i(quoting)e
+(mec)o(hanism\))f(if)h(the)f(completed)i(\014lename)f(con)o(tains)195
+735 y(an)o(y)13 b(c)o(haracters)h(in)g Fs(rl_filename_quote_chars)p
+Ft(.)i(This)f(is)f Fn(always)k Ft(non-zero)c(when)g(comple-)195
+790 y(tion)g(is)g(attempted,)g(and)g(can)g(only)g(b)q(e)g(c)o(hanged)h
+(within)g(an)e(application-sp)q(eci)q(\014c)k(completion)195
+844 y(function.)i(The)11 b(quoting)g(is)g(e\013ected)f(via)h(a)f(call)i
+(to)e(the)h(function)g(p)q(oin)o(ted)g(to)f(b)o(y)h Fs(rl_filename_)195
+899 y(quoting_function)p Ft(.)1685 991 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 991 V 25 w(attempted)p 500
+991 V 25 w(completion)p 799 991 V 26 w(o)n(v)n(er)195
+1046 y Ft(If)47 b(an)g(application-sp)q(eci\014)q(c)j(completion)e
+(function)g(assigned)f(to)g Fs(rl_attempted_)195 1101
+y(completion_function)24 b Ft(sets)i(this)h(v)m(ariable)h(to)e(a)g
+(non-zero)h(v)m(alue,)j(Readline)e(will)g(not)195 1156
+y(p)q(erform)15 b(its)g(default)g(\014lename)h(completion)g(ev)o(en)f
+(if)g(the)g(application's)h(completion)g(function)195
+1210 y(returns)f(no)g(matc)o(hes.)20 b(It)15 b(should)h(b)q(e)g(set)f
+(only)h(b)o(y)f(an)g(application's)h(completion)h(function.)1685
+1303 y([V)l(ariable])-1799 b Fg(int)20 b Ff(rl)p 216
+1303 V 25 w(completion)p 515 1303 V 26 w(t)n(yp)r(e)195
+1357 y Ft(Set)e(to)e(a)i(c)o(haracter)f(describing)i(the)e(t)o(yp)q(e)h
+(of)f(completion)i(Readline)g(is)f(curren)o(tly)g(attempt-)195
+1412 y(ing;)g(see)f(the)f(description)i(of)f Fs
+(rl_complete_internal\(\))c Ft(\(see)k(Section)h(2.6.2)d([Completion)
+195 1467 y(F)l(unctions],)k(page)f(42\))g(for)f(the)i(list)g(of)f(c)o
+(haracters.)28 b(This)19 b(is)g(set)f(to)g(the)g(appropriate)h(v)m
+(alue)195 1522 y(b)q(efore)d(an)o(y)g(application-sp)q(eci\014c)j
+(completion)e(function)g(is)f(called,)h(allo)o(wing)g(suc)o(h)f
+(functions)195 1577 y(to)f(presen)o(t)g(the)g(same)g(in)o(terface)g(as)
+g Fs(rl_complete\(\))p Ft(.)1685 1669 y([V)l(ariable])-1799
+b Fg(int)20 b Ff(rl)p 216 1669 V 25 w(inhibit)p 404 1669
+V 28 w(completion)195 1724 y Ft(If)14 b(this)h(v)m(ariable)g(is)g
+(non-zero,)f(completion)i(is)e(inhibited.)22 b(The)15
+b(completion)g(c)o(haracter)e(will)j(b)q(e)195 1778 y(inserted)g(as)f
+(an)o(y)g(other)g(b)q(ound)h(to)e Fs(self-insert)p Ft(.)75
+1890 y Fh(2.6.4)30 b(A)21 b(Short)f(Completion)g(Example)137
+2012 y Ft(Here)11 b(is)f(a)g(small)h(application)h(demonstrating)e(the)
+g(use)h(of)e(the)i(GNU)f(Readline)h(library)l(.)19 b(It)11
+b(is)f(called)75 2067 y Fs(fileman)p Ft(,)17 b(and)h(the)g(source)g(co)
+q(de)g(resides)h(in)f(`)p Fs(examples/fileman.c)p Ft('.)25
+b(This)18 b(sample)g(application)75 2122 y(pro)o(vides)c(completion)g
+(of)e(command)h(names,)g(line)i(editing)g(features,)d(and)i(access)f
+(to)f(the)h(history)h(list.)p eop
+%%Page: 47 51
+47 50 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(47)195 149 y Fd(/*)19 b(fileman.c)d(--)j(A)g(tiny)f
+(applicatio)o(n)e(which)i(demonstrat)o(es)e(how)j(to)f(use)h(the)254
+193 y(GNU)f(Readline)f(library.)36 b(This)18 b(applicatio)o(n)e
+(interactive)o(ly)g(allows)h(users)254 237 y(to)i(manipulat)o(e)d
+(files)i(and)h(their)e(modes.)h(*/)195 324 y(#include)f(<stdio.h)o(>)
+195 367 y(#include)g(<sys/typ)o(es.)o(h>)195 411 y(#include)g(<sys/fil)
+o(e.h)o(>)195 455 y(#include)g(<sys/sta)o(t.h)o(>)195
+498 y(#include)g(<sys/err)o(no.)o(h>)195 585 y(#include)g(<readlin)o
+(e/r)o(ea)o(dli)o(ne.)o(h>)195 629 y(#include)g(<readlin)o(e/h)o(is)o
+(tor)o(y.h)o(>)195 716 y(extern)g(char)h(*xmalloc)f(\(\);)195
+803 y(/*)i(The)f(names)g(of)h(functions)d(that)i(actually)f(do)h(the)h
+(manipulat)o(ion)o(.)d(*/)195 847 y(int)i(com_list)f(__P\(\(char)f
+(*\)\);)195 890 y(int)i(com_view)f(__P\(\(char)f(*\)\);)195
+934 y(int)i(com_rename)e(__P\(\(char)g(*\)\);)195 978
+y(int)i(com_stat)f(__P\(\(char)f(*\)\);)195 1021 y(int)i(com_pwd)f
+(__P\(\(char)f(*\)\);)195 1065 y(int)i(com_delete)e(__P\(\(char)g
+(*\)\);)195 1108 y(int)i(com_help)f(__P\(\(char)f(*\)\);)195
+1152 y(int)i(com_cd)g(__P\(\(char)e(*\)\);)195 1196 y(int)i(com_quit)f
+(__P\(\(char)f(*\)\);)195 1283 y(/*)j(A)g(structure)d(which)i(contains)
+e(information)g(on)j(the)f(commands)f(this)h(program)254
+1326 y(can)g(understand)o(.)f(*/)195 1413 y(typedef)g(struct)g({)234
+1457 y(char)h(*name;)g(/*)g(User)g(printable)f(name)h(of)h(the)f
+(function.)e(*/)234 1501 y(rl_icpfunc)o(_t)g(*func;)h(/*)i(Function)e
+(to)i(call)f(to)h(do)f(the)h(job.)f(*/)234 1544 y(char)g(*doc;)g(/*)h
+(Documenta)o(tio)o(n)d(for)j(this)f(function.)36 b(*/)195
+1588 y(})19 b(COMMAND;)195 1675 y(COMMAND)e(commands[)o(])g(=)i({)234
+1719 y({)g("cd",)f(com_cd,)f("Change)g(to)i(directory)d(DIR")i(},)234
+1762 y({)h("delete",)e(com_dele)o(te,)f("Delete)h(FILE")h(},)234
+1806 y({)h("help",)e(com_help,)f("Display)h(this)h(text")g(},)234
+1849 y({)h("?",)g(com_help)o(,)e("Synonym)f(for)j(`help'")e(},)234
+1893 y({)i("list",)e(com_list,)f("List)i(files)g(in)h(DIR")f(},)234
+1936 y({)h("ls",)f(com_list,)e("Synonym)h(for)h(`list'")f(},)234
+1980 y({)i("pwd",)f(com_pwd,)e("Print)i(the)g(current)f(working)g
+(directory)o(")g(},)234 2024 y({)i("quit",)e(com_quit,)f("Quit)i(using)
+g(Fileman")e(},)234 2067 y({)j("rename",)e(com_rena)o(me,)f("Rename)h
+(FILE)h(to)h(NEWNAME")d(},)234 2111 y({)j("stat",)e(com_stat,)f("Print)
+i(out)g(statistics)e(on)j(FILE")f(},)234 2154 y({)h("view",)e
+(com_view,)f("View)i(the)h(contents)d(of)j(FILE")f(},)234
+2198 y({)h(\(char)f(*\)NULL,)f(\(rl_icpfun)o(c_)o(t)g(*\)NULL,)g
+(\(char)g(*\)NULL)h(})195 2242 y(};)195 2329 y(/*)h(Forward)e
+(declarati)o(on)o(s.)f(*/)195 2372 y(char)i(*stripwhit)o(e)e(\(\);)195
+2416 y(COMMAND)h(*find_com)o(man)o(d)f(\(\);)195 2503
+y(/*)j(The)f(name)g(of)h(this)f(program,)f(as)i(taken)e(from)h
+(argv[0].)f(*/)195 2547 y(char)h(*progname;)195 2634
+y(/*)h(When)f(non-zero,)e(this)i(means)g(the)g(user)g(is)h(done)f
+(using)g(this)g(program.)f(*/)p eop
+%%Page: 48 52
+48 51 bop 75 -58 a Ft(48)1299 b(GNU)15 b(Readline)h(Library)195
+149 y Fd(int)i(done;)195 237 y(char)g(*)195 280 y(dupstr)f(\(s\))293
+324 y(int)i(s;)195 367 y({)234 411 y(char)f(*r;)234 498
+y(r)h(=)h(xmalloc)d(\(strlen)f(\(s\))j(+)g(1\);)234 542
+y(strcpy)f(\(r,)g(s\);)234 585 y(return)g(\(r\);)195
+629 y(})195 716 y(main)g(\(argc,)f(argv\))293 760 y(int)i(argc;)293
+803 y(char)f(**argv;)195 847 y({)234 890 y(char)g(*line,)g(*s;)234
+978 y(progname)f(=)i(argv[0];)234 1065 y(initialize)o(_re)o(ad)o(lin)o
+(e)d(\(\);)j(/*)g(Bind)f(our)g(completer.)e(*/)234 1152
+y(/*)j(Loop)f(reading)f(and)h(executing)f(lines)g(until)h(the)g(user)h
+(quits.)e(*/)234 1196 y(for)i(\()g(;)g(done)f(==)h(0;)g(\))273
+1239 y({)313 1283 y(line)f(=)h(readline)d(\("FileMan:)g("\);)313
+1370 y(if)j(\(!line\))352 1413 y(break;)313 1501 y(/*)g(Remove)e
+(leading)g(and)h(trailing)f(whitespac)o(e)f(from)j(the)f(line.)372
+1544 y(Then,)f(if)i(there)f(is)h(anything)d(left,)i(add)g(it)h(to)g
+(the)f(history)f(list)372 1588 y(and)h(execute)f(it.)h(*/)313
+1631 y(s)h(=)g(stripwhite)d(\(line\);)313 1719 y(if)j(\(*s\))352
+1762 y({)391 1806 y(add_histor)o(y)d(\(s\);)391 1849
+y(execute_li)o(ne)g(\(s\);)352 1893 y(})313 1980 y(free)i(\(line\);)273
+2024 y(})234 2067 y(exit)g(\(0\);)195 2111 y(})195 2198
+y(/*)h(Execute)e(a)i(command)e(line.)h(*/)195 2242 y(int)195
+2285 y(execute_li)o(ne)e(\(line\))293 2329 y(char)i(*line;)195
+2372 y({)234 2416 y(register)f(int)h(i;)234 2460 y(COMMAND)f(*command;)
+234 2503 y(char)h(*word;)234 2590 y(/*)h(Isolate)e(the)h(command)f
+(word.)h(*/)234 2634 y(i)h(=)h(0;)p eop
+%%Page: 49 53
+49 52 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(49)234 149 y Fd(while)18 b(\(line[i])e(&&)j(whitespace)
+d(\(line[i]\)\))273 193 y(i++;)234 237 y(word)i(=)i(line)e(+)h(i;)234
+324 y(while)f(\(line[i])e(&&)j(!whitespac)o(e)e(\(line[i]\))o(\))273
+367 y(i++;)234 455 y(if)i(\(line[i]\))273 498 y(line[i++])e(=)i('\\0';)
+234 585 y(command)e(=)i(find_comma)o(nd)d(\(word\);)234
+672 y(if)j(\(!command\))273 716 y({)313 760 y(fprintf)e(\(stderr,)f
+("\045s:)i(No)h(such)f(command)f(for)h(FileMan.\\n")o(,)e(word\);)313
+803 y(return)h(\(-1\);)273 847 y(})234 934 y(/*)i(Get)g(argument)d(to)j
+(command,)d(if)j(any.)f(*/)234 978 y(while)g(\(whitespa)o(ce)e
+(\(line[i]\)\))273 1021 y(i++;)234 1108 y(word)i(=)i(line)e(+)h(i;)234
+1196 y(/*)g(Call)f(the)h(function)o(.)e(*/)234 1239 y(return)h
+(\(\(*\(comm)o(and)o(->)o(fun)o(c\)\))e(\(word\)\);)195
+1283 y(})195 1370 y(/*)j(Look)f(up)h(NAME)f(as)h(the)f(name)g(of)h(a)g
+(command,)e(and)h(return)g(a)h(pointer)e(to)i(that)254
+1413 y(command.)36 b(Return)17 b(a)i(NULL)g(pointer)d(if)j(NAME)f
+(isn't)g(a)h(command)e(name.)h(*/)195 1457 y(COMMAND)f(*)195
+1501 y(find_comma)o(nd)f(\(name\))293 1544 y(char)i(*name;)195
+1588 y({)234 1631 y(register)f(int)h(i;)234 1719 y(for)h(\(i)g(=)g(0;)g
+(commands)o([i])o(.na)o(me)o(;)e(i++\))273 1762 y(if)i(\(strcmp)e
+(\(name,)g(commands[i])o(.n)o(ame)o(\))g(==)h(0\))313
+1806 y(return)f(\(&command)o(s[i)o(]\);)234 1893 y(return)h(\(\(COMMAN)
+o(D)f(*\)NULL\);)195 1936 y(})195 2024 y(/*)i(Strip)f(whitespa)o(ce)e
+(from)i(the)h(start)e(and)i(end)f(of)h(STRING.)37 b(Return)17
+b(a)i(pointer)254 2067 y(into)f(STRING.)f(*/)195 2111
+y(char)h(*)195 2154 y(stripwhite)e(\(string\))293 2198
+y(char)i(*string;)195 2242 y({)234 2285 y(register)f(char)h(*s,)g(*t;)
+234 2372 y(for)h(\(s)g(=)g(string;)e(whitespac)o(e)f(\(*s\);)i(s++\))
+273 2416 y(;)234 2503 y(if)h(\(*s)g(==)f(0\))273 2547
+y(return)g(\(s\);)234 2634 y(t)h(=)h(s)f(+)g(strlen)e(\(s\))i(-)g(1;)p
+eop
+%%Page: 50 54
+50 53 bop 75 -58 a Ft(50)1299 b(GNU)15 b(Readline)h(Library)234
+149 y Fd(while)i(\(t)h(>)g(s)g(&&)g(whitespace)d(\(*t\)\))273
+193 y(t--;)234 237 y(*++t)i(=)i('\\0';)234 324 y(return)e(s;)195
+367 y(})195 455 y(/*)h(*********)o(***)o(**)o(***)o(**)o(***)o(***)o
+(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)
+o(***)o(***)d(*/)195 498 y(/*)1294 b(*/)195 542 y(/*)352
+b(Interface)16 b(to)j(Readline)e(Completio)o(n)311 b(*/)195
+585 y(/*)1294 b(*/)195 629 y(/*)19 b(*********)o(***)o(**)o(***)o(**)o
+(***)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o(***)o(***)o
+(**)o(***)o(**)o(***)o(***)d(*/)195 716 y(char)i(*command_g)o(en)o(era)
+o(to)o(r)f(__P\(\(cons)o(t)f(char)j(*,)f(int\)\);)195
+760 y(char)g(**fileman_)o(co)o(mpl)o(et)o(ion)e(__P\(\(cons)o(t)h(char)
+h(*,)h(int,)f(int\)\);)195 847 y(/*)h(Tell)f(the)g(GNU)h(Readline)d
+(library)h(how)i(to)g(complete)o(.)36 b(We)19 b(want)f(to)h(try)g(to)
+254 890 y(complete)d(on)j(command)e(names)h(if)h(this)f(is)h(the)f
+(first)g(word)g(in)h(the)f(line,)g(or)254 934 y(on)h(filenames)d(if)j
+(not.)f(*/)195 978 y(initialize)o(_r)o(ead)o(li)o(ne)e(\(\))195
+1021 y({)234 1065 y(/*)j(Allow)f(condition)o(al)e(parsing)h(of)i(the)f
+(~/.inputrc)e(file.)i(*/)234 1108 y(rl_readlin)o(e_n)o(am)o(e)f(=)i
+("FileMan")o(;)234 1196 y(/*)g(Tell)f(the)h(complete)o(r)e(that)h(we)h
+(want)f(a)h(crack)f(first.)f(*/)234 1239 y(rl_attempt)o(ed_)o(co)o(mpl)
+o(et)o(ion)o(_fu)o(nc)o(tio)o(n)f(=)k(fileman_c)o(om)o(ple)o(tio)o(n;)
+195 1283 y(})195 1370 y(/*)f(Attempt)e(to)i(complete)d(on)j(the)f
+(contents)f(of)i(TEXT.)37 b(START)18 b(and)g(END)254
+1413 y(bound)g(the)g(region)f(of)i(rl_line_bu)o(ff)o(er)d(that)i
+(contains)f(the)h(word)g(to)254 1457 y(complete.)36 b(TEXT)18
+b(is)g(the)h(word)f(to)h(complete.)36 b(We)18 b(can)h(use)f(the)h
+(entire)254 1501 y(contents)d(of)j(rl_line_bu)o(ffe)o(r)d(in)j(case)f
+(we)h(want)f(to)h(do)g(some)f(simple)254 1544 y(parsing.)36
+b(Returnthe)16 b(array)i(of)h(matches,)d(or)j(NULL)f(if)h(there)f
+(aren't)f(any.)h(*/)195 1588 y(char)g(**)195 1631 y(fileman_co)o(mp)o
+(let)o(io)o(n)f(\(text,)g(start,)g(end\))293 1675 y(const)h(char)g
+(*text;)293 1719 y(int)h(start,)e(end;)195 1762 y({)234
+1806 y(char)h(**matches;)234 1893 y(matches)f(=)i(\(char)f(**\)NULL;)
+234 1980 y(/*)h(If)g(this)f(word)g(is)h(at)g(the)f(start)g(of)h(the)f
+(line,)g(then)g(it)h(is)g(a)g(command)293 2024 y(to)g(complete.)36
+b(Otherwise)16 b(it)j(is)f(the)h(name)f(of)h(a)g(file)f(in)h(the)f
+(current)293 2067 y(directory.)e(*/)234 2111 y(if)j(\(start)e(==)i(0\))
+273 2154 y(matches)e(=)j(rl_compl)o(eti)o(on_)o(ma)o(tch)o(es)c
+(\(text,)h(command_gen)o(er)o(ato)o(r\))o(;)234 2242
+y(return)h(\(matches)o(\);)195 2285 y(})195 2372 y(/*)h(Generator)d
+(function)g(for)j(command)e(completio)o(n.)36 b(STATE)18
+b(lets)g(us)254 2416 y(know)g(whether)f(to)i(start)e(from)h(scratch;)f
+(without)g(any)h(state)254 2460 y(\(i.e.)g(STATE)f(==)i(0\),)f(then)h
+(we)f(start)g(at)h(the)f(top)h(of)g(the)f(list.)g(*/)195
+2503 y(char)g(*)195 2547 y(command_ge)o(ne)o(rat)o(or)e(\(text,)h
+(state\))293 2590 y(const)h(char)g(*text;)293 2634 y(int)h(state;)p
+eop
+%%Page: 51 55
+51 54 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(51)195 149 y Fd({)234 193 y(static)18
+b(int)g(list_inde)o(x,)e(len;)234 237 y(char)i(*name;)234
+324 y(/*)h(If)g(this)f(is)h(a)g(new)f(word)h(to)f(complete,)f(initiali)
+o(ze)f(now.)38 b(This)293 367 y(includes)17 b(saving)g(the)h(length)g
+(of)g(TEXT)h(for)f(efficiency)o(,)e(and)293 411 y(initializi)o(ng)g
+(the)i(index)g(variable)f(to)i(0.)f(*/)234 455 y(if)h(\(!state\))273
+498 y({)313 542 y(list_inde)o(x)d(=)k(0;)313 585 y(len)e(=)h(strlen)f
+(\(text\);)273 629 y(})234 716 y(/*)h(Return)e(the)i(next)f(name)g
+(which)g(partially)e(matches)h(from)h(the)293 760 y(command)f(list.)h
+(*/)234 803 y(while)g(\(name)g(=)h(commands[)o(lis)o(t_)o(ind)o(ex)o
+(].n)o(ame)o(\))273 847 y({)313 890 y(list_inde)o(x+)o(+;)313
+978 y(if)g(\(strncmp)d(\(name,)h(text,)h(len\))g(==)h(0\))352
+1021 y(return)e(\(dupstr\(na)o(me\))o(\);)273 1065 y(})234
+1152 y(/*)i(If)g(no)g(names)e(matched,)g(then)h(return)f(NULL.)h(*/)234
+1196 y(return)g(\(\(char)f(*\)NULL\);)195 1239 y(})195
+1326 y(/*)i(*********)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o
+(**)o(***)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o(***)o
+(***)d(*/)195 1370 y(/*)1294 b(*/)195 1413 y(/*)450 b(FileMan)17
+b(Commands)527 b(*/)195 1457 y(/*)1294 b(*/)195 1501
+y(/*)19 b(*********)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o
+(***)o(***)o(**)o(***)o(**)o(***)o(***)o(**)o(***)o(**)o(***)o(***)d
+(*/)195 1588 y(/*)j(String)e(to)i(pass)f(to)h(system)e(\(\).)38
+b(This)18 b(is)h(for)g(the)f(LIST,)g(VIEW)g(and)g(RENAME)254
+1631 y(commands.)e(*/)195 1675 y(static)h(char)h(syscom[102)o(4];)195
+1762 y(/*)h(List)f(the)g(file\(s\))f(named)h(in)h(arg.)f(*/)195
+1806 y(com_list)f(\(arg\))293 1849 y(char)h(*arg;)195
+1893 y({)234 1936 y(if)h(\(!arg\))273 1980 y(arg)g(=)g("";)234
+2067 y(sprintf)e(\(syscom,)g("ls)h(-FClg)g(\045s",)g(arg\);)234
+2111 y(return)g(\(system)e(\(syscom\)\);)195 2154 y(})195
+2242 y(com_view)h(\(arg\))293 2285 y(char)h(*arg;)195
+2329 y({)234 2372 y(if)h(\(!valid_ar)o(gu)o(men)o(t)d(\("view",)h
+(arg\)\))273 2416 y(return)h(1;)234 2503 y(sprintf)f(\(syscom,)g("more)
+g(\045s",)h(arg\);)234 2547 y(return)g(\(system)e(\(syscom\)\);)195
+2590 y(})p eop
+%%Page: 52 56
+52 55 bop 75 -58 a Ft(52)1299 b(GNU)15 b(Readline)h(Library)195
+149 y Fd(com_rename)g(\(arg\))293 193 y(char)i(*arg;)195
+237 y({)234 280 y(too_danger)o(ous)e(\("rename")o(\);)234
+324 y(return)i(\(1\);)195 367 y(})195 455 y(com_stat)f(\(arg\))293
+498 y(char)h(*arg;)195 542 y({)234 585 y(struct)g(stat)g(finfo;)234
+672 y(if)h(\(!valid_ar)o(gu)o(men)o(t)d(\("stat",)h(arg\)\))273
+716 y(return)h(\(1\);)234 803 y(if)h(\(stat)f(\(arg,)f(&finfo\))g(==)i
+(-1\))273 847 y({)313 890 y(perror)e(\(arg\);)313 934
+y(return)g(\(1\);)273 978 y(})234 1065 y(printf)h(\("Statis)o(tic)o(s)e
+(for)j(`\045s':\\n",)d(arg\);)234 1152 y(printf)i(\("\045s)g(has)g
+(\045d)h(link\045s,)e(and)h(is)h(\045d)g(byte\045s)e(in)i(length.\\n")o
+(,)d(arg,)391 1196 y(finfo.st_n)o(li)o(nk,)391 1239 y(\(finfo.st_)o(nl)
+o(ink)g(==)j(1\))g(?)g("")g(:)g("s",)391 1283 y(finfo.st_s)o(iz)o(e,)
+391 1326 y(\(finfo.st_)o(si)o(ze)d(==)j(1\))g(?)g("")g(:)g("s"\);)234
+1370 y(printf)f(\("Inode)e(Last)i(Change)g(at:)g(\045s",)g(ctime)g
+(\(&finfo.st)o(_c)o(tim)o(e\))o(\);)234 1413 y(printf)g(\(")116
+b(Last)18 b(access)g(at:)g(\045s",)g(ctime)g(\(&finfo.st)o(_a)o(tim)o
+(e\))o(\);)234 1457 y(printf)g(\(")77 b(Last)18 b(modified)f(at:)h
+(\045s",)g(ctime)g(\(&finfo.st)o(_m)o(tim)o(e\))o(\);)234
+1501 y(return)g(\(0\);)195 1544 y(})195 1631 y(com_delete)e(\(arg\))293
+1675 y(char)i(*arg;)195 1719 y({)234 1762 y(too_danger)o(ous)e
+(\("delete")o(\);)234 1806 y(return)i(\(1\);)195 1849
+y(})195 1936 y(/*)h(Print)f(out)g(help)g(for)g(ARG,)h(or)f(for)h(all)f
+(of)h(the)g(commands)d(if)j(ARG)f(is)254 1980 y(not)g(present.)f(*/)195
+2024 y(com_help)g(\(arg\))293 2067 y(char)h(*arg;)195
+2111 y({)234 2154 y(register)f(int)h(i;)234 2198 y(int)h(printed)e(=)i
+(0;)234 2285 y(for)g(\(i)g(=)g(0;)g(commands)o([i])o(.na)o(me)o(;)e
+(i++\))273 2329 y({)313 2372 y(if)i(\(!*arg)e(||)i(\(strcmp)e(\(arg,)g
+(commands[i)o(].n)o(am)o(e\))f(==)j(0\)\))352 2416 y({)391
+2460 y(printf)e(\("\045s\\t\\t\045s.)o(\\n)o(",)f(commands[i)o(].n)o
+(am)o(e,)g(commands[i)o(].d)o(oc\))o(;)391 2503 y(printed++;)352
+2547 y(})273 2590 y(})p eop
+%%Page: 53 57
+53 56 bop 75 -58 a Ft(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g
+(Readline)843 b(53)234 149 y Fd(if)19 b(\(!printed\))273
+193 y({)313 237 y(printf)e(\("No)h(commands)f(match)g(`\045s'.)38
+b(Possibil)o(tie)o(s)17 b(are:\\n",)f(arg\);)313 324
+y(for)i(\(i)h(=)g(0;)g(commands[i)o(].)o(nam)o(e;)d(i++\))352
+367 y({)391 411 y(/*)j(Print)f(in)g(six)h(columns.)d(*/)391
+455 y(if)j(\(printed)d(==)j(6\))430 498 y({)470 542 y(printed)d(=)k(0;)
+470 585 y(printf)d(\("\\n"\);)430 629 y(})391 716 y(printf)g
+(\("\045s\\t",)g(commands[)o(i].)o(nam)o(e\))o(;)391
+760 y(printed++;)352 803 y(})313 890 y(if)i(\(printed)o(\))352
+934 y(printf)e(\("\\n"\);)273 978 y(})234 1021 y(return)h(\(0\);)195
+1065 y(})195 1152 y(/*)h(Change)e(to)i(the)f(directory)f(ARG.)h(*/)195
+1196 y(com_cd)f(\(arg\))293 1239 y(char)h(*arg;)195 1283
+y({)234 1326 y(if)h(\(chdir)e(\(arg\))h(==)h(-1\))273
+1370 y({)313 1413 y(perror)e(\(arg\);)313 1457 y(return)g(1;)273
+1501 y(})234 1588 y(com_pwd)g(\(""\);)234 1631 y(return)h(\(0\);)195
+1675 y(})195 1762 y(/*)h(Print)f(out)g(the)g(current)f(working)g
+(directory.)f(*/)195 1806 y(com_pwd)h(\(ignore\))293
+1849 y(char)h(*ignore;)195 1893 y({)234 1936 y(char)g(dir[1024],)e(*s;)
+234 2024 y(s)j(=)h(getcwd)d(\(dir,)h(sizeof\(di)o(r\))e(-)j(1\);)234
+2067 y(if)g(\(s)g(==)g(0\))273 2111 y({)313 2154 y(printf)e(\("Error)g
+(getting)g(pwd:)h(\045s\\n",)f(dir\);)313 2198 y(return)g(1;)273
+2242 y(})234 2329 y(printf)h(\("Curren)o(t)f(directory)f(is)j
+(\045s\\n",)e(dir\);)234 2372 y(return)h(0;)195 2416
+y(})195 2503 y(/*)h(The)f(user)g(wishes)g(to)g(quit)h(using)e(this)h
+(program.)36 b(Just)19 b(set)f(DONE)254 2547 y(non-zero.)e(*/)195
+2590 y(com_quit)h(\(arg\))293 2634 y(char)h(*arg;)p eop
+%%Page: 54 58
+54 57 bop 75 -58 a Ft(54)1299 b(GNU)15 b(Readline)h(Library)195
+149 y Fd({)234 193 y(done)i(=)i(1;)234 237 y(return)e(\(0\);)195
+280 y(})195 367 y(/*)h(Function)d(which)i(tells)g(you)g(that)g(you)h
+(can't)e(do)i(this.)f(*/)195 411 y(too_danger)o(ou)o(s)f(\(caller\))293
+455 y(char)h(*caller;)195 498 y({)234 542 y(fprintf)f(\(stderr,)411
+585 y("\045s:)h(Too)g(dangerous)e(for)j(me)g(to)g(distribu)o(te.)o
+(\\n")411 629 y(caller\);)234 672 y(fprintf)e(\(stderr,)g("Write)g(it)i
+(yourself.)o(\\n")o(\);)195 716 y(})195 803 y(/*)g(Return)e(non-zero)g
+(if)h(ARG)h(is)g(a)g(valid)f(argument)e(for)j(CALLER,)254
+847 y(else)f(print)g(an)g(error)g(message)f(and)h(return)g(zero.)f(*/)
+195 890 y(int)195 934 y(valid_argu)o(me)o(nt)f(\(caller,)h(arg\))293
+978 y(char)h(*caller,)f(*arg;)195 1021 y({)234 1065 y(if)i(\(!arg)f(||)
+h(!*arg\))273 1108 y({)313 1152 y(fprintf)e(\(stderr,)f("\045s:)i
+(Argument)f(required.)o(\\n)o(",)f(caller\);)313 1196
+y(return)h(\(0\);)273 1239 y(})234 1326 y(return)h(\(1\);)195
+1370 y(})p eop
+%%Page: 55 59
+55 58 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(55)75 149 y Fp(App)r(endix)25 b(A)20 b(Cop)n(ying)26
+b(This)g(Man)n(ual)75 345 y Fr(A.1)33 b(GNU)21 b(F)-6
+b(ree)23 b(Do)r(cumen)n(tation)g(License)698 455 y Ft(V)l(ersion)16
+b(1.2,)e(No)o(v)o(em)o(b)q(er)h(2002)195 526 y(Cop)o(yrigh)o(t)421
+525 y(c)409 526 y Fq(\015)f Ft(2000,2001,200)o(2)e(F)l(ree)j(Soft)o(w)o
+(are)f(F)l(oundation,)h(Inc.)195 581 y(59)g(T)l(emple)h(Place,)f(Suite)
+i(330,)d(Boston,)g(MA)30 b(02111-1307,)12 b(USA)195 690
+y(Ev)o(ery)o(one)j(is)g(p)q(ermitted)h(to)f(cop)o(y)g(and)g(distribute)
+i(v)o(erbatim)e(copies)195 745 y(of)g(this)g(license)j(do)q(cumen)o(t,)
+d(but)g(c)o(hanging)h(it)f(is)h(not)f(allo)o(w)o(ed.)100
+816 y(0.)29 b(PREAMBLE)165 885 y(The)19 b(purp)q(ose)g(of)f(this)h
+(License)i(is)e(to)f(mak)o(e)g(a)g(man)o(ual,)h(textb)q(o)q(ok,)g(or)f
+(other)g(functional)i(and)165 940 y(useful)c(do)q(cumen)o(t)g
+Fi(free)h Ft(in)f(the)f(sense)h(of)f(freedom:)k(to)c(assure)g(ev)o(ery)
+o(one)f(the)i(e\013ectiv)o(e)f(freedom)165 995 y(to)g(cop)o(y)h(and)g
+(redistribute)h(it,)e(with)h(or)f(without)h(mo)q(difying)h(it,)f
+(either)g(commercially)h(or)f(non-)165 1050 y(commercially)l(.)28
+b(Secondarily)l(,)19 b(this)f(License)h(preserv)o(es)e(for)g(the)g
+(author)g(and)h(publisher)h(a)e(w)o(a)o(y)165 1104 y(to)g(get)h(credit)
+h(for)e(their)i(w)o(ork,)e(while)j(not)e(b)q(eing)h(considered)g(resp)q
+(onsible)h(for)e(mo)q(di\014cations)165 1159 y(made)d(b)o(y)g(others.)
+165 1228 y(This)d(License)i(is)e(a)f(kind)i(of)e(\\cop)o(yleft",)g
+(whic)o(h)i(means)e(that)g(deriv)m(ativ)o(e)i(w)o(orks)e(of)g(the)h(do)
+q(cumen)o(t)165 1283 y(m)o(ust)k(themselv)o(es)i(b)q(e)g(free)e(in)i
+(the)f(same)g(sense.)26 b(It)16 b(complemen)o(ts)i(the)f(GNU)g(General)
+g(Public)165 1338 y(License,)g(whic)o(h)f(is)f(a)g(cop)o(yleft)h
+(license)h(designed)f(for)f(free)g(soft)o(w)o(are.)165
+1407 y(W)l(e)g(ha)o(v)o(e)f(designed)i(this)g(License)g(in)g(order)e
+(to)g(use)h(it)g(for)g(man)o(uals)f(for)g(free)h(soft)o(w)o(are,)e(b)q
+(ecause)165 1462 y(free)21 b(soft)o(w)o(are)e(needs)j(free)f(do)q
+(cumen)o(tation:)32 b(a)21 b(free)g(program)f(should)i(come)f(with)h
+(man)o(uals)165 1517 y(pro)o(viding)15 b(the)g(same)f(freedoms)g(that)g
+(the)g(soft)o(w)o(are)f(do)q(es.)20 b(But)14 b(this)h(License)h(is)f
+(not)f(limited)j(to)165 1571 y(soft)o(w)o(are)d(man)o(uals;)h(it)g(can)
+h(b)q(e)g(used)g(for)e(an)o(y)h(textual)h(w)o(ork,)e(regardless)h(of)g
+(sub)s(ject)g(matter)f(or)165 1626 y(whether)i(it)g(is)g(published)i
+(as)e(a)f(prin)o(ted)i(b)q(o)q(ok.)k(W)l(e)16 b(recommend)g(this)g
+(License)i(principally)h(for)165 1681 y(w)o(orks)14 b(whose)h(purp)q
+(ose)h(is)g(instruction)g(or)f(reference.)100 1750 y(1.)29
+b(APPLICABILITY)17 b(AND)e(DEFINITIONS)165 1819 y(This)21
+b(License)g(applies)h(to)d(an)o(y)h(man)o(ual)g(or)f(other)h(w)o(ork,)g
+(in)h(an)o(y)e(medium,)j(that)d(con)o(tains)h(a)165 1874
+y(notice)h(placed)h(b)o(y)f(the)g(cop)o(yrigh)o(t)f(holder)i(sa)o(ying)
+f(it)g(can)g(b)q(e)g(distributed)h(under)g(the)f(terms)165
+1929 y(of)d(this)h(License.)33 b(Suc)o(h)19 b(a)g(notice)g(gran)o(ts)e
+(a)i(w)o(orld-wide,)h(ro)o(y)o(alt)o(y-free)e(license,)j(unlimited)g
+(in)165 1984 y(duration,)j(to)e(use)h(that)f(w)o(ork)g(under)h(the)g
+(conditions)h(stated)e(herein.)43 b(The)23 b(\\Do)q(cumen)o(t",)165
+2039 y(b)q(elo)o(w,)15 b(refers)f(to)f(an)o(y)h(suc)o(h)g(man)o(ual)h
+(or)e(w)o(ork.)19 b(An)o(y)14 b(mem)o(b)q(er)h(of)e(the)i(public)h(is)f
+(a)f(licensee,)i(and)165 2093 y(is)d(addressed)g(as)f(\\y)o(ou".)18
+b(Y)l(ou)13 b(accept)g(the)f(license)j(if)e(y)o(ou)f(cop)o(y)l(,)h(mo)q
+(dify)g(or)f(distribute)h(the)g(w)o(ork)165 2148 y(in)j(a)f(w)o(a)o(y)f
+(requiring)j(p)q(ermission)f(under)g(cop)o(yrigh)o(t)f(la)o(w.)165
+2217 y(A)i(\\Mo)q(di\014ed)h(V)l(ersion")f(of)f(the)h(Do)q(cumen)o(t)g
+(means)g(an)o(y)f(w)o(ork)g(con)o(taining)i(the)f(Do)q(cumen)o(t)f(or)
+165 2272 y(a)i(p)q(ortion)h(of)g(it,)g(either)h(copied)g(v)o(erbatim,)f
+(or)f(with)h(mo)q(di\014cations)h(and/or)e(translated)h(in)o(to)165
+2327 y(another)c(language.)165 2396 y(A)e(\\Secondary)g(Section")h(is)f
+(a)g(named)g(app)q(endix)i(or)d(a)h(fron)o(t-matter)e(section)i(of)g
+(the)g(Do)q(cumen)o(t)165 2451 y(that)d(deals)h(exclusiv)o(ely)i(with)e
+(the)g(relationship)h(of)f(the)f(publishers)j(or)d(authors)g(of)g(the)h
+(Do)q(cumen)o(t)165 2506 y(to)18 b(the)h(Do)q(cumen)o(t's)f(o)o(v)o
+(erall)h(sub)s(ject)f(\(or)g(to)g(related)h(matters\))e(and)i(con)o
+(tains)g(nothing)g(that)165 2560 y(could)i(fall)g(directly)h(within)f
+(that)e(o)o(v)o(erall)i(sub)s(ject.)34 b(\(Th)o(us,)21
+b(if)g(the)f(Do)q(cumen)o(t)g(is)h(in)g(part)e(a)165
+2615 y(textb)q(o)q(ok)12 b(of)f(mathematics,)h(a)f(Secondary)h(Section)
+h(ma)o(y)e(not)h(explain)h(an)o(y)f(mathematics.\))18
+b(The)165 2670 y(relationship)d(could)g(b)q(e)f(a)g(matter)e(of)i
+(historical)g(connection)h(with)f(the)g(sub)s(ject)f(or)h(with)g
+(related)p eop
+%%Page: 56 60
+56 59 bop 75 -58 a Ft(56)1299 b(GNU)15 b(Readline)h(Library)165
+149 y(matters,)h(or)g(of)g(legal,)i(commercial,)g(philosophical,)i
+(ethical)e(or)e(p)q(olitical)j(p)q(osition)f(regarding)165
+204 y(them.)165 275 y(The)13 b(\\In)o(v)m(arian)o(t)g(Sections")g(are)g
+(certain)g(Secondary)g(Sections)h(whose)f(titles)g(are)g(designated,)g
+(as)165 329 y(b)q(eing)i(those)e(of)g(In)o(v)m(arian)o(t)g(Sections,)h
+(in)h(the)e(notice)h(that)e(sa)o(ys)h(that)g(the)g(Do)q(cumen)o(t)g(is)
+h(released)165 384 y(under)h(this)f(License.)21 b(If)14
+b(a)g(section)g(do)q(es)g(not)g(\014t)f(the)h(ab)q(o)o(v)o(e)g
+(de\014nition)i(of)d(Secondary)h(then)g(it)g(is)165 439
+y(not)i(allo)o(w)o(ed)g(to)f(b)q(e)i(designated)g(as)e(In)o(v)m(arian)o
+(t.)22 b(The)17 b(Do)q(cumen)o(t)e(ma)o(y)h(con)o(tain)g(zero)g(In)o(v)
+m(arian)o(t)165 494 y(Sections.)k(If)12 b(the)h(Do)q(cumen)o(t)f(do)q
+(es)h(not)f(iden)o(tify)h(an)o(y)f(In)o(v)m(arian)o(t)h(Sections)g
+(then)g(there)f(are)g(none.)165 564 y(The)19 b(\\Co)o(v)o(er)e(T)l
+(exts")g(are)h(certain)h(short)f(passages)g(of)f(text)h(that)g(are)g
+(listed,)i(as)e(F)l(ron)o(t-Co)o(v)o(er)165 619 y(T)l(exts)12
+b(or)g(Bac)o(k-Co)o(v)o(er)g(T)l(exts,)g(in)i(the)e(notice)h(that)f(sa)
+o(ys)g(that)g(the)g(Do)q(cumen)o(t)h(is)g(released)g(under)165
+674 y(this)g(License.)21 b(A)13 b(F)l(ron)o(t-Co)o(v)o(er)e(T)l(ext)i
+(ma)o(y)f(b)q(e)i(at)e(most)g(5)h(w)o(ords,)f(and)h(a)g(Bac)o(k-Co)o(v)
+o(er)f(T)l(ext)h(ma)o(y)165 729 y(b)q(e)j(at)e(most)h(25)f(w)o(ords.)
+165 799 y(A)k(\\T)l(ransparen)o(t")e(cop)o(y)i(of)f(the)h(Do)q(cumen)o
+(t)g(means)f(a)h(mac)o(hine-readable)h(cop)o(y)l(,)f(represen)o(ted)165
+854 y(in)h(a)e(format)g(whose)g(sp)q(eci\014cation)j(is)f(a)o(v)m
+(ailable)g(to)e(the)h(general)h(public,)h(that)d(is)h(suitable)i(for)
+165 909 y(revising)d(the)f(do)q(cumen)o(t)g(straigh)o(tforw)o(ardly)f
+(with)h(generic)h(text)e(editors)h(or)f(\(for)g(images)h(com-)165
+964 y(p)q(osed)c(of)g(pixels\))h(generic)g(pain)o(t)f(programs)f(or)g
+(\(for)g(dra)o(wings\))h(some)f(widely)i(a)o(v)m(ailable)h(dra)o(wing)
+165 1018 y(editor,)h(and)f(that)g(is)h(suitable)h(for)e(input)h(to)f
+(text)g(formatters)f(or)h(for)g(automatic)g(translation)h(to)165
+1073 y(a)e(v)m(ariet)o(y)h(of)f(formats)f(suitable)i(for)f(input)i(to)d
+(text)h(formatters.)18 b(A)13 b(cop)o(y)h(made)f(in)h(an)g(otherwise)
+165 1128 y(T)l(ransparen)o(t)k(\014le)i(format)d(whose)i(markup,)g(or)g
+(absence)g(of)g(markup,)g(has)f(b)q(een)i(arranged)f(to)165
+1183 y(th)o(w)o(art)12 b(or)g(discourage)i(subsequen)o(t)g(mo)q
+(di\014cation)h(b)o(y)e(readers)g(is)h(not)f(T)l(ransparen)o(t.)18
+b(An)c(image)165 1238 y(format)i(is)i(not)e(T)l(ransparen)o(t)h(if)h
+(used)f(for)g(an)o(y)g(substan)o(tial)g(amoun)o(t)g(of)f(text.)26
+b(A)17 b(cop)o(y)g(that)f(is)165 1292 y(not)f(\\T)l(ransparen)o(t")f
+(is)i(called)g(\\Opaque".)165 1363 y(Examples)27 b(of)f(suitable)i
+(formats)d(for)h(T)l(ransparen)o(t)g(copies)h(include)i(plain)f
+Fm(asci)q(i)e Ft(without)165 1418 y(markup,)20 b(T)l(exinfo)h(input)g
+(format,)e(LaT)887 1427 y(E)913 1418 y(X)h(input)h(format,)e
+Fm(sgml)h Ft(or)f Fm(xml)h Ft(using)h(a)e(publicly)165
+1472 y(a)o(v)m(ailable)e Fm(dtd)p Ft(,)g(and)f(standard-conforming)f
+(simple)i Fm(html)p Ft(,)f(P)o(ostScript)f(or)h Fm(pdf)g
+Ft(designed)i(for)165 1527 y(h)o(uman)h(mo)q(di\014cation.)33
+b(Examples)19 b(of)g(transparen)o(t)f(image)h(formats)f(include)k
+Fm(png)p Ft(,)e Fm(x)o(cf)f Ft(and)165 1582 y Fm(jpg)p
+Ft(.)32 b(Opaque)20 b(formats)e(include)j(proprietary)e(formats)f(that)
+g(can)h(b)q(e)h(read)f(and)g(edited)h(only)165 1637 y(b)o(y)g
+(proprietary)f(w)o(ord)g(pro)q(cessors,)h Fm(sgml)g Ft(or)f
+Fm(xml)h Ft(for)f(whic)o(h)i(the)f Fm(dtd)g Ft(and/or)f(pro)q(cessing)
+165 1692 y(to)q(ols)c(are)h(not)f(generally)h(a)o(v)m(ailable,)h(and)f
+(the)f(mac)o(hine-generated)i Fm(html)p Ft(,)e(P)o(ostScript)g(or)g
+Fm(pdf)165 1746 y Ft(pro)q(duced)h(b)o(y)f(some)g(w)o(ord)g(pro)q
+(cessors)g(for)f(output)h(purp)q(oses)h(only)l(.)165
+1817 y(The)h(\\Title)h(P)o(age")e(means,)i(for)e(a)h(prin)o(ted)h(b)q
+(o)q(ok,)f(the)g(title)h(page)f(itself,)i(plus)f(suc)o(h)f(follo)o
+(wing)165 1872 y(pages)d(as)f(are)h(needed)h(to)e(hold,)i(legibly)l(,)g
+(the)f(material)g(this)h(License)g(requires)g(to)e(app)q(ear)h(in)h
+(the)165 1926 y(title)f(page.)19 b(F)l(or)13 b(w)o(orks)f(in)i(formats)
+e(whic)o(h)i(do)f(not)g(ha)o(v)o(e)g(an)o(y)g(title)h(page)f(as)g(suc)o
+(h,)h(\\Title)g(P)o(age")165 1981 y(means)h(the)h(text)e(near)i(the)f
+(most)g(prominen)o(t)g(app)q(earance)h(of)f(the)g(w)o(ork's)f(title,)i
+(preceding)h(the)165 2036 y(b)q(eginning)g(of)e(the)g(b)q(o)q(dy)h(of)f
+(the)g(text.)165 2106 y(A)g(section)g(\\En)o(titled)h(XYZ")e(means)h(a)
+g(named)g(subunit)h(of)e(the)h(Do)q(cumen)o(t)g(whose)g(title)g(either)
+165 2161 y(is)f(precisely)i(XYZ)e(or)f(con)o(tains)h(XYZ)g(in)h(paren)o
+(theses)f(follo)o(wing)g(text)g(that)f(translates)g(XYZ)h(in)165
+2216 y(another)e(language.)19 b(\(Here)13 b(XYZ)f(stands)g(for)g(a)g
+(sp)q(eci\014c)j(section)e(name)f(men)o(tioned)h(b)q(elo)o(w,)h(suc)o
+(h)165 2271 y(as)g(\\Ac)o(kno)o(wledgemen)o(ts",)f(\\Dedications",)i
+(\\Endorsemen)o(ts",)e(or)g(\\History".\))19 b(T)l(o)13
+b(\\Preserv)o(e)165 2326 y(the)k(Title")g(of)g(suc)o(h)g(a)f(section)i
+(when)f(y)o(ou)f(mo)q(dify)i(the)f(Do)q(cumen)o(t)f(means)h(that)f(it)h
+(remains)g(a)165 2380 y(section)f(\\En)o(titled)g(XYZ")e(according)i
+(to)f(this)g(de\014nition.)165 2451 y(The)f(Do)q(cumen)o(t)g(ma)o(y)f
+(include)j(W)l(arran)o(t)o(y)c(Disclaimers)j(next)f(to)g(the)g(notice)g
+(whic)o(h)h(states)e(that)165 2506 y(this)k(License)i(applies)g(to)d
+(the)h(Do)q(cumen)o(t.)25 b(These)17 b(W)l(arran)o(t)o(y)e(Disclaimers)
+k(are)d(considered)j(to)165 2560 y(b)q(e)g(included)j(b)o(y)d
+(reference)g(in)h(this)f(License,)i(but)e(only)g(as)g(regards)f
+(disclaiming)j(w)o(arran)o(ties:)165 2615 y(an)o(y)d(other)g
+(implication)j(that)d(these)g(W)l(arran)o(t)o(y)f(Disclaimers)j(ma)o(y)
+d(ha)o(v)o(e)h(is)h(v)o(oid)g(and)g(has)f(no)165 2670
+y(e\013ect)d(on)g(the)g(meaning)h(of)f(this)h(License.)p
+eop
+%%Page: 57 61
+57 60 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(57)100 149 y(2.)29 b(VERBA)l(TIM)15 b(COPYING)165
+222 y(Y)l(ou)k(ma)o(y)g(cop)o(y)f(and)i(distribute)g(the)f(Do)q(cumen)o
+(t)g(in)h(an)o(y)f(medium,)h(either)g(commercially)g(or)165
+277 y(noncommercially)l(,)k(pro)o(vided)e(that)f(this)h(License,)i(the)
+d(cop)o(yrigh)o(t)g(notices,)i(and)f(the)f(license)165
+332 y(notice)e(sa)o(ying)e(this)i(License)g(applies)h(to)d(the)h(Do)q
+(cumen)o(t)g(are)f(repro)q(duced)i(in)g(all)g(copies,)g(and)165
+387 y(that)13 b(y)o(ou)g(add)g(no)g(other)g(conditions)i(whatso)q(ev)o
+(er)d(to)h(those)g(of)g(this)h(License.)21 b(Y)l(ou)13
+b(ma)o(y)g(not)g(use)165 442 y(tec)o(hnical)18 b(measures)e(to)g
+(obstruct)g(or)g(con)o(trol)g(the)g(reading)h(or)f(further)h(cop)o
+(ying)g(of)f(the)g(copies)165 496 y(y)o(ou)c(mak)o(e)g(or)f
+(distribute.)21 b(Ho)o(w)o(ev)o(er,)11 b(y)o(ou)h(ma)o(y)g(accept)g
+(comp)q(ensation)h(in)g(exc)o(hange)g(for)e(copies.)165
+551 y(If)16 b(y)o(ou)g(distribute)h(a)f(large)g(enough)h(n)o(um)o(b)q
+(er)f(of)g(copies)h(y)o(ou)f(m)o(ust)f(also)h(follo)o(w)h(the)f
+(conditions)165 606 y(in)g(section)g(3.)165 679 y(Y)l(ou)11
+b(ma)o(y)e(also)i(lend)g(copies,)h(under)f(the)g(same)f(conditions)h
+(stated)f(ab)q(o)o(v)o(e,)h(and)f(y)o(ou)g(ma)o(y)g(publicly)165
+734 y(displa)o(y)16 b(copies.)100 807 y(3.)29 b(COPYING)16
+b(IN)f(QUANTITY)165 880 y(If)e(y)o(ou)f(publish)j(prin)o(ted)e(copies)h
+(\(or)d(copies)j(in)f(media)h(that)d(commonly)i(ha)o(v)o(e)f(prin)o
+(ted)i(co)o(v)o(ers\))d(of)165 935 y(the)16 b(Do)q(cumen)o(t,)g(n)o(um)
+o(b)q(ering)g(more)g(than)g(100,)e(and)i(the)g(Do)q(cumen)o(t's)g
+(license)i(notice)e(requires)165 990 y(Co)o(v)o(er)g(T)l(exts,)h(y)o
+(ou)g(m)o(ust)g(enclose)h(the)f(copies)h(in)g(co)o(v)o(ers)f(that)f
+(carry)l(,)h(clearly)h(and)g(legibly)l(,)h(all)165 1044
+y(these)h(Co)o(v)o(er)e(T)l(exts:)29 b(F)l(ron)o(t-Co)o(v)o(er)18
+b(T)l(exts)h(on)g(the)h(fron)o(t)f(co)o(v)o(er,)g(and)h(Bac)o(k-Co)o(v)
+o(er)f(T)l(exts)g(on)165 1099 y(the)c(bac)o(k)f(co)o(v)o(er.)19
+b(Both)14 b(co)o(v)o(ers)g(m)o(ust)g(also)h(clearly)h(and)e(legibly)j
+(iden)o(tify)f(y)o(ou)e(as)g(the)h(publisher)165 1154
+y(of)i(these)g(copies.)27 b(The)17 b(fron)o(t)f(co)o(v)o(er)h(m)o(ust)f
+(presen)o(t)i(the)f(full)h(title)g(with)g(all)g(w)o(ords)e(of)h(the)g
+(title)165 1209 y(equally)g(prominen)o(t)f(and)f(visible.)23
+b(Y)l(ou)16 b(ma)o(y)e(add)i(other)f(material)g(on)h(the)f(co)o(v)o
+(ers)g(in)h(addition.)165 1264 y(Cop)o(ying)i(with)h(c)o(hanges)f
+(limited)i(to)d(the)h(co)o(v)o(ers,)g(as)g(long)g(as)g(they)g(preserv)o
+(e)g(the)g(title)h(of)f(the)165 1318 y(Do)q(cumen)o(t)g(and)h(satisfy)f
+(these)h(conditions,)h(can)f(b)q(e)g(treated)f(as)h(v)o(erbatim)f(cop)o
+(ying)h(in)g(other)165 1373 y(resp)q(ects.)165 1446 y(If)e(the)f
+(required)i(texts)d(for)h(either)h(co)o(v)o(er)f(are)g(to)q(o)g(v)o
+(oluminous)h(to)f(\014t)g(legibly)l(,)i(y)o(ou)e(should)i(put)165
+1501 y(the)f(\014rst)f(ones)g(listed)i(\(as)d(man)o(y)h(as)g(\014t)h
+(reasonably\))f(on)g(the)h(actual)g(co)o(v)o(er,)e(and)i(con)o(tin)o
+(ue)g(the)165 1556 y(rest)e(on)o(to)f(adjacen)o(t)h(pages.)165
+1629 y(If)f(y)o(ou)f(publish)j(or)d(distribute)h(Opaque)h(copies)f(of)f
+(the)h(Do)q(cumen)o(t)f(n)o(um)o(b)q(ering)i(more)e(than)g(100,)165
+1684 y(y)o(ou)h(m)o(ust)f(either)i(include)h(a)e(mac)o(hine-readable)i
+(T)l(ransparen)o(t)d(cop)o(y)h(along)g(with)g(eac)o(h)g(Opaque)165
+1738 y(cop)o(y)l(,)k(or)f(state)g(in)h(or)f(with)h(eac)o(h)f(Opaque)i
+(cop)o(y)e(a)g(computer-net)o(w)o(ork)g(lo)q(cation)h(from)f(whic)o(h)
+165 1793 y(the)12 b(general)h(net)o(w)o(ork-using)f(public)i(has)e
+(access)g(to)g(do)o(wnload)g(using)h(public-standard)h(net)o(w)o(ork)
+165 1848 y(proto)q(cols)19 b(a)g(complete)i(T)l(ransparen)o(t)d(cop)o
+(y)i(of)f(the)g(Do)q(cumen)o(t,)h(free)g(of)f(added)h(material.)33
+b(If)165 1903 y(y)o(ou)19 b(use)h(the)f(latter)g(option,)i(y)o(ou)e(m)o
+(ust)g(tak)o(e)f(reasonably)i(pruden)o(t)g(steps,)g(when)g(y)o(ou)f(b)q
+(egin)165 1958 y(distribution)i(of)d(Opaque)i(copies)g(in)g(quan)o(tit)
+o(y)l(,)g(to)e(ensure)i(that)e(this)i(T)l(ransparen)o(t)e(cop)o(y)h
+(will)165 2012 y(remain)d(th)o(us)e(accessible)j(at)e(the)g(stated)g
+(lo)q(cation)g(un)o(til)i(at)d(least)h(one)h(y)o(ear)e(after)g(the)i
+(last)f(time)165 2067 y(y)o(ou)j(distribute)i(an)e(Opaque)h(cop)o(y)f
+(\(directly)i(or)e(through)g(y)o(our)g(agen)o(ts)f(or)h(retailers\))h
+(of)f(that)165 2122 y(edition)f(to)d(the)h(public.)165
+2195 y(It)i(is)h(requested,)g(but)f(not)g(required,)i(that)d(y)o(ou)h
+(con)o(tact)g(the)g(authors)g(of)f(the)i(Do)q(cumen)o(t)f(w)o(ell)165
+2250 y(b)q(efore)e(redistributing)h(an)o(y)e(large)g(n)o(um)o(b)q(er)h
+(of)e(copies,)i(to)f(giv)o(e)h(them)f(a)g(c)o(hance)h(to)e(pro)o(vide)i
+(y)o(ou)165 2305 y(with)h(an)f(up)q(dated)h(v)o(ersion)f(of)g(the)g(Do)
+q(cumen)o(t.)100 2378 y(4.)29 b(MODIFICA)l(TIONS)165
+2451 y(Y)l(ou)13 b(ma)o(y)f(cop)o(y)h(and)g(distribute)h(a)e(Mo)q
+(di\014ed)i(V)l(ersion)g(of)e(the)h(Do)q(cumen)o(t)f(under)i(the)f
+(conditions)165 2506 y(of)d(sections)h(2)f(and)h(3)f(ab)q(o)o(v)o(e,)h
+(pro)o(vided)g(that)f(y)o(ou)g(release)h(the)g(Mo)q(di\014ed)h(V)l
+(ersion)f(under)g(precisely)165 2560 y(this)k(License,)h(with)f(the)f
+(Mo)q(di\014ed)i(V)l(ersion)f(\014lling)i(the)e(role)f(of)h(the)f(Do)q
+(cumen)o(t,)g(th)o(us)h(licensing)165 2615 y(distribution)k(and)e(mo)q
+(di\014cation)h(of)f(the)g(Mo)q(di\014ed)h(V)l(ersion)g(to)e(who)q(ev)o
+(er)h(p)q(ossesses)h(a)e(cop)o(y)h(of)165 2670 y(it.)j(In)c(addition,)g
+(y)o(ou)f(m)o(ust)f(do)h(these)h(things)g(in)g(the)f(Mo)q(di\014ed)h(V)
+l(ersion:)p eop
+%%Page: 58 62
+58 61 bop 75 -58 a Ft(58)1299 b(GNU)15 b(Readline)h(Library)178
+149 y(A.)30 b(Use)17 b(in)g(the)f(Title)h(P)o(age)f(\(and)g(on)h(the)f
+(co)o(v)o(ers,)g(if)g(an)o(y\))g(a)g(title)h(distinct)h(from)d(that)h
+(of)g(the)255 204 y(Do)q(cumen)o(t,)h(and)g(from)f(those)h(of)f
+(previous)i(v)o(ersions)f(\(whic)o(h)g(should,)h(if)g(there)f(w)o(ere)f
+(an)o(y)l(,)255 259 y(b)q(e)g(listed)h(in)g(the)f(History)f(section)h
+(of)f(the)h(Do)q(cumen)o(t\).)21 b(Y)l(ou)16 b(ma)o(y)f(use)h(the)g
+(same)f(title)h(as)255 314 y(a)f(previous)h(v)o(ersion)f(if)h(the)f
+(original)h(publisher)i(of)d(that)f(v)o(ersion)h(giv)o(es)h(p)q
+(ermission.)180 379 y(B.)30 b(List)16 b(on)f(the)g(Title)i(P)o(age,)d
+(as)h(authors,)f(one)h(or)g(more)g(p)q(ersons)g(or)g(en)o(tities)h
+(resp)q(onsible)i(for)255 434 y(authorship)c(of)e(the)h(mo)q
+(di\014cations)h(in)g(the)f(Mo)q(di\014ed)i(V)l(ersion,)f(together)e
+(with)h(at)g(least)g(\014v)o(e)255 488 y(of)f(the)g(principal)i
+(authors)d(of)h(the)g(Do)q(cumen)o(t)g(\(all)g(of)g(its)g(principal)i
+(authors,)e(if)g(it)g(has)g(few)o(er)255 543 y(than)j(\014v)o(e\),)g
+(unless)h(they)f(release)h(y)o(ou)f(from)f(this)i(requiremen)o(t.)180
+608 y(C.)29 b(State)15 b(on)g(the)h(Title)g(page)f(the)h(name)f(of)g
+(the)g(publisher)j(of)d(the)g(Mo)q(di\014ed)i(V)l(ersion,)f(as)f(the)
+255 663 y(publisher.)178 728 y(D.)29 b(Preserv)o(e)15
+b(all)h(the)f(cop)o(yrigh)o(t)g(notices)h(of)f(the)g(Do)q(cumen)o(t.)
+181 793 y(E.)30 b(Add)16 b(an)g(appropriate)g(cop)o(yrigh)o(t)f(notice)
+h(for)f(y)o(our)g(mo)q(di\014cations)i(adjacen)o(t)f(to)f(the)g(other)
+255 848 y(cop)o(yrigh)o(t)g(notices.)183 913 y(F.)29
+b(Include,)16 b(immediately)g(after)d(the)h(cop)o(yrigh)o(t)f(notices,)
+i(a)e(license)j(notice)f(giving)g(the)f(public)255 968
+y(p)q(ermission)g(to)d(use)i(the)f(Mo)q(di\014ed)i(V)l(ersion)f(under)g
+(the)f(terms)g(of)f(this)i(License,)h(in)f(the)g(form)255
+1023 y(sho)o(wn)i(in)h(the)f(Addendum)i(b)q(elo)o(w.)177
+1088 y(G.)29 b(Preserv)o(e)11 b(in)h(that)f(license)i(notice)g(the)e
+(full)i(lists)f(of)f(In)o(v)m(arian)o(t)h(Sections)g(and)f(required)i
+(Co)o(v)o(er)255 1143 y(T)l(exts)i(giv)o(en)h(in)g(the)f(Do)q(cumen)o
+(t's)g(license)i(notice.)178 1208 y(H.)30 b(Include)17
+b(an)e(unaltered)i(cop)o(y)e(of)f(this)i(License.)196
+1273 y(I.)30 b(Preserv)o(e)16 b(the)g(section)h(En)o(titled)g
+(\\History",)e(Preserv)o(e)g(its)i(Title,)f(and)h(add)f(to)f(it)i(an)f
+(item)255 1328 y(stating)e(at)f(least)h(the)g(title,)h(y)o(ear,)e(new)i
+(authors,)e(and)h(publisher)i(of)e(the)g(Mo)q(di\014ed)h(V)l(ersion)255
+1382 y(as)g(giv)o(en)h(on)g(the)g(Title)g(P)o(age.)21
+b(If)16 b(there)g(is)g(no)g(section)g(En)o(titled)g(\\History")f(in)i
+(the)f(Do)q(cu-)255 1437 y(men)o(t,)h(create)g(one)h(stating)f(the)g
+(title,)i(y)o(ear,)e(authors,)g(and)g(publisher)j(of)d(the)g(Do)q
+(cumen)o(t)255 1492 y(as)h(giv)o(en)g(on)g(its)g(Title)h(P)o(age,)f
+(then)h(add)f(an)g(item)g(describing)i(the)e(Mo)q(di\014ed)h(V)l
+(ersion)g(as)255 1547 y(stated)c(in)h(the)f(previous)h(sen)o(tence.)189
+1612 y(J.)30 b(Preserv)o(e)16 b(the)g(net)o(w)o(ork)f(lo)q(cation,)i
+(if)g(an)o(y)l(,)f(giv)o(en)h(in)g(the)f(Do)q(cumen)o(t)g(for)g(public)
+i(access)f(to)255 1667 y(a)e(T)l(ransparen)o(t)g(cop)o(y)h(of)f(the)g
+(Do)q(cumen)o(t,)h(and)f(lik)o(ewise)j(the)d(net)o(w)o(ork)g(lo)q
+(cations)h(giv)o(en)g(in)255 1721 y(the)g(Do)q(cumen)o(t)g(for)f
+(previous)h(v)o(ersions)g(it)g(w)o(as)f(based)i(on.)k(These)c(ma)o(y)e
+(b)q(e)h(placed)h(in)g(the)255 1776 y(\\History")12 b(section.)19
+b(Y)l(ou)13 b(ma)o(y)f(omit)g(a)g(net)o(w)o(ork)g(lo)q(cation)h(for)f
+(a)g(w)o(ork)g(that)g(w)o(as)f(published)255 1831 y(at)17
+b(least)h(four)g(y)o(ears)f(b)q(efore)h(the)g(Do)q(cumen)o(t)g(itself,)
+h(or)e(if)i(the)e(original)i(publisher)h(of)e(the)255
+1886 y(v)o(ersion)d(it)h(refers)f(to)f(giv)o(es)i(p)q(ermission.)177
+1951 y(K.)30 b(F)l(or)11 b(an)o(y)h(section)g(En)o(titled)h(\\Ac)o(kno)
+o(wledgemen)o(ts")f(or)f(\\Dedications",)h(Preserv)o(e)g(the)g(Title)
+255 2006 y(of)h(the)g(section,)h(and)f(preserv)o(e)h(in)g(the)f
+(section)h(all)g(the)g(substance)f(and)h(tone)f(of)g(eac)o(h)g(of)g
+(the)255 2060 y(con)o(tributor)i(ac)o(kno)o(wledgemen)o(ts)g(and/or)g
+(dedications)h(giv)o(en)g(therein.)184 2125 y(L.)30 b(Preserv)o(e)17
+b(all)i(the)f(In)o(v)m(arian)o(t)g(Sections)g(of)g(the)f(Do)q(cumen)o
+(t,)h(unaltered)h(in)f(their)h(text)e(and)255 2180 y(in)i(their)f
+(titles.)29 b(Section)19 b(n)o(um)o(b)q(ers)f(or)g(the)g(equiv)m(alen)o
+(t)h(are)f(not)g(considered)h(part)e(of)h(the)255 2235
+y(section)e(titles.)171 2300 y(M.)29 b(Delete)16 b(an)o(y)f(section)h
+(En)o(titled)g(\\Endorsemen)o(ts".)k(Suc)o(h)c(a)f(section)h(ma)o(y)e
+(not)h(b)q(e)h(included)255 2355 y(in)g(the)f(Mo)q(di\014ed)i(V)l
+(ersion.)178 2420 y(N.)30 b(Do)14 b(not)f(retitle)i(an)o(y)f(existing)h
+(section)g(to)f(b)q(e)g(En)o(titled)i(\\Endorsemen)o(ts")d(or)h(to)f
+(con\015ict)i(in)255 2475 y(title)h(with)f(an)o(y)g(In)o(v)m(arian)o(t)
+h(Section.)177 2540 y(O.)30 b(Preserv)o(e)15 b(an)o(y)g(W)l(arran)o(t)o
+(y)e(Disclaimers.)165 2615 y(If)k(the)g(Mo)q(di\014ed)h(V)l(ersion)f
+(includes)i(new)e(fron)o(t-matter)e(sections)i(or)f(app)q(endices)j
+(that)d(qualify)165 2670 y(as)e(Secondary)g(Sections)h(and)f(con)o
+(tain)g(no)g(material)g(copied)h(from)e(the)h(Do)q(cumen)o(t,)g(y)o(ou)
+f(ma)o(y)h(at)p eop
+%%Page: 59 63
+59 62 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(59)165 149 y(y)o(our)16 b(option)g(designate)h(some)f(or)f
+(all)i(of)f(these)h(sections)f(as)g(in)o(v)m(arian)o(t.)24
+b(T)l(o)15 b(do)i(this,)f(add)g(their)165 204 y(titles)i(to)f(the)h
+(list)h(of)e(In)o(v)m(arian)o(t)h(Sections)h(in)f(the)g(Mo)q(di\014ed)h
+(V)l(ersion's)f(license)i(notice.)28 b(These)165 259
+y(titles)16 b(m)o(ust)f(b)q(e)g(distinct)i(from)d(an)o(y)h(other)g
+(section)h(titles.)165 325 y(Y)l(ou)21 b(ma)o(y)g(add)g(a)g(section)h
+(En)o(titled)g(\\Endorsemen)o(ts",)f(pro)o(vided)h(it)g(con)o(tains)f
+(nothing)h(but)165 380 y(endorsemen)o(ts)15 b(of)f(y)o(our)h(Mo)q
+(di\014ed)h(V)l(ersion)f(b)o(y)g(v)m(arious)g(parties|for)f(example,)i
+(statemen)o(ts)d(of)165 434 y(p)q(eer)h(review)g(or)g(that)e(the)i
+(text)f(has)h(b)q(een)g(appro)o(v)o(ed)g(b)o(y)f(an)h(organization)f
+(as)h(the)f(authoritativ)o(e)165 489 y(de\014nition)k(of)e(a)g
+(standard.)165 555 y(Y)l(ou)f(ma)o(y)g(add)g(a)g(passage)g(of)f(up)i
+(to)e(\014v)o(e)i(w)o(ords)e(as)h(a)g(F)l(ron)o(t-Co)o(v)o(er)e(T)l
+(ext,)i(and)g(a)g(passage)g(of)f(up)165 610 y(to)g(25)g(w)o(ords)g(as)g
+(a)g(Bac)o(k-Co)o(v)o(er)g(T)l(ext,)g(to)g(the)g(end)i(of)e(the)g(list)
+i(of)e(Co)o(v)o(er)f(T)l(exts)i(in)g(the)g(Mo)q(di\014ed)165
+665 y(V)l(ersion.)29 b(Only)19 b(one)f(passage)f(of)h(F)l(ron)o(t-Co)o
+(v)o(er)e(T)l(ext)i(and)g(one)g(of)f(Bac)o(k-Co)o(v)o(er)g(T)l(ext)h
+(ma)o(y)f(b)q(e)165 719 y(added)d(b)o(y)g(\(or)f(through)g(arrangemen)o
+(ts)g(made)h(b)o(y\))f(an)o(y)h(one)g(en)o(tit)o(y)l(.)19
+b(If)14 b(the)g(Do)q(cumen)o(t)g(already)165 774 y(includes)19
+b(a)e(co)o(v)o(er)f(text)h(for)f(the)h(same)g(co)o(v)o(er,)f
+(previously)i(added)g(b)o(y)f(y)o(ou)g(or)f(b)o(y)h(arrangemen)o(t)165
+829 y(made)h(b)o(y)f(the)h(same)f(en)o(tit)o(y)h(y)o(ou)f(are)g(acting)
+h(on)f(b)q(ehalf)i(of,)f(y)o(ou)f(ma)o(y)g(not)g(add)h(another;)g(but)
+165 884 y(y)o(ou)f(ma)o(y)f(replace)i(the)f(old)h(one,)f(on)g(explicit)
+i(p)q(ermission)f(from)f(the)g(previous)h(publisher)h(that)165
+938 y(added)d(the)f(old)h(one.)165 1004 y(The)d(author\(s\))e(and)i
+(publisher\(s\))h(of)f(the)g(Do)q(cumen)o(t)f(do)h(not)f(b)o(y)h(this)g
+(License)i(giv)o(e)e(p)q(ermission)165 1059 y(to)i(use)g(their)h(names)
+f(for)f(publicit)o(y)k(for)c(or)h(to)f(assert)h(or)f(imply)j
+(endorsemen)o(t)e(of)g(an)o(y)g(Mo)q(di\014ed)165 1114
+y(V)l(ersion.)100 1180 y(5.)29 b(COMBINING)16 b(DOCUMENTS)165
+1245 y(Y)l(ou)k(ma)o(y)e(com)o(bine)i(the)g(Do)q(cumen)o(t)f(with)h
+(other)f(do)q(cumen)o(ts)g(released)i(under)f(this)g(License,)165
+1300 y(under)g(the)f(terms)g(de\014ned)h(in)g(section)g(4)e(ab)q(o)o(v)
+o(e)h(for)g(mo)q(di\014ed)h(v)o(ersions,)g(pro)o(vided)g(that)e(y)o(ou)
+165 1355 y(include)d(in)e(the)g(com)o(bination)h(all)f(of)f(the)h(In)o
+(v)m(arian)o(t)g(Sections)h(of)e(all)h(of)g(the)f(original)i(do)q
+(cumen)o(ts,)165 1410 y(unmo)q(di\014ed,)h(and)f(list)g(them)f(all)i
+(as)e(In)o(v)m(arian)o(t)g(Sections)i(of)e(y)o(our)f(com)o(bined)j(w)o
+(ork)d(in)i(its)g(license)165 1465 y(notice,)h(and)h(that)e(y)o(ou)h
+(preserv)o(e)g(all)i(their)e(W)l(arran)o(t)o(y)f(Disclaimers.)165
+1530 y(The)h(com)o(bined)i(w)o(ork)d(need)i(only)f(con)o(tain)h(one)f
+(cop)o(y)g(of)g(this)g(License,)i(and)e(m)o(ultiple)i(iden)o(tical)165
+1585 y(In)o(v)m(arian)o(t)g(Sections)g(ma)o(y)e(b)q(e)i(replaced)h
+(with)e(a)g(single)i(cop)o(y)l(.)23 b(If)16 b(there)h(are)f(m)o
+(ultiple)i(In)o(v)m(arian)o(t)165 1640 y(Sections)c(with)g(the)f(same)g
+(name)h(but)f(di\013eren)o(t)h(con)o(ten)o(ts,)f(mak)o(e)g(the)g(title)
+h(of)f(eac)o(h)h(suc)o(h)f(section)165 1695 y(unique)19
+b(b)o(y)d(adding)i(at)f(the)g(end)g(of)g(it,)g(in)h(paren)o(theses,)f
+(the)g(name)g(of)g(the)g(original)h(author)e(or)165 1749
+y(publisher)f(of)d(that)g(section)h(if)g(kno)o(wn,)f(or)g(else)h(a)g
+(unique)h(n)o(um)o(b)q(er.)19 b(Mak)o(e)12 b(the)g(same)h(adjustmen)o
+(t)165 1804 y(to)f(the)g(section)h(titles)g(in)g(the)f(list)h(of)f(In)o
+(v)m(arian)o(t)g(Sections)h(in)g(the)g(license)h(notice)f(of)f(the)g
+(com)o(bined)165 1859 y(w)o(ork.)165 1925 y(In)21 b(the)g(com)o
+(bination,)h(y)o(ou)f(m)o(ust)f(com)o(bine)h(an)o(y)f(sections)i(En)o
+(titled)f(\\History")f(in)h(the)g(v)m(ari-)165 1980 y(ous)16
+b(original)h(do)q(cumen)o(ts,)f(forming)g(one)h(section)f(En)o(titled)h
+(\\History";)f(lik)o(ewise)h(com)o(bine)g(an)o(y)165
+2034 y(sections)f(En)o(titled)h(\\Ac)o(kno)o(wledgemen)o(ts",)f(and)g
+(an)o(y)f(sections)i(En)o(titled)f(\\Dedications".)23
+b(Y)l(ou)165 2089 y(m)o(ust)15 b(delete)h(all)g(sections)g(En)o(titled)
+g(\\Endorsemen)o(ts.")100 2155 y(6.)29 b(COLLECTIONS)17
+b(OF)e(DOCUMENTS)165 2221 y(Y)l(ou)h(ma)o(y)f(mak)o(e)h(a)f(collection)
+j(consisting)f(of)e(the)h(Do)q(cumen)o(t)g(and)g(other)g(do)q(cumen)o
+(ts)g(released)165 2275 y(under)22 b(this)g(License,)i(and)d(replace)h
+(the)f(individual)k(copies)d(of)f(this)g(License)i(in)f(the)f(v)m
+(arious)165 2330 y(do)q(cumen)o(ts)h(with)f(a)g(single)i(cop)o(y)e
+(that)f(is)i(included)i(in)e(the)f(collection,)k(pro)o(vided)d(that)e
+(y)o(ou)165 2385 y(follo)o(w)f(the)f(rules)i(of)e(this)h(License)h(for)
+e(v)o(erbatim)g(cop)o(ying)h(of)f(eac)o(h)h(of)f(the)h(do)q(cumen)o(ts)
+g(in)g(all)165 2440 y(other)c(resp)q(ects.)165 2506 y(Y)l(ou)h(ma)o(y)f
+(extract)g(a)g(single)i(do)q(cumen)o(t)f(from)f(suc)o(h)h(a)g
+(collection,)h(and)f(distribute)h(it)f(individu-)165
+2560 y(ally)i(under)h(this)f(License,)h(pro)o(vided)f(y)o(ou)f(insert)h
+(a)g(cop)o(y)f(of)g(this)h(License)h(in)o(to)f(the)f(extracted)165
+2615 y(do)q(cumen)o(t,)g(and)f(follo)o(w)g(this)h(License)h(in)f(all)h
+(other)d(resp)q(ects)i(regarding)g(v)o(erbatim)f(cop)o(ying)g(of)165
+2670 y(that)e(do)q(cumen)o(t.)p eop
+%%Page: 60 64
+60 63 bop 75 -58 a Ft(60)1299 b(GNU)15 b(Readline)h(Library)100
+149 y(7.)29 b(A)o(GGREGA)l(TION)14 b(WITH)i(INDEPENDENT)e(W)o(ORKS)165
+214 y(A)g(compilation)h(of)f(the)g(Do)q(cumen)o(t)g(or)f(its)i(deriv)m
+(ativ)o(es)g(with)f(other)g(separate)f(and)i(indep)q(enden)o(t)165
+269 y(do)q(cumen)o(ts)i(or)f(w)o(orks,)g(in)h(or)f(on)h(a)f(v)o(olume)h
+(of)f(a)h(storage)e(or)h(distribution)j(medium,)e(is)g(called)165
+324 y(an)e(\\aggregate")e(if)i(the)h(cop)o(yrigh)o(t)e(resulting)i
+(from)f(the)g(compilation)h(is)g(not)e(used)i(to)e(limit)j(the)165
+379 y(legal)d(righ)o(ts)f(of)g(the)g(compilation's)i(users)e(b)q(ey)o
+(ond)h(what)f(the)g(individual)j(w)o(orks)d(p)q(ermit.)20
+b(When)165 433 y(the)14 b(Do)q(cumen)o(t)g(is)g(included)i(an)e
+(aggregate,)e(this)j(License)g(do)q(es)f(not)g(apply)g(to)g(the)g
+(other)f(w)o(orks)165 488 y(in)j(the)f(aggregate)f(whic)o(h)i(are)f
+(not)g(themselv)o(es)h(deriv)m(ativ)o(e)g(w)o(orks)e(of)h(the)g(Do)q
+(cumen)o(t.)165 553 y(If)d(the)f(Co)o(v)o(er)f(T)l(ext)i(requiremen)o
+(t)g(of)f(section)h(3)f(is)h(applicable)h(to)e(these)h(copies)g(of)f
+(the)g(Do)q(cumen)o(t,)165 608 y(then)h(if)f(the)h(Do)q(cumen)o(t)f(is)
+g(less)h(than)f(one)h(half)f(of)g(the)g(en)o(tire)h(aggregate,)e(the)h
+(Do)q(cumen)o(t's)g(Co)o(v)o(er)165 663 y(T)l(exts)i(ma)o(y)g(b)q(e)h
+(placed)g(on)f(co)o(v)o(ers)g(that)f(brac)o(k)o(et)h(the)g(Do)q(cumen)o
+(t)g(within)i(the)e(aggregate,)f(or)h(the)165 717 y(electronic)19
+b(equiv)m(alen)o(t)g(of)e(co)o(v)o(ers)g(if)h(the)g(Do)q(cumen)o(t)f
+(is)h(in)g(electronic)h(form.)27 b(Otherwise)18 b(they)165
+772 y(m)o(ust)d(app)q(ear)g(on)g(prin)o(ted)h(co)o(v)o(ers)f(that)f
+(brac)o(k)o(et)h(the)g(whole)h(aggregate.)100 837 y(8.)29
+b(TRANSLA)l(TION)165 902 y(T)l(ranslation)20 b(is)h(considered)g(a)f
+(kind)h(of)e(mo)q(di\014cation,)j(so)e(y)o(ou)g(ma)o(y)f(distribute)i
+(translations)165 956 y(of)h(the)g(Do)q(cumen)o(t)g(under)h(the)f
+(terms)g(of)g(section)g(4.)41 b(Replacing)23 b(In)o(v)m(arian)o(t)g
+(Sections)g(with)165 1011 y(translations)g(requires)g(sp)q(ecial)i(p)q
+(ermission)f(from)e(their)h(cop)o(yrigh)o(t)f(holders,)j(but)e(y)o(ou)g
+(ma)o(y)165 1066 y(include)15 b(translations)d(of)g(some)g(or)f(all)i
+(In)o(v)m(arian)o(t)g(Sections)g(in)g(addition)h(to)d(the)h(original)i
+(v)o(ersions)165 1121 y(of)h(these)h(In)o(v)m(arian)o(t)g(Sections.)23
+b(Y)l(ou)15 b(ma)o(y)g(include)k(a)c(translation)h(of)f(this)h
+(License,)h(and)f(all)h(the)165 1176 y(license)23 b(notices)e(in)g(the)
+g(Do)q(cumen)o(t,)g(and)g(an)o(y)f(W)l(arran)o(t)o(y)f(Disclaimers,)k
+(pro)o(vided)e(that)f(y)o(ou)165 1230 y(also)g(include)i(the)e
+(original)i(English)f(v)o(ersion)f(of)g(this)g(License)i(and)e(the)g
+(original)h(v)o(ersions)f(of)165 1285 y(those)d(notices)g(and)h
+(disclaimers.)27 b(In)18 b(case)f(of)f(a)h(disagreemen)o(t)g(b)q(et)o
+(w)o(een)h(the)f(translation)g(and)165 1340 y(the)h(original)g(v)o
+(ersion)g(of)f(this)h(License)i(or)d(a)g(notice)h(or)f(disclaimer,)j
+(the)e(original)g(v)o(ersion)g(will)165 1395 y(prev)m(ail.)165
+1460 y(If)d(a)f(section)g(in)i(the)e(Do)q(cumen)o(t)g(is)h(En)o(titled)
+g(\\Ac)o(kno)o(wledgemen)o(ts",)f(\\Dedications",)h(or)e(\\His-)165
+1514 y(tory",)f(the)h(requiremen)o(t)h(\(section)f(4\))g(to)f(Preserv)o
+(e)h(its)h(Title)g(\(section)f(1\))g(will)i(t)o(ypically)f(require)165
+1569 y(c)o(hanging)i(the)f(actual)g(title.)100 1634 y(9.)29
+b(TERMINA)l(TION)165 1699 y(Y)l(ou)15 b(ma)o(y)f(not)h(cop)o(y)l(,)f
+(mo)q(dify)l(,)i(sublicense,)h(or)d(distribute)i(the)f(Do)q(cumen)o(t)g
+(except)h(as)e(expressly)165 1753 y(pro)o(vided)22 b(for)e(under)i
+(this)f(License.)39 b(An)o(y)21 b(other)f(attempt)g(to)g(cop)o(y)l(,)i
+(mo)q(dify)l(,)h(sublicense)g(or)165 1808 y(distribute)d(the)e(Do)q
+(cumen)o(t)g(is)h(v)o(oid,)g(and)f(will)i(automatically)f(terminate)f
+(y)o(our)g(righ)o(ts)g(under)165 1863 y(this)c(License.)22
+b(Ho)o(w)o(ev)o(er,)12 b(parties)i(who)g(ha)o(v)o(e)g(receiv)o(ed)h
+(copies,)f(or)g(righ)o(ts,)f(from)g(y)o(ou)h(under)h(this)165
+1918 y(License)20 b(will)g(not)e(ha)o(v)o(e)g(their)h(licenses)h
+(terminated)f(so)f(long)g(as)g(suc)o(h)h(parties)g(remain)f(in)i(full)
+165 1973 y(compliance.)77 2037 y(10.)29 b(FUTURE)14 b(REVISIONS)j(OF)e
+(THIS)h(LICENSE)165 2102 y(The)21 b(F)l(ree)g(Soft)o(w)o(are)e(F)l
+(oundation)i(ma)o(y)f(publish)j(new,)f(revised)g(v)o(ersions)f(of)f
+(the)h(GNU)g(F)l(ree)165 2157 y(Do)q(cumen)o(tation)16
+b(License)i(from)d(time)h(to)g(time.)22 b(Suc)o(h)17
+b(new)f(v)o(ersions)h(will)g(b)q(e)g(similar)g(in)g(spirit)165
+2212 y(to)g(the)g(presen)o(t)g(v)o(ersion,)h(but)f(ma)o(y)f(di\013er)i
+(in)g(detail)g(to)f(address)g(new)g(problems)h(or)f(concerns.)165
+2266 y(See)f Fs(http://www.gnu.org/copyle)o(ft/)p Ft(.)165
+2331 y(Eac)o(h)f(v)o(ersion)f(of)h(the)g(License)h(is)f(giv)o(en)g(a)g
+(distinguishing)i(v)o(ersion)e(n)o(um)o(b)q(er.)20 b(If)15
+b(the)g(Do)q(cumen)o(t)165 2386 y(sp)q(eci\014es)24 b(that)e(a)h
+(particular)g(n)o(um)o(b)q(ered)h(v)o(ersion)e(of)h(this)g(License)h
+(\\or)e(an)o(y)g(later)h(v)o(ersion")165 2441 y(applies)18
+b(to)d(it,)i(y)o(ou)f(ha)o(v)o(e)g(the)g(option)g(of)g(follo)o(wing)h
+(the)f(terms)g(and)g(conditions)i(either)f(of)f(that)165
+2496 y(sp)q(eci\014ed)21 b(v)o(ersion)e(or)g(of)f(an)o(y)h(later)g(v)o
+(ersion)g(that)f(has)h(b)q(een)h(published)i(\(not)c(as)g(a)h(draft\))f
+(b)o(y)165 2550 y(the)e(F)l(ree)h(Soft)o(w)o(are)e(F)l(oundation.)23
+b(If)17 b(the)g(Do)q(cumen)o(t)f(do)q(es)g(not)g(sp)q(ecify)i(a)e(v)o
+(ersion)h(n)o(um)o(b)q(er)f(of)165 2605 y(this)i(License,)h(y)o(ou)e
+(ma)o(y)f(c)o(ho)q(ose)i(an)o(y)e(v)o(ersion)i(ev)o(er)f(published)j
+(\(not)c(as)h(a)g(draft\))f(b)o(y)i(the)f(F)l(ree)165
+2660 y(Soft)o(w)o(are)d(F)l(oundation.)p eop
+%%Page: 61 65
+61 64 bop 75 -58 a Ft(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(61)75 149 y Fh(A.1.1)30 b(ADDENDUM:)22 b(Ho)n(w)f(to)f(use)
+h(this)f(License)h(for)f(y)n(our)h(do)r(cumen)n(ts)137
+271 y Ft(T)l(o)14 b(use)g(this)g(License)h(in)g(a)e(do)q(cumen)o(t)h(y)
+o(ou)f(ha)o(v)o(e)h(written,)f(include)j(a)d(cop)o(y)h(of)f(the)h
+(License)h(in)g(the)75 326 y(do)q(cumen)o(t)h(and)f(put)g(the)h(follo)o
+(wing)g(cop)o(yrigh)o(t)e(and)i(license)h(notices)f(just)f(after)f(the)
+h(title)h(page:)234 382 y Fd(Copyright)g(\(C\))38 b Fc(year)k(your)19
+b(name)p Fd(.)234 426 y(Permission)d(is)j(granted)e(to)i(copy,)e
+(distribute)f(and/or)h(modify)h(this)g(document)234 469
+y(under)g(the)g(terms)g(of)h(the)f(GNU)h(Free)f(Documenta)o(tio)o(n)e
+(License,)h(Version)g(1.2)234 513 y(or)i(any)g(later)e(version)g
+(published)f(by)j(the)g(Free)f(Software)e(Foundation)o(;)234
+557 y(with)i(no)h(Invariant)d(Sections,)g(no)j(Front-Cove)o(r)e(Texts,)
+g(and)h(no)h(Back-Cover)d(Texts.)234 600 y(A)j(copy)g(of)f(the)h
+(license)e(is)i(included)d(in)j(the)f(section)f(entitled)g(``GNU)234
+644 y(Free)h(Documentat)o(ion)e(License'')o(.)137 705
+y Ft(If)k(y)o(ou)g(ha)o(v)o(e)g(In)o(v)m(arian)o(t)g(Sections,)h(F)l
+(ron)o(t-Co)o(v)o(er)e(T)l(exts)g(and)h(Bac)o(k-Co)o(v)o(er)f(T)l
+(exts,)i(replace)g(the)75 760 y(\\with...T)l(exts.")d(line)f(with)f
+(this:)273 816 y Fd(with)j(the)f(Invariant)e(Sections)h(being)g
+Fc(list)h(their)g(titles)p Fd(,)f(with)273 860 y(the)i(Front-Cov)o(er)d
+(Texts)i(being)g Fc(list)p Fd(,)f(and)i(with)f(the)g(Back-Cover)e
+(Texts)273 903 y(being)i Fc(list)p Fd(.)137 964 y Ft(If)g(y)o(ou)f(ha)o
+(v)o(e)h(In)o(v)m(arian)o(t)g(Sections)g(without)g(Co)o(v)o(er)e(T)l
+(exts,)i(or)f(some)g(other)g(com)o(bination)i(of)e(the)75
+1019 y(three,)e(merge)g(those)g(t)o(w)o(o)f(alternativ)o(es)h(to)g
+(suit)g(the)g(situation.)137 1086 y(If)d(y)o(our)g(do)q(cumen)o(t)g
+(con)o(tains)g(non)o(trivial)h(examples)g(of)e(program)g(co)q(de,)i(w)o
+(e)f(recommend)g(releasing)75 1141 y(these)22 b(examples)g(in)g
+(parallel)i(under)e(y)o(our)f(c)o(hoice)h(of)f(free)h(soft)o(w)o(are)e
+(license,)k(suc)o(h)e(as)g(the)f(GNU)75 1196 y(General)16
+b(Public)h(License,)f(to)f(p)q(ermit)h(their)f(use)h(in)g(free)f(soft)o
+(w)o(are.)p eop
+%%Page: 62 66
+62 65 bop 75 -58 a Ft(62)1299 b(GNU)15 b(Readline)h(Library)p
+eop
+%%Page: 63 67
+63 66 bop 75 -58 a Ft(Concept)15 b(Index)1466 b(63)75
+149 y Fp(Concept)27 b(Index)75 319 y Fr(A)75 380 y Fb(application)q
+(-sp)q(eci)q(\014c)16 b(completion)f(functions)5 b Fa(.)j(.)e(.)g(.)g
+(.)g(.)h(.)17 b Fb(41)75 511 y Fr(C)75 571 y Fb(command)d(editing)e
+Fa(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)22 b
+Fb(1)75 703 y Fr(E)75 763 y Fb(editing)15 b(command)f(lines)f
+Fa(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)24 b Fb(1)75 895 y Fr(F)75
+955 y Fb(FDL,)13 b(GNU)f(F)m(ree)h(Do)q(cumen)o(tation)j(License)6
+b Fa(.)h(.)f(.)g(.)g(.)g(.)h(.)18 b Fb(55)75 1086 y Fr(I)75
+1147 y Fb(initiali)q(zati)q(on)e(\014le,)e(readline)t
+Fa(.)8 b(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)17 b Fb(4)75 1192 y(in)o(teraction,)e(readline)5
+b Fa(.)j(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Fb(1)1012
+319 y Fr(K)1012 380 y Fb(kill)d(ring)8 b Fa(.)f(.)g(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Fb(3)1012 424 y(killin)q(g)16 b(text)9 b Fa(.)d(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Fb(2)1012
+556 y Fr(N)1012 616 y Fb(notation,)15 b(readline)7 b
+Fa(.)h(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Fb(1)1012
+748 y Fr(R)1012 808 y Fb(readline,)15 b(function)8 b
+Fa(.)g(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 b Fb(21)1012
+939 y Fr(V)1012 1000 y Fb(v)n(ariables,)15 b(readline)t
+Fa(.)9 b(.)d(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)17 b
+Fb(5)1012 1131 y Fr(Y)1012 1192 y Fb(y)o(anking)e(text)t
+Fa(.)7 b(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)17
+b Fb(2)p eop
+%%Page: 64 68
+64 67 bop 75 -58 a Ft(64)1299 b(GNU)15 b(Readline)h(Library)p
+eop
+%%Page: 65 69
+65 68 bop 75 -58 a Ft(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187
+b(65)75 149 y Fp(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26
+b(Index)p 80 305 21 3 v 75 366 a Fd(_rl_digit_)o(p)7
+b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23
+b Fb(36)75 411 y Fd(_rl_digit_)o(va)o(lue)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)20 b Fb(36)75 456 y Fd(_rl_lowerc)o(as)o(e_p)6
+b Fa(.)t(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)20 b Fb(36)75
+501 y Fd(_rl_to_low)o(er)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)22 b Fb(36)75 546 y Fd(_rl_to_upp)o(er)6
+b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)22
+b Fb(36)75 591 y Fd(_rl_upperc)o(as)o(e_p)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)20 b Fb(36)75 724 y Fr(A)75 785 y
+Fd(abort)11 b(\(C-g\))5 b Fa(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)17 b Fb(18)75 830 y Fd(accept-lin)o(e)10
+b(\(Newline)f(or)j(Return\))6 b Fa(.)t(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)19 b Fb(13)75 963 y Fr(B)75 1024 y Fd(backward-c)o(ha)o(r)10
+b(\(C-b\))e Fa(.)t(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21 b Fb(13)75
+1069 y Fd(backward-d)o(el)o(ete)o(-c)o(har)9 b(\(Rubout\))e
+Fa(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)22
+b Fb(15)75 1114 y Fd(backward-k)o(il)o(l-l)o(in)o(e)10
+b(\(C-x)h(Rubout\))e Fa(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)24
+b Fb(16)75 1159 y Fd(backward-k)o(il)o(l-w)o(or)o(d)10
+b(\(M-)501 1157 y Fk(h)p 512 1131 73 2 v 512 1159 a Fj(DEL)p
+512 1167 V 583 1157 a Fk(i)598 1159 y Fd(\))g Fa(.)c(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Fb(16)75 1204 y
+Fd(backward-w)o(or)o(d)10 b(\(M-b\))e Fa(.)t(.)e(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21
+b Fb(13)75 1249 y Fd(beginning-)o(of)o(-hi)o(st)o(ory)9
+b(\(M-<\))h Fa(.)c(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)25 b Fb(14)75 1294 y Fd(beginning-)o(of)o(-li)o(ne)9
+b(\(C-a\))c Fa(.)t(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)18 b Fb(13)75 1339 y(b)q(ell-st)o(yle)7
+b Fa(.)i(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)20 b Fb(5)75 1471 y Fr(C)75 1532 y Fd(call-last-)o(kb)o(d-m)
+o(ac)o(ro)9 b(\(C-x)j(e\))5 b Fa(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)18 b Fb(18)75 1577 y Fd(capitalize)o(-w)o(ord)9
+b(\(M-c\))d Fa(.)f(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19 b Fb(15)75 1622 y Fd(character-)o(se)
+o(arc)o(h)10 b(\(C-]\))c Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)18 b Fb(18)75
+1667 y Fd(character-)o(se)o(arc)o(h-)o(bac)o(kwa)o(rd)9
+b(\(M-C-]\))e Fa(.)s(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)20
+b Fb(19)75 1712 y Fd(clear-scre)o(en)9 b(\(C-l\))g Fa(.)t(.)d(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)21 b Fb(13)75 1757 y(commen)o(t-b)q(egin)9
+b Fa(.)f(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)21
+b Fb(5)75 1802 y Fd(complete)10 b(\()265 1800 y Fk(h)p
+276 1774 74 2 v 276 1802 a Fj(T)m(AB)p 276 1810 V 348
+1800 a Fk(i)363 1802 y Fd(\))f Fa(.)e(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)
+22 b Fb(17)75 1847 y(completion-query-i)q(tems)t Fa(.)9
+b(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(5)75 1892 y(con)o(v)o(ert-meta)10
+b Fa(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)22
+b Fb(5)75 1937 y Fd(copy-backw)o(ar)o(d-w)o(or)o(d)10
+b(\(\))c Fa(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)19 b Fb(16)75 1982 y Fd(copy-forwa)o(rd)o
+(-wo)o(rd)9 b(\(\))e Fa(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20 b Fb(16)75
+2027 y Fd(copy-regio)o(n-)o(as-)o(ki)o(ll)9 b(\(\))d
+Fa(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)18 b Fb(16)75 2160 y Fr(D)75 2221 y Fd(delete-cha)o(r)10
+b(\(C-d\))d Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 b Fb(15)75
+2266 y Fd(delete-cha)o(r-)o(or-)o(li)o(st)9 b(\(\))d
+Fa(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)18 b Fb(17)75 2311 y Fd(delete-hor)o(iz)o(ont)o(al)o
+(-sp)o(ace)9 b(\(\))i Fa(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)25 b Fb(16)75 2356 y Fd(digit-argu)o(me)o(nt)9
+b(\()p Fc(M-0)p Fd(,)i Fc(M-1)p Fd(,)h(...)f Fc(M--)p
+Fd(\))c Fa(.)e(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)20 b Fb(17)75
+2401 y(disable-comple)q(tion)9 b Fa(.)g(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)21 b Fb(5)75 2446 y Fd(do-upperca)o(se)o(-ve)o(rs)o(ion)9
+b(\(M-a,)i(M-b,)g(M-)p Fc(x)p Fd(,)g(...)o(\))159 2490
+y Fa(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)20 b Fb(18)75 2535 y Fd(downcase-w)o(or)o(d)10
+b(\(M-l\))e Fa(.)t(.)e(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21 b Fb(15)75
+2580 y Fd(dump-funct)o(io)o(ns)9 b(\(\))g Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)22 b Fb(19)75 2625 y Fd(dump-macro)o(s)10 b(\(\))g
+Fa(.)c(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)24 b Fb(19)75
+2670 y Fd(dump-varia)o(bl)o(es)9 b(\(\))g Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)22 b Fb(19)1012 305 y Fr(E)1012 364 y Fb(editing-mo)q(de)12
+b Fa(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)22
+b Fb(5)1012 407 y Fd(emacs-editi)o(ng)o(-mo)o(de)9 b(\(C-e\))t
+Fa(.)c(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)18 b Fb(19)1012 451 y(enable-k)o(eypad)9 b Fa(.)g(.)d(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Fb(5)1012
+495 y Fd(end-kbd-mac)o(ro)9 b(\(C-x)i(\)\))e Fa(.)e(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23
+b Fb(18)1012 539 y Fd(end-of-hist)o(or)o(y)10 b(\(M->\))d
+Fa(.)t(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)20 b Fb(14)1012 583 y Fd(end-of-line)9
+b(\(C-e\))e Fa(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fb(13)1012
+626 y Fd(exchange-po)o(in)o(t-a)o(nd)o(-ma)o(rk)9 b(\(C-x)j(C-x\))c
+Fa(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)24 b Fb(18)1012
+670 y(expand-tilde)6 b Fa(.)j(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)19 b Fb(5)1012 796 y Fr(F)1012 854
+y Fd(forward-bac)o(kw)o(ard)o(-d)o(ele)o(te)o(-ch)o(ar)9
+b(\(\))f Fa(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22
+b Fb(15)1012 898 y Fd(forward-cha)o(r)10 b(\(C-f\))f
+Fa(.)s(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Fb(13)1012 942 y
+Fd(forward-sea)o(rc)o(h-h)o(is)o(tor)o(y)10 b(\(C-s\))e
+Fa(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24
+b Fb(14)1012 986 y Fd(forward-wor)o(d)10 b(\(M-f\))f
+Fa(.)s(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Fb(13)1012 1107 y
+Fr(H)1012 1166 y Fb(history-preserv)o(e-p)q(oi)q(n)o(t)8
+b Fa(.)h(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21 b Fb(5)1012 1210 y
+Fd(history-sea)o(rc)o(h-b)o(ac)o(kwa)o(rd)9 b(\(\))i
+Fa(.)c(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)25
+b Fb(14)1012 1253 y Fd(history-sea)o(rc)o(h-f)o(or)o(war)o(d)10
+b(\(\))s Fa(.)c(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)17 b Fb(14)1012 1297 y(horizon)o(tal-scrol)q(l-mo)r(de)6
+b Fa(.)j(.)d(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Fb(6)1012 1415 y
+Fr(I)1012 1473 y Fb(input-meta)8 b Fa(.)g(.)e(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(6)1012 1517
+y Fd(insert-comm)o(en)o(t)10 b(\(M-#\))d Fa(.)t(.)f(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)20
+b Fb(19)1012 1561 y Fd(insert-comp)o(le)o(tio)o(ns)9
+b(\(M-*\))t Fa(.)c(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)18 b Fb(17)1012 1605 y(isearc)o(h-terminators)t
+Fa(.)8 b(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)16 b Fb(6)1012
+1722 y Fr(K)1012 1780 y Fb(k)o(eymap)9 b Fa(.)e(.)f(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22
+b Fb(6)1012 1824 y Fd(kill-line)10 b(\(C-k\))f Fa(.)d(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)24 b Fb(16)1012 1868 y Fd(kill-region)9
+b(\(\))i Fa(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)25
+b Fb(16)1012 1912 y Fd(kill-whole-)o(li)o(ne)9 b(\(\))g
+Fa(.)c(.)i(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Fb(16)1012 1956 y
+Fd(kill-word)10 b(\(M-d\))f Fa(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+24 b Fb(16)1012 2077 y Fr(M)1012 2136 y Fb(mark-mo)q(di\014ed-li)q(nes)
+8 b Fa(.)h(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(6)1012
+2180 y(mark-symlink)o(ed-di)q(rectori)q(es)14 b Fa(.)6
+b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)23 b Fb(6)1012 2223 y(matc)o(h-hidden-\014l)q(es)14
+b Fa(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)24 b Fb(6)1012
+2267 y Fd(menu-comple)o(te)9 b(\(\))g Fa(.)e(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)23 b Fb(17)1012 2311 y(meta-\015ag)t Fa(.)8 b(.)e(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18
+b Fb(6)1012 2437 y Fr(N)1012 2495 y Fd(next-histor)o(y)10
+b(\(C-n\))f Fa(.)s(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 b Fb(14)1012
+2539 y Fd(non-increme)o(nt)o(al-)o(fo)o(rwa)o(rd)o(-se)o(arc)o(h-)o
+(his)o(to)o(ry)10 b(\(M-n\))1096 2583 y Fa(.)c(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)20
+b Fb(14)1012 2626 y Fd(non-increme)o(nt)o(al-)o(re)o(ver)o(se)o(-se)o
+(arc)o(h-)o(his)o(to)o(ry)10 b(\(M-p\))1096 2670 y Fa(.)c(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)20 b Fb(14)p eop
+%%Page: 66 70
+66 69 bop 75 -58 a Ft(66)1299 b(GNU)15 b(Readline)h(Library)75
+149 y Fr(O)75 209 y Fb(output-meta)5 b Fa(.)i(.)f(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)18 b Fb(7)75 253
+y Fd(overwrite-)o(mo)o(de)9 b(\(\))g Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+22 b Fb(15)75 377 y Fr(P)75 436 y Fb(page-completions)14
+b Fa(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)23
+b Fb(7)75 480 y Fd(possible-c)o(om)o(ple)o(ti)o(ons)9
+b(\(M-?\))h Fa(.)c(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)25 b Fb(17)75 525 y Fd(prefix-met)o(a)10 b(\()324
+523 y Fk(h)p 335 496 70 2 v 335 525 a Fj(ESC)p 335 532
+V 402 523 a Fk(i)417 525 y Fd(\))g Fa(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23
+b Fb(18)75 569 y Fd(previous-h)o(is)o(tor)o(y)10 b(\(C-p\))c
+Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)18 b Fb(14)75 698 y Fr(Q)75 757 y Fd(quoted-ins)o(er)o
+(t)10 b(\(C-q)h(or)h(C-v\))c Fa(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)22 b Fb(15)75 886 y Fr(R)75
+945 y Fd(re-read-in)o(it)o(-fi)o(le)9 b(\(C-x)i(C-r\))5
+b Fa(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)18
+b Fb(18)75 990 y Fd(readline)s Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 b Fb(21)75 1034
+y Fd(redraw-cur)o(re)o(nt-)o(li)o(ne)9 b(\(\))d Fa(.)g(.)g(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)18
+b Fb(13)75 1078 y Fd(reverse-se)o(ar)o(ch-)o(hi)o(sto)o(ry)9
+b(\(C-r\))g Fa(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23
+b Fb(14)75 1122 y Fd(revert-lin)o(e)10 b(\(M-r\))d Fa(.)f(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)22 b Fb(18)75 1166 y Fd(rl_add_def)o(un)6
+b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)22
+b Fb(28)75 1211 y Fd(rl_add_fun)o(ma)o(p_e)o(nt)o(ry)t
+Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(31)75 1255 y Fd(rl_add_und)o(o)7
+b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23
+b Fb(32)75 1299 y Fd(rl_alphabe)o(ti)o(c)9 b Fa(.)s(.)d(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)22 b Fb(36)75 1343 y Fd(rl_already)o(_p)o(rom)o
+(pt)o(ed)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(25)75
+1388 y Fd(rl_attempt)o(ed)o(_co)o(mp)o(let)o(ion)o(_f)o(unc)o(ti)o(on)t
+Fa(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17 b Fb(43)75
+1432 y Fd(rl_attempt)o(ed)o(_co)o(mp)o(let)o(ion)o(_o)o(ver)6
+b Fa(.)s(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20
+b Fb(46)75 1476 y Fd(rl_basic_q)o(uo)o(te_)o(ch)o(ara)o(cte)o(rs)8
+b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+22 b Fb(44)75 1520 y Fd(rl_basic_w)o(or)o(d_b)o(re)o(ak_)o(cha)o(ra)o
+(cte)o(rs)5 b Fa(.)s(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)18
+b Fb(44)75 1564 y Fd(rl_begin_u)o(nd)o(o_g)o(ro)o(up)t
+Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(32)75 1609 y Fd(rl_bind_ke)o(y)7
+b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23
+b Fb(29)75 1653 y Fd(rl_bind_ke)o(y_)o(if_)o(un)o(bou)o(nd)8
+b Fa(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)24 b Fb(29)75 1697 y Fd(rl_bind_ke)o(y_)o(if_)o(un)o(bou)o
+(nd_)o(in)o(_ma)o(p)6 b Fa(.)s(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)19 b Fb(29)75 1741 y Fd(rl_bind_ke)o(y_)o(in_)o(ma)o(p)5
+b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(29)75 1786 y
+Fd(rl_bind_ke)o(ys)o(eq)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)21 b Fb(30)75 1830 y Fd(rl_bind_ke)o(ys)o(eq_)o(if)o(_un)o(bou)o
+(nd)8 b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)22 b Fb(30)75 1874 y Fd(rl_bind_ke)o(ys)o(eq_)o(if)o(_un)o(bou)o
+(nd)o(_in)o(_m)o(ap)t Fa(.)s(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17
+b Fb(30)75 1918 y Fd(rl_bind_ke)o(ys)o(eq_)o(in)o(_ma)o(p)9
+b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)25 b Fb(30)75 1962 y Fd(rl_binding)o(_k)o(eym)o(ap)5
+b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Fb(26)75 2007
+y Fd(rl_callbac)o(k_)o(han)o(dl)o(er_)o(ins)o(ta)o(ll)7
+b Fa(.)s(.)g(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)20
+b Fb(37)75 2051 y Fd(rl_callbac)o(k_)o(han)o(dl)o(er_)o(rem)o(ov)o(e)8
+b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21
+b Fb(37)75 2095 y Fd(rl_callbac)o(k_)o(rea)o(d_)o(cha)o(r)9
+b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)25 b Fb(37)75 2139 y Fd(rl_catch_s)o(ig)o(nal)o(s)6
+b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)19 b Fb(40)75
+2184 y Fd(rl_catch_s)o(ig)o(win)o(ch)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)19 b Fb(40)75 2228 y Fd(rl_char_is)o(_q)o(uot)o(ed)o(_p)t
+Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(44)75 2272 y Fd(rl_cleanup)o(_a)o
+(fte)o(r_)o(sig)o(nal)7 b Fa(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Fb(40)75 2316 y
+Fd(rl_clear_m)o(es)o(sag)o(e)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)
+19 b Fb(33)75 2360 y Fd(rl_clear_p)o(en)o(din)o(g_)o(inp)o(ut)8
+b Fa(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)24 b Fb(35)75 2405 y Fd(rl_clear_s)o(ig)o(nal)o(s)6
+b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)19 b Fb(41)75
+2449 y Fd(rl_complet)o(e)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)23 b Fb(42)75 2493 y Fd(rl_complet)o(e_)o(int)o(er)o
+(nal)s Fa(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(42)75 2537 y Fd(rl_complet)o(er)
+o(_qu)o(ot)o(e_c)o(har)o(ac)o(ter)o(s)6 b Fa(.)s(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)19 b Fb(45)75 2582 y Fd(rl_complet)o(er)o(_wo)o
+(rd)o(_br)o(eak)o(_c)o(har)o(ac)o(ter)o(s)9 b Fa(.)d(.)g(.)g(.)g(.)g(.)
+h(.)24 b Fb(45)75 2626 y Fd(rl_complet)o(io)o(n_a)o(pp)o(end)o(_ch)o
+(ar)o(act)o(er)5 b Fa(.)s(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)18
+b Fb(45)75 2670 y Fd(rl_complet)o(io)o(n_d)o(is)o(pla)o(y_m)o(at)o(che)
+o(s_)o(hoo)o(k)9 b Fa(.)d(.)g(.)g(.)g(.)g(.)h(.)24 b
+Fb(44)1012 149 y Fd(rl_completi)o(on)o(_en)o(tr)o(y_f)o(un)o(cti)o(on)s
+Fa(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)17 b Fb(42,)c(43)1012
+194 y Fd(rl_completi)o(on)o(_ma)o(rk)o(_sy)o(ml)o(ink)o(_di)o(rs)t
+Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 b Fb(45)1012
+238 y Fd(rl_completi)o(on)o(_ma)o(tc)o(hes)8 b Fa(.)f(.)f(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25
+b Fb(42)1012 282 y Fd(rl_completi)o(on)o(_mo)o(de)t Fa(.)t(.)6
+b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(42)1012 326 y Fd(rl_completi)o(on)o(_qu)
+o(er)o(y_i)o(te)o(ms)9 b Fa(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)23 b Fb(45)1012 371 y Fd(rl_completi)o(on)o(_su)
+o(pp)o(res)o(s_)o(app)o(end)5 b Fa(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)20 b Fb(45)1012 415 y Fd(rl_completi)o(on)o(_ty)o(pe)t
+Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(46)1012 459 y
+Fd(rl_copy_key)o(ma)o(p)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)21 b Fb(28)1012 503 y Fd(rl_copy_tex)o(t)6 b Fa(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(34)1012 547 y
+Fd(rl_crlf)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(33)1012 592 y Fd(rl_delete_t)o(ex)o(t)8
+b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)21 b
+Fb(34)1012 636 y Fd(rl_deprep_t)o(er)o(m_f)o(un)o(cti)o(on)7
+b Fa(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)24 b Fb(26)1012 680 y Fd(rl_deprep_t)o(er)o(min)o(al)t
+Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(35)1012 724 y
+Fd(rl_ding)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(36)1012 769 y Fd(rl_director)o(y_)o
+(com)o(pl)o(eti)o(on)o(_ho)o(ok)7 b Fa(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)h(.)20 b Fb(44)1012 813 y Fd(rl_discard_)o(ke)o(yma)
+o(p)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Fb(29)1012
+857 y Fd(rl_dispatch)o(in)o(g)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)21 b Fb(24)1012 901 y Fd(rl_display_)o(ma)o(tch)o(_l)o(ist)8
+b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)25 b Fb(36)1012 945 y Fd(rl_do_undo)8
+b Fa(.)e(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)24
+b Fb(32)1012 990 y Fd(rl_done)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(24)1012
+1034 y Fd(rl_editing_)o(mo)o(de)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)21 b Fb(28)1012 1078 y Fd(rl_end)5 b Fa(.)t(.)h(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18
+b Fb(24)1012 1122 y Fd(rl_end_undo)o(_g)o(rou)o(p)6 b
+Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Fb(32)1012 1167
+y Fd(rl_erase_em)o(pt)o(y_l)o(in)o(e)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18
+b Fb(24)1012 1211 y Fd(rl_event_ho)o(ok)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)22 b Fb(26)1012 1255 y Fd(rl_execute_)o(ne)o
+(xt)7 b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Fb(34)1012 1299 y Fd(rl_executin)o(g_)o(key)o(ma)o(p)t
+Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 b Fb(26)1012 1343 y Fd(rl_executin)o(g_)
+o(mac)o(ro)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(26)1012
+1388 y Fd(rl_expand_p)o(ro)o(mpt)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)20 b Fb(33)1012 1432 y Fd(rl_explicit)o(_a)o(rg)7
+b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(27)1012
+1476 y Fd(rl_extend_l)o(in)o(e_b)o(uf)o(fer)8 b Fa(.)f(.)f(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25
+b Fb(35)1012 1520 y Fd(rl_filename)o(_c)o(omp)o(le)o(tio)o(n_)o(des)o
+(ire)o(d)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19
+b Fb(46)1012 1564 y Fd(rl_filename)o(_c)o(omp)o(le)o(tio)o(n_)o(fun)o
+(cti)o(on)t Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18
+b Fb(43)1012 1609 y Fd(rl_filename)o(_d)o(equ)o(ot)o(ing)o(_f)o(unc)o
+(tio)o(n)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19
+b Fb(43)1012 1653 y Fd(rl_filename)o(_q)o(uot)o(e_)o(cha)o(ra)o(cte)o
+(rs)7 b Fa(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)20
+b Fb(45)1012 1697 y Fd(rl_filename)o(_q)o(uot)o(in)o(g_d)o(es)o(ire)o
+(d)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)21
+b Fb(46)1012 1741 y Fd(rl_filename)o(_q)o(uot)o(in)o(g_f)o(un)o(cti)o
+(on)7 b Fa(.)s(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)20
+b Fb(43)1012 1786 y Fd(rl_forced_u)o(pd)o(ate)o(_d)o(isp)o(la)o(y)7
+b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)23 b Fb(33)1012 1830 y Fd(rl_free_lin)o(e_)o(sta)o(te)t
+Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(40)1012 1874
+y Fd(rl_free_und)o(o_)o(lis)o(t)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+19 b Fb(32)1012 1918 y Fd(rl_function)o(_d)o(ump)o(er)t
+Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(31)1012 1962
+y Fd(rl_function)o(_o)o(f_k)o(ey)o(seq)8 b Fa(.)f(.)f(.)g(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25
+b Fb(31)1012 2007 y Fd(rl_funmap_n)o(am)o(es)7 b Fa(.)s(.)f(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)21 b Fb(31)1012 2051 y Fd(rl_generic_)o(bi)o(nd)7
+b Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(30)1012
+2095 y Fd(rl_get_keym)o(ap)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)22 b Fb(29)1012 2139 y Fd(rl_get_keym)o(ap)o(_by)o(_n)o
+(ame)8 b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)25 b Fb(29)1012 2184 y Fd(rl_get_keym)o(ap)o
+(_na)o(me)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Fb(29)1012
+2228 y Fd(rl_get_scre)o(en)o(_si)o(ze)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g
+(.)19 b Fb(40)1012 2272 y Fd(rl_get_term)o(ca)o(p)8 b
+Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)21 b Fb(37)1012
+2316 y Fd(rl_getc)t Fa(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)17 b Fb(34)1012 2360 y
+Fd(rl_getc_fun)o(ct)o(ion)6 b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20
+b Fb(26)1012 2405 y Fd(rl_gnu_read)o(li)o(ne_)o(p)6 b
+Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)19 b Fb(25)1012 2449
+y Fd(rl_ignore_c)o(om)o(ple)o(ti)o(on_)o(du)o(pli)o(cat)o(es)t
+Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)18 b Fb(45)1012
+2493 y Fd(rl_ignore_s)o(om)o(e_c)o(om)o(ple)o(ti)o(ons)o(_fu)o(nc)o
+(tio)o(n)8 b Fa(.)e(.)g(.)g(.)g(.)h(.)24 b Fb(44)1012
+2537 y Fd(rl_inhibit_)o(co)o(mpl)o(et)o(ion)8 b Fa(.)f(.)f(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25
+b Fb(46)1012 2582 y Fd(rl_initiali)o(ze)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)22 b Fb(35)1012 2626 y Fd(rl_insert_c)o(om)o
+(ple)o(ti)o(ons)8 b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)25 b Fb(42)1012 2670
+y Fd(rl_insert_t)o(ex)o(t)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)21 b Fb(34)p eop
+%%Page: 67 71
+67 70 bop 75 -58 a Ft(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187
+b(67)75 149 y Fd(rl_instrea)o(m)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(25)75 194 y Fd(rl_invokin)o(g_)o(key)o
+(se)o(qs)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(31)75
+238 y Fd(rl_invokin)o(g_)o(key)o(se)o(qs_)o(in_)o(ma)o(p)8
+b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21
+b Fb(31)75 282 y Fd(rl_kill_te)o(xt)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)22 b Fb(34)75 326 y Fd(rl_last_fu)o(nc)6
+b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)22
+b Fb(25)75 371 y Fd(rl_library)o(_v)o(ers)o(io)o(n)5
+b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(25)75 415 y Fd(rl_line_bu)o(ff)
+o(er)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Fb(24)75 459 y Fd(rl_list_fu)o(nm)o(ap_)o(na)o(mes)s
+Fa(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(31)75 503 y Fd(rl_macro_b)o(in)o(d)9
+b Fa(.)s(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22
+b Fb(36)75 548 y Fd(rl_macro_d)o(um)o(per)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)20 b Fb(36)75 592 y Fd(rl_make_ba)o(re)o(_ke)o(ym)o
+(ap)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(28)75 636
+y Fd(rl_make_ke)o(ym)o(ap)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)21 b Fb(28)75 680 y Fd(rl_mark)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17
+b Fb(24)75 725 y Fd(rl_message)7 b Fa(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 b Fb(33)75 769 y Fd(rl_modifyi)o(ng)6
+b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)22
+b Fb(32)75 813 y Fd(rl_named_f)o(un)o(cti)o(on)5 b Fa(.)s(.)i(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)19 b Fb(31)75 858 y Fd(rl_num_cha)o(rs)o(_to)o(_r)o
+(ead)s Fa(.)s(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)16 b Fb(24)75 902 y Fd(rl_numeric)o(_a)o
+(rg)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21
+b Fb(28)75 946 y Fd(rl_on_new_)o(li)o(ne)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)21 b Fb(33)75 990 y Fd(rl_on_new_)o(li)o(ne_)o(wi)o
+(th_)o(pro)o(mp)o(t)8 b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)21 b Fb(33)75 1035 y Fd(rl_outstre)o(am)6
+b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)22
+b Fb(25)75 1079 y Fd(rl_parse_a)o(nd)o(_bi)o(nd)5 b Fa(.)s(.)i(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)19 b Fb(30)75 1123 y Fd(rl_pending)o(_i)o(npu)o(t)6
+b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)19 b Fb(24)75
+1167 y Fd(rl_point)s Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 b Fb(24)75 1212 y Fd(rl_possibl)o(e_)o
+(com)o(pl)o(eti)o(ons)7 b Fa(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)23 b Fb(42)75 1256 y
+Fd(rl_pre_inp)o(ut)o(_ho)o(ok)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19
+b Fb(25)75 1300 y Fd(rl_prep_te)o(rm)o(_fu)o(nc)o(tio)o(n)9
+b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)25 b Fb(26)75 1344 y Fd(rl_prep_te)o(rm)o(ina)o(l)6
+b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)19 b Fb(35)75
+1389 y Fd(rl_prompt)8 b Fa(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)24 b Fb(25)75 1433 y Fd(rl_push_ma)o(cr)o(o_i)o(np)
+o(ut)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(34)75 1477
+y Fd(rl_read_in)o(it)o(_fi)o(le)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+19 b Fb(31)75 1521 y Fd(rl_read_ke)o(y)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(34)75 1566 y
+Fd(rl_readlin)o(e_)o(nam)o(e)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)
+19 b Fb(25)75 1610 y Fd(rl_readlin)o(e_)o(sta)o(te)5
+b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Fb(26)75 1654
+y Fd(rl_readlin)o(e_)o(ver)o(si)o(on)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17
+b Fb(25)75 1698 y Fd(rl_redispl)o(ay)6 b Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)22 b Fb(32)75 1743 y Fd(rl_redispl)o(ay)o(_fu)o
+(nc)o(tio)o(n)9 b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)25 b Fb(26)75 1787 y
+Fd(rl_replace)o(_l)o(ine)6 b Fa(.)t(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+20 b Fb(35)75 1831 y Fd(rl_reset_a)o(ft)o(er_)o(si)o(gna)o(l)9
+b Fa(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)25 b Fb(40)75 1875 y Fd(rl_reset_l)o(in)o(e_s)o(ta)o
+(te)t Fa(.)s(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 b Fb(33)75 1920
+y Fd(rl_reset_t)o(er)o(min)o(al)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+19 b Fb(35)75 1964 y Fd(rl_resize_)o(te)o(rmi)o(na)o(l)5
+b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(40)75 2008 y
+Fd(rl_restore)o(_p)o(rom)o(pt)5 b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19
+b Fb(33)75 2052 y Fd(rl_save_pr)o(om)o(pt)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)21 b Fb(33)75 2097 y Fd(rl_set_key)7
+b Fa(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24
+b Fb(30)75 2141 y Fd(rl_set_key)o(bo)o(ard)o(_i)o(npu)o(t_t)o(im)o(eou)
+o(t)6 b Fa(.)s(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19
+b Fb(35)75 2185 y Fd(rl_set_key)o(ma)o(p)9 b Fa(.)s(.)d(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)22 b Fb(29)75 2229 y Fd(rl_set_par)o(en)o(_bl)o
+(in)o(k_t)o(ime)o(ou)o(t)8 b Fa(.)t(.)e(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)21 b Fb(37)75 2274 y Fd(rl_set_pro)o(mp)o(t)9
+b Fa(.)s(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22
+b Fb(34)75 2318 y Fd(rl_set_scr)o(ee)o(n_s)o(iz)o(e)5
+b Fa(.)s(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 b Fb(40)1012 149 y
+Fd(rl_set_sign)o(al)o(s)8 b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)21 b Fb(41)1012 193 y Fd(rl_show_cha)o(r)6 b Fa(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Fb(33)1012 237 y
+Fd(rl_special_)o(pr)o(efi)o(xe)o(s)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18
+b Fb(45)1012 280 y Fd(rl_startup_)o(ho)o(ok)7 b Fa(.)s(.)f(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)21 b Fb(25)1012 324 y Fd(rl_stuff_ch)o(ar)8
+b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22
+b Fb(34)1012 367 y Fd(rl_terminal)o(_n)o(ame)6 b Fa(.)s(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)20 b Fb(25)1012 411 y Fd(rl_tty_set_)o(de)o(fau)o(lt)o
+(_bi)o(nd)o(ing)o(s)8 b Fa(.)s(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)21 b Fb(35)1012 455 y Fd(rl_tty_unse)o(t_)o(def)o(au)o
+(lt_)o(bi)o(ndi)o(ngs)5 b Fa(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)
+g(.)g(.)20 b Fb(35)1012 498 y Fd(rl_unbind_c)o(om)o(man)o(d_)o(in_)o
+(ma)o(p)7 b Fa(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)23 b Fb(30)1012 542 y Fd(rl_unbind_f)o(un)o(cti)o(on)o
+(_in)o(_m)o(ap)9 b Fa(.)s(.)d(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)23 b Fb(30)1012 585 y Fd(rl_unbind_k)o(ey)8
+b Fa(.)s(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22
+b Fb(30)1012 629 y Fd(rl_unbind_k)o(ey)o(_in)o(_m)o(ap)s
+Fa(.)t(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)
+g(.)g(.)g(.)h(.)f(.)g(.)17 b Fb(30)1012 673 y Fd(rl_username)o(_c)o
+(omp)o(le)o(tio)o(n_)o(fun)o(cti)o(on)t Fa(.)s(.)7 b(.)f(.)g(.)g(.)g(.)
+g(.)h(.)f(.)g(.)18 b Fb(43)1012 716 y Fd(rl_variable)o(_b)o(ind)6
+b Fa(.)s(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)20 b Fb(37)1012
+760 y Fd(rl_variable)o(_d)o(ump)o(er)t Fa(.)t(.)6 b(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)
+19 b Fb(37)1012 886 y Fr(S)1012 944 y Fd(self-insert)9
+b(\(a,)j(b,)g(A,)g(1,)g(!,)g(...)o(\))6 b Fa(.)g(.)g(.)g(.)g(.)g(.)g(.)
+h(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 987 y Fd(set-mark)10
+b(\(C-@\))g Fa(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)25
+b Fb(18)1012 1031 y(sho)o(w-all-if-am)o(bigu)q(ous)14
+b Fa(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)23 b Fb(7)1012 1074
+y(sho)o(w-all-if-unmo)q(di)q(\014ed)7 b Fa(.)i(.)d(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)
+19 b Fb(7)1012 1118 y Fd(start-kbd-m)o(ac)o(ro)9 b(\(C-x)j(\(\))c
+Fa(.)d(.)i(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)22 b Fb(18)1012 1238 y Fr(T)1012 1296 y Fd(tab-insert)9
+b(\(M-)1281 1294 y Fk(h)p 1292 1268 74 2 v 1292 1296
+a Fj(T)m(AB)p 1292 1304 V 1364 1294 a Fk(i)1379 1296
+y Fd(\))e Fa(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)20 b Fb(15)1012 1340
+y Fd(tilde-expan)o(d)10 b(\(M-~\))f Fa(.)s(.)e(.)f(.)g(.)g(.)g(.)g(.)g
+(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22
+b Fb(18)1012 1384 y Fd(transpose-c)o(ha)o(rs)9 b(\(C-t\))d
+Fa(.)f(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 1427 y Fd(transpose-w)o(or)o(ds)9
+b(\(M-t\))d Fa(.)f(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Fb(15)1012 1553 y
+Fr(U)1012 1611 y Fd(undo)12 b(\(C-_)f(or)h(C-x)g(C-u\))c
+Fa(.)t(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g
+(.)g(.)h(.)f(.)g(.)g(.)21 b Fb(18)1012 1655 y Fd(universal-a)o(rg)o
+(ume)o(nt)9 b(\(\))d Fa(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Fb(17)1012
+1698 y Fd(unix-line-d)o(is)o(car)o(d)10 b(\(C-u\))5 b
+Fa(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)18 b Fb(16)1012 1742 y Fd(unix-word-r)o(ub)o(out)9
+b(\(C-w\))d Fa(.)t(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)19 b Fb(16)1012 1785 y Fd(upcase-word)9
+b(\(M-u\))e Fa(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h
+(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fb(15)1012
+1911 y Fr(V)1012 1969 y Fd(vi-editing-)o(mo)o(de)9 b(\(M-C-j\))c
+Fa(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g
+(.)h(.)f(.)18 b Fb(19)1012 2013 y(visible-stats)c Fa(.)6
+b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24
+b Fb(7)1012 2129 y Fr(Y)1012 2187 y Fd(yank)12 b(\(C-y\))5
+b Fa(.)t(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)
+f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19
+b Fb(16)1012 2231 y Fd(yank-last-a)o(rg)9 b(\(M-.)i(or)h(M-_\))c
+Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23
+b Fb(14)1012 2274 y Fd(yank-nth-ar)o(g)10 b(\(M-C-y\))d
+Fa(.)s(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f
+(.)g(.)g(.)g(.)g(.)h(.)20 b Fb(14)1012 2318 y Fd(yank-pop)10
+b(\(M-y\))g Fa(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)25
+b Fb(17)p eop
+%%Page: 68 72
+68 71 bop 75 -58 a Ft(68)1299 b(GNU)15 b(Readline)h(Library)p
+eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/lib/readline/doc/rlman.aux b/lib/readline/doc/rlman.aux
new file mode 100644 (file)
index 0000000..b54c096
--- /dev/null
@@ -0,0 +1,156 @@
+@xrdef{Command Line Editing-title}{Command Line Editing}
+@xrdef{Command Line Editing-pg}{1}
+@xrdef{Command Line Editing-snt}{Chapter@tie 1}
+@xrdef{Introduction and Notation-title}{Introduction to Line Editing}
+@xrdef{Introduction and Notation-pg}{1}
+@xrdef{Introduction and Notation-snt}{Section@tie 1.1}
+@xrdef{Readline Interaction-title}{Readline Interaction}
+@xrdef{Readline Interaction-pg}{1}
+@xrdef{Readline Interaction-snt}{Section@tie 1.2}
+@xrdef{Readline Bare Essentials-title}{Readline Bare Essentials}
+@xrdef{Readline Bare Essentials-pg}{1}
+@xrdef{Readline Bare Essentials-snt}{Section@tie 1.2.1}
+@xrdef{Readline Movement Commands-title}{Readline Movement Commands}
+@xrdef{Readline Movement Commands-pg}{2}
+@xrdef{Readline Movement Commands-snt}{Section@tie 1.2.2}
+@xrdef{Readline Killing Commands-title}{Readline Killing Commands}
+@xrdef{Readline Killing Commands-pg}{2}
+@xrdef{Readline Killing Commands-snt}{Section@tie 1.2.3}
+@xrdef{Readline Arguments-title}{Readline Arguments}
+@xrdef{Readline Arguments-pg}{3}
+@xrdef{Readline Arguments-snt}{Section@tie 1.2.4}
+@xrdef{Searching-title}{Searching for Commands in the History}
+@xrdef{Searching-pg}{3}
+@xrdef{Searching-snt}{Section@tie 1.2.5}
+@xrdef{Readline Init File-title}{Readline Init File}
+@xrdef{Readline Init File-pg}{4}
+@xrdef{Readline Init File-snt}{Section@tie 1.3}
+@xrdef{Readline Init File Syntax-title}{Readline Init File Syntax}
+@xrdef{Readline Init File Syntax-pg}{4}
+@xrdef{Readline Init File Syntax-snt}{Section@tie 1.3.1}
+@xrdef{Conditional Init Constructs-title}{Conditional Init Constructs}
+@xrdef{Conditional Init Constructs-pg}{9}
+@xrdef{Conditional Init Constructs-snt}{Section@tie 1.3.2}
+@xrdef{Sample Init File-title}{Sample Init File}
+@xrdef{Sample Init File-pg}{10}
+@xrdef{Sample Init File-snt}{Section@tie 1.3.3}
+@xrdef{Bindable Readline Commands-title}{Bindable Readline Commands}
+@xrdef{Bindable Readline Commands-pg}{13}
+@xrdef{Bindable Readline Commands-snt}{Section@tie 1.4}
+@xrdef{Commands For Moving-title}{Commands For Moving}
+@xrdef{Commands For Moving-pg}{13}
+@xrdef{Commands For Moving-snt}{Section@tie 1.4.1}
+@xrdef{Commands For History-title}{Commands For Manipulating The History}
+@xrdef{Commands For History-pg}{13}
+@xrdef{Commands For History-snt}{Section@tie 1.4.2}
+@xrdef{Commands For Text-title}{Commands For Changing Text}
+@xrdef{Commands For Text-pg}{15}
+@xrdef{Commands For Text-snt}{Section@tie 1.4.3}
+@xrdef{Commands For Killing-title}{Killing And Yanking}
+@xrdef{Commands For Killing-pg}{16}
+@xrdef{Commands For Killing-snt}{Section@tie 1.4.4}
+@xrdef{Numeric Arguments-title}{Specifying Numeric Arguments}
+@xrdef{Numeric Arguments-pg}{17}
+@xrdef{Numeric Arguments-snt}{Section@tie 1.4.5}
+@xrdef{Commands For Completion-title}{Letting Readline Type For You}
+@xrdef{Commands For Completion-pg}{17}
+@xrdef{Commands For Completion-snt}{Section@tie 1.4.6}
+@xrdef{Keyboard Macros-title}{Keyboard Macros}
+@xrdef{Keyboard Macros-pg}{18}
+@xrdef{Keyboard Macros-snt}{Section@tie 1.4.7}
+@xrdef{Miscellaneous Commands-title}{Some Miscellaneous Commands}
+@xrdef{Miscellaneous Commands-pg}{18}
+@xrdef{Miscellaneous Commands-snt}{Section@tie 1.4.8}
+@xrdef{Readline vi Mode-title}{Readline vi Mode}
+@xrdef{Readline vi Mode-pg}{19}
+@xrdef{Readline vi Mode-snt}{Section@tie 1.5}
+@xrdef{Programming with GNU Readline-title}{Programming with GNU Readline}
+@xrdef{Programming with GNU Readline-pg}{21}
+@xrdef{Programming with GNU Readline-snt}{Chapter@tie 2}
+@xrdef{Basic Behavior-title}{Basic Behavior}
+@xrdef{Basic Behavior-pg}{21}
+@xrdef{Basic Behavior-snt}{Section@tie 2.1}
+@xrdef{Custom Functions-title}{Custom Functions}
+@xrdef{Custom Functions-pg}{22}
+@xrdef{Custom Functions-snt}{Section@tie 2.2}
+@xrdef{Readline Typedefs-title}{Readline Typedefs}
+@xrdef{Readline Typedefs-pg}{23}
+@xrdef{Readline Typedefs-snt}{Section@tie 2.2.1}
+@xrdef{Function Writing-title}{Writing a New Function}
+@xrdef{Function Writing-pg}{23}
+@xrdef{Function Writing-snt}{Section@tie 2.2.2}
+@xrdef{Readline Variables-title}{Readline Variables}
+@xrdef{Readline Variables-pg}{24}
+@xrdef{Readline Variables-snt}{Section@tie 2.3}
+@xrdef{Readline Convenience Functions-title}{Readline Convenience Functions}
+@xrdef{Readline Convenience Functions-pg}{28}
+@xrdef{Readline Convenience Functions-snt}{Section@tie 2.4}
+@xrdef{Function Naming-title}{Naming a Function}
+@xrdef{Function Naming-pg}{28}
+@xrdef{Function Naming-snt}{Section@tie 2.4.1}
+@xrdef{Keymaps-title}{Selecting a Keymap}
+@xrdef{Keymaps-pg}{28}
+@xrdef{Keymaps-snt}{Section@tie 2.4.2}
+@xrdef{Binding Keys-title}{Binding Keys}
+@xrdef{Binding Keys-pg}{29}
+@xrdef{Binding Keys-snt}{Section@tie 2.4.3}
+@xrdef{Associating Function Names and Bindings-title}{Associating Function Names and Bindings}
+@xrdef{Associating Function Names and Bindings-pg}{31}
+@xrdef{Associating Function Names and Bindings-snt}{Section@tie 2.4.4}
+@xrdef{Allowing Undoing-title}{Allowing Undoing}
+@xrdef{Allowing Undoing-pg}{32}
+@xrdef{Allowing Undoing-snt}{Section@tie 2.4.5}
+@xrdef{Redisplay-title}{Redisplay}
+@xrdef{Redisplay-pg}{32}
+@xrdef{Redisplay-snt}{Section@tie 2.4.6}
+@xrdef{Modifying Text-title}{Modifying Text}
+@xrdef{Modifying Text-pg}{34}
+@xrdef{Modifying Text-snt}{Section@tie 2.4.7}
+@xrdef{Character Input-title}{Character Input}
+@xrdef{Character Input-pg}{34}
+@xrdef{Character Input-snt}{Section@tie 2.4.8}
+@xrdef{Terminal Management-title}{Terminal Management}
+@xrdef{Terminal Management-pg}{35}
+@xrdef{Terminal Management-snt}{Section@tie 2.4.9}
+@xrdef{Utility Functions-title}{Utility Functions}
+@xrdef{Utility Functions-pg}{35}
+@xrdef{Utility Functions-snt}{Section@tie 2.4.10}
+@xrdef{Miscellaneous Functions-title}{Miscellaneous Functions}
+@xrdef{Miscellaneous Functions-pg}{36}
+@xrdef{Miscellaneous Functions-snt}{Section@tie 2.4.11}
+@xrdef{Alternate Interface-title}{Alternate Interface}
+@xrdef{Alternate Interface-pg}{37}
+@xrdef{Alternate Interface-snt}{Section@tie 2.4.12}
+@xrdef{A Readline Example-title}{A Readline Example}
+@xrdef{A Readline Example-pg}{38}
+@xrdef{A Readline Example-snt}{Section@tie 2.4.13}
+@xrdef{Readline Signal Handling-title}{Readline Signal Handling}
+@xrdef{Readline Signal Handling-pg}{39}
+@xrdef{Readline Signal Handling-snt}{Section@tie 2.5}
+@xrdef{Custom Completers-title}{Custom Completers}
+@xrdef{Custom Completers-pg}{41}
+@xrdef{Custom Completers-snt}{Section@tie 2.6}
+@xrdef{How Completing Works-title}{How Completing Works}
+@xrdef{How Completing Works-pg}{41}
+@xrdef{How Completing Works-snt}{Section@tie 2.6.1}
+@xrdef{Completion Functions-title}{Completion Functions}
+@xrdef{Completion Functions-pg}{42}
+@xrdef{Completion Functions-snt}{Section@tie 2.6.2}
+@xrdef{Completion Variables-title}{Completion Variables}
+@xrdef{Completion Variables-pg}{43}
+@xrdef{Completion Variables-snt}{Section@tie 2.6.3}
+@xrdef{A Short Completion Example-title}{A Short Completion Example}
+@xrdef{A Short Completion Example-pg}{46}
+@xrdef{A Short Completion Example-snt}{Section@tie 2.6.4}
+@xrdef{Copying This Manual-title}{Copying This Manual}
+@xrdef{Copying This Manual-pg}{55}
+@xrdef{Copying This Manual-snt}{Appendix@tie @char65{}}
+@xrdef{GNU Free Documentation License-title}{GNU Free Documentation License}
+@xrdef{GNU Free Documentation License-pg}{55}
+@xrdef{GNU Free Documentation License-snt}{Section@tie @char65.1}
+@xrdef{Concept Index-title}{Concept Index}
+@xrdef{Concept Index-pg}{63}
+@xrdef{Concept Index-snt}{}
+@xrdef{Function and Variable Index-title}{Function and Variable Index}
+@xrdef{Function and Variable Index-pg}{65}
+@xrdef{Function and Variable Index-snt}{}
diff --git a/lib/readline/doc/rlman.bt b/lib/readline/doc/rlman.bt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/rlman.cp b/lib/readline/doc/rlman.cp
new file mode 100644 (file)
index 0000000..8b16582
--- /dev/null
@@ -0,0 +1,12 @@
+\entry{interaction, readline}{1}{interaction, readline}
+\entry{notation, readline}{1}{notation, readline}
+\entry{command editing}{1}{command editing}
+\entry{editing command lines}{1}{editing command lines}
+\entry{killing text}{2}{killing text}
+\entry{yanking text}{2}{yanking text}
+\entry{kill ring}{3}{kill ring}
+\entry{initialization file, readline}{4}{initialization file, readline}
+\entry{variables, readline}{5}{variables, readline}
+\entry{readline, function}{21}{readline, function}
+\entry{application-specific completion functions}{41}{application-specific completion functions}
+\entry{FDL, GNU Free Documentation License}{55}{FDL, GNU Free Documentation License}
diff --git a/lib/readline/doc/rlman.cps b/lib/readline/doc/rlman.cps
new file mode 100644 (file)
index 0000000..f4ec8c7
--- /dev/null
@@ -0,0 +1,22 @@
+\initial {A}
+\entry {application-specific completion functions}{41}
+\initial {C}
+\entry {command editing}{1}
+\initial {E}
+\entry {editing command lines}{1}
+\initial {F}
+\entry {FDL, GNU Free Documentation License}{55}
+\initial {I}
+\entry {initialization file, readline}{4}
+\entry {interaction, readline}{1}
+\initial {K}
+\entry {kill ring}{3}
+\entry {killing text}{2}
+\initial {N}
+\entry {notation, readline}{1}
+\initial {R}
+\entry {readline, function}{21}
+\initial {V}
+\entry {variables, readline}{5}
+\initial {Y}
+\entry {yanking text}{2}
diff --git a/lib/readline/doc/rlman.fn b/lib/readline/doc/rlman.fn
new file mode 100644 (file)
index 0000000..114fdd0
--- /dev/null
@@ -0,0 +1,263 @@
+\entry{bell-style}{5}{bell-style}
+\entry{comment-begin}{5}{comment-begin}
+\entry{completion-query-items}{5}{completion-query-items}
+\entry{convert-meta}{5}{convert-meta}
+\entry{disable-completion}{5}{disable-completion}
+\entry{editing-mode}{5}{editing-mode}
+\entry{enable-keypad}{5}{enable-keypad}
+\entry{expand-tilde}{5}{expand-tilde}
+\entry{history-preserve-point}{5}{history-preserve-point}
+\entry{horizontal-scroll-mode}{6}{horizontal-scroll-mode}
+\entry{input-meta}{6}{input-meta}
+\entry{meta-flag}{6}{meta-flag}
+\entry{isearch-terminators}{6}{isearch-terminators}
+\entry{keymap}{6}{keymap}
+\entry{mark-modified-lines}{6}{mark-modified-lines}
+\entry{mark-symlinked-directories}{6}{mark-symlinked-directories}
+\entry{match-hidden-files}{6}{match-hidden-files}
+\entry{output-meta}{7}{output-meta}
+\entry{page-completions}{7}{page-completions}
+\entry{show-all-if-ambiguous}{7}{show-all-if-ambiguous}
+\entry{show-all-if-unmodified}{7}{show-all-if-unmodified}
+\entry{visible-stats}{7}{visible-stats}
+\entry{beginning-of-line (C-a)}{13}{\code {beginning-of-line (C-a)}}
+\entry{end-of-line (C-e)}{13}{\code {end-of-line (C-e)}}
+\entry{forward-char (C-f)}{13}{\code {forward-char (C-f)}}
+\entry{backward-char (C-b)}{13}{\code {backward-char (C-b)}}
+\entry{forward-word (M-f)}{13}{\code {forward-word (M-f)}}
+\entry{backward-word (M-b)}{13}{\code {backward-word (M-b)}}
+\entry{clear-screen (C-l)}{13}{\code {clear-screen (C-l)}}
+\entry{redraw-current-line ()}{13}{\code {redraw-current-line ()}}
+\entry{accept-line (Newline or Return)}{13}{\code {accept-line (Newline or Return)}}
+\entry{previous-history (C-p)}{14}{\code {previous-history (C-p)}}
+\entry{next-history (C-n)}{14}{\code {next-history (C-n)}}
+\entry{beginning-of-history (M-<)}{14}{\code {beginning-of-history (M-<)}}
+\entry{end-of-history (M->)}{14}{\code {end-of-history (M->)}}
+\entry{reverse-search-history (C-r)}{14}{\code {reverse-search-history (C-r)}}
+\entry{forward-search-history (C-s)}{14}{\code {forward-search-history (C-s)}}
+\entry{non-incremental-reverse-search-history (M-p)}{14}{\code {non-incremental-reverse-search-history (M-p)}}
+\entry{non-incremental-forward-search-history (M-n)}{14}{\code {non-incremental-forward-search-history (M-n)}}
+\entry{history-search-forward ()}{14}{\code {history-search-forward ()}}
+\entry{history-search-backward ()}{14}{\code {history-search-backward ()}}
+\entry{yank-nth-arg (M-C-y)}{14}{\code {yank-nth-arg (M-C-y)}}
+\entry{yank-last-arg (M-. or M-_)}{14}{\code {yank-last-arg (M-. or M-_)}}
+\entry{delete-char (C-d)}{15}{\code {delete-char (C-d)}}
+\entry{backward-delete-char (Rubout)}{15}{\code {backward-delete-char (Rubout)}}
+\entry{forward-backward-delete-char ()}{15}{\code {forward-backward-delete-char ()}}
+\entry{quoted-insert (C-q or C-v)}{15}{\code {quoted-insert (C-q or C-v)}}
+\entry{tab-insert (M-TAB)}{15}{\code {tab-insert (M-\key {TAB})}}
+\entry{self-insert (a, b, A, 1, !, ...{})}{15}{\code {self-insert (a, b, A, 1, !, \dots {})}}
+\entry{transpose-chars (C-t)}{15}{\code {transpose-chars (C-t)}}
+\entry{transpose-words (M-t)}{15}{\code {transpose-words (M-t)}}
+\entry{upcase-word (M-u)}{15}{\code {upcase-word (M-u)}}
+\entry{downcase-word (M-l)}{15}{\code {downcase-word (M-l)}}
+\entry{capitalize-word (M-c)}{15}{\code {capitalize-word (M-c)}}
+\entry{overwrite-mode ()}{15}{\code {overwrite-mode ()}}
+\entry{kill-line (C-k)}{16}{\code {kill-line (C-k)}}
+\entry{backward-kill-line (C-x Rubout)}{16}{\code {backward-kill-line (C-x Rubout)}}
+\entry{unix-line-discard (C-u)}{16}{\code {unix-line-discard (C-u)}}
+\entry{kill-whole-line ()}{16}{\code {kill-whole-line ()}}
+\entry{kill-word (M-d)}{16}{\code {kill-word (M-d)}}
+\entry{backward-kill-word (M-DEL)}{16}{\code {backward-kill-word (M-\key {DEL})}}
+\entry{unix-word-rubout (C-w)}{16}{\code {unix-word-rubout (C-w)}}
+\entry{delete-horizontal-space ()}{16}{\code {delete-horizontal-space ()}}
+\entry{kill-region ()}{16}{\code {kill-region ()}}
+\entry{copy-region-as-kill ()}{16}{\code {copy-region-as-kill ()}}
+\entry{copy-backward-word ()}{16}{\code {copy-backward-word ()}}
+\entry{copy-forward-word ()}{16}{\code {copy-forward-word ()}}
+\entry{yank (C-y)}{16}{\code {yank (C-y)}}
+\entry{yank-pop (M-y)}{17}{\code {yank-pop (M-y)}}
+\entry{digit-argument (M-0, M-1, ...{} M--)}{17}{\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}}
+\entry{universal-argument ()}{17}{\code {universal-argument ()}}
+\entry{complete (TAB)}{17}{\code {complete (\key {TAB})}}
+\entry{possible-completions (M-?)}{17}{\code {possible-completions (M-?)}}
+\entry{insert-completions (M-*)}{17}{\code {insert-completions (M-*)}}
+\entry{menu-complete ()}{17}{\code {menu-complete ()}}
+\entry{delete-char-or-list ()}{17}{\code {delete-char-or-list ()}}
+\entry{start-kbd-macro (C-x ()}{18}{\code {start-kbd-macro (C-x ()}}
+\entry{end-kbd-macro (C-x ))}{18}{\code {end-kbd-macro (C-x ))}}
+\entry{call-last-kbd-macro (C-x e)}{18}{\code {call-last-kbd-macro (C-x e)}}
+\entry{re-read-init-file (C-x C-r)}{18}{\code {re-read-init-file (C-x C-r)}}
+\entry{abort (C-g)}{18}{\code {abort (C-g)}}
+\entry{do-uppercase-version (M-a, M-b, M-x, ...{})}{18}{\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}}
+\entry{prefix-meta (ESC)}{18}{\code {prefix-meta (\key {ESC})}}
+\entry{undo (C-_ or C-x C-u)}{18}{\code {undo (C-_ or C-x C-u)}}
+\entry{revert-line (M-r)}{18}{\code {revert-line (M-r)}}
+\entry{tilde-expand (M-~)}{18}{\code {tilde-expand (M-~)}}
+\entry{set-mark (C-@)}{18}{\code {set-mark (C-@)}}
+\entry{exchange-point-and-mark (C-x C-x)}{18}{\code {exchange-point-and-mark (C-x C-x)}}
+\entry{character-search (C-])}{18}{\code {character-search (C-])}}
+\entry{character-search-backward (M-C-])}{19}{\code {character-search-backward (M-C-])}}
+\entry{insert-comment (M-#)}{19}{\code {insert-comment (M-#)}}
+\entry{dump-functions ()}{19}{\code {dump-functions ()}}
+\entry{dump-variables ()}{19}{\code {dump-variables ()}}
+\entry{dump-macros ()}{19}{\code {dump-macros ()}}
+\entry{emacs-editing-mode (C-e)}{19}{\code {emacs-editing-mode (C-e)}}
+\entry{vi-editing-mode (M-C-j)}{19}{\code {vi-editing-mode (M-C-j)}}
+\entry{readline}{21}{\code {readline}}
+\entry{rl_line_buffer}{24}{\code {rl_line_buffer}}
+\entry{rl_point}{24}{\code {rl_point}}
+\entry{rl_end}{24}{\code {rl_end}}
+\entry{rl_mark}{24}{\code {rl_mark}}
+\entry{rl_done}{24}{\code {rl_done}}
+\entry{rl_num_chars_to_read}{24}{\code {rl_num_chars_to_read}}
+\entry{rl_pending_input}{24}{\code {rl_pending_input}}
+\entry{rl_dispatching}{24}{\code {rl_dispatching}}
+\entry{rl_erase_empty_line}{24}{\code {rl_erase_empty_line}}
+\entry{rl_prompt}{25}{\code {rl_prompt}}
+\entry{rl_already_prompted}{25}{\code {rl_already_prompted}}
+\entry{rl_library_version}{25}{\code {rl_library_version}}
+\entry{rl_readline_version}{25}{\code {rl_readline_version}}
+\entry{rl_gnu_readline_p}{25}{\code {rl_gnu_readline_p}}
+\entry{rl_terminal_name}{25}{\code {rl_terminal_name}}
+\entry{rl_readline_name}{25}{\code {rl_readline_name}}
+\entry{rl_instream}{25}{\code {rl_instream}}
+\entry{rl_outstream}{25}{\code {rl_outstream}}
+\entry{rl_last_func}{25}{\code {rl_last_func}}
+\entry{rl_startup_hook}{25}{\code {rl_startup_hook}}
+\entry{rl_pre_input_hook}{25}{\code {rl_pre_input_hook}}
+\entry{rl_event_hook}{26}{\code {rl_event_hook}}
+\entry{rl_getc_function}{26}{\code {rl_getc_function}}
+\entry{rl_redisplay_function}{26}{\code {rl_redisplay_function}}
+\entry{rl_prep_term_function}{26}{\code {rl_prep_term_function}}
+\entry{rl_deprep_term_function}{26}{\code {rl_deprep_term_function}}
+\entry{rl_executing_keymap}{26}{\code {rl_executing_keymap}}
+\entry{rl_binding_keymap}{26}{\code {rl_binding_keymap}}
+\entry{rl_executing_macro}{26}{\code {rl_executing_macro}}
+\entry{rl_readline_state}{26}{\code {rl_readline_state}}
+\entry{rl_explicit_arg}{27}{\code {rl_explicit_arg}}
+\entry{rl_numeric_arg}{28}{\code {rl_numeric_arg}}
+\entry{rl_editing_mode}{28}{\code {rl_editing_mode}}
+\entry{rl_add_defun}{28}{\code {rl_add_defun}}
+\entry{rl_make_bare_keymap}{28}{\code {rl_make_bare_keymap}}
+\entry{rl_copy_keymap}{28}{\code {rl_copy_keymap}}
+\entry{rl_make_keymap}{28}{\code {rl_make_keymap}}
+\entry{rl_discard_keymap}{29}{\code {rl_discard_keymap}}
+\entry{rl_get_keymap}{29}{\code {rl_get_keymap}}
+\entry{rl_set_keymap}{29}{\code {rl_set_keymap}}
+\entry{rl_get_keymap_by_name}{29}{\code {rl_get_keymap_by_name}}
+\entry{rl_get_keymap_name}{29}{\code {rl_get_keymap_name}}
+\entry{rl_bind_key}{29}{\code {rl_bind_key}}
+\entry{rl_bind_key_in_map}{29}{\code {rl_bind_key_in_map}}
+\entry{rl_bind_key_if_unbound}{29}{\code {rl_bind_key_if_unbound}}
+\entry{rl_bind_key_if_unbound_in_map}{29}{\code {rl_bind_key_if_unbound_in_map}}
+\entry{rl_unbind_key}{30}{\code {rl_unbind_key}}
+\entry{rl_unbind_key_in_map}{30}{\code {rl_unbind_key_in_map}}
+\entry{rl_unbind_function_in_map}{30}{\code {rl_unbind_function_in_map}}
+\entry{rl_unbind_command_in_map}{30}{\code {rl_unbind_command_in_map}}
+\entry{rl_bind_keyseq}{30}{\code {rl_bind_keyseq}}
+\entry{rl_bind_keyseq_in_map}{30}{\code {rl_bind_keyseq_in_map}}
+\entry{rl_set_key}{30}{\code {rl_set_key}}
+\entry{rl_bind_keyseq_if_unbound}{30}{\code {rl_bind_keyseq_if_unbound}}
+\entry{rl_bind_keyseq_if_unbound_in_map}{30}{\code {rl_bind_keyseq_if_unbound_in_map}}
+\entry{rl_generic_bind}{30}{\code {rl_generic_bind}}
+\entry{rl_parse_and_bind}{30}{\code {rl_parse_and_bind}}
+\entry{rl_read_init_file}{31}{\code {rl_read_init_file}}
+\entry{rl_named_function}{31}{\code {rl_named_function}}
+\entry{rl_function_of_keyseq}{31}{\code {rl_function_of_keyseq}}
+\entry{rl_invoking_keyseqs}{31}{\code {rl_invoking_keyseqs}}
+\entry{rl_invoking_keyseqs_in_map}{31}{\code {rl_invoking_keyseqs_in_map}}
+\entry{rl_function_dumper}{31}{\code {rl_function_dumper}}
+\entry{rl_list_funmap_names}{31}{\code {rl_list_funmap_names}}
+\entry{rl_funmap_names}{31}{\code {rl_funmap_names}}
+\entry{rl_add_funmap_entry}{31}{\code {rl_add_funmap_entry}}
+\entry{rl_begin_undo_group}{32}{\code {rl_begin_undo_group}}
+\entry{rl_end_undo_group}{32}{\code {rl_end_undo_group}}
+\entry{rl_add_undo}{32}{\code {rl_add_undo}}
+\entry{rl_free_undo_list}{32}{\code {rl_free_undo_list}}
+\entry{rl_do_undo}{32}{\code {rl_do_undo}}
+\entry{rl_modifying}{32}{\code {rl_modifying}}
+\entry{rl_redisplay}{32}{\code {rl_redisplay}}
+\entry{rl_forced_update_display}{33}{\code {rl_forced_update_display}}
+\entry{rl_on_new_line}{33}{\code {rl_on_new_line}}
+\entry{rl_on_new_line_with_prompt}{33}{\code {rl_on_new_line_with_prompt}}
+\entry{rl_reset_line_state}{33}{\code {rl_reset_line_state}}
+\entry{rl_crlf}{33}{\code {rl_crlf}}
+\entry{rl_show_char}{33}{\code {rl_show_char}}
+\entry{rl_message}{33}{\code {rl_message}}
+\entry{rl_clear_message}{33}{\code {rl_clear_message}}
+\entry{rl_save_prompt}{33}{\code {rl_save_prompt}}
+\entry{rl_restore_prompt}{33}{\code {rl_restore_prompt}}
+\entry{rl_expand_prompt}{33}{\code {rl_expand_prompt}}
+\entry{rl_set_prompt}{34}{\code {rl_set_prompt}}
+\entry{rl_insert_text}{34}{\code {rl_insert_text}}
+\entry{rl_delete_text}{34}{\code {rl_delete_text}}
+\entry{rl_copy_text}{34}{\code {rl_copy_text}}
+\entry{rl_kill_text}{34}{\code {rl_kill_text}}
+\entry{rl_push_macro_input}{34}{\code {rl_push_macro_input}}
+\entry{rl_read_key}{34}{\code {rl_read_key}}
+\entry{rl_getc}{34}{\code {rl_getc}}
+\entry{rl_stuff_char}{34}{\code {rl_stuff_char}}
+\entry{rl_execute_next}{34}{\code {rl_execute_next}}
+\entry{rl_clear_pending_input}{35}{\code {rl_clear_pending_input}}
+\entry{rl_set_keyboard_input_timeout}{35}{\code {rl_set_keyboard_input_timeout}}
+\entry{rl_prep_terminal}{35}{\code {rl_prep_terminal}}
+\entry{rl_deprep_terminal}{35}{\code {rl_deprep_terminal}}
+\entry{rl_tty_set_default_bindings}{35}{\code {rl_tty_set_default_bindings}}
+\entry{rl_tty_unset_default_bindings}{35}{\code {rl_tty_unset_default_bindings}}
+\entry{rl_reset_terminal}{35}{\code {rl_reset_terminal}}
+\entry{rl_replace_line}{35}{\code {rl_replace_line}}
+\entry{rl_extend_line_buffer}{35}{\code {rl_extend_line_buffer}}
+\entry{rl_initialize}{35}{\code {rl_initialize}}
+\entry{rl_ding}{36}{\code {rl_ding}}
+\entry{rl_alphabetic}{36}{\code {rl_alphabetic}}
+\entry{rl_display_match_list}{36}{\code {rl_display_match_list}}
+\entry{_rl_uppercase_p}{36}{\code {_rl_uppercase_p}}
+\entry{_rl_lowercase_p}{36}{\code {_rl_lowercase_p}}
+\entry{_rl_digit_p}{36}{\code {_rl_digit_p}}
+\entry{_rl_to_upper}{36}{\code {_rl_to_upper}}
+\entry{_rl_to_lower}{36}{\code {_rl_to_lower}}
+\entry{_rl_digit_value}{36}{\code {_rl_digit_value}}
+\entry{rl_macro_bind}{36}{\code {rl_macro_bind}}
+\entry{rl_macro_dumper}{36}{\code {rl_macro_dumper}}
+\entry{rl_variable_bind}{37}{\code {rl_variable_bind}}
+\entry{rl_variable_dumper}{37}{\code {rl_variable_dumper}}
+\entry{rl_set_paren_blink_timeout}{37}{\code {rl_set_paren_blink_timeout}}
+\entry{rl_get_termcap}{37}{\code {rl_get_termcap}}
+\entry{rl_callback_handler_install}{37}{\code {rl_callback_handler_install}}
+\entry{rl_callback_read_char}{37}{\code {rl_callback_read_char}}
+\entry{rl_callback_handler_remove}{37}{\code {rl_callback_handler_remove}}
+\entry{rl_catch_signals}{40}{\code {rl_catch_signals}}
+\entry{rl_catch_sigwinch}{40}{\code {rl_catch_sigwinch}}
+\entry{rl_cleanup_after_signal}{40}{\code {rl_cleanup_after_signal}}
+\entry{rl_free_line_state}{40}{\code {rl_free_line_state}}
+\entry{rl_reset_after_signal}{40}{\code {rl_reset_after_signal}}
+\entry{rl_resize_terminal}{40}{\code {rl_resize_terminal}}
+\entry{rl_set_screen_size}{40}{\code {rl_set_screen_size}}
+\entry{rl_get_screen_size}{40}{\code {rl_get_screen_size}}
+\entry{rl_set_signals}{41}{\code {rl_set_signals}}
+\entry{rl_clear_signals}{41}{\code {rl_clear_signals}}
+\entry{rl_complete}{42}{\code {rl_complete}}
+\entry{rl_completion_entry_function}{42}{\code {rl_completion_entry_function}}
+\entry{rl_complete_internal}{42}{\code {rl_complete_internal}}
+\entry{rl_complete}{42}{\code {rl_complete}}
+\entry{rl_possible_completions}{42}{\code {rl_possible_completions}}
+\entry{rl_insert_completions}{42}{\code {rl_insert_completions}}
+\entry{rl_completion_mode}{42}{\code {rl_completion_mode}}
+\entry{rl_completion_matches}{42}{\code {rl_completion_matches}}
+\entry{rl_filename_completion_function}{43}{\code {rl_filename_completion_function}}
+\entry{rl_username_completion_function}{43}{\code {rl_username_completion_function}}
+\entry{rl_completion_entry_function}{43}{\code {rl_completion_entry_function}}
+\entry{rl_attempted_completion_function}{43}{\code {rl_attempted_completion_function}}
+\entry{rl_filename_quoting_function}{43}{\code {rl_filename_quoting_function}}
+\entry{rl_filename_dequoting_function}{43}{\code {rl_filename_dequoting_function}}
+\entry{rl_char_is_quoted_p}{44}{\code {rl_char_is_quoted_p}}
+\entry{rl_ignore_some_completions_function}{44}{\code {rl_ignore_some_completions_function}}
+\entry{rl_directory_completion_hook}{44}{\code {rl_directory_completion_hook}}
+\entry{rl_completion_display_matches_hook}{44}{\code {rl_completion_display_matches_hook}}
+\entry{rl_basic_word_break_characters}{44}{\code {rl_basic_word_break_characters}}
+\entry{rl_basic_quote_characters}{44}{\code {rl_basic_quote_characters}}
+\entry{rl_completer_word_break_characters}{45}{\code {rl_completer_word_break_characters}}
+\entry{rl_completer_quote_characters}{45}{\code {rl_completer_quote_characters}}
+\entry{rl_filename_quote_characters}{45}{\code {rl_filename_quote_characters}}
+\entry{rl_special_prefixes}{45}{\code {rl_special_prefixes}}
+\entry{rl_completion_query_items}{45}{\code {rl_completion_query_items}}
+\entry{rl_completion_append_character}{45}{\code {rl_completion_append_character}}
+\entry{rl_completion_suppress_append}{45}{\code {rl_completion_suppress_append}}
+\entry{rl_completion_mark_symlink_dirs}{45}{\code {rl_completion_mark_symlink_dirs}}
+\entry{rl_ignore_completion_duplicates}{45}{\code {rl_ignore_completion_duplicates}}
+\entry{rl_filename_completion_desired}{46}{\code {rl_filename_completion_desired}}
+\entry{rl_filename_quoting_desired}{46}{\code {rl_filename_quoting_desired}}
+\entry{rl_attempted_completion_over}{46}{\code {rl_attempted_completion_over}}
+\entry{rl_completion_type}{46}{\code {rl_completion_type}}
+\entry{rl_inhibit_completion}{46}{\code {rl_inhibit_completion}}
diff --git a/lib/readline/doc/rlman.fns b/lib/readline/doc/rlman.fns
new file mode 100644 (file)
index 0000000..b1dfd48
--- /dev/null
@@ -0,0 +1,282 @@
+\initial {_}
+\entry {\code {_rl_digit_p}}{36}
+\entry {\code {_rl_digit_value}}{36}
+\entry {\code {_rl_lowercase_p}}{36}
+\entry {\code {_rl_to_lower}}{36}
+\entry {\code {_rl_to_upper}}{36}
+\entry {\code {_rl_uppercase_p}}{36}
+\initial {A}
+\entry {\code {abort (C-g)}}{18}
+\entry {\code {accept-line (Newline or Return)}}{13}
+\initial {B}
+\entry {\code {backward-char (C-b)}}{13}
+\entry {\code {backward-delete-char (Rubout)}}{15}
+\entry {\code {backward-kill-line (C-x Rubout)}}{16}
+\entry {\code {backward-kill-word (M-\key {DEL})}}{16}
+\entry {\code {backward-word (M-b)}}{13}
+\entry {\code {beginning-of-history (M-<)}}{14}
+\entry {\code {beginning-of-line (C-a)}}{13}
+\entry {bell-style}{5}
+\initial {C}
+\entry {\code {call-last-kbd-macro (C-x e)}}{18}
+\entry {\code {capitalize-word (M-c)}}{15}
+\entry {\code {character-search (C-])}}{18}
+\entry {\code {character-search-backward (M-C-])}}{19}
+\entry {\code {clear-screen (C-l)}}{13}
+\entry {comment-begin}{5}
+\entry {\code {complete (\key {TAB})}}{17}
+\entry {completion-query-items}{5}
+\entry {convert-meta}{5}
+\entry {\code {copy-backward-word ()}}{16}
+\entry {\code {copy-forward-word ()}}{16}
+\entry {\code {copy-region-as-kill ()}}{16}
+\initial {D}
+\entry {\code {delete-char (C-d)}}{15}
+\entry {\code {delete-char-or-list ()}}{17}
+\entry {\code {delete-horizontal-space ()}}{16}
+\entry {\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}}{17}
+\entry {disable-completion}{5}
+\entry {\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}}{18}
+\entry {\code {downcase-word (M-l)}}{15}
+\entry {\code {dump-functions ()}}{19}
+\entry {\code {dump-macros ()}}{19}
+\entry {\code {dump-variables ()}}{19}
+\initial {E}
+\entry {editing-mode}{5}
+\entry {\code {emacs-editing-mode (C-e)}}{19}
+\entry {enable-keypad}{5}
+\entry {\code {end-kbd-macro (C-x ))}}{18}
+\entry {\code {end-of-history (M->)}}{14}
+\entry {\code {end-of-line (C-e)}}{13}
+\entry {\code {exchange-point-and-mark (C-x C-x)}}{18}
+\entry {expand-tilde}{5}
+\initial {F}
+\entry {\code {forward-backward-delete-char ()}}{15}
+\entry {\code {forward-char (C-f)}}{13}
+\entry {\code {forward-search-history (C-s)}}{14}
+\entry {\code {forward-word (M-f)}}{13}
+\initial {H}
+\entry {history-preserve-point}{5}
+\entry {\code {history-search-backward ()}}{14}
+\entry {\code {history-search-forward ()}}{14}
+\entry {horizontal-scroll-mode}{6}
+\initial {I}
+\entry {input-meta}{6}
+\entry {\code {insert-comment (M-#)}}{19}
+\entry {\code {insert-completions (M-*)}}{17}
+\entry {isearch-terminators}{6}
+\initial {K}
+\entry {keymap}{6}
+\entry {\code {kill-line (C-k)}}{16}
+\entry {\code {kill-region ()}}{16}
+\entry {\code {kill-whole-line ()}}{16}
+\entry {\code {kill-word (M-d)}}{16}
+\initial {M}
+\entry {mark-modified-lines}{6}
+\entry {mark-symlinked-directories}{6}
+\entry {match-hidden-files}{6}
+\entry {\code {menu-complete ()}}{17}
+\entry {meta-flag}{6}
+\initial {N}
+\entry {\code {next-history (C-n)}}{14}
+\entry {\code {non-incremental-forward-search-history (M-n)}}{14}
+\entry {\code {non-incremental-reverse-search-history (M-p)}}{14}
+\initial {O}
+\entry {output-meta}{7}
+\entry {\code {overwrite-mode ()}}{15}
+\initial {P}
+\entry {page-completions}{7}
+\entry {\code {possible-completions (M-?)}}{17}
+\entry {\code {prefix-meta (\key {ESC})}}{18}
+\entry {\code {previous-history (C-p)}}{14}
+\initial {Q}
+\entry {\code {quoted-insert (C-q or C-v)}}{15}
+\initial {R}
+\entry {\code {re-read-init-file (C-x C-r)}}{18}
+\entry {\code {readline}}{21}
+\entry {\code {redraw-current-line ()}}{13}
+\entry {\code {reverse-search-history (C-r)}}{14}
+\entry {\code {revert-line (M-r)}}{18}
+\entry {\code {rl_add_defun}}{28}
+\entry {\code {rl_add_funmap_entry}}{31}
+\entry {\code {rl_add_undo}}{32}
+\entry {\code {rl_alphabetic}}{36}
+\entry {\code {rl_already_prompted}}{25}
+\entry {\code {rl_attempted_completion_function}}{43}
+\entry {\code {rl_attempted_completion_over}}{46}
+\entry {\code {rl_basic_quote_characters}}{44}
+\entry {\code {rl_basic_word_break_characters}}{44}
+\entry {\code {rl_begin_undo_group}}{32}
+\entry {\code {rl_bind_key}}{29}
+\entry {\code {rl_bind_key_if_unbound}}{29}
+\entry {\code {rl_bind_key_if_unbound_in_map}}{29}
+\entry {\code {rl_bind_key_in_map}}{29}
+\entry {\code {rl_bind_keyseq}}{30}
+\entry {\code {rl_bind_keyseq_if_unbound}}{30}
+\entry {\code {rl_bind_keyseq_if_unbound_in_map}}{30}
+\entry {\code {rl_bind_keyseq_in_map}}{30}
+\entry {\code {rl_binding_keymap}}{26}
+\entry {\code {rl_callback_handler_install}}{37}
+\entry {\code {rl_callback_handler_remove}}{37}
+\entry {\code {rl_callback_read_char}}{37}
+\entry {\code {rl_catch_signals}}{40}
+\entry {\code {rl_catch_sigwinch}}{40}
+\entry {\code {rl_char_is_quoted_p}}{44}
+\entry {\code {rl_cleanup_after_signal}}{40}
+\entry {\code {rl_clear_message}}{33}
+\entry {\code {rl_clear_pending_input}}{35}
+\entry {\code {rl_clear_signals}}{41}
+\entry {\code {rl_complete}}{42}
+\entry {\code {rl_complete_internal}}{42}
+\entry {\code {rl_completer_quote_characters}}{45}
+\entry {\code {rl_completer_word_break_characters}}{45}
+\entry {\code {rl_completion_append_character}}{45}
+\entry {\code {rl_completion_display_matches_hook}}{44}
+\entry {\code {rl_completion_entry_function}}{42, 43}
+\entry {\code {rl_completion_mark_symlink_dirs}}{45}
+\entry {\code {rl_completion_matches}}{42}
+\entry {\code {rl_completion_mode}}{42}
+\entry {\code {rl_completion_query_items}}{45}
+\entry {\code {rl_completion_suppress_append}}{45}
+\entry {\code {rl_completion_type}}{46}
+\entry {\code {rl_copy_keymap}}{28}
+\entry {\code {rl_copy_text}}{34}
+\entry {\code {rl_crlf}}{33}
+\entry {\code {rl_delete_text}}{34}
+\entry {\code {rl_deprep_term_function}}{26}
+\entry {\code {rl_deprep_terminal}}{35}
+\entry {\code {rl_ding}}{36}
+\entry {\code {rl_directory_completion_hook}}{44}
+\entry {\code {rl_discard_keymap}}{29}
+\entry {\code {rl_dispatching}}{24}
+\entry {\code {rl_display_match_list}}{36}
+\entry {\code {rl_do_undo}}{32}
+\entry {\code {rl_done}}{24}
+\entry {\code {rl_editing_mode}}{28}
+\entry {\code {rl_end}}{24}
+\entry {\code {rl_end_undo_group}}{32}
+\entry {\code {rl_erase_empty_line}}{24}
+\entry {\code {rl_event_hook}}{26}
+\entry {\code {rl_execute_next}}{34}
+\entry {\code {rl_executing_keymap}}{26}
+\entry {\code {rl_executing_macro}}{26}
+\entry {\code {rl_expand_prompt}}{33}
+\entry {\code {rl_explicit_arg}}{27}
+\entry {\code {rl_extend_line_buffer}}{35}
+\entry {\code {rl_filename_completion_desired}}{46}
+\entry {\code {rl_filename_completion_function}}{43}
+\entry {\code {rl_filename_dequoting_function}}{43}
+\entry {\code {rl_filename_quote_characters}}{45}
+\entry {\code {rl_filename_quoting_desired}}{46}
+\entry {\code {rl_filename_quoting_function}}{43}
+\entry {\code {rl_forced_update_display}}{33}
+\entry {\code {rl_free_line_state}}{40}
+\entry {\code {rl_free_undo_list}}{32}
+\entry {\code {rl_function_dumper}}{31}
+\entry {\code {rl_function_of_keyseq}}{31}
+\entry {\code {rl_funmap_names}}{31}
+\entry {\code {rl_generic_bind}}{30}
+\entry {\code {rl_get_keymap}}{29}
+\entry {\code {rl_get_keymap_by_name}}{29}
+\entry {\code {rl_get_keymap_name}}{29}
+\entry {\code {rl_get_screen_size}}{40}
+\entry {\code {rl_get_termcap}}{37}
+\entry {\code {rl_getc}}{34}
+\entry {\code {rl_getc_function}}{26}
+\entry {\code {rl_gnu_readline_p}}{25}
+\entry {\code {rl_ignore_completion_duplicates}}{45}
+\entry {\code {rl_ignore_some_completions_function}}{44}
+\entry {\code {rl_inhibit_completion}}{46}
+\entry {\code {rl_initialize}}{35}
+\entry {\code {rl_insert_completions}}{42}
+\entry {\code {rl_insert_text}}{34}
+\entry {\code {rl_instream}}{25}
+\entry {\code {rl_invoking_keyseqs}}{31}
+\entry {\code {rl_invoking_keyseqs_in_map}}{31}
+\entry {\code {rl_kill_text}}{34}
+\entry {\code {rl_last_func}}{25}
+\entry {\code {rl_library_version}}{25}
+\entry {\code {rl_line_buffer}}{24}
+\entry {\code {rl_list_funmap_names}}{31}
+\entry {\code {rl_macro_bind}}{36}
+\entry {\code {rl_macro_dumper}}{36}
+\entry {\code {rl_make_bare_keymap}}{28}
+\entry {\code {rl_make_keymap}}{28}
+\entry {\code {rl_mark}}{24}
+\entry {\code {rl_message}}{33}
+\entry {\code {rl_modifying}}{32}
+\entry {\code {rl_named_function}}{31}
+\entry {\code {rl_num_chars_to_read}}{24}
+\entry {\code {rl_numeric_arg}}{28}
+\entry {\code {rl_on_new_line}}{33}
+\entry {\code {rl_on_new_line_with_prompt}}{33}
+\entry {\code {rl_outstream}}{25}
+\entry {\code {rl_parse_and_bind}}{30}
+\entry {\code {rl_pending_input}}{24}
+\entry {\code {rl_point}}{24}
+\entry {\code {rl_possible_completions}}{42}
+\entry {\code {rl_pre_input_hook}}{25}
+\entry {\code {rl_prep_term_function}}{26}
+\entry {\code {rl_prep_terminal}}{35}
+\entry {\code {rl_prompt}}{25}
+\entry {\code {rl_push_macro_input}}{34}
+\entry {\code {rl_read_init_file}}{31}
+\entry {\code {rl_read_key}}{34}
+\entry {\code {rl_readline_name}}{25}
+\entry {\code {rl_readline_state}}{26}
+\entry {\code {rl_readline_version}}{25}
+\entry {\code {rl_redisplay}}{32}
+\entry {\code {rl_redisplay_function}}{26}
+\entry {\code {rl_replace_line}}{35}
+\entry {\code {rl_reset_after_signal}}{40}
+\entry {\code {rl_reset_line_state}}{33}
+\entry {\code {rl_reset_terminal}}{35}
+\entry {\code {rl_resize_terminal}}{40}
+\entry {\code {rl_restore_prompt}}{33}
+\entry {\code {rl_save_prompt}}{33}
+\entry {\code {rl_set_key}}{30}
+\entry {\code {rl_set_keyboard_input_timeout}}{35}
+\entry {\code {rl_set_keymap}}{29}
+\entry {\code {rl_set_paren_blink_timeout}}{37}
+\entry {\code {rl_set_prompt}}{34}
+\entry {\code {rl_set_screen_size}}{40}
+\entry {\code {rl_set_signals}}{41}
+\entry {\code {rl_show_char}}{33}
+\entry {\code {rl_special_prefixes}}{45}
+\entry {\code {rl_startup_hook}}{25}
+\entry {\code {rl_stuff_char}}{34}
+\entry {\code {rl_terminal_name}}{25}
+\entry {\code {rl_tty_set_default_bindings}}{35}
+\entry {\code {rl_tty_unset_default_bindings}}{35}
+\entry {\code {rl_unbind_command_in_map}}{30}
+\entry {\code {rl_unbind_function_in_map}}{30}
+\entry {\code {rl_unbind_key}}{30}
+\entry {\code {rl_unbind_key_in_map}}{30}
+\entry {\code {rl_username_completion_function}}{43}
+\entry {\code {rl_variable_bind}}{37}
+\entry {\code {rl_variable_dumper}}{37}
+\initial {S}
+\entry {\code {self-insert (a, b, A, 1, !, \dots {})}}{15}
+\entry {\code {set-mark (C-@)}}{18}
+\entry {show-all-if-ambiguous}{7}
+\entry {show-all-if-unmodified}{7}
+\entry {\code {start-kbd-macro (C-x ()}}{18}
+\initial {T}
+\entry {\code {tab-insert (M-\key {TAB})}}{15}
+\entry {\code {tilde-expand (M-~)}}{18}
+\entry {\code {transpose-chars (C-t)}}{15}
+\entry {\code {transpose-words (M-t)}}{15}
+\initial {U}
+\entry {\code {undo (C-_ or C-x C-u)}}{18}
+\entry {\code {universal-argument ()}}{17}
+\entry {\code {unix-line-discard (C-u)}}{16}
+\entry {\code {unix-word-rubout (C-w)}}{16}
+\entry {\code {upcase-word (M-u)}}{15}
+\initial {V}
+\entry {\code {vi-editing-mode (M-C-j)}}{19}
+\entry {visible-stats}{7}
+\initial {Y}
+\entry {\code {yank (C-y)}}{16}
+\entry {\code {yank-last-arg (M-. or M-_)}}{14}
+\entry {\code {yank-nth-arg (M-C-y)}}{14}
+\entry {\code {yank-pop (M-y)}}{17}
diff --git a/lib/readline/doc/rlman.ky b/lib/readline/doc/rlman.ky
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/rlman.log b/lib/readline/doc/rlman.log
new file mode 100644 (file)
index 0000000..08f7ef0
--- /dev/null
@@ -0,0 +1,213 @@
+This is TeX, Version 3.14159 (Web2C 7.3.1) (format=tex 2001.2.12)  22 SEP 2003 09:04
+**/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rlman.te
+xi
+
+(/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rlman.tex
+i (texinfo.tex Loading texinfo [version 2003-02-03.16]: Basics,
+\bindingoffset=\dimen16
+\normaloffset=\dimen17
+\pagewidth=\dimen18
+\pageheight=\dimen19
+\outerhsize=\dimen20
+\outervsize=\dimen21
+\cornerlong=\dimen22
+\cornerthick=\dimen23
+\topandbottommargin=\dimen24
+\headlinebox=\box16
+\footlinebox=\box17
+\margin=\insert252
+\EMsimple=\toks12
+\groupbox=\box18
+\groupinvalidhelp=\toks13
+\mil=\dimen25
+\exdentamount=\skip18
+\inmarginspacing=\skip19
+ pdf,
+\tempnum=\count26
+\lnkcount=\count27
+\filename=\toks14
+\filenamelength=\count28
+\pgn=\count29
+\toksA=\toks15
+\toksB=\toks16
+\toksC=\toks17
+\toksD=\toks18
+\boxA=\box19
+\countA=\count30
+ fonts,
+\sffam=\fam8
+\textleading=\dimen26
+\mainmagstep=\count31
+\fontdepth=\count32
+
+page headings,
+\titlepagetopglue=\skip20
+\titlepagebottomglue=\skip21
+\evenheadline=\toks19
+\oddheadline=\toks20
+\evenfootline=\toks21
+\oddfootline=\toks22
+ tables,
+\tableindent=\dimen27
+\itemindent=\dimen28
+\itemmargin=\dimen29
+\itemmax=\dimen30
+\itemno=\count33
+\multitableparskip=\skip22
+\multitableparindent=\skip23
+\multitablecolspace=\dimen31
+\multitablelinespace=\skip24
+\colcount=\count34
+\savedfootnotes=\box20
+ conditionals, indexing,
+\secondaryindent=\skip25
+\partialpage=\box21
+\doublecolumnhsize=\dimen32
+ sectioning,
+\chapno=\count35
+\secno=\count36
+\subsecno=\count37
+\subsubsecno=\count38
+\appendixno=\count39
+\absseclevel=\count40
+\secbase=\count41
+\chapheadingskip=\skip26
+\secheadingskip=\skip27
+\subsecheadingskip=\skip28
+ toc,
+\tocfile=\write0
+\contentsrightmargin=\skip29
+\savepageno=\count42
+\lastnegativepageno=\count43
+\shortappendixwidth=\dimen33
+\tocindent=\dimen34
+ environments,
+\errorbox=\box22
+\lispnarrowing=\skip30
+\envskipamount=\skip31
+\circthick=\dimen35
+\cartouter=\dimen36
+\cartinner=\dimen37
+\normbskip=\skip32
+\normpskip=\skip33
+\normlskip=\skip34
+\lskip=\skip35
+\rskip=\skip36
+\tabw=\dimen38
+
+defuns,
+\defbodyindent=\skip37
+\defargsindent=\skip38
+\deflastargmargin=\skip39
+\parencount=\count44
+ macros,
+\macscribble=\write1
+\paramno=\count45
+\macname=\toks23
+ cross references,
+\auxfile=\write2
+\savesfregister=\count46
+\footnoteno=\count47
+
+(/usr/local/share/texmf/tex/plain/dvips/epsf.tex
+\epsffilein=\read0
+\epsfframemargin=\dimen39
+\epsfframethickness=\dimen40
+\epsfrsize=\dimen41
+\epsftmp=\dimen42
+\epsftsize=\dimen43
+\epsfxsize=\dimen44
+\epsfysize=\dimen45
+\pspoints=\dimen46
+\epsfnoopenhelp=\toks24
+)
+\noepsfhelp=\toks25
+ localization,
+\nolanghelp=\toks26
+\defaultparindent=\dimen47
+
+and turning on texinfo input format.) (rlman.aux)
+@cpindfile=@write3
+@fnindfile=@write4
+@vrindfile=@write5
+@tpindfile=@write6
+@kyindfile=@write7
+@pgindfile=@write8
+ (version.texi) [1
+\openout2 = `rlman.aux'.
+
+\openout3 = `rlman.cp'.
+
+\openout4 = `rlman.fn'.
+
+\openout5 = `rlman.vr'.
+
+\openout6 = `rlman.tp'.
+
+\openout7 = `rlman.ky'.
+
+\openout8 = `rlman.pg'.
+
+] [2]
+(rlman.toc [-1]) [-2] (rluser.texi
+@btindfile=@write9
+ Chapter 1
+\openout0 = `rlman.toc'.
+
+ [1
+\openout9 = `rlman.bt'.
+
+] [2] [3] [4] [5]
+Underfull \hbox (badness 5231) in paragraph at lines 488--504
+ @texttt emacs-meta[]@textrm , @texttt emacs-ctlx[]@textrm , @texttt vi[]@textr
+m , @texttt vi-move[]@textrm , @texttt vi-command[]@textrm , and
+
+@hbox(7.60416+2.12917)x433.62, glue set 3.7426
+.@glue(@leftskip) 115.63242
+.@texttt e
+.@texttt m
+.@texttt a
+.@texttt c
+.etc.
+
+[6] [7] [8] [9] [10]
+Overfull \hbox (26.43913pt too wide) in paragraph at lines 801--801
+ []@texttt Meta-Control-h: backward-kill-word Text after the function name is i
+gnored[] |
+
+@hbox(6.69167+2.43333)x433.62
+.@glue(@leftskip) 28.90755
+.@hbox(0.0+0.0)x0.0
+.@texttt M
+.@texttt e
+.@texttt t
+.etc.
+
+[11] [12] [13] [14] [15] [16] [17] [18]) (rltech.texi Chapter 2 [19] [20]
+[21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35]
+[36] [37] [38] [39] [40] [41] [42] [43] [44] [45]
+Underfull \hbox (badness 7379) in paragraph at lines 1757--1762
+ []@textrm If an application-specific com-ple-tion func-tion as-signed to @text
+tt rl_attempted_
+
+@hbox(7.60416+2.43333)x433.62, glue set 4.19675
+.@glue(@leftskip) 28.90755
+.@hbox(0.0+0.0)x0.0
+.@textrm I
+.@textrm f
+.@glue 3.65 plus 1.825 minus 1.21666
+.etc.
+
+[46] [47] [48] [49] [50] [51] [52] [53]) Appendix A [54] (fdl.texi [55]
+[56] [57] [58] [59] [60]) (Concept Index) [61] [62] (rlman.cps)
+(Function and Variable Index) [63] [64] (rlman.fns [65] [66]) [67] [68] ) 
+Here is how much of TeX's memory you used:
+ 1489 strings out of 13013
+ 18350 string characters out of 97233
+ 56934 words of memory out of 263001
+ 2361 multiletter control sequences out of 10000+0
+ 31953 words of font info for 111 fonts, out of 400000 for 1000
+ 19 hyphenation exceptions out of 1000
+ 15i,8n,17p,304b,695s stack positions out of 300i,100n,500p,50000b,4000s
+
+Output written on rlman.dvi (72 pages, 270424 bytes).
diff --git a/lib/readline/doc/rlman.pg b/lib/readline/doc/rlman.pg
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/rlman.toc b/lib/readline/doc/rlman.toc
new file mode 100644 (file)
index 0000000..9d08ef5
--- /dev/null
@@ -0,0 +1,53 @@
+\chapentry{Command Line Editing}{1}{1}
+\secentry{Introduction to Line Editing}{1}{1}{1}
+\secentry{Readline Interaction}{1}{2}{1}
+\subsecentry{Readline Bare Essentials}{1}{2}{1}{1}
+\subsecentry{Readline Movement Commands}{1}{2}{2}{2}
+\subsecentry{Readline Killing Commands}{1}{2}{3}{2}
+\subsecentry{Readline Arguments}{1}{2}{4}{3}
+\subsecentry{Searching for Commands in the History}{1}{2}{5}{3}
+\secentry{Readline Init File}{1}{3}{4}
+\subsecentry{Readline Init File Syntax}{1}{3}{1}{4}
+\subsecentry{Conditional Init Constructs}{1}{3}{2}{9}
+\subsecentry{Sample Init File}{1}{3}{3}{10}
+\secentry{Bindable Readline Commands}{1}{4}{13}
+\subsecentry{Commands For Moving}{1}{4}{1}{13}
+\subsecentry{Commands For Manipulating The History}{1}{4}{2}{13}
+\subsecentry{Commands For Changing Text}{1}{4}{3}{14}
+\subsecentry{Killing And Yanking}{1}{4}{4}{16}
+\subsecentry{Specifying Numeric Arguments}{1}{4}{5}{17}
+\subsecentry{Letting Readline Type For You}{1}{4}{6}{17}
+\subsecentry{Keyboard Macros}{1}{4}{7}{17}
+\subsecentry{Some Miscellaneous Commands}{1}{4}{8}{18}
+\secentry{Readline vi Mode}{1}{5}{19}
+\chapentry{Programming with GNU Readline}{2}{21}
+\secentry{Basic Behavior}{2}{1}{21}
+\secentry{Custom Functions}{2}{2}{22}
+\subsecentry{Readline Typedefs}{2}{2}{1}{22}
+\subsecentry{Writing a New Function}{2}{2}{2}{23}
+\secentry{Readline Variables}{2}{3}{24}
+\secentry{Readline Convenience Functions}{2}{4}{28}
+\subsecentry{Naming a Function}{2}{4}{1}{28}
+\subsecentry{Selecting a Keymap}{2}{4}{2}{28}
+\subsecentry{Binding Keys}{2}{4}{3}{29}
+\subsecentry{Associating Function Names and Bindings}{2}{4}{4}{31}
+\subsecentry{Allowing Undoing}{2}{4}{5}{31}
+\subsecentry{Redisplay}{2}{4}{6}{32}
+\subsecentry{Modifying Text}{2}{4}{7}{34}
+\subsecentry{Character Input}{2}{4}{8}{34}
+\subsecentry{Terminal Management}{2}{4}{9}{35}
+\subsecentry{Utility Functions}{2}{4}{10}{35}
+\subsecentry{Miscellaneous Functions}{2}{4}{11}{36}
+\subsecentry{Alternate Interface}{2}{4}{12}{37}
+\subsecentry{A Readline Example}{2}{4}{13}{38}
+\secentry{Readline Signal Handling}{2}{5}{39}
+\secentry{Custom Completers}{2}{6}{41}
+\subsecentry{How Completing Works}{2}{6}{1}{41}
+\subsecentry{Completion Functions}{2}{6}{2}{42}
+\subsecentry{Completion Variables}{2}{6}{3}{43}
+\subsecentry{A Short Completion Example}{2}{6}{4}{46}
+\appendixentry{Copying This Manual}{A}{55}
+\secentry{GNU Free Documentation License}{A}{1}{55}
+\subsecentry{ADDENDUM: How to use this License for your documents}{A}{1}{1}{61}
+\unnumbchapentry{Concept Index}{2}{63}
+\unnumbchapentry{Function and Variable Index}{2}{65}
diff --git a/lib/readline/doc/rlman.tp b/lib/readline/doc/rlman.tp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/rlman.vr b/lib/readline/doc/rlman.vr
new file mode 100644 (file)
index 0000000..e69de29
index 95c4177..007a8d7 100644 (file)
@@ -1709,9 +1709,23 @@ an application-specific command line syntax specification.
 
 @deftypevar int rl_completion_suppress_append
 If non-zero, @var{rl_completion_append_character} is not appended to
-matches at the end of the command line, as described above.  It is
-set to 0 before any application-specific completion function is called,
-and may only be changed within such a function.
+matches at the end of the command line, as described above.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
+@end deftypevar
+
+@deftypevar int rl_completion_quote_character
+When Readline is completing quoted text, as delimited by one of the
+characters in @var{rl_completer_quote_characters}, it sets this variable
+to the quoting character found.
+This is set before any application-specific completion function is called.
+@end deftypevar
+
+@deftypevar int rl_completion_suppress_quote
+If non-zero, Readline does not append a matching quote character when
+performing completion on a quoted string.
+It is set to 0 before any application-specific completion function
+is called, and may only be changed within such a function.
 @end deftypevar
 
 @deftypevar int rl_completion_mark_symlink_dirs
diff --git a/lib/readline/doc/rluserman.aux b/lib/readline/doc/rluserman.aux
new file mode 100644 (file)
index 0000000..ef7577c
--- /dev/null
@@ -0,0 +1,72 @@
+@xrdef{Command Line Editing-title}{Command Line Editing}
+@xrdef{Command Line Editing-pg}{1}
+@xrdef{Command Line Editing-snt}{Chapter@tie 1}
+@xrdef{Introduction and Notation-title}{Introduction to Line Editing}
+@xrdef{Introduction and Notation-pg}{1}
+@xrdef{Introduction and Notation-snt}{Section@tie 1.1}
+@xrdef{Readline Interaction-title}{Readline Interaction}
+@xrdef{Readline Interaction-pg}{1}
+@xrdef{Readline Interaction-snt}{Section@tie 1.2}
+@xrdef{Readline Bare Essentials-title}{Readline Bare Essentials}
+@xrdef{Readline Bare Essentials-pg}{1}
+@xrdef{Readline Bare Essentials-snt}{Section@tie 1.2.1}
+@xrdef{Readline Movement Commands-title}{Readline Movement Commands}
+@xrdef{Readline Movement Commands-pg}{2}
+@xrdef{Readline Movement Commands-snt}{Section@tie 1.2.2}
+@xrdef{Readline Killing Commands-title}{Readline Killing Commands}
+@xrdef{Readline Killing Commands-pg}{2}
+@xrdef{Readline Killing Commands-snt}{Section@tie 1.2.3}
+@xrdef{Readline Arguments-title}{Readline Arguments}
+@xrdef{Readline Arguments-pg}{3}
+@xrdef{Readline Arguments-snt}{Section@tie 1.2.4}
+@xrdef{Searching-title}{Searching for Commands in the History}
+@xrdef{Searching-pg}{3}
+@xrdef{Searching-snt}{Section@tie 1.2.5}
+@xrdef{Readline Init File-title}{Readline Init File}
+@xrdef{Readline Init File-pg}{4}
+@xrdef{Readline Init File-snt}{Section@tie 1.3}
+@xrdef{Readline Init File Syntax-title}{Readline Init File Syntax}
+@xrdef{Readline Init File Syntax-pg}{4}
+@xrdef{Readline Init File Syntax-snt}{Section@tie 1.3.1}
+@xrdef{Conditional Init Constructs-title}{Conditional Init Constructs}
+@xrdef{Conditional Init Constructs-pg}{9}
+@xrdef{Conditional Init Constructs-snt}{Section@tie 1.3.2}
+@xrdef{Sample Init File-title}{Sample Init File}
+@xrdef{Sample Init File-pg}{10}
+@xrdef{Sample Init File-snt}{Section@tie 1.3.3}
+@xrdef{Bindable Readline Commands-title}{Bindable Readline Commands}
+@xrdef{Bindable Readline Commands-pg}{13}
+@xrdef{Bindable Readline Commands-snt}{Section@tie 1.4}
+@xrdef{Commands For Moving-title}{Commands For Moving}
+@xrdef{Commands For Moving-pg}{13}
+@xrdef{Commands For Moving-snt}{Section@tie 1.4.1}
+@xrdef{Commands For History-title}{Commands For Manipulating The History}
+@xrdef{Commands For History-pg}{13}
+@xrdef{Commands For History-snt}{Section@tie 1.4.2}
+@xrdef{Commands For Text-title}{Commands For Changing Text}
+@xrdef{Commands For Text-pg}{15}
+@xrdef{Commands For Text-snt}{Section@tie 1.4.3}
+@xrdef{Commands For Killing-title}{Killing And Yanking}
+@xrdef{Commands For Killing-pg}{16}
+@xrdef{Commands For Killing-snt}{Section@tie 1.4.4}
+@xrdef{Numeric Arguments-title}{Specifying Numeric Arguments}
+@xrdef{Numeric Arguments-pg}{17}
+@xrdef{Numeric Arguments-snt}{Section@tie 1.4.5}
+@xrdef{Commands For Completion-title}{Letting Readline Type For You}
+@xrdef{Commands For Completion-pg}{17}
+@xrdef{Commands For Completion-snt}{Section@tie 1.4.6}
+@xrdef{Keyboard Macros-title}{Keyboard Macros}
+@xrdef{Keyboard Macros-pg}{18}
+@xrdef{Keyboard Macros-snt}{Section@tie 1.4.7}
+@xrdef{Miscellaneous Commands-title}{Some Miscellaneous Commands}
+@xrdef{Miscellaneous Commands-pg}{18}
+@xrdef{Miscellaneous Commands-snt}{Section@tie 1.4.8}
+@xrdef{Readline vi Mode-title}{Readline vi Mode}
+@xrdef{Readline vi Mode-pg}{19}
+@xrdef{Readline vi Mode-snt}{Section@tie 1.5}
+@xrdef{Copying This Manual-title}{Copying This Manual}
+@xrdef{Copying This Manual-pg}{21}
+@xrdef{Copying This Manual-snt}{Appendix@tie @char65{}}
+@xrdef{GNU Free Documentation License-title}{GNU Free Documentation License}
+@xrdef{GNU Free Documentation License-pg}{21}
+@xrdef{GNU Free Documentation License-snt}{Section@tie @char65.1}
diff --git a/lib/readline/doc/rluserman.bt b/lib/readline/doc/rluserman.bt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/rluserman.cp b/lib/readline/doc/rluserman.cp
new file mode 100644 (file)
index 0000000..7a1c35e
--- /dev/null
@@ -0,0 +1,10 @@
+\entry{interaction, readline}{1}{interaction, readline}
+\entry{notation, readline}{1}{notation, readline}
+\entry{command editing}{1}{command editing}
+\entry{editing command lines}{1}{editing command lines}
+\entry{killing text}{2}{killing text}
+\entry{yanking text}{2}{yanking text}
+\entry{kill ring}{3}{kill ring}
+\entry{initialization file, readline}{4}{initialization file, readline}
+\entry{variables, readline}{5}{variables, readline}
+\entry{FDL, GNU Free Documentation License}{21}{FDL, GNU Free Documentation License}
diff --git a/lib/readline/doc/rluserman.cps b/lib/readline/doc/rluserman.cps
new file mode 100644 (file)
index 0000000..53f1331
--- /dev/null
@@ -0,0 +1,18 @@
+\initial {C}
+\entry {command editing}{1}
+\initial {E}
+\entry {editing command lines}{1}
+\initial {F}
+\entry {FDL, GNU Free Documentation License}{21}
+\initial {I}
+\entry {initialization file, readline}{4}
+\entry {interaction, readline}{1}
+\initial {K}
+\entry {kill ring}{3}
+\entry {killing text}{2}
+\initial {N}
+\entry {notation, readline}{1}
+\initial {V}
+\entry {variables, readline}{5}
+\initial {Y}
+\entry {yanking text}{2}
diff --git a/lib/readline/doc/rluserman.dvi b/lib/readline/doc/rluserman.dvi
new file mode 100644 (file)
index 0000000..f77eb4e
Binary files /dev/null and b/lib/readline/doc/rluserman.dvi differ
diff --git a/lib/readline/doc/rluserman.fn b/lib/readline/doc/rluserman.fn
new file mode 100644 (file)
index 0000000..e073421
--- /dev/null
@@ -0,0 +1,74 @@
+\entry{beginning-of-line (C-a)}{13}{\code {beginning-of-line (C-a)}}
+\entry{end-of-line (C-e)}{13}{\code {end-of-line (C-e)}}
+\entry{forward-char (C-f)}{13}{\code {forward-char (C-f)}}
+\entry{backward-char (C-b)}{13}{\code {backward-char (C-b)}}
+\entry{forward-word (M-f)}{13}{\code {forward-word (M-f)}}
+\entry{backward-word (M-b)}{13}{\code {backward-word (M-b)}}
+\entry{clear-screen (C-l)}{13}{\code {clear-screen (C-l)}}
+\entry{redraw-current-line ()}{13}{\code {redraw-current-line ()}}
+\entry{accept-line (Newline or Return)}{13}{\code {accept-line (Newline or Return)}}
+\entry{previous-history (C-p)}{14}{\code {previous-history (C-p)}}
+\entry{next-history (C-n)}{14}{\code {next-history (C-n)}}
+\entry{beginning-of-history (M-<)}{14}{\code {beginning-of-history (M-<)}}
+\entry{end-of-history (M->)}{14}{\code {end-of-history (M->)}}
+\entry{reverse-search-history (C-r)}{14}{\code {reverse-search-history (C-r)}}
+\entry{forward-search-history (C-s)}{14}{\code {forward-search-history (C-s)}}
+\entry{non-incremental-reverse-search-history (M-p)}{14}{\code {non-incremental-reverse-search-history (M-p)}}
+\entry{non-incremental-forward-search-history (M-n)}{14}{\code {non-incremental-forward-search-history (M-n)}}
+\entry{history-search-forward ()}{14}{\code {history-search-forward ()}}
+\entry{history-search-backward ()}{14}{\code {history-search-backward ()}}
+\entry{yank-nth-arg (M-C-y)}{14}{\code {yank-nth-arg (M-C-y)}}
+\entry{yank-last-arg (M-. or M-_)}{14}{\code {yank-last-arg (M-. or M-_)}}
+\entry{delete-char (C-d)}{15}{\code {delete-char (C-d)}}
+\entry{backward-delete-char (Rubout)}{15}{\code {backward-delete-char (Rubout)}}
+\entry{forward-backward-delete-char ()}{15}{\code {forward-backward-delete-char ()}}
+\entry{quoted-insert (C-q or C-v)}{15}{\code {quoted-insert (C-q or C-v)}}
+\entry{tab-insert (M-TAB)}{15}{\code {tab-insert (M-\key {TAB})}}
+\entry{self-insert (a, b, A, 1, !, ...{})}{15}{\code {self-insert (a, b, A, 1, !, \dots {})}}
+\entry{transpose-chars (C-t)}{15}{\code {transpose-chars (C-t)}}
+\entry{transpose-words (M-t)}{15}{\code {transpose-words (M-t)}}
+\entry{upcase-word (M-u)}{15}{\code {upcase-word (M-u)}}
+\entry{downcase-word (M-l)}{15}{\code {downcase-word (M-l)}}
+\entry{capitalize-word (M-c)}{15}{\code {capitalize-word (M-c)}}
+\entry{overwrite-mode ()}{15}{\code {overwrite-mode ()}}
+\entry{kill-line (C-k)}{16}{\code {kill-line (C-k)}}
+\entry{backward-kill-line (C-x Rubout)}{16}{\code {backward-kill-line (C-x Rubout)}}
+\entry{unix-line-discard (C-u)}{16}{\code {unix-line-discard (C-u)}}
+\entry{kill-whole-line ()}{16}{\code {kill-whole-line ()}}
+\entry{kill-word (M-d)}{16}{\code {kill-word (M-d)}}
+\entry{backward-kill-word (M-DEL)}{16}{\code {backward-kill-word (M-\key {DEL})}}
+\entry{unix-word-rubout (C-w)}{16}{\code {unix-word-rubout (C-w)}}
+\entry{delete-horizontal-space ()}{16}{\code {delete-horizontal-space ()}}
+\entry{kill-region ()}{16}{\code {kill-region ()}}
+\entry{copy-region-as-kill ()}{16}{\code {copy-region-as-kill ()}}
+\entry{copy-backward-word ()}{16}{\code {copy-backward-word ()}}
+\entry{copy-forward-word ()}{16}{\code {copy-forward-word ()}}
+\entry{yank (C-y)}{16}{\code {yank (C-y)}}
+\entry{yank-pop (M-y)}{17}{\code {yank-pop (M-y)}}
+\entry{digit-argument (M-0, M-1, ...{} M--)}{17}{\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}}
+\entry{universal-argument ()}{17}{\code {universal-argument ()}}
+\entry{complete (TAB)}{17}{\code {complete (\key {TAB})}}
+\entry{possible-completions (M-?)}{17}{\code {possible-completions (M-?)}}
+\entry{insert-completions (M-*)}{17}{\code {insert-completions (M-*)}}
+\entry{menu-complete ()}{17}{\code {menu-complete ()}}
+\entry{delete-char-or-list ()}{17}{\code {delete-char-or-list ()}}
+\entry{start-kbd-macro (C-x ()}{18}{\code {start-kbd-macro (C-x ()}}
+\entry{end-kbd-macro (C-x ))}{18}{\code {end-kbd-macro (C-x ))}}
+\entry{call-last-kbd-macro (C-x e)}{18}{\code {call-last-kbd-macro (C-x e)}}
+\entry{re-read-init-file (C-x C-r)}{18}{\code {re-read-init-file (C-x C-r)}}
+\entry{abort (C-g)}{18}{\code {abort (C-g)}}
+\entry{do-uppercase-version (M-a, M-b, M-x, ...{})}{18}{\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}}
+\entry{prefix-meta (ESC)}{18}{\code {prefix-meta (\key {ESC})}}
+\entry{undo (C-_ or C-x C-u)}{18}{\code {undo (C-_ or C-x C-u)}}
+\entry{revert-line (M-r)}{18}{\code {revert-line (M-r)}}
+\entry{tilde-expand (M-~)}{18}{\code {tilde-expand (M-~)}}
+\entry{set-mark (C-@)}{18}{\code {set-mark (C-@)}}
+\entry{exchange-point-and-mark (C-x C-x)}{18}{\code {exchange-point-and-mark (C-x C-x)}}
+\entry{character-search (C-])}{18}{\code {character-search (C-])}}
+\entry{character-search-backward (M-C-])}{19}{\code {character-search-backward (M-C-])}}
+\entry{insert-comment (M-#)}{19}{\code {insert-comment (M-#)}}
+\entry{dump-functions ()}{19}{\code {dump-functions ()}}
+\entry{dump-variables ()}{19}{\code {dump-variables ()}}
+\entry{dump-macros ()}{19}{\code {dump-macros ()}}
+\entry{emacs-editing-mode (C-e)}{19}{\code {emacs-editing-mode (C-e)}}
+\entry{vi-editing-mode (M-C-j)}{19}{\code {vi-editing-mode (M-C-j)}}
diff --git a/lib/readline/doc/rluserman.fns b/lib/readline/doc/rluserman.fns
new file mode 100644 (file)
index 0000000..9514015
--- /dev/null
@@ -0,0 +1,94 @@
+\initial {A}
+\entry {\code {abort (C-g)}}{18}
+\entry {\code {accept-line (Newline or Return)}}{13}
+\initial {B}
+\entry {\code {backward-char (C-b)}}{13}
+\entry {\code {backward-delete-char (Rubout)}}{15}
+\entry {\code {backward-kill-line (C-x Rubout)}}{16}
+\entry {\code {backward-kill-word (M-\key {DEL})}}{16}
+\entry {\code {backward-word (M-b)}}{13}
+\entry {\code {beginning-of-history (M-<)}}{14}
+\entry {\code {beginning-of-line (C-a)}}{13}
+\initial {C}
+\entry {\code {call-last-kbd-macro (C-x e)}}{18}
+\entry {\code {capitalize-word (M-c)}}{15}
+\entry {\code {character-search (C-])}}{18}
+\entry {\code {character-search-backward (M-C-])}}{19}
+\entry {\code {clear-screen (C-l)}}{13}
+\entry {\code {complete (\key {TAB})}}{17}
+\entry {\code {copy-backward-word ()}}{16}
+\entry {\code {copy-forward-word ()}}{16}
+\entry {\code {copy-region-as-kill ()}}{16}
+\initial {D}
+\entry {\code {delete-char (C-d)}}{15}
+\entry {\code {delete-char-or-list ()}}{17}
+\entry {\code {delete-horizontal-space ()}}{16}
+\entry {\code {digit-argument (\kbd {M-0}, \kbd {M-1}, \dots {} \kbd {M--})}}{17}
+\entry {\code {do-uppercase-version (M-a, M-b, M-\var {x}, \dots {})}}{18}
+\entry {\code {downcase-word (M-l)}}{15}
+\entry {\code {dump-functions ()}}{19}
+\entry {\code {dump-macros ()}}{19}
+\entry {\code {dump-variables ()}}{19}
+\initial {E}
+\entry {\code {emacs-editing-mode (C-e)}}{19}
+\entry {\code {end-kbd-macro (C-x ))}}{18}
+\entry {\code {end-of-history (M->)}}{14}
+\entry {\code {end-of-line (C-e)}}{13}
+\entry {\code {exchange-point-and-mark (C-x C-x)}}{18}
+\initial {F}
+\entry {\code {forward-backward-delete-char ()}}{15}
+\entry {\code {forward-char (C-f)}}{13}
+\entry {\code {forward-search-history (C-s)}}{14}
+\entry {\code {forward-word (M-f)}}{13}
+\initial {H}
+\entry {\code {history-search-backward ()}}{14}
+\entry {\code {history-search-forward ()}}{14}
+\initial {I}
+\entry {\code {insert-comment (M-#)}}{19}
+\entry {\code {insert-completions (M-*)}}{17}
+\initial {K}
+\entry {\code {kill-line (C-k)}}{16}
+\entry {\code {kill-region ()}}{16}
+\entry {\code {kill-whole-line ()}}{16}
+\entry {\code {kill-word (M-d)}}{16}
+\initial {M}
+\entry {\code {menu-complete ()}}{17}
+\initial {N}
+\entry {\code {next-history (C-n)}}{14}
+\entry {\code {non-incremental-forward-search-history (M-n)}}{14}
+\entry {\code {non-incremental-reverse-search-history (M-p)}}{14}
+\initial {O}
+\entry {\code {overwrite-mode ()}}{15}
+\initial {P}
+\entry {\code {possible-completions (M-?)}}{17}
+\entry {\code {prefix-meta (\key {ESC})}}{18}
+\entry {\code {previous-history (C-p)}}{14}
+\initial {Q}
+\entry {\code {quoted-insert (C-q or C-v)}}{15}
+\initial {R}
+\entry {\code {re-read-init-file (C-x C-r)}}{18}
+\entry {\code {redraw-current-line ()}}{13}
+\entry {\code {reverse-search-history (C-r)}}{14}
+\entry {\code {revert-line (M-r)}}{18}
+\initial {S}
+\entry {\code {self-insert (a, b, A, 1, !, \dots {})}}{15}
+\entry {\code {set-mark (C-@)}}{18}
+\entry {\code {start-kbd-macro (C-x ()}}{18}
+\initial {T}
+\entry {\code {tab-insert (M-\key {TAB})}}{15}
+\entry {\code {tilde-expand (M-~)}}{18}
+\entry {\code {transpose-chars (C-t)}}{15}
+\entry {\code {transpose-words (M-t)}}{15}
+\initial {U}
+\entry {\code {undo (C-_ or C-x C-u)}}{18}
+\entry {\code {universal-argument ()}}{17}
+\entry {\code {unix-line-discard (C-u)}}{16}
+\entry {\code {unix-word-rubout (C-w)}}{16}
+\entry {\code {upcase-word (M-u)}}{15}
+\initial {V}
+\entry {\code {vi-editing-mode (M-C-j)}}{19}
+\initial {Y}
+\entry {\code {yank (C-y)}}{16}
+\entry {\code {yank-last-arg (M-. or M-_)}}{14}
+\entry {\code {yank-nth-arg (M-C-y)}}{14}
+\entry {\code {yank-pop (M-y)}}{17}
diff --git a/lib/readline/doc/rluserman.html b/lib/readline/doc/rluserman.html
new file mode 100644 (file)
index 0000000..1aa7778
--- /dev/null
@@ -0,0 +1,2770 @@
+<HTML>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!-- Created on September, 22  2003 by texi2html 1.64 -->
+<!-- 
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+            Karl Berry  <karl@freefriends.org>
+            Olaf Bachmann <obachman@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
+-->
+<HEAD>
+<TITLE>GNU Readline Library: </TITLE>
+
+<META NAME="description" CONTENT="GNU Readline Library: ">
+<META NAME="keywords" CONTENT="GNU Readline Library: ">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.64">
+
+</HEAD>
+
+<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC_Top"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>GNU Readline Library</H1></P><P>
+
+This document describes the end user interface of the GNU Readline Library,
+a utility which aids in the consistency of user interface across discrete
+programs which provide a command line interface.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC1">1. Command Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">GNU Readline User's Manual.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC23">A. Copying This Manual</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<HR SIZE=1>
+<A NAME="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<A NAME="Command Line Editing"></A>
+<H1> 1. Command Line Editing </H1>
+<!--docid::SEC1::-->
+<P>
+
+This chapter describes the basic features of the GNU
+command line editing interface.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC2">1.1 Introduction to Line Editing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Notation used in this text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC3">1.2 Readline Interaction</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The minimum set of commands for editing a line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC9">1.3 Readline Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Customizing Readline from a user's view.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC13">1.4 Bindable Readline Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A description of most of the Readline commands
+                               available for binding</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC22">1.5 Readline vi Mode</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A short description of how to make Readline
+                               behave like the vi editor.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Introduction and Notation"></A>
+<HR SIZE="6">
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.1 Introduction to Line Editing </H2>
+<!--docid::SEC2::-->
+<P>
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+</P><P>
+
+The text <KBD>C-k</KBD> is read as `Control-K' and describes the character
+produced when the <KBD>k</KBD> key is pressed while the Control key
+is depressed.
+</P><P>
+
+The text <KBD>M-k</KBD> is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <KBD>k</KBD>
+key is pressed.
+The Meta key is labeled <KBD>ALT</KBD> on many keyboards.
+On keyboards with two keys labeled <KBD>ALT</KBD> (usually to either side of
+the space bar), the <KBD>ALT</KBD> on the left side is generally set to
+work as a Meta key.
+The <KBD>ALT</KBD> key on the right may also be configured to work as a
+Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+</P><P>
+
+If you do not have a Meta or <KBD>ALT</KBD> key, or another key working as
+a Meta key, the identical keystroke can be generated by typing <KBD>ESC</KBD>
+<EM>first</EM>, and then typing <KBD>k</KBD>.
+Either process is known as <EM>metafying</EM> the <KBD>k</KBD> key.
+</P><P>
+
+The text <KBD>M-C-k</KBD> is read as `Meta-Control-k' and describes the
+character produced by <EM>metafying</EM> <KBD>C-k</KBD>.
+</P><P>
+
+In addition, several keys have their own names.  Specifically,
+<KBD>DEL</KBD>, <KBD>ESC</KBD>, <KBD>LFD</KBD>, <KBD>SPC</KBD>, <KBD>RET</KBD>, and <KBD>TAB</KBD> all
+stand for themselves when seen in this text, or in an init file
+(see section <A HREF="rluserman.html#SEC9">1.3 Readline Init File</A>).
+If your keyboard lacks a <KBD>LFD</KBD> key, typing <KBD>C-j</KBD> will
+produce the desired character.
+The <KBD>RET</KBD> key may be labeled <KBD>Return</KBD> or <KBD>Enter</KBD> on
+some keyboards.
+</P><P>
+
+<A NAME="Readline Interaction"></A>
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.2 Readline Interaction </H2>
+<!--docid::SEC3::-->
+<P>
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <KBD>RET</KBD>.  You do not have to be at the
+end of the line to press <KBD>RET</KBD>; the entire line is accepted
+regardless of the location of the cursor within the line.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC4">1.2.1 Readline Bare Essentials</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The least you need to know about Readline.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC5">1.2.2 Readline Movement Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the input line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC6">1.2.3 Readline Killing Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to delete text, and how to get it back!</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC7">1.2.4 Readline Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Giving numeric arguments to commands.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC8">1.2.5 Searching for Commands in the History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Searching through previous lines.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Bare Essentials"></A>
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.1 Readline Bare Essentials </H3>
+<!--docid::SEC4::-->
+<P>
+
+In order to enter characters into the line, simply type them.  The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+</P><P>
+
+Sometimes you may mistype a character, and
+not notice the error until you have typed several other characters.  In
+that case, you can type <KBD>C-b</KBD> to move the cursor to the left, and then
+correct your mistake.  Afterwards, you can move the cursor to the right
+with <KBD>C-f</KBD>.
+</P><P>
+
+When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are `pushed over' to make room for the text
+that you have inserted.  Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are `pulled back' to fill in the
+blank space created by the removal of the text.  A list of the bare
+essentials for editing the text of an input line follows.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-b</KBD>
+<DD>Move back one character.
+<DT><KBD>C-f</KBD>
+<DD>Move forward one character.
+<DT><KBD>DEL</KBD> or <KBD>Backspace</KBD>
+<DD>Delete the character to the left of the cursor.
+<DT><KBD>C-d</KBD>
+<DD>Delete the character underneath the cursor.
+<DT>Printing characters
+<DD>Insert the character into the line at the cursor.
+<DT><KBD>C-_</KBD> or <KBD>C-x C-u</KBD>
+<DD>Undo the last editing command.  You can undo all the way back to an
+empty line.
+</DL>
+<P>
+
+(Depending on your configuration, the <KBD>Backspace</KBD> key be set to
+delete the character to the left of the cursor and the <KBD>DEL</KBD> key set
+to delete the character underneath the cursor, like <KBD>C-d</KBD>, rather
+than the character to the left of the cursor.)
+</P><P>
+
+<A NAME="Readline Movement Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC6"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.2 Readline Movement Commands </H3>
+<!--docid::SEC5::-->
+<P>
+
+The above table describes the most basic keystrokes that you need
+in order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to <KBD>C-b</KBD>, <KBD>C-f</KBD>,
+<KBD>C-d</KBD>, and <KBD>DEL</KBD>.  Here are some commands for moving more rapidly
+about the line.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-a</KBD>
+<DD>Move to the start of the line.
+<DT><KBD>C-e</KBD>
+<DD>Move to the end of the line.
+<DT><KBD>M-f</KBD>
+<DD>Move forward a word, where a word is composed of letters and digits.
+<DT><KBD>M-b</KBD>
+<DD>Move backward a word.
+<DT><KBD>C-l</KBD>
+<DD>Clear the screen, reprinting the current line at the top.
+</DL>
+<P>
+
+Notice how <KBD>C-f</KBD> moves forward a character, while <KBD>M-f</KBD> moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+</P><P>
+
+<A NAME="Readline Killing Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC7"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.3 Readline Killing Commands </H3>
+<!--docid::SEC6::-->
+<P>
+
+<A NAME="IDX1"></A>
+<A NAME="IDX2"></A>
+</P><P>
+
+<EM>Killing</EM> text means to delete the text from the line, but to save
+it away for later use, usually by <EM>yanking</EM> (re-inserting)
+it back into the line.
+(`Cut' and `paste' are more recent jargon for `kill' and `yank'.)
+</P><P>
+
+If the description for a command says that it `kills' text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+</P><P>
+
+When you use a kill command, the text is saved in a <EM>kill-ring</EM>.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+<A NAME="IDX3"></A>
+</P><P>
+
+Here is the list of commands for killing text.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-k</KBD>
+<DD>Kill the text from the current cursor position to the end of the line.
+<P>
+
+<DT><KBD>M-d</KBD>
+<DD>Kill from the cursor to the end of the current word, or, if between
+words, to the end of the next word.
+Word boundaries are the same as those used by <KBD>M-f</KBD>.
+<P>
+
+<DT><KBD>M-<KBD>DEL</KBD></KBD>
+<DD>Kill from the cursor the start of the current word, or, if between
+words, to the start of the previous word.
+Word boundaries are the same as those used by <KBD>M-b</KBD>.
+<P>
+
+<DT><KBD>C-w</KBD>
+<DD>Kill from the cursor to the previous whitespace.  This is different than
+<KBD>M-<KBD>DEL</KBD></KBD> because the word boundaries differ.
+<P>
+
+</DL>
+<P>
+
+Here is how to <EM>yank</EM> the text back into the line.  Yanking
+means to copy the most-recently-killed text from the kill buffer.
+</P><P>
+
+<DL COMPACT>
+<DT><KBD>C-y</KBD>
+<DD>Yank the most recently killed text back into the buffer at the cursor.
+<P>
+
+<DT><KBD>M-y</KBD>
+<DD>Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <KBD>C-y</KBD> or <KBD>M-y</KBD>.
+</DL>
+<P>
+
+<A NAME="Readline Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC8"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.4 Readline Arguments </H3>
+<!--docid::SEC7::-->
+<P>
+
+You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the <I>sign</I> of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type <SAMP>`M-- C-k'</SAMP>.
+</P><P>
+
+The general way to pass numeric arguments to a command is to type meta
+digits before the command.  If the first `digit' typed is a minus
+sign (<SAMP>`-'</SAMP>), then the sign of the argument will be negative.  Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command.  For example, to give
+the <KBD>C-d</KBD> command an argument of 10, you could type <SAMP>`M-1 0 C-d'</SAMP>,
+which will delete the next ten characters on the input line.
+</P><P>
+
+<A NAME="Searching"></A>
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC3"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.2.5 Searching for Commands in the History </H3>
+<!--docid::SEC8::-->
+<P>
+
+Readline provides commands for searching through the command history
+for lines containing a specified string.
+There are two search modes:  <EM>incremental</EM> and <EM>non-incremental</EM>.
+</P><P>
+
+Incremental searches begin before the user has finished typing the
+search string.
+As each character of the search string is typed, Readline displays
+the next entry from the history matching the string typed so far.
+An incremental search requires only as many characters as needed to
+find the desired history entry.
+To search backward in the history for a particular string, type
+<KBD>C-r</KBD>.  Typing <KBD>C-s</KBD> searches forward through the history.
+The characters present in the value of the <CODE>isearch-terminators</CODE> variable
+are used to terminate an incremental search.
+If that variable has not been assigned a value, the <KBD>ESC</KBD> and
+<KBD>C-J</KBD> characters will terminate an incremental search.
+<KBD>C-g</KBD> will abort an incremental search and restore the original line.
+When the search is terminated, the history entry containing the
+search string becomes the current line.
+</P><P>
+
+To find other matching entries in the history list, type <KBD>C-r</KBD> or
+<KBD>C-s</KBD> as appropriate.
+This will search backward or forward in the history for the next
+entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate
+the search and execute that command.
+For instance, a <KBD>RET</KBD> will terminate the search and accept
+the line, thereby executing the command from the history list.
+A movement command will terminate the search, make the last line found
+the current line, and begin editing.
+</P><P>
+
+Readline remembers the last incremental search string.  If two
+<KBD>C-r</KBD>s are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+</P><P>
+
+Non-incremental searches read the entire search string before starting
+to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+</P><P>
+
+<A NAME="Readline Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.3 Readline Init File </H2>
+<!--docid::SEC9::-->
+<P>
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.
+Any user can customize programs that use Readline by putting
+commands in an <EM>inputrc</EM> file, conventionally in his home directory.
+The name of this
+file is taken from the value of the environment variable <CODE>INPUTRC</CODE>.  If
+that variable is unset, the default is <TT>`~/.inputrc'</TT>.
+</P><P>
+
+When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+</P><P>
+
+In addition, the <CODE>C-x C-r</CODE> command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+</P><P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC10">1.3.1 Readline Init File Syntax</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Syntax for the commands in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC11">1.3.2 Conditional Init Constructs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Conditional key bindings in the inputrc file.</TD></TR>
+</TABLE>
+
+<br>
+<TABLE BORDER=0 CELLSPACING=0>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC12">1.3.3 Sample Init File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">An example inputrc file.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="Readline Init File Syntax"></A>
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.1 Readline Init File Syntax </H3>
+<!--docid::SEC10::-->
+<P>
+
+There are only a few basic constructs allowed in the
+Readline init file.  Blank lines are ignored.
+Lines beginning with a <SAMP>`#'</SAMP> are comments.
+Lines beginning with a <SAMP>`$'</SAMP> indicate conditional
+constructs (see section <A HREF="rluserman.html#SEC11">1.3.2 Conditional Init Constructs</A>).  Other lines
+denote variable settings and key bindings.
+</P><P>
+
+<DL COMPACT>
+<DT>Variable Settings
+<DD>You can modify the run-time behavior of Readline by
+altering the values of variables in Readline
+using the <CODE>set</CODE> command within the init file.
+The syntax is simple:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set <VAR>variable</VAR> <VAR>value</VAR>
+</pre></td></tr></table></P><P>
+
+Here, for example, is how to
+change from the default Emacs-like key binding to use
+<CODE>vi</CODE> line editing commands:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>set editing-mode vi
+</pre></td></tr></table></P><P>
+
+Variable names and values, where appropriate, are recognized without regard
+to case. 
+</P><P>
+
+A great deal of run-time behavior is changeable with the following
+variables.
+</P><P>
+
+<A NAME="IDX4"></A>
+<DL COMPACT>
+
+<DT><CODE>bell-style</CODE>
+<DD><A NAME="IDX5"></A>
+Controls what happens when Readline wants to ring the terminal bell.
+If set to <SAMP>`none'</SAMP>, Readline never rings the bell.  If set to
+<SAMP>`visible'</SAMP>, Readline uses a visible bell if one is available.
+If set to <SAMP>`audible'</SAMP> (the default), Readline attempts to ring
+the terminal's bell.
+<P>
+
+<DT><CODE>comment-begin</CODE>
+<DD><A NAME="IDX6"></A>
+The string to insert at the beginning of the line when the
+<CODE>insert-comment</CODE> command is executed.  The default value
+is <CODE>"#"</CODE>.
+<P>
+
+<DT><CODE>completion-ignore-case</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline performs filename matching and completion
+in a case-insensitive fashion.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>completion-query-items</CODE>
+<DD><A NAME="IDX7"></A>
+The number of possible completions that determines when the user is
+asked whether the list of possibilities should be displayed.
+If the number of possible completions is greater than this value,
+Readline will ask the user whether or not he wishes to view
+them; otherwise, they are simply listed.
+This variable must be set to an integer value greater than or equal to 0.
+The default limit is <CODE>100</CODE>.
+<P>
+
+<DT><CODE>convert-meta</CODE>
+<DD><A NAME="IDX8"></A>
+If set to <SAMP>`on'</SAMP>, Readline will convert characters with the
+eighth bit set to an ASCII key sequence by stripping the eighth
+bit and prefixing an <KBD>ESC</KBD> character, converting them to a
+meta-prefixed key sequence.  The default value is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>disable-completion</CODE>
+<DD><A NAME="IDX9"></A>
+If set to <SAMP>`On'</SAMP>, Readline will inhibit word completion.
+Completion  characters will be inserted into the line as if they had
+been mapped to <CODE>self-insert</CODE>.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>editing-mode</CODE>
+<DD><A NAME="IDX10"></A>
+The <CODE>editing-mode</CODE> variable controls which default set of
+key bindings is used.  By default, Readline starts up in Emacs editing
+mode, where the keystrokes are most similar to Emacs.  This variable can be
+set to either <SAMP>`emacs'</SAMP> or <SAMP>`vi'</SAMP>.
+<P>
+
+<DT><CODE>enable-keypad</CODE>
+<DD><A NAME="IDX11"></A>
+When set to <SAMP>`on'</SAMP>, Readline will try to enable the application
+keypad when it is called.  Some systems need this to enable the
+arrow keys.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>expand-tilde</CODE>
+<DD><A NAME="IDX12"></A>
+If set to <SAMP>`on'</SAMP>, tilde expansion is performed when Readline
+attempts word completion.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<A NAME="IDX13"></A>
+If set to <SAMP>`on'</SAMP>, the history code attempts to place point at the
+same location on each history line retrieved with <CODE>previous-history</CODE>
+or <CODE>next-history</CODE>.
+</P><P>
+
+<DT><CODE>horizontal-scroll-mode</CODE>
+<DD><A NAME="IDX14"></A>
+This variable can be set to either <SAMP>`on'</SAMP> or <SAMP>`off'</SAMP>.  Setting it
+to <SAMP>`on'</SAMP> means that the text of the lines being edited will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line.  By default,
+this variable is set to <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>input-meta</CODE>
+<DD><A NAME="IDX15"></A>
+<A NAME="IDX16"></A>
+If set to <SAMP>`on'</SAMP>, Readline will enable eight-bit input (it
+will not clear the eighth bit in the characters it reads),
+regardless of what the terminal claims it can support.  The
+default value is <SAMP>`off'</SAMP>.  The name <CODE>meta-flag</CODE> is a
+synonym for this variable.
+<P>
+
+<DT><CODE>isearch-terminators</CODE>
+<DD><A NAME="IDX17"></A>
+The string of characters that should terminate an incremental search without
+subsequently executing the character as a command (see section <A HREF="rluserman.html#SEC8">1.2.5 Searching for Commands in the History</A>).
+If this variable has not been given a value, the characters <KBD>ESC</KBD> and
+<KBD>C-J</KBD> will terminate an incremental search.
+<P>
+
+<DT><CODE>keymap</CODE>
+<DD><A NAME="IDX18"></A>
+Sets Readline's idea of the current keymap for key binding commands.
+Acceptable <CODE>keymap</CODE> names are
+<CODE>emacs</CODE>,
+<CODE>emacs-standard</CODE>,
+<CODE>emacs-meta</CODE>,
+<CODE>emacs-ctlx</CODE>,
+<CODE>vi</CODE>,
+<CODE>vi-move</CODE>,
+<CODE>vi-command</CODE>, and
+<CODE>vi-insert</CODE>.
+<CODE>vi</CODE> is equivalent to <CODE>vi-command</CODE>; <CODE>emacs</CODE> is
+equivalent to <CODE>emacs-standard</CODE>.  The default value is <CODE>emacs</CODE>.
+The value of the <CODE>editing-mode</CODE> variable also affects the
+default keymap.
+<P>
+
+<DT><CODE>mark-directories</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, completed directory names have a slash
+appended.  The default is <SAMP>`on'</SAMP>.
+<P>
+
+<DT><CODE>mark-modified-lines</CODE>
+<DD><A NAME="IDX19"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to display an
+asterisk (<SAMP>`*'</SAMP>) at the start of history lines which have been modified.
+This variable is <SAMP>`off'</SAMP> by default.
+<P>
+
+<DT><CODE>mark-symlinked-directories</CODE>
+<DD><A NAME="IDX20"></A>
+If set to <SAMP>`on'</SAMP>, completed names which are symbolic links
+to directories have a slash appended (subject to the value of
+<CODE>mark-directories</CODE>).
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>match-hidden-files</CODE>
+<DD><A NAME="IDX21"></A>
+This variable, when set to <SAMP>`on'</SAMP>, causes Readline to match files whose
+names begin with a <SAMP>`.'</SAMP> (hidden files) when performing filename
+completion, unless the leading <SAMP>`.'</SAMP> is
+supplied by the user in the filename to be completed.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>output-meta</CODE>
+<DD><A NAME="IDX22"></A>
+If set to <SAMP>`on'</SAMP>, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>page-completions</CODE>
+<DD><A NAME="IDX23"></A>
+If set to <SAMP>`on'</SAMP>, Readline uses an internal <CODE>more</CODE>-like pager
+to display a screenful of possible completions at a time.
+This variable is <SAMP>`on'</SAMP> by default.
+<P>
+
+<DT><CODE>print-completions-horizontally</CODE>
+<DD>If set to <SAMP>`on'</SAMP>, Readline will display completions with matches
+sorted horizontally in alphabetical order, rather than down the screen.
+The default is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-ambiguous</CODE>
+<DD><A NAME="IDX24"></A>
+This alters the default behavior of the completion functions.  If
+set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>show-all-if-unmodified</CODE>
+<DD><A NAME="IDX25"></A>
+This alters the default behavior of the completion functions in
+a fashion similar to <VAR>show-all-if-ambiguous</VAR>.
+If set to <SAMP>`on'</SAMP>, 
+words which have more than one possible completion without any
+possible partial completion (the possible completions don't share
+a common prefix) cause the matches to be listed immediately instead
+of ringing the bell.
+The default value is <SAMP>`off'</SAMP>.
+<P>
+
+<DT><CODE>visible-stats</CODE>
+<DD><A NAME="IDX26"></A>
+If set to <SAMP>`on'</SAMP>, a character denoting a file's type
+is appended to the filename when listing possible
+completions.  The default is <SAMP>`off'</SAMP>.
+<P>
+
+</DL>
+<P>
+
+<DT>Key Bindings
+<DD>The syntax for controlling key bindings in the init file is
+simple.  First you need to find the name of the command that you
+want to change.  The following sections contain tables of the command
+name, the default keybinding, if any, and a short description of what
+the command does.
+<P>
+
+Once you know the name of the command, simply place on a line
+in the init file the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command.  The name of the key
+can be expressed in different ways, depending on what you find most
+comfortable.
+</P><P>
+
+In addition to command names, readline allows keys to be bound
+to a string that is inserted when the key is pressed (a <VAR>macro</VAR>).
+</P><P>
+
+<DL COMPACT>
+<DT><VAR>keyname</VAR>: <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyname</VAR> is the name of a key spelled out in English.  For example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: "&#62; output"
+</pre></td></tr></table><P>
+
+In the above example, <KBD>C-u</KBD> is bound to the function
+<CODE>universal-argument</CODE>,
+<KBD>M-DEL</KBD> is bound to the function <CODE>backward-kill-word</CODE>, and
+<KBD>C-o</KBD> is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+<SAMP>`&#62; output'</SAMP> into the line).
+</P><P>
+
+A number of symbolic character names are recognized while
+processing this key binding syntax:
+<VAR>DEL</VAR>,
+<VAR>ESC</VAR>,
+<VAR>ESCAPE</VAR>,
+<VAR>LFD</VAR>,
+<VAR>NEWLINE</VAR>,
+<VAR>RET</VAR>,
+<VAR>RETURN</VAR>,
+<VAR>RUBOUT</VAR>,
+<VAR>SPACE</VAR>,
+<VAR>SPC</VAR>,
+and
+<VAR>TAB</VAR>.
+</P><P>
+
+<DT>"<VAR>keyseq</VAR>": <VAR>function-name</VAR> or <VAR>macro</VAR>
+<DD><VAR>keyseq</VAR> differs from <VAR>keyname</VAR> above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes.  Some GNU Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+</pre></td></tr></table></P><P>
+
+In the above example, <KBD>C-u</KBD> is again bound to the function
+<CODE>universal-argument</CODE> (just as it was in the first example),
+<SAMP>`<KBD>C-x</KBD> <KBD>C-r</KBD>'</SAMP> is bound to the function <CODE>re-read-init-file</CODE>,
+and <SAMP>`<KBD>ESC</KBD> <KBD>[</KBD> <KBD>1</KBD> <KBD>1</KBD> <KBD>~</KBD>'</SAMP> is bound to insert
+the text <SAMP>`Function Key 1'</SAMP>.
+</P><P>
+
+</DL>
+<P>
+
+The following GNU Emacs style escape sequences are available when
+specifying key sequences:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE><KBD>\C-</KBD></CODE>
+<DD>control prefix
+<DT><CODE><KBD>\M-</KBD></CODE>
+<DD>meta prefix
+<DT><CODE><KBD>\e</KBD></CODE>
+<DD>an escape character
+<DT><CODE><KBD>\\</KBD></CODE>
+<DD>backslash
+<DT><CODE><KBD>\"</KBD></CODE>
+<DD><KBD>"</KBD>, a double quotation mark
+<DT><CODE><KBD>\'</KBD></CODE>
+<DD><KBD>'</KBD>, a single quote or apostrophe
+</DL>
+<P>
+
+In addition to the GNU Emacs style escape sequences, a second
+set of backslash escapes is available:
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>\a</CODE>
+<DD>alert (bell)
+<DT><CODE>\b</CODE>
+<DD>backspace
+<DT><CODE>\d</CODE>
+<DD>delete
+<DT><CODE>\f</CODE>
+<DD>form feed
+<DT><CODE>\n</CODE>
+<DD>newline
+<DT><CODE>\r</CODE>
+<DD>carriage return
+<DT><CODE>\t</CODE>
+<DD>horizontal tab
+<DT><CODE>\v</CODE>
+<DD>vertical tab
+<DT><CODE>\<VAR>nnn</VAR></CODE>
+<DD>the eight-bit character whose value is the octal value <VAR>nnn</VAR>
+(one to three digits)
+<DT><CODE>\x<VAR>HH</VAR></CODE>
+<DD>the eight-bit character whose value is the hexadecimal value <VAR>HH</VAR>
+(one or two hex digits)
+</DL>
+<P>
+
+When entering the text of a macro, single or double quotes must
+be used to indicate a macro definition.
+Unquoted text is assumed to be a function name.
+In the macro body, the backslash escapes described above are expanded.
+Backslash will quote any other character in the macro text,
+including <SAMP>`"'</SAMP> and <SAMP>`''</SAMP>.
+For example, the following binding will make <SAMP>`<KBD>C-x</KBD> \'</SAMP>
+insert a single <SAMP>`\'</SAMP> into the line:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>"\C-x\\": "\\"
+</pre></td></tr></table></P><P>
+
+</DL>
+<P>
+
+<A NAME="Conditional Init Constructs"></A>
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC12"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.2 Conditional Init Constructs </H3>
+<!--docid::SEC11::-->
+<P>
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests.  There are four parser directives used.
+</P><P>
+
+<DL COMPACT>
+<DT><CODE>$if</CODE>
+<DD>The <CODE>$if</CODE> construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline.  The text of the test extends to the end of the line;
+no characters are required to isolate it.
+<P>
+
+<DL COMPACT>
+<DT><CODE>mode</CODE>
+<DD>The <CODE>mode=</CODE> form of the <CODE>$if</CODE> directive is used to test
+whether Readline is in <CODE>emacs</CODE> or <CODE>vi</CODE> mode.
+This may be used in conjunction
+with the <SAMP>`set keymap'</SAMP> command, for instance, to set bindings in
+the <CODE>emacs-standard</CODE> and <CODE>emacs-ctlx</CODE> keymaps only if
+Readline is starting out in <CODE>emacs</CODE> mode.
+<P>
+
+<DT><CODE>term</CODE>
+<DD>The <CODE>term=</CODE> form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys.  The word on the right side of the
+<SAMP>`='</SAMP> is tested against both the full name of the terminal and
+the portion of the terminal name before the first <SAMP>`-'</SAMP>.  This
+allows <CODE>sun</CODE> to match both <CODE>sun</CODE> and <CODE>sun-cmd</CODE>,
+for instance.
+<P>
+
+<DT><CODE>application</CODE>
+<DD>The <VAR>application</VAR> construct is used to include
+application-specific settings.  Each program using the Readline
+library sets the <VAR>application name</VAR>, and you can test for
+a particular value. 
+This could be used to bind key sequences to functions useful for
+a specific program.  For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$if Bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+</pre></td></tr></table></DL>
+<P>
+
+<DT><CODE>$endif</CODE>
+<DD>This command, as seen in the previous example, terminates an
+<CODE>$if</CODE> command.
+<P>
+
+<DT><CODE>$else</CODE>
+<DD>Commands in this branch of the <CODE>$if</CODE> directive are executed if
+the test fails.
+<P>
+
+<DT><CODE>$include</CODE>
+<DD>This directive takes a single filename as an argument and reads commands
+and bindings from that file.
+For example, the following directive reads from <TT>`/etc/inputrc'</TT>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>$include /etc/inputrc
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Sample Init File"></A>
+<HR SIZE="6">
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC9"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.3.3 Sample Init File </H3>
+<!--docid::SEC12::-->
+<P>
+
+Here is an example of an <VAR>inputrc</VAR> file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre># This file controls the behaviour of line input editing for
+# programs that use the GNU Readline library.  Existing
+# programs include FTP, Bash, and GDB.
+#
+# You can re-read the inputrc file with C-x C-r.
+# Lines beginning with '#' are comments.
+#
+# First, include any systemwide bindings and variable
+# assignments from /etc/Inputrc
+$include /etc/Inputrc
+
+#
+# Set various bindings for emacs mode.
+
+set editing-mode emacs 
+
+$if mode=emacs
+
+Meta-Control-h:        backward-kill-word      Text after the function name is ignored
+
+#
+# Arrow keys in keypad mode
+#
+#"\M-OD":        backward-char
+#"\M-OC":        forward-char
+#"\M-OA":        previous-history
+#"\M-OB":        next-history
+#
+# Arrow keys in ANSI mode
+#
+"\M-[D":        backward-char
+"\M-[C":        forward-char
+"\M-[A":        previous-history
+"\M-[B":        next-history
+#
+# Arrow keys in 8 bit keypad mode
+#
+#"\M-\C-OD":       backward-char
+#"\M-\C-OC":       forward-char
+#"\M-\C-OA":       previous-history
+#"\M-\C-OB":       next-history
+#
+# Arrow keys in 8 bit ANSI mode
+#
+#"\M-\C-[D":       backward-char
+#"\M-\C-[C":       forward-char
+#"\M-\C-[A":       previous-history
+#"\M-\C-[B":       next-history
+
+C-q: quoted-insert
+
+$endif
+
+# An old-style binding.  This happens to be the default.
+TAB: complete
+
+# Macros that are convenient for shell interaction
+$if Bash
+# edit the path
+"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+# prepare to type a quoted word --
+# insert open and close double quotes
+# and move to just after the open quote
+"\C-x\"": "\"\"\C-b"
+# insert a backslash (testing backslash escapes
+# in sequences and macros)
+"\C-x\\": "\\"
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+# Add a binding to refresh the line, which is unbound
+"\C-xr": redraw-current-line
+# Edit variable on current line.
+"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+$endif
+
+# use a visible bell if one is available
+set bell-style visible
+
+# don't strip characters to 7 bits when reading
+set input-meta on
+
+# allow iso-latin1 characters to be inserted rather
+# than converted to prefix-meta sequences
+set convert-meta off
+
+# display characters with the eighth bit set directly
+# rather than as meta-prefixed characters
+set output-meta on
+
+# if there are more than 150 possible completions for
+# a word, ask the user if he wants to see all of them
+set completion-query-items 150
+
+# For FTP
+$if Ftp
+"\C-xg": "get \M-?"
+"\C-xt": "put \M-?"
+"\M-.": yank-last-arg
+$endif
+</pre></td></tr></table></P><P>
+
+<A NAME="Bindable Readline Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.4 Bindable Readline Commands </H2>
+<!--docid::SEC13::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC14">1.4.1 Commands For Moving</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Moving about the line.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC15">1.4.2 Commands For Manipulating The History</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting at previous lines.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC16">1.4.3 Commands For Changing Text</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for changing text.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC17">1.4.4 Killing And Yanking</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Commands for killing and yanking.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC18">1.4.5 Specifying Numeric Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Specifying numeric arguments, repeat counts.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC19">1.4.6 Letting Readline Type For You</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Getting Readline to do the typing for you.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC20">1.4.7 Keyboard Macros</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Saving and re-executing typed characters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC21">1.4.8 Some Miscellaneous Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Other miscellaneous commands.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+This section describes Readline commands that may be bound to key
+sequences.
+Command names without an accompanying key sequence are unbound by default.
+</P><P>
+
+In the following descriptions, <EM>point</EM> refers to the current cursor
+position, and <EM>mark</EM> refers to a cursor position saved by the
+<CODE>set-mark</CODE> command.
+The text between the point and mark is referred to as the <EM>region</EM>.
+</P><P>
+
+<A NAME="Commands For Moving"></A>
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.1 Commands For Moving </H3>
+<!--docid::SEC14::-->
+<DL COMPACT>
+<A NAME="IDX27"></A>
+<DT><CODE>beginning-of-line (C-a)</CODE>
+<DD><A NAME="IDX28"></A>
+Move to the start of the current line.
+<P>
+
+<A NAME="IDX29"></A>
+<DT><CODE>end-of-line (C-e)</CODE>
+<DD><A NAME="IDX30"></A>
+Move to the end of the line.
+<P>
+
+<A NAME="IDX31"></A>
+<DT><CODE>forward-char (C-f)</CODE>
+<DD><A NAME="IDX32"></A>
+Move forward a character.
+<P>
+
+<A NAME="IDX33"></A>
+<DT><CODE>backward-char (C-b)</CODE>
+<DD><A NAME="IDX34"></A>
+Move back a character.
+<P>
+
+<A NAME="IDX35"></A>
+<DT><CODE>forward-word (M-f)</CODE>
+<DD><A NAME="IDX36"></A>
+Move forward to the end of the next word.  Words are composed of
+letters and digits.
+<P>
+
+<A NAME="IDX37"></A>
+<DT><CODE>backward-word (M-b)</CODE>
+<DD><A NAME="IDX38"></A>
+Move back to the start of the current or previous word.  Words are
+composed of letters and digits.
+<P>
+
+<A NAME="IDX39"></A>
+<DT><CODE>clear-screen (C-l)</CODE>
+<DD><A NAME="IDX40"></A>
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+<P>
+
+<A NAME="IDX41"></A>
+<DT><CODE>redraw-current-line ()</CODE>
+<DD><A NAME="IDX42"></A>
+Refresh the current line.  By default, this is unbound.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For History"></A>
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC16"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.2 Commands For Manipulating The History </H3>
+<!--docid::SEC15::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX43"></A>
+<DT><CODE>accept-line (Newline or Return)</CODE>
+<DD><A NAME="IDX44"></A>
+Accept the line regardless of where the cursor is.
+If this line is
+non-empty, it may be added to the history list for future recall with
+<CODE>add_history()</CODE>.
+If this line is a modified history line, the history line is restored
+to its original state.
+<P>
+
+<A NAME="IDX45"></A>
+<DT><CODE>previous-history (C-p)</CODE>
+<DD><A NAME="IDX46"></A>
+Move `back' through the history list, fetching the previous command.
+<P>
+
+<A NAME="IDX47"></A>
+<DT><CODE>next-history (C-n)</CODE>
+<DD><A NAME="IDX48"></A>
+Move `forward' through the history list, fetching the next command.
+<P>
+
+<A NAME="IDX49"></A>
+<DT><CODE>beginning-of-history (M-&#60;)</CODE>
+<DD><A NAME="IDX50"></A>
+Move to the first line in the history.
+<P>
+
+<A NAME="IDX51"></A>
+<DT><CODE>end-of-history (M-&#62;)</CODE>
+<DD><A NAME="IDX52"></A>
+Move to the end of the input history, i.e., the line currently
+being entered.
+<P>
+
+<A NAME="IDX53"></A>
+<DT><CODE>reverse-search-history (C-r)</CODE>
+<DD><A NAME="IDX54"></A>
+Search backward starting at the current line and moving `up' through
+the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX55"></A>
+<DT><CODE>forward-search-history (C-s)</CODE>
+<DD><A NAME="IDX56"></A>
+Search forward starting at the current line and moving `down' through
+the the history as necessary.  This is an incremental search.
+<P>
+
+<A NAME="IDX57"></A>
+<DT><CODE>non-incremental-reverse-search-history (M-p)</CODE>
+<DD><A NAME="IDX58"></A>
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX59"></A>
+<DT><CODE>non-incremental-forward-search-history (M-n)</CODE>
+<DD><A NAME="IDX60"></A>
+Search forward starting at the current line and moving `down'
+through the the history as necessary using a non-incremental search
+for a string supplied by the user.
+<P>
+
+<A NAME="IDX61"></A>
+<DT><CODE>history-search-forward ()</CODE>
+<DD><A NAME="IDX62"></A>
+Search forward through the history for the string of characters
+between the start of the current line and the point.
+This is a non-incremental search.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX63"></A>
+<DT><CODE>history-search-backward ()</CODE>
+<DD><A NAME="IDX64"></A>
+Search backward through the history for the string of characters
+between the start of the current line and the point.  This
+is a non-incremental search.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX65"></A>
+<DT><CODE>yank-nth-arg (M-C-y)</CODE>
+<DD><A NAME="IDX66"></A>
+Insert the first argument to the previous command (usually
+the second word on the previous line) at point.
+With an argument <VAR>n</VAR>,
+insert the <VAR>n</VAR>th word from the previous command (the words
+in the previous command begin with word 0).  A negative argument
+inserts the <VAR>n</VAR>th word from the end of the previous command.
+<P>
+
+<A NAME="IDX67"></A>
+<DT><CODE>yank-last-arg (M-. or M-_)</CODE>
+<DD><A NAME="IDX68"></A>
+Insert last argument to the previous command (the last word of the
+previous history entry).  With an
+argument, behave exactly like <CODE>yank-nth-arg</CODE>.
+Successive calls to <CODE>yank-last-arg</CODE> move back through the history
+list, inserting the last argument of each line in turn.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Text"></A>
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC17"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.3 Commands For Changing Text </H3>
+<!--docid::SEC16::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX69"></A>
+<DT><CODE>delete-char (C-d)</CODE>
+<DD><A NAME="IDX70"></A>
+Delete the character at point.  If point is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not bound to <CODE>delete-char</CODE>, then
+return EOF.
+<P>
+
+<A NAME="IDX71"></A>
+<DT><CODE>backward-delete-char (Rubout)</CODE>
+<DD><A NAME="IDX72"></A>
+Delete the character behind the cursor.  A numeric argument means
+to kill the characters instead of deleting them.
+<P>
+
+<A NAME="IDX73"></A>
+<DT><CODE>forward-backward-delete-char ()</CODE>
+<DD><A NAME="IDX74"></A>
+Delete the character under the cursor, unless the cursor is at the
+end of the line, in which case the character behind the cursor is
+deleted.  By default, this is not bound to a key.
+<P>
+
+<A NAME="IDX75"></A>
+<DT><CODE>quoted-insert (C-q or C-v)</CODE>
+<DD><A NAME="IDX76"></A>
+Add the next character typed to the line verbatim.  This is
+how to insert key sequences like <KBD>C-q</KBD>, for example.
+<P>
+
+<A NAME="IDX77"></A>
+<DT><CODE>tab-insert (M-<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX78"></A>
+Insert a tab character.
+<P>
+
+<A NAME="IDX79"></A>
+<DT><CODE>self-insert (a, b, A, 1, !, <small>...</small>)</CODE>
+<DD><A NAME="IDX80"></A>
+Insert yourself.
+<P>
+
+<A NAME="IDX81"></A>
+<DT><CODE>transpose-chars (C-t)</CODE>
+<DD><A NAME="IDX82"></A>
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well.  If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative arguments have no effect.
+<P>
+
+<A NAME="IDX83"></A>
+<DT><CODE>transpose-words (M-t)</CODE>
+<DD><A NAME="IDX84"></A>
+Drag the word before point past the word after point,
+moving point past that word as well.
+If the insertion point is at the end of the line, this transposes
+the last two words on the line.
+<P>
+
+<A NAME="IDX85"></A>
+<DT><CODE>upcase-word (M-u)</CODE>
+<DD><A NAME="IDX86"></A>
+Uppercase the current (or following) word.  With a negative argument,
+uppercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX87"></A>
+<DT><CODE>downcase-word (M-l)</CODE>
+<DD><A NAME="IDX88"></A>
+Lowercase the current (or following) word.  With a negative argument,
+lowercase the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX89"></A>
+<DT><CODE>capitalize-word (M-c)</CODE>
+<DD><A NAME="IDX90"></A>
+Capitalize the current (or following) word.  With a negative argument,
+capitalize the previous word, but do not move the cursor.
+<P>
+
+<A NAME="IDX91"></A>
+<DT><CODE>overwrite-mode ()</CODE>
+<DD><A NAME="IDX92"></A>
+Toggle overwrite mode.  With an explicit positive numeric argument,
+switches to overwrite mode.  With an explicit non-positive numeric
+argument, switches to insert mode.  This command affects only
+<CODE>emacs</CODE> mode; <CODE>vi</CODE> mode does overwrite differently.
+Each call to <CODE>readline()</CODE> starts in insert mode.
+<P>
+
+In overwrite mode, characters bound to <CODE>self-insert</CODE> replace
+the text at point rather than pushing the text to the right.
+Characters bound to <CODE>backward-delete-char</CODE> replace the character
+before point with a space.
+</P><P>
+
+By default, this command is unbound.
+</P><P>
+
+</DL>
+<P>
+
+<A NAME="Commands For Killing"></A>
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC18"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.4 Killing And Yanking </H3>
+<!--docid::SEC17::-->
+<P>
+
+<DL COMPACT>
+
+<A NAME="IDX93"></A>
+<DT><CODE>kill-line (C-k)</CODE>
+<DD><A NAME="IDX94"></A>
+Kill the text from point to the end of the line.
+<P>
+
+<A NAME="IDX95"></A>
+<DT><CODE>backward-kill-line (C-x Rubout)</CODE>
+<DD><A NAME="IDX96"></A>
+Kill backward to the beginning of the line.
+<P>
+
+<A NAME="IDX97"></A>
+<DT><CODE>unix-line-discard (C-u)</CODE>
+<DD><A NAME="IDX98"></A>
+Kill backward from the cursor to the beginning of the current line.
+<P>
+
+<A NAME="IDX99"></A>
+<DT><CODE>kill-whole-line ()</CODE>
+<DD><A NAME="IDX100"></A>
+Kill all characters on the current line, no matter where point is.
+By default, this is unbound.
+<P>
+
+<A NAME="IDX101"></A>
+<DT><CODE>kill-word (M-d)</CODE>
+<DD><A NAME="IDX102"></A>
+Kill from point to the end of the current word, or if between
+words, to the end of the next word.
+Word boundaries are the same as <CODE>forward-word</CODE>.
+<P>
+
+<A NAME="IDX103"></A>
+<DT><CODE>backward-kill-word (M-<KBD>DEL</KBD>)</CODE>
+<DD><A NAME="IDX104"></A>
+Kill the word behind point.
+Word boundaries are the same as <CODE>backward-word</CODE>.
+<P>
+
+<A NAME="IDX105"></A>
+<DT><CODE>unix-word-rubout (C-w)</CODE>
+<DD><A NAME="IDX106"></A>
+Kill the word behind point, using white space as a word boundary.
+The killed text is saved on the kill-ring.
+<P>
+
+<A NAME="IDX107"></A>
+<DT><CODE>delete-horizontal-space ()</CODE>
+<DD><A NAME="IDX108"></A>
+Delete all spaces and tabs around point.  By default, this is unbound.
+<P>
+
+<A NAME="IDX109"></A>
+<DT><CODE>kill-region ()</CODE>
+<DD><A NAME="IDX110"></A>
+Kill the text in the current region.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX111"></A>
+<DT><CODE>copy-region-as-kill ()</CODE>
+<DD><A NAME="IDX112"></A>
+Copy the text in the region to the kill buffer, so it can be yanked
+right away.  By default, this command is unbound.
+<P>
+
+<A NAME="IDX113"></A>
+<DT><CODE>copy-backward-word ()</CODE>
+<DD><A NAME="IDX114"></A>
+Copy the word before point to the kill buffer.
+The word boundaries are the same as <CODE>backward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX115"></A>
+<DT><CODE>copy-forward-word ()</CODE>
+<DD><A NAME="IDX116"></A>
+Copy the word following point to the kill buffer.
+The word boundaries are the same as <CODE>forward-word</CODE>.
+By default, this command is unbound.
+<P>
+
+<A NAME="IDX117"></A>
+<DT><CODE>yank (C-y)</CODE>
+<DD><A NAME="IDX118"></A>
+Yank the top of the kill ring into the buffer at point.
+<P>
+
+<A NAME="IDX119"></A>
+<DT><CODE>yank-pop (M-y)</CODE>
+<DD><A NAME="IDX120"></A>
+Rotate the kill-ring, and yank the new top.  You can only do this if
+the prior command is <CODE>yank</CODE> or <CODE>yank-pop</CODE>.
+</DL>
+<P>
+
+<A NAME="Numeric Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC19"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.5 Specifying Numeric Arguments </H3>
+<!--docid::SEC18::-->
+<DL COMPACT>
+
+<A NAME="IDX121"></A>
+<DT><CODE>digit-argument (<KBD>M-0</KBD>, <KBD>M-1</KBD>, <small>...</small> <KBD>M--</KBD>)</CODE>
+<DD><A NAME="IDX122"></A>
+Add this digit to the argument already accumulating, or start a new
+argument.  <KBD>M--</KBD> starts a negative argument.
+<P>
+
+<A NAME="IDX123"></A>
+<DT><CODE>universal-argument ()</CODE>
+<DD><A NAME="IDX124"></A>
+This is another way to specify an argument.
+If this command is followed by one or more digits, optionally with a
+leading minus sign, those digits define the argument.
+If the command is followed by digits, executing <CODE>universal-argument</CODE>
+again ends the numeric argument, but is otherwise ignored.
+As a special case, if this command is immediately followed by a
+character that is neither a digit or minus sign, the argument count
+for the next command is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four, a second time makes the
+argument count sixteen, and so on.
+By default, this is not bound to a key.
+</DL>
+<P>
+
+<A NAME="Commands For Completion"></A>
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC20"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.6 Letting Readline Type For You </H3>
+<!--docid::SEC19::-->
+<P>
+
+<DL COMPACT>
+<A NAME="IDX125"></A>
+<DT><CODE>complete (<KBD>TAB</KBD>)</CODE>
+<DD><A NAME="IDX126"></A>
+Attempt to perform completion on the text before point.
+The actual completion performed is application-specific.
+The default is filename completion.
+<P>
+
+<A NAME="IDX127"></A>
+<DT><CODE>possible-completions (M-?)</CODE>
+<DD><A NAME="IDX128"></A>
+List the possible completions of the text before point.
+<P>
+
+<A NAME="IDX129"></A>
+<DT><CODE>insert-completions (M-*)</CODE>
+<DD><A NAME="IDX130"></A>
+Insert all completions of the text before point that would have
+been generated by <CODE>possible-completions</CODE>.
+<P>
+
+<A NAME="IDX131"></A>
+<DT><CODE>menu-complete ()</CODE>
+<DD><A NAME="IDX132"></A>
+Similar to <CODE>complete</CODE>, but replaces the word to be completed
+with a single match from the list of possible completions.
+Repeated execution of <CODE>menu-complete</CODE> steps through the list
+of possible completions, inserting each match in turn.
+At the end of the list of completions, the bell is rung
+(subject to the setting of <CODE>bell-style</CODE>)
+and the original text is restored.
+An argument of <VAR>n</VAR> moves <VAR>n</VAR> positions forward in the list
+of matches; a negative argument may be used to move backward
+through the list.
+This command is intended to be bound to <KBD>TAB</KBD>, but is unbound
+by default.
+<P>
+
+<A NAME="IDX133"></A>
+<DT><CODE>delete-char-or-list ()</CODE>
+<DD><A NAME="IDX134"></A>
+Deletes the character under the cursor if not at the beginning or
+end of the line (like <CODE>delete-char</CODE>).
+If at the end of the line, behaves identically to
+<CODE>possible-completions</CODE>.
+This command is unbound by default.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Keyboard Macros"></A>
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.7 Keyboard Macros </H3>
+<!--docid::SEC20::-->
+<DL COMPACT>
+
+<A NAME="IDX135"></A>
+<DT><CODE>start-kbd-macro (C-x ()</CODE>
+<DD><A NAME="IDX136"></A>
+Begin saving the characters typed into the current keyboard macro.
+<P>
+
+<A NAME="IDX137"></A>
+<DT><CODE>end-kbd-macro (C-x ))</CODE>
+<DD><A NAME="IDX138"></A>
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+<P>
+
+<A NAME="IDX139"></A>
+<DT><CODE>call-last-kbd-macro (C-x e)</CODE>
+<DD><A NAME="IDX140"></A>
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Miscellaneous Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 1.4.8 Some Miscellaneous Commands </H3>
+<!--docid::SEC21::-->
+<DL COMPACT>
+
+<A NAME="IDX141"></A>
+<DT><CODE>re-read-init-file (C-x C-r)</CODE>
+<DD><A NAME="IDX142"></A>
+Read in the contents of the <VAR>inputrc</VAR> file, and incorporate
+any bindings or variable assignments found there.
+<P>
+
+<A NAME="IDX143"></A>
+<DT><CODE>abort (C-g)</CODE>
+<DD><A NAME="IDX144"></A>
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+<CODE>bell-style</CODE>).
+<P>
+
+<A NAME="IDX145"></A>
+<DT><CODE>do-uppercase-version (M-a, M-b, M-<VAR>x</VAR>, <small>...</small>)</CODE>
+<DD><A NAME="IDX146"></A>
+If the metafied character <VAR>x</VAR> is lowercase, run the command
+that is bound to the corresponding uppercase character.
+<P>
+
+<A NAME="IDX147"></A>
+<DT><CODE>prefix-meta (<KBD>ESC</KBD>)</CODE>
+<DD><A NAME="IDX148"></A>
+Metafy the next character typed.  This is for keyboards
+without a meta key.  Typing <SAMP>`<KBD>ESC</KBD> f'</SAMP> is equivalent to typing
+<KBD>M-f</KBD>.
+<P>
+
+<A NAME="IDX149"></A>
+<DT><CODE>undo (C-_ or C-x C-u)</CODE>
+<DD><A NAME="IDX150"></A>
+Incremental undo, separately remembered for each line.
+<P>
+
+<A NAME="IDX151"></A>
+<DT><CODE>revert-line (M-r)</CODE>
+<DD><A NAME="IDX152"></A>
+Undo all changes made to this line.  This is like executing the <CODE>undo</CODE>
+command enough times to get back to the beginning.
+<P>
+
+<A NAME="IDX153"></A>
+<DT><CODE>tilde-expand (M-~)</CODE>
+<DD><A NAME="IDX154"></A>
+Perform tilde expansion on the current word.
+<P>
+
+<A NAME="IDX155"></A>
+<DT><CODE>set-mark (C-@)</CODE>
+<DD><A NAME="IDX156"></A>
+Set the mark to the point.  If a
+numeric argument is supplied, the mark is set to that position.
+<P>
+
+<A NAME="IDX157"></A>
+<DT><CODE>exchange-point-and-mark (C-x C-x)</CODE>
+<DD><A NAME="IDX158"></A>
+Swap the point with the mark.  The current cursor position is set to
+the saved position, and the old cursor position is saved as the mark.
+<P>
+
+<A NAME="IDX159"></A>
+<DT><CODE>character-search (C-])</CODE>
+<DD><A NAME="IDX160"></A>
+A character is read and point is moved to the next occurrence of that
+character.  A negative count searches for previous occurrences.
+<P>
+
+<A NAME="IDX161"></A>
+<DT><CODE>character-search-backward (M-C-])</CODE>
+<DD><A NAME="IDX162"></A>
+A character is read and point is moved to the previous occurrence
+of that character.  A negative count searches for subsequent
+occurrences.
+<P>
+
+<A NAME="IDX163"></A>
+<DT><CODE>insert-comment (M-#)</CODE>
+<DD><A NAME="IDX164"></A>
+Without a numeric argument, the value of the <CODE>comment-begin</CODE>
+variable is inserted at the beginning of the current line.
+If a numeric argument is supplied, this command acts as a toggle:  if
+the characters at the beginning of the line do not match the value
+of <CODE>comment-begin</CODE>, the value is inserted, otherwise
+the characters in <CODE>comment-begin</CODE> are deleted from the beginning of
+the line.
+In either case, the line is accepted as if a newline had been typed.
+<P>
+
+<A NAME="IDX165"></A>
+<DT><CODE>dump-functions ()</CODE>
+<DD><A NAME="IDX166"></A>
+Print all of the functions and their key bindings to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX167"></A>
+<DT><CODE>dump-variables ()</CODE>
+<DD><A NAME="IDX168"></A>
+Print all of the settable variables and their values to the
+Readline output stream.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX169"></A>
+<DT><CODE>dump-macros ()</CODE>
+<DD><A NAME="IDX170"></A>
+Print all of the Readline key sequences bound to macros and the
+strings they output.  If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an <VAR>inputrc</VAR> file.  This command is unbound by default.
+<P>
+
+<A NAME="IDX171"></A>
+<DT><CODE>emacs-editing-mode (C-e)</CODE>
+<DD><A NAME="IDX172"></A>
+When in <CODE>vi</CODE> command mode, this causes a switch to <CODE>emacs</CODE>
+editing mode.
+<P>
+
+<A NAME="IDX173"></A>
+<DT><CODE>vi-editing-mode (M-C-j)</CODE>
+<DD><A NAME="IDX174"></A>
+When in <CODE>emacs</CODE> editing mode, this causes a switch to <CODE>vi</CODE>
+editing mode.
+<P>
+
+</DL>
+<P>
+
+<A NAME="Readline vi Mode"></A>
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 1.5 Readline vi Mode </H2>
+<!--docid::SEC22::-->
+<P>
+
+While the Readline library does not have a full set of <CODE>vi</CODE>
+editing functions, it does contain enough to allow simple editing
+of the line.  The Readline <CODE>vi</CODE> mode behaves as specified in
+the POSIX 1003.2 standard.
+</P><P>
+
+In order to switch interactively between <CODE>emacs</CODE> and <CODE>vi</CODE>
+editing modes, use the command <KBD>M-C-j</KBD> (bound to emacs-editing-mode
+when in <CODE>vi</CODE> mode and to vi-editing-mode in <CODE>emacs</CODE> mode).
+The Readline default is <CODE>emacs</CODE> mode.
+</P><P>
+
+When you enter a line in <CODE>vi</CODE> mode, you are already placed in
+`insertion' mode, as if you had typed an <SAMP>`i'</SAMP>.  Pressing <KBD>ESC</KBD>
+switches you into `command' mode, where you can edit the text of the
+line with the standard <CODE>vi</CODE> movement keys, move to previous
+history lines with <SAMP>`k'</SAMP> and subsequent lines with <SAMP>`j'</SAMP>, and
+so forth.
+</P><P>
+
+<A NAME="Copying This Manual"></A>
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC24"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> A. Copying This Manual </H1>
+<!--docid::SEC23::-->
+<P>
+
+<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="rluserman.html#SEC24">A.1 GNU Free Documentation License</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">License for copying this manual.</TD></TR>
+</TABLE></BLOCKQUOTE>
+<P>
+
+<A NAME="GNU Free Documentation License"></A>
+<HR SIZE="6">
+<A NAME="SEC24"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC25"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> A.1 GNU Free Documentation License </H2>
+<!--docid::SEC24::-->
+<P>
+
+<A NAME="IDX175"></A>
+<center>
+ Version 1.2, November 2002
+</center>
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</pre></td></tr></table></P><P>
+
+<OL>
+<LI>
+PREAMBLE
+<P>
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document <EM>free</EM> in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+</P><P>
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+</P><P>
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+</P><P>
+
+<LI>
+APPLICABILITY AND DEFINITIONS
+<P>
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The "Document", below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as "you".  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+</P><P>
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+</P><P>
+
+A "Secondary Section" is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+</P><P>
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+</P><P>
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+</P><P>
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not "Transparent" is called "Opaque".
+</P><P>
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input
+format, <FONT SIZE="-1">SGML</FONT> or <FONT SIZE="-1">XML</FONT> using a publicly available
+<FONT SIZE="-1">DTD</FONT>, and standard-conforming simple <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> designed for human modification.  Examples
+of transparent image formats include <FONT SIZE="-1">PNG</FONT>, <FONT SIZE="-1">XCF</FONT> and
+<FONT SIZE="-1">JPG</FONT>.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, <FONT SIZE="-1">SGML</FONT> or
+<FONT SIZE="-1">XML</FONT> for which the <FONT SIZE="-1">DTD</FONT> and/or processing tools are
+not generally available, and the machine-generated <FONT SIZE="-1">HTML</FONT>,
+PostScript or <FONT SIZE="-1">PDF</FONT> produced by some word processors for
+output purposes only.
+</P><P>
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+</P><P>
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".)  To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+</P><P>
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+</P><P>
+
+<LI>
+VERBATIM COPYING
+<P>
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+</P><P>
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+</P><P>
+
+<LI>
+COPYING IN QUANTITY
+<P>
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+</P><P>
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+</P><P>
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+</P><P>
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+</P><P>
+
+<LI>
+MODIFICATIONS
+<P>
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+</P><P>
+
+<OL>
+<LI>
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+<P>
+
+<LI>
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+<P>
+
+<LI>
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+<P>
+
+<LI>
+Preserve all the copyright notices of the Document.
+<P>
+
+<LI>
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+<P>
+
+<LI>
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+<P>
+
+<LI>
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+<P>
+
+<LI>
+Include an unaltered copy of this License.
+<P>
+
+<LI>
+Preserve the section Entitled "History", Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled "History" in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+<P>
+
+<LI>
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the "History" section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+<P>
+
+<LI>
+For any section Entitled "Acknowledgements" or "Dedications", Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+<P>
+
+<LI>
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+<P>
+
+<LI>
+Delete any section Entitled "Endorsements".  Such a section
+may not be included in the Modified Version.
+<P>
+
+<LI>
+Do not retitle any existing section to be Entitled "Endorsements" or
+to conflict in title with any Invariant Section.
+<P>
+
+<LI>
+Preserve any Warranty Disclaimers.
+</OL>
+<P>
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+</P><P>
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+</P><P>
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+</P><P>
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+</P><P>
+
+<LI>
+COMBINING DOCUMENTS
+<P>
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+</P><P>
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+</P><P>
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications".  You must delete all
+sections Entitled "Endorsements."
+</P><P>
+
+<LI>
+COLLECTIONS OF DOCUMENTS
+<P>
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+</P><P>
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+</P><P>
+
+<LI>
+AGGREGATION WITH INDEPENDENT WORKS
+<P>
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+</P><P>
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+</P><P>
+
+<LI>
+TRANSLATION
+<P>
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+</P><P>
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+</P><P>
+
+<LI>
+TERMINATION
+<P>
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License.  Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License.  However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+</P><P>
+
+<LI>
+FUTURE REVISIONS OF THIS LICENSE
+<P>
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+<A HREF="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</A>.
+</P><P>
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+</OL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC25"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC24"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC23"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC24"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> A.1.1 ADDENDUM: How to use this License for your documents </H3>
+<!--docid::SEC25::-->
+<P>
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>  Copyright (C)  <VAR>year</VAR>  <VAR>your name</VAR>.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.2
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+</P><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>    with the Invariant Sections being <VAR>list their titles</VAR>, with
+    the Front-Cover Texts being <VAR>list</VAR>, and with the Back-Cover Texts
+    being <VAR>list</VAR>.
+</FONT></pre></td></tr></table></P><P>
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+</P><P>
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+</P><P>
+
+<HR SIZE="6">
+<A NAME="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Table of Contents</H1>
+<UL>
+<A NAME="TOC1" HREF="rluserman.html#SEC1">1. Command Line Editing</A>
+<BR>
+<UL>
+<A NAME="TOC2" HREF="rluserman.html#SEC2">1.1 Introduction to Line Editing</A>
+<BR>
+<A NAME="TOC3" HREF="rluserman.html#SEC3">1.2 Readline Interaction</A>
+<BR>
+<UL>
+<A NAME="TOC4" HREF="rluserman.html#SEC4">1.2.1 Readline Bare Essentials</A>
+<BR>
+<A NAME="TOC5" HREF="rluserman.html#SEC5">1.2.2 Readline Movement Commands</A>
+<BR>
+<A NAME="TOC6" HREF="rluserman.html#SEC6">1.2.3 Readline Killing Commands</A>
+<BR>
+<A NAME="TOC7" HREF="rluserman.html#SEC7">1.2.4 Readline Arguments</A>
+<BR>
+<A NAME="TOC8" HREF="rluserman.html#SEC8">1.2.5 Searching for Commands in the History</A>
+<BR>
+</UL>
+<A NAME="TOC9" HREF="rluserman.html#SEC9">1.3 Readline Init File</A>
+<BR>
+<UL>
+<A NAME="TOC10" HREF="rluserman.html#SEC10">1.3.1 Readline Init File Syntax</A>
+<BR>
+<A NAME="TOC11" HREF="rluserman.html#SEC11">1.3.2 Conditional Init Constructs</A>
+<BR>
+<A NAME="TOC12" HREF="rluserman.html#SEC12">1.3.3 Sample Init File</A>
+<BR>
+</UL>
+<A NAME="TOC13" HREF="rluserman.html#SEC13">1.4 Bindable Readline Commands</A>
+<BR>
+<UL>
+<A NAME="TOC14" HREF="rluserman.html#SEC14">1.4.1 Commands For Moving</A>
+<BR>
+<A NAME="TOC15" HREF="rluserman.html#SEC15">1.4.2 Commands For Manipulating The History</A>
+<BR>
+<A NAME="TOC16" HREF="rluserman.html#SEC16">1.4.3 Commands For Changing Text</A>
+<BR>
+<A NAME="TOC17" HREF="rluserman.html#SEC17">1.4.4 Killing And Yanking</A>
+<BR>
+<A NAME="TOC18" HREF="rluserman.html#SEC18">1.4.5 Specifying Numeric Arguments</A>
+<BR>
+<A NAME="TOC19" HREF="rluserman.html#SEC19">1.4.6 Letting Readline Type For You</A>
+<BR>
+<A NAME="TOC20" HREF="rluserman.html#SEC20">1.4.7 Keyboard Macros</A>
+<BR>
+<A NAME="TOC21" HREF="rluserman.html#SEC21">1.4.8 Some Miscellaneous Commands</A>
+<BR>
+</UL>
+<A NAME="TOC22" HREF="rluserman.html#SEC22">1.5 Readline vi Mode</A>
+<BR>
+</UL>
+<A NAME="TOC23" HREF="rluserman.html#SEC23">A. Copying This Manual</A>
+<BR>
+<UL>
+<A NAME="TOC24" HREF="rluserman.html#SEC24">A.1 GNU Free Documentation License</A>
+<BR>
+<UL>
+<A NAME="TOC25" HREF="rluserman.html#SEC25">A.1.1 ADDENDUM: How to use this License for your documents</A>
+<BR>
+</UL>
+</UL>
+</UL>
+<HR SIZE=1>
+<A NAME="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="rluserman.html#SEC1">1. Command Line Editing</A>
+<BR>
+<A NAME="TOC23" HREF="rluserman.html#SEC23">A. Copying This Manual</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<A NAME="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="rluserman.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1>About this document</H1>
+This document was generated by <I>Chet Ramey</I> on <I>September, 22  2003</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+<P></P>  
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+previous or up-and-previous section 
+</TD>
+<TD>
+1.1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next or up-and-next section
+</TD>
+<TD>
+1.3
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp; 
+</TD>
+</TR>
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+
+<HR SIZE=1>
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+by <I>Chet Ramey</I> on <I>September, 22  2003</I>
+using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
+"><I>texi2html</I></A>
+
+</BODY>
+</HTML>
diff --git a/lib/readline/doc/rluserman.info b/lib/readline/doc/rluserman.info
new file mode 100644 (file)
index 0000000..50c6b17
--- /dev/null
@@ -0,0 +1,1726 @@
+This is rluserman.info, produced by makeinfo version 4.5 from
+./rluserman.texi.
+
+This manual describes the end user interface of the GNU Readline Library
+(version 5.0, 19 September 2003), a library which aids in the
+consistency of user interface across discrete programs which provide a
+command line interface.
+
+   Copyright (C) 1988-2003 Free Software Foundation, Inc.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of the GNU Free Documentation License,
+     Version 1.1 or any later version published by the Free Software
+     Foundation; with no Invariant Sections, with the Front-Cover texts
+     being "A GNU Manual," and with the Back-Cover Texts as in (a)
+     below.  A copy of the license is included in the section entitled
+     "GNU Free Documentation License."
+
+     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
+     modify this GNU Manual, like GNU software.  Copies published by
+     the Free Software Foundation raise funds for GNU development."
+   
+INFO-DIR-SECTION Libraries
+START-INFO-DIR-ENTRY
+* RLuserman: (rluserman).       The GNU readline library User's Manual.
+END-INFO-DIR-ENTRY
+
+\1f
+File: rluserman.info,  Node: Top,  Next: Command Line Editing,  Up: (dir)
+
+GNU Readline Library
+********************
+
+   This document describes the end user interface of the GNU Readline
+Library, a utility which aids in the consistency of user interface
+across discrete programs which provide a command line interface.
+
+* Menu:
+
+* Command Line Editing::          GNU Readline User's Manual.
+* Copying This Manual::                Copying This Manual.
+
+\1f
+File: rluserman.info,  Node: Command Line Editing,  Next: Copying This Manual,  Prev: Top,  Up: Top
+
+Command Line Editing
+********************
+
+   This chapter describes the basic features of the GNU command line
+editing interface.
+
+* Menu:
+
+* Introduction and Notation::  Notation used in this text.
+* Readline Interaction::       The minimum set of commands for editing a line.
+* Readline Init File::         Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+                               available for binding
+* Readline vi Mode::           A short description of how to make Readline
+                               behave like the vi editor.
+
+\1f
+File: rluserman.info,  Node: Introduction and Notation,  Next: Readline Interaction,  Up: Command Line Editing
+
+Introduction to Line Editing
+============================
+
+   The following paragraphs describe the notation used to represent
+keystrokes.
+
+   The text `C-k' is read as `Control-K' and describes the character
+produced when the <k> key is pressed while the Control key is depressed.
+
+   The text `M-k' is read as `Meta-K' and describes the character
+produced when the Meta key (if you have one) is depressed, and the <k>
+key is pressed.  The Meta key is labeled <ALT> on many keyboards.  On
+keyboards with two keys labeled <ALT> (usually to either side of the
+space bar), the <ALT> on the left side is generally set to work as a
+Meta key.  The <ALT> key on the right may also be configured to work as
+a Meta key or may be configured as some other modifier, such as a
+Compose key for typing accented characters.
+
+   If you do not have a Meta or <ALT> key, or another key working as a
+Meta key, the identical keystroke can be generated by typing <ESC>
+_first_, and then typing <k>.  Either process is known as "metafying"
+the <k> key.
+
+   The text `M-C-k' is read as `Meta-Control-k' and describes the
+character produced by "metafying" `C-k'.
+
+   In addition, several keys have their own names.  Specifically,
+<DEL>, <ESC>, <LFD>, <SPC>, <RET>, and <TAB> all stand for themselves
+when seen in this text, or in an init file (*note Readline Init File::).
+If your keyboard lacks a <LFD> key, typing <C-j> will produce the
+desired character.  The <RET> key may be labeled <Return> or <Enter> on
+some keyboards.
+
+\1f
+File: rluserman.info,  Node: Readline Interaction,  Next: Readline Init File,  Prev: Introduction and Notation,  Up: Command Line Editing
+
+Readline Interaction
+====================
+
+   Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled.  The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line.  Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections.  Then, when you are satisfied with
+the line, you simply press <RET>.  You do not have to be at the end of
+the line to press <RET>; the entire line is accepted regardless of the
+location of the cursor within the line.
+
+* Menu:
+
+* Readline Bare Essentials::   The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands::  How to delete text, and how to get it back!
+* Readline Arguments::         Giving numeric arguments to commands.
+* Searching::                  Searching through previous lines.
+
+\1f
+File: rluserman.info,  Node: Readline Bare Essentials,  Next: Readline Movement Commands,  Up: Readline Interaction
+
+Readline Bare Essentials
+------------------------
+
+   In order to enter characters into the line, simply type them.  The
+typed character appears where the cursor was, and then the cursor moves
+one space to the right.  If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+
+   Sometimes you may mistype a character, and not notice the error
+until you have typed several other characters.  In that case, you can
+type `C-b' to move the cursor to the left, and then correct your
+mistake.  Afterwards, you can move the cursor to the right with `C-f'.
+
+   When you add text in the middle of a line, you will notice that
+characters to the right of the cursor are `pushed over' to make room
+for the text that you have inserted.  Likewise, when you delete text
+behind the cursor, characters to the right of the cursor are `pulled
+back' to fill in the blank space created by the removal of the text.  A
+list of the bare essentials for editing the text of an input line
+follows.
+
+`C-b'
+     Move back one character.
+
+`C-f'
+     Move forward one character.
+
+<DEL> or <Backspace>
+     Delete the character to the left of the cursor.
+
+`C-d'
+     Delete the character underneath the cursor.
+
+Printing characters
+     Insert the character into the line at the cursor.
+
+`C-_' or `C-x C-u'
+     Undo the last editing command.  You can undo all the way back to an
+     empty line.
+
+(Depending on your configuration, the <Backspace> key be set to delete
+the character to the left of the cursor and the <DEL> key set to delete
+the character underneath the cursor, like `C-d', rather than the
+character to the left of the cursor.)
+
+\1f
+File: rluserman.info,  Node: Readline Movement Commands,  Next: Readline Killing Commands,  Prev: Readline Bare Essentials,  Up: Readline Interaction
+
+Readline Movement Commands
+--------------------------
+
+   The above table describes the most basic keystrokes that you need in
+order to do editing of the input line.  For your convenience, many
+other commands have been added in addition to `C-b', `C-f', `C-d', and
+<DEL>.  Here are some commands for moving more rapidly about the line.
+
+`C-a'
+     Move to the start of the line.
+
+`C-e'
+     Move to the end of the line.
+
+`M-f'
+     Move forward a word, where a word is composed of letters and
+     digits.
+
+`M-b'
+     Move backward a word.
+
+`C-l'
+     Clear the screen, reprinting the current line at the top.
+
+   Notice how `C-f' moves forward a character, while `M-f' moves
+forward a word.  It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+
+\1f
+File: rluserman.info,  Node: Readline Killing Commands,  Next: Readline Arguments,  Prev: Readline Movement Commands,  Up: Readline Interaction
+
+Readline Killing Commands
+-------------------------
+
+   "Killing" text means to delete the text from the line, but to save
+it away for later use, usually by "yanking" (re-inserting) it back into
+the line.  (`Cut' and `paste' are more recent jargon for `kill' and
+`yank'.)
+
+   If the description for a command says that it `kills' text, then you
+can be sure that you can get the text back in a different (or the same)
+place later.
+
+   When you use a kill command, the text is saved in a "kill-ring".
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all.  The kill ring is not line
+specific; the text that you killed on a previously typed line is
+available to be yanked back later, when you are typing another line.
+
+   Here is the list of commands for killing text.
+
+`C-k'
+     Kill the text from the current cursor position to the end of the
+     line.
+
+`M-d'
+     Kill from the cursor to the end of the current word, or, if between
+     words, to the end of the next word.  Word boundaries are the same
+     as those used by `M-f'.
+
+`M-<DEL>'
+     Kill from the cursor the start of the current word, or, if between
+     words, to the start of the previous word.  Word boundaries are the
+     same as those used by `M-b'.
+
+`C-w'
+     Kill from the cursor to the previous whitespace.  This is
+     different than `M-<DEL>' because the word boundaries differ.
+
+
+   Here is how to "yank" the text back into the line.  Yanking means to
+copy the most-recently-killed text from the kill buffer.
+
+`C-y'
+     Yank the most recently killed text back into the buffer at the
+     cursor.
+
+`M-y'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `C-y' or `M-y'.
+
+\1f
+File: rluserman.info,  Node: Readline Arguments,  Next: Searching,  Prev: Readline Killing Commands,  Up: Readline Interaction
+
+Readline Arguments
+------------------
+
+   You can pass numeric arguments to Readline commands.  Sometimes the
+argument acts as a repeat count, other times it is the sign of the
+argument that is significant.  If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction.  For example, to kill text back to the
+start of the line, you might type `M-- C-k'.
+
+   The general way to pass numeric arguments to a command is to type
+meta digits before the command.  If the first `digit' typed is a minus
+sign (`-'), then the sign of the argument will be negative.  Once you
+have typed one meta digit to get the argument started, you can type the
+remainder of the digits, and then the command.  For example, to give
+the `C-d' command an argument of 10, you could type `M-1 0 C-d', which
+will delete the next ten characters on the input line.
+
+\1f
+File: rluserman.info,  Node: Searching,  Prev: Readline Arguments,  Up: Readline Interaction
+
+Searching for Commands in the History
+-------------------------------------
+
+   Readline provides commands for searching through the command history
+for lines containing a specified string.  There are two search modes:
+"incremental" and "non-incremental".
+
+   Incremental searches begin before the user has finished typing the
+search string.  As each character of the search string is typed,
+Readline displays the next entry from the history matching the string
+typed so far.  An incremental search requires only as many characters
+as needed to find the desired history entry.  To search backward in the
+history for a particular string, type `C-r'.  Typing `C-s' searches
+forward through the history.  The characters present in the value of
+the `isearch-terminators' variable are used to terminate an incremental
+search.  If that variable has not been assigned a value, the <ESC> and
+`C-J' characters will terminate an incremental search.  `C-g' will
+abort an incremental search and restore the original line.  When the
+search is terminated, the history entry containing the search string
+becomes the current line.
+
+   To find other matching entries in the history list, type `C-r' or
+`C-s' as appropriate.  This will search backward or forward in the
+history for the next entry matching the search string typed so far.
+Any other key sequence bound to a Readline command will terminate the
+search and execute that command.  For instance, a <RET> will terminate
+the search and accept the line, thereby executing the command from the
+history list.  A movement command will terminate the search, make the
+last line found the current line, and begin editing.
+
+   Readline remembers the last incremental search string.  If two
+`C-r's are typed without any intervening characters defining a new
+search string, any remembered search string is used.
+
+   Non-incremental searches read the entire search string before
+starting to search for matching history lines.  The search string may be
+typed by the user or be part of the contents of the current line.
+
+\1f
+File: rluserman.info,  Node: Readline Init File,  Next: Bindable Readline Commands,  Prev: Readline Interaction,  Up: Command Line Editing
+
+Readline Init File
+==================
+
+   Although the Readline library comes with a set of Emacs-like
+keybindings installed by default, it is possible to use a different set
+of keybindings.  Any user can customize programs that use Readline by
+putting commands in an "inputrc" file, conventionally in his home
+directory.  The name of this file is taken from the value of the
+environment variable `INPUTRC'.  If that variable is unset, the default
+is `~/.inputrc'.
+
+   When a program which uses the Readline library starts up, the init
+file is read, and the key bindings are set.
+
+   In addition, the `C-x C-r' command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+* Menu:
+
+* Readline Init File Syntax::  Syntax for the commands in the inputrc file.
+
+* Conditional Init Constructs::        Conditional key bindings in the inputrc file.
+
+* Sample Init File::           An example inputrc file.
+
+\1f
+File: rluserman.info,  Node: Readline Init File Syntax,  Next: Conditional Init Constructs,  Up: Readline Init File
+
+Readline Init File Syntax
+-------------------------
+
+   There are only a few basic constructs allowed in the Readline init
+file.  Blank lines are ignored.  Lines beginning with a `#' are
+comments.  Lines beginning with a `$' indicate conditional constructs
+(*note Conditional Init Constructs::).  Other lines denote variable
+settings and key bindings.
+
+Variable Settings
+     You can modify the run-time behavior of Readline by altering the
+     values of variables in Readline using the `set' command within the
+     init file.  The syntax is simple:
+
+          set VARIABLE VALUE
+
+     Here, for example, is how to change from the default Emacs-like
+     key binding to use `vi' line editing commands:
+
+          set editing-mode vi
+
+     Variable names and values, where appropriate, are recognized
+     without regard to case.
+
+     A great deal of run-time behavior is changeable with the following
+     variables.
+
+    `bell-style'
+          Controls what happens when Readline wants to ring the
+          terminal bell.  If set to `none', Readline never rings the
+          bell.  If set to `visible', Readline uses a visible bell if
+          one is available.  If set to `audible' (the default),
+          Readline attempts to ring the terminal's bell.
+
+    `comment-begin'
+          The string to insert at the beginning of the line when the
+          `insert-comment' command is executed.  The default value is
+          `"#"'.
+
+    `completion-ignore-case'
+          If set to `on', Readline performs filename matching and
+          completion in a case-insensitive fashion.  The default value
+          is `off'.
+
+    `completion-query-items'
+          The number of possible completions that determines when the
+          user is asked whether the list of possibilities should be
+          displayed.  If the number of possible completions is greater
+          than this value, Readline will ask the user whether or not he
+          wishes to view them; otherwise, they are simply listed.  This
+          variable must be set to an integer value greater than or
+          equal to 0.  The default limit is `100'.
+
+    `convert-meta'
+          If set to `on', Readline will convert characters with the
+          eighth bit set to an ASCII key sequence by stripping the
+          eighth bit and prefixing an <ESC> character, converting them
+          to a meta-prefixed key sequence.  The default value is `on'.
+
+    `disable-completion'
+          If set to `On', Readline will inhibit word completion.
+          Completion  characters will be inserted into the line as if
+          they had been mapped to `self-insert'.  The default is `off'.
+
+    `editing-mode'
+          The `editing-mode' variable controls which default set of key
+          bindings is used.  By default, Readline starts up in Emacs
+          editing mode, where the keystrokes are most similar to Emacs.
+          This variable can be set to either `emacs' or `vi'.
+
+    `enable-keypad'
+          When set to `on', Readline will try to enable the application
+          keypad when it is called.  Some systems need this to enable
+          the arrow keys.  The default is `off'.
+
+    `expand-tilde'
+          If set to `on', tilde expansion is performed when Readline
+          attempts word completion.  The default is `off'.
+
+          If set to `on', the history code attempts to place point at
+          the same location on each history line retrieved with
+          `previous-history' or `next-history'.
+
+    `horizontal-scroll-mode'
+          This variable can be set to either `on' or `off'.  Setting it
+          to `on' means that the text of the lines being edited will
+          scroll horizontally on a single screen line when they are
+          longer than the width of the screen, instead of wrapping onto
+          a new screen line.  By default, this variable is set to `off'.
+
+    `input-meta'
+          If set to `on', Readline will enable eight-bit input (it will
+          not clear the eighth bit in the characters it reads),
+          regardless of what the terminal claims it can support.  The
+          default value is `off'.  The name `meta-flag' is a synonym
+          for this variable.
+
+    `isearch-terminators'
+          The string of characters that should terminate an incremental
+          search without subsequently executing the character as a
+          command (*note Searching::).  If this variable has not been
+          given a value, the characters <ESC> and `C-J' will terminate
+          an incremental search.
+
+    `keymap'
+          Sets Readline's idea of the current keymap for key binding
+          commands.  Acceptable `keymap' names are `emacs',
+          `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', `vi-move',
+          `vi-command', and `vi-insert'.  `vi' is equivalent to
+          `vi-command'; `emacs' is equivalent to `emacs-standard'.  The
+          default value is `emacs'.  The value of the `editing-mode'
+          variable also affects the default keymap.
+
+    `mark-directories'
+          If set to `on', completed directory names have a slash
+          appended.  The default is `on'.
+
+    `mark-modified-lines'
+          This variable, when set to `on', causes Readline to display an
+          asterisk (`*') at the start of history lines which have been
+          modified.  This variable is `off' by default.
+
+    `mark-symlinked-directories'
+          If set to `on', completed names which are symbolic links to
+          directories have a slash appended (subject to the value of
+          `mark-directories').  The default is `off'.
+
+    `match-hidden-files'
+          This variable, when set to `on', causes Readline to match
+          files whose names begin with a `.' (hidden files) when
+          performing filename completion, unless the leading `.' is
+          supplied by the user in the filename to be completed.  This
+          variable is `on' by default.
+
+    `output-meta'
+          If set to `on', Readline will display characters with the
+          eighth bit set directly rather than as a meta-prefixed escape
+          sequence.  The default is `off'.
+
+    `page-completions'
+          If set to `on', Readline uses an internal `more'-like pager
+          to display a screenful of possible completions at a time.
+          This variable is `on' by default.
+
+    `print-completions-horizontally'
+          If set to `on', Readline will display completions with matches
+          sorted horizontally in alphabetical order, rather than down
+          the screen.  The default is `off'.
+
+    `show-all-if-ambiguous'
+          This alters the default behavior of the completion functions.
+          If set to `on', words which have more than one possible
+          completion cause the matches to be listed immediately instead
+          of ringing the bell.  The default value is `off'.
+
+    `show-all-if-unmodified'
+          This alters the default behavior of the completion functions
+          in a fashion similar to SHOW-ALL-IF-AMBIGUOUS.  If set to
+          `on', words which have more than one possible completion
+          without any possible partial completion (the possible
+          completions don't share a common prefix) cause the matches to
+          be listed immediately instead of ringing the bell.  The
+          default value is `off'.
+
+    `visible-stats'
+          If set to `on', a character denoting a file's type is
+          appended to the filename when listing possible completions.
+          The default is `off'.
+
+
+Key Bindings
+     The syntax for controlling key bindings in the init file is
+     simple.  First you need to find the name of the command that you
+     want to change.  The following sections contain tables of the
+     command name, the default keybinding, if any, and a short
+     description of what the command does.
+
+     Once you know the name of the command, simply place on a line in
+     the init file the name of the key you wish to bind the command to,
+     a colon, and then the name of the command.  The name of the key
+     can be expressed in different ways, depending on what you find most
+     comfortable.
+
+     In addition to command names, readline allows keys to be bound to
+     a string that is inserted when the key is pressed (a MACRO).
+
+    KEYNAME: FUNCTION-NAME or MACRO
+          KEYNAME is the name of a key spelled out in English.  For
+          example:
+               Control-u: universal-argument
+               Meta-Rubout: backward-kill-word
+               Control-o: "> output"
+
+          In the above example, `C-u' is bound to the function
+          `universal-argument', `M-DEL' is bound to the function
+          `backward-kill-word', and `C-o' is bound to run the macro
+          expressed on the right hand side (that is, to insert the text
+          `> output' into the line).
+
+          A number of symbolic character names are recognized while
+          processing this key binding syntax: DEL, ESC, ESCAPE, LFD,
+          NEWLINE, RET, RETURN, RUBOUT, SPACE, SPC, and TAB.
+
+    "KEYSEQ": FUNCTION-NAME or MACRO
+          KEYSEQ differs from KEYNAME above in that strings denoting an
+          entire key sequence can be specified, by placing the key
+          sequence in double quotes.  Some GNU Emacs style key escapes
+          can be used, as in the following example, but the special
+          character names are not recognized.
+
+               "\C-u": universal-argument
+               "\C-x\C-r": re-read-init-file
+               "\e[11~": "Function Key 1"
+
+          In the above example, `C-u' is again bound to the function
+          `universal-argument' (just as it was in the first example),
+          `C-x C-r' is bound to the function `re-read-init-file', and
+          `<ESC> <[> <1> <1> <~>' is bound to insert the text `Function
+          Key 1'.
+
+
+     The following GNU Emacs style escape sequences are available when
+     specifying key sequences:
+
+    `\C-'
+          control prefix
+
+    `\M-'
+          meta prefix
+
+    `\e'
+          an escape character
+
+    `\\'
+          backslash
+
+    `\"'
+          <">, a double quotation mark
+
+    `\''
+          <'>, a single quote or apostrophe
+
+     In addition to the GNU Emacs style escape sequences, a second set
+     of backslash escapes is available:
+
+    `\a'
+          alert (bell)
+
+    `\b'
+          backspace
+
+    `\d'
+          delete
+
+    `\f'
+          form feed
+
+    `\n'
+          newline
+
+    `\r'
+          carriage return
+
+    `\t'
+          horizontal tab
+
+    `\v'
+          vertical tab
+
+    `\NNN'
+          the eight-bit character whose value is the octal value NNN
+          (one to three digits)
+
+    `\xHH'
+          the eight-bit character whose value is the hexadecimal value
+          HH (one or two hex digits)
+
+     When entering the text of a macro, single or double quotes must be
+     used to indicate a macro definition.  Unquoted text is assumed to
+     be a function name.  In the macro body, the backslash escapes
+     described above are expanded.  Backslash will quote any other
+     character in the macro text, including `"' and `''.  For example,
+     the following binding will make `C-x \' insert a single `\' into
+     the line:
+          "\C-x\\": "\\"
+
+
+\1f
+File: rluserman.info,  Node: Conditional Init Constructs,  Next: Sample Init File,  Prev: Readline Init File Syntax,  Up: Readline Init File
+
+Conditional Init Constructs
+---------------------------
+
+   Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key bindings
+and variable settings to be performed as the result of tests.  There
+are four parser directives used.
+
+`$if'
+     The `$if' construct allows bindings to be made based on the
+     editing mode, the terminal being used, or the application using
+     Readline.  The text of the test extends to the end of the line; no
+     characters are required to isolate it.
+
+    `mode'
+          The `mode=' form of the `$if' directive is used to test
+          whether Readline is in `emacs' or `vi' mode.  This may be
+          used in conjunction with the `set keymap' command, for
+          instance, to set bindings in the `emacs-standard' and
+          `emacs-ctlx' keymaps only if Readline is starting out in
+          `emacs' mode.
+
+    `term'
+          The `term=' form may be used to include terminal-specific key
+          bindings, perhaps to bind the key sequences output by the
+          terminal's function keys.  The word on the right side of the
+          `=' is tested against both the full name of the terminal and
+          the portion of the terminal name before the first `-'.  This
+          allows `sun' to match both `sun' and `sun-cmd', for instance.
+
+    `application'
+          The APPLICATION construct is used to include
+          application-specific settings.  Each program using the
+          Readline library sets the APPLICATION NAME, and you can test
+          for a particular value.  This could be used to bind key
+          sequences to functions useful for a specific program.  For
+          instance, the following command adds a key sequence that
+          quotes the current or previous word in Bash:
+               $if Bash
+               # Quote the current or previous word
+               "\C-xq": "\eb\"\ef\""
+               $endif
+
+`$endif'
+     This command, as seen in the previous example, terminates an `$if'
+     command.
+
+`$else'
+     Commands in this branch of the `$if' directive are executed if the
+     test fails.
+
+`$include'
+     This directive takes a single filename as an argument and reads
+     commands and bindings from that file.  For example, the following
+     directive reads from `/etc/inputrc':
+          $include /etc/inputrc
+
+\1f
+File: rluserman.info,  Node: Sample Init File,  Prev: Conditional Init Constructs,  Up: Readline Init File
+
+Sample Init File
+----------------
+
+   Here is an example of an INPUTRC file.  This illustrates key
+binding, variable assignment, and conditional syntax.
+
+
+     # This file controls the behaviour of line input editing for
+     # programs that use the GNU Readline library.  Existing
+     # programs include FTP, Bash, and GDB.
+     #
+     # You can re-read the inputrc file with C-x C-r.
+     # Lines beginning with '#' are comments.
+     #
+     # First, include any systemwide bindings and variable
+     # assignments from /etc/Inputrc
+     $include /etc/Inputrc
+     
+     #
+     # Set various bindings for emacs mode.
+     
+     set editing-mode emacs
+     
+     $if mode=emacs
+     
+     Meta-Control-h:   backward-kill-word      Text after the function name is ignored
+     
+     #
+     # Arrow keys in keypad mode
+     #
+     #"\M-OD":        backward-char
+     #"\M-OC":        forward-char
+     #"\M-OA":        previous-history
+     #"\M-OB":        next-history
+     #
+     # Arrow keys in ANSI mode
+     #
+     "\M-[D":        backward-char
+     "\M-[C":        forward-char
+     "\M-[A":        previous-history
+     "\M-[B":        next-history
+     #
+     # Arrow keys in 8 bit keypad mode
+     #
+     #"\M-\C-OD":       backward-char
+     #"\M-\C-OC":       forward-char
+     #"\M-\C-OA":       previous-history
+     #"\M-\C-OB":       next-history
+     #
+     # Arrow keys in 8 bit ANSI mode
+     #
+     #"\M-\C-[D":       backward-char
+     #"\M-\C-[C":       forward-char
+     #"\M-\C-[A":       previous-history
+     #"\M-\C-[B":       next-history
+     
+     C-q: quoted-insert
+     
+     $endif
+     
+     # An old-style binding.  This happens to be the default.
+     TAB: complete
+     
+     # Macros that are convenient for shell interaction
+     $if Bash
+     # edit the path
+     "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
+     # prepare to type a quoted word --
+     # insert open and close double quotes
+     # and move to just after the open quote
+     "\C-x\"": "\"\"\C-b"
+     # insert a backslash (testing backslash escapes
+     # in sequences and macros)
+     "\C-x\\": "\\"
+     # Quote the current or previous word
+     "\C-xq": "\eb\"\ef\""
+     # Add a binding to refresh the line, which is unbound
+     "\C-xr": redraw-current-line
+     # Edit variable on current line.
+     "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
+     $endif
+     
+     # use a visible bell if one is available
+     set bell-style visible
+     
+     # don't strip characters to 7 bits when reading
+     set input-meta on
+     
+     # allow iso-latin1 characters to be inserted rather
+     # than converted to prefix-meta sequences
+     set convert-meta off
+     
+     # display characters with the eighth bit set directly
+     # rather than as meta-prefixed characters
+     set output-meta on
+     
+     # if there are more than 150 possible completions for
+     # a word, ask the user if he wants to see all of them
+     set completion-query-items 150
+     
+     # For FTP
+     $if Ftp
+     "\C-xg": "get \M-?"
+     "\C-xt": "put \M-?"
+     "\M-.": yank-last-arg
+     $endif
+
+\1f
+File: rluserman.info,  Node: Bindable Readline Commands,  Next: Readline vi Mode,  Prev: Readline Init File,  Up: Command Line Editing
+
+Bindable Readline Commands
+==========================
+
+* Menu:
+
+* Commands For Moving::                Moving about the line.
+* Commands For History::       Getting at previous lines.
+* Commands For Text::          Commands for changing text.
+* Commands For Killing::       Commands for killing and yanking.
+* Numeric Arguments::          Specifying numeric arguments, repeat counts.
+* Commands For Completion::    Getting Readline to do the typing for you.
+* Keyboard Macros::            Saving and re-executing typed characters
+* Miscellaneous Commands::     Other miscellaneous commands.
+
+   This section describes Readline commands that may be bound to key
+sequences.  Command names without an accompanying key sequence are
+unbound by default.
+
+   In the following descriptions, "point" refers to the current cursor
+position, and "mark" refers to a cursor position saved by the
+`set-mark' command.  The text between the point and mark is referred to
+as the "region".
+
+\1f
+File: rluserman.info,  Node: Commands For Moving,  Next: Commands For History,  Up: Bindable Readline Commands
+
+Commands For Moving
+-------------------
+
+`beginning-of-line (C-a)'
+     Move to the start of the current line.
+
+`end-of-line (C-e)'
+     Move to the end of the line.
+
+`forward-char (C-f)'
+     Move forward a character.
+
+`backward-char (C-b)'
+     Move back a character.
+
+`forward-word (M-f)'
+     Move forward to the end of the next word.  Words are composed of
+     letters and digits.
+
+`backward-word (M-b)'
+     Move back to the start of the current or previous word.  Words are
+     composed of letters and digits.
+
+`clear-screen (C-l)'
+     Clear the screen and redraw the current line, leaving the current
+     line at the top of the screen.
+
+`redraw-current-line ()'
+     Refresh the current line.  By default, this is unbound.
+
+
+\1f
+File: rluserman.info,  Node: Commands For History,  Next: Commands For Text,  Prev: Commands For Moving,  Up: Bindable Readline Commands
+
+Commands For Manipulating The History
+-------------------------------------
+
+`accept-line (Newline or Return)'
+     Accept the line regardless of where the cursor is.  If this line is
+     non-empty, it may be added to the history list for future recall
+     with `add_history()'.  If this line is a modified history line,
+     the history line is restored to its original state.
+
+`previous-history (C-p)'
+     Move `back' through the history list, fetching the previous
+     command.
+
+`next-history (C-n)'
+     Move `forward' through the history list, fetching the next command.
+
+`beginning-of-history (M-<)'
+     Move to the first line in the history.
+
+`end-of-history (M->)'
+     Move to the end of the input history, i.e., the line currently
+     being entered.
+
+`reverse-search-history (C-r)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary.  This is an incremental search.
+
+`forward-search-history (C-s)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary.  This is an incremental
+     search.
+
+`non-incremental-reverse-search-history (M-p)'
+     Search backward starting at the current line and moving `up'
+     through the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`non-incremental-forward-search-history (M-n)'
+     Search forward starting at the current line and moving `down'
+     through the the history as necessary using a non-incremental search
+     for a string supplied by the user.
+
+`history-search-forward ()'
+     Search forward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`history-search-backward ()'
+     Search backward through the history for the string of characters
+     between the start of the current line and the point.  This is a
+     non-incremental search.  By default, this command is unbound.
+
+`yank-nth-arg (M-C-y)'
+     Insert the first argument to the previous command (usually the
+     second word on the previous line) at point.  With an argument N,
+     insert the Nth word from the previous command (the words in the
+     previous command begin with word 0).  A negative argument inserts
+     the Nth word from the end of the previous command.
+
+`yank-last-arg (M-. or M-_)'
+     Insert last argument to the previous command (the last word of the
+     previous history entry).  With an argument, behave exactly like
+     `yank-nth-arg'.  Successive calls to `yank-last-arg' move back
+     through the history list, inserting the last argument of each line
+     in turn.
+
+
+\1f
+File: rluserman.info,  Node: Commands For Text,  Next: Commands For Killing,  Prev: Commands For History,  Up: Bindable Readline Commands
+
+Commands For Changing Text
+--------------------------
+
+`delete-char (C-d)'
+     Delete the character at point.  If point is at the beginning of
+     the line, there are no characters in the line, and the last
+     character typed was not bound to `delete-char', then return EOF.
+
+`backward-delete-char (Rubout)'
+     Delete the character behind the cursor.  A numeric argument means
+     to kill the characters instead of deleting them.
+
+`forward-backward-delete-char ()'
+     Delete the character under the cursor, unless the cursor is at the
+     end of the line, in which case the character behind the cursor is
+     deleted.  By default, this is not bound to a key.
+
+`quoted-insert (C-q or C-v)'
+     Add the next character typed to the line verbatim.  This is how to
+     insert key sequences like `C-q', for example.
+
+`tab-insert (M-<TAB>)'
+     Insert a tab character.
+
+`self-insert (a, b, A, 1, !, ...)'
+     Insert yourself.
+
+`transpose-chars (C-t)'
+     Drag the character before the cursor forward over the character at
+     the cursor, moving the cursor forward as well.  If the insertion
+     point is at the end of the line, then this transposes the last two
+     characters of the line.  Negative arguments have no effect.
+
+`transpose-words (M-t)'
+     Drag the word before point past the word after point, moving point
+     past that word as well.  If the insertion point is at the end of
+     the line, this transposes the last two words on the line.
+
+`upcase-word (M-u)'
+     Uppercase the current (or following) word.  With a negative
+     argument, uppercase the previous word, but do not move the cursor.
+
+`downcase-word (M-l)'
+     Lowercase the current (or following) word.  With a negative
+     argument, lowercase the previous word, but do not move the cursor.
+
+`capitalize-word (M-c)'
+     Capitalize the current (or following) word.  With a negative
+     argument, capitalize the previous word, but do not move the cursor.
+
+`overwrite-mode ()'
+     Toggle overwrite mode.  With an explicit positive numeric argument,
+     switches to overwrite mode.  With an explicit non-positive numeric
+     argument, switches to insert mode.  This command affects only
+     `emacs' mode; `vi' mode does overwrite differently.  Each call to
+     `readline()' starts in insert mode.
+
+     In overwrite mode, characters bound to `self-insert' replace the
+     text at point rather than pushing the text to the right.
+     Characters bound to `backward-delete-char' replace the character
+     before point with a space.
+
+     By default, this command is unbound.
+
+
+\1f
+File: rluserman.info,  Node: Commands For Killing,  Next: Numeric Arguments,  Prev: Commands For Text,  Up: Bindable Readline Commands
+
+Killing And Yanking
+-------------------
+
+`kill-line (C-k)'
+     Kill the text from point to the end of the line.
+
+`backward-kill-line (C-x Rubout)'
+     Kill backward to the beginning of the line.
+
+`unix-line-discard (C-u)'
+     Kill backward from the cursor to the beginning of the current line.
+
+`kill-whole-line ()'
+     Kill all characters on the current line, no matter where point is.
+     By default, this is unbound.
+
+`kill-word (M-d)'
+     Kill from point to the end of the current word, or if between
+     words, to the end of the next word.  Word boundaries are the same
+     as `forward-word'.
+
+`backward-kill-word (M-<DEL>)'
+     Kill the word behind point.  Word boundaries are the same as
+     `backward-word'.
+
+`unix-word-rubout (C-w)'
+     Kill the word behind point, using white space as a word boundary.
+     The killed text is saved on the kill-ring.
+
+`delete-horizontal-space ()'
+     Delete all spaces and tabs around point.  By default, this is
+     unbound.
+
+`kill-region ()'
+     Kill the text in the current region.  By default, this command is
+     unbound.
+
+`copy-region-as-kill ()'
+     Copy the text in the region to the kill buffer, so it can be yanked
+     right away.  By default, this command is unbound.
+
+`copy-backward-word ()'
+     Copy the word before point to the kill buffer.  The word
+     boundaries are the same as `backward-word'.  By default, this
+     command is unbound.
+
+`copy-forward-word ()'
+     Copy the word following point to the kill buffer.  The word
+     boundaries are the same as `forward-word'.  By default, this
+     command is unbound.
+
+`yank (C-y)'
+     Yank the top of the kill ring into the buffer at point.
+
+`yank-pop (M-y)'
+     Rotate the kill-ring, and yank the new top.  You can only do this
+     if the prior command is `yank' or `yank-pop'.
+
+\1f
+File: rluserman.info,  Node: Numeric Arguments,  Next: Commands For Completion,  Prev: Commands For Killing,  Up: Bindable Readline Commands
+
+Specifying Numeric Arguments
+----------------------------
+
+`digit-argument (M-0, M-1, ... M--)'
+     Add this digit to the argument already accumulating, or start a new
+     argument.  `M--' starts a negative argument.
+
+`universal-argument ()'
+     This is another way to specify an argument.  If this command is
+     followed by one or more digits, optionally with a leading minus
+     sign, those digits define the argument.  If the command is
+     followed by digits, executing `universal-argument' again ends the
+     numeric argument, but is otherwise ignored.  As a special case, if
+     this command is immediately followed by a character that is
+     neither a digit or minus sign, the argument count for the next
+     command is multiplied by four.  The argument count is initially
+     one, so executing this function the first time makes the argument
+     count four, a second time makes the argument count sixteen, and so
+     on.  By default, this is not bound to a key.
+
+\1f
+File: rluserman.info,  Node: Commands For Completion,  Next: Keyboard Macros,  Prev: Numeric Arguments,  Up: Bindable Readline Commands
+
+Letting Readline Type For You
+-----------------------------
+
+`complete (<TAB>)'
+     Attempt to perform completion on the text before point.  The
+     actual completion performed is application-specific.  The default
+     is filename completion.
+
+`possible-completions (M-?)'
+     List the possible completions of the text before point.
+
+`insert-completions (M-*)'
+     Insert all completions of the text before point that would have
+     been generated by `possible-completions'.
+
+`menu-complete ()'
+     Similar to `complete', but replaces the word to be completed with
+     a single match from the list of possible completions.  Repeated
+     execution of `menu-complete' steps through the list of possible
+     completions, inserting each match in turn.  At the end of the list
+     of completions, the bell is rung (subject to the setting of
+     `bell-style') and the original text is restored.  An argument of N
+     moves N positions forward in the list of matches; a negative
+     argument may be used to move backward through the list.  This
+     command is intended to be bound to <TAB>, but is unbound by
+     default.
+
+`delete-char-or-list ()'
+     Deletes the character under the cursor if not at the beginning or
+     end of the line (like `delete-char').  If at the end of the line,
+     behaves identically to `possible-completions'.  This command is
+     unbound by default.
+
+
+\1f
+File: rluserman.info,  Node: Keyboard Macros,  Next: Miscellaneous Commands,  Prev: Commands For Completion,  Up: Bindable Readline Commands
+
+Keyboard Macros
+---------------
+
+`start-kbd-macro (C-x ()'
+     Begin saving the characters typed into the current keyboard macro.
+
+`end-kbd-macro (C-x ))'
+     Stop saving the characters typed into the current keyboard macro
+     and save the definition.
+
+`call-last-kbd-macro (C-x e)'
+     Re-execute the last keyboard macro defined, by making the
+     characters in the macro appear as if typed at the keyboard.
+
+
+\1f
+File: rluserman.info,  Node: Miscellaneous Commands,  Prev: Keyboard Macros,  Up: Bindable Readline Commands
+
+Some Miscellaneous Commands
+---------------------------
+
+`re-read-init-file (C-x C-r)'
+     Read in the contents of the INPUTRC file, and incorporate any
+     bindings or variable assignments found there.
+
+`abort (C-g)'
+     Abort the current editing command and ring the terminal's bell
+     (subject to the setting of `bell-style').
+
+`do-uppercase-version (M-a, M-b, M-X, ...)'
+     If the metafied character X is lowercase, run the command that is
+     bound to the corresponding uppercase character.
+
+`prefix-meta (<ESC>)'
+     Metafy the next character typed.  This is for keyboards without a
+     meta key.  Typing `<ESC> f' is equivalent to typing `M-f'.
+
+`undo (C-_ or C-x C-u)'
+     Incremental undo, separately remembered for each line.
+
+`revert-line (M-r)'
+     Undo all changes made to this line.  This is like executing the
+     `undo' command enough times to get back to the beginning.
+
+`tilde-expand (M-~)'
+     Perform tilde expansion on the current word.
+
+`set-mark (C-@)'
+     Set the mark to the point.  If a numeric argument is supplied, the
+     mark is set to that position.
+
+`exchange-point-and-mark (C-x C-x)'
+     Swap the point with the mark.  The current cursor position is set
+     to the saved position, and the old cursor position is saved as the
+     mark.
+
+`character-search (C-])'
+     A character is read and point is moved to the next occurrence of
+     that character.  A negative count searches for previous
+     occurrences.
+
+`character-search-backward (M-C-])'
+     A character is read and point is moved to the previous occurrence
+     of that character.  A negative count searches for subsequent
+     occurrences.
+
+`insert-comment (M-#)'
+     Without a numeric argument, the value of the `comment-begin'
+     variable is inserted at the beginning of the current line.  If a
+     numeric argument is supplied, this command acts as a toggle:  if
+     the characters at the beginning of the line do not match the value
+     of `comment-begin', the value is inserted, otherwise the
+     characters in `comment-begin' are deleted from the beginning of
+     the line.  In either case, the line is accepted as if a newline
+     had been typed.
+
+`dump-functions ()'
+     Print all of the functions and their key bindings to the Readline
+     output stream.  If a numeric argument is supplied, the output is
+     formatted in such a way that it can be made part of an INPUTRC
+     file.  This command is unbound by default.
+
+`dump-variables ()'
+     Print all of the settable variables and their values to the
+     Readline output stream.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`dump-macros ()'
+     Print all of the Readline key sequences bound to macros and the
+     strings they output.  If a numeric argument is supplied, the
+     output is formatted in such a way that it can be made part of an
+     INPUTRC file.  This command is unbound by default.
+
+`emacs-editing-mode (C-e)'
+     When in `vi' command mode, this causes a switch to `emacs' editing
+     mode.
+
+`vi-editing-mode (M-C-j)'
+     When in `emacs' editing mode, this causes a switch to `vi' editing
+     mode.
+
+
+\1f
+File: rluserman.info,  Node: Readline vi Mode,  Prev: Bindable Readline Commands,  Up: Command Line Editing
+
+Readline vi Mode
+================
+
+   While the Readline library does not have a full set of `vi' editing
+functions, it does contain enough to allow simple editing of the line.
+The Readline `vi' mode behaves as specified in the POSIX 1003.2
+standard.
+
+   In order to switch interactively between `emacs' and `vi' editing
+modes, use the command `M-C-j' (bound to emacs-editing-mode when in
+`vi' mode and to vi-editing-mode in `emacs' mode).  The Readline
+default is `emacs' mode.
+
+   When you enter a line in `vi' mode, you are already placed in
+`insertion' mode, as if you had typed an `i'.  Pressing <ESC> switches
+you into `command' mode, where you can edit the text of the line with
+the standard `vi' movement keys, move to previous history lines with
+`k' and subsequent lines with `j', and so forth.
+
+\1f
+File: rluserman.info,  Node: Copying This Manual,  Prev: Command Line Editing,  Up: Top
+
+Copying This Manual
+*******************
+
+* Menu:
+
+* GNU Free Documentation License::     License for copying this manual.
+
+\1f
+File: rluserman.info,  Node: GNU Free Documentation License,  Up: Copying This Manual
+
+GNU Free Documentation License
+==============================
+
+                      Version 1.2, November 2002
+     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA
+     
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+  0. PREAMBLE
+
+     The purpose of this License is to make a manual, textbook, or other
+     functional and useful document "free" in the sense of freedom: to
+     assure everyone the effective freedom to copy and redistribute it,
+     with or without modifying it, either commercially or
+     noncommercially.  Secondarily, this License preserves for the
+     author and publisher a way to get credit for their work, while not
+     being considered responsible for modifications made by others.
+
+     This License is a kind of "copyleft", which means that derivative
+     works of the document must themselves be free in the same sense.
+     It complements the GNU General Public License, which is a copyleft
+     license designed for free software.
+
+     We have designed this License in order to use it for manuals for
+     free software, because free software needs free documentation: a
+     free program should come with manuals providing the same freedoms
+     that the software does.  But this License is not limited to
+     software manuals; it can be used for any textual work, regardless
+     of subject matter or whether it is published as a printed book.
+     We recommend this License principally for works whose purpose is
+     instruction or reference.
+
+  1. APPLICABILITY AND DEFINITIONS
+
+     This License applies to any manual or other work, in any medium,
+     that contains a notice placed by the copyright holder saying it
+     can be distributed under the terms of this License.  Such a notice
+     grants a world-wide, royalty-free license, unlimited in duration,
+     to use that work under the conditions stated herein.  The
+     "Document", below, refers to any such manual or work.  Any member
+     of the public is a licensee, and is addressed as "you".  You
+     accept the license if you copy, modify or distribute the work in a
+     way requiring permission under copyright law.
+
+     A "Modified Version" of the Document means any work containing the
+     Document or a portion of it, either copied verbatim, or with
+     modifications and/or translated into another language.
+
+     A "Secondary Section" is a named appendix or a front-matter section
+     of the Document that deals exclusively with the relationship of the
+     publishers or authors of the Document to the Document's overall
+     subject (or to related matters) and contains nothing that could
+     fall directly within that overall subject.  (Thus, if the Document
+     is in part a textbook of mathematics, a Secondary Section may not
+     explain any mathematics.)  The relationship could be a matter of
+     historical connection with the subject or with related matters, or
+     of legal, commercial, philosophical, ethical or political position
+     regarding them.
+
+     The "Invariant Sections" are certain Secondary Sections whose
+     titles are designated, as being those of Invariant Sections, in
+     the notice that says that the Document is released under this
+     License.  If a section does not fit the above definition of
+     Secondary then it is not allowed to be designated as Invariant.
+     The Document may contain zero Invariant Sections.  If the Document
+     does not identify any Invariant Sections then there are none.
+
+     The "Cover Texts" are certain short passages of text that are
+     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+     that says that the Document is released under this License.  A
+     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
+     be at most 25 words.
+
+     A "Transparent" copy of the Document means a machine-readable copy,
+     represented in a format whose specification is available to the
+     general public, that is suitable for revising the document
+     straightforwardly with generic text editors or (for images
+     composed of pixels) generic paint programs or (for drawings) some
+     widely available drawing editor, and that is suitable for input to
+     text formatters or for automatic translation to a variety of
+     formats suitable for input to text formatters.  A copy made in an
+     otherwise Transparent file format whose markup, or absence of
+     markup, has been arranged to thwart or discourage subsequent
+     modification by readers is not Transparent.  An image format is
+     not Transparent if used for any substantial amount of text.  A
+     copy that is not "Transparent" is called "Opaque".
+
+     Examples of suitable formats for Transparent copies include plain
+     ASCII without markup, Texinfo input format, LaTeX input format,
+     SGML or XML using a publicly available DTD, and
+     standard-conforming simple HTML, PostScript or PDF designed for
+     human modification.  Examples of transparent image formats include
+     PNG, XCF and JPG.  Opaque formats include proprietary formats that
+     can be read and edited only by proprietary word processors, SGML or
+     XML for which the DTD and/or processing tools are not generally
+     available, and the machine-generated HTML, PostScript or PDF
+     produced by some word processors for output purposes only.
+
+     The "Title Page" means, for a printed book, the title page itself,
+     plus such following pages as are needed to hold, legibly, the
+     material this License requires to appear in the title page.  For
+     works in formats which do not have any title page as such, "Title
+     Page" means the text near the most prominent appearance of the
+     work's title, preceding the beginning of the body of the text.
+
+     A section "Entitled XYZ" means a named subunit of the Document
+     whose title either is precisely XYZ or contains XYZ in parentheses
+     following text that translates XYZ in another language.  (Here XYZ
+     stands for a specific section name mentioned below, such as
+     "Acknowledgements", "Dedications", "Endorsements", or "History".)
+     To "Preserve the Title" of such a section when you modify the
+     Document means that it remains a section "Entitled XYZ" according
+     to this definition.
+
+     The Document may include Warranty Disclaimers next to the notice
+     which states that this License applies to the Document.  These
+     Warranty Disclaimers are considered to be included by reference in
+     this License, but only as regards disclaiming warranties: any other
+     implication that these Warranty Disclaimers may have is void and
+     has no effect on the meaning of this License.
+
+  2. VERBATIM COPYING
+
+     You may copy and distribute the Document in any medium, either
+     commercially or noncommercially, provided that this License, the
+     copyright notices, and the license notice saying this License
+     applies to the Document are reproduced in all copies, and that you
+     add no other conditions whatsoever to those of this License.  You
+     may not use technical measures to obstruct or control the reading
+     or further copying of the copies you make or distribute.  However,
+     you may accept compensation in exchange for copies.  If you
+     distribute a large enough number of copies you must also follow
+     the conditions in section 3.
+
+     You may also lend copies, under the same conditions stated above,
+     and you may publicly display copies.
+
+  3. COPYING IN QUANTITY
+
+     If you publish printed copies (or copies in media that commonly
+     have printed covers) of the Document, numbering more than 100, and
+     the Document's license notice requires Cover Texts, you must
+     enclose the copies in covers that carry, clearly and legibly, all
+     these Cover Texts: Front-Cover Texts on the front cover, and
+     Back-Cover Texts on the back cover.  Both covers must also clearly
+     and legibly identify you as the publisher of these copies.  The
+     front cover must present the full title with all words of the
+     title equally prominent and visible.  You may add other material
+     on the covers in addition.  Copying with changes limited to the
+     covers, as long as they preserve the title of the Document and
+     satisfy these conditions, can be treated as verbatim copying in
+     other respects.
+
+     If the required texts for either cover are too voluminous to fit
+     legibly, you should put the first ones listed (as many as fit
+     reasonably) on the actual cover, and continue the rest onto
+     adjacent pages.
+
+     If you publish or distribute Opaque copies of the Document
+     numbering more than 100, you must either include a
+     machine-readable Transparent copy along with each Opaque copy, or
+     state in or with each Opaque copy a computer-network location from
+     which the general network-using public has access to download
+     using public-standard network protocols a complete Transparent
+     copy of the Document, free of added material.  If you use the
+     latter option, you must take reasonably prudent steps, when you
+     begin distribution of Opaque copies in quantity, to ensure that
+     this Transparent copy will remain thus accessible at the stated
+     location until at least one year after the last time you
+     distribute an Opaque copy (directly or through your agents or
+     retailers) of that edition to the public.
+
+     It is requested, but not required, that you contact the authors of
+     the Document well before redistributing any large number of
+     copies, to give them a chance to provide you with an updated
+     version of the Document.
+
+  4. MODIFICATIONS
+
+     You may copy and distribute a Modified Version of the Document
+     under the conditions of sections 2 and 3 above, provided that you
+     release the Modified Version under precisely this License, with
+     the Modified Version filling the role of the Document, thus
+     licensing distribution and modification of the Modified Version to
+     whoever possesses a copy of it.  In addition, you must do these
+     things in the Modified Version:
+
+       A. Use in the Title Page (and on the covers, if any) a title
+          distinct from that of the Document, and from those of
+          previous versions (which should, if there were any, be listed
+          in the History section of the Document).  You may use the
+          same title as a previous version if the original publisher of
+          that version gives permission.
+
+       B. List on the Title Page, as authors, one or more persons or
+          entities responsible for authorship of the modifications in
+          the Modified Version, together with at least five of the
+          principal authors of the Document (all of its principal
+          authors, if it has fewer than five), unless they release you
+          from this requirement.
+
+       C. State on the Title page the name of the publisher of the
+          Modified Version, as the publisher.
+
+       D. Preserve all the copyright notices of the Document.
+
+       E. Add an appropriate copyright notice for your modifications
+          adjacent to the other copyright notices.
+
+       F. Include, immediately after the copyright notices, a license
+          notice giving the public permission to use the Modified
+          Version under the terms of this License, in the form shown in
+          the Addendum below.
+
+       G. Preserve in that license notice the full lists of Invariant
+          Sections and required Cover Texts given in the Document's
+          license notice.
+
+       H. Include an unaltered copy of this License.
+
+       I. Preserve the section Entitled "History", Preserve its Title,
+          and add to it an item stating at least the title, year, new
+          authors, and publisher of the Modified Version as given on
+          the Title Page.  If there is no section Entitled "History" in
+          the Document, create one stating the title, year, authors,
+          and publisher of the Document as given on its Title Page,
+          then add an item describing the Modified Version as stated in
+          the previous sentence.
+
+       J. Preserve the network location, if any, given in the Document
+          for public access to a Transparent copy of the Document, and
+          likewise the network locations given in the Document for
+          previous versions it was based on.  These may be placed in
+          the "History" section.  You may omit a network location for a
+          work that was published at least four years before the
+          Document itself, or if the original publisher of the version
+          it refers to gives permission.
+
+       K. For any section Entitled "Acknowledgements" or "Dedications",
+          Preserve the Title of the section, and preserve in the
+          section all the substance and tone of each of the contributor
+          acknowledgements and/or dedications given therein.
+
+       L. Preserve all the Invariant Sections of the Document,
+          unaltered in their text and in their titles.  Section numbers
+          or the equivalent are not considered part of the section
+          titles.
+
+       M. Delete any section Entitled "Endorsements".  Such a section
+          may not be included in the Modified Version.
+
+       N. Do not retitle any existing section to be Entitled
+          "Endorsements" or to conflict in title with any Invariant
+          Section.
+
+       O. Preserve any Warranty Disclaimers.
+
+     If the Modified Version includes new front-matter sections or
+     appendices that qualify as Secondary Sections and contain no
+     material copied from the Document, you may at your option
+     designate some or all of these sections as invariant.  To do this,
+     add their titles to the list of Invariant Sections in the Modified
+     Version's license notice.  These titles must be distinct from any
+     other section titles.
+
+     You may add a section Entitled "Endorsements", provided it contains
+     nothing but endorsements of your Modified Version by various
+     parties--for example, statements of peer review or that the text
+     has been approved by an organization as the authoritative
+     definition of a standard.
+
+     You may add a passage of up to five words as a Front-Cover Text,
+     and a passage of up to 25 words as a Back-Cover Text, to the end
+     of the list of Cover Texts in the Modified Version.  Only one
+     passage of Front-Cover Text and one of Back-Cover Text may be
+     added by (or through arrangements made by) any one entity.  If the
+     Document already includes a cover text for the same cover,
+     previously added by you or by arrangement made by the same entity
+     you are acting on behalf of, you may not add another; but you may
+     replace the old one, on explicit permission from the previous
+     publisher that added the old one.
+
+     The author(s) and publisher(s) of the Document do not by this
+     License give permission to use their names for publicity for or to
+     assert or imply endorsement of any Modified Version.
+
+  5. COMBINING DOCUMENTS
+
+     You may combine the Document with other documents released under
+     this License, under the terms defined in section 4 above for
+     modified versions, provided that you include in the combination
+     all of the Invariant Sections of all of the original documents,
+     unmodified, and list them all as Invariant Sections of your
+     combined work in its license notice, and that you preserve all
+     their Warranty Disclaimers.
+
+     The combined work need only contain one copy of this License, and
+     multiple identical Invariant Sections may be replaced with a single
+     copy.  If there are multiple Invariant Sections with the same name
+     but different contents, make the title of each such section unique
+     by adding at the end of it, in parentheses, the name of the
+     original author or publisher of that section if known, or else a
+     unique number.  Make the same adjustment to the section titles in
+     the list of Invariant Sections in the license notice of the
+     combined work.
+
+     In the combination, you must combine any sections Entitled
+     "History" in the various original documents, forming one section
+     Entitled "History"; likewise combine any sections Entitled
+     "Acknowledgements", and any sections Entitled "Dedications".  You
+     must delete all sections Entitled "Endorsements."
+
+  6. COLLECTIONS OF DOCUMENTS
+
+     You may make a collection consisting of the Document and other
+     documents released under this License, and replace the individual
+     copies of this License in the various documents with a single copy
+     that is included in the collection, provided that you follow the
+     rules of this License for verbatim copying of each of the
+     documents in all other respects.
+
+     You may extract a single document from such a collection, and
+     distribute it individually under this License, provided you insert
+     a copy of this License into the extracted document, and follow
+     this License in all other respects regarding verbatim copying of
+     that document.
+
+  7. AGGREGATION WITH INDEPENDENT WORKS
+
+     A compilation of the Document or its derivatives with other
+     separate and independent documents or works, in or on a volume of
+     a storage or distribution medium, is called an "aggregate" if the
+     copyright resulting from the compilation is not used to limit the
+     legal rights of the compilation's users beyond what the individual
+     works permit.  When the Document is included an aggregate, this
+     License does not apply to the other works in the aggregate which
+     are not themselves derivative works of the Document.
+
+     If the Cover Text requirement of section 3 is applicable to these
+     copies of the Document, then if the Document is less than one half
+     of the entire aggregate, the Document's Cover Texts may be placed
+     on covers that bracket the Document within the aggregate, or the
+     electronic equivalent of covers if the Document is in electronic
+     form.  Otherwise they must appear on printed covers that bracket
+     the whole aggregate.
+
+  8. TRANSLATION
+
+     Translation is considered a kind of modification, so you may
+     distribute translations of the Document under the terms of section
+     4.  Replacing Invariant Sections with translations requires special
+     permission from their copyright holders, but you may include
+     translations of some or all Invariant Sections in addition to the
+     original versions of these Invariant Sections.  You may include a
+     translation of this License, and all the license notices in the
+     Document, and any Warranty Disclaimers, provided that you also
+     include the original English version of this License and the
+     original versions of those notices and disclaimers.  In case of a
+     disagreement between the translation and the original version of
+     this License or a notice or disclaimer, the original version will
+     prevail.
+
+     If a section in the Document is Entitled "Acknowledgements",
+     "Dedications", or "History", the requirement (section 4) to
+     Preserve its Title (section 1) will typically require changing the
+     actual title.
+
+  9. TERMINATION
+
+     You may not copy, modify, sublicense, or distribute the Document
+     except as expressly provided for under this License.  Any other
+     attempt to copy, modify, sublicense or distribute the Document is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+ 10. FUTURE REVISIONS OF THIS LICENSE
+
+     The Free Software Foundation may publish new, revised versions of
+     the GNU Free Documentation License from time to time.  Such new
+     versions will be similar in spirit to the present version, but may
+     differ in detail to address new problems or concerns.  See
+     `http://www.gnu.org/copyleft/'.
+
+     Each version of the License is given a distinguishing version
+     number.  If the Document specifies that a particular numbered
+     version of this License "or any later version" applies to it, you
+     have the option of following the terms and conditions either of
+     that specified version or of any later version that has been
+     published (not as a draft) by the Free Software Foundation.  If
+     the Document does not specify a version number of this License,
+     you may choose any version ever published (not as a draft) by the
+     Free Software Foundation.
+
+ADDENDUM: How to use this License for your documents
+----------------------------------------------------
+
+   To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and license
+notices just after the title page:
+
+       Copyright (C)  YEAR  YOUR NAME.
+       Permission is granted to copy, distribute and/or modify this document
+       under the terms of the GNU Free Documentation License, Version 1.2
+       or any later version published by the Free Software Foundation;
+       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+       A copy of the license is included in the section entitled ``GNU
+       Free Documentation License''.
+
+   If you have Invariant Sections, Front-Cover Texts and Back-Cover
+Texts, replace the "with...Texts." line with this:
+
+         with the Invariant Sections being LIST THEIR TITLES, with
+         the Front-Cover Texts being LIST, and with the Back-Cover Texts
+         being LIST.
+
+   If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+   If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+
+\1f
+Tag Table:
+Node: Top\7f1341
+Node: Command Line Editing\7f1776
+Node: Introduction and Notation\7f2418
+Node: Readline Interaction\7f4037
+Node: Readline Bare Essentials\7f5225
+Node: Readline Movement Commands\7f7007
+Node: Readline Killing Commands\7f7965
+Node: Readline Arguments\7f9876
+Node: Searching\7f10913
+Node: Readline Init File\7f13057
+Node: Readline Init File Syntax\7f14119
+Node: Conditional Init Constructs\7f25483
+Node: Sample Init File\7f28009
+Node: Bindable Readline Commands\7f31194
+Node: Commands For Moving\7f32245
+Node: Commands For History\7f33096
+Node: Commands For Text\7f35956
+Node: Commands For Killing\7f38672
+Node: Numeric Arguments\7f40624
+Node: Commands For Completion\7f41753
+Node: Keyboard Macros\7f43287
+Node: Miscellaneous Commands\7f43848
+Node: Readline vi Mode\7f47199
+Node: Copying This Manual\7f48115
+Node: GNU Free Documentation License\7f48325
+\1f
+End Tag Table
diff --git a/lib/readline/doc/rluserman.ky b/lib/readline/doc/rluserman.ky
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/rluserman.log b/lib/readline/doc/rluserman.log
new file mode 100644 (file)
index 0000000..01f9a4d
--- /dev/null
@@ -0,0 +1,197 @@
+This is TeX, Version 3.14159 (Web2C 7.3.1) (format=tex 2001.2.12)  22 SEP 2003 09:04
+**/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rluserma
+n.texi
+
+(/net/granite/fs4/src/ns-engr/work/chet/src/bash/src/lib/readline/doc/rluserman
+.texi (texinfo.tex Loading texinfo [version 2003-02-03.16]: Basics,
+\bindingoffset=\dimen16
+\normaloffset=\dimen17
+\pagewidth=\dimen18
+\pageheight=\dimen19
+\outerhsize=\dimen20
+\outervsize=\dimen21
+\cornerlong=\dimen22
+\cornerthick=\dimen23
+\topandbottommargin=\dimen24
+\headlinebox=\box16
+\footlinebox=\box17
+\margin=\insert252
+\EMsimple=\toks12
+\groupbox=\box18
+\groupinvalidhelp=\toks13
+\mil=\dimen25
+\exdentamount=\skip18
+\inmarginspacing=\skip19
+ pdf,
+\tempnum=\count26
+\lnkcount=\count27
+\filename=\toks14
+\filenamelength=\count28
+\pgn=\count29
+\toksA=\toks15
+\toksB=\toks16
+\toksC=\toks17
+\toksD=\toks18
+\boxA=\box19
+\countA=\count30
+
+fonts,
+\sffam=\fam8
+\textleading=\dimen26
+\mainmagstep=\count31
+\fontdepth=\count32
+ page headings,
+\titlepagetopglue=\skip20
+\titlepagebottomglue=\skip21
+\evenheadline=\toks19
+\oddheadline=\toks20
+\evenfootline=\toks21
+\oddfootline=\toks22
+ tables,
+\tableindent=\dimen27
+\itemindent=\dimen28
+\itemmargin=\dimen29
+\itemmax=\dimen30
+\itemno=\count33
+\multitableparskip=\skip22
+\multitableparindent=\skip23
+\multitablecolspace=\dimen31
+\multitablelinespace=\skip24
+\colcount=\count34
+\savedfootnotes=\box20
+ conditionals, indexing,
+\secondaryindent=\skip25
+\partialpage=\box21
+\doublecolumnhsize=\dimen32
+ sectioning,
+\chapno=\count35
+\secno=\count36
+\subsecno=\count37
+\subsubsecno=\count38
+\appendixno=\count39
+\absseclevel=\count40
+\secbase=\count41
+\chapheadingskip=\skip26
+\secheadingskip=\skip27
+\subsecheadingskip=\skip28
+ toc,
+\tocfile=\write0
+\contentsrightmargin=\skip29
+\savepageno=\count42
+\lastnegativepageno=\count43
+\shortappendixwidth=\dimen33
+\tocindent=\dimen34
+
+environments,
+\errorbox=\box22
+\lispnarrowing=\skip30
+\envskipamount=\skip31
+\circthick=\dimen35
+\cartouter=\dimen36
+\cartinner=\dimen37
+\normbskip=\skip32
+\normpskip=\skip33
+\normlskip=\skip34
+\lskip=\skip35
+\rskip=\skip36
+\tabw=\dimen38
+ defuns,
+\defbodyindent=\skip37
+\defargsindent=\skip38
+\deflastargmargin=\skip39
+\parencount=\count44
+ macros,
+\macscribble=\write1
+\paramno=\count45
+\macname=\toks23
+ cross references,
+\auxfile=\write2
+\savesfregister=\count46
+\footnoteno=\count47
+
+(/usr/local/share/texmf/tex/plain/dvips/epsf.tex
+\epsffilein=\read0
+\epsfframemargin=\dimen39
+\epsfframethickness=\dimen40
+\epsfrsize=\dimen41
+\epsftmp=\dimen42
+\epsftsize=\dimen43
+\epsfxsize=\dimen44
+\epsfysize=\dimen45
+\pspoints=\dimen46
+\epsfnoopenhelp=\toks24
+)
+\noepsfhelp=\toks25
+ localization,
+\nolanghelp=\toks26
+\defaultparindent=\dimen47
+
+and turning on texinfo input format.) (rluserman.aux)
+@cpindfile=@write3
+@fnindfile=@write4
+@vrindfile=@write5
+@tpindfile=@write6
+@kyindfile=@write7
+@pgindfile=@write8
+ (version.texi) [1
+\openout2 = `rluserman.aux'.
+
+\openout3 = `rluserman.cp'.
+
+\openout4 = `rluserman.fn'.
+
+\openout5 = `rluserman.vr'.
+
+\openout6 = `rluserman.tp'.
+
+\openout7 = `rluserman.ky'.
+
+\openout8 = `rluserman.pg'.
+
+]
+[2] (rluserman.toc) [-1] [-2] (rluser.texi
+@btindfile=@write9
+ Chapter 1
+\openout0 = `rluserman.toc'.
+
+ [1
+\openout9 = `rluserman.bt'.
+
+] [2] [3] [4] [5]
+Underfull \hbox (badness 5231) in paragraph at lines 488--504
+ @texttt emacs-meta[]@textrm , @texttt emacs-ctlx[]@textrm , @texttt vi[]@textr
+m , @texttt vi-move[]@textrm , @texttt vi-command[]@textrm , and
+
+@hbox(7.60416+2.12917)x433.62, glue set 3.7426
+.@glue(@leftskip) 115.63242
+.@texttt e
+.@texttt m
+.@texttt a
+.@texttt c
+.etc.
+
+[6] [7] [8] [9] [10]
+Overfull \hbox (26.43913pt too wide) in paragraph at lines 801--801
+ []@texttt Meta-Control-h: backward-kill-word Text after the function name is i
+gnored[] |
+
+@hbox(6.69167+2.43333)x433.62
+.@glue(@leftskip) 28.90755
+.@hbox(0.0+0.0)x0.0
+.@texttt M
+.@texttt e
+.@texttt t
+.etc.
+
+[11] [12] [13] [14] [15] [16] [17] [18]) Appendix A [19] [20] (fdl.texi
+[21] [22] [23] [24] [25] [26]) [27] [28] ) 
+Here is how much of TeX's memory you used:
+ 1398 strings out of 13013
+ 16279 string characters out of 97233
+ 44937 words of memory out of 263001
+ 2276 multiletter control sequences out of 10000+0
+ 31953 words of font info for 111 fonts, out of 400000 for 1000
+ 19 hyphenation exceptions out of 1000
+ 13i,8n,10p,308b,695s stack positions out of 300i,100n,500p,50000b,4000s
+
+Output written on rluserman.dvi (32 pages, 91652 bytes).
diff --git a/lib/readline/doc/rluserman.pg b/lib/readline/doc/rluserman.pg
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/rluserman.ps b/lib/readline/doc/rluserman.ps
new file mode 100644 (file)
index 0000000..eb65adc
--- /dev/null
@@ -0,0 +1,2702 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
+%%Title: rluserman.dvi
+%%Pages: 32
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips -D 300 -o rluserman.ps rluserman.dvi
+%DVIPSParameters: dpi=300, compressed
+%DVIPSSource:  TeX output 2003.09.22:0904
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+TeXDict begin 39158280 55380996 1000 300 300 (rluserman.dvi)
+@start
+%DVIPSBitmapFont: Fa cmsltt10 9 13
+/Fa 13 122 df<EA0FE0EA1FF8EA381CEA100E1200A2EA03FEEA1FFCEA3C1C127012E0A2
+133C1378EA7FFFEA1F8F10107D8F14>97 D<EA01F0EA07F8EA0E0CEA1C0E1238EA7006A2
+EAFFFEA2EAE000A21270130CEA381CEA1FF8EA07F00F107D8F14>101
+D<121F7F0007C7FCA5133EEA0EFF380FC3801303120EA3381C0700A6EA380E38FF1FC0A2
+12177F9614>104 D<136013F013E013401300A4EA3FC0A21201A5EA0380A6EA0700EAFF
+F8A20D187C9714>I<EA1FE013F0EA00E0A6EA01C0A6EA0380A6EA0700EAFFFCA20E177D
+9614>108 D<383CE380383FFFC0EA1F7DEA1E79EA1C71A33838E380A63871C70038FDF7
+C0EAFCF312107F8F14>I<EA3E3E13FF380FC3801303120EA3381C0700A6EA380E38FF1F
+C0A212107F8F14>I<EA03F0EA07F8EA1E1CEA3C0E12381270A212E0A3131EEA701C1338
+EA7870EA3FE0EA0F800F107D8F14>I<381F87C0EB9FE0EA03B8EBE040EBC0005BA21207
+90C7FCA5120EEAFFF0A213107F8F14>114 D<EA03FAEA0FFEEA1C0E1230A2EA3800EA1F
+E0EA0FF8EA01FEEA000FEA600312701306EAF80CEAFFF8EA4FE010107E8F14>I<120612
+0EA4EAFFF8A2EA1C00A55AA313301338A21370EA1FE0EA0F800D157C9414>I<EAF83EA2
+EA380EA5EA701CA5133C1378EA3FFFEA1F9F10107D8F14>I<381FCFE0A238070380EB07
+00A2130EEA038EA2139CA213B8A2EA01B013F05BA25BA2485AA200E7C7FC12EE12FC1278
+13187F8F14>121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb cmtt9 9 48
+/Fb 48 122 df<126012F012F812781218A31230A2126012C01280050C789614>39
+D<EA01801203EA06005A121C121812385AA35AA91270A37E1218121C120C7EEA03801201
+091D799914>I<128012C01260123012381218121C120EA31207A9120EA3121C12181238
+1230126012C01280081D7C9914>I<127012F812FCA2127C120C1218123012E012C0060A
+798414>44 D<EAFFFEA30F037E8C14>I<127012F8A312700505798414>I<1306130EA213
+1CA21338A21370A213E0A2EA01C0A2EA0380A3EA0700A2120EA25AA25AA25AA25AA25A0F
+1D7E9914>I<1203A25A5A123F12F712471207AEEA7FF0A20C177C9614>49
+D<EA0FC0EA1FF0EA3838EA701CEAE00EA312401200131CA213381330137013E0EA01C0EA
+030012065AEA180E1230EA7FFEA20F177E9614>I<127012F8A312701200A6126012F012
+F8A2127812181230127012E012800515798F14>59 D<EA01C0487EA21360A2EA0770A4EA
+0630EA0E38A4487EEA1FFCA2EA1C1CA2487EA238FE3F80A211177F9614>65
+D<EAFFF013FCEA381E130E1307A4130E131EEA3FFCA2EA381E130E1307A5130E131EEAFF
+FC13F810177F9614>I<3801F180EA07FFEA0E1FEA1C071238EA7003A348C7FCA7387003
+80A338380700121CEA0E0EEA07FCEA01F011177F9614>I<EAFFE013F8EA383C7F130E7F
+A3EB0380A8EB0700A2130E131E5BEAFFF813E011177F9614>I<B51280A2EA3803A490C7
+FCA21338A2EA3FF8A2EA3838A290C7FCA7B4FCA211177F9614>70
+D<EA03C6EA0FFEEA1C3EEA181E1238EA700EA21260EAE000A4137FA2130E12601270A2EA
+381E1218EA1C3EEA0FFEEA03CE10177F9614>I<EAFFF8A2EA0700B3EAFFF8A20D177D96
+14>73 D<B4FCA21238AF1307A4B5FCA210177E9614>76 D<38FE3F80A2383E0E00123BA4
+138E1239A213CEA31238A213EE136EA4133E12FEA211177F9614>78
+D<EAFFF013FCEA381E130E1307A5130E131EEA3FFC13F0EA3800A812FEA210177F9614>
+80 D<EA0FCCEA1FFCEA307CEA603CEAE01CA313001270127EEA3FE0EA0FF0EA01F8EA00
+1C131E130E126012E0A2EAF01CEAF838EAFFF0EAC7E00F177E9614>83
+D<387FFF80B5FCEAE1C3A43801C000AFEA0FF8A211177F9614>I<38FE0FE0A238380380
+B0381C0700A2EA0E0EEA07FCEA01F01317809614>I<38FC1F80A238380E00A3EA3C1EEA
+1C1CA46C5AA4EA0630EA0770A3EA0360A213E0A26C5A11177F9614>I<12081218123012
+60A212C0A312F012F812781230050C799914>96 D<EA1FC0EA7FF0EA7078EA2018EA001C
+A2EA07FC121FEA3C1C127012E0A3EA707C383FFF80EA0F8F11107E8F14>I<12FCA2121C
+A513F8EA1DFEEA1F07EA1E03001C1380EB01C0A6EB0380001E1300EA1F0EEA1DFCEA0CF8
+1217809614>I<EA03F8EA0FFEEA1C0EEA3804EA7000126012E0A412601270EA380EEA1C
+1EEA0FFCEA03F00F107E8F14>I<137EA2130EA5EA07CEEA0FFEEA1C3EEA301EEA700E12
+E0A61270EA301EEA383E381FEFC0EA07CF12177F9614>I<EA07E0EA0FF0EA1C38EA301C
+EA700CEAE00EA2EAFFFEA2EAE00012601270EA380EEA1C1EEA0FFCEA03F00F107E8F14>
+I<13FCEA01FEEA038EEA07041300A3EA7FFE12FFEA0700ACEAFFF8A20F177F9614>I<EA
+07CF381FFF80EA383B38301800EA701CA3EA3018EA3838EA3FF0EA37C00070C7FCA2EA3F
+F86C7E487EEA700F38E00380A438700700EA3C1EEA1FFCEA07F011197F8F14>I<12FCA2
+121CA51378EA1DFEEA1F86EA1E07121CAA38FF8FE0A21317809614>I<1206120FA21206
+C7FCA4B4FCA21207ACEAFFF8A20D187C9714>I<12FCA2121CA5EBFF80A2EB1C005B5B5B
+EA1DC0EA1FE0A2EA1E70EA1C38133C131C7F38FF1F80A21117809614>107
+D<EAFF80A21203B3EAFFFEA20F177E9614>I<EAFB8EEAFFDF383CF380A2EA38E3AA38FE
+FBE013791310808F14>I<EAFC78EAFDFEEA1F86EA1E07121CAA38FF8FE0A21310808F14>
+I<EA07C0EA1FF0EA3C78EA701CA2EAE00EA6EA701CEA783CEA3C78EA1FF0EA07C00F107E
+8F14>I<EAFCF8EAFDFEEA1F07EA1E03001C1380EB01C0A6EB0380001E1300EA1F0EEA1D
+FCEA1CF890C7FCA6B47EA21218808F14>I<EAFE1FEB7F80EA0EE3380F810090C7FCA212
+0EA8EAFFF0A211107F8F14>114 D<EA0FD8EA3FF8EA603812C0A2EAF000EA7F80EA3FF0
+EA07F8EA001CEA600612E012F0EAF81CEAFFF8EACFE00F107E8F14>I<1206120EA4EA7F
+FC12FFEA0E00A8130EA3131CEA07F8EA01F00F157F9414>I<EAFC3FA2EA1C07AB131F38
+0FFFE0EA03E71310808F14>I<38FE3F80A2383C1E00EA1C1CA36C5AA3EA0630EA0770A3
+6C5AA311107F8F14>I<38FE3F80A238700700EA380EA3EA39CEA3EA1B6C121AA3EA1E7C
+A2EA0E3811107F8F14>I<EA7E3FA2EA1E3CEA0E78EA07705B12036C5A12037FEA0770EA
+0E781338487E38FE3F80A211107F8F14>I<38FE3F80A2381C0E005BA2120E5BA2120713
+30A2EA0370A25B1201A25BA3485A12730077C7FC127E123C11187F8F14>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmbx12 13.14 50
+/Fc 50 122 df<123C127E12FFA4127E123C08087C8711>46 D<131C133C13FC12FFA212
+00B3AA387FFFFCA216237CA21F>49 D<48B4FC000713C0381E07F0383803F8386001FC38
+7C00FE12FE14FF147FA2127C003813FFC7FC14FEA2EB01FC14F8EB03F0EB07E01480EB0F
+00131E5B1370EBE003EA01C038038007380700061206380FFFFE5A5A4813FCB5FCA21823
+7DA21F>I<48B4FC000713E0381E03F0383801F8003C13FC387E00FEA3123EEA1C010000
+13FCA2EB03F8EB07F0EB0FC03801FF00A2380007E0EB01F014F8EB00FC14FE14FFA21210
+127C12FEA214FEA2387C01FC007013F8383E07F0380FFFC00001130018237DA21F>I<14
+381478A214F81301130313071306130C131C13381330136013E0EA01C01380EA03005A12
+0E5A12185A12705AB612C0A2390001F800A790387FFFC0A21A237EA21F>I<0018130C00
+1F137CEBFFF814F014E014C01480EBFC000018C7FCA513FF001B13E0381F03F0381C00F8
+000813FCC7127EA3147FA2127812FCA3147E5A006013FC1270383801F8381E07E03807FF
+C03801FE0018237DA21F>I<EB1FC0EB7FF03801F0383803E00C3807803E000F137EEA1F
+005AA2007E133C1400A338FE3FC0EB7FF0EB80F800FF13FCEB007C147E5A147FA4127EA4
+003E137E123F6C137C380F80F83807C1F03803FFC038007F0018237DA21F>I<1230123C
+003FB512C0A215804814005C5C38600018A200E05B485B5CC6485AA249C7FC1306130EA2
+5BA2133CA25BA213F8A41201A66C5A13601A257DA41F>I<EBFF80000313E0380F01F838
+1C007C48133C141E1278A2127C127E387F803C13E0383FF878381FFDF0EBFFC07E000313
+E014F8000F13FCEA1E1F383C07FEEA7803EB00FF48133F141F140FA3140E1278141C6C13
+38381F80F03807FFE00001130018237DA21F>I<123C127E12FFA4127E123C1200A8123C
+127E12FFA4127E123C08187C9711>58 D<141CA2143EA3147FA24A7EA39038019FC0A290
+38031FE0140F01077FEB0607A2010C7F1403011C7FEB1801A2496C7EA2017FB5FCA29039
+E0007F8049133FA2484880151F00038190C7120FA2486E7ED8FFF090B51280A229257EA4
+2E>65 D<B612E015FC3903F0007FED3F80ED1FC0ED0FE0A216F0A21507150FA216E0151F
+16C0ED7F80913801FE0090B512F815FF9039F0003FC0ED0FE0ED07F016F8150316FCA616
+F81507ED0FF0ED1FE0ED7FC0B7120015F826257EA42C>I<9138FF8008010FEBF0189039
+3FC03C789039FE0006F8D801F81303484813014848130048481478121F48481438A2007F
+151890C8FCA2481500A97E16187F123FA26C6C1430120F6C6C14606C6C14C06C6CEB0180
+D800FEEB070090383FC01E90380FFFF8010013C025257DA42C>I<B612E015FC3903F800
+FFED1FC0ED07E06F7E6F7E82150082A2167FA31780AA1700A316FEA24B5A5E4B5A4B5AED
+1FC0EDFF80B648C7FC15E029257EA42F>I<B7FCA23903F8007FED0F8015071503A21501
+A3ED00C01406A21600A2140E141EEBFFFEA2EBF81E140E1406A21660A291C7FC16C0A415
+011503A2ED0F80153FB7FCA223257EA428>I<B612FEA23803F800151F8181A281A3ED01
+801403A292C7FCA25C5C90B5FCA2EBF80F8080A491C8FCAAB512F0A221257EA427>I<B5
+00E0B512E0A23B03F80003F800AF90B6FCA29038F80003B0B500E0B512E0A22B257EA430
+>72 D<B512E0A23803F800B3AFB512E0A213257EA417>I<B539E007FF80A2D803F8C7EA
+780016605E4B5A0307C7FC150E15185D5D5DEC03804AC8FC140E141F4A7E147FECDFC090
+38FB8FE09038FF0FF0EBFC07496C7E816E7E1400157F82153F6F7E6F7E8215076F7E82B5
+39E03FFFC0A22A257EA430>75 D<B512F0A2D803F8C7FCB3A31503A31506A3150EA2151E
+153E157CEC03FCB6FCA220257EA425>I<D8FFF8EDFFF86D5C0003EEFE00017EEC037EA3
+6D1406A26D6C130CA26D6C1318A26D6C1330A36D6C1360A26D6C13C0A2903900FC0180A2
+91387E0300A3EC3F06A2EC1F8CA2EC0FD8A2EC07F0A36E5AEA07803CFFFC01C01FFFF8A2
+35257EA43A>I<D8FFF8903807FFE07FD803FE9038003C006D14187F6D7E6D7E806D7E6D
+7E13036D7E6D7E80EC7F80EC3FC0141FEC0FE015F0EC07F8EC03FC1401EC00FE157F1698
+ED3FD8ED1FF8150F15071503A2150115001678486C1438D8FFFC1418A22B257EA430>I<
+B67E15F83903F801FEEC007F6F7E6F7EA282A55EA24B5A4BC7FCEC01FE90B512F815C090
+38F803F06E7E6E7E157EA2157FA482A31760ED3FC017C0ED1FE1B539E00FFF80923801FE
+002B257EA42E>82 D<01FF1380000713E3380F80F7381E001F48130F481307140312F814
+01A27E91C7FCB4FCEA7FE013FE383FFFE014F86C13FE00077F6C1480C67E010313C0EB00
+3FEC0FE01407A200C01303A315C07E6C13076C14806CEB0F0038FFC03E38E3FFF838803F
+E01B257DA422>I<007FB612F8A2397E00FE010078EC00780070153800601518A200E015
+1C160C5AA4C71400B3A390B512FEA226247EA32B>I<B539E00FFFC0A2D803F8C7EA7800
+1630B3A700015D7F00005D137C6D495A6D0107C7FC90380FE03E903803FFF89038007FC0
+2A257EA42F>I<B539C001FFE0A2D807F8C7EA1C006C6C141816386C6C14306C6C5C16E0
+6D6C5B6D6C485A1503D91FE090C7FC90380FF006150E903807F80C6D6C5A15386D6C5A90
+3800FF6015E06E5A6E5AAE90380FFFFCA22B257FA42E>89 D<EA07FF001F13E0383E03F0
+383F00F880147E121EC7FCA3EB1FFE3803FE7EEA0FC0EA1F00123E127E5AA314BEEA7E01
+383F073E391FFE1FE03807F00F1B187E971E>97 D<EAFFC0A2120FACEBC1FCEBCFFF9038
+FC0FC09038F007E09038C003F0A2EC01F8A215FCA815F8A2EC03F013E09038F007E09038
+1C1F80390E0FFF00380C03F81E267FA522>I<EB7FE03803FFF83807C07C381F80FC1300
+5A007E1378140012FEA8127E127F6C130CEA1F80EBC0183807E0703803FFE038007F0016
+187E971B>I<ECFFC0A2140FAC137F3803FFCF380FE0FF381F803F383F000FA2127EA212
+FEA8127EA27E141F381F803F380FC0EF3903FFCFFC3800FE0F1E267EA522>I<137F3803
+FFC03807C1F0380F80F8EA1F0048137C127E147E12FEA2B512FEA248C7FCA3127EA21406
+7E6C130C380F80183807E0703803FFE038007F8017187E971C>I<EB1FC0EB7FF0EA01F8
+3803E1F8120713C1380FC0F01400A7B5FCA2EA0FC0B3A2EAFFFEA215267EA513>I<3901
+FF07C00007EBDFE0380F83F1EA1F01393E00F800007E7FA6003E5B6C485A380F83E0EBFF
+C0001190C7FC0030C8FCA21238123C383FFFE06C13FC806C7F481480383C003F48EB0FC0
+00F81307A4007CEB0F806CEB1F00381F807E3807FFF8C613C01B247E971F>I<EAFFC0A2
+120FAC14FE9038C3FF809038CE0FC013D89038D007E013E0A213C0AF39FFFC7FFEA21F26
+7EA522>I<120FEA1F80EA3FC0A4EA1F80EA0F00C7FCA7EA7FC0A2120FB3A2EAFFF8A20D
+277EA611>I<EAFFC0A2120FACEC1FF0A2EC0780EC0E005C14305CEBC1C0EBC38013C713
+DFEBFFC0EBE7E0EBC3F0138180EB80FC147E80A2EC1F80EC0FC039FFF83FF8A21D267FA5
+20>107 D<EAFFC0A2120FB3B0EAFFFCA20E267EA511>I<26FF80FE137F903A83FF81FFC0
+3B0F8E0FC707E0019813CC903A9007E803F001A013F0A201C013E0AF3BFFFC7FFE3FFFA2
+30187E9733>I<38FF80FE903883FF80390F8E0FC0139890389007E013A0A213C0AF39FF
+FC7FFEA21F187E9722>I<EB7F803803FFF03807C0F8381F807E48487EA2007EEB1F80A2
+00FE14C0A8007E1480A26CEB3F00A2381F807E6C6C5A3803FFF038007F801A187E971F>
+I<38FFC1FCEBCFFF390FFC1FC09038F007E001C013F0140315F8140115FCA8EC03F8A215
+F0EBE0079038F00FE09038DC1F809038CFFF00EBC3F801C0C7FCA9EAFFFCA21E237F9722
+>I<38FF83E0EB8FF8380F8C7CEB90FC13B013A01478EBE0005BAEEAFFFEA216187F9719>
+114 D<3807F8C0EA1FFFEA3C07EA7001EAF000A300FC1300B47EEA7FFC7F383FFF80000F
+13C0120338001FE01303EAC001A212E014C0EAF00338FC078038EFFF00EAC3FC13187E97
+18>I<13C0A41201A312031207120F121FB512C0A2380FC000AC1460A63807E0C013E138
+01FF8038007E0013237FA218>I<39FFC07FE0A2000F1307B0140FA200071317EBE06739
+03FFC7FE38007F071F187E9722>I<39FFF80FF8A2390FC001C015803907E00300A26D5A
+00031306EBF80E0001130C13FC00005B13FEEB7E30A26D5AA214E06D5AA26D5AA26DC7FC
+A21D187F9720>I<3BFFF9FFE0FF80A23B1FC03F001C00000F6D13181580D807E05CA290
+39F03FC07000030137136015E02601F8635BA29038FCE3F1000001C15B15F990267F80FB
+C7FCA215FF90383F007EA2011E133CA3010C131829187F972C>I<39FFF83FF0A2390FC0
+0F003807E00E6C6C5A6D5A6C6C5A00001360EB7EC06D5AA2131F6D7E497E80EB33F81361
+EBE0FC3801C07E3803807F3907003F8048131F39FFC07FF8A21D187F9720>I<39FFF80F
+F8A2390FC001C015803907E00300A26D5A00031306EBF80E0001130C13FC00005B13FEEB
+7E30A26D5AA214E06D5AA26D5AA26DC7FCA21306A25B1230EA781CEAFC185B1370EA68E0
+EA7FC0001FC8FC1D237F9720>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmsl10 10.95 41
+/Fd 41 122 df<EAFFF0A20C027E8A0F>45 D<1408140C141C143CA2147C147E149EA2EB
+011EA21302801304A21308A20110138014071320A2EB7FFF90384007C0EB8003A2EA0100
+A21202EC01E01206001F130339FF801FFE1F207F9F22>65 D<0007B5FC3900F803C09038
+7801E0EC00F04913F8A515F03801E001EC03E015C0EC0F809038FFFE009038E00F803903
+C003C0EC01E015F0A21400A2485A1401A215E01403EC07C0390F000F80EC3E00B512F01D
+1F7E9E20>I<ECFE02903807018690381C004E0170133E49131E4848131C4848130C1207
+48C7FC5A121E003E1408003C1400127CA45AA4127815101520A27E1540001C14806CEB01
+006C13023803800C3800E030EB3FC01F217C9F21>I<0007B57E3900F801E09038780070
+81497F151E150E150FA348481480A6484814005DA3151E153E4848133C5DA25D4A5A4A5A
+260F000FC7FC143CB512F0211F7E9E23>I<0007B512FC3900F8007C0178131C150C5B15
+04A414043901E00800A31438EBFFF8EBE0383803C010A4EC00081510485AA21520A21560
+15C0380F00011407B612801E1F7E9E1F>I<0007B512F83900F800780178133815185B15
+08A53901E00800A314181438EBFFF83803C0301410A491C7FC485AA648C8FC7FEAFFFC1D
+1F7E9E1E>I<3A07FF83FFC03A00F8007C000178133CA2495BA648485BA490B5FCEBE000
+4848485AA64848485AA64848485A01807F39FFF07FF8221F7E9E22>72
+D<3807FF803800F8001378A25BA6485AA6485AA6485AA648C7FC7FEAFFF0111F7E9E10>
+I<3A07FF803FE03A00F8001F000178130C5D4913205D5D4AC7FC1402140848485A5C1460
+14F013E1EBE4F83803C878EBD07CEBE03CEBC03E141E141F48487E81140781140381380F
+00016D487E39FFF00FFE231F7E9E23>75 D<3807FFE0D800FCC7FC1378A25BA6485AA648
+5AA41580EC0100EA0780A25C14021406140E380F001E147CB512FC191F7E9E1C>I<D807
+F8EB7FC0D8007CEB1F00150C015E1304019E5B138FA2EB8780A2EB83C0D801035BEB01E0
+A2EB00F0A2147800025C143CA2141EA2140F485CEC07C0A21403A21401000C5C001E1300
+B47E221F7E9E22>78 D<EB01FCEB0E0790383801C090387000E0484813F048481378485A
+153C48C7FC5A001E143E123E123C127CA448147CA3157815F81278EC01F0007C14E01403
+003C14C0001CEB0780001EEB0F006C131E380780383801C0E038007F801F217C9F23>I<
+0007B5FC3900F803C090387800F015785B157CA41578484813F815F0EC01E0EC03C0EC0F
+00EBFFFCD803C0C7FCA6485AA648C8FC7FEAFFF81E1F7E9E1F>I<3807FFFE3900F80780
+90387801E0EC00F05B15F8A415F03801E00115E0EC03C0EC0780EC1E00EBFFF03803C038
+80141E140EA2140F48485AA51501D80F0013029038800F8239FFF8078CC7EA01F020207E
+9E22>82 D<EB1F82EB7066EBC01E3801800EEA030048130C00061304120EA3000F1300A2
+7FEA07F013FF6C13C06C13E038003FF0EB03F813001478143CA200401338A31430006013
+70146000F013C038E8018038C60300EA81FC17217E9F19>I<003FB512F0383C07800030
+1430126039400F0010A212C01280A3D8001E1300A65BA65BA65B7F383FFFE01C1F7A9E21
+>I<39FFF00FF8391F0003E06CEB01801400001EEB0100A6481302A6485BA600705BA25C
+A200785B1238001813C06C48C7FCEA0706EA01F81D20799E22>I<3BFFF07FF81FF03B1F
+000FC007C0001E903907800380001FED01006C1502140F5EEC17C002135B142301805C00
+0713435E14C3913883E0401481D981015B13C1D803C213E193C7FC13C415F2EBC80015F4
+EA01F015F85B5D5B15605B000014402C207A9E2F>87 D<EA07F8EA0C0CEA1E061307121C
+1200A313FFEA07C7EA1E07EA3C0E127800F01310A3131EEB2E2038784F40381F87801414
+7D9317>97 D<1207123F120F7EA2120EA65A137CEA1D83381E0180001C13C0EB00E05A14
+F0A5387001E0A214C013031480EB0700EAE80EEACC38EA83E014207B9F19>I<13FEEA03
+83380E0780121C0038130090C7FC12785AA45AA37E5BEA70026C5AEA1C18EA07E011147D
+9314>I<13F8EA070EEA0E07381C038012381278127012F0B5FC00F0C7FCA25AA46C5AEA
+7002EA3004EA1C18EA07E011147D9314>101 D<EB07C0EB1C60EB30F01360EBE0E0EBC0
+001201A5485AEA3FFCEA0380A448C7FCA6120EA65A121EEAFFC014207F9F0E>I<140EEB
+3E11EBE1A33801C1C2380381E0EA07801301120FA3380703C01480EB8700EA04FC48C7FC
+A21218121CEA0FFF14C014E0381800F04813305A5AA3006013606C13C0381C0700EA07FC
+181F809417>I<13E0120712011200A2485AA6485AEB8F80EB90E013A0EBC06013800007
+13E01300A5380E01C0A6381C0380001E13C038FF8FF014207E9F19>I<EA01C0EA03E0A2
+13C0EA0180C7FCA6EA0380121F12071203A2EA0700A6120EA65A121EEAFF800B1F7F9E0C
+>I<13E0120712011200A2485AA6485AEB81FCEB80F014C0EB81801400EA07045B131813
+38137C131C120E7FA2130F7F1480EA1C03381E07C038FF8FF016207E9F18>107
+D<13E0120712011200A2EA01C0A6EA0380A6EA0700A6120EA65A121EEAFF800B207F9F0C
+>I<390387C07C391F9861863907A072073903C03403EB80380007EB7807EB0070A5000E
+EBE00EA64848485A001EEBE01E3AFFCFFCFFC022147E9326>I<38038F80381F90E0EA07
+A03803C0601380000713E01300A5380E01C0A6381C0380001E13C038FF8FF014147E9319
+>I<13FCEA0387380E0180381C00C04813E0A24813F012F0A438E001E0A214C0130300F0
+138038700700EA380E6C5AEA07E014147D9317>I<EBE3E03807EC383801F01C6C487E14
+0F48487E1580A53903800F00A2140E141E141C5C38074070EB61C0011FC7FC90C8FCA312
+0EA4121EEAFFC0191D809319>I<EBFC2038038260EA0702381E01E0123C003813C01278
+12F0A438E00380A212F0A21307127038380F00EA1C37EA07C7EA0007A3130EA4131EEBFF
+C0131D7D9318>I<EA038E381FB380EA07C71203EB8300EA078090C7FCA5120EA65A121E
+EAFFC011147E9312>I<EA01F9EA0607EA080312181301EA3802EA3C00121F13F0EA07FC
+EA01FEEA001FEA40071303A212601306EAF004EAC818EA87E010147F9312>I<1380EA01
+00A35A5A5A121EEAFFF8EA0E00A45AA65A1310A41320A2EA1840EA0F800D1C7C9B12>I<
+381C0380EAFC1FEA3C07EA1C03A238380700A6EA700EA4131EA25BEA305E381F9F801114
+7B9319>I<39FF9FE1FC393C078070391C030060148015401580EA0E0790380D81001309
+EB19C21311380F21C4EA0720EB40C814E8EB80F0A26C485A1460000213401E147C9321>
+119 D<381FF0FF3803C0780001137014403800E0C0EBE180EB73001376133CA2131C132E
+134E1387EA0107380203801204380C01C0383C03E038FE07FC18147F9318>I<390FF83F
+803901E00E00EBC00C140813E000005B143014205C13705CA20171C7FC1339133A133E13
+3C133813181310A25BA25BEA70C0EAF08000F1C8FC12E61278191D809318>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmr8 8 26
+/Fe 26 118 df<126012F0A212701210A21220A21240A2040A7D960A>39
+D<EAFF80A2090280870C>45 D<1206120E12FE120EB1EAFFE00B157D9412>49
+D<13101338A3135CA3138EA3EA0107A238020380A33807FFC0EA0401A2380800E0A20018
+13F0123838FE03FE17177F961A>65 D<EAFFFE381C0380EB00E014601470A414E0EB01C0
+381FFF8014C0381C00E0147014301438A4147014E0EB01C0B5120015177F9619>I<EBFC
+1038038330380E00B0481370481330123000701310126012E01400A51410126012700030
+132012386C13406C138038038300EA00FC14177E9619>I<B5FC381C01C0EB00E0143014
+381418141C140C140EA7140C141CA2143814301460EB01C0B5120017177F961B>I<B512
+E0EA1C00146014201410A3EB0400A3130CEA1FFCEA1C0C13041408A2130014181410A214
+3014F0B5FC15177F9618>I<B512E0EA1C00146014201410A3EB0400A3130CEA1FFCEA1C
+0C1304A390C7FCA6EAFFC014177F9617>I<EAFFC0001CC7FCAD1420A31460A2144014C0
+1303B5FC13177F9616>76 D<EAFFFE381C0380EB00C014601470A4146014C0EB0380381F
+FE00001CC7FCAAB47E14177F9618>80 D<EAFFFC381C0380EB00C014E01470A414E014C0
+EB0380381FFE00381C0780EB01C0EB00E0A514E1A2147238FF803C18177F961A>82
+D<EA0FC4EA302CEA601CEA400CEAC004A3EAE0001270127FEA3FE0EA0FF8EA01FCEA001C
+130E13061280A3EAC004EAE008EAD810EA87E00F177E9614>I<387FFFF8386038180040
+1308A200801304A300001300AF3803FF8016177F9619>I<12FCA212C0B3AB12FCA20621
+7D980A>91 D<EA3FC0EA70601330EA20381200EA03F8EA1E3812301270EAE039A21379EA
+70FFEA1F1E100E7F8D12>97 D<EA07F0EA18381230EA7010EA600012E0A41260EA700812
+30EA1830EA07C00D0E7F8D10>99 D<EA0FC0EA1860EA3030EA7038EAE018EAFFF8EAE000
+A31260EA7008EA3010EA1830EA07C00D0E7F8D10>101 D<1203EA0780A2EA0300C7FCA5
+EA1F801203AF1243EAE30012E7127C091D82960B>106 D<12F81238A8133E1338133013
+4013801239EA3FC0EA39E0123813F01378133CA2EAFE7F10177F9613>I<EAF8F8EA3B1C
+EA3C0E1238AA38FE3F80110E7F8D14>110 D<EAF9F0EA3E1CEA380613077F1480A41400
+5B130EEA3E1CEA39F00038C7FCA512FE11147F8D14>112 D<EAF9E0EA3A70123CEA3820
+1300A9B4FC0C0E7F8D0E>114 D<EA1F40EA60C0EAC040A2EAE000B4FCEA7F80EA1FC0EA
+01E0EA8060A212C0EAE0C0EA9F000B0E7F8D0E>I<1208A31218A21238EAFFC0EA3800A7
+1340A4EA1C80EA0F000A147F930E>I<EAF83EEA380EAA131EEA1C2E3807CF80110E7F8D
+14>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmsy9 9 2
+/Ff 2 106 df<13801201EA0300A31206A25AA35AA35AA25AA35AA21260A37EA27EA37E
+A37EA27EA3EA0180120009267D9B0F>104 D<12C0A21260A37EA27EA37EA37EA27EA3EA
+0180A2EA0300A31206A25AA35AA35AA25AA35AA209267E9B0F>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmsltt10 10.95 33
+/Fg 33 122 df<1206120FEA1F80120FA21203EA0700A25A120E123C127C12F01260090E
+769B18>39 D<387FFFC0B512E0A26C13C013047C8F18>45 D<133E13FF000313803807C3
+C0EA0F01000E13E0EA1C00123C003813F014705AA34813E0A4EB01C0A2130300F01380EA
+7007EB0F00EA781E6C5AEA1FF85BEA07C0141C7C9B18>48 D<13181338A2137813F81203
+120F137012041200A413E0A6EA01C0A6EA7FFE12FF127F0F1C7B9B18>I<EB3E18EBFFB8
+4813F8EA07C1EB8078EA0E00121E001C137048133014005AA35AA614C0EA7001A2130338
+380780383C0F00EA1FFE6C5AEA03F0151C7C9B18>67 D<3807FFC014E014F03801C0F814
+78143C141CEA0380141EA2140EA33807001CA4143C1438120E147014F0EB01E0EB03C013
+07387FFF8038FFFE00EA7FF8171C7F9B18>I<0007B5FC5A7E3801C007A3140638038000
+A2EB818014C0A213FF481380A21303A2140090C7FC120E140C141CA4387FFFF8B5FC7E18
+1C7F9B18>I<3907F87F80A33901C01C00A448485AA5EBFFF8485BA2EB0070A4000E5BA6
+387F87F8EAFF8FEA7F87191C7F9B18>72 D<EB1FF8EB3FFCEB1FF8EB01C0A4EB0380A6EB
+0700A6130EA2124012E06C5AEAE03CEAFFF86C5AEA1FC0161C7C9B18>74
+D<EA07FC487E6C5AEA01C0A4485AA648C7FCA6120E14301470A4B512E0A3141C7E9B18>
+76 D<3907E01F80000FEB3FC0000714803903B02E00146EA214CE380730DC1331149CA2
+1333141C000E5B13371336133E133C131848C65AA638FE03F800FF7F00FE5B1A1C7F9B18
+>I<126012F0A37E1278A3127C123CA3123E121EA3121F7EA313801207A313C01203A413
+E01201A313F0120013600C24789F18>92 D<387FFFC0B512E0A26C13C013047E7F18>95
+D<EA03FC48B4FC4813801303380601C01200A2137FEA07FF121FEA3F813878038012F012
+E0A21307EA701F387FFFF0EA3FFBEA0FE114147D9318>97 D<127EA3120EA45A137CEA1D
+FF001F13801383381E01C0123CEB00E01238A4387801C0A2EB0380A2EB0F00EA7C1FEAFF
+FCEAEFF8EA63E0131C7C9B18>I<EB07E0A31300A4EB01C0EA01F1EA07FDEA0FFFEA1E0F
+EA3C0738780380127012E0A4EB0700A25B5B6C5AEA787F383FFFC0381FEFE0380F87C013
+1C7C9B18>100 D<13F8EA07FE487E381F0780EA3C03387801C0127012E0A2B5FCA21480
+00E0C7FCA213033870078038780F00EA3FFE6C5AEA07F012147B9318>I<EB01F8EB07FC
+131FEB1E3CEB38181400A25B381FFFF05A7E38007000A25BA6485AA6EA7FFE12FF127F16
+1C7E9B18>I<EB1E1F90387FFF8090B5FC3901E1E3003803C0E01380EA0700A3495AA238
+038780EA07FF49C7FCEA0E7890C8FCA26CB47E4813E0487F383C007848133812705AA214
+7800705B387C03E0383FFFC0000F90C7FCEA03FC191F809318>I<1318133C137C133C13
+1890C7FCA4EA0FF8121F120FEA0038A25BA65BA6EA7FFFB512806C1300111D7C9C18>
+105 D<14C0EB01E013031301EB00C01400A4EBFFC0A31301A2EB0380A6EB0700A6130EA6
+5BA2EA6038EAF078B45A5BEA3F8013277F9C18>I<EA07E0120F12071200A4485AEBC7FE
+A3EBC1E0EBC3C038038780EB8F00139E13BC13FE13EEEA07CF1387EB0780130314C01301
+387FC7F838FFE7FC387FC7F8171C7F9B18>I<EA0FFCA3EA001CA45BA65BA65BA6B51280
+14C01480121C7D9B18>I<381F8F80383FBFE0381FFFF03803F07013E0EA07C013801300
+A4000E13E0A638FF87F8EBCFFCEB87F816147F9318>110 D<13FCEA03FF000F1380EA1F
+07383C03C0EA7801007013E0EAE000A4EB01C0A2EB0380EAF007EB0F00EA7C3EEA3FFC6C
+5AEA07E013147C9318>I<EBF8C0EA03FDEA0FFFEA1F0FEA3C0738780380127012E0A4EB
+0700A25BA26C5AEA787FEA3FFEEA1FEEEA078EEA000EA35BA43801FF80A3121E7C9318>
+113 D<381FE1F8EBE7FCEBEFFE3800FE1EEBFC0C3801F8005B5B5BA3485AA6EAFFFC7F5B
+17147E9318>I<EBFE603807FFE05AEA1F01121C003813C0EA3C00001F1300EA0FF8EA07
+FE3800FF801307383001C01270A238780380EA7C07B51200EAEFFEEA63F813147D9318>
+I<387E07E0EAFE0FEA7E07EA0E00A2381C01C0A638380380A41307131F383FFFE06C13F0
+3807E3E014147D9318>117 D<387F8FF000FF13F8007F13F0381C0380A2EB0700121EEA
+0E0F130E131E131CA25BA26C5AA2136013E05B6C5A15147C9318>I<38FF87F8138F1387
+383800E0EB01C0A3148013E3EA39F31233EB7700A212371376EA3666136EEA3C7CA2EA38
+3815147C9318>I<381FE3FC13E713E33803C3C000011380EBE700EA00EE13FC137C1338
+137813FCEA01DCEA038E12071307120E38FF1FE0EB9FF0EB1FE016147E9318>I<380FF1
+FE381FF9FF380FF1FE3803807013C0000113E0A213C114C0A23800E380A2EBE700A213E6
+136E136C137C1378A21370A25BA2485A12F3EAF780B4C7FC5A1278181E7F9318>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmcsc10 10.95 18
+/Fh 18 121 df<1318A2133CA3134EA213CF1387A238010380A2000313C0EA0201A23807
+FFE0EA0400A2481370A2001813380038137838FE01FF18177F961C>97
+D<EB7E083803819838070078000C1338001C13185A00781308127000F01300A700701308
+127812386C1310120C000713603803818038007E0015177E961B>99
+D<EAFFFE381C0780EB01C0EB00E01470A21438A2143CA71438A21478147014E0EB01C0EB
+038038FFFE0016177E961C>I<B512C0EA1C011300144014601420A213081400A21318EA
+1FF8EA1C1813081410A2130014301420A21460EB01E0B5FC14177E9619>I<B512C0EA1C
+011300144014601420A213081400A21318EA1FF8EA1C181308A390C7FCA6EAFFC013177E
+9618>I<EB7E083803819838070078000C1338001C13185A00781308127000F01300A5EB
+03FEEB00381270127812387E120C1207380380D838007F0817177E961D>I<38FF87FC38
+1C00E0AAEA1FFFEA1C00AA38FF87FC16177E961C>I<EAFF80EA1C00B3A3EAFF8009177E
+960E>I<EA1FF0EA01C0B112E1A2EAC180EA4300123E0C177E9613>I<EAFFC0001CC7FCAD
+1440A314C0A2148013011307B5FC12177E9617>108 D<00FCEB07F0001C1480A2001613
+0BA200131313A338118023A23810C043A3EB6083A2EB3103A3131AA2130C123800FEEB1F
+F01C177E9622>I<38FC01FC381E007014201217EA1380A2EA11C0EA10E0A213701338A2
+131C130E1307A2EB03A0EB01E0A213001460123800FE132016177E961C>I<13FE380383
+80380E00E0481370003C1378003813380078133C0070131C00F0131EA70070131C007813
+3C00381338003C1378001C13706C13E0380383803800FE0017177E961D>I<EAFFFCEA1C
+07EB03C0130114E0A414C01303EB0700EA1FFC001CC7FCAAB47E13177E9619>I<EA0FC4
+EA302CEA601CEA400CEAC004A3EAE0001270127FEA3FE0EA0FF8EA01FCEA001C130E1306
+1280A3EAC004EAE008EAD810EA87E00F177E9615>115 D<387FFFFC3870381C00401304
+A200C0130600801302A300001300AE3803FF8017177F961B>I<38FF81FC381C00701420
+B0000C1340120E6C138038018300EA007C16177E961C>I<38FF80FE381F0070000E1360
+6C1340EB80803803C100EA01C3EA00E213F4137813387F133E134E13C7EB8780380103C0
+EA0201380600E0000413F0000C1370003C137800FE13FF18177F961C>120
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmti10 10.95 8
+/Fi 8 117 df<EC3FE0ECE010903801803801031378A290380700301500A3130EA390B5
+12E0EB0E0090381C01C0A4EC03801338A3EC0700A2137801701310EC0E20A313609038E0
+0640EC038091C7FC5BA21201EA3180127948C8FC1262123C1D29829F1A>12
+D<127012F8A212F012E005057B840E>46 D<EB3C60EBE2703801C1E0EA0380EA07005A38
+0E01C0121EA3383C0380A4EB0700A2EA1C0F1317EA0C2EEA03CEEA000EA25BA21230EA78
+38485AEA60E0EA3F80141D7E9315>103 D<13C0EA01E0A213C0C7FCA7120E12131223EA
+4380EA4700A21287120EA35AA3EA38401380A21270EA31001232121C0B1F7C9E0E>105
+D<381C0F80382630C0384740601380EB0070A2008E13E0120EA3381C01C0A3EB03840038
+1388A2EB0708EB031000701330383001C016147C931A>110 D<EA1C1EEA266138278380
+EA47871307EB0300008EC7FC120EA35AA45AA45A123011147C9313>114
+D<13FCEA0302EA0601EA0C03130713061300EA0F8013F0EA07F8EA03FCEA003E130E1270
+EAF00CA2EAE008EA4010EA2060EA1F8010147D9313>I<EA018013C0EA0380A4EA0700A2
+EAFFF0EA0700120EA45AA45AA31320EA7040A21380A2EA3100121E0C1C7C9B0F>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmbxti10 14.4 1
+/Fj 1 47 df<120E123FEA7F80A212FFA21300127E123C0909798815>46
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmbx12 17.28 25
+/Fk 25 122 df<EB01C01303130F137FEA1FFFB5FC13BFEAE03F1200B3B1007FB512F0A3
+1C2E7AAD28>49 D<1578A215FCA34A7EA24A7EA24A7FA34A7FEC0E7F021E7FEC1C3FA202
+387F151F02787FEC700FA202E07F1507010180ECC003A249486C7EA201078191C7FC4981
+91B6FCA24981011CC7123F013C810138141FA24981160F01F081491407A2484881486C14
+03B549B512FCA336317DB03D>65 D<913A03FF800180023FEBF00349B5EAFC0701079038
+003F0FD91FF8EB079FD93FC0EB01FFD9FF807F4848C8127F4848153F0007161F49150F48
+5A001F1607A2485A1703127FA24992C7FCA212FFA9127FA27FEF0380123FA26C7E170700
+0F17006C7E6D150E0003161E6C6C151C6C6C6C1478D93FC05CD91FF8EB03E0D907FFEB3F
+800101D9FFFEC7FCD9003F13F80203138031317CB03A>67 D<B812F0A3C6903880003FEE
+07F816031600A21778A21738A3171C1507A31700A25D5D5D91B5FCA3EC803F818181A217
+07A392C7120EA4171EA2173CA2177C17FC16011607163FB812F8A330317EB035>69
+D<B67EA3000190C9FCB3A9EE0380A416071700A25EA35E5E5E5E4B5A150FB7FCA329317D
+B030>76 D<B500C00303B5FCA26E5DC61900D9EFF0150EA3D9E7F85DA2D9E3FC5DA2D9E1
+FE5DA2D9E0FF5DA26E6C495AA26E6C495AA36E6C495AA26E6C130EA26E6C5BA26E6C5BA2
+6E6C5BA26E6C5BA392387F81C0A292383FC380A2DB1FE7C7FCA2ED0FFEA26F5AA36F5A48
+7EB526E001F090B6FCA26F5A48317EB04D>I<007FB8FCA39039C00FF801D87E00EC003F
+007C82007882A200708200F01780A3481603A5C792C7FCB3AA017FB6FCA331307DAF38>
+84 D<EBFFF0000313FF390F803F809038C00FE0486C6C7EA26E7ED80FC07FEA0780C7FC
+A414FF131FEBFFE33803FC03EA0FF0EA1FC0123FEA7F80A2EAFF00A31407A2387F800D39
+3FC01DFE3A1FE078FFF03907FFE07FC6EB803F24207E9F27>97 D<EA01F812FFA3120F12
+07ADEC3FE0ECFFFC9038FBE07F9039FF001F8049EB0FC04914E049EB07F016F8A2ED03FC
+A316FEA816FCA3ED07F8A216F06DEB0FE06D14C001E7EB3F809039C3C0FE00903880FFF8
+9038003FC027327EB12D>I<ED0FC0EC07FFA3EC007F153FADEB07F8EB3FFF9038FE07BF
+3903F801FF3907E0007F120F4848133F123FA2485AA312FFA8127FA36C7EA2121F6C6C13
+7F000714FF2603F00313E03A01FC0F3FFE38007FFEEB0FF027327DB12D>100
+D<EB0FFC90387FFF803901FC0FC03903F003E03907E001F0000F14F8391FC000FC003F14
+FEA24848137E157FA212FFA290B6FCA20180C7FCA4127FA36C6C1307121F150E6C7E6C6C
+131C6C6C13783900FE03E090383FFFC0903807FE0020207E9F25>I<EB01FE90380FFF80
+90381FC3C090387F07E09038FE0FF0120113FC1203EC07E0EC018091C7FCA8B512FCA3D8
+03FCC7FCB3A8387FFFF0A31C327EB119>I<90391FF007C09039FFFE3FE03A01F83F79F0
+3907E00FC3000F14E19039C007E0E0001FECF000A2003F80A5001F5CA2000F5CEBE00F00
+075C2603F83FC7FC3806FFFE380E1FF090C9FC121EA2121F7F90B57E6C14F015FC6C806C
+801680000F15C0003FC7127F007EEC1FE0007C140F00FC1407A4007EEC0FC0003E158000
+3F141FD80FC0EB7E003907F803FC0001B512F0D8001F90C7FC242F7E9F28>I<EA01F812
+FFA3120F1207ADEC07F8EC3FFEEC783F02C013809039F9801FC0EBFB0001FE14E05BA35B
+B3B500C3B5FCA328327DB12D>I<EA03C0487E487E487EA46C5A6C5A6C5AC8FCA9EA01F8
+127FA31207B3A7B51280A311337DB217>I<EA01F812FFA3120F1207B3B3A6B512C0A312
+327DB117>108 D<2703F007F8EB1FE000FFD93FFEEBFFF8913A783F01E0FC02C0903883
+00FE280FF1801FC6137F2607F30013CC01F602F8148001FC5CA3495CB3B500C3B5380FFF
+FCA33E207D9F43>I<3903F007F800FFEB3FFEEC783F02C013803A0FF1801FC03807F300
+01F614E013FCA35BB3B500C3B5FCA328207D9F2D>I<EB07FC90387FFFC03901FC07F039
+03F001F848486C7E4848137E001F147F003F158049133F007F15C0A300FF15E0A8007F15
+C0A36C6CEB7F80A2001F15006C6C13FE00075C3903F803F83901FE0FF039007FFFC0D907
+FCC7FC23207E9F28>I<3901F83FE000FFEBFFFC9038FBE07F9039FF003F80D80FFEEB1F
+C06C48EB0FE04914F0ED07F8A216FC1503A216FEA816FC1507A216F8A2ED0FF06D14E06D
+EB1FC06DEB3F809039FBC0FE009038F8FFF8EC3FC091C8FCABB512C0A3272E7E9F2D>I<
+3801FF86000713FEEA1F00003C133E48131E140E12F8A36C90C7FCB47E13FC387FFFC06C
+13F0806C7F00077F00017FEA003F01001380143F0060131F00E0130FA27E15007E6C131E
+6C131C38FF807838F3FFF038C07F8019207D9F20>115 D<131CA5133CA3137CA213FC12
+0112031207381FFFFEB5FCA2D803FCC7FCB0EC0380A71201EC0700EA00FEEB7F0EEB3FFC
+EB07F0192E7FAD1F>I<D801F8EB07E000FFEB03FFA3000FEB003F0007141FB3153FA200
+03147FA26C6CEBDFF03A00FE039FFF90387FFF1FEB0FFC28207D9F2D>I<3A7FFF807FFC
+A33A03FC000F006C6C131E6C6C5BEC803890387FC078013F5B90381FE1E090380FF3C0EC
+FF806D90C7FC6D5A13016D7E81815B903803DFE09038078FF08190380F07FC90381E03FE
+EB3C01496C7E4914804848EB7FC00003EC3FE026FFFC01B5FCA328207F9F2B>120
+D<B5EB1FFCA3D80FF8EB03C0000715806D1307000315007F0001140E7F6C5CA2EC803C01
+7F1338ECC078013F1370ECE0F0011F5B14F1010F5B14F9903807FB80A214FF6D90C7FCA2
+6D5AA26D5AA21478A21470A214F05C1301007C5BEAFE035C49C8FC5BEAFC1EEA787CEA3F
+F0EA0FC0262E7E9F2B>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmsy10 10.95 1
+/Fl 1 14 df<14FE903807FFC090381F01F0903878003C01E0130ED80180130348C7EA01
+800006EC00C0481560A2481530481518A248150CA4481506A90060150CA46C1518A26C15
+306C1560A26C15C06CEC01806C6CEB0300D800E0130E0178133C90381F01F0903807FFC0
+D900FEC7FC272B7DA02E>13 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmbx12 14.4 45
+/Fm 45 122 df<123C127FEAFF80A213C0A3127F123E1200A2EA0180A3EA0300A2120612
+0E5A5A12100A157B8813>44 D<121C127FA2EAFF80A3EA7F00A2121C09097B8813>46
+D<130E131E137EEA07FE12FFA212F81200B3ABB512FEA317277BA622>49
+D<EBFF80000713F04813FC381E03FE393800FF80007C133F00FE14C06C131F15E0140FA2
+127E003C131FC7FC15C0A2EC3F801500147E5C5C495A495AEB078049C7FC131E4913E013
+705B3901C001C0EA0380EA0600000FB5FC5A5A5AB61280A31B277DA622>I<EB7F803803
+FFF04813FC380F81FE381F007FEA3F80EC3F80A3121F1300C7EA7F00A2147E5C495AEB07
+F0EBFFC0A2EB01F8EB007E801580EC1FC0A215E0A2123C127EB4FCA215C0143F48148000
+7CEB7F00383F01FE6CB45A000713F0C613801B277DA622>I<140FA25C5C5C5C5BA2EB03
+BFEB073F130E131C133C1338137013E0EA01C0EA038012071300120E5A5A5A12F0B612F8
+A3C7EA7F00A890381FFFF8A31D277EA622>I<00181303381F801FEBFFFE5C5C5C14C091
+C7FC001CC8FCA7EB7FC0381DFFF8381F80FC381E003F1208C7EA1F8015C0A215E0A21218
+127C12FEA315C05A0078EB3F80A26CEB7F00381F01FE6CB45A000313F0C613801B277DA6
+22>I<EC0780A24A7EA34A7EA24A7EA3EC77F8A2ECF7FC14E3A2903801C1FEA201037F14
+80A249486C7EA24980010E133FA2496D7EA2013FB57EA39039700007F8A201F080491303
+000181491301A2000381D8FFFE013F13FCA32E297EA833>65 D<B612F815FF16C03A03F8
+001FE0ED0FF0ED07F8150316FCA21501A3150316F8A2ED07F0150FED1FC0EDFF8090B5EA
+FE00EDFFC09039F8000FF0ED03F8ED01FC16FE1500A216FFA616FE1501ED03FC1507ED1F
+F8B712E016C0EDFE0028297DA830>I<91387FE003903907FFFC07011FEBFF0F90397FF0
+0F9F9039FF0001FFD801FC7F4848147F4848143F4848141F485A160F485A1607127FA290
+C9FC5AA97E7F1607123FA26C7E160E6C7E6C6C141C6C6C143C6C6C14786CB4EB01F09039
+7FF007C0011FB512800107EBFE009038007FF028297CA831>I<B612FCEDFF8016E03A03
+FC001FF8ED03FCED00FE167FEE3F80EE1FC0A2EE0FE0A2EE07F0A417F8AA17F0A3EE0FE0
+A217C0161FEE3F80EE7F005EED03FCED1FF8B75A168003FCC7FC2D297EA834>I<B712E0
+A33903FC001FED07F01501A215001670A3913801C0781638A302031300A2140F90B5FCA3
+EBFC0F1403A20201130EA3161C91C7FCA3163C1638167816F815011503151FB712F0A327
+297EA82C>I<B712C0A33903FC003FED0FE015031501A21500A316F0913801C070A31600
+1403A2140F90B5FCA3EBFC0F1403A21401A491C8FCA9B512FCA324297EA82A>I<91387F
+E003903907FFFC07011FEBFF0F90397FF00F9F9039FF0001FFD801FC7F48488048488048
+4880485A82485A82127FA290CAFC5AA892B512F87E7F03001300123FA26C7EA26C7E6C7E
+6C7E6C7E6CB45B90387FF007011FB5129F0107EBFE0F9039007FF0032D297CA835>I<B5
+12F0A33803FC00B3B1B512F0A314297EA819>73 D<B512FCA3D803FCC8FCB3A3ED01C0A4
+15031680A21507A2150FA2151F157F913801FF00B7FCA322297EA828>76
+D<D8FFFE92383FFF80A26D5D0003EFE000A2D9BF8014EFA2D99FC0EB01CFA2D98FE0EB03
+8FA3D987F0EB070FA2D983F8130EA2D981FC131CA3D980FE1338A2027F1370A291383F80
+E0A391381FC1C0A291380FE380A2913807F700A3EC03FEA26E5AA26E5AD8FFFE0203B512
+80A2157039297DA840>I<D8FFFCEC7FFF7F7F00036DEB01C080EBBFE0139F80EB8FF8EB
+87FCEB83FEEB81FF01801380147F15C0EC3FE0EC1FF0EC0FF8EC07FC140315FEEC01FF6E
+1381ED7FC1ED3FE1ED1FF1150F16F9ED07FDED03FF8181167FA2163F161F160F1607D8FF
+FE14031601A230297EA835>I<B612E015FE6F7E3A03FC003FE0ED0FF06F7E6F7E150182
+A65E4B5A1507ED0FE0ED3FC090B500FEC7FCA29039FC00FF80ED3FC06F7E6F7E6F7EA917
+0EA21503923801FC1CB538F000FEEE7FF8EE0FE02F297EA832>82
+D<9038FF80600003EBF0E0000F13F8381F80FD383F001F003E1307481303A200FC1301A2
+14007EA26C140013C0EA7FFCEBFFE06C13F86C13FE80000714806C14C0C6FC010F13E0EB
+007FEC1FF0140F140700E01303A46C14E0A26C13076C14C0B4EB0F80EBE03F39E3FFFE00
+00E15B38C01FF01C297CA825>I<007FB71280A39039807F807FD87C00140F00781507A2
+0070150300F016C0A2481501A5C791C7FCB3A490B612C0A32A287EA72F>I<B500F0EBFF
+FEA3D803FCC7EA0380B3AA0001ED07007F0000150E137F6D143CD91FC05B90390FF003F0
+6DB55A01001480DA1FFCC7FC2F297EA834>I<B53CE07FFFE01FFFC0A32803FC0003FCC7
+EA7000A26D6D7E000160A26D6E13016C604B138002801503017F5F4B13C0D93FC0013F49
+C7FCA2913AE00E1FE00F011F160E17F09126F01C0F131E010F161C033C13F8902707F838
+075BA2037813FC902703FC70035BA2913AFEE001FEF001015E02FF14FF4B7E6D5EA26E48
+6D5AA36EC76CC8FCA2023E80021E141EA242297FA845>87 D<3803FF80000F13F0381F01
+FC383F80FE147F801580EA1F00C7FCA4EB3FFF3801FC3FEA0FE0EA1F80EA3F00127E5AA4
+145F007E13DF393F839FFC381FFE0F3803FC031E1B7E9A21>97 D<EAFFE0A3120FACEBE1
+FE9038EFFF809038FE07E09038F803F09038F001F89038E000FCA2157EA2157FA8157EA3
+15FCA29038F001F89038F803F090389C0FE090380FFF80390E01FC00202A7EA925>I<EB
+3FF03801FFFC3803F03E380FC07FEA1F80EA3F00A248133E007E90C7FCA212FEA7127EA2
+127F6CEB03801380001FEB0700380FE00E3803F83C3801FFF838003FC0191B7E9A1E>I<
+EC7FF0A31407ACEB3F873801FFF73807F03F380FC00F381F8007EA3F00A2127EA312FEA8
+127EA27EA2381F800F380FC01F3907E07FFF3801FFE738007F87202A7EA925>I<EB3FC0
+3801FFF03803E07C380F803E001F7F130048EB0F80127E15C0A200FE1307A2B6FCA248C8
+FCA3127EA2127F6CEB01C07E390F8003803907C007003803F01E3800FFFCEB3FE01A1B7E
+9A1F>I<EB07F8EB3FFCEB7E3E3801FC7FEA03F813F01207143E1400A7B512C0A33807F0
+00B3A3387FFF80A3182A7EA915>I<9038FF80F00003EBE3F8390FC1FE1C391F007C7C48
+137E003EEB3E10007EEB3F00A6003E133E003F137E6C137C380FC1F8380BFFE000181380
+90C8FC1238A2123C383FFFF814FF6C14C06C14E06C14F0121F383C0007007CEB01F84813
+00A4007CEB01F0A2003FEB07E0390FC01F806CB5120038007FF01E287E9A22>I<EAFFE0
+A3120FAC147E9038E1FF809038E30FC001E413E0EBE80701F813F013F0A213E0B039FFFE
+3FFFA3202A7DA925>I<1207EA0F80EA1FC0EA3FE0A3EA1FC0EA0F80EA0700C7FCA7EAFF
+E0A3120FB3A3EAFFFEA30F2B7EAA12>I<EAFFE0A3120FB3B2EAFFFEA30F2A7EA912>108
+D<26FFC07FEB1FC0903AC1FFC07FF0903AC307E0C1F8D80FC49038F101FC9039C803F200
+01D801FE7F01D05BA201E05BB03CFFFE3FFF8FFFE0A3331B7D9A38>I<38FFC07E9038C1
+FF809038C30FC0D80FC413E0EBC80701D813F013D0A213E0B039FFFE3FFFA3201B7D9A25
+>I<EB3FE03801FFFC3803F07E390FC01F80391F800FC0393F0007E0A2007EEB03F0A300
+FE14F8A8007E14F0A26CEB07E0A2391F800FC0390FC01F803907F07F003801FFFC38003F
+E01D1B7E9A22>I<38FFE1FE9038EFFF809038FE0FE0390FF803F09038F001F801E013FC
+140015FEA2157FA8157E15FEA215FC140101F013F89038F807F09038FC0FE09038EFFF80
+9038E1FC0001E0C7FCA9EAFFFEA320277E9A25>I<38FFC1F0EBC7FCEBC63E380FCC7F13
+D813D0A2EBF03EEBE000B0B5FCA3181B7F9A1B>114 D<3803FE30380FFFF0EA3E03EA78
+00127000F01370A27E00FE1300EAFFE06CB4FC14C06C13E06C13F0000713F8C6FCEB07FC
+130000E0137C143C7E14387E6C137038FF01E038E7FFC000C11300161B7E9A1B>I<13E0
+A41201A31203A21207120F381FFFE0B5FCA2380FE000AD1470A73807F0E0000313C03801
+FF8038007F0014267FA51A>I<39FFE07FF0A3000F1307B2140FA2000713173903F067FF
+3801FFC738007F87201B7D9A25>I<39FFFC03FFA3390FF000F0000714E07F0003EB01C0
+A2EBFC0300011480EBFE070000140013FFEB7F0EA2149EEB3F9C14FC6D5AA26D5AA36D5A
+A26D5AA2201B7F9A23>I<3BFFFC7FFC1FFCA33B0FE00FE001C02607F007EB0380A201F8
+EBF00700031600EC0FF801FC5C0001150EEC1FFC2600FE1C5B15FE9039FF387E3C017F14
+38EC787F6D486C5A16F0ECE01F011F5CA26D486C5AA2EC800701075CA22E1B7F9A31>I<
+39FFFC1FFEA33907F003803803F8079038FC0F003801FE1E00005BEB7F3814F86D5A6D5A
+130F806D7E130F497EEB3CFEEB38FFEB787F9038F03F803901E01FC0D803C013E0EB800F
+39FFF03FFFA3201B7F9A23>I<39FFFC03FFA3390FF000F0000714E07F0003EB01C0A2EB
+FC0300011480EBFE070000140013FFEB7F0EA2149EEB3F9C14FC6D5AA26D5AA36D5AA26D
+5AA25CA21307003890C7FCEA7C0FEAFE0E131E131C5BEA74F0EA3FE0EA0F8020277F9A23
+>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmtt10 10.95 77
+/Fn 77 127 df<127012F8B012701200A5127012F8A31270051C779B18>33
+D<EA4010EAE038EAF078EAE038AAEA60300D0E7B9C18>I<EA0306EA078FA6387FFFC0B5
+12E0A26C13C0380F1E00A6387FFFC0B512E0A26C13C0381E3C00A6EA0C18131C7E9B18>
+I<13C01201A3EA03F0EA0FFCEA3FFEEA7DCFEA71C738E1C38013C7A338F1C0001279123F
+6C7EEA0FF8EA01FC13DE13CF13C73861C38012F1A212E1EBC7001271EA79DEEA3FFEEA1F
+F8EA07E0EA01C0A3120011247D9F18>I<1238127CA2127E123E120EA3121CA2123812F8
+12F012C0070E789B18>39 D<137013F0EA01E0EA03C0EA0780EA0F00121E121C5AA25AA4
+5AA81270A47EA27E121E7EEA0780EA03C0EA01F0120013700C24799F18>I<126012F012
+787E7E7EEA07801203EA01C0A2EA00E0A41370A813E0A4EA01C0A2EA03801207EA0F0012
+1E5A5A5A12600C247C9F18>I<EA01C0A4EA41C138F1C780EAFDDF387FFF00EA1FFCEA07
+F0A2EA1FFCEA7FFF38FDDF80EAF1C73841C100EA01C0A411147D9718>I<121C123E127E
+127F123F121F1207120E121E127C12F81260080C788518>44 D<387FFFC0B512E0A26C13
+C013047E8F18>I<1230127812FCA2127812300606778518>I<1303EB0780A2130F14005B
+131EA2133E133C137C1378A213F85B12015B12035BA212075B120F90C7FCA25A121E123E
+123CA2127C127812F85AA2126011247D9F18>I<EA01F0EA07FC487EEA1F1FEA1C073838
+0380007813C0EA7001A238E000E0A9EAF001007013C0A2EA780300381380381C0700EA1F
+1FEA0FFE6C5AEA01F0131C7E9B18>I<EA01801203A21207120F123F12FF12FB12431203
+B0EA7FFCEAFFFEEA7FFC0F1C7B9B18>I<383FFF80A30038C7FCA8EA3BF8EA3FFE7F383C
+0780383003C0EA0001EB00E0A2126012F0A238E001C0EA7003387C0F80383FFF00EA1FFC
+EA03F0131C7E9B18>53 D<12E0B512E0A214C038E00380EB0700C65A131E131C5BA25B13
+F05BA2485AA3485AA448C7FCA7131D7E9C18>55 D<EA03F8EA0FFE487E383E0F80EA3803
+387001C0A438380380EA3C07381FFF00EA07FC487EEA1F1F383C0780387001C000F013E0
+EAE000A4387001C0EA7803383E0F80381FFF006C5AEA03F8131C7E9B18>I<1230127812
+FCA2127812301200A81230127812FCA2127812300614779318>58
+D<14C0EB03E01307EB1FC0EB3F80EBFE00485AEA07F0485AEA3F8048C7FC12FCA2127F6C
+7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E01303EB00C013187E9918>60
+D<387FFFC0B512E0A26C13C0C8FCA4387FFFC0B512E0A26C13C0130C7E9318>I<126012
+F87E127F6C7EEA0FE06C7EEA01FC6C7EEB3F80EB1FC0EB07E0A2EB1FC0EB3F80EBFE0048
+5AEA07F0485AEA3F8048C7FC12FC5A126013187E9918>I<EA0FF0EA3FFC48B4FCEA700F
+38F00380A2EA600738000F00133E5BEA01F05B485AA55BC8FCA5EA0380487EA36C5A111C
+7D9B18>I<137CEA01FEEA07FF380F8780381E03C0EA3C1DEA387F3870FFE0EA71E313C1
+12E1EAE380A638E1C1C0127113E33870FF8038387F00EA3C1C381E00E0EA0F833807FFC0
+0001138038007E00131C7E9B18>I<137013F8A213D8A2EA01DCA3138CEA038EA4EA0707
+A5380FFF80A3EA0E03381C01C0A3387F07F000FF13F8007F13F0151C7F9B18>I<EA7FFC
+B5FC6C1380381C03C01301EB00E0A4130114C01307381FFF80140014C0EA1C03EB00E014
+F01470A414F014E01303387FFFC0B51280387FFE00141C7F9B18>I<EBF8E0EA03FEEA07
+FFEA0F07EA1E03EA3C01EA38005AA214005AA8127014E0A27E123C381E01C0EA0F073807
+FF803803FE00EA00F8131C7E9B18>I<EA7FF8EAFFFE6C7E381C0F80EB03C0A2EB01E013
+00A214F01470A814F014E0A2130114C01303EB0F80387FFF00485AEA7FF8141C7F9B18>
+I<B512F0A3381C0070A41400A2130EA3EA1FFEA3EA1C0EA390C7FCA21438A5B512F8A315
+1C7F9B18>I<B512F0A3381C0070A41400A2130EA3EA1FFEA3EA1C0EA390C7FCA7EAFFC0
+A3141C7E9B18>I<3801F1C0EA03FDEA0FFFEA1F0FEA1C03123813011270A290C7FC5AA5
+EB0FF0131F130F387001C0A213031238A2EA1C07EA1F0FEA0FFFEA03FDEA01F1141C7E9B
+18>I<387F07F038FF8FF8387F07F0381C01C0A9EA1FFFA3EA1C01AA387F07F038FF8FF8
+387F07F0151C7F9B18>I<EA7FFFB512806C1300EA01C0B3A4EA7FFFB512806C1300111C
+7D9B18>I<387F07F038FF87F8387F07F0381C03C0EB07801400130E131E5B13385B13F0
+121DA2EA1FB8A2131C121EEA1C0EA27FA2EB0380A2EB01C0387F03F038FF87F8387F03F0
+151C7F9B18>75 D<EAFFC0A3001CC7FCB114E0A5B5FCA3131C7E9B18>I<38FC01F8EAFE
+03A2383B06E0A4138EA2EA398CA213DCA3EA38D8A213F81370A21300A638FE03F8A3151C
+7F9B18>I<387E07F038FF0FF8387F07F0381D81C0A313C1121CA213E1A313611371A213
+311339A31319A2131D130DA3EA7F07EAFF87EA7F03151C7F9B18>I<EA0FFE383FFF8048
+13C0EA7803EA700100F013E0EAE000B0EAF001007013C0EA7C07EA7FFF6C1380380FFE00
+131C7E9B18>I<EAFFFEEBFF8014C0EA1C03EB01E013001470A514E01301EB03C0EA1FFF
+1480EBFE00001CC7FCA8B47EA3141C7F9B18>I<EA0FFE383FFF804813C0EA7803EA7001
+00F013E0EAE000AE1370A2EAF079387039C0EA783FEA7FFF6C1380380FFE00EA000FEB07
+80A2EB03C01301A213227E9B18>I<EA7FF8EAFFFE6C7E381C0F80130314C01301A31303
+1480130F381FFF005BA2EA1C0F7FEB0380A5149CA3387F01F8EAFF81387F00F0161C7F9B
+18>I<3803F1C0EA1FFF5AEA7C0FEA7003EAE001A390C7FC12701278123FEA1FF0EA07FE
+C67EEB0F80EB03C01301EB00E0A2126012E0130100F013C038F80780B5FCEBFE00EAE7F8
+131C7E9B18>I<387FFFF8B5FCA238E07038A400001300B2EA07FFA3151C7F9B18>I<38FF
+83FEA3381C0070B36C13E0EA0F01380783C03803FF806C1300EA007C171C809B18>I<38
+FE03F8EAFF07EAFE03381C01C0EA1E03000E1380EA0F0700071300A2EA038EA2EA01DCA3
+EA00F8A21370A9EA01FC487E6C5A151C7F9B18>89 D<EAFFF8A3EAE000B3ACEAFFF8A30D
+24779F18>91 D<126012F0A27E1278127C123CA2123E121E121F7EA27F12077F1203A27F
+12017F12007F1378A2137C133C133E131EA2131F7F14801307A2EB030011247D9F18>I<
+EAFFF8A3EA0038B3ACEAFFF8A30D247F9F18>I<387FFFC0B512E0A26C13C013047E7F18>
+95 D<EA0FF0EA1FFC487EEA3C0FEA180738000380A213FF1207121FEA7F03127812E0A3
+EAF007EA780F383FFFF8EA1FFDEA07F015147E9318>97 D<127E12FE127E120EA5133EEB
+FF80000F13C0EBC1E01380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E1380
+38063E00151C809B18>I<EA01FEEA07FF001F1380EA3E073838030048C7FCA25AA61270
+EB01C01238EA3E03381FFF8000071300EA01FC12147D9318>I<EB1F80133F131F1303A5
+EA03E3EA0FFBEA1FFFEA3C1FEA380FEA7007130312E0A6EA7007A2EA380FEA3C1F381FFF
+F0380FFBF83803E3F0151C7E9B18>I<EA01F0EA07FCEA1FFEEA3E0F38380780EA7003A2
+38E001C0A2B5FCA300E0C7FC1270EB01C01238EA3E07381FFF8000071300EA01F812147D
+9318>I<EB1F80EB7FC0EBFFE013E13801C0C01400A3387FFFC0B5FCA23801C000AEEA7F
+FFA3131C7F9B18>I<3801E1F03807FFF85A381E1E30381C0E00487EA5EA1C0EEA1E1EEA
+1FFC5BEA39E00038C7FC7EEA1FFEEBFFC04813E0387801F038700070481338A4007813F0
+EA7E03381FFFC06C13803801FC00151F7F9318>I<127E12FE127E120EA5133EEBFF8000
+0F13C013C1EB80E01300120EAB387FC7FC38FFE7FE387FC7FC171C809B18>I<EA0380EA
+07C0A3EA0380C7FCA4EA7FC012FF127F1201AEB5FCA3101D7C9C18>I<1338137CA31338
+1300A4EA0FFCA3EA001CB3A4EA6038EAF078EAFFF0EA7FE0EA3F800E277E9C18>I<127E
+12FE127E120EA5EB3FF0A3EB0780EB0F00131E5B5B5BEA0FF87F139C130EEA0E0F7FEB03
+8014C0387FC7F812FF127F151C7F9B18>I<EAFFC0A31201B3A4B51280A3111C7D9B18>I<
+38F9C1C038FFF7F013FF383E3E38EA3C3CA2EA3838AB38FE3E3EEB7E7EEB3E3E17148093
+18>I<EA7E3E38FEFF80007F13C0EA0FC1EB80E01300120EAB387FC7FC38FFE7FE387FC7
+FC1714809318>I<EA01F0EA0FFE487E383E0F80EA3803387001C0A238E000E0A5EAF001
+007013C0EA7803383C0780EA3E0F381FFF006C5AEA01F013147E9318>I<EA7E3E38FEFF
+80007F13C0380FC1E01380EB0070120E1438A6000F1370A2EB80E013C1EBFFC0000E1380
+EB3E0090C7FCA7EA7FC0487E6C5A151E809318>I<3801F380EA07FBEA1FFFEA3E1FEA38
+0FEA7007A2EAE003A6EA7007A2EA380FEA3C1FEA1FFFEA0FFBEA03E3EA0003A7EB1FF0EB
+3FF8EB1FF0151E7E9318>I<38FF0FC0EB3FE0EB7FF0EA07F0EBE060EBC0005BA290C7FC
+A9EAFFFC7F5B14147E9318>I<EA07F7EA3FFF5AEA780FEAE007A3007CC7FCEA7FE0EA1F
+FCEA03FEEA001F38600780EAE003A212F038F80F00B5FC13FCEAE7F011147D9318>I<48
+7E1203A4387FFFC0B5FCA238038000A9144014E0A33801C1C013FF6C1380EB3E0013197F
+9818>I<387E07E0EAFE0FEA7E07EA0E00AC1301EA0F033807FFFC6C13FE3801FCFC1714
+809318>I<387F8FF000FF13F8007F13F0381C01C0380E0380A338070700A3138FEA038E
+A3EA01DCA3EA00F8A2137015147F9318>I<38FF07F8138F1307383800E0A4381C01C013
+7113F9A213D9EA1DDD000D1380A3138DEA0F8FA23807070015147F9318>I<387F8FF013
+9F138F380F0700EA078EEA039EEA01DC13F81200137013F07FEA01DCEA039E138EEA0707
+000E1380387F8FF000FF13F8007F13F015147F9318>I<387F8FF000FF13F8007F13F038
+0E01C0EB0380A21207EB0700A2EA0387A2138EEA01CEA213CC120013DC1378A31370A313
+F05B1279EA7BC0EA7F806CC7FC121E151E7F9318>I<383FFFF05AA2387001E0EB03C0EB
+078038000F00131E5B13F8485AEA03C0485A380F0070121E5A5AB512F0A314147F9318>
+I<EB07E0131F137FEB780013E0AB1201EA7FC0485AA26C7EEA01E01200AB1378EB7FE013
+1F130713247E9F18>I<127CB4FC13C01203C67EAB7FEB7FC0EB3FE0A2EB7FC0EBF0005B
+ABEA03C012FF90C7FC127C13247E9F18>125 D<EA060CEA1F1EEA3FBEEAFBF8EAF1F0EA
+60C00F067C9B18>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fo cmr10 10.95 80
+/Fo 80 125 df<90381F83E09038F06E303901C07878380380F8903800F03048EB7000A7
+B612803907007000B2383FE3FF1D20809F1B>11 D<133FEBE0C0EA01C0380381E0EA0701
+A290C7FCA6B512E0EA0700B2383FC3FC1620809F19>I<EB3FE013E0EA01C1EA0381EA07
+00A8B5FCEA0700B2383FE7FC1620809F19>I<EA7038EAF87CEAFC7EA2EA743AEA0402A3
+EA0804A2EA1008A2EA2010EA40200F0E7F9F17>34 D<127012F812FCA212741204A31208
+A21210A212201240060E7C9F0D>39 D<13401380EA01005A12061204120C5AA212381230
+A212701260A412E0AC1260A412701230A212381218A27E120412067E7EEA008013400A2E
+7BA112>I<7E12407E12307E1208120C7EA212077EA213801201A413C0AC1380A4120313
+00A25A1206A25A120812185A12205A5A0A2E7EA112>I<127012F012F8A212781208A312
+10A31220A21240050E7C840D>44 D<EAFFF0A20C02808A0F>I<127012F8A3127005057C
+840D>I<144014C0EB0180A3EB0300A31306A25BA35BA35BA25BA35BA3485AA348C7FCA2
+1206A35AA35AA25AA35AA35AA2122D7EA117>I<EA03F0EA0E1C487EEA1806EA38073870
+0380A400F013C0AD00701380A3EA780700381300EA1806EA1C0E6C5AEA03F0121F7E9D17
+>I<13801203120F12F31203B3A6EA07C0EA7FFE0F1E7C9D17>I<EA03F0EA0C1CEA100E48
+7E00401380128000F013C0EAF803A3EA200712001480A2EB0F00130E5B5B5B13605B485A
+48C7FC000613405A5A00101380EA3FFF5AB5FC121E7E9D17>I<EA03F0EA0C1CEA100EEA
+200F007813801307A2EA380F12001400A2131E131C1370EA07F0EA003C130E130FEB0780
+A214C0122012F8A300F013801240EB0F00EA200EEA183CEA07F0121F7E9D17>I<1306A2
+130EA2131E132EA2134E138EA2EA010E1202A212041208A212101220A2124012C0B512F0
+38000E00A7EBFFE0141E7F9D17>I<EA1803EA1FFE5B5B13E00010C7FCA6EA11F0EA161C
+EA180EEA10071480EA0003A214C0A3127012F0A200E013801240EB0700EA20066C5AEA08
+38EA07E0121F7E9D17>I<137CEA0182EA0701380E0380EA0C0712183838030090C7FC12
+781270A2EAF1F0EAF21CEAF406EAF807EB0380A200F013C0A51270A214801238EB070012
+18EA0C0E6C5AEA01F0121F7E9D17>I<1240387FFFE014C0A23840008038800100A21302
+485AA25B5BA25BA21360A213E05B1201A41203A76C5A131F7E9D17>I<EA03F0EA0C0CEA
+1006EA3003382001801260A3127038780300123EEA3F06EA1FC8EA0FF0EA03F8487EEA0C
+7EEA103F38300F80EA6007EB01C012C01300A31480EA600100201300EA1002EA0C0CEA03
+F0121F7E9D17>I<EA03F0EA0E18487E487E13071270EB038012F0A214C0A5EA7007A212
+38EA180BEA0E13EA03E338000380A3EB07001230EA7806130EEA700CEA2018EA1070EA0F
+C0121F7E9D17>I<127012F8A312701200AA127012F8A3127005147C930D>I<127012F8A3
+12701200AA127012F012F8A212781208A31210A31220A21240051D7C930D>I<5B497EA3
+497EA3EB09E0A3EB10F0A3EB2078A3497EA2EBC03EEB801EA248B5FCEB000FA20002EB07
+80A348EB03C0A2120C001E14E039FF801FFE1F207F9F22>65 D<B512E0380F0078141EA2
+801580A515005C141E147CEBFFF0EB007C141FEC0F80EC07C0140315E0A515C014071580
+EC0F00143EB512F01B1F7E9E20>I<90380FE0109038381C309038E002703803C0013907
+8000F048C71270121E15305A1510127C127800F81400A91278007C1410123CA26C1420A2
+7E6C6C13406C6C13803900E00300EB380CEB0FF01C217E9F21>I<B512F83807801EEC07
+80EC03C0EC01E0EC00F015701578A2153CA3153EA8153CA2157C1578A215F0EC01E0EC03
+C0EC0780EC1E00B512F81F1F7F9E23>I<B61280380F000F14031401140015C01540A314
+401500A214C0130113FF130113001440A3EC0020A31540A315C01401EC0380140FB6FC1B
+1F7E9E1F>I<B61280380780071401A2140015C01540A4EC2000A3146014E013FF138014
+601420A391C7FCA87FEAFFFE1A1F7F9E1E>I<90380FE02090387818609038E004E03803
+800238070001481300001E1460A25A1520127C127800F81400A7EC7FFCEC03E000781301
+127C123CA27EA27E7E380380023900E00460903878182090380FE0001E217D9F24>I<39
+FFF07FF8390F000780AD90B5FCEB0007AF39FFF07FF81D1F7E9E22>I<EAFFF0EA0F00B3
+ABEAFFF00C1F7E9E10>I<3807FFC038003E00131EB3A3122012F8A3EAF01CEA403CEA60
+38EA1070EA0FC012207F9E17>I<39FFF007FC390F0003E0EC0180150014025C5C5C5C5C
+5C49C7FC5B497E130FEB13C0EB21E01341EB80F0EB0078A28080A280EC0780A2EC03C015
+E015F039FFF01FFE1F1F7E9E23>I<EAFFF8EA0F8090C7FCB21402A414061404A2140C14
+1C147CB512FC171F7E9E1C>I<B46CEB07FE000715C0A2D805C0130BA2D804E01313A301
+701323A26D1343A36D1383A290380E0103A3EB0702A3EB0384A2EB01C8A3EB00F0A21460
+121FD8FFE0EB7FFE271F7F9E2A>I<B4EB0FF8390F8003E0EC0080EA0BC0EA09E0A2EA08
+F01378A27F7FA27FEB0780A2EB03C0EB01E0A2EB00F01478A2143C141EA2140F1407A214
+031401123E38FF80001D1F7E9E22>I<EB1FE0EB70383801C00E48487E39070003804814
+C0001EEB01E048EB00F0A2007C14F8A20078147800F8147CA900781478007C14F8A2003C
+14F0003E1301001E14E06CEB03C06C148039038007003801E01E38007038EB1FE01E217E
+9F23>I<B512E0380F007C141E80EC0780A215C0A41580A2EC0F00141E147CEBFFE090C8
+FCAEEAFFF01A1F7E9E1F>I<EB1FE0EB70383801C00E48487E39070003804814C0001EEB
+01E0003E14F0003C1300007C14F8A20078147800F8147CA900781478007C14F8A2003C14
+F0383E0781391E0841E0390F1023C00007148039039017003801D01E3900783804EB1FF8
+EB001CEC0C0CEC0E1CEC0FF8A2140715F0EC01E01E297E9F23>I<B512E0380F80780007
+131E80EC0780A215C0A41580A2EC0F00141E1478EBFFE0EB80601438143C141C141EA314
+1FA315011581140F390FC0078239FFFC03C4C812F820207F9E22>I<3803F040380C0CC0
+EA1803EA3001EA6000A212E01440A36C13007E127CEA7F80EA3FF86CB4FC00071380C613
+C0EB1FE013031301EB00F014707EA46C136014E06C13C038F8018038C60300EA81FC1421
+7E9F19>I<007FB512E038780F010060EB006000401420A200C0143000801410A4000014
+00B3497E3803FFFC1C1F7E9E21>I<39FFF00FF8390F0003E0EC0080B3A46CEB01001380
+120314026C6C5A6C6C5AEB3830EB0FC01D207E9E22>I<39FFF003FE391F8000F86CC712
+6015206C6C1340A36C6C1380A2EBE00100011400A23800F002A213F8EB7804A26D5AA36D
+5AA2131F6D5AA2EB07C0A36D5AA36DC7FC1F207F9E22>I<3BFFF07FF81FF03B1F000FC0
+07C06C903907800180170015C001805C00071502EC09E013C000035DEC19F01410D801E0
+5CA2EC2078D800F05CA2EC403C01785CA2EC801E017C1460013C144090383D000F133F6D
+5CA2011E1307010E91C7FCA2010C7F010413022C207F9E2F>I<397FF81FF8390FE007C0
+3907C0030000031302EBE0063801F00400005BEBF818EB78106D5AEB3E60EB1E406D5AA2
+13076D7E497E1305EB08F0EB18F8EB1078EB207CEB603EEB401EEB801F3901000F801407
+000214C000061303001FEB07E039FFC01FFE1F1F7F9E22>I<39FFF001FF391F80007800
+0F146012076D1340000314807F3901F001001200EBF802EB7C06EB3C04EB3E08131EEB1F
+10EB0FB0EB07A014E06D5AACEB3FFC201F7F9E22>I<387FFFFE387E003C127800701378
+006013F814F0384001E0130314C0EB07801200EB0F00131EA25B137C13785B1201EBE002
+EA03C0A2EA0780000F13061300001E1304003E130C123C48133C14FCB5FC171F7E9E1C>
+I<12FFA212C0B3B3A512FFA2082D7CA10D>I<EA0804EA1008EA2010A2EA4020A2EA8040
+A3EAB85CEAFC7EA2EA7C3EEA381C0F0E7A9F17>I<12FFA21203B3B3A512FFA2082D80A1
+0D>I<120812101220A21240A21280A312B812FCA2127C1238060E7D9F0D>96
+D<EA1FE0EA3030EA7818131CEA300E1200A313FEEA0F8EEA1E0E1238127800F01310A313
+1E127838386720380F83C014147E9317>I<121C12FC121CAA137CEA1D87381E0180EB00
+C0001C13E01470A21478A6147014F014E0001E13C0381A018038198700EA107C15207E9F
+19>I<EA01FCEA0706EA1C0F123813060078C7FC127012F0A61270127800381380A2381C
+0100EA0706EA01F811147F9314>I<EB01C0130F1301AAEA01F1EA070DEA0C03EA180112
+381278127012F0A61270A21238EA1803120CEA070D3801F1F815207F9F19>I<EA03F0EA
+0E1C487E487EA238700380A212F0B5FC00F0C7FCA41270A26C1380A2381C0100EA0706EA
+01F811147F9314>I<137CEA01C6EA030F1207EA0E061300A7EAFFF0EA0E00B2EA7FE010
+20809F0E>I<14E03803E330EA0E3CEA1C1C38380E00EA780FA5EA380E6C5AEA1E38EA33
+E00020C7FCA21230A2EA3FFE381FFF8014C0383001E038600070481330A4006013606C13
+C0381C03803803FC00141F7F9417>I<121C12FC121CAA137C1386EA1D03001E1380A212
+1CAE38FF8FF014207E9F19>I<1238127CA31238C7FCA6121C12FC121CB1EAFF80091F7F
+9E0C>I<13E0EA01F0A3EA00E01300A61370EA07F012001370B3A31260EAF06013C0EA61
+80EA3F000C28829E0E>I<121C12FC121CAAEB1FE0EB0780EB060013045B5B5B136013E0
+EA1DF0EA1E70EA1C38133C131C7F130F7F148014C038FF9FF014207E9F18>I<121C12FC
+121CB3ABEAFF8009207F9F0C>I<391C3E03E039FCC30C30391D019018001EEBE01CA200
+1C13C0AE3AFF8FF8FF8021147E9326>I<EA1C7CEAFC86EA1D03001E1380A2121CAE38FF
+8FF014147E9319>I<EA01F8EA070E381C0380383801C0A2387000E0A200F013F0A60070
+13E0A2383801C0A2381C038038070E00EA01F814147F9317>I<EA1C7CEAFD87381E0180
+14C0381C00E014F014701478A6147014F014E0381E01C0EB0380381D8700EA1C7C90C7FC
+A8B47E151D7E9319>I<3801F04038070CC0EA0E02EA1C03EA38011278127012F0A61270
+12781238EA1C03EA0C05EA0709EA01F1EA0001A8EB0FF8151D7F9318>I<EA1CF0EAFD18
+EA1E3CA21318EA1C00AEEAFFC00E147E9312>I<EA0FC8EA3038EA6018EAC008A3EAE000
+127CEA3FE0EA1FF0EA07F8EA003CEA800E130612C0A21304EAE00CEAD818EA87E00F147F
+9312>I<1202A31206A2120EA2123EEAFFF8EA0E00AB1304A5EA07081203EA01F00E1C7F
+9B12>I<381C0380EAFC1FEA1C03AE1307120CEA061B3803E3F014147E9319>I<38FF83F8
+383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00E8A21370A3
+132015147F9318>I<39FF9FE1FC393C078070391C030060EC8020000E1440A214C0D807
+04138014E0A239038861001471A23801D032143A143E3800E01CA2EB6018EB40081E147F
+9321>I<38FF87F8381E03C0380E0180EB0300EA0702EA0384EA01C813D8EA00F0137013
+7813F8139CEA010E1202EA060738040380000C13C0003C13E038FE07FC16147F9318>I<
+38FF83F8383E00E0001C13C06C1380A338070100A21383EA0382A2EA01C4A213E4EA00E8
+A21370A31320A25BA3EAF080A200F1C7FC1262123C151D7F9318>I<EA7FFFEA700E1260
+EA401C133813781370EA00E0120113C0EA038012071301120E121EEA1C03EA3802EA7006
+130EEAFFFE10147F9314>I<B812F82D01808C2E>124 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fp cmbx12 20.736 19
+/Fp 19 122 df<DB1FFC14C00203B5EAC001021FECF003027FECFC07903B01FFFC00FE0F
+010701C0EB1F9F4948C7EA07FFD93FF880494814004948157F485B4A153F4890C9121F48
+5A000F170F5B001F1707A2485A1803A2127FA24993C8FCA212FFAA041FB61280127FA27F
+DC0001EBC000123FA36C7EA26C7EA26C7E7E6C7F806C7F6D6C5CEB3FFCD90FFF5C6D01C0
+EB1FBF010101FCEBFF1F6D6CB5EAFE0F021FECF8030203ECE0009126001FFEC9FC413D7B
+BB4C>71 D<B612F8A439007FF000B3B3AFB612F8A41D3B7DBA24>73
+D<B612FEA426007FF0C9FCB3ADEF03C0A517071880A3170FA3171FA2173F177F17FF5E04
+071300163FB9FCA4323B7DBA3A>76 D<B500F00207B512E0808080D8007F92390007E000
+6E6F5A81017B7F81137901787F6E7E6E7E81141F6E7E6E7F6E7F82806E7F6F7E6F7E826F
+7E816F13806F13C017E06F13F081EE7FF8EE3FFC17FEEE1FFF827013837013C318E37013
+F382EF7FFBEF3FFFA283838383A28383187F183FA201FC161FB500FC150F18071803A243
+3B7CBA4C>78 D<B712F8EEFFC017F817FE3B007FF0001FFF040313C004007F717E717EA2
+84171FA284A660A2173F604D5A604C485A4C5BDC1FFEC8FC91B612F817C0A29139F0007F
+F0EE1FF8707E707E707E8482A284A584A5F101E0A27013F0A2F103C0EF7FF8B600F89039
+3FFC078094381FFE0F0507B51200050113FCCBEA1FF0433C7CBA48>82
+D<B600F80107B512E0A426007FF0C83807E000725AB3B3A3013F4C5AA280011F4CC7FCA2
+6D6C151E0107163E6E5D6D6C5D6D6D13019026007FE0EB0FE0DA3FFCEB7FC0020FB65A02
+034AC8FCDA007F13F003071380433C7DBA4A>85 D<EB3FFE48B512E0000714F8390FE007
+FC9038F001FE486C6C7E6F7E82153F6C48806C5A6C5AC8FCA491B5FC131F90387FF83F38
+03FF803807FC00EA0FF0485A123F485AA2485AA4157F6C7E15DF3A3FE0039FF03B1FF80F
+0FFFE03807FFFE0001497E39003FE0002B267DA52F>97 D<13FE12FFA412071203B04AB4
+FC021F13F0027F13FC9138FC03FE9039FFF000FF02C0EB3F8091C7EA1FC04915E0EE0FF0
+17F8A2EE07FCA317FEA917FCA3160F17F817F0161F6D15E06EEB3FC06EEB7F80D9F9E0EB
+FF009039F0FC07FE91387FFFF8D9E01F13E09026C003FEC7FC2F3C7DBB36>I<903801FF
+F0010F13FE013FEBFF809039FF801FC03901FE003F4848EB7FE0485A485A121F4848EB3F
+C0ED1F80007FEC0F004990C7FCA212FFAA127F7FA2123F6D14F0121F6C6CEB01E012076C
+6CEB03C06CB4EB0F806C9038C03F0090383FFFFE010F13F8010113C024267DA52B>I<EE
+3F80ED3FFFA4150181B0ECFF80010F13F0013F13FC9038FFC03F3901FE000F4848130348
+487F48487F121F485AA2127F5BA312FFA9127FA36C7EA2121F6C6C5B6C6C5B00035CD801
+FE011F13C02700FF807E13FE90387FFFF8010F13E0010113002F3C7DBB36>I<49B47E01
+0F13F0017F13FC9038FF81FE3A03FE007F80D807F8133F4848EB1FC0ED0FE0485A003F15
+F01507485A16F8A212FFA290B6FCA301C0C8FCA4127FA36C7E1678121F7F000F15F06C6C
+13016C6CEB03E06C6CEB0FC03A00FFC07F8090393FFFFE00010F13F8010013C025267DA5
+2C>I<EC1FF0ECFFFC010313FF90390FF83F8090381FE07F90393FC0FFC0495A13FFA248
+9038007F80ED3F00151E92C7FCAAB67EA4000190C8FCB3AC007F13FEA4223C7DBB1E>I<
+EA01E0EA07F8487EA2487EA46C5AA26C5AEA01E0C8FCAB13FE127FA412071203B3AAB512
+F0A4143D7DBC1A>105 D<13FE12FFA412071203B3B3AEB512F8A4153C7DBB1A>108
+D<D801FCEBFF8000FF010313F0020F7F91381E03FC91383801FE000701607F0003497E01
+FD15805C01FFC7FCA35BB3A4B5D8F83F13FEA42F267CA536>110
+D<3901FC03F000FFEB0FFC4AB4FC91383C3F80EC707F00079038E0FFC000035BEBFD80A2
+01FFEB7F809138003F00151E92C7FC5BB3A3B512FCA422267DA528>114
+D<90383FF0383903FFFE7848EBFFF8381FC00F383F0003003E13005A157812FCA27E6C14
+0013C013FC387FFFF06C13FEECFF806C14C06C14E0000314F0C614F8011F13FCEB007FEC
+07FE0070130100F01300157E7EA27E157C6C14FC6C14F890388001F09038F00FE000F9B5
+12C0D8F07F130038C01FF81F267DA526>I<130FA55BA45BA25BA25B5A5A5A001FEBFFF0
+B6FCA3000190C7FCB3153CA86C14781480017F13F090383FC1E090381FFFC06D13809038
+01FE001E377EB626>I<B500F0EBFFFCA4D803FEC7EA1F806D15006C151E806C5DA26E13
+7C017F14786E13F8013F5CECF001011F5CECF803010F5CA2ECFC0701075CECFE0F010391
+C7FC6E5A6D131E15BE6D13BC15FC6E5AA36E5AA26E5AA26E5AA26E5AA2140F92C8FC5C14
+1E0008133E007F133C147C38FF807814F8EB81F0EB83E06C485A387C1F80D83FFFC9FCEA
+1FFCEA07F02E377EA533>121 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+%%PaperSize: A4
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 75 659 a Fp(GNU)33 b(Readline)h(Library)e(User)h(In)m(terface)p
+75 709 1800 17 v 936 757 a Fo(Edition)17 b(5.0,)c(for)i
+Fn(Readline)f(Library)g Fo(V)l(ersion)i(5.0.)1559 811
+y(Septem)o(b)q(er)g(2003)75 2467 y Fm(Chet)22 b(Ramey)-6
+b(,)23 b(Case)e(W)-6 b(estern)23 b(Reserv)n(e)f(Univ)n(ersit)n(y)75
+2534 y(Brian)h(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6
+b(oundation)p 75 2570 1800 9 v eop
+%%Page: 2 2
+2 1 bop 75 1512 a Fo(This)15 b(man)o(ual)g(describ)q(es)i(the)d(end)i
+(user)f(in)o(terface)g(of)f(the)h(GNU)f(Readline)i(Library)f(\(v)o
+(ersion)g(5.0,)f(19)75 1567 y(Septem)o(b)q(er)19 b(2003\),)e(a)h
+(library)h(whic)o(h)g(aids)g(in)g(the)f(consistency)h(of)f(user)g(in)o
+(terface)h(across)e(discrete)75 1621 y(programs)d(whic)o(h)i(pro)o
+(vide)g(a)f(command)g(line)i(in)o(terface.)75 1689 y(Cop)o(yrigh)o(t)
+301 1688 y(c)289 1689 y Fl(\015)d Fo(1988-2003)f(F)l(ree)i(Soft)o(w)o
+(are)f(F)l(oundation,)h(Inc.)75 1756 y(P)o(ermission)i(is)f(gran)o(ted)
+g(to)f(mak)o(e)h(and)g(distribute)i(v)o(erbatim)d(copies)i(of)f(this)h
+(man)o(ual)f(pro)o(vided)h(the)75 1811 y(cop)o(yrigh)o(t)e(notice)h
+(and)f(this)h(p)q(ermission)g(notice)g(are)f(preserv)o(ed)h(on)f(all)h
+(copies.)195 1878 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)l(,)
+h(distribute)h(and/or)e(mo)q(dify)h(this)g(do)q(cumen)o(t)g(under)195
+1933 y(the)h(terms)f(of)h(the)g(GNU)g(F)l(ree)g(Do)q(cumen)o(tation)g
+(License,)i(V)l(ersion)f(1.1)e(or)g(an)o(y)h(later)195
+1988 y(v)o(ersion)14 b(published)i(b)o(y)e(the)g(F)l(ree)f(Soft)o(w)o
+(are)g(F)l(oundation;)h(with)g(no)f(In)o(v)m(arian)o(t)i(Sections,)195
+2042 y(with)h(the)f(F)l(ron)o(t-Co)o(v)o(er)e(texts)i(b)q(eing)i(\\A)e
+(GNU)g(Man)o(ual,")g(and)g(with)h(the)f(Bac)o(k-Co)o(v)o(er)195
+2097 y(T)l(exts)h(as)g(in)h(\(a\))e(b)q(elo)o(w.)24 b(A)16
+b(cop)o(y)g(of)g(the)g(license)i(is)f(included)i(in)e(the)f(section)h
+(en)o(titled)195 2152 y(\\GNU)e(F)l(ree)g(Do)q(cumen)o(tation)g
+(License.")195 2219 y(\(a\))j(The)h(FSF's)f(Bac)o(k-Co)o(v)o(er)g(T)l
+(ext)h(is:)28 b(\\Y)l(ou)19 b(ha)o(v)o(e)g(freedom)g(to)f(cop)o(y)h
+(and)g(mo)q(dify)195 2274 y(this)e(GNU)f(Man)o(ual,)g(lik)o(e)h(GNU)f
+(soft)o(w)o(are.)22 b(Copies)17 b(published)h(b)o(y)f(the)f(F)l(ree)g
+(Soft)o(w)o(are)195 2329 y(F)l(oundation)g(raise)f(funds)h(for)e(GNU)h
+(dev)o(elopmen)o(t.")75 2451 y(Published)i(b)o(y)f(the)f(F)l(ree)g
+(Soft)o(w)o(are)f(F)l(oundation)75 2506 y(59)h(T)l(emple)h(Place,)f
+(Suite)i(330,)75 2560 y(Boston,)d(MA)h(02111-1307)75
+2615 y(USA)p eop
+%%Page: -1 3
+-1 2 bop 1862 -58 a Fo(i)75 149 y Fk(T)-7 b(able)27 b(of)f(Con)n(ten)n
+(ts)75 320 y Fm(1)67 b(Command)22 b(Line)i(Editing)d
+Fj(.)10 b(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h
+(.)f(.)g(.)g(.)42 b Fm(1)224 389 y Fo(1.1)j(In)o(tro)q(duction)16
+b(to)f(Line)h(Editing)e Fi(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)27 b Fo(1)224 444 y(1.2)45 b(Readline)16 b(In)o(teraction)8
+b Fi(.)g(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)23 b Fo(1)374 499 y(1.2.1)44 b(Readline)16
+b(Bare)f(Essen)o(tials)f Fi(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Fo(1)374 553 y(1.2.2)44 b(Readline)16 b(Mo)o(v)o(emen)o(t)e(Commands)
+7 b Fi(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)21 b Fo(2)374 608 y(1.2.3)44 b(Readline)16 b(Killing)i(Commands)
+11 b Fi(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)25 b Fo(2)374 663 y(1.2.4)44 b(Readline)16
+b(Argumen)o(ts)c Fi(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27
+b Fo(3)374 718 y(1.2.5)44 b(Searc)o(hing)16 b(for)e(Commands)h(in)h
+(the)f(History)e Fi(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27
+b Fo(3)224 773 y(1.3)45 b(Readline)16 b(Init)h(File)e
+Fi(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)f(.)29 b Fo(4)374 827 y(1.3.1)44 b(Readline)16
+b(Init)g(File)h(Syn)o(tax)7 b Fi(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21
+b Fo(4)374 882 y(1.3.2)44 b(Conditional)16 b(Init)g(Constructs)5
+b Fi(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)19 b Fo(9)374 937 y(1.3.3)44 b(Sample)16
+b(Init)g(File)11 b Fi(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h
+(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)26 b Fo(10)224 992 y(1.4)45 b(Bindable)17 b(Readline)g(Commands)6
+b Fi(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 b Fo(13)374
+1046 y(1.4.1)44 b(Commands)14 b(F)l(or)h(Mo)o(ving)e
+Fi(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fo(13)374 1101 y(1.4.2)44
+b(Commands)14 b(F)l(or)h(Manipulating)i(The)e(History)9
+b Fi(.)e(.)h(.)f(.)h(.)f(.)h(.)24 b Fo(13)374 1156 y(1.4.3)44
+b(Commands)14 b(F)l(or)h(Changing)h(T)l(ext)e Fi(.)8
+b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30
+b Fo(14)374 1211 y(1.4.4)44 b(Killing)18 b(And)e(Y)l(anking)9
+b Fi(.)e(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24 b Fo(16)374
+1266 y(1.4.5)44 b(Sp)q(ecifying)17 b(Numeric)f(Argumen)o(ts)c
+Fi(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)27
+b Fo(17)374 1320 y(1.4.6)44 b(Letting)15 b(Readline)i(T)o(yp)q(e)e(F)l
+(or)g(Y)l(ou)10 b Fi(.)d(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)25 b Fo(17)374 1375 y(1.4.7)44 b(Keyb)q(oard)15
+b(Macros)6 b Fi(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21
+b Fo(17)374 1430 y(1.4.8)44 b(Some)15 b(Miscellaneous)i(Commands)7
+b Fi(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+22 b Fo(18)224 1485 y(1.5)45 b(Readline)16 b(vi)g(Mo)q(de)e
+Fi(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)
+f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)f(.)h(.)28 b Fo(19)75 1606 y Fm(App)r(endix)c(A)50
+b(Cop)n(ying)23 b(This)g(Man)n(ual)15 b Fj(.)c(.)f(.)g(.)g(.)h(.)f(.)g
+(.)g(.)g(.)h(.)37 b Fm(21)224 1675 y Fo(A.1)45 b(GNU)15
+b(F)l(ree)h(Do)q(cumen)o(tation)f(License)g Fi(.)7 b(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)28
+b Fo(21)374 1729 y(A.1.1)44 b(ADDENDUM:)14 b(Ho)o(w)g(to)h(use)h(this)f
+(License)i(for)e(y)o(our)465 1784 y(do)q(cumen)o(ts)f
+Fi(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)
+h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g
+(.)f(.)h(.)f(.)29 b Fo(27)p eop
+%%Page: -2 4
+-2 3 bop 75 -58 a Fo(ii)1321 b(GNU)15 b(Readline)h(Library)p
+eop
+%%Page: 1 5
+1 4 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(1)75 149 y Fk(1)41 b(Command)28 b(Line)e(Editing)137
+255 y Fo(This)16 b(c)o(hapter)f(describ)q(es)i(the)e(basic)h(features)f
+(of)g(the)g Fh(gnu)g Fo(command)g(line)i(editing)f(in)o(terface.)75
+378 y Fm(1.1)33 b(In)n(tro)r(duction)24 b(to)e(Line)i(Editing)137
+497 y Fo(The)16 b(follo)o(wing)g(paragraphs)e(describ)q(e)j(the)e
+(notation)g(used)h(to)e(represen)o(t)i(k)o(eystrok)o(es.)137
+562 y(The)h(text)f Fg(C-k)h Fo(is)g(read)g(as)f(`Con)o(trol-K')g(and)h
+(describ)q(es)h(the)f(c)o(haracter)f(pro)q(duced)h(when)h(the)1831
+560 y Ff(h)p 1844 534 19 2 v 1844 562 a Fe(k)p 1844 570
+V 1860 560 a Ff(i)75 617 y Fo(k)o(ey)d(is)h(pressed)g(while)g(the)f
+(Con)o(trol)g(k)o(ey)g(is)h(depressed.)137 682 y(The)g(text)g
+Fg(M-k)f Fo(is)i(read)f(as)f(`Meta-K')g(and)h(describ)q(es)i(the)e(c)o
+(haracter)f(pro)q(duced)i(when)g(the)f(Meta)75 737 y(k)o(ey)e(\(if)g(y)
+o(ou)g(ha)o(v)o(e)g(one\))g(is)h(depressed,)g(and)f(the)930
+735 y Ff(h)p 942 709 V 942 737 a Fe(k)p 942 745 V 958
+735 a Ff(i)987 737 y Fo(k)o(ey)g(is)h(pressed.)20 b(The)15
+b(Meta)e(k)o(ey)h(is)h(lab)q(eled)1779 735 y Ff(h)p 1791
+709 72 2 v 1791 737 a Fe(AL)m(T)p 1791 745 V 1860 735
+a Ff(i)75 792 y Fo(on)e(man)o(y)g(k)o(eyb)q(oards.)19
+b(On)13 b(k)o(eyb)q(oards)g(with)h(t)o(w)o(o)e(k)o(eys)g(lab)q(eled)
+1213 790 y Ff(h)p 1225 764 V 1225 792 a Fe(AL)m(T)p 1225
+800 V 1294 790 a Ff(i)1322 792 y Fo(\(usually)i(to)e(either)i(side)g
+(of)f(the)75 847 y(space)j(bar\),)f(the)388 845 y Ff(h)p
+400 819 V 400 847 a Fe(AL)m(T)p 400 854 V 469 845 a Ff(i)499
+847 y Fo(on)h(the)g(left)g(side)g(is)g(generally)h(set)f(to)f(w)o(ork)g
+(as)g(a)g(Meta)g(k)o(ey)l(.)22 b(The)1697 845 y Ff(h)p
+1709 819 V 1709 847 a Fe(AL)m(T)p 1709 854 V 1778 845
+a Ff(i)1808 847 y Fo(k)o(ey)75 901 y(on)17 b(the)f(righ)o(t)h(ma)o(y)f
+(also)h(b)q(e)g(con\014gured)g(to)f(w)o(ork)g(as)g(a)h(Meta)f(k)o(ey)g
+(or)g(ma)o(y)g(b)q(e)i(con\014gured)f(as)f(some)75 956
+y(other)f(mo)q(di\014er,)h(suc)o(h)f(as)g(a)g(Comp)q(ose)g(k)o(ey)g
+(for)f(t)o(yping)i(accen)o(ted)f(c)o(haracters.)137 1021
+y(If)c(y)o(ou)g(do)g(not)f(ha)o(v)o(e)h(a)f(Meta)h(or)694
+1019 y Ff(h)p 706 993 V 706 1021 a Fe(AL)m(T)p 706 1029
+V 775 1019 a Ff(i)801 1021 y Fo(k)o(ey)l(,)g(or)g(another)f(k)o(ey)h(w)
+o(orking)f(as)h(a)f(Meta)h(k)o(ey)l(,)g(the)g(iden)o(tical)75
+1076 y(k)o(eystrok)o(e)f(can)i(b)q(e)g(generated)f(b)o(y)g(t)o(yping)
+809 1074 y Ff(h)p 822 1048 70 2 v 822 1076 a Fe(ESC)p
+822 1084 V 888 1074 a Ff(i)915 1076 y Fi(\014rst)p Fo(,)g(and)g(then)h
+(t)o(yping)1339 1074 y Ff(h)p 1351 1048 19 2 v 1351 1076
+a Fe(k)p 1351 1084 V 1368 1074 a Ff(i)1383 1076 y Fo(.)18
+b(Either)12 b(pro)q(cess)f(is)h(kno)o(wn)75 1131 y(as)j
+Fd(metafying)k Fo(the)425 1129 y Ff(h)p 437 1103 V 437
+1131 a Fe(k)p 437 1139 V 454 1129 a Ff(i)484 1131 y Fo(k)o(ey)l(.)137
+1196 y(The)i(text)e Fg(M-C-k)h Fo(is)h(read)f(as)f(`Meta-Con)o(trol-k')
+g(and)h(describ)q(es)i(the)e(c)o(haracter)g(pro)q(duced)h(b)o(y)75
+1251 y Fd(metafying)e Fg(C-k)p Fo(.)137 1316 y(In)g(addition,)h(sev)o
+(eral)f(k)o(eys)f(ha)o(v)o(e)g(their)h(o)o(wn)f(names.)30
+b(Sp)q(eci\014cally)l(,)1384 1314 y Ff(h)p 1396 1288
+73 2 v 1396 1316 a Fe(DEL)p 1396 1323 V 1467 1314 a Ff(i)1482
+1316 y Fo(,)1514 1314 y Ff(h)p 1526 1288 70 2 v 1526
+1316 a Fe(ESC)p 1526 1323 V 1593 1314 a Ff(i)1608 1316
+y Fo(,)1640 1314 y Ff(h)p 1652 1288 72 2 v 1652 1316
+a Fe(LFD)p 1652 1323 V 1722 1314 a Ff(i)1737 1316 y Fo(,)1768
+1314 y Ff(h)p 1780 1288 70 2 v 1780 1316 a Fe(SPC)p 1780
+1323 V 1847 1314 a Ff(i)1862 1316 y Fo(,)75 1369 y Ff(h)p
+87 1343 76 2 v 87 1371 a Fe(RET)p 87 1378 V 160 1369
+a Ff(i)175 1371 y Fo(,)23 b(and)306 1369 y Ff(h)p 318
+1343 74 2 v 318 1371 a Fe(T)m(AB)p 318 1378 V 390 1369
+a Ff(i)427 1371 y Fo(all)f(stand)g(for)f(themselv)o(es)h(when)h(seen)f
+(in)g(this)g(text,)h(or)e(in)i(an)e(init)i(\014le)g(\(see)75
+1425 y(Section)d(1.3)f([Readline)h(Init)g(File],)h(page)e(4\).)32
+b(If)19 b(y)o(our)g(k)o(eyb)q(oard)h(lac)o(ks)f(a)1444
+1423 y Ff(h)p 1456 1397 72 2 v 1456 1425 a Fe(LFD)p 1456
+1433 V 1526 1423 a Ff(i)1560 1425 y Fo(k)o(ey)l(,)h(t)o(yping)1802
+1423 y Ff(h)p 1814 1397 49 2 v 1814 1425 a Fe(C-j)p 1814
+1433 V 1860 1423 a Ff(i)75 1480 y Fo(will)c(pro)q(duce)g(the)f(desired)
+h(c)o(haracter.)j(The)874 1478 y Ff(h)p 886 1452 76 2
+v 886 1480 a Fe(RET)p 886 1488 V 959 1478 a Ff(i)989
+1480 y Fo(k)o(ey)c(ma)o(y)f(b)q(e)h(lab)q(eled)1385 1478
+y Ff(h)p 1397 1452 109 2 v 1397 1480 a Fe(Return)p 1397
+1488 V 1503 1478 a Ff(i)1533 1480 y Fo(or)1588 1478 y
+Ff(h)p 1600 1452 86 2 v 1600 1480 a Fe(En)o(ter)p 1600
+1488 V 1684 1478 a Ff(i)1714 1480 y Fo(on)f(some)75 1535
+y(k)o(eyb)q(oards.)75 1657 y Fm(1.2)33 b(Readline)23
+b(In)n(teraction)137 1777 y Fo(Often)13 b(during)h(an)e(in)o(teractiv)o
+(e)h(session)g(y)o(ou)g(t)o(yp)q(e)f(in)i(a)e(long)h(line)h(of)e(text,)
+h(only)g(to)f(notice)h(that)f(the)75 1832 y(\014rst)k(w)o(ord)f(on)h
+(the)h(line)h(is)e(missp)q(elled.)26 b(The)16 b(Readline)i(library)f
+(giv)o(es)f(y)o(ou)g(a)g(set)g(of)g(commands)g(for)75
+1886 y(manipulating)g(the)f(text)g(as)f(y)o(ou)h(t)o(yp)q(e)g(it)g(in,)
+g(allo)o(wing)h(y)o(ou)f(to)f(just)h(\014x)g(y)o(our)f(t)o(yp)q(o,)g
+(and)h(not)g(forcing)75 1941 y(y)o(ou)f(to)f(ret)o(yp)q(e)h(the)g(ma)s
+(jorit)o(y)f(of)h(the)g(line.)21 b(Using)15 b(these)f(editing)h
+(commands,)f(y)o(ou)g(mo)o(v)o(e)f(the)h(cursor)75 1996
+y(to)i(the)i(place)g(that)e(needs)i(correction,)g(and)f(delete)h(or)f
+(insert)g(the)h(text)e(of)h(the)g(corrections.)26 b(Then,)75
+2051 y(when)16 b(y)o(ou)f(are)h(satis\014ed)g(with)g(the)f(line,)i(y)o
+(ou)e(simply)i(press)1160 2049 y Ff(h)p 1172 2023 76
+2 v 1172 2051 a Fe(RET)p 1172 2059 V 1245 2049 a Ff(i)1260
+2051 y Fo(.)k(Y)l(ou)16 b(do)f(not)h(ha)o(v)o(e)f(to)g(b)q(e)h(at)f
+(the)75 2106 y(end)k(of)e(the)h(line)i(to)d(press)563
+2104 y Ff(h)p 575 2078 V 575 2106 a Fe(RET)p 575 2113
+V 648 2104 a Ff(i)663 2106 y Fo(;)i(the)f(en)o(tire)h(line)g(is)g
+(accepted)f(regardless)g(of)g(the)g(lo)q(cation)g(of)g(the)75
+2160 y(cursor)d(within)h(the)g(line.)75 2266 y Fc(1.2.1)30
+b(Readline)20 b(Bare)g(Essen)n(tials)137 2386 y Fo(In)12
+b(order)g(to)f(en)o(ter)g(c)o(haracters)g(in)o(to)g(the)h(line,)h
+(simply)g(t)o(yp)q(e)f(them.)18 b(The)12 b(t)o(yp)q(ed)g(c)o(haracter)f
+(app)q(ears)75 2441 y(where)16 b(the)h(cursor)f(w)o(as,)f(and)h(then)h
+(the)f(cursor)g(mo)o(v)o(es)g(one)g(space)g(to)g(the)g(righ)o(t.)23
+b(If)17 b(y)o(ou)f(mist)o(yp)q(e)g(a)75 2495 y(c)o(haracter,)e(y)o(ou)h
+(can)g(use)h(y)o(our)f(erase)g(c)o(haracter)f(to)h(bac)o(k)g(up)g(and)h
+(delete)g(the)f(mist)o(yp)q(ed)h(c)o(haracter.)137 2560
+y(Sometimes)g(y)o(ou)f(ma)o(y)g(mist)o(yp)q(e)h(a)f(c)o(haracter,)f
+(and)i(not)f(notice)h(the)f(error)g(un)o(til)i(y)o(ou)e(ha)o(v)o(e)g(t)
+o(yp)q(ed)75 2615 y(sev)o(eral)g(other)f(c)o(haracters.)19
+b(In)c(that)e(case,)i(y)o(ou)f(can)g(t)o(yp)q(e)h Fg(C-b)f
+Fo(to)g(mo)o(v)o(e)f(the)i(cursor)f(to)g(the)g(left,)h(and)75
+2670 y(then)h(correct)e(y)o(our)h(mistak)o(e.)20 b(Afterw)o(ards,)13
+b(y)o(ou)i(can)g(mo)o(v)o(e)g(the)g(cursor)g(to)g(the)g(righ)o(t)g
+(with)g Fg(C-f)p Fo(.)p eop
+%%Page: 2 6
+2 5 bop 75 -58 a Fo(2)1322 b(GNU)15 b(Readline)h(Library)137
+149 y(When)h(y)o(ou)f(add)g(text)g(in)h(the)g(middle)h(of)e(a)f(line,)j
+(y)o(ou)e(will)i(notice)f(that)f(c)o(haracters)f(to)h(the)g(righ)o(t)75
+204 y(of)e(the)g(cursor)g(are)g(`pushed)h(o)o(v)o(er')f(to)f(mak)o(e)h
+(ro)q(om)g(for)f(the)i(text)f(that)f(y)o(ou)h(ha)o(v)o(e)g(inserted.)21
+b(Lik)o(ewise,)75 259 y(when)e(y)o(ou)g(delete)h(text)e(b)q(ehind)j
+(the)e(cursor,)g(c)o(haracters)f(to)g(the)h(righ)o(t)f(of)g(the)h
+(cursor)g(are)f(`pulled)75 314 y(bac)o(k')11 b(to)g(\014ll)h(in)h(the)e
+(blank)h(space)g(created)f(b)o(y)h(the)f(remo)o(v)m(al)g(of)g(the)h
+(text.)18 b(A)11 b(list)h(of)f(the)h(bare)f(essen)o(tials)75
+369 y(for)k(editing)h(the)f(text)g(of)g(an)g(input)h(line)h(follo)o
+(ws.)75 446 y Fg(C-b)168 b Fo(Mo)o(v)o(e)14 b(bac)o(k)h(one)h(c)o
+(haracter.)75 524 y Fg(C-f)168 b Fo(Mo)o(v)o(e)14 b(forw)o(ard)g(one)h
+(c)o(haracter.)75 599 y Ff(h)p 87 573 73 2 v 87 601 a
+Fe(DEL)p 87 609 V 158 599 a Ff(i)188 601 y Fo(or)244
+599 y Ff(h)p 256 573 159 2 v 256 601 a Fe(Bac)o(kspace)p
+256 609 V 412 599 a Ff(i)315 656 y Fo(Delete)h(the)f(c)o(haracter)g(to)
+f(the)h(left)h(of)f(the)g(cursor.)75 734 y Fg(C-d)168
+b Fo(Delete)16 b(the)f(c)o(haracter)g(underneath)h(the)f(cursor.)75
+811 y(Prin)o(ting)h(c)o(haracters)315 866 y(Insert)f(the)h(c)o
+(haracter)e(in)o(to)h(the)h(line)h(at)d(the)h(cursor.)75
+944 y Fg(C-_)g Fo(or)f Fg(C-x)h(C-u)315 998 y Fo(Undo)i(the)g(last)f
+(editing)i(command.)25 b(Y)l(ou)17 b(can)g(undo)g(all)g(the)g(w)o(a)o
+(y)f(bac)o(k)h(to)f(an)g(empt)o(y)315 1053 y(line.)75
+1131 y(\(Dep)q(ending)i(on)f(y)o(our)g(con\014guration,)g(the)863
+1129 y Ff(h)p 875 1103 V 875 1131 a Fe(Bac)o(kspace)p
+875 1138 V 1032 1129 a Ff(i)1063 1131 y Fo(k)o(ey)g(b)q(e)h(set)f(to)f
+(delete)i(the)f(c)o(haracter)g(to)f(the)75 1186 y(left)h(of)f(the)h
+(cursor)f(and)g(the)596 1184 y Ff(h)p 608 1158 73 2 v
+608 1186 a Fe(DEL)p 608 1193 V 679 1184 a Ff(i)710 1186
+y Fo(k)o(ey)h(set)f(to)g(delete)h(the)g(c)o(haracter)f(underneath)h
+(the)g(cursor,)f(lik)o(e)75 1240 y Fg(C-d)p Fo(,)e(rather)h(than)g(the)
+g(c)o(haracter)g(to)f(the)i(left)f(of)g(the)g(cursor.\))75
+1349 y Fc(1.2.2)30 b(Readline)20 b(Mo)n(v)n(emen)n(t)i(Commands)137
+1470 y Fo(The)14 b(ab)q(o)o(v)o(e)e(table)i(describ)q(es)g(the)g(most)e
+(basic)i(k)o(eystrok)o(es)d(that)i(y)o(ou)g(need)h(in)f(order)g(to)g
+(do)g(editing)75 1525 y(of)f(the)h(input)h(line.)21 b(F)l(or)12
+b(y)o(our)g(con)o(v)o(enience,)i(man)o(y)f(other)f(commands)h(ha)o(v)o
+(e)f(b)q(een)i(added)f(in)h(addition)75 1580 y(to)h Fg(C-b)p
+Fo(,)h Fg(C-f)p Fo(,)f Fg(C-d)p Fo(,)g(and)522 1578 y
+Ff(h)p 534 1552 V 534 1580 a Fe(DEL)p 534 1587 V 605
+1578 a Ff(i)619 1580 y Fo(.)23 b(Here)16 b(are)g(some)f(commands)h(for)
+f(mo)o(ving)h(more)g(rapidly)h(ab)q(out)f(the)75 1635
+y(line.)75 1712 y Fg(C-a)168 b Fo(Mo)o(v)o(e)14 b(to)h(the)g(start)f
+(of)h(the)g(line.)75 1790 y Fg(C-e)168 b Fo(Mo)o(v)o(e)14
+b(to)h(the)g(end)h(of)f(the)g(line.)75 1867 y Fg(M-f)168
+b Fo(Mo)o(v)o(e)14 b(forw)o(ard)g(a)h(w)o(ord,)f(where)i(a)e(w)o(ord)h
+(is)h(comp)q(osed)f(of)g(letters)g(and)h(digits.)75 1945
+y Fg(M-b)168 b Fo(Mo)o(v)o(e)14 b(bac)o(kw)o(ard)h(a)g(w)o(ord.)75
+2022 y Fg(C-l)168 b Fo(Clear)15 b(the)h(screen,)f(reprin)o(ting)h(the)f
+(curren)o(t)g(line)i(at)e(the)g(top.)137 2100 y(Notice)e(ho)o(w)f
+Fg(C-f)g Fo(mo)o(v)o(es)f(forw)o(ard)g(a)h(c)o(haracter,)g(while)i
+Fg(M-f)e Fo(mo)o(v)o(es)f(forw)o(ard)g(a)h(w)o(ord.)18
+b(It)13 b(is)g(a)f(lo)q(ose)75 2155 y(con)o(v)o(en)o(tion)j(that)f(con)
+o(trol)h(k)o(eystrok)o(es)f(op)q(erate)h(on)f(c)o(haracters)h(while)h
+(meta)e(k)o(eystrok)o(es)g(op)q(erate)h(on)75 2210 y(w)o(ords.)75
+2318 y Fc(1.2.3)30 b(Readline)20 b(Killing)h(Commands)137
+2439 y Fd(Killing)26 b Fo(text)18 b(means)g(to)g(delete)i(the)f(text)f
+(from)g(the)h(line,)i(but)d(to)g(sa)o(v)o(e)g(it)h(a)o(w)o(a)o(y)e(for)
+h(later)h(use,)75 2494 y(usually)f(b)o(y)f Fd(y)o(anking)22
+b Fo(\(re-inserting\))17 b(it)g(bac)o(k)g(in)o(to)g(the)h(line.)27
+b(\(`Cut')15 b(and)j(`paste')e(are)g(more)h(recen)o(t)75
+2549 y(jargon)d(for)h(`kill')h(and)g(`y)o(ank'.\))137
+2615 y(If)g(the)f(description)h(for)f(a)g(command)g(sa)o(ys)f(that)h
+(it)g(`kills')h(text,)e(then)i(y)o(ou)f(can)g(b)q(e)h(sure)f(that)f(y)o
+(ou)75 2670 y(can)h(get)g(the)g(text)g(bac)o(k)g(in)h(a)f(di\013eren)o
+(t)g(\(or)g(the)g(same\))g(place)h(later.)p eop
+%%Page: 3 7
+3 6 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(3)137 149 y(When)12 b(y)o(ou)g(use)g(a)f(kill)i(command,)f(the)g
+(text)f(is)h(sa)o(v)o(ed)f(in)i(a)e Fd(kill-ring)p Fo(.)21
+b(An)o(y)12 b(n)o(um)o(b)q(er)g(of)f(consecutiv)o(e)75
+204 y(kills)17 b(sa)o(v)o(e)e(all)h(of)f(the)h(killed)i(text)d
+(together,)f(so)h(that)g(when)h(y)o(ou)f(y)o(ank)g(it)h(bac)o(k,)f(y)o
+(ou)g(get)g(it)h(all.)22 b(The)75 259 y(kill)c(ring)f(is)f(not)g(line)i
+(sp)q(eci\014c;)g(the)e(text)g(that)f(y)o(ou)h(killed)j(on)d(a)g
+(previously)h(t)o(yp)q(ed)g(line)h(is)e(a)o(v)m(ailable)75
+314 y(to)f(b)q(e)g(y)o(ank)o(ed)g(bac)o(k)h(later,)e(when)i(y)o(ou)f
+(are)g(t)o(yping)g(another)g(line.)137 380 y(Here)h(is)f(the)h(list)g
+(of)e(commands)h(for)g(killing)j(text.)75 458 y Fg(C-k)168
+b Fo(Kill)17 b(the)f(text)e(from)h(the)g(curren)o(t)g(cursor)g(p)q
+(osition)h(to)f(the)g(end)h(of)f(the)g(line.)75 536 y
+Fg(M-d)168 b Fo(Kill)15 b(from)e(the)g(cursor)g(to)f(the)i(end)g(of)e
+(the)i(curren)o(t)f(w)o(ord,)f(or,)h(if)g(b)q(et)o(w)o(een)h(w)o(ords,)
+e(to)h(the)315 591 y(end)j(of)f(the)g(next)g(w)o(ord.)k(W)l(ord)c(b)q
+(oundaries)i(are)e(the)g(same)g(as)g(those)f(used)i(b)o(y)f
+Fg(M-f)p Fo(.)75 669 y Fg(M-)123 667 y Ff(h)p 135 641
+73 2 v 135 669 a Fe(DEL)p 135 676 V 206 667 a Ff(i)315
+669 y Fo(Kill)i(from)e(the)g(cursor)g(the)h(start)e(of)h(the)g(curren)o
+(t)g(w)o(ord,)f(or,)h(if)g(b)q(et)o(w)o(een)h(w)o(ords,)e(to)h(the)315
+723 y(start)j(of)h(the)g(previous)h(w)o(ord.)31 b(W)l(ord)19
+b(b)q(oundaries)h(are)f(the)h(same)e(as)h(those)g(used)h(b)o(y)315
+778 y Fg(M-b)p Fo(.)75 856 y Fg(C-w)168 b Fo(Kill)18
+b(from)d(the)g(cursor)h(to)f(the)g(previous)i(whitespace.)22
+b(This)16 b(is)g(di\013eren)o(t)g(than)f Fg(M-)1777 854
+y Ff(h)p 1789 828 V 1789 856 a Fe(DEL)p 1789 864 V 1860
+854 a Ff(i)315 911 y Fo(b)q(ecause)h(the)f(w)o(ord)g(b)q(oundaries)h
+(di\013er.)137 989 y(Here)21 b(is)h(ho)o(w)e(to)g Fd(y)o(ank)j
+Fo(the)e(text)f(bac)o(k)h(in)o(to)g(the)f(line.)39 b(Y)l(anking)21
+b(means)g(to)f(cop)o(y)h(the)g(most-)75 1044 y(recen)o(tly-killed)d
+(text)d(from)f(the)i(kill)h(bu\013er.)75 1122 y Fg(C-y)168
+b Fo(Y)l(ank)15 b(the)h(most)e(recen)o(tly)i(killed)h(text)e(bac)o(k)g
+(in)o(to)g(the)h(bu\013er)f(at)f(the)i(cursor.)75 1200
+y Fg(M-y)168 b Fo(Rotate)16 b(the)h(kill-ring,)j(and)d(y)o(ank)g(the)h
+(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f(this)h(if)f(the)h(prior)
+315 1254 y(command)d(is)h Fg(C-y)f Fo(or)f Fg(M-y)p Fo(.)75
+1364 y Fc(1.2.4)30 b(Readline)20 b(Argumen)n(ts)137 1485
+y Fo(Y)l(ou)15 b(can)g(pass)f(n)o(umeric)i(argumen)o(ts)e(to)g
+(Readline)h(commands.)20 b(Sometimes)15 b(the)g(argumen)o(t)e(acts)75
+1540 y(as)20 b(a)f(rep)q(eat)i(coun)o(t,)f(other)g(times)g(it)h(is)f
+(the)g Fi(sign)j Fo(of)c(the)h(argumen)o(t)g(that)f(is)i(signi\014can)o
+(t.)35 b(If)20 b(y)o(ou)75 1594 y(pass)d(a)f(negativ)o(e)h(argumen)o(t)
+f(to)g(a)g(command)h(whic)o(h)h(normally)f(acts)f(in)i(a)e(forw)o(ard)g
+(direction,)i(that)75 1649 y(command)g(will)h(act)e(in)i(a)e(bac)o(kw)o
+(ard)g(direction.)28 b(F)l(or)17 b(example,)i(to)e(kill)j(text)d(bac)o
+(k)g(to)g(the)h(start)e(of)75 1704 y(the)f(line,)i(y)o(ou)e(migh)o(t)g
+(t)o(yp)q(e)g(`)p Fn(M--)f(C-k)p Fo('.)137 1770 y(The)h(general)f(w)o
+(a)o(y)f(to)h(pass)g(n)o(umeric)h(argumen)o(ts)e(to)g(a)h(command)g(is)
+h(to)e(t)o(yp)q(e)h(meta)g(digits)h(b)q(efore)75 1825
+y(the)h(command.)k(If)c(the)f(\014rst)g(`digit')h(t)o(yp)q(ed)f(is)h(a)
+g(min)o(us)g(sign)g(\(`)p Fn(-)p Fo('\),)d(then)j(the)f(sign)h(of)f
+(the)h(argumen)o(t)75 1880 y(will)21 b(b)q(e)f(negativ)o(e.)31
+b(Once)20 b(y)o(ou)f(ha)o(v)o(e)g(t)o(yp)q(ed)g(one)g(meta)g(digit)h
+(to)e(get)h(the)g(argumen)o(t)f(started,)h(y)o(ou)75
+1935 y(can)c(t)o(yp)q(e)f(the)h(remainder)g(of)f(the)g(digits,)h(and)g
+(then)g(the)f(command.)20 b(F)l(or)13 b(example,)i(to)f(giv)o(e)h(the)f
+Fg(C-d)75 1990 y Fo(command)19 b(an)f(argumen)o(t)g(of)g(10,)h(y)o(ou)f
+(could)i(t)o(yp)q(e)f(`)p Fn(M-1)14 b(0)h(C-d)p Fo(',)k(whic)o(h)g
+(will)h(delete)g(the)f(next)g(ten)75 2044 y(c)o(haracters)14
+b(on)i(the)f(input)h(line.)75 2154 y Fc(1.2.5)30 b(Searc)n(hing)21
+b(for)f(Commands)h(in)f(the)h(History)137 2275 y Fo(Readline)d(pro)o
+(vides)e(commands)g(for)g(searc)o(hing)g(through)g(the)g(command)g
+(history)g(for)g(lines)i(con-)75 2330 y(taining)e(a)f(sp)q(eci\014ed)i
+(string.)j(There)c(are)e(t)o(w)o(o)g(searc)o(h)h(mo)q(des:)20
+b Fd(incremen)o(tal)e Fo(and)e Fd(non-incremen)o(tal)p
+Fo(.)137 2396 y(Incremen)o(tal)e(searc)o(hes)f(b)q(egin)h(b)q(efore)f
+(the)g(user)g(has)g(\014nished)h(t)o(yping)f(the)g(searc)o(h)g(string.)
+19 b(As)13 b(eac)o(h)75 2451 y(c)o(haracter)k(of)g(the)h(searc)o(h)g
+(string)f(is)h(t)o(yp)q(ed,)h(Readline)g(displa)o(ys)f(the)g(next)g(en)
+o(try)f(from)g(the)h(history)75 2506 y(matc)o(hing)12
+b(the)g(string)g(t)o(yp)q(ed)g(so)g(far.)18 b(An)13 b(incremen)o(tal)g
+(searc)o(h)f(requires)g(only)h(as)f(man)o(y)f(c)o(haracters)g(as)75
+2560 y(needed)16 b(to)d(\014nd)j(the)e(desired)i(history)e(en)o(try)l
+(.)19 b(T)l(o)c(searc)o(h)f(bac)o(kw)o(ard)f(in)j(the)e(history)g(for)g
+(a)g(particular)75 2615 y(string,)g(t)o(yp)q(e)h Fg(C-r)p
+Fo(.)k(T)o(yping)d Fg(C-s)e Fo(searc)o(hes)h(forw)o(ard)e(through)h
+(the)h(history)l(.)20 b(The)15 b(c)o(haracters)f(presen)o(t)75
+2670 y(in)20 b(the)f(v)m(alue)h(of)f(the)g Fn(isearch-terminators)d
+Fo(v)m(ariable)k(are)f(used)h(to)e(terminate)h(an)g(incremen)o(tal)p
+eop
+%%Page: 4 8
+4 7 bop 75 -58 a Fo(4)1322 b(GNU)15 b(Readline)h(Library)75
+149 y(searc)o(h.)31 b(If)19 b(that)f(v)m(ariable)i(has)f(not)f(b)q(een)
+i(assigned)g(a)e(v)m(alue,)j(the)1289 147 y Ff(h)p 1301
+121 70 2 v 1301 149 a Fe(ESC)p 1301 157 V 1368 147 a
+Ff(i)1402 149 y Fo(and)e Fg(C-J)f Fo(c)o(haracters)g(will)75
+204 y(terminate)j(an)g(incremen)o(tal)i(searc)o(h.)37
+b Fg(C-g)21 b Fo(will)i(ab)q(ort)e(an)g(incremen)o(tal)h(searc)o(h)f
+(and)g(restore)g(the)75 259 y(original)16 b(line.)21
+b(When)15 b(the)f(searc)o(h)g(is)h(terminated,)g(the)f(history)h(en)o
+(try)f(con)o(taining)h(the)g(searc)o(h)f(string)75 314
+y(b)q(ecomes)i(the)f(curren)o(t)g(line.)137 384 y(T)l(o)g(\014nd)i
+(other)e(matc)o(hing)g(en)o(tries)h(in)h(the)e(history)h(list,)g(t)o
+(yp)q(e)f Fg(C-r)g Fo(or)g Fg(C-s)g Fo(as)h(appropriate.)k(This)75
+439 y(will)15 b(searc)o(h)e(bac)o(kw)o(ard)f(or)g(forw)o(ard)g(in)i
+(the)f(history)g(for)g(the)g(next)g(en)o(try)g(matc)o(hing)g(the)g
+(searc)o(h)g(string)75 494 y(t)o(yp)q(ed)19 b(so)g(far.)30
+b(An)o(y)19 b(other)f(k)o(ey)h(sequence)h(b)q(ound)g(to)e(a)h(Readline)
+h(command)e(will)j(terminate)e(the)75 549 y(searc)o(h)10
+b(and)h(execute)g(that)f(command.)18 b(F)l(or)10 b(instance,)i(a)1063
+547 y Ff(h)p 1076 521 76 2 v 1076 549 a Fe(RET)p 1076
+556 V 1149 547 a Ff(i)1174 549 y Fo(will)g(terminate)f(the)g(searc)o(h)
+f(and)h(accept)75 604 y(the)k(line,)h(thereb)o(y)f(executing)g(the)g
+(command)g(from)f(the)g(history)h(list.)20 b(A)15 b(mo)o(v)o(emen)o(t)f
+(command)g(will)75 658 y(terminate)h(the)g(searc)o(h,)g(mak)o(e)g(the)g
+(last)g(line)i(found)f(the)f(curren)o(t)g(line,)h(and)g(b)q(egin)g
+(editing.)137 729 y(Readline)j(remem)o(b)q(ers)e(the)h(last)f(incremen)
+o(tal)i(searc)o(h)e(string.)27 b(If)17 b(t)o(w)o(o)f
+Fg(C-r)p Fo(s)h(are)g(t)o(yp)q(ed)h(without)75 784 y(an)o(y)g(in)o
+(terv)o(ening)h(c)o(haracters)f(de\014ning)h(a)f(new)h(searc)o(h)f
+(string,)g(an)o(y)g(remem)o(b)q(ered)h(searc)o(h)f(string)g(is)75
+839 y(used.)137 909 y(Non-incremen)o(tal)25 b(searc)o(hes)e(read)h(the)
+f(en)o(tire)h(searc)o(h)f(string)g(b)q(efore)h(starting)f(to)f(searc)o
+(h)i(for)75 964 y(matc)o(hing)d(history)h(lines.)39 b(The)22
+b(searc)o(h)f(string)g(ma)o(y)g(b)q(e)h(t)o(yp)q(ed)f(b)o(y)h(the)f
+(user)h(or)e(b)q(e)i(part)f(of)g(the)75 1019 y(con)o(ten)o(ts)15
+b(of)f(the)i(curren)o(t)f(line.)75 1156 y Fm(1.3)33 b(Readline)23
+b(Init)h(File)137 1281 y Fo(Although)f(the)g(Readline)h(library)f
+(comes)g(with)g(a)f(set)g(of)g(Emacs-lik)o(e)i(k)o(eybindings)g
+(installed)75 1336 y(b)o(y)d(default,)h(it)f(is)h(p)q(ossible)g(to)e
+(use)i(a)e(di\013eren)o(t)h(set)g(of)f(k)o(eybindings.)39
+b(An)o(y)20 b(user)h(can)g(customize)75 1391 y(programs)15
+b(that)h(use)g(Readline)i(b)o(y)e(putting)g(commands)g(in)i(an)e
+Fd(inputrc)k Fo(\014le,)d(con)o(v)o(en)o(tionally)g(in)g(his)75
+1445 y(home)g(directory)l(.)24 b(The)17 b(name)g(of)f(this)h(\014le)g
+(is)g(tak)o(en)g(from)e(the)i(v)m(alue)h(of)e(the)h(en)o(vironmen)o(t)g
+(v)m(ariable)75 1500 y Fn(INPUTRC)p Fo(.)i(If)c(that)g(v)m(ariable)h
+(is)g(unset,)f(the)g(default)h(is)g(`)p Fn(~/.inputrc)p
+Fo('.)137 1571 y(When)f(a)g(program)f(whic)o(h)h(uses)g(the)g(Readline)
+h(library)g(starts)d(up,)i(the)g(init)h(\014le)g(is)f(read,)g(and)g
+(the)75 1626 y(k)o(ey)g(bindings)i(are)e(set.)137 1696
+y(In)f(addition,)h(the)e Fn(C-x)i(C-r)e Fo(command)g(re-reads)h(this)g
+(init)g(\014le,)h(th)o(us)e(incorp)q(orating)h(an)o(y)f(c)o(hanges)75
+1751 y(that)h(y)o(ou)h(migh)o(t)g(ha)o(v)o(e)g(made)g(to)g(it.)75
+1870 y Fc(1.3.1)30 b(Readline)20 b(Init)g(File)h(Syn)n(tax)137
+1995 y Fo(There)c(are)g(only)g(a)g(few)f(basic)i(constructs)e(allo)o(w)
+o(ed)i(in)f(the)g(Readline)h(init)g(\014le.)26 b(Blank)18
+b(lines)g(are)75 2050 y(ignored.)36 b(Lines)22 b(b)q(eginning)h(with)d
+(a)h(`)p Fn(#)p Fo(')e(are)h(commen)o(ts.)35 b(Lines)22
+b(b)q(eginning)h(with)e(a)f(`)p Fn($)p Fo(')f(indicate)75
+2105 y(conditional)c(constructs)f(\(see)g(Section)g(1.3.2)f
+([Conditional)h(Init)h(Constructs],)e(page)h(9\).)k(Other)c(lines)75
+2159 y(denote)h(v)m(ariable)i(settings)e(and)h(k)o(ey)f(bindings.)75
+2244 y(V)l(ariable)h(Settings)315 2299 y(Y)l(ou)k(can)h(mo)q(dify)g
+(the)f(run-time)h(b)q(eha)o(vior)g(of)e(Readline)j(b)o(y)e(altering)h
+(the)f(v)m(alues)h(of)315 2354 y(v)m(ariables)d(in)g(Readline)g(using)f
+(the)g Fn(set)g Fo(command)f(within)i(the)f(init)h(\014le.)26
+b(The)17 b(syn)o(tax)315 2408 y(is)f(simple:)435 2477
+y Fn(set)23 b Fg(variable)28 b(value)315 2546 y Fo(Here,)14
+b(for)f(example,)h(is)g(ho)o(w)f(to)g(c)o(hange)h(from)f(the)h(default)
+g(Emacs-lik)o(e)h(k)o(ey)e(binding)j(to)315 2601 y(use)g
+Fn(vi)e Fo(line)j(editing)g(commands:)435 2670 y Fn(set)23
+b(editing-mode)g(vi)p eop
+%%Page: 5 9
+5 8 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(5)315 149 y(V)l(ariable)19 b(names)e(and)h(v)m(alues,)h(where)e
+(appropriate,)h(are)f(recognized)i(without)e(regard)315
+204 y(to)e(case.)315 271 y(A)g(great)g(deal)g(of)g(run-time)h(b)q(eha)o
+(vior)g(is)g(c)o(hangeable)g(with)f(the)h(follo)o(wing)f(v)m(ariables.)
+315 348 y Fn(bell-style)555 403 y Fo(Con)o(trols)21 b(what)h(happ)q
+(ens)h(when)f(Readline)h(w)o(an)o(ts)e(to)g(ring)i(the)f(termi-)555
+458 y(nal)d(b)q(ell.)32 b(If)19 b(set)f(to)g(`)p Fn(none)p
+Fo(',)g(Readline)i(nev)o(er)f(rings)g(the)f(b)q(ell.)32
+b(If)19 b(set)g(to)555 513 y(`)p Fn(visible)p Fo(',)c(Readline)i(uses)g
+(a)f(visible)j(b)q(ell)g(if)e(one)f(is)h(a)o(v)m(ailable.)26
+b(If)16 b(set)h(to)555 568 y(`)p Fn(audible)p Fo(')g(\(the)h
+(default\),)i(Readline)g(attempts)e(to)g(ring)h(the)g(terminal's)555
+622 y(b)q(ell.)315 700 y Fn(comment-begin)555 755 y Fo(The)c(string)f
+(to)g(insert)i(at)d(the)i(b)q(eginning)i(of)d(the)h(line)h(when)f(the)g
+Fn(insert-)555 810 y(comment)f Fo(command)h(is)h(executed.)21
+b(The)15 b(default)h(v)m(alue)g(is)g Fn("#")p Fo(.)315
+888 y Fn(completion-ignore-case)555 943 y Fo(If)e(set)f(to)g(`)p
+Fn(on)p Fo(',)g(Readline)i(p)q(erforms)e(\014lename)i(matc)o(hing)f
+(and)g(completion)555 997 y(in)i(a)f(case-insensitiv)o(e)i(fashion.)k
+(The)15 b(default)h(v)m(alue)g(is)g(`)p Fn(off)p Fo('.)315
+1075 y Fn(completion-query-items)555 1130 y Fo(The)d(n)o(um)o(b)q(er)h
+(of)e(p)q(ossible)j(completions)g(that)d(determines)i(when)g(the)f
+(user)555 1185 y(is)i(ask)o(ed)g(whether)g(the)f(list)i(of)e(p)q
+(ossibilities)k(should)e(b)q(e)f(displa)o(y)o(ed.)21
+b(If)15 b(the)555 1240 y(n)o(um)o(b)q(er)f(of)f(p)q(ossible)i
+(completions)f(is)g(greater)f(than)g(this)h(v)m(alue,)h(Readline)555
+1294 y(will)g(ask)e(the)g(user)h(whether)f(or)g(not)g(he)g(wishes)h(to)
+f(view)h(them;)f(otherwise,)555 1349 y(they)f(are)g(simply)i(listed.)20
+b(This)13 b(v)m(ariable)g(m)o(ust)f(b)q(e)h(set)f(to)f(an)h(in)o(teger)
+h(v)m(alue)555 1404 y(greater)h(than)h(or)g(equal)h(to)f(0.)k(The)d
+(default)f(limit)i(is)f Fn(100)p Fo(.)315 1482 y Fn(convert-meta)555
+1537 y Fo(If)11 b(set)g(to)g(`)p Fn(on)p Fo(',)f(Readline)i(will)h(con)
+o(v)o(ert)d(c)o(haracters)h(with)g(the)g(eigh)o(th)h(bit)f(set)555
+1591 y(to)f(an)h Fh(asci)q(i)e Fo(k)o(ey)i(sequence)g(b)o(y)g
+(stripping)h(the)e(eigh)o(th)h(bit)h(and)e(pre\014xing)i(an)555
+1644 y Ff(h)p 567 1618 70 2 v 567 1646 a Fe(ESC)p 567
+1654 V 634 1644 a Ff(i)666 1646 y Fo(c)o(haracter,)k(con)o(v)o(erting)h
+(them)g(to)f(a)h(meta-pre\014xed)g(k)o(ey)g(sequence.)555
+1701 y(The)e(default)h(v)m(alue)h(is)e(`)p Fn(on)p Fo('.)315
+1779 y Fn(disable-completion)555 1834 y Fo(If)k(set)f(to)f(`)p
+Fn(On)p Fo(',)h(Readline)i(will)g(inhibit)g(w)o(ord)e(completion.)30
+b(Completion)555 1888 y(c)o(haracters)12 b(will)j(b)q(e)f(inserted)g
+(in)o(to)f(the)g(line)h(as)f(if)h(they)f(had)g(b)q(een)h(mapp)q(ed)555
+1943 y(to)h Fn(self-insert)p Fo(.)j(The)d(default)h(is)g(`)p
+Fn(off)p Fo('.)315 2021 y Fn(editing-mode)555 2076 y
+Fo(The)f Fn(editing-mode)d Fo(v)m(ariable)k(con)o(trols)e(whic)o(h)h
+(default)g(set)f(of)g(k)o(ey)g(bind-)555 2131 y(ings)f(is)g(used.)20
+b(By)12 b(default,)i(Readline)f(starts)f(up)h(in)g(Emacs)f(editing)i
+(mo)q(de,)555 2185 y(where)h(the)f(k)o(eystrok)o(es)g(are)g(most)g
+(similar)i(to)d(Emacs.)20 b(This)15 b(v)m(ariable)h(can)555
+2240 y(b)q(e)g(set)f(to)f(either)i(`)p Fn(emacs)p Fo(')e(or)h(`)p
+Fn(vi)p Fo('.)315 2318 y Fn(enable-keypad)555 2373 y
+Fo(When)d(set)f(to)h(`)p Fn(on)p Fo(',)e(Readline)j(will)h(try)d(to)g
+(enable)i(the)f(application)h(k)o(eypad)555 2428 y(when)h(it)f(is)h
+(called.)21 b(Some)13 b(systems)g(need)h(this)g(to)f(enable)h(the)g
+(arro)o(w)e(k)o(eys.)555 2483 y(The)j(default)h(is)g(`)p
+Fn(off)p Fo('.)315 2560 y Fn(expand-tilde)555 2615 y
+Fo(If)e(set)g(to)f(`)p Fn(on)p Fo(',)f(tilde)k(expansion)e(is)h(p)q
+(erformed)f(when)g(Readline)h(attempts)555 2670 y(w)o(ord)g
+(completion.)21 b(The)15 b(default)h(is)f(`)p Fn(off)p
+Fo('.)p eop
+%%Page: 6 10
+6 9 bop 75 -58 a Fo(6)1322 b(GNU)15 b(Readline)h(Library)555
+149 y(If)f(set)g(to)f(`)p Fn(on)p Fo(',)g(the)g(history)h(co)q(de)h
+(attempts)e(to)g(place)i(p)q(oin)o(t)f(at)f(the)h(same)555
+204 y(lo)q(cation)i(on)g(eac)o(h)g(history)g(line)h(retriev)o(ed)f
+(with)g Fn(previous-history)d Fo(or)555 259 y Fn(next-history)p
+Fo(.)315 348 y Fn(horizontal-scroll-mode)555 403 y Fo(This)19
+b(v)m(ariable)g(can)f(b)q(e)g(set)g(to)f(either)i(`)p
+Fn(on)p Fo(')e(or)g(`)p Fn(off)p Fo('.)27 b(Setting)19
+b(it)f(to)f(`)p Fn(on)p Fo(')555 458 y(means)c(that)f(the)i(text)e(of)h
+(the)g(lines)i(b)q(eing)f(edited)g(will)h(scroll)f(horizon)o(tally)555
+512 y(on)i(a)f(single)i(screen)g(line)g(when)g(they)f(are)f(longer)h
+(than)g(the)g(width)g(of)g(the)555 567 y(screen,)e(instead)f(of)g
+(wrapping)g(on)o(to)f(a)h(new)g(screen)h(line.)21 b(By)13
+b(default,)h(this)555 622 y(v)m(ariable)j(is)e(set)g(to)g(`)p
+Fn(off)p Fo('.)315 711 y Fn(input-meta)555 766 y Fo(If)h(set)f(to)g(`)p
+Fn(on)p Fo(',)f(Readline)j(will)h(enable)e(eigh)o(t-bit)h(input)f(\(it)
+g(will)h(not)e(clear)555 821 y(the)20 b(eigh)o(th)g(bit)g(in)h(the)f(c)
+o(haracters)f(it)h(reads\),)g(regardless)g(of)g(what)f(the)555
+875 y(terminal)i(claims)g(it)f(can)g(supp)q(ort.)34 b(The)20
+b(default)h(v)m(alue)g(is)g(`)p Fn(off)p Fo('.)33 b(The)555
+930 y(name)15 b Fn(meta-flag)f Fo(is)i(a)f(synon)o(ym)g(for)f(this)i(v)
+m(ariable.)315 1019 y Fn(isearch-terminators)555 1074
+y Fo(The)26 b(string)g(of)f(c)o(haracters)g(that)g(should)i(terminate)f
+(an)g(incremen)o(tal)555 1129 y(searc)o(h)12 b(without)h(subsequen)o
+(tly)g(executing)h(the)e(c)o(haracter)g(as)g(a)g(command)555
+1184 y(\(see)22 b(Section)h(1.2.5)e([Searc)o(hing],)j(page)e(3\).)40
+b(If)23 b(this)g(v)m(ariable)g(has)f(not)555 1238 y(b)q(een)17
+b(giv)o(en)f(a)g(v)m(alue,)g(the)g(c)o(haracters)1247
+1236 y Ff(h)p 1259 1210 70 2 v 1259 1238 a Fe(ESC)p 1259
+1246 V 1326 1236 a Ff(i)1357 1238 y Fo(and)g Fg(C-J)f
+Fo(will)i(terminate)f(an)555 1293 y(incremen)o(tal)g(searc)o(h.)315
+1382 y Fn(keymap)96 b Fo(Sets)19 b(Readline's)i(idea)f(of)f(the)g
+(curren)o(t)h(k)o(eymap)f(for)f(k)o(ey)i(binding)h(com-)555
+1437 y(mands.)41 b(Acceptable)23 b Fn(keymap)f Fo(names)g(are)f
+Fn(emacs)p Fo(,)i Fn(emacs-standard)p Fo(,)555 1492 y
+Fn(emacs-meta)p Fo(,)49 b Fn(emacs-ctlx)p Fo(,)g Fn(vi)p
+Fo(,)h Fn(vi-move)p Fo(,)f Fn(vi-command)p Fo(,)g(and)555
+1547 y Fn(vi-insert)p Fo(.)31 b Fn(vi)20 b Fo(is)g(equiv)m(alen)o(t)h
+(to)e Fn(vi-command)p Fo(;)g Fn(emacs)g Fo(is)h(equiv)m(alen)o(t)555
+1601 y(to)15 b Fn(emacs-standard)p Fo(.)20 b(The)d(default)f(v)m(alue)h
+(is)g Fn(emacs)p Fo(.)k(The)16 b(v)m(alue)h(of)f(the)555
+1656 y Fn(editing-mode)e Fo(v)m(ariable)i(also)f(a\013ects)g(the)g
+(default)h(k)o(eymap.)315 1745 y Fn(mark-directories)555
+1800 y Fo(If)j(set)g(to)g(`)p Fn(on)p Fo(',)f(completed)i(directory)g
+(names)f(ha)o(v)o(e)f(a)h(slash)h(app)q(ended.)555 1855
+y(The)15 b(default)h(is)g(`)p Fn(on)p Fo('.)315 1944
+y Fn(mark-modified-lines)555 1999 y Fo(This)j(v)m(ariable,)g(when)g
+(set)e(to)h(`)p Fn(on)p Fo(',)f(causes)h(Readline)h(to)e(displa)o(y)i
+(an)f(as-)555 2054 y(terisk)f(\(`)p Fn(*)p Fo('\))e(at)i(the)f(start)g
+(of)h(history)f(lines)j(whic)o(h)e(ha)o(v)o(e)g(b)q(een)h(mo)q
+(di\014ed.)555 2108 y(This)e(v)m(ariable)g(is)g(`)p Fn(off)p
+Fo(')e(b)o(y)h(default.)315 2197 y Fn(mark-symlinked-directories)555
+2252 y Fo(If)23 b(set)f(to)f(`)p Fn(on)p Fo(',)i(completed)g(names)g
+(whic)o(h)g(are)f(sym)o(b)q(olic)i(links)f(to)f(di-)555
+2307 y(rectories)h(ha)o(v)o(e)g(a)g(slash)g(app)q(ended)i(\(sub)s(ject)
+e(to)f(the)i(v)m(alue)g(of)f Fn(mark-)555 2362 y(directories)p
+Fo(\).)18 b(The)d(default)h(is)g(`)p Fn(off)p Fo('.)315
+2451 y Fn(match-hidden-files)555 2506 y Fo(This)c(v)m(ariable,)h(when)e
+(set)g(to)g(`)p Fn(on)p Fo(',)f(causes)h(Readline)i(to)d(matc)o(h)h
+(\014les)h(whose)555 2560 y(names)22 b(b)q(egin)h(with)g(a)e(`)p
+Fn(.)p Fo(')h(\(hidden)h(\014les\))g(when)f(p)q(erforming)h(\014lename)
+555 2615 y(completion,)g(unless)f(the)f(leading)h(`)p
+Fn(.)p Fo(')e(is)h(supplied)i(b)o(y)e(the)f(user)h(in)h(the)555
+2670 y(\014lename)16 b(to)f(b)q(e)h(completed.)21 b(This)15
+b(v)m(ariable)i(is)f(`)p Fn(on)p Fo(')e(b)o(y)h(default.)p
+eop
+%%Page: 7 11
+7 10 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(7)315 149 y Fn(output-meta)555 204 y Fo(If)18 b(set)f(to)g(`)p
+Fn(on)p Fo(',)g(Readline)i(will)h(displa)o(y)f(c)o(haracters)d(with)j
+(the)e(eigh)o(th)h(bit)555 259 y(set)g(directly)i(rather)d(than)h(as)g
+(a)g(meta-pre\014xed)h(escap)q(e)g(sequence.)30 b(The)555
+314 y(default)16 b(is)f(`)p Fn(off)p Fo('.)315 394 y
+Fn(page-completions)555 449 y Fo(If)i(set)g(to)f(`)p
+Fn(on)p Fo(',)g(Readline)i(uses)g(an)e(in)o(ternal)i
+Fn(more)p Fo(-lik)o(e)g(pager)f(to)f(displa)o(y)555 504
+y(a)g(screenful)h(of)f(p)q(ossible)i(completions)f(at)f(a)g(time.)23
+b(This)17 b(v)m(ariable)g(is)g(`)p Fn(on)p Fo(')555 559
+y(b)o(y)e(default.)315 639 y Fn(print-completions-horizont)o(ally)555
+694 y Fo(If)d(set)g(to)f(`)p Fn(on)p Fo(',)h(Readline)h(will)g(displa)o
+(y)h(completions)f(with)f(matc)o(hes)f(sorted)555 749
+y(horizon)o(tally)23 b(in)f(alphab)q(etical)i(order,)f(rather)e(than)g
+(do)o(wn)h(the)g(screen.)555 804 y(The)15 b(default)h(is)g(`)p
+Fn(off)p Fo('.)315 884 y Fn(show-all-if-ambiguous)555
+939 y Fo(This)g(alters)e(the)i(default)f(b)q(eha)o(vior)h(of)e(the)h
+(completion)h(functions.)21 b(If)15 b(set)555 994 y(to)e(`)p
+Fn(on)p Fo(',)g(w)o(ords)g(whic)o(h)h(ha)o(v)o(e)g(more)f(than)g(one)h
+(p)q(ossible)i(completion)f(cause)555 1049 y(the)20 b(matc)o(hes)f(to)f
+(b)q(e)j(listed)f(immediately)h(instead)f(of)f(ringing)i(the)e(b)q
+(ell.)555 1104 y(The)c(default)h(v)m(alue)h(is)e(`)p
+Fn(off)p Fo('.)315 1184 y Fn(show-all-if-unmodified)555
+1239 y Fo(This)20 b(alters)f(the)h(default)f(b)q(eha)o(vior)h(of)f(the)
+h(completion)g(functions)g(in)g(a)555 1294 y(fashion)13
+b(similar)h(to)e Fd(sho)o(w-all-if-am)o(biguous)p Fo(.)21
+b(If)13 b(set)f(to)g(`)p Fn(on)p Fo(',)g(w)o(ords)g(whic)o(h)555
+1348 y(ha)o(v)o(e)j(more)g(than)g(one)h(p)q(ossible)h(completion)f
+(without)g(an)o(y)f(p)q(ossible)i(par-)555 1403 y(tial)22
+b(completion)g(\(the)f(p)q(ossible)i(completions)f(don't)f(share)g(a)f
+(common)555 1458 y(pre\014x\))15 b(cause)h(the)f(matc)o(hes)g(to)f(b)q
+(e)i(listed)g(immediately)h(instead)f(of)e(ring-)555
+1513 y(ing)i(the)f(b)q(ell.)22 b(The)15 b(default)h(v)m(alue)g(is)g(`)p
+Fn(off)p Fo('.)315 1593 y Fn(visible-stats)555 1648 y
+Fo(If)g(set)g(to)f(`)p Fn(on)p Fo(',)g(a)h(c)o(haracter)f(denoting)h(a)
+g(\014le's)h(t)o(yp)q(e)f(is)g(app)q(ended)i(to)d(the)555
+1703 y(\014lename)h(when)g(listing)h(p)q(ossible)g(completions.)j(The)c
+(default)g(is)f(`)p Fn(off)p Fo('.)75 1784 y(Key)h(Bindings)315
+1838 y(The)21 b(syn)o(tax)f(for)h(con)o(trolling)h(k)o(ey)f(bindings)h
+(in)g(the)f(init)h(\014le)g(is)g(simple.)39 b(First)20
+b(y)o(ou)315 1893 y(need)15 b(to)e(\014nd)h(the)g(name)g(of)g(the)f
+(command)h(that)f(y)o(ou)h(w)o(an)o(t)f(to)g(c)o(hange.)19
+b(The)14 b(follo)o(wing)315 1948 y(sections)k(con)o(tain)h(tables)f(of)
+f(the)h(command)g(name,)g(the)g(default)h(k)o(eybinding,)h(if)e(an)o(y)
+l(,)315 2003 y(and)d(a)g(short)g(description)i(of)d(what)h(the)g
+(command)g(do)q(es.)315 2070 y(Once)k(y)o(ou)f(kno)o(w)f(the)h(name)g
+(of)g(the)g(command,)g(simply)h(place)g(on)f(a)f(line)j(in)f(the)f
+(init)315 2125 y(\014le)g(the)f(name)g(of)f(the)h(k)o(ey)g(y)o(ou)f
+(wish)i(to)e(bind)i(the)f(command)g(to,)f(a)g(colon,)i(and)f(then)315
+2180 y(the)f(name)g(of)g(the)g(command.)22 b(The)16 b(name)g(of)g(the)g
+(k)o(ey)f(can)i(b)q(e)f(expressed)h(in)g(di\013eren)o(t)315
+2235 y(w)o(a)o(ys,)d(dep)q(ending)j(on)e(what)g(y)o(ou)g(\014nd)h(most)
+e(comfortable.)315 2303 y(In)19 b(addition)g(to)e(command)h(names,)g
+(readline)i(allo)o(ws)e(k)o(eys)g(to)f(b)q(e)i(b)q(ound)g(to)e(a)h
+(string)315 2357 y(that)c(is)i(inserted)g(when)g(the)f(k)o(ey)g(is)h
+(pressed)g(\(a)e Fd(macro)r Fo(\).)315 2438 y Fd(k)o(eyname)s
+Fo(:)19 b Fd(function-name)g Fo(or)c Fd(macro)555 2493
+y(k)o(eyname)i Fo(is)e(the)f(name)h(of)f(a)g(k)o(ey)g(sp)q(elled)j(out)
+d(in)h(English.)21 b(F)l(or)13 b(example:)675 2560 y
+Fn(Control-u:)22 b(universal-argument)675 2615 y(Meta-Rubout:)g
+(backward-kill-word)675 2670 y(Control-o:)g(">)i(output")p
+eop
+%%Page: 8 12
+8 11 bop 75 -58 a Fo(8)1322 b(GNU)15 b(Readline)h(Library)555
+149 y(In)k(the)f(ab)q(o)o(v)o(e)g(example,)i Fg(C-u)e
+Fo(is)h(b)q(ound)g(to)f(the)g(function)h Fn(universal-)555
+204 y(argument)p Fo(,)e Fg(M-DEL)h Fo(is)g(b)q(ound)h(to)e(the)h
+(function)h Fn(backward-kill-word)p Fo(,)555 259 y(and)g
+Fg(C-o)f Fo(is)h(b)q(ound)g(to)f(run)h(the)f(macro)g(expressed)h(on)g
+(the)f(righ)o(t)h(hand)555 314 y(side)c(\(that)e(is,)i(to)e(insert)i
+(the)f(text)g(`)p Fn(>)f(output)p Fo(')g(in)o(to)i(the)f(line\).)555
+382 y(A)k(n)o(um)o(b)q(er)f(of)g(sym)o(b)q(olic)i(c)o(haracter)e(names)
+g(are)g(recognized)i(while)g(pro-)555 437 y(cessing)13
+b(this)f(k)o(ey)g(binding)h(syn)o(tax:)18 b Fd(DEL)p
+Fo(,)11 b Fd(ESC)p Fo(,)h Fd(ESCAPE)p Fo(,)f Fd(LFD)p
+Fo(,)g Fd(NEW-)555 492 y(LINE)p Fo(,)16 b Fd(RET)p Fo(,)e
+Fd(RETURN)p Fo(,)f Fd(R)o(UBOUT)p Fo(,)i Fd(SP)l(A)o(CE)p
+Fo(,)g Fd(SPC)p Fo(,)f(and)i Fd(T)l(AB)p Fo(.)315 573
+y Fn(")p Fd(k)o(eyseq)q Fn(")p Fo(:)k Fd(function-name)e
+Fo(or)d Fd(macro)555 628 y(k)o(eyseq)i Fo(di\013ers)e(from)g
+Fd(k)o(eyname)j Fo(ab)q(o)o(v)o(e)d(in)i(that)d(strings)i(denoting)g
+(an)f(en-)555 683 y(tire)i(k)o(ey)g(sequence)h(can)f(b)q(e)g(sp)q
+(eci\014ed,)i(b)o(y)e(placing)h(the)f(k)o(ey)g(sequence)h(in)555
+737 y(double)e(quotes.)j(Some)c Fh(gnu)g Fo(Emacs)f(st)o(yle)h(k)o(ey)g
+(escap)q(es)g(can)g(b)q(e)g(used,)g(as)555 792 y(in)j(the)f(follo)o
+(wing)g(example,)h(but)f(the)g(sp)q(ecial)i(c)o(haracter)d(names)h(are)
+f(not)555 847 y(recognized.)675 915 y Fn("\\C-u":)23
+b(universal-argument)675 970 y("\\C-x\\C-r":)f(re-read-init-file)675
+1025 y("\\e[11~":)h("Function)f(Key)i(1")555 1093 y Fo(In)33
+b(the)f(ab)q(o)o(v)o(e)g(example,)37 b Fg(C-u)32 b Fo(is)h(again)f(b)q
+(ound)h(to)f(the)g(function)555 1148 y Fn(universal-argument)19
+b Fo(\(just)j(as)f(it)h(w)o(as)f(in)i(the)f(\014rst)f(example\),)j(`)p
+Fg(C-x)555 1202 y(C-r)p Fo(')c(is)h(b)q(ound)g(to)f(the)h(function)g
+Fn(re-read-init-file)p Fo(,)f(and)g(`)1731 1200 y Ff(h)p
+1743 1174 70 2 v 1743 1202 a Fe(ESC)p 1743 1210 V 1810
+1200 a Ff(i)15 b(h)p 1852 1174 10 2 v 1852 1202 a Fe([)p
+1852 1211 V 1860 1200 a Ff(i)555 1255 y(h)p 567 1229
+18 2 v 567 1257 a Fe(1)p 567 1265 V 583 1255 a Ff(i)g(h)p
+625 1229 V 625 1257 a Fe(1)p 625 1265 V 640 1255 a Ff(i)g(h)p
+683 1229 24 2 v 683 1257 a Fn(~)p 683 1265 V 704 1255
+a Ff(i)719 1257 y Fo(')g(is)h(b)q(ound)g(to)e(insert)i(the)f(text)g(`)p
+Fn(Function)f(Key)g(1)p Fo('.)315 1339 y(The)h(follo)o(wing)h
+Fh(gnu)e Fo(Emacs)h(st)o(yle)g(escap)q(e)h(sequences)g(are)e(a)o(v)m
+(ailable)j(when)e(sp)q(ecifying)315 1393 y(k)o(ey)g(sequences:)315
+1475 y Fg(\\C-)168 b Fo(con)o(trol)15 b(pre\014x)315
+1556 y Fg(\\M-)168 b Fo(meta)15 b(pre\014x)315 1638 y
+Fg(\\e)192 b Fo(an)15 b(escap)q(e)h(c)o(haracter)315
+1719 y Fg(\\\\)192 b Fo(bac)o(kslash)315 1801 y Fg(\\)p
+Fn(")555 1799 y Ff(h)p 567 1773 V 567 1801 a Fn(")p 567
+1808 V 589 1799 a Ff(i)604 1801 y Fo(,)15 b(a)f(double)j(quotation)e
+(mark)315 1882 y Fg(\\')555 1880 y Ff(h)p 567 1854 10
+2 v 567 1882 a Fe(')p 567 1890 V 575 1880 a Ff(i)590
+1882 y Fo(,)g(a)f(single)j(quote)e(or)g(ap)q(ostrophe)315
+1964 y(In)f(addition)h(to)f(the)f Fh(gnu)h Fo(Emacs)g(st)o(yle)f(escap)
+q(e)i(sequences,)g(a)e(second)i(set)e(of)h(bac)o(kslash)315
+2018 y(escap)q(es)i(is)g(a)o(v)m(ailable:)315 2100 y
+Fn(\\a)192 b Fo(alert)15 b(\(b)q(ell\))315 2181 y Fn(\\b)192
+b Fo(bac)o(kspace)315 2263 y Fn(\\d)g Fo(delete)315 2344
+y Fn(\\f)g Fo(form)14 b(feed)315 2426 y Fn(\\n)192 b
+Fo(newline)315 2507 y Fn(\\r)g Fo(carriage)15 b(return)315
+2589 y Fn(\\t)192 b Fo(horizon)o(tal)16 b(tab)315 2670
+y Fn(\\v)192 b Fo(v)o(ertical)16 b(tab)p eop
+%%Page: 9 13
+9 12 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077
+b(9)315 149 y Fn(\\)p Fg(nnn)144 b Fo(the)17 b(eigh)o(t-bit)h(c)o
+(haracter)f(whose)g(v)m(alue)i(is)e(the)h(o)q(ctal)f(v)m(alue)i
+Fd(nnn)f Fo(\(one)f(to)555 204 y(three)e(digits\))315
+282 y Fn(\\x)p Fg(HH)144 b Fo(the)20 b(eigh)o(t-bit)g(c)o(haracter)f
+(whose)h(v)m(alue)h(is)f(the)g(hexadecimal)h(v)m(alue)g
+Fd(HH)555 337 y Fo(\(one)15 b(or)g(t)o(w)o(o)f(hex)h(digits\))315
+415 y(When)k(en)o(tering)g(the)g(text)f(of)g(a)h(macro,)f(single)i(or)e
+(double)i(quotes)f(m)o(ust)f(b)q(e)h(used)h(to)315 470
+y(indicate)12 b(a)f(macro)f(de\014nition.)20 b(Unquoted)11
+b(text)f(is)i(assumed)e(to)h(b)q(e)g(a)f(function)i(name.)18
+b(In)315 524 y(the)11 b(macro)f(b)q(o)q(dy)l(,)i(the)f(bac)o(kslash)g
+(escap)q(es)g(describ)q(ed)i(ab)q(o)o(v)o(e)d(are)g(expanded.)20
+b(Bac)o(kslash)315 579 y(will)i(quote)d(an)o(y)h(other)g(c)o(haracter)f
+(in)i(the)f(macro)f(text,)h(including)j(`)p Fn(")p Fo(')c(and)h(`)p
+Fn(')p Fo('.)34 b(F)l(or)315 634 y(example,)14 b(the)f(follo)o(wing)g
+(binding)i(will)g(mak)o(e)d(`)p Fg(C-x)i Fn(\\)p Fo(')f(insert)g(a)g
+(single)h(`)p Fn(\\)p Fo(')e(in)o(to)h(the)g(line:)435
+700 y Fn("\\C-x\\\\":)23 b("\\\\")75 810 y Fc(1.3.2)30
+b(Conditional)20 b(Init)g(Constructs)137 931 y Fo(Readline)f(implemen)o
+(ts)g(a)f(facilit)o(y)g(similar)h(in)g(spirit)f(to)f(the)h(conditional)
+h(compilation)g(features)75 986 y(of)e(the)g(C)g(prepro)q(cessor)g
+(whic)o(h)i(allo)o(ws)e(k)o(ey)g(bindings)i(and)f(v)m(ariable)g
+(settings)f(to)g(b)q(e)h(p)q(erformed)f(as)75 1040 y(the)e(result)h(of)
+f(tests.)k(There)c(are)g(four)g(parser)g(directiv)o(es)h(used.)75
+1118 y Fn($if)168 b Fo(The)16 b Fn($if)f Fo(construct)g(allo)o(ws)h
+(bindings)i(to)d(b)q(e)h(made)g(based)g(on)f(the)h(editing)h(mo)q(de,)f
+(the)315 1173 y(terminal)k(b)q(eing)g(used,)g(or)f(the)g(application)i
+(using)e(Readline.)33 b(The)19 b(text)g(of)f(the)i(test)315
+1228 y(extends)c(to)e(the)h(end)h(of)f(the)g(line;)i(no)e(c)o
+(haracters)f(are)h(required)i(to)d(isolate)i(it.)315
+1306 y Fn(mode)144 b Fo(The)11 b Fn(mode=)e Fo(form)h(of)g(the)h
+Fn($if)f Fo(directiv)o(e)h(is)g(used)g(to)f(test)g(whether)h(Readline)
+555 1361 y(is)k(in)h Fn(emacs)e Fo(or)g Fn(vi)g Fo(mo)q(de.)20
+b(This)c(ma)o(y)e(b)q(e)h(used)g(in)h(conjunction)g(with)f(the)555
+1415 y(`)p Fn(set)f(keymap)p Fo(')f(command,)g(for)h(instance,)g(to)f
+(set)h(bindings)h(in)g(the)f Fn(emacs-)555 1470 y(standard)d
+Fo(and)i Fn(emacs-ctlx)e Fo(k)o(eymaps)h(only)i(if)f(Readline)g(is)g
+(starting)f(out)555 1525 y(in)k Fn(emacs)f Fo(mo)q(de.)315
+1603 y Fn(term)144 b Fo(The)14 b Fn(term=)e Fo(form)h(ma)o(y)g(b)q(e)h
+(used)g(to)f(include)j(terminal-sp)q(eci\014c)g(k)o(ey)d(bind-)555
+1658 y(ings,)19 b(p)q(erhaps)g(to)e(bind)i(the)g(k)o(ey)e(sequences)j
+(output)e(b)o(y)g(the)g(terminal's)555 1712 y(function)13
+b(k)o(eys.)18 b(The)13 b(w)o(ord)e(on)h(the)g(righ)o(t)g(side)g(of)g
+(the)g(`)p Fn(=)p Fo(')f(is)h(tested)g(against)555 1767
+y(b)q(oth)j(the)g(full)i(name)e(of)f(the)h(terminal)h(and)f(the)g(p)q
+(ortion)h(of)e(the)h(terminal)555 1822 y(name)i(b)q(efore)g(the)g
+(\014rst)f(`)p Fn(-)p Fo('.)24 b(This)17 b(allo)o(ws)g
+Fn(sun)f Fo(to)g(matc)o(h)h(b)q(oth)f Fn(sun)h Fo(and)555
+1877 y Fn(sun-cmd)p Fo(,)d(for)g(instance.)315 1955 y
+Fn(application)555 2010 y Fo(The)d Fd(application)i Fo(construct)e(is)g
+(used)h(to)e(include)j(application-sp)q(eci)q(\014c)h(set-)555
+2064 y(tings.)19 b(Eac)o(h)12 b(program)f(using)j(the)e(Readline)i
+(library)f(sets)f(the)g Fd(application)555 2119 y(name)p
+Fo(,)g(and)g(y)o(ou)f(can)h(test)f(for)g(a)g(particular)h(v)m(alue.)20
+b(This)12 b(could)h(b)q(e)f(used)h(to)555 2174 y(bind)18
+b(k)o(ey)e(sequences)i(to)d(functions)j(useful)f(for)f(a)g(sp)q
+(eci\014c)i(program.)23 b(F)l(or)555 2229 y(instance,)17
+b(the)g(follo)o(wing)g(command)g(adds)f(a)g(k)o(ey)h(sequence)g(that)f
+(quotes)555 2283 y(the)f(curren)o(t)g(or)g(previous)h(w)o(ord)e(in)j
+(Bash:)675 2350 y Fn($if)23 b(Bash)675 2405 y(#)h(Quote)f(the)g
+(current)g(or)h(previous)f(word)675 2459 y("\\C-xq":)g
+("\\eb\\"\\ef\\"")675 2514 y($endif)75 2592 y($endif)96
+b Fo(This)16 b(command,)e(as)h(seen)h(in)g(the)f(previous)h(example,)g
+(terminates)f(an)g Fn($if)f Fo(command.)75 2670 y Fn($else)120
+b Fo(Commands)15 b(in)h(this)f(branc)o(h)h(of)e(the)i
+Fn($if)e Fo(directiv)o(e)j(are)e(executed)h(if)g(the)f(test)g(fails.)p
+eop
+%%Page: 10 14
+10 13 bop 75 -58 a Fo(10)1299 b(GNU)15 b(Readline)h(Library)75
+149 y Fn($include)48 b Fo(This)22 b(directiv)o(e)h(tak)o(es)e(a)h
+(single)h(\014lename)g(as)e(an)h(argumen)o(t)f(and)h(reads)f(commands)
+315 204 y(and)e(bindings)j(from)c(that)h(\014le.)33 b(F)l(or)19
+b(example,)i(the)e(follo)o(wing)h(directiv)o(e)h(reads)e(from)315
+259 y(`)p Fn(/etc/inputrc)p Fo(':)435 326 y Fn($include)k(/etc/inputrc)
+75 438 y Fc(1.3.3)30 b(Sample)20 b(Init)h(File)137 560
+y Fo(Here)16 b(is)g(an)f(example)h(of)f(an)g Fd(inputrc)k
+Fo(\014le.)i(This)16 b(illustrates)g(k)o(ey)f(binding,)i(v)m(ariable)f
+(assignmen)o(t,)75 615 y(and)f(conditional)i(syn)o(tax.)p
+eop
+%%Page: 11 15
+11 14 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(11)195 204 y Fn(#)24 b(This)f(file)g(controls)g(the)h(behaviour)e(of)
+i(line)f(input)g(editing)g(for)195 259 y(#)h(programs)e(that)i(use)f
+(the)h(GNU)f(Readline)g(library.)47 b(Existing)195 314
+y(#)24 b(programs)e(include)h(FTP,)h(Bash,)f(and)g(GDB.)195
+369 y(#)195 423 y(#)h(You)f(can)h(re-read)f(the)g(inputrc)g(file)g
+(with)h(C-x)f(C-r.)195 478 y(#)h(Lines)f(beginning)g(with)g('#')g(are)h
+(comments.)195 533 y(#)195 588 y(#)g(First,)f(include)g(any)g
+(systemwide)g(bindings)f(and)i(variable)195 643 y(#)g(assignments)e
+(from)h(/etc/Inputrc)195 697 y($include)g(/etc/Inputrc)195
+807 y(#)195 862 y(#)h(Set)f(various)g(bindings)g(for)g(emacs)g(mode.)
+195 971 y(set)g(editing-mode)g(emacs)195 1081 y($if)g(mode=emacs)195
+1191 y(Meta-Control-h:)46 b(backward-kill-word)21 b(Text)i(after)h(the)
+f(function)g(name)g(is)h(ignored)p 1986 1201 21 38 v
+195 1300 a(#)195 1355 y(#)g(Arrow)f(keys)g(in)h(keypad)f(mode)195
+1410 y(#)195 1465 y(#"\\M-OD":)190 b(backward-char)195
+1519 y(#"\\M-OC":)g(forward-char)195 1574 y(#"\\M-OA":)g
+(previous-history)195 1629 y(#"\\M-OB":)g(next-history)195
+1684 y(#)195 1738 y(#)24 b(Arrow)f(keys)g(in)h(ANSI)f(mode)195
+1793 y(#)195 1848 y("\\M-[D":)190 b(backward-char)195
+1903 y("\\M-[C":)g(forward-char)195 1958 y("\\M-[A":)g
+(previous-history)195 2012 y("\\M-[B":)g(next-history)195
+2067 y(#)195 2122 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(keypad)g(mode)
+195 2177 y(#)195 2232 y(#"\\M-\\C-OD":)165 b(backward-char)195
+2286 y(#"\\M-\\C-OC":)g(forward-char)195 2341 y(#"\\M-\\C-OA":)g
+(previous-history)195 2396 y(#"\\M-\\C-OB":)g(next-history)195
+2451 y(#)195 2506 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(ANSI)g(mode)
+195 2560 y(#)195 2615 y(#"\\M-\\C-[D":)165 b(backward-char)195
+2670 y(#"\\M-\\C-[C":)g(forward-char)p eop
+%%Page: 12 16
+12 15 bop 75 -58 a Fo(12)1299 b(GNU)15 b(Readline)h(Library)195
+149 y Fn(#"\\M-\\C-[A":)165 b(previous-history)195 204
+y(#"\\M-\\C-[B":)g(next-history)195 314 y(C-q:)23 b(quoted-insert)195
+423 y($endif)195 533 y(#)h(An)f(old-style)g(binding.)47
+b(This)23 b(happens)g(to)g(be)h(the)f(default.)195 588
+y(TAB:)g(complete)195 697 y(#)h(Macros)f(that)g(are)h(convenient)e(for)
+h(shell)h(interaction)195 752 y($if)f(Bash)195 807 y(#)h(edit)f(the)g
+(path)195 862 y("\\C-xp":)g("PATH=${PATH}\\e\\C-e\\C-a\\)o(ef\\C-f")195
+917 y(#)h(prepare)f(to)g(type)h(a)f(quoted)g(word)h(--)195
+971 y(#)g(insert)f(open)g(and)h(close)f(double)g(quotes)195
+1026 y(#)h(and)f(move)g(to)h(just)f(after)h(the)f(open)g(quote)195
+1081 y("\\C-x\\"":)g("\\"\\"\\C-b")195 1136 y(#)h(insert)f(a)g
+(backslash)g(\(testing)g(backslash)g(escapes)195 1191
+y(#)h(in)f(sequences)g(and)g(macros\))195 1245 y("\\C-x\\\\":)g("\\\\")
+195 1300 y(#)h(Quote)f(the)g(current)g(or)h(previous)f(word)195
+1355 y("\\C-xq":)g("\\eb\\"\\ef\\"")195 1410 y(#)h(Add)f(a)h(binding)f
+(to)g(refresh)g(the)h(line,)f(which)g(is)h(unbound)195
+1465 y("\\C-xr":)f(redraw-current-line)195 1519 y(#)h(Edit)f(variable)g
+(on)g(current)g(line.)195 1574 y("\\M-\\C-v":)f
+("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-a\\C-y=)o(")195 1629 y($endif)195
+1738 y(#)i(use)f(a)h(visible)f(bell)g(if)h(one)f(is)h(available)195
+1793 y(set)f(bell-style)g(visible)195 1903 y(#)h(don't)f(strip)g
+(characters)g(to)g(7)h(bits)f(when)h(reading)195 1958
+y(set)f(input-meta)g(on)195 2067 y(#)h(allow)f(iso-latin1)f(characters)
+h(to)g(be)h(inserted)f(rather)195 2122 y(#)h(than)f(converted)g(to)g
+(prefix-meta)g(sequences)195 2177 y(set)g(convert-meta)g(off)195
+2286 y(#)h(display)f(characters)f(with)h(the)h(eighth)f(bit)g(set)h
+(directly)195 2341 y(#)g(rather)f(than)g(as)h(meta-prefixed)e
+(characters)195 2396 y(set)h(output-meta)g(on)195 2506
+y(#)h(if)f(there)g(are)h(more)f(than)h(150)f(possible)g(completions)f
+(for)195 2560 y(#)i(a)f(word,)h(ask)f(the)h(user)f(if)g(he)h(wants)f
+(to)h(see)f(all)h(of)f(them)195 2615 y(set)g(completion-query-items)e
+(150)p eop
+%%Page: 13 17
+13 16 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(13)195 149 y Fn(#)24 b(For)f(FTP)195 204 y($if)g(Ftp)195
+259 y("\\C-xg":)g("get)g(\\M-?")195 314 y("\\C-xt":)g("put)g(\\M-?")195
+369 y("\\M-.":)g(yank-last-arg)195 423 y($endif)75 549
+y Fm(1.4)33 b(Bindable)24 b(Readline)f(Commands)137 670
+y Fo(This)17 b(section)f(describ)q(es)h(Readline)g(commands)f(that)e
+(ma)o(y)h(b)q(e)i(b)q(ound)f(to)f(k)o(ey)h(sequences.)22
+b(Com-)75 725 y(mand)15 b(names)g(without)h(an)f(accompan)o(ying)g(k)o
+(ey)g(sequence)i(are)e(un)o(b)q(ound)h(b)o(y)f(default.)137
+791 y(In)f(the)f(follo)o(wing)h(descriptions,)h Fd(p)q(oin)o(t)f
+Fo(refers)f(to)g(the)g(curren)o(t)g(cursor)f(p)q(osition,)j(and)e
+Fd(mark)i Fo(refers)75 846 y(to)k(a)g(cursor)g(p)q(osition)h(sa)o(v)o
+(ed)f(b)o(y)h(the)f Fn(set-mark)g Fo(command.)32 b(The)20
+b(text)f(b)q(et)o(w)o(een)g(the)h(p)q(oin)o(t)g(and)75
+900 y(mark)15 b(is)g(referred)h(to)e(as)h(the)g Fd(region)p
+Fo(.)75 1009 y Fc(1.4.1)30 b(Commands)21 b(F)-5 b(or)19
+b(Mo)n(ving)75 1130 y Fn(beginning-of-line)13 b(\(C-a\))315
+1185 y Fo(Mo)o(v)o(e)h(to)h(the)g(start)f(of)h(the)g(curren)o(t)g
+(line.)75 1263 y Fn(end-of-line)f(\(C-e\))315 1317 y
+Fo(Mo)o(v)o(e)g(to)h(the)g(end)h(of)f(the)g(line.)75
+1395 y Fn(forward-char)f(\(C-f\))315 1450 y Fo(Mo)o(v)o(e)g(forw)o(ard)
+g(a)h(c)o(haracter.)75 1527 y Fn(backward-char)e(\(C-b\))315
+1582 y Fo(Mo)o(v)o(e)h(bac)o(k)h(a)g(c)o(haracter.)75
+1660 y Fn(forward-word)f(\(M-f\))315 1714 y Fo(Mo)o(v)o(e)g(forw)o(ard)
+g(to)g(the)i(end)g(of)e(the)h(next)h(w)o(ord.)j(W)l(ords)c(are)f(comp)q
+(osed)i(of)f(letters)g(and)315 1769 y(digits.)75 1847
+y Fn(backward-word)e(\(M-b\))315 1902 y Fo(Mo)o(v)o(e)j(bac)o(k)g(to)h
+(the)f(start)g(of)g(the)h(curren)o(t)g(or)f(previous)i(w)o(ord.)24
+b(W)l(ords)16 b(are)h(comp)q(osed)315 1956 y(of)e(letters)g(and)g
+(digits.)75 2034 y Fn(clear-screen)f(\(C-l\))315 2089
+y Fo(Clear)f(the)h(screen)g(and)f(redra)o(w)g(the)g(curren)o(t)g(line,)
+i(lea)o(ving)g(the)e(curren)o(t)g(line)i(at)e(the)g(top)315
+2143 y(of)i(the)g(screen.)75 2221 y Fn(redraw-current-line)e(\(\))315
+2276 y Fo(Refresh)i(the)g(curren)o(t)g(line.)22 b(By)15
+b(default,)h(this)f(is)h(un)o(b)q(ound.)75 2385 y Fc(1.4.2)30
+b(Commands)21 b(F)-5 b(or)19 b(Manipulating)i(The)f(History)75
+2506 y Fn(accept-line)14 b(\(Newline)g(or)h(Return\))315
+2560 y Fo(Accept)j(the)g(line)h(regardless)f(of)f(where)h(the)g(cursor)
+f(is.)27 b(If)18 b(this)g(line)h(is)g(non-empt)o(y)l(,)f(it)315
+2615 y(ma)o(y)d(b)q(e)i(added)f(to)g(the)g(history)g(list)g(for)g
+(future)g(recall)h(with)f Fn(add_history\(\))p Fo(.)k(If)d(this)315
+2670 y(line)g(is)f(a)e(mo)q(di\014ed)j(history)e(line,)i(the)e(history)
+g(line)i(is)f(restored)e(to)h(its)g(original)i(state.)p
+eop
+%%Page: 14 18
+14 17 bop 75 -58 a Fo(14)1299 b(GNU)15 b(Readline)h(Library)75
+149 y Fn(previous-history)d(\(C-p\))315 204 y Fo(Mo)o(v)o(e)h(`bac)o
+(k')h(through)f(the)i(history)f(list,)g(fetc)o(hing)h(the)f(previous)h
+(command.)75 293 y Fn(next-history)e(\(C-n\))315 348
+y Fo(Mo)o(v)o(e)g(`forw)o(ard')f(through)i(the)h(history)f(list,)g
+(fetc)o(hing)h(the)f(next)h(command.)75 437 y Fn(beginning-of-history)c
+(\(M-<\))315 492 y Fo(Mo)o(v)o(e)i(to)h(the)g(\014rst)g(line)i(in)f
+(the)f(history)l(.)75 580 y Fn(end-of-history)e(\(M->\))315
+635 y Fo(Mo)o(v)o(e)h(to)h(the)g(end)h(of)f(the)g(input)h(history)l(,)f
+(i.e.,)g(the)g(line)i(curren)o(tly)f(b)q(eing)g(en)o(tered.)75
+724 y Fn(reverse-search-history)c(\(C-r\))315 779 y Fo(Searc)o(h)k(bac)
+o(kw)o(ard)e(starting)h(at)g(the)h(curren)o(t)f(line)j(and)d(mo)o(ving)
+h(`up')f(through)g(the)h(his-)315 834 y(tory)e(as)h(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)75 923
+y Fn(forward-search-history)c(\(C-s\))315 977 y Fo(Searc)o(h)j(forw)o
+(ard)e(starting)h(at)h(the)f(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)
+o(wn')f(through)g(the)h(the)315 1032 y(history)g(as)g(necessary)l(.)20
+b(This)c(is)g(an)f(incremen)o(tal)h(searc)o(h.)75 1121
+y Fn(non-incremental-reverse-se)o(arch-hi)o(story)c(\(M-p\))315
+1176 y Fo(Searc)o(h)k(bac)o(kw)o(ard)e(starting)h(at)g(the)h(curren)o
+(t)f(line)j(and)d(mo)o(ving)h(`up')f(through)g(the)h(his-)315
+1231 y(tory)h(as)h(necessary)g(using)h(a)e(non-incremen)o(tal)j(searc)o
+(h)e(for)f(a)h(string)g(supplied)i(b)o(y)e(the)315 1285
+y(user.)75 1374 y Fn(non-incremental-forward-se)o(arch-hi)o(story)12
+b(\(M-n\))315 1429 y Fo(Searc)o(h)j(forw)o(ard)e(starting)h(at)h(the)f
+(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)o(wn')f(through)g(the)h(the)
+315 1484 y(history)e(as)g(necessary)h(using)g(a)f(non-incremen)o(tal)i
+(searc)o(h)e(for)g(a)g(string)g(supplied)j(b)o(y)d(the)315
+1539 y(user.)75 1627 y Fn(history-search-forward)f(\(\))315
+1682 y Fo(Searc)o(h)21 b(forw)o(ard)e(through)i(the)f(history)h(for)f
+(the)h(string)g(of)f(c)o(haracters)g(b)q(et)o(w)o(een)h(the)315
+1737 y(start)16 b(of)h(the)h(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o
+(t.)28 b(This)18 b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27
+b(By)315 1792 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75
+1881 y Fn(history-search-backward)c(\(\))315 1935 y Fo(Searc)o(h)18
+b(bac)o(kw)o(ard)e(through)h(the)h(history)f(for)g(the)g(string)h(of)f
+(c)o(haracters)f(b)q(et)o(w)o(een)i(the)315 1990 y(start)e(of)h(the)h
+(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o(t.)28 b(This)18
+b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27 b(By)315
+2045 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75
+2134 y Fn(yank-nth-arg)e(\(M-C-y\))315 2189 y Fo(Insert)f(the)g
+(\014rst)g(argumen)o(t)f(to)g(the)i(previous)f(command)g(\(usually)h
+(the)f(second)h(w)o(ord)e(on)315 2244 y(the)j(previous)h(line\))g(at)e
+(p)q(oin)o(t.)21 b(With)15 b(an)g(argumen)o(t)f Fd(n)p
+Fo(,)h(insert)g(the)g Fd(n)p Fo(th)g(w)o(ord)g(from)f(the)315
+2298 y(previous)g(command)g(\(the)f(w)o(ords)f(in)j(the)e(previous)i
+(command)e(b)q(egin)i(with)e(w)o(ord)g(0\).)19 b(A)315
+2353 y(negativ)o(e)13 b(argumen)o(t)f(inserts)h(the)g
+Fd(n)p Fo(th)g(w)o(ord)f(from)g(the)h(end)h(of)e(the)h(previous)g
+(command.)75 2442 y Fn(yank-last-arg)g(\(M-.)i(or)g(M-_\))315
+2497 y Fo(Insert)j(last)f(argumen)o(t)g(to)g(the)g(previous)i(command)e
+(\(the)g(last)h(w)o(ord)f(of)g(the)g(previous)315 2552
+y(history)e(en)o(try\).)20 b(With)15 b(an)g(argumen)o(t,)g(b)q(eha)o(v)
+o(e)g(exactly)h(lik)o(e)g Fn(yank-nth-arg)p Fo(.)j(Succes-)315
+2606 y(siv)o(e)f(calls)g(to)f Fn(yank-last-arg)e Fo(mo)o(v)o(e)i(bac)o
+(k)g(through)g(the)g(history)g(list,)i(inserting)f(the)315
+2661 y(last)d(argumen)o(t)g(of)f(eac)o(h)i(line)g(in)g(turn.)p
+eop
+%%Page: 15 19
+15 18 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(15)75 149 y Fc(1.4.3)30 b(Commands)21 b(F)-5 b(or)19
+b(Changing)i(T)-5 b(ext)75 273 y Fn(delete-char)14 b(\(C-d\))315
+328 y Fo(Delete)20 b(the)g(c)o(haracter)e(at)h(p)q(oin)o(t.)33
+b(If)20 b(p)q(oin)o(t)g(is)g(at)e(the)i(b)q(eginning)i(of)d(the)g
+(line,)j(there)315 383 y(are)c(no)h(c)o(haracters)e(in)j(the)e(line,)j
+(and)e(the)f(last)h(c)o(haracter)e(t)o(yp)q(ed)i(w)o(as)f(not)g(b)q
+(ound)i(to)315 438 y Fn(delete-char)p Fo(,)13 b(then)j(return)f
+Fh(eof)p Fo(.)75 521 y Fn(backward-delete-char)d(\(Rubout\))315
+576 y Fo(Delete)k(the)f(c)o(haracter)f(b)q(ehind)j(the)f(cursor.)j(A)c
+(n)o(umeric)h(argumen)o(t)e(means)i(to)e(kill)j(the)315
+631 y(c)o(haracters)d(instead)i(of)f(deleting)i(them.)75
+714 y Fn(forward-backward-delete-ch)o(ar)12 b(\(\))315
+769 y Fo(Delete)20 b(the)f(c)o(haracter)f(under)i(the)f(cursor,)h
+(unless)g(the)f(cursor)g(is)h(at)e(the)h(end)h(of)f(the)315
+824 y(line,)e(in)g(whic)o(h)g(case)e(the)h(c)o(haracter)g(b)q(ehind)h
+(the)f(cursor)g(is)g(deleted.)23 b(By)16 b(default,)h(this)315
+878 y(is)f(not)f(b)q(ound)h(to)e(a)h(k)o(ey)l(.)75 962
+y Fn(quoted-insert)e(\(C-q)i(or)g(C-v\))315 1017 y Fo(Add)j(the)f(next)
+g(c)o(haracter)g(t)o(yp)q(ed)g(to)f(the)i(line)g(v)o(erbatim.)26
+b(This)18 b(is)f(ho)o(w)g(to)g(insert)g(k)o(ey)315 1071
+y(sequences)f(lik)o(e)h Fg(C-q)p Fo(,)d(for)h(example.)75
+1155 y Fn(tab-insert)f(\(M-)401 1153 y Ff(h)p 412 1127
+74 2 v 412 1155 a Fe(T)m(AB)p 412 1162 V 484 1153 a Ff(i)499
+1155 y Fn(\))315 1210 y Fo(Insert)h(a)g(tab)g(c)o(haracter.)75
+1293 y Fn(self-insert)f(\(a,)g(b,)h(A,)g(1,)g(!,)g(...)o(\))315
+1348 y Fo(Insert)g(y)o(ourself.)75 1431 y Fn(transpose-chars)e(\(C-t\))
+315 1486 y Fo(Drag)i(the)h(c)o(haracter)f(b)q(efore)h(the)h(cursor)e
+(forw)o(ard)g(o)o(v)o(er)g(the)h(c)o(haracter)f(at)h(the)g(cursor,)315
+1541 y(mo)o(ving)i(the)f(cursor)h(forw)o(ard)e(as)i(w)o(ell.)28
+b(If)18 b(the)g(insertion)h(p)q(oin)o(t)f(is)g(at)f(the)h(end)h(of)e
+(the)315 1596 y(line,)c(then)e(this)h(transp)q(oses)e(the)h(last)g(t)o
+(w)o(o)f(c)o(haracters)g(of)h(the)g(line.)20 b(Negativ)o(e)11
+b(argumen)o(ts)315 1650 y(ha)o(v)o(e)k(no)g(e\013ect.)75
+1734 y Fn(transpose-words)e(\(M-t\))315 1789 y Fo(Drag)i(the)h(w)o(ord)
+g(b)q(efore)g(p)q(oin)o(t)h(past)f(the)g(w)o(ord)f(after)h(p)q(oin)o
+(t,)g(mo)o(ving)g(p)q(oin)o(t)h(past)f(that)315 1843
+y(w)o(ord)d(as)h(w)o(ell.)21 b(If)14 b(the)g(insertion)i(p)q(oin)o(t)e
+(is)h(at)f(the)g(end)h(of)e(the)i(line,)g(this)g(transp)q(oses)f(the)
+315 1898 y(last)h(t)o(w)o(o)f(w)o(ords)g(on)i(the)f(line.)75
+1981 y Fn(upcase-word)f(\(M-u\))315 2036 y Fo(Upp)q(ercase)j(the)f
+(curren)o(t)g(\(or)f(follo)o(wing\))h(w)o(ord.)22 b(With)16
+b(a)g(negativ)o(e)g(argumen)o(t,)f(upp)q(er-)315 2091
+y(case)g(the)g(previous)h(w)o(ord,)f(but)g(do)g(not)g(mo)o(v)o(e)f(the)
+i(cursor.)75 2174 y Fn(downcase-word)d(\(M-l\))315 2229
+y Fo(Lo)o(w)o(ercase)d(the)h(curren)o(t)g(\(or)f(follo)o(wing\))h(w)o
+(ord.)17 b(With)11 b(a)g(negativ)o(e)g(argumen)o(t,)f(lo)o(w)o(ercase)
+315 2284 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o(v)o(e)f
+(the)h(cursor.)75 2367 y Fn(capitalize-word)e(\(M-c\))315
+2422 y Fo(Capitalize)f(the)f(curren)o(t)f(\(or)g(follo)o(wing\))h(w)o
+(ord.)18 b(With)11 b(a)f(negativ)o(e)h(argumen)o(t,)f(capitalize)315
+2477 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o(v)o(e)f
+(the)h(cursor.)75 2560 y Fn(overwrite-mode)e(\(\))315
+2615 y Fo(T)l(oggle)j(o)o(v)o(erwrite)g(mo)q(de.)24 b(With)17
+b(an)f(explicit)j(p)q(ositiv)o(e)f(n)o(umeric)f(argumen)o(t,)f(switc)o
+(hes)315 2670 y(to)10 b(o)o(v)o(erwrite)g(mo)q(de.)19
+b(With)11 b(an)g(explicit)i(non-p)q(ositiv)o(e)f(n)o(umeric)g(argumen)o
+(t,)e(switc)o(hes)i(to)p eop
+%%Page: 16 20
+16 19 bop 75 -58 a Fo(16)1299 b(GNU)15 b(Readline)h(Library)315
+149 y(insert)g(mo)q(de.)k(This)c(command)f(a\013ects)g(only)h
+Fn(emacs)e Fo(mo)q(de;)h Fn(vi)g Fo(mo)q(de)h(do)q(es)g(o)o(v)o
+(erwrite)315 204 y(di\013eren)o(tly)l(.)21 b(Eac)o(h)15
+b(call)h(to)f Fn(readline\(\))f Fo(starts)f(in)k(insert)e(mo)q(de.)315
+271 y(In)g(o)o(v)o(erwrite)f(mo)q(de,)h(c)o(haracters)f(b)q(ound)h(to)f
+Fn(self-insert)f Fo(replace)j(the)e(text)h(at)e(p)q(oin)o(t)315
+326 y(rather)20 b(than)h(pushing)h(the)f(text)f(to)g(the)h(righ)o(t.)36
+b(Characters)20 b(b)q(ound)i(to)e Fn(backward-)315 381
+y(delete-char)14 b Fo(replace)i(the)f(c)o(haracter)g(b)q(efore)g(p)q
+(oin)o(t)h(with)f(a)g(space.)315 448 y(By)g(default,)h(this)f(command)g
+(is)h(un)o(b)q(ound.)75 559 y Fc(1.4.4)30 b(Killing)20
+b(And)h(Y)-5 b(anking)75 680 y Fn(kill-line)14 b(\(C-k\))315
+735 y Fo(Kill)j(the)f(text)e(from)h(p)q(oin)o(t)h(to)e(the)h(end)h(of)f
+(the)g(line.)75 814 y Fn(backward-kill-line)e(\(C-x)h(Rubout\))315
+869 y Fo(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g
+(line.)75 948 y Fn(unix-line-discard)e(\(C-u\))315 1003
+y Fo(Kill)k(bac)o(kw)o(ard)e(from)f(the)i(cursor)e(to)h(the)g(b)q
+(eginning)j(of)c(the)i(curren)o(t)f(line.)75 1082 y Fn(kill-whole-line)
+e(\(\))315 1137 y Fo(Kill)20 b(all)g(c)o(haracters)d(on)h(the)h(curren)
+o(t)f(line,)i(no)e(matter)g(where)g(p)q(oin)o(t)h(is.)29
+b(By)19 b(default,)315 1192 y(this)d(is)f(un)o(b)q(ound.)75
+1271 y Fn(kill-word)f(\(M-d\))315 1325 y Fo(Kill)j(from)d(p)q(oin)o(t)h
+(to)f(the)h(end)g(of)f(the)h(curren)o(t)g(w)o(ord,)e(or)i(if)g(b)q(et)o
+(w)o(een)g(w)o(ords,)e(to)i(the)f(end)315 1380 y(of)h(the)g(next)g(w)o
+(ord.)20 b(W)l(ord)14 b(b)q(oundaries)j(are)e(the)g(same)g(as)g
+Fn(forward-word)p Fo(.)75 1459 y Fn(backward-kill-word)e(\(M-)592
+1457 y Ff(h)p 603 1431 73 2 v 603 1459 a Fe(DEL)p 603
+1467 V 674 1457 a Ff(i)689 1459 y Fn(\))315 1514 y Fo(Kill)k(the)d(w)o
+(ord)g(b)q(ehind)i(p)q(oin)o(t.)21 b(W)l(ord)14 b(b)q(oundaries)h(are)f
+(the)h(same)f(as)g Fn(backward-word)p Fo(.)75 1593 y
+Fn(unix-word-rubout)f(\(C-w\))315 1648 y Fo(Kill)18 b(the)e(w)o(ord)f
+(b)q(ehind)j(p)q(oin)o(t,)e(using)h(white)f(space)g(as)g(a)f(w)o(ord)g
+(b)q(oundary)l(.)23 b(The)16 b(killed)315 1703 y(text)f(is)g(sa)o(v)o
+(ed)g(on)g(the)h(kill-ring.)75 1782 y Fn(delete-horizontal-space)c
+(\(\))315 1836 y Fo(Delete)k(all)g(spaces)f(and)h(tabs)e(around)i(p)q
+(oin)o(t.)k(By)15 b(default,)h(this)f(is)h(un)o(b)q(ound.)75
+1915 y Fn(kill-region)e(\(\))315 1970 y Fo(Kill)j(the)f(text)e(in)i
+(the)g(curren)o(t)f(region.)20 b(By)15 b(default,)h(this)f(command)g
+(is)h(un)o(b)q(ound.)75 2049 y Fn(copy-region-as-kill)d(\(\))315
+2104 y Fo(Cop)o(y)j(the)i(text)e(in)i(the)f(region)g(to)g(the)g(kill)h
+(bu\013er,)f(so)g(it)g(can)g(b)q(e)h(y)o(ank)o(ed)f(righ)o(t)g(a)o(w)o
+(a)o(y)l(.)315 2159 y(By)e(default,)h(this)f(command)g(is)h(un)o(b)q
+(ound.)75 2238 y Fn(copy-backward-word)d(\(\))315 2293
+y Fo(Cop)o(y)19 b(the)g(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(to)e(the)i
+(kill)h(bu\013er.)32 b(The)19 b(w)o(ord)g(b)q(oundaries)h(are)f(the)315
+2348 y(same)c(as)g Fn(backward-word)p Fo(.)j(By)d(default,)g(this)h
+(command)f(is)h(un)o(b)q(ound.)75 2427 y Fn(copy-forward-word)d(\(\))
+315 2481 y Fo(Cop)o(y)i(the)h(w)o(ord)e(follo)o(wing)j(p)q(oin)o(t)f
+(to)f(the)g(kill)j(bu\013er.)i(The)c(w)o(ord)f(b)q(oundaries)i(are)e
+(the)315 2536 y(same)g(as)g Fn(forward-word)p Fo(.)j(By)d(default,)h
+(this)f(command)g(is)h(un)o(b)q(ound.)75 2615 y Fn(yank)f(\(C-y\))315
+2670 y Fo(Y)l(ank)g(the)h(top)f(of)f(the)i(kill)h(ring)e(in)o(to)g(the)
+h(bu\013er)f(at)f(p)q(oin)o(t.)p eop
+%%Page: 17 21
+17 20 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(17)75 149 y Fn(yank-pop)14 b(\(M-y\))315 204 y Fo(Rotate)i(the)h
+(kill-ring,)j(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17
+b(can)h(only)g(do)f(this)h(if)f(the)h(prior)315 259 y(command)d(is)h
+Fn(yank)e Fo(or)h Fn(yank-pop)p Fo(.)75 382 y Fc(1.4.5)30
+b(Sp)r(ecifying)20 b(Numeric)h(Argumen)n(ts)75 507 y
+Fn(digit-argument)13 b(\()p Fg(M-0)p Fn(,)i Fg(M-1)p
+Fn(,)f(...)h Fg(M--)p Fn(\))315 562 y Fo(Add)f(this)g(digit)g(to)f(the)
+h(argumen)o(t)e(already)i(accum)o(ulating,)g(or)f(start)f(a)h(new)h
+(argumen)o(t.)315 616 y Fg(M--)h Fo(starts)f(a)h(negativ)o(e)g(argumen)
+o(t.)75 702 y Fn(universal-argument)e(\(\))315 756 y
+Fo(This)g(is)h(another)e(w)o(a)o(y)g(to)g(sp)q(ecify)i(an)f(argumen)o
+(t.)18 b(If)13 b(this)g(command)g(is)g(follo)o(w)o(ed)g(b)o(y)g(one)315
+811 y(or)h(more)h(digits,)g(optionally)h(with)f(a)g(leading)h(min)o(us)
+f(sign,)g(those)g(digits)g(de\014ne)h(the)f(ar-)315 866
+y(gumen)o(t.)k(If)c(the)g(command)f(is)h(follo)o(w)o(ed)g(b)o(y)g
+(digits,)g(executing)g Fn(universal-argument)315 921
+y Fo(again)h(ends)g(the)g(n)o(umeric)h(argumen)o(t,)e(but)h(is)h
+(otherwise)f(ignored.)22 b(As)16 b(a)g(sp)q(ecial)h(case,)315
+976 y(if)g(this)g(command)f(is)h(immediately)h(follo)o(w)o(ed)f(b)o(y)f
+(a)g(c)o(haracter)g(that)g(is)h(neither)g(a)f(digit)315
+1030 y(or)d(min)o(us)i(sign,)f(the)g(argumen)o(t)g(coun)o(t)f(for)h
+(the)g(next)g(command)g(is)g(m)o(ultiplied)j(b)o(y)d(four.)315
+1085 y(The)19 b(argumen)o(t)f(coun)o(t)g(is)h(initially)j(one,)d(so)f
+(executing)i(this)f(function)h(the)e(\014rst)h(time)315
+1140 y(mak)o(es)c(the)h(argumen)o(t)f(coun)o(t)h(four,)f(a)h(second)g
+(time)g(mak)o(es)g(the)g(argumen)o(t)f(coun)o(t)g(six-)315
+1195 y(teen,)g(and)g(so)g(on.)20 b(By)15 b(default,)h(this)f(is)h(not)f
+(b)q(ound)h(to)f(a)g(k)o(ey)l(.)75 1318 y Fc(1.4.6)30
+b(Letting)20 b(Readline)g(T)n(yp)r(e)h(F)-5 b(or)19 b(Y)-5
+b(ou)75 1443 y Fn(complete)14 b(\()305 1441 y Ff(h)p
+317 1414 74 2 v 317 1443 a Fe(T)m(AB)p 317 1450 V 389
+1441 a Ff(i)404 1443 y Fn(\))315 1497 y Fo(A)o(ttempt)c(to)h(p)q
+(erform)g(completion)i(on)e(the)g(text)g(b)q(efore)h(p)q(oin)o(t.)19
+b(The)11 b(actual)h(completion)315 1552 y(p)q(erformed)j(is)h
+(application-sp)q(eci\014)q(c.)23 b(The)15 b(default)h(is)g(\014lename)
+g(completion.)75 1637 y Fn(possible-completions)c(\(M-?\))315
+1692 y Fo(List)k(the)f(p)q(ossible)i(completions)f(of)f(the)g(text)g(b)
+q(efore)h(p)q(oin)o(t.)75 1777 y Fn(insert-completions)d(\(M-*\))315
+1832 y Fo(Insert)j(all)g(completions)g(of)f(the)g(text)g(b)q(efore)h(p)
+q(oin)o(t)f(that)g(w)o(ould)h(ha)o(v)o(e)f(b)q(een)h(generated)315
+1887 y(b)o(y)f Fn(possible-completions)p Fo(.)75 1972
+y Fn(menu-complete)e(\(\))315 2027 y Fo(Similar)g(to)f
+Fn(complete)p Fo(,)f(but)h(replaces)h(the)f(w)o(ord)f(to)g(b)q(e)i
+(completed)f(with)h(a)e(single)j(matc)o(h)315 2082 y(from)k(the)h(list)
+h(of)e(p)q(ossible)j(completions.)32 b(Rep)q(eated)19
+b(execution)h(of)f Fn(menu-complete)315 2136 y Fo(steps)h(through)g
+(the)g(list)h(of)f(p)q(ossible)i(completions,)g(inserting)f(eac)o(h)f
+(matc)o(h)f(in)i(turn.)315 2191 y(A)o(t)d(the)g(end)h(of)f(the)h(list)g
+(of)f(completions,)i(the)e(b)q(ell)j(is)d(rung)h(\(sub)s(ject)f(to)f
+(the)i(setting)315 2246 y(of)f Fn(bell-style)p Fo(\))e(and)i(the)g
+(original)h(text)f(is)g(restored.)28 b(An)19 b(argumen)o(t)e(of)g
+Fd(n)i Fo(mo)o(v)o(es)e Fd(n)315 2301 y Fo(p)q(ositions)h(forw)o(ard)e
+(in)j(the)e(list)h(of)f(matc)o(hes;)h(a)f(negativ)o(e)g(argumen)o(t)g
+(ma)o(y)g(b)q(e)h(used)g(to)315 2356 y(mo)o(v)o(e)g(bac)o(kw)o(ard)h
+(through)g(the)g(list.)32 b(This)20 b(command)f(is)h(in)o(tended)g(to)f
+(b)q(e)h(b)q(ound)g(to)315 2408 y Ff(h)p 327 2382 V 327
+2410 a Fe(T)m(AB)p 327 2418 V 399 2408 a Ff(i)414 2410
+y Fo(,)15 b(but)g(is)h(un)o(b)q(ound)g(b)o(y)f(default.)75
+2496 y Fn(delete-char-or-list)e(\(\))315 2550 y Fo(Deletes)h(the)f(c)o
+(haracter)g(under)h(the)g(cursor)f(if)h(not)f(at)g(the)g(b)q(eginning)j
+(or)d(end)h(of)f(the)g(line)315 2605 y(\(lik)o(e)i Fn(delete-char)p
+Fo(\).)j(If)d(at)f(the)h(end)g(of)f(the)g(line,)i(b)q(eha)o(v)o(es)f
+(iden)o(tically)i(to)d Fn(possible-)315 2660 y(completions)p
+Fo(.)k(This)e(command)f(is)h(un)o(b)q(ound)g(b)o(y)f(default.)p
+eop
+%%Page: 18 22
+18 21 bop 75 -58 a Fo(18)1299 b(GNU)15 b(Readline)h(Library)75
+149 y Fc(1.4.7)30 b(Keyb)r(oard)20 b(Macros)75 272 y
+Fn(start-kbd-macro)13 b(\(C-x)i(\(\))315 327 y Fo(Begin)h(sa)o(ving)f
+(the)h(c)o(haracters)e(t)o(yp)q(ed)i(in)o(to)f(the)g(curren)o(t)g(k)o
+(eyb)q(oard)g(macro.)75 409 y Fn(end-kbd-macro)e(\(C-x)i(\)\))315
+464 y Fo(Stop)f(sa)o(ving)f(the)h(c)o(haracters)f(t)o(yp)q(ed)h(in)o
+(to)f(the)h(curren)o(t)g(k)o(eyb)q(oard)f(macro)g(and)h(sa)o(v)o(e)f
+(the)315 519 y(de\014nition.)75 600 y Fn(call-last-kbd-macro)g(\(C-x)h
+(e\))315 655 y Fo(Re-execute)k(the)g(last)f(k)o(eyb)q(oard)h(macro)f
+(de\014ned,)i(b)o(y)e(making)h(the)g(c)o(haracters)e(in)j(the)315
+710 y(macro)14 b(app)q(ear)i(as)f(if)g(t)o(yp)q(ed)h(at)e(the)i(k)o
+(eyb)q(oard.)75 826 y Fc(1.4.8)30 b(Some)20 b(Miscellaneous)h(Commands)
+75 949 y Fn(re-read-init-file)13 b(\(C-x)h(C-r\))315
+1004 y Fo(Read)d(in)g(the)g(con)o(ten)o(ts)g(of)f(the)h
+Fd(inputrc)k Fo(\014le,)d(and)g(incorp)q(orate)f(an)o(y)f(bindings)j
+(or)e(v)m(ariable)315 1058 y(assignmen)o(ts)k(found)h(there.)75
+1140 y Fn(abort)e(\(C-g\))315 1195 y Fo(Ab)q(ort)f(the)g(curren)o(t)h
+(editing)g(command)f(and)h(ring)f(the)h(terminal's)f(b)q(ell)i(\(sub)s
+(ject)e(to)g(the)315 1250 y(setting)i(of)g Fn(bell-style)p
+Fo(\).)75 1331 y Fn(do-uppercase-version)d(\(M-a,)j(M-b,)f(M-)p
+Fg(x)p Fn(,)h(...\))315 1386 y Fo(If)f(the)g(meta\014ed)g(c)o(haracter)
+f Fd(x)k Fo(is)d(lo)o(w)o(ercase,)g(run)g(the)g(command)f(that)h(is)g
+(b)q(ound)h(to)e(the)315 1441 y(corresp)q(onding)j(upp)q(ercase)g(c)o
+(haracter.)75 1523 y Fn(prefix-meta)e(\()377 1521 y Ff(h)p
+389 1494 70 2 v 389 1523 a Fe(ESC)p 389 1530 V 456 1521
+a Ff(i)471 1523 y Fn(\))315 1577 y Fo(Metafy)k(the)h(next)g(c)o
+(haracter)f(t)o(yp)q(ed.)30 b(This)20 b(is)f(for)f(k)o(eyb)q(oards)h
+(without)g(a)f(meta)g(k)o(ey)l(.)315 1632 y(T)o(yping)e(`)485
+1630 y Ff(h)p 496 1604 V 496 1632 a Fe(ESC)p 496 1640
+V 563 1630 a Ff(i)593 1632 y Fn(f)p Fo(')f(is)h(equiv)m(alen)o(t)h(to)d
+(t)o(yping)i Fg(M-f)p Fo(.)75 1714 y Fn(undo)f(\(C-_)f(or)h(C-x)g
+(C-u\))315 1769 y Fo(Incremen)o(tal)h(undo,)f(separately)h(remem)o(b)q
+(ered)g(for)e(eac)o(h)h(line.)75 1850 y Fn(revert-line)f(\(M-r\))315
+1905 y Fo(Undo)j(all)g(c)o(hanges)g(made)f(to)g(this)h(line.)26
+b(This)17 b(is)g(lik)o(e)h(executing)f(the)g Fn(undo)f
+Fo(command)315 1960 y(enough)g(times)f(to)g(get)f(bac)o(k)h(to)g(the)g
+(b)q(eginning.)75 2041 y Fn(tilde-expand)f(\(M-~\))315
+2096 y Fo(P)o(erform)g(tilde)j(expansion)f(on)f(the)g(curren)o(t)g(w)o
+(ord.)75 2178 y Fn(set-mark)f(\(C-@\))315 2233 y Fo(Set)i(the)h(mark)f
+(to)f(the)i(p)q(oin)o(t.)24 b(If)17 b(a)f(n)o(umeric)h(argumen)o(t)f
+(is)g(supplied,)j(the)e(mark)e(is)i(set)315 2287 y(to)e(that)f(p)q
+(osition.)75 2369 y Fn(exchange-point-and-mark)e(\(C-x)j(C-x\))315
+2424 y Fo(Sw)o(ap)g(the)h(p)q(oin)o(t)g(with)g(the)g(mark.)k(The)c
+(curren)o(t)f(cursor)h(p)q(osition)g(is)g(set)g(to)f(the)g(sa)o(v)o(ed)
+315 2479 y(p)q(osition,)h(and)f(the)h(old)f(cursor)g(p)q(osition)h(is)g
+(sa)o(v)o(ed)f(as)g(the)g(mark.)75 2560 y Fn(character-search)e
+(\(C-]\))315 2615 y Fo(A)f(c)o(haracter)g(is)h(read)g(and)f(p)q(oin)o
+(t)h(is)g(mo)o(v)o(ed)f(to)g(the)g(next)h(o)q(ccurrence)g(of)f(that)g
+(c)o(haracter.)315 2670 y(A)j(negativ)o(e)h(coun)o(t)f(searc)o(hes)g
+(for)f(previous)i(o)q(ccurrences.)p eop
+%%Page: 19 23
+19 22 bop 75 -58 a Fo(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055
+b(19)75 149 y Fn(character-search-backward)12 b(\(M-C-]\))315
+204 y Fo(A)22 b(c)o(haracter)g(is)h(read)f(and)h(p)q(oin)o(t)g(is)g(mo)
+o(v)o(ed)f(to)g(the)g(previous)h(o)q(ccurrence)h(of)e(that)315
+259 y(c)o(haracter.)d(A)c(negativ)o(e)h(coun)o(t)f(searc)o(hes)g(for)f
+(subsequen)o(t)i(o)q(ccurrences.)75 339 y Fn(insert-comment)d(\(M-#\))
+315 394 y Fo(Without)18 b(a)f(n)o(umeric)i(argumen)o(t,)e(the)h(v)m
+(alue)h(of)f(the)f Fn(comment-begin)f Fo(v)m(ariable)k(is)e(in-)315
+448 y(serted)e(at)f(the)h(b)q(eginning)i(of)d(the)h(curren)o(t)g(line.)
+23 b(If)16 b(a)g(n)o(umeric)h(argumen)o(t)e(is)h(supplied,)315
+503 y(this)j(command)f(acts)g(as)f(a)h(toggle:)26 b(if)19
+b(the)f(c)o(haracters)g(at)f(the)i(b)q(eginning)h(of)e(the)g(line)315
+558 y(do)d(not)g(matc)o(h)g(the)g(v)m(alue)i(of)e Fn(comment-begin)p
+Fo(,)e(the)i(v)m(alue)i(is)f(inserted,)f(otherwise)h(the)315
+613 y(c)o(haracters)j(in)i Fn(comment-begin)d Fo(are)i(deleted)i(from)d
+(the)h(b)q(eginning)i(of)e(the)g(line.)36 b(In)315 667
+y(either)16 b(case,)f(the)g(line)i(is)f(accepted)f(as)g(if)h(a)f
+(newline)i(had)e(b)q(een)i(t)o(yp)q(ed.)75 747 y Fn(dump-functions)c
+(\(\))315 802 y Fo(Prin)o(t)g(all)h(of)f(the)g(functions)h(and)g(their)
+g(k)o(ey)f(bindings)i(to)d(the)i(Readline)g(output)f(stream.)315
+857 y(If)j(a)g(n)o(umeric)g(argumen)o(t)f(is)i(supplied,)h(the)e
+(output)f(is)i(formatted)d(in)j(suc)o(h)f(a)g(w)o(a)o(y)f(that)315
+912 y(it)g(can)h(b)q(e)g(made)f(part)f(of)h(an)g Fd(inputrc)k
+Fo(\014le.)i(This)16 b(command)f(is)h(un)o(b)q(ound)g(b)o(y)f(default.)
+75 991 y Fn(dump-variables)e(\(\))315 1046 y Fo(Prin)o(t)e(all)g(of)f
+(the)h(settable)g(v)m(ariables)h(and)f(their)g(v)m(alues)h(to)e(the)h
+(Readline)h(output)e(stream.)315 1101 y(If)16 b(a)g(n)o(umeric)g
+(argumen)o(t)f(is)i(supplied,)h(the)e(output)f(is)i(formatted)d(in)j
+(suc)o(h)f(a)g(w)o(a)o(y)f(that)315 1156 y(it)g(can)h(b)q(e)g(made)f
+(part)f(of)h(an)g Fd(inputrc)k Fo(\014le.)i(This)16 b(command)f(is)h
+(un)o(b)q(ound)g(b)o(y)f(default.)75 1235 y Fn(dump-macros)f(\(\))315
+1290 y Fo(Prin)o(t)j(all)h(of)e(the)h(Readline)h(k)o(ey)f(sequences)h
+(b)q(ound)g(to)e(macros)g(and)h(the)g(strings)g(they)315
+1345 y(output.)26 b(If)18 b(a)f(n)o(umeric)h(argumen)o(t)f(is)h
+(supplied,)i(the)d(output)g(is)h(formatted)e(in)j(suc)o(h)e(a)315
+1400 y(w)o(a)o(y)d(that)g(it)i(can)f(b)q(e)g(made)g(part)g(of)f(an)h
+Fd(inputrc)k Fo(\014le.)i(This)15 b(command)g(is)h(un)o(b)q(ound)g(b)o
+(y)315 1455 y(default.)75 1534 y Fn(emacs-editing-mode)d(\(C-e\))315
+1589 y Fo(When)j(in)g Fn(vi)e Fo(command)i(mo)q(de,)f(this)g(causes)h
+(a)f(switc)o(h)g(to)g Fn(emacs)f Fo(editing)j(mo)q(de.)75
+1669 y Fn(vi-editing-mode)c(\(M-C-j\))315 1724 y Fo(When)j(in)g
+Fn(emacs)e Fo(editing)j(mo)q(de,)e(this)g(causes)h(a)f(switc)o(h)g(to)g
+Fn(vi)f Fo(editing)j(mo)q(de.)75 1852 y Fm(1.5)33 b(Readline)23
+b(vi)h(Mo)r(de)137 1974 y Fo(While)13 b(the)f(Readline)i(library)e(do)q
+(es)g(not)g(ha)o(v)o(e)f(a)h(full)h(set)f(of)f Fn(vi)g
+Fo(editing)j(functions,)f(it)f(do)q(es)g(con)o(tain)75
+2029 y(enough)17 b(to)g(allo)o(w)g(simple)h(editing)h(of)d(the)i(line.)
+27 b(The)17 b(Readline)h Fn(vi)f Fo(mo)q(de)g(b)q(eha)o(v)o(es)g(as)g
+(sp)q(eci\014ed)i(in)75 2084 y(the)c Fh(posix)g Fo(1003.2)f(standard.)
+137 2151 y(In)h(order)g(to)f(switc)o(h)g(in)o(teractiv)o(ely)i(b)q(et)o
+(w)o(een)f Fn(emacs)e Fo(and)i Fn(vi)f Fo(editing)i(mo)q(des,)f(use)f
+(the)h(command)75 2206 y Fg(M-C-j)j Fo(\(b)q(ound)i(to)e
+(emacs-editing-mo)q(de)j(when)e(in)h Fn(vi)f Fo(mo)q(de)g(and)g(to)f
+(vi-editing-mo)q(de)k(in)e Fn(emacs)75 2261 y Fo(mo)q(de\).)g(The)15
+b(Readline)i(default)f(is)f Fn(emacs)g Fo(mo)q(de.)137
+2328 y(When)h(y)o(ou)e(en)o(ter)h(a)g(line)i(in)e Fn(vi)g
+Fo(mo)q(de,)g(y)o(ou)g(are)f(already)i(placed)g(in)g(`insertion')f(mo)q
+(de,)g(as)g(if)g(y)o(ou)75 2383 y(had)e(t)o(yp)q(ed)h(an)f(`)p
+Fn(i)p Fo('.)18 b(Pressing)608 2381 y Ff(h)p 620 2355
+70 2 v 620 2383 a Fe(ESC)p 620 2390 V 687 2381 a Ff(i)715
+2383 y Fo(switc)o(hes)13 b(y)o(ou)g(in)o(to)g(`command')f(mo)q(de,)i
+(where)f(y)o(ou)g(can)g(edit)h(the)75 2438 y(text)i(of)h(the)g(line)h
+(with)g(the)f(standard)f Fn(vi)h Fo(mo)o(v)o(emen)o(t)f(k)o(eys,)g(mo)o
+(v)o(e)g(to)h(previous)g(history)g(lines)i(with)75 2492
+y(`)p Fn(k)p Fo(')14 b(and)i(subsequen)o(t)f(lines)i(with)f(`)p
+Fn(j)p Fo(',)e(and)h(so)g(forth.)p eop
+%%Page: 20 24
+20 23 bop 75 -58 a Fo(20)1299 b(GNU)15 b(Readline)h(Library)p
+eop
+%%Page: 21 25
+21 24 bop 75 -58 a Fo(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(21)75 149 y Fk(App)r(endix)25 b(A)20 b(Cop)n(ying)26
+b(This)g(Man)n(ual)75 345 y Fm(A.1)33 b(GNU)21 b(F)-6
+b(ree)23 b(Do)r(cumen)n(tation)g(License)698 455 y Fo(V)l(ersion)16
+b(1.2,)e(No)o(v)o(em)o(b)q(er)h(2002)195 526 y(Cop)o(yrigh)o(t)421
+525 y(c)409 526 y Fl(\015)f Fo(2000,2001,200)o(2)e(F)l(ree)j(Soft)o(w)o
+(are)f(F)l(oundation,)h(Inc.)195 581 y(59)g(T)l(emple)h(Place,)f(Suite)
+i(330,)d(Boston,)g(MA)30 b(02111-1307,)12 b(USA)195 690
+y(Ev)o(ery)o(one)j(is)g(p)q(ermitted)h(to)f(cop)o(y)g(and)g(distribute)
+i(v)o(erbatim)e(copies)195 745 y(of)g(this)g(license)j(do)q(cumen)o(t,)
+d(but)g(c)o(hanging)h(it)f(is)h(not)f(allo)o(w)o(ed.)100
+816 y(0.)29 b(PREAMBLE)165 885 y(The)19 b(purp)q(ose)g(of)f(this)h
+(License)i(is)e(to)f(mak)o(e)g(a)g(man)o(ual,)h(textb)q(o)q(ok,)g(or)f
+(other)g(functional)i(and)165 940 y(useful)c(do)q(cumen)o(t)g
+Fd(free)h Fo(in)f(the)f(sense)h(of)f(freedom:)k(to)c(assure)g(ev)o(ery)
+o(one)f(the)i(e\013ectiv)o(e)f(freedom)165 995 y(to)g(cop)o(y)h(and)g
+(redistribute)h(it,)e(with)h(or)f(without)h(mo)q(difying)h(it,)f
+(either)g(commercially)h(or)f(non-)165 1050 y(commercially)l(.)28
+b(Secondarily)l(,)19 b(this)f(License)h(preserv)o(es)e(for)g(the)g
+(author)g(and)h(publisher)h(a)e(w)o(a)o(y)165 1104 y(to)g(get)h(credit)
+h(for)e(their)i(w)o(ork,)e(while)j(not)e(b)q(eing)h(considered)g(resp)q
+(onsible)h(for)e(mo)q(di\014cations)165 1159 y(made)d(b)o(y)g(others.)
+165 1228 y(This)d(License)i(is)e(a)f(kind)i(of)e(\\cop)o(yleft",)g
+(whic)o(h)i(means)e(that)g(deriv)m(ativ)o(e)i(w)o(orks)e(of)g(the)h(do)
+q(cumen)o(t)165 1283 y(m)o(ust)k(themselv)o(es)i(b)q(e)g(free)e(in)i
+(the)f(same)g(sense.)26 b(It)16 b(complemen)o(ts)i(the)f(GNU)g(General)
+g(Public)165 1338 y(License,)g(whic)o(h)f(is)f(a)g(cop)o(yleft)h
+(license)h(designed)f(for)f(free)g(soft)o(w)o(are.)165
+1407 y(W)l(e)g(ha)o(v)o(e)f(designed)i(this)g(License)g(in)g(order)e
+(to)g(use)h(it)g(for)g(man)o(uals)f(for)g(free)h(soft)o(w)o(are,)e(b)q
+(ecause)165 1462 y(free)21 b(soft)o(w)o(are)e(needs)j(free)f(do)q
+(cumen)o(tation:)32 b(a)21 b(free)g(program)f(should)i(come)f(with)h
+(man)o(uals)165 1517 y(pro)o(viding)15 b(the)g(same)f(freedoms)g(that)g
+(the)g(soft)o(w)o(are)f(do)q(es.)20 b(But)14 b(this)h(License)h(is)f
+(not)f(limited)j(to)165 1571 y(soft)o(w)o(are)d(man)o(uals;)h(it)g(can)
+h(b)q(e)g(used)g(for)e(an)o(y)h(textual)h(w)o(ork,)e(regardless)h(of)g
+(sub)s(ject)g(matter)f(or)165 1626 y(whether)i(it)g(is)g(published)i
+(as)e(a)f(prin)o(ted)i(b)q(o)q(ok.)k(W)l(e)16 b(recommend)g(this)g
+(License)i(principally)h(for)165 1681 y(w)o(orks)14 b(whose)h(purp)q
+(ose)h(is)g(instruction)g(or)f(reference.)100 1750 y(1.)29
+b(APPLICABILITY)17 b(AND)e(DEFINITIONS)165 1819 y(This)21
+b(License)g(applies)h(to)d(an)o(y)h(man)o(ual)g(or)f(other)h(w)o(ork,)g
+(in)h(an)o(y)e(medium,)j(that)d(con)o(tains)h(a)165 1874
+y(notice)h(placed)h(b)o(y)f(the)g(cop)o(yrigh)o(t)f(holder)i(sa)o(ying)
+f(it)g(can)g(b)q(e)g(distributed)h(under)g(the)f(terms)165
+1929 y(of)d(this)h(License.)33 b(Suc)o(h)19 b(a)g(notice)g(gran)o(ts)e
+(a)i(w)o(orld-wide,)h(ro)o(y)o(alt)o(y-free)e(license,)j(unlimited)g
+(in)165 1984 y(duration,)j(to)e(use)h(that)f(w)o(ork)g(under)h(the)g
+(conditions)h(stated)e(herein.)43 b(The)23 b(\\Do)q(cumen)o(t",)165
+2039 y(b)q(elo)o(w,)15 b(refers)f(to)f(an)o(y)h(suc)o(h)g(man)o(ual)h
+(or)e(w)o(ork.)19 b(An)o(y)14 b(mem)o(b)q(er)h(of)e(the)i(public)h(is)f
+(a)f(licensee,)i(and)165 2093 y(is)d(addressed)g(as)f(\\y)o(ou".)18
+b(Y)l(ou)13 b(accept)g(the)f(license)j(if)e(y)o(ou)f(cop)o(y)l(,)h(mo)q
+(dify)g(or)f(distribute)h(the)g(w)o(ork)165 2148 y(in)j(a)f(w)o(a)o(y)f
+(requiring)j(p)q(ermission)f(under)g(cop)o(yrigh)o(t)f(la)o(w.)165
+2217 y(A)i(\\Mo)q(di\014ed)h(V)l(ersion")f(of)f(the)h(Do)q(cumen)o(t)g
+(means)g(an)o(y)f(w)o(ork)g(con)o(taining)i(the)f(Do)q(cumen)o(t)f(or)
+165 2272 y(a)i(p)q(ortion)h(of)g(it,)g(either)h(copied)g(v)o(erbatim,)f
+(or)f(with)h(mo)q(di\014cations)h(and/or)e(translated)h(in)o(to)165
+2327 y(another)c(language.)165 2396 y(A)e(\\Secondary)g(Section")h(is)f
+(a)g(named)g(app)q(endix)i(or)d(a)h(fron)o(t-matter)e(section)i(of)g
+(the)g(Do)q(cumen)o(t)165 2451 y(that)d(deals)h(exclusiv)o(ely)i(with)e
+(the)g(relationship)h(of)f(the)f(publishers)j(or)d(authors)g(of)g(the)h
+(Do)q(cumen)o(t)165 2506 y(to)18 b(the)h(Do)q(cumen)o(t's)f(o)o(v)o
+(erall)h(sub)s(ject)f(\(or)g(to)g(related)h(matters\))e(and)i(con)o
+(tains)g(nothing)g(that)165 2560 y(could)i(fall)g(directly)h(within)f
+(that)e(o)o(v)o(erall)i(sub)s(ject.)34 b(\(Th)o(us,)21
+b(if)g(the)f(Do)q(cumen)o(t)g(is)h(in)g(part)e(a)165
+2615 y(textb)q(o)q(ok)12 b(of)f(mathematics,)h(a)f(Secondary)h(Section)
+h(ma)o(y)e(not)h(explain)h(an)o(y)f(mathematics.\))18
+b(The)165 2670 y(relationship)d(could)g(b)q(e)f(a)g(matter)e(of)i
+(historical)g(connection)h(with)f(the)g(sub)s(ject)f(or)h(with)g
+(related)p eop
+%%Page: 22 26
+22 25 bop 75 -58 a Fo(22)1299 b(GNU)15 b(Readline)h(Library)165
+149 y(matters,)h(or)g(of)g(legal,)i(commercial,)g(philosophical,)i
+(ethical)e(or)e(p)q(olitical)j(p)q(osition)f(regarding)165
+204 y(them.)165 275 y(The)13 b(\\In)o(v)m(arian)o(t)g(Sections")g(are)g
+(certain)g(Secondary)g(Sections)h(whose)f(titles)g(are)g(designated,)g
+(as)165 329 y(b)q(eing)i(those)e(of)g(In)o(v)m(arian)o(t)g(Sections,)h
+(in)h(the)e(notice)h(that)e(sa)o(ys)h(that)g(the)g(Do)q(cumen)o(t)g(is)
+h(released)165 384 y(under)h(this)f(License.)21 b(If)14
+b(a)g(section)g(do)q(es)g(not)g(\014t)f(the)h(ab)q(o)o(v)o(e)g
+(de\014nition)i(of)d(Secondary)h(then)g(it)g(is)165 439
+y(not)i(allo)o(w)o(ed)g(to)f(b)q(e)i(designated)g(as)e(In)o(v)m(arian)o
+(t.)22 b(The)17 b(Do)q(cumen)o(t)e(ma)o(y)h(con)o(tain)g(zero)g(In)o(v)
+m(arian)o(t)165 494 y(Sections.)k(If)12 b(the)h(Do)q(cumen)o(t)f(do)q
+(es)h(not)f(iden)o(tify)h(an)o(y)f(In)o(v)m(arian)o(t)h(Sections)g
+(then)g(there)f(are)g(none.)165 564 y(The)19 b(\\Co)o(v)o(er)e(T)l
+(exts")g(are)h(certain)h(short)f(passages)g(of)f(text)h(that)g(are)g
+(listed,)i(as)e(F)l(ron)o(t-Co)o(v)o(er)165 619 y(T)l(exts)12
+b(or)g(Bac)o(k-Co)o(v)o(er)g(T)l(exts,)g(in)i(the)e(notice)h(that)f(sa)
+o(ys)g(that)g(the)g(Do)q(cumen)o(t)h(is)g(released)g(under)165
+674 y(this)g(License.)21 b(A)13 b(F)l(ron)o(t-Co)o(v)o(er)e(T)l(ext)i
+(ma)o(y)f(b)q(e)i(at)e(most)g(5)h(w)o(ords,)f(and)h(a)g(Bac)o(k-Co)o(v)
+o(er)f(T)l(ext)h(ma)o(y)165 729 y(b)q(e)j(at)e(most)h(25)f(w)o(ords.)
+165 799 y(A)k(\\T)l(ransparen)o(t")e(cop)o(y)i(of)f(the)h(Do)q(cumen)o
+(t)g(means)f(a)h(mac)o(hine-readable)h(cop)o(y)l(,)f(represen)o(ted)165
+854 y(in)h(a)e(format)g(whose)g(sp)q(eci\014cation)j(is)f(a)o(v)m
+(ailable)g(to)e(the)h(general)h(public,)h(that)d(is)h(suitable)i(for)
+165 909 y(revising)d(the)f(do)q(cumen)o(t)g(straigh)o(tforw)o(ardly)f
+(with)h(generic)h(text)e(editors)h(or)f(\(for)g(images)h(com-)165
+964 y(p)q(osed)c(of)g(pixels\))h(generic)g(pain)o(t)f(programs)f(or)g
+(\(for)g(dra)o(wings\))h(some)f(widely)i(a)o(v)m(ailable)h(dra)o(wing)
+165 1018 y(editor,)h(and)f(that)g(is)h(suitable)h(for)e(input)h(to)f
+(text)g(formatters)f(or)h(for)g(automatic)g(translation)h(to)165
+1073 y(a)e(v)m(ariet)o(y)h(of)f(formats)f(suitable)i(for)f(input)i(to)d
+(text)h(formatters.)18 b(A)13 b(cop)o(y)h(made)f(in)h(an)g(otherwise)
+165 1128 y(T)l(ransparen)o(t)k(\014le)i(format)d(whose)i(markup,)g(or)g
+(absence)g(of)g(markup,)g(has)f(b)q(een)i(arranged)f(to)165
+1183 y(th)o(w)o(art)12 b(or)g(discourage)i(subsequen)o(t)g(mo)q
+(di\014cation)h(b)o(y)e(readers)g(is)h(not)f(T)l(ransparen)o(t.)18
+b(An)c(image)165 1238 y(format)i(is)i(not)e(T)l(ransparen)o(t)h(if)h
+(used)f(for)g(an)o(y)g(substan)o(tial)g(amoun)o(t)g(of)f(text.)26
+b(A)17 b(cop)o(y)g(that)f(is)165 1292 y(not)f(\\T)l(ransparen)o(t")f
+(is)i(called)g(\\Opaque".)165 1363 y(Examples)27 b(of)f(suitable)i
+(formats)d(for)h(T)l(ransparen)o(t)g(copies)h(include)i(plain)f
+Fh(asci)q(i)e Fo(without)165 1418 y(markup,)20 b(T)l(exinfo)h(input)g
+(format,)e(LaT)887 1427 y(E)913 1418 y(X)h(input)h(format,)e
+Fh(sgml)h Fo(or)f Fh(xml)h Fo(using)h(a)e(publicly)165
+1472 y(a)o(v)m(ailable)e Fh(dtd)p Fo(,)g(and)f(standard-conforming)f
+(simple)i Fh(html)p Fo(,)f(P)o(ostScript)f(or)h Fh(pdf)g
+Fo(designed)i(for)165 1527 y(h)o(uman)h(mo)q(di\014cation.)33
+b(Examples)19 b(of)g(transparen)o(t)f(image)h(formats)f(include)k
+Fh(png)p Fo(,)e Fh(x)o(cf)f Fo(and)165 1582 y Fh(jpg)p
+Fo(.)32 b(Opaque)20 b(formats)e(include)j(proprietary)e(formats)f(that)
+g(can)h(b)q(e)h(read)f(and)g(edited)h(only)165 1637 y(b)o(y)g
+(proprietary)f(w)o(ord)g(pro)q(cessors,)h Fh(sgml)g Fo(or)f
+Fh(xml)h Fo(for)f(whic)o(h)i(the)f Fh(dtd)g Fo(and/or)f(pro)q(cessing)
+165 1692 y(to)q(ols)c(are)h(not)f(generally)h(a)o(v)m(ailable,)h(and)f
+(the)f(mac)o(hine-generated)i Fh(html)p Fo(,)e(P)o(ostScript)g(or)g
+Fh(pdf)165 1746 y Fo(pro)q(duced)h(b)o(y)f(some)g(w)o(ord)g(pro)q
+(cessors)g(for)f(output)h(purp)q(oses)h(only)l(.)165
+1817 y(The)h(\\Title)h(P)o(age")e(means,)i(for)e(a)h(prin)o(ted)h(b)q
+(o)q(ok,)f(the)g(title)h(page)f(itself,)i(plus)f(suc)o(h)f(follo)o
+(wing)165 1872 y(pages)d(as)f(are)h(needed)h(to)e(hold,)i(legibly)l(,)g
+(the)f(material)g(this)h(License)g(requires)g(to)e(app)q(ear)h(in)h
+(the)165 1926 y(title)f(page.)19 b(F)l(or)13 b(w)o(orks)f(in)i(formats)
+e(whic)o(h)i(do)f(not)g(ha)o(v)o(e)g(an)o(y)g(title)h(page)f(as)g(suc)o
+(h,)h(\\Title)g(P)o(age")165 1981 y(means)h(the)h(text)e(near)i(the)f
+(most)g(prominen)o(t)g(app)q(earance)h(of)f(the)g(w)o(ork's)f(title,)i
+(preceding)h(the)165 2036 y(b)q(eginning)g(of)e(the)g(b)q(o)q(dy)h(of)f
+(the)g(text.)165 2106 y(A)g(section)g(\\En)o(titled)h(XYZ")e(means)h(a)
+g(named)g(subunit)h(of)e(the)h(Do)q(cumen)o(t)g(whose)g(title)g(either)
+165 2161 y(is)f(precisely)i(XYZ)e(or)f(con)o(tains)h(XYZ)g(in)h(paren)o
+(theses)f(follo)o(wing)g(text)g(that)f(translates)g(XYZ)h(in)165
+2216 y(another)e(language.)19 b(\(Here)13 b(XYZ)f(stands)g(for)g(a)g
+(sp)q(eci\014c)j(section)e(name)f(men)o(tioned)h(b)q(elo)o(w,)h(suc)o
+(h)165 2271 y(as)g(\\Ac)o(kno)o(wledgemen)o(ts",)f(\\Dedications",)i
+(\\Endorsemen)o(ts",)e(or)g(\\History".\))19 b(T)l(o)13
+b(\\Preserv)o(e)165 2326 y(the)k(Title")g(of)g(suc)o(h)g(a)f(section)i
+(when)f(y)o(ou)f(mo)q(dify)i(the)f(Do)q(cumen)o(t)f(means)h(that)f(it)h
+(remains)g(a)165 2380 y(section)f(\\En)o(titled)g(XYZ")e(according)i
+(to)f(this)g(de\014nition.)165 2451 y(The)f(Do)q(cumen)o(t)g(ma)o(y)f
+(include)j(W)l(arran)o(t)o(y)c(Disclaimers)j(next)f(to)g(the)g(notice)g
+(whic)o(h)h(states)e(that)165 2506 y(this)k(License)i(applies)g(to)d
+(the)h(Do)q(cumen)o(t.)25 b(These)17 b(W)l(arran)o(t)o(y)e(Disclaimers)
+k(are)d(considered)j(to)165 2560 y(b)q(e)g(included)j(b)o(y)d
+(reference)g(in)h(this)f(License,)i(but)e(only)g(as)g(regards)f
+(disclaiming)j(w)o(arran)o(ties:)165 2615 y(an)o(y)d(other)g
+(implication)j(that)d(these)g(W)l(arran)o(t)o(y)f(Disclaimers)j(ma)o(y)
+d(ha)o(v)o(e)h(is)h(v)o(oid)g(and)g(has)f(no)165 2670
+y(e\013ect)d(on)g(the)g(meaning)h(of)f(this)h(License.)p
+eop
+%%Page: 23 27
+23 26 bop 75 -58 a Fo(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(23)100 149 y(2.)29 b(VERBA)l(TIM)15 b(COPYING)165
+222 y(Y)l(ou)k(ma)o(y)g(cop)o(y)f(and)i(distribute)g(the)f(Do)q(cumen)o
+(t)g(in)h(an)o(y)f(medium,)h(either)g(commercially)g(or)165
+277 y(noncommercially)l(,)k(pro)o(vided)e(that)f(this)h(License,)i(the)
+d(cop)o(yrigh)o(t)g(notices,)i(and)f(the)f(license)165
+332 y(notice)e(sa)o(ying)e(this)i(License)g(applies)h(to)d(the)h(Do)q
+(cumen)o(t)g(are)f(repro)q(duced)i(in)g(all)g(copies,)g(and)165
+387 y(that)13 b(y)o(ou)g(add)g(no)g(other)g(conditions)i(whatso)q(ev)o
+(er)d(to)h(those)g(of)g(this)h(License.)21 b(Y)l(ou)13
+b(ma)o(y)g(not)g(use)165 442 y(tec)o(hnical)18 b(measures)e(to)g
+(obstruct)g(or)g(con)o(trol)g(the)g(reading)h(or)f(further)h(cop)o
+(ying)g(of)f(the)g(copies)165 496 y(y)o(ou)c(mak)o(e)g(or)f
+(distribute.)21 b(Ho)o(w)o(ev)o(er,)11 b(y)o(ou)h(ma)o(y)g(accept)g
+(comp)q(ensation)h(in)g(exc)o(hange)g(for)e(copies.)165
+551 y(If)16 b(y)o(ou)g(distribute)h(a)f(large)g(enough)h(n)o(um)o(b)q
+(er)f(of)g(copies)h(y)o(ou)f(m)o(ust)f(also)h(follo)o(w)h(the)f
+(conditions)165 606 y(in)g(section)g(3.)165 679 y(Y)l(ou)11
+b(ma)o(y)e(also)i(lend)g(copies,)h(under)f(the)g(same)f(conditions)h
+(stated)f(ab)q(o)o(v)o(e,)h(and)f(y)o(ou)g(ma)o(y)g(publicly)165
+734 y(displa)o(y)16 b(copies.)100 807 y(3.)29 b(COPYING)16
+b(IN)f(QUANTITY)165 880 y(If)e(y)o(ou)f(publish)j(prin)o(ted)e(copies)h
+(\(or)d(copies)j(in)f(media)h(that)d(commonly)i(ha)o(v)o(e)f(prin)o
+(ted)i(co)o(v)o(ers\))d(of)165 935 y(the)16 b(Do)q(cumen)o(t,)g(n)o(um)
+o(b)q(ering)g(more)g(than)g(100,)e(and)i(the)g(Do)q(cumen)o(t's)g
+(license)i(notice)e(requires)165 990 y(Co)o(v)o(er)g(T)l(exts,)h(y)o
+(ou)g(m)o(ust)g(enclose)h(the)f(copies)h(in)g(co)o(v)o(ers)f(that)f
+(carry)l(,)h(clearly)h(and)g(legibly)l(,)h(all)165 1044
+y(these)h(Co)o(v)o(er)e(T)l(exts:)29 b(F)l(ron)o(t-Co)o(v)o(er)18
+b(T)l(exts)h(on)g(the)h(fron)o(t)f(co)o(v)o(er,)g(and)h(Bac)o(k-Co)o(v)
+o(er)f(T)l(exts)g(on)165 1099 y(the)c(bac)o(k)f(co)o(v)o(er.)19
+b(Both)14 b(co)o(v)o(ers)g(m)o(ust)g(also)h(clearly)h(and)e(legibly)j
+(iden)o(tify)f(y)o(ou)e(as)g(the)h(publisher)165 1154
+y(of)i(these)g(copies.)27 b(The)17 b(fron)o(t)f(co)o(v)o(er)h(m)o(ust)f
+(presen)o(t)i(the)f(full)h(title)g(with)g(all)g(w)o(ords)e(of)h(the)g
+(title)165 1209 y(equally)g(prominen)o(t)f(and)f(visible.)23
+b(Y)l(ou)16 b(ma)o(y)e(add)i(other)f(material)g(on)h(the)f(co)o(v)o
+(ers)g(in)h(addition.)165 1264 y(Cop)o(ying)i(with)h(c)o(hanges)f
+(limited)i(to)d(the)h(co)o(v)o(ers,)g(as)g(long)g(as)g(they)g(preserv)o
+(e)g(the)g(title)h(of)f(the)165 1318 y(Do)q(cumen)o(t)g(and)h(satisfy)f
+(these)h(conditions,)h(can)f(b)q(e)g(treated)f(as)h(v)o(erbatim)f(cop)o
+(ying)h(in)g(other)165 1373 y(resp)q(ects.)165 1446 y(If)e(the)f
+(required)i(texts)d(for)h(either)h(co)o(v)o(er)f(are)g(to)q(o)g(v)o
+(oluminous)h(to)f(\014t)g(legibly)l(,)i(y)o(ou)e(should)i(put)165
+1501 y(the)f(\014rst)f(ones)g(listed)i(\(as)d(man)o(y)h(as)g(\014t)h
+(reasonably\))f(on)g(the)h(actual)g(co)o(v)o(er,)e(and)i(con)o(tin)o
+(ue)g(the)165 1556 y(rest)e(on)o(to)f(adjacen)o(t)h(pages.)165
+1629 y(If)f(y)o(ou)f(publish)j(or)d(distribute)h(Opaque)h(copies)f(of)f
+(the)h(Do)q(cumen)o(t)f(n)o(um)o(b)q(ering)i(more)e(than)g(100,)165
+1684 y(y)o(ou)h(m)o(ust)f(either)i(include)h(a)e(mac)o(hine-readable)i
+(T)l(ransparen)o(t)d(cop)o(y)h(along)g(with)g(eac)o(h)g(Opaque)165
+1738 y(cop)o(y)l(,)k(or)f(state)g(in)h(or)f(with)h(eac)o(h)f(Opaque)i
+(cop)o(y)e(a)g(computer-net)o(w)o(ork)g(lo)q(cation)h(from)f(whic)o(h)
+165 1793 y(the)12 b(general)h(net)o(w)o(ork-using)f(public)i(has)e
+(access)g(to)g(do)o(wnload)g(using)h(public-standard)h(net)o(w)o(ork)
+165 1848 y(proto)q(cols)19 b(a)g(complete)i(T)l(ransparen)o(t)d(cop)o
+(y)i(of)f(the)g(Do)q(cumen)o(t,)h(free)g(of)f(added)h(material.)33
+b(If)165 1903 y(y)o(ou)19 b(use)h(the)f(latter)g(option,)i(y)o(ou)e(m)o
+(ust)g(tak)o(e)f(reasonably)i(pruden)o(t)g(steps,)g(when)g(y)o(ou)f(b)q
+(egin)165 1958 y(distribution)i(of)d(Opaque)i(copies)g(in)g(quan)o(tit)
+o(y)l(,)g(to)e(ensure)i(that)e(this)i(T)l(ransparen)o(t)e(cop)o(y)h
+(will)165 2012 y(remain)d(th)o(us)e(accessible)j(at)e(the)g(stated)g
+(lo)q(cation)g(un)o(til)i(at)d(least)h(one)h(y)o(ear)e(after)g(the)i
+(last)f(time)165 2067 y(y)o(ou)j(distribute)i(an)e(Opaque)h(cop)o(y)f
+(\(directly)i(or)e(through)g(y)o(our)g(agen)o(ts)f(or)h(retailers\))h
+(of)f(that)165 2122 y(edition)f(to)d(the)h(public.)165
+2195 y(It)i(is)h(requested,)g(but)f(not)g(required,)i(that)d(y)o(ou)h
+(con)o(tact)g(the)g(authors)g(of)f(the)i(Do)q(cumen)o(t)f(w)o(ell)165
+2250 y(b)q(efore)e(redistributing)h(an)o(y)e(large)g(n)o(um)o(b)q(er)h
+(of)e(copies,)i(to)f(giv)o(e)h(them)f(a)g(c)o(hance)h(to)e(pro)o(vide)i
+(y)o(ou)165 2305 y(with)h(an)f(up)q(dated)h(v)o(ersion)f(of)g(the)g(Do)
+q(cumen)o(t.)100 2378 y(4.)29 b(MODIFICA)l(TIONS)165
+2451 y(Y)l(ou)13 b(ma)o(y)f(cop)o(y)h(and)g(distribute)h(a)e(Mo)q
+(di\014ed)i(V)l(ersion)g(of)e(the)h(Do)q(cumen)o(t)f(under)i(the)f
+(conditions)165 2506 y(of)d(sections)h(2)f(and)h(3)f(ab)q(o)o(v)o(e,)h
+(pro)o(vided)g(that)f(y)o(ou)g(release)h(the)g(Mo)q(di\014ed)h(V)l
+(ersion)f(under)g(precisely)165 2560 y(this)k(License,)h(with)f(the)f
+(Mo)q(di\014ed)i(V)l(ersion)f(\014lling)i(the)e(role)f(of)h(the)f(Do)q
+(cumen)o(t,)g(th)o(us)h(licensing)165 2615 y(distribution)k(and)e(mo)q
+(di\014cation)h(of)f(the)g(Mo)q(di\014ed)h(V)l(ersion)g(to)e(who)q(ev)o
+(er)h(p)q(ossesses)h(a)e(cop)o(y)h(of)165 2670 y(it.)j(In)c(addition,)g
+(y)o(ou)f(m)o(ust)f(do)h(these)h(things)g(in)g(the)f(Mo)q(di\014ed)h(V)
+l(ersion:)p eop
+%%Page: 24 28
+24 27 bop 75 -58 a Fo(24)1299 b(GNU)15 b(Readline)h(Library)178
+149 y(A.)30 b(Use)17 b(in)g(the)f(Title)h(P)o(age)f(\(and)g(on)h(the)f
+(co)o(v)o(ers,)g(if)g(an)o(y\))g(a)g(title)h(distinct)h(from)d(that)h
+(of)g(the)255 204 y(Do)q(cumen)o(t,)h(and)g(from)f(those)h(of)f
+(previous)i(v)o(ersions)f(\(whic)o(h)g(should,)h(if)g(there)f(w)o(ere)f
+(an)o(y)l(,)255 259 y(b)q(e)g(listed)h(in)g(the)f(History)f(section)h
+(of)f(the)h(Do)q(cumen)o(t\).)21 b(Y)l(ou)16 b(ma)o(y)f(use)h(the)g
+(same)f(title)h(as)255 314 y(a)f(previous)h(v)o(ersion)f(if)h(the)f
+(original)h(publisher)i(of)d(that)f(v)o(ersion)h(giv)o(es)h(p)q
+(ermission.)180 379 y(B.)30 b(List)16 b(on)f(the)g(Title)i(P)o(age,)d
+(as)h(authors,)f(one)h(or)g(more)g(p)q(ersons)g(or)g(en)o(tities)h
+(resp)q(onsible)i(for)255 434 y(authorship)c(of)e(the)h(mo)q
+(di\014cations)h(in)g(the)f(Mo)q(di\014ed)i(V)l(ersion,)f(together)e
+(with)h(at)g(least)g(\014v)o(e)255 488 y(of)f(the)g(principal)i
+(authors)d(of)h(the)g(Do)q(cumen)o(t)g(\(all)g(of)g(its)g(principal)i
+(authors,)e(if)g(it)g(has)g(few)o(er)255 543 y(than)j(\014v)o(e\),)g
+(unless)h(they)f(release)h(y)o(ou)f(from)f(this)i(requiremen)o(t.)180
+608 y(C.)29 b(State)15 b(on)g(the)h(Title)g(page)f(the)h(name)f(of)g
+(the)g(publisher)j(of)d(the)g(Mo)q(di\014ed)i(V)l(ersion,)f(as)f(the)
+255 663 y(publisher.)178 728 y(D.)29 b(Preserv)o(e)15
+b(all)h(the)f(cop)o(yrigh)o(t)g(notices)h(of)f(the)g(Do)q(cumen)o(t.)
+181 793 y(E.)30 b(Add)16 b(an)g(appropriate)g(cop)o(yrigh)o(t)f(notice)
+h(for)f(y)o(our)g(mo)q(di\014cations)i(adjacen)o(t)f(to)f(the)g(other)
+255 848 y(cop)o(yrigh)o(t)g(notices.)183 913 y(F.)29
+b(Include,)16 b(immediately)g(after)d(the)h(cop)o(yrigh)o(t)f(notices,)
+i(a)e(license)j(notice)f(giving)g(the)f(public)255 968
+y(p)q(ermission)g(to)d(use)i(the)f(Mo)q(di\014ed)i(V)l(ersion)f(under)g
+(the)f(terms)g(of)f(this)i(License,)h(in)f(the)g(form)255
+1023 y(sho)o(wn)i(in)h(the)f(Addendum)i(b)q(elo)o(w.)177
+1088 y(G.)29 b(Preserv)o(e)11 b(in)h(that)f(license)i(notice)g(the)e
+(full)i(lists)f(of)f(In)o(v)m(arian)o(t)h(Sections)g(and)f(required)i
+(Co)o(v)o(er)255 1143 y(T)l(exts)i(giv)o(en)h(in)g(the)f(Do)q(cumen)o
+(t's)g(license)i(notice.)178 1208 y(H.)30 b(Include)17
+b(an)e(unaltered)i(cop)o(y)e(of)f(this)i(License.)196
+1273 y(I.)30 b(Preserv)o(e)16 b(the)g(section)h(En)o(titled)g
+(\\History",)e(Preserv)o(e)g(its)i(Title,)f(and)h(add)f(to)f(it)i(an)f
+(item)255 1328 y(stating)e(at)f(least)h(the)g(title,)h(y)o(ear,)e(new)i
+(authors,)e(and)h(publisher)i(of)e(the)g(Mo)q(di\014ed)h(V)l(ersion)255
+1382 y(as)g(giv)o(en)h(on)g(the)g(Title)g(P)o(age.)21
+b(If)16 b(there)g(is)g(no)g(section)g(En)o(titled)g(\\History")f(in)i
+(the)f(Do)q(cu-)255 1437 y(men)o(t,)h(create)g(one)h(stating)f(the)g
+(title,)i(y)o(ear,)e(authors,)g(and)g(publisher)j(of)d(the)g(Do)q
+(cumen)o(t)255 1492 y(as)h(giv)o(en)g(on)g(its)g(Title)h(P)o(age,)f
+(then)h(add)f(an)g(item)g(describing)i(the)e(Mo)q(di\014ed)h(V)l
+(ersion)g(as)255 1547 y(stated)c(in)h(the)f(previous)h(sen)o(tence.)189
+1612 y(J.)30 b(Preserv)o(e)16 b(the)g(net)o(w)o(ork)f(lo)q(cation,)i
+(if)g(an)o(y)l(,)f(giv)o(en)h(in)g(the)f(Do)q(cumen)o(t)g(for)g(public)
+i(access)f(to)255 1667 y(a)e(T)l(ransparen)o(t)g(cop)o(y)h(of)f(the)g
+(Do)q(cumen)o(t,)h(and)f(lik)o(ewise)j(the)d(net)o(w)o(ork)g(lo)q
+(cations)h(giv)o(en)g(in)255 1721 y(the)g(Do)q(cumen)o(t)g(for)f
+(previous)h(v)o(ersions)g(it)g(w)o(as)f(based)i(on.)k(These)c(ma)o(y)e
+(b)q(e)h(placed)h(in)g(the)255 1776 y(\\History")12 b(section.)19
+b(Y)l(ou)13 b(ma)o(y)f(omit)g(a)g(net)o(w)o(ork)g(lo)q(cation)h(for)f
+(a)g(w)o(ork)g(that)g(w)o(as)f(published)255 1831 y(at)17
+b(least)h(four)g(y)o(ears)f(b)q(efore)h(the)g(Do)q(cumen)o(t)g(itself,)
+h(or)e(if)i(the)e(original)i(publisher)h(of)e(the)255
+1886 y(v)o(ersion)d(it)h(refers)f(to)f(giv)o(es)i(p)q(ermission.)177
+1951 y(K.)30 b(F)l(or)11 b(an)o(y)h(section)g(En)o(titled)h(\\Ac)o(kno)
+o(wledgemen)o(ts")f(or)f(\\Dedications",)h(Preserv)o(e)g(the)g(Title)
+255 2006 y(of)h(the)g(section,)h(and)f(preserv)o(e)h(in)g(the)f
+(section)h(all)g(the)g(substance)f(and)h(tone)f(of)g(eac)o(h)g(of)g
+(the)255 2060 y(con)o(tributor)i(ac)o(kno)o(wledgemen)o(ts)g(and/or)g
+(dedications)h(giv)o(en)g(therein.)184 2125 y(L.)30 b(Preserv)o(e)17
+b(all)i(the)f(In)o(v)m(arian)o(t)g(Sections)g(of)g(the)f(Do)q(cumen)o
+(t,)h(unaltered)h(in)f(their)h(text)e(and)255 2180 y(in)i(their)f
+(titles.)29 b(Section)19 b(n)o(um)o(b)q(ers)f(or)g(the)g(equiv)m(alen)o
+(t)h(are)f(not)g(considered)h(part)e(of)h(the)255 2235
+y(section)e(titles.)171 2300 y(M.)29 b(Delete)16 b(an)o(y)f(section)h
+(En)o(titled)g(\\Endorsemen)o(ts".)k(Suc)o(h)c(a)f(section)h(ma)o(y)e
+(not)h(b)q(e)h(included)255 2355 y(in)g(the)f(Mo)q(di\014ed)i(V)l
+(ersion.)178 2420 y(N.)30 b(Do)14 b(not)f(retitle)i(an)o(y)f(existing)h
+(section)g(to)f(b)q(e)g(En)o(titled)i(\\Endorsemen)o(ts")d(or)h(to)f
+(con\015ict)i(in)255 2475 y(title)h(with)f(an)o(y)g(In)o(v)m(arian)o(t)
+h(Section.)177 2540 y(O.)30 b(Preserv)o(e)15 b(an)o(y)g(W)l(arran)o(t)o
+(y)e(Disclaimers.)165 2615 y(If)k(the)g(Mo)q(di\014ed)h(V)l(ersion)f
+(includes)i(new)e(fron)o(t-matter)e(sections)i(or)f(app)q(endices)j
+(that)d(qualify)165 2670 y(as)e(Secondary)g(Sections)h(and)f(con)o
+(tain)g(no)g(material)g(copied)h(from)e(the)h(Do)q(cumen)o(t,)g(y)o(ou)
+f(ma)o(y)h(at)p eop
+%%Page: 25 29
+25 28 bop 75 -58 a Fo(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(25)165 149 y(y)o(our)16 b(option)g(designate)h(some)f(or)f
+(all)i(of)f(these)h(sections)f(as)g(in)o(v)m(arian)o(t.)24
+b(T)l(o)15 b(do)i(this,)f(add)g(their)165 204 y(titles)i(to)f(the)h
+(list)h(of)e(In)o(v)m(arian)o(t)h(Sections)h(in)f(the)g(Mo)q(di\014ed)h
+(V)l(ersion's)f(license)i(notice.)28 b(These)165 259
+y(titles)16 b(m)o(ust)f(b)q(e)g(distinct)i(from)d(an)o(y)h(other)g
+(section)h(titles.)165 325 y(Y)l(ou)21 b(ma)o(y)g(add)g(a)g(section)h
+(En)o(titled)g(\\Endorsemen)o(ts",)f(pro)o(vided)h(it)g(con)o(tains)f
+(nothing)h(but)165 380 y(endorsemen)o(ts)15 b(of)f(y)o(our)h(Mo)q
+(di\014ed)h(V)l(ersion)f(b)o(y)g(v)m(arious)g(parties|for)f(example,)i
+(statemen)o(ts)d(of)165 434 y(p)q(eer)h(review)g(or)g(that)e(the)i
+(text)f(has)h(b)q(een)g(appro)o(v)o(ed)g(b)o(y)f(an)h(organization)f
+(as)h(the)f(authoritativ)o(e)165 489 y(de\014nition)k(of)e(a)g
+(standard.)165 555 y(Y)l(ou)f(ma)o(y)g(add)g(a)g(passage)g(of)f(up)i
+(to)e(\014v)o(e)i(w)o(ords)e(as)h(a)g(F)l(ron)o(t-Co)o(v)o(er)e(T)l
+(ext,)i(and)g(a)g(passage)g(of)f(up)165 610 y(to)g(25)g(w)o(ords)g(as)g
+(a)g(Bac)o(k-Co)o(v)o(er)g(T)l(ext,)g(to)g(the)g(end)i(of)e(the)g(list)
+i(of)e(Co)o(v)o(er)f(T)l(exts)i(in)g(the)g(Mo)q(di\014ed)165
+665 y(V)l(ersion.)29 b(Only)19 b(one)f(passage)f(of)h(F)l(ron)o(t-Co)o
+(v)o(er)e(T)l(ext)i(and)g(one)g(of)f(Bac)o(k-Co)o(v)o(er)g(T)l(ext)h
+(ma)o(y)f(b)q(e)165 719 y(added)d(b)o(y)g(\(or)f(through)g(arrangemen)o
+(ts)g(made)h(b)o(y\))f(an)o(y)h(one)g(en)o(tit)o(y)l(.)19
+b(If)14 b(the)g(Do)q(cumen)o(t)g(already)165 774 y(includes)19
+b(a)e(co)o(v)o(er)f(text)h(for)f(the)h(same)g(co)o(v)o(er,)f
+(previously)i(added)g(b)o(y)f(y)o(ou)g(or)f(b)o(y)h(arrangemen)o(t)165
+829 y(made)h(b)o(y)f(the)h(same)f(en)o(tit)o(y)h(y)o(ou)f(are)g(acting)
+h(on)f(b)q(ehalf)i(of,)f(y)o(ou)f(ma)o(y)g(not)g(add)h(another;)g(but)
+165 884 y(y)o(ou)f(ma)o(y)f(replace)i(the)f(old)h(one,)f(on)g(explicit)
+i(p)q(ermission)f(from)f(the)g(previous)h(publisher)h(that)165
+938 y(added)d(the)f(old)h(one.)165 1004 y(The)d(author\(s\))e(and)i
+(publisher\(s\))h(of)f(the)g(Do)q(cumen)o(t)f(do)h(not)f(b)o(y)h(this)g
+(License)i(giv)o(e)e(p)q(ermission)165 1059 y(to)i(use)g(their)h(names)
+f(for)f(publicit)o(y)k(for)c(or)h(to)f(assert)h(or)f(imply)j
+(endorsemen)o(t)e(of)g(an)o(y)g(Mo)q(di\014ed)165 1114
+y(V)l(ersion.)100 1180 y(5.)29 b(COMBINING)16 b(DOCUMENTS)165
+1245 y(Y)l(ou)k(ma)o(y)e(com)o(bine)i(the)g(Do)q(cumen)o(t)f(with)h
+(other)f(do)q(cumen)o(ts)g(released)i(under)f(this)g(License,)165
+1300 y(under)g(the)f(terms)g(de\014ned)h(in)g(section)g(4)e(ab)q(o)o(v)
+o(e)h(for)g(mo)q(di\014ed)h(v)o(ersions,)g(pro)o(vided)g(that)e(y)o(ou)
+165 1355 y(include)d(in)e(the)g(com)o(bination)h(all)f(of)f(the)h(In)o
+(v)m(arian)o(t)g(Sections)h(of)e(all)h(of)g(the)f(original)i(do)q
+(cumen)o(ts,)165 1410 y(unmo)q(di\014ed,)h(and)f(list)g(them)f(all)i
+(as)e(In)o(v)m(arian)o(t)g(Sections)i(of)e(y)o(our)f(com)o(bined)j(w)o
+(ork)d(in)i(its)g(license)165 1465 y(notice,)h(and)h(that)e(y)o(ou)h
+(preserv)o(e)g(all)i(their)e(W)l(arran)o(t)o(y)f(Disclaimers.)165
+1530 y(The)h(com)o(bined)i(w)o(ork)d(need)i(only)f(con)o(tain)h(one)f
+(cop)o(y)g(of)g(this)g(License,)i(and)e(m)o(ultiple)i(iden)o(tical)165
+1585 y(In)o(v)m(arian)o(t)g(Sections)g(ma)o(y)e(b)q(e)i(replaced)h
+(with)e(a)g(single)i(cop)o(y)l(.)23 b(If)16 b(there)h(are)f(m)o
+(ultiple)i(In)o(v)m(arian)o(t)165 1640 y(Sections)c(with)g(the)f(same)g
+(name)h(but)f(di\013eren)o(t)h(con)o(ten)o(ts,)f(mak)o(e)g(the)g(title)
+h(of)f(eac)o(h)h(suc)o(h)f(section)165 1695 y(unique)19
+b(b)o(y)d(adding)i(at)f(the)g(end)g(of)g(it,)g(in)h(paren)o(theses,)f
+(the)g(name)g(of)g(the)g(original)h(author)e(or)165 1749
+y(publisher)f(of)d(that)g(section)h(if)g(kno)o(wn,)f(or)g(else)h(a)g
+(unique)h(n)o(um)o(b)q(er.)19 b(Mak)o(e)12 b(the)g(same)h(adjustmen)o
+(t)165 1804 y(to)f(the)g(section)h(titles)g(in)g(the)f(list)h(of)f(In)o
+(v)m(arian)o(t)g(Sections)h(in)g(the)g(license)h(notice)f(of)f(the)g
+(com)o(bined)165 1859 y(w)o(ork.)165 1925 y(In)21 b(the)g(com)o
+(bination,)h(y)o(ou)f(m)o(ust)f(com)o(bine)h(an)o(y)f(sections)i(En)o
+(titled)f(\\History")f(in)h(the)g(v)m(ari-)165 1980 y(ous)16
+b(original)h(do)q(cumen)o(ts,)f(forming)g(one)h(section)f(En)o(titled)h
+(\\History";)f(lik)o(ewise)h(com)o(bine)g(an)o(y)165
+2034 y(sections)f(En)o(titled)h(\\Ac)o(kno)o(wledgemen)o(ts",)f(and)g
+(an)o(y)f(sections)i(En)o(titled)f(\\Dedications".)23
+b(Y)l(ou)165 2089 y(m)o(ust)15 b(delete)h(all)g(sections)g(En)o(titled)
+g(\\Endorsemen)o(ts.")100 2155 y(6.)29 b(COLLECTIONS)17
+b(OF)e(DOCUMENTS)165 2221 y(Y)l(ou)h(ma)o(y)f(mak)o(e)h(a)f(collection)
+j(consisting)f(of)e(the)h(Do)q(cumen)o(t)g(and)g(other)g(do)q(cumen)o
+(ts)g(released)165 2275 y(under)22 b(this)g(License,)i(and)d(replace)h
+(the)f(individual)k(copies)d(of)f(this)g(License)i(in)f(the)f(v)m
+(arious)165 2330 y(do)q(cumen)o(ts)h(with)f(a)g(single)i(cop)o(y)e
+(that)f(is)i(included)i(in)e(the)f(collection,)k(pro)o(vided)d(that)e
+(y)o(ou)165 2385 y(follo)o(w)f(the)f(rules)i(of)e(this)h(License)h(for)
+e(v)o(erbatim)g(cop)o(ying)h(of)f(eac)o(h)h(of)f(the)h(do)q(cumen)o(ts)
+g(in)g(all)165 2440 y(other)c(resp)q(ects.)165 2506 y(Y)l(ou)h(ma)o(y)f
+(extract)g(a)g(single)i(do)q(cumen)o(t)f(from)f(suc)o(h)h(a)g
+(collection,)h(and)f(distribute)h(it)f(individu-)165
+2560 y(ally)i(under)h(this)f(License,)h(pro)o(vided)f(y)o(ou)f(insert)h
+(a)g(cop)o(y)f(of)g(this)h(License)h(in)o(to)f(the)f(extracted)165
+2615 y(do)q(cumen)o(t,)g(and)f(follo)o(w)g(this)h(License)h(in)f(all)h
+(other)d(resp)q(ects)i(regarding)g(v)o(erbatim)f(cop)o(ying)g(of)165
+2670 y(that)e(do)q(cumen)o(t.)p eop
+%%Page: 26 30
+26 29 bop 75 -58 a Fo(26)1299 b(GNU)15 b(Readline)h(Library)100
+149 y(7.)29 b(A)o(GGREGA)l(TION)14 b(WITH)i(INDEPENDENT)e(W)o(ORKS)165
+214 y(A)g(compilation)h(of)f(the)g(Do)q(cumen)o(t)g(or)f(its)i(deriv)m
+(ativ)o(es)g(with)f(other)g(separate)f(and)i(indep)q(enden)o(t)165
+269 y(do)q(cumen)o(ts)i(or)f(w)o(orks,)g(in)h(or)f(on)h(a)f(v)o(olume)h
+(of)f(a)h(storage)e(or)h(distribution)j(medium,)e(is)g(called)165
+324 y(an)e(\\aggregate")e(if)i(the)h(cop)o(yrigh)o(t)e(resulting)i
+(from)f(the)g(compilation)h(is)g(not)e(used)i(to)e(limit)j(the)165
+379 y(legal)d(righ)o(ts)f(of)g(the)g(compilation's)i(users)e(b)q(ey)o
+(ond)h(what)f(the)g(individual)j(w)o(orks)d(p)q(ermit.)20
+b(When)165 433 y(the)14 b(Do)q(cumen)o(t)g(is)g(included)i(an)e
+(aggregate,)e(this)j(License)g(do)q(es)f(not)g(apply)g(to)g(the)g
+(other)f(w)o(orks)165 488 y(in)j(the)f(aggregate)f(whic)o(h)i(are)f
+(not)g(themselv)o(es)h(deriv)m(ativ)o(e)g(w)o(orks)e(of)h(the)g(Do)q
+(cumen)o(t.)165 553 y(If)d(the)f(Co)o(v)o(er)f(T)l(ext)i(requiremen)o
+(t)g(of)f(section)h(3)f(is)h(applicable)h(to)e(these)h(copies)g(of)f
+(the)g(Do)q(cumen)o(t,)165 608 y(then)h(if)f(the)h(Do)q(cumen)o(t)f(is)
+g(less)h(than)f(one)h(half)f(of)g(the)g(en)o(tire)h(aggregate,)e(the)h
+(Do)q(cumen)o(t's)g(Co)o(v)o(er)165 663 y(T)l(exts)i(ma)o(y)g(b)q(e)h
+(placed)g(on)f(co)o(v)o(ers)g(that)f(brac)o(k)o(et)h(the)g(Do)q(cumen)o
+(t)g(within)i(the)e(aggregate,)f(or)h(the)165 717 y(electronic)19
+b(equiv)m(alen)o(t)g(of)e(co)o(v)o(ers)g(if)h(the)g(Do)q(cumen)o(t)f
+(is)h(in)g(electronic)h(form.)27 b(Otherwise)18 b(they)165
+772 y(m)o(ust)d(app)q(ear)g(on)g(prin)o(ted)h(co)o(v)o(ers)f(that)f
+(brac)o(k)o(et)h(the)g(whole)h(aggregate.)100 837 y(8.)29
+b(TRANSLA)l(TION)165 902 y(T)l(ranslation)20 b(is)h(considered)g(a)f
+(kind)h(of)e(mo)q(di\014cation,)j(so)e(y)o(ou)g(ma)o(y)f(distribute)i
+(translations)165 956 y(of)h(the)g(Do)q(cumen)o(t)g(under)h(the)f
+(terms)g(of)g(section)g(4.)41 b(Replacing)23 b(In)o(v)m(arian)o(t)g
+(Sections)g(with)165 1011 y(translations)g(requires)g(sp)q(ecial)i(p)q
+(ermission)f(from)e(their)h(cop)o(yrigh)o(t)f(holders,)j(but)e(y)o(ou)g
+(ma)o(y)165 1066 y(include)15 b(translations)d(of)g(some)g(or)f(all)i
+(In)o(v)m(arian)o(t)g(Sections)g(in)g(addition)h(to)d(the)h(original)i
+(v)o(ersions)165 1121 y(of)h(these)h(In)o(v)m(arian)o(t)g(Sections.)23
+b(Y)l(ou)15 b(ma)o(y)g(include)k(a)c(translation)h(of)f(this)h
+(License,)h(and)f(all)h(the)165 1176 y(license)23 b(notices)e(in)g(the)
+g(Do)q(cumen)o(t,)g(and)g(an)o(y)f(W)l(arran)o(t)o(y)f(Disclaimers,)k
+(pro)o(vided)e(that)f(y)o(ou)165 1230 y(also)g(include)i(the)e
+(original)i(English)f(v)o(ersion)f(of)g(this)g(License)i(and)e(the)g
+(original)h(v)o(ersions)f(of)165 1285 y(those)d(notices)g(and)h
+(disclaimers.)27 b(In)18 b(case)f(of)f(a)h(disagreemen)o(t)g(b)q(et)o
+(w)o(een)h(the)f(translation)g(and)165 1340 y(the)h(original)g(v)o
+(ersion)g(of)f(this)h(License)i(or)d(a)g(notice)h(or)f(disclaimer,)j
+(the)e(original)g(v)o(ersion)g(will)165 1395 y(prev)m(ail.)165
+1460 y(If)d(a)f(section)g(in)i(the)e(Do)q(cumen)o(t)g(is)h(En)o(titled)
+g(\\Ac)o(kno)o(wledgemen)o(ts",)f(\\Dedications",)h(or)e(\\His-)165
+1514 y(tory",)f(the)h(requiremen)o(t)h(\(section)f(4\))g(to)f(Preserv)o
+(e)h(its)h(Title)g(\(section)f(1\))g(will)i(t)o(ypically)f(require)165
+1569 y(c)o(hanging)i(the)f(actual)g(title.)100 1634 y(9.)29
+b(TERMINA)l(TION)165 1699 y(Y)l(ou)15 b(ma)o(y)f(not)h(cop)o(y)l(,)f
+(mo)q(dify)l(,)i(sublicense,)h(or)d(distribute)i(the)f(Do)q(cumen)o(t)g
+(except)h(as)e(expressly)165 1753 y(pro)o(vided)22 b(for)e(under)i
+(this)f(License.)39 b(An)o(y)21 b(other)f(attempt)g(to)g(cop)o(y)l(,)i
+(mo)q(dify)l(,)h(sublicense)g(or)165 1808 y(distribute)d(the)e(Do)q
+(cumen)o(t)g(is)h(v)o(oid,)g(and)f(will)i(automatically)f(terminate)f
+(y)o(our)g(righ)o(ts)g(under)165 1863 y(this)c(License.)22
+b(Ho)o(w)o(ev)o(er,)12 b(parties)i(who)g(ha)o(v)o(e)g(receiv)o(ed)h
+(copies,)f(or)g(righ)o(ts,)f(from)g(y)o(ou)h(under)h(this)165
+1918 y(License)20 b(will)g(not)e(ha)o(v)o(e)g(their)h(licenses)h
+(terminated)f(so)f(long)g(as)g(suc)o(h)h(parties)g(remain)f(in)i(full)
+165 1973 y(compliance.)77 2037 y(10.)29 b(FUTURE)14 b(REVISIONS)j(OF)e
+(THIS)h(LICENSE)165 2102 y(The)21 b(F)l(ree)g(Soft)o(w)o(are)e(F)l
+(oundation)i(ma)o(y)f(publish)j(new,)f(revised)g(v)o(ersions)f(of)f
+(the)h(GNU)g(F)l(ree)165 2157 y(Do)q(cumen)o(tation)16
+b(License)i(from)d(time)h(to)g(time.)22 b(Suc)o(h)17
+b(new)f(v)o(ersions)h(will)g(b)q(e)g(similar)g(in)g(spirit)165
+2212 y(to)g(the)g(presen)o(t)g(v)o(ersion,)h(but)f(ma)o(y)f(di\013er)i
+(in)g(detail)g(to)f(address)g(new)g(problems)h(or)f(concerns.)165
+2266 y(See)f Fn(http://www.gnu.org/copyle)o(ft/)p Fo(.)165
+2331 y(Eac)o(h)f(v)o(ersion)f(of)h(the)g(License)h(is)f(giv)o(en)g(a)g
+(distinguishing)i(v)o(ersion)e(n)o(um)o(b)q(er.)20 b(If)15
+b(the)g(Do)q(cumen)o(t)165 2386 y(sp)q(eci\014es)24 b(that)e(a)h
+(particular)g(n)o(um)o(b)q(ered)h(v)o(ersion)e(of)h(this)g(License)h
+(\\or)e(an)o(y)g(later)h(v)o(ersion")165 2441 y(applies)18
+b(to)d(it,)i(y)o(ou)f(ha)o(v)o(e)g(the)g(option)g(of)g(follo)o(wing)h
+(the)f(terms)g(and)g(conditions)i(either)f(of)f(that)165
+2496 y(sp)q(eci\014ed)21 b(v)o(ersion)e(or)g(of)f(an)o(y)h(later)g(v)o
+(ersion)g(that)f(has)h(b)q(een)h(published)i(\(not)c(as)g(a)h(draft\))f
+(b)o(y)165 2550 y(the)e(F)l(ree)h(Soft)o(w)o(are)e(F)l(oundation.)23
+b(If)17 b(the)g(Do)q(cumen)o(t)f(do)q(es)g(not)g(sp)q(ecify)i(a)e(v)o
+(ersion)h(n)o(um)o(b)q(er)f(of)165 2605 y(this)i(License,)h(y)o(ou)e
+(ma)o(y)f(c)o(ho)q(ose)i(an)o(y)e(v)o(ersion)i(ev)o(er)f(published)j
+(\(not)c(as)h(a)g(draft\))f(b)o(y)i(the)f(F)l(ree)165
+2660 y(Soft)o(w)o(are)d(F)l(oundation.)p eop
+%%Page: 27 31
+27 30 bop 75 -58 a Fo(App)q(endix)17 b(A:)e(Cop)o(ying)g(This)h(Man)o
+(ual)1053 b(27)75 149 y Fc(A.1.1)30 b(ADDENDUM:)22 b(Ho)n(w)f(to)f(use)
+h(this)f(License)h(for)f(y)n(our)h(do)r(cumen)n(ts)137
+271 y Fo(T)l(o)14 b(use)g(this)g(License)h(in)g(a)e(do)q(cumen)o(t)h(y)
+o(ou)f(ha)o(v)o(e)h(written,)f(include)j(a)d(cop)o(y)h(of)f(the)h
+(License)h(in)g(the)75 326 y(do)q(cumen)o(t)h(and)f(put)g(the)h(follo)o
+(wing)g(cop)o(yrigh)o(t)e(and)i(license)h(notices)f(just)f(after)f(the)
+h(title)h(page:)234 382 y Fb(Copyright)g(\(C\))38 b Fa(year)k(your)19
+b(name)p Fb(.)234 426 y(Permission)d(is)j(granted)e(to)i(copy,)e
+(distribute)f(and/or)h(modify)h(this)g(document)234 469
+y(under)g(the)g(terms)g(of)h(the)f(GNU)h(Free)f(Documenta)o(tio)o(n)e
+(License,)h(Version)g(1.2)234 513 y(or)i(any)g(later)e(version)g
+(published)f(by)j(the)g(Free)f(Software)e(Foundation)o(;)234
+557 y(with)i(no)h(Invariant)d(Sections,)g(no)j(Front-Cove)o(r)e(Texts,)
+g(and)h(no)h(Back-Cover)d(Texts.)234 600 y(A)j(copy)g(of)f(the)h
+(license)e(is)i(included)d(in)j(the)f(section)f(entitled)g(``GNU)234
+644 y(Free)h(Documentat)o(ion)e(License'')o(.)137 705
+y Fo(If)k(y)o(ou)g(ha)o(v)o(e)g(In)o(v)m(arian)o(t)g(Sections,)h(F)l
+(ron)o(t-Co)o(v)o(er)e(T)l(exts)g(and)h(Bac)o(k-Co)o(v)o(er)f(T)l
+(exts,)i(replace)g(the)75 760 y(\\with...T)l(exts.")d(line)f(with)f
+(this:)273 816 y Fb(with)j(the)f(Invariant)e(Sections)h(being)g
+Fa(list)h(their)g(titles)p Fb(,)f(with)273 860 y(the)i(Front-Cov)o(er)d
+(Texts)i(being)g Fa(list)p Fb(,)f(and)i(with)f(the)g(Back-Cover)e
+(Texts)273 903 y(being)i Fa(list)p Fb(.)137 964 y Fo(If)g(y)o(ou)f(ha)o
+(v)o(e)h(In)o(v)m(arian)o(t)g(Sections)g(without)g(Co)o(v)o(er)e(T)l
+(exts,)i(or)f(some)g(other)g(com)o(bination)i(of)e(the)75
+1019 y(three,)e(merge)g(those)g(t)o(w)o(o)f(alternativ)o(es)h(to)g
+(suit)g(the)g(situation.)137 1086 y(If)d(y)o(our)g(do)q(cumen)o(t)g
+(con)o(tains)g(non)o(trivial)h(examples)g(of)e(program)g(co)q(de,)i(w)o
+(e)f(recommend)g(releasing)75 1141 y(these)22 b(examples)g(in)g
+(parallel)i(under)e(y)o(our)f(c)o(hoice)h(of)f(free)h(soft)o(w)o(are)e
+(license,)k(suc)o(h)e(as)g(the)f(GNU)75 1196 y(General)16
+b(Public)h(License,)f(to)f(p)q(ermit)h(their)f(use)h(in)g(free)f(soft)o
+(w)o(are.)p eop
+%%Page: 28 32
+28 31 bop 75 -58 a Fo(28)1299 b(GNU)15 b(Readline)h(Library)p
+eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/lib/readline/doc/rluserman.toc b/lib/readline/doc/rluserman.toc
new file mode 100644 (file)
index 0000000..e415083
--- /dev/null
@@ -0,0 +1,25 @@
+\chapentry{Command Line Editing}{1}{1}
+\secentry{Introduction to Line Editing}{1}{1}{1}
+\secentry{Readline Interaction}{1}{2}{1}
+\subsecentry{Readline Bare Essentials}{1}{2}{1}{1}
+\subsecentry{Readline Movement Commands}{1}{2}{2}{2}
+\subsecentry{Readline Killing Commands}{1}{2}{3}{2}
+\subsecentry{Readline Arguments}{1}{2}{4}{3}
+\subsecentry{Searching for Commands in the History}{1}{2}{5}{3}
+\secentry{Readline Init File}{1}{3}{4}
+\subsecentry{Readline Init File Syntax}{1}{3}{1}{4}
+\subsecentry{Conditional Init Constructs}{1}{3}{2}{9}
+\subsecentry{Sample Init File}{1}{3}{3}{10}
+\secentry{Bindable Readline Commands}{1}{4}{13}
+\subsecentry{Commands For Moving}{1}{4}{1}{13}
+\subsecentry{Commands For Manipulating The History}{1}{4}{2}{13}
+\subsecentry{Commands For Changing Text}{1}{4}{3}{14}
+\subsecentry{Killing And Yanking}{1}{4}{4}{16}
+\subsecentry{Specifying Numeric Arguments}{1}{4}{5}{17}
+\subsecentry{Letting Readline Type For You}{1}{4}{6}{17}
+\subsecentry{Keyboard Macros}{1}{4}{7}{17}
+\subsecentry{Some Miscellaneous Commands}{1}{4}{8}{18}
+\secentry{Readline vi Mode}{1}{5}{19}
+\appendixentry{Copying This Manual}{A}{21}
+\secentry{GNU Free Documentation License}{A}{1}{21}
+\subsecentry{ADDENDUM: How to use this License for your documents}{A}{1}{1}{27}
diff --git a/lib/readline/doc/rluserman.tp b/lib/readline/doc/rluserman.tp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/lib/readline/doc/rluserman.vr b/lib/readline/doc/rluserman.vr
new file mode 100644 (file)
index 0000000..75be193
--- /dev/null
@@ -0,0 +1,22 @@
+\entry{bell-style}{5}{\code {bell-style}}
+\entry{comment-begin}{5}{\code {comment-begin}}
+\entry{completion-query-items}{5}{\code {completion-query-items}}
+\entry{convert-meta}{5}{\code {convert-meta}}
+\entry{disable-completion}{5}{\code {disable-completion}}
+\entry{editing-mode}{5}{\code {editing-mode}}
+\entry{enable-keypad}{5}{\code {enable-keypad}}
+\entry{expand-tilde}{5}{\code {expand-tilde}}
+\entry{history-preserve-point}{5}{\code {history-preserve-point}}
+\entry{horizontal-scroll-mode}{6}{\code {horizontal-scroll-mode}}
+\entry{input-meta}{6}{\code {input-meta}}
+\entry{meta-flag}{6}{\code {meta-flag}}
+\entry{isearch-terminators}{6}{\code {isearch-terminators}}
+\entry{keymap}{6}{\code {keymap}}
+\entry{mark-modified-lines}{6}{\code {mark-modified-lines}}
+\entry{mark-symlinked-directories}{6}{\code {mark-symlinked-directories}}
+\entry{match-hidden-files}{6}{\code {match-hidden-files}}
+\entry{output-meta}{7}{\code {output-meta}}
+\entry{page-completions}{7}{\code {page-completions}}
+\entry{show-all-if-ambiguous}{7}{\code {show-all-if-ambiguous}}
+\entry{show-all-if-unmodified}{7}{\code {show-all-if-unmodified}}
+\entry{visible-stats}{7}{\code {visible-stats}}
diff --git a/lib/readline/doc/rluserman.vrs b/lib/readline/doc/rluserman.vrs
new file mode 100644 (file)
index 0000000..01f471e
--- /dev/null
@@ -0,0 +1,34 @@
+\initial {B}
+\entry {\code {bell-style}}{5}
+\initial {C}
+\entry {\code {comment-begin}}{5}
+\entry {\code {completion-query-items}}{5}
+\entry {\code {convert-meta}}{5}
+\initial {D}
+\entry {\code {disable-completion}}{5}
+\initial {E}
+\entry {\code {editing-mode}}{5}
+\entry {\code {enable-keypad}}{5}
+\entry {\code {expand-tilde}}{5}
+\initial {H}
+\entry {\code {history-preserve-point}}{5}
+\entry {\code {horizontal-scroll-mode}}{6}
+\initial {I}
+\entry {\code {input-meta}}{6}
+\entry {\code {isearch-terminators}}{6}
+\initial {K}
+\entry {\code {keymap}}{6}
+\initial {M}
+\entry {\code {mark-modified-lines}}{6}
+\entry {\code {mark-symlinked-directories}}{6}
+\entry {\code {match-hidden-files}}{6}
+\entry {\code {meta-flag}}{6}
+\initial {O}
+\entry {\code {output-meta}}{7}
+\initial {P}
+\entry {\code {page-completions}}{7}
+\initial {S}
+\entry {\code {show-all-if-ambiguous}}{7}
+\entry {\code {show-all-if-unmodified}}{7}
+\initial {V}
+\entry {\code {visible-stats}}{7}
diff --git a/lib/readline/doc/texi2dvi b/lib/readline/doc/texi2dvi
new file mode 120000 (symlink)
index 0000000..113d526
--- /dev/null
@@ -0,0 +1 @@
+../../../support/texi2dvi
\ No newline at end of file
diff --git a/lib/readline/doc/texi2html b/lib/readline/doc/texi2html
new file mode 120000 (symlink)
index 0000000..93433e5
--- /dev/null
@@ -0,0 +1 @@
+../../../support/texi2html
\ No newline at end of file
diff --git a/lib/readline/doc/texinfo.tex b/lib/readline/doc/texinfo.tex
new file mode 120000 (symlink)
index 0000000..234f085
--- /dev/null
@@ -0,0 +1 @@
+../../../doc/texinfo.tex
\ No newline at end of file
index 20737ab..dc0c587 100644 (file)
@@ -4,7 +4,7 @@ Copyright (C) 1988-2003 Free Software Foundation, Inc.
 
 @set EDITION 5.0
 @set VERSION 5.0
-@set UPDATED 19 September 2003
-@set UPDATED-MONTH September 2003
+@set UPDATED 11 October 2003
+@set UPDATED-MONTH October 2003
 
-@set LASTCHANGE Thu Sep 18 09:55:25 EDT 2003
+@set LASTCHANGE Sat Oct 11 23:48:11 EDT 2003
index 584198a..aed5c72 100644 (file)
@@ -1283,7 +1283,10 @@ get_history_word_specifier (spec, from, caller_index)
   if (spec[i] == '-')
     first = 0;
   else if (spec[i] == '^')
-    first = 1;
+    {
+      first = 1;
+      i++;
+    }
   else if (_rl_digit_p (spec[i]) && expecting_word_spec)
     {
       for (first = 0; _rl_digit_p (spec[i]); i++)
deleted file mode 100644 (file)
index 505e27954f1683671ed12b7e1a140fb9ae9e7ba4..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* posixdir.h -- Posix directory reading includes and defines. */
-
-/* Copyright (C) 1987,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 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
-
-/* This file should be included instead of <dirent.h> or <sys/dir.h>. */
-
-#if !defined (_POSIXDIR_H_)
-#define _POSIXDIR_H_
-
-#if defined (HAVE_DIRENT_H)
-#  include <dirent.h>
-#  define D_NAMLEN(d)   (strlen ((d)->d_name))
-#else
-#  if defined (HAVE_SYS_NDIR_H)
-#    include <sys/ndir.h>
-#  endif
-#  if defined (HAVE_SYS_DIR_H)
-#    include <sys/dir.h>
-#  endif
-#  if defined (HAVE_NDIR_H)
-#    include <ndir.h>
-#  endif
-#  if !defined (dirent)
-#    define dirent direct
-#  endif /* !dirent */
-#  define D_NAMLEN(d)   ((d)->d_namlen)
-#endif /* !HAVE_DIRENT_H */
-
-#if defined (STRUCT_DIRENT_HAS_D_INO) && !defined (STRUCT_DIRENT_HAS_D_FILENO)
-#  define d_fileno d_ino
-#endif
-
-#if defined (_POSIX_SOURCE) && (!defined (STRUCT_DIRENT_HAS_D_INO) || defined (BROKEN_DIRENT_D_INO))
-/* Posix does not require that the d_ino field be present, and some
-   systems do not provide it. */
-#  define REAL_DIR_ENTRY(dp) 1
-#else
-#  define REAL_DIR_ENTRY(dp) (dp->d_ino != 0)
-#endif /* _POSIX_SOURCE */
-
-#endif /* !_POSIXDIR_H_ */
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..8b1638454d34a9dc3cab96d77b342e1603a111d8
--- /dev/null
@@ -0,0 +1 @@
+../../include/posixdir.h
\ No newline at end of file
deleted file mode 100644 (file)
index b52aa00332b66881b88d793207e9865a05d7ed32..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */
-
-/* Copyright (C) 1987,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 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
-
-#ifndef _POSIXJMP_H_
-#define _POSIXJMP_H_
-
-#include <setjmp.h>
-
-/* This *must* be included *after* config.h */
-
-#if defined (HAVE_POSIX_SIGSETJMP)
-#  define procenv_t    sigjmp_buf
-#  if !defined (__OPENNT)
-#    undef setjmp
-#    define setjmp(x)  sigsetjmp((x), 1)
-#    undef longjmp
-#    define longjmp(x, n)      siglongjmp((x), (n))
-#  endif /* !__OPENNT */
-#else
-#  define procenv_t    jmp_buf
-#endif
-
-#endif /* _POSIXJMP_H_ */
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..b4d3ee74b0f8b1b26556ce402d8e1807ae35c1f5
--- /dev/null
@@ -0,0 +1 @@
+../../include/posixjmp.h
\ No newline at end of file
deleted file mode 100644 (file)
index c93b52887e9dfc5b0405153cc9c3658f0281ac1c..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/* posixstat.h -- Posix stat(2) definitions for systems that
-   don't have them. */
-
-/* Copyright (C) 1987,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 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
-
-/* This file should be included instead of <sys/stat.h>.
-   It relies on the local sys/stat.h to work though. */
-#if !defined (_POSIXSTAT_H_)
-#define _POSIXSTAT_H_
-
-#include <sys/stat.h>
-
-#if defined (STAT_MACROS_BROKEN)
-#  undef S_ISBLK
-#  undef S_ISCHR
-#  undef S_ISDIR
-#  undef S_ISFIFO
-#  undef S_ISREG
-#  undef S_ISLNK
-#endif /* STAT_MACROS_BROKEN */
-
-/* These are guaranteed to work only on isc386 */
-#if !defined (S_IFDIR) && !defined (S_ISDIR)
-#  define S_IFDIR 0040000
-#endif /* !S_IFDIR && !S_ISDIR */
-#if !defined (S_IFMT)
-#  define S_IFMT  0170000
-#endif /* !S_IFMT */
-
-/* Posix 1003.1 5.6.1.1 <sys/stat.h> file types */
-
-/* Some Posix-wannabe systems define _S_IF* macros instead of S_IF*, but
-   do not provide the S_IS* macros that Posix requires. */
-
-#if defined (_S_IFMT) && !defined (S_IFMT)
-#define S_IFMT _S_IFMT
-#endif
-#if defined (_S_IFIFO) && !defined (S_IFIFO)
-#define S_IFIFO _S_IFIFO
-#endif
-#if defined (_S_IFCHR) && !defined (S_IFCHR)
-#define S_IFCHR _S_IFCHR
-#endif
-#if defined (_S_IFDIR) && !defined (S_IFDIR)
-#define S_IFDIR _S_IFDIR
-#endif
-#if defined (_S_IFBLK) && !defined (S_IFBLK)
-#define S_IFBLK _S_IFBLK
-#endif
-#if defined (_S_IFREG) && !defined (S_IFREG)
-#define S_IFREG _S_IFREG
-#endif
-#if defined (_S_IFLNK) && !defined (S_IFLNK)
-#define S_IFLNK _S_IFLNK
-#endif
-#if defined (_S_IFSOCK) && !defined (S_IFSOCK)
-#define S_IFSOCK _S_IFSOCK
-#endif
-
-/* Test for each symbol individually and define the ones necessary (some
-   systems claiming Posix compatibility define some but not all). */
-
-#if defined (S_IFBLK) && !defined (S_ISBLK)
-#define        S_ISBLK(m)      (((m)&S_IFMT) == S_IFBLK)       /* block device */
-#endif
-
-#if defined (S_IFCHR) && !defined (S_ISCHR)
-#define        S_ISCHR(m)      (((m)&S_IFMT) == S_IFCHR)       /* character device */
-#endif
-
-#if defined (S_IFDIR) && !defined (S_ISDIR)
-#define        S_ISDIR(m)      (((m)&S_IFMT) == S_IFDIR)       /* directory */
-#endif
-
-#if defined (S_IFREG) && !defined (S_ISREG)
-#define        S_ISREG(m)      (((m)&S_IFMT) == S_IFREG)       /* file */
-#endif
-
-#if defined (S_IFIFO) && !defined (S_ISFIFO)
-#define        S_ISFIFO(m)     (((m)&S_IFMT) == S_IFIFO)       /* fifo - named pipe */
-#endif
-
-#if defined (S_IFLNK) && !defined (S_ISLNK)
-#define        S_ISLNK(m)      (((m)&S_IFMT) == S_IFLNK)       /* symbolic link */
-#endif
-
-#if defined (S_IFSOCK) && !defined (S_ISSOCK)
-#define        S_ISSOCK(m)     (((m)&S_IFMT) == S_IFSOCK)      /* socket */
-#endif
-
-/*
- * POSIX 1003.1 5.6.1.2 <sys/stat.h> File Modes
- */
-
-#if !defined (S_IRWXU)
-#  if !defined (S_IREAD)
-#    define S_IREAD    00400
-#    define S_IWRITE   00200
-#    define S_IEXEC    00100
-#  endif /* S_IREAD */
-
-#  if !defined (S_IRUSR)
-#    define S_IRUSR    S_IREAD                 /* read, owner */
-#    define S_IWUSR    S_IWRITE                /* write, owner */
-#    define S_IXUSR    S_IEXEC                 /* execute, owner */
-
-#    define S_IRGRP    (S_IREAD  >> 3)         /* read, group */
-#    define S_IWGRP    (S_IWRITE >> 3)         /* write, group */
-#    define S_IXGRP    (S_IEXEC  >> 3)         /* execute, group */
-
-#    define S_IROTH    (S_IREAD  >> 6)         /* read, other */
-#    define S_IWOTH    (S_IWRITE >> 6)         /* write, other */
-#    define S_IXOTH    (S_IEXEC  >> 6)         /* execute, other */
-#  endif /* !S_IRUSR */
-
-#  define S_IRWXU      (S_IRUSR | S_IWUSR | S_IXUSR)
-#  define S_IRWXG      (S_IRGRP | S_IWGRP | S_IXGRP)
-#  define S_IRWXO      (S_IROTH | S_IWOTH | S_IXOTH)
-#endif /* !S_IRWXU */
-
-/* These are non-standard, but are used in builtins.c$symbolic_umask() */
-#define S_IRUGO                (S_IRUSR | S_IRGRP | S_IROTH)
-#define S_IWUGO                (S_IWUSR | S_IWGRP | S_IWOTH)
-#define S_IXUGO                (S_IXUSR | S_IXGRP | S_IXOTH)
-
-#endif /* _POSIXSTAT_H_ */
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..c6164b792336b1eb4f0d28ecc5e2fb6a0dc16761
--- /dev/null
@@ -0,0 +1 @@
+../../include/posixstat.h
\ No newline at end of file
index 8bb0850..82a7fe3 100644 (file)
@@ -696,6 +696,11 @@ extern int rl_attempted_completion_over;
    functions. */
 extern int rl_completion_type;
 
+/* Up to this many items will be displayed in response to a
+   possible-completions call.  After that, we ask the user if she
+   is sure she wants to see them all.  The default value is 100. */
+extern int rl_completion_query_items;
+
 /* Character appended to completed words when at the end of the line.  The
    default is a space.  Nothing is added if this is '\0'. */
 extern int rl_completion_append_character;
@@ -704,10 +709,18 @@ extern int rl_completion_append_character;
    rl_completion_append_character will not be appended. */
 extern int rl_completion_suppress_append;
 
-/* Up to this many items will be displayed in response to a
-   possible-completions call.  After that, we ask the user if she
-   is sure she wants to see them all.  The default value is 100. */
-extern int rl_completion_query_items;
+/* Set to any quote character readline thinks it finds before any application
+   completion function is called. */
+extern int rl_completion_quote_character;
+
+/* Set to a non-zero value if readline found quoting anywhere in the word to
+   be completed; set before any application completion function is called. */
+extern int rl_completion_found_quote;
+
+/* If non-zero, the completion functions don't append any closing quote.
+   This is set to 0 by rl_complete_internal and may be changed by an
+   application-specific completion function. */
+extern int rl_completion_suppress_quote;
 
 /* If non-zero, a slash will be appended to completed filenames that are
    symbolic links to directory names, subject to the value of the
index c7ebeb1..820428d 100644 (file)
@@ -1,6 +1,6 @@
 /* savestring.c  */
 
-/* Copyright (C) 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1998,2003 Free Software Foundation, Inc.
 
    This file is part of the GNU Readline Library, a library for
    reading lines of text with interactive input and history editing.
@@ -19,6 +19,7 @@
    is generally kept in a file called COPYING or LICENSE.  If you do not
    have a copy of the license, write to the Free Software Foundation,
    59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
 
 #include <config.h>
 #ifdef HAVE_STRING_H
index ad27cc1..a07e2b9 100644 (file)
@@ -126,6 +126,7 @@ sh_set_lines_and_columns (lines, cols)
   b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("LINES=") + 1);
   sprintf (b, "LINES=%d", lines);
   putenv (b);
+
   b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("COLUMNS=") + 1);
   sprintf (b, "COLUMNS=%d", cols);
   putenv (b);
@@ -134,9 +135,12 @@ sh_set_lines_and_columns (lines, cols)
   b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1);
   sprintf (b, "%d", lines);
   setenv ("LINES", b, 1);
+  free (b);
+
   b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1);
   sprintf (b, "%d", cols);
   setenv ("COLUMNS", b, 1);
+  free (b);
 #  endif /* HAVE_SETENV */
 #endif /* !HAVE_PUTENV */
 }
deleted file mode 100644 (file)
index 154f7f8108d075569576990c9ee5c23be93b2950..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,458 +0,0 @@
-/* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */
-
-/* Copyright (C) 1988,1989 Free Software Foundation, Inc.
-
-   This file is part of GNU Readline, a library for reading lines
-   of text with interactive input and history editing.
-
-   Readline 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.
-
-   Readline 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 Readline; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
-
-#if defined (HAVE_CONFIG_H)
-#  include <config.h>
-#endif
-
-#if defined (HAVE_UNISTD_H)
-#  ifdef _MINIX
-#    include <sys/types.h>
-#  endif
-#  include <unistd.h>
-#endif
-
-#if defined (HAVE_STRING_H)
-#  include <string.h>
-#else /* !HAVE_STRING_H */
-#  include <strings.h>
-#endif /* !HAVE_STRING_H */  
-
-#if defined (HAVE_STDLIB_H)
-#  include <stdlib.h>
-#else
-#  include "ansi_stdlib.h"
-#endif /* HAVE_STDLIB_H */
-
-#include <sys/types.h>
-#include <pwd.h>
-
-#include "tilde.h"
-
-#if defined (TEST) || defined (STATIC_MALLOC)
-static void *xmalloc (), *xrealloc ();
-#else
-#  include "xmalloc.h"
-#endif /* TEST || STATIC_MALLOC */
-
-#if !defined (HAVE_GETPW_DECLS)
-extern struct passwd *getpwuid PARAMS((uid_t));
-extern struct passwd *getpwnam PARAMS((const char *));
-#endif /* !HAVE_GETPW_DECLS */
-
-#if !defined (savestring)
-#define savestring(x) strcpy ((char *)xmalloc (1 + strlen (x)), (x))
-#endif /* !savestring */
-
-#if !defined (NULL)
-#  if defined (__STDC__)
-#    define NULL ((void *) 0)
-#  else
-#    define NULL 0x0
-#  endif /* !__STDC__ */
-#endif /* !NULL */
-
-/* If being compiled as part of bash, these will be satisfied from
-   variables.o.  If being compiled as part of readline, they will
-   be satisfied from shell.o. */
-extern char *sh_get_home_dir PARAMS((void));
-extern char *sh_get_env_value PARAMS((const char *));
-
-/* The default value of tilde_additional_prefixes.  This is set to
-   whitespace preceding a tilde so that simple programs which do not
-   perform any word separation get desired behaviour. */
-static const char *default_prefixes[] =
-  { " ~", "\t~", (const char *)NULL };
-
-/* The default value of tilde_additional_suffixes.  This is set to
-   whitespace or newline so that simple programs which do not
-   perform any word separation get desired behaviour. */
-static const char *default_suffixes[] =
-  { " ", "\n", (const char *)NULL };
-
-/* If non-null, this contains the address of a function that the application
-   wants called before trying the standard tilde expansions.  The function
-   is called with the text sans tilde, and returns a malloc()'ed string
-   which is the expansion, or a NULL pointer if the expansion fails. */
-tilde_hook_func_t *tilde_expansion_preexpansion_hook = (tilde_hook_func_t *)NULL;
-
-/* If non-null, this contains the address of a function to call if the
-   standard meaning for expanding a tilde fails.  The function is called
-   with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
-   which is the expansion, or a NULL pointer if there is no expansion. */
-tilde_hook_func_t *tilde_expansion_failure_hook = (tilde_hook_func_t *)NULL;
-
-/* When non-null, this is a NULL terminated array of strings which
-   are duplicates for a tilde prefix.  Bash uses this to expand
-   `=~' and `:~'. */
-char **tilde_additional_prefixes = (char **)default_prefixes;
-
-/* When non-null, this is a NULL terminated array of strings which match
-   the end of a username, instead of just "/".  Bash sets this to
-   `:' and `=~'. */
-char **tilde_additional_suffixes = (char **)default_suffixes;
-
-static int tilde_find_prefix PARAMS((const char *, int *));
-static int tilde_find_suffix PARAMS((const char *));
-static char *isolate_tilde_prefix PARAMS((const char *, int *));
-static char *glue_prefix_and_suffix PARAMS((char *, const char *, int));
-
-/* Find the start of a tilde expansion in STRING, and return the index of
-   the tilde which starts the expansion.  Place the length of the text
-   which identified this tilde starter in LEN, excluding the tilde itself. */
-static int
-tilde_find_prefix (string, len)
-     const char *string;
-     int *len;
-{
-  register int i, j, string_len;
-  register char **prefixes;
-
-  prefixes = tilde_additional_prefixes;
-
-  string_len = strlen (string);
-  *len = 0;
-
-  if (*string == '\0' || *string == '~')
-    return (0);
-
-  if (prefixes)
-    {
-      for (i = 0; i < string_len; i++)
-       {
-         for (j = 0; prefixes[j]; j++)
-           {
-             if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0)
-               {
-                 *len = strlen (prefixes[j]) - 1;
-                 return (i + *len);
-               }
-           }
-       }
-    }
-  return (string_len);
-}
-
-/* Find the end of a tilde expansion in STRING, and return the index of
-   the character which ends the tilde definition.  */
-static int
-tilde_find_suffix (string)
-     const char *string;
-{
-  register int i, j, string_len;
-  register char **suffixes;
-
-  suffixes = tilde_additional_suffixes;
-  string_len = strlen (string);
-
-  for (i = 0; i < string_len; i++)
-    {
-#if defined (__MSDOS__)
-      if (string[i] == '/' || string[i] == '\\' /* || !string[i] */)
-#else
-      if (string[i] == '/' /* || !string[i] */)
-#endif
-       break;
-
-      for (j = 0; suffixes && suffixes[j]; j++)
-       {
-         if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0)
-           return (i);
-       }
-    }
-  return (i);
-}
-
-/* Return a new string which is the result of tilde expanding STRING. */
-char *
-tilde_expand (string)
-     const char *string;
-{
-  char *result;
-  int result_size, result_index;
-
-  result_index = result_size = 0;
-  if (result = strchr (string, '~'))
-    result = (char *)xmalloc (result_size = (strlen (string) + 16));
-  else
-    result = (char *)xmalloc (result_size = (strlen (string) + 1));
-
-  /* Scan through STRING expanding tildes as we come to them. */
-  while (1)
-    {
-      register int start, end;
-      char *tilde_word, *expansion;
-      int len;
-
-      /* Make START point to the tilde which starts the expansion. */
-      start = tilde_find_prefix (string, &len);
-
-      /* Copy the skipped text into the result. */
-      if ((result_index + start + 1) > result_size)
-       result = (char *)xrealloc (result, 1 + (result_size += (start + 20)));
-
-      strncpy (result + result_index, string, start);
-      result_index += start;
-
-      /* Advance STRING to the starting tilde. */
-      string += start;
-
-      /* Make END be the index of one after the last character of the
-        username. */
-      end = tilde_find_suffix (string);
-
-      /* If both START and END are zero, we are all done. */
-      if (!start && !end)
-       break;
-
-      /* Expand the entire tilde word, and copy it into RESULT. */
-      tilde_word = (char *)xmalloc (1 + end);
-      strncpy (tilde_word, string, end);
-      tilde_word[end] = '\0';
-      string += end;
-
-      expansion = tilde_expand_word (tilde_word);
-      free (tilde_word);
-
-      len = strlen (expansion);
-#ifdef __CYGWIN__
-      /* Fix for Cygwin to prevent ~user/xxx from expanding to //xxx when
-        $HOME for `user' is /.  On cygwin, // denotes a network drive. */
-      if (len > 1 || *expansion != '/' || *string != '/')
-#endif
-       {
-         if ((result_index + len + 1) > result_size)
-           result = (char *)xrealloc (result, 1 + (result_size += (len + 20)));
-
-         strcpy (result + result_index, expansion);
-         result_index += len;
-       }
-      free (expansion);
-    }
-
-  result[result_index] = '\0';
-
-  return (result);
-}
-
-/* Take FNAME and return the tilde prefix we want expanded.  If LENP is
-   non-null, the index of the end of the prefix into FNAME is returned in
-   the location it points to. */
-static char *
-isolate_tilde_prefix (fname, lenp)
-     const char *fname;
-     int *lenp;
-{
-  char *ret;
-  int i;
-
-  ret = (char *)xmalloc (strlen (fname));
-#if defined (__MSDOS__)
-  for (i = 1; fname[i] && fname[i] != '/' && fname[i] != '\\'; i++)
-#else
-  for (i = 1; fname[i] && fname[i] != '/'; i++)
-#endif
-    ret[i - 1] = fname[i];
-  ret[i - 1] = '\0';
-  if (lenp)
-    *lenp = i;
-  return ret;
-}
-
-/* Return a string that is PREFIX concatenated with SUFFIX starting at
-   SUFFIND. */
-static char *
-glue_prefix_and_suffix (prefix, suffix, suffind)
-     char *prefix;
-     const char *suffix;
-     int suffind;
-{
-  char *ret;
-  int plen, slen;
-
-  plen = (prefix && *prefix) ? strlen (prefix) : 0;
-  slen = strlen (suffix + suffind);
-  ret = (char *)xmalloc (plen + slen + 1);
-  if (plen)
-    strcpy (ret, prefix);
-  strcpy (ret + plen, suffix + suffind);
-  return ret;
-}
-
-/* Do the work of tilde expansion on FILENAME.  FILENAME starts with a
-   tilde.  If there is no expansion, call tilde_expansion_failure_hook.
-   This always returns a newly-allocated string, never static storage. */
-char *
-tilde_expand_word (filename)
-     const char *filename;
-{
-  char *dirname, *expansion, *username;
-  int user_len;
-  struct passwd *user_entry;
-
-  if (filename == 0)
-    return ((char *)NULL);
-
-  if (*filename != '~')
-    return (savestring (filename));
-
-  /* A leading `~/' or a bare `~' is *always* translated to the value of
-     $HOME or the home directory of the current user, regardless of any
-     preexpansion hook. */
-  if (filename[1] == '\0' || filename[1] == '/')
-    {
-      /* Prefix $HOME to the rest of the string. */
-      expansion = sh_get_env_value ("HOME");
-
-      /* If there is no HOME variable, look up the directory in
-        the password database. */
-      if (expansion == 0)
-       expansion = sh_get_home_dir ();
-
-      return (glue_prefix_and_suffix (expansion, filename, 1));
-    }
-
-  username = isolate_tilde_prefix (filename, &user_len);
-
-  if (tilde_expansion_preexpansion_hook)
-    {
-      expansion = (*tilde_expansion_preexpansion_hook) (username);
-      if (expansion)
-       {
-         dirname = glue_prefix_and_suffix (expansion, filename, user_len);
-         free (username);
-         free (expansion);
-         return (dirname);
-       }
-    }
-
-  /* No preexpansion hook, or the preexpansion hook failed.  Look in the
-     password database. */
-  dirname = (char *)NULL;
-  user_entry = getpwnam (username);
-  if (user_entry == 0)
-    {
-      /* If the calling program has a special syntax for expanding tildes,
-        and we couldn't find a standard expansion, then let them try. */
-      if (tilde_expansion_failure_hook)
-       {
-         expansion = (*tilde_expansion_failure_hook) (username);
-         if (expansion)
-           {
-             dirname = glue_prefix_and_suffix (expansion, filename, user_len);
-             free (expansion);
-           }
-       }
-      free (username);
-      /* If we don't have a failure hook, or if the failure hook did not
-        expand the tilde, return a copy of what we were passed. */
-      if (dirname == 0)
-       dirname = savestring (filename);
-    }
-  else
-    {
-      free (username);
-      dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
-    }
-
-  endpwent ();
-  return (dirname);
-}
-
-\f
-#if defined (TEST)
-#undef NULL
-#include <stdio.h>
-
-main (argc, argv)
-     int argc;
-     char **argv;
-{
-  char *result, line[512];
-  int done = 0;
-
-  while (!done)
-    {
-      printf ("~expand: ");
-      fflush (stdout);
-
-      if (!gets (line))
-       strcpy (line, "done");
-
-      if ((strcmp (line, "done") == 0) ||
-         (strcmp (line, "quit") == 0) ||
-         (strcmp (line, "exit") == 0))
-       {
-         done = 1;
-         break;
-       }
-
-      result = tilde_expand (line);
-      printf ("  --> %s\n", result);
-      free (result);
-    }
-  exit (0);
-}
-
-static void memory_error_and_abort ();
-
-static void *
-xmalloc (bytes)
-     size_t bytes;
-{
-  void *temp = (char *)malloc (bytes);
-
-  if (!temp)
-    memory_error_and_abort ();
-  return (temp);
-}
-
-static void *
-xrealloc (pointer, bytes)
-     void *pointer;
-     int bytes;
-{
-  void *temp;
-
-  if (!pointer)
-    temp = malloc (bytes);
-  else
-    temp = realloc (pointer, bytes);
-
-  if (!temp)
-    memory_error_and_abort ();
-
-  return (temp);
-}
-
-static void
-memory_error_and_abort ()
-{
-  fprintf (stderr, "readline: out of virtual memory\n");
-  abort ();
-}
-
-/*
- * Local variables:
- * compile-command: "gcc -g -DTEST -o tilde tilde.c"
- * end:
- */
-#endif /* TEST */
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..439ceedeb47c83ea46876a2fd8ba3f3b3b353e7a
--- /dev/null
@@ -0,0 +1 @@
+../tilde/tilde.c
\ No newline at end of file
deleted file mode 100644 (file)
index f8182c999d9b43c2b88cceb0f4142eb607b95154..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/* tilde.h: Externally available variables and function in libtilde.a. */
-
-/* Copyright (C) 1992 Free Software Foundation, Inc.
-
-   This file contains the Readline Library (the Library), a set of
-   routines for providing Emacs style line input to programs that ask
-   for it.
-
-   The Library 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.
-
-   The Library 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.
-
-   The GNU General Public License is often shipped with GNU software, and
-   is generally kept in a file called COPYING or LICENSE.  If you do not
-   have a copy of the license, write to the Free Software Foundation,
-   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
-
-#if !defined (_TILDE_H_)
-#  define _TILDE_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* A function can be defined using prototypes and compile on both ANSI C
-   and traditional C compilers with something like this:
-       extern char *func PARAMS((char *, char *, int)); */
-
-#if !defined (PARAMS)
-#  if defined (__STDC__) || defined (__GNUC__) || defined (__cplusplus)
-#    define PARAMS(protos) protos
-#  else
-#    define PARAMS(protos) ()
-#  endif
-#endif
-
-typedef char *tilde_hook_func_t PARAMS((char *));
-
-/* If non-null, this contains the address of a function that the application
-   wants called before trying the standard tilde expansions.  The function
-   is called with the text sans tilde, and returns a malloc()'ed string
-   which is the expansion, or a NULL pointer if the expansion fails. */
-extern tilde_hook_func_t *tilde_expansion_preexpansion_hook;
-
-/* If non-null, this contains the address of a function to call if the
-   standard meaning for expanding a tilde fails.  The function is called
-   with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
-   which is the expansion, or a NULL pointer if there is no expansion. */
-extern tilde_hook_func_t *tilde_expansion_failure_hook;
-
-/* When non-null, this is a NULL terminated array of strings which
-   are duplicates for a tilde prefix.  Bash uses this to expand
-   `=~' and `:~'. */
-extern char **tilde_additional_prefixes;
-
-/* When non-null, this is a NULL terminated array of strings which match
-   the end of a username, instead of just "/".  Bash sets this to
-   `:' and `=~'. */
-extern char **tilde_additional_suffixes;
-
-/* Return a new string which is the result of tilde expanding STRING. */
-extern char *tilde_expand PARAMS((const char *));
-
-/* Do the work of tilde expansion on FILENAME.  FILENAME starts with a
-   tilde.  If there is no expansion, call tilde_expansion_failure_hook. */
-extern char *tilde_expand_word PARAMS((const char *));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _TILDE_H_ */
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..6fea2aeaa843ff166e9838a0c7fcbc51be282dca
--- /dev/null
@@ -0,0 +1 @@
+../tilde/tilde.h
\ No newline at end of file
index 1050af6..0dce632 100644 (file)
@@ -429,7 +429,8 @@ rl_vi_eWord (count, ignore)
 
       /* Move to the next non-whitespace character (to the start of the
         next word). */
-      while (++rl_point < rl_end && whitespace (rl_line_buffer[rl_point]));
+      while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+       rl_point++;
 
       if (rl_point && rl_point < rl_end)
        {
diff --git a/lib/readline/vi_mode.c.save b/lib/readline/vi_mode.c.save
new file mode 100644 (file)
index 0000000..4b299e1
--- /dev/null
@@ -0,0 +1,1485 @@
+/* vi_mode.c -- A vi emulation mode for Bash.
+   Derived from code written by Jeff Sparkes (jsparkes@bnr.ca).  */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+   This file is part of the GNU Readline Library, a library for
+   reading lines of text with interactive input and history editing.
+
+   The GNU Readline Library 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.
+
+   The GNU Readline Library 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.
+
+   The GNU General Public License is often shipped with GNU software, and
+   is generally kept in a file called COPYING or LICENSE.  If you do not
+   have a copy of the license, write to the Free Software Foundation,
+   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+/* **************************************************************** */
+/*                                                                 */
+/*                     VI Emulation Mode                           */
+/*                                                                 */
+/* **************************************************************** */
+#include "rlconf.h"
+
+#if defined (VI_MODE)
+
+#if defined (HAVE_CONFIG_H)
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined (HAVE_STDLIB_H)
+#  include <stdlib.h>
+#else
+#  include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#if defined (HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+#include <stdio.h>
+
+/* Some standard library routines. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+#include "readline.h"
+#include "history.h"
+
+#include "rlprivate.h"
+#include "xmalloc.h"
+
+#ifndef member
+#define member(c, s) ((c) ? (char *)strchr ((s), (c)) != (char *)NULL : 0)
+#endif
+
+/* Non-zero means enter insertion mode. */
+static int _rl_vi_doing_insert;
+
+/* Command keys which do movement for xxx_to commands. */
+static const char *vi_motion = " hl^$0ftFT;,%wbeWBE|";
+
+/* Keymap used for vi replace characters.  Created dynamically since
+   rarely used. */
+static Keymap vi_replace_map;
+
+/* The number of characters inserted in the last replace operation. */
+static int vi_replace_count;
+
+/* If non-zero, we have text inserted after a c[motion] command that put
+   us implicitly into insert mode.  Some people want this text to be
+   attached to the command so that it is `redoable' with `.'. */
+static int vi_continued_command;
+static char *vi_insert_buffer;
+static int vi_insert_buffer_size;
+
+static int _rl_vi_last_command = 'i';  /* default `.' puts you in insert mode */
+static int _rl_vi_last_repeat = 1;
+static int _rl_vi_last_arg_sign = 1;
+static int _rl_vi_last_motion;
+#if defined (HANDLE_MULTIBYTE)
+static char _rl_vi_last_search_mbchar[MB_LEN_MAX];
+#else
+static int _rl_vi_last_search_char;
+#endif
+static int _rl_vi_last_replacement;
+
+static int _rl_vi_last_key_before_insert;
+
+static int vi_redoing;
+
+/* Text modification commands.  These are the `redoable' commands. */
+static const char *vi_textmod = "_*\\AaIiCcDdPpYyRrSsXx~";
+
+/* Arrays for the saved marks. */
+static int vi_mark_chars['z' - 'a' + 1];
+
+static void _rl_vi_stuff_insert PARAMS((int));
+static void _rl_vi_save_insert PARAMS((UNDO_LIST *));
+static int rl_digit_loop1 PARAMS((void));
+
+void
+_rl_vi_initialize_line ()
+{
+  register int i;
+
+  for (i = 0; i < sizeof (vi_mark_chars) / sizeof (int); i++)
+    vi_mark_chars[i] = -1;
+}
+
+void
+_rl_vi_reset_last ()
+{
+  _rl_vi_last_command = 'i';
+  _rl_vi_last_repeat = 1;
+  _rl_vi_last_arg_sign = 1;
+  _rl_vi_last_motion = 0;
+}
+
+void
+_rl_vi_set_last (key, repeat, sign)
+     int key, repeat, sign;
+{
+  _rl_vi_last_command = key;
+  _rl_vi_last_repeat = repeat;
+  _rl_vi_last_arg_sign = sign;
+}
+
+/* Is the command C a VI mode text modification command? */
+int
+_rl_vi_textmod_command (c)
+     int c;
+{
+  return (member (c, vi_textmod));
+}
+
+static void
+_rl_vi_stuff_insert (count)
+     int count;
+{
+  rl_begin_undo_group ();
+  while (count--)
+    rl_insert_text (vi_insert_buffer);
+  rl_end_undo_group ();
+}
+
+/* Bound to `.'.  Called from command mode, so we know that we have to
+   redo a text modification command.  The default for _rl_vi_last_command
+   puts you back into insert mode. */
+int
+rl_vi_redo (count, c)
+     int count, c;
+{
+  int r;
+
+  if (!rl_explicit_arg)
+    {
+      rl_numeric_arg = _rl_vi_last_repeat;
+      rl_arg_sign = _rl_vi_last_arg_sign;
+    }
+
+  r = 0;
+  vi_redoing = 1;
+  /* If we're redoing an insert with `i', stuff in the inserted text
+     and do not go into insertion mode. */
+  if (_rl_vi_last_command == 'i' && vi_insert_buffer && *vi_insert_buffer)
+    {
+      _rl_vi_stuff_insert (count);
+      /* And back up point over the last character inserted. */
+      if (rl_point > 0)
+       rl_point--;
+    }
+  else
+    r = _rl_dispatch (_rl_vi_last_command, _rl_keymap);
+  vi_redoing = 0;
+
+  return (r);
+}
+
+/* A placeholder for further expansion. */
+int
+rl_vi_undo (count, key)
+     int count, key;
+{
+  return (rl_undo_command (count, key));
+}
+    
+/* Yank the nth arg from the previous line into this line at point. */
+int
+rl_vi_yank_arg (count, key)
+     int count, key;
+{
+  /* Readline thinks that the first word on a line is the 0th, while vi
+     thinks the first word on a line is the 1st.  Compensate. */
+  if (rl_explicit_arg)
+    rl_yank_nth_arg (count - 1, 0);
+  else
+    rl_yank_nth_arg ('$', 0);
+
+  return (0);
+}
+
+/* With an argument, move back that many history lines, else move to the
+   beginning of history. */
+int
+rl_vi_fetch_history (count, c)
+     int count, c;
+{
+  int wanted;
+
+  /* Giving an argument of n means we want the nth command in the history
+     file.  The command number is interpreted the same way that the bash
+     `history' command does it -- that is, giving an argument count of 450
+     to this command would get the command listed as number 450 in the
+     output of `history'. */
+  if (rl_explicit_arg)
+    {
+      wanted = history_base + where_history () - count;
+      if (wanted <= 0)
+        rl_beginning_of_history (0, 0);
+      else
+        rl_get_previous_history (wanted, c);
+    }
+  else
+    rl_beginning_of_history (count, 0);
+  return (0);
+}
+
+/* Search again for the last thing searched for. */
+int
+rl_vi_search_again (count, key)
+     int count, key;
+{
+  switch (key)
+    {
+    case 'n':
+      rl_noninc_reverse_search_again (count, key);
+      break;
+
+    case 'N':
+      rl_noninc_forward_search_again (count, key);
+      break;
+    }
+  return (0);
+}
+
+/* Do a vi style search. */
+int
+rl_vi_search (count, key)
+     int count, key;
+{
+  switch (key)
+    {
+    case '?':
+      rl_noninc_forward_search (count, key);
+      break;
+
+    case '/':
+      rl_noninc_reverse_search (count, key);
+      break;
+
+    default:
+      rl_ding ();
+      break;
+    }
+  return (0);
+}
+
+/* Completion, from vi's point of view. */
+int
+rl_vi_complete (ignore, key)
+     int ignore, key;
+{
+  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++;
+    }
+
+  if (key == '*')
+    rl_complete_internal ('*');        /* Expansion and replacement. */
+  else if (key == '=')
+    rl_complete_internal ('?');        /* List possible completions. */
+  else if (key == '\\')
+    rl_complete_internal (TAB);        /* Standard Readline completion. */
+  else
+    rl_complete (0, key);
+
+  if (key == '*' || key == '\\')
+    {
+      _rl_vi_set_last (key, 1, rl_arg_sign);
+      rl_vi_insertion_mode (1, key);
+    }
+  return (0);
+}
+
+/* Tilde expansion for vi mode. */
+int
+rl_vi_tilde_expand (ignore, key)
+     int ignore, key;
+{
+  rl_tilde_expand (0, key);
+  _rl_vi_set_last (key, 1, rl_arg_sign);       /* XXX */
+  rl_vi_insertion_mode (1, key);
+  return (0);
+}
+
+/* Previous word in vi mode. */
+int
+rl_vi_prev_word (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_vi_next_word (-count, key));
+
+  if (rl_point == 0)
+    {
+      rl_ding ();
+      return (0);
+    }
+
+  if (_rl_uppercase_p (key))
+    rl_vi_bWord (count, key);
+  else
+    rl_vi_bword (count, key);
+
+  return (0);
+}
+
+/* Next word in vi mode. */
+int
+rl_vi_next_word (count, key)
+     int count, key;
+{
+  if (count < 0)
+    return (rl_vi_prev_word (-count, key));
+
+  if (rl_point >= (rl_end - 1))
+    {
+      rl_ding ();
+      return (0);
+    }
+
+  if (_rl_uppercase_p (key))
+    rl_vi_fWord (count, key);
+  else
+    rl_vi_fword (count, key);
+  return (0);
+}
+
+/* Move to the end of the ?next? word. */
+int
+rl_vi_end_word (count, key)
+     int count, key;
+{
+  if (count < 0)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  if (_rl_uppercase_p (key))
+    rl_vi_eWord (count, key);
+  else
+    rl_vi_eword (count, key);
+  return (0);
+}
+
+/* Move forward a word the way that 'W' does. */
+int
+rl_vi_fWord (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point < (rl_end - 1))
+    {
+      /* Skip until whitespace. */
+      while (!whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+       rl_point++;
+
+      /* Now skip whitespace. */
+      while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+       rl_point++;
+    }
+  return (0);
+}
+
+int
+rl_vi_bWord (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point > 0)
+    {
+      /* If we are at the start of a word, move back to whitespace so
+        we will go back to the start of the previous word. */
+      if (!whitespace (rl_line_buffer[rl_point]) &&
+         whitespace (rl_line_buffer[rl_point - 1]))
+       rl_point--;
+
+      while (rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
+       rl_point--;
+
+      if (rl_point > 0)
+       {
+         while (--rl_point >= 0 && !whitespace (rl_line_buffer[rl_point]));
+         rl_point++;
+       }
+    }
+  return (0);
+}
+
+int
+rl_vi_eWord (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point < (rl_end - 1))
+    {
+      if (!whitespace (rl_line_buffer[rl_point]))
+       rl_point++;
+
+      /* Move to the next non-whitespace character (to the start of the
+        next word). */
+      while (++rl_point < rl_end && whitespace (rl_line_buffer[rl_point]));
+
+      if (rl_point && rl_point < rl_end)
+       {
+         /* Skip whitespace. */
+         while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+           rl_point++;
+
+         /* Skip until whitespace. */
+         while (rl_point < rl_end && !whitespace (rl_line_buffer[rl_point]))
+           rl_point++;
+
+         /* Move back to the last character of the word. */
+         rl_point--;
+       }
+    }
+  return (0);
+}
+
+int
+rl_vi_fword (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point < (rl_end - 1))
+    {
+      /* Move to white space (really non-identifer). */
+      if (_rl_isident (rl_line_buffer[rl_point]))
+       {
+         while (_rl_isident (rl_line_buffer[rl_point]) && rl_point < rl_end)
+           rl_point++;
+       }
+      else /* if (!whitespace (rl_line_buffer[rl_point])) */
+       {
+         while (!_rl_isident (rl_line_buffer[rl_point]) &&
+                !whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+           rl_point++;
+       }
+
+      /* Move past whitespace. */
+      while (whitespace (rl_line_buffer[rl_point]) && rl_point < rl_end)
+       rl_point++;
+    }
+  return (0);
+}
+
+int
+rl_vi_bword (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point > 0)
+    {
+      int last_is_ident;
+
+      /* If we are at the start of a word, move back to whitespace
+        so we will go back to the start of the previous word. */
+      if (!whitespace (rl_line_buffer[rl_point]) &&
+         whitespace (rl_line_buffer[rl_point - 1]))
+       rl_point--;
+
+      /* If this character and the previous character are `opposite', move
+        back so we don't get messed up by the rl_point++ down there in
+        the while loop.  Without this code, words like `l;' screw up the
+        function. */
+      last_is_ident = _rl_isident (rl_line_buffer[rl_point - 1]);
+      if ((_rl_isident (rl_line_buffer[rl_point]) && !last_is_ident) ||
+         (!_rl_isident (rl_line_buffer[rl_point]) && last_is_ident))
+       rl_point--;
+
+      while (rl_point > 0 && whitespace (rl_line_buffer[rl_point]))
+       rl_point--;
+
+      if (rl_point > 0)
+       {
+         if (_rl_isident (rl_line_buffer[rl_point]))
+           while (--rl_point >= 0 && _rl_isident (rl_line_buffer[rl_point]));
+         else
+           while (--rl_point >= 0 && !_rl_isident (rl_line_buffer[rl_point]) &&
+                  !whitespace (rl_line_buffer[rl_point]));
+         rl_point++;
+       }
+    }
+  return (0);
+}
+
+int
+rl_vi_eword (count, ignore)
+     int count, ignore;
+{
+  while (count-- && rl_point < rl_end - 1)
+    {
+      if (!whitespace (rl_line_buffer[rl_point]))
+       rl_point++;
+
+      while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+       rl_point++;
+
+      if (rl_point < rl_end)
+       {
+         if (_rl_isident (rl_line_buffer[rl_point]))
+           while (++rl_point < rl_end && _rl_isident (rl_line_buffer[rl_point]));
+         else
+           while (++rl_point < rl_end && !_rl_isident (rl_line_buffer[rl_point])
+                  && !whitespace (rl_line_buffer[rl_point]));
+       }
+      rl_point--;
+    }
+  return (0);
+}
+
+int
+rl_vi_insert_beg (count, key)
+     int count, key;
+{
+  rl_beg_of_line (1, key);
+  rl_vi_insertion_mode (1, key);
+  return (0);
+}
+
+int
+rl_vi_append_mode (count, key)
+     int count, key;
+{
+  if (rl_point < rl_end)
+    {
+      if (MB_CUR_MAX == 1 || rl_byte_oriented)
+       rl_point++;
+      else
+        {
+          int point = rl_point;
+          rl_forward_char (1, key);
+          if (point == rl_point)
+            rl_point = rl_end;
+        }
+    }
+  rl_vi_insertion_mode (1, key);
+  return (0);
+}
+
+int
+rl_vi_append_eol (count, key)
+     int count, key;
+{
+  rl_end_of_line (1, key);
+  rl_vi_append_mode (1, key);
+  return (0);
+}
+
+/* What to do in the case of C-d. */
+int
+rl_vi_eof_maybe (count, c)
+     int count, c;
+{
+  return (rl_newline (1, '\n'));
+}
+
+/* Insertion mode stuff. */
+
+/* Switching from one mode to the other really just involves
+   switching keymaps. */
+int
+rl_vi_insertion_mode (count, key)
+     int count, key;
+{
+  _rl_keymap = vi_insertion_keymap;
+  _rl_vi_last_key_before_insert = key;
+  return (0);
+}
+
+static void
+_rl_vi_save_insert (up)
+      UNDO_LIST *up;
+{
+  int len, start, end;
+
+  if (up == 0)
+    {
+      if (vi_insert_buffer_size >= 1)
+       vi_insert_buffer[0] = '\0';
+      return;
+    }
+
+  start = up->start;
+  end = up->end;
+  len = end - start + 1;
+  if (len >= vi_insert_buffer_size)
+    {
+      vi_insert_buffer_size += (len + 32) - (len % 32);
+      vi_insert_buffer = (char *)xrealloc (vi_insert_buffer, vi_insert_buffer_size);
+    }
+  strncpy (vi_insert_buffer, rl_line_buffer + start, len - 1);
+  vi_insert_buffer[len-1] = '\0';
+}
+    
+void
+_rl_vi_done_inserting ()
+{
+  if (_rl_vi_doing_insert)
+    {
+      /* The `C', `s', and `S' commands set this. */
+      rl_end_undo_group ();
+      /* Now, the text between rl_undo_list->next->start and
+        rl_undo_list->next->end is what was inserted while in insert
+        mode.  It gets copied to VI_INSERT_BUFFER because it depends
+        on absolute indices into the line which may change (though they
+        probably will not). */
+      _rl_vi_doing_insert = 0;
+      _rl_vi_save_insert (rl_undo_list->next);
+      vi_continued_command = 1;
+    }
+  else
+    {
+      if (_rl_vi_last_key_before_insert == 'i' && rl_undo_list)
+        _rl_vi_save_insert (rl_undo_list);
+      /* XXX - Other keys probably need to be checked. */
+      else if (_rl_vi_last_key_before_insert == 'C')
+       rl_end_undo_group ();
+      while (_rl_undo_group_level > 0)
+       rl_end_undo_group ();
+      vi_continued_command = 0;
+    }
+}
+
+int
+rl_vi_movement_mode (count, key)
+     int count, key;
+{
+  if (rl_point > 0)
+    rl_backward_char (1, key);
+
+  _rl_keymap = vi_movement_keymap;
+  _rl_vi_done_inserting ();
+  return (0);
+}
+
+int
+rl_vi_arg_digit (count, c)
+     int count, c;
+{
+  if (c == '0' && rl_numeric_arg == 1 && !rl_explicit_arg)
+    return (rl_beg_of_line (1, c));
+  else
+    return (rl_digit_argument (count, c));
+}
+
+/* Change the case of the next COUNT characters. */
+#if defined (HANDLE_MULTIBYTE)
+static int
+_rl_vi_change_mbchar_case (count)
+     int count;
+{
+  wchar_t wc;
+  char mb[MB_LEN_MAX];
+  mbstate_t ps;
+
+  memset (&ps, 0, sizeof (mbstate_t));
+  if (_rl_adjust_point (rl_line_buffer, rl_point, &ps) > 0)
+    count--;
+  while (count-- && rl_point < rl_end)
+    {
+      mbrtowc (&wc, rl_line_buffer + rl_point, rl_end - rl_point, &ps);
+      if (iswupper (wc))
+       wc = towlower (wc);
+      else if (iswlower (wc))
+       wc = towupper (wc);
+      else
+       {
+         /* Just skip over chars neither upper nor lower case */
+         rl_forward_char (1, 0);
+         continue;
+       }
+
+      /* Vi is kind of strange here. */
+      if (wc)
+       {
+         wctomb (mb, wc);
+         rl_begin_undo_group ();
+         rl_delete (1, 0);
+         rl_insert_text (mb);
+         rl_end_undo_group ();
+         rl_vi_check ();
+       }
+      else
+        rl_forward_char (1, 0);
+    }
+
+  return 0;
+}
+#endif
+
+int
+rl_vi_change_case (count, ignore)
+     int count, ignore;
+{
+  char c = 0;
+
+  /* Don't try this on an empty line. */
+  if (rl_point >= rl_end)
+    return (0);
+
+#if defined (HANDLE_MULTIBYTE)
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    return (_rl_vi_change_mbchar_case (count));
+#endif
+
+  while (count-- && rl_point < rl_end)
+    {
+      if (_rl_uppercase_p (rl_line_buffer[rl_point]))
+       c = _rl_to_lower (rl_line_buffer[rl_point]);
+      else if (_rl_lowercase_p (rl_line_buffer[rl_point]))
+       c = _rl_to_upper (rl_line_buffer[rl_point]);
+      else
+       {
+         /* Just skip over characters neither upper nor lower case. */
+         rl_forward_char (1, c);
+         continue;
+       }
+
+      /* Vi is kind of strange here. */
+      if (c)
+       {
+         rl_begin_undo_group ();
+         rl_delete (1, c);
+         _rl_insert_char (1, c);
+         rl_end_undo_group ();
+         rl_vi_check ();
+        }
+      else
+       rl_forward_char (1, c);
+    }
+  return (0);
+}
+
+int
+rl_vi_put (count, key)
+     int count, key;
+{
+  if (!_rl_uppercase_p (key) && (rl_point + 1 <= rl_end))
+    rl_point = _rl_find_next_mbchar (rl_line_buffer, rl_point, 1, MB_FIND_NONZERO);
+
+  rl_yank (1, key);
+  rl_backward_char (1, key);
+  return (0);
+}
+
+int
+rl_vi_check ()
+{
+  if (rl_point && rl_point == rl_end)
+    {
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_NONZERO);
+      else
+        rl_point--;
+    }
+  return (0);
+}
+
+int
+rl_vi_column (count, key)
+     int count, key;
+{
+  if (count > rl_end)
+    rl_end_of_line (1, key);
+  else
+    rl_point = count - 1;
+  return (0);
+}
+
+int
+rl_vi_domove (key, nextkey)
+     int key, *nextkey;
+{
+  int c, save;
+  int old_end;
+
+  rl_mark = rl_point;
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  c = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+  *nextkey = c;
+
+  if (!member (c, vi_motion))
+    {
+      if (_rl_digit_p (c))
+       {
+         save = rl_numeric_arg;
+         rl_numeric_arg = _rl_digit_value (c);
+         rl_digit_loop1 ();
+         rl_numeric_arg *= save;
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+         c = rl_read_key ();   /* real command */
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
+         *nextkey = c;
+       }
+      else if (key == c && (key == 'd' || key == 'y' || key == 'c'))
+       {
+         rl_mark = rl_end;
+         rl_beg_of_line (1, c);
+         _rl_vi_last_motion = c;
+         return (0);
+       }
+      else
+       return (-1);
+    }
+
+  _rl_vi_last_motion = c;
+
+  /* Append a blank character temporarily so that the motion routines
+     work right at the end of the line. */
+  old_end = rl_end;
+  rl_line_buffer[rl_end++] = ' ';
+  rl_line_buffer[rl_end] = '\0';
+
+  _rl_dispatch (c, _rl_keymap);
+
+  /* Remove the blank that we added. */
+  rl_end = old_end;
+  rl_line_buffer[rl_end] = '\0';
+  if (rl_point > rl_end)
+    rl_point = rl_end;
+
+  /* No change in position means the command failed. */
+  if (rl_mark == rl_point)
+    return (-1);
+
+  /* rl_vi_f[wW]ord () leaves the cursor on the first character of the next
+     word.  If we are not at the end of the line, and we are on a
+     non-whitespace character, move back one (presumably to whitespace). */
+  if ((_rl_to_upper (c) == 'W') && rl_point < rl_end && rl_point > rl_mark &&
+      !whitespace (rl_line_buffer[rl_point]))
+    rl_point--;
+
+  /* If cw or cW, back up to the end of a word, so the behaviour of ce
+     or cE is the actual result.  Brute-force, no subtlety. */
+  if (key == 'c' && rl_point >= rl_mark && (_rl_to_upper (c) == 'W'))
+    {
+      /* Don't move farther back than where we started. */
+      while (rl_point > rl_mark && whitespace (rl_line_buffer[rl_point]))
+       rl_point--;
+
+      /* Posix.2 says that if cw or cW moves the cursor towards the end of
+        the line, the character under the cursor should be deleted. */
+      if (rl_point == rl_mark)
+        rl_point++;
+      else
+       {
+         /* Move past the end of the word so that the kill doesn't
+            remove the last letter of the previous word.  Only do this
+            if we are not at the end of the line. */
+         if (rl_point >= 0 && rl_point < (rl_end - 1) && !whitespace (rl_line_buffer[rl_point]))
+           rl_point++;
+       }
+    }
+
+  if (rl_mark < rl_point)
+    SWAP (rl_point, rl_mark);
+
+  return (0);
+}
+
+/* A simplified loop for vi. Don't dispatch key at end.
+   Don't recognize minus sign?
+   Should this do rl_save_prompt/rl_restore_prompt? */
+static int
+rl_digit_loop1 ()
+{
+  int key, c;
+
+  RL_SETSTATE(RL_STATE_NUMERICARG);
+  while (1)
+    {
+      if (rl_numeric_arg > 1000000)
+       {
+         rl_explicit_arg = rl_numeric_arg = 0;
+         rl_ding ();
+         rl_clear_message ();
+         RL_UNSETSTATE(RL_STATE_NUMERICARG);
+         return 1;
+       }
+      rl_message ("(arg: %d) ", rl_arg_sign * rl_numeric_arg);
+      RL_SETSTATE(RL_STATE_MOREINPUT);
+      key = c = rl_read_key ();
+      RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+      if (c >= 0 && _rl_keymap[c].type == ISFUNC &&
+         _rl_keymap[c].function == rl_universal_argument)
+       {
+         rl_numeric_arg *= 4;
+         continue;
+       }
+
+      c = UNMETA (c);
+      if (_rl_digit_p (c))
+       {
+         if (rl_explicit_arg)
+           rl_numeric_arg = (rl_numeric_arg * 10) + _rl_digit_value (c);
+         else
+           rl_numeric_arg = _rl_digit_value (c);
+         rl_explicit_arg = 1;
+       }
+      else
+       {
+         rl_clear_message ();
+         rl_stuff_char (key);
+         break;
+       }
+    }
+
+  RL_UNSETSTATE(RL_STATE_NUMERICARG);
+  return (0);
+}
+
+int
+rl_vi_delete_to (count, key)
+     int count, key;
+{
+  int c;
+
+  if (_rl_uppercase_p (key))
+    rl_stuff_char ('$');
+  else if (vi_redoing)
+    rl_stuff_char (_rl_vi_last_motion);
+
+  if (rl_vi_domove (key, &c))
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  /* These are the motion commands that do not require adjusting the
+     mark. */
+  if ((strchr (" l|h^0bB", c) == 0) && (rl_mark < rl_end))
+    rl_mark++;
+
+  rl_kill_text (rl_point, rl_mark);
+  return (0);
+}
+
+int
+rl_vi_change_to (count, key)
+     int count, key;
+{
+  int c, start_pos;
+
+  if (_rl_uppercase_p (key))
+    rl_stuff_char ('$');
+  else if (vi_redoing)
+    rl_stuff_char (_rl_vi_last_motion);
+
+  start_pos = rl_point;
+
+  if (rl_vi_domove (key, &c))
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  /* These are the motion commands that do not require adjusting the
+     mark.  c[wW] are handled by special-case code in rl_vi_domove(),
+     and already leave the mark at the correct location. */
+  if ((strchr (" l|hwW^0bB", c) == 0) && (rl_mark < rl_end))
+    rl_mark++;
+
+  /* The cursor never moves with c[wW]. */
+  if ((_rl_to_upper (c) == 'W') && rl_point < start_pos)
+    rl_point = start_pos;
+
+  if (vi_redoing)
+    {
+      if (vi_insert_buffer && *vi_insert_buffer)
+       rl_begin_undo_group ();
+      rl_delete_text (rl_point, rl_mark);
+      if (vi_insert_buffer && *vi_insert_buffer)
+       {
+         rl_insert_text (vi_insert_buffer);
+         rl_end_undo_group ();
+       }
+    }
+  else
+    {
+      rl_begin_undo_group ();          /* to make the `u' command work */
+      rl_kill_text (rl_point, rl_mark);
+      /* `C' does not save the text inserted for undoing or redoing. */
+      if (_rl_uppercase_p (key) == 0)
+        _rl_vi_doing_insert = 1;
+      _rl_vi_set_last (key, count, rl_arg_sign);
+      rl_vi_insertion_mode (1, key);
+    }
+
+  return (0);
+}
+
+int
+rl_vi_yank_to (count, key)
+     int count, key;
+{
+  int c, save = rl_point;
+
+  if (_rl_uppercase_p (key))
+    rl_stuff_char ('$');
+
+  if (rl_vi_domove (key, &c))
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  /* These are the motion commands that do not require adjusting the
+     mark. */
+  if ((strchr (" l|h^0%bB", c) == 0) && (rl_mark < rl_end))
+    rl_mark++;
+
+  rl_begin_undo_group ();
+  rl_kill_text (rl_point, rl_mark);
+  rl_end_undo_group ();
+  rl_do_undo ();
+  rl_point = save;
+
+  return (0);
+}
+
+int
+rl_vi_delete (count, key)
+     int count, key;
+{
+  int end;
+
+  if (rl_end == 0)
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+    end = _rl_find_next_mbchar (rl_line_buffer, rl_point, count, MB_FIND_NONZERO);
+  else
+    end = rl_point + count;
+
+  if (end >= rl_end)
+    end = rl_end;
+
+  rl_kill_text (rl_point, end);
+  
+  if (rl_point > 0 && rl_point == rl_end)
+    rl_backward_char (1, key);
+  return (0);
+}
+
+int
+rl_vi_back_to_indent (count, key)
+     int count, key;
+{
+  rl_beg_of_line (1, key);
+  while (rl_point < rl_end && whitespace (rl_line_buffer[rl_point]))
+    rl_point++;
+  return (0);
+}
+
+int
+rl_vi_first_print (count, key)
+     int count, key;
+{
+  return (rl_vi_back_to_indent (1, key));
+}
+
+int
+rl_vi_char_search (count, key)
+     int count, key;
+{
+#if defined (HANDLE_MULTIBYTE)
+  static char *target;
+  static int mb_len;
+#else
+  static char target;
+#endif
+  static int orig_dir, dir;
+
+  if (key == ';' || key == ',')
+    dir = key == ';' ? orig_dir : -orig_dir;
+  else
+    {
+      if (vi_redoing)
+#if defined (HANDLE_MULTIBYTE)
+       target = _rl_vi_last_search_mbchar;
+#else
+       target = _rl_vi_last_search_char;
+#endif
+      else
+       {
+#if defined (HANDLE_MULTIBYTE)
+         mb_len = _rl_read_mbchar (_rl_vi_last_search_mbchar, MB_LEN_MAX);
+         target = _rl_vi_last_search_mbchar;
+#else
+         RL_SETSTATE(RL_STATE_MOREINPUT);
+         _rl_vi_last_search_char = target = rl_read_key ();
+         RL_UNSETSTATE(RL_STATE_MOREINPUT);
+#endif
+       }
+
+      switch (key)
+        {
+        case 't':
+          orig_dir = dir = FTO;
+          break;
+
+        case 'T':
+          orig_dir = dir = BTO;
+          break;
+
+        case 'f':
+          orig_dir = dir = FFIND;
+          break;
+
+        case 'F':
+          orig_dir = dir = BFIND;
+          break;
+        }
+    }
+
+#if defined (HANDLE_MULTIBYTE)
+   return (_rl_char_search_internal (count, dir, target, mb_len));
+#else
+  return (_rl_char_search_internal (count, dir, target));
+#endif
+}
+
+/* Match brackets */
+int
+rl_vi_match (ignore, key)
+     int ignore, key;
+{
+  int count = 1, brack, pos, tmp, pre;
+
+  pos = rl_point;
+  if ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0)
+    {
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       {
+         while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0)
+           {
+             pre = rl_point;
+             rl_forward_char (1, key);
+             if (pre == rl_point)
+               break;
+           }
+       }
+      else
+       while ((brack = rl_vi_bracktype (rl_line_buffer[rl_point])) == 0 &&
+               rl_point < rl_end - 1)
+         rl_forward_char (1, key);
+
+      if (brack <= 0)
+       {
+         rl_point = pos;
+         rl_ding ();
+         return -1;
+       }
+    }
+
+  pos = rl_point;
+
+  if (brack < 0)
+    {
+      while (count)
+       {
+         tmp = pos;
+         if (MB_CUR_MAX == 1 || rl_byte_oriented)
+           pos--;
+         else
+           {
+             pos = _rl_find_prev_mbchar (rl_line_buffer, pos, MB_FIND_ANY);
+             if (tmp == pos)
+               pos--;
+           }
+         if (pos >= 0)
+           {
+             int b = rl_vi_bracktype (rl_line_buffer[pos]);
+             if (b == -brack)
+               count--;
+             else if (b == brack)
+               count++;
+           }
+         else
+           {
+             rl_ding ();
+             return -1;
+           }
+       }
+    }
+  else
+    {                  /* brack > 0 */
+      while (count)
+       {
+         if (MB_CUR_MAX == 1 || rl_byte_oriented)
+           pos++;
+         else
+           pos = _rl_find_next_mbchar (rl_line_buffer, pos, 1, MB_FIND_ANY);
+
+         if (pos < rl_end)
+           {
+             int b = rl_vi_bracktype (rl_line_buffer[pos]);
+             if (b == -brack)
+               count--;
+             else if (b == brack)
+               count++;
+           }
+         else
+           {
+             rl_ding ();
+             return -1;
+           }
+       }
+    }
+  rl_point = pos;
+  return (0);
+}
+
+int
+rl_vi_bracktype (c)
+     int c;
+{
+  switch (c)
+    {
+    case '(': return  1;
+    case ')': return -1;
+    case '[': return  2;
+    case ']': return -2;
+    case '{': return  3;
+    case '}': return -3;
+    default:  return  0;
+    }
+}
+
+/* XXX - think about reading an entire mbchar with _rl_read_mbchar and
+   inserting it in one bunch instead of the loop below (like in
+   rl_vi_char_search or _rl_vi_change_mbchar_case.  Set c to mbchar[0]
+   for test against 033 or ^C.  Make sure that _rl_read_mbchar does
+   this right. */
+int
+rl_vi_change_char (count, key)
+     int count, key;
+{
+  int c;
+
+  if (vi_redoing)
+    c = _rl_vi_last_replacement;
+  else
+    {
+      RL_SETSTATE(RL_STATE_MOREINPUT);
+      _rl_vi_last_replacement = c = rl_read_key ();
+      RL_UNSETSTATE(RL_STATE_MOREINPUT);
+    }
+
+  if (c == '\033' || c == CTRL ('C'))
+    return -1;
+
+  while (count-- && rl_point < rl_end)
+    {
+      rl_begin_undo_group ();
+
+      rl_delete (1, c);
+#if defined (HANDLE_MULTIBYTE)
+      if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+       while (_rl_insert_char (1, c))
+         {
+           RL_SETSTATE (RL_STATE_MOREINPUT);
+           c = rl_read_key ();
+           RL_UNSETSTATE (RL_STATE_MOREINPUT);
+         }
+      else
+#endif
+       _rl_insert_char (1, c);
+      if (count == 0)
+       rl_backward_char (1, c);
+
+      rl_end_undo_group ();
+    }
+  return (0);
+}
+
+int
+rl_vi_subst (count, key)
+     int count, key;
+{
+  /* If we are redoing, rl_vi_change_to will stuff the last motion char */
+  if (vi_redoing == 0)
+    rl_stuff_char ((key == 'S') ? 'c' : 'l');  /* `S' == `cc', `s' == `cl' */
+
+  return (rl_vi_change_to (count, 'c'));
+}
+
+int
+rl_vi_overstrike (count, key)
+     int count, key;
+{
+  if (_rl_vi_doing_insert == 0)
+    {
+      _rl_vi_doing_insert = 1;
+      rl_begin_undo_group ();
+    }
+
+  if (count > 0)
+    {
+      _rl_overwrite_char (count, key);
+      vi_replace_count += count;
+    }
+
+  return (0);
+}
+
+int
+rl_vi_overstrike_delete (count, key)
+     int count, key;
+{
+  int i, s;
+
+  for (i = 0; i < count; i++)
+    {
+      if (vi_replace_count == 0)
+       {
+         rl_ding ();
+         break;
+       }
+      s = rl_point;
+
+      if (rl_do_undo ())
+       vi_replace_count--;
+
+      if (rl_point == s)
+       rl_backward_char (1, key);
+    }
+
+  if (vi_replace_count == 0 && _rl_vi_doing_insert)
+    {
+      rl_end_undo_group ();
+      rl_do_undo ();
+      _rl_vi_doing_insert = 0;
+    }
+  return (0);
+}
+
+int
+rl_vi_replace (count, key)
+     int count, key;
+{
+  int i;
+
+  vi_replace_count = 0;
+
+  if (!vi_replace_map)
+    {
+      vi_replace_map = rl_make_bare_keymap ();
+
+      for (i = ' '; i < KEYMAP_SIZE; i++)
+       vi_replace_map[i].function = rl_vi_overstrike;
+
+      vi_replace_map[RUBOUT].function = rl_vi_overstrike_delete;
+      vi_replace_map[ESC].function = rl_vi_movement_mode;
+      vi_replace_map[RETURN].function = rl_newline;
+      vi_replace_map[NEWLINE].function = rl_newline;
+
+      /* If the normal vi insertion keymap has ^H bound to erase, do the
+         same here.  Probably should remove the assignment to RUBOUT up
+         there, but I don't think it will make a difference in real life. */
+      if (vi_insertion_keymap[CTRL ('H')].type == ISFUNC &&
+         vi_insertion_keymap[CTRL ('H')].function == rl_rubout)
+       vi_replace_map[CTRL ('H')].function = rl_vi_overstrike_delete;
+
+    }
+  _rl_keymap = vi_replace_map;
+  return (0);
+}
+
+#if 0
+/* Try to complete the word we are standing on or the word that ends with
+   the previous character.  A space matches everything.  Word delimiters are
+   space and ;. */
+int
+rl_vi_possible_completions()
+{
+  int save_pos = rl_point;
+
+  if (rl_line_buffer[rl_point] != ' ' && rl_line_buffer[rl_point] != ';')
+    {
+      while (rl_point < rl_end && rl_line_buffer[rl_point] != ' ' &&
+            rl_line_buffer[rl_point] != ';')
+       rl_point++;
+    }
+  else if (rl_line_buffer[rl_point - 1] == ';')
+    {
+      rl_ding ();
+      return (0);
+    }
+
+  rl_possible_completions ();
+  rl_point = save_pos;
+
+  return (0);
+}
+#endif
+
+/* Functions to save and restore marks. */
+int
+rl_vi_set_mark (count, key)
+     int count, key;
+{
+  int ch;
+
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  ch = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+  if (ch < 'a' || ch > 'z')
+    {
+      rl_ding ();
+      return -1;
+    }
+  ch -= 'a';
+  vi_mark_chars[ch] = rl_point;
+  return 0;
+}
+
+int
+rl_vi_goto_mark (count, key)
+     int count, key;
+{
+  int ch;
+
+  RL_SETSTATE(RL_STATE_MOREINPUT);
+  ch = rl_read_key ();
+  RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+  if (ch == '`')
+    {
+      rl_point = rl_mark;
+      return 0;
+    }
+  else if (ch < 'a' || ch > 'z')
+    {
+      rl_ding ();
+      return -1;
+    }
+
+  ch -= 'a';
+  if (vi_mark_chars[ch] == -1)
+    {
+      rl_ding ();
+      return -1;
+    }
+  rl_point = vi_mark_chars[ch];
+  return 0;
+}
+
+#endif /* VI_MODE */
index abf1efb..00b3c42 100644 (file)
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
 
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+
 srcdir = @srcdir@
 VPATH = .:@srcdir@
 topdir = @top_srcdir@
@@ -269,6 +277,7 @@ netopen.o: ${topdir}/array.h ${topdir}/hashlib.h ${topdir}/quit.h
 netopen.o: ${topdir}/unwind_prot.h ${topdir}/dispose_cmd.h
 netopen.o: ${topdir}/make_cmd.h ${topdir}/subst.h ${topdir}/sig.h
 netopen.o: ${BUILD_DIR}/pathnames.h ${topdir}/externs.h ${BUILD_DIR}/version.h
+netopen.o: ${topdir}/bashintl.h $(BASHINCDIR)/gettext.h
 
 oslib.o: ${topdir}/bashtypes.h ${topdir}/bashansi.h ${BASHINCDIR}/maxpath.h
 oslib.o: ${topdir}/shell.h ${topdir}/syntax.h ${topdir}/bashjmp.h ${BASHINCDIR}/posixjmp.h
@@ -414,18 +423,21 @@ fmtulong.o: ${BASHINCDIR}/ansi_stdlib.h
 fmtulong.o: ${BASHINCDIR}/chartypes.h
 fmtulong.o: ${BASHINCDIR}/stdc.h
 fmtulong.o: ${BASHINCDIR}/typemax.h
+fmtulong.o: ${topdir}/bashintl.h ${BASHINCDIR}/gettext.h
 
 fmtullong.o: ${topdir}/bashansi.h
 fmtullong.o: ${BASHINCDIR}/ansi_stdlib.h
 fmtullong.o: ${BASHINCDIR}/chartypes.h
 fmtullong.o: ${BASHINCDIR}/stdc.h
 fmtullong.o: ${BASHINCDIR}/typemax.h
+fmtullong.o: ${topdir}/bashintl.h ${BASHINCDIR}/gettext.h
 
 fmtumax.o: ${topdir}/bashansi.h
 fmtumax.o: ${BASHINCDIR}/ansi_stdlib.h
 fmtumax.o: ${BASHINCDIR}/chartypes.h
 fmtumax.o: ${BASHINCDIR}/stdc.h
 fmtumax.o: ${BASHINCDIR}/typemax.h
+fmtumax.o: ${topdir}/bashintl.h ${BASHINCDIR}/gettext.h
 
 xstrchr.o: ${topdir}/bashansi.h
 xstrchr.o: ${BASHINCDIR}/ansi_stdlib.h
index 3d849c8..43fdffd 100644 (file)
@@ -44,6 +44,8 @@
 #include <chartypes.h>
 #include <errno.h>
 
+#include <bashintl.h>
+
 #include "stdc.h"
 
 #include <typemax.h>
@@ -96,7 +98,7 @@ fmtulong (ui, base, buf, len, flags)
   if (base < 2 || base > 64)
     {
 #if 1
-      strncpy (buf, "invalid base", len - 1);
+      strncpy (buf, _("invalid base"), len - 1);
       buf[len] = '\0';
       errno = EINVAL;
       return (p = buf);
index 5e0fc5f..a7dfb18 100644 (file)
@@ -115,7 +115,7 @@ putenv (str)
       return -1;
     }
 
-  offset = assignment (str);
+  offset = assignment (str, 0);
   if (str[offset] != '=')
     {
       errno = EINVAL;
index 4197db1..aaf0c47 100644 (file)
@@ -51,6 +51,8 @@
 #endif
 
 #include <bashansi.h>
+#include <bashintl.h>
+
 #include <errno.h>
 
 #include <shell.h>
@@ -153,14 +155,14 @@ _netopen4(host, serv, typ)
 
   if (_getaddr(host, &ina) == 0)
     {
-      internal_error ("%s: host unknown", host);
+      internal_error (_("%s: host unknown"), host);
       errno = EINVAL;
       return -1;
     }
 
   if (_getserv(serv, typ, &p) == 0)
     {
-      internal_error("%s: invalid service", serv);
+      internal_error(_("%s: invalid service"), serv);
       errno = EINVAL;
       return -1;
     }
@@ -291,7 +293,7 @@ netopen (path)
   t = strchr (s, '/');
   if (t == 0)
     {
-      internal_error ("%s: bad network path specification", path);
+      internal_error (_("%s: bad network path specification"), path);
       return -1;
     }
   *t++ = '\0';
@@ -331,7 +333,7 @@ int
 netopen (path)
      char *path;
 {
-  internal_error ("network operations not supported");
+  internal_error (_("network operations not supported"));
   return -1;
 }
 
index d74f99c..8892954 100644 (file)
 #include <bashansi.h>
 #include <stdio.h>
 #include <chartypes.h>
+#include <errno.h>
 
 #include "shell.h"
 
+#if !defined (errno)
+extern int errno;
+#endif
+
 #if defined (__CYGWIN__)
 #include <sys/cygwin.h>
 
@@ -70,9 +75,10 @@ static int
 _path_isdir (path)
      char *path;
 {
-  int l;
+  int l, x;
   struct stat sb;
 
+  /* This should leave errno set to the correct value. */
   l = stat (path, &sb) == 0 && S_ISDIR (sb.st_mode);
 #if defined (__CYGWIN__)
   if (l == 0)
index a820c91..4d6304c 100644 (file)
@@ -80,10 +80,10 @@ sh_physpath (path, flags)
   char *result, *p, *q, *qsave, *qbase, *workpath;
   int double_slash_path, linklen, nlink;
 
-  /* First sanity check -- punt immediately if the name is too long. */
   linklen = strlen (path);
 
 #if 0
+  /* First sanity check -- punt immediately if the name is too long. */
   if (linklen >= PATH_MAX)
     return (savestring (path));
 #endif
@@ -178,6 +178,8 @@ sh_physpath (path, flags)
            {
 #ifdef ELOOP
              errno = ELOOP;
+#else
+             errno = EINVAL;
 #endif
 error:
              free (result);
index 55667db..18292ae 100644 (file)
@@ -60,7 +60,9 @@ sh_regmatch (string, pattern, flags)
   int result;  
 
 
+#if defined (ARRAY_VARS)
   rematch = (SHELL_VAR *)NULL;
+#endif
   
   rflags = REG_EXTENDED;
   if (glob_ignore_case)
index 5436f23..e264e3d 100644 (file)
@@ -121,7 +121,7 @@ ansicstr (string, len, flags, sawc, rlen)
              break;
            case '\\':
              break;
-           case '\'':
+           case '\'': case '"': case '?':
              if (flags & 1)
                *r++ = '\\';
              break;
diff --git a/lib/termcap/grot/termcap.src b/lib/termcap/grot/termcap.src
new file mode 100644 (file)
index 0000000..e214fcc
--- /dev/null
@@ -0,0 +1,9888 @@
+####### TERMINAL TYPE DESCRIPTIONS SOURCE FILE
+#
+#      Version 9.8.1
+#      termcap syntax
+#
+#      Eric S. Raymond         (current maintainer)
+#      John Kunze, Berkeley
+#      Craig Leres, Berkeley
+#
+# Please e-mail changes to terminfo@ccil.org.  The old termcap@berkeley.edu
+# address is no longer valid.
+#
+# PURPOSE OF THIS FILE:
+#
+# This file describes the capabilities of various character-cell terminals,
+# as needed by software such as screen-oriented editors.
+#
+# Pointers to related resources (including the ncurses distribution) may
+# be found at <http://www.ccil.org/~esr/ncurses.html>.
+#
+# FILE FORMAT:
+#
+# The version you are looking at may be in any of three formats: master
+# (terminfo with OT capabilities), stock terminfo, or termcap.  You can tell
+# which by the format given in the header above.
+#
+# The master format is accepted and generated by the terminfo tools in the
+# ncurses suite; it differs from stock (System V-compatible) terminfo only
+# in that it admits a group of capabilities (prefixed `OT') equivalent to
+# various obsolete termcap capabilities.  You can, thus, convert from master
+# to stock terminfo simply by filtering with `sed "/OT[^,]*,/s///"'; but if
+# you have ncurses `tic -I' is nicer.
+#
+# The termcap version is generated automatically from the master version
+# using tic -C.  This filtering leaves in the OT capabilities under their
+# original termcap names.  All translated entries fit within the
+# 1023-byte string-table limit of archaic termcap libraries except where
+# explicitly noted below.
+#
+# For details on these formats, see terminfo(5) in the ncurses distribution,
+# and termcap(5) in the 4.4BSD Unix Programmer's Manual.  Be aware that 4.4BSD
+# curses has been declared obsolete by the caretakers of the 4.4BSD sources
+# as of June 1995; they are encouraging everyone to migrate to ncurses.
+#
+# Note: unlike some other distributed terminfo files (Novell Unix & SCO's),
+# no entry in this file has embedded comments.  This is so source translation
+# to termcap only has to carry over leading comments.  Also, no name field
+# contains embedded whitespace (such whitespace confuses rdist).
+#
+# Further note: older versions of this file were often installed with an editor
+# script (reorder) that moved the most common terminal types to the front of
+# the file.  This should no longer be necessary, as the file is now ordered
+# roughly by type frequency with ANSI/VT100 and other common types up front.
+#
+# CONTINUITY WITH HISTORICAL VERSIONS:
+#
+# The last /etc/termcap version maintained by John Kunze was 8.3, dated 8/5/94.
+# Releases 9 and up are maintained by Eric Raymond as part of the ncurses
+# project.
+#
+# This file contains all the capability information present in John Kunze's
+# last version of the termcap master file, except as noted in the change 
+# comments at end of file.  Some information about very ancient obsolete
+# capabilities has been moved to comments.  Some all-numeric names of older
+# terminals have been retired.
+#
+# The 9.1.0 version of this file was translated from a syntax-corrected copy of
+# 8.3, then mechanically checked against 8.3 using Emacs Lisp code written for
+# the purpose.  Unless the ncurses tic implementation and the Lisp code were
+# making perfectly synchronized mistakes which I then failed to catch by
+# eyeball, the translation was correct and perfectly information-preserving.
+#
+# Some information has been merged in from terminfo files distributed by
+# USL and SCO (see COPYRIGHTS AND OTHER DELUSIONS below).  Much information
+# comes from vendors who maintain official terminfos for their hardware
+# (notably DEC and Wyse).
+#
+# A detailed change history is included at the end of this file.
+#
+# FILE ORGANIZATION:
+#
+# Comments in this file begin with # - they cannot appear in the middle
+# of a terminfo/termcap entry.  Individual capabilities are commented out by
+# placing a period between the colon and the capability name.
+#
+# Starting with version 9.0.0, the file is divided up into major sections
+# (headed by lines beginning with "########") and minor sections (beginning
+# with "####"); do
+#
+#      grep "^####" <file> | more
+#
+# to see a listing of section headings.  The intent of the divisions is
+# (a) to make it easier to find things, and (b) to order the database so
+# that important and frequently-encountered terminal types are near the
+# front (so that you'll get reasonable search efficiency even if you don't
+# use reorder).  Minor sections usually correspond to manufacturers or
+# standard terminal classes.  Parenthesized words following manufacturer
+# names are type prefixes or product line names used by that manufacturers.
+#
+# Finally, because this file is released in both terminfo and termcap formats,
+# most references to termcap names in comments are bracketed with colons (the
+# termcap separator) so they can be distinguished from terminfo capability
+# names.
+#
+# HOW TO READ THE ENTRIES:
+#
+# The first name in an entry is the canonical name for the model or
+# type, last entry is a verbose description.  Others are mnemonic synonyms for
+# the terminal.
+#
+# Terminal names look like <manufacturer> <model> - <modes/options>
+# The part to the left of the dash, if a dash is present, describes the
+# particular hardware of the terminal.  The part to the right may be used
+# for flags indicating special ROMs, extra memory, particular terminal modes,
+# or user preferences.
+#
+# All names should be in lower case, for consistency in typing.
+#
+# The following are conventionally used suffixes:
+#      mono    suppress color support
+#      rv      Terminal in reverse video mode (black on white)
+#      2p      Has two pages of memory.  Likewise 4p, 8p, etc.
+#      w       Wide - in 132 column mode.
+#      pp      Has a printer port which is used.
+#      na      No arrow keys - termcap ignores arrow keys which are
+#              actually there on the terminal, so the user can use
+#              the arrow keys locally.
+#      nam     No auto-margin - suppress am capability
+#      mc      Magic-cookie.  Some terminals (notably older Wyses) can
+#              only support one attribute without magic-cookie lossage.
+#              Their base entry is usually paired with another that
+#              uses magic cookies to support multiple attributes.
+#      vb      Use visible bell (flash) rather than beep.
+#
+# To easily test a new terminal description, put it in $HOME/.termcap
+# and programs will look there before looking in /etc/termcap.
+# You can also setenv TERMPATH to a list of full pathnames (separated
+# by spaces or colons) to be searched by tgetent() in the order listed.
+# The TERMCAP environment variable is usually set to the termcap
+# entry itself to avoid reading files when starting up a program.
+#
+# RELEASE 9 COMMENTS:
+#
+# To avoid search clashes, some older all-numeric names for terminals have
+# been removed (i.e., "33" for the Model 33 Teletype, "2621" for the HP2621).
+# All primary names of terminals now have alphanumeric prefixes.
+#
+# Comments marked "esr" are mostly results of applying the termcap-compiler
+# code packaged with ncurses and contemplating the resulting error messages. 
+# In many cases, these indicated obvious fixes to syntax garbled by the
+# composers.  In a few cases, I was able to deduce corrected forms for garbled
+# capabilities by looking at context.  All the information in the original
+# entries is preserved in the comments.
+#
+# I changed :MT: to :km: (the 4.4BSD name) everywhere.  I commented out some
+# capabilities (EP, dF, dT, dV, kn, ko, ma, ml, mu, xr, xx) that are no longer
+# used by BSD curses.
+#
+# Entries derived from XENIX use a termcap-extension set that showed up in
+# several entries, notably those for scoansi, ibmpcx, lisa, trs16, fos, and
+# the altos terminals.  Its signature is the use of GS/GE as an as/ae pair.
+# This set of extensions and their translations are described in the extended
+# comment at the end of this file.
+#
+# There is a second, smaller set of extensions used by AT&T terminals and
+# also described in the trailing comment.
+#
+# Besides these and the terminals mentioned above, only the psterm variants,
+# zen50, wsiris and minitel had unknown capabilities that weren't obviously
+# garbled.
+#
+# INTERPRETATION OF USER CAPABILITIES
+#
+# The System V Release 4 and XPG4 terminfo format defines ten string
+# capabilities for use by applications, u0...u9.   In this file, we use
+# certain of these capabilities to describe functions which are not covered
+# by terminfo.  The mapping is as follows:
+#
+#      u9      terminal enquire string (equivalent to ANSI DA)
+#      u8      terminal answerback description
+#      u7      cursor position request (equivalent to VT100 DSR 6)
+#      u6      cursor position report (equivalent to ANSI CPR)
+#
+# The terminal enquire string u9 should elicit an answerback response
+# from the terminal.  Common values for u9 will be ^E (on older ASCII
+# terminals) or \E[c (on newer VT100/ANSI-compatible terminals).
+#
+# The cursor position request (u7) string should elicit a cursor position
+# report.  A typical value (for ANSI/VT100 terminals) is \E[6n.
+#
+# The terminal answerback description (u8) must consist of an expected
+# answerback string.  The string may contain the following scanf(3)-like
+# escapes:
+#
+#      %c      Accept any character
+#      %[...]  Accept any number of characters in the given set
+#
+# The cursor position report (u6) string must contain two scanf(3)-style 
+# %d format elements.  The first of these must correspond to the Y coordinate
+# and the second to the %d.  The typical CPR value is \E[%d;%dR (on VT100/
+# ANSI-compatible terminals).
+#
+# These capabilities are used by tac(1m), the terminfo action checker soon
+# to be distributed with ncurses.
+# 
+# REQUEST FOR CONTACT INFORMATION AND HISTORICAL MATERIAL:
+#
+# As the ANSI standard and variants take firmer hold, and as character-cell
+# terminals are increasingly replaced by X displays, much of this file
+# is becoming a historical document (this is part of the reason for the
+# new organization, which puts ANSI types, xterm, and vt100 up front in
+# confidence that this will catch 95% of new hardware).
+#
+# For the terminal types still alive, I'd like to have manufacturer's
+# contact data (Internet address and/or snail-mail + phone).
+#
+# I'm also interested in enriching the comments so that the latter portions of
+# the file do in fact become a potted history of VDT technology as seen by
+# UNIX hackers.  Ideally, I'd like the headers for each manufacturer to
+# include its live/dead/out-of-the-business status, and for as many
+# terminal types as possible to be tagged with information like years
+# of heaviest use, popularity, and interesting features.
+#
+# I'm especially interested in identifying the obscure entries listed under
+# `Manufacturer unknown' and `Utter unknowns', before the tribal wisdom 
+# about them gets lost.
+#
+# If you have been around long enough to contribute, please read the file
+# with this in mind and send me your annotations.
+#
+# COPYRIGHTS AND OTHER DELUSIONS
+#
+# The BSD ancestor of this file had a standard Regents of the University of
+# California copyright with dates from 1980 to 1993.
+#
+# Some information has been merged in from a terminfo file SCO distributes.
+# It has an obnoxious boilerplate copyright which I'm ignoring because they 
+# took so much of the content from the ancestral BSD versions of this file
+# and didn't attribute it, thereby violating the BSD Regents' copyright.
+#
+# Not that anyone should care.  However many valid functions copyrights may
+# serve, putting one on a termcap/terminfo file with hundreds of anonymous
+# contributors makes about as much sense as copyrighting a wall-full of
+# graffiti -- it's legally dubious, ethically bogus, and patently ridiculous.
+#
+# This file deliberately has no copyright.  It belongs to no one and everyone.
+# If you claim you own it, you will merely succeed in looking like a fool. 
+# Use it as you like.  Use it at your own risk.  Copy and redistribute freely.
+# There are no guarantees anywhere.  Svaha!
+
+######## STANDARD AND SPECIAL TYPES
+#
+# This section describes terminal classes and maker brands that are still
+# quite common.
+#
+
+#### Specials
+#
+# Special "terminals".  These are used to label tty lines when you don't
+# know what kind of terminal is on it.  The characteristics of an unknown
+# terminal are the lowest common denominator - they look about like a ti 700.
+# The last one, "other", is like unknown but it allows an escape from software
+# that insists that a "real" unknown terminal is merely so far unspecified.
+#
+
+dumb:\
+       :am:\
+       :co#80:\
+       :bl=^G:cr=^M:do=^J:sf=^J:
+unknown:\
+       :gn:\
+       :tc=dumb:
+other|none of the above, but not exactly unknown:\
+       :am:gn:\
+       :co#80:\
+       :cl=^M^J:do=^J:ho=^M:
+
+arpanet|bussiplexer|dialup|ethernet|network|net|patch|plugboard|switch|network switch or dialup:\
+       :tc=unknown:
+lpr|printer|print|printing|line printer:\
+       :hc:os:\
+       :co#132:li#66:\
+       :bl=^G:cr=^M:do=^J:ff=^L:le=^H:sf=^J:
+
+#### ANSI terminals and terminal emulators
+#
+# See near the end of this file for details on ANSI conformance.
+# Don't mess with these entries!  Lots of other entries depend on them!
+#
+# This section lists entries in a least-capable to most-capable order.
+# if you're in doubt about what `ANSI' matches yours, try them in that
+# order and back off from the first that breaks.
+
+# (ansi: changed ":pt:" to ":it#8:" -- esr)
+ansi-mini|any ansi terminal with pessimistic assumptions:\
+       :am:bs:\
+       :co#80:it#8:li#24:\
+       :ce=\E[K:cl=\E[;H\E[2J:cm=\E[%i%d;%dH:do=\E[B:\
+       :ho=\E[H:le=\E[D:nd=\E[C:up=\E[A:
+
+# Color controls corresponding to the ANSI.SYS de-facto standard
+# (This is not a standalone entry)
+ansi-pc-color:\
+       :Co#8:NC#3:pa#64:\
+       :AB=\E[4%p1%dm:AF=\E[3%p1%dm:\
+       :..Sb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m:\
+       :..Sf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m:\
+       :op=\E[37;40m:
+
+# Procomm and some other ANSI emulations don't recognize all of the ANSI-
+# standard capabilities.  This entry deletes cuu, cuf, cud, cub, and vpa/hpa
+# capabilities, forcing curses to use repetitions of cuu1, cuf1, cud1 and cub1.
+# Also deleted ich and ich1, as QModem up to 5.03 doesn't recognize these.
+# Finally, we delete rep and ri, which seem to confuse many emulators.
+# On the other hand, we can count on these programs doing rmacs/smacs/sgr.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> July 25 1995
+pcansi-mono|ibm-pc terminal programs claiming to be ansi (mono mode):\
+       :am:bs:mi:ms:pt:\
+       :co#80:it#8:li#24:\
+       :ae=\E[10m:al=\E[L:as=\E[12m:bl=^G:bt=\E[Z:cd=\E[J:\
+       :ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:ct=\E[2g:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ho=\E[H:kb=^H:kd=\E[B:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:\
+       :md=\E[1m:me=\E[0m:mk=\E[9m:mr=\E[7m:nd=\E[C:\
+       :..sa=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p8%t;11%;%?%p9%t;12%;m:\
+       :se=\E[m:sf=^J:so=\E[7m:st=\EH:ta=^I:ue=\E[m:up=\E[A:\
+       :us=\E[4m:
+pcansi-mono25|ansi25|ibm-pc terminal programs with 25 lines (mono mode):\
+       :li#25:\
+       :tc=pcansi-mono:
+pcansi-mono33|ansi33|ibm-pc terminal programs with 33 lines (mono mode):\
+       :li#33:\
+       :tc=pcansi-mono:
+pcansi-mono43|ansi43|ibm-pc terminal programs with 43 lines (mono mode):\
+       :li#43:\
+       :tc=pcansi-mono:
+# The color versions.  All PC emulators do color...
+pcansi|ibm-pc terminal programs claiming to be ansi:\
+       :tc=ansi-pc-color:tc=pcansi-mono:
+pcansi-25|ansi25|ibm-pc terminal programs with 25 lines:\
+       :li#25:\
+       :tc=pcansi:
+pcansi-33|ansi33|ibm-pc terminal programs with 33 lines:\
+       :li#33:\
+       :tc=pcansi:
+pcansi-43|ansi43|ibm-pc terminal programs with 43 lines:\
+       :li#43:\
+       :tc=pcansi:
+
+# From: Eric S. Raymond <esr@snark.thyrsus.com> Feb 3 1995
+# ansi-mono -- full X.364 with ANSI.SYS-compatible attributes, no color.
+# Function-key mappings aren't in X3.64 but these are pretty standard.
+# If you want pound signs rather than dollars, replace `B' with `A'
+# in the s?ds capabilities.
+ansi-mono|ANSI X3.64-1979 terminal with ANSI.SYS compatible attributes:\
+       :5i:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[W:\
+       :F2=\E[X:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:\
+       :SR=\E[%dT:UP=\E[%dA:cb=\E[1K:ch=\E[%dG:ct=\E[2g:\
+       :cv=\E[%dd:ec=\E[%dX:ei=:im=:k1=\E[M:k2=\E[N:k3=\E[O:\
+       :k4=\E[P:k5=\E[Q:k6=\E[R:k7=\E[S:k8=\E[T:k9=\E[U:\
+       :k;=\E[V:kB=\E[Z:kI=\E[L:kb=^H:kd=\E[B:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:me=\E[0;10m:nw=\r\E[S:pf=\E[4i:\
+       :po=\E[5i:..rp=%p1%c\E[%p2%{1}%-%db:s0=\E(B:s1=\E)B:\
+       :s2=\E*B:s3=\E+B:\
+       :..sa=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p8%t;11%;%?%p9%t;12%;m:\
+       :ta=\E[I:tc=pcansi:
+
+# ansi -- this terminfo expresses the largest subset of X3.64 that will fit in
+# standard terminfo.  Assumes ANSI.SYS-compatible attributes and color
+# From: Eric S. Raymond <esr@snark.thyrsus.com> Feb 12 1995
+ansi|ansi/pc-term compatible with color:\
+       :u6=\E[%d;%dR:u7=\E[6n:..u8=\E[?%[;0123456789]c:\
+       :u9=\E[c:tc=ansi-pc-color:tc=ansi-mono:
+
+#
+# ANSI.SYS entries
+#
+# Cannot use :pt:, it does not work (why?).  :ho: seems required (why?). [gts]
+# Caution: 4.3 BSD tset does not pass li#25 to stty rows except during login?
+# :cl: clears attributes and sets wrap at margin before clearing the screen.
+# (ansi.sys: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" -- esr)
+# From: greg small <gts@populi.berkeley.edu>
+ansi.sys|ansisys|PC-DOS 3.1 ANSI.SYS:\
+       :am:bs:ms:\
+       :co#80:li#25:\
+       :ae=\E[10:as=\E[12:ce=\E[K:cl=\E[m\E[7h\E[2J:\
+       :cm=\E[%i%d;%dH:ho=\E[H:\
+       :is=U1 PC-DOS 3.1 ANSI.SYS 9-23-86\n\E[m\E[7h:kd=^J:\
+       :kh=^^:kl=^H:kr=^L:ku=^K:md=\E[1m:me=\E[0;10m:\
+       :mr=\E[7m:nd=\E[C:se=\E[m:so=\E[1m:ue=\E[m:up=\E[A:\
+       :us=\E[4m:
+#
+# Define IBM PC keypad keys for vi as per MS-Kermit while using ANSI.SYS.
+# This should only be used when the terminal emulator cannot redefine the keys.
+# Since redefining keys with ansi.sys also affects PC-DOS programs, the key
+# definitions must be restored.  If the terminal emulator is quit while in vi
+# or others using :ks:ke:, the keypad keys will not be defined as per PC-DOS.
+# The PgUp and PgDn are prefixed with ESC so that tn3270 can be used on Unix
+# (^U and ^D are already defined for tn3270).  The ESC is safe for vi but it
+# does "beep".  ESC ESC i is used for Ins to avoid tn3270 ESC i for coltab.
+# Left arrow is always BS, because PC-dos can tolerate this change.
+# Caution: vi is limited to 256 string bytes, longer crashes or weirds out vi.
+# Consequently the End keypad key could not be set (it is relatively safe and
+# actually useful because it sends ^@ O, which beeps and opens a line above).
+ansi.sysk|ansisysk|PC-DOS 3.1 ANSI.SYS with keypad redefined for vi:\
+       :is=U2 PC-DOS 3.1 ANSI.SYS with keypad redefined for vi 9-29-86\n\E[;75;8p:\
+       :ke=\E[;71;0;71p\E[;72;0;72p\E[;73;0;73p\E[;77;0;77p\E[;80;0;80p\E[;81;0;81p\E[;82;0;82p\E[;83;0;83p:\
+       :ks=\E[;71;30p\E[;72;11p\E[;73;27;21p\E[;77;12p\E[;80;10p\E[;81;27;4p\E[;82;27;27;105p\E[;83;127p:tc=ansi.sys:
+#
+# Adds ins/del line/character, hence vi reverse scrolls/inserts/deletes nicer.
+nansi.sys|nansisys|PC-DOS Public Domain NANSI.SYS:\
+       :al=\E[1L:dc=\E[1P:dl=\E[1M:ei=:ic=\E[1@:im=:\
+       :is=U3 PC-DOS Public Domain NANSI.SYS 9-23-86\n:tc=ansi.sys:
+#
+# See ansi.sysk and nansi.sys above.
+nansi.sysk|nansisysk|PC-DOS Public Domain NANSI.SYS with keypad redefined for vi:\
+       :al=\E[1L:dc=\E[1P:dl=\E[1M:ei=:ic=\E[1@:im=:\
+       :is=U4 PC-DOS Public Domain NANSI.SYS with keypad redefined for vi 9-29-86\n\E[;75;8p:tc=ansi.sysk:
+
+#### ANSI console types
+#
+
+# This entry is good for the 1.1.47 version of the Linux console driver.
+#
+# It assumes that you want A_PROTECT mapped to the alternate character set
+# mode that permits IBM ROM characters to be displayed (this is the assumption
+# used by ncurses version 1.9 and after, in order not to collide with the
+# internationalization attribute values specified in the XSI Curses standard).
+#
+# We use \E11m for rmacs rather than \E12m so the acsc string can use the ROM
+# graphics for control characters such as the diamond, up arrow and down-arrow.
+# This trick could work with other Intel consoles like the att6386 and pc3.
+#
+# Note: there are numerous broken linux entries out there, which didn't screw
+# up BSD termcap but hose ncurses's smarter cursor-movement optimization.
+# One common pathology is an incorrect tab length of 4.  Also note that the 
+# hpa=\E[%dG/vpa=\E[%dd capabilities seem not to be reliable.  To reproduce
+# the bug, re-introduce them and run worm -T 200 212 from the ncurses
+# test suite, save the trace, then worm -N -T 200 212.  Observe that the first
+# run fails to properly delete some worm segments, then diff the trace files.
+#
+# From: Eric S. Raymond <esr@snark.thyrsus.com> 23 July 1995
+linux|linux console:\
+       :am:bs:eo:mi:ms:ut:xn:xo:\
+       :Co#8:co#80:it#8:li#25:pa#64:\
+       :&7=^Z:@7=\E[4~:AB=\E[4%p1%dm:AF=\E[3%p1%dm:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:F1=\E[23~:F2=\E[24~:\
+       :F3=\E[25~:F4=\E[26~:F5=\E[28~:F6=\E[29~:F7=\E[31~:\
+       :F8=\E[32~:F9=\E[33~:FA=\E[34~:IC=\E[%d@:K2=\E[G:\
+       :S2=\E[11m:S3=\E[10m:Sb=\E[%+(m:Sf=\E[%+^^m:\
+       :ac=`\004a\261f\370g\361h\260j\331k\277l\332m\300n\305o~q\304r\362s_t\303u\264v\301w\302x\263y\371z\372{\373|\374}\375~\376.\031-\030\054\021+^P0\333:\
+       :ae=\E[10m:al=\E[L:as=\E[11m:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:\
+       :ic=\E[@:im=\E[4h:k1=\E[[A:k2=\E[[B:k3=\E[[C:\
+       :k4=\E[[D:k5=\E[[E:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
+       :k9=\E[20~:k;=\E[21~:kD=\E[3~:kI=\E[2~:kN=\E[6~:\
+       :kP=\E[5~:kb=^H:kd=\E[B:kh=\E[1~:kl=\E[D:kr=\E[C:\
+       :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[0;10m:\
+       :mr=\E[7m:nd=\E[C:nw=^M^J:op=\E[37;40m:r1=\Ec:rc=\E8:\
+       :..sa=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p8%t;11%;%?%p9%t;11%;m:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+       :u6=\E[%d;%dR:u7=\E[6n:u8=\E[?6c:u9=\E[c:ue=\E[24m:\
+       :up=\E[A:us=\E[4m:vb=\E[?5h\E[?5l:ve=\E[?25h:\
+       :vi=\E[?25l:
+linux-mono|Linux console, no color:\
+       :Co@:pa@:\
+       :AB@:Sb@:Sf@:tc=linux:
+
+# See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file
+linux-nic|linux with ich/ich1 suppressed for non-curses programs:\
+       :IC@:ei=:ic@:im=:tc=linux:
+
+# SCO console and SOS-Syscons console for 386bsd
+# (scoansi: had unknown capabilities
+#      :Gc=N:Gd=K:Gh=M:Gl=L:Gu=J:Gv=\072:\
+#      :GC=E:GD=B:GH=D:GL=\64:GU=A:GV=\63:GR=C:RT=^J:
+#      :G1=?:G2=Z:G3=@:G4=Y:G5=;:G6=I:G7=H:G8=<:\
+#      :CW=\E[M:NU=\E[N:RF=\E[O:RC=\E[P:\
+#      :WL=\E[S:WR=\E[T:CL=\E[U:CR=\E[V:\
+# I renamed GS/GE/HM/EN/PU/PD and mapped ":pt:" to ":it#8:" -- esr)
+scoansi|SCO Extended ANSI standard crt:\
+       :am:bs:eo:pt:\
+       :co#80:it#8:li#25:\
+       :@7=\E[F:ae=\E[10m:al=\E[L:as=\E[12m:bt=\E[Z:cd=\E[J:\
+       :ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:\
+       :do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:k1=\E[M:k2=\E[N:\
+       :k3=\E[O:k4=\E[P:k5=\E[Q:k6=\E[R:k7=\E[S:k8=\E[T:\
+       :k9=\E[U:k;=\E[V:kN=\E[G:kP=\E[I:kb=^H:kd=\E[B:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:mb=\E[5m:md=\E[1m:\
+       :me=\E[m:nd=\E[C:se=\E[m:sf=\E[S:so=\E[7m:sr=\E[T:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+
+# From: Eric Raymond <esr@snark.thyrsus.com> Wed Jan 18 17:14:34 EST 1995
+att6386|AT386|at386|386AT|386at|AT&T WGS 6386 console:\
+       :am:bw:eo:xo:\
+       :co#80:it#8:li#25:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\EOZ:\
+       :F2=\EOA:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:\
+       :SR=\E[%dT:UP=\E[%dA:\
+       :ac=``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~:\
+       :ae=\E[10m:al=\E[1L:as=\E[12m:bl=^G:bt=\E[Z:cd=\E[J:\
+       :ce=\E[K:ch=\E[%i%dG:cl=\E[2J\E[H:cm=\E[%i%d;%dH:\
+       :cr=^M:ct=\E[2g:cv=\E[%dd:dc=\E[P:dl=\E[1M:do=\E[B:\
+       :ec=\E[%dX:ei=:ho=\E[H:ic=\E[1@:im=:is=\E[0;10;39m:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOT:k6=\EOU:\
+       :k7=\EOV:k8=\EOW:k9=\EOX:k;=\EOY:kD=\E[P:kI=\E[@:\
+       :kM=\E0:kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:md=\E[1m:\
+       :me=\E[0;10m:mk=\E[9m:mr=\E[7m:nd=\E[C:nw=\r\E[S:\
+       :..sa=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%?%p9%t;12%e;10%;%?%p7%t;9%;m:\
+       :se=\E[m:sf=\E[S:so=\E[7m:sr=\E[T:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:vb=^G:tc=ansi-pc-color:
+# (pc6300plus: ":KM=/usr/lib/ua/kmap.s5:"; renamed BO/EE/CI/CV -- esr)
+pc6300plus|6300plus:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\E[1L:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[2J\E[H:\
+       :cm=\E[%i%2;%2H:cr=^M:ct=\E[3g:dc=\E[1P:dl=\E[1M:\
+       :do=\E[B:ei=:ho=\E[H:ic=\E[1@:im=:k1=\EOc:k2=\EOd:\
+       :k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:\
+       :k9=\EOk:k;=\EOu:kb=^H:kd=\E[B:kl=\E[D:kr=\E[C:\
+       :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mh=\E[2m:\
+       :mk=\E[9m:mr=\E[7m:nd=\E[C:nw=^M^J:se=\E[m:sf=^J:\
+       :so=\E[7m:st=\EH:ue=\E[m:up=\E[A:us=\E[4m:ve=\E[=1C:\
+       :vi=\E[=C:
+
+#
+#      Terminfo entry for the AT&T Unix PC 7300
+#      from escape(7) in Unix PC 7300 Manual.
+#      Somewhat similar to a vt100-am (but different enough
+#      to redo this from scratch.)
+#
+#      /***************************************************************
+#      *
+#      *           FONT LOADING PROGRAM FOR THE UNIX PC
+#      *
+#      *     This routine loads a font defined in the file ALTFONT
+#      *     into font memory slot #1.  Once the font has been loaded,
+#      *     it can be used as an alternative character set.
+#      *
+#      *     The call to ioctl with the argument WIOCLFONT is the key 
+#      *     to this routine.  For more information, see window(7) in 
+#      *     the PC 7300 documentation.
+#      ***************************************************************/
+#      #include <string.h>             /* needed for strcpy call */
+#      #include <sys/window.h>         /* needed for ioctl call */
+#      #define FNSIZE  60              /* font name size */
+#      #define ALTFONT  "/usr/lib/wfont/special.8.ft"  /* font file */
+#      /*
+#      *     The file /usr/lib/wfont/special.8.ft comes with the
+#      *     standard PC software.  It defines a graphics character set
+#      *     similar to that of the Teletype 5425 terminal.  To view
+#      *     this or other fonts in /usr/lib/wfont, use the command
+#      *     cfont <filename>.  For further information on fonts see
+#      *     cfont(1) in the PC 7300 documentation.
+#      */
+#      
+#      struct altfdata         /* structure for alt font data */
+#      {
+#      short   altf_slot;              /* memory slot number */
+#      char    altf_name[FNSIZE];      /* font name (file name) */
+#      };
+#      ldfont()
+#      {
+#              int wd;         /* window in which altfont will be */
+#              struct altfdata altf;
+#              altf.altf_slot=1;
+#              strcpy(altf.altf_name,ALTFONT);
+#              for (wd =1; wd < 12; wd++) {
+#                   ioctl(wd, WIOCLFONT,&altf);
+#              }
+#      }
+#
+att7300|unixpc|pc7300|3b1|s4|AT&T UNIX PC Model 7300:\
+       :am:xn:xo:\
+       :co#80:it#8:li#24:\
+       :!1=\ESV:!3=\EUD:#1=\EHL:#2=\EHM:#3=\ENJ:#4=\EBW:\
+       :%0=\Ero:%1=\Ehl:%2=\Emk:%4=\Emv:%5=\Enx:%6=\Eop:\
+       :%7=\Eot:%8=\Epv:%9=\Epr:%b=\EMV:%c=\ENX:%d=\EOT:\
+       :%e=\EPV:%g=\ERO:%h=\ERP:%i=\EFW:&0=\ECN:&1=\Ere:\
+       :&2=\Erf:&3=\Erp:&4=\Ers:&6=\Esv:&8=\Eud:&9=\EBG:\
+       :*0=\EFI:*2=\ECP:*3=\ECR:*4=\EDC:*5=\EDL:*6=\Esl:\
+       :*7=\EEN:*8=\ECI:@0=\Efi:@1=\Ebg:@2=\Ecn:@3=\Ecl:\
+       :@4=\Ecm:@5=\Ecp:@6=\Ecr:@7=\Een:@9=\Eex:AL=\E[%dL:\
+       :DL=\E[%dM:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ae=\E[10m:al=\E[L:as=\E[11m:bl=^G:bt=\E^I:cd=\E[0J:\
+       :ce=\E[0K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:cr=^M:dl=\E[M:\
+       :do=\E[B:ho=\E[H:i1=^O:k1=\EOP:k2=\EOQ:k3=\EOR:\
+       :k4=\EOS:k5=\E5:k6=\E6:k7=\E7:k8=\E8:kB=\E^I:kC=\Ece:\
+       :kD=\Edc:kE=\Eci:kF=\Erd:kI=\Eim:kN=\Epg:kP=\EPG:\
+       :kR=\Eru:kS=\Ece:kb=^H:kd=\E[B:kh=\Ehm:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:md=\E[7m:me=\E[0;10m:mh=\E[2m:\
+       :mr=\E[7m:nd=\E[C:nw=\EE:se=\E[0m:sf=^J:so=\E[7m:\
+       :sr=\EM:ue=\E[0m:up=\E[A:us=\E[4m:
+
+# From: <davis@unidata.ucar.edu>
+iris-ansi|iris-ansi-net|IRIS emulating ANSI terminal:\
+       :am:\
+       :co#80:it#8:li#40:\
+       :!2=\E[218q:#2=\E[143q:#4=\E[158q:%9=\E[209q:\
+       :%f=\E[210q:%i=\E[167q:&7=\E[217q:*4=\E[P:*7=\E[147q:\
+       :@7=\E[146q:@8=^M:AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:\
+       :F1=\EOR:F2=\EOS:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :al=\E[L:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:ct=\E[3g:dl=\E[M:do=^J:ho=\E[H:\
+       :is=\E[?1l\E>\E[?7h\E[100g\E[0m\E7\E[r\E8:k1=\E[001q:\
+       :k2=\E[002q:k3=\E[003q:k4=\E[004q:k5=\E[005q:\
+       :k6=\E[006q:k7=\E[007q:k8=\E[008q:k9=\EOP:k;=\EOQ:\
+       :kB=\E[Z:kD=\177:kI=\E[139q:kM=\E[146q:kN=\E[154q:\
+       :kP=\E[150q:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+       :ku=\E[A:le=\E[D:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+       :nw=\EE:pk=\EP101;%d.y%s\E\\:rc=\E8:sc=\E7:se=\E[m:\
+       :sf=\ED:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:ue=\E[m:\
+       :up=\E[A:us=\E[4m:ve=\E[9/y\E[12/y\E[=6l:\
+       :vs=\E[10/y\E[=1h\E[=2l\E[=6h:
+
+# From: Alex R.N. Wetmore <aw2t@andrew.cmu.edu>
+oldpc3|oibmpc3|IBM PC 386BSD Console:\
+       :am:bs:bw:eo:\
+       :co#80:li#25:\
+       :ac=l\332q\304k\277x\263j\331m\300w\302u\264v\301t\303n\305:\
+       :cd=\E[J:ce=\E[K:cl=\Ec:cm=\E[%i%2;%2H:do=\E[B:\
+       :ho=\E[;H:kd=\E[B:kh=\E[Y:kl=\E[D:kr=\E[C:ku=\E[A:\
+       :md=\E[7m:me=\E[0m\E[1;0x\E[2;7x:nd=\E[C:\
+       :se=\E[1;0x\E[2;7x:sf=\E[S:so=\E[1;7x\E[2;0x:sr=\E[T:\
+       :ue=\E[1;0x\E[2;7x:up=\E[A:us=\E[1;7x\E[2;0x:
+
+# BSD/OS console emulator
+# The emulator supports many of the additional console features
+# listed in the iBSC2 (e.g. color and character-set selection).
+# The console will also work with fewer lines after doing
+# "stty rows NN", e.g. to use 24 lines.
+# (This is the entry BSDI ships)
+pc3|ibmpc3|IBM PC BSD/OS Console:\
+       :am:bw:eo:km:\
+       :co#80:it#8:li#25:\
+       :AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:\
+       :UP=\E[%dA:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\Ec:\
+       :cm=\E[%i%d;%dH:cr=^M:dl=\E[M:do=^J:ho=\E[H:kH=\E[F:\
+       :kI=\E[L:kN=\E[G:kP=\E[I:kb=^H:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[0m:mh=\E[=8F:mr=\E[7m:nd=\E[C:nw=^M^J:\
+       :rc=\E[=u:sc=\E[=s:se=\E[0m:sf=^J:so=\E[7m:ta=^I:\
+       :up=\E[A:
+pc3-bold|ibmpc3|IBM PC BSD/OS Console with bold instead of underline:\
+       :ue=\E[0m:us=\E[1m:tc=pc3:
+
+# The following is a version of the ibm-pc entry distributed with PC/IX,
+# (Interactive Systems' System 3 for the Big Blue), modified by Richard
+# McIntosh at UCB/CSM.  The :pt: and :uc: have been removed from the original,
+# (the former is untrue, and the latter failed under UCB/man); standout and
+# underline modes have been added.  Note: this entry describes the "native"
+# capabilities of the PC monochrome display, without ANY emulation; most
+# communications packages (but NOT PC/IX connect) do some kind of emulation.
+pcix|PC/IX console:\
+       :am:bs:bw:eo:\
+       :co#80:li#24:\
+       :cd=\E[J:ce=\E[K:cl=\Ec:cm=\E[%i%2;%2H:do=\E[B:\
+       :ho=\E[;H:nd=\E[C:se=\E[0m:so=\E[7m:ue=\E[0m:up=\E[A:\
+       :us=\E[4m:
+
+# (ibmx: this entry formerly included the following unknown capabilities:
+#      :GC=b:GL=v:GR=t:RT=^J:\
+#      :GH=\E[196g:GV=\E[179g:\
+#      :GU=\E[193g:GD=\E[194g:\
+#      :G1=\E[191g:G2=\E[218g:G3=\E[192g:G4=\E[217g:\
+#      :CW=\E[E:NU=\E[F:RF=\E[G:RC=\E[H:\
+#      :WL=\E[K:WR=\E[L:CL=\E[M:CR=\E[N:\
+# I renamed GS/GE/WL/WR/CL/CR/PU/PD/HM/EN; also, removed a duplicate
+# ":kh=\E[Y:" -- esr)
+ibmpcx|xenix|ibmx|IBM PC xenix console display:\
+       :am:bs:ms:\
+       :co#80:li#25:\
+       :@7=\E[d:MR=\E[0m:ae=\E[10m:al=\E[L:as=\E[11m:\
+       :cd=\E[J:ce=\E[K:cl=^L:cm=\E[%d;%dH:dc=\E[P:dl=\E[M:\
+       :do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:k1=\E[K:k2=\E[L:\
+       :k3=\E[M:k4=\E[N:kN=\E[e:kP=\E[Z:kb=^H:kd=\E[B:\
+       :kh=\E[Y:kl=\E[D:kr=\E[C:ku=\E[A:nd=\E[C:se=\E[0m:\
+       :so=\E[7m:ue=\E[m:up=\E[A:us=\E[4m:
+ibmc|ibmcpc|IBM PC xenix color console display:\
+       :tc=ibmpcx:
+ibmcx|ibmcpcx:\
+       :tc=ibmpcx:
+
+pcvt25h|386BSD pcvt rel 2.10 vt220 emulator video driver:\
+       :am:km:mi:ms:xn:\
+       :it#8:pb#9216:vt#3:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+       :LE=\E[%dD:RI=\E[%dC:SF=\E%dD:SR=\E%dM:UP=\E[%dA:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:\
+       :i1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;25r\E[25;1H:\
+       :ic=\E[@:im=\E[4h:k1=\E[17~:k2=\E[18~:k3=\E[19~:\
+       :k4=\E[20~:k5=\E[21~:k6=\E[23~:k7=\E[24~:k8=\E[25~:\
+       :kD=\E[3~:kH=\E[4~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^_:\
+       :kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:\
+       :ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[m:mr=\E[7m:nd=\E[C:nw=^M^J:\
+       :r1=\Ec\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :rf=/usr/share/tabset/vt100:sc=\E7:se=\E[27m:sf=\ED:\
+       :so=\E[7m:sr=\EM:st=\EH:ta=^I:ue=\E[24m:up=\E[A:\
+       :us=\E[4m:
+
+#### DEC VT100 and compatibles
+#
+# DEC terminals from the vt100 forward are collected here.  Older DEC terminals
+# and micro consoles can be found in the `obsolete' section.  More details
+# on the relationship between the VT100 and ANSI X3.64 may be found near the
+# end of this file.
+#
+# Except where noted, these entries are DEC's official terminfos.
+# Contact Bill Hedberg <hedberg@hannah.enet.dec.com> of Terminal Support
+# Engineering for more information.  Updated terminfos and termcaps 
+# are kept available at ftp://gatekeeper.dec.com/pub/DEC/termcaps.
+#
+
+# Note that the xenl glitch in vt100 is not quite the same as on the Concept,
+# since the cursor is left in a different position while in the
+# weird state (concept at beginning of next line, vt100 at end
+# of this line) so all versions of vi before 3.7 don't handle
+# xenl right on vt100. The correct way to handle xenl is when
+# you output the char in column 80, immediately output CR LF
+# and then assume you are in column 1 of the next line. If xenl
+# is on, am should be on too.
+# 
+# I assume you have smooth scroll off or are at a slow enough baud
+# rate that it doesn't matter (1200? or less). Also this assumes
+# that you set auto-nl to "on", if you set it off use vt100-nam 
+# below.
+# 
+# The padding requirements listed here are guesses. It is strongly
+# recommended that xon/xoff be enabled, as this is assumed here.
+# 
+# The vt100 uses rs2 and rf rather than is2/tbc/hts because the 
+# tab settings are in non-volatile memory and don't need to be 
+# reset upon login. Also setting the number of columns glitches 
+# the screen annoyingly. You can type "reset" to get them set.
+#
+# This is how the keypad gets assigned in Application Keypad mode.
+#      PF1 = kf1         PF2 = kf2         PF3   = kf3       PF4 = kf4
+#      7   = kf9         8   = kf10        9     = kf0       - 
+#      4   = kf5         5   = kf6         6     = kf7       ,   = kf8
+#      1   = ka1         2   = kb2         3     = ka3
+#      0   = kc1         .   = kc3         ENTER = kent
+#
+vt100|vt100-am|dec vt100 (w/advanced video):\
+       :am:mi:ms:xn:xo:\
+       :co#80:it#8:li#24:vt#3:\
+       :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+       :K5=\EOn:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:do=^J:eA=\E(B\E)0:ho=\E[H:k0=\EOy:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:\
+       :k8=\EOl:k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m\017:mr=\E[7m:nd=\E[C:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :..sa=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+
+vt100nam|vt100-nam|vt100 w/no am (w/advanced video):\
+       :am@:xn@:\
+       :tc=vt100-am:
+
+# Ordinary vt100 in 132 column ("wide") mode.
+vt100-w|vt100-w-am|dec vt100 132 cols (w/advanced video):\
+       :co#132:li#24:\
+       :r2=\E>\E[?3h\E[?4l\E[?5l\E[?8h:tc=vt100-am:
+vt100-w-nam|vt100-nam-w|dec vt100 132 cols (w/advanced video):\
+       :co#132:li#14:vt@:\
+       :r2=\E>\E[?3h\E[?4l\E[?5l\E[?8h:tc=vt100-nam:
+
+# vt100 with no advanced video.
+vt100-nav|vt100 without advanced video option:\
+       :sg#1:\
+       :mb@:md@:me@:mr@:sa@:se=\E[m:so=\E[7m:ue@:us@:tc=vt100:
+vt100-nav-w|vt100-w-nav|dec vt100 132 cols 14 lines (no advanced video option):\
+       :co#132:li#14:\
+       :tc=vt100-nav:
+
+# vt100 with one of the 24 lines used as a status line.
+# We put the status line on the top.
+vt100-s|vt100-s-top|vt100-top-s|vt100 for use with sysline:\
+       :es:hs:\
+       :li#23:\
+       :cl=\E[2;1H\E[J:cm=\E[%i%+^A;%dH:cs=\E[%i%i%d;%dr:\
+       :ds=\E7\E[1;24r\E8:fs=\E8:ho=\E[2;1H:\
+       :is=\E7\E[2;24r\E8:ts=\E7\E[1;%p1%dH\E[1K:tc=vt100-am:
+
+# Status line at bottom. 
+# Clearing the screen will clobber status line.
+vt100-s-bot|vt100-bot-s|vt100 for use with sysline:\
+       :es:hs:\
+       :li#23:\
+       :ds=\E7\E[1;24r\E8:fs=\E8:is=\E[1;23r\E[23;1H:\
+       :ts=\E7\E[24;%p1%dH\E[1K:tc=vt100-am:
+
+# DEC VT100 with Advanced Video Option -- NOT DEC'S ENTRY!!!
+# This may be used as an alternate vt102 entry; it's probably better than the
+# stock one if you can live with XON/XOFF.  All the AVO gave you was smul/rmul.
+# From: Doug Gwyn <gwyn@smoke.brl.mil> 25 Jan 93
+# The following SET-UP modes are assumed for normal operation:
+#      ANSI_MODE       AUTO_XON/XOFF_ON        NEWLINE_OFF     80_COLUMNS
+#      WRAP_AROUND_ON
+# Other SET-UP modes may be set for operator convenience or communication
+# requirements; I recommend
+#      SMOOTH_SCROLL   AUTOREPEAT_ON   BLOCK_CURSOR    MARGIN_BELL_OFF
+#      SHIFTED_3_#
+# Unless you have a graphics add-on such as Digital Engineering's VT640
+# (and even then, whenever it can be arranged!) you should set
+#      INTERLACE_OFF
+# Hardware tabs are assumed to be set every 8 columns; they can be set up
+# by the "reset", "tset", or "tabs" utilities (use vt100-x, 132 columns, for
+# this).  I have included some compatible code in "rs" for the VT640 if you
+# have one.  No delays are specified; use "stty ixon -ixany" to enable DC3/DC1
+# flow control!
+# Thanks to elsie!ado (Arthur David Olson) for numerous improvements.
+vt100-avo|DEC VT100 with AVO:\
+       :ms:xo:\
+       :co#80:it#8:li#24:vt#3:\
+       :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:as=^N:\
+       :bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:do=^J:ho=\E[H:\
+       :is=\E<\E)0:k0=\EOP:k1=\EOQ:k2=\EOR:k3=\EOS:kb=^H:\
+       :kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+       :ku=\EOA:l0=PF1:l1=PF2:l2=PF3:l3=PF4:le=^H:ll=\E[24H:\
+       :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:nw=\EE:\
+       :rc=\E8:sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:\
+       :ta=^I:te=150\E[?7h:ti=\E[?7l:ue=\E[m:up=\EM:\
+       :us=\E[4m:
+
+# Most of the `vt100' emulators out there actually emulate a vt102
+# This entry (or vt102-nsgr) is probably the right thing to use for
+# these.  
+vt102|dec vt102:\
+       :mi:\
+       :al=\E[L:dc=\E[P:dl=\E[M:ei=\E[4l:im=\E[4h:tc=vt100:
+
+# Many brain-dead PC comm programs that pretend to be `vt100-compatible'
+# fail to interpret the ^O and ^N escapes properly.  Symptom: the sgr0
+# string in the canonical vt100 entry above leaves the screen littered
+# with little  snowflake or star characters (IBM PC ROM character \017 = ^O)
+# after highlight turnoffs.  This entry should fix that, and even leave
+# ACS support working, at the cost of making multiple-highlight changes 
+# slightly more expensive.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> July 22 1995
+vt102-nsgr|dec vt102 with ACS support disabled:\
+       :me=\E[m:sa@:tc=vt102:
+
+# VT125 Graphics CRT.  Clear screen also erases graphics
+vt125|vt125 graphics terminal:\
+       :cl=\E[;H\E[2J\EPpS(E)\E\\:tc=vt100:
+
+# vt132 - like vt100 but slower and has ins/del line and such.
+# I'm told that smir/rmir are backwards in the terminal from the
+# manual and from the ANSI standard, this describes the actual 
+# terminal. I've never actually used a vt132 myself, so this 
+# is untested.
+#
+vt132|DEC vt132:\
+       :xn:\
+       :al=\E[L:dc=\E[P:dl=\E[M:ei=\E[4h:im=\E[4l:ip=:sf=\n:tc=vt100:
+
+# vt220:
+# This vt220 description maps F5--F9 to the second block of function keys
+# at the top of the keyboard.  The "DO" key is used as F10 to avoid conflict
+# with the key marked (ESC) on the vt220.  See vt220d for an alternate mapping.
+# PF1--PF4 are used as F1--F4.
+#
+vt220|DEC VT220 in vt100 emulation mode:\
+       :am:mi:xn:xo:\
+       :co#80:li#24:vt#3:\
+       :@7=\E[4~:ac=kkllmmjjnnwwqquuttvvxx:ae=\E(B:al=\E[L:\
+       :as=\E(0:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:\
+       :do=\E[B:ei=\E[4l:ho=\E[H:if=/usr/lib/tabset/vt100:\
+       :im=\E[4h:is=\E[1;24r\E[24;1H:k1=\EOP:k2=\EOQ:\
+       :k3=\EOR:k4=\EOS:k5=\E[17~:k6=\E[18~:k7=\E[19~:\
+       :k8=\E[20~:k9=\E[21~:k;=\E[29~:kD=\E[3~:kI=\E[2~:\
+       :kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:kh=\E[1~:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+       :mr=\E[7m:nd=\E[C:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :rf=/usr/lib/tabset/vt100:\
+       :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e\E(B%;:\
+       :sc=\E7:se=\E[m:sf=20\ED:so=\E[7m:sr=14\EM:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
+#
+# vt220d:
+# This vt220 description regards F6--F10 as the second block of function keys
+# at the top of the keyboard.  This mapping follows the description given
+# in the VT220 Programmer Reference Manual and agrees with the labeling
+# on some terminals that emulate the vt220.  There is no support for an F5.
+# See vt220 for an alternate mapping. 
+#
+vt220d|DEC VT220 in vt100 mode with DEC function key labeling:\
+       :F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\
+       :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\
+       :k5@:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
+       :k;=\E[21~:tc=vt220:
+
+vt220nam|vt220-nam|v220n|VT220 in vt100 mode with no auto margins:\
+       :am@:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h:tc=vt220:
+
+vt220-8|dec vt220 8 bit terminal:\
+       :5i:am:mi:ms:xn:xo:\
+       :co#80:it#8:li#24:\
+       :%0=\E[29~:%1=\E[28~:*6=\E[4~:@0=\E[1~:AL=\E[%dL:\
+       :DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:\
+       :F3=\E[25~:F4=\E[26~:F7=\E[31~:F8=\E[32~:F9=\E[33~:\
+       :FA=\E[34~:IC=\E[%d@:LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:\
+       :SA=\E[?7h:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:eA=\E)0:ec=\E[%dX:\
+       :ei=\E[4l:ho=\E[H:if=/usr/lib/tabset/vt100:im=\E[4h:\
+       :is=\E[?7h\E[>\E[?1h\E F\E[?4l:k1=\EOP:k2=\EOQ:\
+       :k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
+       :k9=\E[20~:k;=\E[21~:kI=\E[2~:kN=\E[6~:kP=\E[5~:\
+       :kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:\
+       :l1=pf1:l2=pf2:l3=pf3:l4=pf4:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[0m:mr=\E[7m:nd=\E[C:nw=\EE:pf=\E[4i:po=\E[5i:\
+       :ps=\E[i:r1=\E[?3l:rc=\E8:sc=\E7:se=\E[27m:sf=\ED:\
+       :so=\E[7m:sr=\EM:st=\EH:ta=^I:ue=\E[24m:up=\E[A:\
+       :us=\E[4m:vb=\E[?5h\E[?5l:
+
+vt320|DEC VT320 in vt100 emulation mode:\
+       :tc=vt220:
+#
+#  Use v320n for LYRIX
+#
+vt320nam|vt320-nam|v320n|DEC VT320 in vt100 emul. mode with NO AUTO WRAP mode:\
+       :am@:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h:tc=vt220:
+
+vt420|DEC VT420:\
+       :am:mi:xn:xo:\
+       :co#80:li#24:vt#3:\
+       :*6=\E[4~:@0=\E[1~:\
+       :S5=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[;H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+       :i2=\E[?67h\E[64;1"p:if=/usr/lib/tabset/vt100:\
+       :im=\E[4h:is=\E[1;24r\E[24;1H:k0=\E[29~:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[17~:k6=\E[18~:\
+       :k7=\E[19~:k8=\E[20~:k9=\E[21~:k;=\E[29~:kD=\E[3~:\
+       :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:ke=\E>:\
+       :kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+       :r3=\E[?67h\E[64;1"p:rc=\E8:rf=/usr/lib/tabset/vt100:\
+       :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e\E(B%;:\
+       :se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+       :up=\E[A:us=\E[4m:
+
+vt420nam|vt420-nam|v420n|DEC VT420 in vt100 emul. mode with NO AUTO WRAP mode:\
+       :am@:\
+       :tc=vt420:
+
+#
+#  DECUDK   
+#               if (key < 16) then  value = key;
+#               else if (key < 21) then value = key + 1; 
+#               else if (key < 25) then value = key + 2;
+#               else if (key < 27) then value = key + 3;
+#               else if (key < 30) then value = key + 4;
+#               else value = key + 5;
+#
+vt420pc|DEC VT420 w/PC keyboard:\
+       :@7=\E[4~:F1=\E[23~:F2=\E[24~:F3=\E[11;2~:\
+       :F4=\E[12;2~:F5=\E[13;2~:F6=\E[14;2~:F7=\E[15;2~:\
+       :F8=\E[17;2~:F9=\E[18;2~:FA=\E[19;2~:FB=\E[20;2~:\
+       :FC=\E[21;2~:FD=\E[23;2~:FE=\E[24;2~:FF=\E[23~:\
+       :FG=\E[24~:FH=\E[25~:FI=\E[26~:FJ=\E[28~:FK=\E[29~:\
+       :FL=\E[31~:FM=\E[32~:FN=\E[33~:FO=\E[34~:FP=\E[35~:\
+       :FQ=\E[36~:FR=\E[23;2~:FS=\E[24;2~:FT=\E[25;2~:\
+       :FU=\E[26;2~:FV=\E[28;2~:FW=\E[29;2~:FX=\E[31;2~:\
+       :FY=\E[32;2~:FZ=\E[33;2~:Fa=\E[34;2~:Fb=\E[35;2~:\
+       :Fc=\E[36;2~:S6=USR_TERM\072vt420pcdos\072:k1=\E[11~:\
+       :k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:k6=\E[17~:\
+       :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=^_:\
+       :kh=\E[H:\
+       :..px=\EP1;1|%?%{16}%p1%>%t%{0}%e%{21}%p1%>%t%{1}%e%{25}%p1%>%t%{2}%e%{27}%p1%>%t%{3}%e%{30}%p1%>%t%{4}%e%{5}%;%p1%+%d/%p2%s\E\\:tc=vt420:
+
+vt420pcdos|DEC VT420 w/PC for DOS Merge:\
+       :li#25:\
+       :S1=%?%p2%{19}%=%t\E\023\021%e%p2%{32}%<%t\E%p2%c%e%p2%{127}%=%t\E\177%e%p2%c%;:\
+       :S4=\E[?1;2r\E[34h:\
+       :S5=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:S6@:\
+       :me=\E[0m:sa@:tc=vt420pc:
+
+vt420f|DEC VT420 with VT kbd; VT400 mode; F1-F5 used as Fkeys:\
+       :F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:\
+       :F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:\
+       :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:\
+       :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:\
+       :kD=^_:kh=\E[H:l1=\EOP:l2=\EOQ:l3=\EOR:l4=\EOS:tc=vt420:
+
+vt420f-nam|v420fn|DEC VT420 no auto margins:\
+       :am@:\
+       :tc=vt420f:
+vt420pc-nam|v420pcn|DEC VT420 PC keyboard no auto margins:\
+       :am@:\
+       :tc=vt420pc:
+
+vt510|DEC VT510:\
+       :tc=vt420:
+vt510nam|vt510-nam|v510n|DEC VT510 in vt100 emul. mode with NO AUTO WRAP mode:\
+       :tc=vt420nam:
+vt510pc|DEC VT510 w/PC keyboard:\
+       :tc=vt420pc:
+vt510pc-nam|v510pcn|DEC VT510 PC keyboard no auto margins:\
+       :am@:\
+       :tc=vt420pc:
+vt510pcdos|DEC VT510 w/PC for DOS Merge:\
+       :tc=vt420pcdos:
+
+# VT520/VT525
+#
+# The VT520 is a monochrome text terminal capable of managing up to
+# four independent sessions in the terminal.  It has multiple ANSI
+# emulations (VT520, VT420, VT320, VT220, VT100, VT PCTerm, SCO Console)
+# and ASCII emulations (WY160/60, PCTerm, 50/50+, 150/120, TVI 950,
+# 925 910+, ADDS A2).  This terminfo data is for the ANSI emulations only.
+#
+# Terminal Set-Up is entered by pressing [F3], [Caps Lock]/[F3] or
+# [Alt]/[Print Screen] depending upon which keyboard and which
+# terminal mode is being used.  If Set-Up has been disabled or
+# assigned to an unknown key, Set-Up may be entered by pressing
+# [F3] as the first key after power up, regardless of keyboard type.
+vt520|DEC VT520:\
+       :am:mi:xn:xo:\
+       :co#80:li#24:vt#3:\
+       :*6=\E[4~:@0=\E[1~:\
+       :S5=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[;H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+       :i2=\E[?67h\E[64;1"p:if=/usr/lib/tabset/vt100:\
+       :im=\E[4h:is=\E[1;24r\E[24;1H:k0=\E[29~:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[17~:k6=\E[18~:\
+       :k7=\E[19~:k8=\E[20~:k9=\E[21~:k;=\E[29~:kD=\E[3~:\
+       :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+       :mr=\E[7m:nd=\E[C:\
+       :..px=\EP1;1|%?%{16}%p1%>%t%{0}%e%{21}%p1%>%t%{1}%e%{25}%p1%>%t%{2}%e%{27}%p1%>%t%{3}%e%{30}%p1%>%t%{4}%e%{5}%;%p1%+%d/%p2%s\E\\:\
+       :r3=\E[?67h\E[64;1"p:rc=\E8:rf=/usr/lib/tabset/vt100:\
+       :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e\E(B%;:\
+       :se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+       :up=\E[A:us=\E[4m:
+
+vt520nam|vt520-nam|v520n|DEC VT520 with NO AUTO WRAP:\
+       :am@:\
+       :tc=vt520:
+
+vt525|DEC VT525:\
+       :am:mi:xn:xo:\
+       :co#80:li#24:vt#3:\
+       :*6=\E[4~:@0=\E[1~:\
+       :S5=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[;H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+       :i2=\E[?67h\E[64;1"p:if=/usr/lib/tabset/vt100:\
+       :im=\E[4h:is=\E[1;24r\E[24;1H:k0=\E[29~:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[17~:k6=\E[18~:\
+       :k7=\E[19~:k8=\E[20~:k9=\E[21~:k;=\E[29~:kD=\E[3~:\
+       :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+       :mr=\E[7m:nd=\E[C:\
+       :..px=\EP1;1|%?%{16}%p1%>%t%{0}%e%{21}%p1%>%t%{1}%e%{25}%p1%>%t%{2}%e%{27}%p1%>%t%{3}%e%{30}%p1%>%t%{4}%e%{5}%;%p1%+%d/%p2%s\E\\:\
+       :r3=\E[?67h\E[64;1"p:rc=\E8:rf=/usr/lib/tabset/vt100:\
+       :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e\E(B%;:\
+       :se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+       :up=\E[A:us=\E[4m:
+
+vt525nam|vt525-nam|v525n|DEC VT525 with NO AUTO WRAP:\
+       :am@:\
+       :tc=vt525:
+
+#### Xterm variants
+#
+
+# X10/6.6      11/7/86, minus alternate screen, plus (csr)
+# (xterm: ":MT:" changed to ":km:"; mapped ":pt:" to ":it#8:";
+# removed (hs, eslok, tsl=\E[?E\E[?%i%dT, fsl=\E[?F, dsl=\E[?E)
+# as these seem not to work -- esr)
+x10term|vs100-x10|xterm terminal emulator (X10 window system):\
+       :am:bs:km:mi:ms:pt:xn:xo:\
+       :co#80:it#8:li#65:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:al=\E[L:cd=\E[J:\
+       :ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:\
+       :dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:im=\E[4h:\
+       :is=\E\E[m\E[?7h\E[?1;4l:k1=\EOP:k2=\EOQ:k3=\EOR:\
+       :k4=\EOS:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:\
+       :ks=\E[?1h\E=:ku=\EOA:le=^H:md=\E[1m:me=\E[m:\
+       :mr=\E[7m:nd=\E[C:\
+       :rs=\E[r\E<\E[m\E[H\E[2J\E[?7h\E[?1;3;4;6l:se=\E[m:\
+       :sf=^J:so=\E[7m:sr=\EM:ue=\E[m:up=\E[A:us=\E[4m:
+# X11R6 xterm.  This is known good for the XFree86 version under Linux.
+# From: Eric S. Raymond <esr@snark.thyrsus.com> 9 Jul 1995
+# Note: If you use the line-drawing character set, the disable afterwards
+# will leave you in US-ASCII.  If you live somewhere that wants a pound sign
+# at 2/3, change rmacs to "\E(A".  Further note: cuf and cub don't seem
+# to be reliable under my xterm, so they're commented out.  Final note:
+# Older versions of this entry set/reset application keypad mode (\EO-prefix
+# cursor keys) in the [sr]mkx caps, but it wasn't necessary, and doesn't
+# actually fit the terminfo model properly.
+xterm|vs100|xterm terminal emulator (X11R6 Window System):\
+       :am:bs:km:mi:ms:pt:xn:xo:\
+       :co#80:it#8:li#65:\
+       :@7=\E[[:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:F1=\E[23~:\
+       :F2=\E[24~:IC=\E[%d@:LE=\E[%dD:UP=\E[%dA:\
+       :ac=++\054\054..00II--``aaffgghhjjkkllmmnnooqqssttuuvvwwxx~~:\
+       :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3k:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:\
+       :ic=\E[@:im=\E[4h:\
+       :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l:\
+       :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:\
+       :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:\
+       :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:kh=\E[@:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:md=\E[1m:me=\E[m:\
+       :mr=\E[7m:nd=\E[C:\
+       :r2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E<:\
+       :rc=\E8:sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+       :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:u6=\E[%d;%dR:\
+       :u7=\E[6n:u8=\E[?1;2c:u9=\E[c:ue=\E[m:up=\E[A:\
+       :us=\E[4m:
+xterm24|vs100-24|xterm terminal emulator (24 lines) (X11R6 window system):\
+       :co#80:li#24:\
+       :tc=xterm:
+xterm25|vs100-25|xterm terminal emulator (25 lines) (X11R6 window system):\
+       :co#80:li#25:\
+       :tc=xterm:
+xterm50|vs100-50|xterm terminal emulator (50 lines) (X11R6 window system):\
+       :co#80:li#50:\
+       :tc=xterm:
+xterms|vs100s|xterm terminal emulator (small) (X11R6 window system):\
+       :tc=xterm24:
+# (kterm: this had unknown capabilities ":KJ:TY=ascii:" -- esr)
+kterm|kterm kanji terminal emulator (X window system):\
+       :es:hs:\
+       :cs=\E[%i%d;%dr:ds=\E[?H:fs=\E[?F:rc=\E8:sc=\E7:\
+       :ts=\E[?E\E[?%i%dT:tc=xterm:
+
+# See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file
+xterm-nic|xterm with ich/ich1 suppressed for non-curses programs:\
+       :IC@:ei=:ic@:im=:tc=xterm:
+
+# From: Eric S. Raymond <esr@snark.thyrsus.com> May 4 1995
+# Should work with the color xterm on the X11R6 contrib tape.
+xterm-color|xterm with color support:\
+       :tc=xterm:tc=ansi-pc-color:
+
+# From: David J. MacKenzie <djm@va.pubnix.com> 20 Apr 1995
+# Here's a termcap entry I've been using for xterm_color, which comes
+# with BSD/OS 2.0, and the X11R6 contrib tape too I think.  Besides the
+# color stuff, I also have a status line defined as the window manager
+# title bar. [I have translated it to terminfo -- ESR]
+xterm-pcolor|xterm with color used for highlights and status line:\
+       :hs:\
+       :ws#40:\
+       :ds=\E]0;\007:fs=^G:md=\E[1m\E[43m:mr=\E[7m\E[34m:\
+       :so=\E[7m\E[31m:ts=\E]0;:us=\E[4m\E[42m:tc=xterm:
+
+######## UNIX VIRTUAL TERMINALS AND VIRTUAL CONSOLES
+#
+
+# Columbus UNIX virtual terminal. This terminal also appears in 
+# UNIX 4.0 and successors as line discipline 1 (?), but is 
+# undocumented and does not really work quite right.
+cbunix|cb unix virtual terminal:\
+       :am:bs:da:db:\
+       :co#80:li#24:lm#0:\
+       :al=\EP:bl=^G:cd=\EL:ce=\EK:cl=\EL:cm=\EG%r%.%.:\
+       :cr=^M:dc=\EM:dl=\EN:do=^J:ei=:ic=\EO:im=:kd=\EB:\
+       :kh=\EE:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:se=\Eb^D:\
+       :sf=^J:so=\Ea^D:ue=\Eb^A:up=\EA:us=\Ea^A:
+# (vremote: removed obsolete ":nl@:" -- esr)
+vremote|virtual remote terminal:\
+       :am@:\
+       :co#79:\
+       :tc=cbunix:
+pty|4bsd pseudo teletype:\
+       :cm=\EG%+ %+ :se=\Eb$:so=\Ea$:ue=\Eb!:us=\Ea!:tc=cbunix:
+
+# Entries for use by the FSF's `screen' program.  These came with version 3.6.2
+screen|VT 100/ANSI X3.64 virtual terminal:\
+       :am:km:mi:ms:xn:\
+       :co#80:it#8:li#24:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:\
+       :F2=\E[24~:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++\054\054hhII00:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:\
+       :im=\E[4h:is=\E)0:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+       :k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
+       :k;=\E[21~:kD=\E[3~:kH=\E[4~:kI=\E[2~:kN=\E[6~:\
+       :kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:nw=\EE:r2=\Ec:\
+       :rc=\E8:sc=\E7:se=\E[23m:sf=^J:so=\E[3m:sr=\EM:\
+       :st=\EH:ta=^I:ue=\E[24m:up=\EM:us=\E[4m:
+screen-w|VT 100/ANSI X3.64 virtual terminal with 132 cols:\
+       :am:km:mi:ms:xn:\
+       :co#132:it#8:li#24:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:\
+       :F2=\E[24~:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~..--++\054\054hhII00:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:ho=\E[H:\
+       :im=\E[4h:is=\E)0:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+       :k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
+       :k;=\E[21~:kD=\E[3~:kH=\E[4~:kI=\E[2~:kN=\E[6~:\
+       :kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:kh=\E[1~:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:nw=\EE:r2=\Ec:\
+       :rc=\E8:sc=\E7:se=\E[23m:sf=^J:so=\E[3m:sr=\EM:\
+       :st=\EH:ta=^I:ue=\E[24m:up=\EM:us=\E[4m:
+
+######## WORKSTATION CONSOLES
+#
+
+#### Sun consoles
+#
+
+# :is: resets scrolling region in case a previous user had used "tset vt100"
+# (sun: mapped ":pt:" to ":it#8:" -- esr)
+oldsun|Sun Microsystems Workstation console:\
+       :am:bs:km:mi:ms:pt:\
+       :co#80:it#8:li#34:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:IC=\E[%d@:al=\E[L:\
+       :bl=^G:cd=\E[J:ce=\E[K:cl=^L:cm=\E[%i%d;%dH:cr=^M:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ei=:ic=\E[@:im=:is=\E[1r:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:nd=\E[C:rs=\E[1r:\
+       :se=\E[m:sf=^J:so=\E[7m:ta=^I:up=\E[A:
+# New entry from vendor
+sun|sun1|sun2|Sun Microsystems Inc. workstation:\
+       :am:km:ms:\
+       :co#80:li#34:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:IC=\E[%d@:al=\E[L:\
+       :bl=^G:cd=\E[J:ce=\E[K:cl=^L:cm=\E[%i%d;%dH:cr=^M:\
+       :dc=\E[P:dl=\E[M:do=^J:ei=:ho=\E[H:ic=\E[@:im=:\
+       :k1=\E[224z:k2=\E[225z:k3=\E[226z:k4=\E[227z:\
+       :k5=\E[228z:k6=\E[229z:k7=\E[230z:k8=\E[231z:\
+       :k9=\E[232z:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+       :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:r2=\E[s:\
+       :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m:\
+       :se=\E[m:sf=^J:so=\E[7m:ta=^I:ue=\E[m:up=\E[A:\
+       :us=\E[4m:
+# From: <john@ucbrenoir>  Tue Sep 24 13:14:44 1985
+sun-s|Sun Microsystems Workstation window with status line:\
+       :hs:\
+       :ds=\E]l\E\\:fs=\E\\:ts=\E]l:tc=sun:
+sun-e-s|sun-s-e|Sun Microsystems Workstation with status hacked for emacs:\
+       :hs:\
+       :ds=\E]l\E\\:fs=\E\\:ts=\E]l:tc=sun-e:
+sun-48|Sun 48-line window:\
+       :co#80:li#48:\
+       :tc=sun:
+sun-34|Sun 34-line window:\
+       :co#80:li#34:\
+       :tc=sun:
+sun-24|Sun 24-line window:\
+       :co#80:li#24:\
+       :tc=sun:
+sun-17|Sun 17-line window:\
+       :co#80:li#17:\
+       :tc=sun:
+sun-12|Sun 12-line window:\
+       :co#80:li#12:\
+       :tc=sun:
+sun-1|Sun 1-line window for sysline:\
+       :es:hs:\
+       :co#80:li#1:\
+       :ds=^L:fs=\E[K:ts=^M:tc=sun:
+sun-e|sun-nic|sune|Sun Microsystems Workstation without insert character:\
+       :ei@:ic@:im@:tc=sun:
+sun-c|sun-cmd|Sun Microsystems Workstation console with scrollable history:\
+       :te=\E[>4h:ti=\E[>4l:tc=sun:
+
+#### Iris consoles
+#
+
+# (wsiris: this had unknown capabilities
+#      :HS=\E7F2:HE=\E7F7:\
+#      :CT#2:CZ=*Bblack,red,green,yellow,blue,magenta,cyan,*Fwhite:
+# I mapped ":pt:" to ":it#8:", removed incorrect ":cl=\Ev:" -- esr)
+wsiris|iris40|iris emulating a 40 line visual 50 (approximately):\
+       :am:bs:pt:\
+       :co#80:it#8:li#40:\
+       :al=\EL:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :dl=\EM:\
+       :ho=\EH:is=\E7B0\E7F7\E7C2\E7R3:k0=\E0:k1=\E1:k2=\E2:\
+       :k3=\E3:k4=\E4:k5=\E5:k6=\E6:k7=\E7:k8=\E8:k9=\E9:\
+       :kd=\EB:kl=\ED:kr=\EC:ku=\EA:nd=\EC:se=\E0@:so=\E9P:\
+       :sr=\EI:ue=\E7R3\E0@:up=\EA:us=\E7R2\E9P:ve=\E>:\
+       :vs=\E;:
+
+#### Masscomp consoles
+#
+
+masscomp2:\
+       :co#64:li#21:\
+       :tc=masscomp:
+masscomp1:\
+       :co#104:li#36:\
+       :tc=masscomp:
+# (masscomp: ":MT:" changed to ":km:"; mapped ":pt:" to ":it#8:" -- esr)
+masscomp:\
+       :bs:km:mi:pt:\
+       :co#80:it#8:li#24:sg#0:\
+       :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[2J:cm=\E[%i%d;%dH:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:im=\E[4h:\
+       :is=\EGc\EGb\EGw:kb=^H:kd=\EOB:kl=\EOD:kr=\EOC:\
+       :ku=\EOA:nd=\E[C:se=\E[0m:so=\E[7m:ue=\EGau:up=\E[A:\
+       :us=\EGu:
+
+#### NeWS consoles
+#
+# Console terminal windows under the NeWS (Sun's Display Postscript windowing
+# environment).   Note: these have nothing to do with Sony's News workstation
+# line.
+#
+
+# Entry for NeWS's psterm from Eric Messick & Hugh Daniel
+# (psterm: unknown ":sl=\EOl:el=\ENl:" removed;
+# mapped ":pt:" to ":it#8:" -- esr)
+psterm|psterm-basic|psterm-80x34:\
+       :am:bs:hs:km:pt:ul:\
+       :co#80:it#8:li#34:\
+       :al=\EA:cd=\EB:ce=\EC:cl=^L:cm=\E%d;%d;:cs=\EE%d;%d;:\
+       :dc=\EF:dl=\EK:do=\EP:ei=\ENi:fs=\ENl:ho=\ER:im=\EOi:\
+       :is=\EN*:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=\ET:\
+       :ll=\EU:mb=\EOb:md=\EOd:me=\EN*:mr=\EOr:nd=\EV:rc=^\:\
+       :rs=\EN*:sc=^]:se=\ENo:sf=\EW:so=\EOo:sr=\EX:te=\ENt:\
+       :ti=\EOt:ts=\EOl:ue=\ENu:up=\EY:us=\EOu:vb=\EZ:
+psterm-96x48:\
+       :co#96:li#48:\
+       :tc=psterm:
+psterm-90x28:\
+       :co#90:li#28:\
+       :tc=psterm:
+psterm-80x24:\
+       :co#80:li#24:\
+       :tc=psterm:
+# This is a faster termcap for psterm.  Warning:  if you use this termcap,
+# some control characters you type will do strange things to the screen.
+# (psterm-fast: unknown ":sl=^Ol:el=^Nl:";
+# removed; mapped ":pt:" to ":it#8:" -- esr)
+psterm-fast:\
+       :am:bs:hs:km:pt:ul:\
+       :co#80:it#8:li#34:\
+       :al=^A:cd=^B:ce=^C:cl=^L:cm=\004%d;%d;:cs=\005%d;%d;:\
+       :dc=^F:dl=^K:do=^P:ei=^Ni:fs=^Nl:ho=^R:im=^Oi:is=^N*:\
+       :kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=^T:ll=^U:mb=^Ob:\
+       :md=^Od:me=^N*:mr=^Or:nd=^V:rc=^\:rs=^N*:sc=^]:\
+       :se=^No:sf=^W:so=^Oo:sr=^X:te=^Nt:ti=^Ot:ts=^Ol:\
+       :ue=^Nu:up=^Y:us=^Ou:vb=^Z:
+
+#### Apollo consoles
+#
+# Apollo got bought by Hewlett-Packard.  The Apollo workstations are 
+# labeled HP700s now.
+#
+
+# From: Gary Darland <goodmanc@garnet.berkeley.edu>
+apollo:\
+       :am:bs:mi:\
+       :co#88:li#53:\
+       :al=\EI:cd=\EJ:ce=\EK:ch=\EN%d:cl=^L:cm=\EM%+ %d):\
+       :cv=\EO+ :dc=\EP:dl=\EL:do=\EB:ei=\ER:im=\EQ:nd=\EC:\
+       :se=\ET:sf=\EE:so=\ES:sr=\ED:te=\EX:ti=\EW:ue=\EV:\
+       :up=\EA:us=\EU:
+apollo_15P|apollo 15 inch display:\
+       :dN@:\
+       :tc=vt132:
+apollo_19L|apollo 19 inch display:\
+       :dN@:\
+       :tc=vt132:
+apollo_color|apollo color display:\
+       :dN@:\
+       :tc=vt132:
+
+#### Fortune Systems consoles
+#
+
+# From: Robert Nathanson <c160-3bp@Coral> via tut   Wed Oct 5, 1983
+# (This had unknown capabilities
+#      :rv=\EH:re=\EI:rg=0:\
+#      :GG=0:GV=-:GH=&:GU=%:GD=#:G1=(:G2= :G3=":G4=*:CF=\E]:\
+#      :CO=\E\\:WL=^Aa\r:WR=^Ab\r:CL=^Ac\r:CR=^Ad\r:DL=^Ae\r:RF=^Af\r:\
+#      :RC=^Ag\r:CW=^Ah\r:NU=^Aj\r:EN=^Ak\r:HM=^Al:PL=^Am\r:\
+#      :PU=^An\r:PD=^Ao\r:PR=^Ap\r:HP=^A@\r:RT=^Aq\r:TB=\r:CN=\177:MP=\E+F:
+# It had both ":bs:" and ":bs=^H:"; I removed the latter.  Also, it had
+# ":sg=0:" and ":ug=0:"; evidently the composer was trying (unnecessarily)
+# to force both magic cookie glitches off.  Once upon a time, I
+# used a Fortune myself, so I know the capabilities of the form ^A[a-z]\r are
+# function keys; thus the "Al" value for HM was certainly an error.  I renamed
+# EN/PD/PU/CO/CF according to the XENIX/TC mappings, but not HM/DL/RF/RC/RT.  
+# I think rv and re are start and end reverse video and rg is a nonexistent
+# "reverse-video-glitch" capability; I have put rv and re in with standard
+# names below.  I've removed obsolete ":nl=5^J:" as there is a :do: -- esr)
+fos|fortune|Fortune system:\
+       :am:bs:bw:\
+       :co#80:li#25:\
+       :@7=^Ak\r:ae=^O:al=\034E:as=\Eo:bl=^G:cd=\034Y:\
+       :ce=^\Z:cl=\014:cm=\034C%+ %+ :cr=^M:dc=\034W:\
+       :dl=\034R:do=\n:ei=:ho=\036:ic=\034Q:im=:is=^_..:\
+       :k1=^Aa\r:k2=^Ab\r:k3=^Ac\r:k4=^Ad\r:k5=^Ae\r:\
+       :k6=^Af\r:k7=^Ag\r:k8=^Ah\r:kN=^Ao\r:kP=^An\r:kb=^H:\
+       :kd=^Ay\r:kh=^A?\r:kl=^Aw\r:kr=^Az\r:ku=^Ax\r:le=^H:\
+       :mb=\EN:me=\EI:mr=\EH:nw=^M^J:se=^\I`:sf=^J:so=^\H`:\
+       :ta=^Z:ue=^\IP:up=\013:us=^\HP:ve=\E\\:vi=\E]:\
+       :vs=\E\072:
+
+######## COMMON TERMINAL TYPES
+#
+# This section describes terminal classes and maker brands that are still
+# quite common, but have proprietary command sets not blessed by ANSI.
+
+#### Altos
+#
+# Altos descriptions from Ted Mittelstaedt <tedm@agora.rain.com> 4 Sep 1993
+# His comments suggest they were shipped with the system.
+#
+
+# (altos2: had unknown capabilities
+#      :c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\
+#      :c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\
+#      :c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\
+#      :cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r:
+#      :XU=^Aq\r:XD=^Ar\r:XR=^As\r:XL=^At\r:\
+#      :YU=^AQ\r:YD=^AR\r:YR=^AS\r:YL=^AT\r:\
+#      :HL=^AP\r:SP=\E[i:\
+#      :IS=\E[@:DE=\E[P:IL=\E[L:NS=\E[S:PS=\E[T:\
+#      :LO=\E[0q:LC=\E[5q:LL=\E[6q:\
+# Comparison with the k* capabilities makes it obvious that the c* things are
+# shift keys.  I have renamed them to keys 32 and up accordingly.  Also,
+# :sr: was given as a boolean-- esr)
+altos2|alt2|altos-2|altos II:\
+       :co#80:it#8:li#24:sg#0:\
+       :*5=^Am\r:*8=^An\r:DL=\E[M:FM=^A`\r:FN=^Aa\r:\
+       :FO=^Ab\r:FP=^Ac\r:FQ=^Ad\r:FR=^Ae\r:FS=^Af\r:\
+       :FT=^Ag\r:FU=^Ah\r:FV=^Ai\r:FW=^Aj\r:FX=^Ak\r:\
+       :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:do=\E[1B:ei=:ho=\E[H:\
+       :ic=\E[@:if=/usr/share/lib/tabset/vt100:im=:\
+       :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:k0=^AI\r:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=^AJ\r:\
+       :kB=^AK\r:kC=^AL\r:kD=^AM\r:kE=^AN\r:kF=^AO\r:kb=^H:\
+       :kd=\E[B:kh=\E[f:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+       :nd=\E[1C:nw=^M^J:se=\E[m:sf=^J:so=\E[7m:ta=^I:\
+       :ue=\E[m:up=\E[1A:us=\E[4m:
+# (altos3: had unknown capabilities
+#      :c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\
+#      :c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\
+#      :c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\
+#      :cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r:
+#      :XU=^Aq\r:XD=^Ar\r:XR=^As\r:XL=^At\r:\
+#      :HL=^AP\r:SP=\E[i:\
+#      :IS=\E[@:DE=\E[P:IL=\E[L:NS=\E[S:PS=\E[T:\
+# Comparison with the k* capabilities makes it obvious that the c* things are
+# shift keys.  I have renamed them to keys 32 and up accordingly -- esr)
+altos3|alt3|altos-3|altos III:\
+       :co#80:it#8:li#24:sg#0:\
+       :*5=^Am\r:*8=^An\r:DL=\E[M:FM=^A`\r:FN=^Aa\r:\
+       :FO=^Ab\r:FP=^Ac\r:FQ=^Ad\r:FR=^Ae\r:FS=^Af\r:\
+       :FT=^Ag\r:FU=^Ah\r:FV=^Ai\r:FW=^Aj\r:FX=^Ak\r:\
+       :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:do=\E[1B:ei=:ho=\E[H:\
+       :ic=\E[@:if=/usr/share/lib/tabset/vt100:im=:\
+       :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:k0=^AI\r:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=^AJ\r:\
+       :kB=^AK\r:kC=^AL\r:kD=^AM\r:kE=^AN\r:kF=^AO\r:kb=^H:\
+       :kd=\E[B:kh=\E[f:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+       :mb=\E[5p:me=\E[p:nd=\E[1C:nw=^M^J:se=\E[m:sf=^J:\
+       :so=\E[7m:sr=\EM:ta=^I:ue=\E[m:up=\E[1A:us=\E[4m:
+altos4|alt4|altos-4|altos IV:\
+       :tc=wy50:
+altos5|alt5|altos-5|altos V:\
+       :tc=altos3:
+# (altos7: had unknown capabilities:
+#      :GG#0:GS=\EH^B:GE=\EH^C:\
+#      :G1=3:G2=2:G3=1:G4=5:GD=0:GU==:GH=\072:\
+#      :GV=6:GR=4:GL=9:GC=8:GI=\EH8:GF=\EH7:\
+#      :c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\
+#      :c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\
+#      :c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\
+#      :cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r:
+#      :PD=\EK:PU=\EJ:PN=\Ed#:PS=\EJ:DL=\ER:\
+# Comparison with the k* capabilities makes it obvious that the c* things are
+# shift keys.  I have renamed them to keys 32 and up accordingly -- esr)
+altos7|alt7|altos VII:\
+       :am:mi:\
+       :co#80:li#24:sg#0:\
+       :*5=^Am\r:*8=^An\r:DL=\ER:FM=^A`\r:FN=^Aa\r:FO=^Ab\r:\
+       :FP=^Ac\r:FQ=^Ad\r:FR=^Ae\r:FS=^Af\r:FT=^Ag\r:\
+       :FU=^Ah\r:FV=^Ai\r:FW=^Aj\r:FX=^Ak\r:al=\EE:cd=\EY:\
+       :ce=\ET:cl=\E+^^:cm=\E=%+ %+ :cr=^M:dc=\EW:do=^J:\
+       :ei=\Er:ho=^^:im=\Eq:\
+       :is=\E`\072\Ee(\EO\Ee6\Ec41\E~4\Ec21\Eu\E~2:k0=^AI\r:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=^AJ\r:\
+       :kB=^AK\r:kC=^AL\r:kD=^AM\r:kE=^AN\r:kF=^AO\r:kb=^H:\
+       :kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:mb=\EG2:md=\EGt:\
+       :me=\EG0:mh=\EGp:mk=\EG1:mr=\EG4:nd=^L:nw=^M^J:\
+       :se=\EG0:sf=^J:so=\EG4:sr=\Ej:ta=^I:ue=\EG0:up=^K:\
+       :us=\EG8:
+altos7pc|alt7pc|altos PC VII:\
+       :@7=\ET:tc=altos7:
+
+#### Hewlett-Packard (hp)
+#
+#      Hewlett-Packard
+#      8000 Foothills Blvd 
+#      Roseville, CA 95747
+#      Vox: 1-(916)-785-4363   (Technical response line for VDTs)
+#           1-(800)-633-3600   (General customer support)
+#
+
+# Generic HP terminal - this should (hopefully) work on any HP terminal.
+hpgeneric|hewlett-packar|hewlettpackard:\
+       :am:da:db:mi:xs:\
+       :co#80:li#24:lm#0:vt#6:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EK:ch=\E&a%dC:cl=\EH\EJ:\
+       :cm=\E&a%r%dc%dY:cr=^M:ct=\E3:cv=\E&a%dY:dc=\EP:\
+       :dl=\EM:do=^J:ei=\ER:im=\EQ:kB=\Ei:kb=^H:le=^H:\
+       :nd=\EC:se=\E&d@:sf=^J:so=\E&dJ:st=\E1:ta=^I:\
+       :ue=\E&d@:up=\EA:us=\E&dD:
+
+hp110|hewlett-packard model 110 portable:\
+       :li#16:\
+       :tc=hpgeneric:
+
+hp+pfk+cr|hp function keys with CR:\
+       :k1=\Ep\r:k2=\Eq\r:k3=\Er\r:k4=\Es\r:k5=\Et\r:\
+       :k6=\Eu\r:k7=\Ev\r:k8=\Ew\r:
+
+hp+pfk-cr|hp function keys w/o CR:\
+       :k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:\
+       :k8=\Ew:
+
+# The 2621s use the same keys for the arrows and function keys, 
+# but not separate escape sequences. These definitions allow the 
+# user to use those keys as arrow keys rather than as function 
+# keys.
+hp+pfk+arrows|hp alternate arrow definitions:\
+       :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:kF=\Er\r:kH=\Eq\r:\
+       :kR=\Es\r:kd=\Ew\r:kh=\Ep\r:kl=\Eu\r:kr=\Ev\r:\
+       :ku=\Et\r:
+
+hp+arrows|hp arrow definitions:\
+       :kF=\ES:kH=\EF:kR=\ET:kd=\EB:kh=\Eh:kl=\ED:kr=\EC:\
+       :ku=\EA:
+
+# Generic stuff from the HP 262x series
+#
+hp262x:\
+       :xs:\
+       :cd=\EJ:dc=\EP:ip=:kA=\EL:kD=\EP:kE=\EK:kF=\ES:\
+       :kI=\EQ:kL=\EM:kM=\ER:kN=\EU:kP=\EV:kR=\ET:kS=\EJ:\
+       :kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:\
+       :ku=\EA:mb=\E&dA:me=\E&d@:mk=\E&dS:mr=\E&dB:\
+       :..sa=\E&d%'@'%?%p1%t%'B'%|%;%?%p2%t%'D'%|%;%?%p3%t%'B'%|%;%?%p4%t%'A'%|%;%c:\
+       :se=\E&d@:sf=\ES:so=\E&dB:ta=\011:ue=\E&d@:us=\E&dD:
+# Note: no "home" on HP's since that homes to top of memory, not screen.
+# Due to severe 2621 braindamage, the only way to get the arrow keys to
+# transmit anything at all is to turn on the function key labels
+# with smkx, and even then the user has to hold down shift!
+# The default 2621 turns off the labels except when it has to to 
+# enable the function keys. If your installation prefers labels 
+# on all the time, or off all the time (at the "expense" of the 
+# function keys) move the # 2621-nl or 2621-wl labels to the 
+# front using reorder.
+# Note: there are newer ROMs for 2621's that allow you to set 
+# strap A so the regular arrow keys xmit \EA, etc, as with the 
+# 2645. However, even with this strap set, the terminal stops 
+# xmitting if you reset it, until you unset and reset the strap!
+# Since there is no way to set/unset the strap with an escape 
+# sequence, we don't use it in the default.
+# If you like, you can use 2621-ba (braindmaged arrow keys).
+hp2621-ba|2621-ba|2621 w/new rom and strap A set:\
+       :ke@:ks@:tc=hp+arrows:tc=hp2621:
+
+# 2621 with function labels. Most of the time they are off,
+# but inside vi, the function key labels appear. You have to
+# hold down shift to get them to xmit.
+hp2621|hp2621a|hp2621A|2621|2621a|2621A|hp2621-wl|2621-wl|hp 2621 w/labels:\
+       :is=\E&jA\r:ke=\E&jA:tc=hp2621-fl:
+
+# 2621 with function labels.  Most of the time they are off,
+# but inside vi, the function key labels appear.  You have to
+# hold down shift to get them to xmit.
+hp2621-fl|2621-fl|hp 2621:\
+       :xo:xs@:\
+       :pb#19200:\
+       :bt=\Ei:cm=\E&a%r%dc%dY:dc=\EP:ip=:is=\E&j@\r:\
+       :ke=\E&j@:ks=\E&jB:me=\E&d@:se=\E&d@:so=\E&dD:\
+       :ta=\011:ue=\E&d@:us=\E&dD:tc=hp+pfk+cr:tc=hpgeneric:
+
+# To use 2621p printer, setenv TERM=2621p, PRINTER=2612p
+hp2621p|2621p|2621P|hp 2621 with printer:\
+       :pf=\E&p13C:po=\E&p11C:tc=hp2621:
+
+hp2621p-a|2621p-a|hp2621p with fn as arrows:\
+       :tc=hp+pfk+arrows:tc=hp2621p:
+
+# hp2621 with k45 keyboard
+hp2621-k45|hp2621k45|2621k45|k45|hp 2621 with 45 keyboard:\
+       :kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:\
+       :ks=\E&s1A:ku=\EA:tc=hp2621:
+
+# This terminal should be used at 4800 baud or less. It needs padding for
+# plain characters at 9600, I guessed at an appropriate cr delay.  It really
+# wants ^E/^F handshaking, but that doesn't work well even if you write
+# software to support it.
+hp2645|hp45|hp 264x series:\
+       :pb#9600:\
+       :cr=\r:kA=\EL:kD=\EP:kE=\EK:kF=\ES:kI=\EQ:kL=\EM:\
+       :kM=\ER:kN=\EU:kP=\EV:kR=\ET:kS=\EJ:kT=\E1:kd=\EB:\
+       :ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:kt=\E2:\
+       :ku=\EA:mb=\E&dA:me=\E&d@:mh=\E&dH:mr=\E&dB:\
+       :..sa=\E&d%'@'%?%p1%t%'B'%|%;%?%p2%t%'D'%|%;%?%p3%t%'B'%|%;%?%p4%t%'A'%|%;%?%p5%t%'H'%|%;%?%p6%t%'B'%|%;%c:\
+       :us=\E&dD:tc=hpgeneric:
+
+# Hp 2624 B with 4 or 10 pages of memory.
+# 
+# Some assumptions are made with this entry. These settings are 
+# NOT set up by the initialization strings.
+# 
+# Port Configuration
+#      RecvPace=Xon/Xoff
+#      XmitPace=Xon/Xoff
+#      StripNulDel=Yes
+# 
+# Terminal Configuration
+#      InhHndShk=Yes
+#      InhDC2=Yes
+#      XmitFnctn(A)=No
+#      InhEolWrp=No
+# 
+# Note: the 2624 DOES have a true "home," believe it or not!
+# 
+# The 2624 has an "error line" to which messages can be sent. 
+# This is CLOSE to what is expected for a "status line". However,
+# after a message is sent to the "error line", the next carriage 
+# return is EATEN and the "error line" is turned back off again! 
+# So I guess we can't define hs, eslok, wsl, dsl, fsl, tsl
+# 
+# This entry supports emacs (and any other program that uses raw 
+# mode) at 4800 baud and less. I couldn't get the padding right 
+# for 9.6.
+#
+hp2624|hp2624a|hp2624b|hp2624b-4p|2624-4p|2624|2624a|2624b|Hewlett Packard 2624 B:\
+       :da:db:\
+       :lm#96:\
+       :vb=\E&w13F\200\200\200\200\E&w12F\200\200\200\200\E&w13F\200\200\200\200\E&w12F:tc=hp+labels:tc=scrhp:
+
+# These attributes are not set above:
+# 
+# civis, cmdch, cnorm, csr, cub, cud, cuf, cuu, cvvis, dch, dl, 
+# ech, eo, eslok, fsl, gn, hc, hd, hu, hz, ich, ich1, if, il, in,
+# indn, iprog, is2, is3, it, ka1, ka3, kb2, kc1, kc3, kclr, kf0, 
+# kf10, khts, km, ktbc, lf0, lf1, lf10, lf2, lf3, lf4, lf5, lf6, 
+# lf7, lf8, lf9, mc5p, os, pad, pfkey*, pfloc*, pfx*, prot, rc, 
+# rep, rin, rmcup, rmdc, rmm, rs2, rs3, sc, smcup, smdc, smm, tsl,
+# uc, ul, vt, wind, wsl, xenl, xmc, xsb, xt
+# 
+# not needed if tset is used:
+#      if=/usr/lib/tabset/std,
+# 
+# This hp2626 entry does not use any of the fancy windowing stuff 
+# of the 2626.
+# 
+# Indeed, terminfo does not yet handle such stuff. Since changing 
+# any window clears memory, it is probably not possible to use 
+# this for screen opt.
+# 
+# ed is incredibly slow most of the time - I am guessing at the 
+# exact padding. Since the terminal uses xoff/xon this is intended 
+# only for cost computation, so that the terminal will prefer el 
+# or even dl1 which is probably faster!
+# 
+# \ED\EJ\EC hack for ed from Ed Bradford - apparently ed is only 
+# extra slow # on the last line of the window. 
+# 
+# The padding probably should be changed.
+#
+hp2626|hp2626a|hp2626p|2626|2626a|2626p|2626A|2626P|hp 2626:\
+       :da:db:\
+       :lm#0:pb#19200:\
+       :SF=\E&r%dD:SR=\E&r%dU:cd=\ED\EJ\EC:ip=:is=\E&j@\r:tc=hp+pfk+cr:tc=hp+labels:tc=scrhp:
+
+# This entry is for sysline. It allocates a 23 line window with 
+# a 115 line workspace for regular use, and a 1 line window for 
+# the status line.
+# 
+# This assumes port 2 is being used.
+# Turn off horizontal line, Create ws #1 with 115 lines,
+# Create ws #2 with 1 line, Create window #1 lines 1-23,
+# Create window #2 lines 24-24, Attach cursor to workspace #1.
+# Note that this clears the tabs so it must be done by tset before
+# it sets the tabs.
+#
+hp2626-s|2626-s|hp 2626 using only 23 lines:\
+       :es:hs:\
+       :li#23:\
+       :fs=\E&d@\E&w7f2p1I\E&w4f1I:\
+       :i1=\E&q3t0{0H \E&w0f115n1I \E&w0f1n2I\n\E&w2f1i0d0u22l0S \E&w2f2i0d23u23l0S \E&w7f2p1I \r:\
+       :ts=\E&w7f2p2I\E&w4f2I\r\EK\E&a%p1%dC:tc=hp2626:
+# Force terminal back to 24 lines after being 23.
+#
+hp2626-ns|2626-ns|hp 2626 using all 24 lines:\
+       :i1=\E&q3t0{0H \E&w0f118n1I \E&w0f1n2I\n\E&w2f1i0d0u23l0S \E&w3f2I \E&w7f2p1I \r:tc=hp2626:
+# Various entries useful for small windows on 2626.
+#
+hp2626-12|2626-12:\
+       :li#12:\
+       :tc=hp2626:
+hp2626-12x40|2626-12x40:\
+       :co#40:li#12:\
+       :tc=hp2626:
+hp2626-x40|2626-x40:\
+       :co#40:\
+       :tc=hp2626:
+hp2626-12-s|2626-12-s:\
+       :li#11:\
+       :tc=hp2626-s:
+# You should use this terminal at 4800 baud or less.
+#
+hp2648|hp2648a|2648a|2648A|2648|HP 2648a graphics terminal:\
+       :cl=\EH\EJ:cm=\E&a%r%dc%dY:dc=\EP:ip=:tc=hp2645:
+
+# 2640a doesn't have the Y cursor addressing feature, and C is 
+# memory relative instead of screen relative, as we need.
+#
+hp2640a|2640a|hp 2640a:\
+       :cm@:ke@:ks@:tc=hp2645:
+
+hp2640b|hp2644a|hp 264x series:\
+       :ke@:ks@:tc=hp2645:
+
+# 2621 using all 48 lines of memory, only 24 visible at any time.  
+#
+hp2621-48|48 line 2621:\
+       :li#48:\
+       :cm=\E&a%r%dc%dR:cv=\E&a%dR:ho=\EH:tc=hp2621:
+
+# 2621 with no labels ever. Also prevents vi delays on escape.
+#
+hp2621-nl|hp 2621 with no labels:\
+       :kd@:ke@:kh@:kl@:kr@:ks@:ku@:tc=hp2621-fl:
+
+# Needed for UCB ARPAVAX console, since lsi-11 expands tabs 
+# (wrong).
+#
+hp2621-nt|hp 2621 w/no tabs:\
+       :ta@:tc=hp2621:
+
+# The HP 150 terminal is a fairly vanilla HP terminal, with the 
+# clreol standout problem. It also has graphics capabilities and 
+# a touch screen, which we don't describe here.
+hp150|hewlett packard Model 150:\
+       :tc=hp2622:
+
+# Hp 2382a terminals, "the little ones." They don't have any 
+# alternate character set support and sending out ^N/^O will 
+# leave the screen blank.
+hp2382a|hp2382|hewlett packard 2382a:\
+       :da:db:\
+       :lh#1:lm#48:\
+       :ac@:ae@:as@:me=\E&d@:\
+       :..pn=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t %;%p2%s:\
+       :..sa=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga%+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+%Pa%;%?%p7%t%?%ga%ts%ga%'@'%+%e%'S'%;%e%?%ga%t%ga%'@'%+%e%'@'%;%;%c:tc=hp+labels:tc=scrhp:
+
+hp2621-a|hp2621a-a|2621-a|hp2621 with fn as arrows:\
+       :tc=hp+pfk+arrows:tc=hp2621-fl:
+
+# newer hewlett packard terminals
+
+newhpkeyboard|generic entry for HP extended keyboard:\
+       :kA=\EL:kB=\Ei:kC=\EJ:kD=\EP:kE=\EK:kF=\ET:kH=\EF:\
+       :kI=\EQ:kL=\EM:kM=\ER:kN=\EU:kP=\EV:kR=\ES:kS=\EJ:\
+       :kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:\
+       :ks=\E&s1A:ku=\EA:tc=hp+pfk-cr:
+
+newhp|generic entry for new hewlett packard terminals:\
+       :am:bw:mi:xo:xs:\
+       :co#80:li#24:pb#4800:\
+       :ac=T1R!U2S"W3O#V4P$t5u6w7v8\072'9(LQKWlRkT5I3@2[MAJSmFjGdHQ;Y+Z*X\0724>q\\\054x.n/:\
+       :ae=^O:al=\EL:as=^N:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:cr=^M:\
+       :ct=\E3:dc=\EP:dl=\EM:do=^J:ei=\ER:i1=\E&jB:im=\EQ:\
+       :ip=:le=^H:mb=\E&dA:md=\E&dF:me=\E&d@\017:mh=\E&dH:\
+       :mk=\E&dS:mr=\E&dB:nd=\EC:nw=^M^J:\
+       :..pk=\E&f0a%p1%dk0d%p2%l%dL%p2%s:\
+       :..pl=\E&f1a%p1%dk0d%p2%l%dL%p2%s:\
+       :..px=\E&f2a%p1%dk0d%p2%l%dL%p2%s:r1=\Eg:\
+       :..sa=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga%+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+%Pa%;%?%p7%t%?%ga%ts%ga%'@'%+%e%'S'%;%e%?%ga%t%ga%'@'%+%e%'@'%;%;%c%?%p9%t\016%e\017%;:\
+       :se=\E&d@:sf=^J:so=\E&dJ:sr=\ET:st=\E1:ta=\011:\
+       :ue=\E&d@:up=\EA:us=\E&dD:tc=newhpkeyboard:
+
+memhp|memory relative addressing for new HP ttys:\
+       :vt#6:\
+       :CM=\E&a%p1%dr%p2%dC:DO=\E&a+%dR:LE=\E&a-%dC:\
+       :RI=\E&a+%dC:UP=\E&a-%dR:ch=\E&a%dC:cl=\EH\EJ:\
+       :cm=\E&a%dr%dC:cv=\E&a%dR:ho=\EH:ll=\E&a23R\r:tc=newhp:
+
+scrhp|screen relative addressing for new HP ttys:\
+       :CM=\E&a%p1%dr%p2%dC:DO=\E&a+%dR:LE=\E&a-%dC:\
+       :RI=\E&a+%dC:UP=\E&a-%dR:ch=\E&a%dC:cl=\E&a0c0Y\EJ:\
+       :cm=\E&a%dy%dC:cv=\E&a%dY:ho=\E&a0y0C:ll=\E&a0y0C\EA:tc=newhp:
+
+hp+labels|"standard" label info for new HP ttys:\
+       :Nl#8:lh#2:lw#8:\
+       :LO=\E&jB:\
+       :..pn=\E&f2a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t %;%p2%s:
+
+hp+printer| "standard" printer info for HP ttys:\
+       :ff=\E&p4u0C:pf=\E&p13C:po=\E&p11C:ps=\EH\E&p4dF:
+
+
+# The new hp2621b is kind of a cross between the old 2621 and the
+# new 262x series of machines. It has dip-switched options. 
+# The firmware has a bug in it such that if you give it a null 
+# length label, the following character is eaten!
+hp2621b|2621b|hp 2621b with old style keyboard:\
+       :Nl#8:lh#1:lm#48:lw#8:\
+       :LO=\E&jB:kF=\ET:kH=\EF:kR=\ES:kd=\EB:kh=\Eh:kl=\ED:\
+       :kr=\EC:ku=\EA:\
+       :..pn=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d3L%?%ga%!%t%{32}%c%;%p2%s\E%'o'%p1%+%c\r:tc=hp2621:
+
+hp2621b-p|2621b-p|hp 2621b with printer:\
+       :tc=hp+printer:tc=hp2621b:
+
+# hp2621b - new 2621b with new extended keyboard
+# these are closer to the new 26xx series than the other 2621b
+hp2621b-kx|2621b-kx|hp 2621b with extended keyboard:\
+       :tc=newhpkeyboard:tc=hp2621b:
+
+hp2621b-kx-p|2621b-kx-p|hp 2621b with new keyboard & printer:\
+       :tc=hp+printer:tc=hp2621b-kx:
+
+# Some assumptions are made in the following entries.
+# These settings are NOT set up by the initialization strings.
+# 
+#    Port Configuration
+# RecvPace=Xon/Xoff    XmitPace=Xon/Xoff       StripNulDel=Yes
+# 
+#    Terminal Configuration
+# InhHndShk(G)=Yes     InhDC2(H)=Yes
+# XmitFnctn(A)=No              InhEolWrp=No
+#
+# 
+# Hp 2622a & hp2623a display and graphics terminals
+#
+hp2622|hp2622a|2622|2622a|hp 2622:\
+       :da:db:\
+       :lm#0:pb#19200:\
+       :is=\E&dj@\r:tc=hp+pfk+cr:tc=hp+labels:tc=scrhp:
+
+# The 2623 is a 2622 with extra graphics hardware.
+hp2623|hp2623a|2623|2623a|hp 2623:\
+       :tc=hp2622:
+
+
+hp2624b-p|hp2624b-4p-p|hewlett packard 2624 B with printer:\
+       :tc=hp+printer:tc=hp2624:
+
+# The hewlett packard B can have an optional extra 6 pages of 
+# memory.
+hp2624-10p|hp2624a-10p|hp2624b-10p|2624-10p|2624a-10p|2624b-10p|hewlett packard 2624 B w/ 10 pages of memory:\
+       :lm#240:\
+       :tc=hp2624:
+
+hp2624b-10p-p|hewlett packard 2624 B w/ extra memory & printer:\
+       :lm#240:\
+       :tc=hp2624b-p:
+
+# Color manipulations for HP terminals
+
+hp+color|hp with colors:\
+       :cc:\
+       :Co#16:NC#17:pa#7:\
+       :..Ip=\E&v%?%p2%{1000}%=%t1%e.%p2%d%;a\n%?%p3%{1000}%=%t1%e.%p3%d%;b\n%?%p4%{1000}%=%t1%e.%p4%d%;c\n%?%p5%{1000}%=%t1%e.%p5%d%;x\n%?%p6%{1000}%=%t1%e.%p6%d%;y\n%?%p7%{1000}%=%t1%e.%p7%d%;z\n%p1%dI:\
+       :oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5I\E&v1b1c6I\E&v1x1y7I:\
+       :op=\E&v0S:sp=\E&v%dS:
+
+# is2 set screen to be 80 columns wide
+hp2397a|2397a|hp2397|2397|hewlett packard 2397A color terminal:\
+       :is=\E&w6f80X:tc=memhp:tc=hp+labels:tc=hp+color:
+
+#  HP 700/44 Setup parameters:  
+# Terminal Mode                HP-PCterm
+# Inhibit Auto Wrap    NO
+# Status Line          Host Writable
+# PC Character Set     YES
+# Twenty-Five Line Mode        YES
+# XON/XOFF             @128 or 64 (sc)
+# Keycode Mode                 NO   or YES (sc)
+# Backspace Key                BS or BS/DEL
+#
+# is2  sets pcterm; autowrap; 25 lines; pc char set; prog DEL key; \E\\?
+# does not turn off keycode mode
+# smsc sets alternate start/stop; keycode on
+#
+hpansi|hp700|hewlett packard 700/44 in HP-PCterm mode:\
+       :am:eo:xn:xo:\
+       :co#80:li#25:\
+       :@7=\E[4~:S4=\E[>11h\EPO**x0/65;1/67\E\\:\
+       :S5=\E[>11l\EP1**x0/11;1/13\E[0m\E\\:XF=g:XN=e:\
+       :ac=k\277l\332m\300j\331n\305w\302q\304u\264t\303v\301x\263:\
+       :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[2J\E[H:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=\E[B:ei=:\
+       :ho=\E[H:ic=\E[@:im=:\
+       :is=\E[44"p\E[?7h\E[>10h\E[>12h\EP1;1|3/7F\E\\:\
+       :k1=\E[17~:k2=\E[18~:k3=\E[19~:k4=\E[20~:k5=\E[21~:\
+       :k6=\E[23~:k7=\E[24~:k8=\E[25~:k9=\E[26~:k;=\E[28~:\
+       :kB=\E[Z:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:kh=\E[1~:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:nd=\E[C:se=\E[m:\
+       :sf=^J:so=\E[7m:ta=^I:ue=\E[m:up=\E[A:us=\E[4m:\
+       :ve=\E[?25h:vi=\E[?25l:
+#
+hp2392|2392|2393|239x series:\
+       :co#80:\
+       :bt=\Ei:cm=\E&a%dy%dC:cv=\E&a%dY:im=\EQ:k1=\Ep\r:\
+       :k2=\Eq\r:k3=\Er\r:k4=\Es\r:k5=\Et\r:k6=\Eu\r:\
+       :k7=\Ev\r:k8=\Ew\r:kF=\EU:kN=\Eu:kP=\Ev:kR=\EV:\
+       :kh=\Eh:ue=\E&d@:us=\E&dD:tc=hpsub:
+
+2392nam|hp2392nam|HP 239x series with no auto margins:\
+       :am@:\
+       :tc=hp2392:
+
+hpsub|hp terminals -- capability subset:\
+       :am:da:db:mi:xo:xs:\
+       :li#24:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EK:ch=\E&a%dC:cl=\EH\EJ:\
+       :cr=^M:dc=\EP:dl=\EM:do=\EB:ei=\ER:\
+       :if=/usr/lib/tabset/stdcrt:is=\E&s1A\E<\E&k0\\:kb=^H:\
+       :kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:\
+       :ku=\EA:le=^H:nd=\EC:se=\E&d@:sf=^J:so=\E&dB:ta=^I:\
+       :up=\EA:
+
+# HP 236 console
+# From: <ddavis@ic.berkeley.edu>
+hp236|hp236 internal terminal emulator:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\EG:ce=\EK:cl=\EF:cm=\EE%+ %+ :dc=\EJ:dl=\EH:ei=:\
+       :ic=\EI:im=:se=\ECI:so=\EBI:up=^K:ve=\EDE:vs=\EDB:
+
+# This works on a hp300 console running Utah 4.3 BSD
+# From: Craig Leres <leres@okeeffe.berkeley.edu>
+hp300h|HP Catseye console:\
+       :am:bs:da:db:mi:xs:\
+       :co#128:li#51:lm#0:sg#0:\
+       :al=\EL:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:ch=\E&a%dC:\
+       :cl=\E&a0y0C\EJ:cm=\E&a%dy%dC:cr=^M:ct=\E3:\
+       :cv=\E&a%dY:dc=\EP:dl=\EM:do=\EB:ei=\ER:\
+       :if=/usr/share/tabset/stdcrt:im=\EQ:kb=^H:kd=\EB:\
+       :ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:ku=\EA:\
+       :le=^H:me=\E&d@:nd=\EC:se=\E&d@:sf=^J:so=\E&dB:ta=^I:\
+       :ue=\E&d@:up=\EA:us=\E&dD:
+# From: Greg Couch <gregc@ernie.berkeley.edu>
+# (hp9837: removed obsolete ":ko=ce,cd,al,im,dl,dc:";
+# mapped ":pt:" to ":it#8:" -- esr)
+hp9837|hp98720|hp98721|HP 9000/300 workstations:\
+       :am:bs:da:db:mi:pt:xs:\
+       :co#128:it#8:li#46:lm#0:\
+       :al=\EL:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:ch=\E&a%dC:\
+       :cl=\E&a0y0C\EJ:cm=\E&a%dy%dC:ct=\E3:cv=\E&a%dY:\
+       :dc=\EP:dl=\EM:do=\EB:ei=\ER:im=\EQ:is=\E&v0m1b0i&j@:\
+       :kN=\EU:kP=\EV:kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:\
+       :kr=\EC:ks=\E&s1A:ku=\EA:le=^H:me=\E&d@:nd=\EC:\
+       :se=\E&v0S:sf=^J:so=\E&v5S:st=\E1:ue=\E&d@:up=\EA:\
+       :us=\E&dD:
+# From: Charles A. Finnell of MITRE <finnell@mitre.org>, developed 07SEP90
+# (hp98550: removed obsolete ":kn#12:ko=al,cd,ce,ct,dc,dl,do,ei,im,nd,st,up:";
+# mapped ":pt:" to ":it#8:" -- esr)
+hp98550|hp98550a|HP 9000 Series 300 color console:\
+       :am:bs:da:db:mi:pt:xs:\
+       :co#128:it#8:li#49:lm#0:\
+       :ae=^O:al=\EL:as=^N:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:\
+       :ch=\E&a%dC:cl=\EH\EJ:cm=\E&a%dy%dC:cr=^M:ct=\E3:\
+       :cv=\E&a%dY:dc=\EP:dl=\EM:do=^J:ei=\ER:\
+       :if=/usr/share/tabset/9837:im=\EQ:k1=\Ep:k2=\Eq:\
+       :k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:k8=\Ew:kA=\EL:\
+       :kC=\EJ:kD=\EP:kE=\EK:kF=\ES:kH=\EF:kI=\EQ:kL=\EM:\
+       :kM=\ER:kN=\EU:kP=\EV:kR=\ET:kS=\EJ:kT=\E1:ka=\E3:\
+       :kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:\
+       :ks=\E&s1A:kt=\E2:ku=\EA:le=^H:mb=\E&dA:md=\E&dJ:\
+       :me=\E&d@:mh=\E&dH:mk=\E&ds:mr=\E&dJ:nd=\EC:se=\E&d@:\
+       :sf=^J:so=\E&dJ:st=\E1:ta=^I:ue=\E&d@:up=\EA:\
+       :us=\E&dD:ve=\E*dQ:vi=\E*dR:
+# From: Victor Duchovni <vic@fine.princeton.edu>
+# (hp700-wy: removed obsolete ":ko=cl,ho,ce,bt,ta,im,ei,ce,cd:nl=^J:";
+# mapped ":pt:" to ":it#8:" -- esr)
+hp700-wy|HP700/41 emulating wyse30:\
+       :am:bs:bw:mi:ms:pt:\
+       :co#80:it#8:li#24:sg#1:ug#1:\
+       :al=0.7*\EE:bl=^G:bt=\EI:cd=\EY:ce=10\ET:cl=^Z:\
+       :cm=\E=%+ %+ :cr=^M:ct=\E0:cv=\E[%+ :dc=\EW:dl=\ER:\
+       :do=^V:ei=\Er:ho=^^:if=/usr/share/tabset/hp700-wy:\
+       :im=\Eq:is=\E~"\EC\Er\E(\EG0\003\E`9\E`1:kb=\177:\
+       :kd=^V:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:ll=^^^K:nd=^L:\
+       :rs=\E~"\EC\Er\E(\EG0\003\E`9\E`1:se=10\EG0:\
+       :so=10\EG4:sr=\Ej:st=\E1:ue=10\EG0:up=^K:us=10\EG8:
+hp70092|70092a|70092A|hp70092a|hp70092A|Hewlett-Packard 70092:\
+       :am:da:db:xs:\
+       :Nl#8:co#80:lh#2:li#24:lm#0:lw#8:\
+       :LF=\E&j@:LO=\E&jB:ae=^O:al=\EL:as=^N:bl=^G:bt=\Ei:\
+       :ce=\EK:ch=\E&a%dC:cl=\E&a0y0C\EJ:cm=\E&a%dy%dC:\
+       :cr=^M:ct=\E3:cv=\E&a%dY:dc=\EP:dl=\EM:do=\EB:ei=\ER:\
+       :im=\EQ:k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:\
+       :k7=\Ev:k8=\Ew:kA=\EL:kC=\EJ:kD=\EP:kE=\EK:kF=\ES:\
+       :kH=\EF:kI=\EQ:kL=\EM:kM=\ER:kN=\EU:kP=\EV:kR=\ET:\
+       :kS=\EJ:kT=\E1:ka=\E3:kb=^H:kd=\EB:ke=\E&s0A:kh=\Eh:\
+       :kl=\ED:kr=\EC:ks=\E&s1A:kt=\E2:ku=\EA:le=^H:\
+       :mb=\E&dA:md=\E&dB:me=\E&d@:mh=\E&dH:mr=\E&dB:nd=\EC:\
+       :se=\E&d@:so=\E&dJ:sr=\ET:st=\E1:ta=^I:ue=\E&d@:\
+       :up=\EA:us=\E&dD:
+
+bobcat|sbobcat|HP 9000 model 300 console:\
+       :am:da:db:mi:xs:\
+       :co#128:it#8:li#47:sg#0:\
+       :al=10*\EL:bt=\Ei:cd=\EJ:ce=\EK:ch=6\E&a%dC:\
+       :cl=\EH\EJ:cm=6\E&a%dy%dC:cr=^M:cv=6\E&a%dY:dc=\EP:\
+       :dl=10*\EM:do=\EB:ei=\ER:im=\EQ:kb=^H:kd=\EB:\
+       :ke=\E&s0A:kh=\Eh:kl=\ED:kr=\EC:ks=\E&s1A:ku=\EA:\
+       :le=^H:nd=\EC:nw=^M^J:se=\E&d@:sf=^J:so=\E&dB:ta=^I:\
+       :ue=\E&d@:up=\EA:us=\E&dD:
+gator-t|HP 9000 model 237 emulating extra-tall AAA:\
+       :bw:km:mi:ul:\
+       :co#128:it#8:li#94:\
+       :AL=1*\E[%dL:DC=4\E[%dP:DL=1*\E[%dM:IC=4\E[%d@:\
+       :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%i%d`:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:\
+       :do=^J:ei=:ho=\E[H:ic=\E[@:im=:kb=^H:kd=^J:kl=^H:\
+       :le=^H:me=\E[m:mr=\E[7m:nd=\E[C:nw=^M^J:\
+       :..rp=%.\E[%db:se=\E[m:so=\E[7m:ta=^I:ue=\E[m:up=\EM:\
+       :us=\E[4m:
+gator|HP 9000 model 237 emulating AAA:\
+       :bw:km:mi:ul:\
+       :co#128:it#8:li#47:\
+       :AL=1*\E[%dL:DC=4\E[%dP:DL=1*\E[%dM:IC=4\E[%d@:\
+       :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%i%d`:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:\
+       :do=^J:ei=:ho=\E[H:ic=\E[@:im=:kb=^H:kd=^J:kl=^H:\
+       :le=^H:me=\E[m:mr=\E[7m:nd=\E[C:nw=^M^J:\
+       :..rp=%.\E[%db:se=\E[m:so=\E[7m:ta=^I:ue=\E[m:up=\EM:\
+       :us=\E[4m:
+gator-52|HP 9000 model 237 emulating VT52:\
+       :co#128:it#8:li#47:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:..cm=\EY%+ %+ :cr=^M:\
+       :do=^J:ho=\EH:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:\
+       :le=^H:nd=\EC:nw=^M^J:sr=\EI:ta=^I:up=\EA:
+gator-52t|HP 9000 model 237 emulating extra-tall VT52:\
+       :co#128:it#8:li#94:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:..cm=\EY%+ %+ :cr=^M:\
+       :do=^J:ho=\EH:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:\
+       :le=^H:nd=\EC:nw=^M^J:sr=\EI:ta=^I:up=\EA:
+
+#### Honeywell-Bull
+#
+# From: Michael Haardt <michael@gandalf.moria> 11 Jan 93
+#
+
+# Honeywell Bull terminal.  Its cursor and function keys send single
+# control characters and it has standout/underline glitch.  Most programs
+# do not like these features/bugs.  This is a dumb mode for this terminal.
+# Visual bell is realized by flashing the "keyboard locked" LED.
+dku7003-dumb|Honeywell Bull DKU 7003, dumb mode:\
+       :co#80:li#25:\
+       :cd=^_:ce=\E[K:cl=^]^_:cm=\E[%i%d;%dH:cr=^M:do=^K:\
+       :ho=^]:kb=^H:kd=^K:kh=^]:kl=^Y:kr=^X:ku=^Z:le=^Y:\
+       :nd=^X:nw=^M^J:sf=^J:ta=^I:up=^Z:vb=\E[2h\E[2l:
+# Honeywell Bull terminal.  Its cursor and function keys send single
+# control characters and it has standout/underline glitch.  Most programs
+# do not like these features/bugs.  The following entry may cause problems
+# with some programs.  Visual bell is realized by flashing the "keyboard 
+# locked" LED.
+dku7003|Honeywell Bull DKU 7003, all features described:\
+       :ms:\
+       :co#80:li#25:sg#1:ug#1:\
+       :cd=^_:ce=\E[K:cl=^]^_:cm=\E[%i%d;%dH:cr=^M:do=^K:\
+       :ho=^]:kb=^H:kd=^K:kh=^]:kl=^Y:kr=^X:ku=^Z:le=^Y:\
+       :mb=\E[5m:md=\E[7m:me=\E[0m:mh=\E[2m:mr=\E[7m:nd=^X:\
+       :nw=^M^J:se=\E[0m:sf=^J:so=\E[7m:ta=^I:ue=\E[0m:\
+       :up=^Z:us=\E[4m:vb=\E[2h\E[2l:
+
+#### Lear-Siegler (adm)
+#
+# These guys are long since out of the terminals business, but
+# in 1995 many current terminals still have an adm type as one of their
+# emulations (usually their stupidest, and usually labelled adm3, though
+# these `adm3' emulations normally have adm3a+ capabilities).
+#
+
+adm1a|adm1|lsi adm1a:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cl=\E;:cm=\E=%+ %+ :cr=^M:do=^J:ho=^^:le=^H:\
+       :nd=^L:sf=^J:up=^K:
+adm2|lsi adm2:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=\E;:cm=\E=%+ %+ :\
+       :cr=^M:dc=\EW:dl=\ER:do=^J:ei=:ho=^^:ic=\EQ:im=:\
+       :kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:sf=^J:\
+       :up=^K:
+# (adm3: removed obsolete ":ma=^K^P:" -- esr)
+adm3|lsi adm3:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cl=^Z:cr=^M:do=^J:le=^H:sf=^J:
+# The following ADM-3A switch settings are assumed for normal operation:
+#      SPACE           U/L_DISP        CLR_SCRN        24_LINE
+#      CUR_CTL         LC_EN           AUTO_NL         FDX
+# Other switches may be set for operator convenience or communication
+# requirements.  I recommend
+#      DISABLE_KB_LOCK LOCAL_OFF       103             202_OFF
+#      ETX_OFF         EOT_OFF
+# (adm3a: removed obsolete ":ma=^K^P:" -- esr)
+adm3a|lsi adm3a:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cl=\032:cm=\E=%+ %+ :cr=^M:do=^J:ho=^^:le=^H:\
+       :nd=^L:sf=^J:up=^K:
+adm3a+|adm3aplus:\
+       :kd=^J:kl=^H:kr=^L:ku=^K:tc=adm3a:
+# (adm5: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" & duplicate ":do+^J:" -- esr)
+adm5|lsi adm5:\
+       :sg#1:\
+       :bl=^G:cd=\EY:ce=\ET:cr=^M:do=^J:kb=^H:kh=^^:se=\EG:\
+       :so=\EG:tc=adm3a+:
+# From: <stephen%comp.lancs.ac.uk@ucl-cs.arpa>
+# (adm11: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" -- esr)
+adm11|lsi adm11:\
+       :am:bs:hs:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :cr=^M:do=^J:\
+       :ds=\Eh:fs=\E(\r:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+       :nd=^L:se=\E(:so=\E):ts=\EF\E):up=^K:
+# From: Andrew Scott Beals <bandy@lll-crg.ARPA>
+# Corrected by Olaf Siebert <rhialto@polder.ubc.kun.nl>, 11 May 1995
+# (adm12: removed obsolete ":kn:ma=j^Jk^P^K^Pl ^R^L^L :" -- esr)
+adm12|lsi adm12:\
+       :am:bs:mi:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :cr=^M:\
+       :dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:im=\Eq:is=\Eq:\
+       :k0=^A0\r:k1=^A1\r:k2=^A2\r:k3=^A3\r:k4=^A4\r:\
+       :k5=^A5\r:k6=^A6\r:k7=^A7\r:k8=^A8\r:k9=^A9\r:kd=^J:\
+       :kl=^H:kr=^L:ku=^K:le=^H:mk=\EG1:nd=^L:se=\EG0:\
+       :so=\EG4:ue=\EG0:up=^K:us=\EG8:
+# (adm20: removed obsolete ":kn#7:"; mapped ":pt:" to ":it#8:" -- esr)
+adm20|lear siegler adm20:\
+       :am:bs:pt:\
+       :co#80:it#8:li#24:\
+       :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=^Z:\
+       :cm=\E=%i%r%+^_%+^_:cr=^M:dc=\EW:dl=\ER:ei=:ho=^^:\
+       :ic=\EQ:im=:k1=^A:k2=^B:k3=^W:k4=^D:k5=^E:k6=^X:\
+       :k7=^Z:nd=^L:se=\E(:so=\E):up=^K:
+adm21|lear siegler adm21:\
+       :sg#1:ug#1:\
+       :al=30*\EE:bl=^G:cd=\EY:ce=\ET:cr=^M:dc=\EW:\
+       :dl=30*\ER:do=^J:ei=:ic=\EQ:im=:kb=^H:kd=^J:kh=^^:\
+       :kl=^H:kr=^L:ku=^K:se=\EG0:sf=^J:so=\EG4:ue=\EG0:\
+       :us=\EG8:tc=adm3a:
+# (adm22: ":em=:" was an obvious typo for ":ei=:"; also,
+# removed obsolete ":kn#7:ko=ho:ma=j^Jk^P^K^Pl ^R^L^L :" -- esr)
+adm22|lsi adm22:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E+:\
+       :cm=\200\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=:\
+       :ho=^^:ic=\EQ:im=:\
+       :is=\E%\014\014\014\016\003\200\003\002\003\002\200\200\200\200\200\200\200\200\200\200\200:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:\
+       :ku=^K:l1=F1:l2=F2:l3=F3:l4=F4:l5=F5:l6=F6:l7=F7:\
+       :nd=^L:se=\E(:so=\E):ta=\Ei:up=^K:
+# If the adm31 gives you trouble with standout mode, check the DIP switch in
+# position 6, bank @c11, 25% from back end of the circuit board.  Should be
+# OFF.  If there is no such switch, you have an old adm31 and must use oadm31.
+# (adm31: removed obsolete ":ma=j^Jk^P^K^Pl ^R^L^L :" -- esr)
+adm31|lsi adm31:\
+       :am:bs:mi:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=\E*:cm=\E=%+ %+ :\
+       :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:im=\Eq:\
+       :is=\Eu\E0:k0=^A0\r:k1=^A1\r:k2=^A2\r:k3=^A3\r:\
+       :k4=^A4\r:k5=^A5\r:k6=^A6\r:k7=^A7\r:k8=^A8\r:\
+       :k9=^A9\r:kd=^J:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:\
+       :se=\EG0:sf=^J:so=\EG1:ue=\EG0:up=^K:us=\EG1:
+oadm31|o31|old adm31:\
+       :so=\EG4:ue@:us@:tc=adm31:
+# ADM36 in native mode (not VT52 emulation mode)
+adm36|lsi adm36:\
+       :am:mi:\
+       :co#80:li#24:\
+       :al=\E[1L:cd=\E[0J:ce=\E[0K:cl=\E[H\E[2J:\
+       :cm=\E[%i%d;%dH:dl=\E[1M:ei=\E[4l:im=\E[4h:\
+       :is=\E[6;?7h\E[4;20;?1;?3;?6;?4l\E(B\E)B\E>:kd=\EB:\
+       :kl=\ED:kr=\EC:ku=\E[A:le=^H:nd=\E[D:up=\E[A:
+# (adm42: removed obsolete ":ma=^K^P:" -- esr)
+adm42|lsi adm42:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=\E;:\
+       :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\Er:\
+       :im=\Eq:ip=:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:\
+       :nd=^L:pc=\177:se=\EG0:sf=^J:so=\EG4:ta=^I:up=^K:\
+       :vs=\EC\E3 \E3(:
+# The following termcap for the Lear Siegler ADM-42 leaves the 
+# "system line" at the bottom of the screen blank (for those who 
+# find it distracting otherwise)
+adm42-nl|lsi adm-42 with no system line:\
+       :al=\EE\EF \011:bt=\EI\EF \011:cd=\EY\EF \011:\
+       :ce=\ET\EF \011:cl=\E;\EF \011:cm=\E=%+ %+ \EF \011:\
+       :dc=\EW\EF \011:dl=\ER\EF \011:ei=\Er\EF \011:\
+       :im=\Eq\EF \011:tc=adm42:
+
+#### Prime
+#
+# Yes, Prime makes terminals.  These entries were posted by Kevin J. Cummings
+# <cummings@primerd.Prime.COM> on 14 Dec 1992 and lightly edited by esr.
+
+pt100|pt200|wren|fenix|prime pt100/pt200:\
+       :am:bw:mi:ms:\
+       :co#80:it#8:li#24:\
+       :DC=\E[%dP:DL=\E[M:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:\
+       :UP=\E[%dA:al=\E[L\E[t:bt=\E[Z:cd=\E[J\E[r:\
+       :ce=\E[K\E[t:cl=\E?:cm=\E0%+!%+!:cr=^M:dc=\E[P:\
+       :do=\ED:ei=\E[4l:ho=\E$B:im=\E[4h:kb=^H:kd=\E[B:\
+       :ke=\E[>13l:kh=\E$A:kl=\E[D:kr=\E[C:ks=\E[>13h:\
+       :ku=\E[A:le=^H:nd=\E[C:nw=^M^J:se=\E[m:sf=^J:\
+       :so=\E[2;7m:ta=^I:\
+       :ti=\E[>1l\E[>2l\E[>16l\E[4l\E[>9l\E[20l\E[>3l\E[>7h\E[>12l\E[1Q:\
+       :ue=\E[m:up=\EM:us=\E[4m:\
+       :vb=\E$E\200\200\200\200\200\200\200\200\200\200\200\200\200\200\E$P:
+pt100w|pt200w|wrenw|fenixw|prime pt100/pt200 in 132-column mode:\
+       :co#132:\
+       :cm=\E[%i%d;%dH:tc=pt100:
+pt250|Prime PT250:\
+       :so@:tc=pt100:
+pt250w|Prime PT250 in 132-column mode:\
+       :so@:tc=pt100w:
+
+#### Qume (qvt)
+#
+#      Qume, Inc.
+#      3475-A North 1st Street
+#      San Jose CA 95134
+#      Vox: (800)-457-4447
+#      Fax: (408)-473-1510
+#      Net: josed@techsupp.wyse.com (Jose D'Oliveira)
+#
+# Qume was bought by Wyse, but still (as of early 1995) has its own support
+# group and production division.
+#
+# Discontinued Qume models:
+#
+# The qvt101 and qvt102 listed here are long obsolete; so is the qvt101+
+# built to replace them, and a qvt119+ which was a 101+ with available wide
+# mode (132 columns).  There was a qvt103 which added vt100/vt131 emulations
+# and an ANSI-compatible qvt203 that replaced it.  Qume started producing
+# ANSI-compatible terminals with the qvt323 and qvt61.
+#
+# Current Qume models (as of February 1995):
+#
+# All current Qume terminals have ANSI-compatible operation modes.
+# Qume is still producing the qvt62, which features emulations for other
+# popular lines such as ADDS, and dual-host capabilities.  The qvt82 is
+# designed for use as a SCO ANSI terminal.  The qvt70 is a color terminal
+# with many emulatioms including Wyse370, Wyse 325, etc.  Their newest
+# model is the qvt520, which is vt420-compatible.
+#
+# There are some ancient printing Qume terminals under `Daisy Wheel Printers'
+
+qvt101|qvt108|qume qvt 101 and QVT 108:\
+       :sg#1:\
+       :se=\EG0:so=\EG4:tc=qvt101+:
+qvt101+|qvt101p|qume qvt 101 PLUS product:\
+       :am:bw:hs:ul:\
+       :co#80:li#24:sg#0:\
+       :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=^Z:\
+       :cm=\E=%+ %+ :cr=^M:ct=\E3:dc=\EW:dl=\ER:do=^J:\
+       :ds=\Eg\Ef\r:ei=:fs=^M:ho=^^:ic=\EQ:im=:k1=^A@\r:\
+       :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+       :k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:kB=\EI:\
+       :kE=\ET:kI=\EQ:kL=\ER:kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:\
+       :kr=^L:ku=^K:le=^H:nd=^L:pf=\EA:po=\E@:se=\E(:sf=^J:\
+       :so=\E0P\E):st=\E1:ta=^I:ts=\Eg\Ef:ue=\EG0:up=^K:\
+       :us=\EG8:vb=\Eb\Ed:ve=\E.4:vs=\E.2:
+qvt102|qume qvt 102 product:\
+       :ve=\E.:tc=qvt101:
+qvt103|qume qvt 103:\
+       :am:xn:xo:\
+       :co#80:it#8:li#24:vt#3:\
+       :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bl=^G:\
+       :cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:\
+       :cs=\E[%i%d;%dr:ct=\E[3g:do=^J:ho=\E[H:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :..sa=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+qvt103-w|qume qvt103 132 cols:\
+       :co#132:li#24:\
+       :r2=\E>\E[?3h\E[?4l\E[?5l\E[?8h:tc=qvt103:
+qvt119+|qvt119p|qvt119|qume qvt 119 and 119PLUS terminals:\
+       :am:hs:mi:ms:\
+       :co#80:li#24:sg#0:\
+       :al=\EE:bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E*1:\
+       :cm=\E=%+ %+ :cr=^M:ct=\E3:dc=\EW:dl=\ER:do=^J:\
+       :ds=\Eg\Ef\r:ei=\Er:fs=^M:ho=^^:im=\Eq:\
+       :is=\EDF\EC\EG0\Er\E(\E%EX:k0=^AI\r:k1=^A@\r:\
+       :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+       :k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:kd=^J:kh=^^:kl=^H:\
+       :kr=^L:ku=^K:le=^H:nd=^L:pf=\EA:po=\E@:se=\EG0:sf=^J:\
+       :so=\EG4:sr=\EJ:st=\E1:ta=^I:ts=\Eg\Ef:ue=\EG0:up=^K:\
+       :us=\EG8:vb=\En0\En1:ve=\E.4:vs=\E.2:
+qvt119+-25|qvt119p-25|QVT 119 PLUS with 25 data lines:\
+       :li#25:\
+       :tc=qvt119+:
+qvt119+-w|qvt119p-w|qvt119-w|QVT 119 and 119 PLUS in 132 column mode:\
+       :co#132:\
+       :is=\EDF\EC\EG0\Er\E(\E%\EX\En4:tc=qvt119+:
+qvt119+-25-w|qvt119p-25-w|qvt119-25-w|QVT 119 and 119 PLUS 132 by 25:\
+       :li#25:\
+       :tc=qvt119+:
+qvt203|qvt203+|qume qvt 203 Plus:\
+       :am:xn:xo:\
+       :co#80:it#8:li#24:vt#3:\
+       :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:\
+       :bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:\
+       :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+       :ei=\E[4l:ho=\E[H:im=\E[4h:ip=:k0=\E[29~:k1=\E[17~:\
+       :k2=\E[18~:k3=\E[19~:k4=\E[20~:k5=\E[21~:k6=\E[23~:\
+       :k7=\E[24~:k8=\E[25~:k9=\E[28~:kb=^H:kd=\EOB:\
+       :ke=\E[?1l\E>:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:\
+       :le=^H:mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :..sa=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m:\
+       :sc=\E7:se=\E[m:sf=\n:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+qvt203-w|qvt203-w-am|qume qvt 203 PLUS in 132 cols (w/advanced video):\
+       :co#132:li#24:\
+       :r2=\E>\E[?3h\E[?4l\E[?5l\E[?8h:tc=qvt203:
+#
+#      Since a command is present for enabling 25 data lines,
+#      a specific terminfo entry may be generated for the 203.
+#      If one is desired for the QVT 119 PLUS then 25 lines must
+#      be selected in the status line (setup line 9).
+#
+qvt203-25|QVT 203 PLUS with 25 by 80 column mode:\
+       :co#80:li#25:\
+       :is=\E[=40h\E[?3l:tc=qvt203:
+qvt203-25-w|QVT 203 PLUS with 25 by 132 columns:\
+       :co#132:li#25:\
+       :r2=\E[?3h\E[=40h:tc=qvt203:
+
+#### Televideo (tvi)
+#
+#      TeleVideo
+#      550 East Brokaw Road
+#      PO Box 49048    95161
+#      San Jose CA 95112
+#      Vox: (408)-954-8333
+#      Fax: (408)-954-0623
+#
+#
+# There are some tvi terminals that require incredible amounts of padding and
+# some that don't.  I'm assuming 912 and 920 are the old slow ones,
+# and 912b, 912c, 920b, 920c are the new ones that don't need padding.
+#
+# All of these terminals (912 to 970 and the tvipt) are discontinued.  Newer
+# Televideo terminals are ANSI and PC-ANSI compatible.
+
+tvi803|televideo 803:\
+       :cl=\E*:tc=tvi950:
+
+# Vanilla tvi910 -- W. Gish <cswarren@violet> 10/29/86
+# (tvi910: removed obsolete ":ma=^Kk^Ll^R^L:";
+# mapped ":pt:" to ":it#8:"; added ":ug#0:" for terminfo translation;
+# added khome, cub1, cud1, ind, hpa, vpa, am, msgr from SCO entry -- esr)
+tvi910|televideo model 910:\
+       :am:bs:ms:pt:\
+       :co#80:it#8:li#24:sg#1:ug#0:\
+       :bl=^G:bt=\EI:cd=\EY:ce=\ET:ch=\E]%+ :cl=^Z:\
+       :cm=\E=%+ %+ :cr=^M:cv=\E[%+ :do=^J:ho=\E=\001\001:\
+       :if=/usr/share/tabset/stdcrt:k0=^AI\r:k1=^A@\r:\
+       :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+       :k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:kd=^J:kh=^^:kl=^H:\
+       :kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:sf=^J:so=\EG4:\
+       :ue=\EG0:up=^K:us=\EG8:
+# From: Alan R. Rogers <rogers%albany@csnet-relay>
+# as subsequently hacked over by someone at SCO
+# (tvi910+: removed obsolete ":ma=^K^P^L :"; mapped ":pt:" to ":it#8:";
+# added ":ug#0:" for terminfo translation -- esr)
+tvi910+|910+|televideo 910+:\
+       :am:bs:ms:pt:\
+       :co#80:it#8:li#24:sg#1:ug#0:\
+       :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:ch=\E]%+ :cl=^Z:\
+       :cm=\E=%+ %+ :cr=^M:cv=\E[%+ :dc=\EW:dl=\ER:do=^J:\
+       :ei=:ho=^^:ic=\EQ:if=/usr/share/tabset/stdcrt:im=:\
+       :k0=^A@\r:k1=^AA\r:k2=^AB\r:k3=^AC\r:k4=^AD\r:\
+       :k5=^AE\r:k6=^AF\r:k7=^AG\r:k8=^AH\r:k9=^AI\r:kb=^H:\
+       :kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^M:ll=\E=7 :nd=^L:\
+       :se=\EG0:sf=^J:so=\EG4:ue=\EG0:up=^K:us=\EG8:
+
+# (tvi912: removed obsolete ":ma=^K^P^L :";
+# mapped ":pt:" to default tabs -- esr)
+tvi912|tvi920|old televideo 912:\
+       :am:bs:pt:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=\EE:bl=^G:cd=\Ey:ce=\ET:cl=^Z:cm=\E=%+ %+ :cr=^M:\
+       :ct=\E3:dc=\EW:dl=\ER:do=^J:ei=:ho=^^:ic=\EQ:\
+       :if=/usr/share/tabset/stdcrt:im=:k0=^AI\r:k1=^A@\r:\
+       :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+       :k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:kd=^J:kl=^H:kr=^L:\
+       :ku=^K:le=^H:nd=^L:se=\Ek:sf=^J:so=\Ej:st=\E1:ta=^I:\
+       :ue=\Em:up=^K:us=\El:
+# the 912 has a <funct> key that's like shift: <funct>8 xmits "^A8\r".
+# The 920 has this plus real function keys that xmit different things.
+# Terminfo makes you use the funct key on the 912 but the real keys on the 920.
+tvi912c|tvi912b|912c|912b|tvi|new televideo 912:\
+       :al=\EE:dl=\ER:tc=tvi912:
+# set to page 1 when entering ex (\E-17 )
+# reset to page 0 when exiting ex (\E-07 )
+tvi912-2p|tvi920-2p|912-2p|920-2p|tvi-2p|televideo w/2 pages:\
+       :te=\E-07 :ti=\E-17 :tc=tvi912:
+# We got some new tvi912c terminals that act really weird on the regular 
+# termcap, so one of our gurus worked this up. Seems that cursor 
+# addressing is broken.
+tvi912cc|tvi912 at cowell college:\
+       :cm@:tc=tvi912c:
+
+tvi920b|tvi920c|new televideo 920:\
+       :al=\EE:dl=\ER:k0=^AI\r:k1=^A@\r:k2=^AA\r:k3=^AB\r:\
+       :k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:\
+       :k9=^AH\r:tc=tvi912:
+
+tvi924|televideo tvi924:\
+       :am:bw:hs:in:mi:ms:xn:xo:\
+       :co#80:it#8:li#24:sg#0:ws#80:\
+       :F1=^AK\r:F2=^AL\r:F3=^AM\r:F4=^AN\r:F5=^AO\r:al=\EE:\
+       :bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E*0:cm=\E=%+ %+ :\
+       :cr=^M:cs=\E_%+ %+ :ct=\E3:dc=\EW:dl=\ER:do=^V:\
+       :ds=\Es0:ei=:fs=^Y:ho=^^:\
+       :i1=\017\E%\E'\E(\EDF\EC\EG0\EN0\Es0\Ev0:ic=\EQ:\
+       :if=/usr/lib/tabset/stdcrt:im=:k0=^A@\r:k1=^AA\r:\
+       :k2=^AB\r:k3=^AC\r:k4=^AD\r:k5=^AE\r:k6=^AF\r:\
+       :k7=^AG\r:k8=^AH\r:k9=^AI\r:k;=^AJ\r:kA=\EE:kC=\E*0:\
+       :kD=\EW:kE=\Et:kI=\EQ:kL=\ER:kS=\Ey:kb=^H:kd=^V:\
+       :kh=^^:kl=^H:kr=^L:ku=^K:l0=F1:l1=F2:l2=F3:l3=F4:\
+       :l4=F5:l5=F6:l6=F7:l7=F8:l8=F9:l9=F10:la=F11:le=^H:\
+       :mb=\EG2:me=\EG0:mk=\EG1:nd=^L:pk=\E|%+1%s\031:\
+       :se=\EG0:sf=^J:so=\EG4:sr=\Ej:st=\E1:ta=^I:ts=\Ef:\
+       :ue=\EG0:up=^K:us=\EG8:vb=\Eb\Ed:ve=\E.3:vi=\E.0:\
+       :vs=\E.1:
+tvi924vb|924vb|televideo model 924 visual bells:\
+       :vb=\Eb\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ed:tc=tvi924:
+
+tvi925|925|televideo 925:\
+       :am:bw:hs:ul:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=^Z:\
+       :cm=\E=%+ %+ :cr=^M:ct=\E3:dc=\EW:dl=\ER:do=^V:\
+       :ds=\Eh:ei=:fs=^M\Eg:ho=^^:ic=\EQ:im=:k0=^AI\r:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:kC=^Z:\
+       :kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kS=\EY:kb=^H:kd=^V:\
+       :kh=^^:kl=^H:kr=^L:ku=^K:le=^H:se=\EG0:sf=^J:so=\EG4:\
+       :st=\E1:ta=^I:ts=\Eh\Ef:ue=\EG0:up=^K:us=\EG8:\
+       :vb=\Eb\Ed:ve=\E.4:vs=\E.2:
+tvi925vb|925vb|televideo model 925 visual bells:\
+       :vb=\Eb\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ed:tc=tvi925:
+# Since the 925 uses a character position to store the escape sequences to go
+# in and out of both stand out and underline modes, screen positioning is
+# difficult.  The following 925 entries don't use these modes.
+tvi925n|925n|televideo model 925 no standout or underline:\
+       :se@:so@:ue@:us@:tc=tvi925:
+tvi925vbn|925vbn|televideo model 925 visual bells no so or ul:\
+       :vb=\Eb\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ed:tc=tvi925n:
+
+# From: Tim Curry, Univ. of Central Fla. <duke!ucf-cs!tim> 5/21/82 
+# (tvi925a: removed obsolete ":kn#12:"; mapped ":pt:" to ":it#8:" --esr)
+tvi925a|925a|TeleVideo Model 925:\
+       :am:bs:bw:pt:\
+       :co#80:it#8:li#24:sg#1:ug#1:\
+       :al=\EE:bt=\EI:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :\
+       :dc=\EW:dl=\ER:do=^V:ei=:ic=\EQ:\
+       :if=/usr/share/tabset/std:im=:is=\El:kb=^H:kd=^V:\
+       :kh=^^:kl=^H:kr=^L:ku=^K:nd=^L:se=\EG0:so=\EG4:\
+       :ue=\EG0:up=^K:us=\EG8:\
+       :vb=\Eb\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ed:\
+       :ve=\E.4:vs=\E.2:
+
+# From: Todd Litwin <litwin@litwin.jpl.nasa.gov> 28 May 1993
+# Originally Tim Curry, Univ. of Central Fla., <duke!ucf-cs!tim> 5/21/82
+# for additional capabilities, 
+# The following tvi descriptions from B:pjphar and virus!mike
+# is for all 950s.  It sets the following attributes:
+# full duplex (\EDF)           write protect off (\E()
+# conversation mode (\EC)      graphics mode off (\E%)
+# white on black (\Ed)         auto page flip off (\Ew)
+# turn off status line (\Eg)   clear status line (\Ef\r)
+# normal video (\E0)           monitor mode off (\EX or \Eu)
+# edit mode (\Er)              load blank char to space (\Ee\040)
+# line edit mode (\EO)         enable buffer control (^O)
+# protect mode off (\E\047)    duplex edit keys (\El)
+# program unshifted send key to send line all (\E016)
+# program shifted send key to send line unprotected (\E004)
+# set the following to nulls:
+#      field delimiter (\Ex0\200\200)
+#      line delimiter (\Ex1\200\200)
+#      start-protected field delimiter (\Ex2\200\200)
+#      end-protected field delimiter (\Ex3\200\200)
+# set end of text delimiter to carriage return/null (\Ex4\r\200)
+# (tvi950: early versions had ":ko=ic,dc,al,dl,cl,bt,ce,cd:"
+# and ":ma=^Vj^Kk^Hh^Ll^^H:". I mapped ":pt:" to ":it#8:";
+#
+tvi950|950|televideo950:\
+       :am:bs:hs:mi:ms:pt:xn:xo:\
+       :co#80:li#24:sg#1:ug#1:\
+       :ac=d\rc\014e\nb\011i\013:ae=^X:al=\EE:as=^U:bl=^G:\
+       :bt=\EI:cd=\Ey:ce=\Et:cl=\E*:cm=\E=%+ %+ :cr=^M:\
+       :ct=\E3:dc=\EW:dl=\ER:do=^J:ds=\Eg\Ef\r:ei=\Er:fs=^M:\
+       :ho=^^:im=\Eq:\
+       :is=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\El\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\Ef\r:\
+       :k0=^A0\r:k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:\
+       :k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:\
+       :kB=\EI:kC=\E*:kD=\EW:kE=\Et:kL=\ER:kS=\Ey:kb=^H:\
+       :kd=^V:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:pf=\Ea:\
+       :po=\E`:se=\EG0:sf=^J:so=\EG4:sr=\Ej:st=\E1:ta=^I:\
+       :ts=\Eg\Ef:ue=\EG0:up=^K:us=\EG8:\
+       :vb=\Eb\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ed:
+#
+# is for 950 with two pages adds the following:
+#      set 48 line page (\E\\2)
+#      place cursor at page 0, line 24, column 1 (\E-07 )
+#      set local (no send) edit keys (\Ek)
+#
+# two page 950 adds the following:
+#      when entering ex, set 24 line page (\E\\1)
+#      when exiting ex, reset 48 line page (\E\\2)
+#                       place cursor at 0,24,1 (\E-07 )
+#      set duplex (send) edit keys (\El) when entering vi
+#      set local (no send) edit keys (\Ek) when exiting vi
+#
+tvi950-2p|950-2p|televideo950 w/2 pages:\
+       :is=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\Ek\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\E\\2\E-07 \011:\
+       :ke=\Ek:ks=\El:te=\E\\2\E-07 :ti=\E\\1\E-07 :tc=tvi950:
+#
+# is for 950 with four pages adds the following:
+#      set 96 line page (\E\\3)
+#      place cursor at page 0, line 24, column 1 (\E-07 )
+#
+# four page 950 adds the following:
+#      when entering ex, set 24 line page (\E\\1)
+#      when exiting ex, reset 96 line page (\E\\3)
+#                       place cursor at 0,24,1 (\E-07 )
+#
+tvi950-4p|950-4p|televideo950 w/4 pages:\
+       :is=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\Ek\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\E\\3\E-07 \011:\
+       :ke=\Ek:ks=\El:te=\E\\3\E-07 :ti=\E\\1\E-07 :tc=tvi950:
+#
+# is for reverse video 950 changes the following:
+#      set reverse video (\Ed)
+#
+# set vb accordingly (\Ed ...nulls... \Eb)
+#
+tvi950-rv|950-rv|televideo950 rev video:\
+       :is=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\El\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200:\
+       :vb=\Ed\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Eb:tc=tvi950:
+#
+# uses the appropriate entries from 950-2p and 950-rv
+#
+tvi950-rv-2p|950-rv-2p|televideo950 rev video w/2 pages:\
+       :is=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\Ek\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\E\\2\E-07 :\
+       :ke=\Ek:ks=\El:te=\E\\2\E-07 :ti=\E\\1\E-07 :\
+       :vb=\Ed\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Eb:tc=tvi950:
+#
+# uses the appropriate entries from 950-4p and 950-rv
+#
+tvi950-rv-4p|950-rv-4p|televideo950 rev video w/4 pages:\
+       :is=\EDF\EC\Eb\EG0\Er\EO\E'\E(\E%\Ew\EX\Ee \017\011\Ek\E016\E004\Ex0\200\200\Ex1\200\200\Ex2\200\200\011\Ex3\200\200\Ex4\r\200\E\\3\E-07 :\
+       :ke=\Ek:ks=\El:te=\E\\3\E-07 :ti=\E\\1\E-07 :\
+       :vb=\Ed\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Eb:tc=tvi950:
+# From: Andreas Stolcke <stolcke@icsi.berkeley.edu>
+# (tvi955: removed obsolete ":ko=ic,dc,al,dl,cl,bt,ce,cd:ma:=^Vj^Kk^Hh^Ll^^H";
+# mapped ":pt:" to ":it#8:"; removed incorrect (and overridden) ":do=^J:";
+# fixed broken continuations in the :rs: string -- esr)
+tvi955|televideo955:\
+       :5i:am:bs:hs:mi:pt:xn:xo:\
+       :co#80:it#8:li#24:\
+       :RA=\E[=7l:RX=^N:SA=\E[=7h:SX=^O:\
+       :ac=0_`RjHkGlFmEnIoPqKsQtMuLvOwNxJ:ae=\E%:al=\EE:\
+       :as=\E$:bt=\EI:cd=\Ey:ce=\Et:cl=\E*:cm=\E=%+ %+ :\
+       :ct=\E3:dc=\EW:dl=\ER:do=^V:ds=\Eg\Ef\r:ei=\Er:fs=^M:\
+       :ho=^^:im=\Eq:is=\E[=3l\EF1\Ed\EG0\E[=5l\E%\El:\
+       :k0=^A0\r:k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:\
+       :k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:\
+       :kB=\EI:kC=\EY:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kM=\EQ:\
+       :kN=\EK:kP=\EJ:kT=\E1:ka=\E3:kb=^H:kd=^V:kh=^^:kl=^H:\
+       :kr=^L:kt=\E2:ku=^K:le=^H:mb=\EG2:me=\EG0\E[=5l:\
+       :mh=\E[=5h:mk=\EG1:mr=\EG4:nd=^L:pf=\Ea:po=\E`:\
+       :ps=\EP:\
+       :rs=\EDF\EC\Eg\Er\EO\E'\E(\Ew\EX\Ee \017\E0P\E6\200\E0p\E4\200\Ef\r:\
+       :se=\EG0:so=\EG4:sr=\Ej:st=\E1:ts=\Eg\Ef:ue=\EG0:\
+       :up=^K:us=\EG8:\
+       :vb=\Eb\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ed:\
+       :ve=\E.2:vi=\E.0:vs=\E.1:
+tvi955-w|955-w|televideo955 w/132 cols:\
+       :co#132:\
+       :cm=\E[%i%d;%dH:is=\E[=3h\EF1\Ed\EG0\E[=5l\E%\El:tc=tvi955:
+# use half-intensity as normal mode, full intensity as bold (md)
+tvi955-hb|955-hb|televideo955 half-bright:\
+       :is=\E[=3l\EF1\Ed\EG0\E[=5h\E%\El:md=\E[=5l:\
+       :me=\EG0\E[=5h:mh@:tc=tvi955:
+# From: Humberto Appleton <beto@cs.utexas.edu>, 880521 UT Austin
+# (tvi970: removed ":sg#0:"; mapped ":pt:" to ":it#8:" -- esr)
+tvi970|televideo970:\
+       :bs:da:db:mi:ms:pt:\
+       :co#80:it#8:li#24:\
+       :ae=\E(B:al=\E[L:as=\E(B:bt=\E[Z:cd=\E[0J:ce=\E[0K:\
+       :cl=\E[H\E[2J:cm=\E[%i%d;%df:dc=\E[P:dl=\E[M:do=\ED:\
+       :ei=\E[4l:im=\E[4h:\
+       :is=\E<\E[?21l\E[19h\E[1Q\E[10l\E[7l\E[H\E[2J:\
+       :k1=\E?a:k2=\E?b:k3=\E?c:k4=\E?d:k5=\E?e:k6=\E?f:\
+       :k7=\E?g:k8=\E?h:k9=\E?i:kb=^H:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:nd=\E[C:se=\E[0m:so=\E[7m:\
+       :sr=\EM:ue=\E[0m:up=\EM:us=\E[4m:\
+       :vb=\E[5;m\200\200\200\200\200\200\200\200\200\E[0;m:\
+       :vs=\E[1Q:
+# From Gene Rochlin <armsis@amber> 9/19/84. 
+# Works with vi and rogue.  NOTE: Esc v sets autowrap on, Esc u sets 80 chars
+# per line (rather than 40), Esc K chooses the normal character set.  Not sure
+# padding is needed, but adapted from the tvi920c termcap.  The :so: and :us:
+# strings are klutzy, but at least use no screen space.
+# (tvipt: removed obsolete ":ma=^Kk^Ll^R^L:" -- esr)
+tvipt|televideopt:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\EE<5*>:bt=\EI:ce=\ET:cl=^Z:cm=\E=%+ %+ :\
+       :dl=\ER<5*>:ho=^^:if=/usr/share/tabset/stdcrt:\
+       :is=\Ev\Eu\EK:kb=^H:kd=^J:kl=^H:kr=^L:ku=^K:nd=^L:\
+       :se=\EF:so=\EG1@A\EH:ue=\EF:up=^K:us=\EG1B@\EH:
+
+#### Visual (vi)
+#
+
+# (vi50: mapped ":pt:" to default 8-char tabs -- esr)
+vi50|visual 50:\
+       :am:bs:ms:pt:\
+       :co#80:li#24:\
+       :al=\EL:bl=^G:cd=\Ek:ce=\EK:cl=^Z:cm=\E=%+ %+ :cr=^M:\
+       :dl=\EM:do=^J:ho=\EH:kb=^H:kd=\EB:kh=\EH:kl=\ED:\
+       :kr=\EC:ku=\EA:le=^H:nd=^L:se=\ET:sf=^J:so=\EU:ta=^I:\
+       :up=^K:
+# From: Jeff Siegal <jbs@athena.mit.edu>
+# (vi55: mapped ":pt:" to ":it#8:" -- esr)
+vi55|Visual 55:\
+       :am:bs:mi:ms:pt:\
+       :co#80:it#8:li#24:\
+       :al=\EL:cd=\EJ:ce=\EK:cl=\Ev:cm=\EY%+ %+ :\
+       :cs=\E_%+A%+A:dc=\Ew:dl=\EM:do=^J:ei=\Eb:ho=\EH:\
+       :im=\Ea:is=\Ev\E_AX\Eb\EW\E9P\ET:kb=^H:kd=\EB:kl=\ED:\
+       :kr=\EC:ku=\EA:le=^H:nd=\EC:se=\ET:so=\EU:sr=\EI:\
+       :up=\EA:
+
+# The Visual 200 beeps when you type a character in insert mode.
+# This is a horribly obnoxious misfeature, and some of the entries
+# below try to get around the problem by ignoring the feature or
+# turning it off when inputting a character.  They are said not to
+# work well at 300 baud.  (You could always cut the wire to the bell!)
+# From: <mike@brl-vgr> Mon Nov 14 08:34:29 1983
+# (vi200: mapped ":pt:" to default 8-char tabbing -- esr)
+vi200|vis200|visual 200 with function keys:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :al=\EL:bl=^G:cd=\Ey:ce=\Ex:cl=\Ev:cm=\EY%+ %+ :\
+       :cr=^M:dc=\EO:dl=\EM:do=^J:ei=:ho=\EH:ic=\Ei \010\Ej:\
+       :im=:is=\E3\Eb\Ej\E\\\El\EG\Ec\Ek:k0=\EP:k1=\EQ:\
+       :k2=\ER:k3=\E :k4=\E!:k5=\E":k6=\E#:k7=\E$:k8=\E%:\
+       :k9=\E&:kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:\
+       :nd=\EC:se=\E3:sf=^J:so=\E4:sr=\EI:ta=^I:up=\EA:\
+       :ve=\Ec:vs=\Ed:
+vi200-rv-ic|visual 200 reverse video using insert char:\
+       :ei=\Ej:ic@:im=\Ei:tc=vi200-rv:
+# The older Visuals didn't come with function keys. This entry uses
+# ks and ke so that the keypad keys can be used as function keys.
+# If your version of vi doesn't support function keys you may want
+# to use vi200-f.
+# (vi200: mapped ":pt:" to ":it#8:" -- esr)
+vi200-f|visual|visual 200 no function keys:\
+       :am:bs:pt:\
+       :co#80:it#8:li#24:\
+       :al=\EL:bl=^G:cd=\Ey:ce=\Ex:cl=\Ev:cm=\EY%+ %+ :\
+       :cr=^M:dc=\EO:dl=\EM:do=^J:ei=:ho=\EH:ic=\Ei \010\Ej:\
+       :im=:is=\E3\Eb\Ej\E\\\El\EG\Ed\Ek:k0=\E?p:k1=\E?q:\
+       :k2=\E?r:k3=\E?s:k4=\E?t:k5=\E?u:k6=\E?v:k7=\E?w:\
+       :k8=\E?x:k9=\E?y:kd=\EB:ke=\E>:kh=\EH:kl=\ED:kr=\EC:\
+       :ks=\E=:ku=\EA:le=^H:nd=\EC:sf=^J:sr=\EI:ta=^I:\
+       :up=\EA:ve=\Ec:vs=\Ed:
+vi200-rv|visual 200 reverse video:\
+       :se=\E3:so=\E4:sr@:ve@:vs@:tc=vi200:
+vi200-ic|visual 200 using insert char:\
+       :ei=\Ej:ic@:im=\Ei:tc=vi200:
+
+# the function keys are programmable but we don't reprogram
+# them to their default values with "is" because programming
+# them is very verbose. maybe an "if" file should be made for
+# the 300 and they could be stuck in it.
+vi300|visual 300 ansi x3.64:\
+       :am:bw:mi:xn:\
+       :co#80:li#24:\
+       :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=\E[B:\
+       :ei=\E[4l:ho=\E[H:im=\E[4h:\
+       :is=\E[7s\E[2;3;4;20;?5;?6l\E[12;?7h\E[1Q\E[0;1(D\E[8s:\
+       :k1=\E_A\E\\:k2=\E_B\E\\:k3=\E_C\E\\:k4=\E_D\E\\:\
+       :k5=\E_E\E\\:k6=\E_F\E\\:k7=\E_G\E\\:k8=\E_H\E\\:\
+       :k9=\E_I\E\\:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:\
+       :le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[1m:sr=\EM:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+vi300-rv|visual 300 reverse video:\
+       :bl=^G:cr=^M:do=^J:\
+       :is=\E[7s\E[2;3;4;20;?6l\E[12;?5;?7h\E[1Q\E[0;1(D\E[8s:\
+       :sf=^J:tc=vi300:
+# slow scroll doesn't work that well; if you type on the
+# keyboard while the terminal is scrolling it drops characters
+vi300-ss|visual 300 slow scroll:\
+       :bl=^G:cr=^M:do=^J:sf=^J:ve=\E[?4h:vs=\E[?4l:tc=vi300:
+# some of the vi300s have older firmware that has the command
+# sequence for setting editing extent reversed.
+ovi300|visual 300 old:\
+       :bl=^G:cr=^M:do=^J:\
+       :is=\E[7s\E[2;3;4;20;?5;?6l\E[12;?7h\E[2Q\E[0;1(D\E[8s:\
+       :sf=^J:tc=vi300:
+# if your version of ex/vi doesn't correctly implement xn
+# use this termcap for the vi300
+vi300-aw|visual 300 no autowrap:\
+       :am@:xn@:\
+       :ve=\E[?7h:vs=\E[?7l:tc=vi300:
+
+# the visual 550 is a visual 300 with tektronix graphics,
+# and with 33 lines. clear screen is modified here to
+# also clear the graphics.
+vi550|visual 550 ansi x3.64:\
+       :li#33:\
+       :bl=^G:cl=\030\E[H\E[2J:cr=^M:do=^J:sf=^J:tc=vi300:
+
+# (vi603: this had ":sb=\EM:"; sb is undefined, prob. an error for sr -- esr)
+vi603|visual603|visual 603:\
+       :hs:mi:\
+       :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+       :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:\
+       :ds=\EP2;1~\E\\:ei=\E[4l:fs=\E\\:im=\E[4h:\
+       :is=\E>\E[?3l\E[?4l\E[?7h\E[?8h\E[1;24r\E[24;1H:\
+       :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:\
+       :rs=\E>\E[?3l\E[?4l\E[?7h\E[?8h:se=\E[27m:sf=\ED:\
+       :so=\E[7m:sr=\EM:ts=\EP2~:ue=\E[24m:up=\E[A:us=\E[4m:tc=vt100:
+
+#### Wyse (wy)
+#
+#      Wyse Technology
+#      3471 North First Street
+#      San Jose, CA 95134
+#      Vox: (408)-473-1200
+#      Fax: (408) 473-1222
+#
+# Wyse sales can be reached by phone at 1-800-GET-WYSE.  Tech support is at
+# (800)-800-WYSE (option 5 gets you a human).
+#
+# All the following entries until (but not including) wy100q are direct from
+# Wyse technical support and represent their best knowledge as of January 1995.
+# I made two trivial syntax fixes in the wyse30 entry, added OTbs everywhere
+# needed, and merged in OTug#1 entries (as indicated by the termcap version of
+# their descriptions).
+#
+# Note: The wyse75, wyse85, and wyse99 have been discontinued.
+
+#         Although the Wyse 30 can support more than one attribute
+#      it requires magic cookies to do so.  Many applications do not
+#      function well with magic cookies.  The following terminfo uses
+#      the protect mode to support one attribute (dim) without cookies.
+#      If more than one attribute is needed then the wy30-mc terminfo
+#      should be used.
+#
+wy30|wyse30|Wyse 30:\
+       :5i:am:bs:bw:hs:mi:ms:xo:\
+       :Nl#8:co#80:lh#1:li#24:lw#8:ma#1:ug#1:ws#45:\
+       :#2=\E{:&3=\Er:@8=\E7:LF=\EA11:LO=\EA10:\
+       :ac=0wa_h[jukslrmqnxqzttuyv]wpxv:ae=\EH^C:al=\EE:\
+       :as=\EH^B:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=\E+:\
+       :cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:do=^J:\
+       :ds=\EF\r:ei=\Er:fs=^M:ho=^^:im=\Eq:ip=:\
+       :is=\E'\E(\E^3\E`9\016\024:k1=^A@\r:k2=^AA\r:\
+       :k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:\
+       :k8=^AG\r:kA=\EE:kB=\EI:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:\
+       :kN=\EK:kP=\EJ:kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:\
+       :ku=^K:le=^H:ll=^^^K:me=\E(\EH\003:mh=\E`7\E):\
+       :mp=\E`7\E):nd=^L:nw=^M^J:pf=^T:pn=\Ez%+/%s\r:po=^X:\
+       :ps=\EP:px=\Ez%+?%s\177:\
+       :..sa=%?%p1%p5%p8%|%|%t\E`7\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;:\
+       :se=\E(:sf=\n:so=\E`7\E):sr=\Ej:st=\E1:ta=\011:\
+       :ts=\EF:up=^K:ve=\E`1:vi=\E`0:
+#
+#      This terminal description uses the non-hidden attribute mode
+#      (with magic cookie).
+#
+wy30-mc|wyse30-mc|wyse 30 with magic cookies:\
+       :ms@:\
+       :ma@:sg#1:ug#1:\
+       :ae=\EG0\EH\003:as=\EG0\EH\002:mb=\EG2:\
+       :me=\EG0\E(\EH\003:mh=\EGp:mk=\EG1:mp=\EG0\E):\
+       :mr=\EG4:\
+       :..sa=\EG%'0'%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c%?%p8%t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;:\
+       :se=\EG0:so=\EG4:te=\EG0:ue=\EG0:us=\EG8:tc=wy30:
+#      The manditorary pause used by flash does not work with
+#      older versions of terminfo.  If you see this effect then
+#      unset xon and delete the / from the delay.
+#      i.e. change $<100/> to $<100>
+wy30-vb|wyse30-vb|wyse 30 visible bell:\
+       :vb=\E`8\E`9:tc=wy30:
+#
+#         The Wyse 50 can support one attribute (e.g. Dim, Inverse,
+#      Normal) without magic cookies by using the protect mode.
+#      The following description uses this feature, but when more
+#      than one attribute is put on the screen at once, all attributes
+#      will be changed to be the same as the last attribute given.
+#         The Wyse 50 can support more attributes when used with magic
+#      cookies.  The wy50-mc terminal description uses magic cookies
+#      to correctly handle multiple attributes on a screen.
+#
+wy50|wyse50|Wyse 50:\
+       :5i:am:bs:bw:hs:mi:ms:xo:\
+       :Nl#8:co#80:lh#1:li#24:lw#8:ma#1:ws#45:\
+       :#2=\E{:%9=\EP:&3=\Er:@8=\E7:F1=^AJ\r:F2=^AK\r:\
+       :F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:LF=\EA11:\
+       :LO=\EA10:ac=0wa_h[jukslrmqnxqzttuyv]wpxv:ae=\EH^C:\
+       :al=\EE:as=\EH^B:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=\E+:\
+       :cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:do=^J:\
+       :ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\E`\072\E`9:im=\Eq:\
+       :ip=:is=\016\024\E'\E(:k1=^A@\r:k2=^AA\r:k3=^AB\r:\
+       :k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:\
+       :k9=^AH\r:k;=^AI\r:kA=\EE:kB=\EI:kD=\EW:kE=\ET:\
+       :kI=\EQ:kL=\ER:kN=\EK:kP=\EJ:kS=\EY:kb=^H:kd=^J:\
+       :kh=^^:kl=^H:kr=^L:ku=^K:le=^H:ll=^^^K:me=\E(\EH\003:\
+       :mh=\E`7\E):mp=\E`7\E):mr=\E`6\E):nd=^L:nw=^M^J:\
+       :pf=^T:pn=\Ez%+/%s\r:po=^X:ps=\EP:px=\Ez%+?%s\177:\
+       :..sa=%?%p1%p3%|%t\E`6\E)\n%e%p5%p8%|%t\E`7\E)%e\E(%;\n%?%p9%t\EH\002%e\EH\003%;:\
+       :se=\E(:sf=\n:so=\E`6\E):sr=\Ej:st=\E1:ta=^I:ts=\EF:\
+       :up=^K:ve=\E`1:vi=\E`0:
+#
+#      This terminal description uses the non-hidden attribute mode
+#      (with magic cookie).
+#
+wy50-mc|wyse50-mc|wyse 50 with magic cookies:\
+       :ms@:\
+       :ma@:sg#1:ug#1:\
+       :ae=\EG0\EH\003:as=\EG0\EH\002:mb=\EG2:\
+       :me=\EG0\E(\EH\003:mh=\EGp:mk=\EG1:mp=\EG0\E):\
+       :mr=\EG4:\
+       :..sa=\EG%'0'%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c%?%p8%t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;:\
+       :se=\EG0:so=\EGt:te=\EG0:ue=\EG0:us=\EG8:tc=wy50:
+#      The mandatory pause used by flash does not work with
+#      older versions of terminfo.  If you see this effect then
+#      unset xon and delete the / from the delay.
+#      i.e. change $<100/> to $<100>
+wy50-vb|wyse50-vb|wyse 50 visible bell:\
+       :vb=\E`8\E`9:tc=wy50:
+wy50-w|wyse50-w|wyse 50 132-column:\
+       :Nl#16:co#132:lw#7:ws#97:\
+       :cm=\Ea%i%dR%dC:dc=\EW:i1=\E`;\E`9:tc=wy50:
+wy50-wvb|wyse50-wvb|wyse 50 132-column visible bell:\
+       :vb=\E`8\E`9:tc=wy50-w:
+#
+#      The Wyse 350 is a Wyse 50 with color.
+#      Unfortunately this means that it has magic cookies.
+#      The color attributes are designed to overlap the reverse, dim and
+#      underline attributes.  This is nice for monochrome applications
+#      because you can make underline stuff green (or any other color)
+#      but for true color applications it's not so hot because you cannot
+#      mix color with reverse, dim or underline.
+#          To further complicate things one of the attributes must be
+#      black (either the foreground or the background).  In reverse video
+#      the background changes color with black letters.  In normal video
+#      the foreground changes colors on a black background.  
+#          This terminfo uses some of the more advanced features of curses
+#      to display both color and blink.  In the final analysis I am not
+#      sure that the wy350 runs better with this terminfo than it does
+#      with the wy50 terminfo (with user adjusted colors).
+#
+wy350|wyse350|Wyse 350:\
+       :5i:am:bs:bw:hs:mi:xo:\
+       :Co#8:NC#55:Nl#8:co#80:lh#1:li#24:lw#8:pa#8:sg#1:\
+       :ug#1:ws#45:\
+       :#2=\E{:%9=\EP:&3=\Er:@8=\E7:F1=^AJ\r:F2=^AK\r:\
+       :F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:LF=\EA11:\
+       :LO=\EA10:Sb= :\
+       :..Sf=%?%p1%{0}%=%t%{76}\n%e%p1%{1}%=%t%{64}\n%e%p1%{2}%=%t%{8}\n%e%p1%{3}%=%t%{72}\n%e%p1%{4}%=%t%{4}\n%e%p1%{5}%=%t%{68}\n%e%p1%{6}%=%t%{12}\n%e%p1%{7}%=%t%{0}\n%;%PC\n\EG%gC%gA%+%'0'%+%c:\
+       :ac=0wa_h[jukslrmqnxqzttuyv]wpxv:ae=\EG0\EH\003:\
+       :al=\EE:as=\EG0\EH\002:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :cl=\E+:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:\
+       :do=^J:ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\E`\072\E`9:\
+       :i2=\E%?:im=\Eq:ip=:is=\016\024\E'\E(:k1=^A@\r:\
+       :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+       :k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:kB=\EI:\
+       :kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kN=\EK:kP=\EJ:kS=\EY:\
+       :kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:ll=^^^K:\
+       :mb=\EG2:me=\EG0\E(\EH\003%{0}%PA%{0}%PC:mh=\EGp:\
+       :mk=\EG1:mp=\EG0\E):mr=\EG4:nd=^L:nw=^M^J:oc=\E%?:\
+       :op=\EG0:pf=^T:pn=\Ez%+/%s\r:po=^X:ps=\EP:\
+       :px=\Ez%+?%s\177:\
+       :..sa=%{0}%?%p4%t%{2}%|%;\n%?%p7%t%{1}%|%;%PA\n\EG%?%gC%t%gC%e\n%{0}%?%p1%t%{4}%|%;\n%?%p2%t%{8}%|%;\n%?%p3%t%{4}%|%;\n%?%p5%t%{64}%|%;\n%;%gA%+%'0'%+%c\n%?%p8%t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;:\
+       :se=\EG0:sf=\n:so=\EG4:sr=\Ej:st=\E1:ta=^I:ts=\EF:\
+       :ue=\EG0:up=^K:us=\EG8:ve=\E`1:vi=\E`0:
+#      The manditorary pause used by flash does not work with
+#      older versions of terminfo.  If you see this effect then
+#      unset xon and delete the / from the delay.
+#      i.e. change $<100/> to $<100>
+wy350-vb|wyse350-vb|wyse 350 visible bell:\
+       :vb=\E`8\E`9:tc=wy350:
+wy350-w|wyse350-w|wyse 350 132-column:\
+       :Nl#16:co#132:lw#7:ws#97:\
+       :cm=\Ea%i%dR%dC:dc=\EW:i1=\E`;\E`9:tc=wy350:
+wy350-wvb|wyse350-wvb|wyse 350 132-column visible bell:\
+       :vb=\E`8\E`9:tc=wy350-w:
+#
+#      This terminfo description is untested.
+#
+wy100|wyse 100:\
+       :hs:mi:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=\E;:cm=\E=%+ %+ :\
+       :cr=^M:dc=\EW:dl=\ER:do=^J:ds=\EA31:ei=\Er:fs=^M:\
+       :im=\Eq:is=\Eu\E0:k1=^A@\r:k2=^AA\r:k3=^AB\r:\
+       :k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:kb=^H:\
+       :kd=^J:kh=\E{:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:\
+       :sf=^J:so=\EG4:ts=\EF:ue=\EG0:up=^K:us=\EG8:
+#
+#      The Wyse 120/150 has most of the features of the Wyse 60.
+#
+#      This terminal does not need padding up to 9600 baud!
+#
+#      (msgr) should be set but the clear screen fails when in
+#      alt-charset mode.  Try \EcE  \E+  if the screen is really clear
+#      then set msgr.
+#
+wy120|wyse120|wy150|wyse150|Wyse 120/150:\
+       :5i:am:bs:bw:hs:km:mi:ms:xo:\
+       :Nl#8:co#80:it#8:lh#1:li#24:lw#8:pb#9601:ws#45:\
+       :#2=\E{:%9=\EP:&3=\Er:@8=\E7:F1=^AJ\r:F2=^AK\r:\
+       :F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:LF=\EA11:\
+       :LO=\EA10:RA=\Ed.:RX=\Ec20:SA=\Ed/:SX=\Ec21\ntbc=\E0:\
+       :ac=+/\\\054.0[Iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~:\
+       :ae=\EcD:al=\EE:as=\EcE:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :cl=\E+:cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:\
+       :ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\EcB0\EcC1:\
+       :i2=\EwJ\Ew1:im=\Eq:ip=:\
+       :is=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024\El:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:\
+       :kB=\EI:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kN=\EK:kP=\EJ:\
+       :kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:\
+       :ll=^^^K:mb=\EG2:me=\E(\EH\003\EG0\EcD:mh=\EGp:\
+       :mk=\EG1:mp=\E):mr=\EG4:nd=^L:nw=\r\n:pf=^T:\
+       :pl=\EZ2%+?%s\177:pn=\Ez%+/%s\r:po=\Ed#:ps=\EP:\
+       :px=\EZ1%+?%s\177:r1=\E~!\E~4:r2=\EeF\E`\072:\
+       :r3=\EwG\Ee(:\
+       :..sa=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%'0'%?%p2%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c:\
+       :se=\EG0:sf=\n:so=\EGt:sr=\Ej:st=\E1:ta=\011:te=\Ew1:\
+       :ti=\Ew0:ts=\EF:ue=\EG0:up=^K:us=\EG8:ve=\E`1:\
+       :vi=\E`0:
+#
+wy120-w|wyse120-w|wy150-w|wyse150-w|wyse 120/150 132-column:\
+       :Nl#16:co#132:lw#7:ws#97:\
+       :cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\E`;:tc=wy120:
+#
+wy120-25|wyse120-25|wy150-25|wyse150-25|wyse 120/150 80-column 25-lines:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy120:
+#
+wy120-25-w|wyse120-25-w|wy150-25-w|wyse150-25-w|wyse 120/150 132-column 25-lines:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy120-w:
+#
+wy120-vb|wyse120-vb|wy150-vb|wyse150-vb|Wyse 120/150 visible bell:\
+       :vb=\E`8\E`9:tc=wy120:
+#
+wy120-w-vb|wy120-wvb|wyse120-wvb|wy150-w-vb|wyse150-w-vb|Wyse 120/150 132-column visible bell:\
+       :vb=\E`8\E`9:tc=wy120-w:
+#
+#      The Wyse 60 is like the Wyse 50 but with more padding.
+#      The reset strings are slow and the pad times very depending
+#      on other parameters such as font loading.  I have tried
+#      to follow the following outline:
+#              rs1 -> set personality
+#              rs2 -> set number of columns
+#              rs3 -> set number of lines
+#              is1 -> select the proper font
+#              is2 -> do the initialization
+#              is3 -> set up display memory (2 pages)
+#
+#      The Wyse 60's that have vt100 emulation are slower than the
+#      older Wyse 60's.  This change happened mid-1987.
+#      The capabilities effected are (dch1) (dl1) (il1) (ind) (ri)
+#
+#      The meta key is only half right.  This terminal will return the
+#      high order bit set when you hit CTRL-function_key
+#
+#      It may be useful to assign two function keys with the
+#      values  \E=(\s  look at old data in page 1
+#              \E=W,   look at bottem of page 1
+#      where \s is a space ( ).
+#
+#      Note:
+#         The Wyse 60 runs faster when the XON/XOFF
+#         handshake is turned off.
+#
+wy60|wyse60|Wyse 60:\
+       :5i:am:bs:bw:hs:km:mi:ms:\
+       :Nl#8:co#80:lh#1:li#24:lw#8:ws#45:\
+       :#2=\E{:%9=\EP:&3=\Er:@8=\E7:DK=\E`b:F1=^AJ\r:\
+       :F2=^AK\r:F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:\
+       :LF=\EA11:LO=\EA10:RA=\Ed.:RC=\E`c:RX=\Ec20:SA=\Ed/:\
+       :SX=\Ec21:\
+       :ac=+/\\\054.0[Iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~:\
+       :ae=\EcD:al=\EE:as=\EcE:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :cl=\E+:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:\
+       :do=^J:ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\EcB0\EcC1:\
+       :i2=\EwJ\Ew1:im=\Eq:ip=:\
+       :is=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024\El:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:\
+       :kB=\EI:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kN=\EK:kP=\EJ:\
+       :kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:\
+       :ll=^^^K:mb=\EG2:me=\E(\EH\003\EG0\EcD:mh=\EGp:\
+       :mk=\EG1:mp=\E):mr=\EG4:nd=^L:nw=\r\n:pf=^T:\
+       :pl=\EZ2%+?%s\177:pn=\Ez%+/%s\r:po=\Ed#:ps=\EP:\
+       :px=\EZ1%+?%s\177:r1=\E~!\E~4:r2=\EeG:r3=\EwG\Ee(:\
+       :..sa=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%'0'%?%p2%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c:\
+       :se=\EG0:sf=\n:so=\EGt:sr=\Ej:st=\E1:ta=\011:te=\Ew1:\
+       :ti=\Ew0:ts=\EF:ue=\EG0:up=^K:us=\EG8:ve=\E`1:\
+       :vi=\E`0:
+#
+wy60-w|wyse60-w|wyse 60 132-column:\
+       :Nl#16:co#132:lw#7:ws#97:\
+       :cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\EeF\E`;:tc=wy60:
+#
+wy60-25|wyse60-25|wyse 60 80-column 25-lines:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy60:
+wy60-25-w|wyse60-25-w|wyse 60 132-column 25-lines:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy60-w:
+#
+wy60-42|wyse60-42|wyse 60 80-column 42-lines:\
+       :li#42:\
+       :al=\EE:cd=\Ey:cl=\E+:cm=\E=%+ %+ :dc=\EW:dl=\ER:\
+       :i1=\EcB2\EcC3:ip=:nw=\r\n:r3=\Ee*:sf=\n:sr=\Ej:tc=wy60:
+wy60-42-w|wyse60-42-w|wyse 60 132-column 42-lines:\
+       :Nl#16:co#132:lw#7:ws#97:\
+       :cd=\Ey:cl=\E+:cm=\Ea%i%dR%dC:dc=\EW:ho=\036:ip=:\
+       :nw=\r\n:r2=\EeF\E`;:tc=wy60-42:
+#
+wy60-43|wyse60-43|wyse 60 80-column 43-lines:\
+       :Nl@:lh@:li#43:lw@:\
+       :pn@:r3=\Ee+:tc=wy60-42:
+wy60-43-w|wyse60-43-w|wyse 60 132-column 43-lines:\
+       :Nl@:lh@:li#43:lw@:\
+       :pn@:r3=\Ee+:tc=wy60-42-w:
+#
+wy60-vb|wyse60-vb|Wyse 60 visible bell:\
+       :vb=\E`8\E`9:tc=wy60:
+wy60-w-vb|wy60-wvb|wyse60-wvb|Wyse 60 132-column visible bell:\
+       :vb=\E`8\E`9:tc=wy60-w:
+
+#      The Wyse-99GT looks at lot like the Wyse 60 except that it
+#      does not have the 42/43 line mode.  In the Wyse-60 the "lines"
+#      setup parameter controls the number of lines on the screen.
+#      For the Wyse 99GT the "lines" setup parameter controls the
+#      number of lines in a page.  The screen can display 25 lines max.
+#          The Wyse-99GT also has personalities for the VT220 and
+#      Tektronix 4014.  But this has no bearing on the native mode.
+#
+#      (msgr) should be set but the clear screen fails when in
+#      alt-charset mode.  Try \EcE  \E+  if the screen is really clear
+#      then set msgr, else use msgr@.
+#
+#      u0 -> enter Tektronix mode
+#      u1 -> exit Tektronix mode
+#
+wy99gt|wyse99gt|Wyse 99gt:\
+       :ms@:\
+       :al=\EE:cd=\Ey:ce=\Et:cl=\E+:dc=\EW:dl=\ER:i2=\Ew0:\
+       :ip=:nw@:r2=\E`\072:sf=\n:sr=\Ej:ta=\011:te=\Ew0:\
+       :ti=\Ew1:u0=\E~>\E8:u1=\E[42h:tc=wy60:
+#
+wy99gt-w|wyse99gt-w|wyse 99gt 132-column:\
+       :Nl#16:co#132:lw#7:ws#97:\
+       :cd=\Ey:cl=\E+:cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\E`;:tc=wy99gt:
+#
+wy99gt-25|wyse99gt-25|wyse 99gt 80-column 25-lines:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r2=\E`\072:r3=\EwG\Ee):tc=wy99gt:
+#
+wy99gt-25-w|wyse99gt-25-w|wyse 99gt 132-column 25-lines:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r2=\E`;:tc=wy99gt-w:
+#
+wy99gt-vb|wyse99gt-vb|Wyse 99gt visible bell:\
+       :vb=\E`8\E`9:tc=wy99gt:
+#
+wy99gt-w-vb|wy99gt-wvb|wyse99gt-wvb|Wyse 99gt 132-column visible bell:\
+       :vb=\E`8\E`9:tc=wy99gt-w:
+#
+#      The Wyse 160 is combination of the WY-60 and the WY-99gt.
+#      The reset strings are slow and the pad times very depending
+#      on other parameters such as font loading.  I have tried
+#      to follow the following outline:
+#              rs1 -> set personality
+#              rs2 -> set number of columns
+#              rs3 -> set number of lines
+#              is1 -> select the proper font
+#              is2 -> do the initialization
+#              is3 -> set up display memory (2 pages)
+#
+#      The display memory may be used for either text or graphics.
+#      When "Display Memory = Shared" the terminal will have more pages
+#      but garbage may be left on the screen when you switch from
+#      graphics to text.  If "Display Memory = Unshared" then the
+#      text area will be only one page long.
+#
+wy160|wyse160|Wyse 160:\
+       :5i:am:bs:bw:hs:km:mi:ms:\
+       :Nl#8:co#80:lh#1:li#24:lw#8:ws#38:\
+       :#2=\E{:%9=\EP:&3=\Er:@8=\E7:DK=\E`b:F1=^AJ\r:\
+       :F2=^AK\r:F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:\
+       :LF=\EA11:LO=\EA10:RA=\Ed.:RC=\E`c:RX=\Ec20:SA=\Ed/:\
+       :SX=\Ec21:\
+       :ac=+/\\\054.0[Iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~:\
+       :ae=\EcD:al=\EE:as=\EcE:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :cl=\E+:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:\
+       :do=^J:ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\EcB0\EcC1:\
+       :i2=\Ew0:im=\Eq:ip=:\
+       :is=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024\El:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:\
+       :kB=\EI:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kN=\EK:kP=\EJ:\
+       :kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:\
+       :ll=^^^K:mb=\EG2:me=\E(\EH\003\EG0\EcD:mh=\EGp:\
+       :mk=\EG1:mp=\E):mr=\EG4:nd=^L:nw=\r\n:pf=^T:\
+       :pl=\EZ2%+?%s\177:pn=\Ez%+/%s\r:po=\Ed#:ps=\EP:\
+       :px=\EZ1%+?%s\177:r1=\E~!\E~4:r2=\E`\072:r3=\EwG\Ee(:\
+       :..sa=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%'0'%?%p2%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c:\
+       :se=\EG0:sf=\n:so=\EGt:sr=\Ej:st=\E1:ta=^I:te=\Ew0:\
+       :ti=\Ew1:ts=\EF:ue=\EG0:up=^K:us=\EG8:ve=\E`1:\
+       :vi=\E`0:
+#
+wy160-w|wyse160-w|wyse 160 132-column:\
+       :Nl#16:co#132:lw#7:ws#90:\
+       :cm=\Ea%i%dR%dC:dc=\EW:r2=\EeF\E`;:tc=wy160:
+#
+wy160-25|wyse160-25|wyse 160 80-column 25-lines:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy160:
+wy160-25-w|wyse160-25-w|wyse 160 132-column 25-lines:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy160-w:
+#
+wy160-42|wyse160-42|wyse 160 80-column 42-lines:\
+       :li#42:\
+       :al=\EE:cd=\Ey:cl=\E+:dl=\ER:i1=\EcB2\EcC3:nw=\r\n:\
+       :r3=\Ee*:sf=\n:sr=\Ej:tc=wy160:
+wy160-42-w|wyse160-42-w|wyse 160 132-column 42-lines:\
+       :Nl#16:co#132:lw#7:ws#90:\
+       :cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\EeF\E`;:tc=wy160-42:
+#
+wy160-43|wyse160-43|wyse 160 80-column 43-lines:\
+       :Nl@:lh@:li#43:lw@:\
+       :pn@:r3=\Ee+:tc=wy160-42:
+wy160-43-w|wyse160-43-w|wyse 160 132-column 43-lines:\
+       :Nl@:lh@:li#43:lw@:\
+       :pn@:r3=\Ee+:tc=wy160-42-w:
+#
+wy160-vb|wyse160-vb|Wyse 160 visible bell:\
+       :vb=\E`8\E`9:tc=wy160:
+wy160-w-vb|wy160-wvb|wyse160-wvb|Wyse 160 132-column visible bell:\
+       :vb=\E`8\E`9:tc=wy160-w:
+#
+#      The Wyse 75 is a vt100 lookalike without advanced video.
+#
+#         The Wyse 75 can support one attribute (e.g. Dim, Inverse,
+#      Underline) without magic cookies.  The following description
+#      uses this capability, but when more than one attribute is
+#      put on the screen at once, all attributes will be changed
+#      to be the same as the last attribute given.
+#         The Wyse 75 can support more attributes when used with magic
+#      cookies.  The wy75-mc terminal description uses magic cookies
+#      to correctly handle multiple attributes on a screen.
+#
+wy75|wyse75|wyse 75:\
+       :5i:am:bs:hs:mi:ms:xn:xo:\
+       :co#80:li#24:ma#1:pb#1201:ug#1:ws#78:\
+       :%1=\E[28~:%9=\E[?5i:*6=\E[4~:@0=\E[1~:@8=\EOM:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:\
+       :F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:F6=\E[29~:\
+       :F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:FB=\E[35~:\
+       :IC=\E[%d@:K1=\EOw:K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:\
+       :LE=\E[%dD:RA=\E[?7l:RI=\E[%dC:SA=\E[?7h:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:ch=\E[%i%dG:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+       :ds=\E[>\\\054\001\001\E[>-\001\001:eA=\E)0:\
+       :ec=\E[%dX:ei=\E[4l:fs=^A:ho=\E[H:\
+       :i1=\E[2;4;20;30l\E[?1;10l\E[12h\E[?7;8;25h:i2=\E[m:\
+       :im=\E[4h:ip=:is=\E>\E(B\E)0\017:k1=\E[?5i:k2=\E[?3i:\
+       :k3=\E[2i:k4=\E[@:k5=\E[M:k6=\E[17~:k7=\E[18~:\
+       :k8=\E[19~:k9=\E[20~:k;=\E[21~:kA=\E[L:kE=\E[K:\
+       :kI=\E[@:kL=\E[M:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:\
+       :ke=\E>:kh=\E[H:kl=\E[D:kr=\E[C:ks=\E[?1l\E[?7h\E=:\
+       :ku=\E[A:le=^H:me=\E[m\017:mh=\E[0t\E[2m:\
+       :mr=\E[1t\E[7m:nd=\E[C:pf=\E[4i:po=\E[5i:ps=\E[0i:\
+       :r1=\E[13l\E[3l\E!p:r2=\E[35h\E[?3l:r3=\E[?5l:rc=\E8:\
+       :..sa=%?%p5%t\E[0t%;%?%p3%p1%|%t\E[1t%;%?%p2%t\E[2t%;%?%p4%t\E[3t%;%?%p1%p2%p3%p4%p5%|%|%|%|%t\E[7m%e\E[m%;%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=\n:so=\E[1t\E[7m:sr=\EM:st=\EH:\
+       :ta=^I:ts=\E[>\\\054\001:ue=\E[m:up=\E[A:\
+       :us=\E[2t\E[4m:ve=\E[?25h:vi=\E[?25l:
+#
+#      This terminal description uses the non-hidden attribute mode
+#      (with magic cookie).
+#
+wy75-mc|wyse75-mc|wyse 75 with magic cookies:\
+       :ms@:\
+       :ma@:sg#1:ug#1:\
+       :ae=\E[0p\017:as=\E[0p\016:i2=\E[m\E[p:mb=\E[2p:\
+       :me=\E[0p\017:mh=\E[1p:mk=\E[4p:mr=\E[16p:\
+       :..sa=\E[%{0}%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{16}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{1}%|%;%?%p7%t%{4}%|%;%dp%?%p9%t\016%e\017%;:\
+       :se=\E[0p:so=\E[17p:ue=\E[0p:us=\E[8p:tc=wy75:
+wy75-vb|wyse75-vb|wyse 75 with visible bell:\
+       :pb@:\
+       :vb=\E[30h\E\\\054\E[30l:tc=wy75:
+wy75-w|wyse75-w|wyse 75 in 132 column mode:\
+       :co#132:ws#130:\
+       :r2=\E[35h\E[?3h:tc=wy75:
+wy75-wvb|wyse75-wvb|wyse 75 with visible bell 132 columns:\
+       :pb@:\
+       :vb=\E[30h\E\\\054\E[30l:tc=wy75-w:
+#
+#      Wyse 85 emulating a vt220 7 bit mode.
+#              24 line screen with status line.
+#
+#      The vt220 mode permits more function keys but it wipes out
+#      the escape key.  I strongly reccomend that f11 be set to
+#      escape (esc).
+#      The terminal may have to be set for 8 data bits and 2 stop
+#      bits for the arrow keys to work.
+#      The Wyse 85 runs faster with XON/XOFF enabled.  Also the
+#      (dch) and (ich) work best when XON/XOFF is set.  (ich) and
+#      (dch) leave trash on the screen when used without XON/XOFF.
+#
+wy85|wyse85|wyse 85:\
+       :5i:am:bs:hs:mi:ms:xn:xo:\
+       :co#80:it#8:li#24:ws#80:\
+       :%1=\E[28~:*6=\E[4~:@0=\E[1~:@8=\EOM:AL=\E[%dL:\
+       :DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:\
+       :F3=\E[25~:F4=\E[26~:F5=\E[28~:F6=\E[29~:F7=\E[31~:\
+       :F8=\E[32~:F9=\E[33~:FA=\E[34~:IC=\E[%d@:K1=\EOw:\
+       :K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:LE=\E[%dD:RA=\E[?7l:\
+       :RI=\E[%dC:SA=\E[?7h:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+       :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:\
+       :ds=\E[40l:eA=\E)0:ec=\E[%dX:ei=\E[4l:fs=\E[1;24r\E8:\
+       :ho=\E[H:i1=\E[62;1"p\E[?5W:i2=\E>\E(B\E)0\017\E[m:\
+       :im=\E[4h:ip=:\
+       :is=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+       :k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=\E[3~:kI=\E[2~:\
+       :kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:ke=\E>:kh=\E[26~:\
+       :kl=\E[D:kr=\E[C:ks=\E[?1l\E=:ku=\E[A:l1=PF1:l2=PF2:\
+       :l3=PF3:l4=PF4:le=^H:mb=\E[5m:md=\E[1m:me=\E[m\017:\
+       :mh=\E[2m:mk=\E[8m:mr=\E[7m:nd=\E[C:pf=\E[4i:\
+       :po=\E[5i:ps=\E[0i:r1=\E[13l\E[3l\E!p:\
+       :r2=\E[35h\E[?3l:r3=\E[?5l:rc=\E8:\
+       :..sa=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=\n:so=\E[7m:sr=\EM:st=\EH:ta=\011:\
+       :ts=\E[40h\E7\E[25;%i%p1%dH:ue=\E[m:up=\E[A:us=\E[4m:\
+       :ve=\E[?25h:vi=\E[?25l:
+#
+#      Wyse 85 with visual bell.
+wy85-vb|wyse85-vb|wyse 85 with visible bell:\
+       :vb=\E[30h\E\\\054\E[30l:tc=wy85:
+#
+#      Wyse 85 in 132-column mode.
+wy85-w|wyse85-w|wyse 85 in 132-column mode:\
+       :co#132:ws#132:\
+       :r2=\E[35h\E[?3h:tc=wy85:
+#
+#      Wyse 85 in 132-column mode with visual bell.
+wy85-wvb|wyse85-wvb|wyse 85 with visible bell 132-columns:\
+       :vb=\E[30h\E\\\054\E[30l:tc=wy85-w:
+#
+#      Wyse 185 emulating a vt320 7 bit mode.
+#
+#      This terminal always displays 25 lines.  These lines may be used
+#      as 24 data lines and a terminal status line (top or bottom) or
+#      25 data lines.  The 48 and 50 line modes change the page size
+#      and not the number of lines on the screen.
+#
+#      The Compose Character key can be used as a meta key if changed
+#      by set-up.
+#
+wy185|wyse185|wyse 185:\
+       :5i:am:bs:hs:km:mi:ms:xn:xo:\
+       :co#80:it#8:li#24:ws#80:\
+       :%1=\E[28~:*6=\E[4~:@0=\E[1~:@8=\EOM:AL=\E[%dL:\
+       :DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:\
+       :F3=\E[25~:F4=\E[26~:F5=\E[28~:F6=\E[29~:F7=\E[31~:\
+       :F8=\E[32~:F9=\E[33~:FA=\E[34~:IC=\E[%d@:K1=\EOw:\
+       :K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:LE=\E[%dD:RA=\E[?7l:\
+       :RI=\E[%dC:SA=\E[?7h:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:ch=\E[%i%d`:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:cv=\E[%i%dd:dc=\E[P:\
+       :dl=\E[M:do=^J:ds=\E7\E[99;0H\E[K\E8:eA=\E)0:\
+       :ec=\E[%dX:ei=\E[4l:fs=\E[1;24r\E8:ho=\E[H:i1=\E[?5W:\
+       :i2=\E>\E(B\E)0\017\E[m:im=\E[4h:ip=:\
+       :is=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:\
+       :k8=\E[19~:k9=\E[20~:k;=\E[21~:kB=\E[Z:kD=\E[3~:\
+       :kI=\E[2~:kN=\E[6~:kP=\E[5~:kb=^H:kd=\E[B:ke=\E>:\
+       :kh=\E[26~:kl=\E[D:kr=\E[C:ks=\E[?1l\E=:ku=\E[A:\
+       :l1=PF1:l2=PF2:l3=PF3:l4=PF4:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[m\017:mh=\E[2m:mk=\E[8m:mr=\E[7m:nd=\E[C:\
+       :pf=\E[4i:po=\E[5i:ps=\E[0i:\
+       :r1=\E[13l\E[3l\E\\\E[63;1"p\E[!p:r2=\E[35h\E[?3l:\
+       :r3=\E[?5l\E[47h\E[40l\E[r:rc=\E8:\
+       :..sa=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[27m:sf=\n:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+       :te=\E[ R:ti=\E[ Q:ts=\E7\E[99;%i%p1%dH:ue=\E[24m:\
+       :up=\E[A:us=\E[4m:ve=\E[34h\E[?25h:vi=\E[?25l:\
+       :vs=\E[?25h\E[34l:
+#
+#      Wyse 185 with 24 data lines and top status (terminal status)
+wy185-24|wyse185-24|wyse 185 with 24 data lines:\
+       :hs@:\
+       :ds@:fs@:r3=\E[?5l\E[47h\E[40l\E[1;24r:ts@:tc=wy185:
+#
+#      Wyse 185 with visual bell.
+wy185-vb|wyse185-vb|wyse 185 with visible bell:\
+       :vb=\E[30h\E\\\054\E[30l:tc=wy185:
+#
+#      Wyse 185 in 132-column mode.
+wy185-w|wyse185-w|wyse 185 in 132-column mode:\
+       :co#132:ws#132:\
+       :DC=\E[%dP:IC=\E[%d@:dc=\E[P:ei=:im=:ip=:\
+       :r2=\E[35h\E[?3h:tc=wy185:
+#
+#      Wyse 185 in 132-column mode with visual bell.
+wy185-wvb|wyse185-wvb|wyse 185 with visible bell 132-columns:\
+       :vb=\E[30h\E\\\054\E[30l:tc=wy185-w:
+
+# wy325 terminfo entries
+# Done by Joe H. Davis        3-9-92
+
+# lines 25  columns 80
+#
+wy325|wyse325|Wyse-epc:\
+       :5i:am:bs:bw:hs:mi:\
+       :Nl#8:co#80:lh#1:li#24:lw#8:pb#9601:ws#45:\
+       :#2=\E{:%9=\EP:&3=\Er:@8=\E7:F1=^AJ\r:F2=^AK\r:\
+       :F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:LF=\EA11:\
+       :LO=\EA10:RA=\Ed.:SA=\Ed/:\
+       :ac=+/\\\054.0[Iha2fxgqh1jYk?lZm@nEqDtCu4vAwBx3yszr{c~~:\
+       :ae=\EcD:al=\EE:as=\EcE:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :cl=\E+:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:\
+       :do=^J:ds=\EF\r:ei=\Er:fs=^M:ho=^^:i1=\EcB0\EcC1:\
+       :i2=\Ew0:im=\Eq:ip=:\
+       :is=\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024\El:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:\
+       :kB=\EI:kD=\EW:kE=\ET:kI=\Eq:kL=\ER:kN=\EK:kP=\EJ:\
+       :kS=\EY:kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:\
+       :ll=^^^K:mb=\EG2:me=\E(\EH\003\EG0\EcD:mh=\EGp:\
+       :mk=\EG1:mp=\E):mr=\EG4:nd=^L:pf=^T:pl=\EZ2%+?%s\177:\
+       :pn=\Ez%+/%s\r:po=\Ed#:ps=\EP:px=\EZ1%+?%s\177:\
+       :r1=\E~!\E~4:r2=\EeF\E`\072:r3=\EwG\Ee(:\
+       :..sa=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%'0'%?%p2%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c:\
+       :se=\EG0:sf=\n:so=\EGt:sr=\Ej:st=\E1:ta=^I:te=\Ew0:\
+       :ti=\Ew1:ts=\EF:ue=\EG0:up=^K:us=\EG8:ve=\E`1:\
+       :vi=\E`0:
+
+#
+# lines 24  columns 80  vb 
+#
+wy325-vb|wyse325-vb|wy150-vb:\
+       :vb=\E`8\E`9:tc=wy325:
+
+#
+# lines 24  columns 132
+#
+wy325-w|wyse325-w|wy325w-24:\
+       :Nl#16:co#132:lw#7:ws#97:\
+       :cm=\Ea%i%dR%dC:dc=\EW:ip=:r2=\E`;:tc=wy325:
+#
+# lines 25  columns 80
+#
+wy325-25|wyse325-25|wy325-80:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy325:
+#
+# lines 25  columns 132
+#
+wy325-25w|wyse325-25w|wy325 132 columns:\
+       :Nl@:lh@:li#25:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy325-w:
+#
+# lines 25  columns 132  vb 
+#
+wy325-w-vb|wy325-wvb|wyse325-wvb:\
+       :vb=\E`8\E`9:tc=wy325-w:
+
+#
+# lines 42  columns 80
+#
+wy325-42|wyse325-42:\
+       :Nl@:lh@:li#42:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy325:
+#
+# lines 42  columns 132
+#
+wy325-42w|wyse325-42w:\
+       :Nl@:lh@:li#42:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy325-w:
+#
+# lines 42  columns 132  vb 
+#
+wy325-42w-vb|wy325-42wvb:\
+       :vb=\E`8\E`9:tc=wy325-w:
+#
+# lines 43  columns 80
+#
+wy325-43|wyse325-43:\
+       :Nl@:lh@:li#43:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy325:
+#
+# lines 43  columns 132
+#
+wy325-43w|wyse325-43w:\
+       :Nl@:lh@:li#43:lw@:\
+       :pn@:r3=\EwG\Ee):tc=wy325-w:
+#
+# lines 43  columns 132  vb 
+#
+wy325-43w-vb|wy325-43wvb:\
+       :vb=\E`8\E`9:tc=wy325-w:
+#      Wyse 370
+#
+#              24 line screen with status line.
+#
+#      The terminal may have to be set for 8 data bits and 2 stop
+#      bits for the arrow keys to work.
+#
+#      If you change keyboards the terminal will send different
+#      escape sequences.
+#      The following definition is for the basic terminal without
+#      function keys.
+#
+#      u0 -> enter Tektronix 4010/4014 mode
+#      u1 -> exit  Tektronix 4010/4014 mode
+#      u2 -> enter ASCII mode (from any ANSI mode)
+#      u3 -> exit  ASCII mode (goto native ANSI mode)
+#      u4 -> enter Tek 4207 ANSI mode (from any ANSI mode)
+#      u5 -> exit  Tek 4207 mode (goto native ANSI mode)
+#
+# (untranslatable capabilities removed to fit entry within 1023 bytes)
+# WARNING: this entry, 1201 bytes long, may core-dump older termcap libraries!
+wy370-nk|wyse 370 without function keys:\
+       :5i:am:bs:cc:hs:mi:ms:xn:xo:\
+       :Co#64:NC#48:co#80:it#8:li#24:pa#64:ws#80:\
+       :AL=\E[%dL:DC=\E[%dP:DK=\E[31h:DL=\E[%dM:DO=\E[%dB:\
+       :IC=\E[%d@::LE=\E[%dD:RA=\E[?7l:RC=\E[31l:RI=\E[%dC:\
+       :SA=\E[?7h:Sb=\E[62;%dw:Sf=\E[61;%dw:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:ch=\E[%i%d`:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:cv=\E[%i%dd:dc=\E[P:\
+       :dl=\E[M:do=^J:ds=\E[40l:eA=\E)0:ec=\E[%dX:ei=\E[4l:\
+       :fs=\E[1;24r\E8:ho=\E[H:i1=\E[90;1"p\E[?5W:\
+       :i2=\E>\017\E)0\E(B\E[63;0w\E[m:im=\E[4h:ip=:\
+       :is=\E[2;4;20;30;40l\E[?1;10;16l\E[12h\E[?7;8;25h:\
+       :ke=\E>:ks=\E[?1l\E=:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[m\017:mh=\E[2m:mk=\E[8m:mr=\E[7m:nd=\E[C:\
+       :oc=\E[60w\E[63;0w\n\E[66;1;4w\n\E[66;2;13w\n\E[66;3;16w\n\E[66;4;49w\n\E[66;5;51w\n\E[66;6;61w\n\E[66;7;64w:\
+       :op=\E[m:pf=\E[4i:po=\E[5i:ps=\E[0i:\
+       :r1=\E[13l\E[3l\E!p\E[?4i:r2=\E[35h\E[?3l:r3=\E[?5l:\
+       :rc=\E8::sc=\E7:se=\E[27m:sf=\n:so=\E[7m:sr=\EM:\
+       :st=\EH:ta=\011:te=\E[ R:ti=\E[ Q:\
+       :ts=\E[40l\E[40h\E7\E[99;%i%p1%dH:u0=\E[?38h\E8:\
+       :u1=\E[?38l\E)0:u2=\E[92;52"p:u3=\E~B:u4=\E[92;76"p::\
+       :ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[34h\E[?25h:\
+       :vi=\E[?25l:vs=\E[?25h\E[34l:
+#
+#      Function key set for the ASCII (wy-50 compatable) keyboard
+#
+wy370-101k|Wyse 370 with 101 key keyboard:\
+       :@8=\EOM:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:\
+       :F5=\E[28~:F6=\E[29~:k1=\E[?4i:k2=\E[?3i:k3=\E[2i:\
+       :k4=\E[@:k5=\E[M:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
+       :k9=\E[20~:k;=\E[21~:kA=\EOP:kB=\E[Z:kD=\EOQ:kI=\EOP:\
+       :kL=\EOQ:kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:tc=wy370-nk:
+#
+#      Function key set for the VT-320 (and wy85) compatable keyboard
+#
+wy370-105k|Wyse 370 with 105 key keyboard:\
+       :%1=\E[28~:*6=\E[4~:@0=\E[1~:@8=\EOM:F1=\E[23~:\
+       :F2=\E[24~:F3=\E[25~:F4=\E[26~:F5=\E[28~:F6=\E[29~:\
+       :F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:K1=\EOw:\
+       :K2=\EOu:K3=\EOy:K4=\EOq:K5=\EOs:k1=\EOP:k2=\EOQ:\
+       :k3=\EOR:k4=\EOS:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
+       :k9=\E[20~:k;=\E[21~:kD=\E[3~:kI=\E[2~:kN=\E[6~:\
+       :kP=\E[5~:kb=^H:kd=\E[B:kh=\E[26~:kl=\E[D:kr=\E[C:\
+       :ku=\E[A:l1=PF1:l2=PF2:l3=PF3:l4=PF4:tc=wy370-nk:
+#
+#      Function key set for the PC compatable keyboard
+#
+wy370-EPC|Wyse 370 with 102 key keyboard:\
+       :@7=\E[1~:@8=\EOM:F1=\E[23~:F2=\E[24~:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[M:k6=\E[17~:k7=\E[18~:\
+       :k8=\E[19~:k9=\E[20~:k;=\E[21~:kB=\E[Z:kI=\E[2~:\
+       :kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:tc=wy370-nk:
+#
+#      Set up the default WY-370.
+#
+wy370|wyse370|Wyse 370:\
+       :tc=wy370-101k:
+#
+#      Wyse 370 with visual bell.
+wy370-vb|Wyse 370 with visible bell:\
+       :vb=\E[30h\E\\\054\E[30l:tc=wy370:
+#
+#      Wyse 370 in 132-column mode.
+wy370-w|Wyse 370 in 132-column mode:\
+       :co#132:ws#132:\
+       :r2=\E[35h\E[?3h:tc=wy370:
+#
+#      Wyse 370 in 132-column mode with visual bell.
+wy370-wvb|Wyse 370 with visible bell 132-columns:\
+       :vb=\E[30h\E\\\054\E[30l:tc=wy370-w:
+wy370-rv|Wyse 370 reverse video:\
+       :r3=\E[32h\E[?5h:tc=wy370:
+#
+#      Wyse 99gt Tektronix 4010/4014 emulator,
+#
+wy99gt-tek|Wyse 99gt Tektronix 4010/4014 emulator:\
+       :am:bs:os:\
+       :co#74:li#35:\
+       :bl=^G:cl=\E^L:\
+       :..cm=\035%{3040}%{89}%p1%*%-%Py\n%p2%{55}%*%Px\n%gy%{128}%/%{31}%&%{32}%+%c\n%gy%{3}%&%{4}%*%gx%{3}%&%+%{96}%+%c\n%gy%{004}%/%{31}%&%{96}%+%c\n%gx%{128}%/%{31}%&%{32}%+%c\n%gx%{004}%/%{31}%&%{64}%+%c\037:\
+       :cr=^M:do=^J:ff=^L:\
+       :hd=\036HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\037:\
+       :ho=^]7`x @\037:\
+       :hu=\036DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\037:\
+       :is=\E8:le=^H:nd= :nw=^M^J:u0=\E~>\E8:u1=\E[42h:\
+       :up=^K:
+#
+#      Wyse 160 Tektronix 4010/4014 emulator,
+#
+wy160-tek|Wyse 160 Tektronix 4010/4014 emulator:\
+       :..cm=\035%{3103}%{91}%p1%*%-%Py\n%p2%{55}%*%Px\n%gy%{128}%/%{31}%&%{32}%+%c\n%gy%{3}%&%{4}%*%gx%{3}%&%+%{96}%+%c\n%gy%{004}%/%{31}%&%{96}%+%c\n%gx%{128}%/%{31}%&%{32}%+%c\n%gx%{004}%/%{31}%&%{64}%+%c\037:\
+       :ho=^]8`g @\037:tc=wy99gt-tek:
+#
+#      Wyse 370 Tektronix 4010/4014 emulator,
+#
+wy370-tek|Wyse 370 Tektronix 4010/4014 emulator:\
+       :am:bs:os:\
+       :co#80:li#36:\
+       :bl=^G:cl=\E^L:\
+       :..cm=\035%{775}%{108}%p1%*%{5}%/%-%Py\n%p2%{64}%*%{4}%+%{5}%/%Px\n%gy%{32}%/%{31}%&%{32}%+%c\n%gy%{31}%&%{96}%+%c\n%gx%{32}%/%{31}%&%{32}%+%c\n%gx%{31}%&%{64}%+%c\037:\
+       :cr=^M:do=^J:ff=^L:\
+       :hd=\036HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\037:\
+       :ho=^]8g @\037:\
+       :hu=\036DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\037:\
+       :is=\E8:kb=^H:kd=^J:kl=^H:kr=^I:ku=^K:le=^H:nd= :\
+       :nw=^M^J:u0=\E[?38h\E8:u1=\E[?38l\E)0:up=^K:
+
+# Vendor-supplied Wyse entries end here.
+
+# From: Eric Freudenthal <freudent@eric.ultra.nyu.edu>
+wy100q|Wyse 100 for Quotron:\
+       :bs:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=\EE:bt=\EI:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :\
+       :dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:im=\Eq:\
+       :is=\E`\072\200\EC\EDF\E0\E'\E(\EA21:kd=^J:kl=^H:\
+       :kr=^L:ku=^K:nd=^L:se=\EG0:so=\EG4:sr=\Ej:ue=\EG0:\
+       :up=^K:us=\EG8:
+
+#### Kermit terminal emulations
+#
+# Obsolete Kermit versions may be listed in the section describing obsolete
+# non-ANSI terminal emulators later in the file.
+#
+
+# KERMIT standard all versions.
+# Straight ascii keyboard. :sr=\EI: not avail. many versions + bug prone in vi.
+# (kermit: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" -- esr)
+# From: greg small <gts@populi.berkeley.edu> 9-25-84
+kermit|standard kermit:\
+       :bs:\
+       :co#80:li#24:\
+       :cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :ho=\EH:\
+       :is=K0 Standard Kermit  9-25-84\n:kd=^J:kh=^^:kl=^H:\
+       :kr=^L:ku=^K:nd=\EC:up=\EA:
+kermitam|standard kermit plus auto-margin:\
+       :am:\
+       :is=K1 Standard Kermit plus Automatic Margins\n:tc=kermit:
+# IBMPC Kermit 1.2.
+# Bugs :cd:ce: do not work except at beginning of line!  :cl: does not work,
+# but fake with :cl=\EH\EJ (since :cd=\EJ: works at beginning of line).
+# From: greg small <gts@populi.berkeley.edu> 8-30-84
+pckermit|pckermit12|UCB IBMPC Kermit 1.2:\
+       :am:\
+       :li#25:\
+       :cd@:ce@:cl=\EH\EJ:\
+       :is=K2 UCB IBMPC Kermit 1.2  8-30-84\n:tc=kermit:
+# IBMPC Kermit 1.20
+# Cannot use line 25, now acts funny like ansi special scrolling region.
+# Initialization must escape from that region by cursor position to line 24.
+# Cannot use character insert because 1.20 goes crazy if insert at col 80.
+# Does not use am: because autowrap mode lost when kermit dropped and restarted.
+# (pckermit: mapped ":pt:" to ":it#8:" -- esr)
+# From: greg small <gts@populi.berkeley.edu> 12-19-84
+pckermit120|UCB IBMPC Kermit 1.20:\
+       :am@:pt:\
+       :it#8:li#24:\
+       :al=\EL:dc=\EN:dl=\EM:do=\EB:ei@:im@:\
+       :is=\EO\Eq\EJ\EY7 K3 UCB IBMPC Kermit 1.20  12-19-84\n:\
+       :se=\Eq:so=\Ep:vs=\EO\Eq\EEK3:tc=kermit:
+# MS-DOS Kermit 2.27 for the IBMPC
+# Straight ascii keyboard. :sr=\EI: not avail. many versions + bug prone in vi.
+# Cannot use line 25, now acts funny like ansi special scrolling region.
+# Initialization must escape from that region by cursor position to line 24.
+# Does not use am: because autowrap mode lost when kermit dropped and restarted.
+# Reverse video for standout like H19.
+# (msk227: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:";
+# mapped ":pt:" to ":it#8:" -- esr)
+# From: greg small <gts@populi.berkeley.edu> 3-17-85
+msk227|mskermit227|MS-DOS Kermit 2.27 for the IBMPC:\
+       :am@:bs:pt:\
+       :co#80:it#8:li#24:\
+       :al=\EL:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :dc=\EN:\
+       :dl=\EM:do=\EB:ei=\EO:ho=\EH:im=\E@:\
+       :is=\EO\Eq\EG\Ew\EJ\EY7 K4 MS Kermit 2.27 for the IBMPC 3-17-85\n:\
+       :kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:nd=\EC:rc=\Ek:sc=\Ej:\
+       :se=\Eq:so=\Ep:up=\EA:vs=\EO\Eq\EG\EwK4:
+# MS-DOS Kermit 2.27 with automatic margins
+# From:        greg small <gts@populi.berkeley.edu> 3-17-85
+msk227am|mskermit227am|UCB MS-DOS Kermit 2.27 with automatic margins:\
+       :am:\
+       :is=\EO\Eq\EG\Ev\EJ\EY7 K5 MS Kermit 2.27 +automatic margins 3-17-85\n:\
+       :vs=\EO\Eq\EG\EvK5:tc=msk227:
+# MS-DOS Kermit 2.27 UCB 227.14 for the IBM PC
+# Automatic margins now default.  Use ansi set graphic rendition for standout,
+# underline and ul codes (:md:,:me:,:mr:).  Define function keys.
+# (msk22714: removed obsolete ":kn#10:" -- esr)
+# From: greg small <gts@populi.berkeley.edu> 3-17-85
+msk22714|mskermit22714|UCB MS-DOS Kermit 2.27 UCB 227.14 IBM PC:\
+       :am:\
+       :is=\EO\Eq\EG\Ev\EJ\EY7 K6 MS Kermit 2.27 UCB 227.14 IBM PC 3-17-85\n:\
+       :k0=\E0:k1=\E1:k2=\E2:k3=\E3:k4=\E4:k5=\E5:k6=\E6:\
+       :k7=\E7:k8=\E8:k9=\E9:md=\E[1m:me=\E[m:mr=\E[7m:\
+       :se=\E[m:so=\E[1m:ue=\E[m:us=\E[4m:vs=\EO\Eq\EG\EvK6:tc=mskermit227:
+# This was designed for a VT320 emulator, but it is probably a good start
+# at support for the VT320 itself.
+# Please send changes with explanations to bug-gnu-emacs@prep.ai.mit.edu.
+vt320-k3|MS-Kermit 3.00's vt320 emulation:\
+       :am:es:hs:km:mi:ms:xn:\
+       :co#80:it#8:li#49:pb#9600:vt#3:\
+       :AL=\E[%dL:CC=\E:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+       :IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:SR=\E[%dL:UP=\E[%dA:\
+       :ae=\E(B:al=\E[L:as=\E(0:bl=^G:cd=\E[J:ce=\E[K:\
+       :ch=\E[%i%dG:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+       :cs=\E[%i%d;%dr:ct=\E[3g:cv=\E[%i%dd:dc=\E[P:dl=\E[M:\
+       :do=^J:ds=\E[0$~:ec=\E[%dX:ei=\E[4l:fs=\E[0$}:\
+       :ho=\E[H:im=\E[4h:is=\E>\E F\E[?1l\E[?7h\E[r\E[2$~:\
+       :k0=\E[21~:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k6=\E[17~:\
+       :k7=\E[18~:k8=\E[19~:k9=\E[20~:kI=\E[2~:kL=\E[3~:\
+       :kN=\E[6~:kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:nw=^M^J:pf=\E[4i:\
+       :po=\E[5i:ps=\E[0i:\
+       :r1=\E(B\E)B\E>\E F\E[4;20l\E[12h\E[?1;5;6;38;42l\E[?7;25h\E4i\E?4i\E[m\E[r\E[2$~:\
+       :rc=\E8:sc=\E7:se=\E[27m:sf=^J:so=\E[7m:sr=\EM:\
+       :st=\EH:ta=^I:ts=\E[1$}\r\E[K:ue=\E[24m:up=\E[A:\
+       :us=\E[4m:vb=\E[?5h\E[?5l\E[?5h\E[?5l\E[?5h\E[?5l:\
+       :ve=\E[?25h:vi=\E[?25l:
+
+######## OLDER TERMINAL TYPES
+#
+# This section is devoted to older commercial terminal brands that are now
+# discontinued, but known to be still in use or represented by emulations.
+#
+
+#### AT&T (att, tty)
+#
+# This section also includes Teletype-branded VDTs.
+#
+# The AT&T/Teletype terminals group was sold to SunRiver Data Systems; for
+# details, see the header comment on the ADDS section.
+#
+# These are AT&T's official terminfo entries
+#
+att2300|ATT2300|sv80|AT&T 2300 Video Information Terminal 80 column mode:\
+       :am:eo:mi:ms:xo:\
+       :co#80:it#8:li#24:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[11r:\
+       :F2=\E[12r:F3=\E[13r:F4=\E[14r:F5=\E[15r:F6=\E[16r:\
+       :IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:al=\E[L:\
+       :bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:\
+       :ho=\E[H:im=\E[4h:k1=\E[1r:k2=\E[2r:k3=\E[3r:\
+       :k4=\E[4r:k5=\E[5r:k6=\E[6r:k7=\E[7r:k8=\E[8r:\
+       :k9=\E[9r:k;=\E[10r:kA=\E[L:kB=\E[Z:kC=\E[J:kD=\E[P:\
+       :kI=\E[@:kL=\E[M:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=^H:me=\E[m:mr=\E[7m:nd=\E[C:\
+       :pf=\E[4i:po=\E[5i:ps=\E[0i:se=\E[0m:sf=^J:so=\E[7m:\
+       :ta=^I:up=\E[A:
+att2350|AT&T 2350 Video Information Terminal 80 column mode:\
+       :pf@:po@:ps@:tc=att2300:
+att2300-x40|sv40|AT&T 2300 Video Information Terminal 40 column mode:\
+       :co#40:it#5:li#23:\
+       :AL@:al@:tc=att2300:
+att2350-x40|ATT2350-x40|AT&T 2350 Video Information Terminal 40 column mode:\
+       :co#40:it#5:li#23:\
+       :AL@:al@:tc=att2350:
+
+# Must setup RETURN KEY - CR, REC'VD LF - INDEX.
+# Seems upward compatible with vt100, plus ins/del line/char.
+# On sgr, the protection parameter is ignored.
+# No check is made to make sure that only 3 parameters are output.
+#      standout= reverse + half-intensity = 3 | 5.
+#      bold= reverse + underline = 2 | 3.
+# note that half-bright blinking doesn't look different from normal blinking.
+# NOTE:you must program the function keys first, label second!
+att5410v1|att4410v1|tty5410v1|AT&T 4410/5410 80 columns - version 1:\
+       :am:hs:mi:ms:xo:\
+       :Nl#8:co#80:it#8:lh#2:li#24:lw#8:ws#80:\
+       :ac=``aaffhhggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~00++--\\\054\\\054..:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ei=:fs=\E8:ho=\E[H:\
+       :i1=\E[?3l\E)0:\
+       :i2=\E[1;03q   f1           \EOP\E[2;03q   f2           \EOQ\E[3;03q   f3           \EOR\E[4;03q   f4           \EOS\E[5;03q   f5           \EOT\E[6;03q   f6           \EOU\E[7;03q   f7           \EOV\E[8;03q   f8           \EOW:\
+       :ic=\E[@:im=:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOT:\
+       :k6=\EOU:k7=\EOV:k8=\EOW:kC=\E[2J:kH=\E[24;1H:kb=^H:\
+       :kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+       :ll=\E[24H:mb=\E[5m:md=\E[2;7m:me=\E[m\017:mh=\E[2m:\
+       :mk=\E[8m:mr=\E[7m:nd=\E[C:nw=^M^J:\
+       :..pn=\E[%p1%d;00q%p2%\072-16s:\
+       :..px=\E[%p1%1d;%p2%l%2.2dq   f%p1%1d           %p2%s:\
+       :r2=\Ec\E[?3l\E[2;0y:rc=\E8:\
+       :..sa=\E[0%?%p1%p5%|%t;2%;%?%p2%p6%|%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+       :ts=\E7\E[25;%p1%{1}%+%dH:ue=\E[m:up=\E[A:us=\E[4m:
+
+att4410v1-w|att5410v1-w|tty5410v1-w|AT&T 4410/5410 132 columns - version 1:\
+       :co#132:ws#132:\
+       :i1=\E[?3h\E)0:r2=\Ec\E[?3h\E[2;0y:tc=att5410v1:
+
+att4410|att5410|tty5410|AT&T 4410/5410 80 columns - version 2:\
+       :..px=\E[%p1%d;%p2%l%02dq   f%p1%d           %p2%s:tc=att5410v1:
+
+att4410-nfk|att5410-nfk|4410-nfk|tty5410-nfk|5410-nfk|version 1 AT&T 4410/5410 entry without function keys:\
+       :i3@:k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:pn@:tc=att4410:
+
+att5410-w|att4410-w|4410-w|tty5410-w|5410-w|AT&T 4410/5410 in 132 column mode:\
+       :co#132:ws#132:\
+       :i1=\E[?3h\E)0:r2=\Ec\E[?3h\E[2;0y:tc=att4410:
+
+att5410-nsl|4410-nsl|att4410-nsl|ATT4410-nsl|tty5410-nsl|tty5410 entry without pln defined:\
+       :pn@:tc=att4410:
+
+otty5410|teletype 5410 for S5R2 curses:\
+       :ts=\E7\E[25;%p1%{1}%+%dH:tc=att4410:
+
+# 5410 in terms of a vt100
+v5410|5410 in terms of a vt100:\
+       :am:mi:ms:xo:\
+       :co#80:it#8:li#24:vt#3:\
+       :@8=\EOM:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:K5=\EOn:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:eA=\E(B\E)0:ei=:\
+       :ho=\E[H:ic=\E[@:im=:k0=\EOy:k1=\EOP:k2=\EOQ:k3=\EOR:\
+       :k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:k8=\EOl:k9=\EOw:\
+       :k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:\
+       :ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[m\017:mr=\E[7m:nd=\E[C:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :..sa=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+
+# 
+# Teletype Model 5420 -- A souped up 5410, with multiple windows,
+# even! the 5420 has three modes: scroll, window or page mode
+# this terminfo should work in scroll or window mode, but doesn't
+# take advantage of any of the differences between them.
+#
+# Has memory below (2 lines!)
+# 3 pages of memory (plus some spare)
+# The 5410 sequences for cup,cvvis,dch,dl,ech,flash,home,hpa,hts would work
+# for these, but these work in both scroll and window mode...
+# Unset insert character so insert mode works
+# is1 sets 80 column mode,
+# is2 escape sequence:
+# 1) turn off all fonts
+# 2) function keys off, keyboard lock off, control display off,
+#    insert mode off, erasure mode off,
+# 3) full duplex, monitor mode off, send graphics off, nl on lf off
+# 4) reset origin mode
+# 5) set line wraparound
+# 6) exit erasure mode, positional attribute mode, and erasure extent mode
+# 7) clear margins
+# 8) program ENTER to transmit ^J,
+# We use \212 to program the ^J because a bare ^J will get translated by
+# UNIX into a CR/LF. The enter key is needed for AT&T uOMS.
+#     1      2            3              4     5     6    7  8
+# is3 set screen color to black,
+# No representation in terminfo for the delete word key: kdw1=\Ed
+# Key capabilities assume the power-up send sequence...
+# This rmcup is not strictly necessary, but it helps maximize 
+# memory usefulness: rmcup=\Ez,
+# Alternate sgr0:      sgr0=\E[0m\EW^O,
+# Alternate sgr:       sgr=\E[%?%p1%t2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m%?%p8%t\EV%;%?%p9%t^N%e^O%;,
+# smkx programs the SYS PF keys to send a set sequence.
+# It also sets up labels f1, f2, ..., f8, and sends edit keys.
+# This string causes them to send the strings kf1-kf8
+# when pressed in SYS PF mode.
+att4415|tty5420|att5420|AT&T 4415/5420 80 columns:\
+       :db:mi:xo:\
+       :Nl#8:lh#2:lm#78:lw#8:ws#55:\
+       :@1=\Et:@7=\Ez:@8=\Eent:AL=\E[%dL:\
+       :CM=\E[%i%p1%d;%p2%dt:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+       :IC=\E[%d@:LE=\E[%dD:LF=\E|:LO=\E~:RI=\E[%dC:\
+       :SF=\E[%dE:SR=\E[%dF:UP=\E[%dA:bt=\E[Z:ch=\E[%+^AG:\
+       :cl=\E[x\E[J:cm=\E[%i%d;%dx:ct=\E[3g:cv=\E[%+^Ad:\
+       :ec=\E[%ds\E[%dD:ei=\E[4l:ho=\E[x:i1=\E[?3l:\
+       :i2=\E[?5l:ic@:im=\E[4h:\
+       :is=\E[0m\017\E[1;2;3;4;6l\E[12;13;14;20l\E[?6;97;99l\E[?7h\E[4i\Ex\E[21;1j\212:\
+       :k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:\
+       :k7=\EOi:k8=\EOj:kA=\E[L:kB=\E[Z:kD=\E[P:kE=\E[2K:\
+       :kF=\E[T:kH=\Eu:kI=\E[4h:kL=\E[M:kN=\E[U:kP=\E[V:\
+       :kR=\E[S:ke=\E[19;0j\E[21;1j\212:\
+       :ks=\E[19;1j\E[21;4j\Eent:l1=F1:l2=F2:l3=F3:l4=F4:\
+       :l5=F5:l6=F6:l7=F7:l8=F8:ll=\Ew:me=\E[0m\017:mp=\EV:\
+       :pf=\E[?9i:..pn=\E[%p1%d;0;0;0q%p2%\072-16.16s:\
+       :po=\E[?4i:ps=\E[?2i:\
+       :..px=\E[%p1%d;%p2%l%02dq   F%p1%d           %p2%s:\
+       :..sa=\E[0%?%p1%p5%|%t;2%;%?%p2%p6%|%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :st=\EH:ts=\E7\E[25;%p1%{8}%+%dH:vb=\E[?5h\E[?5l:\
+       :ve=\E[11;0j:vs=\E[11;1j:tc=att4410:
+
+att4415-w|tty5420-w|att5420-w|5420-w|AT&T model 4415/5420 in 132 column mode:\
+       :co#132:lm#54:ws#97:\
+       :i1=\E[?3h:tc=att4415:
+
+att4415-rv|tty5420-rv|att5420-rv|AT&T model 4415/5420 80 columns in reverse video:\
+       :i2=\E[?5h:vb=\E[?5l\E[?5h:tc=att4415:
+
+att4415-w-rv|tty5420-w-rv|att5420-w-rv|AT&T model 4415/5420 132 columns in reverse video:\
+       :co#132:lm#54:ws#97:\
+       :i1=\E[?3h:i2=\E[?5h:vb=\E[?5l\E[?5h:tc=att4415:
+
+# Note that this mode permits programming USER PF KEYS and labels
+# However, when you program user pf labels you have to reselect
+# user pf keys to make them appear! 
+att4415+nl|4415+nl|tty5420+nl|att5420+nl|generic AT&T 4415/5420 changes for not changing labels:\
+       :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:\
+       :..pn=\E[%p1%d;0;0;1q%p2%\072-16.16s:\
+       :..px=\E[%p1%d;%p2%l%02d;0;1q   F%p1%d           %p2%s:
+
+att4415-nl|4415-nl|tty5420-nl|att5420-nl|AT&T 4415/5420 without changing labels:\
+       :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:tc=att4415+nl:tc=att4415:
+
+att4415-rv-nl|tty5420-rv-nl|att5420-rv-nl|AT&T 4415/5420 reverse video without changing labels:\
+       :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:tc=att4415+nl:tc=att4415-rv:
+
+att4415-w-nl|tty5420-w-nl|att5420-w-nl|AT&T 4415/5420 132 cols without changing labels:\
+       :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:tc=att4415+nl:tc=att4415-w:
+
+att4415-w-rv-n|tty5420-w-rv-n|att5420-w-rv-n|AT&T 4415/5420 132 cols reverse without changing labels:\
+       :k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:tc=att4415+nl:tc=att4415-w-rv:
+
+otty5420|teletype 5420 for SVR2 curses on the 3B-20's:\
+       :ch=\E[%+^AG:cv=\E[%+^Ad:tc=tty5420:
+
+att5420_2|AT&T 5420 model 2 in 80 column mode:\
+       :am:db:hs:mi:ms:xo:\
+       :Nl#8:co#80:it#8:lh#2:li#24:lm#78:lw#8:ws#55:\
+       :@1=\Et:@7=\Ez:@8=^J:AL=\E[%dL:CM=\E[%i%p1%d;%p2%dt:\
+       :DC=\E[%dP:DL=\E[%dM:IC=\E[%d@:LE=\E[%dD:LF=\E|:\
+       :LO=\E~:RI=\E[%dC:SF=\E[%dE:SR=\E[%dF:UP=\E[%dA:\
+       :ae=^O:al=\E[L:as=^N:bt=\E[1Z:cb=\E[1K:cd=\E[0J:\
+       :ce=\E[0K:ch=\E[%+^AG:cl=\EH\EJ:cm=\E[%i%d;%dH:\
+       :cr=\EG:cs=\E[%i%d;%dr:ct=\E[3g:cv=\E[%+^Ad:dc=\E[P:\
+       :dl=\E[M:do=\E[1B:ec=\E[%ds\E[%dD:ei=:fs=\E8:ho=\E[H:\
+       :i1=\E[0;23r\Ex\Ey\E[2;0j\E[3;3j\E[4;0j\E[5;0j\E[6;0j\E[7;0j\E[8;0j\E[9;1j\E[10;0j\E[15;0j\E[16;1j\E[19;0j\E[20;1j\E[29;0j\E[1;24r:\
+       :ic=\E[@:im=:k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:\
+       :k6=\EOh:k7=\EOi:k8=\EOj:kA=\E[L:kB=\E[Z:kC=\E[2J:\
+       :kD=\E[P:kE=\E[2K:kF=\E[T:kH=\Eu:kI=\E[4h:kL=\E[M:\
+       :kN=\E[U:kP=\E[V:kR=\E[S:kb=^H:kd=\E[B:ke=\E[19;0j:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:ks=\E[19;1j:ku=\E[A:l1=F1:\
+       :l2=F2:l3=F3:l4=F4:l5=F5:l6=F6:l7=F7:l8=F8:le=^H:\
+       :ll=\Ew:mb=\E[5m:me=\E[0m\017:mh=\E[2m:mk=\E[8m:\
+       :mp=\EV:mr=\E[7m:nd=\E[1C:nw=^M^J:pf=\E[4i:\
+       :..pn=\E[%p1%d;0;0;0q%p2%\072-16.16s\E~:po=\E[5i:\
+       :ps=\E[?;2i:\
+       :..px=\E[%p1%d;%p2%l%02dq   F%p1%d           %p2%s\E~:\
+       :r2=\Ec\E[?3l\E[2;0y:rc=\E8:\
+       :..sa=\E[0%?%p1%p5%|%t;2%;%?%p2%p6%|%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+       :ts=\E7\E[25;%p1%{8}%+%dH:ue=\E[m:us=\E[4m:\
+       :vb=\E[?5h\E[?5l:ve=\E[11;0j:vs=\E[11;1j:
+att5420_2-w|AT&T 5420 model 2 in 132 column mode:\
+       :co#132:\
+       :i1=\E[0;23r\Ex\Ey\E[2;0j\E[3;3j\E[4;0j\E[5;1j\E[6;0j\E[7;0j\E[8;0j\E[9;1j\E[10;0j\E[15;0j\E[16;1j\E[19;0j\E[20;1j\E[29;0j\E[1;24r:tc=att5420_2:
+
+att4418|att5418|ATT5418|AT&T 5418 in 80 column mode:\
+       :am:xo:\
+       :co#80:li#24:\
+       :@8=\E[:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+       :F1=\E[n:F2=\E[o:F3=\E[H:F4=\E[I:F5=\E[J:F8=\E[K:\
+       :F9=\E[L:FA=\E[E:FB=\E[_:FC=\E[M:FD=\E[N:FE=\E[O:\
+       :IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:\
+       :al=\E[1L:as=^N:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[1P:dl=\E[M:do=\E[B:ei=:\
+       :ho=\E[H:i1=\E[?3l:ic=\E[1@:im=:is=\E)0\E?6l\E?5l:\
+       :k1=\E[h:k2=\E[i:k3=\E[j:k6=\E[k:k7=\E[l:k8=\E[f:\
+       :k9=\E[w:k;=\E[m:kC=\E[%:kd=\EU:kh=\Ec:kl=\E@:kr=\EA:\
+       :ku=\ES:le=\E[D:mb=\E[5m:me=\E[0m\017:mh=\E[2m:\
+       :mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:se=\E[0m:sf=^J:\
+       :so=\E[7m:ue=\E[0m:up=\E[A:us=\E[4m:
+att4418-w|att5418-w|AT&T 5418 in 132 column mode:\
+       :co#132:\
+       :i1=\E[?3h:tc=att5418:
+
+tty4420|teletype 4420:\
+       :da:db:eo:ms:ul:xo:\
+       :co#80:li#24:lm#72:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\Ez:cl=\EH\EJ:cm=\EY%+ %+ :\
+       :cr=\EG:dc=\EP:dl=\EM:dm@:do=\EB:ed@:ho=\EH:k0=\EU:\
+       :k3=\E@:kA=\EL:kB=\EO:kC=\EJ:kD=\EP:kF=\ES:kI=\E^:\
+       :kL=\EM:kR=\ET:kd=\EB:kh=\EH:kl=^H:kr=\EC:ku=\EA:\
+       :l0=segment advance:l3=cursor tab:le=\ED:nd=\EC:\
+       :se=\E~:sf=\EH\EM\EY7 :so=\E}:ue=\EZ:up=\EA:us=\E\\:
+
+#  The following is a termcap entry for the Teletype 4424
+#  asynchronous keyboard-display terminal.  It supports
+#  the vi editor.  The terminal must be "set up" as follows,
+#      
+#      HIGHLIGHT DEFINITION    3-TONE
+#      DISPLAY FUNCTION        GROUP III
+#      
+#  The second entry below provides limited (a la adm3a)
+#  operation under GROUP II.
+#      
+#  This must be used with DISPLAY FUNCTION GROUP I or III
+#      and HIGHLIGHT DEFINITION 3-TONE
+# The terminal has either bold or blink, depending on options
+#
+att4424|tty4424|4424-3|teletype 4424:\
+       :am:xo:\
+       :co#80:li#24:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+       :LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=\E(B:al=\EL:\
+       :as=\E(0:bl=^G:bt=\EO:cd=\EJ:ce=\Ez:cl=\E[H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\EF:dc=\EP:\
+       :dl=\EM:do=\EB:ei=:ho=\E[H:ic=\E^:im=:\
+       :is=\E[20l\E[?7h:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+       :kC=\EJ:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+       :ku=\E[A:le=^H:mb=\E3:md=\E3:me=\EX\E~\EZ\E4\E(B:\
+       :mh=\EW:mr=\E}:nd=\EC:nw=\EE:\
+       :..sa=\E[%?%p1%t7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p6%p4%|%t;5%;%?%p5%t;0%;m:\
+       :se=\E~:sf=^J:so=\E}:sr=\ET:st=\EH:ta=^I:ti=\E[1m:\
+       :ue=\EZ:up=\EA:us=\E\\:
+
+att4424-1|tty4424-1|teletype 4424 in display function group I:\
+       :kC@:kd=\EB:kh@:kl=\ED:kr=\EC:ku=\EA:tc=att4424:
+
+# The Teletype 5425 is really version 2 of the Teletype 5420. It 
+# is quite similar, except for some minor differences. No page 
+# mode, for example, so all of the cup sequences used above have 
+# to change back to what's being used for the 5410. Many of the 
+# option settings have changed their numbering as well.
+# 
+# This has been tested on a preliminary model.
+#
+att5425|tty5425|att4425|AT&T 4425/5425:\
+       :am:da:db:hs:mi:ms:xn:xo:\
+       :Nl#8:co#80:it#8:lh#2:li#24:lm#78:lw#8:ws#55:\
+       :@1=\Et:@7=\Ez:@8=\Eent:AL=\E[%dL:DC=\E[%dP:\
+       :DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:LE=\E[%dD:LF=\E|:\
+       :LO=\E~:RI=\E[%dC:SF=\E[%dE:SR=\E[%dF:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:ch=\E[%+^AG:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:cv=\E[%+^Ad:dc=\E[P:\
+       :dl=\E[M:do=^J:eA=\E(B\E)0:ec=\E[%ds\E[%dD:ei=\E[4l:\
+       :fs=\E8:ho=\E[H:i1=\E<\E[?3l:i2=\E[?5l:im=\E[4h:\
+       :is=\E[0m\017\E[1;2;3;4;6l\E[12;13;14;20l\E[?6;97;99l\E[?7h\E[4i\Ex\E[25;1j\212:\
+       :k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:\
+       :k7=\EOi:k8=\EOj:kA=\E[L:kB=\E[Z:kC=\E[J:kD=\E[P:\
+       :kE=\E[2K:kF=\E[T:kI=\E[4h:kL=\E[M:kR=\E[S:kb=^H:\
+       :kd=\E[B:ke=\E[21;0j\E[25;1j\212:kh=\E[H:kl=\E[D:\
+       :kr=\E[C:ks=\E[21;1j\E[25;4j\Eent\E~:ku=\E[A:le=^H:\
+       :ll=\E[24H:mb=\E[5m:md=\E[2;7m:me=\E[m\017:mh=\E[2m:\
+       :mk=\E[8m:mp=\EV:mr=\E[7m:nd=\E[C:nw=^M^J:pf=\E[?9i:\
+       :..pn=\E[%p1%d;0;0;0q%p2%\072-16.16s:po=\E[?4i:\
+       :ps=\E[?2i:\
+       :..px=\E[%p1%d;%p2%l%02dq   F%p1%1d           %p2%s:\
+       :r2=\Ec\E[?3l\E[2;0y:rc=\E8:\
+       :..sa=\E[0%?%p1%p5%|%t;2%;%?%p2%p6%|%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+       :ts=\E7\E[25;%p1%{8}%+%dH:ue=\E[m:up=\E[A:us=\E[4m:\
+       :vb=\E[?5h\E[?5l:ve=\E[12;0j:vs=\E[12;1j:
+
+att5425-nl|tty5425-nl|att4425-nl|AT&T 4425/5425 80 columns no labels:\
+       :ks=\E[21;1j\E[25;4j\Eent:tc=att4425:
+
+att5425-nl-w|tty5425-nl-w|att4425-nl-w|AT&T 4425/5425 132 columns no labels:\
+       :ks=\E[21;1j\E[25;4j\Eent:tc=att4425-w:
+
+tty5425-fk|att4425-fk|AT&T 4425/5425 without function keys:\
+       :ke@:ks@:tc=att5425:
+
+att5425-w|att4425-w|tty5425-w|teletype 4425/5425 in 132 column mode:\
+       :co#132:lm#54:ws#97:\
+       :i1=\E[?3h:tc=tty5425:
+
+tty5425-w-fk|att4425-w-fk|att5425-w-fk|AT&T 4425/5425 without function keys in wide mode:\
+       :ke@:ks@:tc=att5425-w:
+
+       
+# This had bogus capabilities: ri=\EM, ri=\E[1U, 
+att4426|tty4426|teletype 4426S:\
+       :am:da:db:xo:\
+       :co#80:li#24:lm#48:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+       :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
+       :ae=\E(B:al=\EL:as=\E(0:bl=^G:cd=\E[J:ce=\E[0K:\
+       :ch=\E[%dG:cl=\E[H\E[2J\E[1U\E[H\E[2J\E[1V:\
+       :cm=\E[%i%d;%dH:cr=^M:ct=\E[3g:cv=\E[%dd:dc=\EP:\
+       :dl=\E[M:do=\E[B:ei=:ho=\E[H:i1=\Ec\E[?7h:ic=\E^:im=:\
+       :is=\E[m\E[1;24r:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:\
+       :k5=\EOT:k6=\EOU:k7=\EOV:k8=\EOW:kB=\EO:kC=\E[2J:\
+       :kH=\E[24;1H:kb=^H:kd=\EB:kh=\E[H:kl=\ED:kr=\EC:\
+       :ku=\EA:le=\E[D:ll=\E[24H:md=\E[5m:me=\E[0m\E(B:\
+       :mr=\E[7m:nd=\E[C:nw=^M^J:r2=\Ec\E[?3l\E[2;0y:rc=\E8:\
+       :sc=\E7:se=\E[0m:sf=^J:so=\E[5m:sr=\ET:st=\E1:ta=^I:\
+       :ue=\E[m:up=\EA:us=\E[4m:
+
+
+# Terminfo entry for the AT&T 510 A Personal Terminal
+# Function keys 9 - 16 are available only after the 
+# screen labeled (soft keys/action blocks) are labeled.  Function key
+# 9 corresponds to the leftmost touch target on the screen,
+# function key 16 corresponds to the rightmost.
+#
+# This entry is based on one done by Ernie Rice at Summit, NJ and
+# changed by Anne Gallup, Skokie, IL, ttrdc!anne
+att510a|510a|bct510a|510A|AT&T 510A Personal Terminal:\
+       :am:mi:ms:xn:xo:\
+       :Nl#8:co#80:lh#2:li#24:lw#7:\
+       :#4=\E[u:%i=\E[v:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+       :DO=\E[%dB:F1=\EOe:F2=\EOf:F3=\EOg:F4=\EOh:F5=\EOi:\
+       :F6=\EOj:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ac=hrisjjkkllmmnnqqttuuvvwwxx{{||}}~~-f\\\054h.e+g`b:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[0J:\
+       :ce=\E[0K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:ct=\E[3g:\
+       :dc=\E[P:dl=\E[M:do=\E[1B:eA=\E(B\E)1:ff=^L:ho=\E[H:\
+       :i1=\E(B\E)1\E[2l:i2=\E[21;1|\212:k1=\EOm:k2=\EOV:\
+       :k3=\EOu:k4=\ENj:k5=\ENe:k6=\ENf:k7=\ENh:k8=\E[H:\
+       :k9=\EOc:k;=\EOd:kB=\E[Z:kF=\E[S:kR=\E[T:kb=^H:\
+       :kd=\E[B:ke=\E[19;0|:kl=\E[D:kr=\E[C:ks=\E[19;1|:\
+       :ku=\E[A:le=^H:mb=\E[5m:md=\E[2;7m:me=\E[m\017:\
+       :mh=\E[2m:mr=\E[7m:nd=\E[C:nw=\EE:pf=\E[?8i:\
+       :..pn=\E[%p1%dp%p2%\072-16s:po=\E[?4i:ps=\E[0i:\
+       :rc=\E8:\
+       :..sa=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6%|%t;7%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:ve=\E[11;3|:vi=\E[11;0|:\
+       :vs=\E[11;2|:
+
+# Terminfo entry for the AT&T 510 D Personal Terminal
+# Function keys 9 through 16 are accessed by bringing up the
+# system blocks.
+# Function key 9 corresponds to the leftmost touch target on the screen,
+# function key 16 corresponds to the rightmost.
+#
+# There are problems with soft key labeling.  These are due to 
+# strangenesses in the native terminal that are impossible to
+# describe in a terminfo.  
+att510d|510d|bct510d|510D|AT&T 510D Personal Terminal:\
+       :am:da:db:mi:ms:xn:xo:\
+       :Nl#8:co#80:lh#2:li#24:lm#48:lw#7:\
+       :#4=\E[u:%i=\E[v:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+       :DO=\E[%dB:F1=\EOe:F2=\EOf:F3=\EOg:F4=\EOh:F5=\EOi:\
+       :F6=\EOj:IC=\E[%d@:LE=\E[%dD:LF=\E<:LO=\E?:MC=\E\072:\
+       :ML=\E4:MR=\E5:RI=\E[%dC:RX=\E[29;1|:SF=\E[%dS:\
+       :SR=\E[%dT:SX=\E[29;0|:UP=\E[%dA:\
+       :ac=hrisjjkkllmmnnqqttuuvvwwxx{{||}}~~-f\\\054h.e+g`b:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[0J:\
+       :ce=\E[0K:ch=\E[%+^AG:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:ct=\E[3g:cv=\E[%+^Ad:dc=\E[P:dl=\E[M:do=\E[1B:\
+       :eA=\E(B\E)1:ei=\E[4l:ff=^L:ho=\E[H:\
+       :i1=\E(B\E)1\E[5;0|:i2=\E[21;1|\212:im=\E[4h:k1=\EOm:\
+       :k2=\EOV:k3=\EOu:k4=\ENj:k5=\ENe:k6=\ENf:k7=\ENh:\
+       :k8=\E[H:k9=\EOc:k;=\EOd:kB=\E[Z:kF=\E[S:kR=\E[T:\
+       :kb=^H:kd=\E[B:ke=\E[19;0|:kl=\E[D:kr=\E[C:\
+       :ks=\E[19;1|:ku=\E[A:le=^H:ll=\E#2:mb=\E[5m:\
+       :md=\E[2;7m:me=\E[m\017:mh=\E[2m:mk=\E[8m:mr=\E[7m:\
+       :nd=\E[C:nw=\EE:pf=\E[?8i:..pn=\E[%p1%dp%p2%\072-16s:\
+       :po=\E[?4i:ps=\E[0i:r2=\E[5;0|:rc=\E8:\
+       :..rp=%p1%c\E[%p2%{1}%-%db:\
+       :..sa=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:ve=\E[11;3|:vs=\E[11;2|:
+
+# (untranslatable capabilities removed to fit entry within 1023 bytes)
+# WARNING: this entry, 1245 bytes long, may core-dump older termcap libraries!
+att513|att513-page|513-page|attis513-pfk|513bct|AT&T 513 Terminal using page mode:\
+       :HC:am:mi:ms:xn:xo:\
+       :Nl#8:co#80:lh#2:li#24:lw#8:\
+       :!1=\EOO:!2=\EOP:!3=\EOS:#1=\EOM:#2=\ENM:#3=\ENJ:\
+       :#4=\ENK:%0=\EOt:%1=\EOm:%2=\ENi:%3=\EOl:%4=\ENc:\
+       :%5=\ENh:%6=\EOv:%7=\EOr:%8=\ENg:%9=\EOz:%a=\EOL:\
+       :%b=\ENC:%c=\ENH:%d=\EOR:%e=\ENG:%f=\EOZ:%g=\EOT:\
+       :%h=\EOY:%i=\ENL:%j=\EOQ:&0=\EOW:&1=\EOb:&2=\ENa:\
+       :&3=\EOy:&4=\EOB:&5=\EOq:&6=\EOo:&7=\EOp:&8=\EOs:\
+       :&9=\ENB:*0=\EOX:*1=\EOU:*2=\END:*3=\EON:*4=\ENF:\
+       :*5=\ENE:*6=\ENI:*7=\ENN:*8=\EOA:*9=\EOK:@0=\EOx:\
+       :@1=\E9:@2=\EOw:@3=\EOV:@4=\EOu:@5=\ENd:@6=\EOn:\
+       :@7=\E0:@8=\Eent:@9=\EOk:AL=\E[%dL:DC=\E[%dP:\
+       :DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:LE=\E[%dD:LF=\E<:\
+       :LO=\E?:RI=\E[%dC:SF=\E[%dE:SR=\E[%dF:UP=\E[%dA:\
+       :ac=hrisjjkkllmmnnqqttuuvvwwxx{{||}}~~-f\\\054h.e+g`b:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:ch=\E[%+^AG:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:cs=%i\E[%d;%dr:ct=\E[3g:cv=\E[%+^Ad:dc=\E[P:\
+       :dl=\E[M:do=^J:eA=\E(B\E)1:ei=\E[4l:ho=\E[H:\
+       :i1=\E?\E[3;3|\E[10;0|\E[21;1|\212\E[6;1|\E[1{\E[?99l:\
+       :im=\E[4h:k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:k5=\EOg:\
+       :k6=\EOh:k7=\EOi:k8=\EOj:kB=\E[Z:kC=\E[J:kD=\ENf:\
+       :kE=\EOa:kF=\E[S:kI=\ENj:kL=\ENe:kN=\E[U:kP=\E[V:\
+       :kR=\E[T:kb=^H:kd=\E[B:ke=\E[19;0|\E[21;1|\212:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:ks=\E[19;1|\E[21;4|\Eent:\
+       :ku=\E[A:le=^H:ll=\E#2:mb=\E[5m:md=\E[2;7m:\
+       :me=\E[m\017:mh=\E[2m:mk=\E[8m:mr=\E[7m:nd=\E[C:\
+       :nw=\EE:pf=\E[?98l\E[?8i::::po=\E[?98l\E[?4i:\
+       :ps=\E[?98l\E[0i::\
+       :r1=\E?\E[3;3|\E[10;0|\E[21;1|\212\E[6;1|\E[1{\E[?99l\E[2;0|\E[6;1|\E[8;0|\E[19;0|\E[1{\E[?99l:\
+       :r2=\E[5;0|:rc=\E8:::sc=\E7:se=\E[m:sf=^J:so=\E[7m:\
+       :sr=\EM:st=\EH:ta=^I:ue=\E[m:up=\E[A:us=\E[4m:\
+       :ve=\E[11;0|:vs=\E[11;1|:
+
+att500|bct500|500|AT&T-IS 500 terminal:\
+       :tc=att513:
+
+# 01-07-88
+# printer must be set to EMUL ANSI to accept ESC codes
+# cuu1 stops at top margin
+# is1 sets cpi 10,lpi 6,form 66,left 1,right 132,top 1,bottom 66,font
+#      and alt font ascii,wrap on,tabs cleared
+# is2 disables newline on LF,Emphasized off
+# The u0 capability sets form length
+# (untranslatable capabilities removed to fit entry within 1023 bytes)
+# WARNING: this entry, 1034 bytes long, may core-dump older termcap libraries!
+att5320|AT&T Model 5320 matrix printer:\
+       :YA:YD:\
+       :Ya#8192:Yi#10:Yj#12:Yk#100:Yl#72:Ym#120:co#132:it#8:\
+       :li#66:\
+       :DO=\E[%de:RI=\E[%da:\
+       :ZA=%?%p1%{10}%=%t\E[w%e%p1%{12}%=%t\E[2w%e%p1%{5}%=%t\E[5w%e%p1%{13}%=%p1%{14}%=%O%t\E[3w%e%p1%{16}%=%p1%{17}%=%O%t\E[4w%e%p1%{6}%=%t\E[6w%e%p1%{7}%=%t\E[7w%e%p1%{8}%=%t\E[8w%;:\
+       :ZB=%?%p1%{2}%=%t\E[4z%e%p1%{3}%=%t\E[5z%e%p1%{4}%=%t\E[6z%e%p1%{6}%=%t\E[z%e%p1%{8}%=%t\E[2z%e%p1%{12}%=%t\E[3z%;:\
+       :ZM=\E[5m:ZU=\E[m:\
+       :Zj=%?%p1%{0}%=%t\E(B%e%p1%{1}%=%t\E(A%e%p1%{2}%=%t\E(C%e%p1%{3}%=%t\E(D%e%p1%{4}%=%t\E(E%e%p1%{5}%=%t\E(H%e%p1%{6}%=%t\E(K%e%p1%{7}%=%t\E(R%e%p1%{8}%=%t\E(Q%e%p1%{9}%=%t\E(Y%e%p1%{10}%=%t\E(Z%e%p1%{11}%=%t\E(0%e%p1%{12}%=%t\E(1%e%p1%{13}%=%t\E(3%e%p1%{14}%=%ttM\ 1:\
+       :Zl=\E[;%dr:Zm=\E[%+^As:Zn=\E[;%+^As:Zp=\E[%dr:\
+       :Zy=%?%p1%{0}%=%tusascii%e%p1%{1}%=%tenglish%e%p1%{2}%=%tfinnish%e%p1%{3}%=%tjapanese%e%p1%{4}%=%tnorwegian%e%p1%{5}%=%tswedish%e%p1%{6}%=%tgermanic%e%p1%{7}%=%tfrench%e%p1%{8}%=%tcanadian_french%e%p1%{9}%=%titalian%e%p1%{10}%=%tspanish%e%p1%{11}%=%tline%e%p1%ÆM\ 1:\
+       :ch=\E[%d`:cr=^M:cv=\E[%dd:do=^J:ff=^L:i1=\Ec:\
+       :is=\E[20l\r:nd= :ta=^I:u0=\E[%dt:up=\EM:
+
+att5310|AT&T 5310 matrix printer:\
+       :co#80:\
+       :tc=att5320:
+
+# 5620 terminfo  (2.0 or later ROMS with char attributes)
+# assumptions: ind (scroll forward one line) is only done at screen bottom
+att5620|dmd|tty5620|ttydmd|5620|5620 terminal 88 columns:\
+       :NL:NP:am:xo:\
+       :co#88:it#8:li#70:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:IC=\E[%d@:SF=\E[%dS:\
+       :SR=\E[%dT:al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=\E[B:ei=:\
+       :ho=\E[H:ic=\E[@:im=:kC=\E[2J:kH=\E[70;1H:kb=^H:\
+       :kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+       :md=\E[2m:me=\E[0m:mh=\E[2m:mr=\E[7m:nd=\E[C:nw=^J:\
+       :..px=\E[%p1%d;%p2%l%dq%p2%s:r1=\Ec:rc=\E8:sc=\E7:\
+       :se=\E[0m:sf=\E[S:so=\E[7m:sr=\E[T:ta=^I:ue=\E[0m:\
+       :up=\E[A:us=\E[4m:
+
+att5620-24|dmd-24|teletype dmd 5620 in a 24x80 layer:\
+       :li#24:\
+       :tc=att5620:
+
+att5620-34|dmd-34|teletype dmd 5620 in a 34x80 layer:\
+       :li#34:\
+       :tc=att5620:
+
+# Entries for kf15 thru kf28 refer to the shifted system pf keys.
+#
+# Entries for kf29 thru kf46 refer to the alternate keypad mode
+# keys:  = * / + 7 8 9 - 4 5 6 , 1 2 3 0 . ENTER
+att605|605bct|AT&T 605  80 column  102key keyboard:\
+       :am:eo:xo:\
+       :Nl#8:co#80:li#24:lw#8:ws#80:\
+       :#4=\E[ A:%i=\E[ @:@7=\E[24;1H:DC=\E[%dP:DL=\E[%dM:\
+       :F1=\ENq:F2=\ENr:F3=\ENs:F4=\ENt:F5=\EOC:F6=\EOD:\
+       :F7=\EOE:F8=\EOF:F9=\EOG:FA=\EOH:FB=\EOI:FC=\EOJ:\
+       :FD=\ENO:FE=\ENP:FF=\ENQ:FG=\ENR:FH=\ENS:FI=\ENT:\
+       :FJ=\EOP:FK=\EOQ:FL=\EOR:FM=\EOS:FN=\EOw:FO=\EOx:\
+       :FP=\EOy:FQ=\EOm:FR=\EOt:FS=\EOu:FT=\EOv:FU=\EOl:\
+       :FV=\EOq:FW=\EOr:FX=\EOs:FY=\EOp:FZ=\EOn:Fa=\EOM:\
+       :IC=\E[%d@:LF=\E[2p:LO=\E[p:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=\E)0\016:bl=^G:bt=\E[Z:cb=\E[1K:\
+       :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:fs=\E8:\
+       :i1=\E[8;0|\E[?\E[13;20l\E[?\E[12h:ic=\E[@:im=\E[4h:\
+       :is=\E[0m\017:k1=\EOc:k2=\EOd:k3=\EOe:k4=\EOf:\
+       :k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:k9=\ENo:k;=\ENp:\
+       :kA=\E[L:kB=\E[Z:kC=\E[2J:kD=\E[P:kF=\E[S:kI=\E[@:\
+       :kL=\E[M:kN=\E[U:kP=\E[V:kb=^H:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:ll=\E[24H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m\017:mh=\E[2m:mk=\E[8m:mr=\E[7m:\
+       :nd=\E[C:nw=\EE:pf=\E[?4i:\
+       :..pn=\E[%p1%d;0;0;0q%p2%\072-16.16s:po=\E[?5i:\
+       :..px=\E[%p1%d;%p2%l%02dq   F%p1%1d           %p2%s:\
+       :r2=\Ec\E[?3l:rc=\E8:sc=\E7:se=\E[m:sf=^J:so=\E[7m:\
+       :ta=^I:ts=\E7\E[25;%i%p1%dx:ue=\E[m:up=\E[A:us=\E[4m:
+att605-pc|605bct-pc|ATT 605 in pc term mode:\
+       :@7=\E[F:AL=\E[L:S4=250\E[?11l\E[50;1|:\
+       :S5=400\E[50;0|:XF=g:XN=e:\
+       :ac=k\277l\332m\300j\331n\305w\302q\304u\264t\303v\301x\263:\
+       :al=\E[L:bt=\E[Z:dc=\E[P:dl=\E[M:do=\E[B:ei=:ic=\E[@:\
+       :im=:k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:k5=\E[Q:k6=\E[R:\
+       :k7=\E[S:k8=\E[T:k9=\E[U:k;=\E[V:kB=\E[Z:kD=\E[P:\
+       :kI=\E[@:kL=\E[M:kN=\E[G:kP=\E[I:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:nd=\E[C:up=\E[A:tc=att605:
+att605-w|605bct-w|AT&T 605-w 132 column 102 key keyboard:\
+       :co#132:ws#132:\
+       :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h\E(B\E)0:tc=att605:
+att610|610bct|AT&T 610; 80 column; 98key keyboard:\
+       :am:es:hs:mi:ms:xn:xo:\
+       :Nl#8:co#80:it#8:lh#2:li#24:lw#8:ws#80:\
+       :#4=\E[ @:%i=\E[ A:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+       :DO=\E[%dB:F1=\ENq:F2=\ENr:F3=\ENs:F4=\ENt:IC=\E[%d@:\
+       :LE=\E[%dD:LF=\E[2p:LO=\E[p:RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+       :cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:\
+       :fs=\E8:ho=\E[H:\
+       :i1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h\E(B\E)0:\
+       :i2=\E(B\E)0:im=\E[4h:is=\E[0m\017:k1=\EOc:k2=\EOd:\
+       :k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:\
+       :k9=\ENo:k;=\ENp:kB=\E[Z:kC=\E[2J:kF=\E[S:kR=\E[T:\
+       :kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+       :ll=\E[24H:mb=\E[5m:md=\E[1m:me=\E[m\017:mh=\E[2m:\
+       :mk=\E[8m:mr=\E[7m:nd=\E[C:nw=\EE:pf=\E[?4i:\
+       :..pn=\E[%p1%d;0;0;0q%p2%\072-16.16s:po=\E[?5i:\
+       :..px=\E[%p1%d;%p2%l%02dq   F%p1%1d           %p2%s:\
+       :r2=\Ec\E[?3l:rc=\E8:\
+       :..sa=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+       :ts=\E7\E[25;%i%p1%dx:ue=\E[m:up=\E[A:us=\E[4m:\
+       :vb=\E[?5h\E[?5l:ve=\E[?25h\E[?12l:vi=\E[?25l:\
+       :vs=\E[?12;25h:
+att610-w|610bct-w|AT&T 610; 132 column; 98key keyboard:\
+       :co#132:ws#132:\
+       :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h:tc=att610:
+
+att610-103k|610-103k|610bct-103k|AT&T 610; 80 column; 103key keyboard:\
+       :!1=\EOO:!2=\EOP:!3=\EOS:#1=\EOM:%0=\EOt:%1=\EOm:\
+       :%2=\ENi:%3=\EOl:%4=\ENc:%5=\ENh:%6=\EOv:%7=\EOr:\
+       :%8=\ENg:%9=\EOz:%a=\EOL:%b=\ENC:%c=\ENH:%d=\EOR:\
+       :%e=\ENG:%f=\EOZ:%g=\EOT:%h=\EOY:%j=\EOQ:&0=\EOW:\
+       :&1=\EOb:&2=\ENa:&3=\EOy:&4=\EOB:&5=\EOq:&6=\EOo:\
+       :&7=\EOp:&8=\EOs:&9=\ENB:*0=\EOX:*1=\EOU:*2=\END:\
+       :*3=\EON:*4=\ENF:*5=\ENE:*6=\ENI:*7=\ENN:*8=\EOA:\
+       :*9=\EOK:@0=\EOx:@1=\E9:@2=\EOw:@3=\EOV:@4=\EOu:\
+       :@5=\ENd:@6=\EOn:@7=\E0:@8=^M:@9=\EOk:F1@:F2@:F3@:\
+       :F4@:k9@:k;@:kD=\ENf:kE=\EOa:kI=\ENj:kL=\ENe:kM=\ENj:\
+       :kN=\E[U:kP=\E[V:tc=att610:
+att610-103k-w|610-103k-w|610bct-103k-w|AT&T 610; 132 column; 103key keyboard:\
+       :co#132:ws#132:\
+       :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h:tc=att610-103k:
+att615|615mt|AT&T 615; 80 column; 98key keyboard:\
+       :#4=\E[ A:%i=\E[ @:F5=\EOC:F6=\EOD:F7=\EOE:F8=\EOF:\
+       :F9=\EOG:FA=\EOH:FB=\EOI:FC=\EOJ:FD=\ENO:FE=\ENP:\
+       :FF=\ENQ:FG=\ENR:FH=\ENS:FI=\ENT:FJ=\EOP:FK=\EOQ:\
+       :FL=\EOR:FM=\EOS:FN=\EOw:FO=\EOx:FP=\EOy:FQ=\EOm:\
+       :FR=\EOt:FS=\EOu:FT=\EOv:FU=\EOl:FV=\EOq:FW=\EOr:\
+       :FX=\EOs:FY=\EOp:FZ=\EOn:Fa=\EOM:tc=att610:
+att615-w|615-w|615mt-w|AT&T 615; 132 column; 98key keyboard:\
+       :#4=\E[ A:%i=\E[ @:F5=\EOC:F6=\EOD:F7=\EOE:F8=\EOF:\
+       :F9=\EOG:FA=\EOH:FB=\EOI:FC=\EOJ:FD=\ENO:FE=\ENP:\
+       :FF=\ENQ:FG=\ENR:FH=\ENS:FI=\ENT:FJ=\EOP:FK=\EOQ:\
+       :FL=\EOR:FM=\EOS:FN=\EOw:FO=\EOx:FP=\EOy:FQ=\EOm:\
+       :FR=\EOt:FS=\EOu:FT=\EOv:FU=\EOl:FV=\EOq:FW=\EOr:\
+       :FX=\EOs:FY=\EOp:FZ=\EOn:Fa=\EOM:tc=att610-w:
+att615-103k|615-103k|615mt-103k|AT&T 615; 80 column; 103key keyboard:\
+       :#4=\E[ A:%i=\E[ @:tc=att610-103k:
+att615-103k-w|615-103k-w|615mt-103k-w|AT&T 615; 132 column; 103key keyboard:\
+       :#4=\E[ A:%i=\E[ @:tc=att610-103k-w:
+att620|620mtg|AT&T 620; 80 column; 98key keyboard:\
+       :am:es:hs:mi:ms:xn:xo:\
+       :Nl#8:co#80:it#8:lh#2:li#24:lw#8:ws#80:\
+       :#4=\E[ A:%i=\E[ @:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+       :DO=\E[%dB:F1=\ENq:F2=\ENr:F3=\ENs:F4=\ENt:F5=\EOC:\
+       :F6=\EOD:F7=\EOE:F8=\EOF:F9=\EOG:FA=\EOH:FB=\EOI:\
+       :FC=\EOJ:FD=\ENO:FE=\ENP:FF=\ENQ:FG=\ENR:FH=\ENS:\
+       :FI=\ENT:FJ=\EOP:FK=\EOQ:FL=\EOR:FM=\EOS:FN=\EOw:\
+       :FO=\EOx:FP=\EOy:FQ=\EOm:FR=\EOt:FS=\EOu:FT=\EOv:\
+       :FU=\EOl:FV=\EOq:FW=\EOr:FX=\EOs:FY=\EOp:FZ=\EOn:\
+       :Fa=\EOM:IC=\E[%d@:LE=\E[%dD:LF=\E[2p:LO=\E[p:\
+       :RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=\E(B\017:al=\E[L:as=\E)0\016:bl=^G:bt=\E[Z:\
+       :cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:\
+       :ei=\E[4l:fs=\E8:ho=\E[H:\
+       :i1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h:\
+       :i2=\E(B\E)0:im=\E[4h:is=\E[0m\017:k1=\EOc:k2=\EOd:\
+       :k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:\
+       :k9=\ENo:k;=\ENp:kB=\E[Z:kC=\E[2J:kF=\E[S:kR=\E[T:\
+       :kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+       :ll=\E[24H:mb=\E[5m:md=\E[1m:me=\E[m\E(B\017:\
+       :mh=\E[2m:mk=\E[8m:mr=\E[7m:nd=\E[C:nw=\EE:pf=\E[?4i:\
+       :..pn=\E[%p1%d;0;0;0q%p2%\072-16.16s:po=\E[?5i:\
+       :..px=\E[%p1%d;%p2%l%02dq   F%p1%1d           %p2%s:\
+       :r2=\Ec\E[?3l:rc=\E8:\
+       :..sa=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+       :ts=\E7\E[25;%i%p1%dx:ue=\E[m:up=\E[A:us=\E[4m:\
+       :vb=\E[?5h\E[?5l:ve=\E[?25h\E[?12l:vi=\E[?25l:\
+       :vs=\E[?12;25h:
+att620-w|620-w|620mtg-w|AT&T 620; 132 column; 98key keyboard:\
+       :co#132:ws#132:\
+       :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h:tc=att620:
+att620-103k|620-103k|620mtg-103k|AT&T 620; 80 column; 103key keyboard:\
+       :!1=\EOO:!2=\EOP:!3=\EOS:#1=\EOM:%0=\EOt:%1=\EOm:\
+       :%2=\ENi:%3=\EOl:%4=\ENc:%5=\ENh:%6=\EOv:%7=\EOr:\
+       :%8=\ENg:%9=\EOz:%a=\EOL:%b=\ENC:%c=\ENH:%d=\EOR:\
+       :%e=\ENG:%f=\EOZ:%g=\EOT:%h=\EOY:%j=\EOQ:&0=\EOW:\
+       :&1=\EOb:&2=\ENa:&3=\EOy:&4=\EOB:&5=\EOq:&6=\EOo:\
+       :&7=\EOp:&8=\EOs:&9=\ENB:*0=\EOX:*1=\EOU:*2=\END:\
+       :*3=\EON:*4=\ENF:*5=\ENE:*6=\ENI:*7=\ENN:*8=\EOA:\
+       :*9=\EOK:@0=\EOx:@1=\E9:@2=\EOw:@3=\EOV:@4=\EOu:\
+       :@5=\ENd:@6=\EOn:@7=\E0:@8=^M:@9=\EOk:F1@:F2@:F3@:\
+       :F4@:F5@:F6@:F7@:F8@:F9@:FA@:FB@:FC@:FD@:FE@:FF@:FG@:\
+       :FH@:FI@:FJ@:FK@:FL@:FM@:FN@:FO@:FP@:FQ@:FR@:FS@:FT@:\
+       :FU@:FV@:FW@:FX@:FY@:FZ@:Fa@:k9@:k;@:kD=\ENf:kE=\EOa:\
+       :kI=\ENj:kL=\ENe:kM=\ENj:kN=\E[U:kP=\E[V:tc=att620:
+
+att620-103k-w|620-103k-w|620mtg-103k-w|AT&T 620; 132 column; 103key keyboard:\
+       :co#132:ws#132:\
+       :i1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h:tc=att620-103k:
+
+# 630 short descriptions without \E
+att630|5630|5630DMD|630MTG|AT&T 630 windowing terminal:\
+       :NP:am:da:db:mi:ms:xo:\
+       :co#80:it#8:li#60:lm#0:\
+       :@8=^M:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\
+       :F1=\ENq:F2=\ENr:F3=\ENs:F4=\ENt:F5=\ENu:F6=\ENv:\
+       :F7=\ENw:F8=\ENx:F9=\ENy:FA=\ENz:FB=\EN{:FC=\EN|:\
+       :FD=\EN}:FE=\EN~:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:\
+       :SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:al=\E[L:bl=^G:bt=\E[Z:\
+       :cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+       :im=\E[4h:is=\E[m:k9=\ENo:k;=\ENp:kA=\E[L:kB=\E[Z:\
+       :kC=\E[2J:kD=\E[P:kI=\E[@:kL=\E[M:kb=^H:kd=\E[B:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:me=\E[m:\
+       :mr=\E[7m:nd=\E[C:nw=^M^J:pf=\E[?4i:po=\E[?5i:\
+       :..px=\E[%p1%d;%p2%l%dq%p2%s:r2=\Ec:rc=\E8:\
+       :..sa=\E[0%?%p2%t;4%;%?%p1%p3%|%p4%|%p5%|%t;7%;m:\
+       :sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:ue=\E[m:\
+       :up=\E[A:us=\E[4m:
+
+
+att630-24|5630-24|5630DMD-24|630MTG-24|AT&T 630 windowing terminal 24 lines:\
+       :li#24:\
+       :tc=att630:
+
+# This entry was modified 3/13/90 by JWE.
+# fixes include additions of enacs, correcting rep, and modification
+# of kHOM.  (See comments below)
+# has status line of 80 chars
+# These were commented out: indn=\E[%p1%dS, rin=\E[%p1%dT,
+# the k25 and up keys are used for shifted system Fkeys
+# NOTE: JWE 3/13/90 The 98 key keyboard translation for shift/HOME is 
+# currently the same as khome (unshifted HOME or \E[H).  On the 102, 102+1
+# and 122 key keyboards, the 730's translation is \E[2J.  For consistency
+# kHOM has been commented out.  The user can uncomment kHOM if using the
+# 102, 102+1, or 122 key keyboards
+#       kHOM=\E[2J,
+# (untranslatable capabilities removed to fit entry within 1023 bytes)
+# WARNING: this entry, 1063 bytes long, may core-dump older termcap libraries!
+att730|730MTG|AT&T 730 windowing terminal Version:\
+       :NP:am:da:db:es:hs:mi:ms:xn:xo:\
+       :Nl#24:co#80:it#8:lh#2:li#60:lm#0:lw#8:ws#80:\
+       :#4=\E[ @:%i=\E[ A:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+       :DO=\E[%dB:F1=\ENq:F2=\ENr:F3=\ENs:F4=\ENt:F5=\ENu:\
+       :F6=\ENv:F7=\ENw:F8=\ENx:F9=\ENy:FA=\ENz:FB=\EN{:\
+       :FC=\EN|:FD=\EN}:FE=\EN~:FF=\EOC:FG=\EOD:FH=\EOE:\
+       :FI=\EOF:FJ=\EOG:FK=\EOH:FL=\EOI:FM=\EOJ:FN=\ENO:\
+       :FO=\ENP:FP=\ENQ:FQ=\ENR:FR=\ENS:FS=\ENT:FT=\EOU:\
+       :FU=\EOV:FV=\EOW:FW=\EOX:FX=\EOY:FY=\EOZ:FZ=\EO[:\
+       :Fa=\EO :Fb=\EO]:Fc=\EO^:IC=\E[%d@:LE=\E[%dD:\
+       :LF=\E[?13h:LO=\E[?13l:RI=\E[%dC:RX=\E[?21l:\
+       :SX=\E[?21h:UP=\E[%dA:ZF=\E#6:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:\
+       :cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:eA=\E(B\E)0:\
+       :ei=\E[4l:fs=\E8:ho=\E[H:\
+       :i1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h\E(B\E)B:\
+       :i2=\E(B\E)0:im=\E[4h:is=\E[0m\017:k1=\EOc:k2=\EOd:\
+       :k3=\EOe:k4=\EOf:k5=\EOg:k6=\EOh:k7=\EOi:k8=\EOj:\
+       :k9=\ENo:k;=\ENp:kA=\E[L:kB=\E[Z:kC=\E[2J:kF=\E[S:\
+       :kI=\E[@:kR=\E[T:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m\017:\
+       :mh=\E[2m:mk=\E[8m:mr=\E[7m:nd=\E[C:nw=\EE:pf=\E[?4i:\
+       ::po=\E[?5i:ps=\E[?19h\E[0i::r2=\Ec\E[?3l:rc=\E8:::\
+       :sc=\E7:se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+       :ts=\E7\E[;%i%p1%dx:ue=\E[24m:up=\E[A:us=\E[4m:\
+       :vb=\E[?5h\E[?5l:ve=\E[?25h\E[?12l:vi=\E[?25l:\
+       :vs=\E[?12;25h::
+
+att730-41|730MTG-41|AT&T 730-41 windowing terminal Version:\
+       :li#41:\
+       :tc=att730:
+
+att730-24|730MTG-24|AT&T 730-24 windowing terminal Version:\
+       :li#24:\
+       :tc=att730:
+
+att730r|730MTGr|AT&T 730 rev video windowing terminal Version:\
+       :i1=\E[8;0|\E[?3;4;13;15l\E[?5h\E[13;20l\E[?7h\E[12h\E(B\E)B:\
+       :vb=\E[?5l\E[?5h:tc=att730:
+
+att730r-41|730MTG-41r|AT&T 730r-41 rev video windowing terminal Version:\
+       :li#41:\
+       :tc=att730r:
+
+att730r-24|730MTGr-24|AT&T 730r-24 rev video windowing terminal Version:\
+       :li#24:\
+       :tc=att730r:
+
+
+# 05-Aug-86:
+# The following Terminfo entry describes functions which are supported by
+# the AT&T 5430/pt505 terminal software version 2 and later.
+#
+# The following represents the screen layout along with the associated
+# bezel buttons for the 5430/pt505 terminal. The "kf" designations do
+# not appear on the screen but are shown to reference the bezel buttons.
+# The "CMD", "MAIL", and "REDRAW" buttons are shown in their approximate
+# position relative to the screen.
+#
+#
+#
+#      +----------------------------------------------------------------+
+#      |                                                                |
+# XXXX | kf0                                                       kf24 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf1                                                       kf23 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf2                                                       kf22 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf3                                                       kf21 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf4                                                       kf20 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf5                                                       kf19 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf6                                                       kf18 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX |                                                                | XXXX
+#      |                                                                |
+#      |                                                                |
+#      +----------------------------------------------------------------+
+#
+#          XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX
+#
+# Note: XXXX represents the screen buttons
+#                                                          CMD   REDRAW
+#
+#                                                          MAIL
+#
+# Depression of the "CMD" key sends    \E!    (kcmd)
+# Depression of the "MAIL" key sends   \E[26s (kf26)
+# "REDRAW" same as "REFRESH" (krfr)
+#
+# "kf" functions adds carriage return to output string if terminal is in
+# 'new line' mode.
+#
+# The following are functions not covered in the table above:
+#
+#       Set keyboard character (SKC): \EPn1;Pn2w
+#                       Pn1= 0 Back Space key
+#                       Pn1= 1 Break key
+#                       Pn2=   Program char (hex)
+#
+#       Screen Definition (SDF): \E[Pn1;Pn2;Pn3;Pn4;Pn5t
+#                       Pn1=     Window number (1-39)
+#                       Pn2-Pn5= Y;X;Y;X coordinates
+#
+#       Screen Selection (SSL): \E[Pnu
+#                       Pn= Window number
+#
+#       Set Terminal Modes (SM): \E[Pnh
+#                       Pn= 3 Graphics mode
+#                       Pn= > Cursor blink
+#                       Pn= < Enter new line mode
+#                       Pn= = Enter reverse insert/replace mode
+#                       Pn= ? Enter no scroll mode
+#
+#       Reset Terminal Mode (RM): \E[Pnl
+#                       Pn= 3 Exit graphics mode
+#                       Pn= > Exit cursor blink
+#                       Pn= < Exit new line mode
+#                       Pn= = Exit reverse insert/replace mode
+#                       Pn= ? Exit no scroll mode
+#
+#       Screen Status Report (SSR): \E[Pnp
+#                       Pn= 0 Request current window number
+#                       Pn= 1 Request current window dimensions
+#
+#       Device Status Report (DSR): \E[6n    Request cursor position
+#
+#       Call Status Report (CSR): \E[Pnv
+#                       Pn= 0 Call failed
+#                       Pn= 1 Call successful
+#
+#       Transparent Button String (TBS): \E[Pn1;Pn2;Pn3;{string
+#                       Pn1= Button number to be loaded
+#                       Pn2= Character count of "string"
+#                       Pn3= Key mode being loaded:
+#                               0= Unshifted
+#                               1= Shifted
+#                               2= Control
+#                       String= Text string (15 chars max)
+#
+#       Screen Number Report (SNR): \E[Pnp
+#                       Pn= Screen number
+#
+#       Screen Dimension Report (SDR): \E[Pn1;Pn2r
+#                       Pn1= Number of rows available in window
+#                       Pn2= Number of columns available in window
+#
+#       Cursor Position Report (CPR): \E[Pn1;Pn2R
+#                       Pn1= "Y" Position of cousor
+#                       Pn2= "X" Position of cursor
+#
+#       Request Answer Back (RAB): \E[c
+#
+#       Answer Back Response (ABR): \E[?;*;30;VSV
+#                       *=  0 No printer available
+#                       *=  2 Printer available
+#                       V=  Software version number
+#                       SV= Software sub version number
+#
+#       Screen Alingment Aid: \En
+#
+#       Bell (lower pitch): \E[x
+#
+#       Dial Phone Number: \EPdstring\
+#                       string= Phone number to be dialed
+#
+#       Set Phone Labels: \EPpstring\
+#                       string= Label for phone buttons
+#
+#       Set Clock: \EPchour;minute;second\
+#
+#       Position Clock: \EPsY;X\
+#                       Y= "Y" coordinate
+#                       X= "X" coordinate
+#
+#       Delete Clock: \Epr\
+#
+#       Programming The Function Buttons: \EPfPn;string\
+#                       Pn= Button number (00-06, 18-24)
+#                                         (kf00-kf06, kf18-kf24)
+#                       string= Text to sent on button depression
+#
+#       Request For Local Directory Data: \EPp12;\
+#
+#       Local Directory Data to host: \EPp11;LOCAL...DIRECTORY...DATA\
+#
+#      Request for Local Directory Data in print format: \EPp13;\
+#
+#      Enable 'Prt on Line' mode: \022 (DC2)
+#
+#      Disable 'Prt on Line' mode: \024 (DC4)
+#
+att505|pt505|att5430|gs5430|AT&T Personal Terminal 505 or 5430 GETSET terminal:\
+       :am:xo:\
+       :co#80:it#8:li#24:\
+       :&2=\E[27s:@4=\E!:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+       :DO=\E[%dB:F8=\E[18s:F9=\E[19s:FA=\E[20s:FB=\E[21s:\
+       :FC=\E[22s:FD=\E[23s:FE=\E24s:FG=\E26s:LE=\E[%dD:\
+       :RA=\E[11;1j:RI=\E[%dC:SA=\E[11;0j:UP=\E[%dA:\
+       :ae=\E[10m:al=\E[L:as=\E[11m:bl=^G:cb=\E2K:cd=\E[0J:\
+       :ce=\E[0K:cl=\E[2J\E[H:cm=\E[%d;%dH:cr=^M:dc=\E[P:\
+       :dl=\E[M:do=\E[B:ei=\E[4l:ho=\E[H:\
+       :i1=\EPr\\E[0u\E[2J\E[0;0H\E[0m\E[3l\E[<l\E[4l\E[>l\E[=l\E[?l:\
+       :im=\E[4h:k0=\E[00s:k1=\E[01s:k2=\E[02s:k3=\E[03s:\
+       :k4=\E[04s:k5=\E[05s:k6=\E[06s:kb=^H:kd=\E[B:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:md=\E[1m:me=\E[0m:\
+       :mr=\E[7m:nd=\E[C:pf=\E[4i:po=\E[5i:r1=\Ec:rc=\E8:\
+       :sc=\E7:se=\E[0m:sf=^J:so=\E[1m:ta=^I:ue=\E[0m:\
+       :up=\E[A:us=\E[4m:ve=\E[>l:vs=\E[>h:
+
+#
+# The following Terminfo entry describes functions which are supported by
+# the AT&T 5430/pt505 terminal software version 1.
+#
+# The following represents the screen layout along with the associated
+# bezel buttons for the 5430/pt505 terminal. The "kf" designations do
+# not appear on the screen but are shown to reference the bezel buttons.
+# The "CMD", "MAIL", and "REDRAW" buttons are shown in their approximate
+# position relative to the screen.
+#
+#
+#
+#      +----------------------------------------------------------------+
+#      |                                                                |
+# XXXX | kf0                                                       kf24 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf1                                                       kf23 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf2                                                       kf22 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf3                                                       kf21 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf4                                                       kf20 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf5                                                       kf19 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX | kf6                                                       kf18 | XXXX
+#      |                                                                |
+#      |                                                                |
+# XXXX |                                                                | XXXX
+#      |                                                                |
+#      |                                                                |
+#      +----------------------------------------------------------------+
+#
+#          XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX
+#
+# Note: XXXX represents the screen buttons
+#                                                          CMD   REDRAW
+#
+#                                                          MAIL
+#
+#       Depression of the "CMD" key sends    \E!    (kcmd)
+# Depression of the "MAIL" key sends   (note) (kf26)
+# "REDRAW" same as "REFRESH" (krfr)    (note)
+#
+# note: The character string sent by key 'kf26' may be user programmable
+#       to send either \E[16s, or \E[26s.
+#       The character string sent by key 'krfr' may be user programmable
+#       to send either \E[17s, or \E[27s.
+#
+# "kf" functions adds carriage return to output string if terminal is in
+# 'new line' mode.
+#
+# The following are functions not covered in the table above:
+#
+#       Set keyboard character (SKC):
+#
+#               \EPn1;Pn2w
+#
+#                       Pn1= 0 Back Space key
+#                       Pn1= 1 Break key
+#                       Pn2=   Program char (hex)
+#
+#       Screen Definition (SDF):
+#
+#               \E[Pn1;Pn2;Pn3;Pn4;Pn5t
+#
+#                       Pn1=     Window number (1-39)
+#                       Pn2-Pn5= Y;X;Y;X coordinates
+#
+#       Screen Selection (SSL):
+#
+#               \E[Pnu
+#
+#                       Pn= Window number
+#
+#       Set Terminal Modes (SM):
+#
+#               \E[Pnh
+#
+#                       Pn= 3 Graphics mode
+#                       Pn= > Cursor blink
+#                       Pn= < Enter new line mode
+#                       Pn= = Enter reverse insert/replace mode
+#                       Pn= ? Enter no scroll mode
+#
+#       Reset Terminal Mode (RM):
+#
+#               \E[Pnl
+#
+#                       Pn= 3 Exit graphics mode
+#                       Pn= > Exit cursor blink
+#                       Pn= < Exit new line mode
+#                       Pn= = Exit reverse insert/replace mode
+#                       Pn= ? Exit no scroll mode
+#
+#       Screen Status Report (SSR):
+#
+#               \E[Pnp
+#
+#                       Pn= 0 Request current window number
+#                       Pn= 1 Request current window dimensions
+#
+#       Device Status Report (DSR):
+#
+#               \E[6n    Request cursor position
+#
+#       Call Status Report (CSR):
+#
+#               \E[Pnv
+#
+#                       Pn= 0 Call failed
+#                       Pn= 1 Call successful
+#
+#       Transparent Button String (TBS):
+#
+#               \E[Pn1;Pn2;Pn3;{string
+#
+#                       Pn1= Button number to be loaded
+#                       Pn2= Character count of "string"
+#                       Pn3= Key mode being loaded:
+#                               0= Unshifted
+#                               1= Shifted
+#                               2= Control
+#                       String= Text string (15 chars max)
+#
+#       Screen Number Report (SNR):
+#
+#               \E[Pnp
+#
+#                       Pn= Screen number
+#
+#       Screen Dimension Report (SDR):
+#
+#               \E[Pn1;Pn2r
+#
+#                       Pn1= Number of rows available in window
+#                       Pn2= Number of columns available in window
+#
+#       Cursor Position Report (CPR):
+#
+#               \E[Pn1;Pn2R
+#
+#                       Pn1= "Y" Position of cousor
+#                       Pn2= "X" Position of cursor
+#
+#       Request Answer Back (RAB):
+#
+#               \E[c
+#
+#       Answer Back Response (ABR):
+#
+#               \E[?;0;30;VSV
+#
+#                       V=  Software version number
+#                       SV= Software sub version number
+#
+#       Screen Alignment Aid:
+#
+#               \En
+#
+#       Bell (lower pitch):
+#
+#               \E[x
+#
+#       Dial Phone Number:
+#
+#               \EPdstring\
+#
+#                       string= Phone number to be dialed
+#
+#       Set Phone Labels:
+#
+#               \EPpstring\
+#
+#                       string= Label for phone buttons
+#
+#       Set Clock:
+#
+#               \EPchour;minute;second\
+#
+#       Position Clock:
+#
+#               \EPsY;X\
+#
+#                       Y= "Y" coordinate
+#                       X= "X" coordinate
+#
+#       Delete Clock:
+#
+#               \Epr\
+#
+#       Programming The Function Buttons:
+#
+#               \EPfPn;string\
+#
+#                       Pn= Button number (00-06, 18-24)
+#                                         (kf00-kf06, kf18-kf24)
+#
+#                       string= Text to sent on button depression
+#
+#
+#
+#                                                      05-Aug-86
+#
+# 
+att505-24|pt505-24|gs5430-24| AT&T PT505 or 5430 GETSET version 1 24 lines:\
+       :am:xo:\
+       :co#80:it#8:li#24:\
+       :&2=\E[27s:@4=\E!:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\
+       :DO=\E[%dB:F8=\E[18s:F9=\E[19s:FA=\E[20s:FB=\E[21s:\
+       :FC=\E[22s:FD=\E[23s:FE=\E24s:FG=\E26s:LE=\E[%dD:\
+       :RI=\E[%dC:UP=\E[%dA:ae=\E[10m:al=\E[L:as=\E[11m:\
+       :bl=^G:cb=\E2K:cd=\E[0J:ce=\E[0K:cl=\E[2J\E[H:\
+       :cm=\E[%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:\
+       :ho=\E[H:\
+       :i1=\EPr\\E[0u\E[2J\E[0;0H\E[0m\E[3l\E[<l\E[4l\E[>l\E[=l\E[?l:\
+       :im=\E[4h:k0=\E[00s:k1=\E[01s:k2=\E[02s:k3=\E[03s:\
+       :k4=\E[04s:k5=\E[05s:k6=\E[06s:kb=^H:kd=\E[B:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:md=\E[1m:me=\E[0m:\
+       :mr=\E[7m:nd=\E[C:r1=\Ec:se=\E[0m:sf=^J:so=\E[1m:\
+       :ta=^I:ue=\E[0m:up=\E[A:us=\E[4m:ve=\E[>l:vs=\E[>h:
+att505-22|pt505-22|gs5430-22| AT&T PT505 or 5430 GETSET version 1 22 lines:\
+       :li#22:\
+       :tc=att505-24:
+#
+# -------------------- TERMINFO FILE CAN BE SPLIT HERE -----------------------
+# This cut mark helps make life less painful for people running ncurses tic
+# on machines with relatively little RAM.  The file can be broken in half here
+# cleanly and compiled in sections -- no `use' references cross this cut
+# going forward.
+#
+
+#### Ampex (Dialogue)
+#
+# Yes, these are the same people who are better-known for making audio- and
+# videotape.  I'm told they are located in Redwood City, CA.
+
+# From: <cbosg!ucbvax!SRC:george> Fri Sep 11 22:38:32 1981
+# (ampex80: mapped ":pt:" to default tabs; some capabilities merged in from
+# SCO's entry -- esr)
+ampex80|a80|d80|dialogue|dialogue80|ampex dialogue 80:\
+       :am:bs:bw:pt:ul:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E*:\
+       :cm=\E=%+ %+ :cr=^M:ct=\E3:dc=\EW:dl=\ER:do=^J:ei=:\
+       :ic=\EQ:im=:is=\EA:le=^H:nd=^L:se=\Ek:sf=^J:so=\Ej:\
+       :st=\E1:ta=^I:ue=\Em:up=^K:us=\El:
+# This entry was from somebody anonymous, Tue Aug  9 20:11:37 1983, who wrote:
+ampex175|ampex d175:\
+       :am:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:cd=\Ey:ce=\Et:cl=\E+:cm=\E=%+ %+ :\
+       :cr=^M:dc=\EW:dl=\ER:do=^J:ei=:ho=^^:ic=\EQ:im=:\
+       :is=\EX\EA\EF:kA=\EE:kD=\EW:kI=\EQ:kL=\ER:kd=^J:\
+       :kh=^^:kl=^H:kr=^L:ku=^K:le=^H:ll=^^^K:nd=^L:se=\Ek:\
+       :sf=^J:so=\Ej:te=\EF:ti=\EN:ue=\Em:up=^K:us=\El:
+# No backspace key in the main QWERTY cluster. Fortunately, it has a
+# NEWLINE/PAGE key just above RETURN that sends a strange single-character
+# code.  Given a suitable Unix (one that lets you set an echo-erase-as-BS-SP-BS
+# mode), this key can be used as the erase key; I find I like this. Because
+# some people and some systems may not, there is another termcap ("ampex175")
+# that suppresses this little eccentricity by omitting the relevant capability.
+ampex175-b|ampex d175 using left arrow for erase:\
+       :kb=^_:tc=ampex175:
+# From: Richard Bascove <atd!dsd!rcb@ucbvax.berkeley.edu>
+# (ampex210: removed obsolete ":kn#10:"; mapped ":pt:" to default tabs -- esr)
+ampex210|a210|ampex a210:\
+       :am:bs:hs:pt:xn:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=\EE:bt=\EI:cd=\Ey:ce=\Et:cl=\E*:cm=\E=%+ %+ :\
+       :dc=\EW:dl=\ER:ei=:fs=\E.2:ho=^^:ic=\EQ:\
+       :if=/usr/share/tabset/std:im=:\
+       :is=\EC\Eu\E'\E(\El\EA\E%\E{\E.2\EG0\Ed\En:k0=^A0\r:\
+       :k1=^A1\r:k2=^A2\r:k3=^A3\r:k4=^A4\r:k5=^A5\r:\
+       :k6=^A6\r:k7=^A7\r:k8=^A8\r:k9=^A9\r:kd=^V:kh=^^:\
+       :kl=^H:kr=^L:ku=^K:nd=^L:se=\EG0:so=\EG4:\
+       :ts=\E.0\Eg\E}\Ef:ue=\EG0:up=^K:us=\EG8:\
+       :vb=\EU\EX\EU\EX\EU\EX\EU\EX:
+ampex219|ampex-219|amp219|Ampex with Automargins:\
+       :hs:xn:\
+       :co#80:it#8:li#24:\
+       :bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:cs=%i\E[%2;%2r:do=\E[B:ho=\E[H:\
+       :is=\E>\E[?1l\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+       :k0=\E[21~:k1=\E[7~:k2=\E[8~:k3=\E[9~:k4=\E[10~:\
+       :k5=\E[11~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:\
+       :kd=\E[B:ke=\E>:kh=\E[H:kl=\E[D:kr=\E[C:ks=\E=:\
+       :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[0m:mh=\E[1m:\
+       :mr=\E[7m:nd=\E[C:se=\E[0m:sf=^J:so=\E[7m:sr=\EM:\
+       :ta=^I:ue=\E[0m:up=\E[A:us=\E[4m:
+ampex219w|ampex-219w|amp219w|Ampex 132 cols:\
+       :co#132:li#24:\
+       :bl=^G:cr=^M:do=^J:\
+       :is=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h:sf=^J:\
+       :vs=\E[?3h:tc=ampex219:
+ampex232|ampex-232|Ampex Model 232:\
+       :am:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=5*\EE:bt=\EI:cd=\EY:ce=\ET:cl=\E+:cm=\E=%+ %+ :\
+       :dc=\EW:dl=5*\ER:do=^V:ei=:ic=\EQ:\
+       :if=/usr/lib/tabset/ampex:im=:is=\Eg\El:k0=^A@\r:\
+       :k1=^AA\r:k2=^AB\r:k3=^AC\r:k4=^AD\r:k5=^AE\r:\
+       :k6=^AF\r:k7=^AG\r:k8=^AH\r:k9=^AI\r:kb=^H:kd=^V:\
+       :kh=^^:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:so=\EG4:\
+       :ta=^I:ue=\EG0:up=^K:us=\EG8:\
+       :vb=\Eb\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ed:\
+       :ve=\E.4:vi=\E.0:
+ampex232w|Ampex Model 232 / 132 columns:\
+       :co#132:li#24:\
+       :if=/usr/lib/tabset/amp-132:is=\E\034Eg\El:tc=ampex232:
+
+#### Ann Arbor (aa)
+#
+
+# Originally from Mike O'Brien@Rand and Howard Katseff at Bell Labs.
+# Highly modified 6/22 by Mike O'Brien.
+# split out into several for the various screen sizes by dave-yost@rand
+# Modifications made 3/82 by Mark Horton
+# Modified by Tom Quarles at UCB for greater efficiency and more diversity
+# status line moved to top of screen, :vb: removed 5/82
+# Some unknown person at SCO then hacked the init strings to make them more
+# efficient.
+#
+# assumes the following setup:
+#   A menu: 0000 1010  0001 0000
+#   B menu: 9600  0100 1000  0000 0000  1000 0000  17  19
+#   C menu: 56   66   0    0    9600  0110 1100
+#   D menu: 0110 1001   1   0
+#
+#      Briefly, the settings are for the following modes:
+#         (values are for bit set/clear with * indicating our preference
+#          and the value used to test these termcaps)
+#      Note that many of these settings are irelevent to the termcap
+#      and are just set to the default mode of the terminal as shipped
+#      by the factory.
+#
+# A menu: 0000 1010  0001 0000
+#      Block/underline cursor*
+#      blinking/nonblinking cursor*
+#      key click/no key click*
+#      bell/no bell at column 72*
+#
+#      key pad is cursor control*/key pad is numeric
+#      return and line feed/return for <cr> key *
+#      repeat after .5 sec*/no repeat
+#      repeat at 25/15 chars per sec. *
+#
+#      hold data until pause pressed/process data unless pause pressed*
+#      slow scroll/no slow scroll*
+#      Hold in area/don't hold in area*
+#      functions keys have default*/function keys disabled on powerup
+#
+#      show/don't show position of cursor during page transmit*
+#      unused
+#      unused
+#      unused
+#
+# B menu: 9600  0100 1000  0000 0000  1000 0000  17  19
+#      Baud rate (9600*)
+#
+#      2 bits of parity - 00=odd,01=even*,10=space,11=mark
+#      1 stop bit*/2 stop bits
+#      parity error detection off*/on
+#
+#      keyboard local/on line*
+#      half/full duplex*
+#      disable/do not disable keyboard after data transmission*
+#
+#      transmit entire page/stop transmission at cursor*
+#      transfer/do not transfer protected characters*
+#      transmit all characters/transmit only selected characters*
+#      transmit all selected areas/transmit only 1 selected area*
+#
+#      transmit/do not transmit line seperators to host*
+#      transmit/do not transmit page tab stops tabs to host*
+#      transmit/do not transmit column tab stop tabs to host*
+#      transmit/do not transmit graphics control (underline,inverse..)*
+#
+#      enable*/disable auto XON/XOFF control
+#      require/do not require receipt of a DC1 from host after each LF*
+#      pause key acts as a meta key/pause key is pause*
+#      unused
+#
+#      unused
+#      unused
+#      unused
+#      unused
+#
+#      XON character (17*)
+#      XOFF character (19*)
+#
+# C menu: 56   66   0    0    9600  0110 1100
+#      number of lines to print data on (printer) (56*)
+#
+#      number of lines on a sheet of paper (printer) (66*)
+#
+#      left margin (printer) (0*)
+#
+#      number of pad chars on new line to printer (0*)
+#
+#      printer baud rate (9600*)
+#
+#      printer parity: 00=odd,01=even*,10=space,11=mark
+#      printer stop bits: 2*/1
+#      print/do not print guarded areas*
+#
+#      new line is: 01=LF,10=CR,11=CRLF*
+#      unused
+#      unused
+#
+# D menu: 0110 1001   1   0
+#      LF is newline/LF is down one line, same column*
+#      wrap to preceeding line if move left from col 1*/don't wrap
+#      wrap to next line if move right from col 80*/don't wrap
+#      backspace is/is not destructive*
+#
+#      display*/ignore DEL character
+#      display will not/will scroll*
+#      page/column tab stops*
+#      erase everything*/erase unprotected only
+#
+#      editing extent: 0=display,1=line*,2=field,3=area
+#
+#      unused
+#
+
+annarbor|4080|ann arbor 4080:\
+       :am:\
+       :co#80:li#40:\
+       :bl=^G:cl=\014:\
+       :..cm=\017%p2%{10}%/%{16}%*%p2%{10}%m%+%c%p1%?%p1%{19}%>%t%{12}%+%;%'@'%+%c:\
+       :cr=^M:ct=^^P^P:do=^J:ho=^K:kb=^^:kd=^J:kh=^K:kl=^H:\
+       :kr=^_:ku=^N:le=^H:nd=^_:sf=^J:st=^]^P1:ta=^I:up=^N:
+
+# If you're using the GNU termcap library, add
+#      :cS=\E[%d;%d;%d;%dp:
+# to these capabilities.  This is the nonstandard GNU termcap scrolling
+# capability, arguments are:
+#   1. Total number of lines on the screen.
+#   2. Number of lines above desired scroll region.
+#   3. Number of lines below (outside of) desired scroll region.
+#   4. Total number of lines on the screen, the same as the first parameter.
+# The generic Ann Arbor entry is the only one that uses this.
+aaa+unk|aaa-unk|ann arbor ambassador (internal - don't use this directly):\
+       :5i:am:km:mi:xo:\
+       :co#80:it#8:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\EOK:\
+       :F2=\EOL:F3=\EOM:F4=\EON:F5=\EOO:F6=\EOP:F7=\EOQ:\
+       :F8=\EOR:F9=\EOS:FA=\EOT:FB=\EOU:FC=\EOV:FD=\EOW:\
+       :FE=\EOX:IC=\E[%d@:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%+^AG:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:ct=\E[2g:\
+       :cv=\E[%+^Ad:dc=\E[P:dl=\E[M:do=^K:ei=:ho=\E[H:\
+       :i1=\E[m\E7\E[H\E9\E8:i2=\E[1Q\E[>20;30l\EP`+x~M\E\\:\
+       :ic=\E[@:im=:k1=\EOA:k2=\EOB:k3=\EOC:k4=\EOD:k5=\EOE:\
+       :k6=\EOF:k7=\EOG:k8=\EOH:k9=\EOI:k;=\EOJ:kA=\E[L:\
+       :kB=\E[Z:kC=\E[J:kD=\E[P:kI=\E[@:kL=\E[M:kM=\E6:\
+       :kb=^H:kd=\E[B:\
+       :ke=\EP`>y~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\E\\:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:\
+       :ks=\EP`>z~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\E\\:\
+       :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[0m:mk=\E[8m:\
+       :mm=\E[>52h:mo=\E[>52l:mr=\E[7m:nd=\E[C:pO=\E[%dv:\
+       :pf=^C:po=\E[v:ps=\E[0i:rc=\E8:\
+       :..rp=%p1%c\E[%p2%{1}%-%db:\
+       :..sa=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m:\
+       :sc=\E7:se=\E[m:sf=^K:so=\E[7m:st=\EH:ta=^I:ue=\E[m:\
+       :up=\E[A:us=\E[4m:
+
+aaa+rv:\
+       :i1=\E[7m\E7\E[H\E9\E8:mb=\E[5;7m:md=\E[1;7m:\
+       :me=\E[7m\016:mk=\E[7;8m:mr=\E[m:r1=\E[H\E[7m\E[J:\
+       :..sa=\E[%?%p1%p3%|%!%t7;%;%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m:\
+       :se=\E[7m:so=\E[m:ue=\E[7m:us=\E[4;7m:
+# Ambassador with the DEC option, for partial vt100 compatibility.
+aaa+dec:\
+       :ac=aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz||}}:\
+       :ae=^N:as=^O:cs=\E[%i%d;%dr:eA=\E(0:\
+       :..sa=\E[%?%p1%p3%|%!%t7;%;%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m%?%p9%t\017%e\016%;:
+aaa-18|ann arbor ambassador/18 lines:\
+       :li#18:\
+       :is=\E7\E[60;0;0;18p\E8:te=\E[60;0;0;18p\E[60;1H\E[K:\
+       :ti=\E[18;0;0;18p:tc=aaa+unk:
+aaa-18-rv|ann arbor ambassador/18 lines+reverse video:\
+       :tc=aaa+rv:tc=aaa-18:
+aaa-20|ann arbor ambassador/20 lines:\
+       :li#20:\
+       :is=\E7\E[60;0;0;20p\E8:te=\E[60;0;0;20p\E[60;1H\E[K:\
+       :ti=\E[20;0;0;20p:tc=aaa+unk:
+aaa-22|ann arbor ambassador/22 lines:\
+       :li#22:\
+       :is=\E7\E[60;0;0;22p\E8:te=\E[60;0;0;22p\E[60;1H\E[K:\
+       :ti=\E[22;0;0;22p:tc=aaa+unk:
+aaa-24|ann arbor ambassador/24 lines:\
+       :li#24:\
+       :is=\E7\E[60;0;0;24p\E8:te=\E[60;0;0;24p\E[60;1H\E[K:\
+       :ti=\E[24;0;0;24p:tc=aaa+unk:
+aaa-24-rv|ann arbor ambassador/24 lines+reverse video:\
+       :tc=aaa+rv:tc=aaa-24:
+aaa-26|ann arbor ambassador/26 lines:\
+       :li#26:\
+       :is=\E7\E[60;0;0;26p\E8:te=\E[60;0;0;26p\E[26;1H\E[K:\
+       :ti=\E[H\E[J\E[26;0;0;26p:tc=aaa+unk:
+aaa-28|ann arbor ambassador/28 lines:\
+       :li#28:\
+       :is=\E7\E[60;0;0;28p\E8:te=\E[60;0;0;28p\E[28;1H\E[K:\
+       :ti=\E[H\E[J\E[28;0;0;28p:tc=aaa+unk:
+aaa-30-s|aaa-s|ann arbor ambassador/30 lines w/status:\
+       :es:hs:\
+       :li#29:\
+       :ds=\E7\E[60;0;0;30p\E[1;1H\E[K\E[H\E8\r\n\E[K:\
+       :fs=\E[>51l:is=\r\n\E[A\E7\E[60;1;0;30p\E8:\
+       :te=\E[60;1;0;30p\E[29;1H\E[K:\
+       :ti=\E[H\E[J\E[30;1;0;30p\E[30;1H\E[K:\
+       :ts=\E[>51h\E[1;%p1%dH\E[2K:tc=aaa+unk:
+aaa-30-s-rv|aaa-s-rv|ann arbor ambassador/30 lines+status line+reverse video:\
+       :tc=aaa+rv:tc=aaa-30-s:
+aaa-s-ctxt|aaa-30-s-ctxt|ann arbor ambassador/30 lines+status line+save context:\
+       :te=\E[60;1;0;30p\E[59;1H\E[K:\
+       :ti=\E[30;1H\E[K\E[30;1;0;30p:tc=aaa-30-s:
+aaa-s-rv-ctxt|aaa-30-s-rv-ct|aaa-30-srvctxt|ann arbor ambassador/30 lines; status line; saving context:\
+       :te=\E[60;1;0;30p\E[59;1H\E[K:\
+       :ti=\E[30;1H\E[K\E[30;1;0;30p:tc=aaa-30-s-rv:
+aaa|aaa-30|ambas|ambassador|ann arbor ambassador/30 lines:\
+       :li#30:\
+       :is=\E7\E[60;0;0;30p\E8:te=\E[60;0;0;30p\E[30;1H\E[K:\
+       :ti=\E[H\E[J\E[30;0;0;30p:tc=aaa+unk:
+aaa-30-rv|aaa-rv|ann arbor ambassador/30 lines in reverse video:\
+       :tc=aaa+rv:tc=aaa-30:
+aaa-30-ctxt|aaa-ctxt|ann arbor ambassador/30 lines; saving context:\
+       :te=\E[60;0;0;30p\E[60;1H\E[K:ti=\E[30;0;0;30p:tc=aaa-30:
+aaa-30-rv-ctxt|aaa-rv-ctxt|ann arbor ambassador/30 lines; saving context:\
+       :te=\E[60;0;0;30p\E[60;1H\E[K:ti=\E[30;0;0;30p:tc=aaa+rv:tc=aaa-30:
+aaa-36|ann arbor ambassador/36 lines:\
+       :li#36:\
+       :is=\E7\E[60;0;0;36p\E8:te=\E[60;0;0;36p\E[36;1H\E[K:\
+       :ti=\E[H\E[J\E[36;0;0;36p:tc=aaa+unk:
+aaa-36-rv|ann arbor ambassador/36 lines+reverse video:\
+       :tc=aaa+rv:tc=aaa-36:
+aaa-40|ann arbor ambassador/40 lines:\
+       :li#40:\
+       :is=\E7\E[60;0;0;40p\E8:te=\E[60;0;0;40p\E[40;1H\E[K:\
+       :ti=\E[H\E[J\E[40;0;0;40p:tc=aaa+unk:
+aaa-40-rv|ann arbor ambassador/40 lines+reverse video:\
+       :tc=aaa+rv:tc=aaa-40:
+aaa-48|ann arbor ambassador/48 lines:\
+       :li#48:\
+       :is=\E7\E[60;0;0;48p\E8:te=\E[60;0;0;48p\E[48;1H\E[K:\
+       :ti=\E[H\E[J\E[48;0;0;48p:tc=aaa+unk:
+aaa-48-rv|ann arbor ambassador/48 lines+reverse video:\
+       :tc=aaa+rv:tc=aaa-48:
+aaa-60-s|ann arbor ambassador/59 lines plus status line:\
+       :es:hs:\
+       :li#59:\
+       :ds=\E7\E[60;0;0;60p\E[1;1H\E[K\E[H\E8\r\n\E[K:\
+       :fs=\E[>51l:is=\r\n\E[A\E7\E[60;1;0;60p\E8:\
+       :ts=\E[>51h\E[1;%p1%dH\E[2K:tc=aaa+unk:
+aaa-60-s-rv|ann arbor ambassador/59 lines+status line+reverse video:\
+       :tc=aaa+rv:tc=aaa-60-s:
+aaa-60-s-rv-dec|ann arbor ambassador/dec mode+59 lines+status line+rev video:\
+       :tc=aaa+dec:tc=aaa+rv:tc=aaa-60-s:
+aaa-60|ann arbor ambassador/60 lines:\
+       :li#60:\
+       :is=\E7\E[60;0;0;60p\E[1Q\E[m\E[>20;30l\E8:tc=aaa+unk:
+aaa-60-rv|ann arbor ambassador/60 lines+reverse video:\
+       :tc=aaa+rv:tc=aaa-60:
+aaa-db|ann arbor ambassador 30/destructive backspace:\
+       :i2=\E[1Q\E[m\E[>20l\E[>30h:le=\E[D:tc=aaa-30:
+
+guru|guru-33|guru+unk|ann arbor guru/33 lines 80 cols:\
+       :li#33:\
+       :i2=\E[>59l:is=\E7\E[255;0;0;33;80;80p\E8\E[J:\
+       :te=\E[255p\E[255;1H\E[K:ti=\E[33p:vb=\E[>59h\E[>59l:tc=aaa+unk:
+guru+rv|guru changes for reverse video:\
+       :i2=\E[>59h:vb=\E[>59l\E[>59h:
+guru-rv|guru-33-rv|ann arbor guru/33 lines+reverse video:\
+       :tc=guru+rv:tc=guru-33:
+guru+s|changes for status line:\
+       :es:hs:\
+       :ds=\E7\E[;0p\E[1;1H\E[K\E[H\E8\r\n\E[K:fs=\E[>51l:\
+       :te=\E[255;1p\E[255;1H\E[K:\
+       :ts=\E[>51h\E[1;%p1%dH\E[2K:
+guru-nctxt:\
+       :ti=\E[H\E[J\E[33p\E[255;1H\E[K:tc=guru:
+guru-s|guru-33-s|ann arbor guru/33 lines w/status line:\
+       :li#32:\
+       :is=\r\n\E[A\E7\E[255;1;0;33;80;80p\E8\E[J:\
+       :ti=\E[33;1p\E[255;1H\E[K:tc=guru+s:tc=guru+unk:
+guru-24:\
+       :co#80:li#24:\
+       :is=\E7\E[255;0;0;24;80;80p\E8\E[J:ti=\E[24p:tc=guru+unk:
+guru-44:\
+       :co#97:li#44:\
+       :is=\E7\E[255;0;0;44;97;100p\E8\E[J:ti=\E[44p:tc=guru+unk:
+guru-44-s|ann arbor guru/44 lines w/status line:\
+       :li#43:\
+       :is=\r\n\E[A\E7\E[255;1;0;44;80;80p\E8\E[J:\
+       :ti=\E[44;1p\E[255;1H\E[K:tc=guru+s:tc=guru+unk:
+guru-76|guru with 76 lines by 89 cols:\
+       :co#89:li#76:\
+       :is=\E7\E[255;0;0;76;89;100p\E8\E[J:ti=\E[76p:tc=guru+unk:
+guru-76-s|ann arbor guru/76 lines w/status line:\
+       :co#89:li#75:\
+       :is=\r\n\E[A\E7\E[255;1;0;76;89;100p\E8\E[J:\
+       :ti=\E[76;1p\E[255;1H\E[K:tc=guru+s:tc=guru+unk:
+guru-76-lp|guru-lp|guru with page bigger than line printer:\
+       :co#134:li#76:\
+       :is=\E7\E[255;0;0;76;134;134p\E8\E[J:ti=\E[76p:tc=guru+unk:
+guru-76-w|guru 76 lines by 178 cols:\
+       :co#178:li#76:\
+       :is=\E7\E[255;0;0;76;178;178p\E8\E[J:ti=\E[76p:tc=guru+unk:
+guru-76-w-s|ann arbor guru/76 lines w/status line:\
+       :co#178:li#75:\
+       :is=\r\n\E[A\E7\E[255;1;0;76;178;178p\E8\E[J:\
+       :ti=\E[76;1p\E[255;1H\E[K:tc=guru+s:tc=guru+unk:
+guru-76-wm|guru 76 lines by 178 cols with 255 cols memory:\
+       :co#178:li#76:\
+       :is=\E7\E[255;0;0;76;178;255p\E8\E[J:ti=\E[76p:tc=guru+unk:
+aaa-rv-unk:\
+       :Nl#0:lh#0:lw#0:\
+       :i1=\E[7m\E7\E[H\E9\E8:mb=\E[5;7m:md=\E[1;7m:\
+       :me=\E[7m:mk=\E[7;8m:mr=\E[m:r1=\E[H\E[7m\E[J:\
+       :..sa=\E[%?%p1%!%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;%?%p7%t8;%;m:\
+       :se=\E[7m:so=\E[m:ue=\E[7m:us=\E[4;7m:
+
+#### Applied Digital Data Systems (adds)
+#
+# ADDS itself is long gone.  ADDS was bought by NCR, and the same group made
+# ADDS and NCR terminals.  When AT&T and NCR merged, the engineering for
+# terminals was merged again.  Then AT&T sold the terminal business to
+# SunRiver.  The engineers from Teletype, AT&T terminals, ADDS,
+# and NCR (who are still there) are at:
+#
+#      SunRiver Data Systems
+#      100 Marcus Boulevard
+#      Hauppauge, NY 117883-762
+#      Vox: (800)-231-5445
+#      Fax: (516)-342-7378
+#
+# Their voice mail describes the place as "SunRiver (formerly ADDS)". 
+
+# Regent: lowest common denominator, works on all regents.
+# (regent: renamed ":bc:" to ":le:" -- esr)
+regent|Adds Regent Series:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cl=^L:cr=^M:do=^J:ho=\EY  :le=^U:ll=^A:nd=^F:\
+       :sf=^J:up=^Z:
+# Regent 100 has a bug where if computer sends escape when user is holding
+# down shift key it gets confused, so we avoid escape.
+regent100|Adds Regent 100:\
+       :sg#1:ug#1:\
+       :bl=^G:cm=\013%+ %B\020%.:k0=^B1\r:k1=^B2\r:k2=^B3\r:\
+       :k3=^B4\r:k4=^B5\r:k5=^B6\r:k6=^B7\r:k7=^B8\r:l0=F1:\
+       :l1=F2:l2=F3:l3=F4:l4=F5:l5=F6:l6=F7:l7=F8:se=\E0@:\
+       :so=\E0P:ue=\E0@:us=\E0`:tc=regent:
+regent20|Adds Regent 20:\
+       :bl=^G:cd=\Ek:ce=\EK:cm=\EY%+ %+ :tc=regent:
+regent25|Adds Regent 25:\
+       :bl=^G:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:tc=regent20:
+regent40|Adds Regent 40:\
+       :sg#1:ug#1:\
+       :al=\EM:bl=^G:dl=\El:k0=^B1\r:k1=^B2\r:k2=^B3\r:\
+       :k3=^B4\r:k4=^B5\r:k5=^B6\r:k6=^B7\r:k7=^B8\r:l0=F1:\
+       :l1=F2:l2=F3:l3=F4:l4=F5:l5=F6:l6=F7:l7=F8:se=\E0@:\
+       :so=\E0P:ue=\E0@:us=\E0`:tc=regent25:
+regent40+|Adds Regent 40+:\
+       :is=\EB:tc=regent40:
+# (regent60: removed obsolete ":ko=dc,im,ei:" -- esr)
+regent60|regent200|Adds Regent 60:\
+       :dc=\EE:ei=\EF:im=\EF:is=\EV\EB:kD=\EE:kI=\EF:kM=\EF:\
+       :se=\ER\E0@\EV:so=\ER\E0P\EV:tc=regent40+:
+regent60na|regent 60 w/no arrow keys:\
+       :kd@:kl@:kr@:ku@:tc=regent60:
+# From: <edward@onyx.berkeley.edu> Thu Jul  9 09:27:33 1981
+# (viewpoint: added kcuf1, kf* and dl1 capabilities -- esr)
+viewpoint|addsviewpoint|adds viewpoint:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cd=\Ek:ce=\EK:cl=^L:cm=\EY%+ %+ :cr=^M:dl=\El:\
+       :do=^J:is=\017\E0`:k0=^B1:k2=^B2:k3=^B!:k4=^B":\
+       :k5=^B#:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:le=^H:ll=^A:\
+       :nd=^F:se=^O:sf=^J:so=^N:ue=^O:up=^Z:us=^N:\
+       :ve=\017\E0`:vs=\017\E0P:
+screwpoint|adds viewpoint with ^O bug:\
+       :am:bs:\
+       :Nl#0:co#80:lh#0:li#24:lw#0:\
+       :bl=^G:cd=\Ek:ce=\EK:cl=\014:cm=\EY%+ %+ :cr=^M:\
+       :dl=\El:do=^J:is=^G:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:\
+       :le=^H:ll=^A:nd=^F:sf=^J:up=^Z:
+fviewpoint|flaky adds viewpoint with ^O bug:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cd=\Ek:ce=\EK:cl=\014:cm=\EY%+ %+ :cr=^M:\
+       :dl=\El:do=^J:is=^G:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:\
+       :le=^H:ll=^A:nd=^F:sf=^J:up=^Z:
+# From: Jay S. Rouman <jsr@dexter.mi.org> 5 Jul 92
+# The civis/cnorm/sgr/sgr0 strings were added by ESR from specs.  
+# Theory; the 3a+ wants \E0%c to set highlights, where normal=01000000,
+# underline=01100000, rev=01010000, blink=01000010,dim=01000001,
+# invis=01000100 and %c is the logical or of desired attributes.
+# There is also a `tag bit' enabling attributes, set by \E) and unset by \E(.
+vp3a+|viewpoint3a+|adds viewpoint 3a+:\
+       :am:bw:\
+       :co#80:it#8:li#24:\
+       :cd=\EY:ce=\ET:cl=\E*:cm=\E=%+ %+ :cr=^M:do=^J:ho=^^:\
+       :kb=^H:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:le=^H:me=\E(:\
+       :nd=^L:nw=^M^J:\
+       :..sa=\E0%'@'%?%p1%tQ%|%;%?%p2%t%'`'%|%;%?%p3%tP%|%;%?%p4%t%{2}%|%;%?%p5%t%{1}%|%;%?%p7%tD%|%;%c\E):\
+       :se=\E(:sf=^J:so=\E0Q\E):ta=^I:up=^K:ve=^X:vi=^W:
+vp60|viewpoint60|addsviewpoint60|adds viewpoint60:\
+       :tc=regent40:
+#
+# adds viewpoint 90 - from cornell
+# Note:  emacs sends ei occasionally to insure the terminal is out of
+#        insert mode. This unfortunately puts the viewpoint90 IN insert
+#        mode.  A hack to get around this is :ic=\EF \EF^U:.  (Also,
+#   -    :ei=:im=: must be present in the termcap translation.)
+#   -    :xs: indicates glitch that attributes stick to location
+#   -    :ms: means it's safe to move in standout mode
+#   -    :cl=\EG\Ek: clears screen and visual attributes without affecting
+#               the status line
+# Function key and label capabilities merged in from SCO.
+vp90|viewpoint90|adds viewpoint 90:\
+       :bs:bw:ms:xs:\
+       :co#80:li#24:\
+       :cd=\Ek:ce=\EK:cl=\EG\Ek:cm=\EY%+ %+ :dc=\EE:dl=\El:\
+       :do=^J:ei=:ho=\EY  :ic=\EF \EF\025:im=:k0=^B1\r:\
+       :k1=^B2\r:k2=^B3\r:k3=^B4\r:k4=^B5\r:k5=^B6\r:\
+       :k6=^B7\r:k7=^B8\r:k8=^B9\r:k9=^B\072\r:k;=^B;\r:\
+       :kb=^H:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:l0=F1:l1=F2:\
+       :l2=F3:l3=F4:l4=F5:l5=F6:l6=F7:l7=F8:l8=F9:l9=F10:\
+       :la=F11:ll=^A:nd=^F:se=\ER\E0@\EV:sf=^J:\
+       :so=\ER\E0Q\EV:ta=^I:ue=\ER\E0@\EV:up=^Z:\
+       :us=\ER\E0`\EV:
+# Note: if return acts weird on a980, check internal switch #2
+# on the top chip on the CONTROL pc board.
+adds980|a980|adds consul 980:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\E\016:bl=^G:cl=\014\013@:cm=\013%+@\E\005%2:\
+       :cr=^M:dl=\E\017:do=^J:k0=\E0:k1=\E1:k2=\E2:k3=\E3:\
+       :k4=\E4:k5=\E5:k6=\E6:k7=\E7:k8=\E8:k9=\E9:le=^H:\
+       :nd=\E^E01:se=^O:sf=^J:so=^Y^^^N:
+
+#### C. Itoh Electronics
+#
+# As of 1995 these people no longer make terminals (they're still in the
+# printer business).  Their terminals were all clones of the DEC VT series.
+# They're located in Orange County, CA.
+#
+
+# CIT 80  - vt-52 emulator, the termcap has been modified to remove
+#           the delay times and do an auto tab set rather than the indirect
+#           file used in vt100.
+cit80|cit-80|citoh 80:\
+       :am:bs:\
+       :co#80:li#24:\
+       :cd=\EJ:ce=\EK:cl=\E[;H\EJ:cm=\E[%i%2;%2H:cr=^M:\
+       :ff=^L:is=\E>:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:\
+       :ks=\E[?1h\E=:ku=\EOA:nd=\E[C:sf=^J:up=\E[A:
+# Alternate cit101 (vt100 em) file used in vt100.
+#          Uses 23 lines so can run citsys (like h19sys).
+#      24 May 85 (mtxinu!sybase!tim) - removed 2-byte limit on :cm: cursor
+#        coordinates otherwise there is garbling on long lines in 
+#        co#132 mode; also added support for multipage memory on the Itoh.
+# From: Tim Wood <mtxinu!sybase!tim> Fri Sep 27 09:39:12 PDT 1985
+citc|Citoh fast vt100:\
+       :am:bs:xn:\
+       :co#80:li#23:\
+       :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:\
+       :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:ei=:ic=\E[@:im=:\
+       :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[3g\E[>5g:\
+       :kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+       :ku=\EOA:nd=\E[C:se=\E[m:so=\E[7m:ue=\E[m:up=\E[A:\
+       :us=\E[4m:\
+       :vb=\E[?5h\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\E[?5l:\
+       :ve=\E[V\E8:vs=\E7\E[U:
+cita:\
+       :am:bs:xn:\
+       :co#80:li#23:\
+       :cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:cm=\E[%i%d;%dH:\
+       :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[3g\E[>5g:\
+       :kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+       :ku=\EOA:nd=\E[C:se=\E[m:so=\E[7m:ue=\E[m:up=\E[A:\
+       :us=\E[4m:\
+       :vb=\E[?5h\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\E[?5l:\
+       :ve=\E[V\E8:vs=\E7\E[U:
+cit101:\
+       :li#24:\
+       :vb@:tc=citc:
+cit101b:\
+       :li#24:\
+       :tc=citc:
+# The CIT-500 was unusual in that it had a portrait-style display.
+# (cit500: mapped ":pt:" to default tabs -- esr)
+cit500|cit-500|cit 500:\
+       :am:bs:pt:xn:\
+       :co#80:li#40:\
+       :al=\E[L:cd=50\E[J:ce=3\E[K:cl=50\E[;H\E[2J:\
+       :cm=5\E[%i%2;%2H:dc=\E[P:dl=\E[M:do=\ED:\
+       :is=\E(B\E)0\E>\E[?3l\E[?7h\E[?8h:k1=\EOP:k2=\EOQ:\
+       :k3=\EOR:k4=\EOS:kd=\EOB:ke=\E[?1l\E>:kh=\E[H:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:nd=2\E[C:\
+       :se=2\E[m:so=2\E[7m:sr=5\EM:ue=2\E[m:up=2\E[A:\
+       :us=2\E[4m:
+
+citoh|ci8510|8510|c.itoh 8510a:\
+       :co#80:it#8:\
+       :is=\E(009\054017\054025\054033\054041\054049\054057\054065\054073.:\
+       :le@:md=\E!:me=\E"\EY:rp=\ER%r%03%.:sr=\Er:ue=\EY:\
+       :us=\EX:tc=lpr:
+citoh-pica|citoh in pica:\
+       :i1=\EN:tc=citoh:
+citoh-elite|citoh in elite:\
+       :co#96:\
+       :i1=\EE:\
+       :is=\E(009\054017\054025\054033\054041\054049\054057\054065\054073\054081\054089.:tc=citoh:
+citoh-comp|citoh in compressed:\
+       :co#136:\
+       :i1=\EQ:\
+       :is=\E(009\054017\054025\054033\054041\054049\054057\054065\054073\054081\054089\054097\054105\054113\054121\054129.:tc=citoh:
+# citoh has infinite cols because we don't want lp ever inserting \n\t**.
+citoh-prop|citoh-ps|ips|citoh in proportional spacing mode:\
+       :co#32767:\
+       :i1=\EP:tc=citoh:
+citoh-6lpi|citoh in 6 lines per inch mode:\
+       :i2=\EA:tc=citoh:
+citoh-8lpi|citoh in 8 lines per inch mode:\
+       :li#88:\
+       :i2=\EB:tc=citoh:
+
+#### Control Data (cdc)
+#
+
+cdc456|cdc:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\EL:bl=^G:cd=^X:ce=^V:cl=^Y^X:cm=\E1%+ %+ :cr=^M:\
+       :dl=\EJ:do=^J:ho=^Y:le=^H:nd=^L:sf=^J:up=^Z:
+cdc456tst:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cl=^Y^X:cm=\E1%+ %+ :cr=^M:do=^J:le=^H:sf=^J:
+
+#### Human Designed Systems (Concept)
+#
+#      Human Designed Systems
+#      400 Fehley Drive
+#      King of Prussia, PA 19406
+#      Vox: (610)-277-8300
+#      Fax: (610)-275-5739
+#      Net: support@hds.com
+# 
+# John Martin <john@hds.com> is their termcap expert.  They're mostly out of
+# the character-terminal business now (1995) and making X terminals.  In
+# particular, the whole `Concept' line described here was discontinued long
+# ago.
+
+# From: <vax135!hpk>  Sat Jun 27 07:41:20 1981
+# Extensive changes to c108 by arpavax:eric Feb 1982
+# Some unknown person at SCO then translated it to terminfo.
+#
+# There seem to be a number of different versions of the C108 PROMS
+# (with bug fixes in its Z-80 program).
+# 
+# The first one that we had would lock out the keyboard of you
+# sent lots of short lines (like /usr/dict/words) at 9600 baud.
+# Try that on your C108 and see if it sends a ^S when you type it.
+# If so, you have an old version of the PROMs.
+# 
+# You should configure the C108 to send ^S/^Q before running this.
+# It is much faster (at 9600 baud) than the c100 because the delays
+# are not fixed.
+# new status line display entries for c108-8p:
+# is3 - init str #3 - setup term for status display - 
+# set programmer mode, select window 2, define window at last 
+# line of memory, set bkgnd stat mesg there, select window 0.
+# 
+# tsl - to status line - select window 2, home cursor, erase to 
+# end-of-window, 1/2 bright on, goto(line#0, col#?)
+# 
+# fsl - from status line - 1/2 bright off, select window 0
+# 
+# dsl - disable status display - set bkgnd status mesg with 
+# illegal window #
+# 
+# There are probably more function keys that should be added but 
+# I don't know what they are.
+#
+c108|concept108|c108-8p|concept108-8p|concept 108 w/8 pages:\
+       :i2=\EU\E z"\Ev\001\177 !p\E ;"\E z \Ev  \001\177p\Ep\n:\
+       :te=\Ev  \001\177p\Ep\r\n:tc=c108-4p:
+c108+acs|alternate charset defns for c108:\
+       :ac=l\\qLkTxUmMjE:ae=\Ej :as=\Ej!:
+c108-4p-acs|c108-4p w/ acs:\
+       :tc=c108+acs:tc=c108-4p:
+c108-8p-acs|c108-8p w/ acs:\
+       :tc=c108+acs:tc=c108-8p:
+c108-rv-8p-acs|c108-rv-8p w/ acs:\
+       :tc=c108+acs:tc=c108-rv-8p:
+c108-4p|concept108-4p|concept 108 w/4 pages:\
+       :es:hs:xo:\
+       :pb@:\
+       :..cm=\Ea%p1%?%p1%{95}%>%t\001%{96}%-%;%{32}%+%c%p2%?%p2%{95}%>%t\001%{96}%-%;%{32}%+%c:\
+       :cr=^M:dc=\E 1:ds=\E ;\177:fs=\Ee\E z :i1=\EK\E!\E F:\
+       :i2=\EU\E z"\Ev\177 !p\E ;"\E z \Ev  \001 p\Ep\n:\
+       :sf=^J:te=\Ev  \001 p\Ep\r\n:\
+       :ti=\EU\Ev  8p\Ep\r\E\025:\
+       :ts=\E z"\E?\E\005\EE\Ea %+ :ve=\Ew:vs=\EW:tc=c100:
+c108-rv|c108-rv-8p|concept 108 w/8 pages in reverse video:\
+       :te=\Ev  \002 p\Ep\r\n:ti=\EU\Ev  8p\Ep\r:tc=c108-rv-4p:
+c108-rv-4p|concept108-rv-4p|concept108rv4p|concept 108 w/4 pages in reverse video:\
+       :i1=\Ek:se=\Ee:so=\EE:vb=\EK\Ek:tc=c108-4p:
+c108-rv-4p-acs|c108-rv-4p w/ acs:\
+       :tc=c108+acs:tc=c108-rv-4p:
+c108-na|c108-na-8p|c108-8p-na|concept108-na-|concept108na8p|concept 108 w/8 pages no arrows:\
+       :k7=\E;:k8=\E<:k9=\E=:ke@:ks@:tc=c108-8p:
+c108-na-acs|c108-na w/ acs:\
+       :tc=c108+acs:tc=c108-na:
+c108-rv-na|c108-rv-na-8p|c108-8p-rv-na|concept 108 8 pages no arrows rev video:\
+       :k7=\E;:k8=\E<:k9=\E=:ke@:ks@:tc=c108-rv-8p:
+c108-rv-na-acs|c108-na w/ acs:\
+       :tc=c108+acs:tc=c108-rv-na:
+c108-w|c108-w-8p|concept108-w-8|concept108-w8p|concept 108 w/8 pages in wide mode:\
+       :co#132:\
+       :i1=\E F\E":te=\Ev  ^A0\001D\Ep\r\n:\
+       :ti=\EU\Ev  8\001D\Ep\r:tc=c108-8p:
+c108-w-acs|c108-w w/ acs:\
+       :tc=c108+acs:tc=c108-w:
+
+# Concept 100:
+# These have only window relative cursor addressing, not screen 
+# relative. To get it to work right here, smcup/rmcup (which 
+# were invented for the concept) lock you into a one page 
+# window for screen style programs.
+# 
+# To get out of the one page window, we use a clever trick:
+# we set the window size to zero ("\Ev    " in rmcup) which the 
+# terminal recognizes as an error and resets the window to all 
+# of memory.
+# 
+# This trick works on c100 but does not on c108, sigh.
+# 
+# Some tty drivers use cr3 for concept, others use nl3, hence 
+# the delays on cr and ind below. This padding is only needed at 
+# 9600 baud. One or the other is commented out depending on 
+# local conventions.
+# 
+# 2 ms padding on rmcup isn't always enough. 6 works fine. Maybe 
+# less than 6 but more than 2 will work.
+# 
+# Note: can't use function keys f7-f10 because they are 
+# indistinguishable from arrow keys (!), also, del char and 
+# clear eol use xon/xoff so they probably won't work very well.
+# 
+# Also note that we don't define insrt/del char/delline/eop/send 
+# because they don't transmit unless we reset them - I figured 
+# it was a bad idea to clobber their definitions.
+# 
+# The mc5 sequence changes the escape character to ^^ so that 
+# escapes will be passed through to the printer. Only trouble 
+# is that ^^ won't be - ^^ was chosen to be unlikely. 
+# Unfortunately, if you're sending raster bits through to be 
+# plotted, any character you choose will be likely, so we lose.
+#
+# \EQ"\EY(^W (send anything from printer to host, for xon/xoff) 
+# cannot be # in is2 because it will hang a c100 with no printer 
+# if sent twice.
+c100|concept100|concept|c104|c100-4p|hds concept 100:\
+       :am:eo:mi:ul:xn:\
+       :co#80:li#24:pb#9600:vt#8:\
+       :al=\E\022:bl=^G:cd=\E\005:ce=\E\025:cl=\E?\E\005:\
+       :cm=\Ea%+ %+ :cr=\r:dc=\E\021:dl=\E\002:do=^J:\
+       :ei=\E  :i1=\EK:i2=\Ev    \Ep\n:im=\E^P:ip=:\
+       :is=\EU\Ef\E7\E5\E8\El\ENH\E\200\Eo&\200\Eo'\E\Eo!\200\E\007!\E\010A@ \E4#\072"\E\072a\E4#;"\E\072b\E4#<"\E\072c:\
+       :k1=\E5:k2=\E6:k3=\E7:k4=\E8:k5=\E9:k6=\E\072a:\
+       :k7=\E\072b:k8=\E\072c:kA=\E^R:kB=\E':kD=\E^Q:\
+       :kE=\E^S:kF=\E[:kI=\E^P:kL=\E^B:kM=\E\200:kN=\E-:\
+       :kP=\E.:kR=\E\\:kS=\E^C:kT=\E]:kb=^H:kd=\E<:ke=\Ex:\
+       :kh=\E?:kl=\E>:kr=\E=:ks=\EX:kt=\E_:ku=\E;:le=^H:\
+       :mb=\EC:me=\EN@:mh=\EE:mk=\EH:mp=\EI:mr=\ED:nd=\E=:\
+       :pf=\036o \E\EQ!\EYP\027:po=\EQ"\EY(\027\EYD\Eo \036:\
+       :rp=\Er%.%+ :se=\Ed:sf=^J:so=\ED:ta=\011:\
+       :te=\Ev    \Ep\r\n:ti=\EU\Ev  8p\Ep\r\E\025:ue=\Eg:\
+       :up=\E;:us=\EG:vb=\Ek\EK:
+c100-rv|c100-rv-4p|concept100-rv|c100 rev video:\
+       :i1=\Ek:se=\Ee:so=\EE:vb=\EK\Ek:ve@:vs@:tc=c100:
+c100-rv-na|c100-rv-4p-na|c100 with no arrows:\
+       :ke@:ks@:tc=c100-rv:
+oc100|oconcept|c100-1p|old 1 page concept 100:\
+       :in:\
+       :i3@:tc=c100:
+
+# ht through el included to specify padding needed in raw mode.
+avt-ns|concept avt with status lins disabled:\
+       :am:eo:mi:ul:xn:xo:\
+       :co#80:it#8:li#24:lm#192:\
+       :AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:LE=\E[%dD:\
+       :RI=\E[%dC:UP=\E[%dA:ae=\016:al=\E[L:as=\017:bl=^G:\
+       :bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%+^AG:cl=\E[H\E[J:\
+       :cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:ct=\E[2g:\
+       :cv=\E[%+^Ad:dc=\E[P:dl=\E[M:do=^J:ei=\E4l:ho=\E[H:\
+       :i1=\E[=103l\E[=205l:ic=\E[@:im=\E1:ip=:\
+       :is=\E[1*q\E[2!t\E[7!t\E[=4;101;119;122l\E[=107;118;207h\E)1\E[1Q\EW\E[!y\E[!z\E>\E[0\0720\07232!r\E[0*w\E[w\E2\r\n\E[2;27!t:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kA=\E^C\r:kD=\E^B\r:\
+       :kI=\E^A\r:kS=\E^D\r:kb=^H:kd=\E[B:ke=\E[!z\E[0;2u:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:ks=\E[1!z\E[0;3u:ku=\E[A:\
+       :le=^H:ll=\E[24H:mb=\E[5m:md=\E[1m:me=\E[m:mh=\E[1!{:\
+       :mk=\E8m:mp=\E[99m:mr=\E[7m:nd=\E[C:pf=\E[4i:\
+       :pl=\E[%d;0u#%s#:po=\E[5i:ps=\E[0i:px=\E[%d;1u#%s#:\
+       :rc=\E8:..rp=%p1%c\E[%p2%{1}%-%db:\
+       :..sa=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m:\
+       :sc=\E7:se=\E[7!{:sf=\n:so=\E[7m:sr=\EM:st=\EH:\
+       :ta=\011:te=\E[w\E2\r\n:ti=\E[=4l\E[1;24w\E2\r:\
+       :ue=\E[4!{:up=\E[A:us=\E[4m:ve=\E[=119l:vs=\E[=119h:
+avt-rv-ns|concept avt in reverse video mode/no status line:\
+       :i1=\E[=103l\E[=205h:vb=\E[=205l\E[=205h:tc=avt-ns:
+avt-w-ns|concept avt in 132 column mode/no status line:\
+       :i1=\E[=103h\E[=205l:ti=\E[H\E[1;24;1;132w:tc=avt-ns:
+avt-w-rv-ns|concept avt in 132 column mode/no status line:\
+       :i1=\E[=103h\E[=205h:ti=\E[H\E[1;24;1;132w:\
+       :vb=\E[=205l\E[=205h:tc=avt-ns:
+
+# Concept AVT with status line. We get the status line using the
+# "Background status line" feature of the terminal. We swipe the
+# first line of memory in window 2 for the status line, keeping
+# 191 lines of memory and 24 screen lines for regular use.
+# The first line is used instead of the last so that this works
+# on both 4 and 8 page AVTs. (Note the lm#191 or 192 - this
+# assumes an 8 page AVT but lm isn't currently used anywhere.)
+#
+avt+s|concept avt status line changes:\
+       :es:hs:\
+       :lm#191:\
+       :ds=\E[0*w:fs=\E[1;1!w:\
+       :i2=\E[2w\E[2!w\E[1;1;1;80w\E[H\E[2*w\E[1!w\E2\r\n:\
+       :te=\E[2w\E2\r\n:ti=\E[2;25w\E2\r:\
+       :ts=\E[2;1!w\E[;%p1%dH\E[2K:
+avt|avt-s|concept-avt|avt w/80 columns:\
+       :tc=avt+s:tc=avt-ns:
+avt-rv|avt-s-rv|avt-rv-s|concept avt in reverse video w/status line:\
+       :i1=\E[=103l\E[=205h:vb=\E[=205l\E[=205h:tc=avt+s:tc=avt-ns:
+avt-w|avt-w-s|concept avt in 132 column mode w/status line:\
+       :i1=\E[=103h\E[=205l:ti=\E[H\E[1;24;1;132w:tc=avt+s:tc=avt-ns:
+avt-w-rv|avt-rv-w|avt-w-s-rv|avt-w-rv-s|avt 132 cols w/status line:\
+       :i1=\E[=103h\E[=205h:ti=\E[H\E[1;24;1;132w:\
+       :vb=\E[=205l\E[=205h:tc=avt+s:tc=avt-ns:
+
+#### Contel Business Systems. 
+#
+
+# Contel c300 and c320 terminals. 
+contel300|contel320|c300|Contel Business Systems C-300 or C-320:\
+       :am:in:xo:\
+       :co#80:li#24:sg#1:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EI:cl=\EK:cm=\EX%+ \EY%+ :\
+       :cr=^M:ct=\E3:dc=\EO:dl=\EM:do=^J:ei=:ho=\EH:ic=\EN:\
+       :im=:ip=:k0=\ERJ:k1=\ERA:k2=\ERB:k3=\ERC:k4=\ERD:\
+       :k5=\ERE:k6=\ERF:k7=\ERG:k8=\ERH:k9=\ERI:kb=^H:le=^H:\
+       :ll=\EH\EA:nd=\EC:se=\E!\200:sf=^J:so=\E!\r:st=\E1:\
+       :up=\EA:vb=\020\002\020\003:
+# Contel c301 and c321 terminals.
+contel301|contel321|c301|c321|Contel Business Systems C-301 or C-321:\
+       :am:in:xo:\
+       :co#80:li#24:sg#1:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EI:cl=\EK:cm=\EX%+ \EY%+ :\
+       :cr=^M:ct=\E3:dc=\EO:dl=\EM:do=^J:ho=\EH:k0=\ERJ:\
+       :k1=\ERA:k2=\ERB:k3=\ERC:k4=\ERD:k5=\ERE:k6=\ERF:\
+       :k7=\ERG:k8=\ERH:k9=\ERI:kb=^H:le=^H:ll=\EH\EA:\
+       :nd=\EC:se=\E!\200:sf=^J:so=\E!\r:st=\E1:up=\EA:
+
+#### Data General (dg)
+#
+# According to James Carlson <carlson@xylogics.com> writing in January 1995,
+# the terminals group at Data General was shut down in 1991; all these
+# terminals have thus been discontinued.
+#
+
+dg200|data general dasher 200:\
+       :NL:am:bw:\
+       :co#80:li#24:\
+       :bl=^G:ce=^K:cl=^L:cm=\020%r%.%.:cr=^M:do=^Z:ho=^H:\
+       :k0=^^z:k1=^^q:k2=^^r:k3=^^s:k4=^^t:k5=^^u:k6=^^v:\
+       :k7=^^w:k8=^^x:k9=^^y:kd=^Z:kh=^H:kl=^Y:kr=^X:ku=^W:\
+       :l0=f10:le=^Y:nd=^X:nw=^J:se=^^E:sf=^J:so=^^D:ue=^U:\
+       :up=^W:us=^T:
+#
+# dg450 and dg200 from cornell
+dg450|dg6134|data general 6134:\
+       :bs@:\
+       :nd=^X:tc=dg200:
+# Note: lesser Dasher terminals will not work with vi because vi insists upon
+# having a command to move straight down from any position on the bottom line
+# and scroll the screen up, or a direct vertical scroll command.  The 460 and
+# above have both, the D210/211, for instance, has neither.  We must use ANSI
+# mode rather than DG mode because standard UNIX tty drivers assume that ^H is
+# backspace on all terminals.  This is not so in DG mode.
+# (dg460-ansi: removed obsolete ":kn#6:"; also removed ":mu=\EW:", on the
+# grounds that there is no matching ":ml:"; mapped ":pt:" to default tabs; 
+# fixed garbled ":k9=\E[00\:z:" capability -- esr)
+dg460-ansi|Data General Dasher 460, ANSI-mode:\
+       :am:bs:ms:pt:ul:\
+       :co#80:li#24:\
+       :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[2J:cm=\E[%i%2;%2H:\
+       :dc=\E[P:dl=\E[M:do=\E[B:ei=:ho=\E[H:ic=\E[@:im=:\
+       :is=^^F@:k0=\E[001z:k1=\E[002z:k2=\E[003z:k3=\E[004z:\
+       :k4=\E[005z:k5=\E[006z:k6=\E[007z:k7=\E[008z:\
+       :k8=\E[009z:k9=\E[010z:kb=\E[D:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:l0=f1:l1=f2:l2=f3:l3=f4:\
+       :l4=f5:l5=f6:l6=f7:l7=f8:l9=f10:le=^H:mb=\E[5m:\
+       :me=\E[0m:mh=\E[2m:mr=\E[7m:nd=\E[C:nl=\ED:se=\E[0m:\
+       :sf=\E[S:so=\E[7m:sr=\E[T:ue=\E[05:up=\E[A:us=\E[4m:
+# From: Wayne Throop <mcnc!rti-sel!rtp47!throopw>
+# Data General 605x     
+# Ought to work for a Model 6242, Type D210 as well as a 605x.
+# Note that the cursor-down key transmits ^Z.  Job control users, beware!
+dg6053|data general 6053:\
+       :am:bs:bw:pt:ul:\
+       :co#80:li#24:\
+       :bl=^G:ce=^K:cl=^L:cm=\020%r%.%.:cr=^M:do=^Z:ho=^H:\
+       :is=^R:k0=^^q:k1=^^r:k2=^^s:k3=^^t:k4=^^u:k5=^^v:\
+       :k6=^^w:k7=^^x:k8=^^y:kb=^Y:kd=^Z:kh=^H:kl=^Y:kr=^X:\
+       :ku=^W:le=^Y:nd=^X:nw=^M^Z:se=\200^^E:\
+       :so=\200\200\200\200\200\036D:ta=^I:te=^L:ti=^L^R:\
+       :ue=^U:up=^W:us=^T:ve=^L:vs=^L^R:
+# From: Peter N. Wan <ihnp4!gatech!gacsr!wan>
+# courtesy of Carlos Rucalde of Vantage Software, Inc.
+dgd211|Data General d211:\
+       :am:bw:\
+       :co#80:li#24:\
+       :ce=^K:cl=^L:..cm=\020%r%.%.:cr=^M:do=^Z:ho=^H:kb=^Y:\
+       :kd=^Z:kh=^H:kl=^Y:kr=^X:ku=^W:le=^Y:nd=^X:nw=^M^Z:\
+       :se=00\036E\200/>:so=00\036D\200\200\200\200\200/>:\
+       :ta=^I:te=^L:ti=^L^R:ue=^U:up=^W:us=^T:ve=^L:vs=^L^R:
+# From: Joan Walter <joanw@BRL.ARPA>
+# Data General/One
+#  David Holub got the dg1 to work with jove with this termcap
+#   by making li#23 and co#78 to comply with obvious terminal
+#   capabilities.  Still waiting for documentation.
+# Data General/One from  modified DG Dasher DG210/211 (bw removed)
+# From: Peter N. Wan <ihnp4!gatech!gacsr!wan>
+# courtesy of Carlos Rucalde of Vantage Software, Inc.
+dg1|Data General/One:\
+       :am:\
+       :co#78:li#23:\
+       :ce=^K:cl=^L:cm=\020%r%.%.:cr=^M:do=^Z:ho=^H:kb=^Y:\
+       :kd=^Z:kh=^H:kl=^Y:kr=^X:ku=^W:le=^Y:nd=^X:nw=^M^Z:\
+       :ta=^I:up=^W:
+
+#### Datamedia (dm)
+#
+
+cs10|colorscan|Datamedia Color Scan 10:\
+       :ms:\
+       :co#80:li#24:\
+       :bl=^G:cd=\E[J:ce=\E[K:cl=\E[;H\E[J:cm=\E[%i%02;%02H:\
+       :cr=^M:do=^J:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\E[B:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:nd=\E[C:se=\E[m:sf=^J:\
+       :so=\E[7m:ue=\E[m:up=\E[A:us=\E[4m:
+cs10-w|Datamedia Color Scan 10 with 132 columns:\
+       :co#132:\
+       :cm=\E[%i%02;%03H:tc=cs10:
+
+# (dm1520: removed obsolete ":ma=^\ ^_^P^YH:";
+# mapped ":pt:" to default tabs -- esr)
+dm1520|dm1521|datamedia 1520:\
+       :am:bs:pt:xn:\
+       :co#80:li#24:\
+       :bl=^G:cd=^K:ce=^]:cl=^L:cm=\036%r%+ %+ :cr=^M:do=^J:\
+       :ho=^Y:kd=^J:kh=^Y:kl=^H:kr=^\:ku=^_:le=^H:nd=^\:\
+       :sf=^J:ta=^I:up=^_:
+dm2500|datamedia2500|datamedia 2500:\
+       :bs:nc:\
+       :co#80:li#24:\
+       :al=\020\n\030\035\030\035:bl=^G:ce=^W:cl=^^^^\177:\
+       :cm=\014%r%n%.%.:dc=\020\010\030\035:\
+       :dl=\020\032\030\035:dm=^P:do=^J:ed=^X^]:\
+       :ei=\377\377\030\035:ho=^B:ic=\020\034\030\035:im=^P:\
+       :le=^H:nd=^\:pc=\377:se=^X^]:sf=^J:so=^N:up=^Z:
+# dmchat is like DM2500, but DOES need "all that padding" (jcm 1/31/82)
+# also, has a meta-key (:km:)
+# From: <goldberger@su-csli.arpa>
+# (dmchat: ":MT:" changed to ":km:" -- esr)
+dmchat|dmchat version of datamedia 2500:\
+       :km:\
+       :al=1*\020\n\030\035\030\035:dl=2\020\032\030\035:tc=dm2500:
+# (dm3025: ":MT:" changed to ":km:"; mapped ":pt:" to default tabs -- esr)
+dm3025|datamedia 3025a:\
+       :bs:km:pt:\
+       :co#80:li#24:\
+       :al=\EP\n\EQ:bl=^G:cd=\EJ:ce=\EK:cl=\EM:\
+       :cm=\EY%r%+ %+ :cr=^M:dc=\010:dl=\EP\EA\EQ:dm=\EP:\
+       :do=^J:ed=\EQ:ei=\EQ:ho=\EH:im=\EP:ip=:is=\EQ\EU\EV:\
+       :le=^H:nd=\EC:se=\EO0:sf=^J:so=\EO1:ta=^I:up=\EA:
+# (dm3045: mapped ":pt:" to default tabs -- esr)
+dm3045|datamedia 3045a:\
+       :am:bs:eo:pt:ul:xn:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EM:cm=\EY%r%+ %+ :cr=^M:\
+       :dc=\EB:do=^J:ei=\EP:ho=\EH:im=\EP:ip=:is=\EU\EV:\
+       :k0=\Ey\r:k1=\Ep\r:k2=\Eq\r:k3=\Er\r:k4=\Es\r:\
+       :k5=\Et\r:k6=\Eu\r:k7=\Ev\r:k8=\Ew\r:k9=\Ex\r:kh=\EH:\
+       :kr=\EC:ku=\EA:le=^H:nd=\EC:pc=\177:sf=^J:ta=^I:\
+       :up=\EA:
+# dm80/1 is a vt100 lookalike, but it doesn't seem to need any padding.
+dm80|dmdt80|dt80|datamedia dt80/1:\
+       :cd=\E[J:ce=\E[K:cl=\E[2J\E[H:cm=%i\E[%d;%dH:do=^J:\
+       :ho=\E[H:nd=\E[C:pf=\E[4i:po=\E[5i:ps=\E[0i:se=\E[m:\
+       :so=\E[7m:sr=\EM:ue=\E[m:up=\E[A:us=\E[4m:tc=vt100:
+# except in 132 column mode, where it needs a little padding.
+# This is still less padding than the vt100, and you can always turn on
+# the ^S/^Q handshaking, so you can use vt100 flavors for things like
+# reverse video.
+dm80w|dmdt80w|dt80w|datamedia dt80/1 in 132 char mode:\
+       :co#132:\
+       :cd=20\E[0J:ce=20\E[0K:cl=50\E[H\E[2J:\
+       :cm=5\E[%i%d;%dH:do=^J:up=5\E[A:tc=dm80:
+
+#### Falco
+#
+#      Falco Data Products
+#      440 Potrero Avenue
+#      Sunnyvale, CA 940864-196
+#      Vox: (800)-325-2648
+#      Fax: (408)-745-7860
+#      Net: techsup@charm.sys.falco.com
+#
+# Current Falco models as of 1995 are generally ANSI-compatible and support
+# emulations of DEC VT-series, Wyse, and Televideo types.
+
+# Test version for Falco ts-1. See "arpavax.hickman@ucb" for info
+# (falco: mapped ":pt:" to default tabs -- esr)
+# This terminal was released around 1983 and was discontinued long ago.
+falco|ts1|ts-1|falco ts-1:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:cd=\EY:ce=\ET\EG0\010:cl=\E*:\
+       :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:\
+       :im=\Eq:is=\Eu\E3:k0=^A0\r:kd=^J:kl=^H:kr=^L:ku=^K:\
+       :le=^H:nd=^L:se=\Eg0:sf=^J:so=\Eg1:ta=^I:ue=\Eg0:\
+       :up=^K:us=\Eg1:
+# (falco-p: mapped ":pt:" to default tabs -- esr)
+falco-p|ts1p|ts-1p|falco ts-1 with paging option:\
+       :am:bs:da:db:mi:ms:pt:ul:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET\EG0\010\Eg0:\
+       :cl=\E*:cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=\E[B:\
+       :ei=\Er:im=\Eq:is=\EZ\E3\E_c:kd=\E[B:kh=\E[H:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=^H:nd=\E[C:se=\Eg0:sf=^J:so=\Eg4:\
+       :ta=^I:te=\E_b:ti=\E_d:ue=\Eg0:up=\E[A:us=\Eg1:
+ts100|ts100-sp|falco ts100-sp:\
+       :am:mi:ms:xn:xo:\
+       :co#80:it#8:li#24:vt#3:\
+       :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+       :K5=\EOn:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E~E:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:dc=\E~W:dl=\E~R:do=^J:eA=\E(B\E)0:ei=:\
+       :ho=\E[H:i1=\E~)\E~ea:ic=\E~Q:im=:k0=\EOy:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:\
+       :k8=\EOl:k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m\017:mr=\E[7m:nd=\E[C:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :..sa=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+ts100-ctxt|falco ts-100 saving context:\
+       :te=\E~_b:ti=\E~_d\E[2J:tc=ts100:
+
+#### Florida Computer Graphics
+#
+
+#      Florida Computer Graphics Beacon System, using terminal emulator
+#      program "host.com", as provided by FCG.  Entry provided by
+#      David Bryant (cbosg!djb) 1/7/83.
+#      This description is for an early release of the "host" program.
+#      Known bug: ed clears the whole screen, so it's commented out.
+#
+beacon|FCG Beacon System:\
+       :am:da:db:\
+       :co#80:li#32:\
+       :al=\EE:bl=\ESTART\r\E37\r\EEND\r:ce=\ET:cl=\EZ:\
+       :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=:ho=\EH:\
+       :ic=\EQ:im=:le=^H:mb=\ESTART\r\E61\0541\r\EEND\r:\
+       :me=\ESTART\r\E78\r\E70\0540\r\EEND\r:\
+       :mr=\ESTART\r\E59\0541\r\EEND\r:nd=\EV:\
+       :se=\ESTART\r\E70\0540\r\EEND\r:sf=^J:\
+       :so=\ESTART\r\E70\0546\r\EEND\r:\
+       :ti=\ESTART\r\E2\0540\r\E12\r\EEND\r:\
+       :ue=\ESTART\r\E60\0540\r\EEND\r:up=\EU:\
+       :us=\ESTART\r\E60\0541\r\EEND\r:
+
+#### Fluke
+#
+
+# The 1720a differences from ANSI: no auto margin, destructive 
+# tabs, # of lines, funny highlighting and underlining
+f1720|f1720a|fluke 1720A:\
+       :xt:\
+       :co#80:li#16:sg#1:ug#1:\
+       :bl=^G:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:cm=\E[%i%d;%dH:\
+       :cr=^M:do=\E[B:is=\E[;H\E[2J:kd=^]:kl=^_:kr=^^:ku=^\:\
+       :le=^H:nd=\E[C:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+
+#### Liberty Electronics (Freedom)
+#
+#      Liberty Electronics
+#      48089 Fremont Blvd
+#      Fremont CA 94538
+#      Vox: (510)-623-6000
+#      Fax: (510)-623-7021
+
+# From: <faletti@berkeley.edu>
+f100|freedom|freedom100|freedom model 100:\
+       :am:bw:hs:mi:ms:xo:\
+       :co#80:li#24:\
+       :ae=\E$:al=\EE:as=\E%:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :ch=\E]%+ :cl=^Z:cm=\E=%+ %+ :cr=^M:ct=\E3:cv=\E[%+ :\
+       :dc=\EW:dl=\ER:do=^J:ds=\Eg\Ef\r:ei=\Er:fs=^M:ho=^^:\
+       :im=\Eq:ip=:is=\Eg\Ef\r\Ed:k1=^A@\r:k2=^AA\r:\
+       :k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:k7=^AF\r:\
+       :k8=^AG\r:k9=^AH\r:k;=^AI\r:kB=\EI:kb=^H:kd=^V:kh=^^:\
+       :kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\EG0:sf=^J:so=\EG4:\
+       :sr=\Ej:st=\E1:ta=^I:ts=\Eg\Ef:ue=\EG0:up=^K:us=\EG8:\
+       :vb=\Eb\Ed:
+f100-rv|freedom-rv|freedom 100 in reverse video:\
+       :is=\Eg\Ef\r\Eb:vb=\Ed\Eb:tc=f100:
+# The f110 and f200 have problems with vi(1).  They use the ^V
+# code for the down cursor key. When kcud1 is defined in terminfo
+# as ^V, the Control Character Quoting capability (^V in insert mode)
+# is lost! It cannot be remapped in vi because it is necessary to enter
+# a ^V to to quote the ^V that is being remapped!!!
+# 
+# f110 users will have to decide whether
+# to lose the down cursor key or the quoting capability. We will opt
+# initially for leaving the quoting capability out, since use of VI
+# is not generally applicable to most interactive applications
+# 
+# The same applies to f200 users, except that another option exists.
+# This option has been chosen locally. It will not be distributed unless
+# a user runs into this problem and requests assistance. Very few users,
+# if any, should run into this problem. The local solution is in
+# vifix.local.ti. The f200 has the ability to reprogram the down cursor
+# key. The key is reprogrammed to ^J (linefeed). This value is remembered
+# in non-volatile RAM, so powering the terminal off and on will not cause
+# the change to be lost. The terminfo definition for the f200 is changed
+# to identify kcud1 as ^J instead of ^V.
+f110|freedom110|Liberty Freedom 110:\
+       :am:es:hs:mi:ms:xo:\
+       :co#80:it#8:li#24:ws#80:\
+       :ae=\E%%:al=\EE:as=\E$:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :ch=\E]%+ :cl=^Z:cm=\E=%+ %+ :cr=^M:ct=\E3:cv=\E[%+ :\
+       :dc=\EW:dl=\ER:do=^V:ds=\Ef\r:ei=\Er\EO:fs=^M:ho=^^:\
+       :k0=^AI\r:k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:\
+       :k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:\
+       :kC=^^:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kS=\EY:kb=^H:\
+       :kd=^V:kl=^H:kr=^L:ku=^K:le=^H:mb=\EG2:md=\EG0:\
+       :me=\EG0:mh=\EG@:mk=\EG1:mr=\EG4:nd=^L:pf=\Ea:po=\E`:\
+       :se=\EG0:sf=^J:so=\EG<:sr=\EJ\nsmir=\EO\Eq:st=\E1:\
+       :ts=\Ef:ue=\EG0:up=^K:us=\EG8:\
+       :vb=\Eb\200\200\200\200\Ed:ve=\E.2:vi=\E.1:vs=\E.2:
+f110-14|Liberty Freedom 110 14inch:\
+       :dc@:tc=f110:
+f110-w|Liberty Freedom 110 - 132 cols:\
+       :co#132:\
+       :tc=f110:
+f110-14w|Liberty Freedom 110 14in/132 cols:\
+       :co#132:\
+       :dc@:tc=f110:
+f200|freedom200|Liberty Freedom 200:\
+       :am:es:hs:mi:ms:xo:\
+       :co#80:it#8:li#24:ws#80:\
+       :ae=\E%%:al=\EE:as=\E$:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :ch=\E]%+ :cl=^Z:cm=\E=%+ %+ :cr=^M:cs=\Em0%+ %+ :\
+       :ct=\E3:cv=\E[%+ :dc=\EW:dl=\ER:do=^V:ds=\Ef\r:\
+       :ei=\Er:fs=^M:ho=^^:im=\Eq:k0=^AI\r:k1=^A@\r:\
+       :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+       :k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:kC=^^:kD=\EW:\
+       :kE=\ET:kI=\EQ:kL=\ER:kS=\EY:kb=^H:kd=^V:kl=^H:kr=^L:\
+       :ku=^K:le=^H:mb=\EG2:md=\EG0:me=\EG0:mh=\EG@:mk=\EG1:\
+       :mr=\EG4:nd=^L:pf=\Ea:po=\E`:se=\EG0:sf=^J:so=\EG<:\
+       :sr=\EJ:st=\E1:ts=\Ef:ue=\EG0:up=^K:us=\EG8:\
+       :vb=\Eo\200\200\200\200\200\200\200\200\200\200\200\200\200\200\200\En:\
+       :ve=\E.1:vi=\E.0:vs=\E.1:
+f200-w|Liberty Freedom 200 - 132 cols:\
+       :co#132:\
+       :tc=f200:
+f200vi|Liberty Freedom 200 for vi:\
+       :am:es:hs:mi:ms:xo:\
+       :co#80:it#8:li#24:ws#80:\
+       :ae=\E%%:al=\EE:as=\E$:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :ch=\E]%+ :cl=^Z:cm=\E=%+ %+ :cr=^M:cs=\Em0%+ %+ :\
+       :ct=\E3:cv=\E[%+ :dc=\EW:dl=\ER:do=^V:ds=\Ef\r:\
+       :ei=\Er:fs=^M:ho=^^:im=\Eq:k0=^AI\r:k1=^A@\r:\
+       :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+       :k7=^AF\r:k8=^AG\r:k9=^AH\r:kA=\EE:kC=^^:kD=\EW:\
+       :kE=\ET:kI=\EQ:kL=\ER:kS=\EY:kb=^H:kd=^J:kl=^H:kr=^L:\
+       :ku=^K:le=^H:mb=\EG2:md=\EG0:me=\EG0:mh=\EG@:mk=\EG1:\
+       :mr=\EG4:nd=^L:pf=\Ea:po=\E`:se=\EG0:sf=^J:so=\EG<:\
+       :sr=\EJ:st=\E1:ts=\Ef:ue=\EG0:up=^K:us=\EG8:\
+       :vb=\Eb\200\200\200\200\Ed:ve=\E.1:vi=\E.0:vs=\E.1:
+f200vi-w|Liberty Freedom 200 - 132 cols for vi:\
+       :co#132:\
+       :tc=f200vi:
+
+#### GraphOn (go)
+#
+#      Graphon Corporation
+#      544 Division Street
+#      Campbell, CA 95008
+#      Vox: (408)-370-4080
+#      Fax: (408)-370-5047
+#      Net: troy@graphon.com (Troy Morrison)
+#
+#
+# The go140 and go225 have been discontinued.  GraphOn now makes X terminals,
+# including one odd hybrid that starts out life on power-up as a character
+# terminal, than can be switched to X graphics mode (driven over the serial
+# line) by an escape sequence.  No info on this beast yet.
+
+# (go140: mapped ":pt:" to default tabs -- esr)
+go140|graphon go-140:\
+       :bs:pt:\
+       :co#80:li#24:\
+       :al=\E[L:cd=10\E[J:ce=\E[K:cl=10\E[;H\E[2J:\
+       :cm=\E[%i%2;%2H:dc=\E[P:dl=\E[M:ei=\E[4l:\
+       :if=/usr/share/tabset/vt100:im=\E[4h:\
+       :is=\E<\E=\E[?3l\E[?7l\E(B\E[J\E7\E[;r\E8\E[m\E[q:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\EOB:\
+       :ke=\E[?1l\E>:kh=\E[H:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+       :ku=\EOA:nd=\E[C:se=\E[m:so=\E[7m:sr=\EM:ue=\E[m:\
+       :up=\E[A:us=\E[4m:
+go140w|graphon go-140 in 132 column mode:\
+       :co#132:\
+       :is=\E<\E=\E[?3h\E[?7h\E(B\E[J\E7\E[;r\E8\E[m\E[q:tc=go140:
+# Hacked up vt200 termcap to handle GO-225/VT220
+# From: <edm@nwnexus.WA.COM>
+# (go225: mapped ":pt:" to default tabs -- esr)
+go225|go-225|Graphon 225:\
+       :am:bs:mi:pt:xn:\
+       :co#80:li#25:vt#3:\
+       :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=^J:ei=\E[4l:\
+       :ho=\E[H:im=\E[4h:\
+       :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:kd=\E[B:ke=\E>:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:le=^H:\
+       :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:rc=\E8:\
+       :rf=/usr/share/tabset/vt100:rs=\E[!p\E[?7h\E[2;1;1#w:\
+       :sc=\E7:se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:\
+       :te=\E[!p\E[?7h\E[2;1;1#w:ti=\E[2;0#w\E[1;25r:\
+       :ue=\E[24m:up=\E[A:us=\E[4m:
+
+#### Harris (Beehive)
+#
+# Bletch.  These guys shared the Terminal Brain Damage laurels with Hazeltine.
+# Their terminal group is ancient history now (1995) though the parent
+# company is still in business.
+#
+
+# Beehive documentation is undated and marked Preliminary and has no figures
+# so we must have early Superbee2 (Model 600, according to phone conversation
+# with mfr.). It has proved reliable except for some missing padding
+# (notably after \EK and nl at bottom of screen).
+# 
+# The key idea is that AEP mode is poison for cup & that US's in 
+# the local memory should be avoided like the plague. That means 
+# that the 2048 character local buffer is used as 25 lines of 80 
+# characters, period. No scrolling local memory, folks. It also 
+# appears that we cannot use naked INS LINE feature since it uses
+# US. The sbi fakes il1 with an 80-space insert that may be too 
+# slow at low speeds; also spaces get converted to \040 which is 
+# too long for some programs (not vi).  DEL LINE is ok but slow.
+# 
+# The nl string is designed for last line of screen ONLY; cup to 
+# 25th line corrects the motion inherent in scrolling to Page 1.
+# 
+# There is one understood bug. It is that the screen appears to
+# pop to a new (blank) page after a nel, or leave a half-line 
+# elipsis to a quad that is the extra 48 memory locations. The 
+# data received is dumped into memory but not displayed.  Not to 
+# worry if cup is being used; the lines not displayed will be, 
+# whenever the cursor is moved up there. Since cup is addressed 
+# relative to MEMORY of window, nothing is lost; but beware of 
+# relative cursor motion (cuu1,cud1,cuf1,cub1). Recommended, therefore, 
+# is setenv MORE -c .
+# 
+# WARNING: Not all features tested.
+# 
+# Timings are assembled from 3 sources. Some timings may reflect 
+# SB2/Model 300 that were used if more conservative.
+# Tested on a Model 600 at 1200 and 9600 bd.
+# 
+# The BACKSPACEkb option is cute. The NEWLINE key, so cleverly 
+# placed on the keyboard and useless because of AEP, is made 
+# into a backspace key. In use ESC must be pressed twice (to send)
+# and sending ^C must be prefixed by ESC to avoid that wierd 
+# transmit mode associated with ENTER key.
+# 
+# IF TERMINAL EVER GOES CATATONIC with the cursor buzzing across 
+# the screen, then it has dropped into ENTER mode; hit 
+# RESET--ONLINE--!tset.
+# 
+# As delivered this machine has a FATAL feature that will throw 
+# it into that strange transmit state (SPOW) if the space bar is 
+# hit after a CR is received, but before receiving a LF (or a 
+# few others).
+# 
+# The circuits MUST be modified to eliminate the SPOW latch. 
+# This is done by strapping on chip A46 of the I/O board; cut 
+# the p.c. connection to Pin 5 and strap Pin 5 to Pin 8 of that 
+# chip. This mod has been checked out on a Mod 600 of Superbee II.
+# With this modification absurdly high timings on cr are 
+# unnecessary.
+# 
+# NOTE WELL that the rear panel switch should be set to CR/LF, 
+# not AEP!
+#
+sb1|beehive superbee:\
+       :am:bw:da:db:mi:ul:xb:\
+       :co#80:li#25:sg#1:ug#1:\
+       :al=\EN\EL\EQ                                                                                \EP \EO\ER\EA:\
+       :bl=^G:bt=\E`:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EF%r%03%03:\
+       :cr=\r:ct=\E3:dc=\EP:dl=\EM:do=^J:ei=\ER:ho=\EH:\
+       :im=\EQ\EO:is=\EE\EX\EZ\EO\Eb\Eg\ER:k0=\E2:k1=\Ep:\
+       :k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:k8=\Ew:\
+       :k9=\E1:kE=\EK:kI=\EQ\EO:kL=\EM:kM=\ER:kS=\EJ:kb=^_:\
+       :kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:l0=TAB CLEAR:\
+       :l9=TAB SET:le=^H:nd=\EC:se=\E_3:sf=^J:so=\E_1:\
+       :st=\E1:ta=^I:ti=\EO:ue=\E_3:up=\EA:us=\E_0:
+sbi|superbee|beehive superbee at Indiana U.:\
+       :xb:\
+       :al=1\EN\EL\EQ \EP \EO\ER\EA:cr=\r:tc=sb1:
+# Alternate (older) description of Superbee - f1=escape, f2=^C.
+# Note: there are at least 3 kinds of superbees in the world.  The sb1
+# holds onto escapes and botches ^C's.  The sb2 is the best of the 3.
+# The sb3 puts garbage on the bottom of the screen when you scroll with
+# the switch in the back set to CRLF instead of AEP.  This description
+# is tested on the sb2 but should work on all with either switch setting.
+# The f1/f2 business is for the sb1 and the xsb can be taken out for
+# the other two if you want to try to hit that tiny escape key.
+# This description is tricky: being able to use cup depends on there being
+# 2048 bytes of memory and the hairy nl string.
+superbee-xsb|beehive super bee:\
+       :am:bs:da:db:pt:xb:\
+       :co#80:dC#10:it#8:li#25:\
+       :cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EF%r%3%3:cr=\r:ct=\E3:\
+       :dc=\EP:dl=\EM:do=^J:ho=\EH:is=\EH\EJ:k1=\Ep:k2=\Eq:\
+       :k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:k8=\Ew:kd=\EB:\
+       :kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+       :nl=\n\200\200\200\n\200\200\200\EA\EK\200\200\200\ET\ET:\
+       :se=\E_3:\
+       :sf=\n\200\200\200\n\200\200\200\EA\EK\200\200\200\ET\ET:\
+       :so=\E_1:st=\E1:up=\EA:ve=^J:
+# This loses on lines > 80 chars long, use at your own risk
+superbeeic|super bee with insert char:\
+       :ei=\ER:ic=:im=\EQ:tc=superbee-xsb:
+sb2|sb3|fixed superbee:\
+       :xb@:\
+       :tc=superbee:
+
+# Reports are that most of these Beehive entries (except superbee) have not
+# been tested and do not work right.  :se: is a trouble spot.  Be warned.
+
+# (bee: removed obsolete ":ko=al,bt,ce,cl,dc,dl,ei,ho,ic,im:" -- esr)
+beehive|bee|harris beehive:\
+       :am:bs:mi:\
+       :co#80:li#24:\
+       :al=\EL:bt=\E>:cd=\EJ:ce=\EK:cl=\EE:cm=\EF%+ %+ :\
+       :dc=\EP:dl=\EM:do=\EB:ei=\E@:ho=\EH:ic=:im=\EQ:kb=^H:\
+       :kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:nd=\EC:se=\Ed@:\
+       :so=\EdP:ue=\Ed@:up=\EA:us=\Ed`:
+# set tab is ^F, clear (one) tab is ^V, no way to clear all tabs.
+# good grief - does this entry make sg/ug when it doesn't have to?
+# look at those spaces in se/so.  Seems strange to me...
+# (bh3m: mapped ":pt:" to default tabs -- esr)
+beehive3|bh3m|beehiveIIIm:\
+       :am:bs:pt:\
+       :co#80:li#20:\
+       :al=\023:bl=^G:cd=^R:ce=^P:cl=^E^R:cr=^M:dl=\021:\
+       :do=^J:ho=^E:if=/usr/share/tabset/beehive:le=^H:\
+       :ll=^E^K:nd=^L:se= ^_:sf=^J:so=^] :ta=^I:up=^K:
+beehive4|bh4|beehive 4:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EE:cr=^M:do=^J:ho=\EH:\
+       :le=\ED:nd=\EC:sf=^J:up=\EA:
+# (microb: mapped ":pt:" to default tabs -- esr)
+microb|microbee|micro bee series:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EE:cm=\EF%+ %+ :cr=^M:do=^J:\
+       :k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:\
+       :k8=\Ew:k9=\Ex:kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:\
+       :le=^H:nd=\EC:se=\Ed@ :sf=^J:so= \EdP:ta=^I:ue=\Ed@:\
+       :up=\EA:us=\Ed`:
+
+# 8675, 8686, and bee from Cyrus Rahman
+# (8675: changed k10, k11...k16 to k;, F1...F6 -- esr)
+ha8675|harris 8675:\
+       :F1=^W:F2=\ER:F3=\EE:F4=\EI:F5=\Ei:F6=\Eg:\
+       :is=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU:k1=^F:k2=^P:\
+       :k3=^N:k4=^V:k5=^J:k6=^T:k7=^H:k8=\177:k9=\Ee:k;=\Ed:tc=bee:
+# (8686: changed k10, k11...k16 to k;, F1...F6; fixed broken continuation
+# in :is: -- esr)
+ha8686|harris 8686:\
+       :F1=\EW:F2=\002\E{\003:F3=\002\E|\003:F4=\002\E}\003:\
+       :F5=\002\E~\003:F6=\002\E\177\003:\
+       :is=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU\E"*Z01\E"8F35021B7C83#\E"8F45021B7D83#\E"8F55021B7E83#\E"8F65021B7F83#\E"8F75021B7383#\E"8F851BD7#\E"8F95021B7083#\E"8FA5021B7183#\E"8FB5021B7283#:\
+       :k1=\002\Ep\003:k2=\002\Eq\003:k3=\002\Er\003:\
+       :k4=\002\Es\003:k5=\E3:k6=\EI:k7=\ER:k8=\EJ:k9=\E(:\
+       :k;=\Ej:tc=bee:
+
+#### Hazeltine
+#
+# Hazeltine appears to be out of the business now (1995).  These guys were 
+# co-owners of the Terminal Brain Damage Hall Of Fame along with Harris.
+# Good riddance.
+#
+# The ony contact information I have dates from 1993 and is:
+#
+# Customer Service Division
+# 15 Law Drive
+# P.O. Box 2076
+# Fairfield, NJ 07007-2078
+#
+# Since :nd: is blank, when you want to erase something you
+# are out of luck.  You will have to do ^L's a lot to
+# redraw the screen.  h1000 is untested.  It doesn't work in
+# vi - this terminal is too dumb for even vi.  (The code is
+# there but it isn't debugged for this case.)
+h1000|hazeltine 1000:\
+       :bs:\
+       :co#80:li#12:\
+       :bl=^G:cl=^L:cr=^M:do=^J:ho=^K:le=^H:nd= :sf=^J:
+# From: <cbosg!ucbvax!pur-ee!cincy!chris> Thu Aug 20 09:09:18 1981
+h1420|hazeltine 1420:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\E^Z:bl=^G:cd=\E^X:ce=\E^O:cl=\E^\:\
+       :cm=\E\021%r%.%+ :cr=^M:dl=\E^S:do=^J:le=^H:nd=^P:\
+       :se=\E^Y:sf=^J:so=\E^_:ta=^N:up=\E^L:
+# New "safe" cursor movement (11/87) from cgs@umd5.umd.edu.  Prevents freakout
+# with out-of-range args and tn3270.  No hz since it needs to receive ~'s.
+h1500|hazeltine 1500:\
+       :am:bs:hz:\
+       :co#80:li#24:\
+       :al=~\032:bl=^G:cd=~\030:ce=~^O:cl=~^\:\
+       :cm=~\021%r%>^^ %+`%+`:cr=^M:dl=~\023:do=~^K:ho=~^R:\
+       :kd=^J:kh=~^R:kl=^H:kr=^P:ku=~^L:le=^H:nd=^P:se=~^Y:\
+       :sf=^J:so=~^_:up=~^L:
+# h1510 assumed to be in sane escape mode.  Else use h1500.
+# (h1510: early versions of this entry apparently had ":se=\E^_:so=\E^Y:",
+# but these caps were commented out in 8.3; also, removed incorrect
+# and overridden ":do=^J:" -- esr)
+h1510|hazeltine 1510:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\E^Z:bl=^G:cd=\E^X:ce=\E^O:cl=\E^\:\
+       :cm=\E\021%r%.%.:cr=^M:dl=\E^S:do=\E^K:le=^H:nd=^P:\
+       :sf=^J:up=\E^L:
+# (h1520: removed incorrect and overridden ":do=^J:" -- esr)
+h1520|hazeltine 1520:\
+       :am:bs:hz:\
+       :co#80:li#24:\
+       :al=~^Z:bl=^G:cd=~^X:ce=~^O:cl=~^\:cm=~\021%r%.%.:\
+       :cr=^M:dl=~^S:do=~^K:ho=~^R:le=^H:nd=^P:se=~^Y:sf=^J:\
+       :so=~^_:up=~^L:
+# Note: the h1552 appears to be the first Hazeltine terminal which
+# is not braindamaged.  It has tildes and backprimes and everything!
+# Be sure the auto lf/cr switch is set to cr.
+h1552|hazeltine 1552:\
+       :al=\EE:dl=\EO:do=^J:k1=\EP:k2=\EQ:k3=\ER:l1=blue:\
+       :l2=red:l3=green:tc=vt52:
+h1552rv|hazeltine 1552 reverse video:\
+       :do=^J:se=\ET:so=\ES:tc=h1552:
+# Note: h2000 won't work well because of a clash between upper case and ~'s.
+h2000|hazeltine 2000:\
+       :am:bs:nc:\
+       :co#74:li#27:\
+       :al=~\032:bl=^G:cl=~\034:cm=~\021%r%.%.:dl=~\023:\
+       :do=^J:ho=~^R:le=^H:pc=\177:sf=^J:
+# Date: Fri Jul 23 10:27:53 1982.  Some unknown person wrote:
+# I tested this termcap entry for the Hazeltine Esprit with vi. It seems
+# to work ok. There is one problem though if one types a lot of garbage
+# characters very fast vi seems not able to keep up and hangs while trying
+# to insert. That's in insert mode while trying to insert in the middle of
+# a line. It might be because the Esprit doesn't have insert char and delete
+# char as a built in function. Vi has to delete to end of line and then 
+# redraw the rest of the line.
+esprit|Hazeltine Esprit I:\
+       :am:bw:\
+       :co#80:li#24:\
+       :al=\E^Z:bl=^G:bt=\E^T:cd=\E^W:ce=\E^O:cl=\E^\:\
+       :cm=\E\021%r%.%.:cr=^M:dl=\E^S:do=\E^K:ho=\E^R:\
+       :is=\E?:k0=^B0^J:k1=^B1^J:k2=^B2^J:k3=^B3^J:k4=^B4^J:\
+       :k5=^B5^J:k6=^B6^J:k7=^B7^J:k8=^B8^J:k9=^B9^J:kb=^H:\
+       :kd=\E^K:ke=\E>:kh=\E^R:kl=^H:kr=^P:ks=\E<:ku=\E^L:\
+       :l0=0:l1=1:l2=2:l3=3:l4=4:l5=5:l6=6:l7=7:l8=8:l9=9:\
+       :le=^H:nd=^P:se=\E^Y:sf=^J:so=\E^_:up=\E^L:
+esprit-am|hazeltine esprit auto-margin:\
+       :am:\
+       :tc=esprit:
+
+#### IBM
+#
+
+ibm327x|line mode IBM 3270 style:\
+       :gn:\
+       :ce=^M:cl=^M^J:ho=^M:
+# From: J.B. Nicholson-Owens <jeffo@uiuc.edu> 8 Mar 94
+ibm3101|i3101|IBM 3101-10:\
+       :am:bs:pt:xo:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EJ:ce=\EI:cl=\EK:cm=\EY%+ %+ :cr=^M:\
+       :ct=\E1:do=^J:ho=\EH:if=/usr/share/tabset/ibm3101:\
+       :kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+       :nw=^M^J:sf=^J:st=\E0:ta=^I:up=\EA:
+#   Received from the IBM terminals division (given to DRB)
+#   June 1988 for PS/2 OS 2.2.3 cut
+ibm3151|i3151:\
+       :me=\E4@:\
+       :..sa=\E4%{64}%?%p1%{0}%>%p1%{4}%<%&%t%{8}%|%;%?%p1%{7}%=%t%{16}%|%;%?%p2%t%{1}%|%;%?%p3%t%{4}%|%;%?%p4%t%{2}%|%;%c:\
+       :se=\E4@:so=\E4A:ue=\E4@:us=\E4B:tc=ibm3163:
+# From: Mark Easter <marke@fsi-ssd.csg.ssd.fsi.com> 29 Oct 1992 
+# I commented out some IBM extensions.
+ibm3161|ibm3163|wy60-316X|wyse60-316X|IBM 3161/3163 display:\
+       :am:mi:ms:\
+       :co#80:it#8:li#24:\
+       :F1=\Ek\r:F2=\El\r:F3=\E!a\r:F4=\E!b\r:F5=\E!c\r:\
+       :F6=\E!d\r:F7=\E!e\r:F8=\E!f\r:F9=\E!g\r:FA=\E!h\r:\
+       :FB=\E!i\r:FC=\E!j\r:FD=\E!k\r:FE=\E!l\r:bl=^G:\
+       :cd=\EJ:ce=\EI:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:dc=\EQ:\
+       :dl=\EO:do=\EB:ho=\EH:k1=\Ea\r:k2=\Eb\r:k3=\Ec\r:\
+       :k4=\Ed\r:k5=\Ee\r:k6=\Ef\r:k7=\Eg\r:k8=\Eh\r:\
+       :k9=\Ei\r:k;=\Ej\r:kA=\EN:kC=\EL\r:kD=\EQ:kE=\EI:\
+       :kI=\EP \010:kL=\EO:kS=\EJ:kT=\E0:ka=\E 1:kb=^H:\
+       :kd=\EB:kh=\EH:kl=\ED:kr=\EC:kt=\E1:ku=\EA:le=\ED:\
+       :mb=\E4D:md=\E4H:me=\E4@\E<@:mk=\E4P:mr=\E4A:nd=\EC:\
+       :..sa=\E4%'@'%?%p1%t%'A'%|%;\n%?%p2%t%'B'%|%;\n%?%p3%t%'A'%|%;\n%?%p4%t%'D'%|%;\n%?%p5%t%'@'%|%;\n%?%p6%t%'H'%|%;\n%?%p7%t%'P'%|%;%c\n%?%p9%t\E>A%e\E<@%;:\
+       :se=\E4@:sf=^J:so=\E4A:te=\E>A:ti=\E>A:ue=\E4@:\
+       :up=\EA:us=\E4B:
+
+# How the 3164 sgr string works:
+#      %{32}           # push space for no special video characteristics
+#      %?%p2%t%{1}%|%; # if p2 set, then OR the 1 bit for reverse
+#      %?%p3%t%{4}%|%; # if p3 set, then OR the 4 bit for blink
+#      %?%p4%t%{2}%|%; # if p4 set, then OR the 2 bit for underline
+#      %c              # pop Pa1
+#      %{39}%p1%-      # calculate 32 + (7 - p1) for foreground
+#      %c              # pop Pa2 
+#      %{64}           # use only black background for now
+#      %c              # pop Pa3
+ibm3164|i3164|3164:\
+       :mb=\E4D:md=\E4H:me=\E4@:\
+       :..sa=\E4%{32}%?%p2%t%{1}%|%;%?%p3%t%{4}%|%;%?%p4%t%{2}%|%;%c%{39}%p1%-%c%{64}%c:tc=ibm3163:
+
+# (ibmaed: mapped ":pt:" to default tabs -- esr)
+ibmaed|IBM Experimental display:\
+       :am:bs:eo:ms:pt:\
+       :co#80:li#52:\
+       :al=\EN:cd=\EJ:ce=\EI:cl=\EH\EK:cm=\EY%+ %+ :dc=\EQ:\
+       :dl=\EO:do=\EB:ei=:ho=\EH:ic=\EP:im=:kb=^H:kd=\EB:\
+       :kl=\ED:kr=\EC:ku=\EA:nd=\EC:se=\E0:so=\E0:ue=:\
+       :up=\EA:us=:vb=\EG:
+ibm-apl|apl|IBM apl terminal simulator:\
+       :li#25:\
+       :tc=dm1520:
+# (ibmmono: this had an unknown `sb' boolean, I changed it to `bs'.  
+# Also it had ":I0=f10:" which pretty obviously should be "l0=f10" -- esr)
+ibmmono|ibm5151|IBM workstation monochrome:\
+       :bs:es:hs:\
+       :al=\EL:dl=\EM:ds=\Ej\EY8 \EI\Ek:fs=\Ek:k0=\E<:\
+       :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:\
+       :k8=\ER:k9=\EY:kF=\EE:kI=\200:kN=\EE:kP=\Eg:kR=\EG:\
+       :kb=^H:kh=\EH:l0=f10:md=\EZ:me=\Ew\Eq\Ez\EB:\
+       :mk=\EF\Ef0;\Eb0;:mr=\Ep:se=\Ez:so=\EZ:sr=\EA:\
+       :ts=\Ej\EY8%+ \Eo:ue=\Ew:us=\EW:tc=ibm3101:
+ibmega-c|ibm5154-c|IBM Enhanced Color Display:\
+       :se=\EB:so=\EF\Ef3;:ue=\EB:us=\EF\Ef2;:tc=ibmmono:
+# ibmapa* and ibmmono entries come from ACIS 4.3 distribution
+rtpc|ibmapa16|ibm6155|IBM 6155 Extended Monochrome Graphics Display:\
+       :li#32:\
+       :ds=\Ej\EY@ \EI\Ek:ts=\Ej\EY@%+ \Eo:tc=ibmmono:
+# Advanced Monochrome (6153) and Color (6154) Graphics Display:
+ibmapa8c|ibmapa8|ibm6154|ibm6153|IBM 6153/4 Advanced Graphics Display:\
+       :li#31:\
+       :ds=\Ej\EY? \EI\Ek:ts=\Ej\EY?%+ \Eo:tc=ibmmono:
+ibmapa8c-c|ibm6154-c|IBM 6154 Advanced Color Graphics Display:\
+       :li#31:\
+       :ds=\Ej\EY? \EI\Ek:mh=\EF\Ef7;:ts=\Ej\EY?%+ \Eo:tc=ibmega-c:
+# From: Marc Pawliger <marc@ibminet.awdpa.ibm.com>
+# also in /usr/lpp/bos/bsdsysadmin.
+# (hft-c: this entry had :kb=\E[D:kf=\E[C: on the line with ku/kd/kh; this was
+# pretty obviously mislabeled for :le: and :nd:; also ":ul=\E[4m:" was clearly
+# a typo for ":us=\E[4m:"; also ":el=\E[K:" was a typo for ":ce=\E[K:".
+# There was an unknown boolean ":ht:" which I assume was meant to set 
+# hardware tabs, so I have insrted it#8. Finally, "ac=^N" paired with the
+# ae looked like a typo for ":as=^N:" -- esr)
+ibm8512|ibm8513|hft-c|IBM High Function Terminal:\
+       :am:mi:ms:\
+       :co#80:it#8:li#25:\
+       :AL=\E[%dL:DL=\E[%dM:ae=^O:al=\E[L:as=^N:cd=\E[J:\
+       :ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:dl=\E[M:dm=\E[4h:\
+       :do=^J:ec=\E[%dX:ed=\E[4l:ei=\E[4l:ho=\E[H:im=\E[4h:\
+       :is=\Eb\E[m\017\E[?7h:k0=\E[010q:k1=\E[001q:\
+       :k2=\E[002q:k3=\E[003q:k4=\E[004q:k5=\E[005q:\
+       :k6=\E[006q:k7=\E[007q:k8=\E[008q:k9=\E[009q:kd=\E[B:\
+       :kh=\E[H:ku=\E[A:le=\E[D:mb=\E[5m:md=\E[1m:me=\E[m:\
+       :mr=\E[7m:nd=\E[C:rc=\E[u:\
+       :rs=\Eb\E[m\017\E[?7h\E[H\E[J:sc=\E[s:se=\E[m:\
+       :so=\E[7m:te=\E[20h:ti=\E[20;4l\E[?7h\Eb:ue=\E[m:\
+       :up=\E[A:us=\E[4m:
+hft|AIWS High Function Terminal:\
+       :am:xo:\
+       :co#80:li#25:\
+       :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:do=^J:ei=\E6:\
+       :ho=\E[H:ic=\E[@:im=\E6:k1=\E[001q:k2=\E[002q:\
+       :k3=\E[003q:k4=\E[004q:k5=\E[005q:k6=\E[006q:\
+       :k7=\E[007q:k8=\E[008q:k9=\E[009q:kN=\E[153q:\
+       :kP=\E[159q:ka=\E[010q:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[0m:\
+       :mk=\E[8m:mr=\E[7m:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:\
+       :ta=^I:ue=\E[m:up=\E[A:us=\E[4m:
+# From: <pryor@math.berkeley.edu>
+ibm5081|ibmmpel|IBM 5081 1024x1024 256/4096 color display:\
+       :es:hs:\
+       :li#33:\
+       :ds=\Ej\EYA \EI\Ek:fs=\Ek:ts=\Ej\EYA%+ \Eo:tc=ibmmono:
+ibm5081-c|ibmmpel-c|IBM 5081 1024x1024 256/4096 enhanced color display:\
+       :es:hs:\
+       :li#33:\
+       :ds=\Ej\EYA \EI\Ek:fs=\Ek:ts=\Ej\EYA%+ \Eo:tc=ibmega-c:
+ibm-system1|system1|ibm system/1 computer:\
+       :am:xt:\
+       :co#80:li#24:\
+       :bl=^G:cl=^Z:cm=\005%+ %+ :ho=^K:le=^H:nd=^\:sf=^J:\
+       :up=^^:
+
+#### Infoton/General Terminal Corp.
+#
+
+# gt100 sounds like something DEC would come out with.  Let's hope they don't.
+i100|gt100|gt100a|General Terminal 100A (formerly Infoton 100):\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=^L:cm=\Ef%r%+ %+ :\
+       :cr=^M:dl=\EM:do=^J:ho=\EH:le=^H:nd=\EC:se=\Ea:sf=^J:\
+       :so=\Eb:up=\EA:vb=\Eb\Ea:
+i400|infoton 400:\
+       :am:bs:\
+       :co#80:li#25:\
+       :al=\E[L:bl=^G:ce=\E[N:cl=\E[2J:cm=%i\E[%3;%3H:cr=^M:\
+       :dc=\E[4h\E[2Q\E[P\E[4l\E[0Q:dl=\E[M:do=^J:\
+       :ei=\E[4l\E[0Q:im=\E[4h\E[2Q:le=^H:nd=\E[C:sf=^J:\
+       :up=\E[A:
+# (addrinfo: removed obsolete ":bc=^Z:" -- esr)
+addrinfo:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cd=^K:cl=^L:..cm=\037%p1%{1}%-%c%p2%{1}%-%c:\
+       :cr=^M:do=^J:ho=^H:le=^Z:ll=^H^\:nd=^Y:sf=^J:up=^\:
+infoton:\
+       :am:\
+       :Nl#0:co#80:lh#0:li#24:lw#0:\
+       :bl=^G:cd=^K:cl=^L:cr=^M:do=^J:le=^Z:ll=^H^\:nd=^Y:\
+       :sf=^J:up=^\:
+# (infotonKAS: removed obsolete ":bc=^Z:" -- esr)
+infotonKAS:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cd=^K:cl=^L:cr=^M:do=^J:le=^Z:ll=^H^\:nd=^Y:\
+       :sf=^J:up=^\:
+
+#### Interactive Systems Corp
+#
+# ISC used to sell OEMed and customized hardware to support ISC UNIX.
+# ISC UNIX still exists in 1995, but ISC itself is no more; they got
+# bought out by Sun.
+#
+
+# From: <cithep!eric>  Wed Sep 16 08:06:44 1981
+# (intext: removed obsolete ":ma=^K^P^R^L^L :";
+# mapped ":pt:" to default tabs, removed obsolete ":bc=^_:", also the
+# ":le=^_:" later overridden -- esr)
+intext|Interactive Systems Corporation modified owl 1200:\
+       :am:\
+       :co#80:li#24:sg#1:\
+       :al=\020:bl=^G:bt=^Y:cd=\026J:ce=^Kp^R:cl=\014:\
+       :cm=\017%+ %+ :cr=^M:dc=\022:dl=\021:do=^J:ei=^V<:\
+       :im=^V;:ip=:k0=^VJ\r:k1=^VA\r:k2=^VB\r:k3=^VC\r:\
+       :k4=^VD\r:k5=^VE\r:k6=^VF\r:k7=^VG\r:k8=^VH\r:\
+       :k9=^VI\r:kb=^H:kd=^J:ke=^V9:kh=^Z:kl=^_:kr=^^:\
+       :ks=\036\072\264\026%:ku=^\:le=^H:nd=^^:se=^V# :\
+       :sf=^J:so=^V$\054:ta=^I:up=^\:
+intext2|intextii|INTERACTIVE modified owl 1251:\
+       :am:bw:ul:\
+       :co#80:li#24:sg#0:\
+       :al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:ch=\E[%+^AG:\
+       :cl=\E[H\E[2J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:\
+       :do=\E[B:ei=:ic=\E[@:im=:k0=\E@\r:k1=\EP\r:k2=\EQ\r:\
+       :k3=\ES\r:k4=\ET\r:k5=\EU\r:k6=\EV\r:k7=\EW\r:\
+       :k8=\EX\r:k9=\EY\r:kb=^H:kd=\EB\r:kh=\ER\r:kl=\ED\r:\
+       :kr=\EC\r:ku=\EA\r:l0=REFRSH:l1=DEL CH:l2=TABSET:\
+       :l3=GOTO:l4=+PAGE:l5=+SRCH:l6=-PAGE:l7=-SRCH:l8=LEFT:\
+       :l9=RIGHT:nd=\E[C:se=\E[2 D:sf=\E[S:so=\E[6 D:\
+       :sr=\E[T:ta=^I:ue=\E[2 D:up=\E[A:us=\E[18 D:\
+       :vb=\E[;;;;;;;;;2;;u\E[;;;;;;;;;1;;u:
+
+#### Kimtron (abm, kt)
+#
+# Kimtron entries include (undocumented) codes for: enter dim mode (:mh:),
+# enter bold mode (:md:), enter reverse mode (:mr:), turn off all attributes
+# (:me:).
+
+# Kimtron ABM 85 added by Dual Systems
+# (abm85: mapped ":pt:" to default tabs; removed duplicated ":kd=^J:" -- esr)
+abm85|Kimtron ABM 85:\
+       :am:bs:bw:ms:pt:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=\EE:bt=\EI:cd=\Ey:ce=\Et:cl=\E*:cm=\E=%+ %+ :\
+       :dc=\EW:dl=\ER:do=^J:ei=\Er:\
+       :if=/usr/share/tabset/stdcrt:im=\EQ:\
+       :is=\EC\EX\Eg\En\E%\Er\E(\Ek\Em\Eq:kb=^H:kd=^J:kh=^^:\
+       :kl=^H:kr=^L:ku=^K:nd=^L:se=\Ek:so=\Ej:ue=\Em:up=^K:\
+       :us=\El:
+# Kimtron ABM 85H added by Dual Systems.
+# Some notes about the 85h entries:
+# 1) there are several firmware revs of 85H in the world. Use o85h for
+#    firmware revs prior to SP51
+# 2) Make sure to use 85h entry if the terminal is in 85H mode and the
+#    85e entry if it is in 920 emulation mode. They are incompatible in
+#    some places and NOT software settable i.e., :is: can't fix change it)
+# 3) In 85h mode, the arrow keys and special functions transmit when
+#    the terminal is in dup-edit, and work only locally in local-edit.
+#    Vi won't swallow `del char' for instance, but :vs: turns on
+#    dup-edit anyway so that the arrow keys will work right. If the
+#    arrow keys don't work the way you like, change :vs:, :ve:, and :is:.
+#    920E mode does not have software commands to toggle between dup
+#    and local edit, so you get whatever was set last on the terminal.
+# 4) :vb: attribute is nice, but seems too slow to work correctly (\Eb<pad>\Ed)
+# 5) Make sure `hidden' attributes are selected. If `embedded' attributes
+#    are selected, the entries :sg@: and :ug@: should be removed.
+# 6) auto new-line should be on (selectable from setup mode only)
+#
+# From: Erik Fair <fair@ucbarpa>  Sun Oct 27 07:21:05 1985
+abm85h|85H|85h|Kimtron ABM 85H, 85H mode:\
+       :hs:\
+       :sg@:ug@:\
+       :ds=\Ee:fs=^M:im=\EZ:\
+       :is=\EC\EN\EX\024\016\EA\Ea\E%\E9\Ee\Er\En\E"\E}\E'\E(\Ef\r\EG0\Ed\E.4\El:\
+       :kd=^V:me=\E(\EG0:mh=\E):mr=\EG4:se=\EG0:so=\EG4:\
+       :ts=\Eg\Ef:ue=\EG0:us=\EG8:vb@:ve=\E.4:vs=\E.2:tc=abm85:
+abm85e|85E|85e|Kimtron ABM 85H, 920E mode:\
+       :sg@:ug@:\
+       :im=\EZ:\
+       :is=\EC\EX\EA\E%\E9\Ee\Er\En\E"\E}\E'\E(\Ef\r\Ek\Eq\Em:\
+       :me=\E(\Ek:mh=\E):mr=\Ej:vb@:tc=abm85:
+abm85h-o|oabm85h|o85h|Kimtron ABM 85H, old firmware rev.:\
+       :sg@:ug@:\
+       :im=\EZ:\
+       :is=\E}\EC\EX\Ee\En\E%\Er\E(\Ek\Em\Eq\Ed\ET\EC\E9\EF:\
+       :me=\E(\Ek:mh=\E):mr=\Ej:\
+       :vb=\200\200\200\007\200\200\200:tc=abm85:
+# From: <malman@bbn-vax.arpa>
+# (kt7: removed obsolete ":ko=ic,dc,al,dl,cl,ce,cd,bt:", ":ma=^V^J^L :";
+# mapped ":pt:" to default tabs -- esr)
+kt7|kimtron model kt-7:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :al=\EE:bt=\EI:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :\
+       :dc=\EW:dl=\ER:do=^V:ei=:fs=\Eg:ho=^^:ic=\EQ:\
+       :if=/usr/share/tabset/stdcrt:im=:is=\El\E":k0=^AI\r:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:kd=^V:\
+       :kh=^^:kl=^H:kr=^L:ku=^K:nd=^L:se=\EG0:so=\EG4:\
+       :ts=\Ef:ue=\EG0:up=^K:us=\EG8:
+
+#### Microterm (act, mime)
+#
+# The mime1 entries refer to the Microterm Mime I or Mime II.
+# The default mime is assumed to be in enhanced act iv mode.
+#
+
+# New "safe" cursor movement (5/87) from reuss@umd5.umd.edu.  Prevents freakout with
+# out-of-range args on Sytek multiplexors.  No ":so=^N:" and ":se=^N:" since 
+# it gets confused and it's too dim anyway.  No ic since Sytek insists ^S 
+# means xoff.
+# (act4: found ":ic=2^S:ei=:im=:ip=.1*^V:" commented out in 8.3 -- esr)
+act4|microterm|microterm act iv:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=2.3*\001<2.3*/>:bl=^G:cd=2.2*\037:ce=.1*\036:\
+       :cl=12\014:cm=\024%+^X%>/0%+P:cr=^M:dc=.1*\004:\
+       :dl=2.3*\027:do=^K:ho=^]:kd=^K:kl=^H:kr=^X:ku=^Z:\
+       :le=^H:nd=^X:sf=^J:up=^Z:
+# The padding on :sr: and :ta: for act5 and mime is a guess and not final.
+# The act 5 has hardware tabs, but they are in columns 8, 16, 24, 32, 41 (!)...
+# (microterm5: removed obsolete ":ma==^Z^P^Xl^Kj:" -- esr)
+act5|microterm5|microterm act v:\
+       :kd=^K:kl=^H:kr=^X:ku=^Z:sr=\EH:uc=^H\EA:tc=act4:
+# Act V in split screen mode.  act5s is not tested and said not to work.
+act5s|skinny act5:\
+       :co#39:li#48:\
+       :te=\EQ:ti=\EP:tc=act5:
+# Mimes using brightness for standout.  Half bright is really dim unless
+# you turn up the brightness so far that lines show up on the screen.
+mime-fb|full bright mime1:\
+       :is=^S\E:se=^S:so=^Y:tc=mime:
+mime-hb|half bright mime1:\
+       :is=^Y\E:se=^Y:so=^S:tc=mime:
+# (mime: removed obsolete ":ma=^X ^K^J^Z^P:"; removed ":do=^K:" that overrode
+# the more plausible ":do=^J:"; mapped ":pt:" to ":it#8:" -- esr)
+# uc was at one time disabled to get around a curses bug, be wary of it
+mime|mime1|mime2|mimei|mimeii|microterm mime1:\
+       :am:bs:pt:\
+       :co#80:it#8:li#24:vt#9:\
+       :al=\001:bl=^G:cd=^_:ce=^^:cl=^]^C:\
+       :cm=\024%+^X%> 0%+P:cr=^M:dl=\027:do=^J:ho=^]:\
+       :is=^S\E^Q:kd=^K:kl=^H:kr=^X:ku=^Z:le=^H:nd=^X:sf=^J:\
+       :sr=\022:ta=\011:uc=^U:up=^Z:
+# These termcaps (for mime 2a) put the terminal in low intensity mode
+# since high intensity mode is so obnoxious.
+mime2a-s|microterm mime2a (emulating an enhanced soroc iq120):\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\001:bl=^G:cd=\EJ:ce=\EK:cl=\EL:cm=\E=%+ %+ :\
+       :cr=^M:dc=\ED:dl=\027:do=^J:ei=^Z:ho=^^:im=\EE:ip=:\
+       :is=\E):kd=^J:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:se=\E;:\
+       :sf=^J:so=\E\072:sr=\EI:ue=\E7:up=\EI:us=\E6:
+# This is the preferred mode (but ^X can't be used as a kill character)
+# (mime2a: replaced ":pt:" with SCO's "it#8" -- esr)
+mime2a|mime2a-v|microterm mime2a (emulating an enhanced vt52):\
+       :bs:pt:\
+       :co#80:it#8:li#24:\
+       :al=\001:bl=^G:cd=\EQ:ce=\EP:cl=\EL:cm=\EY%+ %+ :\
+       :cr=^M:dc=^N:dl=\027:do=^J:ei=^Z:ho=\EH:im=^O:ip=:\
+       :is=^Y:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+       :se=\E9:sf=^J:so=\E8:sr=\EA:ta=^I:ue=\E5:up=\EA:\
+       :us=\E4:
+# (mime3a: removed obsolete ":ma=^X ^K^J^Z^P:" -- esr)
+mime3a|mime1 emulating 3a:\
+       :am@:\
+       :kd=^K:kl=^H:kr=^X:ku=^Z:tc=adm3a:
+# (mime3ax: mapped ":pt:" to default tabs -- esr)
+mime3ax|mime-3ax|mime1 emulating enhanced 3a:\
+       :pt:\
+       :it#8:\
+       :al=\001:cd=^_:ce=^X:dl=\027:ta=\011:tc=mime3a:
+# Wed Mar  9 18:53:21 1983
+# We run our terminals at 2400 baud, so there might be some timing problems at
+# higher speeds. The major improvements in this model are the terminal now 
+# scrolls down and insert mode works without redrawing the rest of the line
+# to the right of the cursor. This is done with a bit of a kludge using the
+# exit graphics mode to get out of insert, but it does not appear to hurt
+# anything when using vi at least. If you have some users using act4s with
+# programs that use curses and graphics mode this could be a problem.
+mime314|mm314|mime 314:\
+       :am:\
+       :co#80:li#24:\
+       :al=^A:cd=^_:ce=^^:cl=^L:cm=\024%.%.:dc=^D:dl=^W:\
+       :ei=^V:ho=^]:im=^S:kd=^K:kl=^H:kr=^X:ku=^Z:le=^H:\
+       :nd=^X:ta=^I:up=^Z:
+# Fri Aug  5 08:11:57 1983
+# This entry works for the ergo 4000 with the following setups:
+# ansi,wraparound,newline disabled, xon/xoff disabled in both
+# setup a & c.
+#      
+# WARNING!!! There are multiple versions of ERGO 4000 microcode
+# Be advised that very early versions DO NOT WORK RIGHT !!  
+# Microterm does have a ROM exchange program- use it or lose big
+ergo4000|microterm ergo 4000:\
+       :da:db:ms:\
+       :co#80:li#66:\
+       :AL=\E[1L:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[H\E[2J:\
+       :cm=\E[%i%d;%dH:cr=^M:dc=\E[1P:dl=\E[1M:do=\E[B:\
+       :ei=\E[4l:im=\E[4h:\
+       :is=\E<\E=\E[?1l\E[?4l\E[?5l\E[?7h\E[?8h:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:kd=\E[B:ke=\E=:kl=\E[D:\
+       :kr=\E[C:ks=\E=:ku=\E[A:l1=pf1:l2=pf2:l3=pf3:l4=pf4:\
+       :le=^H:nd=\E[C:se=\E[0m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+       :up=\E[A:
+
+#### NCR 
+#
+# NCR's terminal group was merged with AT&T's when AT&T bought the company.
+# For what happened to that group, see the ADDS section.
+#
+
+# From <root@goliath.un.atlantaga.NCR.COM>, init string hacked by SCO.
+ncr7900i|7900i|ncr7900|7900|ncr 7900 model 1:\
+       :am:bw:ul:\
+       :co#80:li#24:sg#1:ug#1:\
+       :bl=^G:cd=\Ek:ce=\EK:cl=^L:cm=\E1%r%.%.:cr=^M:do=^J:\
+       :is=\E0@\010\E3\E4\E7:kd=^J:kh=^A:kl=^U:kr=^F:ku=^Z:\
+       :le=^H:ll=^A:mb=\E0B:me=\E0@:mh=\E0A:mr=\E0P:nd=^F:\
+       :pf=^T:po=^R:\
+       :..sa=\E0%p5%'@'%+%p4%{2}%*%+%p3%{16}%*%+%p2%{32}%*%+%p1%{17}%*%+%c:\
+       :se=\E0@:sf=^J:so=\E0Q:ue=\E0@:up=^Z:us=\E0`:
+ncr7900i-na|ncr7900-na|7900-na|ncr 7900 model 1 with no arrows:\
+       :kd@:kl@:kr@:ku@:tc=ncr7900i:
+ncr7900iv|ncr 7900 model 4:\
+       :am:bw:es:hs:\
+       :co#80:li#24:\
+       :al=\E^N:bl=^G:cl=^L:cm=\013%+@\E\005%02:cr=^M:\
+       :dl=\E^O:do=^J:ds=\Ey1:fs=\Ek\Ey5:ho=\013@\E^E00:\
+       :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:\
+       :k8=\ER:kb=^H:kd=\EB:kh=\EH:kl=\ED:kr=\EC:ku=\EA:\
+       :l6=blue:l7=red:l8=white:le=^H:nw=^M^J:sf=^J:\
+       :ts=\Ej\Ex5\Ex1\EY8%p1%{32}%+%c\Eo:
+ncr7901|7901|ncr 7901 model:\
+       :am:bw:ul:\
+       :co#80:li#24:\
+       :bl=^G:cd=\Ek:ce=\EK:ch=\020%+^J:cl=^L:cm=\EY%+ %+ :\
+       :cr=^M:cv=\013%+@:do=^J:is=\E4^O:kC=^L:kd=^J:kh=^H:\
+       :kl=^U:kr=^F:ku=^Z:le=^H:ll=^A:mb=\E0B:me=^O:mh=\E0A:\
+       :mr=\E0P:nd=^F:pf=^T:po=^R:\
+       :..sa=\E0%p5%'@'%+%p4%{2}%*%+%p3%{16}%*%+%p2%{32}%*%+%p1%{17}%*%+%c\016:\
+       :se=^O:sf=^J:so=\E0Q\016:ue=^O:up=^Z:us=\E0`\016:\
+       :ve=^X:vi=^W:
+
+#### Perkin-Elmer (Owl)
+#
+# These are official terminfo entries from within Perkin-Elmer.
+#
+
+bantam|pe550|pe6100|perkin elmer 550:\
+       :co#80:li#24:\
+       :bl=^G:ce=\EI:cl=\EK:cm=\EX%+ \EY%+ :cr=^M:do=^J:\
+       :ho=\EH:le=^H:ll=\EH\EA:nd=\EC:sf=^J:up=\EA:
+fox|pe1100|perkin elmer 1100:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EJ:ce=\EI:cl=\EH\EJ:cm=\EX%+ \EY%+ :cr=^M:\
+       :ct=\E3:do=^J:ho=\EH:le=^H:ll=\EH\EA:nd=\EC:sf=^J:\
+       :st=\E1:up=\EA:vb=\020\002\020\003:
+owl|pe1200|perkin elmer 1200:\
+       :am:in:\
+       :co#80:li#24:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EI:cl=\EH\EJ:\
+       :cm=\EX%+ \EY%+ :cr=^M:ct=\E3:dc=\EO:dl=\EM:do=^J:\
+       :ei=:ho=\EH:ic=\EN:im=:ip=:k0=\ERJ:k1=\ERA:k2=\ERB:\
+       :k3=\ERC:k4=\ERD:k5=\ERE:k6=\ERF:k7=\ERG:k8=\ERH:\
+       :k9=\ERI:kb=^H:le=^H:ll=\EH\EA:nd=\EC:se=\E!\200:\
+       :sf=^J:so=\E!^H:st=\E1:up=\EA:vb=\020\002\020\003:
+pe1251|pe6300|pe6312|perkin elmer 1251:\
+       :am:\
+       :co#80:it#8:li#24:pb#300:sg#1:vt#8:\
+       :bl=^G:cd=\EJ:ce=\EI:cl=\EK:cm=\EX%+ \EY%+ :cr=^M:\
+       :ct=\E3:do=\EB:ho=\EH:k0=\ERA:k1=\ERB:k2=\ERC:\
+       :k3=\ERD:k4=\ERE:k5=\ERF:k6=\ERG:k7=\ERH:k8=\ERI:\
+       :k9=\ERJ:k;=\ERK:le=\ED:nd=\EC:sf=^J:st=\E1:up=\EA:
+pe7000m|perkin elmer 7000 series monochrome monitor:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:bt=\E!Y:cd=\EJ:ce=\EI:cl=\EK:cm=\ES%+ %+ :\
+       :cr=^M:do=\EB:ho=\EH:i1=\E!\200\EW  7o\Egf\ES7 :\
+       :k0=\E!\200:k1=\E!^A:k2=\E!^B:k3=\E!^C:k4=\E!^D:\
+       :k5=\E!^E:k6=\E!^F:k7=\E!^G:k8=\E!^H:k9=\E!^I:\
+       :k;=\E!^J:kb=^H:kd=\E!U:kh=\E!S:kl=\E!V:kr=\E!W:\
+       :ku=\E!T:le=\ED:ll=\ES7 :nd=\EC:se=\E!\200:sf=^J:\
+       :so=\E!^H:sr=\ER:ue=\E!\200:up=\EA:us=\E! :
+pe7000c|perkin elmer 7000 series colour monitor:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:bt=\E!Y:cd=\EJ:ce=\EI:cl=\EK:cm=\ES%+ %+ :\
+       :cr=^M:do=\EB:ho=\EH:\
+       :i1=\E!\200\EW  7o\Egf\Eb0\Ec7\ES7 :k0=\E!\200:\
+       :k1=\E!^A:k2=\E!^B:k3=\E!^C:k4=\E!^D:k5=\E!^E:\
+       :k6=\E!^F:k7=\E!^G:k8=\E!^H:k9=\E!^I:k;=\E!^J:kb=^H:\
+       :kd=\E!U:kh=\E!S:kl=\E!V:kr=\E!W:ku=\E!T:le=\ED:\
+       :ll=\ES7 :nd=\EC:se=\Eb0:sf=^J:so=\Eb2:sr=\ER:\
+       :ue=\E!\200:up=\EA:us=\E! :
+
+#### Sperry Univac
+#
+# Sperry Univac has merged with Burroughs to form Unisys.
+#
+
+# This entry is for the Sperry UTS30 terminal running the TTY 
+# utility under control of CP/M Plus 1R1. The functionality 
+# provided is comparable to the DEC vt100.
+uts30|sperry uts30 with cp/m@1R1:\
+       :am:bw:hs:\
+       :co#80:li#24:ws#40:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+       :LE=\E[%dD:RI=\E[%dC:SF=\E[%dB:SR=\E[%dA:UP=\E[%dA:\
+       :ae=\Ed:al=\EN:as=\EF:bl=^G:cd=\E[J:ce=\E[K:cl=^L:\
+       :cm=\E[%i%d;%dH:cr=^M:cs=\EU%+ %+ :dc=\EM:dl=\EL:\
+       :do=\EB:ei=:fs=^M:ho=\E[H:ic=\EO:im=:\
+       :is=\E[U 7\E[24;1H:kb=^H:kd=\EOB:kh=\E[H:kl=\EOD:\
+       :kr=\EOC:ku=\EOA:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:\
+       :mr=\E[7m:nd=\EC:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\EX:\
+       :rf=/usr/lib/tabset/vt100:sc=\EW:se=\E[m:sf=^J:\
+       :so=\E[7m:sr=\EI:ta=^I:ts=\E]:uc=\EPB:ue=\E[m:\
+       :up=\E[A:us=\E[4m:ve=\ES:vi=\ER:
+
+#### Tandem
+#
+# Tandem builds these things for use with its line of fault-tolerant
+# transaction-processing computers.  They aren't generally available
+# on the merchant market, and so are fairly uncommon.
+#
+
+tandem6510|adm3a repackaged by Tandem:\
+       :tc=adm3a:
+
+# A funny series of terminal that TANDEM uses.  The actual model numbers
+# have a fourth digit after 653 that designates minor variants.  These are
+# natively block-mode and rather ugly, but they have a character mode which
+# this doubtless(?) exploits.  There is a 6520 that is slightly dumber.
+# (tandem653: had ":sb=\ES:", probably someone's mistake for sf -- esr)
+tandem653|t653x|Tandem 653x multipage terminal:\
+       :am:bs:da:db:hs:\
+       :co#80:li#24:sg#1:ug#1:ws#64:\
+       :cd=\EJ:ce=\EK:cl=\EI:cm=\023%+ %+ :do=^J:ds=\Eo\r:\
+       :fs=^M:ho=\EH:if=/usr/share/tabset/tandem653:le=^H:\
+       :nd=\EC:se=\E6 :sf=\ES:so=\E6$:sr=\ET:ts=\Eo:ue=\E6 :\
+       :up=\EA:us=\E60:
+
+#### Tandy/Radio Shack
+#
+# Tandy has a line of VDTs distinct from its microcomputers.
+#
+
+dmterm|deskmate terminal:\
+       :am:bw:\
+       :co#80:li#24:\
+       :al=\EP:bl=^G:cd=\EJ:ce=\EK:cl=\Ej:cm=\EY%+ %+ :\
+       :cr=^M:dc=\ES:dl=\ER:do=\EB:ei=:ho=\EH:ic=\EQ:im=:\
+       :k0=\E1:k1=\E2:k2=\E3:k3=\E4:k4=\E5:k5=\E6:k6=\E7:\
+       :k7=\E8:k8=\E9:k9=\E0:kd=\EB:kh=\EH:kl=\ED:kr=\EC:\
+       :ku=\EA:l0=f1:l1=f2:l2=f3:l3=f4:l4=f5:l5=f6:l6=f7:\
+       :l7=f8:l8=f9:l9=f10:le=^H:ll=\EE:nd=\EC:se=\EG0:\
+       :sf=\EX:so=\EG4:ta=^I:up=\EA:ve=\EG6:vi=\EG5:
+dt100|dt-100|Tandy DT-100 terminal:\
+       :xo:\
+       :co#80:li#24:sg#1:ug#1:\
+       :ac=kkllmmjjnnwwvvttuuqqxx:ae=^O:al=\E[L:as=^N:bl=^G:\
+       :cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:cm=\010\E[%i%d;%dH:\
+       :cr=^M:cs=\E[%2;%2r:dc=\E[P:dl=\E[M:do=\E[B:ei=:\
+       :ho=\E[H:ic=\E[@:im=:is=\E[?3l\E)0\E(B:k1=\E[?3i:\
+       :k2=\E[2i:k3=\E[@:k4=\E[M:k5=\E[17~:k6=\E[18~:\
+       :k7=\E[19~:k8=\E[20~:k9=\E[21~:k;=\E[?5i:kN=\E[29~:\
+       :kP=\E[28~:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:\
+       :l1=f1:l2=f2:l3=f3:l4=f4:l5=f5:l6=f6:l7=f7:l8=f8:\
+       :le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
+dt100w|dt-100w|Tandy DT-100 terminal:\
+       :co#132:\
+       :bl=^G:cr=^M:do=^J:is=\E[?3l\E)0\E(B:sf=^J:tc=dt100:
+dt110|Tandy DT-110 emulating ansi:\
+       :xo:\
+       :co#80:li#24:\
+       :@7=\E[K:ac=kkllmmjjnnwwvvuuttqqxx:ae=^O:al=\E[0L:\
+       :as=^N:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[;H\E[2J:\
+       :cm=\010\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:dc=\E[0P:\
+       :dl=\E[0M:do=\E[0B:eA=\E(B\E)0:ei=:ho=\E[H:ic=\E[0@:\
+       :im=:is=\E[?3l\E)0\E(B:k1=\E[1~:k2=\E[2~:k3=\E[3~:\
+       :k4=\E[4~:k5=\E[5~:k6=\E[6~:k7=\E[7~:k8=\E[8~:\
+       :k9=\E[9~:k;=\E[10~:kI=\E[@:kN=\E[26~:kP=\E[25~:\
+       :kd=\E[B:kh=\E[G:kl=\E[D:kr=\E[C:ku=\E[A:l0=f1:l1=f2:\
+       :l2=f3:l3=f4:l4=f5:l5=f6:l6=f7:l7=f8:l8=f9:l9=f10:\
+       :le=^H:nd=\E[C:se=\E[0m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+       :ue=\E[0m:up=\E[0A:us=\E[4m:ve=\E[?25h:vi=\E[?25l:
+dt200|td200|Tandy 200:\
+       :am:xt:\
+       :co#40:li#16:\
+       :al=\EL:bl=^G:cd=^L:ce=\EK:cl=\EE:cm=\EY%+ %+ :cr=^M:\
+       :dl=\EM:do=^_:kd=^_:kl=^]:kr=^\:ku=^^:le=^H:nd=^\:\
+       :se=\Eq:sf=^J:so=\Ep:up=\EA:
+pt210|TRS-80 PT-210 printing terminal:\
+       :hc:os:\
+       :co#80:\
+       :bl=^G:cr=^M:do=^J:sf=^J:
+
+#### Tektronix (tek)
+#
+# Tektronix tubes are graphics terminals.  Most of them use modified 
+# oscilloscope technology incorporating a long-persistence green phosphor,
+# and support vector graphics on a main screen with an attached "dialogue
+# area" for interactive text.
+#
+
+tek|tek4012|4012|tektronix 4012:\
+       :os:\
+       :co#75:li#35:\
+       :bl=^G:cl=\E\014:cr=^M:do=^J:ff=\014:is=\E^O:le=^H:
+tek4013|4013|tektronix 4013:\
+       :ae=\E^O:as=\E^N:tc=tek4012:
+tek4014|4014|tektronix 4014:\
+       :co#81:li#38:\
+       :is=\E\017\E9:tc=tek4012:
+tek4015|4015|tektronix 4015:\
+       :ae=\E^O:as=\E^N:tc=tek4014:
+tek4014-sm|4014-sm|tektronix 4014 in small font:\
+       :co#121:li#58:\
+       :is=\E\017\E\072:tc=tek4014:
+tek4015-sm|4015-sm|tektronix 4015 in small font:\
+       :ae=\E^O:as=\E^N:tc=tek4014-sm:
+tek4023|4023|tex|tektronix 4023:\
+       :am:\
+       :co#80:li#24:vt#4:\
+       :bl=^G:cl=\E\014:cm=\034%r%+ %+ :cr=^M:do=^J:le=^H:\
+       :nd=^I:se=^_@:sf=^J:so=^_P:
+# It is recommended that you run the 4025 at 4800 baud or less;
+# various bugs in the terminal appear at 9600.  It wedges at the
+# bottom of memory (try "cat /usr/dict/words"); ^S and ^Q typed
+# on keyboard don't work.  You have to hit BREAK twice to get
+# one break at any speed - this is a documented feature.
+# Can't use cursor motion because it's memory relative, and 
+# because it only works in the workspace, not the monitor.  
+# Same for home. Likewise, standout only works in the workspace.
+# 
+# el was commented out since vi and rogue seem to work better 
+# simulating it with lots of spaces!
+# 
+# il1 and il had 145ms of padding, but that slowed down vi's ^U 
+# and didn't seem necessary.
+#
+tek4024|tek4025|tek4027|tektronix 4024/4025/4027:\
+       :am:da:db:\
+       :co#80:it#8:li#34:lm#0:\
+       :AL=\037up\r\037ili %d\r:CC=^_:DL=\037dli %d\r\006:\
+       :DO=\037dow %d\r:LE=\037lef %d\r:RI=\037rig %d\r:\
+       :UP=\037up %d\r:al=\037up\r\037ili\r:bl=^G:\
+       :cd=\037dli 50\r:cl=\037era\r\n\n:cr=^M:dc=\037dch\r:\
+       :dl=\037dli\r\006:do=^F^J:ei=:ic=\037ich\r \010:im=:\
+       :is=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r:\
+       :ke=\037lea p2\r\037lea p4\r\037lea p6\r\037lea p8\r\037lea f5\r:\
+       :ks=\037lea p4 /h/\r\037lea p8 /k/\r\037lea p6 / /\r\037lea p2 /j/\r\037lea f5 /H/\r:\
+       :le=^H:nd=\037rig\r:sf=^F^J:ta=^I:up=^K:
+tek4025-17|4025-17|4027-17|tek 4025 17 line window:\
+       :li#17:\
+       :tc=tek4025:
+tek4025-17-ws|4025-17-ws|4025-17ws|4027-17ws|4027-17-ws|tek 4025 17 line window in workspace:\
+       :is=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r\037wor 17\r\037mon 17\r:\
+       :se=\037att s\r:so=\037att e\r:te=\037mon h\r:\
+       :ti=\037wor h\r:tc=tek4025-17:
+tek4025-ex|tek4027-ex|tek 4025/4027 w/!:\
+       :is=\037com 33\r\n!sto 9 17 25 33 41 49 57 65 73\r:\
+       :te=\037com 33\r:ti=!com 31\r:tc=tek4025:
+# Tektronix 4025a
+# From: Doug Gwyn <gwyn@brl-smoke.ARPA>
+# The following status modes are assumed for normal operation (replace the
+# initial "!" by whatever the current command character is):
+#      !COM 29                 # NOTE: changes command character to GS (^])
+#      ^]DUP
+#      ^]ECH R
+#      ^]EOL
+#      ^]RSS T
+#      ^]SNO N
+#      ^]STO 9 17 25 33 41 49 57 65 73
+# Other modes may be set according to communication requirements.
+# If the command character is inadvertently changed, termcap can't restore it.
+# Insert-character cannot be made to work on both top and bottom rows.
+# Clear-to-end-of-display emulation via !DLI 988 is too groady to use, alas.
+# There also seems to be a problem with vertical motion, perhaps involving
+# delete/insert-line, following a typed carriage return.  This terminal sucks.
+# Delays not specified; use "stty ixon -ixany" to enable DC3/DC1 flow control!
+# (tek4025a: mapped ":pt:" to default tabs; removed obsolete ":xx:".
+# This may mean the tek4025a entry won't work any more. -- esr)
+tek4025a|4025a|Tektronix 4025A:\
+       :am:bs:bw:da:db:pt:xo:\
+       :co#80:li#34:\
+       :CC=^]:DC=\035dch %d;:DL=\035dli %d;:DO=\035dow %d;:\
+       :LE=\035lef %d;:RI=\035rig %d;:SF=\035dow %d;:\
+       :UP=\035up %d;:al=\013\035ili;:bl=^G:bt=\035bac;:\
+       :ce=\035dch 80;:ch=\r\035rig %d;:\
+       :cl=\035era;\n\035rup;:cr=^M:ct=\035sto;:dc=\035dch;:\
+       :dl=\035dli;:do=^J:le=^H:nd=\035rig;:\
+       :rs=!com 29\035del 0\035rss t\035buf\035buf n\035cle\035dis\035dup\035ech r\035eol\035era g\035for n\035pad 203\035pad 209\035sno n\035sto 9 17 25 33 41 49 57 65 73\035wor 0;:\
+       :sf=^J:ta=^I:up=^K:
+# From: cbosg!teklabs!davem Wed Sep 16 21:11:41 1981
+# Here's the command file that I use to get rogue to work on the 4025.
+# It should work with any program using the old curses (e.g. it better
+# not try to scroll, or cursor addressing won't work.  Also, you can't
+# see the cursor.)
+# (This "learns" the arrow keys for rogue. I have adapted it for termcap - mrh)
+# (tek4025-cr: mapped ":pt:" to default tabs -- esr)
+tek4025-cr|4025-cr|tek 4025 for curses and rogue:\
+       :am:bs:pt:\
+       :co#80:li#33:\
+       :cl=\037era;:cm=\037jum%i%d\054%d;:do=^F^J:\
+       :is=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r:\
+       :le=^H:nd=\037rig;:nl=^F^J:te=\037wor 0:\
+       :ti=\037wor 33h:up=^K:
+# next two lines commented out since curses only allows 128 chars, sigh.
+#      :ti=\037lea p1/b/\037lea p2/j/\037lea p3/n/\037lea p4/h/\037lea p5/ /\037lea p6/l/\037lea p7/y/\037lea p8/k/\037lea p9/u/\037lea p./f/\037lea pt/`era w/13\037lea p0/s/\037wor 33h:\
+#      :te=\037lea p1\037lea p2\037lea p3\037lea p4\037lea pt\037lea p5\037lea p6\037lea p7\037lea p8\037lea p9/la/13\037lea p.\037lea p0\037wor 0:
+tek4025ex|4025ex|4027ex|tek 4025 w/!:\
+       :is=\037com 33\r\n!sto 9\05417\05425\05433\05441\05449\05457\05465\05473\r:\
+       :te=\037com 33\r:ti=!com 31\r:tc=tek4025:
+tek4105|4105|tektronix 4105:\
+       :am:mi:ms:ul:xn:xt:\
+       :co#79:it#8:li#29:\
+       :ae=\E[0m:al=\E[1L:as=\E[1m:bl=^G:bt=\E[Z:cd=\E[J:\
+       :ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%2;%2H:cr=^M:ct=\E[1g:\
+       :dc=\E[1P:dl=\E[1M:do=\E[1B:ei=\E[4l:ho=\E[H:\
+       :i1=\E%!1\E[0m:im=\E[4h:is=\E%!1\E[?6141\E[0m:kb=^H:\
+       :kd=\E[1B:kl=\E[1D:kr=\E[1C:ku=\E[1A:mb=\E[=3;<7m:\
+       :md=\E[=7;<4m:me=\E[=0;<1m:mh=\E[=1;<6m:mk=\E[=6;<5:\
+       :mr=\E[=1;<3m:nd=\E[1C:se=\E[=0;<1m:sf=\E[S:\
+       :so=\E[=2;<3m:sr=\E[T:ta=^I:ti=\E%!1\E[?6l\E[2J:\
+       :ue=\E[=0;<1m:up=\E[1A:us=\E[=5;<2m:
+
+tek4105-30|4105-30|4015 emulating 30 line vt100:\
+       :am:mi:ms:xn:xo:\
+       :co#80:it#8:li#30:vt#3:\
+       :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+       :K5=\EOn:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:do=^J:eA=\E(B\E)0:ho=\E[H:k0=\EOy:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:\
+       :k8=\EOl:k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m\017:mr=\E[7m:nd=\E[C:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :..sa=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;:\
+       :sc=\E7:se=\E[m:sf=^J:so=\E[1;7m:sr=\EM:st=\EH:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+
+tek4107|tek4109|4107|4109|tektronix terminals 4107 4109:\
+       :am:mi:ms:ul:xn:xt:\
+       :co#79:it#8:li#29:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\ELZ:cm=\EY%+ %+ :cr=^M:\
+       :do=^J:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:\
+       :mb=\E%!1\E[5m\E%!0:md=\E%!1\E[1m\E%!0:\
+       :me=\E%!1\E[m\E%!0:mh=\E%!1\E[<0m\E%!0:\
+       :mr=\E%!1\E[7m\E%0:nd=\EC:\
+       :..sa=\E%%!1\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m\E%%!0:\
+       :se=\E%!1\E[m\E%!0:sf=^J:so=\E%!1\E[7;5m\E%!0:sr=\EI:\
+       :ta=^I:ue=\E%!1\E[m\E%!0:up=\EA:us=\E%!1\E[4m\E%!0:\
+       :ve=\E%!0:vs=\E%!3:
+# Tektronix 4207 with sysline.  In the ancestral termcap file this was 4107-s;
+# see the note attached to tek4207.
+tek4207-s|Tektronix 4207 with sysline but no memory:\
+       :es:hs:\
+       :ds=\E7\E[?6l\E[2K\E[?6h\E8:fs=\E[?6h\E8:\
+       :i2=\E7\E[?6l\E[2K\E[?6h\E8:\
+       :is=\E%!1\E[2;32r\E[132D\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J:\
+       :ts=\E7\E[?6l\E[2K\E[;%i%df:tc=tek4107:
+
+# The 4110 series may be a wonderful graphics series, but they make the 4025
+# look good for screen editing.  In the dialog area, you can't move the cursor
+# off the bottom line.  Out of the dialog area, ^K moves it up, but there
+# is no way to scroll.
+# 
+# Note that there is a floppy for free from Tek that makes the 
+# 4112 emulate the vt52 (use the vt52 termcap). There is also
+# an expected enhancement that will use ANSI standard sequences.
+# 
+# 4112 in non-dialog area pretending to scroll. It really wraps 
+# but vi is said to work (more or less) in this mode.
+# 
+# 'vi' works reasonably well with this entry.
+#
+otek4112|o4112-nd|otek4113|otek4114|tektronix 4110 series:\
+       :am:\
+       :co#80:li#34:\
+       :bl=^G:cl=\E^L:cr=^M:do=^J:le=^H:sf=^J:te=\EKA1\ELV1:\
+       :ti=\EKA0\ELV0\EMG0:up=^K:
+# The 4112 with the ANSI compatibility enhancement
+tek4112|tek4114|tektronix 4110 series:\
+       :am:bs:db:\
+       :co#80:li#34:\
+       :al=\E[L:bt=\E[Z:cd=\E[0J:ce=\E[0K:cl=\E[2J\E[0;0H:\
+       :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:ei=:ic=\E[@:im=:\
+       :is=\E3!1:nd=\E[C:se=\E[m:sf=\E7\E[0;0H\E[M\E8:\
+       :so=\E[7m:sr=\E7\E[0;0H\E[L\E8:ue=\E[m:up=\EM:\
+       :us=\E[4m:ve=:vs=:
+tek4112-nd|4112-nd|4112 not in dialog area:\
+       :ns:\
+       :up=^K:tc=tek4112:
+tek4112-5|4112-5|4112 in 5 line dialog area:\
+       :li#5:\
+       :tc=tek4112:
+# (tek4113: this used to have ":nd=\LM1 \LM0:", someone's mistake;
+# removed ":as=\E^N:ae=\E^O:", which had been commented out in 8.3.
+# Note, the !0 and !1 sequences in :te:/:ti:/:ve:/:vs: were previously \0410
+# and \0411 sequences...I don't *think* they were supposed to be 4-digit
+# octal -- esr)
+tek4113|tektronix 4113 color graphics, 5 line dialog area:\
+       :am:bs:da:eo:\
+       :co#80:li#5:\
+       :cl=\ELZ:do=^J:is=\EKA1\ELL5\ELV0\ELV1:le=^H:\
+       :nd=\ELM1 \ELM0:uc=\010\ELM1_\ELM0:\
+       :vb=\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERB0:
+tek4113-34|4113-34|tektronix 4113 color graphics, 34 line dialog area:\
+       :li#34:\
+       :is=\EKA1\ELLB2\ELV0\ELV1:tc=tek4113:
+# :ns: left off to allow vi visual mode. APL font (:as=\E^N:/:ae=\E^O:) not 
+# supported here. :uc: is slow, but looks nice. Suggest setenv MORE -up .
+# :vb: needs enough delay to let you see the background color being toggled.
+# (tek4113-nd: mapped ":pt:" to default tabs -- esr)
+tek4113-nd|4113-nd|tektronix 4113 color graphics, no dialog area:\
+       :am:bs:eo:pt:\
+       :co#80:li#34:\
+       :cl=\E^L:do=^J:ho=\ELF7l\177 @:\
+       :is=\ELZ\EKA0\ELF7l\177 @:le=^H:ll=\ELF hl @:nd=^I:\
+       :se=\EMT1:so=\EMT2:uc=\010\EMG1_\EMG0:up=^K:\
+       :vb=\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERB0:\
+       :vs=\ELZ\EKA0:
+# This entry is from Tek. Inc.  (Brian Biehl)
+# (tek4115: mapped ":pt:" to default tabs; :bc: renamed to :le: -- esr)
+otek4115|Tektronix 4115:\
+       :am:bs:da:db:eo:pt:\
+       :co#80:li#34:\
+       :al=\E[L:bt=\E[Z:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:\
+       :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=\E[B:ei=\E[4l:\
+       :ho=\E[;H:if=/usr/share/tabset/vt100:im=\E[4h:\
+       :is=\E%!0\E%\014\ELV0\EKA1\ELBB2\ENU@=\ELLB2\ELM0\ELV1\EKYA?\E%!1\E[<1l\E[?7h\E[?8h\E[34;1H\E[34B\E[0m:\
+       :kb=^H:ke=\E>:ks=\E=:le=\E[D:nd=\E[C:se=\E[m:\
+       :so=\E[7m:sr=\EM:te=\E%!0\ELBG8\E%!1\E[34;1H\E[J:\
+       :ti=\E%!0\ELBB2\E%!1:ue=\E[m:up=\E[A:us=\E[4m:\
+       :ve=\E%!0\ELBG8\E%!1\E[34;1H:vs=\E%!0\ELBB2\E%!1:
+tek4115|newer tektronix 4115 entry with more ANSI capabilities:\
+       :am:xo:\
+       :co#80:li#34:\
+       :AL=\E[%dL:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:LE=\E[%dD:\
+       :RI=\E[%dC:UP=\E[%dA:al=\E[L:bl=^G:bt=\E[Z:cd=\E[J:\
+       :ce=\E[K:ch=\E[%+^AG:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :cr=^M:ct=\E[2g:cv=\E[%+^Ad:dc=\E[P:dl=\E[M:do=^J:\
+       :ei=:ho=\E[H:ic=\E[@:im=:kb=^H:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[0m:mk=\E[8m:mr=\E[7m:nd=\E[C:\
+       :..rp=%p1%c\E[%p2%{1}%-%db:\
+       :..sa=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1;%;m:\
+       :se=\E[m:sf=^J:so=\E[7m:st=\EH:ta=^I:ue=\E[m:up=\E[A:\
+       :us=\E[4m:
+# The tek4125 emulates a vt100 incorrectly - the scrolling region
+# command is ignored.  The following entry replaces the :cs: with the needed
+# :al:, :dl:, and :im:; removes some cursor pad commands that the tek4125
+# chokes on; and adds a lot of initialization for the tek dialog area.
+# Note that this entry uses all 34 lines and sets the cursor color to green.
+# Steve Jacobson 8/85
+# (tek4125: there were two "\!"s in the is that I replaced with "\E!" -- esr)
+tek4125|4125:\
+       :li#34:\
+       :al=\E[1L:cs@:dl=\E[1M:im=\E1:\
+       :is=\E%\E!0\EQD1\EUX03\EKA\ELBB2\ELCE0\ELI100\ELJ2\ELLB2\ELM0\ELS1\ELX00\ELV1\E%\E!1\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:\
+       :ks=\E=:rc@:sc@:tc=vt100:
+
+# From: <jcoker@ucbic>
+# (tek4107: mapped ":pt:" to default tabs.  This was the termcap file's
+# entry for the 4107/4207, but SCO supplied another, less capable 4107 entry. 
+# So we'll use that for 4107 and note that if jcoker wasn't confused you
+# may be able to use this one. -- esr)
+tek4207|Tektronix 4207 graphics terminal with memory:\
+       :am:bs:bw:mi:pt:ul:xn:\
+       :co#80:li#32:\
+       :al=3\E[L:bt=\E[Z:cd=\E[J:ce=5\E[K:cl=156\E[H\E[J:\
+       :cm=\E[%i%d;%dH:dc=4\E[P:dl=3\E[M:do=^J:ei=:ho=\E[H:\
+       :ic=4\E[@:im=:\
+       :is=\E%!0\ELBP0\E%!1\E[H\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J:\
+       :kd=\ED:kh=\E[H:kl=\E[D:kr=\E[C:ku=\EM:le=^H:\
+       :mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:se=\E[m:\
+       :so=\E[7m:te=\E[?6h\E%!0\ELBP0\E%!1\E[32;1f:\
+       :ti=\E[?6l\E[H\E[J:ue=\E[m:up=\EM:us=\E[4m:
+
+# From: <carolyn@dali.berkeley.edu>  Thu Oct 31 12:54:27 1985
+# (tek4404: There was a "\!" in :ti: that I replaced with "\E!";
+# also mapped ":pt:" to default tabs -- esr)
+tek4404|4404:\
+       :bs:pt:\
+       :co#80:li#32:\
+       :al=\E[1L:cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:\
+       :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[1M:\
+       :do=^J:ei=\E[4l:ho=\E[H:im=\E[4h:kd=\E[B:ke=\E[?1h:\
+       :kl=\E[D:kr=\E[C:ks=\E[?1l:ku=\E[A:mb=\E[5m:md=\E[1m:\
+       :me=\E[m:nd=\E[C:rc=\E8:sc=\E7:se=\E[27m:so=\E[7m:\
+       :ta=\E[2I:te=\E[1;1H\E[0J\E[?6h\E[?1l:\
+       :ti=\E%\E!1\E[1;32r\E[?6l\E>:ue=\E[m:up=\E[A:\
+       :us=\E[4m:
+# t500 is a local entry for the oddball Tek 500 owned by Fluke 
+# Labs
+#
+t500|Tek series 500:\
+       :am:bw:\
+       :co#80:li#25:\
+       :bl=^G:cl=\005:cm=\E=%+ %+ :cr=^M:do=^J:ho=^T:le=^H:\
+       :sf=^J:
+# I added the is string - straight Unix has ESC ; in the login 
+# string which sets a ct8500 into monitor mode (aka 4025 snoopy 
+# mode). The is string here cleans up a few things (but not 
+# everything).
+#
+ct8500|tektronix ct8500:\
+       :am:bw:da:db:\
+       :co#80:li#25:\
+       :al=\E^L:bl=^G:bt=\E^I:cd=\E^U:ce=\E^T:cl=\E^E:\
+       :cm=\E|%+ %+ :cr=^M:dc=\E^]:dl=\E^M:do=^J:ei=:\
+       :ic=\E^\:im=:is=\037\EZ\Ek:le=^H:me=\E :nd=\ES:\
+       :se=\E :sf=^J:so=\E$:sr=\E^A:ta=^I:ue=\E :up=\ER:\
+       :us=\E!:
+
+# Tektronix 4205 terminal.
+#
+# am is not defined because the wrap around occurs not when the char.
+# is placed in the 80'th column, but when we are attempting to type
+# the 81'st character on the line.
+#
+# Bold, dim, and standout are simulated by colors and thus not allowed
+# with colors.  The tektronix color table is mapped into the RGB color
+# table by setf/setb. All colors are reset to factory specifications by oc.
+# The initc cap uses RGB notation to define colors.  for arguments 1-3 the 
+# interval (0-1000) is broken into 8 smaller sub-intervals (125).  Each sub-
+# interval then maps into pre-defined value.
+# (untranslatable capabilities removed to fit entry within 1023 bytes)
+# WARNING: this entry, 1264 bytes long, may core-dump older termcap libraries!
+tek4205|4205|tektronix 4205:\
+       :cc:mi:ms:\
+       :Co#8:NC#49:co#80:it#8:li#30:pa#63:\
+       :AL=\E[%dL:DO=\E[%dB:IC=\E[%d@::LE=\E[%dD:RI=\E[%dC::\
+       ::UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[1L:as=^N:bl=^G:bt=\E[Z:cb=\E[1K:cd=\E[J:\
+       :ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:cr=^M:ct=\E[1g:\
+       :dc=\E[1P:dl=\E[1M:do=\E[B:eA=\E)0:ec=\E%dX:ei=\E[4l:\
+       :ho=\E[H:i1=\E%!0\ETM1\E%!1\E[0m:im=\E[4h:k0=\EOA:\
+       :k1=\EOB:k2=\EOC:k3=\EOD:k4=\EP:k5=\EQ:k6=\ER:k7=\ES:\
+       :kb=^H:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=\E[D:\
+       :mb=\E[5m:md=\E[=7;<4m:me=\E[=0;<1m\E[24;25;27m\017:\
+       :mh=\E[=1;<6m:mk=\E[=6;<5:mr=\E[7m:nd=\E[C:\
+       :oc=\E%!0\n\ETFB0\n0000\n1F4F4F4\n2F400\n30F40\n4A4C<F4\n50F4F4\n6F40F4\n7F4F40\n\E%!1:\
+       :op=\E[39;40m:se=\E[=0;<1m:sf=\ED:so=\E[=2;<3m:\
+       :sr=\EM:ta=^I:ti=\E%%!1\E[?6l\E[2J:ue=\E[24m:up=\E[A:\
+       :us=\E[4m:
+
+#### Teletype (tty)
+#
+# These are the hardcopy Teletypes from before AT&T bought the company,
+# clattering electromechanical dinosaurs in Bakelite cases that printed on
+# pulpy yellow roll paper.  If you remember these you go back a ways.
+# Teletype-branded VDTs are listed in the AT&T section.
+#
+# The earliest UNIXes were designed to use these clunkers; nroff and a few
+# other programs still default to emitting codes for the Model 37.
+#
+
+tty33|model 33 teletype:\
+       :hc:os:xo:\
+       :co#72:\
+       :bl=^G:cr=^M:do=^J:sf=^J:
+tty35|model 35 teletype:\
+       :tc=tty33:
+tty37|model 37 teletype:\
+       :bs:hc:os:xo:\
+       :bl=^G:cr=^M:do=^J:hd=\E9:hu=\E8:le=^H:sf=^J:up=\E7:
+
+# There are known to be at least three flavors of the tty40, all seem more
+# like IBM half duplex forms fillers than ASCII terminals.  They have lots of
+# awful braindamage, such as printing a visible newline indicator after each
+# newline.  The 40-1 is a half duplex terminal and is hopeless.  The 40-2 is
+# braindamaged but has hope and is described here.  The 40-4 is a 3270
+# lookalike and beyond hope.  The terminal has visible bell but I don't know
+# it - it's null here to prevent it from showing the BL character.
+# There is an \EG in :nl: because of a bug in old vi (if stty says you have
+# a "newline" style terminal (-crmode) vi figures all it needs is nl
+# to get crlf, even if :cr: is not ^M.)
+# (tty40: removed obsolete ":nl=\EG\EB:", it's just do+cr -- esr)
+tty40|ds40|ds40-2|dataspeed40|teletype dataspeed 40/2:\
+       :xo:\
+       :co#80:li#24:\
+       :al=\EL:cd=\EJ:cl=\EH\EJ:cr=\EG:ct=\EH\E2:dc=\EP:\
+       :dl=\EM:do=\EB:ei=:ho=\EH:ic=\E^:im=:kb=^]:kl=^H:\
+       :le=^H:nd=\EC:pf=^T:po=\022:r2=\023\ER:se=\E4:sf=\ES:\
+       :so=\E3:sr=\ET:st=\E1:ta=\E@:up=\E7:
+tty43|model 43 teletype:\
+       :am:bs:hc:os:xo:\
+       :co#132:\
+       :bl=^G:cr=^M:do=^J:kb=^H:le=^H:sf=^J:
+
+#### Tymshare
+#
+
+scanset|sc410|sc415|Tymshare Scan Set:\
+       :am:bw:ms:\
+       :co#80:li#24:\
+       :ac=l<m-k4j%q\\\054x5:ae=^O:as=^N:bl=^G:cd=\EJ:\
+       :ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:do=^J:ho=\EH:\
+       :kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=^I:pf=\E;0:\
+       :po=\E;0:ps=\E;3:r1=\E>:rc=^C:sc=^B:sf=^J:up=^K:
+
+scanset-n|Tymshare Scan Set in 40 col mode:\
+       :r2=\E<:tc=scanset:
+
+#### Volker-Craig (vc)
+#
+
+# Missing in vc303a and vc303 descriptions:  they scroll 2 lines at a time
+# every other linefeed.
+vc303a|vc403a|volker-craig 303a:\
+       :am:bs:ns:\
+       :co#80:li#24:\
+       :bl=^G:ce=\026:cl=\030:cr=^M:do=^J:ho=\031:kd=^J:\
+       :kl=^H:kr=^U:ku=^Z:le=^H:ll=^P:nd=^U:up=^Z:
+vc303|vc103|vc203|volker-craig 303:\
+       :am:bs:ns:\
+       :co#80:li#24:\
+       :bl=^G:cl=\014:cr=^M:do=^J:ho=\013:kd=^J:kl=^H:kr=^I:\
+       :ku=^N:le=^H:ll=\017W:nd=^I:up=^N:
+# (vc404: removed obsolete ":ma=^Z^P^U :" -- esr)
+vc404|volker-craig 404:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cd=\027:ce=\026:cl=\030:cm=\020%+ %+ :cr=^M:\
+       :do=^J:ho=\031:kd=^J:kl=^H:kr=^U:ku=^Z:le=^H:nd=^U:\
+       :sf=^J:up=^Z:
+vc404-s|volker-craig 404 w/standout mode:\
+       :do=^J:se=^O:so=^N:tc=vc404:
+# (vc404-na: removed obsolete ":ma@:" -- esr)
+vc404-na|volker-craig 404 w/no arrow keys:\
+       :kr@:ku@:tc=vc404:
+vc404-s-na|volker-craig 404 w/standout mode and no arrow keys:\
+       :se=^O:so=^N:tc=vc404-na:
+# From: <wolfgang@cs.sfu.ca>
+vc414|vc414h|Volker-Craig 414H in sane escape mode.:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\E\032:cd=\E^X:ce=10\E\017:cl=\E\034:dc=\E3:\
+       :do=\E^K:ei=:ic=\E\072:im=:k0=\EA:k1=\EB:k2=\EC:\
+       :k3=\ED:k4=\EE:k5=\EF:k6=\EG:k7=\EH:kd=\E^K:kh=\E^R:\
+       :kl=^H:kr=^P:ku=\E^L:l0=PF1:l1=PF2:l2=PF3:l3=PF4:\
+       :l4=PF5:l5=PF6:l6=PF7:l7=PF8:nd=^P:se=\E^_:so=\E^Y:\
+       :up=\E^L:
+vc414h-noxon:\
+       :cm=\E\021%r%.%.:dl=\E\023:ho=\E^R:tc=vc414h:
+vc415|volker-craig 415:\
+       :cl=^L:tc=vc404:
+
+######## OBSOLETE PERSONAL-MICRO CONSOLES AND EMULATIONS
+#
+
+#### IBM PC and clones
+#
+
+# The pcplot IBM-PC terminal emulation program is really messed up. It is
+# supposed to emulate a vt-100, but emulates the wraparound bug incorrectly,
+# doesn't support scrolling regions, ignores add line commands, and ignores
+# delete line commands. Consequently, the resulting behavior looks like a
+# crude adm3a-type terminal.
+# Steve Jacobson 8/85
+pcplot:\
+       :xn@:\
+       :cs@:rc@:sc@:tc=vt100:
+# (kaypro: removed obsolete ":ma=^K^P:" -- esr)
+kaypro|kaypro2|kaypro II:\
+       :am:bs:\
+       :co#80:li#24:\
+       :cl=1\032:cm=\E=%+ %+ :ho=^^:kd=^J:kl=^H:kr=^L:ku=^K:\
+       :nd=^L:up=^K:
+sanyo55|sanyo|sanyo mbc-55x pc compatible:\
+       :am:bs:\
+       :co#80:li#25:\
+       :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:nd=\E[C:\
+       :se=\E[m:so=\E[7m:ue=\E[m:up=\E[A:us=\E[4m:
+
+# From IBM, Thu May  5 19:35:27 1983
+ibmpc|ibm-pc|ibm5051|5051|IBM Personal Computer (no ANSI.SYS):\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cl=^L^K:cr=^M^^:do=^J:ho=^K:im=\200R:kd=^_:\
+       :le=^]:nd=^\:sf=\n:up=^^:
+
+#### Apple
+#
+
+# apple -- works with an Apple ][+ that is equipped with a Videx 80 column
+# card in slot 3. A special routine must be installed at the apple end to
+# enable scroll down, here indicated with a ^U.  The Videx card must have 
+# inverse char set, which is used as standout.
+apple|apple-v80|Apple][+ w/Videx80 & custom scroll down:\
+       :am:xn:\
+       :co#80:li#24:\
+       :ae=^Z3:as=^Z2:bl=^G:cd=\013:ce=\035:cl=\014:\
+       :..cm=\r\036%r%p1%{32}%+%c%p2%{32}%+%c$<6>:cr=^M:\
+       :do=^J:ho=\031:le=\010:nd=^\:se=^Z2:sf=^J:so=^Z3:\
+       :sr=^P:up=^_:
+# (appleII: mapped ":pt:" to default tabs -- esr)
+appleII|apple ii plus:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :cd=^K:ce=^]:cl=^L:cm=\036%r%+ %+ :do=^J:ho=\E^Y:\
+       :is=\024T1\016:kd=^J:kr=^U:nd=^\:se=^N:so=^O:up=^_:\
+       :vb=\024G1\024T1:ve=^TC2:vs=^TC6:
+# Originally by Gary Ford 21NOV83
+# From: <ee178aci%sdcc7@SDCSVAX.ARPA>  Fri Oct 11 21:27:00 1985
+apple-80|apple II with smarterm 80 col:\
+       :am:bs:bw:\
+       :co#80:li#24:\
+       :bt=^R:cd=10*\013:ce=10\035:cl=10*\014:\
+       :cm=\036%r%+ %+ :cr=10*\r:do=^J:ho=^Y:le=^H:nd=^\:\
+       :up=^_:
+apple-soroc|apple emulating soroc 120:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EY:ce=\ET:cl=\E*:cm=\E=%+ %+ :cr=^M:do=^J:\
+       :ho=^^:kd=^J:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:sf=^J:\
+       :up=^K:
+# From Peter Harrison, Computer Graphics Lab, San Francisco
+#   ucbvax!ucsfmis!harrison  .....uucp
+#   ucbvax!ucsfmis!harrison@BERKELEY   .......ARPA
+# "These two work.  If you don't have the inverse video chip for the
+# Apple with videx then remove the so and se fields."
+# (DaleApple: mapped ":pt:" to default tabs -- esr)
+DaleApple|Apple with videx videoterm 80 column board with inverse video:\
+       :am:bs:pt:xn:\
+       :co#80:li#24:\
+       :cd=^K:ce=^]:cl=300\014:cm=\036%r%+ %+ :do=^J:ho=^Y:\
+       :kd=^J:kh=^Y:kl=^H:kr=^U:le=^H:nd=^\:se=^Z2:so=^Z3:\
+       :up=^_:
+# (lisa: this had forms-drawing capabilities
+#      :GV=`:GH=a:G1=c:G2=f:G3=e:G4=d:GU=u:GD=s:GC=b:GL=v:GR=t:
+# I renamed GS/GE/CO/CF, mapped ":pt:" to default tabs -- esr)
+lisa|apple lisa console display, black on white:\
+       :am:bs:eo:ms:pt:\
+       :co#88:li#32:\
+       :ae=\E[10m:al=\E[L:as=\E[11m:cd=\E[J:ce=\E[K:cl=^L:\
+       :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=\E[B:ei=:ho=\E[H:\
+       :ic=\E[@:im=:is=\E>\E[0m\014:kb=^H:kd=\E[B:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:nd=\E[C:se=\E[m:so=\E[7m:ue=\E[m:\
+       :up=\E[A:us=\E[4m:vi=\E[5h:vs=\E[5l:
+liswb|apple lisa console display, white on black:\
+       :is=\E>\E[0;7m\014:se=\E[0;7m:so=\E[0m:ue=\E[0;7m:\
+       :us=\E[4m:tc=lisa:
+mac|macintosh|Macintosh with MacTerminal:\
+       :xn:\
+       :dN#30:\
+       :al=20\E[L:dc=7\E[P:dl=20\E[M:ei=:ic=9\E[@:im=:ip=7:tc=vt100:
+
+#### Radio Shack/Tandy
+#
+
+# (coco3: This had "ta" used incorrectly as a boolean and bl given as "bl#7".
+# I read these as mistakes for ":it#8:" and ":bl=\007:" respectively -- esr)
+# From: <{pbrown,ctl}@ocf.berkeley.edu> 12 Mar 90
+coco3|os9LII|Tandy CoCo3 24*80 OS9 Level II:\
+       :am:bs:\
+       :co#80:it#8:li#24:\
+       :al=^_0:bl=^G:cd=^K:ce=^D:cl=5*\014:cm=2\002%r%+ %+ :\
+       :dl=^_1:do=^J:ho=^A:kd=^J:kl=^H:kr=^I:ku=^L:mb=^_":\
+       :md=\E\072^A:me=\037!\E\072\200:mr=^_ :nd=^F:se=^_!:\
+       :so=^_ :ue=^_#:up=^I:us=^_":ve=^E!:vi=^E :
+trs80|trs-80|radio shack trs-80 Model I:\
+       :am:bs:\
+       :co#64:li#16:\
+       :bl=^G:cr=^M:do=^J:le=^H:sf=^J:
+# (trs2: mapped ":pt:" to default tabs; removed obsolete ":nl=^_:" -- esr)
+trs2|trsII|trs80II|Radio Shack Model II using P&T CP/M:\
+       :am:bs:ms:pt:\
+       :co#80:li#24:\
+       :al=^D:bl=^G:cd=^B:ce=^A:cl=^L:cm=\EY%+ %+ :cr=^M:\
+       :dl=^K:do=^_:ho=^F:kb=^H:kd=^_:kl=^\:kr=^]:ku=^^:\
+       :nd=^]:se=^O:sf=^J:so=^N:up=^^:
+# From: Kevin Braunsdorf <ksb@mentor.cc.purdue.edu>
+# (This had unknown capabilities
+#      :GV=s:GH=u:GU=e:GD=c:G1=`:G2=_:G3=b:G4=a:\
+#      :BN=\E[?33h:BF=\E[?33l:UC=\E[_ q:BC=\E[\177 q:\
+#      :CN=\ERC:CF=\ERc:NR=\ERD:NM=\ER@:
+# I renamed GS/GE,also deleted the unnecessary ":kn#2:", ":sg#0:"
+# and mapped ":pt:" to default tabs -- esr)
+trs16|trs-80 model 16 console:\
+       :am:bs:pt:\
+       :co#80:li#24:sg#0:\
+       :ae=\ERg:al=\EL:as=\ERG:bl=^G:cd=\EJ:ce=\EK:cl=^L:\
+       :cm=\EY%+ %+ :cr=^M:dc=\EQ:dl=\EM:do=\EB:ei=:ho=\EH:\
+       :ic=\EP:im=:k0=^A:k1=^B:k2=^D:k3=^L:k4=^U:k5=^P:\
+       :k6=^N:k7=^S:kb=^H:kd=\EB:kh=^W:kl=\ED:kr=\EC:ku=\EA:\
+       :l0=f1:l1=f2:l2=f3:l3=f4:l4=f5:l5=f6:l6=f7:l7=f8:\
+       :le=^H:nd=\EC:pf=\E]+:po=\E]=:se=\ER@:sf=^J:so=\ERD:\
+       :ta=^I:up=\EA:ve=\ERC:vi=\ERc:
+# From: Suk Lee <..!{decvax,linus,allegra,ihnp4}!utcsrgv!spoo>
+# (civis/cnorm added from SCO description)
+trs100|Radio Shack Model 100:\
+       :am:bs:xt:\
+       :co#40:li#8:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :\
+       :cr=^M:dl=\EM:do=^J:ho=\EH:kb=^H:kd=^_:kl=^]:kr=^\:\
+       :ku=^^:le=^H:nd=\EC:se=\Eq:sf=^J:so=\Ep:up=\EA:\
+       :ve=\EP:vi=\EQ:
+trs200|Tandy 200:\
+       :am:xt:\
+       :co#40:li#16:\
+       :al=\EL:bl=^G:cd=^L:ce=\EK:cl=\EE:cm=\EY%+ %+ :cr=^M:\
+       :dl=\EM:do=^_:kd=^_:kl=^]:kr=^\:ku=^^:le=^H:nd=^\:\
+       :se=\Eq:sf=^J:so=\Ep:up=\EA:
+trs600|Tandy Model 600:\
+       :am:\
+       :co#80:li#15:\
+       :bl=^G:cl=\EH\EE:cm=\EY%+ 040%+ :cr=^M:do=\EB:kd=\EB:\
+       :kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:sf=^J:ta=^I:\
+       :up=\EA:
+
+#### Atari ST
+#
+
+# From: Simson L. Garfinkel <simsong@media-lab.mit.edu>
+# (atari: mapped ":pt:" to default tabs -- esr)
+atari|atari st:\
+       :am:bs:pt:\
+       :co#80:li#25:\
+       :al=\EL:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :dl=\EM:\
+       :do=\EB:kd=\EB:kl=\ED:kr=\EC:ku=\EA:nd=\EC:se=\Eq:\
+       :so=\Ep:sr=\EI:up=\EA:
+# UniTerm terminal program for the Atari ST:  49-line VT220 emulation mode
+# From: Paul M. Aoki <aoki@ucbvax.berkeley.edu>
+uniterm|uniterm49|UniTerm VT220 emulator, 49 lines:\
+       :li#49:\
+       :is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;49r\E[49;1H:tc=vt220:
+
+#### Commodore Business Machines
+#
+# Formerly located in West Chester, PA; went spectacularly bust in 1994
+# after years of shaky engineering and egregious mismanagement.  Made one
+# really nice machine (the Amiga) and boatloads of nasty ones (PET, C-64,
+# C-128, VIC-20).  The C-64 is said to have been the most popular machine
+# ever (most units sold); they can still be found gathering dust in closets
+# everywhere.
+#
+
+# From: Kent Polk <kent@swrinde.nde.swri.edu>, 30 May 90
+# Added a few more entries, converted caret-type control sequence (^x) entries
+# to '\0xx' entries since a couple of people mentioned losing '^x' sequences.
+#
+# :as:, :ae:                   Support for alternate character sets.
+# :ve=\E[\040p:vi=\E[\060\040p:        cursor visible/invisible.
+# :xn:  vt100 kludginess at column 80/NEWLINE ignore after 80 cols(Concept)
+#     This one appears to fix a problem I always had with a line ending
+#     at 'width+1' (I think) followed by a blank line in vi. The blank
+#     line tended to disappear and reappear depending on how the screen
+#     was refreshed. Note that this is probably needed only if you use
+#     something like a Dnet Fterm with the window sized to some peculiar
+#     dimension larger than 80 columns.
+# :k0=\E9~:    map F10 to k0 - could have F0-9 -> k0-9, but ... F10 was 'k;'
+# (amiga: removed obsolete ":kn#10:" -- esr)
+amiga|Amiga ANSI:\
+       :am:bs:bw:xn:\
+       :co#80:li#24:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+       :LE=\E[%dD:RI=\E[%dC:SF=\E[%dS:SR=\E[%dT:UP=\E[%dA:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:bt=\E[Z:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=\E[B:\
+       :ei=:ho=\E[H:ic=\E[@:im=:is=\E[20l:k0=\E9~:k1=\E0~:\
+       :k2=\E1~:k3=\E2~:k4=\E3~:k5=\E4~:k6=\E5~:k7=\E6~:\
+       :k8=\E7~:k9=\E8~:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:\
+       :le=\E[D:mb=\E[7;2m:md=\E[1m:me=\E[0m:mh=\E[2m:\
+       :mk=\E[8m:mr=\E[7m:nd=\E[C:rs=\Ec:se=\E[0m:sf=\E[S:\
+       :so=\E[7m:sr=\E[T:ue=\E[0m:up=\E[A:us=\E[4m:vb=^G:\
+       :ve=\E[ p:vi=\E[0 p:
+
+# The legendary home of B1FF...
+vic20|vic|VIC-20 Personal Computer:\
+       :am:\
+       :co#22:li#20:\
+       :bl=^G:cl=^K^L:cr=^M:do=^J:ho=^L:nd=^\:sf=^J:up=^^:
+
+#### CompuColor
+#
+# These were consoles for a line of Z80-based micros dating from around 1977.
+#
+
+# These compucolors appear similar, but they at least have different
+# sized screens.  I don't know what's going on here.
+# (compucolor: removed obsolete ":bc=^Z:" -- esr)
+compucolor|isc8001|intecolor:\
+       :am:\
+       :co#80:li#47:\
+       :al=\EU:bl=^G:cl=\014:cr=\r:dl=\EV\034:do=\n:\
+       :ei=\022\EK:im=\023\EQ:kd=^J:kh=^H:kl=^Z:kr=^Y:ku=^\:\
+       :le=\032:nd=\031:sf=\n:ue=\022:up=\034:us=\021:
+# (compucolor2: mapped ":pt:" to default tabs,
+# removed obsolete ":bc=^Z:" -- esr)
+compucolor2|compucolorII:\
+       :am:pt:\
+       :co#64:li#32:\
+       :bl=^G:cl=^L:cm=\003%r%.%.:cr=^M:do=^J:ho=^H:le=^Z:\
+       :nd=^Y:sf=^J:ta=^I:up=^\:
+
+#### Exidy Sorcerer
+#
+
+# (exidy: mapped ":pt:" to default tabs -- esr)
+exidy|exidy2500|exidy sorcerer as dm2500:\
+       :am:\
+       :co#64:li#30:\
+       :al=^P^J^X:bl=^G:cd=^X:ce=^W:cl=^^:\
+       :..cm=\014%p2%'`'%^%c%p1%'`'%^%c:cr=^M:dc=^H:\
+       :dl=^P^Z^X:dm=^P:do=^J:ei=^X:ho=^B:ic=^\:im=^P:le=^H:\
+       :nd=^\:se=^X:sf=^J:so=^N:ta=^I:up=^Z:
+ex3000:\
+       :co#80:li#24:\
+       :bl=^G:cr=^M:do=^J:ho=^Q:sf=^J:
+# This came from the comp ctr who got it from some user.  Smart indeed!
+# (sexidy: looks like an Exidy Sorcerer in some bizarre emulation mode;
+# removed obsolete ":ma=^x^J:"; removed obsolete ":bc=^A:"; removed 
+# incorrect (and overridden) ":le=^H:" -- esr)
+sexidy|exidy smart:\
+       :bs:\
+       :co#64:li#24:\
+       :bl=^G:cl=^L:cr=^M:do=^J:ho=^Q:kd=^S:le=^A:nd=^S:\
+       :sf=^J:up=^W:
+
+#### Osborne
+#
+# Thu Jul  7 03:55:16 1983
+#      
+# As an aside, be careful; it may sound like an anomaly on the 
+# Osborne, but with the 80-column upgrade, it's too easy to 
+# enter lines >80 columns!
+#      
+# I've already had several comments...
+# The Osborne-1 with the 80-col option is capable of being 
+# 52,80, or 104 characters wide; default to 80 for compatibility 
+# with most systems.
+#      
+# The tab is destructive on the Ozzie; make sure to 'stty -tabs'.
+ozzie|osborne|osborne1|osborne 1:\
+       :ms:ul:xt:\
+       :co#104:li#24:\
+       :al=\EE:bl=^G:ce=\ET:cl=^Z:cm=\E=%+ %+ :cr=^M:dc=\EW:\
+       :dl=\ER:do=^J:ei=:ic=\EQ:im=:kd=^J:kl=^H:kr=^L:ku=^K:\
+       :le=^H:nd=^L:se=\E(:sf=^J:so=\E):ue=\Em:up=^K:us=\El:
+
+#### Console types for UNIX clones
+#
+
+# According to the Coherent 2.3 manual, the PC console is similar
+# to a z19. The differences seem to be (1) 25 lines, (2) no status
+# line, (3) standout is broken, (4) ins/del line is broken, (5)
+# has blinking and bold.
+pc-coherent|pcz19|coherent|IBM PC console running Coherent:\
+       :am:mi:\
+       :co#80:it#8:li#25:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :cr=^M:\
+       :dc=\EN:do=\EB:ei=\EO:ho=\EH:im=\E@:kb=^H:kd=\EB:\
+       :kh=\EH:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:se=\Eq:\
+       :sf=^J:so=\Ep:sr=\EI:ta=^I:up=\EA:
+
+# According to the Venix 1.1 manual, the PC console is similar
+# to a DEC vt52.  Differences seem to be (1) arrow keys send 
+# different strings, (2) enhanced standout, (3) added insert/delete line.
+# Note in particular that it doesn't have automatic margins (am).
+# There are other keys (f1-f10, pgup, pgdn, backtab, insch, delch)
+# not described here.
+pc-venix|venix|IBM PC console running Venix:\
+       :co#80:it#8:li#25:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\
+       :cr=^M:dl=\EM:do=^J:kb=^H:kd=\EP:kh=\EG:kl=\EK:\
+       :kr=\EM:ku=\EH:le=^H:nd=\EC:sf=^J:sr=\EI:ta=^I:\
+       :up=\EA:
+
+#### Miscellaneous microcomputer consoles
+#
+# If you know anything more about any of these, please tell me.
+
+# I don't know which, if either, of these sols to believe.
+# ^S is an arrow key!  Boy is this guy in for a surprise...
+sol|sol1|sol terminal computer:\
+       :am:\
+       :co#64:li#16:\
+       :bl=^G:cl=^K:cm=\E\021%.\E\022%.:cr=^M:do=^J:ho=^N:\
+       :kd=^Z:kl=^A:kr=^S:ku=^W:le=^H:nd=^S:sf=^J:up=^W:
+sol2|sol terminal computer:\
+       :am:mi:xn:\
+       :co#64:li#16:\
+       :al=20\EL:bl=^G:cd=20\EJ:ce=\EK:cl=20\EE:\
+       :cm=\EY%+ %+ :cr=^M:dc=\EN:dl=20\EM:do=^J:ei=\EO:\
+       :ho=\EH:im=\E@:kd=\ED:kh=\EH:kl=\EL:kr=\ER:ku=\EU:\
+       :le=^H:nd=\EC:sf=\n:ta=^I:up=\EA:ve=\EX:vs=^N^Lv:
+# basis from Peter Harrison, Computer Graphics Lab, San Francisco
+#   ucbvax!ucsfmis!harrison ...uucp / ucbvax!ucsfmis!harrison@BERKELEY ...ARPA
+# (basis: removed obsolete ":ma=^K^P^R^L^L :nl=5000*^J:" -- esr)
+basis|BASIS108 computer with terminal translation table active:\
+       :cd=\EY:ce=\ET:cl=300\E*:do=5000\n:kb=^H:kd=^J:kl=^H:\
+       :kr=^L:ku=^K:se=\E):so=\E(:tc=adm3a:
+# luna's BMC terminal emulator
+luna|luna68k|LUNA68K Bitmap console:\
+       :co#88:li#46:\
+       :tc=ansi-mini:
+microkit|mkt|microkit terminal computer:\
+       :am:mi:xn:\
+       :co#40:li#23:\
+       :al=\El:bl=^G:cd=\Ej:ce=\Ek:cl=\Ee:cm=\Ey%+ %+ :\
+       :cr=^M:dc=\En:dl=\Em:do=^J:ei=\Eo:ho=\Eh:im=\E@:\
+       :kd=\Ed:kh=\Eh:kl=\El:kr=\Er:ku=\Eu:le=^H:nd=\Ec:\
+       :sf=^J:ta=^I:up=\Ea:ve=\Ex:vs=\016\014zv:
+megatek|pegasus workstation terminal emulator:\
+       :am:os:\
+       :co#83:li#60:\
+       :
+# The Xerox 820 was an early Z80 micro that went nowhere (I think)
+xerox820|x820|Xerox 820:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cd=^Q:ce=^X:cl=1^Z:cm=\E=%+ %+ :cr=^M:do=^J:\
+       :ho=^^:le=^H:nd=^L:sf=^J:up=^K:
+
+#### Videotex and teletext
+#
+
+# standard-issue France Telecom minitel terminal (made by Philips)
+# (m2-nam: had unknown ":zd=\E[1m:zb=\E[5m:zc=lkmjqxtuwvn:";
+# also deleted unnecessary ":ug#0:sg#0:"; mapped ":pt:" to "" -- esr)
+m2-nam|minitel|minitel-2|minitel-2-nam|France Telecom Minitel:\
+       :am@:bs:pt:xn:\
+       :co#80:it#8:li#24:\
+       :ae=\E(B:al=\E[L:as=\E(0:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+       :cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:ei=\E[4l:ho=\E[H:\
+       :im=\E[4h:ip=7:is=\E[1;24r\E[24;1H:k1=\EOP:k2=\EOQ:\
+       :k3=\EOR:k4=\EOS:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+       :ku=\E[A:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:sr=\EM:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+# From: Joel Rubin <jmrubin@coral.berkeley.edu>
+# This is a preliminary TERMCAP for VIDTEX, a terminal program sold by 
+# Compuserve.  Line and column numbers are computer-dependent (I have a
+# Commodore '64); you should use the meta-B option to shut off clean-breaking
+# of lines.  No key codes included since some of them are programmable and
+# most are machine-specific.  Works on vi if you don't use clean-breaking.
+# Very similar to the IBM 3101 termcap.  Escape-D used for backspace because
+# control-H is destructive backspace.  There seem to be a few weirdnesses
+# (especially at the beginning of a wrapped line), and the cursor does not,
+# unfortunately, flash.
+# (vid: mapped ":pt:" to default tabs; changed :bc: to :le: -- esr)
+vid|vidtex|Compuserve vidtex program:\
+       :am:pt:\
+       :co#40:li#25:\
+       :cd=\EJ:ce=\EK:cl=^L:cm=\EY%+ %+ :ho=\EH:le=\ED:\
+       :nd=\EC:up=\EA:
+# This (inherited from the Emacs termcap.dat file) is probably *way* obsolete!
+rsvidtx|Radio Shack VIDEOTEX:\
+       :co#32:li#16:\
+       :cd=\EJ:ce=\EK:cl=\EH\EJ:..cm=\EY%+ %+ :cr=^M:do=^J:\
+       :kb=^H:kd=^J:kl=^H:nd=\EC:nw=^M^J:sf=^J:ta=^I:up=\EA:
+
+######## OBSOLETE VDT TYPES
+#
+# These terminals are *long* dead -- these entries are retained for
+# historical interest only.
+
+#### AED
+#
+# Advanced Electronic Devices made its name manufacturing super-expensive
+# vector-graphics displays and frame buffers in the late 1970s.  They used
+# to be in Sunnyvale CA 94086 on Pastoria Avenue.  They're long gone now.
+#
+
+# From: Giles Billingsley <gilesb%ucbcad@berkeley.edu>
+# rewritten 8/82 for newer AEDs and better operation of vi, etc.
+# (bel/cr/cub1/cud1/ind added from SCO entry, which doesn't have db or the
+# humongous is2, thus they are commented out here -- esr)
+aed|AED|aed512|AED512|aed 512:\
+       :bs:\
+       :co#64:li#40:\
+       :bl=^G:cl=^L:cr=^M:do=^J:le=^H:nd=\Ei0800\001:\
+       :se=\E[00C80\001:\
+       :sf=\E;1100\072004=000200??;1300'\200\001\n\E\072004=0002??00;1200\001\n:\
+       :so=\E\07200>8000140[80C00\001:\
+       :te=\E\07200>8000100{804<0??00001000L80\072004=000200??\001:\
+       :ti=\E\07200>8000140{<04<0??00001010L<0\072004=0002??00\001:\
+       :uc=\Ei???>l0800i0102\001:ue=\E\07200>8000100\001:\
+       :up=^K:us=\E\07200>8000140\001:\
+       :vb=\EK0001??0000K0001202080\001:\
+       :ve=\E\072004=000200??\001:
+aed-ucb|AED-UCB|aed512-ucb|AED512-UCB|aed 512 w/o UCB ROM:\
+       :bs:db:\
+       :co#64:li#40:\
+       :cl=^L:if=/usr/share/tabset/aed512:nd=\Ei0800\001:\
+       :se=\E[00C80\001:so=\E\07200>8000140[80C00\001:\
+       :te=\E\07200>8000100{804<0??00001000L80\072004=000200??\001:\
+       :ti=\E\07200>8000140{<04<0??00001010L<0\072004=0002??00\001:\
+       :uc=\Ei???>l0800i0102\001:ue=\E\07200>8000100\001:\
+       :up=^K:us=\E\07200>8000140\001:\
+       :vb=\EK0001??0000K0001202080\001:\
+       :ve=\E\E\E\E\E\E\E\072004=000200??\001:
+
+#### Amtek Business Machines
+#
+
+# (abm80: early versions of this entry apparently had ":se=\E^_:so=\E^Y",
+# but these caps were commented out in 8.3; also, removed overridden
+# ":do=^J:" -- esr)
+abm80|amtek business machines 80:\
+       :am:bs:bw:\
+       :co#80:li#24:\
+       :al=\E^Z:bt=^T:cd=\E^X:ce=\E^O:cl=\E^\:\
+       :cm=\E\021%r%+ %+ :dl=\E^S:do=\E^K:ho=\E^R:le=^H:\
+       :nd=^P:up=\E^L:
+
+#### Bell Labs blit terminals
+#
+# These were AT&T's official entries.
+#
+
+blit|jerq|blit running teletype rom:\
+       :am:eo:ul:xo:\
+       :co#87:it#8:li#72:\
+       :AL=\EF%+ :DC=\Ee%+ :DL=\EE%+ :IC=\Ef%+ :al=\EF!:\
+       :bl=^G:ce=\EK:cl=^L:cm=\EY%r%+ %+ :cr=^M:dc=\Ee!:\
+       :dl=\EE!:do=^J:ei=:ic=\Ef!:im=:k1=\Ex:k2=\Ey:k3=\Ez:\
+       :kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=\ED:nd=\EC:\
+       :sf=^J:ta=^I:up=\EA:
+
+cbblit|fixterm|blit running columbus code:\
+       :co#88:\
+       :cd=\EJ:ei=\ER:ic@:im=\EQ:pO=\EP%03:pf=^T:po=^R:\
+       :se=\EV!:so=\EU!:ue=\EV":us=\EU":vb=\E^G:tc=blit:
+
+oblit|ojerq|first version of blit rom:\
+       :am:da:db:eo:mi:ul:xo:\
+       :co#88:it#8:li#72:\
+       :AL=\Ef%+ :DL=\Ee%+ :al=\EF:bl=^G:cd=\EJ:ce=\EK:\
+       :cl=^L:cm=\EY%r%+ %+ :cr=^M:dc=\EO:dl=\EE:do=^J:\
+       :ei=\ER:im=\EQ:kb=^H:le=\ED:nd=\EC:sf=^J:ta=^I:\
+       :up=\EA:vb=\E^G:
+
+daleblit|daleterm|blit running Dale DeJager's ROM:\
+       :da@:db@:\
+       :kd=\EB:kl=\ED:kr=\EC:ku=\EA:se=\EV!:so=\EU!:ue=\EV":\
+       :us=\EU":tc=oblit:
+
+#### Bolt, Beranek & Newman (bbn)
+#
+# The BitGraph was a product of the now-defunct BBN Computer Corporation.
+# The parent company, best known as the architects of the Internet, is
+# still around.
+#
+
+# Entries for the BitGraph terminals.  The problem 
+# with scrolling in vi can only be fixed by getting BBN to put 
+# smarter scroll logic in the terminal or changing vi or padding 
+# scrolls with about 500 ms delay.
+#      
+# I always thought the problem was related to the terminal 
+# counting newlines in its input buffer before scrolling and 
+# then moving the screen that much. Then vi comes along and 
+# paints lines in on the bottom line of the screen, so you get 
+# this big white gap.
+
+bitgraph|bbn bitgraph:\
+       :tc=bg3.10rv:
+bg3.10rv|bgrv|bbn bitgraph (reverse video):\
+       :tc=bg2.0rv:
+bg3.10nv|bgnv|bbn bitgraph (normal video):\
+       :tc=bg2.0nv:
+bg3.10|bgn|bbn bitgraph (no init):\
+       :tc=bg2.0:
+bg2.0rv|bbn bitgraph (reverse video):\
+       :is=\E>\E[?5h\E[?7h:vb=\E[?5l\E[?5h:tc=bg2.0:
+bg2.0nv|bbn bitgraph (normal video):\
+       :is=\E>\E[?5l\E[?7h:vb=\E[?5h\E[?5l:tc=bg2.0:
+bg2.0|bbn bitgraph (no init):\
+       :xn:\
+       :co#85:li#64:\
+       :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+       :cm=%i\E[%d;%dH:cr=^M:cs=\E[%i%d;%dr:dl=\E[M:do=\E[B:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\E[B:ke=\E>:\
+       :kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:l1=PF1:l2=PF2:l3=PF3:\
+       :l4=PF4:le=^H:nd=\E[C:rc=\E8:sc=\E7:se=\E[0m:sf=\n:\
+       :so=\E[7m:ta=^I:up=\E[A:
+bg1.25rv|bbn bitgraph (reverse video):\
+       :is=\E>\E[?5h\E[?7h:vb=\E[?5l\E[?5h:tc=bg1.25:
+bg1.25nv|bbn bitgraph (normal video):\
+       :is=\E>\E[?5l\E[?7h:vb=\E[?5h\E[?5l:tc=bg1.25:
+bg1.25|bbn bitgraph:\
+       :co#85:li#64:\
+       :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[J:\
+       :cm=%i\E[%d;%dH:cr=^M:dl=\E[M:do=\E[B:k1=\EP:k2=\EQ:\
+       :k3=\ER:k4=\ES:kd=\EB:ke=\E>:kl=\ED:kr=\EC:ks=\E=:\
+       :ku=\EA:l1=PF1:l2=PF2:l3=PF3:l4=PF4:le=^H:\
+       :ll=\E[64;1H:nd=\E[C:se=\E[0m:sf=\n:so=\E[7m:ta=^I:\
+       :up=\E[A:
+
+#### Chromatics
+#
+
+# cg7900: Following is revised version. As I mentioned, I recompiled 
+# curses in order to accomadate the large amount of definition.
+# I have put the long strings in ti/te. Ti sets up a window 
+# that is smaller than the screen, and puts up a warning message 
+# outside the window. Te erases the warning message, puts the 
+# window back to be the whole screen, and puts the cursor at just
+# below the small window. A defined vs and ve to really turn 
+# the cursor on and off, but I have taken this out since I don't 
+# like the cursor being turned off when vi exits.   
+cg7900|chromatics|chromatics 7900:\
+       :am:\
+       :co#80:li#40:\
+       :al=^A>2:bl=^G:cd=^Al:ce=^A`:cl=^L:\
+       :cm=\001M%r%d\\\054%d\\\054:cr=^M:dc=^A<1:dl=^A<2:\
+       :do=^J:ei=:ho=^\:ic=^A>1:im=:le=^H:ll=^A|:nd=^]:\
+       :se=\001C1\\\054\001c2\\\054:sf=^J:\
+       :so=\001C4\\\054\001c7\\\054:\
+       :te=\001W0\\\05440\\\05485\\\05448\\\054\014\001W0\\\0540\\\05485\\\05448\\\054\001M0\\\05440\\\054:\
+       :ti=\001P0\001O1\001R1\001C4\\\054\001c0\\\054\014\001M0\\\05442\\\054WARNING DOUBLE ENTER ESCAPE and \025\001C1\\\054\001c2\\\054\001W0\\\0540\\\05479\\\05439\\\054:\
+       :uc=\001\001_\001\200:up=^K:
+
+#### Computer Automation
+#
+
+ca22851|computer automation 22851:\
+       :am:\
+       :co#80:li#24:\
+       :bl=^G:cd=^\:ce=^]:cl=\014:cm=\002%i%.%.:cr=^M:do=^J:\
+       :ho=^^:kd=^W:kh=^^:kl=^U:ku=^V:le=^U:nd=^I:sf=^J:\
+       :up=^V:
+
+#### Cybernex
+#
+
+# This entry has correct padding and the undocumented "ri" capability
+cyb83|xl83|cybernex xl-83:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cd=\020:ce=\017:cl=\014:cm=\027%+ %+ :cr=^M:\
+       :do=^J:ho=^K:kd=^J:kl=^H:kr=^I:ku=^N:le=^H:nd=^I:\
+       :sf=^J:sr=^N:up=^N:
+# (mdl110: removed obsolete ":ma=^Z^P:" and overridden ":cd=145^NA^W:" -- esr)
+cyb110|mdl110|cybernex mdl-110:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=\016A\016\035:bl=^G:cd=\016@\026:ce=\016@\026:\
+       :cl=\030:cm=\020%+ %+ :cr=^M:dc=\016A\036:\
+       :dl=\016A\016\036:do=^J:ei=:ho=^Y:ic=\016A\035:im=:\
+       :le=^H:nd=^U:se=^NG:sf=^J:so=^NF:ta=\011:up=^Z:
+
+#### Datapoint
+#
+# Datapoint is gone.  They used to be headquartered in Texas.
+# They created ARCnet, an Ethernet competitor that flourished for a while
+# in the early 1980s before 3COM got wise and cut its prices.  The service
+# side of Datapoint still lives (1995) in the form of Intelogic Trace.
+#
+
+dp3360|datapoint|datapoint 3360:\
+       :am:bs:\
+       :co#82:li#25:\
+       :bl=^G:cd=^_:ce=^^:cl=^]^_:cr=^M:do=^J:ho=^]:le=^H:\
+       :nd=^X:sf=^J:up=^Z:
+
+#### DEC terminals (Obsolete types: DECwriter and vt40/42/50)
+#
+# These entries are DEC's official terminfos for its older terminals.
+# Contact Bill Hedberg <hedberg@hannah.enet.dec.com> of Terminal Support
+# Engineering for more information.  Updated terminfos and termcaps 
+# are kept available at ftp://gatekeeper.dec.com/pub/DEC/termcaps.
+#
+
+gt40|dec gt40:\
+       :os:\
+       :co#72:li#30:\
+       :bl=^G:cr=^M:do=^J:le=^H:
+gt42|dec gt42:\
+       :os:\
+       :co#72:li#40:\
+       :bl=^G:cr=^M:do=^J:le=^H:
+vt50|dec vt50:\
+       :co#80:li#12:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cr=^M:do=^J:le=^H:\
+       :nd=\EC:sf=^J:ta=^I:up=\EA:
+vt50h|dec vt50h:\
+       :co#80:li#12:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:\
+       :do=^J:le=^H:nd=\EC:sf=^J:sr=\EI:ta=^I:up=\EA:
+vt52|dec vt52:\
+       :co#80:it#8:li#24:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:\
+       :do=^J:kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:\
+       :nd=\EC:sf=^J:sr=\EI:ta=^I:up=\EA:
+vt61|vt-61|vt61.5:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=\r:\
+       :do=^J:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+       :sf=\n:sr=\EI:ta=^I:up=\EA:
+
+# The gigi does standout with red!
+gigi|vk100|dec gigi graphics terminal:\
+       :am:xn:\
+       :co#84:li#24:\
+       :DO=\E[%dB:LE=\E[%r%dD:RI=\E[%dC:UP=\E[%dA:bl=^G:\
+       :cd=\E[J:ce=\E[K:cl=\E[;H\E[2J:cm=\E[%i%d;%dH:cr=^M:\
+       :do=^J:is=\E>\E[?3l\E[?4l\E[?5l\E[?20l\E[?7h\E[?8h:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kd=\EOB:\
+       :ke=\E[?1l\E>:kh=\E[H:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\
+       :ku=\EOA:le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[7;31m:\
+       :sr=\EM:ta=^I:ue=\E[m:up=\E[A:us=\E[4m:
+
+# DEC PRO-350 console (VT220-style).  The 350 was DEC's attempt to produce
+# a PC differentiated from the IBM clones.  It was a total, ludicrous,
+# grossly-overpriced failure (among other things, DEC's OS didn't include
+# a format program, so you had to buy pre-formatted floppies from DEC at
+# a hefty premium!).
+# (pro350: mapped ":pt:" to default tabs -- esr)
+pro350|decpro|dec pro console:\
+       :bs:pt:\
+       :co#80:li#24:\
+       :ae=\EG:as=\EF:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\
+       :do=\EB:ho=\EH:k0=\EE:k1=\EF:k2=\EG:k3=\EH:k4=\EI:\
+       :k5=\EJ:k6=\Ei:k7=\Ej:kd=\EB:kh=\EH:kl=\ED:kr=\EC:\
+       :ku=\EA:nd=\EC:se=\E^N:so=\E^H:sr=\EI:ue=\E^C:up=\EA:\
+       :us=\E^D:
+
+dw1|decwriter I:\
+       :hc:os:\
+       :co#72:\
+       :bl=^G:cr=^M:do=^J:le=^H:sf=^J:
+dw2|decwriter|dw|decwriter II:\
+       :hc:os:\
+       :co#132:\
+       :bl=^G:cr=^M:do=^J:kb=^H:le=^H:sf=^J:
+
+# \E(B         Use U.S. character set (otherwise # => british pound !)
+# \E[20l       Disable "linefeed newline" mode (else puts \r after \n,\f,\v)
+# \E[w         10 char/in pitch
+# \E[1;132     full width horizontal margins
+# \E[2g                clear all tab stops
+# \E[z         6 lines/in
+# \E[66t       66 lines/page (for \f)
+# \E[1;66r     full vertical page can be printed
+# \E[4g                clear vertical tab stops
+# \E>          disable alternate keypad mode (so it transmits numbers!)
+# \E[%i%du     set tab stop at column %d (origin == 1)
+#              (Full syntax is \E[n;n;n;n;n;...;nu where each 'n' is 
+#              a tab stop)
+#
+#       The dw3 does standout with wide characters.
+#
+dw3|la120|decwriter III:\
+       :hc:os:\
+       :co#132:\
+       :bl=^G:cr=^M:do=^J:\
+       :i1=\E(B\E[20l\E[w\E[0;132s\E[2g\E[z\E[66t\E[1;66r\E[4g\E>:\
+       :is=\E[9;17;25;33;41;49;57;65;73;81;89;97;105;113;121;129u\r:\
+       :kb=^H:le=^H:se=\E[w:sf=^J:so=\E[6w:ta=^I:
+dw4|decwriter IV:\
+       :am:hc:os:\
+       :co#132:\
+       :bl=^G:cr=^M:do=^J:is=\Ec:k0=\EOP:k1=\EOQ:k2=\EOR:\
+       :k3=\EOS:kb=^H:le=^H:sf=^J:ta=^I:
+
+#### Delta Data (dd)
+#
+
+# Untested. The cup sequence is hairy enough that it probably needs work.
+# The idea is ctrl(O), dd(row), dd(col), where dd(x) is x - 2*(x%16) + '9'.
+# There are BSD-derived termcap entries floating around for this puppy
+# that are *certainly* wrong.
+delta|dd5000|delta data 5000:\
+       :am:\
+       :co#80:li#27:\
+       :bl=^G:ce=^NU:cl=^NR:cm=\017%+^P%+^P:dc=^NV:do=^J:\
+       :ho=^NQ:le=^H:nd=^Y:sf=^J:up=^Z:
+
+#### Digital Data Research (ddr)
+#
+
+# (ddr: mapped ":pt:" to default tabs -- esr)
+ddr|rebus3180|ddr3180|Rebus/DDR 3180 vt100 emulator:\
+       :am:bs:pt:xn:\
+       :co#80:li#24:vt#3:\
+       :cd=50\E[J:ce=3\E[K:cl=50\E[;H\E[2J:cm=5\E[%i%d;%dH:\
+       :cs=\E[%i%d;%dr:do=^J:ho=\E[H:is=\E[1;24r\E[24;1H:\
+       :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:kb=^H:kd=\E[B:\
+       :ke=\E[?1l\E>:kl=\E[D:kr=\E[C:ks=\E[?1h\E=:ku=\E[A:\
+       :le=^H:mb=2\E[5m:md=2\E[1m:me=2\E[m:mr=2\E[7m:\
+       :nd=2\E[C:rc=\E8:rf=/usr/share/lib/tabset/vt100:\
+       :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:sc=\E7:se=\E[m:\
+       :sf=5\ED:so=\E[7m:sr=5\EM:ue=2\E[m:up=2\E[A:\
+       :us=2\E[4m:
+
+#### General Electric (ge)
+#
+
+terminet1200|terminet300|tn1200|tn300|terminet|GE terminet 1200:\
+       :hc:os:\
+       :co#120:\
+       :bl=^G:cr=^M:do=^J:sf=^J:
+
+#### Heathkit/Zenith
+#
+
+h19-a|heath-ansi|heathkit-a|heathkit h19 ansi mode:\
+       :am:mi:ms:\
+       :co#80:it#8:li#24:\
+       :ae=\E[11m:al=\E[1L:as=\E[10m:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[2J:cm=\E[%i%d;%dH:cr=^M:dc=\E[1P:dl=\E[1M:\
+       :do=\E[1B:ei=\E[4l:ho=\E[H:im=\E[4h:\
+       :is=\E<\E[>1;2;3;4;5;6;7;8;9l\E[0m\E[11m\E[?7h:\
+       :k1=\EOS:k2=\EOT:k3=\EOU:k4=\EOV:k5=\EOW:k6=\EOP:\
+       :k7=\EOQ:k8=\EOR:kb=^H:kd=\E[1B:kh=\E[H:kl=\E[1D:\
+       :kr=\E[1C:ku=\E[1A:l6=blue:l7=red:l8=white:le=^H:\
+       :nd=\E[1C:se=\E[0m:sf=^J:so=\E[7m:sr=\EM:ta=^I:\
+       :up=\E[1A:ve=\E[>4l:vs=\E[>4h:
+h19-bs|heathkit w/keypad shifted:\
+       :ke=\Eu:ks=\Et:tc=h19-b:
+h19-smul|heathkit w/keypad shifted/underscore cursor:\
+       :ke=\Eu:ks=\Et:tc=h19-u:
+h19|heath|h19-b|heathkit|heath-19|z19|zenith|heathkit h19:\
+       :am:es:hs:mi:ms:\
+       :co#80:it#8:li#24:\
+       :ae=\EG:al=\EL:as=\EF:bl=^G:cd=\EJ:ce=\EK:cl=\EE:\
+       :cm=\EY%+ %+ :cr=^M:dc=\EN:dl=\EM:do=\EB:ei=\EO:\
+       :fs=\Ek\Ey5:ho=\EH:im=\E@:k1=\ES:k2=\ET:k3=\EU:\
+       :k4=\EV:k5=\EW:k6=\EP:k7=\EQ:k8=\ER:kb=^H:kd=\EB:\
+       :kh=\EH:kl=\ED:kr=\EC:ku=\EA:l6=blue:l7=red:l8=white:\
+       :le=^H:nd=\EC:se=\Eq:sf=^J:so=\Ep:sr=\EI:ta=^I:\
+       :ts=\Ej\Ex5\EY8%p1%{32}%+%c\Eo\Eo:up=\EA:ve=\Ey4:\
+       :vs=\Ex4:
+h19-u|heathkit with underscore cursor:\
+       :ve@:vs@:tc=h19-b:
+alto-h19|altoh19|altoheath|alto-heath|alto emulating heathkit h19:\
+       :li#60:\
+       :al=\EL:dl=\EM:tc=h19:
+
+# The major problem with the Z29 is that it requires more 
+# padding than the Z19. Once again, here's a little termcap 
+# entry for it that will do the trick. 
+# 
+# The problem declaring an H19 to be synonomous with a Z29 is that
+# it needs more padding. It especially loses if a program attempts
+# to put the Z29 into insert mode and insert text at 9600 baud. It
+# even loses worse if the program attempts to insert tabs at 9600
+# baud. Adding padding to text that is inserted loses because in 
+# order to make the Z29 not die, one must add so much padding that
+# whenever the program tries to use insert mode, the effective 
+# rate is about 110 baud.
+# 
+# What program would want to put the terminal into insert mode 
+# and shove stuff at it at 9600 baud you ask?  
+# 
+# Emacs. Emacs seems to want to do the mathematically optimal 
+# thing in doing a redisplay rather than the practical thing.
+# When it is about to output a line on top of a line that is 
+# already on the screen, instead of just killing to the end of 
+# the line and outputing the new line, it compares the old line 
+# and the new line and if there are any similarities, it 
+# constructs the new line by deleting the text on the old line 
+# on the terminal that is already there and then inserting new
+# text into the line to transform it into the new line that is 
+# to be displayed. The Z29 does not react kindly to this.
+# 
+# But don't cry for too long.... There is a solution. You can make
+# a termcap entry for the Z29 that says the Z29 has no insert mode.
+# Then Emacs cannot use it. "Oh, no, but now inserting into a 
+# line will be really slow", you say. Well there is a sort of a
+# solution to that too. There is an insert character option on 
+# the Z29 that will insert one character. Unfortunately, it 
+# involves putting the terminal into ansi mode, inserting the 
+# character, and changing it back to H19 mode. All this takes 12 
+# characters. Pretty expensive to insert one character, but it 
+# works. Either Emacs doesn't try to use its inserting hack when 
+# it's only given an insert character ability or the Z29 doesn't 
+# require padding with this (the former is probably more likely, 
+# but I haven't checked it out).
+z29|zenith29|z29b|zenith z29b:\
+       :am:ms:\
+       :co#80:li#24:\
+       :ae=\EF:al=\EL:as=\EG:bl=^G:bt=\E-:cd=\EJ:ce=\EK:\
+       :cl=\EE:cm=\EY%+ %+ :cr=^M:dc=\EN:dl=\EM:do=\EB:ei=:\
+       :ho=\EH:ic=\E<\E[1@\E[?2h:im=:is=\E<\E[?2h\Ev:k0=\E~:\
+       :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:k6=\EP:k7=\EQ:\
+       :k8=\ER:k9=\E0I:kb=^H:kd=\EB:kh=\EH:kl=\ED:kr=\EC:\
+       :ku=\EA:l0=home:le=^H:nd=\EC:se=\Eq:sf=\n:so=\Ep:\
+       :sr=\EI:ta=^I:ue=\Es0:up=\EA:us=\Es8:ve=\Ey4:vs=\Ex4:
+
+# From: Brad Brahms <Brahms@USC-ECLC>
+z100|h100|z110|z-100|h-100|heath/zenith z-100 pc with color monitor:\
+       :ve=\Ey4\Em70:vs=\Ex4\Em71:tc=z100bw:
+# (z100bw: removed obsolete ":kn#10:"; mapped ":pt:" to default tabs -- esr)
+z100bw|h100bw|z110bw|z-100bw|h-100bw|heath/zenith z-100 pc:\
+       :bs:mi:ms:pt:\
+       :co#80:li#24:\
+       :ae=\EG:al=5*\EL:as=\EF:cd=\EJ:ce=\EK:cl=5*\EE:\
+       :cm=1*\EY%+ %+ :dc=1*\EN:dl=5*\EM:do=\EB:ei=\EO:\
+       :ho=\EH:im=\E@:k0=\EJ:k1=\ES:k2=\ET:k3=\EU:k4=\EV:\
+       :k5=\EW:k6=\EP:k7=\EQ:k8=\ER:k9=\EOI:kb=^H:kd=\EB:\
+       :kh=\EH:kl=\ED:kr=\EC:ku=\EA:nd=\EC:se=\Eq:so=\Ep:\
+       :sr=\EI:up=\EA:ve=\Ey4:vs=\Ex4:
+p19:\
+       :al=2*\EL:dl=2*\EM:tc=h19-b:
+# From: <ucscc!B.fiatlux@ucbvax.berkeley.edu>
+# (ztx: mapped ":pt:" to default tabs; removed duplicate :sr: -- esr)
+ztx|ztx11|zt-1|htx11|ztx-1-a|ztx-10/11:\
+       :am:bs:es:hs:pt:\
+       :co#80:li#24:\
+       :al=\EL:cd=\EJ:ce=\EK:cl=\EE:cm=\EY%+ %+ :dl=\EM:\
+       :do=^J:ds=\Ey1:fs=\Ek\Ey5:ho=\EH:\
+       :is=\Ej\EH\Eq\Ek\Ev\Ey1\Ey5\EG\Ey8\Ey9\Ey>:k0=\ES:\
+       :k1=\EB:k2=\EU:k3=\EV:k4=\EW:k5=\EP:k6=\EQ:k7=\ER:\
+       :kb=^H:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=^H:nd=\EC:\
+       :se=\Eq:so=\Es5:sr=\EI:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:\
+       :ue=\Eq:up=\EA:us=\Es2:
+
+#### IMS International (ims)
+#
+# There was a company called IMS International located in Carson City, 
+# Nevada, that flourished from the mid-70s to mid-80s.  They made S-100
+# bus/Z80 hardware and a line of terminals called Ultimas.  
+
+# From: Erik Fair <fair@ucbarpa.berkeley.edu>  Sun Oct 27 07:21:05 1985
+ims950-b|bare ims950 no init string:\
+       :is@:tc=ims950:
+ims950-ns|ims950 w/no standout:\
+       :se@:so@:ue@:us@:tc=ims950:
+# (ims950: removed obsolete ":ko@:" -- esr)
+ims950|ims televideo 950 emulation:\
+       :xn@:\
+       :k0@:k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:k9@:kb@:kd@:kh@:\
+       :kl@:kr@:ku@:vb@:tc=tvi950:
+# (ims950-rv: removed obsolete ":ko@:" -- esr)
+ims950-rv|ims tvi950 rev video:\
+       :xn@:\
+       :k0@:k1@:k2@:k3@:k4@:k5@:k6@:k7@:k8@:k9@:kb@:kd@:kh@:\
+       :kl@:kr@:ku@:vb@:tc=tvi950-rv:
+# (ims-ansi: mapped ":pt:" to default tabs -- esr)
+ims-ansi|ultima2|ultimaII|IMS Ultima II:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :cd=\E[0J:ce=\E[0K:cl=\E[;H\E[2J:cm=\E[%i%2;%2H:\
+       :do=\ED:if=/usr/share/tabset/vt100:\
+       :is=\E[0m\E[>14l\E[?1;?5;20l\E>\E[1m\r:kd=\E[B:\
+       :kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:se=\E[0m\E[1m:\
+       :so=\E[7m:sr=\EM:ue=\E[0m\E[1m:up=\EM:us=\E[4m:
+
+#### Intertec Data Systems
+#
+# I think this company is long dead as of 1995.  They made an early CP/M
+# micro called the "Intertec Superbrain" that was moderately popular,
+# then sank out of sight.
+#
+
+superbrain|intertec superbrain:\
+       :am:bw:\
+       :co#80:li#24:\
+       :bl=^G:cd=\E~k<10*>:ce=\E~K:cl=\014:cm=\EY%+ %+ :\
+       :cr=^M:do=^J:kd=^J:kl=^U:kr=^F:ku=^K:le=^H:nd=^F:\
+       :sf=^J:ta=^I:te=^L:ti=^L:up=^K:
+intertube|intertec|Intertec InterTube:\
+       :am:\
+       :co#80:li#25:\
+       :bl=^G:cl=^L:cm=\EY%+ %+ :cr=^M:do=^J:ho=^A:le=^H:\
+       :nd=^F:se=\E0@:sf=^J:so=\E0P:up=^Z:
+# The intertube 2 has the "full duplex" problem like the tek 4025: if you
+# are typing and a command comes in, the keystrokes you type get interspersed
+# with the command and it messes up
+it2|intertube2|intertec data systems intertube 2:\
+       :am:\
+       :co#80:li#25:\
+       :bl=^G:ce=\EK:ch=\020%+^J:cl=^L:cm=\016%.\020%+^J:\
+       :cr=^M:cv=\013%.:do=^J:ho=^A:le=^H:ll=^K^X\r:nd=^F:\
+       :se=\E0@:sf=^J:so=\E0P:up=^Z:
+
+#### Modgraph
+#
+# These people used to be reachable at:
+#
+#      Modgraph, Inc
+#      1393 Main Street,
+#      Waltham, MA 02154
+#      Vox: (617)-890-5796.
+#
+# However, if you call that number today you'll get an insurance company.
+# I think Modgraph is long gone.
+#
+
+modgraph|mod|modgraph terminal emulating vt100:\
+       :xn@:\
+       :co#80:li#24:\
+       :is=\E^9;0s\E^7;1s\E[3g\E^11;9s\E^11;17s\E^11;25s\E^11;33s\E^11;41s\E^11;49s\E^11;57s\E^11;65s\E^11;73s\E^11;81s\E^11;89s:\
+       :rf@:sr=5\EM\E[K:vs=\E^9;0s\E^7;1s:tc=vt100:
+# (modgraph2: mapped ":pt:" to default tabs -- esr)
+# The GX-1000 manual is dated 1984
+modgraph2|modgraph gx-1000, set to 80x24, keypad not enabled:\
+       :am:bs:da:db:pt:\
+       :co#80:li#24:\
+       :cd=50\EJ:ce=3\EK:cl=50\EH\EJ:cm=5\EY%+ %+ :\
+       :is=\E<\E^5;2s\E^7;1s\E[3g\E^11;9s\E^11;17s\E^11;25s\E^11;33s\E^11;41s\E^11;49s\E^11;57s\E^11;65s\E^11;73s\E^11;81s\E^11;89s\E^12;0s\E^14;2s\E^15;9s\E^25;1s\E^9;1s\E^27;1:\
+       :nd=2\EC:sr=5\EI:up=2\EA:
+
+#### Morrow Designs
+# 
+# This was George Morrow's company.  They started in the late 1970s making
+# S100-bus machines.  They used to be reachable at:
+#
+#        Morrow
+#        600 McCormick St.
+#        San Leandro, CA 94577
+#
+# but they're long gone now (1995).
+#
+
+# The mt70 terminal was shipped with the Morrow MD-3 microcomputer. 
+# Jeff's specimen was dated June 1984.
+# From: Jeff Wieland <wieland@acn.purdue.edu> 24 Feb 1995
+mt70|mt-70|Morrow MD-70; native Morrow mode:\
+       :am:mi:ms:xo:\
+       :co#80:it#8:li#24:\
+       :%1=^AO\r:F1=^A`\r:F2=^Aa\r:F3=^Ab\r:F4=^Ac\r:\
+       :F5=^Ad\r:F6=^Ae\r:F7=^Af\r:F8=^Ag\r:F9=^Ah\r:\
+       :FA=^Ai\r:ac=+z\\\054{.yOi-x`|jGkFlEmDnHtLuKvNwMxIqJ:\
+       :ae=\E%:al=\EE:as=\E$:bl=^G:bt=\EI:cd=\EY:ce=\ET:\
+       :cl=^Z:cm=\E=%+ %+ :cr=^M:ct=\E0:dc=\EW:dl=\ER:do=^J:\
+       :ei=:ho=^^:i1=\E"2\EG0\E]:ic=\EQ:im=:k1=^A@\r:\
+       :k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:k6=^AE\r:\
+       :k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kB=^A^Z\r:\
+       :kC=^An\r:kD=\177:kb=^H:kd=^AK\r:kh=^AN\r:kl=^AL\r:\
+       :kr=^AM\r:ku=^AJ\r:le=^H:me=\EG0:mh=\EG2:mr=\EG4:\
+       :nd=^L:nw=^_:se=\EG0:sf=^J:so=\EG4:ta=^I:\
+       :ti=\E"2\EG0\E]:up=^K:us=\EG1:vb=\EK1\EK0:ve=\E"2:\
+       :vi=\E"0:
+
+#### Netronics
+#
+# The Netronics Smarterm 80 was a kit-built terminal that came in at least two
+# flavors, a first 40-column version, and a second 64-column version released
+# about 1983.
+
+# (netx: removed obsolete ":ma=j^Jk^Pl :" -- esr)
+netx|netronics:\
+       :bs:\
+       :co#64:li#16:\
+       :bl=^G:cd=\006\005:ce=\005:cl=\014:cm=\E=%+@%+@:\
+       :cr=^M:do=^J:ho=^D:le=^H:nd=\E+@A:sf=^J:sr=\E=@@\013:\
+       :up=^K:
+smartvid|Netronics Smartvid 80:\
+       :am:bw:eo:ms:xs:\
+       :co#80:li#24:sg#1:ug#1:\
+       :ae=\EGB:as=\EG@:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=^L:\
+       :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\ED:ho=^Z:\
+       :ic=\EQ:im=\EC:le=^H:ll=^Z^K:nd=^A:se=\EG@:sf=^J:\
+       :so=\EGC:sr=^K:ta=\Ei:te=^Z^K:ue=\EG@:up=^K:us=\EGA:\
+       :ve=^Z^K:
+smarterm|smarterm-s|netronics smarterm 80x24 naked terminal:\
+       :am:ul:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=\EE:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=^L:\
+       :cm=\E=%+ %+ :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\ED:ho=^Z:\
+       :ic=\EQ:im=\EC:le=^H:nd=^A:sf=^J:ta=^I:ue=\EG@:\
+       :us=\EGA:
+
+#### Omron
+#
+# This company is still around in 1995, manufacturing point-of-sale systems.
+
+omron|Omron 8025AG:\
+       :am:bs:da:db:\
+       :co#80:li#24:\
+       :al=\EL:bl=^G:cd=\ER:ce=\EK:cl=\EJ:cr=^M:dc=\EP:\
+       :dl=\EM:do=^J:ho=\EH:le=^H:nd=\EC:se=\E4:sf=\ES:\
+       :so=\Ef:sr=\ET:up=\EA:vs=\EN:
+
+#### Soroc
+#
+
+# (soroc120: removed obsolete ":ma=^K^P^R^L^L :" -- esr)
+soroc120|iq120|soroc iq120:\
+       :cd=\EY:ce=\ET:cl=\E*:do=^J:kd=^J:kl=^H:kr=^L:ku=^K:tc=adm3a:
+soroc140|iq140|soroc iq140:\
+       :am:mi:\
+       :co#80:li#24:\
+       :al=\Ee:bl=^G:bt=\EI:cd=\Ey:ce=\Et:cl=\E+:\
+       :cm=\E=%+ %+ :cr=^M:dc=\Ew:dl=\Er:do=^J:ei=\E8:ho=^^:\
+       :im=\E9:k0=^A0\r:k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:\
+       :k5=^AD\r:k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:kb=^H:\
+       :kh=^^:kr=^L:ku=^K:le=^H:ll=^^^K:nd=^L:se=\E\177:\
+       :sf=^J:so=\E\177:ue=\E^A:up=^K:us=\E^A:
+
+#### Southwest Technical Products
+#
+# These guys made an early personal micro called the M6800.  
+# The ct82 was probably its console terminal.
+#
+
+# (swtp: removed obsolete ":bc=^D:" -- esr)
+swtp|ct82|southwest technical products ct82:\
+       :am:\
+       :co#82:li#20:\
+       :al=^^Y:bl=^G:cd=^V:ce=^F:cl=^L:cm=\013%r%.%.:cr=^M:\
+       :dc=^^H:dl=^Z:do=^J:ei=:ho=^P:ic=^^X:im=:\
+       :is=\034\022\036\023\036\004\035\027\011\023\036\035\036\017\035\027\022\011:\
+       :le=^D:ll=^C:nd=^S:se=^^^F:sf=^N:so=^^^V:sr=^O:up=^A:
+
+#### Synertek
+#
+# Bob Manson <manson@pattyr.acs.ohio-state.edu> writes (28 Apr 1995):
+#
+# Synertek used to make ICs, various 6502-based single-board process
+# control and hobbyist computers, and assorted peripherals including a
+# series of small inexpensive terminals (I think they were one of the
+# first to have a "terminal-on-a-keyboard", where the terminal itself
+# was only slightly larger than the keyboard).
+#
+# They apparently had a KTM-1 model, which I've never seen. The KTM-2/40
+# was a 40x24 terminal that could connect to a standard TV through a
+# video modulator.  The KTM-2/80 was the 80-column version (the 2/40
+# could be upgraded to the 2/80 by adding 2 2114 SRAMs and a new ROM).
+# I have a KTM-2/80 still in working order.  The KTM-2s had fully
+# socketed parts, used 2 6507s, a 6532 as keyboard scanner, a program
+# ROM and 2 ROMs as character generators. They were incredibly simple,
+# and I've never had any problems with mine (witness the fact that mine
+# was made in 1981 and is still working great... I've blown the video
+# output transistor a couple of times, but it's a 2N2222 :-)
+#
+# The KTM-3 (which is what is listed in the terminfo file) was their
+# attempt at putting a KTM-2 in a box (and some models came with a
+# CRT). It wasn't much different from the KTM-2 hardware-wise, but the
+# control and escape sequences are very different. The KTM-3 was always
+# real broken, at least according to the folks I've talked to about it.
+# 
+# The padding in the entry is probably off--these terminals were very
+# slow (it takes like 100ms for the KTM-2 to clear the screen...) And
+# anyone with any sanity replaced the ROMs with something that provided
+# a reasonable subset of VT100 functionality, since the usual ROMs were
+# obviously very primitive... oh, you could get an upgraded ROM from
+# Synertek for some incredible amount of money, but what hacker with an
+# EPROM burner would do that? :)
+# 
+# Sorry I don't have any contact info; I believe they were located in
+# Sunnyvale, and I'm fairly sure they are still manufacturing ICs
+# (they've gone to ASICs and FPGAs), but I doubt they're in the computer
+# business these days.
+
+# Tested, seems to work fine with vi.
+synertek|ktm|synertek380|synertek ktm 3/80 tubeless terminal:\
+       :am:\
+       :co#80:li#24:\
+       :cd=\EJ:ce=\EK:cl=^Z:cm=\E=%+ %+ :le=^H:nd=^L:up=^K:
+
+#### Tab Office Products
+#
+#      TAB Products Co. - Palo Alto, California
+#      Electronic Office Products,
+#      1451 California Avenue 94304
+#
+# I think they're out of business.
+#
+
+# The tab 132 uses xon/xoff, so no padding needed.
+# :ks:/:ke: have nothing to do with arrow keys.
+# :is: sets 80 col mode, normal video, autowrap on (for :am:).
+# Seems to be no way to get rid of status line.
+# The manual for this puppy was dated June 1981.  It claims to be VT52-
+# compatible.
+tab132|tab|tab132-15|tab 132/15:\
+       :da:db:\
+       :co#80:dN@:li#24:lm#96:\
+       :al=\E[L:cm=\E[%i%d;%dH:dc=\E[P:dl=\E[M:do=^J:\
+       :ei=\E[4l:im=\E[4h:is=\E[?7h\E[?3l\E[?5l:kd=\E[B:ke@:\
+       :kl=\E[D:ks@:ku=\E[A:tc=vt100:
+tab132-w:\
+       :co#132:\
+       :is=\E[?7h\E[?3h\E[?5l:tc=tab132:
+tab132-rv:\
+       :is=\E[?7h\E[?3l\E[?5h:tc=tab132:
+tab132-w-rv:\
+       :is=\E[?7h\E[?3h\E[?5h:tc=tab132-w:
+
+
+#### Teleray
+#
+#      Research Incorporated
+#      6425 Flying Cloud Drive
+#      Eden Prairie, MN 55344
+#      Vox: (612)-941-3300
+#
+# The Teleray terminals were all discontinued in 1992-93.  RI still services
+# and repairs these beasts, but no longer manufactures them.  The Teleray
+# people believe that all the types listed below are very rare now (1995).
+# There was a newer line of Telerays (Model 7, Model 20, Model 30, and
+# Model 100) that were ANSI-compatible.
+#
+# Note two things called "teleray".  Reorder should move the common one
+# to the front if you have either.  A dumb teleray with the cursor stuck
+# on the bottom and no obvious model number is probably a 3700.
+#
+
+t3700|dumb teleray 3700:\
+       :bs:\
+       :co#80:li#24:\
+       :bl=^G:cl=^L:cr=^M:do=^J:le=^H:sf=^J:
+# (t3800: mapped ":pt:" to default tabs -- esr)
+t3800|teleray 3800 series:\
+       :bs:pt:\
+       :co#80:li#24:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=^L:cm=\EY%+ %+ :cr=^M:do=^J:\
+       :ho=\EH:le=^H:ll=\EY7 :nd=\EC:sf=^J:ta=^I:up=^K:
+# (t1061: mapped ":pt:" to default tabs -- esr)
+t1061|teleray|teleray 1061:\
+       :am:km:xs:xt:\
+       :co#80:li#24:sg#1:ug#1:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=\014:cm=\EY%+ %+ :\
+       :cr=^M:ct=\EG:dc=\EQ:dl=\EM:do=^J:ei=:ho=\EH:ic=\EP:\
+       :im=:ip=:\
+       :is=\Ee\EU01^Z1\EV\EU02^Z2\EV\EU03^Z3\EV\EU04^Z4\EV\EU05^Z5\EV\EU06^Z6\EV\EU07^Z7\EV\EU08^Z8\EV\Ef:\
+       :k1=^Z1:k2=^Z2:k3=^Z3:k4=^Z4:k5=^Z5:k6=^Z6:k7=^Z7:\
+       :k8=^Z8:le=^H:nd=\EC:se=\ER@:sf=^J:so= \ERD:st=\EF:\
+       :ta=^I:ue=\ER@:up=\EA:us=\ERH:
+t1061f|teleray 1061 with fast PROMs:\
+       :al=\EL:dl=\EM:ip@:tc=t1061:
+# "Teleray Arpa Special", offically designated as
+# "Teleray Arpa network model 10" with "Special feature 720".
+# This is the new (1981) fast microcode updating the older "arpa" proms
+# (which gave meta-key and progmmable-fxn keys).  720 is much much faster,
+# converts the keypad to programmable function keys, and has other goodies.
+# Standout mode is still broken (magic cookie, etc) so is suppressed as no
+# programs handle such lossage properly.
+# Note: this is NOT the old termcap's "t1061f with fast proms."
+# From: J. Lepreau <lepreau@utah-cs> Tue Feb  1 06:39:37 1983, Univ of Utah
+# (t10: mapped ":pt:" to default tabs;
+# removed overridden ":so@:se@:us@:ue@:" -- esr)
+t10|teleray 10 special:\
+       :bs:km:pt:xs:xt:\
+       :co#80:li#24:sg#2:ug#1:\
+       :al=\EL:cd=\EJ:ce=\EK:cl=30\Ej:cm=\EY%+ %+ :dc=\EQ:\
+       :dl=\EM:ei=:ho=\EH:ic=\EP:im=:nd=\EC:pc=\200:se=\ER@:\
+       :sf=\Eq:so=\ERD:sr=\Ep:ue=\ER@:up=\EA:us=\ERH:
+# teleray 16 - map the arrow keys for vi/rogue, shifted to up/down page, and
+# back/forth words. Put the function keys (f1-f10) where they can be
+# found, and turn off the other magic keys along the top row, except
+# for line/local. Do the magic appropriate to make the page shifts work.
+# Also toggle ^S/^Q for those of us who use Emacs.
+t16|teleray 16:\
+       :am:da:db:mi:xs:xt:\
+       :co#80:li#24:\
+       :al=\E[L:bl=^G:cd=\E[0J:ce=\E[0K:cl=\E[H\E[2J:\
+       :cm=%i\E[%d;%df:cr=^M:dc=\E[P:dl=\E[M:do=\E[B:\
+       :ei=\E[4l:ho=\E[H:im=\E[4h:k1=^Z1:k2=^Z2:k3=^Z3:\
+       :k4=^Z4:k5=^Z5:k6=^Z6:k7=^Z7:k8=^Z8:k9=^Z9:k;=^Z0:\
+       :le=^H:nd=\E[C:se=\E[m:sf=^J:so=\E[7m:sr=\E[T:ta=^I:\
+       :te=\E[V\E[24;1f\E[?38h:ti=\E[U\E[?38l:ue=\E[m:\
+       :up=\E[A:us=\E[4m:
+
+#### Texas Instruments (ti)
+#
+
+ti700|ti733|ti735|ti silent 700:\
+       :bs:hc:os:\
+       :co#80:dC#162:\
+       :bl=^G:cr=\r:do=^J:le=^H:sf=^J:
+ti743|ti745|ti silent 745:\
+       :bs:hc:os:\
+       :co#80:\
+       :bl=^G:cr=^M:do=^J:le=^H:sf=^J:
+ti800|ti omni 800:\
+       :bs:hc:os:\
+       :co#132:\
+       :bl=^G:cr=^M:do=^J:le=^H:sf=^J:
+ti924|Texas Instruments 924 VDT 8859/1 7 bit CTRL:\
+       :am:xo:\
+       :co#80:it#8:li#24:\
+       :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[2J\E[H:\
+       :cm=%i\E[%d;%dH:cr=^M:cs=%i\E[%d;%dr:ct=\E[3g:\
+       :dl=\E[M:do=\E[B:ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:\
+       :k4=\EOS:k5=\E[16~:k6=\E[17~:k7=\E[18~:k8=\E[19~:\
+       :k9=\E[20~:kD=\E[P:kI=\E[@:kb=^H:kd=\E[B:kl=\E[D:\
+       :kr=\E[C:ku=\E[A:le=\E[D:mb=\E[5m:md=\E[1m:me=\E[0m:\
+       :mr=\E[7m:nd=\E[C:rc=\E8:sc=\E7:se=\E[m:sf=\ED:\
+       :so=\E[7m:sr=\EM:st=\EH:ta=^I:ue=\E[m:up=\E[A:\
+       :us=\E[4m:ve=\E[?25h:vi=\E[?25l:vs=\E[?31h:
+ti924-8|Texas Instruments 924 VDT 8859/1 8 bit CTRL:\
+       :am:xo:\
+       :co#80:it#8:li#24:\
+       :al=\E[L:bl=^G:cd=\E[J:ce=\E[K:cl=\E[2J\E[H:\
+       :cm=%i\E[%d;%dH:cr=^M:cs=%i\E[%d;%dr:ct=\E[3g:\
+       :dl=\E[M:do=\E[B:ho=\E[H:k1=P\217>:k2=Q\217>:\
+       :k3=R\217>:k4=S\217>:k5=~\23316>:k6=~\23317>:\
+       :k7=~\23318>:k8=~\23319>:k9=~\23320>:kD=P\233>:\
+       :kI=@\233>:kb=^H:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:\
+       :le=\E[D:mb=\E[5m:md=\E[1m:me=\E[0m:mr=\E[7m:nd=\E[C:\
+       :rc=\E8:sc=\E7:se=\E[m:sf=\ED:so=\E[7m:sr=\EM:st=\EH:\
+       :ta=^I:ue=\E[m:up=\E[A:us=\E[4m:ve=\E[?25h:\
+       :vi=\E[?25l:vs=\E[?31h:
+ti924w|Texas Instruments 924 VDT 7 bit - 132 column mode:\
+       :co#132:\
+       :tc=ti924:
+ti924-8w|Texas Instruments 924 VDT 8 bit - 132 column mode:\
+       :co#132:\
+       :tc=ti924-8:
+em931-9|Texas Instruments 924 Emulator in the 931 Mode:\
+       :tc=ti931:
+em924|Texas Instruments 924 Emulator in the 924 Mode:\
+       :tc=ti924:
+em931|Texas Instruments 931 Emulator:\
+       :tc=ti931:
+ti931|Texas Instruments 931 VDT:\
+       :am:xo:\
+       :co#80:li#24:\
+       :LE=ENTR:al=\EN:bl=^G:cd=\EJ:ce=\EI:cl=\EL:\
+       :cm=\EY%+ %+ :cr=^M:dc=\EQ:dl=\EO:do=\EB:ei=:ho=\EH:\
+       :ic=\ER\EP\EM:im=:is=\EGB\E(@B@@\E):k1=\Ei1:k2=\Ei2:\
+       :k3=\Ei3:k4=\Ei4:k5=\Ei5:k6=\Ei6:k7=\Ei7:k8=\Ei8:\
+       :k9=\Ei9:kA=\EN:kD=\EQ:kI=\EP:kL=\EO:kd=\EB:kl=\ED:\
+       :kr=\EC:ku=\EA:le=\ED:mb=\E4P:me=\E4@:mk=\E4H:\
+       :mr=\E4B:nd=\EC:se=\E4@:sf=\Ea:so=\E4A:sr=\Eb:\
+       :ue=\E4@:up=\EA:us=\E4D:ve=\E4@:
+ti926|Texas Instruments 926 VDT 8859/1 7 bit CTRL:\
+       :cs@:sf=\E[1S:sr=\E[1T:tc=ti924:
+ti926-8|Texas Instruments 926 VDT 8859/1 8 bit CTRL:\
+       :cs@:sf=S\2331>:sr=T\2331>:tc=ti924-8:
+ti_ansi|basic entry for ti928:\
+       :am:eo:ut:xn:xo:\
+       :Co#8:co#80:it#8:li#25:pa#64:\
+       :@7=\E[F:Sb=\E[4%dm:Sf=\E[3%dm:al=\E[L:bl=^G:bt=\E[Z:\
+       :cd=\E[J:ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:cr=^M:\
+       :cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B:ei=:ho=\E[H:\
+       :ic=\E[@:im=:k0=\E[V:k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:\
+       :k5=\E[Q:k6=\E[R:k7=\E[S:k8=\E[T:k9=\E[U:kN=\E[G:\
+       :kP=\E[I:kb=^H:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:\
+       :ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:me=\E[m:nd=\E[C:\
+       :op=\E[37;40m:se=\E[m:sf=\E[S:so=\E[7m:sr=\E[T:ta=^I:\
+       :ue=\E[m:up=\E[A:us=\E[4m:
+#
+#       928 VDT 7 bit control mode
+#
+ti928|Texas Instruments 928 VDT 8859/1 7 bit CTRL::\
+       :%9=\E[35~:@7=\E_1\E\\:@8=\E[8~:F1=\E[29~:F2=\E[31~:\
+       :F3=\E[32~:F5=\E[34~:k1=\E[17~:k2=\E[18~:k3=\E[19~:\
+       :k4=\E[20~:k5=\E[21~:k6=\E[23~:k7=\E[24~:k8=\E[25~:\
+       :k9=\E[26~:k;=\E[28~:kD=\E[P:kI=\E[@:kN=\E[S:kP=\E[T:tc=ti_ansi:
+#
+#       928 VDT 8 bit control mode
+#
+ti928-8|Texas Instruments 928 VDT 8859/1 8 bit CTRL::\
+       :%9=\23335~:@7=\2371\234:@8=\2338~:F1=\23329~:\
+       :F2=\23331~:F3=\23332~:F5=\23334~:k1=\23317~:\
+       :k2=\23318~:k3=\23319~:k4=\23320~:k5=\23321~:\
+       :k6=\23323~:k7=\23324~:k8=\23325~:k9=\23326~:\
+       :k;=\23328~:kD=\233P:kI=\233@:kN=\233S:kP=\233T:\
+       :kh=\233H:tc=ti_ansi:
+
+#### Zentec (zen)
+#
+
+# (zen30: removed obsolete ":ma=^L ^R^L^K^P:" -- esr)
+zen30|z30|zentec 30:\
+       :am:bs:mi:ul:\
+       :co#80:li#24:\
+       :al=\EE:bl=^G:cd=\EY:ce=\ET:cl=\E*:cm=\E=%+ %+ :\
+       :cr=^M:dc=\EW:dl=\ER:do=^J:ei=\Er:ho=^^:im=\Eq:le=^H:\
+       :nd=^L:se=\EG0:sf=^J:so=\EG6:up=^K:
+# (zen50: this had unknown capabilities
+#      :BS=^U:CL=^V:CR=^B:
+# UK/DK/RK/LK/HM were someone's aliases for ku/kd/kl/kr/kh,
+# which were also in the original entry -- esr)
+# (zen50: removed obsolete ":ma=^Hh^Ll^Jj^Kk:" -- esr)
+zen50|z50|zentec zephyr:\
+       :am:bs:\
+       :co#80:li#24:sg#1:\
+       :al=\EE:cd=\EY:ce=\ET:cl=\E+:cm=\E=%+ %+ :dc=\EW:\
+       :dl=\ER:ei=:ic=\EQ:im=:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+       :se=\EGO:so=\EG4:up=^K:
+
+######## OTHER OBSOLETE TYPES
+#
+# These terminals are *long* dead -- these entries are retained for
+# historical interest only.
+
+#### Obsolete non-ANSI software emulations
+#
+
+# CTRM terminal emulator
+# 1. underlining is not allowed with colors: first, is is simulated by 
+# black on white, second, it disables background color manipulations.
+# 2. BLINKING, REVERSE and BOLD are allowed with colors,
+# so we have to save their status in the static registers A, B and H
+# respectively, to be able to restore them when color changes
+# (because any color change turns off ALL attributes)
+# 3. "enter_bold_mode" and "enter_reverse_mode" sequences alternates modes,
+# rather then simply  entering them.  Thus we have to check the
+# static register B and H to determine the status, before sending the 
+# escape sequence.
+# 4. sgr0 now must set the status of all 3 register (A,B,H) to zero
+# and then reset colors
+# 5. implementation of the protect mode would badly penalize the performance.
+# we would have to use \E&bn sequence to turn off colors (as well as all
+# other attributes), and keep the status of protect mode in yet another
+# static variable.  If someone really need this mode, they would have to
+# create another terminfo entry.
+# 6. original color-pair is white on black.
+# store the information about colors into static registers
+# 7. set foreground color.  it performs the following steps.
+#   1) turn off all attributes
+#   2) turn on the background and video attribues that have been turned
+#      on before (this information is stored in static registers X,Y,Z,A,B,H,D).
+#   3) turn on foreground attributes
+#   4) store information about foreground into U,V,W static registers
+# 8. turn on background: similar to turn on foreground above
+ctrm|C terminal emulator:\
+       :am:ut:xo:\
+       :Co#8:NC#2:Nl#0:co#80:lh#0:li#24:lm#0:lw#0:pa#63:\
+       :pb#19200:vt#6:\
+       :..Sb=\E&bn\n%?%gA%t\E&dA%;\n%?%gB%t\E&dB%;\n%?%gH%t\E&dH%;\n%?%gU%t\E&bR%;\n%?%gV%t\E&bG%;\n%?%gW%t\E&bB%;\n\n%?%p1%{1}%&%t\E&bb%{1}%e%{0}%;%PZ\n%?%p1%{2}%&%t\E&bg%{1}%e%{0}%;%PY\n%?%p1%{4}%&%t\E&br%{1}%e%{0}%;%PX:\
+       :..Sf=\E&bn\n%?%gA%t\E&dA%;\n%?%gB%t\E&dB%;\n%?%gH%t\E&dH%;\n%?%gX%t\E&br%;\n%?%gY%t\E&bg%;\n%?%gZ%t\E&bb%;\n\n%?%p1%{1}%&%t\E&bB%{1}%e%{0}%;%PW\n%?%p1%{2}%&%t\E&bG%{1}%e%{0}%;%PV\n%?%p1%{4}%&%t\E&bR%{1}%e%{0}%;%PU:\
+       :al=\EL:bl=^G:bt=\Ei:cd=\EJ:ce=\EK:ch=\E&a%dC:\
+       :cl=\EH\EJ:cm=\E&a%r%dc%dY:cr=^M:ct=\E3:cv=\E&a%dY:\
+       :dc=\EP:dl=\EM:do=^J:ei=\ER:im=\EQ:ip=:is=\E&jA\r:\
+       :k1=\Ep\r:k2=\Eq\r:k3=\Er\r:k4=\Es\r:k5=\Et\r:\
+       :k6=\Eu\r:k7=\Ev\r:k8=\Ew\r:kb=^H:kd=\Ew\r:ke=\E&jA:\
+       :kh=\Ep\r:kl=\Eu\r:kr=\Ev\r:ks=\E&jB:ku=\Et\r:le=^H:\
+       :mb=\E&dA%{1}%PA:md=%?%gH%{0}%=%t\E&dH%{1}%PH%;:\
+       :me=\E&d@%{0}%PA%{0}%PB%{0}%PH:\
+       :mr=%?%gB%{0}%=%t\E&dB%{1}%PB%;:nd=\EC:\
+       :op=\E&bn\E&bB\E&bG\E&bR\n%{0}%PX%{0}%PY%{0}%PZ\n%{1}%PW%{1}%PV%{1}%PU:\
+       :..sa=\E&d@%{0}%PA%{0}%PB%{0}%PD%{0}%PH\n%?%p1%p3%p5%|%|%t\E&dB%{1}%PB%;\n%?%p4%t\E&dA%{1}%PA%;\n%?%p6%t\E&dH%{1}%PH%;\n%?%p2%t\E&dD%;:\
+       :sf=^J:so=\E&dD:st=\E1:ta=\011:up=\EA:us=\E&dD:
+
+# gs6300 - can't use blue foreground, it clashes with underline;
+# it's simulated with cyan
+gs6300|emots|AT&T PC6300 with EMOTS Terminal Emulator:\
+       :am:ms:ut:xo:\
+       :Co#8:co#80:it#8:li#24:pa#63:\
+       :AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:IC=\E[%d@:\
+       :LE=\E[%dD:LF=\E|:RI=\E[%dC:Sb=\E[?;%dm:\
+       :..Sf=\E[?%?%p1%{0}%=%t0\n%e%p1%{1}%=%t2\n%e%p1%{1}%-%d%;m:\
+       :UP=\E[%dA:\
+       :ac=\\\054\\\054..--++``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=\E[10m:al=\E[L:as=\E[11m:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:dc=\E[P:dl=\E[M:\
+       :do=^J:ei=:ho=\E[H:ic=\E[@:im=:is=\E[0m:k1=\E[0s:\
+       :k2=\E[24s:k3=\E[1s:k4=\E[23s:k5=\E[2s:k6=\E[22s:\
+       :k7=\E[3s:k8=\E[21s:kB=^R^I:kb=^H:kd=\E[B:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ku=\E[A:le=^H:mb=\E[5m:md=\E[1m:\
+       :me=\E[m\E[10m:mr=\E[7m:nd=\E[C:op=\E[?;m:pf=\E[4i:\
+       :po=\E[5i:r1=\Ec:sf=^J:so=\E[1m:sr=\E[L:ta=^I:\
+       :up=\E[A:us=\E[4m:
+
+# From: <earle@smeagol.UUCP> 29 Oct 85 05:40:18 GMT
+# MS-Kermit with Heath-19 emulation mode enabled
+# (h19k: changed ":pt@:" to ":it@"
+h19k|h19kermit|heathkit emulation provided by Kermit (no auto margin):\
+       :am@:da:db:xt:\
+       :it@:\
+       :ta@:tc=h19-u:
+
+# pc52 - can't use blue foreground, it clashes with underline;
+# it's simulated with cyan
+# bold means: white on black bold, so it not allowed with colors
+# rev means: black on white, also not allowed
+# smso and dim are simulated with colors, ditto
+# smul is allowed, even though it always means white foreground:
+# it is too important to leave out.
+pc52|dec vt52 for PC:\
+       :am:ms:ut:\
+       :Co#8:NC#53:co#80:it#8:li#25:pa#63:\
+       :Sb=\Ec%d:..Sf=\Eb%?%p1%{1}%=%t3\n%e%p1%d%;:al=\EL:\
+       :bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :cr=^M:\
+       :dl=\EM:do=^J:k1=\Ea:k2=\Eb:k3=\Ec:k4=\Ed:k5=\Ee:\
+       :k6=\Ef:k7=\Eg:k8=\Eh:k9=\Ei:k;=\Ej:kb=^H:kd=\ED:\
+       :kl=\EL:kr=\ER:ku=\EU:le=^H:mb=\Eo:md=\Ebo\Ec0:\
+       :me=\Eb7\Ec0\Et:mh=\Eb3\Ec0:mr=\Ep:nd=\EC:\
+       :op=\Eb7\Ec0:se=\Eb7\Ec0:sf=^J:so=\Eb6\Ec4:sr=\EI:\
+       :ta=^I:up=\EA:us=\Es:
+
+# vs100 emulator using tsim
+# From: <lai@decwrl.dec.com>
+# (vs100t: had Al/Dl in front of obvious AL/DL capabilities;
+# also mapped ":pt:" to default tabs -- esr)
+vs100t|tsim|vs100-tsim:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :AL=\E+%+ :DL=\E-%+ :al=\EI:cd=\EQ:ce=\EL:cl=\EE:\
+       :cm=\EM%+ %+ :cs=\ES%+ %+ :dc=\Ed:dl=\ED:do=^J:ei=:\
+       :ho=\EH:ic=\Ei:im=:is=\ER:nd=\En:rs=\ER:se=\Er:\
+       :so=\Eh:ue=\Ev:up=^K:us=\Eu:
+
+# From: Rick Thomas <ihnp4!btlunix!rbt>
+xtalk|IBM PC with xtalk communication program (versions up to 3.4):\
+       :am:mi:ms:xo:\
+       :co#80:it#8:li#24:sg#1:vt#3:\
+       :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+       :K5=\EOn:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:al=\E[L:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:ct=\E[3g:dl=\E[M:\
+       :do=^J:eA=\E(B\E)0:ho=\E[H:k0=\EOy:k1=\EOP:k2=\EOQ:\
+       :k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:k8=\EOl:\
+       :k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:\
+       :kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:nd=\E[C:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:se=\E[m :sf=^J:\
+       :so=\E[7m :sr=\EM:st=\EH:ta=^I:up=\E[A:
+
+# YTERM standard version 1.0.
+# Straight old ascii keyboard except function keys are Yale (e.g.,ASCII.KBD).
+# Only 80 tab columns (else yterm 1.1 bug).  No :xn: in 1.0.
+# Cannot use termcap :sr=\EM: because vi will not work, too bad.
+# vi string is given so that yterm is reset each vi startup.
+# (yterm10: removed obsolete ":EP:" and ":ma=\bh^Jj\vk\fl\1eH:" capabilities;
+# mapped ":pt:" to default tabs -- esr)
+# From: greg small <gts@populi.berkeley.edu> 9-25-84
+yterm10|yterm 1.0 UCB ascii.kbd:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :cd=^K:ce=^]:cl=^L:cm=\036%r%+ %+ :ho=^Y:\
+       :is=\017\E[7i\E[m\E[?7h\E[?3g\r\EHY0  for \EHYTERM 1.\EH0 with A\EHSCII.KBD\EH 9-13-84\EH        \EH        \EH        \EH        \EH\n:\
+       :k0=\E0:k1=\E1:k2=\E2:k3=\E3:k4=\E4:k5=\E5:k6=\E6:\
+       :k7=\E7:k8=\E8:k9=\E9:kd=^J:kh=^^:kl=^H:kr=^L:ku=^K:\
+       :nd=^\:rc=\E8:sc=\E7:se=\E[m:so=\E[7m:ue=\E[m:up=^_:\
+       :us=\E[4m:\
+       :vs=\017\E[7i\E[m\E[?7h\E[?3g\r\EHY0      \EH        \EH        \EH        \EH        \EH        \EH        \EH        \EH        \EH\r:
+# YTERM variant version 1.1.  Version 1.1 has :xn:.
+# From: greg small <gts@populi.berkeley.edu> 9-13-84
+yterm11|yterm 1.1 UCB ascii.kbd:\
+       :xn:\
+       :is=\017\E[7i\E[m\E[?7h\E[?3g\r\EHY1  for \EHYTERM 1.\EH1 with A\EHSCII.KBD\EH 9-13-84\EH        \EH        \EH        \EH        \EH\n:tc=yterm10:
+# YTERM 1.0 variant no autowrap or tabs
+# X does not remember autowrap or tabs when T is deleted and restarted.
+# (yterm: changed ":pt@:" to ":it@:" -- esr)
+yterm10nat|yterm 1.0 UCB ascii.kbd no autowrap or tabs:\
+       :am@:\
+       :it@:\
+       :is=\017\E[7i\E[m\E[?7l\E[?3g\rY2  for YTERM 1.0 with ASCII.KBD 9-20-84 no autowrap or tabs\n:\
+       :vs=\017\E[7i\E[m\E[?7l\E[?3g\rY2\r:tc=yterm10:
+
+# The official PC terminal emulator program of the AT&T Product Centers.
+# Note - insert mode commented out - doesn't seem to work on AT&T PC.
+simterm|attpc running simterm:\
+       :am:\
+       :co#80:li#24:\
+       :al=\EL:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\E=%+ %+ :\
+       :cr=^M:dc=\ER:dl=\EM:do=\EB:ho=\EH:im=\EQ:le=^H:\
+       :nd=\EC:sf=^J:so=\E&dB:te=\EVE:ti=\EVS:up=\EA:
+
+#### Daisy wheel printers
+#
+
+# This section collects Diablo, DTC, Xerox, Qume, and other daisy
+# wheel terminals.  These are now largely obsolete.
+#
+# This is an "experimental" entry for the SRI Agiles.
+# It has been tried in a minimal way -- the Agile did not blow up!
+# However, it has not been exhaustively tested.
+# Anyone who tries it and finds it wanting should get in touch with:
+# From: Ralph Keirstead <ralph@sri-unix>
+#      EK352; SRI International; 333 Ravenswood Avenue; Menlo Park, CA 94025
+# (agile: I removed an incorrect ":pl:" -- esr)
+agile|agiles|sri agiles:\
+       :hc:os:\
+       :co#132:\
+       :bl=^G:cr=^M:ct=\E2:do=^J:hd=\E9:hu=\E0:is=\EE\EF\EJ:\
+       :kb=^H:le=^H:sf=^J:st=\E1:ta=^I:up=\E^J:
+# (1620: mapped ":pt:" to default tabs -- esr)
+diablo1620|diablo1720|diablo450|ipsi|diablo 1620:\
+       :bs:hc:os:pt:\
+       :co#132:\
+       :ch=\E\011%i%.:ct=\E2:do=^J:hd=\ED:hu=\EU:\
+       :if=/usr/share/tabset/xerox1720:kb=^H:le=^H:st=\E1:\
+       :up=\E^J:
+diablo1620-m8|diablo1640-m8|diablo 1620 w/8 column left margin:\
+       :co#124:\
+       :do=^J:is=\r        \E9:tc=diablo1620:
+diablo1640|diablo1730|diablo1740|diablo630|x1700|diablo|xerox|diablo 1640:\
+       :bl=^G:if=/usr/share/tabset/xerox1730:se=\E&:so=\EW:\
+       :ue=\ER:us=\EE:tc=diablo1620:
+diablo1640-lm|diablo-lm|xerox-lm|diablo 1640 with indented left margin:\
+       :co#124:\
+       :if=/usr/share/tabset/xerox1730-lm:se=\E&:so=\EW:\
+       :ue=\ER:us=\EE:tc=diablo1620:
+diablo1740-lm|630-lm|1730-lm|x1700-lm:\
+       :tc=diablo1640-lm:
+# DTC 382 with VDU.  Has no :cd: so we fake it with :ce:.  Standout
+# (so="^P \002^PF:") works but won't go away without dynamite (":se=^P \200:").
+# The terminal has tabs, but I'm getting tired of fighting the braindamage. 
+# If no tab is set or the terminal's in a bad mood, it glitches the screen
+# around all of memory.  Note that return puts a blank ("a return character")
+# in the space the cursor was at, so we use ^P return (and thus ^P newline for
+# newline).  Note also that if you turn off pt and let Unix expand tabs,
+# curses won't work (current version) because it doesn't turn off this bit,
+# and cursor addressing sends a tab for row/column 9.  What a losing terminal!
+# I have been unable to get tabs set in all 96 lines - it always leaves at
+# least one line with no tabs in it, and once you tab through that line,
+# it completely weirds out.
+dtc382|DTC 382:\
+       :am:da:db:xs:\
+       :co#80:li#24:lm#96:\
+       :al=^P^Z:bl=^G:cd=\020\025\020\023\020\023:ce=^P^U:\
+       :cl=\020\035:cm=\020\021%r%.%.:cr=^P^M:dc=^X:dl=^P^S:\
+       :ei=^Pi:ho=^P^R:im=^PI:le=^H:nd=^PR:pc=\177:sf=^J:\
+       :te=\020\035:ue=^P \200:up=^P^L:us=^P ^P:ve=^Pb:\
+       :vs=^PB:
+dtc300s|DTC 300s:\
+       :hc:os:\
+       :co#132:\
+       :bl=^G:cr=^M:ct=\E3:do=^J:ff=^L:hd=\Eh:hu=\EH:kb=^H:\
+       :le=^H:sf=^J:st=\E1:ta=^I:up=^Z:
+gsi:\
+       :hc:os:\
+       :co#132:\
+       :bl=^G:cr=^M:do=^J:hd=\Eh:hu=\EH:le=^H:sf=^J:ta=^I:\
+       :up=^Z:
+aj830|aj832|aj|anderson jacobson:\
+       :bs:hc:os:\
+       :bl=^G:cr=^M:do=^J:hd=\E9:hu=\E8:le=^H:sf=^J:up=\E7:
+# From: Chris Torek <chris@gyre.umd.edu> Thu, 7 Nov 85 18:21:58 EST
+aj510|AJ510|Anderson-Jacobson model 510:\
+       :am:bs:mi:\
+       :co#80:li#24:\
+       :al=2*\E&I:cd=\E'P:ce=\E'L:cl=^L:cm=\E#%+ %+ :\
+       :dc=.1*\E'D:dl=2*\E&D:ei=\E'J:ic=:im=\E'I:ip=.1*:\
+       :kd=\EZ:kl=\EW:kr=\EX:ku=\EY:nd=\EX:pc=\177:se=\E"I:\
+       :so=\E"I:te=\E"N:ti=\E"N:ue=\E"U:up=\EY:us=\E"U:
+# From: <cbosg!ucbvax!pur-ee!cincy!chris> Thu Aug 20 09:09:18 1981
+# This is incomplete, but it's a start.
+# (5520: mapped ":pt:" to default tabs -- esr)
+nec5520|nec|spinwriter|nec 5520:\
+       :bs:hc:os:pt:\
+       :co#132:\
+       :bl=^G:cr=^M:ct=\E3:do=^J:ff=^L:hd=\E]s\n\E]W:\
+       :hu=\E]s\E9\E]W:kb=^H:le=^H:sf=^J:st=\E1:ta=^I:\
+       :up=\E9:
+# (qume5: mapped ":pt:" to default tabs -- esr)
+qume5|qume|Qume Sprint 5:\
+       :bs:hc:os:pt:\
+       :co#80:\
+       :bl=^G:cr=^M:ct=\E3:do=^J:ff=^L:hd=\Eh:hu=\EH:kb=^H:\
+       :le=^H:sf=^J:st=\E1:ta=^I:up=^Z:
+# I suspect the xerox1720 is the same as the diablo 1620.
+# (x1720: mapped ":pt:" to default tabs -- esr)
+xerox1720|x1720|x1750|xerox 1720:\
+       :bs:hc:os:pt:\
+       :co#132:\
+       :bl=^G:cr=^M:ct=\E2:do=^J:ff=^L:le=^H:sf=^J:st=\E1:\
+       :ta=^I:
+
+#### Miscellaneous obsolete terminals, manufacturers unknown
+#
+# If you have any information about these (like, a manufacturer's name, 
+# and a date on the serial-number plate) please send it!
+
+cad68-3|cgc3|cad68 basic monitor transparent mode size 3 chars:\
+       :am:bs:\
+       :co#73:li#36:\
+       :cl=^Z:ho=^^:nd=^L:up=^K:
+cad68-2|cgc2|cad68 basic monitor transparent mode size 2 chars:\
+       :am:bs:\
+       :co#85:li#39:\
+       :cl=^Z:ho=^^:k1=\E5:k2=\E6:k3=\E7:k4=\E8:kd=\E2:\
+       :kl=\E3:kr=\E4:ku=\E1:nd=^L:se=\Em^C:so=\Em^L:up=^K:
+cdi|cdi1203:\
+       :am:bs:hc:os:\
+       :co#80:\
+       :bl=^G:cr=\r:do=^J:le=^H:sf=^J:
+cops10|cops|cops-10:\
+       :am:bw:\
+       :co#80:li#24:\
+       :bl=^G:cd=^W:ce=^V:cl=30^X:cm=\020%+ %+ :cr=^M:do=^J:\
+       :kb=^H:kd=^J:kh=^Y:kl=^H:kr=^L:ku=^K:le=^H:nd=^L:\
+       :sf=^J:up=^K:
+# (d132: removed duplicate ":ic=\E5:" -- esr)
+d132|datagraphix|datagraphix 132a:\
+       :da:db:in:\
+       :co#80:li#30:\
+       :al=\E3:bl=^G:cl=^L:cr=^M:dc=\E6:do=^J:ei=:ho=\Et:\
+       :ic=\E5:im=:nd=\El:sf=\Ev:sr=\Ew:up=\Ek:ve=\Em\En:\
+       :vs=\Ex:
+# I'm told the d800 was an early portable terminal that looked a lot like the
+# original Compaq portable.
+# (d800: mapped ":pt:" to default tabs -- esr)
+d800|Direct 800/A:\
+       :am:bs:da:db:ms:pt:xs:\
+       :co#80:li#24:\
+       :ae=\E[0m:as=\E[1m:bl=^G:cd=\E[J:ce=\E[K:\
+       :cl=\E[1;1H\E[2J:cm=\E[%i%d;%dH:cr=^M:do=^J:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOT:k6=\EOU:k7=\EOV:\
+       :k8=\EOW:kd=\E[B:kl=\E[D:kr=\E[C:ku=\E[A:le=^H:\
+       :nd=\E[C:se=\E[0m:sf=\ED:so=\E[7m:sr=\EM:ta=^I:\
+       :ue=\E[0m:up=\E[A:us=\E[4m:ve=\E[>12h:vs=\E[>12l:
+digilog|digilog 333:\
+       :bs:\
+       :co#80:li#16:\
+       :bl=^G:ce=^X:cr=^M:do=^J:ho=^N:le=^H:nd=^I:sf=^J:\
+       :up=^O:
+env230|envision230|envision 230 graphics terminal:\
+       :am:mi:ms:xo:\
+       :co#80:it#8:li#24:vt#3:\
+       :@8=\EOM:DO=\E[%dB:K1=\EOq:K2=\EOr:K3=\EOs:K4=\EOp:\
+       :K5=\EOn:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:\
+       :ac=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:\
+       :ae=^O:as=^N:bl=^G:cb=\E[1K:cd=\E[J:ce=\E[K:\
+       :cl=\E[H\E[J:cm=\E[%i%d;%dH:cr=^M:cs=\E[%i%d;%dr:\
+       :ct=\E[3g:do=^J:eA=\E(B\E)0:ho=\E[H:k0=\EOy:k1=\EOP:\
+       :k2=\EOQ:k3=\EOR:k4=\EOS:k5=\EOt:k6=\EOu:k7=\EOv:\
+       :k8=\EOl:k9=\EOw:k;=\EOx:kb=^H:kd=\EOB:ke=\E[?1l\E>:\
+       :kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:le=^H:mb=\E[5m:\
+       :md=\E[1m:me=\E[m\017:mr=\E[7m:nd=\E[C:pf=\E[4i:\
+       :po=\E[5i:ps=\E[0i:\
+       :r2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:rc=\E8:\
+       :..sa=\E[%?%p1%t;1%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m:\
+       :sc=\E7:se=\E[0m<2>:sf=^J:so=\E[1m<2>:sr=\EM:st=\EH:\
+       :ta=^I:ue=\E[m:up=\E[A:us=\E[4m:
+# These execuports were impact-printer ttys with a 30- or maybe 15-cps acoustic
+# coupler attached, the whole rig fitting in a suitcase and more or less
+# portable.  Hot stuff for c.1977 :-) -- esr
+ep48|ep4080|execuport 4080:\
+       :am:bs:os:\
+       :co#80:\
+       :bl=^G:cr=^M:do=^J:hd=^\:hu=^^:le=^H:sf=^J:
+ep40|ep4000|execuport 4000:\
+       :am:bs:os:\
+       :co#136:\
+       :bl=^G:cr=^M:do=^J:hd=^\:hu=^^:le=^H:sf=^J:
+# From: Paul Leondis <unllab@amber.berkeley.edu>
+ifmr|Informer D304:\
+       :am:bs:\
+       :co#80:li#24:\
+       :cd=\E/:ce=\EQ:cl=\EZ:cm=\EY%r%+ %+ :dc=\E\\:do=^J:\
+       :ei=:ho=\EH:ic=\E[:im=:nd=\EC:se=\EK:so=\EJ:sr=\En:\
+       :up=\EA:
+# This used to say "de#001202" which presumably refers to the stty bits
+# that need to be set for some version of Unix.  We need the real delay
+# requirements in MS.
+mw2|Multiwriter 2:\
+       :hc:os:\
+       :co#132:\
+       :bl=^G:cr=^M:do=^J:sf=^J:
+# Entry largely based on wy60 and has the features of wy60ak.
+opus3n1+|Esprit  Opus3n1+ in wy60 mode with ANSI arrow keys +:\
+       :am:bw:hs:km:mi:ms:ul:xo:\
+       :Nl#8:co#80:lh#1:li#24:lw#8:ws#80:\
+       :#2=\E{:%9=\EP:&3=\Er:@7=\E[F:@8=\E7:F1=^AJ\r:\
+       :F2=^AK\r:F3=^AL\r:F4=^AM\r:F5=^AN\r:F6=^AO\r:\
+       :LF=\EA11:LO=\EA10:RA=\Ed.:RX=\Ec20:SA=\Ed/:SX=\Ec21:\
+       :ac=0wa_h[jukslrmqnxqzttuyv]wpxv:ae=\EH^C:al=\EE:\
+       :as=\EH^B:bl=^G:bt=\EI:cd=\EY:ce=\ET:cl=\E*:\
+       :cm=\Ea%i%dR%dC:cr=^M:ct=\E0:dc=\EW:dl=\ER:do=^J:\
+       :ds=\Ez(\r:ei=\Er:fs=^M:ho=\036:\
+       :if=/usr/lib/tabset/std:im=\Eq:ip=:\
+       :is=\E`\072\Ee(\EO\Ee6\Ec41\E~4\Ec21\Ed/\Ezz&\E[A\037\Ezz'\E[B\037\Ezz(\E[D\037\Ezz)\E[C\037\Ezz<\E[Q\037\Ezz`\E[F\037\EA1*\EZH12:\
+       :k1=^A@\r:k2=^AA\r:k3=^AB\r:k4=^AC\r:k5=^AD\r:\
+       :k6=^AE\r:k7=^AF\r:k8=^AG\r:k9=^AH\r:k;=^AI\r:kA=\EE:\
+       :kB=\EI:kD=\EW:kE=\ET:kI=\EQ:kL=\ER:kN=\EK:kP=\EJ:\
+       :kS=\EY:kb=^H:kd=\E[B:kh=^^:kl=\E[D:kr=\E[C:ku=\E[A:\
+       :le=^H:mb=\EG2:me=\E(\EH\003\EG0\EcD:mh=\EGp:mk=\EG1:\
+       :mp=\E):mr=\EG4:nd=^L:nw=\r\n:pf=^T:pl=\EZ2%+?%s\177:\
+       :pn=\Ez%+/%s\r:po=^R:ps=\EP:px=\EZ1%+?%s\177:\
+       :r1=\E~!\E~4:r2=\EeF:r3=\EwG\Ee(:\
+       :..sa=%?%p8%t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;\EG%'0'%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c:\
+       :se=\EG0:sf=^J:so=\EG4:sr=\Ej:st=\E1:ta=\011:\
+       :ti=\Ezz&\E[A\037\Ezz'\E[B\037\Ezz(\E[D\037\Ezz)\E[C\037\Ezz<\E[Q\037:\
+       :ts=\Ez(:uc=\EG8%p1%c\EG0:ue=\EG0:up=^K:us=\EG8:\
+       :ve=\E`1:vi=\E`0:
+# (ps300: changed ":pt@:" to "it@" -- esr)
+ps300|Picture System 300:\
+       :xt:\
+       :it@:\
+       :se@:so@:ue@:us@:tc=vt100:
+ramtek|ramtek 6000:\
+       :am:\
+       :co#78:li#24:\
+       :bl=^G:cl=[alpha]\n[erase]\n:cr=^M:do=^J:le=^H:sf=^J:
+# Upper case terminal, uses lower case for control sequences!!!
+tec400|tec scope:\
+       :sg#1:\
+       :al=e:cd=s:ce=c:cl=f:..cm=l%p2%~%c%p1%~%c:dc=t:dl=u:\
+       :do=h:ei=:ho=i:ic=d:im=:le=w:nd=g:se=|:so={:up=x:
+# From: <ucbvax!geoff> Mon Sep 21 21:15:45 1981
+# This entry has been tested.
+tec500|tec 500:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cl=\032:cm=\E=%+ %+ :cr=^M:do=^J:ho=^^:le=^H:\
+       :nd=^L:se=^\:sf=^J:so=^]:up=^K:
+# tec is untested, and taken from CB/Unix virtual terminal driver.
+# I would appreciate more information on this terminal, such as the
+# manufacturer and the model number.  There are too many tecs in here.
+# (tec: removed obsolete ":ma=^K^P^_ :" -- esr)
+tec:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cl=^L:cr=^M:do=^J:ho=^^:le=^H:nd=^_:sf=^J:\
+       :up=^K:
+teletec|Teletec Datascreen:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cl=^L:cr=^M:do=^J:ho=^^:le=^H:nd=^_:sf=^J:\
+       :up=^K:
+# Terak made a PDP-11 based box with a bitmapped display that ran UCSD
+# Pascal as the native O/S. It was quite a nice box, and there were several
+# at Berkeley.
+terak|Terak emulating Datamedia 1520:\
+       :tc=dm1520:
+# From: Mark Dornfeld <romwa@ucbvax.berkeley.edu>
+#              This termcap is for the LANPAR Technologies VISION 3220
+#      terminal.  The function key definitions k0-k5 represent the
+#      edit keypad: FIND, INSERT HERE, REMOVE, SELECT, PREV SCREEN,
+#      NEXT SCREEN. The key definitions k6-k9 represent the PF1 to
+#      PF4 keys.
+# (v3220: mapped ":pt:" to default tabs, removed obsolete ":kn#10:" -- esr)
+v3220|LANPAR Vision II model 3220/3221/3222:\
+       :am:bs:mi:pt:xn:\
+       :co#80:li#24:\
+       :al=\E[L:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:\
+       :dc=\E[P:dl=\E[M:ei=\E[4l:im=\E[4h:\
+       :is=\E>\E[?3l\E[?7h\E[?8h\E[p:k0=\E[1~:k1=\E[2~:\
+       :k2=\E[3~:k3=\E[4~:k4=\E[5~:k5=\E[6~:k6=\E[OP:\
+       :k7=\E[OQ:k8=\E[OR:k9=\E[OS:kd=\E[B:ke=\E>:kh=\E[H:\
+       :kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:nd=\E[C:se=\E[m:\
+       :so=\E[7m:sr=\EM:ue=\E[m:up=\E[A:us=\E[4m:
+# Does anybody know where these "wind" terminals came from?
+wind:\
+       :bs:\
+       :co#80:li#24:\
+       :cl=\EnP(\Eo:cm=\Ep%r%.%.:ho=\Ep\200\200:k1=\E5:\
+       :k2=\E6:k3=\E7:k4=\E8:kd=\E2:kl=\E3:kr=\E4:ku=\E1:\
+       :nd=^L:nl=^]:se=\Em^C:so=\Em^L:up=^K:
+wind16:\
+       :bs:\
+       :co#80:li#16:\
+       :cl=\EnP\020\Eo:cm=\Ep%r%.%.:ho=\Ep\200\200:nd=^L:\
+       :nl=^]:se=\Em^C:so=\Em^L:up=^K:
+wind40:\
+       :bs:\
+       :co#80:li#40:\
+       :cl=\EnP(\Eo:cm=\Ep%r%.%.:ho=\Ep\200\200:nd=^L:nl=^]:\
+       :se=\Em^C:so=\Em^L:up=^K:
+# (wind50: corrected :cl=\EnP\128\062\Eo: -- esr)
+wind50:\
+       :bs:\
+       :co#88:li#50:\
+       :cl=\EnP2\Eo:cm=\Ep%r%.%.:ho=\Ep\200\200:k1=\E5:\
+       :k2=\E6:k3=\E7:k4=\E8:kd=\E2:kl=\E3:kr=\E4:ku=\E1:\
+       :nd=^L:nl=^]:se=\Em^C:so=\Em^L:up=^K:
+# (xitex: removed obsolete ":ma=j^Jk^Pl :" -- esr)
+xitex|xitex sct-100:\
+       :bs:\
+       :co#64:li#16:\
+       :bl=^G:cd=\006\005:ce=\005:cl=\014:cm=\E=%+@%+@:\
+       :cr=^M:do=^J:ho=^D:le=^H:nd=\E+@A:sf=^J:sr=\E=@@\013:\
+       :up=^K:
+plasma|plasma panel:\
+       :am:bs:\
+       :co#85:li#45:\
+       :bl=^G:cl=^L:cr=^M:do=^J:ho=^^:le=^H:nd=^X:sf=^J:\
+       :up=^V:
+
+#### Homebrew and custom terminals
+#
+
+# Nu machine parameters taken from mit-vax.
+#                                              smc - 5/21/85
+#
+nuterminal:\
+       :am:mi:ms:\
+       :co#80:it#8:li#24:\
+       :ae=\EG:al=1*\EL:as=\EF:cd=60\EJ:ce=10\EK:cl=60\EE:\
+       :..cm=\EY%+ %+ :cr=^M:dc=2.5*\EN:dl=1*\EM:do=\EB:\
+       :ei=\EO:ho=\EH:im=\E@:ip=2.5*:k1=\ES:k2=\ET:k3=\EU:\
+       :k4=\EV:k5=\EW:k6=\EP:k7=\EQ:k8=\ER:kb=^H:kd=\EB:\
+       :kh=\EH:kl=\ED:kr=\EC:ku=\EA:l6=blue:l7=red:l8=white:\
+       :le=^H:nd=\EC:nw=^M^J:se=\Eq:sf=^J:so=\Ep:sr=\EI:\
+       :ta=^I:up=\EA:ve=\Ey4:vs=\Ex4:
+nu24|nuwindow:\
+       :mi:ms:\
+       :co#86:it#8:li#24:\
+       :ae=\EG:al=1*\EL:as=\EF:cd=\EJ:ce=\EK:cl=\EE:\
+       :..cm=\EY%+ %+ :cr=^M:dl=1*\EM:do=\EB:ei=\EO:ho=\EH:\
+       :im=\E@:ip=2.5*:kb=^H:kd=\EB:kh=\EH:kl=\ED:kr=\EC:\
+       :ku=\EA:le=^H:nd=\EC:nw=^M^J:se=\Eq:sf=^J:so=\Ep:\
+       :sr=\EI:ta=^I:up=\EA:ve=\Ey4:vs=\Ex4:
+bnu|nu51|bnuwindow:\
+       :co#86:li#51:\
+       :tc=nuterminal:
+fnu|nu61|fnuwindow:\
+       :co#86:li#61:\
+       :tc=nuterminal:
+nunix-30|nu-telnet-30|nu-half -- Half nu screen thru telnet:\
+       :am:\
+       :co#78:it#8:li#30:\
+       :al=\EL:cd=\EJ:ce=\EK:cl=\EE:..cm=\EY%+ %+ :cr=^M:\
+       :dl=\EM:do=\EB:ho=\EH:ip=2.5*:kb=^H:kd=^J:kl=^H:\
+       :le=^H:nd=\EC:nw=^M^J:se=\Eq:sf=^J:so=\Ep:sr=\EI:\
+       :ta=^I:up=\EA:
+nunix-61|nu-telnet-61|nu-full| Full nu screen thru telnet:\
+       :co#78:li#61:\
+       :tc=nunix-30:
+
+bch|bc|bill croft homebrew:\
+       :am:bs:\
+       :co#96:li#72:\
+       :cl=^Z:cm=\E=%+ %+ :do=^J:ho=^^:le=^H:nd=^L:up=^K:\
+       :vb=:
+nucterm|rayterm|NUC homebrew:\
+       :am:bs:\
+       :co#80:li#24:\
+       :bl=^G:cd=^E:ce=^A:cl=\014:cr=^M:do=^J:ho=^B:le=^H:\
+       :ll=^K:nd=^C:sf=^J:up=^N:
+carlock|klc:\
+       :am:bs:\
+       :co#80:li#24:\
+       :al=^E:bl=^G:ce=^U:cl=\032:cm=\E=%+ %+ :cr=^M:\
+       :dc=\177:dl=^D:do=^J:ei=^T:ho=^^:im=^T:nd=^L:se=^V:\
+       :sf=^J:so=^V:up=^K:vb=\EV\EV:
+# uVAX
+qdss|qdcons|qdss glass tty:\
+       :am:bs:\
+       :co#128:li#57:\
+       :cl=1\032:cm=\E=%.%.:do=^J:le=^H:nd=^L:up=^K:
+# (ubell: removed obsolete ":ma=j^Jk^P^K^Pl :";
+# mapped ":pt:" to default tabs; removed obsolete ":bc=^Y:" -- esr)
+ubell|ubellchar:\
+       :am:bs:pt:\
+       :co#80:li#24:\
+       :bl=^G:ce=\Ed:cl=^Z:cm=\E=%+ %+ :cr=^M:do=^J:ho=^^:\
+       :le=^H:nd=^L:sf=^J:ta=^I:up=^K:
+ttywilliams:\
+       :am:\
+       :co#80:li#12:\
+       :bl=^G:ce=^_:cl=^^:cr=^M:do=^K:ho=^]:le=^Y:nd=^X:\
+       :sf=^J:up=^Z:
+######## ICH/ICH1 VERSUS RMIR/SMIR
+#
+# Some non-curses applications get confused if both ich/ich1 and rmir/smir
+# are present; the symptom is doubled characters in an update using insert.
+# These applications are technically correct; in both 4.3BSD termcap and
+# terminfo, you're not actually supposed to specify both ich/ich1 and rmir/smir
+# unless the terminal needs both.  This requirement is now rare; most ich
+# sequences do not require previous smir, and most smir insert modes do not
+# require ich1 before each character.
+#
+# For ncurses-based applications this is not a problem, as ncurses uses
+# one or the other as appropriate but never mixes the two.  Therefore we
+# have not corrected entries like `linux' and `xterm' that specify both.
+# If you see doubled characters from these, use the linux-nic and xterm-nic
+# entries that suppress ich/ich1.
+#
+######## ANSI/VT100/PC-TERM TERMINAL STANDARDS
+#
+# ANSI Standard (X3.64) Control Sequences for Video Terminals and Peripherals
+# 
+# Most of the content of this comment is adapted from a table prepared by
+# Richard Shuford, based on a 1984 Byte article.  Terminfo correspondences
+# and discussion of some terminfo-related issues have been added.
+#
+# The table is a complete list of the defined ANSI X.364 control sequences.
+# In the main table, \E stands for an escape (\033) character, SPC for space.
+# Pn stands for a single numeric parameter to be inserted in decimal ASCII.
+# Ps stands for a list of such parameters separated by semicolons
+#
+#                                                   Default    Type
+# Sequence     Sequence                             Parameter   or
+# Mnemonic     Name              Sequence           Value      Mode   terminfo
+# -----------------------------------------------------------------------------
+# APC  Applicatn Program Command \E Fe               -         Delim  -
+# CBT  Cursor Backward Tab       \E [ Pn Z           1         eF     cbt
+# CCH  Cancel Previous Character \E T                -         -      -
+# CHA  Cursor Horzntal Absolute  \E [ Pn G           1         eF     hpa (1)
+# CHT  Cursor Horizontal Tab     \E [ Pn I           1         eF     tab (2)
+# CNL  Cursor Next Line          \E [ Pn E           1         eF     nel (3)
+# CPL  Cursor Preceding Line     \E [ Pn F           1         eF     -
+# CPR  Cursor Position Report    \E [ Pn ; Pn R      1, 1      -      -
+# CSI  Control Sequence Intro    \E [                -         Intro  -
+# CTC  Cursor Tab Control        \E [ Ps W           0         eF     -
+# CUB  Cursor Backward           \E [ Pn D           1         eF     cub
+# CUD  Cursor Down               \E [ Pn B           1         eF     cud
+# CUF  Cursor Forward            \E [ Pn C           1         eF     cuf
+# CUP  Cursor Position           \E [ Pn ; Pn H      1, 1      eF     cup (4)
+# CUU  Cursor Up                 \E [ Pn A           1         eF     cuu
+# CVT  Cursor Vertical Tab       \E [ Pn Y           -         eF     -
+# DA   Device Attributes         \E [ Pn c           0         -      -
+# DAQ  Define Area Qualification \E [ Ps o           0         -      -
+# DCH  Delete Character          \E [ Pn P           1         eF     dch
+# DCS  Device Control String     \E P                -         Delim  -
+# DL   Delete Line               \E [ Pn M           1         eF     dl
+# DMI  Disable Manual Input      \E \                -         Fs     -
+# DSR  Device Status Report      \E [ Ps n           0         -      -
+# EA   Erase in Area             \E [ Ps O           0         eF     -
+# ECH  Erase Character           \E [ Pn X           1         eF     ech
+# ED   Erase in Display          \E [ Ps J           0         eF     ed  (5)
+# EF   Erase in Field            \E [ Ps N           0         eF     -
+# EL   Erase in Line             \E [ Ps K           0         eF     el  (5)
+# EMI  Enable Manual Input       \E b                          Fs     -
+# EPA  End of Protected Area     \E W                -         -      -
+# ESA  End of Selected Area      \E G                -         -      -
+# FNT  Font Selection            \E [ Pn ; Pn SPC D  0, 0      FE     -
+# GSM  Graphic Size Modify       \E [ Pn ; Pn SPC B  100, 100  FE     -
+# GSS  Graphic Size Selection    \E [ Pn SPC C       none      FE     -
+# HPA  Horz Position Absolute    \E [ Pn `           1         FE     (1)
+# HPR  Horz Position Relative    \E [ Pn a           1         FE     (6)
+# HTJ  Horz Tab w/Justification  \E I                -         FE     (2)
+# HTS  Horizontal Tab Set        \E H                -         FE     hts
+# HVP  Horz & Vertical Position  \E [ Pn ; Pn f      1, 1      FE     (4)
+# ICH  Insert Character          \E [ Pn @           1         eF     ich
+# IL   Insert Line               \E [ Pn L           1         eF     il
+# IND  Index                     \E D                -         FE     -
+# INT  Interrupt                 \E a                -         Fs     -
+# JFY  Justify                   \E [ Ps SPC F       0         FE     -
+# MC   Media Copy                \E [ Ps i           0         -      -
+# MW   Message Waiting           \E U                -         -      -
+# NEL  Next Line                 \E E                -         FE     nel (3)
+# NP   Next Page                 \E [ Pn U           1         eF     -
+# OSC  Operating System Command  \E ]                -         Delim  -
+# PLD  Partial Line Down         \E K                -         FE     -
+# PLU  Partial Line Up           \E L                -         FE     -
+# PM   Privacy Message           \E ^                -         Delim  -
+# PP   Preceding Page            \E [ Pn V           1         eF     -
+# PU1  Private Use 1             \E Q                -         -      -
+# PU2  Private Use 2             \E R                -         -      -
+# QUAD Typographic Quadding      \E [ Ps SPC H       0         FE     -
+# REP  Repeat Char or Control    \E [ Pn b           1         -      rep
+# RI   Reverse Index             \E M                -         FE     -
+# RIS  Reset to Initial State    \E c                -         Fs     -
+# RM   Reset Mode                \E [ Ps l           none      -      -
+# SD   Scroll Down               \E [ Pn T           1         eF     rin
+# SEM  Select Edit Extent Mode   \E [ Ps Q           0         -      -
+# SGR  Select Graphic Rendition  \E [ Ps m           0         FE     sgr (7)
+# SL   Scroll Left               \E [ Pn SPC @       1         eF     -
+# SM   Select Mode               \E [ Ps h           none      -      -
+# SPA  Start of Protected Area   \E V                -         -      -
+# SPI  Spacing Increment         \E [ Pn ; Pn SPC G  none      FE     -
+# SR   Scroll Right              \E [ Pn SPC A       1         eF     -
+# SS2  Single Shift 2 (G2 set)   \E N                -         Intro  -
+# SS3  Single Shift 3 (G3 set)   \E O                -         Intro  -
+# SSA  Start of Selected Area    \E F                -         -      -
+# ST   String Terminator         \E \                -         Delim  -
+# STS  Set Transmit State        \E S                -         -      -
+# SU   Scroll Up                 \E [ Pn S           1         eF     indn
+# TBC  Tab Clear                 \E [ Ps g           0         FE     tbc
+# TSS  Thin Space Specification  \E [ Pn SC E        none      FE     -
+# VPA  Vert Position Absolute    \E [ Pn d           1         FE     vpa
+# VPR  Vert Position Relative    \E [ Pn e           1         FE     (8)
+# VTS  Vertical Tabulation Set   \E J                -         FE     -
+# 
+# ---------------------------------------------------------------------------
+#
+# Notes:
+#
+# (1) There seems to be some confusion abroad between CHA and HPA.  Most
+# `ANSI' terminals accept the CHA sequence, not the HPA. but terminfo calls
+# the capability (hpa).
+#
+# (2) CHT corresponds to terminfo (tab).  Usually it has the value ^I.
+# Occasionally (as on, for example, certain HP terminals) this has the HTJ
+# value.
+#
+# (3) terminfo (nel) is usually \r\n rather than ANSI \EE.
+#
+# (4) CUP and HVP are identical in effect.  Some ANSI.SYS versions accept
+# HVP, but always allow CUP as an alternate.
+#
+# (5) See the VT100 discussion for the meaning of the ED parameter.
+# 
+# (6) Some ANSI.SYS versions accept HPR, but more commonly `ANSI' terminals
+# use CUF for this function and ignore HPR
+#
+# (7) In SGR, the ANSI.SYS values for attributes are now nearly universal.
+#
+# (8) Some ANSI.SYS versions accept VPR, but more commonly `ANSI' terminals
+# use CUD for this function and ignore VPR.
+#
+# ---------------------------------------------------------------------------
+# 
+# Abbreviations:
+#
+# Intro  an Introducer of some kind of defined sequence; the normal 7-bit
+#        X3.64 Control Sequence Introducer is the two characters "Escape ["
+# 
+# Delim  a Delimiter
+# 
+# x/y    identifies a character by position in the ASCII table (column/row)
+# 
+# eF     editor function (see explanation)
+# 
+# FE     format effector (see explanation)
+# 
+# F      is a Final character in
+#             an Escape sequence (F from 3/0 to 7/14 in the ASCII table)
+#             a control sequence (F from 4/0 to 7/14)
+# 
+# Gs     is a graphic character appearing in strings (Gs ranges from
+#        2/0 to 7/14) in the ASCII table
+# 
+# Ce     is a control represented as a single bit combination in the C1 set
+#        of controls in an 8-bit character set
+# 
+# C0     the familiar set of 7-bit ASCII control characters
+# 
+# C1     roughly, the set of control characters available only in 8-bit systems.
+#        This is too complicated to explain fully here, so read Jim Fleming's
+#        article in the February 1983 BYTE, especially pages 214 through 224.
+# 
+# Fe     is a Final character of a 2-character Escape sequence that has an
+#        equivalent representation in an 8-bit environment as a Ce-type
+#        (Fe ranges from 4/0 to 5/15)
+# 
+# Fs     is a Final character of a 2-character Escape sequence that is
+#        standardized internationally with identical representation in 7-bit
+#        and 8-bit environments and is independent of the currently
+#        designated C0 and C1 control sets (Fs ranges from 6/0 to 7/14)
+# 
+# I      is an Intermediate character from 2/0 to 2/15 (inclusive) in the
+#        ASCII table
+# 
+# P      is a parameter character from 3/0 to 3/15 (inclusive) in the ASCII
+#        table
+# 
+# Pn     is a numeric parameter in a control sequence, a string of zero or
+#        more characters ranging from 3/0 to 3/9 in the ASCII table
+# 
+# Ps     is a variable number of selective parameters in a control sequence
+#        with each selective parameter separated from the other by the code
+#        3/11 (which usually represents a semicolon); Ps ranges from
+#        3/0 to 3/9 and includes 3/11
+# 
+# Format Effectors versus Editor Functions
+# 
+# A format effector specifies how following output is to be displayed.
+# An editor function allows you to modify the display.  Informally
+# format effectors may be destructive; format effectors should not be.
+# 
+# For instance, a format effector that moves the "active position" (the 
+# cursor or equivalent) one space to the left would be useful when you want to
+# create an overstrike, a compound character made of two standard characters
+# overlaid. Control-H, the Backspace character, is actually supposed to be a
+# format effector, so you can do this. But many systems use it in a
+# nonstandard fashion, as an editor function, deleting the character to the
+# left of the cursor and moving the cursor left. When Control-H is assumed to
+# be an editor function, you cannot predict whether its use will create an
+# overstrike unless you also know whether the output device is in an "insert
+# mode" or an "overwrite mode". When Control-H is used as a format effector,
+# its effect can always be predicted. The familiar characters carriage
+# return, linefeed, formfeed, etc., are defined as format effectors.
+#
+# The ANSI Standard
+# 
+# The complete document describing the standard,  "ANSI X3.64-1979:
+# Additional Controls for Use with the American National Standard
+# Code for Information Interchange," can be ordered for $13.50 (plus
+# $4 postage) from
+# 
+#      Standards Sales Department
+#      American National Standards Institute
+#      1430 Broadway
+#      New York, NY 10018
+#      212/354-3300
+# 
+# It's best to read the full standard before using it. It also helps
+# to have copies of the related standards "X3.4-1977: American
+# National Standard Code for Information Interchange" (the ASCII
+# standard) and "X3.41.1974: Code-Extension Techniques for Use with
+# the 7-Bit Coded Character Set of American National Standard for
+# Information Interchange."
+# 
+# NOTES ON THE DEC VT100 IMPLEMENTATION
+# 
+# Control sequences implemented in the VT100 are as follows:
+# 
+#      CPR, CUB, CUD, CUF, CUP, CUU, DA, DSR, ED, EL, HTS, HVP, IND,
+#      LNM, NEL, RI, RIS, RM, SGR, SM, TBC
+# 
+# plus several private DEC commands.
+# 
+# Erasing parts of the display (EL and ED) in the VT100 is performed thus:
+# 
+#      Erase from cursor to end of line           Esc [ 0 K    or Esc [ K
+#      Erase from beginning of line to cursor     Esc [ 1 K
+#      Erase line containing cursor               Esc [ 2 K
+#      Erase from cursor to end of screen         Esc [ 0 J    or Esc [ J
+#      Erase from beginning of screen to cursor   Esc [ 1 J
+#      Erase entire screen                        Esc [ 2 J
+# 
+# The VT100 responds to receiving the DA (Device Attributes) control
+# 
+#      Esc [ c    (or Esc [ 0 c)
+# 
+# by transmitting the sequence
+# 
+#      Esc [ ? l ; Ps c
+# 
+# where Ps is a character that describes installed options.
+# 
+# The VT100's cursor location can be read with the DSR (Device Status
+# Report) control
+# 
+#      Esc [ 6 n
+# 
+# The VT100 reports by transmitting the CPR sequence
+# 
+#      Esc [ Pl ; Pc R
+# 
+# where Pl is the line number and Pc is the column number (in decimal).
+# 
+# The specification for the DEC VT100 is document EK-VT100-UG-003.
+# 
+# NOTES ON `PC-TERM' COMPATIBILITY
+#
+# The MS-DOS ANSI.SYS driver has set the de-facto standard for attribute
+# and color values in the SGR string.  These are as follows:
+#
+# 0    all attributes off
+# 1    foreground bright
+# 4    underscore on
+# 5    blink on/background bright (not reliable with brown)
+# 7    reverse-video
+# 8    set blank (non-display)
+# 10   set primary font
+# 11   set first alternate font (on PCs, display ROM characters 1-31)
+# 12   set second alternate font (on PCs, display IBM high-half chars)
+#
+#                      Color attribute sets
+# 3n   set foreground color       / 0=black, 1=red,     2=green, 3=brown,
+# 4n   set background color       \ 4=blue,  5=magenta, 6=cyan,  7=white
+# Bright black becomes gray.  Bright brown becomes yellow,
+#      
+# * Many VGA cards (such as the Paradise and compatibles) do the wrong thing
+#   when you try to set a "bright brown" (yellow) background with attribute
+#   5 (you get a blinking yellow foreground instead).  A few displays
+#   (including the System V console) support an attribute 6 that undoes this
+#   braindamage.
+#
+# * Some older versions of ANSI.SYS have a bug that causes thems to require
+#   ESC [ Pn k as EL rather than the ANSI ESC [ Pn K.
+
+######## NONSTANDARD CAPABILITY TRANSLATIONS USED IN THIS FILE
+#
+# The historical termcap file entries were written primarily in 4.4BSD termcap.
+# The 4.4BSD termcap set was substantially larger than the original 4.1BSD set,
+# with the extension names chosen for compatibility with the termcap names
+# assigned in System V terminfo.  There are some variant extension sets out
+# there.  We try to describe them here.
+#
+# XENIX extensions:
+#
+# The XENIX extensions include a set of function-key capabilities as follows:
+#
+#       code   XENIX variable name     terminfo name   name clashes?
+#      ----    -------------------     -------------   -----------------------
+#      CL      key_char_left
+#      CR      key_char_right
+#      CW      key_change_window                       create_window
+#      EN      key_end                 kend
+#      HM      key_home                khome
+#      HP      ??
+#      LD      key_delete_line         kdl1
+#      LF      key_linefeed                            label_off
+#      NU      key_next_unlocked_cell
+#      PD      key_page_down           knp
+#      PL      ??
+#      PN      start_print             mc5
+#      PR      ??
+#      PS      stop_print              mc4
+#      PU      key_page_up             kpp             pulse
+#      RC      key_recalc                              remove_clock
+#      RF      key_toggle_ref                          req_for_input
+#      RT      key_return              kent
+#      UP      key_up_arrow            kcuu1           parm_up_cursor
+#      WL      key_word_left
+#      WR      key_word_right
+#
+# The XENIX extensions also include the following character-set and highlight
+# capabilities:
+#
+#      XENIX   terminfo        function
+#      -----   --------        ------------------------------
+#      GS      smacs           start alternate character set
+#      GE      rmacs           end alternate character set
+#      GG                      :as:/:ae: glitch (analogous to :sg:/:ug:)
+#      bo      blink           begin blink (not used in /etc/termcap)
+#      be                      end blink (not used in /etc/termcap)
+#      bb                      blink glitch  (not used in /etc/termcap)
+#      it      dim             begin dim (not used in /etc/termcap)
+#      ie                      end dim (not used in /etc/termcap)
+#      ig                      dim glitch  (not used in /etc/termcap)
+#
+# XENIX also supposedly uses the following forms-drawing capabilities:
+#
+#      single  double type
+#      ------  ------  -------------
+#      gv      GV      vertical line (|)
+#      gh      GH      horizontal line (-)
+#      g1      G1      top right corner
+#      g4      G4      bottom right corner (_|)
+#      g2      G2      top left corner
+#      g3      G3      bottom left corner (|_)
+#      gd      GD      down-tick character (T)
+#      gl      GL      left-tick character (-|)
+#      gr      GR      right-tick character (|-)
+#      gc      GC      middle intersection (-|-)
+#      gu      GU      up-tick character (_|_)
+#
+# However, there is some confusion about case.  The scoansi entry uses
+# mixed-case versions of these, and the historical ibmpcx, lisa, trs16, and fos
+# entries have only the uppercase versions.  Accordingly, the ncurses tools
+# don't try to translate these.
+#
+# AT&T Extensions:
+#
+# The old AT&T 5410, 5420, 5425, pc6300plus, 610, and s4 entries used a set of
+# nonstandard capabilities.  Its signature is the KM capability, used to name
+# some sort of keymap file.  EE, BO, CI, CV, XS, DS, FL and FE are in this
+# set.  Comments in the original, and a little cross-checking with other AT&T
+# documentation, seem to establish that BO=:mr: (start reverse video), DS=:mh:
+# (start dim), XS=:mk: (secure/invisible mode), EE=:me: (end highlights),
+# FL=:LO: (enable soft labels), FE=:LF: (disable soft labels), CI=:vi: (make
+# cursor invisible), and CV=:ve: (make cursor normal).
+#
+# TC Extensions:
+#
+# There is a set of extended termcaps associated with something
+# called the "Terminal Control" or TC package created by MainStream Systems,
+# Winfield Kansas.  This one also uses GS/GE for as/ae, and also uses
+# CF for civis and CO for cvvis.  Finally, they define a boolean :ct:
+# that flags color terminals.
+
+######## CHANGE HISTORY
+#
+# 9.1.0 (Wed Feb  1 04:50:32 EST 1995):
+#      * First terminfo master translated from 8.3.
+# 9.2.0 (Wed Feb  1 12:21:45 EST 1995):
+#      * Replaced Wyse entries with updated entries supplied by vendor.
+# 9.3.0 (Mon Feb  6 19:14:40 EST 1995):
+#      * Added contact & status info from G. Clark Brown <clark@sssi.com>.
+# 9.3.1 (Tue Feb  7 12:00:24 EST 1995):
+#      * Better XENIX keycap translation.  Describe TC termcaps.
+#      * Contact and history info supplied by Qume.
+# 9.3.2 (Sat Feb 11 23:40:02 EST 1995):
+#      * Raided the Shufort FTP site for recent termcaps/terminfos.
+#      * Added information on X3.64 and VT100 standard escape sequences.
+# 9.3.3 (Mon Feb 13 12:26:15 EST 1995):
+#      * Added a correct X11R6 xterm entry.
+#      * Fixed terminfo translations of padding.
+# 9.3.4 (Wed Feb 22 19:27:34 EST 1995):
+#      * Added correct acsc/smacs/rmacs strings for vt100 and xterm.
+#      * Added u6/u7/u8/u9 capabilities.
+#      * Added PCVT entry.
+# 9.3.5 (Thu Feb 23 09:37:12 EST 1995):
+#      * Emacs uses :so:, not :mr:, for its mode line.  Fix linux entry
+#        to use reverse-video standout so Emacs will look right.
+#      * Added el1 capability to ansi.
+#      * Added smacs/rmacs to ansi.sys.
+# 9.4.0 (Sat Feb 25 16:43:25 EST 1995):
+#      * New mt70 entry.
+#      * Added COPYRIGHTS AND OTHER DELUSIONS.
+#      * Added AT&T 23xx & 500/513, vt220 and vt420, opus3n1+, netronics
+#        smartvid & smarterm, ampex 175 & 219 & 232,
+#        env230, falco ts100, fluke, intertube, superbrain, ncr7901, vic20,
+#        ozzie, trs200, tr600, Tandy & Texas Instruments VDTs, intext2,
+#        screwpoint, fviewpoint, Contel Business Systems, Datamedia Colorscan,
+#        adm36, mime314, ergo4000, ca22851.  Replaced att7300, esprit, dd5500.
+#      * Replaced the Perkin-Elmer entries with vendor's official ones.
+#      * Restored the old minimal-ansi entry, luna needs it.
+#      * Fixed some incorrect ip and proportional-padding translations.
+# 9.4.1 (Mon Feb 27 14:18:33 EST 1995):
+#      * Fix linux & AT386 sgr strings to do A_ALTCHARSET turnoff correctly.
+#      * Make the xterm entry 65 lines again; create xterm25 and xterm24
+#        to force a particular height.
+#      * Added beehive4 and reorganized other Harris entries.
+# 9.4.2 (Thu Mar  9 01:45:44 EST 1995):
+#      * Merged in DEC's official entries for its terminals.  The only old
+#        entry I kept was Doug Gwyn's alternate vt100 (as vt100-avo).
+#      * Replaced the translated BBN Bitgraph entries with purpose-built
+#        ones from AT&T's SVr3.
+#      * Replaced the AT&T entries with AT&T's official terminfos.
+#      * Added teleray 16, vc415, cops10. 
+#      * Merged in many individual capabilities from SCO terminfo files.
+# 9.4.3 (Mon Mar 13 02:37:53 EST 1995):
+#      * Typo fixes.
+#      * Change linux entry so A_PROTECT enables IBM-PC ROM characters.
+# 9.4.4 (Mon Mar 27 12:32:35 EST 1995):
+#      * Added tty35, Ann Arbor Guru series. vi300 and 550, cg7900, tvi803,
+#        pt210, ibm3164, IBM System 1, ctrm, Tymshare scanset, dt200, adm21,
+#        simterm, citoh and variants.
+#      * Replaced sol entry with sol1 and sol2.
+#      * Replaced Qume QVT and Freedom-series entries with purpose-built
+#        terminfo entries.
+#      * Enhanced vt220, tvi910, tvi924, hpterm, hp2645, adm42, tek
+#        and dg200 entries using caps from from SCO.
+#      * Added the usual set of function-key mappings to ANSI entry.
+#      * Corrected xterm's function-key capabilities.
+# 9.4.5 (Tue Mar 28 14:27:49 EST 1995):
+#      * Fix in xterm entry, cub and cud are not reliable under X11R6.
+# 9.4.6 (Thu Mar 30 14:52:15 EST 1995):
+#      * Fix in xterm entry, get the arrow keys right.
+#      * Change some \0 escapes to \200.
+# 9.4.7 (Tue Apr  4 11:27:11 EDT 1995)
+#      * Added apple (Videx card), adm1a, oadm31.
+#      * Fixed malformed ampex csr.
+#      * Fixed act4, cyb110; they had old-style prefix padding left in. 
+#      * Changed mandatory to advisory padding in many entries.
+#      * Replaced HP entries up to hpsub with purpose-built ones.
+#      * Blank rmir/smir/rmdc/smdc capabilities removed.
+#      * Small fixes merged in from SCO entries for lpr, fos, tvi910+, tvi924.
+# 9.4.8 (Fri Apr  7 09:36:34 EDT 199):
+#      * Replaced the Ann Arbor entries with SCO's, the init strings are
+#        more efficient (but the entries otherwise identical).
+#      * Added dg211 from Shuford archive.
+#      * Added synertek, apple-soroc, ibmpc, pc-venix, pc-coherent, xtalk,
+#        adm42-nl, pc52, gs6300, xerox820, uts30.
+#      * Pull SCO's padding into vi200 entry.
+#      * Improved capabilities for tvi4107 and other Televideo and Viewpoint
+#        entries merged in from SCO's descriptions.
+#      * Fixed old-style prefix padding on zen50, h1500.
+#      * Moved old superbee entry to superbee-xsb, pulled in new superbee
+#        entry from SCO's description.
+#      * Reorganized the special entries.
+#      * Added lm#0 to cbunix and virtual entries.
+#
+# 9.5.0 (Mon Apr 10 11:30:00 EDT 1995):
+#      * Restored cdc456tst.
+#      * Fixed sb1 entry, SCO erroneously left out the xsb glitch.
+#      * Added megatek, beacon, microkit.
+#      * Freeze for ncurses-1.9 release.
+#
+# 9.5.1 (Fri Apr 21 12:46:42 EDT 1995):
+#      * Added historical data for TAB.
+#      * Comment fixes from David MacKenzie.
+#      * Added the new BSDI pc3 entry.
+#
+# 9.5.2 (Tue Apr 25 17:27:52 EDT 1995)
+#      * A change in the tic -C logic now ensures that all entries in 
+#        the termcap translation will fit in < 1024 bytes.
+#      * Added `bobcat' and `gator' HP consoles and the Nu machine entries
+#        from GNU termcap file.  This merges in all their local information.
+#
+# 9.5.3 (Tue Apr 25 22:28:13 EDT 1995)
+#      * Changed tic -C logic to dump all capabilities used by GNU termcap.
+#      * Added warnings about entries with long translations (restoring
+#        all the GNU termcaps pushes a few over the edge).
+#
+# 9.5.4 (Wed Apr 26 15:35:09 EDT 1995)
+#      * Yet another tic change, and a couple of entry tweaks, to reduce the
+#        number of long (> 1024) termcap translations back to 0.
+#
+# 9.6.0 (Mon May  1 10:35:54 EDT 1995)
+#      * Added kf13-kf20 to Linux entry.
+#      * Regularize Prime terminal names.
+#      * Historical data on Synertek.
+#      * Freeze for ncurses-1.9.1.
+#
+# 9.6.1 (Sat May  6 02:00:52 EDT 1995):
+#      * Added true xterm-color entry, renamed djm's pseudo-color entry.
+#      * Eliminate whitespace in short name fields, this tanks some scripts.
+#      * Name field changes to shorten some long entries.
+#      * Termcap translation now automatically generates empty rmir/smir
+#        when ich1/ich is present (copes with an ancient vi bug).
+#      * Added `screen' entries from FSF's screen-3.6.2.
+#      * Added linux-nic and xterm-nic entries.
+#
+# 9.6.2 (Sat May  6 17:00:55 EDT 1995):
+#      * Change linux entry to use smacs=\E[11m and have an explicit acsc,
+#        eliminating some special-case code in ncurses.
+#
+# 9.7.0 (Tue May  9 18:03:12 EDT 1995):
+#      * Added vt320-k3, rsvidtx from the Emacs termcap.dat file.  I think
+#        that captures everything unique from it.
+#      * Added reorder script generator.
+#      * Freeze for ncurses 1.9.2 release.
+#
+# 9.7.1 (Thu Jun 29 09:35:22 EDT 1995):
+#      * Added Sean Farley's kspd, flash, rs1 capabilities for linux.
+#      * Added Olaf Siebert's corrections for adm12.
+#      * ansi-pc-color now includes the colors and pairs caps, so that
+#        entries which use it will inherit them automatically.
+#      * The linux entry can now recognize the center (keypad 5) key.
+#      * Removed some junk that found its way into Linux acsc.
+#
+# 9.8.0 (Fri Jul  7 04:46:57 EDT 1995):
+#      * Add 50% cut mark as a desperate hack to reduce tic's core usage.
+#      * xterm doesn't try to use application keypad mode any more.
+#      * Freeze for ncurses-1.9.3 release.
+#
+# 9.8.1 (Thu Jul 19 17:02:12 EDT 1995):
+#      * Added corrected sun entry from vendor.
+#      * Added csr capability to linux entry.
+#      * Peter Wemm says the at386 hpa should be \E[%i%p1%dG, not \E[%p1%dG.
+#      * Added vt102-nsgr to cope with stupid IBM PC `VT100' emulators.
+#      * Some commented-out caps in long entries come back in, my code 
+#        for computing string-table lengths had a bug in it.
+#      * pcansi series modified to fit comm-program reality better.
+#
+######## REORDER
+#
+# Older termcap distributions featured a kluge called `reorder' intended to
+# time-optimize access to selected terminals by moving them to the front of
+# the file.  This is obsolete under terminfo, but for completeness's sake
+# we give a reorder script generator here (strip off the leading #s to use).
+#
+#: mkreorder --  generate script to optimize access to given terminal types
+#:
+#: entries named on command line will be sorted to the front in reverse order
+#echo "ed -- termcap <<EOF"
+#for x in $*
+#do
+#      echo "/^$x[|:]/;.,/^[a-z#]/-1m0"
+#done
+#echo "0a"
+#echo "."
+#echo "w termcap.sorted"
+#echo "q"
+#echo "EOF"
+#:end of script
+#
+# Invoke this script like this:
+#
+#      mkreorder h19 wy60 vt100 >reorder
+#
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# fill-prefix:"\t"
+# fill-column:75
+# End:
+######## SHANTIH!  SHANTIH!  SHANTIH!
diff --git a/lib/tilde/ChangeLog b/lib/tilde/ChangeLog
new file mode 100644 (file)
index 0000000..986db67
--- /dev/null
@@ -0,0 +1,6 @@
+Mon Jul 13 12:01:51 1992  Brian Fox  (bfox@cubit)
+
+       * tilde.c: (tilde_expand_word) If there is no variable $HOME, then
+       look up the user's home directory in the password database.
+
+
index 5112e23..cbb790a 100644 (file)
--- a/locale.c
+++ b/locale.c
@@ -65,6 +65,8 @@ set_default_locale ()
   if (default_locale)
     default_locale = savestring (default_locale);
 #endif /* HAVE_SETLOCALE */
+  bindtextdomain (PACKAGE, LOCALEDIR);
+  textdomain (PACKAGE);
 }
 
 /* Set default values for LC_CTYPE, LC_COLLATE, LC_MESSAGES and LC_NUMERIC
@@ -112,7 +114,10 @@ set_default_locale_vars ()
     {
       FREE (default_domain);
       default_domain = savestring (val);
+#if 0
+      /* Don't want to override the shell's textdomain as the default */
       textdomain (default_domain);
+#endif
     }
 
   val = get_string_value ("TEXTDOMAINDIR");
@@ -120,7 +125,8 @@ set_default_locale_vars ()
     {
       FREE (default_dir);
       default_dir = savestring (val);
-      bindtextdomain (default_domain, default_dir);
+      if (default_domain && *default_domain)
+       bindtextdomain (default_domain, default_dir);
     }
 }
 
@@ -136,14 +142,18 @@ set_locale_var (var, value)
     {
       FREE (default_domain);
       default_domain = value ? savestring (value) : (char *)NULL;
+#if 0
+      /* Don't want to override the shell's textdomain as the default */
       textdomain (default_domain);
+#endif
       return (1);
     }
   else if (var[0] == 'T')                      /* TEXTDOMAINDIR */
     {
       FREE (default_dir);
       default_dir = value ? savestring (value) : (char *)NULL;
-      bindtextdomain (default_domain, default_dir);
+      if (default_domain && *default_domain)
+       bindtextdomain (default_domain, default_dir);
       return (1);
     }
 
@@ -287,10 +297,8 @@ localetrans (string, len, lenp)
      int len, *lenp;
 {
   char *locale, *t;
-#if defined (HAVE_GETTEXT)
   char *translated;
   int tlen;
-#endif
 
   /* Don't try to translate null strings. */
   if (string == 0 || *string == 0)
@@ -305,10 +313,8 @@ localetrans (string, len, lenp)
   /* If we don't have setlocale() or the current locale is `C' or `POSIX',
      just return the string.  If we don't have gettext(), there's no use
      doing anything else. */
-#if defined (HAVE_GETTEXT)
   if (locale == 0 || locale[0] == '\0' ||
       (locale[0] == 'C' && locale[1] == '\0') || STREQ (locale, "POSIX"))
-#endif
     {
       t = (char *)xmalloc (len + 1);
       strcpy (t, string);
@@ -317,9 +323,12 @@ localetrans (string, len, lenp)
       return (t);
     }
 
-#if defined (HAVE_GETTEXT)
   /* Now try to translate it. */
-  translated = gettext (string);
+  if (default_domain && *default_domain)
+    translated = dgettext (default_domain, string);
+  else
+    translated = string;
+
   if (translated == string)    /* gettext returns its argument if untranslatable */
     {
       t = (char *)xmalloc (len + 1);
@@ -336,7 +345,6 @@ localetrans (string, len, lenp)
        *lenp = tlen;
     }
   return (t);
-#endif /* HAVE_GETTEXT */
 }
 
 /* Change a bash string into a string suitable for inclusion in a `po' file.
@@ -406,11 +414,12 @@ localeexpand (string, start, end, lineno, lenp)
   temp[tlen] = '\0';
 
   /* If we're just dumping translatable strings, don't do anything with the
-     string itself, but if we're dumping in `po' file format, convert it into a form more palatable to gettext(3)
-     and friends by quoting `"' and `\' with backslashes and converting <NL>
-     into `\n"<NL>"'.  If we find a newline in TEMP, we first output a
-     `msgid ""' line and then the translated string; otherwise we output the
-     `msgid' and translated string all on one line. */
+     string itself, but if we're dumping in `po' file format, convert it into
+     a form more palatable to gettext(3) and friends by quoting `"' and `\'
+     with backslashes and converting <NL> into `\n"<NL>"'.  If we find a
+     newline in TEMP, we first output a `msgid ""' line and then the
+     translated string; otherwise we output the `msgid' and translated
+     string all on one line. */
   if (dump_translatable_strings)
     {
       if (dump_po_strings)
index df15b1e..f23a7f8 100644 (file)
@@ -31,6 +31,7 @@ Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
 #endif
 #include "posixtime.h"
 #include "bashansi.h"
+#include "bashintl.h"
 
 #include "shell.h"
 #include "execute_cmd.h"
@@ -378,7 +379,7 @@ check_mail ()
          int file_is_bigger;
 
          use_user_notification = mailfiles[i]->msg != (char *)NULL;
-         message = mailfiles[i]->msg ? mailfiles[i]->msg : "You have mail in $_";
+         message = mailfiles[i]->msg ? mailfiles[i]->msg : _("You have mail in $_");
 
          bind_variable ("_", current_mail_file);
 
@@ -403,7 +404,7 @@ check_mail ()
          /* If the mod time is later than the access time and the file
             has grown, note the fact that this is *new* mail. */
          if (use_user_notification == 0 && (atime < mtime) && file_is_bigger)
-           message = "You have new mail in $_";
+           message = _("You have new mail in $_");
 #undef atime
 #undef mtime
 
@@ -419,7 +420,7 @@ check_mail ()
       if (mail_warning && file_access_date_changed (i))
        {
          update_mail_file (i);
-         printf ("The mail in %s has been read\n", current_mail_file);
+         printf (_("The mail in %s has been read\n"), current_mail_file);
        }
     }
 
index 988e218..479d9c3 100644 (file)
@@ -32,6 +32,8 @@ Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
 #  include <unistd.h>
 #endif
 
+#include "bashintl.h"
+
 #include "syntax.h"
 #include "command.h"
 #include "general.h"
@@ -313,10 +315,10 @@ make_arith_for_command (exprs, action, lineno)
   if (nsemi != 3)
     {
       if (nsemi < 3)
-       parser_error (lineno, "syntax error: arithmetic expression required");
+       parser_error (lineno, _("syntax error: arithmetic expression required"));
       else
-       parser_error (lineno, "syntax error: `;' unexpected");
-      parser_error (lineno, "syntax error: `((%s))'", exprs->word->word);
+       parser_error (lineno, _("syntax error: `;' unexpected"));
+      parser_error (lineno, _("syntax error: `((%s))'"), exprs->word->word);
       last_command_exit_value = 2;
       return ((COMMAND *)NULL);
     }
@@ -525,7 +527,7 @@ make_simple_command (element, command)
 
   if (element.word)
     command->value.Simple->words = make_word_list (element.word, command->value.Simple->words);
-  else
+  else if (element.redirect)
     {
       REDIRECT *r = element.redirect;
       /* Due to the way <> is implemented, there may be more than a single
@@ -555,7 +557,7 @@ make_here_document (temp)
   if (temp->instruction != r_deblank_reading_until &&
       temp->instruction != r_reading_until)
     {
-      internal_error ("make_here_document: bad instruction type %d", temp->instruction);
+      internal_error (_("make_here_document: bad instruction type %d"), temp->instruction);
       return;
     }
 
@@ -725,7 +727,7 @@ make_redirection (source, instruction, dest_and_filename)
       break;
 
     default:
-      programming_error ("make_redirection: redirection instruction `%d' out of range", instruction);
+      programming_error (_("make_redirection: redirection instruction `%d' out of range"), instruction);
       abort ();
       break;
     }
@@ -756,13 +758,12 @@ make_function_def (name, command, lineno, lstart)
   temp->source_file = 0;
 #if defined (ARRAY_VARS)
   GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
-  t = 0;
   if (bash_source_a && array_num_elements (bash_source_a) > 0)
-    t = array_reference (bash_source_a, 0);
-  temp->source_file = t ? savestring (t) : savestring ("");
+    temp->source_file = array_reference (bash_source_a, 0);
 #endif
   bind_function_def (name->word, temp);
 
+  temp->source_file = 0;
   return (make_command (cm_function_def, (SIMPLE_COM *)temp));
 }
 
index 6426bbb..df543ac 100644 (file)
--- a/nojobs.c
+++ b/nojobs.c
@@ -52,6 +52,8 @@
 #  endif /* HAVE_SYS_PTEM_H && TIOCGWINSZ && SIGWINCH */
 #endif /* !STRUCT_WINSIZE_IN_SYS_IOCTL */
 
+#include "bashintl.h"
+
 #include "shell.h"
 #include "jobs.h"
 
@@ -63,9 +65,9 @@
 #  define killpg(pg, sig)              kill(-(pg),(sig))
 #endif /* USG || _POSIX_VERSION */
 
-#if !defined (HAVE_SIGINTERRUPT)
+#if !defined (HAVE_SIGINTERRUPT) && !defined (HAVE_POSIX_SIGNALS)
 #  define siginterrupt(sig, code)
-#endif /* !HAVE_SIGINTERRUPT */
+#endif /* !HAVE_SIGINTERRUPT && !HAVE_POSIX_SIGNALS */
 
 #if defined (HAVE_WAITPID)
 #  define WAITPID(pid, statusp, options) waitpid (pid, statusp, options)
@@ -155,6 +157,10 @@ static char *j_strsignal __P((int));
 static void reap_zombie_children __P((void));
 #endif
 
+#if !defined (HAVE_SIGINTERRUPT) && defined (HAVE_POSIX_SIGNALS)
+static int siginterrupt __P((int, int));
+#endif
+
 static void restore_sigint_handler __P((void));
 
 /* Allocate new, or grow existing PID_LIST. */
@@ -494,15 +500,33 @@ initialize_job_signals ()
 static void
 reap_zombie_children ()
 {
-#if defined (WNOHANG)
+#  if defined (WNOHANG)
   pid_t pid;
   WAIT status;
 
   while ((pid = waitpid (-1, (int *)&status, WNOHANG)) > 0)
     set_pid_status (pid, status);
-#endif
+#  endif /* WNOHANG */
+}
+#endif /* WAITPID */
+
+#if !defined (HAVE_SIGINTERRUPT) && defined (HAVE_POSIX_SIGNALS)
+static int
+siginterrupt (sig, flag)
+     int sig, flag;
+{
+  struct sigaction act;
+
+  sigaction (sig, (struct sigaction *)NULL, &act);
+
+  if (flag)
+    act.sa_flags &= ~SA_RESTART;
+  else
+    act.sa_flags |= SA_RESTART;
+
+  return (sigaction (sig, &act, (struct sigaction *)NULL));
 }
-#endif /* WAITPID && WNOHANG */
+#endif /* !HAVE_SIGINTERRUPT && HAVE_POSIX_SIGNALS */
 
 /* Fork, handling errors.  Returns the pid of the newly made child, or 0.
    COMMAND is just for remembering the name of the command; we don't do
@@ -621,7 +645,7 @@ wait_for_single_pid (pid)
 
   if (pstatus == PROC_BAD)
     {
-      internal_error ("wait: pid %ld is not a child of this shell", (long)pid);
+      internal_error (_("wait: pid %ld is not a child of this shell"), (long)pid);
       return (127);
     }
 
diff --git a/parse.y b/parse.y
index 958221a..7bd65ba 100644 (file)
--- a/parse.y
+++ b/parse.y
@@ -40,6 +40,8 @@
 
 #include "memalloc.h"
 
+#include "bashintl.h"
+
 #define NEED_STRFTIME_DECL     /* used in externs.h */
 
 #include "shell.h"
@@ -284,6 +286,13 @@ static int arith_for_lineno;
 static int word_lineno[MAX_CASE_NEST];
 static int word_top = -1;
 
+/* If non-zero, it is the token that we want read_token to return
+   regardless of what text is (or isn't) present to be read.  This
+   is reset by read_token.  If token_to_read == WORD or
+   ASSIGNMENT_WORD, yylval.word should be set to word_desc_to_read. */
+static int token_to_read;
+static WORD_DESC *word_desc_to_read;
+
 static REDIRECTEE redir;
 %}
 
@@ -329,6 +338,7 @@ static REDIRECTEE redir;
 %type <word_list> word_list pattern
 %type <pattern> pattern_list case_clause_sequence case_clause
 %type <number> timespec
+%type <number> list_terminator
 
 %start inputunit
 
@@ -889,8 +899,11 @@ simple_list_terminator:    '\n'
        ;
 
 list_terminator:'\n'
+               { $$ = '\n'; }
        |       ';'
+               { $$ = ';'; }
        |       yacc_EOF
+               { $$ = yacc_EOF; }
        ;
 
 newline_list:
@@ -966,6 +979,24 @@ pipeline_command: pipeline
                          $3->flags |= $2|CMD_INVERT_RETURN;
                          $$ = $3;
                        }
+       |       timespec list_terminator
+                       {
+                         ELEMENT x;
+
+                         /* Boy, this is unclean.  `time' by itself can
+                            time a null command.  We cheat and push a
+                            newline back if the list_terminator was a newline
+                            to avoid the double-newline problem (one to
+                            terminate this, one to terminate the command) */
+                         x.word = 0;
+                         x.redirect = 0;
+                         $$ = make_simple_command (x, (COMMAND *)NULL);
+                         $$->flags |= $1;
+                         /* XXX - let's cheat and push a newline back */
+                         if ($2 == '\n')
+                           token_to_read = '\n';
+                       }
+                       
        ;
 
 pipeline:
@@ -996,6 +1027,7 @@ timespec:  TIME
 #define PST_ARITHFOR   0x0400          /* parsing an arithmetic for command */
 #define PST_ALEXPAND   0x0800          /* OK to expand aliases - unused */
 #define PST_CMDTOKEN   0x1000          /* command token OK - unused */
+#define PST_COMPASSIGN 0x2000          /* parsing x=(...) compound assignment */
 
 /* Initial size to allocate for tokens, and the
    amount to grow them by. */
@@ -1025,13 +1057,6 @@ static int token_before_that;
 /* The token read prior to token_before_that. */
 static int two_tokens_ago;
 
-/* If non-zero, it is the token that we want read_token to return
-   regardless of what text is (or isn't) present to be read.  This
-   is reset by read_token.  If token_to_read == WORD or
-   ASSIGNMENT_WORD, yylval.word should be set to word_desc_to_read. */
-static int token_to_read;
-static WORD_DESC *word_desc_to_read;
-
 /* The current parser state. */
 static int parser_state;
 
@@ -2698,7 +2723,7 @@ parse_matched_pair (qc, open, close, lenp, flags)
       if (ch == EOF)
        {
          free (ret);
-         parser_error (start_lineno, "unexpected EOF while looking for matching `%c'", close);
+         parser_error (start_lineno, _("unexpected EOF while looking for matching `%c'"), close);
          EOF_Reached = 1;      /* XXX */
          return (&matched_pair_error);
        }
@@ -2983,16 +3008,16 @@ cond_error ()
   char *etext;
 
   if (EOF_Reached && cond_token != COND_ERROR)         /* [[ */
-    parser_error (cond_lineno, "unexpected EOF while looking for `]]'");
+    parser_error (cond_lineno, _("unexpected EOF while looking for `]]'"));
   else if (cond_token != COND_ERROR)
     {
       if (etext = error_token_from_token (cond_token))
        {
-         parser_error (cond_lineno, "syntax error in conditional expression: unexpected token `%s'", etext);
+         parser_error (cond_lineno, _("syntax error in conditional expression: unexpected token `%s'"), etext);
          free (etext);
        }
       else
-       parser_error (cond_lineno, "syntax error in conditional expression");
+       parser_error (cond_lineno, _("syntax error in conditional expression"));
     }
 }
 
@@ -3070,11 +3095,11 @@ cond_term ()
            dispose_cond_node (term);           /* ( */
          if (etext = error_token_from_token (cond_token))
            {
-             parser_error (lineno, "unexpected token `%s', expected `)'", etext);
+             parser_error (lineno, _("unexpected token `%s', expected `)'"), etext);
              free (etext);
            }
          else
-           parser_error (lineno, "expected `)'");
+           parser_error (lineno, _("expected `)'"));
          COND_RETURN_ERROR ();
        }
       term = make_cond_node (COND_EXPR, (WORD_DESC *)NULL, term, (COND_COM *)NULL);
@@ -3102,11 +3127,11 @@ cond_term ()
          dispose_word (op);
          if (etext = error_token_from_token (tok))
            {
-             parser_error (line_number, "unexpected argument `%s' to conditional unary operator", etext);
+             parser_error (line_number, _("unexpected argument `%s' to conditional unary operator"), etext);
              free (etext);
            }
          else
-           parser_error (line_number, "unexpected argument to conditional unary operator");
+           parser_error (line_number, _("unexpected argument to conditional unary operator"));
          COND_RETURN_ERROR ();
        }
 
@@ -3143,11 +3168,11 @@ cond_term ()
        {
          if (etext = error_token_from_token (tok))
            {
-             parser_error (line_number, "unexpected token `%s', conditional binary operator expected", etext);
+             parser_error (line_number, _("unexpected token `%s', conditional binary operator expected"), etext);
              free (etext);
            }
          else
-           parser_error (line_number, "conditional binary operator expected");
+           parser_error (line_number, _("conditional binary operator expected"));
          dispose_cond_node (tleft);
          COND_RETURN_ERROR ();
        }
@@ -3163,11 +3188,11 @@ cond_term ()
        {
          if (etext = error_token_from_token (tok))
            {
-             parser_error (line_number, "unexpected argument `%s' to conditional binary operator", etext);
+             parser_error (line_number, _("unexpected argument `%s' to conditional binary operator"), etext);
              free (etext);
            }
          else
-           parser_error (line_number, "unexpected argument to conditional binary operator");
+           parser_error (line_number, _("unexpected argument to conditional binary operator"));
          dispose_cond_node (tleft);
          dispose_word (op);
          COND_RETURN_ERROR ();
@@ -3178,14 +3203,14 @@ cond_term ()
   else
     {
       if (tok < 256)
-       parser_error (line_number, "unexpected token `%c' in conditional command", tok);
+       parser_error (line_number, _("unexpected token `%c' in conditional command"), tok);
       else if (etext = error_token_from_token (tok))
        {
-         parser_error (line_number, "unexpected token `%s' in conditional command", etext);
+         parser_error (line_number, _("unexpected token `%s' in conditional command"), etext);
          free (etext);
        }
       else
-       parser_error (line_number, "unexpected token %d in conditional command", tok);
+       parser_error (line_number, _("unexpected token %d in conditional command"), tok);
       COND_RETURN_ERROR ();
     }
   return (term);
@@ -3216,7 +3241,7 @@ token_is_assignment (t, i)
 
   c = t[i]; c1 = t[i+1];
   t[i] = '='; t[i+1] = '\0';
-  r = assignment (t);
+  r = assignment (t, (parser_state & PST_COMPASSIGN) != 0);
   t[i] = c; t[i+1] = c1;
   return r;
 }
@@ -3609,11 +3634,11 @@ got_token:
   /* A word is an assignment if it appears at the beginning of a
      simple command, or after another assignment word.  This is
      context-dependent, so it cannot be handled in the grammar. */
-  if (assignment (token))
+  if (assignment (token, (parser_state & PST_COMPASSIGN) != 0))
     {
       the_word->flags |= W_ASSIGNMENT;
       /* Don't perform word splitting on assignment statements. */
-      if (assignment_acceptable (last_read_token))
+      if (assignment_acceptable (last_read_token) || (parser_state & PST_COMPASSIGN) != 0)
        the_word->flags |= W_NOSPLIT;
     }
 
@@ -4372,7 +4397,7 @@ report_syntax_error (message)
      parser's complaining about by looking at current_token. */
   if (current_token != 0 && EOF_Reached == 0 && (msg = error_token_from_token (current_token)))
     {
-      parser_error (line_number, "syntax error near unexpected token `%s'", msg);
+      parser_error (line_number, _("syntax error near unexpected token `%s'"), msg);
       free (msg);
 
       if (interactive == 0)
@@ -4390,7 +4415,7 @@ report_syntax_error (message)
       msg = error_token_from_text ();
       if (msg)
        {
-         parser_error (line_number, "syntax error near `%s'", msg);
+         parser_error (line_number, _("syntax error near `%s'"), msg);
          free (msg);
        }
 
@@ -4400,7 +4425,7 @@ report_syntax_error (message)
     }
   else
     {
-      msg = EOF_Reached ? "syntax error: unexpected end of file" : "syntax error";
+      msg = EOF_Reached ? _("syntax error: unexpected end of file") : _("syntax error");
       parser_error (line_number, "%s", msg);
       /* When the shell is interactive, this file uses EOF_Reached
         only for error reporting.  Other mechanisms are used to
@@ -4462,7 +4487,7 @@ handle_eof_input_unit ()
        {
          if (eof_encountered < eof_encountered_limit)
            {
-             fprintf (stderr, "Use \"%s\" to leave the shell.\n",
+             fprintf (stderr, _("Use \"%s\" to leave the shell.\n"),
                       login_shell ? "logout" : "exit");
              eof_encountered++;
              /* Reset the parsing state. */
@@ -4499,8 +4524,9 @@ static WORD_LIST parse_string_error;
 /* Take a string and run it through the shell parser, returning the
    resultant word list.  Used by compound array assignment. */
 WORD_LIST *
-parse_string_to_word_list (s, whom)
+parse_string_to_word_list (s, flags, whom)
      char *s;
+     int flags;
      const char *whom;
 {
   WORD_LIST *wl;
@@ -4532,6 +4558,10 @@ parse_string_to_word_list (s, whom)
 
   with_input_from_string (s, whom);
   wl = (WORD_LIST *)NULL;
+
+  if (flags & 1)
+    parser_state |= PST_COMPASSIGN;
+
   while ((tok = read_token (READ)) != yacc_EOF)
     {
       if (tok == '\n' && *bash_input.location.string == '\0')
@@ -4569,6 +4599,9 @@ parse_string_to_word_list (s, whom)
   current_command_line_count = orig_line_count;
   shell_input_line_terminator = orig_input_terminator;
 
+  if (flags & 1)
+    parser_state &= ~PST_COMPASSIGN;
+
   if (wl == &parse_string_error)
     {
       last_command_exit_value = EXECUTION_FAILURE;
@@ -4599,15 +4632,21 @@ parse_compound_assignment (retlenp)
   token_buffer_size = 0;
 
   wl = (WORD_LIST *)NULL;      /* ( */
+  parser_state |= PST_COMPASSIGN;
+
   while ((tok = read_token (READ)) != ')')
     {
       if (tok == '\n')                 /* Allow newlines in compound assignments */
-       continue;
+       {
+         if (SHOULD_PROMPT ())
+           prompt_again ();
+         continue;
+       }
       if (tok != WORD && tok != ASSIGNMENT_WORD)
        {
          current_token = tok;  /* for error reporting */
          if (tok == yacc_EOF)  /* ( */
-           parser_error (orig_line_number, "unexpected EOF while looking for matching `)'");
+           parser_error (orig_line_number, _("unexpected EOF while looking for matching `)'"));
          else
            yyerror ((char *)NULL);     /* does the right thing */
          if (wl)
@@ -4622,6 +4661,8 @@ parse_compound_assignment (retlenp)
   token = saved_token;
   token_buffer_size = orig_token_size;
 
+  parser_state &= ~PST_COMPASSIGN;
+
   if (wl == &parse_string_error)
     {
       last_command_exit_value = EXECUTION_FAILURE;
index 2c55d1f..577770b 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <stdio.h>
 #include "bashansi.h"
+#include "bashintl.h"
 
 #include "shell.h"
 #include "pcomplete.h"
@@ -687,7 +688,15 @@ pcomp_filename_completion_function (text, state)
       /* remove backslashes quoting special characters in filenames. */
       if (rl_filename_dequoting_function)
        {
+#if 0
          qc = (text[0] == '"' || text[0] == '\'') ? text[0] : 0;
+#else
+         /* Use rl_completion_quote_character because any single or
+            double quotes have been removed by the time TEXT makes it
+            here, and we don't want to remove backslashes inside
+            quoted strings. */
+         qc = rl_dispatching ? rl_completion_quote_character : 0;
+#endif
          dfn = (*rl_filename_dequoting_function) ((char *)text, qc);
        }
       else
@@ -984,7 +993,7 @@ gen_shell_function_matches (cs, text, line, ind, lwords, nw, cw)
   f = find_function (funcname);
   if (f == 0)
     {
-      internal_error ("completion: function `%s' not found", funcname);
+      internal_error (_("completion: function `%s' not found"), funcname);
       rl_ding ();
       rl_on_new_line ();
       return ((STRINGLIST *)NULL);
index bb4b38a..8db3295 100644 (file)
@@ -32,6 +32,8 @@
 #  include <unistd.h>
 #endif
 
+#include "bashintl.h"
+
 #include "shell.h"
 #include "pcomplete.h"
 
@@ -174,7 +176,7 @@ progcomp_insert (cmd, cs)
   register BUCKET_CONTENTS *item;
 
   if (cs == NULL)
-    programming_error ("progcomp_insert: %s: NULL COMPSPEC", cmd);
+    programming_error (_("progcomp_insert: %s: NULL COMPSPEC"), cmd);
 
   if (prog_completes == 0)
     progcomp_create ();
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644 (file)
index 0000000..3595cc0
--- /dev/null
@@ -0,0 +1,2 @@
+# Set of available languages.
+en@quot en@boldquot
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644 (file)
index 0000000..c28f1ce
--- /dev/null
@@ -0,0 +1,357 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2003 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file can be copied and used freely without restrictions.  It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+
+PACKAGE = @PACKAGE_NAME@
+VERSION = @PACKAGE_VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+topdir = @top_srcdir@
+BUILD_DIR = @BUILD_DIR@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+mkinstalldirs = $(SHELL) $(MKINSTALLDIRS)
+
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in $(DOMAIN).pot stamp-po \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-update
+
+.po.mo:
+       @echo "$(MSGFMT) -c -o $@ $<"; \
+       $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+       @lang=`echo $* | sed -e 's,.*/,,'`; \
+       test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+       echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \
+       cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+       sed -e '/^#/d' $< > t-$@
+       mv t-$@ $@
+
+
+all: all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+       test -z "$(CATALOGS)" || $(MAKE) $(CATALOGS)
+       @echo "touch stamp-po"
+       @echo timestamp > stamp-poT
+       @mv stamp-poT stamp-po
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+       $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+         --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \
+         --files-from=$(srcdir)/POTFILES.in \
+         --copyright-holder='$(COPYRIGHT_HOLDER)' \
+         --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)'
+       $(MAKE) $(MFLAGS) builtins.pot-update
+       test ! -f $(DOMAIN).po || { \
+         if test -f $(srcdir)/$(DOMAIN).pot; then \
+           sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+           sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+           if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+             rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+           else \
+             rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+             mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+           fi; \
+         else \
+           mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+         fi; \
+       }
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+       $(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(srcdir)/$(DOMAIN).pot
+       @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+       test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+       echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
+       cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+         for file in $(DISTFILES.common) Makevars.template; do \
+           $(INSTALL_DATA) $(srcdir)/$$file \
+                           $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+         for file in Makevars; do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+install-data-no: all
+install-data-yes: all
+       $(mkinstalldirs) $(DESTDIR)$(datadir)
+       @catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         dir=$(localedir)/$$lang/LC_MESSAGES; \
+         $(mkinstalldirs) $(DESTDIR)$$dir; \
+         if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+         $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+         echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+         for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+           if test -n "$$lc"; then \
+             if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+                for file in *; do \
+                  if test -f $$file; then \
+                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+                  fi; \
+                done); \
+               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+             else \
+               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+                 :; \
+               else \
+                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               fi; \
+             fi; \
+             rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+             ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+             ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+             cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+             echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+           fi; \
+         done; \
+       done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+       else \
+         : ; \
+       fi
+installdirs-data-no:
+installdirs-data-yes:
+       $(mkinstalldirs) $(DESTDIR)$(datadir)
+       @catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         dir=$(localedir)/$$lang/LC_MESSAGES; \
+         $(mkinstalldirs) $(DESTDIR)$$dir; \
+         for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+           if test -n "$$lc"; then \
+             if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+                for file in *; do \
+                  if test -f $$file; then \
+                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+                  fi; \
+                done); \
+               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+             else \
+               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+                 :; \
+               else \
+                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               fi; \
+             fi; \
+           fi; \
+         done; \
+       done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         for file in $(DISTFILES.common) Makevars.template; do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+uninstall-data-no:
+uninstall-data-yes:
+       catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+           rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+         done; \
+       done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+       rm -f remove-potcdate.sed
+       rm -f stamp-poT
+       rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+       rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+       rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+       rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+       $(MAKE) update-po
+       @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: $(DISTFILES)
+       dists="$(DISTFILES)"; \
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         dists="$$dists Makevars.template"; \
+       fi; \
+       if test -f $(srcdir)/ChangeLog; then \
+         dists="$$dists ChangeLog"; \
+       fi; \
+       for i in 0 1 2 3 4 5 6 7 8 9; do \
+         if test -f $(srcdir)/ChangeLog.$$i; then \
+           dists="$$dists ChangeLog.$$i"; \
+         fi; \
+       done; \
+       if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+       for file in $$dists; do \
+         if test -f $$file; then \
+           cp -p $$file $(distdir); \
+         else \
+           cp -p $(srcdir)/$$file $(distdir); \
+         fi; \
+       done
+
+update-po: Makefile
+       $(MAKE) $(DOMAIN).pot-update
+       test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+       $(MAKE) update-gmo
+
+# General rule for updating PO files.
+
+.nop.po-update:
+       @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+       if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
+       tmpdir=`pwd`; \
+       echo "$$lang:"; \
+       test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+       echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+       cd $(srcdir); \
+       if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \
+         if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+           rm -f $$tmpdir/$$lang.new.po; \
+         else \
+           if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+             :; \
+           else \
+             echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+             exit 1; \
+           fi; \
+         fi; \
+       else \
+         echo "msgmerge for $$lang.po failed!" 1>&2; \
+         rm -f $$tmpdir/$$lang.new.po; \
+       fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+       @:
+
+Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@ $(srcdir)/Rules-builtins
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+              $(SHELL) ./config.status
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/Makevars b/po/Makevars
new file mode 100644 (file)
index 0000000..84b2d95
--- /dev/null
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = $(BUILD_DIR)
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ -C
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = bug-bash@gnu.org
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/po/Makevars.template b/po/Makevars.template
new file mode 100644 (file)
index 0000000..32692ab
--- /dev/null
@@ -0,0 +1,41 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS =
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644 (file)
index 0000000..a59a096
--- /dev/null
@@ -0,0 +1,76 @@
+# List of source files containing translatable strings.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+
+arrayfunc.c
+bashhist.c
+bashline.c
+braces.c
+builtins/bind.def
+builtins/break.def
+builtins/caller.def
+builtins/cd.def
+builtins/common.c
+builtins/complete.def
+builtins/declare.def
+builtins/enable.def
+builtins/evalfile.c
+builtins/exec.def
+builtins/exit.def
+builtins/fc.def
+builtins/fg_bg.def
+builtins/getopt.c
+builtins/hash.def
+builtins/help.def
+builtins/history.def
+builtins/inlib.def
+builtins/jobs.def
+builtins/kill.def
+builtins/let.def
+builtins/mkbuiltins.c
+builtins/printf.def
+builtins/pushd.def
+builtins/read.def
+builtins/return.def
+builtins/set.def
+builtins/setattr.def
+builtins/shift.def
+builtins/shopt.def
+builtins/source.def
+builtins/suspend.def
+builtins/type.def
+builtins/ulimit.def
+builtins/umask.def
+error.c
+eval.c
+execute_cmd.c
+expr.c
+general.c
+input.c
+jobs.c
+lib/malloc/malloc.c
+lib/malloc/stats.c
+lib/malloc/table.c
+lib/malloc/watch.c
+lib/sh/fmtulong.c
+lib/sh/netopen.c
+mailcheck.c
+make_cmd.c
+nojobs.c
+parse.y
+pcomplete.c
+pcomplib.c
+print_cmd.c
+redir.c
+shell.c
+sig.c
+siglist.c
+subst.c
+test.c
+trap.c
+variables.c
+version.c
+xmalloc.c
+
+# Apparently gettext's defaults cannot handle files that exist outside of the
+# source directory, like in the build directory
+#../builtins/builtins.c
diff --git a/po/README b/po/README
new file mode 100644 (file)
index 0000000..979884c
--- /dev/null
+++ b/po/README
@@ -0,0 +1 @@
+This apparently requires GNU sed
diff --git a/po/Rules-builtins b/po/Rules-builtins
new file mode 100644 (file)
index 0000000..602154a
--- /dev/null
@@ -0,0 +1,19 @@
+#
+# Update the strings from the builtins' long docs.  Must be called when
+# bash.pot exists, in the middle of the bash.pot-update recipe
+#
+builtins.pot-update:   $(top_builddir)/builtins/builtins.c
+       $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_builddir)/builtins \
+               $(XGETTEXT_OPTIONS) --omit-header \
+         --copyright-holder='$(COPYRIGHT_HOLDER)' \
+         --join-existing \
+         builtins.c
+
+# This rule has no dependencies: we don't need to update builtins.pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make builtins.pot-update" or "make dist" will force an update.
+$(srcdir)/builtins.pot:
+       $(MAKE) builtins.pot-update
+
+xdist:
+       update-po
diff --git a/po/Rules-quot b/po/Rules-quot
new file mode 100644 (file)
index 0000000..5f46d23
--- /dev/null
@@ -0,0 +1,42 @@
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-update: en@quot.po-update-en
+en@boldquot.po-update: en@boldquot.po-update-en
+
+.insert-header.po-update-en:
+       @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+       if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+       tmpdir=`pwd`; \
+       echo "$$lang:"; \
+       ll=`echo $$lang | sed -e 's/@.*//'`; \
+       LC_ALL=C; export LC_ALL; \
+       cd $(srcdir); \
+       if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
+         if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+           rm -f $$tmpdir/$$lang.new.po; \
+         else \
+           if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+             :; \
+           else \
+             echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+             exit 1; \
+           fi; \
+         fi; \
+       else \
+         echo "creation of $$lang.po failed!" 1>&2; \
+         rm -f $$tmpdir/$$lang.new.po; \
+       fi
+
+en@quot.insert-header: insert-header.sin
+       sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+       sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+       rm -f *.insert-header
diff --git a/po/bash.po.orig b/po/bash.po.orig
new file mode 100644 (file)
index 0000000..023388d
--- /dev/null
@@ -0,0 +1,5623 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#: array.c:695 array.c:755 array.c:879 bashhist.c:661 bashline.c:801
+#: bashline.c:1416 error.c:88 error.c:318 error.c:320 error.c:322
+#: execute_cmd.c:2005 execute_cmd.c:2007 execute_cmd.c:2195 execute_cmd.c:2441
+#: execute_cmd.c:2580 execute_cmd.c:3186 execute_cmd.c:3838 expr.c:1092
+#: expr.c:1093 general.c:132 jobs.c:1128 jobs.c:1143 jobs.c:2318 jobs.c:2319
+#: locale.c:64 locale.c:422 parse.y:1209 pcomplete.c:937 pcomplete.c:947
+#: pcomplete.c:1076 print_cmd.c:142 print_cmd.c:305 print_cmd.c:364
+#: print_cmd.c:368 print_cmd.c:374 print_cmd.c:378 print_cmd.c:548
+#: print_cmd.c:733 print_cmd.c:847 print_cmd.c:851 subst.c:1483 subst.c:1510
+#: subst.c:1734 subst.c:1754 subst.c:4238 subst.c:4274 subst.c:6391
+#: syntax.h:43 unwind_prot.c:173 variables.c:1631 variables.c:2381
+#: /usr/homes/chet/src/bash/src/parse.y:1209 builtins/common.c:144
+#: builtins/common.c:640 builtins/getopt.c:204 builtins/mkbuiltins.c:1067
+#: builtins/mkbuiltins.c:1070 builtins/mkbuiltins.c:1072
+#: builtins/mkbuiltins.c:1074 builtins/mkbuiltins.c:1079
+#: builtins/mkbuiltins.c:1084 builtins/mkbuiltins.c:1088
+#: builtins/mkbuiltins.c:1094 builtins/mkbuiltins.c:1100
+#: builtins/mkbuiltins.c:1108 builtins/mkbuiltins.c:1111
+#: builtins/mkbuiltins.c:1207 builtins/mkbuiltins.c:1208
+#: builtins/caller.def:127 builtins/caller.def:131 builtins/command.def:134
+#: builtins/complete.def:567 builtins/declare.def:238 builtins/declare.def:355
+#: builtins/declare.def:438 builtins/fc.def:338 builtins/getopts.def:310
+#: builtins/help.def:105 builtins/help.def:110 builtins/history.def:291
+#: builtins/printf.def:123 builtins/printf.def:726 builtins/pushd.def:330
+#: builtins/pushd.def:371 builtins/pushd.def:654 builtins/pushd.def:662
+#: builtins/pushd.def:665 builtins/pushd.def:675 builtins/pushd.def:679
+#: builtins/pushd.def:683 builtins/pushd.def:686 builtins/pushd.def:689
+#: builtins/pushd.def:698 builtins/pushd.def:702 builtins/pushd.def:706
+#: builtins/pushd.def:709 builtins/read.def:258 builtins/read.def:386
+#: builtins/read.def:595 builtins/setattr.def:353 builtins/setattr.def:396
+#: builtins/ulimit.def:111 builtins/umask.def:131 lib/sh/snprintf.c:394
+#: lib/sh/snprintf.c:1691 lib/sh/stringlist.c:235 lib/sh/stringvec.c:223
+#: lib/malloc/stats.c:99
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2003-12-04 16:07-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: arrayfunc.c:43
+msgid "bad array subscript"
+msgstr ""
+
+#: arrayfunc.c:304
+#, c-format
+msgid "%s: cannot assign to non-numeric index"
+msgstr ""
+
+#: bashhist.c:319
+#, c-format
+msgid "%s: cannot create: %s"
+msgstr ""
+
+#: bashline.c:2789
+msgid "bash_execute_unix_command: cannot find keymap for command"
+msgstr ""
+
+#: bashline.c:2838
+#, c-format
+msgid "%s: first non-whitespace character is not `\"'"
+msgstr ""
+
+#: bashline.c:2867 braces.c:129
+#, c-format
+msgid "no closing `%c' in %s"
+msgstr ""
+
+#: bashline.c:2901
+#, c-format
+msgid "%s: missing colon separator"
+msgstr ""
+
+#: error.c:163
+#, c-format
+msgid "last command: %s\n"
+msgstr ""
+
+#: error.c:168
+#, c-format
+msgid "Report this to %s\n"
+msgstr ""
+
+#: error.c:171
+msgid "Stopping myself..."
+msgstr ""
+
+#: error.c:258
+#, c-format
+msgid "%s: warning: "
+msgstr ""
+
+#: error.c:403
+msgid "unknown command error"
+msgstr ""
+
+#: error.c:404
+msgid "bad command type"
+msgstr ""
+
+#: error.c:405
+msgid "bad connector"
+msgstr ""
+
+#: error.c:406
+msgid "bad jump"
+msgstr ""
+
+#: error.c:444
+#, c-format
+msgid "%s: unbound variable"
+msgstr ""
+
+#: error.c:451 builtins/common.c:221
+#, c-format
+msgid "%s: readonly variable"
+msgstr ""
+
+#: eval.c:173
+msgid "\atimed out waiting for input: auto-logout\n"
+msgstr ""
+
+#: execute_cmd.c:447
+msgid "close"
+msgstr ""
+
+#: execute_cmd.c:447
+msgid "open"
+msgstr ""
+
+#: execute_cmd.c:465
+#, c-format
+msgid "cannot redirect standard input from /dev/null: %s"
+msgstr ""
+
+#: execute_cmd.c:1035
+#, c-format
+msgid "TIMEFORMAT: `%c': invalid format character"
+msgstr ""
+
+#: execute_cmd.c:3520
+#, c-format
+msgid "%s: restricted: cannot specify `/' in command names"
+msgstr ""
+
+#: execute_cmd.c:3608
+#, c-format
+msgid "%s: command not found"
+msgstr ""
+
+#: execute_cmd.c:3820 shell.c:1393 builtins/evalfile.c:127
+#: builtins/hash.def:158
+#, c-format
+msgid "%s: is a directory"
+msgstr ""
+
+#: execute_cmd.c:3838
+#, c-format
+msgid "%s: %s: bad interpreter"
+msgstr ""
+
+#: execute_cmd.c:3875 shell.c:1403 builtins/evalfile.c:172
+#, c-format
+msgid "%s: cannot execute binary file"
+msgstr ""
+
+#: execute_cmd.c:3948 builtins/declare.def:306
+#, c-format
+msgid "%s: readonly function"
+msgstr ""
+
+#: execute_cmd.c:3987
+#, c-format
+msgid "cannot duplicate fd %d to fd %d"
+msgstr ""
+
+#: expr.c:238
+msgid "expression recursion level exceeded"
+msgstr ""
+
+#: expr.c:262
+msgid "recursion stack underflow"
+msgstr ""
+
+#: expr.c:373
+msgid "syntax error in expression"
+msgstr ""
+
+#: expr.c:413
+msgid "attempted assignment to non-variable"
+msgstr ""
+
+#: expr.c:434 expr.c:439 expr.c:749
+msgid "division by 0"
+msgstr ""
+
+#: expr.c:465
+msgid "bug: bad expassign token"
+msgstr ""
+
+#: expr.c:495 expr.c:510 builtins/let.def:92 builtins/let.def:117
+msgid "expression expected"
+msgstr ""
+
+#: expr.c:507
+msgid "`:' expected for conditional expression"
+msgstr ""
+
+#: expr.c:774
+msgid "exponent less than 0"
+msgstr ""
+
+#: expr.c:818
+msgid "identifier expected after pre-increment or pre-decrement"
+msgstr ""
+
+#: expr.c:846
+msgid "missing `)'"
+msgstr ""
+
+#: expr.c:870
+msgid "syntax error: operand expected"
+msgstr ""
+
+#: expr.c:1091
+#, c-format
+msgid "%s%s%s: %s (error token is \"%s\")"
+msgstr ""
+
+#: expr.c:1145
+msgid "bad number"
+msgstr ""
+
+#: expr.c:1149
+msgid "invalid arithmetic base"
+msgstr ""
+
+#: expr.c:1169
+msgid "value too great for base"
+msgstr ""
+
+#: expr.c:1217
+#, c-format
+msgid "%s: expression error\n"
+msgstr ""
+
+#: general.c:58
+msgid "getcwd: cannot access parent directories"
+msgstr ""
+
+#: general.c:227 general.c:232 builtins/common.c:193
+#, c-format
+msgid "`%s': not a valid identifier"
+msgstr ""
+
+#: input.c:229
+#, c-format
+msgid "cannot allocate new file descriptor for bash input from fd %d"
+msgstr ""
+
+#: input.c:237
+#, c-format
+msgid "save_bash_input: buffer already exists for new fd %d"
+msgstr ""
+
+#: jobs.c:692
+#, c-format
+msgid "deleting stopped job %d with process group %ld"
+msgstr ""
+
+#: jobs.c:1631 nojobs.c:646
+#, c-format
+msgid "wait: pid %ld is not a child of this shell"
+msgstr ""
+
+#: jobs.c:1814
+#, c-format
+msgid "wait_for: No record of process %ld"
+msgstr ""
+
+#: jobs.c:1957
+#, c-format
+msgid "wait_for: job == NO_JOB, giving the terminal to shell_pgrp (%ld)"
+msgstr ""
+
+#: jobs.c:2061
+#, c-format
+msgid "wait_for_job: job %d is stopped"
+msgstr ""
+
+#: jobs.c:2283
+#, c-format
+msgid "%s: job has terminated"
+msgstr ""
+
+#: jobs.c:2292
+#, c-format
+msgid "%s: job %d already in background"
+msgstr ""
+
+#: jobs.c:3036
+msgid "no job control in this shell"
+msgstr ""
+
+#: jobs.c:3250
+#, c-format
+msgid "tcsetpgrp(%d) failed: pid %ld to pgrp %ld"
+msgstr ""
+
+#: mailcheck.c:381
+msgid "You have mail in $_"
+msgstr ""
+
+#: mailcheck.c:406
+msgid "You have new mail in $_"
+msgstr ""
+
+#: mailcheck.c:422
+#, c-format
+msgid "The mail in %s has been read\n"
+msgstr ""
+
+#: make_cmd.c:316
+msgid "syntax error: arithmetic expression required"
+msgstr ""
+
+#: make_cmd.c:318
+msgid "syntax error: `;' unexpected"
+msgstr ""
+
+#: make_cmd.c:558
+#, c-format
+msgid "make_here_document: bad instruction type %d"
+msgstr ""
+
+#: make_cmd.c:728
+#, c-format
+msgid "make_redirection: redirection instruction `%d' out of range"
+msgstr ""
+
+#: mksyntax.c:334
+#, c-format
+msgid "%s: %s: cannot open: %s\n"
+msgstr ""
+
+#: parse.y:1663 /usr/homes/chet/src/bash/src/parse.y:1663
+msgid "read_a_line: ignored null byte in input"
+msgstr ""
+
+#: parse.y:1928 /usr/homes/chet/src/bash/src/parse.y:1928
+msgid "shell_getc: ignored null byte in input"
+msgstr ""
+
+#: parse.y:2724 /usr/homes/chet/src/bash/src/parse.y:2724
+#, c-format
+msgid "unexpected EOF while looking for matching `%c'"
+msgstr ""
+
+#: parse.y:3009 /usr/homes/chet/src/bash/src/parse.y:3009
+msgid "unexpected EOF while looking for `]]'"
+msgstr ""
+
+#: parse.y:3014 /usr/homes/chet/src/bash/src/parse.y:3014
+#, c-format
+msgid "syntax error in conditional expression: unexpected token `%s'"
+msgstr ""
+
+#: parse.y:3018 /usr/homes/chet/src/bash/src/parse.y:3018
+msgid "syntax error in conditional expression"
+msgstr ""
+
+#: parse.y:3096 /usr/homes/chet/src/bash/src/parse.y:3096
+#, c-format
+msgid "unexpected token `%s', expected `)'"
+msgstr ""
+
+#: parse.y:3100 /usr/homes/chet/src/bash/src/parse.y:3100
+msgid "expected `)'"
+msgstr ""
+
+#: parse.y:3128 /usr/homes/chet/src/bash/src/parse.y:3128
+#, c-format
+msgid "unexpected argument `%s' to conditional unary operator"
+msgstr ""
+
+#: parse.y:3132 /usr/homes/chet/src/bash/src/parse.y:3132
+msgid "unexpected argument to conditional unary operator"
+msgstr ""
+
+#: parse.y:3160 /usr/homes/chet/src/bash/src/parse.y:3160
+msgid "-n"
+msgstr ""
+
+#: parse.y:3169 /usr/homes/chet/src/bash/src/parse.y:3169
+#, c-format
+msgid "unexpected token `%s', conditional binary operator expected"
+msgstr ""
+
+#: parse.y:3173 /usr/homes/chet/src/bash/src/parse.y:3173
+msgid "conditional binary operator expected"
+msgstr ""
+
+#: parse.y:3189 /usr/homes/chet/src/bash/src/parse.y:3189
+#, c-format
+msgid "unexpected argument `%s' to conditional binary operator"
+msgstr ""
+
+#: parse.y:3193 /usr/homes/chet/src/bash/src/parse.y:3193
+msgid "unexpected argument to conditional binary operator"
+msgstr ""
+
+#: parse.y:3204 /usr/homes/chet/src/bash/src/parse.y:3204
+#, c-format
+msgid "unexpected token `%c' in conditional command"
+msgstr ""
+
+#: parse.y:3207 /usr/homes/chet/src/bash/src/parse.y:3207
+#, c-format
+msgid "unexpected token `%s' in conditional command"
+msgstr ""
+
+#: parse.y:3211 /usr/homes/chet/src/bash/src/parse.y:3211
+#, c-format
+msgid "unexpected token %d in conditional command"
+msgstr ""
+
+#: parse.y:4398 /usr/homes/chet/src/bash/src/parse.y:4398
+#, c-format
+msgid "syntax error near unexpected token `%s'"
+msgstr ""
+
+#: parse.y:4416 /usr/homes/chet/src/bash/src/parse.y:4416
+#, c-format
+msgid "syntax error near `%s'"
+msgstr ""
+
+#: parse.y:4426 /usr/homes/chet/src/bash/src/parse.y:4426
+msgid "syntax error: unexpected end of file"
+msgstr ""
+
+#: parse.y:4426 /usr/homes/chet/src/bash/src/parse.y:4426
+msgid "syntax error"
+msgstr ""
+
+#: parse.y:4488 /usr/homes/chet/src/bash/src/parse.y:4488
+#, c-format
+msgid "Use \"%s\" to leave the shell.\n"
+msgstr ""
+
+#: parse.y:4647 /usr/homes/chet/src/bash/src/parse.y:4647
+msgid "unexpected EOF while looking for matching `)'"
+msgstr ""
+
+#: pcomplete.c:987
+#, c-format
+msgid "completion: function `%s' not found"
+msgstr ""
+
+#: pcomplete.c:1222
+msgid "ERROR: command_line_to_word_list returns NULL"
+msgstr ""
+
+#: pcomplib.c:177
+#, c-format
+msgid "progcomp_insert: %s: NULL COMPSPEC"
+msgstr ""
+
+#: print_cmd.c:259
+#, c-format
+msgid "print_command: bad connector `%d'"
+msgstr ""
+
+#: print_cmd.c:1171
+#, c-format
+msgid "cprintf: `%c': invalid format character"
+msgstr ""
+
+#: redir.c:98 redir.c:133
+msgid "file descriptor out of range"
+msgstr ""
+
+#: redir.c:140
+#, c-format
+msgid "%s: ambiguous redirect"
+msgstr ""
+
+#: redir.c:144
+#, c-format
+msgid "%s: cannot overwrite existing file"
+msgstr ""
+
+#: redir.c:149
+#, c-format
+msgid "%s: restricted: cannot redirect output"
+msgstr ""
+
+#: redir.c:154
+#, c-format
+msgid "cannot create temp file for here document: %s"
+msgstr ""
+
+#: redir.c:508
+msgid "/dev/(tcp|udp)/host/port not supported without networking"
+msgstr ""
+
+#: redir.c:948
+msgid "redirection error: cannot duplicate fd"
+msgstr ""
+
+#: shell.c:300
+msgid "could not find /tmp, please create!"
+msgstr ""
+
+#: shell.c:304
+msgid "/tmp must be a valid directory name"
+msgstr ""
+
+#: shell.c:463 shell.c:735 builtins/common.c:156
+#, c-format
+msgid "%s: option requires an argument"
+msgstr ""
+
+#: shell.c:748 builtins/common.c:179
+#, c-format
+msgid "%s: invalid option"
+msgstr ""
+
+#: shell.c:837
+#, c-format
+msgid "%c%c: invalid option"
+msgstr ""
+
+#: shell.c:1588
+msgid "I have no name!"
+msgstr ""
+
+#: shell.c:1721
+#, c-format
+msgid "GNU bash, version %s-(%s)\n"
+msgstr ""
+
+#: shell.c:1722
+#, c-format
+msgid ""
+"Usage:\t%s [GNU long option] [option] ...\n"
+"\t%s [GNU long option] [option] script-file ...\n"
+msgstr ""
+
+#: shell.c:1724
+msgid "GNU long options:\n"
+msgstr ""
+
+#: shell.c:1726
+#, c-format
+msgid "\t--%s\n"
+msgstr ""
+
+#: shell.c:1728
+msgid "Shell options:\n"
+msgstr ""
+
+#: shell.c:1729
+msgid "\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n"
+msgstr ""
+
+#: shell.c:1732 builtins/mkbuiltins.c:131 builtins/set.def:2
+msgid "set"
+msgstr ""
+
+#: shell.c:1744
+#, c-format
+msgid "\t-%s or -o option\n"
+msgstr ""
+
+#: shell.c:1750
+#, c-format
+msgid "Type `%s -c \"help set\"' for more information about shell options.\n"
+msgstr ""
+
+#: shell.c:1751
+#, c-format
+msgid "Type `%s -c help' for more information about shell builtin commands.\n"
+msgstr ""
+
+#: shell.c:1752
+msgid "Use the `bashbug' command to report bugs.\n"
+msgstr ""
+
+#: sig.c:483
+msgid "Bad code in sig.c: sigprocmask"
+msgstr ""
+
+#: siglist.c:47
+msgid "Bogus signal"
+msgstr ""
+
+#: siglist.c:50
+msgid "Hangup"
+msgstr ""
+
+#: siglist.c:54
+msgid "Interrupt"
+msgstr ""
+
+#: siglist.c:58
+msgid "Quit"
+msgstr ""
+
+#: siglist.c:62
+msgid "Illegal instruction"
+msgstr ""
+
+#: siglist.c:66
+msgid "BPT trace/trap"
+msgstr ""
+
+#: siglist.c:74
+msgid "ABORT instruction"
+msgstr ""
+
+#: siglist.c:78
+msgid "EMT instruction"
+msgstr ""
+
+#: siglist.c:82
+msgid "Floating point exception"
+msgstr ""
+
+#: siglist.c:86
+msgid "Killed"
+msgstr ""
+
+#: siglist.c:90
+msgid "Bus error"
+msgstr ""
+
+#: siglist.c:94
+msgid "Segmentation fault"
+msgstr ""
+
+#: siglist.c:98
+msgid "Bad system call"
+msgstr ""
+
+#: siglist.c:102
+msgid "Broken pipe"
+msgstr ""
+
+#: siglist.c:106
+msgid "Alarm clock"
+msgstr ""
+
+#: siglist.c:110
+msgid "Terminated"
+msgstr ""
+
+#: siglist.c:114
+msgid "Urgent IO condition"
+msgstr ""
+
+#: siglist.c:118
+msgid "Stopped (signal)"
+msgstr ""
+
+#: siglist.c:126
+msgid "Continue"
+msgstr ""
+
+#: siglist.c:134
+msgid "Child death or stop"
+msgstr ""
+
+#: siglist.c:138
+msgid "Stopped (tty input)"
+msgstr ""
+
+#: siglist.c:142
+msgid "Stopped (tty output)"
+msgstr ""
+
+#: siglist.c:146
+msgid "I/O ready"
+msgstr ""
+
+#: siglist.c:150
+msgid "CPU limit"
+msgstr ""
+
+#: siglist.c:154
+msgid "File limit"
+msgstr ""
+
+#: siglist.c:158
+msgid "Alarm (virtual)"
+msgstr ""
+
+#: siglist.c:162
+msgid "Alarm (profile)"
+msgstr ""
+
+#: siglist.c:166
+msgid "Window changed"
+msgstr ""
+
+#: siglist.c:170
+msgid "Record lock"
+msgstr ""
+
+#: siglist.c:174
+msgid "User signal 1"
+msgstr ""
+
+#: siglist.c:178
+msgid "User signal 2"
+msgstr ""
+
+#: siglist.c:182
+msgid "HFT input data pending"
+msgstr ""
+
+#: siglist.c:186
+msgid "power failure imminent"
+msgstr ""
+
+#: siglist.c:190
+msgid "system crash imminent"
+msgstr ""
+
+#: siglist.c:194
+msgid "migrate process to another CPU"
+msgstr ""
+
+#: siglist.c:198
+msgid "programming error"
+msgstr ""
+
+#: siglist.c:202
+msgid "HFT monitor mode granted"
+msgstr ""
+
+#: siglist.c:206
+msgid "HFT monitor mode retracted"
+msgstr ""
+
+#: siglist.c:210
+msgid "HFT sound sequence has completed"
+msgstr ""
+
+#: siglist.c:214
+msgid "Information request"
+msgstr ""
+
+#: siglist.c:222
+msgid "Unknown Signal #"
+msgstr ""
+
+#: siglist.c:224
+#, c-format
+msgid "Unknown Signal #%d"
+msgstr ""
+
+#: subst.c:666 subst.c:752 subst.c:865 subst.c:1107 subst.c:1370
+msgid "$("
+msgstr ""
+
+#: subst.c:876
+msgid "$["
+msgstr ""
+
+#: subst.c:876
+msgid "["
+msgstr ""
+
+#: subst.c:876
+msgid "]"
+msgstr ""
+
+#: subst.c:1010 subst.c:1131
+#, c-format
+msgid "bad substitution: no closing `%s' in %s"
+msgstr ""
+
+#: subst.c:2006
+#, c-format
+msgid "%s%s=(%s)\n"
+msgstr ""
+
+#: subst.c:2009 variables.c:2123
+#, c-format
+msgid "%s%s=%s\n"
+msgstr ""
+
+#: subst.c:2019
+#, c-format
+msgid "%s: cannot assign list to array member"
+msgstr ""
+
+#: subst.c:3381
+msgid "sh-np"
+msgstr ""
+
+#: subst.c:3449
+#, c-format
+msgid "pid %ld: dev_fd_list:"
+msgstr ""
+
+#: subst.c:3455 /usr/local/share/bison/bison.simple:719
+#: /usr/local/share/bison/bison.simple:864
+#, c-format
+msgid " %d"
+msgstr ""
+
+#: subst.c:3515 subst.c:3531
+msgid "cannot make pipe for process substitution"
+msgstr ""
+
+#: subst.c:3562
+msgid "cannot make child for process substitution"
+msgstr ""
+
+#: subst.c:3605
+#, c-format
+msgid "cannot open named pipe %s for %s"
+msgstr ""
+
+#: subst.c:3606
+msgid "reading"
+msgstr ""
+
+#: subst.c:3606
+msgid "writing"
+msgstr ""
+
+#: subst.c:3613
+#, c-format
+msgid "cannout reset nodelay mode for fd %d"
+msgstr ""
+
+#: subst.c:3623
+#, c-format
+msgid "cannot duplicate named pipe %s as fd %d"
+msgstr ""
+
+#: subst.c:3647
+msgid "process substitution"
+msgstr ""
+
+#: subst.c:3697
+msgid "read_comsub: ignored null byte in input"
+msgstr ""
+
+#: subst.c:3798
+msgid "cannot make pipe for command substitution"
+msgstr ""
+
+#: subst.c:3827
+msgid "cannot make child for command substitution"
+msgstr ""
+
+#: subst.c:3844
+msgid "command_substitute: cannot duplicate pipe as fd 1"
+msgstr ""
+
+#: subst.c:3901
+msgid "command substitution"
+msgstr ""
+
+#: subst.c:4279
+#, c-format
+msgid "%s: parameter null or not set"
+msgstr ""
+
+#: subst.c:4524
+#, c-format
+msgid "%s: substring expression < 0"
+msgstr ""
+
+#: subst.c:4966 subst.c:4983
+msgid "#%:-=?+/}"
+msgstr ""
+
+#: subst.c:5033
+msgid "%:=+/"
+msgstr ""
+
+#: subst.c:5204
+#, c-format
+msgid "%s: bad substitution"
+msgstr ""
+
+#: subst.c:5204 builtins/history.def:247
+msgid "??"
+msgstr ""
+
+#: subst.c:5278
+#, c-format
+msgid "$%s: cannot assign in this way"
+msgstr ""
+
+#: subst.c:5792
+msgid "<("
+msgstr ""
+
+#: subst.c:5792
+msgid ">("
+msgstr ""
+
+#: subst.c:6647
+#, c-format
+msgid "no match: %s"
+msgstr ""
+
+#: syntax.h:26
+msgid "\\`$\"\n"
+msgstr ""
+
+#: syntax.h:27
+msgid "\\`$"
+msgstr ""
+
+#: syntax.h:29
+msgid "()<>;&|"
+msgstr ""
+
+#: syntax.h:32
+msgid "\"`'"
+msgstr ""
+
+#: syntax.h:35
+msgid "$<>"
+msgstr ""
+
+#: syntax.h:41
+msgid "@*+?!"
+msgstr ""
+
+#: syntax.h:45
+msgid "*?[]^"
+msgstr ""
+
+#: test.c:152
+msgid "argument expected"
+msgstr ""
+
+#: test.c:161
+#, c-format
+msgid "%s: integer expression expected"
+msgstr ""
+
+#: test.c:176
+msgid "/dev/fd/"
+msgstr ""
+
+#: test.c:202
+msgid "/dev/std"
+msgstr ""
+
+#: test.c:206
+msgid "out"
+msgstr ""
+
+#: test.c:208
+msgid "err"
+msgstr ""
+
+#: test.c:359
+msgid "`)' expected"
+msgstr ""
+
+#: test.c:361
+#, c-format
+msgid "`)' expected, found %s"
+msgstr ""
+
+#: test.c:376 test.c:785 test.c:788
+#, c-format
+msgid "%s: unary operator expected"
+msgstr ""
+
+#: test.c:541 test.c:828
+#, c-format
+msgid "%s: binary operator expected"
+msgstr ""
+
+#: test.c:903 builtins/test.def:134
+msgid "missing `]'"
+msgstr ""
+
+#: test.c:919 builtins/common.c:132
+msgid "too many arguments"
+msgstr ""
+
+#: trap.c:171
+msgid "DEFAULT_SIG"
+msgstr ""
+
+#: trap.c:173
+msgid "IGNORE_SIG"
+msgstr ""
+
+#: trap.c:175
+msgid "IMPOSSIBLE_TRAP_HANDLER"
+msgstr ""
+
+#: trap.c:179 builtins/caller.def:94
+msgid "NULL"
+msgstr ""
+
+#: trap.c:192
+msgid "invalid signal number"
+msgstr ""
+
+#: trap.c:222 builtins/common.c:638 builtins/trap.def:218
+msgid "SIG"
+msgstr ""
+
+#: trap.c:307
+#, c-format
+msgid "run_pending_traps: bad value in trap_list[%d]: %p"
+msgstr ""
+
+#: trap.c:311
+#, c-format
+msgid ""
+"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+msgstr ""
+
+#: trap.c:347
+#, c-format
+msgid "trap_handler: bad signal %d"
+msgstr ""
+
+#: trap.c:673
+msgid "exit trap"
+msgstr ""
+
+#: trap.c:781
+msgid "debug trap"
+msgstr ""
+
+#: trap.c:800
+msgid "error trap"
+msgstr ""
+
+#: trap.c:811
+msgid "return trap"
+msgstr ""
+
+#: trap.c:821
+msgid "interrupt trap"
+msgstr ""
+
+#: variables.c:287
+msgid "() {"
+msgstr ""
+
+#: variables.c:309
+#, c-format
+msgid "error importing function definition for `%s'"
+msgstr ""
+
+#: variables.c:370
+msgid "NODE"
+msgstr ""
+
+#: variables.c:383
+msgid "# "
+msgstr ""
+
+#: variables.c:387
+msgid "+ "
+msgstr ""
+
+#: variables.c:390 variables.c:2867 variables.c:3464 variables.c:3500
+#: variables.c:3632 variables.c:3735
+msgid "IFS"
+msgstr ""
+
+#: variables.c:401
+msgid "600"
+msgstr ""
+
+#: variables.c:401
+msgid "60"
+msgstr ""
+
+#: variables.c:409 variables.c:3647 variables.c:3955 builtins/getopts.def:231
+msgid "OPTIND"
+msgstr ""
+
+#: variables.c:411 variables.c:3646 variables.c:3976
+msgid "OPTERR"
+msgstr ""
+
+#: variables.c:420
+msgid "BASH"
+msgstr ""
+
+#: variables.c:430
+msgid "BASH_VERSION"
+msgstr ""
+
+#: variables.c:436
+msgid "BASH_EXECUTION_STRING"
+msgstr ""
+
+#: variables.c:452
+msgid "~/.sh_history"
+msgstr ""
+
+#: variables.c:452
+msgid "~/.bash_history"
+msgstr ""
+
+#: variables.c:457
+msgid "500"
+msgstr ""
+
+#: variables.c:469 variables.c:3633 builtins/set.def:313 builtins/set.def:315
+#: builtins/set.def:316
+msgid "IGNOREEOF"
+msgstr ""
+
+#: variables.c:471 variables.c:3669 builtins/set.def:191 builtins/set.def:311
+msgid "ignoreeof"
+msgstr ""
+
+#: variables.c:527
+msgid "HOSTTYPE"
+msgstr ""
+
+#: variables.c:528
+msgid "OSTYPE"
+msgstr ""
+
+#: variables.c:529
+msgid "MACHTYPE"
+msgstr ""
+
+#: variables.c:531
+msgid "HOSTNAME"
+msgstr ""
+
+#: variables.c:660 variables.c:694
+msgid "SHLVL"
+msgstr ""
+
+#: variables.c:669
+#, c-format
+msgid "shell level (%d) too high, resetting to 1"
+msgstr ""
+
+#: variables.c:734
+msgid "shell-init"
+msgstr ""
+
+#: variables.c:758 variables.c:761
+msgid "PPID"
+msgstr ""
+
+#: variables.c:772 variables.c:775
+msgid "UID"
+msgstr ""
+
+#: variables.c:782 variables.c:785
+msgid "EUID"
+msgstr ""
+
+#: variables.c:798 variables.c:800
+msgid "BASH_VERSINFO"
+msgstr ""
+
+#: variables.c:893
+#, c-format
+msgid "%s="
+msgstr ""
+
+#: variables.c:1087 variables.c:1093
+msgid "SECONDS"
+msgstr ""
+
+#: variables.c:1395
+msgid "BASH_COMMAND"
+msgstr ""
+
+#: variables.c:1396
+msgid "BASH_SUBSHELL"
+msgstr ""
+
+#: variables.c:1398
+msgid "RANDOM"
+msgstr ""
+
+#: variables.c:1399
+msgid "LINENO"
+msgstr ""
+
+#: variables.c:1402
+msgid "HISTCMD"
+msgstr ""
+
+#: variables.c:1406
+msgid "COMP_WORDBREAKS"
+msgstr ""
+
+#: variables.c:1410
+msgid "DIRSTACK"
+msgstr ""
+
+#: variables.c:1414
+msgid "GROUPS"
+msgstr ""
+
+#: variables.c:1417 variables.c:3554 variables.c:3578 builtins/evalfile.c:101
+msgid "BASH_ARGC"
+msgstr ""
+
+#: variables.c:1418 variables.c:3553 variables.c:3577 builtins/evalfile.c:100
+msgid "BASH_ARGV"
+msgstr ""
+
+#: variables.c:1609
+msgid "make_local_variable: no function context at current scope"
+msgstr ""
+
+#: variables.c:2708
+msgid "all_local_variables: no function context at current scope"
+msgstr ""
+
+#: variables.c:2922 variables.c:2931
+#, c-format
+msgid "invalid character %d in exportstr for %s"
+msgstr ""
+
+#: variables.c:2937
+#, c-format
+msgid "no `=' in exportstr for %s"
+msgstr ""
+
+#: variables.c:3071
+msgid ") {"
+msgstr ""
+
+#: variables.c:3222
+msgid "_="
+msgstr ""
+
+#: variables.c:3242
+msgid "_GNU_nonoption_argv_flags_"
+msgstr ""
+
+#: variables.c:3362
+msgid "pop_var_context: head of shell_variables not a function context"
+msgstr ""
+
+#: variables.c:3375
+msgid "pop_var_context: no global_variables context"
+msgstr ""
+
+#: variables.c:3441
+msgid "pop_scope: head of shell_variables not a temporary environment scope"
+msgstr ""
+
+#: variables.c:3625 builtins/history.def:282
+msgid "HISTTIMEFORMAT"
+msgstr ""
+
+#: variables.c:3635
+msgid "LANG"
+msgstr ""
+
+#: variables.c:3636
+msgid "LC_ALL"
+msgstr ""
+
+#: variables.c:3654
+msgid "TERMCAP"
+msgstr ""
+
+#: variables.c:3655
+msgid "TERMINFO"
+msgstr ""
+
+#: variables.c:3662 lib/sh/strftime.c:185 lib/sh/strftime.c:187
+msgid "TZ"
+msgstr ""
+
+#: variables.c:3867
+msgid "ignorespace"
+msgstr ""
+
+#: variables.c:3869
+msgid "ignoredups"
+msgstr ""
+
+#: variables.c:3871
+msgid "ignoreboth"
+msgstr ""
+
+#: variables.c:3873
+msgid "erasedups"
+msgstr ""
+
+#: version.c:60 version.c:62
+#, c-format
+msgid "%s.%d(%d)-%s"
+msgstr ""
+
+#: version.c:66 version.c:68
+#, c-format
+msgid "%s.%d(%d)"
+msgstr ""
+
+#: version.c:78
+#, c-format
+msgid "GNU bash, version %s (%s)\n"
+msgstr ""
+
+#: version.c:80
+msgid "Copyright (C) 2003 Free Software Foundation, Inc.\n"
+msgstr ""
+
+#: xmalloc.c:91
+#, c-format
+msgid "xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"
+msgstr ""
+
+#: xmalloc.c:93
+#, c-format
+msgid "xmalloc: cannot allocate %lu bytes"
+msgstr ""
+
+#: xmalloc.c:113
+#, c-format
+msgid "xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"
+msgstr ""
+
+#: xmalloc.c:115
+#, c-format
+msgid "xrealloc: cannot allocate %lu bytes"
+msgstr ""
+
+#: xmalloc.c:149
+#, c-format
+msgid "xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"
+msgstr ""
+
+#: xmalloc.c:151
+#, c-format
+msgid "xmalloc: %s:%d: cannot allocate %lu bytes"
+msgstr ""
+
+#: xmalloc.c:173
+#, c-format
+msgid "xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)"
+msgstr ""
+
+#: xmalloc.c:175
+#, c-format
+msgid "xrealloc: %s:%d: cannot allocate %lu bytes"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:469
+msgid "error"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:469
+msgid "$undefined."
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:469
+msgid "IF"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:469
+msgid "THEN"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:469
+msgid "ELSE"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:469
+msgid "ELIF"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:469
+msgid "FI"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:469
+msgid "CASE"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:470
+msgid "ESAC"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:470
+msgid "FOR"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:470
+msgid "SELECT"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:470
+msgid "WHILE"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:470
+msgid "UNTIL"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:470
+msgid "DO"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:470
+msgid "DONE"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:470 builtins/mkbuiltins.c:425
+msgid "FUNCTION"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:471
+msgid "COND_START"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:471
+msgid "COND_END"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:471
+msgid "COND_ERROR"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:471
+msgid "IN"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:471
+msgid "BANG"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:471
+msgid "TIME"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:471
+msgid "TIMEOPT"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:472
+msgid "WORD"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:472
+msgid "ASSIGNMENT_WORD"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:472
+msgid "NUMBER"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:472
+msgid "ARITH_CMD"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:472
+msgid "ARITH_FOR_EXPRS"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:473
+msgid "COND_CMD"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:473
+msgid "AND_AND"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:473
+msgid "OR_OR"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:473
+msgid "GREATER_GREATER"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:473
+msgid "LESS_LESS"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:474
+msgid "LESS_AND"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:474
+msgid "LESS_LESS_LESS"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:474
+msgid "GREATER_AND"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:474
+msgid "SEMI_SEMI"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:475
+msgid "LESS_LESS_MINUS"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:475
+msgid "AND_GREATER"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:475
+msgid "LESS_GREATER"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:475
+msgid "GREATER_BAR"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:475
+msgid "'&'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "';'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "'\\n'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "yacc_EOF"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "'|'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "'>'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "'<'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "'-'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "'{'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:476
+msgid "'}'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:477
+msgid "'('"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:477
+msgid "')'"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:477
+msgid "inputunit"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:477
+msgid "word_list"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:477
+msgid "redirection"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:478
+msgid "simple_command_element"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:478
+msgid "redirection_list"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:478
+msgid "simple_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:479 builtins/command.def:2
+#: builtins/complete.def:82
+msgid "command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:479
+msgid "shell_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:479
+msgid "for_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:479
+msgid "arith_for_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:480
+msgid "select_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:480
+msgid "case_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:480
+msgid "function_def"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:480
+msgid "function_body"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:481
+msgid "subshell"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:481
+msgid "if_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:481
+msgid "group_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:481
+msgid "arith_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:482
+msgid "cond_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:482
+msgid "elif_clause"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:482
+msgid "case_clause"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:482
+msgid "pattern_list"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:483
+msgid "case_clause_sequence"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:483
+msgid "pattern"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:483
+msgid "list"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:483
+msgid "compound_list"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:483
+msgid "list0"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:484
+msgid "list1"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:484
+msgid "simple_list_terminator"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:484
+msgid "list_terminator"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:484
+msgid "newline_list"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:485
+msgid "simple_list"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:485
+msgid "simple_list1"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:485
+msgid "pipeline_command"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:485
+msgid "pipeline"
+msgstr ""
+
+#: /usr/homes/chet/src/bash/src/parse.y:486
+msgid "timespec"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:156
+msgid "syntax error: cannot back up"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:442
+msgid "Starting parse\n"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:492
+#: /usr/local/share/bison/bison.simple:499
+#: /usr/local/share/bison/bison.simple:924
+msgid "parser stack overflow"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:538
+#, c-format
+msgid "Stack size increased to %lu\n"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:545
+#, c-format
+msgid "Entering state %d\n"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:572
+msgid "Reading a token: "
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:583
+msgid "Now at end of input.\n"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:594
+#, c-format
+msgid "Next token is %d (%s"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:633
+#, c-format
+msgid "Shifting token %d (%s), "
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:695
+#, c-format
+msgid "Reducing via rule %d (line %d), "
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:701
+#, c-format
+msgid " -> %s\n"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:717
+msgid "state stack now"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:769
+#: /usr/local/share/bison/bison.simple:774
+msgid "parse error, unexpected "
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:785
+msgid ", expecting "
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:785
+msgid " or "
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:795
+msgid "parse error; also virtual memory exhausted"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:799
+msgid "parse error"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:816
+#, c-format
+msgid "Discarding token %d (%s).\n"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:862
+msgid "Error: state stack now"
+msgstr ""
+
+#: /usr/local/share/bison/bison.simple:895
+msgid "Shifting error token, "
+msgstr ""
+
+#: builtins/common.c:102
+#, c-format
+msgid "line %d: "
+msgstr ""
+
+#: builtins/common.c:119
+#, c-format
+msgid "%s: usage: "
+msgstr ""
+
+#: builtins/common.c:163
+#, c-format
+msgid "%s: numeric argument required"
+msgstr ""
+
+#: builtins/common.c:170
+#, c-format
+msgid "%s: not found"
+msgstr ""
+
+#: builtins/common.c:186
+#, c-format
+msgid "%s: invalid option name"
+msgstr ""
+
+#: builtins/common.c:200
+#, c-format
+msgid "%s: invalid number"
+msgstr ""
+
+#: builtins/common.c:207
+#, c-format
+msgid "%s: invalid signal specification"
+msgstr ""
+
+#: builtins/common.c:214
+#, c-format
+msgid "`%s': not a pid or valid job spec"
+msgstr ""
+
+#: builtins/common.c:229
+#, c-format
+msgid "%s: %s out of range"
+msgstr ""
+
+#: builtins/common.c:229 builtins/common.c:231
+msgid "argument"
+msgstr ""
+
+#: builtins/common.c:231
+#, c-format
+msgid "%s out of range"
+msgstr ""
+
+#: builtins/common.c:239
+#, c-format
+msgid "%s: no such job"
+msgstr ""
+
+#: builtins/common.c:247
+#, c-format
+msgid "%s: no job control"
+msgstr ""
+
+#: builtins/common.c:249
+msgid "no job control"
+msgstr ""
+
+#: builtins/common.c:259
+#, c-format
+msgid "%s: restricted"
+msgstr ""
+
+#: builtins/common.c:269
+#, c-format
+msgid "%s: not a shell builtin"
+msgstr ""
+
+#: builtins/common.c:417
+msgid "`'"
+msgstr ""
+
+#: builtins/common.c:480
+#, c-format
+msgid "%s: could not get current directory: %s: %s\n"
+msgstr ""
+
+#: builtins/common.c:547 builtins/common.c:549
+#, c-format
+msgid "%s: ambiguous job spec"
+msgstr ""
+
+#: builtins/common.c:631 builtins/common.c:680 builtins/trap.def:214
+msgid "SIGJUNK"
+msgstr ""
+
+#: builtins/common.c:631 builtins/common.c:680
+msgid "Unknown"
+msgstr ""
+
+#: builtins/common.c:644
+#, c-format
+msgid "%2d) %s"
+msgstr ""
+
+#: builtins/evalfile.c:132
+#, c-format
+msgid "%s: not a regular file"
+msgstr ""
+
+#: builtins/evalfile.c:140
+#, c-format
+msgid "%s: file is too large"
+msgstr ""
+
+#: builtins/evalfile.c:178 builtins/evalfile.c:237
+msgid "_evalfile"
+msgstr ""
+
+#: builtins/evalfile.c:204 builtins/mkbuiltins.c:130 builtins/source.def:2
+#: builtins/source.def:143 builtins/source.def:170
+msgid "source"
+msgstr ""
+
+#: builtins/evalstring.c:76 builtins/evalstring.c:103
+#: builtins/evalstring.c:287
+msgid "parse_and_execute_top"
+msgstr ""
+
+#: builtins/evalstring.c:181 builtins/evalstring.c:189
+#: builtins/evalstring.c:223 builtins/evalstring.c:272
+msgid "pe_dispose"
+msgstr ""
+
+#: builtins/evalstring.c:205
+msgid "parse_and_execute"
+msgstr ""
+
+#: builtins/getopt.c:108
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: builtins/getopt.c:109
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr ""
+
+#: builtins/getopt.c:231
+msgid "sh_getopt_debug_restore_state: resetting nextchar"
+msgstr ""
+
+#: builtins/getopt.c:254
+msgid "abc:d:0123456789"
+msgstr ""
+
+#: builtins/getopt.c:271
+msgid "digits occur in two different argv-elements.\n"
+msgstr ""
+
+#: builtins/getopt.c:273
+#, c-format
+msgid "option %c\n"
+msgstr ""
+
+#: builtins/getopt.c:277
+msgid "option a\n"
+msgstr ""
+
+#: builtins/getopt.c:281
+msgid "option b\n"
+msgstr ""
+
+#: builtins/getopt.c:285
+#, c-format
+msgid "option c with value `%s'\n"
+msgstr ""
+
+#: builtins/getopt.c:292
+#, c-format
+msgid "?? sh_getopt returned character code 0%o ??\n"
+msgstr ""
+
+#: builtins/getopt.c:298
+msgid "non-option ARGV-elements: "
+msgstr ""
+
+#: builtins/mkbuiltins.c:47
+msgid "builtins.texi"
+msgstr ""
+
+#: builtins/mkbuiltins.c:130 builtins/break.def:2
+msgid "break"
+msgstr ""
+
+#: builtins/mkbuiltins.c:130 builtins/break.def:2
+msgid "continue"
+msgstr ""
+
+#: builtins/mkbuiltins.c:130 builtins/eval.def:2 builtins/eval.def:52
+msgid "eval"
+msgstr ""
+
+#: builtins/mkbuiltins.c:130 builtins/exec.def:2
+msgid "exec"
+msgstr ""
+
+#: builtins/mkbuiltins.c:131 builtins/mkbuiltins.c:138
+#: builtins/complete.def:86 builtins/setattr.def:2
+msgid "export"
+msgstr ""
+
+#: builtins/mkbuiltins.c:131 builtins/mkbuiltins.c:138 builtins/setattr.def:2
+msgid "readonly"
+msgstr ""
+
+#: builtins/mkbuiltins.c:131 builtins/return.def:2
+msgid "return"
+msgstr ""
+
+#: builtins/mkbuiltins.c:131 builtins/shift.def:2
+msgid "shift"
+msgstr ""
+
+#: builtins/mkbuiltins.c:131 builtins/set.def:2
+msgid "unset"
+msgstr ""
+
+#: builtins/mkbuiltins.c:138 builtins/alias.def:2 builtins/complete.def:78
+#: builtins/type.def:228
+msgid "alias"
+msgstr ""
+
+#: builtins/mkbuiltins.c:138 builtins/declare.def:2
+msgid "declare"
+msgstr ""
+
+#: builtins/mkbuiltins.c:138 builtins/declare.def:2
+msgid "local"
+msgstr ""
+
+#: builtins/mkbuiltins.c:138
+msgid "typeset"
+msgstr ""
+
+#: builtins/mkbuiltins.c:194
+msgid "-externfile"
+msgstr ""
+
+#: builtins/mkbuiltins.c:196
+msgid "-structfile"
+msgstr ""
+
+#: builtins/mkbuiltins.c:198
+msgid "-noproduction"
+msgstr ""
+
+#: builtins/mkbuiltins.c:200
+msgid "-document"
+msgstr ""
+
+#: builtins/mkbuiltins.c:202
+msgid "-D"
+msgstr ""
+
+#: builtins/mkbuiltins.c:218
+msgid "-documentonly"
+msgstr ""
+
+#: builtins/mkbuiltins.c:223
+msgid "-H"
+msgstr ""
+
+#: builtins/mkbuiltins.c:230
+#, c-format
+msgid "%s: Unknown flag %s.\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:245
+#, c-format
+msgid "mk-%ld"
+msgstr ""
+
+#: builtins/mkbuiltins.c:266
+#, c-format
+msgid "@c Table of builtins created with %s.\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:268
+msgid "@ftable @asis\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:305
+msgid "@end ftable\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:423
+msgid "BUILTIN"
+msgstr ""
+
+#: builtins/mkbuiltins.c:424
+msgid "DOCNAME"
+msgstr ""
+
+#: builtins/mkbuiltins.c:426
+msgid "SHORT_DOC"
+msgstr ""
+
+#: builtins/mkbuiltins.c:428
+msgid "COMMENT"
+msgstr ""
+
+#: builtins/mkbuiltins.c:429
+msgid "DEPENDS_ON"
+msgstr ""
+
+#: builtins/mkbuiltins.c:430
+msgid "PRODUCES"
+msgstr ""
+
+#: builtins/mkbuiltins.c:431
+msgid "END"
+msgstr ""
+
+#: builtins/mkbuiltins.c:500
+#, c-format
+msgid "mkbuiltins: %s: skipping zero-length file\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:551
+#, c-format
+msgid "Unknown directive `%s'"
+msgstr ""
+
+#: builtins/mkbuiltins.c:577
+#, c-format
+msgid "#line %d \"%s\"\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:580
+#, c-format
+msgid "#line %d \"%s%s\"\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:582 builtins/mkbuiltins.c:954
+msgid "./"
+msgstr ""
+
+#: builtins/mkbuiltins.c:703
+#, c-format
+msgid "%s requires an argument"
+msgstr ""
+
+#: builtins/mkbuiltins.c:715
+#, c-format
+msgid "%s must be inside of a $BUILTIN block"
+msgstr ""
+
+#: builtins/mkbuiltins.c:740
+msgid "(implied LONGDOC)"
+msgstr ""
+
+#: builtins/mkbuiltins.c:766
+#, c-format
+msgid "%s found before $END"
+msgstr ""
+
+#: builtins/mkbuiltins.c:812
+msgid "syntax error: no current builtin for $FUNCTION directive"
+msgstr ""
+
+#: builtins/mkbuiltins.c:816
+#, c-format
+msgid "%s already has a function (%s)"
+msgstr ""
+
+#: builtins/mkbuiltins.c:836
+#, c-format
+msgid "%s already had a docname (%s)"
+msgstr ""
+
+#: builtins/mkbuiltins.c:856
+#, c-format
+msgid "%s already has short documentation (%s)"
+msgstr ""
+
+#: builtins/mkbuiltins.c:910
+#, c-format
+msgid "%s already has a %s definition"
+msgstr ""
+
+#: builtins/mkbuiltins.c:923
+#, c-format
+msgid "/* %s, created from %s. */\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:955
+#, c-format
+msgid "%s:%d:"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1010
+msgid "mkbuiltins: out of virtual memory\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1066
+msgid "/* builtins.c -- the built in shell commands. */"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1068
+msgid "/* This file is manufactured by ./mkbuiltins, and should not be"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1069
+msgid "   edited by hand.  See the source to mkbuiltins for details. */"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1071
+msgid "/* Copyright (C) 1987-2002 Free Software Foundation, Inc."
+msgstr ""
+
+#: builtins/mkbuiltins.c:1073
+msgid "   This file is part of GNU Bash, the Bourne Again SHell."
+msgstr ""
+
+#: builtins/mkbuiltins.c:1075
+msgid "   Bash is free software; you can redistribute it and/or modify it"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1076
+msgid "   under the terms of the GNU General Public License as published by"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1077
+msgid "   the Free Software Foundation; either version 2, or (at your option)"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1078
+msgid "   any later version."
+msgstr ""
+
+#: builtins/mkbuiltins.c:1080
+msgid "   Bash is distributed in the hope that it will be useful, but WITHOUT"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1081
+msgid "   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1082
+msgid "   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1083
+msgid "   License for more details."
+msgstr ""
+
+#: builtins/mkbuiltins.c:1085
+msgid "   You should have received a copy of the GNU General Public License"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1086
+msgid "   along with Bash; see the file COPYING.  If not, write to the Free"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1087
+msgid ""
+"   Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1089
+msgid "/* The list of shell builtins.  Each element is name, function, flags,"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1090
+msgid ""
+"   long-doc, short-doc.  The long-doc field contains a pointer to an array"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1091
+msgid ""
+"   of help lines.  The function takes a WORD_LIST *; the first word in the"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1092
+msgid "   list is the first arg to the command.  The list has already had word"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1093
+msgid "   expansion performed."
+msgstr ""
+
+#: builtins/mkbuiltins.c:1095
+msgid "   Functions which need to look at only the simple commands (e.g."
+msgstr ""
+
+#: builtins/mkbuiltins.c:1096
+msgid "   the enable_builtin ()), should ignore entries where"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1097
+msgid ""
+"   (array[i].function == (sh_builtin_func_t *)NULL).  Such entries are for"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1098
+msgid ""
+"   the list of shell reserved control structures, like `if' and `while'."
+msgstr ""
+
+#: builtins/mkbuiltins.c:1099
+msgid "   The end of the list is denoted with a NULL name field. */"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1101
+msgid "#include \"../builtins.h\""
+msgstr ""
+
+#: builtins/mkbuiltins.c:1106
+msgid ""
+"  { (char *)0x0, (sh_builtin_func_t *)0x0, 0, (char **)0x0, (char *)0x0 }"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1107
+msgid "};"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1109
+msgid "struct builtin *shell_builtins = static_shell_builtins;"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1110
+msgid "struct builtin *current_builtin;"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1112
+msgid "int num_shell_builtins ="
+msgstr ""
+
+#: builtins/mkbuiltins.c:1113
+msgid "\tsizeof (static_shell_builtins) / sizeof (struct builtin) - 1;"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1130
+#, c-format
+msgid "#include \"%s\"\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1131 builtins/mkbuiltins.c:1138
+msgid "builtext.h"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1132
+msgid ""
+"\n"
+"struct builtin static_shell_builtins[] = {\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1137
+#, c-format
+msgid "/* %s - The list of builtins found in libbuiltins.a. */\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1188
+#, c-format
+msgid "extern int %s __P((WORD_LIST *));\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1191
+#, c-format
+msgid "extern char * const %s_doc[];\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1198
+#, c-format
+msgid "  { \"%s\", "
+msgstr ""
+
+#: builtins/mkbuiltins.c:1201
+#, c-format
+msgid "%s, "
+msgstr ""
+
+#: builtins/mkbuiltins.c:1203
+msgid "(sh_builtin_func_t *)0x0, "
+msgstr ""
+
+#: builtins/mkbuiltins.c:1205
+#, c-format
+msgid "%s%s%s, %s_doc,\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1206
+msgid "BUILTIN_ENABLED | STATIC_BUILTIN"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1207
+msgid " | SPECIAL_BUILTIN"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1208
+msgid " | ASSIGNMENT_BUILTIN"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1212
+#, c-format
+msgid "     \"%s\", (char *)NULL },\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1235
+#, c-format
+msgid "@item %s\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1263
+#, c-format
+msgid "char * const %s_doc[] ="
+msgstr ""
+
+#: builtins/mkbuiltins.c:1269 lib/sh/mailstat.c:126
+#, c-format
+msgid "%s/%s"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1299
+msgid "#if "
+msgstr ""
+
+#: builtins/mkbuiltins.c:1306
+#, c-format
+msgid "!defined (%s)"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1308
+#, c-format
+msgid "defined (%s)"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1330
+msgid "#endif /* "
+msgstr ""
+
+#: builtins/mkbuiltins.c:1340
+msgid " */\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1360
+msgid ""
+" {\n"
+"#if defined (HELP_BUILTIN)\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1373
+msgid "  \""
+msgstr ""
+
+#: builtins/mkbuiltins.c:1387
+#, c-format
+msgid "\\%c"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1391 builtins/mkbuiltins.c:1410
+#, c-format
+msgid "%c"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1395
+msgid "\",\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1406
+#, c-format
+msgid "@%c"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1420
+msgid ""
+"#endif /* HELP_BUILTIN */\n"
+"  (char *)NULL\n"
+"};\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1432
+msgid "helpfiles"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1435
+msgid "write_helpfiles: helpfiles: cannot create directory\n"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1439
+msgid "helpfiles/"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1446
+#, c-format
+msgid "helpfiles/%s"
+msgstr ""
+
+#: builtins/mkbuiltins.c:1451
+#, c-format
+msgid "write_helpfiles: cannot open %s\n"
+msgstr ""
+
+#: builtins/alias.def:2
+msgid "unalias"
+msgstr ""
+
+#: builtins/alias.def:73
+msgid "p"
+msgstr ""
+
+#: builtins/alias.def:160
+msgid "a"
+msgstr ""
+
+#: builtins/alias.def:210
+msgid "alias "
+msgstr ""
+
+#: builtins/bind.def:2
+msgid "bind"
+msgstr ""
+
+#: builtins/bind.def:121 builtins/bind.def:265
+msgid "bind_builtin"
+msgstr ""
+
+#: builtins/bind.def:127
+msgid "lvpVPsSf:q:u:m:r:x:"
+msgstr ""
+
+#: builtins/bind.def:192
+#, c-format
+msgid "`%s': invalid keymap name"
+msgstr ""
+
+#: builtins/bind.def:231
+#, c-format
+msgid "%s: cannot read: %s"
+msgstr ""
+
+#: builtins/bind.def:246
+#, c-format
+msgid "`%s': cannot unbind"
+msgstr ""
+
+#: builtins/bind.def:281 builtins/bind.def:311
+#, c-format
+msgid "`%s': unknown function name"
+msgstr ""
+
+#: builtins/bind.def:289
+#, c-format
+msgid "%s is not bound to any keys.\n"
+msgstr ""
+
+#: builtins/bind.def:293
+#, c-format
+msgid "%s can be invoked via "
+msgstr ""
+
+#: builtins/bind.def:295
+#, c-format
+msgid "\"%s\"%s"
+msgstr ""
+
+#: builtins/bind.def:295 builtins/help.def:106
+msgid ", "
+msgstr ""
+
+#: builtins/bind.def:295
+msgid ".\n"
+msgstr ""
+
+#: builtins/bind.def:297
+msgid "...\n"
+msgstr ""
+
+#: builtins/break.def:71 builtins/break.def:106
+msgid "loop count"
+msgstr ""
+
+#: builtins/break.def:126
+msgid "only meaningful in a `for', `while', or `until' loop"
+msgstr ""
+
+#: builtins/builtin.def:2 builtins/complete.def:81 builtins/type.def:294
+msgid "builtin"
+msgstr ""
+
+#: builtins/caller.def:2 builtins/caller.def:138
+msgid "caller"
+msgstr ""
+
+#: builtins/caller.def:31
+msgid "$line $filename"
+msgstr ""
+
+#: builtins/caller.def:32
+msgid "$line $subroutine $filename"
+msgstr ""
+
+#: builtins/caller.def:70
+msgid "1 NULL\n"
+msgstr ""
+
+#: builtins/caller.def:94
+#, c-format
+msgid "%s %s\n"
+msgstr ""
+
+#: builtins/caller.def:110
+#, c-format
+msgid "%s %s %s\n"
+msgstr ""
+
+#: builtins/caller.def:126
+msgid "Returns the context of the current subroutine call."
+msgstr ""
+
+#: builtins/caller.def:128
+msgid "Without EXPR, returns returns \"$line $filename\".  With EXPR,"
+msgstr ""
+
+#: builtins/caller.def:129
+msgid "returns \"$line $subroutine $filename\"; this extra information"
+msgstr ""
+
+#: builtins/caller.def:130
+msgid "can be used used to provide a stack trace."
+msgstr ""
+
+#: builtins/caller.def:132
+msgid "The value of EXPR indicates how many call frames to go back before the"
+msgstr ""
+
+#: builtins/caller.def:133
+msgid "current one; the top frame is frame 0."
+msgstr ""
+
+#: builtins/caller.def:142
+msgid "caller [EXPR]"
+msgstr ""
+
+#: builtins/cd.def:2 builtins/cd.def:96 builtins/cd.def:130
+msgid "cd"
+msgstr ""
+
+#: builtins/cd.def:2 builtins/cd.def:338
+msgid "pwd"
+msgstr ""
+
+#: builtins/cd.def:105
+msgid "OLDPWD="
+msgstr ""
+
+#: builtins/cd.def:112
+msgid "PWD="
+msgstr ""
+
+#: builtins/cd.def:160 builtins/cd.def:318
+msgid "LP"
+msgstr ""
+
+#: builtins/cd.def:187
+msgid "HOME not set"
+msgstr ""
+
+#: builtins/cd.def:199
+msgid "OLDPWD not set"
+msgstr ""
+
+#: builtins/cd.def:210
+msgid "CDPATH"
+msgstr ""
+
+#: builtins/cd.def:349
+#, c-format
+msgid "write error: %s"
+msgstr ""
+
+#: builtins/cd.def:378
+msgid "chdir"
+msgstr ""
+
+#: builtins/command.def:29
+msgid "command ls"
+msgstr ""
+
+#: builtins/command.def:73
+msgid "pvV"
+msgstr ""
+
+#: builtins/command.def:120 builtins/command.def:160
+msgid "command_builtin"
+msgstr ""
+
+#: builtins/complete.def:2
+msgid "complete"
+msgstr ""
+
+#: builtins/complete.def:2 builtins/complete.def:589
+msgid "compgen"
+msgstr ""
+
+#: builtins/complete.def:79 builtins/complete.def:458
+msgid "arrayvar"
+msgstr ""
+
+#: builtins/complete.def:80 builtins/complete.def:459
+msgid "binding"
+msgstr ""
+
+#: builtins/complete.def:83
+msgid "directory"
+msgstr ""
+
+#: builtins/complete.def:84 builtins/complete.def:460
+msgid "disabled"
+msgstr ""
+
+#: builtins/complete.def:85 builtins/complete.def:461
+msgid "enabled"
+msgstr ""
+
+#: builtins/complete.def:87 builtins/type.def:315 builtins/type.def:335
+#: builtins/type.def:380
+msgid "file"
+msgstr ""
+
+#: builtins/complete.def:89 builtins/complete.def:463
+msgid "helptopic"
+msgstr ""
+
+#: builtins/complete.def:90 builtins/complete.def:464
+msgid "hostname"
+msgstr ""
+
+#: builtins/complete.def:91
+msgid "group"
+msgstr ""
+
+#: builtins/complete.def:92
+msgid "job"
+msgstr ""
+
+#: builtins/complete.def:93 builtins/set.def:193 builtins/type.def:249
+msgid "keyword"
+msgstr ""
+
+#: builtins/complete.def:94 builtins/complete.def:465
+msgid "running"
+msgstr ""
+
+#: builtins/complete.def:95
+msgid "service"
+msgstr ""
+
+#: builtins/complete.def:96 builtins/complete.def:466
+msgid "setopt"
+msgstr ""
+
+#: builtins/complete.def:97 builtins/complete.def:467
+msgid "shopt"
+msgstr ""
+
+#: builtins/complete.def:98 builtins/complete.def:468
+msgid "signal"
+msgstr ""
+
+#: builtins/complete.def:99 builtins/complete.def:469
+msgid "stopped"
+msgstr ""
+
+#: builtins/complete.def:100
+msgid "user"
+msgstr ""
+
+#: builtins/complete.def:101 builtins/set.def:787
+msgid "variable"
+msgstr ""
+
+#: builtins/complete.def:110 builtins/complete.def:434
+msgid "bashdefault"
+msgstr ""
+
+#: builtins/complete.def:111 builtins/complete.def:435
+msgid "default"
+msgstr ""
+
+#: builtins/complete.def:112 builtins/complete.def:436
+msgid "dirnames"
+msgstr ""
+
+#: builtins/complete.def:113 builtins/complete.def:437
+msgid "filenames"
+msgstr ""
+
+#: builtins/complete.def:114 builtins/complete.def:438
+msgid "nospace"
+msgstr ""
+
+#: builtins/complete.def:115 builtins/complete.def:439
+msgid "plusdirs"
+msgstr ""
+
+#: builtins/complete.def:170
+msgid "abcdefgjko:prsuvA:G:W:P:S:X:F:C:"
+msgstr ""
+
+#: builtins/complete.def:183
+msgid "-r"
+msgstr ""
+
+#: builtins/complete.def:250
+#, c-format
+msgid "%s: invalid action name"
+msgstr ""
+
+#: builtins/complete.def:380 builtins/complete.def:523
+#, c-format
+msgid "%s: no completion specification"
+msgstr ""
+
+#: builtins/complete.def:392 builtins/complete.def:400
+#, c-format
+msgid "%s %s "
+msgstr ""
+
+#: builtins/complete.def:412
+#, c-format
+msgid "-A %s "
+msgstr ""
+
+#: builtins/complete.def:418
+#, c-format
+msgid "-o %s "
+msgstr ""
+
+#: builtins/complete.def:429
+msgid "complete "
+msgstr ""
+
+#: builtins/complete.def:444
+msgid "-a"
+msgstr ""
+
+#: builtins/complete.def:445
+msgid "-b"
+msgstr ""
+
+#: builtins/complete.def:447
+msgid "-d"
+msgstr ""
+
+#: builtins/complete.def:448
+msgid "-e"
+msgstr ""
+
+#: builtins/complete.def:449
+msgid "-f"
+msgstr ""
+
+#: builtins/complete.def:450
+msgid "-g"
+msgstr ""
+
+#: builtins/complete.def:451
+msgid "-j"
+msgstr ""
+
+#: builtins/complete.def:452
+msgid "-k"
+msgstr ""
+
+#: builtins/complete.def:453 builtins/shopt.def:325
+msgid "-s"
+msgstr ""
+
+#: builtins/complete.def:454 builtins/shopt.def:325
+msgid "-u"
+msgstr ""
+
+#: builtins/complete.def:455
+msgid "-v"
+msgstr ""
+
+#: builtins/complete.def:474
+msgid "-G"
+msgstr ""
+
+#: builtins/complete.def:475
+msgid "-W"
+msgstr ""
+
+#: builtins/complete.def:476
+msgid "-P"
+msgstr ""
+
+#: builtins/complete.def:477
+msgid "-S"
+msgstr ""
+
+#: builtins/complete.def:478
+msgid "-X"
+msgstr ""
+
+#: builtins/complete.def:481
+msgid "-F"
+msgstr ""
+
+#: builtins/complete.def:482
+msgid "-C"
+msgstr ""
+
+#: builtins/complete.def:570
+msgid "warning: -F option may not work as you expect"
+msgstr ""
+
+#: builtins/complete.def:572
+msgid "warning: -C option may not work as you expect"
+msgstr ""
+
+#: builtins/declare.def:104
+msgid "can only be used in a function"
+msgstr ""
+
+#: builtins/declare.def:110
+msgid "+afiprtxF"
+msgstr ""
+
+#: builtins/declare.def:112
+msgid "+fiprtxF"
+msgstr ""
+
+#: builtins/declare.def:294
+msgid "cannot use `-f' to make functions"
+msgstr ""
+
+#: builtins/declare.def:319
+#, c-format
+msgid "%s %d %s\n"
+msgstr ""
+
+#: builtins/declare.def:388
+#, c-format
+msgid "%s: cannot destroy array variables in this way"
+msgstr ""
+
+#: builtins/echo.def:2
+msgid "echo"
+msgstr ""
+
+#: builtins/echo.def:65
+msgid "neE"
+msgstr ""
+
+#: builtins/echo.def:67
+msgid "n"
+msgstr ""
+
+#: builtins/enable.def:2
+msgid "enable"
+msgstr ""
+
+#: builtins/enable.def:104
+msgid "adnpsf:"
+msgstr ""
+
+#: builtins/enable.def:126 builtins/enable.def:134
+msgid "dynamic loading not available"
+msgstr ""
+
+#: builtins/enable.def:227
+#, c-format
+msgid "enable %s\n"
+msgstr ""
+
+#: builtins/enable.def:230
+#, c-format
+msgid "enable -n %s\n"
+msgstr ""
+
+#: builtins/enable.def:301
+#, c-format
+msgid "cannot open shared object %s: %s"
+msgstr ""
+
+#: builtins/enable.def:319
+msgid "_struct"
+msgstr ""
+
+#: builtins/enable.def:324
+#, c-format
+msgid "cannot find %s in shared object %s: %s"
+msgstr ""
+
+#: builtins/enable.def:448
+#, c-format
+msgid "%s: not dynamically loaded"
+msgstr ""
+
+#: builtins/enable.def:463
+#, c-format
+msgid "%s: cannot delete: %s"
+msgstr ""
+
+#: builtins/exec.def:100
+msgid "cla:"
+msgstr ""
+
+#: builtins/exec.def:204
+#, c-format
+msgid "%s: cannot execute: %s"
+msgstr ""
+
+#: builtins/exit.def:61
+msgid "logout\n"
+msgstr ""
+
+#: builtins/exit.def:61
+msgid "exit\n"
+msgstr ""
+
+#: builtins/exit.def:81
+msgid "not login shell: use `exit'"
+msgstr ""
+
+#: builtins/exit.def:109
+msgid "There are stopped jobs.\n"
+msgstr ""
+
+#: builtins/exit.def:145
+msgid "~/.bash_logout"
+msgstr ""
+
+#: builtins/fc.def:2 builtins/fc.def:269 builtins/fc.def:370
+msgid "fc"
+msgstr ""
+
+#: builtins/fc.def:157
+msgid "${FCEDIT:-${EDITOR:-vi}}"
+msgstr ""
+
+#: builtins/fc.def:181
+msgid ":e:lnrs"
+msgstr ""
+
+#: builtins/fc.def:252
+msgid "no command found"
+msgstr ""
+
+#: builtins/fc.def:317
+msgid "history specification"
+msgstr ""
+
+#: builtins/fc.def:335
+msgid "bash-fc"
+msgstr ""
+
+#: builtins/fc.def:338
+#, c-format
+msgid "cannot open temp file %s"
+msgstr ""
+
+#: builtins/fc.def:350
+#, c-format
+msgid "\t%c"
+msgstr ""
+
+#: builtins/fc.def:363 builtins/fc.def:368
+#, c-format
+msgid "%s %s"
+msgstr ""
+
+#: builtins/fc.def:386 builtins/fc.def:394
+msgid "fc builtin"
+msgstr ""
+
+#: builtins/fg_bg.def:123 builtins/jobs.def:264
+msgid "current"
+msgstr ""
+
+#: builtins/fg_bg.def:131
+#, c-format
+msgid "job %%%d started without job control"
+msgstr ""
+
+#: builtins/getopts.def:2
+msgid "getopts"
+msgstr ""
+
+#: builtins/getopts.def:248 builtins/getopts.def:255 builtins/getopts.def:282
+#: lib/sh/strftime.c:235 lib/sh/strftime.c:242 lib/sh/strftime.c:250
+#: lib/sh/strftime.c:257
+msgid "?"
+msgstr ""
+
+#: builtins/getopts.def:261 builtins/getopts.def:264 builtins/getopts.def:278
+#: builtins/getopts.def:283 builtins/getopts.def:288
+msgid "OPTARG"
+msgstr ""
+
+#: builtins/hash.def:2
+msgid "hash"
+msgstr ""
+
+#: builtins/hash.def:82
+msgid "hashing disabled"
+msgstr ""
+
+#: builtins/hash.def:89
+msgid "dlp:rt"
+msgstr ""
+
+#: builtins/hash.def:118
+msgid "-t"
+msgstr ""
+
+#: builtins/hash.def:127
+#, c-format
+msgid "%s: hash table empty\n"
+msgstr ""
+
+#: builtins/hash.def:210
+#, c-format
+msgid "%4d\t%s\n"
+msgstr ""
+
+#: builtins/hash.def:218 builtins/hash.def:257
+#, c-format
+msgid "builtin hash -p %s %s\n"
+msgstr ""
+
+#: builtins/hash.def:230
+msgid "hits\tcommand\n"
+msgstr ""
+
+#: builtins/hash.def:261
+#, c-format
+msgid "%s\t"
+msgstr ""
+
+#: builtins/help.def:80 builtins/help.def:105
+msgid "s"
+msgstr ""
+
+#: builtins/help.def:105
+#, c-format
+msgid "Shell commands matching keyword%s `"
+msgstr ""
+
+#: builtins/help.def:107
+msgid ""
+"'\n"
+"\n"
+msgstr ""
+
+#: builtins/help.def:121
+#, c-format
+msgid "%s: %s\n"
+msgstr ""
+
+#: builtins/help.def:133
+#, c-format
+msgid ""
+"no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."
+msgstr ""
+
+#: builtins/help.def:159
+#, c-format
+msgid "%s: cannot open: %s"
+msgstr ""
+
+#: builtins/help.def:167
+#, c-format
+msgid "    %s\n"
+msgstr ""
+
+#: builtins/help.def:177
+msgid ""
+"These shell commands are defined internally.  Type `help' to see this list.\n"
+"Type `help name' to find out more about the function `name'.\n"
+"Use `info bash' to find out more about the shell in general.\n"
+"Use `man -k' or `info' to find out more about commands not in this list.\n"
+"\n"
+"A star (*) next to a name means that the command is disabled.\n"
+"\n"
+msgstr ""
+
+#: builtins/history.def:2 builtins/set.def:189
+msgid "history"
+msgstr ""
+
+#: builtins/history.def:106
+msgid "acd:npsrw"
+msgstr ""
+
+#: builtins/history.def:147
+msgid "cannot use more than one of -anrw"
+msgstr ""
+
+#: builtins/history.def:179
+msgid "history position"
+msgstr ""
+
+#: builtins/history.def:289
+#, c-format
+msgid "%5d%c %s%s\n"
+msgstr ""
+
+#: builtins/history.def:389
+#, c-format
+msgid "%s: history expansion failed"
+msgstr ""
+
+#: builtins/inlib.def:2
+msgid "inlib"
+msgstr ""
+
+#: builtins/inlib.def:67
+#, c-format
+msgid "%s: inlib failed"
+msgstr ""
+
+#: builtins/jobs.def:2
+msgid "jobs"
+msgstr ""
+
+#: builtins/jobs.def:2
+msgid "disown"
+msgstr ""
+
+#: builtins/jobs.def:85
+msgid "lpnxrs"
+msgstr ""
+
+#: builtins/jobs.def:101
+msgid "no other options allowed with `-x'"
+msgstr ""
+
+#: builtins/jobs.def:185 builtins/jobs.def:197
+msgid "jobs_builtin"
+msgstr ""
+
+#: builtins/jobs.def:224
+msgid "ahr"
+msgstr ""
+
+#: builtins/kill.def:2
+msgid "kill"
+msgstr ""
+
+#: builtins/kill.def:186
+#, c-format
+msgid "%s: arguments must be process or job IDs"
+msgstr ""
+
+#: builtins/kill.def:247
+msgid "Unknown error"
+msgstr ""
+
+#: builtins/kill.def:248
+#, c-format
+msgid "(%ld) - %s"
+msgstr ""
+
+#: builtins/let.def:2
+msgid "let"
+msgstr ""
+
+#: builtins/printf.def:2
+msgid "printf"
+msgstr ""
+
+#: builtins/printf.def:66
+msgid "<PRIdMAX>lld"
+msgstr ""
+
+#: builtins/printf.def:68
+msgid "<PRIdMAX>ld"
+msgstr ""
+
+#: builtins/printf.def:103
+msgid "#'-+ 0"
+msgstr ""
+
+#: builtins/printf.def:104
+msgid "hjlLtz"
+msgstr ""
+
+#: builtins/printf.def:119
+msgid "L"
+msgstr ""
+
+#: builtins/printf.def:248
+#, c-format
+msgid "`%s': missing format character"
+msgstr ""
+
+#: builtins/printf.def:346 builtins/printf.def:373
+msgid "<PRIdMAX>"
+msgstr ""
+
+#: builtins/printf.def:355 builtins/printf.def:378
+msgid "l"
+msgstr ""
+
+#: builtins/printf.def:407
+#, c-format
+msgid "`%c': invalid format character"
+msgstr ""
+
+#: builtins/printf.def:427
+#, c-format
+msgid "warning: %s: %s"
+msgstr ""
+
+#: builtins/printf.def:504
+#, c-format
+msgid "format parsing problem: %s"
+msgstr ""
+
+#: builtins/printf.def:600
+msgid "missing hex digit for \\x"
+msgstr ""
+
+#: builtins/pushd.def:2 builtins/pushd.def:171 builtins/pushd.def:230
+#: builtins/pushd.def:263 builtins/pushd.def:715
+msgid "pushd"
+msgstr ""
+
+#: builtins/pushd.def:2 builtins/pushd.def:724
+msgid "popd"
+msgstr ""
+
+#: builtins/pushd.def:2 builtins/pushd.def:432 builtins/pushd.def:733
+msgid "dirs"
+msgstr ""
+
+#: builtins/pushd.def:167
+msgid "no other directory"
+msgstr ""
+
+#: builtins/pushd.def:434
+msgid "<no current directory>"
+msgstr ""
+
+#: builtins/pushd.def:436 builtins/pushd.def:455
+#, c-format
+msgid "%2d  %s"
+msgstr ""
+
+#: builtins/pushd.def:463
+#, c-format
+msgid ""
+"\n"
+"%2d  %s"
+msgstr ""
+
+#: builtins/pushd.def:478
+msgid "directory stack empty"
+msgstr ""
+
+#: builtins/pushd.def:480
+msgid "directory stack index"
+msgstr ""
+
+#: builtins/pushd.def:625
+msgid "dirstack"
+msgstr ""
+
+#: builtins/pushd.def:651
+msgid "Display the list of currently remembered directories.  Directories"
+msgstr ""
+
+#: builtins/pushd.def:652
+msgid "find their way onto the list with the `pushd' command; you can get"
+msgstr ""
+
+#: builtins/pushd.def:653
+msgid "back up through the list with the `popd' command."
+msgstr ""
+
+#: builtins/pushd.def:655
+msgid "The -l flag specifies that `dirs' should not print shorthand versions"
+msgstr ""
+
+#: builtins/pushd.def:656
+msgid "of directories which are relative to your home directory.  This means"
+msgstr ""
+
+#: builtins/pushd.def:657
+msgid "that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag"
+msgstr ""
+
+#: builtins/pushd.def:658
+msgid "causes `dirs' to print the directory stack with one entry per line,"
+msgstr ""
+
+#: builtins/pushd.def:659
+msgid "prepending the directory name with its position in the stack.  The -p"
+msgstr ""
+
+#: builtins/pushd.def:660
+msgid "flag does the same thing, but the stack position is not prepended."
+msgstr ""
+
+#: builtins/pushd.def:661
+msgid "The -c flag clears the directory stack by deleting all of the elements."
+msgstr ""
+
+#: builtins/pushd.def:663
+msgid "+N   displays the Nth entry counting from the left of the list shown by"
+msgstr ""
+
+#: builtins/pushd.def:664 builtins/pushd.def:667
+msgid "     dirs when invoked without options, starting with zero."
+msgstr ""
+
+#: builtins/pushd.def:666
+msgid ""
+"-N   displays the Nth entry counting from the right of the list shown by"
+msgstr ""
+
+#: builtins/pushd.def:672
+msgid "Adds a directory to the top of the directory stack, or rotates"
+msgstr ""
+
+#: builtins/pushd.def:673
+msgid "the stack, making the new top of the stack the current working"
+msgstr ""
+
+#: builtins/pushd.def:674
+msgid "directory.  With no arguments, exchanges the top two directories."
+msgstr ""
+
+#: builtins/pushd.def:676
+msgid "+N   Rotates the stack so that the Nth directory (counting"
+msgstr ""
+
+#: builtins/pushd.def:677
+msgid "     from the left of the list shown by `dirs', starting with"
+msgstr ""
+
+#: builtins/pushd.def:678 builtins/pushd.def:682
+msgid "     zero) is at the top."
+msgstr ""
+
+#: builtins/pushd.def:680
+msgid "-N   Rotates the stack so that the Nth directory (counting"
+msgstr ""
+
+#: builtins/pushd.def:681
+msgid "     from the right of the list shown by `dirs', starting with"
+msgstr ""
+
+#: builtins/pushd.def:684
+msgid "-n   suppress the normal change of directory when adding directories"
+msgstr ""
+
+#: builtins/pushd.def:685
+msgid "     to the stack, so only the stack is manipulated."
+msgstr ""
+
+#: builtins/pushd.def:687
+msgid "dir  adds DIR to the directory stack at the top, making it the"
+msgstr ""
+
+#: builtins/pushd.def:688
+msgid "     new current working directory."
+msgstr ""
+
+#: builtins/pushd.def:690 builtins/pushd.def:710
+msgid "You can see the directory stack with the `dirs' command."
+msgstr ""
+
+#: builtins/pushd.def:695
+msgid "Removes entries from the directory stack.  With no arguments,"
+msgstr ""
+
+#: builtins/pushd.def:696
+msgid "removes the top directory from the stack, and cd's to the new"
+msgstr ""
+
+#: builtins/pushd.def:697
+msgid "top directory."
+msgstr ""
+
+#: builtins/pushd.def:699
+msgid "+N   removes the Nth entry counting from the left of the list"
+msgstr ""
+
+#: builtins/pushd.def:700
+msgid "     shown by `dirs', starting with zero.  For example: `popd +0'"
+msgstr ""
+
+#: builtins/pushd.def:701
+msgid "     removes the first directory, `popd +1' the second."
+msgstr ""
+
+#: builtins/pushd.def:703
+msgid "-N   removes the Nth entry counting from the right of the list"
+msgstr ""
+
+#: builtins/pushd.def:704
+msgid "     shown by `dirs', starting with zero.  For example: `popd -0'"
+msgstr ""
+
+#: builtins/pushd.def:705
+msgid "     removes the last directory, `popd -1' the next to last."
+msgstr ""
+
+#: builtins/pushd.def:707
+msgid "-n   suppress the normal change of directory when removing directories"
+msgstr ""
+
+#: builtins/pushd.def:708
+msgid "     from the stack, so only the stack is manipulated."
+msgstr ""
+
+#: builtins/pushd.def:719
+msgid "pushd [+N | -N] [-n] [dir]"
+msgstr ""
+
+#: builtins/pushd.def:728
+msgid "popd [+N | -N] [-n]"
+msgstr ""
+
+#: builtins/pushd.def:737
+msgid "dirs [-clpv] [+N] [-N]"
+msgstr ""
+
+#: builtins/read.def:2
+msgid "read"
+msgstr ""
+
+#: builtins/read.def:178
+msgid "ersa:d:n:p:t:u:"
+msgstr ""
+
+#: builtins/read.def:205
+#, c-format
+msgid "%s: invalid timeout specification"
+msgstr ""
+
+#: builtins/read.def:228
+#, c-format
+msgid "%s: invalid file descriptor specification"
+msgstr ""
+
+#: builtins/read.def:235
+#, c-format
+msgid "%d: invalid file descriptor: %s"
+msgstr ""
+
+#: builtins/read.def:272 builtins/read.def:317 builtins/read.def:491
+msgid "read_builtin"
+msgstr ""
+
+#: builtins/read.def:461
+#, c-format
+msgid "read error: %d: %s"
+msgstr ""
+
+#: builtins/reserved.def:123
+msgid "let EXPRESSION"
+msgstr ""
+
+#: builtins/return.def:61
+msgid "can only `return' from a function or sourced script"
+msgstr ""
+
+#: builtins/set.def:161 builtins/shopt.def:170
+msgid "on"
+msgstr ""
+
+#: builtins/set.def:162 builtins/shopt.def:171
+msgid "off"
+msgstr ""
+
+#: builtins/set.def:174
+msgid "allexport"
+msgstr ""
+
+#: builtins/set.def:176
+msgid "braceexpand"
+msgstr ""
+
+#: builtins/set.def:181
+msgid "errexit"
+msgstr ""
+
+#: builtins/set.def:182
+msgid "errtrace"
+msgstr ""
+
+#: builtins/set.def:183
+msgid "functrace"
+msgstr ""
+
+#: builtins/set.def:184
+msgid "hashall"
+msgstr ""
+
+#: builtins/set.def:186
+msgid "histexpand"
+msgstr ""
+
+#: builtins/set.def:192
+msgid "interactive-comments"
+msgstr ""
+
+#: builtins/set.def:194
+msgid "monitor"
+msgstr ""
+
+#: builtins/set.def:195
+msgid "noclobber"
+msgstr ""
+
+#: builtins/set.def:196
+msgid "noexec"
+msgstr ""
+
+#: builtins/set.def:197
+msgid "noglob"
+msgstr ""
+
+#: builtins/set.def:199
+msgid "nolog"
+msgstr ""
+
+#: builtins/set.def:202
+msgid "notify"
+msgstr ""
+
+#: builtins/set.def:204
+msgid "nounset"
+msgstr ""
+
+#: builtins/set.def:205
+msgid "onecmd"
+msgstr ""
+
+#: builtins/set.def:206
+msgid "physical"
+msgstr ""
+
+#: builtins/set.def:207
+msgid "pipefail"
+msgstr ""
+
+#: builtins/set.def:209
+msgid "privileged"
+msgstr ""
+
+#: builtins/set.def:212
+msgid "vi"
+msgstr ""
+
+#: builtins/set.def:214
+msgid "xtrace"
+msgstr ""
+
+#: builtins/set.def:252 builtins/shopt.def:56
+#, c-format
+msgid "%-15s\t%s\n"
+msgstr ""
+
+#: builtins/set.def:262 builtins/shopt.def:414
+#, c-format
+msgid "set %co %s\n"
+msgstr ""
+
+#: builtins/set.def:313
+msgid "10"
+msgstr ""
+
+#: builtins/set.def:345
+msgid "editing-mode"
+msgstr ""
+
+#: builtins/set.def:493 builtins/set.def:505 builtins/set.def:541
+msgid "SHELLOPTS"
+msgstr ""
+
+#: builtins/set.def:722
+msgid "fv"
+msgstr ""
+
+#: builtins/set.def:742
+msgid "cannot simultaneously unset a function and a variable"
+msgstr ""
+
+#: builtins/set.def:779
+#, c-format
+msgid "%s: cannot unset"
+msgstr ""
+
+#: builtins/set.def:786
+#, c-format
+msgid "%s: cannot unset: readonly %s"
+msgstr ""
+
+#: builtins/set.def:797
+#, c-format
+msgid "%s: not an array variable"
+msgstr ""
+
+#: builtins/setattr.def:98
+msgid "afnp"
+msgstr ""
+
+#: builtins/setattr.def:100
+msgid "fnp"
+msgstr ""
+
+#: builtins/setattr.def:164
+#, c-format
+msgid "%s: not a function"
+msgstr ""
+
+#: builtins/setattr.def:201
+msgid "-ra"
+msgstr ""
+
+#: builtins/setattr.def:332
+#, c-format
+msgid "declare -%s "
+msgstr ""
+
+#: builtins/setattr.def:334
+#, c-format
+msgid "%s -%s "
+msgstr ""
+
+#: builtins/shift.def:65 builtins/shift.def:71
+msgid "shift count"
+msgstr ""
+
+#: builtins/shopt.def:115
+msgid "cdable_vars"
+msgstr ""
+
+#: builtins/shopt.def:116
+msgid "cdspell"
+msgstr ""
+
+#: builtins/shopt.def:117
+msgid "checkhash"
+msgstr ""
+
+#: builtins/shopt.def:118
+msgid "checkwinsize"
+msgstr ""
+
+#: builtins/shopt.def:120
+msgid "cmdhist"
+msgstr ""
+
+#: builtins/shopt.def:122
+msgid "dotglob"
+msgstr ""
+
+#: builtins/shopt.def:123
+msgid "execfail"
+msgstr ""
+
+#: builtins/shopt.def:124
+msgid "expand_aliases"
+msgstr ""
+
+#: builtins/shopt.def:126
+msgid "extdebug"
+msgstr ""
+
+#: builtins/shopt.def:129
+msgid "extglob"
+msgstr ""
+
+#: builtins/shopt.def:131
+msgid "extquote"
+msgstr ""
+
+#: builtins/shopt.def:132
+msgid "failglob"
+msgstr ""
+
+#: builtins/shopt.def:134
+msgid "force_fignore"
+msgstr ""
+
+#: builtins/shopt.def:135
+msgid "gnu_errfmt"
+msgstr ""
+
+#: builtins/shopt.def:136
+msgid "histreedit"
+msgstr ""
+
+#: builtins/shopt.def:139
+msgid "histappend"
+msgstr ""
+
+#: builtins/shopt.def:142
+msgid "histverify"
+msgstr ""
+
+#: builtins/shopt.def:143
+msgid "hostcomplete"
+msgstr ""
+
+#: builtins/shopt.def:145
+msgid "huponexit"
+msgstr ""
+
+#: builtins/shopt.def:146
+msgid "interactive_comments"
+msgstr ""
+
+#: builtins/shopt.def:148
+msgid "lithist"
+msgstr ""
+
+#: builtins/shopt.def:150
+msgid "login_shell"
+msgstr ""
+
+#: builtins/shopt.def:151
+msgid "mailwarn"
+msgstr ""
+
+#: builtins/shopt.def:153
+msgid "no_empty_cmd_completion"
+msgstr ""
+
+#: builtins/shopt.def:155
+msgid "nocaseglob"
+msgstr ""
+
+#: builtins/shopt.def:156
+msgid "nullglob"
+msgstr ""
+
+#: builtins/shopt.def:158
+msgid "progcomp"
+msgstr ""
+
+#: builtins/shopt.def:160
+msgid "promptvars"
+msgstr ""
+
+#: builtins/shopt.def:162
+msgid "restricted_shell"
+msgstr ""
+
+#: builtins/shopt.def:164
+msgid "shift_verbose"
+msgstr ""
+
+#: builtins/shopt.def:165
+msgid "sourcepath"
+msgstr ""
+
+#: builtins/shopt.def:166
+msgid "xpg_echo"
+msgstr ""
+
+#: builtins/shopt.def:196
+msgid "psuoq"
+msgstr ""
+
+#: builtins/shopt.def:224
+msgid "cannot set and unset shell options simultaneously"
+msgstr ""
+
+#: builtins/shopt.def:289
+#, c-format
+msgid "%s: invalid shell option name"
+msgstr ""
+
+#: builtins/shopt.def:325
+#, c-format
+msgid "shopt %s %s\n"
+msgstr ""
+
+#: builtins/source.def:116
+msgid "filename argument required"
+msgstr ""
+
+#: builtins/source.def:136
+#, c-format
+msgid "%s: file not found"
+msgstr ""
+
+#: builtins/suspend.def:2
+msgid "suspend"
+msgstr ""
+
+#: builtins/suspend.def:77
+msgid "f"
+msgstr ""
+
+#: builtins/suspend.def:92
+msgid "cannot suspend"
+msgstr ""
+
+#: builtins/suspend.def:102
+msgid "cannot suspend a login shell"
+msgstr ""
+
+#: builtins/test.def:2 builtins/test.def:98
+msgid "test"
+msgstr ""
+
+#: builtins/times.def:2
+msgid "times"
+msgstr ""
+
+#: builtins/times.def:109
+msgid ""
+"0.00 0.00\n"
+"0.00 0.00\n"
+msgstr ""
+
+#: builtins/trap.def:39
+msgid "kill -signal $$"
+msgstr ""
+
+#: builtins/trap.def:94
+msgid "lp"
+msgstr ""
+
+#: builtins/trap.def:215
+#, c-format
+msgid "trap -- %s %d\n"
+msgstr ""
+
+#: builtins/trap.def:219 builtins/trap.def:221 builtins/trap.def:224
+#, c-format
+msgid "trap -- %s %s\n"
+msgstr ""
+
+#: builtins/type.def:2 builtins/type.def:127
+msgid "type"
+msgstr ""
+
+#: builtins/type.def:127
+msgid "-type"
+msgstr ""
+
+#: builtins/type.def:132
+msgid "path"
+msgstr ""
+
+#: builtins/type.def:132
+msgid "-path"
+msgstr ""
+
+#: builtins/type.def:137
+msgid "all"
+msgstr ""
+
+#: builtins/type.def:137
+msgid "-all"
+msgstr ""
+
+#: builtins/type.def:145
+msgid "afptP"
+msgstr ""
+
+#: builtins/type.def:230
+#, c-format
+msgid "%s is aliased to `%s'\n"
+msgstr ""
+
+#: builtins/type.def:234
+#, c-format
+msgid "alias %s=%s\n"
+msgstr ""
+
+#: builtins/type.def:251
+#, c-format
+msgid "%s is a shell keyword\n"
+msgstr ""
+
+#: builtins/type.def:271
+#, c-format
+msgid "%s is a function\n"
+msgstr ""
+
+#: builtins/type.def:296
+#, c-format
+msgid "%s is a shell builtin\n"
+msgstr ""
+
+#: builtins/type.def:317 builtins/type.def:382
+#, c-format
+msgid "%s is %s\n"
+msgstr ""
+
+#: builtins/type.def:337
+#, c-format
+msgid "%s is hashed (%s)\n"
+msgstr ""
+
+#: builtins/ulimit.def:2
+msgid "ulimit"
+msgstr ""
+
+#: builtins/ulimit.def:111
+#, c-format
+msgid "%ld%s"
+msgstr ""
+
+#: builtins/ulimit.def:195
+msgid "core file size"
+msgstr ""
+
+#: builtins/ulimit.def:195 builtins/ulimit.def:200
+msgid "blocks"
+msgstr ""
+
+#: builtins/ulimit.def:198
+msgid "data seg size"
+msgstr ""
+
+#: builtins/ulimit.def:198 builtins/ulimit.def:202 builtins/ulimit.def:205
+#: builtins/ulimit.def:210 builtins/ulimit.def:217 builtins/ulimit.def:220
+msgid "kbytes"
+msgstr ""
+
+#: builtins/ulimit.def:200
+msgid "file size"
+msgstr ""
+
+#: builtins/ulimit.def:202
+msgid "max locked memory"
+msgstr ""
+
+#: builtins/ulimit.def:205
+msgid "max memory size"
+msgstr ""
+
+#: builtins/ulimit.def:207
+msgid "open files"
+msgstr ""
+
+#: builtins/ulimit.def:208
+msgid "pipe size"
+msgstr ""
+
+#: builtins/ulimit.def:208
+msgid "512 bytes"
+msgstr ""
+
+#: builtins/ulimit.def:210
+msgid "stack size"
+msgstr ""
+
+#: builtins/ulimit.def:213
+msgid "cpu time"
+msgstr ""
+
+#: builtins/ulimit.def:213
+msgid "seconds"
+msgstr ""
+
+#: builtins/ulimit.def:215
+msgid "max user processes"
+msgstr ""
+
+#: builtins/ulimit.def:217
+msgid "virtual memory"
+msgstr ""
+
+#: builtins/ulimit.def:220
+msgid "swap size"
+msgstr ""
+
+#: builtins/ulimit.def:328 builtins/ulimit.def:401 builtins/ulimit.def:674
+msgid "unlimited"
+msgstr ""
+
+#: builtins/ulimit.def:330
+#, c-format
+msgid "%s: invalid limit argument"
+msgstr ""
+
+#: builtins/ulimit.def:356
+#, c-format
+msgid "`%c': bad command"
+msgstr ""
+
+#: builtins/ulimit.def:385 builtins/ulimit.def:649
+#, c-format
+msgid "%s: cannot get limit: %s"
+msgstr ""
+
+#: builtins/ulimit.def:397 builtins/ulimit.def:676
+msgid "hard"
+msgstr ""
+
+#: builtins/ulimit.def:399 builtins/ulimit.def:678
+msgid "soft"
+msgstr ""
+
+#: builtins/ulimit.def:411
+msgid "limit"
+msgstr ""
+
+#: builtins/ulimit.def:423 builtins/ulimit.def:716
+#, c-format
+msgid "%s: cannot modify limit: %s"
+msgstr ""
+
+#: builtins/ulimit.def:667
+#, c-format
+msgid "(%s, -%c) "
+msgstr ""
+
+#: builtins/ulimit.def:669
+#, c-format
+msgid "(-%c) "
+msgstr ""
+
+#: builtins/ulimit.def:671
+#, c-format
+msgid "%-18s %16s"
+msgstr ""
+
+#: builtins/umask.def:2
+msgid "umask"
+msgstr ""
+
+#: builtins/umask.def:80
+msgid "Sp"
+msgstr ""
+
+#: builtins/umask.def:110
+msgid "octal number"
+msgstr ""
+
+#: builtins/umask.def:131
+#, c-format
+msgid "umask%s "
+msgstr ""
+
+#: builtins/umask.def:131
+msgid " -S"
+msgstr ""
+
+#: builtins/umask.def:135
+#, c-format
+msgid "%04lo\n"
+msgstr ""
+
+#: builtins/umask.def:178
+#, c-format
+msgid "u=%s,g=%s,o=%s\n"
+msgstr ""
+
+#: builtins/umask.def:194
+msgid "agou"
+msgstr ""
+
+#: builtins/umask.def:224
+#, c-format
+msgid "`%c': invalid symbolic mode operator"
+msgstr ""
+
+#: builtins/umask.def:229
+msgid "rwx"
+msgstr ""
+
+#: builtins/umask.def:277
+#, c-format
+msgid "`%c': invalid symbolic mode character"
+msgstr ""
+
+#: lib/sh/clock.c:79 lib/sh/timeval.c:143
+#, c-format
+msgid "%ldm%d.%03ds"
+msgstr ""
+
+#: lib/sh/fmtulong.c:55 lib/sh/snprintf.c:167
+msgid "0123456789abcdef"
+msgstr ""
+
+#: lib/sh/fmtulong.c:56 lib/sh/snprintf.c:168
+msgid "0123456789ABCDEF"
+msgstr ""
+
+#: lib/sh/fmtulong.c:99
+msgid "invalid base"
+msgstr ""
+
+#: lib/sh/getcwd.c:75
+msgid "../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../.."
+msgstr ""
+
+#: lib/sh/getcwd.c:304
+msgid "cwd: getcwd"
+msgstr ""
+
+#: lib/sh/inet_aton.c:59
+msgid "@(#)inet_addr.c\t8.1 (Berkeley) 6/17/93"
+msgstr ""
+
+#: lib/sh/inet_aton.c:60
+msgid "$Id: inet_addr.c,v 1.5 1996/08/14 03:48:37 drepper Exp $"
+msgstr ""
+
+#: lib/sh/mailstat.c:95
+#, c-format
+msgid "%s/cur"
+msgstr ""
+
+#: lib/sh/mailstat.c:101
+#, c-format
+msgid "%s/tmp"
+msgstr ""
+
+#: lib/sh/mailstat.c:107
+#, c-format
+msgid "%s/new"
+msgstr ""
+
+#: lib/sh/mailstat.c:126
+msgid "cur"
+msgstr ""
+
+#: lib/sh/mailstat.c:126
+msgid "new"
+msgstr ""
+
+#: lib/sh/mailstat.c:127
+#, c-format
+msgid "%s/"
+msgstr ""
+
+#: lib/sh/makepath.c:77
+msgid "sh_makepath"
+msgstr ""
+
+#: lib/sh/mktime.c:330
+#, c-format
+msgid "%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d"
+msgstr ""
+
+#: lib/sh/mktime.c:345
+msgid "mktime ("
+msgstr ""
+
+#: lib/sh/mktime.c:347
+msgid ""
+")\n"
+"yields ("
+msgstr ""
+
+#: lib/sh/mktime.c:349
+#, c-format
+msgid ") == %ld, should be %ld\n"
+msgstr ""
+
+#: lib/sh/mktime.c:367
+#, c-format
+msgid "%d-%d-%d%c"
+msgstr ""
+
+#: lib/sh/mktime.c:370
+#, c-format
+msgid "%d:%d:%d%c"
+msgstr ""
+
+#: lib/sh/mktime.c:380
+#, c-format
+msgid "mktime returns %ld == "
+msgstr ""
+
+#: lib/sh/mktime.c:410
+#, c-format
+msgid ""
+"Usage:\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n"
+"\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n"
+"\t%s FROM BY TO - # Do not test those values (for benchmark).\n"
+msgstr ""
+
+#: lib/sh/netopen.c:128
+msgid "tcp"
+msgstr ""
+
+#: lib/sh/netopen.c:128
+msgid "udp"
+msgstr ""
+
+#: lib/sh/netopen.c:156
+#, c-format
+msgid "%s: host unknown"
+msgstr ""
+
+#: lib/sh/netopen.c:163
+#, c-format
+msgid "%s: invalid service"
+msgstr ""
+
+#: lib/sh/netopen.c:176 lib/sh/netopen.c:234
+msgid "socket"
+msgstr ""
+
+#: lib/sh/netopen.c:183 lib/sh/netopen.c:246
+msgid "connect"
+msgstr ""
+
+#: lib/sh/netopen.c:294
+#, c-format
+msgid "%s: bad network path specification"
+msgstr ""
+
+#: lib/sh/netopen.c:334
+msgid "network operations not supported"
+msgstr ""
+
+#: lib/sh/pathphys.c:269
+msgid "sh_realpath"
+msgstr ""
+
+#: lib/sh/shmatch.c:95 lib/sh/shmatch.c:96
+msgid "BASH_REMATCH"
+msgstr ""
+
+#: lib/sh/snprintf.c:402
+msgid "\ 3"
+msgstr ""
+
+#: lib/sh/snprintf.c:892
+msgid "INF"
+msgstr ""
+
+#: lib/sh/snprintf.c:892
+msgid "NAN"
+msgstr ""
+
+#: lib/sh/snprintf.c:893
+msgid "inf"
+msgstr ""
+
+#: lib/sh/snprintf.c:893
+msgid "nan"
+msgstr ""
+
+#: lib/sh/snprintf.c:1646
+msgid "out of virtual memory\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1695 lib/sh/snprintf.c:1697 lib/sh/snprintf.c:1699
+msgid "abcde\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1696
+#, c-format
+msgid "snprintf returns %d with NULL first argument and size of 0\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1698
+#, c-format
+msgid "snprintf returns %d with non-NULL first argument and size of 0\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1700
+#, c-format
+msgid "snprintf returns %d with NULL first argument and non-zero size\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1710
+#, c-format
+msgid "/%%ld %%ld/, 336, 336\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1711 lib/sh/snprintf.c:1712 lib/sh/snprintf.c:1713
+#, c-format
+msgid "/%ld %ld/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1717
+#, c-format
+msgid "/%%d/, 336\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1718 lib/sh/snprintf.c:1719 lib/sh/snprintf.c:1720
+#, c-format
+msgid "/%d/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1724
+#, c-format
+msgid "/%%2d/, 336\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1725 lib/sh/snprintf.c:1726 lib/sh/snprintf.c:1727
+#, c-format
+msgid "/%2d/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1731
+#, c-format
+msgid "/%%10d/, 336\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1732 lib/sh/snprintf.c:1733 lib/sh/snprintf.c:1734
+#, c-format
+msgid "/%10d/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1738
+#, c-format
+msgid "/%%-10d/, 336\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1739 lib/sh/snprintf.c:1740 lib/sh/snprintf.c:1741
+#, c-format
+msgid "/%-10d/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1748
+#, c-format
+msgid "/%%f/, 1234.56\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1749 lib/sh/snprintf.c:1750 lib/sh/snprintf.c:1751
+#, c-format
+msgid "/%f/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1755
+#, c-format
+msgid "/%%e/, 1234.56\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1756 lib/sh/snprintf.c:1757 lib/sh/snprintf.c:1758
+#, c-format
+msgid "/%e/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1762
+#, c-format
+msgid "/%%4.2f/, 1234.56\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1763 lib/sh/snprintf.c:1764 lib/sh/snprintf.c:1765
+#, c-format
+msgid "/%4.2f/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1769
+#, c-format
+msgid "/%%3.1f/, 1234.56\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1770 lib/sh/snprintf.c:1771 lib/sh/snprintf.c:1772
+#, c-format
+msgid "/%3.1f/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1776
+#, c-format
+msgid "/%%10.3f/, 1234.56\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1777 lib/sh/snprintf.c:1778 lib/sh/snprintf.c:1779
+#, c-format
+msgid "/%10.3f/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1783
+#, c-format
+msgid "/%%10.3e/, 1234.56\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1784 lib/sh/snprintf.c:1785 lib/sh/snprintf.c:1786
+#, c-format
+msgid "/%10.3e/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1790
+#, c-format
+msgid "/%%+4.2f/, 1234.56\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1791 lib/sh/snprintf.c:1792 lib/sh/snprintf.c:1793
+#, c-format
+msgid "/%+4.2f/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1797
+#, c-format
+msgid "/%%010.2f/, 1234.56\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1798 lib/sh/snprintf.c:1799 lib/sh/snprintf.c:1800
+#, c-format
+msgid "/%010.2f/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1804
+msgid "Outstanding acting !"
+msgstr ""
+
+#: lib/sh/snprintf.c:1807
+#, c-format
+msgid "/%%2s/, \"%s\"\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1808 lib/sh/snprintf.c:1809 lib/sh/snprintf.c:1810
+#, c-format
+msgid "/%2s/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1814
+#, c-format
+msgid "/%%22s/ %s\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1815 lib/sh/snprintf.c:1816 lib/sh/snprintf.c:1817
+#, c-format
+msgid "/%22s/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1821
+#, c-format
+msgid "/%%22.5s/ %s\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1822 lib/sh/snprintf.c:1823 lib/sh/snprintf.c:1824
+#, c-format
+msgid "/%22.5s/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1828
+#, c-format
+msgid "/%%-22.5s/ %s\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1829 lib/sh/snprintf.c:1830 lib/sh/snprintf.c:1831
+#, c-format
+msgid "/%-22.5s/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1837
+#, c-format
+msgid "%%x %%X %%#x, 31, 31, 31\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1838 lib/sh/snprintf.c:1839 lib/sh/snprintf.c:1840
+#, c-format
+msgid "%x %X %#x\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1844
+#, c-format
+msgid "**%%d**%% d**%% d**, 42, 42, -42\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1845 lib/sh/snprintf.c:1846 lib/sh/snprintf.c:1847
+#, c-format
+msgid "**%d**% d**% d**\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1853
+#, c-format
+msgid "/%%g/, 31.4\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1854 lib/sh/snprintf.c:1855 lib/sh/snprintf.c:1856
+#: lib/sh/snprintf.c:1975 lib/sh/snprintf.c:1976 lib/sh/snprintf.c:1977
+#: lib/sh/snprintf.c:1982 lib/sh/snprintf.c:1983 lib/sh/snprintf.c:1984
+#, c-format
+msgid "/%g/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1860
+#, c-format
+msgid "/%%.6g/, 31.4\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1861 lib/sh/snprintf.c:1862 lib/sh/snprintf.c:1863
+#, c-format
+msgid "/%.6g/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1867
+#, c-format
+msgid "/%%.1G/, 31.4\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1868 lib/sh/snprintf.c:1869 lib/sh/snprintf.c:1870
+#: lib/sh/snprintf.c:1875 lib/sh/snprintf.c:1876 lib/sh/snprintf.c:1877
+#, c-format
+msgid "/%.1G/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1874
+#, c-format
+msgid "/%%.1G/, 3100000000.4\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1881
+#, c-format
+msgid "abc%%n\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1882 lib/sh/snprintf.c:1883 lib/sh/snprintf.c:1885
+#, c-format
+msgid "abc%n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1884 lib/sh/snprintf.c:1886
+#, c-format
+msgid ""
+"%d\n"
+"\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1888
+#, c-format
+msgid "%%*.*s --> 10.10\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1889 lib/sh/snprintf.c:1890 lib/sh/snprintf.c:1891
+#, c-format
+msgid "%*.*s\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1895
+#, c-format
+msgid "%%%%%%%%\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1896 lib/sh/snprintf.c:1897 lib/sh/snprintf.c:1898
+#, c-format
+msgid "%%%%\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1902
+msgid "Hello this is a too big string for the buffer"
+msgstr ""
+
+#: lib/sh/snprintf.c:1904
+#, c-format
+msgid "<%%>, %s\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1907 lib/sh/snprintf.c:1908 lib/sh/snprintf.c:1915
+#: lib/sh/snprintf.c:1922 lib/sh/snprintf.c:1930 lib/sh/snprintf.c:1939
+#: lib/sh/snprintf.c:1948 lib/sh/snprintf.c:1955
+#, c-format
+msgid "<%s>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1909 lib/sh/snprintf.c:1916 lib/sh/snprintf.c:1923
+#: lib/sh/snprintf.c:1931 lib/sh/snprintf.c:1940 lib/sh/snprintf.c:1949
+#: lib/sh/snprintf.c:1956
+#, c-format
+msgid ""
+"<%s>\n"
+"\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1911
+#, c-format
+msgid "<%%p> vsnprintf\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1912 lib/sh/snprintf.c:1913
+#, c-format
+msgid "%p"
+msgstr ""
+
+#: lib/sh/snprintf.c:1914
+#, c-format
+msgid "<%p>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1918
+#, c-format
+msgid "<%%lu> LONG_MAX+1\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1919 lib/sh/snprintf.c:1920
+#, c-format
+msgid "%lu"
+msgstr ""
+
+#: lib/sh/snprintf.c:1921
+#, c-format
+msgid "<%lu>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1926
+#, c-format
+msgid "<%%llu> LLONG_MAX+1\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1927 lib/sh/snprintf.c:1928
+#, c-format
+msgid "%llu"
+msgstr ""
+
+#: lib/sh/snprintf.c:1929
+#, c-format
+msgid "<%llu>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1935
+#, c-format
+msgid "<%%6.2LE> 42.42\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1936 lib/sh/snprintf.c:1937
+#, c-format
+msgid "%6.2LE"
+msgstr ""
+
+#: lib/sh/snprintf.c:1938
+#, c-format
+msgid "<%6.2LE>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1944
+#, c-format
+msgid "<%%6.2A> 42.42\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1945 lib/sh/snprintf.c:1946
+#, c-format
+msgid "%6.2A"
+msgstr ""
+
+#: lib/sh/snprintf.c:1947
+#, c-format
+msgid "<%6.2A>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1951
+#, c-format
+msgid "<%%6.2LA> 42.42\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1952 lib/sh/snprintf.c:1953
+#, c-format
+msgid "%6.2LA"
+msgstr ""
+
+#: lib/sh/snprintf.c:1954
+#, c-format
+msgid "<%6.2LA>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1959
+#, c-format
+msgid "<%%.10240f> DBL_MAX\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1960 lib/sh/snprintf.c:1961
+#, c-format
+msgid "%.10240f"
+msgstr ""
+
+#: lib/sh/snprintf.c:1962
+#, c-format
+msgid "<%.10240f>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1963 lib/sh/snprintf.c:1970
+#, c-format
+msgid "<%d> <%s>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1964 lib/sh/snprintf.c:1971
+#, c-format
+msgid ""
+"<%d> <%s>\n"
+"\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1966
+#, c-format
+msgid "<%%.10240Lf> LDBL_MAX\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1967 lib/sh/snprintf.c:1968
+#, c-format
+msgid "%.10240Lf"
+msgstr ""
+
+#: lib/sh/snprintf.c:1969
+#, c-format
+msgid "<%.10240Lf>\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1974
+#, c-format
+msgid "/%%g/, 421.2345\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1981
+#, c-format
+msgid "/%%g/, 4214.2345\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1988
+#, c-format
+msgid "/%%.5g/, 4214.2345\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1989 lib/sh/snprintf.c:1990 lib/sh/snprintf.c:1991
+#, c-format
+msgid "/%.5g/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1995
+#, c-format
+msgid "/%%.4g/, 4214.2345\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:1996 lib/sh/snprintf.c:1997 lib/sh/snprintf.c:1998
+#, c-format
+msgid "/%.4g/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2002
+#, c-format
+msgid "/%%'ld %%'ld/, 12345, 1234567\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2003 lib/sh/snprintf.c:2004 lib/sh/snprintf.c:2005
+#: lib/sh/snprintf.c:2010 lib/sh/snprintf.c:2011 lib/sh/snprintf.c:2012
+#: lib/sh/snprintf.c:2017 lib/sh/snprintf.c:2018 lib/sh/snprintf.c:2019
+#, c-format
+msgid "/%'ld %'ld/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2009
+#, c-format
+msgid "/%%'ld %%'ld/, 336, 3336\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2016
+#, c-format
+msgid "/%%'ld %%'ld/, -42786, -142786\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2023
+#, c-format
+msgid "/%%'f %%'f/, 421.2345, 421234.56789\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2024 lib/sh/snprintf.c:2025 lib/sh/snprintf.c:2026
+#: lib/sh/snprintf.c:2031 lib/sh/snprintf.c:2032 lib/sh/snprintf.c:2033
+#, c-format
+msgid "/%'f %'f/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2030
+#, c-format
+msgid "/%%'f %%'f/, -421.2345, -421234.56789\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2037
+#, c-format
+msgid "/%%'g %%'g/, 421.2345, 421234.56789\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2038 lib/sh/snprintf.c:2039 lib/sh/snprintf.c:2040
+#: lib/sh/snprintf.c:2045 lib/sh/snprintf.c:2046 lib/sh/snprintf.c:2047
+#, c-format
+msgid "/%'g %'g/\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2044
+#, c-format
+msgid "/%%'g %%'g/, -421.2345, -421234.56789\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2052
+#, c-format
+msgid "/%%'g/, 4213455.8392\n"
+msgstr ""
+
+#: lib/sh/snprintf.c:2053 lib/sh/snprintf.c:2054 lib/sh/snprintf.c:2055
+#, c-format
+msgid "/%'g/\n"
+msgstr ""
+
+#: lib/sh/strerror.c:49
+msgid "Unknown system error "
+msgstr ""
+
+#: lib/sh/strftime.c:153
+msgid "Sun"
+msgstr ""
+
+#: lib/sh/strftime.c:153
+msgid "Mon"
+msgstr ""
+
+#: lib/sh/strftime.c:153
+msgid "Tue"
+msgstr ""
+
+#: lib/sh/strftime.c:153
+msgid "Wed"
+msgstr ""
+
+#: lib/sh/strftime.c:154
+msgid "Thu"
+msgstr ""
+
+#: lib/sh/strftime.c:154
+msgid "Fri"
+msgstr ""
+
+#: lib/sh/strftime.c:154
+msgid "Sat"
+msgstr ""
+
+#: lib/sh/strftime.c:157
+msgid "Sunday"
+msgstr ""
+
+#: lib/sh/strftime.c:157
+msgid "Monday"
+msgstr ""
+
+#: lib/sh/strftime.c:157
+msgid "Tuesday"
+msgstr ""
+
+#: lib/sh/strftime.c:157
+msgid "Wednesday"
+msgstr ""
+
+#: lib/sh/strftime.c:158
+msgid "Thursday"
+msgstr ""
+
+#: lib/sh/strftime.c:158
+msgid "Friday"
+msgstr ""
+
+#: lib/sh/strftime.c:158
+msgid "Saturday"
+msgstr ""
+
+#: lib/sh/strftime.c:161
+msgid "Jan"
+msgstr ""
+
+#: lib/sh/strftime.c:161
+msgid "Feb"
+msgstr ""
+
+#: lib/sh/strftime.c:161
+msgid "Mar"
+msgstr ""
+
+#: lib/sh/strftime.c:161
+msgid "Apr"
+msgstr ""
+
+#: lib/sh/strftime.c:161 lib/sh/strftime.c:166
+msgid "May"
+msgstr ""
+
+#: lib/sh/strftime.c:161
+msgid "Jun"
+msgstr ""
+
+#: lib/sh/strftime.c:162
+msgid "Jul"
+msgstr ""
+
+#: lib/sh/strftime.c:162
+msgid "Aug"
+msgstr ""
+
+#: lib/sh/strftime.c:162
+msgid "Sep"
+msgstr ""
+
+#: lib/sh/strftime.c:162
+msgid "Oct"
+msgstr ""
+
+#: lib/sh/strftime.c:162
+msgid "Nov"
+msgstr ""
+
+#: lib/sh/strftime.c:162
+msgid "Dec"
+msgstr ""
+
+#: lib/sh/strftime.c:165
+msgid "January"
+msgstr ""
+
+#: lib/sh/strftime.c:165
+msgid "February"
+msgstr ""
+
+#: lib/sh/strftime.c:165
+msgid "March"
+msgstr ""
+
+#: lib/sh/strftime.c:165
+msgid "April"
+msgstr ""
+
+#: lib/sh/strftime.c:166
+msgid "June"
+msgstr ""
+
+#: lib/sh/strftime.c:166
+msgid "July"
+msgstr ""
+
+#: lib/sh/strftime.c:166
+msgid "August"
+msgstr ""
+
+#: lib/sh/strftime.c:166
+msgid "September"
+msgstr ""
+
+#: lib/sh/strftime.c:167
+msgid "October"
+msgstr ""
+
+#: lib/sh/strftime.c:167
+msgid "November"
+msgstr ""
+
+#: lib/sh/strftime.c:167
+msgid "December"
+msgstr ""
+
+#: lib/sh/strftime.c:169
+msgid "AM"
+msgstr ""
+
+#: lib/sh/strftime.c:169
+msgid "PM"
+msgstr ""
+
+#: lib/sh/strftime.c:270
+msgid "%A %B %d %T %Y"
+msgstr ""
+
+#: lib/sh/strftime.c:275 lib/sh/strftime.c:280 lib/sh/strftime.c:321
+#: lib/sh/strftime.c:329 lib/sh/strftime.c:338 lib/sh/strftime.c:347
+#: lib/sh/strftime.c:352 lib/sh/strftime.c:393 lib/sh/strftime.c:413
+#: lib/sh/strftime.c:417 lib/sh/strftime.c:426 lib/sh/strftime.c:440
+#, c-format
+msgid "%02d"
+msgstr ""
+
+#: lib/sh/strftime.c:284
+msgid "%m/%d/%y"
+msgstr ""
+
+#: lib/sh/strftime.c:288 lib/sh/strftime.c:519 lib/sh/strftime.c:528
+#, c-format
+msgid "%2d"
+msgstr ""
+
+#: lib/sh/strftime.c:296
+msgid "%Y-%m-%d"
+msgstr ""
+
+#: lib/sh/strftime.c:342
+#, c-format
+msgid "%03d"
+msgstr ""
+
+#: lib/sh/strftime.c:373
+msgid "%I:%M:%S %p"
+msgstr ""
+
+#: lib/sh/strftime.c:386 lib/malloc/stats.c:181
+#, c-format
+msgid "%ld"
+msgstr ""
+
+#: lib/sh/strftime.c:430
+msgid "%A %B %d %Y"
+msgstr ""
+
+#: lib/sh/strftime.c:495
+#, c-format
+msgid "%02d%02d"
+msgstr ""
+
+#: lib/sh/strftime.c:544
+#, c-format
+msgid "%2d-%3.3s-%4d"
+msgstr ""
+
+#: lib/sh/strftime.c:786
+#, c-format
+msgid "(%%A)      full weekday name, var length (Sunday..Saturday)  %A"
+msgstr ""
+
+#: lib/sh/strftime.c:787
+msgid "(%%B)       full month name, var length (January..December)  %B"
+msgstr ""
+
+#: lib/sh/strftime.c:788
+#, c-format
+msgid "(%%C)                                               Century  %C"
+msgstr ""
+
+#: lib/sh/strftime.c:789
+msgid "(%%D)                                       date (%%m/%%d/%%y)  %D"
+msgstr ""
+
+#: lib/sh/strftime.c:790
+#, c-format
+msgid "(%%E)                           Locale extensions (ignored)  %E"
+msgstr ""
+
+#: lib/sh/strftime.c:791
+#, c-format
+msgid "(%%F)       full month name, var length (January..December)  %F"
+msgstr ""
+
+#: lib/sh/strftime.c:792
+msgid "(%%H)                          hour (24-hour clock, 00..23)  %H"
+msgstr ""
+
+#: lib/sh/strftime.c:793
+msgid "(%%I)                          hour (12-hour clock, 01..12)  %I"
+msgstr ""
+
+#: lib/sh/strftime.c:794
+msgid "(%%M)                                       minute (00..59)  %M"
+msgstr ""
+
+#: lib/sh/strftime.c:795
+msgid "(%%N)                                      Emporer/Era Name  %N"
+msgstr ""
+
+#: lib/sh/strftime.c:796
+msgid "(%%O)                           Locale extensions (ignored)  %O"
+msgstr ""
+
+#: lib/sh/strftime.c:797
+msgid "(%%R)                                 time, 24-hour (%%H:%%M)  %R"
+msgstr ""
+
+#: lib/sh/strftime.c:798
+#, c-format
+msgid "(%%S)                                       second (00..60)  %S"
+msgstr ""
+
+#: lib/sh/strftime.c:799
+msgid "(%%T)                              time, 24-hour (%%H:%%M:%%S)  %T"
+msgstr ""
+
+#: lib/sh/strftime.c:800
+msgid "(%%U)    week of year, Sunday as first day of week (00..53)  %U"
+msgstr ""
+
+#: lib/sh/strftime.c:801
+msgid "(%%V)                    week of year according to ISO 8601  %V"
+msgstr ""
+
+#: lib/sh/strftime.c:802
+msgid "(%%W)    week of year, Monday as first day of week (00..53)  %W"
+msgstr ""
+
+#: lib/sh/strftime.c:803
+msgid "(%%X)     appropriate locale time representation (%H:%M:%S)  %X"
+msgstr ""
+
+#: lib/sh/strftime.c:804
+msgid "(%%Y)                           year with century (1970...)  %Y"
+msgstr ""
+
+#: lib/sh/strftime.c:805
+msgid "(%%Z) timezone (EDT), or blank if timezone not determinable  %Z"
+msgstr ""
+
+#: lib/sh/strftime.c:806
+#, c-format
+msgid "(%%a)          locale's abbreviated weekday name (Sun..Sat)  %a"
+msgstr ""
+
+#: lib/sh/strftime.c:807
+msgid "(%%b)            locale's abbreviated month name (Jan..Dec)  %b"
+msgstr ""
+
+#: lib/sh/strftime.c:808
+msgid "(%%c)           full date (Sat Nov  4 12:02:33 1989)%n%t%t%t  %c"
+msgstr ""
+
+#: lib/sh/strftime.c:809
+#, c-format
+msgid "(%%d)                             day of the month (01..31)  %d"
+msgstr ""
+
+#: lib/sh/strftime.c:810
+#, c-format
+msgid "(%%e)               day of the month, blank-padded ( 1..31)  %e"
+msgstr ""
+
+#: lib/sh/strftime.c:811
+msgid "(%%h)                                should be same as (%%b)  %h"
+msgstr ""
+
+#: lib/sh/strftime.c:812
+msgid "(%%j)                            day of the year (001..366)  %j"
+msgstr ""
+
+#: lib/sh/strftime.c:813
+msgid "(%%k)               hour, 24-hour clock, blank pad ( 0..23)  %k"
+msgstr ""
+
+#: lib/sh/strftime.c:814
+msgid "(%%l)               hour, 12-hour clock, blank pad ( 0..12)  %l"
+msgstr ""
+
+#: lib/sh/strftime.c:815
+#, c-format
+msgid "(%%m)                                        month (01..12)  %m"
+msgstr ""
+
+#: lib/sh/strftime.c:816
+#, c-format
+msgid "(%%o)                                      Emporer/Era Year  %o"
+msgstr ""
+
+#: lib/sh/strftime.c:817
+#, c-format
+msgid "(%%p)              locale's AM or PM based on 12-hour clock  %p"
+msgstr ""
+
+#: lib/sh/strftime.c:818
+msgid "(%%r)                   time, 12-hour (same as %%I:%%M:%%S %%p)  %r"
+msgstr ""
+
+#: lib/sh/strftime.c:819
+#, c-format
+msgid "(%%u) ISO 8601: Weekday as decimal number [1 (Monday) - 7]   %u"
+msgstr ""
+
+#: lib/sh/strftime.c:820
+msgid "(%%v)                                VMS date (dd-bbb-YYYY)  %v"
+msgstr ""
+
+#: lib/sh/strftime.c:821
+msgid "(%%w)                       day of week (0..6, Sunday == 0)  %w"
+msgstr ""
+
+#: lib/sh/strftime.c:822
+#, c-format
+msgid "(%%x)                appropriate locale date representation  %x"
+msgstr ""
+
+#: lib/sh/strftime.c:823
+msgid "(%%y)                      last two digits of year (00..99)  %y"
+msgstr ""
+
+#: lib/sh/strftime.c:824
+msgid "(%%z)      timezone offset east of GMT as HHMM (e.g. -0500)  %z"
+msgstr ""
+
+#: lib/sh/stringlist.c:235
+#, c-format
+msgid "%s%s\n"
+msgstr ""
+
+#: lib/sh/strtoimax.c:38 lib/sh/strtoimax.c:45 lib/sh/strtoumax.c:38
+#: lib/sh/strtoumax.c:45
+msgid "this configure-time declaration test was not run"
+msgstr ""
+
+#: lib/sh/strtoimax.c:83
+#, c-format
+msgid "sizeof intmax_t: %d\n"
+msgstr ""
+
+#: lib/sh/strtoimax.c:86
+#, c-format
+msgid "sizeof long long: %d\n"
+msgstr ""
+
+#: lib/sh/strtoimax.c:88
+#, c-format
+msgid "sizeof long: %d\n"
+msgstr ""
+
+#: lib/sh/strtoimax.c:98
+#, c-format
+msgid "%lld %lld %ld\n"
+msgstr ""
+
+#: lib/sh/strtoumax.c:83
+#, c-format
+msgid "sizeof uintmax_t: %d\n"
+msgstr ""
+
+#: lib/sh/strtoumax.c:86
+#, c-format
+msgid "sizeof unsigned long long: %d\n"
+msgstr ""
+
+#: lib/sh/strtoumax.c:88
+#, c-format
+msgid "sizeof unsigned long: %d\n"
+msgstr ""
+
+#: lib/sh/strtoumax.c:98
+#, c-format
+msgid "%llu %llu %lu\n"
+msgstr ""
+
+#: lib/sh/tmpfile.c:46
+msgid "shtmp"
+msgstr ""
+
+#: lib/sh/tmpfile.c:73
+msgid "/var/tmp"
+msgstr ""
+
+#: lib/sh/tmpfile.c:77
+msgid "/usr/tmp"
+msgstr ""
+
+#: lib/sh/tmpfile.c:92
+msgid "TMPDIR"
+msgstr ""
+
+#: lib/sh/tmpfile.c:122 lib/sh/tmpfile.c:167
+#, c-format
+msgid "%s/%s.XXXXXX"
+msgstr ""
+
+#: lib/sh/tmpfile.c:135 lib/sh/tmpfile.c:184
+#, c-format
+msgid "%s/%s-%lu"
+msgstr ""
+
+#: lib/sh/tmpfile.c:212
+msgid "w+"
+msgstr ""
+
+#: lib/malloc/alloca.c:446
+#, c-format
+msgid "%011o %011o %011o\n"
+msgstr ""
+
+#: lib/malloc/alloca.c:467
+#, c-format
+msgid "%011o %011o\n"
+msgstr ""
+
+#: lib/malloc/i386-alloca.s:1
+msgid "alloca.s"
+msgstr ""
+
+#: lib/malloc/imalloc.h:52
+msgid "x"
+msgstr ""
+
+#: lib/malloc/malloc.c:298
+#, c-format
+msgid "malloc: failed assertion: %s\n"
+msgstr ""
+
+#: lib/malloc/malloc.c:314
+#, c-format
+msgid ""
+"\r\n"
+"malloc: %s:%d: assertion botched\r\n"
+msgstr ""
+
+#: lib/malloc/malloc.c:355
+msgid "bcoalesce: CHAIN(mp2) != mp1"
+msgstr ""
+
+#: lib/malloc/malloc.c:604
+msgid "malloc_debug_dummy\n"
+msgstr ""
+
+#: lib/malloc/malloc.c:740
+msgid "malloc: block on free list clobbered"
+msgstr ""
+
+#: lib/malloc/malloc.c:766 lib/malloc/malloc.c:768 lib/malloc/malloc.c:773
+msgid "malloc"
+msgstr ""
+
+#: lib/malloc/malloc.c:817
+msgid "free: called with already freed block argument"
+msgstr ""
+
+#: lib/malloc/malloc.c:820
+msgid "free: called with unallocated block argument"
+msgstr ""
+
+#: lib/malloc/malloc.c:839
+msgid "free: underflow detected; mh_nbytes out of range"
+msgstr ""
+
+#: lib/malloc/malloc.c:845
+msgid "free: start and end chunk sizes differ"
+msgstr ""
+
+#: lib/malloc/malloc.c:942
+msgid "realloc: called with unallocated block argument"
+msgstr ""
+
+#: lib/malloc/malloc.c:957
+msgid "realloc: underflow detected; mh_nbytes out of range"
+msgstr ""
+
+#: lib/malloc/malloc.c:963
+msgid "realloc: start and end chunk sizes differ"
+msgstr ""
+
+#: lib/malloc/malloc.c:1009 lib/malloc/malloc.c:1011 lib/malloc/malloc.c:1016
+msgid "realloc"
+msgstr ""
+
+#: lib/malloc/memtest.c:125 lib/malloc/memtest.c:138
+msgid "malloc-test: "
+msgstr ""
+
+#: lib/malloc/stats.c:99
+#, c-format
+msgid ""
+"Memory allocation statistics: %s\n"
+"    size\tfree\tin use\ttotal\tmorecore lesscore split\tcoalesce\n"
+msgstr ""
+
+#: lib/malloc/stats.c:104
+#, c-format
+msgid "%8lu\t%4d\t%6d\t%5d\t%8d\t%d %5d %8d\n"
+msgstr ""
+
+#: lib/malloc/stats.c:108
+#, c-format
+msgid ""
+"\n"
+"Total bytes in use: %lu, total bytes free: %lu\n"
+msgstr ""
+
+#: lib/malloc/stats.c:110
+#, c-format
+msgid ""
+"\n"
+"Total bytes requested by application: %lu\n"
+msgstr ""
+
+#: lib/malloc/stats.c:111
+#, c-format
+msgid "Total mallocs: %d, total frees: %d, total reallocs: %d (%d copies)\n"
+msgstr ""
+
+#: lib/malloc/stats.c:113
+#, c-format
+msgid "Total sbrks: %d, total bytes via sbrk: %d\n"
+msgstr ""
+
+#: lib/malloc/stats.c:115
+#, c-format
+msgid "Total blocks split: %d, total block coalesces: %d\n"
+msgstr ""
+
+#: lib/malloc/stats.c:134
+msgid "/var/tmp/maltrace/stats."
+msgstr ""
+
+#: lib/malloc/stats.c:172
+#, c-format
+msgid "%s%ld"
+msgstr ""
+
+#: lib/malloc/table.c:152
+#, c-format
+msgid "malloc: %p: %s: last %s from %s:%d\n"
+msgstr ""
+
+#: lib/malloc/table.c:154 lib/malloc/table.c:155 lib/malloc/table.c:239
+#: lib/malloc/watch.c:46
+msgid "allocated"
+msgstr ""
+
+#: lib/malloc/table.c:154 lib/malloc/table.c:222 lib/malloc/table.c:237
+msgid "free"
+msgstr ""
+
+#: lib/malloc/table.c:155 lib/malloc/watch.c:48
+msgid "freed"
+msgstr ""
+
+#: lib/malloc/table.c:175
+msgid "register_alloc: alloc table is full with FIND_ALLOC?\n"
+msgstr ""
+
+#: lib/malloc/table.c:182
+#, c-format
+msgid "register_alloc: %p already in table as allocated?\n"
+msgstr ""
+
+#: lib/malloc/table.c:211
+#, c-format
+msgid "register_free: %p not in allocation table?\n"
+msgstr ""
+
+#: lib/malloc/table.c:218
+#, c-format
+msgid "register_free: %p already in table as free?\n"
+msgstr ""
+
+#: lib/malloc/table.c:241
+msgid "undetermined?"
+msgstr ""
+
+#: lib/malloc/table.c:255
+#, c-format
+msgid "[%d] %p:%d:%s:%s:%s:%d:%d:%d\n"
+msgstr ""
+
+#: lib/malloc/trace.c:51
+#, c-format
+msgid "alloc: %s: %p (%d bytes) from '%s:%d'\n"
+msgstr ""
+
+#: lib/malloc/trace.c:54
+#, c-format
+msgid "alloc:%p:%d:%s:%d\n"
+msgstr ""
+
+#: lib/malloc/trace.c:69
+#, c-format
+msgid "free: %p (%d bytes) from '%s:%d'\n"
+msgstr ""
+
+#: lib/malloc/trace.c:72
+#, c-format
+msgid "free:%p:%d:%s:%d\n"
+msgstr ""
+
+#: lib/malloc/trace.c:107
+msgid "/var/tmp/maltrace/trace."
+msgstr ""
+
+#: lib/malloc/watch.c:50
+msgid "requesting resize"
+msgstr ""
+
+#: lib/malloc/watch.c:52
+msgid "just resized"
+msgstr ""
+
+#: lib/malloc/watch.c:54
+msgid "bug: unknown operation"
+msgstr ""
+
+#: lib/malloc/watch.c:56
+#, c-format
+msgid "malloc: watch alert: %p %s "
+msgstr ""
+
+#: lib/malloc/watch.c:58
+#, c-format
+msgid "(size %lu) "
+msgstr ""
+
+#: lib/malloc/watch.c:59
+#, c-format
+msgid "from '%s:%d'\n"
+msgstr ""
+
+#: lib/malloc/x386-alloca.s:10
+msgid "masm"
+msgstr ""
+
+#: lib/malloc/xmalloc.c:55
+#, c-format
+msgid "%s: out of virtual memory\n"
+msgstr ""
+
+#: lib/malloc/xmalloc.c:70
+msgid "xmalloc"
+msgstr ""
+
+#: lib/malloc/xmalloc.c:84
+msgid "xrealloc"
+msgstr ""
diff --git a/po/bash.pot b/po/bash.pot
new file mode 100644 (file)
index 0000000..ef7efe4
--- /dev/null
@@ -0,0 +1,4169 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#: builtins/caller.def:128 builtins/caller.def:132 builtins/pushd.def:655
+#: builtins/pushd.def:663 builtins/pushd.def:666 builtins/pushd.def:676
+#: builtins/pushd.def:680 builtins/pushd.def:684 builtins/pushd.def:687
+#: builtins/pushd.def:690 builtins/pushd.def:699 builtins/pushd.def:703
+#: builtins/pushd.def:707 builtins/pushd.def:710 builtins.c:321 builtins.c:325
+#: builtins.c:390 builtins.c:392 builtins.c:401 builtins.c:404 builtins.c:408
+#: builtins.c:445 builtins.c:487 builtins.c:491 builtins.c:498 builtins.c:509
+#: builtins.c:513 builtins.c:552 builtins.c:555 builtins.c:559 builtins.c:562
+#: builtins.c:630 builtins.c:637 builtins.c:692 builtins.c:713 builtins.c:718
+#: builtins.c:722 builtins.c:745 builtins.c:835 builtins.c:919 builtins.c:921
+#: builtins.c:943 builtins.c:946 builtins.c:948 builtins.c:950 builtins.c:952
+#: builtins.c:954 builtins.c:957 builtins.c:966 builtins.c:968 builtins.c:973
+#: builtins.c:976 builtins.c:1019 builtins.c:1024 builtins.c:1028
+#: builtins.c:1032 builtins.c:1034 builtins.c:1047 builtins.c:1062
+#: builtins.c:1226 builtins.c:1231 builtins.c:1305 builtins.c:1309
+#: builtins.c:1313 builtins.c:1316 builtins.c:1319 builtins.c:1331
+#: builtins.c:1335 builtins.c:1339 builtins.c:1342 builtins.c:1354
+#: builtins.c:1362 builtins.c:1365
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: bug-bash@gnu.org\n"
+"POT-Creation-Date: 2003-12-22 15:34-0500\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: arrayfunc.c:45
+msgid "bad array subscript"
+msgstr ""
+
+#: arrayfunc.c:306
+#, c-format
+msgid "%s: cannot assign to non-numeric index"
+msgstr ""
+
+#: bashhist.c:321
+#, c-format
+msgid "%s: cannot create: %s"
+msgstr ""
+
+#: bashline.c:2791
+msgid "bash_execute_unix_command: cannot find keymap for command"
+msgstr ""
+
+#: bashline.c:2840
+#, c-format
+msgid "%s: first non-whitespace character is not `\"'"
+msgstr ""
+
+#: bashline.c:2869
+#, c-format
+msgid "no closing `%c' in %s"
+msgstr ""
+
+#: bashline.c:2903
+#, c-format
+msgid "%s: missing colon separator"
+msgstr ""
+
+#: builtins/bind.def:194
+#, c-format
+msgid "`%s': invalid keymap name"
+msgstr ""
+
+#: builtins/bind.def:233
+#, c-format
+msgid "%s: cannot read: %s"
+msgstr ""
+
+#: builtins/bind.def:248
+#, c-format
+msgid "`%s': cannot unbind"
+msgstr ""
+
+#: builtins/bind.def:283
+#, c-format
+msgid "`%s': unknown function name"
+msgstr ""
+
+#: builtins/bind.def:291
+#, c-format
+msgid "%s is not bound to any keys.\n"
+msgstr ""
+
+#: builtins/bind.def:295
+#, c-format
+msgid "%s can be invoked via "
+msgstr ""
+
+#: builtins/break.def:128
+msgid "only meaningful in a `for', `while', or `until' loop"
+msgstr ""
+
+#: builtins/caller.def:127 builtins.c:320
+msgid "Returns the context of the current subroutine call."
+msgstr ""
+
+#: builtins/caller.def:129 builtins.c:322
+msgid "Without EXPR, returns returns \"$line $filename\".  With EXPR,"
+msgstr ""
+
+#: builtins/caller.def:130 builtins.c:323
+msgid "returns \"$line $subroutine $filename\"; this extra information"
+msgstr ""
+
+#: builtins/caller.def:131 builtins.c:324
+msgid "can be used used to provide a stack trace."
+msgstr ""
+
+#: builtins/caller.def:133 builtins.c:326
+msgid "The value of EXPR indicates how many call frames to go back before the"
+msgstr ""
+
+#: builtins/caller.def:134 builtins.c:327
+msgid "current one; the top frame is frame 0."
+msgstr ""
+
+#: builtins/cd.def:188
+msgid "HOME not set"
+msgstr ""
+
+#: builtins/cd.def:200
+msgid "OLDPWD not set"
+msgstr ""
+
+#: builtins/cd.def:350
+#, c-format
+msgid "write error: %s"
+msgstr ""
+
+#: builtins/common.c:133 test.c:921
+msgid "too many arguments"
+msgstr ""
+
+#: builtins/common.c:157 shell.c:465 shell.c:737
+#, c-format
+msgid "%s: option requires an argument"
+msgstr ""
+
+#: builtins/common.c:164
+#, c-format
+msgid "%s: numeric argument required"
+msgstr ""
+
+#: builtins/common.c:171
+#, c-format
+msgid "%s: not found"
+msgstr ""
+
+#: builtins/common.c:180 shell.c:750
+#, c-format
+msgid "%s: invalid option"
+msgstr ""
+
+#: builtins/common.c:187
+#, c-format
+msgid "%s: invalid option name"
+msgstr ""
+
+#: builtins/common.c:194 general.c:229 general.c:234
+#, c-format
+msgid "`%s': not a valid identifier"
+msgstr ""
+
+#: builtins/common.c:201
+#, c-format
+msgid "%s: invalid number"
+msgstr ""
+
+#: builtins/common.c:208
+#, c-format
+msgid "%s: invalid signal specification"
+msgstr ""
+
+#: builtins/common.c:215
+#, c-format
+msgid "`%s': not a pid or valid job spec"
+msgstr ""
+
+#: builtins/common.c:222 error.c:453
+#, c-format
+msgid "%s: readonly variable"
+msgstr ""
+
+#: builtins/common.c:230
+#, c-format
+msgid "%s: %s out of range"
+msgstr ""
+
+#: builtins/common.c:230 builtins/common.c:232
+msgid "argument"
+msgstr ""
+
+#: builtins/common.c:232
+#, c-format
+msgid "%s out of range"
+msgstr ""
+
+#: builtins/common.c:240
+#, c-format
+msgid "%s: no such job"
+msgstr ""
+
+#: builtins/common.c:248
+#, c-format
+msgid "%s: no job control"
+msgstr ""
+
+#: builtins/common.c:250
+msgid "no job control"
+msgstr ""
+
+#: builtins/common.c:260
+#, c-format
+msgid "%s: restricted"
+msgstr ""
+
+#: builtins/common.c:262
+msgid "restricted"
+msgstr ""
+
+#: builtins/common.c:270
+#, c-format
+msgid "%s: not a shell builtin"
+msgstr ""
+
+#: builtins/common.c:481
+#, c-format
+msgid "%s: could not get current directory: %s: %s\n"
+msgstr ""
+
+#: builtins/common.c:548 builtins/common.c:550
+#, c-format
+msgid "%s: ambiguous job spec"
+msgstr ""
+
+#: builtins/complete.def:251
+#, c-format
+msgid "%s: invalid action name"
+msgstr ""
+
+#: builtins/complete.def:381 builtins/complete.def:524
+#, c-format
+msgid "%s: no completion specification"
+msgstr ""
+
+#: builtins/complete.def:571
+msgid "warning: -F option may not work as you expect"
+msgstr ""
+
+#: builtins/complete.def:573
+msgid "warning: -C option may not work as you expect"
+msgstr ""
+
+#: builtins/declare.def:105
+msgid "can only be used in a function"
+msgstr ""
+
+#: builtins/declare.def:295
+msgid "cannot use `-f' to make functions"
+msgstr ""
+
+#: builtins/declare.def:307 execute_cmd.c:3949
+#, c-format
+msgid "%s: readonly function"
+msgstr ""
+
+#: builtins/declare.def:389
+#, c-format
+msgid "%s: cannot destroy array variables in this way"
+msgstr ""
+
+#: builtins/enable.def:128 builtins/enable.def:136
+msgid "dynamic loading not available"
+msgstr ""
+
+#: builtins/enable.def:303
+#, c-format
+msgid "cannot open shared object %s: %s"
+msgstr ""
+
+#: builtins/enable.def:326
+#, c-format
+msgid "cannot find %s in shared object %s: %s"
+msgstr ""
+
+#: builtins/enable.def:450
+#, c-format
+msgid "%s: not dynamically loaded"
+msgstr ""
+
+#: builtins/enable.def:465
+#, c-format
+msgid "%s: cannot delete: %s"
+msgstr ""
+
+#: builtins/evalfile.c:128 execute_cmd.c:3821 shell.c:1395
+#, c-format
+msgid "%s: is a directory"
+msgstr ""
+
+#: builtins/evalfile.c:133
+#, c-format
+msgid "%s: not a regular file"
+msgstr ""
+
+#: builtins/evalfile.c:141
+#, c-format
+msgid "%s: file is too large"
+msgstr ""
+
+#: builtins/exec.def:205
+#, c-format
+msgid "%s: cannot execute: %s"
+msgstr ""
+
+#: builtins/exit.def:83
+msgid "not login shell: use `exit'"
+msgstr ""
+
+#: builtins/exit.def:111
+msgid "There are stopped jobs.\n"
+msgstr ""
+
+#: builtins/fc.def:252
+msgid "no command found"
+msgstr ""
+
+#: builtins/fc.def:317
+msgid "history specification"
+msgstr ""
+
+#: builtins/fc.def:338
+#, c-format
+msgid "%s: cannot open temp file: %s"
+msgstr ""
+
+#: builtins/fg_bg.def:133
+#, c-format
+msgid "job %d started without job control"
+msgstr ""
+
+#: builtins/getopt.c:109
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr ""
+
+#: builtins/getopt.c:110
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr ""
+
+#: builtins/hash.def:83
+msgid "hashing disabled"
+msgstr ""
+
+#: builtins/hash.def:128
+#, c-format
+msgid "%s: hash table empty\n"
+msgstr ""
+
+#: builtins/help.def:108
+msgid "Shell commands matching keywords `"
+msgstr ""
+
+#: builtins/help.def:110
+msgid "Shell commands matching keyword `"
+msgstr ""
+
+#: builtins/help.def:138
+#, c-format
+msgid ""
+"no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."
+msgstr ""
+
+#: builtins/help.def:164
+#, c-format
+msgid "%s: cannot open: %s"
+msgstr ""
+
+#: builtins/help.def:182
+msgid ""
+"These shell commands are defined internally.  Type `help' to see this list.\n"
+"Type `help name' to find out more about the function `name'.\n"
+"Use `info bash' to find out more about the shell in general.\n"
+"Use `man -k' or `info' to find out more about commands not in this list.\n"
+"\n"
+"A star (*) next to a name means that the command is disabled.\n"
+"\n"
+msgstr ""
+
+#: builtins/history.def:148
+msgid "cannot use more than one of -anrw"
+msgstr ""
+
+#: builtins/history.def:180
+msgid "history position"
+msgstr ""
+
+#: builtins/history.def:390
+#, c-format
+msgid "%s: history expansion failed"
+msgstr ""
+
+#: builtins/jobs.def:102
+msgid "no other options allowed with `-x'"
+msgstr ""
+
+#: builtins/kill.def:187
+#, c-format
+msgid "%s: arguments must be process or job IDs"
+msgstr ""
+
+#: builtins/kill.def:248
+msgid "Unknown error"
+msgstr ""
+
+#: builtins/let.def:94 builtins/let.def:119 expr.c:496 expr.c:511
+msgid "expression expected"
+msgstr ""
+
+#: builtins/printf.def:249
+#, c-format
+msgid "`%s': missing format character"
+msgstr ""
+
+#: builtins/printf.def:408
+#, c-format
+msgid "`%c': invalid format character"
+msgstr ""
+
+#: builtins/printf.def:601
+msgid "missing hex digit for \\x"
+msgstr ""
+
+#: builtins/pushd.def:168
+msgid "no other directory"
+msgstr ""
+
+#: builtins/pushd.def:435
+msgid "<no current directory>"
+msgstr ""
+
+#: builtins/pushd.def:652 builtins.c:1351
+msgid "Display the list of currently remembered directories.  Directories"
+msgstr ""
+
+#: builtins/pushd.def:653 builtins.c:1352
+msgid "find their way onto the list with the `pushd' command; you can get"
+msgstr ""
+
+#: builtins/pushd.def:654 builtins.c:1353
+msgid "back up through the list with the `popd' command."
+msgstr ""
+
+#: builtins/pushd.def:656 builtins.c:1355
+msgid "The -l flag specifies that `dirs' should not print shorthand versions"
+msgstr ""
+
+#: builtins/pushd.def:657 builtins.c:1356
+msgid "of directories which are relative to your home directory.  This means"
+msgstr ""
+
+#: builtins/pushd.def:658 builtins.c:1357
+msgid "that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag"
+msgstr ""
+
+#: builtins/pushd.def:659 builtins.c:1358
+msgid "causes `dirs' to print the directory stack with one entry per line,"
+msgstr ""
+
+#: builtins/pushd.def:660 builtins.c:1359
+msgid "prepending the directory name with its position in the stack.  The -p"
+msgstr ""
+
+#: builtins/pushd.def:661 builtins.c:1360
+msgid "flag does the same thing, but the stack position is not prepended."
+msgstr ""
+
+#: builtins/pushd.def:662 builtins.c:1361
+msgid "The -c flag clears the directory stack by deleting all of the elements."
+msgstr ""
+
+#: builtins/pushd.def:664
+msgid "+N   displays the Nth entry counting from the left of the list shown by"
+msgstr ""
+
+#: builtins/pushd.def:665 builtins/pushd.def:668
+msgid "     dirs when invoked without options, starting with zero."
+msgstr ""
+
+#: builtins/pushd.def:667
+msgid ""
+"-N   displays the Nth entry counting from the right of the list shown by"
+msgstr ""
+
+#: builtins/pushd.def:673 builtins.c:1302
+msgid "Adds a directory to the top of the directory stack, or rotates"
+msgstr ""
+
+#: builtins/pushd.def:674 builtins.c:1303
+msgid "the stack, making the new top of the stack the current working"
+msgstr ""
+
+#: builtins/pushd.def:675 builtins.c:1304
+msgid "directory.  With no arguments, exchanges the top two directories."
+msgstr ""
+
+#: builtins/pushd.def:677
+msgid "+N   Rotates the stack so that the Nth directory (counting"
+msgstr ""
+
+#: builtins/pushd.def:678
+msgid "     from the left of the list shown by `dirs', starting with"
+msgstr ""
+
+#: builtins/pushd.def:679 builtins/pushd.def:683
+msgid "     zero) is at the top."
+msgstr ""
+
+#: builtins/pushd.def:681
+msgid "-N   Rotates the stack so that the Nth directory (counting"
+msgstr ""
+
+#: builtins/pushd.def:682
+msgid "     from the right of the list shown by `dirs', starting with"
+msgstr ""
+
+#: builtins/pushd.def:685
+msgid "-n   suppress the normal change of directory when adding directories"
+msgstr ""
+
+#: builtins/pushd.def:686
+msgid "     to the stack, so only the stack is manipulated."
+msgstr ""
+
+#: builtins/pushd.def:688
+msgid "dir  adds DIR to the directory stack at the top, making it the"
+msgstr ""
+
+#: builtins/pushd.def:689
+msgid "     new current working directory."
+msgstr ""
+
+#: builtins/pushd.def:691 builtins/pushd.def:711 builtins.c:1320
+#: builtins.c:1343
+msgid "You can see the directory stack with the `dirs' command."
+msgstr ""
+
+#: builtins/pushd.def:696 builtins.c:1328
+msgid "Removes entries from the directory stack.  With no arguments,"
+msgstr ""
+
+#: builtins/pushd.def:697 builtins.c:1329
+msgid "removes the top directory from the stack, and cd's to the new"
+msgstr ""
+
+#: builtins/pushd.def:698 builtins.c:1330
+msgid "top directory."
+msgstr ""
+
+#: builtins/pushd.def:700
+msgid "+N   removes the Nth entry counting from the left of the list"
+msgstr ""
+
+#: builtins/pushd.def:701
+msgid "     shown by `dirs', starting with zero.  For example: `popd +0'"
+msgstr ""
+
+#: builtins/pushd.def:702
+msgid "     removes the first directory, `popd +1' the second."
+msgstr ""
+
+#: builtins/pushd.def:704
+msgid "-N   removes the Nth entry counting from the right of the list"
+msgstr ""
+
+#: builtins/pushd.def:705
+msgid "     shown by `dirs', starting with zero.  For example: `popd -0'"
+msgstr ""
+
+#: builtins/pushd.def:706
+msgid "     removes the last directory, `popd -1' the next to last."
+msgstr ""
+
+#: builtins/pushd.def:708
+msgid "-n   suppress the normal change of directory when removing directories"
+msgstr ""
+
+#: builtins/pushd.def:709
+msgid "     from the stack, so only the stack is manipulated."
+msgstr ""
+
+#: builtins/read.def:207
+#, c-format
+msgid "%s: invalid timeout specification"
+msgstr ""
+
+#: builtins/read.def:230
+#, c-format
+msgid "%s: invalid file descriptor specification"
+msgstr ""
+
+#: builtins/read.def:237
+#, c-format
+msgid "%d: invalid file descriptor: %s"
+msgstr ""
+
+#: builtins/read.def:463
+#, c-format
+msgid "read error: %d: %s"
+msgstr ""
+
+#: builtins/return.def:63
+msgid "can only `return' from a function or sourced script"
+msgstr ""
+
+#: builtins/set.def:743
+msgid "cannot simultaneously unset a function and a variable"
+msgstr ""
+
+#: builtins/set.def:780
+#, c-format
+msgid "%s: cannot unset"
+msgstr ""
+
+#: builtins/set.def:787
+#, c-format
+msgid "%s: cannot unset: readonly %s"
+msgstr ""
+
+#: builtins/set.def:798
+#, c-format
+msgid "%s: not an array variable"
+msgstr ""
+
+#: builtins/setattr.def:165
+#, c-format
+msgid "%s: not a function"
+msgstr ""
+
+#: builtins/shift.def:66 builtins/shift.def:72
+msgid "shift count"
+msgstr ""
+
+#: builtins/shopt.def:226
+msgid "cannot set and unset shell options simultaneously"
+msgstr ""
+
+#: builtins/shopt.def:291
+#, c-format
+msgid "%s: invalid shell option name"
+msgstr ""
+
+#: builtins/source.def:117
+msgid "filename argument required"
+msgstr ""
+
+#: builtins/source.def:137
+#, c-format
+msgid "%s: file not found"
+msgstr ""
+
+#: builtins/suspend.def:93
+msgid "cannot suspend"
+msgstr ""
+
+#: builtins/suspend.def:103
+msgid "cannot suspend a login shell"
+msgstr ""
+
+#: builtins/type.def:231
+#, c-format
+msgid "%s is aliased to `%s'\n"
+msgstr ""
+
+#: builtins/type.def:252
+#, c-format
+msgid "%s is a shell keyword\n"
+msgstr ""
+
+#: builtins/type.def:272
+#, c-format
+msgid "%s is a function\n"
+msgstr ""
+
+#: builtins/type.def:297
+#, c-format
+msgid "%s is a shell builtin\n"
+msgstr ""
+
+#: builtins/type.def:318
+#, c-format
+msgid "%s is %s\n"
+msgstr ""
+
+#: builtins/type.def:338
+#, c-format
+msgid "%s is hashed (%s)\n"
+msgstr ""
+
+#: builtins/ulimit.def:332
+#, c-format
+msgid "%s: invalid limit argument"
+msgstr ""
+
+#: builtins/ulimit.def:358
+#, c-format
+msgid "`%c': bad command"
+msgstr ""
+
+#: builtins/ulimit.def:387
+#, c-format
+msgid "%s: cannot get limit: %s"
+msgstr ""
+
+#: builtins/ulimit.def:425
+#, c-format
+msgid "%s: cannot modify limit: %s"
+msgstr ""
+
+#: builtins/umask.def:112
+msgid "octal number"
+msgstr ""
+
+#: builtins/umask.def:226
+#, c-format
+msgid "`%c': invalid symbolic mode operator"
+msgstr ""
+
+#: builtins/umask.def:279
+#, c-format
+msgid "`%c': invalid symbolic mode character"
+msgstr ""
+
+#: error.c:165
+#, c-format
+msgid "last command: %s\n"
+msgstr ""
+
+#: error.c:173
+msgid "Aborting..."
+msgstr ""
+
+#: error.c:260
+#, c-format
+msgid "%s: warning: "
+msgstr ""
+
+#: error.c:405
+msgid "unknown command error"
+msgstr ""
+
+#: error.c:406
+msgid "bad command type"
+msgstr ""
+
+#: error.c:407
+msgid "bad connector"
+msgstr ""
+
+#: error.c:408
+msgid "bad jump"
+msgstr ""
+
+#: error.c:446
+#, c-format
+msgid "%s: unbound variable"
+msgstr ""
+
+#: eval.c:175
+msgid "\atimed out waiting for input: auto-logout\n"
+msgstr ""
+
+#: execute_cmd.c:466
+#, c-format
+msgid "cannot redirect standard input from /dev/null: %s"
+msgstr ""
+
+#: execute_cmd.c:1036
+#, c-format
+msgid "TIMEFORMAT: `%c': invalid format character"
+msgstr ""
+
+#: execute_cmd.c:3521
+#, c-format
+msgid "%s: restricted: cannot specify `/' in command names"
+msgstr ""
+
+#: execute_cmd.c:3609
+#, c-format
+msgid "%s: command not found"
+msgstr ""
+
+#: execute_cmd.c:3839
+#, c-format
+msgid "%s: %s: bad interpreter"
+msgstr ""
+
+#: execute_cmd.c:3876
+#, c-format
+msgid "%s: cannot execute binary file"
+msgstr ""
+
+#: execute_cmd.c:3988
+#, c-format
+msgid "cannot duplicate fd %d to fd %d"
+msgstr ""
+
+#: expr.c:239
+msgid "expression recursion level exceeded"
+msgstr ""
+
+#: expr.c:263
+msgid "recursion stack underflow"
+msgstr ""
+
+#: expr.c:374
+msgid "syntax error in expression"
+msgstr ""
+
+#: expr.c:414
+msgid "attempted assignment to non-variable"
+msgstr ""
+
+#: expr.c:435 expr.c:440 expr.c:750
+msgid "division by 0"
+msgstr ""
+
+#: expr.c:466
+msgid "bug: bad expassign token"
+msgstr ""
+
+#: expr.c:508
+msgid "`:' expected for conditional expression"
+msgstr ""
+
+#: expr.c:775
+msgid "exponent less than 0"
+msgstr ""
+
+#: expr.c:819
+msgid "identifier expected after pre-increment or pre-decrement"
+msgstr ""
+
+#: expr.c:847
+msgid "missing `)'"
+msgstr ""
+
+#: expr.c:871
+msgid "syntax error: operand expected"
+msgstr ""
+
+#: expr.c:1146
+msgid "invalid number"
+msgstr ""
+
+#: expr.c:1150
+msgid "invalid arithmetic base"
+msgstr ""
+
+#: expr.c:1170
+msgid "value too great for base"
+msgstr ""
+
+#: general.c:60
+msgid "getcwd: cannot access parent directories"
+msgstr ""
+
+#: input.c:231
+#, c-format
+msgid "cannot allocate new file descriptor for bash input from fd %d"
+msgstr ""
+
+#: input.c:239
+#, c-format
+msgid "save_bash_input: buffer already exists for new fd %d"
+msgstr ""
+
+#: jobs.c:693
+#, c-format
+msgid "deleting stopped job %d with process group %ld"
+msgstr ""
+
+#: jobs.c:1001
+#, c-format
+msgid "describe_pid: %ld: no such pid"
+msgstr ""
+
+#: jobs.c:1632 nojobs.c:648
+#, c-format
+msgid "wait: pid %ld is not a child of this shell"
+msgstr ""
+
+#: jobs.c:1815
+#, c-format
+msgid "wait_for: No record of process %ld"
+msgstr ""
+
+#: jobs.c:2062
+#, c-format
+msgid "wait_for_job: job %d is stopped"
+msgstr ""
+
+#: jobs.c:2284
+#, c-format
+msgid "%s: job has terminated"
+msgstr ""
+
+#: jobs.c:2293
+#, c-format
+msgid "%s: job %d already in background"
+msgstr ""
+
+#: jobs.c:3037
+msgid "no job control in this shell"
+msgstr ""
+
+#: lib/malloc/malloc.c:298
+#, c-format
+msgid "malloc: failed assertion: %s\n"
+msgstr ""
+
+#: lib/malloc/malloc.c:314
+#, c-format
+msgid ""
+"\r\n"
+"malloc: %s:%d: assertion botched\r\n"
+msgstr ""
+
+#: lib/malloc/malloc.c:740
+msgid "malloc: block on free list clobbered"
+msgstr ""
+
+#: lib/malloc/malloc.c:817
+msgid "free: called with already freed block argument"
+msgstr ""
+
+#: lib/malloc/malloc.c:820
+msgid "free: called with unallocated block argument"
+msgstr ""
+
+#: lib/malloc/malloc.c:839
+msgid "free: underflow detected; mh_nbytes out of range"
+msgstr ""
+
+#: lib/malloc/malloc.c:845
+msgid "free: start and end chunk sizes differ"
+msgstr ""
+
+#: lib/malloc/malloc.c:942
+msgid "realloc: called with unallocated block argument"
+msgstr ""
+
+#: lib/malloc/malloc.c:957
+msgid "realloc: underflow detected; mh_nbytes out of range"
+msgstr ""
+
+#: lib/malloc/malloc.c:963
+msgid "realloc: start and end chunk sizes differ"
+msgstr ""
+
+#: lib/malloc/table.c:175
+msgid "register_alloc: alloc table is full with FIND_ALLOC?\n"
+msgstr ""
+
+#: lib/malloc/table.c:182
+#, c-format
+msgid "register_alloc: %p already in table as allocated?\n"
+msgstr ""
+
+#: lib/malloc/table.c:218
+#, c-format
+msgid "register_free: %p already in table as free?\n"
+msgstr ""
+
+#: lib/malloc/watch.c:46
+msgid "allocated"
+msgstr ""
+
+#: lib/malloc/watch.c:48
+msgid "freed"
+msgstr ""
+
+#: lib/malloc/watch.c:50
+msgid "requesting resize"
+msgstr ""
+
+#: lib/malloc/watch.c:52
+msgid "just resized"
+msgstr ""
+
+#: lib/malloc/watch.c:54
+msgid "bug: unknown operation"
+msgstr ""
+
+#: lib/malloc/watch.c:56
+#, c-format
+msgid "malloc: watch alert: %p %s "
+msgstr ""
+
+#: lib/sh/fmtulong.c:101
+msgid "invalid base"
+msgstr ""
+
+#: lib/sh/netopen.c:158
+#, c-format
+msgid "%s: host unknown"
+msgstr ""
+
+#: lib/sh/netopen.c:165
+#, c-format
+msgid "%s: invalid service"
+msgstr ""
+
+#: lib/sh/netopen.c:296
+#, c-format
+msgid "%s: bad network path specification"
+msgstr ""
+
+#: lib/sh/netopen.c:336
+msgid "network operations not supported"
+msgstr ""
+
+#: mailcheck.c:382
+msgid "You have mail in $_"
+msgstr ""
+
+#: mailcheck.c:407
+msgid "You have new mail in $_"
+msgstr ""
+
+#: mailcheck.c:423
+#, c-format
+msgid "The mail in %s has been read\n"
+msgstr ""
+
+#: make_cmd.c:318
+msgid "syntax error: arithmetic expression required"
+msgstr ""
+
+#: make_cmd.c:320
+msgid "syntax error: `;' unexpected"
+msgstr ""
+
+#: make_cmd.c:321
+#, c-format
+msgid "syntax error: `((%s))'"
+msgstr ""
+
+#: make_cmd.c:560
+#, c-format
+msgid "make_here_document: bad instruction type %d"
+msgstr ""
+
+#: make_cmd.c:730
+#, c-format
+msgid "make_redirection: redirection instruction `%d' out of range"
+msgstr ""
+
+#: parse.y:2726
+#, c-format
+msgid "unexpected EOF while looking for matching `%c'"
+msgstr ""
+
+#: parse.y:3011
+msgid "unexpected EOF while looking for `]]'"
+msgstr ""
+
+#: parse.y:3016
+#, c-format
+msgid "syntax error in conditional expression: unexpected token `%s'"
+msgstr ""
+
+#: parse.y:3020
+msgid "syntax error in conditional expression"
+msgstr ""
+
+#: parse.y:3098
+#, c-format
+msgid "unexpected token `%s', expected `)'"
+msgstr ""
+
+#: parse.y:3102
+msgid "expected `)'"
+msgstr ""
+
+#: parse.y:3130
+#, c-format
+msgid "unexpected argument `%s' to conditional unary operator"
+msgstr ""
+
+#: parse.y:3134
+msgid "unexpected argument to conditional unary operator"
+msgstr ""
+
+#: parse.y:3171
+#, c-format
+msgid "unexpected token `%s', conditional binary operator expected"
+msgstr ""
+
+#: parse.y:3175
+msgid "conditional binary operator expected"
+msgstr ""
+
+#: parse.y:3191
+#, c-format
+msgid "unexpected argument `%s' to conditional binary operator"
+msgstr ""
+
+#: parse.y:3195
+msgid "unexpected argument to conditional binary operator"
+msgstr ""
+
+#: parse.y:3206
+#, c-format
+msgid "unexpected token `%c' in conditional command"
+msgstr ""
+
+#: parse.y:3209
+#, c-format
+msgid "unexpected token `%s' in conditional command"
+msgstr ""
+
+#: parse.y:3213
+#, c-format
+msgid "unexpected token %d in conditional command"
+msgstr ""
+
+#: parse.y:4400
+#, c-format
+msgid "syntax error near unexpected token `%s'"
+msgstr ""
+
+#: parse.y:4418
+#, c-format
+msgid "syntax error near `%s'"
+msgstr ""
+
+#: parse.y:4428
+msgid "syntax error: unexpected end of file"
+msgstr ""
+
+#: parse.y:4428
+msgid "syntax error"
+msgstr ""
+
+#: parse.y:4490
+#, c-format
+msgid "Use \"%s\" to leave the shell.\n"
+msgstr ""
+
+#: parse.y:4649
+msgid "unexpected EOF while looking for matching `)'"
+msgstr ""
+
+#: pcomplete.c:988
+#, c-format
+msgid "completion: function `%s' not found"
+msgstr ""
+
+#: pcomplib.c:179
+#, c-format
+msgid "progcomp_insert: %s: NULL COMPSPEC"
+msgstr ""
+
+#: print_cmd.c:260
+#, c-format
+msgid "print_command: bad connector `%d'"
+msgstr ""
+
+#: print_cmd.c:1172
+#, c-format
+msgid "cprintf: `%c': invalid format character"
+msgstr ""
+
+#: redir.c:99
+msgid "file descriptor out of range"
+msgstr ""
+
+#: redir.c:141
+#, c-format
+msgid "%s: ambiguous redirect"
+msgstr ""
+
+#: redir.c:145
+#, c-format
+msgid "%s: cannot overwrite existing file"
+msgstr ""
+
+#: redir.c:150
+#, c-format
+msgid "%s: restricted: cannot redirect output"
+msgstr ""
+
+#: redir.c:155
+#, c-format
+msgid "cannot create temp file for here document: %s"
+msgstr ""
+
+#: redir.c:509
+msgid "/dev/(tcp|udp)/host/port not supported without networking"
+msgstr ""
+
+#: redir.c:949
+msgid "redirection error: cannot duplicate fd"
+msgstr ""
+
+#: shell.c:302
+msgid "could not find /tmp, please create!"
+msgstr ""
+
+#: shell.c:306
+msgid "/tmp must be a valid directory name"
+msgstr ""
+
+#: shell.c:839
+#, c-format
+msgid "%c%c: invalid option"
+msgstr ""
+
+#: shell.c:1590
+msgid "I have no name!"
+msgstr ""
+
+#: shell.c:1725
+#, c-format
+msgid ""
+"Usage:\t%s [GNU long option] [option] ...\n"
+"\t%s [GNU long option] [option] script-file ...\n"
+msgstr ""
+
+#: shell.c:1727
+msgid "GNU long options:\n"
+msgstr ""
+
+#: shell.c:1731
+msgid "Shell options:\n"
+msgstr ""
+
+#: shell.c:1732
+msgid "\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n"
+msgstr ""
+
+#: shell.c:1747
+#, c-format
+msgid "\t-%s or -o option\n"
+msgstr ""
+
+#: shell.c:1753
+#, c-format
+msgid "Type `%s -c \"help set\"' for more information about shell options.\n"
+msgstr ""
+
+#: shell.c:1754
+#, c-format
+msgid "Type `%s -c help' for more information about shell builtin commands.\n"
+msgstr ""
+
+#: shell.c:1755
+msgid "Use the `bashbug' command to report bugs.\n"
+msgstr ""
+
+#: sig.c:485
+#, c-format
+msgid "sigprocmask: %d: invalid operation"
+msgstr ""
+
+#: subst.c:1011
+#, c-format
+msgid "bad substitution: no closing `%s' in %s"
+msgstr ""
+
+#: subst.c:2020
+#, c-format
+msgid "%s: cannot assign list to array member"
+msgstr ""
+
+#: subst.c:3516 subst.c:3532
+msgid "cannot make pipe for process substitution"
+msgstr ""
+
+#: subst.c:3563
+msgid "cannot make child for process substitution"
+msgstr ""
+
+#: subst.c:3608
+#, c-format
+msgid "cannot open named pipe %s for reading"
+msgstr ""
+
+#: subst.c:3610
+#, c-format
+msgid "cannot open named pipe %s for writing"
+msgstr ""
+
+#: subst.c:3618
+#, c-format
+msgid "cannout reset nodelay mode for fd %d"
+msgstr ""
+
+#: subst.c:3628
+#, c-format
+msgid "cannot duplicate named pipe %s as fd %d"
+msgstr ""
+
+#: subst.c:3803
+msgid "cannot make pipe for command substitution"
+msgstr ""
+
+#: subst.c:3832
+msgid "cannot make child for command substitution"
+msgstr ""
+
+#: subst.c:3849
+msgid "command_substitute: cannot duplicate pipe as fd 1"
+msgstr ""
+
+#: subst.c:4284
+#, c-format
+msgid "%s: parameter null or not set"
+msgstr ""
+
+#: subst.c:4529
+#, c-format
+msgid "%s: substring expression < 0"
+msgstr ""
+
+#: subst.c:5209
+#, c-format
+msgid "%s: bad substitution"
+msgstr ""
+
+#: subst.c:5283
+#, c-format
+msgid "$%s: cannot assign in this way"
+msgstr ""
+
+#: subst.c:6652
+#, c-format
+msgid "no match: %s"
+msgstr ""
+
+#: test.c:154
+msgid "argument expected"
+msgstr ""
+
+#: test.c:163
+#, c-format
+msgid "%s: integer expression expected"
+msgstr ""
+
+#: test.c:361
+msgid "`)' expected"
+msgstr ""
+
+#: test.c:363
+#, c-format
+msgid "`)' expected, found %s"
+msgstr ""
+
+#: test.c:378 test.c:787 test.c:790
+#, c-format
+msgid "%s: unary operator expected"
+msgstr ""
+
+#: test.c:543 test.c:830
+#, c-format
+msgid "%s: binary operator expected"
+msgstr ""
+
+#: test.c:905
+msgid "missing `]'"
+msgstr ""
+
+#: trap.c:194
+msgid "invalid signal number"
+msgstr ""
+
+#: trap.c:309
+#, c-format
+msgid "run_pending_traps: bad value in trap_list[%d]: %p"
+msgstr ""
+
+#: trap.c:313
+#, c-format
+msgid ""
+"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+msgstr ""
+
+#: trap.c:349
+#, c-format
+msgid "trap_handler: bad signal %d"
+msgstr ""
+
+#: variables.c:310
+#, c-format
+msgid "error importing function definition for `%s'"
+msgstr ""
+
+#: variables.c:670
+#, c-format
+msgid "shell level (%d) too high, resetting to 1"
+msgstr ""
+
+#: variables.c:1610
+msgid "make_local_variable: no function context at current scope"
+msgstr ""
+
+#: variables.c:2709
+msgid "all_local_variables: no function context at current scope"
+msgstr ""
+
+#: variables.c:2923 variables.c:2932
+#, c-format
+msgid "invalid character %d in exportstr for %s"
+msgstr ""
+
+#: variables.c:2938
+#, c-format
+msgid "no `=' in exportstr for %s"
+msgstr ""
+
+#: variables.c:3363
+msgid "pop_var_context: head of shell_variables not a function context"
+msgstr ""
+
+#: variables.c:3376
+msgid "pop_var_context: no global_variables context"
+msgstr ""
+
+#: variables.c:3442
+msgid "pop_scope: head of shell_variables not a temporary environment scope"
+msgstr ""
+
+#: version.c:82
+msgid "Copyright (C) 2004 Free Software Foundation, Inc.\n"
+msgstr ""
+
+#: xmalloc.c:93
+#, c-format
+msgid "xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"
+msgstr ""
+
+#: xmalloc.c:95
+#, c-format
+msgid "xmalloc: cannot allocate %lu bytes"
+msgstr ""
+
+#: xmalloc.c:115
+#, c-format
+msgid "xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"
+msgstr ""
+
+#: xmalloc.c:117
+#, c-format
+msgid "xrealloc: cannot allocate %lu bytes"
+msgstr ""
+
+#: xmalloc.c:151
+#, c-format
+msgid "xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"
+msgstr ""
+
+#: xmalloc.c:153
+#, c-format
+msgid "xmalloc: %s:%d: cannot allocate %lu bytes"
+msgstr ""
+
+#: xmalloc.c:175
+#, c-format
+msgid "xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)"
+msgstr ""
+
+#: xmalloc.c:177
+#, c-format
+msgid "xrealloc: %s:%d: cannot allocate %lu bytes"
+msgstr ""
+
+#: builtins.c:244
+msgid "`alias' with no arguments or with the -p option prints the list"
+msgstr ""
+
+#: builtins.c:245
+msgid "of aliases in the form alias NAME=VALUE on standard output."
+msgstr ""
+
+#: builtins.c:246
+msgid "Otherwise, an alias is defined for each NAME whose VALUE is given."
+msgstr ""
+
+#: builtins.c:247
+msgid "A trailing space in VALUE causes the next word to be checked for"
+msgstr ""
+
+#: builtins.c:248
+msgid "alias substitution when the alias is expanded.  Alias returns"
+msgstr ""
+
+#: builtins.c:249
+msgid "true unless a NAME is given for which no alias has been defined."
+msgstr ""
+
+#: builtins.c:257
+msgid ""
+"Remove NAMEs from the list of defined aliases.  If the -a option is given,"
+msgstr ""
+
+#: builtins.c:258
+msgid "then remove all alias definitions."
+msgstr ""
+
+#: builtins.c:266
+msgid "Bind a key sequence to a Readline function or a macro, or set"
+msgstr ""
+
+#: builtins.c:267
+msgid "a Readline variable.  The non-option argument syntax is equivalent"
+msgstr ""
+
+#: builtins.c:268
+msgid "to that found in ~/.inputrc, but must be passed as a single argument:"
+msgstr ""
+
+#: builtins.c:269
+msgid "bind '\"\\C-x\\C-r\": re-read-init-file'."
+msgstr ""
+
+#: builtins.c:270
+msgid "bind accepts the following options:"
+msgstr ""
+
+#: builtins.c:271
+msgid ""
+"  -m  keymap         Use `keymap' as the keymap for the duration of this"
+msgstr ""
+
+#: builtins.c:272
+msgid "                     command.  Acceptable keymap names are emacs,"
+msgstr ""
+
+#: builtins.c:273
+msgid ""
+"                     emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,"
+msgstr ""
+
+#: builtins.c:274
+msgid "                     vi-command, and vi-insert."
+msgstr ""
+
+#: builtins.c:275
+msgid "  -l                 List names of functions."
+msgstr ""
+
+#: builtins.c:276
+msgid "  -P                 List function names and bindings."
+msgstr ""
+
+#: builtins.c:277
+msgid "  -p                 List functions and bindings in a form that can be"
+msgstr ""
+
+#: builtins.c:278
+msgid "                     reused as input."
+msgstr ""
+
+#: builtins.c:279
+msgid "  -r  keyseq         Remove the binding for KEYSEQ."
+msgstr ""
+
+#: builtins.c:280
+msgid "  -x  keyseq:shell-command\tCause SHELL-COMMAND to be executed when"
+msgstr ""
+
+#: builtins.c:281
+msgid "\t\t\t\tKEYSEQ is entered."
+msgstr ""
+
+#: builtins.c:282
+msgid "  -f  filename       Read key bindings from FILENAME."
+msgstr ""
+
+#: builtins.c:283
+msgid "  -q  function-name  Query about which keys invoke the named function."
+msgstr ""
+
+#: builtins.c:284
+msgid ""
+"  -u  function-name  Unbind all keys which are bound to the named function."
+msgstr ""
+
+#: builtins.c:285
+msgid "  -V                 List variable names and values"
+msgstr ""
+
+#: builtins.c:286
+msgid "  -v                 List variable names and values in a form that can"
+msgstr ""
+
+#: builtins.c:287
+msgid "                     be reused as input."
+msgstr ""
+
+#: builtins.c:288
+msgid ""
+"  -S                 List key sequences that invoke macros and their values"
+msgstr ""
+
+#: builtins.c:289
+msgid ""
+"  -s                 List key sequences that invoke macros and their values"
+msgstr ""
+
+#: builtins.c:290
+msgid "                     in a form that can be reused as input."
+msgstr ""
+
+#: builtins.c:297
+msgid "Exit from within a FOR, WHILE or UNTIL loop.  If N is specified,"
+msgstr ""
+
+#: builtins.c:298
+msgid "break N levels."
+msgstr ""
+
+#: builtins.c:304
+msgid "Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop."
+msgstr ""
+
+#: builtins.c:305
+msgid "If N is specified, resume at the N-th enclosing loop."
+msgstr ""
+
+#: builtins.c:311
+msgid "Run a shell builtin.  This is useful when you wish to rename a"
+msgstr ""
+
+#: builtins.c:312
+msgid "shell builtin to be a function, but need the functionality of the"
+msgstr ""
+
+#: builtins.c:313
+msgid "builtin within the function itself."
+msgstr ""
+
+#: builtins.c:334
+msgid "Change the current directory to DIR.  The variable $HOME is the"
+msgstr ""
+
+#: builtins.c:335
+msgid "default DIR.  The variable CDPATH defines the search path for"
+msgstr ""
+
+#: builtins.c:336
+msgid "the directory containing DIR.  Alternative directory names in CDPATH"
+msgstr ""
+
+#: builtins.c:337
+msgid "are separated by a colon (:).  A null directory name is the same as"
+msgstr ""
+
+#: builtins.c:338
+msgid "the current directory, i.e. `.'.  If DIR begins with a slash (/),"
+msgstr ""
+
+#: builtins.c:339
+msgid "then CDPATH is not used.  If the directory is not found, and the"
+msgstr ""
+
+#: builtins.c:340
+msgid "shell option `cdable_vars' is set, then try the word as a variable"
+msgstr ""
+
+#: builtins.c:341
+msgid "name.  If that variable has a value, then cd to the value of that"
+msgstr ""
+
+#: builtins.c:342
+msgid "variable.  The -P option says to use the physical directory structure"
+msgstr ""
+
+#: builtins.c:343
+msgid ""
+"instead of following symbolic links; the -L option forces symbolic links"
+msgstr ""
+
+#: builtins.c:344
+msgid "to be followed."
+msgstr ""
+
+#: builtins.c:350
+msgid "Print the current working directory.  With the -P option, pwd prints"
+msgstr ""
+
+#: builtins.c:351
+msgid "the physical directory, without any symbolic links; the -L option"
+msgstr ""
+
+#: builtins.c:352
+msgid "makes pwd follow symbolic links."
+msgstr ""
+
+#: builtins.c:358
+msgid "No effect; the command does nothing.  A zero exit code is returned."
+msgstr ""
+
+#: builtins.c:364
+msgid "Return a successful result."
+msgstr ""
+
+#: builtins.c:370
+msgid "Return an unsuccessful result."
+msgstr ""
+
+#: builtins.c:376
+msgid "Runs COMMAND with ARGS ignoring shell functions.  If you have a shell"
+msgstr ""
+
+#: builtins.c:377
+msgid "function called `ls', and you wish to call the command `ls', you can"
+msgstr ""
+
+#: builtins.c:378
+msgid "say \"command ls\".  If the -p option is given, a default value is used"
+msgstr ""
+
+#: builtins.c:379
+msgid "for PATH that is guaranteed to find all of the standard utilities.  If"
+msgstr ""
+
+#: builtins.c:380
+msgid "the -V or -v option is given, a string is printed describing COMMAND."
+msgstr ""
+
+#: builtins.c:381
+msgid "The -V option produces a more verbose description."
+msgstr ""
+
+#: builtins.c:387
+msgid "Declare variables and/or give them attributes.  If no NAMEs are"
+msgstr ""
+
+#: builtins.c:388
+msgid "given, then display the values of variables instead.  The -p option"
+msgstr ""
+
+#: builtins.c:389
+msgid "will display the attributes and values of each NAME."
+msgstr ""
+
+#: builtins.c:391
+msgid "The flags are:"
+msgstr ""
+
+#: builtins.c:393
+msgid "  -a\tto make NAMEs arrays (if supported)"
+msgstr ""
+
+#: builtins.c:394
+msgid "  -f\tto select from among function names only"
+msgstr ""
+
+#: builtins.c:395
+msgid ""
+"  -F\tto display function names (and line number and source file name if"
+msgstr ""
+
+#: builtins.c:396
+msgid "\tdebugging) without definitions"
+msgstr ""
+
+#: builtins.c:397
+msgid "  -i\tto make NAMEs have the `integer' attribute"
+msgstr ""
+
+#: builtins.c:398
+msgid "  -r\tto make NAMEs readonly"
+msgstr ""
+
+#: builtins.c:399
+msgid "  -t\tto make NAMEs have the `trace' attribute"
+msgstr ""
+
+#: builtins.c:400
+msgid "  -x\tto make NAMEs export"
+msgstr ""
+
+#: builtins.c:402
+msgid "Variables with the integer attribute have arithmetic evaluation (see"
+msgstr ""
+
+#: builtins.c:403
+msgid "`let') done when the variable is assigned to."
+msgstr ""
+
+#: builtins.c:405
+msgid "When displaying values of variables, -f displays a function's name"
+msgstr ""
+
+#: builtins.c:406
+msgid "and definition.  The -F option restricts the display to function"
+msgstr ""
+
+#: builtins.c:407
+msgid "name only."
+msgstr ""
+
+#: builtins.c:409
+msgid "Using `+' instead of `-' turns off the given attribute instead.  When"
+msgstr ""
+
+#: builtins.c:410
+msgid "used in a function, makes NAMEs local, as with the `local' command."
+msgstr ""
+
+#: builtins.c:416
+msgid "Obsolete.  See `declare'."
+msgstr ""
+
+#: builtins.c:422
+msgid "Create a local variable called NAME, and give it VALUE.  LOCAL"
+msgstr ""
+
+#: builtins.c:423
+msgid "can only be used within a function; it makes the variable NAME"
+msgstr ""
+
+#: builtins.c:424
+msgid "have a visible scope restricted to that function and its children."
+msgstr ""
+
+#: builtins.c:431
+msgid "Output the ARGs.  If -n is specified, the trailing newline is"
+msgstr ""
+
+#: builtins.c:432
+msgid "suppressed.  If the -e option is given, interpretation of the"
+msgstr ""
+
+#: builtins.c:433
+msgid "following backslash-escaped characters is turned on:"
+msgstr ""
+
+#: builtins.c:434
+msgid "\t\\a\talert (bell)"
+msgstr ""
+
+#: builtins.c:435
+msgid "\t\\b\tbackspace"
+msgstr ""
+
+#: builtins.c:436
+msgid "\t\\c\tsuppress trailing newline"
+msgstr ""
+
+#: builtins.c:437
+msgid "\t\\E\tescape character"
+msgstr ""
+
+#: builtins.c:438
+msgid "\t\\f\tform feed"
+msgstr ""
+
+#: builtins.c:439
+msgid "\t\\n\tnew line"
+msgstr ""
+
+#: builtins.c:440
+msgid "\t\\r\tcarriage return"
+msgstr ""
+
+#: builtins.c:441
+msgid "\t\\t\thorizontal tab"
+msgstr ""
+
+#: builtins.c:442
+msgid "\t\\v\tvertical tab"
+msgstr ""
+
+#: builtins.c:443
+msgid "\t\\\\\tbackslash"
+msgstr ""
+
+#: builtins.c:444
+msgid "\t\\num\tthe character whose ASCII code is NUM (octal)."
+msgstr ""
+
+#: builtins.c:446
+msgid "You can explicitly turn off the interpretation of the above characters"
+msgstr ""
+
+#: builtins.c:447
+msgid "with the -E option."
+msgstr ""
+
+#: builtins.c:455
+msgid ""
+"Output the ARGs.  If -n is specified, the trailing newline is suppressed."
+msgstr ""
+
+#: builtins.c:462
+msgid "Enable and disable builtin shell commands.  This allows"
+msgstr ""
+
+#: builtins.c:463
+msgid "you to use a disk command which has the same name as a shell"
+msgstr ""
+
+#: builtins.c:464
+msgid "builtin without specifying a full pathname.  If -n is used, the"
+msgstr ""
+
+#: builtins.c:465
+msgid "NAMEs become disabled; otherwise NAMEs are enabled.  For example,"
+msgstr ""
+
+#: builtins.c:466
+msgid "to use the `test' found in $PATH instead of the shell builtin"
+msgstr ""
+
+#: builtins.c:467
+msgid "version, type `enable -n test'.  On systems supporting dynamic"
+msgstr ""
+
+#: builtins.c:468
+msgid "loading, the -f option may be used to load new builtins from the"
+msgstr ""
+
+#: builtins.c:469
+msgid "shared object FILENAME.  The -d option will delete a builtin"
+msgstr ""
+
+#: builtins.c:470
+msgid "previously loaded with -f.  If no non-option names are given, or"
+msgstr ""
+
+#: builtins.c:471
+msgid "the -p option is supplied, a list of builtins is printed.  The"
+msgstr ""
+
+#: builtins.c:472
+msgid "-a option means to print every builtin with an indication of whether"
+msgstr ""
+
+#: builtins.c:473
+msgid ""
+"or not it is enabled.  The -s option restricts the output to the POSIX.2"
+msgstr ""
+
+#: builtins.c:474
+msgid ""
+"`special' builtins.  The -n option displays a list of all disabled builtins."
+msgstr ""
+
+#: builtins.c:480
+msgid "Read ARGs as input to the shell and execute the resulting command(s)."
+msgstr ""
+
+#: builtins.c:486
+msgid "Getopts is used by shell procedures to parse positional parameters."
+msgstr ""
+
+#: builtins.c:488
+msgid "OPTSTRING contains the option letters to be recognized; if a letter"
+msgstr ""
+
+#: builtins.c:489
+msgid "is followed by a colon, the option is expected to have an argument,"
+msgstr ""
+
+#: builtins.c:490
+msgid "which should be separated from it by white space."
+msgstr ""
+
+#: builtins.c:492
+msgid "Each time it is invoked, getopts will place the next option in the"
+msgstr ""
+
+#: builtins.c:493
+msgid "shell variable $name, initializing name if it does not exist, and"
+msgstr ""
+
+#: builtins.c:494
+msgid "the index of the next argument to be processed into the shell"
+msgstr ""
+
+#: builtins.c:495
+msgid "variable OPTIND.  OPTIND is initialized to 1 each time the shell or"
+msgstr ""
+
+#: builtins.c:496
+msgid "a shell script is invoked.  When an option requires an argument,"
+msgstr ""
+
+#: builtins.c:497
+msgid "getopts places that argument into the shell variable OPTARG."
+msgstr ""
+
+#: builtins.c:499
+msgid "getopts reports errors in one of two ways.  If the first character"
+msgstr ""
+
+#: builtins.c:500
+msgid "of OPTSTRING is a colon, getopts uses silent error reporting.  In"
+msgstr ""
+
+#: builtins.c:501
+msgid "this mode, no error messages are printed.  If an invalid option is"
+msgstr ""
+
+#: builtins.c:502
+msgid "seen, getopts places the option character found into OPTARG.  If a"
+msgstr ""
+
+#: builtins.c:503
+msgid "required argument is not found, getopts places a ':' into NAME and"
+msgstr ""
+
+#: builtins.c:504
+msgid "sets OPTARG to the option character found.  If getopts is not in"
+msgstr ""
+
+#: builtins.c:505
+msgid "silent mode, and an invalid option is seen, getopts places '?' into"
+msgstr ""
+
+#: builtins.c:506
+msgid "NAME and unsets OPTARG.  If a required argument is not found, a '?'"
+msgstr ""
+
+#: builtins.c:507
+msgid "is placed in NAME, OPTARG is unset, and a diagnostic message is"
+msgstr ""
+
+#: builtins.c:508
+msgid "printed."
+msgstr ""
+
+#: builtins.c:510
+msgid "If the shell variable OPTERR has the value 0, getopts disables the"
+msgstr ""
+
+#: builtins.c:511
+msgid "printing of error messages, even if the first character of"
+msgstr ""
+
+#: builtins.c:512
+msgid "OPTSTRING is not a colon.  OPTERR has the value 1 by default."
+msgstr ""
+
+#: builtins.c:514
+msgid "Getopts normally parses the positional parameters ($0 - $9), but if"
+msgstr ""
+
+#: builtins.c:515
+msgid "more arguments are given, they are parsed instead."
+msgstr ""
+
+#: builtins.c:521
+msgid "Exec FILE, replacing this shell with the specified program."
+msgstr ""
+
+#: builtins.c:522
+msgid "If FILE is not specified, the redirections take effect in this"
+msgstr ""
+
+#: builtins.c:523
+msgid "shell.  If the first argument is `-l', then place a dash in the"
+msgstr ""
+
+#: builtins.c:524
+msgid "zeroth arg passed to FILE, as login does.  If the `-c' option"
+msgstr ""
+
+#: builtins.c:525
+msgid "is supplied, FILE is executed with a null environment.  The `-a'"
+msgstr ""
+
+#: builtins.c:526
+msgid "option means to make set argv[0] of the executed process to NAME."
+msgstr ""
+
+#: builtins.c:527
+msgid "If the file cannot be executed and the shell is not interactive,"
+msgstr ""
+
+#: builtins.c:528
+msgid "then the shell exits, unless the shell option `execfail' is set."
+msgstr ""
+
+#: builtins.c:534
+msgid "Exit the shell with a status of N.  If N is omitted, the exit status"
+msgstr ""
+
+#: builtins.c:535
+msgid "is that of the last command executed."
+msgstr ""
+
+#: builtins.c:541
+msgid "Logout of a login shell."
+msgstr ""
+
+#: builtins.c:548
+msgid ""
+"fc is used to list or edit and re-execute commands from the history list."
+msgstr ""
+
+#: builtins.c:549
+msgid "FIRST and LAST can be numbers specifying the range, or FIRST can be a"
+msgstr ""
+
+#: builtins.c:550
+msgid "string, which means the most recent command beginning with that"
+msgstr ""
+
+#: builtins.c:551
+msgid "string."
+msgstr ""
+
+#: builtins.c:553
+msgid ""
+"   -e ENAME selects which editor to use.  Default is FCEDIT, then EDITOR,"
+msgstr ""
+
+#: builtins.c:554
+msgid "      then vi."
+msgstr ""
+
+#: builtins.c:556
+msgid "   -l means list lines instead of editing."
+msgstr ""
+
+#: builtins.c:557
+msgid "   -n means no line numbers listed."
+msgstr ""
+
+#: builtins.c:558
+msgid ""
+"   -r means reverse the order of the lines (making it newest listed first)."
+msgstr ""
+
+#: builtins.c:560
+msgid "With the `fc -s [pat=rep ...] [command]' format, the command is"
+msgstr ""
+
+#: builtins.c:561
+msgid "re-executed after the substitution OLD=NEW is performed."
+msgstr ""
+
+#: builtins.c:563
+msgid "A useful alias to use with this is r='fc -s', so that typing `r cc'"
+msgstr ""
+
+#: builtins.c:564
+msgid "runs the last command beginning with `cc' and typing `r' re-executes"
+msgstr ""
+
+#: builtins.c:565
+msgid "the last command."
+msgstr ""
+
+#: builtins.c:573
+msgid "Place JOB_SPEC in the foreground, and make it the current job.  If"
+msgstr ""
+
+#: builtins.c:574
+msgid "JOB_SPEC is not present, the shell's notion of the current job is"
+msgstr ""
+
+#: builtins.c:575
+msgid "used."
+msgstr ""
+
+#: builtins.c:583
+msgid "Place JOB_SPEC in the background, as if it had been started with"
+msgstr ""
+
+#: builtins.c:584
+msgid "`&'.  If JOB_SPEC is not present, the shell's notion of the current"
+msgstr ""
+
+#: builtins.c:585
+msgid "job is used."
+msgstr ""
+
+#: builtins.c:592
+msgid "For each NAME, the full pathname of the command is determined and"
+msgstr ""
+
+#: builtins.c:593
+msgid "remembered.  If the -p option is supplied, PATHNAME is used as the"
+msgstr ""
+
+#: builtins.c:594
+msgid "full pathname of NAME, and no path search is performed.  The -r"
+msgstr ""
+
+#: builtins.c:595
+msgid "option causes the shell to forget all remembered locations.  The -d"
+msgstr ""
+
+#: builtins.c:596
+msgid "option causes the shell to forget the remembered location of each NAME."
+msgstr ""
+
+#: builtins.c:597
+msgid "If the -t option is supplied the full pathname to which each NAME"
+msgstr ""
+
+#: builtins.c:598
+msgid "corresponds is printed.  If multiple NAME arguments are supplied with"
+msgstr ""
+
+#: builtins.c:599
+msgid "-t, the NAME is printed before the hashed full pathname.  The -l option"
+msgstr ""
+
+#: builtins.c:600
+msgid "causes output to be displayed in a format that may be reused as input."
+msgstr ""
+
+#: builtins.c:601
+msgid ""
+"If no arguments are given, information about remembered commands is "
+"displayed."
+msgstr ""
+
+#: builtins.c:608
+msgid "Display helpful information about builtin commands.  If PATTERN is"
+msgstr ""
+
+#: builtins.c:609
+msgid "specified, gives detailed help on all commands matching PATTERN,"
+msgstr ""
+
+#: builtins.c:610
+msgid "otherwise a list of the builtins is printed.  The -s option"
+msgstr ""
+
+#: builtins.c:611
+msgid "restricts the output for each builtin command matching PATTERN to"
+msgstr ""
+
+#: builtins.c:612
+msgid "a short usage synopsis."
+msgstr ""
+
+#: builtins.c:620
+msgid "Display the history list with line numbers.  Lines listed with"
+msgstr ""
+
+#: builtins.c:621
+msgid "with a `*' have been modified.  Argument of N says to list only"
+msgstr ""
+
+#: builtins.c:622
+msgid "the last N lines.  The `-c' option causes the history list to be"
+msgstr ""
+
+#: builtins.c:623
+msgid "cleared by deleting all of the entries.  The `-d' option deletes"
+msgstr ""
+
+#: builtins.c:624
+msgid "the history entry at offset OFFSET.  The `-w' option writes out the"
+msgstr ""
+
+#: builtins.c:625
+msgid "current history to the history file;  `-r' means to read the file and"
+msgstr ""
+
+#: builtins.c:626
+msgid "append the contents to the history list instead.  `-a' means"
+msgstr ""
+
+#: builtins.c:627
+msgid "to append history lines from this session to the history file."
+msgstr ""
+
+#: builtins.c:628
+msgid "Argument `-n' means to read all history lines not already read"
+msgstr ""
+
+#: builtins.c:629
+msgid "from the history file and append them to the history list."
+msgstr ""
+
+#: builtins.c:631
+msgid "If FILENAME is given, then that is used as the history file else"
+msgstr ""
+
+#: builtins.c:632
+msgid "if $HISTFILE has a value, that is used, else ~/.bash_history."
+msgstr ""
+
+#: builtins.c:633
+msgid "If the -s option is supplied, the non-option ARGs are appended to"
+msgstr ""
+
+#: builtins.c:634
+msgid "the history list as a single entry.  The -p option means to perform"
+msgstr ""
+
+#: builtins.c:635
+msgid "history expansion on each ARG and display the result, without storing"
+msgstr ""
+
+#: builtins.c:636
+msgid "anything in the history list."
+msgstr ""
+
+#: builtins.c:638
+msgid "If the $HISTTIMEFORMAT variable is set and not null, its value is used"
+msgstr ""
+
+#: builtins.c:639
+msgid "as a format string for strftime(3) to print the time stamp associated"
+msgstr ""
+
+#: builtins.c:640
+msgid ""
+"with each displayed history entry.  No time stamps are printed otherwise."
+msgstr ""
+
+#: builtins.c:648
+msgid "Lists the active jobs.  The -l option lists process id's in addition"
+msgstr ""
+
+#: builtins.c:649
+msgid "to the normal information; the -p option lists process id's only."
+msgstr ""
+
+#: builtins.c:650
+msgid "If -n is given, only processes that have changed status since the last"
+msgstr ""
+
+#: builtins.c:651
+msgid "notification are printed.  JOBSPEC restricts output to that job.  The"
+msgstr ""
+
+#: builtins.c:652
+msgid "-r and -s options restrict output to running and stopped jobs only,"
+msgstr ""
+
+#: builtins.c:653
+msgid "respectively.  Without options, the status of all active jobs is"
+msgstr ""
+
+#: builtins.c:654
+msgid "printed.  If -x is given, COMMAND is run after all job specifications"
+msgstr ""
+
+#: builtins.c:655
+msgid ""
+"that appear in ARGS have been replaced with the process ID of that job's"
+msgstr ""
+
+#: builtins.c:656
+msgid "process group leader."
+msgstr ""
+
+#: builtins.c:664
+msgid ""
+"By default, removes each JOBSPEC argument from the table of active jobs."
+msgstr ""
+
+#: builtins.c:665
+msgid ""
+"If the -h option is given, the job is not removed from the table, but is"
+msgstr ""
+
+#: builtins.c:666
+msgid "marked so that SIGHUP is not sent to the job if the shell receives a"
+msgstr ""
+
+#: builtins.c:667
+msgid ""
+"SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all"
+msgstr ""
+
+#: builtins.c:668
+msgid ""
+"jobs from the job table; the -r option means to remove only running jobs."
+msgstr ""
+
+#: builtins.c:675
+msgid "Send the processes named by PID (or JOB) the signal SIGSPEC.  If"
+msgstr ""
+
+#: builtins.c:676
+msgid "SIGSPEC is not present, then SIGTERM is assumed.  An argument of `-l'"
+msgstr ""
+
+#: builtins.c:677
+msgid "lists the signal names; if arguments follow `-l' they are assumed to"
+msgstr ""
+
+#: builtins.c:678
+msgid "be signal numbers for which names should be listed.  Kill is a shell"
+msgstr ""
+
+#: builtins.c:679
+msgid "builtin for two reasons: it allows job IDs to be used instead of"
+msgstr ""
+
+#: builtins.c:680
+msgid "process IDs, and, if you have reached the limit on processes that"
+msgstr ""
+
+#: builtins.c:681
+msgid "you can create, you don't have to start a process to kill another one."
+msgstr ""
+
+#: builtins.c:687
+msgid "Each ARG is an arithmetic expression to be evaluated.  Evaluation"
+msgstr ""
+
+#: builtins.c:688
+msgid "is done in fixed-width integers with no check for overflow, though"
+msgstr ""
+
+#: builtins.c:689
+msgid "division by 0 is trapped and flagged as an error.  The following"
+msgstr ""
+
+#: builtins.c:690
+msgid "list of operators is grouped into levels of equal-precedence operators."
+msgstr ""
+
+#: builtins.c:691
+msgid "The levels are listed in order of decreasing precedence."
+msgstr ""
+
+#: builtins.c:693
+msgid "\tid++, id--\tvariable post-increment, post-decrement"
+msgstr ""
+
+#: builtins.c:694
+msgid "\t++id, --id\tvariable pre-increment, pre-decrement"
+msgstr ""
+
+#: builtins.c:695
+msgid "\t-, +\t\tunary minus, plus"
+msgstr ""
+
+#: builtins.c:696
+msgid "\t!, ~\t\tlogical and bitwise negation"
+msgstr ""
+
+#: builtins.c:697
+msgid "\t**\t\texponentiation"
+msgstr ""
+
+#: builtins.c:698
+msgid "\t*, /, %\t\tmultiplication, division, remainder"
+msgstr ""
+
+#: builtins.c:699
+msgid "\t+, -\t\taddition, subtraction"
+msgstr ""
+
+#: builtins.c:700
+msgid "\t<<, >>\t\tleft and right bitwise shifts"
+msgstr ""
+
+#: builtins.c:701
+msgid "\t<=, >=, <, >\tcomparison"
+msgstr ""
+
+#: builtins.c:702
+msgid "\t==, !=\t\tequality, inequality"
+msgstr ""
+
+#: builtins.c:703
+msgid "\t&\t\tbitwise AND"
+msgstr ""
+
+#: builtins.c:704
+msgid "\t^\t\tbitwise XOR"
+msgstr ""
+
+#: builtins.c:705
+msgid "\t|\t\tbitwise OR"
+msgstr ""
+
+#: builtins.c:706
+msgid "\t&&\t\tlogical AND"
+msgstr ""
+
+#: builtins.c:707
+msgid "\t||\t\tlogical OR"
+msgstr ""
+
+#: builtins.c:708
+msgid "\texpr ? expr : expr"
+msgstr ""
+
+#: builtins.c:709
+msgid "\t\t\tconditional operator"
+msgstr ""
+
+#: builtins.c:710
+msgid "\t=, *=, /=, %=,"
+msgstr ""
+
+#: builtins.c:711
+msgid "\t+=, -=, <<=, >>=,"
+msgstr ""
+
+#: builtins.c:712
+msgid "\t&=, ^=, |=\tassignment"
+msgstr ""
+
+#: builtins.c:714
+msgid "Shell variables are allowed as operands.  The name of the variable"
+msgstr ""
+
+#: builtins.c:715
+msgid "is replaced by its value (coerced to a fixed-width integer) within"
+msgstr ""
+
+#: builtins.c:716
+msgid "an expression.  The variable need not have its integer attribute"
+msgstr ""
+
+#: builtins.c:717
+msgid "turned on to be used in an expression."
+msgstr ""
+
+#: builtins.c:719
+msgid "Operators are evaluated in order of precedence.  Sub-expressions in"
+msgstr ""
+
+#: builtins.c:720
+msgid "parentheses are evaluated first and may override the precedence"
+msgstr ""
+
+#: builtins.c:721
+msgid "rules above."
+msgstr ""
+
+#: builtins.c:723
+msgid "If the last ARG evaluates to 0, let returns 1; 0 is returned"
+msgstr ""
+
+#: builtins.c:724
+msgid "otherwise."
+msgstr ""
+
+#: builtins.c:730
+msgid ""
+"One line is read from the standard input, or from file descriptor FD if the"
+msgstr ""
+
+#: builtins.c:731
+msgid ""
+"-u option is supplied, and the first word is assigned to the first NAME,"
+msgstr ""
+
+#: builtins.c:732
+msgid ""
+"the second word to the second NAME, and so on, with leftover words assigned"
+msgstr ""
+
+#: builtins.c:733
+msgid ""
+"to the last NAME.  Only the characters found in $IFS are recognized as word"
+msgstr ""
+
+#: builtins.c:734
+msgid ""
+"delimiters.  If no NAMEs are supplied, the line read is stored in the REPLY"
+msgstr ""
+
+#: builtins.c:735
+msgid "variable.  If the -r option is given, this signifies `raw' input, and"
+msgstr ""
+
+#: builtins.c:736
+msgid "backslash escaping is disabled.  The -d option causes read to continue"
+msgstr ""
+
+#: builtins.c:737
+msgid ""
+"until the first character of DELIM is read, rather than newline.  If the -p"
+msgstr ""
+
+#: builtins.c:738
+msgid ""
+"option is supplied, the string PROMPT is output without a trailing newline"
+msgstr ""
+
+#: builtins.c:739
+msgid ""
+"before attempting to read.  If -a is supplied, the words read are assigned"
+msgstr ""
+
+#: builtins.c:740
+msgid ""
+"to sequential indices of ARRAY, starting at zero.  If -e is supplied and"
+msgstr ""
+
+#: builtins.c:741
+msgid ""
+"the shell is interactive, readline is used to obtain the line.  If -n is"
+msgstr ""
+
+#: builtins.c:742
+msgid "supplied with a non-zero NCHARS argument, read returns after NCHARS"
+msgstr ""
+
+#: builtins.c:743
+msgid "characters have been read.  The -s option causes input coming from a"
+msgstr ""
+
+#: builtins.c:744
+msgid "terminal to not be echoed."
+msgstr ""
+
+#: builtins.c:746
+msgid ""
+"The -t option causes read to time out and return failure if a complete line"
+msgstr ""
+
+#: builtins.c:747
+msgid ""
+"of input is not read within TIMEOUT seconds.  If the TMOUT variable is set,"
+msgstr ""
+
+#: builtins.c:748
+msgid ""
+"its value is the default timeout.  The return code is zero, unless end-of-"
+"file"
+msgstr ""
+
+#: builtins.c:749
+msgid ""
+"is encountered, read times out, or an invalid file descriptor is supplied as"
+msgstr ""
+
+#: builtins.c:750
+msgid "the argument to -u."
+msgstr ""
+
+#: builtins.c:756
+msgid "Causes a function to exit with the return value specified by N.  If N"
+msgstr ""
+
+#: builtins.c:757
+msgid "is omitted, the return status is that of the last command."
+msgstr ""
+
+#: builtins.c:763
+msgid "    -a  Mark variables which are modified or created for export."
+msgstr ""
+
+#: builtins.c:764
+msgid "    -b  Notify of job termination immediately."
+msgstr ""
+
+#: builtins.c:765
+msgid "    -e  Exit immediately if a command exits with a non-zero status."
+msgstr ""
+
+#: builtins.c:766
+msgid "    -f  Disable file name generation (globbing)."
+msgstr ""
+
+#: builtins.c:767
+msgid "    -h  Remember the location of commands as they are looked up."
+msgstr ""
+
+#: builtins.c:768
+msgid "    -k  All assignment arguments are placed in the environment for a"
+msgstr ""
+
+#: builtins.c:769
+msgid "        command, not just those that precede the command name."
+msgstr ""
+
+#: builtins.c:770
+msgid "    -m  Job control is enabled."
+msgstr ""
+
+#: builtins.c:771
+msgid "    -n  Read commands but do not execute them."
+msgstr ""
+
+#: builtins.c:772
+msgid "    -o option-name"
+msgstr ""
+
+#: builtins.c:773
+msgid "        Set the variable corresponding to option-name:"
+msgstr ""
+
+#: builtins.c:774
+msgid "            allexport    same as -a"
+msgstr ""
+
+#: builtins.c:775
+msgid "            braceexpand  same as -B"
+msgstr ""
+
+#: builtins.c:777
+msgid "            emacs        use an emacs-style line editing interface"
+msgstr ""
+
+#: builtins.c:779
+msgid "            errexit      same as -e"
+msgstr ""
+
+#: builtins.c:780
+msgid "            errtrace     same as -E"
+msgstr ""
+
+#: builtins.c:781
+msgid "            functrace    same as -T"
+msgstr ""
+
+#: builtins.c:782
+msgid "            hashall      same as -h"
+msgstr ""
+
+#: builtins.c:784
+msgid "            histexpand   same as -H"
+msgstr ""
+
+#: builtins.c:787
+msgid "            history      enable command history"
+msgstr ""
+
+#: builtins.c:789
+msgid "            ignoreeof    the shell will not exit upon reading EOF"
+msgstr ""
+
+#: builtins.c:790
+msgid "            interactive-comments"
+msgstr ""
+
+#: builtins.c:791
+msgid ""
+"                         allow comments to appear in interactive commands"
+msgstr ""
+
+#: builtins.c:792
+msgid "            keyword      same as -k"
+msgstr ""
+
+#: builtins.c:793
+msgid "            monitor      same as -m"
+msgstr ""
+
+#: builtins.c:794
+msgid "            noclobber    same as -C"
+msgstr ""
+
+#: builtins.c:795
+msgid "            noexec       same as -n"
+msgstr ""
+
+#: builtins.c:796
+msgid "            noglob       same as -f"
+msgstr ""
+
+#: builtins.c:797
+msgid "            nolog        currently accepted but ignored"
+msgstr ""
+
+#: builtins.c:798
+msgid "            notify       same as -b"
+msgstr ""
+
+#: builtins.c:799
+msgid "            nounset      same as -u"
+msgstr ""
+
+#: builtins.c:800
+msgid "            onecmd       same as -t"
+msgstr ""
+
+#: builtins.c:801
+msgid "            physical     same as -P"
+msgstr ""
+
+#: builtins.c:802
+msgid ""
+"            pipefail     the return value of a pipeline is the status of"
+msgstr ""
+
+#: builtins.c:803
+msgid ""
+"                         the last command to exit with a non-zero status,"
+msgstr ""
+
+#: builtins.c:804
+msgid ""
+"                         or zero if no command exited with a non-zero status"
+msgstr ""
+
+#: builtins.c:805
+msgid "            posix        change the behavior of bash where the default"
+msgstr ""
+
+#: builtins.c:806
+msgid "                         operation differs from the 1003.2 standard to"
+msgstr ""
+
+#: builtins.c:807
+msgid "                         match the standard"
+msgstr ""
+
+#: builtins.c:808
+msgid "            privileged   same as -p"
+msgstr ""
+
+#: builtins.c:809
+msgid "            verbose      same as -v"
+msgstr ""
+
+#: builtins.c:811
+msgid "            vi           use a vi-style line editing interface"
+msgstr ""
+
+#: builtins.c:813
+msgid "            xtrace       same as -x"
+msgstr ""
+
+#: builtins.c:814
+msgid ""
+"    -p  Turned on whenever the real and effective user ids do not match."
+msgstr ""
+
+#: builtins.c:815
+msgid "        Disables processing of the $ENV file and importing of shell"
+msgstr ""
+
+#: builtins.c:816
+msgid ""
+"        functions.  Turning this option off causes the effective uid and"
+msgstr ""
+
+#: builtins.c:817
+msgid "        gid to be set to the real uid and gid."
+msgstr ""
+
+#: builtins.c:818
+msgid "    -t  Exit after reading and executing one command."
+msgstr ""
+
+#: builtins.c:819
+msgid "    -u  Treat unset variables as an error when substituting."
+msgstr ""
+
+#: builtins.c:820
+msgid "    -v  Print shell input lines as they are read."
+msgstr ""
+
+#: builtins.c:821
+msgid "    -x  Print commands and their arguments as they are executed."
+msgstr ""
+
+#: builtins.c:823
+msgid "    -B  the shell will perform brace expansion"
+msgstr ""
+
+#: builtins.c:825
+msgid "    -C  If set, disallow existing regular files to be overwritten"
+msgstr ""
+
+#: builtins.c:826
+msgid "        by redirection of output."
+msgstr ""
+
+#: builtins.c:827
+msgid "    -E  If set, the ERR trap is inherited by shell functions."
+msgstr ""
+
+#: builtins.c:829
+msgid "    -H  Enable ! style history substitution.  This flag is on"
+msgstr ""
+
+#: builtins.c:830
+msgid "        by default."
+msgstr ""
+
+#: builtins.c:832
+msgid "    -P  If set, do not follow symbolic links when executing commands"
+msgstr ""
+
+#: builtins.c:833
+msgid "        such as cd which change the current directory."
+msgstr ""
+
+#: builtins.c:834
+msgid "    -T  If set, the DEBUG trap is inherited by shell functions."
+msgstr ""
+
+#: builtins.c:836
+msgid "Using + rather than - causes these flags to be turned off.  The"
+msgstr ""
+
+#: builtins.c:837
+msgid "flags can also be used upon invocation of the shell.  The current"
+msgstr ""
+
+#: builtins.c:838
+msgid "set of flags may be found in $-.  The remaining n ARGs are positional"
+msgstr ""
+
+#: builtins.c:839
+msgid "parameters and are assigned, in order, to $1, $2, .. $n.  If no"
+msgstr ""
+
+#: builtins.c:840
+msgid "ARGs are given, all shell variables are printed."
+msgstr ""
+
+#: builtins.c:846
+msgid "For each NAME, remove the corresponding variable or function.  Given"
+msgstr ""
+
+#: builtins.c:847
+msgid "the `-v', unset will only act on variables.  Given the `-f' flag,"
+msgstr ""
+
+#: builtins.c:848
+msgid "unset will only act on functions.  With neither flag, unset first"
+msgstr ""
+
+#: builtins.c:849
+msgid "tries to unset a variable, and if that fails, then tries to unset a"
+msgstr ""
+
+#: builtins.c:850
+msgid "function.  Some variables cannot be unset; also see readonly."
+msgstr ""
+
+#: builtins.c:856
+msgid "NAMEs are marked for automatic export to the environment of"
+msgstr ""
+
+#: builtins.c:857
+msgid "subsequently executed commands.  If the -f option is given,"
+msgstr ""
+
+#: builtins.c:858
+msgid "the NAMEs refer to functions.  If no NAMEs are given, or if `-p'"
+msgstr ""
+
+#: builtins.c:859
+msgid "is given, a list of all names that are exported in this shell is"
+msgstr ""
+
+#: builtins.c:860
+msgid "printed.  An argument of `-n' says to remove the export property"
+msgstr ""
+
+#: builtins.c:861
+msgid "from subsequent NAMEs.  An argument of `--' disables further option"
+msgstr ""
+
+#: builtins.c:862 builtins.c:874
+msgid "processing."
+msgstr ""
+
+#: builtins.c:868
+msgid "The given NAMEs are marked readonly and the values of these NAMEs may"
+msgstr ""
+
+#: builtins.c:869
+msgid "not be changed by subsequent assignment.  If the -f option is given,"
+msgstr ""
+
+#: builtins.c:870
+msgid "then functions corresponding to the NAMEs are so marked.  If no"
+msgstr ""
+
+#: builtins.c:871
+msgid "arguments are given, or if `-p' is given, a list of all readonly names"
+msgstr ""
+
+#: builtins.c:872
+msgid "is printed.  The `-a' option means to treat each NAME as"
+msgstr ""
+
+#: builtins.c:873
+msgid "an array variable.  An argument of `--' disables further option"
+msgstr ""
+
+#: builtins.c:880
+msgid "The positional parameters from $N+1 ... are renamed to $1 ...  If N is"
+msgstr ""
+
+#: builtins.c:881
+msgid "not given, it is assumed to be 1."
+msgstr ""
+
+#: builtins.c:887 builtins.c:896
+msgid "Read and execute commands from FILENAME and return.  The pathnames"
+msgstr ""
+
+#: builtins.c:888 builtins.c:897
+msgid "in $PATH are used to find the directory containing FILENAME.  If any"
+msgstr ""
+
+#: builtins.c:889 builtins.c:898
+msgid "ARGUMENTS are supplied, they become the positional parameters when"
+msgstr ""
+
+#: builtins.c:890 builtins.c:899
+msgid "FILENAME is executed."
+msgstr ""
+
+#: builtins.c:906
+msgid "Suspend the execution of this shell until it receives a SIGCONT"
+msgstr ""
+
+#: builtins.c:907
+msgid "signal.  The `-f' if specified says not to complain about this"
+msgstr ""
+
+#: builtins.c:908
+msgid "being a login shell if it is; just suspend anyway."
+msgstr ""
+
+#: builtins.c:915
+msgid "Exits with a status of 0 (true) or 1 (false) depending on"
+msgstr ""
+
+#: builtins.c:916
+msgid "the evaluation of EXPR.  Expressions may be unary or binary.  Unary"
+msgstr ""
+
+#: builtins.c:917
+msgid "expressions are often used to examine the status of a file.  There"
+msgstr ""
+
+#: builtins.c:918
+msgid "are string operators as well, and numeric comparison operators."
+msgstr ""
+
+#: builtins.c:920
+msgid "File operators:"
+msgstr ""
+
+#: builtins.c:922
+msgid "    -a FILE        True if file exists."
+msgstr ""
+
+#: builtins.c:923
+msgid "    -b FILE        True if file is block special."
+msgstr ""
+
+#: builtins.c:924
+msgid "    -c FILE        True if file is character special."
+msgstr ""
+
+#: builtins.c:925
+msgid "    -d FILE        True if file is a directory."
+msgstr ""
+
+#: builtins.c:926
+msgid "    -e FILE        True if file exists."
+msgstr ""
+
+#: builtins.c:927
+msgid "    -f FILE        True if file exists and is a regular file."
+msgstr ""
+
+#: builtins.c:928
+msgid "    -g FILE        True if file is set-group-id."
+msgstr ""
+
+#: builtins.c:929
+msgid "    -h FILE        True if file is a symbolic link."
+msgstr ""
+
+#: builtins.c:930
+msgid "    -L FILE        True if file is a symbolic link."
+msgstr ""
+
+#: builtins.c:931
+msgid "    -k FILE        True if file has its `sticky' bit set."
+msgstr ""
+
+#: builtins.c:932
+msgid "    -p FILE        True if file is a named pipe."
+msgstr ""
+
+#: builtins.c:933
+msgid "    -r FILE        True if file is readable by you."
+msgstr ""
+
+#: builtins.c:934
+msgid "    -s FILE        True if file exists and is not empty."
+msgstr ""
+
+#: builtins.c:935
+msgid "    -S FILE        True if file is a socket."
+msgstr ""
+
+#: builtins.c:936
+msgid "    -t FD          True if FD is opened on a terminal."
+msgstr ""
+
+#: builtins.c:937
+msgid "    -u FILE        True if the file is set-user-id."
+msgstr ""
+
+#: builtins.c:938
+msgid "    -w FILE        True if the file is writable by you."
+msgstr ""
+
+#: builtins.c:939
+msgid "    -x FILE        True if the file is executable by you."
+msgstr ""
+
+#: builtins.c:940
+msgid "    -O FILE        True if the file is effectively owned by you."
+msgstr ""
+
+#: builtins.c:941
+msgid "    -G FILE        True if the file is effectively owned by your group."
+msgstr ""
+
+#: builtins.c:942
+msgid ""
+"    -N FILE        True if the file has been modified since it was last read."
+msgstr ""
+
+#: builtins.c:944
+msgid "  FILE1 -nt FILE2  True if file1 is newer than file2 (according to"
+msgstr ""
+
+#: builtins.c:945
+msgid "                   modification date)."
+msgstr ""
+
+#: builtins.c:947
+msgid "  FILE1 -ot FILE2  True if file1 is older than file2."
+msgstr ""
+
+#: builtins.c:949
+msgid "  FILE1 -ef FILE2  True if file1 is a hard link to file2."
+msgstr ""
+
+#: builtins.c:951
+msgid "String operators:"
+msgstr ""
+
+#: builtins.c:953
+msgid "    -z STRING      True if string is empty."
+msgstr ""
+
+#: builtins.c:955
+msgid "    -n STRING"
+msgstr ""
+
+#: builtins.c:956
+msgid "    STRING         True if string is not empty."
+msgstr ""
+
+#: builtins.c:958
+msgid "    STRING1 = STRING2"
+msgstr ""
+
+#: builtins.c:959
+msgid "                   True if the strings are equal."
+msgstr ""
+
+#: builtins.c:960
+msgid "    STRING1 != STRING2"
+msgstr ""
+
+#: builtins.c:961
+msgid "                   True if the strings are not equal."
+msgstr ""
+
+#: builtins.c:962
+msgid "    STRING1 < STRING2"
+msgstr ""
+
+#: builtins.c:963
+msgid ""
+"                   True if STRING1 sorts before STRING2 lexicographically."
+msgstr ""
+
+#: builtins.c:964
+msgid "    STRING1 > STRING2"
+msgstr ""
+
+#: builtins.c:965
+msgid ""
+"                   True if STRING1 sorts after STRING2 lexicographically."
+msgstr ""
+
+#: builtins.c:967
+msgid "Other operators:"
+msgstr ""
+
+#: builtins.c:969
+msgid "    -o OPTION      True if the shell option OPTION is enabled."
+msgstr ""
+
+#: builtins.c:970
+msgid "    ! EXPR         True if expr is false."
+msgstr ""
+
+#: builtins.c:971
+msgid "    EXPR1 -a EXPR2 True if both expr1 AND expr2 are true."
+msgstr ""
+
+#: builtins.c:972
+msgid "    EXPR1 -o EXPR2 True if either expr1 OR expr2 is true."
+msgstr ""
+
+#: builtins.c:974
+msgid "    arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,"
+msgstr ""
+
+#: builtins.c:975
+msgid "                   -lt, -le, -gt, or -ge."
+msgstr ""
+
+#: builtins.c:977
+msgid "Arithmetic binary operators return true if ARG1 is equal, not-equal,"
+msgstr ""
+
+#: builtins.c:978
+msgid "less-than, less-than-or-equal, greater-than, or greater-than-or-equal"
+msgstr ""
+
+#: builtins.c:979
+msgid "than ARG2."
+msgstr ""
+
+#: builtins.c:985
+msgid "This is a synonym for the \"test\" builtin, but the last"
+msgstr ""
+
+#: builtins.c:986
+msgid "argument must be a literal `]', to match the opening `['."
+msgstr ""
+
+#: builtins.c:992
+msgid "Print the accumulated user and system times for processes run from"
+msgstr ""
+
+#: builtins.c:993
+msgid "the shell."
+msgstr ""
+
+#: builtins.c:999
+msgid "The command ARG is to be read and executed when the shell receives"
+msgstr ""
+
+#: builtins.c:1000
+msgid "signal(s) SIGNAL_SPEC.  If ARG is absent all specified signals are"
+msgstr ""
+
+#: builtins.c:1001
+msgid "reset to their original values.  If ARG is the null string each"
+msgstr ""
+
+#: builtins.c:1002
+msgid "SIGNAL_SPEC is ignored by the shell and by the commands it invokes."
+msgstr ""
+
+#: builtins.c:1003
+msgid "If a SIGNAL_SPEC is EXIT (0) the command ARG is executed on exit from"
+msgstr ""
+
+#: builtins.c:1004
+msgid "the shell.  If a SIGNAL_SPEC is DEBUG, ARG is executed after every"
+msgstr ""
+
+#: builtins.c:1005
+msgid "command.  If ARG is `-p' then the trap commands associated with"
+msgstr ""
+
+#: builtins.c:1006
+msgid "each SIGNAL_SPEC are displayed.  If no arguments are supplied or if"
+msgstr ""
+
+#: builtins.c:1007
+msgid "only `-p' is given, trap prints the list of commands associated with"
+msgstr ""
+
+#: builtins.c:1008
+msgid ""
+"each signal number.  Each SIGNAL_SPEC is either a signal name in <signal.h>"
+msgstr ""
+
+#: builtins.c:1009
+msgid "or a signal number.  `trap -l' prints a list of signal names and their"
+msgstr ""
+
+#: builtins.c:1010
+msgid "corresponding numbers.  Note that a signal can be sent to the shell"
+msgstr ""
+
+#: builtins.c:1011
+msgid "with \"kill -signal $$\"."
+msgstr ""
+
+#: builtins.c:1017
+msgid "For each NAME, indicate how it would be interpreted if used as a"
+msgstr ""
+
+#: builtins.c:1018
+msgid "command name."
+msgstr ""
+
+#: builtins.c:1020
+msgid "If the -t option is used, `type' outputs a single word which is one of"
+msgstr ""
+
+#: builtins.c:1021
+msgid "`alias', `keyword', `function', `builtin', `file' or `', if NAME is an"
+msgstr ""
+
+#: builtins.c:1022
+msgid "alias, shell reserved word, shell function, shell builtin, disk file,"
+msgstr ""
+
+#: builtins.c:1023
+msgid "or unfound, respectively."
+msgstr ""
+
+#: builtins.c:1025
+msgid "If the -p flag is used, `type' either returns the name of the disk"
+msgstr ""
+
+#: builtins.c:1026
+msgid "file that would be executed, or nothing if `type -t NAME' would not"
+msgstr ""
+
+#: builtins.c:1027
+msgid "return `file'."
+msgstr ""
+
+#: builtins.c:1029
+msgid "If the -a flag is used, `type' displays all of the places that contain"
+msgstr ""
+
+#: builtins.c:1030
+msgid "an executable named `file'.  This includes aliases, builtins, and"
+msgstr ""
+
+#: builtins.c:1031
+msgid "functions, if and only if the -p flag is not also used."
+msgstr ""
+
+#: builtins.c:1033
+msgid "The -f flag suppresses shell function lookup."
+msgstr ""
+
+#: builtins.c:1035
+msgid "The -P flag forces a PATH search for each NAME, even if it is an alias,"
+msgstr ""
+
+#: builtins.c:1036
+msgid "builtin, or function, and returns the name of the disk file that would"
+msgstr ""
+
+#: builtins.c:1037
+msgid "be executed."
+msgstr ""
+
+#: builtins.c:1044
+msgid "Ulimit provides control over the resources available to processes"
+msgstr ""
+
+#: builtins.c:1045
+msgid "started by the shell, on systems that allow such control.  If an"
+msgstr ""
+
+#: builtins.c:1046
+msgid "option is given, it is interpreted as follows:"
+msgstr ""
+
+#: builtins.c:1048
+msgid "    -S\tuse the `soft' resource limit"
+msgstr ""
+
+#: builtins.c:1049
+msgid "    -H\tuse the `hard' resource limit"
+msgstr ""
+
+#: builtins.c:1050
+msgid "    -a\tall current limits are reported"
+msgstr ""
+
+#: builtins.c:1051
+msgid "    -c\tthe maximum size of core files created"
+msgstr ""
+
+#: builtins.c:1052
+msgid "    -d\tthe maximum size of a process's data segment"
+msgstr ""
+
+#: builtins.c:1053
+msgid "    -f\tthe maximum size of files created by the shell"
+msgstr ""
+
+#: builtins.c:1054
+msgid "    -l\tthe maximum size a process may lock into memory"
+msgstr ""
+
+#: builtins.c:1055
+msgid "    -m\tthe maximum resident set size"
+msgstr ""
+
+#: builtins.c:1056
+msgid "    -n\tthe maximum number of open file descriptors"
+msgstr ""
+
+#: builtins.c:1057
+msgid "    -p\tthe pipe buffer size"
+msgstr ""
+
+#: builtins.c:1058
+msgid "    -s\tthe maximum stack size"
+msgstr ""
+
+#: builtins.c:1059
+msgid "    -t\tthe maximum amount of cpu time in seconds"
+msgstr ""
+
+#: builtins.c:1060
+msgid "    -u\tthe maximum number of user processes"
+msgstr ""
+
+#: builtins.c:1061
+msgid "    -v\tthe size of virtual memory"
+msgstr ""
+
+#: builtins.c:1063
+msgid "If LIMIT is given, it is the new value of the specified resource;"
+msgstr ""
+
+#: builtins.c:1064
+msgid "the special LIMIT values `soft', `hard', and `unlimited' stand for"
+msgstr ""
+
+#: builtins.c:1065
+msgid ""
+"the current soft limit, the current hard limit, and no limit, respectively."
+msgstr ""
+
+#: builtins.c:1066
+msgid "Otherwise, the current value of the specified resource is printed."
+msgstr ""
+
+#: builtins.c:1067
+msgid "If no option is given, then -f is assumed.  Values are in 1024-byte"
+msgstr ""
+
+#: builtins.c:1068
+msgid "increments, except for -t, which is in seconds, -p, which is in"
+msgstr ""
+
+#: builtins.c:1069
+msgid "increments of 512 bytes, and -u, which is an unscaled number of"
+msgstr ""
+
+#: builtins.c:1070
+msgid "processes."
+msgstr ""
+
+#: builtins.c:1077
+msgid "The user file-creation mask is set to MODE.  If MODE is omitted, or if"
+msgstr ""
+
+#: builtins.c:1078
+msgid "`-S' is supplied, the current value of the mask is printed.  The `-S'"
+msgstr ""
+
+#: builtins.c:1079
+msgid "option makes the output symbolic; otherwise an octal number is output."
+msgstr ""
+
+#: builtins.c:1080
+msgid "If `-p' is supplied, and MODE is omitted, the output is in a form"
+msgstr ""
+
+#: builtins.c:1081
+msgid "that may be used as input.  If MODE begins with a digit, it is"
+msgstr ""
+
+#: builtins.c:1082
+msgid "interpreted as an octal number, otherwise it is a symbolic mode string"
+msgstr ""
+
+#: builtins.c:1083
+msgid "like that accepted by chmod(1)."
+msgstr ""
+
+#: builtins.c:1090 builtins.c:1102
+msgid "Wait for the specified process and report its termination status.  If"
+msgstr ""
+
+#: builtins.c:1091 builtins.c:1103
+msgid "N is not given, all currently active child processes are waited for,"
+msgstr ""
+
+#: builtins.c:1092
+msgid "and the return code is zero.  N may be a process ID or a job"
+msgstr ""
+
+#: builtins.c:1093
+msgid "specification; if a job spec is given, all processes in the job's"
+msgstr ""
+
+#: builtins.c:1094
+msgid "pipeline are waited for."
+msgstr ""
+
+#: builtins.c:1104
+msgid "and the return code is zero.  N is a process ID; if it is not given,"
+msgstr ""
+
+#: builtins.c:1105
+msgid "all child processes of the shell are waited for."
+msgstr ""
+
+#: builtins.c:1112
+msgid "The `for' loop executes a sequence of commands for each member in a"
+msgstr ""
+
+#: builtins.c:1113
+msgid "list of items.  If `in WORDS ...;' is not present, then `in \"$@\"' is"
+msgstr ""
+
+#: builtins.c:1114
+msgid "assumed.  For each element in WORDS, NAME is set to that element, and"
+msgstr ""
+
+#: builtins.c:1115
+msgid "the COMMANDS are executed."
+msgstr ""
+
+#: builtins.c:1121
+msgid "Equivalent to"
+msgstr ""
+
+#: builtins.c:1122
+msgid "\t(( EXP1 ))"
+msgstr ""
+
+#: builtins.c:1123
+msgid "\twhile (( EXP2 )); do"
+msgstr ""
+
+#: builtins.c:1124
+msgid "\t\tCOMMANDS"
+msgstr ""
+
+#: builtins.c:1125
+msgid "\t\t(( EXP3 ))"
+msgstr ""
+
+#: builtins.c:1126
+msgid "\tdone"
+msgstr ""
+
+#: builtins.c:1127
+msgid "EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is"
+msgstr ""
+
+#: builtins.c:1128
+msgid "omitted, it behaves as if it evaluates to 1."
+msgstr ""
+
+#: builtins.c:1134
+msgid "The WORDS are expanded, generating a list of words.  The"
+msgstr ""
+
+#: builtins.c:1135
+msgid "set of expanded words is printed on the standard error, each"
+msgstr ""
+
+#: builtins.c:1136
+msgid "preceded by a number.  If `in WORDS' is not present, `in \"$@\"'"
+msgstr ""
+
+#: builtins.c:1137
+msgid "is assumed.  The PS3 prompt is then displayed and a line read"
+msgstr ""
+
+#: builtins.c:1138
+msgid "from the standard input.  If the line consists of the number"
+msgstr ""
+
+#: builtins.c:1139
+msgid "corresponding to one of the displayed words, then NAME is set"
+msgstr ""
+
+#: builtins.c:1140
+msgid "to that word.  If the line is empty, WORDS and the prompt are"
+msgstr ""
+
+#: builtins.c:1141
+msgid "redisplayed.  If EOF is read, the command completes.  Any other"
+msgstr ""
+
+#: builtins.c:1142
+msgid "value read causes NAME to be set to null.  The line read is saved"
+msgstr ""
+
+#: builtins.c:1143
+msgid "in the variable REPLY.  COMMANDS are executed after each selection"
+msgstr ""
+
+#: builtins.c:1144
+msgid "until a break command is executed."
+msgstr ""
+
+#: builtins.c:1150
+msgid "Execute PIPELINE and print a summary of the real time, user CPU time,"
+msgstr ""
+
+#: builtins.c:1151
+msgid "and system CPU time spent executing PIPELINE when it terminates."
+msgstr ""
+
+#: builtins.c:1152
+msgid "The return status is the return status of PIPELINE.  The `-p' option"
+msgstr ""
+
+#: builtins.c:1153
+msgid "prints the timing summary in a slightly different format.  This uses"
+msgstr ""
+
+#: builtins.c:1154
+msgid "the value of the TIMEFORMAT variable as the output format."
+msgstr ""
+
+#: builtins.c:1160
+msgid "Selectively execute COMMANDS based upon WORD matching PATTERN.  The"
+msgstr ""
+
+#: builtins.c:1161
+msgid "`|' is used to separate multiple patterns."
+msgstr ""
+
+#: builtins.c:1167
+msgid ""
+"The if COMMANDS are executed.  If the exit status is zero, then the then"
+msgstr ""
+
+#: builtins.c:1168
+msgid ""
+"COMMANDS are executed.  Otherwise, each of the elif COMMANDS are executed"
+msgstr ""
+
+#: builtins.c:1169
+msgid ""
+"in turn, and if the exit status is zero, the corresponding then COMMANDS"
+msgstr ""
+
+#: builtins.c:1170
+msgid ""
+"are executed and the if command completes.  Otherwise, the else COMMANDS"
+msgstr ""
+
+#: builtins.c:1171
+msgid ""
+"are executed, if present.  The exit status is the exit status of the last"
+msgstr ""
+
+#: builtins.c:1172
+msgid "command executed, or zero if no condition tested true."
+msgstr ""
+
+#: builtins.c:1178 builtins.c:1185
+msgid "Expand and execute COMMANDS as long as the final command in the"
+msgstr ""
+
+#: builtins.c:1179
+msgid "`while' COMMANDS has an exit status of zero."
+msgstr ""
+
+#: builtins.c:1186
+msgid "`until' COMMANDS has an exit status which is not zero."
+msgstr ""
+
+#: builtins.c:1192
+msgid "Create a simple command invoked by NAME which runs COMMANDS."
+msgstr ""
+
+#: builtins.c:1193
+msgid "Arguments on the command line along with NAME are passed to the"
+msgstr ""
+
+#: builtins.c:1194
+msgid "function as $0 .. $n."
+msgstr ""
+
+#: builtins.c:1200
+msgid "Run a set of commands in a group.  This is one way to redirect an"
+msgstr ""
+
+#: builtins.c:1201
+msgid "entire set of commands."
+msgstr ""
+
+#: builtins.c:1207
+msgid "This is similar to the `fg' command.  Resume a stopped or background"
+msgstr ""
+
+#: builtins.c:1208
+msgid "job.  If you specifiy DIGITS, then that job is used.  If you specify"
+msgstr ""
+
+#: builtins.c:1209
+msgid "WORD, then the job whose name begins with WORD is used.  Following the"
+msgstr ""
+
+#: builtins.c:1210
+msgid "job specification with a `&' places the job in the background."
+msgstr ""
+
+#: builtins.c:1216
+msgid "The EXPRESSION is evaluated according to the rules for arithmetic"
+msgstr ""
+
+#: builtins.c:1217
+msgid "evaluation.  Equivalent to \"let EXPRESSION\"."
+msgstr ""
+
+#: builtins.c:1223
+msgid ""
+"Returns a status of 0 or 1 depending on the evaluation of the conditional"
+msgstr ""
+
+#: builtins.c:1224
+msgid ""
+"expression EXPRESSION.  Expressions are composed of the same primaries used"
+msgstr ""
+
+#: builtins.c:1225
+msgid ""
+"by the `test' builtin, and may be combined using the following operators"
+msgstr ""
+
+#: builtins.c:1227
+msgid "\t( EXPRESSION )\tReturns the value of EXPRESSION"
+msgstr ""
+
+#: builtins.c:1228
+msgid "\t! EXPRESSION\tTrue if EXPRESSION is false; else false"
+msgstr ""
+
+#: builtins.c:1229
+msgid "\tEXPR1 && EXPR2\tTrue if both EXPR1 and EXPR2 are true; else false"
+msgstr ""
+
+#: builtins.c:1230
+msgid "\tEXPR1 || EXPR2\tTrue if either EXPR1 or EXPR2 is true; else false"
+msgstr ""
+
+#: builtins.c:1232
+msgid ""
+"When the `==' and `!=' operators are used, the string to the right of the"
+msgstr ""
+
+#: builtins.c:1233
+msgid "operator is used as a pattern and pattern matching is performed.  The"
+msgstr ""
+
+#: builtins.c:1234
+msgid "&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to"
+msgstr ""
+
+#: builtins.c:1235
+msgid "determine the expression's value."
+msgstr ""
+
+#: builtins.c:1241
+msgid "BASH_VERSION    Version information for this Bash."
+msgstr ""
+
+#: builtins.c:1242
+msgid "CDPATH          A colon separated list of directories to search"
+msgstr ""
+
+#: builtins.c:1243
+msgid "\t\twhen the argument to `cd' is not found in the current"
+msgstr ""
+
+#: builtins.c:1244
+msgid "\t\tdirectory."
+msgstr ""
+
+#: builtins.c:1245
+msgid "GLOBIGNORE\tA colon-separated list of patterns describing filenames to"
+msgstr ""
+
+#: builtins.c:1246
+msgid "\t\tbe ignored by pathname expansion."
+msgstr ""
+
+#: builtins.c:1248
+msgid ""
+"HISTFILE        The name of the file where your command history is stored."
+msgstr ""
+
+#: builtins.c:1249
+msgid "HISTFILESIZE    The maximum number of lines this file can contain."
+msgstr ""
+
+#: builtins.c:1250
+msgid "HISTSIZE        The maximum number of history lines that a running"
+msgstr ""
+
+#: builtins.c:1251
+msgid "\t\tshell can access."
+msgstr ""
+
+#: builtins.c:1253
+msgid "HOME            The complete pathname to your login directory."
+msgstr ""
+
+#: builtins.c:1254
+msgid "HOSTNAME\tThe name of the current host."
+msgstr ""
+
+#: builtins.c:1255
+msgid "HOSTTYPE        The type of CPU this version of Bash is running under."
+msgstr ""
+
+#: builtins.c:1256
+msgid "IGNOREEOF       Controls the action of the shell on receipt of an EOF"
+msgstr ""
+
+#: builtins.c:1257
+msgid "\t\tcharacter as the sole input.  If set, then the value"
+msgstr ""
+
+#: builtins.c:1258
+msgid "\t\tof it is the number of EOF characters that can be seen"
+msgstr ""
+
+#: builtins.c:1259
+msgid "\t\tin a row on an empty line before the shell will exit"
+msgstr ""
+
+#: builtins.c:1260
+msgid "\t\t(default 10).  When unset, EOF signifies the end of input."
+msgstr ""
+
+#: builtins.c:1261
+msgid "MACHTYPE\tA string describing the current system Bash is running on."
+msgstr ""
+
+#: builtins.c:1262
+msgid "MAILCHECK\tHow often, in seconds, Bash checks for new mail."
+msgstr ""
+
+#: builtins.c:1263
+msgid "MAILPATH\tA colon-separated list of filenames which Bash checks"
+msgstr ""
+
+#: builtins.c:1264
+msgid "\t\tfor new mail."
+msgstr ""
+
+#: builtins.c:1265
+msgid "OSTYPE\t\tThe version of Unix this version of Bash is running on."
+msgstr ""
+
+#: builtins.c:1266
+msgid "PATH            A colon-separated list of directories to search when"
+msgstr ""
+
+#: builtins.c:1267
+msgid "\t\tlooking for commands."
+msgstr ""
+
+#: builtins.c:1268
+msgid "PROMPT_COMMAND  A command to be executed before the printing of each"
+msgstr ""
+
+#: builtins.c:1269
+msgid "\t\tprimary prompt."
+msgstr ""
+
+#: builtins.c:1270
+msgid "PS1             The primary prompt string."
+msgstr ""
+
+#: builtins.c:1271
+msgid "PS2             The secondary prompt string."
+msgstr ""
+
+#: builtins.c:1272
+msgid "PWD\t\tThe full pathname of the current directory."
+msgstr ""
+
+#: builtins.c:1273
+msgid "SHELLOPTS\tA colon-separated list of enabled shell options."
+msgstr ""
+
+#: builtins.c:1274
+msgid "TERM            The name of the current terminal type."
+msgstr ""
+
+#: builtins.c:1275
+msgid "TIMEFORMAT\tThe output format for timing statistics displayed by the"
+msgstr ""
+
+#: builtins.c:1276
+msgid "\t\t`time' reserved word."
+msgstr ""
+
+#: builtins.c:1277
+msgid "auto_resume     Non-null means a command word appearing on a line by"
+msgstr ""
+
+#: builtins.c:1278
+msgid "\t\titself is first looked for in the list of currently"
+msgstr ""
+
+#: builtins.c:1279
+msgid "\t\tstopped jobs.  If found there, that job is foregrounded."
+msgstr ""
+
+#: builtins.c:1280
+msgid "\t\tA value of `exact' means that the command word must"
+msgstr ""
+
+#: builtins.c:1281
+msgid "\t\texactly match a command in the list of stopped jobs.  A"
+msgstr ""
+
+#: builtins.c:1282
+msgid "\t\tvalue of `substring' means that the command word must"
+msgstr ""
+
+#: builtins.c:1283
+msgid "\t\tmatch a substring of the job.  Any other value means that"
+msgstr ""
+
+#: builtins.c:1284
+msgid "\t\tthe command must be a prefix of a stopped job."
+msgstr ""
+
+#: builtins.c:1287
+msgid "histchars       Characters controlling history expansion and quick"
+msgstr ""
+
+#: builtins.c:1288
+msgid "\t\tsubstitution.  The first character is the history"
+msgstr ""
+
+#: builtins.c:1289
+msgid "\t\tsubstitution character, usually `!'.  The second is"
+msgstr ""
+
+#: builtins.c:1290
+msgid "\t\tthe `quick substitution' character, usually `^'.  The"
+msgstr ""
+
+#: builtins.c:1291
+msgid "\t\tthird is the `history comment' character, usually `#'."
+msgstr ""
+
+#: builtins.c:1293
+msgid "HISTIGNORE\tA colon-separated list of patterns used to decide which"
+msgstr ""
+
+#: builtins.c:1294
+msgid "\t\tcommands should be saved on the history list."
+msgstr ""
+
+#: builtins.c:1306
+msgid "+N\tRotates the stack so that the Nth directory (counting"
+msgstr ""
+
+#: builtins.c:1307
+msgid "\tfrom the left of the list shown by `dirs', starting with"
+msgstr ""
+
+#: builtins.c:1308 builtins.c:1312
+msgid "\tzero) is at the top."
+msgstr ""
+
+#: builtins.c:1310
+msgid "-N\tRotates the stack so that the Nth directory (counting"
+msgstr ""
+
+#: builtins.c:1311
+msgid "\tfrom the right of the list shown by `dirs', starting with"
+msgstr ""
+
+#: builtins.c:1314
+msgid "-n\tsuppress the normal change of directory when adding directories"
+msgstr ""
+
+#: builtins.c:1315
+msgid "\tto the stack, so only the stack is manipulated."
+msgstr ""
+
+#: builtins.c:1317
+msgid "dir\tadds DIR to the directory stack at the top, making it the"
+msgstr ""
+
+#: builtins.c:1318
+msgid "\tnew current working directory."
+msgstr ""
+
+#: builtins.c:1332
+msgid "+N\tremoves the Nth entry counting from the left of the list"
+msgstr ""
+
+#: builtins.c:1333
+msgid "\tshown by `dirs', starting with zero.  For example: `popd +0'"
+msgstr ""
+
+#: builtins.c:1334
+msgid "\tremoves the first directory, `popd +1' the second."
+msgstr ""
+
+#: builtins.c:1336
+msgid "-N\tremoves the Nth entry counting from the right of the list"
+msgstr ""
+
+#: builtins.c:1337
+msgid "\tshown by `dirs', starting with zero.  For example: `popd -0'"
+msgstr ""
+
+#: builtins.c:1338
+msgid "\tremoves the last directory, `popd -1' the next to last."
+msgstr ""
+
+#: builtins.c:1340
+msgid "-n\tsuppress the normal change of directory when removing directories"
+msgstr ""
+
+#: builtins.c:1341
+msgid "\tfrom the stack, so only the stack is manipulated."
+msgstr ""
+
+#: builtins.c:1363
+msgid "+N\tdisplays the Nth entry counting from the left of the list shown by"
+msgstr ""
+
+#: builtins.c:1364 builtins.c:1367
+msgid "\tdirs when invoked without options, starting with zero."
+msgstr ""
+
+#: builtins.c:1366
+msgid "-N\tdisplays the Nth entry counting from the right of the list shown by"
+msgstr ""
+
+#: builtins.c:1374
+msgid "Toggle the values of variables controlling optional behavior."
+msgstr ""
+
+#: builtins.c:1375
+msgid "The -s flag means to enable (set) each OPTNAME; the -u flag"
+msgstr ""
+
+#: builtins.c:1376
+msgid "unsets each OPTNAME.  The -q flag suppresses output; the exit"
+msgstr ""
+
+#: builtins.c:1377
+msgid "status indicates whether each OPTNAME is set or unset.  The -o"
+msgstr ""
+
+#: builtins.c:1378
+msgid "option restricts the OPTNAMEs to those defined for use with"
+msgstr ""
+
+#: builtins.c:1379
+msgid "`set -o'.  With no options, or with the -p option, a list of all"
+msgstr ""
+
+#: builtins.c:1380
+msgid "settable options is displayed, with an indication of whether or"
+msgstr ""
+
+#: builtins.c:1381
+msgid "not each is set."
+msgstr ""
+
+#: builtins.c:1387
+msgid "printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT"
+msgstr ""
+
+#: builtins.c:1388
+msgid "is a character string which contains three types of objects: plain"
+msgstr ""
+
+#: builtins.c:1389
+msgid ""
+"characters, which are simply copied to standard output, character escape"
+msgstr ""
+
+#: builtins.c:1390
+msgid "sequences which are converted and copied to the standard output, and"
+msgstr ""
+
+#: builtins.c:1391
+msgid ""
+"format specifications, each of which causes printing of the next successive"
+msgstr ""
+
+#: builtins.c:1392
+msgid "argument.  In addition to the standard printf(1) formats, %b means to"
+msgstr ""
+
+#: builtins.c:1393
+msgid "expand backslash escape sequences in the corresponding argument, and %q"
+msgstr ""
+
+#: builtins.c:1394
+msgid "means to quote the argument in a way that can be reused as shell input."
+msgstr ""
+
+#: builtins.c:1401
+msgid "For each NAME, specify how arguments are to be completed."
+msgstr ""
+
+#: builtins.c:1402
+msgid "If the -p option is supplied, or if no options are supplied, existing"
+msgstr ""
+
+#: builtins.c:1403
+msgid "completion specifications are printed in a way that allows them to be"
+msgstr ""
+
+#: builtins.c:1404
+msgid "reused as input.  The -r option removes a completion specification for"
+msgstr ""
+
+#: builtins.c:1405
+msgid "each NAME, or, if no NAMEs are supplied, all completion specifications."
+msgstr ""
+
+#: builtins.c:1413
+msgid "Display the possible completions depending on the options.  Intended"
+msgstr ""
+
+#: builtins.c:1414
+msgid ""
+"to be used from within a shell function generating possible completions."
+msgstr ""
+
+#: builtins.c:1415
+msgid "If the optional WORD argument is supplied, matches against WORD are"
+msgstr ""
+
+#: builtins.c:1416
+msgid "generated."
+msgstr ""
diff --git a/po/boldquot.sed b/po/boldquot.sed
new file mode 100644 (file)
index 0000000..4b937aa
--- /dev/null
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
+s/“/“\e[1m/g
+s/”/\e[0m”/g
+s/‘/‘\e[1m/g
+s/’/\e[0m’/g
diff --git a/po/builtins.pot b/po/builtins.pot
new file mode 100644 (file)
index 0000000..e30179c
--- /dev/null
@@ -0,0 +1,2845 @@
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:244
+msgid "`alias' with no arguments or with the -p option prints the list"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:245
+msgid "of aliases in the form alias NAME=VALUE on standard output."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:246
+msgid "Otherwise, an alias is defined for each NAME whose VALUE is given."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:247
+msgid "A trailing space in VALUE causes the next word to be checked for"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:248
+msgid "alias substitution when the alias is expanded.  Alias returns"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:249
+msgid "true unless a NAME is given for which no alias has been defined."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:257
+msgid ""
+"Remove NAMEs from the list of defined aliases.  If the -a option is given,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:258
+msgid "then remove all alias definitions."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:266
+msgid "Bind a key sequence to a Readline function or a macro, or set"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:267
+msgid "a Readline variable.  The non-option argument syntax is equivalent"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:268
+msgid "to that found in ~/.inputrc, but must be passed as a single argument:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:269
+msgid "bind '\"\\C-x\\C-r\": re-read-init-file'."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:270
+msgid "bind accepts the following options:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:271
+msgid ""
+"  -m  keymap         Use `keymap' as the keymap for the duration of this"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:272
+msgid "                     command.  Acceptable keymap names are emacs,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:273
+msgid ""
+"                     emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:274
+msgid "                     vi-command, and vi-insert."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:275
+msgid "  -l                 List names of functions."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:276
+msgid "  -P                 List function names and bindings."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:277
+msgid "  -p                 List functions and bindings in a form that can be"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:278
+msgid "                     reused as input."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:279
+msgid "  -r  keyseq         Remove the binding for KEYSEQ."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:280
+msgid "  -x  keyseq:shell-command\tCause SHELL-COMMAND to be executed when"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:281
+msgid "\t\t\t\tKEYSEQ is entered."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:282
+msgid "  -f  filename       Read key bindings from FILENAME."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:283
+msgid "  -q  function-name  Query about which keys invoke the named function."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:284
+msgid ""
+"  -u  function-name  Unbind all keys which are bound to the named function."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:285
+msgid "  -V                 List variable names and values"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:286
+msgid "  -v                 List variable names and values in a form that can"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:287
+msgid "                     be reused as input."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:288
+msgid ""
+"  -S                 List key sequences that invoke macros and their values"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:289
+msgid ""
+"  -s                 List key sequences that invoke macros and their values"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:290
+msgid "                     in a form that can be reused as input."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:297
+msgid "Exit from within a FOR, WHILE or UNTIL loop.  If N is specified,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:298
+msgid "break N levels."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:304
+msgid "Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:305
+msgid "If N is specified, resume at the N-th enclosing loop."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:311
+msgid "Run a shell builtin.  This is useful when you wish to rename a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:312
+msgid "shell builtin to be a function, but need the functionality of the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:313
+msgid "builtin within the function itself."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:320
+msgid "Returns the context of the current subroutine call."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:321
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:325
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:390
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:392
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:401
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:404
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:408
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:445
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:487
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:491
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:498
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:509
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:513
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:552
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:555
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:559
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:562
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:630
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:637
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:692
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:713
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:718
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:722
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:745
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:835
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:919
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:921
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:943
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:946
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:948
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:950
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:952
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:954
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:957
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:966
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:968
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:973
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:976
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1019
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1024
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1028
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1032
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1034
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1047
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1062
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1226
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1231
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1305
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1309
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1313
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1316
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1319
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1331
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1335
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1339
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1342
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1354
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1362
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1365
+msgid ""
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:322
+msgid "Without EXPR, returns returns \"$line $filename\".  With EXPR,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:323
+msgid "returns \"$line $subroutine $filename\"; this extra information"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:324
+msgid "can be used used to provide a stack trace."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:326
+msgid "The value of EXPR indicates how many call frames to go back before the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:327
+msgid "current one; the top frame is frame 0."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:334
+msgid "Change the current directory to DIR.  The variable $HOME is the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:335
+msgid "default DIR.  The variable CDPATH defines the search path for"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:336
+msgid "the directory containing DIR.  Alternative directory names in CDPATH"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:337
+msgid "are separated by a colon (:).  A null directory name is the same as"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:338
+msgid "the current directory, i.e. `.'.  If DIR begins with a slash (/),"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:339
+msgid "then CDPATH is not used.  If the directory is not found, and the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:340
+msgid "shell option `cdable_vars' is set, then try the word as a variable"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:341
+msgid "name.  If that variable has a value, then cd to the value of that"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:342
+msgid "variable.  The -P option says to use the physical directory structure"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:343
+msgid ""
+"instead of following symbolic links; the -L option forces symbolic links"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:344
+msgid "to be followed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:350
+msgid "Print the current working directory.  With the -P option, pwd prints"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:351
+msgid "the physical directory, without any symbolic links; the -L option"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:352
+msgid "makes pwd follow symbolic links."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:358
+msgid "No effect; the command does nothing.  A zero exit code is returned."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:364
+msgid "Return a successful result."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:370
+msgid "Return an unsuccessful result."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:376
+msgid "Runs COMMAND with ARGS ignoring shell functions.  If you have a shell"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:377
+msgid "function called `ls', and you wish to call the command `ls', you can"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:378
+msgid "say \"command ls\".  If the -p option is given, a default value is used"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:379
+msgid "for PATH that is guaranteed to find all of the standard utilities.  If"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:380
+msgid "the -V or -v option is given, a string is printed describing COMMAND."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:381
+msgid "The -V option produces a more verbose description."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:387
+msgid "Declare variables and/or give them attributes.  If no NAMEs are"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:388
+msgid "given, then display the values of variables instead.  The -p option"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:389
+msgid "will display the attributes and values of each NAME."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:391
+msgid "The flags are:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:393
+msgid "  -a\tto make NAMEs arrays (if supported)"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:394
+msgid "  -f\tto select from among function names only"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:395
+msgid ""
+"  -F\tto display function names (and line number and source file name if"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:396
+msgid "\tdebugging) without definitions"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:397
+msgid "  -i\tto make NAMEs have the `integer' attribute"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:398
+msgid "  -r\tto make NAMEs readonly"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:399
+msgid "  -t\tto make NAMEs have the `trace' attribute"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:400
+msgid "  -x\tto make NAMEs export"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:402
+msgid "Variables with the integer attribute have arithmetic evaluation (see"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:403
+msgid "`let') done when the variable is assigned to."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:405
+msgid "When displaying values of variables, -f displays a function's name"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:406
+msgid "and definition.  The -F option restricts the display to function"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:407
+msgid "name only."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:409
+msgid "Using `+' instead of `-' turns off the given attribute instead.  When"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:410
+msgid "used in a function, makes NAMEs local, as with the `local' command."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:416
+msgid "Obsolete.  See `declare'."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:422
+msgid "Create a local variable called NAME, and give it VALUE.  LOCAL"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:423
+msgid "can only be used within a function; it makes the variable NAME"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:424
+msgid "have a visible scope restricted to that function and its children."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:431
+msgid "Output the ARGs.  If -n is specified, the trailing newline is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:432
+msgid "suppressed.  If the -e option is given, interpretation of the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:433
+msgid "following backslash-escaped characters is turned on:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:434
+msgid "\t\\a\talert (bell)"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:435
+msgid "\t\\b\tbackspace"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:436
+msgid "\t\\c\tsuppress trailing newline"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:437
+msgid "\t\\E\tescape character"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:438
+msgid "\t\\f\tform feed"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:439
+msgid "\t\\n\tnew line"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:440
+msgid "\t\\r\tcarriage return"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:441
+msgid "\t\\t\thorizontal tab"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:442
+msgid "\t\\v\tvertical tab"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:443
+msgid "\t\\\\\tbackslash"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:444
+msgid "\t\\num\tthe character whose ASCII code is NUM (octal)."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:446
+msgid "You can explicitly turn off the interpretation of the above characters"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:447
+msgid "with the -E option."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:455
+msgid ""
+"Output the ARGs.  If -n is specified, the trailing newline is suppressed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:462
+msgid "Enable and disable builtin shell commands.  This allows"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:463
+msgid "you to use a disk command which has the same name as a shell"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:464
+msgid "builtin without specifying a full pathname.  If -n is used, the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:465
+msgid "NAMEs become disabled; otherwise NAMEs are enabled.  For example,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:466
+msgid "to use the `test' found in $PATH instead of the shell builtin"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:467
+msgid "version, type `enable -n test'.  On systems supporting dynamic"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:468
+msgid "loading, the -f option may be used to load new builtins from the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:469
+msgid "shared object FILENAME.  The -d option will delete a builtin"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:470
+msgid "previously loaded with -f.  If no non-option names are given, or"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:471
+msgid "the -p option is supplied, a list of builtins is printed.  The"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:472
+msgid "-a option means to print every builtin with an indication of whether"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:473
+msgid ""
+"or not it is enabled.  The -s option restricts the output to the POSIX.2"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:474
+msgid ""
+"`special' builtins.  The -n option displays a list of all disabled builtins."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:480
+msgid "Read ARGs as input to the shell and execute the resulting command(s)."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:486
+msgid "Getopts is used by shell procedures to parse positional parameters."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:488
+msgid "OPTSTRING contains the option letters to be recognized; if a letter"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:489
+msgid "is followed by a colon, the option is expected to have an argument,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:490
+msgid "which should be separated from it by white space."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:492
+msgid "Each time it is invoked, getopts will place the next option in the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:493
+msgid "shell variable $name, initializing name if it does not exist, and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:494
+msgid "the index of the next argument to be processed into the shell"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:495
+msgid "variable OPTIND.  OPTIND is initialized to 1 each time the shell or"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:496
+msgid "a shell script is invoked.  When an option requires an argument,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:497
+msgid "getopts places that argument into the shell variable OPTARG."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:499
+msgid "getopts reports errors in one of two ways.  If the first character"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:500
+msgid "of OPTSTRING is a colon, getopts uses silent error reporting.  In"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:501
+msgid "this mode, no error messages are printed.  If an invalid option is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:502
+msgid "seen, getopts places the option character found into OPTARG.  If a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:503
+msgid "required argument is not found, getopts places a ':' into NAME and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:504
+msgid "sets OPTARG to the option character found.  If getopts is not in"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:505
+msgid "silent mode, and an invalid option is seen, getopts places '?' into"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:506
+msgid "NAME and unsets OPTARG.  If a required argument is not found, a '?'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:507
+msgid "is placed in NAME, OPTARG is unset, and a diagnostic message is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:508
+msgid "printed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:510
+msgid "If the shell variable OPTERR has the value 0, getopts disables the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:511
+msgid "printing of error messages, even if the first character of"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:512
+msgid "OPTSTRING is not a colon.  OPTERR has the value 1 by default."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:514
+msgid "Getopts normally parses the positional parameters ($0 - $9), but if"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:515
+msgid "more arguments are given, they are parsed instead."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:521
+msgid "Exec FILE, replacing this shell with the specified program."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:522
+msgid "If FILE is not specified, the redirections take effect in this"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:523
+msgid "shell.  If the first argument is `-l', then place a dash in the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:524
+msgid "zeroth arg passed to FILE, as login does.  If the `-c' option"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:525
+msgid "is supplied, FILE is executed with a null environment.  The `-a'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:526
+msgid "option means to make set argv[0] of the executed process to NAME."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:527
+msgid "If the file cannot be executed and the shell is not interactive,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:528
+msgid "then the shell exits, unless the shell option `execfail' is set."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:534
+msgid "Exit the shell with a status of N.  If N is omitted, the exit status"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:535
+msgid "is that of the last command executed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:541
+msgid "Logout of a login shell."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:548
+msgid ""
+"fc is used to list or edit and re-execute commands from the history list."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:549
+msgid "FIRST and LAST can be numbers specifying the range, or FIRST can be a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:550
+msgid "string, which means the most recent command beginning with that"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:551
+msgid "string."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:553
+msgid ""
+"   -e ENAME selects which editor to use.  Default is FCEDIT, then EDITOR,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:554
+msgid "      then vi."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:556
+msgid "   -l means list lines instead of editing."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:557
+msgid "   -n means no line numbers listed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:558
+msgid ""
+"   -r means reverse the order of the lines (making it newest listed first)."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:560
+msgid "With the `fc -s [pat=rep ...] [command]' format, the command is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:561
+msgid "re-executed after the substitution OLD=NEW is performed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:563
+msgid "A useful alias to use with this is r='fc -s', so that typing `r cc'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:564
+msgid "runs the last command beginning with `cc' and typing `r' re-executes"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:565
+msgid "the last command."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:573
+msgid "Place JOB_SPEC in the foreground, and make it the current job.  If"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:574
+msgid "JOB_SPEC is not present, the shell's notion of the current job is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:575
+msgid "used."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:583
+msgid "Place JOB_SPEC in the background, as if it had been started with"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:584
+msgid "`&'.  If JOB_SPEC is not present, the shell's notion of the current"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:585
+msgid "job is used."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:592
+msgid "For each NAME, the full pathname of the command is determined and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:593
+msgid "remembered.  If the -p option is supplied, PATHNAME is used as the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:594
+msgid "full pathname of NAME, and no path search is performed.  The -r"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:595
+msgid "option causes the shell to forget all remembered locations.  The -d"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:596
+msgid "option causes the shell to forget the remembered location of each NAME."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:597
+msgid "If the -t option is supplied the full pathname to which each NAME"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:598
+msgid "corresponds is printed.  If multiple NAME arguments are supplied with"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:599
+msgid "-t, the NAME is printed before the hashed full pathname.  The -l option"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:600
+msgid "causes output to be displayed in a format that may be reused as input."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:601
+msgid ""
+"If no arguments are given, information about remembered commands is "
+"displayed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:608
+msgid "Display helpful information about builtin commands.  If PATTERN is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:609
+msgid "specified, gives detailed help on all commands matching PATTERN,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:610
+msgid "otherwise a list of the builtins is printed.  The -s option"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:611
+msgid "restricts the output for each builtin command matching PATTERN to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:612
+msgid "a short usage synopsis."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:620
+msgid "Display the history list with line numbers.  Lines listed with"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:621
+msgid "with a `*' have been modified.  Argument of N says to list only"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:622
+msgid "the last N lines.  The `-c' option causes the history list to be"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:623
+msgid "cleared by deleting all of the entries.  The `-d' option deletes"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:624
+msgid "the history entry at offset OFFSET.  The `-w' option writes out the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:625
+msgid "current history to the history file;  `-r' means to read the file and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:626
+msgid "append the contents to the history list instead.  `-a' means"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:627
+msgid "to append history lines from this session to the history file."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:628
+msgid "Argument `-n' means to read all history lines not already read"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:629
+msgid "from the history file and append them to the history list."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:631
+msgid "If FILENAME is given, then that is used as the history file else"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:632
+msgid "if $HISTFILE has a value, that is used, else ~/.bash_history."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:633
+msgid "If the -s option is supplied, the non-option ARGs are appended to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:634
+msgid "the history list as a single entry.  The -p option means to perform"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:635
+msgid "history expansion on each ARG and display the result, without storing"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:636
+msgid "anything in the history list."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:638
+msgid "If the $HISTTIMEFORMAT variable is set and not null, its value is used"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:639
+msgid "as a format string for strftime(3) to print the time stamp associated"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:640
+msgid ""
+"with each displayed history entry.  No time stamps are printed otherwise."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:648
+msgid "Lists the active jobs.  The -l option lists process id's in addition"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:649
+msgid "to the normal information; the -p option lists process id's only."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:650
+msgid "If -n is given, only processes that have changed status since the last"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:651
+msgid "notification are printed.  JOBSPEC restricts output to that job.  The"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:652
+msgid "-r and -s options restrict output to running and stopped jobs only,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:653
+msgid "respectively.  Without options, the status of all active jobs is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:654
+msgid "printed.  If -x is given, COMMAND is run after all job specifications"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:655
+msgid ""
+"that appear in ARGS have been replaced with the process ID of that job's"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:656
+msgid "process group leader."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:664
+msgid ""
+"By default, removes each JOBSPEC argument from the table of active jobs."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:665
+msgid ""
+"If the -h option is given, the job is not removed from the table, but is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:666
+msgid "marked so that SIGHUP is not sent to the job if the shell receives a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:667
+msgid ""
+"SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:668
+msgid ""
+"jobs from the job table; the -r option means to remove only running jobs."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:675
+msgid "Send the processes named by PID (or JOB) the signal SIGSPEC.  If"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:676
+msgid "SIGSPEC is not present, then SIGTERM is assumed.  An argument of `-l'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:677
+msgid "lists the signal names; if arguments follow `-l' they are assumed to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:678
+msgid "be signal numbers for which names should be listed.  Kill is a shell"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:679
+msgid "builtin for two reasons: it allows job IDs to be used instead of"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:680
+msgid "process IDs, and, if you have reached the limit on processes that"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:681
+msgid "you can create, you don't have to start a process to kill another one."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:687
+msgid "Each ARG is an arithmetic expression to be evaluated.  Evaluation"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:688
+msgid "is done in fixed-width integers with no check for overflow, though"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:689
+msgid "division by 0 is trapped and flagged as an error.  The following"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:690
+msgid "list of operators is grouped into levels of equal-precedence operators."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:691
+msgid "The levels are listed in order of decreasing precedence."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:693
+msgid "\tid++, id--\tvariable post-increment, post-decrement"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:694
+msgid "\t++id, --id\tvariable pre-increment, pre-decrement"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:695
+msgid "\t-, +\t\tunary minus, plus"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:696
+msgid "\t!, ~\t\tlogical and bitwise negation"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:697
+msgid "\t**\t\texponentiation"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:698
+msgid "\t*, /, %\t\tmultiplication, division, remainder"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:699
+msgid "\t+, -\t\taddition, subtraction"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:700
+msgid "\t<<, >>\t\tleft and right bitwise shifts"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:701
+msgid "\t<=, >=, <, >\tcomparison"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:702
+msgid "\t==, !=\t\tequality, inequality"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:703
+msgid "\t&\t\tbitwise AND"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:704
+msgid "\t^\t\tbitwise XOR"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:705
+msgid "\t|\t\tbitwise OR"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:706
+msgid "\t&&\t\tlogical AND"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:707
+msgid "\t||\t\tlogical OR"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:708
+msgid "\texpr ? expr : expr"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:709
+msgid "\t\t\tconditional operator"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:710
+msgid "\t=, *=, /=, %=,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:711
+msgid "\t+=, -=, <<=, >>=,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:712
+msgid "\t&=, ^=, |=\tassignment"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:714
+msgid "Shell variables are allowed as operands.  The name of the variable"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:715
+msgid "is replaced by its value (coerced to a fixed-width integer) within"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:716
+msgid "an expression.  The variable need not have its integer attribute"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:717
+msgid "turned on to be used in an expression."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:719
+msgid "Operators are evaluated in order of precedence.  Sub-expressions in"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:720
+msgid "parentheses are evaluated first and may override the precedence"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:721
+msgid "rules above."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:723
+msgid "If the last ARG evaluates to 0, let returns 1; 0 is returned"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:724
+msgid "otherwise."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:730
+msgid ""
+"One line is read from the standard input, or from file descriptor FD if the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:731
+msgid ""
+"-u option is supplied, and the first word is assigned to the first NAME,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:732
+msgid ""
+"the second word to the second NAME, and so on, with leftover words assigned"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:733
+msgid ""
+"to the last NAME.  Only the characters found in $IFS are recognized as word"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:734
+msgid ""
+"delimiters.  If no NAMEs are supplied, the line read is stored in the REPLY"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:735
+msgid "variable.  If the -r option is given, this signifies `raw' input, and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:736
+msgid "backslash escaping is disabled.  The -d option causes read to continue"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:737
+msgid ""
+"until the first character of DELIM is read, rather than newline.  If the -p"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:738
+msgid ""
+"option is supplied, the string PROMPT is output without a trailing newline"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:739
+msgid ""
+"before attempting to read.  If -a is supplied, the words read are assigned"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:740
+msgid ""
+"to sequential indices of ARRAY, starting at zero.  If -e is supplied and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:741
+msgid ""
+"the shell is interactive, readline is used to obtain the line.  If -n is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:742
+msgid "supplied with a non-zero NCHARS argument, read returns after NCHARS"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:743
+msgid "characters have been read.  The -s option causes input coming from a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:744
+msgid "terminal to not be echoed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:746
+msgid ""
+"The -t option causes read to time out and return failure if a complete line"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:747
+msgid ""
+"of input is not read within TIMEOUT seconds.  If the TMOUT variable is set,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:748
+msgid ""
+"its value is the default timeout.  The return code is zero, unless end-of-"
+"file"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:749
+msgid ""
+"is encountered, read times out, or an invalid file descriptor is supplied as"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:750
+msgid "the argument to -u."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:756
+msgid "Causes a function to exit with the return value specified by N.  If N"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:757
+msgid "is omitted, the return status is that of the last command."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:763
+msgid "    -a  Mark variables which are modified or created for export."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:764
+msgid "    -b  Notify of job termination immediately."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:765
+msgid "    -e  Exit immediately if a command exits with a non-zero status."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:766
+msgid "    -f  Disable file name generation (globbing)."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:767
+msgid "    -h  Remember the location of commands as they are looked up."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:768
+msgid "    -k  All assignment arguments are placed in the environment for a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:769
+msgid "        command, not just those that precede the command name."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:770
+msgid "    -m  Job control is enabled."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:771
+msgid "    -n  Read commands but do not execute them."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:772
+msgid "    -o option-name"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:773
+msgid "        Set the variable corresponding to option-name:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:774
+msgid "            allexport    same as -a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:775
+msgid "            braceexpand  same as -B"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:777
+msgid "            emacs        use an emacs-style line editing interface"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:779
+msgid "            errexit      same as -e"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:780
+msgid "            errtrace     same as -E"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:781
+msgid "            functrace    same as -T"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:782
+msgid "            hashall      same as -h"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:784
+msgid "            histexpand   same as -H"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:787
+msgid "            history      enable command history"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:789
+msgid "            ignoreeof    the shell will not exit upon reading EOF"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:790
+msgid "            interactive-comments"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:791
+msgid ""
+"                         allow comments to appear in interactive commands"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:792
+msgid "            keyword      same as -k"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:793
+msgid "            monitor      same as -m"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:794
+msgid "            noclobber    same as -C"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:795
+msgid "            noexec       same as -n"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:796
+msgid "            noglob       same as -f"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:797
+msgid "            nolog        currently accepted but ignored"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:798
+msgid "            notify       same as -b"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:799
+msgid "            nounset      same as -u"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:800
+msgid "            onecmd       same as -t"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:801
+msgid "            physical     same as -P"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:802
+msgid ""
+"            pipefail     the return value of a pipeline is the status of"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:803
+msgid ""
+"                         the last command to exit with a non-zero status,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:804
+msgid ""
+"                         or zero if no command exited with a non-zero status"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:805
+msgid "            posix        change the behavior of bash where the default"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:806
+msgid "                         operation differs from the 1003.2 standard to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:807
+msgid "                         match the standard"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:808
+msgid "            privileged   same as -p"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:809
+msgid "            verbose      same as -v"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:811
+msgid "            vi           use a vi-style line editing interface"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:813
+msgid "            xtrace       same as -x"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:814
+msgid ""
+"    -p  Turned on whenever the real and effective user ids do not match."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:815
+msgid "        Disables processing of the $ENV file and importing of shell"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:816
+msgid ""
+"        functions.  Turning this option off causes the effective uid and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:817
+msgid "        gid to be set to the real uid and gid."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:818
+msgid "    -t  Exit after reading and executing one command."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:819
+msgid "    -u  Treat unset variables as an error when substituting."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:820
+msgid "    -v  Print shell input lines as they are read."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:821
+msgid "    -x  Print commands and their arguments as they are executed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:823
+msgid "    -B  the shell will perform brace expansion"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:825
+msgid "    -C  If set, disallow existing regular files to be overwritten"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:826
+msgid "        by redirection of output."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:827
+msgid "    -E  If set, the ERR trap is inherited by shell functions."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:829
+msgid "    -H  Enable ! style history substitution.  This flag is on"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:830
+msgid "        by default."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:832
+msgid "    -P  If set, do not follow symbolic links when executing commands"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:833
+msgid "        such as cd which change the current directory."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:834
+msgid "    -T  If set, the DEBUG trap is inherited by shell functions."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:836
+msgid "Using + rather than - causes these flags to be turned off.  The"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:837
+msgid "flags can also be used upon invocation of the shell.  The current"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:838
+msgid "set of flags may be found in $-.  The remaining n ARGs are positional"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:839
+msgid "parameters and are assigned, in order, to $1, $2, .. $n.  If no"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:840
+msgid "ARGs are given, all shell variables are printed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:846
+msgid "For each NAME, remove the corresponding variable or function.  Given"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:847
+msgid "the `-v', unset will only act on variables.  Given the `-f' flag,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:848
+msgid "unset will only act on functions.  With neither flag, unset first"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:849
+msgid "tries to unset a variable, and if that fails, then tries to unset a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:850
+msgid "function.  Some variables cannot be unset; also see readonly."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:856
+msgid "NAMEs are marked for automatic export to the environment of"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:857
+msgid "subsequently executed commands.  If the -f option is given,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:858
+msgid "the NAMEs refer to functions.  If no NAMEs are given, or if `-p'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:859
+msgid "is given, a list of all names that are exported in this shell is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:860
+msgid "printed.  An argument of `-n' says to remove the export property"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:861
+msgid "from subsequent NAMEs.  An argument of `--' disables further option"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:862
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:874
+msgid "processing."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:868
+msgid "The given NAMEs are marked readonly and the values of these NAMEs may"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:869
+msgid "not be changed by subsequent assignment.  If the -f option is given,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:870
+msgid "then functions corresponding to the NAMEs are so marked.  If no"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:871
+msgid "arguments are given, or if `-p' is given, a list of all readonly names"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:872
+msgid "is printed.  The `-a' option means to treat each NAME as"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:873
+msgid "an array variable.  An argument of `--' disables further option"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:880
+msgid "The positional parameters from $N+1 ... are renamed to $1 ...  If N is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:881
+msgid "not given, it is assumed to be 1."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:887
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:896
+msgid "Read and execute commands from FILENAME and return.  The pathnames"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:888
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:897
+msgid "in $PATH are used to find the directory containing FILENAME.  If any"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:889
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:898
+msgid "ARGUMENTS are supplied, they become the positional parameters when"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:890
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:899
+msgid "FILENAME is executed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:906
+msgid "Suspend the execution of this shell until it receives a SIGCONT"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:907
+msgid "signal.  The `-f' if specified says not to complain about this"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:908
+msgid "being a login shell if it is; just suspend anyway."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:915
+msgid "Exits with a status of 0 (true) or 1 (false) depending on"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:916
+msgid "the evaluation of EXPR.  Expressions may be unary or binary.  Unary"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:917
+msgid "expressions are often used to examine the status of a file.  There"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:918
+msgid "are string operators as well, and numeric comparison operators."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:920
+msgid "File operators:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:922
+msgid "    -a FILE        True if file exists."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:923
+msgid "    -b FILE        True if file is block special."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:924
+msgid "    -c FILE        True if file is character special."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:925
+msgid "    -d FILE        True if file is a directory."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:926
+msgid "    -e FILE        True if file exists."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:927
+msgid "    -f FILE        True if file exists and is a regular file."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:928
+msgid "    -g FILE        True if file is set-group-id."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:929
+msgid "    -h FILE        True if file is a symbolic link."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:930
+msgid "    -L FILE        True if file is a symbolic link."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:931
+msgid "    -k FILE        True if file has its `sticky' bit set."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:932
+msgid "    -p FILE        True if file is a named pipe."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:933
+msgid "    -r FILE        True if file is readable by you."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:934
+msgid "    -s FILE        True if file exists and is not empty."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:935
+msgid "    -S FILE        True if file is a socket."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:936
+msgid "    -t FD          True if FD is opened on a terminal."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:937
+msgid "    -u FILE        True if the file is set-user-id."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:938
+msgid "    -w FILE        True if the file is writable by you."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:939
+msgid "    -x FILE        True if the file is executable by you."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:940
+msgid "    -O FILE        True if the file is effectively owned by you."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:941
+msgid "    -G FILE        True if the file is effectively owned by your group."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:942
+msgid ""
+"    -N FILE        True if the file has been modified since it was last read."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:944
+msgid "  FILE1 -nt FILE2  True if file1 is newer than file2 (according to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:945
+msgid "                   modification date)."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:947
+msgid "  FILE1 -ot FILE2  True if file1 is older than file2."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:949
+msgid "  FILE1 -ef FILE2  True if file1 is a hard link to file2."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:951
+msgid "String operators:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:953
+msgid "    -z STRING      True if string is empty."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:955
+msgid "    -n STRING"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:956
+msgid "    STRING         True if string is not empty."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:958
+msgid "    STRING1 = STRING2"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:959
+msgid "                   True if the strings are equal."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:960
+msgid "    STRING1 != STRING2"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:961
+msgid "                   True if the strings are not equal."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:962
+msgid "    STRING1 < STRING2"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:963
+msgid ""
+"                   True if STRING1 sorts before STRING2 lexicographically."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:964
+msgid "    STRING1 > STRING2"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:965
+msgid ""
+"                   True if STRING1 sorts after STRING2 lexicographically."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:967
+msgid "Other operators:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:969
+msgid "    -o OPTION      True if the shell option OPTION is enabled."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:970
+msgid "    ! EXPR         True if expr is false."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:971
+msgid "    EXPR1 -a EXPR2 True if both expr1 AND expr2 are true."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:972
+msgid "    EXPR1 -o EXPR2 True if either expr1 OR expr2 is true."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:974
+msgid "    arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:975
+msgid "                   -lt, -le, -gt, or -ge."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:977
+msgid "Arithmetic binary operators return true if ARG1 is equal, not-equal,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:978
+msgid "less-than, less-than-or-equal, greater-than, or greater-than-or-equal"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:979
+msgid "than ARG2."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:985
+msgid "This is a synonym for the \"test\" builtin, but the last"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:986
+msgid "argument must be a literal `]', to match the opening `['."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:992
+msgid "Print the accumulated user and system times for processes run from"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:993
+msgid "the shell."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:999
+msgid "The command ARG is to be read and executed when the shell receives"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1000
+msgid "signal(s) SIGNAL_SPEC.  If ARG is absent all specified signals are"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1001
+msgid "reset to their original values.  If ARG is the null string each"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1002
+msgid "SIGNAL_SPEC is ignored by the shell and by the commands it invokes."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1003
+msgid "If a SIGNAL_SPEC is EXIT (0) the command ARG is executed on exit from"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1004
+msgid "the shell.  If a SIGNAL_SPEC is DEBUG, ARG is executed after every"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1005
+msgid "command.  If ARG is `-p' then the trap commands associated with"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1006
+msgid "each SIGNAL_SPEC are displayed.  If no arguments are supplied or if"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1007
+msgid "only `-p' is given, trap prints the list of commands associated with"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1008
+msgid ""
+"each signal number.  Each SIGNAL_SPEC is either a signal name in <signal.h>"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1009
+msgid "or a signal number.  `trap -l' prints a list of signal names and their"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1010
+msgid "corresponding numbers.  Note that a signal can be sent to the shell"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1011
+msgid "with \"kill -signal $$\"."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1017
+msgid "For each NAME, indicate how it would be interpreted if used as a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1018
+msgid "command name."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1020
+msgid "If the -t option is used, `type' outputs a single word which is one of"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1021
+msgid "`alias', `keyword', `function', `builtin', `file' or `', if NAME is an"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1022
+msgid "alias, shell reserved word, shell function, shell builtin, disk file,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1023
+msgid "or unfound, respectively."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1025
+msgid "If the -p flag is used, `type' either returns the name of the disk"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1026
+msgid "file that would be executed, or nothing if `type -t NAME' would not"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1027
+msgid "return `file'."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1029
+msgid "If the -a flag is used, `type' displays all of the places that contain"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1030
+msgid "an executable named `file'.  This includes aliases, builtins, and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1031
+msgid "functions, if and only if the -p flag is not also used."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1033
+msgid "The -f flag suppresses shell function lookup."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1035
+msgid "The -P flag forces a PATH search for each NAME, even if it is an alias,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1036
+msgid "builtin, or function, and returns the name of the disk file that would"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1037
+msgid "be executed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1044
+msgid "Ulimit provides control over the resources available to processes"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1045
+msgid "started by the shell, on systems that allow such control.  If an"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1046
+msgid "option is given, it is interpreted as follows:"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1048
+msgid "    -S\tuse the `soft' resource limit"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1049
+msgid "    -H\tuse the `hard' resource limit"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1050
+msgid "    -a\tall current limits are reported"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1051
+msgid "    -c\tthe maximum size of core files created"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1052
+msgid "    -d\tthe maximum size of a process's data segment"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1053
+msgid "    -f\tthe maximum size of files created by the shell"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1054
+msgid "    -l\tthe maximum size a process may lock into memory"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1055
+msgid "    -m\tthe maximum resident set size"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1056
+msgid "    -n\tthe maximum number of open file descriptors"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1057
+msgid "    -p\tthe pipe buffer size"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1058
+msgid "    -s\tthe maximum stack size"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1059
+msgid "    -t\tthe maximum amount of cpu time in seconds"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1060
+msgid "    -u\tthe maximum number of user processes"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1061
+msgid "    -v\tthe size of virtual memory"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1063
+msgid "If LIMIT is given, it is the new value of the specified resource;"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1064
+msgid "the special LIMIT values `soft', `hard', and `unlimited' stand for"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1065
+msgid ""
+"the current soft limit, the current hard limit, and no limit, respectively."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1066
+msgid "Otherwise, the current value of the specified resource is printed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1067
+msgid "If no option is given, then -f is assumed.  Values are in 1024-byte"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1068
+msgid "increments, except for -t, which is in seconds, -p, which is in"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1069
+msgid "increments of 512 bytes, and -u, which is an unscaled number of"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1070
+msgid "processes."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1077
+msgid "The user file-creation mask is set to MODE.  If MODE is omitted, or if"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1078
+msgid "`-S' is supplied, the current value of the mask is printed.  The `-S'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1079
+msgid "option makes the output symbolic; otherwise an octal number is output."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1080
+msgid "If `-p' is supplied, and MODE is omitted, the output is in a form"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1081
+msgid "that may be used as input.  If MODE begins with a digit, it is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1082
+msgid "interpreted as an octal number, otherwise it is a symbolic mode string"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1083
+msgid "like that accepted by chmod(1)."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1090
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1102
+msgid "Wait for the specified process and report its termination status.  If"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1091
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1103
+msgid "N is not given, all currently active child processes are waited for,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1092
+msgid "and the return code is zero.  N may be a process ID or a job"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1093
+msgid "specification; if a job spec is given, all processes in the job's"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1094
+msgid "pipeline are waited for."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1104
+msgid "and the return code is zero.  N is a process ID; if it is not given,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1105
+msgid "all child processes of the shell are waited for."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1112
+msgid "The `for' loop executes a sequence of commands for each member in a"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1113
+msgid "list of items.  If `in WORDS ...;' is not present, then `in \"$@\"' is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1114
+msgid "assumed.  For each element in WORDS, NAME is set to that element, and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1115
+msgid "the COMMANDS are executed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1121
+msgid "Equivalent to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1122
+msgid "\t(( EXP1 ))"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1123
+msgid "\twhile (( EXP2 )); do"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1124
+msgid "\t\tCOMMANDS"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1125
+msgid "\t\t(( EXP3 ))"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1126
+msgid "\tdone"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1127
+msgid "EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1128
+msgid "omitted, it behaves as if it evaluates to 1."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1134
+msgid "The WORDS are expanded, generating a list of words.  The"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1135
+msgid "set of expanded words is printed on the standard error, each"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1136
+msgid "preceded by a number.  If `in WORDS' is not present, `in \"$@\"'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1137
+msgid "is assumed.  The PS3 prompt is then displayed and a line read"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1138
+msgid "from the standard input.  If the line consists of the number"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1139
+msgid "corresponding to one of the displayed words, then NAME is set"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1140
+msgid "to that word.  If the line is empty, WORDS and the prompt are"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1141
+msgid "redisplayed.  If EOF is read, the command completes.  Any other"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1142
+msgid "value read causes NAME to be set to null.  The line read is saved"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1143
+msgid "in the variable REPLY.  COMMANDS are executed after each selection"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1144
+msgid "until a break command is executed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1150
+msgid "Execute PIPELINE and print a summary of the real time, user CPU time,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1151
+msgid "and system CPU time spent executing PIPELINE when it terminates."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1152
+msgid "The return status is the return status of PIPELINE.  The `-p' option"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1153
+msgid "prints the timing summary in a slightly different format.  This uses"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1154
+msgid "the value of the TIMEFORMAT variable as the output format."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1160
+msgid "Selectively execute COMMANDS based upon WORD matching PATTERN.  The"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1161
+msgid "`|' is used to separate multiple patterns."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1167
+msgid ""
+"The if COMMANDS are executed.  If the exit status is zero, then the then"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1168
+msgid ""
+"COMMANDS are executed.  Otherwise, each of the elif COMMANDS are executed"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1169
+msgid ""
+"in turn, and if the exit status is zero, the corresponding then COMMANDS"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1170
+msgid ""
+"are executed and the if command completes.  Otherwise, the else COMMANDS"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1171
+msgid ""
+"are executed, if present.  The exit status is the exit status of the last"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1172
+msgid "command executed, or zero if no condition tested true."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1178
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1185
+msgid "Expand and execute COMMANDS as long as the final command in the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1179
+msgid "`while' COMMANDS has an exit status of zero."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1186
+msgid "`until' COMMANDS has an exit status which is not zero."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1192
+msgid "Create a simple command invoked by NAME which runs COMMANDS."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1193
+msgid "Arguments on the command line along with NAME are passed to the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1194
+msgid "function as $0 .. $n."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1200
+msgid "Run a set of commands in a group.  This is one way to redirect an"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1201
+msgid "entire set of commands."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1207
+msgid "This is similar to the `fg' command.  Resume a stopped or background"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1208
+msgid "job.  If you specifiy DIGITS, then that job is used.  If you specify"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1209
+msgid "WORD, then the job whose name begins with WORD is used.  Following the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1210
+msgid "job specification with a `&' places the job in the background."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1216
+msgid "The EXPRESSION is evaluated according to the rules for arithmetic"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1217
+msgid "evaluation.  Equivalent to \"let EXPRESSION\"."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1223
+msgid ""
+"Returns a status of 0 or 1 depending on the evaluation of the conditional"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1224
+msgid ""
+"expression EXPRESSION.  Expressions are composed of the same primaries used"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1225
+msgid ""
+"by the `test' builtin, and may be combined using the following operators"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1227
+msgid "\t( EXPRESSION )\tReturns the value of EXPRESSION"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1228
+msgid "\t! EXPRESSION\tTrue if EXPRESSION is false; else false"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1229
+msgid "\tEXPR1 && EXPR2\tTrue if both EXPR1 and EXPR2 are true; else false"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1230
+msgid "\tEXPR1 || EXPR2\tTrue if either EXPR1 or EXPR2 is true; else false"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1232
+msgid ""
+"When the `==' and `!=' operators are used, the string to the right of the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1233
+msgid "operator is used as a pattern and pattern matching is performed.  The"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1234
+msgid "&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1235
+msgid "determine the expression's value."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1241
+msgid "BASH_VERSION    Version information for this Bash."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1242
+msgid "CDPATH          A colon separated list of directories to search"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1243
+msgid "\t\twhen the argument to `cd' is not found in the current"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1244
+msgid "\t\tdirectory."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1245
+msgid "GLOBIGNORE\tA colon-separated list of patterns describing filenames to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1246
+msgid "\t\tbe ignored by pathname expansion."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1248
+msgid ""
+"HISTFILE        The name of the file where your command history is stored."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1249
+msgid "HISTFILESIZE    The maximum number of lines this file can contain."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1250
+msgid "HISTSIZE        The maximum number of history lines that a running"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1251
+msgid "\t\tshell can access."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1253
+msgid "HOME            The complete pathname to your login directory."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1254
+msgid "HOSTNAME\tThe name of the current host."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1255
+msgid "HOSTTYPE        The type of CPU this version of Bash is running under."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1256
+msgid "IGNOREEOF       Controls the action of the shell on receipt of an EOF"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1257
+msgid "\t\tcharacter as the sole input.  If set, then the value"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1258
+msgid "\t\tof it is the number of EOF characters that can be seen"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1259
+msgid "\t\tin a row on an empty line before the shell will exit"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1260
+msgid "\t\t(default 10).  When unset, EOF signifies the end of input."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1261
+msgid "MACHTYPE\tA string describing the current system Bash is running on."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1262
+msgid "MAILCHECK\tHow often, in seconds, Bash checks for new mail."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1263
+msgid "MAILPATH\tA colon-separated list of filenames which Bash checks"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1264
+msgid "\t\tfor new mail."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1265
+msgid "OSTYPE\t\tThe version of Unix this version of Bash is running on."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1266
+msgid "PATH            A colon-separated list of directories to search when"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1267
+msgid "\t\tlooking for commands."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1268
+msgid "PROMPT_COMMAND  A command to be executed before the printing of each"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1269
+msgid "\t\tprimary prompt."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1270
+msgid "PS1             The primary prompt string."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1271
+msgid "PS2             The secondary prompt string."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1272
+msgid "PWD\t\tThe full pathname of the current directory."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1273
+msgid "SHELLOPTS\tA colon-separated list of enabled shell options."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1274
+msgid "TERM            The name of the current terminal type."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1275
+msgid "TIMEFORMAT\tThe output format for timing statistics displayed by the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1276
+msgid "\t\t`time' reserved word."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1277
+msgid "auto_resume     Non-null means a command word appearing on a line by"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1278
+msgid "\t\titself is first looked for in the list of currently"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1279
+msgid "\t\tstopped jobs.  If found there, that job is foregrounded."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1280
+msgid "\t\tA value of `exact' means that the command word must"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1281
+msgid "\t\texactly match a command in the list of stopped jobs.  A"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1282
+msgid "\t\tvalue of `substring' means that the command word must"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1283
+msgid "\t\tmatch a substring of the job.  Any other value means that"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1284
+msgid "\t\tthe command must be a prefix of a stopped job."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1287
+msgid "histchars       Characters controlling history expansion and quick"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1288
+msgid "\t\tsubstitution.  The first character is the history"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1289
+msgid "\t\tsubstitution character, usually `!'.  The second is"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1290
+msgid "\t\tthe `quick substitution' character, usually `^'.  The"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1291
+msgid "\t\tthird is the `history comment' character, usually `#'."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1293
+msgid "HISTIGNORE\tA colon-separated list of patterns used to decide which"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1294
+msgid "\t\tcommands should be saved on the history list."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1302
+msgid "Adds a directory to the top of the directory stack, or rotates"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1303
+msgid "the stack, making the new top of the stack the current working"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1304
+msgid "directory.  With no arguments, exchanges the top two directories."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1306
+msgid "+N\tRotates the stack so that the Nth directory (counting"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1307
+msgid "\tfrom the left of the list shown by `dirs', starting with"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1308
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1312
+msgid "\tzero) is at the top."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1310
+msgid "-N\tRotates the stack so that the Nth directory (counting"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1311
+msgid "\tfrom the right of the list shown by `dirs', starting with"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1314
+msgid "-n\tsuppress the normal change of directory when adding directories"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1315
+msgid "\tto the stack, so only the stack is manipulated."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1317
+msgid "dir\tadds DIR to the directory stack at the top, making it the"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1318
+msgid "\tnew current working directory."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1320
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1343
+msgid "You can see the directory stack with the `dirs' command."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1328
+msgid "Removes entries from the directory stack.  With no arguments,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1329
+msgid "removes the top directory from the stack, and cd's to the new"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1330
+msgid "top directory."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1332
+msgid "+N\tremoves the Nth entry counting from the left of the list"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1333
+msgid "\tshown by `dirs', starting with zero.  For example: `popd +0'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1334
+msgid "\tremoves the first directory, `popd +1' the second."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1336
+msgid "-N\tremoves the Nth entry counting from the right of the list"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1337
+msgid "\tshown by `dirs', starting with zero.  For example: `popd -0'"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1338
+msgid "\tremoves the last directory, `popd -1' the next to last."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1340
+msgid "-n\tsuppress the normal change of directory when removing directories"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1341
+msgid "\tfrom the stack, so only the stack is manipulated."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1351
+msgid "Display the list of currently remembered directories.  Directories"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1352
+msgid "find their way onto the list with the `pushd' command; you can get"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1353
+msgid "back up through the list with the `popd' command."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1355
+msgid "The -l flag specifies that `dirs' should not print shorthand versions"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1356
+msgid "of directories which are relative to your home directory.  This means"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1357
+msgid "that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1358
+msgid "causes `dirs' to print the directory stack with one entry per line,"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1359
+msgid "prepending the directory name with its position in the stack.  The -p"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1360
+msgid "flag does the same thing, but the stack position is not prepended."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1361
+msgid "The -c flag clears the directory stack by deleting all of the elements."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1363
+msgid "+N\tdisplays the Nth entry counting from the left of the list shown by"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1364
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1367
+msgid "\tdirs when invoked without options, starting with zero."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1366
+msgid "-N\tdisplays the Nth entry counting from the right of the list shown by"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1374
+msgid "Toggle the values of variables controlling optional behavior."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1375
+msgid "The -s flag means to enable (set) each OPTNAME; the -u flag"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1376
+msgid "unsets each OPTNAME.  The -q flag suppresses output; the exit"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1377
+msgid "status indicates whether each OPTNAME is set or unset.  The -o"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1378
+msgid "option restricts the OPTNAMEs to those defined for use with"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1379
+msgid "`set -o'.  With no options, or with the -p option, a list of all"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1380
+msgid "settable options is displayed, with an indication of whether or"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1381
+msgid "not each is set."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1387
+msgid "printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1388
+msgid "is a character string which contains three types of objects: plain"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1389
+msgid ""
+"characters, which are simply copied to standard output, character escape"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1390
+msgid "sequences which are converted and copied to the standard output, and"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1391
+msgid ""
+"format specifications, each of which causes printing of the next successive"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1392
+msgid "argument.  In addition to the standard printf(1) formats, %b means to"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1393
+msgid "expand backslash escape sequences in the corresponding argument, and %q"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1394
+msgid "means to quote the argument in a way that can be reused as shell input."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1401
+msgid "For each NAME, specify how arguments are to be completed."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1402
+msgid "If the -p option is supplied, or if no options are supplied, existing"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1403
+msgid "completion specifications are printed in a way that allows them to be"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1404
+msgid "reused as input.  The -r option removes a completion specification for"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1405
+msgid "each NAME, or, if no NAMEs are supplied, all completion specifications."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1413
+msgid "Display the possible completions depending on the options.  Intended"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1414
+msgid ""
+"to be used from within a shell function generating possible completions."
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1415
+msgid "If the optional WORD argument is supplied, matches against WORD are"
+msgstr ""
+
+#: /usr/local/build/bash/bash-20031218/builtins/builtins.c:1416
+msgid "generated."
+msgstr ""
diff --git a/po/en@boldquot.gmo b/po/en@boldquot.gmo
new file mode 100644 (file)
index 0000000..41b2dc9
Binary files /dev/null and b/po/en@boldquot.gmo differ
diff --git a/po/en@boldquot.header b/po/en@boldquot.header
new file mode 100644 (file)
index 0000000..fedb6a0
--- /dev/null
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/po/en@boldquot.po b/po/en@boldquot.po
new file mode 100644 (file)
index 0000000..29918c8
--- /dev/null
@@ -0,0 +1,4344 @@
+# English translations for GNU bash package.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the GNU bash package.
+# Automatically generated, 2003.
+#
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
+#: builtins/caller.def:128 builtins/caller.def:132 builtins/pushd.def:655
+#: builtins/pushd.def:663 builtins/pushd.def:666 builtins/pushd.def:676
+#: builtins/pushd.def:680 builtins/pushd.def:684 builtins/pushd.def:687
+#: builtins/pushd.def:690 builtins/pushd.def:699 builtins/pushd.def:703
+#: builtins/pushd.def:707 builtins/pushd.def:710 builtins.c:321 builtins.c:325
+#: builtins.c:390 builtins.c:392 builtins.c:401 builtins.c:404 builtins.c:408
+#: builtins.c:445 builtins.c:487 builtins.c:491 builtins.c:498 builtins.c:509
+#: builtins.c:513 builtins.c:552 builtins.c:555 builtins.c:559 builtins.c:562
+#: builtins.c:630 builtins.c:637 builtins.c:692 builtins.c:713 builtins.c:718
+#: builtins.c:722 builtins.c:745 builtins.c:835 builtins.c:919 builtins.c:921
+#: builtins.c:943 builtins.c:946 builtins.c:948 builtins.c:950 builtins.c:952
+#: builtins.c:954 builtins.c:957 builtins.c:966 builtins.c:968 builtins.c:973
+#: builtins.c:976 builtins.c:1019 builtins.c:1024 builtins.c:1028
+#: builtins.c:1032 builtins.c:1034 builtins.c:1047 builtins.c:1062
+#: builtins.c:1226 builtins.c:1231 builtins.c:1305 builtins.c:1309
+#: builtins.c:1313 builtins.c:1316 builtins.c:1319 builtins.c:1331
+#: builtins.c:1335 builtins.c:1339 builtins.c:1342 builtins.c:1354
+#: builtins.c:1362 builtins.c:1365
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU bash 3.0-alpha\n"
+"POT-Creation-Date: 2003-12-22 15:34-0500\n"
+"PO-Revision-Date: 2003-12-22 15:34-0500\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Report-Msgid-Bugs-To: bug-bash@gnu.org\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: arrayfunc.c:45
+msgid "bad array subscript"
+msgstr "bad array subscript"
+
+#: arrayfunc.c:306
+#, c-format
+msgid "%s: cannot assign to non-numeric index"
+msgstr "%s: cannot assign to non-numeric index"
+
+#: bashhist.c:321
+#, c-format
+msgid "%s: cannot create: %s"
+msgstr "%s: cannot create: %s"
+
+#: bashline.c:2791
+msgid "bash_execute_unix_command: cannot find keymap for command"
+msgstr "bash_execute_unix_command: cannot find keymap for command"
+
+#: bashline.c:2840
+#, c-format
+msgid "%s: first non-whitespace character is not `\"'"
+msgstr "%s: first non-whitespace character is not ‘\e[1m\"\e[0m’"
+
+#: bashline.c:2869
+#, c-format
+msgid "no closing `%c' in %s"
+msgstr "no closing ‘\e[1m%c\e[0m’ in %s"
+
+#: bashline.c:2903
+#, c-format
+msgid "%s: missing colon separator"
+msgstr "%s: missing colon separator"
+
+#: builtins/bind.def:194
+#, c-format
+msgid "`%s': invalid keymap name"
+msgstr "‘\e[1m%s\e[0m’: invalid keymap name"
+
+#: builtins/bind.def:233
+#, c-format
+msgid "%s: cannot read: %s"
+msgstr "%s: cannot read: %s"
+
+#: builtins/bind.def:248
+#, c-format
+msgid "`%s': cannot unbind"
+msgstr "‘\e[1m%s\e[0m’: cannot unbind"
+
+#: builtins/bind.def:283
+#, c-format
+msgid "`%s': unknown function name"
+msgstr "‘\e[1m%s\e[0m’: unknown function name"
+
+#: builtins/bind.def:291
+#, c-format
+msgid "%s is not bound to any keys.\n"
+msgstr "%s is not bound to any keys.\n"
+
+#: builtins/bind.def:295
+#, c-format
+msgid "%s can be invoked via "
+msgstr "%s can be invoked via "
+
+#: builtins/break.def:128
+msgid "only meaningful in a `for', `while', or `until' loop"
+msgstr "only meaningful in a ‘\e[1mfor\e[0m’, ‘\e[1mwhile\e[0m’, or ‘\e[1muntil\e[0m’ loop"
+
+#: builtins/caller.def:127 builtins.c:320
+msgid "Returns the context of the current subroutine call."
+msgstr "Returns the context of the current subroutine call."
+
+#: builtins/caller.def:129 builtins.c:322
+msgid "Without EXPR, returns returns \"$line $filename\".  With EXPR,"
+msgstr "Without EXPR, returns returns “\e[1m$line $filename\e[0m”.  With EXPR,"
+
+#: builtins/caller.def:130 builtins.c:323
+msgid "returns \"$line $subroutine $filename\"; this extra information"
+msgstr "returns “\e[1m$line $subroutine $filename\e[0m”; this extra information"
+
+#: builtins/caller.def:131 builtins.c:324
+msgid "can be used used to provide a stack trace."
+msgstr "can be used used to provide a stack trace."
+
+#: builtins/caller.def:133 builtins.c:326
+msgid "The value of EXPR indicates how many call frames to go back before the"
+msgstr "The value of EXPR indicates how many call frames to go back before the"
+
+#: builtins/caller.def:134 builtins.c:327
+msgid "current one; the top frame is frame 0."
+msgstr "current one; the top frame is frame 0."
+
+#: builtins/cd.def:188
+msgid "HOME not set"
+msgstr "HOME not set"
+
+#: builtins/cd.def:200
+msgid "OLDPWD not set"
+msgstr "OLDPWD not set"
+
+#: builtins/cd.def:350
+#, c-format
+msgid "write error: %s"
+msgstr "write error: %s"
+
+#: builtins/common.c:133 test.c:921
+msgid "too many arguments"
+msgstr "too many arguments"
+
+#: builtins/common.c:157 shell.c:465 shell.c:737
+#, c-format
+msgid "%s: option requires an argument"
+msgstr "%s: option requires an argument"
+
+#: builtins/common.c:164
+#, c-format
+msgid "%s: numeric argument required"
+msgstr "%s: numeric argument required"
+
+#: builtins/common.c:171
+#, c-format
+msgid "%s: not found"
+msgstr "%s: not found"
+
+#: builtins/common.c:180 shell.c:750
+#, c-format
+msgid "%s: invalid option"
+msgstr "%s: invalid option"
+
+#: builtins/common.c:187
+#, c-format
+msgid "%s: invalid option name"
+msgstr "%s: invalid option name"
+
+#: builtins/common.c:194 general.c:229 general.c:234
+#, c-format
+msgid "`%s': not a valid identifier"
+msgstr "‘\e[1m%s\e[0m’: not a valid identifier"
+
+#: builtins/common.c:201
+#, c-format
+msgid "%s: invalid number"
+msgstr "%s: invalid number"
+
+#: builtins/common.c:208
+#, c-format
+msgid "%s: invalid signal specification"
+msgstr "%s: invalid signal specification"
+
+#: builtins/common.c:215
+#, c-format
+msgid "`%s': not a pid or valid job spec"
+msgstr "‘\e[1m%s\e[0m’: not a pid or valid job spec"
+
+#: builtins/common.c:222 error.c:453
+#, c-format
+msgid "%s: readonly variable"
+msgstr "%s: readonly variable"
+
+#: builtins/common.c:230
+#, c-format
+msgid "%s: %s out of range"
+msgstr "%s: %s out of range"
+
+#: builtins/common.c:230 builtins/common.c:232
+msgid "argument"
+msgstr "argument"
+
+#: builtins/common.c:232
+#, c-format
+msgid "%s out of range"
+msgstr "%s out of range"
+
+#: builtins/common.c:240
+#, c-format
+msgid "%s: no such job"
+msgstr "%s: no such job"
+
+#: builtins/common.c:248
+#, c-format
+msgid "%s: no job control"
+msgstr "%s: no job control"
+
+#: builtins/common.c:250
+msgid "no job control"
+msgstr "no job control"
+
+#: builtins/common.c:260
+#, c-format
+msgid "%s: restricted"
+msgstr "%s: restricted"
+
+#: builtins/common.c:262
+msgid "restricted"
+msgstr "restricted"
+
+#: builtins/common.c:270
+#, c-format
+msgid "%s: not a shell builtin"
+msgstr "%s: not a shell builtin"
+
+#: builtins/common.c:481
+#, c-format
+msgid "%s: could not get current directory: %s: %s\n"
+msgstr "%s: could not get current directory: %s: %s\n"
+
+#: builtins/common.c:548 builtins/common.c:550
+#, c-format
+msgid "%s: ambiguous job spec"
+msgstr "%s: ambiguous job spec"
+
+#: builtins/complete.def:251
+#, c-format
+msgid "%s: invalid action name"
+msgstr "%s: invalid action name"
+
+#: builtins/complete.def:381 builtins/complete.def:524
+#, c-format
+msgid "%s: no completion specification"
+msgstr "%s: no completion specification"
+
+#: builtins/complete.def:571
+msgid "warning: -F option may not work as you expect"
+msgstr "warning: -F option may not work as you expect"
+
+#: builtins/complete.def:573
+msgid "warning: -C option may not work as you expect"
+msgstr "warning: -C option may not work as you expect"
+
+#: builtins/declare.def:105
+msgid "can only be used in a function"
+msgstr "can only be used in a function"
+
+#: builtins/declare.def:295
+msgid "cannot use `-f' to make functions"
+msgstr "cannot use ‘\e[1m-f\e[0m’ to make functions"
+
+#: builtins/declare.def:307 execute_cmd.c:3949
+#, c-format
+msgid "%s: readonly function"
+msgstr "%s: readonly function"
+
+#: builtins/declare.def:389
+#, c-format
+msgid "%s: cannot destroy array variables in this way"
+msgstr "%s: cannot destroy array variables in this way"
+
+#: builtins/enable.def:128 builtins/enable.def:136
+msgid "dynamic loading not available"
+msgstr "dynamic loading not available"
+
+#: builtins/enable.def:303
+#, c-format
+msgid "cannot open shared object %s: %s"
+msgstr "cannot open shared object %s: %s"
+
+#: builtins/enable.def:326
+#, c-format
+msgid "cannot find %s in shared object %s: %s"
+msgstr "cannot find %s in shared object %s: %s"
+
+#: builtins/enable.def:450
+#, c-format
+msgid "%s: not dynamically loaded"
+msgstr "%s: not dynamically loaded"
+
+#: builtins/enable.def:465
+#, c-format
+msgid "%s: cannot delete: %s"
+msgstr "%s: cannot delete: %s"
+
+#: builtins/evalfile.c:128 execute_cmd.c:3821 shell.c:1395
+#, c-format
+msgid "%s: is a directory"
+msgstr "%s: is a directory"
+
+#: builtins/evalfile.c:133
+#, c-format
+msgid "%s: not a regular file"
+msgstr "%s: not a regular file"
+
+#: builtins/evalfile.c:141
+#, c-format
+msgid "%s: file is too large"
+msgstr "%s: file is too large"
+
+#: builtins/exec.def:205
+#, c-format
+msgid "%s: cannot execute: %s"
+msgstr "%s: cannot execute: %s"
+
+#: builtins/exit.def:83
+msgid "not login shell: use `exit'"
+msgstr "not login shell: use ‘\e[1mexit\e[0m’"
+
+#: builtins/exit.def:111
+msgid "There are stopped jobs.\n"
+msgstr "There are stopped jobs.\n"
+
+#: builtins/fc.def:252
+msgid "no command found"
+msgstr "no command found"
+
+#: builtins/fc.def:317
+msgid "history specification"
+msgstr "history specification"
+
+#: builtins/fc.def:338
+#, c-format
+msgid "%s: cannot open temp file: %s"
+msgstr "%s: cannot open temp file: %s"
+
+#: builtins/fg_bg.def:133
+#, c-format
+msgid "job %d started without job control"
+msgstr "job %d started without job control"
+
+#: builtins/getopt.c:109
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: illegal option -- %c\n"
+
+#: builtins/getopt.c:110
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: option requires an argument -- %c\n"
+
+#: builtins/hash.def:83
+msgid "hashing disabled"
+msgstr "hashing disabled"
+
+#: builtins/hash.def:128
+#, c-format
+msgid "%s: hash table empty\n"
+msgstr "%s: hash table empty\n"
+
+#: builtins/help.def:108
+msgid "Shell commands matching keywords `"
+msgstr "Shell commands matching keywords `"
+
+#: builtins/help.def:110
+msgid "Shell commands matching keyword `"
+msgstr "Shell commands matching keyword `"
+
+#: builtins/help.def:138
+#, c-format
+msgid ""
+"no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."
+msgstr ""
+"no help topics match ‘\e[1m%s\e[0m’.  Try ‘\e[1mhelp help\e[0m’ or ‘\e[1mman -k %s\e[0m’ "
+"or ‘\e[1minfo %s\e[0m’."
+
+#: builtins/help.def:164
+#, c-format
+msgid "%s: cannot open: %s"
+msgstr "%s: cannot open: %s"
+
+#: builtins/help.def:182
+msgid ""
+"These shell commands are defined internally.  Type `help' to see this list.\n"
+"Type `help name' to find out more about the function `name'.\n"
+"Use `info bash' to find out more about the shell in general.\n"
+"Use `man -k' or `info' to find out more about commands not in this list.\n"
+"\n"
+"A star (*) next to a name means that the command is disabled.\n"
+"\n"
+msgstr ""
+"These shell commands are defined internally.  Type ‘\e[1mhelp\e[0m’ to see this "
+"list.\n"
+"Type ‘\e[1mhelp name\e[0m’ to find out more about the function ‘\e[1mname\e[0m’.\n"
+"Use ‘\e[1minfo bash\e[0m’ to find out more about the shell in general.\n"
+"Use ‘\e[1mman -k\e[0m’ or ‘\e[1minfo\e[0m’ to find out more about commands not in "
+"this list.\n"
+"\n"
+"A star (*) next to a name means that the command is disabled.\n"
+"\n"
+
+#: builtins/history.def:148
+msgid "cannot use more than one of -anrw"
+msgstr "cannot use more than one of -anrw"
+
+#: builtins/history.def:180
+msgid "history position"
+msgstr "history position"
+
+#: builtins/history.def:390
+#, c-format
+msgid "%s: history expansion failed"
+msgstr "%s: history expansion failed"
+
+#: builtins/jobs.def:102
+msgid "no other options allowed with `-x'"
+msgstr "no other options allowed with ‘\e[1m-x\e[0m’"
+
+#: builtins/kill.def:187
+#, c-format
+msgid "%s: arguments must be process or job IDs"
+msgstr "%s: arguments must be process or job IDs"
+
+#: builtins/kill.def:248
+msgid "Unknown error"
+msgstr "Unknown error"
+
+#: builtins/let.def:94 builtins/let.def:119 expr.c:496 expr.c:511
+msgid "expression expected"
+msgstr "expression expected"
+
+#: builtins/printf.def:249
+#, c-format
+msgid "`%s': missing format character"
+msgstr "‘\e[1m%s\e[0m’: missing format character"
+
+#: builtins/printf.def:408
+#, c-format
+msgid "`%c': invalid format character"
+msgstr "‘\e[1m%c\e[0m’: invalid format character"
+
+#: builtins/printf.def:601
+msgid "missing hex digit for \\x"
+msgstr "missing hex digit for \\x"
+
+#: builtins/pushd.def:168
+msgid "no other directory"
+msgstr "no other directory"
+
+#: builtins/pushd.def:435
+msgid "<no current directory>"
+msgstr "<no current directory>"
+
+#: builtins/pushd.def:652 builtins.c:1351
+msgid "Display the list of currently remembered directories.  Directories"
+msgstr "Display the list of currently remembered directories.  Directories"
+
+#: builtins/pushd.def:653 builtins.c:1352
+msgid "find their way onto the list with the `pushd' command; you can get"
+msgstr ""
+"find their way onto the list with the ‘\e[1mpushd\e[0m’ command; you can get"
+
+#: builtins/pushd.def:654 builtins.c:1353
+msgid "back up through the list with the `popd' command."
+msgstr "back up through the list with the ‘\e[1mpopd\e[0m’ command."
+
+#: builtins/pushd.def:656 builtins.c:1355
+msgid "The -l flag specifies that `dirs' should not print shorthand versions"
+msgstr ""
+"The -l flag specifies that ‘\e[1mdirs\e[0m’ should not print shorthand versions"
+
+#: builtins/pushd.def:657 builtins.c:1356
+msgid "of directories which are relative to your home directory.  This means"
+msgstr "of directories which are relative to your home directory.  This means"
+
+#: builtins/pushd.def:658 builtins.c:1357
+msgid "that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag"
+msgstr ""
+"that ‘\e[1m~/bin\e[0m’ might be displayed as ‘\e[1m/homes/bfox/bin\e[0m’.  The -v "
+"flag"
+
+#: builtins/pushd.def:659 builtins.c:1358
+msgid "causes `dirs' to print the directory stack with one entry per line,"
+msgstr ""
+"causes ‘\e[1mdirs\e[0m’ to print the directory stack with one entry per line,"
+
+#: builtins/pushd.def:660 builtins.c:1359
+msgid "prepending the directory name with its position in the stack.  The -p"
+msgstr "prepending the directory name with its position in the stack.  The -p"
+
+#: builtins/pushd.def:661 builtins.c:1360
+msgid "flag does the same thing, but the stack position is not prepended."
+msgstr "flag does the same thing, but the stack position is not prepended."
+
+#: builtins/pushd.def:662 builtins.c:1361
+msgid "The -c flag clears the directory stack by deleting all of the elements."
+msgstr ""
+"The -c flag clears the directory stack by deleting all of the elements."
+
+#: builtins/pushd.def:664
+msgid "+N   displays the Nth entry counting from the left of the list shown by"
+msgstr ""
+"+N   displays the Nth entry counting from the left of the list shown by"
+
+#: builtins/pushd.def:665 builtins/pushd.def:668
+msgid "     dirs when invoked without options, starting with zero."
+msgstr "     dirs when invoked without options, starting with zero."
+
+#: builtins/pushd.def:667
+msgid ""
+"-N   displays the Nth entry counting from the right of the list shown by"
+msgstr ""
+"-N   displays the Nth entry counting from the right of the list shown by"
+
+#: builtins/pushd.def:673 builtins.c:1302
+msgid "Adds a directory to the top of the directory stack, or rotates"
+msgstr "Adds a directory to the top of the directory stack, or rotates"
+
+#: builtins/pushd.def:674 builtins.c:1303
+msgid "the stack, making the new top of the stack the current working"
+msgstr "the stack, making the new top of the stack the current working"
+
+#: builtins/pushd.def:675 builtins.c:1304
+msgid "directory.  With no arguments, exchanges the top two directories."
+msgstr "directory.  With no arguments, exchanges the top two directories."
+
+#: builtins/pushd.def:677
+msgid "+N   Rotates the stack so that the Nth directory (counting"
+msgstr "+N   Rotates the stack so that the Nth directory (counting"
+
+#: builtins/pushd.def:678
+msgid "     from the left of the list shown by `dirs', starting with"
+msgstr "     from the left of the list shown by ‘\e[1mdirs\e[0m’, starting with"
+
+#: builtins/pushd.def:679 builtins/pushd.def:683
+msgid "     zero) is at the top."
+msgstr "     zero) is at the top."
+
+#: builtins/pushd.def:681
+msgid "-N   Rotates the stack so that the Nth directory (counting"
+msgstr "-N   Rotates the stack so that the Nth directory (counting"
+
+#: builtins/pushd.def:682
+msgid "     from the right of the list shown by `dirs', starting with"
+msgstr "     from the right of the list shown by ‘\e[1mdirs\e[0m’, starting with"
+
+#: builtins/pushd.def:685
+msgid "-n   suppress the normal change of directory when adding directories"
+msgstr "-n   suppress the normal change of directory when adding directories"
+
+#: builtins/pushd.def:686
+msgid "     to the stack, so only the stack is manipulated."
+msgstr "     to the stack, so only the stack is manipulated."
+
+#: builtins/pushd.def:688
+msgid "dir  adds DIR to the directory stack at the top, making it the"
+msgstr "dir  adds DIR to the directory stack at the top, making it the"
+
+#: builtins/pushd.def:689
+msgid "     new current working directory."
+msgstr "     new current working directory."
+
+#: builtins/pushd.def:691 builtins/pushd.def:711 builtins.c:1320
+#: builtins.c:1343
+msgid "You can see the directory stack with the `dirs' command."
+msgstr "You can see the directory stack with the ‘\e[1mdirs\e[0m’ command."
+
+#: builtins/pushd.def:696 builtins.c:1328
+msgid "Removes entries from the directory stack.  With no arguments,"
+msgstr "Removes entries from the directory stack.  With no arguments,"
+
+#: builtins/pushd.def:697 builtins.c:1329
+msgid "removes the top directory from the stack, and cd's to the new"
+msgstr "removes the top directory from the stack, and cd's to the new"
+
+#: builtins/pushd.def:698 builtins.c:1330
+msgid "top directory."
+msgstr "top directory."
+
+#: builtins/pushd.def:700
+msgid "+N   removes the Nth entry counting from the left of the list"
+msgstr "+N   removes the Nth entry counting from the left of the list"
+
+#: builtins/pushd.def:701
+msgid "     shown by `dirs', starting with zero.  For example: `popd +0'"
+msgstr ""
+"     shown by ‘\e[1mdirs\e[0m’, starting with zero.  For example: ‘\e[1mpopd +0\e[0m’"
+
+#: builtins/pushd.def:702
+msgid "     removes the first directory, `popd +1' the second."
+msgstr "     removes the first directory, ‘\e[1mpopd +1\e[0m’ the second."
+
+#: builtins/pushd.def:704
+msgid "-N   removes the Nth entry counting from the right of the list"
+msgstr "-N   removes the Nth entry counting from the right of the list"
+
+#: builtins/pushd.def:705
+msgid "     shown by `dirs', starting with zero.  For example: `popd -0'"
+msgstr ""
+"     shown by ‘\e[1mdirs\e[0m’, starting with zero.  For example: ‘\e[1mpopd -0\e[0m’"
+
+#: builtins/pushd.def:706
+msgid "     removes the last directory, `popd -1' the next to last."
+msgstr "     removes the last directory, ‘\e[1mpopd -1\e[0m’ the next to last."
+
+#: builtins/pushd.def:708
+msgid "-n   suppress the normal change of directory when removing directories"
+msgstr "-n   suppress the normal change of directory when removing directories"
+
+#: builtins/pushd.def:709
+msgid "     from the stack, so only the stack is manipulated."
+msgstr "     from the stack, so only the stack is manipulated."
+
+#: builtins/read.def:207
+#, c-format
+msgid "%s: invalid timeout specification"
+msgstr "%s: invalid timeout specification"
+
+#: builtins/read.def:230
+#, c-format
+msgid "%s: invalid file descriptor specification"
+msgstr "%s: invalid file descriptor specification"
+
+#: builtins/read.def:237
+#, c-format
+msgid "%d: invalid file descriptor: %s"
+msgstr "%d: invalid file descriptor: %s"
+
+#: builtins/read.def:463
+#, c-format
+msgid "read error: %d: %s"
+msgstr "read error: %d: %s"
+
+#: builtins/return.def:63
+msgid "can only `return' from a function or sourced script"
+msgstr "can only ‘\e[1mreturn\e[0m’ from a function or sourced script"
+
+#: builtins/set.def:743
+msgid "cannot simultaneously unset a function and a variable"
+msgstr "cannot simultaneously unset a function and a variable"
+
+#: builtins/set.def:780
+#, c-format
+msgid "%s: cannot unset"
+msgstr "%s: cannot unset"
+
+#: builtins/set.def:787
+#, c-format
+msgid "%s: cannot unset: readonly %s"
+msgstr "%s: cannot unset: readonly %s"
+
+#: builtins/set.def:798
+#, c-format
+msgid "%s: not an array variable"
+msgstr "%s: not an array variable"
+
+#: builtins/setattr.def:165
+#, c-format
+msgid "%s: not a function"
+msgstr "%s: not a function"
+
+#: builtins/shift.def:66 builtins/shift.def:72
+msgid "shift count"
+msgstr "shift count"
+
+#: builtins/shopt.def:226
+msgid "cannot set and unset shell options simultaneously"
+msgstr "cannot set and unset shell options simultaneously"
+
+#: builtins/shopt.def:291
+#, c-format
+msgid "%s: invalid shell option name"
+msgstr "%s: invalid shell option name"
+
+#: builtins/source.def:117
+msgid "filename argument required"
+msgstr "filename argument required"
+
+#: builtins/source.def:137
+#, c-format
+msgid "%s: file not found"
+msgstr "%s: file not found"
+
+#: builtins/suspend.def:93
+msgid "cannot suspend"
+msgstr "cannot suspend"
+
+#: builtins/suspend.def:103
+msgid "cannot suspend a login shell"
+msgstr "cannot suspend a login shell"
+
+#: builtins/type.def:231
+#, c-format
+msgid "%s is aliased to `%s'\n"
+msgstr "%s is aliased to ‘\e[1m%s\e[0m’\n"
+
+#: builtins/type.def:252
+#, c-format
+msgid "%s is a shell keyword\n"
+msgstr "%s is a shell keyword\n"
+
+#: builtins/type.def:272
+#, c-format
+msgid "%s is a function\n"
+msgstr "%s is a function\n"
+
+#: builtins/type.def:297
+#, c-format
+msgid "%s is a shell builtin\n"
+msgstr "%s is a shell builtin\n"
+
+#: builtins/type.def:318
+#, c-format
+msgid "%s is %s\n"
+msgstr "%s is %s\n"
+
+#: builtins/type.def:338
+#, c-format
+msgid "%s is hashed (%s)\n"
+msgstr "%s is hashed (%s)\n"
+
+#: builtins/ulimit.def:332
+#, c-format
+msgid "%s: invalid limit argument"
+msgstr "%s: invalid limit argument"
+
+#: builtins/ulimit.def:358
+#, c-format
+msgid "`%c': bad command"
+msgstr "‘\e[1m%c\e[0m’: bad command"
+
+#: builtins/ulimit.def:387
+#, c-format
+msgid "%s: cannot get limit: %s"
+msgstr "%s: cannot get limit: %s"
+
+#: builtins/ulimit.def:425
+#, c-format
+msgid "%s: cannot modify limit: %s"
+msgstr "%s: cannot modify limit: %s"
+
+#: builtins/umask.def:112
+msgid "octal number"
+msgstr "octal number"
+
+#: builtins/umask.def:226
+#, c-format
+msgid "`%c': invalid symbolic mode operator"
+msgstr "‘\e[1m%c\e[0m’: invalid symbolic mode operator"
+
+#: builtins/umask.def:279
+#, c-format
+msgid "`%c': invalid symbolic mode character"
+msgstr "‘\e[1m%c\e[0m’: invalid symbolic mode character"
+
+#: error.c:165
+#, c-format
+msgid "last command: %s\n"
+msgstr "last command: %s\n"
+
+#: error.c:173
+msgid "Aborting..."
+msgstr "Aborting..."
+
+#: error.c:260
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: warning: "
+
+#: error.c:405
+msgid "unknown command error"
+msgstr "unknown command error"
+
+#: error.c:406
+msgid "bad command type"
+msgstr "bad command type"
+
+#: error.c:407
+msgid "bad connector"
+msgstr "bad connector"
+
+#: error.c:408
+msgid "bad jump"
+msgstr "bad jump"
+
+#: error.c:446
+#, c-format
+msgid "%s: unbound variable"
+msgstr "%s: unbound variable"
+
+#: eval.c:175
+msgid "\atimed out waiting for input: auto-logout\n"
+msgstr "\atimed out waiting for input: auto-logout\n"
+
+#: execute_cmd.c:466
+#, c-format
+msgid "cannot redirect standard input from /dev/null: %s"
+msgstr "cannot redirect standard input from /dev/null: %s"
+
+#: execute_cmd.c:1036
+#, c-format
+msgid "TIMEFORMAT: `%c': invalid format character"
+msgstr "TIMEFORMAT: ‘\e[1m%c\e[0m’: invalid format character"
+
+#: execute_cmd.c:3521
+#, c-format
+msgid "%s: restricted: cannot specify `/' in command names"
+msgstr "%s: restricted: cannot specify ‘\e[1m/\e[0m’ in command names"
+
+#: execute_cmd.c:3609
+#, c-format
+msgid "%s: command not found"
+msgstr "%s: command not found"
+
+#: execute_cmd.c:3839
+#, c-format
+msgid "%s: %s: bad interpreter"
+msgstr "%s: %s: bad interpreter"
+
+#: execute_cmd.c:3876
+#, c-format
+msgid "%s: cannot execute binary file"
+msgstr "%s: cannot execute binary file"
+
+#: execute_cmd.c:3988
+#, c-format
+msgid "cannot duplicate fd %d to fd %d"
+msgstr "cannot duplicate fd %d to fd %d"
+
+#: expr.c:239
+msgid "expression recursion level exceeded"
+msgstr "expression recursion level exceeded"
+
+#: expr.c:263
+msgid "recursion stack underflow"
+msgstr "recursion stack underflow"
+
+#: expr.c:374
+msgid "syntax error in expression"
+msgstr "syntax error in expression"
+
+#: expr.c:414
+msgid "attempted assignment to non-variable"
+msgstr "attempted assignment to non-variable"
+
+#: expr.c:435 expr.c:440 expr.c:750
+msgid "division by 0"
+msgstr "division by 0"
+
+#: expr.c:466
+msgid "bug: bad expassign token"
+msgstr "bug: bad expassign token"
+
+#: expr.c:508
+msgid "`:' expected for conditional expression"
+msgstr "‘\e[1m:\e[0m’ expected for conditional expression"
+
+#: expr.c:775
+msgid "exponent less than 0"
+msgstr "exponent less than 0"
+
+#: expr.c:819
+msgid "identifier expected after pre-increment or pre-decrement"
+msgstr "identifier expected after pre-increment or pre-decrement"
+
+#: expr.c:847
+msgid "missing `)'"
+msgstr "missing ‘\e[1m)\e[0m’"
+
+#: expr.c:871
+msgid "syntax error: operand expected"
+msgstr "syntax error: operand expected"
+
+#: expr.c:1146
+msgid "invalid number"
+msgstr "invalid number"
+
+#: expr.c:1150
+msgid "invalid arithmetic base"
+msgstr "invalid arithmetic base"
+
+#: expr.c:1170
+msgid "value too great for base"
+msgstr "value too great for base"
+
+#: general.c:60
+msgid "getcwd: cannot access parent directories"
+msgstr "getcwd: cannot access parent directories"
+
+#: input.c:231
+#, c-format
+msgid "cannot allocate new file descriptor for bash input from fd %d"
+msgstr "cannot allocate new file descriptor for bash input from fd %d"
+
+#: input.c:239
+#, c-format
+msgid "save_bash_input: buffer already exists for new fd %d"
+msgstr "save_bash_input: buffer already exists for new fd %d"
+
+#: jobs.c:693
+#, c-format
+msgid "deleting stopped job %d with process group %ld"
+msgstr "deleting stopped job %d with process group %ld"
+
+#: jobs.c:1001
+#, c-format
+msgid "describe_pid: %ld: no such pid"
+msgstr "describe_pid: %ld: no such pid"
+
+#: jobs.c:1632 nojobs.c:648
+#, c-format
+msgid "wait: pid %ld is not a child of this shell"
+msgstr "wait: pid %ld is not a child of this shell"
+
+#: jobs.c:1815
+#, c-format
+msgid "wait_for: No record of process %ld"
+msgstr "wait_for: No record of process %ld"
+
+#: jobs.c:2062
+#, c-format
+msgid "wait_for_job: job %d is stopped"
+msgstr "wait_for_job: job %d is stopped"
+
+#: jobs.c:2284
+#, c-format
+msgid "%s: job has terminated"
+msgstr "%s: job has terminated"
+
+#: jobs.c:2293
+#, c-format
+msgid "%s: job %d already in background"
+msgstr "%s: job %d already in background"
+
+#: jobs.c:3037
+msgid "no job control in this shell"
+msgstr "no job control in this shell"
+
+#: lib/malloc/malloc.c:298
+#, c-format
+msgid "malloc: failed assertion: %s\n"
+msgstr "malloc: failed assertion: %s\n"
+
+#: lib/malloc/malloc.c:314
+#, c-format
+msgid ""
+"\r\n"
+"malloc: %s:%d: assertion botched\r\n"
+msgstr ""
+"\r\n"
+"malloc: %s:%d: assertion botched\r\n"
+
+#: lib/malloc/malloc.c:740
+msgid "malloc: block on free list clobbered"
+msgstr "malloc: block on free list clobbered"
+
+#: lib/malloc/malloc.c:817
+msgid "free: called with already freed block argument"
+msgstr "free: called with already freed block argument"
+
+#: lib/malloc/malloc.c:820
+msgid "free: called with unallocated block argument"
+msgstr "free: called with unallocated block argument"
+
+#: lib/malloc/malloc.c:839
+msgid "free: underflow detected; mh_nbytes out of range"
+msgstr "free: underflow detected; mh_nbytes out of range"
+
+#: lib/malloc/malloc.c:845
+msgid "free: start and end chunk sizes differ"
+msgstr "free: start and end chunk sizes differ"
+
+#: lib/malloc/malloc.c:942
+msgid "realloc: called with unallocated block argument"
+msgstr "realloc: called with unallocated block argument"
+
+#: lib/malloc/malloc.c:957
+msgid "realloc: underflow detected; mh_nbytes out of range"
+msgstr "realloc: underflow detected; mh_nbytes out of range"
+
+#: lib/malloc/malloc.c:963
+msgid "realloc: start and end chunk sizes differ"
+msgstr "realloc: start and end chunk sizes differ"
+
+#: lib/malloc/table.c:175
+msgid "register_alloc: alloc table is full with FIND_ALLOC?\n"
+msgstr "register_alloc: alloc table is full with FIND_ALLOC?\n"
+
+#: lib/malloc/table.c:182
+#, c-format
+msgid "register_alloc: %p already in table as allocated?\n"
+msgstr "register_alloc: %p already in table as allocated?\n"
+
+#: lib/malloc/table.c:218
+#, c-format
+msgid "register_free: %p already in table as free?\n"
+msgstr "register_free: %p already in table as free?\n"
+
+#: lib/malloc/watch.c:46
+msgid "allocated"
+msgstr "allocated"
+
+#: lib/malloc/watch.c:48
+msgid "freed"
+msgstr "freed"
+
+#: lib/malloc/watch.c:50
+msgid "requesting resize"
+msgstr "requesting resize"
+
+#: lib/malloc/watch.c:52
+msgid "just resized"
+msgstr "just resized"
+
+#: lib/malloc/watch.c:54
+msgid "bug: unknown operation"
+msgstr "bug: unknown operation"
+
+#: lib/malloc/watch.c:56
+#, c-format
+msgid "malloc: watch alert: %p %s "
+msgstr "malloc: watch alert: %p %s "
+
+#: lib/sh/fmtulong.c:101
+msgid "invalid base"
+msgstr "invalid base"
+
+#: lib/sh/netopen.c:158
+#, c-format
+msgid "%s: host unknown"
+msgstr "%s: host unknown"
+
+#: lib/sh/netopen.c:165
+#, c-format
+msgid "%s: invalid service"
+msgstr "%s: invalid service"
+
+#: lib/sh/netopen.c:296
+#, c-format
+msgid "%s: bad network path specification"
+msgstr "%s: bad network path specification"
+
+#: lib/sh/netopen.c:336
+msgid "network operations not supported"
+msgstr "network operations not supported"
+
+#: mailcheck.c:382
+msgid "You have mail in $_"
+msgstr "You have mail in $_"
+
+#: mailcheck.c:407
+msgid "You have new mail in $_"
+msgstr "You have new mail in $_"
+
+#: mailcheck.c:423
+#, c-format
+msgid "The mail in %s has been read\n"
+msgstr "The mail in %s has been read\n"
+
+#: make_cmd.c:318
+msgid "syntax error: arithmetic expression required"
+msgstr "syntax error: arithmetic expression required"
+
+#: make_cmd.c:320
+msgid "syntax error: `;' unexpected"
+msgstr "syntax error: ‘\e[1m;\e[0m’ unexpected"
+
+#: make_cmd.c:321
+#, c-format
+msgid "syntax error: `((%s))'"
+msgstr "syntax error: ‘\e[1m((%s))\e[0m’"
+
+#: make_cmd.c:560
+#, c-format
+msgid "make_here_document: bad instruction type %d"
+msgstr "make_here_document: bad instruction type %d"
+
+#: make_cmd.c:730
+#, c-format
+msgid "make_redirection: redirection instruction `%d' out of range"
+msgstr "make_redirection: redirection instruction ‘\e[1m%d\e[0m’ out of range"
+
+#: parse.y:2726
+#, c-format
+msgid "unexpected EOF while looking for matching `%c'"
+msgstr "unexpected EOF while looking for matching ‘\e[1m%c\e[0m’"
+
+#: parse.y:3011
+msgid "unexpected EOF while looking for `]]'"
+msgstr "unexpected EOF while looking for ‘\e[1m]]\e[0m’"
+
+#: parse.y:3016
+#, c-format
+msgid "syntax error in conditional expression: unexpected token `%s'"
+msgstr "syntax error in conditional expression: unexpected token ‘\e[1m%s\e[0m’"
+
+#: parse.y:3020
+msgid "syntax error in conditional expression"
+msgstr "syntax error in conditional expression"
+
+#: parse.y:3098
+#, c-format
+msgid "unexpected token `%s', expected `)'"
+msgstr "unexpected token ‘\e[1m%s\e[0m’, expected ‘\e[1m)\e[0m’"
+
+#: parse.y:3102
+msgid "expected `)'"
+msgstr "expected ‘\e[1m)\e[0m’"
+
+#: parse.y:3130
+#, c-format
+msgid "unexpected argument `%s' to conditional unary operator"
+msgstr "unexpected argument ‘\e[1m%s\e[0m’ to conditional unary operator"
+
+#: parse.y:3134
+msgid "unexpected argument to conditional unary operator"
+msgstr "unexpected argument to conditional unary operator"
+
+#: parse.y:3171
+#, c-format
+msgid "unexpected token `%s', conditional binary operator expected"
+msgstr "unexpected token ‘\e[1m%s\e[0m’, conditional binary operator expected"
+
+#: parse.y:3175
+msgid "conditional binary operator expected"
+msgstr "conditional binary operator expected"
+
+#: parse.y:3191
+#, c-format
+msgid "unexpected argument `%s' to conditional binary operator"
+msgstr "unexpected argument ‘\e[1m%s\e[0m’ to conditional binary operator"
+
+#: parse.y:3195
+msgid "unexpected argument to conditional binary operator"
+msgstr "unexpected argument to conditional binary operator"
+
+#: parse.y:3206
+#, c-format
+msgid "unexpected token `%c' in conditional command"
+msgstr "unexpected token ‘\e[1m%c\e[0m’ in conditional command"
+
+#: parse.y:3209
+#, c-format
+msgid "unexpected token `%s' in conditional command"
+msgstr "unexpected token ‘\e[1m%s\e[0m’ in conditional command"
+
+#: parse.y:3213
+#, c-format
+msgid "unexpected token %d in conditional command"
+msgstr "unexpected token %d in conditional command"
+
+#: parse.y:4400
+#, c-format
+msgid "syntax error near unexpected token `%s'"
+msgstr "syntax error near unexpected token ‘\e[1m%s\e[0m’"
+
+#: parse.y:4418
+#, c-format
+msgid "syntax error near `%s'"
+msgstr "syntax error near ‘\e[1m%s\e[0m’"
+
+#: parse.y:4428
+msgid "syntax error: unexpected end of file"
+msgstr "syntax error: unexpected end of file"
+
+#: parse.y:4428
+msgid "syntax error"
+msgstr "syntax error"
+
+#: parse.y:4490
+#, c-format
+msgid "Use \"%s\" to leave the shell.\n"
+msgstr "Use “\e[1m%s\e[0m” to leave the shell.\n"
+
+#: parse.y:4649
+msgid "unexpected EOF while looking for matching `)'"
+msgstr "unexpected EOF while looking for matching ‘\e[1m)\e[0m’"
+
+#: pcomplete.c:988
+#, c-format
+msgid "completion: function `%s' not found"
+msgstr "completion: function ‘\e[1m%s\e[0m’ not found"
+
+#: pcomplib.c:179
+#, c-format
+msgid "progcomp_insert: %s: NULL COMPSPEC"
+msgstr "progcomp_insert: %s: NULL COMPSPEC"
+
+#: print_cmd.c:260
+#, c-format
+msgid "print_command: bad connector `%d'"
+msgstr "print_command: bad connector ‘\e[1m%d\e[0m’"
+
+#: print_cmd.c:1172
+#, c-format
+msgid "cprintf: `%c': invalid format character"
+msgstr "cprintf: ‘\e[1m%c\e[0m’: invalid format character"
+
+#: redir.c:99
+msgid "file descriptor out of range"
+msgstr "file descriptor out of range"
+
+#: redir.c:141
+#, c-format
+msgid "%s: ambiguous redirect"
+msgstr "%s: ambiguous redirect"
+
+#: redir.c:145
+#, c-format
+msgid "%s: cannot overwrite existing file"
+msgstr "%s: cannot overwrite existing file"
+
+#: redir.c:150
+#, c-format
+msgid "%s: restricted: cannot redirect output"
+msgstr "%s: restricted: cannot redirect output"
+
+#: redir.c:155
+#, c-format
+msgid "cannot create temp file for here document: %s"
+msgstr "cannot create temp file for here document: %s"
+
+#: redir.c:509
+msgid "/dev/(tcp|udp)/host/port not supported without networking"
+msgstr "/dev/(tcp|udp)/host/port not supported without networking"
+
+#: redir.c:949
+msgid "redirection error: cannot duplicate fd"
+msgstr "redirection error: cannot duplicate fd"
+
+#: shell.c:302
+msgid "could not find /tmp, please create!"
+msgstr "could not find /tmp, please create!"
+
+#: shell.c:306
+msgid "/tmp must be a valid directory name"
+msgstr "/tmp must be a valid directory name"
+
+#: shell.c:839
+#, c-format
+msgid "%c%c: invalid option"
+msgstr "%c%c: invalid option"
+
+#: shell.c:1590
+msgid "I have no name!"
+msgstr "I have no name!"
+
+#: shell.c:1725
+#, c-format
+msgid ""
+"Usage:\t%s [GNU long option] [option] ...\n"
+"\t%s [GNU long option] [option] script-file ...\n"
+msgstr ""
+"Usage:\t%s [GNU long option] [option] ...\n"
+"\t%s [GNU long option] [option] script-file ...\n"
+
+#: shell.c:1727
+msgid "GNU long options:\n"
+msgstr "GNU long options:\n"
+
+#: shell.c:1731
+msgid "Shell options:\n"
+msgstr "Shell options:\n"
+
+#: shell.c:1732
+msgid "\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n"
+msgstr "\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n"
+
+#: shell.c:1747
+#, c-format
+msgid "\t-%s or -o option\n"
+msgstr "\t-%s or -o option\n"
+
+#: shell.c:1753
+#, c-format
+msgid "Type `%s -c \"help set\"' for more information about shell options.\n"
+msgstr ""
+"Type ‘\e[1m%s -c “\e[1mhelp set\e[0m”\e[0m’ for more information about shell "
+"options.\n"
+
+#: shell.c:1754
+#, c-format
+msgid "Type `%s -c help' for more information about shell builtin commands.\n"
+msgstr ""
+"Type ‘\e[1m%s -c help\e[0m’ for more information about shell builtin commands.\n"
+
+#: shell.c:1755
+msgid "Use the `bashbug' command to report bugs.\n"
+msgstr "Use the ‘\e[1mbashbug\e[0m’ command to report bugs.\n"
+
+#: sig.c:485
+#, c-format
+msgid "sigprocmask: %d: invalid operation"
+msgstr "sigprocmask: %d: invalid operation"
+
+#: subst.c:1011
+#, c-format
+msgid "bad substitution: no closing `%s' in %s"
+msgstr "bad substitution: no closing ‘\e[1m%s\e[0m’ in %s"
+
+#: subst.c:2020
+#, c-format
+msgid "%s: cannot assign list to array member"
+msgstr "%s: cannot assign list to array member"
+
+#: subst.c:3516 subst.c:3532
+msgid "cannot make pipe for process substitution"
+msgstr "cannot make pipe for process substitution"
+
+#: subst.c:3563
+msgid "cannot make child for process substitution"
+msgstr "cannot make child for process substitution"
+
+#: subst.c:3608
+#, c-format
+msgid "cannot open named pipe %s for reading"
+msgstr "cannot open named pipe %s for reading"
+
+#: subst.c:3610
+#, c-format
+msgid "cannot open named pipe %s for writing"
+msgstr "cannot open named pipe %s for writing"
+
+#: subst.c:3618
+#, c-format
+msgid "cannout reset nodelay mode for fd %d"
+msgstr "cannout reset nodelay mode for fd %d"
+
+#: subst.c:3628
+#, c-format
+msgid "cannot duplicate named pipe %s as fd %d"
+msgstr "cannot duplicate named pipe %s as fd %d"
+
+#: subst.c:3803
+msgid "cannot make pipe for command substitution"
+msgstr "cannot make pipe for command substitution"
+
+#: subst.c:3832
+msgid "cannot make child for command substitution"
+msgstr "cannot make child for command substitution"
+
+#: subst.c:3849
+msgid "command_substitute: cannot duplicate pipe as fd 1"
+msgstr "command_substitute: cannot duplicate pipe as fd 1"
+
+#: subst.c:4284
+#, c-format
+msgid "%s: parameter null or not set"
+msgstr "%s: parameter null or not set"
+
+#: subst.c:4529
+#, c-format
+msgid "%s: substring expression < 0"
+msgstr "%s: substring expression < 0"
+
+#: subst.c:5209
+#, c-format
+msgid "%s: bad substitution"
+msgstr "%s: bad substitution"
+
+#: subst.c:5283
+#, c-format
+msgid "$%s: cannot assign in this way"
+msgstr "$%s: cannot assign in this way"
+
+#: subst.c:6652
+#, c-format
+msgid "no match: %s"
+msgstr "no match: %s"
+
+#: test.c:154
+msgid "argument expected"
+msgstr "argument expected"
+
+#: test.c:163
+#, c-format
+msgid "%s: integer expression expected"
+msgstr "%s: integer expression expected"
+
+#: test.c:361
+msgid "`)' expected"
+msgstr "‘\e[1m)\e[0m’ expected"
+
+#: test.c:363
+#, c-format
+msgid "`)' expected, found %s"
+msgstr "‘\e[1m)\e[0m’ expected, found %s"
+
+#: test.c:378 test.c:787 test.c:790
+#, c-format
+msgid "%s: unary operator expected"
+msgstr "%s: unary operator expected"
+
+#: test.c:543 test.c:830
+#, c-format
+msgid "%s: binary operator expected"
+msgstr "%s: binary operator expected"
+
+#: test.c:905
+msgid "missing `]'"
+msgstr "missing ‘\e[1m]\e[0m’"
+
+#: trap.c:194
+msgid "invalid signal number"
+msgstr "invalid signal number"
+
+#: trap.c:309
+#, c-format
+msgid "run_pending_traps: bad value in trap_list[%d]: %p"
+msgstr "run_pending_traps: bad value in trap_list[%d]: %p"
+
+#: trap.c:313
+#, c-format
+msgid ""
+"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+msgstr ""
+"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+
+#: trap.c:349
+#, c-format
+msgid "trap_handler: bad signal %d"
+msgstr "trap_handler: bad signal %d"
+
+#: variables.c:310
+#, c-format
+msgid "error importing function definition for `%s'"
+msgstr "error importing function definition for ‘\e[1m%s\e[0m’"
+
+#: variables.c:670
+#, c-format
+msgid "shell level (%d) too high, resetting to 1"
+msgstr "shell level (%d) too high, resetting to 1"
+
+#: variables.c:1610
+msgid "make_local_variable: no function context at current scope"
+msgstr "make_local_variable: no function context at current scope"
+
+#: variables.c:2709
+msgid "all_local_variables: no function context at current scope"
+msgstr "all_local_variables: no function context at current scope"
+
+#: variables.c:2923 variables.c:2932
+#, c-format
+msgid "invalid character %d in exportstr for %s"
+msgstr "invalid character %d in exportstr for %s"
+
+#: variables.c:2938
+#, c-format
+msgid "no `=' in exportstr for %s"
+msgstr "no ‘\e[1m=\e[0m’ in exportstr for %s"
+
+#: variables.c:3363
+msgid "pop_var_context: head of shell_variables not a function context"
+msgstr "pop_var_context: head of shell_variables not a function context"
+
+#: variables.c:3376
+msgid "pop_var_context: no global_variables context"
+msgstr "pop_var_context: no global_variables context"
+
+#: variables.c:3442
+msgid "pop_scope: head of shell_variables not a temporary environment scope"
+msgstr "pop_scope: head of shell_variables not a temporary environment scope"
+
+#: version.c:82
+msgid "Copyright (C) 2004 Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) 2004 Free Software Foundation, Inc.\n"
+
+#: xmalloc.c:93
+#, c-format
+msgid "xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"
+msgstr "xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"
+
+#: xmalloc.c:95
+#, c-format
+msgid "xmalloc: cannot allocate %lu bytes"
+msgstr "xmalloc: cannot allocate %lu bytes"
+
+#: xmalloc.c:115
+#, c-format
+msgid "xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"
+msgstr "xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"
+
+#: xmalloc.c:117
+#, c-format
+msgid "xrealloc: cannot allocate %lu bytes"
+msgstr "xrealloc: cannot allocate %lu bytes"
+
+#: xmalloc.c:151
+#, c-format
+msgid "xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"
+msgstr "xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"
+
+#: xmalloc.c:153
+#, c-format
+msgid "xmalloc: %s:%d: cannot allocate %lu bytes"
+msgstr "xmalloc: %s:%d: cannot allocate %lu bytes"
+
+#: xmalloc.c:175
+#, c-format
+msgid "xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)"
+msgstr "xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)"
+
+#: xmalloc.c:177
+#, c-format
+msgid "xrealloc: %s:%d: cannot allocate %lu bytes"
+msgstr "xrealloc: %s:%d: cannot allocate %lu bytes"
+
+#: builtins.c:244
+msgid "`alias' with no arguments or with the -p option prints the list"
+msgstr "‘\e[1malias\e[0m’ with no arguments or with the -p option prints the list"
+
+#: builtins.c:245
+msgid "of aliases in the form alias NAME=VALUE on standard output."
+msgstr "of aliases in the form alias NAME=VALUE on standard output."
+
+#: builtins.c:246
+msgid "Otherwise, an alias is defined for each NAME whose VALUE is given."
+msgstr "Otherwise, an alias is defined for each NAME whose VALUE is given."
+
+#: builtins.c:247
+msgid "A trailing space in VALUE causes the next word to be checked for"
+msgstr "A trailing space in VALUE causes the next word to be checked for"
+
+#: builtins.c:248
+msgid "alias substitution when the alias is expanded.  Alias returns"
+msgstr "alias substitution when the alias is expanded.  Alias returns"
+
+#: builtins.c:249
+msgid "true unless a NAME is given for which no alias has been defined."
+msgstr "true unless a NAME is given for which no alias has been defined."
+
+#: builtins.c:257
+msgid ""
+"Remove NAMEs from the list of defined aliases.  If the -a option is given,"
+msgstr ""
+"Remove NAMEs from the list of defined aliases.  If the -a option is given,"
+
+#: builtins.c:258
+msgid "then remove all alias definitions."
+msgstr "then remove all alias definitions."
+
+#: builtins.c:266
+msgid "Bind a key sequence to a Readline function or a macro, or set"
+msgstr "Bind a key sequence to a Readline function or a macro, or set"
+
+#: builtins.c:267
+msgid "a Readline variable.  The non-option argument syntax is equivalent"
+msgstr "a Readline variable.  The non-option argument syntax is equivalent"
+
+#: builtins.c:268
+msgid "to that found in ~/.inputrc, but must be passed as a single argument:"
+msgstr "to that found in ~/.inputrc, but must be passed as a single argument:"
+
+#: builtins.c:269
+msgid "bind '\"\\C-x\\C-r\": re-read-init-file'."
+msgstr "bind '“\e[1m\\C-x\\C-r\e[0m”: re-read-init-file'."
+
+#: builtins.c:270
+msgid "bind accepts the following options:"
+msgstr "bind accepts the following options:"
+
+#: builtins.c:271
+msgid ""
+"  -m  keymap         Use `keymap' as the keymap for the duration of this"
+msgstr ""
+"  -m  keymap         Use ‘\e[1mkeymap\e[0m’ as the keymap for the duration of "
+"this"
+
+#: builtins.c:272
+msgid "                     command.  Acceptable keymap names are emacs,"
+msgstr "                     command.  Acceptable keymap names are emacs,"
+
+#: builtins.c:273
+msgid ""
+"                     emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,"
+msgstr ""
+"                     emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,"
+
+#: builtins.c:274
+msgid "                     vi-command, and vi-insert."
+msgstr "                     vi-command, and vi-insert."
+
+#: builtins.c:275
+msgid "  -l                 List names of functions."
+msgstr "  -l                 List names of functions."
+
+#: builtins.c:276
+msgid "  -P                 List function names and bindings."
+msgstr "  -P                 List function names and bindings."
+
+#: builtins.c:277
+msgid "  -p                 List functions and bindings in a form that can be"
+msgstr "  -p                 List functions and bindings in a form that can be"
+
+#: builtins.c:278
+msgid "                     reused as input."
+msgstr "                     reused as input."
+
+#: builtins.c:279
+msgid "  -r  keyseq         Remove the binding for KEYSEQ."
+msgstr "  -r  keyseq         Remove the binding for KEYSEQ."
+
+#: builtins.c:280
+msgid "  -x  keyseq:shell-command\tCause SHELL-COMMAND to be executed when"
+msgstr "  -x  keyseq:shell-command\tCause SHELL-COMMAND to be executed when"
+
+#: builtins.c:281
+msgid "\t\t\t\tKEYSEQ is entered."
+msgstr "\t\t\t\tKEYSEQ is entered."
+
+#: builtins.c:282
+msgid "  -f  filename       Read key bindings from FILENAME."
+msgstr "  -f  filename       Read key bindings from FILENAME."
+
+#: builtins.c:283
+msgid "  -q  function-name  Query about which keys invoke the named function."
+msgstr "  -q  function-name  Query about which keys invoke the named function."
+
+#: builtins.c:284
+msgid ""
+"  -u  function-name  Unbind all keys which are bound to the named function."
+msgstr ""
+"  -u  function-name  Unbind all keys which are bound to the named function."
+
+#: builtins.c:285
+msgid "  -V                 List variable names and values"
+msgstr "  -V                 List variable names and values"
+
+#: builtins.c:286
+msgid "  -v                 List variable names and values in a form that can"
+msgstr "  -v                 List variable names and values in a form that can"
+
+#: builtins.c:287
+msgid "                     be reused as input."
+msgstr "                     be reused as input."
+
+#: builtins.c:288
+msgid ""
+"  -S                 List key sequences that invoke macros and their values"
+msgstr ""
+"  -S                 List key sequences that invoke macros and their values"
+
+#: builtins.c:289
+msgid ""
+"  -s                 List key sequences that invoke macros and their values"
+msgstr ""
+"  -s                 List key sequences that invoke macros and their values"
+
+#: builtins.c:290
+msgid "                     in a form that can be reused as input."
+msgstr "                     in a form that can be reused as input."
+
+#: builtins.c:297
+msgid "Exit from within a FOR, WHILE or UNTIL loop.  If N is specified,"
+msgstr "Exit from within a FOR, WHILE or UNTIL loop.  If N is specified,"
+
+#: builtins.c:298
+msgid "break N levels."
+msgstr "break N levels."
+
+#: builtins.c:304
+msgid "Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop."
+msgstr "Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop."
+
+#: builtins.c:305
+msgid "If N is specified, resume at the N-th enclosing loop."
+msgstr "If N is specified, resume at the N-th enclosing loop."
+
+#: builtins.c:311
+msgid "Run a shell builtin.  This is useful when you wish to rename a"
+msgstr "Run a shell builtin.  This is useful when you wish to rename a"
+
+#: builtins.c:312
+msgid "shell builtin to be a function, but need the functionality of the"
+msgstr "shell builtin to be a function, but need the functionality of the"
+
+#: builtins.c:313
+msgid "builtin within the function itself."
+msgstr "builtin within the function itself."
+
+#: builtins.c:334
+msgid "Change the current directory to DIR.  The variable $HOME is the"
+msgstr "Change the current directory to DIR.  The variable $HOME is the"
+
+#: builtins.c:335
+msgid "default DIR.  The variable CDPATH defines the search path for"
+msgstr "default DIR.  The variable CDPATH defines the search path for"
+
+#: builtins.c:336
+msgid "the directory containing DIR.  Alternative directory names in CDPATH"
+msgstr "the directory containing DIR.  Alternative directory names in CDPATH"
+
+#: builtins.c:337
+msgid "are separated by a colon (:).  A null directory name is the same as"
+msgstr "are separated by a colon (:).  A null directory name is the same as"
+
+#: builtins.c:338
+msgid "the current directory, i.e. `.'.  If DIR begins with a slash (/),"
+msgstr ""
+"the current directory, i.e. ‘\e[1m.\e[0m’.  If DIR begins with a slash (/),"
+
+#: builtins.c:339
+msgid "then CDPATH is not used.  If the directory is not found, and the"
+msgstr "then CDPATH is not used.  If the directory is not found, and the"
+
+#: builtins.c:340
+msgid "shell option `cdable_vars' is set, then try the word as a variable"
+msgstr ""
+"shell option ‘\e[1mcdable_vars\e[0m’ is set, then try the word as a variable"
+
+#: builtins.c:341
+msgid "name.  If that variable has a value, then cd to the value of that"
+msgstr "name.  If that variable has a value, then cd to the value of that"
+
+#: builtins.c:342
+msgid "variable.  The -P option says to use the physical directory structure"
+msgstr "variable.  The -P option says to use the physical directory structure"
+
+#: builtins.c:343
+msgid ""
+"instead of following symbolic links; the -L option forces symbolic links"
+msgstr ""
+"instead of following symbolic links; the -L option forces symbolic links"
+
+#: builtins.c:344
+msgid "to be followed."
+msgstr "to be followed."
+
+#: builtins.c:350
+msgid "Print the current working directory.  With the -P option, pwd prints"
+msgstr "Print the current working directory.  With the -P option, pwd prints"
+
+#: builtins.c:351
+msgid "the physical directory, without any symbolic links; the -L option"
+msgstr "the physical directory, without any symbolic links; the -L option"
+
+#: builtins.c:352
+msgid "makes pwd follow symbolic links."
+msgstr "makes pwd follow symbolic links."
+
+#: builtins.c:358
+msgid "No effect; the command does nothing.  A zero exit code is returned."
+msgstr "No effect; the command does nothing.  A zero exit code is returned."
+
+#: builtins.c:364
+msgid "Return a successful result."
+msgstr "Return a successful result."
+
+#: builtins.c:370
+msgid "Return an unsuccessful result."
+msgstr "Return an unsuccessful result."
+
+#: builtins.c:376
+msgid "Runs COMMAND with ARGS ignoring shell functions.  If you have a shell"
+msgstr "Runs COMMAND with ARGS ignoring shell functions.  If you have a shell"
+
+#: builtins.c:377
+msgid "function called `ls', and you wish to call the command `ls', you can"
+msgstr ""
+"function called ‘\e[1mls\e[0m’, and you wish to call the command ‘\e[1mls\e[0m’, you "
+"can"
+
+#: builtins.c:378
+msgid "say \"command ls\".  If the -p option is given, a default value is used"
+msgstr ""
+"say “\e[1mcommand ls\e[0m”.  If the -p option is given, a default value is used"
+
+#: builtins.c:379
+msgid "for PATH that is guaranteed to find all of the standard utilities.  If"
+msgstr "for PATH that is guaranteed to find all of the standard utilities.  If"
+
+#: builtins.c:380
+msgid "the -V or -v option is given, a string is printed describing COMMAND."
+msgstr "the -V or -v option is given, a string is printed describing COMMAND."
+
+#: builtins.c:381
+msgid "The -V option produces a more verbose description."
+msgstr "The -V option produces a more verbose description."
+
+#: builtins.c:387
+msgid "Declare variables and/or give them attributes.  If no NAMEs are"
+msgstr "Declare variables and/or give them attributes.  If no NAMEs are"
+
+#: builtins.c:388
+msgid "given, then display the values of variables instead.  The -p option"
+msgstr "given, then display the values of variables instead.  The -p option"
+
+#: builtins.c:389
+msgid "will display the attributes and values of each NAME."
+msgstr "will display the attributes and values of each NAME."
+
+#: builtins.c:391
+msgid "The flags are:"
+msgstr "The flags are:"
+
+#: builtins.c:393
+msgid "  -a\tto make NAMEs arrays (if supported)"
+msgstr "  -a\tto make NAMEs arrays (if supported)"
+
+#: builtins.c:394
+msgid "  -f\tto select from among function names only"
+msgstr "  -f\tto select from among function names only"
+
+#: builtins.c:395
+msgid ""
+"  -F\tto display function names (and line number and source file name if"
+msgstr ""
+"  -F\tto display function names (and line number and source file name if"
+
+#: builtins.c:396
+msgid "\tdebugging) without definitions"
+msgstr "\tdebugging) without definitions"
+
+#: builtins.c:397
+msgid "  -i\tto make NAMEs have the `integer' attribute"
+msgstr "  -i\tto make NAMEs have the ‘\e[1minteger\e[0m’ attribute"
+
+#: builtins.c:398
+msgid "  -r\tto make NAMEs readonly"
+msgstr "  -r\tto make NAMEs readonly"
+
+#: builtins.c:399
+msgid "  -t\tto make NAMEs have the `trace' attribute"
+msgstr "  -t\tto make NAMEs have the ‘\e[1mtrace\e[0m’ attribute"
+
+#: builtins.c:400
+msgid "  -x\tto make NAMEs export"
+msgstr "  -x\tto make NAMEs export"
+
+#: builtins.c:402
+msgid "Variables with the integer attribute have arithmetic evaluation (see"
+msgstr "Variables with the integer attribute have arithmetic evaluation (see"
+
+#: builtins.c:403
+msgid "`let') done when the variable is assigned to."
+msgstr "‘\e[1mlet\e[0m’) done when the variable is assigned to."
+
+#: builtins.c:405
+msgid "When displaying values of variables, -f displays a function's name"
+msgstr "When displaying values of variables, -f displays a function's name"
+
+#: builtins.c:406
+msgid "and definition.  The -F option restricts the display to function"
+msgstr "and definition.  The -F option restricts the display to function"
+
+#: builtins.c:407
+msgid "name only."
+msgstr "name only."
+
+#: builtins.c:409
+msgid "Using `+' instead of `-' turns off the given attribute instead.  When"
+msgstr ""
+"Using ‘\e[1m+\e[0m’ instead of ‘\e[1m-\e[0m’ turns off the given attribute instead.  "
+"When"
+
+#: builtins.c:410
+msgid "used in a function, makes NAMEs local, as with the `local' command."
+msgstr ""
+"used in a function, makes NAMEs local, as with the ‘\e[1mlocal\e[0m’ command."
+
+#: builtins.c:416
+msgid "Obsolete.  See `declare'."
+msgstr "Obsolete.  See ‘\e[1mdeclare\e[0m’."
+
+#: builtins.c:422
+msgid "Create a local variable called NAME, and give it VALUE.  LOCAL"
+msgstr "Create a local variable called NAME, and give it VALUE.  LOCAL"
+
+#: builtins.c:423
+msgid "can only be used within a function; it makes the variable NAME"
+msgstr "can only be used within a function; it makes the variable NAME"
+
+#: builtins.c:424
+msgid "have a visible scope restricted to that function and its children."
+msgstr "have a visible scope restricted to that function and its children."
+
+#: builtins.c:431
+msgid "Output the ARGs.  If -n is specified, the trailing newline is"
+msgstr "Output the ARGs.  If -n is specified, the trailing newline is"
+
+#: builtins.c:432
+msgid "suppressed.  If the -e option is given, interpretation of the"
+msgstr "suppressed.  If the -e option is given, interpretation of the"
+
+#: builtins.c:433
+msgid "following backslash-escaped characters is turned on:"
+msgstr "following backslash-escaped characters is turned on:"
+
+#: builtins.c:434
+msgid "\t\\a\talert (bell)"
+msgstr "\t\\a\talert (bell)"
+
+#: builtins.c:435
+msgid "\t\\b\tbackspace"
+msgstr "\t\\b\tbackspace"
+
+#: builtins.c:436
+msgid "\t\\c\tsuppress trailing newline"
+msgstr "\t\\c\tsuppress trailing newline"
+
+#: builtins.c:437
+msgid "\t\\E\tescape character"
+msgstr "\t\\E\tescape character"
+
+#: builtins.c:438
+msgid "\t\\f\tform feed"
+msgstr "\t\\f\tform feed"
+
+#: builtins.c:439
+msgid "\t\\n\tnew line"
+msgstr "\t\\n\tnew line"
+
+#: builtins.c:440
+msgid "\t\\r\tcarriage return"
+msgstr "\t\\r\tcarriage return"
+
+#: builtins.c:441
+msgid "\t\\t\thorizontal tab"
+msgstr "\t\\t\thorizontal tab"
+
+#: builtins.c:442
+msgid "\t\\v\tvertical tab"
+msgstr "\t\\v\tvertical tab"
+
+#: builtins.c:443
+msgid "\t\\\\\tbackslash"
+msgstr "\t\\\\\tbackslash"
+
+#: builtins.c:444
+msgid "\t\\num\tthe character whose ASCII code is NUM (octal)."
+msgstr "\t\\num\tthe character whose ASCII code is NUM (octal)."
+
+#: builtins.c:446
+msgid "You can explicitly turn off the interpretation of the above characters"
+msgstr "You can explicitly turn off the interpretation of the above characters"
+
+#: builtins.c:447
+msgid "with the -E option."
+msgstr "with the -E option."
+
+#: builtins.c:455
+msgid ""
+"Output the ARGs.  If -n is specified, the trailing newline is suppressed."
+msgstr ""
+"Output the ARGs.  If -n is specified, the trailing newline is suppressed."
+
+#: builtins.c:462
+msgid "Enable and disable builtin shell commands.  This allows"
+msgstr "Enable and disable builtin shell commands.  This allows"
+
+#: builtins.c:463
+msgid "you to use a disk command which has the same name as a shell"
+msgstr "you to use a disk command which has the same name as a shell"
+
+#: builtins.c:464
+msgid "builtin without specifying a full pathname.  If -n is used, the"
+msgstr "builtin without specifying a full pathname.  If -n is used, the"
+
+#: builtins.c:465
+msgid "NAMEs become disabled; otherwise NAMEs are enabled.  For example,"
+msgstr "NAMEs become disabled; otherwise NAMEs are enabled.  For example,"
+
+#: builtins.c:466
+msgid "to use the `test' found in $PATH instead of the shell builtin"
+msgstr "to use the ‘\e[1mtest\e[0m’ found in $PATH instead of the shell builtin"
+
+#: builtins.c:467
+msgid "version, type `enable -n test'.  On systems supporting dynamic"
+msgstr "version, type ‘\e[1menable -n test\e[0m’.  On systems supporting dynamic"
+
+#: builtins.c:468
+msgid "loading, the -f option may be used to load new builtins from the"
+msgstr "loading, the -f option may be used to load new builtins from the"
+
+#: builtins.c:469
+msgid "shared object FILENAME.  The -d option will delete a builtin"
+msgstr "shared object FILENAME.  The -d option will delete a builtin"
+
+#: builtins.c:470
+msgid "previously loaded with -f.  If no non-option names are given, or"
+msgstr "previously loaded with -f.  If no non-option names are given, or"
+
+#: builtins.c:471
+msgid "the -p option is supplied, a list of builtins is printed.  The"
+msgstr "the -p option is supplied, a list of builtins is printed.  The"
+
+#: builtins.c:472
+msgid "-a option means to print every builtin with an indication of whether"
+msgstr "-a option means to print every builtin with an indication of whether"
+
+#: builtins.c:473
+msgid ""
+"or not it is enabled.  The -s option restricts the output to the POSIX.2"
+msgstr ""
+"or not it is enabled.  The -s option restricts the output to the POSIX.2"
+
+#: builtins.c:474
+msgid ""
+"`special' builtins.  The -n option displays a list of all disabled builtins."
+msgstr ""
+"‘\e[1mspecial\e[0m’ builtins.  The -n option displays a list of all disabled "
+"builtins."
+
+#: builtins.c:480
+msgid "Read ARGs as input to the shell and execute the resulting command(s)."
+msgstr "Read ARGs as input to the shell and execute the resulting command(s)."
+
+#: builtins.c:486
+msgid "Getopts is used by shell procedures to parse positional parameters."
+msgstr "Getopts is used by shell procedures to parse positional parameters."
+
+#: builtins.c:488
+msgid "OPTSTRING contains the option letters to be recognized; if a letter"
+msgstr "OPTSTRING contains the option letters to be recognized; if a letter"
+
+#: builtins.c:489
+msgid "is followed by a colon, the option is expected to have an argument,"
+msgstr "is followed by a colon, the option is expected to have an argument,"
+
+#: builtins.c:490
+msgid "which should be separated from it by white space."
+msgstr "which should be separated from it by white space."
+
+#: builtins.c:492
+msgid "Each time it is invoked, getopts will place the next option in the"
+msgstr "Each time it is invoked, getopts will place the next option in the"
+
+#: builtins.c:493
+msgid "shell variable $name, initializing name if it does not exist, and"
+msgstr "shell variable $name, initializing name if it does not exist, and"
+
+#: builtins.c:494
+msgid "the index of the next argument to be processed into the shell"
+msgstr "the index of the next argument to be processed into the shell"
+
+#: builtins.c:495
+msgid "variable OPTIND.  OPTIND is initialized to 1 each time the shell or"
+msgstr "variable OPTIND.  OPTIND is initialized to 1 each time the shell or"
+
+#: builtins.c:496
+msgid "a shell script is invoked.  When an option requires an argument,"
+msgstr "a shell script is invoked.  When an option requires an argument,"
+
+#: builtins.c:497
+msgid "getopts places that argument into the shell variable OPTARG."
+msgstr "getopts places that argument into the shell variable OPTARG."
+
+#: builtins.c:499
+msgid "getopts reports errors in one of two ways.  If the first character"
+msgstr "getopts reports errors in one of two ways.  If the first character"
+
+#: builtins.c:500
+msgid "of OPTSTRING is a colon, getopts uses silent error reporting.  In"
+msgstr "of OPTSTRING is a colon, getopts uses silent error reporting.  In"
+
+#: builtins.c:501
+msgid "this mode, no error messages are printed.  If an invalid option is"
+msgstr "this mode, no error messages are printed.  If an invalid option is"
+
+#: builtins.c:502
+msgid "seen, getopts places the option character found into OPTARG.  If a"
+msgstr "seen, getopts places the option character found into OPTARG.  If a"
+
+#: builtins.c:503
+msgid "required argument is not found, getopts places a ':' into NAME and"
+msgstr ""
+"required argument is not found, getopts places a ‘\e[1m:\e[0m’ into NAME and"
+
+#: builtins.c:504
+msgid "sets OPTARG to the option character found.  If getopts is not in"
+msgstr "sets OPTARG to the option character found.  If getopts is not in"
+
+#: builtins.c:505
+msgid "silent mode, and an invalid option is seen, getopts places '?' into"
+msgstr ""
+"silent mode, and an invalid option is seen, getopts places ‘\e[1m?\e[0m’ into"
+
+#: builtins.c:506
+msgid "NAME and unsets OPTARG.  If a required argument is not found, a '?'"
+msgstr ""
+"NAME and unsets OPTARG.  If a required argument is not found, a ‘\e[1m?\e[0m’"
+
+#: builtins.c:507
+msgid "is placed in NAME, OPTARG is unset, and a diagnostic message is"
+msgstr "is placed in NAME, OPTARG is unset, and a diagnostic message is"
+
+#: builtins.c:508
+msgid "printed."
+msgstr "printed."
+
+#: builtins.c:510
+msgid "If the shell variable OPTERR has the value 0, getopts disables the"
+msgstr "If the shell variable OPTERR has the value 0, getopts disables the"
+
+#: builtins.c:511
+msgid "printing of error messages, even if the first character of"
+msgstr "printing of error messages, even if the first character of"
+
+#: builtins.c:512
+msgid "OPTSTRING is not a colon.  OPTERR has the value 1 by default."
+msgstr "OPTSTRING is not a colon.  OPTERR has the value 1 by default."
+
+#: builtins.c:514
+msgid "Getopts normally parses the positional parameters ($0 - $9), but if"
+msgstr "Getopts normally parses the positional parameters ($0 - $9), but if"
+
+#: builtins.c:515
+msgid "more arguments are given, they are parsed instead."
+msgstr "more arguments are given, they are parsed instead."
+
+#: builtins.c:521
+msgid "Exec FILE, replacing this shell with the specified program."
+msgstr "Exec FILE, replacing this shell with the specified program."
+
+#: builtins.c:522
+msgid "If FILE is not specified, the redirections take effect in this"
+msgstr "If FILE is not specified, the redirections take effect in this"
+
+#: builtins.c:523
+msgid "shell.  If the first argument is `-l', then place a dash in the"
+msgstr "shell.  If the first argument is ‘\e[1m-l\e[0m’, then place a dash in the"
+
+#: builtins.c:524
+msgid "zeroth arg passed to FILE, as login does.  If the `-c' option"
+msgstr "zeroth arg passed to FILE, as login does.  If the ‘\e[1m-c\e[0m’ option"
+
+#: builtins.c:525
+msgid "is supplied, FILE is executed with a null environment.  The `-a'"
+msgstr "is supplied, FILE is executed with a null environment.  The ‘\e[1m-a\e[0m’"
+
+#: builtins.c:526
+msgid "option means to make set argv[0] of the executed process to NAME."
+msgstr "option means to make set argv[0] of the executed process to NAME."
+
+#: builtins.c:527
+msgid "If the file cannot be executed and the shell is not interactive,"
+msgstr "If the file cannot be executed and the shell is not interactive,"
+
+#: builtins.c:528
+msgid "then the shell exits, unless the shell option `execfail' is set."
+msgstr "then the shell exits, unless the shell option ‘\e[1mexecfail\e[0m’ is set."
+
+#: builtins.c:534
+msgid "Exit the shell with a status of N.  If N is omitted, the exit status"
+msgstr "Exit the shell with a status of N.  If N is omitted, the exit status"
+
+#: builtins.c:535
+msgid "is that of the last command executed."
+msgstr "is that of the last command executed."
+
+#: builtins.c:541
+msgid "Logout of a login shell."
+msgstr "Logout of a login shell."
+
+#: builtins.c:548
+msgid ""
+"fc is used to list or edit and re-execute commands from the history list."
+msgstr ""
+"fc is used to list or edit and re-execute commands from the history list."
+
+#: builtins.c:549
+msgid "FIRST and LAST can be numbers specifying the range, or FIRST can be a"
+msgstr "FIRST and LAST can be numbers specifying the range, or FIRST can be a"
+
+#: builtins.c:550
+msgid "string, which means the most recent command beginning with that"
+msgstr "string, which means the most recent command beginning with that"
+
+#: builtins.c:551
+msgid "string."
+msgstr "string."
+
+#: builtins.c:553
+msgid ""
+"   -e ENAME selects which editor to use.  Default is FCEDIT, then EDITOR,"
+msgstr ""
+"   -e ENAME selects which editor to use.  Default is FCEDIT, then EDITOR,"
+
+#: builtins.c:554
+msgid "      then vi."
+msgstr "      then vi."
+
+#: builtins.c:556
+msgid "   -l means list lines instead of editing."
+msgstr "   -l means list lines instead of editing."
+
+#: builtins.c:557
+msgid "   -n means no line numbers listed."
+msgstr "   -n means no line numbers listed."
+
+#: builtins.c:558
+msgid ""
+"   -r means reverse the order of the lines (making it newest listed first)."
+msgstr ""
+"   -r means reverse the order of the lines (making it newest listed first)."
+
+#: builtins.c:560
+msgid "With the `fc -s [pat=rep ...] [command]' format, the command is"
+msgstr "With the ‘\e[1mfc -s [pat=rep ...] [command]\e[0m’ format, the command is"
+
+#: builtins.c:561
+msgid "re-executed after the substitution OLD=NEW is performed."
+msgstr "re-executed after the substitution OLD=NEW is performed."
+
+#: builtins.c:563
+msgid "A useful alias to use with this is r='fc -s', so that typing `r cc'"
+msgstr ""
+"A useful alias to use with this is r='fc -s', so that typing ‘\e[1mr cc\e[0m’"
+
+#: builtins.c:564
+msgid "runs the last command beginning with `cc' and typing `r' re-executes"
+msgstr ""
+"runs the last command beginning with ‘\e[1mcc\e[0m’ and typing ‘\e[1mr\e[0m’ re-"
+"executes"
+
+#: builtins.c:565
+msgid "the last command."
+msgstr "the last command."
+
+#: builtins.c:573
+msgid "Place JOB_SPEC in the foreground, and make it the current job.  If"
+msgstr "Place JOB_SPEC in the foreground, and make it the current job.  If"
+
+#: builtins.c:574
+msgid "JOB_SPEC is not present, the shell's notion of the current job is"
+msgstr "JOB_SPEC is not present, the shell's notion of the current job is"
+
+#: builtins.c:575
+msgid "used."
+msgstr "used."
+
+#: builtins.c:583
+msgid "Place JOB_SPEC in the background, as if it had been started with"
+msgstr "Place JOB_SPEC in the background, as if it had been started with"
+
+#: builtins.c:584
+msgid "`&'.  If JOB_SPEC is not present, the shell's notion of the current"
+msgstr ""
+"‘\e[1m&\e[0m’.  If JOB_SPEC is not present, the shell's notion of the current"
+
+#: builtins.c:585
+msgid "job is used."
+msgstr "job is used."
+
+#: builtins.c:592
+msgid "For each NAME, the full pathname of the command is determined and"
+msgstr "For each NAME, the full pathname of the command is determined and"
+
+#: builtins.c:593
+msgid "remembered.  If the -p option is supplied, PATHNAME is used as the"
+msgstr "remembered.  If the -p option is supplied, PATHNAME is used as the"
+
+#: builtins.c:594
+msgid "full pathname of NAME, and no path search is performed.  The -r"
+msgstr "full pathname of NAME, and no path search is performed.  The -r"
+
+#: builtins.c:595
+msgid "option causes the shell to forget all remembered locations.  The -d"
+msgstr "option causes the shell to forget all remembered locations.  The -d"
+
+#: builtins.c:596
+msgid "option causes the shell to forget the remembered location of each NAME."
+msgstr ""
+"option causes the shell to forget the remembered location of each NAME."
+
+#: builtins.c:597
+msgid "If the -t option is supplied the full pathname to which each NAME"
+msgstr "If the -t option is supplied the full pathname to which each NAME"
+
+#: builtins.c:598
+msgid "corresponds is printed.  If multiple NAME arguments are supplied with"
+msgstr "corresponds is printed.  If multiple NAME arguments are supplied with"
+
+#: builtins.c:599
+msgid "-t, the NAME is printed before the hashed full pathname.  The -l option"
+msgstr ""
+"-t, the NAME is printed before the hashed full pathname.  The -l option"
+
+#: builtins.c:600
+msgid "causes output to be displayed in a format that may be reused as input."
+msgstr "causes output to be displayed in a format that may be reused as input."
+
+#: builtins.c:601
+msgid ""
+"If no arguments are given, information about remembered commands is "
+"displayed."
+msgstr ""
+"If no arguments are given, information about remembered commands is "
+"displayed."
+
+#: builtins.c:608
+msgid "Display helpful information about builtin commands.  If PATTERN is"
+msgstr "Display helpful information about builtin commands.  If PATTERN is"
+
+#: builtins.c:609
+msgid "specified, gives detailed help on all commands matching PATTERN,"
+msgstr "specified, gives detailed help on all commands matching PATTERN,"
+
+#: builtins.c:610
+msgid "otherwise a list of the builtins is printed.  The -s option"
+msgstr "otherwise a list of the builtins is printed.  The -s option"
+
+#: builtins.c:611
+msgid "restricts the output for each builtin command matching PATTERN to"
+msgstr "restricts the output for each builtin command matching PATTERN to"
+
+#: builtins.c:612
+msgid "a short usage synopsis."
+msgstr "a short usage synopsis."
+
+#: builtins.c:620
+msgid "Display the history list with line numbers.  Lines listed with"
+msgstr "Display the history list with line numbers.  Lines listed with"
+
+#: builtins.c:621
+msgid "with a `*' have been modified.  Argument of N says to list only"
+msgstr "with a ‘\e[1m*\e[0m’ have been modified.  Argument of N says to list only"
+
+#: builtins.c:622
+msgid "the last N lines.  The `-c' option causes the history list to be"
+msgstr "the last N lines.  The ‘\e[1m-c\e[0m’ option causes the history list to be"
+
+#: builtins.c:623
+msgid "cleared by deleting all of the entries.  The `-d' option deletes"
+msgstr "cleared by deleting all of the entries.  The ‘\e[1m-d\e[0m’ option deletes"
+
+#: builtins.c:624
+msgid "the history entry at offset OFFSET.  The `-w' option writes out the"
+msgstr ""
+"the history entry at offset OFFSET.  The ‘\e[1m-w\e[0m’ option writes out the"
+
+#: builtins.c:625
+msgid "current history to the history file;  `-r' means to read the file and"
+msgstr ""
+"current history to the history file;  ‘\e[1m-r\e[0m’ means to read the file and"
+
+#: builtins.c:626
+msgid "append the contents to the history list instead.  `-a' means"
+msgstr "append the contents to the history list instead.  ‘\e[1m-a\e[0m’ means"
+
+#: builtins.c:627
+msgid "to append history lines from this session to the history file."
+msgstr "to append history lines from this session to the history file."
+
+#: builtins.c:628
+msgid "Argument `-n' means to read all history lines not already read"
+msgstr "Argument ‘\e[1m-n\e[0m’ means to read all history lines not already read"
+
+#: builtins.c:629
+msgid "from the history file and append them to the history list."
+msgstr "from the history file and append them to the history list."
+
+#: builtins.c:631
+msgid "If FILENAME is given, then that is used as the history file else"
+msgstr "If FILENAME is given, then that is used as the history file else"
+
+#: builtins.c:632
+msgid "if $HISTFILE has a value, that is used, else ~/.bash_history."
+msgstr "if $HISTFILE has a value, that is used, else ~/.bash_history."
+
+#: builtins.c:633
+msgid "If the -s option is supplied, the non-option ARGs are appended to"
+msgstr "If the -s option is supplied, the non-option ARGs are appended to"
+
+#: builtins.c:634
+msgid "the history list as a single entry.  The -p option means to perform"
+msgstr "the history list as a single entry.  The -p option means to perform"
+
+#: builtins.c:635
+msgid "history expansion on each ARG and display the result, without storing"
+msgstr "history expansion on each ARG and display the result, without storing"
+
+#: builtins.c:636
+msgid "anything in the history list."
+msgstr "anything in the history list."
+
+#: builtins.c:638
+msgid "If the $HISTTIMEFORMAT variable is set and not null, its value is used"
+msgstr "If the $HISTTIMEFORMAT variable is set and not null, its value is used"
+
+#: builtins.c:639
+msgid "as a format string for strftime(3) to print the time stamp associated"
+msgstr "as a format string for strftime(3) to print the time stamp associated"
+
+#: builtins.c:640
+msgid ""
+"with each displayed history entry.  No time stamps are printed otherwise."
+msgstr ""
+"with each displayed history entry.  No time stamps are printed otherwise."
+
+#: builtins.c:648
+msgid "Lists the active jobs.  The -l option lists process id's in addition"
+msgstr "Lists the active jobs.  The -l option lists process id's in addition"
+
+#: builtins.c:649
+msgid "to the normal information; the -p option lists process id's only."
+msgstr "to the normal information; the -p option lists process id's only."
+
+#: builtins.c:650
+msgid "If -n is given, only processes that have changed status since the last"
+msgstr "If -n is given, only processes that have changed status since the last"
+
+#: builtins.c:651
+msgid "notification are printed.  JOBSPEC restricts output to that job.  The"
+msgstr "notification are printed.  JOBSPEC restricts output to that job.  The"
+
+#: builtins.c:652
+msgid "-r and -s options restrict output to running and stopped jobs only,"
+msgstr "-r and -s options restrict output to running and stopped jobs only,"
+
+#: builtins.c:653
+msgid "respectively.  Without options, the status of all active jobs is"
+msgstr "respectively.  Without options, the status of all active jobs is"
+
+#: builtins.c:654
+msgid "printed.  If -x is given, COMMAND is run after all job specifications"
+msgstr "printed.  If -x is given, COMMAND is run after all job specifications"
+
+#: builtins.c:655
+msgid ""
+"that appear in ARGS have been replaced with the process ID of that job's"
+msgstr ""
+"that appear in ARGS have been replaced with the process ID of that job's"
+
+#: builtins.c:656
+msgid "process group leader."
+msgstr "process group leader."
+
+#: builtins.c:664
+msgid ""
+"By default, removes each JOBSPEC argument from the table of active jobs."
+msgstr ""
+"By default, removes each JOBSPEC argument from the table of active jobs."
+
+#: builtins.c:665
+msgid ""
+"If the -h option is given, the job is not removed from the table, but is"
+msgstr ""
+"If the -h option is given, the job is not removed from the table, but is"
+
+#: builtins.c:666
+msgid "marked so that SIGHUP is not sent to the job if the shell receives a"
+msgstr "marked so that SIGHUP is not sent to the job if the shell receives a"
+
+#: builtins.c:667
+msgid ""
+"SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all"
+msgstr ""
+"SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all"
+
+#: builtins.c:668
+msgid ""
+"jobs from the job table; the -r option means to remove only running jobs."
+msgstr ""
+"jobs from the job table; the -r option means to remove only running jobs."
+
+#: builtins.c:675
+msgid "Send the processes named by PID (or JOB) the signal SIGSPEC.  If"
+msgstr "Send the processes named by PID (or JOB) the signal SIGSPEC.  If"
+
+#: builtins.c:676
+msgid "SIGSPEC is not present, then SIGTERM is assumed.  An argument of `-l'"
+msgstr ""
+"SIGSPEC is not present, then SIGTERM is assumed.  An argument of ‘\e[1m-l\e[0m’"
+
+#: builtins.c:677
+msgid "lists the signal names; if arguments follow `-l' they are assumed to"
+msgstr ""
+"lists the signal names; if arguments follow ‘\e[1m-l\e[0m’ they are assumed to"
+
+#: builtins.c:678
+msgid "be signal numbers for which names should be listed.  Kill is a shell"
+msgstr "be signal numbers for which names should be listed.  Kill is a shell"
+
+#: builtins.c:679
+msgid "builtin for two reasons: it allows job IDs to be used instead of"
+msgstr "builtin for two reasons: it allows job IDs to be used instead of"
+
+#: builtins.c:680
+msgid "process IDs, and, if you have reached the limit on processes that"
+msgstr "process IDs, and, if you have reached the limit on processes that"
+
+#: builtins.c:681
+msgid "you can create, you don't have to start a process to kill another one."
+msgstr "you can create, you don't have to start a process to kill another one."
+
+#: builtins.c:687
+msgid "Each ARG is an arithmetic expression to be evaluated.  Evaluation"
+msgstr "Each ARG is an arithmetic expression to be evaluated.  Evaluation"
+
+#: builtins.c:688
+msgid "is done in fixed-width integers with no check for overflow, though"
+msgstr "is done in fixed-width integers with no check for overflow, though"
+
+#: builtins.c:689
+msgid "division by 0 is trapped and flagged as an error.  The following"
+msgstr "division by 0 is trapped and flagged as an error.  The following"
+
+#: builtins.c:690
+msgid "list of operators is grouped into levels of equal-precedence operators."
+msgstr ""
+"list of operators is grouped into levels of equal-precedence operators."
+
+#: builtins.c:691
+msgid "The levels are listed in order of decreasing precedence."
+msgstr "The levels are listed in order of decreasing precedence."
+
+#: builtins.c:693
+msgid "\tid++, id--\tvariable post-increment, post-decrement"
+msgstr "\tid++, id--\tvariable post-increment, post-decrement"
+
+#: builtins.c:694
+msgid "\t++id, --id\tvariable pre-increment, pre-decrement"
+msgstr "\t++id, --id\tvariable pre-increment, pre-decrement"
+
+#: builtins.c:695
+msgid "\t-, +\t\tunary minus, plus"
+msgstr "\t-, +\t\tunary minus, plus"
+
+#: builtins.c:696
+msgid "\t!, ~\t\tlogical and bitwise negation"
+msgstr "\t!, ~\t\tlogical and bitwise negation"
+
+#: builtins.c:697
+msgid "\t**\t\texponentiation"
+msgstr "\t**\t\texponentiation"
+
+#: builtins.c:698
+msgid "\t*, /, %\t\tmultiplication, division, remainder"
+msgstr "\t*, /, %\t\tmultiplication, division, remainder"
+
+#: builtins.c:699
+msgid "\t+, -\t\taddition, subtraction"
+msgstr "\t+, -\t\taddition, subtraction"
+
+#: builtins.c:700
+msgid "\t<<, >>\t\tleft and right bitwise shifts"
+msgstr "\t<<, >>\t\tleft and right bitwise shifts"
+
+#: builtins.c:701
+msgid "\t<=, >=, <, >\tcomparison"
+msgstr "\t<=, >=, <, >\tcomparison"
+
+#: builtins.c:702
+msgid "\t==, !=\t\tequality, inequality"
+msgstr "\t==, !=\t\tequality, inequality"
+
+#: builtins.c:703
+msgid "\t&\t\tbitwise AND"
+msgstr "\t&\t\tbitwise AND"
+
+#: builtins.c:704
+msgid "\t^\t\tbitwise XOR"
+msgstr "\t^\t\tbitwise XOR"
+
+#: builtins.c:705
+msgid "\t|\t\tbitwise OR"
+msgstr "\t|\t\tbitwise OR"
+
+#: builtins.c:706
+msgid "\t&&\t\tlogical AND"
+msgstr "\t&&\t\tlogical AND"
+
+#: builtins.c:707
+msgid "\t||\t\tlogical OR"
+msgstr "\t||\t\tlogical OR"
+
+#: builtins.c:708
+msgid "\texpr ? expr : expr"
+msgstr "\texpr ? expr : expr"
+
+#: builtins.c:709
+msgid "\t\t\tconditional operator"
+msgstr "\t\t\tconditional operator"
+
+#: builtins.c:710
+msgid "\t=, *=, /=, %=,"
+msgstr "\t=, *=, /=, %=,"
+
+#: builtins.c:711
+msgid "\t+=, -=, <<=, >>=,"
+msgstr "\t+=, -=, <<=, >>=,"
+
+#: builtins.c:712
+msgid "\t&=, ^=, |=\tassignment"
+msgstr "\t&=, ^=, |=\tassignment"
+
+#: builtins.c:714
+msgid "Shell variables are allowed as operands.  The name of the variable"
+msgstr "Shell variables are allowed as operands.  The name of the variable"
+
+#: builtins.c:715
+msgid "is replaced by its value (coerced to a fixed-width integer) within"
+msgstr "is replaced by its value (coerced to a fixed-width integer) within"
+
+#: builtins.c:716
+msgid "an expression.  The variable need not have its integer attribute"
+msgstr "an expression.  The variable need not have its integer attribute"
+
+#: builtins.c:717
+msgid "turned on to be used in an expression."
+msgstr "turned on to be used in an expression."
+
+#: builtins.c:719
+msgid "Operators are evaluated in order of precedence.  Sub-expressions in"
+msgstr "Operators are evaluated in order of precedence.  Sub-expressions in"
+
+#: builtins.c:720
+msgid "parentheses are evaluated first and may override the precedence"
+msgstr "parentheses are evaluated first and may override the precedence"
+
+#: builtins.c:721
+msgid "rules above."
+msgstr "rules above."
+
+#: builtins.c:723
+msgid "If the last ARG evaluates to 0, let returns 1; 0 is returned"
+msgstr "If the last ARG evaluates to 0, let returns 1; 0 is returned"
+
+#: builtins.c:724
+msgid "otherwise."
+msgstr "otherwise."
+
+#: builtins.c:730
+msgid ""
+"One line is read from the standard input, or from file descriptor FD if the"
+msgstr ""
+"One line is read from the standard input, or from file descriptor FD if the"
+
+#: builtins.c:731
+msgid ""
+"-u option is supplied, and the first word is assigned to the first NAME,"
+msgstr ""
+"-u option is supplied, and the first word is assigned to the first NAME,"
+
+#: builtins.c:732
+msgid ""
+"the second word to the second NAME, and so on, with leftover words assigned"
+msgstr ""
+"the second word to the second NAME, and so on, with leftover words assigned"
+
+#: builtins.c:733
+msgid ""
+"to the last NAME.  Only the characters found in $IFS are recognized as word"
+msgstr ""
+"to the last NAME.  Only the characters found in $IFS are recognized as word"
+
+#: builtins.c:734
+msgid ""
+"delimiters.  If no NAMEs are supplied, the line read is stored in the REPLY"
+msgstr ""
+"delimiters.  If no NAMEs are supplied, the line read is stored in the REPLY"
+
+#: builtins.c:735
+msgid "variable.  If the -r option is given, this signifies `raw' input, and"
+msgstr ""
+"variable.  If the -r option is given, this signifies ‘\e[1mraw\e[0m’ input, and"
+
+#: builtins.c:736
+msgid "backslash escaping is disabled.  The -d option causes read to continue"
+msgstr "backslash escaping is disabled.  The -d option causes read to continue"
+
+#: builtins.c:737
+msgid ""
+"until the first character of DELIM is read, rather than newline.  If the -p"
+msgstr ""
+"until the first character of DELIM is read, rather than newline.  If the -p"
+
+#: builtins.c:738
+msgid ""
+"option is supplied, the string PROMPT is output without a trailing newline"
+msgstr ""
+"option is supplied, the string PROMPT is output without a trailing newline"
+
+#: builtins.c:739
+msgid ""
+"before attempting to read.  If -a is supplied, the words read are assigned"
+msgstr ""
+"before attempting to read.  If -a is supplied, the words read are assigned"
+
+#: builtins.c:740
+msgid ""
+"to sequential indices of ARRAY, starting at zero.  If -e is supplied and"
+msgstr ""
+"to sequential indices of ARRAY, starting at zero.  If -e is supplied and"
+
+#: builtins.c:741
+msgid ""
+"the shell is interactive, readline is used to obtain the line.  If -n is"
+msgstr ""
+"the shell is interactive, readline is used to obtain the line.  If -n is"
+
+#: builtins.c:742
+msgid "supplied with a non-zero NCHARS argument, read returns after NCHARS"
+msgstr "supplied with a non-zero NCHARS argument, read returns after NCHARS"
+
+#: builtins.c:743
+msgid "characters have been read.  The -s option causes input coming from a"
+msgstr "characters have been read.  The -s option causes input coming from a"
+
+#: builtins.c:744
+msgid "terminal to not be echoed."
+msgstr "terminal to not be echoed."
+
+#: builtins.c:746
+msgid ""
+"The -t option causes read to time out and return failure if a complete line"
+msgstr ""
+"The -t option causes read to time out and return failure if a complete line"
+
+#: builtins.c:747
+msgid ""
+"of input is not read within TIMEOUT seconds.  If the TMOUT variable is set,"
+msgstr ""
+"of input is not read within TIMEOUT seconds.  If the TMOUT variable is set,"
+
+#: builtins.c:748
+msgid ""
+"its value is the default timeout.  The return code is zero, unless end-of-"
+"file"
+msgstr ""
+"its value is the default timeout.  The return code is zero, unless end-of-"
+"file"
+
+#: builtins.c:749
+msgid ""
+"is encountered, read times out, or an invalid file descriptor is supplied as"
+msgstr ""
+"is encountered, read times out, or an invalid file descriptor is supplied as"
+
+#: builtins.c:750
+msgid "the argument to -u."
+msgstr "the argument to -u."
+
+#: builtins.c:756
+msgid "Causes a function to exit with the return value specified by N.  If N"
+msgstr "Causes a function to exit with the return value specified by N.  If N"
+
+#: builtins.c:757
+msgid "is omitted, the return status is that of the last command."
+msgstr "is omitted, the return status is that of the last command."
+
+#: builtins.c:763
+msgid "    -a  Mark variables which are modified or created for export."
+msgstr "    -a  Mark variables which are modified or created for export."
+
+#: builtins.c:764
+msgid "    -b  Notify of job termination immediately."
+msgstr "    -b  Notify of job termination immediately."
+
+#: builtins.c:765
+msgid "    -e  Exit immediately if a command exits with a non-zero status."
+msgstr "    -e  Exit immediately if a command exits with a non-zero status."
+
+#: builtins.c:766
+msgid "    -f  Disable file name generation (globbing)."
+msgstr "    -f  Disable file name generation (globbing)."
+
+#: builtins.c:767
+msgid "    -h  Remember the location of commands as they are looked up."
+msgstr "    -h  Remember the location of commands as they are looked up."
+
+#: builtins.c:768
+msgid "    -k  All assignment arguments are placed in the environment for a"
+msgstr "    -k  All assignment arguments are placed in the environment for a"
+
+#: builtins.c:769
+msgid "        command, not just those that precede the command name."
+msgstr "        command, not just those that precede the command name."
+
+#: builtins.c:770
+msgid "    -m  Job control is enabled."
+msgstr "    -m  Job control is enabled."
+
+#: builtins.c:771
+msgid "    -n  Read commands but do not execute them."
+msgstr "    -n  Read commands but do not execute them."
+
+#: builtins.c:772
+msgid "    -o option-name"
+msgstr "    -o option-name"
+
+#: builtins.c:773
+msgid "        Set the variable corresponding to option-name:"
+msgstr "        Set the variable corresponding to option-name:"
+
+#: builtins.c:774
+msgid "            allexport    same as -a"
+msgstr "            allexport    same as -a"
+
+#: builtins.c:775
+msgid "            braceexpand  same as -B"
+msgstr "            braceexpand  same as -B"
+
+#: builtins.c:777
+msgid "            emacs        use an emacs-style line editing interface"
+msgstr "            emacs        use an emacs-style line editing interface"
+
+#: builtins.c:779
+msgid "            errexit      same as -e"
+msgstr "            errexit      same as -e"
+
+#: builtins.c:780
+msgid "            errtrace     same as -E"
+msgstr "            errtrace     same as -E"
+
+#: builtins.c:781
+msgid "            functrace    same as -T"
+msgstr "            functrace    same as -T"
+
+#: builtins.c:782
+msgid "            hashall      same as -h"
+msgstr "            hashall      same as -h"
+
+#: builtins.c:784
+msgid "            histexpand   same as -H"
+msgstr "            histexpand   same as -H"
+
+#: builtins.c:787
+msgid "            history      enable command history"
+msgstr "            history      enable command history"
+
+#: builtins.c:789
+msgid "            ignoreeof    the shell will not exit upon reading EOF"
+msgstr "            ignoreeof    the shell will not exit upon reading EOF"
+
+#: builtins.c:790
+msgid "            interactive-comments"
+msgstr "            interactive-comments"
+
+#: builtins.c:791
+msgid ""
+"                         allow comments to appear in interactive commands"
+msgstr ""
+"                         allow comments to appear in interactive commands"
+
+#: builtins.c:792
+msgid "            keyword      same as -k"
+msgstr "            keyword      same as -k"
+
+#: builtins.c:793
+msgid "            monitor      same as -m"
+msgstr "            monitor      same as -m"
+
+#: builtins.c:794
+msgid "            noclobber    same as -C"
+msgstr "            noclobber    same as -C"
+
+#: builtins.c:795
+msgid "            noexec       same as -n"
+msgstr "            noexec       same as -n"
+
+#: builtins.c:796
+msgid "            noglob       same as -f"
+msgstr "            noglob       same as -f"
+
+#: builtins.c:797
+msgid "            nolog        currently accepted but ignored"
+msgstr "            nolog        currently accepted but ignored"
+
+#: builtins.c:798
+msgid "            notify       same as -b"
+msgstr "            notify       same as -b"
+
+#: builtins.c:799
+msgid "            nounset      same as -u"
+msgstr "            nounset      same as -u"
+
+#: builtins.c:800
+msgid "            onecmd       same as -t"
+msgstr "            onecmd       same as -t"
+
+#: builtins.c:801
+msgid "            physical     same as -P"
+msgstr "            physical     same as -P"
+
+#: builtins.c:802
+msgid ""
+"            pipefail     the return value of a pipeline is the status of"
+msgstr ""
+"            pipefail     the return value of a pipeline is the status of"
+
+#: builtins.c:803
+msgid ""
+"                         the last command to exit with a non-zero status,"
+msgstr ""
+"                         the last command to exit with a non-zero status,"
+
+#: builtins.c:804
+msgid ""
+"                         or zero if no command exited with a non-zero status"
+msgstr ""
+"                         or zero if no command exited with a non-zero status"
+
+#: builtins.c:805
+msgid "            posix        change the behavior of bash where the default"
+msgstr "            posix        change the behavior of bash where the default"
+
+#: builtins.c:806
+msgid "                         operation differs from the 1003.2 standard to"
+msgstr "                         operation differs from the 1003.2 standard to"
+
+#: builtins.c:807
+msgid "                         match the standard"
+msgstr "                         match the standard"
+
+#: builtins.c:808
+msgid "            privileged   same as -p"
+msgstr "            privileged   same as -p"
+
+#: builtins.c:809
+msgid "            verbose      same as -v"
+msgstr "            verbose      same as -v"
+
+#: builtins.c:811
+msgid "            vi           use a vi-style line editing interface"
+msgstr "            vi           use a vi-style line editing interface"
+
+#: builtins.c:813
+msgid "            xtrace       same as -x"
+msgstr "            xtrace       same as -x"
+
+#: builtins.c:814
+msgid ""
+"    -p  Turned on whenever the real and effective user ids do not match."
+msgstr ""
+"    -p  Turned on whenever the real and effective user ids do not match."
+
+#: builtins.c:815
+msgid "        Disables processing of the $ENV file and importing of shell"
+msgstr "        Disables processing of the $ENV file and importing of shell"
+
+#: builtins.c:816
+msgid ""
+"        functions.  Turning this option off causes the effective uid and"
+msgstr ""
+"        functions.  Turning this option off causes the effective uid and"
+
+#: builtins.c:817
+msgid "        gid to be set to the real uid and gid."
+msgstr "        gid to be set to the real uid and gid."
+
+#: builtins.c:818
+msgid "    -t  Exit after reading and executing one command."
+msgstr "    -t  Exit after reading and executing one command."
+
+#: builtins.c:819
+msgid "    -u  Treat unset variables as an error when substituting."
+msgstr "    -u  Treat unset variables as an error when substituting."
+
+#: builtins.c:820
+msgid "    -v  Print shell input lines as they are read."
+msgstr "    -v  Print shell input lines as they are read."
+
+#: builtins.c:821
+msgid "    -x  Print commands and their arguments as they are executed."
+msgstr "    -x  Print commands and their arguments as they are executed."
+
+#: builtins.c:823
+msgid "    -B  the shell will perform brace expansion"
+msgstr "    -B  the shell will perform brace expansion"
+
+#: builtins.c:825
+msgid "    -C  If set, disallow existing regular files to be overwritten"
+msgstr "    -C  If set, disallow existing regular files to be overwritten"
+
+#: builtins.c:826
+msgid "        by redirection of output."
+msgstr "        by redirection of output."
+
+#: builtins.c:827
+msgid "    -E  If set, the ERR trap is inherited by shell functions."
+msgstr "    -E  If set, the ERR trap is inherited by shell functions."
+
+#: builtins.c:829
+msgid "    -H  Enable ! style history substitution.  This flag is on"
+msgstr "    -H  Enable ! style history substitution.  This flag is on"
+
+#: builtins.c:830
+msgid "        by default."
+msgstr "        by default."
+
+#: builtins.c:832
+msgid "    -P  If set, do not follow symbolic links when executing commands"
+msgstr "    -P  If set, do not follow symbolic links when executing commands"
+
+#: builtins.c:833
+msgid "        such as cd which change the current directory."
+msgstr "        such as cd which change the current directory."
+
+#: builtins.c:834
+msgid "    -T  If set, the DEBUG trap is inherited by shell functions."
+msgstr "    -T  If set, the DEBUG trap is inherited by shell functions."
+
+#: builtins.c:836
+msgid "Using + rather than - causes these flags to be turned off.  The"
+msgstr "Using + rather than - causes these flags to be turned off.  The"
+
+#: builtins.c:837
+msgid "flags can also be used upon invocation of the shell.  The current"
+msgstr "flags can also be used upon invocation of the shell.  The current"
+
+#: builtins.c:838
+msgid "set of flags may be found in $-.  The remaining n ARGs are positional"
+msgstr "set of flags may be found in $-.  The remaining n ARGs are positional"
+
+#: builtins.c:839
+msgid "parameters and are assigned, in order, to $1, $2, .. $n.  If no"
+msgstr "parameters and are assigned, in order, to $1, $2, .. $n.  If no"
+
+#: builtins.c:840
+msgid "ARGs are given, all shell variables are printed."
+msgstr "ARGs are given, all shell variables are printed."
+
+#: builtins.c:846
+msgid "For each NAME, remove the corresponding variable or function.  Given"
+msgstr "For each NAME, remove the corresponding variable or function.  Given"
+
+#: builtins.c:847
+msgid "the `-v', unset will only act on variables.  Given the `-f' flag,"
+msgstr ""
+"the ‘\e[1m-v\e[0m’, unset will only act on variables.  Given the ‘\e[1m-f\e[0m’ flag,"
+
+#: builtins.c:848
+msgid "unset will only act on functions.  With neither flag, unset first"
+msgstr "unset will only act on functions.  With neither flag, unset first"
+
+#: builtins.c:849
+msgid "tries to unset a variable, and if that fails, then tries to unset a"
+msgstr "tries to unset a variable, and if that fails, then tries to unset a"
+
+#: builtins.c:850
+msgid "function.  Some variables cannot be unset; also see readonly."
+msgstr "function.  Some variables cannot be unset; also see readonly."
+
+#: builtins.c:856
+msgid "NAMEs are marked for automatic export to the environment of"
+msgstr "NAMEs are marked for automatic export to the environment of"
+
+#: builtins.c:857
+msgid "subsequently executed commands.  If the -f option is given,"
+msgstr "subsequently executed commands.  If the -f option is given,"
+
+#: builtins.c:858
+msgid "the NAMEs refer to functions.  If no NAMEs are given, or if `-p'"
+msgstr "the NAMEs refer to functions.  If no NAMEs are given, or if ‘\e[1m-p\e[0m’"
+
+#: builtins.c:859
+msgid "is given, a list of all names that are exported in this shell is"
+msgstr "is given, a list of all names that are exported in this shell is"
+
+#: builtins.c:860
+msgid "printed.  An argument of `-n' says to remove the export property"
+msgstr "printed.  An argument of ‘\e[1m-n\e[0m’ says to remove the export property"
+
+#: builtins.c:861
+msgid "from subsequent NAMEs.  An argument of `--' disables further option"
+msgstr ""
+"from subsequent NAMEs.  An argument of ‘\e[1m--\e[0m’ disables further option"
+
+#: builtins.c:862 builtins.c:874
+msgid "processing."
+msgstr "processing."
+
+#: builtins.c:868
+msgid "The given NAMEs are marked readonly and the values of these NAMEs may"
+msgstr "The given NAMEs are marked readonly and the values of these NAMEs may"
+
+#: builtins.c:869
+msgid "not be changed by subsequent assignment.  If the -f option is given,"
+msgstr "not be changed by subsequent assignment.  If the -f option is given,"
+
+#: builtins.c:870
+msgid "then functions corresponding to the NAMEs are so marked.  If no"
+msgstr "then functions corresponding to the NAMEs are so marked.  If no"
+
+#: builtins.c:871
+msgid "arguments are given, or if `-p' is given, a list of all readonly names"
+msgstr ""
+"arguments are given, or if ‘\e[1m-p\e[0m’ is given, a list of all readonly names"
+
+#: builtins.c:872
+msgid "is printed.  The `-a' option means to treat each NAME as"
+msgstr "is printed.  The ‘\e[1m-a\e[0m’ option means to treat each NAME as"
+
+#: builtins.c:873
+msgid "an array variable.  An argument of `--' disables further option"
+msgstr "an array variable.  An argument of ‘\e[1m--\e[0m’ disables further option"
+
+#: builtins.c:880
+msgid "The positional parameters from $N+1 ... are renamed to $1 ...  If N is"
+msgstr "The positional parameters from $N+1 ... are renamed to $1 ...  If N is"
+
+#: builtins.c:881
+msgid "not given, it is assumed to be 1."
+msgstr "not given, it is assumed to be 1."
+
+#: builtins.c:887 builtins.c:896
+msgid "Read and execute commands from FILENAME and return.  The pathnames"
+msgstr "Read and execute commands from FILENAME and return.  The pathnames"
+
+#: builtins.c:888 builtins.c:897
+msgid "in $PATH are used to find the directory containing FILENAME.  If any"
+msgstr "in $PATH are used to find the directory containing FILENAME.  If any"
+
+#: builtins.c:889 builtins.c:898
+msgid "ARGUMENTS are supplied, they become the positional parameters when"
+msgstr "ARGUMENTS are supplied, they become the positional parameters when"
+
+#: builtins.c:890 builtins.c:899
+msgid "FILENAME is executed."
+msgstr "FILENAME is executed."
+
+#: builtins.c:906
+msgid "Suspend the execution of this shell until it receives a SIGCONT"
+msgstr "Suspend the execution of this shell until it receives a SIGCONT"
+
+#: builtins.c:907
+msgid "signal.  The `-f' if specified says not to complain about this"
+msgstr "signal.  The ‘\e[1m-f\e[0m’ if specified says not to complain about this"
+
+#: builtins.c:908
+msgid "being a login shell if it is; just suspend anyway."
+msgstr "being a login shell if it is; just suspend anyway."
+
+#: builtins.c:915
+msgid "Exits with a status of 0 (true) or 1 (false) depending on"
+msgstr "Exits with a status of 0 (true) or 1 (false) depending on"
+
+#: builtins.c:916
+msgid "the evaluation of EXPR.  Expressions may be unary or binary.  Unary"
+msgstr "the evaluation of EXPR.  Expressions may be unary or binary.  Unary"
+
+#: builtins.c:917
+msgid "expressions are often used to examine the status of a file.  There"
+msgstr "expressions are often used to examine the status of a file.  There"
+
+#: builtins.c:918
+msgid "are string operators as well, and numeric comparison operators."
+msgstr "are string operators as well, and numeric comparison operators."
+
+#: builtins.c:920
+msgid "File operators:"
+msgstr "File operators:"
+
+#: builtins.c:922
+msgid "    -a FILE        True if file exists."
+msgstr "    -a FILE        True if file exists."
+
+#: builtins.c:923
+msgid "    -b FILE        True if file is block special."
+msgstr "    -b FILE        True if file is block special."
+
+#: builtins.c:924
+msgid "    -c FILE        True if file is character special."
+msgstr "    -c FILE        True if file is character special."
+
+#: builtins.c:925
+msgid "    -d FILE        True if file is a directory."
+msgstr "    -d FILE        True if file is a directory."
+
+#: builtins.c:926
+msgid "    -e FILE        True if file exists."
+msgstr "    -e FILE        True if file exists."
+
+#: builtins.c:927
+msgid "    -f FILE        True if file exists and is a regular file."
+msgstr "    -f FILE        True if file exists and is a regular file."
+
+#: builtins.c:928
+msgid "    -g FILE        True if file is set-group-id."
+msgstr "    -g FILE        True if file is set-group-id."
+
+#: builtins.c:929
+msgid "    -h FILE        True if file is a symbolic link."
+msgstr "    -h FILE        True if file is a symbolic link."
+
+#: builtins.c:930
+msgid "    -L FILE        True if file is a symbolic link."
+msgstr "    -L FILE        True if file is a symbolic link."
+
+#: builtins.c:931
+msgid "    -k FILE        True if file has its `sticky' bit set."
+msgstr "    -k FILE        True if file has its ‘\e[1msticky\e[0m’ bit set."
+
+#: builtins.c:932
+msgid "    -p FILE        True if file is a named pipe."
+msgstr "    -p FILE        True if file is a named pipe."
+
+#: builtins.c:933
+msgid "    -r FILE        True if file is readable by you."
+msgstr "    -r FILE        True if file is readable by you."
+
+#: builtins.c:934
+msgid "    -s FILE        True if file exists and is not empty."
+msgstr "    -s FILE        True if file exists and is not empty."
+
+#: builtins.c:935
+msgid "    -S FILE        True if file is a socket."
+msgstr "    -S FILE        True if file is a socket."
+
+#: builtins.c:936
+msgid "    -t FD          True if FD is opened on a terminal."
+msgstr "    -t FD          True if FD is opened on a terminal."
+
+#: builtins.c:937
+msgid "    -u FILE        True if the file is set-user-id."
+msgstr "    -u FILE        True if the file is set-user-id."
+
+#: builtins.c:938
+msgid "    -w FILE        True if the file is writable by you."
+msgstr "    -w FILE        True if the file is writable by you."
+
+#: builtins.c:939
+msgid "    -x FILE        True if the file is executable by you."
+msgstr "    -x FILE        True if the file is executable by you."
+
+#: builtins.c:940
+msgid "    -O FILE        True if the file is effectively owned by you."
+msgstr "    -O FILE        True if the file is effectively owned by you."
+
+#: builtins.c:941
+msgid "    -G FILE        True if the file is effectively owned by your group."
+msgstr ""
+"    -G FILE        True if the file is effectively owned by your group."
+
+#: builtins.c:942
+msgid ""
+"    -N FILE        True if the file has been modified since it was last read."
+msgstr ""
+"    -N FILE        True if the file has been modified since it was last read."
+
+#: builtins.c:944
+msgid "  FILE1 -nt FILE2  True if file1 is newer than file2 (according to"
+msgstr "  FILE1 -nt FILE2  True if file1 is newer than file2 (according to"
+
+#: builtins.c:945
+msgid "                   modification date)."
+msgstr "                   modification date)."
+
+#: builtins.c:947
+msgid "  FILE1 -ot FILE2  True if file1 is older than file2."
+msgstr "  FILE1 -ot FILE2  True if file1 is older than file2."
+
+#: builtins.c:949
+msgid "  FILE1 -ef FILE2  True if file1 is a hard link to file2."
+msgstr "  FILE1 -ef FILE2  True if file1 is a hard link to file2."
+
+#: builtins.c:951
+msgid "String operators:"
+msgstr "String operators:"
+
+#: builtins.c:953
+msgid "    -z STRING      True if string is empty."
+msgstr "    -z STRING      True if string is empty."
+
+#: builtins.c:955
+msgid "    -n STRING"
+msgstr "    -n STRING"
+
+#: builtins.c:956
+msgid "    STRING         True if string is not empty."
+msgstr "    STRING         True if string is not empty."
+
+#: builtins.c:958
+msgid "    STRING1 = STRING2"
+msgstr "    STRING1 = STRING2"
+
+#: builtins.c:959
+msgid "                   True if the strings are equal."
+msgstr "                   True if the strings are equal."
+
+#: builtins.c:960
+msgid "    STRING1 != STRING2"
+msgstr "    STRING1 != STRING2"
+
+#: builtins.c:961
+msgid "                   True if the strings are not equal."
+msgstr "                   True if the strings are not equal."
+
+#: builtins.c:962
+msgid "    STRING1 < STRING2"
+msgstr "    STRING1 < STRING2"
+
+#: builtins.c:963
+msgid ""
+"                   True if STRING1 sorts before STRING2 lexicographically."
+msgstr ""
+"                   True if STRING1 sorts before STRING2 lexicographically."
+
+#: builtins.c:964
+msgid "    STRING1 > STRING2"
+msgstr "    STRING1 > STRING2"
+
+#: builtins.c:965
+msgid ""
+"                   True if STRING1 sorts after STRING2 lexicographically."
+msgstr ""
+"                   True if STRING1 sorts after STRING2 lexicographically."
+
+#: builtins.c:967
+msgid "Other operators:"
+msgstr "Other operators:"
+
+#: builtins.c:969
+msgid "    -o OPTION      True if the shell option OPTION is enabled."
+msgstr "    -o OPTION      True if the shell option OPTION is enabled."
+
+#: builtins.c:970
+msgid "    ! EXPR         True if expr is false."
+msgstr "    ! EXPR         True if expr is false."
+
+#: builtins.c:971
+msgid "    EXPR1 -a EXPR2 True if both expr1 AND expr2 are true."
+msgstr "    EXPR1 -a EXPR2 True if both expr1 AND expr2 are true."
+
+#: builtins.c:972
+msgid "    EXPR1 -o EXPR2 True if either expr1 OR expr2 is true."
+msgstr "    EXPR1 -o EXPR2 True if either expr1 OR expr2 is true."
+
+#: builtins.c:974
+msgid "    arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,"
+msgstr "    arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,"
+
+#: builtins.c:975
+msgid "                   -lt, -le, -gt, or -ge."
+msgstr "                   -lt, -le, -gt, or -ge."
+
+#: builtins.c:977
+msgid "Arithmetic binary operators return true if ARG1 is equal, not-equal,"
+msgstr "Arithmetic binary operators return true if ARG1 is equal, not-equal,"
+
+#: builtins.c:978
+msgid "less-than, less-than-or-equal, greater-than, or greater-than-or-equal"
+msgstr "less-than, less-than-or-equal, greater-than, or greater-than-or-equal"
+
+#: builtins.c:979
+msgid "than ARG2."
+msgstr "than ARG2."
+
+#: builtins.c:985
+msgid "This is a synonym for the \"test\" builtin, but the last"
+msgstr "This is a synonym for the “\e[1mtest\e[0m” builtin, but the last"
+
+#: builtins.c:986
+msgid "argument must be a literal `]', to match the opening `['."
+msgstr "argument must be a literal ‘\e[1m]\e[0m’, to match the opening ‘\e[1m[\e[0m’."
+
+#: builtins.c:992
+msgid "Print the accumulated user and system times for processes run from"
+msgstr "Print the accumulated user and system times for processes run from"
+
+#: builtins.c:993
+msgid "the shell."
+msgstr "the shell."
+
+#: builtins.c:999
+msgid "The command ARG is to be read and executed when the shell receives"
+msgstr "The command ARG is to be read and executed when the shell receives"
+
+#: builtins.c:1000
+msgid "signal(s) SIGNAL_SPEC.  If ARG is absent all specified signals are"
+msgstr "signal(s) SIGNAL_SPEC.  If ARG is absent all specified signals are"
+
+#: builtins.c:1001
+msgid "reset to their original values.  If ARG is the null string each"
+msgstr "reset to their original values.  If ARG is the null string each"
+
+#: builtins.c:1002
+msgid "SIGNAL_SPEC is ignored by the shell and by the commands it invokes."
+msgstr "SIGNAL_SPEC is ignored by the shell and by the commands it invokes."
+
+#: builtins.c:1003
+msgid "If a SIGNAL_SPEC is EXIT (0) the command ARG is executed on exit from"
+msgstr "If a SIGNAL_SPEC is EXIT (0) the command ARG is executed on exit from"
+
+#: builtins.c:1004
+msgid "the shell.  If a SIGNAL_SPEC is DEBUG, ARG is executed after every"
+msgstr "the shell.  If a SIGNAL_SPEC is DEBUG, ARG is executed after every"
+
+#: builtins.c:1005
+msgid "command.  If ARG is `-p' then the trap commands associated with"
+msgstr "command.  If ARG is ‘\e[1m-p\e[0m’ then the trap commands associated with"
+
+#: builtins.c:1006
+msgid "each SIGNAL_SPEC are displayed.  If no arguments are supplied or if"
+msgstr "each SIGNAL_SPEC are displayed.  If no arguments are supplied or if"
+
+#: builtins.c:1007
+msgid "only `-p' is given, trap prints the list of commands associated with"
+msgstr ""
+"only ‘\e[1m-p\e[0m’ is given, trap prints the list of commands associated with"
+
+#: builtins.c:1008
+msgid ""
+"each signal number.  Each SIGNAL_SPEC is either a signal name in <signal.h>"
+msgstr ""
+"each signal number.  Each SIGNAL_SPEC is either a signal name in <signal.h>"
+
+#: builtins.c:1009
+msgid "or a signal number.  `trap -l' prints a list of signal names and their"
+msgstr ""
+"or a signal number.  ‘\e[1mtrap -l\e[0m’ prints a list of signal names and their"
+
+#: builtins.c:1010
+msgid "corresponding numbers.  Note that a signal can be sent to the shell"
+msgstr "corresponding numbers.  Note that a signal can be sent to the shell"
+
+#: builtins.c:1011
+msgid "with \"kill -signal $$\"."
+msgstr "with “\e[1mkill -signal $$\e[0m”."
+
+#: builtins.c:1017
+msgid "For each NAME, indicate how it would be interpreted if used as a"
+msgstr "For each NAME, indicate how it would be interpreted if used as a"
+
+#: builtins.c:1018
+msgid "command name."
+msgstr "command name."
+
+#: builtins.c:1020
+msgid "If the -t option is used, `type' outputs a single word which is one of"
+msgstr ""
+"If the -t option is used, ‘\e[1mtype\e[0m’ outputs a single word which is one of"
+
+#: builtins.c:1021
+msgid "`alias', `keyword', `function', `builtin', `file' or `', if NAME is an"
+msgstr ""
+"‘\e[1malias\e[0m’, ‘\e[1mkeyword\e[0m’, ‘\e[1mfunction\e[0m’, ‘\e[1mbuiltin\e[0m’, ‘\e[1mfile\e"
+"[0m’ or ‘\e[1m\e[0m’, if NAME is an"
+
+#: builtins.c:1022
+msgid "alias, shell reserved word, shell function, shell builtin, disk file,"
+msgstr "alias, shell reserved word, shell function, shell builtin, disk file,"
+
+#: builtins.c:1023
+msgid "or unfound, respectively."
+msgstr "or unfound, respectively."
+
+#: builtins.c:1025
+msgid "If the -p flag is used, `type' either returns the name of the disk"
+msgstr ""
+"If the -p flag is used, ‘\e[1mtype\e[0m’ either returns the name of the disk"
+
+#: builtins.c:1026
+msgid "file that would be executed, or nothing if `type -t NAME' would not"
+msgstr ""
+"file that would be executed, or nothing if ‘\e[1mtype -t NAME\e[0m’ would not"
+
+#: builtins.c:1027
+msgid "return `file'."
+msgstr "return ‘\e[1mfile\e[0m’."
+
+#: builtins.c:1029
+msgid "If the -a flag is used, `type' displays all of the places that contain"
+msgstr ""
+"If the -a flag is used, ‘\e[1mtype\e[0m’ displays all of the places that contain"
+
+#: builtins.c:1030
+msgid "an executable named `file'.  This includes aliases, builtins, and"
+msgstr ""
+"an executable named ‘\e[1mfile\e[0m’.  This includes aliases, builtins, and"
+
+#: builtins.c:1031
+msgid "functions, if and only if the -p flag is not also used."
+msgstr "functions, if and only if the -p flag is not also used."
+
+#: builtins.c:1033
+msgid "The -f flag suppresses shell function lookup."
+msgstr "The -f flag suppresses shell function lookup."
+
+#: builtins.c:1035
+msgid "The -P flag forces a PATH search for each NAME, even if it is an alias,"
+msgstr ""
+"The -P flag forces a PATH search for each NAME, even if it is an alias,"
+
+#: builtins.c:1036
+msgid "builtin, or function, and returns the name of the disk file that would"
+msgstr "builtin, or function, and returns the name of the disk file that would"
+
+#: builtins.c:1037
+msgid "be executed."
+msgstr "be executed."
+
+#: builtins.c:1044
+msgid "Ulimit provides control over the resources available to processes"
+msgstr "Ulimit provides control over the resources available to processes"
+
+#: builtins.c:1045
+msgid "started by the shell, on systems that allow such control.  If an"
+msgstr "started by the shell, on systems that allow such control.  If an"
+
+#: builtins.c:1046
+msgid "option is given, it is interpreted as follows:"
+msgstr "option is given, it is interpreted as follows:"
+
+#: builtins.c:1048
+msgid "    -S\tuse the `soft' resource limit"
+msgstr "    -S\tuse the ‘\e[1msoft\e[0m’ resource limit"
+
+#: builtins.c:1049
+msgid "    -H\tuse the `hard' resource limit"
+msgstr "    -H\tuse the ‘\e[1mhard\e[0m’ resource limit"
+
+#: builtins.c:1050
+msgid "    -a\tall current limits are reported"
+msgstr "    -a\tall current limits are reported"
+
+#: builtins.c:1051
+msgid "    -c\tthe maximum size of core files created"
+msgstr "    -c\tthe maximum size of core files created"
+
+#: builtins.c:1052
+msgid "    -d\tthe maximum size of a process's data segment"
+msgstr "    -d\tthe maximum size of a process's data segment"
+
+#: builtins.c:1053
+msgid "    -f\tthe maximum size of files created by the shell"
+msgstr "    -f\tthe maximum size of files created by the shell"
+
+#: builtins.c:1054
+msgid "    -l\tthe maximum size a process may lock into memory"
+msgstr "    -l\tthe maximum size a process may lock into memory"
+
+#: builtins.c:1055
+msgid "    -m\tthe maximum resident set size"
+msgstr "    -m\tthe maximum resident set size"
+
+#: builtins.c:1056
+msgid "    -n\tthe maximum number of open file descriptors"
+msgstr "    -n\tthe maximum number of open file descriptors"
+
+#: builtins.c:1057
+msgid "    -p\tthe pipe buffer size"
+msgstr "    -p\tthe pipe buffer size"
+
+#: builtins.c:1058
+msgid "    -s\tthe maximum stack size"
+msgstr "    -s\tthe maximum stack size"
+
+#: builtins.c:1059
+msgid "    -t\tthe maximum amount of cpu time in seconds"
+msgstr "    -t\tthe maximum amount of cpu time in seconds"
+
+#: builtins.c:1060
+msgid "    -u\tthe maximum number of user processes"
+msgstr "    -u\tthe maximum number of user processes"
+
+#: builtins.c:1061
+msgid "    -v\tthe size of virtual memory"
+msgstr "    -v\tthe size of virtual memory"
+
+#: builtins.c:1063
+msgid "If LIMIT is given, it is the new value of the specified resource;"
+msgstr "If LIMIT is given, it is the new value of the specified resource;"
+
+#: builtins.c:1064
+msgid "the special LIMIT values `soft', `hard', and `unlimited' stand for"
+msgstr ""
+"the special LIMIT values ‘\e[1msoft\e[0m’, ‘\e[1mhard\e[0m’, and ‘\e[1munlimited\e[0m’ "
+"stand for"
+
+#: builtins.c:1065
+msgid ""
+"the current soft limit, the current hard limit, and no limit, respectively."
+msgstr ""
+"the current soft limit, the current hard limit, and no limit, respectively."
+
+#: builtins.c:1066
+msgid "Otherwise, the current value of the specified resource is printed."
+msgstr "Otherwise, the current value of the specified resource is printed."
+
+#: builtins.c:1067
+msgid "If no option is given, then -f is assumed.  Values are in 1024-byte"
+msgstr "If no option is given, then -f is assumed.  Values are in 1024-byte"
+
+#: builtins.c:1068
+msgid "increments, except for -t, which is in seconds, -p, which is in"
+msgstr "increments, except for -t, which is in seconds, -p, which is in"
+
+#: builtins.c:1069
+msgid "increments of 512 bytes, and -u, which is an unscaled number of"
+msgstr "increments of 512 bytes, and -u, which is an unscaled number of"
+
+#: builtins.c:1070
+msgid "processes."
+msgstr "processes."
+
+#: builtins.c:1077
+msgid "The user file-creation mask is set to MODE.  If MODE is omitted, or if"
+msgstr "The user file-creation mask is set to MODE.  If MODE is omitted, or if"
+
+#: builtins.c:1078
+msgid "`-S' is supplied, the current value of the mask is printed.  The `-S'"
+msgstr ""
+"‘\e[1m-S\e[0m’ is supplied, the current value of the mask is printed.  The ‘\e[1m-S\e"
+"[0m’"
+
+#: builtins.c:1079
+msgid "option makes the output symbolic; otherwise an octal number is output."
+msgstr "option makes the output symbolic; otherwise an octal number is output."
+
+#: builtins.c:1080
+msgid "If `-p' is supplied, and MODE is omitted, the output is in a form"
+msgstr ""
+"If ‘\e[1m-p\e[0m’ is supplied, and MODE is omitted, the output is in a form"
+
+#: builtins.c:1081
+msgid "that may be used as input.  If MODE begins with a digit, it is"
+msgstr "that may be used as input.  If MODE begins with a digit, it is"
+
+#: builtins.c:1082
+msgid "interpreted as an octal number, otherwise it is a symbolic mode string"
+msgstr "interpreted as an octal number, otherwise it is a symbolic mode string"
+
+#: builtins.c:1083
+msgid "like that accepted by chmod(1)."
+msgstr "like that accepted by chmod(1)."
+
+#: builtins.c:1090 builtins.c:1102
+msgid "Wait for the specified process and report its termination status.  If"
+msgstr "Wait for the specified process and report its termination status.  If"
+
+#: builtins.c:1091 builtins.c:1103
+msgid "N is not given, all currently active child processes are waited for,"
+msgstr "N is not given, all currently active child processes are waited for,"
+
+#: builtins.c:1092
+msgid "and the return code is zero.  N may be a process ID or a job"
+msgstr "and the return code is zero.  N may be a process ID or a job"
+
+#: builtins.c:1093
+msgid "specification; if a job spec is given, all processes in the job's"
+msgstr "specification; if a job spec is given, all processes in the job's"
+
+#: builtins.c:1094
+msgid "pipeline are waited for."
+msgstr "pipeline are waited for."
+
+#: builtins.c:1104
+msgid "and the return code is zero.  N is a process ID; if it is not given,"
+msgstr "and the return code is zero.  N is a process ID; if it is not given,"
+
+#: builtins.c:1105
+msgid "all child processes of the shell are waited for."
+msgstr "all child processes of the shell are waited for."
+
+#: builtins.c:1112
+msgid "The `for' loop executes a sequence of commands for each member in a"
+msgstr ""
+"The ‘\e[1mfor\e[0m’ loop executes a sequence of commands for each member in a"
+
+#: builtins.c:1113
+msgid "list of items.  If `in WORDS ...;' is not present, then `in \"$@\"' is"
+msgstr ""
+"list of items.  If ‘\e[1min WORDS ...;\e[0m’ is not present, then ‘\e[1min “\e[1m$@\e"
+"[0m”\e[0m’ is"
+
+#: builtins.c:1114
+msgid "assumed.  For each element in WORDS, NAME is set to that element, and"
+msgstr "assumed.  For each element in WORDS, NAME is set to that element, and"
+
+#: builtins.c:1115
+msgid "the COMMANDS are executed."
+msgstr "the COMMANDS are executed."
+
+#: builtins.c:1121
+msgid "Equivalent to"
+msgstr "Equivalent to"
+
+#: builtins.c:1122
+msgid "\t(( EXP1 ))"
+msgstr "\t(( EXP1 ))"
+
+#: builtins.c:1123
+msgid "\twhile (( EXP2 )); do"
+msgstr "\twhile (( EXP2 )); do"
+
+#: builtins.c:1124
+msgid "\t\tCOMMANDS"
+msgstr "\t\tCOMMANDS"
+
+#: builtins.c:1125
+msgid "\t\t(( EXP3 ))"
+msgstr "\t\t(( EXP3 ))"
+
+#: builtins.c:1126
+msgid "\tdone"
+msgstr "\tdone"
+
+#: builtins.c:1127
+msgid "EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is"
+msgstr "EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is"
+
+#: builtins.c:1128
+msgid "omitted, it behaves as if it evaluates to 1."
+msgstr "omitted, it behaves as if it evaluates to 1."
+
+#: builtins.c:1134
+msgid "The WORDS are expanded, generating a list of words.  The"
+msgstr "The WORDS are expanded, generating a list of words.  The"
+
+#: builtins.c:1135
+msgid "set of expanded words is printed on the standard error, each"
+msgstr "set of expanded words is printed on the standard error, each"
+
+#: builtins.c:1136
+msgid "preceded by a number.  If `in WORDS' is not present, `in \"$@\"'"
+msgstr ""
+"preceded by a number.  If ‘\e[1min WORDS\e[0m’ is not present, ‘\e[1min “\e[1m$@\e"
+"[0m”\e[0m’"
+
+#: builtins.c:1137
+msgid "is assumed.  The PS3 prompt is then displayed and a line read"
+msgstr "is assumed.  The PS3 prompt is then displayed and a line read"
+
+#: builtins.c:1138
+msgid "from the standard input.  If the line consists of the number"
+msgstr "from the standard input.  If the line consists of the number"
+
+#: builtins.c:1139
+msgid "corresponding to one of the displayed words, then NAME is set"
+msgstr "corresponding to one of the displayed words, then NAME is set"
+
+#: builtins.c:1140
+msgid "to that word.  If the line is empty, WORDS and the prompt are"
+msgstr "to that word.  If the line is empty, WORDS and the prompt are"
+
+#: builtins.c:1141
+msgid "redisplayed.  If EOF is read, the command completes.  Any other"
+msgstr "redisplayed.  If EOF is read, the command completes.  Any other"
+
+#: builtins.c:1142
+msgid "value read causes NAME to be set to null.  The line read is saved"
+msgstr "value read causes NAME to be set to null.  The line read is saved"
+
+#: builtins.c:1143
+msgid "in the variable REPLY.  COMMANDS are executed after each selection"
+msgstr "in the variable REPLY.  COMMANDS are executed after each selection"
+
+#: builtins.c:1144
+msgid "until a break command is executed."
+msgstr "until a break command is executed."
+
+#: builtins.c:1150
+msgid "Execute PIPELINE and print a summary of the real time, user CPU time,"
+msgstr "Execute PIPELINE and print a summary of the real time, user CPU time,"
+
+#: builtins.c:1151
+msgid "and system CPU time spent executing PIPELINE when it terminates."
+msgstr "and system CPU time spent executing PIPELINE when it terminates."
+
+#: builtins.c:1152
+msgid "The return status is the return status of PIPELINE.  The `-p' option"
+msgstr ""
+"The return status is the return status of PIPELINE.  The ‘\e[1m-p\e[0m’ option"
+
+#: builtins.c:1153
+msgid "prints the timing summary in a slightly different format.  This uses"
+msgstr "prints the timing summary in a slightly different format.  This uses"
+
+#: builtins.c:1154
+msgid "the value of the TIMEFORMAT variable as the output format."
+msgstr "the value of the TIMEFORMAT variable as the output format."
+
+#: builtins.c:1160
+msgid "Selectively execute COMMANDS based upon WORD matching PATTERN.  The"
+msgstr "Selectively execute COMMANDS based upon WORD matching PATTERN.  The"
+
+#: builtins.c:1161
+msgid "`|' is used to separate multiple patterns."
+msgstr "‘\e[1m|\e[0m’ is used to separate multiple patterns."
+
+#: builtins.c:1167
+msgid ""
+"The if COMMANDS are executed.  If the exit status is zero, then the then"
+msgstr ""
+"The if COMMANDS are executed.  If the exit status is zero, then the then"
+
+#: builtins.c:1168
+msgid ""
+"COMMANDS are executed.  Otherwise, each of the elif COMMANDS are executed"
+msgstr ""
+"COMMANDS are executed.  Otherwise, each of the elif COMMANDS are executed"
+
+#: builtins.c:1169
+msgid ""
+"in turn, and if the exit status is zero, the corresponding then COMMANDS"
+msgstr ""
+"in turn, and if the exit status is zero, the corresponding then COMMANDS"
+
+#: builtins.c:1170
+msgid ""
+"are executed and the if command completes.  Otherwise, the else COMMANDS"
+msgstr ""
+"are executed and the if command completes.  Otherwise, the else COMMANDS"
+
+#: builtins.c:1171
+msgid ""
+"are executed, if present.  The exit status is the exit status of the last"
+msgstr ""
+"are executed, if present.  The exit status is the exit status of the last"
+
+#: builtins.c:1172
+msgid "command executed, or zero if no condition tested true."
+msgstr "command executed, or zero if no condition tested true."
+
+#: builtins.c:1178 builtins.c:1185
+msgid "Expand and execute COMMANDS as long as the final command in the"
+msgstr "Expand and execute COMMANDS as long as the final command in the"
+
+#: builtins.c:1179
+msgid "`while' COMMANDS has an exit status of zero."
+msgstr "‘\e[1mwhile\e[0m’ COMMANDS has an exit status of zero."
+
+#: builtins.c:1186
+msgid "`until' COMMANDS has an exit status which is not zero."
+msgstr "‘\e[1muntil\e[0m’ COMMANDS has an exit status which is not zero."
+
+#: builtins.c:1192
+msgid "Create a simple command invoked by NAME which runs COMMANDS."
+msgstr "Create a simple command invoked by NAME which runs COMMANDS."
+
+#: builtins.c:1193
+msgid "Arguments on the command line along with NAME are passed to the"
+msgstr "Arguments on the command line along with NAME are passed to the"
+
+#: builtins.c:1194
+msgid "function as $0 .. $n."
+msgstr "function as $0 .. $n."
+
+#: builtins.c:1200
+msgid "Run a set of commands in a group.  This is one way to redirect an"
+msgstr "Run a set of commands in a group.  This is one way to redirect an"
+
+#: builtins.c:1201
+msgid "entire set of commands."
+msgstr "entire set of commands."
+
+#: builtins.c:1207
+msgid "This is similar to the `fg' command.  Resume a stopped or background"
+msgstr ""
+"This is similar to the ‘\e[1mfg\e[0m’ command.  Resume a stopped or background"
+
+#: builtins.c:1208
+msgid "job.  If you specifiy DIGITS, then that job is used.  If you specify"
+msgstr "job.  If you specifiy DIGITS, then that job is used.  If you specify"
+
+#: builtins.c:1209
+msgid "WORD, then the job whose name begins with WORD is used.  Following the"
+msgstr "WORD, then the job whose name begins with WORD is used.  Following the"
+
+#: builtins.c:1210
+msgid "job specification with a `&' places the job in the background."
+msgstr "job specification with a ‘\e[1m&\e[0m’ places the job in the background."
+
+#: builtins.c:1216
+msgid "The EXPRESSION is evaluated according to the rules for arithmetic"
+msgstr "The EXPRESSION is evaluated according to the rules for arithmetic"
+
+#: builtins.c:1217
+msgid "evaluation.  Equivalent to \"let EXPRESSION\"."
+msgstr "evaluation.  Equivalent to “\e[1mlet EXPRESSION\e[0m”."
+
+#: builtins.c:1223
+msgid ""
+"Returns a status of 0 or 1 depending on the evaluation of the conditional"
+msgstr ""
+"Returns a status of 0 or 1 depending on the evaluation of the conditional"
+
+#: builtins.c:1224
+msgid ""
+"expression EXPRESSION.  Expressions are composed of the same primaries used"
+msgstr ""
+"expression EXPRESSION.  Expressions are composed of the same primaries used"
+
+#: builtins.c:1225
+msgid ""
+"by the `test' builtin, and may be combined using the following operators"
+msgstr ""
+"by the ‘\e[1mtest\e[0m’ builtin, and may be combined using the following "
+"operators"
+
+#: builtins.c:1227
+msgid "\t( EXPRESSION )\tReturns the value of EXPRESSION"
+msgstr "\t( EXPRESSION )\tReturns the value of EXPRESSION"
+
+#: builtins.c:1228
+msgid "\t! EXPRESSION\tTrue if EXPRESSION is false; else false"
+msgstr "\t! EXPRESSION\tTrue if EXPRESSION is false; else false"
+
+#: builtins.c:1229
+msgid "\tEXPR1 && EXPR2\tTrue if both EXPR1 and EXPR2 are true; else false"
+msgstr "\tEXPR1 && EXPR2\tTrue if both EXPR1 and EXPR2 are true; else false"
+
+#: builtins.c:1230
+msgid "\tEXPR1 || EXPR2\tTrue if either EXPR1 or EXPR2 is true; else false"
+msgstr "\tEXPR1 || EXPR2\tTrue if either EXPR1 or EXPR2 is true; else false"
+
+#: builtins.c:1232
+msgid ""
+"When the `==' and `!=' operators are used, the string to the right of the"
+msgstr ""
+"When the ‘\e[1m==\e[0m’ and ‘\e[1m!=\e[0m’ operators are used, the string to the "
+"right of the"
+
+#: builtins.c:1233
+msgid "operator is used as a pattern and pattern matching is performed.  The"
+msgstr "operator is used as a pattern and pattern matching is performed.  The"
+
+#: builtins.c:1234
+msgid "&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to"
+msgstr "&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to"
+
+#: builtins.c:1235
+msgid "determine the expression's value."
+msgstr "determine the expression's value."
+
+#: builtins.c:1241
+msgid "BASH_VERSION    Version information for this Bash."
+msgstr "BASH_VERSION    Version information for this Bash."
+
+#: builtins.c:1242
+msgid "CDPATH          A colon separated list of directories to search"
+msgstr "CDPATH          A colon separated list of directories to search"
+
+#: builtins.c:1243
+msgid "\t\twhen the argument to `cd' is not found in the current"
+msgstr "\t\twhen the argument to ‘\e[1mcd\e[0m’ is not found in the current"
+
+#: builtins.c:1244
+msgid "\t\tdirectory."
+msgstr "\t\tdirectory."
+
+#: builtins.c:1245
+msgid "GLOBIGNORE\tA colon-separated list of patterns describing filenames to"
+msgstr "GLOBIGNORE\tA colon-separated list of patterns describing filenames to"
+
+#: builtins.c:1246
+msgid "\t\tbe ignored by pathname expansion."
+msgstr "\t\tbe ignored by pathname expansion."
+
+#: builtins.c:1248
+msgid ""
+"HISTFILE        The name of the file where your command history is stored."
+msgstr ""
+"HISTFILE        The name of the file where your command history is stored."
+
+#: builtins.c:1249
+msgid "HISTFILESIZE    The maximum number of lines this file can contain."
+msgstr "HISTFILESIZE    The maximum number of lines this file can contain."
+
+#: builtins.c:1250
+msgid "HISTSIZE        The maximum number of history lines that a running"
+msgstr "HISTSIZE        The maximum number of history lines that a running"
+
+#: builtins.c:1251
+msgid "\t\tshell can access."
+msgstr "\t\tshell can access."
+
+#: builtins.c:1253
+msgid "HOME            The complete pathname to your login directory."
+msgstr "HOME            The complete pathname to your login directory."
+
+#: builtins.c:1254
+msgid "HOSTNAME\tThe name of the current host."
+msgstr "HOSTNAME\tThe name of the current host."
+
+#: builtins.c:1255
+msgid "HOSTTYPE        The type of CPU this version of Bash is running under."
+msgstr "HOSTTYPE        The type of CPU this version of Bash is running under."
+
+#: builtins.c:1256
+msgid "IGNOREEOF       Controls the action of the shell on receipt of an EOF"
+msgstr "IGNOREEOF       Controls the action of the shell on receipt of an EOF"
+
+#: builtins.c:1257
+msgid "\t\tcharacter as the sole input.  If set, then the value"
+msgstr "\t\tcharacter as the sole input.  If set, then the value"
+
+#: builtins.c:1258
+msgid "\t\tof it is the number of EOF characters that can be seen"
+msgstr "\t\tof it is the number of EOF characters that can be seen"
+
+#: builtins.c:1259
+msgid "\t\tin a row on an empty line before the shell will exit"
+msgstr "\t\tin a row on an empty line before the shell will exit"
+
+#: builtins.c:1260
+msgid "\t\t(default 10).  When unset, EOF signifies the end of input."
+msgstr "\t\t(default 10).  When unset, EOF signifies the end of input."
+
+#: builtins.c:1261
+msgid "MACHTYPE\tA string describing the current system Bash is running on."
+msgstr "MACHTYPE\tA string describing the current system Bash is running on."
+
+#: builtins.c:1262
+msgid "MAILCHECK\tHow often, in seconds, Bash checks for new mail."
+msgstr "MAILCHECK\tHow often, in seconds, Bash checks for new mail."
+
+#: builtins.c:1263
+msgid "MAILPATH\tA colon-separated list of filenames which Bash checks"
+msgstr "MAILPATH\tA colon-separated list of filenames which Bash checks"
+
+#: builtins.c:1264
+msgid "\t\tfor new mail."
+msgstr "\t\tfor new mail."
+
+#: builtins.c:1265
+msgid "OSTYPE\t\tThe version of Unix this version of Bash is running on."
+msgstr "OSTYPE\t\tThe version of Unix this version of Bash is running on."
+
+#: builtins.c:1266
+msgid "PATH            A colon-separated list of directories to search when"
+msgstr "PATH            A colon-separated list of directories to search when"
+
+#: builtins.c:1267
+msgid "\t\tlooking for commands."
+msgstr "\t\tlooking for commands."
+
+#: builtins.c:1268
+msgid "PROMPT_COMMAND  A command to be executed before the printing of each"
+msgstr "PROMPT_COMMAND  A command to be executed before the printing of each"
+
+#: builtins.c:1269
+msgid "\t\tprimary prompt."
+msgstr "\t\tprimary prompt."
+
+#: builtins.c:1270
+msgid "PS1             The primary prompt string."
+msgstr "PS1             The primary prompt string."
+
+#: builtins.c:1271
+msgid "PS2             The secondary prompt string."
+msgstr "PS2             The secondary prompt string."
+
+#: builtins.c:1272
+msgid "PWD\t\tThe full pathname of the current directory."
+msgstr "PWD\t\tThe full pathname of the current directory."
+
+#: builtins.c:1273
+msgid "SHELLOPTS\tA colon-separated list of enabled shell options."
+msgstr "SHELLOPTS\tA colon-separated list of enabled shell options."
+
+#: builtins.c:1274
+msgid "TERM            The name of the current terminal type."
+msgstr "TERM            The name of the current terminal type."
+
+#: builtins.c:1275
+msgid "TIMEFORMAT\tThe output format for timing statistics displayed by the"
+msgstr "TIMEFORMAT\tThe output format for timing statistics displayed by the"
+
+#: builtins.c:1276
+msgid "\t\t`time' reserved word."
+msgstr "\t\t‘\e[1mtime\e[0m’ reserved word."
+
+#: builtins.c:1277
+msgid "auto_resume     Non-null means a command word appearing on a line by"
+msgstr "auto_resume     Non-null means a command word appearing on a line by"
+
+#: builtins.c:1278
+msgid "\t\titself is first looked for in the list of currently"
+msgstr "\t\titself is first looked for in the list of currently"
+
+#: builtins.c:1279
+msgid "\t\tstopped jobs.  If found there, that job is foregrounded."
+msgstr "\t\tstopped jobs.  If found there, that job is foregrounded."
+
+#: builtins.c:1280
+msgid "\t\tA value of `exact' means that the command word must"
+msgstr "\t\tA value of ‘\e[1mexact\e[0m’ means that the command word must"
+
+#: builtins.c:1281
+msgid "\t\texactly match a command in the list of stopped jobs.  A"
+msgstr "\t\texactly match a command in the list of stopped jobs.  A"
+
+#: builtins.c:1282
+msgid "\t\tvalue of `substring' means that the command word must"
+msgstr "\t\tvalue of ‘\e[1msubstring\e[0m’ means that the command word must"
+
+#: builtins.c:1283
+msgid "\t\tmatch a substring of the job.  Any other value means that"
+msgstr "\t\tmatch a substring of the job.  Any other value means that"
+
+#: builtins.c:1284
+msgid "\t\tthe command must be a prefix of a stopped job."
+msgstr "\t\tthe command must be a prefix of a stopped job."
+
+#: builtins.c:1287
+msgid "histchars       Characters controlling history expansion and quick"
+msgstr "histchars       Characters controlling history expansion and quick"
+
+#: builtins.c:1288
+msgid "\t\tsubstitution.  The first character is the history"
+msgstr "\t\tsubstitution.  The first character is the history"
+
+#: builtins.c:1289
+msgid "\t\tsubstitution character, usually `!'.  The second is"
+msgstr "\t\tsubstitution character, usually ‘\e[1m!\e[0m’.  The second is"
+
+#: builtins.c:1290
+msgid "\t\tthe `quick substitution' character, usually `^'.  The"
+msgstr "\t\tthe ‘\e[1mquick substitution\e[0m’ character, usually ‘\e[1m^\e[0m’.  The"
+
+#: builtins.c:1291
+msgid "\t\tthird is the `history comment' character, usually `#'."
+msgstr "\t\tthird is the ‘\e[1mhistory comment\e[0m’ character, usually ‘\e[1m#\e[0m’."
+
+#: builtins.c:1293
+msgid "HISTIGNORE\tA colon-separated list of patterns used to decide which"
+msgstr "HISTIGNORE\tA colon-separated list of patterns used to decide which"
+
+#: builtins.c:1294
+msgid "\t\tcommands should be saved on the history list."
+msgstr "\t\tcommands should be saved on the history list."
+
+#: builtins.c:1306
+msgid "+N\tRotates the stack so that the Nth directory (counting"
+msgstr "+N\tRotates the stack so that the Nth directory (counting"
+
+#: builtins.c:1307
+msgid "\tfrom the left of the list shown by `dirs', starting with"
+msgstr "\tfrom the left of the list shown by ‘\e[1mdirs\e[0m’, starting with"
+
+#: builtins.c:1308 builtins.c:1312
+msgid "\tzero) is at the top."
+msgstr "\tzero) is at the top."
+
+#: builtins.c:1310
+msgid "-N\tRotates the stack so that the Nth directory (counting"
+msgstr "-N\tRotates the stack so that the Nth directory (counting"
+
+#: builtins.c:1311
+msgid "\tfrom the right of the list shown by `dirs', starting with"
+msgstr "\tfrom the right of the list shown by ‘\e[1mdirs\e[0m’, starting with"
+
+#: builtins.c:1314
+msgid "-n\tsuppress the normal change of directory when adding directories"
+msgstr "-n\tsuppress the normal change of directory when adding directories"
+
+#: builtins.c:1315
+msgid "\tto the stack, so only the stack is manipulated."
+msgstr "\tto the stack, so only the stack is manipulated."
+
+#: builtins.c:1317
+msgid "dir\tadds DIR to the directory stack at the top, making it the"
+msgstr "dir\tadds DIR to the directory stack at the top, making it the"
+
+#: builtins.c:1318
+msgid "\tnew current working directory."
+msgstr "\tnew current working directory."
+
+#: builtins.c:1332
+msgid "+N\tremoves the Nth entry counting from the left of the list"
+msgstr "+N\tremoves the Nth entry counting from the left of the list"
+
+#: builtins.c:1333
+msgid "\tshown by `dirs', starting with zero.  For example: `popd +0'"
+msgstr ""
+"\tshown by ‘\e[1mdirs\e[0m’, starting with zero.  For example: ‘\e[1mpopd +0\e[0m’"
+
+#: builtins.c:1334
+msgid "\tremoves the first directory, `popd +1' the second."
+msgstr "\tremoves the first directory, ‘\e[1mpopd +1\e[0m’ the second."
+
+#: builtins.c:1336
+msgid "-N\tremoves the Nth entry counting from the right of the list"
+msgstr "-N\tremoves the Nth entry counting from the right of the list"
+
+#: builtins.c:1337
+msgid "\tshown by `dirs', starting with zero.  For example: `popd -0'"
+msgstr ""
+"\tshown by ‘\e[1mdirs\e[0m’, starting with zero.  For example: ‘\e[1mpopd -0\e[0m’"
+
+#: builtins.c:1338
+msgid "\tremoves the last directory, `popd -1' the next to last."
+msgstr "\tremoves the last directory, ‘\e[1mpopd -1\e[0m’ the next to last."
+
+#: builtins.c:1340
+msgid "-n\tsuppress the normal change of directory when removing directories"
+msgstr "-n\tsuppress the normal change of directory when removing directories"
+
+#: builtins.c:1341
+msgid "\tfrom the stack, so only the stack is manipulated."
+msgstr "\tfrom the stack, so only the stack is manipulated."
+
+#: builtins.c:1363
+msgid "+N\tdisplays the Nth entry counting from the left of the list shown by"
+msgstr "+N\tdisplays the Nth entry counting from the left of the list shown by"
+
+#: builtins.c:1364 builtins.c:1367
+msgid "\tdirs when invoked without options, starting with zero."
+msgstr "\tdirs when invoked without options, starting with zero."
+
+#: builtins.c:1366
+msgid "-N\tdisplays the Nth entry counting from the right of the list shown by"
+msgstr ""
+"-N\tdisplays the Nth entry counting from the right of the list shown by"
+
+#: builtins.c:1374
+msgid "Toggle the values of variables controlling optional behavior."
+msgstr "Toggle the values of variables controlling optional behavior."
+
+#: builtins.c:1375
+msgid "The -s flag means to enable (set) each OPTNAME; the -u flag"
+msgstr "The -s flag means to enable (set) each OPTNAME; the -u flag"
+
+#: builtins.c:1376
+msgid "unsets each OPTNAME.  The -q flag suppresses output; the exit"
+msgstr "unsets each OPTNAME.  The -q flag suppresses output; the exit"
+
+#: builtins.c:1377
+msgid "status indicates whether each OPTNAME is set or unset.  The -o"
+msgstr "status indicates whether each OPTNAME is set or unset.  The -o"
+
+#: builtins.c:1378
+msgid "option restricts the OPTNAMEs to those defined for use with"
+msgstr "option restricts the OPTNAMEs to those defined for use with"
+
+#: builtins.c:1379
+msgid "`set -o'.  With no options, or with the -p option, a list of all"
+msgstr "‘\e[1mset -o\e[0m’.  With no options, or with the -p option, a list of all"
+
+#: builtins.c:1380
+msgid "settable options is displayed, with an indication of whether or"
+msgstr "settable options is displayed, with an indication of whether or"
+
+#: builtins.c:1381
+msgid "not each is set."
+msgstr "not each is set."
+
+#: builtins.c:1387
+msgid "printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT"
+msgstr ""
+"printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT"
+
+#: builtins.c:1388
+msgid "is a character string which contains three types of objects: plain"
+msgstr "is a character string which contains three types of objects: plain"
+
+#: builtins.c:1389
+msgid ""
+"characters, which are simply copied to standard output, character escape"
+msgstr ""
+"characters, which are simply copied to standard output, character escape"
+
+#: builtins.c:1390
+msgid "sequences which are converted and copied to the standard output, and"
+msgstr "sequences which are converted and copied to the standard output, and"
+
+#: builtins.c:1391
+msgid ""
+"format specifications, each of which causes printing of the next successive"
+msgstr ""
+"format specifications, each of which causes printing of the next successive"
+
+#: builtins.c:1392
+msgid "argument.  In addition to the standard printf(1) formats, %b means to"
+msgstr "argument.  In addition to the standard printf(1) formats, %b means to"
+
+#: builtins.c:1393
+msgid "expand backslash escape sequences in the corresponding argument, and %q"
+msgstr ""
+"expand backslash escape sequences in the corresponding argument, and %q"
+
+#: builtins.c:1394
+msgid "means to quote the argument in a way that can be reused as shell input."
+msgstr ""
+"means to quote the argument in a way that can be reused as shell input."
+
+#: builtins.c:1401
+msgid "For each NAME, specify how arguments are to be completed."
+msgstr "For each NAME, specify how arguments are to be completed."
+
+#: builtins.c:1402
+msgid "If the -p option is supplied, or if no options are supplied, existing"
+msgstr "If the -p option is supplied, or if no options are supplied, existing"
+
+#: builtins.c:1403
+msgid "completion specifications are printed in a way that allows them to be"
+msgstr "completion specifications are printed in a way that allows them to be"
+
+#: builtins.c:1404
+msgid "reused as input.  The -r option removes a completion specification for"
+msgstr "reused as input.  The -r option removes a completion specification for"
+
+#: builtins.c:1405
+msgid "each NAME, or, if no NAMEs are supplied, all completion specifications."
+msgstr ""
+"each NAME, or, if no NAMEs are supplied, all completion specifications."
+
+#: builtins.c:1413
+msgid "Display the possible completions depending on the options.  Intended"
+msgstr "Display the possible completions depending on the options.  Intended"
+
+#: builtins.c:1414
+msgid ""
+"to be used from within a shell function generating possible completions."
+msgstr ""
+"to be used from within a shell function generating possible completions."
+
+#: builtins.c:1415
+msgid "If the optional WORD argument is supplied, matches against WORD are"
+msgstr "If the optional WORD argument is supplied, matches against WORD are"
+
+#: builtins.c:1416
+msgid "generated."
+msgstr "generated."
diff --git a/po/en@quot.gmo b/po/en@quot.gmo
new file mode 100644 (file)
index 0000000..0cb85e8
Binary files /dev/null and b/po/en@quot.gmo differ
diff --git a/po/en@quot.header b/po/en@quot.header
new file mode 100644 (file)
index 0000000..a9647fc
--- /dev/null
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/po/en@quot.po b/po/en@quot.po
new file mode 100644 (file)
index 0000000..eaa316c
--- /dev/null
@@ -0,0 +1,4278 @@
+# English translations for GNU bash package.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the GNU bash package.
+# Automatically generated, 2003.
+#
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+#: builtins/caller.def:128 builtins/caller.def:132 builtins/pushd.def:655
+#: builtins/pushd.def:663 builtins/pushd.def:666 builtins/pushd.def:676
+#: builtins/pushd.def:680 builtins/pushd.def:684 builtins/pushd.def:687
+#: builtins/pushd.def:690 builtins/pushd.def:699 builtins/pushd.def:703
+#: builtins/pushd.def:707 builtins/pushd.def:710 builtins.c:321 builtins.c:325
+#: builtins.c:390 builtins.c:392 builtins.c:401 builtins.c:404 builtins.c:408
+#: builtins.c:445 builtins.c:487 builtins.c:491 builtins.c:498 builtins.c:509
+#: builtins.c:513 builtins.c:552 builtins.c:555 builtins.c:559 builtins.c:562
+#: builtins.c:630 builtins.c:637 builtins.c:692 builtins.c:713 builtins.c:718
+#: builtins.c:722 builtins.c:745 builtins.c:835 builtins.c:919 builtins.c:921
+#: builtins.c:943 builtins.c:946 builtins.c:948 builtins.c:950 builtins.c:952
+#: builtins.c:954 builtins.c:957 builtins.c:966 builtins.c:968 builtins.c:973
+#: builtins.c:976 builtins.c:1019 builtins.c:1024 builtins.c:1028
+#: builtins.c:1032 builtins.c:1034 builtins.c:1047 builtins.c:1062
+#: builtins.c:1226 builtins.c:1231 builtins.c:1305 builtins.c:1309
+#: builtins.c:1313 builtins.c:1316 builtins.c:1319 builtins.c:1331
+#: builtins.c:1335 builtins.c:1339 builtins.c:1342 builtins.c:1354
+#: builtins.c:1362 builtins.c:1365
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU bash 3.0-alpha\n"
+"POT-Creation-Date: 2003-12-22 15:34-0500\n"
+"PO-Revision-Date: 2003-12-22 15:34-0500\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Report-Msgid-Bugs-To: bug-bash@gnu.org\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: arrayfunc.c:45
+msgid "bad array subscript"
+msgstr "bad array subscript"
+
+#: arrayfunc.c:306
+#, c-format
+msgid "%s: cannot assign to non-numeric index"
+msgstr "%s: cannot assign to non-numeric index"
+
+#: bashhist.c:321
+#, c-format
+msgid "%s: cannot create: %s"
+msgstr "%s: cannot create: %s"
+
+#: bashline.c:2791
+msgid "bash_execute_unix_command: cannot find keymap for command"
+msgstr "bash_execute_unix_command: cannot find keymap for command"
+
+#: bashline.c:2840
+#, c-format
+msgid "%s: first non-whitespace character is not `\"'"
+msgstr "%s: first non-whitespace character is not ‘\"’"
+
+#: bashline.c:2869
+#, c-format
+msgid "no closing `%c' in %s"
+msgstr "no closing ‘%c’ in %s"
+
+#: bashline.c:2903
+#, c-format
+msgid "%s: missing colon separator"
+msgstr "%s: missing colon separator"
+
+#: builtins/bind.def:194
+#, c-format
+msgid "`%s': invalid keymap name"
+msgstr "‘%s’: invalid keymap name"
+
+#: builtins/bind.def:233
+#, c-format
+msgid "%s: cannot read: %s"
+msgstr "%s: cannot read: %s"
+
+#: builtins/bind.def:248
+#, c-format
+msgid "`%s': cannot unbind"
+msgstr "‘%s’: cannot unbind"
+
+#: builtins/bind.def:283
+#, c-format
+msgid "`%s': unknown function name"
+msgstr "‘%s’: unknown function name"
+
+#: builtins/bind.def:291
+#, c-format
+msgid "%s is not bound to any keys.\n"
+msgstr "%s is not bound to any keys.\n"
+
+#: builtins/bind.def:295
+#, c-format
+msgid "%s can be invoked via "
+msgstr "%s can be invoked via "
+
+#: builtins/break.def:128
+msgid "only meaningful in a `for', `while', or `until' loop"
+msgstr "only meaningful in a ‘for’, ‘while’, or ‘until’ loop"
+
+#: builtins/caller.def:127 builtins.c:320
+msgid "Returns the context of the current subroutine call."
+msgstr "Returns the context of the current subroutine call."
+
+#: builtins/caller.def:129 builtins.c:322
+msgid "Without EXPR, returns returns \"$line $filename\".  With EXPR,"
+msgstr "Without EXPR, returns returns “$line $filename”.  With EXPR,"
+
+#: builtins/caller.def:130 builtins.c:323
+msgid "returns \"$line $subroutine $filename\"; this extra information"
+msgstr "returns “$line $subroutine $filename”; this extra information"
+
+#: builtins/caller.def:131 builtins.c:324
+msgid "can be used used to provide a stack trace."
+msgstr "can be used used to provide a stack trace."
+
+#: builtins/caller.def:133 builtins.c:326
+msgid "The value of EXPR indicates how many call frames to go back before the"
+msgstr "The value of EXPR indicates how many call frames to go back before the"
+
+#: builtins/caller.def:134 builtins.c:327
+msgid "current one; the top frame is frame 0."
+msgstr "current one; the top frame is frame 0."
+
+#: builtins/cd.def:188
+msgid "HOME not set"
+msgstr "HOME not set"
+
+#: builtins/cd.def:200
+msgid "OLDPWD not set"
+msgstr "OLDPWD not set"
+
+#: builtins/cd.def:350
+#, c-format
+msgid "write error: %s"
+msgstr "write error: %s"
+
+#: builtins/common.c:133 test.c:921
+msgid "too many arguments"
+msgstr "too many arguments"
+
+#: builtins/common.c:157 shell.c:465 shell.c:737
+#, c-format
+msgid "%s: option requires an argument"
+msgstr "%s: option requires an argument"
+
+#: builtins/common.c:164
+#, c-format
+msgid "%s: numeric argument required"
+msgstr "%s: numeric argument required"
+
+#: builtins/common.c:171
+#, c-format
+msgid "%s: not found"
+msgstr "%s: not found"
+
+#: builtins/common.c:180 shell.c:750
+#, c-format
+msgid "%s: invalid option"
+msgstr "%s: invalid option"
+
+#: builtins/common.c:187
+#, c-format
+msgid "%s: invalid option name"
+msgstr "%s: invalid option name"
+
+#: builtins/common.c:194 general.c:229 general.c:234
+#, c-format
+msgid "`%s': not a valid identifier"
+msgstr "‘%s’: not a valid identifier"
+
+#: builtins/common.c:201
+#, c-format
+msgid "%s: invalid number"
+msgstr "%s: invalid number"
+
+#: builtins/common.c:208
+#, c-format
+msgid "%s: invalid signal specification"
+msgstr "%s: invalid signal specification"
+
+#: builtins/common.c:215
+#, c-format
+msgid "`%s': not a pid or valid job spec"
+msgstr "‘%s’: not a pid or valid job spec"
+
+#: builtins/common.c:222 error.c:453
+#, c-format
+msgid "%s: readonly variable"
+msgstr "%s: readonly variable"
+
+#: builtins/common.c:230
+#, c-format
+msgid "%s: %s out of range"
+msgstr "%s: %s out of range"
+
+#: builtins/common.c:230 builtins/common.c:232
+msgid "argument"
+msgstr "argument"
+
+#: builtins/common.c:232
+#, c-format
+msgid "%s out of range"
+msgstr "%s out of range"
+
+#: builtins/common.c:240
+#, c-format
+msgid "%s: no such job"
+msgstr "%s: no such job"
+
+#: builtins/common.c:248
+#, c-format
+msgid "%s: no job control"
+msgstr "%s: no job control"
+
+#: builtins/common.c:250
+msgid "no job control"
+msgstr "no job control"
+
+#: builtins/common.c:260
+#, c-format
+msgid "%s: restricted"
+msgstr "%s: restricted"
+
+#: builtins/common.c:262
+msgid "restricted"
+msgstr "restricted"
+
+#: builtins/common.c:270
+#, c-format
+msgid "%s: not a shell builtin"
+msgstr "%s: not a shell builtin"
+
+#: builtins/common.c:481
+#, c-format
+msgid "%s: could not get current directory: %s: %s\n"
+msgstr "%s: could not get current directory: %s: %s\n"
+
+#: builtins/common.c:548 builtins/common.c:550
+#, c-format
+msgid "%s: ambiguous job spec"
+msgstr "%s: ambiguous job spec"
+
+#: builtins/complete.def:251
+#, c-format
+msgid "%s: invalid action name"
+msgstr "%s: invalid action name"
+
+#: builtins/complete.def:381 builtins/complete.def:524
+#, c-format
+msgid "%s: no completion specification"
+msgstr "%s: no completion specification"
+
+#: builtins/complete.def:571
+msgid "warning: -F option may not work as you expect"
+msgstr "warning: -F option may not work as you expect"
+
+#: builtins/complete.def:573
+msgid "warning: -C option may not work as you expect"
+msgstr "warning: -C option may not work as you expect"
+
+#: builtins/declare.def:105
+msgid "can only be used in a function"
+msgstr "can only be used in a function"
+
+#: builtins/declare.def:295
+msgid "cannot use `-f' to make functions"
+msgstr "cannot use ‘-f’ to make functions"
+
+#: builtins/declare.def:307 execute_cmd.c:3949
+#, c-format
+msgid "%s: readonly function"
+msgstr "%s: readonly function"
+
+#: builtins/declare.def:389
+#, c-format
+msgid "%s: cannot destroy array variables in this way"
+msgstr "%s: cannot destroy array variables in this way"
+
+#: builtins/enable.def:128 builtins/enable.def:136
+msgid "dynamic loading not available"
+msgstr "dynamic loading not available"
+
+#: builtins/enable.def:303
+#, c-format
+msgid "cannot open shared object %s: %s"
+msgstr "cannot open shared object %s: %s"
+
+#: builtins/enable.def:326
+#, c-format
+msgid "cannot find %s in shared object %s: %s"
+msgstr "cannot find %s in shared object %s: %s"
+
+#: builtins/enable.def:450
+#, c-format
+msgid "%s: not dynamically loaded"
+msgstr "%s: not dynamically loaded"
+
+#: builtins/enable.def:465
+#, c-format
+msgid "%s: cannot delete: %s"
+msgstr "%s: cannot delete: %s"
+
+#: builtins/evalfile.c:128 execute_cmd.c:3821 shell.c:1395
+#, c-format
+msgid "%s: is a directory"
+msgstr "%s: is a directory"
+
+#: builtins/evalfile.c:133
+#, c-format
+msgid "%s: not a regular file"
+msgstr "%s: not a regular file"
+
+#: builtins/evalfile.c:141
+#, c-format
+msgid "%s: file is too large"
+msgstr "%s: file is too large"
+
+#: builtins/exec.def:205
+#, c-format
+msgid "%s: cannot execute: %s"
+msgstr "%s: cannot execute: %s"
+
+#: builtins/exit.def:83
+msgid "not login shell: use `exit'"
+msgstr "not login shell: use ‘exit’"
+
+#: builtins/exit.def:111
+msgid "There are stopped jobs.\n"
+msgstr "There are stopped jobs.\n"
+
+#: builtins/fc.def:252
+msgid "no command found"
+msgstr "no command found"
+
+#: builtins/fc.def:317
+msgid "history specification"
+msgstr "history specification"
+
+#: builtins/fc.def:338
+#, c-format
+msgid "%s: cannot open temp file: %s"
+msgstr "%s: cannot open temp file: %s"
+
+#: builtins/fg_bg.def:133
+#, c-format
+msgid "job %d started without job control"
+msgstr "job %d started without job control"
+
+#: builtins/getopt.c:109
+#, c-format
+msgid "%s: illegal option -- %c\n"
+msgstr "%s: illegal option -- %c\n"
+
+#: builtins/getopt.c:110
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: option requires an argument -- %c\n"
+
+#: builtins/hash.def:83
+msgid "hashing disabled"
+msgstr "hashing disabled"
+
+#: builtins/hash.def:128
+#, c-format
+msgid "%s: hash table empty\n"
+msgstr "%s: hash table empty\n"
+
+#: builtins/help.def:108
+msgid "Shell commands matching keywords `"
+msgstr "Shell commands matching keywords `"
+
+#: builtins/help.def:110
+msgid "Shell commands matching keyword `"
+msgstr "Shell commands matching keyword `"
+
+#: builtins/help.def:138
+#, c-format
+msgid ""
+"no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."
+msgstr ""
+"no help topics match ‘%s’.  Try ‘help help’ or ‘man -k %s’ or ‘info %s’."
+
+#: builtins/help.def:164
+#, c-format
+msgid "%s: cannot open: %s"
+msgstr "%s: cannot open: %s"
+
+#: builtins/help.def:182
+msgid ""
+"These shell commands are defined internally.  Type `help' to see this list.\n"
+"Type `help name' to find out more about the function `name'.\n"
+"Use `info bash' to find out more about the shell in general.\n"
+"Use `man -k' or `info' to find out more about commands not in this list.\n"
+"\n"
+"A star (*) next to a name means that the command is disabled.\n"
+"\n"
+msgstr ""
+"These shell commands are defined internally.  Type ‘help’ to see this list.\n"
+"Type ‘help name’ to find out more about the function ‘name’.\n"
+"Use ‘info bash’ to find out more about the shell in general.\n"
+"Use ‘man -k’ or ‘info’ to find out more about commands not in this list.\n"
+"\n"
+"A star (*) next to a name means that the command is disabled.\n"
+"\n"
+
+#: builtins/history.def:148
+msgid "cannot use more than one of -anrw"
+msgstr "cannot use more than one of -anrw"
+
+#: builtins/history.def:180
+msgid "history position"
+msgstr "history position"
+
+#: builtins/history.def:390
+#, c-format
+msgid "%s: history expansion failed"
+msgstr "%s: history expansion failed"
+
+#: builtins/jobs.def:102
+msgid "no other options allowed with `-x'"
+msgstr "no other options allowed with ‘-x’"
+
+#: builtins/kill.def:187
+#, c-format
+msgid "%s: arguments must be process or job IDs"
+msgstr "%s: arguments must be process or job IDs"
+
+#: builtins/kill.def:248
+msgid "Unknown error"
+msgstr "Unknown error"
+
+#: builtins/let.def:94 builtins/let.def:119 expr.c:496 expr.c:511
+msgid "expression expected"
+msgstr "expression expected"
+
+#: builtins/printf.def:249
+#, c-format
+msgid "`%s': missing format character"
+msgstr "‘%s’: missing format character"
+
+#: builtins/printf.def:408
+#, c-format
+msgid "`%c': invalid format character"
+msgstr "‘%c’: invalid format character"
+
+#: builtins/printf.def:601
+msgid "missing hex digit for \\x"
+msgstr "missing hex digit for \\x"
+
+#: builtins/pushd.def:168
+msgid "no other directory"
+msgstr "no other directory"
+
+#: builtins/pushd.def:435
+msgid "<no current directory>"
+msgstr "<no current directory>"
+
+#: builtins/pushd.def:652 builtins.c:1351
+msgid "Display the list of currently remembered directories.  Directories"
+msgstr "Display the list of currently remembered directories.  Directories"
+
+#: builtins/pushd.def:653 builtins.c:1352
+msgid "find their way onto the list with the `pushd' command; you can get"
+msgstr "find their way onto the list with the ‘pushd’ command; you can get"
+
+#: builtins/pushd.def:654 builtins.c:1353
+msgid "back up through the list with the `popd' command."
+msgstr "back up through the list with the ‘popd’ command."
+
+#: builtins/pushd.def:656 builtins.c:1355
+msgid "The -l flag specifies that `dirs' should not print shorthand versions"
+msgstr "The -l flag specifies that ‘dirs’ should not print shorthand versions"
+
+#: builtins/pushd.def:657 builtins.c:1356
+msgid "of directories which are relative to your home directory.  This means"
+msgstr "of directories which are relative to your home directory.  This means"
+
+#: builtins/pushd.def:658 builtins.c:1357
+msgid "that `~/bin' might be displayed as `/homes/bfox/bin'.  The -v flag"
+msgstr "that ‘~/bin’ might be displayed as ‘/homes/bfox/bin’.  The -v flag"
+
+#: builtins/pushd.def:659 builtins.c:1358
+msgid "causes `dirs' to print the directory stack with one entry per line,"
+msgstr "causes ‘dirs’ to print the directory stack with one entry per line,"
+
+#: builtins/pushd.def:660 builtins.c:1359
+msgid "prepending the directory name with its position in the stack.  The -p"
+msgstr "prepending the directory name with its position in the stack.  The -p"
+
+#: builtins/pushd.def:661 builtins.c:1360
+msgid "flag does the same thing, but the stack position is not prepended."
+msgstr "flag does the same thing, but the stack position is not prepended."
+
+#: builtins/pushd.def:662 builtins.c:1361
+msgid "The -c flag clears the directory stack by deleting all of the elements."
+msgstr ""
+"The -c flag clears the directory stack by deleting all of the elements."
+
+#: builtins/pushd.def:664
+msgid "+N   displays the Nth entry counting from the left of the list shown by"
+msgstr ""
+"+N   displays the Nth entry counting from the left of the list shown by"
+
+#: builtins/pushd.def:665 builtins/pushd.def:668
+msgid "     dirs when invoked without options, starting with zero."
+msgstr "     dirs when invoked without options, starting with zero."
+
+#: builtins/pushd.def:667
+msgid ""
+"-N   displays the Nth entry counting from the right of the list shown by"
+msgstr ""
+"-N   displays the Nth entry counting from the right of the list shown by"
+
+#: builtins/pushd.def:673 builtins.c:1302
+msgid "Adds a directory to the top of the directory stack, or rotates"
+msgstr "Adds a directory to the top of the directory stack, or rotates"
+
+#: builtins/pushd.def:674 builtins.c:1303
+msgid "the stack, making the new top of the stack the current working"
+msgstr "the stack, making the new top of the stack the current working"
+
+#: builtins/pushd.def:675 builtins.c:1304
+msgid "directory.  With no arguments, exchanges the top two directories."
+msgstr "directory.  With no arguments, exchanges the top two directories."
+
+#: builtins/pushd.def:677
+msgid "+N   Rotates the stack so that the Nth directory (counting"
+msgstr "+N   Rotates the stack so that the Nth directory (counting"
+
+#: builtins/pushd.def:678
+msgid "     from the left of the list shown by `dirs', starting with"
+msgstr "     from the left of the list shown by ‘dirs’, starting with"
+
+#: builtins/pushd.def:679 builtins/pushd.def:683
+msgid "     zero) is at the top."
+msgstr "     zero) is at the top."
+
+#: builtins/pushd.def:681
+msgid "-N   Rotates the stack so that the Nth directory (counting"
+msgstr "-N   Rotates the stack so that the Nth directory (counting"
+
+#: builtins/pushd.def:682
+msgid "     from the right of the list shown by `dirs', starting with"
+msgstr "     from the right of the list shown by ‘dirs’, starting with"
+
+#: builtins/pushd.def:685
+msgid "-n   suppress the normal change of directory when adding directories"
+msgstr "-n   suppress the normal change of directory when adding directories"
+
+#: builtins/pushd.def:686
+msgid "     to the stack, so only the stack is manipulated."
+msgstr "     to the stack, so only the stack is manipulated."
+
+#: builtins/pushd.def:688
+msgid "dir  adds DIR to the directory stack at the top, making it the"
+msgstr "dir  adds DIR to the directory stack at the top, making it the"
+
+#: builtins/pushd.def:689
+msgid "     new current working directory."
+msgstr "     new current working directory."
+
+#: builtins/pushd.def:691 builtins/pushd.def:711 builtins.c:1320
+#: builtins.c:1343
+msgid "You can see the directory stack with the `dirs' command."
+msgstr "You can see the directory stack with the ‘dirs’ command."
+
+#: builtins/pushd.def:696 builtins.c:1328
+msgid "Removes entries from the directory stack.  With no arguments,"
+msgstr "Removes entries from the directory stack.  With no arguments,"
+
+#: builtins/pushd.def:697 builtins.c:1329
+msgid "removes the top directory from the stack, and cd's to the new"
+msgstr "removes the top directory from the stack, and cd's to the new"
+
+#: builtins/pushd.def:698 builtins.c:1330
+msgid "top directory."
+msgstr "top directory."
+
+#: builtins/pushd.def:700
+msgid "+N   removes the Nth entry counting from the left of the list"
+msgstr "+N   removes the Nth entry counting from the left of the list"
+
+#: builtins/pushd.def:701
+msgid "     shown by `dirs', starting with zero.  For example: `popd +0'"
+msgstr "     shown by ‘dirs’, starting with zero.  For example: ‘popd +0’"
+
+#: builtins/pushd.def:702
+msgid "     removes the first directory, `popd +1' the second."
+msgstr "     removes the first directory, ‘popd +1’ the second."
+
+#: builtins/pushd.def:704
+msgid "-N   removes the Nth entry counting from the right of the list"
+msgstr "-N   removes the Nth entry counting from the right of the list"
+
+#: builtins/pushd.def:705
+msgid "     shown by `dirs', starting with zero.  For example: `popd -0'"
+msgstr "     shown by ‘dirs’, starting with zero.  For example: ‘popd -0’"
+
+#: builtins/pushd.def:706
+msgid "     removes the last directory, `popd -1' the next to last."
+msgstr "     removes the last directory, ‘popd -1’ the next to last."
+
+#: builtins/pushd.def:708
+msgid "-n   suppress the normal change of directory when removing directories"
+msgstr "-n   suppress the normal change of directory when removing directories"
+
+#: builtins/pushd.def:709
+msgid "     from the stack, so only the stack is manipulated."
+msgstr "     from the stack, so only the stack is manipulated."
+
+#: builtins/read.def:207
+#, c-format
+msgid "%s: invalid timeout specification"
+msgstr "%s: invalid timeout specification"
+
+#: builtins/read.def:230
+#, c-format
+msgid "%s: invalid file descriptor specification"
+msgstr "%s: invalid file descriptor specification"
+
+#: builtins/read.def:237
+#, c-format
+msgid "%d: invalid file descriptor: %s"
+msgstr "%d: invalid file descriptor: %s"
+
+#: builtins/read.def:463
+#, c-format
+msgid "read error: %d: %s"
+msgstr "read error: %d: %s"
+
+#: builtins/return.def:63
+msgid "can only `return' from a function or sourced script"
+msgstr "can only ‘return’ from a function or sourced script"
+
+#: builtins/set.def:743
+msgid "cannot simultaneously unset a function and a variable"
+msgstr "cannot simultaneously unset a function and a variable"
+
+#: builtins/set.def:780
+#, c-format
+msgid "%s: cannot unset"
+msgstr "%s: cannot unset"
+
+#: builtins/set.def:787
+#, c-format
+msgid "%s: cannot unset: readonly %s"
+msgstr "%s: cannot unset: readonly %s"
+
+#: builtins/set.def:798
+#, c-format
+msgid "%s: not an array variable"
+msgstr "%s: not an array variable"
+
+#: builtins/setattr.def:165
+#, c-format
+msgid "%s: not a function"
+msgstr "%s: not a function"
+
+#: builtins/shift.def:66 builtins/shift.def:72
+msgid "shift count"
+msgstr "shift count"
+
+#: builtins/shopt.def:226
+msgid "cannot set and unset shell options simultaneously"
+msgstr "cannot set and unset shell options simultaneously"
+
+#: builtins/shopt.def:291
+#, c-format
+msgid "%s: invalid shell option name"
+msgstr "%s: invalid shell option name"
+
+#: builtins/source.def:117
+msgid "filename argument required"
+msgstr "filename argument required"
+
+#: builtins/source.def:137
+#, c-format
+msgid "%s: file not found"
+msgstr "%s: file not found"
+
+#: builtins/suspend.def:93
+msgid "cannot suspend"
+msgstr "cannot suspend"
+
+#: builtins/suspend.def:103
+msgid "cannot suspend a login shell"
+msgstr "cannot suspend a login shell"
+
+#: builtins/type.def:231
+#, c-format
+msgid "%s is aliased to `%s'\n"
+msgstr "%s is aliased to ‘%s’\n"
+
+#: builtins/type.def:252
+#, c-format
+msgid "%s is a shell keyword\n"
+msgstr "%s is a shell keyword\n"
+
+#: builtins/type.def:272
+#, c-format
+msgid "%s is a function\n"
+msgstr "%s is a function\n"
+
+#: builtins/type.def:297
+#, c-format
+msgid "%s is a shell builtin\n"
+msgstr "%s is a shell builtin\n"
+
+#: builtins/type.def:318
+#, c-format
+msgid "%s is %s\n"
+msgstr "%s is %s\n"
+
+#: builtins/type.def:338
+#, c-format
+msgid "%s is hashed (%s)\n"
+msgstr "%s is hashed (%s)\n"
+
+#: builtins/ulimit.def:332
+#, c-format
+msgid "%s: invalid limit argument"
+msgstr "%s: invalid limit argument"
+
+#: builtins/ulimit.def:358
+#, c-format
+msgid "`%c': bad command"
+msgstr "‘%c’: bad command"
+
+#: builtins/ulimit.def:387
+#, c-format
+msgid "%s: cannot get limit: %s"
+msgstr "%s: cannot get limit: %s"
+
+#: builtins/ulimit.def:425
+#, c-format
+msgid "%s: cannot modify limit: %s"
+msgstr "%s: cannot modify limit: %s"
+
+#: builtins/umask.def:112
+msgid "octal number"
+msgstr "octal number"
+
+#: builtins/umask.def:226
+#, c-format
+msgid "`%c': invalid symbolic mode operator"
+msgstr "‘%c’: invalid symbolic mode operator"
+
+#: builtins/umask.def:279
+#, c-format
+msgid "`%c': invalid symbolic mode character"
+msgstr "‘%c’: invalid symbolic mode character"
+
+#: error.c:165
+#, c-format
+msgid "last command: %s\n"
+msgstr "last command: %s\n"
+
+#: error.c:173
+msgid "Aborting..."
+msgstr "Aborting..."
+
+#: error.c:260
+#, c-format
+msgid "%s: warning: "
+msgstr "%s: warning: "
+
+#: error.c:405
+msgid "unknown command error"
+msgstr "unknown command error"
+
+#: error.c:406
+msgid "bad command type"
+msgstr "bad command type"
+
+#: error.c:407
+msgid "bad connector"
+msgstr "bad connector"
+
+#: error.c:408
+msgid "bad jump"
+msgstr "bad jump"
+
+#: error.c:446
+#, c-format
+msgid "%s: unbound variable"
+msgstr "%s: unbound variable"
+
+#: eval.c:175
+msgid "\atimed out waiting for input: auto-logout\n"
+msgstr "\atimed out waiting for input: auto-logout\n"
+
+#: execute_cmd.c:466
+#, c-format
+msgid "cannot redirect standard input from /dev/null: %s"
+msgstr "cannot redirect standard input from /dev/null: %s"
+
+#: execute_cmd.c:1036
+#, c-format
+msgid "TIMEFORMAT: `%c': invalid format character"
+msgstr "TIMEFORMAT: ‘%c’: invalid format character"
+
+#: execute_cmd.c:3521
+#, c-format
+msgid "%s: restricted: cannot specify `/' in command names"
+msgstr "%s: restricted: cannot specify ‘/’ in command names"
+
+#: execute_cmd.c:3609
+#, c-format
+msgid "%s: command not found"
+msgstr "%s: command not found"
+
+#: execute_cmd.c:3839
+#, c-format
+msgid "%s: %s: bad interpreter"
+msgstr "%s: %s: bad interpreter"
+
+#: execute_cmd.c:3876
+#, c-format
+msgid "%s: cannot execute binary file"
+msgstr "%s: cannot execute binary file"
+
+#: execute_cmd.c:3988
+#, c-format
+msgid "cannot duplicate fd %d to fd %d"
+msgstr "cannot duplicate fd %d to fd %d"
+
+#: expr.c:239
+msgid "expression recursion level exceeded"
+msgstr "expression recursion level exceeded"
+
+#: expr.c:263
+msgid "recursion stack underflow"
+msgstr "recursion stack underflow"
+
+#: expr.c:374
+msgid "syntax error in expression"
+msgstr "syntax error in expression"
+
+#: expr.c:414
+msgid "attempted assignment to non-variable"
+msgstr "attempted assignment to non-variable"
+
+#: expr.c:435 expr.c:440 expr.c:750
+msgid "division by 0"
+msgstr "division by 0"
+
+#: expr.c:466
+msgid "bug: bad expassign token"
+msgstr "bug: bad expassign token"
+
+#: expr.c:508
+msgid "`:' expected for conditional expression"
+msgstr "‘:’ expected for conditional expression"
+
+#: expr.c:775
+msgid "exponent less than 0"
+msgstr "exponent less than 0"
+
+#: expr.c:819
+msgid "identifier expected after pre-increment or pre-decrement"
+msgstr "identifier expected after pre-increment or pre-decrement"
+
+#: expr.c:847
+msgid "missing `)'"
+msgstr "missing ‘)’"
+
+#: expr.c:871
+msgid "syntax error: operand expected"
+msgstr "syntax error: operand expected"
+
+#: expr.c:1146
+msgid "invalid number"
+msgstr "invalid number"
+
+#: expr.c:1150
+msgid "invalid arithmetic base"
+msgstr "invalid arithmetic base"
+
+#: expr.c:1170
+msgid "value too great for base"
+msgstr "value too great for base"
+
+#: general.c:60
+msgid "getcwd: cannot access parent directories"
+msgstr "getcwd: cannot access parent directories"
+
+#: input.c:231
+#, c-format
+msgid "cannot allocate new file descriptor for bash input from fd %d"
+msgstr "cannot allocate new file descriptor for bash input from fd %d"
+
+#: input.c:239
+#, c-format
+msgid "save_bash_input: buffer already exists for new fd %d"
+msgstr "save_bash_input: buffer already exists for new fd %d"
+
+#: jobs.c:693
+#, c-format
+msgid "deleting stopped job %d with process group %ld"
+msgstr "deleting stopped job %d with process group %ld"
+
+#: jobs.c:1001
+#, c-format
+msgid "describe_pid: %ld: no such pid"
+msgstr "describe_pid: %ld: no such pid"
+
+#: jobs.c:1632 nojobs.c:648
+#, c-format
+msgid "wait: pid %ld is not a child of this shell"
+msgstr "wait: pid %ld is not a child of this shell"
+
+#: jobs.c:1815
+#, c-format
+msgid "wait_for: No record of process %ld"
+msgstr "wait_for: No record of process %ld"
+
+#: jobs.c:2062
+#, c-format
+msgid "wait_for_job: job %d is stopped"
+msgstr "wait_for_job: job %d is stopped"
+
+#: jobs.c:2284
+#, c-format
+msgid "%s: job has terminated"
+msgstr "%s: job has terminated"
+
+#: jobs.c:2293
+#, c-format
+msgid "%s: job %d already in background"
+msgstr "%s: job %d already in background"
+
+#: jobs.c:3037
+msgid "no job control in this shell"
+msgstr "no job control in this shell"
+
+#: lib/malloc/malloc.c:298
+#, c-format
+msgid "malloc: failed assertion: %s\n"
+msgstr "malloc: failed assertion: %s\n"
+
+#: lib/malloc/malloc.c:314
+#, c-format
+msgid ""
+"\r\n"
+"malloc: %s:%d: assertion botched\r\n"
+msgstr ""
+"\r\n"
+"malloc: %s:%d: assertion botched\r\n"
+
+#: lib/malloc/malloc.c:740
+msgid "malloc: block on free list clobbered"
+msgstr "malloc: block on free list clobbered"
+
+#: lib/malloc/malloc.c:817
+msgid "free: called with already freed block argument"
+msgstr "free: called with already freed block argument"
+
+#: lib/malloc/malloc.c:820
+msgid "free: called with unallocated block argument"
+msgstr "free: called with unallocated block argument"
+
+#: lib/malloc/malloc.c:839
+msgid "free: underflow detected; mh_nbytes out of range"
+msgstr "free: underflow detected; mh_nbytes out of range"
+
+#: lib/malloc/malloc.c:845
+msgid "free: start and end chunk sizes differ"
+msgstr "free: start and end chunk sizes differ"
+
+#: lib/malloc/malloc.c:942
+msgid "realloc: called with unallocated block argument"
+msgstr "realloc: called with unallocated block argument"
+
+#: lib/malloc/malloc.c:957
+msgid "realloc: underflow detected; mh_nbytes out of range"
+msgstr "realloc: underflow detected; mh_nbytes out of range"
+
+#: lib/malloc/malloc.c:963
+msgid "realloc: start and end chunk sizes differ"
+msgstr "realloc: start and end chunk sizes differ"
+
+#: lib/malloc/table.c:175
+msgid "register_alloc: alloc table is full with FIND_ALLOC?\n"
+msgstr "register_alloc: alloc table is full with FIND_ALLOC?\n"
+
+#: lib/malloc/table.c:182
+#, c-format
+msgid "register_alloc: %p already in table as allocated?\n"
+msgstr "register_alloc: %p already in table as allocated?\n"
+
+#: lib/malloc/table.c:218
+#, c-format
+msgid "register_free: %p already in table as free?\n"
+msgstr "register_free: %p already in table as free?\n"
+
+#: lib/malloc/watch.c:46
+msgid "allocated"
+msgstr "allocated"
+
+#: lib/malloc/watch.c:48
+msgid "freed"
+msgstr "freed"
+
+#: lib/malloc/watch.c:50
+msgid "requesting resize"
+msgstr "requesting resize"
+
+#: lib/malloc/watch.c:52
+msgid "just resized"
+msgstr "just resized"
+
+#: lib/malloc/watch.c:54
+msgid "bug: unknown operation"
+msgstr "bug: unknown operation"
+
+#: lib/malloc/watch.c:56
+#, c-format
+msgid "malloc: watch alert: %p %s "
+msgstr "malloc: watch alert: %p %s "
+
+#: lib/sh/fmtulong.c:101
+msgid "invalid base"
+msgstr "invalid base"
+
+#: lib/sh/netopen.c:158
+#, c-format
+msgid "%s: host unknown"
+msgstr "%s: host unknown"
+
+#: lib/sh/netopen.c:165
+#, c-format
+msgid "%s: invalid service"
+msgstr "%s: invalid service"
+
+#: lib/sh/netopen.c:296
+#, c-format
+msgid "%s: bad network path specification"
+msgstr "%s: bad network path specification"
+
+#: lib/sh/netopen.c:336
+msgid "network operations not supported"
+msgstr "network operations not supported"
+
+#: mailcheck.c:382
+msgid "You have mail in $_"
+msgstr "You have mail in $_"
+
+#: mailcheck.c:407
+msgid "You have new mail in $_"
+msgstr "You have new mail in $_"
+
+#: mailcheck.c:423
+#, c-format
+msgid "The mail in %s has been read\n"
+msgstr "The mail in %s has been read\n"
+
+#: make_cmd.c:318
+msgid "syntax error: arithmetic expression required"
+msgstr "syntax error: arithmetic expression required"
+
+#: make_cmd.c:320
+msgid "syntax error: `;' unexpected"
+msgstr "syntax error: ‘;’ unexpected"
+
+#: make_cmd.c:321
+#, c-format
+msgid "syntax error: `((%s))'"
+msgstr "syntax error: ‘((%s))’"
+
+#: make_cmd.c:560
+#, c-format
+msgid "make_here_document: bad instruction type %d"
+msgstr "make_here_document: bad instruction type %d"
+
+#: make_cmd.c:730
+#, c-format
+msgid "make_redirection: redirection instruction `%d' out of range"
+msgstr "make_redirection: redirection instruction ‘%d’ out of range"
+
+#: parse.y:2726
+#, c-format
+msgid "unexpected EOF while looking for matching `%c'"
+msgstr "unexpected EOF while looking for matching ‘%c’"
+
+#: parse.y:3011
+msgid "unexpected EOF while looking for `]]'"
+msgstr "unexpected EOF while looking for ‘]]’"
+
+#: parse.y:3016
+#, c-format
+msgid "syntax error in conditional expression: unexpected token `%s'"
+msgstr "syntax error in conditional expression: unexpected token ‘%s’"
+
+#: parse.y:3020
+msgid "syntax error in conditional expression"
+msgstr "syntax error in conditional expression"
+
+#: parse.y:3098
+#, c-format
+msgid "unexpected token `%s', expected `)'"
+msgstr "unexpected token ‘%s’, expected ‘)’"
+
+#: parse.y:3102
+msgid "expected `)'"
+msgstr "expected ‘)’"
+
+#: parse.y:3130
+#, c-format
+msgid "unexpected argument `%s' to conditional unary operator"
+msgstr "unexpected argument ‘%s’ to conditional unary operator"
+
+#: parse.y:3134
+msgid "unexpected argument to conditional unary operator"
+msgstr "unexpected argument to conditional unary operator"
+
+#: parse.y:3171
+#, c-format
+msgid "unexpected token `%s', conditional binary operator expected"
+msgstr "unexpected token ‘%s’, conditional binary operator expected"
+
+#: parse.y:3175
+msgid "conditional binary operator expected"
+msgstr "conditional binary operator expected"
+
+#: parse.y:3191
+#, c-format
+msgid "unexpected argument `%s' to conditional binary operator"
+msgstr "unexpected argument ‘%s’ to conditional binary operator"
+
+#: parse.y:3195
+msgid "unexpected argument to conditional binary operator"
+msgstr "unexpected argument to conditional binary operator"
+
+#: parse.y:3206
+#, c-format
+msgid "unexpected token `%c' in conditional command"
+msgstr "unexpected token ‘%c’ in conditional command"
+
+#: parse.y:3209
+#, c-format
+msgid "unexpected token `%s' in conditional command"
+msgstr "unexpected token ‘%s’ in conditional command"
+
+#: parse.y:3213
+#, c-format
+msgid "unexpected token %d in conditional command"
+msgstr "unexpected token %d in conditional command"
+
+#: parse.y:4400
+#, c-format
+msgid "syntax error near unexpected token `%s'"
+msgstr "syntax error near unexpected token ‘%s’"
+
+#: parse.y:4418
+#, c-format
+msgid "syntax error near `%s'"
+msgstr "syntax error near ‘%s’"
+
+#: parse.y:4428
+msgid "syntax error: unexpected end of file"
+msgstr "syntax error: unexpected end of file"
+
+#: parse.y:4428
+msgid "syntax error"
+msgstr "syntax error"
+
+#: parse.y:4490
+#, c-format
+msgid "Use \"%s\" to leave the shell.\n"
+msgstr "Use “%s” to leave the shell.\n"
+
+#: parse.y:4649
+msgid "unexpected EOF while looking for matching `)'"
+msgstr "unexpected EOF while looking for matching ‘)’"
+
+#: pcomplete.c:988
+#, c-format
+msgid "completion: function `%s' not found"
+msgstr "completion: function ‘%s’ not found"
+
+#: pcomplib.c:179
+#, c-format
+msgid "progcomp_insert: %s: NULL COMPSPEC"
+msgstr "progcomp_insert: %s: NULL COMPSPEC"
+
+#: print_cmd.c:260
+#, c-format
+msgid "print_command: bad connector `%d'"
+msgstr "print_command: bad connector ‘%d’"
+
+#: print_cmd.c:1172
+#, c-format
+msgid "cprintf: `%c': invalid format character"
+msgstr "cprintf: ‘%c’: invalid format character"
+
+#: redir.c:99
+msgid "file descriptor out of range"
+msgstr "file descriptor out of range"
+
+#: redir.c:141
+#, c-format
+msgid "%s: ambiguous redirect"
+msgstr "%s: ambiguous redirect"
+
+#: redir.c:145
+#, c-format
+msgid "%s: cannot overwrite existing file"
+msgstr "%s: cannot overwrite existing file"
+
+#: redir.c:150
+#, c-format
+msgid "%s: restricted: cannot redirect output"
+msgstr "%s: restricted: cannot redirect output"
+
+#: redir.c:155
+#, c-format
+msgid "cannot create temp file for here document: %s"
+msgstr "cannot create temp file for here document: %s"
+
+#: redir.c:509
+msgid "/dev/(tcp|udp)/host/port not supported without networking"
+msgstr "/dev/(tcp|udp)/host/port not supported without networking"
+
+#: redir.c:949
+msgid "redirection error: cannot duplicate fd"
+msgstr "redirection error: cannot duplicate fd"
+
+#: shell.c:302
+msgid "could not find /tmp, please create!"
+msgstr "could not find /tmp, please create!"
+
+#: shell.c:306
+msgid "/tmp must be a valid directory name"
+msgstr "/tmp must be a valid directory name"
+
+#: shell.c:839
+#, c-format
+msgid "%c%c: invalid option"
+msgstr "%c%c: invalid option"
+
+#: shell.c:1590
+msgid "I have no name!"
+msgstr "I have no name!"
+
+#: shell.c:1725
+#, c-format
+msgid ""
+"Usage:\t%s [GNU long option] [option] ...\n"
+"\t%s [GNU long option] [option] script-file ...\n"
+msgstr ""
+"Usage:\t%s [GNU long option] [option] ...\n"
+"\t%s [GNU long option] [option] script-file ...\n"
+
+#: shell.c:1727
+msgid "GNU long options:\n"
+msgstr "GNU long options:\n"
+
+#: shell.c:1731
+msgid "Shell options:\n"
+msgstr "Shell options:\n"
+
+#: shell.c:1732
+msgid "\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n"
+msgstr "\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n"
+
+#: shell.c:1747
+#, c-format
+msgid "\t-%s or -o option\n"
+msgstr "\t-%s or -o option\n"
+
+#: shell.c:1753
+#, c-format
+msgid "Type `%s -c \"help set\"' for more information about shell options.\n"
+msgstr "Type ‘%s -c “help set”’ for more information about shell options.\n"
+
+#: shell.c:1754
+#, c-format
+msgid "Type `%s -c help' for more information about shell builtin commands.\n"
+msgstr "Type ‘%s -c help’ for more information about shell builtin commands.\n"
+
+#: shell.c:1755
+msgid "Use the `bashbug' command to report bugs.\n"
+msgstr "Use the ‘bashbug’ command to report bugs.\n"
+
+#: sig.c:485
+#, c-format
+msgid "sigprocmask: %d: invalid operation"
+msgstr "sigprocmask: %d: invalid operation"
+
+#: subst.c:1011
+#, c-format
+msgid "bad substitution: no closing `%s' in %s"
+msgstr "bad substitution: no closing ‘%s’ in %s"
+
+#: subst.c:2020
+#, c-format
+msgid "%s: cannot assign list to array member"
+msgstr "%s: cannot assign list to array member"
+
+#: subst.c:3516 subst.c:3532
+msgid "cannot make pipe for process substitution"
+msgstr "cannot make pipe for process substitution"
+
+#: subst.c:3563
+msgid "cannot make child for process substitution"
+msgstr "cannot make child for process substitution"
+
+#: subst.c:3608
+#, c-format
+msgid "cannot open named pipe %s for reading"
+msgstr "cannot open named pipe %s for reading"
+
+#: subst.c:3610
+#, c-format
+msgid "cannot open named pipe %s for writing"
+msgstr "cannot open named pipe %s for writing"
+
+#: subst.c:3618
+#, c-format
+msgid "cannout reset nodelay mode for fd %d"
+msgstr "cannout reset nodelay mode for fd %d"
+
+#: subst.c:3628
+#, c-format
+msgid "cannot duplicate named pipe %s as fd %d"
+msgstr "cannot duplicate named pipe %s as fd %d"
+
+#: subst.c:3803
+msgid "cannot make pipe for command substitution"
+msgstr "cannot make pipe for command substitution"
+
+#: subst.c:3832
+msgid "cannot make child for command substitution"
+msgstr "cannot make child for command substitution"
+
+#: subst.c:3849
+msgid "command_substitute: cannot duplicate pipe as fd 1"
+msgstr "command_substitute: cannot duplicate pipe as fd 1"
+
+#: subst.c:4284
+#, c-format
+msgid "%s: parameter null or not set"
+msgstr "%s: parameter null or not set"
+
+#: subst.c:4529
+#, c-format
+msgid "%s: substring expression < 0"
+msgstr "%s: substring expression < 0"
+
+#: subst.c:5209
+#, c-format
+msgid "%s: bad substitution"
+msgstr "%s: bad substitution"
+
+#: subst.c:5283
+#, c-format
+msgid "$%s: cannot assign in this way"
+msgstr "$%s: cannot assign in this way"
+
+#: subst.c:6652
+#, c-format
+msgid "no match: %s"
+msgstr "no match: %s"
+
+#: test.c:154
+msgid "argument expected"
+msgstr "argument expected"
+
+#: test.c:163
+#, c-format
+msgid "%s: integer expression expected"
+msgstr "%s: integer expression expected"
+
+#: test.c:361
+msgid "`)' expected"
+msgstr "‘)’ expected"
+
+#: test.c:363
+#, c-format
+msgid "`)' expected, found %s"
+msgstr "‘)’ expected, found %s"
+
+#: test.c:378 test.c:787 test.c:790
+#, c-format
+msgid "%s: unary operator expected"
+msgstr "%s: unary operator expected"
+
+#: test.c:543 test.c:830
+#, c-format
+msgid "%s: binary operator expected"
+msgstr "%s: binary operator expected"
+
+#: test.c:905
+msgid "missing `]'"
+msgstr "missing ‘]’"
+
+#: trap.c:194
+msgid "invalid signal number"
+msgstr "invalid signal number"
+
+#: trap.c:309
+#, c-format
+msgid "run_pending_traps: bad value in trap_list[%d]: %p"
+msgstr "run_pending_traps: bad value in trap_list[%d]: %p"
+
+#: trap.c:313
+#, c-format
+msgid ""
+"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+msgstr ""
+"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+
+#: trap.c:349
+#, c-format
+msgid "trap_handler: bad signal %d"
+msgstr "trap_handler: bad signal %d"
+
+#: variables.c:310
+#, c-format
+msgid "error importing function definition for `%s'"
+msgstr "error importing function definition for ‘%s’"
+
+#: variables.c:670
+#, c-format
+msgid "shell level (%d) too high, resetting to 1"
+msgstr "shell level (%d) too high, resetting to 1"
+
+#: variables.c:1610
+msgid "make_local_variable: no function context at current scope"
+msgstr "make_local_variable: no function context at current scope"
+
+#: variables.c:2709
+msgid "all_local_variables: no function context at current scope"
+msgstr "all_local_variables: no function context at current scope"
+
+#: variables.c:2923 variables.c:2932
+#, c-format
+msgid "invalid character %d in exportstr for %s"
+msgstr "invalid character %d in exportstr for %s"
+
+#: variables.c:2938
+#, c-format
+msgid "no `=' in exportstr for %s"
+msgstr "no ‘=’ in exportstr for %s"
+
+#: variables.c:3363
+msgid "pop_var_context: head of shell_variables not a function context"
+msgstr "pop_var_context: head of shell_variables not a function context"
+
+#: variables.c:3376
+msgid "pop_var_context: no global_variables context"
+msgstr "pop_var_context: no global_variables context"
+
+#: variables.c:3442
+msgid "pop_scope: head of shell_variables not a temporary environment scope"
+msgstr "pop_scope: head of shell_variables not a temporary environment scope"
+
+#: version.c:82
+msgid "Copyright (C) 2004 Free Software Foundation, Inc.\n"
+msgstr "Copyright (C) 2004 Free Software Foundation, Inc.\n"
+
+#: xmalloc.c:93
+#, c-format
+msgid "xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"
+msgstr "xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"
+
+#: xmalloc.c:95
+#, c-format
+msgid "xmalloc: cannot allocate %lu bytes"
+msgstr "xmalloc: cannot allocate %lu bytes"
+
+#: xmalloc.c:115
+#, c-format
+msgid "xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"
+msgstr "xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"
+
+#: xmalloc.c:117
+#, c-format
+msgid "xrealloc: cannot allocate %lu bytes"
+msgstr "xrealloc: cannot allocate %lu bytes"
+
+#: xmalloc.c:151
+#, c-format
+msgid "xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"
+msgstr "xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"
+
+#: xmalloc.c:153
+#, c-format
+msgid "xmalloc: %s:%d: cannot allocate %lu bytes"
+msgstr "xmalloc: %s:%d: cannot allocate %lu bytes"
+
+#: xmalloc.c:175
+#, c-format
+msgid "xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)"
+msgstr "xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)"
+
+#: xmalloc.c:177
+#, c-format
+msgid "xrealloc: %s:%d: cannot allocate %lu bytes"
+msgstr "xrealloc: %s:%d: cannot allocate %lu bytes"
+
+#: builtins.c:244
+msgid "`alias' with no arguments or with the -p option prints the list"
+msgstr "‘alias’ with no arguments or with the -p option prints the list"
+
+#: builtins.c:245
+msgid "of aliases in the form alias NAME=VALUE on standard output."
+msgstr "of aliases in the form alias NAME=VALUE on standard output."
+
+#: builtins.c:246
+msgid "Otherwise, an alias is defined for each NAME whose VALUE is given."
+msgstr "Otherwise, an alias is defined for each NAME whose VALUE is given."
+
+#: builtins.c:247
+msgid "A trailing space in VALUE causes the next word to be checked for"
+msgstr "A trailing space in VALUE causes the next word to be checked for"
+
+#: builtins.c:248
+msgid "alias substitution when the alias is expanded.  Alias returns"
+msgstr "alias substitution when the alias is expanded.  Alias returns"
+
+#: builtins.c:249
+msgid "true unless a NAME is given for which no alias has been defined."
+msgstr "true unless a NAME is given for which no alias has been defined."
+
+#: builtins.c:257
+msgid ""
+"Remove NAMEs from the list of defined aliases.  If the -a option is given,"
+msgstr ""
+"Remove NAMEs from the list of defined aliases.  If the -a option is given,"
+
+#: builtins.c:258
+msgid "then remove all alias definitions."
+msgstr "then remove all alias definitions."
+
+#: builtins.c:266
+msgid "Bind a key sequence to a Readline function or a macro, or set"
+msgstr "Bind a key sequence to a Readline function or a macro, or set"
+
+#: builtins.c:267
+msgid "a Readline variable.  The non-option argument syntax is equivalent"
+msgstr "a Readline variable.  The non-option argument syntax is equivalent"
+
+#: builtins.c:268
+msgid "to that found in ~/.inputrc, but must be passed as a single argument:"
+msgstr "to that found in ~/.inputrc, but must be passed as a single argument:"
+
+#: builtins.c:269
+msgid "bind '\"\\C-x\\C-r\": re-read-init-file'."
+msgstr "bind '“\\C-x\\C-r”: re-read-init-file'."
+
+#: builtins.c:270
+msgid "bind accepts the following options:"
+msgstr "bind accepts the following options:"
+
+#: builtins.c:271
+msgid ""
+"  -m  keymap         Use `keymap' as the keymap for the duration of this"
+msgstr ""
+"  -m  keymap         Use ‘keymap’ as the keymap for the duration of this"
+
+#: builtins.c:272
+msgid "                     command.  Acceptable keymap names are emacs,"
+msgstr "                     command.  Acceptable keymap names are emacs,"
+
+#: builtins.c:273
+msgid ""
+"                     emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,"
+msgstr ""
+"                     emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,"
+
+#: builtins.c:274
+msgid "                     vi-command, and vi-insert."
+msgstr "                     vi-command, and vi-insert."
+
+#: builtins.c:275
+msgid "  -l                 List names of functions."
+msgstr "  -l                 List names of functions."
+
+#: builtins.c:276
+msgid "  -P                 List function names and bindings."
+msgstr "  -P                 List function names and bindings."
+
+#: builtins.c:277
+msgid "  -p                 List functions and bindings in a form that can be"
+msgstr "  -p                 List functions and bindings in a form that can be"
+
+#: builtins.c:278
+msgid "                     reused as input."
+msgstr "                     reused as input."
+
+#: builtins.c:279
+msgid "  -r  keyseq         Remove the binding for KEYSEQ."
+msgstr "  -r  keyseq         Remove the binding for KEYSEQ."
+
+#: builtins.c:280
+msgid "  -x  keyseq:shell-command\tCause SHELL-COMMAND to be executed when"
+msgstr "  -x  keyseq:shell-command\tCause SHELL-COMMAND to be executed when"
+
+#: builtins.c:281
+msgid "\t\t\t\tKEYSEQ is entered."
+msgstr "\t\t\t\tKEYSEQ is entered."
+
+#: builtins.c:282
+msgid "  -f  filename       Read key bindings from FILENAME."
+msgstr "  -f  filename       Read key bindings from FILENAME."
+
+#: builtins.c:283
+msgid "  -q  function-name  Query about which keys invoke the named function."
+msgstr "  -q  function-name  Query about which keys invoke the named function."
+
+#: builtins.c:284
+msgid ""
+"  -u  function-name  Unbind all keys which are bound to the named function."
+msgstr ""
+"  -u  function-name  Unbind all keys which are bound to the named function."
+
+#: builtins.c:285
+msgid "  -V                 List variable names and values"
+msgstr "  -V                 List variable names and values"
+
+#: builtins.c:286
+msgid "  -v                 List variable names and values in a form that can"
+msgstr "  -v                 List variable names and values in a form that can"
+
+#: builtins.c:287
+msgid "                     be reused as input."
+msgstr "                     be reused as input."
+
+#: builtins.c:288
+msgid ""
+"  -S                 List key sequences that invoke macros and their values"
+msgstr ""
+"  -S                 List key sequences that invoke macros and their values"
+
+#: builtins.c:289
+msgid ""
+"  -s                 List key sequences that invoke macros and their values"
+msgstr ""
+"  -s                 List key sequences that invoke macros and their values"
+
+#: builtins.c:290
+msgid "                     in a form that can be reused as input."
+msgstr "                     in a form that can be reused as input."
+
+#: builtins.c:297
+msgid "Exit from within a FOR, WHILE or UNTIL loop.  If N is specified,"
+msgstr "Exit from within a FOR, WHILE or UNTIL loop.  If N is specified,"
+
+#: builtins.c:298
+msgid "break N levels."
+msgstr "break N levels."
+
+#: builtins.c:304
+msgid "Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop."
+msgstr "Resume the next iteration of the enclosing FOR, WHILE or UNTIL loop."
+
+#: builtins.c:305
+msgid "If N is specified, resume at the N-th enclosing loop."
+msgstr "If N is specified, resume at the N-th enclosing loop."
+
+#: builtins.c:311
+msgid "Run a shell builtin.  This is useful when you wish to rename a"
+msgstr "Run a shell builtin.  This is useful when you wish to rename a"
+
+#: builtins.c:312
+msgid "shell builtin to be a function, but need the functionality of the"
+msgstr "shell builtin to be a function, but need the functionality of the"
+
+#: builtins.c:313
+msgid "builtin within the function itself."
+msgstr "builtin within the function itself."
+
+#: builtins.c:334
+msgid "Change the current directory to DIR.  The variable $HOME is the"
+msgstr "Change the current directory to DIR.  The variable $HOME is the"
+
+#: builtins.c:335
+msgid "default DIR.  The variable CDPATH defines the search path for"
+msgstr "default DIR.  The variable CDPATH defines the search path for"
+
+#: builtins.c:336
+msgid "the directory containing DIR.  Alternative directory names in CDPATH"
+msgstr "the directory containing DIR.  Alternative directory names in CDPATH"
+
+#: builtins.c:337
+msgid "are separated by a colon (:).  A null directory name is the same as"
+msgstr "are separated by a colon (:).  A null directory name is the same as"
+
+#: builtins.c:338
+msgid "the current directory, i.e. `.'.  If DIR begins with a slash (/),"
+msgstr "the current directory, i.e. ‘.’.  If DIR begins with a slash (/),"
+
+#: builtins.c:339
+msgid "then CDPATH is not used.  If the directory is not found, and the"
+msgstr "then CDPATH is not used.  If the directory is not found, and the"
+
+#: builtins.c:340
+msgid "shell option `cdable_vars' is set, then try the word as a variable"
+msgstr "shell option ‘cdable_vars’ is set, then try the word as a variable"
+
+#: builtins.c:341
+msgid "name.  If that variable has a value, then cd to the value of that"
+msgstr "name.  If that variable has a value, then cd to the value of that"
+
+#: builtins.c:342
+msgid "variable.  The -P option says to use the physical directory structure"
+msgstr "variable.  The -P option says to use the physical directory structure"
+
+#: builtins.c:343
+msgid ""
+"instead of following symbolic links; the -L option forces symbolic links"
+msgstr ""
+"instead of following symbolic links; the -L option forces symbolic links"
+
+#: builtins.c:344
+msgid "to be followed."
+msgstr "to be followed."
+
+#: builtins.c:350
+msgid "Print the current working directory.  With the -P option, pwd prints"
+msgstr "Print the current working directory.  With the -P option, pwd prints"
+
+#: builtins.c:351
+msgid "the physical directory, without any symbolic links; the -L option"
+msgstr "the physical directory, without any symbolic links; the -L option"
+
+#: builtins.c:352
+msgid "makes pwd follow symbolic links."
+msgstr "makes pwd follow symbolic links."
+
+#: builtins.c:358
+msgid "No effect; the command does nothing.  A zero exit code is returned."
+msgstr "No effect; the command does nothing.  A zero exit code is returned."
+
+#: builtins.c:364
+msgid "Return a successful result."
+msgstr "Return a successful result."
+
+#: builtins.c:370
+msgid "Return an unsuccessful result."
+msgstr "Return an unsuccessful result."
+
+#: builtins.c:376
+msgid "Runs COMMAND with ARGS ignoring shell functions.  If you have a shell"
+msgstr "Runs COMMAND with ARGS ignoring shell functions.  If you have a shell"
+
+#: builtins.c:377
+msgid "function called `ls', and you wish to call the command `ls', you can"
+msgstr "function called ‘ls’, and you wish to call the command ‘ls’, you can"
+
+#: builtins.c:378
+msgid "say \"command ls\".  If the -p option is given, a default value is used"
+msgstr "say “command ls”.  If the -p option is given, a default value is used"
+
+#: builtins.c:379
+msgid "for PATH that is guaranteed to find all of the standard utilities.  If"
+msgstr "for PATH that is guaranteed to find all of the standard utilities.  If"
+
+#: builtins.c:380
+msgid "the -V or -v option is given, a string is printed describing COMMAND."
+msgstr "the -V or -v option is given, a string is printed describing COMMAND."
+
+#: builtins.c:381
+msgid "The -V option produces a more verbose description."
+msgstr "The -V option produces a more verbose description."
+
+#: builtins.c:387
+msgid "Declare variables and/or give them attributes.  If no NAMEs are"
+msgstr "Declare variables and/or give them attributes.  If no NAMEs are"
+
+#: builtins.c:388
+msgid "given, then display the values of variables instead.  The -p option"
+msgstr "given, then display the values of variables instead.  The -p option"
+
+#: builtins.c:389
+msgid "will display the attributes and values of each NAME."
+msgstr "will display the attributes and values of each NAME."
+
+#: builtins.c:391
+msgid "The flags are:"
+msgstr "The flags are:"
+
+#: builtins.c:393
+msgid "  -a\tto make NAMEs arrays (if supported)"
+msgstr "  -a\tto make NAMEs arrays (if supported)"
+
+#: builtins.c:394
+msgid "  -f\tto select from among function names only"
+msgstr "  -f\tto select from among function names only"
+
+#: builtins.c:395
+msgid ""
+"  -F\tto display function names (and line number and source file name if"
+msgstr ""
+"  -F\tto display function names (and line number and source file name if"
+
+#: builtins.c:396
+msgid "\tdebugging) without definitions"
+msgstr "\tdebugging) without definitions"
+
+#: builtins.c:397
+msgid "  -i\tto make NAMEs have the `integer' attribute"
+msgstr "  -i\tto make NAMEs have the ‘integer’ attribute"
+
+#: builtins.c:398
+msgid "  -r\tto make NAMEs readonly"
+msgstr "  -r\tto make NAMEs readonly"
+
+#: builtins.c:399
+msgid "  -t\tto make NAMEs have the `trace' attribute"
+msgstr "  -t\tto make NAMEs have the ‘trace’ attribute"
+
+#: builtins.c:400
+msgid "  -x\tto make NAMEs export"
+msgstr "  -x\tto make NAMEs export"
+
+#: builtins.c:402
+msgid "Variables with the integer attribute have arithmetic evaluation (see"
+msgstr "Variables with the integer attribute have arithmetic evaluation (see"
+
+#: builtins.c:403
+msgid "`let') done when the variable is assigned to."
+msgstr "‘let’) done when the variable is assigned to."
+
+#: builtins.c:405
+msgid "When displaying values of variables, -f displays a function's name"
+msgstr "When displaying values of variables, -f displays a function's name"
+
+#: builtins.c:406
+msgid "and definition.  The -F option restricts the display to function"
+msgstr "and definition.  The -F option restricts the display to function"
+
+#: builtins.c:407
+msgid "name only."
+msgstr "name only."
+
+#: builtins.c:409
+msgid "Using `+' instead of `-' turns off the given attribute instead.  When"
+msgstr "Using ‘+’ instead of ‘-’ turns off the given attribute instead.  When"
+
+#: builtins.c:410
+msgid "used in a function, makes NAMEs local, as with the `local' command."
+msgstr "used in a function, makes NAMEs local, as with the ‘local’ command."
+
+#: builtins.c:416
+msgid "Obsolete.  See `declare'."
+msgstr "Obsolete.  See ‘declare’."
+
+#: builtins.c:422
+msgid "Create a local variable called NAME, and give it VALUE.  LOCAL"
+msgstr "Create a local variable called NAME, and give it VALUE.  LOCAL"
+
+#: builtins.c:423
+msgid "can only be used within a function; it makes the variable NAME"
+msgstr "can only be used within a function; it makes the variable NAME"
+
+#: builtins.c:424
+msgid "have a visible scope restricted to that function and its children."
+msgstr "have a visible scope restricted to that function and its children."
+
+#: builtins.c:431
+msgid "Output the ARGs.  If -n is specified, the trailing newline is"
+msgstr "Output the ARGs.  If -n is specified, the trailing newline is"
+
+#: builtins.c:432
+msgid "suppressed.  If the -e option is given, interpretation of the"
+msgstr "suppressed.  If the -e option is given, interpretation of the"
+
+#: builtins.c:433
+msgid "following backslash-escaped characters is turned on:"
+msgstr "following backslash-escaped characters is turned on:"
+
+#: builtins.c:434
+msgid "\t\\a\talert (bell)"
+msgstr "\t\\a\talert (bell)"
+
+#: builtins.c:435
+msgid "\t\\b\tbackspace"
+msgstr "\t\\b\tbackspace"
+
+#: builtins.c:436
+msgid "\t\\c\tsuppress trailing newline"
+msgstr "\t\\c\tsuppress trailing newline"
+
+#: builtins.c:437
+msgid "\t\\E\tescape character"
+msgstr "\t\\E\tescape character"
+
+#: builtins.c:438
+msgid "\t\\f\tform feed"
+msgstr "\t\\f\tform feed"
+
+#: builtins.c:439
+msgid "\t\\n\tnew line"
+msgstr "\t\\n\tnew line"
+
+#: builtins.c:440
+msgid "\t\\r\tcarriage return"
+msgstr "\t\\r\tcarriage return"
+
+#: builtins.c:441
+msgid "\t\\t\thorizontal tab"
+msgstr "\t\\t\thorizontal tab"
+
+#: builtins.c:442
+msgid "\t\\v\tvertical tab"
+msgstr "\t\\v\tvertical tab"
+
+#: builtins.c:443
+msgid "\t\\\\\tbackslash"
+msgstr "\t\\\\\tbackslash"
+
+#: builtins.c:444
+msgid "\t\\num\tthe character whose ASCII code is NUM (octal)."
+msgstr "\t\\num\tthe character whose ASCII code is NUM (octal)."
+
+#: builtins.c:446
+msgid "You can explicitly turn off the interpretation of the above characters"
+msgstr "You can explicitly turn off the interpretation of the above characters"
+
+#: builtins.c:447
+msgid "with the -E option."
+msgstr "with the -E option."
+
+#: builtins.c:455
+msgid ""
+"Output the ARGs.  If -n is specified, the trailing newline is suppressed."
+msgstr ""
+"Output the ARGs.  If -n is specified, the trailing newline is suppressed."
+
+#: builtins.c:462
+msgid "Enable and disable builtin shell commands.  This allows"
+msgstr "Enable and disable builtin shell commands.  This allows"
+
+#: builtins.c:463
+msgid "you to use a disk command which has the same name as a shell"
+msgstr "you to use a disk command which has the same name as a shell"
+
+#: builtins.c:464
+msgid "builtin without specifying a full pathname.  If -n is used, the"
+msgstr "builtin without specifying a full pathname.  If -n is used, the"
+
+#: builtins.c:465
+msgid "NAMEs become disabled; otherwise NAMEs are enabled.  For example,"
+msgstr "NAMEs become disabled; otherwise NAMEs are enabled.  For example,"
+
+#: builtins.c:466
+msgid "to use the `test' found in $PATH instead of the shell builtin"
+msgstr "to use the ‘test’ found in $PATH instead of the shell builtin"
+
+#: builtins.c:467
+msgid "version, type `enable -n test'.  On systems supporting dynamic"
+msgstr "version, type ‘enable -n test’.  On systems supporting dynamic"
+
+#: builtins.c:468
+msgid "loading, the -f option may be used to load new builtins from the"
+msgstr "loading, the -f option may be used to load new builtins from the"
+
+#: builtins.c:469
+msgid "shared object FILENAME.  The -d option will delete a builtin"
+msgstr "shared object FILENAME.  The -d option will delete a builtin"
+
+#: builtins.c:470
+msgid "previously loaded with -f.  If no non-option names are given, or"
+msgstr "previously loaded with -f.  If no non-option names are given, or"
+
+#: builtins.c:471
+msgid "the -p option is supplied, a list of builtins is printed.  The"
+msgstr "the -p option is supplied, a list of builtins is printed.  The"
+
+#: builtins.c:472
+msgid "-a option means to print every builtin with an indication of whether"
+msgstr "-a option means to print every builtin with an indication of whether"
+
+#: builtins.c:473
+msgid ""
+"or not it is enabled.  The -s option restricts the output to the POSIX.2"
+msgstr ""
+"or not it is enabled.  The -s option restricts the output to the POSIX.2"
+
+#: builtins.c:474
+msgid ""
+"`special' builtins.  The -n option displays a list of all disabled builtins."
+msgstr ""
+"‘special’ builtins.  The -n option displays a list of all disabled builtins."
+
+#: builtins.c:480
+msgid "Read ARGs as input to the shell and execute the resulting command(s)."
+msgstr "Read ARGs as input to the shell and execute the resulting command(s)."
+
+#: builtins.c:486
+msgid "Getopts is used by shell procedures to parse positional parameters."
+msgstr "Getopts is used by shell procedures to parse positional parameters."
+
+#: builtins.c:488
+msgid "OPTSTRING contains the option letters to be recognized; if a letter"
+msgstr "OPTSTRING contains the option letters to be recognized; if a letter"
+
+#: builtins.c:489
+msgid "is followed by a colon, the option is expected to have an argument,"
+msgstr "is followed by a colon, the option is expected to have an argument,"
+
+#: builtins.c:490
+msgid "which should be separated from it by white space."
+msgstr "which should be separated from it by white space."
+
+#: builtins.c:492
+msgid "Each time it is invoked, getopts will place the next option in the"
+msgstr "Each time it is invoked, getopts will place the next option in the"
+
+#: builtins.c:493
+msgid "shell variable $name, initializing name if it does not exist, and"
+msgstr "shell variable $name, initializing name if it does not exist, and"
+
+#: builtins.c:494
+msgid "the index of the next argument to be processed into the shell"
+msgstr "the index of the next argument to be processed into the shell"
+
+#: builtins.c:495
+msgid "variable OPTIND.  OPTIND is initialized to 1 each time the shell or"
+msgstr "variable OPTIND.  OPTIND is initialized to 1 each time the shell or"
+
+#: builtins.c:496
+msgid "a shell script is invoked.  When an option requires an argument,"
+msgstr "a shell script is invoked.  When an option requires an argument,"
+
+#: builtins.c:497
+msgid "getopts places that argument into the shell variable OPTARG."
+msgstr "getopts places that argument into the shell variable OPTARG."
+
+#: builtins.c:499
+msgid "getopts reports errors in one of two ways.  If the first character"
+msgstr "getopts reports errors in one of two ways.  If the first character"
+
+#: builtins.c:500
+msgid "of OPTSTRING is a colon, getopts uses silent error reporting.  In"
+msgstr "of OPTSTRING is a colon, getopts uses silent error reporting.  In"
+
+#: builtins.c:501
+msgid "this mode, no error messages are printed.  If an invalid option is"
+msgstr "this mode, no error messages are printed.  If an invalid option is"
+
+#: builtins.c:502
+msgid "seen, getopts places the option character found into OPTARG.  If a"
+msgstr "seen, getopts places the option character found into OPTARG.  If a"
+
+#: builtins.c:503
+msgid "required argument is not found, getopts places a ':' into NAME and"
+msgstr "required argument is not found, getopts places a ‘:’ into NAME and"
+
+#: builtins.c:504
+msgid "sets OPTARG to the option character found.  If getopts is not in"
+msgstr "sets OPTARG to the option character found.  If getopts is not in"
+
+#: builtins.c:505
+msgid "silent mode, and an invalid option is seen, getopts places '?' into"
+msgstr "silent mode, and an invalid option is seen, getopts places ‘?’ into"
+
+#: builtins.c:506
+msgid "NAME and unsets OPTARG.  If a required argument is not found, a '?'"
+msgstr "NAME and unsets OPTARG.  If a required argument is not found, a ‘?’"
+
+#: builtins.c:507
+msgid "is placed in NAME, OPTARG is unset, and a diagnostic message is"
+msgstr "is placed in NAME, OPTARG is unset, and a diagnostic message is"
+
+#: builtins.c:508
+msgid "printed."
+msgstr "printed."
+
+#: builtins.c:510
+msgid "If the shell variable OPTERR has the value 0, getopts disables the"
+msgstr "If the shell variable OPTERR has the value 0, getopts disables the"
+
+#: builtins.c:511
+msgid "printing of error messages, even if the first character of"
+msgstr "printing of error messages, even if the first character of"
+
+#: builtins.c:512
+msgid "OPTSTRING is not a colon.  OPTERR has the value 1 by default."
+msgstr "OPTSTRING is not a colon.  OPTERR has the value 1 by default."
+
+#: builtins.c:514
+msgid "Getopts normally parses the positional parameters ($0 - $9), but if"
+msgstr "Getopts normally parses the positional parameters ($0 - $9), but if"
+
+#: builtins.c:515
+msgid "more arguments are given, they are parsed instead."
+msgstr "more arguments are given, they are parsed instead."
+
+#: builtins.c:521
+msgid "Exec FILE, replacing this shell with the specified program."
+msgstr "Exec FILE, replacing this shell with the specified program."
+
+#: builtins.c:522
+msgid "If FILE is not specified, the redirections take effect in this"
+msgstr "If FILE is not specified, the redirections take effect in this"
+
+#: builtins.c:523
+msgid "shell.  If the first argument is `-l', then place a dash in the"
+msgstr "shell.  If the first argument is ‘-l’, then place a dash in the"
+
+#: builtins.c:524
+msgid "zeroth arg passed to FILE, as login does.  If the `-c' option"
+msgstr "zeroth arg passed to FILE, as login does.  If the ‘-c’ option"
+
+#: builtins.c:525
+msgid "is supplied, FILE is executed with a null environment.  The `-a'"
+msgstr "is supplied, FILE is executed with a null environment.  The ‘-a’"
+
+#: builtins.c:526
+msgid "option means to make set argv[0] of the executed process to NAME."
+msgstr "option means to make set argv[0] of the executed process to NAME."
+
+#: builtins.c:527
+msgid "If the file cannot be executed and the shell is not interactive,"
+msgstr "If the file cannot be executed and the shell is not interactive,"
+
+#: builtins.c:528
+msgid "then the shell exits, unless the shell option `execfail' is set."
+msgstr "then the shell exits, unless the shell option ‘execfail’ is set."
+
+#: builtins.c:534
+msgid "Exit the shell with a status of N.  If N is omitted, the exit status"
+msgstr "Exit the shell with a status of N.  If N is omitted, the exit status"
+
+#: builtins.c:535
+msgid "is that of the last command executed."
+msgstr "is that of the last command executed."
+
+#: builtins.c:541
+msgid "Logout of a login shell."
+msgstr "Logout of a login shell."
+
+#: builtins.c:548
+msgid ""
+"fc is used to list or edit and re-execute commands from the history list."
+msgstr ""
+"fc is used to list or edit and re-execute commands from the history list."
+
+#: builtins.c:549
+msgid "FIRST and LAST can be numbers specifying the range, or FIRST can be a"
+msgstr "FIRST and LAST can be numbers specifying the range, or FIRST can be a"
+
+#: builtins.c:550
+msgid "string, which means the most recent command beginning with that"
+msgstr "string, which means the most recent command beginning with that"
+
+#: builtins.c:551
+msgid "string."
+msgstr "string."
+
+#: builtins.c:553
+msgid ""
+"   -e ENAME selects which editor to use.  Default is FCEDIT, then EDITOR,"
+msgstr ""
+"   -e ENAME selects which editor to use.  Default is FCEDIT, then EDITOR,"
+
+#: builtins.c:554
+msgid "      then vi."
+msgstr "      then vi."
+
+#: builtins.c:556
+msgid "   -l means list lines instead of editing."
+msgstr "   -l means list lines instead of editing."
+
+#: builtins.c:557
+msgid "   -n means no line numbers listed."
+msgstr "   -n means no line numbers listed."
+
+#: builtins.c:558
+msgid ""
+"   -r means reverse the order of the lines (making it newest listed first)."
+msgstr ""
+"   -r means reverse the order of the lines (making it newest listed first)."
+
+#: builtins.c:560
+msgid "With the `fc -s [pat=rep ...] [command]' format, the command is"
+msgstr "With the ‘fc -s [pat=rep ...] [command]’ format, the command is"
+
+#: builtins.c:561
+msgid "re-executed after the substitution OLD=NEW is performed."
+msgstr "re-executed after the substitution OLD=NEW is performed."
+
+#: builtins.c:563
+msgid "A useful alias to use with this is r='fc -s', so that typing `r cc'"
+msgstr "A useful alias to use with this is r='fc -s', so that typing ‘r cc’"
+
+#: builtins.c:564
+msgid "runs the last command beginning with `cc' and typing `r' re-executes"
+msgstr "runs the last command beginning with ‘cc’ and typing ‘r’ re-executes"
+
+#: builtins.c:565
+msgid "the last command."
+msgstr "the last command."
+
+#: builtins.c:573
+msgid "Place JOB_SPEC in the foreground, and make it the current job.  If"
+msgstr "Place JOB_SPEC in the foreground, and make it the current job.  If"
+
+#: builtins.c:574
+msgid "JOB_SPEC is not present, the shell's notion of the current job is"
+msgstr "JOB_SPEC is not present, the shell's notion of the current job is"
+
+#: builtins.c:575
+msgid "used."
+msgstr "used."
+
+#: builtins.c:583
+msgid "Place JOB_SPEC in the background, as if it had been started with"
+msgstr "Place JOB_SPEC in the background, as if it had been started with"
+
+#: builtins.c:584
+msgid "`&'.  If JOB_SPEC is not present, the shell's notion of the current"
+msgstr "‘&’.  If JOB_SPEC is not present, the shell's notion of the current"
+
+#: builtins.c:585
+msgid "job is used."
+msgstr "job is used."
+
+#: builtins.c:592
+msgid "For each NAME, the full pathname of the command is determined and"
+msgstr "For each NAME, the full pathname of the command is determined and"
+
+#: builtins.c:593
+msgid "remembered.  If the -p option is supplied, PATHNAME is used as the"
+msgstr "remembered.  If the -p option is supplied, PATHNAME is used as the"
+
+#: builtins.c:594
+msgid "full pathname of NAME, and no path search is performed.  The -r"
+msgstr "full pathname of NAME, and no path search is performed.  The -r"
+
+#: builtins.c:595
+msgid "option causes the shell to forget all remembered locations.  The -d"
+msgstr "option causes the shell to forget all remembered locations.  The -d"
+
+#: builtins.c:596
+msgid "option causes the shell to forget the remembered location of each NAME."
+msgstr ""
+"option causes the shell to forget the remembered location of each NAME."
+
+#: builtins.c:597
+msgid "If the -t option is supplied the full pathname to which each NAME"
+msgstr "If the -t option is supplied the full pathname to which each NAME"
+
+#: builtins.c:598
+msgid "corresponds is printed.  If multiple NAME arguments are supplied with"
+msgstr "corresponds is printed.  If multiple NAME arguments are supplied with"
+
+#: builtins.c:599
+msgid "-t, the NAME is printed before the hashed full pathname.  The -l option"
+msgstr ""
+"-t, the NAME is printed before the hashed full pathname.  The -l option"
+
+#: builtins.c:600
+msgid "causes output to be displayed in a format that may be reused as input."
+msgstr "causes output to be displayed in a format that may be reused as input."
+
+#: builtins.c:601
+msgid ""
+"If no arguments are given, information about remembered commands is "
+"displayed."
+msgstr ""
+"If no arguments are given, information about remembered commands is "
+"displayed."
+
+#: builtins.c:608
+msgid "Display helpful information about builtin commands.  If PATTERN is"
+msgstr "Display helpful information about builtin commands.  If PATTERN is"
+
+#: builtins.c:609
+msgid "specified, gives detailed help on all commands matching PATTERN,"
+msgstr "specified, gives detailed help on all commands matching PATTERN,"
+
+#: builtins.c:610
+msgid "otherwise a list of the builtins is printed.  The -s option"
+msgstr "otherwise a list of the builtins is printed.  The -s option"
+
+#: builtins.c:611
+msgid "restricts the output for each builtin command matching PATTERN to"
+msgstr "restricts the output for each builtin command matching PATTERN to"
+
+#: builtins.c:612
+msgid "a short usage synopsis."
+msgstr "a short usage synopsis."
+
+#: builtins.c:620
+msgid "Display the history list with line numbers.  Lines listed with"
+msgstr "Display the history list with line numbers.  Lines listed with"
+
+#: builtins.c:621
+msgid "with a `*' have been modified.  Argument of N says to list only"
+msgstr "with a ‘*’ have been modified.  Argument of N says to list only"
+
+#: builtins.c:622
+msgid "the last N lines.  The `-c' option causes the history list to be"
+msgstr "the last N lines.  The ‘-c’ option causes the history list to be"
+
+#: builtins.c:623
+msgid "cleared by deleting all of the entries.  The `-d' option deletes"
+msgstr "cleared by deleting all of the entries.  The ‘-d’ option deletes"
+
+#: builtins.c:624
+msgid "the history entry at offset OFFSET.  The `-w' option writes out the"
+msgstr "the history entry at offset OFFSET.  The ‘-w’ option writes out the"
+
+#: builtins.c:625
+msgid "current history to the history file;  `-r' means to read the file and"
+msgstr "current history to the history file;  ‘-r’ means to read the file and"
+
+#: builtins.c:626
+msgid "append the contents to the history list instead.  `-a' means"
+msgstr "append the contents to the history list instead.  ‘-a’ means"
+
+#: builtins.c:627
+msgid "to append history lines from this session to the history file."
+msgstr "to append history lines from this session to the history file."
+
+#: builtins.c:628
+msgid "Argument `-n' means to read all history lines not already read"
+msgstr "Argument ‘-n’ means to read all history lines not already read"
+
+#: builtins.c:629
+msgid "from the history file and append them to the history list."
+msgstr "from the history file and append them to the history list."
+
+#: builtins.c:631
+msgid "If FILENAME is given, then that is used as the history file else"
+msgstr "If FILENAME is given, then that is used as the history file else"
+
+#: builtins.c:632
+msgid "if $HISTFILE has a value, that is used, else ~/.bash_history."
+msgstr "if $HISTFILE has a value, that is used, else ~/.bash_history."
+
+#: builtins.c:633
+msgid "If the -s option is supplied, the non-option ARGs are appended to"
+msgstr "If the -s option is supplied, the non-option ARGs are appended to"
+
+#: builtins.c:634
+msgid "the history list as a single entry.  The -p option means to perform"
+msgstr "the history list as a single entry.  The -p option means to perform"
+
+#: builtins.c:635
+msgid "history expansion on each ARG and display the result, without storing"
+msgstr "history expansion on each ARG and display the result, without storing"
+
+#: builtins.c:636
+msgid "anything in the history list."
+msgstr "anything in the history list."
+
+#: builtins.c:638
+msgid "If the $HISTTIMEFORMAT variable is set and not null, its value is used"
+msgstr "If the $HISTTIMEFORMAT variable is set and not null, its value is used"
+
+#: builtins.c:639
+msgid "as a format string for strftime(3) to print the time stamp associated"
+msgstr "as a format string for strftime(3) to print the time stamp associated"
+
+#: builtins.c:640
+msgid ""
+"with each displayed history entry.  No time stamps are printed otherwise."
+msgstr ""
+"with each displayed history entry.  No time stamps are printed otherwise."
+
+#: builtins.c:648
+msgid "Lists the active jobs.  The -l option lists process id's in addition"
+msgstr "Lists the active jobs.  The -l option lists process id's in addition"
+
+#: builtins.c:649
+msgid "to the normal information; the -p option lists process id's only."
+msgstr "to the normal information; the -p option lists process id's only."
+
+#: builtins.c:650
+msgid "If -n is given, only processes that have changed status since the last"
+msgstr "If -n is given, only processes that have changed status since the last"
+
+#: builtins.c:651
+msgid "notification are printed.  JOBSPEC restricts output to that job.  The"
+msgstr "notification are printed.  JOBSPEC restricts output to that job.  The"
+
+#: builtins.c:652
+msgid "-r and -s options restrict output to running and stopped jobs only,"
+msgstr "-r and -s options restrict output to running and stopped jobs only,"
+
+#: builtins.c:653
+msgid "respectively.  Without options, the status of all active jobs is"
+msgstr "respectively.  Without options, the status of all active jobs is"
+
+#: builtins.c:654
+msgid "printed.  If -x is given, COMMAND is run after all job specifications"
+msgstr "printed.  If -x is given, COMMAND is run after all job specifications"
+
+#: builtins.c:655
+msgid ""
+"that appear in ARGS have been replaced with the process ID of that job's"
+msgstr ""
+"that appear in ARGS have been replaced with the process ID of that job's"
+
+#: builtins.c:656
+msgid "process group leader."
+msgstr "process group leader."
+
+#: builtins.c:664
+msgid ""
+"By default, removes each JOBSPEC argument from the table of active jobs."
+msgstr ""
+"By default, removes each JOBSPEC argument from the table of active jobs."
+
+#: builtins.c:665
+msgid ""
+"If the -h option is given, the job is not removed from the table, but is"
+msgstr ""
+"If the -h option is given, the job is not removed from the table, but is"
+
+#: builtins.c:666
+msgid "marked so that SIGHUP is not sent to the job if the shell receives a"
+msgstr "marked so that SIGHUP is not sent to the job if the shell receives a"
+
+#: builtins.c:667
+msgid ""
+"SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all"
+msgstr ""
+"SIGHUP.  The -a option, when JOBSPEC is not supplied, means to remove all"
+
+#: builtins.c:668
+msgid ""
+"jobs from the job table; the -r option means to remove only running jobs."
+msgstr ""
+"jobs from the job table; the -r option means to remove only running jobs."
+
+#: builtins.c:675
+msgid "Send the processes named by PID (or JOB) the signal SIGSPEC.  If"
+msgstr "Send the processes named by PID (or JOB) the signal SIGSPEC.  If"
+
+#: builtins.c:676
+msgid "SIGSPEC is not present, then SIGTERM is assumed.  An argument of `-l'"
+msgstr "SIGSPEC is not present, then SIGTERM is assumed.  An argument of ‘-l’"
+
+#: builtins.c:677
+msgid "lists the signal names; if arguments follow `-l' they are assumed to"
+msgstr "lists the signal names; if arguments follow ‘-l’ they are assumed to"
+
+#: builtins.c:678
+msgid "be signal numbers for which names should be listed.  Kill is a shell"
+msgstr "be signal numbers for which names should be listed.  Kill is a shell"
+
+#: builtins.c:679
+msgid "builtin for two reasons: it allows job IDs to be used instead of"
+msgstr "builtin for two reasons: it allows job IDs to be used instead of"
+
+#: builtins.c:680
+msgid "process IDs, and, if you have reached the limit on processes that"
+msgstr "process IDs, and, if you have reached the limit on processes that"
+
+#: builtins.c:681
+msgid "you can create, you don't have to start a process to kill another one."
+msgstr "you can create, you don't have to start a process to kill another one."
+
+#: builtins.c:687
+msgid "Each ARG is an arithmetic expression to be evaluated.  Evaluation"
+msgstr "Each ARG is an arithmetic expression to be evaluated.  Evaluation"
+
+#: builtins.c:688
+msgid "is done in fixed-width integers with no check for overflow, though"
+msgstr "is done in fixed-width integers with no check for overflow, though"
+
+#: builtins.c:689
+msgid "division by 0 is trapped and flagged as an error.  The following"
+msgstr "division by 0 is trapped and flagged as an error.  The following"
+
+#: builtins.c:690
+msgid "list of operators is grouped into levels of equal-precedence operators."
+msgstr ""
+"list of operators is grouped into levels of equal-precedence operators."
+
+#: builtins.c:691
+msgid "The levels are listed in order of decreasing precedence."
+msgstr "The levels are listed in order of decreasing precedence."
+
+#: builtins.c:693
+msgid "\tid++, id--\tvariable post-increment, post-decrement"
+msgstr "\tid++, id--\tvariable post-increment, post-decrement"
+
+#: builtins.c:694
+msgid "\t++id, --id\tvariable pre-increment, pre-decrement"
+msgstr "\t++id, --id\tvariable pre-increment, pre-decrement"
+
+#: builtins.c:695
+msgid "\t-, +\t\tunary minus, plus"
+msgstr "\t-, +\t\tunary minus, plus"
+
+#: builtins.c:696
+msgid "\t!, ~\t\tlogical and bitwise negation"
+msgstr "\t!, ~\t\tlogical and bitwise negation"
+
+#: builtins.c:697
+msgid "\t**\t\texponentiation"
+msgstr "\t**\t\texponentiation"
+
+#: builtins.c:698
+msgid "\t*, /, %\t\tmultiplication, division, remainder"
+msgstr "\t*, /, %\t\tmultiplication, division, remainder"
+
+#: builtins.c:699
+msgid "\t+, -\t\taddition, subtraction"
+msgstr "\t+, -\t\taddition, subtraction"
+
+#: builtins.c:700
+msgid "\t<<, >>\t\tleft and right bitwise shifts"
+msgstr "\t<<, >>\t\tleft and right bitwise shifts"
+
+#: builtins.c:701
+msgid "\t<=, >=, <, >\tcomparison"
+msgstr "\t<=, >=, <, >\tcomparison"
+
+#: builtins.c:702
+msgid "\t==, !=\t\tequality, inequality"
+msgstr "\t==, !=\t\tequality, inequality"
+
+#: builtins.c:703
+msgid "\t&\t\tbitwise AND"
+msgstr "\t&\t\tbitwise AND"
+
+#: builtins.c:704
+msgid "\t^\t\tbitwise XOR"
+msgstr "\t^\t\tbitwise XOR"
+
+#: builtins.c:705
+msgid "\t|\t\tbitwise OR"
+msgstr "\t|\t\tbitwise OR"
+
+#: builtins.c:706
+msgid "\t&&\t\tlogical AND"
+msgstr "\t&&\t\tlogical AND"
+
+#: builtins.c:707
+msgid "\t||\t\tlogical OR"
+msgstr "\t||\t\tlogical OR"
+
+#: builtins.c:708
+msgid "\texpr ? expr : expr"
+msgstr "\texpr ? expr : expr"
+
+#: builtins.c:709
+msgid "\t\t\tconditional operator"
+msgstr "\t\t\tconditional operator"
+
+#: builtins.c:710
+msgid "\t=, *=, /=, %=,"
+msgstr "\t=, *=, /=, %=,"
+
+#: builtins.c:711
+msgid "\t+=, -=, <<=, >>=,"
+msgstr "\t+=, -=, <<=, >>=,"
+
+#: builtins.c:712
+msgid "\t&=, ^=, |=\tassignment"
+msgstr "\t&=, ^=, |=\tassignment"
+
+#: builtins.c:714
+msgid "Shell variables are allowed as operands.  The name of the variable"
+msgstr "Shell variables are allowed as operands.  The name of the variable"
+
+#: builtins.c:715
+msgid "is replaced by its value (coerced to a fixed-width integer) within"
+msgstr "is replaced by its value (coerced to a fixed-width integer) within"
+
+#: builtins.c:716
+msgid "an expression.  The variable need not have its integer attribute"
+msgstr "an expression.  The variable need not have its integer attribute"
+
+#: builtins.c:717
+msgid "turned on to be used in an expression."
+msgstr "turned on to be used in an expression."
+
+#: builtins.c:719
+msgid "Operators are evaluated in order of precedence.  Sub-expressions in"
+msgstr "Operators are evaluated in order of precedence.  Sub-expressions in"
+
+#: builtins.c:720
+msgid "parentheses are evaluated first and may override the precedence"
+msgstr "parentheses are evaluated first and may override the precedence"
+
+#: builtins.c:721
+msgid "rules above."
+msgstr "rules above."
+
+#: builtins.c:723
+msgid "If the last ARG evaluates to 0, let returns 1; 0 is returned"
+msgstr "If the last ARG evaluates to 0, let returns 1; 0 is returned"
+
+#: builtins.c:724
+msgid "otherwise."
+msgstr "otherwise."
+
+#: builtins.c:730
+msgid ""
+"One line is read from the standard input, or from file descriptor FD if the"
+msgstr ""
+"One line is read from the standard input, or from file descriptor FD if the"
+
+#: builtins.c:731
+msgid ""
+"-u option is supplied, and the first word is assigned to the first NAME,"
+msgstr ""
+"-u option is supplied, and the first word is assigned to the first NAME,"
+
+#: builtins.c:732
+msgid ""
+"the second word to the second NAME, and so on, with leftover words assigned"
+msgstr ""
+"the second word to the second NAME, and so on, with leftover words assigned"
+
+#: builtins.c:733
+msgid ""
+"to the last NAME.  Only the characters found in $IFS are recognized as word"
+msgstr ""
+"to the last NAME.  Only the characters found in $IFS are recognized as word"
+
+#: builtins.c:734
+msgid ""
+"delimiters.  If no NAMEs are supplied, the line read is stored in the REPLY"
+msgstr ""
+"delimiters.  If no NAMEs are supplied, the line read is stored in the REPLY"
+
+#: builtins.c:735
+msgid "variable.  If the -r option is given, this signifies `raw' input, and"
+msgstr "variable.  If the -r option is given, this signifies ‘raw’ input, and"
+
+#: builtins.c:736
+msgid "backslash escaping is disabled.  The -d option causes read to continue"
+msgstr "backslash escaping is disabled.  The -d option causes read to continue"
+
+#: builtins.c:737
+msgid ""
+"until the first character of DELIM is read, rather than newline.  If the -p"
+msgstr ""
+"until the first character of DELIM is read, rather than newline.  If the -p"
+
+#: builtins.c:738
+msgid ""
+"option is supplied, the string PROMPT is output without a trailing newline"
+msgstr ""
+"option is supplied, the string PROMPT is output without a trailing newline"
+
+#: builtins.c:739
+msgid ""
+"before attempting to read.  If -a is supplied, the words read are assigned"
+msgstr ""
+"before attempting to read.  If -a is supplied, the words read are assigned"
+
+#: builtins.c:740
+msgid ""
+"to sequential indices of ARRAY, starting at zero.  If -e is supplied and"
+msgstr ""
+"to sequential indices of ARRAY, starting at zero.  If -e is supplied and"
+
+#: builtins.c:741
+msgid ""
+"the shell is interactive, readline is used to obtain the line.  If -n is"
+msgstr ""
+"the shell is interactive, readline is used to obtain the line.  If -n is"
+
+#: builtins.c:742
+msgid "supplied with a non-zero NCHARS argument, read returns after NCHARS"
+msgstr "supplied with a non-zero NCHARS argument, read returns after NCHARS"
+
+#: builtins.c:743
+msgid "characters have been read.  The -s option causes input coming from a"
+msgstr "characters have been read.  The -s option causes input coming from a"
+
+#: builtins.c:744
+msgid "terminal to not be echoed."
+msgstr "terminal to not be echoed."
+
+#: builtins.c:746
+msgid ""
+"The -t option causes read to time out and return failure if a complete line"
+msgstr ""
+"The -t option causes read to time out and return failure if a complete line"
+
+#: builtins.c:747
+msgid ""
+"of input is not read within TIMEOUT seconds.  If the TMOUT variable is set,"
+msgstr ""
+"of input is not read within TIMEOUT seconds.  If the TMOUT variable is set,"
+
+#: builtins.c:748
+msgid ""
+"its value is the default timeout.  The return code is zero, unless end-of-"
+"file"
+msgstr ""
+"its value is the default timeout.  The return code is zero, unless end-of-"
+"file"
+
+#: builtins.c:749
+msgid ""
+"is encountered, read times out, or an invalid file descriptor is supplied as"
+msgstr ""
+"is encountered, read times out, or an invalid file descriptor is supplied as"
+
+#: builtins.c:750
+msgid "the argument to -u."
+msgstr "the argument to -u."
+
+#: builtins.c:756
+msgid "Causes a function to exit with the return value specified by N.  If N"
+msgstr "Causes a function to exit with the return value specified by N.  If N"
+
+#: builtins.c:757
+msgid "is omitted, the return status is that of the last command."
+msgstr "is omitted, the return status is that of the last command."
+
+#: builtins.c:763
+msgid "    -a  Mark variables which are modified or created for export."
+msgstr "    -a  Mark variables which are modified or created for export."
+
+#: builtins.c:764
+msgid "    -b  Notify of job termination immediately."
+msgstr "    -b  Notify of job termination immediately."
+
+#: builtins.c:765
+msgid "    -e  Exit immediately if a command exits with a non-zero status."
+msgstr "    -e  Exit immediately if a command exits with a non-zero status."
+
+#: builtins.c:766
+msgid "    -f  Disable file name generation (globbing)."
+msgstr "    -f  Disable file name generation (globbing)."
+
+#: builtins.c:767
+msgid "    -h  Remember the location of commands as they are looked up."
+msgstr "    -h  Remember the location of commands as they are looked up."
+
+#: builtins.c:768
+msgid "    -k  All assignment arguments are placed in the environment for a"
+msgstr "    -k  All assignment arguments are placed in the environment for a"
+
+#: builtins.c:769
+msgid "        command, not just those that precede the command name."
+msgstr "        command, not just those that precede the command name."
+
+#: builtins.c:770
+msgid "    -m  Job control is enabled."
+msgstr "    -m  Job control is enabled."
+
+#: builtins.c:771
+msgid "    -n  Read commands but do not execute them."
+msgstr "    -n  Read commands but do not execute them."
+
+#: builtins.c:772
+msgid "    -o option-name"
+msgstr "    -o option-name"
+
+#: builtins.c:773
+msgid "        Set the variable corresponding to option-name:"
+msgstr "        Set the variable corresponding to option-name:"
+
+#: builtins.c:774
+msgid "            allexport    same as -a"
+msgstr "            allexport    same as -a"
+
+#: builtins.c:775
+msgid "            braceexpand  same as -B"
+msgstr "            braceexpand  same as -B"
+
+#: builtins.c:777
+msgid "            emacs        use an emacs-style line editing interface"
+msgstr "            emacs        use an emacs-style line editing interface"
+
+#: builtins.c:779
+msgid "            errexit      same as -e"
+msgstr "            errexit      same as -e"
+
+#: builtins.c:780
+msgid "            errtrace     same as -E"
+msgstr "            errtrace     same as -E"
+
+#: builtins.c:781
+msgid "            functrace    same as -T"
+msgstr "            functrace    same as -T"
+
+#: builtins.c:782
+msgid "            hashall      same as -h"
+msgstr "            hashall      same as -h"
+
+#: builtins.c:784
+msgid "            histexpand   same as -H"
+msgstr "            histexpand   same as -H"
+
+#: builtins.c:787
+msgid "            history      enable command history"
+msgstr "            history      enable command history"
+
+#: builtins.c:789
+msgid "            ignoreeof    the shell will not exit upon reading EOF"
+msgstr "            ignoreeof    the shell will not exit upon reading EOF"
+
+#: builtins.c:790
+msgid "            interactive-comments"
+msgstr "            interactive-comments"
+
+#: builtins.c:791
+msgid ""
+"                         allow comments to appear in interactive commands"
+msgstr ""
+"                         allow comments to appear in interactive commands"
+
+#: builtins.c:792
+msgid "            keyword      same as -k"
+msgstr "            keyword      same as -k"
+
+#: builtins.c:793
+msgid "            monitor      same as -m"
+msgstr "            monitor      same as -m"
+
+#: builtins.c:794
+msgid "            noclobber    same as -C"
+msgstr "            noclobber    same as -C"
+
+#: builtins.c:795
+msgid "            noexec       same as -n"
+msgstr "            noexec       same as -n"
+
+#: builtins.c:796
+msgid "            noglob       same as -f"
+msgstr "            noglob       same as -f"
+
+#: builtins.c:797
+msgid "            nolog        currently accepted but ignored"
+msgstr "            nolog        currently accepted but ignored"
+
+#: builtins.c:798
+msgid "            notify       same as -b"
+msgstr "            notify       same as -b"
+
+#: builtins.c:799
+msgid "            nounset      same as -u"
+msgstr "            nounset      same as -u"
+
+#: builtins.c:800
+msgid "            onecmd       same as -t"
+msgstr "            onecmd       same as -t"
+
+#: builtins.c:801
+msgid "            physical     same as -P"
+msgstr "            physical     same as -P"
+
+#: builtins.c:802
+msgid ""
+"            pipefail     the return value of a pipeline is the status of"
+msgstr ""
+"            pipefail     the return value of a pipeline is the status of"
+
+#: builtins.c:803
+msgid ""
+"                         the last command to exit with a non-zero status,"
+msgstr ""
+"                         the last command to exit with a non-zero status,"
+
+#: builtins.c:804
+msgid ""
+"                         or zero if no command exited with a non-zero status"
+msgstr ""
+"                         or zero if no command exited with a non-zero status"
+
+#: builtins.c:805
+msgid "            posix        change the behavior of bash where the default"
+msgstr "            posix        change the behavior of bash where the default"
+
+#: builtins.c:806
+msgid "                         operation differs from the 1003.2 standard to"
+msgstr "                         operation differs from the 1003.2 standard to"
+
+#: builtins.c:807
+msgid "                         match the standard"
+msgstr "                         match the standard"
+
+#: builtins.c:808
+msgid "            privileged   same as -p"
+msgstr "            privileged   same as -p"
+
+#: builtins.c:809
+msgid "            verbose      same as -v"
+msgstr "            verbose      same as -v"
+
+#: builtins.c:811
+msgid "            vi           use a vi-style line editing interface"
+msgstr "            vi           use a vi-style line editing interface"
+
+#: builtins.c:813
+msgid "            xtrace       same as -x"
+msgstr "            xtrace       same as -x"
+
+#: builtins.c:814
+msgid ""
+"    -p  Turned on whenever the real and effective user ids do not match."
+msgstr ""
+"    -p  Turned on whenever the real and effective user ids do not match."
+
+#: builtins.c:815
+msgid "        Disables processing of the $ENV file and importing of shell"
+msgstr "        Disables processing of the $ENV file and importing of shell"
+
+#: builtins.c:816
+msgid ""
+"        functions.  Turning this option off causes the effective uid and"
+msgstr ""
+"        functions.  Turning this option off causes the effective uid and"
+
+#: builtins.c:817
+msgid "        gid to be set to the real uid and gid."
+msgstr "        gid to be set to the real uid and gid."
+
+#: builtins.c:818
+msgid "    -t  Exit after reading and executing one command."
+msgstr "    -t  Exit after reading and executing one command."
+
+#: builtins.c:819
+msgid "    -u  Treat unset variables as an error when substituting."
+msgstr "    -u  Treat unset variables as an error when substituting."
+
+#: builtins.c:820
+msgid "    -v  Print shell input lines as they are read."
+msgstr "    -v  Print shell input lines as they are read."
+
+#: builtins.c:821
+msgid "    -x  Print commands and their arguments as they are executed."
+msgstr "    -x  Print commands and their arguments as they are executed."
+
+#: builtins.c:823
+msgid "    -B  the shell will perform brace expansion"
+msgstr "    -B  the shell will perform brace expansion"
+
+#: builtins.c:825
+msgid "    -C  If set, disallow existing regular files to be overwritten"
+msgstr "    -C  If set, disallow existing regular files to be overwritten"
+
+#: builtins.c:826
+msgid "        by redirection of output."
+msgstr "        by redirection of output."
+
+#: builtins.c:827
+msgid "    -E  If set, the ERR trap is inherited by shell functions."
+msgstr "    -E  If set, the ERR trap is inherited by shell functions."
+
+#: builtins.c:829
+msgid "    -H  Enable ! style history substitution.  This flag is on"
+msgstr "    -H  Enable ! style history substitution.  This flag is on"
+
+#: builtins.c:830
+msgid "        by default."
+msgstr "        by default."
+
+#: builtins.c:832
+msgid "    -P  If set, do not follow symbolic links when executing commands"
+msgstr "    -P  If set, do not follow symbolic links when executing commands"
+
+#: builtins.c:833
+msgid "        such as cd which change the current directory."
+msgstr "        such as cd which change the current directory."
+
+#: builtins.c:834
+msgid "    -T  If set, the DEBUG trap is inherited by shell functions."
+msgstr "    -T  If set, the DEBUG trap is inherited by shell functions."
+
+#: builtins.c:836
+msgid "Using + rather than - causes these flags to be turned off.  The"
+msgstr "Using + rather than - causes these flags to be turned off.  The"
+
+#: builtins.c:837
+msgid "flags can also be used upon invocation of the shell.  The current"
+msgstr "flags can also be used upon invocation of the shell.  The current"
+
+#: builtins.c:838
+msgid "set of flags may be found in $-.  The remaining n ARGs are positional"
+msgstr "set of flags may be found in $-.  The remaining n ARGs are positional"
+
+#: builtins.c:839
+msgid "parameters and are assigned, in order, to $1, $2, .. $n.  If no"
+msgstr "parameters and are assigned, in order, to $1, $2, .. $n.  If no"
+
+#: builtins.c:840
+msgid "ARGs are given, all shell variables are printed."
+msgstr "ARGs are given, all shell variables are printed."
+
+#: builtins.c:846
+msgid "For each NAME, remove the corresponding variable or function.  Given"
+msgstr "For each NAME, remove the corresponding variable or function.  Given"
+
+#: builtins.c:847
+msgid "the `-v', unset will only act on variables.  Given the `-f' flag,"
+msgstr "the ‘-v’, unset will only act on variables.  Given the ‘-f’ flag,"
+
+#: builtins.c:848
+msgid "unset will only act on functions.  With neither flag, unset first"
+msgstr "unset will only act on functions.  With neither flag, unset first"
+
+#: builtins.c:849
+msgid "tries to unset a variable, and if that fails, then tries to unset a"
+msgstr "tries to unset a variable, and if that fails, then tries to unset a"
+
+#: builtins.c:850
+msgid "function.  Some variables cannot be unset; also see readonly."
+msgstr "function.  Some variables cannot be unset; also see readonly."
+
+#: builtins.c:856
+msgid "NAMEs are marked for automatic export to the environment of"
+msgstr "NAMEs are marked for automatic export to the environment of"
+
+#: builtins.c:857
+msgid "subsequently executed commands.  If the -f option is given,"
+msgstr "subsequently executed commands.  If the -f option is given,"
+
+#: builtins.c:858
+msgid "the NAMEs refer to functions.  If no NAMEs are given, or if `-p'"
+msgstr "the NAMEs refer to functions.  If no NAMEs are given, or if ‘-p’"
+
+#: builtins.c:859
+msgid "is given, a list of all names that are exported in this shell is"
+msgstr "is given, a list of all names that are exported in this shell is"
+
+#: builtins.c:860
+msgid "printed.  An argument of `-n' says to remove the export property"
+msgstr "printed.  An argument of ‘-n’ says to remove the export property"
+
+#: builtins.c:861
+msgid "from subsequent NAMEs.  An argument of `--' disables further option"
+msgstr "from subsequent NAMEs.  An argument of ‘--’ disables further option"
+
+#: builtins.c:862 builtins.c:874
+msgid "processing."
+msgstr "processing."
+
+#: builtins.c:868
+msgid "The given NAMEs are marked readonly and the values of these NAMEs may"
+msgstr "The given NAMEs are marked readonly and the values of these NAMEs may"
+
+#: builtins.c:869
+msgid "not be changed by subsequent assignment.  If the -f option is given,"
+msgstr "not be changed by subsequent assignment.  If the -f option is given,"
+
+#: builtins.c:870
+msgid "then functions corresponding to the NAMEs are so marked.  If no"
+msgstr "then functions corresponding to the NAMEs are so marked.  If no"
+
+#: builtins.c:871
+msgid "arguments are given, or if `-p' is given, a list of all readonly names"
+msgstr "arguments are given, or if ‘-p’ is given, a list of all readonly names"
+
+#: builtins.c:872
+msgid "is printed.  The `-a' option means to treat each NAME as"
+msgstr "is printed.  The ‘-a’ option means to treat each NAME as"
+
+#: builtins.c:873
+msgid "an array variable.  An argument of `--' disables further option"
+msgstr "an array variable.  An argument of ‘--’ disables further option"
+
+#: builtins.c:880
+msgid "The positional parameters from $N+1 ... are renamed to $1 ...  If N is"
+msgstr "The positional parameters from $N+1 ... are renamed to $1 ...  If N is"
+
+#: builtins.c:881
+msgid "not given, it is assumed to be 1."
+msgstr "not given, it is assumed to be 1."
+
+#: builtins.c:887 builtins.c:896
+msgid "Read and execute commands from FILENAME and return.  The pathnames"
+msgstr "Read and execute commands from FILENAME and return.  The pathnames"
+
+#: builtins.c:888 builtins.c:897
+msgid "in $PATH are used to find the directory containing FILENAME.  If any"
+msgstr "in $PATH are used to find the directory containing FILENAME.  If any"
+
+#: builtins.c:889 builtins.c:898
+msgid "ARGUMENTS are supplied, they become the positional parameters when"
+msgstr "ARGUMENTS are supplied, they become the positional parameters when"
+
+#: builtins.c:890 builtins.c:899
+msgid "FILENAME is executed."
+msgstr "FILENAME is executed."
+
+#: builtins.c:906
+msgid "Suspend the execution of this shell until it receives a SIGCONT"
+msgstr "Suspend the execution of this shell until it receives a SIGCONT"
+
+#: builtins.c:907
+msgid "signal.  The `-f' if specified says not to complain about this"
+msgstr "signal.  The ‘-f’ if specified says not to complain about this"
+
+#: builtins.c:908
+msgid "being a login shell if it is; just suspend anyway."
+msgstr "being a login shell if it is; just suspend anyway."
+
+#: builtins.c:915
+msgid "Exits with a status of 0 (true) or 1 (false) depending on"
+msgstr "Exits with a status of 0 (true) or 1 (false) depending on"
+
+#: builtins.c:916
+msgid "the evaluation of EXPR.  Expressions may be unary or binary.  Unary"
+msgstr "the evaluation of EXPR.  Expressions may be unary or binary.  Unary"
+
+#: builtins.c:917
+msgid "expressions are often used to examine the status of a file.  There"
+msgstr "expressions are often used to examine the status of a file.  There"
+
+#: builtins.c:918
+msgid "are string operators as well, and numeric comparison operators."
+msgstr "are string operators as well, and numeric comparison operators."
+
+#: builtins.c:920
+msgid "File operators:"
+msgstr "File operators:"
+
+#: builtins.c:922
+msgid "    -a FILE        True if file exists."
+msgstr "    -a FILE        True if file exists."
+
+#: builtins.c:923
+msgid "    -b FILE        True if file is block special."
+msgstr "    -b FILE        True if file is block special."
+
+#: builtins.c:924
+msgid "    -c FILE        True if file is character special."
+msgstr "    -c FILE        True if file is character special."
+
+#: builtins.c:925
+msgid "    -d FILE        True if file is a directory."
+msgstr "    -d FILE        True if file is a directory."
+
+#: builtins.c:926
+msgid "    -e FILE        True if file exists."
+msgstr "    -e FILE        True if file exists."
+
+#: builtins.c:927
+msgid "    -f FILE        True if file exists and is a regular file."
+msgstr "    -f FILE        True if file exists and is a regular file."
+
+#: builtins.c:928
+msgid "    -g FILE        True if file is set-group-id."
+msgstr "    -g FILE        True if file is set-group-id."
+
+#: builtins.c:929
+msgid "    -h FILE        True if file is a symbolic link."
+msgstr "    -h FILE        True if file is a symbolic link."
+
+#: builtins.c:930
+msgid "    -L FILE        True if file is a symbolic link."
+msgstr "    -L FILE        True if file is a symbolic link."
+
+#: builtins.c:931
+msgid "    -k FILE        True if file has its `sticky' bit set."
+msgstr "    -k FILE        True if file has its ‘sticky’ bit set."
+
+#: builtins.c:932
+msgid "    -p FILE        True if file is a named pipe."
+msgstr "    -p FILE        True if file is a named pipe."
+
+#: builtins.c:933
+msgid "    -r FILE        True if file is readable by you."
+msgstr "    -r FILE        True if file is readable by you."
+
+#: builtins.c:934
+msgid "    -s FILE        True if file exists and is not empty."
+msgstr "    -s FILE        True if file exists and is not empty."
+
+#: builtins.c:935
+msgid "    -S FILE        True if file is a socket."
+msgstr "    -S FILE        True if file is a socket."
+
+#: builtins.c:936
+msgid "    -t FD          True if FD is opened on a terminal."
+msgstr "    -t FD          True if FD is opened on a terminal."
+
+#: builtins.c:937
+msgid "    -u FILE        True if the file is set-user-id."
+msgstr "    -u FILE        True if the file is set-user-id."
+
+#: builtins.c:938
+msgid "    -w FILE        True if the file is writable by you."
+msgstr "    -w FILE        True if the file is writable by you."
+
+#: builtins.c:939
+msgid "    -x FILE        True if the file is executable by you."
+msgstr "    -x FILE        True if the file is executable by you."
+
+#: builtins.c:940
+msgid "    -O FILE        True if the file is effectively owned by you."
+msgstr "    -O FILE        True if the file is effectively owned by you."
+
+#: builtins.c:941
+msgid "    -G FILE        True if the file is effectively owned by your group."
+msgstr ""
+"    -G FILE        True if the file is effectively owned by your group."
+
+#: builtins.c:942
+msgid ""
+"    -N FILE        True if the file has been modified since it was last read."
+msgstr ""
+"    -N FILE        True if the file has been modified since it was last read."
+
+#: builtins.c:944
+msgid "  FILE1 -nt FILE2  True if file1 is newer than file2 (according to"
+msgstr "  FILE1 -nt FILE2  True if file1 is newer than file2 (according to"
+
+#: builtins.c:945
+msgid "                   modification date)."
+msgstr "                   modification date)."
+
+#: builtins.c:947
+msgid "  FILE1 -ot FILE2  True if file1 is older than file2."
+msgstr "  FILE1 -ot FILE2  True if file1 is older than file2."
+
+#: builtins.c:949
+msgid "  FILE1 -ef FILE2  True if file1 is a hard link to file2."
+msgstr "  FILE1 -ef FILE2  True if file1 is a hard link to file2."
+
+#: builtins.c:951
+msgid "String operators:"
+msgstr "String operators:"
+
+#: builtins.c:953
+msgid "    -z STRING      True if string is empty."
+msgstr "    -z STRING      True if string is empty."
+
+#: builtins.c:955
+msgid "    -n STRING"
+msgstr "    -n STRING"
+
+#: builtins.c:956
+msgid "    STRING         True if string is not empty."
+msgstr "    STRING         True if string is not empty."
+
+#: builtins.c:958
+msgid "    STRING1 = STRING2"
+msgstr "    STRING1 = STRING2"
+
+#: builtins.c:959
+msgid "                   True if the strings are equal."
+msgstr "                   True if the strings are equal."
+
+#: builtins.c:960
+msgid "    STRING1 != STRING2"
+msgstr "    STRING1 != STRING2"
+
+#: builtins.c:961
+msgid "                   True if the strings are not equal."
+msgstr "                   True if the strings are not equal."
+
+#: builtins.c:962
+msgid "    STRING1 < STRING2"
+msgstr "    STRING1 < STRING2"
+
+#: builtins.c:963
+msgid ""
+"                   True if STRING1 sorts before STRING2 lexicographically."
+msgstr ""
+"                   True if STRING1 sorts before STRING2 lexicographically."
+
+#: builtins.c:964
+msgid "    STRING1 > STRING2"
+msgstr "    STRING1 > STRING2"
+
+#: builtins.c:965
+msgid ""
+"                   True if STRING1 sorts after STRING2 lexicographically."
+msgstr ""
+"                   True if STRING1 sorts after STRING2 lexicographically."
+
+#: builtins.c:967
+msgid "Other operators:"
+msgstr "Other operators:"
+
+#: builtins.c:969
+msgid "    -o OPTION      True if the shell option OPTION is enabled."
+msgstr "    -o OPTION      True if the shell option OPTION is enabled."
+
+#: builtins.c:970
+msgid "    ! EXPR         True if expr is false."
+msgstr "    ! EXPR         True if expr is false."
+
+#: builtins.c:971
+msgid "    EXPR1 -a EXPR2 True if both expr1 AND expr2 are true."
+msgstr "    EXPR1 -a EXPR2 True if both expr1 AND expr2 are true."
+
+#: builtins.c:972
+msgid "    EXPR1 -o EXPR2 True if either expr1 OR expr2 is true."
+msgstr "    EXPR1 -o EXPR2 True if either expr1 OR expr2 is true."
+
+#: builtins.c:974
+msgid "    arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,"
+msgstr "    arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,"
+
+#: builtins.c:975
+msgid "                   -lt, -le, -gt, or -ge."
+msgstr "                   -lt, -le, -gt, or -ge."
+
+#: builtins.c:977
+msgid "Arithmetic binary operators return true if ARG1 is equal, not-equal,"
+msgstr "Arithmetic binary operators return true if ARG1 is equal, not-equal,"
+
+#: builtins.c:978
+msgid "less-than, less-than-or-equal, greater-than, or greater-than-or-equal"
+msgstr "less-than, less-than-or-equal, greater-than, or greater-than-or-equal"
+
+#: builtins.c:979
+msgid "than ARG2."
+msgstr "than ARG2."
+
+#: builtins.c:985
+msgid "This is a synonym for the \"test\" builtin, but the last"
+msgstr "This is a synonym for the “test” builtin, but the last"
+
+#: builtins.c:986
+msgid "argument must be a literal `]', to match the opening `['."
+msgstr "argument must be a literal ‘]’, to match the opening ‘[’."
+
+#: builtins.c:992
+msgid "Print the accumulated user and system times for processes run from"
+msgstr "Print the accumulated user and system times for processes run from"
+
+#: builtins.c:993
+msgid "the shell."
+msgstr "the shell."
+
+#: builtins.c:999
+msgid "The command ARG is to be read and executed when the shell receives"
+msgstr "The command ARG is to be read and executed when the shell receives"
+
+#: builtins.c:1000
+msgid "signal(s) SIGNAL_SPEC.  If ARG is absent all specified signals are"
+msgstr "signal(s) SIGNAL_SPEC.  If ARG is absent all specified signals are"
+
+#: builtins.c:1001
+msgid "reset to their original values.  If ARG is the null string each"
+msgstr "reset to their original values.  If ARG is the null string each"
+
+#: builtins.c:1002
+msgid "SIGNAL_SPEC is ignored by the shell and by the commands it invokes."
+msgstr "SIGNAL_SPEC is ignored by the shell and by the commands it invokes."
+
+#: builtins.c:1003
+msgid "If a SIGNAL_SPEC is EXIT (0) the command ARG is executed on exit from"
+msgstr "If a SIGNAL_SPEC is EXIT (0) the command ARG is executed on exit from"
+
+#: builtins.c:1004
+msgid "the shell.  If a SIGNAL_SPEC is DEBUG, ARG is executed after every"
+msgstr "the shell.  If a SIGNAL_SPEC is DEBUG, ARG is executed after every"
+
+#: builtins.c:1005
+msgid "command.  If ARG is `-p' then the trap commands associated with"
+msgstr "command.  If ARG is ‘-p’ then the trap commands associated with"
+
+#: builtins.c:1006
+msgid "each SIGNAL_SPEC are displayed.  If no arguments are supplied or if"
+msgstr "each SIGNAL_SPEC are displayed.  If no arguments are supplied or if"
+
+#: builtins.c:1007
+msgid "only `-p' is given, trap prints the list of commands associated with"
+msgstr "only ‘-p’ is given, trap prints the list of commands associated with"
+
+#: builtins.c:1008
+msgid ""
+"each signal number.  Each SIGNAL_SPEC is either a signal name in <signal.h>"
+msgstr ""
+"each signal number.  Each SIGNAL_SPEC is either a signal name in <signal.h>"
+
+#: builtins.c:1009
+msgid "or a signal number.  `trap -l' prints a list of signal names and their"
+msgstr "or a signal number.  ‘trap -l’ prints a list of signal names and their"
+
+#: builtins.c:1010
+msgid "corresponding numbers.  Note that a signal can be sent to the shell"
+msgstr "corresponding numbers.  Note that a signal can be sent to the shell"
+
+#: builtins.c:1011
+msgid "with \"kill -signal $$\"."
+msgstr "with “kill -signal $$”."
+
+#: builtins.c:1017
+msgid "For each NAME, indicate how it would be interpreted if used as a"
+msgstr "For each NAME, indicate how it would be interpreted if used as a"
+
+#: builtins.c:1018
+msgid "command name."
+msgstr "command name."
+
+#: builtins.c:1020
+msgid "If the -t option is used, `type' outputs a single word which is one of"
+msgstr "If the -t option is used, ‘type’ outputs a single word which is one of"
+
+#: builtins.c:1021
+msgid "`alias', `keyword', `function', `builtin', `file' or `', if NAME is an"
+msgstr "‘alias’, ‘keyword’, ‘function’, ‘builtin’, ‘file’ or ‘’, if NAME is an"
+
+#: builtins.c:1022
+msgid "alias, shell reserved word, shell function, shell builtin, disk file,"
+msgstr "alias, shell reserved word, shell function, shell builtin, disk file,"
+
+#: builtins.c:1023
+msgid "or unfound, respectively."
+msgstr "or unfound, respectively."
+
+#: builtins.c:1025
+msgid "If the -p flag is used, `type' either returns the name of the disk"
+msgstr "If the -p flag is used, ‘type’ either returns the name of the disk"
+
+#: builtins.c:1026
+msgid "file that would be executed, or nothing if `type -t NAME' would not"
+msgstr "file that would be executed, or nothing if ‘type -t NAME’ would not"
+
+#: builtins.c:1027
+msgid "return `file'."
+msgstr "return ‘file’."
+
+#: builtins.c:1029
+msgid "If the -a flag is used, `type' displays all of the places that contain"
+msgstr "If the -a flag is used, ‘type’ displays all of the places that contain"
+
+#: builtins.c:1030
+msgid "an executable named `file'.  This includes aliases, builtins, and"
+msgstr "an executable named ‘file’.  This includes aliases, builtins, and"
+
+#: builtins.c:1031
+msgid "functions, if and only if the -p flag is not also used."
+msgstr "functions, if and only if the -p flag is not also used."
+
+#: builtins.c:1033
+msgid "The -f flag suppresses shell function lookup."
+msgstr "The -f flag suppresses shell function lookup."
+
+#: builtins.c:1035
+msgid "The -P flag forces a PATH search for each NAME, even if it is an alias,"
+msgstr ""
+"The -P flag forces a PATH search for each NAME, even if it is an alias,"
+
+#: builtins.c:1036
+msgid "builtin, or function, and returns the name of the disk file that would"
+msgstr "builtin, or function, and returns the name of the disk file that would"
+
+#: builtins.c:1037
+msgid "be executed."
+msgstr "be executed."
+
+#: builtins.c:1044
+msgid "Ulimit provides control over the resources available to processes"
+msgstr "Ulimit provides control over the resources available to processes"
+
+#: builtins.c:1045
+msgid "started by the shell, on systems that allow such control.  If an"
+msgstr "started by the shell, on systems that allow such control.  If an"
+
+#: builtins.c:1046
+msgid "option is given, it is interpreted as follows:"
+msgstr "option is given, it is interpreted as follows:"
+
+#: builtins.c:1048
+msgid "    -S\tuse the `soft' resource limit"
+msgstr "    -S\tuse the ‘soft’ resource limit"
+
+#: builtins.c:1049
+msgid "    -H\tuse the `hard' resource limit"
+msgstr "    -H\tuse the ‘hard’ resource limit"
+
+#: builtins.c:1050
+msgid "    -a\tall current limits are reported"
+msgstr "    -a\tall current limits are reported"
+
+#: builtins.c:1051
+msgid "    -c\tthe maximum size of core files created"
+msgstr "    -c\tthe maximum size of core files created"
+
+#: builtins.c:1052
+msgid "    -d\tthe maximum size of a process's data segment"
+msgstr "    -d\tthe maximum size of a process's data segment"
+
+#: builtins.c:1053
+msgid "    -f\tthe maximum size of files created by the shell"
+msgstr "    -f\tthe maximum size of files created by the shell"
+
+#: builtins.c:1054
+msgid "    -l\tthe maximum size a process may lock into memory"
+msgstr "    -l\tthe maximum size a process may lock into memory"
+
+#: builtins.c:1055
+msgid "    -m\tthe maximum resident set size"
+msgstr "    -m\tthe maximum resident set size"
+
+#: builtins.c:1056
+msgid "    -n\tthe maximum number of open file descriptors"
+msgstr "    -n\tthe maximum number of open file descriptors"
+
+#: builtins.c:1057
+msgid "    -p\tthe pipe buffer size"
+msgstr "    -p\tthe pipe buffer size"
+
+#: builtins.c:1058
+msgid "    -s\tthe maximum stack size"
+msgstr "    -s\tthe maximum stack size"
+
+#: builtins.c:1059
+msgid "    -t\tthe maximum amount of cpu time in seconds"
+msgstr "    -t\tthe maximum amount of cpu time in seconds"
+
+#: builtins.c:1060
+msgid "    -u\tthe maximum number of user processes"
+msgstr "    -u\tthe maximum number of user processes"
+
+#: builtins.c:1061
+msgid "    -v\tthe size of virtual memory"
+msgstr "    -v\tthe size of virtual memory"
+
+#: builtins.c:1063
+msgid "If LIMIT is given, it is the new value of the specified resource;"
+msgstr "If LIMIT is given, it is the new value of the specified resource;"
+
+#: builtins.c:1064
+msgid "the special LIMIT values `soft', `hard', and `unlimited' stand for"
+msgstr "the special LIMIT values ‘soft’, ‘hard’, and ‘unlimited’ stand for"
+
+#: builtins.c:1065
+msgid ""
+"the current soft limit, the current hard limit, and no limit, respectively."
+msgstr ""
+"the current soft limit, the current hard limit, and no limit, respectively."
+
+#: builtins.c:1066
+msgid "Otherwise, the current value of the specified resource is printed."
+msgstr "Otherwise, the current value of the specified resource is printed."
+
+#: builtins.c:1067
+msgid "If no option is given, then -f is assumed.  Values are in 1024-byte"
+msgstr "If no option is given, then -f is assumed.  Values are in 1024-byte"
+
+#: builtins.c:1068
+msgid "increments, except for -t, which is in seconds, -p, which is in"
+msgstr "increments, except for -t, which is in seconds, -p, which is in"
+
+#: builtins.c:1069
+msgid "increments of 512 bytes, and -u, which is an unscaled number of"
+msgstr "increments of 512 bytes, and -u, which is an unscaled number of"
+
+#: builtins.c:1070
+msgid "processes."
+msgstr "processes."
+
+#: builtins.c:1077
+msgid "The user file-creation mask is set to MODE.  If MODE is omitted, or if"
+msgstr "The user file-creation mask is set to MODE.  If MODE is omitted, or if"
+
+#: builtins.c:1078
+msgid "`-S' is supplied, the current value of the mask is printed.  The `-S'"
+msgstr "‘-S’ is supplied, the current value of the mask is printed.  The ‘-S’"
+
+#: builtins.c:1079
+msgid "option makes the output symbolic; otherwise an octal number is output."
+msgstr "option makes the output symbolic; otherwise an octal number is output."
+
+#: builtins.c:1080
+msgid "If `-p' is supplied, and MODE is omitted, the output is in a form"
+msgstr "If ‘-p’ is supplied, and MODE is omitted, the output is in a form"
+
+#: builtins.c:1081
+msgid "that may be used as input.  If MODE begins with a digit, it is"
+msgstr "that may be used as input.  If MODE begins with a digit, it is"
+
+#: builtins.c:1082
+msgid "interpreted as an octal number, otherwise it is a symbolic mode string"
+msgstr "interpreted as an octal number, otherwise it is a symbolic mode string"
+
+#: builtins.c:1083
+msgid "like that accepted by chmod(1)."
+msgstr "like that accepted by chmod(1)."
+
+#: builtins.c:1090 builtins.c:1102
+msgid "Wait for the specified process and report its termination status.  If"
+msgstr "Wait for the specified process and report its termination status.  If"
+
+#: builtins.c:1091 builtins.c:1103
+msgid "N is not given, all currently active child processes are waited for,"
+msgstr "N is not given, all currently active child processes are waited for,"
+
+#: builtins.c:1092
+msgid "and the return code is zero.  N may be a process ID or a job"
+msgstr "and the return code is zero.  N may be a process ID or a job"
+
+#: builtins.c:1093
+msgid "specification; if a job spec is given, all processes in the job's"
+msgstr "specification; if a job spec is given, all processes in the job's"
+
+#: builtins.c:1094
+msgid "pipeline are waited for."
+msgstr "pipeline are waited for."
+
+#: builtins.c:1104
+msgid "and the return code is zero.  N is a process ID; if it is not given,"
+msgstr "and the return code is zero.  N is a process ID; if it is not given,"
+
+#: builtins.c:1105
+msgid "all child processes of the shell are waited for."
+msgstr "all child processes of the shell are waited for."
+
+#: builtins.c:1112
+msgid "The `for' loop executes a sequence of commands for each member in a"
+msgstr "The ‘for’ loop executes a sequence of commands for each member in a"
+
+#: builtins.c:1113
+msgid "list of items.  If `in WORDS ...;' is not present, then `in \"$@\"' is"
+msgstr "list of items.  If ‘in WORDS ...;’ is not present, then ‘in “$@”’ is"
+
+#: builtins.c:1114
+msgid "assumed.  For each element in WORDS, NAME is set to that element, and"
+msgstr "assumed.  For each element in WORDS, NAME is set to that element, and"
+
+#: builtins.c:1115
+msgid "the COMMANDS are executed."
+msgstr "the COMMANDS are executed."
+
+#: builtins.c:1121
+msgid "Equivalent to"
+msgstr "Equivalent to"
+
+#: builtins.c:1122
+msgid "\t(( EXP1 ))"
+msgstr "\t(( EXP1 ))"
+
+#: builtins.c:1123
+msgid "\twhile (( EXP2 )); do"
+msgstr "\twhile (( EXP2 )); do"
+
+#: builtins.c:1124
+msgid "\t\tCOMMANDS"
+msgstr "\t\tCOMMANDS"
+
+#: builtins.c:1125
+msgid "\t\t(( EXP3 ))"
+msgstr "\t\t(( EXP3 ))"
+
+#: builtins.c:1126
+msgid "\tdone"
+msgstr "\tdone"
+
+#: builtins.c:1127
+msgid "EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is"
+msgstr "EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is"
+
+#: builtins.c:1128
+msgid "omitted, it behaves as if it evaluates to 1."
+msgstr "omitted, it behaves as if it evaluates to 1."
+
+#: builtins.c:1134
+msgid "The WORDS are expanded, generating a list of words.  The"
+msgstr "The WORDS are expanded, generating a list of words.  The"
+
+#: builtins.c:1135
+msgid "set of expanded words is printed on the standard error, each"
+msgstr "set of expanded words is printed on the standard error, each"
+
+#: builtins.c:1136
+msgid "preceded by a number.  If `in WORDS' is not present, `in \"$@\"'"
+msgstr "preceded by a number.  If ‘in WORDS’ is not present, ‘in “$@”’"
+
+#: builtins.c:1137
+msgid "is assumed.  The PS3 prompt is then displayed and a line read"
+msgstr "is assumed.  The PS3 prompt is then displayed and a line read"
+
+#: builtins.c:1138
+msgid "from the standard input.  If the line consists of the number"
+msgstr "from the standard input.  If the line consists of the number"
+
+#: builtins.c:1139
+msgid "corresponding to one of the displayed words, then NAME is set"
+msgstr "corresponding to one of the displayed words, then NAME is set"
+
+#: builtins.c:1140
+msgid "to that word.  If the line is empty, WORDS and the prompt are"
+msgstr "to that word.  If the line is empty, WORDS and the prompt are"
+
+#: builtins.c:1141
+msgid "redisplayed.  If EOF is read, the command completes.  Any other"
+msgstr "redisplayed.  If EOF is read, the command completes.  Any other"
+
+#: builtins.c:1142
+msgid "value read causes NAME to be set to null.  The line read is saved"
+msgstr "value read causes NAME to be set to null.  The line read is saved"
+
+#: builtins.c:1143
+msgid "in the variable REPLY.  COMMANDS are executed after each selection"
+msgstr "in the variable REPLY.  COMMANDS are executed after each selection"
+
+#: builtins.c:1144
+msgid "until a break command is executed."
+msgstr "until a break command is executed."
+
+#: builtins.c:1150
+msgid "Execute PIPELINE and print a summary of the real time, user CPU time,"
+msgstr "Execute PIPELINE and print a summary of the real time, user CPU time,"
+
+#: builtins.c:1151
+msgid "and system CPU time spent executing PIPELINE when it terminates."
+msgstr "and system CPU time spent executing PIPELINE when it terminates."
+
+#: builtins.c:1152
+msgid "The return status is the return status of PIPELINE.  The `-p' option"
+msgstr "The return status is the return status of PIPELINE.  The ‘-p’ option"
+
+#: builtins.c:1153
+msgid "prints the timing summary in a slightly different format.  This uses"
+msgstr "prints the timing summary in a slightly different format.  This uses"
+
+#: builtins.c:1154
+msgid "the value of the TIMEFORMAT variable as the output format."
+msgstr "the value of the TIMEFORMAT variable as the output format."
+
+#: builtins.c:1160
+msgid "Selectively execute COMMANDS based upon WORD matching PATTERN.  The"
+msgstr "Selectively execute COMMANDS based upon WORD matching PATTERN.  The"
+
+#: builtins.c:1161
+msgid "`|' is used to separate multiple patterns."
+msgstr "‘|’ is used to separate multiple patterns."
+
+#: builtins.c:1167
+msgid ""
+"The if COMMANDS are executed.  If the exit status is zero, then the then"
+msgstr ""
+"The if COMMANDS are executed.  If the exit status is zero, then the then"
+
+#: builtins.c:1168
+msgid ""
+"COMMANDS are executed.  Otherwise, each of the elif COMMANDS are executed"
+msgstr ""
+"COMMANDS are executed.  Otherwise, each of the elif COMMANDS are executed"
+
+#: builtins.c:1169
+msgid ""
+"in turn, and if the exit status is zero, the corresponding then COMMANDS"
+msgstr ""
+"in turn, and if the exit status is zero, the corresponding then COMMANDS"
+
+#: builtins.c:1170
+msgid ""
+"are executed and the if command completes.  Otherwise, the else COMMANDS"
+msgstr ""
+"are executed and the if command completes.  Otherwise, the else COMMANDS"
+
+#: builtins.c:1171
+msgid ""
+"are executed, if present.  The exit status is the exit status of the last"
+msgstr ""
+"are executed, if present.  The exit status is the exit status of the last"
+
+#: builtins.c:1172
+msgid "command executed, or zero if no condition tested true."
+msgstr "command executed, or zero if no condition tested true."
+
+#: builtins.c:1178 builtins.c:1185
+msgid "Expand and execute COMMANDS as long as the final command in the"
+msgstr "Expand and execute COMMANDS as long as the final command in the"
+
+#: builtins.c:1179
+msgid "`while' COMMANDS has an exit status of zero."
+msgstr "‘while’ COMMANDS has an exit status of zero."
+
+#: builtins.c:1186
+msgid "`until' COMMANDS has an exit status which is not zero."
+msgstr "‘until’ COMMANDS has an exit status which is not zero."
+
+#: builtins.c:1192
+msgid "Create a simple command invoked by NAME which runs COMMANDS."
+msgstr "Create a simple command invoked by NAME which runs COMMANDS."
+
+#: builtins.c:1193
+msgid "Arguments on the command line along with NAME are passed to the"
+msgstr "Arguments on the command line along with NAME are passed to the"
+
+#: builtins.c:1194
+msgid "function as $0 .. $n."
+msgstr "function as $0 .. $n."
+
+#: builtins.c:1200
+msgid "Run a set of commands in a group.  This is one way to redirect an"
+msgstr "Run a set of commands in a group.  This is one way to redirect an"
+
+#: builtins.c:1201
+msgid "entire set of commands."
+msgstr "entire set of commands."
+
+#: builtins.c:1207
+msgid "This is similar to the `fg' command.  Resume a stopped or background"
+msgstr "This is similar to the ‘fg’ command.  Resume a stopped or background"
+
+#: builtins.c:1208
+msgid "job.  If you specifiy DIGITS, then that job is used.  If you specify"
+msgstr "job.  If you specifiy DIGITS, then that job is used.  If you specify"
+
+#: builtins.c:1209
+msgid "WORD, then the job whose name begins with WORD is used.  Following the"
+msgstr "WORD, then the job whose name begins with WORD is used.  Following the"
+
+#: builtins.c:1210
+msgid "job specification with a `&' places the job in the background."
+msgstr "job specification with a ‘&’ places the job in the background."
+
+#: builtins.c:1216
+msgid "The EXPRESSION is evaluated according to the rules for arithmetic"
+msgstr "The EXPRESSION is evaluated according to the rules for arithmetic"
+
+#: builtins.c:1217
+msgid "evaluation.  Equivalent to \"let EXPRESSION\"."
+msgstr "evaluation.  Equivalent to “let EXPRESSION”."
+
+#: builtins.c:1223
+msgid ""
+"Returns a status of 0 or 1 depending on the evaluation of the conditional"
+msgstr ""
+"Returns a status of 0 or 1 depending on the evaluation of the conditional"
+
+#: builtins.c:1224
+msgid ""
+"expression EXPRESSION.  Expressions are composed of the same primaries used"
+msgstr ""
+"expression EXPRESSION.  Expressions are composed of the same primaries used"
+
+#: builtins.c:1225
+msgid ""
+"by the `test' builtin, and may be combined using the following operators"
+msgstr ""
+"by the ‘test’ builtin, and may be combined using the following operators"
+
+#: builtins.c:1227
+msgid "\t( EXPRESSION )\tReturns the value of EXPRESSION"
+msgstr "\t( EXPRESSION )\tReturns the value of EXPRESSION"
+
+#: builtins.c:1228
+msgid "\t! EXPRESSION\tTrue if EXPRESSION is false; else false"
+msgstr "\t! EXPRESSION\tTrue if EXPRESSION is false; else false"
+
+#: builtins.c:1229
+msgid "\tEXPR1 && EXPR2\tTrue if both EXPR1 and EXPR2 are true; else false"
+msgstr "\tEXPR1 && EXPR2\tTrue if both EXPR1 and EXPR2 are true; else false"
+
+#: builtins.c:1230
+msgid "\tEXPR1 || EXPR2\tTrue if either EXPR1 or EXPR2 is true; else false"
+msgstr "\tEXPR1 || EXPR2\tTrue if either EXPR1 or EXPR2 is true; else false"
+
+#: builtins.c:1232
+msgid ""
+"When the `==' and `!=' operators are used, the string to the right of the"
+msgstr ""
+"When the ‘==’ and ‘!=’ operators are used, the string to the right of the"
+
+#: builtins.c:1233
+msgid "operator is used as a pattern and pattern matching is performed.  The"
+msgstr "operator is used as a pattern and pattern matching is performed.  The"
+
+#: builtins.c:1234
+msgid "&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to"
+msgstr "&& and || operators do not evaluate EXPR2 if EXPR1 is sufficient to"
+
+#: builtins.c:1235
+msgid "determine the expression's value."
+msgstr "determine the expression's value."
+
+#: builtins.c:1241
+msgid "BASH_VERSION    Version information for this Bash."
+msgstr "BASH_VERSION    Version information for this Bash."
+
+#: builtins.c:1242
+msgid "CDPATH          A colon separated list of directories to search"
+msgstr "CDPATH          A colon separated list of directories to search"
+
+#: builtins.c:1243
+msgid "\t\twhen the argument to `cd' is not found in the current"
+msgstr "\t\twhen the argument to ‘cd’ is not found in the current"
+
+#: builtins.c:1244
+msgid "\t\tdirectory."
+msgstr "\t\tdirectory."
+
+#: builtins.c:1245
+msgid "GLOBIGNORE\tA colon-separated list of patterns describing filenames to"
+msgstr "GLOBIGNORE\tA colon-separated list of patterns describing filenames to"
+
+#: builtins.c:1246
+msgid "\t\tbe ignored by pathname expansion."
+msgstr "\t\tbe ignored by pathname expansion."
+
+#: builtins.c:1248
+msgid ""
+"HISTFILE        The name of the file where your command history is stored."
+msgstr ""
+"HISTFILE        The name of the file where your command history is stored."
+
+#: builtins.c:1249
+msgid "HISTFILESIZE    The maximum number of lines this file can contain."
+msgstr "HISTFILESIZE    The maximum number of lines this file can contain."
+
+#: builtins.c:1250
+msgid "HISTSIZE        The maximum number of history lines that a running"
+msgstr "HISTSIZE        The maximum number of history lines that a running"
+
+#: builtins.c:1251
+msgid "\t\tshell can access."
+msgstr "\t\tshell can access."
+
+#: builtins.c:1253
+msgid "HOME            The complete pathname to your login directory."
+msgstr "HOME            The complete pathname to your login directory."
+
+#: builtins.c:1254
+msgid "HOSTNAME\tThe name of the current host."
+msgstr "HOSTNAME\tThe name of the current host."
+
+#: builtins.c:1255
+msgid "HOSTTYPE        The type of CPU this version of Bash is running under."
+msgstr "HOSTTYPE        The type of CPU this version of Bash is running under."
+
+#: builtins.c:1256
+msgid "IGNOREEOF       Controls the action of the shell on receipt of an EOF"
+msgstr "IGNOREEOF       Controls the action of the shell on receipt of an EOF"
+
+#: builtins.c:1257
+msgid "\t\tcharacter as the sole input.  If set, then the value"
+msgstr "\t\tcharacter as the sole input.  If set, then the value"
+
+#: builtins.c:1258
+msgid "\t\tof it is the number of EOF characters that can be seen"
+msgstr "\t\tof it is the number of EOF characters that can be seen"
+
+#: builtins.c:1259
+msgid "\t\tin a row on an empty line before the shell will exit"
+msgstr "\t\tin a row on an empty line before the shell will exit"
+
+#: builtins.c:1260
+msgid "\t\t(default 10).  When unset, EOF signifies the end of input."
+msgstr "\t\t(default 10).  When unset, EOF signifies the end of input."
+
+#: builtins.c:1261
+msgid "MACHTYPE\tA string describing the current system Bash is running on."
+msgstr "MACHTYPE\tA string describing the current system Bash is running on."
+
+#: builtins.c:1262
+msgid "MAILCHECK\tHow often, in seconds, Bash checks for new mail."
+msgstr "MAILCHECK\tHow often, in seconds, Bash checks for new mail."
+
+#: builtins.c:1263
+msgid "MAILPATH\tA colon-separated list of filenames which Bash checks"
+msgstr "MAILPATH\tA colon-separated list of filenames which Bash checks"
+
+#: builtins.c:1264
+msgid "\t\tfor new mail."
+msgstr "\t\tfor new mail."
+
+#: builtins.c:1265
+msgid "OSTYPE\t\tThe version of Unix this version of Bash is running on."
+msgstr "OSTYPE\t\tThe version of Unix this version of Bash is running on."
+
+#: builtins.c:1266
+msgid "PATH            A colon-separated list of directories to search when"
+msgstr "PATH            A colon-separated list of directories to search when"
+
+#: builtins.c:1267
+msgid "\t\tlooking for commands."
+msgstr "\t\tlooking for commands."
+
+#: builtins.c:1268
+msgid "PROMPT_COMMAND  A command to be executed before the printing of each"
+msgstr "PROMPT_COMMAND  A command to be executed before the printing of each"
+
+#: builtins.c:1269
+msgid "\t\tprimary prompt."
+msgstr "\t\tprimary prompt."
+
+#: builtins.c:1270
+msgid "PS1             The primary prompt string."
+msgstr "PS1             The primary prompt string."
+
+#: builtins.c:1271
+msgid "PS2             The secondary prompt string."
+msgstr "PS2             The secondary prompt string."
+
+#: builtins.c:1272
+msgid "PWD\t\tThe full pathname of the current directory."
+msgstr "PWD\t\tThe full pathname of the current directory."
+
+#: builtins.c:1273
+msgid "SHELLOPTS\tA colon-separated list of enabled shell options."
+msgstr "SHELLOPTS\tA colon-separated list of enabled shell options."
+
+#: builtins.c:1274
+msgid "TERM            The name of the current terminal type."
+msgstr "TERM            The name of the current terminal type."
+
+#: builtins.c:1275
+msgid "TIMEFORMAT\tThe output format for timing statistics displayed by the"
+msgstr "TIMEFORMAT\tThe output format for timing statistics displayed by the"
+
+#: builtins.c:1276
+msgid "\t\t`time' reserved word."
+msgstr "\t\t‘time’ reserved word."
+
+#: builtins.c:1277
+msgid "auto_resume     Non-null means a command word appearing on a line by"
+msgstr "auto_resume     Non-null means a command word appearing on a line by"
+
+#: builtins.c:1278
+msgid "\t\titself is first looked for in the list of currently"
+msgstr "\t\titself is first looked for in the list of currently"
+
+#: builtins.c:1279
+msgid "\t\tstopped jobs.  If found there, that job is foregrounded."
+msgstr "\t\tstopped jobs.  If found there, that job is foregrounded."
+
+#: builtins.c:1280
+msgid "\t\tA value of `exact' means that the command word must"
+msgstr "\t\tA value of ‘exact’ means that the command word must"
+
+#: builtins.c:1281
+msgid "\t\texactly match a command in the list of stopped jobs.  A"
+msgstr "\t\texactly match a command in the list of stopped jobs.  A"
+
+#: builtins.c:1282
+msgid "\t\tvalue of `substring' means that the command word must"
+msgstr "\t\tvalue of ‘substring’ means that the command word must"
+
+#: builtins.c:1283
+msgid "\t\tmatch a substring of the job.  Any other value means that"
+msgstr "\t\tmatch a substring of the job.  Any other value means that"
+
+#: builtins.c:1284
+msgid "\t\tthe command must be a prefix of a stopped job."
+msgstr "\t\tthe command must be a prefix of a stopped job."
+
+#: builtins.c:1287
+msgid "histchars       Characters controlling history expansion and quick"
+msgstr "histchars       Characters controlling history expansion and quick"
+
+#: builtins.c:1288
+msgid "\t\tsubstitution.  The first character is the history"
+msgstr "\t\tsubstitution.  The first character is the history"
+
+#: builtins.c:1289
+msgid "\t\tsubstitution character, usually `!'.  The second is"
+msgstr "\t\tsubstitution character, usually ‘!’.  The second is"
+
+#: builtins.c:1290
+msgid "\t\tthe `quick substitution' character, usually `^'.  The"
+msgstr "\t\tthe ‘quick substitution’ character, usually ‘^’.  The"
+
+#: builtins.c:1291
+msgid "\t\tthird is the `history comment' character, usually `#'."
+msgstr "\t\tthird is the ‘history comment’ character, usually ‘#’."
+
+#: builtins.c:1293
+msgid "HISTIGNORE\tA colon-separated list of patterns used to decide which"
+msgstr "HISTIGNORE\tA colon-separated list of patterns used to decide which"
+
+#: builtins.c:1294
+msgid "\t\tcommands should be saved on the history list."
+msgstr "\t\tcommands should be saved on the history list."
+
+#: builtins.c:1306
+msgid "+N\tRotates the stack so that the Nth directory (counting"
+msgstr "+N\tRotates the stack so that the Nth directory (counting"
+
+#: builtins.c:1307
+msgid "\tfrom the left of the list shown by `dirs', starting with"
+msgstr "\tfrom the left of the list shown by ‘dirs’, starting with"
+
+#: builtins.c:1308 builtins.c:1312
+msgid "\tzero) is at the top."
+msgstr "\tzero) is at the top."
+
+#: builtins.c:1310
+msgid "-N\tRotates the stack so that the Nth directory (counting"
+msgstr "-N\tRotates the stack so that the Nth directory (counting"
+
+#: builtins.c:1311
+msgid "\tfrom the right of the list shown by `dirs', starting with"
+msgstr "\tfrom the right of the list shown by ‘dirs’, starting with"
+
+#: builtins.c:1314
+msgid "-n\tsuppress the normal change of directory when adding directories"
+msgstr "-n\tsuppress the normal change of directory when adding directories"
+
+#: builtins.c:1315
+msgid "\tto the stack, so only the stack is manipulated."
+msgstr "\tto the stack, so only the stack is manipulated."
+
+#: builtins.c:1317
+msgid "dir\tadds DIR to the directory stack at the top, making it the"
+msgstr "dir\tadds DIR to the directory stack at the top, making it the"
+
+#: builtins.c:1318
+msgid "\tnew current working directory."
+msgstr "\tnew current working directory."
+
+#: builtins.c:1332
+msgid "+N\tremoves the Nth entry counting from the left of the list"
+msgstr "+N\tremoves the Nth entry counting from the left of the list"
+
+#: builtins.c:1333
+msgid "\tshown by `dirs', starting with zero.  For example: `popd +0'"
+msgstr "\tshown by ‘dirs’, starting with zero.  For example: ‘popd +0’"
+
+#: builtins.c:1334
+msgid "\tremoves the first directory, `popd +1' the second."
+msgstr "\tremoves the first directory, ‘popd +1’ the second."
+
+#: builtins.c:1336
+msgid "-N\tremoves the Nth entry counting from the right of the list"
+msgstr "-N\tremoves the Nth entry counting from the right of the list"
+
+#: builtins.c:1337
+msgid "\tshown by `dirs', starting with zero.  For example: `popd -0'"
+msgstr "\tshown by ‘dirs’, starting with zero.  For example: ‘popd -0’"
+
+#: builtins.c:1338
+msgid "\tremoves the last directory, `popd -1' the next to last."
+msgstr "\tremoves the last directory, ‘popd -1’ the next to last."
+
+#: builtins.c:1340
+msgid "-n\tsuppress the normal change of directory when removing directories"
+msgstr "-n\tsuppress the normal change of directory when removing directories"
+
+#: builtins.c:1341
+msgid "\tfrom the stack, so only the stack is manipulated."
+msgstr "\tfrom the stack, so only the stack is manipulated."
+
+#: builtins.c:1363
+msgid "+N\tdisplays the Nth entry counting from the left of the list shown by"
+msgstr "+N\tdisplays the Nth entry counting from the left of the list shown by"
+
+#: builtins.c:1364 builtins.c:1367
+msgid "\tdirs when invoked without options, starting with zero."
+msgstr "\tdirs when invoked without options, starting with zero."
+
+#: builtins.c:1366
+msgid "-N\tdisplays the Nth entry counting from the right of the list shown by"
+msgstr ""
+"-N\tdisplays the Nth entry counting from the right of the list shown by"
+
+#: builtins.c:1374
+msgid "Toggle the values of variables controlling optional behavior."
+msgstr "Toggle the values of variables controlling optional behavior."
+
+#: builtins.c:1375
+msgid "The -s flag means to enable (set) each OPTNAME; the -u flag"
+msgstr "The -s flag means to enable (set) each OPTNAME; the -u flag"
+
+#: builtins.c:1376
+msgid "unsets each OPTNAME.  The -q flag suppresses output; the exit"
+msgstr "unsets each OPTNAME.  The -q flag suppresses output; the exit"
+
+#: builtins.c:1377
+msgid "status indicates whether each OPTNAME is set or unset.  The -o"
+msgstr "status indicates whether each OPTNAME is set or unset.  The -o"
+
+#: builtins.c:1378
+msgid "option restricts the OPTNAMEs to those defined for use with"
+msgstr "option restricts the OPTNAMEs to those defined for use with"
+
+#: builtins.c:1379
+msgid "`set -o'.  With no options, or with the -p option, a list of all"
+msgstr "‘set -o’.  With no options, or with the -p option, a list of all"
+
+#: builtins.c:1380
+msgid "settable options is displayed, with an indication of whether or"
+msgstr "settable options is displayed, with an indication of whether or"
+
+#: builtins.c:1381
+msgid "not each is set."
+msgstr "not each is set."
+
+#: builtins.c:1387
+msgid "printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT"
+msgstr ""
+"printf formats and prints ARGUMENTS under control of the FORMAT. FORMAT"
+
+#: builtins.c:1388
+msgid "is a character string which contains three types of objects: plain"
+msgstr "is a character string which contains three types of objects: plain"
+
+#: builtins.c:1389
+msgid ""
+"characters, which are simply copied to standard output, character escape"
+msgstr ""
+"characters, which are simply copied to standard output, character escape"
+
+#: builtins.c:1390
+msgid "sequences which are converted and copied to the standard output, and"
+msgstr "sequences which are converted and copied to the standard output, and"
+
+#: builtins.c:1391
+msgid ""
+"format specifications, each of which causes printing of the next successive"
+msgstr ""
+"format specifications, each of which causes printing of the next successive"
+
+#: builtins.c:1392
+msgid "argument.  In addition to the standard printf(1) formats, %b means to"
+msgstr "argument.  In addition to the standard printf(1) formats, %b means to"
+
+#: builtins.c:1393
+msgid "expand backslash escape sequences in the corresponding argument, and %q"
+msgstr ""
+"expand backslash escape sequences in the corresponding argument, and %q"
+
+#: builtins.c:1394
+msgid "means to quote the argument in a way that can be reused as shell input."
+msgstr ""
+"means to quote the argument in a way that can be reused as shell input."
+
+#: builtins.c:1401
+msgid "For each NAME, specify how arguments are to be completed."
+msgstr "For each NAME, specify how arguments are to be completed."
+
+#: builtins.c:1402
+msgid "If the -p option is supplied, or if no options are supplied, existing"
+msgstr "If the -p option is supplied, or if no options are supplied, existing"
+
+#: builtins.c:1403
+msgid "completion specifications are printed in a way that allows them to be"
+msgstr "completion specifications are printed in a way that allows them to be"
+
+#: builtins.c:1404
+msgid "reused as input.  The -r option removes a completion specification for"
+msgstr "reused as input.  The -r option removes a completion specification for"
+
+#: builtins.c:1405
+msgid "each NAME, or, if no NAMEs are supplied, all completion specifications."
+msgstr ""
+"each NAME, or, if no NAMEs are supplied, all completion specifications."
+
+#: builtins.c:1413
+msgid "Display the possible completions depending on the options.  Intended"
+msgstr "Display the possible completions depending on the options.  Intended"
+
+#: builtins.c:1414
+msgid ""
+"to be used from within a shell function generating possible completions."
+msgstr ""
+"to be used from within a shell function generating possible completions."
+
+#: builtins.c:1415
+msgid "If the optional WORD argument is supplied, matches against WORD are"
+msgstr "If the optional WORD argument is supplied, matches against WORD are"
+
+#: builtins.c:1416
+msgid "generated."
+msgstr "generated."
diff --git a/po/insert-header.sin b/po/insert-header.sin
new file mode 100644 (file)
index 0000000..b26de01
--- /dev/null
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/quot.sed b/po/quot.sed
new file mode 100644 (file)
index 0000000..0122c46
--- /dev/null
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
diff --git a/po/readline.po b/po/readline.po
new file mode 100644 (file)
index 0000000..3519812
--- /dev/null
@@ -0,0 +1,133 @@
+#: lib/readline/bind.c:878
+#, c-format
+msgid "readline: %s: line %d: %s\n"
+msgstr ""
+
+#: lib/readline/bind.c:881
+#, c-format
+msgid "readline: %s\n"
+msgstr ""
+
+#: lib/readline/bind.c:994
+msgid "$else found without matching $if"
+msgstr ""
+
+#: lib/readline/bind.c:1024
+msgid "$endif without matching $if"
+msgstr ""
+
+#: lib/readline/bind.c:1101
+msgid "unknown parser directive"
+msgstr ""
+
+#: lib/readline/bind.c:1162
+msgid "no closing `\"' in key binding"
+msgstr ""
+
+#: lib/readline/bind.c:1977
+#, c-format
+msgid "# %s (not bound)\n"
+msgstr ""
+
+#: lib/readline/bind.c:1995
+#, c-format
+msgid "%s is not bound to any keys\n"
+msgstr ""
+
+#: lib/readline/bind.c:2001
+#, c-format
+msgid "%s can be found on "
+msgstr ""
+
+#: lib/readline/bind.c:2128
+#, c-format
+msgid "%s is set to `%s'\n"
+msgstr ""
+
+#: lib/readline/bind.c:2146
+#, c-format
+msgid "bell-style is set to `%s'\n"
+msgstr ""
+
+#: lib/readline/bind.c:2152
+#, c-format
+msgid "comment-begin is set to `%s'\n"
+msgstr ""
+
+#: lib/readline/bind.c:2158
+#, c-format
+msgid "completion-query-items is set to `%d'\n"
+msgstr ""
+
+#: lib/readline/bind.c:2164
+#, c-format
+msgid "editing-mode is set to `%s'\n"
+msgstr ""
+
+#: lib/readline/bind.c:2176
+#, c-format
+msgid "isearch-terminators is set to \"%s\"\n"
+msgstr ""
+
+#: lib/readline/bind.c:2188
+#, c-format
+msgid "keymap is set to `%s'\n"
+msgstr ""
+
+#: lib/readline/callback.c:105
+msgid "readline: readline_callback_read_char() called with no handler!\r\n"
+msgstr ""
+
+#: lib/readline/complete.c:1342
+#, c-format
+msgid "Display all %d possibilities? (y or n)"
+msgstr ""
+
+#: lib/readline/complete.c:1681
+#, c-format
+msgid ""
+"\r\n"
+"readline: bad value %d for what_to_do in rl_complete\n"
+msgstr ""
+
+#: lib/readline/display.c:1924
+#, c-format
+msgid "readline: debug: insert_some_chars: count (%d) != col (%d)\n"
+msgstr ""
+
+#: lib/readline/histexpand.c:377
+msgid "event not found"
+msgstr ""
+
+#: lib/readline/histexpand.c:381
+msgid "bad word specifier"
+msgstr ""
+
+#: lib/readline/histexpand.c:385
+msgid "substitution failed"
+msgstr ""
+
+#: lib/readline/histexpand.c:389
+msgid "unrecognized history modifier"
+msgstr ""
+
+#: lib/readline/histexpand.c:393
+msgid "no previous substitution"
+msgstr ""
+
+#: lib/readline/histexpand.c:397
+msgid "unknown expansion error"
+msgstr ""
+
+#: lib/readline/rltty.c:464
+#, c-format
+msgid "readline: warning: %s\n"
+msgstr ""
+
+#: lib/readline/rltty.c:475
+msgid "turning on OPOST for terminal\r"
+msgstr ""
+
+#: lib/readline/rltty.c:501
+msgid "turning off output flushing"
+msgstr ""
diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin
new file mode 100644 (file)
index 0000000..2436c49
--- /dev/null
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/xx b/po/xx
new file mode 100644 (file)
index 0000000..4675ba6
--- /dev/null
+++ b/po/xx
@@ -0,0 +1,47 @@
+lang=`echo en@quot.po-update-en | sed -e 's/\.po-update-en$//'`; 
+if test "bash" = "gettext"; then PATH=`pwd`/../src:$PATH; GETTEXTLIBDIR=`cd /usr/src/local/bash/bash-20031218/src && pwd`; export GETTEXTLIBDIR; fi; 
+tmpdir=`pwd`; 
+echo "$lang:"; 
+ll=`echo $lang | sed -e 's/@.*//'`; 
+echo ll = $ll
+exit 0
+LC_ALL=C; export LC_ALL; 
+cd /usr/src/local/bash/bash-20031218/po; 
+if msginit -i bash.pot --no-translator -l $ll -o - 2>/dev/null | sed -f $tmpdir/$lang.insert-header | msgconv -t UTF-8 | msgfilter sed -f `echo $lang | sed -e 's/.*@//'`.sed 2>/dev/null > $tmpdir/$lang.new.po; then 
+  if cmp $lang.po $tmpdir/$lang.new.po >/dev/null 2>&1; then 
+    rm -f $tmpdir/$lang.new.po; 
+  else 
+    if mv -f $tmpdir/$lang.new.po $lang.po; then 
+      :; 
+    else 
+      echo "creation of $lang.po failed: cannot move $tmpdir/$lang.new.po to $lang.po" 1>&2; \
+      exit 1; 
+    fi;
+  fi;
+else
+  echo "creation of $lang.po failed!" 1>&2; \
+  rm -f $tmpdir/$lang.new.po; \
+fi
+exit 0
+lang=`echo en@quot.po-update | sed -e 's/\.po-update$//'`; \
+if test "bash" = "gettext-tools"; then PATH=`pwd`/../src:$PATH; fi; \
+tmpdir=`pwd`; \
+echo "$lang:"; \
+test "/usr/src/local/bash/bash-20031218/po" = . && cdcmd="" || cdcmd="cd /usr/src/local/bash/bash-20031218/po && "; \
+echo "${cdcmd}msgmerge $lang.po bash.pot -o $lang.new.po"; \
+cd /usr/src/local/bash/bash-20031218/po; \
+if msgmerge $lang.po bash.pot -o $tmpdir/$lang.new.po; then \
+  if cmp $lang.po $tmpdir/$lang.new.po >/dev/null 2>&1; then \
+    rm -f $tmpdir/$lang.new.po; \
+  else \
+    if mv -f $tmpdir/$lang.new.po $lang.po; then \
+      :; \
+    else \
+      echo "msgmerge for $lang.po failed: cannot move $tmpdir/$lang.new.po to $lang.po" 1>&2; \
+      exit 1; \
+    fi; \
+  fi; \
+else \
+  echo "msgmerge for $lang.po failed!" 1>&2; \
+  rm -f $tmpdir/$lang.new.po; \
+fi
diff --git a/po/xx1 b/po/xx1
new file mode 100644 (file)
index 0000000..43d1305
--- /dev/null
+++ b/po/xx1
@@ -0,0 +1,46 @@
+lang=`echo en@quot.po-update-en | sed -e 's/\.po-update-en$//'`; 
+if test "bash" = "gettext"; then PATH=`pwd`/../src:$PATH; GETTEXTLIBDIR=`cd /usr/src/local/bash/bash-20031218/src && pwd`; export GETTEXTLIBDIR; fi; 
+tmpdir=`pwd`; 
+ll=`echo $lang | sed -e 's/@.*//'`; 
+LC_ALL=C; export LC_ALL; 
+msginit -i bash.pot --no-translator -l $ll -o - 2>/dev/null | sed -f $tmpdir/$lang.insert-header | msgconv -t UTF-8 | msgfilter sed -f `echo $lang | sed -e 's/.*@//'`.sed 2>/dev/null > $tmpdir/$lang.new.po
+exit 0
+cd /usr/src/local/bash/bash-20031218/po; 
+if msginit -i bash.pot --no-translator -l $ll -o - 2>/dev/null | sed -f $tmpdir/$lang.insert-header | msgconv -t UTF-8 | msgfilter sed -f `echo $lang | sed -e 's/.*@//'`.sed 2>/dev/null > $tmpdir/$lang.new.po; then 
+  if cmp $lang.po $tmpdir/$lang.new.po >/dev/null 2>&1; then 
+    rm -f $tmpdir/$lang.new.po; 
+  else 
+    if mv -f $tmpdir/$lang.new.po $lang.po; then 
+      :; 
+    else 
+      echo "creation of $lang.po failed: cannot move $tmpdir/$lang.new.po to $lang.po" 1>&2; \
+      exit 1; 
+    fi;
+  fi;
+else
+  echo "creation of $lang.po failed!" 1>&2; \
+  rm -f $tmpdir/$lang.new.po; \
+fi
+exit 0
+lang=`echo en@quot.po-update | sed -e 's/\.po-update$//'`; \
+if test "bash" = "gettext-tools"; then PATH=`pwd`/../src:$PATH; fi; \
+tmpdir=`pwd`; \
+echo "$lang:"; \
+test "/usr/src/local/bash/bash-20031218/po" = . && cdcmd="" || cdcmd="cd /usr/src/local/bash/bash-20031218/po && "; \
+echo "${cdcmd}msgmerge $lang.po bash.pot -o $lang.new.po"; \
+cd /usr/src/local/bash/bash-20031218/po; \
+if msgmerge $lang.po bash.pot -o $tmpdir/$lang.new.po; then \
+  if cmp $lang.po $tmpdir/$lang.new.po >/dev/null 2>&1; then \
+    rm -f $tmpdir/$lang.new.po; \
+  else \
+    if mv -f $tmpdir/$lang.new.po $lang.po; then \
+      :; \
+    else \
+      echo "msgmerge for $lang.po failed: cannot move $tmpdir/$lang.new.po to $lang.po" 1>&2; \
+      exit 1; \
+    fi; \
+  fi; \
+else \
+  echo "msgmerge for $lang.po failed!" 1>&2; \
+  rm -f $tmpdir/$lang.new.po; \
+fi
diff --git a/po/xx1a b/po/xx1a
new file mode 100644 (file)
index 0000000..96a5faa
--- /dev/null
+++ b/po/xx1a
@@ -0,0 +1,46 @@
+lang=`echo en@quot.po-update-en | sed -e 's/\.po-update-en$//'`; 
+if test "bash" = "gettext"; then PATH=`pwd`/../src:$PATH; GETTEXTLIBDIR=`cd /usr/src/local/bash/bash-20031218/src && pwd`; export GETTEXTLIBDIR; fi; 
+tmpdir=`pwd`; 
+ll=`echo $lang | sed -e 's/@.*//'`; 
+LC_ALL=C; export LC_ALL; 
+msginit -i bash.pot --no-translator -l $ll -o - 2>/dev/null | sed -f $tmpdir/$lang.insert-header | msgconv -t UTF-8 # | msgfilter sed -f `echo $lang | sed -e 's/.*@//'`.sed 2>/dev/null > $tmpdir/$lang.new.po
+exit 0
+cd /usr/src/local/bash/bash-20031218/po; 
+if msginit -i bash.pot --no-translator -l $ll -o - 2>/dev/null | sed -f $tmpdir/$lang.insert-header | msgconv -t UTF-8 | msgfilter sed -f `echo $lang | sed -e 's/.*@//'`.sed 2>/dev/null > $tmpdir/$lang.new.po; then 
+  if cmp $lang.po $tmpdir/$lang.new.po >/dev/null 2>&1; then 
+    rm -f $tmpdir/$lang.new.po; 
+  else 
+    if mv -f $tmpdir/$lang.new.po $lang.po; then 
+      :; 
+    else 
+      echo "creation of $lang.po failed: cannot move $tmpdir/$lang.new.po to $lang.po" 1>&2; \
+      exit 1; 
+    fi;
+  fi;
+else
+  echo "creation of $lang.po failed!" 1>&2; \
+  rm -f $tmpdir/$lang.new.po; \
+fi
+exit 0
+lang=`echo en@quot.po-update | sed -e 's/\.po-update$//'`; \
+if test "bash" = "gettext-tools"; then PATH=`pwd`/../src:$PATH; fi; \
+tmpdir=`pwd`; \
+echo "$lang:"; \
+test "/usr/src/local/bash/bash-20031218/po" = . && cdcmd="" || cdcmd="cd /usr/src/local/bash/bash-20031218/po && "; \
+echo "${cdcmd}msgmerge $lang.po bash.pot -o $lang.new.po"; \
+cd /usr/src/local/bash/bash-20031218/po; \
+if msgmerge $lang.po bash.pot -o $tmpdir/$lang.new.po; then \
+  if cmp $lang.po $tmpdir/$lang.new.po >/dev/null 2>&1; then \
+    rm -f $tmpdir/$lang.new.po; \
+  else \
+    if mv -f $tmpdir/$lang.new.po $lang.po; then \
+      :; \
+    else \
+      echo "msgmerge for $lang.po failed: cannot move $tmpdir/$lang.new.po to $lang.po" 1>&2; \
+      exit 1; \
+    fi; \
+  fi; \
+else \
+  echo "msgmerge for $lang.po failed!" 1>&2; \
+  rm -f $tmpdir/$lang.new.po; \
+fi
diff --git a/po/xx2 b/po/xx2
new file mode 100644 (file)
index 0000000..24f0ddb
--- /dev/null
+++ b/po/xx2
@@ -0,0 +1,2 @@
+export LC_ALL=en_US.UTF-8
+sed -f quot.sed < d1 > d2
index e4a1c5e..631c5cc 100644 (file)
@@ -35,6 +35,7 @@ Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
 #endif
 
 #include "bashansi.h"
+#include "bashintl.h"
 
 #include "shell.h"
 #include "flags.h"
@@ -256,7 +257,7 @@ make_command_string_internal (command)
              break;
 
            default:
-             cprintf ("print_command: bad connector `%d'",
+             cprintf (_("print_command: bad connector `%d'"),
                       command->value.Connection->connector);
              break;
            }
@@ -1168,7 +1169,7 @@ cprintf (control, va_alist)
              break;
 
            default:
-             programming_error ("cprintf: bad `%%' argument (%c)", c);
+             programming_error (_("cprintf: `%c': invalid format character"), c);
              /*NOTREACHED*/
            }
        }
diff --git a/redir.c b/redir.c
index aab557f..228d67e 100644 (file)
--- a/redir.c
+++ b/redir.c
@@ -42,6 +42,7 @@ extern int errno;
 #endif
 
 #include "bashansi.h"
+#include "bashintl.h"
 
 #include "memalloc.h"
 #include "shell.h"
@@ -95,7 +96,7 @@ redirection_error (temp, error)
   if (temp->redirector < 0)
     /* This can happen when read_token_word encounters overflow, like in
        exec 4294967297>x */
-    filename = "file descriptor out of range";
+    filename = _("file descriptor out of range");
 #ifdef EBADF
   else if (temp->redirector >= 0 && errno == EBADF)
     {
@@ -137,21 +138,21 @@ redirection_error (temp, error)
   switch (error)
     {
     case AMBIGUOUS_REDIRECT:
-      internal_error ("%s: ambiguous redirect", filename);
+      internal_error (_("%s: ambiguous redirect"), filename);
       break;
 
     case NOCLOBBER_REDIRECT:
-      internal_error ("%s: cannot overwrite existing file", filename);
+      internal_error (_("%s: cannot overwrite existing file"), filename);
       break;
 
 #if defined (RESTRICTED_SHELL)
     case RESTRICTED_REDIRECT:
-      internal_error ("%s: restricted: cannot redirect output", filename);
+      internal_error (_("%s: restricted: cannot redirect output"), filename);
       break;
 #endif /* RESTRICTED_SHELL */
 
     case HEREDOC_REDIRECT:
-      internal_error ("cannot create temp file for here document: %s", strerror (heredoc_errno));
+      internal_error (_("cannot create temp file for here document: %s"), strerror (heredoc_errno));
       break;
 
     default:
@@ -505,7 +506,7 @@ redir_special_open (spec, filename, flags, mode, ri)
 #if defined (HAVE_NETWORK)
       fd = netopen (filename);
 #else
-      internal_warning ("/dev/(tcp|udp)/host/port not supported without networking");
+      internal_warning (_("/dev/(tcp|udp)/host/port not supported without networking"));
       fd = open (filename, flags, mode);
 #endif
       break;
@@ -945,7 +946,7 @@ add_undo_redirect (fd)
 
   if (new_fd < 0)
     {
-      sys_error ("redirection error: cannot duplicate fd");
+      sys_error (_("redirection error: cannot duplicate fd"));
       return (-1);
     }
 
diff --git a/shell.c b/shell.c
index 157e94a..f6f78ba 100644 (file)
--- a/shell.c
+++ b/shell.c
@@ -43,6 +43,8 @@
 #  include <unistd.h>
 #endif
 
+#include "bashintl.h"
+
 #define NEED_SH_SETLINEBUF_DECL                /* used in externs.h */
 
 #include "shell.h"
@@ -198,6 +200,7 @@ int posixly_correct = 0;    /* Non-zero means posix.2 superset. */
 int dump_translatable_strings; /* Dump strings in $"...", don't execute. */
 int dump_po_strings;           /* Dump strings in $"..." in po format */
 int wordexp_only = 0;          /* Do word expansion only */
+int protected_mode = 0;                /* No command substitution with --wordexp */
 
 /* Some long-winded argument names.  These are obviously new. */
 #define Int 1
@@ -221,6 +224,7 @@ struct {
   { "noprofile", Int, &no_profile, (char **)0x0 },
   { "norc", Int, &no_rc, (char **)0x0 },
   { "posix", Int, &posixly_correct, (char **)0x0 },
+  { "protected", Int, &protected_mode, (char **)0x0 },
   { "rcfile", Charp, (int *)0x0, &bashrc_file },
 #if defined (RESTRICTED_SHELL)
   { "restricted", Int, &restricted, (char **)0x0 },
@@ -295,11 +299,11 @@ _cygwin32_check_tmp ()
   struct stat sb;
 
   if (stat ("/tmp", &sb) < 0)
-    internal_warning ("could not find /tmp, please create!");
+    internal_warning (_("could not find /tmp, please create!"));
   else
     {
       if (S_ISDIR (sb.st_mode) == 0)
-       internal_warning ("/tmp must be a valid directory name");
+       internal_warning (_("/tmp must be a valid directory name"));
     }
 }
 #endif /* __CYGWIN__ */
@@ -458,7 +462,7 @@ main (argc, argv, env)
       command_execution_string = argv[arg_index];
       if (command_execution_string == 0)
        {
-         report_error ("-c: option requires an argument");
+         report_error (_("%s: option requires an argument"), "-c");
          exit (EX_BADUSAGE);
        }
       arg_index++;
@@ -730,7 +734,7 @@ parse_long_options (argv, arg_start, arg_end)
                *long_args[i].int_value = 1;
              else if (argv[++arg_index] == 0)
                {
-                 report_error ("%s: option requires an argument", long_args[i].name);
+                 report_error (_("%s: option requires an argument"), long_args[i].name);
                  exit (EX_BADUSAGE);
                }
              else
@@ -743,7 +747,7 @@ parse_long_options (argv, arg_start, arg_end)
        {
          if (longarg)
            {
-             report_error ("%s: invalid option", argv[arg_index]);
+             report_error (_("%s: invalid option"), argv[arg_index]);
              show_shell_usage (stderr, 0);
              exit (EX_BADUSAGE);
            }
@@ -832,7 +836,7 @@ parse_shell_options (argv, arg_start, arg_end)
            default:
              if (change_flag (arg_character, on_or_off) == FLAG_ERROR)
                {
-                 report_error ("%c%c: invalid option", on_or_off, arg_character);
+                 report_error (_("%c%c: invalid option"), on_or_off, arg_character);
                  show_shell_usage (stderr, 0);
                  exit (EX_BADUSAGE);
                }
@@ -1155,7 +1159,7 @@ run_wordexp (words)
      char *words;
 {
   int code, nw, nb;
-  WORD_LIST *wl, *result;
+  WORD_LIST *wl, *tl, *result;
 
   code = setjmp (top_level);
 
@@ -1190,6 +1194,9 @@ run_wordexp (words)
       if (global_command->type != cm_simple)
        return (126);
       wl = global_command->value.Simple->words;
+      if (protected_mode)
+       for (tl = wl; tl; tl = tl->next)
+         tl->word->flags |= W_NOCOMSUB;
       result = wl ? expand_words_no_vars (wl) : (WORD_LIST *)0;
     }
   else
@@ -1385,7 +1392,7 @@ open_shell_script (script_name)
        {
          e = errno;
          if ((fstat (fd, &sb) == 0) && S_ISDIR (sb.st_mode))
-           internal_error ("%s: is a directory", filename);
+           internal_error (_("%s: is a directory"), filename);
          else
            {
              errno = e;
@@ -1580,7 +1587,8 @@ get_current_user_info ()
        }
       else
        {
-         current_user.user_name = savestring ("I have no name!");
+         current_user.user_name = _("I have no name!");
+         current_user.user_name = savestring (current_user.user_name);
          current_user.shell = savestring ("/bin/sh");
          current_user.home_dir = savestring ("/");
        }
@@ -1714,14 +1722,14 @@ show_shell_usage (fp, extra)
 
   if (extra)
     fprintf (fp, "GNU bash, version %s-(%s)\n", shell_version_string (), MACHTYPE);
-  fprintf (fp, "Usage:\t%s [GNU long option] [option] ...\n\t%s [GNU long option] [option] script-file ...\n",
+  fprintf (fp, _("Usage:\t%s [GNU long option] [option] ...\n\t%s [GNU long option] [option] script-file ...\n"),
             shell_name, shell_name);
-  fputs ("GNU long options:\n", fp);
+  fputs (_("GNU long options:\n"), fp);
   for (i = 0; long_args[i].name; i++)
     fprintf (fp, "\t--%s\n", long_args[i].name);
 
-  fputs ("Shell options:\n", fp);
-  fputs ("\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n", fp);
+  fputs (_("Shell options:\n"), fp);
+  fputs (_("\t-irsD or -c command or -O shopt_option\t\t(invocation only)\n"), fp);
 
   for (i = 0, set_opts = 0; shell_builtins[i].name; i++)
     if (STREQ (shell_builtins[i].name, "set"))
@@ -1736,15 +1744,15 @@ show_shell_usage (fp, extra)
       t = xstrchr (s, ']');
       if (t)
        *t = '\0';
-      fprintf (fp, "\t-%s or -o option\n", s);
+      fprintf (fp, _("\t-%s or -o option\n"), s);
       free (set_opts);
     }
 
   if (extra)
     {
-      fprintf (fp, "Type `%s -c \"help set\"' for more information about shell options.\n", shell_name);
-      fprintf (fp, "Type `%s -c help' for more information about shell builtin commands.\n", shell_name);
-      fprintf (fp, "Use the `bashbug' command to report bugs.\n");
+      fprintf (fp, _("Type `%s -c \"help set\"' for more information about shell options.\n"), shell_name);
+      fprintf (fp, _("Type `%s -c help' for more information about shell builtin commands.\n"), shell_name);
+      fprintf (fp, _("Use the `bashbug' command to report bugs.\n"));
     }
 }
 
diff --git a/sig.c b/sig.c
index 465535b..0771f14 100644 (file)
--- a/sig.c
+++ b/sig.c
@@ -32,6 +32,8 @@
 #include <stdio.h>
 #include <signal.h>
 
+#include "bashintl.h"
+
 #include "shell.h"
 #if defined (JOB_CONTROL)
 #include "jobs.h"
@@ -480,7 +482,7 @@ sigprocmask (operation, newset, oldset)
       break;
 
     default:
-      internal_error ("Bad code in sig.c: sigprocmask");
+      internal_error (_("sigprocmask: %d: invalid operation"), operation);
     }
 
   if (oldset)
diff --git a/subst.c b/subst.c
index 4f46030..1e93579 100644 (file)
--- a/subst.c
+++ b/subst.c
@@ -37,6 +37,7 @@
 
 #include "bashansi.h"
 #include "posixstat.h"
+#include "bashintl.h"
 
 #include "shell.h"
 #include "flags.h"
@@ -1007,7 +1008,7 @@ extract_delimited_string (string, sindex, opener, alt_opener, closer, flags)
     {
       if (no_longjmp_on_fatal_error == 0)
        {
-         report_error ("bad substitution: no `%s' in %s", closer, string);
+         report_error (_("bad substitution: no closing `%s' in %s"), closer, string);
          last_command_exit_value = EXECUTION_FAILURE;
          exp_jump_to_top_level (DISCARD);
        }
@@ -1128,7 +1129,7 @@ extract_dollar_brace_string (string, sindex, quoted, flags)
     {
       if (no_longjmp_on_fatal_error == 0)
        {                       /* { */
-         report_error ("bad substitution: no ending `}' in %s", string);
+         report_error ("bad substitution: no closing `%s' in %s", "}", string);
          last_command_exit_value = EXECUTION_FAILURE;
          exp_jump_to_top_level (DISCARD);
        }
@@ -1533,7 +1534,7 @@ assignment_name (string)
   int offset;
   char *temp;
 
-  offset = assignment (string);
+  offset = assignment (string, 0);
   if (offset == 0)
     return (char *)NULL;
   temp = substring (string, 0, offset);
@@ -1959,7 +1960,7 @@ do_assignment_internal (string, expand)
   int ni, assign_list = 0;
 #endif
 
-  offset = assignment (string);
+  offset = assignment (string, 0);
   name = savestring (string);
   value = (char *)NULL;
 
@@ -2016,7 +2017,7 @@ do_assignment_internal (string, expand)
     {
       if (assign_list)
        {
-         report_error ("%s: cannot assign list to array member", name);
+         report_error (_("%s: cannot assign list to array member"), name);
          ASSIGN_RETURN (0);
        }
       entry = assign_array_element (name, value);
@@ -2857,9 +2858,9 @@ remove_pattern (param, pattern, op)
   register char *end;
   register char *p, *ret, c;
 
-  if (param == NULL || *param == '\0')
+  if (param == NULL)
     return (param);
-  if (pattern == NULL || *pattern == '\0')     /* minor optimization */
+  if (*param == '\0' || pattern == NULL || *pattern == '\0')   /* minor optimization */
     return (savestring (param));
 
   len = STRLEN (param);
@@ -2868,6 +2869,7 @@ remove_pattern (param, pattern, op)
   switch (op)
     {
       case RP_LONG_LEFT:       /* remove longest match at start */
+        /* BACKUP_CHAR_P (param, len, p); */
        for (p = end; p >= param; p--)
          {
            c = *p; *p = '\0';
@@ -2881,6 +2883,7 @@ remove_pattern (param, pattern, op)
        break;
 
       case RP_SHORT_LEFT:      /* remove shortest match at start */
+        /* ADVANCE_CHAR_P (p, end - p),p++ */
        for (p = param; p <= end; p++)
          {
            c = *p; *p = '\0';
@@ -2894,6 +2897,7 @@ remove_pattern (param, pattern, op)
        break;
 
       case RP_LONG_RIGHT:      /* remove longest match at end */
+        /* ADVANCE_CHAR_P (p, end - p),p++ */
        for (p = param; p <= end; p++)
          {
            if (strmatch (pattern, p, FNMATCH_EXTFLAG) != FNM_NOMATCH)
@@ -2907,6 +2911,7 @@ remove_pattern (param, pattern, op)
        break;
 
       case RP_SHORT_RIGHT:     /* remove shortest match at end */
+        /* BACKUP_CHAR_P (param, len, p); */
        for (p = end; p >= param; p--)
          {
            if (strmatch (pattern, p, FNMATCH_EXTFLAG) != FNM_NOMATCH)
@@ -2964,22 +2969,25 @@ match_pattern (string, pat, mtype, sp, ep)
      int mtype;
      char **sp, **ep;
 {
-  int c;
+  int c, len;
   register char *p, *p1;
   char *end;
 
   if (string == 0 || *string == 0 || pat == 0 || *pat == 0)
     return (0);
 
-  end = string + STRLEN (string);
+  len = STRLEN (string);
+  end = string + len;
 
   switch (mtype)
     {
     case MATCH_ANY:
+      /* ADVANCE_CHAR_P (p, end - p),p++ */
       for (p = string; p <= end; p++)
        {
          if (match_pattern_char (pat, p))
            {
+             /* BACKUP_CHAR_P (p, end - p, p1) */
              for (p1 = end; p1 >= p; p1--)
                {
                  c = *p1; *p1 = '\0';
@@ -2999,6 +3007,7 @@ match_pattern (string, pat, mtype, sp, ep)
     case MATCH_BEG:
       if (match_pattern_char (pat, string) == 0)
        return (0);
+      /* BACKUP_CHAR_P (string, len, p) */
       for (p = end; p >= string; p--)
        {
          c = *p; *p = '\0';
@@ -3014,6 +3023,7 @@ match_pattern (string, pat, mtype, sp, ep)
       return (0);
 
     case MATCH_END:
+      /* ADVANCE_CHAR_P(p, end - p), p++ */
       for (p = string; p <= end; p++)
        if (strmatch (pat, p, FNMATCH_EXTFLAG) == 0)
          {
@@ -3120,7 +3130,7 @@ list_remove_pattern (list, pattern, patspec, itype, quoted)
     {
       tword = remove_pattern (l->word->word, pattern, patspec);
       w = make_bare_word (tword);
-      free (tword);
+      FREE (tword);
       new = make_word_list (w, new);
     }
 
@@ -3512,7 +3522,7 @@ process_substitute (string, open_for_read_in_child)
 #else /* HAVE_DEV_FD */
   if (pipe (fildes) < 0)
     {
-      sys_error ("cannot make pipe for process substitution");
+      sys_error (_("cannot make pipe for process substitution"));
       return ((char *)NULL);
     }
   /* If OPEN_FOR_READ_IN_CHILD == 1, we want to use the write end of
@@ -3528,7 +3538,7 @@ process_substitute (string, open_for_read_in_child)
 
   if (!pathname)
     {
-      sys_error ("cannot make pipe for process substitution");
+      sys_error (_("cannot make pipe for process substitution"));
       return ((char *)NULL);
     }
 
@@ -3559,7 +3569,7 @@ process_substitute (string, open_for_read_in_child)
 
   if (pid < 0)
     {
-      sys_error ("cannot make child for process substitution");
+      sys_error (_("cannot make child for process substitution"));
       free (pathname);
 #if defined (HAVE_DEV_FD)
       close (parent_pipe_fd);
@@ -3602,15 +3612,19 @@ process_substitute (string, open_for_read_in_child)
   fd = open (pathname, open_for_read_in_child ? O_RDONLY|O_NONBLOCK : O_WRONLY);
   if (fd < 0)
     {
-      sys_error ("cannot open named pipe %s for %s", pathname,
-       open_for_read_in_child ? "reading" : "writing");
+      /* Two separate strings for ease of translation. */
+      if (open_for_read_in_child)
+       sys_error (_("cannot open named pipe %s for reading"), pathname);
+      else
+       sys_error (_("cannot open named pipe %s for writing"), pathname);
+
       exit (127);
     }
   if (open_for_read_in_child)
     {
       if (sh_unset_nodelay_mode (fd) < 0)
        {
-         sys_error ("cannout reset nodelay mode for fd %d", fd);
+         sys_error (_("cannout reset nodelay mode for fd %d"), fd);
          exit (127);
        }
     }
@@ -3620,7 +3634,7 @@ process_substitute (string, open_for_read_in_child)
 
   if (dup2 (fd, open_for_read_in_child ? 0 : 1) < 0)
     {
-      sys_error ("cannot duplicate named pipe %s as fd %d", pathname,
+      sys_error (_("cannot duplicate named pipe %s as fd %d"), pathname,
        open_for_read_in_child ? 0 : 1);
       exit (127);
     }
@@ -3795,7 +3809,7 @@ command_substitute (string, quoted)
   /* Pipe the output of executing STRING into the current shell. */
   if (pipe (fildes) < 0)
     {
-      sys_error ("cannot make pipe for command substitution");
+      sys_error (_("cannot make pipe for command substitution"));
       goto error_exit;
     }
 
@@ -3824,7 +3838,7 @@ command_substitute (string, quoted)
 
   if (pid < 0)
     {
-      sys_error ("cannot make child for command substitution");
+      sys_error (_("cannot make child for command substitution"));
     error_exit:
 
       FREE (istring);
@@ -3841,7 +3855,7 @@ command_substitute (string, quoted)
 
       if (dup2 (fildes[1], 1) < 0)
        {
-         sys_error ("command_substitute: cannot duplicate pipe as fd 1");
+         sys_error (_("command_substitute: cannot duplicate pipe as fd 1"));
          exit (EXECUTION_FAILURE);
        }
 
@@ -3888,20 +3902,23 @@ command_substitute (string, quoted)
        function_value = 0;
 
       if (result == ERREXIT)
-       exit (last_command_exit_value);
+       rc = last_command_exit_value;
       else if (result == EXITPROG)
-       exit (last_command_exit_value);
+       rc = last_command_exit_value;
       else if (result)
-       exit (EXECUTION_FAILURE);
+       rc = EXECUTION_FAILURE;
       else if (function_value)
-       exit (return_catch_value);
+       rc = return_catch_value;
       else
        {
          subshell_level++;
          rc = parse_and_execute (string, "command substitution", pflags|SEVAL_NOHIST);
          subshell_level--;
-         exit (rc);
        }
+
+      last_command_exit_value = rc;
+      rc = run_exit_trap ();
+      exit (rc);
     }
   else
     {
@@ -4273,7 +4290,7 @@ parameter_brace_expand_error (name, value)
       dispose_words (l);
     }
   else
-    report_error ("%s: parameter null or not set", name);
+    report_error (_("%s: parameter null or not set"), name);
 
   /* Free the data we have allocated during this expansion, since we
      are about to longjmp out. */
@@ -4484,11 +4501,8 @@ verify_substring_values (value, substr, vtype, e1p, e2p)
 #if defined (ARRAY_VARS)
     case VT_ARRAYVAR:
       a = (ARRAY *)value;
-#if 0
-      len = array_num_elements (a) + 1;
-#else
-      len = array_num_elements (a);    /* arrays index from 0 to n - 1 */
-#endif
+      /* For arrays, the first value deals with array indices. */
+      len = array_max_index (a);       /* arrays index from 0 to n - 1 */
       break;
 #endif
     }
@@ -4502,6 +4516,12 @@ verify_substring_values (value, substr, vtype, e1p, e2p)
   if (*e1p >= len || *e1p < 0)
     return (-1);
 
+#if defined (ARRAY_VARS)
+  /* For arrays, the second offset deals with the number of elements. */
+  if (vtype == VT_ARRAYVAR)
+    len = array_num_elements (a);
+#endif
+
   if (t)
     {
       t++;
@@ -4515,12 +4535,20 @@ verify_substring_values (value, substr, vtype, e1p, e2p)
        return (0);
       if (*e2p < 0)
        {
-         internal_error ("%s: substring expression < 0", t);
+         internal_error (_("%s: substring expression < 0"), t);
          return (0);
        }
-      *e2p += *e1p;            /* want E2 chars starting at E1 */
-      if (*e2p > len)
-       *e2p = len;
+#if defined (ARRAY_VARS)
+      /* In order to deal with sparse arrays, push the intelligence about how
+        to deal with the number of elements desired down to the array-
+        specific functions.  */
+      if (vtype != VT_ARRAYVAR)
+#endif
+       {
+         *e2p += *e1p;         /* want E2 chars starting at E1 */
+         if (*e2p > len)
+           *e2p = len;
+       }
     }
   else
     *e2p = len;
@@ -4649,6 +4677,9 @@ parameter_brace_substring (varname, value, substr, quoted)
       break;
 #if defined (ARRAY_VARS)
     case VT_ARRAYVAR:
+      /* We want E2 to be the number of elements desired (arrays can be sparse,
+         so verify_substring_values just returns the numbers specified and we
+         rely on array_subrange to understand how to deal with them). */
       tt = array_subrange (array_cell (v), e1, e2, starsub, quoted);
       if ((quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) == 0)
        {
@@ -4835,10 +4866,16 @@ parameter_brace_patsub (varname, value, patsub, quoted)
   if (rep && *rep == '\0')
     rep = (char *)NULL;
 
+#if 0
   /* Expand PAT and REP for command, variable and parameter, arithmetic,
      and process substitution.  Also perform quote removal.  Do not
      perform word splitting or filename generation. */
   pat = expand_string_if_necessary (lpatsub, (quoted & ~Q_DOUBLE_QUOTES), expand_string_unsplit);
+#else
+  /* Perform the same expansions on the pattern as performed by the
+     pattern removal expansions. */
+  pat = getpattern (lpatsub, quoted, 1);
+#endif
 
   if (rep)
     {
@@ -5088,8 +5125,9 @@ parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_doll
     }
 
 #if defined (ARRAY_VARS)      
-  /* Process ${!ARRAY[@]} and ${!ARRAY[*]} expansion. */
-  if (want_indir && string[sindex - 1] == RBRACE && valid_array_reference (name+1))
+  /* Process ${!ARRAY[@]} and ${!ARRAY[*]} expansion. */ /* [ */
+  if (want_indir && string[sindex - 1] == RBRACE &&
+      string[sindex - 2] == ']' && valid_array_reference (name+1))
     {
       char *x, *x1;
 
@@ -5177,7 +5215,7 @@ parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_doll
     default:
     case '\0':
     bad_substitution:
-      report_error ("%s: bad substitution", string ? string : "??");
+      report_error (_("%s: bad substitution"), string ? string : "??");
       FREE (value);
       FREE (temp);
       free (name);
@@ -5251,7 +5289,7 @@ parameter_brace_expand (string, indexp, quoted, quoted_dollar_atp, contains_doll
          temp = (char *)NULL;
          if (c == '=' && var_is_special)
            {
-             report_error ("$%s: cannot assign in this way", name);
+             report_error (_("$%s: cannot assign in this way"), name);
              free (name);
              free (value);
              return &expand_param_error;
@@ -6620,7 +6658,7 @@ glob_expand_word_list (tlist, eflags)
            }
          else if (fail_glob_expansion != 0)
            {
-             report_error ("no match: %s", tlist->word->word);
+             report_error (_("no match: %s"), tlist->word->word);
              jump_to_top_level (DISCARD);
            }
          else if (allow_null_glob_expansion == 0)
diff --git a/support/bash.icon.ps b/support/bash.icon.ps
new file mode 100644 (file)
index 0000000..772e63e
--- /dev/null
@@ -0,0 +1,93 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: bash.icon.ps
+%%Creator: XV Version 3.00  Rev: 3/30/93  -  by John Bradley
+%%BoundingBox: 274 372 338 420
+%%Pages: 1
+%%DocumentFonts:
+%%EndComments
+%%EndProlog
+
+%%Page: 1 1
+
+% remember original state
+/origstate save def
+
+% build a temporary dictionary
+20 dict begin
+
+% define string to hold a scanline's worth of data
+/pix 8 string def
+
+% lower left corner
+274 372 translate
+
+% size of image (on paper, in 1/72inch coords)
+64.00800 48.02400 scale
+
+% dimensions of data
+64 48 1
+
+% mapping matrix
+[64 0 0 -48 0 48]
+
+{currentfile pix readhexstring pop}
+image
+fff99ff3dfffffff
+f9e67ffd3fffffff
+67fffafefe00ffff
+9fffc73f78053fff
+bfffbbcf45d08fff
+78bf6f67177643ff
+e01efdf6eeee89ff
+8e26dfb9bbbb94ff
+bf88cde9ddddc97f
+bfe07aad777772bf
+5ffabbf8eeeee93f
+bdf545fdbbbbba5f
+777effdddddddd1f
+bffbdef97777744f
+bfafbffceeeeed2f
+ddfdffbdbbbbba47
+dbefbfd9dddddca7
+effffbfb77777657
+eeffff78000000a7
+f7efbbf7fffffc57
+73fdffb03ffc7ca7
+7ddbedc99ffe7c57
+be7fff999ffe7ca7
+dfbbb7199ffe7c57
+afdff89998e21ca7
+6ff01788325a0c57
+f3ffff899e4e4ca7
+ff7ffe1998424c57
+ff9dfd9992724ca7
+ffe3c399925a4c57
+ffffbf90384644a7
+ffdff99ffffffc57
+ffdffd80000000a7
+ffbffeb777777657
+ffffffaeeeeeeea7
+ffffffbbbbbbba57
+ffffff9ddddddca6
+ffffffb777777652
+fffff7aeeeeeeea2
+fffff7bbbbbbba54
+fffff39cddddcc04
+fffb639657756650
+feb0952ea6a82600
+7c4a850a22a0a204
+bb268a14d5451402
+23b38c000000002a
+8a2b650ad48a8b3c
+443d6a74a28acb4c
+
+
+showpage
+
+% stop using temporary dictionary
+end
+
+% restore original state
+origstate restore
+
+%%Trailer
diff --git a/support/bash.install b/support/bash.install
new file mode 100644 (file)
index 0000000..6829b4f
--- /dev/null
@@ -0,0 +1,32 @@
+#! /bin/sh
+PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/ucb:/usr/lib:/usr/etc:/etc
+
+PROG=bash
+O=root
+NEWDIR=$HOME/install
+MODE=0755
+
+if [ -f /bsd ]; then
+       NEWVERS=$NEWDIR/bash.bsd386
+       DEST=/bin
+       O=bin
+       G=bin
+elif [ -d /usr/ibm ]; then
+       NEWVERS=$NEWDIR/bash.ibm032
+       DEST=/bin
+       G=staff
+else
+       NEWVERS=$NEWDIR/bash.sun4
+       DEST=/bin
+       G=staff
+fi
+
+install -c -o ${O} -g ${G} -m ${MODE} -s ${NEWVERS} ${DEST}/${PROG}.new
+
+# swap new and old version; save old version as ${PROG}.old
+cd $DEST
+rm -f ${PROG}.old
+mv ${PROG} ${PROG}.old
+mv ${PROG}.new ${PROG}
+
+exit 0
diff --git a/support/bash.xv b/support/bash.xv
new file mode 100644 (file)
index 0000000..35d5690
--- /dev/null
@@ -0,0 +1,35 @@
+#define bash_width 64
+#define bash_height 48
+static char bash_bits[] = {
+   0x00, 0x60, 0x06, 0x30, 0x04, 0x00, 0x00, 0x00, 0x60, 0x98, 0x01, 0x40,
+   0x03, 0x00, 0x00, 0x00, 0x19, 0x00, 0xa0, 0x80, 0x80, 0xff, 0x00, 0x00,
+   0x06, 0x00, 0x1c, 0x03, 0xe1, 0x5f, 0x03, 0x00, 0x02, 0x00, 0x22, 0x0c,
+   0x5d, 0xf4, 0x0e, 0x00, 0xe1, 0x02, 0x09, 0x19, 0x17, 0x91, 0x3d, 0x00,
+   0xf8, 0x87, 0x40, 0x90, 0x88, 0x88, 0x6e, 0x00, 0x8e, 0x9b, 0x04, 0x62,
+   0x22, 0x22, 0xd6, 0x00, 0x02, 0xee, 0x4c, 0x68, 0x44, 0x44, 0x6c, 0x01,
+   0x02, 0xf8, 0xa1, 0x4a, 0x11, 0x11, 0xb1, 0x02, 0x05, 0xa0, 0x22, 0xe0,
+   0x88, 0x88, 0x68, 0x03, 0x42, 0x50, 0x5d, 0x40, 0x22, 0x22, 0xa2, 0x05,
+   0x11, 0x81, 0x00, 0x44, 0x44, 0x44, 0x44, 0x07, 0x02, 0x20, 0x84, 0x60,
+   0x11, 0x11, 0xd1, 0x0d, 0x02, 0x0a, 0x02, 0xc0, 0x88, 0x88, 0x48, 0x0b,
+   0x44, 0x40, 0x00, 0x42, 0x22, 0x22, 0xa2, 0x1d, 0x24, 0x08, 0x02, 0x64,
+   0x44, 0x44, 0xc4, 0x1a, 0x08, 0x00, 0x20, 0x20, 0x11, 0x11, 0x91, 0x15,
+   0x88, 0x00, 0x00, 0xe1, 0xff, 0xff, 0xff, 0x1a, 0x10, 0x08, 0x22, 0x10,
+   0x00, 0x00, 0xc0, 0x15, 0x31, 0x40, 0x00, 0xf2, 0x03, 0xc0, 0xc1, 0x1a,
+   0x41, 0x24, 0x48, 0x6c, 0x06, 0x80, 0xc1, 0x15, 0x82, 0x01, 0x00, 0x66,
+   0x06, 0x80, 0xc1, 0x1a, 0x04, 0x22, 0x12, 0x67, 0x06, 0x80, 0xc1, 0x15,
+   0x0a, 0x04, 0xe0, 0x66, 0xe6, 0xb8, 0xc7, 0x1a, 0x09, 0xf0, 0x17, 0xee,
+   0xb3, 0xa5, 0xcf, 0x15, 0x30, 0x00, 0x00, 0x6e, 0x86, 0x8d, 0xcd, 0x1a,
+   0x00, 0x01, 0x80, 0x67, 0xe6, 0xbd, 0xcd, 0x15, 0x00, 0x46, 0x40, 0x66,
+   0xb6, 0xb1, 0xcd, 0x1a, 0x00, 0x38, 0x3c, 0x66, 0xb6, 0xa5, 0xcd, 0x15,
+   0x00, 0x00, 0x02, 0xf6, 0xe3, 0x9d, 0xdd, 0x1a, 0x00, 0x04, 0x60, 0x06,
+   0x00, 0x00, 0xc0, 0x15, 0x00, 0x04, 0x40, 0xfe, 0xff, 0xff, 0xff, 0x1a,
+   0x00, 0x02, 0x80, 0x12, 0x11, 0x11, 0x91, 0x15, 0x00, 0x00, 0x00, 0x8a,
+   0x88, 0x88, 0x88, 0x1a, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0xa2, 0x15,
+   0x00, 0x00, 0x00, 0x46, 0x44, 0x44, 0xc4, 0x9a, 0x00, 0x00, 0x00, 0x12,
+   0x11, 0x11, 0x91, 0xb5, 0x00, 0x00, 0x10, 0x8a, 0x88, 0x88, 0x88, 0xba,
+   0x00, 0x00, 0x10, 0x22, 0x22, 0x22, 0xa2, 0xd5, 0x00, 0x00, 0x30, 0xc6,
+   0x44, 0x44, 0xcc, 0xdf, 0x00, 0x20, 0x39, 0x96, 0x15, 0x51, 0x99, 0xf5,
+   0x80, 0xf2, 0x56, 0x8b, 0x9a, 0xea, 0x9b, 0xff, 0xc1, 0xad, 0x5e, 0xaf,
+   0xbb, 0xfa, 0xba, 0xdf, 0x22, 0x9b, 0xae, 0xd7, 0x54, 0x5d, 0xd7, 0xbf,
+   0x3b, 0x32, 0xce, 0xff, 0xff, 0xff, 0xff, 0xab, 0xae, 0x2b, 0x59, 0xaf,
+   0xd4, 0xae, 0x2e, 0xc3, 0xdd, 0x43, 0xa9, 0xd1, 0xba, 0xae, 0x2c, 0xcd};
diff --git a/support/config.rpath b/support/config.rpath
new file mode 100755 (executable)
index 0000000..fa24bfc
--- /dev/null
@@ -0,0 +1,548 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2003 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+#   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 of the License, 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-1307, USA.
+#
+#   As a special exception to the GNU General Public License, if you
+#   distribute this file as part of a program that contains a
+#   configuration script generated by Autoconf, you may include it under
+#   the same distribution terms that you use for the rest of that program.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    mingw* | pw32* | os2*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    newsos6)
+      ;;
+    linux*)
+      case $CC in
+        icc|ecc)
+          wl='-Wl,'
+          ;;
+        ccc)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      wl='-Wl,'
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  case "$host_os" in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we can use
+      # them.
+      ld_shlibs=no
+      ;;
+    beos*)
+      if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris* | sysv5*)
+      if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    *)
+      if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = yes; then
+    # Unlike libtool, we use -rpath here, not --rpath, since the documented
+    # option of GNU ld is called -rpath, not --rpath.
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            hardcode_direct=yes
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+    bsdi4*)
+      ;;
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    darwin* | rhapsody*)
+      if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then
+        hardcode_direct=no
+      fi
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+    freebsd2.2*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    freebsd2*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10* | hpux11*)
+      if test "$with_gnu_ld" = no; then
+        case "$host_cpu" in
+          hppa*64*)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=no
+            ;;
+          ia64*)
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_direct=no
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    openbsd*)
+      hardcode_direct=yes
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      else
+        case "$host_os" in
+          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+            hardcode_libdir_flag_spec='-R$libdir'
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+            ;;
+        esac
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4.2uw2*)
+      hardcode_direct=yes
+      hardcode_minus_L=no
+      ;;
+    sysv5OpenUNIX8* | sysv5UnixWare7* |  sysv5uw[78]* | unixware7*)
+      ;;
+    sysv5*)
+      hardcode_libdir_flag_spec=
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    ;;
+  aix4* | aix5*)
+    ;;
+  amigaos*)
+    ;;
+  beos*)
+    ;;
+  bsdi4*)
+    ;;
+  cygwin* | mingw* | pw32*)
+    shrext=.dll
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    ;;
+  dgux*)
+    ;;
+  freebsd1*)
+    ;;
+  freebsd*)
+    ;;
+  gnu*)
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case "$host_cpu" in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    ;;
+  irix5* | irix6* | nonstopux*)
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux*)
+    ;;
+  netbsd*)
+    ;;
+  newsos6)
+    ;;
+  nto-qnx)
+    ;;
+  openbsd*)
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    ;;
+  osf3* | osf4* | osf5*)
+    ;;
+  sco3.2v5*)
+    ;;
+  solaris*)
+    ;;
+  sunos4*)
+    ;;
+  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+    ;;
+  sysv4*MP*)
+    ;;
+  uts4*)
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/support/deblank.sh b/support/deblank.sh
new file mode 100644 (file)
index 0000000..c226139
--- /dev/null
@@ -0,0 +1,2 @@
+#! /bin/sh
+perl -pi -e 's/[ \t]+$//;' "$@"
diff --git a/support/endian.c b/support/endian.c
new file mode 100644 (file)
index 0000000..2bccf96
--- /dev/null
@@ -0,0 +1,150 @@
+/* endian.c -- A trick for determining the byte order of a machine. */
+
+/* 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <stdio.h>
+#include "bashansi.h"
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* The name of the source file that this code is made from. */
+char source_name[256];
+
+/* The name of the define.  Either "BIG_ENDIAN" or "LITTLE_ENDIAN". */
+char *endian_define;
+
+char string[9];
+char nstring[9];
+
+/* Stuff "1234" into a long, and compare it against a character string
+   "1234".  If the results are EQ, the machine is big endian like a 68000
+   or Sparc, otherwise it is little endian, like a Vax, or 386. */
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+#if defined (__STDC__)
+  register size_t i;
+#else
+  register int i;
+#endif /* !__STDC__ */
+  FILE *stream = (FILE *)NULL;
+  char *stream_name = "stdout";
+  union {
+      unsigned long l;
+      char s[sizeof (long)];
+  } u;
+
+  progname = argv[0];
+
+  for (i = strlen (progname); i > 0; i--)
+    if (progname[i] == '/')
+      {
+       progname = progname + i + 1;
+       break;
+      }
+
+  strcpy (source_name, progname);
+  for (i = strlen (source_name); i > 0; i--)
+    if (source_name[i] == '.')
+      {
+       source_name[i] = '\0';
+       break;
+      }
+
+  strcat (source_name, ".c");
+
+  if (argc == 1)
+    {
+      stream_name = "stdout";
+      stream = stdout;
+    }
+  else if (argc == 2)
+    {
+      stream_name = argv[1];
+      stream = fopen (stream_name, "w");
+    }
+  else
+    {
+      fprintf (stderr, "Usage: %s [output-file]\n", progname);
+      exit (1);
+    }
+
+  if (!stream)
+    {
+      fprintf (stderr, "%s: %s Cannot be opened or written to.\n",
+              progname, stream_name);
+      exit (2);
+    }
+
+  if (sizeof (long int) == 4)
+    {
+      u.l = 0x04030201L;
+      (void) strcpy (string, "4321");
+    }
+  else if (sizeof (long int) == 8)
+    {
+#if defined (__GNUC__)
+      unsigned long fake_out_gcc;
+
+      fake_out_gcc = (0x08070605L << 31);
+      fake_out_gcc = (fake_out_gcc << 1);
+      u.l = fake_out_gcc | 0x04030201L;
+#else
+      u.l = (0x08070605L << 32) | 0x04030201L;
+#endif /* !__GNUC__ */
+      (void) strcpy (string, "87654321");
+    }
+  else
+    {
+      fprintf (stderr,
+              "%s: sizeof (long int) = %d, which isn't handled here.\n",
+              progname, sizeof (long int));
+      exit (2);
+    }
+
+  for (i = 0; i < sizeof (long); i++)
+    nstring[i] = u.s[i] + '0';
+  nstring[i] = '\0';
+
+  if (strcmp (nstring, string) == 0)
+    endian_define = "BIG_ENDIAN";
+  else
+    endian_define = "LITTLE_ENDIAN";
+
+  fprintf (stream, "/* %s - Define BIG or LITTLE endian. */\n\n", stream_name);
+  fprintf (stream,
+"/* This file was automatically created by `%s'.  You shouldn't\n\
+   edit this file, because your changes will be overwritten.  Instead,\n\
+   edit the source code file `%s'. */\n\n",
+          progname, source_name);
+
+  fprintf (stream, "#if !defined (%s)\n", endian_define);
+  fprintf (stream, "#  define %s\n", endian_define);
+  fprintf (stream, "#endif /* %s */\n", endian_define);
+
+  if (stream != stdout)
+    fclose (stream);
+
+  exit (0);
+}
diff --git a/support/mail-shell b/support/mail-shell
new file mode 100755 (executable)
index 0000000..082b231
--- /dev/null
@@ -0,0 +1,126 @@
+#! /bin/bash
+#
+# mail-shell -- mail out the shell
+#
+# usage: mail-shell -t tarball recipient
+#
+# Chet Ramey
+# chet@ins.CWRU.Edu
+#
+
+# Copyright (C) 1995-2002 by Chester Ramey
+#
+# 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.
+
+PATH=/usr/ucb:/bin:/usr/bin:/usr/local/bin/gnu:/usr/local/bin:.
+
+trap 'rm -f x?? ${UUFILE}' 0 1 2 3 6 15
+
+prog=`basename $0`
+
+TARFILE=bash.tar
+VERS=2.05b
+
+while getopts t: opt
+do
+       case $opt in
+       t)      TARFILE=$OPTARG ;;
+       *)      echo usage: $prog [ -t tarfile ] recipient 1>&2
+               exit 1
+       esac
+done
+
+shift $(( $OPTIND - 1 ))
+
+case "$TARFILE" in
+bash-*.tar)    VERS=${TARFILE%%.tar} ; VERS=${VERS#bash-} ;;
+esac
+
+GZFILE=${TARFILE}.gz
+UUFILE=${GZFILE}.uu
+
+if [ $# -ne 1 ] ; then
+       echo usage: $0 recipient
+       exit 1
+fi
+
+recip=$1
+i=1
+
+if [ ! -f ${TARFILE} ] && [ ! -f ${GZFILE} ]; then
+       echo "$prog: no file ${TARFILE}, aborting"
+       exit 1
+fi
+
+if [ ! -f ${GZFILE} ] ; then
+       echo "$prog: no gzipped tar file ${GZFILE}"
+       echo "$prog: gzipping ${TARFILE}"
+       gzip ${TARFILE}
+fi
+
+if [ ! -f ${UUFILE} ] ; then
+       echo "$prog: no uuencoded tar file ${UUFILE}"
+       echo "$prog: uuencoding ${GZFILE}"
+       uuencode ${GZFILE} < ${GZFILE} > ${UUFILE}
+fi
+
+files=$(echo x??)
+
+if [ "$files" = 'x??' ] ; then
+       echo "$prog: no split of ${UUFILE} exists"
+       echo "$prog: splitting ${UUFILE}"
+       split ${UUFILE}
+fi
+
+count()
+{
+       echo $#
+}
+
+parts=$(count x??)
+
+if [ -x /usr/ucb/mail ]; then
+       MAIL=/usr/ucb/mail
+elif [ -x /usr/ucb/Mail ]; then
+       MAIL=/usr/ucb/Mail
+elif [ -x /usr/bin/mailx ]; then
+       MAIL=/usr/bin/mailx
+elif [ -x /usr/bin/mail ]; then
+       MAIL=/usr/bin/mail
+else
+       MAIL=/bin/mail
+fi
+
+$MAIL -s "bash-${VERS} shipment coming" $recip <<EOF
+
+Hi.  Here is version ${VERS} of bash.  Expect $parts messages.
+Each is part of a uuencoded tar file of the bash sources.  When
+you get all $parts messages, cat them all together into the file
+${UUFILE}, and run uudecode on this file.  You will have a
+gzipped tar file named ${GZFILE}.  gunzip it, cd into a source
+directory (the tar archive extracts into its own directory), and
+untar.
+
+Chet
+EOF
+
+for file in x??
+do
+       echo mailing part $i to $recip
+       /usr/ucb/mail -s "${UUFILE} part $i of $parts" $recip < $file
+       i=$(( $i + 1 ))
+done
+
+exit 0
diff --git a/support/memtest.c b/support/memtest.c
new file mode 100644 (file)
index 0000000..6295251
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ * malloc test program.
+ *
+ * to build:
+ *     make x.o
+ *     gcc -g -o x x.o xmalloc.o lib/malloc/libmalloc.a
+ */
+
+/* Copyright (C) 2002 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, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#define USING_BASH_MALLOC
+#define HAVE_STRINGIZE
+
+#include "xmalloc.h"
+
+int interrupt_immediately = 0;
+
+static char    xp[64];
+
+main(int c, char **v)
+{
+       char    *p;
+
+       malloc_set_register(1);
+
+#if 0
+       free (xp);      /* free unallocated memory */
+#endif
+
+#if 0
+       p = xrealloc(xp, 128);
+#endif
+
+#if 0
+       /*
+        * request an amount so that the bucket changes when the malloc
+        * overhead is added to the requested size.  This had better
+        * succeed.
+        */
+       p = xmalloc(25);
+       p[0] = 'a';
+       p[1] = '\0';
+       free(p);        /* sanity check on underflow checks in free() */
+#endif
+
+#if 0
+       p = xmalloc(28);
+       /* This works for little-endian machines like i386. */
+       p[-4] = '\7';   /* underflow */
+       p = xrealloc(p, 128);   /* realloc corrupted memory */
+#endif
+
+#if 0
+       p = xmalloc(28);
+       /* This works for little-endian machines like i386. */
+       p[-4] = '\7';   /* underflow */
+       free(p);
+#endif
+
+#if 0
+       p = xmalloc(2);
+       free(p);
+       free(p);        /* duplicate free */
+#endif
+
+#if 0
+       p = xmalloc(32);
+       free(p);
+       p = xrealloc(p, 128);   /* realloc freed mem */
+#endif
+
+#if 0
+       p = xmalloc(64);
+       p[64] = '\0';
+       p = xrealloc(p, 128);   /* overflow */
+#endif
+
+#if 0
+       p = xmalloc(64);
+       p[64] = '\0';
+       free(p);                /* overflow */
+#endif
+
+#if 0
+       p = xmalloc(64);
+       p[-1] = 'a';
+       free (p);               /* underflow */
+#endif
+
+#if 0
+       p = xmalloc(64);
+       p[-1] = 'a';
+       p = xrealloc(p, 129);   /* underflow */
+#endif
+
+       mregister_dump_table();
+       exit(0);
+}
+
+void
+fatal_error(const char *format, ...)
+{
+       va_list args;
+
+       fprintf(stderr, "malloc-test: ");
+       va_start(args, format);
+       vfprintf(stderr, format, args);
+       fprintf(stderr, "\n");
+       va_end(args);
+       exit(2);
+}
+
+void
+programming_error(const char *format, ...)
+{
+       va_list args;
+
+       fprintf(stderr, "malloc-test: ");
+       va_start(args, format);
+       vfprintf(stderr, format, args);
+       fprintf(stderr, "\n");
+       va_end(args);
+
+       abort();
+}
+
+int
+signal_is_trapped(int n)
+{
+       return 0;
+}
diff --git a/support/mk-takehome b/support/mk-takehome
new file mode 100755 (executable)
index 0000000..61338b0
--- /dev/null
@@ -0,0 +1,29 @@
+#! /bin/bash
+
+DATE=$(date +%Y%m%d)
+
+PARENT=/fs2/chet/bash
+DIR=$PARENT/bash-$DATE
+SRC=/usr/homes/chet/src/bash/src
+
+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
+
+cd $PARENT || exit 1
+
+tar cvf bash-$DATE.tar bash-$DATE 
+
+gzip -v bash-$DATE.tar
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/support/mkdep b/support/mkdep
new file mode 100755 (executable)
index 0000000..a79c90a
--- /dev/null
@@ -0,0 +1,102 @@
+#!/bin/sh -
+#
+#      BSDI $Id: mkdep.gcc.sh,v 2.1 1995/02/03 12:54:13 polk Exp $
+#
+# Copyright (c) 1991, 1993
+#      The Regents of the University of California.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+#    must display the following acknowledgement:
+#      This product includes software developed by the University of
+#      California, Berkeley and its contributors.
+# 4. Neither the name of the University nor the names of its contributors
+#    may be used to endorse or promote products derived from this software
+#    without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#      @(#)mkdep.gcc.sh        8.1 (Berkeley) 6/6/93
+#
+
+PATH=/bin:/usr/bin:/usr/gnu/bin:/usr/local/bin:/usr/local/bin/gnu
+export PATH
+
+cpp=${CPP:-gcc}
+#trad="-notraditional"
+
+D=depends                      # default dependency file is depends
+append=0
+pflag=
+
+usage()
+{
+       echo 'usage: mkdep [-t] [-p] [-f depend_file] [-c compiler] [cc_flags] file ...' >&2
+}
+
+while getopts "2af:c:pt" opt; do
+       case "$opt" in
+       # -2 => gcc2 -- this option is temporary, hence not documented
+       2)      cpp=${CPP:-gcc2} ; trad= ;;
+       # -a appends to the depend file
+       a)      append=1;;
+       # -c specifies the compiler to use
+       c)      CPP=$OPTARG ;;
+       # -f allows you to select a makefile name
+       f)      D=$OPTARG ;;
+       # the -p flag produces "program: program.c" style dependencies
+       # so .o's don't get produced
+       p)      pflag=p ;;
+       # -t means use -traditional with gnu cpp
+       t)      trad="-traditional" ;;
+       \?)     usage ; exit 2;;
+       esac
+done
+
+shift $(( $OPTIND - 1 ))
+
+if [ $# = 0 ] ; then
+       usage
+       exit 1
+fi
+
+TMP=/tmp/mkdep$$
+
+trap 'rm -f $TMP ; exit 1' 1 2 3 13 15
+
+if [ x$pflag = x ]; then
+       $cpp $trad -M $* | sed -e 's; \./; ;g' > $TMP
+else
+       $cpp $trad -M $* | sed -e 's;\.o *:;:;' -e 's; \./; ;g' > $TMP
+fi
+
+if [ $? != 0 ]; then
+       echo 'mkdep: compile failed.'
+       rm -f $TMP
+       exit 1
+fi
+
+if [ $append = 1 ]; then
+       cat $TMP >> $D
+       rm -f $TMP
+else
+       mv $TMP $D
+fi
+exit 0
diff --git a/support/mkdist b/support/mkdist
new file mode 100755 (executable)
index 0000000..06e6155
--- /dev/null
@@ -0,0 +1,120 @@
+#! /bin/bash -
+#
+# mkdist - make a distribution directory from a master manifest file
+#
+# usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version
+#
+# SRCDIR defaults to src
+# MANIFEST defaults to $SRCDIR/MANIFEST
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 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.
+
+SRCDIR=src
+ROOTNAME=bash
+
+usage()
+{
+       echo usage: mkdist [-m manifest] [-s srcdir] [-r rootname] [-v] version 1>&2
+       exit 2
+}
+
+vmsg()
+{
+       if [ -n "$verbose" ]; then
+               echo mkdist: "$@"
+       fi
+}
+
+while getopts m:s:r:v name
+do
+       case $name in
+       m)      MANIFEST=$OPTARG ;;
+       s)      SRCDIR=$OPTARG ;;
+       r)      ROOTNAME=$OPTARG ;;
+       v)      verbose=yes ;;
+       ?)      usage ;;
+       esac
+done
+
+: ${MANIFEST:=$SRCDIR/MANIFEST}
+
+vmsg using $MANIFEST
+
+shift $(( $OPTIND - 1 ))
+
+if [ $# -lt 1 ]; then
+       usage
+fi
+
+version=$1
+newdir=${ROOTNAME}-$version
+
+vmsg creating distribution for $ROOTNAME version $version in $newdir
+
+if [ ! -d $newdir ]; then
+       mkdir $newdir || { echo $0: cannot make directory $newdir 1>&2 ; exit 1; }
+fi
+
+dirmode=755
+filmode=644
+
+while read fname type mode
+do
+       [ -z "$fname" ] && continue
+
+       case "$fname" in
+       \#*)    continue ;;
+       esac
+
+       case "$type" in
+       d)      mkdir $newdir/$fname ;;
+       f)      cp -p $SRCDIR/$fname $newdir/$fname ;;
+       s)      ln -s $mode $newdir/$fname ; mode= ;;           # symlink
+       l)      ln $mode $newdir/$fname ; mode= ;;              # hard link
+       *)      echo "unknown file type $type" 1>&2 ;;
+       esac
+
+       if [ -n "$mode" ]; then
+               chmod $mode $newdir/$fname
+       fi
+
+done < $MANIFEST
+
+# cut off the `-alpha' in something like `2.0-alpha', leaving just the
+# numeric version
+#version=${version%%-*}
+
+#case "$version" in
+#*.*.*)        vers=${version%.*} ;;
+#*.*)  vers=${version} ;;
+#esac
+
+#echo $vers > $newdir/.distribution
+
+#case "$version" in
+#*.*.*)        plevel=${version##*.} ;;
+#*)    plevel=0 ;;
+#esac
+#[ -z "$plevel" ] && plevel=0
+#echo ${plevel} > $newdir/.patchlevel
+
+vmsg $newdir created
+
+exit 0
diff --git a/support/mkdocdist b/support/mkdocdist
new file mode 100755 (executable)
index 0000000..8e7ec4b
--- /dev/null
@@ -0,0 +1,101 @@
+#! /bin/bash -
+#
+# mkdocdist - make a distribution directory containing formatted
+#            documentation from a master manifest file
+#
+# usage: mkdocdist [-m manifest] [-s srcdir] [-r rootname] [-v] version
+#
+# SRCDIR defaults to src
+# MANIFEST defaults to $SRCDIR/MANIFEST.doc
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 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.
+
+SRCDIR=src
+ROOTNAME=bash-doc
+
+usage()
+{
+       echo usage: mkdocdist [-m manifest] [-s srcdir] [-r rootname] [-v] version 1>&2
+       exit 2
+}
+
+vmsg()
+{
+       if [ -n "$verbose" ]; then
+               echo mkdocdist: "$@"
+       fi
+}
+
+while getopts m:s:r:v name
+do
+       case $name in
+       m)      MANIFEST=$OPTARG ;;
+       s)      SRCDIR=$OPTARG ;;
+       r)      ROOTNAME=$OPTARG ;;
+       v)      verbose=yes ;;
+       ?)      usage ;;
+       esac
+done
+
+: ${MANIFEST:=$SRCDIR/MANIFEST.doc}
+
+vmsg using $MANIFEST
+
+shift $(( $OPTIND - 1 ))
+
+if [ $# -lt 1 ]; then
+       usage
+fi
+
+version=$1
+newdir=${ROOTNAME}-$version
+
+vmsg creating documentation distribution for $ROOTNAME version $version in $newdir
+
+if [ ! -d $newdir ]; then
+       mkdir $newdir || { echo $0: cannot make directory $newdir 1>&2 ; exit 1; }
+fi
+
+dirmode=755
+filmode=644
+
+while read fname type mode
+do
+       [ -z "$fname" ] && continue
+
+       case "$fname" in
+       \#*)    continue ;;
+       esac
+
+       case "$type" in
+       d)      mkdir $newdir/$fname ;;
+       f)      cp -p $SRCDIR/$fname $newdir/$fname ;;
+       *)      echo "unknown file type $type" 1>&2 ;;
+       esac
+
+       if [ -n "$mode" ]; then
+               chmod $mode $newdir/$fname
+       fi
+
+done < $MANIFEST
+
+vmsg $newdir created
+
+exit 0
diff --git a/support/mkinstalldirs b/support/mkinstalldirs
new file mode 100755 (executable)
index 0000000..d2d5f21
--- /dev/null
@@ -0,0 +1,111 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage" 1>&2
+      exit 0
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+case $dirmode in
+  '')
+    if mkdir -p -- . 2>/dev/null; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    fi
+    ;;
+esac
+
+for file
+do
+  set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+  shift
+
+  pathcomp=
+  for d
+  do
+    pathcomp="$pathcomp$d"
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+       errstatus=$lasterr
+      else
+       if test ! -z "$dirmode"; then
+         echo "chmod $dirmode $pathcomp"
+         lasterr=""
+         chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+         if test ! -z "$lasterr"; then
+           errstatus=$lasterr
+         fi
+       fi
+      fi
+    fi
+
+    pathcomp="$pathcomp/"
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# End:
+# mkinstalldirs ends here
diff --git a/support/mknewvers.sh b/support/mknewvers.sh
new file mode 100644 (file)
index 0000000..4e5a237
--- /dev/null
@@ -0,0 +1,113 @@
+#! /bin/bash
+#
+# Simple program to make new version files for the shell.
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 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.
+
+PROGNAME=`basename $0`
+USAGE="$PROGNAME [-M] [-m] [-p] [version]"
+
+while [ $# -gt 0 ]; do
+       case "$1" in
+       -n)     shift; debug=yes;;
+       -M)     shift; major_version=yes ;;
+       -m)     shift; minor_version=yes ;;
+       -p)     shift; patch_level=yes ;;
+       -*)     echo "$PROGNAME: usage: $USAGE" >&2 ; exit 2 ;;
+       *)      break;;
+       esac
+done
+
+if [ -n "$1" ]; then
+       NEWVERSION="$1";
+fi
+
+DISTFILE=_distribution
+PATCHFILE=_patchlevel
+
+dist_version=`cat $DISTFILE`
+PATCH=`cat $PATCHFILE`
+
+# making new version files from a new version argument
+if [ -n "$NEWVERSION" ]; then
+       case "$NEWVERSION" in
+       *.*.*)  PATCH=${NEWVERSION##*.} ;;
+       *)      PATCH=0 ;;
+       esac
+
+       case "$NEWVERSION" in
+       *.*.*)  vers=${NEWVERSION%.*} ;;
+       *)      vers=${NEWVERSION} ;;
+       esac
+
+       case "$vers" in
+       *.*)    MAJOR=${vers%.*} MINOR=${vers##*.} ;;
+       *)      MAJOR=${vers} MINOR=0 ;;
+       esac
+
+       if [ -n "$debug" ]; then
+               echo "echo ${MAJOR}.${MINOR} > $DISTFILE"
+               echo "echo ${PATCH} > $PATCHFILE"
+       else
+               echo ${MAJOR}.${MINOR} > $DISTFILE
+               echo ${PATCH} > $PATCHFILE
+       fi
+
+       echo "$PROGNAME: running autoconf..."
+       autoconf
+
+       exit 0
+fi
+
+case "$dist_version" in
+*.*.*) vers=${dist_version%.*} ;;
+*.*)   vers=${dist_version} ;;
+esac
+
+case "$vers" in
+*.*)   MAJOR=${vers%.*} MINOR=${vers##*.} ;;
+*)     MAJOR=${vers} MINOR=0 ;;
+esac
+
+# incrementing the major version
+if [ -n "$major_version" ]; then
+       MAJOR=`expr $MAJOR + 1`
+fi
+
+if [ -n "$minor_version" ]; then
+       $MINOR=`echo $minor_version | awk '{printf "%02d\n", $1+1}'`
+fi
+       
+if [ -n "$patch_level" ]; then
+       PATCH=`expr $PATCH + 1`
+fi
+
+if [ -n "$debug" ]; then
+       echo "echo ${MAJOR}.${MINOR} > $DISTFILE"
+       echo "echo ${PATCH} > $PATCHFILE"
+else
+       echo ${MAJOR}.${MINOR} > $DISTFILE
+       echo ${PATCH} > $PATCHFILE
+fi
+
+echo "$PROGNAME: running autoconf..."
+autoconf
+
+exit 0
diff --git a/support/mksnap b/support/mksnap
new file mode 100755 (executable)
index 0000000..5166cff
--- /dev/null
@@ -0,0 +1,59 @@
+#! /bin/bash -
+#
+# mksnap -- make a snapshot copy of the bash source tree in a new directory
+#          named by the date
+#
+# Chet Ramey
+# chet@po.cwru.edu
+
+# Copyright (C) 1996-2002 by Chester Ramey
+#
+# 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.
+
+SRCDIR="src"
+SRCARG="-s src"
+ROOTNAME="-r bash"
+
+usage()
+{
+       echo usage: mksnap [-m manifest] [-s srcdir] [-r rootname] [-v] 1>&2
+       exit 2
+}
+
+vmsg()
+{
+       if [ -n "$verbose" ]; then
+               echo mksnap: "$@"
+       fi
+}
+
+while getopts m:s:r:v name
+do
+       case $name in
+       m)      MANIFEST="-m $OPTARG" ;;
+       s)      SRCDIR="$OPTARG" SRCARG="-s $OPTARG" ;;
+       r)      ROOTNAME="-r $OPTARG" ;;
+       v)      verbose=-v ;;
+       ?)      usage ;;
+       esac
+done
+
+VERSION=`date "+%Y%m%d"`
+
+vmsg calling mkdist $verbose
+
+/bin/bash $SRCDIR/support/mkdist $verbose $SRCARG $MANIFEST $ROOTNAME $VERSION
+
+exit 0
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 3df73e1..4c13717 100755 (executable)
@@ -145,8 +145,14 @@ darwin*|macosx*)
        SHLIB_LIBVERSION='$(SHLIB_MAJOR)$(SHLIB_MINOR).$(SHLIB_LIBSUFF)'
        SHLIB_LIBSUFF='dylib'
 
-       SHOBJ_LDFLAGS='-dynamic'
-       SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+       case "${host_os}" in
+       darwin7*)       SHOBJ_LDFLAGS=''
+                       SHLIB_XLDFLAGS='-dynamiclib -arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+                       ;;
+       *)              SHOBJ_LDFLAGS='-dynamic'
+                       SHLIB_XLDFLAGS='-arch_only `/usr/bin/arch` -install_name $(libdir)/$@ -current_version $(SHLIB_MAJOR)$(SHLIB_MINOR) -compatibility_version $(SHLIB_MAJOR) -v'
+                       ;;
+       esac
 
        SHLIB_LIBS='-lncurses'  # see if -lcurses works on MacOS X 10.1 
        ;;
diff --git a/support/texi2dvi-0.43 b/support/texi2dvi-0.43
new file mode 100755 (executable)
index 0000000..5439e08
--- /dev/null
@@ -0,0 +1,568 @@
+#! /bin/sh
+# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
+# $Id: texi2dvi,v 0.43 1999/09/28 19:36:53 karl Exp $
+#
+# Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99 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, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+#
+# Original author: Noah Friedman <friedman@gnu.org>.
+#
+# Please send bug reports, etc. to bug-texinfo@gnu.org.
+# If possible, please send a copy of the output of the script called with
+# the `--debug' option when making a bug report.
+
+# This string is expanded by rcs automatically when this file is checked out.
+rcs_revision='$Revision: 0.43 $'
+rcs_version=`set - $rcs_revision; echo $2`
+program=`echo $0 | sed -e 's!.*/!!'`
+version="texi2dvi (GNU Texinfo 4.0) $rcs_version
+
+Copyright (C) 1999 Free Software Foundation, Inc.
+There is NO warranty.  You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="Usage: $program [OPTION]... FILE...
+
+Run each Texinfo or LaTeX FILE through TeX in turn until all
+cross-references are resolved, building all indices.  The directory
+containing each FILE is searched for included files.  The suffix of FILE
+is used to determine its language (LaTeX or Texinfo).
+
+Makeinfo is used to perform Texinfo macro expansion before running TeX
+when needed.
+
+Options:
+  -@                   Use @input instead of \input; for preloaded Texinfo.
+  -b, --batch          No interaction.
+  -c, --clean          Remove all auxiliary files.
+  -D, --debug          Turn on shell debugging (set -x).
+  -e, --expand         Force macro expansion using makeinfo.
+  -I DIR               Search DIR for Texinfo files.
+  -h, --help           Display this help and exit successfully.
+  -l, --language=LANG  Specify the LANG of FILE: LaTeX or Texinfo.
+  -p, --pdf            Use pdftex or pdflatex for processing.
+  -q, --quiet          No output unless errors (implies --batch).
+  -s, --silent         Same as --quiet.
+  -t, --texinfo=CMD    Insert CMD after @setfilename in copy of input file.
+                       Multiple values accumulate.
+  -v, --version        Display version information and exit successfully.
+  -V, --verbose        Report on what is done.
+
+The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO,
+TEX (or PDFTEX), and TEXINDEX environment variables are used to run
+those commands, if they are set.
+
+Email bug reports to <bug-texinfo@gnu.org>,
+general questions and discussion to <help-texinfo@gnu.org>."
+
+# Initialize variables for option overriding and otherwise.
+# Don't use `unset' since old bourne shells don't have this command.
+# Instead, assign them an empty value.
+escape='\'
+batch=false     # eval for batch mode
+clean=
+debug=
+expand=         # t for expansion via makeinfo
+oformat=dvi
+set_language=
+miincludes=     # makeinfo include path
+textra=
+tmpdir=${TMPDIR:-/tmp}/t2d$$  # avoid collisions on 8.3 filesystems.
+txincludes=     # TEXINPUTS extensions
+txiprereq=19990129 # minimum texinfo.tex version to have macro expansion
+quiet=          # by default let the tools' message be displayed
+verbose=false   # echo for verbose mode
+
+orig_pwd=`pwd`
+
+# Systems which define $COMSPEC or $ComSpec use semicolons to separate
+# directories in TEXINPUTS.
+if test -n "$COMSPEC$ComSpec"; then
+  path_sep=";"
+else
+  path_sep=":"
+fi
+
+# Save this so we can construct a new TEXINPUTS path for each file.
+TEXINPUTS_orig="$TEXINPUTS"
+# Unfortunately makeindex does not read TEXINPUTS.
+INDEXSTYLE_orig="$INDEXSTYLE"
+export TEXINPUTS INDEXSTYLE
+
+# Push a token among the arguments that will be used to notice when we
+# ended options/arguments parsing.
+# Use "set dummy ...; shift" rather than 'set - ..." because on
+# Solaris set - turns off set -x (but keeps set -e).
+# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
+# still expand "$@" to a single argument (the empty string) rather
+# than nothing at all.
+arg_sep="$$--$$"
+set dummy ${1+"$@"} "$arg_sep"; shift
+
+# \f
+# Parse command line arguments.
+while test x"$1" != x"$arg_sep"; do
+
+  # Handle --option=value by splitting apart and putting back on argv.
+  case "$1" in
+    --*=*)
+      opt=`echo "$1" | sed -e 's/=.*//'`
+      val=`echo "$1" | sed -e 's/[^=]*=//'`
+      shift
+      set dummy "$opt" "$val" ${1+"$@"}; shift
+      ;;
+  esac
+
+  # This recognizes --quark as --quiet.  So what.
+  case "$1" in
+    -@ ) escape=@;;
+    # Silently and without documentation accept -b and --b[atch] as synonyms.
+    -b | --b*) batch=eval;;
+    -q | -s | --q* | --s*) quiet=t; batch=eval;;
+    -c | --c*) clean=t;;
+    -D | --d*) debug=t;;
+    -e | --e*) expand=t;;
+    -h | --h*) echo "$usage"; exit 0;;
+    -I | --I*)
+      shift
+      miincludes="$miincludes -I $1"
+      txincludes="$txincludes$path_sep$1"
+      ;;
+    -l | --l*) shift; set_language=$1;;
+    -p | --p*) oformat=pdf;;
+    -t | --t*) shift; textra="$textra\\
+$1";;
+    -v | --vers*) echo "$version"; exit 0;;
+    -V | --verb*) verbose=echo;;
+    --) # What remains are not options.
+      shift
+      while test x"$1" != x"$arg_sep"; do
+        set dummy ${1+"$@"} "$1"; shift
+        shift
+      done
+      break;;
+    -*)
+      echo "$0: Unknown or ambiguous option \`$1'." >&2
+      echo "$0: Try \`--help' for more information." >&2
+      exit 1;;
+    *) set dummy ${1+"$@"} "$1"; shift;;
+   esac
+   shift
+done
+# Pop the token
+shift
+
+# Interpret remaining command line args as filenames.
+if test $# = 0; then
+  echo "$0: Missing file arguments." >&2
+  echo "$0: Try \`--help' for more information." >&2
+  exit 2
+fi
+
+# Prepare the temporary directory.  Remove it at exit, unless debugging.
+if test -z "$debug"; then
+  trap "cd / && rm -rf $tmpdir" 0 1 2 15
+fi
+
+# Create the temporary directory with strict rights
+(umask 077 && mkdir $tmpdir) || exit 1
+
+# Prepare the tools we might need.  This may be extra work in some
+# cases, but improves the readibility of the script.
+utildir=$tmpdir/utils
+mkdir $utildir || exit 1
+
+# A sed script that preprocesses Texinfo sources in order to keep the
+# iftex sections only.  We want to remove non TeX sections, and
+# comment (with `@c texi2dvi') TeX sections so that makeinfo does not
+# try to parse them.  Nevertheless, while commenting TeX sections,
+# don't comment @macro/@end macro so that makeinfo does propagate
+# them.  Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo
+# doesn't work well enough (yet) to use that, so work around with sed.
+comment_iftex_sed=$utildir/comment.sed
+cat <<EOF >$comment_iftex_sed
+/^@tex/,/^@end tex/{
+  s/^/@c texi2dvi/
+}
+/^@iftex/,/^@end iftex/{
+  s/^/@c texi2dvi/
+  /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
+    s/^@c texi2dvi//
+  }
+}
+/^@html/,/^@end html/d
+/^@ifhtml/,/^@end ifhtml/d
+/^@ifnottex/,/^@end ifnottex/d
+/^@ifinfo/,/^@end ifinfo/{
+  /^@node/p
+  /^@menu/,/^@end menu/p
+  d
+}
+EOF
+# Uncommenting is simple: Remove any leading `@c texi2dvi'.
+uncomment_iftex_sed=$utildir/uncomment.sed
+cat <<EOF >$uncomment_iftex_sed
+s/^@c texi2dvi//
+EOF
+
+# A shell script that computes the list of xref files.
+# Takes the filename (without extension) of which we look for xref
+# files as argument.  The index files must be reported last.
+get_xref_files=$utildir/get_xref.sh
+cat <<\EOF >$get_xref_files
+#! /bin/sh
+
+# Get list of xref files (indexes, tables and lists).
+# Find all files having root filename with a two-letter extension,
+# saves the ones that are really Texinfo-related files.  .?o? catches
+# LaTeX tables and lists.
+for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do
+  # If file is empty, skip it.
+  test -s "$this_file" || continue
+  # If the file is not suitable to be an index or xref file, don't
+  # process it.  The file can't be if its first character is not a
+  # backslash or single quote.
+  first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file`
+  if test "x$first_character" = "x\\" \
+     || test "x$first_character" = "x'"; then
+    xref_files="$xref_files ./$this_file"
+  fi
+done
+echo "$xref_files"
+EOF
+chmod 500 $get_xref_files
+
+# File descriptor usage:
+# 0 standard input
+# 1 standard output (--verbose messages)
+# 2 standard error
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 5 tools output (turned off by --quiet)
+
+# Tools' output.  If quiet, discard, else redirect to the message flow.
+if test "$quiet" = t; then
+  exec 5>/dev/null
+else
+  exec 5>&1
+fi
+
+# Enable tracing
+test "$debug" = t && set -x
+
+# \f
+# TeXify files.
+
+for command_line_filename in ${1+"$@"}; do
+  $verbose "Processing $command_line_filename ..."
+
+  # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
+  # prepend `./' in order to avoid that the tools take it as an option.
+  echo "$command_line_filename" | egrep '^(/|[A-z]:/)' >/dev/null \
+  || command_line_filename="./$command_line_filename"
+
+  # See if the file exists.  If it doesn't we're in trouble since, even
+  # though the user may be able to reenter a valid filename at the tex
+  # prompt (assuming they're attending the terminal), this script won't
+  # be able to find the right xref files and so forth.
+  if test ! -r "$command_line_filename"; then
+    echo "$0: Could not read $command_line_filename, skipping." >&2
+    continue
+  fi
+
+  # Get the name of the current directory.  We want the full path
+  # because in clean mode we are in tmp, in which case a relative
+  # path has no meaning.
+  filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'`
+  filename_dir=`cd "$filename_dir" >/dev/null && pwd`
+
+  # Strip directory part but leave extension.
+  filename_ext=`basename "$command_line_filename"`
+  # Strip extension.
+  filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
+  ext=`echo "$filename_ext" | sed 's/^.*\.//'`
+
+  # _src.  Use same basename since we want to generate aux files with
+  # the same basename as the manual.  If --expand, then output the
+  # macro-expanded file to here, else copy the original file.
+  tmpdir_src=$tmpdir/src
+  filename_src=$tmpdir_src/$filename_noext.$ext
+
+  # _xtr.  The file with the user's extra commands.
+  tmpdir_xtr=$tmpdir/xtr
+  filename_xtr=$tmpdir_xtr/$filename_noext.$ext
+
+  # _bak.  Copies of the previous xref files (another round is run if
+  # they differ from the new one).
+  tmpdir_bak=$tmpdir/bak
+
+  # Make all those directories and give up if we can't succeed.
+  mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1
+
+  # Source file might include additional sources.  Put `.' and
+  # directory where source file(s) reside in TEXINPUTS before anything
+  # else.  `.' goes first to ensure that any old .aux, .cps,
+  # etc. files in ${directory} don't get used in preference to fresher
+  # files in `.'.  Include orig_pwd in case we are in clean mode, where
+  # we've cd'd to a temp directory.
+  common=".$path_sep$orig_pwd$path_sep$filename_dir$path_sep$txincludes$path_sep"
+   TEXINPUTS="$common$TEXINPUTS_orig"
+  INDEXSTYLE="$common$INDEXSTYLE_orig"
+
+  # If the user explicitly specified the language, use that.
+  # Otherwise, if the first line is \input texinfo, assume it's texinfo.
+  # Otherwise, guess from the file extension.
+  if test -n "$set_language"; then
+    language=$set_language
+  elif sed 1q "$command_line_filename" | fgrep 'input texinfo' >/dev/null; then
+    language=texinfo
+  else
+    language=
+  fi
+
+  # Get the type of the file (latex or texinfo) from the given language
+  # we just guessed, or from the file extension if not set yet.
+  case ${language:-$filename_ext} in
+    [lL]a[tT]e[xX] | *.ltx | *.tex)
+      # Assume a LaTeX file.  LaTeX needs bibtex and uses latex for
+      # compilation.  No makeinfo.
+      bibtex=${BIBTEX:-bibtex}
+      makeinfo= # no point in running makeinfo on latex source.
+      texindex=${MAKEINDEX:-makeindex}
+      if test $oformat = dvi; then
+        tex=${LATEX:-latex}
+      else
+        tex=${PDFLATEX:-pdflatex}
+      fi
+      ;;
+
+    *)
+      # Assume a Texinfo file.  Texinfo files need makeinfo, texindex and tex.
+      bibtex=
+      texindex=${TEXINDEX:-texindex}
+      if test $oformat = dvi; then
+        tex=${TEX:-tex}
+      else
+        tex=${PDFTEX:-pdftex}
+      fi
+      # Unless required by the user, makeinfo expansion is wanted only
+      # if texinfo.tex is too old.
+      if test "$expand" = t; then
+        makeinfo=${MAKEINFO:-makeinfo}
+      else
+        # Check if texinfo.tex performs macro expansion by looking for
+        # its version.  The version is a date of the form YEAR-MO-DA.
+        # We don't need to use [0-9] to match the digits since anyway
+        # the comparison with $txiprereq, a number, will fail with non
+        # digits.
+        txiversion_tex=txiversion.tex
+        echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex
+        # Run in the tmpdir to avoid leaving files.
+        eval `cd $tmpdir >/dev/null \
+                    && $tex $txiversion_tex 2>/dev/null \
+| sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'`
+        $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
+        if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then
+          makeinfo=
+        else
+          makeinfo=${MAKEINFO:-makeinfo}
+        fi
+        # As long as we had to run TeX, offer the user this convenience
+        if test "$txiformat" = Texinfo; then
+          escape=@
+        fi
+      fi
+      ;;
+  esac
+
+  # Expand macro commands in the original source file using Makeinfo.
+  # Always use `end' footnote style, since the `separate' style
+  #   generates different output (arguably this is a bug in -E).
+  # Discard main info output, the user asked to run TeX, not makeinfo.
+  if test -n "$makeinfo"; then
+    $verbose "Macro-expanding $command_line_filename to $filename_src ..."
+    sed -f $comment_iftex_sed "$command_line_filename" \
+      | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \
+        -o /dev/null --macro-expand=- \
+      | sed -f $uncomment_iftex_sed >"$filename_src"
+    filename_input=$filename_src
+  fi
+
+  # If makeinfo failed (or was not even run), use the original file as input.
+  if test $? -ne 0 \
+     || test ! -r "$filename_src"; then
+    $verbose "Reverting to $command_line_filename ..."
+    filename_input=$filename_dir/$filename_ext
+  fi
+
+  # Used most commonly for @finalout, @smallbook, etc.
+  if test -n "$textra"; then
+    $verbose "Inserting extra commands: $textra"
+    sed '/^@setfilename/a\
+'"$textra" "$filename_input" >$filename_xtr
+    filename_input=$filename_xtr
+  fi
+
+  # If clean mode was specified, then move to the temporary directory.
+  if test "$clean" = t; then
+    $verbose "cd $tmpdir_src"
+    cd "$tmpdir_src" || exit 1
+  fi
+
+  while :; do # will break out of loop below
+    orig_xref_files=`$get_xref_files "$filename_noext"`
+
+    # Save copies of originals for later comparison.
+    if test -n "$orig_xref_files"; then
+      $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`"
+      cp $orig_xref_files $tmpdir_bak
+    fi
+
+    # Run bibtex on current file.
+    # - If its input (AUX) exists.
+    # - If AUX contains both `\bibdata' and `\bibstyle'.
+    # - If some citations are missing (LOG contains `Citation').
+    #   or the LOG complains of a missing .bbl
+    #
+    # We run bibtex first, because I can see reasons for the indexes
+    # to change after bibtex is run, but I see no reason for the
+    # converse.
+    #
+    # Don't try to be too smart.  Running bibtex only if the bbl file
+    # exists and is older than the LaTeX file is wrong, since the
+    # document might include files that have changed.  Because there
+    # can be several AUX (if there are \include's), but a single LOG,
+    # looking for missing citations in LOG is easier, though we take
+    # the risk to match false messages.
+    if test -n "$bibtex" \
+       && test -r "$filename_noext.aux" \
+       && test -r "$filename_noext.log" \
+       && (grep '^\\bibdata[{]'  "$filename_noext.aux" \
+           && grep '^\\bibstyle[{]' "$filename_noext.aux" \
+           && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \
+               || grep 'No file .*\.bbl\.' "$filename_noext.log")) \
+          >/dev/null 2>&1; \
+    then
+      $verbose "Running $bibtex $filename_noext ..."
+      if $bibtex "$filename_noext" >&5; then :; else
+        echo "$0: $bibtex exited with bad status, quitting." >&2
+        exit 1
+      fi
+    fi
+
+    # What we'll run texindex on -- exclude non-index files.
+    # Since we know index files are last, it is correct to remove everything
+    # before .aux and .?o?.
+    index_files=`echo "$orig_xref_files" \
+                 | sed "s!.*\.aux!!g;
+                        s!./$filename_noext\..o.!!g;
+                        s/^[ ]*//;s/[ ]*$//"`
+    # Run texindex (or makeindex) on current index files.  If they
+    # already exist, and after running TeX a first time the index
+    # files don't change, then there's no reason to run TeX again.
+    # But we won't know that if the index files are out of date or
+    # nonexistent.
+    if test -n "$texindex" && test -n "$index_files"; then
+      $verbose "Running $texindex $index_files ..."
+      if $texindex $index_files 2>&5 1>&2; then :; else
+         echo "$0: $texindex exited with bad status, quitting." >&2
+         exit 1
+      fi
+    fi
+
+    # Finally, run TeX.
+    # Prevent $ESCAPE from being interpreted by the shell if it happens
+    # to be `/'.
+    $batch tex_args="\\${escape}nonstopmode\ \\${escape}input"
+    $verbose "Running $cmd ..."
+    cmd="$tex $tex_args $filename_input"
+    if $cmd >&5; then :; else
+      echo "$0: $tex exited with bad status, quitting." >&2
+      echo "$0: see $filename_noext.log for errors." >&2
+      test "$clean" = t \
+        && cp "$filename_noext.log" "$orig_pwd"
+      exit 1
+    fi
+
+
+    # Decide if looping again is needed.
+    finished=t
+
+    # LaTeX (and the package changebar) report in the LOG file if it
+    # should be rerun.  This is needed for files included from
+    # subdirs, since texi2dvi does not try to compare xref files in
+    # subdirs.  Performing xref files test is still good since LaTeX
+    # does not report changes in xref files.
+    if fgrep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then
+      finished=
+    fi
+
+    # Check if xref files changed.
+    new_xref_files=`$get_xref_files "$filename_noext"`
+    $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`"
+    $verbose "New xref files      = `echo $new_xref_files | sed 's|\./||g'`"
+
+    # If old and new lists don't at least have the same file list,
+    # then one file or another has definitely changed.
+    test "x$orig_xref_files" != "x$new_xref_files" && finished=
+
+    # File list is the same.  We must compare each file until we find
+    # a difference.
+    if test -n "$finished"; then
+      for this_file in $new_xref_files; do
+        $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..."
+        # cmp -s returns nonzero exit status if files differ.
+        if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else
+          # We only need to keep comparing until we find one that
+          # differs, because we'll have to run texindex & tex again no
+          # matter how many more there might be.
+          finished=
+          $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
+          test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file"
+          break
+        fi
+      done
+    fi
+
+    # If finished, exit the loop, else rerun the loop.
+    test -n "$finished" && break
+  done
+
+  # If we were in clean mode, compilation was in a tmp directory.
+  # Copy the DVI (or PDF) file into the directory where the compilation
+  # has been done.  (The temp dir is about to get removed anyway.)
+  # We also return to the original directory so that
+  # - the next file is processed in correct conditions
+  # - the temporary file can be removed
+  if test -n "$clean"; then
+    $verbose "Copying $oformat file from `pwd` to $orig_pwd"
+    cp -p "./$filename_noext.$oformat" "$orig_pwd"
+    cd / # in case $orig_pwd is on a different drive (for DOS)
+    cd $orig_pwd || exit 1
+  fi
+
+  # Remove temporary files.
+  if test "x$debug" = "x"; then
+    $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
+    cd /
+    rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
+  fi
+done
+
+$verbose "$0 done."
+exit 0 # exit successfully, not however we ended the loop.
diff --git a/support/texi2dvi-0.46 b/support/texi2dvi-0.46
new file mode 100755 (executable)
index 0000000..db09865
--- /dev/null
@@ -0,0 +1,604 @@
+#! /bin/sh
+# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
+# $Id: texi2dvi,v 0.46 2001/06/07 18:43:25 karl Exp $
+#
+# Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2001
+# 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, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+#
+# Original author: Noah Friedman <friedman@gnu.org>.
+#
+# Please send bug reports, etc. to bug-texinfo@gnu.org.
+# If possible, please send a copy of the output of the script called with
+# the `--debug' option when making a bug report.
+
+# This string is expanded by rcs automatically when this file is checked out.
+rcs_revision='$Revision: 0.46 $'
+rcs_version=`set - $rcs_revision; echo $2`
+program=`echo $0 | sed -e 's!.*/!!'`
+version="texi2dvi (GNU Texinfo 4.0) $rcs_version
+
+Copyright (C) 1999 Free Software Foundation, Inc.
+There is NO warranty.  You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="Usage: $program [OPTION]... FILE...
+
+Run each Texinfo or LaTeX FILE through TeX in turn until all
+cross-references are resolved, building all indices.  The directory
+containing each FILE is searched for included files.  The suffix of FILE
+is used to determine its language (LaTeX or Texinfo).
+
+Makeinfo is used to perform Texinfo macro expansion before running TeX
+when needed.
+
+Operation modes:
+  -b, --batch         no interaction
+  -c, --clean         remove all auxiliary files
+  -D, --debug         turn on shell debugging (set -x)
+  -h, --help          display this help and exit successfully
+  -o, --output=OFILE  leave output in OFILE (implies --clean);
+                      Only one input FILE may be specified in this case
+  -q, --quiet         no output unless errors (implies --batch)
+  -s, --silent        same as --quiet
+  -v, --version       display version information and exit successfully
+  -V, --verbose       report on what is done
+
+TeX tuning:
+  -@                   use @input instead of \input; for preloaded Texinfo
+  -e, --expand         force macro expansion using makeinfo
+  -I DIR               search DIR for Texinfo files
+  -l, --language=LANG  specify the LANG of FILE (LaTeX or Texinfo)
+  -p, --pdf            use pdftex or pdflatex for processing
+  -t, --texinfo=CMD    insert CMD after @setfilename in copy of input file
+                       multiple values accumulate
+
+The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO,
+TEX (or PDFTEX), and TEXINDEX environment variables are used to run
+those commands, if they are set.
+
+Email bug reports to <bug-texinfo@gnu.org>,
+general questions and discussion to <help-texinfo@gnu.org>."
+
+# Initialize variables for option overriding and otherwise.
+# Don't use `unset' since old bourne shells don't have this command.
+# Instead, assign them an empty value.
+batch=false     # eval for batch mode
+clean=
+debug=
+escape='\'
+expand=         # t for expansion via makeinfo
+miincludes=     # makeinfo include path
+oformat=dvi
+oname=         # --output
+quiet=          # by default let the tools' message be displayed
+set_language=
+textra=
+tmpdir=${TMPDIR:-/tmp}/t2d$$  # avoid collisions on 8.3 filesystems.
+txincludes=     # TEXINPUTS extensions
+txiprereq=19990129 # minimum texinfo.tex version to have macro expansion
+verbose=false   # echo for verbose mode
+
+orig_pwd=`pwd`
+
+# Systems which define $COMSPEC or $ComSpec use semicolons to separate
+# directories in TEXINPUTS.
+if test -n "$COMSPEC$ComSpec"; then
+  path_sep=";"
+else
+  path_sep=":"
+fi
+
+# Save this so we can construct a new TEXINPUTS path for each file.
+TEXINPUTS_orig="$TEXINPUTS"
+# Unfortunately makeindex does not read TEXINPUTS.
+INDEXSTYLE_orig="$INDEXSTYLE"
+export TEXINPUTS INDEXSTYLE
+
+# Push a token among the arguments that will be used to notice when we
+# ended options/arguments parsing.
+# Use "set dummy ...; shift" rather than 'set - ..." because on
+# Solaris set - turns off set -x (but keeps set -e).
+# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
+# still expand "$@" to a single argument (the empty string) rather
+# than nothing at all.
+arg_sep="$$--$$"
+set dummy ${1+"$@"} "$arg_sep"; shift
+
+# \f
+# Parse command line arguments.
+while test x"$1" != x"$arg_sep"; do
+
+  # Handle --option=value by splitting apart and putting back on argv.
+  case "$1" in
+    --*=*)
+      opt=`echo "$1" | sed -e 's/=.*//'`
+      val=`echo "$1" | sed -e 's/[^=]*=//'`
+      shift
+      set dummy "$opt" "$val" ${1+"$@"}; shift
+      ;;
+  esac
+
+  # This recognizes --quark as --quiet.  So what.
+  case "$1" in
+    -@ ) escape=@;;
+    # Silently and without documentation accept -b and --b[atch] as synonyms.
+    -b | --b*) batch=eval;;
+    -q | -s | --q* | --s*) quiet=t; batch=eval;;
+    -c | --c*) clean=t;;
+    -D | --d*) debug=t;;
+    -e | --e*) expand=t;;
+    -h | --h*) echo "$usage"; exit 0;;
+    -I | --I*)
+      shift
+      miincludes="$miincludes -I $1"
+      txincludes="$txincludes$path_sep$1"
+      ;;
+    -l | --l*) shift; set_language=$1;;
+    -o | --o*)
+      shift
+      clean=t
+      case "$1" in
+        /* | ?:/*) oname=$1;;
+                *) oname="$orig_pwd/$1";;
+      esac;;
+    -p | --p*) oformat=pdf;;
+    -t | --t*) shift; textra="$textra\\
+$1";;
+    -v | --vers*) echo "$version"; exit 0;;
+    -V | --verb*) verbose=echo;;
+    --) # What remains are not options.
+      shift
+      while test x"$1" != x"$arg_sep"; do
+        set dummy ${1+"$@"} "$1"; shift
+        shift
+      done
+      break;;
+    -*)
+      echo "$0: Unknown or ambiguous option \`$1'." >&2
+      echo "$0: Try \`--help' for more information." >&2
+      exit 1;;
+    *) set dummy ${1+"$@"} "$1"; shift;;
+   esac
+   shift
+done
+# Pop the token
+shift
+
+# Interpret remaining command line args as filenames.
+case $# in
+ 0)
+  echo "$0: Missing file arguments." >&2
+  echo "$0: Try \`--help' for more information." >&2
+  exit 2
+  ;;
+ 1) ;;
+ *)
+  if test -n "$oname"; then
+    echo "$0: Can't use option \`--output' with more than one argument." >&2
+    exit 2
+  fi
+  ;;
+esac
+
+# Prepare the temporary directory.  Remove it at exit, unless debugging.
+if test -z "$debug"; then
+  trap "cd / && rm -rf $tmpdir" 0 1 2 15
+fi
+
+# Create the temporary directory with strict rights
+(umask 077 && mkdir $tmpdir) || exit 1
+
+# Prepare the tools we might need.  This may be extra work in some
+# cases, but improves the readibility of the script.
+utildir=$tmpdir/utils
+mkdir $utildir || exit 1
+
+# A sed script that preprocesses Texinfo sources in order to keep the
+# iftex sections only.  We want to remove non TeX sections, and
+# comment (with `@c texi2dvi') TeX sections so that makeinfo does not
+# try to parse them.  Nevertheless, while commenting TeX sections,
+# don't comment @macro/@end macro so that makeinfo does propagate
+# them.  Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo
+# doesn't work well enough (yet) to use that, so work around with sed.
+comment_iftex_sed=$utildir/comment.sed
+cat <<EOF >$comment_iftex_sed
+/^@tex/,/^@end tex/{
+  s/^/@c texi2dvi/
+}
+/^@iftex/,/^@end iftex/{
+  s/^/@c texi2dvi/
+  /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
+    s/^@c texi2dvi//
+  }
+}
+/^@html/,/^@end html/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifhtml/,/^@end ifhtml/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifnottex/,/^@end ifnottex/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifinfo/,/^@end ifinfo/{
+  /^@node/p
+  /^@menu/,/^@end menu/p
+  t
+  s/^/@c (texi2dvi)/
+}
+s/^@ifnotinfo/@c texi2dvi@ifnotinfo/
+s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/
+EOF
+# Uncommenting is simple: Remove any leading `@c texi2dvi'.
+uncomment_iftex_sed=$utildir/uncomment.sed
+cat <<EOF >$uncomment_iftex_sed
+s/^@c texi2dvi//
+EOF
+
+# A shell script that computes the list of xref files.
+# Takes the filename (without extension) of which we look for xref
+# files as argument.  The index files must be reported last.
+get_xref_files=$utildir/get_xref.sh
+cat <<\EOF >$get_xref_files
+#! /bin/sh
+
+# Get list of xref files (indexes, tables and lists).
+# Find all files having root filename with a two-letter extension,
+# saves the ones that are really Texinfo-related files.  .?o? catches
+# LaTeX tables and lists.
+for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do
+  # If file is empty, skip it.
+  test -s "$this_file" || continue
+  # If the file is not suitable to be an index or xref file, don't
+  # process it.  The file can't be if its first character is not a
+  # backslash or single quote.
+  first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file`
+  if test "x$first_character" = "x\\" \
+     || test "x$first_character" = "x'"; then
+    xref_files="$xref_files ./$this_file"
+  fi
+done
+echo "$xref_files"
+EOF
+chmod 500 $get_xref_files
+
+# File descriptor usage:
+# 0 standard input
+# 1 standard output (--verbose messages)
+# 2 standard error
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 5 tools output (turned off by --quiet)
+
+# Tools' output.  If quiet, discard, else redirect to the message flow.
+if test "$quiet" = t; then
+  exec 5>/dev/null
+else
+  exec 5>&1
+fi
+
+# Enable tracing
+test "$debug" = t && set -x
+
+# \f
+# TeXify files.
+
+for command_line_filename in ${1+"$@"}; do
+  $verbose "Processing $command_line_filename ..."
+
+  # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
+  # prepend `./' in order to avoid that the tools take it as an option.
+  echo "$command_line_filename" | egrep '^(/|[A-z]:/)' >/dev/null \
+  || command_line_filename="./$command_line_filename"
+
+  # See if the file exists.  If it doesn't we're in trouble since, even
+  # though the user may be able to reenter a valid filename at the tex
+  # prompt (assuming they're attending the terminal), this script won't
+  # be able to find the right xref files and so forth.
+  if test ! -r "$command_line_filename"; then
+    echo "$0: Could not read $command_line_filename, skipping." >&2
+    continue
+  fi
+
+  # Get the name of the current directory.  We want the full path
+  # because in clean mode we are in tmp, in which case a relative
+  # path has no meaning.
+  filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'`
+  filename_dir=`cd "$filename_dir" >/dev/null && pwd`
+
+  # Strip directory part but leave extension.
+  filename_ext=`basename "$command_line_filename"`
+  # Strip extension.
+  filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
+  ext=`echo "$filename_ext" | sed 's/^.*\.//'`
+
+  # _src.  Use same basename since we want to generate aux files with
+  # the same basename as the manual.  If --expand, then output the
+  # macro-expanded file to here, else copy the original file.
+  tmpdir_src=$tmpdir/src
+  filename_src=$tmpdir_src/$filename_noext.$ext
+
+  # _xtr.  The file with the user's extra commands.
+  tmpdir_xtr=$tmpdir/xtr
+  filename_xtr=$tmpdir_xtr/$filename_noext.$ext
+
+  # _bak.  Copies of the previous xref files (another round is run if
+  # they differ from the new one).
+  tmpdir_bak=$tmpdir/bak
+
+  # Make all those directories and give up if we can't succeed.
+  mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1
+
+  # Source file might include additional sources.  Put `.' and
+  # directory where source file(s) reside in TEXINPUTS before anything
+  # else.  `.' goes first to ensure that any old .aux, .cps,
+  # etc. files in ${directory} don't get used in preference to fresher
+  # files in `.'.  Include orig_pwd in case we are in clean mode, where
+  # we've cd'd to a temp directory.
+  common=".$path_sep$orig_pwd$path_sep$filename_dir$path_sep$txincludes$path_sep"
+   TEXINPUTS="$common$TEXINPUTS_orig"
+  INDEXSTYLE="$common$INDEXSTYLE_orig"
+
+  # If the user explicitly specified the language, use that.
+  # Otherwise, if the first line is \input texinfo, assume it's texinfo.
+  # Otherwise, guess from the file extension.
+  if test -n "$set_language"; then
+    language=$set_language
+  elif sed 1q "$command_line_filename" | fgrep 'input texinfo' >/dev/null; then
+    language=texinfo
+  else
+    language=
+  fi
+
+  # Get the type of the file (latex or texinfo) from the given language
+  # we just guessed, or from the file extension if not set yet.
+  case ${language:-$filename_ext} in
+    [lL]a[tT]e[xX] | *.ltx | *.tex)
+      # Assume a LaTeX file.  LaTeX needs bibtex and uses latex for
+      # compilation.  No makeinfo.
+      bibtex=${BIBTEX:-bibtex}
+      makeinfo= # no point in running makeinfo on latex source.
+      texindex=${MAKEINDEX:-makeindex}
+      if test $oformat = dvi; then
+        tex=${LATEX:-latex}
+      else
+        tex=${PDFLATEX:-pdflatex}
+      fi
+      ;;
+
+    *)
+      # Assume a Texinfo file.  Texinfo files need makeinfo, texindex and tex.
+      bibtex=
+      texindex=${TEXINDEX:-texindex}
+      if test $oformat = dvi; then
+        tex=${TEX:-tex}
+      else
+        tex=${PDFTEX:-pdftex}
+      fi
+      # Unless required by the user, makeinfo expansion is wanted only
+      # if texinfo.tex is too old.
+      if test "$expand" = t; then
+        makeinfo=${MAKEINFO:-makeinfo}
+      else
+        # Check if texinfo.tex performs macro expansion by looking for
+        # its version.  The version is a date of the form YEAR-MO-DA.
+        # We don't need to use [0-9] to match the digits since anyway
+        # the comparison with $txiprereq, a number, will fail with non
+        # digits.
+        txiversion_tex=txiversion.tex
+        echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex
+        # Run in the tmpdir to avoid leaving files.
+        eval `cd $tmpdir >/dev/null &&
+              $tex $txiversion_tex 2>/dev/null |
+              sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'`
+        $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
+        if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then
+          makeinfo=
+        else
+          makeinfo=${MAKEINFO:-makeinfo}
+        fi
+        # As long as we had to run TeX, offer the user this convenience
+        if test "$txiformat" = Texinfo; then
+          escape=@
+        fi
+      fi
+      ;;
+  esac
+
+  # Expand macro commands in the original source file using Makeinfo.
+  # Always use `end' footnote style, since the `separate' style
+  #   generates different output (arguably this is a bug in -E).
+  # Discard main info output, the user asked to run TeX, not makeinfo.
+  if test -n "$makeinfo"; then
+    $verbose "Macro-expanding $command_line_filename to $filename_src ..."
+    sed -f $comment_iftex_sed "$command_line_filename" \
+      | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \
+        -o /dev/null --macro-expand=- \
+      | sed -f $uncomment_iftex_sed >"$filename_src"
+    filename_input=$filename_src
+  fi
+
+  # If makeinfo failed (or was not even run), use the original file as input.
+  if test $? -ne 0 \
+     || test ! -r "$filename_src"; then
+    $verbose "Reverting to $command_line_filename ..."
+    filename_input=$filename_dir/$filename_ext
+  fi
+
+  # Used most commonly for @finalout, @smallbook, etc.
+  if test -n "$textra"; then
+    $verbose "Inserting extra commands: $textra"
+    sed '/^@setfilename/a\
+'"$textra" "$filename_input" >$filename_xtr
+    filename_input=$filename_xtr
+  fi
+
+  # If clean mode was specified, then move to the temporary directory.
+  if test "$clean" = t; then
+    $verbose "cd $tmpdir_src"
+    cd "$tmpdir_src" || exit 1
+  fi
+
+  while :; do # will break out of loop below
+    orig_xref_files=`$get_xref_files "$filename_noext"`
+
+    # Save copies of originals for later comparison.
+    if test -n "$orig_xref_files"; then
+      $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`"
+      cp $orig_xref_files $tmpdir_bak
+    fi
+
+    # Run bibtex on current file.
+    # - If its input (AUX) exists.
+    # - If AUX contains both `\bibdata' and `\bibstyle'.
+    # - If some citations are missing (LOG contains `Citation').
+    #   or the LOG complains of a missing .bbl
+    #
+    # We run bibtex first, because I can see reasons for the indexes
+    # to change after bibtex is run, but I see no reason for the
+    # converse.
+    #
+    # Don't try to be too smart.  Running bibtex only if the bbl file
+    # exists and is older than the LaTeX file is wrong, since the
+    # document might include files that have changed.  Because there
+    # can be several AUX (if there are \include's), but a single LOG,
+    # looking for missing citations in LOG is easier, though we take
+    # the risk to match false messages.
+    if test -n "$bibtex" \
+       && test -r "$filename_noext.aux" \
+       && test -r "$filename_noext.log" \
+       && (grep '^\\bibdata[{]'  "$filename_noext.aux" \
+           && grep '^\\bibstyle[{]' "$filename_noext.aux" \
+           && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \
+               || grep 'No file .*\.bbl\.' "$filename_noext.log")) \
+          >/dev/null 2>&1; \
+    then
+      $verbose "Running $bibtex $filename_noext ..."
+      if $bibtex "$filename_noext" >&5; then :; else
+        echo "$0: $bibtex exited with bad status, quitting." >&2
+        exit 1
+      fi
+    fi
+
+    # What we'll run texindex on -- exclude non-index files.
+    # Since we know index files are last, it is correct to remove everything
+    # before .aux and .?o?.
+    index_files=`echo "$orig_xref_files" \
+                 | sed "s!.*\.aux!!g;
+                        s!./$filename_noext\..o.!!g;
+                        s/^[ ]*//;s/[ ]*$//"`
+    # Run texindex (or makeindex) on current index files.  If they
+    # already exist, and after running TeX a first time the index
+    # files don't change, then there's no reason to run TeX again.
+    # But we won't know that if the index files are out of date or
+    # nonexistent.
+    if test -n "$texindex" && test -n "$index_files"; then
+      $verbose "Running $texindex $index_files ..."
+      if $texindex $index_files 2>&5 1>&2; then :; else
+         echo "$0: $texindex exited with bad status, quitting." >&2
+         exit 1
+      fi
+    fi
+
+    # Finally, run TeX.
+    # Prevent $ESCAPE from being interpreted by the shell if it happens
+    # to be `/'.
+    $batch tex_args="\\${escape}nonstopmode\ \\${escape}input"
+    $verbose "Running $cmd ..."
+    cmd="$tex $tex_args $filename_input"
+    if $cmd >&5; then :; else
+      echo "$0: $tex exited with bad status, quitting." >&2
+      echo "$0: see $filename_noext.log for errors." >&2
+      test "$clean" = t \
+        && cp "$filename_noext.log" "$orig_pwd"
+      exit 1
+    fi
+
+
+    # Decide if looping again is needed.
+    finished=t
+
+    # LaTeX (and the package changebar) report in the LOG file if it
+    # should be rerun.  This is needed for files included from
+    # subdirs, since texi2dvi does not try to compare xref files in
+    # subdirs.  Performing xref files test is still good since LaTeX
+    # does not report changes in xref files.
+    if fgrep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then
+      finished=
+    fi
+
+    # Check if xref files changed.
+    new_xref_files=`$get_xref_files "$filename_noext"`
+    $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`"
+    $verbose "New xref files      = `echo $new_xref_files | sed 's|\./||g'`"
+
+    # If old and new lists don't at least have the same file list,
+    # then one file or another has definitely changed.
+    test "x$orig_xref_files" != "x$new_xref_files" && finished=
+
+    # File list is the same.  We must compare each file until we find
+    # a difference.
+    if test -n "$finished"; then
+      for this_file in $new_xref_files; do
+        $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..."
+        # cmp -s returns nonzero exit status if files differ.
+        if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else
+          # We only need to keep comparing until we find one that
+          # differs, because we'll have to run texindex & tex again no
+          # matter how many more there might be.
+          finished=
+          $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
+          test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file"
+          break
+        fi
+      done
+    fi
+
+    # If finished, exit the loop, else rerun the loop.
+    test -n "$finished" && break
+  done
+
+  # If we were in clean mode, compilation was in a tmp directory.
+  # Copy the DVI (or PDF) file into the directory where the compilation
+  # has been done.  (The temp dir is about to get removed anyway.)
+  # We also return to the original directory so that
+  # - the next file is processed in correct conditions
+  # - the temporary file can be removed
+  if test -n "$clean"; then
+    if test -n "$oname"; then
+       dest=$oname
+    else
+       dest=$orig_pwd
+    fi
+    $verbose "Copying $oformat file from `pwd` to $dest"
+    cp -p "./$filename_noext.$oformat" "$dest"
+    cd / # in case $orig_pwd is on a different drive (for DOS)
+    cd $orig_pwd || exit 1
+  fi
+
+  # Remove temporary files.
+  if test "x$debug" = "x"; then
+    $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
+    cd /
+    rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
+  fi
+done
+
+$verbose "$0 done."
+exit 0 # exit successfully, not however we ended the loop.
diff --git a/support/texi2dvi-1.14 b/support/texi2dvi-1.14
new file mode 100755 (executable)
index 0000000..010b586
--- /dev/null
@@ -0,0 +1,660 @@
+#! /bin/sh
+# texi2dvi --- produce DVI (or PDF) files from Texinfo (or LaTeX) sources.
+# $Id: texi2dvi,v 1.14 2003/02/05 00:42:33 karl Exp $
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001,
+# 2002, 2003 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, you can either send email to this
+# program's maintainer or write to: The Free Software Foundation,
+# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
+#
+# Original author: Noah Friedman <friedman@gnu.org>.
+#
+# Please send bug reports, etc. to bug-texinfo@gnu.org.
+# If possible, please send a copy of the output of the script called with
+# the `--debug' option when making a bug report.
+
+# This string is expanded by rcs automatically when this file is checked out.
+rcs_revision='$Revision: 1.14 $'
+rcs_version=`set - $rcs_revision; echo $2`
+program=`echo $0 | sed -e 's!.*/!!'`
+version="texi2dvi (GNU Texinfo 4.5) $rcs_version
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+There is NO warranty.  You may redistribute this software
+under the terms of the GNU General Public License.
+For more information about these matters, see the files named COPYING."
+
+usage="Usage: $program [OPTION]... FILE...
+
+Run each Texinfo or LaTeX FILE through TeX in turn until all
+cross-references are resolved, building all indices.  The directory
+containing each FILE is searched for included files.  The suffix of FILE
+is used to determine its language (LaTeX or Texinfo).
+
+Makeinfo is used to perform Texinfo macro expansion before running TeX
+when needed.
+
+Operation modes:
+  -b, --batch         no interaction
+  -c, --clean         remove all auxiliary files
+  -D, --debug         turn on shell debugging (set -x)
+  -h, --help          display this help and exit successfully
+  -o, --output=OFILE  leave output in OFILE (implies --clean);
+                      Only one input FILE may be specified in this case
+  -q, --quiet         no output unless errors (implies --batch)
+  -s, --silent        same as --quiet
+  -v, --version       display version information and exit successfully
+  -V, --verbose       report on what is done
+
+TeX tuning:
+  -@                   use @input instead of \input; for preloaded Texinfo
+  -e, -E, --expand     force macro expansion using makeinfo
+  -I DIR               search DIR for Texinfo files
+  -l, --language=LANG  specify the LANG of FILE (LaTeX or Texinfo)
+  -p, --pdf            use pdftex or pdflatex for processing
+  -t, --texinfo=CMD    insert CMD after @setfilename in copy of input file
+                       multiple values accumulate
+
+The values of the BIBTEX, LATEX (or PDFLATEX), MAKEINDEX, MAKEINFO,
+TEX (or PDFTEX), and TEXINDEX environment variables are used to run
+those commands, if they are set.
+
+Email bug reports to <bug-texinfo@gnu.org>,
+general questions and discussion to <help-texinfo@gnu.org>.
+Texinfo home page: http://www.gnu.org/software/texinfo/"
+
+# Initialize variables for option overriding and otherwise.
+# Don't use `unset' since old bourne shells don't have this command.
+# Instead, assign them an empty value.
+batch=false     # eval for batch mode
+clean=
+debug=
+escape='\'
+expand=         # t for expansion via makeinfo
+miincludes=     # makeinfo include path
+oformat=dvi
+oname=          # --output
+quiet=          # by default let the tools' message be displayed
+set_language=
+textra=
+tmpdir=${TMPDIR:-/tmp}/t2d$$  # avoid collisions on 8.3 filesystems.
+txincludes=     # TEXINPUTS extensions, with trailing colon
+txiprereq=19990129 # minimum texinfo.tex version to have macro expansion
+verbose=false   # echo for verbose mode
+
+orig_pwd=`pwd`
+
+# Systems which define $COMSPEC or $ComSpec use semicolons to separate
+# directories in TEXINPUTS.
+if test -n "$COMSPEC$ComSpec"; then
+  path_sep=";"
+else
+  path_sep=":"
+fi
+
+# Pacify verbose cds.
+CDPATH=${ZSH_VERSION+.}$path_sep
+
+# In case someone crazy insists on using grep -E.
+: ${EGREP=egrep}
+
+# Save this so we can construct a new TEXINPUTS path for each file.
+TEXINPUTS_orig="$TEXINPUTS"
+# Unfortunately makeindex does not read TEXINPUTS.
+INDEXSTYLE_orig="$INDEXSTYLE"
+export TEXINPUTS INDEXSTYLE
+
+# Push a token among the arguments that will be used to notice when we
+# ended options/arguments parsing.
+# Use "set dummy ...; shift" rather than 'set - ..." because on
+# Solaris set - turns off set -x (but keeps set -e).
+# Use ${1+"$@"} rather than "$@" because Digital Unix and Ultrix 4.3
+# still expand "$@" to a single argument (the empty string) rather
+# than nothing at all.
+arg_sep="$$--$$"
+set dummy ${1+"$@"} "$arg_sep"; shift
+
+# \f
+# Parse command line arguments.
+while test x"$1" != x"$arg_sep"; do
+
+  # Handle --option=value by splitting apart and putting back on argv.
+  case "$1" in
+    --*=*)
+      opt=`echo "$1" | sed -e 's/=.*//'`
+      val=`echo "$1" | sed -e 's/[^=]*=//'`
+      shift
+      set dummy "$opt" "$val" ${1+"$@"}; shift
+      ;;
+  esac
+
+  # This recognizes --quark as --quiet.  So what.
+  case "$1" in
+    -@ ) escape=@;;
+    # Silently and without documentation accept -b and --b[atch] as synonyms.
+    -b | --b*) batch=eval;;
+    -q | -s | --q* | --s*) quiet=t; batch=eval;;
+    -c | --c*) clean=t;;
+    -D | --d*) debug=t;;
+    -e | -E | --e*) expand=t;;
+    -h | --h*) echo "$usage"; exit 0;;
+    -I | --I*)
+      shift
+      miincludes="$miincludes -I $1"
+      txincludes="$txincludes$1$path_sep"
+      ;;
+    -l | --l*) shift; set_language=$1;;
+    -o | --o*)
+      shift
+      clean=t
+      case "$1" in
+        /* | ?:/*) oname=$1;;
+                *) oname="$orig_pwd/$1";;
+      esac;;
+    -p | --p*) oformat=pdf;;
+    -t | --t*) shift; textra="$textra\\
+$1";;
+    -v | --vers*) echo "$version"; exit 0;;
+    -V | --verb*) verbose=echo;;
+    --) # What remains are not options.
+      shift
+      while test x"$1" != x"$arg_sep"; do
+        set dummy ${1+"$@"} "$1"; shift
+        shift
+      done
+      break;;
+    -*)
+      echo "$0: Unknown or ambiguous option \`$1'." >&2
+      echo "$0: Try \`--help' for more information." >&2
+      exit 1;;
+    *) set dummy ${1+"$@"} "$1"; shift;;
+   esac
+   shift
+done
+# Pop the token
+shift
+
+# Interpret remaining command line args as filenames.
+case $# in
+ 0)
+  echo "$0: Missing file arguments." >&2
+  echo "$0: Try \`--help' for more information." >&2
+  exit 2
+  ;;
+ 1) ;;
+ *)
+  if test -n "$oname"; then
+    echo "$0: Can't use option \`--output' with more than one argument." >&2
+    exit 2
+  fi
+  ;;
+esac
+
+# Prepare the temporary directory.  Remove it at exit, unless debugging.
+if test -z "$debug"; then
+  trap "cd / && rm -rf $tmpdir" 0 1 2 15
+fi
+
+# Create the temporary directory with strict rights
+(umask 077 && mkdir $tmpdir) || exit 1
+
+# Prepare the tools we might need.  This may be extra work in some
+# cases, but improves the readibility of the script.
+utildir=$tmpdir/utils
+mkdir $utildir || exit 1
+
+# A sed script that preprocesses Texinfo sources in order to keep the
+# iftex sections only.  We want to remove non TeX sections, and
+# comment (with `@c texi2dvi') TeX sections so that makeinfo does not
+# try to parse them.  Nevertheless, while commenting TeX sections,
+# don't comment @macro/@end macro so that makeinfo does propagate
+# them.  Unfortunately makeinfo --iftex --no-ifhtml --no-ifinfo
+# doesn't work well enough (yet) to use that, so work around with sed.
+comment_iftex_sed=$utildir/comment.sed
+cat <<EOF >$comment_iftex_sed
+/^@tex/,/^@end tex/{
+  s/^/@c texi2dvi/
+}
+/^@iftex/,/^@end iftex/{
+  s/^/@c texi2dvi/
+  /^@c texi2dvi@macro/,/^@c texi2dvi@end macro/{
+    s/^@c texi2dvi//
+  }
+}
+/^@html/,/^@end html/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifhtml/,/^@end ifhtml/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifnottex/,/^@end ifnottex/{
+  s/^/@c (texi2dvi)/
+}
+/^@ifinfo/,/^@end ifinfo/{
+  /^@node/p
+  /^@menu/,/^@end menu/p
+  t
+  s/^/@c (texi2dvi)/
+}
+s/^@ifnotinfo/@c texi2dvi@ifnotinfo/
+s/^@end ifnotinfo/@c texi2dvi@end ifnotinfo/
+EOF
+# Uncommenting is simple: Remove any leading `@c texi2dvi'.
+uncomment_iftex_sed=$utildir/uncomment.sed
+cat <<EOF >$uncomment_iftex_sed
+s/^@c texi2dvi//
+EOF
+
+# A shell script that computes the list of xref files.
+# Takes the filename (without extension) of which we look for xref
+# files as argument.  The index files must be reported last.
+get_xref_files=$utildir/get_xref.sh
+cat <<\EOF >$get_xref_files
+#! /bin/sh
+
+# Get list of xref files (indexes, tables and lists).
+# Find all files having root filename with a two-letter extension,
+# saves the ones that are really Texinfo-related files.  .?o? catches
+# many files: .toc, .log, LaTeX tables and lists, FiXme's .lox, maybe more.
+for this_file in "$1".?o? "$1".aux "$1".?? "$1".idx; do
+  # If file is empty, skip it.
+  test -s "$this_file" || continue
+  # If the file is not suitable to be an index or xref file, don't
+  # process it.  The file can't be if its first character is not a
+  # backslash or single quote.
+  first_character=`sed -n '1s/^\(.\).*$/\1/p;q' $this_file`
+  if test "x$first_character" = "x\\" \
+     || test "x$first_character" = "x'"; then
+    xref_files="$xref_files ./$this_file"
+  fi
+done
+echo "$xref_files"
+EOF
+chmod 500 $get_xref_files
+
+# File descriptor usage:
+# 0 standard input
+# 1 standard output (--verbose messages)
+# 2 standard error
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 5 tools output (turned off by --quiet)
+
+# Tools' output.  If quiet, discard, else redirect to the message flow.
+if test "$quiet" = t; then
+  exec 5>/dev/null
+else
+  exec 5>&1
+fi
+
+# Enable tracing
+test "$debug" = t && set -x
+
+# \f
+# TeXify files.
+
+for command_line_filename in ${1+"$@"}; do
+  $verbose "Processing $command_line_filename ..."
+
+  # If the COMMAND_LINE_FILENAME is not absolute (e.g., --debug.tex),
+  # prepend `./' in order to avoid that the tools take it as an option.
+  echo "$command_line_filename" | $EGREP '^(/|[A-z]:/)' >/dev/null \
+  || command_line_filename="./$command_line_filename"
+
+  # See if the file exists.  If it doesn't we're in trouble since, even
+  # though the user may be able to reenter a valid filename at the tex
+  # prompt (assuming they're attending the terminal), this script won't
+  # be able to find the right xref files and so forth.
+  if test ! -r "$command_line_filename"; then
+    echo "$0: Could not read $command_line_filename, skipping." >&2
+    continue
+  fi
+
+  # Get the name of the current directory.  We want the full path
+  # because in clean mode we are in tmp, in which case a relative
+  # path has no meaning.
+  filename_dir=`echo $command_line_filename | sed 's!/[^/]*$!!;s!^$!.!'`
+  filename_dir=`cd "$filename_dir" >/dev/null && pwd`
+
+  # Strip directory part but leave extension.
+  filename_ext=`basename "$command_line_filename"`
+  # Strip extension.
+  filename_noext=`echo "$filename_ext" | sed 's/\.[^.]*$//'`
+  ext=`echo "$filename_ext" | sed 's/^.*\.//'`
+
+  # _src.  Use same basename since we want to generate aux files with
+  # the same basename as the manual.  If --expand, then output the
+  # macro-expanded file to here, else copy the original file.
+  tmpdir_src=$tmpdir/src
+  filename_src=$tmpdir_src/$filename_noext.$ext
+
+  # _xtr.  The file with the user's extra commands.
+  tmpdir_xtr=$tmpdir/xtr
+  filename_xtr=$tmpdir_xtr/$filename_noext.$ext
+
+  # _bak.  Copies of the previous xref files (another round is run if
+  # they differ from the new one).
+  tmpdir_bak=$tmpdir/bak
+
+  # Make all those directories and give up if we can't succeed.
+  mkdir $tmpdir_src $tmpdir_xtr $tmpdir_bak || exit 1
+
+  # Source file might include additional sources.
+  # We want `.:$orig_pwd' before anything else.  (We'll add `.:' later
+  # after all other directories have been turned into absolute paths.)
+  # `.' goes first to ensure that any old .aux, .cps,
+  # etc. files in ${directory} don't get used in preference to fresher
+  # files in `.'.  Include orig_pwd in case we are in clean mode, where
+  # we've cd'd to a temp directory.
+  common="$orig_pwd$path_sep$filename_dir$path_sep$txincludes"
+   TEXINPUTS="$common$TEXINPUTS_orig"
+  INDEXSTYLE="$common$INDEXSTYLE_orig"
+
+  # Convert relative paths to absolute paths, so we can run in another
+  # directory (e.g., in --clean mode, or during the macro-support
+  # detection.)
+  #
+  # Empty path components are meaningful to tex.  We rewrite them
+  # as `EMPTY' so they don't get lost when we split on $path_sep.
+   TEXINPUTS=`echo $TEXINPUTS  |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
+  INDEXSTYLE=`echo $INDEXSTYLE |sed 's/^:/EMPTY:/;s/:$/:EMPTY/;s/::/:EMPTY:/g'`
+  save_IFS=$IFS
+  IFS=$path_sep
+  set x $TEXINPUTS; shift
+  TEXINPUTS=.
+  for dir
+  do
+    case $dir in
+      EMPTY)
+        TEXINPUTS=$TEXINPUTS$path_sep
+        ;;
+      [\\/]* | ?:[\\/]*)        # Absolute paths don't need to be expansed.
+        TEXINPUTS=$TEXINPUTS$path_sep$dir
+        ;;
+      *)
+        abs=`cd "$dir" && pwd` && TEXINPUTS=$TEXINPUTS$path_sep$abs
+        ;;
+    esac
+  done
+  set x $INDEXSTYLE; shift
+  INDEXSTYLE=.
+  for dir
+  do
+    case $dir in
+      EMPTY)
+        INDEXSTYLE=$INDEXSTYLE$path_sep
+        ;;
+      [\\/]* | ?:[\\/]*)        # Absolute paths don't need to be expansed.
+        INDEXSTYLE=$INDEXSTYLE$path_sep$dir
+        ;;
+      *)
+        abs=`cd "$dir" && pwd` && INDEXSTYLE=$INDEXSTYLE$path_sep$abs
+        ;;
+    esac
+  done
+  IFS=$save_IFS
+
+  # If the user explicitly specified the language, use that.
+  # Otherwise, if the first line is \input texinfo, assume it's texinfo.
+  # Otherwise, guess from the file extension.
+  if test -n "$set_language"; then
+    language=$set_language
+  elif sed 1q "$command_line_filename" | grep 'input texinfo' >/dev/null; then
+    language=texinfo
+  else
+    language=
+  fi
+
+  # Get the type of the file (latex or texinfo) from the given language
+  # we just guessed, or from the file extension if not set yet.
+  case ${language:-$filename_ext} in
+    [lL]a[tT]e[xX] | *.ltx | *.tex)
+      # Assume a LaTeX file.  LaTeX needs bibtex and uses latex for
+      # compilation.  No makeinfo.
+      bibtex=${BIBTEX:-bibtex}
+      makeinfo= # no point in running makeinfo on latex source.
+      texindex=${MAKEINDEX:-makeindex}
+      if test $oformat = dvi; then
+        tex=${LATEX:-latex}
+      else
+        tex=${PDFLATEX:-pdflatex}
+      fi
+      ;;
+
+    *)
+      # Assume a Texinfo file.  Texinfo files need makeinfo, texindex and tex.
+      bibtex=
+      texindex=${TEXINDEX:-texindex}
+      if test $oformat = dvi; then
+        tex=${TEX:-tex}
+      else
+        tex=${PDFTEX:-pdftex}
+      fi
+      # Unless required by the user, makeinfo expansion is wanted only
+      # if texinfo.tex is too old.
+      if test "$expand" = t; then
+        makeinfo=${MAKEINFO:-makeinfo}
+      else
+        # Check if texinfo.tex performs macro expansion by looking for
+        # its version.  The version is a date of the form YEAR-MO-DA.
+        # We don't need to use [0-9] to match the digits since anyway
+        # the comparison with $txiprereq, a number, will fail with non
+        # digits.
+        txiversion_tex=txiversion.tex
+        echo '\input texinfo.tex @bye' >$tmpdir/$txiversion_tex
+        # Run in the tmpdir to avoid leaving files.
+        eval `cd $tmpdir >/dev/null &&
+              $tex $txiversion_tex 2>/dev/null |
+              sed -n 's/^.*\[\(.*\)version \(....\)-\(..\)-\(..\).*$/txiformat=\1 txiversion="\2\3\4"/p'`
+        $verbose "texinfo.tex preloaded as \`$txiformat', version is \`$txiversion' ..."
+        if test "$txiprereq" -le "$txiversion" >/dev/null 2>&1; then
+          makeinfo=
+        else
+          makeinfo=${MAKEINFO:-makeinfo}
+        fi
+        # As long as we had to run TeX, offer the user this convenience
+        if test "$txiformat" = Texinfo; then
+          escape=@
+        fi
+      fi
+      ;;
+  esac
+
+  # Expand macro commands in the original source file using Makeinfo.
+  # Always use `end' footnote style, since the `separate' style
+  #   generates different output (arguably this is a bug in -E).
+  # Discard main info output, the user asked to run TeX, not makeinfo.
+  if test -n "$makeinfo"; then
+    $verbose "Macro-expanding $command_line_filename to $filename_src ..."
+    sed -f $comment_iftex_sed "$command_line_filename" \
+      | $makeinfo --footnote-style=end -I "$filename_dir" $miincludes \
+        -o /dev/null --macro-expand=- \
+      | sed -f $uncomment_iftex_sed >"$filename_src"
+    filename_input=$filename_src
+  fi
+
+  # If makeinfo failed (or was not even run), use the original file as input.
+  if test $? -ne 0 \
+     || test ! -r "$filename_src"; then
+    $verbose "Reverting to $command_line_filename ..."
+    filename_input=$filename_dir/$filename_ext
+  fi
+
+  # Used most commonly for @finalout, @smallbook, etc.
+  if test -n "$textra"; then
+    $verbose "Inserting extra commands: $textra"
+    sed '/^@setfilename/a\
+'"$textra" "$filename_input" >$filename_xtr
+    filename_input=$filename_xtr
+  fi
+
+  # If clean mode was specified, then move to the temporary directory.
+  if test "$clean" = t; then
+    $verbose "cd $tmpdir_src"
+    cd "$tmpdir_src" || exit 1
+  fi
+
+  while :; do # will break out of loop below
+    orig_xref_files=`$get_xref_files "$filename_noext"`
+
+    # Save copies of originals for later comparison.
+    if test -n "$orig_xref_files"; then
+      $verbose "Backing up xref files: `echo $orig_xref_files | sed 's|\./||g'`"
+      cp $orig_xref_files $tmpdir_bak
+    fi
+
+    # Run bibtex on current file.
+    # - If its input (AUX) exists.
+    # - If AUX contains both `\bibdata' and `\bibstyle'.
+    # - If some citations are missing (LOG contains `Citation').
+    #   or the LOG complains of a missing .bbl
+    #
+    # We run bibtex first, because I can see reasons for the indexes
+    # to change after bibtex is run, but I see no reason for the
+    # converse.
+    #
+    # Don't try to be too smart.  Running bibtex only if the bbl file
+    # exists and is older than the LaTeX file is wrong, since the
+    # document might include files that have changed.  Because there
+    # can be several AUX (if there are \include's), but a single LOG,
+    # looking for missing citations in LOG is easier, though we take
+    # the risk to match false messages.
+    if test -n "$bibtex" \
+       && test -r "$filename_noext.aux" \
+       && test -r "$filename_noext.log" \
+       && (grep '^\\bibdata[{]'  "$filename_noext.aux" \
+           && grep '^\\bibstyle[{]' "$filename_noext.aux" \
+           && (grep 'Warning:.*Citation.*undefined' "$filename_noext.log" \
+               || grep 'No file .*\.bbl\.' "$filename_noext.log")) \
+          >/dev/null 2>&1; \
+    then
+      $verbose "Running $bibtex $filename_noext ..."
+      if $bibtex "$filename_noext" >&5; then :; else
+        echo "$0: $bibtex exited with bad status, quitting." >&2
+        exit 1
+      fi
+    fi
+
+    # What we'll run texindex on -- exclude non-index files.
+    # Since we know index files are last, it is correct to remove everything
+    # before .aux and .?o?.  But don't really do <anything>o<anything>
+    # -- don't match whitespace as <anything>.
+    # Otherwise, if orig_xref_files contains something like
+    #   foo.xo foo.whatever
+    # the space after the o will get matched.
+    index_files=`echo "$orig_xref_files" \
+                 | sed "s!.*\.aux!!g;
+                        s!./$filename_noext\.[^ ]o[^ ]!!g;
+                        s/^[ ]*//;s/[ ]*$//"`
+    # Run texindex (or makeindex) on current index files.  If they
+    # already exist, and after running TeX a first time the index
+    # files don't change, then there's no reason to run TeX again.
+    # But we won't know that if the index files are out of date or
+    # nonexistent.
+    if test -n "$texindex" && test -n "$index_files"; then
+      $verbose "Running $texindex $index_files ..."
+      if $texindex $index_files 2>&5 1>&2; then :; else
+         echo "$0: $texindex exited with bad status, quitting." >&2
+         exit 1
+      fi
+    fi
+
+    # Finally, run TeX.
+    # Prevent $ESCAPE from being interpreted by the shell if it happens
+    # to be `/'.
+    $batch tex_args="\\${escape}nonstopmode\ \\${escape}input"
+    cmd="$tex $tex_args $filename_input"
+    $verbose "Running $cmd ..."
+    if $cmd >&5; then :; else
+      echo "$0: $tex exited with bad status, quitting." >&2
+      echo "$0: see $filename_noext.log for errors." >&2
+      test "$clean" = t \
+        && cp "$filename_noext.log" "$orig_pwd"
+      exit 1
+    fi
+
+
+    # Decide if looping again is needed.
+    finished=t
+
+    # LaTeX (and the package changebar) report in the LOG file if it
+    # should be rerun.  This is needed for files included from
+    # subdirs, since texi2dvi does not try to compare xref files in
+    # subdirs.  Performing xref files test is still good since LaTeX
+    # does not report changes in xref files.
+    if grep "Rerun to get" "$filename_noext.log" >/dev/null 2>&1; then
+      finished=
+    fi
+
+    # Check if xref files changed.
+    new_xref_files=`$get_xref_files "$filename_noext"`
+    $verbose "Original xref files = `echo $orig_xref_files | sed 's|\./||g'`"
+    $verbose "New xref files      = `echo $new_xref_files | sed 's|\./||g'`"
+
+    # If old and new lists don't at least have the same file list,
+    # then one file or another has definitely changed.
+    test "x$orig_xref_files" != "x$new_xref_files" && finished=
+
+    # File list is the same.  We must compare each file until we find
+    # a difference.
+    if test -n "$finished"; then
+      for this_file in $new_xref_files; do
+        $verbose "Comparing xref file `echo $this_file | sed 's|\./||g'` ..."
+        # cmp -s returns nonzero exit status if files differ.
+        if cmp -s "$this_file" "$tmpdir_bak/$this_file"; then :; else
+          # We only need to keep comparing until we find one that
+          # differs, because we'll have to run texindex & tex again no
+          # matter how many more there might be.
+          finished=
+          $verbose "xref file `echo $this_file | sed 's|\./||g'` differed ..."
+          test "$debug" = t && diff -c "$tmpdir_bak/$this_file" "$this_file"
+          break
+        fi
+      done
+    fi
+
+    # If finished, exit the loop, else rerun the loop.
+    test -n "$finished" && break
+  done
+
+  # If we were in clean mode, compilation was in a tmp directory.
+  # Copy the DVI (or PDF) file into the directory where the compilation
+  # has been done.  (The temp dir is about to get removed anyway.)
+  # We also return to the original directory so that
+  # - the next file is processed in correct conditions
+  # - the temporary file can be removed
+  if test -n "$clean"; then
+    if test -n "$oname"; then
+       dest=$oname
+    else
+       dest=$orig_pwd
+    fi
+    $verbose "Copying $oformat file from `pwd` to $dest"
+    cp -p "./$filename_noext.$oformat" "$dest"
+    cd / # in case $orig_pwd is on a different drive (for DOS)
+    cd $orig_pwd || exit 1
+  fi
+
+  # Remove temporary files.
+  if test "x$debug" = "x"; then
+    $verbose "Removing $tmpdir_src $tmpdir_xtr $tmpdir_bak ..."
+    cd /
+    rm -rf $tmpdir_src $tmpdir_xtr $tmpdir_bak
+  fi
+done
+
+$verbose "$0 done."
+exit 0 # exit successfully, not however we ended the loop.
diff --git a/support/texi2html-1.64 b/support/texi2html-1.64
new file mode 100755 (executable)
index 0000000..bdb3bee
--- /dev/null
@@ -0,0 +1,5429 @@
+#! /usr/bin/perl
+'di ';
+'ig 00 ';
+#+##############################################################################
+#
+# texi2html: Program to transform Texinfo documents to HTML
+#
+#    Copyright (C) 1999, 2000  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 of the License, 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-1307  USA
+# 
+#-##############################################################################
+
+# This requires perl version 5 or higher
+require 5.0;
+
+#++##############################################################################
+#
+# NOTE FOR DEBUGGING THIS SCRIPT:
+# You can run 'perl texi2html.pl' directly, provided you have
+# the environment variable T2H_HOME set to the directory containing
+# the texi2html.init file
+#
+#--##############################################################################
+
+# CVS version:
+# $Id: texi2html.pl,v 1.55 2000/07/27 14:39:41 obachman Exp $
+
+# Homepage:
+$T2H_HOMEPAGE = <<EOT;
+http://www.mathematik.uni-kl.de/~obachman/Texi2html
+EOT
+
+# Authors:  
+$T2H_AUTHORS = <<EOT;
+Written by: Lionel Cons <Lionel.Cons\@cern.ch> (original author)
+            Karl Berry  <karl\@freefriends.org>
+            Olaf Bachmann <obachman\@mathematik.uni-kl.de>
+            and many others.
+Maintained by: Olaf Bachmann <obachman\@mathematik.uni-kl.de>
+Send bugs and suggestions to <texi2html\@mathematik.uni-kl.de>
+EOT
+
+# Version: set in configure.in
+$THISVERSION = '1.64';
+$THISPROG = "texi2html $THISVERSION";  # program name and version
+  
+# The man page for this program is included at the end of this file and can be
+# viewed using the command 'nroff -man texi2html'.
+
+# Identity:
+
+$T2H_TODAY = &pretty_date;             # like "20 September 1993"
+# the eval prevents this from breaking on system which do not have
+# a proper getpwuid implemented
+eval { ($T2H_USER = (getpwuid ($<))[6]) =~ s/,.*//;}; # Who am i
+
+#+++############################################################################
+#                                                                              #
+# Initialization                                                               #
+# Pasted content of File $(srcdir)/texi2html.init: Default initializations     # 
+#                                                                              #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
+# exists.
+
+# 
+# -*-perl-*-
+######################################################################
+# File: texi2html.init
+#
+# Sets default values for command-line arguments and for various customizable
+# procedures
+#
+# A copy of this file is pasted into the beginning of texi2html by
+# 'make texi2html'
+#
+# Copy this file and make changes to it, if you like.
+# Afterwards, either, load it with command-line option -init_file <your_init_file>
+#
+# $Id: texi2html.init,v 1.34 2000/07/27 14:09:02 obachman Exp $
+
+######################################################################
+# stuff which can also be set by command-line options
+#
+#
+# Note: values set here, overwrite values set by the command-line
+# options before -init_file and might still be overwritten by
+# command-line arguments following the -init_file option
+#
+
+# T2H_OPTIONS is a hash whose keys are the (long) names of valid
+# command-line options and whose values are a hash with the following keys:
+# type    ==> one of !|=i|:i|=s|:s (see GetOpt::Long for more info)
+# linkage ==> ref to scalar, array, or subroutine (see GetOpt::Long for more info)
+# verbose ==> short description of option (displayed by -h)
+# noHelp  ==> if 1 -> for "not so important options": only print description on -h 1
+#                2 -> for obsolete options: only print description on -h 2
+
+$T2H_DEBUG = 0;
+$T2H_OPTIONS -> {debug} =
+{
+ type => '=i',
+ linkage => \$main::T2H_DEBUG,
+ verbose => 'output HTML with debuging information',
+};
+
+$T2H_DOCTYPE = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'; 
+$T2H_OPTIONS -> {doctype} = 
+{
+ type => '=s',
+ linkage => \$main::T2H_DOCTYPE,
+ verbose => 'document type which is output in header of HTML files',
+ noHelp => 1
+};
+
+$T2H_CHECK = 0;
+$T2H_OPTIONS -> {check} =
+{
+ type => '!',
+ linkage => \$main::T2H_CHECK,
+ verbose => 'if set, only check files and output all things that may be Texinfo commands',
+ noHelp => 1
+};
+
+# -expand
+# if set to "tex" (or, "info") expand @iftex and @tex (or, @ifinfo) sections
+# else, neither expand @iftex, @tex, nor @ifinfo sections
+$T2H_EXPAND = "info";
+$T2H_OPTIONS -> {expand} = 
+{
+ type => '=s',
+ linkage => \$T2H_EXPAND,
+ verbose => 'Expand info|tex|none section of texinfo source',
+};
+
+# - glossary
+#if set, uses section named `Footnotes' for glossary
+$T2H_USE_GLOSSARY = 0;
+T2H_OPTIONS -> {glossary} =
+{
+ type => '!',
+ linkage => \$T2H_USE_GLOSSARY,
+ verbose => "if set, uses section named `Footnotes' for glossary",
+ noHelp  => 1,
+};
+
+
+# -invisible
+# $T2H_INVISIBLE_MARK is the text used to create invisible destination
+# anchors for index links (you can for instance use the invisible.xbm
+# file shipped with this program). This is a workaround for a known
+# bug of many WWW browsers, including netscape.
+# For me, it works fine without it -- on the contrary: if there, it
+# inserts space between headers and start of text (obachman 3/99)
+$T2H_INVISIBLE_MARK = '';
+# $T2H_INVISIBLE_MARK = '&#160;';
+$T2H_OPTIONS -> {invisible} =
+{
+ type => '=s',
+ linkage => \$T2H_INVISIBLE_MARK,
+ verbose => 'use text in invisble anchot',
+ noHelp  => 1,
+};
+
+# -iso
+# if set, ISO8879 characters are used for special symbols (like copyright, etc)
+$T2H_USE_ISO = 0;
+$T2H_OPTIONS -> {iso} =
+{
+ type => 'iso',
+ linkage => \$T2H_USE_ISO,
+ verbose => 'if set, ISO8879 characters are used for special symbols (like copyright, etc)',
+ noHelp => 1,
+};
+
+# -I
+# list directories where @include files are searched for (besides the
+# directory of the doc file) additional '-I' args add to this list
+@T2H_INCLUDE_DIRS = (".");
+$T2H_OPTIONS -> {I} =
+{
+ type => '=s',
+ linkage => \@T2H_INCLUDE_DIRS,
+ verbose => 'append $s to the @include search path',
+};
+
+# -top_file
+# uses file of this name for top-level file
+# extension is manipulated appropriately, if necessary.
+# If empty, <basename of document>.html is used
+# Typically, you would set this to "index.html".
+$T2H_TOP_FILE = '';
+$T2H_OPTIONS -> {top_file} =
+{
+ type => '=s',
+ linkage => \$T2H_TOP_FILE,
+ verbose => 'use $s as top file, instead of <docname>.html',
+};
+
+
+# -toc_file
+# uses file of this name for table of contents file
+# extension is manipulated appropriately, if necessary.
+# If empty, <basename of document>_toc.html is used
+$T2H_TOC_FILE = '';
+$T2H_OPTIONS -> {toc_file} =
+{
+ type => '=s',
+ linkage => \$T2H_TOC_FILE,
+ verbose => 'use $s as ToC file, instead of <docname>_toc.html',
+};
+
+# -frames
+# if set, output two additional files which use HTML 4.0 "frames".
+$T2H_FRAMES = 0;
+$T2H_OPTIONS -> {frames} =
+{
+ type => '!',
+ linkage => \$T2H_FRAMES,
+ verbose => 'output files which use HTML 4.0 frames (experimental)',
+ noHelp => 1,
+};
+
+
+# -menu | -nomenu
+# if set, show the Texinfo menus
+$T2H_SHOW_MENU = 1;
+$T2H_OPTIONS -> {menu} =
+{
+ type => '!',
+ linkage => \$T2H_SHOW_MENU,
+ verbose => 'ouput Texinfo menus',
+};
+
+# -number | -nonumber
+# if set, number sections and show section names and numbers in references 
+# and menus
+$T2H_NUMBER_SECTIONS = 1;
+$T2H_OPTIONS -> {number} =
+{
+ type => '!',
+ linkage => \$T2H_NUMBER_SECTIONS,
+ verbose => 'use numbered sections'
+};
+
+# if set, and T2H_NUMBER_SECTIONS is set, then use node names in menu
+# entries, instead of section names
+$T2H_NODE_NAME_IN_MENU = 0;
+
+# if set and menu entry equals menu descr, then do not print menu descr.
+# Likewise, if node name equals entry name, do not print entry name.
+$T2H_AVOID_MENU_REDUNDANCY = 1;
+
+# -split section|chapter|none 
+# if set to 'section' (resp. 'chapter') create one html file per (sub)section
+# (resp. chapter) and separate pages for Top, ToC, Overview, Index,
+# Glossary, About.
+# otherwise, create monolithic html file which contains whole document
+#$T2H_SPLIT = 'section';
+$T2H_SPLIT = '';
+$T2H_OPTIONS -> {split} =
+{
+ type => '=s',
+ linkage => \$T2H_SPLIT,
+ verbose => 'split document on section|chapter else no splitting',
+};
+
+# -section_navigation|-no-section_navigation
+# if set, then navigation panels are printed at the beginning of each section
+# and, possibly at the end (depending on whether or not there were more than 
+# $T2H_WORDS_IN_PAGE  words on page
+# This is most useful if you do not want to have section navigation 
+# on -split chapter
+$T2H_SECTION_NAVIGATION = 1;
+$T2H_OPTIONS -> {sec_nav} =
+{
+ type => '!',
+ linkage => \$T2H_SECTION_NAVIGATION,
+ verbose => 'output navigation panels for each section',
+};
+
+# -subdir
+# if set put result files in this directory
+# if not set result files are put into current directory
+#$T2H_SUBDIR = 'html';
+$T2H_SUBDIR = '';
+$T2H_OPTIONS -> {subdir} =
+{
+ type => '=s',
+ linkage => \$T2H_SUBDIR,
+ verbose => 'put HTML files in directory $s, instead of $cwd',
+};
+
+# -short_extn
+# If this is set all HTML file will have extension ".htm" instead of
+# ".html". This is helpful when shipping the document to PC systems.
+$T2H_SHORTEXTN = 0;
+$T2H_OPTIONS -> {short_ext} =
+{
+ type => '!',
+ linkage => \$T2H_SHORTEXTN,
+ verbose => 'use "htm" extension for output HTML files',
+};
+
+
+# -prefix
+# Set the output file prefix, prepended to all .html, .gif and .pl files.
+# By default, this is the basename of the document
+$T2H_PREFIX = '';
+$T2H_OPTIONS -> {prefix} =
+{
+ type => '=s',
+ linkage => \$T2H_PREFIX,
+ verbose => 'use as prefix for output files, instead of <docname>',
+};
+
+# -o filename
+# If set, generate monolithic document output html into $filename
+$T2H_OUT = '';
+$T2H_OPTIONS -> {out_file} =
+{
+ type => '=s',
+ linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';},
+ verbose => 'if set, all HTML output goes into file $s',
+};
+
+# -short_ref
+#if set cross-references are given without section numbers
+$T2H_SHORT_REF = '';
+$T2H_OPTIONS -> {short_ref} =
+{
+ type => '!',
+ linkage => \$T2H_SHORT_REF,
+ verbose => 'if set, references are without section numbers',
+};
+
+# -idx_sum
+# if value is set, then for each @prinindex $what
+# $docu_name_$what.idx is created which contains lines of the form
+# $key\t$ref sorted alphabetically (case matters)
+$T2H_IDX_SUMMARY = 0;
+$T2H_OPTIONS -> {idx_sum} =
+{
+ type => '!',
+ linkage => \$T2H_IDX_SUMMARY,
+ verbose => 'if set, also output index summary',
+ noHelp  => 1,
+};
+
+# -verbose
+# if set, chatter about what we are doing
+$T2H_VERBOSE = '';
+$T2H_OPTIONS -> {Verbose} =
+{
+ type => '!',
+ linkage => \$T2H_VERBOSE,
+ verbose => 'print progress info to stdout',
+};
+
+# -lang
+# For page titles use $T2H_WORDS->{$T2H_LANG}->{...} as title.
+# To add a new language, supply list of titles (see $T2H_WORDS below).
+# and use ISO 639 language codes (see e.g. perl module Locale-Codes-1.02 
+# for  definitions)
+# Default's to 'en' if not set or no @documentlanguage is specified
+$T2H_LANG = '';
+$T2H_OPTIONS -> {lang} =
+{
+ type => '=s',
+ linkage => sub {SetDocumentLanguage($_[1])},
+ verbose => 'use $s as document language (ISO 639 encoding)',
+};
+
+# -l2h
+# if set, uses latex2html for generation of math content 
+$T2H_L2H = '';
+$T2H_OPTIONS -> {l2h} =
+{
+ type => '!',
+ linkage => \$T2H_L2H,
+ verbose => 'if set, uses latex2html for @math and @tex',
+};
+
+######################
+# The following options are only relevant if $T2H_L2H is set
+#
+# -l2h_l2h
+# name/location of latex2html progam
+$T2H_L2H_L2H = "latex2html";
+$T2H_OPTIONS -> {l2h_l2h} =
+{
+ type => '=s',
+ linkage => \$T2H_L2H_L2H,
+ verbose => 'program to use for latex2html translation',
+ noHelp => 1,
+};
+
+# -l2h_skip
+# if set, skips actual call to latex2html tries to reuse previously generated 
+# content, instead
+$T2H_L2H_SKIP = '';
+$T2H_OPTIONS -> {l2h_skip} =
+{
+ type => '!',
+ linkage => \$T2H_L2H_SKIP,
+ verbose => 'if set, tries to reuse previously latex2html output',
+ noHelp => 1,
+};
+
+# -l2h_tmp
+# if set, l2h uses this directory for temporarary files. The path
+# leading to this directory may not contain a dot (i.e., a "."),
+# otherwise, l2h will fail
+$T2H_L2H_TMP = '';
+$T2H_OPTIONS -> {l2h_tmp} =
+{
+ type => '=s',
+ linkage => \$T2H_L2H_TMP,
+ verbose => 'if set, uses $s as temporary latex2html directory',
+ noHelp => 1,
+};
+
+# if set, cleans intermediate files (they all have the prefix $doc_l2h_) 
+# of l2h 
+$T2H_L2H_CLEAN = 1;
+$T2H_OPTIONS -> {l2h_clean} =
+{
+ type => '!',
+ linkage => \$T2H_L2H_CLEAN,
+ verbose => 'if set, do not keep intermediate latex2html files for later reuse',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {D} =
+{
+ type => '=s',
+ linkage => sub {$main::value{@_[1]} = 1;},
+ verbose => 'equivalent to Texinfo "@set $s 1"',
+ noHelp => 1,
+};
+
+$T2H_OPTIONS -> {init_file} =
+{
+ type => '=s',
+ linkage => \&LoadInitFile,
+ verbose => 'load init file $s'
+};
+
+
+##############################################################################
+#
+# The following can only be set in the init file
+#
+##############################################################################
+
+# if set, center @image by default
+# otherwise, do not center by default
+$T2H_CENTER_IMAGE = 1;
+
+# used as identation for block enclosing command @example, etc
+# If not empty, must be enclosed in <td></td>
+$T2H_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
+# same as above, only for @small
+$T2H_SMALL_EXAMPLE_INDENT_CELL = '<td>&nbsp;</td>';
+# font size for @small
+$T2H_SMALL_FONT_SIZE = '-1';
+
+# if non-empty, and no @..heading appeared in Top node, then
+# use this as header for top node/section, otherwise use value of 
+# @settitle or @shorttitle (in that order)
+$T2H_TOP_HEADING = '';
+
+# if set, use this chapter for 'Index' button, else
+# use first chapter whose name matches 'index' (case insensitive)
+$T2H_INDEX_CHAPTER = '';
+
+# if set and $T2H_SPLIT is set, then split index pages at the next letter
+# after they have more than that many entries
+$T2H_SPLIT_INDEX = 100;
+
+# if set (e.g., to index.html) replace hrefs to this file 
+# (i.e., to index.html) by ./
+$T2H_HREF_DIR_INSTEAD_FILE = '';
+
+########################################################################
+# Language dependencies: 
+# To add a new language extend T2H_WORDS hash and create $T2H_<...>_WORDS hash
+# To redefine one word, simply do:
+# $T2H_WORDS->{<language>}->{<word>} = 'whatever' in your personal init file.
+#
+$T2H_WORDS_EN =
+{
+ # titles  of pages
+ 'ToC_Title' => 'Table of Contents',
+ 'Overview_Title' => 'Short Table of Contents',
+ 'Index_Title' => 'Index',
+ 'About_Title' => 'About this document',
+ 'Footnotes_Title' => 'Footnotes',
+ 'See' => 'See',
+ 'see' => 'see',
+ 'section' => 'section',
+# If necessary, we could extend this as follows: 
+#  # text for buttons
+#  'Top_Button' => 'Top',
+#  'ToC_Button' => 'Contents',
+#  'Overview_Button' => 'Overview',
+#  'Index_button' => 'Index',
+#  'Back_Button' => 'Back',
+#  'FastBack_Button' => 'FastBack',
+#  'Prev_Button' => 'Prev',
+#  'Up_Button' => 'Up',
+#  'Next_Button' => 'Next',
+#  'Forward_Button' =>'Forward',
+#  'FastWorward_Button' => 'FastForward',
+#  'First_Button' => 'First',
+#  'Last_Button' => 'Last',
+#  'About_Button' => 'About'
+};
+
+$T2H_WORD_DE =
+{
+ 'ToC_Title' => 'Inhaltsverzeichniss',
+ 'Overview_Title' => 'Kurzes Inhaltsverzeichniss',
+ 'Index_Title' => 'Index',
+ 'About_Title' => '&Uuml;ber dieses Dokument',
+ 'Footnotes_Title' => 'Fu&szlig;noten',
+ 'See' => 'Siehe',
+ 'see' => 'siehe',
+ 'section' => 'Abschnitt',
+};
+
+$T2H_WORD_NL =
+{
+ 'ToC_Title' => 'Inhoudsopgave',
+ 'Overview_Title' => 'Korte inhoudsopgave',
+ 'Index_Title' => 'Index', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!', #No translation available!
+ 'See' => 'Zie',
+ 'see' => 'zie',
+ 'section' => 'sectie',
+};
+
+$T2H_WORD_ES =
+{
+ 'ToC_Title' => '&iacute;ndice General',
+ 'Overview_Title' => 'Resumen del Contenido',
+ 'Index_Title' => 'Index', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'Fu&szlig;noten',
+ 'See' => 'V&eacute;ase',
+ 'see' => 'v&eacute;ase',
+ 'section' => 'secci&oacute;n',
+};
+
+$T2H_WORD_NO =
+{
+ 'ToC_Title' => 'Innholdsfortegnelse',
+ 'Overview_Title' => 'Kort innholdsfortegnelse',
+ 'Index_Title' => 'Indeks', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!',
+ 'See' => 'Se',
+ 'see' => 'se',
+ 'section' => 'avsnitt',
+};
+
+$T2H_WORD_PT =
+{
+ 'ToC_Title' => 'Sum&aacute;rio',
+ 'Overview_Title' => 'Breve Sum&aacute;rio',
+ 'Index_Title' => '&Iacute;ndice', #Not sure ;-)
+ 'About_Title' => 'No translation available!', #No translation available!
+ 'Footnotes_Title' => 'No translation available!',
+ 'See' => 'Veja',
+ 'see' => 'veja',
+ 'section' => 'Se&ccedil;&atilde;o',
+};
+
+$T2H_WORDS =
+{
+ 'en' => $T2H_WORDS_EN,
+ 'de' => $T2H_WORDS_DE,
+ 'nl' => $T2H_WORDS_NL,
+ 'es' => $T2H_WORDS_ES,
+ 'no' => $T2H_WORDS_NO,
+ 'pt' => $T2H_WORDS_PT
+};
+
+@MONTH_NAMES_EN =
+(
+ 'January', 'February', 'March', 'April', 'May',
+ 'June', 'July', 'August', 'September', 'October',
+ 'November', 'December'
+);
+
+@MONTH_NAMES_DE =
+(
+ 'Januar', 'Februar', 'M&auml;rz', 'April', 'Mai',
+ 'Juni', 'Juli', 'August', 'September', 'Oktober',
+ 'November', 'Dezember'
+);
+
+@MONTH_NAMES_NL =
+(
+ 'Januari', 'Februari', 'Maart', 'April', 'Mei',
+ 'Juni', 'Juli', 'Augustus', 'September', 'Oktober',
+ 'November', 'December'
+);
+
+@MONTH_NAMES_ES =
+(
+ 'enero', 'febrero', 'marzo', 'abril', 'mayo',
+ 'junio', 'julio', 'agosto', 'septiembre', 'octubre',
+ 'noviembre', 'diciembre'
+);
+
+@MONTH_NAMES_NO =
+(
+
+ 'januar', 'februar', 'mars', 'april', 'mai',
+ 'juni', 'juli', 'august', 'september', 'oktober',
+ 'november', 'desember'
+);
+
+@MONTH_NAMES_PT =
+(
+ 'Janeiro', 'Fevereiro', 'Mar&ccedil;o', 'Abril', 'Maio',
+ 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro',
+ 'Novembro', 'Dezembro'
+);
+
+
+$MONTH_NAMES =
+{
+    'en' => \@MONTH_NAMES_EN,
+    'de' => \@MONTH_NAMES_DE,
+    'es' => \@MONTH_NAMES_ES,
+    'nl' => \@MONTH_NAMES_NL,
+    'no' => \@MONTH_NAMES_NO,
+    'pt' => \@MONTH_NAMES_PT
+};
+########################################################################
+# Control of Page layout:
+# You can make changes of the Page layout at two levels:
+# 1.) For small changes, it is often enough to change the value of
+#     some global string/hash/array variables
+# 2.) For larger changes, reimplement one of the T2H_DEFAULT_<fnc>* routines,
+#     give them another name, and assign them to the respective
+#     $T2H_<fnc> variable.
+
+# As a general interface, the hashes T2H_HREF, T2H_NAME, T2H_NODE hold 
+# href, html-name, node-name of
+# This     -- current section (resp. html page)
+# Top      -- top page ($T2H_TOP_FILE)
+# Contents -- Table of contents
+# Overview -- Short table of contents
+# Index    -- Index page
+# About    -- page which explain "navigation buttons"
+# First    -- first node 
+# Last     -- last node
+#
+# Whether or not the following hash values are set, depends on the context 
+# (all values are w.r.t. 'This' section)
+# Next        -- next node of texinfo
+# Prev        -- previous node of texinfo
+# Up          -- up node of texinfo
+# Forward     -- next node in reading order
+# Back        -- previous node in reading order
+# FastForward -- if leave node, up and next, else next node
+# FastBackward-- if leave node, up and prev, else prev node
+#
+# Furthermore, the following global variabels are set:
+# $T2H_THISDOC{title}     -- title as set by @setttile
+# $T2H_THISDOC{fulltitle} -- full title as set by @title...
+# $T2H_THISDOC{subtitle}  -- subtitle as set by @subtitle
+# $T2H_THISDOC{author}    -- author as set by @author
+# 
+# and pointer to arrays of lines which need to be printed by t2h_print_lines 
+# $T2H_OVERVIEW      -- lines of short table of contents
+# $T2H_TOC           -- lines of table of contents
+# $T2H_TOP           -- lines of Top texinfo node 
+# $T2H_THIS_SECTION  -- lines of 'This' section
+
+#
+# There are the following subs which control the layout:
+#
+$T2H_print_section            = \&T2H_DEFAULT_print_section;
+$T2H_print_Top_header         = \&T2H_DEFAULT_print_Top_header;       
+$T2H_print_Top_footer        = \&T2H_DEFAULT_print_Top_footer;       
+$T2H_print_Top               = \&T2H_DEFAULT_print_Top;              
+$T2H_print_Toc               = \&T2H_DEFAULT_print_Toc;              
+$T2H_print_Overview          = \&T2H_DEFAULT_print_Overview;         
+$T2H_print_Footnotes         = \&T2H_DEFAULT_print_Footnotes;        
+$T2H_print_About             = \&T2H_DEFAULT_print_About;            
+$T2H_print_misc_header       = \&T2H_DEFAULT_print_misc_header;      
+$T2H_print_misc_footer       = \&T2H_DEFAULT_print_misc_footer;      
+$T2H_print_misc                      = \&T2H_DEFAULT_print_misc;
+$T2H_print_chapter_header     = \&T2H_DEFAULT_print_chapter_header;      
+$T2H_print_chapter_footer     = \&T2H_DEFAULT_print_chapter_footer;      
+$T2H_print_page_head         = \&T2H_DEFAULT_print_page_head;        
+$T2H_print_page_foot         = \&T2H_DEFAULT_print_page_foot;        
+$T2H_print_head_navigation    = \&T2H_DEFAULT_print_head_navigation;  
+$T2H_print_foot_navigation    = \&T2H_DEFAULT_print_foot_navigation;  
+$T2H_button_icon_img         = \&T2H_DEFAULT_button_icon_img;        
+$T2H_print_navigation        = \&T2H_DEFAULT_print_navigation;       
+$T2H_about_body                      = \&T2H_DEFAULT_about_body;            
+$T2H_print_frame              = \&T2H_DEFAULT_print_frame;
+$T2H_print_toc_frame          = \&T2H_DEFAULT_print_toc_frame;
+
+########################################################################
+# Layout for html for every sections
+#
+sub T2H_DEFAULT_print_section
+{
+  my $fh = shift;
+  local $T2H_BUTTONS = \@T2H_SECTION_BUTTONS;
+  &$T2H_print_head_navigation($fh) if $T2H_SECTION_NAVIGATION;
+  my $nw = t2h_print_lines($fh);
+  if ($T2H_SPLIT eq 'section' && $T2H_SECTION_NAVIGATION)
+  {
+    &$T2H_print_foot_navigation($fh, $nw);
+  }
+  else
+  {
+    print $fh '<HR SIZE="6">' . "\n";
+  }
+}
+
+###################################################################
+# Layout of top-page I recommend that you use @ifnothtml, @ifhtml,
+# @html within the Top texinfo node to specify content of top-level
+# page. 
+#
+# If you enclose everything in @ifnothtml, then title, subtitle,
+# author and overview is printed
+# T2H_HREF of Next, Prev, Up, Forward, Back are not defined
+# if $T2H_SPLIT then Top page is in its own html file
+sub T2H_DEFAULT_print_Top_header
+{
+  &$T2H_print_page_head(@_) if $T2H_SPLIT;
+  t2h_print_label(@_); # this needs to be called, otherwise no label set
+  &$T2H_print_head_navigation(@_);
+}
+sub T2H_DEFAULT_print_Top_footer
+{
+  &$T2H_print_foot_navigation(@_);
+  &$T2H_print_page_foot(@_) if $T2H_SPLIT; 
+}
+sub T2H_DEFAULT_print_Top
+{
+  my $fh = shift;
+
+  # for redefining navigation buttons use:
+  # local $T2H_BUTTONS = [...];
+  # as it is, 'Top', 'Contents', 'Index', 'About' are printed
+  local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
+  &$T2H_print_Top_header($fh);
+  if ($T2H_THIS_SECTION)
+  {
+    # if top-level node has content, then print it with extra header
+    print $fh "<H1>$T2H_NAME{Top}</H1>"
+      unless ($T2H_HAS_TOP_HEADING);
+    t2h_print_lines($fh, $T2H_THIS_SECTION)
+  }
+  else
+  {
+    # top-level node is fully enclosed in @ifnothtml
+    # print fulltitle, subtitle, author, Overview
+    print $fh 
+      "<CENTER>\n<H1>" .
+      join("</H1>\n<H1>", split(/\n/,  $T2H_THISDOC{fulltitle})) .
+      "</H1>\n";
+    print $fh "<H2>$T2H_THISDOC{subtitle}</H2>\n" if $T2H_THISDOC{subtitle};
+    print $fh "$T2H_THISDOC{author}\n" if $T2H_THISDOC{author};
+    print $fh <<EOT;
+</CENTER>
+<HR>
+<P></P>  
+<H2> Overview: </H2>
+<BLOCKQUOTE>  
+EOT
+    t2h_print_lines($fh, $T2H_OVERVIEW);
+    print $fh "</BLOCKQUOTE>\n";
+  }
+  &$T2H_print_Top_footer($fh);
+}
+
+###################################################################
+# Layout of Toc, Overview, and Footnotes pages
+# By default, we use "normal" layout 
+# T2H_HREF of Next, Prev, Up, Forward, Back, etc are not defined
+# use: local $T2H_BUTTONS = [...] to redefine navigation buttons
+sub T2H_DEFAULT_print_Toc
+{
+  return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_Overview
+{
+  return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_Footnotes
+{
+  return &$T2H_print_misc(@_);
+}
+sub T2H_DEFAULT_print_About
+{
+  return &$T2H_print_misc(@_);
+}
+
+sub T2H_DEFAULT_print_misc_header
+{
+  &$T2H_print_page_head(@_) if $T2H_SPLIT;
+  # this needs to be called, otherwise, no labels are set
+  t2h_print_label(@_); 
+  &$T2H_print_head_navigation(@_);
+}
+sub T2H_DEFAULT_print_misc_footer
+{
+  &$T2H_print_foot_navigation(@_);
+  &$T2H_print_page_foot(@_) if $T2H_SPLIT; 
+}
+sub T2H_DEFAULT_print_misc
+{
+  my $fh = shift;
+  local $T2H_BUTTONS = \@T2H_MISC_BUTTONS;
+  &$T2H_print_misc_header($fh);
+  print $fh "<H1>$T2H_NAME{This}</H1>\n";
+  t2h_print_lines($fh);
+  &$T2H_print_misc_footer($fh);
+}
+
+###################################################################
+# chapter_header and chapter_footer are only called if
+# T2H_SPLIT eq 'chapter'
+# chapter_header: after print_page_header, before print_section
+# chapter_footer: after print_section of last section, before print_page_footer
+# 
+# If you want to get rid of navigation stuff after each section,
+# redefine print_section such that it does not call print_navigation,
+# and put print_navigation into print_chapter_header
+@T2H_CHAPTER_BUTTONS =
+  (
+   'FastBack', 'FastForward', ' ', 
+   ' ', ' ', ' ', ' ',
+   'Top', 'Contents', 'Index', 'About', 
+  );
+
+sub T2H_DEFAULT_print_chapter_header
+{
+  # nothing to do there, by default
+  if (! $T2H_SECTION_NAVIGATION)
+  {
+    my $fh = shift;
+    local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
+    &$T2H_print_navigation($fh);
+    print $fh "\n<HR SIZE=2>\n";
+  }
+}
+
+sub T2H_DEFAULT_print_chapter_footer
+{
+  local $T2H_BUTTONS = \@T2H_CHAPTER_BUTTONS;
+  &$T2H_print_navigation(@_);
+}
+###################################################################
+$T2H_TODAY = &pretty_date;             # like "20 September 1993"
+
+sub pretty_date {
+    local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+    $year += ($year < 70) ? 2000 : 1900;
+    # obachman: Let's do it as the Americans do
+    return($MONTH_NAMES->{$T2H_LANG}[$mon] . ", " . $mday . " " . $year);
+}
+
+
+###################################################################
+# Layout of standard header and footer
+#
+
+# Set the default body text, inserted between <BODY ... > 
+###$T2H_BODYTEXT = 'LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
+$T2H_BODYTEXT = 'LANG="' . $T2H_LANG . '" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"';
+# text inserted after <BODY ...>
+$T2H_AFTER_BODY_OPEN = '';
+#text inserted before </BODY>
+$T2H_PRE_BODY_CLOSE = '';
+# this is used in footer
+$T2H_ADDRESS = "by <I>$T2H_USER</I> " if $T2H_USER;
+$T2H_ADDRESS .= "on <I>$T2H_TODAY</I>";
+# this is added inside <HEAD></HEAD> after <TITLE> and some META NAME stuff
+# can be used for <style> <script>, <meta> tags
+$T2H_EXTRA_HEAD = '';
+
+sub T2H_DEFAULT_print_page_head
+{
+  my $fh = shift; 
+  my $longtitle = "$T2H_THISDOC{title}: $T2H_NAME{This}";
+  print $fh <<EOT;
+<HTML>
+$T2H_DOCTYPE
+<!-- Created on $T2H_TODAY by $THISPROG -->
+<!-- 
+$T2H_AUTHORS 
+-->
+<HEAD>
+<TITLE>$longtitle</TITLE>
+
+<META NAME="description" CONTENT="$longtitle">
+<META NAME="keywords" CONTENT="$longtitle">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="$THISPROG">
+$T2H_EXTRA_HEAD
+</HEAD>
+
+<BODY $T2H_BODYTEXT>
+$T2H_AFTER_BODY_OPEN
+EOT
+}
+
+sub T2H_DEFAULT_print_page_foot
+{
+  my $fh = shift;
+  print $fh <<EOT;
+<BR>  
+<FONT SIZE="-1">
+This document was generated
+$T2H_ADDRESS
+using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
+$T2H_PRE_BODY_CLOSE
+</BODY>
+</HTML>
+EOT
+}
+
+###################################################################
+# Layout of navigation panel
+
+# if this is set, then a vertical navigation panel is used
+$T2H_VERTICAL_HEAD_NAVIGATION = 0;
+sub T2H_DEFAULT_print_head_navigation
+{
+  my $fh = shift;
+  if ($T2H_VERTICAL_HEAD_NAVIGATION)
+  {
+    print $fh <<EOT;
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
+<TR VALIGN="TOP">
+<TD ALIGN="LEFT">
+EOT
+  }
+  &$T2H_print_navigation($fh, $T2H_VERTICAL_HEAD_NAVIGATION);
+  if ($T2H_VERTICAL_HEAD_NAVIGATION)
+  {
+    print $fh <<EOT;
+</TD>
+<TD ALIGN="LEFT">
+EOT
+  }
+  elsif ($T2H_SPLIT eq 'section')
+  {
+    print $fh "<HR SIZE=1>\n";
+  }
+}
+
+# Specifies the minimum page length required before a navigation panel
+# is placed at the bottom of a page (the default is that of latex2html)
+# T2H_THIS_WORDS_IN_PAGE holds number of words of current page
+$T2H_WORDS_IN_PAGE = 300;
+sub T2H_DEFAULT_print_foot_navigation
+{
+  my $fh = shift;
+  my $nwords = shift;
+  if ($T2H_VERTICAL_HEAD_NAVIGATION)
+  {
+    print $fh <<EOT;
+</TD>
+</TR>
+</TABLE>
+EOT
+  }
+  print $fh "<HR SIZE=1>\n";
+  &$T2H_print_navigation($fh) if ($nwords >= $T2H_WORDS_IN_PAGE)
+}
+
+######################################################################
+# navigation panel
+#
+# specify in this array which "buttons" should appear in which order
+# in the navigation panel for sections; use ' ' for empty buttons (space)
+@T2H_SECTION_BUTTONS =
+  (
+   'Back', 'Forward', ' ', 'FastBack', 'Up', 'FastForward',  
+   ' ', ' ', ' ', ' ',
+   'Top', 'Contents', 'Index', 'About', 
+  );
+
+# buttons for misc stuff
+@T2H_MISC_BUTTONS = ('Top', 'Contents', 'Index', 'About');
+
+# insert here name of icon images for buttons 
+# Icons are used, if $T2H_ICONS and resp. value are set
+%T2H_ACTIVE_ICONS =
+  (
+   'Top',      '',
+   'Contents', '',
+   'Overview', '',
+   'Index',    '',
+   'Back',     '',
+   'FastBack', '',
+   'Prev',     '',
+   'Up',       '',
+   'Next',     '',
+   'Forward',  '',
+   'FastForward', '',
+   'About' ,    '',
+   'First',    '',
+   'Last',     '',
+   ' ',        ''
+  );
+
+# insert here name of icon images for these, if button is inactive
+%T2H_PASSIVE_ICONS =
+  (
+   'Top',      '',
+   'Contents', '',
+   'Overview', '',
+   'Index',    '',
+   'Back',     '',
+   'FastBack', '',
+   'Prev',     '',
+   'Up',       '',
+   'Next',     '',
+   'Forward',  '',
+   'FastForward', '',
+   'About',     '',
+   'First',    '',
+   'Last',     '',
+  );
+
+# how to create IMG tag
+sub T2H_DEFAULT_button_icon_img
+{
+  my $button = shift;
+  my $icon = shift;
+  my $name = shift;
+  return qq{<IMG SRC="$icon" BORDER="0" ALT="$button: $name" ALIGN="MIDDLE">};
+}
+
+# Names of text as alternative for icons
+%T2H_NAVIGATION_TEXT =
+  (
+   'Top',      'Top',
+   'Contents', 'Contents',
+   'Overview', 'Overview',
+   'Index',    'Index',
+   ' ',        ' &nbsp; ',
+   'Back',     ' &lt; ',
+   'FastBack', ' &lt;&lt; ',
+   'Prev',     'Prev',
+   'Up',       ' Up ',
+   'Next',     'Next',
+   'Forward',  ' &gt; ',
+   'FastForward',  ' &gt;&gt; ',
+   'About',     ' ? ',
+   'First',    ' |&lt; ',
+   'Last',     ' &gt;| '
+  );
+
+sub T2H_DEFAULT_print_navigation
+{
+  my $fh = shift;
+  my $vertical = shift;
+  my $spacing = 1;
+  print $fh "<TABLE CELLPADDING=$spacing CELLSPACING=$spacing BORDER=0>\n";
+
+  print $fh "<TR>" unless $vertical;
+  for $button (@$T2H_BUTTONS)
+  {
+    print $fh qq{<TR VALIGN="TOP" ALIGN="LEFT">\n} if $vertical;
+    print $fh qq{<TD VALIGN="MIDDLE" ALIGN="LEFT">};
+
+    if (ref($button) eq 'CODE')
+    {
+      &$button($fh, $vertical);
+    }
+    elsif ($button eq ' ')
+    { # handle space button
+      print $fh 
+       $T2H_ICONS && $T2H_ACTIVE_ICONS{' '} ? 
+        &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{' '}) :
+        $T2H_NAVIGATION_TEXT{' '};
+      next;
+    }
+    elsif ($T2H_HREF{$button})
+    { # button is active
+      print $fh   
+        $T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ? # use icon ? 
+          t2h_anchor('', $T2H_HREF{$button},  # yes
+                   &$T2H_button_icon_img($button,
+                                       $T2H_ACTIVE_ICONS{$button},
+                                       $T2H_NAME{$button})) 
+        : # use text
+        "[" . 
+        t2h_anchor('', $T2H_HREF{$button}, $T2H_NAVIGATION_TEXT{$button}) .
+        "]";  
+    }
+    else
+    { # button is passive 
+      print $fh 
+       $T2H_ICONS && $T2H_PASSIVE_ICONS{$button} ?
+        &$T2H_button_icon_img($button,
+                              $T2H_PASSIVE_ICONS{$button},
+                              $T2H_NAME{$button}) :
+        
+        "[" . $T2H_NAVIGATION_TEXT{$button} . "]";
+    }
+    print $fh "</TD>\n";
+    print $fh "</TR>\n" if $vertical;
+  }
+  print $fh "</TR>" unless $vertical;
+  print $fh "</TABLE>\n";
+}
+
+######################################################################
+# Frames: this is from "Richard Y. Kim" <ryk@coho.net>
+# Should be improved to be more conforming to other _print* functions
+
+sub T2H_DEFAULT_print_frame
+{
+  my $fh = shift;
+  print $fh <<EOT;
+<HTML>
+<HEAD><TITLE>$T2H_THISDOC{title}</TITLE></HEAD>
+<FRAMESET cols="140,*"> 
+  <FRAME name=toc  src="$docu_toc_frame_file">
+  <FRAME name=main src="$docu_doc">
+</FRAMESET> 
+</HTML>
+EOT
+}
+
+sub T2H_DEFAULT_print_toc_frame
+{
+  my $fh = shift;
+  &$T2H_print_page_head($fh);
+  print $fh <<EOT;
+<H2>Content</H2>
+EOT
+  print $fh map {s/HREF=/target=\"main\" HREF=/; $_;} @stoc_lines;
+  print $fh "</BODY></HTML>\n";
+}
+
+######################################################################
+# About page
+#
+
+# T2H_PRE_ABOUT might be a function
+$T2H_PRE_ABOUT = <<EOT;
+This document was generated $T2H_ADDRESS
+using <A HREF="$T2H_HOMEPAGE"><I>texi2html</I></A>
+<P></P>  
+EOT
+$T2H_AFTER_ABOUT = '';
+
+sub T2H_DEFAULT_about_body
+{
+  my $about;
+  if (ref($T2H_PRE_ABOUT) eq 'CODE')
+  {
+    $about = &$T2H_PRE_ABOUT();
+  }
+  else
+  {
+    $about = $T2H_PRE_ABOUT;
+  }
+  $about .= <<EOT;
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+EOT
+  
+  for $button (@T2H_SECTION_BUTTONS)
+  {
+    next if $button eq ' ' || ref($button) eq 'CODE';
+    $about .= <<EOT;
+<TR>
+<TD ALIGN="CENTER">
+EOT
+    $about .=  
+      ($T2H_ICONS && $T2H_ACTIVE_ICONS{$button} ?
+       &$T2H_button_icon_img($button, $T2H_ACTIVE_ICONS{$button}) :
+       " [" . $T2H_NAVIGATION_TEXT{$button} . "] ");
+    $about .= <<EOT;
+</TD>
+<TD ALIGN="CENTER">
+$button
+</TD>
+<TD>
+$T2H_BUTTONS_GOTO{$button}
+</TD>
+<TD>
+$T2H_BUTTONS_EXAMPLE{$button}
+</TD>
+</TR>
+EOT
+  }
+
+  $about .= <<EOT;
+</TABLE>
+<P></P>
+where the <STRONG> Example </STRONG> assumes that the current position 
+is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of 
+the following structure:
+<UL>
+<LI> 1. Section One  </LI>
+<UL>
+<LI>1.1 Subsection One-One</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.2 Subsection One-Two</LI>
+<UL>
+<LI>1.2.1 Subsubsection One-Two-One
+</LI><LI>1.2.2 Subsubsection One-Two-Two
+</LI><LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp; <STRONG>
+&lt;== Current Position </STRONG>
+</LI><LI>1.2.4 Subsubsection One-Two-Four
+</LI></UL>
+<LI>1.3 Subsection One-Three</LI>
+<UL>
+<LI> ... </LI>
+</UL>
+<LI>1.4 Subsection One-Four</LI>
+</UL>
+</UL>
+$T2H_AFTER_ABOUT
+EOT
+  return $about;  
+}
+
+  
+%T2H_BUTTONS_GOTO =
+  (
+   'Top',      'cover (top) of document',
+   'Contents', 'table of contents',
+   'Overview', 'short table of contents',
+   'Index',    'concept index',
+   'Back',     'previous section in reading order',
+   'FastBack', 'previous or up-and-previous section ',
+   'Prev',     'previous section same level',
+   'Up',       'up section',
+   'Next',     'next section same level',
+   'Forward',  'next section in reading order',
+   'FastForward', 'next or up-and-next section',
+   'About' ,    'this page',
+   'First',    'first section in reading order',
+   'Last',     'last section in reading order',
+  );
+
+%T2H_BUTTONS_EXAMPLE = 
+(
+   'Top',      ' &nbsp; ',
+   'Contents', ' &nbsp; ',
+   'Overview', ' &nbsp; ',
+   'Index',    ' &nbsp; ',
+   'Back',     '1.2.2',
+   'FastBack', '1.1',
+   'Prev',     '1.2.2',
+   'Up',       '1.2',
+   'Next',     '1.2.4',
+   'Forward',  '1.2.4',
+   'FastForward', '1.3',
+   'About',     ' &nbsp; ',
+   'First',    '1.',
+   'Last',     '1.2.4',
+);
+
+
+######################################################################
+# from here on, its l2h init stuff 
+#
+
+## initialization for latex2html as for Singular manual generation
+## obachman 3/99
+
+#
+# Options controlling Titles, File-Names, Tracing and Sectioning
+#
+$TITLE = '';
+
+$SHORTEXTN = 0;
+
+$LONG_TITLES = 0;
+
+$DESTDIR = ''; # should be overwritten by cmd-line argument
+
+$NO_SUBDIR = 0;# should be overwritten by cmd-line argument
+
+$PREFIX = '';  # should be overwritten by cmd-line argument
+
+$AUTO_PREFIX = 0; # this is needed, so that prefix settings are used
+
+$AUTO_LINK = 0; 
+
+$SPLIT = 0;
+
+$MAX_LINK_DEPTH = 0;
+
+$TMP = ''; # should be overwritten by cmd-line argument
+
+$DEBUG = 0;
+
+$VERBOSE = 1;
+
+#
+# Options controlling Extensions and Special Features 
+#
+$HTML_VERSION = "3.2";
+
+$TEXDEFS = 1; # we absolutely need that
+
+$EXTERNAL_FILE = '';
+
+$SCALABLE_FONTS = 1;
+
+$NO_SIMPLE_MATH = 1;
+
+$LOCAL_ICONS = 1;
+
+$SHORT_INDEX = 0;
+
+$NO_FOOTNODE = 1;
+
+$ADDRESS = '';
+
+$INFO = '';
+
+#
+# Switches controlling Image Generation 
+#
+$ASCII_MODE = 0;
+
+$NOLATEX = 0;
+
+$EXTERNAL_IMAGES = 0;
+
+$PS_IMAGES = 0;
+
+$NO_IMAGES = 0;
+
+$IMAGES_ONLY = 0;
+
+$REUSE = 2;
+
+$ANTI_ALIAS = 1;
+
+$ANTI_ALIAS_TEXT = 1;
+
+#
+#Switches controlling Navigation Panels
+#
+$NO_NAVIGATION = 1;
+$ADDRESS = '';
+$INFO = 0;              # 0 = do not make a "About this document..." section 
+
+#
+#Switches for Linking to other documents 
+#
+# actuall -- we don't care
+
+$MAX_SPLIT_DEPTH = 0;  # Stop making separate files at this depth
+
+$MAX_LINK_DEPTH = 0;    # Stop showing child nodes at this depth   
+
+$NOLATEX = 0;           # 1 = do not pass unknown environments to Latex
+
+$EXTERNAL_IMAGES = 0;   # 1 = leave the images outside the document 
+
+$ASCII_MODE = 0;        # 1 = do not use any icons or internal images
+
+# 1 =  use links to external postscript images rather than inlined bitmap
+# images.
+$PS_IMAGES = 0;
+$SHOW_SECTION_NUMBERS = 0;
+
+### Other global variables ###############################################
+$CHILDLINE = "";
+
+# This is the line width measured in pixels and it is used to right justify
+# equations and equation arrays; 
+$LINE_WIDTH = 500;             
+
+# Used in conjunction with AUTO_NAVIGATION
+$WORDS_IN_PAGE = 300;  
+
+# Affects ONLY the way accents are processed 
+$default_language = 'english'; 
+
+# The value of this variable determines how many words to use in each 
+# title that is added to the navigation panel (see below)
+# 
+$WORDS_IN_NAVIGATION_PANEL_TITLES = 0;
+
+# This number will determine the size of the equations, special characters,
+# and anything which will be converted into an inlined image
+# *except* "image generating environments" such as "figure", "table" 
+# or "minipage".
+# Effective values are those greater than 0.
+# Sensible values are between 0.1 - 4.
+$MATH_SCALE_FACTOR = 1.5;
+
+# This number will determine the size of 
+# image generating environments such as "figure", "table" or "minipage".
+# Effective values are those greater than 0.
+# Sensible values are between 0.1 - 4.
+$FIGURE_SCALE_FACTOR = 1.6;
+
+
+#  If both of the following two variables are set then the "Up" button
+#  of the navigation panel in the first node/page of a converted document
+#  will point to $EXTERNAL_UP_LINK. $EXTERNAL_UP_TITLE should be set
+#  to some text which describes this external link.
+$EXTERNAL_UP_LINK = "";
+$EXTERNAL_UP_TITLE = "";
+
+# If this is set then the resulting HTML will look marginally better if viewed 
+# with Netscape.
+$NETSCAPE_HTML = 1;
+
+# Valid paper sizes are "letter", "legal", "a4","a3","a2" and "a0"
+# Paper sizes has no effect other than in the time it takes to create inlined
+# images and in whether large images can be created at all ie
+#  - larger paper sizes *MAY* help with large image problems 
+#  - smaller paper sizes are quicker to handle
+$PAPERSIZE = "a4";
+
+# Replace "english" with another language in order to tell LaTeX2HTML that you 
+# want some generated section titles (eg "Table of Contents" or "References")
+# to appear in a different language. Currently only "english" and "french"
+# is supported but it is very easy to add your own. See the example in the
+# file "latex2html.config" 
+$TITLES_LANGUAGE = "english";
+
+1;     # This must be the last non-comment line
+
+# End File texi2html.init
+######################################################################
+
+
+require "$ENV{T2H_HOME}/texi2html.init" 
+  if ($0 =~ /\.pl$/ &&
+      -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
+
+#+++############################################################################
+#                                                                              #
+# Initialization                                                               #
+# Pasted content of File $(srcdir)/MySimple.pm: Command-line processing        #
+#                                                                              #
+#---############################################################################
+
+# leave this within comments, and keep the require statement
+# This way, you can directly run texi2html.pl, if $ENV{T2H_HOME}/texi2html.init
+# exists.
+
+# 
+package Getopt::MySimple;
+
+# Name:
+#      Getopt::MySimple.
+#
+# Documentation:
+#      POD-style (incomplete) documentation is in file MySimple.pod
+#
+# Tabs:
+#      4 spaces || die.
+#
+# Author:
+#      Ron Savage      rpsavage@ozemail.com.au.
+#      1.00    19-Aug-97       Initial version.
+#      1.10    13-Oct-97       Add arrays of switches (eg '=s@').
+#      1.20     3-Dec-97       Add 'Help' on a per-switch basis.
+#      1.30    11-Dec-97       Change 'Help' to 'verbose'. Make all hash keys lowercase.
+#      1.40    10-Nov-98       Change width of help report. Restructure tests.
+#               1-Jul-00        Modifications for Texi2html
+
+# --------------------------------------------------------------------------
+# Locally modified by obachman (Display type instead of env, order by cmp)
+# $Id: MySimple.pm,v 1.1 2000/07/03 08:44:13 obachman Exp $
+
+# use strict;
+# no strict 'refs';
+
+use vars qw(@EXPORT @EXPORT_OK @ISA);
+use vars qw($fieldWidth $opt $VERSION);
+
+use Exporter();
+use Getopt::Long;
+
+@ISA           = qw(Exporter);
+@EXPORT                = qw();
+@EXPORT_OK     = qw($opt);     # An alias for $self -> {'opt'}.
+
+# --------------------------------------------------------------------------
+
+$fieldWidth    = 20;
+$VERSION       = '1.41';
+
+# --------------------------------------------------------------------------
+
+sub byOrder
+{
+       my($self) = @_;
+       
+       return uc($a) cmp (uc($b));
+}
+
+# --------------------------------------------------------------------------
+
+sub dumpOptions
+{
+       my($self) = @_;
+
+       print 'Option', ' ' x ($fieldWidth - length('Option') ), "Value\n";
+
+       for (sort byOrder keys(%{$self -> {'opt'} }) )
+       {
+         print "-$_", ' ' x ($fieldWidth - (1 + length) ), "${$self->{'opt'} }{$_}\n";
+       }
+
+       print "\n";
+
+}      # End of dumpOptions.
+
+# --------------------------------------------------------------------------
+# Return:
+#      0 -> Error.
+#      1 -> Ok.
+
+sub getOptions
+{
+       push(@_, 0) if ($#_ == 2);      # Default for $ignoreCase is 0.
+       push(@_, 1) if ($#_ == 3);      # Default for $helpThenExit is 1.
+
+       my($self, $default, $helpText, $versionText, 
+          $helpThenExit, $versionThenExit, $ignoreCase) = @_;
+       
+       $helpThenExit = 1 unless (defined($helpThenExit));
+       $versionThenExit = 1 unless (defined($versionThenExit));
+       $ignoreCase = 0 unless (defined($ignoreCase));
+
+       $self -> {'default'}            = $default;
+       $self -> {'helpText'}           = $helpText;
+       $self -> {'versionText'}        = $versionText;
+       $Getopt::Long::ignorecase       = $ignoreCase;
+
+       unless (defined($self -> {'default'}{'help'}))
+       {
+         $self -> {'default'}{'help'} = 
+         { 
+          type => ':i', 
+          default => '',
+          linkage => sub {$self->helpOptions($_[1]); exit (0) if $helpThenExit;},
+          verbose => "print help and exit"
+         };
+       }
+
+       unless (defined($self -> {'default'}{'version'}))
+       {
+         $self -> {'default'}{'version'} = 
+         { 
+          type => '', 
+          default => '',
+          linkage => sub {print $self->{'versionText'};  exit (0) if versionTheExit;},
+          verbose => "print version and exit"
+         };
+       }
+
+       for (keys(%{$self -> {'default'} }) )
+       {
+         my $type = ${$self -> {'default'} }{$_}{'type'};
+         push(@{$self -> {'type'} }, "$_$type");
+         $self->{'opt'}->{$_} =  ${$self -> {'default'} }{$_}{'linkage'}
+            if ${$self -> {'default'} }{$_}{'linkage'};
+       }
+
+       my($result) = &GetOptions($self -> {'opt'}, @{$self -> {'type'} });
+
+        return $result unless $result;
+
+       for (keys(%{$self -> {'default'} }) )
+       {
+          if (! defined(${$self -> {'opt'} }{$_})) #{
+            {
+            ${$self -> {'opt'} }{$_} = ${$self -> {'default'} }{$_}{'default'};
+            }
+       }
+
+       $result;
+}      # End of getOptions.
+
+# --------------------------------------------------------------------------
+
+sub helpOptions
+{
+       my($self) = shift;
+       my($noHelp) = shift;
+       $noHelp = 0 unless $noHelp;
+       my($optwidth, $typewidth, $defaultwidth, $maxlinewidth, $valind, $valwidth) 
+         = (10, 5, 9, 78, 4, 11);
+
+       print "$self->{'helpText'}" if ($self -> {'helpText'});
+
+       print ' Option', ' ' x ($optwidth - length('Option') -1 ),
+               'Type', ' ' x ($typewidth - length('Type') + 1),
+               'Default', ' ' x ($defaultwidth - length('Default') ),
+               "Description\n";
+
+       for (sort byOrder keys(%{$self -> {'default'} }) )
+       {
+         my($line, $help, $option, $val);
+         $option = $_;
+         next if ${$self->{'default'} }{$_}{'noHelp'} && ${$self->{'default'} }{$_}{'noHelp'} > $noHelp;
+               $line = " -$_ " . ' ' x ($optwidth - (2 + length) ) .
+                       "${$self->{'default'} }{$_}{'type'} ".
+                       ' ' x ($typewidth - (1+length(${$self -> {'default'} }{$_}{'type'}) ));
+
+                 $val = ${$self->{'default'} }{$_}{'linkage'};
+                if ($val)
+                {
+                  if (ref($val) eq 'SCALAR')
+                 {
+                   $val = $$val; 
+                 }
+                 else
+                 {
+                   $val = '';
+                 }
+                }
+               else
+               {
+                 $val = ${$self->{'default'} }{$_}{'default'};
+               }
+               $line .= "$val  ";
+               $line .= ' ' x ($optwidth + $typewidth + $defaultwidth + 1 - length($line));
+               
+               if (defined(${$self -> {'default'} }{$_}{'verbose'}) &&
+                 ${$self -> {'default'} }{$_}{'verbose'} ne '')
+             {
+               $help = "${$self->{'default'} }{$_}{'verbose'}";
+             }
+             else
+             {
+               $help = ' ';
+             }
+             if ((length("$line") + length($help)) < $maxlinewidth)
+             {
+               print $line , $help, "\n";
+             }
+             else
+             {
+               print $line, "\n", ' ' x $valind, $help, "\n";
+             }
+             for $val (sort byOrder keys(%{${$self->{'default'}}{$option}{'values'}}))
+             {
+               print ' ' x ($valind + 2);
+               print $val, '  ', ' ' x ($valwidth - length($val) - 2);
+               print ${$self->{'default'}}{$option}{'values'}{$val}, "\n";
+             }
+       }
+
+       print <<EOT;
+Note: 'Options' may be abbreviated. 'Type' specifications mean:
+ <none>| !    no argument: variable is set to 1 on -foo (or, to 0 on -nofoo)
+    =s | :s   mandatory (or, optional)  string argument
+    =i | :i   mandatory (or, optional)  integer argument
+EOT
+}      # End of helpOptions.
+
+#-------------------------------------------------------------------
+
+sub new
+{
+       my($class)                              = @_;
+       my($self)                               = {};
+       $self -> {'default'}    = {};
+       $self -> {'helpText'}   = '';
+       $self -> {'opt'}                = {};
+       $opt                                    = $self -> {'opt'};      # An alias for $self -> {'opt'}.
+       $self -> {'type'}               = ();
+
+       return bless $self, $class;
+
+}      # End of new.
+
+# --------------------------------------------------------------------------
+
+1;
+
+# End MySimple.pm
+
+require "$ENV{T2H_HOME}/MySimple.pm" 
+  if ($0 =~ /\.pl$/ &&
+      -e "$ENV{T2H_HOME}/texi2html.init" && -r "$ENV{T2H_HOME}/texi2html.init");
+
+package main;
+
+#+++############################################################################
+#                                                                              #
+# Constants                                                                    #
+#                                                                              #
+#---############################################################################
+
+$DEBUG_TOC   =  1;
+$DEBUG_INDEX =  2;
+$DEBUG_BIB   =  4;
+$DEBUG_GLOSS =  8;
+$DEBUG_DEF   = 16;
+$DEBUG_HTML  = 32;
+$DEBUG_USER  = 64;
+$DEBUG_L2H   = 128;
+
+
+$BIBRE = '\[[\w\/-]+\]';               # RE for a bibliography reference
+$FILERE = '[\/\w.+-]+';                        # RE for a file name
+$VARRE = '[^\s\{\}]+';                 # RE for a variable name
+$NODERE = '[^,:]+';                    # RE for a node name
+$NODESRE = '[^:]+';                    # RE for a list of node names
+
+$ERROR = "***";                                # prefix for errors 
+$WARN  = "**";                          # prefix for warnings
+  
+                                        # program home page
+$PROTECTTAG = "_ThisIsProtected_";     # tag to recognize protected sections
+
+$CHAPTEREND = "<!-- End chapter -->\n"; # to know where a chpater ends
+$SECTIONEND = "<!-- End section -->\n"; # to know where section ends
+$TOPEND     = "<!-- End top     -->\n"; # to know where top ends
+
+  
+
+#
+# pre-defined indices
+#
+$index_properties =
+{
+ 'c' => { name => 'cp'},
+ 'f' => { name => 'fn', code => 1},
+ 'v' => { name => 'vr', code => 1},
+ 'k' => { name => 'ky', code => 1},
+ 'p' => { name => 'pg', code => 1},
+ 't' => { name => 'tp', code => 1}
+};
+
+
+%predefined_index = (
+                   'cp', 'c',
+                   'fn', 'f',
+                   'vr', 'v',
+                   'ky', 'k',
+                   'pg', 'p',
+                   'tp', 't',
+                   );
+
+#
+# valid indices
+#
+%valid_index = (
+                   'c', 1,
+                   'f', 1,
+                   'v', 1,
+                   'k', 1,
+                   'p', 1,
+                   't', 1,
+               );
+
+#
+# texinfo section names to level
+#
+%sec2level = (
+             'top', 0,
+             'chapter', 1,
+             'unnumbered', 1,
+             'majorheading', 1,
+             'chapheading', 1,
+             'appendix', 1,
+             'section', 2,
+             'unnumberedsec', 2,
+             'heading', 2,
+             'appendixsec', 2,
+             'appendixsection', 2,
+             'subsection', 3,
+             'unnumberedsubsec', 3,
+             'subheading', 3,
+             'appendixsubsec', 3,
+             'subsubsection', 4,
+             'unnumberedsubsubsec', 4,
+             'subsubheading', 4,
+             'appendixsubsubsec', 4,
+             );
+
+#
+# accent map, TeX command to ISO name
+#
+%accent_map = (
+              '"',  'uml',
+              '~',  'tilde',
+              '^',  'circ',
+              '`',  'grave',
+              '\'', 'acute',
+              );
+
+#
+# texinfo "simple things" (@foo) to HTML ones
+#
+%simple_map = (
+              # cf. makeinfo.c
+              "*", "<BR>",             # HTML+
+              " ", " ",
+              "\t", " ",
+              "-", "&#173;",   # soft hyphen
+              "\n", "\n",
+              "|", "",
+              'tab', '<\/TD><TD>',
+              # spacing commands
+              ":", "",
+              "!", "!",
+              "?", "?",
+              ".", ".",
+              "-", "",
+              );
+
+#
+# texinfo "things" (@foo{}) to HTML ones
+#
+%things_map = (
+              'TeX', 'TeX',
+              'br', '<P>',             # paragraph break
+              'bullet', '*',
+              'copyright', '(C)',
+              'dots', '<small>...<\/small>',
+              'enddots', '<small>....<\/small>',
+              'equiv', '==',
+              'error', 'error-->',
+              'expansion', '==>',
+              'minus', '-',
+              'point', '-!-',
+              'print', '-|',
+              'result', '=>',
+              'today', $T2H_TODAY,
+              'aa', '&aring;',
+              'AA', '&Aring;',
+              'ae', '&aelig;',
+              'oe', '&#156;',
+              'AE', '&AElig;',
+              'OE', '&#140;',
+              'o',  '&oslash;',
+              'O',  '&Oslash;',
+              'ss', '&szlig;',
+              'l', '\/l',
+              'L', '\/L',
+              'exclamdown', '&iexcl;',
+              'questiondown', '&iquest;',
+              'pounds', '&pound;'
+              );
+
+#
+# texinfo styles (@foo{bar}) to HTML ones
+#
+%style_map = (
+             'acronym', '&do_acronym',
+             'asis', '',
+             'b', 'B',
+             'cite', 'CITE',
+             'code', 'CODE',
+             'command', 'CODE',
+             'ctrl', '&do_ctrl',       # special case
+             'dfn', 'EM',              # DFN tag is illegal in the standard
+             'dmn', '',                # useless
+             'email', '&do_email',     # insert a clickable email address
+             'emph', 'EM',
+             'env', 'CODE',
+             'file', '"TT',            # will put quotes, cf. &apply_style
+             'i', 'I',
+             'kbd', 'KBD',
+             'key', 'KBD',
+             'math', '&do_math',
+             'option', '"SAMP',        # will put quotes, cf. &apply_style
+             'r', '',                  # unsupported
+             'samp', '"SAMP',          # will put quotes, cf. &apply_style
+             'sc', '&do_sc',           # special case
+             'strong', 'STRONG',
+             't', 'TT',
+             'titlefont', '',          # useless
+             'uref', '&do_uref',       # insert a clickable URL
+             'url', '&do_url',         # insert a clickable URL
+             'var', 'VAR',
+             'w', '',                  # unsupported
+             'H', '&do_accent',
+             'dotaccent', '&do_accent',
+             'ringaccent','&do_accent',
+             'tieaccent', '&do_accent',
+             'u','&do_accent',
+             'ubaraccent','&do_accent',
+             'udotaccent','&do_accent',
+             'v', '&do_accent',
+             ',', '&do_accent',
+             'dotless', '&do_accent'
+             );
+
+#
+# texinfo format (@foo/@end foo) to HTML ones
+#
+%format_map = (
+              'quotation', 'BLOCKQUOTE',
+              # lists
+              'itemize', 'UL',
+              'enumerate', 'OL',
+              # poorly supported
+              'flushleft', 'PRE',
+              'flushright', 'PRE',
+              );
+
+#
+# an eval of these $complex_format_map->{what}->[0] yields beginning
+# an eval of these $complex_format_map->{what}->[1] yieleds end
+$complex_format_map =
+{
+ example => 
+ [
+  q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=example><pre>"},
+  q{'</pre></td></tr></table>'}
+ ],
+ smallexample => 
+ [
+  q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smallexample><FONT SIZE=$T2H_SMALL_FONT_SIZE><pre>"},
+  q{'</FONT></pre></td></tr></table>'}
+ ],
+ display =>
+ [
+  q{"<TABLE><tr>$T2H_EXAMPLE_INDENT_CELL<td class=display><pre " . 'style="font-family: serif">'},
+  q{'</pre></td></tr></table>'}
+ ],
+ smalldisplay =>
+ [
+  q{"<TABLE><tr>$T2H_SMALL_EXAMPLE_INDENT_CELL<td class=smalldisplay><FONT SIZE=$T2H_SMALL_FONT_SIZE><pre " . 'style="font-family: serif">'},
+  q{'</pre></FONT></td></tr></table>'}
+ ]
+};
+
+$complex_format_map->{lisp} = $complex_format_map->{example};
+$complex_format_map->{smalllisp} = $complex_format_map->{smallexample};
+$complex_format_map->{format} = $complex_format_map->{display};
+$complex_format_map->{smallformat} = $complex_format_map->{smalldisplay};
+
+#
+# texinfo definition shortcuts to real ones
+#
+%def_map = (
+           # basic commands
+           'deffn', 0,
+           'defvr', 0,
+           'deftypefn', 0,
+           'deftypevr', 0,
+           'defcv', 0,
+           'defop', 0,
+           'deftp', 0,
+           # basic x commands
+           'deffnx', 0,
+           'defvrx', 0,
+           'deftypefnx', 0,
+           'deftypevrx', 0,
+           'defcvx', 0,
+           'defopx', 0,
+           'deftpx', 0,
+           # shortcuts
+           'defun', 'deffn Function',
+           'defmac', 'deffn Macro',
+           'defspec', 'deffn {Special Form}',
+           'defvar', 'defvr Variable',
+           'defopt', 'defvr {User Option}',
+           'deftypefun', 'deftypefn Function',
+           'deftypevar', 'deftypevr Variable',
+           'defivar', 'defcv {Instance Variable}',
+           'deftypeivar', 'defcv {Instance Variable}', # NEW: FIXME
+           'defmethod', 'defop Method',
+           'deftypemethod', 'defop Method', # NEW:FIXME
+           # x shortcuts
+           'defunx', 'deffnx Function',
+           'defmacx', 'deffnx Macro',
+           'defspecx', 'deffnx {Special Form}',
+           'defvarx', 'defvrx Variable',
+           'defoptx', 'defvrx {User Option}',
+           'deftypefunx', 'deftypefnx Function',
+           'deftypevarx', 'deftypevrx Variable',
+           'defivarx', 'defcvx {Instance Variable}',
+           'defmethodx', 'defopx Method',
+           );
+
+#
+# things to skip
+#
+%to_skip = (
+           # comments
+           'c', 1,
+           'comment', 1,
+            'ifnotinfo', 1,
+            'ifnottex', 1,
+           'ifhtml', 1,
+           'end ifhtml', 1,
+            'end ifnotinfo', 1,
+            'end ifnottex', 1,
+           # useless
+           'detailmenu', 1,
+            'direntry', 1,
+           'contents', 1,
+           'shortcontents', 1,
+           'summarycontents', 1,
+           'footnotestyle', 1,
+           'end ifclear', 1,
+           'end ifset', 1,
+           'titlepage', 1,
+           'end titlepage', 1,
+           # unsupported commands (formatting)
+           'afourpaper', 1,
+           'cropmarks', 1,
+           'finalout', 1,
+           'headings', 1,
+            'sp', 1,
+           'need', 1,
+           'page', 1,
+           'setchapternewpage', 1,
+           'everyheading', 1,
+           'everyfooting', 1,
+           'evenheading', 1,
+           'evenfooting', 1,
+           'oddheading', 1,
+           'oddfooting', 1,
+           'smallbook', 1,
+           'vskip', 1,
+           'filbreak', 1,
+           'paragraphindent', 1,
+           # unsupported formats
+           'cartouche', 1,
+           'end cartouche', 1,
+           'group', 1,
+           'end group', 1,
+           );
+
+#+++############################################################################
+#                                                                              #
+# Argument parsing, initialisation                                             #
+#                                                                              #
+#---############################################################################
+
+#
+# flush stdout and stderr after every write
+#
+select(STDERR);
+$| = 1;
+select(STDOUT);
+$| = 1;
+
+
+%value = ();                           # hold texinfo variables, see also -D
+$use_bibliography = 1;
+$use_acc = 1;
+
+#
+# called on -init-file
+sub LoadInitFile
+{
+  my $init_file = shift;
+  # second argument is value of options
+  $init_file = shift;
+  if (-f $init_file)
+  {
+    print "# reading initialization file from $init_file\n" 
+      if ($T2H_VERBOSE);
+    require($init_file);
+  }
+  else
+  {
+    print "$ERROR Error: can't read init file $int_file\n";
+    $init_file = '';
+  }
+}
+
+#
+# called on -lang
+sub SetDocumentLanguage
+{
+  my $lang = shift;
+  if (! exists($T2H_WORDS->{$lang}))
+  {
+    warn "$ERROR: Language specs for '$lang' do not exists. Reverting to '" . 
+      ($T2H_LANG ? T2H_LANG : "en") . "'\n";
+  }
+  else
+  {
+    print "# using '$lang' as document language\n" if ($T2H_VERBOSE);
+    $T2H_LANG = $lang;
+  }
+}
+
+##
+## obsolete cmd line options
+##
+$T2H_OBSOLETE_OPTIONS -> {'no-section_navigation'} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_SECTION_NAVIGATION = 0;},
+ verbose => 'obsolete, use -nosec_nav',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {use_acc} =
+{
+ type => '!',
+ linkage => \$use_acc,
+ verbose => 'obsolete',
+ noHelp => 2
+};
+$T2H_OBSOLETE_OPTIONS -> {expandinfo} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_EXPAND = 'info';},
+ verbose => 'obsolete, use "-expand info" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {expandtex} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_EXPAND = 'tex';},
+ verbose => 'obsolete, use "-expand tex" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {monolithic} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_SPLIT = '';},
+ verbose => 'obsolete, use "-split no" instead',
+ noHelp => 2
+};
+$T2H_OBSOLETE_OPTIONS -> {split_node} =
+{
+ type => '!',
+ linkage => sub{$main::T2H_SPLIT = 'section';},
+ verbose => 'obsolete, use "-split section" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {split_chapter} =
+{
+ type => '!',
+ linkage => sub{$main::T2H_SPLIT = 'chapter';},
+ verbose => 'obsolete, use "-split chapter" instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {no_verbose} =
+{
+ type => '!',
+ linkage => sub {$main::T2H_VERBOSE = 0;},
+ verbose => 'obsolete, use -noverbose instead',
+ noHelp => 2,
+};
+$T2H_OBSOLETE_OPTIONS -> {output_file} =
+{
+ type => '=s',
+ linkage => sub {$main::T2H_OUT = @_[1]; $T2H_SPLIT = '';},
+ verbose => 'obsolete, use -out_file instead',
+ noHelp => 2
+};
+
+$T2H_OBSOLETE_OPTIONS -> {section_navigation} =
+{
+ type => '!',
+ linkage => \$T2H_SECTION_NAVIGATION,
+ verbose => 'obsolete, use -sec_nav instead',
+ noHelp => 2,
+};
+
+$T2H_OBSOLETE_OPTIONS -> {verbose} =
+{
+ type => '!',
+ linkage => \$T2H_VERBOSE,
+ verbose => 'obsolete, use -Verbose instead',
+ noHelp => 2
+};
+
+# read initialzation from $sysconfdir/texi2htmlrc or $HOME/.texi2htmlrc
+my $home = $ENV{HOME};
+defined($home) or $home = '';
+foreach $i ('/usr/local/etc/texi2htmlrc', "$home/.texi2htmlrc") {
+    if (-f $i) {
+       print "# reading initialization file from $i\n" 
+           if ($T2H_VERBOSE);
+       require($i);
+    }
+}
+
+
+#+++############################################################################
+#                                                                              #
+# parse command-line options
+#                                                                              #
+#---############################################################################
+$T2H_USAGE_TEXT = <<EOT;
+Usage: texi2html  [OPTIONS] TEXINFO-FILE
+Translates Texinfo source documentation to HTML.
+EOT
+$T2H_FAILURE_TEXT = <<EOT;
+Try 'texi2html -help' for usage instructions.
+EOT
+$options = new Getopt::MySimple;
+
+# some older version of GetOpt::Long don't have 
+# Getopt::Long::Configure("pass_through")
+eval {Getopt::Long::Configure("pass_through");};
+$Configure_failed = $@ && <<EOT;
+**WARNING: Parsing of obsolete command-line options could have failed. 
+           Consider to use only documented command-line options (run
+           'texi2html -help 2' for a complete list) or upgrade to perl 
+           version 5.005 or higher.
+EOT
+
+if (! $options->getOptions($T2H_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
+{
+  print $Configure_failed if $Configure_failed;
+  die $T2H_FAILURE_TEXT;
+}
+
+if (@ARGV > 1)
+{
+  eval {Getopt::Long::Configure("no_pass_through");};
+  if (! $options->getOptions($T2H_OBSOLETE_OPTIONS, $T2H_USAGE_TEXT, "$THISVERSION\n"))
+  {
+    print $Configure_failed if $Configure_failed;
+    die $T2H_FAILURE_TEXT;
+  }
+}
+
+if ($T2H_CHECK) {
+    die "Need file to check\n$T2H_FAILURE_TEXT" unless @ARGV > 0;
+    &check;
+    exit;
+}
+
+#+++############################################################################
+#                                                                              #
+# evaluation of cmd line options
+#                                                                              #
+#---############################################################################
+
+if ($T2H_EXPAND eq 'info') 
+{
+  $to_skip{'ifinfo'} = 1;
+  $to_skip{'end ifinfo'} = 1;
+} 
+elsif ($T2H_EXPAND eq 'tex')
+{
+  $to_skip{'iftex'} = 1;
+  $to_skip{'end iftex'} = 1;
+  
+}
+
+$T2H_INVISIBLE_MARK = '<IMG SRC="invisible.xbm">' if $T2H_INVISIBLE_MARK eq 'xbm';
+
+#
+# file name buisness
+#
+die "Need exactly one file to translate\n$T2H_FAILURE_TEXT" unless @ARGV == 1;
+$docu = shift(@ARGV);
+if ($docu =~ /.*\//) {
+    chop($docu_dir = $&);
+    $docu_name = $';
+} else {
+    $docu_dir = '.';
+    $docu_name = $docu;
+}
+unshift(@T2H_INCLUDE_DIRS, $docu_dir);
+$docu_name =~ s/\.te?x(i|info)?$//;    # basename of the document
+$docu_name = $T2H_PREFIX if ($T2H_PREFIX);
+
+# subdir
+if ($T2H_SUBDIR && ! $T2H_OUT)
+{
+  $T2H_SUBDIR =~ s|/*$||;
+  unless (-d "$T2H_SUBDIR" && -w "$T2H_SUBDIR")
+  {
+    if ( mkdir($T2H_SUBDIR, oct(755)))
+    {
+      print "# created directory $T2H_SUBDIR\n" if ($T2H_VERBOSE);
+    }
+    else
+    {
+      warn "$ERROR can't create directory $T2H_SUBDIR. Put results into current directory\n";
+      $T2H_SUBDIR = '';
+    }
+  }
+}
+
+if ($T2H_SUBDIR && ! $T2H_OUT)
+{
+  $docu_rdir = "$T2H_SUBDIR/";
+  print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
+}
+else
+{
+  if ($T2H_OUT && $T2H_OUT =~ m|(.*)/|)
+  {
+    $docu_rdir = "$1/";
+    print "# putting result files into directory $docu_rdir\n" if ($T2H_VERBOSE);
+  }
+  else
+  {
+    print "# putting result files into current directory \n" if ($T2H_VERBOSE);
+    $docu_rdir = '';
+  }
+}
+
+# extension
+if ($T2H_SHORTEXTN)
+{
+  $docu_ext = "htm";
+}
+else
+{
+  $docu_ext = "html";
+}
+if ($T2H_TOP_FILE =~ /\..*$/)
+{
+  $T2H_TOP_FILE = $`.".$docu_ext";
+}
+
+# result files
+if (! $T2H_OUT && ($T2H_SPLIT =~ /section/i || $T2H_SPLIT =~ /node/i))
+{
+  $T2H_SPLIT = 'section';
+}
+elsif (! $T2H_OUT && $T2H_SPLIT =~ /chapter/i)
+{
+  $T2H_SPLIT = 'chapter'
+}
+else
+{
+  undef $T2H_SPLIT;
+}
+
+$docu_doc = "$docu_name.$docu_ext";            # document's contents
+$docu_doc_file = "$docu_rdir$docu_doc";
+if ($T2H_SPLIT) 
+{
+  $docu_toc  = $T2H_TOC_FILE || "${docu_name}_toc.$docu_ext"; # document's table of contents
+  $docu_stoc = "${docu_name}_ovr.$docu_ext"; # document's short toc
+  $docu_foot = "${docu_name}_fot.$docu_ext"; # document's footnotes
+  $docu_about = "${docu_name}_abt.$docu_ext"; # about this document
+  $docu_top  = $T2H_TOP_FILE || $docu_doc;
+}
+else
+{
+  if ($T2H_OUT)
+  {
+    $docu_doc = $T2H_OUT;
+    $docu_doc =~ s|.*/||;
+  }
+  $docu_toc = $docu_foot = $docu_stoc = $docu_about = $docu_top = $docu_doc;
+}
+
+$docu_toc_file  = "$docu_rdir$docu_toc";
+$docu_stoc_file = "$docu_rdir$docu_stoc";
+$docu_foot_file = "$docu_rdir$docu_foot";
+$docu_about_file = "$docu_rdir$docu_about";
+$docu_top_file  = "$docu_rdir$docu_top";
+
+$docu_frame_file =     "$docu_rdir${docu_name}_frame.$docu_ext";
+$docu_toc_frame_file = "$docu_rdir${docu_name}_toc_frame.$docu_ext";
+
+#
+# variables
+#
+$value{'html'} = 1;                    # predefine html (the output format)
+$value{'texi2html'} = $THISVERSION;    # predefine texi2html (the translator)
+# _foo: internal to track @foo
+foreach ('_author', '_title', '_subtitle',
+        '_settitle', '_setfilename', '_shorttitle') {
+    $value{$_} = '';                   # prevent -w warnings
+}
+%node2sec = ();                                # node to section name
+%sec2node = ();                                # section to node name
+%sec2number = ();                       # section to number
+%number2sec = ();                       # number to section 
+%idx2node = ();                         # index keys to node
+%node2href = ();                       # node to HREF
+%node2next = ();                       # node to next
+%node2prev = ();                       # node to prev
+%node2up   = ();                       # node to up
+%bib2href = ();                                # bibliography reference to HREF
+%gloss2href = ();                      # glossary term to HREF
+@sections = ();                                # list of sections
+%tag2pro = ();                         # protected sections
+
+#
+# initial indexes
+#
+$bib_num = 0;
+$foot_num = 0;
+$gloss_num = 0;
+$idx_num = 0;
+$sec_num = 0;
+$doc_num = 0;
+$html_num = 0;
+
+#
+# can I use ISO8879 characters? (HTML+)
+#
+if ($T2H_USE_ISO) {
+    $things_map{'bullet'} = "&bull;";
+    $things_map{'copyright'} = "&copy;";
+    $things_map{'dots'} = "&hellip;";
+    $things_map{'equiv'} = "&equiv;";
+    $things_map{'expansion'} = "&rarr;";
+    $things_map{'point'} = "&lowast;";
+    $things_map{'result'} = "&rArr;";
+}
+
+#
+# read texi2html extensions (if any)
+#
+$extensions = 'texi2html.ext'; # extensions in working directory
+if (-f $extensions) {
+    print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
+    require($extensions);
+}
+($progdir = $0) =~ s/[^\/]+$//;
+if ($progdir && ($progdir ne './')) {
+    $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory
+    if (-f $extensions) {
+       print "# reading extensions from $extensions\n" if $T2H_VERBOSE;
+       require($extensions);
+    }
+}
+
+
+print "# reading from $docu\n" if $T2H_VERBOSE;
+
+#########################################################################
+#
+# latex2html stuff
+# 
+# latex2html conversions consist of three stages:
+# 1) ToLatex: Put "latex" code into a latex file
+# 2) ToHtml: Use latex2html to generate corresponding html code and images
+# 3) FromHtml: Extract generated code and images from latex2html run
+#
+
+##########################
+# default settings
+#
+
+# defaults for files and names
+
+sub l2h_Init 
+{
+  local($root) = @_;
+  
+  return 0 unless ($root);
+  
+  $l2h_name =  "${root}_l2h";
+  
+  $l2h_latex_file = "$docu_rdir${l2h_name}.tex";
+  $l2h_cache_file = "${docu_rdir}l2h_cache.pm";
+  $T2H_L2H_L2H = "latex2html" unless ($T2H_L2H_L2H);
+  
+  # destination dir -- generated images are put there, should be the same
+  # as dir of enclosing html document -- 
+  $l2h_html_file = "$docu_rdir${l2h_name}.html";
+  $l2h_prefix = "${l2h_name}_";
+  return 1;
+}
+
+
+##########################
+# 
+# First stage: Generation of Latex file
+# Initialize with: l2h_InitToLatex
+# Add content with: l2h_ToLatex($text) --> HTML placeholder comment
+# Finish with: l2h_FinishToLatex
+# 
+
+$l2h_latex_preample = <<EOT;
+% This document was automatically generated by the l2h extenstion of texi2html
+% DO NOT EDIT !!!
+\\documentclass{article}
+\\usepackage{html}
+\\begin{document}
+EOT
+
+$l2h_latex_closing = <<EOT;
+\\end{document}
+EOT
+
+# return used latex 1, if l2h could be initalized properly, 0 otherwise
+sub l2h_InitToLatex
+{
+  %l2h_to_latex = ();
+  unless ($T2H_L2H_SKIP)
+  {
+    unless (open(L2H_LATEX, ">$l2h_latex_file"))
+    {
+      warn "$ERROR Error l2h: Can't open latex file '$latex_file' for writing\n";
+      return 0;
+    }  
+    print "# l2h: use ${l2h_latex_file} as latex file\n" if ($T2H_VERBOSE);
+    print L2H_LATEX $l2h_latex_preample;
+  }
+  # open database for caching
+  l2h_InitCache();
+  $l2h_latex_count = 0;
+  $l2h_to_latex_count = 0;
+  $l2h_cached_count = 0;
+  return  1;
+}
+
+# print text (1st arg) into latex file (if not already there), return
+# HTML commentary which can be later on replaced by the latex2html
+# generated text
+sub l2h_ToLatex
+{
+  my($text) = @_;
+  my($count);
+  
+  $l2h_to_latex_count++;
+  $text =~ s/(\s*)$//;
+  
+  # try whether we can cache it
+  my $cached_text = l2h_FromCache($text);
+  if ($cached_text)
+  {
+    $l2h_cached_count++;
+    return $cached_text;
+  }
+  
+  # try whether we have text already on things to do
+  unless ($count = $l2h_to_latex{$text})
+  {
+    $count = $l2h_latex_count;
+    $l2h_latex_count++;
+    $l2h_to_latex{$text} = $count;
+    $l2h_to_latex[$count] = $text;
+    unless ($T2H_L2H_SKIP)
+    {
+      print L2H_LATEX "\\begin{rawhtml}\n";
+      print L2H_LATEX "<!-- l2h_begin ${l2h_name} ${count} -->\n";
+      print L2H_LATEX "\\end{rawhtml}\n";
+      
+      print L2H_LATEX "$text\n";
+      
+      print L2H_LATEX "\\begin{rawhtml}\n";
+      print L2H_LATEX "<!-- l2h_end ${l2h_name} ${count} -->\n";
+      print L2H_LATEX "\\end{rawhtml}\n";
+    }
+  }
+  return "<!-- l2h_replace ${l2h_name} ${count} -->"; 
+}
+
+# print closing into latex file and close it
+sub l2h_FinishToLatex
+{
+  local ($reused);
+  
+  $reused = $l2h_to_latex_count - $l2h_latex_count - $l2h_cached_count;
+  unless ($T2H_L2H_SKIP)
+  {
+    print L2H_LATEX $l2h_latex_closing;
+    close(L2H_LATEX);
+  }
+  print "# l2h: finished to latex ($l2h_cached_count cached, $reused reused, $l2h_latex_count contents)\n" if ($T2H_VERBOSE);
+  unless ($l2h_latex_count)
+  {
+    l2h_Finish();
+    return 0;
+  }
+  return 1;
+}
+
+###################################
+# Second stage: Use latex2html to generate corresponding html code and images
+#
+# l2h_ToHtml([$l2h_latex_file, [$l2h_html_dir]]):
+#   Call latex2html on $l2h_latex_file
+#   Put images (prefixed with $l2h_name."_") and html file(s) in $l2h_html_dir
+#   Return 1, on success
+#          0, otherwise
+#
+sub l2h_ToHtml
+{
+  local($call, $ext, $root, $dotbug);
+  
+  if ($T2H_L2H_SKIP)
+  {
+    print "# l2h: skipping latex2html run\n" if ($T2H_VERBOSE);
+    return 1;
+  }
+  
+  # Check for dot in directory where dvips will work
+  if ($T2H_L2H_TMP)
+  {
+    if ($T2H_L2H_TMP =~ /\./)
+    {
+      warn "$ERROR Warning l2h: l2h_tmp dir contains a dot. Use /tmp, instead\n";
+      $dotbug = 1;
+    }
+  }
+  else
+  {
+    if (&getcwd =~ /\./)
+    {
+     warn "$ERROR Warning l2h: current dir contains a dot. Use /tmp as l2h_tmp dir \n";
+     $dotbug = 1;
+   }
+  }
+  # fix it, if necessary and hope that it works 
+  $T2H_L2H_TMP = "/tmp" if ($dotbug);
+    
+  $call = $T2H_L2H_L2H;
+  # use init file, if specified
+  $call = $call . " -init_file " . $init_file if ($init_file && -f $init_file);
+  # set output dir
+  $call .=  ($docu_rdir ? " -dir $docu_rdir" : " -no_subdir");
+  # use l2h_tmp, if specified
+  $call = $call . " -tmp $T2H_L2H_TMP" if ($T2H_L2H_TMP);
+  # options we want to be sure of
+  $call = $call ." -address 0 -info 0 -split 0 -no_navigation -no_auto_link";
+  $call = $call ." -prefix ${l2h_prefix} $l2h_latex_file"; 
+
+  print "# l2h: executing '$call'\n" if ($T2H_VERBOSE);
+  if (system($call))
+  {
+    warn "l2h ***Error: '${call}' did not succeed\n";
+    return 0;
+  }
+  else
+  {
+    print "# l2h: latex2html finished successfully\n" if ($T2H_VERBOSE);
+    return 1;
+  }
+}
+
+# this is directly pasted over from latex2html
+sub getcwd {
+    local($_) = `pwd`;
+
+    die "'pwd' failed (out of memory?)\n"
+       unless length;
+    chop;
+    $_;
+}
+
+
+##########################
+# Third stage: Extract generated contents from latex2html run
+# Initialize with: l2h_InitFromHtml
+#   open $l2h_html_file for reading
+#   reads in contents into array indexed by numbers
+#   return 1,  on success -- 0, otherwise
+# Extract Html code with: l2h_FromHtml($text)
+#   replaces in $text all previosuly inserted comments by generated html code
+#   returns (possibly changed) $text
+# Finish with: l2h_FinishFromHtml
+#   closes $l2h_html_dir/$l2h_name.".$docu_ext" 
+
+sub l2h_InitFromHtml
+{
+  local($h_line, $h_content, $count, %l2h_img);
+
+  if (! open(L2H_HTML, "<${l2h_html_file}"))
+  {
+    print "$ERROR Error l2h: Can't open ${l2h_html_file} for reading\n";
+    return 0;
+  }
+  print "# l2h: use ${l2h_html_file} as html file\n" if ($T2H_VERBOSE);
+
+  $l2h_html_count = 0;
+  
+  while ($h_line = <L2H_HTML>)
+  {
+    if ($h_line =~ /^<!-- l2h_begin $l2h_name ([0-9]+) -->/)
+    {
+      $count = $1;
+      $h_content = "";
+      while ($h_line = <L2H_HTML>)
+      {
+       if ($h_line =~ /^<!-- l2h_end $l2h_name $count -->/)
+       {
+         chomp $h_content;
+         chomp $h_content;
+         $l2h_html_count++;
+         $h_content = l2h_ToCache($count, $h_content);
+         $l2h_from_html[$count] = $h_content;
+         $h_content = '';
+         last;
+       }
+       $h_content = $h_content.$h_line;
+      }
+      if ($hcontent)
+      {
+       print "$ERROR Warning l2h: l2h_end $l2h_name $count not found\n" 
+         if ($T2H_VERBOSE);
+       close(L2H_HTML);
+       return 0;
+      }
+    }
+  }
+  print "# l2h: Got $l2h_html_count of $l2h_latex_count html contents\n"
+    if ($T2H_VERBOSE);
+
+  close(L2H_HTML);
+  return 1;
+}
+
+sub l2h_FromHtml
+{
+  local($text) = @_;
+  local($done, $to_do, $count);
+  
+  $to_do = $text;
+  
+  while ($to_do =~ /([^\000]*)<!-- l2h_replace $l2h_name ([0-9]+) -->([^\000]*)/)
+  {
+    $to_do = $1;
+    $count = $2;
+    $done = $3.$done;
+    
+    $done = "<!-- l2h_end $l2h_name $count -->".$done
+      if ($T2H_DEBUG & $DEBUG_L2H);
+
+    $done = &l2h_ExtractFromHtml($count) . $done;
+
+    $done = "<!-- l2h_begin $l2h_name $count -->".$done
+      if ($T2H_DEBUG & $DEBUG_L2H);
+  }
+  return $to_do.$done;
+}
+
+
+sub l2h_ExtractFromHtml
+{
+  local($count) = @_;
+  
+  return $l2h_from_html[$count] if ($l2h_from_html[$count]);
+  
+  if ($count >= 0 && $count < $l2h_latex_count)
+  {
+    # now we are in trouble
+    local($l_l2h, $_);
+
+    $l2h_extract_error++;
+    print "$ERROR l2h: can't extract content $count from html\n" 
+      if ($T2H_VERBOSE);
+    # try simple (ordinary) substition (without l2h)
+    $l_l2h = $T2H_L2H;
+    $T2H_L2H = 0;
+    $_ = $l2h_to_latex{$count};
+    $_ = &substitute_style($_); 
+    &unprotect_texi;
+    $_ = "<!-- l2h: ". __LINE__ . " use texi2html -->" . $_
+      if ($T2H_DEBUG & $DEBUG_L2H);
+    $T2H_L2H = $l_l2h;
+    return $_;
+  }
+  else
+  {
+    # now we have been incorrectly called
+    $l2h_range_error++;
+    print "$ERROR l2h: Request of $count content which is out of valide range [0,$l2h_latex_count)\n";
+    return "<!-- l2h: ". __LINE__ . " out of range count $count -->"
+      if ($T2H_DEBUG & $DEBUG_L2H);
+    return "<!-- l2h: out of range count $count -->";
+  }
+}
+    
+sub l2h_FinishFromHtml
+{
+  if ($T2H_VERBOSE)
+  {
+    if ($l2h_extract_error + $l2h_range_error)
+    {
+      print "# l2h: finished from html ($l2h_extract_error extract and $l2h_range_error errors)\n";
+    }
+    else
+    {
+      print "# l2h: finished from html (no errors)\n";
+    }
+  }
+}
+
+sub l2h_Finish
+{
+  l2h_StoreCache();
+  if ($T2H_L2H_CLEAN)
+  {
+    print "# l2h: removing temporary files generated by l2h extension\n"
+      if $T2H_VERBOSE;
+    while (<"$docu_rdir$l2h_name"*>)
+    {
+      unlink $_;
+    }
+  }
+  print "# l2h: Finished\n" if $T2H_VERBOSE;
+  return 1;
+}
+
+##############################
+# stuff for l2h caching
+#
+
+# I tried doing this with a dbm data base, but it did not store all
+# keys/values. Hence, I did as latex2html does it
+sub l2h_InitCache
+{
+  if (-r "$l2h_cache_file")
+  {
+    my $rdo = do "$l2h_cache_file";
+    warn("$ERROR l2h Error: could not load $docu_rdir$l2h_cache_file: $@\n")
+      unless ($rdo);
+  }
+}
+
+sub l2h_StoreCache
+{
+  return unless $l2h_latex_count;
+  
+  my ($key, $value);
+  open(FH, ">$l2h_cache_file") || return warn"$ERROR l2h Error: could not open $docu_rdir$l2h_cache_file for writing: $!\n";
+
+  
+  while (($key, $value) = each %l2h_cache)
+  {
+    # escape stuff
+    $key =~ s|/|\\/|g;
+    $key =~ s|\\\\/|\\/|g;
+    # weird, a \ at the end of the key results in an error
+    # maybe this also broke the dbm database stuff
+    $key =~ s|\\$|\\\\|;
+    $value =~ s/\|/\\\|/g; 
+    $value =~ s/\\\\\|/\\\|/g; 
+    $value =~ s|\\\\|\\\\\\\\|g;
+    print FH "\n\$l2h_cache_key = q/$key/;\n";
+    print FH "\$l2h_cache{\$l2h_cache_key} = q|$value|;\n";
+  }
+  print FH "1;";
+  close(FH);
+}
+
+# return cached html, if it exists for text, and if all pictures
+# are there, as well
+sub l2h_FromCache
+{
+  my $text = shift;
+  my $cached = $l2h_cache{$text};
+  if ($cached)
+  {
+    while ($cached =~ m/SRC="(.*?)"/g)
+    {
+      unless (-e "$docu_rdir$1")
+      {
+       return undef;
+      }
+    }
+    return $cached;
+  }
+  return undef;
+}
+
+# insert generated html into cache, move away images, 
+# return transformed html
+$maximage = 1;
+sub l2h_ToCache
+{
+  my $count = shift;
+  my $content = shift;
+  my @images = ($content =~ /SRC="(.*?)"/g);
+  my ($src, $dest);
+
+  for $src (@images)
+  {
+    $dest = $l2h_img{$src};
+    unless ($dest)
+    {
+      my $ext;
+      if ($src =~ /.*\.(.*)$/ && $1 ne $docu_ext)
+      {
+       $ext = $1;
+      }
+      else
+      {
+       warn "$ERROR: L2h image $src has invalid extension\n";
+       next;
+      }
+      while (-e "$docu_rdir${docu_name}_$maximage.$ext") { $maximage++;}
+      $dest = "${docu_name}_$maximage.$ext";
+      system("cp -f $docu_rdir$src $docu_rdir$dest");
+      $l2h_img{$src} = $dest;
+      unlink "$docu_rdir$src" unless ($DEBUG & DEBUG_L2H);
+    }
+    $content =~ s/$src/$dest/g;
+  }
+  $l2h_cache{$l2h_to_latex[$count]} = $content;
+  return $content;
+}
+
+
+#+++############################################################################
+#                                                                              #
+# Pass 1: read source, handle command, variable, simple substitution           #
+#                                                                              #
+#---############################################################################
+
+@lines = ();                           # whole document
+@toc_lines = ();                       # table of contents
+@stoc_lines = ();                      # table of contents
+$curlevel = 0;                         # current level in TOC
+$node = '';                            # current node name
+$node_next = '';                        # current node next name               
+$node_prev = '';                        # current node prev name
+$node_up = '';                          # current node up name
+$in_table = 0;                         # am I inside a table
+$table_type = '';                      # type of table ('', 'f', 'v', 'multi')
+@tables = ();                          # nested table support
+$in_bibliography = 0;                  # am I inside a bibliography
+$in_glossary = 0;                      # am I inside a glossary
+$in_top = 0;                           # am I inside the top node
+$has_top = 0;                          # did I see a top node?
+$has_top_command = 0;                  # did I see @top for automatic pointers?
+$in_pre = 0;                           # am I inside a preformatted section
+$in_list = 0;                          # am I inside a list
+$in_html = 0;                          # am I inside an HTML section
+$first_line = 1;                       # is it the first line
+$dont_html = 0;                                # don't protect HTML on this line
+$deferred_ref = '';                    # deferred reference for indexes
+@html_stack = ();                      # HTML elements stack
+$html_element = '';                    # current HTML element
+&html_reset;
+%macros = ();                           # macros
+
+# init l2h
+$T2H_L2H = &l2h_Init($docu_name) if ($T2H_L2H);
+$T2H_L2H = &l2h_InitToLatex      if ($T2H_L2H);    
+
+# build code for simple substitutions
+# the maps used (%simple_map and %things_map) MUST be aware of this
+# watch out for regexps, / and escaped characters!
+$subst_code = '';
+foreach (keys(%simple_map)) {
+    ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars
+    $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n";
+}
+foreach (keys(%things_map)) {
+    $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n";
+}
+if ($use_acc) {
+    # accentuated characters
+    foreach (keys(%accent_map)) {
+       if ($_ eq "`") {
+           $subst_code .= "s/$;3";
+       } elsif ($_ eq "'") {
+           $subst_code .= "s/$;4";
+       } else {
+           $subst_code .= "s/\\\@\\$_";
+       }
+       $subst_code .= "([a-z])/&\${1}$accent_map{$_};/gi;\n";
+    }
+}
+eval("sub simple_substitutions { $subst_code }");
+
+&init_input;
+INPUT_LINE: while ($_ = &next_line) {
+    #
+    # remove \input on the first lines only
+    #
+    if ($first_line) {
+       next if /^\\input/;
+       $first_line = 0;
+    }
+    # non-@ substitutions cf. texinfmt.el
+    #
+    # parse texinfo tags
+    #
+    $tag = '';
+    $end_tag = '';
+    if (/^\s*\@end\s+(\w+)\b/) {
+       $end_tag = $1;
+    } elsif (/^\s*\@(\w+)\b/) {
+       $tag = $1;
+    }
+    #
+    # handle @html / @end html
+    #
+    if ($in_html) {
+       if ($end_tag eq 'html') {
+           $in_html = 0;
+       } else {
+           $tag2pro{$in_html} .= $_;
+       }
+       next;
+    } elsif ($tag eq 'html') {
+       $in_html = $PROTECTTAG . ++$html_num;
+       push(@lines, $in_html);
+       next;
+    }
+
+    #
+    # try to remove inlined comments
+    # syntax from tex-mode.el comment-start-skip
+    #
+    s/((^|[^\@])(\@\@)*)\@c(omment | |\{|$).*/$1/;
+
+# Sometimes I use @c right at the end of  a line ( to suppress the line feed )
+#    s/((^|[^\@])(\@\@)*)\@c(omment)?$/$1/;
+#     s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/;
+#     s/(.*)\@c{.*?}(.*)/$1$2/;
+#     s/(.*)\@comment{.*?}(.*)/$1$2/;
+#     s/^(.*)\@c /$1/;
+#     s/^(.*)\@comment /$1/;
+
+    #############################################################
+    # value substitution before macro expansion, so that
+    # it works in macro arguments                          
+    s/\@value{($VARRE)}/$value{$1}/eg;
+                           
+    #############################################################
+    # macro substitution
+    while (/\@(\w+)/g)
+    {
+      if (exists($macros->{$1}))    
+      {
+       my $before = $`;
+       my $name = $1;
+       my $after = $';
+       my @args;
+       my $args;
+       if ($after =~ /^\s*{(.*?[^\\])}(.*)/)  
+       {
+         $args = $1;
+         $after = $2;
+       }
+       elsif (@{$macros->{$name}->{Args}} == 1)
+       {
+         $args = $after;
+         $args =~ s/^\s*//;
+         $args =~ s/\s*$//;
+         $after = '';
+       }
+       $args =~ s|\\\\|\\|g;
+       $args =~ s|\\{|{|g;
+        $args =~ s|\\}|}|g;
+       if (@{$macros->{$name}->{Args}} > 1)
+       {
+         $args =~ s/(^|[^\\]),/$1$;/g ;
+         $args =~ s|\\,|,|g;
+         @args = split(/$;\s*/, $args) if (@{$macros->{$name}->{Args}} > 1);
+       }
+       else
+       {
+         $args =~ s|\\,|,|g;
+         @args = ($args);
+       }
+       my $macrobody = $macros->{$name}->{Body};
+       for ($i=0; $i<=$#args; $i++)
+       {
+         $macrobody =~ s|\\$macros->{$name}->{Args}->[$i]\\|$args[$i]|g;
+       }
+       $macrobody =~ s|\\\\|\\|g;
+       $_ = $before . $macrobody . $after;
+       unshift @input_spool, map {$_ = $_."\n"} split(/\n/, $_);
+       next INPUT_LINE;
+      }
+    }                          #
+                           
+    
+    #
+    # try to skip the line
+    #
+    if ($end_tag) {
+        $in_titlepage = 0 if $end_tag eq 'titlepage';
+       next if $to_skip{"end $end_tag"};
+    } elsif ($tag) {
+      $in_titlepage = 1 if $tag eq 'titlepage';
+      next if $to_skip{$tag};
+      last if $tag eq 'bye';
+    }
+    if ($in_top) {
+       # parsing the top node
+       if ($tag eq 'node' || 
+           ($sec2level{$tag} && $tag !~ /unnumbered/ && $tag !~ /heading/))
+       {
+           # no more in top
+           $in_top = 0;
+           push(@lines, $TOPEND);
+       }
+    }
+    unless ($in_pre) {
+       s/``/\"/g;
+       s/''/\"/g;
+       s/([\w ])---([\w ])/$1--$2/g;
+    }
+    #
+    # analyze the tag
+    #
+    if ($tag) {
+       # skip lines
+       &skip_until($tag), next if $tag eq 'ignore';
+       &skip_until($tag), next if $tag eq 'ifnothtml';
+       if ($tag eq 'ifinfo')
+       {
+         &skip_until($tag), next unless $T2H_EXPAND eq 'info';
+       }
+       if ($tag eq 'iftex')
+       {
+         &skip_until($tag), next unless $T2H_EXPAND eq 'tex';
+       } 
+       if ($tag eq 'tex')
+       {
+         # add to latex2html file
+         if ($T2H_EXPAND eq 'tex' && $T2H_L2H && ! $in_pre)
+         {
+           # add space to the end -- tex(i2dvi) does this, as well 
+           push(@lines, &l2h_ToLatex(&string_until($tag) . " "));
+         }
+         else
+         {
+           &skip_until($tag);
+         }
+         next;
+       }
+       if ($tag eq 'titlepage')
+       {
+         next;
+       }
+       # handle special tables
+       if ($tag =~ /^(|f|v|multi)table$/) {
+           $table_type = $1;
+           $tag = 'table';
+       }
+       # special cases
+       if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) {
+           $in_top = 1;
+           $has_top = 1;
+           $has_top_command = 1 if $tag eq 'top';
+           @lines = (); # ignore all lines before top (title page garbage)
+           next;
+       } elsif ($tag eq 'node') {
+         if ($in_top)
+         {
+           $in_top = 0;
+           push(@lines, $TOPEND);
+         }
+         warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o;
+         # request of "Richard Y. Kim" <ryk@ap.com>
+         s/^\@node\s+//;
+         $_ = &protect_html($_); # if node contains '&' for instance
+         ($node, $node_next, $node_prev, $node_up) = split(/,/);
+         &normalise_node($node);
+         &normalise_node($node_next);
+         &normalise_node($node_prev);
+         &normalise_node($node_up);
+         $node =~ /\"/ ?
+           push @lines, &html_debug("<A NAME='$node'></A>\n", __LINE__) :
+           push @lines, &html_debug("<A NAME=\"$node\"></A>\n", __LINE__);
+         next;
+       } elsif ($tag eq 'include') {
+           if (/^\@include\s+($FILERE)\s*$/o) {
+               $file = LocateIncludeFile($1);
+               if ($file && -e $file) {
+                   &open($file);
+                   print "# including $file\n" if $T2H_VERBOSE;
+               } else {
+                   warn "$ERROR Can't find $1, skipping";
+               }
+           } else {
+               warn "$ERROR Bad include line: $_";
+           }
+           next;
+       } elsif ($tag eq 'ifclear') {
+           if (/^\@ifclear\s+($VARRE)\s*$/o) {
+               next unless defined($value{$1});
+               &skip_until($tag);
+           } else {
+               warn "$ERROR Bad ifclear line: $_";
+           }
+           next;
+       } elsif ($tag eq 'ifset') {
+           if (/^\@ifset\s+($VARRE)\s*$/o) {
+               next if defined($value{$1});
+               &skip_until($tag);
+           } else {
+               warn "$ERROR Bad ifset line: $_";
+           }
+           next;
+       } elsif ($tag eq 'menu') {
+           unless ($T2H_SHOW_MENU) {
+               &skip_until($tag);
+               next;
+           }
+           &html_push_if($tag);
+           push(@lines, &html_debug('', __LINE__));
+       } elsif ($format_map{$tag}) {
+           $in_pre = 1 if $format_map{$tag} eq 'PRE';
+           &html_push_if($format_map{$tag});
+           push(@lines, &html_debug('', __LINE__));
+           $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ;
+#          push(@lines, &debug("<BLOCKQUOTE>\n", __LINE__))
+#            if $tag =~ /example/i;
+           # sunshine@sunshineco.com: <PRE>bla</PRE> looks better than
+           # <PRE>\nbla</PRE> (at least on NeXTstep browser
+           push(@lines, &debug("<$format_map{$tag}>" . 
+                               ($in_pre ? '' : "\n"), __LINE__));
+           next;
+       }
+       elsif (exists $complex_format_map->{$tag})
+       {
+         my $start = eval $complex_format_map->{$tag}->[0];
+         if ($@)
+         {
+           print "$ERROR: eval of complex_format_map->{$tag}->[0] $complex_format_map->{$tag}->[0]: $@";
+           $start = '<pre>'
+         }
+         $in_pre = 1 if $start =~ /<pre/;
+         push(@lines, html_debug($start. ($in_pre ? '' : "\n"), __LINE__));
+         next;
+       } elsif ($tag eq 'table') {
+         # anorland@hem2.passagen.se
+         # if (/^\s*\@(|f|v|multi)table\s+\@(\w+)/) {
+            if (/^\s*\@(|f|v|multi)table\s+\@(\w+)|(\{[^\}]*\})/) {
+               $in_table = $2;
+               unshift(@tables, join($;, $table_type, $in_table));
+               if ($table_type eq "multi") {
+                   # don't use borders -- gets confused by empty cells
+                   push(@lines, &debug("<TABLE>\n", __LINE__));
+                   &html_push_if('TABLE');
+               } else {
+                   push(@lines, &debug("<DL COMPACT>\n", __LINE__));
+                   &html_push_if('DL');
+               }
+               push(@lines, &html_debug('', __LINE__));
+           } else {
+               warn "$ERROR Bad table line: $_";
+           }
+           next;
+       } 
+       elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') 
+       {
+         if (/^\@$tag\s+(\w+)\s+(\w+)\s*$/) 
+         {
+           my $from = $1;
+           my $to = $2;
+           my $prefix_from = IndexName2Prefix($from);
+           my $prefix_to = IndexName2Prefix($to);
+
+           warn("$ERROR unknown from index name $from ind syn*index line: $_"), next
+             unless $prefix_from;
+           warn("$ERROR unknown to index name $to ind syn*index line: $_"), next
+             unless $prefix_to;
+
+           if ($tag eq 'syncodeindex')
+           {
+             $index_properties->{$prefix_to}->{'from_code'}->{$prefix_from} = 1;
+           }
+           else
+           {
+              $index_properties->{$prefix_to}->{'from'}->{$prefix_from} = 1;
+           }
+         } 
+         else 
+         {
+           warn "$ERROR Bad syn*index line: $_";
+         }
+         next;
+       } 
+       elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') 
+       {
+         if (/^\@$tag\s+(\w+)\s*$/) 
+         {
+           my $name = $1;
+           $index_properties->{$name}->{name} = $name;
+           $index_properties->{$name}->{code} = 1 if $tag eq 'defcodeindex';
+         } 
+         else 
+         {
+           warn "$ERROR Bad defindex line: $_";
+         }
+         next;
+       }
+       elsif (/^\@printindex/)
+       {
+         push (@lines, "<!--::${section}::-->$_");
+         next;
+       }
+       elsif ($tag eq 'sp') {
+           push(@lines, &debug("<P>\n", __LINE__));
+           next;
+       } elsif ($tag eq 'center') {
+           push(@lines, &debug("<center>\n", __LINE__));
+           s/\@center//;
+       } elsif ($tag eq 'setref') {
+           &protect_html; # if setref contains '&' for instance
+           if (/^\@$tag\s*{($NODERE)}\s*$/) {
+               $setref = $1;
+               $setref =~ s/\s+/ /g; # normalize
+               $setref =~ s/ $//;
+               $node2sec{$setref} = $name;
+               $sec2node{$name} = $setref;
+               $node2href{$setref} = "$docu_doc#$docid";
+           } else {
+               warn "$ERROR Bad setref line: $_";
+           }
+           next;
+       } elsif ($tag eq 'lowersections') {
+           local ($sec, $level);
+           while (($sec, $level) = each %sec2level) {
+               $sec2level{$sec} = $level + 1;
+           }
+           next;
+       } elsif ($tag eq 'raisesections') {
+           local ($sec, $level);
+           while (($sec, $level) = each %sec2level) {
+               $sec2level{$sec} = $level - 1;
+           }
+           next;
+       }
+       elsif ($tag eq 'macro' || $tag eq 'rmacro')
+       {
+         if (/^\@$tag\s*(\w+)\s*(.*)/)
+         {
+           my $name = $1;
+           my @args;
+           @args = split(/\s*,\s*/ , $1)
+             if ($2 =~ /^\s*{(.*)}\s*/);
+           
+           $macros->{$name}->{Args} = \@args;
+           $macros->{$name}->{Body} = '';
+           while (($_ = &next_line) && $_ !~ /\@end $tag/)
+           {
+             $macros->{$name}->{Body} .= $_;
+           }
+           die "ERROR: No closing '\@end $tag' found for macro definition of '$name'\n"
+             unless (/\@end $tag/);
+           chomp $macros->{$name}->{Body};
+         }
+         else
+         {
+           warn "$ERROR: Bad macro defintion $_"
+         }
+         next;
+       }
+       elsif ($tag eq 'unmacro')
+       {
+         delete $macros->{$1} if (/^\@unmacro\s*(\w+)/);
+         next;
+       }
+       elsif ($tag eq 'documentlanguage')
+       {
+         SetDocumentLanguage($1) if (!$T2H_LANG && /documentlanguage\s*(\w+)/);
+       }
+       elsif (defined($def_map{$tag})) {
+           if ($def_map{$tag}) {
+               s/^\@$tag\s+//;
+               $tag = $def_map{$tag};
+               $_ = "\@$tag $_";
+               $tag =~ s/\s.*//;
+           }
+       } elsif (defined($user_sub{$tag})) {
+           s/^\@$tag\s+//;
+           $sub = $user_sub{$tag};
+           print "# user $tag = $sub, arg: $_" if $T2H_DEBUG & $DEBUG_USER;
+           if (defined(&$sub)) {
+               chop($_);
+               &$sub($_);
+           } else {
+               warn "$ERROR Bad user sub for $tag: $sub\n";
+           }
+           next;
+         } 
+       if (defined($def_map{$tag})) {
+           s/^\@$tag\s+//;
+           if ($tag =~ /x$/) {
+               # extra definition line
+               $tag = $`;
+               $is_extra = 1;
+           } else {
+               $is_extra = 0;
+           }
+           while (/\{([^\{\}]*)\}/) {
+               # this is a {} construct
+               ($before, $contents, $after) = ($`, $1, $');
+               # protect spaces
+               $contents =~ s/\s+/$;9/g;
+               # restore $_ protecting {}
+               $_ = "$before$;7$contents$;8$after";
+           }
+           @args = split(/\s+/, &protect_html($_));
+           foreach (@args) {
+               s/$;9/ /g;      # unprotect spaces
+               s/$;7/\{/g;     # ... {
+               s/$;8/\}/g;     # ... }
+           }
+           $type = shift(@args);
+           $type =~ s/^\{(.*)\}$/$1/;
+           print "# def ($tag): {$type} ", join(', ', @args), "\n"
+               if $T2H_DEBUG & $DEBUG_DEF;
+           $type .= ':'; # it's nicer like this
+           my $name = shift(@args);
+           $name =~ s/^\{(.*)\}$/$1/;
+           if ($is_extra) {
+               $_ = &debug("<DT>", __LINE__);
+           } else {
+               $_ = &debug("<DL>\n<DT>", __LINE__);
+           }
+           if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') {
+               $_ .= "<U>$type</U> <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr'
+                    || $tag eq 'defcv' || $tag eq 'defop') {
+               $ftype = $name;
+               $name = shift(@args);
+               $name =~ s/^\{(.*)\}$/$1/;
+               $_ .= "<U>$type</U> $ftype <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           } else {
+               warn "$ERROR Unknown definition type: $tag\n";
+               $_ .= "<U>$type</U> <B>$name</B>";
+               $_ .= " <I>@args</I>" if @args;
+           }
+           $_ .= &debug("\n<DD>", __LINE__);
+           $name = &unprotect_html($name);
+           if ($tag eq 'deffn' || $tag eq 'deftypefn') {
+             EnterIndexEntry('f', $name, $docu_doc, $section, \@lines);
+#              unshift(@input_spool, "\@findex $name\n");
+           } elsif ($tag eq 'defop') {
+             EnterIndexEntry('f', "$name on $ftype", $docu_doc, $section, \@lines);
+#              unshift(@input_spool, "\@findex $name on $ftype\n");
+           } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') {
+             EnterIndexEntry('v', $name, $docu_doc, $section, \@lines);
+#              unshift(@input_spool, "\@vindex $name\n");
+           } else {
+             EnterIndexEntry('t', $name, $docu_doc, $section, \@lines);
+#              unshift(@input_spool, "\@tindex $name\n");
+           }
+           $dont_html = 1;
+       }
+    } elsif ($end_tag) {
+       if ($format_map{$end_tag}) {
+           $in_pre = 0 if $format_map{$end_tag} eq 'PRE';
+           $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ;
+           &html_pop_if('P');
+           &html_pop_if('LI');
+           &html_pop_if();
+           push(@lines, &debug("</$format_map{$end_tag}>\n", __LINE__));
+           push(@lines, &html_debug('', __LINE__));
+       }
+       elsif (exists $complex_format_map->{$end_tag})
+       {
+         my $end = eval $complex_format_map->{$end_tag}->[1];
+         if ($@)
+         {
+           print "$ERROR: eval of complex_format_map->{$end_tag}->[1] $complex_format_map->{$end_tag}->[0]: $@";
+           $end = '</pre>'
+         }
+         $in_pre = 0 if $end =~ m|</pre>|;
+         push(@lines, html_debug($end, __LINE__));
+       } elsif ($end_tag =~ /^(|f|v|multi)table$/) {
+           unless (@tables) {
+               warn "$ERROR \@end $end_tag without \@*table\n";
+               next;
+           }
+           &html_pop_if('P');
+           ($table_type, $in_table) = split($;, shift(@tables));
+           unless ($1 eq $table_type) {
+               warn "$ERROR \@end $end_tag without matching \@$end_tag\n";
+               next;
+           }
+           if ($table_type eq "multi") {
+               push(@lines, "</TR></TABLE>\n");
+               &html_pop_if('TR');
+           } else {
+               push(@lines, "</DL>\n");
+               &html_pop_if('DD');
+           }
+           &html_pop_if();
+           if (@tables) {
+               ($table_type, $in_table) = split($;, $tables[0]);
+           } else {
+               $in_table = 0;
+           }
+       } elsif (defined($def_map{$end_tag})) {
+           push(@lines, &debug("</DL>\n", __LINE__));
+       } elsif ($end_tag eq 'menu') {
+           &html_pop_if();
+           push(@lines, $_); # must keep it for pass 2
+       } 
+       next;
+    }
+    #############################################################
+    # anchor insertion
+    while (/\@anchor\s*\{(.*?)\}/)
+    {
+      $_ = $`.$';
+      my $anchor = $1;
+      $anchor = &normalise_node($anchor);
+      push @lines, &html_debug("<A NAME=\"$anchor\"></A>\n");
+      $node2href{$anchor} = "$docu_doc#$anchor";
+      next INPUT_LINE if $_ =~ /^\s*$/;
+    }
+
+    #############################################################
+    # index entry generation, after value substitutions
+    if (/^\@(\w+?)index\s+/)
+    {
+      EnterIndexEntry($1, $', $docu_doc, $section, \@lines);
+      next;
+    }
+    #
+    # protect texi and HTML things
+    &protect_texi;
+    $_ = &protect_html($_) unless $dont_html;
+    $dont_html = 0;
+    # substitution (unsupported things)
+    s/^\@exdent\s+//g;
+    s/\@noindent\s+//g;
+    s/\@refill\s+//g;
+    # other substitutions
+    &simple_substitutions;
+    s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4
+    #
+    # analyze the tag again
+    #
+    if ($tag) {
+      if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) {
+           if (/^\@$tag\s+(.+)$/) {
+               $name = $1;
+               $name = &normalise_node($name);
+               $level = $sec2level{$tag};
+               # check for index
+               $first_index_chapter = $name
+                 if ($level == 1 && !$first_index_chapter && 
+                     $name =~ /index/i);
+               if ($in_top && /heading/){
+                   $T2H_HAS_TOP_HEADING = 1;
+                    $_ = &debug("<H$level>$name</H$level>\n", __LINE__);
+                   &html_push_if('body');
+                   print "# top heading, section $name, level $level\n"
+                       if $T2H_DEBUG & $DEBUG_TOC;
+               }
+               else
+               {
+                 unless (/^\@\w*heading/)
+                 {
+                   unless (/^\@unnumbered/)
+                   {
+                     my $number = &update_sec_num($tag, $level);
+                     $name = $number. ' ' . $name if $T2H_NUMBER_SECTIONS;
+                     $sec2number{$name} = $number;
+                     $number2sec{$number} = $name;
+                   }
+                   if (defined($toplevel))
+                   {
+                     push @lines, ($level==$toplevel ? $CHAPTEREND : $SECTIONEND);
+                   }
+                   else
+                   {
+                     # first time we see a "section"
+                     unless ($level == 1) 
+                     {
+                       warn "$WARN The first section found is not of level 1: $_";
+                     }
+                     $toplevel = $level;
+                   }
+                   push(@sections, $name);
+                   next_doc() if ($T2H_SPLIT eq 'section' ||
+                                  $T2H_SPLIT && $level == $toplevel);
+                 }
+                 $sec_num++;
+                 $docid = "SEC$sec_num";
+                 $tocid = (/^\@\w*heading/ ? undef : "TOC$sec_num");
+                 # check biblio and glossary
+                 $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i);
+                 $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i);
+                 # check node
+                 if ($node)
+                 {
+                   warn "$ERROR Duplicate node found: $node\n"
+                     if ($node2sec{$node});
+                 }
+                 else
+                 {
+                   $name .= ' ' while ($node2sec{$name});
+                   $node = $name;
+                 }
+                 $name .= ' ' while ($sec2node{$name});
+                 $section = $name; 
+                 $node2sec{$node} = $name;
+                 $sec2node{$name} = $node;
+                 $node2href{$node} = "$docu_doc#$docid";
+                 $node2next{$node} = $node_next;
+                 $node2prev{$node} = $node_prev;
+                 $node2up{$node} = $node_up;
+                 print "# node $node, section $name, level $level\n"
+                   if $T2H_DEBUG & $DEBUG_TOC;
+
+                 $node = '';
+                 $node_next = '';
+                 $node_prev = '';
+                 $node_next = '';
+                 if ($tocid)
+                 {
+                   # update TOC
+                   while ($level > $curlevel) {
+                     $curlevel++;
+                     push(@toc_lines, "<UL>\n");
+                   }
+                   while ($level < $curlevel) {
+                     $curlevel--;
+                     push(@toc_lines, "</UL>\n");
+                   }
+                   $_ = &t2h_anchor($tocid, "$docu_doc#$docid", $name, 1);
+                   $_ = &substitute_style($_);
+                   push(@stoc_lines, "$_<BR>\n") if ($level == 1);
+                   if ($T2H_NUMBER_SECTIONS)
+                   {
+                     push(@toc_lines, $_ . "<BR>\n")
+                   }
+                   else
+                   {
+                     push(@toc_lines, "<LI>" . $_ ."</LI>");
+                   }
+                 }
+                 else
+                 {
+                   push(@lines, &html_debug("<A NAME=\"$docid\"></A>\n", 
+                                          __LINE__));
+                 }
+                 # update DOC
+                 push(@lines, &html_debug('', __LINE__));
+                 &html_reset;
+                 $_ =  "<H$level> $name </H$level>\n<!--docid::${docid}::-->\n";
+                 $_ = &debug($_, __LINE__);
+                 push(@lines, &html_debug('', __LINE__));
+               }
+               # update DOC
+               foreach $line (split(/\n+/, $_)) {
+                   push(@lines, "$line\n");
+               }
+               next;
+           } else {
+               warn "$ERROR Bad section line: $_";
+           }
+       } else {
+           # track variables
+           $value{$1} = Unprotect_texi($2), next if /^\@set\s+($VARRE)\s+(.*)$/o;
+           delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o;
+           # store things
+           $value{'_shorttitle'} = Unprotect_texi($1), next if /^\@shorttitle\s+(.*)$/;
+           $value{'_setfilename'}   = Unprotect_texi($1), next if /^\@setfilename\s+(.*)$/;
+           $value{'_settitle'}      = Unprotect_texi($1), next if /^\@settitle\s+(.*)$/;
+           $value{'_author'}   .= Unprotect_texi($1)."\n", next if /^\@author\s+(.*)$/;
+           $value{'_subtitle'} .= Unprotect_texi($1)."\n", next if /^\@subtitle\s+(.*)$/;
+           $value{'_title'}    .= Unprotect_texi($1)."\n", next if /^\@title\s+(.*)$/;
+
+           # list item
+           if (/^\s*\@itemx?\s+/) {
+               $what = $';
+               $what =~ s/\s+$//;
+               if ($in_bibliography && $use_bibliography) {
+                   if ($what =~ /^$BIBRE$/o) {
+                       $id = 'BIB' . ++$bib_num;
+                       $bib2href{$what} = "$docu_doc#$id";
+                       print "# found bibliography for '$what' id $id\n"
+                           if $T2H_DEBUG & $DEBUG_BIB;
+                       $what = &t2h_anchor($id, '', $what);
+                   }
+               } elsif ($in_glossary && $T2H_USE_GLOSSARY) {
+                   $id = 'GLOSS' . ++$gloss_num;
+                   $entry = $what;
+                   $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+                   $gloss2href{$entry} = "$docu_doc#$id";
+                   print "# found glossary for '$entry' id $id\n"
+                       if $T2H_DEBUG & $DEBUG_GLOSS;
+                   $what = &t2h_anchor($id, '', $what);
+               }
+               elsif ($in_table && ($table_type eq 'f' || $table_type eq 'v'))
+               {
+                 EnterIndexEntry($table_type, $what, $docu_doc, $section, \@lines);
+               }
+               &html_pop_if('P');
+               if ($html_element eq 'DL' || $html_element eq 'DD') {
+                   if ($things_map{$in_table} && !$what) {
+                       # special case to allow @table @bullet for instance
+                       push(@lines, &debug("<DT>$things_map{$in_table}\n", __LINE__));
+                   } else {
+                       push(@lines, &debug("<DT>\@$in_table\{$what\}\n", __LINE__));
+                   }
+                   push(@lines, "<DD>");
+                   &html_push('DD') unless $html_element eq 'DD';
+                   if ($table_type) { # add also an index
+                       unshift(@input_spool, "\@${table_type}index $what\n");
+                   }
+               } elsif ($html_element eq 'TABLE') {
+                   push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
+                   &html_push('TR');
+               } elsif ($html_element eq 'TR') {
+                   push(@lines, &debug("</TR>\n", __LINE__));
+                   push(@lines, &debug("<TR><TD>$what</TD>\n", __LINE__));
+               } else {
+                   push(@lines, &debug("<LI>$what\n", __LINE__));
+                   &html_push('LI') unless $html_element eq 'LI';
+               }
+               push(@lines, &html_debug('', __LINE__));
+               if ($deferred_ref) {
+                   push(@lines, &debug("$deferred_ref\n", __LINE__));
+                   $deferred_ref = '';
+               }
+               next;
+           } elsif (/^\@tab\s+(.*)$/) {
+               push(@lines, "<TD>$1</TD>\n");
+               next;
+           }
+       }
+    }
+    # paragraph separator
+    if ($_ eq "\n" && ! $in_pre) {
+       next if $#lines >= 0 && $lines[$#lines] eq "\n";
+       if ($html_element eq 'P') {
+           push (@lines, &debug("</P><P>\n", __LINE__));
+       }
+#      else
+#      {
+#        push(@lines, "<P></P>\n");
+#        $_ = &debug("<P></P>\n", __LINE__);
+#      }
+        elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE' || $html_element eq 'DD' || $html_element eq 'LI') 
+       {
+         &html_push('P');
+         push(@lines, &debug("<P>\n", __LINE__));
+       }
+      }
+    # otherwise
+    push(@lines, $_) unless $in_titlepage;
+    push(@lines, &debug("</center>\n", __LINE__))  if ($tag eq 'center');
+}
+
+# finish TOC
+$level = 0;
+while ($level < $curlevel) {
+    $curlevel--;
+    push(@toc_lines, "</UL>\n");
+}
+
+print "# end of pass 1\n" if $T2H_VERBOSE;
+
+SetDocumentLanguage('en') unless ($T2H_LANG);
+#+++############################################################################
+#                                                                              #
+# Stuff related to Index generation                                            #
+#                                                                              #
+#---############################################################################
+
+sub EnterIndexEntry
+{
+  my $prefix = shift;
+  my $key = shift;
+  my $docu_doc = shift;
+  my $section = shift;
+  my $lines = shift;
+  local $_;
+
+  warn "$ERROR Undefined index command: $_", next
+    unless (exists ($index_properties->{$prefix}));
+  $key =~ s/\s+$//;
+  $_ = $key;
+  &protect_texi;
+  $key = $_;
+  $_ = &protect_html($_);
+  my $html_key = substitute_style($_);
+  my $id;
+  $key = remove_style($key);
+  $key = remove_things($key);
+  $_ = $key;
+  &unprotect_texi;
+  $key = $_;
+  while (exists $index->{$prefix}->{$key}) {$key .= ' '};
+  if ($lines->[$#lines] =~ /^<!--docid::(.+)::-->$/)
+  {
+    $id = $1;
+  }
+  else
+  {
+    $id = 'IDX' . ++$idx_num;
+    push(@$lines, &t2h_anchor($id, '', $T2H_INVISIBLE_MARK, !$in_pre));
+  }
+  $index->{$prefix}->{$key}->{html_key} = $html_key;
+  $index->{$prefix}->{$key}->{section} = $section;
+  $index->{$prefix}->{$key}->{href} = "$docu_doc#$id";
+  print "# found ${prefix}index  for '$key' with id $id\n"
+    if $T2H_DEBUG & $DEBUG_INDEX;
+}
+
+sub IndexName2Prefix
+{
+  my $name = shift;
+  my $prefix;
+
+  for $prefix (keys %$index_properties)
+  {
+    return $prefix if ($index_properties->{$prefix}->{name} eq $name);
+  }
+  return undef;
+}
+
+sub GetIndexEntries
+{
+  my $normal = shift;
+  my $code = shift;
+  my ($entries, $prefix, $key) = ({});
+  
+  for $prefix (keys %$normal)
+  {
+    for $key (keys %{$index->{$prefix}})
+    {
+      $entries->{$key} = {%{$index->{$prefix}->{$key}}};
+    }
+  }
+
+  if (defined($code))
+  {
+    for $prefix (keys %$code)
+    {
+      unless (exists $normal->{$keys})
+      {
+       for $key (keys %{$index->{$prefix}})
+       {
+         $entries->{$key} = {%{$index->{$prefix}->{$key}}};
+         $entries->{$key}->{html_key} = "<CODE>$entries->{$key}->{html_key}</CODE>";
+       }
+      }
+    }
+  }
+  return $entries;
+}
+
+sub byAlpha
+{
+  if ($a =~ /^[A-Za-z]/)
+  {
+    if ($b =~ /^[A-Za-z]/)
+    {
+      return lc($a) cmp lc($b);
+    }
+    else
+    {
+      return 1;
+    }
+  }
+  elsif ($b =~ /^[A-Za-z]/)
+  {
+    return -1;
+  }
+  else
+  {
+    return lc($a) cmp lc($b);
+  } 
+}
+
+sub GetIndexPages
+{
+  my $entries = shift;
+  my (@Letters, $key);
+  my ($EntriesByLetter, $Pages, $page) = ({}, [], {});
+  my @keys = sort byAlpha keys %$entries;
+
+  for $key (@keys)
+  {
+    push @{$EntriesByLetter->{uc(substr($key,0, 1))}} , $entries->{$key};
+  }
+  @Letters = sort byAlpha keys %$EntriesByLetter;
+  
+  $T2H_SPLIT_INDEX = 0 unless ($T2H_SPLIT);
+
+  unless ($T2H_SPLIT_INDEX)
+  {
+    $page->{First} = $Letters[0];
+    $page->{Last} = $Letters[$#Letters];
+    $page->{Letters} = \@Letters;
+    $page->{EntriesByLetter} = $EntriesByLetter;
+    push @$Pages, $page;
+    return $Pages;
+  }
+
+  if ($T2H_SPLIT_INDEX =~ /^\d+$/)
+  {
+    my $i = 0;
+    my ($prev_letter, $letter);
+    $page->{First} = $Letters[0];
+    for $letter (@Letters)
+    {
+      if ($i > $T2H_SPLIT_INDEX)
+      {
+       $page->{Last} = $prev_letter;
+       push @$Pages, {%$page};
+       $page->{Letters} = [];
+       $page->{EntriesByLetter} = {};
+       $page->{First} = $letter;
+       $i=0;
+      }
+      push @{$page->{Letters}}, $letter;
+      $page->{EntriesByLetter}->{$letter} = [@{$EntriesByLetter->{$letter}}];
+      $i += scalar(@{$EntriesByLetter->{$letter}});
+      $prev_letter = $letter;
+    }
+    $page->{Last} = $Letters[$#Letters];
+    push @$Pages, {%$page};
+  }
+  return $Pages;
+}
+
+sub GetIndexSummary
+{
+  my $first_page = shift;
+  my $Pages = shift;
+  my $name = shift;
+  my ($page, $letter, $summary, $i, $l1, $l2, $l);
+
+  $i = 0;
+  $summary = '<table><tr><th valign=top>Jump to: &nbsp; </th><td>';
+  
+  for $page ($first_page, @$Pages)
+  {
+    for $letter (@{$page->{Letters}})
+    {
+      $l = t2h_anchor('', "$page->{href}#${name}_$letter", "<b>$letter</b>", 
+                     0, 'style="text-decoration:none"') . "\n &nbsp; \n";
+      
+      if ($letter =~ /^[A-Za-z]/)
+      {
+       $l2 .= $l;
+      }
+      else
+      {
+       $l1 .= $l;
+      }
+    }
+  }
+  $summary .= $l1 . "<BR>\n" if ($l1);
+  $summary .= $l2 . '</td></tr></table><br>';
+  return $summary;
+}
+
+sub PrintIndexPage
+{
+  my $lines = shift;
+  my $summary = shift;
+  my $page = shift;
+  my $name = shift;
+
+  push @$lines, $summary;
+
+  push @$lines , <<EOT;
+<P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+EOT
+
+  for $letter (@{$page->{Letters}})
+  {
+    push @$lines, "<TR><TH><A NAME=\"${name}_$letter\"></A>$letter</TH><TD></TD><TD></TD></TR>\n";
+    for $entry (@{$page->{EntriesByLetter}->{$letter}})
+    {
+      push @$lines, 
+      "<TR><TD></TD><TD valign=top>" . 
+       t2h_anchor('', $entry->{href}, $entry->{html_key}) .
+         "</TD><TD valign=top>" . 
+           t2h_anchor('', sec_href($entry->{section}), clean_name($entry->{section})) .
+             "</TD></TR>\n";
+    }
+    push @$lines, "<TR><TD COLSPAN=3> <HR></TD></TR>\n";
+  }
+  push @$lines, "</TABLE><P></P>";
+  push @$lines, $summary;
+}
+
+sub PrintIndex
+{
+  my $lines = shift;
+  my $name = shift;
+  my $section = shift;
+  $section = 'Top' unless $section;
+  my $prefix = IndexName2Prefix($name);
+
+  warn ("$ERROR printindex: bad index name: $name"), return 
+    unless $prefix;
+
+  if ($index_properties->{$prefix}->{code})
+  {
+    $index_properties->{$prefix}->{from_code}->{$prefix} = 1;
+  }
+  else
+  {
+    $index_properties->{$prefix}->{from}->{$prefix}= 1;
+  }
+
+  my $Entries = GetIndexEntries($index_properties->{$prefix}->{from}, 
+                               $index_properties->{$prefix}->{from_code});
+  return unless %$Entries;
+
+  if ($T2H_IDX_SUMMARY)
+  {
+    my $key;
+    open(FHIDX, ">$docu_rdir$docu_name" . "_$name.idx")
+      || die "Can't open > $docu_rdir$docu_name" . "_$name.idx for writing: $!\n";
+    print "# writing $name index summary in $docu_rdir$docu_name" . "_$name.idx...\n" if $T2H_VERBOSE;
+
+    for $key (sort keys %$Entries)
+    {
+      print FHIDX "$key\t$Entries->{$key}->{href}\n";
+    }
+  }
+
+  my $Pages = GetIndexPages($Entries);
+  my $page;
+  my $first_page = shift @$Pages;
+  my $sec_name = $section;
+  # remove section number
+  $sec_name =~ s/.*? // if $sec_name =~ /^([A-Z]|\d+)\./;
+
+  ($first_page->{href} = sec_href($section)) =~ s/\#.*$//;
+  # Update tree structure of document
+  if (@$Pages)
+  {
+    my $sec;
+    my @after;
+
+    while (@sections && $sections[$#sections] ne $section)
+    {
+      unshift @after, pop @sections;
+    }
+
+    for $page (@$Pages)
+    {
+      my $node = ($page->{First} ne $page->{Last} ? 
+                 "$sec_name: $page->{First} -- $page->{Last}" :
+                 "$sec_name: $page->{First}");
+      push @sections, $node;
+      $node2sec{$node} = $node;
+      $sec2node{$node} = $node;
+      $node2up{$node} = $section;
+      $page->{href} = next_doc();
+      $page->{name} = $node;
+      $node2href{$node} = $page->{href};
+      if ($prev_node)
+      {
+       $node2next{$prev_node} = $node;
+       $node2prev{$node} = $prev_node;
+      }
+      $prev_node = $node;
+    }
+    push @sections, @after;
+  }
+
+  my $summary = GetIndexSummary($first_page, $Pages, $name);
+  PrintIndexPage($lines, $summary, $first_page, $name);
+  for $page (@$Pages)
+  {
+    push @$lines, ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
+    push @$lines, "<H2 ALIGN=\"Left\">$page->{name}</H2>\n";
+    PrintIndexPage($lines, $summary, $page, $name);
+  }
+}
+
+
+#+++############################################################################
+#                                                                              #
+# Pass 2/3: handle style, menu, index, cross-reference                         #
+#                                                                              #
+#---############################################################################
+
+@lines2 = ();                          # whole document (2nd pass)
+@lines3 = ();                          # whole document (3rd pass)
+$in_menu = 0;                          # am I inside a menu
+
+while (@lines) {
+    $_ = shift(@lines);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@lines2, $_);
+       next;
+    }
+    #
+    # menu
+    #
+    if (/^\@menu\b/)
+    {
+      $in_menu = 1;
+      $in_menu_listing = 1;
+      push(@lines2, &debug("<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> \n", __LINE__));
+      next;
+    }
+    if (/^\@end\s+menu\b/)
+    {
+      if ($in_menu_listing)
+      {
+       push(@lines2, &debug("</TABLE></BLOCKQUOTE>\n", __LINE__));
+      }
+      else
+      {
+       push(@lines2, &debug("</BLOCKQUOTE>\n", __LINE__));
+      }
+      $in_menu = 0;
+      $in_menu_listing = 0;
+      next;
+    }
+    if ($in_menu) 
+    {
+      my ($node, $name, $descr);
+      if (/^\*\s+($NODERE)::/o)
+      {
+       $node = $1;
+       $descr = $';
+      }
+      elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/)
+      {
+       $name = $1;
+       $node = $2;
+       $descr = $';
+      }
+      elsif (/^\*/) 
+      {
+       warn "$ERROR Bad menu line: $_";
+      }
+      else
+      {
+       if ($in_menu_listing)
+       {
+         $in_menu_listing = 0;
+         push(@lines2, &debug("</TABLE>\n", __LINE__));
+       }
+       # should be like verbatim -- preseve spaces, etc
+       s/ /\&nbsp;/g;
+       $_ .= "<br>\n";
+       push(@lines2, $_);
+      }
+      if ($node)
+      {
+       if (! $in_menu_listing)
+       {
+         $in_menu_listing = 1;
+         push(@lines2, &debug("<TABLE BORDER=0 CELLSPACING=0>\n", __LINE__));
+       }
+       # look for continuation
+       while ($lines[0] =~ /^\s+\w+/)
+       {
+         $descr .= shift(@lines);
+       }
+       &menu_entry($node, $name, $descr);
+      } 
+      next;
+    }
+    #
+    # printindex
+    #
+    PrintIndex(\@lines2, $2, $1), next
+      if (/^<!--::(.*)::-->\@printindex\s+(\w+)/);
+    #
+    # simple style substitutions
+    #
+    $_ = &substitute_style($_);
+    #
+    # xref
+    #
+    while (/\@(x|px|info|)ref{([^{}]+)(}?)/) {
+       # note: Texinfo may accept other characters
+       ($type, $nodes, $full) = ($1, $2, $3);
+       ($before, $after) = ($`, $');
+       if (! $full && $after) {
+           warn "$ERROR Bad xref (no ending } on line): $_";
+           $_ = "$before$;0${type}ref\{$nodes$after";
+           next; # while xref
+       }
+       if ($type eq 'x') {
+           $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} ";
+       } elsif ($type eq 'px') {
+           $type = "$T2H_WORDS->{$T2H_LANG}->{'see'} ";
+       } elsif ($type eq 'info') {
+           $type = "$T2H_WORDS->{$T2H_LANG}->{'See'} Info";
+       } else {
+           $type = '';
+       }
+       unless ($full) {
+           $next = shift(@lines);
+           $next = &substitute_style($next);
+           chop($nodes); # remove final newline
+           if ($next =~ /\}/) { # split on 2 lines
+               $nodes .= " $`";
+               $after = $';
+           } else {
+               $nodes .= " $next";
+               $next = shift(@lines);
+               $next = &substitute_style($next);
+               chop($nodes);
+               if ($next =~ /\}/) { # split on 3 lines
+                   $nodes .= " $`";
+                   $after = $';
+               } else {
+                   warn "$ERROR Bad xref (no ending }): $_";
+                   $_ = "$before$;0xref\{$nodes$after";
+                   unshift(@lines, $next);
+                   next; # while xref
+               }
+           }
+       }
+       $nodes =~ s/\s+/ /g; # remove useless spaces
+       @args = split(/\s*,\s*/, $nodes);
+       $node = $args[0]; # the node is always the first arg
+       $node = &normalise_node($node);
+       $sec = $args[2] || $args[1] || $node2sec{$node};
+       $href = $node2href{$node};
+       if (@args == 5) { # reference to another manual
+           $sec = $args[2] || $node;
+           $man = $args[4] || $args[3];
+           $_ = "${before}${type}$T2H_WORDS->{$T2H_LANG}->{'section'} `$sec' in \@cite{$man}$after";
+       } elsif ($type =~ /Info/) { # inforef
+           warn "$ERROR Wrong number of arguments: $_" unless @args == 3;
+           ($nn, $_, $in) = @args;
+           $_ = "${before}${type} file `$in', node `$nn'$after";
+       } elsif ($sec && $href && ! $T2H_SHORT_REF) {
+           $_  = "${before}${type}";
+           $_ .= "$T2H_WORDS->{$T2H_LANG}->{'section'} " if ${type};
+           $_ .= &t2h_anchor('', $href, $sec) . $after;
+       } 
+       elsif ($href)
+       {
+         $_ = "${before}${type} " . 
+           &t2h_anchor('', $href, $args[2] || $args[1] || $node) . 
+             $after;
+       }
+       else {
+           warn "$ERROR Undefined node ($node): $_";
+           $_ = "$before$;0xref{$nodes}$after";
+       }
+    }
+
+    # replace images
+    s[\@image\s*{(.+?)}]
+    {
+     my @args = split (/\s*,\s*/, $1);
+     my $base = $args[0];
+     my $image = 
+       LocateIncludeFile("$base.png") || 
+       LocateIncludeFile("$base.jpg") ||
+       LocateIncludeFile("$base.gif");
+     warn "$ERROR no image file for $base: $_" unless ($image && -e $image);
+     "<IMG SRC=\"$image\" ALT=\"$base\">";
+     ($T2H_CENTER_IMAGE ?
+      "<CENTER><IMG SRC=\"$image\" ALT=\"$base\"></CENTER>" :
+      "<IMG SRC=\"$image\" ALT=\"$base\">");
+    }eg;
+
+    #
+    # try to guess bibliography references or glossary terms
+    #
+    unless (/^<H\d><A NAME=\"SEC\d/) {
+       if ($use_bibliography) {
+           $done = '';
+           while (/$BIBRE/o) {
+               ($pre, $what, $post) = ($`, $&, $');
+               $href = $bib2href{$what};
+               if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+                   $done .= $pre . &t2h_anchor('', $href, $what);
+               } else {
+                   $done .= "$pre$what";
+               }
+               $_ = $post;
+           }
+           $_ = $done . $_;
+       }
+       if ($T2H_USE_GLOSSARY) {
+           $done = '';
+           while (/\b\w+\b/) {
+               ($pre, $what, $post) = ($`, $&, $');
+               $entry = $what;
+               $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/;
+               $href = $gloss2href{$entry};
+               if (defined($href) && $post !~ /^[^<]*<\/A>/) {
+                   $done .= $pre . &t2h_anchor('', $href, $what);
+               } else {
+                   $done .= "$pre$what";
+               }
+               $_ = $post;
+           }
+           $_ = $done . $_;
+       }
+    }
+    # otherwise
+    push(@lines2, $_);
+}
+print "# end of pass 2\n" if $T2H_VERBOSE;
+
+#
+# split style substitutions
+#
+while (@lines2) {
+    $_ = shift(@lines2);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@lines3, $_);
+       next;
+    }
+    #
+    # split style substitutions
+    #
+    $old = '';
+    while ($old ne $_) {
+        $old = $_;
+       if (/\@(\w+)\{/) {
+           ($before, $style, $after) = ($`, $1, $');
+           if (defined($style_map{$style})) {
+               $_ = $after;
+               $text = '';
+               $after = '';
+               $failed = 1;
+               while (@lines2) {
+                   if (/\}/) {
+                       $text .= $`;
+                       $after = $';
+                       $failed = 0;
+                       last;
+                   } else {
+                       $text .= $_;
+                       $_ = shift(@lines2);
+                   }
+               }
+               if ($failed) {
+                   die "* Bad syntax (\@$style) after: $before\n";
+               } else {
+                   $text = &apply_style($style, $text);
+                   $_ = "$before$text$after";
+               }
+           }
+       }
+    }
+    # otherwise
+    push(@lines3, $_);
+}
+print "# end of pass 3\n" if $T2H_VERBOSE;
+       
+#+++############################################################################
+#                                                                              #
+# Pass 4: foot notes, final cleanup                                            #
+#                                                                              #
+#---############################################################################
+
+@foot_lines = ();                      # footnotes
+@doc_lines = ();                       # final document
+$end_of_para = 0;                      # true if last line is <P>
+       
+while (@lines3) {
+    $_ = shift(@lines3);
+    #
+    # special case (protected sections)
+    #
+    if (/^$PROTECTTAG/o) {
+       push(@doc_lines, $_);
+       $end_of_para = 0;
+       next;
+    }
+    #
+    # footnotes
+    #
+    while (/\@footnote([^\{\s]+)\{/) {
+       ($before, $d, $after) = ($`, $1, $');
+       $_ = $after;
+       $text = '';
+       $after = '';
+       $failed = 1;
+       while (@lines3) {
+           if (/\}/) {
+               $text .= $`;
+               $after = $';
+               $failed = 0;
+               last;
+           } else {
+               $text .= $_;
+               $_ = shift(@lines3);
+           }
+       }
+       if ($failed) {
+           die "* Bad syntax (\@footnote) after: $before\n";
+       } else {
+           $foot_num++;
+           $docid  = "DOCF$foot_num";
+           $footid = "FOOT$foot_num";
+           $foot = "($foot_num)";
+           push(@foot_lines, "<H3>" . &t2h_anchor($footid, "$d#$docid", $foot) . "</H3>\n");
+           $text = "<P>$text" unless $text =~ /^\s*<P>/;
+           push(@foot_lines, "$text\n");
+           $_ = $before . &t2h_anchor($docid, "$docu_foot#$footid", $foot) . $after;
+       }
+    }
+    #
+    # remove unnecessary <P>
+    #
+    if (/^\s*<P>\s*$/) {
+       next if $end_of_para++;
+    } else {
+       $end_of_para = 0;
+    }
+    # otherwise
+    push(@doc_lines, $_);
+}
+       
+print "# end of pass 4\n" if $T2H_VERBOSE;
+
+#+++############################################################################
+#                                                                              #
+# Pass 5: print things                                                         #
+#                                                                              #
+#---############################################################################
+
+$T2H_L2H = &l2h_FinishToLatex if ($T2H_L2H);
+$T2H_L2H = &l2h_ToHtml        if ($T2H_L2H);
+$T2H_L2H = &l2h_InitFromHtml  if ($T2H_L2H);
+
+# fix node2up, node2prev, node2next, if desired
+if ($has_top_command)
+{
+  for $section (keys %sec2number)
+  {
+    $node = $sec2node{$section};
+    $node2up{$node} = Sec2UpNode($section) unless $node2up{$node};
+    $node2prev{$node} = Sec2PrevNode($section) unless $node2prev{$node};
+    $node2next{$node} = Sec2NextNode($section) unless $node2next{$node};
+  }
+}
+
+# prepare %T2H_THISDOC
+$T2H_THISDOC{fulltitle} = $value{'_title'} || $value{'_settitle'} || "Untitled Document";
+$T2H_THISDOC{title} = $value{'_settitle'} || $T2H_THISDOC{fulltitle};
+$T2H_THISDOC{author} = $value{'_author'};
+$T2H_THISDOC{subtitle} = $value{'_subtitle'};
+$T2H_THISDOC{shorttitle} = $value{'_shorttitle'};
+for $key (keys %T2H_THISDOC)
+{
+  $_ = &substitute_style($T2H_THISDOC{$key});
+  &unprotect_texi;
+  s/\s*$//;
+  $T2H_THISDOC{$key} = $_;
+}
+
+# if no sections, then simply print document as is
+unless (@sections)
+{
+  print "# Writing content into $docu_top_file \n" if $T2H_VERBOSE;
+  open(FILE, "> $docu_top_file") 
+    || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
+
+  &$T2H_print_page_head(\*FILE);
+  $T2H_THIS_SECTION = \@doc_lines;
+  t2h_print_lines(\*FILE);
+  &$T2H_print_foot_navigation(\*FILE);
+  &$T2H_print_page_foot(\*FILE);
+  close(FILE);
+  goto Finish;
+}
+
+# initialize $T2H_HREF, $T2H_NAME
+%T2H_HREF = 
+  (
+   'First' ,   sec_href($sections[0]),
+   'Last',     sec_href($sections[$#sections]),
+   'About',     $docu_about. '#SEC_About',
+  );
+
+# prepare TOC, OVERVIEW, TOP
+$T2H_TOC = \@toc_lines;
+$T2H_OVERVIEW = \@stoc_lines;
+if ($has_top)
+{
+  while (1)
+  {
+    $_ = shift @doc_lines;
+    last if /$TOPEND/;
+    push @$T2H_TOP, $_;
+  }
+  $T2H_HREF{'Top'} = $docu_top . '#SEC_Top';
+}
+else
+{
+  $T2H_HREF{'Top'} = $T2H_HREF{First};
+}
+
+$node2href{Top} = $T2H_HREF{Top};
+$T2H_HREF{Contents} = $docu_toc.'#SEC_Contents' if @toc_lines;
+$T2H_HREF{Overview} = $docu_stoc.'#SEC_OVERVIEW' if @stoc_lines;
+
+# settle on index
+if ($T2H_INDEX_CHAPTER)
+{
+  $T2H_HREF{Index} = $node2href{normalise_node($T2H_INDEX_CHAPTER)};
+  warn "$ERROR T2H_INDEX_CHAPTER '$T2H_INDEX_CHAPTER' not found\n"
+    unless $T2H_HREF{Index};
+}
+if (! $T2H_HREF{Index} && $first_index_chapter)
+{
+  $T2H_INDEX_CHAPTER = $first_index_chapter;
+  $T2H_HREF{Index} = $node2href{$T2H_INDEX_CHAPTER};
+}
+
+print "# Using '" . clean_name($T2H_INDEX_CHAPTER) . "' as index page\n"
+  if ($T2H_VERBOSE && $T2H_HREF{Index});
+
+%T2H_NAME =
+  (
+   'First',   clean_name($sec2node{$sections[0]}),
+   'Last',    clean_name($sec2node{$sections[$#sections]}),
+   'About',    $T2H_WORDS->{$T2H_LANG}->{'About_Title'},
+   'Contents', $T2H_WORDS->{$T2H_LANG}->{'ToC_Title'},
+   'Overview', $T2H_WORDS->{$T2H_LANG}->{'Overview_Title'},
+   'Index' ,   clean_name($T2H_INDEX_CHAPTER),
+   'Top',      clean_name($T2H_TOP_HEADING || $T2H_THISDOC{'title'} || $T2H_THISDOC{'shorttitle'}),
+  );
+
+#############################################################################
+# print frame and frame toc file
+#
+if ( $T2H_FRAMES )
+{
+  open(FILE, "> $docu_frame_file") 
+    || die "$ERROR: Can't open $docu_frame_file for writing: $!\n";
+  print "# Creating frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
+  &$T2H_print_frame(\*FILE);
+  close(FILE);
+
+  open(FILE, "> $docu_toc_frame_file") 
+    || die "$ERROR: Can't open $docu_toc_frame_file for writing: $!\n";
+  print "# Creating toc frame in $docu_frame_file ...\n" if $T2H_VERBOSE;
+   &$T2H_print_toc_frame(\*FILE);
+  close(FILE);
+}
+
+
+#############################################################################
+# print Top
+#
+open(FILE, "> $docu_top_file") 
+  || die "$ERROR: Can't open $docu_top_file for writing: $!\n";
+&$T2H_print_page_head(\*FILE) unless ($T2H_SPLIT);
+
+if ($has_top)
+{
+  print "# Creating Top in $docu_top_file ...\n" if $T2H_VERBOSE;
+  $T2H_THIS_SECTION = $T2H_TOP;
+  $T2H_HREF{This} = $T2H_HREF{Top};
+  $T2H_NAME{This} = $T2H_NAME{Top};
+  &$T2H_print_Top(\*FILE);
+}
+  
+close(FILE) if $T2H_SPLIT;
+
+#############################################################################
+# Print sections
+#
+$T2H_NODE{Forward} = $sec2node{$sections[0]};
+$T2H_NAME{Forward} = &clean_name($sec2node{$sections[0]});
+$T2H_HREF{Forward} = sec_href($sections[0]);
+$T2H_NODE{This} = 'Top';
+$T2H_NAME{This} = $T2H_NAME{Top};
+$T2H_HREF{This} = $T2H_HREF{Top};
+if ($T2H_SPLIT)
+{
+  print "# writing " . scalar(@sections) . 
+    " sections in $docu_rdir$docu_name"."_[1..$doc_num]"
+         if $T2H_VERBOSE;
+  $previous = ($T2H_SPLIT eq 'chapter' ? $CHAPTEREND : $SECTIONEND);
+  undef $FH;
+  $doc_num = 0;
+}
+else
+{
+  print "# writing " . scalar(@sections) . " sections in $docu_top_file ..." 
+    if $T2H_VERBOSE;
+  $FH = \*FILE;
+  $previous = '';
+}
+
+$counter = 0;
+# loop through sections
+while ($section = shift(@sections)) 
+{
+  if ($T2H_SPLIT && ($T2H_SPLIT eq 'section' || $previous eq $CHAPTEREND))
+  { 
+    if ($FH)
+    {
+      #close previous page
+      &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
+      &$T2H_print_page_foot($FH);
+      close($FH);
+      undef $FH;
+    }
+  }
+  $T2H_NAME{Back} = $T2H_NAME{This};
+  $T2H_HREF{Back} = $T2H_HREF{This};
+  $T2H_NODE{Back} = $T2H_NODE{This};
+  $T2H_NAME{This} = $T2H_NAME{Forward};
+  $T2H_HREF{This} = $T2H_HREF{Forward};
+  $T2H_NODE{This} = $T2H_NODE{Forward};
+  if ($sections[0])
+  {
+    $T2H_NODE{Forward} = $sec2node{$sections[0]};
+    $T2H_NAME{Forward} = &clean_name($T2H_NODE{Forward});
+    $T2H_HREF{Forward} = sec_href($sections[0]);
+  }
+  else
+  {
+    undef $T2H_HREF{Forward}, $T2H_NODE{Forward}, $T2H_NAME{Forward};
+  }
+
+  $node = $node2up{$T2H_NODE{This}};
+  $T2H_HREF{Up} = $node2href{$node};
+  if ($T2H_HREF{Up} eq $T2H_HREF{This} || ! $T2H_HREF{Up})
+  {
+    $T2H_NAME{Up} = $T2H_NAME{Top};
+    $T2H_HREF{Up} = $T2H_HREF{Top};
+    $T2H_NODE{Up} = 'Up';
+  }
+  else
+  {
+    $T2H_NAME{Up} = &clean_name($node);
+    $T2H_NODE{Up} = $node;
+  }
+
+  $node = $T2H_NODE{This};
+  $node = $node2prev{$node};
+  $T2H_NAME{Prev} = &clean_name($node);
+  $T2H_HREF{Prev} = $node2href{$node};
+  $T2H_NODE{Prev} = $node;
+
+  $node = $T2H_NODE{This};
+  if ($node2up{$node} && $node2up{$node} ne 'Top'&&
+      ($node2prev{$node} eq $T2H_NODE{Back} || ! $node2prev{$node}))
+  {
+    $node = $node2up{$node};
+    while ($node && $node ne $node2up{$node} && ! $node2prev{$node})
+    {
+      $node = $node2up{$node};
+    }
+    $node = $node2prev{$node} 
+      unless $node2up{$node} eq 'Top' || ! $node2up{$node};
+  }
+  else
+  {
+    $node = $node2prev{$node};
+  }
+  $T2H_NAME{FastBack} = &clean_name($node);
+  $T2H_HREF{FastBack} = $node2href{$node};
+  $T2H_NODE{FastBack} = $node;
+  
+  $node = $T2H_NODE{This};
+  $node = $node2next{$node};
+  $T2H_NAME{Next} = &clean_name($node);
+  $T2H_HREF{Next} = $node2href{$node};
+  $T2H_NODE{Next} = $node;
+
+  $node = $T2H_NODE{This};
+  if ($node2up{$node} && $node2up{$node} ne 'Top'&& 
+      ($node2next{$node} eq $T2H_NODE{Forward} || ! $node2next{$node}))
+  {
+    $node = $node2up{$node};
+    while ($node && $node ne $node2up{$node} && ! $node2next{$node})
+    {
+      $node = $node2up{$node};
+    }
+  }
+  $node = $node2next{$node};
+  $T2H_NAME{FastForward} = &clean_name($node);
+  $T2H_HREF{FastForward} = $node2href{$node};
+  $T2H_NODE{FastForward} = $node;
+
+  if (! defined($FH))
+  {
+    my $file = $T2H_HREF{This};
+    $file =~ s/\#.*$//;
+    open(FILE, "> $docu_rdir$file") || 
+      die "$ERROR: Can't open $docu_rdir$file for writing: $!\n";
+    $FH = \*FILE;
+    &$T2H_print_page_head($FH);
+    t2h_print_label($FH);
+    &$T2H_print_chapter_header($FH) if $T2H_SPLIT eq 'chapter';
+  }
+  else
+  {
+    t2h_print_label($FH);
+  }
+
+  $T2H_THIS_SECTION = [];
+  while (@doc_lines) {
+    $_ = shift(@doc_lines);
+    last if ($_ eq $SECTIONEND || $_ eq $CHAPTEREND);
+    push(@$T2H_THIS_SECTION, $_);
+  }
+  $previous = $_;
+  &$T2H_print_section($FH);
+
+  if ($T2H_VERBOSE)
+  {
+    $counter++;
+    print "." if $counter =~ /00$/;
+  }
+}
+if ($T2H_SPLIT)
+{
+  &$T2H_print_chapter_footer($FH) if $T2H_SPLIT eq 'chapter';
+  &$T2H_print_page_foot($FH);
+  close($FH);
+}
+print "\n" if $T2H_VERBOSE;
+
+#############################################################################
+# Print ToC, Overview, Footnotes
+#
+undef $T2H_HREF{Prev};
+undef $T2H_HREF{Next};
+undef $T2H_HREF{Back};
+undef $T2H_HREF{Forward};
+undef $T2H_HREF{Up};
+
+if (@foot_lines)
+{
+  print "# writing Footnotes in $docu_foot_file...\n" if $T2H_VERBOSE;
+  open (FILE, "> $docu_foot_file") || die "$ERROR: Can't open $docu_foot_file for writing: $!\n"
+      if $T2H_SPLIT;
+  $T2H_HREF{This} = $docu_foot;
+  $T2H_NAME{This} = $T2H_WORDS->{$T2H_LANG}->{'Footnotes_Title'};
+  $T2H_THIS_SECTION = \@foot_lines;
+  &$T2H_print_Footnotes(\*FILE);
+  close(FILE) if $T2H_SPLIT;
+}
+
+if (@toc_lines)
+{
+  print "# writing Toc in $docu_toc_file...\n" if $T2H_VERBOSE;
+  open (FILE, "> $docu_toc_file") || die "$ERROR: Can't open $docu_toc_file for writing: $!\n"
+      if $T2H_SPLIT;
+  $T2H_HREF{This} = $T2H_HREF{Contents};
+  $T2H_NAME{This} = $T2H_NAME{Contents};
+  $T2H_THIS_SECTION = \@toc_lines;
+  &$T2H_print_Toc(\*FILE);
+  close(FILE) if $T2H_SPLIT;
+}
+
+if (@stoc_lines)
+{
+  print "# writing Overview in $docu_stoc_file...\n" if $T2H_VERBOSE;
+  open (FILE, "> $docu_stoc_file") || die "$ERROR: Can't open $docu_stoc_file for writing: $!\n"
+      if $T2H_SPLIT;
+  
+  $T2H_HREF{This} = $T2H_HREF{Overview};
+  $T2H_NAME{This} = $T2H_NAME{Overview};
+  $T2H_THIS_SECTION = \@stoc_lines;
+  unshift @$T2H_THIS_SECTION, "<BLOCKQUOTE>\n";
+  push @$T2H_THIS_SECTION, "\n</BLOCKQUOTE>\n";
+  &$T2H_print_Overview(\*FILE);
+  close(FILE) if $T2H_SPLIT;
+}
+
+if ($about_body = &$T2H_about_body())
+{
+  print "# writing About in $docu_about_file...\n" if $T2H_VERBOSE;
+  open (FILE, "> $docu_about_file") || die "$ERROR: Can't open $docu_about_file for writing: $!\n"
+      if $T2H_SPLIT;
+  
+  $T2H_HREF{This} = $T2H_HREF{About};
+  $T2H_NAME{This} = $T2H_NAME{About};
+  $T2H_THIS_SECTION = [$about_body];
+  &$T2H_print_About(\*FILE);
+  close(FILE) if $T2H_SPLIT;
+}
+
+unless ($T2H_SPLIT)
+{
+  &$T2H_print_page_foot(\*FILE);
+  close (FILE);
+}
+  
+Finish:
+&l2h_FinishFromHtml if ($T2H_L2H);
+&l2h_Finish if($T2H_L2H);
+print "# that's all folks\n" if $T2H_VERBOSE;
+
+exit(0);
+
+#+++############################################################################
+#                                                                              #
+# Low level functions                                                          #
+#                                                                              #
+#---############################################################################
+
+sub LocateIncludeFile
+{
+  my $file = shift;
+  my $dir;
+
+  return $file if (-e $file && -r $file);
+  foreach $dir (@T2H_INCLUDE_DIRS)
+  {
+    return "$dir/$file" if (-e "$dir/$file" && -r "$dir/$file");
+  }
+  return undef;
+}
+
+sub clean_name 
+{
+  local ($_);
+  $_ = &remove_style($_[0]);
+  &unprotect_texi;
+  return $_;
+}
+
+sub update_sec_num {
+    local($name, $level) = @_;
+    my $ret;
+
+    $level--; # here we start at 0
+    if ($name =~ /^appendix/ || defined(@appendix_sec_num)) {
+       # appendix style
+       if (defined(@appendix_sec_num)) {
+           &incr_sec_num($level, @appendix_sec_num);
+       } else {
+           @appendix_sec_num = ('A', 0, 0, 0);
+       }
+       $ret = join('.', @appendix_sec_num[0..$level]);
+    } else {
+       # normal style
+       if (defined(@normal_sec_num)) 
+       {
+         &incr_sec_num($level, @normal_sec_num);
+       } 
+       else 
+       {
+         @normal_sec_num = (1, 0, 0, 0);
+       }
+       $ret = join('.', @normal_sec_num[0..$level]);
+    }
+    
+    $ret .= "." if $level == 0;
+    return $ret;
+}
+
+sub incr_sec_num {
+    local($level, $l);
+    $level = shift(@_);
+    $_[$level]++;
+    foreach $l ($level+1 .. 3) {
+       $_[$l] = 0;
+    }
+}
+
+sub Sec2UpNode
+{
+  my $sec = shift;
+  my $num = $sec2number{$sec};
+
+  return '' unless $num;
+  return 'Top' unless $num =~ /\.\d+/;
+  $num =~ s/\.[^\.]*$//;
+  $num = $num . '.' unless $num =~ /\./;
+  return $sec2node{$number2sec{$num}};
+}
+
+sub Sec2PrevNode
+{
+  my $sec = shift;
+  my $num = $sec2number{$sec};
+  my ($i, $post);
+  
+  if ($num =~ /(\w+)(\.$|$)/)
+  {
+    $num = $`;
+    $i = $1;
+    $post = $2;
+    if ($i eq 'A')
+    {
+      $i = $normal_sec_num[0];
+    }
+    elsif ($i ne '1')
+    {
+      # unfortunately, -- operator is not magical
+      $i = chr(ord($i) + 1);
+    }
+    else
+    {
+      return '';
+    }
+    return $sec2node{$number2sec{$num . $i . $post}}
+  }
+  return '';
+}
+
+sub Sec2NextNode
+{
+  my $sec = shift;
+  my $num = $sec2number{$sec};
+  my $i;
+
+  if ($num =~ /(\w+)(\.$|$)/)
+  {
+    $num = $`;
+    $i = $1;
+    $post = $2;
+    if ($post eq '.' && $i eq $normal_sec_num[0])
+    {
+      $i = 'A';
+    }
+    else
+    {
+      $i++;
+    }
+    return $sec2node{$number2sec{$num . $i . $post}}
+  }
+  return '';
+}
+
+sub check {
+    local($_, %seen, %context, $before, $match, $after);
+
+    while (<>) {
+       if (/\@(\*|\.|\:|\@|\{|\})/) {
+           $seen{$&}++;
+           $context{$&} .= "> $_" if $T2H_VERBOSE;
+           $_ = "$`XX$'";
+           redo;
+       }
+       if (/\@(\w+)/) {
+           ($before, $match, $after) = ($`, $&, $');
+           if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address
+               $seen{'e-mail address'}++;
+               $context{'e-mail address'} .= "> $_" if $T2H_VERBOSE;
+           } else {
+               $seen{$match}++;
+               $context{$match} .= "> $_" if $T2H_VERBOSE;
+           }
+           $match =~ s/^\@/X/;
+           $_ = "$before$match$after";
+           redo;
+       }
+    }
+    
+    foreach (sort(keys(%seen))) {
+       if ($T2H_VERBOSE) {
+           print "$_\n";
+           print $context{$_};
+       } else {
+           print "$_ ($seen{$_})\n";
+       }
+    }
+}
+
+sub open {
+    local($name) = @_;
+
+    ++$fh_name;
+    if (open($fh_name, $name)) {
+       unshift(@fhs, $fh_name);
+    } else {
+       warn "$ERROR Can't read file $name: $!\n";
+    }
+}
+
+sub init_input {
+    @fhs = ();                 # hold the file handles to read
+    @input_spool = ();         # spooled lines to read
+    $fh_name = 'FH000';
+    &open($docu);
+}
+
+sub next_line {
+    local($fh, $line);
+
+    if (@input_spool) {
+       $line = shift(@input_spool);
+       return($line);
+    }
+    while (@fhs) {
+       $fh = $fhs[0];
+       $line = <$fh>;
+       return($line) if $line;
+       close($fh);
+       shift(@fhs);
+    }
+    return(undef);
+}
+
+# used in pass 1, use &next_line
+sub skip_until {
+    local($tag) = @_;
+    local($_);
+
+    while ($_ = &next_line) {
+       return if /^\@end\s+$tag\s*$/;
+    }
+    die "* Failed to find '$tag' after: " . $lines[$#lines];
+}
+
+# used in pass 1 for l2h use &next_line
+sub string_until {
+    local($tag) = @_;
+    local($_, $string);
+
+    while ($_ = &next_line) {
+       return $string if /^\@end\s+$tag\s*$/;
+#      $_ =~ s/hbox/mbox/g;
+       $string = $string.$_;
+    }
+    die "* Failed to find '$tag' after: " . $lines[$#lines];
+}
+
+#
+# HTML stacking to have a better HTML output
+#
+
+sub html_reset {
+    @html_stack = ('html');
+    $html_element = 'body';
+}
+
+sub html_push {
+    local($what) = @_;
+    push(@html_stack, $html_element);
+    $html_element = $what;
+}
+
+sub html_push_if {
+    local($what) = @_;
+    push(@html_stack, $html_element)
+       if ($html_element && $html_element ne 'P');
+    $html_element = $what;
+}
+
+sub html_pop {
+    $html_element = pop(@html_stack);
+}
+
+sub html_pop_if {
+    local($elt);
+
+    if (@_) {
+       foreach $elt (@_) {
+           if ($elt eq $html_element) {
+               $html_element = pop(@html_stack) if @html_stack;
+               last;
+           }
+       }
+    } else {
+       $html_element = pop(@html_stack) if @html_stack;
+    }
+}
+
+sub html_debug {
+    local($what, $line) = @_;
+    if ($T2H_DEBUG & $DEBUG_HTML)
+    {
+     $what = "\n" unless $what;
+     return("<!-- $line @html_stack, $html_element -->$what")
+    }  
+    return($what);
+}
+
+# to debug the output...
+sub debug {
+    local($what, $line) = @_;
+    return("<!-- $line -->$what")
+       if $T2H_DEBUG & $DEBUG_HTML;
+    return($what);
+}
+
+sub SimpleTexi2Html
+{
+  local $_ = $_[0];
+  &protect_texi;
+  &protect_html;
+  $_ = substitute_style($_);
+  $_[0]  = $_;
+}
+
+sub normalise_node {
+  local $_ = $_[0];
+  s/\s+/ /g;
+  s/ $//;
+  s/^ //;
+  &protect_texi;
+  &protect_html;
+  $_ = substitute_style($_);
+  $_[0]  = $_;
+}
+
+sub menu_entry 
+{
+  my ($node, $name, $descr) = @_;
+  my ($href, $entry);
+  
+  &normalise_node($node);
+  $href = $node2href{$node};
+  if ($href) 
+  {
+    $descr =~ s/^\s+//;
+    $descr =~ s/\s*$//;
+    $descr = SimpleTexi2Html($descr);
+    if ($T2H_NUMBER_SECTIONS && !$T2H_NODE_NAME_IN_MENU && $node2sec{$node})
+    {
+      $entry = $node2sec{$node};
+      $name = '';
+    }
+    else
+    {
+      &normalise_node($name);
+      $entry = ($name && ($name ne $node || ! $T2H_AVOID_MENU_REDUNDANCY) 
+               ? "$name : $node" : $node);
+    }
+
+    if ($T2H_AVOID_MENU_REDUNDANCY && $descr)
+    {
+      my $clean_entry = $entry;
+      $clean_entry =~ s/^.*? // if ($clean_entry =~ /^([A-Z]|\d+)\.[\d\.]* /);
+      $clean_entry =~ s/[^\w]//g;
+      my $clean_descr = $descr;
+      $clean_descr =~ s/[^\w]//g;
+      $descr = '' if ($clean_entry eq $clean_descr)
+    }
+    push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' . 
+                       &t2h_anchor('', $href, $entry) . 
+                       '</TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">' . 
+                       $descr . 
+                       "</TD></TR>\n", __LINE__));
+  }
+  elsif ($node =~ /^\(.*\)\w+/)
+  {
+    push(@lines2,&debug('<TR><TD ALIGN="left" VALIGN="TOP">' . 
+                       $entry . 
+                       '</TD><TD ALIGN="left" VALIGN="TOP">' . $descr . 
+                       "</TD></TR>\n", __LINE__))
+  }
+  else
+  {
+    warn "$ERROR Undefined node of menu_entry ($node): $_";
+  }
+}
+
+sub do_ctrl { "^$_[0]" }
+
+sub do_email {
+    local($addr, $text) = split(/,\s*/, $_[0]);
+
+    $text = $addr unless $text;
+    &t2h_anchor('', "mailto:$addr", $text);
+}
+
+sub do_sc 
+{ 
+  # l2h does this much better
+  return &l2h_ToLatex("{\\sc ".&unprotect_html($_[0])."}") if ($T2H_L2H);
+  return "\U$_[0]\E";
+}
+
+sub do_math
+{
+  return &l2h_ToLatex("\$".&unprotect_html($_[0])."\$") if ($T2H_L2H);
+  return "<EM>".$text."</EM>";
+}
+
+sub do_uref {
+    local($url, $text, $only_text) = split(/,\s*/, $_[0]);
+
+    $text = $only_text if $only_text;
+    $text = $url unless $text;
+    &t2h_anchor('', $url, $text);
+}
+
+sub do_url { &t2h_anchor('', $_[0], $_[0]) }
+
+sub do_acronym
+{
+  return '<FONT SIZE="-1">' . $_[0] . '</FONT>';
+}
+
+sub do_accent
+{
+  return "&$_[0]acute;" if $_[1] eq 'H';
+  return "$_[0]." if $_[1] eq 'dotaccent';
+  return "$_[0]*" if $_[1] eq 'ringaccent';
+  return "$_[0]".'[' if $_[1] eq 'tieaccent';
+  return "$_[0]".'(' if $_[1] eq 'u';
+  return "$_[0]_" if $_[1] eq 'ubaraccent';
+  return ".$_[0]" if $_[1] eq 'udotaccent';
+  return "$_[0]&lt;" if $_[1] eq 'v';
+  return "&$_[0]cedil;" if $_[1] eq ',';
+  return "$_[0]" if $_[1] eq 'dotless';
+  return undef;
+}
+
+sub apply_style {
+    local($texi_style, $text) = @_;
+    local($style);
+
+    $style = $style_map{$texi_style};
+    if (defined($style)) { # known style
+       if ($style =~ /^\"/) { # add quotes
+           $style = $';
+           $text = "\`$text\'";
+       }
+       if ($style =~ /^\&/) { # custom
+           $style = $';
+           $text = &$style($text, $texi_style);
+       } elsif ($style) { # good style
+           $text = "<$style>$text</$style>";
+       } else { # no style
+       }
+    } else { # unknown style
+       $text = undef;
+    }
+    return($text);
+}
+
+# remove Texinfo styles
+sub remove_style {
+    local($_) = @_;
+    1 while(s/\@\w+{([^\{\}]+)}/$1/g);
+    return($_);
+}
+
+sub remove_things
+{
+  local ($_) = @_;
+  s|\@(\w+)\{\}|$1|g;
+  return $_;
+}
+
+sub substitute_style {
+    local($_) = @_;
+    local($changed, $done, $style, $text);
+
+    &simple_substitutions;
+    $changed = 1;
+    while ($changed) {
+       $changed = 0;
+       $done = '';
+       while (/\@(\w+){([^\{\}]+)}/ || /\@(,){([^\{\}]+)}/) {
+           $text = &apply_style($1, $2);
+           if ($text) {
+               $_ = "$`$text$'";
+               $changed = 1;
+           } else {
+               $done .= "$`\@$1";
+               $_ = "{$2}$'";
+           }
+       }
+        $_ = $done . $_;
+    }
+    return($_);
+}
+
+sub t2h_anchor {
+    local($name, $href, $text, $newline, $extra_attribs) = @_;
+    local($result);
+
+    $result = "<A";
+    $result .= " NAME=\"$name\"" if $name;
+    if ($href)
+    {
+      $href =~ s|^$T2H_HREF_DIR_INSTEAD_FILE|./| 
+       if ($T2H_HREF_DIR_INSTEAD_FILE);
+      $result .= ($href =~ /\"/ ? " HREF='$href'"  : " HREF=\"$href\"");
+    }
+    $result .= " $extra_attribs" if $extra_attribs;
+    $result .= ">$text</A>";
+    $result .= "\n" if $newline;
+    return($result);
+}
+
+sub pretty_date {
+    local(@MoY, $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
+
+    @MoY = ('January', 'February', 'March', 'April', 'May', 'June',
+           'July', 'August', 'September', 'October', 'November', 'December');
+    ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
+    $year += ($year < 70) ? 2000 : 1900;
+    # obachman: Let's do it as the Americans do
+    return("$MoY[$mon], $mday  $year");
+}
+
+sub doc_href {
+    local($num) = @_;
+
+    return("${docu_name}_$num.$docu_ext");
+}
+
+sub sec_href
+{
+  return $node2href{$sec2node{$_[0]}};
+}
+
+sub next_doc {
+    $docu_doc = &doc_href(++$doc_num);
+}
+
+sub t2h_print_lines {
+    my ($fh, $lines) = @_;
+    local($_);
+    $lines = $T2H_THIS_SECTION unless $lines;
+    my $cnt = 0;
+    for (@$lines) 
+    {
+       $_ = l2h_FromHtml($_) if ($T2H_L2H);
+       if (/^$PROTECTTAG/o) {
+           $_ = $tag2pro{$_};
+       } else {
+           &unprotect_texi;
+       }
+       print $fh $_;
+       $cnt += split(/\W*\s+\W*/);
+    }
+    return $cnt;
+}
+
+sub protect_texi {
+    # protect @ { } ` '
+    s/\@\@/$;0/go;
+    s/\@\{/$;1/go;
+    s/\@\}/$;2/go;
+    s/\@\`/$;3/go;
+    s/\@\'/$;4/go;
+}
+
+sub protect_html {
+    local($what) = @_;
+    # protect & < >
+    $what =~ s/\&/\&\#38;/g;
+    $what =~ s/\</\&\#60;/g;
+    $what =~ s/\>/\&\#62;/g;
+    # restore anything in quotes
+    # this fixes my problem where I had:
+    # < IMG SRC="leftarrow.gif" ALT="<--" >  but what if I wanted &#60; in my ALT text ??
+    # maybe byte stuffing or some other technique should be used.
+    $what =~ s/\"([^\&]+)\&\#60;(.*)\"/"$1<$2"/g;
+    $what =~ s/\"([^\&]+)\&\#62;(.*)\"/"$1>$2"/g;
+    $what =~ s/\"([^\&]+)\&\#38;(.*)\"/"$1&$2"/g;
+    # but recognize some HTML things
+    $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g;            # </A>
+    $what =~ s/\&\#60;A ([^\&]+)\&\#62;/<A $1>/g;     # <A [^&]+>
+    $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;/<IMG $1>/g; # <IMG [^&]+>
+    return($what);
+}
+
+sub unprotect_texi {
+    s/$;0/\@/go;
+    s/$;1/\{/go;
+    s/$;2/\}/go;
+    s/$;3/\`/go;
+    s/$;4/\'/go;
+}
+
+sub Unprotect_texi 
+{
+  local $_ = shift;
+  &unprotect_texi;
+  return($_);
+}
+
+sub unprotect_html {
+    local($what) = @_;
+    $what =~ s/\&\#38;/\&/g;
+    $what =~ s/\&\#60;/\</g;
+    $what =~ s/\&\#62;/\>/g;
+    return($what);
+}
+
+sub t2h_print_label
+{
+    my $fh = shift;
+    my $href = shift || $T2H_HREF{This};
+    $href =~ s/.*#(.*)$/$1/;
+    print $fh qq{<A NAME="$href"></A>\n};
+}
+
+##############################################################################
+
+       # These next few lines are legal in both Perl and nroff.
+
+.00 ;                  # finish .ig
+'di                    \" finish diversion--previous line must be blank
+.nr nl 0-1             \" fake up transition to first page again
+.nr % 0                        \" start at page 1
+'; __END__ ############# From here on it's a standard manual page ############
+.so /usr/local/man/man1/texi2html.1
diff --git a/test.c b/test.c
index 90f8d9f..faa7c39 100644 (file)
--- a/test.c
+++ b/test.c
@@ -51,6 +51,8 @@ extern int errno;
 #include "posixstat.h"
 #include "filecntl.h"
 
+#include "bashintl.h"
+
 #include "shell.h"
 #include "pathexp.h"
 #include "test.h"
@@ -149,7 +151,7 @@ test_syntax_error (format, arg)
 static void
 beyond ()
 {
-  test_syntax_error ("argument expected", (char *)NULL);
+  test_syntax_error (_("argument expected"), (char *)NULL);
 }
 
 /* Syntax error for when an integer argument was expected, but
@@ -158,7 +160,7 @@ static void
 integer_expected_error (pch)
      char *pch;
 {
-  test_syntax_error ("%s: integer expression expected", pch);
+  test_syntax_error (_("%s: integer expression expected"), pch);
 }
 
 /* A wrapper for stat () which disallows pathnames that are empty strings
@@ -351,14 +353,14 @@ term ()
     }
 
   /* A paren-bracketed argument. */
-  if (argv[pos][0] == '(' && argv[pos][1] == '\0')
+  if (argv[pos][0] == '(' && argv[pos][1] == '\0') /* ) */
     {
       advance (1);
       value = expr ();
-      if (argv[pos] == 0)
-       test_syntax_error ("`)' expected", (char *)NULL);
-      else if (argv[pos][0] != ')' || argv[pos][1])
-       test_syntax_error ("`)' expected, found %s", argv[pos]);
+      if (argv[pos] == 0) /* ( */
+       test_syntax_error (_("`)' expected"), (char *)NULL);
+      else if (argv[pos][0] != ')' || argv[pos][1]) /* ( */
+       test_syntax_error (_("`)' expected, found %s"), argv[pos]);
       advance (0);
       return (value);
     }
@@ -373,7 +375,7 @@ term ()
       if (test_unop (argv[pos]))
        value = unary_operator ();
       else
-       test_syntax_error ("%s: unary operator expected", argv[pos]);
+       test_syntax_error (_("%s: unary operator expected"), argv[pos]);
     }
   else
     {
@@ -538,7 +540,7 @@ binary_operator ()
 
   if ((w[0] != '-' || w[3] != '\0') || test_binop (w) == 0)
     {
-      test_syntax_error ("%s: binary operator expected", w);
+      test_syntax_error (_("%s: binary operator expected"), w);
       /* NOTREACHED */
       return (FALSE);
     }
@@ -782,10 +784,10 @@ two_arguments ()
       if (test_unop (argv[pos]))
        return (unary_operator ());
       else
-       test_syntax_error ("%s: unary operator expected", argv[pos]);
+       test_syntax_error (_("%s: unary operator expected"), argv[pos]);
     }
   else
-    test_syntax_error ("%s: unary operator expected", argv[pos]);
+    test_syntax_error (_("%s: unary operator expected"), argv[pos]);
 
   return (0);
 }
@@ -825,7 +827,7 @@ three_arguments ()
       pos = argc;
     }
   else
-    test_syntax_error ("%s: binary operator expected", argv[pos+1]);
+    test_syntax_error (_("%s: binary operator expected"), argv[pos+1]);
 
   return (value);
 }
@@ -900,7 +902,7 @@ test_command (margc, margv)
       --margc;
 
       if (margv[margc] && (margv[margc][0] != ']' || margv[margc][1]))
-       test_syntax_error ("missing `]'", (char *)NULL);
+       test_syntax_error (_("missing `]'"), (char *)NULL);
 
       if (margc < 2)
        test_exit (SHELL_BOOLEAN (FALSE));
@@ -916,7 +918,7 @@ test_command (margc, margv)
   value = posixtest ();
 
   if (pos != argc)
-    test_syntax_error ("too many arguments", (char *)NULL);
+    test_syntax_error (_("too many arguments"), (char *)NULL);
 
   test_exit (SHELL_BOOLEAN (value));
 }
diff --git a/tests/-i b/tests/-i
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/RUN-ONE-TEST b/tests/RUN-ONE-TEST
new file mode 100755 (executable)
index 0000000..3efcf32
--- /dev/null
@@ -0,0 +1,9 @@
+BUILD_DIR=/usr/local/build/chet/bash/bash-current
+THIS_SH=$BUILD_DIR/bash
+PATH=$PATH:$BUILD_DIR
+
+export THIS_SH PATH
+
+rm -f /tmp/xx
+
+/bin/sh "$@"
diff --git a/tests/RUN-TEST-SCRIPT b/tests/RUN-TEST-SCRIPT
new file mode 100755 (executable)
index 0000000..75fe594
--- /dev/null
@@ -0,0 +1,7 @@
+BUILD_DIR=/usr/local/build/chet/bash/bash-current
+THIS_SH=$BUILD_DIR/bash
+PATH=$PATH:$BUILD_DIR
+
+export THIS_SH PATH
+
+${THIS_SH} "$@"
index f1f854b..5e897b6 100644 (file)
@@ -79,7 +79,7 @@
 36
 62
 63
-./arith.tests: line 143: 3425#56: illegal arithmetic base (error token is "3425#56")
+./arith.tests: line 143: 3425#56: invalid arithmetic base (error token is "3425#56")
 0
 ./arith.tests: line 149: 7 = 43 : attempted assignment to non-variable (error token is "= 43 ")
 ./arith.tests: line 150: 2#44: value too great for base (error token is "2#44")
@@ -87,8 +87,8 @@
 ./arith.tests: line 152: let: jv += $iv: syntax error: operand expected (error token is "$iv")
 ./arith.tests: line 153: jv += $iv : syntax error: operand expected (error token is "$iv ")
 ./arith.tests: line 154: let: rv = 7 + (43 * 6: missing `)' (error token is "6")
-./arith.tests: line 158: 0#4: bad number (error token is "0#4")
-./arith.tests: line 159: 2#110#11: bad number (error token is "2#110#11")
+./arith.tests: line 158: 0#4: invalid number (error token is "0#4")
+./arith.tests: line 159: 2#110#11: invalid number (error token is "2#110#11")
 abc
 def
 ghi
index 084c242..f0c456e 100644 (file)
@@ -160,3 +160,21 @@ argv[2] = <1>
 argv[3] = <4>
 argv[4] = <10>
 argv[1] = <0 1 4 10>
+include null element -- expect one
+one
+include unset element -- expect three five
+three five
+start at unset element -- expect five seven
+five seven
+too many elements -- expect three five seven
+three five seven
+positive offset - expect five seven
+five seven
+negative offset - expect five seven
+five seven
+positive offset 2 - expect seven
+seven
+negative offset 2 - expect seven
+seven
+out-of-range offset
+
index b38b91c..db02c89 100644 (file)
@@ -300,3 +300,35 @@ recho ${!x[@]}
 recho "${!x[@]}"
 recho ${!x[*]}
 recho "${!x[*]}"
+
+# sparse array tests for code fixed in bash-3.0
+unset av
+av[1]='one'
+av[2]=''
+
+av[3]=three
+av[5]=five
+av[7]=seven
+
+echo include null element -- expect one
+echo ${av[@]:1:2}      # what happens when we include a null element?
+echo include unset element -- expect three five
+echo ${av[@]:3:2}      # what happens when we include an unset element?
+echo start at unset element -- expect five seven
+echo ${av[@]:4:2}      # what happens when we start at an unset element?
+
+echo too many elements -- expect three five seven
+echo ${av[@]:3:5}      # how about too many elements?
+
+echo positive offset - expect five seven
+echo ${av[@]:5:2}
+echo negative offset - expect five seven
+echo ${av[@]: -2:2}
+
+echo positive offset 2 - expect seven
+echo ${av[@]: 6:2}
+echo negative offset 2 - expect seven
+echo ${av[@]: -1:2}
+
+echo out-of-range offset
+echo ${av[@]:12}
diff --git a/tests/cprint.right.save1 b/tests/cprint.right.save1
new file mode 100644 (file)
index 0000000..6b711b8
--- /dev/null
@@ -0,0 +1,72 @@
+tf is a function
+tf () 
+{ 
+    echo this is ${0##*/} >/dev/null;
+    echo a | cat - >/dev/null;
+    test -f ${0##*/} && echo ${0##*/} is a regular file;
+    test -d ${0##*/} || echo ${0##*/} is not a directory;
+    echo a;
+    echo b;
+    echo c;
+    echo background >/dev/null & ( exit 1 );
+    echo $?;
+    { 
+        echo a
+    };
+    i=0;
+    while (( " i < 3 " )); do
+        test -r /dev/fd/$i;
+        i=$(( i + 1 ));
+    done;
+    [[ -r /dev/fd/0 && -w /dev/fd/1 ]] || echo oops >/dev/null;
+    for name in $( echo 1 2 3 );
+    do
+        test -r /dev/fd/$name;
+    done;
+    if [[ -r /dev/fd/0 && -w /dev/fd/1 ]]; then
+        echo ok >/dev/null;
+    else
+        if (( " 7 > 40 " )); then
+            echo oops;
+        else
+            echo done;
+        fi;
+    fi >/dev/null;
+    case $PATH in 
+        *$PWD*)
+            echo \$PWD in \$PATH
+        ;;
+        *)
+            echo \$PWD not in \$PATH
+        ;;
+    esac >/dev/null;
+    while false; do
+        echo z;
+    done >/dev/null;
+    until true; do
+        echo z;
+    done >/dev/null;
+    echo \&\|'()' \{ echo abcde \; \};
+    eval fu\%nc'()' \{ echo abcde \; \};
+    type fu\%nc
+}
+tf2 is a function
+tf2 () 
+{ 
+    ( { 
+        time -p echo a | cat - >/dev/null
+    } ) 2>&1
+}
+cprint.tests is a regular file
+cprint.tests is not a directory
+a
+b
+c
+1
+a
+&|() { echo abcde ; }
+fu%nc is a function
+fu%nc () 
+{ 
+    echo abcde
+}
diff --git a/tests/cracauer-testsuite/DOC b/tests/cracauer-testsuite/DOC
new file mode 100644 (file)
index 0000000..30e8150
--- /dev/null
@@ -0,0 +1,13 @@
+The scripts './test01.sh' to './test05.sh' all echo to stdout what
+they should do and what behaviour is expected. Test them interactivly.
+
+Do a 'make' first to build a sample program that makes use of SIGQUIT
+and SIGINT. Links the shell to test to './testshell' or './testcsh'.
+
+Remember to 
+   stty quit '^\'
+after each test. It seens resetting the terminal sometimes doesn't
+reset the keys as well.
+
+The file OBSERVATIONS contains the misbehaviour I found.
+
diff --git a/tests/cracauer-testsuite/Makefile b/tests/cracauer-testsuite/Makefile
new file mode 100644 (file)
index 0000000..103bb93
--- /dev/null
@@ -0,0 +1,12 @@
+ALL = catcher
+
+all: $(ALL)
+
+DEPSTUFF = Makefile
+
+CFLAGS = -O -g -Wall -D_POSIX_SOURCE
+
+catcher: $(DEPSTUFF) catcher.c 
+
+clean:
+       -rm $(ALL) *.core core *.o
diff --git a/tests/cracauer-testsuite/OBSERVATIONS b/tests/cracauer-testsuite/OBSERVATIONS
new file mode 100644 (file)
index 0000000..b856d08
--- /dev/null
@@ -0,0 +1,84 @@
+CRA = my diffs.
+BDE = Bruce diffs.
+
+BDE version 19980212:
+
+Test 2: It should send SIGQUIT to cat, it doesn't.
+
+Test 9: can't break wait()
+
+%% older notes:
+
+test2:
+  trap '' 2
+  while : ; do cat ; echo -n $? ; done
+test6:
+  trap '' 3
+  while : ; do cat ; echo -n $? ; done
+
+The trapped signal should be ignored. If SIGINT is ignored (test 2),
+SIGQUIT exits `cat`, but not the shell (means the loop will continue
+and `cat` will be called again). 
+
+If SIGQUIT is ignored, SIGINT both exit the whole script.
+
+I'm not sure this asymmetric behaviour is intended, but currently CRA
+and BDE versions has is.
+
+I think SIGTERM should exit the script in all cases immedeatly. CRA
+version does this, BDE version ignores SIGTERM.
+
+bash1 falls over completely on these tests.
+
+bash2 works like CRA version.
+
+Other tests:
+------------
+
+BDE version fails on 5, the shell terminated while the forground child
+is running (like the unpatched FreeBSD sh did). 
+
+BDE version handles SIGQUIT seperately from SIGINT in test 1, and 3,
+but not in test 4 and 5.
+
+bash2 fails on 5, it gets a SIGQUIT that was sent to a
+SIGQUIT-catching process after that process exits. Reliably, it
+doesn't matter how much time was passed between SIGQUIT to process and
+exit or process.
+
+As Bruce noted, bash version 1 fails on test 2 like my version of sh
+does. bash1 doesn't have the bash2 problem on test 5 (getting signals
+that were caught by the child after the child exits).
+
+zsh fails on test 1 and 5 in a similar way bash2 failed on 5: After a
+child exits that received SIGINT, it terminates immedeatly.
+
+I wonder how bash 2 manages to fail on test 5, but to pass test 1...
+
+csh fails on test 1 in two ways:
+- when the SIGINT/SIGQUIT-catching child receives both SIGQUIT and
+  SIGINT, csh exits immedeatly, while the child is still running.
+- when only one or more SIGQUIT are delivered to the child, csh gets
+  it after the child exits and terminates with coredump.
+
+csh also ignores SIGQUIT where SIGINT is caught.
+
+test2.csh is different from test1.sh in that all signals should be
+caught. csh fails in that it sometimes gets SIGQUIT and exits with
+coredump (the shell, not the child). 
+
+
+Other stuff not directly relevant to these fixes:
+=================================================
+
+csh oddness:
+------------
+
+When the "catcher" program resets the terminal, there's a time-window
+where C-g is mapped to SIGQUIT, but "catcher" already exited. In other
+word, if you type C-g while in "catcher", then immedeatly C-d, csh
+will get SIGQUIT. I thought that remapping the terminal keys should
+have been done before the shell is re-entered. The same happens to
+tcsh. 
+
+With sh variants I didn't manage to deliver SIGQUIT by C-g.
diff --git a/tests/cracauer-testsuite/QUESTIONS b/tests/cracauer-testsuite/QUESTIONS
new file mode 100644 (file)
index 0000000..a1620be
--- /dev/null
@@ -0,0 +1 @@
+Should the background job be killed in test 3?
diff --git a/tests/cracauer-testsuite/catcher.c b/tests/cracauer-testsuite/catcher.c
new file mode 100644 (file)
index 0000000..f2de71c
--- /dev/null
@@ -0,0 +1,142 @@
+#undef VERBOSE
+
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <termios.h>
+
+#include <sys/ttydefaults.h>
+
+#define BUFSIZE 65536
+
+struct termios ttystate;
+struct termios oldttystate;
+int cleanupP = 0;
+
+#ifndef CTRL
+#define CTRL(x) (x&037)
+#endif
+
+int _global_fd;
+
+void handler2(int sig)
+{
+#define TMP "Async action on sigint (2)\n"
+  write(1,TMP,sizeof(TMP)-1);
+#undef TMP
+}
+
+void handler3(int sig)
+{
+#define TMP "Async action on sigquit (3)\n"
+  write(1,TMP,sizeof(TMP)-1);
+#undef TMP
+}
+
+void cleanup()
+{
+  if (cleanupP) {
+    printf("Resettung terminal\n");
+    if (tcsetattr(_global_fd, TCSANOW, &oldttystate) < 0) {
+      perror("ioctl reset /dev/tty");
+    }
+  }
+  close(_global_fd);
+}
+
+static void exit_handler(int sig)
+#ifdef __GNUC__
+    __attribute__ ((noreturn))
+#endif
+;
+static void exit_handler(int sig)
+{
+  cleanup();
+  if (sig)
+    printf("Exiting on signal %d\n",sig);
+  exit(0);
+}
+
+int main()
+{
+  char c[BUFSIZE];
+  pid_t pgrp;
+
+#ifdef VERBOSE
+  printf("I'm PID %d\n",getpid());
+#endif
+
+  if ( (  _global_fd = open("/dev/tty",O_RDONLY)) < 1) {
+    perror("open /dev/tty");
+    exit_handler(0);
+  }
+  
+  if ( (pgrp = tcgetpgrp(_global_fd)) < 0) {
+    perror("Can't get pgrp\n");
+    exit_handler(0);
+  }
+#ifdef VERBOSE
+  printf("tty pgrp is %ld\n",(long)pgrp);
+#endif
+
+  if ( tcsetpgrp(_global_fd, pgrp) < 0) {
+    perror("Can't set pgrp\n");
+    exit_handler(0);
+  }
+
+  if (tcgetattr(_global_fd, &oldttystate) < 0) {
+    perror("ioctl1 /dev/tty");
+    exit_handler(0);
+  }
+  ttystate = oldttystate;
+  ttystate.c_lflag &= ~ICANON;
+  ttystate.c_lflag &= ~ECHO;
+  ttystate.c_cc[VQUIT] = CTRL('g'); /* From sys/ttydefaults.h */
+  if (tcsetattr(_global_fd, TCSANOW, &ttystate) < 0) {
+    perror("ioctl2 /dev/tty");
+    exit_handler(0);
+  }
+  cleanupP = 1;
+
+  {
+    struct sigaction siga;
+    
+    sigemptyset(&siga.sa_mask);
+    siga.sa_flags = 0;
+
+    siga.sa_handler = handler2;
+    sigaction(SIGINT, &siga, (struct sigaction *)0);
+    siga.sa_handler = handler3;
+    sigaction(SIGQUIT, &siga, (struct sigaction *)0);
+
+    siga.sa_handler = exit_handler;
+    sigaction(SIGHUP, &siga, (struct sigaction *)0);
+    sigaction(SIGTERM, &siga, (struct sigaction *)0);
+  }
+
+  printf("Use C-c and C-g for async actions, end with C-d\n");
+  while (1) {
+    switch (read(_global_fd,c,1)) {
+    case -1:
+      if (errno == EINTR)
+       continue;
+      perror("stdin read");
+      exit_handler(0);
+    case 0:
+      printf("Exiting on stdin EOF (should happen only in cannon mode\n");
+      exit_handler(0);
+    default:
+      if (c[0] == CEOF) { /* From sys/ttydefaults.h */
+       printf("Exiting on stdin EOF (hopefully only in noncannon mode)\n");
+       exit_handler(0);
+      }
+      printf("You typed: '%c' (0x%X)\n",c[0],c[0]);
+    }
+  }
+  exit_handler(0);
+  return 0;
+}
diff --git a/tests/cracauer-testsuite/lib.csh b/tests/cracauer-testsuite/lib.csh
new file mode 100644 (file)
index 0000000..b8e8a77
--- /dev/null
@@ -0,0 +1,7 @@
+# I don't have a clue about csh programming...
+
+alias docatcher '\
+    echo "Trigger some async actions, shell should not exit" \
+    echo "Then exit catcher with C-d" \
+    ./catcher'
+
diff --git a/tests/cracauer-testsuite/lib.sh b/tests/cracauer-testsuite/lib.sh
new file mode 100644 (file)
index 0000000..8e87565
--- /dev/null
@@ -0,0 +1,14 @@
+docatcher()
+{
+    echo 'Trigger some async actions, shell should not exit'
+    echo 'Then exit catcher with C-d'
+    if [ ! -f ./catcher ] ; then
+       make catcher
+    fi
+    ./catcher
+}
+
+endless()
+{
+    while : ; do foo=1 ; done
+}
\ No newline at end of file
diff --git a/tests/cracauer-testsuite/test01.csh b/tests/cracauer-testsuite/test01.csh
new file mode 100644 (file)
index 0000000..bf50bc7
--- /dev/null
@@ -0,0 +1,12 @@
+#!./testcsh -f
+
+echo 'Test 1: See whether child can work on SIGINT and SIGQUIT without'
+echo '        terminating the shell around it. See if the shell is'
+echo '        interruptable afterwards'
+
+source lib.csh
+
+docatcher
+echo "No try to exit shell loop with C-c, C-\ or SIGTERM"
+while (1)
+end
diff --git a/tests/cracauer-testsuite/test01.sh b/tests/cracauer-testsuite/test01.sh
new file mode 100644 (file)
index 0000000..fabf8fb
--- /dev/null
@@ -0,0 +1,15 @@
+#!./testshell
+
+echo 'Test 1: See whether child can work on SIGINT and SIGQUIT without'
+echo '        terminating the shell around it. See if the shell is'
+echo '        interruptable afterwards'
+
+if [ $ZSH_VERSION ] ; then
+    source lib.sh
+else
+    . lib.sh
+fi
+
+docatcher
+echo 'Now try to exit shell loop with C-c, C-\ or SIGTERM'
+endless
diff --git a/tests/cracauer-testsuite/test02.csh b/tests/cracauer-testsuite/test02.csh
new file mode 100644 (file)
index 0000000..a60d70a
--- /dev/null
@@ -0,0 +1,13 @@
+#!./testcsh -f
+
+echo 'Test 2: You should not be able to end cat using anything besides SIGKILL'
+
+source lib.csh
+
+onintr -
+
+while (1)
+    echo cat
+    cat
+    echo Exited with $?
+end
diff --git a/tests/cracauer-testsuite/test02.sh b/tests/cracauer-testsuite/test02.sh
new file mode 100644 (file)
index 0000000..4c6f82d
--- /dev/null
@@ -0,0 +1,10 @@
+#!./testshell
+
+echo 'Test 2: You should not be able to exit `cat` with SIGINT.'
+echo '        SIGQUIT should abort `cat` (with coredump) while'
+echo '        the shell should continue and call `cat` again.'
+echo '        SIGTERM should exit the whole script.'
+
+set -x
+trap '' 2
+while : ; do cat ; echo -n $? ; done
diff --git a/tests/cracauer-testsuite/test03.sh b/tests/cracauer-testsuite/test03.sh
new file mode 100644 (file)
index 0000000..955d6dd
--- /dev/null
@@ -0,0 +1,18 @@
+#!./testshell 
+
+echo 'Test 3: A background job is being started, then the shell loops.'
+echo '        You should be able to break the shell loop with C-c.'
+echo '        This goes wrong if the shell blocks signals when'
+echo '        starting any child. It should do so only for foreground'
+echo '        jobs.'
+
+if [ $ZSH_VERSION ] ; then
+    source lib.sh
+else
+    . lib.sh
+fi
+
+echo Starting job
+gzip < /dev/zero | wc &
+echo 'Now try to break this loop'
+endless
diff --git a/tests/cracauer-testsuite/test04.sh b/tests/cracauer-testsuite/test04.sh
new file mode 100644 (file)
index 0000000..962aa7a
--- /dev/null
@@ -0,0 +1,18 @@
+#!./testshell 
+
+echo 'Test 4: Three shells all loop. You should be able to terminate this'
+echo '        script with just one SIGINT or SIGQUIT'
+
+if [ $ZSH_VERSION ] ; then
+    source lib.sh
+else
+    . lib.sh
+fi
+
+(
+    (
+       endless
+    )
+    endless
+)
+endless
diff --git a/tests/cracauer-testsuite/test05.sh b/tests/cracauer-testsuite/test05.sh
new file mode 100644 (file)
index 0000000..cbef1ae
--- /dev/null
@@ -0,0 +1,23 @@
+#!./testshell 
+
+echo 'Test 5: The SIGINT/SIGQUIT-catching program is being run'
+echo '     A: The shell should not exit on signals while this program runs.'
+echo '     B: After you exited it via C-d, you should be able to end this'
+echo '        script with its 3 subhells with just one signal'
+echo '        script with just one SIGINT or SIGQUIT'
+
+if [ $ZSH_VERSION ] ; then
+    source lib.sh
+else
+    . lib.sh
+fi
+
+(
+    (
+       docatcher
+       echo "Now try to exit with one SIGINT"
+       endless
+    )
+    endless
+)
+endless
diff --git a/tests/cracauer-testsuite/test06.sh b/tests/cracauer-testsuite/test06.sh
new file mode 100644 (file)
index 0000000..ce1b911
--- /dev/null
@@ -0,0 +1,10 @@
+#!./testshell
+
+echo 'Test 2: You should not be able to exit `cat` with SIGQUIT.'
+echo '        SIGINT should exit `cat` (without coredump) while'
+echo '        the shell should continue and call `cat` again.'
+echo '        SIGTERM should exit the whole script.'
+
+set -x
+trap '' 3
+while : ; do cat ; echo -n $? ; done
diff --git a/tests/cracauer-testsuite/test07.csh b/tests/cracauer-testsuite/test07.csh
new file mode 100644 (file)
index 0000000..9909e32
--- /dev/null
@@ -0,0 +1,19 @@
+#!./testcsh -f
+
+echo 'Test 7: See whether child can work on SIGINT and SIGQUIT without'
+echo '        terminating the shell around it. See if the shell'
+echo '        continues the script after the child exits'
+
+source lib.csh
+
+echo
+echo 'After the catching program, you should see 4 lines of text, sent'
+echo 'with one second delay each'
+docatcher
+echo 'You should see 3 more lines'
+sleep 1
+echo 'You should see 2 more lines'
+sleep 1
+echo 'You should see 1 more line'
+sleep 1
+echo 'Done'
diff --git a/tests/cracauer-testsuite/test07.sh b/tests/cracauer-testsuite/test07.sh
new file mode 100644 (file)
index 0000000..2f87ce4
--- /dev/null
@@ -0,0 +1,23 @@
+#!./testshell
+
+echo 'Test 7: See whether child can work on SIGINT and SIGQUIT without'
+echo '        terminating the shell around it. See if the shell'
+echo '        continues the script after the child exits'
+
+if [ $ZSH_VERSION ] ; then
+    source lib.sh
+else
+    . lib.sh
+fi
+
+echo
+echo 'After the catching program, you should see 4 lines of text, sent'
+echo 'with one second delay each'
+docatcher
+echo 'You should see 3 more lines'
+sleep 1
+echo 'You should see 2 more lines'
+sleep 1
+echo 'You should see 1 more line'
+sleep 1
+echo 'Done'
diff --git a/tests/cracauer-testsuite/test08.sh b/tests/cracauer-testsuite/test08.sh
new file mode 100644 (file)
index 0000000..87bde69
--- /dev/null
@@ -0,0 +1,19 @@
+#!./testshell
+
+echo 'Test 8: Start a child that is to be interrupted by SIGINT.'
+echo '        The shell should not continue with the script'
+
+if [ $ZSH_VERSION ] ; then
+    source lib.sh
+else
+    . lib.sh
+fi
+
+echo
+echo 'Should exit immedeatly after you break cat by SIGINT'
+echo cat
+cat
+sleep 1
+echo 'If you see this, you have a problem'
+sleep 1
+echo 'If you see this, you have even more problems'
diff --git a/tests/cracauer-testsuite/test09.sh b/tests/cracauer-testsuite/test09.sh
new file mode 100644 (file)
index 0000000..d12cb53
--- /dev/null
@@ -0,0 +1,14 @@
+#!./testshell
+
+trap 'echo I am a trap' 2
+
+echo 'Try to break wait using SIGINT before wc completes'
+echo 'After you break wait, it should print "I am a trap"'
+echo 'and then "Going on"'
+echo 'wc &'
+gzip < /kernel | wc &
+p=$!
+echo wait
+wait
+echo "Going on"
+kill $p
diff --git a/tests/cracauer-testsuite/test10.sh b/tests/cracauer-testsuite/test10.sh
new file mode 100644 (file)
index 0000000..a3bdc62
--- /dev/null
@@ -0,0 +1,4 @@
+#!./testshell
+
+echo 'You should be able to end the script with one SIGINT'
+(while :; do wc /kernel > /dev/null ; done)
diff --git a/tests/cracauer-testsuite/test11.sh b/tests/cracauer-testsuite/test11.sh
new file mode 100644 (file)
index 0000000..b56d68c
--- /dev/null
@@ -0,0 +1,13 @@
+#!./testshell
+
+echo 'Test 11 (variant of 9):'
+echo 'Try to break wait using SIGINT before wc completes' 
+echo 'After you break wait, it should NOT print "Going on"'
+
+echo 'wc &'
+gzip < /kernel | wc &
+p=$!
+echo wait
+wait
+echo "Going on"
+kill $p
diff --git a/tests/cracauer-testsuite/test12.sh b/tests/cracauer-testsuite/test12.sh
new file mode 100644 (file)
index 0000000..b724eae
--- /dev/null
@@ -0,0 +1,5 @@
+#!./testshell
+
+echo 'Test 12 (Variant of test10):'
+echo 'You should be able to end the script with one SIGINT'
+(while :; do ./catcher ; done)
diff --git a/tests/cracauer-testsuite/test13.sh b/tests/cracauer-testsuite/test13.sh
new file mode 100644 (file)
index 0000000..f4b8bb8
--- /dev/null
@@ -0,0 +1,9 @@
+#!./testshell
+
+echo 'Test 13 (variant of Test 1):'
+echo 'On SIGINT, cat should exit (and be restarted by the shell loop)'
+echo 'and the Text "I am a trap" should be printed'
+
+set -x
+trap 'echo I am a trap' 2
+while : ; do cat ; echo -n $? ; done
diff --git a/tests/history.tests.save b/tests/history.tests.save
new file mode 100644 (file)
index 0000000..4a218c3
--- /dev/null
@@ -0,0 +1,97 @@
+trap 'rm /tmp/newhistory' 0
+
+# bad options
+history -x
+# cannot use -r and -w at the same time
+history -r -w /dev/null
+
+# bad option
+fc -v
+
+# all of these should result in an empty history list
+history -c
+history -r /dev/null
+history -n /dev/null
+history -c
+
+HISTFILE=history.list
+HISTCONTROL=ignoreboth
+HISTIGNORE='&:history*:fc*'
+HISTSIZE=32
+
+shopt -s cmdhist
+set -o history
+
+history
+
+fc -l
+fc -nl
+
+fc -lr
+fc -nlr
+
+history -s "echo line for history"
+history
+
+history -p '!!'
+
+fc -nl
+
+HISTFILE=/tmp/newhistory
+history -a
+echo displaying \$HISTFILE after history -a
+cat $HISTFILE
+
+history
+history -w
+cat $HISTFILE
+
+history -s "echo line 2 for history"
+history
+history -p '!e'
+history -p '!!'
+
+# this should show up as one history entry
+for x in one two three
+do
+       :
+done
+history
+
+# just a basic test.  a full test suite for history expansion should be
+# created
+set -H
+!!
+!e
+
+unset HISTSIZE
+unset HISTFILE
+
+fc -l 4
+fc -l 4 8
+
+fc -l 502
+fc -l one=two three=four 502
+
+history 4
+
+shopt -so history
+shopt -s expand_aliases
+
+alias r="fc -s"
+
+echo aa ab ac
+
+r a=x
+r x=4 b=8
+
+# this had better fail with `no command found'
+r cc
+
+unalias -a
+alias
+
+set +o history
+
+shopt -q -o history
+echo $?
index 1117f5e..049d3cd 100644 (file)
@@ -1,4 +1,4 @@
-./jobs2.sub: line 9: fg: job %1 started without job control
+./jobs2.sub: line 9: fg: job 1 started without job control
 fg: 1
 Waiting for job 0
 job 0 returns 0
@@ -43,7 +43,7 @@ fg-bg 4
 sleep 5
 fg-bg 5
 ./jobs.tests: line 83: fg: %2: no such job
-./jobs.tests: line 84: bg: job %1 already in background
+./jobs.tests: line 84: bg: job 1 already in background
 fg-bg 6
 ./jobs.tests: line 91: fg: -s: invalid option
 fg: usage: fg [job_spec]
diff --git a/tests/misc/input-line-2.sh b/tests/misc/input-line-2.sh
new file mode 100644 (file)
index 0000000..b3e126e
--- /dev/null
@@ -0,0 +1,4 @@
+echo before calling input-line.sub
+${THIS_SH} < ./input-line.sub
+this line for input-line.sub
+echo finished with input-line.sub
diff --git a/tests/misc/minus-e b/tests/misc/minus-e
new file mode 100644 (file)
index 0000000..be67ec5
--- /dev/null
@@ -0,0 +1,6 @@
+set -e
+if set +e
+then
+       false
+fi
+echo hi
diff --git a/tests/misc/minus-e.right b/tests/misc/minus-e.right
new file mode 100644 (file)
index 0000000..45b983b
--- /dev/null
@@ -0,0 +1 @@
+hi
diff --git a/tests/misc/read-nchars-int.tests b/tests/misc/read-nchars-int.tests
new file mode 100644 (file)
index 0000000..40b1f98
--- /dev/null
@@ -0,0 +1,11 @@
+# interactive
+
+# from tty
+read -n 3 -p 'enter three chars: ' xyz
+echo
+echo $xyz
+
+# using readline
+read -p 'enter 3 chars: ' -e -n 3 abc
+# readline outputs a newline for us, so we don't need the extra echo
+echo $abc
diff --git a/tests/misc/regress/README b/tests/misc/regress/README
new file mode 100644 (file)
index 0000000..d78925f
--- /dev/null
@@ -0,0 +1,12 @@
+This is Geoff Collyer's `sh' regression test.  It will run each test
+on sh and ../../bash, and on ksh if you have it.  I have `real' ksh;
+the PD ksh is different and will fail some of the tests.
+
+Expect some small variations in the sh and bash output, since some
+of the tests work from the output of `date' or on the current dat
+returned by `getdate'.
+
+Don't expect `getdate' to exist unless you're running C News.  If you
+don't have it, run
+
+       make -f getdate.mk getdate
diff --git a/tests/misc/regress/geoff.post b/tests/misc/regress/geoff.post
new file mode 100644 (file)
index 0000000..3e9f2de
--- /dev/null
@@ -0,0 +1,152 @@
+Newsgroups: comp.os.coherent
+Subject: sh clones evaluated (was Re: C News)
+Organization: Software Tool & Die Netnews Research Center
+References: <138198@allan.sublink.org> <920725204@umunk.GUN.de>
+       <9207260813.30@rmkhome.UUCP> <1992Jul27.200244.2456@acme.gen.nz>
+       <Bs0x7K.2pp@world.std.com> <9207291604.00@rmkhome.UUCP>
+       <Bs84t1.3Fx@world.std.com> <9208011403.38@rmkhome.UUCP>
+
+I've reevaluated the allegedly-sh-compatible shells I have on hand (sh,
+bash, ash, zsh and a redistributable ksh).  bash seems to have improved
+since I last looked at it and seems to run inews and subordinates
+correctly, and passes the diagnostic tests I extracted from inews and
+anne.jones.  ash, zsh and redistributable ksh each fail three of the six
+tests.  This saddens me, as ash is an elegant and relatively small piece
+of work, whereas bash is bloated and complicated.
+
+I've enclosed the test scripts (shx?), driver script (shx) and results
+(log) below.  A couple caveats:  shx4 (a quoting test) uses the C News
+getdate command; there may be newer versions of the shells tested - this
+evaluation is decidedly informal.  Here's a quick summary: sh and bash
+passed all tests; ash can't parse "<&$fd" and doesn't understand quoting;
+redistributable ksh dumps core on a newline inside backquotes, doesn't
+understand quoting, and botches waiting on background processes; zsh
+doesn't understand sh quoting (in particular, it sees ! as a job control
+character, even inside quotes), and botches waiting for background
+processes.
+
+
+# To unbundle, sh this file
+echo log 1>&2
+sed 's/^X//' >log <<'!'
+X:; ./shx
+
+sh:
+X<&$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:
+X<&$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:
+X<&$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:
+X<&$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:
+X<&$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... 
+X:; 
+!
+echo shx 1>&2
+sed 's/^X//' >shx <<'!'
+X#! /bin/sh
+for cmd in sh bash ash ksh zsh
+do
+X      echo
+X      echo $cmd:
+X      for demo in shx?
+X      do
+X              $cmd $demo
+X      done
+done
+!
+echo shx1 1>&2
+sed 's/^X//' >shx1 <<'!'
+X# ash fails this one
+echo -n '<&$fd '
+fd=3
+echo ok <&$fd
+!
+echo shx2 1>&2
+sed 's/^X//' >shx2 <<'!'
+X# pd ksh fails this one
+echo -n "nlbq  "
+date=`
+date`
+echo "$date"
+!
+echo shx3 1>&2
+sed 's/^X//' >shx3 <<'!'
+X# zsh fails this one
+echo -n 'bang  '
+echo 'geoff    tty??   Aug  3 02:35' |
+X    sed -e 's/[        ].*//' -e '/!/s/^.*!//'
+!
+echo shx4 1>&2
+sed 's/^X//' >shx4 <<'!'
+X# ash, pd ksh fail this one
+echo -n "quote "
+expiry="now"
+timet="` getdate \"$expiry\" `"
+echo "$timet"
+!
+echo shx5 1>&2
+sed 's/^X//' >shx5 <<'!'
+X# ash, zsh fail this one
+echo -n "setbq "
+host=host
+date="`date`"
+echo defmsgid="`set $date; echo \<$6$2$3.\`  echo $4 | tr -d : \`.$$@$host\>`"
+!
+echo shx7 1>&2
+sed 's/^X//' >shx7 <<'!'
+X# pd ksh and zsh fail this one
+echo -n "bgwait        "
+X(
+X      sleep 2
+X      echo -n "sleep done... "
+X) &
+waitcmd="wait $!"
+eval $waitcmd
+echo "$waitcmd"
+!
+echo shx8 1>&2
+sed 's/^X//' >shx8 <<'!'
+X# in case gcx7 is really breaks this shell
+sleep 3
+echo
+!
+exit 0
diff --git a/tests/misc/regress/getdate.mk b/tests/misc/regress/getdate.mk
new file mode 100644 (file)
index 0000000..543242e
--- /dev/null
@@ -0,0 +1,9 @@
+all:   getdate
+
+getdate.c:     getdate.y
+       yacc getdate.y
+       mv y.tab.c getdate.c
+
+getdate:       getdate.c
+       $(CC) -o $@ getdate.c 
+       rm -f getdate.c getdate.o
diff --git a/tests/misc/regress/getdate.y b/tests/misc/regress/getdate.y
new file mode 100644 (file)
index 0000000..1df3773
--- /dev/null
@@ -0,0 +1,553 @@
+%token ID MONTH DAY MERIDIAN NUMBER UNIT MUNIT SUNIT ZONE DAYZONE AGO
+%{
+       /*      Steven M. Bellovin (unc!smb)                    */
+       /*      Dept. of Computer Science                       */
+       /*      University of North Carolina at Chapel Hill     */
+       /*      @(#)getdate.y   2.13    9/16/86 */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <ctype.h>
+#include <time.h>
+#define        timezone        tmzn    /* ugly hack for obscure name clash */
+#include <sys/timeb.h>
+
+#define daysec (24L*60L*60L)
+
+       static int timeflag, zoneflag, dateflag, dayflag, relflag;
+       static time_t relsec, relmonth;
+       static int hh, mm, ss, merid, daylight;
+       static int dayord, dayreq;
+       static int month, day, year;
+       static int ourzone;
+
+#define AM 1
+#define PM 2
+#define DAYLIGHT 1
+#define STANDARD 2
+#define MAYBE    3
+%}
+
+%%
+timedate:              /* empty */
+       | timedate item;
+
+item:  tspec =
+               {timeflag++;}
+       | zone =
+               {zoneflag++;}
+       | dtspec =
+               {dateflag++;}
+       | dyspec =
+               {dayflag++;}
+       | rspec =
+               {relflag++;}
+       | nspec;
+
+nspec: NUMBER =
+               {if (timeflag && dateflag && !relflag) year = $1;
+               else {timeflag++;hh = $1/100;mm = $1%100;ss = 0;merid = 24;}};
+
+tspec: NUMBER MERIDIAN =
+               {hh = $1; mm = 0; ss = 0; merid = $2;}
+       | NUMBER ':' NUMBER =
+               {hh = $1; mm = $3; merid = 24;}
+       | NUMBER ':' NUMBER MERIDIAN =
+               {hh = $1; mm = $3; merid = $4;}
+       | NUMBER ':' NUMBER NUMBER =
+               {hh = $1; mm = $3; merid = 24;
+               daylight = STANDARD; ourzone = $4%100 + 60*$4/100;}
+       | NUMBER ':' NUMBER ':' NUMBER =
+               {hh = $1; mm = $3; ss = $5; merid = 24;}
+       | NUMBER ':' NUMBER ':' NUMBER MERIDIAN =
+               {hh = $1; mm = $3; ss = $5; merid = $6;}
+       | NUMBER ':' NUMBER ':' NUMBER NUMBER =
+               {hh = $1; mm = $3; ss = $5; merid = 24;
+               daylight = STANDARD; ourzone = $6%100 + 60*$6/100;};
+
+zone:  ZONE =
+               {ourzone = $1; daylight = STANDARD;}
+       | DAYZONE =
+               {ourzone = $1; daylight = DAYLIGHT;};
+
+dyspec:        DAY =
+               {dayord = 1; dayreq = $1;}
+       | DAY ',' =
+               {dayord = 1; dayreq = $1;}
+       | NUMBER DAY =
+               {dayord = $1; dayreq = $2;};
+
+dtspec:        NUMBER '/' NUMBER =
+               {month = $1; day = $3;}
+       | NUMBER '/' NUMBER '/' NUMBER =
+               {month = $1; day = $3; year = $5;}
+       | MONTH NUMBER =
+               {month = $1; day = $2;}
+       | MONTH NUMBER ',' NUMBER =
+               {month = $1; day = $2; year = $4;}
+       | NUMBER MONTH =
+               {month = $2; day = $1;}
+       | NUMBER MONTH NUMBER =
+               {month = $2; day = $1; year = $3;};
+
+
+rspec: NUMBER UNIT =
+               {relsec +=  60L * $1 * $2;}
+       | NUMBER MUNIT =
+               {relmonth += $1 * $2;}
+       | NUMBER SUNIT =
+               {relsec += $1;}
+       | UNIT =
+               {relsec +=  60L * $1;}
+       | MUNIT =
+               {relmonth += $1;}
+       | SUNIT =
+               {relsec++;}
+       | rspec AGO =
+               {relsec = -relsec; relmonth = -relmonth;};
+%%
+
+static int mdays[12] =
+       {31, 0, 31,  30, 31, 30,  31, 31, 30,  31, 30, 31};
+#define epoch 1970
+
+extern struct tm *localtime();
+
+static time_t
+dateconv(mm, dd, yy, h, m, s, mer, zone, dayflag)
+int mm, dd, yy, h, m, s, mer, zone, dayflag;
+{
+       time_t tod, jdate;
+       register int i;
+       time_t timeconv();
+
+       if (yy < 0) yy = -yy;
+       if (yy < 100) yy += 1900;
+       mdays[1] = 28 + (yy%4 == 0 && (yy%100 != 0 || yy%400 == 0));
+       if (yy < epoch || yy > 1999 || mm < 1 || mm > 12 ||
+               dd < 1 || dd > mdays[--mm]) return (-1);
+       jdate = dd-1;
+        for (i=0; i<mm; i++) jdate += mdays[i];
+       for (i = epoch; i < yy; i++) jdate += 365 + (i%4 == 0);
+       jdate *= daysec;
+       jdate += zone * 60L;
+       if ((tod = timeconv(h, m, s, mer)) < 0) return (-1);
+       jdate += tod;
+       if (dayflag==DAYLIGHT || (dayflag==MAYBE&&localtime(&jdate)->tm_isdst))
+               jdate += -1*60*60;
+       return (jdate);
+}
+
+static time_t
+dayconv(ord, day, now)
+int ord, day; time_t now;
+{
+       register struct tm *loctime;
+       time_t tod;
+       time_t daylcorr();
+
+       tod = now;
+       loctime = localtime(&tod);
+       tod += daysec * ((day - loctime->tm_wday + 7) % 7);
+       tod += 7*daysec*(ord<=0?ord:ord-1);
+       return daylcorr(tod, now);
+}
+
+static time_t
+timeconv(hh, mm, ss, mer)
+register int hh, mm, ss, mer;
+{
+       if (mm < 0 || mm > 59 || ss < 0 || ss > 59) return (-1);
+       switch (mer) {
+               case AM: if (hh < 1 || hh > 12) return(-1);
+                        return (60L * ((hh%12)*60L + mm)+ss);
+               case PM: if (hh < 1 || hh > 12) return(-1);
+                        return (60L * ((hh%12 +12)*60L + mm)+ss);
+               case 24: if (hh < 0 || hh > 23) return (-1);
+                        return (60L * (hh*60L + mm)+ss);
+               default: return (-1);
+       }
+}
+
+static time_t
+monthadd(sdate, relmonth)
+time_t sdate, relmonth;
+{
+       struct tm *ltime;
+       time_t dateconv();
+       time_t daylcorr();
+       int mm, yy;
+
+       if (relmonth == 0) return 0;
+       ltime = localtime(&sdate);
+       mm = 12*ltime->tm_year + ltime->tm_mon + relmonth;
+       yy = mm/12;
+       mm = mm%12 + 1;
+       return daylcorr(dateconv(mm, ltime->tm_mday, yy, ltime->tm_hour,
+               ltime->tm_min, ltime->tm_sec, 24, ourzone, MAYBE), sdate);
+}
+
+static time_t
+daylcorr(future, now)
+time_t future, now;
+{
+       int fdayl, nowdayl;
+
+       nowdayl = (localtime(&now)->tm_hour+1) % 24;
+       fdayl = (localtime(&future)->tm_hour+1) % 24;
+       return (future-now) + 60L*60L*(nowdayl-fdayl);
+}
+
+static char *lptr;
+
+yylex()
+{
+       extern int yylval;
+       int sign;
+       register char c;
+       register char *p;
+       char idbuf[20];
+       int pcnt;
+
+       for (;;) {
+               while (isspace(*lptr)) lptr++;
+
+               if (isdigit(c = *lptr) || c == '-' || c == '+') {
+                       if (c== '-' || c == '+') {
+                               if (c=='-') sign = -1;
+                               else sign = 1;
+                               if (!isdigit(*++lptr)) {
+                                       /* yylval = sign; return (NUMBER); */
+                                       return yylex(); /* skip the '-' sign */
+                               }
+                       } else sign = 1;
+                       yylval = 0;
+                       while (isdigit(c = *lptr++)) yylval = 10*yylval + c - '0';
+                       yylval *= sign;
+                       lptr--;
+                       return (NUMBER);
+
+               } else if (isalpha(c)) {
+                       p = idbuf;
+                       while (isalpha(c = *lptr++) || c=='.')
+                               if (p < &idbuf[sizeof(idbuf)-1])
+                                       *p++ = c;
+                       *p = '\0';
+                       lptr--;
+                       return (lookup(idbuf));
+               }
+
+               else if (c == '(') {
+                       pcnt = 0;
+                       do {
+                               c = *lptr++;
+                               if (c == '\0') return(c);
+                               else if (c == '(') pcnt++;
+                               else if (c == ')') pcnt--;
+                       } while (pcnt > 0);
+               }
+
+               else return (*lptr++);
+       }
+}
+
+struct table {
+       char *name;
+       int type, value;
+};
+
+static struct table mdtab[] = {
+       {"January", MONTH, 1},
+       {"February", MONTH, 2},
+       {"March", MONTH, 3},
+       {"April", MONTH, 4},
+       {"May", MONTH, 5},
+       {"June", MONTH, 6},
+       {"July", MONTH, 7},
+       {"August", MONTH, 8},
+       {"September", MONTH, 9},
+       {"Sept", MONTH, 9},
+       {"October", MONTH, 10},
+       {"November", MONTH, 11},
+       {"December", MONTH, 12},
+
+       {"Sunday", DAY, 0},
+       {"Monday", DAY, 1},
+       {"Tuesday", DAY, 2},
+       {"Tues", DAY, 2},
+       {"Wednesday", DAY, 3},
+       {"Wednes", DAY, 3},
+       {"Thursday", DAY, 4},
+       {"Thur", DAY, 4},
+       {"Thurs", DAY, 4},
+       {"Friday", DAY, 5},
+       {"Saturday", DAY, 6},
+       {0, 0, 0}};
+
+#define HRS *60
+#define HALFHR 30
+static struct table mztab[] = {
+       {"a.m.", MERIDIAN, AM},
+       {"am", MERIDIAN, AM},
+       {"p.m.", MERIDIAN, PM},
+       {"pm", MERIDIAN, PM},
+       {"nst", ZONE, 3 HRS + HALFHR},          /* Newfoundland */
+       {"n.s.t.", ZONE, 3 HRS + HALFHR},
+       {"ast", ZONE, 4 HRS},           /* Atlantic */
+       {"a.s.t.", ZONE, 4 HRS},
+       {"adt", DAYZONE, 4 HRS},
+       {"a.d.t.", DAYZONE, 4 HRS},
+       {"est", ZONE, 5 HRS},           /* Eastern */
+       {"e.s.t.", ZONE, 5 HRS},
+       {"edt", DAYZONE, 5 HRS},
+       {"e.d.t.", DAYZONE, 5 HRS},
+       {"cst", ZONE, 6 HRS},           /* Central */
+       {"c.s.t.", ZONE, 6 HRS},
+       {"cdt", DAYZONE, 6 HRS},
+       {"c.d.t.", DAYZONE, 6 HRS},
+       {"mst", ZONE, 7 HRS},           /* Mountain */
+       {"m.s.t.", ZONE, 7 HRS},
+       {"mdt", DAYZONE, 7 HRS},
+       {"m.d.t.", DAYZONE, 7 HRS},
+       {"pst", ZONE, 8 HRS},           /* Pacific */
+       {"p.s.t.", ZONE, 8 HRS},
+       {"pdt", DAYZONE, 8 HRS},
+       {"p.d.t.", DAYZONE, 8 HRS},
+       {"yst", ZONE, 9 HRS},           /* Yukon */
+       {"y.s.t.", ZONE, 9 HRS},
+       {"ydt", DAYZONE, 9 HRS},
+       {"y.d.t.", DAYZONE, 9 HRS},
+       {"hst", ZONE, 10 HRS},          /* Hawaii */
+       {"h.s.t.", ZONE, 10 HRS},
+       {"hdt", DAYZONE, 10 HRS},
+       {"h.d.t.", DAYZONE, 10 HRS},
+
+       {"gmt", ZONE, 0 HRS},
+       {"g.m.t.", ZONE, 0 HRS},
+       {"ut", ZONE, 0 HRS},
+       {"u.t.", ZONE, 0 HRS},
+       {"bst", DAYZONE, 0 HRS},                /* British Summer Time */
+       {"b.s.t.", DAYZONE, 0 HRS},
+       {"eet", ZONE, 0 HRS},           /* European Eastern Time */
+       {"e.e.t.", ZONE, 0 HRS},
+       {"eest", DAYZONE, 0 HRS},       /* European Eastern Summer Time */
+       {"e.e.s.t.", DAYZONE, 0 HRS},
+       {"met", ZONE, -1 HRS},          /* Middle European Time */
+       {"m.e.t.", ZONE, -1 HRS},
+       {"mest", DAYZONE, -1 HRS},      /* Middle European Summer Time */
+       {"m.e.s.t.", DAYZONE, -1 HRS},
+       {"wet", ZONE, -2 HRS },         /* Western European Time */
+       {"w.e.t.", ZONE, -2 HRS },
+       {"west", DAYZONE, -2 HRS},      /* Western European Summer Time */
+       {"w.e.s.t.", DAYZONE, -2 HRS},
+
+       {"jst", ZONE, -9 HRS},          /* Japan Standard Time */
+       {"j.s.t.", ZONE, -9 HRS},       /* Japan Standard Time */
+                                       /* No daylight savings time */
+
+       {"aest", ZONE, -10 HRS},        /* Australian Eastern Time */
+       {"a.e.s.t.", ZONE, -10 HRS},
+       {"aesst", DAYZONE, -10 HRS},    /* Australian Eastern Summer Time */
+       {"a.e.s.s.t.", DAYZONE, -10 HRS},
+       {"acst", ZONE, -(9 HRS + HALFHR)},      /* Australian Central Time */
+       {"a.c.s.t.", ZONE, -(9 HRS + HALFHR)},
+       {"acsst", DAYZONE, -(9 HRS + HALFHR)},  /* Australian Central Summer */
+       {"a.c.s.s.t.", DAYZONE, -(9 HRS + HALFHR)},
+       {"awst", ZONE, -8 HRS},         /* Australian Western Time */
+       {"a.w.s.t.", ZONE, -8 HRS},     /* (no daylight time there, I'm told */
+       {0, 0, 0}};
+
+static struct table unittb[] = {
+       {"year", MUNIT, 12},
+       {"month", MUNIT, 1},
+       {"fortnight", UNIT, 14*24*60},
+       {"week", UNIT, 7*24*60},
+       {"day", UNIT, 1*24*60},
+       {"hour", UNIT, 60},
+       {"minute", UNIT, 1},
+       {"min", UNIT, 1},
+       {"second", SUNIT, 1},
+       {"sec", SUNIT, 1},
+       {0, 0, 0}};
+
+static struct table othertb[] = {
+       {"tomorrow", UNIT, 1*24*60},
+       {"yesterday", UNIT, -1*24*60},
+       {"today", UNIT, 0},
+       {"now", UNIT, 0},
+       {"last", NUMBER, -1},
+       {"this", UNIT, 0},
+       {"next", NUMBER, 2},
+       {"first", NUMBER, 1},
+       /* {"second", NUMBER, 2}, */
+       {"third", NUMBER, 3},
+       {"fourth", NUMBER, 4},
+       {"fifth", NUMBER, 5},
+       {"sixth", NUMBER, 6},
+       {"seventh", NUMBER, 7},
+       {"eigth", NUMBER, 8},
+       {"ninth", NUMBER, 9},
+       {"tenth", NUMBER, 10},
+       {"eleventh", NUMBER, 11},
+       {"twelfth", NUMBER, 12},
+       {"ago", AGO, 1},
+       {0, 0, 0}};
+
+static struct table milzone[] = {
+       {"a", ZONE, 1 HRS},
+       {"b", ZONE, 2 HRS},
+       {"c", ZONE, 3 HRS},
+       {"d", ZONE, 4 HRS},
+       {"e", ZONE, 5 HRS},
+       {"f", ZONE, 6 HRS},
+       {"g", ZONE, 7 HRS},
+       {"h", ZONE, 8 HRS},
+       {"i", ZONE, 9 HRS},
+       {"k", ZONE, 10 HRS},
+       {"l", ZONE, 11 HRS},
+       {"m", ZONE, 12 HRS},
+       {"n", ZONE, -1 HRS},
+       {"o", ZONE, -2 HRS},
+       {"p", ZONE, -3 HRS},
+       {"q", ZONE, -4 HRS},
+       {"r", ZONE, -5 HRS},
+       {"s", ZONE, -6 HRS},
+       {"t", ZONE, -7 HRS},
+       {"u", ZONE, -8 HRS},
+       {"v", ZONE, -9 HRS},
+       {"w", ZONE, -10 HRS},
+       {"x", ZONE, -11 HRS},
+       {"y", ZONE, -12 HRS},
+       {"z", ZONE, 0 HRS},
+       {0, 0, 0}};
+
+static
+lookup(id)
+char *id;
+{
+#define gotit (yylval=i->value,  i->type)
+#define getid for(j=idvar, k=id; *j++ = *k++; )
+
+       char idvar[20];
+       register char *j, *k;
+       register struct table *i;
+       int abbrev;
+
+       getid;
+       if (strlen(idvar) == 3) abbrev = 1;
+       else if (strlen(idvar) == 4 && idvar[3] == '.') {
+               abbrev = 1;
+               idvar[3] = '\0';
+       }
+       else abbrev = 0;
+
+       if (islower(*idvar)) *idvar = toupper(*idvar);
+
+       for (i = mdtab; i->name; i++) {
+               k = idvar;
+               for (j = i->name; *j++ == *k++;) {
+                       if (abbrev && j==i->name+3) return gotit;
+                       if (j[-1] == 0) return gotit;
+               }
+       }
+
+       getid;
+       for (i = mztab; i->name; i++)
+               if (strcmp(i->name, idvar) == 0) return gotit;
+
+       for (j = idvar; *j; j++)
+               if (isupper(*j)) *j = tolower(*j);
+       for (i=mztab; i->name; i++)
+               if (strcmp(i->name, idvar) == 0) return gotit;
+
+       getid;
+       for (i=unittb; i->name; i++)
+               if (strcmp(i->name, idvar) == 0) return gotit;
+
+       if (idvar[strlen(idvar)-1] == 's')
+               idvar[strlen(idvar)-1] = '\0';
+       for (i=unittb; i->name; i++)
+               if (strcmp(i->name, idvar) == 0) return gotit;
+
+       getid;
+       for (i = othertb; i->name; i++)
+               if (strcmp(i->name, idvar) == 0) return gotit;
+
+       getid;
+       if (strlen(idvar) == 1 && isalpha(*idvar)) {
+               if (isupper(*idvar)) *idvar = tolower(*idvar);
+               for (i = milzone; i->name; i++)
+                       if (strcmp(i->name, idvar) == 0) return gotit;
+       }
+
+       return(ID);
+}
+
+time_t
+getdate(p, now)
+char *p;
+struct timeb *now;
+{
+#define mcheck(f)      if (f>1) err++
+       time_t monthadd();
+       int err;
+       struct tm *lt;
+       struct timeb ftz;
+
+       time_t sdate, tod;
+
+       lptr = p;
+       if (now == ((struct timeb *) NULL)) {
+               now = &ftz;
+               ftime(&ftz);
+       }
+       lt = localtime(&now->time);
+       year = lt->tm_year;
+       month = lt->tm_mon+1;
+       day = lt->tm_mday;
+       relsec = 0; relmonth = 0;
+       timeflag=zoneflag=dateflag=dayflag=relflag=0;
+       ourzone = now->timezone;
+       daylight = MAYBE;
+       hh = mm = ss = 0;
+       merid = 24;
+
+       if (err = yyparse()) return (-1);
+
+       mcheck(timeflag);
+       mcheck(zoneflag);
+       mcheck(dateflag);
+       mcheck(dayflag);
+
+       if (err) return (-1);
+       if (dateflag || timeflag || dayflag) {
+               sdate = dateconv(month,day,year,hh,mm,ss,merid,ourzone,daylight);
+               if (sdate < 0) return -1;
+       }
+       else {
+               sdate = now->time;
+               if (relflag == 0)
+                       sdate -= (lt->tm_sec + lt->tm_min*60 +
+                               lt->tm_hour*(60L*60L));
+       }
+
+       sdate += relsec;
+       sdate += monthadd(sdate, relmonth);
+
+       if (dayflag && !dateflag) {
+               tod = dayconv(dayord, dayreq, sdate);
+               sdate += tod;
+       }
+
+       return sdate;
+}
+
+yyerror(s) char *s;
+{}
+
+main(c, v)
+int    c;
+char   **v;
+{
+       printf("%d\n", getdate(v[1], (struct timeb *)0));
+}
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 b/tests/misc/regress/shx
new file mode 100644 (file)
index 0000000..feb2bc8
--- /dev/null
@@ -0,0 +1,15 @@
+#! /bin/sh
+
+if ksh -c 'echo ""' >/dev/null 2>&1; then
+       ksh=ksh
+fi
+
+for cmd in sh ../../bash $ksh
+do
+       echo
+       echo $cmd:
+       for demo in shx[0-9]
+       do
+               $cmd $demo
+       done
+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/tests/misc/regress/shx1 b/tests/misc/regress/shx1
new file mode 100644 (file)
index 0000000..73c5e8a
--- /dev/null
@@ -0,0 +1,4 @@
+# ash fails this one
+echo -n '<&$fd '
+fd=3
+echo ok <&$fd
diff --git a/tests/misc/regress/shx2 b/tests/misc/regress/shx2
new file mode 100644 (file)
index 0000000..03cff5b
--- /dev/null
@@ -0,0 +1,5 @@
+# pd ksh fails this one
+echo -n "nlbq  "
+date=`
+date`
+echo "$date"
diff --git a/tests/misc/regress/shx3 b/tests/misc/regress/shx3
new file mode 100644 (file)
index 0000000..1fbbb37
--- /dev/null
@@ -0,0 +1,4 @@
+# zsh fails this one
+echo -n 'bang  '
+echo 'geoff    tty??   Aug  3 02:35' |
+    sed -e 's/[         ].*//' -e '/!/s/^.*!//'
diff --git a/tests/misc/regress/shx4 b/tests/misc/regress/shx4
new file mode 100644 (file)
index 0000000..9ae7781
--- /dev/null
@@ -0,0 +1,5 @@
+# ash, pd ksh fail this one
+echo -n "quote "
+expiry="now"
+timet="` getdate \"$expiry\" `"
+echo "$timet"
diff --git a/tests/misc/regress/shx5 b/tests/misc/regress/shx5
new file mode 100644 (file)
index 0000000..bd7ad0e
--- /dev/null
@@ -0,0 +1,5 @@
+# ash, zsh fail this one
+echo -n "setbq "
+host=host
+date="`date`"
+echo defmsgid="`set $date; echo \<$6$2$3.\`  echo $4 | tr -d : \`.$$@$host\>`"
diff --git a/tests/misc/regress/shx7 b/tests/misc/regress/shx7
new file mode 100644 (file)
index 0000000..12ba1ec
--- /dev/null
@@ -0,0 +1,9 @@
+# pd ksh and zsh fail this one
+echo -n "bgwait        "
+(
+       sleep 2
+       echo -n "sleep done... "
+) &
+waitcmd="wait $!"
+eval $waitcmd
+echo "$waitcmd"
diff --git a/tests/misc/regress/shx8 b/tests/misc/regress/shx8
new file mode 100644 (file)
index 0000000..b466ec1
--- /dev/null
@@ -0,0 +1,3 @@
+# in case gcx7 is really breaks this shell
+sleep 3
+echo
diff --git a/tests/misc/run-input-test-2 b/tests/misc/run-input-test-2
new file mode 100644 (file)
index 0000000..ffbac4c
--- /dev/null
@@ -0,0 +1,2 @@
+cat ./input-line-2.sh | ${THIS_SH} > /tmp/xx
+diff /tmp/xx input.right && rm -f /tmp/xx
diff --git a/tests/misc/run-minus-e b/tests/misc/run-minus-e
new file mode 100644 (file)
index 0000000..2a91a3d
--- /dev/null
@@ -0,0 +1,2 @@
+${THIS_SH} ./minus-e > /tmp/xx
+diff /tmp/xx minus-e.right && rm -f /tmp/xx
diff --git a/tests/misc/test.patmatch b/tests/misc/test.patmatch
new file mode 100644 (file)
index 0000000..88b5631
--- /dev/null
@@ -0,0 +1,15 @@
+# these will work only if test.c has been compiled with -DPATTERN_MATCHING
+# to get =~ and !~
+
+[ a =\~ a ] && echo OK || echo BAD
+[ a !~ b ] && echo OK || echo BAD
+
+[ a =\~ \* ] && echo OK || echo BAD
+[ a =\~ \? ] && echo OK || echo BAD
+[ abc !~ \? ] && echo OK || echo BAD
+
+[ '' =\~ \* ] && echo OK || echo BAD
+[ '' !~ \?\* ] && echo OK || echo BAD
+
+[ a =\~ \[abc] ] && echo OK || echo BAD
+[ x !~ \[abc] ] && echo OK || echo BAD
index d6011f4..4d1647d 100644 (file)
Binary files a/tests/printf.right and b/tests/printf.right differ
index 5f6d8aa..d9bc30c 100644 (file)
@@ -222,3 +222,19 @@ printf $format 0
 
 # this doesn't work with printf(3) on all systems
 #printf "%'s\n" foo
+
+# test cases from an austin-group list discussion
+# prints ^G as an extension
+printf '%b\n' '\7'
+
+# prints ^G
+printf '%b\n' '\0007'
+
+# prints NUL then 7
+printf '\0007\n'
+
+# prints no more than two hex digits
+printf '\x07e\n'
+
+# additional backslash escapes
+printf '\"\?\n'
diff --git a/tests/run-gprof b/tests/run-gprof
new file mode 100644 (file)
index 0000000..87d5086
--- /dev/null
@@ -0,0 +1,53 @@
+#! /bin/sh
+
+PATH=.:$PATH   # just to get recho/zecho/printenv if not run via `make tests'
+export PATH
+
+# unset BASH_ENV only if it is set
+[ "${BASH_ENV+set}" = "set" ] && unset BASH_ENV
+# ditto for SHELLOPTS
+#[ "${SHELLOPTS+set}" = "set" ] && unset SHELLOPTS
+
+: ${THIS_SH:=../bash}
+export THIS_SH
+
+rm -f gmon.sum
+
+${THIS_SH} ./version
+
+rm -f /tmp/xx
+
+# prime the pump; gprof complains if gmon.sum is empty
+[ -f bash.gmon ] && gprof -s ${THIS_SH} bash.gmon >/dev/null
+
+echo Any output from any test, unless otherwise noted, indicates a possible anomaly
+
+for x in run-*
+do
+       case $x in
+       $0|run-all|run-minimal|run-gprof)       ;;
+       *.orig|*~) ;;
+       *)      echo $x ; sh $x
+               if [ -f /tmp/bash.gmon ]; then
+                       if [ -f bash.gmon ]; then
+                               gprof -s ${THIS_SH} gmon.sum bash.gmon /tmp/bash.gmon >/dev/null
+                       else
+                               gprof -s ${THIS_SH} gmon.sum /tmp/bash.gmon >/dev/null                          
+                       fi
+               else
+                       gprof -s ${THIS_SH} gmon.sum bash.gmon >/dev/null
+               fi
+               rm -f /tmp/bash.gmon bash.gmon
+               ;;
+       esac
+done
+
+gprof -s ${THIS_SH} gmon.sum ./-specialname.gmon ./ohio-state.gmon > /dev/null
+rm -f ./-specialname.gmon ./ohio-state.gmon
+
+if [ -f specialname.gmon ]; then
+       gprof -s ${THIS_SH} gmon.sum ./specialname.gmon > /dev/null
+       rm -f specialname.gmon
+fi
+
+exit 0
diff --git a/tests/time.tests b/tests/time.tests
new file mode 100644 (file)
index 0000000..06881e9
--- /dev/null
@@ -0,0 +1,22 @@
+printf "time /dev/null:\n"
+time ${THIS_SH} /dev/null
+
+printf "\nPOSIX: time -p /dev/null:\n"
+time -p ${THIS_SH} /dev/null
+
+printf "\nBSD time /dev/null:\n"
+TIMEFORMAT=$'\t%1R real\t%1U user\t%1S sys'
+time ${THIS_SH} /dev/null
+
+printf "\nSYSV time /dev/null:\n"
+TIMEFORMAT=$'\nreal\t%1R\nuser\t%1U\nsys\t%1S'
+time ${THIS_SH} /dev/null
+
+printf "\nksh time /dev/null:\n"
+TIMEFORMAT=$'\nreal\t%2lR\nuser\t%2lU\nsys\t%2lS'
+time ${THIS_SH} /dev/null
+
+printf "\ntimes:\n"
+times
+
+exit 0
diff --git a/trap.c b/trap.c
index a6ea2ae..3641caf 100644 (file)
--- a/trap.c
+++ b/trap.c
@@ -31,6 +31,8 @@
 #include <stdio.h>
 #include <errno.h>
 
+#include "bashintl.h"
+
 #include "trap.h"
 
 #include "shell.h"
@@ -103,6 +105,9 @@ int pending_traps[NSIG];
    trap command (e.g., when `return' is executed in the trap command). */
 int running_trap;
 
+/* Set to last_command_exit_value before running a trap. */
+int trap_saved_exit_value;
+
 /* The (trapped) signal received while executing in the `wait' builtin */
 int wait_signal_received;
 
@@ -185,9 +190,10 @@ signal_name (sig)
   char *ret;
 
   /* on cygwin32, signal_names[sig] could be null */
-  ret = (sig >= BASH_NSIG || sig < 0) ? "bad signal number" : signal_names[sig];
-  if (ret == NULL)
-    ret = "unrecognized signal number";
+  ret = (sig >= BASH_NSIG || sig < 0 || signal_names[sig] == NULL)
+       ? _("invalid signal number")
+       : signal_names[sig];
+
   return ret;
 }
 
@@ -300,11 +306,11 @@ run_pending_traps ()
                 Unless we catch this, the subshell will dump core when
                 trap_list[SIGTERM] == DEFAULT_SIG, because DEFAULT_SIG is
                 usually 0x0. */
-             internal_warning ("run_pending_traps: bad value in trap_list[%d]: %p",
+             internal_warning (_("run_pending_traps: bad value in trap_list[%d]: %p"),
                                sig, trap_list[sig]);
              if (trap_list[sig] == (char *)DEFAULT_SIG)
                {
-                 internal_warning ("run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself", sig, signal_name (sig));
+                 internal_warning (_("run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"), sig, signal_name (sig));
                  kill (getpid (), sig);
                }
            }
@@ -340,7 +346,7 @@ trap_handler (sig)
   if ((sig >= NSIG) ||
       (trap_list[sig] == (char *)DEFAULT_SIG) ||
       (trap_list[sig] == (char *)IGNORE_SIG))
-    programming_error ("trap_handler: bad signal %d", sig);
+    programming_error (_("trap_handler: bad signal %d"), sig);
   else
     {
       oerrno = errno;
@@ -639,9 +645,9 @@ int
 run_exit_trap ()
 {
   char *trap_command;
-  int code, function_code, old_exit_value;
+  int code, function_code, retval;
 
-  old_exit_value = last_command_exit_value;
+  trap_saved_exit_value = last_command_exit_value;
   function_code = 0;
 
   /* Run the trap only if signal 0 is trapped and not ignored, and we are not
@@ -654,6 +660,9 @@ run_exit_trap ()
       sigmodes[EXIT_TRAP] &= ~SIG_TRAPPED;
       sigmodes[EXIT_TRAP] |= SIG_INPROGRESS;
 
+      retval = trap_saved_exit_value;
+      running_trap = 1;
+
       code = setjmp (top_level);
 
       /* If we're in a function, make sure return longjmps come here, too. */
@@ -666,16 +675,19 @@ run_exit_trap ()
          parse_and_execute (trap_command, "exit trap", SEVAL_NONINT|SEVAL_NOHIST);
        }
       else if (code == ERREXIT)
-       return (last_command_exit_value);
+       retval = last_command_exit_value;
       else if (code == EXITPROG)
-       return (last_command_exit_value);
+       retval = last_command_exit_value;
       else if (function_code != 0)
-        return (return_catch_value);
+        retval = return_catch_value;
       else
-       return (old_exit_value);
+       retval = trap_saved_exit_value;
+
+      running_trap = 0;
+      return retval;
     }
 
-  return (old_exit_value);
+  return (trap_saved_exit_value);
 }
 
 void
@@ -693,9 +705,11 @@ _run_trap_internal (sig, tag)
      char *tag;
 {
   char *trap_command, *old_trap;
-  int old_exit_value, *token_state, trap_exit_value;
+  int trap_exit_value, *token_state;
+  int save_return_catch_flag, function_code;
+  procenv_t save_return_catch;
 
-  trap_exit_value = 0;
+  trap_exit_value = function_code = 0;
   /* Run the trap only if SIG is trapped and not ignored, and we are not
      currently executing in the trap handler. */
   if ((sigmodes[sig] & SIG_TRAPPED) && ((sigmodes[sig] & SIG_IGNORED) == 0) &&
@@ -708,15 +722,26 @@ _run_trap_internal (sig, tag)
       trap_command =  savestring (old_trap);
 
       running_trap = sig + 1;
-      old_exit_value = last_command_exit_value;
+      trap_saved_exit_value = last_command_exit_value;
 
       token_state = save_token_state ();
-      parse_and_execute (trap_command, tag, SEVAL_NONINT|SEVAL_NOHIST);
+
+      /* If we're in a function, make sure return longjmps come here, too. */
+      save_return_catch_flag = return_catch_flag;
+      if (return_catch_flag)
+       {
+         COPY_PROCENV (return_catch, save_return_catch);
+         function_code = setjmp (return_catch);
+       }
+
+      if (function_code == 0)
+       parse_and_execute (trap_command, tag, SEVAL_NONINT|SEVAL_NOHIST);
+
       restore_token_state (token_state);
       free (token_state);
 
       trap_exit_value = last_command_exit_value;
-      last_command_exit_value = old_exit_value;
+      last_command_exit_value = trap_saved_exit_value;
       running_trap = 0;
 
       sigmodes[sig] &= ~SIG_INPROGRESS;
@@ -732,7 +757,17 @@ _run_trap_internal (sig, tag)
            free (old_trap);
          sigmodes[sig] &= ~SIG_CHANGED;
        }
+
+      if (save_return_catch_flag)
+       {
+         return_catch_flag = save_return_catch_flag;
+         return_catch_value = trap_exit_value;
+         COPY_PROCENV (save_return_catch, return_catch);
+         if (function_code)
+           longjmp (return_catch, 1);
+       }
     }
+
   return trap_exit_value;
 }
 
index 97a0084..e29d971 100644 (file)
@@ -36,6 +36,7 @@
 #include "chartypes.h"
 #include <pwd.h>
 #include "bashansi.h"
+#include "bashintl.h"
 
 #include "shell.h"
 #include "flags.h"
@@ -306,7 +307,7 @@ initialize_shell_variables (env, privmode)
              array_needs_making = 1;
            }
          else
-           report_error ("error importing function definition for `%s'", name);
+           report_error (_("error importing function definition for `%s'"), name);
 
          /* ( */
          if (name[char_index - 1] == ')' && name[char_index - 2] == '\0')
@@ -666,7 +667,7 @@ adjust_shell_level (change)
     shell_level = 0;
   else if (shell_level > 1000)
     {
-      internal_warning ("shell level (%d) too high, resetting to 1", shell_level);
+      internal_warning (_("shell level (%d) too high, resetting to 1"), shell_level);
       shell_level = 1;
     }
 
@@ -1606,7 +1607,7 @@ make_local_variable (name)
 
   if (vc == 0)
     {
-      internal_error ("make_local_variable: no function context at current scope found");
+      internal_error (_("make_local_variable: no function context at current scope"));
       return ((SHELL_VAR *)NULL);
     }
   else if (vc->table == 0)
@@ -2033,6 +2034,7 @@ bind_function_def (name, value)
 {
   FUNCTION_DEF *entry;
   BUCKET_CONTENTS *elt;
+  COMMAND *cmd;
 
   entry = find_function_def (name);
   if (entry)
@@ -2042,7 +2044,10 @@ bind_function_def (name, value)
     }
   else
     {
+      cmd = value->command;
+      value->command = 0;
       entry = copy_function_def (value);
+      value->command = cmd;
 
       elt = hash_insert (savestring (name), shell_function_defs, HASH_NOSRCH);
       elt->data = (PTR_T *)entry;
@@ -2061,7 +2066,7 @@ assign_in_env (string)
   char *name, *temp, *value;
   SHELL_VAR *var;
 
-  offset = assignment (string);
+  offset = assignment (string, 0);
   name = savestring (string);
   value = (char *)NULL;
 
@@ -2120,6 +2125,7 @@ assign_in_env (string)
       fflush (stderr);
     }
 
+  free (name);
   return 1;
 }
 
@@ -2700,7 +2706,7 @@ all_local_variables ()
 
   if (vc == 0)
     {
-      internal_error ("all_local_variables: no function context at current scope found");
+      internal_error (_("all_local_variables: no function context at current scope"));
       return (SHELL_VAR **)NULL;
     }
   if (vc->table == 0 || HASH_ENTRIES (vc->table) == 0 || vc_haslocals (vc) == 0)
@@ -2914,7 +2920,7 @@ valid_exportstr (v)
   s = v->exportstr;
   if (legal_variable_starter ((unsigned char)*s) == 0)
     {
-      internal_error ("invalid character %d in exportstr for %s", *s, v->name);
+      internal_error (_("invalid character %d in exportstr for %s"), *s, v->name);
       return (0);
     }
   for (s = v->exportstr + 1; s && *s; s++)
@@ -2923,13 +2929,13 @@ valid_exportstr (v)
        break;
       if (legal_variable_char ((unsigned char)*s) == 0)
        {
-         internal_error ("invalid character %d in exportstr for %s", *s, v->name);
+         internal_error (_("invalid character %d in exportstr for %s"), *s, v->name);
          return (0);
        }
     }
   if (*s != '=')
     {
-      internal_error ("no `=' in exportstr for %s", v->name);
+      internal_error (_("no `=' in exportstr for %s"), v->name);
       return (0);
     }
   return (1);
@@ -3055,7 +3061,7 @@ add_or_supercede_exported_var (assign, do_alloc)
   register int i;
   int equal_offset;
 
-  equal_offset = assignment (assign);
+  equal_offset = assignment (assign, 0);
   if (equal_offset == 0)
     return (export_env);
 
@@ -3354,7 +3360,7 @@ pop_var_context ()
   vcxt = shell_variables;
   if (vc_isfuncenv (vcxt) == 0)
     {
-      internal_error ("pop_var_context: head of shell_variables not a function context");
+      internal_error (_("pop_var_context: head of shell_variables not a function context"));
       return;
     }
 
@@ -3367,7 +3373,7 @@ pop_var_context ()
       dispose_var_context (vcxt);
     }
   else
-    internal_error ("pop_var_context: no global_variables context");
+    internal_error (_("pop_var_context: no global_variables context"));
 }
 
 /* Delete the HASH_TABLEs for all variable contexts beginning at VCXT, and
@@ -3433,7 +3439,7 @@ pop_scope (is_special)
   vcxt = shell_variables;
   if (vc_istempscope (vcxt) == 0)
     {
-      internal_error ("pop_scope: head of shell_variables not a temporary environment scope");
+      internal_error (_("pop_scope: head of shell_variables not a temporary environment scope"));
       return;
     }
 
index 42647c9..bad76b0 100644 (file)
--- a/version.c
+++ b/version.c
@@ -28,6 +28,8 @@
 #include "patchlevel.h"
 #include "conftypes.h"
 
+#include "bashintl.h"
+
 extern char *shell_name;
 
 /* Defines from version.h */
@@ -56,9 +58,17 @@ shell_version_string ()
   if (tt[0] == '\0')
     {
       if (release_status)
+#if defined (HAVE_SNPRINTF)
+       snprintf (tt, sizeof (tt), "%s.%d(%d)-%s", dist_version, patch_level, build_version, release_status);
+#else
        sprintf (tt, "%s.%d(%d)-%s", dist_version, patch_level, build_version, release_status);
+#endif
       else
+#if defined (HAVE_SNPRINTF)
+       snprintf (tt, sizeof (tt), "%s.%d(%d)", dist_version, patch_level, build_version);
+#else
        sprintf (tt, "%s.%d(%d)", dist_version, patch_level, build_version);
+#endif
     }
   return tt;
 }
@@ -69,5 +79,5 @@ show_shell_version (extended)
 {
   printf ("GNU bash, version %s (%s)\n", shell_version_string (), MACHTYPE);
   if (extended)
-    printf ("Copyright (C) 2002 Free Software Foundation, Inc.\n");
+    printf (_("Copyright (C) 2004 Free Software Foundation, Inc.\n"));
 }
index c2011f9..93d1928 100644 (file)
--- a/xmalloc.c
+++ b/xmalloc.c
@@ -38,6 +38,8 @@
 
 #include "error.h"
 
+#include "bashintl.h"
+
 #if !defined (PTR_T)
 #  if defined (__STDC__)
 #    define PTR_T void *
@@ -88,9 +90,9 @@ xmalloc (bytes)
     {
 #if defined (HAVE_SBRK)
       allocated = findbrk ();
-      fatal_error ("xmalloc: cannot allocate %lu bytes (%lu bytes allocated)", (unsigned long)bytes, (unsigned long)allocated);
+      fatal_error (_("xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"), (unsigned long)bytes, (unsigned long)allocated);
 #else
-      fatal_error ("xmalloc: cannot allocate %lu bytes", (unsigned long)bytes);
+      fatal_error (_("xmalloc: cannot allocate %lu bytes"), (unsigned long)bytes);
 #endif /* !HAVE_SBRK */
     }
 
@@ -110,9 +112,9 @@ xrealloc (pointer, bytes)
     {
 #if defined (HAVE_SBRK)
       allocated = findbrk ();
-      fatal_error ("xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)", (unsigned long)bytes, (unsigned long)allocated);
+      fatal_error (_("xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"), (unsigned long)bytes, (unsigned long)allocated);
 #else
-      fatal_error ("xrealloc: cannot allocate %lu bytes", (unsigned long)bytes);
+      fatal_error (_("xrealloc: cannot allocate %lu bytes"), (unsigned long)bytes);
 #endif /* !HAVE_SBRK */
     }
 
@@ -146,9 +148,9 @@ sh_xmalloc (bytes, file, line)
     {
 #if defined (HAVE_SBRK)
       allocated = findbrk ();
-      fatal_error ("xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)", file, line, (unsigned long)bytes, (unsigned long)allocated);
+      fatal_error (_("xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"), file, line, (unsigned long)bytes, (unsigned long)allocated);
 #else
-      fatal_error ("xmalloc: %s:%d: cannot allocate %lu bytes", file, line, (unsigned long)bytes);
+      fatal_error (_("xmalloc: %s:%d: cannot allocate %lu bytes"), file, line, (unsigned long)bytes);
 #endif /* !HAVE_SBRK */
     }
 
@@ -170,9 +172,9 @@ sh_xrealloc (pointer, bytes, file, line)
     {
 #if defined (HAVE_SBRK)
       allocated = findbrk ();
-      fatal_error ("xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)", file, line, (unsigned long)bytes, (unsigned long)allocated);
+      fatal_error (_("xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)"), file, line, (unsigned long)bytes, (unsigned long)allocated);
 #else
-      fatal_error ("xrealloc: %s:%d: cannot allocate %lu bytes", file, line, (unsigned long)bytes);
+      fatal_error (_("xrealloc: %s:%d: cannot allocate %lu bytes"), file, line, (unsigned long)bytes);
 #endif /* !HAVE_SBRK */
     }